Merge 5.10.58 into android12-5.10-lts

Changes in 5.10.58
	Revert "ACPICA: Fix memory leak caused by _CID repair function"
	ALSA: seq: Fix racy deletion of subscriber
	bus: ti-sysc: Fix gpt12 system timer issue with reserved status
	net: xfrm: fix memory leak in xfrm_user_rcv_msg
	arm64: dts: ls1028a: fix node name for the sysclk
	ARM: imx: add missing iounmap()
	ARM: imx: add missing clk_disable_unprepare()
	ARM: dts: imx6qdl-sr-som: Increase the PHY reset duration to 10ms
	arm64: dts: ls1028: sl28: fix networking for variant 2
	ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz
	ARM: imx: fix missing 3rd argument in macro imx_mmdc_perf_init
	ARM: dts: imx: Swap M53Menlo pinctrl_power_button/pinctrl_power_out pins
	arm64: dts: armada-3720-turris-mox: fixed indices for the SDHC controllers
	arm64: dts: armada-3720-turris-mox: remove mrvl,i2c-fast-mode
	ALSA: usb-audio: fix incorrect clock source setting
	clk: stm32f4: fix post divisor setup for I2S/SAI PLLs
	ARM: dts: am437x-l4: fix typo in can@0 node
	omap5-board-common: remove not physically existing vdds_1v8_main fixed-regulator
	dmaengine: uniphier-xdmac: Use readl_poll_timeout_atomic() in atomic state
	clk: tegra: Implement disable_unused() of tegra_clk_sdmmc_mux_ops
	dmaengine: stm32-dma: Fix PM usage counter imbalance in stm32 dma ops
	dmaengine: stm32-dmamux: Fix PM usage counter unbalance in stm32 dmamux ops
	spi: imx: mx51-ecspi: Reinstate low-speed CONFIGREG delay
	spi: imx: mx51-ecspi: Fix low-speed CONFIGREG delay calculation
	scsi: sr: Return correct event when media event code is 3
	media: videobuf2-core: dequeue if start_streaming fails
	ARM: dts: stm32: Disable LAN8710 EDPD on DHCOM
	ARM: dts: stm32: Fix touchscreen IRQ line assignment on DHCOM
	dmaengine: imx-dma: configure the generic DMA type to make it work
	net, gro: Set inner transport header offset in tcp/udp GRO hook
	net: dsa: sja1105: overwrite dynamic FDB entries with static ones in .port_fdb_add
	net: dsa: sja1105: invalidate dynamic FDB entries learned concurrently with statically added ones
	net: dsa: sja1105: be stateless with FDB entries on SJA1105P/Q/R/S/SJA1110 too
	net: dsa: sja1105: match FDB entries regardless of inner/outer VLAN tag
	net: phy: micrel: Fix detection of ksz87xx switch
	net: natsemi: Fix missing pci_disable_device() in probe and remove
	gpio: tqmx86: really make IRQ optional
	RDMA/mlx5: Delay emptying a cache entry when a new MR is added to it recently
	sctp: move the active_key update after sh_keys is added
	nfp: update ethtool reporting of pauseframe control
	net: ipv6: fix returned variable type in ip6_skb_dst_mtu
	net: dsa: qca: ar9331: reorder MDIO write sequence
	net: sched: fix lockdep_set_class() typo error for sch->seqlock
	MIPS: check return value of pgtable_pmd_page_ctor
	mips: Fix non-POSIX regexp
	bnx2x: fix an error code in bnx2x_nic_load()
	net: pegasus: fix uninit-value in get_interrupt_interval
	net: fec: fix use-after-free in fec_drv_remove
	net: vxge: fix use-after-free in vxge_device_unregister
	blk-iolatency: error out if blk_get_queue() failed in iolatency_set_limit()
	Bluetooth: defer cleanup of resources in hci_unregister_dev()
	USB: usbtmc: Fix RCU stall warning
	USB: serial: option: add Telit FD980 composition 0x1056
	USB: serial: ch341: fix character loss at high transfer rates
	USB: serial: ftdi_sio: add device ID for Auto-M3 OP-COM v2
	firmware_loader: use -ETIMEDOUT instead of -EAGAIN in fw_load_sysfs_fallback
	firmware_loader: fix use-after-free in firmware_fallback_sysfs
	drm/amdgpu/display: fix DMUB firmware version info
	ALSA: pcm - fix mmap capability check for the snd-dummy driver
	ALSA: hda/realtek: add mic quirk for Acer SF314-42
	ALSA: hda/realtek: Fix headset mic for Acer SWIFT SF314-56 (ALC256)
	ALSA: usb-audio: Fix superfluous autosuspend recovery
	ALSA: usb-audio: Add registration quirk for JBL Quantum 600
	usb: dwc3: gadget: Avoid runtime resume if disabling pullup
	usb: gadget: remove leaked entry from udc driver list
	usb: cdns3: Fixed incorrect gadget state
	usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
	usb: gadget: f_hid: fixed NULL pointer dereference
	usb: gadget: f_hid: idle uses the highest byte for duration
	usb: host: ohci-at91: suspend/resume ports after/before OHCI accesses
	usb: typec: tcpm: Keep other events when receiving FRS and Sourcing_vbus events
	usb: otg-fsm: Fix hrtimer list corruption
	clk: fix leak on devm_clk_bulk_get_all() unwind
	scripts/tracing: fix the bug that can't parse raw_trace_func
	tracing / histogram: Give calculation hist_fields a size
	tracing: Reject string operand in the histogram expression
	tracing: Fix NULL pointer dereference in start_creating
	tracepoint: static call: Compare data on transition from 2->1 callees
	tracepoint: Fix static call function vs data state mismatch
	arm64: stacktrace: avoid tracing arch_stack_walk()
	optee: Clear stale cache entries during initialization
	tee: add tee_shm_alloc_kernel_buf()
	optee: Fix memory leak when failing to register shm pages
	optee: Refuse to load the driver under the kdump kernel
	optee: fix tee out of memory failure seen during kexec reboot
	tpm_ftpm_tee: Free and unregister TEE shared memory during kexec
	staging: rtl8723bs: Fix a resource leak in sd_int_dpc
	staging: rtl8712: get rid of flush_scheduled_work
	staging: rtl8712: error handling refactoring
	drivers core: Fix oops when driver probe fails
	media: rtl28xxu: fix zero-length control request
	pipe: increase minimum default pipe size to 2 pages
	ext4: fix potential htree corruption when growing large_dir directories
	serial: tegra: Only print FIFO error message when an error occurs
	serial: 8250_mtk: fix uart corruption issue when rx power off
	serial: 8250: Mask out floating 16/32-bit bus bits
	MIPS: Malta: Do not byte-swap accesses to the CBUS UART
	serial: 8250_pci: Enumerate Elkhart Lake UARTs via dedicated driver
	serial: 8250_pci: Avoid irq sharing for MSI(-X) interrupts.
	fpga: dfl: fme: Fix cpu hotplug issue in performance reporting
	timers: Move clearing of base::timer_running under base:: Lock
	xfrm: Fix RCU vs hash_resize_mutex lock inversion
	net/xfrm/compat: Copy xfrm_spdattr_type_t atributes
	pcmcia: i82092: fix a null pointer dereference bug
	selinux: correct the return value when loads initial sids
	bus: ti-sysc: AM3: RNG is GP only
	Revert "gpio: mpc8xxx: change the gpio interrupt flags."
	ARM: omap2+: hwmod: fix potential NULL pointer access
	md/raid10: properly indicate failure when ending a failed write request
	KVM: x86: accept userspace interrupt only if no event is injected
	KVM: Do not leak memory for duplicate debugfs directories
	KVM: x86/mmu: Fix per-cpu counter corruption on 32-bit builds
	arm64: vdso: Avoid ISB after reading from cntvct_el0
	soc: ixp4xx: fix printing resources
	interconnect: Fix undersized devress_alloc allocation
	spi: meson-spicc: fix memory leak in meson_spicc_remove
	interconnect: Zero initial BW after sync-state
	interconnect: Always call pre_aggregate before aggregate
	interconnect: qcom: icc-rpmh: Ensure floor BW is enforced for all nodes
	drm/i915: Correct SFC_DONE register offset
	soc: ixp4xx/qmgr: fix invalid __iomem access
	perf/x86/amd: Don't touch the AMD64_EVENTSEL_HOSTONLY bit inside the guest
	sched/rt: Fix double enqueue caused by rt_effective_prio
	drm/i915: avoid uninitialised var in eb_parse()
	libata: fix ata_pio_sector for CONFIG_HIGHMEM
	reiserfs: add check for root_inode in reiserfs_fill_super
	reiserfs: check directory items on read from disk
	virt_wifi: fix error on connect
	net: qede: Fix end of loop tests for list_for_each_entry
	alpha: Send stop IPI to send to online CPUs
	net/qla3xxx: fix schedule while atomic in ql_wait_for_drvr_lock and ql_adapter_reset
	smb3: rc uninitialized in one fallocate path
	drm/amdgpu/display: only enable aux backlight control for OLED panels
	arm64: fix compat syscall return truncation
	Linux 5.10.58

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I2533667974c9dff419a14d63e0e8febfb3de80f1
This commit is contained in:
Greg Kroah-Hartman
2021-08-12 14:37:30 +02:00
133 changed files with 1108 additions and 465 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 10 PATCHLEVEL = 10
SUBLEVEL = 57 SUBLEVEL = 58
EXTRAVERSION = EXTRAVERSION =
NAME = Dare mighty things NAME = Dare mighty things

View File

