mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
This is the 5.4.294 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmhAPSgACgkQONu9yGCS aT7FShAA16nZLD+wQFWNG0AB1oKDjWuH3cMzxcJnYKJC2LHAiFoCV8DX0SuLBEF/ Lf79xdniv4NYWja7hGykC+0iMBlZKaRWvKOO5jmqA0+Tgy39NCgoDyD5r2azsSnn vKqfDsmhijaZ3Vkr1Kw3Co0i9aVHFS2G532eaIdXjr+XrVGyXGoS/a4pPuZz2S5M FGBzQfgsFnMVhnYG1CCz3PSE4iVKaC0jWOrJOxIsyjrZJ038362fKl75AQQho0ga fNEleCDJiItnBGyOsgEYTuYgpiJ9Q2mfmScJaK4epphCwZ3IwRNp9ZGEjOWQlr+6 fmaDXqARB77cZ1HrrW89UyhiM/7D+yLZpmWGeSAKcpf0ytIUXzmkKwywFMd0znw7 HGYpjOgSpQKG7Nbf7+cYYi5h2RenO1ecbmDxz+o8oR5bJ/w4B20Qbwy1VGizlSxb HU492UirF783ZYFUuNTAhmzvVF5KPp4fRQVrn2MpOLusQe5tSDmA1LQLnkIRKh+N 9/w5CNugUvPUHwqJhJxEniTST+1mSJ3f3BDRWq16A4WVWN21IFtmFJOh3beC+cwB /maaA9ybh4D98XpPIo13tgjBYfDH5mAXWx80M7aoais+E0o08j4oMIyVhV/N/nJv dtjznweRdLFDyoST/PFku9JOKH+1WxzaM2vqX0D1NpB3BUfapww= =dZXI -----END PGP SIGNATURE----- Merge 5.4.294 into android11-5.4-lts Changes in 5.4.294 EDAC/altera: Test the correct error reg offset EDAC/altera: Set DDR and SDMMC interrupt mask before registration i2c: imx-lpi2c: Fix clock count when probe defers parisc: Fix double SIGFPE crash amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offload wifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage() dm-integrity: fix a warning on invalid table line dm: always update the array size in realloc_argv on success tracing: Fix oob write in trace_seq_to_buffer() net/mlx5: E-Switch, Initialize MAC Address for Default GID net_sched: drr: Fix double list add in class with netem as child qdisc net_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdisc net_sched: qfq: Fix double list add in class with netem as child qdisc net: dlink: Correct endianness handling of led_mode nvme-tcp: fix premature queue removal and I/O failover lan743x: remove redundant initialization of variable current_head_index lan743x: fix endianness when accessing descriptors net: lan743x: Fix memleak issue when GSO enabled net: fec: ERR007885 Workaround for conventional TX PCI: imx6: Skip controller_id generation logic for i.MX7D of: module: add buffer overflow check in of_modalias() sch_htb: make htb_qlen_notify() idempotent irqchip/gic-v2m: Add const to of_device_id irqchip/gic-v2m: Mark a few functions __init irqchip/gic-v2m: Prevent use after free of gicv2m_get_fwnode() usb: chipidea: imx: change hsic power regulator as optional usb: chipidea: imx: refine the error handling for hsic usb: chipidea: ci_hdrc_imx: use dev_err_probe() usb: chipidea: ci_hdrc_imx: implement usb_phy_init() error handling arm64: dts: rockchip: fix iface clock-name on px30 iommus iommu/amd: Fix potential buffer overflow in parse_ivrs_acpihid dm: fix copying after src array boundaries scsi: target: Fix WRITE_SAME No Data Buffer crash sch_htb: make htb_deactivate() idempotent netfilter: ipset: fix region locking in hash types net: dsa: b53: fix learning on VLAN unaware bridges Input: synaptics - enable InterTouch on Dynabook Portege X30-D Input: synaptics - enable InterTouch on Dynabook Portege X30L-G Input: synaptics - enable InterTouch on Dell Precision M3800 staging: iio: adc: ad7816: Correct conditional logic for store mode iio: adc: ad7606: fix serial register access iio: adis16201: Correct inclinometer channel resolution iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_fifo iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_tagged_fifo usb: uhci-platform: Make the clock really optional xenbus: Use kref to track req lifetime module: ensure that kobject_put() is safe for module type kobjects ocfs2: switch osb->disable_recovery to enum ocfs2: implement handshaking with ocfs2 recovery thread ocfs2: stop quota recovery before disabling quotas usb: typec: tcpm: delay SNK_TRY_WAIT_DEBOUNCE to SRC_TRYWAIT transition usb: typec: ucsi: displayport: Fix NULL pointer access USB: usbtmc: use interruptible sleep in usbtmc_read usb: usbtmc: Fix erroneous get_stb ioctl error returns usb: usbtmc: Fix erroneous wait_srq ioctl return usb: usbtmc: Fix erroneous generic_read ioctl return types: Complement the aligned types with signed 64-bit one iio: adc: dln2: Use aligned_s64 for timestamp MIPS: Fix MAX_REG_OFFSET nvme: unblock ctrl state transition for firmware update do_umount(): add missing barrier before refcount checks in sync case platform/x86: asus-wmi: Fix wlan_ctrl_by_user detection staging: axis-fifo: replace spinlock with mutex staging: axis-fifo: Remove hardware resets for user errors staging: axis-fifo: avoid parsing ignored device tree properties staging: axis-fifo: Correct handling of tx_fifo_depth for size validation iio: adc: ad7768-1: Fix insufficient alignment of timestamp. iio: chemical: sps30: use aligned_s64 for timestamp RDMA/rxe: Fix slab-use-after-free Read in rxe_queue_cleanup bug nfs: handle failure of nfs_get_lock_context in unlock path spi: loopback-test: Do not split 1024-byte hexdumps net: dsa: sja1105: discard incoming frames in BR_STATE_LISTENING ALSA: sh: SND_AICA should depend on SH_DMA_API qlcnic: fix memory leak in qlcnic_sriov_channel_cfg_cmd() NFSv4/pnfs: pnfs_set_layout_stateid() should update the layout cred NFSv4/pnfs: Reset the layout state after a layoutreturn dmaengine: Revert "dmaengine: dmatest: Fix dmatest waiting less when interrupted" ACPI: PPTT: Fix processor subtable walk ALSA: es1968: Add error handling for snd_pcm_hw_constraint_pow2() phy: Fix error handling in tegra_xusb_port_init phy: renesas: rcar-gen3-usb2: Set timing registers only once clocksource/i8253: Use raw_spinlock_irqsave() in clockevent_i8253_disable() Input: synaptics - enable SMBus for HP Elitebook 850 G1 Input: synaptics - enable InterTouch on TUXEDO InfinityBook Pro 14 v5 openvswitch: Fix unsafe attribute parsing in output_userspace() scsi: target: iscsi: Fix timeout on deleted connection dma-mapping: avoid potential unused data compilation warning cgroup: Fix compilation issue due to cgroup_mutex not being exported kconfig: merge_config: use an empty file as initfile mailbox: use error ret code of of_parse_phandle_with_args() fbdev: fsl-diu-fb: add missing device_remove_file() fbdev: core: tileblit: Implement missing margin clearing for tileblit NFSv4: Treat ENETUNREACH errors as fatal for state recovery SUNRPC: rpc_clnt_set_transport() must not change the autobind setting dql: Fix dql->limit value when reset. tools/build: Don't pass test log files to linker pNFS/flexfiles: Report ENETDOWN as a connection error libnvdimm/labels: Fix divide error in nd_label_data_init() mmc: host: Wait for Vdd to settle on card power off i2c: pxa: fix call balance of i2c->clk handling routines btrfs: avoid linker error in btrfs_find_create_tree_block() btrfs: send: return -ENAMETOOLONG when attempting a path that is too long um: Store full CSGSFS and SS register from mcontext um: Update min_low_pfn to match changes in uml_reserved ext4: reorder capability check last scsi: st: Tighten the page format heuristics with MODE SELECT scsi: st: ERASE does not change tape location kbuild: fix argument parsing in scripts/config dm: restrict dm device size to 2^63-512 bytes xen: Add support for XenServer 6.1 platform device posix-timers: Add cond_resched() to posix_timer_add() search loop netfilter: conntrack: Bound nf_conntrack sysctl writes mmc: sdhci: Disable SD card clock before changing parameters powerpc/prom_init: Fixup missing #size-cells on PowerBook6,7 rtc: ds1307: stop disabling alarms on probe ieee802154: ca8210: Use proper setters and getters for bitwise types ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114 media: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe() dm cache: prevent BUG_ON by blocking retries on failed device resumes orangefs: Do not truncate file size media: cx231xx: set device_caps for 417 pinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned" net: pktgen: fix mpls maximum labels list parsing x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2 hwmon: (gpio-fan) Add missing mutex locks drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence fpga: altera-cvp: Increase credit timeout net/mlx5: Avoid report two health errors on same syndrome drm/amdkfd: KFD release_work possible circular locking net: xgene-v2: remove incorrect ACPI_PTR annotation bonding: report duplicate MAC address in all situations x86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus() cpuidle: menu: Avoid discarding useful information MIPS: Use arch specific syscall name match function MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core scsi: mpt3sas: Send a diag reset if target reset fails wifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU net: pktgen: fix access outside of user given buffer in pktgen_thread_write() EDAC/ie31200: work around false positive build warning PCI: Fix old_size lower bound in calculate_iosize() too ACPI: HED: Always initialize before evged net/mlx5: Modify LSB bitmask in temperature event to include only the first bit net/mlx5: Apply rate-limiting to high temperature warning ASoC: ops: Enforce platform maximum on initial value pinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map smack: recognize ipv4 CIPSO w/o categories net/mlx4_core: Avoid impossible mlx4_db_alloc() order value phy: core: don't require set_mode() callback for phy_get_mode() to work net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB net/mlx5e: set the tx_queue_len for pfifo_fast net/mlx5e: reduce rep rxq depth to 256 for ECPF ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). hwmon: (xgene-hwmon) use appropriate type for the latency value vxlan: Annotate FDB data races rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y rcu: fix header guard for rcu_all_qs() scsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine scsi: st: Restore some drive settings after reset HID: usbkbd: Fix the bit shift number for LED_KANA bpftool: Fix readlink usage in get_fd_type wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate regulator: ad5398: Add device tree support drm/atomic: clarify the rules around drm_atomic_state->allow_modeset drm: Add valid clones check pinctrl: meson: define the pull up/down resistor value as 60 kOhm ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013 nvmet-tcp: don't restore null sk_state_change btrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref xenbus: Allow PVH dom0 a non-local xenstore __legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock xfrm: Sanitize marks before insert bridge: netfilter: Fix forwarding of fragmented packets net: dwmac-sun8i: Use parsed internal PHY address instead of 1 sch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue() crypto: algif_hash - fix double free in hash_accept can: bcm: add locking for bcm_op runtime updates can: bcm: add missing rcu read protection for procfs content ALSA: pcm: Fix race of buffer access at PCM OSS layer llc: fix data loss when reading from a socket in llc_ui_recvmsg() drm/edid: fixed the bug that hdr metadata was not reset memcg: always call cond_resched() after fn() mm/page_alloc.c: avoid infinite retries caused by cpuset race spi: spi-fsl-dspi: restrict register range for regmap access kbuild: Disable -Wdefault-const-init-unsafe netfilter: nf_tables: pass nft_chain to destroy function, not nft_ctx netfilter: nf_tables: wait for rcu grace period on net_device removal netfilter: nf_tables: do not defer rule destruction via call_rcu drm/i915/gvt: fix unterminated-string-initialization warning smb: client: Fix use-after-free in cifs_fill_dirent smb: client: Reset all search buffer pointers when releasing buffer net_sched: hfsc: Address reentrant enqueue adding class to eltree twice coredump: fix error handling for replace_fd() pidfd: check pid has attached task in fdinfo pid: add pidfd_prepare() fork: use pidfd_prepare() coredump: hand a pidfd to the usermode coredump helper HID: quirks: Add ADATA XPG alpha wireless mouse support nfs: don't share pNFS DS connections between net namespaces platform/x86: thinkpad_acpi: Support also NEC Lavie X1475JAS um: let 'make clean' properly clean underlying SUBARCH as well spi: spi-sun4i: fix early activation platform/x86: fujitsu-laptop: Support Lifebook S2110 hotkeys platform/x86: thinkpad_acpi: Ignore battery threshold change event notification xen/swiotlb: relax alignment requirements Linux 5.4.294 Change-Id: Iaf692049f875da760e327bc752534cc38c2795eb Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
cd881391f1
198 changed files with 1680 additions and 838 deletions
|
|
@ -4606,6 +4606,8 @@
|
|||
|
||||
Selecting 'on' will also enable the mitigation
|
||||
against user space to user space task attacks.
|
||||
Selecting specific mitigation does not force enable
|
||||
user mitigations.
|
||||
|
||||
Selecting 'off' will disable both the kernel and
|
||||
the user space protections.
|
||||
|
|
|
|||
14
Makefile
14
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 293
|
||||
SUBLEVEL = 294
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
@ -784,6 +784,18 @@ KBUILD_CFLAGS += -Wno-tautological-compare
|
|||
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += -mno-global-merge
|
||||
|
||||
# Clang may emit a warning when a const variable, such as the dummy variables
|
||||
# in typecheck(), or const member of an aggregate type are not initialized,
|
||||
# which can result in unexpected behavior. However, in many audited cases of
|
||||
# the "field" variant of the warning, this is intentional because the field is
|
||||
# never used within a particular call path, the field is within a union with
|
||||
# other non-const members, or the containing object is not const so the field
|
||||
# can be modified via memcpy() / memset(). While the variable warning also gets
|
||||
# disabled with this same switch, there should not be too much coverage lost
|
||||
# because -Wuninitialized will still flag when an uninitialized const variable
|
||||
# is used.
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, default-const-init-unsafe)
|
||||
else
|
||||
|
||||
# Warn about unmarked fall-throughs in switch statement.
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@
|
|||
reg = <0x54400000 0x00040000>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_DSIB>,
|
||||
<&tegra_car TEGRA114_CLK_DSIBLP>,
|
||||
<&tegra_car TEGRA114_CLK_PLL_D2_OUT0>;
|
||||
<&tegra_car TEGRA114_CLK_PLL_D_OUT0>;
|
||||
clock-names = "dsi", "lp", "parent";
|
||||
resets = <&tegra_car 82>;
|
||||
reset-names = "dsi";
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@
|
|||
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "vopb_mmu";
|
||||
clocks = <&cru ACLK_VOPB>, <&cru HCLK_VOPB>;
|
||||
clock-names = "aclk", "hclk";
|
||||
clock-names = "aclk", "iface";
|
||||
power-domains = <&power PX30_PD_VO>;
|
||||
#iommu-cells = <0>;
|
||||
status = "disabled";
|
||||
|
|
@ -871,7 +871,7 @@
|
|||
interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "vopl_mmu";
|
||||
clocks = <&cru ACLK_VOPL>, <&cru HCLK_VOPL>;
|
||||
clock-names = "aclk", "hclk";
|
||||
clock-names = "aclk", "iface";
|
||||
power-domains = <&power PX30_PD_VO>;
|
||||
#iommu-cells = <0>;
|
||||
status = "disabled";
|
||||
|
|
|
|||
|
|
@ -87,4 +87,20 @@ struct dyn_arch_ftrace {
|
|||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
|
||||
#ifdef CONFIG_FTRACE_SYSCALLS
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* Some syscall entry functions on mips start with "__sys_" (fork and clone,
|
||||
* for instance). We should also match the sys_ variant with those.
|
||||
*/
|
||||
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||
const char *name)
|
||||
{
|
||||
return !strcmp(sym, name) ||
|
||||
(!strncmp(sym, "__sys_", 6) && !strcmp(sym + 6, name + 4));
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FTRACE_SYSCALLS */
|
||||
#endif /* _ASM_MIPS_FTRACE_H */
|
||||
|
|
|
|||
|
|
@ -65,7 +65,8 @@ static inline void instruction_pointer_set(struct pt_regs *regs,
|
|||
|
||||
/* Query offset/name of register from its name/offset */
|
||||
extern int regs_query_register_offset(const char *name);
|
||||
#define MAX_REG_OFFSET (offsetof(struct pt_regs, __last))
|
||||
#define MAX_REG_OFFSET \
|
||||
(offsetof(struct pt_regs, __last) - sizeof(unsigned long))
|
||||
|
||||
/**
|
||||
* regs_get_register() - get register value from its offset
|
||||
|
|
|
|||
|
|
@ -56,10 +56,7 @@ static DEFINE_PER_CPU_ALIGNED(u32*, ready_count);
|
|||
/* Indicates online CPUs coupled with the current CPU */
|
||||
static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled);
|
||||
|
||||
/*
|
||||
* Used to synchronize entry to deep idle states. Actually per-core rather
|
||||
* than per-CPU.
|
||||
*/
|
||||
/* Used to synchronize entry to deep idle states */
|
||||
static DEFINE_PER_CPU_ALIGNED(atomic_t, pm_barrier);
|
||||
|
||||
/* Saved CPU state across the CPS_PM_POWER_GATED state */
|
||||
|
|
@ -118,9 +115,10 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
|||
cps_nc_entry_fn entry;
|
||||
struct core_boot_config *core_cfg;
|
||||
struct vpe_boot_config *vpe_cfg;
|
||||
atomic_t *barrier;
|
||||
|
||||
/* Check that there is an entry function for this state */
|
||||
entry = per_cpu(nc_asm_enter, core)[state];
|
||||
entry = per_cpu(nc_asm_enter, cpu)[state];
|
||||
if (!entry)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -156,7 +154,7 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
|||
smp_mb__after_atomic();
|
||||
|
||||
/* Create a non-coherent mapping of the core ready_count */
|
||||
core_ready_count = per_cpu(ready_count, core);
|
||||
core_ready_count = per_cpu(ready_count, cpu);
|
||||
nc_addr = kmap_noncoherent(virt_to_page(core_ready_count),
|
||||
(unsigned long)core_ready_count);
|
||||
nc_addr += ((unsigned long)core_ready_count & ~PAGE_MASK);
|
||||
|
|
@ -164,7 +162,8 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
|||
|
||||
/* Ensure ready_count is zero-initialised before the assembly runs */
|
||||
WRITE_ONCE(*nc_core_ready_count, 0);
|
||||
coupled_barrier(&per_cpu(pm_barrier, core), online);
|
||||
barrier = &per_cpu(pm_barrier, cpumask_first(&cpu_sibling_map[cpu]));
|
||||
coupled_barrier(barrier, online);
|
||||
|
||||
/* Run the generated entry code */
|
||||
left = entry(online, nc_core_ready_count);
|
||||
|
|
@ -635,12 +634,14 @@ out_err:
|
|||
|
||||
static int cps_pm_online_cpu(unsigned int cpu)
|
||||
{
|
||||
enum cps_pm_state state;
|
||||
unsigned core = cpu_core(&cpu_data[cpu]);
|
||||
unsigned int sibling, core;
|
||||
void *entry_fn, *core_rc;
|
||||
enum cps_pm_state state;
|
||||
|
||||
core = cpu_core(&cpu_data[cpu]);
|
||||
|
||||
for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) {
|
||||
if (per_cpu(nc_asm_enter, core)[state])
|
||||
if (per_cpu(nc_asm_enter, cpu)[state])
|
||||
continue;
|
||||
if (!test_bit(state, state_support))
|
||||
continue;
|
||||
|
|
@ -652,16 +653,19 @@ static int cps_pm_online_cpu(unsigned int cpu)
|
|||
clear_bit(state, state_support);
|
||||
}
|
||||
|
||||
per_cpu(nc_asm_enter, core)[state] = entry_fn;
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(nc_asm_enter, sibling)[state] = entry_fn;
|
||||
}
|
||||
|
||||
if (!per_cpu(ready_count, core)) {
|
||||
if (!per_cpu(ready_count, cpu)) {
|
||||
core_rc = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!core_rc) {
|
||||
pr_err("Failed allocate core %u ready_count\n", core);
|
||||
return -ENOMEM;
|
||||
}
|
||||
per_cpu(ready_count, core) = core_rc;
|
||||
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(ready_count, sibling) = core_rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -103,9 +103,19 @@ handle_fpe(struct pt_regs *regs)
|
|||
|
||||
memcpy(regs->fr, frcopy, sizeof regs->fr);
|
||||
if (signalcode != 0) {
|
||||
force_sig_fault(signalcode >> 24, signalcode & 0xffffff,
|
||||
(void __user *) regs->iaoq[0]);
|
||||
return -1;
|
||||
int sig = signalcode >> 24;
|
||||
|
||||
if (sig == SIGFPE) {
|
||||
/*
|
||||
* Clear floating point trap bit to avoid trapping
|
||||
* again on the first floating-point instruction in
|
||||
* the userspace signal handler.
|
||||
*/
|
||||
regs->fr[0] &= ~(1ULL << 38);
|
||||
}
|
||||
force_sig_fault(sig, signalcode & 0xffffff,
|
||||
(void __user *) regs->iaoq[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return signalcode ? -1 : 0;
|
||||
|
|
|
|||
|
|
@ -2906,11 +2906,11 @@ static void __init fixup_device_tree_pmac(void)
|
|||
char type[8];
|
||||
phandle node;
|
||||
|
||||
// Some pmacs are missing #size-cells on escc nodes
|
||||
// Some pmacs are missing #size-cells on escc or i2s nodes
|
||||
for (node = 0; prom_next_node(&node); ) {
|
||||
type[0] = '\0';
|
||||
prom_getprop(node, "device_type", type, sizeof(type));
|
||||
if (prom_strcmp(type, "escc"))
|
||||
if (prom_strcmp(type, "escc") && prom_strcmp(type, "i2s"))
|
||||
continue;
|
||||
|
||||
if (prom_getproplen(node, "#size-cells") != PROM_ERROR)
|
||||
|
|
|
|||
|
|
@ -154,5 +154,6 @@ MRPROPER_DIRS += arch/$(SUBARCH)/include/generated
|
|||
archclean:
|
||||
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
||||
-o -name '*.gcov' \) -type f -print | xargs rm -f
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile ARCH=$(HEADER_ARCH) clean
|
||||
|
||||
export HEADER_ARCH SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS DEV_NULL_PATH
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ void __init mem_init(void)
|
|||
map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0);
|
||||
memblock_free(__pa(brk_end), uml_reserved - brk_end);
|
||||
uml_reserved = brk_end;
|
||||
min_low_pfn = PFN_UP(__pa(uml_reserved));
|
||||
|
||||
/* this will put all low memory onto the freelists */
|
||||
memblock_free_all();
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ int __register_nmi_handler(unsigned int, struct nmiaction *);
|
|||
|
||||
void unregister_nmi_handler(unsigned int, const char *);
|
||||
|
||||
void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler);
|
||||
|
||||
void stop_nmi(void);
|
||||
void restart_nmi(void);
|
||||
void local_touch_nmi(void);
|
||||
|
|
|
|||
|
|
@ -1050,9 +1050,13 @@ static __ro_after_init enum spectre_v2_mitigation_cmd spectre_v2_cmd;
|
|||
static enum spectre_v2_user_cmd __init
|
||||
spectre_v2_parse_user_cmdline(void)
|
||||
{
|
||||
enum spectre_v2_user_cmd mode;
|
||||
char arg[20];
|
||||
int ret, i;
|
||||
|
||||
mode = IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ?
|
||||
SPECTRE_V2_USER_CMD_AUTO : SPECTRE_V2_USER_CMD_NONE;
|
||||
|
||||
switch (spectre_v2_cmd) {
|
||||
case SPECTRE_V2_CMD_NONE:
|
||||
return SPECTRE_V2_USER_CMD_NONE;
|
||||
|
|
@ -1065,7 +1069,7 @@ spectre_v2_parse_user_cmdline(void)
|
|||
ret = cmdline_find_option(boot_command_line, "spectre_v2_user",
|
||||
arg, sizeof(arg));
|
||||
if (ret < 0)
|
||||
return SPECTRE_V2_USER_CMD_AUTO;
|
||||
return mode;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(v2_user_options); i++) {
|
||||
if (match_option(arg, ret, v2_user_options[i].option)) {
|
||||
|
|
@ -1075,8 +1079,8 @@ spectre_v2_parse_user_cmdline(void)
|
|||
}
|
||||
}
|
||||
|
||||
pr_err("Unknown user space protection option (%s). Switching to AUTO select\n", arg);
|
||||
return SPECTRE_V2_USER_CMD_AUTO;
|
||||
pr_err("Unknown user space protection option (%s). Switching to default\n", arg);
|
||||
return mode;
|
||||
}
|
||||
|
||||
static inline bool spectre_v2_in_eibrs_mode(enum spectre_v2_mitigation mode)
|
||||
|
|
|
|||
|
|
@ -41,8 +41,12 @@
|
|||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/nmi.h>
|
||||
|
||||
/*
|
||||
* An emergency handler can be set in any context including NMI
|
||||
*/
|
||||
struct nmi_desc {
|
||||
raw_spinlock_t lock;
|
||||
nmi_handler_t emerg_handler;
|
||||
struct list_head head;
|
||||
};
|
||||
|
||||
|
|
@ -124,9 +128,22 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration)
|
|||
static int nmi_handle(unsigned int type, struct pt_regs *regs)
|
||||
{
|
||||
struct nmi_desc *desc = nmi_to_desc(type);
|
||||
nmi_handler_t ehandler;
|
||||
struct nmiaction *a;
|
||||
int handled=0;
|
||||
|
||||
/*
|
||||
* Call the emergency handler, if set
|
||||
*
|
||||
* In the case of crash_nmi_callback() emergency handler, it will
|
||||
* return in the case of the crashing CPU to enable it to complete
|
||||
* other necessary crashing actions ASAP. Other handlers in the
|
||||
* linked list won't need to be run.
|
||||
*/
|
||||
ehandler = desc->emerg_handler;
|
||||
if (ehandler)
|
||||
return ehandler(type, regs);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
/*
|
||||
|
|
@ -212,6 +229,31 @@ void unregister_nmi_handler(unsigned int type, const char *name)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_nmi_handler);
|
||||
|
||||
/**
|
||||
* set_emergency_nmi_handler - Set emergency handler
|
||||
* @type: NMI type
|
||||
* @handler: the emergency handler to be stored
|
||||
*
|
||||
* Set an emergency NMI handler which, if set, will preempt all the other
|
||||
* handlers in the linked list. If a NULL handler is passed in, it will clear
|
||||
* it. It is expected that concurrent calls to this function will not happen
|
||||
* or the system is screwed beyond repair.
|
||||
*/
|
||||
void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler)
|
||||
{
|
||||
struct nmi_desc *desc = nmi_to_desc(type);
|
||||
|
||||
if (WARN_ON_ONCE(desc->emerg_handler == handler))
|
||||
return;
|
||||
desc->emerg_handler = handler;
|
||||
|
||||
/*
|
||||
* Ensure the emergency handler is visible to other CPUs before
|
||||
* function return
|
||||
*/
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
static void
|
||||
pci_serr_error(unsigned char reason, struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -875,15 +875,11 @@ void nmi_shootdown_cpus(nmi_shootdown_cb callback)
|
|||
shootdown_callback = callback;
|
||||
|
||||
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
|
||||
/* Would it be better to replace the trap vector here? */
|
||||
if (register_nmi_handler(NMI_LOCAL, crash_nmi_callback,
|
||||
NMI_FLAG_FIRST, "crash"))
|
||||
return; /* Return what? */
|
||||
|
||||
/*
|
||||
* Ensure the new callback function is set before sending
|
||||
* out the NMI
|
||||
* Set emergency handler to preempt other handlers.
|
||||
*/
|
||||
wmb();
|
||||
set_emergency_nmi_handler(NMI_LOCAL, crash_nmi_callback);
|
||||
|
||||
apic_send_IPI_allbutself(NMI_VECTOR);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ void get_regs_from_mc(struct uml_pt_regs *regs, mcontext_t *mc)
|
|||
COPY(RIP);
|
||||
COPY2(EFLAGS, EFL);
|
||||
COPY2(CS, CSGSFS);
|
||||
regs->gp[CS / sizeof(unsigned long)] &= 0xffff;
|
||||
regs->gp[CS / sizeof(unsigned long)] |= 3;
|
||||
regs->gp[SS / sizeof(unsigned long)] = mc->gregs[REG_CSGSFS] >> 48;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -262,10 +262,6 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
|
|||
return err;
|
||||
|
||||
err = crypto_ahash_import(&ctx2->req, state);
|
||||
if (err) {
|
||||
sock_orphan(sk2);
|
||||
sock_put(sk2);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -431,7 +431,7 @@ config ACPI_SBS
|
|||
the modules will be called sbs and sbshc.
|
||||
|
||||
config ACPI_HED
|
||||
tristate "Hardware Error Device"
|
||||
bool "Hardware Error Device"
|
||||
help
|
||||
This driver supports the Hardware Error Device (PNP0C33),
|
||||
which is used to report some hardware errors notified via
|
||||
|
|
|
|||
|
|
@ -72,7 +72,12 @@ static struct acpi_driver acpi_hed_driver = {
|
|||
.notify = acpi_hed_notify,
|
||||
},
|
||||
};
|
||||
module_acpi_driver(acpi_hed_driver);
|
||||
|
||||
static int __init acpi_hed_driver_init(void)
|
||||
{
|
||||
return acpi_bus_register_driver(&acpi_hed_driver);
|
||||
}
|
||||
subsys_initcall(acpi_hed_driver_init);
|
||||
|
||||
ACPI_MODULE_NAME("hed");
|
||||
MODULE_AUTHOR("Huang Ying");
|
||||
|
|
|
|||
|
|
@ -218,16 +218,18 @@ static int acpi_pptt_leaf_node(struct acpi_table_header *table_hdr,
|
|||
sizeof(struct acpi_table_pptt));
|
||||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
/* ignore subtable types that are smaller than a processor node */
|
||||
while ((unsigned long)entry + proc_sz <= table_end) {
|
||||
cpu_node = (struct acpi_pptt_processor *)entry;
|
||||
|
||||
if (entry->type == ACPI_PPTT_TYPE_PROCESSOR &&
|
||||
cpu_node->parent == node_entry)
|
||||
return 0;
|
||||
if (entry->length == 0)
|
||||
return 0;
|
||||
|
||||
entry = ACPI_ADD_PTR(struct acpi_subtable_header, entry,
|
||||
entry->length);
|
||||
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -260,15 +262,18 @@ static struct acpi_pptt_processor *acpi_find_processor_node(struct acpi_table_he
|
|||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
/* find the processor structure associated with this cpuid */
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
while ((unsigned long)entry + proc_sz <= table_end) {
|
||||
cpu_node = (struct acpi_pptt_processor *)entry;
|
||||
|
||||
if (entry->length == 0) {
|
||||
pr_warn("Invalid zero length subtable\n");
|
||||
break;
|
||||
}
|
||||
/* entry->length may not equal proc_sz, revalidate the processor structure length */
|
||||
if (entry->type == ACPI_PPTT_TYPE_PROCESSOR &&
|
||||
acpi_cpu_id == cpu_node->acpi_processor_id &&
|
||||
(unsigned long)entry + entry->length <= table_end &&
|
||||
entry->length == proc_sz + cpu_node->number_of_priv_resources * sizeof(u32) &&
|
||||
acpi_pptt_leaf_node(table_hdr, cpu_node)) {
|
||||
return (struct acpi_pptt_processor *)entry;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,7 +103,9 @@ int __init clocksource_i8253_init(void)
|
|||
#ifdef CONFIG_CLKEVT_I8253
|
||||
void clockevent_i8253_disable(void)
|
||||
{
|
||||
raw_spin_lock(&i8253_lock);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&i8253_lock, flags);
|
||||
|
||||
/*
|
||||
* Writing the MODE register should stop the counter, according to
|
||||
|
|
@ -133,7 +135,7 @@ void clockevent_i8253_disable(void)
|
|||
|
||||
outb_p(0x30, PIT_MODE);
|
||||
|
||||
raw_spin_unlock(&i8253_lock);
|
||||
raw_spin_unlock_irqrestore(&i8253_lock, flags);
|
||||
}
|
||||
|
||||
static int pit_shutdown(struct clock_event_device *evt)
|
||||
|
|
|
|||
|
|
@ -259,8 +259,19 @@ again:
|
|||
* This can deal with workloads that have long pauses interspersed
|
||||
* with sporadic activity with a bunch of short pauses.
|
||||
*/
|
||||
if ((divisor * 4) <= INTERVALS * 3)
|
||||
if (divisor * 4 <= INTERVALS * 3) {
|
||||
/*
|
||||
* If there are sufficiently many data points still under
|
||||
* consideration after the outliers have been eliminated,
|
||||
* returning without a prediction would be a mistake because it
|
||||
* is likely that the next interval will not exceed the current
|
||||
* maximum, so return the latter in that case.
|
||||
*/
|
||||
if (divisor >= INTERVALS / 2)
|
||||
return max;
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
thresh = max - 1;
|
||||
goto again;
|
||||
|
|
|
|||
|
|
@ -809,9 +809,9 @@ static int dmatest_func(void *data)
|
|||
} else {
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
wait_event_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
wait_event_freezable_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
|
||||
status = dma_async_is_tx_complete(chan, cookie, NULL,
|
||||
NULL);
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ static irqreturn_t altr_sdram_mc_err_handler(int irq, void *dev_id)
|
|||
if (status & priv->ecc_stat_ce_mask) {
|
||||
regmap_read(drvdata->mc_vbase, priv->ecc_saddr_offset,
|
||||
&err_addr);
|
||||
if (priv->ecc_uecnt_offset)
|
||||
if (priv->ecc_cecnt_offset)
|
||||
regmap_read(drvdata->mc_vbase, priv->ecc_cecnt_offset,
|
||||
&err_count);
|
||||
edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count,
|
||||
|
|
@ -1103,9 +1103,6 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask,
|
|||
}
|
||||
}
|
||||
|
||||
/* Interrupt mode set to every SBERR */
|
||||
regmap_write(ecc_mgr_map, ALTR_A10_ECC_INTMODE_OFST,
|
||||
ALTR_A10_ECC_INTMODE);
|
||||
/* Enable ECC */
|
||||
ecc_set_bits(ecc_ctrl_en_mask, (ecc_block_base +
|
||||
ALTR_A10_ECC_CTRL_OFST));
|
||||
|
|
@ -2213,6 +2210,10 @@ static int altr_edac_a10_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(edac->ecc_mgr_map);
|
||||
}
|
||||
|
||||
/* Set irq mask for DDR SBE to avoid any pending irq before registration */
|
||||
regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_SET_OFST,
|
||||
(A10_SYSMGR_ECC_INTMASK_SDMMCB | A10_SYSMGR_ECC_INTMASK_DDR0));
|
||||
|
||||
edac->irq_chip.name = pdev->dev.of_node->name;
|
||||
edac->irq_chip.irq_mask = a10_eccmgr_irq_mask;
|
||||
edac->irq_chip.irq_unmask = a10_eccmgr_irq_unmask;
|
||||
|
|
|
|||
|
|
@ -249,6 +249,8 @@ struct altr_sdram_mc_data {
|
|||
#define A10_SYSMGR_ECC_INTMASK_SET_OFST 0x94
|
||||
#define A10_SYSMGR_ECC_INTMASK_CLR_OFST 0x98
|
||||
#define A10_SYSMGR_ECC_INTMASK_OCRAM BIT(1)
|
||||
#define A10_SYSMGR_ECC_INTMASK_SDMMCB BIT(16)
|
||||
#define A10_SYSMGR_ECC_INTMASK_DDR0 BIT(17)
|
||||
|
||||
#define A10_SYSMGR_ECC_INTSTAT_SERR_OFST 0x9C
|
||||
#define A10_SYSMGR_ECC_INTSTAT_DERR_OFST 0xA0
|
||||
|
|
|
|||
|
|
@ -398,10 +398,9 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
|||
int i, j, ret;
|
||||
struct mem_ctl_info *mci = NULL;
|
||||
struct edac_mc_layer layers[2];
|
||||
struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL];
|
||||
void __iomem *window;
|
||||
struct ie31200_priv *priv;
|
||||
u32 addr_decode, mad_offset;
|
||||
u32 addr_decode[IE31200_CHANNELS], mad_offset;
|
||||
|
||||
/*
|
||||
* Kaby Lake, Coffee Lake seem to work like Skylake. Please re-visit
|
||||
|
|
@ -459,19 +458,10 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
|||
mad_offset = IE31200_MAD_DIMM_0_OFFSET;
|
||||
}
|
||||
|
||||
/* populate DIMM info */
|
||||
for (i = 0; i < IE31200_CHANNELS; i++) {
|
||||
addr_decode = readl(window + mad_offset +
|
||||
addr_decode[i] = readl(window + mad_offset +
|
||||
(i * 4));
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode);
|
||||
for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) {
|
||||
populate_dimm_info(&dimm_info[i][j], addr_decode, j,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info[i][j].size,
|
||||
dimm_info[i][j].dual_rank,
|
||||
dimm_info[i][j].x16_width);
|
||||
}
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -482,14 +472,22 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
|||
*/
|
||||
for (i = 0; i < IE31200_DIMMS_PER_CHANNEL; i++) {
|
||||
for (j = 0; j < IE31200_CHANNELS; j++) {
|
||||
struct dimm_data dimm_info;
|
||||
struct dimm_info *dimm;
|
||||
unsigned long nr_pages;
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info[j][i].size, skl);
|
||||
populate_dimm_info(&dimm_info, addr_decode[j], i,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info.size,
|
||||
dimm_info.dual_rank,
|
||||
dimm_info.x16_width);
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info.size, skl);
|
||||
if (nr_pages == 0)
|
||||
continue;
|
||||
|
||||
if (dimm_info[j][i].dual_rank) {
|
||||
if (dimm_info.dual_rank) {
|
||||
nr_pages = nr_pages / 2;
|
||||
dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms,
|
||||
mci->n_layers, (i * 2) + 1,
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
/* V2 Defines */
|
||||
#define VSE_CVP_TX_CREDITS 0x49 /* 8bit */
|
||||
|
||||
#define V2_CREDIT_TIMEOUT_US 20000
|
||||
#define V2_CREDIT_TIMEOUT_US 40000
|
||||
#define V2_CHECK_CREDIT_US 10
|
||||
#define V2_POLL_TIMEOUT_US 1000000
|
||||
#define V2_USER_TIMEOUT_US 500000
|
||||
|
|
|
|||
|
|
@ -277,6 +277,14 @@ struct kfd_process *kfd_create_process(struct file *filep)
|
|||
if (thread->group_leader->mm != thread->mm)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
/* If the process just called exec(3), it is possible that the
|
||||
* cleanup of the kfd_process (following the release of the mm
|
||||
* of the old process image) is still in the cleanup work queue.
|
||||
* Make sure to drain any job before trying to recreate any
|
||||
* resource for this process.
|
||||
*/
|
||||
flush_workqueue(kfd_process_wq);
|
||||
|
||||
/*
|
||||
* take kfd processes mutex before starting of process creation
|
||||
* so there won't be a case where two threads of the same process
|
||||
|
|
@ -289,14 +297,6 @@ struct kfd_process *kfd_create_process(struct file *filep)
|
|||
if (process) {
|
||||
pr_debug("Process already found\n");
|
||||
} else {
|
||||
/* If the process just called exec(3), it is possible that the
|
||||
* cleanup of the kfd_process (following the release of the mm
|
||||
* of the old process image) is still in the cleanup work queue.
|
||||
* Make sure to drain any job before trying to recreate any
|
||||
* resource for this process.
|
||||
*/
|
||||
flush_workqueue(kfd_process_wq);
|
||||
|
||||
process = create_process(thread);
|
||||
if (IS_ERR(process))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -560,6 +560,30 @@ mode_valid(struct drm_atomic_state *state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int drm_atomic_check_valid_clones(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_encoder *drm_enc;
|
||||
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
|
||||
crtc);
|
||||
|
||||
drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) {
|
||||
if (!drm_enc->possible_clones) {
|
||||
DRM_DEBUG("enc%d possible_clones is 0\n", drm_enc->base.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((crtc_state->encoder_mask & drm_enc->possible_clones) !=
|
||||
crtc_state->encoder_mask) {
|
||||
DRM_DEBUG("crtc%d failed valid clone check for mask 0x%x\n",
|
||||
crtc->base.id, crtc_state->encoder_mask);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_check_modeset - validate state object for modeset changes
|
||||
* @dev: DRM device
|
||||
|
|
@ -717,6 +741,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
|||
ret = drm_atomic_add_affected_planes(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
ret = drm_atomic_check_valid_clones(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4645,6 +4645,7 @@ drm_reset_display_info(struct drm_connector *connector)
|
|||
info->has_hdmi_infoframe = false;
|
||||
info->rgb_quant_range_selectable = false;
|
||||
memset(&info->hdmi, 0, sizeof(info->hdmi));
|
||||
memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata));
|
||||
|
||||
info->non_desktop = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,7 +223,8 @@ int intel_vgpu_init_opregion(struct intel_vgpu *vgpu)
|
|||
u8 *buf;
|
||||
struct opregion_header *header;
|
||||
struct vbt v;
|
||||
const char opregion_signature[16] = OPREGION_SIGNATURE;
|
||||
|
||||
static_assert(sizeof(header->signature) == sizeof(OPREGION_SIGNATURE) - 1);
|
||||
|
||||
gvt_dbg_core("init vgpu%d opregion\n", vgpu->id);
|
||||
vgpu_opregion(vgpu)->va = (void *)__get_free_pages(GFP_KERNEL |
|
||||
|
|
@ -237,8 +238,9 @@ int intel_vgpu_init_opregion(struct intel_vgpu *vgpu)
|
|||
/* emulated opregion with VBT mailbox only */
|
||||
buf = (u8 *)vgpu_opregion(vgpu)->va;
|
||||
header = (struct opregion_header *)buf;
|
||||
memcpy(header->signature, opregion_signature,
|
||||
sizeof(opregion_signature));
|
||||
|
||||
memcpy(header->signature, OPREGION_SIGNATURE, sizeof(header->signature));
|
||||
|
||||
header->size = 0x8;
|
||||
header->opregion_ver = 0x02000000;
|
||||
header->mboxes = MBOX_VBT;
|
||||
|
|
|
|||
|
|
@ -337,12 +337,13 @@ static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool enable)
|
|||
|
||||
static void mtk_dpi_config_2n_h_fre(struct mtk_dpi *dpi)
|
||||
{
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N);
|
||||
if (dpi->conf->reg_h_fre_con)
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N);
|
||||
}
|
||||
|
||||
static void mtk_dpi_config_disable_edge(struct mtk_dpi *dpi)
|
||||
{
|
||||
if (dpi->conf->edge_sel_en)
|
||||
if (dpi->conf->edge_sel_en && dpi->conf->reg_h_fre_con)
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, EDGE_SEL_EN);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,10 @@
|
|||
#define USB_VENDOR_ID_ACTIONSTAR 0x2101
|
||||
#define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011
|
||||
|
||||
#define USB_VENDOR_ID_ADATA_XPG 0x125f
|
||||
#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE 0x7505
|
||||
#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE 0x7506
|
||||
|
||||
#define USB_VENDOR_ID_ADS_TECH 0x06e1
|
||||
#define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD), HID_QUIRK_BADPAD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR), HID_QUIRK_BADPAD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016), HID_QUIRK_FULLSPEED_INTERVAL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX), HID_QUIRK_NO_INIT_REPORTS },
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ static int usb_kbd_event(struct input_dev *dev, unsigned int type,
|
|||
return -1;
|
||||
|
||||
spin_lock_irqsave(&kbd->leds_lock, flags);
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 4) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
(!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) |
|
||||
(!!test_bit(LED_NUML, dev->led));
|
||||
|
||||
|
|
|
|||
|
|
@ -394,7 +394,12 @@ static int gpio_fan_set_cur_state(struct thermal_cooling_device *cdev,
|
|||
if (state >= fan_data->num_speed)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&fan_data->lock);
|
||||
|
||||
set_fan_speed(fan_data, state);
|
||||
|
||||
mutex_unlock(&fan_data->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -490,7 +495,11 @@ MODULE_DEVICE_TABLE(of, of_gpio_fan_match);
|
|||
|
||||
static void gpio_fan_stop(void *data)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = data;
|
||||
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(data, 0);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
static int gpio_fan_probe(struct platform_device *pdev)
|
||||
|
|
@ -564,7 +573,9 @@ static int gpio_fan_suspend(struct device *dev)
|
|||
|
||||
if (fan_data->gpios) {
|
||||
fan_data->resume_speed = fan_data->speed_index;
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(fan_data, 0);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -574,8 +585,11 @@ static int gpio_fan_resume(struct device *dev)
|
|||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
if (fan_data->gpios)
|
||||
if (fan_data->gpios) {
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(fan_data, fan_data->resume_speed);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ struct xgene_hwmon_dev {
|
|||
|
||||
phys_addr_t comm_base_addr;
|
||||
void *pcc_comm_addr;
|
||||
u64 usecs_lat;
|
||||
unsigned int usecs_lat;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -624,9 +624,9 @@ static int lpi2c_imx_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
rpm_disable:
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1284,7 +1284,10 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
|||
i2c->adap.name);
|
||||
}
|
||||
|
||||
clk_prepare_enable(i2c->clk);
|
||||
ret = clk_prepare_enable(i2c->clk);
|
||||
if (ret)
|
||||
return dev_err_probe(&dev->dev, ret,
|
||||
"failed to enable clock\n");
|
||||
|
||||
if (i2c->use_pio) {
|
||||
i2c->adap.algo = &i2c_pxa_pio_algorithm;
|
||||
|
|
|
|||
|
|
@ -214,9 +214,9 @@ static const struct iio_chan_spec adis16201_channels[] = {
|
|||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC_REG, ADIS16201_SCAN_AUX_ADC, 0, 12),
|
||||
ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT_REG, ADIS16201_SCAN_INCLI_X,
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 12),
|
||||
ADIS_INCLI_CHAN(Y, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y,
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 12),
|
||||
IIO_CHAN_SOFT_TIMESTAMP(7)
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ static int ad7606_spi_reg_read(struct ad7606_state *st, unsigned int addr)
|
|||
{
|
||||
.tx_buf = &st->d16[0],
|
||||
.len = 2,
|
||||
.cs_change = 0,
|
||||
.cs_change = 1,
|
||||
}, {
|
||||
.rx_buf = &st->d16[1],
|
||||
.len = 2,
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ struct ad7768_state {
|
|||
union {
|
||||
struct {
|
||||
__be32 chan;
|
||||
s64 timestamp;
|
||||
aligned_s64 timestamp;
|
||||
} scan;
|
||||
__be32 d32;
|
||||
u8 d8[2];
|
||||
|
|
|
|||
|
|
@ -483,7 +483,7 @@ static irqreturn_t dln2_adc_trigger_h(int irq, void *p)
|
|||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct {
|
||||
__le16 values[DLN2_ADC_MAX_CHANNELS];
|
||||
int64_t timestamp_space;
|
||||
aligned_s64 timestamp_space;
|
||||
} data;
|
||||
struct dln2_adc_get_all_vals dev_data;
|
||||
struct dln2_adc *dln2 = iio_priv(indio_dev);
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ static irqreturn_t sps30_trigger_handler(int irq, void *p)
|
|||
int ret;
|
||||
struct {
|
||||
s32 data[4]; /* PM1, PM2P5, PM4, PM10 */
|
||||
s64 ts;
|
||||
aligned_s64 ts;
|
||||
} scan;
|
||||
|
||||
mutex_lock(&state->lock);
|
||||
|
|
|
|||
|
|
@ -360,6 +360,9 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw)
|
|||
if (fifo_status & cpu_to_le16(ST_LSM6DSX_FIFO_EMPTY_MASK))
|
||||
return 0;
|
||||
|
||||
if (!pattern_len)
|
||||
pattern_len = ST_LSM6DSX_SAMPLE_SIZE;
|
||||
|
||||
fifo_len = (le16_to_cpu(fifo_status) & fifo_diff_mask) *
|
||||
ST_LSM6DSX_CHAN_SIZE;
|
||||
fifo_len = (fifo_len / pattern_len) * pattern_len;
|
||||
|
|
@ -538,6 +541,9 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *hw)
|
|||
if (!fifo_len)
|
||||
return 0;
|
||||
|
||||
if (!pattern_len)
|
||||
pattern_len = ST_LSM6DSX_TAGGED_SAMPLE_SIZE;
|
||||
|
||||
for (read_len = 0; read_len < fifo_len; read_len += pattern_len) {
|
||||
err = st_lsm6dsx_read_block(hw,
|
||||
ST_LSM6DSX_REG_FIFO_OUT_TAG_ADDR,
|
||||
|
|
|
|||
|
|
@ -96,11 +96,8 @@ int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe,
|
|||
|
||||
err = do_mmap_info(rxe, uresp ? &uresp->mi : NULL, udata,
|
||||
cq->queue->buf, cq->queue->buf_size, &cq->queue->ip);
|
||||
if (err) {
|
||||
vfree(cq->queue->buf);
|
||||
kfree(cq->queue);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (uresp)
|
||||
cq->is_user = 1;
|
||||
|
|
|
|||
|
|
@ -163,6 +163,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
|||
|
||||
static const char * const smbus_pnp_ids[] = {
|
||||
/* all of the topbuttonpad_pnp_ids are valid, we just add some extras */
|
||||
"DLL060d", /* Dell Precision M3800 */
|
||||
"LEN0048", /* X1 Carbon 3 */
|
||||
"LEN0046", /* X250 */
|
||||
"LEN0049", /* Yoga 11e */
|
||||
|
|
@ -185,10 +186,14 @@ static const char * const smbus_pnp_ids[] = {
|
|||
"LEN2044", /* L470 */
|
||||
"LEN2054", /* E480 */
|
||||
"LEN2055", /* E580 */
|
||||
"SYN1221", /* TUXEDO InfinityBook Pro 14 v5 */
|
||||
"SYN3003", /* HP EliteBook 850 G1 */
|
||||
"SYN3052", /* HP EliteBook 840 G4 */
|
||||
"SYN3221", /* HP 15-ay000 */
|
||||
"SYN323d", /* HP Spectre X360 13-w013dx */
|
||||
"SYN3257", /* HP Envy 13-ad105ng */
|
||||
"TOS01f6", /* Dynabook Portege X30L-G */
|
||||
"TOS0213", /* Dynabook Portege X30-D */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -3124,6 +3124,14 @@ found:
|
|||
while (*uid == '0' && *(uid + 1))
|
||||
uid++;
|
||||
|
||||
if (strlen(hid) >= ACPIHID_HID_LEN) {
|
||||
pr_err("Invalid command line: hid is too long\n");
|
||||
return 1;
|
||||
} else if (strlen(uid) >= ACPIHID_UID_LEN) {
|
||||
pr_err("Invalid command line: uid is too long\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
i = early_acpihid_map_size++;
|
||||
memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
|
||||
memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@ static struct msi_domain_info gicv2m_pmsi_domain_info = {
|
|||
.chip = &gicv2m_pmsi_irq_chip,
|
||||
};
|
||||
|
||||
static void gicv2m_teardown(void)
|
||||
static void __init gicv2m_teardown(void)
|
||||
{
|
||||
struct v2m_data *v2m, *tmp;
|
||||
|
||||
|
|
@ -277,7 +277,7 @@ static void gicv2m_teardown(void)
|
|||
}
|
||||
}
|
||||
|
||||
static int gicv2m_allocate_domains(struct irq_domain *parent)
|
||||
static __init int gicv2m_allocate_domains(struct irq_domain *parent)
|
||||
{
|
||||
struct irq_domain *inner_domain, *pci_domain, *plat_domain;
|
||||
struct v2m_data *v2m;
|
||||
|
|
@ -407,7 +407,7 @@ err_free_v2m:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static struct of_device_id gicv2m_device_id[] = {
|
||||
static __initconst struct of_device_id gicv2m_device_id[] = {
|
||||
{ .compatible = "arm,gic-v2m-frame", },
|
||||
{},
|
||||
};
|
||||
|
|
@ -472,7 +472,7 @@ static struct fwnode_handle *gicv2m_get_fwnode(struct device *dev)
|
|||
return data->fwnode;
|
||||
}
|
||||
|
||||
static bool acpi_check_amazon_graviton_quirks(void)
|
||||
static __init bool acpi_check_amazon_graviton_quirks(void)
|
||||
{
|
||||
static struct acpi_table_madt *madt;
|
||||
acpi_status status;
|
||||
|
|
|
|||
|
|
@ -344,11 +344,12 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
|
|||
|
||||
mutex_lock(&con_mutex);
|
||||
|
||||
if (of_parse_phandle_with_args(dev->of_node, "mboxes",
|
||||
"#mbox-cells", index, &spec)) {
|
||||
ret = of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells",
|
||||
index, &spec);
|
||||
if (ret) {
|
||||
dev_dbg(dev, "%s: can't parse \"mboxes\" property\n", __func__);
|
||||
mutex_unlock(&con_mutex);
|
||||
return ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
chan = ERR_PTR(-EPROBE_DEFER);
|
||||
|
|
|
|||
|
|
@ -2996,6 +2996,27 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
|
|||
return to_cblock(size);
|
||||
}
|
||||
|
||||
static bool can_resume(struct cache *cache)
|
||||
{
|
||||
/*
|
||||
* Disallow retrying the resume operation for devices that failed the
|
||||
* first resume attempt, as the failure leaves the policy object partially
|
||||
* initialized. Retrying could trigger BUG_ON when loading cache mappings
|
||||
* into the incomplete policy object.
|
||||
*/
|
||||
if (cache->sized && !cache->loaded_mappings) {
|
||||
if (get_cache_mode(cache) != CM_WRITE)
|
||||
DMERR("%s: unable to resume a failed-loaded cache, please check metadata.",
|
||||
cache_device_name(cache));
|
||||
else
|
||||
DMERR("%s: unable to resume cache due to missing proper cache table reload",
|
||||
cache_device_name(cache));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool can_resize(struct cache *cache, dm_cblock_t new_size)
|
||||
{
|
||||
if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
|
||||
|
|
@ -3044,6 +3065,9 @@ static int cache_preresume(struct dm_target *ti)
|
|||
struct cache *cache = ti->private;
|
||||
dm_cblock_t csize = get_cache_dev_size(cache);
|
||||
|
||||
if (!can_resume(cache))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Check to see if the cache has resized.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -4199,7 +4199,7 @@ static void dm_integrity_dtr(struct dm_target *ti)
|
|||
BUG_ON(!RB_EMPTY_ROOT(&ic->in_progress));
|
||||
BUG_ON(!list_empty(&ic->wait_list));
|
||||
|
||||
if (ic->mode == 'B')
|
||||
if (ic->mode == 'B' && ic->bitmap_flush_work.work.func)
|
||||
cancel_delayed_work_sync(&ic->bitmap_flush_work);
|
||||
if (ic->metadata_wq)
|
||||
destroy_workqueue(ic->metadata_wq);
|
||||
|
|
|
|||
|
|
@ -575,8 +575,9 @@ static char **realloc_argv(unsigned *size, char **old_argv)
|
|||
gfp = GFP_NOIO;
|
||||
}
|
||||
argv = kmalloc_array(new_size, sizeof(*argv), gfp);
|
||||
if (argv && old_argv) {
|
||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||
if (argv) {
|
||||
if (old_argv)
|
||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||
*size = new_size;
|
||||
}
|
||||
|
||||
|
|
@ -743,6 +744,10 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
|||
DMERR("%s: zero-length target", dm_device_name(t->md));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (start + len < start || start + len > LLONG_MAX >> SECTOR_SHIFT) {
|
||||
DMERR("%s: too large device", dm_device_name(t->md));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
tgt->type = dm_get_target_type(type);
|
||||
if (!tgt->type) {
|
||||
|
|
|
|||
|
|
@ -813,13 +813,12 @@ static int c8sectpfe_probe(struct platform_device *pdev)
|
|||
}
|
||||
tsin->i2c_adapter =
|
||||
of_find_i2c_adapter_by_node(i2c_bus);
|
||||
of_node_put(i2c_bus);
|
||||
if (!tsin->i2c_adapter) {
|
||||
dev_err(&pdev->dev, "No i2c adapter found\n");
|
||||
of_node_put(i2c_bus);
|
||||
ret = -ENODEV;
|
||||
goto err_clk_disable;
|
||||
}
|
||||
of_node_put(i2c_bus);
|
||||
|
||||
tsin->rst_gpio = of_get_named_gpio(child, "reset-gpios", 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -1966,6 +1966,8 @@ static void cx231xx_video_dev_init(
|
|||
vfd->lock = &dev->lock;
|
||||
vfd->release = video_device_release_empty;
|
||||
vfd->ctrl_handler = &dev->mpeg_ctrl_handler.hdl;
|
||||
vfd->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
|
||||
V4L2_CAP_VIDEO_CAPTURE;
|
||||
video_set_drvdata(vfd, dev);
|
||||
if (dev->tuner_type == TUNER_ABSENT) {
|
||||
v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
|
||||
|
|
|
|||
|
|
@ -669,8 +669,12 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
|||
|
||||
sdhci_set_power(host, mode, vdd);
|
||||
|
||||
if (mode == MMC_POWER_OFF)
|
||||
if (mode == MMC_POWER_OFF) {
|
||||
if (slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_APL_SD ||
|
||||
slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BYT_SD)
|
||||
usleep_range(15000, 17500);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bus power might not enable after D3 -> D0 transition due to the
|
||||
|
|
|
|||
|
|
@ -1772,10 +1772,15 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|||
|
||||
host->mmc->actual_clock = 0;
|
||||
|
||||
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
|
||||
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
|
||||
if (clk & SDHCI_CLOCK_CARD_EN)
|
||||
sdhci_writew(host, clk & ~SDHCI_CLOCK_CARD_EN,
|
||||
SDHCI_CLOCK_CONTROL);
|
||||
|
||||
if (clock == 0)
|
||||
if (clock == 0) {
|
||||
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
|
||||
return;
|
||||
}
|
||||
|
||||
clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock);
|
||||
sdhci_enable_clk(host, clk);
|
||||
|
|
|
|||
|
|
@ -1954,7 +1954,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
|||
|
||||
RCU_INIT_POINTER(bond->current_arp_slave, NULL);
|
||||
|
||||
if (!all && (!bond->params.fail_over_mac ||
|
||||
if (!all && (bond->params.fail_over_mac != BOND_FOM_ACTIVE ||
|
||||
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) {
|
||||
if (ether_addr_equal_64bits(bond_dev->dev_addr, slave->perm_hwaddr) &&
|
||||
bond_has_slaves(bond))
|
||||
|
|
|
|||
|
|
@ -381,7 +381,7 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable,
|
|||
vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S;
|
||||
vc5 |= VC5_DROP_VTABLE_MISS;
|
||||
} else {
|
||||
vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S;
|
||||
vc4 |= VC4_NO_ING_VID_CHK << VC4_ING_VID_CHECK_S;
|
||||
vc5 &= ~VC5_DROP_VTABLE_MISS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1390,6 +1390,7 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
|
|||
switch (state) {
|
||||
case BR_STATE_DISABLED:
|
||||
case BR_STATE_BLOCKING:
|
||||
case BR_STATE_LISTENING:
|
||||
/* From UM10944 description of DRPDTAG (why put this there?):
|
||||
* "Management traffic flows to the port regardless of the state
|
||||
* of the INGRESS flag". So BPDUs are still be allowed to pass.
|
||||
|
|
@ -1399,11 +1400,6 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
|
|||
mac[port].egress = false;
|
||||
mac[port].dyn_learn = false;
|
||||
break;
|
||||
case BR_STATE_LISTENING:
|
||||
mac[port].ingress = true;
|
||||
mac[port].egress = false;
|
||||
mac[port].dyn_learn = false;
|
||||
break;
|
||||
case BR_STATE_LEARNING:
|
||||
mac[port].ingress = true;
|
||||
mac[port].egress = false;
|
||||
|
|
|
|||
|
|
@ -373,8 +373,13 @@ static int xgbe_map_rx_buffer(struct xgbe_prv_data *pdata,
|
|||
}
|
||||
|
||||
/* Set up the header page info */
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
XGBE_SKB_ALLOC_SIZE);
|
||||
if (pdata->netdev->features & NETIF_F_RXCSUM) {
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
XGBE_SKB_ALLOC_SIZE);
|
||||
} else {
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
pdata->rx_buf_size);
|
||||
}
|
||||
|
||||
/* Set up the buffer page info */
|
||||
xgbe_set_buffer_data(&rdata->rx.buf, &ring->rx_buf_pa,
|
||||
|
|
|
|||
|
|
@ -320,6 +320,18 @@ static void xgbe_config_sph_mode(struct xgbe_prv_data *pdata)
|
|||
XGMAC_IOWRITE_BITS(pdata, MAC_RCR, HDSMS, XGBE_SPH_HDSMS_SIZE);
|
||||
}
|
||||
|
||||
static void xgbe_disable_sph_mode(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < pdata->channel_count; i++) {
|
||||
if (!pdata->channel[i]->rx_ring)
|
||||
break;
|
||||
|
||||
XGMAC_DMA_IOWRITE_BITS(pdata->channel[i], DMA_CH_CR, SPH, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int xgbe_write_rss_reg(struct xgbe_prv_data *pdata, unsigned int type,
|
||||
unsigned int index, unsigned int val)
|
||||
{
|
||||
|
|
@ -3495,8 +3507,12 @@ static int xgbe_init(struct xgbe_prv_data *pdata)
|
|||
xgbe_config_tx_coalesce(pdata);
|
||||
xgbe_config_rx_buffer_size(pdata);
|
||||
xgbe_config_tso_mode(pdata);
|
||||
xgbe_config_sph_mode(pdata);
|
||||
xgbe_config_rss(pdata);
|
||||
|
||||
if (pdata->netdev->features & NETIF_F_RXCSUM) {
|
||||
xgbe_config_sph_mode(pdata);
|
||||
xgbe_config_rss(pdata);
|
||||
}
|
||||
|
||||
desc_if->wrapper_tx_desc_init(pdata);
|
||||
desc_if->wrapper_rx_desc_init(pdata);
|
||||
xgbe_enable_dma_interrupts(pdata);
|
||||
|
|
@ -3650,5 +3666,9 @@ void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *hw_if)
|
|||
hw_if->disable_vxlan = xgbe_disable_vxlan;
|
||||
hw_if->set_vxlan_id = xgbe_set_vxlan_id;
|
||||
|
||||
/* For Split Header*/
|
||||
hw_if->enable_sph = xgbe_config_sph_mode;
|
||||
hw_if->disable_sph = xgbe_disable_sph_mode;
|
||||
|
||||
DBGPR("<--xgbe_init_function_ptrs\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2372,10 +2372,17 @@ static int xgbe_set_features(struct net_device *netdev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if ((features & NETIF_F_RXCSUM) && !rxcsum)
|
||||
if ((features & NETIF_F_RXCSUM) && !rxcsum) {
|
||||
hw_if->enable_sph(pdata);
|
||||
hw_if->enable_vxlan(pdata);
|
||||
hw_if->enable_rx_csum(pdata);
|
||||
else if (!(features & NETIF_F_RXCSUM) && rxcsum)
|
||||
schedule_work(&pdata->restart_work);
|
||||
} else if (!(features & NETIF_F_RXCSUM) && rxcsum) {
|
||||
hw_if->disable_sph(pdata);
|
||||
hw_if->disable_vxlan(pdata);
|
||||
hw_if->disable_rx_csum(pdata);
|
||||
schedule_work(&pdata->restart_work);
|
||||
}
|
||||
|
||||
if ((features & NETIF_F_HW_VLAN_CTAG_RX) && !rxvlan)
|
||||
hw_if->enable_rx_vlan_stripping(pdata);
|
||||
|
|
|
|||
|
|
@ -834,6 +834,10 @@ struct xgbe_hw_if {
|
|||
void (*enable_vxlan)(struct xgbe_prv_data *);
|
||||
void (*disable_vxlan)(struct xgbe_prv_data *);
|
||||
void (*set_vxlan_id)(struct xgbe_prv_data *);
|
||||
|
||||
/* For Split Header */
|
||||
void (*enable_sph)(struct xgbe_prv_data *pdata);
|
||||
void (*disable_sph)(struct xgbe_prv_data *pdata);
|
||||
};
|
||||
|
||||
/* This structure represents implementation specific routines for an
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@
|
|||
|
||||
#include "main.h"
|
||||
|
||||
static const struct acpi_device_id xge_acpi_match[];
|
||||
|
||||
static int xge_get_resources(struct xge_pdata *pdata)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
|
@ -733,7 +731,7 @@ MODULE_DEVICE_TABLE(acpi, xge_acpi_match);
|
|||
static struct platform_driver xge_driver = {
|
||||
.driver = {
|
||||
.name = "xgene-enet-v2",
|
||||
.acpi_match_table = ACPI_PTR(xge_acpi_match),
|
||||
.acpi_match_table = xge_acpi_match,
|
||||
},
|
||||
.probe = xge_probe,
|
||||
.remove = xge_remove,
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ parse_eeprom (struct net_device *dev)
|
|||
dev->dev_addr[i] = psrom->mac_addr[i];
|
||||
|
||||
if (np->chip_id == CHIP_IP1000A) {
|
||||
np->led_mode = psrom->led_mode;
|
||||
np->led_mode = le16_to_cpu(psrom->led_mode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ typedef struct t_SROM {
|
|||
u16 sub_system_id; /* 0x06 */
|
||||
u16 pci_base_1; /* 0x08 (IP1000A only) */
|
||||
u16 pci_base_2; /* 0x0a (IP1000A only) */
|
||||
u16 led_mode; /* 0x0c (IP1000A only) */
|
||||
__le16 led_mode; /* 0x0c (IP1000A only) */
|
||||
u16 reserved1[9]; /* 0x0e-0x1f */
|
||||
u8 mac_addr[6]; /* 0x20-0x25 */
|
||||
u8 reserved2[10]; /* 0x26-0x2f */
|
||||
|
|
|
|||
|
|
@ -605,7 +605,12 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
|
|||
txq->bd.cur = bdp;
|
||||
|
||||
/* Trigger transmission start */
|
||||
writel(0, txq->bd.reg_desc_active);
|
||||
if (!(fep->quirks & FEC_QUIRK_ERR007885) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active))
|
||||
writel(0, txq->bd.reg_desc_active);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -682,9 +682,9 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device)
|
|||
}
|
||||
|
||||
static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir,
|
||||
struct mlx4_db *db, int order)
|
||||
struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
int o;
|
||||
unsigned int o;
|
||||
int i;
|
||||
|
||||
for (o = order; o <= 1; ++o) {
|
||||
|
|
@ -712,7 +712,7 @@ found:
|
|||
return 0;
|
||||
}
|
||||
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order)
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
struct mlx4_db_pgdir *pgdir;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \
|
||||
max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)
|
||||
#define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8
|
||||
|
||||
static const char mlx5e_rep_driver_name[] = "mlx5e_rep";
|
||||
|
||||
|
|
@ -1430,6 +1431,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
|||
|
||||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev))
|
||||
params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE;
|
||||
|
||||
/* CQ moderation params */
|
||||
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
||||
|
|
@ -1470,6 +1473,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
|
|||
}
|
||||
|
||||
netdev->watchdog_timeo = 15 * HZ;
|
||||
if (mlx5_core_is_ecpf(mdev))
|
||||
netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE;
|
||||
|
||||
netdev->features |= NETIF_F_NETNS_LOCAL;
|
||||
|
||||
|
|
|
|||
|
|
@ -189,6 +189,9 @@ mlx5e_test_loopback_validate(struct sk_buff *skb,
|
|||
struct udphdr *udph;
|
||||
struct iphdr *iph;
|
||||
|
||||
if (skb_linearize(skb))
|
||||
goto out;
|
||||
|
||||
/* We are only going to peek, no need to clone the SKB */
|
||||
if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -156,11 +156,16 @@ static int temp_warn(struct notifier_block *nb, unsigned long type, void *data)
|
|||
u64 value_msb;
|
||||
|
||||
value_lsb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_lsb);
|
||||
/* bit 1-63 are not supported for NICs,
|
||||
* hence read only bit 0 (asic) from lsb.
|
||||
*/
|
||||
value_lsb &= 0x1;
|
||||
value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb);
|
||||
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
if (net_ratelimit())
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -736,6 +736,7 @@ static void poll_health(struct timer_list *t)
|
|||
health->prev = count;
|
||||
if (health->miss_counter == MAX_MISSES) {
|
||||
mlx5_core_err(dev, "device's health compromised - reached miss count\n");
|
||||
health->synd = ioread8(&h->synd);
|
||||
print_health_info(dev);
|
||||
queue_work(health->wq, &health->report_work);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,8 +130,8 @@ static void mlx5_rdma_make_default_gid(struct mlx5_core_dev *dev, union ib_gid *
|
|||
|
||||
static int mlx5_rdma_add_roce_addr(struct mlx5_core_dev *dev)
|
||||
{
|
||||
u8 mac[ETH_ALEN] = {};
|
||||
union ib_gid gid;
|
||||
u8 mac[ETH_ALEN];
|
||||
|
||||
mlx5_rdma_make_default_gid(dev, &gid);
|
||||
return mlx5_core_roce_gid_set(dev, 0,
|
||||
|
|
|
|||
|
|
@ -1221,7 +1221,7 @@ static void lan743x_tx_release_desc(struct lan743x_tx *tx,
|
|||
if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_ACTIVE))
|
||||
goto done;
|
||||
|
||||
descriptor_type = (descriptor->data0) &
|
||||
descriptor_type = le32_to_cpu(descriptor->data0) &
|
||||
TX_DESC_DATA0_DTYPE_MASK_;
|
||||
if (descriptor_type == TX_DESC_DATA0_DTYPE_DATA_)
|
||||
goto clean_up_data_descriptor;
|
||||
|
|
@ -1281,7 +1281,7 @@ static int lan743x_tx_next_index(struct lan743x_tx *tx, int index)
|
|||
|
||||
static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx)
|
||||
{
|
||||
while ((*tx->head_cpu_ptr) != (tx->last_head)) {
|
||||
while (le32_to_cpu(*tx->head_cpu_ptr) != (tx->last_head)) {
|
||||
lan743x_tx_release_desc(tx, tx->last_head, false);
|
||||
tx->last_head = lan743x_tx_next_index(tx, tx->last_head);
|
||||
}
|
||||
|
|
@ -1367,10 +1367,10 @@ static int lan743x_tx_frame_start(struct lan743x_tx *tx,
|
|||
if (dma_mapping_error(dev, dma_ptr))
|
||||
return -ENOMEM;
|
||||
|
||||
tx_descriptor->data1 = DMA_ADDR_LOW32(dma_ptr);
|
||||
tx_descriptor->data2 = DMA_ADDR_HIGH32(dma_ptr);
|
||||
tx_descriptor->data3 = (frame_length << 16) &
|
||||
TX_DESC_DATA3_FRAME_LENGTH_MSS_MASK_;
|
||||
tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr));
|
||||
tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr));
|
||||
tx_descriptor->data3 = cpu_to_le32((frame_length << 16) &
|
||||
TX_DESC_DATA3_FRAME_LENGTH_MSS_MASK_);
|
||||
|
||||
buffer_info->skb = NULL;
|
||||
buffer_info->dma_ptr = dma_ptr;
|
||||
|
|
@ -1409,9 +1409,10 @@ static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx,
|
|||
if (nr_frags <= 0) {
|
||||
tx->frame_data0 |= TX_DESC_DATA0_LS_;
|
||||
tx->frame_data0 |= TX_DESC_DATA0_IOC_;
|
||||
tx->frame_last = tx->frame_first;
|
||||
}
|
||||
tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
|
||||
tx_descriptor->data0 = tx->frame_data0;
|
||||
tx_descriptor->data0 = cpu_to_le32(tx->frame_data0);
|
||||
|
||||
/* move to next descriptor */
|
||||
tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail);
|
||||
|
|
@ -1455,7 +1456,7 @@ static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx,
|
|||
|
||||
/* wrap up previous descriptor */
|
||||
tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
|
||||
tx_descriptor->data0 = tx->frame_data0;
|
||||
tx_descriptor->data0 = cpu_to_le32(tx->frame_data0);
|
||||
|
||||
/* move to next descriptor */
|
||||
tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail);
|
||||
|
|
@ -1478,13 +1479,14 @@ static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx,
|
|||
tx->frame_first = 0;
|
||||
tx->frame_data0 = 0;
|
||||
tx->frame_tail = 0;
|
||||
tx->frame_last = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tx_descriptor->data1 = DMA_ADDR_LOW32(dma_ptr);
|
||||
tx_descriptor->data2 = DMA_ADDR_HIGH32(dma_ptr);
|
||||
tx_descriptor->data3 = (frame_length << 16) &
|
||||
TX_DESC_DATA3_FRAME_LENGTH_MSS_MASK_;
|
||||
tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr));
|
||||
tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr));
|
||||
tx_descriptor->data3 = cpu_to_le32((frame_length << 16) &
|
||||
TX_DESC_DATA3_FRAME_LENGTH_MSS_MASK_);
|
||||
|
||||
buffer_info->skb = NULL;
|
||||
buffer_info->dma_ptr = dma_ptr;
|
||||
|
|
@ -1518,17 +1520,19 @@ static void lan743x_tx_frame_end(struct lan743x_tx *tx,
|
|||
TX_DESC_DATA0_DTYPE_DATA_) {
|
||||
tx->frame_data0 |= TX_DESC_DATA0_LS_;
|
||||
tx->frame_data0 |= TX_DESC_DATA0_IOC_;
|
||||
tx->frame_last = tx->frame_tail;
|
||||
}
|
||||
|
||||
tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
|
||||
buffer_info = &tx->buffer_info[tx->frame_tail];
|
||||
tx_descriptor = &tx->ring_cpu_ptr[tx->frame_last];
|
||||
buffer_info = &tx->buffer_info[tx->frame_last];
|
||||
buffer_info->skb = skb;
|
||||
if (time_stamp)
|
||||
buffer_info->flags |= TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED;
|
||||
if (ignore_sync)
|
||||
buffer_info->flags |= TX_BUFFER_INFO_FLAG_IGNORE_SYNC;
|
||||
|
||||
tx_descriptor->data0 = tx->frame_data0;
|
||||
tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
|
||||
tx_descriptor->data0 = cpu_to_le32(tx->frame_data0);
|
||||
tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail);
|
||||
tx->last_tail = tx->frame_tail;
|
||||
|
||||
|
|
@ -1946,11 +1950,11 @@ static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index,
|
|||
}
|
||||
|
||||
buffer_info->buffer_length = length;
|
||||
descriptor->data1 = DMA_ADDR_LOW32(buffer_info->dma_ptr);
|
||||
descriptor->data2 = DMA_ADDR_HIGH32(buffer_info->dma_ptr);
|
||||
descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr));
|
||||
descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr));
|
||||
descriptor->data3 = 0;
|
||||
descriptor->data0 = (RX_DESC_DATA0_OWN_ |
|
||||
(length & RX_DESC_DATA0_BUF_LENGTH_MASK_));
|
||||
descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ |
|
||||
(length & RX_DESC_DATA0_BUF_LENGTH_MASK_)));
|
||||
skb_reserve(buffer_info->skb, RX_HEAD_PADDING);
|
||||
lan743x_rx_update_tail(rx, index);
|
||||
|
||||
|
|
@ -1965,12 +1969,12 @@ static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index)
|
|||
descriptor = &rx->ring_cpu_ptr[index];
|
||||
buffer_info = &rx->buffer_info[index];
|
||||
|
||||
descriptor->data1 = DMA_ADDR_LOW32(buffer_info->dma_ptr);
|
||||
descriptor->data2 = DMA_ADDR_HIGH32(buffer_info->dma_ptr);
|
||||
descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr));
|
||||
descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr));
|
||||
descriptor->data3 = 0;
|
||||
descriptor->data0 = (RX_DESC_DATA0_OWN_ |
|
||||
descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ |
|
||||
((buffer_info->buffer_length) &
|
||||
RX_DESC_DATA0_BUF_LENGTH_MASK_));
|
||||
RX_DESC_DATA0_BUF_LENGTH_MASK_)));
|
||||
lan743x_rx_update_tail(rx, index);
|
||||
}
|
||||
|
||||
|
|
@ -2004,14 +2008,13 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
|
|||
{
|
||||
struct skb_shared_hwtstamps *hwtstamps = NULL;
|
||||
int result = RX_PROCESS_RESULT_NOTHING_TO_DO;
|
||||
int current_head_index = le32_to_cpu(*rx->head_cpu_ptr);
|
||||
struct lan743x_rx_buffer_info *buffer_info;
|
||||
struct lan743x_rx_descriptor *descriptor;
|
||||
int current_head_index = -1;
|
||||
int extension_index = -1;
|
||||
int first_index = -1;
|
||||
int last_index = -1;
|
||||
|
||||
current_head_index = *rx->head_cpu_ptr;
|
||||
if (current_head_index < 0 || current_head_index >= rx->ring_size)
|
||||
goto done;
|
||||
|
||||
|
|
@ -2020,14 +2023,14 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
|
|||
|
||||
if (rx->last_head != current_head_index) {
|
||||
descriptor = &rx->ring_cpu_ptr[rx->last_head];
|
||||
if (descriptor->data0 & RX_DESC_DATA0_OWN_)
|
||||
if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_)
|
||||
goto done;
|
||||
|
||||
if (!(descriptor->data0 & RX_DESC_DATA0_FS_))
|
||||
if (!(le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_FS_))
|
||||
goto done;
|
||||
|
||||
first_index = rx->last_head;
|
||||
if (descriptor->data0 & RX_DESC_DATA0_LS_) {
|
||||
if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_) {
|
||||
last_index = rx->last_head;
|
||||
} else {
|
||||
int index;
|
||||
|
|
@ -2035,10 +2038,10 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
|
|||
index = lan743x_rx_next_index(rx, first_index);
|
||||
while (index != current_head_index) {
|
||||
descriptor = &rx->ring_cpu_ptr[index];
|
||||
if (descriptor->data0 & RX_DESC_DATA0_OWN_)
|
||||
if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_)
|
||||
goto done;
|
||||
|
||||
if (descriptor->data0 & RX_DESC_DATA0_LS_) {
|
||||
if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_) {
|
||||
last_index = index;
|
||||
break;
|
||||
}
|
||||
|
|
@ -2047,17 +2050,17 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
|
|||
}
|
||||
if (last_index >= 0) {
|
||||
descriptor = &rx->ring_cpu_ptr[last_index];
|
||||
if (descriptor->data0 & RX_DESC_DATA0_EXT_) {
|
||||
if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_EXT_) {
|
||||
/* extension is expected to follow */
|
||||
int index = lan743x_rx_next_index(rx,
|
||||
last_index);
|
||||
if (index != current_head_index) {
|
||||
descriptor = &rx->ring_cpu_ptr[index];
|
||||
if (descriptor->data0 &
|
||||
if (le32_to_cpu(descriptor->data0) &
|
||||
RX_DESC_DATA0_OWN_) {
|
||||
goto done;
|
||||
}
|
||||
if (descriptor->data0 &
|
||||
if (le32_to_cpu(descriptor->data0) &
|
||||
RX_DESC_DATA0_EXT_) {
|
||||
extension_index = index;
|
||||
} else {
|
||||
|
|
@ -2110,7 +2113,7 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
|
|||
}
|
||||
buffer_info->skb = NULL;
|
||||
packet_length = RX_DESC_DATA0_FRAME_LENGTH_GET_
|
||||
(descriptor->data0);
|
||||
(le32_to_cpu(descriptor->data0));
|
||||
skb_put(skb, packet_length - 4);
|
||||
skb->protocol = eth_type_trans(skb,
|
||||
rx->adapter->netdev);
|
||||
|
|
@ -2148,8 +2151,8 @@ process_extension:
|
|||
descriptor = &rx->ring_cpu_ptr[extension_index];
|
||||
buffer_info = &rx->buffer_info[extension_index];
|
||||
|
||||
ts_sec = descriptor->data1;
|
||||
ts_nsec = (descriptor->data2 &
|
||||
ts_sec = le32_to_cpu(descriptor->data1);
|
||||
ts_nsec = (le32_to_cpu(descriptor->data2) &
|
||||
RX_DESC_DATA2_TS_NS_MASK_);
|
||||
lan743x_rx_reuse_ring_element(rx, extension_index);
|
||||
real_last_index = extension_index;
|
||||
|
|
|
|||
|
|
@ -652,10 +652,11 @@ struct lan743x_tx {
|
|||
u32 frame_first;
|
||||
u32 frame_data0;
|
||||
u32 frame_tail;
|
||||
u32 frame_last;
|
||||
|
||||
struct lan743x_tx_buffer_info *buffer_info;
|
||||
|
||||
u32 *head_cpu_ptr;
|
||||
__le32 *head_cpu_ptr;
|
||||
dma_addr_t head_dma_ptr;
|
||||
int last_head;
|
||||
int last_tail;
|
||||
|
|
@ -685,7 +686,7 @@ struct lan743x_rx {
|
|||
|
||||
struct lan743x_rx_buffer_info *buffer_info;
|
||||
|
||||
u32 *head_cpu_ptr;
|
||||
__le32 *head_cpu_ptr;
|
||||
dma_addr_t head_dma_ptr;
|
||||
u32 last_head;
|
||||
u32 last_tail;
|
||||
|
|
@ -769,10 +770,10 @@ struct lan743x_adapter {
|
|||
#define TX_DESC_DATA3_FRAME_LENGTH_MSS_MASK_ (0x3FFF0000)
|
||||
|
||||
struct lan743x_tx_descriptor {
|
||||
u32 data0;
|
||||
u32 data1;
|
||||
u32 data2;
|
||||
u32 data3;
|
||||
__le32 data0;
|
||||
__le32 data1;
|
||||
__le32 data2;
|
||||
__le32 data3;
|
||||
} __aligned(DEFAULT_DMA_DESCRIPTOR_SPACING);
|
||||
|
||||
#define TX_BUFFER_INFO_FLAG_ACTIVE BIT(0)
|
||||
|
|
@ -807,10 +808,10 @@ struct lan743x_tx_buffer_info {
|
|||
#define RX_HEAD_PADDING NET_IP_ALIGN
|
||||
|
||||
struct lan743x_rx_descriptor {
|
||||
u32 data0;
|
||||
u32 data1;
|
||||
u32 data2;
|
||||
u32 data3;
|
||||
__le32 data0;
|
||||
__le32 data1;
|
||||
__le32 data2;
|
||||
__le32 data3;
|
||||
} __aligned(DEFAULT_DMA_DESCRIPTOR_SPACING);
|
||||
|
||||
#define RX_BUFFER_INFO_FLAG_ACTIVE BIT(0)
|
||||
|
|
|
|||
|
|
@ -1486,8 +1486,11 @@ static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_o
|
|||
}
|
||||
|
||||
cmd_op = (cmd.rsp.arg[0] & 0xff);
|
||||
if (cmd.rsp.arg[0] >> 25 == 2)
|
||||
return 2;
|
||||
if (cmd.rsp.arg[0] >> 25 == 2) {
|
||||
ret = 2;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
|
||||
set_bit(QLC_BC_VF_STATE, &vf->state);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -919,7 +919,7 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv)
|
|||
/* of_mdio_parse_addr returns a valid (0 ~ 31) PHY
|
||||
* address. No need to mask it again.
|
||||
*/
|
||||
reg |= 1 << H3_EPHY_ADDR_SHIFT;
|
||||
reg |= ret << H3_EPHY_ADDR_SHIFT;
|
||||
} else {
|
||||
/* For SoCs without internal PHY the PHY selection bit should be
|
||||
* set to 0 (external PHY).
|
||||
|
|
|
|||
|
|
@ -1487,8 +1487,7 @@ static u8 mcps_data_request(
|
|||
command.pdata.data_req.src_addr_mode = src_addr_mode;
|
||||
command.pdata.data_req.dst.mode = dst_address_mode;
|
||||
if (dst_address_mode != MAC_MODE_NO_ADDR) {
|
||||
command.pdata.data_req.dst.pan_id[0] = LS_BYTE(dst_pan_id);
|
||||
command.pdata.data_req.dst.pan_id[1] = MS_BYTE(dst_pan_id);
|
||||
put_unaligned_le16(dst_pan_id, command.pdata.data_req.dst.pan_id);
|
||||
if (dst_address_mode == MAC_MODE_SHORT_ADDR) {
|
||||
command.pdata.data_req.dst.address[0] = LS_BYTE(
|
||||
dst_addr->short_address
|
||||
|
|
@ -1837,12 +1836,12 @@ static int ca8210_skb_rx(
|
|||
}
|
||||
hdr.source.mode = data_ind[0];
|
||||
dev_dbg(&priv->spi->dev, "srcAddrMode: %#03x\n", hdr.source.mode);
|
||||
hdr.source.pan_id = *(u16 *)&data_ind[1];
|
||||
hdr.source.pan_id = cpu_to_le16(get_unaligned_le16(&data_ind[1]));
|
||||
dev_dbg(&priv->spi->dev, "srcPanId: %#06x\n", hdr.source.pan_id);
|
||||
memcpy(&hdr.source.extended_addr, &data_ind[3], 8);
|
||||
hdr.dest.mode = data_ind[11];
|
||||
dev_dbg(&priv->spi->dev, "dstAddrMode: %#03x\n", hdr.dest.mode);
|
||||
hdr.dest.pan_id = *(u16 *)&data_ind[12];
|
||||
hdr.dest.pan_id = cpu_to_le16(get_unaligned_le16(&data_ind[12]));
|
||||
dev_dbg(&priv->spi->dev, "dstPanId: %#06x\n", hdr.dest.pan_id);
|
||||
memcpy(&hdr.dest.extended_addr, &data_ind[14], 8);
|
||||
|
||||
|
|
@ -1969,7 +1968,7 @@ static int ca8210_skb_tx(
|
|||
status = mcps_data_request(
|
||||
header.source.mode,
|
||||
header.dest.mode,
|
||||
header.dest.pan_id,
|
||||
le16_to_cpu(header.dest.pan_id),
|
||||
(union macaddr *)&header.dest.extended_addr,
|
||||
skb->len - mac_len,
|
||||
&skb->data[mac_len],
|
||||
|
|
|
|||
|
|
@ -302,9 +302,9 @@ static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,
|
|||
nla_put_u32(skb, NDA_IFINDEX, rdst->remote_ifindex))
|
||||
goto nla_put_failure;
|
||||
|
||||
ci.ndm_used = jiffies_to_clock_t(now - fdb->used);
|
||||
ci.ndm_used = jiffies_to_clock_t(now - READ_ONCE(fdb->used));
|
||||
ci.ndm_confirmed = 0;
|
||||
ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated);
|
||||
ci.ndm_updated = jiffies_to_clock_t(now - READ_ONCE(fdb->updated));
|
||||
ci.ndm_refcnt = 0;
|
||||
|
||||
if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
|
||||
|
|
@ -510,8 +510,8 @@ static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,
|
|||
struct vxlan_fdb *f;
|
||||
|
||||
f = __vxlan_find_mac(vxlan, mac, vni);
|
||||
if (f && f->used != jiffies)
|
||||
f->used = jiffies;
|
||||
if (f && READ_ONCE(f->used) != jiffies)
|
||||
WRITE_ONCE(f->used, jiffies);
|
||||
|
||||
return f;
|
||||
}
|
||||
|
|
@ -942,12 +942,12 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
|
|||
!(f->flags & NTF_VXLAN_ADDED_BY_USER)) {
|
||||
if (f->state != state) {
|
||||
f->state = state;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
notify = 1;
|
||||
}
|
||||
if (f->flags != fdb_flags) {
|
||||
f->flags = fdb_flags;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
notify = 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -974,7 +974,7 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
|
|||
}
|
||||
|
||||
if (ndm_flags & NTF_USE)
|
||||
f->used = jiffies;
|
||||
WRITE_ONCE(f->used, jiffies);
|
||||
|
||||
if (notify) {
|
||||
if (rd == NULL)
|
||||
|
|
@ -1351,7 +1351,7 @@ static bool vxlan_snoop(struct net_device *dev,
|
|||
src_mac, &rdst->remote_ip.sa, &src_ip->sa);
|
||||
|
||||
rdst->remote_ip = *src_ip;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL);
|
||||
} else {
|
||||
u32 hash_index = fdb_head_index(vxlan, src_mac, vni);
|
||||
|
|
@ -2748,7 +2748,7 @@ static void vxlan_cleanup(struct timer_list *t)
|
|||
if (f->flags & NTF_EXT_LEARNED)
|
||||
continue;
|
||||
|
||||
timeout = f->used + vxlan->cfg.age_interval * HZ;
|
||||
timeout = READ_ONCE(f->used) + vxlan->cfg.age_interval * HZ;
|
||||
if (time_before_eq(timeout, jiffies)) {
|
||||
netdev_dbg(vxlan->dev,
|
||||
"garbage collect %pM\n",
|
||||
|
|
|
|||
|
|
@ -866,14 +866,16 @@ brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
|
|||
}
|
||||
|
||||
/* 1) Prepare USB boot loader for runtime image */
|
||||
brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
|
||||
err = brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
rdlstate = le32_to_cpu(state.state);
|
||||
rdlbytes = le32_to_cpu(state.bytes);
|
||||
|
||||
/* 2) Check we are in the Waiting state */
|
||||
if (rdlstate != DL_WAITING) {
|
||||
brcmf_err("Failed to DL_START\n");
|
||||
brcmf_err("Invalid DL state: %u\n", rdlstate);
|
||||
err = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -766,6 +766,7 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
|||
struct ieee80211_sta_ht_cap *ht_cap)
|
||||
{
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
int i;
|
||||
|
||||
ht_cap->ht_supported = true;
|
||||
ht_cap->cap = 0;
|
||||
|
|
@ -780,17 +781,11 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
|||
ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
||||
ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
|
||||
ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
if (efuse->hw_cap.nss > 1) {
|
||||
ht_cap->mcs.rx_mask[0] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[1] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(300);
|
||||
} else {
|
||||
ht_cap->mcs.rx_mask[0] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[1] = 0x00;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(150);
|
||||
}
|
||||
|
||||
for (i = 0; i < efuse->hw_cap.nss; i++)
|
||||
ht_cap->mcs.rx_mask[i] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(150 * efuse->hw_cap.nss);
|
||||
}
|
||||
|
||||
static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
|
||||
|
|
|
|||
|
|
@ -864,11 +864,11 @@ static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
|||
}
|
||||
|
||||
static void
|
||||
rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
|
||||
u8 rs, u32 *phy_pwr_idx)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
|
||||
static u32 phy_pwr_idx;
|
||||
u8 rate, rate_idx, pwr_index, shift;
|
||||
int j;
|
||||
|
||||
|
|
@ -876,12 +876,12 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
|||
rate = rtw_rate_section[rs][j];
|
||||
pwr_index = hal->tx_pwr_tbl[path][rate];
|
||||
shift = rate & 0x3;
|
||||
phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
*phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
if (shift == 0x3) {
|
||||
rate_idx = rate & 0xfc;
|
||||
rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
|
||||
phy_pwr_idx);
|
||||
phy_pwr_idx = 0;
|
||||
*phy_pwr_idx);
|
||||
*phy_pwr_idx = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -889,11 +889,13 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
|||
static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u32 phy_pwr_idx = 0;
|
||||
int rs, path;
|
||||
|
||||
for (path = 0; path < hal->rf_path_num; path++) {
|
||||
for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
|
||||
rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
|
||||
rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs,
|
||||
&phy_pwr_idx);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -421,7 +421,8 @@ int nd_label_data_init(struct nvdimm_drvdata *ndd)
|
|||
if (ndd->data)
|
||||
return 0;
|
||||
|
||||
if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) {
|
||||
if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0 ||
|
||||
ndd->nsarea.config_size == 0) {
|
||||
dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n",
|
||||
ndd->nsarea.max_xfer, ndd->nsarea.config_size);
|
||||
return -ENXIO;
|
||||
|
|
|
|||
|
|
@ -3980,7 +3980,8 @@ static void nvme_fw_act_work(struct work_struct *work)
|
|||
msleep(100);
|
||||
}
|
||||
|
||||
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE))
|
||||
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_CONNECTING) ||
|
||||
!nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE))
|
||||
return;
|
||||
|
||||
nvme_start_queues(ctrl);
|
||||
|
|
|
|||
|
|
@ -1423,7 +1423,7 @@ static void __nvme_tcp_stop_queue(struct nvme_tcp_queue *queue)
|
|||
cancel_work_sync(&queue->io_work);
|
||||
}
|
||||
|
||||
static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)
|
||||
static void nvme_tcp_stop_queue_nowait(struct nvme_ctrl *nctrl, int qid)
|
||||
{
|
||||
struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl);
|
||||
struct nvme_tcp_queue *queue = &ctrl->queues[qid];
|
||||
|
|
@ -1433,6 +1433,31 @@ static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)
|
|||
__nvme_tcp_stop_queue(queue);
|
||||
}
|
||||
|
||||
static void nvme_tcp_wait_queue(struct nvme_ctrl *nctrl, int qid)
|
||||
{
|
||||
struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl);
|
||||
struct nvme_tcp_queue *queue = &ctrl->queues[qid];
|
||||
int timeout = 100;
|
||||
|
||||
while (timeout > 0) {
|
||||
if (!test_bit(NVME_TCP_Q_ALLOCATED, &queue->flags) ||
|
||||
!sk_wmem_alloc_get(queue->sock->sk))
|
||||
return;
|
||||
msleep(2);
|
||||
timeout -= 2;
|
||||
}
|
||||
dev_warn(nctrl->device,
|
||||
"qid %d: timeout draining sock wmem allocation expired\n",
|
||||
qid);
|
||||
}
|
||||
|
||||
static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)
|
||||
{
|
||||
nvme_tcp_stop_queue_nowait(nctrl, qid);
|
||||
nvme_tcp_wait_queue(nctrl, qid);
|
||||
}
|
||||
|
||||
|
||||
static void nvme_tcp_setup_sock_ops(struct nvme_tcp_queue *queue)
|
||||
{
|
||||
write_lock_bh(&queue->sock->sk->sk_callback_lock);
|
||||
|
|
@ -1539,7 +1564,9 @@ static void nvme_tcp_stop_io_queues(struct nvme_ctrl *ctrl)
|
|||
int i;
|
||||
|
||||
for (i = 1; i < ctrl->queue_count; i++)
|
||||
nvme_tcp_stop_queue(ctrl, i);
|
||||
nvme_tcp_stop_queue_nowait(ctrl, i);
|
||||
for (i = 1; i < ctrl->queue_count; i++)
|
||||
nvme_tcp_wait_queue(ctrl, i);
|
||||
}
|
||||
|
||||
static int nvme_tcp_start_io_queues(struct nvme_ctrl *ctrl)
|
||||
|
|
|
|||
|
|
@ -1338,6 +1338,9 @@ static void nvmet_tcp_restore_socket_callbacks(struct nvmet_tcp_queue *queue)
|
|||
{
|
||||
struct socket *sock = queue->sock;
|
||||
|
||||
if (!queue->state_change)
|
||||
return;
|
||||
|
||||
write_lock_bh(&sock->sk->sk_callback_lock);
|
||||
sock->sk->sk_data_ready = queue->data_ready;
|
||||
sock->sk->sk_state_change = queue->state_change;
|
||||
|
|
|
|||
|
|
@ -213,14 +213,15 @@ static ssize_t of_device_get_modalias(struct device *dev, char *str, ssize_t len
|
|||
csize = snprintf(str, len, "of:N%pOFn%c%s", dev->of_node, 'T',
|
||||
of_node_get_device_type(dev->of_node));
|
||||
tsize = csize;
|
||||
if (csize >= len)
|
||||
csize = len > 0 ? len - 1 : 0;
|
||||
len -= csize;
|
||||
if (str)
|
||||
str += csize;
|
||||
str += csize;
|
||||
|
||||
of_property_for_each_string(dev->of_node, "compatible", p, compat) {
|
||||
csize = strlen(compat) + 1;
|
||||
tsize += csize;
|
||||
if (csize > len)
|
||||
if (csize >= len)
|
||||
continue;
|
||||
|
||||
csize = snprintf(str, len, "C%s", compat);
|
||||
|
|
|
|||
|
|
@ -1112,11 +1112,10 @@ static int imx6_pcie_probe(struct platform_device *pdev)
|
|||
dev_err(dev, "pcie_aux clock source missing or invalid\n");
|
||||
return PTR_ERR(imx6_pcie->pcie_aux);
|
||||
}
|
||||
/* fall through */
|
||||
case IMX7D:
|
||||
if (dbi_base->start == IMX8MQ_PCIE2_BASE_ADDR)
|
||||
imx6_pcie->controller_id = 1;
|
||||
|
||||
/* fall through */
|
||||
case IMX7D:
|
||||
imx6_pcie->pciephy_reset = devm_reset_control_get_exclusive(dev,
|
||||
"pciephy");
|
||||
if (IS_ERR(imx6_pcie->pciephy_reset)) {
|
||||
|
|
|
|||
|
|
@ -800,11 +800,9 @@ static resource_size_t calculate_iosize(resource_size_t size,
|
|||
size = (size & 0xff) + ((size & ~0xffUL) << 2);
|
||||
#endif
|
||||
size = size + size1;
|
||||
if (size < old_size)
|
||||
size = old_size;
|
||||
|
||||
size = ALIGN(max(size, add_size) + children_add_size, align);
|
||||
return size;
|
||||
size = max(size, add_size) + children_add_size;
|
||||
return ALIGN(max(size, old_size), align);
|
||||
}
|
||||
|
||||
static resource_size_t calculate_memsize(resource_size_t size,
|
||||
|
|
|
|||
|
|
@ -360,13 +360,14 @@ EXPORT_SYMBOL_GPL(phy_power_off);
|
|||
|
||||
int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (!phy || !phy->ops->set_mode)
|
||||
if (!phy)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&phy->mutex);
|
||||
ret = phy->ops->set_mode(phy, mode, submode);
|
||||
if (phy->ops->set_mode)
|
||||
ret = phy->ops->set_mode(phy, mode, submode);
|
||||
if (!ret)
|
||||
phy->attrs.mode = mode;
|
||||
mutex_unlock(&phy->mutex);
|
||||
|
|
|
|||
|
|
@ -427,8 +427,11 @@ static int rcar_gen3_phy_usb2_init(struct phy *p)
|
|||
val = readl(usb2_base + USB2_INT_ENABLE);
|
||||
val |= USB2_INT_ENABLE_UCOM_INTEN | rphy->int_enable_bits;
|
||||
writel(val, usb2_base + USB2_INT_ENABLE);
|
||||
writel(USB2_SPD_RSM_TIMSET_INIT, usb2_base + USB2_SPD_RSM_TIMSET);
|
||||
writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
|
||||
|
||||
if (!rcar_gen3_is_any_rphy_initialized(channel)) {
|
||||
writel(USB2_SPD_RSM_TIMSET_INIT, usb2_base + USB2_SPD_RSM_TIMSET);
|
||||
writel(USB2_OC_TIMSET_INIT, usb2_base + USB2_OC_TIMSET);
|
||||
}
|
||||
|
||||
/* Initialize otg part */
|
||||
if (channel->is_otg_channel) {
|
||||
|
|
|
|||
|
|
@ -526,16 +526,16 @@ static int tegra_xusb_port_init(struct tegra_xusb_port *port,
|
|||
|
||||
err = dev_set_name(&port->dev, "%s-%u", name, index);
|
||||
if (err < 0)
|
||||
goto unregister;
|
||||
goto put_device;
|
||||
|
||||
err = device_add(&port->dev);
|
||||
if (err < 0)
|
||||
goto unregister;
|
||||
goto put_device;
|
||||
|
||||
return 0;
|
||||
|
||||
unregister:
|
||||
device_unregister(&port->dev);
|
||||
put_device:
|
||||
put_device(&port->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI;
|
|||
struct bcm281xx_pin_function {
|
||||
const char *name;
|
||||
const char * const *groups;
|
||||
const unsigned ngroups;
|
||||
const unsigned int ngroups;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -91,10 +91,10 @@ struct bcm281xx_pinctrl_data {
|
|||
|
||||
/* List of all pins */
|
||||
const struct pinctrl_pin_desc *pins;
|
||||
const unsigned npins;
|
||||
const unsigned int npins;
|
||||
|
||||
const struct bcm281xx_pin_function *functions;
|
||||
const unsigned nfunctions;
|
||||
const unsigned int nfunctions;
|
||||
|
||||
struct regmap *regmap;
|
||||
};
|
||||
|
|
@ -948,7 +948,7 @@ static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = {
|
|||
};
|
||||
|
||||
static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev,
|
||||
unsigned pin)
|
||||
unsigned int pin)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
|
|
@ -992,7 +992,7 @@ static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
|
|||
}
|
||||
|
||||
static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
|
||||
unsigned group)
|
||||
unsigned int group)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
|
|
@ -1000,9 +1000,9 @@ static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
|
|||
}
|
||||
|
||||
static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
|
||||
unsigned group,
|
||||
unsigned int group,
|
||||
const unsigned **pins,
|
||||
unsigned *num_pins)
|
||||
unsigned int *num_pins)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
|
|
@ -1014,7 +1014,7 @@ static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
|
|||
|
||||
static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
|
||||
struct seq_file *s,
|
||||
unsigned offset)
|
||||
unsigned int offset)
|
||||
{
|
||||
seq_printf(s, " %s", dev_name(pctldev->dev));
|
||||
}
|
||||
|
|
@ -1036,7 +1036,7 @@ static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev)
|
|||
}
|
||||
|
||||
static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
|
||||
unsigned function)
|
||||
unsigned int function)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
|
|
@ -1044,9 +1044,9 @@ static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
|
|||
}
|
||||
|
||||
static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
|
||||
unsigned function,
|
||||
unsigned int function,
|
||||
const char * const **groups,
|
||||
unsigned * const num_groups)
|
||||
unsigned int * const num_groups)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
|
|
@ -1057,8 +1057,8 @@ static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
|
|||
}
|
||||
|
||||
static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
|
||||
unsigned function,
|
||||
unsigned group)
|
||||
unsigned int function,
|
||||
unsigned int group)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
const struct bcm281xx_pin_function *f = &pdata->functions[function];
|
||||
|
|
@ -1089,7 +1089,7 @@ static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
|
|||
};
|
||||
|
||||
static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
|
||||
unsigned pin,
|
||||
unsigned int pin,
|
||||
unsigned long *config)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
|
|
@ -1098,9 +1098,9 @@ static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
|
|||
|
||||
/* Goes through the configs and update register val/mask */
|
||||
static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev,
|
||||
unsigned pin,
|
||||
unsigned int pin,
|
||||
unsigned long *configs,
|
||||
unsigned num_configs,
|
||||
unsigned int num_configs,
|
||||
u32 *val,
|
||||
u32 *mask)
|
||||
{
|
||||
|
|
@ -1214,9 +1214,9 @@ static const u16 bcm281xx_pullup_map[] = {
|
|||
|
||||
/* Goes through the configs and update register val/mask */
|
||||
static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
|
||||
unsigned pin,
|
||||
unsigned int pin,
|
||||
unsigned long *configs,
|
||||
unsigned num_configs,
|
||||
unsigned int num_configs,
|
||||
u32 *val,
|
||||
u32 *mask)
|
||||
{
|
||||
|
|
@ -1284,9 +1284,9 @@ static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
|
|||
|
||||
/* Goes through the configs and update register val/mask */
|
||||
static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
|
||||
unsigned pin,
|
||||
unsigned int pin,
|
||||
unsigned long *configs,
|
||||
unsigned num_configs,
|
||||
unsigned int num_configs,
|
||||
u32 *val,
|
||||
u32 *mask)
|
||||
{
|
||||
|
|
@ -1328,9 +1328,9 @@ static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
|
|||
}
|
||||
|
||||
static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev,
|
||||
unsigned pin,
|
||||
unsigned int pin,
|
||||
unsigned long *configs,
|
||||
unsigned num_configs)
|
||||
unsigned int num_configs)
|
||||
{
|
||||
struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
enum bcm281xx_pin_type pin_type;
|
||||
|
|
|
|||
|
|
@ -141,10 +141,14 @@ static int dt_to_map_one_config(struct pinctrl *p,
|
|||
pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
|
||||
if (pctldev)
|
||||
break;
|
||||
/* Do not defer probing of hogs (circular loop) */
|
||||
/*
|
||||
* Do not defer probing of hogs (circular loop)
|
||||
*
|
||||
* Return 1 to let the caller catch the case.
|
||||
*/
|
||||
if (np_pctldev == p->dev->of_node) {
|
||||
of_node_put(np_pctldev);
|
||||
return -ENODEV;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
of_node_put(np_pctldev);
|
||||
|
|
@ -268,6 +272,8 @@ int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev)
|
|||
ret = dt_to_map_one_config(p, pctldev, statename,
|
||||
np_config);
|
||||
of_node_put(np_config);
|
||||
if (ret == 1)
|
||||
continue;
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -480,7 +480,7 @@ static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin,
|
|||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
if (meson_pinconf_get_pull(pc, pin) == param)
|
||||
arg = 1;
|
||||
arg = 60000;
|
||||
else
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -2458,7 +2458,8 @@ static int asus_wmi_add(struct platform_device *pdev)
|
|||
goto fail_leds;
|
||||
|
||||
asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_WLAN, &result);
|
||||
if (result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
|
||||
if ((result & (ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT)) ==
|
||||
(ASUS_WMI_DSTS_PRESENCE_BIT | ASUS_WMI_DSTS_USER_BIT))
|
||||
asus->driver->wlan_ctrl_by_user = 1;
|
||||
|
||||
if (!(asus->driver->wlan_ctrl_by_user && ashs_present())) {
|
||||
|
|
|
|||
|
|
@ -17,13 +17,13 @@
|
|||
/*
|
||||
* fujitsu-laptop.c - Fujitsu laptop support, providing access to additional
|
||||
* features made available on a range of Fujitsu laptops including the
|
||||
* P2xxx/P5xxx/S6xxx/S7xxx series.
|
||||
* P2xxx/P5xxx/S2xxx/S6xxx/S7xxx series.
|
||||
*
|
||||
* This driver implements a vendor-specific backlight control interface for
|
||||
* Fujitsu laptops and provides support for hotkeys present on certain Fujitsu
|
||||
* laptops.
|
||||
*
|
||||
* This driver has been tested on a Fujitsu Lifebook S6410, S7020 and
|
||||
* This driver has been tested on a Fujitsu Lifebook S2110, S6410, S7020 and
|
||||
* P8010. It should work on most P-series and S-series Lifebooks, but
|
||||
* YMMV.
|
||||
*
|
||||
|
|
@ -102,7 +102,11 @@
|
|||
#define KEY2_CODE 0x411
|
||||
#define KEY3_CODE 0x412
|
||||
#define KEY4_CODE 0x413
|
||||
#define KEY5_CODE 0x420
|
||||
#define KEY5_CODE 0x414
|
||||
#define KEY6_CODE 0x415
|
||||
#define KEY7_CODE 0x416
|
||||
#define KEY8_CODE 0x417
|
||||
#define KEY9_CODE 0x420
|
||||
|
||||
/* Hotkey ringbuffer limits */
|
||||
#define MAX_HOTKEY_RINGBUFFER_SIZE 100
|
||||
|
|
@ -450,7 +454,7 @@ static const struct key_entry keymap_default[] = {
|
|||
{ KE_KEY, KEY2_CODE, { KEY_PROG2 } },
|
||||
{ KE_KEY, KEY3_CODE, { KEY_PROG3 } },
|
||||
{ KE_KEY, KEY4_CODE, { KEY_PROG4 } },
|
||||
{ KE_KEY, KEY5_CODE, { KEY_RFKILL } },
|
||||
{ KE_KEY, KEY9_CODE, { KEY_RFKILL } },
|
||||
/* Soft keys read from status flags */
|
||||
{ KE_KEY, FLAG_RFKILL, { KEY_RFKILL } },
|
||||
{ KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } },
|
||||
|
|
@ -474,6 +478,18 @@ static const struct key_entry keymap_p8010[] = {
|
|||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static const struct key_entry keymap_s2110[] = {
|
||||
{ KE_KEY, KEY1_CODE, { KEY_PROG1 } }, /* "A" */
|
||||
{ KE_KEY, KEY2_CODE, { KEY_PROG2 } }, /* "B" */
|
||||
{ KE_KEY, KEY3_CODE, { KEY_WWW } }, /* "Internet" */
|
||||
{ KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */
|
||||
{ KE_KEY, KEY5_CODE, { KEY_STOPCD } },
|
||||
{ KE_KEY, KEY6_CODE, { KEY_PLAYPAUSE } },
|
||||
{ KE_KEY, KEY7_CODE, { KEY_PREVIOUSSONG } },
|
||||
{ KE_KEY, KEY8_CODE, { KEY_NEXTSONG } },
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static const struct key_entry *keymap = keymap_default;
|
||||
|
||||
static int fujitsu_laptop_dmi_keymap_override(const struct dmi_system_id *id)
|
||||
|
|
@ -511,6 +527,15 @@ static const struct dmi_system_id fujitsu_laptop_dmi_table[] = {
|
|||
},
|
||||
.driver_data = (void *)keymap_p8010
|
||||
},
|
||||
{
|
||||
.callback = fujitsu_laptop_dmi_keymap_override,
|
||||
.ident = "Fujitsu LifeBook S2110",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S2110"),
|
||||
},
|
||||
.driver_data = (void *)keymap_s2110
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -195,6 +195,7 @@ enum tpacpi_hkey_event_t {
|
|||
/* Thermal events */
|
||||
TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */
|
||||
TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */
|
||||
TP_HKEY_EV_ALARM_BAT_LIM_CHANGE = 0x6013, /* battery charge limit changed*/
|
||||
TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */
|
||||
TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */
|
||||
TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* windows; thermal table changed */
|
||||
|
|
@ -4059,6 +4060,10 @@ static bool hotkey_notify_6xxx(const u32 hkey,
|
|||
pr_alert("THERMAL EMERGENCY: battery is extremely hot!\n");
|
||||
/* recommended action: immediate sleep/hibernate */
|
||||
break;
|
||||
case TP_HKEY_EV_ALARM_BAT_LIM_CHANGE:
|
||||
pr_debug("Battery Info: battery charge threshold changed\n");
|
||||
/* User changed charging threshold. No action needed */
|
||||
return true;
|
||||
case TP_HKEY_EV_ALARM_SENSOR_HOT:
|
||||
pr_crit("THERMAL ALARM: a sensor reports something is too hot!\n");
|
||||
/* recommended action: warn user through gui, that */
|
||||
|
|
@ -10112,6 +10117,8 @@ static int __must_check __init get_thinkpad_model_data(
|
|||
tp->vendor = PCI_VENDOR_ID_IBM;
|
||||
else if (dmi_name_in_vendors("LENOVO"))
|
||||
tp->vendor = PCI_VENDOR_ID_LENOVO;
|
||||
else if (dmi_name_in_vendors("NEC"))
|
||||
tp->vendor = PCI_VENDOR_ID_LENOVO;
|
||||
else
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/of_regulator.h>
|
||||
|
||||
#define AD5398_CURRENT_EN_MASK 0x8000
|
||||
|
||||
|
|
@ -221,15 +222,20 @@ static int ad5398_probe(struct i2c_client *client,
|
|||
const struct ad5398_current_data_format *df =
|
||||
(struct ad5398_current_data_format *)id->driver_data;
|
||||
|
||||
if (!init_data)
|
||||
return -EINVAL;
|
||||
|
||||
chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
|
||||
if (!chip)
|
||||
return -ENOMEM;
|
||||
|
||||
config.dev = &client->dev;
|
||||
if (client->dev.of_node)
|
||||
init_data = of_get_regulator_init_data(&client->dev,
|
||||
client->dev.of_node,
|
||||
&ad5398_reg);
|
||||
if (!init_data)
|
||||
return -EINVAL;
|
||||
|
||||
config.init_data = init_data;
|
||||
config.of_node = client->dev.of_node;
|
||||
config.driver_data = chip;
|
||||
|
||||
chip->client = client;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue