Merge 4.19.268 into android-4.19-stable

Changes in 4.19.268
	wifi: mac80211_hwsim: fix debugfs attribute ps with rc table support
	audit: fix undefined behavior in bit shift for AUDIT_BIT
	wifi: mac80211: Fix ack frame idr leak when mesh has no route
	spi: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run
	drm: panel-orientation-quirks: Add quirk for Acer Switch V 10 (SW5-017)
	RISC-V: vdso: Do not add missing symbols to version section in linker script
	MIPS: pic32: treat port as signed integer
	af_key: Fix send_acquire race with pfkey_register
	ARM: dts: am335x-pcm-953: Define fixed regulators in root node
	ASoC: sgtl5000: Reset the CHIP_CLK_CTRL reg on remove
	bus: sunxi-rsb: Support atomic transfers
	ARM: dts: at91: sam9g20ek: enable udc vbus gpio pinctrl
	nfc/nci: fix race with opening and closing
	net: pch_gbe: fix potential memleak in pch_gbe_tx_queue()
	9p/fd: fix issue of list_del corruption in p9_fd_cancel()
	ARM: mxs: fix memory leak in mxs_machine_init()
	net/mlx4: Check retval of mlx4_bitmap_init
	net/qla3xxx: fix potential memleak in ql3xxx_send()
	net: pch_gbe: fix pci device refcount leak while module exiting
	Drivers: hv: vmbus: fix double free in the error path of vmbus_add_channel_work()
	Drivers: hv: vmbus: fix possible memory leak in vmbus_device_register()
	net/mlx5: Fix FW tracer timestamp calculation
	tipc: set con sock in tipc_conn_alloc
	tipc: add an extra conn_get in tipc_conn_alloc
	tipc: check skb_linearize() return value in tipc_disc_rcv()
	xfrm: Fix ignored return value in xfrm6_init()
	NFC: nci: fix memory leak in nci_rx_data_packet()
	bnx2x: fix pci device refcount leak in bnx2x_vf_is_pcie_pending()
	dccp/tcp: Reset saddr on failure after inet6?_hash_connect().
	s390/dasd: fix no record found for raw_track_access
	nfc: st-nci: fix incorrect validating logic in EVT_TRANSACTION
	nfc: st-nci: fix memory leaks in EVT_TRANSACTION
	net: thunderx: Fix the ACPI memory leak
	s390/crashdump: fix TOD programmable field size
	arm64: dts: rockchip: lower rk3399-puma-haikou SD controller clock frequency
	iio: light: apds9960: fix wrong register for gesture gain
	iio: core: Fix entry not deleted when iio_register_sw_trigger_type() fails
	nios2: add FORCE for vmlinuz.gz
	iio: ms5611: Simplify IO callback parameters
	iio: pressure: ms5611: fixed value compensation bug
	ceph: do not update snapshot context when there is no new snapshot
	ceph: avoid putting the realm twice when decoding snaps fails
	nilfs2: fix nilfs_sufile_mark_dirty() not set segment usage as dirty
	Input: synaptics - switch touchpad on HP Laptop 15-da3001TU to RMI mode
	serial: 8250: 8250_omap: Avoid RS485 RTS glitch on ->set_termios()
	xen/platform-pci: add missing free_irq() in error path
	platform/x86: asus-wmi: add missing pci_dev_put() in asus_wmi_set_xusb2pr()
	platform/x86: acer-wmi: Enable SW_TABLET_MODE on Switch V 10 (SW5-017)
	platform/x86: hp-wmi: Ignore Smart Experience App event
	tcp: configurable source port perturb table size
	net: usb: qmi_wwan: add Telit 0x103a composition
	dm integrity: flush the journal on suspend
	btrfs: free btrfs_path before copying root refs to userspace
	btrfs: free btrfs_path before copying fspath to userspace
	btrfs: free btrfs_path before copying subvol info to userspace
	drm/amd/dc/dce120: Fix audio register mapping, stop triggering KASAN
	drm/amdgpu: always register an MMU notifier for userptr
	btrfs: free btrfs_path before copying inodes to userspace
	spi: spi-imx: Fix spi_bus_clk if requested clock is higher than input clock
	proc: avoid integer type confusion in get_proc_long
	proc: proc_skip_spaces() shouldn't think it is working on C strings
	v4l2: don't fall back to follow_pfn() if pin_user_pages_fast() fails
	Revert "x86/speculation: Change FILL_RETURN_BUFFER to work with objtool"
	iio: health: afe4403: Fix oob read in afe4403_read_raw
	iio: health: afe4404: Fix oob read in afe4404_[read|write]_raw
	iio: light: rpr0521: add missing Kconfig dependencies
	scripts/faddr2line: Fix regression in name resolution on ppc64le
	hwmon: (i5500_temp) fix missing pci_disable_device()
	hwmon: (ibmpex) Fix possible UAF when ibmpex_register_bmc() fails
	of: property: decrement node refcount in of_fwnode_get_reference_args()
	net/mlx5: Fix uninitialized variable bug in outlen_write()
	can: sja1000_isa: sja1000_isa_probe(): add missing free_sja1000dev()
	can: cc770: cc770_isa_probe(): add missing free_cc770dev()
	qlcnic: fix sleep-in-atomic-context bugs caused by msleep
	net: phy: fix null-ptr-deref while probe() failed
	net: net_netdev: Fix error handling in ntb_netdev_init_module()
	net/9p: Fix a potential socket leak in p9_socket_open
	dsa: lan9303: Correct stat name
	net: hsr: Fix potential use-after-free
	net: tun: Fix use-after-free in tun_detach()
	packet: do not set TP_STATUS_CSUM_VALID on CHECKSUM_COMPLETE
	net: ethernet: renesas: ravb: Fix promiscuous mode after system resumed
	hwmon: (coretemp) Check for null before removing sysfs attrs
	hwmon: (coretemp) fix pci device refcount leak in nv1a_ram_new()
	btrfs: qgroup: fix sleep from invalid context bug in btrfs_qgroup_inherit()
	error-injection: Add prompt for function error injection
	tools/vm/slabinfo-gnuplot: use "grep -E" instead of "egrep"
	nilfs2: fix NULL pointer dereference in nilfs_palloc_commit_free_entry()
	x86/bugs: Make sure MSR_SPEC_CTRL is updated properly upon resume from S3
	pinctrl: intel: Save and restore pins in "direct IRQ" mode
	arm64: Fix panic() when Spectre-v2 causes Spectre-BHB to re-allocate KVM vectors
	arm64: errata: Fix KVM Spectre-v2 mitigation selection for Cortex-A57/A72
	mm: Fix '.data.once' orphan section warning
	ASoC: ops: Fix bounds check for _sx controls
	pinctrl: single: Fix potential division by zero
	iommu/vt-d: Fix PCI device refcount leak in dmar_dev_scope_init()
	parisc: Increase size of gcc stack frame check
	xtensa: increase size of gcc stack frame check
	parisc: Increase FRAME_WARN to 2048 bytes on parisc
	Kconfig.debug: provide a little extra FRAME_WARN leeway when KASAN is enabled
	tcp/udp: Fix memory leak in ipv6_renew_options().
	nvme: restrict management ioctls to admin
	x86/tsx: Add a feature bit for TSX control MSR support
	x86/pm: Add enumeration check before spec MSRs save/restore setup
	Bluetooth: L2CAP: Fix accepting connection request for invalid SPSM
	x86/ioremap: Fix page aligned size calculation in __ioremap_caller()
	mmc: sdhci: use FIELD_GET for preset value bit masks
	mmc: sdhci: Fix voltage switch delay
	ipc/sem: Fix dangling sem_array access in semtimedop race
	Linux 4.19.268

Change-Id: Ifb1a44994650c56c8be98fa5eaff557699c0999e
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2022-12-08 16:32:00 +00:00
106 changed files with 620 additions and 342 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 4 VERSION = 4
PATCHLEVEL = 19 PATCHLEVEL = 19
SUBLEVEL = 267 SUBLEVEL = 268
EXTRAVERSION = EXTRAVERSION =
NAME = "People's Front" NAME = "People's Front"

View File

@@ -15,8 +15,7 @@
compatible = "phytec,am335x-pcm-953", "phytec,am335x-phycore-som", "ti,am33xx"; compatible = "phytec,am335x-pcm-953", "phytec,am335x-phycore-som", "ti,am33xx";
/* Power */ /* Power */
regulators { vcc3v3: fixedregulator1 {
vcc3v3: fixedregulator@1 {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "vcc3v3"; regulator-name = "vcc3v3";
regulator-min-microvolt = <3300000>; regulator-min-microvolt = <3300000>;
@@ -24,14 +23,13 @@
regulator-boot-on; regulator-boot-on;
}; };
vcc1v8: fixedregulator@2 { vcc1v8: fixedregulator2 {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "vcc1v8"; regulator-name = "vcc1v8";
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>; regulator-max-microvolt = <1800000>;
regulator-boot-on; regulator-boot-on;
}; };
};
/* User IO */ /* User IO */
user_leds: user_leds { user_leds: user_leds {

View File

@@ -39,6 +39,13 @@
}; };
usb1 {
pinctrl_usb1_vbus_gpio: usb1_vbus_gpio {
atmel,pins =
<AT91_PIOC 5 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>; /* PC5 GPIO */
};
};
mmc0_slot1 { mmc0_slot1 {
pinctrl_board_mmc0_slot1: mmc0_slot1-board { pinctrl_board_mmc0_slot1: mmc0_slot1-board {
atmel,pins = atmel,pins =
@@ -84,6 +91,8 @@
}; };
usb1: gadget@fffa4000 { usb1: gadget@fffa4000 {
pinctrl-0 = <&pinctrl_usb1_vbus_gpio>;
pinctrl-names = "default";
atmel,vbus-gpio = <&pioC 5 GPIO_ACTIVE_HIGH>; atmel,vbus-gpio = <&pioC 5 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };

View File

@@ -393,8 +393,10 @@ static void __init mxs_machine_init(void)
root = of_find_node_by_path("/"); root = of_find_node_by_path("/");
ret = of_property_read_string(root, "model", &soc_dev_attr->machine); ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
if (ret) if (ret) {
kfree(soc_dev_attr);
return; return;
}
soc_dev_attr->family = "Freescale MXS Family"; soc_dev_attr->family = "Freescale MXS Family";
soc_dev_attr->soc_id = mxs_get_soc_id(); soc_dev_attr->soc_id = mxs_get_soc_id();

View File

@@ -203,7 +203,7 @@
cap-sd-highspeed; cap-sd-highspeed;
cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
disable-wp; disable-wp;
max-frequency = <150000000>; max-frequency = <40000000>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
vmmc-supply = <&vcc3v3_baseboard>; vmmc-supply = <&vcc3v3_baseboard>;

View File

@@ -142,9 +142,12 @@ static void install_bp_hardening_cb(bp_hardening_cb_t fn,
__copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end); __copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end);
} }
if (fn != __this_cpu_read(bp_hardening_data.fn)) {
__this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot); __this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
__this_cpu_write(bp_hardening_data.fn, fn); __this_cpu_write(bp_hardening_data.fn, fn);
__this_cpu_write(bp_hardening_data.template_start, hyp_vecs_start); __this_cpu_write(bp_hardening_data.template_start,
hyp_vecs_start);
}
spin_unlock(&bp_lock); spin_unlock(&bp_lock);
} }
#else #else
@@ -1203,8 +1206,11 @@ static void kvm_setup_bhb_slot(const char *hyp_vecs_start)
__copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end); __copy_hyp_vect_bpi(slot, hyp_vecs_start, hyp_vecs_end);
} }
if (hyp_vecs_start != __this_cpu_read(bp_hardening_data.template_start)) {
__this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot); __this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
__this_cpu_write(bp_hardening_data.template_start, hyp_vecs_start); __this_cpu_write(bp_hardening_data.template_start,
hyp_vecs_start);
}
spin_unlock(&bp_lock); spin_unlock(&bp_lock);
} }
#else #else
@@ -1240,6 +1246,12 @@ void spectre_bhb_enable_mitigation(const struct arm64_cpu_capabilities *entry)
} else if (spectre_bhb_loop_affected(SCOPE_LOCAL_CPU)) { } else if (spectre_bhb_loop_affected(SCOPE_LOCAL_CPU)) {
switch (spectre_bhb_loop_affected(SCOPE_SYSTEM)) { switch (spectre_bhb_loop_affected(SCOPE_SYSTEM)) {
case 8: case 8:
/*
* A57/A72-r0 will already have selected the
* spectre-indirect vector, which is sufficient
* for BHB too.
*/
if (!__this_cpu_read(bp_hardening_data.fn))
kvm_setup_bhb_slot(__spectre_bhb_loop_k8_start); kvm_setup_bhb_slot(__spectre_bhb_loop_k8_start);
break; break;
case 24: case 24:

View File

@@ -26,6 +26,6 @@ extern char *fw_getcmdline(void);
extern void fw_meminit(void); extern void fw_meminit(void);
extern char *fw_getenv(char *name); extern char *fw_getenv(char *name);
extern unsigned long fw_getenvl(char *name); extern unsigned long fw_getenvl(char *name);
extern void fw_init_early_console(char port); extern void fw_init_early_console(void);
#endif /* __ASM_FW_H_ */ #endif /* __ASM_FW_H_ */

View File

@@ -35,7 +35,7 @@
#define U_BRG(x) (UART_BASE(x) + 0x40) #define U_BRG(x) (UART_BASE(x) + 0x40)
static void __iomem *uart_base; static void __iomem *uart_base;
static char console_port = -1; static int console_port = -1;
static int __init configure_uart_pins(int port) static int __init configure_uart_pins(int port)
{ {
@@ -55,7 +55,7 @@ static int __init configure_uart_pins(int port)
return 0; return 0;
} }
static void __init configure_uart(char port, int baud) static void __init configure_uart(int port, int baud)
{ {
u32 pbclk; u32 pbclk;
@@ -68,7 +68,7 @@ static void __init configure_uart(char port, int baud)
uart_base + PIC32_SET(U_STA(port))); uart_base + PIC32_SET(U_STA(port)));
} }
static void __init setup_early_console(char port, int baud) static void __init setup_early_console(int port, int baud)
{ {
if (configure_uart_pins(port)) if (configure_uart_pins(port))
return; return;
@@ -138,15 +138,14 @@ static int __init get_baud_from_cmdline(char *arch_cmdline)
return baud; return baud;
} }
void __init fw_init_early_console(char port) void __init fw_init_early_console(void)
{ {
char *arch_cmdline = pic32_getcmdline(); char *arch_cmdline = pic32_getcmdline();
int baud = -1; int baud, port;
uart_base = ioremap_nocache(PIC32_BASE_UART, 0xc00); uart_base = ioremap_nocache(PIC32_BASE_UART, 0xc00);
baud = get_baud_from_cmdline(arch_cmdline); baud = get_baud_from_cmdline(arch_cmdline);
if (port == -1)
port = get_port_from_cmdline(arch_cmdline); port = get_port_from_cmdline(arch_cmdline);
if (port == -1) if (port == -1)

View File

@@ -68,7 +68,7 @@ void __init plat_mem_setup(void)
strlcpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE); strlcpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE);
#ifdef CONFIG_EARLY_PRINTK #ifdef CONFIG_EARLY_PRINTK
fw_init_early_console(-1); fw_init_early_console();
#endif #endif
pic32_config_init(); pic32_config_init();
} }

View File