@@ -582,7 +582,7 @@ void
smp_send_stop(void) smp_send_stop(void)
{ {
cpumask_t to_whom; 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); cpumask_clear_cpu(smp_processor_id(), &to_whom);
#ifdef DEBUG_IPI_MSG #ifdef DEBUG_IPI_MSG
if (hard_smp_processor_id() != boot_cpu_id) if (hard_smp_processor_id() != boot_cpu_id)

View File

@@ -1576,7 +1576,7 @@
compatible = "ti,am4372-d_can", "ti,am3352-d_can"; compatible = "ti,am4372-d_can", "ti,am3352-d_can";
reg = <0x0 0x2000>; reg = <0x0 0x2000>;
clocks = <&dcan1_fck>; clocks = <&dcan1_fck>;
clock-name = "fck"; clock-names = "fck";
syscon-raminit = <&scm_conf 0x644 1>; syscon-raminit = <&scm_conf 0x644 1>;
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled"; status = "disabled";

View File

@@ -388,13 +388,13 @@
pinctrl_power_button: powerbutgrp { pinctrl_power_button: powerbutgrp {
fsl,pins = < fsl,pins = <
MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4 MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4
>; >;
}; };
pinctrl_power_out: poweroutgrp { pinctrl_power_out: poweroutgrp {
fsl,pins = < fsl,pins = <
MX53_PAD_SD2_DATA0__GPIO1_15 0x1e4 MX53_PAD_SD2_DATA2__GPIO1_13 0x1e4
>; >;
}; };

View File

@@ -54,7 +54,13 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_microsom_enet_ar8035>; pinctrl-0 = <&pinctrl_microsom_enet_ar8035>;
phy-mode = "rgmii-id"; 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>; phy-reset-gpios = <&gpio4 15 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";

View File

@@ -43,6 +43,7 @@
assigned-clock-rates = <0>, <198000000>; assigned-clock-rates = <0>, <198000000>;
cap-power-off-card; cap-power-off-card;
keep-power-in-suspend; keep-power-in-suspend;
max-frequency = <25000000>;
mmc-pwrseq = <&wifi_pwrseq>; mmc-pwrseq = <&wifi_pwrseq>;
no-1-8-v; no-1-8-v;
non-removable; non-removable;

View File

@@ -30,14 +30,6 @@
regulator-max-microvolt = <5000000>; 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 { vmmcsd_fixed: fixedregulator-mmcsd {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "vmmcsd_fixed"; regulator-name = "vmmcsd_fixed";
@@ -487,6 +479,7 @@
regulator-boot-on; regulator-boot-on;
}; };
vdds_1v8_main:
smps7_reg: smps7 { smps7_reg: smps7 {
/* VDDS_1v8_OMAP over VDDS_1v8_MAIN */ /* VDDS_1v8_OMAP over VDDS_1v8_MAIN */
regulator-name = "smps7"; regulator-name = "smps7";

View File

@@ -37,7 +37,7 @@
poll-interval = <20>; 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. * so mark this as polled GPIO key.
*/ */
button-0 { button-0 {
@@ -46,6 +46,16 @@
gpios = <&gpiof 3 GPIO_ACTIVE_LOW>; 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, * The EXTi IRQ line 0 is shared with PMIC,
* so mark this as polled GPIO key. * so mark this as polled GPIO key.
@@ -60,13 +70,6 @@
gpio-keys { gpio-keys {
compatible = "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 { button-3 {
label = "TA4-GPIO-D"; label = "TA4-GPIO-D";
linux,code = <KEY_D>; linux,code = <KEY_D>;
@@ -82,6 +85,7 @@
label = "green:led5"; label = "green:led5";
gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>; gpios = <&gpioc 6 GPIO_ACTIVE_HIGH>;
default-state = "off"; default-state = "off";
status = "disabled";
}; };
led-1 { led-1 {
@@ -185,8 +189,8 @@
touchscreen@38 { touchscreen@38 {
compatible = "edt,edt-ft5406"; compatible = "edt,edt-ft5406";
reg = <0x38>; reg = <0x38>;
interrupt-parent = <&gpiog>; interrupt-parent = <&gpioc>;
interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */ interrupts = <6 IRQ_TYPE_EDGE_FALLING>; /* GPIO E */
}; };
}; };

View File

@@ -133,6 +133,7 @@
reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>; reset-gpios = <&gpioh 3 GPIO_ACTIVE_LOW>;
reset-assert-us = <500>; reset-assert-us = <500>;
reset-deassert-us = <500>; reset-deassert-us = <500>;
smsc,disable-energy-detect;
interrupt-parent = <&gpioi>; interrupt-parent = <&gpioi>;
interrupts = <11 IRQ_TYPE_LEVEL_LOW>; interrupts = <11 IRQ_TYPE_LEVEL_LOW>;
}; };

View File

@@ -103,6 +103,7 @@ struct mmdc_pmu {
struct perf_event *mmdc_events[MMDC_NUM_COUNTERS]; struct perf_event *mmdc_events[MMDC_NUM_COUNTERS];
struct hlist_node node; struct hlist_node node;
struct fsl_mmdc_devtype_data *devtype_data; 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); cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node);
perf_pmu_unregister(&pmu_mmdc->pmu); perf_pmu_unregister(&pmu_mmdc->pmu);
iounmap(pmu_mmdc->mmdc_base);
clk_disable_unprepare(pmu_mmdc->mmdc_ipg_clk);
kfree(pmu_mmdc); kfree(pmu_mmdc);
return 0; 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; struct mmdc_pmu *pmu_mmdc;
char *name; 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); mmdc_num = mmdc_pmu_init(pmu_mmdc, mmdc_base, &pdev->dev);
pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk;
if (mmdc_num == 0) if (mmdc_num == 0)
name = "mmdc"; name = "mmdc";
else else
@@ -529,7 +534,7 @@ pmu_free:
#else #else
#define imx_mmdc_remove NULL #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 #endif
static int imx_mmdc_probe(struct platform_device *pdev) 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); val &= ~(1 << BP_MMDC_MAPSR_PSD);
writel_relaxed(val, reg); 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) int imx_mmdc_get_ddr_type(void)

View File

@@ -3777,6 +3777,7 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
struct omap_hwmod_ocp_if *oi; struct omap_hwmod_ocp_if *oi;
struct clockdomain *clkdm; struct clockdomain *clkdm;
struct clk_hw_omap *clk; struct clk_hw_omap *clk;
struct clk_hw *hw;
if (!oh) if (!oh)
return NULL; return NULL;
@@ -3793,7 +3794,14 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
c = oi->_clk; 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; clkdm = clk->clkdm;
if (!clkdm) if (!clkdm)
return NULL; return NULL;

View File

@@ -54,6 +54,7 @@
&mscc_felix_port0 { &mscc_felix_port0 {
label = "swp0"; label = "swp0";
managed = "in-band-status";
phy-handle = <&phy0>; phy-handle = <&phy0>;
phy-mode = "sgmii"; phy-mode = "sgmii";
status = "okay"; status = "okay";
@@ -61,6 +62,7 @@
&mscc_felix_port1 { &mscc_felix_port1 {
label = "swp1"; label = "swp1";
managed = "in-band-status";
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "sgmii"; phy-mode = "sgmii";
status = "okay"; status = "okay";

View File

@@ -69,7 +69,7 @@
}; };
}; };
sysclk: clock-sysclk { sysclk: sysclk {
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <100000000>; clock-frequency = <100000000>;

View File

@@ -19,6 +19,8 @@
aliases { aliases {
spi0 = &spi0; spi0 = &spi0;
ethernet1 = &eth1; ethernet1 = &eth1;
mmc0 = &sdhci0;
mmc1 = &sdhci1;
}; };
chosen { chosen {
@@ -118,6 +120,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>; pinctrl-0 = <&i2c1_pins>;
clock-frequency = <100000>; clock-frequency = <100000>;
/delete-property/ mrvl,i2c-fast-mode;
status = "okay"; status = "okay";
rtc@6f { rtc@6f {

View File

@@ -321,7 +321,17 @@ static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
static inline unsigned long regs_return_value(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) static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc)

View File

@@ -29,24 +29,25 @@ static inline void syscall_rollback(struct task_struct *task,
regs->regs[0] = regs->orig_x0; 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, static inline long syscall_get_error(struct task_struct *task,
struct pt_regs *regs) struct pt_regs *regs)
{ {
unsigned long error = regs->regs[0]; unsigned long error = syscall_get_return_value(task, regs);
if (is_compat_thread(task_thread_info(task)))
error = sign_extend64(error, 31);
return IS_ERR_VALUE(error) ? error : 0; 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, static inline void syscall_set_return_value(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
int error, long val) int error, long val)

View File

@@ -1861,7 +1861,7 @@ void syscall_trace_exit(struct pt_regs *regs)
audit_syscall_exit(regs); audit_syscall_exit(regs);
if (flags & _TIF_SYSCALL_TRACEPOINT) 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)) if (flags & (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP))
tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT); tracehook_report_syscall(regs, PTRACE_SYSCALL_EXIT);

View File

@@ -29,6 +29,7 @@
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/fpsimd.h> #include <asm/fpsimd.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/syscall.h>
#include <asm/signal32.h> #include <asm/signal32.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/vdso.h> #include <asm/vdso.h>
@@ -890,7 +891,7 @@ static void do_signal(struct pt_regs *regs)
retval == -ERESTART_RESTARTBLOCK || retval == -ERESTART_RESTARTBLOCK ||
(retval == -ERESTARTSYS && (retval == -ERESTARTSYS &&
!(ksig.ka.sa.sa_flags & SA_RESTART)))) { !(ksig.ka.sa.sa_flags & SA_RESTART)))) {
regs->regs[0] = -EINTR; syscall_set_return_value(current, regs, -EINTR, 0);
regs->pc = continue_addr; regs->pc = continue_addr;
} }

View File

@@ -200,7 +200,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp, const char *loglvl)
#ifdef CONFIG_STACKTRACE #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, void *cookie, struct task_struct *task,
struct pt_regs *regs) struct pt_regs *regs)
{ {

View File

@@ -50,10 +50,7 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
ret = do_ni_syscall(regs, scno); ret = do_ni_syscall(regs, scno);
} }
if (is_compat_task()) syscall_set_return_value(current, regs, 0, ret);
ret = lower_32_bits(ret);
regs->regs[0] = ret;
} }
static inline bool has_syscall_work(unsigned long flags) static inline bool has_syscall_work(unsigned long flags)
@@ -128,7 +125,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 * syscall. do_notify_resume() will send a signal to userspace
* before the syscall is restarted. * before the syscall is restarted.
*/ */
regs->regs[0] = -ERESTARTNOINTR; syscall_set_return_value(current, regs, -ERESTARTNOINTR, 0);
return; return;
} }
@@ -149,7 +146,7 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
* anyway. * anyway.
*/ */
if (scno == NO_SYSCALL) if (scno == NO_SYSCALL)
regs->regs[0] = -ENOSYS; syscall_set_return_value(current, regs, -ENOSYS, 0);
scno = syscall_trace_enter(regs); scno = syscall_trace_enter(regs);
if (scno == NO_SYSCALL) if (scno == NO_SYSCALL)
goto trace_exit; goto trace_exit;

View File

@@ -320,7 +320,7 @@ KBUILD_LDFLAGS += -m $(ld-emul)
ifdef CONFIG_MIPS ifdef CONFIG_MIPS
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ 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') sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
endif endif

View File

@@ -59,15 +59,20 @@ do { \
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
{ {
pmd_t *pmd = NULL; pmd_t *pmd;
struct page *pg; struct page *pg;
pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER); pg = alloc_pages(GFP_KERNEL_ACCOUNT, PMD_ORDER);
if (pg) { if (!pg)
pgtable_pmd_page_ctor(pg); return NULL;
if (!pgtable_pmd_page_ctor(pg)) {
__free_pages(pg, PMD_ORDER);
return NULL;
}
pmd = (pmd_t *)page_address(pg); pmd = (pmd_t *)page_address(pg);
pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table); pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
}
return pmd; return pmd;
} }

View File

@@ -47,7 +47,8 @@ static struct plat_serial8250_port uart8250_data[] = {
.mapbase = 0x1f000900, /* The CBUS UART */ .mapbase = 0x1f000900, /* The CBUS UART */
.irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2, .irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2,
.uartclk = 3686400, /* Twice the usual clk! */ .uartclk = 3686400, /* Twice the usual clk! */
.iotype = UPIO_MEM32, .iotype = IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) ?
UPIO_MEM32BE : UPIO_MEM32,
.flags = CBUS_UART_FLAGS, .flags = CBUS_UART_FLAGS,
.regshift = 3, .regshift = 3,
}, },

View File

@@ -1009,9 +1009,10 @@ void x86_pmu_stop(struct perf_event *event, int flags);
static inline void x86_pmu_disable_event(struct perf_event *event) 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; 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)) if (is_counter_pair(hwc))
wrmsrl(x86_pmu_config_addr(hwc->idx + 1), 0); wrmsrl(x86_pmu_config_addr(hwc->idx + 1), 0);

View File

@@ -1621,7 +1621,7 @@ static int is_empty_shadow_page(u64 *spt)
* aggregate version in order to make the slab shrinker * aggregate version in order to make the slab shrinker
* faster * 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; kvm->arch.n_used_mmu_pages += nr;
percpu_counter_add(&kvm_total_used_mmu_pages, nr); percpu_counter_add(&kvm_total_used_mmu_pages, nr);

View File

