mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-05 08:55:19 +02:00
Merge 6.6.58 into android15-6.6-lts
GKI (arm64) relevant 28 out of 125 changes, affecting 31 files +155/-11775150ba93d
net: enetc: add missing static descriptor and inline keyword [1 file, +2/-1]a3f169e398
posix-clock: Fix missing timespec64 check in pc_clock_settime() [1 file, +3/-0]9f1e773547
arm64: probes: Remove broken LDR (literal) uprobe support [1 file, +11/-5]173c13e387
arm64: probes: Fix simulate_ldr*_literal() [1 file, +7/-11]8165bf83b8
arm64: probes: Fix uprobes for big-endian kernels [2 files, +5/-7]8e29f32351
irqchip/gic-v3-its: Fix VSYNC referencing an unmapped VPE on GIC v4.1 [1 file, +7/-1]a9af9d5fb0
fat: fix uninitialized variable [1 file, +1/-1]17396e32f9
mm/mremap: fix move_normal_pmd/retract_page_tables race [1 file, +9/-2]a0035fc555
mm/mglru: only clear kswapd_failures if reclaimable [1 file, +2/-2]bed2b90378
mm/swapfile: skip HugeTLB pages for unuse_vma [1 file, +1/-1]677f1df179
maple_tree: correct tree corruption on spanning store [1 file, +6/-6]4c5b123ab2
blk-rq-qos: fix crash on rq_qos_wait vs. rq_qos_wake_function race [1 file, +1/-1]6414ab5c9c
ublk: don't allow user copy for unprivileged device [2 files, +17/-2]d3c4f41ae3
Input: xpad - add support for MSI Claw A1M [1 file, +2/-0]7bd9af2542
scsi: ufs: core: Set SDEV_OFFLINE when UFS is shut down [1 file, +3/-1]8e6ca01b3b
scsi: ufs: core: Fix the issue of ICU failure [1 file, +8/-7]05f84d8616
Bluetooth: Call iso_exit() on module unload [1 file, +2/-0]59bd80df4b
Bluetooth: Remove debugfs directory on module init failure [1 file, +1/-0]8fb8e912af
Bluetooth: ISO: Fix multiple init when debugfs is disabled [1 file, +1/-5]cc7b705099
xhci: Fix incorrect stream context type macro [1 file, +1/-1]53cd1bb1f8
xhci: Mitigate failed set dequeue pointer commands [1 file, +1/-1]c3d3501cf8
usb: dwc3: Wait for EndXfer completion before restoring GUSB2PHYCFG [1 file, +6/-4]01282ab518
irqchip/gic-v4: Don't allow a VMOVP on a dying VPE [2 files, +15/-7]90e3f819e6
serial: qcom-geni: fix polled console initialisation [1 file, +20/-1]7176aee5a1
serial: qcom-geni: revert broken hibernation support [1 file, +2/-39]61c8f746ed
serial: qcom-geni: fix dma rx cancellation [1 file, +14/-4]647cd4494c
serial: qcom-geni: fix receiver enable [1 file, +6/-4]229dfdc36f
tcp: fix mptcp DSS corruption due to large pmtu xmit [1 file, +1/-3] Changes in 6.6.58 btrfs: fix uninitialized pointer free in add_inode_ref() btrfs: fix uninitialized pointer free on read_alloc_one_name() error ksmbd: fix user-after-free from session log off ALSA: hda/conexant - Fix audio routing for HP EliteOne 1000 G2 mptcp: pm: fix UaF read in mptcp_pm_nl_rm_addr_or_subflow net: enetc: remove xdp_drops statistic from enetc_xdp_drop() net: enetc: block concurrent XDP transmissions during ring reconfiguration net: enetc: disable Tx BD rings after they are empty net: enetc: disable NAPI after all rings are disabled net: enetc: add missing static descriptor and inline keyword posix-clock: Fix missing timespec64 check in pc_clock_settime() arm64: probes: Remove broken LDR (literal) uprobe support arm64: probes: Fix simulate_ldr*_literal() arm64: probes: Fix uprobes for big-endian kernels net: macb: Avoid 20s boot delay by skipping MDIO bus registration for fixed-link PHY net: microchip: vcap api: Fix memory leaks in vcap_api_encode_rule_test() irqchip/gic-v3-its: Fix VSYNC referencing an unmapped VPE on GIC v4.1 fat: fix uninitialized variable selftests/mm: replace atomic_bool with pthread_barrier_t selftests/mm: fix deadlock for fork after pthread_create on ARM mm/mremap: fix move_normal_pmd/retract_page_tables race mm/mglru: only clear kswapd_failures if reclaimable mm/swapfile: skip HugeTLB pages for unuse_vma xfs: fix error returns from xfs_bmapi_write xfs: fix xfs_bmap_add_extent_delay_real for partial conversions xfs: remove a racy if_bytes check in xfs_reflink_end_cow_extent xfs: require XFS_SB_FEAT_INCOMPAT_LOG_XATTRS for attr log intent item recovery xfs: check opcode and iovec count match in xlog_recover_attri_commit_pass2 xfs: fix missing check for invalid attr flags xfs: check shortform attr entry flags specifically xfs: validate recovered name buffers when recovering xattr items xfs: enforce one namespace per attribute xfs: revert commit44af6c7e59
xfs: use dontcache for grabbing inodes during scrub xfs: match lock mode in xfs_buffered_write_iomap_begin() xfs: make the seq argument to xfs_bmapi_convert_delalloc() optional xfs: make xfs_bmapi_convert_delalloc() to allocate the target offset xfs: convert delayed extents to unwritten when zeroing post eof blocks xfs: allow symlinks with short remote targets xfs: make sure sb_fdblocks is non-negative xfs: fix unlink vs cluster buffer instantiation race xfs: fix freeing speculative preallocations for preallocated files xfs: allow unlinked symlinks and dirs with zero size xfs: restrict when we try to align cow fork delalloc to cowextsz hints maple_tree: correct tree corruption on spanning store net: fec: Move `fec_ptp_read()` to the top of the file net: fec: Remove duplicated code mptcp: prevent MPC handshake on port-based signal endpoints iommu/vt-d: Fix incorrect pci_for_each_dma_alias() for non-PCI devices s390/sclp: Deactivate sclp after all its users s390/sclp_vt220: Convert newlines to CRLF instead of LFCR KVM: s390: gaccess: Check if guest address is in memslot KVM: s390: Change virtual to physical address access in diag 0x258 handler x86/cpufeatures: Define X86_FEATURE_AMD_IBPB_RET x86/cpufeatures: Add a IBPB_NO_RET BUG flag x86/entry: Have entry_ibpb() invalidate return predictions x86/bugs: Skip RSB fill at VMEXIT x86/bugs: Do not use UNTRAIN_RET with IBPB on entry blk-rq-qos: fix crash on rq_qos_wait vs. rq_qos_wake_function race io_uring/sqpoll: close race on waiting for sqring entries ublk: don't allow user copy for unprivileged device selftest: hid: add the missing tests directory Input: xpad - add support for MSI Claw A1M scsi: ufs: core: Set SDEV_OFFLINE when UFS is shut down scsi: ufs: core: Fix the issue of ICU failure drm/radeon: Fix encoder->possible_clones drm/vmwgfx: Handle surface check failure correctly drm/amdgpu/swsmu: Only force workload setup on init drm/amdgpu: prevent BO_HANDLES error from being overwritten iio: dac: ad5770r: add missing select REGMAP_SPI in Kconfig iio: dac: ltc1660: add missing select REGMAP_SPI in Kconfig iio: dac: stm32-dac-core: add missing select REGMAP_MMIO in Kconfig iio: adc: ti-ads8688: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: hid-sensors: Fix an error handling path in _hid_sensor_set_report_latency() iio: light: veml6030: fix ALS sensor resolution iio: light: veml6030: fix IIO device retrieval from embedded device iio: light: opt3001: add missing full-scale range value iio: amplifiers: ada4250: add missing select REGMAP_SPI in Kconfig iio: frequency: adf4377: add missing select REMAP_SPI in Kconfig iio: light: bu27008: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: dac: ad5766: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: proximity: mb1232: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: dac: ad3552r: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: adc: ti-lmp92064: add missing select REGMAP_SPI in Kconfig iio: adc: ti-ads124s08: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig iio: accel: kx022a: add missing select IIO_(TRIGGERED_)BUFFER in Kconfig Bluetooth: Call iso_exit() on module unload Bluetooth: Remove debugfs directory on module init failure Bluetooth: ISO: Fix multiple init when debugfs is disabled Bluetooth: btusb: Fix regression with fake CSR controllers 0a12:0001 vt: prevent kernel-infoleak in con_font_get() xhci: tegra: fix checked USB2 port number xhci: Fix incorrect stream context type macro xhci: Mitigate failed set dequeue pointer commands USB: serial: option: add support for Quectel EG916Q-GL USB: serial: option: add Telit FN920C04 MBIM compositions usb: typec: qcom-pmic-typec: fix sink status being overwritten with RP_DEF usb: dwc3: Wait for EndXfer completion before restoring GUSB2PHYCFG misc: microchip: pci1xxxx: add support for NVMEM_DEVID_AUTO for EEPROM device misc: microchip: pci1xxxx: add support for NVMEM_DEVID_AUTO for OTP device serial: imx: Update mctrl old_status on RTSD interrupt parport: Proper fix for array out-of-bounds access x86/resctrl: Annotate get_mem_config() functions as __init x86/apic: Always explicitly disarm TSC-deadline timer x86/CPU/AMD: Only apply Zenbleed fix for Zen2 during late microcode load x86/entry_32: Do not clobber user EFLAGS.ZF x86/entry_32: Clear CPU buffers after register restore in NMI return tty: n_gsm: Fix use-after-free in gsm_cleanup_mux x86/bugs: Use code segment selector for VERW operand pinctrl: ocelot: fix system hang on level based interrupts pinctrl: stm32: check devm_kasprintf() returned value pinctrl: apple: check devm_kasprintf() returned value irqchip/gic-v4: Don't allow a VMOVP on a dying VPE irqchip/sifive-plic: Unmask interrupt in plic_irq_enable() serial: qcom-geni: fix polled console initialisation serial: qcom-geni: revert broken hibernation support serial: qcom-geni: fix dma rx cancellation serial: qcom-geni: fix receiver enable tcp: fix mptcp DSS corruption due to large pmtu xmit selftests: mptcp: join: change capture/checksum as bool selftests: mptcp: join: test for prohibited MPC to port-based endp selftests: mptcp: remove duplicated variables nilfs2: propagate directory read errors from nilfs_find_entry() ALSA: hda/conexant - Use cached pin control for Node 0x1d on HP EliteOne 1000 G2 Linux 6.6.58 Change-Id: I9587eeaecc8d28d5bd0b9b53181a2584ce840379 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
227f0fab6f
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 57
|
SUBLEVEL = 58
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Pinguïn Aangedreven
|
NAME = Pinguïn Aangedreven
|
||||||
|
|
||||||
|
|
|
@ -875,6 +875,8 @@ SYM_FUNC_START(entry_SYSENTER_32)
|
||||||
|
|
||||||
/* Now ready to switch the cr3 */
|
/* Now ready to switch the cr3 */
|
||||||
SWITCH_TO_USER_CR3 scratch_reg=%eax
|
SWITCH_TO_USER_CR3 scratch_reg=%eax
|
||||||
|
/* Clobbers ZF */
|
||||||
|
CLEAR_CPU_BUFFERS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore all flags except IF. (We restore IF separately because
|
* Restore all flags except IF. (We restore IF separately because
|
||||||
|
@ -885,7 +887,6 @@ SYM_FUNC_START(entry_SYSENTER_32)
|
||||||
BUG_IF_WRONG_CR3 no_user_check=1
|
BUG_IF_WRONG_CR3 no_user_check=1
|
||||||
popfl
|
popfl
|
||||||
popl %eax
|
popl %eax
|
||||||
CLEAR_CPU_BUFFERS
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return back to the vDSO, which will pop ecx and edx.
|
* Return back to the vDSO, which will pop ecx and edx.
|
||||||
|
@ -1148,7 +1149,6 @@ SYM_CODE_START(asm_exc_nmi)
|
||||||
|
|
||||||
/* Not on SYSENTER stack. */
|
/* Not on SYSENTER stack. */
|
||||||
call exc_nmi
|
call exc_nmi
|
||||||
CLEAR_CPU_BUFFERS
|
|
||||||
jmp .Lnmi_return
|
jmp .Lnmi_return
|
||||||
|
|
||||||
.Lnmi_from_sysenter_stack:
|
.Lnmi_from_sysenter_stack:
|
||||||
|
@ -1169,6 +1169,7 @@ SYM_CODE_START(asm_exc_nmi)
|
||||||
|
|
||||||
CHECK_AND_APPLY_ESPFIX
|
CHECK_AND_APPLY_ESPFIX
|
||||||
RESTORE_ALL_NMI cr3_reg=%edi pop=4
|
RESTORE_ALL_NMI cr3_reg=%edi pop=4
|
||||||
|
CLEAR_CPU_BUFFERS
|
||||||
jmp .Lirq_return
|
jmp .Lirq_return
|
||||||
|
|
||||||
#ifdef CONFIG_X86_ESPFIX32
|
#ifdef CONFIG_X86_ESPFIX32
|
||||||
|
@ -1210,6 +1211,7 @@ SYM_CODE_START(asm_exc_nmi)
|
||||||
* 1 - orig_ax
|
* 1 - orig_ax
|
||||||
*/
|
*/
|
||||||
lss (1+5+6)*4(%esp), %esp # back to espfix stack
|
lss (1+5+6)*4(%esp), %esp # back to espfix stack
|
||||||
|
CLEAR_CPU_BUFFERS
|
||||||
jmp .Lirq_return
|
jmp .Lirq_return
|
||||||
#endif
|
#endif
|
||||||
SYM_CODE_END(asm_exc_nmi)
|
SYM_CODE_END(asm_exc_nmi)
|
||||||
|
|
|
@ -332,7 +332,16 @@
|
||||||
* Note: Only the memory operand variant of VERW clears the CPU buffers.
|
* Note: Only the memory operand variant of VERW clears the CPU buffers.
|
||||||
*/
|
*/
|
||||||
.macro CLEAR_CPU_BUFFERS
|
.macro CLEAR_CPU_BUFFERS
|
||||||
ALTERNATIVE "", __stringify(verw _ASM_RIP(mds_verw_sel)), X86_FEATURE_CLEAR_CPU_BUF
|
#ifdef CONFIG_X86_64
|
||||||
|
ALTERNATIVE "", "verw mds_verw_sel(%rip)", X86_FEATURE_CLEAR_CPU_BUF
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* In 32bit mode, the memory operand must be a %cs reference. The data
|
||||||
|
* segments may not be usable (vm86 mode), and the stack segment may not
|
||||||
|
* be flat (ESPFIX32).
|
||||||
|
*/
|
||||||
|
ALTERNATIVE "", "verw %cs:mds_verw_sel", X86_FEATURE_CLEAR_CPU_BUF
|
||||||
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
|
|
@ -473,7 +473,19 @@ static int lapic_timer_shutdown(struct clock_event_device *evt)
|
||||||
v = apic_read(APIC_LVTT);
|
v = apic_read(APIC_LVTT);
|
||||||
v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR);
|
v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR);
|
||||||
apic_write(APIC_LVTT, v);
|
apic_write(APIC_LVTT, v);
|
||||||
apic_write(APIC_TMICT, 0);
|
|
||||||
|
/*
|
||||||
|
* Setting APIC_LVT_MASKED (above) should be enough to tell
|
||||||
|
* the hardware that this timer will never fire. But AMD
|
||||||
|
* erratum 411 and some Intel CPU behavior circa 2024 say
|
||||||
|
* otherwise. Time for belt and suspenders programming: mask
|
||||||
|
* the timer _and_ zero the counter registers:
|
||||||
|
*/
|
||||||
|
if (v & APIC_LVT_TIMER_TSCDEADLINE)
|
||||||
|
wrmsrl(MSR_IA32_TSC_DEADLINE, 0);
|
||||||
|
else
|
||||||
|
apic_write(APIC_TMICT, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1374,7 +1374,8 @@ void amd_check_microcode(void)
|
||||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
|
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
on_each_cpu(zenbleed_check_cpu, NULL, 1);
|
if (cpu_feature_enabled(X86_FEATURE_ZEN2))
|
||||||
|
on_each_cpu(zenbleed_check_cpu, NULL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -193,7 +193,7 @@ static inline bool rdt_get_mb_table(struct rdt_resource *r)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool __get_mem_config_intel(struct rdt_resource *r)
|
static __init bool __get_mem_config_intel(struct rdt_resource *r)
|
||||||
{
|
{
|
||||||
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||||
union cpuid_0x10_3_eax eax;
|
union cpuid_0x10_3_eax eax;
|
||||||
|
@ -227,7 +227,7 @@ static bool __get_mem_config_intel(struct rdt_resource *r)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool __rdt_get_mem_config_amd(struct rdt_resource *r)
|
static __init bool __rdt_get_mem_config_amd(struct rdt_resource *r)
|
||||||
{
|
{
|
||||||
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
struct rdt_hw_resource *hw_res = resctrl_to_arch_res(r);
|
||||||
u32 eax, ebx, ecx, edx, subleaf;
|
u32 eax, ebx, ecx, edx, subleaf;
|
||||||
|
|
|
@ -796,8 +796,8 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
|
||||||
its_encode_valid(cmd, desc->its_vmapp_cmd.valid);
|
its_encode_valid(cmd, desc->its_vmapp_cmd.valid);
|
||||||
|
|
||||||
if (!desc->its_vmapp_cmd.valid) {
|
if (!desc->its_vmapp_cmd.valid) {
|
||||||
|
alloc = !atomic_dec_return(&desc->its_vmapp_cmd.vpe->vmapp_count);
|
||||||
if (is_v4_1(its)) {
|
if (is_v4_1(its)) {
|
||||||
alloc = !atomic_dec_return(&desc->its_vmapp_cmd.vpe->vmapp_count);
|
|
||||||
its_encode_alloc(cmd, alloc);
|
its_encode_alloc(cmd, alloc);
|
||||||
/*
|
/*
|
||||||
* Unmapping a VPE is self-synchronizing on GICv4.1,
|
* Unmapping a VPE is self-synchronizing on GICv4.1,
|
||||||
|
@ -816,13 +816,13 @@ static struct its_vpe *its_build_vmapp_cmd(struct its_node *its,
|
||||||
its_encode_vpt_addr(cmd, vpt_addr);
|
its_encode_vpt_addr(cmd, vpt_addr);
|
||||||
its_encode_vpt_size(cmd, LPI_NRBITS - 1);
|
its_encode_vpt_size(cmd, LPI_NRBITS - 1);
|
||||||
|
|
||||||
|
alloc = !atomic_fetch_inc(&desc->its_vmapp_cmd.vpe->vmapp_count);
|
||||||
|
|
||||||
if (!is_v4_1(its))
|
if (!is_v4_1(its))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
vconf_addr = virt_to_phys(page_address(desc->its_vmapp_cmd.vpe->its_vm->vprop_page));
|
vconf_addr = virt_to_phys(page_address(desc->its_vmapp_cmd.vpe->its_vm->vprop_page));
|
||||||
|
|
||||||
alloc = !atomic_fetch_inc(&desc->its_vmapp_cmd.vpe->vmapp_count);
|
|
||||||
|
|
||||||
its_encode_alloc(cmd, alloc);
|
its_encode_alloc(cmd, alloc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3816,6 +3816,13 @@ static int its_vpe_set_affinity(struct irq_data *d,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int from, cpu;
|
int from, cpu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if we're racing against a VPE being destroyed, for
|
||||||
|
* which we don't want to allow a VMOVP.
|
||||||
|
*/
|
||||||
|
if (!atomic_read(&vpe->vmapp_count))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changing affinity is mega expensive, so let's be as lazy as
|
* Changing affinity is mega expensive, so let's be as lazy as
|
||||||
* we can and only do it if we really have to. Also, if mapped
|
* we can and only do it if we really have to. Also, if mapped
|
||||||
|
@ -4456,9 +4463,8 @@ static int its_vpe_init(struct its_vpe *vpe)
|
||||||
raw_spin_lock_init(&vpe->vpe_lock);
|
raw_spin_lock_init(&vpe->vpe_lock);
|
||||||
vpe->vpe_id = vpe_id;
|
vpe->vpe_id = vpe_id;
|
||||||
vpe->vpt_page = vpt_page;
|
vpe->vpt_page = vpt_page;
|
||||||
if (gic_rdists->has_rvpeid)
|
atomic_set(&vpe->vmapp_count, 0);
|
||||||
atomic_set(&vpe->vmapp_count, 0);
|
if (!gic_rdists->has_rvpeid)
|
||||||
else
|
|
||||||
vpe->vpe_proxy_event = -1;
|
vpe->vpe_proxy_event = -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -120,16 +120,6 @@ static inline void plic_irq_toggle(const struct cpumask *mask,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void plic_irq_enable(struct irq_data *d)
|
|
||||||
{
|
|
||||||
plic_irq_toggle(irq_data_get_effective_affinity_mask(d), d, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void plic_irq_disable(struct irq_data *d)
|
|
||||||
{
|
|
||||||
plic_irq_toggle(irq_data_get_effective_affinity_mask(d), d, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void plic_irq_unmask(struct irq_data *d)
|
static void plic_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct plic_priv *priv = irq_data_get_irq_chip_data(d);
|
struct plic_priv *priv = irq_data_get_irq_chip_data(d);
|
||||||
|
@ -144,6 +134,17 @@ static void plic_irq_mask(struct irq_data *d)
|
||||||
writel(0, priv->regs + PRIORITY_BASE + d->hwirq * PRIORITY_PER_ID);
|
writel(0, priv->regs + PRIORITY_BASE + d->hwirq * PRIORITY_PER_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void plic_irq_enable(struct irq_data *d)
|
||||||
|
{
|
||||||
|
plic_irq_toggle(irq_data_get_effective_affinity_mask(d), d, 1);
|
||||||
|
plic_irq_unmask(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void plic_irq_disable(struct irq_data *d)
|
||||||
|
{
|
||||||
|
plic_irq_toggle(irq_data_get_effective_affinity_mask(d), d, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void plic_irq_eoi(struct irq_data *d)
|
static void plic_irq_eoi(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct plic_handler *handler = this_cpu_ptr(&plic_handlers);
|
struct plic_handler *handler = this_cpu_ptr(&plic_handlers);
|
||||||
|
|
|
@ -364,6 +364,7 @@ static int pci1xxxx_otp_eeprom_probe(struct auxiliary_device *aux_dev,
|
||||||
if (is_eeprom_responsive(priv)) {
|
if (is_eeprom_responsive(priv)) {
|
||||||
priv->nvmem_config_eeprom.type = NVMEM_TYPE_EEPROM;
|
priv->nvmem_config_eeprom.type = NVMEM_TYPE_EEPROM;
|
||||||
priv->nvmem_config_eeprom.name = EEPROM_NAME;
|
priv->nvmem_config_eeprom.name = EEPROM_NAME;
|
||||||
|
priv->nvmem_config_eeprom.id = NVMEM_DEVID_AUTO;
|
||||||
priv->nvmem_config_eeprom.dev = &aux_dev->dev;
|
priv->nvmem_config_eeprom.dev = &aux_dev->dev;
|
||||||
priv->nvmem_config_eeprom.owner = THIS_MODULE;
|
priv->nvmem_config_eeprom.owner = THIS_MODULE;
|
||||||
priv->nvmem_config_eeprom.reg_read = pci1xxxx_eeprom_read;
|
priv->nvmem_config_eeprom.reg_read = pci1xxxx_eeprom_read;
|
||||||
|
@ -383,6 +384,7 @@ static int pci1xxxx_otp_eeprom_probe(struct auxiliary_device *aux_dev,
|
||||||
|
|
||||||
priv->nvmem_config_otp.type = NVMEM_TYPE_OTP;
|
priv->nvmem_config_otp.type = NVMEM_TYPE_OTP;
|
||||||
priv->nvmem_config_otp.name = OTP_NAME;
|
priv->nvmem_config_otp.name = OTP_NAME;
|
||||||
|
priv->nvmem_config_otp.id = NVMEM_DEVID_AUTO;
|
||||||
priv->nvmem_config_otp.dev = &aux_dev->dev;
|
priv->nvmem_config_otp.dev = &aux_dev->dev;
|
||||||
priv->nvmem_config_otp.owner = THIS_MODULE;
|
priv->nvmem_config_otp.owner = THIS_MODULE;
|
||||||
priv->nvmem_config_otp.reg_read = pci1xxxx_otp_read;
|
priv->nvmem_config_otp.reg_read = pci1xxxx_otp_read;
|
||||||
|
|
|
@ -58,12 +58,12 @@ static int do_active_device(struct ctl_table *table, int write,
|
||||||
|
|
||||||
for (dev = port->devices; dev ; dev = dev->next) {
|
for (dev = port->devices; dev ; dev = dev->next) {
|
||||||
if(dev == port->cad) {
|
if(dev == port->cad) {
|
||||||
len += snprintf(buffer, sizeof(buffer), "%s\n", dev->name);
|
len += scnprintf(buffer, sizeof(buffer), "%s\n", dev->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!len) {
|
if(!len) {
|
||||||
len += snprintf(buffer, sizeof(buffer), "%s\n", "none");
|
len += scnprintf(buffer, sizeof(buffer), "%s\n", "none");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len > *lenp)
|
if (len > *lenp)
|
||||||
|
@ -94,19 +94,19 @@ static int do_autoprobe(struct ctl_table *table, int write,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((str = info->class_name) != NULL)
|
if ((str = info->class_name) != NULL)
|
||||||
len += snprintf (buffer + len, sizeof(buffer) - len, "CLASS:%s;\n", str);
|
len += scnprintf (buffer + len, sizeof(buffer) - len, "CLASS:%s;\n", str);
|
||||||
|
|
||||||
if ((str = info->model) != NULL)
|
if ((str = info->model) != NULL)
|
||||||
len += snprintf (buffer + len, sizeof(buffer) - len, "MODEL:%s;\n", str);
|
len += scnprintf (buffer + len, sizeof(buffer) - len, "MODEL:%s;\n", str);
|
||||||
|
|
||||||
if ((str = info->mfr) != NULL)
|
if ((str = info->mfr) != NULL)
|
||||||
len += snprintf (buffer + len, sizeof(buffer) - len, "MANUFACTURER:%s;\n", str);
|
len += scnprintf (buffer + len, sizeof(buffer) - len, "MANUFACTURER:%s;\n", str);
|
||||||
|
|
||||||
if ((str = info->description) != NULL)
|
if ((str = info->description) != NULL)
|
||||||
len += snprintf (buffer + len, sizeof(buffer) - len, "DESCRIPTION:%s;\n", str);
|
len += scnprintf (buffer + len, sizeof(buffer) - len, "DESCRIPTION:%s;\n", str);
|
||||||
|
|
||||||
if ((str = info->cmdset) != NULL)
|
if ((str = info->cmdset) != NULL)
|
||||||
len += snprintf (buffer + len, sizeof(buffer) - len, "COMMAND SET:%s;\n", str);
|
len += scnprintf (buffer + len, sizeof(buffer) - len, "COMMAND SET:%s;\n", str);
|
||||||
|
|
||||||
if (len > *lenp)
|
if (len > *lenp)
|
||||||
len = *lenp;
|
len = *lenp;
|
||||||
|
@ -135,7 +135,7 @@ static int do_hardware_base_addr(struct ctl_table *table, int write,
|
||||||
if (write) /* permissions prevent this anyway */
|
if (write) /* permissions prevent this anyway */
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
len += snprintf (buffer, sizeof(buffer), "%lu\t%lu\n", port->base, port->base_hi);
|
len += scnprintf (buffer, sizeof(buffer), "%lu\t%lu\n", port->base, port->base_hi);
|
||||||
|
|
||||||
if (len > *lenp)
|
if (len > *lenp)
|
||||||
len = *lenp;
|
len = *lenp;
|
||||||
|
@ -162,7 +162,7 @@ static int do_hardware_irq(struct ctl_table *table, int write,
|
||||||
if (write) /* permissions prevent this anyway */
|
if (write) /* permissions prevent this anyway */
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
len += snprintf (buffer, sizeof(buffer), "%d\n", port->irq);
|
len += scnprintf (buffer, sizeof(buffer), "%d\n", port->irq);
|
||||||
|
|
||||||
if (len > *lenp)
|
if (len > *lenp)
|
||||||
len = *lenp;
|
len = *lenp;
|
||||||
|
@ -189,7 +189,7 @@ static int do_hardware_dma(struct ctl_table *table, int write,
|
||||||
if (write) /* permissions prevent this anyway */
|
if (write) /* permissions prevent this anyway */
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
len += snprintf (buffer, sizeof(buffer), "%d\n", port->dma);
|
len += scnprintf (buffer, sizeof(buffer), "%d\n", port->dma);
|
||||||
|
|
||||||
if (len > *lenp)
|
if (len > *lenp)
|
||||||
len = *lenp;
|
len = *lenp;
|
||||||
|
@ -220,7 +220,7 @@ static int do_hardware_modes(struct ctl_table *table, int write,
|
||||||
#define printmode(x) \
|
#define printmode(x) \
|
||||||
do { \
|
do { \
|
||||||
if (port->modes & PARPORT_MODE_##x) \
|
if (port->modes & PARPORT_MODE_##x) \
|
||||||
len += snprintf(buffer + len, sizeof(buffer) - len, "%s%s", f++ ? "," : "", #x); \
|
len += scnprintf(buffer + len, sizeof(buffer) - len, "%s%s", f++ ? "," : "", #x); \
|
||||||
} while (0)
|
} while (0)
|
||||||
int f = 0;
|
int f = 0;
|
||||||
printmode(PCSPP);
|
printmode(PCSPP);
|
||||||
|
|
|
@ -474,6 +474,9 @@ static int apple_gpio_pinctrl_probe(struct platform_device *pdev)
|
||||||
for (i = 0; i < npins; i++) {
|
for (i = 0; i < npins; i++) {
|
||||||
pins[i].number = i;
|
pins[i].number = i;
|
||||||
pins[i].name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "PIN%u", i);
|
pins[i].name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "PIN%u", i);
|
||||||
|
if (!pins[i].name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
pins[i].drv_data = pctl;
|
pins[i].drv_data = pctl;
|
||||||
pin_names[i] = pins[i].name;
|
pin_names[i] = pins[i].name;
|
||||||
pin_nums[i] = i;
|
pin_nums[i] = i;
|
||||||
|
|
|
@ -1962,21 +1962,21 @@ static void ocelot_irq_handler(struct irq_desc *desc)
|
||||||
unsigned int reg = 0, irq, i;
|
unsigned int reg = 0, irq, i;
|
||||||
unsigned long irqs;
|
unsigned long irqs;
|
||||||
|
|
||||||
|
chained_irq_enter(parent_chip, desc);
|
||||||
|
|
||||||
for (i = 0; i < info->stride; i++) {
|
for (i = 0; i < info->stride; i++) {
|
||||||
regmap_read(info->map, id_reg + 4 * i, ®);
|
regmap_read(info->map, id_reg + 4 * i, ®);
|
||||||
if (!reg)
|
if (!reg)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
chained_irq_enter(parent_chip, desc);
|
|
||||||
|
|
||||||
irqs = reg;
|
irqs = reg;
|
||||||
|
|
||||||
for_each_set_bit(irq, &irqs,
|
for_each_set_bit(irq, &irqs,
|
||||||
min(32U, info->desc->npins - 32 * i))
|
min(32U, info->desc->npins - 32 * i))
|
||||||
generic_handle_domain_irq(chip->irq.domain, irq + 32 * i);
|
generic_handle_domain_irq(chip->irq.domain, irq + 32 * i);
|
||||||
|
|
||||||
chained_irq_exit(parent_chip, desc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chained_irq_exit(parent_chip, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ocelot_gpiochip_register(struct platform_device *pdev,
|
static int ocelot_gpiochip_register(struct platform_device *pdev,
|
||||||
|
|
|
@ -1387,10 +1387,15 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
|
||||||
|
|
||||||
for (i = 0; i < npins; i++) {
|
for (i = 0; i < npins; i++) {
|
||||||
stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i);
|
stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i);
|
||||||
if (stm32_pin && stm32_pin->pin.name)
|
if (stm32_pin && stm32_pin->pin.name) {
|
||||||
names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name);
|
names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name);
|
||||||
else
|
if (!names[i]) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto err_clk;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
names[i] = NULL;
|
names[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bank->gpio_chip.names = (const char * const *)names;
|
bank->gpio_chip.names = (const char * const *)names;
|
||||||
|
|
|
@ -3156,6 +3156,8 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc)
|
||||||
mutex_unlock(&gsm->mutex);
|
mutex_unlock(&gsm->mutex);
|
||||||
/* Now wipe the queues */
|
/* Now wipe the queues */
|
||||||
tty_ldisc_flush(gsm->tty);
|
tty_ldisc_flush(gsm->tty);
|
||||||
|
|
||||||
|
guard(spinlock_irqsave)(&gsm->tx_lock);
|
||||||
list_for_each_entry_safe(txq, ntxq, &gsm->tx_ctrl_list, list)
|
list_for_each_entry_safe(txq, ntxq, &gsm->tx_ctrl_list, list)
|
||||||
kfree(txq);
|
kfree(txq);
|
||||||
INIT_LIST_HEAD(&gsm->tx_ctrl_list);
|
INIT_LIST_HEAD(&gsm->tx_ctrl_list);
|
||||||
|
|
|
@ -771,6 +771,21 @@ static irqreturn_t __imx_uart_rtsint(int irq, void *dev_id)
|
||||||
|
|
||||||
imx_uart_writel(sport, USR1_RTSD, USR1);
|
imx_uart_writel(sport, USR1_RTSD, USR1);
|
||||||
usr1 = imx_uart_readl(sport, USR1) & USR1_RTSS;
|
usr1 = imx_uart_readl(sport, USR1) & USR1_RTSS;
|
||||||
|
/*
|
||||||
|
* Update sport->old_status here, so any follow-up calls to
|
||||||
|
* imx_uart_mctrl_check() will be able to recognize that RTS
|
||||||
|
* state changed since last imx_uart_mctrl_check() call.
|
||||||
|
*
|
||||||
|
* In case RTS has been detected as asserted here and later on
|
||||||
|
* deasserted by the time imx_uart_mctrl_check() was called,
|
||||||
|
* imx_uart_mctrl_check() can detect the RTS state change and
|
||||||
|
* trigger uart_handle_cts_change() to unblock the port for
|
||||||
|
* further TX transfers.
|
||||||
|
*/
|
||||||
|
if (usr1 & USR1_RTSS)
|
||||||
|
sport->old_status |= TIOCM_CTS;
|
||||||
|
else
|
||||||
|
sport->old_status &= ~TIOCM_CTS;
|
||||||
uart_handle_cts_change(&sport->port, usr1);
|
uart_handle_cts_change(&sport->port, usr1);
|
||||||
wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
|
wake_up_interruptible(&sport->port.state->port.delta_msr_wait);
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,8 @@ static const struct uart_ops qcom_geni_uart_pops;
|
||||||
static struct uart_driver qcom_geni_console_driver;
|
static struct uart_driver qcom_geni_console_driver;
|
||||||
static struct uart_driver qcom_geni_uart_driver;
|
static struct uart_driver qcom_geni_uart_driver;
|
||||||
|
|
||||||
|
static int qcom_geni_serial_port_setup(struct uart_port *uport);
|
||||||
|
|
||||||
static inline struct qcom_geni_serial_port *to_dev_port(struct uart_port *uport)
|
static inline struct qcom_geni_serial_port *to_dev_port(struct uart_port *uport)
|
||||||
{
|
{
|
||||||
return container_of(uport, struct qcom_geni_serial_port, uport);
|
return container_of(uport, struct qcom_geni_serial_port, uport);
|
||||||
|
@ -385,6 +387,23 @@ static void qcom_geni_serial_poll_put_char(struct uart_port *uport,
|
||||||
writel(M_TX_FIFO_WATERMARK_EN, uport->membase + SE_GENI_M_IRQ_CLEAR);
|
writel(M_TX_FIFO_WATERMARK_EN, uport->membase + SE_GENI_M_IRQ_CLEAR);
|
||||||
qcom_geni_serial_poll_tx_done(uport);
|
qcom_geni_serial_poll_tx_done(uport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int qcom_geni_serial_poll_init(struct uart_port *uport)
|
||||||
|
{
|
||||||
|
struct qcom_geni_serial_port *port = to_dev_port(uport);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!port->setup) {
|
||||||
|
ret = qcom_geni_serial_port_setup(uport);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qcom_geni_serial_secondary_active(uport))
|
||||||
|
geni_se_setup_s_cmd(&port->se, UART_START_READ, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
|
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
|
||||||
|
@ -756,17 +775,27 @@ static void qcom_geni_serial_start_rx_fifo(struct uart_port *uport)
|
||||||
static void qcom_geni_serial_stop_rx_dma(struct uart_port *uport)
|
static void qcom_geni_serial_stop_rx_dma(struct uart_port *uport)
|
||||||
{
|
{
|
||||||
struct qcom_geni_serial_port *port = to_dev_port(uport);
|
struct qcom_geni_serial_port *port = to_dev_port(uport);
|
||||||
|
bool done;
|
||||||
|
|
||||||
if (!qcom_geni_serial_secondary_active(uport))
|
if (!qcom_geni_serial_secondary_active(uport))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
geni_se_cancel_s_cmd(&port->se);
|
geni_se_cancel_s_cmd(&port->se);
|
||||||
qcom_geni_serial_poll_bit(uport, SE_GENI_S_IRQ_STATUS,
|
done = qcom_geni_serial_poll_bit(uport, SE_DMA_RX_IRQ_STAT,
|
||||||
S_CMD_CANCEL_EN, true);
|
RX_EOT, true);
|
||||||
|
if (done) {
|
||||||
if (qcom_geni_serial_secondary_active(uport))
|
writel(RX_EOT | RX_DMA_DONE,
|
||||||
|
uport->membase + SE_DMA_RX_IRQ_CLR);
|
||||||
|
} else {
|
||||||
qcom_geni_serial_abort_rx(uport);
|
qcom_geni_serial_abort_rx(uport);
|
||||||
|
|
||||||
|
writel(1, uport->membase + SE_DMA_RX_FSM_RST);
|
||||||
|
qcom_geni_serial_poll_bit(uport, SE_DMA_RX_IRQ_STAT,
|
||||||
|
RX_RESET_DONE, true);
|
||||||
|
writel(RX_RESET_DONE | RX_DMA_DONE,
|
||||||
|
uport->membase + SE_DMA_RX_IRQ_CLR);
|
||||||
|
}
|
||||||
|
|
||||||
if (port->rx_dma_addr) {
|
if (port->rx_dma_addr) {
|
||||||
geni_se_rx_dma_unprep(&port->se, port->rx_dma_addr,
|
geni_se_rx_dma_unprep(&port->se, port->rx_dma_addr,
|
||||||
DMA_RX_BUF_SIZE);
|
DMA_RX_BUF_SIZE);
|
||||||
|
@ -1115,7 +1144,6 @@ static int qcom_geni_serial_port_setup(struct uart_port *uport)
|
||||||
false, true, true);
|
false, true, true);
|
||||||
geni_se_init(&port->se, UART_RX_WM, port->rx_fifo_depth - 2);
|
geni_se_init(&port->se, UART_RX_WM, port->rx_fifo_depth - 2);
|
||||||
geni_se_select_mode(&port->se, port->dev_data->mode);
|
geni_se_select_mode(&port->se, port->dev_data->mode);
|
||||||
qcom_geni_serial_start_rx(uport);
|
|
||||||
port->setup = true;
|
port->setup = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1131,6 +1159,11 @@ static int qcom_geni_serial_startup(struct uart_port *uport)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uart_port_lock_irq(uport);
|
||||||
|
qcom_geni_serial_start_rx(uport);
|
||||||
|
uart_port_unlock_irq(uport);
|
||||||
|
|
||||||
enable_irq(uport->irq);
|
enable_irq(uport->irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1216,7 +1249,6 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
|
||||||
unsigned int avg_bw_core;
|
unsigned int avg_bw_core;
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
|
||||||
qcom_geni_serial_stop_rx(uport);
|
|
||||||
/* baud rate */
|
/* baud rate */
|
||||||
baud = uart_get_baud_rate(uport, termios, old, 300, 4000000);
|
baud = uart_get_baud_rate(uport, termios, old, 300, 4000000);
|
||||||
|
|
||||||
|
@ -1232,7 +1264,7 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
|
||||||
dev_err(port->se.dev,
|
dev_err(port->se.dev,
|
||||||
"Couldn't find suitable clock rate for %u\n",
|
"Couldn't find suitable clock rate for %u\n",
|
||||||
baud * sampling_rate);
|
baud * sampling_rate);
|
||||||
goto out_restart_rx;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n",
|
dev_dbg(port->se.dev, "desired_rate = %u, clk_rate = %lu, clk_div = %u\n",
|
||||||
|
@ -1323,8 +1355,6 @@ static void qcom_geni_serial_set_termios(struct uart_port *uport,
|
||||||
writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN);
|
writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN);
|
||||||
writel(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG);
|
writel(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG);
|
||||||
writel(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG);
|
writel(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG);
|
||||||
out_restart_rx:
|
|
||||||
qcom_geni_serial_start_rx(uport);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
|
#ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE
|
||||||
|
@ -1544,7 +1574,7 @@ static const struct uart_ops qcom_geni_console_pops = {
|
||||||
#ifdef CONFIG_CONSOLE_POLL
|
#ifdef CONFIG_CONSOLE_POLL
|
||||||
.poll_get_char = qcom_geni_serial_get_char,
|
.poll_get_char = qcom_geni_serial_get_char,
|
||||||
.poll_put_char = qcom_geni_serial_poll_put_char,
|
.poll_put_char = qcom_geni_serial_poll_put_char,
|
||||||
.poll_init = qcom_geni_serial_port_setup,
|
.poll_init = qcom_geni_serial_poll_init,
|
||||||
#endif
|
#endif
|
||||||
.pm = qcom_geni_serial_pm,
|
.pm = qcom_geni_serial_pm,
|
||||||
};
|
};
|
||||||
|
@ -1745,38 +1775,6 @@ static int qcom_geni_serial_sys_resume(struct device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qcom_geni_serial_sys_hib_resume(struct device *dev)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
struct uart_port *uport;
|
|
||||||
struct qcom_geni_private_data *private_data;
|
|
||||||
struct qcom_geni_serial_port *port = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
uport = &port->uport;
|
|
||||||
private_data = uport->private_data;
|
|
||||||
|
|
||||||
if (uart_console(uport)) {
|
|
||||||
geni_icc_set_tag(&port->se, QCOM_ICC_TAG_ALWAYS);
|
|
||||||
geni_icc_set_bw(&port->se);
|
|
||||||
ret = uart_resume_port(private_data->drv, uport);
|
|
||||||
/*
|
|
||||||
* For hibernation usecase clients for
|
|
||||||
* console UART won't call port setup during restore,
|
|
||||||
* hence call port setup for console uart.
|
|
||||||
*/
|
|
||||||
qcom_geni_serial_port_setup(uport);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Peripheral register settings are lost during hibernation.
|
|
||||||
* Update setup flag such that port setup happens again
|
|
||||||
* during next session. Clients of HS-UART will close and
|
|
||||||
* open the port during hibernation.
|
|
||||||
*/
|
|
||||||
port->setup = false;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct qcom_geni_device_data qcom_geni_console_data = {
|
static const struct qcom_geni_device_data qcom_geni_console_data = {
|
||||||
.console = true,
|
.console = true,
|
||||||
.mode = GENI_SE_FIFO,
|
.mode = GENI_SE_FIFO,
|
||||||
|
@ -1788,12 +1786,8 @@ static const struct qcom_geni_device_data qcom_geni_uart_data = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct dev_pm_ops qcom_geni_serial_pm_ops = {
|
static const struct dev_pm_ops qcom_geni_serial_pm_ops = {
|
||||||
.suspend = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
|
SYSTEM_SLEEP_PM_OPS(qcom_geni_serial_sys_suspend,
|
||||||
.resume = pm_sleep_ptr(qcom_geni_serial_sys_resume),
|
qcom_geni_serial_sys_resume)
|
||||||
.freeze = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
|
|
||||||
.poweroff = pm_sleep_ptr(qcom_geni_serial_sys_suspend),
|
|
||||||
.restore = pm_sleep_ptr(qcom_geni_serial_sys_hib_resume),
|
|
||||||
.thaw = pm_sleep_ptr(qcom_geni_serial_sys_hib_resume),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id qcom_geni_serial_match_table[] = {
|
static const struct of_device_id qcom_geni_serial_match_table[] = {
|
||||||
|
|
|
@ -4550,7 +4550,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (op->data) {
|
if (op->data) {
|
||||||
font.data = kvmalloc(max_font_size, GFP_KERNEL);
|
font.data = kvzalloc(max_font_size, GFP_KERNEL);
|
||||||
if (!font.data)
|
if (!font.data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -438,6 +438,10 @@ skip_status:
|
||||||
dwc3_gadget_ep_get_transfer_index(dep);
|
dwc3_gadget_ep_get_transfer_index(dep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_ENDTRANSFER &&
|
||||||
|
!(cmd & DWC3_DEPCMD_CMDIOC))
|
||||||
|
mdelay(1);
|
||||||
|
|
||||||
if (saved_config) {
|
if (saved_config) {
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
|
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
|
||||||
reg |= saved_config;
|
reg |= saved_config;
|
||||||
|
@ -1734,12 +1738,10 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool int
|
||||||
WARN_ON_ONCE(ret);
|
WARN_ON_ONCE(ret);
|
||||||
dep->resource_index = 0;
|
dep->resource_index = 0;
|
||||||
|
|
||||||
if (!interrupt) {
|
if (!interrupt)
|
||||||
mdelay(1);
|
|
||||||
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
|
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
|
||||||
} else if (!ret) {
|
else if (!ret)
|
||||||
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
|
||||||
}
|
|
||||||
|
|
||||||
dep->flags &= ~DWC3_EP_DELAY_STOP;
|
dep->flags &= ~DWC3_EP_DELAY_STOP;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1052,7 +1052,7 @@ static int xhci_invalidate_cancelled_tds(struct xhci_virt_ep *ep)
|
||||||
td_to_noop(xhci, ring, cached_td, false);
|
td_to_noop(xhci, ring, cached_td, false);
|
||||||
cached_td->cancel_status = TD_CLEARED;
|
cached_td->cancel_status = TD_CLEARED;
|
||||||
}
|
}
|
||||||
|
td_to_noop(xhci, ring, td, false);
|
||||||
td->cancel_status = TD_CLEARING_CACHE;
|
td->cancel_status = TD_CLEARING_CACHE;
|
||||||
cached_td = td;
|
cached_td = td;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2183,7 +2183,7 @@ static int tegra_xusb_enter_elpg(struct tegra_xusb *tegra, bool runtime)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < tegra->num_usb_phys; i++) {
|
for (i = 0; i < xhci->usb2_rhub.num_ports; i++) {
|
||||||
if (!xhci->usb2_rhub.ports[i])
|
if (!xhci->usb2_rhub.ports[i])
|
||||||
continue;
|
continue;
|
||||||
portsc = readl(xhci->usb2_rhub.ports[i]->addr);
|
portsc = readl(xhci->usb2_rhub.ports[i]->addr);
|
||||||
|
|
|
@ -1295,7 +1295,7 @@ enum xhci_setup_dev {
|
||||||
/* Set TR Dequeue Pointer command TRB fields, 6.4.3.9 */
|
/* Set TR Dequeue Pointer command TRB fields, 6.4.3.9 */
|
||||||
#define TRB_TO_STREAM_ID(p) ((((p) & (0xffff << 16)) >> 16))
|
#define TRB_TO_STREAM_ID(p) ((((p) & (0xffff << 16)) >> 16))
|
||||||
#define STREAM_ID_FOR_TRB(p) ((((p)) & 0xffff) << 16)
|
#define STREAM_ID_FOR_TRB(p) ((((p)) & 0xffff) << 16)
|
||||||
#define SCT_FOR_TRB(p) (((p) << 1) & 0x7)
|
#define SCT_FOR_TRB(p) (((p) & 0x7) << 1)
|
||||||
|
|
||||||
/* Link TRB specific fields */
|
/* Link TRB specific fields */
|
||||||
#define TRB_TC (1<<1)
|
#define TRB_TC (1<<1)
|
||||||
|
|
|
@ -279,6 +279,7 @@ static void option_instat_callback(struct urb *urb);
|
||||||
#define QUECTEL_PRODUCT_EG912Y 0x6001
|
#define QUECTEL_PRODUCT_EG912Y 0x6001
|
||||||
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
||||||
#define QUECTEL_PRODUCT_EC200A 0x6005
|
#define QUECTEL_PRODUCT_EC200A 0x6005
|
||||||
|
#define QUECTEL_PRODUCT_EG916Q 0x6007
|
||||||
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
||||||
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
||||||
#define QUECTEL_PRODUCT_EC200T 0x6026
|
#define QUECTEL_PRODUCT_EC200T 0x6026
|
||||||
|
@ -1270,6 +1271,7 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
|
||||||
|
|
||||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
||||||
|
@ -1380,10 +1382,16 @@ static const struct usb_device_id option_ids[] = {
|
||||||
.driver_info = NCTRL(0) | RSVD(1) },
|
.driver_info = NCTRL(0) | RSVD(1) },
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */
|
||||||
.driver_info = RSVD(0) | NCTRL(3) },
|
.driver_info = RSVD(0) | NCTRL(3) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a2, 0xff), /* Telit FN920C04 (MBIM) */
|
||||||
|
.driver_info = NCTRL(4) },
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */
|
||||||
.driver_info = RSVD(0) | NCTRL(3) },
|
.driver_info = RSVD(0) | NCTRL(3) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a7, 0xff), /* Telit FN920C04 (MBIM) */
|
||||||
|
.driver_info = NCTRL(4) },
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a9, 0xff), /* Telit FN20C04 (rmnet) */
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a9, 0xff), /* Telit FN20C04 (rmnet) */
|
||||||
.driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
|
.driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff), /* Telit FN920C04 (MBIM) */
|
||||||
|
.driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
|
||||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
||||||
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
||||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
||||||
|
|
|
@ -252,7 +252,6 @@ int qcom_pmic_typec_port_get_cc(struct pmic_typec_port *pmic_typec_port,
|
||||||
val = TYPEC_CC_RP_DEF;
|
val = TYPEC_CC_RP_DEF;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
val = TYPEC_CC_RP_DEF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (misc & CC_ORIENTATION)
|
if (misc & CC_ORIENTATION)
|
||||||
|
|
|
@ -331,6 +331,8 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
|
||||||
* returns the page in which the entry was found, and the entry itself
|
* returns the page in which the entry was found, and the entry itself
|
||||||
* (as a parameter - res_dir). Page is returned mapped and unlocked.
|
* (as a parameter - res_dir). Page is returned mapped and unlocked.
|
||||||
* Entry is guaranteed to be valid.
|
* Entry is guaranteed to be valid.
|
||||||
|
*
|
||||||
|
* On failure, returns an error pointer and the caller should ignore res_page.
|
||||||
*/
|
*/
|
||||||
struct nilfs_dir_entry *
|
struct nilfs_dir_entry *
|
||||||
nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
||||||
|
@ -358,22 +360,24 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
||||||
do {
|
do {
|
||||||
char *kaddr = nilfs_get_page(dir, n, &page);
|
char *kaddr = nilfs_get_page(dir, n, &page);
|
||||||
|
|
||||||
if (!IS_ERR(kaddr)) {
|
if (IS_ERR(kaddr))
|
||||||
de = (struct nilfs_dir_entry *)kaddr;
|
return ERR_CAST(kaddr);
|
||||||
kaddr += nilfs_last_byte(dir, n) - reclen;
|
|
||||||
while ((char *) de <= kaddr) {
|
de = (struct nilfs_dir_entry *)kaddr;
|
||||||
if (de->rec_len == 0) {
|
kaddr += nilfs_last_byte(dir, n) - reclen;
|
||||||
nilfs_error(dir->i_sb,
|
while ((char *)de <= kaddr) {
|
||||||
"zero-length directory entry");
|
if (de->rec_len == 0) {
|
||||||
nilfs_put_page(page);
|
nilfs_error(dir->i_sb,
|
||||||
goto out;
|
"zero-length directory entry");
|
||||||
}
|
nilfs_put_page(page);
|
||||||
if (nilfs_match(namelen, name, de))
|
goto out;
|
||||||
goto found;
|
|
||||||
de = nilfs_next_entry(de);
|
|
||||||
}
|
}
|
||||||
nilfs_put_page(page);
|
if (nilfs_match(namelen, name, de))
|
||||||
|
goto found;
|
||||||
|
de = nilfs_next_entry(de);
|
||||||
}
|
}
|
||||||
|
nilfs_put_page(page);
|
||||||
|
|
||||||
if (++n >= npages)
|
if (++n >= npages)
|
||||||
n = 0;
|
n = 0;
|
||||||
/* next page is past the blocks we've got */
|
/* next page is past the blocks we've got */
|
||||||
|
@ -386,7 +390,7 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
|
||||||
}
|
}
|
||||||
} while (n != start);
|
} while (n != start);
|
||||||
out:
|
out:
|
||||||
return NULL;
|
return ERR_PTR(-ENOENT);
|
||||||
|
|
||||||
found:
|
found:
|
||||||
*res_page = page;
|
*res_page = page;
|
||||||
|
@ -431,19 +435,19 @@ fail:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ino_t nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr)
|
int nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr, ino_t *ino)
|
||||||
{
|
{
|
||||||
ino_t res = 0;
|
|
||||||
struct nilfs_dir_entry *de;
|
struct nilfs_dir_entry *de;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
|
|
||||||
de = nilfs_find_entry(dir, qstr, &page);
|
de = nilfs_find_entry(dir, qstr, &page);
|
||||||
if (de) {
|
if (IS_ERR(de))
|
||||||
res = le64_to_cpu(de->inode);
|
return PTR_ERR(de);
|
||||||
kunmap(page);
|
|
||||||
put_page(page);
|
*ino = le64_to_cpu(de->inode);
|
||||||
}
|
kunmap(page);
|
||||||
return res;
|
put_page(page);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Releases the page */
|
/* Releases the page */
|
||||||
|
|
|
@ -55,12 +55,20 @@ nilfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
|
||||||
{
|
{
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
ino_t ino;
|
ino_t ino;
|
||||||
|
int res;
|
||||||
|
|
||||||
if (dentry->d_name.len > NILFS_NAME_LEN)
|
if (dentry->d_name.len > NILFS_NAME_LEN)
|
||||||
return ERR_PTR(-ENAMETOOLONG);
|
return ERR_PTR(-ENAMETOOLONG);
|
||||||
|
|
||||||
ino = nilfs_inode_by_name(dir, &dentry->d_name);
|
res = nilfs_inode_by_name(dir, &dentry->d_name, &ino);
|
||||||
inode = ino ? nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino) : NULL;
|
if (res) {
|
||||||
|
if (res != -ENOENT)
|
||||||
|
return ERR_PTR(res);
|
||||||
|
inode = NULL;
|
||||||
|
} else {
|
||||||
|
inode = nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino);
|
||||||
|
}
|
||||||
|
|
||||||
return d_splice_alias(inode, dentry);
|
return d_splice_alias(inode, dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,10 +271,11 @@ static int nilfs_do_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
struct page *page;
|
struct page *page;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = -ENOENT;
|
|
||||||
de = nilfs_find_entry(dir, &dentry->d_name, &page);
|
de = nilfs_find_entry(dir, &dentry->d_name, &page);
|
||||||
if (!de)
|
if (IS_ERR(de)) {
|
||||||
|
err = PTR_ERR(de);
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
inode = d_inode(dentry);
|
inode = d_inode(dentry);
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
|
@ -361,10 +370,11 @@ static int nilfs_rename(struct mnt_idmap *idmap,
|
||||||
if (unlikely(err))
|
if (unlikely(err))
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = -ENOENT;
|
|
||||||
old_de = nilfs_find_entry(old_dir, &old_dentry->d_name, &old_page);
|
old_de = nilfs_find_entry(old_dir, &old_dentry->d_name, &old_page);
|
||||||
if (!old_de)
|
if (IS_ERR(old_de)) {
|
||||||
|
err = PTR_ERR(old_de);
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (S_ISDIR(old_inode->i_mode)) {
|
if (S_ISDIR(old_inode->i_mode)) {
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
|
@ -381,10 +391,12 @@ static int nilfs_rename(struct mnt_idmap *idmap,
|
||||||
if (dir_de && !nilfs_empty_dir(new_inode))
|
if (dir_de && !nilfs_empty_dir(new_inode))
|
||||||
goto out_dir;
|
goto out_dir;
|
||||||
|
|
||||||
err = -ENOENT;
|
new_de = nilfs_find_entry(new_dir, &new_dentry->d_name,
|
||||||
new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page);
|
&new_page);
|
||||||
if (!new_de)
|
if (IS_ERR(new_de)) {
|
||||||
|
err = PTR_ERR(new_de);
|
||||||
goto out_dir;
|
goto out_dir;
|
||||||
|
}
|
||||||
nilfs_set_link(new_dir, new_de, new_page, old_inode);
|
nilfs_set_link(new_dir, new_de, new_page, old_inode);
|
||||||
nilfs_mark_inode_dirty(new_dir);
|
nilfs_mark_inode_dirty(new_dir);
|
||||||
inode_set_ctime_current(new_inode);
|
inode_set_ctime_current(new_inode);
|
||||||
|
@ -438,13 +450,14 @@ out:
|
||||||
*/
|
*/
|
||||||
static struct dentry *nilfs_get_parent(struct dentry *child)
|
static struct dentry *nilfs_get_parent(struct dentry *child)
|
||||||
{
|
{
|
||||||
unsigned long ino;
|
ino_t ino;
|
||||||
|
int res;
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct nilfs_root *root;
|
struct nilfs_root *root;
|
||||||
|
|
||||||
ino = nilfs_inode_by_name(d_inode(child), &dotdot_name);
|
res = nilfs_inode_by_name(d_inode(child), &dotdot_name, &ino);
|
||||||
if (!ino)
|
if (res)
|
||||||
return ERR_PTR(-ENOENT);
|
return ERR_PTR(res);
|
||||||
|
|
||||||
root = NILFS_I(d_inode(child))->i_root;
|
root = NILFS_I(d_inode(child))->i_root;
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,7 @@ static inline __u32 nilfs_mask_flags(umode_t mode, __u32 flags)
|
||||||
|
|
||||||
/* dir.c */
|
/* dir.c */
|
||||||
extern int nilfs_add_link(struct dentry *, struct inode *);
|
extern int nilfs_add_link(struct dentry *, struct inode *);
|
||||||
extern ino_t nilfs_inode_by_name(struct inode *, const struct qstr *);
|
int nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr, ino_t *ino);
|
||||||
extern int nilfs_make_empty(struct inode *, struct inode *);
|
extern int nilfs_make_empty(struct inode *, struct inode *);
|
||||||
extern struct nilfs_dir_entry *
|
extern struct nilfs_dir_entry *
|
||||||
nilfs_find_entry(struct inode *, const struct qstr *, struct page **);
|
nilfs_find_entry(struct inode *, const struct qstr *, struct page **);
|
||||||
|
|
|
@ -58,10 +58,12 @@ struct its_vpe {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool group;
|
bool group;
|
||||||
} sgi_config[16];
|
} sgi_config[16];
|
||||||
atomic_t vmapp_count;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Track the VPE being mapped */
|
||||||
|
atomic_t vmapp_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ensures mutual exclusion between affinity setting of the
|
* Ensures mutual exclusion between affinity setting of the
|
||||||
* vPE and vLPI operations using vpe->col_idx.
|
* vPE and vLPI operations using vpe->col_idx.
|
||||||
|
|
|
@ -2320,9 +2320,7 @@ static bool tcp_can_coalesce_send_queue_head(struct sock *sk, int len)
|
||||||
if (len <= skb->len)
|
if (len <= skb->len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (unlikely(TCP_SKB_CB(skb)->eor) ||
|
if (tcp_has_tx_tstamp(skb) || !tcp_skb_can_collapse(skb, next))
|
||||||
tcp_has_tx_tstamp(skb) ||
|
|
||||||
!skb_pure_zcopy_same(skb, next))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
len -= skb->len;
|
len -= skb->len;
|
||||||
|
|
|
@ -334,7 +334,7 @@ static void cxt_fixup_update_pinctl(struct hda_codec *codec,
|
||||||
* This is the value stored in the codec register after
|
* This is the value stored in the codec register after
|
||||||
* the correct initialization of the previous windows boot.
|
* the correct initialization of the previous windows boot.
|
||||||
*/
|
*/
|
||||||
snd_hda_set_pin_ctl(codec, 0x1d, AC_PINCTL_HP_EN);
|
snd_hda_set_pin_ctl_cache(codec, 0x1d, AC_PINCTL_HP_EN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ tmpfile=""
|
||||||
cout=""
|
cout=""
|
||||||
err=""
|
err=""
|
||||||
capout=""
|
capout=""
|
||||||
|
cappid=""
|
||||||
ns1=""
|
ns1=""
|
||||||
ns2=""
|
ns2=""
|
||||||
ksft_skip=4
|
ksft_skip=4
|
||||||
|
@ -30,11 +31,11 @@ iptables="iptables"
|
||||||
ip6tables="ip6tables"
|
ip6tables="ip6tables"
|
||||||
timeout_poll=30
|
timeout_poll=30
|
||||||
timeout_test=$((timeout_poll * 2 + 1))
|
timeout_test=$((timeout_poll * 2 + 1))
|
||||||
capture=0
|
capture=false
|
||||||
checksum=0
|
checksum=false
|
||||||
ip_mptcp=0
|
ip_mptcp=0
|
||||||
check_invert=0
|
check_invert=0
|
||||||
validate_checksum=0
|
validate_checksum=false
|
||||||
init=0
|
init=0
|
||||||
evts_ns1=""
|
evts_ns1=""
|
||||||
evts_ns2=""
|
evts_ns2=""
|
||||||
|
@ -99,7 +100,7 @@ init_partial()
|
||||||
ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
|
ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
|
||||||
ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
|
ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
|
||||||
ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
|
ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
|
||||||
if [ $checksum -eq 1 ]; then
|
if $checksum; then
|
||||||
ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
|
ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
@ -386,7 +387,7 @@ reset_with_checksum()
|
||||||
ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
|
ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
|
||||||
ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
|
ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
|
||||||
|
|
||||||
validate_checksum=1
|
validate_checksum=true
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_with_allow_join_id0()
|
reset_with_allow_join_id0()
|
||||||
|
@ -419,7 +420,7 @@ reset_with_allow_join_id0()
|
||||||
setup_fail_rules()
|
setup_fail_rules()
|
||||||
{
|
{
|
||||||
check_invert=1
|
check_invert=1
|
||||||
validate_checksum=1
|
validate_checksum=true
|
||||||
local i="$1"
|
local i="$1"
|
||||||
local ip="${2:-4}"
|
local ip="${2:-4}"
|
||||||
local tables
|
local tables
|
||||||
|
@ -1006,6 +1007,44 @@ pm_nl_set_endpoint()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cond_start_capture()
|
||||||
|
{
|
||||||
|
local ns="$1"
|
||||||
|
|
||||||
|
:> "$capout"
|
||||||
|
|
||||||
|
if $capture; then
|
||||||
|
local capuser capfile
|
||||||
|
if [ -z $SUDO_USER ]; then
|
||||||
|
capuser=""
|
||||||
|
else
|
||||||
|
capuser="-Z $SUDO_USER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "$ns")
|
||||||
|
|
||||||
|
echo "Capturing traffic for test $TEST_COUNT into $capfile"
|
||||||
|
ip netns exec "$ns" tcpdump -i any -s 65535 -B 32768 $capuser -w "$capfile" > "$capout" 2>&1 &
|
||||||
|
cappid=$!
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
cond_stop_capture()
|
||||||
|
{
|
||||||
|
if $capture; then
|
||||||
|
sleep 1
|
||||||
|
kill $cappid
|
||||||
|
cat "$capout"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_port()
|
||||||
|
{
|
||||||
|
echo "$((10000 + TEST_COUNT - 1))"
|
||||||
|
}
|
||||||
|
|
||||||
do_transfer()
|
do_transfer()
|
||||||
{
|
{
|
||||||
local listener_ns="$1"
|
local listener_ns="$1"
|
||||||
|
@ -1013,33 +1052,17 @@ do_transfer()
|
||||||
local cl_proto="$3"
|
local cl_proto="$3"
|
||||||
local srv_proto="$4"
|
local srv_proto="$4"
|
||||||
local connect_addr="$5"
|
local connect_addr="$5"
|
||||||
|
local port
|
||||||
|
|
||||||
local port=$((10000 + TEST_COUNT - 1))
|
|
||||||
local cappid
|
|
||||||
local FAILING_LINKS=${FAILING_LINKS:-""}
|
local FAILING_LINKS=${FAILING_LINKS:-""}
|
||||||
local fastclose=${fastclose:-""}
|
local fastclose=${fastclose:-""}
|
||||||
local speed=${speed:-"fast"}
|
local speed=${speed:-"fast"}
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
:> "$cout"
|
:> "$cout"
|
||||||
:> "$sout"
|
:> "$sout"
|
||||||
:> "$capout"
|
|
||||||
|
|
||||||
if [ $capture -eq 1 ]; then
|
cond_start_capture ${listener_ns}
|
||||||
local capuser
|
|
||||||
if [ -z $SUDO_USER ] ; then
|
|
||||||
capuser=""
|
|
||||||
else
|
|
||||||
capuser="-Z $SUDO_USER"
|
|
||||||
fi
|
|
||||||
|
|
||||||
capfile=$(printf "mp_join-%02u-%s.pcap" "$TEST_COUNT" "${listener_ns}")
|
|
||||||
|
|
||||||
echo "Capturing traffic for test $TEST_COUNT into $capfile"
|
|
||||||
ip netns exec ${listener_ns} tcpdump -i any -s 65535 -B 32768 $capuser -w $capfile > "$capout" 2>&1 &
|
|
||||||
cappid=$!
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
|
NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
|
||||||
nstat -n
|
nstat -n
|
||||||
|
@ -1125,10 +1148,7 @@ do_transfer()
|
||||||
wait $spid
|
wait $spid
|
||||||
local rets=$?
|
local rets=$?
|
||||||
|
|
||||||
if [ $capture -eq 1 ]; then
|
cond_stop_capture
|
||||||
sleep 1
|
|
||||||
kill $cappid
|
|
||||||
fi
|
|
||||||
|
|
||||||
NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
|
NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
|
||||||
nstat | grep Tcp > /tmp/${listener_ns}.out
|
nstat | grep Tcp > /tmp/${listener_ns}.out
|
||||||
|
@ -1144,7 +1164,6 @@ do_transfer()
|
||||||
ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
|
ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
|
||||||
cat /tmp/${connector_ns}.out
|
cat /tmp/${connector_ns}.out
|
||||||
|
|
||||||
cat "$capout"
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -1161,13 +1180,7 @@ do_transfer()
|
||||||
fi
|
fi
|
||||||
rets=$?
|
rets=$?
|
||||||
|
|
||||||
if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
|
[ $retc -eq 0 ] && [ $rets -eq 0 ]
|
||||||
cat "$capout"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat "$capout"
|
|
||||||
return 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
make_file()
|
make_file()
|
||||||
|
@ -1514,7 +1527,7 @@ chk_join_nr()
|
||||||
else
|
else
|
||||||
print_ok
|
print_ok
|
||||||
fi
|
fi
|
||||||
if [ $validate_checksum -eq 1 ]; then
|
if $validate_checksum; then
|
||||||
chk_csum_nr $csum_ns1 $csum_ns2
|
chk_csum_nr $csum_ns1 $csum_ns2
|
||||||
chk_fail_nr $fail_nr $fail_nr
|
chk_fail_nr $fail_nr $fail_nr
|
||||||
chk_rst_nr $rst_nr $rst_nr
|
chk_rst_nr $rst_nr $rst_nr
|
||||||
|
@ -2944,6 +2957,32 @@ verify_listener_events()
|
||||||
fail_test "$e_type:$type $e_family:$family $e_saddr:$saddr $e_sport:$sport"
|
fail_test "$e_type:$type $e_family:$family $e_saddr:$saddr $e_sport:$sport"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chk_mpc_endp_attempt()
|
||||||
|
{
|
||||||
|
local retl=$1
|
||||||
|
local attempts=$2
|
||||||
|
|
||||||
|
print_check "Connect"
|
||||||
|
|
||||||
|
if [ ${retl} = 124 ]; then
|
||||||
|
fail_test "timeout on connect"
|
||||||
|
elif [ ${retl} = 0 ]; then
|
||||||
|
fail_test "unexpected successful connect"
|
||||||
|
else
|
||||||
|
print_ok
|
||||||
|
|
||||||
|
print_check "Attempts"
|
||||||
|
count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPCapableEndpAttempt")
|
||||||
|
if [ -z "$count" ]; then
|
||||||
|
print_skip
|
||||||
|
elif [ "$count" != "$attempts" ]; then
|
||||||
|
fail_test "got ${count} MPC attempt[s] on port-based endpoint, expected ${attempts}"
|
||||||
|
else
|
||||||
|
print_ok
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
add_addr_ports_tests()
|
add_addr_ports_tests()
|
||||||
{
|
{
|
||||||
# signal address with port
|
# signal address with port
|
||||||
|
@ -3034,6 +3073,22 @@ add_addr_ports_tests()
|
||||||
chk_join_nr 2 2 2
|
chk_join_nr 2 2 2
|
||||||
chk_add_nr 2 2 2
|
chk_add_nr 2 2 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if reset "port-based signal endpoint must not accept mpc"; then
|
||||||
|
local port retl count
|
||||||
|
port=$(get_port)
|
||||||
|
|
||||||
|
cond_start_capture ${ns1}
|
||||||
|
pm_nl_add_endpoint ${ns1} 10.0.2.1 flags signal port ${port}
|
||||||
|
mptcp_lib_wait_local_port_listen ${ns1} ${port}
|
||||||
|
|
||||||
|
timeout 1 ip netns exec ${ns2} \
|
||||||
|
./mptcp_connect -t ${timeout_poll} -p $port -s MPTCP 10.0.2.1 >/dev/null 2>&1
|
||||||
|
retl=$?
|
||||||
|
cond_stop_capture
|
||||||
|
|
||||||
|
chk_mpc_endp_attempt ${retl} 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
syncookies_tests()
|
syncookies_tests()
|
||||||
|
@ -3960,10 +4015,10 @@ while getopts "${all_tests_args}cCih" opt; do
|
||||||
tests+=("${all_tests[${opt}]}")
|
tests+=("${all_tests[${opt}]}")
|
||||||
;;
|
;;
|
||||||
c)
|
c)
|
||||||
capture=1
|
capture=true
|
||||||
;;
|
;;
|
||||||
C)
|
C)
|
||||||
checksum=1
|
checksum=true
|
||||||
;;
|
;;
|
||||||
i)
|
i)
|
||||||
ip_mptcp=1
|
ip_mptcp=1
|
||||||
|
|
|
@ -8,17 +8,6 @@ readonly KSFT_SKIP=4
|
||||||
# shellcheck disable=SC2155 # declare and assign separately
|
# shellcheck disable=SC2155 # declare and assign separately
|
||||||
readonly KSFT_TEST="${MPTCP_LIB_KSFT_TEST:-$(basename "${0}" .sh)}"
|
readonly KSFT_TEST="${MPTCP_LIB_KSFT_TEST:-$(basename "${0}" .sh)}"
|
||||||
|
|
||||||
# These variables are used in some selftests, read-only
|
|
||||||
declare -rx MPTCP_LIB_EVENT_ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED
|
|
||||||
declare -rx MPTCP_LIB_EVENT_REMOVED=7 # MPTCP_EVENT_REMOVED
|
|
||||||
declare -rx MPTCP_LIB_EVENT_SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
|
|
||||||
declare -rx MPTCP_LIB_EVENT_SUB_CLOSED=11 # MPTCP_EVENT_SUB_CLOSED
|
|
||||||
declare -rx MPTCP_LIB_EVENT_LISTENER_CREATED=15 # MPTCP_EVENT_LISTENER_CREATED
|
|
||||||
declare -rx MPTCP_LIB_EVENT_LISTENER_CLOSED=16 # MPTCP_EVENT_LISTENER_CLOSED
|
|
||||||
|
|
||||||
declare -rx MPTCP_LIB_AF_INET=2
|
|
||||||
declare -rx MPTCP_LIB_AF_INET6=10
|
|
||||||
|
|
||||||
# These variables are used in some selftests, read-only
|
# These variables are used in some selftests, read-only
|
||||||
declare -rx MPTCP_LIB_EVENT_CREATED=1 # MPTCP_EVENT_CREATED
|
declare -rx MPTCP_LIB_EVENT_CREATED=1 # MPTCP_EVENT_CREATED
|
||||||
declare -rx MPTCP_LIB_EVENT_ESTABLISHED=2 # MPTCP_EVENT_ESTABLISHED
|
declare -rx MPTCP_LIB_EVENT_ESTABLISHED=2 # MPTCP_EVENT_ESTABLISHED
|
||||||
|
|
Loading…
Reference in New Issue
Block a user