@@ -20,7 +20,7 @@ $(obj)/vmlinux.bin: vmlinux FORCE
$(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
$(call if_changed,gzip) $(call if_changed,gzip)
$(obj)/vmImage: $(obj)/vmlinux.gz $(obj)/vmImage: $(obj)/vmlinux.gz FORCE
$(call if_changed,uimage) $(call if_changed,uimage)
@$(kecho) 'Kernel: $@ is ready' @$(kecho) 'Kernel: $@ is ready'

View File

@@ -17,6 +17,9 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso))
obj-y += vdso.o vdso-syms.o obj-y += vdso.o vdso-syms.o
CPPFLAGS_vdso.lds += -P -C -U$(ARCH) CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
ifneq ($(filter vgettimeofday, $(vdso-syms)),)
CPPFLAGS_vdso.lds += -DHAS_VGETTIMEOFDAY
endif
# Disable gcov profiling for VDSO code # Disable gcov profiling for VDSO code
GCOV_PROFILE := n GCOV_PROFILE := n

View File

@@ -70,9 +70,11 @@ VERSION
LINUX_4.15 { LINUX_4.15 {
global: global:
__vdso_rt_sigreturn; __vdso_rt_sigreturn;
#ifdef HAS_VGETTIMEOFDAY
__vdso_gettimeofday; __vdso_gettimeofday;
__vdso_clock_gettime; __vdso_clock_gettime;
__vdso_clock_getres; __vdso_clock_getres;
#endif
__vdso_getcpu; __vdso_getcpu;
__vdso_flush_icache; __vdso_flush_icache;
local: *; local: *;

View File

@@ -45,7 +45,7 @@ struct save_area {
u64 fprs[16]; u64 fprs[16];
u32 fpc; u32 fpc;
u32 prefix; u32 prefix;
u64 todpreg; u32 todpreg;
u64 timer; u64 timer;
u64 todcmp; u64 todcmp;
u64 vxrs_low[16]; u64 vxrs_low[16];

View File

@@ -292,6 +292,7 @@
#define X86_FEATURE_RETPOLINE (11*32+12) /* "" Generic Retpoline mitigation for Spectre variant 2 */ #define X86_FEATURE_RETPOLINE (11*32+12) /* "" Generic Retpoline mitigation for Spectre variant 2 */
#define X86_FEATURE_RETPOLINE_LFENCE (11*32+13) /* "" Use LFENCE for Spectre variant 2 */ #define X86_FEATURE_RETPOLINE_LFENCE (11*32+13) /* "" Use LFENCE for Spectre variant 2 */
#define X86_FEATURE_RSB_VMEXIT_LITE (11*32+17) /* "" Fill RSB on VM exit when EIBRS is enabled */ #define X86_FEATURE_RSB_VMEXIT_LITE (11*32+17) /* "" Fill RSB on VM exit when EIBRS is enabled */
#define X86_FEATURE_MSR_TSX_CTRL (11*32+18) /* "" MSR IA32_TSX_CTRL (Intel) implemented */
/* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */ /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */
#define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */ #define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */

View File

@@ -4,13 +4,11 @@
#define _ASM_X86_NOSPEC_BRANCH_H_ #define _ASM_X86_NOSPEC_BRANCH_H_
#include <linux/static_key.h> #include <linux/static_key.h>
#include <linux/frame.h>
#include <asm/alternative.h> #include <asm/alternative.h>
#include <asm/alternative-asm.h> #include <asm/alternative-asm.h>
#include <asm/cpufeatures.h> #include <asm/cpufeatures.h>
#include <asm/msr-index.h> #include <asm/msr-index.h>
#include <asm/unwind_hints.h>
#include <asm/percpu.h> #include <asm/percpu.h>
/* /*
@@ -54,9 +52,9 @@
lfence; \ lfence; \
jmp 775b; \ jmp 775b; \
774: \ 774: \
add $(BITS_PER_LONG/8) * 2, sp; \
dec reg; \ dec reg; \
jnz 771b; \ jnz 771b; \
add $(BITS_PER_LONG/8) * nr, sp; \
/* barrier for jnz misprediction */ \ /* barrier for jnz misprediction */ \
lfence; lfence;
#else #else
@@ -167,8 +165,10 @@
* monstrosity above, manually. * monstrosity above, manually.
*/ */
.macro FILL_RETURN_BUFFER reg:req nr:req ftr:req .macro FILL_RETURN_BUFFER reg:req nr:req ftr:req
ALTERNATIVE "jmp .Lskip_rsb_\@", "", \ftr ANNOTATE_NOSPEC_ALTERNATIVE
__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP) ALTERNATIVE "jmp .Lskip_rsb_\@", \
__stringify(__FILL_RETURN_BUFFER(\reg,\nr,%_ASM_SP)) \
\ftr
.Lskip_rsb_\@: .Lskip_rsb_\@:
.endm .endm
@@ -317,7 +317,7 @@ static inline void indirect_branch_prediction_barrier(void)
/* The Intel SPEC CTRL MSR base value cache */ /* The Intel SPEC CTRL MSR base value cache */
extern u64 x86_spec_ctrl_base; extern u64 x86_spec_ctrl_base;
DECLARE_PER_CPU(u64, x86_spec_ctrl_current); DECLARE_PER_CPU(u64, x86_spec_ctrl_current);
extern void write_spec_ctrl_current(u64 val, bool force); extern void update_spec_ctrl_cond(u64 val);
extern u64 spec_ctrl_current(void); extern u64 spec_ctrl_current(void);
/* /*

View File

@@ -58,11 +58,18 @@ EXPORT_SYMBOL_GPL(x86_spec_ctrl_current);
static DEFINE_MUTEX(spec_ctrl_mutex); static DEFINE_MUTEX(spec_ctrl_mutex);
/* Update SPEC_CTRL MSR and its cached copy unconditionally */
static void update_spec_ctrl(u64 val)
{
this_cpu_write(x86_spec_ctrl_current, val);
wrmsrl(MSR_IA32_SPEC_CTRL, val);
}
/* /*
* Keep track of the SPEC_CTRL MSR value for the current task, which may differ * Keep track of the SPEC_CTRL MSR value for the current task, which may differ
* from x86_spec_ctrl_base due to STIBP/SSB in __speculation_ctrl_update(). * from x86_spec_ctrl_base due to STIBP/SSB in __speculation_ctrl_update().
*/ */
void write_spec_ctrl_current(u64 val, bool force) void update_spec_ctrl_cond(u64 val)
{ {
if (this_cpu_read(x86_spec_ctrl_current) == val) if (this_cpu_read(x86_spec_ctrl_current) == val)
return; return;
@@ -73,7 +80,7 @@ void write_spec_ctrl_current(u64 val, bool force)
* When KERNEL_IBRS this MSR is written on return-to-user, unless * When KERNEL_IBRS this MSR is written on return-to-user, unless
* forced the update can be delayed until that time. * forced the update can be delayed until that time.
*/ */
if (force || !cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS)) if (!cpu_feature_enabled(X86_FEATURE_KERNEL_IBRS))
wrmsrl(MSR_IA32_SPEC_CTRL, val); wrmsrl(MSR_IA32_SPEC_CTRL, val);
} }
@@ -1194,7 +1201,7 @@ static void __init spec_ctrl_disable_kernel_rrsba(void)
if (ia32_cap & ARCH_CAP_RRSBA) { if (ia32_cap & ARCH_CAP_RRSBA) {
x86_spec_ctrl_base |= SPEC_CTRL_RRSBA_DIS_S; x86_spec_ctrl_base |= SPEC_CTRL_RRSBA_DIS_S;
write_spec_ctrl_current(x86_spec_ctrl_base, true); update_spec_ctrl(x86_spec_ctrl_base);
} }
} }
@@ -1316,7 +1323,7 @@ static void __init spectre_v2_select_mitigation(void)
if (spectre_v2_in_ibrs_mode(mode)) { if (spectre_v2_in_ibrs_mode(mode)) {
x86_spec_ctrl_base |= SPEC_CTRL_IBRS; x86_spec_ctrl_base |= SPEC_CTRL_IBRS;
write_spec_ctrl_current(x86_spec_ctrl_base, true); update_spec_ctrl(x86_spec_ctrl_base);
} }
switch (mode) { switch (mode) {
@@ -1420,7 +1427,7 @@ static void __init spectre_v2_select_mitigation(void)
static void update_stibp_msr(void * __unused) static void update_stibp_msr(void * __unused)
{ {
u64 val = spec_ctrl_current() | (x86_spec_ctrl_base & SPEC_CTRL_STIBP); u64 val = spec_ctrl_current() | (x86_spec_ctrl_base & SPEC_CTRL_STIBP);
write_spec_ctrl_current(val, true); update_spec_ctrl(val);
} }
/* Update x86_spec_ctrl_base in case SMT state changed. */ /* Update x86_spec_ctrl_base in case SMT state changed. */
@@ -1653,7 +1660,7 @@ static enum ssb_mitigation __init __ssb_select_mitigation(void)
x86_amd_ssb_disable(); x86_amd_ssb_disable();
} else { } else {
x86_spec_ctrl_base |= SPEC_CTRL_SSBD; x86_spec_ctrl_base |= SPEC_CTRL_SSBD;
write_spec_ctrl_current(x86_spec_ctrl_base, true); update_spec_ctrl(x86_spec_ctrl_base);
} }
} }
@@ -1858,7 +1865,7 @@ int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which)
void x86_spec_ctrl_setup_ap(void) void x86_spec_ctrl_setup_ap(void)
{ {
if (boot_cpu_has(X86_FEATURE_MSR_SPEC_CTRL)) if (boot_cpu_has(X86_FEATURE_MSR_SPEC_CTRL))
write_spec_ctrl_current(x86_spec_ctrl_base, true); update_spec_ctrl(x86_spec_ctrl_base);
if (ssb_mode == SPEC_STORE_BYPASS_DISABLE) if (ssb_mode == SPEC_STORE_BYPASS_DISABLE)
x86_amd_ssb_disable(); x86_amd_ssb_disable();

View File

@@ -55,24 +55,6 @@ void tsx_enable(void)
wrmsrl(MSR_IA32_TSX_CTRL, tsx); wrmsrl(MSR_IA32_TSX_CTRL, tsx);
} }
static bool __init tsx_ctrl_is_supported(void)
{
u64 ia32_cap = x86_read_arch_cap_msr();
/*
* TSX is controlled via MSR_IA32_TSX_CTRL. However, support for this
* MSR is enumerated by ARCH_CAP_TSX_MSR bit in MSR_IA32_ARCH_CAPABILITIES.
*
* TSX control (aka MSR_IA32_TSX_CTRL) is only available after a
* microcode update on CPUs that have their MSR_IA32_ARCH_CAPABILITIES
* bit MDS_NO=1. CPUs with MDS_NO=0 are not planned to get
* MSR_IA32_TSX_CTRL support even after a microcode update. Thus,
* tsx= cmdline requests will do nothing on CPUs without
* MSR_IA32_TSX_CTRL support.
*/
return !!(ia32_cap & ARCH_CAP_TSX_CTRL_MSR);
}
static enum tsx_ctrl_states x86_get_tsx_auto_mode(void) static enum tsx_ctrl_states x86_get_tsx_auto_mode(void)
{ {
if (boot_cpu_has_bug(X86_BUG_TAA)) if (boot_cpu_has_bug(X86_BUG_TAA))
@@ -86,9 +68,22 @@ void __init tsx_init(void)
char arg[5] = {}; char arg[5] = {};
int ret; int ret;
if (!tsx_ctrl_is_supported()) /*
* TSX is controlled via MSR_IA32_TSX_CTRL. However, support for this
* MSR is enumerated by ARCH_CAP_TSX_MSR bit in MSR_IA32_ARCH_CAPABILITIES.
*
* TSX control (aka MSR_IA32_TSX_CTRL) is only available after a
* microcode update on CPUs that have their MSR_IA32_ARCH_CAPABILITIES
* bit MDS_NO=1. CPUs with MDS_NO=0 are not planned to get
* MSR_IA32_TSX_CTRL support even after a microcode update. Thus,
* tsx= cmdline requests will do nothing on CPUs without
* MSR_IA32_TSX_CTRL support.
*/
if (!(x86_read_arch_cap_msr() & ARCH_CAP_TSX_CTRL_MSR))
return; return;
setup_force_cpu_cap(X86_FEATURE_MSR_TSX_CTRL);
ret = cmdline_find_option(boot_command_line, "tsx", arg, sizeof(arg)); ret = cmdline_find_option(boot_command_line, "tsx", arg, sizeof(arg));
if (ret >= 0) { if (ret >= 0) {
if (!strcmp(arg, "on")) { if (!strcmp(arg, "on")) {

View File

@@ -434,7 +434,7 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp,
} }
if (updmsr) if (updmsr)
write_spec_ctrl_current(msr, false); update_spec_ctrl_cond(msr);
} }
static unsigned long speculation_ctrl_update_tif(struct task_struct *tsk) static unsigned long speculation_ctrl_update_tif(struct task_struct *tsk)

View File

@@ -171,9 +171,15 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
* Mappings have to be page-aligned * Mappings have to be page-aligned
*/ */
offset = phys_addr & ~PAGE_MASK; offset = phys_addr & ~PAGE_MASK;
phys_addr &= PHYSICAL_PAGE_MASK; phys_addr &= PAGE_MASK;
size = PAGE_ALIGN(last_addr+1) - phys_addr; size = PAGE_ALIGN(last_addr+1) - phys_addr;
/*
* Mask out any bits not part of the actual physical
* address, like memory encryption bits.
*/
phys_addr &= PHYSICAL_PAGE_MASK;
retval = reserve_memtype(phys_addr, (u64)phys_addr + size, retval = reserve_memtype(phys_addr, (u64)phys_addr + size,
pcm, &new_pcm); pcm, &new_pcm);
if (retval) { if (retval) {

View File

@@ -527,16 +527,23 @@ static int pm_cpu_check(const struct x86_cpu_id *c)
static void pm_save_spec_msr(void) static void pm_save_spec_msr(void)
{ {
u32 spec_msr_id[] = { struct msr_enumeration {
MSR_IA32_SPEC_CTRL, u32 msr_no;
MSR_IA32_TSX_CTRL, u32 feature;
MSR_TSX_FORCE_ABORT, } msr_enum[] = {
MSR_IA32_MCU_OPT_CTRL, { MSR_IA32_SPEC_CTRL, X86_FEATURE_MSR_SPEC_CTRL },
MSR_AMD64_LS_CFG, { MSR_IA32_TSX_CTRL, X86_FEATURE_MSR_TSX_CTRL },
MSR_AMD64_DE_CFG, { MSR_TSX_FORCE_ABORT, X86_FEATURE_TSX_FORCE_ABORT },
{ MSR_IA32_MCU_OPT_CTRL, X86_FEATURE_SRBDS_CTRL },
{ MSR_AMD64_LS_CFG, X86_FEATURE_LS_CFG_SSBD },
{ MSR_AMD64_DE_CFG, X86_FEATURE_LFENCE_RDTSC },
}; };
int i;
msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id)); for (i = 0; i < ARRAY_SIZE(msr_enum); i++) {
if (boot_cpu_has(msr_enum[i].feature))
msr_build_context(&msr_enum[i].msr_no, 1);
}
} }
static int pm_check_save_msr(void) static int pm_check_save_msr(void)

View File

@@ -268,6 +268,9 @@ EXPORT_SYMBOL_GPL(sunxi_rsb_driver_register);
/* common code that starts a transfer */ /* common code that starts a transfer */
static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb) static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
{ {
u32 int_mask, status;
bool timeout;
if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) { if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
dev_dbg(rsb->dev, "RSB transfer still in progress\n"); dev_dbg(rsb->dev, "RSB transfer still in progress\n");
return -EBUSY; return -EBUSY;
@@ -275,13 +278,23 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
reinit_completion(&rsb->complete); reinit_completion(&rsb->complete);
writel(RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER, int_mask = RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER;
rsb->regs + RSB_INTE); writel(int_mask, rsb->regs + RSB_INTE);
writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB, writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB,
rsb->regs + RSB_CTRL); rsb->regs + RSB_CTRL);
if (!wait_for_completion_io_timeout(&rsb->complete, if (irqs_disabled()) {
msecs_to_jiffies(100))) { timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
status, (status & int_mask),
10, 100000);
writel(status, rsb->regs + RSB_INTS);
} else {
timeout = !wait_for_completion_io_timeout(&rsb->complete,
msecs_to_jiffies(100));
status = rsb->status;
}
if (timeout) {
dev_dbg(rsb->dev, "RSB timeout\n"); dev_dbg(rsb->dev, "RSB timeout\n");
/* abort the transfer */ /* abort the transfer */
@@ -293,18 +306,18 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
if (rsb->status & RSB_INTS_LOAD_BSY) { if (status & RSB_INTS_LOAD_BSY) {
dev_dbg(rsb->dev, "RSB busy\n"); dev_dbg(rsb->dev, "RSB busy\n");
return -EBUSY; return -EBUSY;
} }
if (rsb->status & RSB_INTS_TRANS_ERR) { if (status & RSB_INTS_TRANS_ERR) {
if (rsb->status & RSB_INTS_TRANS_ERR_ACK) { if (status & RSB_INTS_TRANS_ERR_ACK) {
dev_dbg(rsb->dev, "RSB slave nack\n"); dev_dbg(rsb->dev, "RSB slave nack\n");
return -EINVAL; return -EINVAL;
} }
if (rsb->status & RSB_INTS_TRANS_ERR_DATA) { if (status & RSB_INTS_TRANS_ERR_DATA) {
dev_dbg(rsb->dev, "RSB transfer data error\n"); dev_dbg(rsb->dev, "RSB transfer data error\n");
return -EIO; return -EIO;
} }

View File

@@ -330,11 +330,9 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
if (r) if (r)
goto release_object; goto release_object;
if (args->flags & AMDGPU_GEM_USERPTR_REGISTER) {
r = amdgpu_mn_register(bo, args->addr); r = amdgpu_mn_register(bo, args->addr);
if (r) if (r)
goto release_object; goto release_object;
}
if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) { if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
r = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm, r = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm,

View File

@@ -324,7 +324,8 @@ static const struct dce_audio_registers audio_regs[] = {
audio_regs(2), audio_regs(2),
audio_regs(3), audio_regs(3),
audio_regs(4), audio_regs(4),
audio_regs(5) audio_regs(5),
audio_regs(6),
}; };
#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\ #define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\

View File

@@ -95,6 +95,12 @@ static const struct dmi_system_id orientation_data[] = {
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"), DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"),
}, },
.driver_data = (void *)&lcd800x1280_rightside_up, .driver_data = (void *)&lcd800x1280_rightside_up,
}, { /* Acer Switch V 10 (SW5-017) */
.matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
},
.driver_data = (void *)&lcd800x1280_rightside_up,
}, { /* Anbernic Win600 */ }, { /* Anbernic Win600 */
.matches = { .matches = {
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Anbernic"), DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Anbernic"),

View File

@@ -508,13 +508,17 @@ static void vmbus_add_channel_work(struct work_struct *work)
* Add the new device to the bus. This will kick off device-driver * Add the new device to the bus. This will kick off device-driver
* binding which eventually invokes the device driver's AddDevice() * binding which eventually invokes the device driver's AddDevice()
* method. * method.
*
* If vmbus_device_register() fails, the 'device_obj' is freed in
* vmbus_device_release() as called by device_unregister() in the
* error path of vmbus_device_register(). In the outside error
* path, there's no need to free it.
*/ */
ret = vmbus_device_register(newchannel->device_obj); ret = vmbus_device_register(newchannel->device_obj);
if (ret != 0) { if (ret != 0) {
pr_err("unable to add child device object (relid %d)\n", pr_err("unable to add child device object (relid %d)\n",
newchannel->offermsg.child_relid); newchannel->offermsg.child_relid);
kfree(newchannel->device_obj);
goto err_deq_chan; goto err_deq_chan;
} }

View File

@@ -1634,6 +1634,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
ret = device_register(&child_device_obj->device); ret = device_register(&child_device_obj->device);
if (ret) { if (ret) {
pr_err("Unable to register child device\n"); pr_err("Unable to register child device\n");
put_device(&child_device_obj->device);
return ret; return ret;
} }

View File

@@ -255,10 +255,13 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
*/ */
if (host_bridge && host_bridge->vendor == PCI_VENDOR_ID_INTEL) { if (host_bridge && host_bridge->vendor == PCI_VENDOR_ID_INTEL) {
for (i = 0; i < ARRAY_SIZE(tjmax_pci_table); i++) { for (i = 0; i < ARRAY_SIZE(tjmax_pci_table); i++) {
if (host_bridge->device == tjmax_pci_table[i].device) if (host_bridge->device == tjmax_pci_table[i].device) {
pci_dev_put(host_bridge);
return tjmax_pci_table[i].tjmax; return tjmax_pci_table[i].tjmax;
} }
} }
}
pci_dev_put(host_bridge);
for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) { for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) {
if (strstr(c->x86_model_id, tjmax_table[i].id)) if (strstr(c->x86_model_id, tjmax_table[i].id))
@@ -546,6 +549,10 @@ static void coretemp_remove_core(struct platform_data *pdata, int indx)
{ {
struct temp_data *tdata = pdata->core_data[indx]; struct temp_data *tdata = pdata->core_data[indx];
/* if we errored on add then this is already gone */
if (!tdata)
return;
/* Remove the sysfs attributes */ /* Remove the sysfs attributes */
sysfs_remove_group(&pdata->hwmon_dev->kobj, &tdata->attr_group); sysfs_remove_group(&pdata->hwmon_dev->kobj, &tdata->attr_group);

View File

@@ -117,7 +117,7 @@ static int i5500_temp_probe(struct pci_dev *pdev,
u32 tstimer; u32 tstimer;
s8 tsfsc; s8 tsfsc;
err = pci_enable_device(pdev); err = pcim_enable_device(pdev);
if (err) { if (err) {
dev_err(&pdev->dev, "Failed to enable device\n"); dev_err(&pdev->dev, "Failed to enable device\n");
return err; return err;

View File

@@ -517,6 +517,7 @@ static void ibmpex_register_bmc(int iface, struct device *dev)
return; return;
out_register: out_register:
list_del(&data->list);
hwmon_device_unregister(data->hwmon_dev); hwmon_device_unregister(data->hwmon_dev);
out_user: out_user:
ipmi_destroy_user(data->user); ipmi_destroy_user(data->user);

View File

@@ -253,14 +253,14 @@ static int afe4403_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask) int *val, int *val2, long mask)
{ {
struct afe4403_data *afe = iio_priv(indio_dev); struct afe4403_data *afe = iio_priv(indio_dev);
unsigned int reg = afe4403_channel_values[chan->address]; unsigned int reg, field;
unsigned int field = afe4403_channel_leds[chan->address];
int ret; int ret;
switch (chan->type) { switch (chan->type) {
case IIO_INTENSITY: case IIO_INTENSITY:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
reg = afe4403_channel_values[chan->address];
ret = afe4403_read(afe, reg, val); ret = afe4403_read(afe, reg, val);
if (ret) if (ret)
return ret; return ret;
@@ -270,6 +270,7 @@ static int afe4403_read_raw(struct iio_dev *indio_dev,
case IIO_CURRENT: case IIO_CURRENT:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
field = afe4403_channel_leds[chan->address];
ret = regmap_field_read(afe->fields[field], val); ret = regmap_field_read(afe->fields[field], val);
if (ret) if (ret)
return ret; return ret;

View File

@@ -258,20 +258,20 @@ static int afe4404_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask) int *val, int *val2, long mask)
{ {
struct afe4404_data *afe = iio_priv(indio_dev); struct afe4404_data *afe = iio_priv(indio_dev);
unsigned int value_reg = afe4404_channel_values[chan->address]; unsigned int value_reg, led_field, offdac_field;
unsigned int led_field = afe4404_channel_leds[chan->address];
unsigned int offdac_field = afe4404_channel_offdacs[chan->address];
int ret; int ret;
switch (chan->type) { switch (chan->type) {
case IIO_INTENSITY: case IIO_INTENSITY:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
value_reg = afe4404_channel_values[chan->address];
ret = regmap_read(afe->regmap, value_reg, val); ret = regmap_read(afe->regmap, value_reg, val);
if (ret) if (ret)
return ret; return ret;
return IIO_VAL_INT; return IIO_VAL_INT;
case IIO_CHAN_INFO_OFFSET: case IIO_CHAN_INFO_OFFSET:
offdac_field = afe4404_channel_offdacs[chan->address];
ret = regmap_field_read(afe->fields[offdac_field], val); ret = regmap_field_read(afe->fields[offdac_field], val);
if (ret) if (ret)
return ret; return ret;
@@ -281,6 +281,7 @@ static int afe4404_read_raw(struct iio_dev *indio_dev,
case IIO_CURRENT: case IIO_CURRENT:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
led_field = afe4404_channel_leds[chan->address];
ret = regmap_field_read(afe->fields[led_field], val); ret = regmap_field_read(afe->fields[led_field], val);
if (ret) if (ret)
return ret; return ret;
@@ -303,19 +304,20 @@ static int afe4404_write_raw(struct iio_dev *indio_dev,
int val, int val2, long mask) int val, int val2, long mask)
{ {
struct afe4404_data *afe = iio_priv(indio_dev); struct afe4404_data *afe = iio_priv(indio_dev);
unsigned int led_field = afe4404_channel_leds[chan->address]; unsigned int led_field, offdac_field;
unsigned int offdac_field = afe4404_channel_offdacs[chan->address];
switch (chan->type) { switch (chan->type) {
case IIO_INTENSITY: case IIO_INTENSITY:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_OFFSET: case IIO_CHAN_INFO_OFFSET:
offdac_field = afe4404_channel_offdacs[chan->address];
return regmap_field_write(afe->fields[offdac_field], val); return regmap_field_write(afe->fields[offdac_field], val);
} }
break; break;
case IIO_CURRENT: case IIO_CURRENT:
switch (mask) { switch (mask) {
case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_RAW:
led_field = afe4404_channel_leds[chan->address];
return regmap_field_write(afe->fields[led_field], val); return regmap_field_write(afe->fields[led_field], val);
} }
break; break;

View File

@@ -61,8 +61,12 @@ int iio_register_sw_trigger_type(struct iio_sw_trigger_type *t)
t->group = configfs_register_default_group(iio_triggers_group, t->name, t->group = configfs_register_default_group(iio_triggers_group, t->name,
&iio_trigger_type_group_type); &iio_trigger_type_group_type);
if (IS_ERR(t->group)) if (IS_ERR(t->group)) {
mutex_lock(&iio_trigger_types_lock);
list_del(&t->list);
mutex_unlock(&iio_trigger_types_lock);
ret = PTR_ERR(t->group); ret = PTR_ERR(t->group);
}
return ret; return ret;
} }

View File

@@ -238,6 +238,8 @@ config RPR0521
tristate "ROHM RPR0521 ALS and proximity sensor driver" tristate "ROHM RPR0521 ALS and proximity sensor driver"
depends on I2C depends on I2C
select REGMAP_I2C select REGMAP_I2C
select IIO_BUFFER
select IIO_TRIGGERED_BUFFER
help help
Say Y here if you want to build support for ROHM's RPR0521 Say Y here if you want to build support for ROHM's RPR0521
ambient light and proximity sensor device. ambient light and proximity sensor device.

View File

@@ -55,9 +55,6 @@
#define APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT 2 #define APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT 2
#define APDS9960_REG_CONFIG_2 0x90 #define APDS9960_REG_CONFIG_2 0x90
#define APDS9960_REG_CONFIG_2_GGAIN_MASK 0x60
#define APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT 5
#define APDS9960_REG_ID 0x92 #define APDS9960_REG_ID 0x92
#define APDS9960_REG_STATUS 0x93 #define APDS9960_REG_STATUS 0x93
@@ -78,6 +75,9 @@
#define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT 6 #define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT 6
#define APDS9960_REG_GCONF_2 0xa3 #define APDS9960_REG_GCONF_2 0xa3
#define APDS9960_REG_GCONF_2_GGAIN_MASK 0x60
#define APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT 5
#define APDS9960_REG_GOFFSET_U 0xa4 #define APDS9960_REG_GOFFSET_U 0xa4
#define APDS9960_REG_GOFFSET_D 0xa5 #define APDS9960_REG_GOFFSET_D 0xa5
#define APDS9960_REG_GPULSE 0xa6 #define APDS9960_REG_GPULSE 0xa6
@@ -396,9 +396,9 @@ static int apds9960_set_pxs_gain(struct apds9960_data *data, int val)
} }
ret = regmap_update_bits(data->regmap, ret = regmap_update_bits(data->regmap,
APDS9960_REG_CONFIG_2, APDS9960_REG_GCONF_2,
APDS9960_REG_CONFIG_2_GGAIN_MASK, APDS9960_REG_GCONF_2_GGAIN_MASK,
idx << APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT); idx << APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT);
if (!ret) if (!ret)
data->pxs_gain = idx; data->pxs_gain = idx;
mutex_unlock(&data->lock); mutex_unlock(&data->lock);

View File

@@ -28,13 +28,6 @@ enum {
MS5607, MS5607,
}; };
struct ms5611_chip_info {
u16 prom[MS5611_PROM_WORDS_NB];
int (*temp_and_pressure_compensate)(struct ms5611_chip_info *chip_info,
s32 *temp, s32 *pressure);
};
/* /*
* OverSampling Rate descriptor. * OverSampling Rate descriptor.
* Warning: cmd MUST be kept aligned on a word boundary (see * Warning: cmd MUST be kept aligned on a word boundary (see
@@ -53,12 +46,15 @@ struct ms5611_state {
const struct ms5611_osr *pressure_osr; const struct ms5611_osr *pressure_osr;
const struct ms5611_osr *temp_osr; const struct ms5611_osr *temp_osr;
int (*reset)(struct device *dev); u16 prom[MS5611_PROM_WORDS_NB];
int (*read_prom_word)(struct device *dev, int index, u16 *word);
int (*read_adc_temp_and_pressure)(struct device *dev, int (*reset)(struct ms5611_state *st);
int (*read_prom_word)(struct ms5611_state *st, int index, u16 *word);
int (*read_adc_temp_and_pressure)(struct ms5611_state *st,
s32 *temp, s32 *pressure); s32 *temp, s32 *pressure);
struct ms5611_chip_info *chip_info; int (*compensate_temp_and_pressure)(struct ms5611_state *st, s32 *temp,
s32 *pressure);
struct regulator *vdd; struct regulator *vdd;
}; };

View File

@@ -88,8 +88,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
struct ms5611_state *st = iio_priv(indio_dev); struct ms5611_state *st = iio_priv(indio_dev);
for (i = 0; i < MS5611_PROM_WORDS_NB; i++) { for (i = 0; i < MS5611_PROM_WORDS_NB; i++) {
ret = st->read_prom_word(&indio_dev->dev, ret = st->read_prom_word(st, i, &st->prom[i]);
i, &st->chip_info->prom[i]);
if (ret < 0) { if (ret < 0) {
dev_err(&indio_dev->dev, dev_err(&indio_dev->dev,
"failed to read prom at %d\n", i); "failed to read prom at %d\n", i);
@@ -97,7 +96,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
} }
} }
if (!ms5611_prom_is_valid(st->chip_info->prom, MS5611_PROM_WORDS_NB)) { if (!ms5611_prom_is_valid(st->prom, MS5611_PROM_WORDS_NB)) {
dev_err(&indio_dev->dev, "PROM integrity check failed\n"); dev_err(&indio_dev->dev, "PROM integrity check failed\n");
return -ENODEV; return -ENODEV;
} }
@@ -111,28 +110,27 @@ static int ms5611_read_temp_and_pressure(struct iio_dev *indio_dev,
int ret; int ret;
struct ms5611_state *st = iio_priv(indio_dev); struct ms5611_state *st = iio_priv(indio_dev);
ret = st->read_adc_temp_and_pressure(&indio_dev->dev, temp, pressure); ret = st->read_adc_temp_and_pressure(st, temp, pressure);
if (ret < 0) { if (ret < 0) {
dev_err(&indio_dev->dev, dev_err(&indio_dev->dev,
"failed to read temperature and pressure\n"); "failed to read temperature and pressure\n");
return ret; return ret;
} }
return st->chip_info->temp_and_pressure_compensate(st->chip_info, return st->compensate_temp_and_pressure(st, temp, pressure);
temp, pressure);
} }
static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info, static int ms5611_temp_and_pressure_compensate(struct ms5611_state *st,
s32 *temp, s32 *pressure) s32 *temp, s32 *pressure)
{ {
s32 t = *temp, p = *pressure; s32 t = *temp, p = *pressure;
s64 off, sens, dt; s64 off, sens, dt;
dt = t - (chip_info->prom[5] << 8); dt = t - (st->prom[5] << 8);
off = ((s64)chip_info->prom[2] << 16) + ((chip_info->prom[4] * dt) >> 7); off = ((s64)st->prom[2] << 16) + ((st->prom[4] * dt) >> 7);
sens = ((s64)chip_info->prom[1] << 15) + ((chip_info->prom[3] * dt) >> 8); sens = ((s64)st->prom[1] << 15) + ((st->prom[3] * dt) >> 8);
t = 2000 + ((chip_info->prom[6] * dt) >> 23); t = 2000 + ((st->prom[6] * dt) >> 23);
if (t < 2000) { if (t < 2000) {
s64 off2, sens2, t2; s64 off2, sens2, t2;
@@ -158,17 +156,17 @@ static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_inf
return 0; return 0;
} }
static int ms5607_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info, static int ms5607_temp_and_pressure_compensate(struct ms5611_state *st,
s32 *temp, s32 *pressure) s32 *temp, s32 *pressure)
{ {
s32 t = *temp, p = *pressure; s32 t = *temp, p = *pressure;
s64 off, sens, dt; s64 off, sens, dt;
dt = t - (chip_info->prom[5] << 8); dt = t - (st->prom[5] << 8);
off = ((s64)chip_info->prom[2] << 17) + ((chip_info->prom[4] * dt) >> 6); off = ((s64)st->prom[2] << 17) + ((st->prom[4] * dt) >> 6);
sens = ((s64)chip_info->prom[1] << 16) + ((chip_info->prom[3] * dt) >> 7); sens = ((s64)st->prom[1] << 16) + ((st->prom[3] * dt) >> 7);
t = 2000 + ((chip_info->prom[6] * dt) >> 23); t = 2000 + ((st->prom[6] * dt) >> 23);
if (t < 2000) { if (t < 2000) {
s64 off2, sens2, t2, tmp; s64 off2, sens2, t2, tmp;
@@ -199,7 +197,7 @@ static int ms5611_reset(struct iio_dev *indio_dev)
int ret; int ret;
struct ms5611_state *st = iio_priv(indio_dev); struct ms5611_state *st = iio_priv(indio_dev);
ret = st->reset(&indio_dev->dev); ret = st->reset(st);
if (ret < 0) { if (ret < 0) {
dev_err(&indio_dev->dev, "failed to reset device\n"); dev_err(&indio_dev->dev, "failed to reset device\n");
return ret; return ret;
@@ -346,15 +344,6 @@ static int ms5611_write_raw(struct iio_dev *indio_dev,
static const unsigned long ms5611_scan_masks[] = {0x3, 0}; static const unsigned long ms5611_scan_masks[] = {0x3, 0};
static struct ms5611_chip_info chip_info_tbl[] = {
[MS5611] = {
.temp_and_pressure_compensate = ms5611_temp_and_pressure_compensate,
},
[MS5607] = {
.temp_and_pressure_compensate = ms5607_temp_and_pressure_compensate,
}
};
static const struct iio_chan_spec ms5611_channels[] = { static const struct iio_chan_spec ms5611_channels[] = {
{ {
.type = IIO_PRESSURE, .type = IIO_PRESSURE,
@@ -437,7 +426,20 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev,
struct ms5611_state *st = iio_priv(indio_dev); struct ms5611_state *st = iio_priv(indio_dev);
mutex_init(&st->lock); mutex_init(&st->lock);
st->chip_info = &chip_info_tbl[type];
switch (type) {
case MS5611:
st->compensate_temp_and_pressure =
ms5611_temp_and_pressure_compensate;
break;
case MS5607:
st->compensate_temp_and_pressure =
ms5607_temp_and_pressure_compensate;
break;
default:
return -EINVAL;
}
st->temp_osr = st->temp_osr =
&ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1]; &ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1];
st->pressure_osr = st->pressure_osr =

View File

@@ -21,17 +21,15 @@
#include "ms5611.h" #include "ms5611.h"
static int ms5611_i2c_reset(struct device *dev) static int ms5611_i2c_reset(struct ms5611_state *st)
{ {
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
return i2c_smbus_write_byte(st->client, MS5611_RESET); return i2c_smbus_write_byte(st->client, MS5611_RESET);
} }
static int ms5611_i2c_read_prom_word(struct device *dev, int index, u16 *word) static int ms5611_i2c_read_prom_word(struct ms5611_state *st, int index,
u16 *word)
{ {
int ret; int ret;
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
ret = i2c_smbus_read_word_swapped(st->client, ret = i2c_smbus_read_word_swapped(st->client,
MS5611_READ_PROM_WORD + (index << 1)); MS5611_READ_PROM_WORD + (index << 1));
@@ -58,11 +56,10 @@ static int ms5611_i2c_read_adc(struct ms5611_state *st, s32 *val)
return 0; return 0;
} }
static int ms5611_i2c_read_adc_temp_and_pressure(struct device *dev, static int ms5611_i2c_read_adc_temp_and_pressure(struct ms5611_state *st,
s32 *temp, s32 *pressure) s32 *temp, s32 *pressure)
{ {
int ret; int ret;
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
const struct ms5611_osr *osr = st->temp_osr; const struct ms5611_osr *osr = st->temp_osr;
ret = i2c_smbus_write_byte(st->client, osr->cmd); ret = i2c_smbus_write_byte(st->client, osr->cmd);

View File

@@ -16,18 +16,17 @@
#include "ms5611.h" #include "ms5611.h"
static int ms5611_spi_reset(struct device *dev) static int ms5611_spi_reset(struct ms5611_state *st)
{ {
u8 cmd = MS5611_RESET; u8 cmd = MS5611_RESET;
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
return spi_write_then_read(st->client, &cmd, 1, NULL, 0); return spi_write_then_read(st->client, &cmd, 1, NULL, 0);
} }
static int ms5611_spi_read_prom_word(struct device *dev, int index, u16 *word) static int ms5611_spi_read_prom_word(struct ms5611_state *st, int index,
u16 *word)
{ {
int ret; int ret;
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
ret = spi_w8r16be(st->client, MS5611_READ_PROM_WORD + (index << 1)); ret = spi_w8r16be(st->client, MS5611_READ_PROM_WORD + (index << 1));
if (ret < 0) if (ret < 0)
@@ -38,11 +37,10 @@ static int ms5611_spi_read_prom_word(struct device *dev, int index, u16 *word)
return 0; return 0;
} }
static int ms5611_spi_read_adc(struct device *dev, s32 *val) static int ms5611_spi_read_adc(struct ms5611_state *st, s32 *val)
{ {
int ret; int ret;
u8 buf[3] = { MS5611_READ_ADC }; u8 buf[3] = { MS5611_READ_ADC };
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
ret = spi_write_then_read(st->client, buf, 1, buf, 3); ret = spi_write_then_read(st->client, buf, 1, buf, 3);
if (ret < 0) if (ret < 0)
@@ -53,11 +51,10 @@ static int ms5611_spi_read_adc(struct device *dev, s32 *val)
return 0; return 0;
} }
static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev, static int ms5611_spi_read_adc_temp_and_pressure(struct ms5611_state *st,
s32 *temp, s32 *pressure) s32 *temp, s32 *pressure)
{ {
int ret; int ret;
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
const struct ms5611_osr *osr = st->temp_osr; const struct ms5611_osr *osr = st->temp_osr;
/* /*
@@ -69,7 +66,7 @@ static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev,
return ret; return ret;
usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL)); usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL));
ret = ms5611_spi_read_adc(dev, temp); ret = ms5611_spi_read_adc(st, temp);
if (ret < 0) if (ret < 0)
return ret; return ret;
@@ -79,7 +76,7 @@ static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev,
return ret; return ret;
usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL)); usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL));
return ms5611_spi_read_adc(dev, pressure); return ms5611_spi_read_adc(st, pressure);
} }
static int ms5611_spi_probe(struct spi_device *spi) static int ms5611_spi_probe(struct spi_device *spi)

View File

@@ -192,6 +192,7 @@ static const char * const smbus_pnp_ids[] = {
"SYN3221", /* HP 15-ay000 */ "SYN3221", /* HP 15-ay000 */
"SYN323d", /* HP Spectre X360 13-w013dx */ "SYN323d", /* HP Spectre X360 13-w013dx */
"SYN3257", /* HP Envy 13-ad105ng */ "SYN3257", /* HP Envy 13-ad105ng */
"SYN3286", /* HP Laptop 15-da3001TU */
NULL NULL
}; };

View File

@@ -804,6 +804,7 @@ int __init dmar_dev_scope_init(void)
info = dmar_alloc_pci_notify_info(dev, info = dmar_alloc_pci_notify_info(dev,
BUS_NOTIFY_ADD_DEVICE); BUS_NOTIFY_ADD_DEVICE);
if (!info) { if (!info) {
pci_dev_put(dev);
return dmar_dev_scope_status; return dmar_dev_scope_status;
} else { } else {
dmar_pci_bus_add_dev(info); dmar_pci_bus_add_dev(info);

View File

@@ -2116,10 +2116,6 @@ static void integrity_writer(struct work_struct *w)
unsigned prev_free_sectors; unsigned prev_free_sectors;
/* the following test is not needed, but it tests the replay code */
if (unlikely(dm_post_suspending(ic->ti)) && !ic->meta_dev)
return;
spin_lock_irq(&ic->endio_wait.lock); spin_lock_irq(&ic->endio_wait.lock);
write_start = ic->committed_section; write_start = ic->committed_section;
write_sections = ic->n_committed_sections; write_sections = ic->n_committed_sections;
@@ -2455,7 +2451,6 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
drain_workqueue(ic->commit_wq); drain_workqueue(ic->commit_wq);
if (ic->mode == 'J') { if (ic->mode == 'J') {
if (ic->meta_dev)
queue_work(ic->writer_wq, &ic->writer_work); queue_work(ic->writer_wq, &ic->writer_work);
drain_workqueue(ic->writer_wq); drain_workqueue(ic->writer_wq);
dm_integrity_flush_buffers(ic, true); dm_integrity_flush_buffers(ic, true);

View File

@@ -13,6 +13,7 @@
* - JMicron (hardware and technical support) * - JMicron (hardware and technical support)
*/ */
#include <linux/bitfield.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/ktime.h> #include <linux/ktime.h>
#include <linux/highmem.h> #include <linux/highmem.h>
@@ -263,6 +264,7 @@ static void sdhci_init(struct sdhci_host *host, int soft)
if (soft) { if (soft) {
/* force clock reconfiguration */ /* force clock reconfiguration */
host->clock = 0; host->clock = 0;
host->reinit_uhs = true;
mmc->ops->set_ios(mmc, &mmc->ios); mmc->ops->set_ios(mmc, &mmc->ios);
} }
} }
@@ -1418,10 +1420,9 @@ u16 sdhci_calc_clk(struct sdhci_host *host, unsigned int clock,
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
pre_val = sdhci_get_preset_value(host); pre_val = sdhci_get_preset_value(host);
div = (pre_val & SDHCI_PRESET_SDCLK_FREQ_MASK) div = FIELD_GET(SDHCI_PRESET_SDCLK_FREQ_MASK, pre_val);
>> SDHCI_PRESET_SDCLK_FREQ_SHIFT;
if (host->clk_mul && if (host->clk_mul &&
(pre_val & SDHCI_PRESET_CLKGEN_SEL_MASK)) { (pre_val & SDHCI_PRESET_CLKGEN_SEL)) {
clk = SDHCI_PROG_CLOCK_MODE; clk = SDHCI_PROG_CLOCK_MODE;
real_div = div + 1; real_div = div + 1;
clk_mul = host->clk_mul; clk_mul = host->clk_mul;
@@ -1736,11 +1737,46 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing)
} }
EXPORT_SYMBOL_GPL(sdhci_set_uhs_signaling); EXPORT_SYMBOL_GPL(sdhci_set_uhs_signaling);
static bool sdhci_timing_has_preset(unsigned char timing)
{
switch (timing) {
case MMC_TIMING_UHS_SDR12:
case MMC_TIMING_UHS_SDR25:
case MMC_TIMING_UHS_SDR50:
case MMC_TIMING_UHS_SDR104:
case MMC_TIMING_UHS_DDR50:
case MMC_TIMING_MMC_DDR52:
return true;
};
return false;
}
static bool sdhci_preset_needed(struct sdhci_host *host, unsigned char timing)
{
return !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) &&
sdhci_timing_has_preset(timing);
}
static bool sdhci_presetable_values_change(struct sdhci_host *host, struct mmc_ios *ios)
{
/*
* Preset Values are: Driver Strength, Clock Generator and SDCLK/RCLK
* Frequency. Check if preset values need to be enabled, or the Driver
* Strength needs updating. Note, clock changes are handled separately.
*/
return !host->preset_enabled &&
(sdhci_preset_needed(host, ios->timing) || host->drv_type != ios->drv_type);
}
void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
{ {
struct sdhci_host *host = mmc_priv(mmc); struct sdhci_host *host = mmc_priv(mmc);
bool reinit_uhs = host->reinit_uhs;
bool turning_on_clk = false;
u8 ctrl; u8 ctrl;
host->reinit_uhs = false;
if (ios->power_mode == MMC_POWER_UNDEFINED) if (ios->power_mode == MMC_POWER_UNDEFINED)
return; return;
@@ -1766,6 +1802,8 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
sdhci_enable_preset_value(host, false); sdhci_enable_preset_value(host, false);
if (!ios->clock || ios->clock != host->clock) { if (!ios->clock || ios->clock != host->clock) {
turning_on_clk = ios->clock && !host->clock;
host->ops->set_clock(host, ios->clock); host->ops->set_clock(host, ios->clock);
host->clock = ios->clock; host->clock = ios->clock;
@@ -1792,6 +1830,17 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
host->ops->set_bus_width(host, ios->bus_width); host->ops->set_bus_width(host, ios->bus_width);
/*
* Special case to avoid multiple clock changes during voltage
* switching.
*/
if (!reinit_uhs &&
turning_on_clk &&
host->timing == ios->timing &&
host->version >= SDHCI_SPEC_300 &&
!sdhci_presetable_values_change(host, ios))
return;
ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
if (!(host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)) { if (!(host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)) {
@@ -1835,6 +1884,7 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
} }
sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
host->drv_type = ios->drv_type;
} else { } else {
/* /*
* According to SDHC Spec v3.00, if the Preset Value * According to SDHC Spec v3.00, if the Preset Value
@@ -1862,19 +1912,14 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
host->ops->set_uhs_signaling(host, ios->timing); host->ops->set_uhs_signaling(host, ios->timing);
host->timing = ios->timing; host->timing = ios->timing;
if (!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) && if (sdhci_preset_needed(host, ios->timing)) {
((ios->timing == MMC_TIMING_UHS_SDR12) ||
(ios->timing == MMC_TIMING_UHS_SDR25) ||
(ios->timing == MMC_TIMING_UHS_SDR50) ||
(ios->timing == MMC_TIMING_UHS_SDR104) ||
(ios->timing == MMC_TIMING_UHS_DDR50) ||
(ios->timing == MMC_TIMING_MMC_DDR52))) {
u16 preset; u16 preset;
sdhci_enable_preset_value(host, true); sdhci_enable_preset_value(host, true);
preset = sdhci_get_preset_value(host); preset = sdhci_get_preset_value(host);
ios->drv_type = (preset & SDHCI_PRESET_DRV_MASK) ios->drv_type = FIELD_GET(SDHCI_PRESET_DRV_MASK,
>> SDHCI_PRESET_DRV_SHIFT; preset);
host->drv_type = ios->drv_type;
} }
/* Re-enable SD Clock */ /* Re-enable SD Clock */
@@ -3128,6 +3173,7 @@ int sdhci_resume_host(struct sdhci_host *host)
sdhci_init(host, 0); sdhci_init(host, 0);
host->pwr = 0; host->pwr = 0;
host->clock = 0; host->clock = 0;
host->reinit_uhs = true;
mmc->ops->set_ios(mmc, &mmc->ios); mmc->ops->set_ios(mmc, &mmc->ios);
} else { } else {
sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER)); sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER));
@@ -3191,6 +3237,7 @@ int sdhci_runtime_resume_host(struct sdhci_host *host)
/* Force clock and power re-program */ /* Force clock and power re-program */
host->pwr = 0; host->pwr = 0;
host->clock = 0; host->clock = 0;
host->reinit_uhs = true;
mmc->ops->start_signal_voltage_switch(mmc, &mmc->ios); mmc->ops->start_signal_voltage_switch(mmc, &mmc->ios);
mmc->ops->set_ios(mmc, &mmc->ios); mmc->ops->set_ios(mmc, &mmc->ios);

View File

@@ -13,6 +13,7 @@
#ifndef __SDHCI_HW_H #ifndef __SDHCI_HW_H
#define __SDHCI_HW_H #define __SDHCI_HW_H
#include <linux/bits.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/types.h> #include <linux/types.h>
@@ -259,12 +260,9 @@
#define SDHCI_PRESET_FOR_SDR104 0x6C #define SDHCI_PRESET_FOR_SDR104 0x6C
#define SDHCI_PRESET_FOR_DDR50 0x6E #define SDHCI_PRESET_FOR_DDR50 0x6E
#define SDHCI_PRESET_FOR_HS400 0x74 /* Non-standard */ #define SDHCI_PRESET_FOR_HS400 0x74 /* Non-standard */
#define SDHCI_PRESET_DRV_MASK 0xC000 #define SDHCI_PRESET_DRV_MASK GENMASK(15, 14)
#define SDHCI_PRESET_DRV_SHIFT 14 #define SDHCI_PRESET_CLKGEN_SEL BIT(10)
#define SDHCI_PRESET_CLKGEN_SEL_MASK 0x400 #define SDHCI_PRESET_SDCLK_FREQ_MASK GENMASK(9, 0)
#define SDHCI_PRESET_CLKGEN_SEL_SHIFT 10
#define SDHCI_PRESET_SDCLK_FREQ_MASK 0x3FF
#define SDHCI_PRESET_SDCLK_FREQ_SHIFT 0
#define SDHCI_SLOT_INT_STATUS 0xFC #define SDHCI_SLOT_INT_STATUS 0xFC
@@ -503,6 +501,8 @@ struct sdhci_host {
unsigned int clock; /* Current clock (MHz) */ unsigned int clock; /* Current clock (MHz) */
u8 pwr; /* Current voltage */ u8 pwr; /* Current voltage */
u8 drv_type; /* Current UHS-I driver type */
bool reinit_uhs; /* Force UHS-related re-initialization */
bool runtime_suspended; /* Host is runtime suspended */ bool runtime_suspended; /* Host is runtime suspended */
bool bus_on; /* Bus power prevents runtime suspend */ bool bus_on; /* Bus power prevents runtime suspend */

View File

@@ -272,22 +272,24 @@ static int cc770_isa_probe(struct platform_device *pdev)
if (err) { if (err) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"couldn't register device (err=%d)\n", err); "couldn't register device (err=%d)\n", err);
goto exit_unmap; goto exit_free;
} }
dev_info(&pdev->dev, "device registered (reg_base=0x%p, irq=%d)\n", dev_info(&pdev->dev, "device registered (reg_base=0x%p, irq=%d)\n",
priv->reg_base, dev->irq); priv->reg_base, dev->irq);
return 0; return 0;
exit_unmap: exit_free:
free_cc770dev(dev);
exit_unmap:
if (mem[idx]) if (mem[idx])
iounmap(base); iounmap(base);
exit_release: exit_release:
if (mem[idx]) if (mem[idx])
release_mem_region(mem[idx], iosize); release_mem_region(mem[idx], iosize);
else else
release_region(port[idx], iosize); release_region(port[idx], iosize);
exit: exit:
return err; return err;
} }

View File

@@ -213,22 +213,24 @@ static int sja1000_isa_probe(struct platform_device *pdev)
if (err) { if (err) {
dev_err(&pdev->dev, "registering %s failed (err=%d)\n", dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
DRV_NAME, err); DRV_NAME, err);
goto exit_unmap; goto exit_free;
} }
dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n", dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n",
DRV_NAME, priv->reg_base, dev->irq); DRV_NAME, priv->reg_base, dev->irq);
return 0; return 0;
exit_unmap: exit_free:
free_sja1000dev(dev);
exit_unmap:
if (mem[idx]) if (mem[idx])
iounmap(base); iounmap(base);
exit_release: exit_release:
if (mem[idx]) if (mem[idx])
release_mem_region(mem[idx], iosize); release_mem_region(mem[idx], iosize);
else else
release_region(port[idx], iosize); release_region(port[idx], iosize);
exit: exit:
return err; return err;
} }