@@ -4100,8 +4100,17 @@ static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
static int kvm_vcpu_ready_for_interrupt_injection(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, static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,

View File

@@ -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); enable = iolatency_set_min_lat_nsec(blkg, lat_val);
if (enable) { if (enable) {
WARN_ON_ONCE(!blk_get_queue(blkg->q)); if (!blk_get_queue(blkg->q)) {
ret = -ENODEV;
goto out;
}
blkg_get(blkg); blkg_get(blkg);
} }

View File

@@ -375,13 +375,6 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
(*element_ptr)->common.reference_count = (*element_ptr)->common.reference_count =
original_ref_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++; element_ptr++;

View File

@@ -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); 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. * ata_pio_sector - Transfer a sector of data.
* @qc: Command on going * @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) 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 ata_port *ap = qc->ap;
struct page *page; struct page *page;
unsigned int offset; unsigned int offset;
unsigned char *buf;
if (!qc->cursg) { if (!qc->cursg) {
qc->curbytes = qc->nbytes; 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"); DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
/* do the actual data transfer */ /*
buf = kmap_atomic(page); * Split the transfer when it splits a page boundary. Note that the
ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, do_write); * split still has to be dword aligned like all ATA data transfers.
kunmap_atomic(buf); */
WARN_ON_ONCE(offset % 4);
if (offset + qc->sect_size > PAGE_SIZE) {
unsigned int split_len = PAGE_SIZE - offset;
if (!do_write && !PageSlab(page)) ata_pio_xfer(qc, page, offset, split_len);
flush_dcache_page(page); 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->curbytes += qc->sect_size;
qc->cursg_ofs += qc->sect_size; qc->cursg_ofs += qc->sect_size;

View File

@@ -617,8 +617,6 @@ dev_groups_failed:
else if (drv->remove) else if (drv->remove)
drv->remove(dev); drv->remove(dev);
probe_failed: probe_failed:
kfree(dev->dma_range_map);
dev->dma_range_map = NULL;
if (dev->bus) if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier, blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
BUS_NOTIFY_DRIVER_NOT_BOUND, dev); BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
@@ -626,6 +624,8 @@ pinctrl_bind_failed:
device_links_no_driver(dev); device_links_no_driver(dev);
devres_release_all(dev); devres_release_all(dev);
arch_teardown_dma_ops(dev); arch_teardown_dma_ops(dev);
kfree(dev->dma_range_map);
dev->dma_range_map = NULL;
driver_sysfs_remove(dev); driver_sysfs_remove(dev);
dev->driver = NULL; dev->driver = NULL;
dev_set_drvdata(dev, NULL); dev_set_drvdata(dev, NULL);

View File

@@ -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' * 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; return;
list_del_init(&fw_priv->pending_list);
fw_state_aborted(fw_priv); 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 * Same logic as fw_load_abort, only the DONE bit
* is ignored and we set ABORT only on failure. * is ignored and we set ABORT only on failure.
*/ */
list_del_init(&fw_priv->pending_list);
if (rc) { if (rc) {
fw_state_aborted(fw_priv); fw_state_aborted(fw_priv);
written = rc; written = rc;
@@ -513,6 +511,11 @@ static int fw_load_sysfs_fallback(struct fw_sysfs *fw_sysfs, long timeout)
} }
mutex_lock(&fw_lock); 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); list_add(&fw_priv->pending_list, &pending_fw_head);
mutex_unlock(&fw_lock); 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 (fw_state_is_aborted(fw_priv)) {
if (retval == -ERESTARTSYS) if (retval == -ERESTARTSYS)
retval = -EINTR; retval = -EINTR;
else
retval = -EAGAIN;
} else if (fw_priv->is_paged_buf && !fw_priv->data) } else if (fw_priv->is_paged_buf && !fw_priv->data)
retval = -ENOMEM; retval = -ENOMEM;
out:
device_del(f_dev); device_del(f_dev);
err_put_dev: err_put_dev:
put_device(f_dev); put_device(f_dev);

View File

@@ -117,8 +117,16 @@ static inline void __fw_state_set(struct fw_priv *fw_priv,
WRITE_ONCE(fw_st->status, status); 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); complete_all(&fw_st->completion);
}
} }
static inline void fw_state_aborted(struct fw_priv *fw_priv) static inline void fw_state_aborted(struct fw_priv *fw_priv)

View File

@@ -781,8 +781,10 @@ static void fw_abort_batch_reqs(struct firmware *fw)
return; return;
fw_priv = fw->priv; fw_priv = fw->priv;
mutex_lock(&fw_lock);
if (!fw_state_is_aborted(fw_priv)) if (!fw_state_is_aborted(fw_priv))
fw_state_aborted(fw_priv); fw_state_aborted(fw_priv);
mutex_unlock(&fw_lock);
} }
/* called from request_firmware() and request_firmware_work_func() */ /* called from request_firmware() and request_firmware_work_func() */

View File

@@ -100,6 +100,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
* @cookie: data used by legacy platform callbacks * @cookie: data used by legacy platform callbacks
* @name: name if available * @name: name if available
* @revision: interconnect target module revision * @revision: interconnect target module revision
* @reserved: target module is reserved and already in use
* @enabled: sysc runtime enabled status * @enabled: sysc runtime enabled status
* @needs_resume: runtime resume needed on resume from suspend * @needs_resume: runtime resume needed on resume from suspend
* @child_needs_resume: runtime resume needed for child 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; struct ti_sysc_cookie cookie;
const char *name; const char *name;
u32 revision; u32 revision;
unsigned int reserved:1;
unsigned int enabled:1; unsigned int enabled:1;
unsigned int needs_resume:1; unsigned int needs_resume:1;
unsigned int child_needs_resume:1; unsigned int child_needs_resume:1;
@@ -2918,6 +2920,8 @@ static int sysc_init_soc(struct sysc *ddata)
case SOC_3430 ... SOC_3630: case SOC_3430 ... SOC_3630:
sysc_add_disabled(0x48304000); /* timer12 */ sysc_add_disabled(0x48304000); /* timer12 */
break; break;
case SOC_AM3:
sysc_add_disabled(0x48310000); /* rng */
default: default:
break; break;
}; };
@@ -3057,8 +3061,8 @@ static int sysc_probe(struct platform_device *pdev)
return error; return error;
error = sysc_check_active_timer(ddata); error = sysc_check_active_timer(ddata);
if (error) if (error == -EBUSY)
return error; ddata->reserved = true;
error = sysc_get_clocks(ddata); error = sysc_get_clocks(ddata);
if (error) if (error)
@@ -3094,11 +3098,15 @@ static int sysc_probe(struct platform_device *pdev)
sysc_show_registers(ddata); sysc_show_registers(ddata);
ddata->dev->type = &sysc_device_type; ddata->dev->type = &sysc_device_type;
error = of_platform_populate(ddata->dev->of_node, sysc_match_table,
if (!ddata->reserved) {
error = of_platform_populate(ddata->dev->of_node,
sysc_match_table,
pdata ? pdata->auxdata : NULL, pdata ? pdata->auxdata : NULL,
ddata->dev); ddata->dev);
if (error) if (error)
goto err; goto err;
}
INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle); INIT_DELAYED_WORK(&ddata->idle_work, ti_sysc_idle);

View File

@@ -254,11 +254,11 @@ static int ftpm_tee_probe(struct device *dev)
pvt_data->session = sess_arg.session; pvt_data->session = sess_arg.session;
/* Allocate dynamic shared memory with fTPM TA */ /* Allocate dynamic shared memory with fTPM TA */
pvt_data->shm = tee_shm_alloc(pvt_data->ctx, pvt_data->shm = tee_shm_alloc_kernel_buf(pvt_data->ctx,
MAX_COMMAND_SIZE + MAX_RESPONSE_SIZE, MAX_COMMAND_SIZE +
TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); MAX_RESPONSE_SIZE);
if (IS_ERR(pvt_data->shm)) { 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; rc = -ENOMEM;
goto out_shm_alloc; goto out_shm_alloc;
} }

View File

