mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 01:02:19 +00:00
1575 lines
53 KiB
Diff
1575 lines
53 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 03d41143900c..169f3199274f 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 4
|
|
PATCHLEVEL = 14
|
|
-SUBLEVEL = 22
|
|
+SUBLEVEL = 23
|
|
EXTRAVERSION =
|
|
NAME = Petit Gorille
|
|
|
|
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
|
|
index 582142ae92e1..345d4e521191 100644
|
|
--- a/arch/arm64/kernel/cpufeature.c
|
|
+++ b/arch/arm64/kernel/cpufeature.c
|
|
@@ -175,9 +175,11 @@ static const struct arm64_ftr_bits ftr_id_aa64mmfr2[] = {
|
|
};
|
|
|
|
static const struct arm64_ftr_bits ftr_ctr[] = {
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RAO */
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 29, 1, 1), /* DIC */
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 28, 1, 1), /* IDC */
|
|
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 24, 4, 0), /* CWG */
|
|
- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0), /* ERG */
|
|
+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, 20, 4, 0), /* ERG */
|
|
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 1), /* DminLine */
|
|
/*
|
|
* Linux can handle differing I-cache policies. Userspace JITs will
|
|
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
|
|
index 8383af15a759..4fc0e958770b 100644
|
|
--- a/arch/arm64/kernel/traps.c
|
|
+++ b/arch/arm64/kernel/traps.c
|
|
@@ -56,7 +56,7 @@ static const char *handler[]= {
|
|
"Error"
|
|
};
|
|
|
|
-int show_unhandled_signals = 1;
|
|
+int show_unhandled_signals = 0;
|
|
|
|
/*
|
|
* Dump out the contents of some kernel memory nicely...
|
|
@@ -573,14 +573,6 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs)
|
|
}
|
|
#endif
|
|
|
|
- if (show_unhandled_signals_ratelimited()) {
|
|
- pr_info("%s[%d]: syscall %d\n", current->comm,
|
|
- task_pid_nr(current), regs->syscallno);
|
|
- dump_instr("", regs);
|
|
- if (user_mode(regs))
|
|
- __show_regs(regs);
|
|
- }
|
|
-
|
|
return sys_ni_syscall();
|
|
}
|
|
|
|
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
|
|
index 329a1c43365e..139320a7f7a2 100644
|
|
--- a/arch/arm64/mm/proc.S
|
|
+++ b/arch/arm64/mm/proc.S
|
|
@@ -155,7 +155,7 @@ ENDPROC(cpu_do_switch_mm)
|
|
|
|
.macro __idmap_cpu_set_reserved_ttbr1, tmp1, tmp2
|
|
adrp \tmp1, empty_zero_page
|
|
- msr ttbr1_el1, \tmp2
|
|
+ msr ttbr1_el1, \tmp1
|
|
isb
|
|
tlbi vmalle1
|
|
dsb nsh
|
|
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig
|
|
index 0d9446c37ae8..498398d915c1 100644
|
|
--- a/arch/m32r/Kconfig
|
|
+++ b/arch/m32r/Kconfig
|
|
@@ -196,8 +196,8 @@ config TIMER_DIVIDE
|
|
default "128"
|
|
|
|
config CPU_BIG_ENDIAN
|
|
- bool "Generate big endian code"
|
|
- default n
|
|
+ bool
|
|
+ default !CPU_LITTLE_ENDIAN
|
|
|
|
config CPU_LITTLE_ENDIAN
|
|
bool "Generate little endian code"
|
|
diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
|
|
index 830ee7d42fa0..d269dd4b8279 100644
|
|
--- a/arch/microblaze/Makefile
|
|
+++ b/arch/microblaze/Makefile
|
|
@@ -36,16 +36,21 @@ endif
|
|
CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_DIV) += -mno-xl-soft-div
|
|
CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_BARREL) += -mxl-barrel-shift
|
|
CPUFLAGS-$(CONFIG_XILINX_MICROBLAZE0_USE_PCMP_INSTR) += -mxl-pattern-compare
|
|
-CPUFLAGS-$(CONFIG_BIG_ENDIAN) += -mbig-endian
|
|
-CPUFLAGS-$(CONFIG_LITTLE_ENDIAN) += -mlittle-endian
|
|
+
|
|
+ifdef CONFIG_CPU_BIG_ENDIAN
|
|
+KBUILD_CFLAGS += -mbig-endian
|
|
+KBUILD_AFLAGS += -mbig-endian
|
|
+LD += -EB
|
|
+else
|
|
+KBUILD_CFLAGS += -mlittle-endian
|
|
+KBUILD_AFLAGS += -mlittle-endian
|
|
+LD += -EL
|
|
+endif
|
|
|
|
CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
|
|
|
|
# r31 holds current when in kernel mode
|
|
-KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-1) $(CPUFLAGS-2)
|
|
-
|
|
-LDFLAGS :=
|
|
-LDFLAGS_vmlinux :=
|
|
+KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-y) $(CPUFLAGS-1) $(CPUFLAGS-2)
|
|
|
|
head-y := arch/microblaze/kernel/head.o
|
|
libs-y += arch/microblaze/lib/
|
|
diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile
|
|
index 1bd5c4f00d19..c22da16d67b8 100644
|
|
--- a/arch/mips/boot/Makefile
|
|
+++ b/arch/mips/boot/Makefile
|
|
@@ -126,6 +126,7 @@ $(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS
|
|
|
|
quiet_cmd_cpp_its_S = ITS $@
|
|
cmd_cpp_its_S = $(CPP) $(cpp_flags) -P -C -o $@ $< \
|
|
+ -D__ASSEMBLY__ \
|
|
-DKERNEL_NAME="\"Linux $(KERNELRELEASE)\"" \
|
|
-DVMLINUX_BINARY="\"$(3)\"" \
|
|
-DVMLINUX_COMPRESSION="\"$(2)\"" \
|
|
diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h
|
|
index 49691331ada4..08ec0762ca50 100644
|
|
--- a/arch/mips/include/asm/compat.h
|
|
+++ b/arch/mips/include/asm/compat.h
|
|
@@ -86,7 +86,6 @@ struct compat_flock {
|
|
compat_off_t l_len;
|
|
s32 l_sysid;
|
|
compat_pid_t l_pid;
|
|
- short __unused;
|
|
s32 pad[4];
|
|
};
|
|
|
|
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
|
|
index ffdbc4836b4f..abff76bda9e6 100644
|
|
--- a/arch/x86/oprofile/nmi_int.c
|
|
+++ b/arch/x86/oprofile/nmi_int.c
|
|
@@ -460,7 +460,7 @@ static int nmi_setup(void)
|
|
goto fail;
|
|
|
|
for_each_possible_cpu(cpu) {
|
|
- if (!cpu)
|
|
+ if (!IS_ENABLED(CONFIG_SMP) || !cpu)
|
|
continue;
|
|
|
|
memcpy(per_cpu(cpu_msrs, cpu).counters,
|
|
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c
|
|
index 720fe4e8b497..8dad076661fc 100644
|
|
--- a/arch/xtensa/mm/init.c
|
|
+++ b/arch/xtensa/mm/init.c
|
|
@@ -79,19 +79,75 @@ void __init zones_init(void)
|
|
free_area_init_node(0, zones_size, ARCH_PFN_OFFSET, NULL);
|
|
}
|
|
|
|
+#ifdef CONFIG_HIGHMEM
|
|
+static void __init free_area_high(unsigned long pfn, unsigned long end)
|
|
+{
|
|
+ for (; pfn < end; pfn++)
|
|
+ free_highmem_page(pfn_to_page(pfn));
|
|
+}
|
|
+
|
|
+static void __init free_highpages(void)
|
|
+{
|
|
+ unsigned long max_low = max_low_pfn;
|
|
+ struct memblock_region *mem, *res;
|
|
+
|
|
+ reset_all_zones_managed_pages();
|
|
+ /* set highmem page free */
|
|
+ for_each_memblock(memory, mem) {
|
|
+ unsigned long start = memblock_region_memory_base_pfn(mem);
|
|
+ unsigned long end = memblock_region_memory_end_pfn(mem);
|
|
+
|
|
+ /* Ignore complete lowmem entries */
|
|
+ if (end <= max_low)
|
|
+ continue;
|
|
+
|
|
+ if (memblock_is_nomap(mem))
|
|
+ continue;
|
|
+
|
|
+ /* Truncate partial highmem entries */
|
|
+ if (start < max_low)
|
|
+ start = max_low;
|
|
+
|
|
+ /* Find and exclude any reserved regions */
|
|
+ for_each_memblock(reserved, res) {
|
|
+ unsigned long res_start, res_end;
|
|
+
|
|
+ res_start = memblock_region_reserved_base_pfn(res);
|
|
+ res_end = memblock_region_reserved_end_pfn(res);
|
|
+
|
|
+ if (res_end < start)
|
|
+ continue;
|
|
+ if (res_start < start)
|
|
+ res_start = start;
|
|
+ if (res_start > end)
|
|
+ res_start = end;
|
|
+ if (res_end > end)
|
|
+ res_end = end;
|
|
+ if (res_start != start)
|
|
+ free_area_high(start, res_start);
|
|
+ start = res_end;
|
|
+ if (start == end)
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* And now free anything which remains */
|
|
+ if (start < end)
|
|
+ free_area_high(start, end);
|
|
+ }
|
|
+}
|
|
+#else
|
|
+static void __init free_highpages(void)
|
|
+{
|
|
+}
|
|
+#endif
|
|
+
|
|
/*
|
|
* Initialize memory pages.
|
|
*/
|
|
|
|
void __init mem_init(void)
|
|
{
|
|
-#ifdef CONFIG_HIGHMEM
|
|
- unsigned long tmp;
|
|
-
|
|
- reset_all_zones_managed_pages();
|
|
- for (tmp = max_low_pfn; tmp < max_pfn; tmp++)
|
|
- free_highmem_page(pfn_to_page(tmp));
|
|
-#endif
|
|
+ free_highpages();
|
|
|
|
max_mapnr = max_pfn - ARCH_PFN_OFFSET;
|
|
high_memory = (void *)__va(max_low_pfn << PAGE_SHIFT);
|
|
diff --git a/crypto/asymmetric_keys/pkcs7_verify.c b/crypto/asymmetric_keys/pkcs7_verify.c
|
|
index 986033e64a83..a18295651077 100644
|
|
--- a/crypto/asymmetric_keys/pkcs7_verify.c
|
|
+++ b/crypto/asymmetric_keys/pkcs7_verify.c
|
|
@@ -273,7 +273,7 @@ static int pkcs7_verify_sig_chain(struct pkcs7_message *pkcs7,
|
|
sinfo->index);
|
|
return 0;
|
|
}
|
|
- ret = public_key_verify_signature(p->pub, p->sig);
|
|
+ ret = public_key_verify_signature(p->pub, x509->sig);
|
|
if (ret < 0)
|
|
return ret;
|
|
x509->signer = p;
|
|
@@ -369,8 +369,7 @@ static int pkcs7_verify_one(struct pkcs7_message *pkcs7,
|
|
*
|
|
* (*) -EBADMSG if some part of the message was invalid, or:
|
|
*
|
|
- * (*) 0 if no signature chains were found to be blacklisted or to contain
|
|
- * unsupported crypto, or:
|
|
+ * (*) 0 if a signature chain passed verification, or:
|
|
*
|
|
* (*) -EKEYREJECTED if a blacklisted key was encountered, or:
|
|
*
|
|
@@ -426,8 +425,11 @@ int pkcs7_verify(struct pkcs7_message *pkcs7,
|
|
|
|
for (sinfo = pkcs7->signed_infos; sinfo; sinfo = sinfo->next) {
|
|
ret = pkcs7_verify_one(pkcs7, sinfo);
|
|
- if (sinfo->blacklisted && actual_ret == -ENOPKG)
|
|
- actual_ret = -EKEYREJECTED;
|
|
+ if (sinfo->blacklisted) {
|
|
+ if (actual_ret == -ENOPKG)
|
|
+ actual_ret = -EKEYREJECTED;
|
|
+ continue;
|
|
+ }
|
|
if (ret < 0) {
|
|
if (ret == -ENOPKG) {
|
|
sinfo->unsupported_crypto = true;
|
|
diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c
|
|
index 3cd6e12cfc46..d1af69d2ff85 100644
|
|
--- a/crypto/asymmetric_keys/public_key.c
|
|
+++ b/crypto/asymmetric_keys/public_key.c
|
|
@@ -93,9 +93,11 @@ int public_key_verify_signature(const struct public_key *pkey,
|
|
|
|
BUG_ON(!pkey);
|
|
BUG_ON(!sig);
|
|
- BUG_ON(!sig->digest);
|
|
BUG_ON(!sig->s);
|
|
|
|
+ if (!sig->digest)
|
|
+ return -ENOPKG;
|
|
+
|
|
alg_name = sig->pkey_algo;
|
|
if (strcmp(sig->pkey_algo, "rsa") == 0) {
|
|
/* The data wangled by the RSA algorithm is typically padded
|
|
diff --git a/crypto/asymmetric_keys/restrict.c b/crypto/asymmetric_keys/restrict.c
|
|
index 86fb68508952..7c93c7728454 100644
|
|
--- a/crypto/asymmetric_keys/restrict.c
|
|
+++ b/crypto/asymmetric_keys/restrict.c
|
|
@@ -67,8 +67,9 @@ __setup("ca_keys=", ca_keys_setup);
|
|
*
|
|
* Returns 0 if the new certificate was accepted, -ENOKEY if we couldn't find a
|
|
* matching parent certificate in the trusted list, -EKEYREJECTED if the
|
|
- * signature check fails or the key is blacklisted and some other error if
|
|
- * there is a matching certificate but the signature check cannot be performed.
|
|
+ * signature check fails or the key is blacklisted, -ENOPKG if the signature
|
|
+ * uses unsupported crypto, or some other error if there is a matching
|
|
+ * certificate but the signature check cannot be performed.
|
|
*/
|
|
int restrict_link_by_signature(struct key *dest_keyring,
|
|
const struct key_type *type,
|
|
@@ -88,6 +89,8 @@ int restrict_link_by_signature(struct key *dest_keyring,
|
|
return -EOPNOTSUPP;
|
|
|
|
sig = payload->data[asym_auth];
|
|
+ if (!sig)
|
|
+ return -ENOPKG;
|
|
if (!sig->auth_ids[0] && !sig->auth_ids[1])
|
|
return -ENOKEY;
|
|
|
|
@@ -139,6 +142,8 @@ static int key_or_keyring_common(struct key *dest_keyring,
|
|
return -EOPNOTSUPP;
|
|
|
|
sig = payload->data[asym_auth];
|
|
+ if (!sig)
|
|
+ return -ENOPKG;
|
|
if (!sig->auth_ids[0] && !sig->auth_ids[1])
|
|
return -ENOKEY;
|
|
|
|
@@ -222,9 +227,9 @@ static int key_or_keyring_common(struct key *dest_keyring,
|
|
*
|
|
* Returns 0 if the new certificate was accepted, -ENOKEY if we
|
|
* couldn't find a matching parent certificate in the trusted list,
|
|
- * -EKEYREJECTED if the signature check fails, and some other error if
|
|
- * there is a matching certificate but the signature check cannot be
|
|
- * performed.
|
|
+ * -EKEYREJECTED if the signature check fails, -ENOPKG if the signature uses
|
|
+ * unsupported crypto, or some other error if there is a matching certificate
|
|
+ * but the signature check cannot be performed.
|
|
*/
|
|
int restrict_link_by_key_or_keyring(struct key *dest_keyring,
|
|
const struct key_type *type,
|
|
@@ -249,9 +254,9 @@ int restrict_link_by_key_or_keyring(struct key *dest_keyring,
|
|
*
|
|
* Returns 0 if the new certificate was accepted, -ENOKEY if we
|
|
* couldn't find a matching parent certificate in the trusted list,
|
|
- * -EKEYREJECTED if the signature check fails, and some other error if
|
|
- * there is a matching certificate but the signature check cannot be
|
|
- * performed.
|
|
+ * -EKEYREJECTED if the signature check fails, -ENOPKG if the signature uses
|
|
+ * unsupported crypto, or some other error if there is a matching certificate
|
|
+ * but the signature check cannot be performed.
|
|
*/
|
|
int restrict_link_by_key_or_keyring_chain(struct key *dest_keyring,
|
|
const struct key_type *type,
|
|
diff --git a/drivers/extcon/extcon-intel-int3496.c b/drivers/extcon/extcon-intel-int3496.c
|
|
index 1a45e745717d..a6661097b2f9 100644
|
|
--- a/drivers/extcon/extcon-intel-int3496.c
|
|
+++ b/drivers/extcon/extcon-intel-int3496.c
|
|
@@ -153,8 +153,9 @@ static int int3496_probe(struct platform_device *pdev)
|
|
return ret;
|
|
}
|
|
|
|
- /* queue initial processing of id-pin */
|
|
+ /* process id-pin so that we start with the right status */
|
|
queue_delayed_work(system_wq, &data->work, 0);
|
|
+ flush_delayed_work(&data->work);
|
|
|
|
platform_set_drvdata(pdev, data);
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
|
|
index c13c51af0b68..c53095b3b0fb 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
|
|
@@ -14,6 +14,16 @@
|
|
|
|
#include "amd_acpi.h"
|
|
|
|
+#define AMDGPU_PX_QUIRK_FORCE_ATPX (1 << 0)
|
|
+
|
|
+struct amdgpu_px_quirk {
|
|
+ u32 chip_vendor;
|
|
+ u32 chip_device;
|
|
+ u32 subsys_vendor;
|
|
+ u32 subsys_device;
|
|
+ u32 px_quirk_flags;
|
|
+};
|
|
+
|
|
struct amdgpu_atpx_functions {
|
|
bool px_params;
|
|
bool power_cntl;
|
|
@@ -35,6 +45,7 @@ struct amdgpu_atpx {
|
|
static struct amdgpu_atpx_priv {
|
|
bool atpx_detected;
|
|
bool bridge_pm_usable;
|
|
+ unsigned int quirks;
|
|
/* handle for device - and atpx */
|
|
acpi_handle dhandle;
|
|
acpi_handle other_handle;
|
|
@@ -205,13 +216,19 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
|
|
|
|
atpx->is_hybrid = false;
|
|
if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
|
|
- printk("ATPX Hybrid Graphics\n");
|
|
- /*
|
|
- * Disable legacy PM methods only when pcie port PM is usable,
|
|
- * otherwise the device might fail to power off or power on.
|
|
- */
|
|
- atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;
|
|
- atpx->is_hybrid = true;
|
|
+ if (amdgpu_atpx_priv.quirks & AMDGPU_PX_QUIRK_FORCE_ATPX) {
|
|
+ printk("ATPX Hybrid Graphics, forcing to ATPX\n");
|
|
+ atpx->functions.power_cntl = true;
|
|
+ atpx->is_hybrid = false;
|
|
+ } else {
|
|
+ printk("ATPX Hybrid Graphics\n");
|
|
+ /*
|
|
+ * Disable legacy PM methods only when pcie port PM is usable,
|
|
+ * otherwise the device might fail to power off or power on.
|
|
+ */
|
|
+ atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;
|
|
+ atpx->is_hybrid = true;
|
|
+ }
|
|
}
|
|
|
|
atpx->dgpu_req_power_for_displays = false;
|
|
@@ -547,6 +564,31 @@ static const struct vga_switcheroo_handler amdgpu_atpx_handler = {
|
|
.get_client_id = amdgpu_atpx_get_client_id,
|
|
};
|
|
|
|
+static const struct amdgpu_px_quirk amdgpu_px_quirk_list[] = {
|
|
+ /* HG _PR3 doesn't seem to work on this A+A weston board */
|
|
+ { 0x1002, 0x6900, 0x1002, 0x0124, AMDGPU_PX_QUIRK_FORCE_ATPX },
|
|
+ { 0x1002, 0x6900, 0x1028, 0x0812, AMDGPU_PX_QUIRK_FORCE_ATPX },
|
|
+ { 0x1002, 0x6900, 0x1028, 0x0813, AMDGPU_PX_QUIRK_FORCE_ATPX },
|
|
+ { 0, 0, 0, 0, 0 },
|
|
+};
|
|
+
|
|
+static void amdgpu_atpx_get_quirks(struct pci_dev *pdev)
|
|
+{
|
|
+ const struct amdgpu_px_quirk *p = amdgpu_px_quirk_list;
|
|
+
|
|
+ /* Apply PX quirks */
|
|
+ while (p && p->chip_device != 0) {
|
|
+ if (pdev->vendor == p->chip_vendor &&
|
|
+ pdev->device == p->chip_device &&
|
|
+ pdev->subsystem_vendor == p->subsys_vendor &&
|
|
+ pdev->subsystem_device == p->subsys_device) {
|
|
+ amdgpu_atpx_priv.quirks |= p->px_quirk_flags;
|
|
+ break;
|
|
+ }
|
|
+ ++p;
|
|
+ }
|
|
+}
|
|
+
|
|
/**
|
|
* amdgpu_atpx_detect - detect whether we have PX
|
|
*
|
|
@@ -570,6 +612,7 @@ static bool amdgpu_atpx_detect(void)
|
|
|
|
parent_pdev = pci_upstream_bridge(pdev);
|
|
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
|
+ amdgpu_atpx_get_quirks(pdev);
|
|
}
|
|
|
|
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
|
|
@@ -579,6 +622,7 @@ static bool amdgpu_atpx_detect(void)
|
|
|
|
parent_pdev = pci_upstream_bridge(pdev);
|
|
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
|
|
+ amdgpu_atpx_get_quirks(pdev);
|
|
}
|
|
|
|
if (has_atpx && vga_count == 2) {
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
index e630d918fefc..bc746a6e0ecc 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
|
@@ -2076,8 +2076,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|
* ignore it */
|
|
vga_client_register(adev->pdev, adev, NULL, amdgpu_vga_set_decode);
|
|
|
|
- if (amdgpu_runtime_pm == 1)
|
|
- runtime = true;
|
|
if (amdgpu_device_is_px(ddev))
|
|
runtime = true;
|
|
if (!pci_is_thunderbolt_attached(adev->pdev))
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
|
|
index d63873f3f574..a2aeb643ac51 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
|
|
@@ -3465,6 +3465,11 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev,
|
|
(adev->pdev->device == 0x6667)) {
|
|
max_sclk = 75000;
|
|
}
|
|
+ if ((adev->pdev->revision == 0xC3) ||
|
|
+ (adev->pdev->device == 0x6665)) {
|
|
+ max_sclk = 60000;
|
|
+ max_mclk = 80000;
|
|
+ }
|
|
} else if (adev->asic_type == CHIP_OLAND) {
|
|
if ((adev->pdev->revision == 0xC7) ||
|
|
(adev->pdev->revision == 0x80) ||
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
|
|
index 3e59c766722c..ff7d4827385e 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
|
|
@@ -661,8 +661,8 @@ static int soc15_common_early_init(void *handle)
|
|
AMD_CG_SUPPORT_MC_LS |
|
|
AMD_CG_SUPPORT_SDMA_MGCG |
|
|
AMD_CG_SUPPORT_SDMA_LS;
|
|
- adev->pg_flags = AMD_PG_SUPPORT_SDMA |
|
|
- AMD_PG_SUPPORT_MMHUB;
|
|
+ adev->pg_flags = AMD_PG_SUPPORT_SDMA;
|
|
+
|
|
adev->external_rev_id = 0x1;
|
|
break;
|
|
default:
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
|
|
index 9ff69b90df36..4968b6bb9466 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
|
|
@@ -448,14 +448,19 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev,
|
|
|
|
static void vi_detect_hw_virtualization(struct amdgpu_device *adev)
|
|
{
|
|
- uint32_t reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER);
|
|
- /* bit0: 0 means pf and 1 means vf */
|
|
- /* bit31: 0 means disable IOV and 1 means enable */
|
|
- if (reg & 1)
|
|
- adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF;
|
|
-
|
|
- if (reg & 0x80000000)
|
|
- adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
|
+ uint32_t reg = 0;
|
|
+
|
|
+ if (adev->asic_type == CHIP_TONGA ||
|
|
+ adev->asic_type == CHIP_FIJI) {
|
|
+ reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER);
|
|
+ /* bit0: 0 means pf and 1 means vf */
|
|
+ /* bit31: 0 means disable IOV and 1 means enable */
|
|
+ if (reg & 1)
|
|
+ adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF;
|
|
+
|
|
+ if (reg & 0x80000000)
|
|
+ adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
|
+ }
|
|
|
|
if (reg == 0) {
|
|
if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */
|
|
diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c
|
|
index a4c4a465b385..130483f2cd7f 100644
|
|
--- a/drivers/gpu/drm/cirrus/cirrus_mode.c
|
|
+++ b/drivers/gpu/drm/cirrus/cirrus_mode.c
|
|
@@ -294,22 +294,7 @@ static void cirrus_crtc_prepare(struct drm_crtc *crtc)
|
|
{
|
|
}
|
|
|
|
-/*
|
|
- * This is called after a mode is programmed. It should reverse anything done
|
|
- * by the prepare function
|
|
- */
|
|
-static void cirrus_crtc_commit(struct drm_crtc *crtc)
|
|
-{
|
|
-}
|
|
-
|
|
-/*
|
|
- * The core can pass us a set of gamma values to program. We actually only
|
|
- * use this for 8-bit mode so can't perform smooth fades on deeper modes,
|
|
- * but it's a requirement that we provide the function
|
|
- */
|
|
-static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
- u16 *blue, uint32_t size,
|
|
- struct drm_modeset_acquire_ctx *ctx)
|
|
+static void cirrus_crtc_load_lut(struct drm_crtc *crtc)
|
|
{
|
|
struct drm_device *dev = crtc->dev;
|
|
struct cirrus_device *cdev = dev->dev_private;
|
|
@@ -317,7 +302,7 @@ static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
int i;
|
|
|
|
if (!crtc->enabled)
|
|
- return 0;
|
|
+ return;
|
|
|
|
r = crtc->gamma_store;
|
|
g = r + crtc->gamma_size;
|
|
@@ -330,6 +315,27 @@ static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
WREG8(PALETTE_DATA, *g++ >> 8);
|
|
WREG8(PALETTE_DATA, *b++ >> 8);
|
|
}
|
|
+}
|
|
+
|
|
+/*
|
|
+ * This is called after a mode is programmed. It should reverse anything done
|
|
+ * by the prepare function
|
|
+ */
|
|
+static void cirrus_crtc_commit(struct drm_crtc *crtc)
|
|
+{
|
|
+ cirrus_crtc_load_lut(crtc);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * The core can pass us a set of gamma values to program. We actually only
|
|
+ * use this for 8-bit mode so can't perform smooth fades on deeper modes,
|
|
+ * but it's a requirement that we provide the function
|
|
+ */
|
|
+static int cirrus_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|
+ u16 *blue, uint32_t size,
|
|
+ struct drm_modeset_acquire_ctx *ctx)
|
|
+{
|
|
+ cirrus_crtc_load_lut(crtc);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
|
index fc7946eb6665..d52c9758d8cf 100644
|
|
--- a/drivers/gpu/drm/drm_edid.c
|
|
+++ b/drivers/gpu/drm/drm_edid.c
|
|
@@ -111,6 +111,9 @@ static const struct edid_quirk {
|
|
/* AEO model 0 reports 8 bpc, but is a 6 bpc panel */
|
|
{ "AEO", 0, EDID_QUIRK_FORCE_6BPC },
|
|
|
|
+ /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */
|
|
+ { "CPT", 0x17df, EDID_QUIRK_FORCE_6BPC },
|
|
+
|
|
/* Belinea 10 15 55 */
|
|
{ "MAX", 1516, EDID_QUIRK_PREFER_LARGE_60 },
|
|
{ "MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60 },
|
|
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
|
|
index 61a1c8ea74bc..1acf3b1479a1 100644
|
|
--- a/drivers/gpu/drm/drm_mm.c
|
|
+++ b/drivers/gpu/drm/drm_mm.c
|
|
@@ -834,9 +834,24 @@ struct drm_mm_node *drm_mm_scan_color_evict(struct drm_mm_scan *scan)
|
|
if (!mm->color_adjust)
|
|
return NULL;
|
|
|
|
- hole = list_first_entry(&mm->hole_stack, typeof(*hole), hole_stack);
|
|
- hole_start = __drm_mm_hole_node_start(hole);
|
|
- hole_end = hole_start + hole->hole_size;
|
|
+ /*
|
|
+ * The hole found during scanning should ideally be the first element
|
|
+ * in the hole_stack list, but due to side-effects in the driver it
|
|
+ * may not be.
|
|
+ */
|
|
+ list_for_each_entry(hole, &mm->hole_stack, hole_stack) {
|
|
+ hole_start = __drm_mm_hole_node_start(hole);
|
|
+ hole_end = hole_start + hole->hole_size;
|
|
+
|
|
+ if (hole_start <= scan->hit_start &&
|
|
+ hole_end >= scan->hit_end)
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* We should only be called after we found the hole previously */
|
|
+ DRM_MM_BUG_ON(&hole->hole_stack == &mm->hole_stack);
|
|
+ if (unlikely(&hole->hole_stack == &mm->hole_stack))
|
|
+ return NULL;
|
|
|
|
DRM_MM_BUG_ON(hole_start > scan->hit_start);
|
|
DRM_MM_BUG_ON(hole_end < scan->hit_end);
|
|
diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
|
|
index 4e00e5cb9fa1..5095c095da04 100644
|
|
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
|
|
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
|
|
@@ -541,29 +541,16 @@ void intel_engine_remove_wait(struct intel_engine_cs *engine,
|
|
spin_unlock_irq(&b->rb_lock);
|
|
}
|
|
|
|
-static bool signal_valid(const struct drm_i915_gem_request *request)
|
|
-{
|
|
- return intel_wait_check_request(&request->signaling.wait, request);
|
|
-}
|
|
-
|
|
static bool signal_complete(const struct drm_i915_gem_request *request)
|
|
{
|
|
if (!request)
|
|
return false;
|
|
|
|
- /* If another process served as the bottom-half it may have already
|
|
- * signalled that this wait is already completed.
|
|
- */
|
|
- if (intel_wait_complete(&request->signaling.wait))
|
|
- return signal_valid(request);
|
|
-
|
|
- /* Carefully check if the request is complete, giving time for the
|
|
+ /*
|
|
+ * Carefully check if the request is complete, giving time for the
|
|
* seqno to be visible or if the GPU hung.
|
|
*/
|
|
- if (__i915_request_irq_complete(request))
|
|
- return true;
|
|
-
|
|
- return false;
|
|
+ return __i915_request_irq_complete(request);
|
|
}
|
|
|
|
static struct drm_i915_gem_request *to_signaler(struct rb_node *rb)
|
|
@@ -606,9 +593,13 @@ static int intel_breadcrumbs_signaler(void *arg)
|
|
request = i915_gem_request_get_rcu(request);
|
|
rcu_read_unlock();
|
|
if (signal_complete(request)) {
|
|
- local_bh_disable();
|
|
- dma_fence_signal(&request->fence);
|
|
- local_bh_enable(); /* kick start the tasklets */
|
|
+ if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
|
|
+ &request->fence.flags)) {
|
|
+ local_bh_disable();
|
|
+ dma_fence_signal(&request->fence);
|
|
+ GEM_BUG_ON(!i915_gem_request_completed(request));
|
|
+ local_bh_enable(); /* kick start the tasklets */
|
|
+ }
|
|
|
|
spin_lock_irq(&b->rb_lock);
|
|
|
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
index 5744eb729d24..ca2fbe56635a 100644
|
|
--- a/drivers/hid/hid-core.c
|
|
+++ b/drivers/hid/hid-core.c
|
|
@@ -2716,6 +2716,9 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
|
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
index be2e005c3c51..ff539c0b4637 100644
|
|
--- a/drivers/hid/hid-ids.h
|
|
+++ b/drivers/hid/hid-ids.h
|
|
@@ -634,6 +634,9 @@
|
|
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033
|
|
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035
|
|
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038
|
|
+#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040
|
|
+#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042
|
|
+#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043
|
|
#define USB_DEVICE_ID_LD_JWM 0x1080
|
|
#define USB_DEVICE_ID_LD_DMMP 0x1081
|
|
#define USB_DEVICE_ID_LD_UMIP 0x1090
|
|
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
|
|
index cd07a69e2e93..44deae78913e 100644
|
|
--- a/drivers/i2c/busses/i2c-bcm2835.c
|
|
+++ b/drivers/i2c/busses/i2c-bcm2835.c
|
|
@@ -50,6 +50,9 @@
|
|
#define BCM2835_I2C_S_CLKT BIT(9)
|
|
#define BCM2835_I2C_S_LEN BIT(10) /* Fake bit for SW error reporting */
|
|
|
|
+#define BCM2835_I2C_FEDL_SHIFT 16
|
|
+#define BCM2835_I2C_REDL_SHIFT 0
|
|
+
|
|
#define BCM2835_I2C_CDIV_MIN 0x0002
|
|
#define BCM2835_I2C_CDIV_MAX 0xFFFE
|
|
|
|
@@ -81,7 +84,7 @@ static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg)
|
|
|
|
static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev)
|
|
{
|
|
- u32 divider;
|
|
+ u32 divider, redl, fedl;
|
|
|
|
divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk),
|
|
i2c_dev->bus_clk_rate);
|
|
@@ -100,6 +103,22 @@ static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev)
|
|
|
|
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider);
|
|
|
|
+ /*
|
|
+ * Number of core clocks to wait after falling edge before
|
|
+ * outputting the next data bit. Note that both FEDL and REDL
|
|
+ * can't be greater than CDIV/2.
|
|
+ */
|
|
+ fedl = max(divider / 16, 1u);
|
|
+
|
|
+ /*
|
|
+ * Number of core clocks to wait after rising edge before
|
|
+ * sampling the next incoming data bit.
|
|
+ */
|
|
+ redl = max(divider / 4, 1u);
|
|
+
|
|
+ bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DEL,
|
|
+ (fedl << BCM2835_I2C_FEDL_SHIFT) |
|
|
+ (redl << BCM2835_I2C_REDL_SHIFT));
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c
|
|
index 418c233075d3..13e849bf9aa0 100644
|
|
--- a/drivers/i2c/busses/i2c-designware-master.c
|
|
+++ b/drivers/i2c/busses/i2c-designware-master.c
|
|
@@ -207,7 +207,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
|
|
i2c_dw_disable_int(dev);
|
|
|
|
/* Enable the adapter */
|
|
- __i2c_dw_enable(dev, true);
|
|
+ __i2c_dw_enable_and_wait(dev, true);
|
|
|
|
/* Clear and enable interrupts */
|
|
dw_readl(dev, DW_IC_CLR_INTR);
|
|
diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c
|
|
index 172753b14a4f..04be8bd951be 100644
|
|
--- a/drivers/iio/adc/stm32-adc.c
|
|
+++ b/drivers/iio/adc/stm32-adc.c
|
|
@@ -764,8 +764,6 @@ static int stm32h7_adc_enable(struct stm32_adc *adc)
|
|
int ret;
|
|
u32 val;
|
|
|
|
- /* Clear ADRDY by writing one, then enable ADC */
|
|
- stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY);
|
|
stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN);
|
|
|
|
/* Poll for ADRDY to be set (after adc startup time) */
|
|
@@ -773,8 +771,11 @@ static int stm32h7_adc_enable(struct stm32_adc *adc)
|
|
val & STM32H7_ADRDY,
|
|
100, STM32_ADC_TIMEOUT_US);
|
|
if (ret) {
|
|
- stm32_adc_clr_bits(adc, STM32H7_ADC_CR, STM32H7_ADEN);
|
|
+ stm32_adc_set_bits(adc, STM32H7_ADC_CR, STM32H7_ADDIS);
|
|
dev_err(&indio_dev->dev, "Failed to enable ADC\n");
|
|
+ } else {
|
|
+ /* Clear ADRDY by writing one */
|
|
+ stm32_adc_set_bits(adc, STM32H7_ADC_ISR, STM32H7_ADRDY);
|
|
}
|
|
|
|
return ret;
|
|
diff --git a/drivers/iio/imu/adis_trigger.c b/drivers/iio/imu/adis_trigger.c
|
|
index f53e9a803a0e..93b99bd93738 100644
|
|
--- a/drivers/iio/imu/adis_trigger.c
|
|
+++ b/drivers/iio/imu/adis_trigger.c
|
|
@@ -47,6 +47,10 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|
if (adis->trig == NULL)
|
|
return -ENOMEM;
|
|
|
|
+ adis->trig->dev.parent = &adis->spi->dev;
|
|
+ adis->trig->ops = &adis_trigger_ops;
|
|
+ iio_trigger_set_drvdata(adis->trig, adis);
|
|
+
|
|
ret = request_irq(adis->spi->irq,
|
|
&iio_trigger_generic_data_rdy_poll,
|
|
IRQF_TRIGGER_RISING,
|
|
@@ -55,9 +59,6 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
|
|
if (ret)
|
|
goto error_free_trig;
|
|
|
|
- adis->trig->dev.parent = &adis->spi->dev;
|
|
- adis->trig->ops = &adis_trigger_ops;
|
|
- iio_trigger_set_drvdata(adis->trig, adis);
|
|
ret = iio_trigger_register(adis->trig);
|
|
|
|
indio_dev->trig = iio_trigger_get(adis->trig);
|
|
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
|
|
index d2b465140a6b..78482d456c3b 100644
|
|
--- a/drivers/iio/industrialio-buffer.c
|
|
+++ b/drivers/iio/industrialio-buffer.c
|
|
@@ -175,7 +175,7 @@ unsigned int iio_buffer_poll(struct file *filp,
|
|
struct iio_dev *indio_dev = filp->private_data;
|
|
struct iio_buffer *rb = indio_dev->buffer;
|
|
|
|
- if (!indio_dev->info)
|
|
+ if (!indio_dev->info || rb == NULL)
|
|
return 0;
|
|
|
|
poll_wait(filp, &rb->pollq, wait);
|
|
diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig
|
|
index ae070950f920..c03de24d3c51 100644
|
|
--- a/drivers/iio/proximity/Kconfig
|
|
+++ b/drivers/iio/proximity/Kconfig
|
|
@@ -58,6 +58,8 @@ config SX9500
|
|
|
|
config SRF08
|
|
tristate "Devantech SRF02/SRF08/SRF10 ultrasonic ranger sensor"
|
|
+ select IIO_BUFFER
|
|
+ select IIO_TRIGGERED_BUFFER
|
|
depends on I2C
|
|
help
|
|
Say Y here to build a driver for Devantech SRF02/SRF08/SRF10
|
|
diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c
|
|
index 85b5ee4defa4..4e1f76730855 100644
|
|
--- a/drivers/infiniband/core/rdma_core.c
|
|
+++ b/drivers/infiniband/core/rdma_core.c
|
|
@@ -196,7 +196,15 @@ static struct ib_uobject *lookup_get_idr_uobject(const struct uverbs_obj_type *t
|
|
goto free;
|
|
}
|
|
|
|
- uverbs_uobject_get(uobj);
|
|
+ /*
|
|
+ * The idr_find is guaranteed to return a pointer to something that
|
|
+ * isn't freed yet, or NULL, as the free after idr_remove goes through
|
|
+ * kfree_rcu(). However the object may still have been released and
|
|
+ * kfree() could be called at any time.
|
|
+ */
|
|
+ if (!kref_get_unless_zero(&uobj->ref))
|
|
+ uobj = ERR_PTR(-ENOENT);
|
|
+
|
|
free:
|
|
rcu_read_unlock();
|
|
return uobj;
|
|
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
|
|
index 93c1a57dbff1..186dce6bba8f 100644
|
|
--- a/drivers/infiniband/core/uverbs_cmd.c
|
|
+++ b/drivers/infiniband/core/uverbs_cmd.c
|
|
@@ -565,9 +565,10 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,
|
|
if (f.file)
|
|
fdput(f);
|
|
|
|
+ mutex_unlock(&file->device->xrcd_tree_mutex);
|
|
+
|
|
uobj_alloc_commit(&obj->uobject);
|
|
|
|
- mutex_unlock(&file->device->xrcd_tree_mutex);
|
|
return in_len;
|
|
|
|
err_copy:
|
|
@@ -606,10 +607,8 @@ ssize_t ib_uverbs_close_xrcd(struct ib_uverbs_file *file,
|
|
|
|
uobj = uobj_get_write(uobj_get_type(xrcd), cmd.xrcd_handle,
|
|
file->ucontext);
|
|
- if (IS_ERR(uobj)) {
|
|
- mutex_unlock(&file->device->xrcd_tree_mutex);
|
|
+ if (IS_ERR(uobj))
|
|
return PTR_ERR(uobj);
|
|
- }
|
|
|
|
ret = uobj_remove_commit(uobj);
|
|
return ret ?: in_len;
|
|
@@ -1982,8 +1981,15 @@ static int modify_qp(struct ib_uverbs_file *file,
|
|
goto release_qp;
|
|
}
|
|
|
|
+ if ((cmd->base.attr_mask & IB_QP_AV) &&
|
|
+ !rdma_is_port_valid(qp->device, cmd->base.dest.port_num)) {
|
|
+ ret = -EINVAL;
|
|
+ goto release_qp;
|
|
+ }
|
|
+
|
|
if ((cmd->base.attr_mask & IB_QP_ALT_PATH) &&
|
|
- !rdma_is_port_valid(qp->device, cmd->base.alt_port_num)) {
|
|
+ (!rdma_is_port_valid(qp->device, cmd->base.alt_port_num) ||
|
|
+ !rdma_is_port_valid(qp->device, cmd->base.alt_dest.port_num))) {
|
|
ret = -EINVAL;
|
|
goto release_qp;
|
|
}
|
|
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
|
|
index dc2aed6fb21b..0f70ff91276e 100644
|
|
--- a/drivers/infiniband/core/uverbs_main.c
|
|
+++ b/drivers/infiniband/core/uverbs_main.c
|
|
@@ -647,12 +647,21 @@ static int verify_command_mask(struct ib_device *ib_dev, __u32 command)
|
|
return -1;
|
|
}
|
|
|
|
+static bool verify_command_idx(u32 command, bool extended)
|
|
+{
|
|
+ if (extended)
|
|
+ return command < ARRAY_SIZE(uverbs_ex_cmd_table);
|
|
+
|
|
+ return command < ARRAY_SIZE(uverbs_cmd_table);
|
|
+}
|
|
+
|
|
static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
|
size_t count, loff_t *pos)
|
|
{
|
|
struct ib_uverbs_file *file = filp->private_data;
|
|
struct ib_device *ib_dev;
|
|
struct ib_uverbs_cmd_hdr hdr;
|
|
+ bool extended_command;
|
|
__u32 command;
|
|
__u32 flags;
|
|
int srcu_key;
|
|
@@ -685,6 +694,15 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
|
}
|
|
|
|
command = hdr.command & IB_USER_VERBS_CMD_COMMAND_MASK;
|
|
+ flags = (hdr.command &
|
|
+ IB_USER_VERBS_CMD_FLAGS_MASK) >> IB_USER_VERBS_CMD_FLAGS_SHIFT;
|
|
+
|
|
+ extended_command = flags & IB_USER_VERBS_CMD_FLAG_EXTENDED;
|
|
+ if (!verify_command_idx(command, extended_command)) {
|
|
+ ret = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
if (verify_command_mask(ib_dev, command)) {
|
|
ret = -EOPNOTSUPP;
|
|
goto out;
|
|
@@ -696,12 +714,8 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
|
goto out;
|
|
}
|
|
|
|
- flags = (hdr.command &
|
|
- IB_USER_VERBS_CMD_FLAGS_MASK) >> IB_USER_VERBS_CMD_FLAGS_SHIFT;
|
|
-
|
|
if (!flags) {
|
|
- if (command >= ARRAY_SIZE(uverbs_cmd_table) ||
|
|
- !uverbs_cmd_table[command]) {
|
|
+ if (!uverbs_cmd_table[command]) {
|
|
ret = -EINVAL;
|
|
goto out;
|
|
}
|
|
@@ -722,8 +736,7 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
|
struct ib_udata uhw;
|
|
size_t written_count = count;
|
|
|
|
- if (command >= ARRAY_SIZE(uverbs_ex_cmd_table) ||
|
|
- !uverbs_ex_cmd_table[command]) {
|
|
+ if (!uverbs_ex_cmd_table[command]) {
|
|
ret = -ENOSYS;
|
|
goto out;
|
|
}
|
|
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
|
|
index 3b35271114ee..ae9ff72e83ee 100644
|
|
--- a/drivers/irqchip/irq-gic-v3.c
|
|
+++ b/drivers/irqchip/irq-gic-v3.c
|
|
@@ -660,7 +660,7 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
|
* Ensure that stores to Normal memory are visible to the
|
|
* other CPUs before issuing the IPI.
|
|
*/
|
|
- smp_wmb();
|
|
+ wmb();
|
|
|
|
for_each_cpu(cpu, mask) {
|
|
unsigned long cluster_id = cpu_logical_map(cpu) & ~0xffUL;
|
|
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
|
|
index c90976d7e53c..a9f300efce54 100644
|
|
--- a/drivers/irqchip/irq-mips-gic.c
|
|
+++ b/drivers/irqchip/irq-mips-gic.c
|
|
@@ -427,8 +427,6 @@ static int gic_shared_irq_domain_map(struct irq_domain *d, unsigned int virq,
|
|
spin_lock_irqsave(&gic_lock, flags);
|
|
write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin);
|
|
write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu)));
|
|
- gic_clear_pcpu_masks(intr);
|
|
- set_bit(intr, per_cpu_ptr(pcpu_masks, cpu));
|
|
irq_data_update_effective_affinity(data, cpumask_of(cpu));
|
|
spin_unlock_irqrestore(&gic_lock, flags);
|
|
|
|
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
|
|
index b65ce26ff72f..1802debbd3c7 100644
|
|
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
|
|
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
|
|
@@ -2632,7 +2632,6 @@ void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size)
|
|
}
|
|
|
|
#define EEPROM_STAT_ADDR 0x7bfc
|
|
-#define VPD_SIZE 0x800
|
|
#define VPD_BASE 0x400
|
|
#define VPD_BASE_OLD 0
|
|
#define VPD_LEN 1024
|
|
@@ -2670,15 +2669,6 @@ int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p)
|
|
if (!vpd)
|
|
return -ENOMEM;
|
|
|
|
- /* We have two VPD data structures stored in the adapter VPD area.
|
|
- * By default, Linux calculates the size of the VPD area by traversing
|
|
- * the first VPD area at offset 0x0, so we need to tell the OS what
|
|
- * our real VPD size is.
|
|
- */
|
|
- ret = pci_set_vpd_size(adapter->pdev, VPD_SIZE);
|
|
- if (ret < 0)
|
|
- goto out;
|
|
-
|
|
/* Card information normally starts at VPD_BASE but early cards had
|
|
* it at 0.
|
|
*/
|
|
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
|
index 4c3feb96f391..d18824772f6c 100644
|
|
--- a/drivers/pci/quirks.c
|
|
+++ b/drivers/pci/quirks.c
|
|
@@ -3412,22 +3412,29 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PORT_RIDGE,
|
|
|
|
static void quirk_chelsio_extend_vpd(struct pci_dev *dev)
|
|
{
|
|
- pci_set_vpd_size(dev, 8192);
|
|
-}
|
|
-
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x20, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x21, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x22, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x23, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x24, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x25, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x26, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x30, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x31, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x32, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x35, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x36, quirk_chelsio_extend_vpd);
|
|
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, 0x37, quirk_chelsio_extend_vpd);
|
|
+ int chip = (dev->device & 0xf000) >> 12;
|
|
+ int func = (dev->device & 0x0f00) >> 8;
|
|
+ int prod = (dev->device & 0x00ff) >> 0;
|
|
+
|
|
+ /*
|
|
+ * If this is a T3-based adapter, there's a 1KB VPD area at offset
|
|
+ * 0xc00 which contains the preferred VPD values. If this is a T4 or
|
|
+ * later based adapter, the special VPD is at offset 0x400 for the
|
|
+ * Physical Functions (the SR-IOV Virtual Functions have no VPD
|
|
+ * Capabilities). The PCI VPD Access core routines will normally
|
|
+ * compute the size of the VPD by parsing the VPD Data Structure at
|
|
+ * offset 0x000. This will result in silent failures when attempting
|
|
+ * to accesses these other VPD areas which are beyond those computed
|
|
+ * limits.
|
|
+ */
|
|
+ if (chip == 0x0 && prod >= 0x20)
|
|
+ pci_set_vpd_size(dev, 8192);
|
|
+ else if (chip >= 0x4 && func < 0x8)
|
|
+ pci_set_vpd_size(dev, 2048);
|
|
+}
|
|
+
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
|
|
+ quirk_chelsio_extend_vpd);
|
|
|
|
#ifdef CONFIG_ACPI
|
|
/*
|
|
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
|
|
index 9a0696f68f37..b81a53c4a9a8 100644
|
|
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
|
|
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
|
|
@@ -367,7 +367,7 @@ enum ibmvfc_fcp_rsp_info_codes {
|
|
};
|
|
|
|
struct ibmvfc_fcp_rsp_info {
|
|
- __be16 reserved;
|
|
+ u8 reserved[3];
|
|
u8 rsp_code;
|
|
u8 reserved2[4];
|
|
}__attribute__((packed, aligned (2)));
|
|
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
|
index c05c4f877750..774c97bb1c08 100644
|
|
--- a/drivers/usb/core/quirks.c
|
|
+++ b/drivers/usb/core/quirks.c
|
|
@@ -225,6 +225,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|
{ USB_DEVICE(0x1a0a, 0x0200), .driver_info =
|
|
USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },
|
|
|
|
+ /* Corsair K70 RGB */
|
|
+ { USB_DEVICE(0x1b1c, 0x1b13), .driver_info = USB_QUIRK_DELAY_INIT },
|
|
+
|
|
/* Corsair Strafe RGB */
|
|
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT },
|
|
|
|
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
|
|
index 75e6cb044eb2..89fe53c846ef 100644
|
|
--- a/drivers/usb/dwc3/ep0.c
|
|
+++ b/drivers/usb/dwc3/ep0.c
|
|
@@ -884,7 +884,12 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
|
|
trb++;
|
|
trb->ctrl &= ~DWC3_TRB_CTRL_HWO;
|
|
trace_dwc3_complete_trb(ep0, trb);
|
|
- ep0->trb_enqueue = 0;
|
|
+
|
|
+ if (r->direction)
|
|
+ dwc->eps[1]->trb_enqueue = 0;
|
|
+ else
|
|
+ dwc->eps[0]->trb_enqueue = 0;
|
|
+
|
|
dwc->ep0_bounced = false;
|
|
}
|
|
|
|
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
|
index 97e52c0d1a72..0ebdb313bb00 100644
|
|
--- a/drivers/usb/dwc3/gadget.c
|
|
+++ b/drivers/usb/dwc3/gadget.c
|
|
@@ -2774,6 +2774,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
|
|
break;
|
|
}
|
|
|
|
+ dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
|
|
+
|
|
/* Enable USB2 LPM Capability */
|
|
|
|
if ((dwc->revision > DWC3_REVISION_194A) &&
|
|
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
|
|
index c0491dd73f53..a9c9ab01592b 100644
|
|
--- a/drivers/usb/gadget/function/f_fs.c
|
|
+++ b/drivers/usb/gadget/function/f_fs.c
|
|
@@ -1856,44 +1856,20 @@ static int ffs_func_eps_enable(struct ffs_function *func)
|
|
|
|
spin_lock_irqsave(&func->ffs->eps_lock, flags);
|
|
while(count--) {
|
|
- struct usb_endpoint_descriptor *ds;
|
|
- struct usb_ss_ep_comp_descriptor *comp_desc = NULL;
|
|
- int needs_comp_desc = false;
|
|
- int desc_idx;
|
|
-
|
|
- if (ffs->gadget->speed == USB_SPEED_SUPER) {
|
|
- desc_idx = 2;
|
|
- needs_comp_desc = true;
|
|
- } else if (ffs->gadget->speed == USB_SPEED_HIGH)
|
|
- desc_idx = 1;
|
|
- else
|
|
- desc_idx = 0;
|
|
-
|
|
- /* fall-back to lower speed if desc missing for current speed */
|
|
- do {
|
|
- ds = ep->descs[desc_idx];
|
|
- } while (!ds && --desc_idx >= 0);
|
|
-
|
|
- if (!ds) {
|
|
- ret = -EINVAL;
|
|
- break;
|
|
- }
|
|
-
|
|
ep->ep->driver_data = ep;
|
|
- ep->ep->desc = ds;
|
|
|
|
- if (needs_comp_desc) {
|
|
- comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds +
|
|
- USB_DT_ENDPOINT_SIZE);
|
|
- ep->ep->maxburst = comp_desc->bMaxBurst + 1;
|
|
- ep->ep->comp_desc = comp_desc;
|
|
+ ret = config_ep_by_speed(func->gadget, &func->function, ep->ep);
|
|
+ if (ret) {
|
|
+ pr_err("%s: config_ep_by_speed(%s) returned %d\n",
|
|
+ __func__, ep->ep->name, ret);
|
|
+ break;
|
|
}
|
|
|
|
ret = usb_ep_enable(ep->ep);
|
|
if (likely(!ret)) {
|
|
epfile->ep = ep;
|
|
- epfile->in = usb_endpoint_dir_in(ds);
|
|
- epfile->isoc = usb_endpoint_xfer_isoc(ds);
|
|
+ epfile->in = usb_endpoint_dir_in(ep->ep->desc);
|
|
+ epfile->isoc = usb_endpoint_xfer_isoc(ep->ep->desc);
|
|
} else {
|
|
break;
|
|
}
|
|
@@ -2980,10 +2956,8 @@ static int _ffs_func_bind(struct usb_configuration *c,
|
|
struct ffs_data *ffs = func->ffs;
|
|
|
|
const int full = !!func->ffs->fs_descs_count;
|
|
- const int high = gadget_is_dualspeed(func->gadget) &&
|
|
- func->ffs->hs_descs_count;
|
|
- const int super = gadget_is_superspeed(func->gadget) &&
|
|
- func->ffs->ss_descs_count;
|
|
+ const int high = !!func->ffs->hs_descs_count;
|
|
+ const int super = !!func->ffs->ss_descs_count;
|
|
|
|
int fs_len, hs_len, ss_len, ret, i;
|
|
struct ffs_ep *eps_ptr;
|
|
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
|
|
index df169c8e7225..37ef2ac9cdae 100644
|
|
--- a/drivers/usb/host/ehci-hub.c
|
|
+++ b/drivers/usb/host/ehci-hub.c
|
|
@@ -787,12 +787,12 @@ static struct urb *request_single_step_set_feature_urb(
|
|
atomic_inc(&urb->use_count);
|
|
atomic_inc(&urb->dev->urbnum);
|
|
urb->setup_dma = dma_map_single(
|
|
- hcd->self.controller,
|
|
+ hcd->self.sysdev,
|
|
urb->setup_packet,
|
|
sizeof(struct usb_ctrlrequest),
|
|
DMA_TO_DEVICE);
|
|
urb->transfer_dma = dma_map_single(
|
|
- hcd->self.controller,
|
|
+ hcd->self.sysdev,
|
|
urb->transfer_buffer,
|
|
urb->transfer_buffer_length,
|
|
DMA_FROM_DEVICE);
|
|
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
|
|
index 44924824fa41..1099465b27f0 100644
|
|
--- a/drivers/usb/host/ohci-hcd.c
|
|
+++ b/drivers/usb/host/ohci-hcd.c
|
|
@@ -73,6 +73,7 @@ static const char hcd_name [] = "ohci_hcd";
|
|
|
|
#define STATECHANGE_DELAY msecs_to_jiffies(300)
|
|
#define IO_WATCHDOG_DELAY msecs_to_jiffies(275)
|
|
+#define IO_WATCHDOG_OFF 0xffffff00
|
|
|
|
#include "ohci.h"
|
|
#include "pci-quirks.h"
|
|
@@ -230,7 +231,7 @@ static int ohci_urb_enqueue (
|
|
}
|
|
|
|
/* Start up the I/O watchdog timer, if it's not running */
|
|
- if (!timer_pending(&ohci->io_watchdog) &&
|
|
+ if (ohci->prev_frame_no == IO_WATCHDOG_OFF &&
|
|
list_empty(&ohci->eds_in_use) &&
|
|
!(ohci->flags & OHCI_QUIRK_QEMU)) {
|
|
ohci->prev_frame_no = ohci_frame_no(ohci);
|
|
@@ -501,6 +502,7 @@ static int ohci_init (struct ohci_hcd *ohci)
|
|
|
|
setup_timer(&ohci->io_watchdog, io_watchdog_func,
|
|
(unsigned long) ohci);
|
|
+ ohci->prev_frame_no = IO_WATCHDOG_OFF;
|
|
|
|
ohci->hcca = dma_alloc_coherent (hcd->self.controller,
|
|
sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_KERNEL);
|
|
@@ -730,7 +732,7 @@ static void io_watchdog_func(unsigned long _ohci)
|
|
u32 head;
|
|
struct ed *ed;
|
|
struct td *td, *td_start, *td_next;
|
|
- unsigned frame_no;
|
|
+ unsigned frame_no, prev_frame_no = IO_WATCHDOG_OFF;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&ohci->lock, flags);
|
|
@@ -835,7 +837,7 @@ static void io_watchdog_func(unsigned long _ohci)
|
|
}
|
|
}
|
|
if (!list_empty(&ohci->eds_in_use)) {
|
|
- ohci->prev_frame_no = frame_no;
|
|
+ prev_frame_no = frame_no;
|
|
ohci->prev_wdh_cnt = ohci->wdh_cnt;
|
|
ohci->prev_donehead = ohci_readl(ohci,
|
|
&ohci->regs->donehead);
|
|
@@ -845,6 +847,7 @@ static void io_watchdog_func(unsigned long _ohci)
|
|
}
|
|
|
|
done:
|
|
+ ohci->prev_frame_no = prev_frame_no;
|
|
spin_unlock_irqrestore(&ohci->lock, flags);
|
|
}
|
|
|
|
@@ -973,6 +976,7 @@ static void ohci_stop (struct usb_hcd *hcd)
|
|
if (quirk_nec(ohci))
|
|
flush_work(&ohci->nec_work);
|
|
del_timer_sync(&ohci->io_watchdog);
|
|
+ ohci->prev_frame_no = IO_WATCHDOG_OFF;
|
|
|
|
ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
|
|
ohci_usb_reset(ohci);
|
|
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
|
|
index 248eb7702463..aca57bcb9afe 100644
|
|
--- a/drivers/usb/host/ohci-hub.c
|
|
+++ b/drivers/usb/host/ohci-hub.c
|
|
@@ -310,8 +310,10 @@ static int ohci_bus_suspend (struct usb_hcd *hcd)
|
|
rc = ohci_rh_suspend (ohci, 0);
|
|
spin_unlock_irq (&ohci->lock);
|
|
|
|
- if (rc == 0)
|
|
+ if (rc == 0) {
|
|
del_timer_sync(&ohci->io_watchdog);
|
|
+ ohci->prev_frame_no = IO_WATCHDOG_OFF;
|
|
+ }
|
|
return rc;
|
|
}
|
|
|
|
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
|
|
index 641fed609911..24edb7674710 100644
|
|
--- a/drivers/usb/host/ohci-q.c
|
|
+++ b/drivers/usb/host/ohci-q.c
|
|
@@ -1018,6 +1018,8 @@ static void finish_unlinks(struct ohci_hcd *ohci)
|
|
* have modified this list. normally it's just prepending
|
|
* entries (which we'd ignore), but paranoia won't hurt.
|
|
*/
|
|
+ *last = ed->ed_next;
|
|
+ ed->ed_next = NULL;
|
|
modified = 0;
|
|
|
|
/* unlink urbs as requested, but rescan the list after
|
|
@@ -1076,21 +1078,22 @@ static void finish_unlinks(struct ohci_hcd *ohci)
|
|
goto rescan_this;
|
|
|
|
/*
|
|
- * If no TDs are queued, take ED off the ed_rm_list.
|
|
+ * If no TDs are queued, ED is now idle.
|
|
* Otherwise, if the HC is running, reschedule.
|
|
- * If not, leave it on the list for further dequeues.
|
|
+ * If the HC isn't running, add ED back to the
|
|
+ * start of the list for later processing.
|
|
*/
|
|
if (list_empty(&ed->td_list)) {
|
|
- *last = ed->ed_next;
|
|
- ed->ed_next = NULL;
|
|
ed->state = ED_IDLE;
|
|
list_del(&ed->in_use_list);
|
|
} else if (ohci->rh_state == OHCI_RH_RUNNING) {
|
|
- *last = ed->ed_next;
|
|
- ed->ed_next = NULL;
|
|
ed_schedule(ohci, ed);
|
|
} else {
|
|
- last = &ed->ed_next;
|
|
+ ed->ed_next = ohci->ed_rm_list;
|
|
+ ohci->ed_rm_list = ed;
|
|
+ /* Don't loop on the same ED */
|
|
+ if (last == &ohci->ed_rm_list)
|
|
+ last = &ed->ed_next;
|
|
}
|
|
|
|
if (modified)
|
|
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c
|
|
index 680bddb3ce05..6635a3c990f6 100644
|
|
--- a/drivers/usb/misc/ldusb.c
|
|
+++ b/drivers/usb/misc/ldusb.c
|
|
@@ -46,6 +46,9 @@
|
|
#define USB_DEVICE_ID_LD_MICROCASSYTIME 0x1033 /* USB Product ID of Micro-CASSY Time (reserved) */
|
|
#define USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE 0x1035 /* USB Product ID of Micro-CASSY Temperature */
|
|
#define USB_DEVICE_ID_LD_MICROCASSYPH 0x1038 /* USB Product ID of Micro-CASSY pH */
|
|
+#define USB_DEVICE_ID_LD_POWERANALYSERCASSY 0x1040 /* USB Product ID of Power Analyser CASSY */
|
|
+#define USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY 0x1042 /* USB Product ID of Converter Controller CASSY */
|
|
+#define USB_DEVICE_ID_LD_MACHINETESTCASSY 0x1043 /* USB Product ID of Machine Test CASSY */
|
|
#define USB_DEVICE_ID_LD_JWM 0x1080 /* USB Product ID of Joule and Wattmeter */
|
|
#define USB_DEVICE_ID_LD_DMMP 0x1081 /* USB Product ID of Digital Multimeter P (reserved) */
|
|
#define USB_DEVICE_ID_LD_UMIP 0x1090 /* USB Product ID of UMI P */
|
|
@@ -88,6 +91,9 @@ static const struct usb_device_id ld_usb_table[] = {
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
|
|
+ { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERANALYSERCASSY) },
|
|
+ { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CONVERTERCONTROLLERCASSY) },
|
|
+ { USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETESTCASSY) },
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
|
|
{ USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
|
|
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
|
|
index b17450a59882..b5cc08d8aa22 100644
|
|
--- a/drivers/usb/musb/musb_host.c
|
|
+++ b/drivers/usb/musb/musb_host.c
|
|
@@ -418,13 +418,7 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
|
|
}
|
|
}
|
|
|
|
- /*
|
|
- * The pipe must be broken if current urb->status is set, so don't
|
|
- * start next urb.
|
|
- * TODO: to minimize the risk of regression, only check urb->status
|
|
- * for RX, until we have a test case to understand the behavior of TX.
|
|
- */
|
|
- if ((!status || !is_in) && qh && qh->is_ready) {
|
|
+ if (qh != NULL && qh->is_ready) {
|
|
musb_dbg(musb, "... next ep%d %cX urb %p",
|
|
hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh));
|
|
musb_start_urb(musb, is_in, qh);
|
|
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c
|
|
index 50285b01da92..5d369b38868a 100644
|
|
--- a/drivers/usb/renesas_usbhs/fifo.c
|
|
+++ b/drivers/usb/renesas_usbhs/fifo.c
|
|
@@ -998,6 +998,10 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt,
|
|
if ((uintptr_t)pkt->buf & (USBHS_USB_DMAC_XFER_SIZE - 1))
|
|
goto usbhsf_pio_prepare_pop;
|
|
|
|
+ /* return at this time if the pipe is running */
|
|
+ if (usbhs_pipe_is_running(pipe))
|
|
+ return 0;
|
|
+
|
|
usbhs_pipe_config_change_bfre(pipe, 1);
|
|
|
|
ret = usbhsf_fifo_select(pipe, fifo, 0);
|
|
@@ -1188,6 +1192,7 @@ static int usbhsf_dma_pop_done_with_usb_dmac(struct usbhs_pkt *pkt,
|
|
usbhsf_fifo_clear(pipe, fifo);
|
|
pkt->actual = usbhs_dma_calc_received_size(pkt, chan, rcv_len);
|
|
|
|
+ usbhs_pipe_running(pipe, 0);
|
|
usbhsf_dma_stop(pipe, fifo);
|
|
usbhsf_dma_unmap(pkt);
|
|
usbhsf_fifo_unselect(pipe, pipe->fifo);
|
|
diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c
|
|
index bf13d1ec51f3..04e7b3b29bac 100644
|
|
--- a/drivers/xen/tmem.c
|
|
+++ b/drivers/xen/tmem.c
|
|
@@ -284,6 +284,10 @@ static int tmem_frontswap_store(unsigned type, pgoff_t offset,
|
|
int pool = tmem_frontswap_poolid;
|
|
int ret;
|
|
|
|
+ /* THP isn't supported */
|
|
+ if (PageTransHuge(page))
|
|
+ return -1;
|
|
+
|
|
if (pool < 0)
|
|
return -1;
|
|
if (ind64 != ind)
|
|
diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h
|
|
index fec5076eda91..dcde9471897d 100644
|
|
--- a/include/linux/kconfig.h
|
|
+++ b/include/linux/kconfig.h
|
|
@@ -4,6 +4,12 @@
|
|
|
|
#include <generated/autoconf.h>
|
|
|
|
+#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
+#define __BIG_ENDIAN 4321
|
|
+#else
|
|
+#define __LITTLE_ENDIAN 1234
|
|
+#endif
|
|
+
|
|
#define __ARG_PLACEHOLDER_1 0,
|
|
#define __take_second_arg(__ignored, val, ...) val
|
|
|
|
@@ -64,4 +70,7 @@
|
|
*/
|
|
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
|
|
|
|
+/* Make sure we always have all types and struct attributes defined. */
|
|
+#include <linux/compiler_types.h>
|
|
+
|
|
#endif /* __LINUX_KCONFIG_H */
|
|
diff --git a/mm/zswap.c b/mm/zswap.c
|
|
index d39581a076c3..597008a44f70 100644
|
|
--- a/mm/zswap.c
|
|
+++ b/mm/zswap.c
|
|
@@ -970,6 +970,12 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset,
|
|
u8 *src, *dst;
|
|
struct zswap_header *zhdr;
|
|
|
|
+ /* THP isn't supported */
|
|
+ if (PageTransHuge(page)) {
|
|
+ ret = -EINVAL;
|
|
+ goto reject;
|
|
+ }
|
|
+
|
|
if (!zswap_enabled || !tree) {
|
|
ret = -ENODEV;
|
|
goto reject;
|
|
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
|
|
index c7df4969f80a..f56aab54e0c8 100644
|
|
--- a/net/ipv4/ip_sockglue.c
|
|
+++ b/net/ipv4/ip_sockglue.c
|
|
@@ -1563,10 +1563,7 @@ int ip_getsockopt(struct sock *sk, int level,
|
|
if (get_user(len, optlen))
|
|
return -EFAULT;
|
|
|
|
- lock_sock(sk);
|
|
- err = nf_getsockopt(sk, PF_INET, optname, optval,
|
|
- &len);
|
|
- release_sock(sk);
|
|
+ err = nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
|
if (err >= 0)
|
|
err = put_user(len, optlen);
|
|
return err;
|
|
@@ -1598,9 +1595,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname,
|
|
if (get_user(len, optlen))
|
|
return -EFAULT;
|
|
|
|
- lock_sock(sk);
|
|
err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len);
|
|
- release_sock(sk);
|
|
if (err >= 0)
|
|
err = put_user(len, optlen);
|
|
return err;
|
|
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
|
|
index 24b69384bdbf..1276d5bd5675 100644
|
|
--- a/net/ipv6/ipv6_sockglue.c
|
|
+++ b/net/ipv6/ipv6_sockglue.c
|
|
@@ -1355,10 +1355,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|
if (get_user(len, optlen))
|
|
return -EFAULT;
|
|
|
|
- lock_sock(sk);
|
|
- err = nf_getsockopt(sk, PF_INET6, optname, optval,
|
|
- &len);
|
|
- release_sock(sk);
|
|
+ err = nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
|
if (err >= 0)
|
|
err = put_user(len, optlen);
|
|
}
|
|
@@ -1397,10 +1394,7 @@ int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|
if (get_user(len, optlen))
|
|
return -EFAULT;
|
|
|
|
- lock_sock(sk);
|
|
- err = compat_nf_getsockopt(sk, PF_INET6,
|
|
- optname, optval, &len);
|
|
- release_sock(sk);
|
|
+ err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len);
|
|
if (err >= 0)
|
|
err = put_user(len, optlen);
|
|
}
|
|
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
|
|
index fb15d3b97cb2..84f757c5d91a 100644
|
|
--- a/net/mac80211/cfg.c
|
|
+++ b/net/mac80211/cfg.c
|
|
@@ -2863,7 +2863,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
|
}
|
|
if (beacon->probe_resp_len) {
|
|
new_beacon->probe_resp_len = beacon->probe_resp_len;
|
|
- beacon->probe_resp = pos;
|
|
+ new_beacon->probe_resp = pos;
|
|
memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
|
|
pos += beacon->probe_resp_len;
|
|
}
|