View File

@@ -966,7 +966,7 @@ static const struct lan9303_mib_desc lan9303_mib[] = {
{ .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", }, { .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", },
{ .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", }, { .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", },
{ .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", }, { .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", },
{ .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", }, { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "RxShort", },
{ .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", }, { .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", },
{ .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", }, { .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", },
{ .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", }, { .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },

View File

@@ -806,16 +806,20 @@ static void bnx2x_vf_enable_traffic(struct bnx2x *bp, struct bnx2x_virtf *vf)
static u8 bnx2x_vf_is_pcie_pending(struct bnx2x *bp, u8 abs_vfid) static u8 bnx2x_vf_is_pcie_pending(struct bnx2x *bp, u8 abs_vfid)
{ {
struct pci_dev *dev;
struct bnx2x_virtf *vf = bnx2x_vf_by_abs_fid(bp, abs_vfid); struct bnx2x_virtf *vf = bnx2x_vf_by_abs_fid(bp, abs_vfid);
struct pci_dev *dev;
bool pending;
if (!vf) if (!vf)
return false; return false;
dev = pci_get_domain_bus_and_slot(vf->domain, vf->bus, vf->devfn); dev = pci_get_domain_bus_and_slot(vf->domain, vf->bus, vf->devfn);
if (dev) if (!dev)
return bnx2x_is_pcie_pending(dev);
return false; return false;
pending = bnx2x_is_pcie_pending(dev);
pci_dev_put(dev);
return pending;
} }
int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid) int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid)

View File

@@ -1447,8 +1447,10 @@ static acpi_status bgx_acpi_match_id(acpi_handle handle, u32 lvl,
return AE_OK; return AE_OK;
} }
if (strncmp(string.pointer, bgx_sel, 4)) if (strncmp(string.pointer, bgx_sel, 4)) {
kfree(string.pointer);
return AE_OK; return AE_OK;
}
acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
bgx_acpi_register_phy, NULL, bgx, NULL); bgx_acpi_register_phy, NULL, bgx, NULL);