@@ -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); 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, int __must_check devm_clk_bulk_get_all(struct device *dev,
struct clk_bulk_data **clks) struct clk_bulk_data **clks)
{ {
struct clk_bulk_devres *devres; struct clk_bulk_devres *devres;
int ret; int ret;
devres = devres_alloc(devm_clk_bulk_release, devres = devres_alloc(devm_clk_bulk_release_all,
sizeof(*devres), GFP_KERNEL); sizeof(*devres), GFP_KERNEL);
if (!devres) if (!devres)
return -ENOMEM; return -ENOMEM;

View File

@@ -526,7 +526,7 @@ struct stm32f4_pll {
struct stm32f4_pll_post_div_data { struct stm32f4_pll_post_div_data {
int idx; int idx;
u8 pll_num; int pll_idx;
const char *name; const char *name;
const char *parent; const char *parent;
u8 flag; u8 flag;
@@ -557,13 +557,13 @@ static const struct clk_div_table post_divr_table[] = {
#define MAX_POST_DIV 3 #define MAX_POST_DIV 3
static const struct stm32f4_pll_post_div_data post_div_data[MAX_POST_DIV] = { 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_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 }, 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 }, 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->width,
post_div->flag_div, post_div->flag_div,
post_div->div_table, post_div->div_table,
clks[post_div->pll_num], clks[post_div->pll_idx],
&stm32f4_clk_lock); &stm32f4_clk_lock);
if (post_div->idx != NO_IDX) if (post_div->idx != NO_IDX)

View File

@@ -194,6 +194,15 @@ static void clk_sdmmc_mux_disable(struct clk_hw *hw)
gate_ops->disable(gate_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) static void clk_sdmmc_mux_restore_context(struct clk_hw *hw)
{ {
struct clk_hw *parent = clk_hw_get_parent(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, .is_enabled = clk_sdmmc_mux_is_enabled,
.enable = clk_sdmmc_mux_enable, .enable = clk_sdmmc_mux_enable,
.disable = clk_sdmmc_mux_disable, .disable = clk_sdmmc_mux_disable,
.disable_unused = clk_sdmmc_mux_disable_unused,
.restore_context = clk_sdmmc_mux_restore_context, .restore_context = clk_sdmmc_mux_restore_context,
}; };

View File

@@ -831,6 +831,8 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
dma_length += sg_dma_len(sg); dma_length += sg_dma_len(sg);
} }
imxdma_config_write(chan, &imxdmac->config, direction);
switch (imxdmac->word_size) { switch (imxdmac->word_size) {
case DMA_SLAVE_BUSWIDTH_4_BYTES: case DMA_SLAVE_BUSWIDTH_4_BYTES:
if (sg_dma_len(sgl) & 3 || sgl->dma_address & 3) if (sg_dma_len(sgl) & 3 || sgl->dma_address & 3)

View File

@@ -1187,7 +1187,7 @@ static int stm32_dma_alloc_chan_resources(struct dma_chan *c)
chan->config_init = false; chan->config_init = false;
ret = pm_runtime_get_sync(dmadev->ddev.dev); ret = pm_runtime_resume_and_get(dmadev->ddev.dev);
if (ret < 0) if (ret < 0)
return ret; return ret;
@@ -1455,7 +1455,7 @@ static int stm32_dma_suspend(struct device *dev)
struct stm32_dma_device *dmadev = dev_get_drvdata(dev); struct stm32_dma_device *dmadev = dev_get_drvdata(dev);
int id, ret, scr; int id, ret, scr;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_resume_and_get(dev);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@@ -137,7 +137,7 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
/* Set dma request */ /* Set dma request */
spin_lock_irqsave(&dmamux->lock, flags); spin_lock_irqsave(&dmamux->lock, flags);
ret = pm_runtime_get_sync(&pdev->dev); ret = pm_runtime_resume_and_get(&pdev->dev);
if (ret < 0) { if (ret < 0) {
spin_unlock_irqrestore(&dmamux->lock, flags); spin_unlock_irqrestore(&dmamux->lock, flags);
goto error; goto error;
@@ -336,7 +336,7 @@ static int stm32_dmamux_suspend(struct device *dev)
struct stm32_dmamux_data *stm32_dmamux = platform_get_drvdata(pdev); struct stm32_dmamux_data *stm32_dmamux = platform_get_drvdata(pdev);
int i, ret; int i, ret;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_resume_and_get(dev);
if (ret < 0) if (ret < 0)
return ret; return ret;
@@ -361,7 +361,7 @@ static int stm32_dmamux_resume(struct device *dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_resume_and_get(dev);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@@ -209,7 +209,7 @@ static int uniphier_xdmac_chan_stop(struct uniphier_xdmac_chan *xc)
writel(0, xc->reg_ch_base + XDMAC_TSS); writel(0, xc->reg_ch_base + XDMAC_TSS);
/* wait until transfer is stopped */ /* wait until transfer is stopped */
return readl_poll_timeout(xc->reg_ch_base + XDMAC_STAT, val, return readl_poll_timeout_atomic(xc->reg_ch_base + XDMAC_STAT, val,
!(val & XDMAC_STAT_TENF), 100, 1000); !(val & XDMAC_STAT_TENF), 100, 1000);
} }

View File

@@ -953,6 +953,8 @@ static int fme_perf_offline_cpu(unsigned int cpu, struct hlist_node *node)
return 0; return 0;
priv->cpu = target; priv->cpu = target;
perf_pmu_migrate_context(&priv->pmu, cpu, target);
return 0; return 0;
} }

View File

@@ -396,7 +396,7 @@ static int mpc8xxx_probe(struct platform_device *pdev)
ret = devm_request_irq(&pdev->dev, mpc8xxx_gc->irqn, ret = devm_request_irq(&pdev->dev, mpc8xxx_gc->irqn,
mpc8xxx_gpio_irq_cascade, mpc8xxx_gpio_irq_cascade,
IRQF_SHARED, "gpio-cascade", IRQF_NO_THREAD | IRQF_SHARED, "gpio-cascade",
mpc8xxx_gc); mpc8xxx_gc);
if (ret) { if (ret) {
dev_err(&pdev->dev, "%s: failed to devm_request_irq(%d), ret = %d\n", dev_err(&pdev->dev, "%s: failed to devm_request_irq(%d), ret = %d\n",

View File

@@ -238,8 +238,8 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
int ret, irq; int ret, irq;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq_optional(pdev, 0);
if (irq < 0) if (irq < 0 && irq != -ENXIO)
return irq; return irq;
res = platform_get_resource(pdev, IORESOURCE_IO, 0); 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); pm_runtime_enable(&pdev->dev);
if (irq) { if (irq > 0) {
struct irq_chip *irq_chip = &gpio->irq_chip; struct irq_chip *irq_chip = &gpio->irq_chip;
u8 irq_status; u8 irq_status;

View File

@@ -1301,6 +1301,7 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
} }
hdr = (const struct dmcub_firmware_header_v1_0 *)adev->dm.dmub_fw->data; 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) { if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
adev->firmware.ucode[AMDGPU_UCODE_ID_DMCUB].ucode_id = adev->firmware.ucode[AMDGPU_UCODE_ID_DMCUB].ucode_id =
@@ -1314,7 +1315,6 @@ static int dm_dmub_sw_init(struct amdgpu_device *adev)
adev->dm.dmcub_fw_version); 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); adev->dm.dmub_srv = kzalloc(sizeof(*adev->dm.dmub_srv), GFP_KERNEL);
dmub_srv = adev->dm.dmub_srv; dmub_srv = adev->dm.dmub_srv;
@@ -2162,9 +2162,9 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
max_cll = conn_base->hdr_sink_metadata.hdmi_type1.max_cll; max_cll = conn_base->hdr_sink_metadata.hdmi_type1.max_cll;
min_cll = conn_base->hdr_sink_metadata.hdmi_type1.min_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.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; caps->aux_support = true;
if (amdgpu_backlight == 0) if (amdgpu_backlight == 0)

View File

@@ -2351,6 +2351,12 @@ static int eb_parse(struct i915_execbuffer *eb)
eb->batch_flags |= I915_DISPATCH_SECURE; eb->batch_flags |= I915_DISPATCH_SECURE;
} }
batch = eb_dispatch_secure(eb, shadow);
if (IS_ERR(batch)) {
err = PTR_ERR(batch);
goto err_trampoline;
}
err = intel_engine_cmd_parser(eb->engine, err = intel_engine_cmd_parser(eb->engine,
eb->batch->vma, eb->batch->vma,
eb->batch_start_offset, eb->batch_start_offset,
@@ -2377,6 +2383,7 @@ secure_batch:
err_unpin_batch: err_unpin_batch:
if (batch) if (batch)
i915_vma_unpin(batch); i915_vma_unpin(batch);
err_trampoline:
if (trampoline) if (trampoline)
i915_vma_unpin(trampoline); i915_vma_unpin(trampoline);
err_shadow: err_shadow:

View File

@@ -413,7 +413,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(engine) _MMIO((engine)->mmio_base + 0x2014)
#define GEN11_VECS_SFC_USAGE_BIT (1 << 0) #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 GEN12_SFC_DONE_MAX 4
#define RING_PP_DIR_BASE(base) _MMIO((base) + 0x228) #define RING_PP_DIR_BASE(base) _MMIO((base) + 0x228)

View File

@@ -526,7 +526,7 @@ static void __cache_work_func(struct mlx5_cache_ent *ent)
*/ */
spin_unlock_irq(&ent->lock); spin_unlock_irq(&ent->lock);
need_delay = need_resched() || someone_adding(cache) || need_delay = need_resched() || someone_adding(cache) ||
time_after(jiffies, !time_after(jiffies,
READ_ONCE(cache->last_add) + 300 * HZ); READ_ONCE(cache->last_add) + 300 * HZ);
spin_lock_irq(&ent->lock); spin_lock_irq(&ent->lock);
if (ent->disabled) if (ent->disabled)

View File

@@ -403,7 +403,7 @@ struct icc_path *devm_of_icc_get(struct device *dev, const char *name)
{ {
struct icc_path **ptr, *path; 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) if (!ptr)
return ERR_PTR(-ENOMEM); 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->avg_bw = node->init_avg;
node->peak_bw = node->init_peak; node->peak_bw = node->init_peak;
if (provider->pre_aggregate)
provider->pre_aggregate(node);
if (provider->aggregate) if (provider->aggregate)
provider->aggregate(node, 0, node->init_avg, node->init_peak, provider->aggregate(node, 0, node->init_avg, node->init_peak,
&node->avg_bw, &node->peak_bw); &node->avg_bw, &node->peak_bw);
provider->set(node, node); provider->set(node, node);
node->avg_bw = 0; node->avg_bw = 0;
node->peak_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"); dev_dbg(p->dev, "interconnect provider is in synced state\n");
list_for_each_entry(n, &p->nodes, node_list) { list_for_each_entry(n, &p->nodes, node_list) {
if (n->init_avg || n->init_peak) { if (n->init_avg || n->init_peak) {
n->init_avg = 0;
n->init_peak = 0;
aggregate_requests(n); aggregate_requests(n);
p->set(n, n); p->set(n, n);
} }

View File

@@ -57,6 +57,11 @@ int qcom_icc_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
qn->sum_avg[i] += avg_bw; qn->sum_avg[i] += avg_bw;
qn->max_peak[i] = max_t(u32, qn->max_peak[i], peak_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; *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) int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
{ {
struct qcom_icc_provider *qp; struct qcom_icc_provider *qp;
struct qcom_icc_node *qn;
struct icc_node *node; struct icc_node *node;
if (!src) if (!src)
@@ -88,12 +92,6 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst)
node = src; node = src;
qp = to_qcom_provider(node->provider); 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); qcom_icc_bcm_voter_commit(qp->voter);

View File

@@ -472,8 +472,6 @@ static void raid1_end_write_request(struct bio *bio)
/* /*
* When the device is faulty, it is not necessary to * When the device is faulty, it is not necessary to
* handle write error. * 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)) if (!test_bit(Faulty, &rdev->flags))
set_bit(R1BIO_WriteError, &r1_bio->state); set_bit(R1BIO_WriteError, &r1_bio->state);

View File

@@ -470,12 +470,12 @@ static void raid10_end_write_request(struct bio *bio)
/* /*
* When the device is faulty, it is not necessary to * When the device is faulty, it is not necessary to
* handle write error. * 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)) if (!test_bit(Faulty, &rdev->flags))
set_bit(R10BIO_WriteError, &r10_bio->state); set_bit(R10BIO_WriteError, &r10_bio->state);
else { else {
/* Fail the request */
set_bit(R10BIO_Degraded, &r10_bio->state);
r10_bio->devs[slot].bio = NULL; r10_bio->devs[slot].bio = NULL;
to_put = bio; to_put = bio;
dec_rdev = 1; dec_rdev = 1;

View File

@@ -1573,6 +1573,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
struct media_request *req) struct media_request *req)
{ {
struct vb2_buffer *vb; struct vb2_buffer *vb;
enum vb2_buffer_state orig_state;
int ret; int ret;
if (q->error) { 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 * Add to the queued buffers list, a buffer will stay on it until
* dequeued in dqbuf. * dequeued in dqbuf.
*/ */
orig_state = vb->state;
list_add_tail(&vb->queued_entry, &q->queued_list); list_add_tail(&vb->queued_entry, &q->queued_list);
q->queued_count++; q->queued_count++;
q->waiting_for_buffers = false; q->waiting_for_buffers = false;
@@ -1703,9 +1705,18 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb,
if (q->streaming && !q->start_streaming_called && if (q->streaming && !q->start_streaming_called &&
q->queued_count >= q->min_buffers_needed) { q->queued_count >= q->min_buffers_needed) {
ret = vb2_start_streaming(q); 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; return ret;
} }
}
dprintk(q, 2, "qbuf of buffer %d succeeded\n", vb->index); dprintk(q, 2, "qbuf of buffer %d succeeded\n", vb->index);
return 0; return 0;

View File

@@ -37,7 +37,16 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req)
} else { } else {
/* read */ /* read */
requesttype = (USB_TYPE_VENDOR | USB_DIR_IN); requesttype = (USB_TYPE_VENDOR | USB_DIR_IN);
/*
* 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); pipe = usb_rcvctrlpipe(d->udev, 0);
else
pipe = usb_sndctrlpipe(d->udev, 0);
} }
ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value, ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,

View File

@@ -689,16 +689,24 @@ static int ar9331_mdio_write(void *ctx, u32 reg, u32 val)
return 0; return 0;
} }
ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg, val); /* In case of this switch we work with 32bit registers on top of 16bit
if (ret < 0) * bus. Some registers (for example access to forwarding database) have
goto error; * 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, ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg + 2,
val >> 16); val >> 16);
if (ret < 0) if (ret < 0)
goto error; goto error;
ret = __ar9331_mdio_write(sbus, AR9331_SW_MDIO_PHY_MODE_REG, reg, val);
if (ret < 0)
goto error;
return 0; return 0;
error: error:
dev_err_ratelimited(&sbus->dev, "Bus error. Failed to write register.\n"); dev_err_ratelimited(&sbus->dev, "Bus error. Failed to write register.\n");
return ret; return ret;

View File

@@ -1260,10 +1260,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, int sja1105et_fdb_add(struct dsa_switch *ds, int port,
const unsigned char *addr, u16 vid) 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 sja1105_private *priv = ds->priv;
struct device *dev = ds->dev; struct device *dev = ds->dev;
int last_unused = -1; int last_unused = -1;
int start, end, i;
int bin, way, rc; int bin, way, rc;
bin = sja1105et_fdb_hash(priv, addr, vid); bin = sja1105et_fdb_hash(priv, addr, vid);
@@ -1275,7 +1276,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
* mask? If yes, we need to do nothing. If not, we need * mask? If yes, we need to do nothing. If not, we need
* to rewrite the entry by adding this port to it. * 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; return 0;
l2_lookup.destports |= BIT(port); l2_lookup.destports |= BIT(port);
} else { } else {
@@ -1306,6 +1307,7 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
index, NULL, false); index, NULL, false);
} }
} }
l2_lookup.lockeds = true;
l2_lookup.index = sja1105et_fdb_index(bin, way); l2_lookup.index = sja1105et_fdb_index(bin, way);
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
@@ -1314,6 +1316,29 @@ int sja1105et_fdb_add(struct dsa_switch *ds, int port,
if (rc < 0) if (rc < 0)
return rc; 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); return sja1105_static_fdb_change(priv, port, &l2_lookup, true);
} }
@@ -1355,31 +1380,24 @@ int sja1105et_fdb_del(struct dsa_switch *ds, int port,
int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port, int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
const unsigned char *addr, u16 vid) 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 sja1105_private *priv = ds->priv;
int rc, i; int rc, i;
/* Search for an existing entry in the FDB table */ /* Search for an existing entry in the FDB table */
l2_lookup.macaddr = ether_addr_to_u64(addr); l2_lookup.macaddr = ether_addr_to_u64(addr);
l2_lookup.vlanid = vid; l2_lookup.vlanid = vid;
l2_lookup.iotag = SJA1105_S_TAG;
l2_lookup.mask_macaddr = GENMASK_ULL(ETH_ALEN * 8 - 1, 0); 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_vlanid = VLAN_VID_MASK;
l2_lookup.mask_iotag = BIT(0);
} else {
l2_lookup.mask_vlanid = 0;
l2_lookup.mask_iotag = 0;
}
l2_lookup.destports = BIT(port); l2_lookup.destports = BIT(port);
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP, rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,
SJA1105_SEARCH, &l2_lookup); SJA1105_SEARCH, &l2_lookup);
if (rc == 0) { if (rc == 0) {
/* Found and this port is already in the entry's /* Found a static entry and this port is already in the entry's
* port mask => job done * port mask => job done
*/ */
if (l2_lookup.destports & BIT(port)) if ((l2_lookup.destports & BIT(port)) && l2_lookup.lockeds)
return 0; return 0;
/* l2_lookup.index is populated by the switch in case it /* l2_lookup.index is populated by the switch in case it
* found something. * found something.
@@ -1402,16 +1420,46 @@ int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
dev_err(ds->dev, "FDB is full, cannot add entry.\n"); dev_err(ds->dev, "FDB is full, cannot add entry.\n");
return -EINVAL; return -EINVAL;
} }
l2_lookup.lockeds = true;
l2_lookup.index = i; l2_lookup.index = i;
skip_finding_an_index: skip_finding_an_index:
l2_lookup.lockeds = true;
rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP, rc = sja1105_dynamic_config_write(priv, BLK_IDX_L2_LOOKUP,
l2_lookup.index, &l2_lookup, l2_lookup.index, &l2_lookup,
true); true);
if (rc < 0) if (rc < 0)
return rc; 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); return sja1105_static_fdb_change(priv, port, &l2_lookup, true);
} }
@@ -1425,15 +1473,8 @@ int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
l2_lookup.macaddr = ether_addr_to_u64(addr); l2_lookup.macaddr = ether_addr_to_u64(addr);
l2_lookup.vlanid = vid; l2_lookup.vlanid = vid;
l2_lookup.iotag = SJA1105_S_TAG;
l2_lookup.mask_macaddr = GENMASK_ULL(ETH_ALEN * 8 - 1, 0); 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_vlanid = VLAN_VID_MASK;
l2_lookup.mask_iotag = BIT(0);
} else {
l2_lookup.mask_vlanid = 0;
l2_lookup.mask_iotag = 0;
}
l2_lookup.destports = BIT(port); l2_lookup.destports = BIT(port);
rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP, rc = sja1105_dynamic_config_read(priv, BLK_IDX_L2_LOOKUP,

View File

@@ -2669,7 +2669,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
} }
/* Allocated memory for FW statistics */ /* 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); LOAD_ERROR_EXIT(bp, load_error0);
/* request pf to initialize status blocks */ /* request pf to initialize status blocks */

View File

@@ -3822,13 +3822,13 @@ fec_drv_remove(struct platform_device *pdev)
if (of_phy_is_fixed_link(np)) if (of_phy_is_fixed_link(np))
of_phy_deregister_fixed_link(np); of_phy_deregister_fixed_link(np);
of_node_put(fep->phy_node); of_node_put(fep->phy_node);
free_netdev(ndev);
clk_disable_unprepare(fep->clk_ahb); clk_disable_unprepare(fep->clk_ahb);
clk_disable_unprepare(fep->clk_ipg); clk_disable_unprepare(fep->clk_ipg);
pm_runtime_put_noidle(&pdev->dev); pm_runtime_put_noidle(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
free_netdev(ndev);
return 0; return 0;
} }

View File

@@ -819,7 +819,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)
printk(version); printk(version);
#endif #endif
i = pci_enable_device(pdev); i = pcim_enable_device(pdev);
if (i) return i; if (i) return i;
/* natsemi has a non-standard PM control register /* 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); ioaddr = ioremap(iostart, iosize);
if (!ioaddr) { if (!ioaddr) {
i = -ENOMEM; i = -ENOMEM;
goto err_ioremap; goto err_pci_request_regions;
} }
/* Work around the dropped serial bit. */ /* 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: err_register_netdev:
iounmap(ioaddr); iounmap(ioaddr);
err_ioremap:
pci_release_regions(pdev);
err_pci_request_regions: err_pci_request_regions:
free_netdev(dev); free_netdev(dev);
return i; return i;
@@ -3241,7 +3238,6 @@ static void natsemi_remove1(struct pci_dev *pdev)
NATSEMI_REMOVE_FILE(pdev, dspcfg_workaround); NATSEMI_REMOVE_FILE(pdev, dspcfg_workaround);
unregister_netdev (dev); unregister_netdev (dev);
pci_release_regions (pdev);
iounmap(ioaddr); iounmap(ioaddr);
free_netdev (dev); free_netdev (dev);
} }

View File

@@ -3527,13 +3527,13 @@ static void vxge_device_unregister(struct __vxge_hw_device *hldev)
kfree(vdev->vpaths); kfree(vdev->vpaths);
/* we are safe to free it now */
free_netdev(dev);
vxge_debug_init(vdev->level_trace, "%s: ethernet device unregistered", vxge_debug_init(vdev->level_trace, "%s: ethernet device unregistered",
buf); buf);
vxge_debug_entryexit(vdev->level_trace, "%s: %s:%d Exiting...", buf, vxge_debug_entryexit(vdev->level_trace, "%s: %s:%d Exiting...", buf,
__func__, __LINE__); __func__, __LINE__);
/* we are safe to free it now */
free_netdev(dev);
} }
/* /*

View File

@@ -286,6 +286,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev,
/* Init to unknowns */ /* Init to unknowns */
ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); 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.port = PORT_OTHER;
cmd->base.speed = SPEED_UNKNOWN; cmd->base.speed = SPEED_UNKNOWN;
cmd->base.duplex = DUPLEX_UNKNOWN; cmd->base.duplex = DUPLEX_UNKNOWN;

