mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 05:15:23 +02:00
Merge branch 'v5.4/standard/base' into v5.4/standard/intel-x86
This commit is contained in:
commit
b0203226f5
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 278
|
||||
SUBLEVEL = 279
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
&keypad {
|
||||
samsung,keypad-num-rows = <2>;
|
||||
samsung,keypad-num-columns = <8>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
|
|
|
@ -431,7 +431,7 @@
|
|||
&keypad {
|
||||
samsung,keypad-num-rows = <3>;
|
||||
samsung,keypad-num-columns = <2>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
pinctrl-names = "default";
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
&keypad {
|
||||
samsung,keypad-num-rows = <3>;
|
||||
samsung,keypad-num-columns = <8>;
|
||||
linux,keypad-no-autorepeat;
|
||||
linux,input-no-autorepeat;
|
||||
wakeup-source;
|
||||
pinctrl-0 = <&keypad_rows &keypad_cols>;
|
||||
pinctrl-names = "default";
|
||||
|
|
|
@ -124,6 +124,7 @@
|
|||
pinctrl-0 = <&hdmii2c_xfer>, <&hdmi_hpd>;
|
||||
power-domains = <&power RK3066_PD_VIO>;
|
||||
rockchip,grf = <&grf>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
vddrf-supply = <&vreg_l1_1p3>;
|
||||
vddch0-supply = <&vdd_ch0_3p3>;
|
||||
|
||||
local-bd-address = [ 02 00 00 00 5a ad ];
|
||||
local-bd-address = [ 00 00 00 00 00 00 ];
|
||||
|
||||
max-speed = <3200000>;
|
||||
};
|
||||
|
|
|
@ -686,6 +686,7 @@
|
|||
dma-names = "tx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_tx>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -697,6 +698,7 @@
|
|||
clocks = <&cru SCLK_I2S_2CH>, <&cru HCLK_I2S_2CH>;
|
||||
dmas = <&dmac_bus 6>, <&dmac_bus 7>;
|
||||
dma-names = "tx", "rx";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -710,6 +712,7 @@
|
|||
dma-names = "tx", "rx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s_8ch_bus>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#define __ARCH_WANT_SYS_CLONE3
|
||||
#define __ARCH_WANT_SET_GET_RLIMIT
|
||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
||||
#include <asm-generic/unistd.h>
|
||||
|
||||
#define __NR_set_thread_area (__NR_arch_specific_syscall + 0)
|
||||
|
|
6
arch/hexagon/include/asm/syscalls.h
Normal file
6
arch/hexagon/include/asm/syscalls.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <asm-generic/syscalls.h>
|
||||
|
||||
asmlinkage long sys_hexagon_fadvise64_64(int fd, int advice,
|
||||
u32 a2, u32 a3, u32 a4, u32 a5);
|
|
@ -36,5 +36,6 @@
|
|||
#define __ARCH_WANT_SYS_VFORK
|
||||
#define __ARCH_WANT_SYS_FORK
|
||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
||||
|
||||
#include <asm-generic/unistd.h>
|
||||
|
|
|
@ -14,6 +14,13 @@
|
|||
#undef __SYSCALL
|
||||
#define __SYSCALL(nr, call) [nr] = (call),
|
||||
|
||||
SYSCALL_DEFINE6(hexagon_fadvise64_64, int, fd, int, advice,
|
||||
SC_ARG64(offset), SC_ARG64(len))
|
||||
{
|
||||
return ksys_fadvise64_64(fd, SC_VAL64(loff_t, offset), SC_VAL64(loff_t, len), advice);
|
||||
}
|
||||
#define sys_fadvise64_64 sys_hexagon_fadvise64_64
|
||||
|
||||
void *sys_call_table[__NR_syscalls] = {
|
||||
#include <asm/unistd.h>
|
||||
};
|
||||
|
|
|
@ -110,7 +110,8 @@ static void bcm6358_quirks(void)
|
|||
* RAC flush causes kernel panics on BCM6358 when booting from TP1
|
||||
* because the bootloader is not initializing it properly.
|
||||
*/
|
||||
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31));
|
||||
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) ||
|
||||
!!BMIPS_GET_CBR();
|
||||
}
|
||||
|
||||
static void bcm6368_quirks(void)
|
||||
|
|
|
@ -112,8 +112,8 @@ retry:
|
|||
* gives them time to settle
|
||||
*/
|
||||
if (where == PCI_VENDOR_ID) {
|
||||
if (ret == 0xffffffff || ret == 0x00000000 ||
|
||||
ret == 0x0000ffff || ret == 0xffff0000) {
|
||||
if (*val == 0xffffffff || *val == 0x00000000 ||
|
||||
*val == 0x0000ffff || *val == 0xffff0000) {
|
||||
if (delay > 4)
|
||||
return 0;
|
||||
delay *= 2;
|
||||
|
|
6
arch/mips/pci/pcie-octeon.c
Normal file → Executable file
6
arch/mips/pci/pcie-octeon.c
Normal file → Executable file
|
@ -230,12 +230,18 @@ static inline uint64_t __cvmx_pcie_build_config_addr(int pcie_port, int bus,
|
|||
{
|
||||
union cvmx_pcie_address pcie_addr;
|
||||
union cvmx_pciercx_cfg006 pciercx_cfg006;
|
||||
union cvmx_pciercx_cfg032 pciercx_cfg032;
|
||||
|
||||
pciercx_cfg006.u32 =
|
||||
cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG006(pcie_port));
|
||||
if ((bus <= pciercx_cfg006.s.pbnum) && (dev != 0))
|
||||
return 0;
|
||||
|
||||
pciercx_cfg032.u32 =
|
||||
cvmx_pcie_cfgx_read(pcie_port, CVMX_PCIERCX_CFG032(pcie_port));
|
||||
if ((pciercx_cfg032.s.dlla == 0) || (pciercx_cfg032.s.lt == 1))
|
||||
return 0;
|
||||
|
||||
pcie_addr.u64 = 0;
|
||||
pcie_addr.config.upper = 2;
|
||||
pcie_addr.config.io = 1;
|
||||
|
|
|
@ -108,7 +108,7 @@
|
|||
95 common fchown sys_fchown
|
||||
96 common getpriority sys_getpriority
|
||||
97 common setpriority sys_setpriority
|
||||
98 common recv sys_recv
|
||||
98 common recv sys_recv compat_sys_recv
|
||||
99 common statfs sys_statfs compat_sys_statfs
|
||||
100 common fstatfs sys_fstatfs compat_sys_fstatfs
|
||||
101 common stat64 sys_stat64
|
||||
|
@ -135,7 +135,7 @@
|
|||
120 common clone sys_clone_wrapper
|
||||
121 common setdomainname sys_setdomainname
|
||||
122 common sendfile sys_sendfile compat_sys_sendfile
|
||||
123 common recvfrom sys_recvfrom
|
||||
123 common recvfrom sys_recvfrom compat_sys_recvfrom
|
||||
124 32 adjtimex sys_adjtimex_time32
|
||||
124 64 adjtimex sys_adjtimex
|
||||
125 common mprotect sys_mprotect
|
||||
|
|
|
@ -403,7 +403,7 @@ long plpar_hcall_norets(unsigned long opcode, ...);
|
|||
* Used for all but the craziest of phyp interfaces (see plpar_hcall9)
|
||||
*/
|
||||
#define PLPAR_HCALL_BUFSIZE 4
|
||||
long plpar_hcall(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL_BUFSIZE], ...);
|
||||
|
||||
/**
|
||||
* plpar_hcall_raw: - Make a hypervisor call without calculating hcall stats
|
||||
|
@ -417,7 +417,7 @@ long plpar_hcall(unsigned long opcode, unsigned long *retbuf, ...);
|
|||
* plpar_hcall, but plpar_hcall_raw works in real mode and does not
|
||||
* calculate hypervisor call statistics.
|
||||
*/
|
||||
long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall_raw(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL_BUFSIZE], ...);
|
||||
|
||||
/**
|
||||
* plpar_hcall9: - Make a pseries hypervisor call with up to 9 return arguments
|
||||
|
@ -428,8 +428,8 @@ long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
|||
* PLPAR_HCALL9_BUFSIZE to size the return argument buffer.
|
||||
*/
|
||||
#define PLPAR_HCALL9_BUFSIZE 9
|
||||
long plpar_hcall9(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall9_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall9(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL9_BUFSIZE], ...);
|
||||
long plpar_hcall9_raw(unsigned long opcode, unsigned long retbuf[static PLPAR_HCALL9_BUFSIZE], ...);
|
||||
|
||||
struct hvcall_mpp_data {
|
||||
unsigned long entitled_mem;
|
||||
|
|
|
@ -542,12 +542,12 @@ __do_out_asm(_rec_outl, "stwbrx")
|
|||
#define __do_inw(port) _rec_inw(port)
|
||||
#define __do_inl(port) _rec_inl(port)
|
||||
#else /* CONFIG_PPC32 */
|
||||
#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)_IO_BASE+port);
|
||||
#define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_inw(port) readw((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_inl(port) readl((PCI_IO_ADDR)_IO_BASE + port);
|
||||
#define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_outw(val, port) writew(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_outl(val, port) writel(val,(PCI_IO_ADDR)(_IO_BASE+port));
|
||||
#define __do_inb(port) readb((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#define __do_inw(port) readw((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#define __do_inl(port) readl((PCI_IO_ADDR)(_IO_BASE + port));
|
||||
#endif /* !CONFIG_PPC32 */
|
||||
|
||||
#ifdef CONFIG_EEH
|
||||
|
@ -563,12 +563,12 @@ __do_out_asm(_rec_outl, "stwbrx")
|
|||
#define __do_writesw(a, b, n) _outsw(PCI_FIX_ADDR(a),(b),(n))
|
||||
#define __do_writesl(a, b, n) _outsl(PCI_FIX_ADDR(a),(b),(n))
|
||||
|
||||
#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
|
||||
#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
|
||||
#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)(_IO_BASE+(p)), (b), (n))
|
||||
#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)(_IO_BASE+(p)),(b),(n))
|
||||
|
||||
#define __do_memset_io(addr, c, n) \
|
||||
_memset_io(PCI_FIX_ADDR(addr), c, n)
|
||||
|
|
|
@ -117,7 +117,7 @@
|
|||
90 common dup2 sys_dup2
|
||||
91 32 setfsuid32 sys_setfsuid
|
||||
92 common fcntl sys_fcntl compat_sys_fcntl
|
||||
93 common select sys_select
|
||||
93 common select sys_select compat_sys_select
|
||||
94 32 setfsgid32 sys_setfsgid
|
||||
95 common fsync sys_fsync
|
||||
96 common setpriority sys_setpriority
|
||||
|
|
|
@ -166,7 +166,14 @@ out:
|
|||
|
||||
int amd_smn_read(u16 node, u32 address, u32 *value)
|
||||
{
|
||||
return __amd_smn_rw(node, address, value, false);
|
||||
int err = __amd_smn_rw(node, address, value, false);
|
||||
|
||||
if (PCI_POSSIBLE_ERROR(*value)) {
|
||||
err = -ENODEV;
|
||||
*value = 0;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amd_smn_read);
|
||||
|
||||
|
|
|
@ -27,25 +27,7 @@
|
|||
|
||||
unsigned long profile_pc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
|
||||
if (!user_mode(regs) && in_lock_functions(pc)) {
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
return *(unsigned long *)(regs->bp + sizeof(long));
|
||||
#else
|
||||
unsigned long *sp = (unsigned long *)regs->sp;
|
||||
/*
|
||||
* Return address is either directly at stack pointer
|
||||
* or above a saved flags. Eflags has bits 22-31 zero,
|
||||
* kernel addresses don't.
|
||||
*/
|
||||
if (sp[0] >> 22)
|
||||
return sp[0];
|
||||
if (sp[1] >> 22)
|
||||
return sp[1];
|
||||
#endif
|
||||
}
|
||||
return pc;
|
||||
return instruction_pointer(regs);
|
||||
}
|
||||
EXPORT_SYMBOL(profile_pc);
|
||||
|
||||
|
|
|
@ -43,7 +43,6 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
struct acpi_mem_space_context *mem_info = region_context;
|
||||
u32 length;
|
||||
acpi_size map_length;
|
||||
acpi_size page_boundary_map_length;
|
||||
#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
|
||||
u32 remainder;
|
||||
#endif
|
||||
|
@ -120,26 +119,8 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
map_length = (acpi_size)
|
||||
((mem_info->address + mem_info->length) - address);
|
||||
|
||||
/*
|
||||
* If mapping the entire remaining portion of the region will cross
|
||||
* a page boundary, just map up to the page boundary, do not cross.
|
||||
* On some systems, crossing a page boundary while mapping regions
|
||||
* can cause warnings if the pages have different attributes
|
||||
* due to resource management.
|
||||
*
|
||||
* This has the added benefit of constraining a single mapping to
|
||||
* one page, which is similar to the original code that used a 4k
|
||||
* maximum window.
|
||||
*/
|
||||
page_boundary_map_length = (acpi_size)
|
||||
(ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address);
|
||||
if (page_boundary_map_length == 0) {
|
||||
page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (map_length > page_boundary_map_length) {
|
||||
map_length = page_boundary_map_length;
|
||||
}
|
||||
if (map_length > ACPI_DEFAULT_PAGE_SIZE)
|
||||
map_length = ACPI_DEFAULT_PAGE_SIZE;
|
||||
|
||||
/* Create a new mapping starting at the address given */
|
||||
|
||||
|
|
|
@ -6194,8 +6194,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
|||
if (!host)
|
||||
return NULL;
|
||||
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
||||
goto err_free;
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
|
||||
if (!dr)
|
||||
|
@ -6227,8 +6229,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
|||
|
||||
err_out:
|
||||
devres_release_group(dev, NULL);
|
||||
err_free:
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -1273,8 +1273,11 @@ static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
|
|||
if (!env)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Synchronize with really_probe() */
|
||||
device_lock(dev);
|
||||
/* let the kset specific function add its keys */
|
||||
retval = kset->uevent_ops->uevent(kset, &dev->kobj, env);
|
||||
device_unlock(dev);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
* Copyright (c) 2008-2009 Atheros Communications Inc.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -129,7 +128,6 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
|
|||
* for AR3012
|
||||
*/
|
||||
static const struct usb_device_id ath3k_blist_tbl[] = {
|
||||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
|
||||
|
@ -203,7 +201,7 @@ static inline void ath3k_log_failed_loading(int err, int len, int size,
|
|||
#define TIMEGAP_USEC_MAX 100
|
||||
|
||||
static int ath3k_load_firmware(struct usb_device *udev,
|
||||
const struct firmware *firmware)
|
||||
const struct firmware *firmware)
|
||||
{
|
||||
u8 *send_buf;
|
||||
int len = 0;
|
||||
|
@ -241,9 +239,9 @@ static int ath3k_load_firmware(struct usb_device *udev,
|
|||
memcpy(send_buf, firmware->data + sent, size);
|
||||
|
||||
err = usb_bulk_msg(udev, pipe, send_buf, size,
|
||||
&len, 3000);
|
||||
&len, 3000);
|
||||
|
||||
if (err || (len != size)) {
|
||||
if (err || len != size) {
|
||||
ath3k_log_failed_loading(err, len, size, count);
|
||||
goto error;
|
||||
}
|
||||
|
@ -278,7 +276,7 @@ static int ath3k_get_state(struct usb_device *udev, unsigned char *state)
|
|||
}
|
||||
|
||||
static int ath3k_get_version(struct usb_device *udev,
|
||||
struct ath3k_version *version)
|
||||
struct ath3k_version *version)
|
||||
{
|
||||
int ret, pipe = 0;
|
||||
struct ath3k_version *buf;
|
||||
|
@ -300,7 +298,7 @@ static int ath3k_get_version(struct usb_device *udev,
|
|||
}
|
||||
|
||||
static int ath3k_load_fwfile(struct usb_device *udev,
|
||||
const struct firmware *firmware)
|
||||
const struct firmware *firmware)
|
||||
{
|
||||
u8 *send_buf;
|
||||
int len = 0;
|
||||
|
@ -341,8 +339,8 @@ static int ath3k_load_fwfile(struct usb_device *udev,
|
|||
memcpy(send_buf, firmware->data + sent, size);
|
||||
|
||||
err = usb_bulk_msg(udev, pipe, send_buf, size,
|
||||
&len, 3000);
|
||||
if (err || (len != size)) {
|
||||
&len, 3000);
|
||||
if (err || len != size) {
|
||||
ath3k_log_failed_loading(err, len, size, count);
|
||||
kfree(send_buf);
|
||||
return err;
|
||||
|
@ -461,7 +459,6 @@ static int ath3k_load_syscfg(struct usb_device *udev)
|
|||
}
|
||||
|
||||
switch (fw_version.ref_clock) {
|
||||
|
||||
case ATH3K_XTAL_FREQ_26M:
|
||||
clk_value = 26;
|
||||
break;
|
||||
|
@ -477,7 +474,7 @@ static int ath3k_load_syscfg(struct usb_device *udev)
|
|||
}
|
||||
|
||||
snprintf(filename, ATH3K_NAME_LEN, "ar3k/ramps_0x%08x_%d%s",
|
||||
le32_to_cpu(fw_version.rom_version), clk_value, ".dfu");
|
||||
le32_to_cpu(fw_version.rom_version), clk_value, ".dfu");
|
||||
|
||||
ret = request_firmware(&firmware, filename, &udev->dev);
|
||||
if (ret < 0) {
|
||||
|
@ -492,7 +489,7 @@ static int ath3k_load_syscfg(struct usb_device *udev)
|
|||
}
|
||||
|
||||
static int ath3k_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
const struct firmware *firmware;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
|
@ -541,10 +538,10 @@ static int ath3k_probe(struct usb_interface *intf,
|
|||
if (ret < 0) {
|
||||
if (ret == -ENOENT)
|
||||
BT_ERR("Firmware file \"%s\" not found",
|
||||
ATH3K_FIRMWARE);
|
||||
ATH3K_FIRMWARE);
|
||||
else
|
||||
BT_ERR("Firmware file \"%s\" request failed (err=%d)",
|
||||
ATH3K_FIRMWARE, ret);
|
||||
ATH3K_FIRMWARE, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -947,8 +947,8 @@ static int axi_dmac_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct axi_dmac *dmac = platform_get_drvdata(pdev);
|
||||
|
||||
of_dma_controller_free(pdev->dev.of_node);
|
||||
free_irq(dmac->irq, dmac);
|
||||
of_dma_controller_free(pdev->dev.of_node);
|
||||
tasklet_kill(&dmac->chan.vchan.task);
|
||||
dma_async_device_unregister(&dmac->dma_dev);
|
||||
clk_disable_unprepare(dmac->clk);
|
||||
|
|
|
@ -1446,6 +1446,7 @@ module_init(ioat_init_module);
|
|||
static void __exit ioat_exit_module(void)
|
||||
{
|
||||
pci_unregister_driver(&ioat_pci_driver);
|
||||
kmem_cache_destroy(ioat_sed_cache);
|
||||
kmem_cache_destroy(ioat_cache);
|
||||
}
|
||||
module_exit(ioat_exit_module);
|
||||
|
|
|
@ -1230,7 +1230,7 @@ config GPIO_TPS68470
|
|||
drivers are loaded.
|
||||
|
||||
config GPIO_TQMX86
|
||||
tristate "TQ-Systems QTMX86 GPIO"
|
||||
tristate "TQ-Systems TQMx86 GPIO"
|
||||
depends on MFD_TQMX86 || COMPILE_TEST
|
||||
depends on HAS_IOPORT_MAP
|
||||
select GPIOLIB_IRQCHIP
|
||||
|
|
|
@ -227,6 +227,11 @@ static int davinci_gpio_probe(struct platform_device *pdev)
|
|||
else
|
||||
nirq = DIV_ROUND_UP(ngpio, 16);
|
||||
|
||||
if (nirq > MAX_INT_PER_BANK) {
|
||||
dev_err(dev, "Too many IRQs!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
chips = devm_kzalloc(dev, sizeof(*chips), GFP_KERNEL);
|
||||
if (!chips)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -163,6 +163,8 @@ static void sumo_construct_vid_mapping_table(struct amdgpu_device *adev,
|
|||
|
||||
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) {
|
||||
if (table[i].ulSupportedSCLK != 0) {
|
||||
if (table[i].usVoltageIndex >= SUMO_MAX_NUMBER_VOLTAGES)
|
||||
continue;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_7bit =
|
||||
table[i].usVoltageID;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_2bit =
|
||||
|
|
|
@ -635,6 +635,12 @@ void enc1_stream_encoder_set_mst_bandwidth(
|
|||
x),
|
||||
26));
|
||||
|
||||
// If y rounds up to integer, carry it over to x.
|
||||
if (y >> 26) {
|
||||
x += 1;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
REG_SET_2(DP_MSE_RATE_CNTL, 0,
|
||||
DP_MSE_RATE_X, x,
|
||||
DP_MSE_RATE_Y, y);
|
||||
|
|
|
@ -259,7 +259,7 @@ komeda_component_get_avail_scaler(struct komeda_component *c,
|
|||
u32 avail_scalers;
|
||||
|
||||
pipe_st = komeda_pipeline_get_state(c->pipeline, state);
|
||||
if (!pipe_st)
|
||||
if (IS_ERR_OR_NULL(pipe_st))
|
||||
return NULL;
|
||||
|
||||
avail_scalers = (pipe_st->active_comps & KOMEDA_PIPELINE_SCALERS) ^
|
||||
|
|
|
@ -203,9 +203,12 @@ EXPORT_SYMBOL(drm_panel_bridge_remove);
|
|||
|
||||
static void devm_drm_panel_bridge_release(struct device *dev, void *res)
|
||||
{
|
||||
struct drm_bridge **bridge = res;
|
||||
struct drm_bridge *bridge = *(struct drm_bridge **)res;
|
||||
|
||||
drm_panel_bridge_remove(*bridge);
|
||||
if (!bridge)
|
||||
return;
|
||||
|
||||
drm_bridge_remove(bridge);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -301,6 +301,7 @@ static int vidi_get_modes(struct drm_connector *connector)
|
|||
struct vidi_context *ctx = ctx_from_connector(connector);
|
||||
struct edid *edid;
|
||||
int edid_len;
|
||||
int count;
|
||||
|
||||
/*
|
||||
* the edid data comes from user side and it would be set
|
||||
|
@ -320,7 +321,11 @@ static int vidi_get_modes(struct drm_connector *connector)
|
|||
|
||||
drm_connector_update_edid_property(connector, edid);
|
||||
|
||||
return drm_add_edid_modes(connector, edid);
|
||||
count = drm_add_edid_modes(connector, edid);
|
||||
|
||||
kfree(edid);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct drm_connector_helper_funcs vidi_connector_helper_funcs = {
|
||||
|
|
|
@ -876,11 +876,11 @@ static int hdmi_get_modes(struct drm_connector *connector)
|
|||
int ret;
|
||||
|
||||
if (!hdata->ddc_adpt)
|
||||
return 0;
|
||||
goto no_edid;
|
||||
|
||||
edid = drm_get_edid(connector, hdata->ddc_adpt);
|
||||
if (!edid)
|
||||
return 0;
|
||||
goto no_edid;
|
||||
|
||||
hdata->dvi_mode = !drm_detect_hdmi_monitor(edid);
|
||||
DRM_DEV_DEBUG_KMS(hdata->dev, "%s : width[%d] x height[%d]\n",
|
||||
|
@ -895,6 +895,9 @@ static int hdmi_get_modes(struct drm_connector *connector)
|
|||
kfree(edid);
|
||||
|
||||
return ret;
|
||||
|
||||
no_edid:
|
||||
return drm_add_modes_noedid(connector, 640, 480);
|
||||
}
|
||||
|
||||
static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
|
||||
|
|
|
@ -208,6 +208,8 @@ static int nv17_tv_get_ld_modes(struct drm_encoder *encoder,
|
|||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_mode_duplicate(encoder->dev, tv_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
mode->clock = tv_norm->tv_enc_mode.vrefresh *
|
||||
mode->htotal / 1000 *
|
||||
|
@ -257,6 +259,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
|||
if (modes[i].hdisplay == output_mode->hdisplay &&
|
||||
modes[i].vdisplay == output_mode->vdisplay) {
|
||||
mode = drm_mode_duplicate(encoder->dev, output_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
|
||||
} else {
|
||||
|
@ -264,6 +268,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
|||
modes[i].vdisplay, 60, false,
|
||||
(output_mode->flags &
|
||||
DRM_MODE_FLAG_INTERLACE), false);
|
||||
if (!mode)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* CVT modes are sometimes unsuitable... */
|
||||
|
|
|
@ -307,10 +307,10 @@ static int ili9881c_prepare(struct drm_panel *panel)
|
|||
msleep(5);
|
||||
|
||||
/* And reset it */
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
msleep(20);
|
||||
|
||||
gpiod_set_value(ctx->reset, 0);
|
||||
gpiod_set_value_cansleep(ctx->reset, 0);
|
||||
msleep(20);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ili9881c_init); i++) {
|
||||
|
@ -367,7 +367,7 @@ static int ili9881c_unprepare(struct drm_panel *panel)
|
|||
|
||||
mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
|
||||
regulator_disable(ctx->power);
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1621,6 +1621,8 @@ void sumo_construct_vid_mapping_table(struct radeon_device *rdev,
|
|||
|
||||
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++) {
|
||||
if (table[i].ulSupportedSCLK != 0) {
|
||||
if (table[i].usVoltageIndex >= SUMO_MAX_NUMBER_VOLTAGES)
|
||||
continue;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_7bit =
|
||||
table[i].usVoltageID;
|
||||
vid_mapping_table->entries[table[i].usVoltageIndex].vid_2bit =
|
||||
|
|
|
@ -694,6 +694,7 @@ static void gb_interface_release(struct device *dev)
|
|||
|
||||
trace_gb_interface_release(intf);
|
||||
|
||||
cancel_work_sync(&intf->mode_switch_work);
|
||||
kfree(intf);
|
||||
}
|
||||
|
||||
|
|
|
@ -1439,7 +1439,6 @@ static void implement(const struct hid_device *hid, u8 *report,
|
|||
hid_warn(hid,
|
||||
"%s() called with too large value %d (n: %d)! (%s)\n",
|
||||
__func__, value, n, current->comm);
|
||||
WARN_ON(1);
|
||||
value &= m;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1213,8 +1213,10 @@ static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
|
|||
*/
|
||||
msleep(50);
|
||||
|
||||
if (retval)
|
||||
if (retval) {
|
||||
kfree(dj_report);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -283,10 +283,23 @@ static void timesync_onchannelcallback(void *context)
|
|||
struct ictimesync_ref_data *refdata;
|
||||
u8 *time_txf_buf = util_timesynch.recv_buffer;
|
||||
|
||||
vmbus_recvpacket(channel, time_txf_buf,
|
||||
PAGE_SIZE, &recvlen, &requestid);
|
||||
/*
|
||||
* Drain the ring buffer and use the last packet to update
|
||||
* host_ts
|
||||
*/
|
||||
while (1) {
|
||||
int ret = vmbus_recvpacket(channel, time_txf_buf,
|
||||
HV_HYP_PAGE_SIZE, &recvlen,
|
||||
&requestid);
|
||||
if (ret) {
|
||||
pr_warn_once("TimeSync IC pkt recv failed (Err: %d)\n",
|
||||
ret);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!recvlen)
|
||||
break;
|
||||
|
||||
if (recvlen > 0) {
|
||||
icmsghdrp = (struct icmsg_hdr *)&time_txf_buf[
|
||||
sizeof(struct vmbuspipe_hdr)];
|
||||
|
||||
|
|
|
@ -294,11 +294,36 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
|||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xae24),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Meteor Lake-S */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7f26),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Raptor Lake-S */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7a26),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Granite Rapids */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x0963),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Granite Rapids SOC */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3256),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Sapphire Rapids SOC */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3456),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Lunar Lake */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa824),
|
||||
.driver_data = (kernel_ulong_t)&intel_th_2x,
|
||||
},
|
||||
{
|
||||
/* Rocket Lake CPU */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4c19),
|
||||
|
|
|
@ -106,8 +106,7 @@ static int at91_unreg_slave(struct i2c_client *slave)
|
|||
|
||||
static u32 at91_twi_func(struct i2c_adapter *adapter)
|
||||
{
|
||||
return I2C_FUNC_SLAVE | I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
|
||||
| I2C_FUNC_SMBUS_READ_BLOCK_DATA;
|
||||
return I2C_FUNC_SLAVE;
|
||||
}
|
||||
|
||||
static const struct i2c_algorithm at91_twi_algorithm_slave = {
|
||||
|
|
|
@ -443,8 +443,8 @@ static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
|||
oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8);
|
||||
|
||||
/* Init the device */
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -159,6 +159,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
|
|||
ret = ad7266_read_single(st, val, chan->address);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = (*val >> 2) & 0xfff;
|
||||
if (chan->scan_type.sign == 's')
|
||||
*val = sign_extend32(*val, 11);
|
||||
|
|
|
@ -54,7 +54,9 @@
|
|||
#define BME680_NB_CONV_MASK GENMASK(3, 0)
|
||||
|
||||
#define BME680_REG_MEAS_STAT_0 0x1D
|
||||
#define BME680_NEW_DATA_BIT BIT(7)
|
||||
#define BME680_GAS_MEAS_BIT BIT(6)
|
||||
#define BME680_MEAS_BIT BIT(5)
|
||||
|
||||
/* Calibration Parameters */
|
||||
#define BME680_T2_LSB_REG 0x8A
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/log2.h>
|
||||
|
@ -38,7 +39,7 @@ struct bme680_calib {
|
|||
s8 par_h3;
|
||||
s8 par_h4;
|
||||
s8 par_h5;
|
||||
s8 par_h6;
|
||||
u8 par_h6;
|
||||
s8 par_h7;
|
||||
s8 par_gh1;
|
||||
s16 par_gh2;
|
||||
|
@ -334,10 +335,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
|
|||
if (!calib->par_t2)
|
||||
bme680_read_calib(data, calib);
|
||||
|
||||
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
|
||||
var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
|
||||
var2 = (var1 * calib->par_t2) >> 11;
|
||||
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
|
||||
var3 = (var3 * (calib->par_t3 << 4)) >> 14;
|
||||
var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
|
||||
data->t_fine = var2 + var3;
|
||||
calc_temp = (data->t_fine * 5 + 128) >> 8;
|
||||
|
||||
|
@ -360,9 +361,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
|||
var1 = (data->t_fine >> 1) - 64000;
|
||||
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
|
||||
var2 = var2 + (var1 * calib->par_p5 << 1);
|
||||
var2 = (var2 >> 2) + (calib->par_p4 << 16);
|
||||
var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
|
||||
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
|
||||
(calib->par_p3 << 5)) >> 3) +
|
||||
((s32)calib->par_p3 << 5)) >> 3) +
|
||||
((calib->par_p2 * var1) >> 1);
|
||||
var1 = var1 >> 18;
|
||||
var1 = ((32768 + var1) * calib->par_p1) >> 15;
|
||||
|
@ -380,7 +381,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
|||
var3 = ((press_comp >> 8) * (press_comp >> 8) *
|
||||
(press_comp >> 8) * calib->par_p10) >> 17;
|
||||
|
||||
press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
|
||||
press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;
|
||||
|
||||
return press_comp;
|
||||
}
|
||||
|
@ -406,7 +407,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
|
|||
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
|
||||
>> 6) / 100) + (1 << 14))) >> 10;
|
||||
var3 = var1 * var2;
|
||||
var4 = calib->par_h6 << 7;
|
||||
var4 = (s32)calib->par_h6 << 7;
|
||||
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
|
||||
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
|
||||
var6 = (var4 * var5) >> 1;
|
||||
|
@ -524,6 +525,43 @@ static u8 bme680_oversampling_to_reg(u8 val)
|
|||
return ilog2(val) + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Taken from Bosch BME680 API:
|
||||
* https://github.com/boschsensortec/BME68x_SensorAPI/blob/v4.4.8/bme68x.c#L490
|
||||
*/
|
||||
static int bme680_wait_for_eoc(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
unsigned int check;
|
||||
int ret;
|
||||
/*
|
||||
* (Sum of oversampling ratios * time per oversampling) +
|
||||
* TPH measurement + gas measurement + wait transition from forced mode
|
||||
* + heater duration
|
||||
*/
|
||||
int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
|
||||
data->oversampling_humid) * 1936) + (477 * 4) +
|
||||
(477 * 5) + 1000 + (data->heater_dur * 1000);
|
||||
|
||||
usleep_range(wait_eoc_us, wait_eoc_us + 100);
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to read measurement status register.\n");
|
||||
return ret;
|
||||
}
|
||||
if (check & BME680_MEAS_BIT) {
|
||||
dev_err(dev, "Device measurement cycle incomplete.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
if (!(check & BME680_NEW_DATA_BIT)) {
|
||||
dev_err(dev, "No new data available from the device.\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bme680_chip_config(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
|
@ -614,6 +652,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
|
||||
(u8 *) &tmp, 3);
|
||||
if (ret < 0) {
|
||||
|
@ -670,7 +712,7 @@ static int bme680_read_press(struct bme680_data *data,
|
|||
}
|
||||
|
||||
*val = bme680_compensate_press(data, adc_press);
|
||||
*val2 = 100;
|
||||
*val2 = 1000;
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
}
|
||||
|
||||
|
@ -730,6 +772,10 @@ static int bme680_read_gas(struct bme680_data *data,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (check & BME680_GAS_MEAS_BIT) {
|
||||
dev_err(dev, "gas measurement incomplete\n");
|
||||
|
|
|
@ -157,7 +157,6 @@ static void ad5592r_gpio_cleanup(struct ad5592r_state *st)
|
|||
static int ad5592r_reset(struct ad5592r_state *st)
|
||||
{
|
||||
struct gpio_desc *gpio;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
|
||||
gpio = devm_gpiod_get_optional(st->dev, "reset", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(gpio))
|
||||
|
@ -167,10 +166,10 @@ static int ad5592r_reset(struct ad5592r_state *st)
|
|||
udelay(1);
|
||||
gpiod_set_value(gpio, 1);
|
||||
} else {
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
/* Writing this magic value resets the device */
|
||||
st->ops->reg_write(st, AD5592R_REG_RESET, 0xdac);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
}
|
||||
|
||||
udelay(250);
|
||||
|
@ -198,7 +197,6 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
|||
const struct ad5592r_rw_ops *ops = st->ops;
|
||||
int ret;
|
||||
unsigned i;
|
||||
struct iio_dev *iio_dev = iio_priv_to_dev(st);
|
||||
u8 pulldown = 0, tristate = 0, dac = 0, adc = 0;
|
||||
u16 read_back;
|
||||
|
||||
|
@ -248,7 +246,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
|||
}
|
||||
}
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
/* Pull down unused pins to GND */
|
||||
ret = ops->reg_write(st, AD5592R_REG_PULLDOWN, pulldown);
|
||||
|
@ -286,7 +284,7 @@ static int ad5592r_set_channel_modes(struct ad5592r_state *st)
|
|||
ret = -EIO;
|
||||
|
||||
err_unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -315,11 +313,11 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
|||
if (!chan->output)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
ret = st->ops->write_dac(st, chan->channel, val);
|
||||
if (!ret)
|
||||
st->cached_dac[chan->channel] = val;
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
if (chan->type == IIO_VOLTAGE) {
|
||||
|
@ -334,12 +332,12 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
|||
else
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
ret = st->ops->reg_read(st, AD5592R_REG_CTRL,
|
||||
&st->cached_gp_ctrl);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -361,7 +359,7 @@ static int ad5592r_write_raw(struct iio_dev *iio_dev,
|
|||
|
||||
ret = st->ops->reg_write(st, AD5592R_REG_CTRL,
|
||||
st->cached_gp_ctrl);
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -379,11 +377,11 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
|||
{
|
||||
struct ad5592r_state *st = iio_priv(iio_dev);
|
||||
u16 read_val;
|
||||
int ret;
|
||||
int ret, mult;
|
||||
|
||||
switch (m) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (!chan->output) {
|
||||
ret = st->ops->read_adc(st, chan->channel, &read_val);
|
||||
|
@ -416,29 +414,27 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
|||
s64 tmp = *val * (3767897513LL / 25LL);
|
||||
*val = div_s64_rem(tmp, 1000000000LL, val2);
|
||||
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
} else {
|
||||
int mult;
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
|
||||
if (chan->output)
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_DAC_RANGE);
|
||||
else
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_ADC_RANGE);
|
||||
|
||||
*val *= ++mult;
|
||||
|
||||
*val2 = chan->scan_type.realbits;
|
||||
ret = IIO_VAL_FRACTIONAL_LOG2;
|
||||
return IIO_VAL_INT_PLUS_NANO;
|
||||
}
|
||||
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (chan->output)
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_DAC_RANGE);
|
||||
else
|
||||
mult = !!(st->cached_gp_ctrl &
|
||||
AD5592R_REG_CTRL_ADC_RANGE);
|
||||
|
||||
*val *= ++mult;
|
||||
|
||||
*val2 = chan->scan_type.realbits;
|
||||
ret = IIO_VAL_FRACTIONAL_LOG2;
|
||||
break;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
ret = ad5592r_get_vref(st);
|
||||
|
||||
mutex_lock(&iio_dev->mlock);
|
||||
mutex_lock(&st->lock);
|
||||
|
||||
if (st->cached_gp_ctrl & AD5592R_REG_CTRL_ADC_RANGE)
|
||||
*val = (-34365 * 25) / ret;
|
||||
|
@ -451,7 +447,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
|||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -626,6 +622,8 @@ int ad5592r_probe(struct device *dev, const char *name,
|
|||
iio_dev->info = &ad5592r_info;
|
||||
iio_dev->modes = INDIO_DIRECT_MODE;
|
||||
|
||||
mutex_init(&st->lock);
|
||||
|
||||
ad5592r_init_scales(st, ad5592r_get_vref(st));
|
||||
|
||||
ret = ad5592r_reset(st);
|
||||
|
|
|
@ -52,6 +52,7 @@ struct ad5592r_state {
|
|||
struct regulator *reg;
|
||||
struct gpio_chip gpiochip;
|
||||
struct mutex gpio_lock; /* Protect cached gpio_out, gpio_val, etc. */
|
||||
struct mutex lock;
|
||||
unsigned int num_channels;
|
||||
const struct ad5592r_rw_ops *ops;
|
||||
int scale_avail[2][2];
|
||||
|
|
|
@ -1358,19 +1358,19 @@ static int input_print_modalias_bits(char *buf, int size,
|
|||
char name, unsigned long *bm,
|
||||
unsigned int min_bit, unsigned int max_bit)
|
||||
{
|
||||
int len = 0, i;
|
||||
int bit = min_bit;
|
||||
int len = 0;
|
||||
|
||||
len += snprintf(buf, max(size, 0), "%c", name);
|
||||
for (i = min_bit; i < max_bit; i++)
|
||||
if (bm[BIT_WORD(i)] & BIT_MASK(i))
|
||||
len += snprintf(buf + len, max(size - len, 0), "%X,", i);
|
||||
for_each_set_bit_from(bit, bm, max_bit)
|
||||
len += snprintf(buf + len, max(size - len, 0), "%X,", bit);
|
||||
return len;
|
||||
}
|
||||
|
||||
static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
||||
int add_cr)
|
||||
static int input_print_modalias_parts(char *buf, int size, int full_len,
|
||||
struct input_dev *id)
|
||||
{
|
||||
int len;
|
||||
int len, klen, remainder, space;
|
||||
|
||||
len = snprintf(buf, max(size, 0),
|
||||
"input:b%04Xv%04Xp%04Xe%04X-",
|
||||
|
@ -1379,8 +1379,49 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
|||
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'e', id->evbit, 0, EV_MAX);
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
|
||||
/*
|
||||
* Calculate the remaining space in the buffer making sure we
|
||||
* have place for the terminating 0.
|
||||
*/
|
||||
space = max(size - (len + 1), 0);
|
||||
|
||||
klen = input_print_modalias_bits(buf + len, size - len,
|
||||
'k', id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
|
||||
len += klen;
|
||||
|
||||
/*
|
||||
* If we have more data than we can fit in the buffer, check
|
||||
* if we can trim key data to fit in the rest. We will indicate
|
||||
* that key data is incomplete by adding "+" sign at the end, like
|
||||
* this: * "k1,2,3,45,+,".
|
||||
*
|
||||
* Note that we shortest key info (if present) is "k+," so we
|
||||
* can only try to trim if key data is longer than that.
|
||||
*/
|
||||
if (full_len && size < full_len + 1 && klen > 3) {
|
||||
remainder = full_len - len;
|
||||
/*
|
||||
* We can only trim if we have space for the remainder
|
||||
* and also for at least "k+," which is 3 more characters.
|
||||
*/
|
||||
if (remainder <= space - 3) {
|
||||
int i;
|
||||
/*
|
||||
* We are guaranteed to have 'k' in the buffer, so
|
||||
* we need at least 3 additional bytes for storing
|
||||
* "+," in addition to the remainder.
|
||||
*/
|
||||
for (i = size - 1 - remainder - 3; i >= 0; i--) {
|
||||
if (buf[i] == 'k' || buf[i] == ',') {
|
||||
strcpy(buf + i + 1, "+,");
|
||||
len = i + 3; /* Not counting '\0' */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'r', id->relbit, 0, REL_MAX);
|
||||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
|
@ -1396,12 +1437,25 @@ static int input_print_modalias(char *buf, int size, struct input_dev *id,
|
|||
len += input_print_modalias_bits(buf + len, size - len,
|
||||
'w', id->swbit, 0, SW_MAX);
|
||||
|
||||
if (add_cr)
|
||||
len += snprintf(buf + len, max(size - len, 0), "\n");
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static int input_print_modalias(char *buf, int size, struct input_dev *id)
|
||||
{
|
||||
int full_len;
|
||||
|
||||
/*
|
||||
* Printing is done in 2 passes: first one figures out total length
|
||||
* needed for the modalias string, second one will try to trim key
|
||||
* data in case when buffer is too small for the entire modalias.
|
||||
* If the buffer is too small regardless, it will fill as much as it
|
||||
* can (without trimming key data) into the buffer and leave it to
|
||||
* the caller to figure out what to do with the result.
|
||||
*/
|
||||
full_len = input_print_modalias_parts(NULL, 0, 0, id);
|
||||
return input_print_modalias_parts(buf, size, full_len, id);
|
||||
}
|
||||
|
||||
static ssize_t input_dev_show_modalias(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
|
@ -1409,7 +1463,9 @@ static ssize_t input_dev_show_modalias(struct device *dev,
|
|||
struct input_dev *id = to_input_dev(dev);
|
||||
ssize_t len;
|
||||
|
||||
len = input_print_modalias(buf, PAGE_SIZE, id, 1);
|
||||
len = input_print_modalias(buf, PAGE_SIZE, id);
|
||||
if (len < PAGE_SIZE - 2)
|
||||
len += snprintf(buf + len, PAGE_SIZE - len, "\n");
|
||||
|
||||
return min_t(int, len, PAGE_SIZE);
|
||||
}
|
||||
|
@ -1584,6 +1640,23 @@ static int input_add_uevent_bm_var(struct kobj_uevent_env *env,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a pretty gross hack. When building uevent data the driver core
|
||||
* may try adding more environment variables to kobj_uevent_env without
|
||||
* telling us, so we have no idea how much of the buffer we can use to
|
||||
* avoid overflows/-ENOMEM elsewhere. To work around this let's artificially
|
||||
* reduce amount of memory we will use for the modalias environment variable.
|
||||
*
|
||||
* The potential additions are:
|
||||
*
|
||||
* SEQNUM=18446744073709551615 - (%llu - 28 bytes)
|
||||
* HOME=/ (6 bytes)
|
||||
* PATH=/sbin:/bin:/usr/sbin:/usr/bin (34 bytes)
|
||||
*
|
||||
* 68 bytes total. Allow extra buffer - 96 bytes
|
||||
*/
|
||||
#define UEVENT_ENV_EXTRA_LEN 96
|
||||
|
||||
static int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
|
||||
struct input_dev *dev)
|
||||
{
|
||||
|
@ -1593,9 +1666,11 @@ static int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
|
|||
return -ENOMEM;
|
||||
|
||||
len = input_print_modalias(&env->buf[env->buflen - 1],
|
||||
sizeof(env->buf) - env->buflen,
|
||||
dev, 0);
|
||||
if (len >= (sizeof(env->buf) - env->buflen))
|
||||
(int)sizeof(env->buf) - env->buflen -
|
||||
UEVENT_ENV_EXTRA_LEN,
|
||||
dev);
|
||||
if (len >= ((int)sizeof(env->buf) - env->buflen -
|
||||
UEVENT_ENV_EXTRA_LEN))
|
||||
return -ENOMEM;
|
||||
|
||||
env->buflen += len;
|
||||
|
|
|
@ -1410,8 +1410,17 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void __init free_sysfs(struct amd_iommu *iommu)
|
||||
{
|
||||
if (iommu->iommu.dev) {
|
||||
iommu_device_unregister(&iommu->iommu);
|
||||
iommu_device_sysfs_remove(&iommu->iommu);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init free_iommu_one(struct amd_iommu *iommu)
|
||||
{
|
||||
free_sysfs(iommu);
|
||||
free_command_buffer(iommu);
|
||||
free_event_buffer(iommu);
|
||||
free_ppr_log(iommu);
|
||||
|
|
|
@ -974,7 +974,7 @@ int dvb_usercopy(struct file *file,
|
|||
int (*func)(struct file *file,
|
||||
unsigned int cmd, void *arg))
|
||||
{
|
||||
char sbuf[128];
|
||||
char sbuf[128] = {};
|
||||
void *mbuf = NULL;
|
||||
void *parg = NULL;
|
||||
int err = -EINVAL;
|
||||
|
|
|
@ -379,8 +379,10 @@ static int mei_me_pci_resume(struct device *device)
|
|||
}
|
||||
|
||||
err = mei_restart(dev);
|
||||
if (err)
|
||||
if (err) {
|
||||
free_irq(pdev->irq, dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Start timer if stopped in suspend */
|
||||
schedule_delayed_work(&dev->timer_work, HZ);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/vmw_vmci_api.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nospec.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rculist.h>
|
||||
|
@ -86,9 +87,12 @@ static void event_deliver(struct vmci_event_msg *event_msg)
|
|||
{
|
||||
struct vmci_subscription *cur;
|
||||
struct list_head *subscriber_list;
|
||||
u32 sanitized_event, max_vmci_event;
|
||||
|
||||
rcu_read_lock();
|
||||
subscriber_list = &subscriber_array[event_msg->event_data.event];
|
||||
max_vmci_event = ARRAY_SIZE(subscriber_array);
|
||||
sanitized_event = array_index_nospec(event_msg->event_data.event, max_vmci_event);
|
||||
subscriber_list = &subscriber_array[sanitized_event];
|
||||
list_for_each_entry_rcu(cur, subscriber_list, node) {
|
||||
cur->callback(cur->id, &event_msg->event_data,
|
||||
cur->callback_data);
|
||||
|
|
|
@ -1376,7 +1376,7 @@ static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
|
|||
|
||||
ret = pci_read_config_byte(chip->pdev, 0xAE, &scratch);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* Turn PMOS on [bit 0], set over current detection to 2.4 V
|
||||
|
@ -1387,7 +1387,10 @@ static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
|
|||
else
|
||||
scratch &= ~0x47;
|
||||
|
||||
return pci_write_config_byte(chip->pdev, 0xAE, scratch);
|
||||
ret = pci_write_config_byte(chip->pdev, 0xAE, scratch);
|
||||
|
||||
fail:
|
||||
return pcibios_err_to_errno(ret);
|
||||
}
|
||||
|
||||
static int jmicron_probe(struct sdhci_pci_chip *chip)
|
||||
|
@ -2303,7 +2306,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
ret = pci_read_config_byte(pdev, PCI_SLOT_INFO, &slots);
|
||||
if (ret)
|
||||
return ret;
|
||||
return pcibios_err_to_errno(ret);
|
||||
|
||||
slots = PCI_SLOT_INFO_SLOTS(slots) + 1;
|
||||
dev_dbg(&pdev->dev, "found %d slot(s)\n", slots);
|
||||
|
@ -2312,7 +2315,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
|
|||
|
||||
ret = pci_read_config_byte(pdev, PCI_SLOT_INFO, &first_bar);
|
||||
if (ret)
|
||||
return ret;
|
||||
return pcibios_err_to_errno(ret);
|
||||
|
||||
first_bar &= PCI_SLOT_INFO_FIRST_BAR_MASK;
|
||||
|
||||
|
|
|
@ -2141,26 +2141,29 @@ static int sdhci_get_cd(struct mmc_host *mmc)
|
|||
|
||||
static int sdhci_check_ro(struct sdhci_host *host)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool allow_invert = false;
|
||||
int is_readonly;
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
if (host->flags & SDHCI_DEVICE_DEAD)
|
||||
if (host->flags & SDHCI_DEVICE_DEAD) {
|
||||
is_readonly = 0;
|
||||
else if (host->ops->get_ro)
|
||||
} else if (host->ops->get_ro) {
|
||||
is_readonly = host->ops->get_ro(host);
|
||||
else if (mmc_can_gpio_ro(host->mmc))
|
||||
} else if (mmc_can_gpio_ro(host->mmc)) {
|
||||
is_readonly = mmc_gpio_get_ro(host->mmc);
|
||||
else
|
||||
/* Do not invert twice */
|
||||
allow_invert = !(host->mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
|
||||
} else {
|
||||
is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
|
||||
& SDHCI_WRITE_PROTECT);
|
||||
allow_invert = true;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
if (is_readonly >= 0 &&
|
||||
allow_invert &&
|
||||
(host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT))
|
||||
is_readonly = !is_readonly;
|
||||
|
||||
/* This quirk needs to be replaced by a callback-function later */
|
||||
return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
|
||||
!is_readonly : is_readonly;
|
||||
return is_readonly;
|
||||
}
|
||||
|
||||
#define SAMPLE_COUNT 5
|
||||
|
|
|
@ -132,6 +132,105 @@ static const struct spinand_info macronix_spinand_table[] = {
|
|||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
|
||||
SPINAND_INFO("MX35LF2G14AC", 0x20,
|
||||
NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF4G24AD", 0xb5,
|
||||
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF4GE4AD", 0xb7,
|
||||
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF2G14AC", 0xa0,
|
||||
NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF2G24AD", 0xa4,
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF2GE4AD", 0xa6,
|
||||
NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF2GE4AC", 0xa2,
|
||||
NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF1G14AC", 0x90,
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF1G24AD", 0x94,
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF1GE4AD", 0x96,
|
||||
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(8, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
SPINAND_INFO("MX35UF1GE4AC", 0x92,
|
||||
NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
|
||||
NAND_ECCREQ(4, 512),
|
||||
SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||
&write_cache_variants,
|
||||
&update_cache_variants),
|
||||
SPINAND_HAS_QE_BIT,
|
||||
SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
|
||||
mx35lf1ge4ab_ecc_get_status)),
|
||||
};
|
||||
|
||||
static int macronix_spinand_detect(struct spinand_device *spinand)
|
||||
|
|
|
@ -102,7 +102,7 @@ static int parse_redboot_partitions(struct mtd_info *master,
|
|||
offset -= master->erasesize;
|
||||
}
|
||||
} else {
|
||||
offset = directory * master->erasesize;
|
||||
offset = (unsigned long) directory * master->erasesize;
|
||||
while (mtd_block_isbad(master, offset)) {
|
||||
offset += master->erasesize;
|
||||
if (offset == master->size)
|
||||
|
|
|
@ -206,10 +206,8 @@ static int ksz9477_reset_switch(struct ksz_device *dev)
|
|||
SPI_AUTO_EDGE_DETECTION, 0);
|
||||
|
||||
/* default configuration */
|
||||
ksz_read8(dev, REG_SW_LUE_CTRL_1, &data8);
|
||||
data8 = SW_AGING_ENABLE | SW_LINK_AUTO_AGING |
|
||||
SW_SRC_ADDR_FILTER | SW_FLUSH_STP_TABLE | SW_FLUSH_MSTP_TABLE;
|
||||
ksz_write8(dev, REG_SW_LUE_CTRL_1, data8);
|
||||
ksz_write8(dev, REG_SW_LUE_CTRL_1,
|
||||
SW_AGING_ENABLE | SW_LINK_AUTO_AGING | SW_SRC_ADDR_FILTER);
|
||||
|
||||
/* disable interrupts */
|
||||
ksz_write32(dev, REG_SW_INT_MASK__4, SWITCH_INT_MASK);
|
||||
|
|
|
@ -272,13 +272,12 @@ lio_vf_rep_copy_packet(struct octeon_device *oct,
|
|||
pg_info->page_offset;
|
||||
memcpy(skb->data, va, MIN_SKB_SIZE);
|
||||
skb_put(skb, MIN_SKB_SIZE);
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
pg_info->page,
|
||||
pg_info->page_offset + MIN_SKB_SIZE,
|
||||
len - MIN_SKB_SIZE,
|
||||
LIO_RXBUFFER_SZ);
|
||||
}
|
||||
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
pg_info->page,
|
||||
pg_info->page_offset + MIN_SKB_SIZE,
|
||||
len - MIN_SKB_SIZE,
|
||||
LIO_RXBUFFER_SZ);
|
||||
} else {
|
||||
struct octeon_skb_page_info *pg_info =
|
||||
((struct octeon_skb_page_info *)(skb->cb));
|
||||
|
|
|
@ -1945,11 +1945,14 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
|
|||
static int update_xps(struct dpaa2_eth_priv *priv)
|
||||
{
|
||||
struct net_device *net_dev = priv->net_dev;
|
||||
struct cpumask xps_mask;
|
||||
struct dpaa2_eth_fq *fq;
|
||||
int i, num_queues, netdev_queues;
|
||||
struct dpaa2_eth_fq *fq;
|
||||
cpumask_var_t xps_mask;
|
||||
int err = 0;
|
||||
|
||||
if (!alloc_cpumask_var(&xps_mask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
num_queues = dpaa2_eth_queue_count(priv);
|
||||
netdev_queues = (net_dev->num_tc ? : 1) * num_queues;
|
||||
|
||||
|
@ -1959,16 +1962,17 @@ static int update_xps(struct dpaa2_eth_priv *priv)
|
|||
for (i = 0; i < netdev_queues; i++) {
|
||||
fq = &priv->fq[i % num_queues];
|
||||
|
||||
cpumask_clear(&xps_mask);
|
||||
cpumask_set_cpu(fq->target_cpu, &xps_mask);
|
||||
cpumask_clear(xps_mask);
|
||||
cpumask_set_cpu(fq->target_cpu, xps_mask);
|
||||
|
||||
err = netif_set_xps_queue(net_dev, &xps_mask, i);
|
||||
err = netif_set_xps_queue(net_dev, xps_mask, i);
|
||||
if (err) {
|
||||
netdev_warn_once(net_dev, "Error setting XPS queue\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free_cpumask_var(xps_mask);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -4433,7 +4433,7 @@ static netdev_features_t mlx5e_tunnel_features_check(struct mlx5e_priv *priv,
|
|||
|
||||
/* Verify if UDP port is being offloaded by HW */
|
||||
if (mlx5_vxlan_lookup_port(priv->mdev->vxlan, port))
|
||||
return features;
|
||||
return vxlan_features_check(skb, features);
|
||||
|
||||
#if IS_ENABLED(CONFIG_GENEVE)
|
||||
/* Support Geneve offload for default UDP port */
|
||||
|
@ -4454,7 +4454,6 @@ netdev_features_t mlx5e_features_check(struct sk_buff *skb,
|
|||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
|
||||
features = vlan_features_check(skb, features);
|
||||
features = vxlan_features_check(skb, features);
|
||||
|
||||
#ifdef CONFIG_MLX5_EN_IPSEC
|
||||
if (mlx5e_ipsec_feature_check(skb, netdev, features))
|
||||
|
|
|
@ -337,6 +337,10 @@ int mlx5_cmd_fast_teardown_hca(struct mlx5_core_dev *dev)
|
|||
do {
|
||||
if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED)
|
||||
break;
|
||||
if (pci_channel_offline(dev->pdev)) {
|
||||
mlx5_core_err(dev, "PCI channel offline, stop waiting for NIC IFC\n");
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
cond_resched();
|
||||
} while (!time_after(jiffies, end));
|
||||
|
|
|
@ -250,6 +250,10 @@ recover_from_sw_reset:
|
|||
do {
|
||||
if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED)
|
||||
break;
|
||||
if (pci_channel_offline(dev->pdev)) {
|
||||
mlx5_core_err(dev, "PCI channel offline, stop waiting for NIC IFC\n");
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
msleep(20);
|
||||
} while (!time_after(jiffies, end));
|
||||
|
@ -322,6 +326,10 @@ static int mlx5_health_try_recover(struct mlx5_core_dev *dev)
|
|||
"health recovery flow aborted, PCI reads still not working\n");
|
||||
return -EIO;
|
||||
}
|
||||
if (pci_channel_offline(dev->pdev)) {
|
||||
mlx5_core_err(dev, "PCI channel offline, stop waiting for PCI\n");
|
||||
return -EACCES;
|
||||
}
|
||||
msleep(100);
|
||||
}
|
||||
|
||||
|
|
|
@ -74,6 +74,10 @@ int mlx5_vsc_gw_lock(struct mlx5_core_dev *dev)
|
|||
ret = -EBUSY;
|
||||
goto pci_unlock;
|
||||
}
|
||||
if (pci_channel_offline(dev->pdev)) {
|
||||
ret = -EACCES;
|
||||
goto pci_unlock;
|
||||
}
|
||||
|
||||
/* Check if semaphore is already locked */
|
||||
ret = vsc_read(dev, VSC_SEMAPHORE_OFFSET, &lock_val);
|
||||
|
|
|
@ -205,10 +205,8 @@ static int ionic_qcq_enable(struct ionic_qcq *qcq)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (qcq->napi.poll)
|
||||
napi_enable(&qcq->napi);
|
||||
|
||||
if (qcq->flags & IONIC_QCQ_F_INTR) {
|
||||
napi_enable(&qcq->napi);
|
||||
irq_set_affinity_hint(qcq->intr.vector,
|
||||
&qcq->intr.affinity_mask);
|
||||
ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
|
||||
|
|
|
@ -1149,6 +1149,19 @@ static struct phy_driver ksphy_driver[] = {
|
|||
.get_stats = kszphy_get_stats,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = kszphy_resume,
|
||||
}, {
|
||||
.phy_id = PHY_ID_LAN8814,
|
||||
.phy_id_mask = MICREL_PHY_ID_MASK,
|
||||
.name = "Microchip INDY Gigabit Quad PHY",
|
||||
.driver_data = &ksz9021_type,
|
||||
.probe = kszphy_probe,
|
||||
.soft_reset = genphy_soft_reset,
|
||||
.read_status = ksz9031_read_status,
|
||||
.get_sset_count = kszphy_get_sset_count,
|
||||
.get_strings = kszphy_get_strings,
|
||||
.get_stats = kszphy_get_stats,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = kszphy_resume,
|
||||
}, {
|
||||
.phy_id = PHY_ID_KSZ9131,
|
||||
.phy_id_mask = MICREL_PHY_ID_MASK,
|
||||
|
@ -1221,6 +1234,8 @@ static struct mdio_device_id __maybe_unused micrel_tbl[] = {
|
|||
{ PHY_ID_KSZ8081, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ8873MLL, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ886X, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ9477, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_LAN8814, MICREL_PHY_ID_MASK },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -345,7 +345,8 @@ static void ax88179_status(struct usbnet *dev, struct urb *urb)
|
|||
|
||||
if (netif_carrier_ok(dev->net) != link) {
|
||||
usbnet_link_change(dev, link, 1);
|
||||
netdev_info(dev->net, "ax88179 - Link status is: %d\n", link);
|
||||
if (!link)
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 0\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1532,6 +1533,7 @@ static int ax88179_link_reset(struct usbnet *dev)
|
|||
GMII_PHY_PHYSR, 2, &tmp16);
|
||||
|
||||
if (!(tmp16 & GMII_PHY_PHYSR_LINK)) {
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 0\n");
|
||||
return 0;
|
||||
} else if (GMII_PHY_PHYSR_GIGA == (tmp16 & GMII_PHY_PHYSR_SMASK)) {
|
||||
mode |= AX_MEDIUM_GIGAMODE | AX_MEDIUM_EN_125MHZ;
|
||||
|
@ -1569,6 +1571,8 @@ static int ax88179_link_reset(struct usbnet *dev)
|
|||
|
||||
netif_carrier_on(dev->net);
|
||||
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 1\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -798,7 +798,8 @@ static int rtl8150_get_link_ksettings(struct net_device *netdev,
|
|||
struct ethtool_link_ksettings *ecmd)
|
||||
{
|
||||
rtl8150_t *dev = netdev_priv(netdev);
|
||||
short lpa, bmcr;
|
||||
short lpa = 0;
|
||||
short bmcr = 0;
|
||||
u32 supported;
|
||||
|
||||
supported = (SUPPORTED_10baseT_Half |
|
||||
|
|
|
@ -3157,8 +3157,16 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
dev->features |= dev->hw_features & NETIF_F_ALL_TSO;
|
||||
/* (!csum && gso) case will be fixed by register_netdev() */
|
||||
}
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM))
|
||||
dev->features |= NETIF_F_RXCSUM;
|
||||
|
||||
/* 1. With VIRTIO_NET_F_GUEST_CSUM negotiation, the driver doesn't
|
||||
* need to calculate checksums for partially checksummed packets,
|
||||
* as they're considered valid by the upper layer.
|
||||
* 2. Without VIRTIO_NET_F_GUEST_CSUM negotiation, the driver only
|
||||
* receives fully checksummed packets. The device may assist in
|
||||
* validating these packets' checksums, so the driver won't have to.
|
||||
*/
|
||||
dev->features |= NETIF_F_RXCSUM;
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
|
||||
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6))
|
||||
dev->features |= NETIF_F_GRO_HW;
|
||||
|
|
|
@ -1323,6 +1323,10 @@ static bool vxlan_snoop(struct net_device *dev,
|
|||
struct vxlan_fdb *f;
|
||||
u32 ifindex = 0;
|
||||
|
||||
/* Ignore packets from invalid src-address */
|
||||
if (!is_valid_ether_addr(src_mac))
|
||||
return true;
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (src_ip->sa.sa_family == AF_INET6 &&
|
||||
(ipv6_addr_type(&src_ip->sin6.sin6_addr) & IPV6_ADDR_LINKLOCAL))
|
||||
|
|
|
@ -1669,8 +1669,8 @@ struct iwl_drv *iwl_drv_start(struct iwl_trans *trans)
|
|||
err_fw:
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
debugfs_remove_recursive(drv->dbgfs_drv);
|
||||
iwl_dbg_tlv_free(drv->trans);
|
||||
#endif
|
||||
iwl_dbg_tlv_free(drv->trans);
|
||||
kfree(drv);
|
||||
err:
|
||||
return ERR_PTR(ret);
|
||||
|
|
|
@ -197,20 +197,10 @@ void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
|
|||
{
|
||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
struct iwl_mfu_assert_dump_notif *mfu_dump_notif = (void *)pkt->data;
|
||||
__le32 *dump_data = mfu_dump_notif->data;
|
||||
int n_words = le32_to_cpu(mfu_dump_notif->data_size) / sizeof(__le32);
|
||||
int i;
|
||||
|
||||
if (mfu_dump_notif->index_num == 0)
|
||||
IWL_INFO(mvm, "MFUART assert id 0x%x occurred\n",
|
||||
le32_to_cpu(mfu_dump_notif->assert_id));
|
||||
|
||||
for (i = 0; i < n_words; i++)
|
||||
IWL_DEBUG_INFO(mvm,
|
||||
"MFUART assert dump, dword %u: 0x%08x\n",
|
||||
le16_to_cpu(mfu_dump_notif->index_num) *
|
||||
n_words + i,
|
||||
le32_to_cpu(dump_data[i]));
|
||||
}
|
||||
|
||||
static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
||||
|
|
|
@ -133,13 +133,8 @@ enum {
|
|||
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_DEF (63)
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_MAX (63)
|
||||
/*
|
||||
* FIXME - various places in firmware API still use u8,
|
||||
* e.g. LQ command and SCD config command.
|
||||
* This should be 256 instead.
|
||||
*/
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_GEN2_DEF (255)
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_GEN2_MAX (255)
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_GEN2_DEF (64)
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_GEN2_MAX (64)
|
||||
#define LINK_QUAL_AGG_FRAME_LIMIT_MIN (0)
|
||||
|
||||
#define LQ_SIZE 2 /* 2 mode tables: "Active" and "Search" */
|
||||
|
|
|
@ -130,10 +130,8 @@ static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
|
|||
|
||||
/* All functions share the same vendor ID with function 0 */
|
||||
if (fn == 0) {
|
||||
u32 vid_regs = (hdr->vendorid & GENMASK(15, 0)) |
|
||||
(hdr->subsys_vendor_id & GENMASK(31, 16)) << 16;
|
||||
|
||||
rockchip_pcie_write(rockchip, vid_regs,
|
||||
rockchip_pcie_write(rockchip,
|
||||
hdr->vendorid | hdr->subsys_vendor_id << 16,
|
||||
PCIE_CORE_CONFIG_VENDOR);
|
||||
}
|
||||
|
||||
|
|
|
@ -2602,6 +2602,18 @@ static const struct dmi_system_id bridge_d3_blacklist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VERSION, "Continental Z2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Changing power state of root port dGPU is connected fails
|
||||
* https://gitlab.freedesktop.org/drm/amd/-/issues/3229
|
||||
*/
|
||||
.ident = "Hewlett-Packard HP Pavilion 17 Notebook PC/1972",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "1972"),
|
||||
DMI_MATCH(DMI_BOARD_VERSION, "95.33"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
|
|
@ -1090,8 +1090,8 @@ static struct pinctrl *create_pinctrl(struct device *dev,
|
|||
* an -EPROBE_DEFER later, as that is the worst case.
|
||||
*/
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
pinctrl_free(p, false);
|
||||
mutex_unlock(&pinctrl_maps_mutex);
|
||||
pinctrl_free(p, false);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -661,23 +661,68 @@ static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
|
|||
|
||||
static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
|
||||
{
|
||||
.num = 2,
|
||||
.pin = 12,
|
||||
.reg = 0x24,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio2_b7_sel */
|
||||
.num = 2,
|
||||
.pin = 15,
|
||||
.reg = 0x28,
|
||||
.bit = 0,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
/* gpio2_c7_sel */
|
||||
.num = 2,
|
||||
.pin = 23,
|
||||
.reg = 0x30,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b1_sel */
|
||||
.num = 3,
|
||||
.pin = 9,
|
||||
.reg = 0x44,
|
||||
.bit = 2,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b2_sel */
|
||||
.num = 3,
|
||||
.pin = 10,
|
||||
.reg = 0x44,
|
||||
.bit = 4,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b3_sel */
|
||||
.num = 3,
|
||||
.pin = 11,
|
||||
.reg = 0x44,
|
||||
.bit = 6,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b4_sel */
|
||||
.num = 3,
|
||||
.pin = 12,
|
||||
.reg = 0x44,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b5_sel */
|
||||
.num = 3,
|
||||
.pin = 13,
|
||||
.reg = 0x44,
|
||||
.bit = 10,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b6_sel */
|
||||
.num = 3,
|
||||
.pin = 14,
|
||||
.reg = 0x44,
|
||||
.bit = 12,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b7_sel */
|
||||
.num = 3,
|
||||
.pin = 15,
|
||||
.reg = 0x44,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -2190,8 +2235,10 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
|||
|
||||
if (ret) {
|
||||
/* revert the already done pin settings */
|
||||
for (cnt--; cnt >= 0; cnt--)
|
||||
for (cnt--; cnt >= 0; cnt--) {
|
||||
bank = pin_to_bank(info, pins[cnt]);
|
||||
rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -3724,7 +3771,7 @@ static struct rockchip_pin_bank rk3328_pin_banks[] = {
|
|||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
|
||||
|
|
|
@ -84,7 +84,8 @@ int ptp_set_pinfunc(struct ptp_clock *ptp, unsigned int pin,
|
|||
}
|
||||
|
||||
if (info->verify(info, pin, func, chan)) {
|
||||
pr_err("driver cannot use function %u on pin %u\n", func, chan);
|
||||
pr_err("driver cannot use function %u and channel %u on pin %u\n",
|
||||
func, chan, pin);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
|
|
|
@ -337,6 +337,9 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,
|
|||
|
||||
prd = div;
|
||||
|
||||
if (!prd)
|
||||
return -EINVAL;
|
||||
|
||||
if (prescaler > MAX_TIM_PSC)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -3074,6 +3074,7 @@ struct regmap *regulator_get_regmap(struct regulator *regulator)
|
|||
|
||||
return map ? map : ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regulator_get_regmap);
|
||||
|
||||
/**
|
||||
* regulator_get_hardware_vsel_register - get the HW voltage selector register
|
||||
|
|
|
@ -7089,6 +7089,12 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
|
|||
ioc->pd_handles_sz = (ioc->facts.MaxDevHandle / 8);
|
||||
if (ioc->facts.MaxDevHandle % 8)
|
||||
ioc->pd_handles_sz++;
|
||||
/*
|
||||
* pd_handles_sz should have, at least, the minimal room for
|
||||
* set_bit()/test_bit(), otherwise out-of-memory touch may occur.
|
||||
*/
|
||||
ioc->pd_handles_sz = ALIGN(ioc->pd_handles_sz, sizeof(unsigned long));
|
||||
|
||||
ioc->pd_handles = kzalloc(ioc->pd_handles_sz,
|
||||
GFP_KERNEL);
|
||||
if (!ioc->pd_handles) {
|
||||
|
@ -7106,6 +7112,13 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
|
|||
ioc->pend_os_device_add_sz = (ioc->facts.MaxDevHandle / 8);
|
||||
if (ioc->facts.MaxDevHandle % 8)
|
||||
ioc->pend_os_device_add_sz++;
|
||||
|
||||
/*
|
||||
* pend_os_device_add_sz should have, at least, the minimal room for
|
||||
* set_bit()/test_bit(), otherwise out-of-memory may occur.
|
||||
*/
|
||||
ioc->pend_os_device_add_sz = ALIGN(ioc->pend_os_device_add_sz,
|
||||
sizeof(unsigned long));
|
||||
ioc->pend_os_device_add = kzalloc(ioc->pend_os_device_add_sz,
|
||||
GFP_KERNEL);
|
||||
if (!ioc->pend_os_device_add) {
|
||||
|
@ -7384,6 +7397,12 @@ _base_check_ioc_facts_changes(struct MPT3SAS_ADAPTER *ioc)
|
|||
if (ioc->facts.MaxDevHandle % 8)
|
||||
pd_handles_sz++;
|
||||
|
||||
/*
|
||||
* pd_handles should have, at least, the minimal room for
|
||||
* set_bit()/test_bit(), otherwise out-of-memory touch may
|
||||
* occur.
|
||||
*/
|
||||
pd_handles_sz = ALIGN(pd_handles_sz, sizeof(unsigned long));
|
||||
pd_handles = krealloc(ioc->pd_handles, pd_handles_sz,
|
||||
GFP_KERNEL);
|
||||
if (!pd_handles) {
|
||||
|
|
|
@ -120,15 +120,11 @@ static ssize_t
|
|||
qedi_dbg_do_not_recover_cmd_read(struct file *filp, char __user *buffer,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
size_t cnt = 0;
|
||||
char buf[64];
|
||||
int len;
|
||||
|
||||
if (*ppos)
|
||||
return 0;
|
||||
|
||||
cnt = sprintf(buffer, "do_not_recover=%d\n", qedi_do_not_recover);
|
||||
cnt = min_t(int, count, cnt - *ppos);
|
||||
*ppos += cnt;
|
||||
return cnt;
|
||||
len = sprintf(buf, "do_not_recover=%d\n", qedi_do_not_recover);
|
||||
return simple_read_from_buffer(buffer, count, ppos, buf, len);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/omap-mailbox.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/remoteproc.h>
|
||||
#include <linux/suspend.h>
|
||||
|
@ -151,7 +150,6 @@ static irqreturn_t wkup_m3_txev_handler(int irq, void *ipc_data)
|
|||
static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
||||
{
|
||||
struct device *dev = m3_ipc->dev;
|
||||
mbox_msg_t dummy_msg = 0;
|
||||
int ret;
|
||||
|
||||
if (!m3_ipc->mbox) {
|
||||
|
@ -167,7 +165,7 @@ static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
|||
* the RX callback to avoid multiple interrupts being received
|
||||
* by the CM3.
|
||||
*/
|
||||
ret = mbox_send_message(m3_ipc->mbox, &dummy_msg);
|
||||
ret = mbox_send_message(m3_ipc->mbox, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s: mbox_send_message() failed: %d\n",
|
||||
__func__, ret);
|
||||
|
@ -189,7 +187,6 @@ static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
|||
static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc)
|
||||
{
|
||||
struct device *dev = m3_ipc->dev;
|
||||
mbox_msg_t dummy_msg = 0;
|
||||
int ret;
|
||||
|
||||
if (!m3_ipc->mbox) {
|
||||
|
@ -198,7 +195,7 @@ static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
ret = mbox_send_message(m3_ipc->mbox, &dummy_msg);
|
||||
ret = mbox_send_message(m3_ipc->mbox, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s: mbox_send_message() failed: %d\n",
|
||||
__func__, ret);
|
||||
|
|
|
@ -479,7 +479,7 @@ static const struct uart_ops mcf_uart_ops = {
|
|||
.verify_port = mcf_verify_port,
|
||||
};
|
||||
|
||||
static struct mcf_uart mcf_ports[4];
|
||||
static struct mcf_uart mcf_ports[10];
|
||||
|
||||
#define MCF_MAXPORTS ARRAY_SIZE(mcf_ports)
|
||||
|
||||
|
|
|
@ -489,16 +489,28 @@ static bool sc16is7xx_regmap_precious(struct device *dev, unsigned int reg)
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure programmable baud rate generator (divisor) according to the
|
||||
* desired baud rate.
|
||||
*
|
||||
* From the datasheet, the divisor is computed according to:
|
||||
*
|
||||
* XTAL1 input frequency
|
||||
* -----------------------
|
||||
* prescaler
|
||||
* divisor = ---------------------------
|
||||
* baud-rate x sampling-rate
|
||||
*/
|
||||
static int sc16is7xx_set_baud(struct uart_port *port, int baud)
|
||||
{
|
||||
struct sc16is7xx_port *s = dev_get_drvdata(port->dev);
|
||||
u8 lcr;
|
||||
u8 prescaler = 0;
|
||||
unsigned int prescaler = 1;
|
||||
unsigned long clk = port->uartclk, div = clk / 16 / baud;
|
||||
|
||||
if (div > 0xffff) {
|
||||
prescaler = SC16IS7XX_MCR_CLKSEL_BIT;
|
||||
div /= 4;
|
||||
if (div >= BIT(16)) {
|
||||
prescaler = 4;
|
||||
div /= prescaler;
|
||||
}
|
||||
|
||||
/* In an amazing feat of design, the Enhanced Features Register shares
|
||||
|
@ -533,9 +545,10 @@ static int sc16is7xx_set_baud(struct uart_port *port, int baud)
|
|||
|
||||
mutex_unlock(&s->efr_lock);
|
||||
|
||||
/* If bit MCR_CLKSEL is set, the divide by 4 prescaler is activated. */
|
||||
sc16is7xx_port_update(port, SC16IS7XX_MCR_REG,
|
||||
SC16IS7XX_MCR_CLKSEL_BIT,
|
||||
prescaler);
|
||||
prescaler == 1 ? 0 : SC16IS7XX_MCR_CLKSEL_BIT);
|
||||
|
||||
/* Open the LCR divisors for configuration */
|
||||
sc16is7xx_port_write(port, SC16IS7XX_LCR_REG,
|
||||
|
@ -550,7 +563,7 @@ static int sc16is7xx_set_baud(struct uart_port *port, int baud)
|
|||
/* Put LCR back to the normal mode */
|
||||
sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr);
|
||||
|
||||
return DIV_ROUND_CLOSEST(clk / 16, div);
|
||||
return DIV_ROUND_CLOSEST((clk / prescaler) / 16, div);
|
||||
}
|
||||
|
||||
static void sc16is7xx_handle_rx(struct uart_port *port, unsigned int rxlen,
|
||||
|
|
|
@ -1135,6 +1135,7 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
|
|||
struct cxacru_data *instance;
|
||||
struct usb_device *usb_dev = interface_to_usbdev(intf);
|
||||
struct usb_host_endpoint *cmd_ep = usb_dev->ep_in[CXACRU_EP_CMD];
|
||||
struct usb_endpoint_descriptor *in, *out;
|
||||
int ret;
|
||||
|
||||
/* instance init */
|
||||
|
@ -1181,6 +1182,19 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (usb_endpoint_xfer_int(&cmd_ep->desc))
|
||||
ret = usb_find_common_endpoints(intf->cur_altsetting,
|
||||
NULL, NULL, &in, &out);
|
||||
else
|
||||
ret = usb_find_common_endpoints(intf->cur_altsetting,
|
||||
&in, &out, NULL, NULL);
|
||||
|
||||
if (ret) {
|
||||
usb_err(usbatm_instance, "cxacru_bind: interface has incorrect endpoints\n");
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((cmd_ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
|
||||
== USB_ENDPOINT_XFER_INT) {
|
||||
usb_fill_int_urb(instance->rcv_urb,
|
||||
|
|
|
@ -252,14 +252,14 @@ static void wdm_int_callback(struct urb *urb)
|
|||
dev_err(&desc->intf->dev, "Stall on int endpoint\n");
|
||||
goto sw; /* halt is cleared in work */
|
||||
default:
|
||||
dev_err(&desc->intf->dev,
|
||||
dev_err_ratelimited(&desc->intf->dev,
|
||||
"nonzero urb status received: %d\n", status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (urb->actual_length < sizeof(struct usb_cdc_notification)) {
|
||||
dev_err(&desc->intf->dev, "wdm_int_callback - %d bytes\n",
|
||||
dev_err_ratelimited(&desc->intf->dev, "wdm_int_callback - %d bytes\n",
|
||||
urb->actual_length);
|
||||
goto exit;
|
||||
}
|
||||
|
|
|
@ -827,6 +827,7 @@ static void ffs_user_copy_worker(struct work_struct *work)
|
|||
int ret = io_data->req->status ? io_data->req->status :
|
||||
io_data->req->actual;
|
||||
bool kiocb_has_eventfd = io_data->kiocb->ki_flags & IOCB_EVENTFD;
|
||||
unsigned long flags;
|
||||
|
||||
if (io_data->read && ret > 0) {
|
||||
mm_segment_t oldfs = get_fs();
|
||||
|
@ -843,7 +844,10 @@ static void ffs_user_copy_worker(struct work_struct *work)
|
|||
if (io_data->ffs->ffs_eventfd && !kiocb_has_eventfd)
|
||||
eventfd_signal(io_data->ffs->ffs_eventfd, 1);
|
||||
|
||||
spin_lock_irqsave(&io_data->ffs->eps_lock, flags);
|
||||
usb_ep_free_request(io_data->ep, io_data->req);
|
||||
io_data->req = NULL;
|
||||
spin_unlock_irqrestore(&io_data->ffs->eps_lock, flags);
|
||||
|
||||
if (io_data->read)
|
||||
kfree(io_data->to_free);
|
||||
|
|
|
@ -208,6 +208,7 @@ static inline struct usb_endpoint_descriptor *ep_desc(struct usb_gadget *gadget,
|
|||
struct usb_endpoint_descriptor *ss)
|
||||
{
|
||||
switch (gadget->speed) {
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER:
|
||||
return ss;
|
||||
case USB_SPEED_HIGH:
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
#define PCI_VENDOR_ID_ETRON 0x1b6f
|
||||
#define PCI_DEVICE_ID_EJ168 0x7023
|
||||
#define PCI_DEVICE_ID_EJ188 0x7052
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI 0x8c31
|
||||
#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31
|
||||
|
@ -256,6 +257,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
|
||||
pdev->device == PCI_DEVICE_ID_EJ188) {
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
}
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
|
||||
pdev->device == 0x0014) {
|
||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
|
|
|
@ -2343,9 +2343,8 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
|||
goto finish_td;
|
||||
case COMP_STOPPED_LENGTH_INVALID:
|
||||
/* stopped on ep trb with invalid length, exclude it */
|
||||
ep_trb_len = 0;
|
||||
remaining = 0;
|
||||
break;
|
||||
td->urb->actual_length = sum_trb_lengths(xhci, ep_ring, ep_trb);
|
||||
goto finish_td;
|
||||
case COMP_USB_TRANSACTION_ERROR:
|
||||
if (xhci->quirks & XHCI_NO_SOFT_RETRY ||
|
||||
(ep_ring->err_count++ > MAX_SOFT_RETRY) ||
|
||||
|
|
|
@ -677,7 +677,7 @@ static int uss720_probe(struct usb_interface *intf,
|
|||
struct parport_uss720_private *priv;
|
||||
struct parport *pp;
|
||||
unsigned char reg;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
dev_dbg(&intf->dev, "probe: vendor id 0x%x, device id 0x%x\n",
|
||||
le16_to_cpu(usbdev->descriptor.idVendor),
|
||||
|
@ -688,8 +688,8 @@ static int uss720_probe(struct usb_interface *intf,
|
|||
usb_put_dev(usbdev);
|
||||
return -ENODEV;
|
||||
}
|
||||
i = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2);
|
||||
dev_dbg(&intf->dev, "set interface result %d\n", i);
|
||||
ret = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2);
|
||||
dev_dbg(&intf->dev, "set interface result %d\n", ret);
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
|
@ -725,12 +725,18 @@ static int uss720_probe(struct usb_interface *intf,
|
|||
set_1284_register(pp, 7, 0x00, GFP_KERNEL);
|
||||
set_1284_register(pp, 6, 0x30, GFP_KERNEL); /* PS/2 mode */
|
||||
set_1284_register(pp, 2, 0x0c, GFP_KERNEL);
|
||||
/* debugging */
|
||||
get_1284_register(pp, 0, ®, GFP_KERNEL);
|
||||
dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg);
|
||||
|
||||
i = usb_find_last_int_in_endpoint(interface, &epd);
|
||||
if (!i) {
|
||||
/* The Belkin F5U002 Rev 2 P80453-B USB parallel port adapter shares the
|
||||
* device ID 050d:0002 with some other device that works with this
|
||||
* driver, but it itself does not. Detect and handle the bad cable
|
||||
* here. */
|
||||
ret = get_1284_register(pp, 0, ®, GFP_KERNEL);
|
||||
dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = usb_find_last_int_in_endpoint(interface, &epd);
|
||||
if (!ret) {
|
||||
dev_dbg(&intf->dev, "epaddr %d interval %d\n",
|
||||
epd->bEndpointAddress, epd->bInterval);
|
||||
}
|
||||
|
|
|
@ -556,7 +556,7 @@ static int da8xx_probe(struct platform_device *pdev)
|
|||
ret = of_platform_populate(pdev->dev.of_node, NULL,
|
||||
da8xx_auxdata_lookup, &pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_unregister_phy;
|
||||
|
||||
memset(musb_resources, 0x00, sizeof(*musb_resources) *
|
||||
ARRAY_SIZE(musb_resources));
|
||||
|
@ -582,9 +582,13 @@ static int da8xx_probe(struct platform_device *pdev)
|
|||
ret = PTR_ERR_OR_ZERO(glue->musb);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register musb device: %d\n", ret);
|
||||
usb_phy_generic_unregister(glue->usb_phy);
|
||||
goto err_unregister_phy;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister_phy:
|
||||
usb_phy_generic_unregister(glue->usb_phy);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,6 +105,8 @@ struct alauda_info {
|
|||
unsigned char sense_key;
|
||||
unsigned long sense_asc; /* additional sense code */
|
||||
unsigned long sense_ascq; /* additional sense code qualifier */
|
||||
|
||||
bool media_initialized;
|
||||
};
|
||||
|
||||
#define short_pack(lsb,msb) ( ((u16)(lsb)) | ( ((u16)(msb))<<8 ) )
|
||||
|
@ -476,11 +478,12 @@ static int alauda_check_media(struct us_data *us)
|
|||
}
|
||||
|
||||
/* Check for media change */
|
||||
if (status[0] & 0x08) {
|
||||
if (status[0] & 0x08 || !info->media_initialized) {
|
||||
usb_stor_dbg(us, "Media change detected\n");
|
||||
alauda_free_maps(&MEDIA_INFO(us));
|
||||
alauda_init_media(us);
|
||||
|
||||
rc = alauda_init_media(us);
|
||||
if (rc == USB_STOR_TRANSPORT_GOOD)
|
||||
info->media_initialized = true;
|
||||
info->sense_key = UNIT_ATTENTION;
|
||||
info->sense_asc = 0x28;
|
||||
info->sense_ascq = 0x00;
|
||||
|
|
|
@ -557,9 +557,11 @@ static int ea_get(struct inode *inode, struct ea_buffer *ea_buf, int min_size)
|
|||
|
||||
size_check:
|
||||
if (EALIST_SIZE(ea_buf->xattr) != ea_size) {
|
||||
int size = min_t(int, EALIST_SIZE(ea_buf->xattr), ea_size);
|
||||
|
||||
printk(KERN_ERR "ea_get: invalid extended attribute\n");
|
||||
print_hex_dump(KERN_ERR, "", DUMP_PREFIX_ADDRESS, 16, 1,
|
||||
ea_buf->xattr, ea_size, 1);
|
||||
ea_buf->xattr, size, 1);
|
||||
ea_release(inode, ea_buf);
|
||||
rc = -EIO;
|
||||
goto clean_up;
|
||||
|
|
|
@ -103,12 +103,8 @@ static void nfs_readpage_release(struct nfs_page *req, int error)
|
|||
if (nfs_error_is_fatal_on_server(error) && error != -ETIMEDOUT)
|
||||
SetPageError(page);
|
||||
if (nfs_page_group_sync_on_bit(req, PG_UNLOCKPAGE)) {
|
||||
struct address_space *mapping = page_file_mapping(page);
|
||||
|
||||
if (PageUptodate(page))
|
||||
nfs_readpage_to_fscache(inode, page, 0);
|
||||
else if (!PageError(page) && !PagePrivate(page))
|
||||
generic_error_remove_page(mapping, page);
|
||||
unlock_page(page);
|
||||
}
|
||||
nfs_release_request(req);
|
||||
|
|
|
@ -186,19 +186,24 @@ fail:
|
|||
return false;
|
||||
}
|
||||
|
||||
static struct page *nilfs_get_page(struct inode *dir, unsigned long n)
|
||||
static void *nilfs_get_page(struct inode *dir, unsigned long n,
|
||||
struct page **pagep)
|
||||
{
|
||||
struct address_space *mapping = dir->i_mapping;
|
||||
struct page *page = read_mapping_page(mapping, n, NULL);
|
||||
void *kaddr;
|
||||
|
||||
if (!IS_ERR(page)) {
|
||||
kmap(page);
|
||||
if (unlikely(!PageChecked(page))) {
|
||||
if (PageError(page) || !nilfs_check_page(page))
|
||||
goto fail;
|
||||
}
|
||||
if (IS_ERR(page))
|
||||
return page;
|
||||
|
||||
kaddr = kmap(page);
|
||||
if (unlikely(!PageChecked(page))) {
|
||||
if (!nilfs_check_page(page))
|
||||
goto fail;
|
||||
}
|
||||
return page;
|
||||
|
||||
*pagep = page;
|
||||
return kaddr;
|
||||
|
||||
fail:
|
||||
nilfs_put_page(page);
|
||||
|
@ -275,14 +280,14 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
|
|||
for ( ; n < npages; n++, offset = 0) {
|
||||
char *kaddr, *limit;
|
||||
struct nilfs_dir_entry *de;
|
||||
struct page *page = nilfs_get_page(inode, n);
|
||||
struct page *page;
|
||||
|
||||
if (IS_ERR(page)) {
|
||||
kaddr = nilfs_get_page(inode, n, &page);
|
||||
if (IS_ERR(kaddr)) {
|
||||
nilfs_error(sb, "bad page in #%lu", inode->i_ino);
|
||||
ctx->pos += PAGE_SIZE - offset;
|
||||
return -EIO;
|
||||
}
|
||||
kaddr = page_address(page);
|
||||
de = (struct nilfs_dir_entry *)(kaddr + offset);
|
||||
limit = kaddr + nilfs_last_byte(inode, n) -
|
||||
NILFS_DIR_REC_LEN(1);
|
||||
|
@ -345,11 +350,9 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
|||
start = 0;
|
||||
n = start;
|
||||
do {
|
||||
char *kaddr;
|
||||
char *kaddr = nilfs_get_page(dir, n, &page);
|
||||
|
||||
page = nilfs_get_page(dir, n);
|
||||
if (!IS_ERR(page)) {
|
||||
kaddr = page_address(page);
|
||||
if (!IS_ERR(kaddr)) {
|
||||
de = (struct nilfs_dir_entry *)kaddr;
|
||||
kaddr += nilfs_last_byte(dir, n) - reclen;
|
||||
while ((char *) de <= kaddr) {
|
||||
|
@ -387,15 +390,11 @@ found:
|
|||
|
||||
struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct page **p)
|
||||
{
|
||||
struct page *page = nilfs_get_page(dir, 0);
|
||||
struct nilfs_dir_entry *de = NULL;
|
||||
struct nilfs_dir_entry *de = nilfs_get_page(dir, 0, p);
|
||||
|
||||
if (!IS_ERR(page)) {
|
||||
de = nilfs_next_entry(
|
||||
(struct nilfs_dir_entry *)page_address(page));
|
||||
*p = page;
|
||||
}
|
||||
return de;
|
||||
if (IS_ERR(de))
|
||||
return NULL;
|
||||
return nilfs_next_entry(de);
|
||||
}
|
||||
|
||||
ino_t nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr)
|
||||
|
@ -459,12 +458,11 @@ int nilfs_add_link(struct dentry *dentry, struct inode *inode)
|
|||
for (n = 0; n <= npages; n++) {
|
||||
char *dir_end;
|
||||
|
||||
page = nilfs_get_page(dir, n);
|
||||
err = PTR_ERR(page);
|
||||
if (IS_ERR(page))
|
||||
kaddr = nilfs_get_page(dir, n, &page);
|
||||
err = PTR_ERR(kaddr);
|
||||
if (IS_ERR(kaddr))
|
||||
goto out;
|
||||
lock_page(page);
|
||||
kaddr = page_address(page);
|
||||
dir_end = kaddr + nilfs_last_byte(dir, n);
|
||||
de = (struct nilfs_dir_entry *)kaddr;
|
||||
kaddr += PAGE_SIZE - reclen;
|
||||
|
@ -627,11 +625,10 @@ int nilfs_empty_dir(struct inode *inode)
|
|||
char *kaddr;
|
||||
struct nilfs_dir_entry *de;
|
||||
|
||||
page = nilfs_get_page(inode, i);
|
||||
if (IS_ERR(page))
|
||||
continue;
|
||||
kaddr = nilfs_get_page(inode, i, &page);
|
||||
if (IS_ERR(kaddr))
|
||||
return 0;
|
||||
|
||||
kaddr = page_address(page);
|
||||
de = (struct nilfs_dir_entry *)kaddr;
|
||||
kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);
|
||||
|
||||
|
|
|
@ -1692,6 +1692,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
|
|||
if (bh->b_page != bd_page) {
|
||||
if (bd_page) {
|
||||
lock_page(bd_page);
|
||||
wait_on_page_writeback(bd_page);
|
||||
clear_page_dirty_for_io(bd_page);
|
||||
set_page_writeback(bd_page);
|
||||
unlock_page(bd_page);
|
||||
|
@ -1705,6 +1706,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
|
|||
if (bh == segbuf->sb_super_root) {
|
||||
if (bh->b_page != bd_page) {
|
||||
lock_page(bd_page);
|
||||
wait_on_page_writeback(bd_page);
|
||||
clear_page_dirty_for_io(bd_page);
|
||||
set_page_writeback(bd_page);
|
||||
unlock_page(bd_page);
|
||||
|
@ -1721,6 +1723,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
|
|||
}
|
||||
if (bd_page) {
|
||||
lock_page(bd_page);
|
||||
wait_on_page_writeback(bd_page);
|
||||
clear_page_dirty_for_io(bd_page);
|
||||
set_page_writeback(bd_page);
|
||||
unlock_page(bd_page);
|
||||
|
|
|
@ -1940,6 +1940,8 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,
|
|||
|
||||
inode_lock(inode);
|
||||
|
||||
/* Wait all existing dio workers, newcomers will block on i_rwsem */
|
||||
inode_dio_wait(inode);
|
||||
/*
|
||||
* This prevents concurrent writes on other nodes
|
||||
*/
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user