View File

@@ -697,6 +697,7 @@ static int mlx4_create_zones(struct mlx4_dev *dev,
err = mlx4_bitmap_init(*bitmap + k, 1, err = mlx4_bitmap_init(*bitmap + k, 1,
MLX4_QP_TABLE_RAW_ETH_SIZE - 1, 0, MLX4_QP_TABLE_RAW_ETH_SIZE - 1, 0,
0); 0);
if (!err)
mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0); mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0);
} }

View File

@@ -1324,8 +1324,8 @@ static ssize_t outlen_write(struct file *filp, const char __user *buf,
return -EFAULT; return -EFAULT;
err = sscanf(outlen_str, "%d", &outlen); err = sscanf(outlen_str, "%d", &outlen);
if (err < 0) if (err != 1)
return err; return -EINVAL;
ptr = kzalloc(outlen, GFP_KERNEL); ptr = kzalloc(outlen, GFP_KERNEL);
if (!ptr) if (!ptr)

View File

@@ -600,7 +600,7 @@ static void mlx5_tracer_handle_timestamp_trace(struct mlx5_fw_tracer *tracer,
trace_timestamp = (timestamp_event.timestamp & MASK_52_7) | trace_timestamp = (timestamp_event.timestamp & MASK_52_7) |
(str_frmt->timestamp & MASK_6_0); (str_frmt->timestamp & MASK_6_0);
else else
trace_timestamp = ((timestamp_event.timestamp & MASK_52_7) - 1) | trace_timestamp = ((timestamp_event.timestamp - 1) & MASK_52_7) |
(str_frmt->timestamp & MASK_6_0); (str_frmt->timestamp & MASK_6_0);
mlx5_tracer_print_trace(str_frmt, dev, trace_timestamp); mlx5_tracer_print_trace(str_frmt, dev, trace_timestamp);

View File

@@ -1177,6 +1177,7 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter,
buffer_info->dma = 0; buffer_info->dma = 0;
buffer_info->time_stamp = 0; buffer_info->time_stamp = 0;
tx_ring->next_to_use = ring_num; tx_ring->next_to_use = ring_num;
dev_kfree_skb_any(skb);
return; return;
} }
buffer_info->mapped = true; buffer_info->mapped = true;
@@ -2491,6 +2492,7 @@ static void pch_gbe_remove(struct pci_dev *pdev)
unregister_netdev(netdev); unregister_netdev(netdev);
pch_gbe_phy_hw_reset(&adapter->hw); pch_gbe_phy_hw_reset(&adapter->hw);
pci_dev_put(adapter->ptp_pdev);
free_netdev(netdev); free_netdev(netdev);
} }
@@ -2572,7 +2574,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
/* setup the private structure */ /* setup the private structure */
ret = pch_gbe_sw_init(adapter); ret = pch_gbe_sw_init(adapter);
if (ret) if (ret)
goto err_free_netdev; goto err_put_dev;
/* Initialize PHY */ /* Initialize PHY */
ret = pch_gbe_init_phy(adapter); ret = pch_gbe_init_phy(adapter);
@@ -2630,6 +2632,8 @@ static int pch_gbe_probe(struct pci_dev *pdev,
err_free_adapter: err_free_adapter:
pch_gbe_phy_hw_reset(&adapter->hw); pch_gbe_phy_hw_reset(&adapter->hw);
err_put_dev:
pci_dev_put(adapter->ptp_pdev);
err_free_netdev: err_free_netdev:
free_netdev(netdev); free_netdev(netdev);
return ret; return ret;

View File

@@ -2477,6 +2477,7 @@ static netdev_tx_t ql3xxx_send(struct sk_buff *skb,
skb_shinfo(skb)->nr_frags); skb_shinfo(skb)->nr_frags);
if (tx_cb->seg_count == -1) { if (tx_cb->seg_count == -1) {
netdev_err(ndev, "%s: invalid segment count!\n", __func__); netdev_err(ndev, "%s: invalid segment count!\n", __func__);
dev_kfree_skb_any(skb);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }

View File

@@ -2993,7 +2993,7 @@ static void qlcnic_83xx_recover_driver_lock(struct qlcnic_adapter *adapter)
QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val);
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"%s: lock recovery initiated\n", __func__); "%s: lock recovery initiated\n", __func__);
msleep(QLC_83XX_DRV_LOCK_RECOVERY_DELAY); mdelay(QLC_83XX_DRV_LOCK_RECOVERY_DELAY);
val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK); val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK);
id = ((val >> 2) & 0xF); id = ((val >> 2) & 0xF);
if (id == adapter->portnum) { if (id == adapter->portnum) {
@@ -3029,7 +3029,7 @@ int qlcnic_83xx_lock_driver(struct qlcnic_adapter *adapter)
if (status) if (status)
break; break;
msleep(QLC_83XX_DRV_LOCK_WAIT_DELAY); mdelay(QLC_83XX_DRV_LOCK_WAIT_DELAY);
i++; i++;
if (i == 1) if (i == 1)

View File

@@ -2310,6 +2310,7 @@ static int __maybe_unused ravb_resume(struct device *dev)
ret = ravb_open(ndev); ret = ravb_open(ndev);
if (ret < 0) if (ret < 0)
return ret; return ret;
ravb_set_rx_mode(ndev);
netif_device_attach(ndev); netif_device_attach(ndev);
} }