View File

@@ -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) int qede_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
{ {
struct qede_dev *edev = netdev_priv(dev); struct qede_dev *edev = netdev_priv(dev);
struct qede_vlan *vlan = NULL; struct qede_vlan *vlan;
int rc = 0; int rc = 0;
DP_VERBOSE(edev, NETIF_MSG_IFDOWN, "Removing vlan 0x%04x\n", vid); 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) if (vlan->vid == vid)
break; 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), DP_VERBOSE(edev, (NETIF_MSG_IFUP | NETIF_MSG_IFDOWN),
"Vlan isn't configured\n"); "Vlan isn't configured\n");
goto out; goto out;

View File

@@ -154,7 +154,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
"driver lock acquired\n"); "driver lock acquired\n");
return 1; return 1;
} }
ssleep(1); mdelay(1000);
} while (++i < 10); } while (++i < 10);
netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n"); netdev_err(qdev->ndev, "Timed out waiting for driver lock...\n");
@@ -3290,7 +3290,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
if ((value & ISP_CONTROL_SR) == 0) if ((value & ISP_CONTROL_SR) == 0)
break; break;
ssleep(1); mdelay(1000);
} while ((--max_wait_time)); } while ((--max_wait_time));
/* /*
@@ -3326,7 +3326,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)
ispControlStatus); ispControlStatus);
if ((value & ISP_CONTROL_FSR) == 0) if ((value & ISP_CONTROL_FSR) == 0)
break; break;
ssleep(1); mdelay(1000);
} while ((--max_wait_time)); } while ((--max_wait_time));
} }
if (max_wait_time == 0) if (max_wait_time == 0)

View File

@@ -349,11 +349,11 @@ static int ksz8041_config_aneg(struct phy_device *phydev)
} }
static int ksz8051_ksz8795_match_phy_device(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; 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; return 0;
ret = phy_read(phydev, MII_BMSR); ret = phy_read(phydev, MII_BMSR);
@@ -366,7 +366,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
* the switch does not. * the switch does not.
*/ */
ret &= BMSR_ERCAP; ret &= BMSR_ERCAP;
if (ksz_phy_id == PHY_ID_KSZ8051) if (ksz_8051)
return ret; return ret;
else else
return !ret; return !ret;
@@ -374,7 +374,7 @@ static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev,
static int ksz8051_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) static int ksz8081_config_init(struct phy_device *phydev)
@@ -402,7 +402,7 @@ static int ksz8061_config_init(struct phy_device *phydev)
static int ksz8795_match_phy_device(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, static int ksz9021_load_values_from_of(struct phy_device *phydev,

View File

@@ -736,12 +736,16 @@ static inline void disable_net_traffic(pegasus_t *pegasus)
set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp); 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; u16 data;
u8 interval; 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; interval = data >> 8;
if (pegasus->usb->speed != USB_SPEED_HIGH) { if (pegasus->usb->speed != USB_SPEED_HIGH) {
if (interval < 0x80) { if (interval < 0x80) {
@@ -756,6 +760,8 @@ static inline void get_interrupt_interval(pegasus_t *pegasus)
} }
} }
pegasus->intr_interval = interval; pegasus->intr_interval = interval;
return 0;
} }
static void set_carrier(struct net_device *net) static void set_carrier(struct net_device *net)
@@ -1150,7 +1156,9 @@ static int pegasus_probe(struct usb_interface *intf,
| NETIF_MSG_PROBE | NETIF_MSG_LINK); | NETIF_MSG_PROBE | NETIF_MSG_LINK);
pegasus->features = usb_dev_id[dev_index].private; 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)) { if (reset_mac(pegasus)) {
dev_err(&intf->dev, "can't reset MAC\n"); dev_err(&intf->dev, "can't reset MAC\n");
res = -EIO; res = -EIO;

View File

@@ -138,6 +138,29 @@ static struct ieee80211_supported_band band_5ghz = {
/* Assigned at module init. Guaranteed locally-administered and unicast. */ /* Assigned at module init. Guaranteed locally-administered and unicast. */
static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {}; 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. */ /* Called with the rtnl lock held. */
static int virt_wifi_scan(struct wiphy *wiphy, static int virt_wifi_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request) struct cfg80211_scan_request *request)
@@ -161,28 +184,13 @@ static int virt_wifi_scan(struct wiphy *wiphy,
/* Acquires and releases the rdev BSS lock. */ /* Acquires and releases the rdev BSS lock. */
static void virt_wifi_scan_result(struct work_struct *work) 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 = struct virt_wifi_wiphy_priv *priv =
container_of(work, struct virt_wifi_wiphy_priv, container_of(work, struct virt_wifi_wiphy_priv,
scan_result.work); scan_result.work);
struct wiphy *wiphy = priv_to_wiphy(priv); struct wiphy *wiphy = priv_to_wiphy(priv);
struct cfg80211_scan_info scan_info = { .aborted = false }; 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, virt_wifi_inform_bss(wiphy);
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);
if(priv->network_simulation && if(priv->network_simulation &&
priv->network_simulation->generate_virt_scan_result) { priv->network_simulation->generate_virt_scan_result) {
@@ -236,10 +244,12 @@ static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev,
if (!could_schedule) if (!could_schedule)
return -EBUSY; return -EBUSY;
if (sme->bssid) if (sme->bssid) {
ether_addr_copy(priv->connect_requested_bss, 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); eth_zero_addr(priv->connect_requested_bss);
}
wiphy_debug(wiphy, "connect\n"); wiphy_debug(wiphy, "connect\n");
@@ -252,11 +262,13 @@ static void virt_wifi_connect_complete(struct work_struct *work)
struct virt_wifi_netdev_priv *priv = struct virt_wifi_netdev_priv *priv =
container_of(work, struct virt_wifi_netdev_priv, connect.work); container_of(work, struct virt_wifi_netdev_priv, connect.work);
u8 *requested_bss = priv->connect_requested_bss; 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); bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid);
u16 status = WLAN_STATUS_SUCCESS; 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; status = WLAN_STATUS_UNSPECIFIED_FAILURE;
else else
priv->is_connected = true; priv->is_connected = true;

View File

@@ -112,6 +112,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev,
for (i = 0; i < socket_count; i++) { for (i = 0; i < socket_count; i++) {
sockets[i].card_state = 1; /* 1 = present but empty */ sockets[i].card_state = 1; /* 1 = present but empty */
sockets[i].io_base = pci_resource_start(dev, 0); sockets[i].io_base = pci_resource_start(dev, 0);
sockets[i].dev = dev;
sockets[i].socket.features |= SS_CAP_PCCARD; sockets[i].socket.features |= SS_CAP_PCCARD;
sockets[i].socket.map_size = 0x1000; sockets[i].socket.map_size = 0x1000;
sockets[i].socket.irq_mask = 0; sockets[i].socket.irq_mask = 0;

View File

@@ -221,7 +221,7 @@ static unsigned int sr_get_events(struct scsi_device *sdev)
else if (med->media_event_code == 2) else if (med->media_event_code == 2)
return DISK_EVENT_MEDIA_CHANGE; return DISK_EVENT_MEDIA_CHANGE;
else if (med->media_event_code == 3) else if (med->media_event_code == 3)
return DISK_EVENT_EJECT_REQUEST; return DISK_EVENT_MEDIA_CHANGE;
return 0; return 0;
} }

View File

@@ -690,8 +690,8 @@ static int ixp4xx_npe_probe(struct platform_device *pdev)
if (!(ixp4xx_read_feature_bits() & if (!(ixp4xx_read_feature_bits() &
(IXP4XX_FEATURE_RESET_NPEA << i))) { (IXP4XX_FEATURE_RESET_NPEA << i))) {
dev_info(dev, "NPE%d at 0x%08x-0x%08x not available\n", dev_info(dev, "NPE%d at %pR not available\n",
i, res->start, res->end); i, res);
continue; /* NPE already disabled or not present */ continue; /* NPE already disabled or not present */
} }
npe->regs = devm_ioremap_resource(dev, res); 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); return PTR_ERR(npe->regs);
if (npe_reset(npe)) { if (npe_reset(npe)) {
dev_info(dev, "NPE%d at 0x%08x-0x%08x does not reset\n", dev_info(dev, "NPE%d at %pR does not reset\n",
i, res->start, res->end); i, res);
continue; continue;
} }
npe->valid = 1; npe->valid = 1;
dev_info(dev, "NPE%d at 0x%08x-0x%08x registered\n", dev_info(dev, "NPE%d at %pR registered\n", i, res);
i, res->start, res->end);
found++; found++;
} }

