This is the 4.19.109 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl5o5HYACgkQONu9yGCS aT4/tQ//Xsg40emvKL+hfz22PB5OccTYr4LFGIiVFq5kOGbwM7/oXkVwzD3tk948 0gGbad65hzi5pKnuQOhNgOtkIEtheub/lf0lUJPf+TM9xUj6Vi0/KjkODfJ01O1+ OiUy/ZoqL1NB1GQxXMUdtZwayQJkIdVq/taralbfxFwrJlffhjjBg2/I7N+C/SPw LrlYzbtIqS8wu/d4xPwsEGm4vnhqb0jLiJ42/kb3+Ts21/FhUge8+lkwTGq8JyH1 QeRtPUHEJxJ2hA6H2T9CJg4fiJYhD96tLZUKYz57A95z20uqVszvFWVGApz5uLi1 n1BUkYFAOmJ+H4hWcT1kiYMhxA7iMk1JTbEs9EJOwq1CFfEK2LRfY7Xze3XqCDOd eujecPlpqji+7wxTCd5XkOKAwjVdBLo7faZypQCUai8A6ca9D/rrxerglAa/VSsj KfTaTThIxKHg8bskDSBJqe9rPZg92u7LEVMj+EE05CcfNevBvKDwV6I4F7cKZV2X Y7w76OaYgm8e+H6w6ryvCN8d/T5tSGNly2wJ+rHBl5kc3GD9NPUXRUJKKePU55/3 SuD6q/8gnGp2upqC6FFNTdFMzAar8vIbvHYh9vMA8ISMfM5ShibE/V06PxaupmV6 RWCiAOiBnOu5wi/hDQ8wrlWOI2+H8fUWUldy2LIp78HAS4OWnUw= =VaEt -----END PGP SIGNATURE----- Merge 4.19.109 into android-4.19 Changes in 4.19.109 EDAC/amd64: Set grain per DIMM ALSA: hda/realtek - Fix a regression for mute led on Lenovo Carbon X1 net: dsa: bcm_sf2: Forcibly configure IMP port for 1Gb/sec RDMA/core: Fix pkey and port assignment in get_new_pps RDMA/core: Fix use of logical OR in get_new_pps kprobes: Fix optimize_kprobe()/unoptimize_kprobe() cancellation logic ALSA: hda: do not override bus codec_mask in link_get() serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE selftests: fix too long argument usb: gadget: composite: Support more than 500mA MaxPower usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags usb: gadget: serial: fix Tx stall after buffer overflow drm/msm/mdp5: rate limit pp done timeout warnings drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI scsi: megaraid_sas: silence a warning drm/msm/dsi: save pll state before dsi host is powered off drm/msm/dsi/pll: call vco set rate explicitly selftests: forwarding: use proto icmp for {gretap, ip6gretap}_mac testing net: dsa: b53: Ensure the default VID is untagged net: ks8851-ml: Remove 8-bit bus accessors net: ks8851-ml: Fix 16-bit data access net: ks8851-ml: Fix 16-bit IO operation watchdog: da9062: do not ping the hw during stop() s390/cio: cio_ignore_proc_seq_next should increase position index s390: make 'install' not depend on vmlinux x86/boot/compressed: Don't declare __force_order in kaslr_64.c s390/qdio: fill SL with absolute addresses nvme: Fix uninitialized-variable warning ice: Don't tell the OS that link is going down x86/xen: Distribute switch variables for initialization net: thunderx: workaround BGX TX Underflow issue ALSA: hda/realtek - Add Headset Mic supported ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master cifs: don't leak -EAGAIN for stat() during reconnect usb: storage: Add quirk for Samsung Fit flash usb: quirks: add NO_LPM quirk for Logitech Screen Share usb: dwc3: gadget: Update chain bit correctly when using sg list usb: core: hub: fix unhandled return by employing a void function usb: core: hub: do error out if usb_autopm_get_interface() fails usb: core: port: do error out if usb_autopm_get_interface() fails vgacon: Fix a UAF in vgacon_invert_region mm, numa: fix bad pmd by atomically check for pmd_trans_huge when marking page tables prot_numa mm: fix possible PMD dirty bit lost in set_pmd_migration_entry() fat: fix uninit-memory access for partial initialized inode arm: dts: dra76x: Fix mmc3 max-frequency tty:serial:mvebu-uart:fix a wrong return serial: 8250_exar: add support for ACCES cards vt: selection, close sel_buffer race vt: selection, push console lock down vt: selection, push sel_lock up media: v4l2-mem2mem.c: fix broken links x86/pkeys: Manually set X86_FEATURE_OSPKE to preserve existing changes dmaengine: tegra-apb: Fix use-after-free dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list dm cache: fix a crash due to incorrect work item cancelling dm: report suspended device during destroy dm writecache: verify watermark during resume ARM: dts: ls1021a: Restore MDIO compatible to gianfar spi: bcm63xx-hsspi: Really keep pll clk enabled ASoC: topology: Fix memleak in soc_tplg_link_elems_load() ASoC: topology: Fix memleak in soc_tplg_manifest_load() ASoC: intel: skl: Fix pin debug prints ASoC: intel: skl: Fix possible buffer overflow in debug outputs dmaengine: imx-sdma: remove dma_slave_config direction usage and leave sdma_event_enable() ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output ASoC: pcm512x: Fix unbalanced regulator enable call in probe error path ASoC: dapm: Correct DAPM handling of active widgets during shutdown drm/sun4i: Fix DE2 VI layer format support drm/sun4i: de2/de3: Remove unsupported VI layer formats phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling phy: mapphone-mdm6600: Fix write timeouts with shorter GPIO toggle interval ARM: dts: imx6: phycore-som: fix emmc supply RDMA/iwcm: Fix iwcm work deallocation RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen() IB/hfi1, qib: Ensure RCU is locked when accessing list ARM: imx: build v7_cpu_resume() unconditionally ARM: dts: am437x-idk-evm: Fix incorrect OPP node names ARM: dts: imx7-colibri: Fix frequency for sd/mmc hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT() dmaengine: coh901318: Fix a double lock bug in dma_tc_handle() powerpc: fix hardware PMU exception bug on PowerVM compatibility mode systems efi/x86: Align GUIDs to their size in the mixed mode runtime wrapper efi/x86: Handle by-ref arguments covering multiple pages in mixed mode dm integrity: fix a deadlock due to offloading to an incorrect workqueue scsi: pm80xx: Fixed kernel panic during error recovery for SATA drive Linux 4.19.109 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Iae5cc72b8c7c96b0a15c76657b9c3bcc4341a7aa
This commit is contained in:
commit
ca0a95ff50
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 108
|
||||
SUBLEVEL = 109
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
@ -525,11 +525,11 @@
|
||||
* Supply voltage supervisor on board will not allow opp50 so
|
||||
* disable it and set opp100 as suspend OPP.
|
||||
*/
|
||||
opp50@300000000 {
|
||||
opp50-300000000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
opp100@600000000 {
|
||||
opp100-600000000 {
|
||||
opp-suspend;
|
||||
};
|
||||
};
|
||||
|
@ -81,3 +81,8 @@
|
||||
reg = <0x3fc>;
|
||||
};
|
||||
};
|
||||
|
||||
&mmc3 {
|
||||
/* dra76x is not affected by i887 */
|
||||
max-frequency = <96000000>;
|
||||
};
|
||||
|
@ -183,7 +183,6 @@
|
||||
pinctrl-0 = <&pinctrl_usdhc4>;
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
vmmc-supply = <&vdd_emmc_1p8>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -319,7 +319,6 @@
|
||||
assigned-clock-rates = <400000000>;
|
||||
bus-width = <8>;
|
||||
fsl,tuning-step = <2>;
|
||||
max-frequency = <100000000>;
|
||||
vmmc-supply = <®_module_3v3>;
|
||||
vqmmc-supply = <®_DCDC3>;
|
||||
non-removable;
|
||||
|
@ -584,7 +584,7 @@
|
||||
};
|
||||
|
||||
mdio0: mdio@2d24000 {
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
compatible = "gianfar";
|
||||
device_type = "mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@ -593,7 +593,7 @@
|
||||
};
|
||||
|
||||
mdio1: mdio@2d64000 {
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
compatible = "gianfar";
|
||||
device_type = "mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -89,6 +89,8 @@ AFLAGS_suspend-imx6.o :=-Wa,-march=armv7-a
|
||||
obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o
|
||||
obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o
|
||||
endif
|
||||
AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a
|
||||
obj-$(CONFIG_SOC_IMX6) += resume-imx6.o
|
||||
obj-$(CONFIG_SOC_IMX6) += pm-imx6.o
|
||||
|
||||
obj-$(CONFIG_SOC_IMX1) += mach-imx1.o
|
||||
|
@ -103,17 +103,17 @@ void imx_cpu_die(unsigned int cpu);
|
||||
int imx_cpu_kill(unsigned int cpu);
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
void v7_cpu_resume(void);
|
||||
void imx53_suspend(void __iomem *ocram_vbase);
|
||||
extern const u32 imx53_suspend_sz;
|
||||
void imx6_suspend(void __iomem *ocram_vbase);
|
||||
#else
|
||||
static inline void v7_cpu_resume(void) {}
|
||||
static inline void imx53_suspend(void __iomem *ocram_vbase) {}
|
||||
static const u32 imx53_suspend_sz;
|
||||
static inline void imx6_suspend(void __iomem *ocram_vbase) {}
|
||||
#endif
|
||||
|
||||
void v7_cpu_resume(void);
|
||||
|
||||
void imx6_pm_ccm_init(const char *ccm_compat);
|
||||
void imx6q_pm_init(void);
|
||||
void imx6dl_pm_init(void);
|
||||
|
24
arch/arm/mach-imx/resume-imx6.S
Normal file
24
arch/arm/mach-imx/resume-imx6.S
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include "hardware.h"
|
||||
|
||||
/*
|
||||
* The following code must assume it is running from physical address
|
||||
* where absolute virtual addresses to the data section have to be
|
||||
* turned into relative ones.
|
||||
*/
|
||||
|
||||
ENTRY(v7_cpu_resume)
|
||||
bl v7_invalidate_l1
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
bl l2c310_early_resume
|
||||
#endif
|
||||
b cpu_resume
|
||||
ENDPROC(v7_cpu_resume)
|
@ -333,17 +333,3 @@ resume:
|
||||
|
||||
ret lr
|
||||
ENDPROC(imx6_suspend)
|
||||
|
||||
/*
|
||||
* The following code must assume it is running from physical address
|
||||
* where absolute virtual addresses to the data section have to be
|
||||
* turned into relative ones.
|
||||
*/
|
||||
|
||||
ENTRY(v7_cpu_resume)
|
||||
bl v7_invalidate_l1
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
bl l2c310_early_resume
|
||||
#endif
|
||||
b cpu_resume
|
||||
ENDPROC(v7_cpu_resume)
|
||||
|
@ -2188,11 +2188,13 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
|
||||
* oprofile_cpu_type already has a value, then we are
|
||||
* possibly overriding a real PVR with a logical one,
|
||||
* and, in that case, keep the current value for
|
||||
* oprofile_cpu_type.
|
||||
* oprofile_cpu_type. Futhermore, let's ensure that the
|
||||
* fix for the PMAO bug is enabled on compatibility mode.
|
||||
*/
|
||||
if (old.oprofile_cpu_type != NULL) {
|
||||
t->oprofile_cpu_type = old.oprofile_cpu_type;
|
||||
t->oprofile_type = old.oprofile_type;
|
||||
t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,7 +140,7 @@ all: bzImage
|
||||
#KBUILD_IMAGE is necessary for packaging targets like rpm-pkg, deb-pkg...
|
||||
KBUILD_IMAGE := $(boot)/bzImage
|
||||
|
||||
install: vmlinux
|
||||
install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
bzImage: vmlinux
|
||||
|
@ -46,7 +46,7 @@ quiet_cmd_ar = AR $@
|
||||
$(obj)/startup.a: $(OBJECTS) FORCE
|
||||
$(call if_changed,ar)
|
||||
|
||||
install: $(CONFIGURE) $(obj)/bzImage
|
||||
install:
|
||||
sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
|
||||
System.map "$(INSTALL_PATH)"
|
||||
|
||||
|
@ -228,7 +228,7 @@ struct qdio_buffer {
|
||||
* @sbal: absolute SBAL address
|
||||
*/
|
||||
struct sl_element {
|
||||
unsigned long sbal;
|
||||
u64 sbal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
|
@ -29,9 +29,6 @@
|
||||
#define __PAGE_OFFSET __PAGE_OFFSET_BASE
|
||||
#include "../../mm/ident_map.c"
|
||||
|
||||
/* Used by pgtable.h asm code to force instruction serialization. */
|
||||
unsigned long __force_order;
|
||||
|
||||
/* Used to track our page table allocation area. */
|
||||
struct alloc_pgt_data {
|
||||
unsigned char *pgt_buf;
|
||||
|
@ -387,7 +387,7 @@ static __always_inline void setup_pku(struct cpuinfo_x86 *c)
|
||||
* cpuid bit to be set. We need to ensure that we
|
||||
* update that bit in this CPU's "cpu_info".
|
||||
*/
|
||||
get_cpu_cap(c);
|
||||
set_cpu_cap(c, X86_FEATURE_OSPKE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
|
||||
|
@ -313,7 +313,7 @@ void efi_sync_low_kernel_mappings(void)
|
||||
static inline phys_addr_t
|
||||
virt_to_phys_or_null_size(void *va, unsigned long size)
|
||||
{
|
||||
bool bad_size;
|
||||
phys_addr_t pa;
|
||||
|
||||
if (!va)
|
||||
return 0;
|
||||
@ -321,16 +321,13 @@ virt_to_phys_or_null_size(void *va, unsigned long size)
|
||||
if (virt_addr_valid(va))
|
||||
return virt_to_phys(va);
|
||||
|
||||
/*
|
||||
* A fully aligned variable on the stack is guaranteed not to
|
||||
* cross a page bounary. Try to catch strings on the stack by
|
||||
* checking that 'size' is a power of two.
|
||||
*/
|
||||
bad_size = size > PAGE_SIZE || !is_power_of_2(size);
|
||||
pa = slow_virt_to_phys(va);
|
||||
|
||||
WARN_ON(!IS_ALIGNED((unsigned long)va, size) || bad_size);
|
||||
/* check if the object crosses a page boundary */
|
||||
if (WARN_ON((pa ^ (pa + size - 1)) & PAGE_MASK))
|
||||
return 0;
|
||||
|
||||
return slow_virt_to_phys(va);
|
||||
return pa;
|
||||
}
|
||||
|
||||
#define virt_to_phys_or_null(addr) \
|
||||
@ -790,6 +787,8 @@ static efi_status_t
|
||||
efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 *attr, unsigned long *data_size, void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
efi_status_t status;
|
||||
u32 phys_name, phys_vendor, phys_attr;
|
||||
u32 phys_data_size, phys_data;
|
||||
@ -797,14 +796,19 @@ efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_data_size = virt_to_phys_or_null(data_size);
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_attr = virt_to_phys_or_null(attr);
|
||||
phys_data = virt_to_phys_or_null_size(data, *data_size);
|
||||
|
||||
status = efi_thunk(get_variable, phys_name, phys_vendor,
|
||||
phys_attr, phys_data_size, phys_data);
|
||||
if (!phys_name || (data && !phys_data))
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(get_variable, phys_name, phys_vendor,
|
||||
phys_attr, phys_data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -815,19 +819,25 @@ static efi_status_t
|
||||
efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size, void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
u32 phys_name, phys_vendor, phys_data;
|
||||
efi_status_t status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_data = virt_to_phys_or_null_size(data, data_size);
|
||||
|
||||
/* If data_size is > sizeof(u32) we've got problems */
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
if (!phys_name || !phys_data)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -839,6 +849,8 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size,
|
||||
void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
u32 phys_name, phys_vendor, phys_data;
|
||||
efi_status_t status;
|
||||
unsigned long flags;
|
||||
@ -846,13 +858,17 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
|
||||
return EFI_NOT_READY;
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_data = virt_to_phys_or_null_size(data, data_size);
|
||||
|
||||
/* If data_size is > sizeof(u32) we've got problems */
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
if (!phys_name || !phys_data)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -864,21 +880,29 @@ efi_thunk_get_next_variable(unsigned long *name_size,
|
||||
efi_char16_t *name,
|
||||
efi_guid_t *vendor)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
efi_status_t status;
|
||||
u32 phys_name_size, phys_name, phys_vendor;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name_size = virt_to_phys_or_null(name_size);
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_name = virt_to_phys_or_null_size(name, *name_size);
|
||||
|
||||
status = efi_thunk(get_next_variable, phys_name_size,
|
||||
phys_name, phys_vendor);
|
||||
if (!phys_name)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(get_next_variable, phys_name_size,
|
||||
phys_name, phys_vendor);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
*vendor = *vnd;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -908,14 +908,15 @@ static u64 xen_read_msr_safe(unsigned int msr, int *err)
|
||||
static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
|
||||
{
|
||||
int ret;
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned int which;
|
||||
u64 base;
|
||||
#endif
|
||||
|
||||
ret = 0;
|
||||
|
||||
switch (msr) {
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned which;
|
||||
u64 base;
|
||||
|
||||
case MSR_FS_BASE: which = SEGBASE_FS; goto set;
|
||||
case MSR_KERNEL_GS_BASE: which = SEGBASE_GS_USER; goto set;
|
||||
case MSR_GS_BASE: which = SEGBASE_GS_KERNEL; goto set;
|
||||
|
@ -1944,8 +1944,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&cohc->lock);
|
||||
|
||||
/*
|
||||
* When we reach this point, at least one queue item
|
||||
* should have been moved over from cohc->queue to
|
||||
@ -1966,8 +1964,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)
|
||||
if (coh901318_queue_start(cohc) == NULL)
|
||||
cohc->busy = 0;
|
||||
|
||||
spin_unlock(&cohc->lock);
|
||||
|
||||
/*
|
||||
* This tasklet will remove items from cohc->active
|
||||
* and thus terminates them.
|
||||
|
@ -335,6 +335,7 @@ struct sdma_desc {
|
||||
* @sdma: pointer to the SDMA engine for this channel
|
||||
* @channel: the channel number, matches dmaengine chan_id + 1
|
||||
* @direction: transfer type. Needed for setting SDMA script
|
||||
* @slave_config Slave configuration
|
||||
* @peripheral_type: Peripheral type. Needed for setting SDMA script
|
||||
* @event_id0: aka dma request line
|
||||
* @event_id1: for channels that use 2 events
|
||||
@ -362,6 +363,7 @@ struct sdma_channel {
|
||||
struct sdma_engine *sdma;
|
||||
unsigned int channel;
|
||||
enum dma_transfer_direction direction;
|
||||
struct dma_slave_config slave_config;
|
||||
enum sdma_peripheral_type peripheral_type;
|
||||
unsigned int event_id0;
|
||||
unsigned int event_id1;
|
||||
@ -440,6 +442,10 @@ struct sdma_engine {
|
||||
struct sdma_buffer_descriptor *bd0;
|
||||
};
|
||||
|
||||
static int sdma_config_write(struct dma_chan *chan,
|
||||
struct dma_slave_config *dmaengine_cfg,
|
||||
enum dma_transfer_direction direction);
|
||||
|
||||
static struct sdma_driver_data sdma_imx31 = {
|
||||
.chnenbl0 = SDMA_CHNENBL0_IMX31,
|
||||
.num_events = 32,
|
||||
@ -1122,18 +1128,6 @@ static int sdma_config_channel(struct dma_chan *chan)
|
||||
sdmac->shp_addr = 0;
|
||||
sdmac->per_addr = 0;
|
||||
|
||||
if (sdmac->event_id0) {
|
||||
if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events)
|
||||
return -EINVAL;
|
||||
sdma_event_enable(sdmac, sdmac->event_id0);
|
||||
}
|
||||
|
||||
if (sdmac->event_id1) {
|
||||
if (sdmac->event_id1 >= sdmac->sdma->drvdata->num_events)
|
||||
return -EINVAL;
|
||||
sdma_event_enable(sdmac, sdmac->event_id1);
|
||||
}
|
||||
|
||||
switch (sdmac->peripheral_type) {
|
||||
case IMX_DMATYPE_DSP:
|
||||
sdma_config_ownership(sdmac, false, true, true);
|
||||
@ -1431,6 +1425,8 @@ static struct dma_async_tx_descriptor *sdma_prep_slave_sg(
|
||||
struct scatterlist *sg;
|
||||
struct sdma_desc *desc;
|
||||
|
||||
sdma_config_write(chan, &sdmac->slave_config, direction);
|
||||
|
||||
desc = sdma_transfer_init(sdmac, direction, sg_len);
|
||||
if (!desc)
|
||||
goto err_out;
|
||||
@ -1515,6 +1511,8 @@ static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(
|
||||
|
||||
dev_dbg(sdma->dev, "%s channel: %d\n", __func__, channel);
|
||||
|
||||
sdma_config_write(chan, &sdmac->slave_config, direction);
|
||||
|
||||
desc = sdma_transfer_init(sdmac, direction, num_periods);
|
||||
if (!desc)
|
||||
goto err_out;
|
||||
@ -1570,17 +1568,18 @@ err_out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int sdma_config(struct dma_chan *chan,
|
||||
struct dma_slave_config *dmaengine_cfg)
|
||||
static int sdma_config_write(struct dma_chan *chan,
|
||||
struct dma_slave_config *dmaengine_cfg,
|
||||
enum dma_transfer_direction direction)
|
||||
{
|
||||
struct sdma_channel *sdmac = to_sdma_chan(chan);
|
||||
|
||||
if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) {
|
||||
if (direction == DMA_DEV_TO_MEM) {
|
||||
sdmac->per_address = dmaengine_cfg->src_addr;
|
||||
sdmac->watermark_level = dmaengine_cfg->src_maxburst *
|
||||
dmaengine_cfg->src_addr_width;
|
||||
sdmac->word_size = dmaengine_cfg->src_addr_width;
|
||||
} else if (dmaengine_cfg->direction == DMA_DEV_TO_DEV) {
|
||||
} else if (direction == DMA_DEV_TO_DEV) {
|
||||
sdmac->per_address2 = dmaengine_cfg->src_addr;
|
||||
sdmac->per_address = dmaengine_cfg->dst_addr;
|
||||
sdmac->watermark_level = dmaengine_cfg->src_maxburst &
|
||||
@ -1594,10 +1593,33 @@ static int sdma_config(struct dma_chan *chan,
|
||||
dmaengine_cfg->dst_addr_width;
|
||||
sdmac->word_size = dmaengine_cfg->dst_addr_width;
|
||||
}
|
||||
sdmac->direction = dmaengine_cfg->direction;
|
||||
sdmac->direction = direction;
|
||||
return sdma_config_channel(chan);
|
||||
}
|
||||
|
||||
static int sdma_config(struct dma_chan *chan,
|
||||
struct dma_slave_config *dmaengine_cfg)
|
||||
{
|
||||
struct sdma_channel *sdmac = to_sdma_chan(chan);
|
||||
|
||||
memcpy(&sdmac->slave_config, dmaengine_cfg, sizeof(*dmaengine_cfg));
|
||||
|
||||
/* Set ENBLn earlier to make sure dma request triggered after that */
|
||||
if (sdmac->event_id0) {
|
||||
if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events)
|
||||
return -EINVAL;
|
||||
sdma_event_enable(sdmac, sdmac->event_id0);
|
||||
}
|
||||
|
||||
if (sdmac->event_id1) {
|
||||
if (sdmac->event_id1 >= sdmac->sdma->drvdata->num_events)
|
||||
return -EINVAL;
|
||||
sdma_event_enable(sdmac, sdmac->event_id1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum dma_status sdma_tx_status(struct dma_chan *chan,
|
||||
dma_cookie_t cookie,
|
||||
struct dma_tx_state *txstate)
|
||||
|
@ -288,7 +288,7 @@ static struct tegra_dma_desc *tegra_dma_desc_get(
|
||||
|
||||
/* Do not allocate if desc are waiting for ack */
|
||||
list_for_each_entry(dma_desc, &tdc->free_dma_desc, node) {
|
||||
if (async_tx_test_ack(&dma_desc->txd)) {
|
||||
if (async_tx_test_ack(&dma_desc->txd) && !dma_desc->cb_count) {
|
||||
list_del(&dma_desc->node);
|
||||
spin_unlock_irqrestore(&tdc->lock, flags);
|
||||
dma_desc->txd.flags = 0;
|
||||
@ -756,10 +756,6 @@ static int tegra_dma_terminate_all(struct dma_chan *dc)
|
||||
bool was_busy;
|
||||
|
||||
spin_lock_irqsave(&tdc->lock, flags);
|
||||
if (list_empty(&tdc->pending_sg_req)) {
|
||||
spin_unlock_irqrestore(&tdc->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!tdc->busy)
|
||||
goto skip_dma_stop;
|
||||
|
@ -2863,6 +2863,7 @@ static int init_csrows(struct mem_ctl_info *mci)
|
||||
dimm = csrow->channels[j]->dimm;
|
||||
dimm->mtype = pvt->dram_type;
|
||||
dimm->edac_mode = edac_mode;
|
||||
dimm->grain = 64;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1118,8 +1118,8 @@ static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc)
|
||||
ret = wait_for_completion_timeout(&mdp5_crtc->pp_completion,
|
||||
msecs_to_jiffies(50));
|
||||
if (ret == 0)
|
||||
dev_warn(dev->dev, "pp done time out, lm=%d\n",
|
||||
mdp5_cstate->pipeline.mixer->lm);
|
||||
dev_warn_ratelimited(dev->dev, "pp done time out, lm=%d\n",
|
||||
mdp5_cstate->pipeline.mixer->lm);
|
||||
}
|
||||
|
||||
static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc)
|
||||
|
@ -328,7 +328,7 @@ static int dsi_mgr_connector_get_modes(struct drm_connector *connector)
|
||||
return num;
|
||||
}
|
||||
|
||||
static int dsi_mgr_connector_mode_valid(struct drm_connector *connector,
|
||||
static enum drm_mode_status dsi_mgr_connector_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
int id = dsi_mgr_connector_get_id(connector);
|
||||
@ -471,6 +471,7 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
|
||||
struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1);
|
||||
struct mipi_dsi_host *host = msm_dsi->host;
|
||||
struct drm_panel *panel = msm_dsi->panel;
|
||||
struct msm_dsi_pll *src_pll;
|
||||
bool is_dual_dsi = IS_DUAL_DSI();
|
||||
int ret;
|
||||
|
||||
@ -511,6 +512,10 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
|
||||
id, ret);
|
||||
}
|
||||
|
||||
/* Save PLL status if it is a clock source */
|
||||
src_pll = msm_dsi_phy_get_pll(msm_dsi->phy);
|
||||
msm_dsi_pll_save_state(src_pll);
|
||||
|
||||
ret = msm_dsi_host_power_off(host);
|
||||
if (ret)
|
||||
pr_err("%s: host %d power off failed,%d\n", __func__, id, ret);
|
||||
|
@ -726,10 +726,6 @@ void msm_dsi_phy_disable(struct msm_dsi_phy *phy)
|
||||
if (!phy || !phy->cfg->ops.disable)
|
||||
return;
|
||||
|
||||
/* Save PLL status if it is a clock source */
|
||||
if (phy->usecase != MSM_DSI_PHY_SLAVE)
|
||||
msm_dsi_pll_save_state(phy->pll);
|
||||
|
||||
phy->cfg->ops.disable(phy);
|
||||
|
||||
dsi_phy_regulator_disable(phy);
|
||||
|
@ -406,6 +406,12 @@ static int dsi_pll_10nm_vco_prepare(struct clk_hw *hw)
|
||||
if (pll_10nm->slave)
|
||||
dsi_pll_enable_pll_bias(pll_10nm->slave);
|
||||
|
||||
rc = dsi_pll_10nm_vco_set_rate(hw,pll_10nm->vco_current_rate, 0);
|
||||
if (rc) {
|
||||
pr_err("vco_set_rate failed, rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Start PLL */
|
||||
pll_write(pll_10nm->phy_cmn_mmio + REG_DSI_10nm_PHY_CMN_PLL_CNTRL,
|
||||
0x01);
|
||||
|
@ -110,48 +110,104 @@ static const struct de2_fmt_info de2_formats[] = {
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_XRGB4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ARGB4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_ABGR4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ABGR4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_XBGR4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ABGR4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_RGBA4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGBA4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_RGBX4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGBA4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_BGRA4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_BGRA4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_BGRX4444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_BGRA4444,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_ARGB1555,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ARGB1555,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_XRGB1555,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ARGB1555,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_ABGR1555,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ABGR1555,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_XBGR1555,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_ABGR1555,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_RGBA5551,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGBA5551,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_RGBX5551,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGBA5551,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_BGRA5551,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_BGRA5551,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
/* for DE2 VI layer which ignores alpha */
|
||||
.drm_fmt = DRM_FORMAT_BGRX5551,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_BGRA5551,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_OFF,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_UYVY,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_UYVY,
|
||||
@ -200,12 +256,6 @@ static const struct de2_fmt_info de2_formats[] = {
|
||||
.rgb = false,
|
||||
.csc = SUN8I_CSC_MODE_YUV2RGB,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_YUV444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGB888,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_YUV2RGB,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_YUV422,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_YUV422,
|
||||
@ -224,12 +274,6 @@ static const struct de2_fmt_info de2_formats[] = {
|
||||
.rgb = false,
|
||||
.csc = SUN8I_CSC_MODE_YUV2RGB,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_YVU444,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_RGB888,
|
||||
.rgb = true,
|
||||
.csc = SUN8I_CSC_MODE_YVU2RGB,
|
||||
},
|
||||
{
|
||||
.drm_fmt = DRM_FORMAT_YVU422,
|
||||
.de2_fmt = SUN8I_MIXER_FBFMT_YUV422,
|
||||
|
@ -330,26 +330,26 @@ static const struct drm_plane_funcs sun8i_vi_layer_funcs = {
|
||||
};
|
||||
|
||||
/*
|
||||
* While all RGB formats are supported, VI planes don't support
|
||||
* alpha blending, so there is no point having formats with alpha
|
||||
* channel if their opaque analog exist.
|
||||
* While DE2 VI layer supports same RGB formats as UI layer, alpha
|
||||
* channel is ignored. This structure lists all unique variants
|
||||
* where alpha channel is replaced with "don't care" (X) channel.
|
||||
*/
|
||||
static const u32 sun8i_vi_layer_formats[] = {
|
||||
DRM_FORMAT_ABGR1555,
|
||||
DRM_FORMAT_ABGR4444,
|
||||
DRM_FORMAT_ARGB1555,
|
||||
DRM_FORMAT_ARGB4444,
|
||||
DRM_FORMAT_BGR565,
|
||||
DRM_FORMAT_BGR888,
|
||||
DRM_FORMAT_BGRA5551,
|
||||
DRM_FORMAT_BGRA4444,
|
||||
DRM_FORMAT_BGRX4444,
|
||||
DRM_FORMAT_BGRX5551,
|
||||
DRM_FORMAT_BGRX8888,
|
||||
DRM_FORMAT_RGB565,
|
||||
DRM_FORMAT_RGB888,
|
||||
DRM_FORMAT_RGBA4444,
|
||||
DRM_FORMAT_RGBA5551,
|
||||
DRM_FORMAT_RGBX4444,
|
||||
DRM_FORMAT_RGBX5551,
|
||||
DRM_FORMAT_RGBX8888,
|
||||
DRM_FORMAT_XBGR1555,
|
||||
DRM_FORMAT_XBGR4444,
|
||||
DRM_FORMAT_XBGR8888,
|
||||
DRM_FORMAT_XRGB1555,
|
||||
DRM_FORMAT_XRGB4444,
|
||||
DRM_FORMAT_XRGB8888,
|
||||
|
||||
DRM_FORMAT_NV16,
|
||||
@ -363,11 +363,9 @@ static const u32 sun8i_vi_layer_formats[] = {
|
||||
DRM_FORMAT_YUV411,
|
||||
DRM_FORMAT_YUV420,
|
||||
DRM_FORMAT_YUV422,
|
||||
DRM_FORMAT_YUV444,
|
||||
DRM_FORMAT_YVU411,
|
||||
DRM_FORMAT_YVU420,
|
||||
DRM_FORMAT_YVU422,
|
||||
DRM_FORMAT_YVU444,
|
||||
};
|
||||
|
||||
struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct drm_device *drm,
|
||||
|
@ -426,7 +426,7 @@ static int ADT7462_REG_VOLT(struct adt7462_data *data, int which)
|
||||
return 0x95;
|
||||
break;
|
||||
}
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Provide labels for sysfs */
|
||||
|
@ -1231,6 +1231,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,
|
||||
/* Sharing an ib_cm_id with different handlers is not
|
||||
* supported */
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
ib_destroy_cm_id(cm_id);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
atomic_inc(&cm_id_priv->refcount);
|
||||
|
@ -158,8 +158,10 @@ static void dealloc_work_entries(struct iwcm_id_private *cm_id_priv)
|
||||
{
|
||||
struct list_head *e, *tmp;
|
||||
|
||||
list_for_each_safe(e, tmp, &cm_id_priv->work_free_list)
|
||||
list_for_each_safe(e, tmp, &cm_id_priv->work_free_list) {
|
||||
list_del(e);
|
||||
kfree(list_entry(e, struct iwcm_work, free_list));
|
||||
}
|
||||
}
|
||||
|
||||
static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count)
|
||||
|
@ -337,15 +337,19 @@ static struct ib_ports_pkeys *get_new_pps(const struct ib_qp *qp,
|
||||
return NULL;
|
||||
|
||||
if (qp_attr_mask & IB_QP_PORT)
|
||||
new_pps->main.port_num =
|
||||
(qp_pps) ? qp_pps->main.port_num : qp_attr->port_num;
|
||||
new_pps->main.port_num = qp_attr->port_num;
|
||||
else if (qp_pps)
|
||||
new_pps->main.port_num = qp_pps->main.port_num;
|
||||
|
||||
if (qp_attr_mask & IB_QP_PKEY_INDEX)
|
||||
new_pps->main.pkey_index = (qp_pps) ? qp_pps->main.pkey_index :
|
||||
qp_attr->pkey_index;
|
||||
new_pps->main.pkey_index = qp_attr->pkey_index;
|
||||
else if (qp_pps)
|
||||
new_pps->main.pkey_index = qp_pps->main.pkey_index;
|
||||
|
||||
if ((qp_attr_mask & IB_QP_PKEY_INDEX) && (qp_attr_mask & IB_QP_PORT))
|
||||
new_pps->main.state = IB_PORT_PKEY_VALID;
|
||||
|
||||
if (!(qp_attr_mask & (IB_QP_PKEY_INDEX || IB_QP_PORT)) && qp_pps) {
|
||||
if (!(qp_attr_mask & (IB_QP_PKEY_INDEX | IB_QP_PORT)) && qp_pps) {
|
||||
new_pps->main.port_num = qp_pps->main.port_num;
|
||||
new_pps->main.pkey_index = qp_pps->main.pkey_index;
|
||||
if (qp_pps->main.state != IB_PORT_PKEY_NOT_VALID)
|
||||
|
@ -595,10 +595,11 @@ static inline void hfi1_handle_packet(struct hfi1_packet *packet,
|
||||
opa_get_lid(packet->dlid, 9B));
|
||||
if (!mcast)
|
||||
goto drop;
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(p, &mcast->qp_list, list) {
|
||||
packet->qp = p->qp;
|
||||
if (hfi1_do_pkey_check(packet))
|
||||
goto drop;
|
||||
goto unlock_drop;
|
||||
spin_lock_irqsave(&packet->qp->r_lock, flags);
|
||||
packet_handler = qp_ok(packet);
|
||||
if (likely(packet_handler))
|
||||
@ -607,6 +608,7 @@ static inline void hfi1_handle_packet(struct hfi1_packet *packet,
|
||||
ibp->rvp.n_pkt_drops++;
|
||||
spin_unlock_irqrestore(&packet->qp->r_lock, flags);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
/*
|
||||
* Notify rvt_multicast_detach() if it is waiting for us
|
||||
* to finish.
|
||||
|
@ -360,8 +360,10 @@ void qib_ib_rcv(struct qib_ctxtdata *rcd, void *rhdr, void *data, u32 tlen)
|
||||
if (mcast == NULL)
|
||||
goto drop;
|
||||
this_cpu_inc(ibp->pmastats->n_multicast_rcv);
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(p, &mcast->qp_list, list)
|
||||
qib_qp_rcv(rcd, hdr, 1, data, tlen, p->qp);
|
||||
rcu_read_unlock();
|
||||
/*
|
||||
* Notify rvt_multicast_detach() if it is waiting for us
|
||||
* to finish.
|
||||
|
@ -2859,8 +2859,8 @@ static void cache_postsuspend(struct dm_target *ti)
|
||||
prevent_background_work(cache);
|
||||
BUG_ON(atomic_read(&cache->nr_io_migrations));
|
||||
|
||||
cancel_delayed_work(&cache->waker);
|
||||
flush_workqueue(cache->wq);
|
||||
cancel_delayed_work_sync(&cache->waker);
|
||||
drain_workqueue(cache->wq);
|
||||
WARN_ON(cache->tracker.in_flight);
|
||||
|
||||
/*
|
||||
|
@ -186,17 +186,19 @@ struct dm_integrity_c {
|
||||
__u8 sectors_per_block;
|
||||
|
||||
unsigned char mode;
|
||||
int suspending;
|
||||
|
||||
int failed;
|
||||
|
||||
struct crypto_shash *internal_hash;
|
||||
|
||||
struct dm_target *ti;
|
||||
|
||||
/* these variables are locked with endio_wait.lock */
|
||||
struct rb_root in_progress;
|
||||
struct list_head wait_list;
|
||||
wait_queue_head_t endio_wait;
|
||||
struct workqueue_struct *wait_wq;
|
||||
struct workqueue_struct *offload_wq;
|
||||
|
||||
unsigned char commit_seq;
|
||||
commit_id_t commit_ids[N_COMMIT_IDS];
|
||||
@ -1236,7 +1238,7 @@ static void dec_in_flight(struct dm_integrity_io *dio)
|
||||
dio->range.logical_sector += dio->range.n_sectors;
|
||||
bio_advance(bio, dio->range.n_sectors << SECTOR_SHIFT);
|
||||
INIT_WORK(&dio->work, integrity_bio_wait);
|
||||
queue_work(ic->wait_wq, &dio->work);
|
||||
queue_work(ic->offload_wq, &dio->work);
|
||||
return;
|
||||
}
|
||||
do_endio_flush(ic, dio);
|
||||
@ -1656,7 +1658,7 @@ static void dm_integrity_map_continue(struct dm_integrity_io *dio, bool from_map
|
||||
|
||||
if (need_sync_io && from_map) {
|
||||
INIT_WORK(&dio->work, integrity_bio_wait);
|
||||
queue_work(ic->metadata_wq, &dio->work);
|
||||
queue_work(ic->offload_wq, &dio->work);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2080,7 +2082,7 @@ static void integrity_writer(struct work_struct *w)
|
||||
unsigned prev_free_sectors;
|
||||
|
||||
/* the following test is not needed, but it tests the replay code */
|
||||
if (READ_ONCE(ic->suspending) && !ic->meta_dev)
|
||||
if (unlikely(dm_suspended(ic->ti)) && !ic->meta_dev)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&ic->endio_wait.lock);
|
||||
@ -2139,7 +2141,7 @@ static void integrity_recalc(struct work_struct *w)
|
||||
|
||||
next_chunk:
|
||||
|
||||
if (unlikely(READ_ONCE(ic->suspending)))
|
||||
if (unlikely(dm_suspended(ic->ti)))
|
||||
goto unlock_ret;
|
||||
|
||||
range.logical_sector = le64_to_cpu(ic->sb->recalc_sector);
|
||||
@ -2411,8 +2413,6 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
|
||||
|
||||
del_timer_sync(&ic->autocommit_timer);
|
||||
|
||||
WRITE_ONCE(ic->suspending, 1);
|
||||
|
||||
if (ic->recalc_wq)
|
||||
drain_workqueue(ic->recalc_wq);
|
||||
|
||||
@ -2426,8 +2426,6 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
|
||||
dm_integrity_flush_buffers(ic);
|
||||
}
|
||||
|
||||
WRITE_ONCE(ic->suspending, 0);
|
||||
|
||||
BUG_ON(!RB_EMPTY_ROOT(&ic->in_progress));
|
||||
|
||||
ic->journal_uptodate = true;
|
||||
@ -3116,6 +3114,7 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
||||
}
|
||||
ti->private = ic;
|
||||
ti->per_io_data_size = sizeof(struct dm_integrity_io);
|
||||
ic->ti = ti;
|
||||
|
||||
ic->in_progress = RB_ROOT;
|
||||
INIT_LIST_HEAD(&ic->wait_list);
|
||||
@ -3310,6 +3309,14 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
ic->offload_wq = alloc_workqueue("dm-integrity-offload", WQ_MEM_RECLAIM,
|
||||
METADATA_WORKQUEUE_MAX_ACTIVE);
|
||||
if (!ic->offload_wq) {
|
||||
ti->error = "Cannot allocate workqueue";
|
||||
r = -ENOMEM;
|
||||
goto bad;
|
||||
}
|
||||
|
||||
ic->commit_wq = alloc_workqueue("dm-integrity-commit", WQ_MEM_RECLAIM, 1);
|
||||
if (!ic->commit_wq) {
|
||||
ti->error = "Cannot allocate workqueue";
|
||||
@ -3546,6 +3553,8 @@ static void dm_integrity_dtr(struct dm_target *ti)
|
||||
destroy_workqueue(ic->metadata_wq);
|
||||
if (ic->wait_wq)
|
||||
destroy_workqueue(ic->wait_wq);
|
||||
if (ic->offload_wq)
|
||||
destroy_workqueue(ic->offload_wq);
|
||||
if (ic->commit_wq)
|
||||
destroy_workqueue(ic->commit_wq);
|
||||
if (ic->writer_wq)
|
||||
|
@ -631,6 +631,12 @@ static void writecache_add_to_freelist(struct dm_writecache *wc, struct wc_entry
|
||||
wc->freelist_size++;
|
||||
}
|
||||
|
||||
static inline void writecache_verify_watermark(struct dm_writecache *wc)
|
||||
{
|
||||
if (unlikely(wc->freelist_size + wc->writeback_size <= wc->freelist_high_watermark))
|
||||
queue_work(wc->writeback_wq, &wc->writeback_work);
|
||||
}
|
||||
|
||||
static struct wc_entry *writecache_pop_from_freelist(struct dm_writecache *wc)
|
||||
{
|
||||
struct wc_entry *e;
|
||||
@ -652,8 +658,8 @@ static struct wc_entry *writecache_pop_from_freelist(struct dm_writecache *wc)
|
||||
list_del(&e->lru);
|
||||
}
|
||||
wc->freelist_size--;
|
||||
if (unlikely(wc->freelist_size + wc->writeback_size <= wc->freelist_high_watermark))
|
||||
queue_work(wc->writeback_wq, &wc->writeback_work);
|
||||
|
||||
writecache_verify_watermark(wc);
|
||||
|
||||
return e;
|
||||
}
|
||||
@ -844,7 +850,7 @@ static void writecache_suspend(struct dm_target *ti)
|
||||
}
|
||||
wc_unlock(wc);
|
||||
|
||||
flush_workqueue(wc->writeback_wq);
|
||||
drain_workqueue(wc->writeback_wq);
|
||||
|
||||
wc_lock(wc);
|
||||
if (flush_on_suspend)
|
||||
@ -967,6 +973,8 @@ erase_this:
|
||||
writecache_commit_flushed(wc, false);
|
||||
}
|
||||
|
||||
writecache_verify_watermark(wc);
|
||||
|
||||
wc_unlock(wc);
|
||||
}
|
||||
|
||||
|
@ -2522,6 +2522,7 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
||||
map = dm_get_live_table(md, &srcu_idx);
|
||||
if (!dm_suspended_md(md)) {
|
||||
dm_table_presuspend_targets(map);
|
||||
set_bit(DMF_SUSPENDED, &md->flags);
|
||||
dm_table_postsuspend_targets(map);
|
||||
}
|
||||
/* dm_put_live_table must be before msleep, otherwise deadlock is possible */
|
||||
|
@ -787,12 +787,12 @@ int v4l2_m2m_register_media_controller(struct v4l2_m2m_dev *m2m_dev,
|
||||
goto err_rel_entity1;
|
||||
|
||||
/* Connect the three entities */
|
||||
ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 1,
|
||||
ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 0,
|
||||
MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
|
||||
if (ret)
|
||||
goto err_rel_entity2;
|
||||
|
||||
ret = media_create_pad_link(&m2m_dev->proc, 0, &m2m_dev->sink, 0,
|
||||
ret = media_create_pad_link(&m2m_dev->proc, 1, &m2m_dev->sink, 0,
|
||||
MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
|
||||
if (ret)
|
||||
goto err_rm_links0;
|
||||
|
@ -1165,6 +1165,9 @@ void b53_vlan_add(struct dsa_switch *ds, int port,
|
||||
|
||||
b53_get_vlan_entry(dev, vid, vl);
|
||||
|
||||
if (vid == 0 && vid == b53_default_pvid(dev))
|
||||
untagged = true;
|
||||
|
||||
vl->members |= BIT(port);
|
||||
if (untagged && !dsa_is_cpu_port(ds, port))
|
||||
vl->untag |= BIT(port);
|
||||
|
@ -73,8 +73,7 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
|
||||
/* Force link status for IMP port */
|
||||
reg = core_readl(priv, offset);
|
||||
reg |= (MII_SW_OR | LINK_STS);
|
||||
if (priv->type == BCM7278_DEVICE_ID)
|
||||
reg |= GMII_SPEED_UP_2G;
|
||||
reg &= ~GMII_SPEED_UP_2G;
|
||||
core_writel(priv, reg, offset);
|
||||
|
||||
/* Enable Broadcast, Multicast, Unicast forwarding to IMP port */
|
||||
|
@ -413,10 +413,19 @@ void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable)
|
||||
lmac = &bgx->lmac[lmacid];
|
||||
|
||||
cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
|
||||
if (enable)
|
||||
if (enable) {
|
||||
cfg |= CMR_PKT_RX_EN | CMR_PKT_TX_EN;
|
||||
else
|
||||
|
||||
/* enable TX FIFO Underflow interrupt */
|
||||
bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1S,
|
||||
GMI_TXX_INT_UNDFLW);
|
||||
} else {
|
||||
cfg &= ~(CMR_PKT_RX_EN | CMR_PKT_TX_EN);
|
||||
|
||||
/* Disable TX FIFO Underflow interrupt */
|
||||
bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1C,
|
||||
GMI_TXX_INT_UNDFLW);
|
||||
}
|
||||
bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
|
||||
|
||||
if (bgx->is_rgx)
|
||||
@ -1544,6 +1553,48 @@ static int bgx_init_phy(struct bgx *bgx)
|
||||
return bgx_init_of_phy(bgx);
|
||||
}
|
||||
|
||||
static irqreturn_t bgx_intr_handler(int irq, void *data)
|
||||
{
|
||||
struct bgx *bgx = (struct bgx *)data;
|
||||
u64 status, val;
|
||||
int lmac;
|
||||
|
||||
for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
|
||||
status = bgx_reg_read(bgx, lmac, BGX_GMP_GMI_TXX_INT);
|
||||
if (status & GMI_TXX_INT_UNDFLW) {
|
||||
pci_err(bgx->pdev, "BGX%d lmac%d UNDFLW\n",
|
||||
bgx->bgx_id, lmac);
|
||||
val = bgx_reg_read(bgx, lmac, BGX_CMRX_CFG);
|
||||
val &= ~CMR_EN;
|
||||
bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
|
||||
val |= CMR_EN;
|
||||
bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
|
||||
}
|
||||
/* clear interrupts */
|
||||
bgx_reg_write(bgx, lmac, BGX_GMP_GMI_TXX_INT, status);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void bgx_register_intr(struct pci_dev *pdev)
|
||||
{
|
||||
struct bgx *bgx = pci_get_drvdata(pdev);
|
||||
int ret;
|
||||
|
||||
ret = pci_alloc_irq_vectors(pdev, BGX_LMAC_VEC_OFFSET,
|
||||
BGX_LMAC_VEC_OFFSET, PCI_IRQ_ALL_TYPES);
|
||||
if (ret < 0) {
|
||||
pci_err(pdev, "Req for #%d msix vectors failed\n",
|
||||
BGX_LMAC_VEC_OFFSET);
|
||||
return;
|
||||
}
|
||||
ret = pci_request_irq(pdev, GMPX_GMI_TX_INT, bgx_intr_handler, NULL,
|
||||
bgx, "BGX%d", bgx->bgx_id);
|
||||
if (ret)
|
||||
pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
|
||||
}
|
||||
|
||||
static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
int err;
|
||||
@ -1559,7 +1610,7 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
pci_set_drvdata(pdev, bgx);
|
||||
|
||||
err = pci_enable_device(pdev);
|
||||
err = pcim_enable_device(pdev);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to enable PCI device\n");
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
@ -1613,6 +1664,8 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
bgx_init_hw(bgx);
|
||||
|
||||
bgx_register_intr(pdev);
|
||||
|
||||
/* Enable all LMACs */
|
||||
for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
|
||||
err = bgx_lmac_enable(bgx, lmac);
|
||||
@ -1629,6 +1682,7 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
err_enable:
|
||||
bgx_vnic[bgx->bgx_id] = NULL;
|
||||
pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
|
||||
err_release_regions:
|
||||
pci_release_regions(pdev);
|
||||
err_disable_device:
|
||||
@ -1646,6 +1700,8 @@ static void bgx_remove(struct pci_dev *pdev)
|
||||
for (lmac = 0; lmac < bgx->lmac_count; lmac++)
|
||||
bgx_lmac_disable(bgx, lmac);
|
||||
|
||||
pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
|
||||
|
||||
bgx_vnic[bgx->bgx_id] = NULL;
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
|
@ -183,6 +183,15 @@
|
||||
#define BGX_GMP_GMI_TXX_BURST 0x38228
|
||||
#define BGX_GMP_GMI_TXX_MIN_PKT 0x38240
|
||||
#define BGX_GMP_GMI_TXX_SGMII_CTL 0x38300
|
||||
#define BGX_GMP_GMI_TXX_INT 0x38500
|
||||
#define BGX_GMP_GMI_TXX_INT_W1S 0x38508
|
||||
#define BGX_GMP_GMI_TXX_INT_ENA_W1C 0x38510
|
||||
#define BGX_GMP_GMI_TXX_INT_ENA_W1S 0x38518
|
||||
#define GMI_TXX_INT_PTP_LOST BIT_ULL(4)
|
||||
#define GMI_TXX_INT_LATE_COL BIT_ULL(3)
|
||||
#define GMI_TXX_INT_XSDEF BIT_ULL(2)
|
||||
#define GMI_TXX_INT_XSCOL BIT_ULL(1)
|
||||
#define GMI_TXX_INT_UNDFLW BIT_ULL(0)
|
||||
|
||||
#define BGX_MSIX_VEC_0_29_ADDR 0x400000 /* +(0..29) << 4 */
|
||||
#define BGX_MSIX_VEC_0_29_CTL 0x400008
|
||||
|
@ -772,13 +772,6 @@ ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
/* Tell the OS link is going down, the link will go back up when fw
|
||||
* says it is ready asynchronously
|
||||
*/
|
||||
ice_print_link_msg(vsi, false);
|
||||
netif_carrier_off(netdev);
|
||||
netif_tx_stop_all_queues(netdev);
|
||||
|
||||
/* Set the FC mode and only restart AN if link is up */
|
||||
status = ice_set_fc(pi, &aq_failures, link_up);
|
||||
|
||||
|
@ -475,24 +475,6 @@ static int msg_enable;
|
||||
* chip is busy transferring packet data (RX/TX FIFO accesses).
|
||||
*/
|
||||
|
||||
/**
|
||||
* ks_rdreg8 - read 8 bit register from device
|
||||
* @ks : The chip information
|
||||
* @offset: The register address
|
||||
*
|
||||
* Read a 8bit register from the chip, returning the result
|
||||
*/
|
||||
static u8 ks_rdreg8(struct ks_net *ks, int offset)
|
||||
{
|
||||
u16 data;
|
||||
u8 shift_bit = offset & 0x03;
|
||||
u8 shift_data = (offset & 1) << 3;
|
||||
ks->cmd_reg_cache = (u16) offset | (u16)(BE0 << shift_bit);
|
||||
iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
|
||||
data = ioread16(ks->hw_addr);
|
||||
return (u8)(data >> shift_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* ks_rdreg16 - read 16 bit register from device
|
||||
* @ks : The chip information
|
||||
@ -503,27 +485,11 @@ static u8 ks_rdreg8(struct ks_net *ks, int offset)
|
||||
|
||||
static u16 ks_rdreg16(struct ks_net *ks, int offset)
|
||||
{
|
||||
ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02));
|
||||
ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02));
|
||||
iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
|
||||
return ioread16(ks->hw_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ks_wrreg8 - write 8bit register value to chip
|
||||
* @ks: The chip information
|
||||
* @offset: The register address
|
||||
* @value: The value to write
|
||||
*
|
||||
*/
|
||||
static void ks_wrreg8(struct ks_net *ks, int offset, u8 value)
|
||||
{
|
||||
u8 shift_bit = (offset & 0x03);
|
||||
u16 value_write = (u16)(value << ((offset & 1) << 3));
|
||||
ks->cmd_reg_cache = (u16)offset | (BE0 << shift_bit);
|
||||
iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
|
||||
iowrite16(value_write, ks->hw_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ks_wrreg16 - write 16bit register value to chip
|
||||
* @ks: The chip information
|
||||
@ -534,7 +500,7 @@ static void ks_wrreg8(struct ks_net *ks, int offset, u8 value)
|
||||
|
||||
static void ks_wrreg16(struct ks_net *ks, int offset, u16 value)
|
||||
{
|
||||
ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02));
|
||||
ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02));
|
||||
iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
|
||||
iowrite16(value, ks->hw_addr);
|
||||
}
|
||||
@ -550,7 +516,7 @@ static inline void ks_inblk(struct ks_net *ks, u16 *wptr, u32 len)
|
||||
{
|
||||
len >>= 1;
|
||||
while (len--)
|
||||
*wptr++ = (u16)ioread16(ks->hw_addr);
|
||||
*wptr++ = be16_to_cpu(ioread16(ks->hw_addr));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -564,7 +530,7 @@ static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len)
|
||||
{
|
||||
len >>= 1;
|
||||
while (len--)
|
||||
iowrite16(*wptr++, ks->hw_addr);
|
||||
iowrite16(cpu_to_be16(*wptr++), ks->hw_addr);
|
||||
}
|
||||
|
||||
static void ks_disable_int(struct ks_net *ks)
|
||||
@ -643,8 +609,7 @@ static void ks_read_config(struct ks_net *ks)
|
||||
u16 reg_data = 0;
|
||||
|
||||
/* Regardless of bus width, 8 bit read should always work.*/
|
||||
reg_data = ks_rdreg8(ks, KS_CCR) & 0x00FF;
|
||||
reg_data |= ks_rdreg8(ks, KS_CCR+1) << 8;
|
||||
reg_data = ks_rdreg16(ks, KS_CCR);
|
||||
|
||||
/* addr/data bus are multiplexed */
|
||||
ks->sharedbus = (reg_data & CCR_SHARED) == CCR_SHARED;
|
||||
@ -748,7 +713,7 @@ static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len)
|
||||
|
||||
/* 1. set sudo DMA mode */
|
||||
ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI);
|
||||
ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff);
|
||||
ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA);
|
||||
|
||||
/* 2. read prepend data */
|
||||
/**
|
||||
@ -765,7 +730,7 @@ static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len)
|
||||
ks_inblk(ks, buf, ALIGN(len, 4));
|
||||
|
||||
/* 4. reset sudo DMA Mode */
|
||||
ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr);
|
||||
ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -998,13 +963,13 @@ static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len)
|
||||
ks->txh.txw[1] = cpu_to_le16(len);
|
||||
|
||||
/* 1. set sudo-DMA mode */
|
||||
ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff);
|
||||
ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA);
|
||||
/* 2. write status/lenth info */
|
||||
ks_outblk(ks, ks->txh.txw, 4);
|
||||
/* 3. write pkt data */
|
||||
ks_outblk(ks, (u16 *)pdata, ALIGN(len, 4));
|
||||
/* 4. reset sudo-DMA mode */
|
||||
ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr);
|
||||
ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr);
|
||||
/* 5. Enqueue Tx(move the pkt from TX buffer into TXQ) */
|
||||
ks_wrreg16(ks, KS_TXQCR, TXQCR_METFE);
|
||||
/* 6. wait until TXQCR_METFE is auto-cleared */
|
||||
|
@ -1058,8 +1058,8 @@ static struct nvme_id_ns *nvme_identify_ns(struct nvme_ctrl *ctrl,
|
||||
static int nvme_set_features(struct nvme_ctrl *dev, unsigned fid, unsigned dword11,
|
||||
void *buffer, size_t buflen, u32 *result)
|
||||
{
|
||||
union nvme_result res = { 0 };
|
||||
struct nvme_command c;
|
||||
union nvme_result res;
|
||||
int ret;
|
||||
|
||||
memset(&c, 0, sizeof(c));
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#define PHY_MDM6600_PHY_DELAY_MS 4000 /* PHY enable 2.2s to 3.5s */
|
||||
#define PHY_MDM6600_ENABLED_DELAY_MS 8000 /* 8s more total for MDM6600 */
|
||||
#define PHY_MDM6600_WAKE_KICK_MS 600 /* time on after GPIO toggle */
|
||||
#define MDM6600_MODEM_IDLE_DELAY_MS 1000 /* modem after USB suspend */
|
||||
#define MDM6600_MODEM_WAKE_DELAY_MS 200 /* modem response after idle */
|
||||
|
||||
@ -224,10 +225,24 @@ static irqreturn_t phy_mdm6600_wakeirq_thread(int irq, void *data)
|
||||
{
|
||||
struct phy_mdm6600 *ddata = data;
|
||||
struct gpio_desc *mode_gpio1;
|
||||
int error, wakeup;
|
||||
|
||||
mode_gpio1 = ddata->mode_gpios->desc[PHY_MDM6600_MODE1];
|
||||
dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n",
|
||||
gpiod_get_value(mode_gpio1));
|
||||
wakeup = gpiod_get_value(mode_gpio1);
|
||||
if (!wakeup)
|
||||
return IRQ_NONE;
|
||||
|
||||
dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", wakeup);
|
||||
error = pm_runtime_get_sync(ddata->dev);
|
||||
if (error < 0) {
|
||||
pm_runtime_put_noidle(ddata->dev);
|
||||
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
/* Just wake-up and kick the autosuspend timer */
|
||||
pm_runtime_mark_last_busy(ddata->dev);
|
||||
pm_runtime_put_autosuspend(ddata->dev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -477,8 +492,14 @@ static void phy_mdm6600_modem_wake(struct work_struct *work)
|
||||
|
||||
ddata = container_of(work, struct phy_mdm6600, modem_wake_work.work);
|
||||
phy_mdm6600_wake_modem(ddata);
|
||||
|
||||
/*
|
||||
* The modem does not always stay awake 1.2 seconds after toggling
|
||||
* the wake GPIO, and sometimes it idles after about some 600 ms
|
||||
* making writes time out.
|
||||
*/
|
||||
schedule_delayed_work(&ddata->modem_wake_work,
|
||||
msecs_to_jiffies(MDM6600_MODEM_IDLE_DELAY_MS));
|
||||
msecs_to_jiffies(PHY_MDM6600_WAKE_KICK_MS));
|
||||
}
|
||||
|
||||
static int __maybe_unused phy_mdm6600_runtime_suspend(struct device *dev)
|
||||
|
@ -303,8 +303,10 @@ static void *
|
||||
cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
{
|
||||
struct ccwdev_iter *iter;
|
||||
loff_t p = *offset;
|
||||
|
||||
if (*offset >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1))
|
||||
(*offset)++;
|
||||
if (p >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1))
|
||||
return NULL;
|
||||
iter = it;
|
||||
if (iter->devno == __MAX_SUBCHANNEL) {
|
||||
@ -314,7 +316,6 @@ cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
return NULL;
|
||||
} else
|
||||
iter->devno++;
|
||||
(*offset)++;
|
||||
return iter;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/qdio.h>
|
||||
|
||||
#include "cio.h"
|
||||
@ -208,7 +209,7 @@ static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr,
|
||||
|
||||
/* fill in sl */
|
||||
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++)
|
||||
q->sl->element[j].sbal = (unsigned long)q->sbal[j];
|
||||
q->sl->element[j].sbal = virt_to_phys(q->sbal[j]);
|
||||
}
|
||||
|
||||
static void setup_queues(struct qdio_irq *irq_ptr,
|
||||
|
@ -4929,10 +4929,10 @@ static void qeth_qdio_establish_cq(struct qeth_card *card,
|
||||
if (card->options.cq == QETH_CQ_ENABLED) {
|
||||
int offset = QDIO_MAX_BUFFERS_PER_Q *
|
||||
(card->qdio.no_in_queues - 1);
|
||||
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
|
||||
in_sbal_ptrs[offset + i] = (struct qdio_buffer *)
|
||||
virt_to_phys(card->qdio.c_q->bufs[i].buffer);
|
||||
}
|
||||
|
||||
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
|
||||
in_sbal_ptrs[offset + i] =
|
||||
card->qdio.c_q->bufs[i].buffer;
|
||||
|
||||
queue_start_poll[card->qdio.no_in_queues - 1] = NULL;
|
||||
}
|
||||
@ -4967,10 +4967,9 @@ static int qeth_qdio_establish(struct qeth_card *card)
|
||||
rc = -ENOMEM;
|
||||
goto out_free_qib_param;
|
||||
}
|
||||
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) {
|
||||
in_sbal_ptrs[i] = (struct qdio_buffer *)
|
||||
virt_to_phys(card->qdio.in_q->bufs[i].buffer);
|
||||
}
|
||||
|
||||
for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++)
|
||||
in_sbal_ptrs[i] = card->qdio.in_q->bufs[i].buffer;
|
||||
|
||||
queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *),
|
||||
GFP_KERNEL);
|
||||
@ -4991,11 +4990,11 @@ static int qeth_qdio_establish(struct qeth_card *card)
|
||||
rc = -ENOMEM;
|
||||
goto out_free_queue_start_poll;
|
||||
}
|
||||
|
||||
for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
|
||||
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) {
|
||||
out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys(
|
||||
card->qdio.out_qs[i]->bufs[j]->buffer);
|
||||
}
|
||||
for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++, k++)
|
||||
out_sbal_ptrs[k] =
|
||||
card->qdio.out_qs[i]->bufs[j]->buffer;
|
||||
|
||||
memset(&init_data, 0, sizeof(struct qdio_initialize));
|
||||
init_data.cdev = CARD_DDEV(card);
|
||||
|
@ -530,7 +530,8 @@ retry_alloc:
|
||||
|
||||
fusion->io_request_frames =
|
||||
dma_pool_alloc(fusion->io_request_frames_pool,
|
||||
GFP_KERNEL, &fusion->io_request_frames_phys);
|
||||
GFP_KERNEL | __GFP_NOWARN,
|
||||
&fusion->io_request_frames_phys);
|
||||
if (!fusion->io_request_frames) {
|
||||
if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) {
|
||||
instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT;
|
||||
@ -568,7 +569,7 @@ retry_alloc:
|
||||
|
||||
fusion->io_request_frames =
|
||||
dma_pool_alloc(fusion->io_request_frames_pool,
|
||||
GFP_KERNEL,
|
||||
GFP_KERNEL | __GFP_NOWARN,
|
||||
&fusion->io_request_frames_phys);
|
||||
|
||||
if (!fusion->io_request_frames) {
|
||||
|
@ -866,6 +866,8 @@ static void pm8001_dev_gone_notify(struct domain_device *dev)
|
||||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
|
||||
dev, 1, 0);
|
||||
while (pm8001_dev->running_req)
|
||||
msleep(20);
|
||||
spin_lock_irqsave(&pm8001_ha->lock, flags);
|
||||
}
|
||||
PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
|
||||
@ -1238,8 +1240,10 @@ int pm8001_abort_task(struct sas_task *task)
|
||||
PM8001_MSG_DBG(pm8001_ha,
|
||||
pm8001_printk("Waiting for Port reset\n"));
|
||||
wait_for_completion(&completion_reset);
|
||||
if (phy->port_reset_status)
|
||||
if (phy->port_reset_status) {
|
||||
pm8001_dev_gone_notify(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* 4. SATA Abort ALL
|
||||
|
@ -604,7 +604,7 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
|
||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
|
||||
0x0000ffff;
|
||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
|
||||
0x140000;
|
||||
CHIP_8006_PORT_RECOVERY_TIMEOUT;
|
||||
}
|
||||
pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
|
||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
|
||||
|
@ -228,6 +228,8 @@
|
||||
#define SAS_MAX_AIP 0x200000
|
||||
#define IT_NEXUS_TIMEOUT 0x7D0
|
||||
#define PORT_RECOVERY_TIMEOUT ((IT_NEXUS_TIMEOUT/100) + 30)
|
||||
/* Port recovery timeout, 10000 ms for PM8006 controller */
|
||||
#define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000
|
||||
|
||||
#ifdef __LITTLE_ENDIAN_BITFIELD
|
||||
struct sas_identify_frame_local {
|
||||
|
@ -371,7 +371,6 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
|
||||
goto out_disable_clk;
|
||||
|
||||
rate = clk_get_rate(pll_clk);
|
||||
clk_disable_unprepare(pll_clk);
|
||||
if (!rate) {
|
||||
ret = -EINVAL;
|
||||
goto out_disable_pll_clk;
|
||||
|
@ -24,6 +24,14 @@
|
||||
|
||||
#include "8250.h"
|
||||
|
||||
#define PCI_DEVICE_ID_ACCES_COM_2S 0x1052
|
||||
#define PCI_DEVICE_ID_ACCES_COM_4S 0x105d
|
||||
#define PCI_DEVICE_ID_ACCES_COM_8S 0x106c
|
||||
#define PCI_DEVICE_ID_ACCES_COM232_8 0x10a8
|
||||
#define PCI_DEVICE_ID_ACCES_COM_2SM 0x10d2
|
||||
#define PCI_DEVICE_ID_ACCES_COM_4SM 0x10db
|
||||
#define PCI_DEVICE_ID_ACCES_COM_8SM 0x10ea
|
||||
|
||||
#define PCI_DEVICE_ID_COMMTECH_4224PCI335 0x0002
|
||||
#define PCI_DEVICE_ID_COMMTECH_4222PCI335 0x0004
|
||||
#define PCI_DEVICE_ID_COMMTECH_2324PCI335 0x000a
|
||||
@ -571,6 +579,22 @@ static int __maybe_unused exar_resume(struct device *dev)
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(exar_pci_pm, exar_suspend, exar_resume);
|
||||
|
||||
static const struct exar8250_board acces_com_2x = {
|
||||
.num_ports = 2,
|
||||
.setup = pci_xr17c154_setup,
|
||||
};
|
||||
|
||||
static const struct exar8250_board acces_com_4x = {
|
||||
.num_ports = 4,
|
||||
.setup = pci_xr17c154_setup,
|
||||
};
|
||||
|
||||
static const struct exar8250_board acces_com_8x = {
|
||||
.num_ports = 8,
|
||||
.setup = pci_xr17c154_setup,
|
||||
};
|
||||
|
||||
|
||||
static const struct exar8250_board pbn_fastcom335_2 = {
|
||||
.num_ports = 2,
|
||||
.setup = pci_fastcom335_setup,
|
||||
@ -639,6 +663,15 @@ static const struct exar8250_board pbn_exar_XR17V8358 = {
|
||||
}
|
||||
|
||||
static const struct pci_device_id exar_pci_tbl[] = {
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_2S, acces_com_2x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_4S, acces_com_4x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_8S, acces_com_8x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM232_8, acces_com_8x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_2SM, acces_com_2x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_4SM, acces_com_4x),
|
||||
EXAR_DEVICE(ACCESSIO, ACCES_COM_8SM, acces_com_8x),
|
||||
|
||||
|
||||
CONNECT_DEVICE(XR17C152, UART_2_232, pbn_connect),
|
||||
CONNECT_DEVICE(XR17C154, UART_4_232, pbn_connect),
|
||||
CONNECT_DEVICE(XR17C158, UART_8_232, pbn_connect),
|
||||
|
@ -286,6 +286,10 @@ static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_HOST_INT_EN);
|
||||
|
||||
/* enable RX and TX ready overide */
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
|
||||
|
||||
/* reenable the UART */
|
||||
ar933x_uart_rmw(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
|
||||
@ -418,6 +422,10 @@ static int ar933x_uart_startup(struct uart_port *port)
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_HOST_INT_EN);
|
||||
|
||||
/* enable RX and TX ready overide */
|
||||
ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
|
||||
AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
|
||||
|
||||
/* Enable RX interrupts */
|
||||
up->ier = AR933X_UART_INT_RX_VALID;
|
||||
ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
|
||||
|
@ -840,7 +840,7 @@ static int mvebu_uart_probe(struct platform_device *pdev)
|
||||
|
||||
port->membase = devm_ioremap_resource(&pdev->dev, reg);
|
||||
if (IS_ERR(port->membase))
|
||||
return -PTR_ERR(port->membase);
|
||||
return PTR_ERR(port->membase);
|
||||
|
||||
mvuart = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_uart),
|
||||
GFP_KERNEL);
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/tty.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@ -43,6 +44,7 @@ static volatile int sel_start = -1; /* cleared by clear_selection */
|
||||
static int sel_end;
|
||||
static int sel_buffer_lth;
|
||||
static char *sel_buffer;
|
||||
static DEFINE_MUTEX(sel_lock);
|
||||
|
||||
/* clear_selection, highlight and highlight_pointer can be called
|
||||
from interrupt (via scrollback/front) */
|
||||
@ -165,7 +167,7 @@ static int store_utf8(u32 c, char *p)
|
||||
* The entire selection process is managed under the console_lock. It's
|
||||
* a lot under the lock but its hardly a performance path
|
||||
*/
|
||||
int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty)
|
||||
static int __set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty)
|
||||
{
|
||||
struct vc_data *vc = vc_cons[fg_console].d;
|
||||
int new_sel_start, new_sel_end, spc;
|
||||
@ -173,7 +175,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
|
||||
char *bp, *obp;
|
||||
int i, ps, pe, multiplier;
|
||||
u32 c;
|
||||
int mode;
|
||||
int mode, ret = 0;
|
||||
|
||||
poke_blanked_console();
|
||||
if (copy_from_user(&v, sel, sizeof(*sel)))
|
||||
@ -322,7 +324,21 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
|
||||
}
|
||||
}
|
||||
sel_buffer_lth = bp - sel_buffer;
|
||||
return 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int set_selection(const struct tiocl_selection __user *v, struct tty_struct *tty)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&sel_lock);
|
||||
console_lock();
|
||||
ret = __set_selection(v, tty);
|
||||
console_unlock();
|
||||
mutex_unlock(&sel_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Insert the contents of the selection buffer into the
|
||||
@ -351,6 +367,7 @@ int paste_selection(struct tty_struct *tty)
|
||||
tty_buffer_lock_exclusive(&vc->port);
|
||||
|
||||
add_wait_queue(&vc->paste_wait, &wait);
|
||||
mutex_lock(&sel_lock);
|
||||
while (sel_buffer && sel_buffer_lth > pasted) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (signal_pending(current)) {
|
||||
@ -358,7 +375,9 @@ int paste_selection(struct tty_struct *tty)
|
||||
break;
|
||||
}
|
||||
if (tty_throttled(tty)) {
|
||||
mutex_unlock(&sel_lock);
|
||||
schedule();
|
||||
mutex_lock(&sel_lock);
|
||||
continue;
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
@ -367,6 +386,7 @@ int paste_selection(struct tty_struct *tty)
|
||||
count);
|
||||
pasted += count;
|
||||
}
|
||||
mutex_unlock(&sel_lock);
|
||||
remove_wait_queue(&vc->paste_wait, &wait);
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
||||
|
@ -3022,9 +3022,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
|
||||
switch (type)
|
||||
{
|
||||
case TIOCL_SETSEL:
|
||||
console_lock();
|
||||
ret = set_selection((struct tiocl_selection __user *)(p+1), tty);
|
||||
console_unlock();
|
||||
break;
|
||||
case TIOCL_PASTESEL:
|
||||
ret = paste_selection(tty);
|
||||
|
@ -962,13 +962,17 @@ int usb_remove_device(struct usb_device *udev)
|
||||
{
|
||||
struct usb_hub *hub;
|
||||
struct usb_interface *intf;
|
||||
int ret;
|
||||
|
||||
if (!udev->parent) /* Can't remove a root hub */
|
||||
return -EINVAL;
|
||||
hub = usb_hub_to_struct_hub(udev->parent);
|
||||
intf = to_usb_interface(hub->intfdev);
|
||||
|
||||
usb_autopm_get_interface(intf);
|
||||
ret = usb_autopm_get_interface(intf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
set_bit(udev->portnum, hub->removed_bits);
|
||||
hub_port_logical_disconnect(hub, udev->portnum);
|
||||
usb_autopm_put_interface(intf);
|
||||
@ -1834,7 +1838,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
if (id->driver_info & HUB_QUIRK_DISABLE_AUTOSUSPEND) {
|
||||
hub->quirk_disable_autosuspend = 1;
|
||||
usb_autopm_get_interface(intf);
|
||||
usb_autopm_get_interface_no_resume(intf);
|
||||
}
|
||||
|
||||
if (hub_configure(hub, &desc->endpoint[0].desc) >= 0)
|
||||
|
@ -203,7 +203,10 @@ static int usb_port_runtime_resume(struct device *dev)
|
||||
if (!port_dev->is_superspeed && peer)
|
||||
pm_runtime_get_sync(&peer->dev);
|
||||
|
||||
usb_autopm_get_interface(intf);
|
||||
retval = usb_autopm_get_interface(intf);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
retval = usb_hub_set_port_power(hdev, hub, port1, true);
|
||||
msleep(hub_power_on_good_delay(hub));
|
||||
if (udev && !retval) {
|
||||
@ -256,7 +259,10 @@ static int usb_port_runtime_suspend(struct device *dev)
|
||||
if (usb_port_block_power_off)
|
||||
return -EBUSY;
|
||||
|
||||
usb_autopm_get_interface(intf);
|
||||
retval = usb_autopm_get_interface(intf);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
retval = usb_hub_set_port_power(hdev, hub, port1, false);
|
||||
usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_CONNECTION);
|
||||
if (!port_dev->is_superspeed)
|
||||
|
@ -231,6 +231,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Logitech PTZ Pro Camera */
|
||||
{ USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Logitech Screen Share */
|
||||
{ USB_DEVICE(0x046d, 0x086c), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Logitech Quickcam Fusion */
|
||||
{ USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
@ -1067,7 +1067,14 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
|
||||
unsigned int rem = length % maxp;
|
||||
unsigned chain = true;
|
||||
|
||||
if (sg_is_last(s))
|
||||
/*
|
||||
* IOMMU driver is coalescing the list of sgs which shares a
|
||||
* page boundary into one and giving it to USB driver. With
|
||||
* this the number of sgs mapped is not equal to the number of
|
||||
* sgs passed. So mark the chain bit to false if it isthe last
|
||||
* mapped sg.
|
||||
*/
|
||||
if (i == remaining - 1)
|
||||
chain = false;
|
||||
|
||||
if (rem && usb_endpoint_dir_out(dep->endpoint.desc) && !chain) {
|
||||
|
@ -438,9 +438,13 @@ static u8 encode_bMaxPower(enum usb_device_speed speed,
|
||||
if (!val)
|
||||
return 0;
|
||||
if (speed < USB_SPEED_SUPER)
|
||||
return DIV_ROUND_UP(val, 2);
|
||||
return min(val, 500U) / 2;
|
||||
else
|
||||
return DIV_ROUND_UP(val, 8);
|
||||
/*
|
||||
* USB 3.x supports up to 900mA, but since 900 isn't divisible
|
||||
* by 8 the integral division will effectively cap to 896mA.
|
||||
*/
|
||||
return min(val, 900U) / 8;
|
||||
}
|
||||
|
||||
static int config_buf(struct usb_configuration *config,
|
||||
@ -838,6 +842,10 @@ static int set_config(struct usb_composite_dev *cdev,
|
||||
|
||||
/* when we return, be sure our power usage is valid */
|
||||
power = c->MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
|
||||
if (gadget->speed < USB_SPEED_SUPER)
|
||||
power = min(power, 500U);
|
||||
else
|
||||
power = min(power, 900U);
|
||||
done:
|
||||
usb_gadget_vbus_draw(gadget, power);
|
||||
if (result >= 0 && cdev->delayed_status)
|
||||
@ -2264,7 +2272,7 @@ void composite_resume(struct usb_gadget *gadget)
|
||||
{
|
||||
struct usb_composite_dev *cdev = get_gadget_data(gadget);
|
||||
struct usb_function *f;
|
||||
u16 maxpower;
|
||||
unsigned maxpower;
|
||||
|
||||
/* REVISIT: should we have config level
|
||||
* suspend/resume callbacks?
|
||||
@ -2278,10 +2286,14 @@ void composite_resume(struct usb_gadget *gadget)
|
||||
f->resume(f);
|
||||
}
|
||||
|
||||
maxpower = cdev->config->MaxPower;
|
||||
maxpower = cdev->config->MaxPower ?
|
||||
cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
|
||||
if (gadget->speed < USB_SPEED_SUPER)
|
||||
maxpower = min(maxpower, 500U);
|
||||
else
|
||||
maxpower = min(maxpower, 900U);
|
||||
|
||||
usb_gadget_vbus_draw(gadget, maxpower ?
|
||||
maxpower : CONFIG_USB_GADGET_VBUS_DRAW);
|
||||
usb_gadget_vbus_draw(gadget, maxpower);
|
||||
}
|
||||
|
||||
cdev->suspended = 0;
|
||||
|
@ -1077,18 +1077,19 @@ static int ffs_aio_cancel(struct kiocb *kiocb)
|
||||
{
|
||||
struct ffs_io_data *io_data = kiocb->private;
|
||||
struct ffs_epfile *epfile = kiocb->ki_filp->private_data;
|
||||
unsigned long flags;
|
||||
int value;
|
||||
|
||||
ENTER();
|
||||
|
||||
spin_lock_irq(&epfile->ffs->eps_lock);
|
||||
spin_lock_irqsave(&epfile->ffs->eps_lock, flags);
|
||||
|
||||
if (likely(io_data && io_data->ep && io_data->req))
|
||||
value = usb_ep_dequeue(io_data->ep, io_data->req);
|
||||
else
|
||||
value = -EINVAL;
|
||||
|
||||
spin_unlock_irq(&epfile->ffs->eps_lock);
|
||||
spin_unlock_irqrestore(&epfile->ffs->eps_lock, flags);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
@ -567,8 +567,10 @@ static int gs_start_io(struct gs_port *port)
|
||||
port->n_read = 0;
|
||||
started = gs_start_rx(port);
|
||||
|
||||
/* unblock any pending writes into our circular buffer */
|
||||
if (started) {
|
||||
gs_start_tx(port);
|
||||
/* Unblock any pending writes into our circular buffer, in case
|
||||
* we didn't in gs_start_tx() */
|
||||
tty_wakeup(port->port.tty);
|
||||
} else {
|
||||
gs_free_requests(ep, head, &port->read_allocated);
|
||||
|
@ -1258,6 +1258,12 @@ UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999,
|
||||
USB_SC_RBC, USB_PR_BULK, NULL,
|
||||
0 ),
|
||||
|
||||
UNUSUAL_DEV(0x090c, 0x1000, 0x1100, 0x1100,
|
||||
"Samsung",
|
||||
"Flash Drive FIT",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_MAX_SECTORS_64),
|
||||
|
||||
/* aeb */
|
||||
UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff,
|
||||
"Feiya",
|
||||
|
@ -1316,6 +1316,9 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font)
|
||||
static int vgacon_resize(struct vc_data *c, unsigned int width,
|
||||
unsigned int height, unsigned int user)
|
||||
{
|
||||
if ((width << 1) * height > vga_vram_size)
|
||||
return -EINVAL;
|
||||
|
||||
if (width % 2 || width > screen_info.orig_video_cols ||
|
||||
height > (screen_info.orig_video_lines * vga_default_font_height)/
|
||||
c->vc_font.height)
|
||||
|
@ -99,13 +99,6 @@ static int da9062_wdt_stop(struct watchdog_device *wdd)
|
||||
struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd);
|
||||
int ret;
|
||||
|
||||
ret = da9062_reset_watchdog_timer(wdt);
|
||||
if (ret) {
|
||||
dev_err(wdt->hw->dev, "Failed to ping the watchdog (err = %d)\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(wdt->hw->regmap,
|
||||
DA9062AA_CONTROL_D,
|
||||
DA9062AA_TWDSCALE_MASK,
|
||||
|
@ -2003,6 +2003,7 @@ int cifs_revalidate_dentry_attr(struct dentry *dentry)
|
||||
struct inode *inode = d_inode(dentry);
|
||||
struct super_block *sb = dentry->d_sb;
|
||||
char *full_path = NULL;
|
||||
int count = 0;
|
||||
|
||||
if (inode == NULL)
|
||||
return -ENOENT;
|
||||
@ -2024,15 +2025,18 @@ int cifs_revalidate_dentry_attr(struct dentry *dentry)
|
||||
full_path, inode, inode->i_count.counter,
|
||||
dentry, cifs_get_time(dentry), jiffies);
|
||||
|
||||
again:
|
||||
if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext)
|
||||
rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
|
||||
else
|
||||
rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
|
||||
xid, NULL);
|
||||
|
||||
if (rc == -EAGAIN && count++ < 10)
|
||||
goto again;
|
||||
out:
|
||||
kfree(full_path);
|
||||
free_xid(xid);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -743,6 +743,13 @@ static struct inode *fat_alloc_inode(struct super_block *sb)
|
||||
return NULL;
|
||||
|
||||
init_rwsem(&ei->truncate_lock);
|
||||
/* Zeroing to allow iput() even if partial initialized inode. */
|
||||
ei->mmu_private = 0;
|
||||
ei->i_start = 0;
|
||||
ei->i_logstart = 0;
|
||||
ei->i_attrs = 0;
|
||||
ei->i_pos = 0;
|
||||
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
@ -1373,16 +1380,6 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fat_dummy_inode_init(struct inode *inode)
|
||||
{
|
||||
/* Initialize this dummy inode to work as no-op. */
|
||||
MSDOS_I(inode)->mmu_private = 0;
|
||||
MSDOS_I(inode)->i_start = 0;
|
||||
MSDOS_I(inode)->i_logstart = 0;
|
||||
MSDOS_I(inode)->i_attrs = 0;
|
||||
MSDOS_I(inode)->i_pos = 0;
|
||||
}
|
||||
|
||||
static int fat_read_root(struct inode *inode)
|
||||
{
|
||||
struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
|
||||
@ -1827,13 +1824,11 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
|
||||
fat_inode = new_inode(sb);
|
||||
if (!fat_inode)
|
||||
goto out_fail;
|
||||
fat_dummy_inode_init(fat_inode);
|
||||
sbi->fat_inode = fat_inode;
|
||||
|
||||
fsinfo_inode = new_inode(sb);
|
||||
if (!fsinfo_inode)
|
||||
goto out_fail;
|
||||
fat_dummy_inode_init(fsinfo_inode);
|
||||
fsinfo_inode->i_ino = MSDOS_FSINFO_INO;
|
||||
sbi->fsinfo_inode = fsinfo_inode;
|
||||
insert_inode_hash(fsinfo_inode);
|
||||
|
@ -625,6 +625,18 @@ void wait_for_kprobe_optimizer(void)
|
||||
mutex_unlock(&kprobe_mutex);
|
||||
}
|
||||
|
||||
static bool optprobe_queued_unopt(struct optimized_kprobe *op)
|
||||
{
|
||||
struct optimized_kprobe *_op;
|
||||
|
||||
list_for_each_entry(_op, &unoptimizing_list, list) {
|
||||
if (op == _op)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Optimize kprobe if p is ready to be optimized */
|
||||
static void optimize_kprobe(struct kprobe *p)
|
||||
{
|
||||
@ -646,17 +658,21 @@ static void optimize_kprobe(struct kprobe *p)
|
||||
return;
|
||||
|
||||
/* Check if it is already optimized. */
|
||||
if (op->kp.flags & KPROBE_FLAG_OPTIMIZED)
|
||||
if (op->kp.flags & KPROBE_FLAG_OPTIMIZED) {
|
||||
if (optprobe_queued_unopt(op)) {
|
||||
/* This is under unoptimizing. Just dequeue the probe */
|
||||
list_del_init(&op->list);
|
||||
}
|
||||
return;
|
||||
}
|
||||
op->kp.flags |= KPROBE_FLAG_OPTIMIZED;
|
||||
|
||||
if (!list_empty(&op->list))
|
||||
/* This is under unoptimizing. Just dequeue the probe */
|
||||
list_del_init(&op->list);
|
||||
else {
|
||||
list_add(&op->list, &optimizing_list);
|
||||
kick_kprobe_optimizer();
|
||||
}
|
||||
/* On unoptimizing/optimizing_list, op must have OPTIMIZED flag */
|
||||
if (WARN_ON_ONCE(!list_empty(&op->list)))
|
||||
return;
|
||||
|
||||
list_add(&op->list, &optimizing_list);
|
||||
kick_kprobe_optimizer();
|
||||
}
|
||||
|
||||
/* Short cut to direct unoptimizing */
|
||||
@ -678,30 +694,33 @@ static void unoptimize_kprobe(struct kprobe *p, bool force)
|
||||
return; /* This is not an optprobe nor optimized */
|
||||
|
||||
op = container_of(p, struct optimized_kprobe, kp);
|
||||
if (!kprobe_optimized(p)) {
|
||||
/* Unoptimized or unoptimizing case */
|
||||
if (force && !list_empty(&op->list)) {
|
||||
/*
|
||||
* Only if this is unoptimizing kprobe and forced,
|
||||
* forcibly unoptimize it. (No need to unoptimize
|
||||
* unoptimized kprobe again :)
|
||||
*/
|
||||
if (!kprobe_optimized(p))
|
||||
return;
|
||||
|
||||
if (!list_empty(&op->list)) {
|
||||
if (optprobe_queued_unopt(op)) {
|
||||
/* Queued in unoptimizing queue */
|
||||
if (force) {
|
||||
/*
|
||||
* Forcibly unoptimize the kprobe here, and queue it
|
||||
* in the freeing list for release afterwards.
|
||||
*/
|
||||
force_unoptimize_kprobe(op);
|
||||
list_move(&op->list, &freeing_list);
|
||||
}
|
||||
} else {
|
||||
/* Dequeue from the optimizing queue */
|
||||
list_del_init(&op->list);
|
||||
force_unoptimize_kprobe(op);
|
||||
op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!list_empty(&op->list)) {
|
||||
/* Dequeue from the optimization queue */
|
||||
list_del_init(&op->list);
|
||||
return;
|
||||
}
|
||||
/* Optimized kprobe case */
|
||||
if (force)
|
||||
if (force) {
|
||||
/* Forcibly update the code: this is a special case */
|
||||
force_unoptimize_kprobe(op);
|
||||
else {
|
||||
} else {
|
||||
list_add(&op->list, &unoptimizing_list);
|
||||
kick_kprobe_optimizer();
|
||||
}
|
||||
|
@ -2950,8 +2950,7 @@ void set_pmd_migration_entry(struct page_vma_mapped_walk *pvmw,
|
||||
return;
|
||||
|
||||
flush_cache_range(vma, address, address + HPAGE_PMD_SIZE);
|
||||
pmdval = *pvmw->pmd;
|
||||
pmdp_invalidate(vma, address, pvmw->pmd);
|
||||
pmdval = pmdp_invalidate(vma, address, pvmw->pmd);
|
||||
if (pmd_dirty(pmdval))
|
||||
set_page_dirty(page);
|
||||
entry = make_migration_entry(page, pmd_write(pmdval));
|
||||
|
@ -162,6 +162,31 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
|
||||
return pages;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used when setting automatic NUMA hinting protection where it is
|
||||
* critical that a numa hinting PMD is not confused with a bad PMD.
|
||||
*/
|
||||
static inline int pmd_none_or_clear_bad_unless_trans_huge(pmd_t *pmd)
|
||||
{
|
||||
pmd_t pmdval = pmd_read_atomic(pmd);
|
||||
|
||||
/* See pmd_none_or_trans_huge_or_clear_bad for info on barrier */
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
barrier();
|
||||
#endif
|
||||
|
||||
if (pmd_none(pmdval))
|
||||
return 1;
|
||||
if (pmd_trans_huge(pmdval))
|
||||
return 0;
|
||||
if (unlikely(pmd_bad(pmdval))) {
|
||||
pmd_clear_bad(pmd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
|
||||
pud_t *pud, unsigned long addr, unsigned long end,
|
||||
pgprot_t newprot, int dirty_accountable, int prot_numa)
|
||||
@ -178,8 +203,17 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
|
||||
unsigned long this_pages;
|
||||
|
||||
next = pmd_addr_end(addr, end);
|
||||
if (!is_swap_pmd(*pmd) && !pmd_trans_huge(*pmd) && !pmd_devmap(*pmd)
|
||||
&& pmd_none_or_clear_bad(pmd))
|
||||
|
||||
/*
|
||||
* Automatic NUMA balancing walks the tables with mmap_sem
|
||||
* held for read. It's possible a parallel update to occur
|
||||
* between pmd_trans_huge() and a pmd_none_or_clear_bad()
|
||||
* check leading to a false positive and clearing.
|
||||
* Hence, it's necessary to atomically read the PMD value
|
||||
* for all the checks.
|
||||
*/
|
||||
if (!is_swap_pmd(*pmd) && !pmd_devmap(*pmd) &&
|
||||
pmd_none_or_clear_bad_unless_trans_huge(pmd))
|
||||
goto next;
|
||||
|
||||
/* invoke the mmu notifier if the pmd is populated */
|
||||
|
@ -262,6 +262,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all);
|
||||
int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
|
||||
struct hdac_ext_link *link)
|
||||
{
|
||||
unsigned long codec_mask;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&bus->lock);
|
||||
@ -283,9 +284,11 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
|
||||
* HDA spec section 4.3 - Codec Discovery
|
||||
*/
|
||||
udelay(521);
|
||||
bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", bus->codec_mask);
|
||||
snd_hdac_chip_writew(bus, STATESTS, bus->codec_mask);
|
||||
codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", codec_mask);
|
||||
snd_hdac_chip_writew(bus, STATESTS, codec_mask);
|
||||
if (!bus->codec_mask)
|
||||
bus->codec_mask = codec_mask;
|
||||
}
|
||||
|
||||
mutex_unlock(&bus->lock);
|
||||
|
@ -2442,6 +2442,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
|
||||
@ -6465,6 +6466,8 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_speaker2_to_dac1,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI
|
||||
},
|
||||
[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
@ -6886,6 +6889,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
|
||||
SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
|
||||
SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
|
||||
SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
||||
|
@ -1437,13 +1437,15 @@ int pcm512x_probe(struct device *dev, struct regmap *regmap)
|
||||
}
|
||||
|
||||
pcm512x->sclk = devm_clk_get(dev, NULL);
|
||||
if (PTR_ERR(pcm512x->sclk) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
if (PTR_ERR(pcm512x->sclk) == -EPROBE_DEFER) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto err;
|
||||
}
|
||||
if (!IS_ERR(pcm512x->sclk)) {
|
||||
ret = clk_prepare_enable(pcm512x->sclk);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to enable SCLK: %d\n", ret);
|
||||
return ret;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,8 +42,8 @@ static ssize_t skl_print_pins(struct skl_module_pin *m_pin, char *buf,
|
||||
int i;
|
||||
ssize_t ret = 0;
|
||||
|
||||
for (i = 0; i < max_pin; i++)
|
||||
ret += snprintf(buf + size, MOD_BUF - size,
|
||||
for (i = 0; i < max_pin; i++) {
|
||||
ret += scnprintf(buf + size, MOD_BUF - size,
|
||||
"%s %d\n\tModule %d\n\tInstance %d\n\t"
|
||||
"In-used %s\n\tType %s\n"
|
||||
"\tState %d\n\tIndex %d\n",
|
||||
@ -53,13 +53,15 @@ static ssize_t skl_print_pins(struct skl_module_pin *m_pin, char *buf,
|
||||
m_pin[i].in_use ? "Used" : "Unused",
|
||||
m_pin[i].is_dynamic ? "Dynamic" : "Static",
|
||||
m_pin[i].pin_state, i);
|
||||
size += ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t skl_print_fmt(struct skl_module_fmt *fmt, char *buf,
|
||||
ssize_t size, bool direction)
|
||||
{
|
||||
return snprintf(buf + size, MOD_BUF - size,
|
||||
return scnprintf(buf + size, MOD_BUF - size,
|
||||
"%s\n\tCh %d\n\tFreq %d\n\tBit depth %d\n\t"
|
||||
"Valid bit depth %d\n\tCh config %#x\n\tInterleaving %d\n\t"
|
||||
"Sample Type %d\n\tCh Map %#x\n",
|
||||
@ -81,16 +83,16 @@ static ssize_t module_read(struct file *file, char __user *user_buf,
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = snprintf(buf, MOD_BUF, "Module:\n\tUUID %pUL\n\tModule id %d\n"
|
||||
ret = scnprintf(buf, MOD_BUF, "Module:\n\tUUID %pUL\n\tModule id %d\n"
|
||||
"\tInstance id %d\n\tPvt_id %d\n", mconfig->guid,
|
||||
mconfig->id.module_id, mconfig->id.instance_id,
|
||||
mconfig->id.pvt_id);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Resources:\n\tMCPS %#x\n\tIBS %#x\n\tOBS %#x\t\n",
|
||||
mconfig->mcps, mconfig->ibs, mconfig->obs);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Module data:\n\tCore %d\n\tIn queue %d\n\t"
|
||||
"Out queue %d\n\tType %s\n",
|
||||
mconfig->core_id, mconfig->max_in_queue,
|
||||
@ -100,38 +102,38 @@ static ssize_t module_read(struct file *file, char __user *user_buf,
|
||||
ret += skl_print_fmt(mconfig->in_fmt, buf, ret, true);
|
||||
ret += skl_print_fmt(mconfig->out_fmt, buf, ret, false);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Fixup:\n\tParams %#x\n\tConverter %#x\n",
|
||||
mconfig->params_fixup, mconfig->converter);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Module Gateway:\n\tType %#x\n\tVbus %#x\n\tHW conn %#x\n\tSlot %#x\n",
|
||||
mconfig->dev_type, mconfig->vbus_id,
|
||||
mconfig->hw_conn_type, mconfig->time_slot);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Pipeline:\n\tID %d\n\tPriority %d\n\tConn Type %d\n\t"
|
||||
"Pages %#x\n", mconfig->pipe->ppl_id,
|
||||
mconfig->pipe->pipe_priority, mconfig->pipe->conn_type,
|
||||
mconfig->pipe->memory_pages);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"\tParams:\n\t\tHost DMA %d\n\t\tLink DMA %d\n",
|
||||
mconfig->pipe->p_params->host_dma_id,
|
||||
mconfig->pipe->p_params->link_dma_id);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"\tPCM params:\n\t\tCh %d\n\t\tFreq %d\n\t\tFormat %d\n",
|
||||
mconfig->pipe->p_params->ch,
|
||||
mconfig->pipe->p_params->s_freq,
|
||||
mconfig->pipe->p_params->s_fmt);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"\tLink %#x\n\tStream %#x\n",
|
||||
mconfig->pipe->p_params->linktype,
|
||||
mconfig->pipe->p_params->stream);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"\tState %d\n\tPassthru %s\n",
|
||||
mconfig->pipe->state,
|
||||
mconfig->pipe->passthru ? "true" : "false");
|
||||
@ -141,7 +143,7 @@ static ssize_t module_read(struct file *file, char __user *user_buf,
|
||||
ret += skl_print_pins(mconfig->m_out_pin, buf,
|
||||
mconfig->max_out_queue, ret, false);
|
||||
|
||||
ret += snprintf(buf + ret, MOD_BUF - ret,
|
||||
ret += scnprintf(buf + ret, MOD_BUF - ret,
|
||||
"Other:\n\tDomain %d\n\tHomogeneous Input %s\n\t"
|
||||
"Homogeneous Output %s\n\tIn Queue Mask %d\n\t"
|
||||
"Out Queue Mask %d\n\tDMA ID %d\n\tMem Pages %d\n\t"
|
||||
@ -199,7 +201,7 @@ static ssize_t fw_softreg_read(struct file *file, char __user *user_buf,
|
||||
__ioread32_copy(d->fw_read_buff, fw_reg_addr, w0_stat_sz >> 2);
|
||||
|
||||
for (offset = 0; offset < FW_REG_SIZE; offset += 16) {
|
||||
ret += snprintf(tmp + ret, FW_REG_BUF - ret, "%#.4x: ", offset);
|
||||
ret += scnprintf(tmp + ret, FW_REG_BUF - ret, "%#.4x: ", offset);
|
||||
hex_dump_to_buffer(d->fw_read_buff + offset, 16, 16, 4,
|
||||
tmp + ret, FW_REG_BUF - ret, 0);
|
||||
ret += strlen(tmp + ret);
|
||||
|
@ -4551,7 +4551,7 @@ static void soc_dapm_shutdown_dapm(struct snd_soc_dapm_context *dapm)
|
||||
continue;
|
||||
if (w->power) {
|
||||
dapm_seq_insert(w, &down_list, false);
|
||||
w->power = 0;
|
||||
w->new_power = 0;
|
||||
powerdown = 1;
|
||||
}
|
||||
}
|
||||
|
@ -3357,16 +3357,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
ssize_t offset = 0;
|
||||
|
||||
/* FE state */
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"[%s - %s]\n", fe->dai_link->name,
|
||||
stream ? "Capture" : "Playback");
|
||||
|
||||
offset += snprintf(buf + offset, size - offset, "State: %s\n",
|
||||
offset += scnprintf(buf + offset, size - offset, "State: %s\n",
|
||||
dpcm_state_string(fe->dpcm[stream].state));
|
||||
|
||||
if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
||||
(fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"Hardware Params: "
|
||||
"Format = %s, Channels = %d, Rate = %d\n",
|
||||
snd_pcm_format_name(params_format(params)),
|
||||
@ -3374,10 +3374,10 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
params_rate(params));
|
||||
|
||||
/* BEs state */
|
||||
offset += snprintf(buf + offset, size - offset, "Backends:\n");
|
||||
offset += scnprintf(buf + offset, size - offset, "Backends:\n");
|
||||
|
||||
if (list_empty(&fe->dpcm[stream].be_clients)) {
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" No active DSP links\n");
|
||||
goto out;
|
||||
}
|
||||
@ -3386,16 +3386,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,
|
||||
struct snd_soc_pcm_runtime *be = dpcm->be;
|
||||
params = &dpcm->hw_params;
|
||||
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
"- %s\n", be->dai_link->name);
|
||||
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" State: %s\n",
|
||||
dpcm_state_string(be->dpcm[stream].state));
|
||||
|
||||
if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
||||
(be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP))
|
||||
offset += snprintf(buf + offset, size - offset,
|
||||
offset += scnprintf(buf + offset, size - offset,
|
||||
" Hardware Params: "
|
||||
"Format = %s, Channels = %d, Rate = %d\n",
|
||||
snd_pcm_format_name(params_format(params)),
|
||||
|
@ -2154,8 +2154,11 @@ static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
|
||||
}
|
||||
|
||||
ret = soc_tplg_link_config(tplg, _link);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
if (!abi_match)
|
||||
kfree(_link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* offset by version-specific struct size and
|
||||
* real priv data size
|
||||
@ -2310,7 +2313,7 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg,
|
||||
{
|
||||
struct snd_soc_tplg_manifest *manifest, *_manifest;
|
||||
bool abi_match;
|
||||
int err;
|
||||
int ret = 0;
|
||||
|
||||
if (tplg->pass != SOC_TPLG_PASS_MANIFEST)
|
||||
return 0;
|
||||
@ -2323,19 +2326,19 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg,
|
||||
_manifest = manifest;
|
||||
} else {
|
||||
abi_match = false;
|
||||
err = manifest_new_ver(tplg, manifest, &_manifest);
|
||||
if (err < 0)
|
||||
return err;
|
||||
ret = manifest_new_ver(tplg, manifest, &_manifest);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* pass control to component driver for optional further init */
|
||||
if (tplg->comp && tplg->ops && tplg->ops->manifest)
|
||||
return tplg->ops->manifest(tplg->comp, tplg->index, _manifest);
|
||||
ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest);
|
||||
|
||||
if (!abi_match) /* free the duplicated one */
|
||||
kfree(_manifest);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* validate header magic, size and type */
|
||||
|
@ -85,17 +85,20 @@ else
|
||||
$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
|
||||
endif
|
||||
|
||||
define INSTALL_SINGLE_RULE
|
||||
$(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
|
||||
$(if $(INSTALL_LIST),@echo rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
|
||||
$(if $(INSTALL_LIST),@rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
|
||||
endef
|
||||
|
||||
define INSTALL_RULE
|
||||
@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
|
||||
mkdir -p ${INSTALL_PATH}; \
|
||||
echo "rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/"; \
|
||||
rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/; \
|
||||
fi
|
||||
@if [ "X$(TEST_GEN_PROGS)$(TEST_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then \
|
||||
mkdir -p ${INSTALL_PATH}; \
|
||||
echo "rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/"; \
|
||||
rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/; \
|
||||
fi
|
||||
$(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
|
||||
endef
|
||||
|
||||
install: all
|
||||
|
@ -63,22 +63,23 @@ test_span_gre_mac()
|
||||
{
|
||||
local tundev=$1; shift
|
||||
local direction=$1; shift
|
||||
local prot=$1; shift
|
||||
local what=$1; shift
|
||||
|
||||
local swp3mac=$(mac_get $swp3)
|
||||
local h3mac=$(mac_get $h3)
|
||||
case "$direction" in
|
||||
ingress) local src_mac=$(mac_get $h1); local dst_mac=$(mac_get $h2)
|
||||
;;
|
||||
egress) local src_mac=$(mac_get $h2); local dst_mac=$(mac_get $h1)
|
||||
;;
|
||||
esac
|
||||
|
||||
RET=0
|
||||
|
||||
mirror_install $swp1 $direction $tundev "matchall $tcflags"
|
||||
tc filter add dev $h3 ingress pref 77 prot $prot \
|
||||
flower ip_proto 0x2f src_mac $swp3mac dst_mac $h3mac \
|
||||
action pass
|
||||
icmp_capture_install h3-${tundev} "src_mac $src_mac dst_mac $dst_mac"
|
||||
|
||||
mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10
|
||||
mirror_test v$h1 192.0.2.1 192.0.2.2 h3-${tundev} 100 10
|
||||
|
||||
tc filter del dev $h3 ingress pref 77
|
||||
icmp_capture_uninstall h3-${tundev}
|
||||
mirror_uninstall $swp1 $direction
|
||||
|
||||
log_test "$direction $what: envelope MAC ($tcflags)"
|
||||
@ -120,14 +121,14 @@ test_ip6gretap()
|
||||
|
||||
test_gretap_mac()
|
||||
{
|
||||
test_span_gre_mac gt4 ingress ip "mirror to gretap"
|
||||
test_span_gre_mac gt4 egress ip "mirror to gretap"
|
||||
test_span_gre_mac gt4 ingress "mirror to gretap"
|
||||
test_span_gre_mac gt4 egress "mirror to gretap"
|
||||
}
|
||||
|
||||
test_ip6gretap_mac()
|
||||
{
|
||||
test_span_gre_mac gt6 ingress ipv6 "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 egress ipv6 "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 ingress "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 egress "mirror to ip6gretap"
|
||||
}
|
||||
|
||||
test_all()
|
||||
|
Loading…
Reference in New Issue
Block a user