View File

@@ -506,7 +506,14 @@ static int __init ntb_netdev_init_module(void)
rc = ntb_transport_register_client_dev(KBUILD_MODNAME); rc = ntb_transport_register_client_dev(KBUILD_MODNAME);
if (rc) if (rc)
return rc; return rc;
return ntb_transport_register_client(&ntb_netdev_client);
rc = ntb_transport_register_client(&ntb_netdev_client);
if (rc) {
ntb_transport_unregister_client_dev(KBUILD_MODNAME);
return rc;
}
return 0;
} }
module_init(ntb_netdev_init_module); module_init(ntb_netdev_init_module);

View File

@@ -1083,6 +1083,7 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
error_module_put: error_module_put:
module_put(d->driver->owner); module_put(d->driver->owner);
d->driver = NULL;
error_put_device: error_put_device:
put_device(d); put_device(d);
if (ndev_owner != bus->owner) if (ndev_owner != bus->owner)

View File

@@ -756,7 +756,6 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
if (tun) if (tun)
xdp_rxq_info_unreg(&tfile->xdp_rxq); xdp_rxq_info_unreg(&tfile->xdp_rxq);
ptr_ring_cleanup(&tfile->tx_ring, tun_ptr_free); ptr_ring_cleanup(&tfile->tx_ring, tun_ptr_free);
sock_put(&tfile->sk);
} }
} }
@@ -772,6 +771,9 @@ static void tun_detach(struct tun_file *tfile, bool clean)
if (dev) if (dev)
netdev_state_change(dev); netdev_state_change(dev);
rtnl_unlock(); rtnl_unlock();
if (clean)
sock_put(&tfile->sk);
} }
static void tun_detach_all(struct net_device *dev) static void tun_detach_all(struct net_device *dev)