View File

@@ -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 */ /* ACK - it may clear any bits so don't rely on it */
__raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[0]); __raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[0]);
en_bitmap = qmgr_regs->irqen[0]; en_bitmap = __raw_readl(&qmgr_regs->irqen[0]);
while (en_bitmap) { while (en_bitmap) {
i = __fls(en_bitmap); /* number of the last "low" queue */ i = __fls(en_bitmap); /* number of the last "low" queue */
en_bitmap &= ~BIT(i); en_bitmap &= ~BIT(i);
src = qmgr_regs->irqsrc[i >> 3]; src = __raw_readl(&qmgr_regs->irqsrc[i >> 3]);
stat = qmgr_regs->stat1[i >> 3]; stat = __raw_readl(&qmgr_regs->stat1[i >> 3]);
if (src & 4) /* the IRQ condition is inverted */ if (src & 4) /* the IRQ condition is inverted */
stat = ~stat; stat = ~stat;
if (stat & BIT(src & 3)) { 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 */ /* ACK - it may clear any bits so don't rely on it */
__raw_writel(0xFFFFFFFF, &qmgr_regs->irqstat[1]); __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) { while (req_bitmap) {
i = __fls(req_bitmap); /* number of the last "high" queue */ i = __fls(req_bitmap); /* number of the last "high" queue */
req_bitmap &= ~BIT(i); req_bitmap &= ~BIT(i);

View File

@@ -505,8 +505,10 @@ static int mx51_ecspi_prepare_message(struct spi_imx_data *spi_imx,
struct spi_message *msg) struct spi_message *msg)
{ {
struct spi_device *spi = msg->spi; struct spi_device *spi = msg->spi;
struct spi_transfer *xfer;
u32 ctrl = MX51_ECSPI_CTRL_ENABLE; 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); u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG);
/* set Master or Slave mode */ /* 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); 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; return 0;
} }
@@ -574,7 +605,7 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
struct spi_device *spi) struct spi_device *spi)
{ {
u32 ctrl = readl(spi_imx->base + MX51_ECSPI_CTRL); u32 ctrl = readl(spi_imx->base + MX51_ECSPI_CTRL);
u32 clk, delay; u32 clk;
/* Clear BL field and set the right value */ /* Clear BL field and set the right value */
ctrl &= ~MX51_ECSPI_CTRL_BL_MASK; 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); 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; return 0;
} }

View File

@@ -785,6 +785,8 @@ static int meson_spicc_remove(struct platform_device *pdev)
clk_disable_unprepare(spicc->core); clk_disable_unprepare(spicc->core);
clk_disable_unprepare(spicc->pclk); clk_disable_unprepare(spicc->pclk);
spi_master_put(spicc->master);
return 0; return 0;
} }

View File

@@ -29,21 +29,31 @@
#define FWBUFF_ALIGN_SZ 512 #define FWBUFF_ALIGN_SZ 512
#define MAX_DUMP_FWSZ (48 * 1024) #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) static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context)
{ {
struct _adapter *adapter = context; struct _adapter *adapter = context;
if (!firmware) { if (!firmware) {
struct usb_device *udev = adapter->dvobjpriv.pusbdev; rtl871x_load_fw_fail(adapter);
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);
return; return;
} }
adapter->fw = firmware; adapter->fw = firmware;

View File

@@ -1820,3 +1820,11 @@ void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction)
break; 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);
}

View File

@@ -112,6 +112,7 @@ struct led_priv {
void r8712_InitSwLeds(struct _adapter *padapter); void r8712_InitSwLeds(struct _adapter *padapter);
void r8712_DeInitSwLeds(struct _adapter *padapter); void r8712_DeInitSwLeds(struct _adapter *padapter);
void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction); void LedControl871x(struct _adapter *padapter, enum LED_CTL_MODE LedAction);
void r8712_flush_led_works(struct _adapter *padapter);
#endif #endif

View File

@@ -224,3 +224,11 @@ void r8712_unregister_cmd_alive(struct _adapter *padapter)
} }
mutex_unlock(&pwrctrl->mutex_lock); 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);
}

View File

@@ -111,5 +111,6 @@ void r8712_cpwm_int_hdl(struct _adapter *padapter,
void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode, void r8712_set_ps_mode(struct _adapter *padapter, uint ps_mode,
uint smart_ps); uint smart_ps);
void r8712_set_rpwm(struct _adapter *padapter, u8 val8); void r8712_set_rpwm(struct _adapter *padapter, u8 val8);
void r8712_flush_rwctrl_works(struct _adapter *padapter);
#endif /* __RTL871X_PWRCTRL_H_ */ #endif /* __RTL871X_PWRCTRL_H_ */

View File

