Merge 4.19.317 into android-4.19-stable
Changes in 4.19.317
wifi: mac80211: mesh: Fix leak of mesh_preq_queue objects
wifi: mac80211: Fix deadlock in ieee80211_sta_ps_deliver_wakeup()
wifi: iwlwifi: mvm: revert gen2 TX A-MPDU size to 64
wifi: iwlwifi: mvm: don't read past the mfuart notifcation
ipv6: sr: block BH in seg6_output_core() and seg6_input_core()
vxlan: Fix regression when dropping packets due to invalid src addresses
tcp: count CLOSE-WAIT sockets for TCP_MIB_CURRESTAB
ptp: Fix error message on failed pin verification
af_unix: Annotate data-race of sk->sk_state in unix_inq_len().
af_unix: Annotate data-races around sk->sk_state in unix_write_space() and poll().
af_unix: Annotate data-races around sk->sk_state in sendmsg() and recvmsg().
af_unix: Annotate data-races around sk->sk_state in UNIX_DIAG.
af_unix: Annotate data-race of net->unx.sysctl_max_dgram_qlen.
af_unix: Use unix_recvq_full_lockless() in unix_stream_connect().
af_unix: Use skb_queue_len_lockless() in sk_diag_show_rqlen().
af_unix: Annotate data-race of sk->sk_shutdown in sk_diag_fill().
usb: gadget: f_fs: Fix race between aio_cancel() and AIO request complete
drm/amd/display: Handle Y carry-over in VCP X.Y calculation
serial: sc16is7xx: replace hardcoded divisor value with BIT() macro
serial: sc16is7xx: fix bug in sc16is7xx_set_baud() when using prescaler
media: mc: mark the media devnode as registered from the, start
selftests/mm: compaction_test: fix incorrect write of zero to nr_hugepages
selftests/mm: conform test to TAP format output
selftests/mm: compaction_test: fix bogus test success on Aarch64
nilfs2: Remove check for PageError
nilfs2: return the mapped address from nilfs_get_page()
nilfs2: fix nilfs_empty_dir() misjudgment and long loop on I/O errors
USB: class: cdc-wdm: Fix CPU lockup caused by excessive log messages
mei: me: release irq in mei_me_pci_resume error path
jfs: xattr: fix buffer overflow for invalid xattr
xhci: Apply reset resume quirk to Etron EJ188 xHCI host
xhci: Apply broken streams quirk to Etron EJ188 xHCI host
Input: try trimming too long modalias strings
xsk: validate user input for XDP_{UMEM|COMPLETION}_FILL_RING
HID: core: remove unnecessary WARN_ON() in implement()
iommu/amd: Fix sysfs leak in iommu init
liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet
drm/bridge/panel: Fix runtime warning on panel bridge release
tcp: fix race in tcp_v6_syn_recv_sock()
Bluetooth: L2CAP: Fix rejecting L2CAP_CONN_PARAM_UPDATE_REQ
ipv6/route: Add a missing check on proc_dointvec
net/ipv6: Fix the RT cache flush via sysctl using a previous delay
drivers: core: synchronize really_probe() and dev_uevent()
drm/exynos/vidi: fix memory leak in .get_modes()
vmci: prevent speculation leaks by sanitizing event in event_deliver()
fs/proc: fix softlockup in __read_vmcore
ocfs2: use coarse time for new created files
ocfs2: fix races between hole punching and AIO+DIO
PCI: rockchip-ep: Remove wrong mask on subsys_vendor_id
dmaengine: axi-dmac: fix possible race in remove()
intel_th: pci: Add Granite Rapids support
intel_th: pci: Add Granite Rapids SOC support
intel_th: pci: Add Sapphire Rapids SOC support
intel_th: pci: Add Meteor Lake-S support
intel_th: pci: Add Lunar Lake support
nilfs2: fix potential kernel bug due to lack of writeback flag waiting
hv_utils: drain the timesync packets on onchannelcallback
hugetlb_encode.h: fix undefined behaviour (34 << 26)
usb-storage: alauda: Check whether the media is initialized
rcutorture: Fix rcu_torture_one_read() pipe_count overflow comment
batman-adv: bypass empty buckets in batadv_purge_orig_ref()
scsi: qedi: Fix crash while reading debugfs attribute
powerpc/pseries: Enforce hcall result buffer validity and size
powerpc/io: Avoid clang null pointer arithmetic warnings
usb: misc: uss720: check for incompatible versions of the Belkin F5U002
udf: udftime: prevent overflow in udf_disk_stamp_to_time()
PCI/PM: Avoid D3cold for HP Pavilion 17 PC/1972 PCIe Ports
MIPS: Octeon: Add PCIe link status check
MIPS: Routerboard 532: Fix vendor retry check code
cipso: fix total option length computation
netrom: Fix a memory leak in nr_heartbeat_expiry()
ipv6: prevent possible NULL dereference in rt6_probe()
xfrm6: check ip6_dst_idev() return value in xfrm6_get_saddr()
virtio_net: checksum offloading handling fix
net: usb: rtl8150 fix unintiatilzed variables in rtl8150_get_link_ksettings
regulator: core: Fix modpost error "regulator_get_regmap" undefined
dmaengine: ioatdma: Fix missing kmem_cache_destroy()
ACPICA: Revert "ACPICA: avoid Info: mapping multiple BARs. Your kernel is fine."
drm/radeon: fix UBSAN warning in kv_dpm.c
gcov: add support for GCC 14
ARM: dts: samsung: smdkv310: fix keypad no-autorepeat
ARM: dts: samsung: exynos4412-origen: fix keypad no-autorepeat
ARM: dts: samsung: smdk4412: fix keypad no-autorepeat
selftests/ftrace: Fix checkbashisms errors
tracing: Add MODULE_DESCRIPTION() to preemptirq_delay_test
perf/core: Fix missing wakeup when waiting for context reference
PCI: Add PCI_ERROR_RESPONSE and related definitions
x86/amd_nb: Check for invalid SMN reads
iio: dac: ad5592r-base: Replace indio_dev->mlock with own device lock
iio: dac: ad5592r: un-indent code-block for scale read
iio: dac: ad5592r: fix temperature channel scaling value
scsi: mpt3sas: Add ioc_<level> logging macros
scsi: mpt3sas: Gracefully handle online firmware update
scsi: mpt3sas: Avoid test/set_bit() operating in non-allocated memory
xhci: Use soft retry to recover faster from transaction errors
xhci: Set correct transferred length for cancelled bulk transfers
usb: xhci: do not perform Soft Retry for some xHCI hosts
pinctrl: fix deadlock in create_pinctrl() when handling -EPROBE_DEFER
pinctrl: rockchip: fix pinmux bits for RK3328 GPIO2-B pins
pinctrl: rockchip: fix pinmux bits for RK3328 GPIO3-B pins
pinctrl: rockchip: fix pinmux reset in rockchip_pmx_set
drm/amdgpu: fix UBSAN warning in kv_dpm.c
netfilter: nf_tables: validate family when identifying table via handle
ASoC: fsl-asoc-card: set priv->pdev before using it
netfilter: nf_tables: fully validate NFT_DATA_VALUE on store to data registers
drm/panel: ilitek-ili9881c: Fix warning with GPIO controllers that sleep
net/iucv: Avoid explicit cpumask var allocation on stack
ALSA: emux: improve patch ioctl data validation
media: dvbdev: Initialize sbuf
soc: ti: wkup_m3_ipc: Send NULL dummy message instead of pointer message
nvme: fixup comment for nvme RDMA Provider Type
gpio: davinci: Validate the obtained number of IRQs
i2c: ocores: stop transfer on timeout
i2c: ocores: set IACK bit after core is enabled
x86: stop playing stack games in profile_pc()
mmc: sdhci-pci: Convert PCIBIOS_* return codes to errnos
iio: adc: ad7266: Fix variable checking bug
iio: chemical: bme680: Fix pressure value output
iio: chemical: bme680: Fix calibration data variable
iio: chemical: bme680: Fix overflows in compensate() functions
iio: chemical: bme680: Fix sensor data read operation
net: usb: ax88179_178a: improve link status logs
usb: gadget: printer: SS+ support
usb: musb: da8xx: fix a resource leak in probe()
usb: atm: cxacru: fix endpoint checking in cxacru_bind()
tty: mcf: MCF54418 has 10 UARTS
hexagon: fix fadvise64_64 calling conventions
drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_ld_modes
drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_hd_modes
batman-adv: Don't accept TT entries for out-of-spec VIDs
ata: libata-core: Fix double free on error
ftruncate: pass a signed offset
pwm: stm32: Refuse too small period requests
ipv6: annotate some data-races around sk->sk_prot
ipv6: Fix data races around sk->sk_prot.
tcp: Fix data races around icsk->icsk_af_ops.
arm64: dts: rockchip: Add sound-dai-cells for RK3368
Linux 4.19.317
Change-Id: Ic469df3aff3d8233947e4f13951e091deca41c65
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
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 316
|
||||
SUBLEVEL = 317
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -437,7 +437,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";
|
||||
|
||||
@@ -677,6 +677,7 @@
|
||||
dma-names = "tx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_tx>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -688,6 +689,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";
|
||||
};
|
||||
|
||||
@@ -701,6 +703,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s_8ch_bus>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
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);
|
||||
@@ -27,6 +27,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>
|
||||
};
|
||||
|
||||
@@ -112,8 +112,8 @@ static int read_config_dword(struct pci_bus *bus, unsigned int devfn,
|
||||
* 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;
|
||||
|
||||
@@ -383,7 +383,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
|
||||
@@ -397,7 +397,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
|
||||
@@ -408,8 +408,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;
|
||||
|
||||
@@ -569,12 +569,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
|
||||
@@ -590,12 +590,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)
|
||||
|
||||
@@ -145,7 +145,14 @@ static int __amd_smn_rw(u16 node, u32 address, u32 *value, bool write)
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@@ -26,26 +26,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 *)kernel_stack_pointer(regs);
|
||||
/*
|
||||
* 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 */
|
||||
|
||||
|
||||
@@ -6212,8 +6212,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)
|
||||
@@ -6245,8 +6247,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -1658,8 +1658,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;
|
||||
|
||||
|
||||
@@ -710,8 +710,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);
|
||||
|
||||
@@ -1429,6 +1429,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);
|
||||
|
||||
@@ -207,6 +207,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;
|
||||
}
|
||||
|
||||
nbank = DIV_ROUND_UP(ngpio, 32);
|
||||
chips = devm_kcalloc(dev,
|
||||
nbank, sizeof(struct davinci_gpio_controller),
|
||||
|
||||
@@ -164,6 +164,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 =
|
||||
|
||||
@@ -620,6 +620,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);
|
||||
|
||||
@@ -205,9 +205,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);
|
||||
}
|
||||
|
||||
struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
|
||||
|
||||
@@ -302,6 +302,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
|
||||
@@ -321,7 +322,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 = {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1622,6 +1622,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 =
|
||||
|
||||
@@ -1264,7 +1264,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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,10 +294,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,
|
||||
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)];
|
||||
|
||||
|
||||
@@ -255,6 +255,11 @@ 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),
|
||||
@@ -265,6 +270,26 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x7e24),
|
||||
.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),
|
||||
|
||||
@@ -25,7 +25,12 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/**
|
||||
* @process_lock: protect I2C transfer process.
|
||||
* ocores_process() and ocores_process_timeout() can't run in parallel.
|
||||
*/
|
||||
struct ocores_i2c {
|
||||
void __iomem *base;
|
||||
u32 reg_shift;
|
||||
@@ -36,6 +41,7 @@ struct ocores_i2c {
|
||||
int pos;
|
||||
int nmsgs;
|
||||
int state; /* see STATE_ */
|
||||
spinlock_t process_lock;
|
||||
struct clk *clk;
|
||||
int ip_clock_khz;
|
||||
int bus_clock_khz;
|
||||
@@ -141,19 +147,26 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
{
|
||||
struct i2c_msg *msg = i2c->msg;
|
||||
u8 stat = oc_getreg(i2c, OCI2C_STATUS);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* If we spin here is because we are in timeout, so we are going
|
||||
* to be in STATE_ERROR. See ocores_process_timeout()
|
||||
*/
|
||||
spin_lock_irqsave(&i2c->process_lock, flags);
|
||||
|
||||
if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) {
|
||||
/* stop has been sent */
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
wake_up(&i2c->wait);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* error? */
|
||||
if (stat & OCI2C_STAT_ARBLOST) {
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) {
|
||||
@@ -163,7 +176,7 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
if (stat & OCI2C_STAT_NACK) {
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
} else
|
||||
msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA);
|
||||
@@ -184,14 +197,14 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
|
||||
oc_setreg(i2c, OCI2C_DATA, addr);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);
|
||||
return;
|
||||
goto out;
|
||||
} else
|
||||
i2c->state = (msg->flags & I2C_M_RD)
|
||||
? STATE_READ : STATE_WRITE;
|
||||
} else {
|
||||
i2c->state = STATE_DONE;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,6 +215,9 @@ static void ocores_process(struct ocores_i2c *i2c)
|
||||
oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE);
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&i2c->process_lock, flags);
|
||||
}
|
||||
|
||||
static irqreturn_t ocores_isr(int irq, void *dev_id)
|
||||
@@ -213,9 +229,24 @@ static irqreturn_t ocores_isr(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process timeout event
|
||||
* @i2c: ocores I2C device instance
|
||||
*/
|
||||
static void ocores_process_timeout(struct ocores_i2c *i2c)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&i2c->process_lock, flags);
|
||||
i2c->state = STATE_ERROR;
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
|
||||
spin_unlock_irqrestore(&i2c->process_lock, flags);
|
||||
}
|
||||
|
||||
static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
{
|
||||
struct ocores_i2c *i2c = i2c_get_adapdata(adap);
|
||||
int ret;
|
||||
|
||||
i2c->msg = msgs;
|
||||
i2c->pos = 0;
|
||||
@@ -225,11 +256,14 @@ static int ocores_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
oc_setreg(i2c, OCI2C_DATA, i2c_8bit_addr_from_msg(i2c->msg));
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);
|
||||
|
||||
if (wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) ||
|
||||
(i2c->state == STATE_DONE), HZ))
|
||||
return (i2c->state == STATE_DONE) ? num : -EIO;
|
||||
else
|
||||
ret = wait_event_timeout(i2c->wait, (i2c->state == STATE_ERROR) ||
|
||||
(i2c->state == STATE_DONE), HZ);
|
||||
if (ret == 0) {
|
||||
ocores_process_timeout(i2c);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return (i2c->state == STATE_DONE) ? num : -EIO;
|
||||
}
|
||||
|
||||
static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
|
||||
@@ -256,8 +290,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_IEN | OCI2C_CTRL_EN);
|
||||
oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -422,6 +456,8 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
||||
if (!i2c)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&i2c->process_lock);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
i2c->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(i2c->base))
|
||||
|
||||
@@ -160,6 +160,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);
|
||||
|
||||
@@ -57,7 +57,9 @@
|
||||
#define BME680_NB_CONV_0_VAL 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;
|
||||
@@ -348,10 +349,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;
|
||||
|
||||
@@ -374,9 +375,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;
|
||||
@@ -394,7 +395,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;
|
||||
}
|
||||
@@ -420,7 +421,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;
|
||||
@@ -536,6 +537,43 @@ static int bme680_set_mode(struct bme680_data *data, bool mode)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
@@ -622,6 +660,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) {
|
||||
@@ -678,7 +720,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;
|
||||
}
|
||||
|
||||
@@ -738,6 +780,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");
|
||||
|
||||
@@ -158,7 +158,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))
|
||||
@@ -168,10 +167,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);
|
||||
@@ -199,7 +198,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;
|
||||
|
||||
@@ -249,7 +247,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);
|
||||
@@ -287,7 +285,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;
|
||||
}
|
||||
|
||||
@@ -316,11 +314,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) {
|
||||
@@ -335,12 +333,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;
|
||||
}
|
||||
|
||||
@@ -362,7 +360,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;
|
||||
}
|
||||
@@ -380,11 +378,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);
|
||||
@@ -417,29 +415,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;
|
||||
@@ -452,7 +448,7 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&iio_dev->mlock);
|
||||
mutex_unlock(&st->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -627,6 +623,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);
|
||||
|
||||
@@ -53,6 +53,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];
|
||||
|
||||
@@ -1345,19 +1345,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-",
|
||||
@@ -1366,8 +1366,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,
|
||||
@@ -1383,12 +1424,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)
|
||||
@@ -1396,7 +1450,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);
|
||||
}
|
||||
@@ -1569,6 +1625,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)
|
||||
{
|
||||
@@ -1578,9 +1651,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;
|
||||
|
||||
@@ -1409,8 +1409,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);
|
||||
|
||||
@@ -964,7 +964,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;
|
||||
|
||||
@@ -253,15 +253,14 @@ int __must_check media_devnode_register(struct media_device *mdev,
|
||||
devnode->cdev.owner = owner;
|
||||
|
||||
/* Part 3: Add the media and char device */
|
||||
set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
|
||||
ret = cdev_device_add(&devnode->cdev, &devnode->dev);
|
||||
if (ret < 0) {
|
||||
clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
|
||||
pr_err("%s: cdev_device_add failed\n", __func__);
|
||||
goto cdev_add_error;
|
||||
}
|
||||
|
||||
/* Part 4: Activate this minor. The char device can now be used. */
|
||||
set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
|
||||
|
||||
return 0;
|
||||
|
||||
cdev_add_error:
|
||||
|
||||
@@ -388,8 +388,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);
|
||||
|
||||
@@ -17,6 +17,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>
|
||||
@@ -94,9 +95,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);
|
||||
|
||||
@@ -1103,7 +1103,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
|
||||
@@ -1114,7 +1114,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)
|
||||
@@ -1986,7 +1989,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);
|
||||
@@ -1997,7 +2000,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;
|
||||
|
||||
|
||||
@@ -289,13 +289,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));
|
||||
|
||||
@@ -357,7 +357,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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1548,6 +1549,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;
|
||||
@@ -1585,6 +1587,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -804,7 +804,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 |
|
||||
|
||||
@@ -3020,8 +3020,15 @@ 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;
|
||||
|
||||
dev->vlan_features = dev->features;
|
||||
|
||||
|
||||
@@ -1040,6 +1040,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))
|
||||
|
||||
@@ -195,20 +195,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,
|
||||
|
||||
@@ -144,13 +144,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);
|
||||
}
|
||||
|
||||
|
||||
@@ -2530,6 +2530,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
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -1078,8 +1078,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -662,23 +662,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
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2158,8 +2203,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;
|
||||
}
|
||||
@@ -3689,7 +3736,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",
|
||||
|
||||
@@ -97,7 +97,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;
|
||||
|
||||
|
||||
@@ -2753,6 +2753,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
|
||||
|
||||
@@ -6612,6 +6612,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) {
|
||||
@@ -6629,6 +6635,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) {
|
||||
@@ -6719,6 +6732,13 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
|
||||
if (r)
|
||||
goto out_free_resources;
|
||||
|
||||
/*
|
||||
* Copy current copy of IOCFacts in prev_fw_facts
|
||||
* and it will be used during online firmware upgrade.
|
||||
*/
|
||||
memcpy(&ioc->prev_fw_facts, &ioc->facts,
|
||||
sizeof(struct mpt3sas_facts));
|
||||
|
||||
ioc->non_operational_loop = 0;
|
||||
ioc->got_task_abort_from_ioctl = 0;
|
||||
return 0;
|
||||
@@ -6884,6 +6904,91 @@ mpt3sas_wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc)
|
||||
wait_event_timeout(ioc->reset_wq, ioc->pending_io_count == 0, 10 * HZ);
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_check_ioc_facts_changes - Look for increase/decrease of IOCFacts
|
||||
* attributes during online firmware upgrade and update the corresponding
|
||||
* IOC variables accordingly.
|
||||
*
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
*/
|
||||
static int
|
||||
_base_check_ioc_facts_changes(struct MPT3SAS_ADAPTER *ioc)
|
||||
{
|
||||
u16 pd_handles_sz;
|
||||
void *pd_handles = NULL, *blocking_handles = NULL;
|
||||
void *pend_os_device_add = NULL, *device_remove_in_progress = NULL;
|
||||
struct mpt3sas_facts *old_facts = &ioc->prev_fw_facts;
|
||||
|
||||
if (ioc->facts.MaxDevHandle > old_facts->MaxDevHandle) {
|
||||
pd_handles_sz = (ioc->facts.MaxDevHandle / 8);
|
||||
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) {
|
||||
ioc_info(ioc,
|
||||
"Unable to allocate the memory for pd_handles of sz: %d\n",
|
||||
pd_handles_sz);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(pd_handles + ioc->pd_handles_sz, 0,
|
||||
(pd_handles_sz - ioc->pd_handles_sz));
|
||||
ioc->pd_handles = pd_handles;
|
||||
|
||||
blocking_handles = krealloc(ioc->blocking_handles,
|
||||
pd_handles_sz, GFP_KERNEL);
|
||||
if (!blocking_handles) {
|
||||
ioc_info(ioc,
|
||||
"Unable to allocate the memory for "
|
||||
"blocking_handles of sz: %d\n",
|
||||
pd_handles_sz);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(blocking_handles + ioc->pd_handles_sz, 0,
|
||||
(pd_handles_sz - ioc->pd_handles_sz));
|
||||
ioc->blocking_handles = blocking_handles;
|
||||
ioc->pd_handles_sz = pd_handles_sz;
|
||||
|
||||
pend_os_device_add = krealloc(ioc->pend_os_device_add,
|
||||
pd_handles_sz, GFP_KERNEL);
|
||||
if (!pend_os_device_add) {
|
||||
ioc_info(ioc,
|
||||
"Unable to allocate the memory for pend_os_device_add of sz: %d\n",
|
||||
pd_handles_sz);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(pend_os_device_add + ioc->pend_os_device_add_sz, 0,
|
||||
(pd_handles_sz - ioc->pend_os_device_add_sz));
|
||||
ioc->pend_os_device_add = pend_os_device_add;
|
||||
ioc->pend_os_device_add_sz = pd_handles_sz;
|
||||
|
||||
device_remove_in_progress = krealloc(
|
||||
ioc->device_remove_in_progress, pd_handles_sz, GFP_KERNEL);
|
||||
if (!device_remove_in_progress) {
|
||||
ioc_info(ioc,
|
||||
"Unable to allocate the memory for "
|
||||
"device_remove_in_progress of sz: %d\n "
|
||||
, pd_handles_sz);
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(device_remove_in_progress +
|
||||
ioc->device_remove_in_progress_sz, 0,
|
||||
(pd_handles_sz - ioc->device_remove_in_progress_sz));
|
||||
ioc->device_remove_in_progress = device_remove_in_progress;
|
||||
ioc->device_remove_in_progress_sz = pd_handles_sz;
|
||||
}
|
||||
|
||||
memcpy(&ioc->prev_fw_facts, &ioc->facts, sizeof(struct mpt3sas_facts));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpt3sas_base_hard_reset_handler - reset controller
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
@@ -6949,6 +7054,13 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
r = _base_check_ioc_facts_changes(ioc);
|
||||
if (r) {
|
||||
ioc_info(ioc,
|
||||
"Some of the parameters got changed in this new firmware"
|
||||
" image and it requires system reboot\n");
|
||||
goto out;
|
||||
}
|
||||
if (ioc->rdpq_array_enable && !ioc->rdpq_array_capable)
|
||||
panic("%s: Issue occurred with flashing controller firmware."
|
||||
"Please reboot the system and ensure that the correct"
|
||||
|
||||
@@ -160,6 +160,15 @@ struct mpt3sas_nvme_cmd {
|
||||
*/
|
||||
#define MPT3SAS_FMT "%s: "
|
||||
|
||||
#define ioc_err(ioc, fmt, ...) \
|
||||
pr_err("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
|
||||
#define ioc_notice(ioc, fmt, ...) \
|
||||
pr_notice("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
|
||||
#define ioc_warn(ioc, fmt, ...) \
|
||||
pr_warn("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
|
||||
#define ioc_info(ioc, fmt, ...) \
|
||||
pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
|
||||
|
||||
/*
|
||||
* WarpDrive Specific Log codes
|
||||
*/
|
||||
@@ -1023,6 +1032,7 @@ typedef void (*MPT3SAS_FLUSH_RUNNING_CMDS)(struct MPT3SAS_ADAPTER *ioc);
|
||||
* @event_log: event log pointer
|
||||
* @event_masks: events that are masked
|
||||
* @facts: static facts data
|
||||
* @prev_fw_facts: previous fw facts data
|
||||
* @pfacts: static port facts data
|
||||
* @manu_pg0: static manufacturing page 0
|
||||
* @manu_pg10: static manufacturing page 10
|
||||
@@ -1226,6 +1236,7 @@ struct MPT3SAS_ADAPTER {
|
||||
|
||||
/* static config pages */
|
||||
struct mpt3sas_facts facts;
|
||||
struct mpt3sas_facts prev_fw_facts;
|
||||
struct mpt3sas_port_facts *pfacts;
|
||||
Mpi2ManufacturingPage0_t manu_pg0;
|
||||
struct Mpi2ManufacturingPage10_t manu_pg10;
|
||||
|
||||
@@ -136,15 +136,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
|
||||
|
||||
@@ -22,7 +22,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>
|
||||
@@ -158,7 +157,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) {
|
||||
@@ -174,7 +172,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);
|
||||
@@ -196,7 +194,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) {
|
||||
@@ -205,7 +202,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,
|
||||
|
||||
@@ -1127,6 +1127,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 */
|
||||
@@ -1173,6 +1174,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;
|
||||
}
|
||||
|
||||
@@ -761,6 +761,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();
|
||||
@@ -777,7 +778,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
|
||||
@@ -223,6 +224,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;
|
||||
@@ -273,6 +280,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
pdev->device == 0x9026)
|
||||
xhci->quirks |= XHCI_RESET_PLL_ON_DISCONNECT;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_AMD &&
|
||||
(pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2 ||
|
||||
pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4))
|
||||
xhci->quirks |= XHCI_NO_SOFT_RETRY;
|
||||
|
||||
if (xhci->quirks & XHCI_RESET_ON_RESUME)
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
|
||||
"QUIRK: Resetting on resume");
|
||||
|
||||
@@ -1213,6 +1213,10 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd *xhci, int slot_id,
|
||||
/* Clear our internal halted state */
|
||||
ep->ep_state &= ~EP_HALTED;
|
||||
}
|
||||
|
||||
/* if this was a soft reset, then restart */
|
||||
if ((le32_to_cpu(trb->generic.field[3])) & TRB_TSP)
|
||||
ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
|
||||
}
|
||||
|
||||
static void xhci_handle_cmd_enable_slot(struct xhci_hcd *xhci, int slot_id,
|
||||
@@ -2245,10 +2249,16 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
union xhci_trb *ep_trb, struct xhci_transfer_event *event,
|
||||
struct xhci_virt_ep *ep, int *status)
|
||||
{
|
||||
struct xhci_slot_ctx *slot_ctx;
|
||||
struct xhci_ring *ep_ring;
|
||||
u32 trb_comp_code;
|
||||
u32 remaining, requested, ep_trb_len;
|
||||
unsigned int slot_id;
|
||||
int ep_index;
|
||||
|
||||
slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
|
||||
slot_ctx = xhci_get_slot_ctx(xhci, xhci->devs[slot_id]->out_ctx);
|
||||
ep_index = TRB_TO_EP_ID(le32_to_cpu(event->flags)) - 1;
|
||||
ep_ring = xhci_dma_to_transfer_ring(ep, le64_to_cpu(event->buffer));
|
||||
trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
|
||||
remaining = EVENT_TRB_LEN(le32_to_cpu(event->transfer_len));
|
||||
@@ -2257,6 +2267,7 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td,
|
||||
|
||||
switch (trb_comp_code) {
|
||||
case COMP_SUCCESS:
|
||||
ep_ring->err_count = 0;
|
||||
/* handle success with untransferred data as short packet */
|
||||
if (ep_trb != td->last_trb || remaining) {
|
||||
xhci_warn(xhci, "WARN Successful completion on short TX\n");
|
||||
@@ -2277,9 +2288,17 @@ 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) ||
|
||||
le32_to_cpu(slot_ctx->tt_info) & TT_SLOT)
|
||||
break;
|
||||
*status = 0;
|
||||
xhci_cleanup_halted_endpoint(xhci, slot_id, ep_index,
|
||||
ep_ring->stream_id, td, EP_SOFT_RESET);
|
||||
return 0;
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
|
||||
@@ -1517,6 +1517,7 @@ static inline const char *xhci_trb_type_string(u8 type)
|
||||
/* How much data is left before the 64KB boundary? */
|
||||
#define TRB_BUFF_LEN_UP_TO_BOUNDARY(addr) (TRB_MAX_BUFF_SIZE - \
|
||||
(addr & (TRB_MAX_BUFF_SIZE - 1)))
|
||||
#define MAX_SOFT_RETRY 3
|
||||
|
||||
struct xhci_segment {
|
||||
union xhci_trb *trbs;
|
||||
@@ -1604,6 +1605,7 @@ struct xhci_ring {
|
||||
* if we own the TRB (if we are the consumer). See section 4.9.1.
|
||||
*/
|
||||
u32 cycle_state;
|
||||
unsigned int err_count;
|
||||
unsigned int stream_id;
|
||||
unsigned int num_segs;
|
||||
unsigned int num_trbs_free;
|
||||
@@ -1886,6 +1888,7 @@ struct xhci_hcd {
|
||||
#define XHCI_RESET_PLL_ON_DISCONNECT BIT_ULL(34)
|
||||
#define XHCI_SNPS_BROKEN_SUSPEND BIT_ULL(35)
|
||||
#define XHCI_DISABLE_SPARSE BIT_ULL(38)
|
||||
#define XHCI_NO_SOFT_RETRY BIT_ULL(40)
|
||||
|
||||
unsigned int num_active_eps;
|
||||
unsigned int limit_active_eps;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -104,6 +104,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 ) )
|
||||
@@ -475,11 +477,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;
|
||||
|
||||
@@ -570,9 +570,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;
|
||||
|
||||
@@ -186,19 +186,24 @@ static bool nilfs_check_page(struct page *page)
|
||||
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 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
||||
|
||||
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);
|
||||
|
||||
@@ -1948,6 +1948,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
|
||||
*/
|
||||
|
||||
@@ -571,7 +571,7 @@ static int __ocfs2_mknod_locked(struct inode *dir,
|
||||
fe->i_last_eb_blk = 0;
|
||||
strcpy(fe->i_signature, OCFS2_INODE_SIGNATURE);
|
||||
fe->i_flags |= cpu_to_le32(OCFS2_VALID_FL);
|
||||
ktime_get_real_ts64(&ts);
|
||||
ktime_get_coarse_real_ts64(&ts);
|
||||
fe->i_atime = fe->i_ctime = fe->i_mtime =
|
||||
cpu_to_le64(ts.tv_sec);
|
||||
fe->i_mtime_nsec = fe->i_ctime_nsec = fe->i_atime_nsec =
|
||||
|
||||
@@ -199,13 +199,13 @@ long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
|
||||
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, off_t, length)
|
||||
{
|
||||
return do_sys_ftruncate(fd, length, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
|
||||
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_off_t, length)
|
||||
{
|
||||
return do_sys_ftruncate(fd, length, 1);
|
||||
}
|
||||
|
||||
@@ -359,6 +359,8 @@ static ssize_t __read_vmcore(char *buffer, size_t buflen, loff_t *fpos,
|
||||
/* leave now if filled buffer already */
|
||||
if (buflen == 0)
|
||||
return acc;
|
||||
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
list_for_each_entry(m, &vmcore_list, list) {
|
||||
|
||||
@@ -60,13 +60,18 @@ udf_disk_stamp_to_time(struct timespec64 *dest, struct timestamp src)
|
||||
dest->tv_sec = mktime64(year, src.month, src.day, src.hour, src.minute,
|
||||
src.second);
|
||||
dest->tv_sec -= offset * 60;
|
||||
dest->tv_nsec = 1000 * (src.centiseconds * 10000 +
|
||||
src.hundredsOfMicroseconds * 100 + src.microseconds);
|
||||
|
||||
/*
|
||||
* Sanitize nanosecond field since reportedly some filesystems are
|
||||
* recorded with bogus sub-second values.
|
||||
*/
|
||||
dest->tv_nsec %= NSEC_PER_SEC;
|
||||
if (src.centiseconds < 100 && src.hundredsOfMicroseconds < 100 &&
|
||||
src.microseconds < 100) {
|
||||
dest->tv_nsec = 1000 * (src.centiseconds * 10000 +
|
||||
src.hundredsOfMicroseconds * 100 + src.microseconds);
|
||||
} else {
|
||||
dest->tv_nsec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -598,7 +598,7 @@ asmlinkage long compat_sys_fstatfs(unsigned int fd,
|
||||
asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
|
||||
struct compat_statfs64 __user *buf);
|
||||
asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
|
||||
asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
|
||||
asmlinkage long compat_sys_ftruncate(unsigned int, compat_off_t);
|
||||
/* No generic prototype for truncate64, ftruncate64, fallocate */
|
||||
asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
|
||||
int flags, umode_t mode);
|
||||
|
||||
@@ -71,8 +71,8 @@ enum {
|
||||
NVMF_RDMA_QPTYPE_DATAGRAM = 2, /* Reliable Datagram */
|
||||
};
|
||||
|
||||
/* RDMA QP Service Type codes for Discovery Log Page entry TSAS
|
||||
* RDMA_QPTYPE field
|
||||
/* RDMA Provider Type codes for Discovery Log Page entry TSAS
|
||||
* RDMA_PRTYPE field
|
||||
*/
|
||||
enum {
|
||||
NVMF_RDMA_PRTYPE_NOT_SPECIFIED = 1, /* No Provider Specified */
|
||||
|
||||
@@ -124,6 +124,15 @@ enum pci_interrupt_pin {
|
||||
/* The number of legacy PCI INTx interrupts */
|
||||
#define PCI_NUM_INTX 4
|
||||
|
||||
/*
|
||||
* Reading from a device that doesn't respond typically returns ~0. A
|
||||
* successful read from a device may also return ~0, so you need additional
|
||||
* information to reliably identify errors.
|
||||
*/
|
||||
#define PCI_ERROR_RESPONSE (~0ULL)
|
||||
#define PCI_SET_ERROR_RESPONSE(val) (*(val) = ((typeof(*(val))) PCI_ERROR_RESPONSE))
|
||||
#define PCI_POSSIBLE_ERROR(val) ((val) == ((typeof(val)) PCI_ERROR_RESPONSE))
|
||||
|
||||
/*
|
||||
* pci_power_t values must match the bits in the Capabilities PME_Support
|
||||
* and Control/Status PowerState fields in the Power Management capability.
|
||||
|
||||
@@ -404,7 +404,7 @@ asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user *buf);
|
||||
asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz,
|
||||
struct statfs64 __user *buf);
|
||||
asmlinkage long sys_truncate(const char __user *path, long length);
|
||||
asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length);
|
||||
asmlinkage long sys_ftruncate(unsigned int fd, off_t length);
|
||||
#if BITS_PER_LONG == 32
|
||||
asmlinkage long sys_truncate64(const char __user *path, loff_t length);
|
||||
asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length);
|
||||
|
||||
@@ -1430,18 +1430,46 @@ static inline int hci_check_conn_params(u16 min, u16 max, u16 latency,
|
||||
{
|
||||
u16 max_latency;
|
||||
|
||||
if (min > max || min < 6 || max > 3200)
|
||||
if (min > max) {
|
||||
BT_WARN("min %d > max %d", min, max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (to_multiplier < 10 || to_multiplier > 3200)
|
||||
if (min < 6) {
|
||||
BT_WARN("min %d < 6", min);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (max >= to_multiplier * 8)
|
||||
if (max > 3200) {
|
||||
BT_WARN("max %d > 3200", max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (to_multiplier < 10) {
|
||||
BT_WARN("to_multiplier %d < 10", to_multiplier);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (to_multiplier > 3200) {
|
||||
BT_WARN("to_multiplier %d > 3200", to_multiplier);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (max >= to_multiplier * 8) {
|
||||
BT_WARN("max %d >= to_multiplier %d * 8", max, to_multiplier);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
max_latency = (to_multiplier * 4 / max) - 1;
|
||||
if (latency > 499 || latency > max_latency)
|
||||
if (latency > 499) {
|
||||
BT_WARN("latency %d > 499", latency);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (latency > max_latency) {
|
||||
BT_WARN("latency %d > max_latency %d", latency, max_latency);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -445,6 +445,11 @@ static inline void *nft_set_priv(const struct nft_set *set)
|
||||
return (void *)set->data;
|
||||
}
|
||||
|
||||
static inline enum nft_data_types nft_set_datatype(const struct nft_set *set)
|
||||
{
|
||||
return set->dtype == NFT_DATA_VERDICT ? NFT_DATA_VERDICT : NFT_DATA_VALUE;
|
||||
}
|
||||
|
||||
static inline bool nft_set_gc_is_pending(const struct nft_set *s)
|
||||
{
|
||||
return refcount_read(&s->refs) != 1;
|
||||
|
||||
@@ -20,17 +20,17 @@
|
||||
#define HUGETLB_FLAG_ENCODE_SHIFT 26
|
||||
#define HUGETLB_FLAG_ENCODE_MASK 0x3f
|
||||
|
||||
#define HUGETLB_FLAG_ENCODE_64KB (16 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_512KB (19 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_1MB (20 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_2MB (21 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_8MB (23 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_16MB (24 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_32MB (25 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_256MB (28 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_512MB (29 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_1GB (30 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_2GB (31 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_16GB (34 << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_64KB (16U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_512KB (19U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_1MB (20U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_2MB (21U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_8MB (23U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_16MB (24U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_32MB (25U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_256MB (28U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_512MB (29U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_1GB (30U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_2GB (31U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
#define HUGETLB_FLAG_ENCODE_16GB (34U << HUGETLB_FLAG_ENCODE_SHIFT)
|
||||
|
||||
#endif /* _ASM_GENERIC_HUGETLB_ENCODE_H_ */
|
||||
|
||||
@@ -4629,6 +4629,7 @@ int perf_event_release_kernel(struct perf_event *event)
|
||||
again:
|
||||
mutex_lock(&event->child_mutex);
|
||||
list_for_each_entry(child, &event->child_list, child_list) {
|
||||
void *var = NULL;
|
||||
|
||||
/*
|
||||
* Cannot change, child events are not migrated, see the
|
||||
@@ -4669,11 +4670,23 @@ int perf_event_release_kernel(struct perf_event *event)
|
||||
* this can't be the last reference.
|
||||
*/
|
||||
put_event(event);
|
||||
} else {
|
||||
var = &ctx->refcount;
|
||||
}
|
||||
|
||||
mutex_unlock(&event->child_mutex);
|
||||
mutex_unlock(&ctx->mutex);
|
||||
put_ctx(ctx);
|
||||
|
||||
if (var) {
|
||||
/*
|
||||
* If perf_event_free_task() has deleted all events from the
|
||||
* ctx while the child_mutex got released above, make sure to
|
||||
* notify about the preceding put_ctx().
|
||||
*/
|
||||
smp_mb(); /* pairs with wait_var_event() */
|
||||
wake_up_var(var);
|
||||
}
|
||||
goto again;
|
||||
}
|
||||
mutex_unlock(&event->child_mutex);
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include "gcov.h"
|
||||
|
||||
#if (__GNUC__ >= 10)
|
||||
#if (__GNUC__ >= 14)
|
||||
#define GCOV_COUNTERS 9
|
||||
#elif (__GNUC__ >= 10)
|
||||
#define GCOV_COUNTERS 8
|
||||
#elif (__GNUC__ >= 7)
|
||||
#define GCOV_COUNTERS 9
|
||||
|
||||
@@ -1334,7 +1334,8 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp)
|
||||
preempt_disable();
|
||||
pipe_count = p->rtort_pipe_count;
|
||||
if (pipe_count > RCU_TORTURE_PIPE_LEN) {
|
||||
/* Should not happen, but... */
|
||||
// Should not happen in a correct RCU implementation,
|
||||
// happens quite often for torture_type=busted.
|
||||
pipe_count = RCU_TORTURE_PIPE_LEN;
|
||||
}
|
||||
completed = cur_ops->get_gp_seq();
|
||||
|
||||
@@ -69,4 +69,5 @@ static void __exit preemptirq_delay_exit(void)
|
||||
|
||||
module_init(preemptirq_delay_init)
|
||||
module_exit(preemptirq_delay_exit)
|
||||
MODULE_DESCRIPTION("Preempt / IRQ disable delay thread to test latency tracers");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
@@ -143,6 +144,29 @@ batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
|
||||
return vlan;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_vlan_id_valid() - check if vlan id is in valid batman-adv encoding
|
||||
* @vid: the VLAN identifier
|
||||
*
|
||||
* Return: true when either no vlan is set or if VLAN is in correct range,
|
||||
* false otherwise
|
||||
*/
|
||||
static bool batadv_vlan_id_valid(unsigned short vid)
|
||||
{
|
||||
unsigned short non_vlan = vid & ~(BATADV_VLAN_HAS_TAG | VLAN_VID_MASK);
|
||||
|
||||
if (vid == 0)
|
||||
return true;
|
||||
|
||||
if (!(vid & BATADV_VLAN_HAS_TAG))
|
||||
return false;
|
||||
|
||||
if (non_vlan)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_orig_node_vlan_new() - search and possibly create an orig_node_vlan
|
||||
* object
|
||||
@@ -161,6 +185,9 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
|
||||
{
|
||||
struct batadv_orig_node_vlan *vlan;
|
||||
|
||||
if (!batadv_vlan_id_valid(vid))
|
||||
return NULL;
|
||||
|
||||
spin_lock_bh(&orig_node->vlan_list_lock);
|
||||
|
||||
/* first look if an object for this vid already exists */
|
||||
@@ -1358,6 +1385,8 @@ void batadv_purge_orig_ref(struct batadv_priv *bat_priv)
|
||||
/* for all origins... */
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
if (hlist_empty(head))
|
||||
continue;
|
||||
list_lock = &hash->list_locks[i];
|
||||
|
||||
spin_lock_bh(list_lock);
|
||||
|
||||
@@ -5316,13 +5316,7 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn,
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
if (max > hcon->le_conn_max_interval) {
|
||||
BT_DBG("requested connection interval exceeds current bounds.");
|
||||
err = -EINVAL;
|
||||
} else {
|
||||
err = hci_check_conn_params(min, max, latency, to_multiplier);
|
||||
}
|
||||
|
||||
err = hci_check_conn_params(min, max, latency, to_multiplier);
|
||||
if (err)
|
||||
rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
|
||||
else
|
||||
|
||||
@@ -3064,7 +3064,8 @@ int sock_common_getsockopt(struct socket *sock, int level, int optname,
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen);
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
return READ_ONCE(sk->sk_prot)->getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL(sock_common_getsockopt);
|
||||
|
||||
@@ -3105,7 +3106,8 @@ int sock_common_setsockopt(struct socket *sock, int level, int optname,
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen);
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
return READ_ONCE(sk->sk_prot)->setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL(sock_common_setsockopt);
|
||||
|
||||
|
||||
@@ -553,22 +553,27 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,
|
||||
int addr_len, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
const struct proto *prot;
|
||||
int err;
|
||||
|
||||
if (addr_len < sizeof(uaddr->sa_family))
|
||||
return -EINVAL;
|
||||
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
|
||||
if (uaddr->sa_family == AF_UNSPEC)
|
||||
return sk->sk_prot->disconnect(sk, flags);
|
||||
return prot->disconnect(sk, flags);
|
||||
|
||||
if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) {
|
||||
err = sk->sk_prot->pre_connect(sk, uaddr, addr_len);
|
||||
err = prot->pre_connect(sk, uaddr, addr_len);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!inet_sk(sk)->inet_num && inet_autobind(sk))
|
||||
return -EAGAIN;
|
||||
return sk->sk_prot->connect(sk, uaddr, addr_len);
|
||||
return prot->connect(sk, uaddr, addr_len);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_dgram_connect);
|
||||
|
||||
@@ -729,10 +734,11 @@ EXPORT_SYMBOL(inet_stream_connect);
|
||||
int inet_accept(struct socket *sock, struct socket *newsock, int flags,
|
||||
bool kern)
|
||||
{
|
||||
struct sock *sk1 = sock->sk;
|
||||
struct sock *sk1 = sock->sk, *sk2;
|
||||
int err = -EINVAL;
|
||||
struct sock *sk2 = sk1->sk_prot->accept(sk1, flags, &err, kern);
|
||||
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, flags, &err, kern);
|
||||
if (!sk2)
|
||||
goto do_err;
|
||||
|
||||
@@ -787,15 +793,19 @@ EXPORT_SYMBOL(inet_getname);
|
||||
int inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
const struct proto *prot;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
|
||||
/* We may need to bind the socket. */
|
||||
if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind &&
|
||||
if (!inet_sk(sk)->inet_num && !prot->no_autobind &&
|
||||
inet_autobind(sk))
|
||||
return -EAGAIN;
|
||||
|
||||
return sk->sk_prot->sendmsg(sk, msg, size);
|
||||
return prot->sendmsg(sk, msg, size);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_sendmsg);
|
||||
|
||||
@@ -803,6 +813,7 @@ ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
||||
size_t size, int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
const struct proto *prot;
|
||||
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
@@ -811,8 +822,10 @@ ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
||||
inet_autobind(sk))
|
||||
return -EAGAIN;
|
||||
|
||||
if (sk->sk_prot->sendpage)
|
||||
return sk->sk_prot->sendpage(sk, page, offset, size, flags);
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
if (prot->sendpage)
|
||||
return prot->sendpage(sk, page, offset, size, flags);
|
||||
return sock_no_sendpage(sock, page, offset, size, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_sendpage);
|
||||
@@ -821,14 +834,17 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||
int flags)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
const struct proto *prot;
|
||||
int addr_len = 0;
|
||||
int err;
|
||||
|
||||
if (likely(!(flags & MSG_ERRQUEUE)))
|
||||
sock_rps_record_flow(sk);
|
||||
|
||||
err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
|
||||
flags & ~MSG_DONTWAIT, &addr_len);
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
err = prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
|
||||
flags & ~MSG_DONTWAIT, &addr_len);
|
||||
if (err >= 0)
|
||||
msg->msg_namelen = addr_len;
|
||||
return err;
|
||||
|
||||
@@ -2029,12 +2029,16 @@ static int cipso_v4_delopt(struct ip_options_rcu __rcu **opt_ptr)
|
||||
* from there we can determine the new total option length */
|
||||
iter = 0;
|
||||
optlen_new = 0;
|
||||
while (iter < opt->opt.optlen)
|
||||
if (opt->opt.__data[iter] != IPOPT_NOP) {
|
||||
while (iter < opt->opt.optlen) {
|
||||
if (opt->opt.__data[iter] == IPOPT_END) {
|
||||
break;
|
||||
} else if (opt->opt.__data[iter] == IPOPT_NOP) {
|
||||
iter++;
|
||||
} else {
|
||||
iter += opt->opt.__data[iter + 1];
|
||||
optlen_new = iter;
|
||||
} else
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
hdr_delta = opt->opt.optlen;
|
||||
opt->opt.optlen = (optlen_new + 3) & ~3;
|
||||
hdr_delta -= opt->opt.optlen;
|
||||
|
||||
@@ -2240,6 +2240,10 @@ void tcp_set_state(struct sock *sk, int state)
|
||||
if (oldstate != TCP_ESTABLISHED)
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_CURRESTAB);
|
||||
break;
|
||||
case TCP_CLOSE_WAIT:
|
||||
if (oldstate == TCP_SYN_RECV)
|
||||
TCP_INC_STATS(sock_net(sk), TCP_MIB_CURRESTAB);
|
||||
break;
|
||||
|
||||
case TCP_CLOSE:
|
||||
if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED)
|
||||
@@ -2251,7 +2255,7 @@ void tcp_set_state(struct sock *sk, int state)
|
||||
inet_put_port(sk);
|
||||
/* fall through */
|
||||
default:
|
||||
if (oldstate == TCP_ESTABLISHED)
|
||||
if (oldstate == TCP_ESTABLISHED || oldstate == TCP_CLOSE_WAIT)
|
||||
TCP_DEC_STATS(sock_net(sk), TCP_MIB_CURRESTAB);
|
||||
}
|
||||
|
||||
@@ -3113,8 +3117,9 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
if (level != SOL_TCP)
|
||||
return icsk->icsk_af_ops->setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
/* Paired with WRITE_ONCE() in do_ipv6_setsockopt() and tcp_v6_connect() */
|
||||
return READ_ONCE(icsk->icsk_af_ops)->setsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return do_tcp_setsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_setsockopt);
|
||||
@@ -3636,8 +3641,9 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
|
||||
if (level != SOL_TCP)
|
||||
return icsk->icsk_af_ops->getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
/* Paired with WRITE_ONCE() in do_ipv6_setsockopt() and tcp_v6_connect() */
|
||||
return READ_ONCE(icsk->icsk_af_ops)->getsockopt(sk, level, optname,
|
||||
optval, optlen);
|
||||
return do_tcp_getsockopt(sk, level, optname, optval, optlen);
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_getsockopt);
|
||||
|
||||
@@ -443,11 +443,14 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
|
||||
int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
const struct proto *prot;
|
||||
int err = 0;
|
||||
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
/* If the socket has its own bind function then use it. */
|
||||
if (sk->sk_prot->bind)
|
||||
return sk->sk_prot->bind(sk, uaddr, addr_len);
|
||||
if (prot->bind)
|
||||
return prot->bind(sk, uaddr, addr_len);
|
||||
|
||||
if (addr_len < SIN6_LEN_RFC2133)
|
||||
return -EINVAL;
|
||||
@@ -558,6 +561,7 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
const struct proto *prot;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCGSTAMP:
|
||||
@@ -578,9 +582,11 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
case SIOCSIFDSTADDR:
|
||||
return addrconf_set_dstaddr(net, (void __user *) arg);
|
||||
default:
|
||||
if (!sk->sk_prot->ioctl)
|
||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||
prot = READ_ONCE(sk->sk_prot);
|
||||
if (!prot->ioctl)
|
||||
return -ENOIOCTLCMD;
|
||||
return sk->sk_prot->ioctl(sk, cmd, arg);
|
||||
return prot->ioctl(sk, cmd, arg);
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
return 0;
|
||||
|
||||
@@ -224,8 +224,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
sock_prot_inuse_add(net, &tcp_prot, 1);
|
||||
local_bh_enable();
|
||||
sk->sk_prot = &tcp_prot;
|
||||
icsk->icsk_af_ops = &ipv4_specific;
|
||||
/* Paired with READ_ONCE(sk->sk_prot) in inet6_stream_ops */
|
||||
WRITE_ONCE(sk->sk_prot, &tcp_prot);
|
||||
/* Paired with READ_ONCE() in tcp_(get|set)sockopt() */
|
||||
WRITE_ONCE(icsk->icsk_af_ops, &ipv4_specific);
|
||||
sk->sk_socket->ops = &inet_stream_ops;
|
||||
sk->sk_family = PF_INET;
|
||||
tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||
@@ -238,7 +240,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
||||
sock_prot_inuse_add(net, prot, 1);
|
||||
local_bh_enable();
|
||||
sk->sk_prot = prot;
|
||||
/* Paired with READ_ONCE(sk->sk_prot) in inet6_dgram_ops */
|
||||
WRITE_ONCE(sk->sk_prot, prot);
|
||||
sk->sk_socket->ops = &inet_dgram_ops;
|
||||
sk->sk_family = PF_INET;
|
||||
}
|
||||
|
||||
@@ -546,6 +546,8 @@ static void rt6_probe(struct fib6_info *rt)
|
||||
rcu_read_lock_bh();
|
||||
last_probe = READ_ONCE(rt->last_probe);
|
||||
idev = __in6_dev_get(dev);
|
||||
if (!idev)
|
||||
goto out;
|
||||
neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
|
||||
if (neigh) {
|
||||
if (neigh->nud_state & NUD_VALID)
|
||||
@@ -5145,12 +5147,16 @@ int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write,
|
||||
{
|
||||
struct net *net;
|
||||
int delay;
|
||||
int ret;
|
||||
if (!write)
|
||||
return -EINVAL;
|
||||
|
||||
ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
net = (struct net *)ctl->extra1;
|
||||
delay = net->ipv6.sysctl.flush_delay;
|
||||
proc_dointvec(ctl, write, buffer, lenp, ppos);
|
||||
fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user