View File

@@ -1317,6 +1317,7 @@ static const struct usb_device_id products[] = {
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
{QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */

View File

@@ -686,6 +686,7 @@ static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
struct hwsim_vif_priv *vp = (void *)vif->drv_priv; struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct ieee80211_tx_info *cb;
if (!vp->assoc) if (!vp->assoc)
return; return;
@@ -707,6 +708,10 @@ static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
memcpy(hdr->addr2, mac, ETH_ALEN); memcpy(hdr->addr2, mac, ETH_ALEN);
memcpy(hdr->addr3, vp->bssid, ETH_ALEN); memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
cb = IEEE80211_SKB_CB(skb);
cb->control.rates[0].count = 1;
cb->control.rates[1].idx = -1;
rcu_read_lock(); rcu_read_lock();
mac80211_hwsim_tx_frame(data->hw, skb, mac80211_hwsim_tx_frame(data->hw, skb,
rcu_dereference(vif->chanctx_conf)->def.chan); rcu_dereference(vif->chanctx_conf)->def.chan);

View File

@@ -338,7 +338,7 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
* AID 81 5 to 16 * AID 81 5 to 16
* PARAMETERS 82 0 to 255 * PARAMETERS 82 0 to 255
*/ */
if (skb->len < NFC_MIN_AID_LENGTH + 2 && if (skb->len < NFC_MIN_AID_LENGTH + 2 ||
skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG) skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG)
return -EPROTO; return -EPROTO;
@@ -352,8 +352,10 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
/* Check next byte is PARAMETERS tag (82) */ /* Check next byte is PARAMETERS tag (82) */
if (skb->data[transaction->aid_len + 2] != if (skb->data[transaction->aid_len + 2] !=
NFC_EVT_TRANSACTION_PARAMS_TAG) NFC_EVT_TRANSACTION_PARAMS_TAG) {
devm_kfree(dev, transaction);
return -EPROTO; return -EPROTO;
}
transaction->params_len = skb->data[transaction->aid_len + 3]; transaction->params_len = skb->data[transaction->aid_len + 3];
memcpy(transaction->params, skb->data + memcpy(transaction->params, skb->data +

View File

@@ -2675,11 +2675,17 @@ static long nvme_dev_ioctl(struct file *file, unsigned int cmd,
case NVME_IOCTL_IO_CMD: case NVME_IOCTL_IO_CMD:
return nvme_dev_user_cmd(ctrl, argp); return nvme_dev_user_cmd(ctrl, argp);
case NVME_IOCTL_RESET: case NVME_IOCTL_RESET:
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
dev_warn(ctrl->device, "resetting controller\n"); dev_warn(ctrl->device, "resetting controller\n");
return nvme_reset_ctrl_sync(ctrl); return nvme_reset_ctrl_sync(ctrl);
case NVME_IOCTL_SUBSYS_RESET: case NVME_IOCTL_SUBSYS_RESET:
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
return nvme_reset_subsystem(ctrl); return nvme_reset_subsystem(ctrl);
case NVME_IOCTL_RESCAN: case NVME_IOCTL_RESCAN:
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
nvme_queue_scan(ctrl); nvme_queue_scan(ctrl);
return 0; return 0;
default: default:

View File

@@ -919,8 +919,10 @@ of_fwnode_get_reference_args(const struct fwnode_handle *fwnode,
nargs, index, &of_args); nargs, index, &of_args);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (!args) if (!args) {
of_node_put(of_args.np);
return 0; return 0;
}
args->nargs = of_args.args_count; args->nargs = of_args.args_count;
args->fwnode = of_fwnode_handle(of_args.np); args->fwnode = of_fwnode_handle(of_args.np);

View File

@@ -423,9 +423,14 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
writel(value, padcfg0); writel(value, padcfg0);
} }
static int __intel_gpio_get_gpio_mode(u32 value)
{
return (value & PADCFG0_PMODE_MASK) >> PADCFG0_PMODE_SHIFT;
}
static int intel_gpio_get_gpio_mode(void __iomem *padcfg0) static int intel_gpio_get_gpio_mode(void __iomem *padcfg0)
{ {
return (readl(padcfg0) & PADCFG0_PMODE_MASK) >> PADCFG0_PMODE_SHIFT; return __intel_gpio_get_gpio_mode(readl(padcfg0));
} }
static void intel_gpio_set_gpio_mode(void __iomem *padcfg0) static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
@@ -1429,6 +1434,7 @@ EXPORT_SYMBOL_GPL(intel_pinctrl_probe);
static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned pin) static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned pin)
{ {
const struct pin_desc *pd = pin_desc_get(pctrl->pctldev, pin); const struct pin_desc *pd = pin_desc_get(pctrl->pctldev, pin);
u32 value;
if (!pd || !intel_pad_usable(pctrl, pin)) if (!pd || !intel_pad_usable(pctrl, pin))
return false; return false;
@@ -1443,6 +1449,25 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned pin)
gpiochip_line_is_irq(&pctrl->chip, pin)) gpiochip_line_is_irq(&pctrl->chip, pin))
return true; return true;
/*
* The firmware on some systems may configure GPIO pins to be
* an interrupt source in so called "direct IRQ" mode. In such
* cases the GPIO controller driver has no idea if those pins
* are being used or not. At the same time, there is a known bug
* in the firmwares that don't restore the pin settings correctly
* after suspend, i.e. by an unknown reason the Rx value becomes
* inverted.
*
* Hence, let's save and restore the pins that are configured
* as GPIOs in the input mode with GPIROUTIOXAPIC bit set.
*
* See https://bugzilla.kernel.org/show_bug.cgi?id=214749.
*/
value = readl(intel_get_padcfg(pctrl, pin, PADCFG0));
if ((value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) &&
(__intel_gpio_get_gpio_mode(value) == PADCFG0_PMODE_GPIO))
return true;
return false; return false;
} }

View File

@@ -703,7 +703,7 @@ static int pcs_allocate_pin_table(struct pcs_device *pcs)
mux_bytes = pcs->width / BITS_PER_BYTE; mux_bytes = pcs->width / BITS_PER_BYTE;
if (pcs->bits_per_mux) { if (pcs->bits_per_mux && pcs->fmask) {
pcs->bits_per_pin = fls(pcs->fmask); pcs->bits_per_pin = fls(pcs->fmask);
nr_pins = (pcs->size * BITS_PER_BYTE) / pcs->bits_per_pin; nr_pins = (pcs->size * BITS_PER_BYTE) / pcs->bits_per_pin;
num_pins_in_register = pcs->width / pcs->bits_per_pin; num_pins_in_register = pcs->width / pcs->bits_per_pin;

View File

@@ -550,6 +550,15 @@ static const struct dmi_system_id acer_quirks[] __initconst = {
}, },
.driver_data = (void *)ACER_CAP_KBD_DOCK, .driver_data = (void *)ACER_CAP_KBD_DOCK,
}, },
{
.callback = set_force_caps,
.ident = "Acer Aspire Switch V 10 SW5-017",
.matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
},
.driver_data = (void *)ACER_CAP_KBD_DOCK,
},
{ {
.callback = set_force_caps, .callback = set_force_caps,
.ident = "Acer One 10 (S1003)", .ident = "Acer One 10 (S1003)",

View File

@@ -1176,6 +1176,8 @@ static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR, pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
cpu_to_le32(ports_available)); cpu_to_le32(ports_available));
pci_dev_put(xhci_pdev);
pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n", pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
orig_ports_available, ports_available); orig_ports_available, ports_available);
} }

View File

@@ -76,6 +76,7 @@ enum hp_wmi_event_ids {
HPWMI_PEAKSHIFT_PERIOD = 0x0F, HPWMI_PEAKSHIFT_PERIOD = 0x0F,
HPWMI_BATTERY_CHARGE_PERIOD = 0x10, HPWMI_BATTERY_CHARGE_PERIOD = 0x10,
HPWMI_SANITIZATION_MODE = 0x17, HPWMI_SANITIZATION_MODE = 0x17,
HPWMI_SMART_EXPERIENCE_APP = 0x21,
}; };
struct bios_args { struct bios_args {
@@ -634,6 +635,8 @@ static void hp_wmi_notify(u32 value, void *context)
break; break;
case HPWMI_SANITIZATION_MODE: case HPWMI_SANITIZATION_MODE:
break; break;
case HPWMI_SMART_EXPERIENCE_APP:
break;
default: default:
pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data); pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data);
break; break;

View File

@@ -3788,7 +3788,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
struct dasd_device *basedev; struct dasd_device *basedev;
struct req_iterator iter; struct req_iterator iter;
struct dasd_ccw_req *cqr; struct dasd_ccw_req *cqr;
unsigned int first_offs;
unsigned int trkcount; unsigned int trkcount;
unsigned long *idaws; unsigned long *idaws;
unsigned int size; unsigned int size;
@@ -3822,7 +3821,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) / last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) /
DASD_RAW_SECTORS_PER_TRACK; DASD_RAW_SECTORS_PER_TRACK;
trkcount = last_trk - first_trk + 1; trkcount = last_trk - first_trk + 1;
first_offs = 0;
if (rq_data_dir(req) == READ) if (rq_data_dir(req) == READ)
cmd = DASD_ECKD_CCW_READ_TRACK; cmd = DASD_ECKD_CCW_READ_TRACK;
@@ -3866,13 +3864,13 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
if (use_prefix) { if (use_prefix) {
prefix_LRE(ccw++, data, first_trk, last_trk, cmd, basedev, prefix_LRE(ccw++, data, first_trk, last_trk, cmd, basedev,
startdev, 1, first_offs + 1, trkcount, 0, 0); startdev, 1, 0, trkcount, 0, 0);
} else { } else {
define_extent(ccw++, data, first_trk, last_trk, cmd, basedev, 0); define_extent(ccw++, data, first_trk, last_trk, cmd, basedev, 0);
ccw[-1].flags |= CCW_FLAG_CC; ccw[-1].flags |= CCW_FLAG_CC;
data += sizeof(struct DE_eckd_data); data += sizeof(struct DE_eckd_data);
locate_record_ext(ccw++, data, first_trk, first_offs + 1, locate_record_ext(ccw++, data, first_trk, 0,
trkcount, cmd, basedev, 0, 0); trkcount, cmd, basedev, 0, 0);
} }

View File

@@ -429,8 +429,7 @@ static unsigned int mx51_ecspi_clkdiv(struct spi_imx_data *spi_imx,
unsigned int pre, post; unsigned int pre, post;
unsigned int fin = spi_imx->spi_clk; unsigned int fin = spi_imx->spi_clk;
if (unlikely(fspi > fin)) fspi = min(fspi, fin);
return 0;
post = fls(fin) - fls(fspi); post = fls(fin) - fls(fspi);
if (fin > fspi << post) if (fin > fspi << post)

View File

@@ -255,7 +255,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz)
u32 div, mbrdiv; u32 div, mbrdiv;
/* Ensure spi->clk_rate is even */ /* Ensure spi->clk_rate is even */
div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz); div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
/* /*
* SPI framework set xfer->speed_hz to master->max_speed_hz if * SPI framework set xfer->speed_hz to master->max_speed_hz if

View File

@@ -244,6 +244,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
{ {
struct omap8250_priv *priv = up->port.private_data; struct omap8250_priv *priv = up->port.private_data;
struct uart_8250_dma *dma = up->dma; struct uart_8250_dma *dma = up->dma;
u8 mcr = serial8250_in_MCR(up);
if (dma && dma->tx_running) { if (dma && dma->tx_running) {
/* /*
@@ -260,7 +261,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
serial_out(up, UART_EFR, UART_EFR_ECB); serial_out(up, UART_EFR, UART_EFR_ECB);
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A); serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
serial8250_out_MCR(up, UART_MCR_TCRTLR); serial8250_out_MCR(up, mcr | UART_MCR_TCRTLR);
serial_out(up, UART_FCR, up->fcr); serial_out(up, UART_FCR, up->fcr);
omap8250_update_scr(up, priv); omap8250_update_scr(up, priv);
@@ -276,7 +277,8 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
serial_out(up, UART_LCR, 0); serial_out(up, UART_LCR, 0);
/* drop TCR + TLR access, we setup XON/XOFF later */ /* drop TCR + TLR access, we setup XON/XOFF later */
serial8250_out_MCR(up, up->mcr); serial8250_out_MCR(up, mcr);
serial_out(up, UART_IER, up->ier); serial_out(up, UART_IER, up->ier);
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
@@ -585,7 +587,6 @@ static int omap_8250_startup(struct uart_port *port)
pm_runtime_get_sync(port->dev); pm_runtime_get_sync(port->dev);
up->mcr = 0;
serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
serial_out(up, UART_LCR, UART_LCR_WLEN8); serial_out(up, UART_LCR, UART_LCR_WLEN8);

View File

@@ -150,7 +150,7 @@ static int platform_pci_probe(struct pci_dev *pdev,
if (ret) { if (ret) {
dev_warn(&pdev->dev, "Unable to set the evtchn callback " dev_warn(&pdev->dev, "Unable to set the evtchn callback "
"err=%d\n", ret); "err=%d\n", ret);
goto out; goto irq_out;
} }
} }
@@ -158,13 +158,16 @@ static int platform_pci_probe(struct pci_dev *pdev,
grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes); grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
ret = gnttab_setup_auto_xlat_frames(grant_frames); ret = gnttab_setup_auto_xlat_frames(grant_frames);
if (ret) if (ret)
goto out; goto irq_out;
ret = gnttab_init(); ret = gnttab_init();
if (ret) if (ret)
goto grant_out; goto grant_out;
return 0; return 0;
grant_out: grant_out:
gnttab_free_auto_xlat_frames(); gnttab_free_auto_xlat_frames();
irq_out:
if (!xen_have_vector_callback)
free_irq(pdev->irq, pdev);
out: out:
pci_release_region(pdev, 0); pci_release_region(pdev, 0);
mem_out: mem_out:

View File