@@ -594,22 +594,18 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf)
{ {
struct net_device *pnetdev = usb_get_intfdata(pusb_intf); struct net_device *pnetdev = usb_get_intfdata(pusb_intf);
struct usb_device *udev = interface_to_usbdev(pusb_intf); struct usb_device *udev = interface_to_usbdev(pusb_intf);
if (pnetdev) {
struct _adapter *padapter = netdev_priv(pnetdev); struct _adapter *padapter = netdev_priv(pnetdev);
/* never exit with a firmware callback pending */ /* never exit with a firmware callback pending */
wait_for_completion(&padapter->rtl8712_fw_ready); wait_for_completion(&padapter->rtl8712_fw_ready);
pnetdev = usb_get_intfdata(pusb_intf);
usb_set_intfdata(pusb_intf, NULL); usb_set_intfdata(pusb_intf, NULL);
if (!pnetdev)
goto firmware_load_fail;
release_firmware(padapter->fw); release_firmware(padapter->fw);
if (drvpriv.drv_registered) if (drvpriv.drv_registered)
padapter->surprise_removed = true; padapter->surprise_removed = true;
if (pnetdev->reg_state != NETREG_UNINITIALIZED) if (pnetdev->reg_state != NETREG_UNINITIALIZED)
unregister_netdev(pnetdev); /* will call netdev_close() */ unregister_netdev(pnetdev); /* will call netdev_close() */
flush_scheduled_work(); r8712_flush_rwctrl_works(padapter);
r8712_flush_led_works(padapter);
udelay(1); udelay(1);
/* Stop driver mlme relation timer */ /* Stop driver mlme relation timer */
r8712_stop_drv_timers(padapter); r8712_stop_drv_timers(padapter);
@@ -621,8 +617,7 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf)
* when disconnect * when disconnect
*/ */
usb_put_dev(udev); usb_put_dev(udev);
}
firmware_load_fail:
/* If we didn't unplug usb dongle and remove/insert module, driver /* If we didn't unplug usb dongle and remove/insert module, driver
* fails on sitesurvey for the first time when device is up. * fails on sitesurvey for the first time when device is up.
* Reset usb port for sitesurvey fail issue. * Reset usb port for sitesurvey fail issue.

View File

@@ -989,6 +989,8 @@ void sd_int_dpc(struct adapter *adapter)
} else { } else {
rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt); rtw_c2h_wk_cmd(adapter, (u8 *)c2h_evt);
} }
} else {
kfree(c2h_evt);
} }
} else { } else {
/* Error handling for malloc fail */ /* Error handling for malloc fail */

View File

@@ -413,11 +413,13 @@ void optee_enable_shm_cache(struct optee *optee)
} }
/** /**
* optee_disable_shm_cache() - Disables caching of some shared memory allocation * __optee_disable_shm_cache() - Disables caching of some shared memory
* in OP-TEE * allocation in OP-TEE
* @optee: main service struct * @optee: main service struct
* @is_mapped: true if the cached shared memory addresses were mapped by this
* kernel, are safe to dereference, and should be freed
*/ */
void optee_disable_shm_cache(struct optee *optee) static void __optee_disable_shm_cache(struct optee *optee, bool is_mapped)
{ {
struct optee_call_waiter w; struct optee_call_waiter w;
@@ -436,6 +438,13 @@ void optee_disable_shm_cache(struct optee *optee)
if (res.result.status == OPTEE_SMC_RETURN_OK) { if (res.result.status == OPTEE_SMC_RETURN_OK) {
struct tee_shm *shm; struct tee_shm *shm;
/*
* Shared memory references that were not mapped by
* this kernel must be ignored to prevent a crash.
*/
if (!is_mapped)
continue;
shm = reg_pair_to_ptr(res.result.shm_upper32, shm = reg_pair_to_ptr(res.result.shm_upper32,
res.result.shm_lower32); res.result.shm_lower32);
tee_shm_free(shm); tee_shm_free(shm);
@@ -446,6 +455,27 @@ void optee_disable_shm_cache(struct optee *optee)
optee_cq_wait_final(&optee->call_queue, &w); optee_cq_wait_final(&optee->call_queue, &w);
} }
/**
* optee_disable_shm_cache() - Disables caching of mapped shared memory
* allocations in OP-TEE
* @optee: main service struct
*/
void optee_disable_shm_cache(struct optee *optee)
{
return __optee_disable_shm_cache(optee, true);
}
/**
* optee_disable_unmapped_shm_cache() - Disables caching of shared memory
* allocations in OP-TEE which are not
* currently mapped
* @optee: main service struct
*/
void optee_disable_unmapped_shm_cache(struct optee *optee)
{
return __optee_disable_shm_cache(optee, false);
}
#define PAGELIST_ENTRIES_PER_PAGE \ #define PAGELIST_ENTRIES_PER_PAGE \
((OPTEE_MSG_NONCONTIG_PAGE_SIZE / sizeof(u64)) - 1) ((OPTEE_MSG_NONCONTIG_PAGE_SIZE / sizeof(u64)) - 1)

View File

@@ -6,6 +6,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/arm-smccc.h> #include <linux/arm-smccc.h>
#include <linux/crash_dump.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/module.h> #include <linux/module.h>
@@ -572,6 +573,13 @@ static optee_invoke_fn *get_invoke_func(struct device *dev)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
/* optee_remove - Device Removal Routine
* @pdev: platform device information struct
*
* optee_remove is called by platform subsystem to alert the driver
* that it should release the device
*/
static int optee_remove(struct platform_device *pdev) static int optee_remove(struct platform_device *pdev)
{ {
struct optee *optee = platform_get_drvdata(pdev); struct optee *optee = platform_get_drvdata(pdev);
@@ -602,6 +610,18 @@ static int optee_remove(struct platform_device *pdev)
return 0; return 0;
} }
/* optee_shutdown - Device Removal Routine
* @pdev: platform device information struct
*
* platform_shutdown is called by the platform subsystem to alert
* the driver that a shutdown, reboot, or kexec is happening and
* device must be disabled.
*/
static void optee_shutdown(struct platform_device *pdev)
{
optee_disable_shm_cache(platform_get_drvdata(pdev));
}
static int optee_probe(struct platform_device *pdev) static int optee_probe(struct platform_device *pdev)
{ {
optee_invoke_fn *invoke_fn; optee_invoke_fn *invoke_fn;
@@ -612,6 +632,16 @@ static int optee_probe(struct platform_device *pdev)
u32 sec_caps; u32 sec_caps;
int rc; int rc;
/*
* The kernel may have crashed at the same time that all available
* secure world threads were suspended and we cannot reschedule the
* suspended threads without access to the crashed kernel's wait_queue.
* Therefore, we cannot reliably initialize the OP-TEE driver in the
* kdump kernel.
*/
if (is_kdump_kernel())
return -ENODEV;
invoke_fn = get_invoke_func(&pdev->dev); invoke_fn = get_invoke_func(&pdev->dev);
if (IS_ERR(invoke_fn)) if (IS_ERR(invoke_fn))
return PTR_ERR(invoke_fn); return PTR_ERR(invoke_fn);
@@ -686,6 +716,15 @@ static int optee_probe(struct platform_device *pdev)
optee->memremaped_shm = memremaped_shm; optee->memremaped_shm = memremaped_shm;
optee->pool = pool; optee->pool = pool;
/*
* Ensure that there are no pre-existing shm objects before enabling
* the shm cache so that there's no chance of receiving an invalid
* address during shutdown. This could occur, for example, if we're
* kexec booting from an older kernel that did not properly cleanup the
* shm cache.
*/
optee_disable_unmapped_shm_cache(optee);
optee_enable_shm_cache(optee); optee_enable_shm_cache(optee);
if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM)
@@ -728,6 +767,7 @@ MODULE_DEVICE_TABLE(of, optee_dt_match);
static struct platform_driver optee_driver = { static struct platform_driver optee_driver = {
.probe = optee_probe, .probe = optee_probe,
.remove = optee_remove, .remove = optee_remove,
.shutdown = optee_shutdown,
.driver = { .driver = {
.name = "optee", .name = "optee",
.of_match_table = optee_dt_match, .of_match_table = optee_dt_match,

View File

@@ -159,6 +159,7 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session);
void optee_enable_shm_cache(struct optee *optee); void optee_enable_shm_cache(struct optee *optee);
void optee_disable_shm_cache(struct optee *optee); void optee_disable_shm_cache(struct optee *optee);
void optee_disable_unmapped_shm_cache(struct optee *optee);
int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm,
struct page **pages, size_t num_pages, struct page **pages, size_t num_pages,

View File

@@ -32,8 +32,10 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm,
struct page **pages; struct page **pages;
pages = kcalloc(nr_pages, sizeof(pages), GFP_KERNEL); pages = kcalloc(nr_pages, sizeof(pages), GFP_KERNEL);
if (!pages) if (!pages) {
return -ENOMEM; rc = -ENOMEM;
goto err;
}
for (i = 0; i < nr_pages; i++) { for (i = 0; i < nr_pages; i++) {
pages[i] = page; pages[i] = page;
@@ -44,8 +46,14 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm,
rc = optee_shm_register(shm->ctx, shm, pages, nr_pages, rc = optee_shm_register(shm->ctx, shm, pages, nr_pages,
(unsigned long)shm->kaddr); (unsigned long)shm->kaddr);
kfree(pages); kfree(pages);
if (rc)
goto err;
} }
return 0;
err:
__free_pages(page, order);
return rc; return rc;
} }

View File

@@ -193,6 +193,24 @@ err_dev_put:
} }
EXPORT_SYMBOL_GPL(tee_shm_alloc); EXPORT_SYMBOL_GPL(tee_shm_alloc);
/**
* tee_shm_alloc_kernel_buf() - Allocate shared memory for kernel buffer
* @ctx: Context that allocates the shared memory
* @size: Requested size of shared memory
*
* The returned memory registered in secure world and is suitable to be
* passed as a memory buffer in parameter argument to
* tee_client_invoke_func(). The memory allocated is later freed with a
* call to tee_shm_free().
*
* @returns a pointer to 'struct tee_shm'
*/
struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t size)
{
return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF);
}
EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf);
struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr, struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr,
size_t length, u32 flags) size_t length, u32 flags)
{ {

View File

@@ -93,10 +93,13 @@ static void mtk8250_dma_rx_complete(void *param)
struct dma_tx_state state; struct dma_tx_state state;
int copied, total, cnt; int copied, total, cnt;
unsigned char *ptr; unsigned char *ptr;
unsigned long flags;
if (data->rx_status == DMA_RX_SHUTDOWN) if (data->rx_status == DMA_RX_SHUTDOWN)
return; return;
spin_lock_irqsave(&up->port.lock, flags);
dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state); dmaengine_tx_status(dma->rxchan, dma->rx_cookie, &state);
total = dma->rx_size - state.residue; total = dma->rx_size - state.residue;
cnt = total; cnt = total;
@@ -120,6 +123,8 @@ static void mtk8250_dma_rx_complete(void *param)
tty_flip_buffer_push(tty_port); tty_flip_buffer_push(tty_port);
mtk8250_rx_dma(up); mtk8250_rx_dma(up);
spin_unlock_irqrestore(&up->port.lock, flags);
} }
static void mtk8250_rx_dma(struct uart_8250_port *up) static void mtk8250_rx_dma(struct uart_8250_port *up)

View File

