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:
2
Makefile
2
Makefile
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -15,22 +15,20 @@
|
|||||||
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>;
|
regulator-max-microvolt = <3300000>;
|
||||||
regulator-max-microvolt = <3300000>;
|
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 */
|
||||||
|
|||||||
@@ -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";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
__this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
|
if (fn != __this_cpu_read(bp_hardening_data.fn)) {
|
||||||
__this_cpu_write(bp_hardening_data.fn, fn);
|
__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.fn, fn);
|
||||||
|
__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);
|
||||||
}
|
}
|
||||||
|
|
||||||
__this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
|
if (hyp_vecs_start != __this_cpu_read(bp_hardening_data.template_start)) {
|
||||||
__this_cpu_write(bp_hardening_data.template_start, hyp_vecs_start);
|
__this_cpu_write(bp_hardening_data.hyp_vectors_slot, slot);
|
||||||
|
__this_cpu_write(bp_hardening_data.template_start,
|
||||||
|
hyp_vecs_start);
|
||||||
|
}
|
||||||
spin_unlock(&bp_lock);
|
spin_unlock(&bp_lock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -1240,7 +1246,13 @@ 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:
|
||||||
kvm_setup_bhb_slot(__spectre_bhb_loop_k8_start);
|
/*
|
||||||
|
* 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);
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
kvm_setup_bhb_slot(__spectre_bhb_loop_k24_start);
|
kvm_setup_bhb_slot(__spectre_bhb_loop_k24_start);
|
||||||
|
|||||||
@@ -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_ */
|
||||||
|
|||||||
@@ -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,16 +138,15 @@ 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)
|
||||||
port = EARLY_CONSOLE_PORT;
|
port = EARLY_CONSOLE_PORT;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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: *;
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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")) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)\
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,8 +2451,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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", },
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -697,7 +697,8 @@ 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);
|
||||||
mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0);
|
if (!err)
|
||||||
|
mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 +
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)",
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)) { \
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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);
|
||||||
goto out;
|
if (likely(ret > 0))
|
||||||
|
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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user