@@ -2759,6 +2759,8 @@ static int btrfs_ioctl_get_subvol_info(struct file *file, void __user *argp)
} }
} }
btrfs_free_path(path);
path = NULL;
if (copy_to_user(argp, subvol_info, sizeof(*subvol_info))) if (copy_to_user(argp, subvol_info, sizeof(*subvol_info)))
ret = -EFAULT; ret = -EFAULT;
@@ -2849,6 +2851,8 @@ static int btrfs_ioctl_get_subvol_rootref(struct file *file, void __user *argp)
} }
out: out:
btrfs_free_path(path);
if (!ret || ret == -EOVERFLOW) { if (!ret || ret == -EOVERFLOW) {
rootrefs->num_items = found; rootrefs->num_items = found;
/* update min_treeid for next search */ /* update min_treeid for next search */
@@ -2860,7 +2864,6 @@ static int btrfs_ioctl_get_subvol_rootref(struct file *file, void __user *argp)
} }
kfree(rootrefs); kfree(rootrefs);
btrfs_free_path(path);
return ret; return ret;
} }
@@ -4886,6 +4889,8 @@ static long btrfs_ioctl_ino_to_path(struct btrfs_root *root, void __user *arg)
ipath->fspath->val[i] = rel_ptr; ipath->fspath->val[i] = rel_ptr;
} }
btrfs_free_path(path);
path = NULL;
ret = copy_to_user((void __user *)(unsigned long)ipa->fspath, ret = copy_to_user((void __user *)(unsigned long)ipa->fspath,
ipath->fspath, size); ipath->fspath, size);
if (ret) { if (ret) {
@@ -4956,21 +4961,20 @@ static long btrfs_ioctl_logical_to_ino(struct btrfs_fs_info *fs_info,
size = min_t(u32, loi->size, SZ_16M); size = min_t(u32, loi->size, SZ_16M);
} }
inodes = init_data_container(size);
if (IS_ERR(inodes)) {
ret = PTR_ERR(inodes);
goto out_loi;
}
path = btrfs_alloc_path(); path = btrfs_alloc_path();
if (!path) { if (!path) {
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
inodes = init_data_container(size);
if (IS_ERR(inodes)) {
ret = PTR_ERR(inodes);
inodes = NULL;
goto out;
}
ret = iterate_inodes_from_logical(loi->logical, fs_info, path, ret = iterate_inodes_from_logical(loi->logical, fs_info, path,
build_ino_list, inodes, ignore_offset); build_ino_list, inodes, ignore_offset);
btrfs_free_path(path);
if (ret == -EINVAL) if (ret == -EINVAL)
ret = -ENOENT; ret = -ENOENT;
if (ret < 0) if (ret < 0)
@@ -4982,7 +4986,6 @@ static long btrfs_ioctl_logical_to_ino(struct btrfs_fs_info *fs_info,
ret = -EFAULT; ret = -EFAULT;
out: out:
btrfs_free_path(path);
kvfree(inodes); kvfree(inodes);
out_loi: out_loi:
kfree(loi); kfree(loi);

View File

@@ -2368,14 +2368,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid,
dstgroup->rsv_rfer = inherit->lim.rsv_rfer; dstgroup->rsv_rfer = inherit->lim.rsv_rfer;
dstgroup->rsv_excl = inherit->lim.rsv_excl; dstgroup->rsv_excl = inherit->lim.rsv_excl;
ret = update_qgroup_limit_item(trans, dstgroup); qgroup_dirty(fs_info, dstgroup);
if (ret) {
fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
btrfs_info(fs_info,
"unable to update quota limit for %llu",
dstgroup->qgroupid);
goto unlock;
}
} }
if (srcid) { if (srcid) {

View File

@@ -671,14 +671,17 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
struct ceph_mds_snap_realm *ri; /* encoded */ struct ceph_mds_snap_realm *ri; /* encoded */
__le64 *snaps; /* encoded */ __le64 *snaps; /* encoded */
__le64 *prior_parent_snaps; /* encoded */ __le64 *prior_parent_snaps; /* encoded */
struct ceph_snap_realm *realm = NULL; struct ceph_snap_realm *realm;
struct ceph_snap_realm *first_realm = NULL; struct ceph_snap_realm *first_realm = NULL;
int invalidate = 0; struct ceph_snap_realm *realm_to_rebuild = NULL;
int rebuild_snapcs;
int err = -ENOMEM; int err = -ENOMEM;
LIST_HEAD(dirty_realms); LIST_HEAD(dirty_realms);
dout("update_snap_trace deletion=%d\n", deletion); dout("update_snap_trace deletion=%d\n", deletion);
more: more:
realm = NULL;
rebuild_snapcs = 0;
ceph_decode_need(&p, e, sizeof(*ri), bad); ceph_decode_need(&p, e, sizeof(*ri), bad);
ri = p; ri = p;
p += sizeof(*ri); p += sizeof(*ri);
@@ -702,7 +705,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent)); err = adjust_snap_realm_parent(mdsc, realm, le64_to_cpu(ri->parent));
if (err < 0) if (err < 0)
goto fail; goto fail;
invalidate += err; rebuild_snapcs += err;
if (le64_to_cpu(ri->seq) > realm->seq) { if (le64_to_cpu(ri->seq) > realm->seq) {
dout("update_snap_trace updating %llx %p %lld -> %lld\n", dout("update_snap_trace updating %llx %p %lld -> %lld\n",
@@ -727,22 +730,30 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
if (realm->seq > mdsc->last_snap_seq) if (realm->seq > mdsc->last_snap_seq)
mdsc->last_snap_seq = realm->seq; mdsc->last_snap_seq = realm->seq;
invalidate = 1; rebuild_snapcs = 1;
} else if (!realm->cached_context) { } else if (!realm->cached_context) {
dout("update_snap_trace %llx %p seq %lld new\n", dout("update_snap_trace %llx %p seq %lld new\n",
realm->ino, realm, realm->seq); realm->ino, realm, realm->seq);
invalidate = 1; rebuild_snapcs = 1;
} else { } else {
dout("update_snap_trace %llx %p seq %lld unchanged\n", dout("update_snap_trace %llx %p seq %lld unchanged\n",
realm->ino, realm, realm->seq); realm->ino, realm, realm->seq);
} }
dout("done with %llx %p, invalidated=%d, %p %p\n", realm->ino, dout("done with %llx %p, rebuild_snapcs=%d, %p %p\n", realm->ino,
realm, invalidate, p, e); realm, rebuild_snapcs, p, e);
/* invalidate when we reach the _end_ (root) of the trace */ /*
if (invalidate && p >= e) * this will always track the uppest parent realm from which
rebuild_snap_realms(realm, &dirty_realms); * we need to rebuild the snapshot contexts _downward_ in
* hierarchy.
*/
if (rebuild_snapcs)
realm_to_rebuild = realm;
/* rebuild_snapcs when we reach the _end_ (root) of the trace */
if (realm_to_rebuild && p >= e)
rebuild_snap_realms(realm_to_rebuild, &dirty_realms);
if (!first_realm) if (!first_realm)
first_realm = realm; first_realm = realm;

View File

@@ -111,6 +111,13 @@ static void nilfs_dat_commit_free(struct inode *dat,
kunmap_atomic(kaddr); kunmap_atomic(kaddr);
nilfs_dat_commit_entry(dat, req); nilfs_dat_commit_entry(dat, req);
if (unlikely(req->pr_desc_bh == NULL || req->pr_bitmap_bh == NULL)) {
nilfs_error(dat->i_sb,
"state inconsistency probably due to duplicate use of vblocknr = %llu",
(unsigned long long)req->pr_entry_nr);
return;
}
nilfs_palloc_commit_free_entry(dat, req); nilfs_palloc_commit_free_entry(dat, req);
} }

View File

@@ -498,14 +498,22 @@ void nilfs_sufile_do_free(struct inode *sufile, __u64 segnum,
int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum) int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum)
{ {
struct buffer_head *bh; struct buffer_head *bh;
void *kaddr;
struct nilfs_segment_usage *su;
int ret; int ret;
down_write(&NILFS_MDT(sufile)->mi_sem);
ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh); ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh);
if (!ret) { if (!ret) {
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
nilfs_mdt_mark_dirty(sufile); nilfs_mdt_mark_dirty(sufile);
kaddr = kmap_atomic(bh->b_page);
su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
nilfs_segment_usage_set_dirty(su);
kunmap_atomic(kaddr);
brelse(bh); brelse(bh);
} }
up_write(&NILFS_MDT(sufile)->mi_sem);
return ret; return ret;
} }

View File