@@ -3804,6 +3804,12 @@ static const struct pci_device_id blacklist[] = {
{ PCI_VDEVICE(INTEL, 0x0f0c), }, { PCI_VDEVICE(INTEL, 0x0f0c), },
{ PCI_VDEVICE(INTEL, 0x228a), }, { PCI_VDEVICE(INTEL, 0x228a), },
{ PCI_VDEVICE(INTEL, 0x228c), }, { PCI_VDEVICE(INTEL, 0x228c), },
{ PCI_VDEVICE(INTEL, 0x4b96), },
{ PCI_VDEVICE(INTEL, 0x4b97), },
{ PCI_VDEVICE(INTEL, 0x4b98), },
{ PCI_VDEVICE(INTEL, 0x4b99), },
{ PCI_VDEVICE(INTEL, 0x4b9a), },
{ PCI_VDEVICE(INTEL, 0x4b9b), },
{ PCI_VDEVICE(INTEL, 0x9ce3), }, { PCI_VDEVICE(INTEL, 0x9ce3), },
{ PCI_VDEVICE(INTEL, 0x9ce4), }, { PCI_VDEVICE(INTEL, 0x9ce4), },
@@ -3964,6 +3970,7 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
if (pci_match_id(pci_use_msi, dev)) { if (pci_match_id(pci_use_msi, dev)) {
dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n"); dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n");
pci_set_master(dev); pci_set_master(dev);
uart.port.flags &= ~UPF_SHARE_IRQ;
rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES);
} else { } else {
dev_dbg(&dev->dev, "Using legacy interrupts\n"); dev_dbg(&dev->dev, "Using legacy interrupts\n");

View File

@@ -311,7 +311,11 @@ static const struct serial8250_config uart_config[] = {
/* Uart divisor latch read */ /* Uart divisor latch read */
static int default_serial_dl_read(struct uart_8250_port *up) static int default_serial_dl_read(struct uart_8250_port *up)
{ {
return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8; /* Assign these in pieces to truncate any bits above 7. */
unsigned char dll = serial_in(up, UART_DLL);
unsigned char dlm = serial_in(up, UART_DLM);
return dll | dlm << 8;
} }
/* Uart divisor latch write */ /* Uart divisor latch write */
@@ -1297,9 +1301,11 @@ static void autoconfig(struct uart_8250_port *up)
serial_out(up, UART_LCR, 0); serial_out(up, UART_LCR, 0);
serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO); serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
scratch = serial_in(up, UART_IIR) >> 6;
switch (scratch) { /* Assign this as it is to truncate any bits above 7. */
scratch = serial_in(up, UART_IIR);
switch (scratch >> 6) {
case 0: case 0:
autoconfig_8250(up); autoconfig_8250(up);
break; break;

View File

@@ -1040,9 +1040,11 @@ static int tegra_uart_hw_init(struct tegra_uart_port *tup)
if (tup->cdata->fifo_mode_enable_status) { if (tup->cdata->fifo_mode_enable_status) {
ret = tegra_uart_wait_fifo_mode_enabled(tup); ret = tegra_uart_wait_fifo_mode_enabled(tup);
dev_err(tup->uport.dev, "FIFO mode not enabled\n"); if (ret < 0) {
if (ret < 0) dev_err(tup->uport.dev,
"Failed to enable FIFO mode: %d\n", ret);
return ret; return ret;
}
} else { } else {
/* /*
* For all tegra devices (up to t210), there is a hardware * For all tegra devices (up to t210), there is a hardware

View File

@@ -731,6 +731,7 @@ static int cdns3_gadget_ep0_queue(struct usb_ep *ep,
request->actual = 0; request->actual = 0;
priv_dev->status_completion_no_call = true; priv_dev->status_completion_no_call = true;
priv_dev->pending_status_request = request; priv_dev->pending_status_request = request;
usb_gadget_set_state(&priv_dev->gadget, USB_STATE_CONFIGURED);
spin_unlock_irqrestore(&priv_dev->lock, flags); spin_unlock_irqrestore(&priv_dev->lock, flags);
/* /*

View File

@@ -2283,17 +2283,10 @@ static void usbtmc_interrupt(struct urb *urb)
dev_err(dev, "overflow with length %d, actual length is %d\n", dev_err(dev, "overflow with length %d, actual length is %d\n",
data->iin_wMaxPacketSize, urb->actual_length); data->iin_wMaxPacketSize, urb->actual_length);
fallthrough; fallthrough;
case -ECONNRESET: default:
case -ENOENT:
case -ESHUTDOWN:
case -EILSEQ:
case -ETIME:
case -EPIPE:
/* urb terminated, clean up */ /* urb terminated, clean up */
dev_dbg(dev, "urb terminated, status: %d\n", status); dev_dbg(dev, "urb terminated, status: %d\n", status);
return; return;
default:
dev_err(dev, "unknown status received: %d\n", status);
} }
exit: exit:
rv = usb_submit_urb(urb, GFP_ATOMIC); rv = usb_submit_urb(urb, GFP_ATOMIC);

View File

@@ -193,7 +193,11 @@ static void otg_start_hnp_polling(struct otg_fsm *fsm)
if (!fsm->host_req_flag) if (!fsm->host_req_flag)
return; return;
if (!fsm->hnp_work_inited) {
INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work); INIT_DELAYED_WORK(&fsm->hnp_polling_work, otg_hnp_polling_work);
fsm->hnp_work_inited = true;
}
schedule_delayed_work(&fsm->hnp_polling_work, schedule_delayed_work(&fsm->hnp_polling_work,
msecs_to_jiffies(T_HOST_REQ_POLL)); msecs_to_jiffies(T_HOST_REQ_POLL));
} }

View File

@@ -41,6 +41,7 @@ struct f_hidg {
unsigned char bInterfaceSubClass; unsigned char bInterfaceSubClass;
unsigned char bInterfaceProtocol; unsigned char bInterfaceProtocol;
unsigned char protocol; unsigned char protocol;
unsigned char idle;
unsigned short report_desc_length; unsigned short report_desc_length;
char *report_desc; char *report_desc;
unsigned short report_length; unsigned short report_length;
@@ -338,6 +339,11 @@ static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
spin_lock_irqsave(&hidg->write_spinlock, flags); spin_lock_irqsave(&hidg->write_spinlock, flags);
if (!hidg->req) {
spin_unlock_irqrestore(&hidg->write_spinlock, flags);
return -ESHUTDOWN;
}
#define WRITE_COND (!hidg->write_pending) #define WRITE_COND (!hidg->write_pending)
try_again: try_again:
/* write queue */ /* write queue */
@@ -358,8 +364,14 @@ try_again:
count = min_t(unsigned, count, hidg->report_length); count = min_t(unsigned, count, hidg->report_length);
spin_unlock_irqrestore(&hidg->write_spinlock, flags); spin_unlock_irqrestore(&hidg->write_spinlock, flags);
status = copy_from_user(req->buf, buffer, count);
if (!req) {
ERROR(hidg->func.config->cdev, "hidg->req is NULL\n");
status = -ESHUTDOWN;
goto release_write_pending;
}
status = copy_from_user(req->buf, buffer, count);
if (status != 0) { if (status != 0) {
ERROR(hidg->func.config->cdev, ERROR(hidg->func.config->cdev,
"copy_from_user error\n"); "copy_from_user error\n");
@@ -387,15 +399,18 @@ try_again:
spin_unlock_irqrestore(&hidg->write_spinlock, flags); spin_unlock_irqrestore(&hidg->write_spinlock, flags);
status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC); if (!hidg->in_ep->enabled) {
if (status < 0) { ERROR(hidg->func.config->cdev, "in_ep is disabled\n");
ERROR(hidg->func.config->cdev, status = -ESHUTDOWN;
"usb_ep_queue error on int endpoint %zd\n", status);
goto release_write_pending; goto release_write_pending;
} else {
status = count;
} }
status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC);
if (status < 0)
goto release_write_pending;
else
status = count;
return status; return status;
release_write_pending: release_write_pending:
spin_lock_irqsave(&hidg->write_spinlock, flags); spin_lock_irqsave(&hidg->write_spinlock, flags);
@@ -523,6 +538,14 @@ static int hidg_setup(struct usb_function *f,
goto respond; goto respond;
break; break;
case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
| HID_REQ_GET_IDLE):
VDBG(cdev, "get_idle\n");
length = min_t(unsigned int, length, 1);
((u8 *) req->buf)[0] = hidg->idle;
goto respond;
break;
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
| HID_REQ_SET_REPORT): | HID_REQ_SET_REPORT):
VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength); VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength);
@@ -546,6 +569,14 @@ static int hidg_setup(struct usb_function *f,
goto stall; goto stall;
break; break;
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
| HID_REQ_SET_IDLE):
VDBG(cdev, "set_idle\n");
length = 0;
hidg->idle = value >> 8;
goto respond;
break;
case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8 case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8
| USB_REQ_GET_DESCRIPTOR): | USB_REQ_GET_DESCRIPTOR):
switch (value >> 8) { switch (value >> 8) {
@@ -773,6 +804,7 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass; hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass;
hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol; hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol;
hidg->protocol = HID_REPORT_PROTOCOL; hidg->protocol = HID_REPORT_PROTOCOL;
hidg->idle = 1;
hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length); hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
hidg_ss_in_comp_desc.wBytesPerInterval = hidg_ss_in_comp_desc.wBytesPerInterval =
cpu_to_le16(hidg->report_length); cpu_to_le16(hidg->report_length);

View File

@@ -1260,12 +1260,14 @@ static int max3420_probe(struct spi_device *spi)
err = devm_request_irq(&spi->dev, irq, max3420_irq_handler, 0, err = devm_request_irq(&spi->dev, irq, max3420_irq_handler, 0,
"max3420", udc); "max3420", udc);
if (err < 0) if (err < 0)
return err; goto del_gadget;
udc->thread_task = kthread_create(max3420_thread, udc, udc->thread_task = kthread_create(max3420_thread, udc,
"max3420-thread"); "max3420-thread");
if (IS_ERR(udc->thread_task)) if (IS_ERR(udc->thread_task)) {
return PTR_ERR(udc->thread_task); err = PTR_ERR(udc->thread_task);
goto del_gadget;
}
irq = of_irq_get_byname(spi->dev.of_node, "vbus"); irq = of_irq_get_byname(spi->dev.of_node, "vbus");
if (irq <= 0) { /* no vbus irq implies self-powered design */ if (irq <= 0) { /* no vbus irq implies self-powered design */
@@ -1285,10 +1287,14 @@ static int max3420_probe(struct spi_device *spi)
err = devm_request_irq(&spi->dev, irq, err = devm_request_irq(&spi->dev, irq,
max3420_vbus_handler, 0, "vbus", udc); max3420_vbus_handler, 0, "vbus", udc);
if (err < 0) if (err < 0)
return err; goto del_gadget;
} }
return 0; return 0;
del_gadget:
usb_del_gadget_udc(&udc->gadget);
return err;
} }
static int max3420_remove(struct spi_device *spi) static int max3420_remove(struct spi_device *spi)

View File

@@ -606,8 +606,6 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
enable_irq_wake(hcd->irq); enable_irq_wake(hcd->irq);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
ret = ohci_suspend(hcd, ohci_at91->wakeup); ret = ohci_suspend(hcd, ohci_at91->wakeup);
if (ret) { if (ret) {
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
@@ -627,7 +625,10 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
/* flush the writes */ /* flush the writes */
(void) ohci_readl (ohci, &ohci->regs->control); (void) ohci_readl (ohci, &ohci->regs->control);
msleep(1); msleep(1);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
at91_stop_clock(ohci_at91); at91_stop_clock(ohci_at91);
} else {
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
} }
return ret; return ret;
@@ -639,6 +640,8 @@ ohci_hcd_at91_drv_resume(struct device *dev)
struct usb_hcd *hcd = dev_get_drvdata(dev); struct usb_hcd *hcd = dev_get_drvdata(dev);
struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd); struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 0);
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
disable_irq_wake(hcd->irq); disable_irq_wake(hcd->irq);
else else
@@ -646,8 +649,6 @@ ohci_hcd_at91_drv_resume(struct device *dev)
ohci_resume(hcd, false); ohci_resume(hcd, false);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 0);
return 0; return 0;
} }

View File

@@ -853,6 +853,7 @@ static struct usb_serial_driver ch341_device = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "ch341-uart", .name = "ch341-uart",
}, },
.bulk_in_size = 512,
.id_table = id_table, .id_table = id_table,
.num_ports = 1, .num_ports = 1,
.open = ch341_open, .open = ch341_open,

View File

@@ -219,6 +219,7 @@ static const struct usb_device_id id_table_combined[] = {
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) },
{ USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) }, { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_AUTO_M3_OP_COM_V2_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) },
{ USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },

View File

@@ -159,6 +159,9 @@
/* Vardaan Enterprises Serial Interface VEUSB422R3 */ /* Vardaan Enterprises Serial Interface VEUSB422R3 */
#define FTDI_VARDAAN_PID 0xF070 #define FTDI_VARDAAN_PID 0xF070
/* Auto-M3 Ltd. - OP-COM USB V2 - OBD interface Adapter */
#define FTDI_AUTO_M3_OP_COM_V2_PID 0x4f50
/* /*
* Xsens Technologies BV products (http://www.xsens.com). * Xsens Technologies BV products (http://www.xsens.com).
*/ */

View File

@@ -1203,6 +1203,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = NCTRL(2) | RSVD(3) }, .driver_info = NCTRL(2) | RSVD(3) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */ { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */
.driver_info = NCTRL(0) | RSVD(1) }, .driver_info = NCTRL(0) | RSVD(1) },
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */
.driver_info = NCTRL(2) | RSVD(3) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),

View File

@@ -3466,7 +3466,8 @@ static int smb3_simple_fallocate_write_range(unsigned int xid,
char *buf) char *buf)
{ {
struct cifs_io_parms io_parms = {0}; struct cifs_io_parms io_parms = {0};
int rc, nbytes; int nbytes;
int rc = 0;
struct kvec iov[2]; struct kvec iov[2];
io_parms.netfid = cfile->fid.netfid; io_parms.netfid = cfile->fid.netfid;

Some files were not shown because too many files have changed in this diff Show More