@@ -38,7 +38,7 @@ void dump_mm(const struct mm_struct *mm);
} \ } \
} while (0) } while (0)
#define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \ #define VM_WARN_ON_ONCE_PAGE(cond, page) ({ \
static bool __section(".data.once") __warned; \ static bool __section(.data.once) __warned; \
int __ret_warn_once = !!(cond); \ int __ret_warn_once = !!(cond); \
\ \
if (unlikely(__ret_warn_once && !__warned)) { \ if (unlikely(__ret_warn_once && !__warned)) { \

View File

@@ -177,7 +177,7 @@
#define AUDIT_MAX_KEY_LEN 256 #define AUDIT_MAX_KEY_LEN 256
#define AUDIT_BITMASK_SIZE 64 #define AUDIT_BITMASK_SIZE 64
#define AUDIT_WORD(nr) ((__u32)((nr)/32)) #define AUDIT_WORD(nr) ((__u32)((nr)/32))
#define AUDIT_BIT(nr) (1 << ((nr) - AUDIT_WORD(nr)*32)) #define AUDIT_BIT(nr) (1U << ((nr) - AUDIT_WORD(nr)*32))
#define AUDIT_SYSCALL_CLASSES 16 #define AUDIT_SYSCALL_CLASSES 16
#define AUDIT_CLASS_DIR_WRITE 0 #define AUDIT_CLASS_DIR_WRITE 0

View File

@@ -2148,6 +2148,7 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
* scenarios where we were awakened externally, during the * scenarios where we were awakened externally, during the
* window between wake_q_add() and wake_up_q(). * window between wake_q_add() and wake_up_q().
*/ */
rcu_read_lock();
error = READ_ONCE(queue.status); error = READ_ONCE(queue.status);
if (error != -EINTR) { if (error != -EINTR) {
/* /*
@@ -2157,10 +2158,10 @@ static long do_semtimedop(int semid, struct sembuf __user *tsops,
* overwritten by the previous owner of the semaphore. * overwritten by the previous owner of the semaphore.
*/ */
smp_mb(); smp_mb();
rcu_read_unlock();
goto out_free; goto out_free;
} }
rcu_read_lock();
locknum = sem_lock(sma, sops, nsops); locknum = sem_lock(sma, sops, nsops);
if (!ipc_valid_object(&sma->sem_perm)) if (!ipc_valid_object(&sma->sem_perm))

View File

@@ -2131,13 +2131,14 @@ int proc_dostring(struct ctl_table *table, int write,
(char __user *)buffer, lenp, ppos); (char __user *)buffer, lenp, ppos);
} }
static size_t proc_skip_spaces(char **buf) static void proc_skip_spaces(char **buf, size_t *size)
{ {
size_t ret; while (*size) {
char *tmp = skip_spaces(*buf); if (!isspace(**buf))
ret = tmp - *buf; break;
*buf = tmp; (*size)--;
return ret; (*buf)++;
}
} }
static void proc_skip_char(char **buf, size_t *size, const char v) static void proc_skip_char(char **buf, size_t *size, const char v)
@@ -2206,13 +2207,12 @@ static int proc_get_long(char **buf, size_t *size,
unsigned long *val, bool *neg, unsigned long *val, bool *neg,
const char *perm_tr, unsigned perm_tr_len, char *tr) const char *perm_tr, unsigned perm_tr_len, char *tr)
{ {
int len;
char *p, tmp[TMPBUFLEN]; char *p, tmp[TMPBUFLEN];
ssize_t len = *size;
if (!*size) if (len <= 0)
return -EINVAL; return -EINVAL;
len = *size;
if (len > TMPBUFLEN - 1) if (len > TMPBUFLEN - 1)
len = TMPBUFLEN - 1; len = TMPBUFLEN - 1;
@@ -2375,7 +2375,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
bool neg; bool neg;
if (write) { if (write) {
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
if (!left) if (!left)
break; break;
@@ -2406,7 +2406,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
if (!write && !first && left && !err) if (!write && !first && left && !err)
err = proc_put_char(&buffer, &left, '\n'); err = proc_put_char(&buffer, &left, '\n');
if (write && !err && left) if (write && !err && left)
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
if (write) { if (write) {
kfree(kbuf); kfree(kbuf);
if (first) if (first)
@@ -2455,7 +2455,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
if (IS_ERR(kbuf)) if (IS_ERR(kbuf))
return -EINVAL; return -EINVAL;
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
if (!left) { if (!left) {
err = -EINVAL; err = -EINVAL;
goto out_free; goto out_free;
@@ -2475,7 +2475,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
} }
if (!err && left) if (!err && left)
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
out_free: out_free:
kfree(kbuf); kfree(kbuf);
@@ -2896,7 +2896,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
if (write) { if (write) {
bool neg; bool neg;
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
if (!left) if (!left)
break; break;
@@ -2929,7 +2929,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
if (!write && !first && left && !err) if (!write && !first && left && !err)
err = proc_put_char(&buffer, &left, '\n'); err = proc_put_char(&buffer, &left, '\n');
if (write && !err) if (write && !err)
left -= proc_skip_spaces(&p); proc_skip_spaces(&p, &left);
if (write) { if (write) {
kfree(kbuf); kfree(kbuf);
if (first) if (first)

View File

@@ -224,8 +224,10 @@ config FRAME_WARN
int "Warn for stack frames larger than (needs gcc 4.4)" int "Warn for stack frames larger than (needs gcc 4.4)"
range 0 8192 range 0 8192
default 2048 if GCC_PLUGIN_LATENT_ENTROPY default 2048 if GCC_PLUGIN_LATENT_ENTROPY
default 1280 if (!64BIT && PARISC) default 2048 if PARISC
default 1024 if (!64BIT && !PARISC) default 1536 if (!64BIT && XTENSA)
default 1280 if KASAN && !64BIT
default 1024 if !64BIT
default 2048 if 64BIT default 2048 if 64BIT
help help
Tell gcc to warn at build time for stack frames larger than this. Tell gcc to warn at build time for stack frames larger than this.
@@ -1510,8 +1512,14 @@ config NETDEV_NOTIFIER_ERROR_INJECT
If unsure, say N. If unsure, say N.
config FUNCTION_ERROR_INJECTION config FUNCTION_ERROR_INJECTION
def_bool y bool "Fault-injections of functions"
depends on HAVE_FUNCTION_ERROR_INJECTION && KPROBES depends on HAVE_FUNCTION_ERROR_INJECTION && KPROBES
help
Add fault injections into various functions that are annotated with
ALLOW_ERROR_INJECTION() in the kernel. BPF may also modify the return
value of theses functions. This is useful to test error paths of code.
If unsure, say N
config FAULT_INJECTION config FAULT_INJECTION
bool "Fault-injection framework" bool "Fault-injection framework"

View File

@@ -37,7 +37,6 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
struct vm_area_struct *vma; struct vm_area_struct *vma;
int ret = 0; int ret = 0;
int err;
int locked; int locked;
if (nr_frames == 0) if (nr_frames == 0)
@@ -74,32 +73,14 @@ int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
vec->is_pfns = false; vec->is_pfns = false;
ret = get_user_pages_locked(start, nr_frames, ret = get_user_pages_locked(start, nr_frames,
gup_flags, (struct page **)(vec->ptrs), &locked); gup_flags, (struct page **)(vec->ptrs), &locked);
if (likely(ret > 0))
goto out; goto out;
} }
vec->got_ref = false; /* This used to (racily) return non-refcounted pfns. Let people know */
vec->is_pfns = true; WARN_ONCE(1, "get_vaddr_frames() cannot follow VM_IO mapping");
do { vec->nr_frames = 0;
unsigned long *nums = frame_vector_pfns(vec);
while (ret < nr_frames && start + PAGE_SIZE <= vma->vm_end) {
err = follow_pfn(vma, start, &nums[ret]);
if (err) {
if (ret == 0)
ret = err;
goto out;
}
start += PAGE_SIZE;
ret++;
}
/*
* We stop if we have enough pages or if VMA doesn't completely
* cover the tail page.
*/
if (ret >= nr_frames || start < vma->vm_end)
break;
vma = find_vma_intersection(mm, start, start + 1);
} while (vma && vma->vm_flags & (VM_IO | VM_PFNMAP));
out: out:
if (locked) if (locked)
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);

View File

@@ -215,9 +215,11 @@ static void p9_conn_cancel(struct p9_conn *m, int err)
list_for_each_entry_safe(req, rtmp, &m->req_list, req_list) { list_for_each_entry_safe(req, rtmp, &m->req_list, req_list) {
list_move(&req->req_list, &cancel_list); list_move(&req->req_list, &cancel_list);
req->status = REQ_STATUS_ERROR;
} }
list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) { list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) {
list_move(&req->req_list, &cancel_list); list_move(&req->req_list, &cancel_list);
req->status = REQ_STATUS_ERROR;
} }
spin_unlock(&m->client->lock); spin_unlock(&m->client->lock);
@@ -865,8 +867,10 @@ static int p9_socket_open(struct p9_client *client, struct socket *csocket)
struct file *file; struct file *file;
p = kzalloc(sizeof(struct p9_trans_fd), GFP_KERNEL); p = kzalloc(sizeof(struct p9_trans_fd), GFP_KERNEL);
if (!p) if (!p) {
sock_release(csocket);
return -ENOMEM; return -ENOMEM;
}
csocket->sk->sk_allocation = GFP_NOIO; csocket->sk->sk_allocation = GFP_NOIO;
file = sock_alloc_file(csocket, 0, NULL); file = sock_alloc_file(csocket, 0, NULL);

View File

@@ -5553,6 +5553,19 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn,
BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm), BT_DBG("psm 0x%2.2x scid 0x%4.4x mtu %u mps %u", __le16_to_cpu(psm),
scid, mtu, mps); scid, mtu, mps);
/* BLUETOOTH CORE SPECIFICATION Version 5.3 | Vol 3, Part A
* page 1059:
*
* Valid range: 0x0001-0x00ff
*
* Table 4.15: L2CAP_LE_CREDIT_BASED_CONNECTION_REQ SPSM ranges
*/
if (!psm || __le16_to_cpu(psm) > L2CAP_PSM_LE_DYN_END) {
result = L2CAP_CR_BAD_PSM;
chan = NULL;
goto response;
}
/* Check if we have socket listening on psm */ /* Check if we have socket listening on psm */
pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src, pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
&conn->hcon->dst, LE_LINK); &conn->hcon->dst, LE_LINK);

View File

@@ -134,6 +134,8 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
* This unhashes the socket and releases the local port, if necessary. * This unhashes the socket and releases the local port, if necessary.
*/ */
dccp_set_state(sk, DCCP_CLOSED); dccp_set_state(sk, DCCP_CLOSED);
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
inet_reset_saddr(sk);
ip_rt_put(rt); ip_rt_put(rt);
sk->sk_route_caps = 0; sk->sk_route_caps = 0;
inet->inet_dport = 0; inet->inet_dport = 0;

View File

@@ -957,6 +957,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
late_failure: late_failure:
dccp_set_state(sk, DCCP_CLOSED); dccp_set_state(sk, DCCP_CLOSED);
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
inet_reset_saddr(sk);
__sk_dst_reset(sk); __sk_dst_reset(sk);
failure: failure:
inet->inet_dport = 0; inet->inet_dport = 0;

View File

@@ -207,17 +207,18 @@ static void hsr_deliver_master(struct sk_buff *skb, struct net_device *dev,
struct hsr_node *node_src) struct hsr_node *node_src)
{ {
bool was_multicast_frame; bool was_multicast_frame;
int res; int res, recv_len;
was_multicast_frame = (skb->pkt_type == PACKET_MULTICAST); was_multicast_frame = (skb->pkt_type == PACKET_MULTICAST);
hsr_addr_subst_source(node_src, skb); hsr_addr_subst_source(node_src, skb);
skb_pull(skb, ETH_HLEN); skb_pull(skb, ETH_HLEN);
recv_len = skb->len;
res = netif_rx(skb); res = netif_rx(skb);
if (res == NET_RX_DROP) { if (res == NET_RX_DROP) {
dev->stats.rx_dropped++; dev->stats.rx_dropped++;
} else { } else {
dev->stats.rx_packets++; dev->stats.rx_packets++;
dev->stats.rx_bytes += skb->len; dev->stats.rx_bytes += recv_len;
if (was_multicast_frame) if (was_multicast_frame)
dev->stats.multicast++; dev->stats.multicast++;
} }

View File

@@ -388,6 +388,16 @@ config INET_IPCOMP
If unsure, say Y. If unsure, say Y.
config INET_TABLE_PERTURB_ORDER
int "INET: Source port perturbation table size (as power of 2)" if EXPERT
default 16
help
Source port perturbation table size (as power of 2) for
RFC 6056 3.3.4. Algorithm 4: Double-Hash Port Selection Algorithm.
The default is almost always what you want.
Only change this if you know what you are doing.
config INET_XFRM_TUNNEL config INET_XFRM_TUNNEL
tristate tristate
select INET_TUNNEL select INET_TUNNEL

View File

@@ -718,13 +718,13 @@ EXPORT_SYMBOL_GPL(inet_unhash);
* Note that we use 32bit integers (vs RFC 'short integers') * Note that we use 32bit integers (vs RFC 'short integers')
* because 2^16 is not a multiple of num_ephemeral and this * because 2^16 is not a multiple of num_ephemeral and this
* property might be used by clever attacker. * property might be used by clever attacker.
*
* RFC claims using TABLE_LENGTH=10 buckets gives an improvement, though * RFC claims using TABLE_LENGTH=10 buckets gives an improvement, though
* attacks were since demonstrated, thus we use 65536 instead to really * attacks were since demonstrated, thus we use 65536 by default instead
* give more isolation and privacy, at the expense of 256kB of kernel * to really give more isolation and privacy, at the expense of 256kB
* memory. * of kernel memory.
*/ */
#define INET_TABLE_PERTURB_SHIFT 16 #define INET_TABLE_PERTURB_SIZE (1 << CONFIG_INET_TABLE_PERTURB_ORDER)
#define INET_TABLE_PERTURB_SIZE (1 << INET_TABLE_PERTURB_SHIFT)
static u32 *table_perturb; static u32 *table_perturb;
int __inet_hash_connect(struct inet_timewait_death_row *death_row, int __inet_hash_connect(struct inet_timewait_death_row *death_row,

View File

@@ -328,6 +328,8 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
* if necessary. * if necessary.
*/ */
tcp_set_state(sk, TCP_CLOSE); tcp_set_state(sk, TCP_CLOSE);
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
inet_reset_saddr(sk);
ip_rt_put(rt); ip_rt_put(rt);
sk->sk_route_caps = 0; sk->sk_route_caps = 0;
inet->inet_dport = 0; inet->inet_dport = 0;

View File

@@ -166,6 +166,12 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
rtnl_lock(); rtnl_lock();
lock_sock(sk); lock_sock(sk);
/* Another thread has converted the socket into IPv4 with
* IPV6_ADDRFORM concurrently.
*/
if (unlikely(sk->sk_family != AF_INET6))
goto unlock;
switch (optname) { switch (optname) {
case IPV6_ADDRFORM: case IPV6_ADDRFORM:
@@ -913,6 +919,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
break; break;
} }
unlock:
release_sock(sk); release_sock(sk);
if (needs_rtnl) if (needs_rtnl)
rtnl_unlock(); rtnl_unlock();

View File

@@ -327,6 +327,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
late_failure: late_failure:
tcp_set_state(sk, TCP_CLOSE); tcp_set_state(sk, TCP_CLOSE);
if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
inet_reset_saddr(sk);
failure: failure:
inet->inet_dport = 0; inet->inet_dport = 0;
sk->sk_route_caps = 0; sk->sk_route_caps = 0;

View File

@@ -416,9 +416,13 @@ int __init xfrm6_init(void)
if (ret) if (ret)
goto out_state; goto out_state;
register_pernet_subsys(&xfrm6_net_ops); ret = register_pernet_subsys(&xfrm6_net_ops);
if (ret)
goto out_protocol;
out: out:
return ret; return ret;
out_protocol:
xfrm6_protocol_fini();
out_state: out_state:
xfrm6_state_fini(); xfrm6_state_fini();
out_policy: out_policy:

View File

@@ -2915,7 +2915,7 @@ static int count_ah_combs(const struct xfrm_tmpl *t)
break; break;
if (!aalg->pfkey_supported) if (!aalg->pfkey_supported)
continue; continue;
if (aalg_tmpl_set(t, aalg) && aalg->available) if (aalg_tmpl_set(t, aalg))
sz += sizeof(struct sadb_comb); sz += sizeof(struct sadb_comb);
} }
return sz + sizeof(struct sadb_prop); return sz + sizeof(struct sadb_prop);
@@ -2933,7 +2933,7 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
if (!ealg->pfkey_supported) if (!ealg->pfkey_supported)
continue; continue;
if (!(ealg_tmpl_set(t, ealg) && ealg->available)) if (!(ealg_tmpl_set(t, ealg)))
continue; continue;
for (k = 1; ; k++) { for (k = 1; ; k++) {
@@ -2944,16 +2944,17 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
if (!aalg->pfkey_supported) if (!aalg->pfkey_supported)
continue; continue;
if (aalg_tmpl_set(t, aalg) && aalg->available) if (aalg_tmpl_set(t, aalg))
sz += sizeof(struct sadb_comb); sz += sizeof(struct sadb_comb);
} }
} }
return sz + sizeof(struct sadb_prop); return sz + sizeof(struct sadb_prop);
} }
static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t) static int dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
{ {
struct sadb_prop *p; struct sadb_prop *p;
int sz = 0;
int i; int i;
p = skb_put(skb, sizeof(struct sadb_prop)); p = skb_put(skb, sizeof(struct sadb_prop));
@@ -2981,13 +2982,17 @@ static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
c->sadb_comb_soft_addtime = 20*60*60; c->sadb_comb_soft_addtime = 20*60*60;
c->sadb_comb_hard_usetime = 8*60*60; c->sadb_comb_hard_usetime = 8*60*60;
c->sadb_comb_soft_usetime = 7*60*60; c->sadb_comb_soft_usetime = 7*60*60;
sz += sizeof(*c);
} }
} }
return sz + sizeof(*p);
} }
static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t) static int dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
{ {
struct sadb_prop *p; struct sadb_prop *p;
int sz = 0;
int i, k; int i, k;
p = skb_put(skb, sizeof(struct sadb_prop)); p = skb_put(skb, sizeof(struct sadb_prop));
@@ -3029,8 +3034,11 @@ static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
c->sadb_comb_soft_addtime = 20*60*60; c->sadb_comb_soft_addtime = 20*60*60;
c->sadb_comb_hard_usetime = 8*60*60; c->sadb_comb_hard_usetime = 8*60*60;
c->sadb_comb_soft_usetime = 7*60*60; c->sadb_comb_soft_usetime = 7*60*60;
sz += sizeof(*c);
} }
} }
return sz + sizeof(*p);
} }
static int key_notify_policy_expire(struct xfrm_policy *xp, const struct km_event *c) static int key_notify_policy_expire(struct xfrm_policy *xp, const struct km_event *c)
@@ -3160,6 +3168,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
struct sadb_x_sec_ctx *sec_ctx; struct sadb_x_sec_ctx *sec_ctx;
struct xfrm_sec_ctx *xfrm_ctx; struct xfrm_sec_ctx *xfrm_ctx;
int ctx_size = 0; int ctx_size = 0;
int alg_size = 0;
sockaddr_size = pfkey_sockaddr_size(x->props.family); sockaddr_size = pfkey_sockaddr_size(x->props.family);
if (!sockaddr_size) if (!sockaddr_size)
@@ -3171,16 +3180,16 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
sizeof(struct sadb_x_policy); sizeof(struct sadb_x_policy);
if (x->id.proto == IPPROTO_AH) if (x->id.proto == IPPROTO_AH)
size += count_ah_combs(t); alg_size = count_ah_combs(t);
else if (x->id.proto == IPPROTO_ESP) else if (x->id.proto == IPPROTO_ESP)
size += count_esp_combs(t); alg_size = count_esp_combs(t);
if ((xfrm_ctx = x->security)) { if ((xfrm_ctx = x->security)) {
ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len); ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len);
size += sizeof(struct sadb_x_sec_ctx) + ctx_size; size += sizeof(struct sadb_x_sec_ctx) + ctx_size;
} }
skb = alloc_skb(size + 16, GFP_ATOMIC); skb = alloc_skb(size + alg_size + 16, GFP_ATOMIC);
if (skb == NULL) if (skb == NULL)
return -ENOMEM; return -ENOMEM;
@@ -3234,10 +3243,13 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
pol->sadb_x_policy_priority = xp->priority; pol->sadb_x_policy_priority = xp->priority;
/* Set sadb_comb's. */ /* Set sadb_comb's. */
alg_size = 0;
if (x->id.proto == IPPROTO_AH) if (x->id.proto == IPPROTO_AH)
dump_ah_combs(skb, t); alg_size = dump_ah_combs(skb, t);
else if (x->id.proto == IPPROTO_ESP) else if (x->id.proto == IPPROTO_ESP)
dump_esp_combs(skb, t); alg_size = dump_esp_combs(skb, t);
hdr->sadb_msg_len += alg_size / 8;
/* security context */ /* security context */
if (xfrm_ctx) { if (xfrm_ctx) {

View File

@@ -731,7 +731,7 @@ int mesh_path_send_to_gates(struct mesh_path *mpath)
void mesh_path_discard_frame(struct ieee80211_sub_if_data *sdata, void mesh_path_discard_frame(struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb) struct sk_buff *skb)
{ {
kfree_skb(skb); ieee80211_free_txskb(&sdata->local->hw, skb);
sdata->u.mesh.mshstats.dropped_frames_no_route++; sdata->u.mesh.mshstats.dropped_frames_no_route++;
} }

View File

@@ -542,7 +542,7 @@ static int nci_open_device(struct nci_dev *ndev)
skb_queue_purge(&ndev->tx_q); skb_queue_purge(&ndev->tx_q);
ndev->ops->close(ndev); ndev->ops->close(ndev);
ndev->flags = 0; ndev->flags &= BIT(NCI_UNREG);
} }
done: done:

View File

@@ -291,8 +291,10 @@ void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb)
nci_plen(skb->data)); nci_plen(skb->data));
conn_info = nci_get_conn_info_by_conn_id(ndev, nci_conn_id(skb->data)); conn_info = nci_get_conn_info_by_conn_id(ndev, nci_conn_id(skb->data));
if (!conn_info) if (!conn_info) {
kfree_skb(skb);
return; return;
}
/* strip the nci data header */ /* strip the nci data header */
skb_pull(skb, NCI_DATA_HDR_SIZE); skb_pull(skb, NCI_DATA_HDR_SIZE);

View File

@@ -2209,8 +2209,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
if (skb->ip_summed == CHECKSUM_PARTIAL) if (skb->ip_summed == CHECKSUM_PARTIAL)
status |= TP_STATUS_CSUMNOTREADY; status |= TP_STATUS_CSUMNOTREADY;
else if (skb->pkt_type != PACKET_OUTGOING && else if (skb->pkt_type != PACKET_OUTGOING &&
(skb->ip_summed == CHECKSUM_COMPLETE || skb_csum_unnecessary(skb))
skb_csum_unnecessary(skb)))
status |= TP_STATUS_CSUM_VALID; status |= TP_STATUS_CSUM_VALID;
if (snaplen > res) if (snaplen > res)
@@ -3452,8 +3451,7 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
if (skb->ip_summed == CHECKSUM_PARTIAL) if (skb->ip_summed == CHECKSUM_PARTIAL)
aux.tp_status |= TP_STATUS_CSUMNOTREADY; aux.tp_status |= TP_STATUS_CSUMNOTREADY;
else if (skb->pkt_type != PACKET_OUTGOING && else if (skb->pkt_type != PACKET_OUTGOING &&
(skb->ip_summed == CHECKSUM_COMPLETE || skb_csum_unnecessary(skb))
skb_csum_unnecessary(skb)))
aux.tp_status |= TP_STATUS_CSUM_VALID; aux.tp_status |= TP_STATUS_CSUM_VALID;
aux.tp_len = origlen; aux.tp_len = origlen;

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