* Address stability issues, update configuration. * Cleanup - remove not needed patches * Add upstream patches Board survived regular stress testing while previous config/version hanged instantly.
8011 lines
260 KiB
Diff
8011 lines
260 KiB
Diff
diff --git a/Documentation/ABI/stable/sysfs-driver-mlxreg-io b/Documentation/ABI/stable/sysfs-driver-mlxreg-io
|
|
index 8ca498447aeb..05601a90a9b6 100644
|
|
--- a/Documentation/ABI/stable/sysfs-driver-mlxreg-io
|
|
+++ b/Documentation/ABI/stable/sysfs-driver-mlxreg-io
|
|
@@ -29,13 +29,13 @@ Description: This file shows the system fans direction:
|
|
|
|
The files are read only.
|
|
|
|
-What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/jtag_enable
|
|
+What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld3_version
|
|
|
|
Date: November 2018
|
|
KernelVersion: 5.0
|
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
|
Description: These files show with which CPLD versions have been burned
|
|
- on LED board.
|
|
+ on LED or Gearbox board.
|
|
|
|
The files are read only.
|
|
|
|
@@ -121,6 +121,15 @@ Description: These files show the system reset cause, as following: ComEx
|
|
|
|
The files are read only.
|
|
|
|
+What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/cpld4_version
|
|
+Date: November 2018
|
|
+KernelVersion: 5.0
|
|
+Contact: Vadim Pasternak <vadimpmellanox.com>
|
|
+Description: These files show with which CPLD versions have been burned
|
|
+ on LED board.
|
|
+
|
|
+ The files are read only.
|
|
+
|
|
Date: June 2019
|
|
KernelVersion: 5.3
|
|
Contact: Vadim Pasternak <vadimpmellanox.com>
|
|
diff --git a/Documentation/ABI/testing/sysfs-bus-mei b/Documentation/ABI/testing/sysfs-bus-mei
|
|
index 6bd45346ac7e..3f8701e8fa24 100644
|
|
--- a/Documentation/ABI/testing/sysfs-bus-mei
|
|
+++ b/Documentation/ABI/testing/sysfs-bus-mei
|
|
@@ -4,7 +4,7 @@ KernelVersion: 3.10
|
|
Contact: Samuel Ortiz <sameo@linux.intel.com>
|
|
linux-mei@linux.intel.com
|
|
Description: Stores the same MODALIAS value emitted by uevent
|
|
- Format: mei:<mei device name>:<device uuid>:
|
|
+ Format: mei:<mei device name>:<device uuid>:<protocol version>
|
|
|
|
What: /sys/bus/mei/devices/.../name
|
|
Date: May 2015
|
|
diff --git a/Documentation/admin-guide/device-mapper/index.rst b/Documentation/admin-guide/device-mapper/index.rst
|
|
index c77c58b8f67b..d8dec8911eb3 100644
|
|
--- a/Documentation/admin-guide/device-mapper/index.rst
|
|
+++ b/Documentation/admin-guide/device-mapper/index.rst
|
|
@@ -8,6 +8,7 @@ Device Mapper
|
|
cache-policies
|
|
cache
|
|
delay
|
|
+ dm-clone
|
|
dm-crypt
|
|
dm-flakey
|
|
dm-init
|
|
diff --git a/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt b/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt
|
|
index 6e5341b4f891..ee59409640f2 100644
|
|
--- a/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt
|
|
+++ b/Documentation/devicetree/bindings/reset/brcm,brcmstb-reset.txt
|
|
@@ -22,6 +22,6 @@ Example:
|
|
};
|
|
|
|
ðernet_switch {
|
|
- resets = <&reset>;
|
|
+ resets = <&reset 26>;
|
|
reset-names = "switch";
|
|
};
|
|
diff --git a/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt b/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt
|
|
index d6d5207fa996..17ff3892f439 100644
|
|
--- a/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt
|
|
+++ b/Documentation/devicetree/bindings/sound/mt8183-mt6358-ts3a227-max98357.txt
|
|
@@ -2,9 +2,11 @@ MT8183 with MT6358, TS3A227 and MAX98357 CODECS
|
|
|
|
Required properties:
|
|
- compatible : "mediatek,mt8183_mt6358_ts3a227_max98357"
|
|
-- mediatek,headset-codec: the phandles of ts3a227 codecs
|
|
- mediatek,platform: the phandle of MT8183 ASoC platform
|
|
|
|
+Optional properties:
|
|
+- mediatek,headset-codec: the phandles of ts3a227 codecs
|
|
+
|
|
Example:
|
|
|
|
sound {
|
|
diff --git a/Documentation/networking/j1939.rst b/Documentation/networking/j1939.rst
|
|
index dc60b13fcd09..f5be243d250a 100644
|
|
--- a/Documentation/networking/j1939.rst
|
|
+++ b/Documentation/networking/j1939.rst
|
|
@@ -339,7 +339,7 @@ To claim an address following code example can be used:
|
|
.pgn = J1939_PGN_ADDRESS_CLAIMED,
|
|
.pgn_mask = J1939_PGN_PDU1_MAX,
|
|
}, {
|
|
- .pgn = J1939_PGN_ADDRESS_REQUEST,
|
|
+ .pgn = J1939_PGN_REQUEST,
|
|
.pgn_mask = J1939_PGN_PDU1_MAX,
|
|
}, {
|
|
.pgn = J1939_PGN_ADDRESS_COMMANDED,
|
|
diff --git a/Documentation/scsi/smartpqi.txt b/Documentation/scsi/smartpqi.txt
|
|
index 201f80c7c050..df129f55ace5 100644
|
|
--- a/Documentation/scsi/smartpqi.txt
|
|
+++ b/Documentation/scsi/smartpqi.txt
|
|
@@ -29,7 +29,7 @@ smartpqi specific entries in /sys
|
|
smartpqi host attributes:
|
|
-------------------------
|
|
/sys/class/scsi_host/host*/rescan
|
|
- /sys/class/scsi_host/host*/version
|
|
+ /sys/class/scsi_host/host*/driver_version
|
|
|
|
The host rescan attribute is a write only attribute. Writing to this
|
|
attribute will trigger the driver to scan for new, changed, or removed
|
|
diff --git a/MAINTAINERS b/MAINTAINERS
|
|
index 9d3a5c54a41d..4f7ac27d8651 100644
|
|
--- a/MAINTAINERS
|
|
+++ b/MAINTAINERS
|
|
@@ -6973,6 +6973,7 @@ L: linux-acpi@vger.kernel.org
|
|
S: Maintained
|
|
F: Documentation/firmware-guide/acpi/gpio-properties.rst
|
|
F: drivers/gpio/gpiolib-acpi.c
|
|
+F: drivers/gpio/gpiolib-acpi.h
|
|
|
|
GPIO IR Transmitter
|
|
M: Sean Young <sean@mess.org>
|
|
diff --git a/Makefile b/Makefile
|
|
index 45c6264f1108..d4cf4700ae3f 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 5
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 12
|
|
+SUBLEVEL = 13
|
|
EXTRAVERSION =
|
|
NAME = Kleptomaniac Octopus
|
|
|
|
diff --git a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
|
|
index 04ad2fb22b9a..dba3488492f1 100644
|
|
--- a/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
|
|
+++ b/arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
|
|
@@ -623,6 +623,8 @@
|
|
l21 {
|
|
regulator-min-microvolt = <2950000>;
|
|
regulator-max-microvolt = <2950000>;
|
|
+ regulator-allow-set-load;
|
|
+ regulator-system-load = <200000>;
|
|
};
|
|
l22 {
|
|
regulator-min-microvolt = <3300000>;
|
|
diff --git a/arch/arm64/crypto/aes-neonbs-glue.c b/arch/arm64/crypto/aes-neonbs-glue.c
|
|
index ea873b8904c4..e3e27349a9fe 100644
|
|
--- a/arch/arm64/crypto/aes-neonbs-glue.c
|
|
+++ b/arch/arm64/crypto/aes-neonbs-glue.c
|
|
@@ -384,7 +384,7 @@ static int __xts_crypt(struct skcipher_request *req, bool encrypt,
|
|
goto xts_tail;
|
|
|
|
kernel_neon_end();
|
|
- skcipher_walk_done(&walk, nbytes);
|
|
+ err = skcipher_walk_done(&walk, nbytes);
|
|
}
|
|
|
|
if (err || likely(!tail))
|
|
diff --git a/arch/hexagon/include/asm/atomic.h b/arch/hexagon/include/asm/atomic.h
|
|
index 12cd9231c4b8..0231d69c8bf2 100644
|
|
--- a/arch/hexagon/include/asm/atomic.h
|
|
+++ b/arch/hexagon/include/asm/atomic.h
|
|
@@ -91,7 +91,7 @@ static inline void atomic_##op(int i, atomic_t *v) \
|
|
"1: %0 = memw_locked(%1);\n" \
|
|
" %0 = "#op "(%0,%2);\n" \
|
|
" memw_locked(%1,P3)=%0;\n" \
|
|
- " if !P3 jump 1b;\n" \
|
|
+ " if (!P3) jump 1b;\n" \
|
|
: "=&r" (output) \
|
|
: "r" (&v->counter), "r" (i) \
|
|
: "memory", "p3" \
|
|
@@ -107,7 +107,7 @@ static inline int atomic_##op##_return(int i, atomic_t *v) \
|
|
"1: %0 = memw_locked(%1);\n" \
|
|
" %0 = "#op "(%0,%2);\n" \
|
|
" memw_locked(%1,P3)=%0;\n" \
|
|
- " if !P3 jump 1b;\n" \
|
|
+ " if (!P3) jump 1b;\n" \
|
|
: "=&r" (output) \
|
|
: "r" (&v->counter), "r" (i) \
|
|
: "memory", "p3" \
|
|
@@ -124,7 +124,7 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
|
"1: %0 = memw_locked(%2);\n" \
|
|
" %1 = "#op "(%0,%3);\n" \
|
|
" memw_locked(%2,P3)=%1;\n" \
|
|
- " if !P3 jump 1b;\n" \
|
|
+ " if (!P3) jump 1b;\n" \
|
|
: "=&r" (output), "=&r" (val) \
|
|
: "r" (&v->counter), "r" (i) \
|
|
: "memory", "p3" \
|
|
@@ -173,7 +173,7 @@ static inline int atomic_fetch_add_unless(atomic_t *v, int a, int u)
|
|
" }"
|
|
" memw_locked(%2, p3) = %1;"
|
|
" {"
|
|
- " if !p3 jump 1b;"
|
|
+ " if (!p3) jump 1b;"
|
|
" }"
|
|
"2:"
|
|
: "=&r" (__oldval), "=&r" (tmp)
|
|
diff --git a/arch/hexagon/include/asm/bitops.h b/arch/hexagon/include/asm/bitops.h
|
|
index 47384b094b94..71429f756af0 100644
|
|
--- a/arch/hexagon/include/asm/bitops.h
|
|
+++ b/arch/hexagon/include/asm/bitops.h
|
|
@@ -38,7 +38,7 @@ static inline int test_and_clear_bit(int nr, volatile void *addr)
|
|
"1: R12 = memw_locked(R10);\n"
|
|
" { P0 = tstbit(R12,R11); R12 = clrbit(R12,R11); }\n"
|
|
" memw_locked(R10,P1) = R12;\n"
|
|
- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
: "=&r" (oldval)
|
|
: "r" (addr), "r" (nr)
|
|
: "r10", "r11", "r12", "p0", "p1", "memory"
|
|
@@ -62,7 +62,7 @@ static inline int test_and_set_bit(int nr, volatile void *addr)
|
|
"1: R12 = memw_locked(R10);\n"
|
|
" { P0 = tstbit(R12,R11); R12 = setbit(R12,R11); }\n"
|
|
" memw_locked(R10,P1) = R12;\n"
|
|
- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
: "=&r" (oldval)
|
|
: "r" (addr), "r" (nr)
|
|
: "r10", "r11", "r12", "p0", "p1", "memory"
|
|
@@ -88,7 +88,7 @@ static inline int test_and_change_bit(int nr, volatile void *addr)
|
|
"1: R12 = memw_locked(R10);\n"
|
|
" { P0 = tstbit(R12,R11); R12 = togglebit(R12,R11); }\n"
|
|
" memw_locked(R10,P1) = R12;\n"
|
|
- " {if !P1 jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
+ " {if (!P1) jump 1b; %0 = mux(P0,#1,#0);}\n"
|
|
: "=&r" (oldval)
|
|
: "r" (addr), "r" (nr)
|
|
: "r10", "r11", "r12", "p0", "p1", "memory"
|
|
@@ -223,7 +223,7 @@ static inline int ffs(int x)
|
|
int r;
|
|
|
|
asm("{ P0 = cmp.eq(%1,#0); %0 = ct0(%1);}\n"
|
|
- "{ if P0 %0 = #0; if !P0 %0 = add(%0,#1);}\n"
|
|
+ "{ if (P0) %0 = #0; if (!P0) %0 = add(%0,#1);}\n"
|
|
: "=&r" (r)
|
|
: "r" (x)
|
|
: "p0");
|
|
diff --git a/arch/hexagon/include/asm/cmpxchg.h b/arch/hexagon/include/asm/cmpxchg.h
|
|
index 6091322c3af9..92b8a02e588a 100644
|
|
--- a/arch/hexagon/include/asm/cmpxchg.h
|
|
+++ b/arch/hexagon/include/asm/cmpxchg.h
|
|
@@ -30,7 +30,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
|
|
__asm__ __volatile__ (
|
|
"1: %0 = memw_locked(%1);\n" /* load into retval */
|
|
" memw_locked(%1,P0) = %2;\n" /* store into memory */
|
|
- " if !P0 jump 1b;\n"
|
|
+ " if (!P0) jump 1b;\n"
|
|
: "=&r" (retval)
|
|
: "r" (ptr), "r" (x)
|
|
: "memory", "p0"
|
|
diff --git a/arch/hexagon/include/asm/futex.h b/arch/hexagon/include/asm/futex.h
|
|
index cb635216a732..0191f7c7193e 100644
|
|
--- a/arch/hexagon/include/asm/futex.h
|
|
+++ b/arch/hexagon/include/asm/futex.h
|
|
@@ -16,7 +16,7 @@
|
|
/* For example: %1 = %4 */ \
|
|
insn \
|
|
"2: memw_locked(%3,p2) = %1;\n" \
|
|
- " if !p2 jump 1b;\n" \
|
|
+ " if (!p2) jump 1b;\n" \
|
|
" %1 = #0;\n" \
|
|
"3:\n" \
|
|
".section .fixup,\"ax\"\n" \
|
|
@@ -84,10 +84,10 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval,
|
|
"1: %1 = memw_locked(%3)\n"
|
|
" {\n"
|
|
" p2 = cmp.eq(%1,%4)\n"
|
|
- " if !p2.new jump:NT 3f\n"
|
|
+ " if (!p2.new) jump:NT 3f\n"
|
|
" }\n"
|
|
"2: memw_locked(%3,p2) = %5\n"
|
|
- " if !p2 jump 1b\n"
|
|
+ " if (!p2) jump 1b\n"
|
|
"3:\n"
|
|
".section .fixup,\"ax\"\n"
|
|
"4: %0 = #%6\n"
|
|
diff --git a/arch/hexagon/include/asm/spinlock.h b/arch/hexagon/include/asm/spinlock.h
|
|
index bfe07d842ff3..ef103b73bec8 100644
|
|
--- a/arch/hexagon/include/asm/spinlock.h
|
|
+++ b/arch/hexagon/include/asm/spinlock.h
|
|
@@ -30,9 +30,9 @@ static inline void arch_read_lock(arch_rwlock_t *lock)
|
|
__asm__ __volatile__(
|
|
"1: R6 = memw_locked(%0);\n"
|
|
" { P3 = cmp.ge(R6,#0); R6 = add(R6,#1);}\n"
|
|
- " { if !P3 jump 1b; }\n"
|
|
+ " { if (!P3) jump 1b; }\n"
|
|
" memw_locked(%0,P3) = R6;\n"
|
|
- " { if !P3 jump 1b; }\n"
|
|
+ " { if (!P3) jump 1b; }\n"
|
|
:
|
|
: "r" (&lock->lock)
|
|
: "memory", "r6", "p3"
|
|
@@ -46,7 +46,7 @@ static inline void arch_read_unlock(arch_rwlock_t *lock)
|
|
"1: R6 = memw_locked(%0);\n"
|
|
" R6 = add(R6,#-1);\n"
|
|
" memw_locked(%0,P3) = R6\n"
|
|
- " if !P3 jump 1b;\n"
|
|
+ " if (!P3) jump 1b;\n"
|
|
:
|
|
: "r" (&lock->lock)
|
|
: "memory", "r6", "p3"
|
|
@@ -61,7 +61,7 @@ static inline int arch_read_trylock(arch_rwlock_t *lock)
|
|
__asm__ __volatile__(
|
|
" R6 = memw_locked(%1);\n"
|
|
" { %0 = #0; P3 = cmp.ge(R6,#0); R6 = add(R6,#1);}\n"
|
|
- " { if !P3 jump 1f; }\n"
|
|
+ " { if (!P3) jump 1f; }\n"
|
|
" memw_locked(%1,P3) = R6;\n"
|
|
" { %0 = P3 }\n"
|
|
"1:\n"
|
|
@@ -78,9 +78,9 @@ static inline void arch_write_lock(arch_rwlock_t *lock)
|
|
__asm__ __volatile__(
|
|
"1: R6 = memw_locked(%0)\n"
|
|
" { P3 = cmp.eq(R6,#0); R6 = #-1;}\n"
|
|
- " { if !P3 jump 1b; }\n"
|
|
+ " { if (!P3) jump 1b; }\n"
|
|
" memw_locked(%0,P3) = R6;\n"
|
|
- " { if !P3 jump 1b; }\n"
|
|
+ " { if (!P3) jump 1b; }\n"
|
|
:
|
|
: "r" (&lock->lock)
|
|
: "memory", "r6", "p3"
|
|
@@ -94,7 +94,7 @@ static inline int arch_write_trylock(arch_rwlock_t *lock)
|
|
__asm__ __volatile__(
|
|
" R6 = memw_locked(%1)\n"
|
|
" { %0 = #0; P3 = cmp.eq(R6,#0); R6 = #-1;}\n"
|
|
- " { if !P3 jump 1f; }\n"
|
|
+ " { if (!P3) jump 1f; }\n"
|
|
" memw_locked(%1,P3) = R6;\n"
|
|
" %0 = P3;\n"
|
|
"1:\n"
|
|
@@ -117,9 +117,9 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|
__asm__ __volatile__(
|
|
"1: R6 = memw_locked(%0);\n"
|
|
" P3 = cmp.eq(R6,#0);\n"
|
|
- " { if !P3 jump 1b; R6 = #1; }\n"
|
|
+ " { if (!P3) jump 1b; R6 = #1; }\n"
|
|
" memw_locked(%0,P3) = R6;\n"
|
|
- " { if !P3 jump 1b; }\n"
|
|
+ " { if (!P3) jump 1b; }\n"
|
|
:
|
|
: "r" (&lock->lock)
|
|
: "memory", "r6", "p3"
|
|
@@ -139,7 +139,7 @@ static inline unsigned int arch_spin_trylock(arch_spinlock_t *lock)
|
|
__asm__ __volatile__(
|
|
" R6 = memw_locked(%1);\n"
|
|
" P3 = cmp.eq(R6,#0);\n"
|
|
- " { if !P3 jump 1f; R6 = #1; %0 = #0; }\n"
|
|
+ " { if (!P3) jump 1f; R6 = #1; %0 = #0; }\n"
|
|
" memw_locked(%1,P3) = R6;\n"
|
|
" %0 = P3;\n"
|
|
"1:\n"
|
|
diff --git a/arch/hexagon/kernel/stacktrace.c b/arch/hexagon/kernel/stacktrace.c
|
|
index 35f29423fda8..5ed02f699479 100644
|
|
--- a/arch/hexagon/kernel/stacktrace.c
|
|
+++ b/arch/hexagon/kernel/stacktrace.c
|
|
@@ -11,8 +11,6 @@
|
|
#include <linux/thread_info.h>
|
|
#include <linux/module.h>
|
|
|
|
-register unsigned long current_frame_pointer asm("r30");
|
|
-
|
|
struct stackframe {
|
|
unsigned long fp;
|
|
unsigned long rets;
|
|
@@ -30,7 +28,7 @@ void save_stack_trace(struct stack_trace *trace)
|
|
|
|
low = (unsigned long)task_stack_page(current);
|
|
high = low + THREAD_SIZE;
|
|
- fp = current_frame_pointer;
|
|
+ fp = (unsigned long)__builtin_frame_address(0);
|
|
|
|
while (fp >= low && fp <= (high - sizeof(*frame))) {
|
|
frame = (struct stackframe *)fp;
|
|
diff --git a/arch/hexagon/kernel/vm_entry.S b/arch/hexagon/kernel/vm_entry.S
|
|
index 12242c27e2df..4023fdbea490 100644
|
|
--- a/arch/hexagon/kernel/vm_entry.S
|
|
+++ b/arch/hexagon/kernel/vm_entry.S
|
|
@@ -369,7 +369,7 @@ ret_from_fork:
|
|
R26.L = #LO(do_work_pending);
|
|
R0 = #VM_INT_DISABLE;
|
|
}
|
|
- if P0 jump check_work_pending
|
|
+ if (P0) jump check_work_pending
|
|
{
|
|
R0 = R25;
|
|
callr R24
|
|
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
|
|
index 172801ed35b8..d859f079b771 100644
|
|
--- a/arch/mips/boot/compressed/Makefile
|
|
+++ b/arch/mips/boot/compressed/Makefile
|
|
@@ -29,6 +29,9 @@ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
|
|
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
|
|
-DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
|
|
|
|
+# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
|
|
+KCOV_INSTRUMENT := n
|
|
+
|
|
# decompressor objects (linked with vmlinuz)
|
|
vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o
|
|
|
|
diff --git a/arch/mips/include/asm/vdso/gettimeofday.h b/arch/mips/include/asm/vdso/gettimeofday.h
|
|
index b08825531e9f..0ae9b4cbc153 100644
|
|
--- a/arch/mips/include/asm/vdso/gettimeofday.h
|
|
+++ b/arch/mips/include/asm/vdso/gettimeofday.h
|
|
@@ -26,8 +26,6 @@
|
|
|
|
#define __VDSO_USE_SYSCALL ULLONG_MAX
|
|
|
|
-#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
|
-
|
|
static __always_inline long gettimeofday_fallback(
|
|
struct __kernel_old_timeval *_tv,
|
|
struct timezone *_tz)
|
|
@@ -48,17 +46,6 @@ static __always_inline long gettimeofday_fallback(
|
|
return error ? -ret : ret;
|
|
}
|
|
|
|
-#else
|
|
-
|
|
-static __always_inline long gettimeofday_fallback(
|
|
- struct __kernel_old_timeval *_tv,
|
|
- struct timezone *_tz)
|
|
-{
|
|
- return -1;
|
|
-}
|
|
-
|
|
-#endif
|
|
-
|
|
static __always_inline long clock_gettime_fallback(
|
|
clockid_t _clkid,
|
|
struct __kernel_timespec *_ts)
|
|
diff --git a/arch/mips/kernel/cacheinfo.c b/arch/mips/kernel/cacheinfo.c
|
|
index f777e44653d5..47312c529410 100644
|
|
--- a/arch/mips/kernel/cacheinfo.c
|
|
+++ b/arch/mips/kernel/cacheinfo.c
|
|
@@ -50,6 +50,25 @@ static int __init_cache_level(unsigned int cpu)
|
|
return 0;
|
|
}
|
|
|
|
+static void fill_cpumask_siblings(int cpu, cpumask_t *cpu_map)
|
|
+{
|
|
+ int cpu1;
|
|
+
|
|
+ for_each_possible_cpu(cpu1)
|
|
+ if (cpus_are_siblings(cpu, cpu1))
|
|
+ cpumask_set_cpu(cpu1, cpu_map);
|
|
+}
|
|
+
|
|
+static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map)
|
|
+{
|
|
+ int cpu1;
|
|
+ int cluster = cpu_cluster(&cpu_data[cpu]);
|
|
+
|
|
+ for_each_possible_cpu(cpu1)
|
|
+ if (cpu_cluster(&cpu_data[cpu1]) == cluster)
|
|
+ cpumask_set_cpu(cpu1, cpu_map);
|
|
+}
|
|
+
|
|
static int __populate_cache_leaves(unsigned int cpu)
|
|
{
|
|
struct cpuinfo_mips *c = ¤t_cpu_data;
|
|
@@ -57,14 +76,20 @@ static int __populate_cache_leaves(unsigned int cpu)
|
|
struct cacheinfo *this_leaf = this_cpu_ci->info_list;
|
|
|
|
if (c->icache.waysize) {
|
|
+ /* L1 caches are per core */
|
|
+ fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
|
|
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_DATA);
|
|
+ fill_cpumask_siblings(cpu, &this_leaf->shared_cpu_map);
|
|
populate_cache(icache, this_leaf, 1, CACHE_TYPE_INST);
|
|
} else {
|
|
populate_cache(dcache, this_leaf, 1, CACHE_TYPE_UNIFIED);
|
|
}
|
|
|
|
- if (c->scache.waysize)
|
|
+ if (c->scache.waysize) {
|
|
+ /* L2 cache is per cluster */
|
|
+ fill_cpumask_cluster(cpu, &this_leaf->shared_cpu_map);
|
|
populate_cache(scache, this_leaf, 2, CACHE_TYPE_UNIFIED);
|
|
+ }
|
|
|
|
if (c->tcache.waysize)
|
|
populate_cache(tcache, this_leaf, 3, CACHE_TYPE_UNIFIED);
|
|
diff --git a/arch/mips/pci/pci-xtalk-bridge.c b/arch/mips/pci/pci-xtalk-bridge.c
|
|
index 7b4d40354ee7..30017d5945bc 100644
|
|
--- a/arch/mips/pci/pci-xtalk-bridge.c
|
|
+++ b/arch/mips/pci/pci-xtalk-bridge.c
|
|
@@ -279,16 +279,15 @@ static int bridge_set_affinity(struct irq_data *d, const struct cpumask *mask,
|
|
struct bridge_irq_chip_data *data = d->chip_data;
|
|
int bit = d->parent_data->hwirq;
|
|
int pin = d->hwirq;
|
|
- nasid_t nasid;
|
|
int ret, cpu;
|
|
|
|
ret = irq_chip_set_affinity_parent(d, mask, force);
|
|
if (ret >= 0) {
|
|
cpu = cpumask_first_and(mask, cpu_online_mask);
|
|
- nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu));
|
|
+ data->nnasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu));
|
|
bridge_write(data->bc, b_int_addr[pin].addr,
|
|
(((data->bc->intr_addr >> 30) & 0x30000) |
|
|
- bit | (nasid << 8)));
|
|
+ bit | (data->nasid << 8)));
|
|
bridge_read(data->bc, b_wid_tflush);
|
|
}
|
|
return ret;
|
|
diff --git a/arch/mips/sgi-ip27/ip27-irq.c b/arch/mips/sgi-ip27/ip27-irq.c
|
|
index 37be04975831..79a2f6bd2b5a 100644
|
|
--- a/arch/mips/sgi-ip27/ip27-irq.c
|
|
+++ b/arch/mips/sgi-ip27/ip27-irq.c
|
|
@@ -73,6 +73,9 @@ static void setup_hub_mask(struct hub_irq_data *hd, const struct cpumask *mask)
|
|
int cpu;
|
|
|
|
cpu = cpumask_first_and(mask, cpu_online_mask);
|
|
+ if (cpu >= nr_cpu_ids)
|
|
+ cpu = cpumask_any(cpu_online_mask);
|
|
+
|
|
nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu));
|
|
hd->cpu = cpu;
|
|
if (!cputoslice(cpu)) {
|
|
@@ -139,6 +142,7 @@ static int hub_domain_alloc(struct irq_domain *domain, unsigned int virq,
|
|
/* use CPU connected to nearest hub */
|
|
hub = hub_data(NASID_TO_COMPACT_NODEID(info->nasid));
|
|
setup_hub_mask(hd, &hub->h_cpus);
|
|
+ info->nasid = cpu_to_node(hd->cpu);
|
|
|
|
/* Make sure it's not already pending when we connect it. */
|
|
REMOTE_HUB_CLR_INTR(info->nasid, swlevel);
|
|
diff --git a/arch/mips/vdso/vgettimeofday.c b/arch/mips/vdso/vgettimeofday.c
|
|
index 6ebdc37c89fc..6b83b6376a4b 100644
|
|
--- a/arch/mips/vdso/vgettimeofday.c
|
|
+++ b/arch/mips/vdso/vgettimeofday.c
|
|
@@ -17,12 +17,22 @@ int __vdso_clock_gettime(clockid_t clock,
|
|
return __cvdso_clock_gettime32(clock, ts);
|
|
}
|
|
|
|
+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
|
+
|
|
+/*
|
|
+ * This is behind the ifdef so that we don't provide the symbol when there's no
|
|
+ * possibility of there being a usable clocksource, because there's nothing we
|
|
+ * can do without it. When libc fails the symbol lookup it should fall back on
|
|
+ * the standard syscall path.
|
|
+ */
|
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
|
struct timezone *tz)
|
|
{
|
|
return __cvdso_gettimeofday(tv, tz);
|
|
}
|
|
|
|
+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
|
+
|
|
int __vdso_clock_getres(clockid_t clock_id,
|
|
struct old_timespec32 *res)
|
|
{
|
|
@@ -43,12 +53,22 @@ int __vdso_clock_gettime(clockid_t clock,
|
|
return __cvdso_clock_gettime(clock, ts);
|
|
}
|
|
|
|
+#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
|
+
|
|
+/*
|
|
+ * This is behind the ifdef so that we don't provide the symbol when there's no
|
|
+ * possibility of there being a usable clocksource, because there's nothing we
|
|
+ * can do without it. When libc fails the symbol lookup it should fall back on
|
|
+ * the standard syscall path.
|
|
+ */
|
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
|
struct timezone *tz)
|
|
{
|
|
return __cvdso_gettimeofday(tv, tz);
|
|
}
|
|
|
|
+#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
|
+
|
|
int __vdso_clock_getres(clockid_t clock_id,
|
|
struct __kernel_timespec *res)
|
|
{
|
|
diff --git a/arch/nds32/include/asm/cacheflush.h b/arch/nds32/include/asm/cacheflush.h
|
|
index d9ac7e6408ef..caddded56e77 100644
|
|
--- a/arch/nds32/include/asm/cacheflush.h
|
|
+++ b/arch/nds32/include/asm/cacheflush.h
|
|
@@ -9,7 +9,11 @@
|
|
#define PG_dcache_dirty PG_arch_1
|
|
|
|
void flush_icache_range(unsigned long start, unsigned long end);
|
|
+#define flush_icache_range flush_icache_range
|
|
+
|
|
void flush_icache_page(struct vm_area_struct *vma, struct page *page);
|
|
+#define flush_icache_page flush_icache_page
|
|
+
|
|
#ifdef CONFIG_CPU_CACHE_ALIASING
|
|
void flush_cache_mm(struct mm_struct *mm);
|
|
void flush_cache_dup_mm(struct mm_struct *mm);
|
|
@@ -40,12 +44,11 @@ void invalidate_kernel_vmap_range(void *addr, int size);
|
|
#define flush_dcache_mmap_unlock(mapping) xa_unlock_irq(&(mapping)->i_pages)
|
|
|
|
#else
|
|
-#include <asm-generic/cacheflush.h>
|
|
-#undef flush_icache_range
|
|
-#undef flush_icache_page
|
|
-#undef flush_icache_user_range
|
|
void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
|
|
unsigned long addr, int len);
|
|
+#define flush_icache_user_range flush_icache_user_range
|
|
+
|
|
+#include <asm-generic/cacheflush.h>
|
|
#endif
|
|
|
|
#endif /* __NDS32_CACHEFLUSH_H__ */
|
|
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c
|
|
index 2825d004dece..c0bea75ac27b 100644
|
|
--- a/arch/powerpc/platforms/powernv/pci.c
|
|
+++ b/arch/powerpc/platforms/powernv/pci.c
|
|
@@ -945,6 +945,23 @@ void __init pnv_pci_init(void)
|
|
if (!firmware_has_feature(FW_FEATURE_OPAL))
|
|
return;
|
|
|
|
+#ifdef CONFIG_PCIEPORTBUS
|
|
+ /*
|
|
+ * On PowerNV PCIe devices are (currently) managed in cooperation
|
|
+ * with firmware. This isn't *strictly* required, but there's enough
|
|
+ * assumptions baked into both firmware and the platform code that
|
|
+ * it's unwise to allow the portbus services to be used.
|
|
+ *
|
|
+ * We need to fix this eventually, but for now set this flag to disable
|
|
+ * the portbus driver. The AER service isn't required since that AER
|
|
+ * events are handled via EEH. The pciehp hotplug driver can't work
|
|
+ * without kernel changes (and portbus binding breaks pnv_php). The
|
|
+ * other services also require some thinking about how we're going
|
|
+ * to integrate them.
|
|
+ */
|
|
+ pcie_ports_disabled = true;
|
|
+#endif
|
|
+
|
|
/* Look for IODA IO-Hubs. */
|
|
for_each_compatible_node(np, NULL, "ibm,ioda-hub") {
|
|
pnv_pci_init_ioda_hub(np);
|
|
diff --git a/arch/riscv/mm/cacheflush.c b/arch/riscv/mm/cacheflush.c
|
|
index 3f15938dec89..c54bd3c79955 100644
|
|
--- a/arch/riscv/mm/cacheflush.c
|
|
+++ b/arch/riscv/mm/cacheflush.c
|
|
@@ -14,6 +14,7 @@ void flush_icache_all(void)
|
|
{
|
|
sbi_remote_fence_i(NULL);
|
|
}
|
|
+EXPORT_SYMBOL(flush_icache_all);
|
|
|
|
/*
|
|
* Performs an icache flush for the given MM context. RISC-V has no direct
|
|
diff --git a/arch/x86/entry/syscall_32.c b/arch/x86/entry/syscall_32.c
|
|
index aa3336a7cb15..7d17b3addbbb 100644
|
|
--- a/arch/x86/entry/syscall_32.c
|
|
+++ b/arch/x86/entry/syscall_32.c
|
|
@@ -10,13 +10,11 @@
|
|
#ifdef CONFIG_IA32_EMULATION
|
|
/* On X86_64, we use struct pt_regs * to pass parameters to syscalls */
|
|
#define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
|
|
-
|
|
-/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */
|
|
-extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
|
|
-
|
|
+#define __sys_ni_syscall __ia32_sys_ni_syscall
|
|
#else /* CONFIG_IA32_EMULATION */
|
|
#define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
|
|
extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
|
|
+#define __sys_ni_syscall sys_ni_syscall
|
|
#endif /* CONFIG_IA32_EMULATION */
|
|
|
|
#include <asm/syscalls_32.h>
|
|
@@ -29,6 +27,6 @@ __visible const sys_call_ptr_t ia32_sys_call_table[__NR_syscall_compat_max+1] =
|
|
* Smells like a compiler bug -- it doesn't work
|
|
* when the & below is removed.
|
|
*/
|
|
- [0 ... __NR_syscall_compat_max] = &sys_ni_syscall,
|
|
+ [0 ... __NR_syscall_compat_max] = &__sys_ni_syscall,
|
|
#include <asm/syscalls_32.h>
|
|
};
|
|
diff --git a/arch/x86/entry/syscall_64.c b/arch/x86/entry/syscall_64.c
|
|
index b1bf31713374..adf619a856e8 100644
|
|
--- a/arch/x86/entry/syscall_64.c
|
|
+++ b/arch/x86/entry/syscall_64.c
|
|
@@ -4,11 +4,17 @@
|
|
#include <linux/linkage.h>
|
|
#include <linux/sys.h>
|
|
#include <linux/cache.h>
|
|
+#include <linux/syscalls.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/syscall.h>
|
|
|
|
-/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */
|
|
-extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
|
|
+extern asmlinkage long sys_ni_syscall(void);
|
|
+
|
|
+SYSCALL_DEFINE0(ni_syscall)
|
|
+{
|
|
+ return sys_ni_syscall();
|
|
+}
|
|
+
|
|
#define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
|
|
#define __SYSCALL_X32(nr, sym, qual) __SYSCALL_64(nr, sym, qual)
|
|
#include <asm/syscalls_64.h>
|
|
@@ -23,7 +29,7 @@ asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {
|
|
* Smells like a compiler bug -- it doesn't work
|
|
* when the & below is removed.
|
|
*/
|
|
- [0 ... __NR_syscall_max] = &sys_ni_syscall,
|
|
+ [0 ... __NR_syscall_max] = &__x64_sys_ni_syscall,
|
|
#include <asm/syscalls_64.h>
|
|
};
|
|
|
|
@@ -40,7 +46,7 @@ asmlinkage const sys_call_ptr_t x32_sys_call_table[__NR_syscall_x32_max+1] = {
|
|
* Smells like a compiler bug -- it doesn't work
|
|
* when the & below is removed.
|
|
*/
|
|
- [0 ... __NR_syscall_x32_max] = &sys_ni_syscall,
|
|
+ [0 ... __NR_syscall_x32_max] = &__x64_sys_ni_syscall,
|
|
#include <asm/syscalls_64.h>
|
|
};
|
|
|
|
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
|
|
index 3fe02546aed3..15908eb9b17e 100644
|
|
--- a/arch/x86/entry/syscalls/syscall_32.tbl
|
|
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
|
|
@@ -124,13 +124,13 @@
|
|
110 i386 iopl sys_iopl __ia32_sys_iopl
|
|
111 i386 vhangup sys_vhangup __ia32_sys_vhangup
|
|
112 i386 idle
|
|
-113 i386 vm86old sys_vm86old sys_ni_syscall
|
|
+113 i386 vm86old sys_vm86old __ia32_sys_ni_syscall
|
|
114 i386 wait4 sys_wait4 __ia32_compat_sys_wait4
|
|
115 i386 swapoff sys_swapoff __ia32_sys_swapoff
|
|
116 i386 sysinfo sys_sysinfo __ia32_compat_sys_sysinfo
|
|
117 i386 ipc sys_ipc __ia32_compat_sys_ipc
|
|
118 i386 fsync sys_fsync __ia32_sys_fsync
|
|
-119 i386 sigreturn sys_sigreturn sys32_sigreturn
|
|
+119 i386 sigreturn sys_sigreturn __ia32_compat_sys_sigreturn
|
|
120 i386 clone sys_clone __ia32_compat_sys_x86_clone
|
|
121 i386 setdomainname sys_setdomainname __ia32_sys_setdomainname
|
|
122 i386 uname sys_newuname __ia32_sys_newuname
|
|
@@ -177,14 +177,14 @@
|
|
163 i386 mremap sys_mremap __ia32_sys_mremap
|
|
164 i386 setresuid sys_setresuid16 __ia32_sys_setresuid16
|
|
165 i386 getresuid sys_getresuid16 __ia32_sys_getresuid16
|
|
-166 i386 vm86 sys_vm86 sys_ni_syscall
|
|
+166 i386 vm86 sys_vm86 __ia32_sys_ni_syscall
|
|
167 i386 query_module
|
|
168 i386 poll sys_poll __ia32_sys_poll
|
|
169 i386 nfsservctl
|
|
170 i386 setresgid sys_setresgid16 __ia32_sys_setresgid16
|
|
171 i386 getresgid sys_getresgid16 __ia32_sys_getresgid16
|
|
172 i386 prctl sys_prctl __ia32_sys_prctl
|
|
-173 i386 rt_sigreturn sys_rt_sigreturn sys32_rt_sigreturn
|
|
+173 i386 rt_sigreturn sys_rt_sigreturn __ia32_compat_sys_rt_sigreturn
|
|
174 i386 rt_sigaction sys_rt_sigaction __ia32_compat_sys_rt_sigaction
|
|
175 i386 rt_sigprocmask sys_rt_sigprocmask __ia32_compat_sys_rt_sigprocmask
|
|
176 i386 rt_sigpending sys_rt_sigpending __ia32_compat_sys_rt_sigpending
|
|
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
|
|
index 1cee10091b9f..30416d7f19d4 100644
|
|
--- a/arch/x86/ia32/ia32_signal.c
|
|
+++ b/arch/x86/ia32/ia32_signal.c
|
|
@@ -21,6 +21,7 @@
|
|
#include <linux/personality.h>
|
|
#include <linux/compat.h>
|
|
#include <linux/binfmts.h>
|
|
+#include <linux/syscalls.h>
|
|
#include <asm/ucontext.h>
|
|
#include <linux/uaccess.h>
|
|
#include <asm/fpu/internal.h>
|
|
@@ -118,7 +119,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
|
|
return err;
|
|
}
|
|
|
|
-asmlinkage long sys32_sigreturn(void)
|
|
+COMPAT_SYSCALL_DEFINE0(sigreturn)
|
|
{
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
|
|
@@ -144,7 +145,7 @@ badframe:
|
|
return 0;
|
|
}
|
|
|
|
-asmlinkage long sys32_rt_sigreturn(void)
|
|
+COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
|
|
{
|
|
struct pt_regs *regs = current_pt_regs();
|
|
struct rt_sigframe_ia32 __user *frame;
|
|
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
|
|
index 90eb70df0b18..e2389ce9bf58 100644
|
|
--- a/arch/x86/include/asm/syscall_wrapper.h
|
|
+++ b/arch/x86/include/asm/syscall_wrapper.h
|
|
@@ -6,6 +6,8 @@
|
|
#ifndef _ASM_X86_SYSCALL_WRAPPER_H
|
|
#define _ASM_X86_SYSCALL_WRAPPER_H
|
|
|
|
+struct pt_regs;
|
|
+
|
|
/* Mapping of registers to parameters for syscalls on x86-64 and x32 */
|
|
#define SC_X86_64_REGS_TO_ARGS(x, ...) \
|
|
__MAP(x,__SC_ARGS \
|
|
@@ -28,13 +30,21 @@
|
|
* kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
|
|
* case as well.
|
|
*/
|
|
+#define __IA32_COMPAT_SYS_STUB0(x, name) \
|
|
+ asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\
|
|
+ ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO); \
|
|
+ asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\
|
|
+ { \
|
|
+ return __se_compat_sys_##name(); \
|
|
+ }
|
|
+
|
|
#define __IA32_COMPAT_SYS_STUBx(x, name, ...) \
|
|
asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs);\
|
|
ALLOW_ERROR_INJECTION(__ia32_compat_sys##name, ERRNO); \
|
|
asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs)\
|
|
{ \
|
|
return __se_compat_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\
|
|
- } \
|
|
+ }
|
|
|
|
#define __IA32_SYS_STUBx(x, name, ...) \
|
|
asmlinkage long __ia32_sys##name(const struct pt_regs *regs); \
|
|
@@ -56,9 +66,15 @@
|
|
SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \
|
|
asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
|
|
|
|
-#define COND_SYSCALL(name) \
|
|
- cond_syscall(__x64_sys_##name); \
|
|
- cond_syscall(__ia32_sys_##name)
|
|
+#define COND_SYSCALL(name) \
|
|
+ asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
|
|
+ { \
|
|
+ return sys_ni_syscall(); \
|
|
+ } \
|
|
+ asmlinkage __weak long __ia32_sys_##name(const struct pt_regs *__unused)\
|
|
+ { \
|
|
+ return sys_ni_syscall(); \
|
|
+ }
|
|
|
|
#define SYS_NI(name) \
|
|
SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \
|
|
@@ -76,15 +92,24 @@
|
|
* of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
|
|
* with x86_64 obviously do not need such care.
|
|
*/
|
|
+#define __X32_COMPAT_SYS_STUB0(x, name, ...) \
|
|
+ asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs);\
|
|
+ ALLOW_ERROR_INJECTION(__x32_compat_sys_##name, ERRNO); \
|
|
+ asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs)\
|
|
+ { \
|
|
+ return __se_compat_sys_##name();\
|
|
+ }
|
|
+
|
|
#define __X32_COMPAT_SYS_STUBx(x, name, ...) \
|
|
asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs);\
|
|
ALLOW_ERROR_INJECTION(__x32_compat_sys##name, ERRNO); \
|
|
asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs)\
|
|
{ \
|
|
return __se_compat_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\
|
|
- } \
|
|
+ }
|
|
|
|
#else /* CONFIG_X86_X32 */
|
|
+#define __X32_COMPAT_SYS_STUB0(x, name)
|
|
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
|
|
#endif /* CONFIG_X86_X32 */
|
|
|
|
@@ -95,6 +120,17 @@
|
|
* mapping of registers to parameters, we need to generate stubs for each
|
|
* of them.
|
|
*/
|
|
+#define COMPAT_SYSCALL_DEFINE0(name) \
|
|
+ static long __se_compat_sys_##name(void); \
|
|
+ static inline long __do_compat_sys_##name(void); \
|
|
+ __IA32_COMPAT_SYS_STUB0(x, name) \
|
|
+ __X32_COMPAT_SYS_STUB0(x, name) \
|
|
+ static long __se_compat_sys_##name(void) \
|
|
+ { \
|
|
+ return __do_compat_sys_##name(); \
|
|
+ } \
|
|
+ static inline long __do_compat_sys_##name(void)
|
|
+
|
|
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
|
static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
|
|
static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
|
|
@@ -190,7 +226,11 @@
|
|
#endif
|
|
|
|
#ifndef COND_SYSCALL
|
|
-#define COND_SYSCALL(name) cond_syscall(__x64_sys_##name)
|
|
+#define COND_SYSCALL(name) \
|
|
+ asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
|
|
+ { \
|
|
+ return sys_ni_syscall(); \
|
|
+ }
|
|
#endif
|
|
|
|
#ifndef SYS_NI
|
|
@@ -202,7 +242,6 @@
|
|
* For VSYSCALLS, we need to declare these three syscalls with the new
|
|
* pt_regs-based calling convention for in-kernel use.
|
|
*/
|
|
-struct pt_regs;
|
|
asmlinkage long __x64_sys_getcpu(const struct pt_regs *regs);
|
|
asmlinkage long __x64_sys_gettimeofday(const struct pt_regs *regs);
|
|
asmlinkage long __x64_sys_time(const struct pt_regs *regs);
|
|
diff --git a/block/bio.c b/block/bio.c
|
|
index c822ceb7c4de..906da3581a3e 100644
|
|
--- a/block/bio.c
|
|
+++ b/block/bio.c
|
|
@@ -535,6 +535,16 @@ void zero_fill_bio_iter(struct bio *bio, struct bvec_iter start)
|
|
}
|
|
EXPORT_SYMBOL(zero_fill_bio_iter);
|
|
|
|
+/**
|
|
+ * bio_truncate - truncate the bio to small size of @new_size
|
|
+ * @bio: the bio to be truncated
|
|
+ * @new_size: new size for truncating the bio
|
|
+ *
|
|
+ * Description:
|
|
+ * Truncate the bio to new size of @new_size. If bio_op(bio) is
|
|
+ * REQ_OP_READ, zero the truncated part. This function should only
|
|
+ * be used for handling corner cases, such as bio eod.
|
|
+ */
|
|
void bio_truncate(struct bio *bio, unsigned new_size)
|
|
{
|
|
struct bio_vec bv;
|
|
@@ -545,7 +555,7 @@ void bio_truncate(struct bio *bio, unsigned new_size)
|
|
if (new_size >= bio->bi_iter.bi_size)
|
|
return;
|
|
|
|
- if (bio_data_dir(bio) != READ)
|
|
+ if (bio_op(bio) != REQ_OP_READ)
|
|
goto exit;
|
|
|
|
bio_for_each_segment(bv, bio, iter) {
|
|
diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c
|
|
index c1601edd70e3..e2c8ab408bed 100644
|
|
--- a/crypto/algif_skcipher.c
|
|
+++ b/crypto/algif_skcipher.c
|
|
@@ -56,7 +56,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
|
struct alg_sock *pask = alg_sk(psk);
|
|
struct af_alg_ctx *ctx = ask->private;
|
|
struct crypto_skcipher *tfm = pask->private;
|
|
- unsigned int bs = crypto_skcipher_blocksize(tfm);
|
|
+ unsigned int bs = crypto_skcipher_chunksize(tfm);
|
|
struct af_alg_async_req *areq;
|
|
int err = 0;
|
|
size_t len = 0;
|
|
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
|
|
index 27a95c86a80b..4fc294c2f9e8 100644
|
|
--- a/drivers/clk/clk.c
|
|
+++ b/drivers/clk/clk.c
|
|
@@ -3886,6 +3886,7 @@ void clk_unregister(struct clk *clk)
|
|
__func__, clk->core->name);
|
|
|
|
kref_put(&clk->core->ref, __clk_release);
|
|
+ free_clk(clk);
|
|
unlock:
|
|
clk_prepare_unlock();
|
|
}
|
|
diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c
|
|
index d43b4a3c0de8..047f1d8fe323 100644
|
|
--- a/drivers/clk/imx/clk-pll14xx.c
|
|
+++ b/drivers/clk/imx/clk-pll14xx.c
|
|
@@ -112,43 +112,17 @@ static unsigned long clk_pll1443x_recalc_rate(struct clk_hw *hw,
|
|
return fvco;
|
|
}
|
|
|
|
-static inline bool clk_pll1416x_mp_change(const struct imx_pll14xx_rate_table *rate,
|
|
+static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *rate,
|
|
u32 pll_div)
|
|
{
|
|
u32 old_mdiv, old_pdiv;
|
|
|
|
- old_mdiv = (pll_div >> MDIV_SHIFT) & MDIV_MASK;
|
|
- old_pdiv = (pll_div >> PDIV_SHIFT) & PDIV_MASK;
|
|
+ old_mdiv = (pll_div & MDIV_MASK) >> MDIV_SHIFT;
|
|
+ old_pdiv = (pll_div & PDIV_MASK) >> PDIV_SHIFT;
|
|
|
|
return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv;
|
|
}
|
|
|
|
-static inline bool clk_pll1443x_mpk_change(const struct imx_pll14xx_rate_table *rate,
|
|
- u32 pll_div_ctl0, u32 pll_div_ctl1)
|
|
-{
|
|
- u32 old_mdiv, old_pdiv, old_kdiv;
|
|
-
|
|
- old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK;
|
|
- old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK;
|
|
- old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK;
|
|
-
|
|
- return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv ||
|
|
- rate->kdiv != old_kdiv;
|
|
-}
|
|
-
|
|
-static inline bool clk_pll1443x_mp_change(const struct imx_pll14xx_rate_table *rate,
|
|
- u32 pll_div_ctl0, u32 pll_div_ctl1)
|
|
-{
|
|
- u32 old_mdiv, old_pdiv, old_kdiv;
|
|
-
|
|
- old_mdiv = (pll_div_ctl0 >> MDIV_SHIFT) & MDIV_MASK;
|
|
- old_pdiv = (pll_div_ctl0 >> PDIV_SHIFT) & PDIV_MASK;
|
|
- old_kdiv = (pll_div_ctl1 >> KDIV_SHIFT) & KDIV_MASK;
|
|
-
|
|
- return rate->mdiv != old_mdiv || rate->pdiv != old_pdiv ||
|
|
- rate->kdiv != old_kdiv;
|
|
-}
|
|
-
|
|
static int clk_pll14xx_wait_lock(struct clk_pll14xx *pll)
|
|
{
|
|
u32 val;
|
|
@@ -174,7 +148,7 @@ static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate,
|
|
|
|
tmp = readl_relaxed(pll->base + 4);
|
|
|
|
- if (!clk_pll1416x_mp_change(rate, tmp)) {
|
|
+ if (!clk_pll14xx_mp_change(rate, tmp)) {
|
|
tmp &= ~(SDIV_MASK) << SDIV_SHIFT;
|
|
tmp |= rate->sdiv << SDIV_SHIFT;
|
|
writel_relaxed(tmp, pll->base + 4);
|
|
@@ -239,13 +213,15 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate,
|
|
}
|
|
|
|
tmp = readl_relaxed(pll->base + 4);
|
|
- div_val = readl_relaxed(pll->base + 8);
|
|
|
|
- if (!clk_pll1443x_mpk_change(rate, tmp, div_val)) {
|
|
+ if (!clk_pll14xx_mp_change(rate, tmp)) {
|
|
tmp &= ~(SDIV_MASK) << SDIV_SHIFT;
|
|
tmp |= rate->sdiv << SDIV_SHIFT;
|
|
writel_relaxed(tmp, pll->base + 4);
|
|
|
|
+ tmp = rate->kdiv << KDIV_SHIFT;
|
|
+ writel_relaxed(tmp, pll->base + 8);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c
|
|
index 18b23cdf679c..aa2522624fd3 100644
|
|
--- a/drivers/clk/meson/axg-audio.c
|
|
+++ b/drivers/clk/meson/axg-audio.c
|
|
@@ -1001,7 +1001,7 @@ static const struct regmap_config axg_audio_regmap_cfg = {
|
|
.reg_bits = 32,
|
|
.val_bits = 32,
|
|
.reg_stride = 4,
|
|
- .max_register = AUDIO_CLK_PDMIN_CTRL1,
|
|
+ .max_register = AUDIO_CLK_SPDIFOUT_B_CTRL,
|
|
};
|
|
|
|
struct audioclk_data {
|
|
diff --git a/drivers/crypto/cavium/nitrox/nitrox_main.c b/drivers/crypto/cavium/nitrox/nitrox_main.c
|
|
index bc924980e10c..c4632d84c9a1 100644
|
|
--- a/drivers/crypto/cavium/nitrox/nitrox_main.c
|
|
+++ b/drivers/crypto/cavium/nitrox/nitrox_main.c
|
|
@@ -103,8 +103,7 @@ static void write_to_ucd_unit(struct nitrox_device *ndev, u32 ucode_size,
|
|
offset = UCD_UCODE_LOAD_BLOCK_NUM;
|
|
nitrox_write_csr(ndev, offset, block_num);
|
|
|
|
- code_size = ucode_size;
|
|
- code_size = roundup(code_size, 8);
|
|
+ code_size = roundup(ucode_size, 16);
|
|
while (code_size) {
|
|
data = ucode_data[i];
|
|
/* write 8 bytes at a time */
|
|
@@ -220,11 +219,11 @@ static int nitrox_load_fw(struct nitrox_device *ndev)
|
|
|
|
/* write block number and firmware length
|
|
* bit:<2:0> block number
|
|
- * bit:3 is set SE uses 32KB microcode
|
|
- * bit:3 is clear SE uses 64KB microcode
|
|
+ * bit:3 is set AE uses 32KB microcode
|
|
+ * bit:3 is clear AE uses 64KB microcode
|
|
*/
|
|
core_2_eid_val.value = 0ULL;
|
|
- core_2_eid_val.ucode_blk = 0;
|
|
+ core_2_eid_val.ucode_blk = 2;
|
|
if (ucode_size <= CNN55XX_UCD_BLOCK_SIZE)
|
|
core_2_eid_val.ucode_len = 1;
|
|
else
|
|
diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c
|
|
index 940485112d15..73a899e6f837 100644
|
|
--- a/drivers/crypto/geode-aes.c
|
|
+++ b/drivers/crypto/geode-aes.c
|
|
@@ -10,7 +10,7 @@
|
|
#include <linux/spinlock.h>
|
|
#include <crypto/algapi.h>
|
|
#include <crypto/aes.h>
|
|
-#include <crypto/skcipher.h>
|
|
+#include <crypto/internal/skcipher.h>
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/delay.h>
|
|
@@ -24,12 +24,12 @@ static spinlock_t lock;
|
|
|
|
/* Write a 128 bit field (either a writable key or IV) */
|
|
static inline void
|
|
-_writefield(u32 offset, void *value)
|
|
+_writefield(u32 offset, const void *value)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
- iowrite32(((u32 *) value)[i], _iobase + offset + (i * 4));
|
|
+ iowrite32(((const u32 *) value)[i], _iobase + offset + (i * 4));
|
|
}
|
|
|
|
/* Read a 128 bit field (either a writable key or IV) */
|
|
@@ -43,12 +43,12 @@ _readfield(u32 offset, void *value)
|
|
}
|
|
|
|
static int
|
|
-do_crypt(void *src, void *dst, int len, u32 flags)
|
|
+do_crypt(const void *src, void *dst, u32 len, u32 flags)
|
|
{
|
|
u32 status;
|
|
u32 counter = AES_OP_TIMEOUT;
|
|
|
|
- iowrite32(virt_to_phys(src), _iobase + AES_SOURCEA_REG);
|
|
+ iowrite32(virt_to_phys((void *)src), _iobase + AES_SOURCEA_REG);
|
|
iowrite32(virt_to_phys(dst), _iobase + AES_DSTA_REG);
|
|
iowrite32(len, _iobase + AES_LENA_REG);
|
|
|
|
@@ -65,16 +65,14 @@ do_crypt(void *src, void *dst, int len, u32 flags)
|
|
return counter ? 0 : 1;
|
|
}
|
|
|
|
-static unsigned int
|
|
-geode_aes_crypt(struct geode_aes_op *op)
|
|
+static void
|
|
+geode_aes_crypt(const struct geode_aes_tfm_ctx *tctx, const void *src,
|
|
+ void *dst, u32 len, u8 *iv, int mode, int dir)
|
|
{
|
|
u32 flags = 0;
|
|
unsigned long iflags;
|
|
int ret;
|
|
|
|
- if (op->len == 0)
|
|
- return 0;
|
|
-
|
|
/* If the source and destination is the same, then
|
|
* we need to turn on the coherent flags, otherwise
|
|
* we don't need to worry
|
|
@@ -82,32 +80,28 @@ geode_aes_crypt(struct geode_aes_op *op)
|
|
|
|
flags |= (AES_CTRL_DCA | AES_CTRL_SCA);
|
|
|
|
- if (op->dir == AES_DIR_ENCRYPT)
|
|
+ if (dir == AES_DIR_ENCRYPT)
|
|
flags |= AES_CTRL_ENCRYPT;
|
|
|
|
/* Start the critical section */
|
|
|
|
spin_lock_irqsave(&lock, iflags);
|
|
|
|
- if (op->mode == AES_MODE_CBC) {
|
|
+ if (mode == AES_MODE_CBC) {
|
|
flags |= AES_CTRL_CBC;
|
|
- _writefield(AES_WRITEIV0_REG, op->iv);
|
|
+ _writefield(AES_WRITEIV0_REG, iv);
|
|
}
|
|
|
|
- if (!(op->flags & AES_FLAGS_HIDDENKEY)) {
|
|
- flags |= AES_CTRL_WRKEY;
|
|
- _writefield(AES_WRITEKEY0_REG, op->key);
|
|
- }
|
|
+ flags |= AES_CTRL_WRKEY;
|
|
+ _writefield(AES_WRITEKEY0_REG, tctx->key);
|
|
|
|
- ret = do_crypt(op->src, op->dst, op->len, flags);
|
|
+ ret = do_crypt(src, dst, len, flags);
|
|
BUG_ON(ret);
|
|
|
|
- if (op->mode == AES_MODE_CBC)
|
|
- _readfield(AES_WRITEIV0_REG, op->iv);
|
|
+ if (mode == AES_MODE_CBC)
|
|
+ _readfield(AES_WRITEIV0_REG, iv);
|
|
|
|
spin_unlock_irqrestore(&lock, iflags);
|
|
-
|
|
- return op->len;
|
|
}
|
|
|
|
/* CRYPTO-API Functions */
|
|
@@ -115,13 +109,13 @@ geode_aes_crypt(struct geode_aes_op *op)
|
|
static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key,
|
|
unsigned int len)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm);
|
|
unsigned int ret;
|
|
|
|
- op->keylen = len;
|
|
+ tctx->keylen = len;
|
|
|
|
if (len == AES_KEYSIZE_128) {
|
|
- memcpy(op->key, key, len);
|
|
+ memcpy(tctx->key, key, len);
|
|
return 0;
|
|
}
|
|
|
|
@@ -134,132 +128,93 @@ static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key,
|
|
/*
|
|
* The requested key size is not supported by HW, do a fallback
|
|
*/
|
|
- op->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK;
|
|
- op->fallback.cip->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK);
|
|
+ tctx->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK;
|
|
+ tctx->fallback.cip->base.crt_flags |=
|
|
+ (tfm->crt_flags & CRYPTO_TFM_REQ_MASK);
|
|
|
|
- ret = crypto_cipher_setkey(op->fallback.cip, key, len);
|
|
+ ret = crypto_cipher_setkey(tctx->fallback.cip, key, len);
|
|
if (ret) {
|
|
tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
|
|
- tfm->crt_flags |= (op->fallback.cip->base.crt_flags & CRYPTO_TFM_RES_MASK);
|
|
+ tfm->crt_flags |= (tctx->fallback.cip->base.crt_flags &
|
|
+ CRYPTO_TFM_RES_MASK);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
-static int geode_setkey_blk(struct crypto_tfm *tfm, const u8 *key,
|
|
- unsigned int len)
|
|
+static int geode_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key,
|
|
+ unsigned int len)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
|
|
unsigned int ret;
|
|
|
|
- op->keylen = len;
|
|
+ tctx->keylen = len;
|
|
|
|
if (len == AES_KEYSIZE_128) {
|
|
- memcpy(op->key, key, len);
|
|
+ memcpy(tctx->key, key, len);
|
|
return 0;
|
|
}
|
|
|
|
if (len != AES_KEYSIZE_192 && len != AES_KEYSIZE_256) {
|
|
/* not supported at all */
|
|
- tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
|
|
+ crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
|
return -EINVAL;
|
|
}
|
|
|
|
/*
|
|
* The requested key size is not supported by HW, do a fallback
|
|
*/
|
|
- crypto_sync_skcipher_clear_flags(op->fallback.blk, CRYPTO_TFM_REQ_MASK);
|
|
- crypto_sync_skcipher_set_flags(op->fallback.blk,
|
|
- tfm->crt_flags & CRYPTO_TFM_REQ_MASK);
|
|
-
|
|
- ret = crypto_sync_skcipher_setkey(op->fallback.blk, key, len);
|
|
- if (ret) {
|
|
- tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
|
|
- tfm->crt_flags |= crypto_sync_skcipher_get_flags(op->fallback.blk) &
|
|
- CRYPTO_TFM_RES_MASK;
|
|
- }
|
|
+ crypto_skcipher_clear_flags(tctx->fallback.skcipher,
|
|
+ CRYPTO_TFM_REQ_MASK);
|
|
+ crypto_skcipher_set_flags(tctx->fallback.skcipher,
|
|
+ crypto_skcipher_get_flags(tfm) &
|
|
+ CRYPTO_TFM_REQ_MASK);
|
|
+ ret = crypto_skcipher_setkey(tctx->fallback.skcipher, key, len);
|
|
+ crypto_skcipher_set_flags(tfm,
|
|
+ crypto_skcipher_get_flags(tctx->fallback.skcipher) &
|
|
+ CRYPTO_TFM_RES_MASK);
|
|
return ret;
|
|
}
|
|
|
|
-static int fallback_blk_dec(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
-{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- SYNC_SKCIPHER_REQUEST_ON_STACK(req, op->fallback.blk);
|
|
-
|
|
- skcipher_request_set_sync_tfm(req, op->fallback.blk);
|
|
- skcipher_request_set_callback(req, 0, NULL, NULL);
|
|
- skcipher_request_set_crypt(req, src, dst, nbytes, desc->info);
|
|
-
|
|
- return crypto_skcipher_decrypt(req);
|
|
-}
|
|
-
|
|
-static int fallback_blk_enc(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
-{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- SYNC_SKCIPHER_REQUEST_ON_STACK(req, op->fallback.blk);
|
|
-
|
|
- skcipher_request_set_sync_tfm(req, op->fallback.blk);
|
|
- skcipher_request_set_callback(req, 0, NULL, NULL);
|
|
- skcipher_request_set_crypt(req, src, dst, nbytes, desc->info);
|
|
-
|
|
- return crypto_skcipher_encrypt(req);
|
|
-}
|
|
-
|
|
static void
|
|
geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm);
|
|
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128)) {
|
|
- crypto_cipher_encrypt_one(op->fallback.cip, out, in);
|
|
+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) {
|
|
+ crypto_cipher_encrypt_one(tctx->fallback.cip, out, in);
|
|
return;
|
|
}
|
|
|
|
- op->src = (void *) in;
|
|
- op->dst = (void *) out;
|
|
- op->mode = AES_MODE_ECB;
|
|
- op->flags = 0;
|
|
- op->len = AES_BLOCK_SIZE;
|
|
- op->dir = AES_DIR_ENCRYPT;
|
|
-
|
|
- geode_aes_crypt(op);
|
|
+ geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL,
|
|
+ AES_MODE_ECB, AES_DIR_ENCRYPT);
|
|
}
|
|
|
|
|
|
static void
|
|
geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm);
|
|
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128)) {
|
|
- crypto_cipher_decrypt_one(op->fallback.cip, out, in);
|
|
+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) {
|
|
+ crypto_cipher_decrypt_one(tctx->fallback.cip, out, in);
|
|
return;
|
|
}
|
|
|
|
- op->src = (void *) in;
|
|
- op->dst = (void *) out;
|
|
- op->mode = AES_MODE_ECB;
|
|
- op->flags = 0;
|
|
- op->len = AES_BLOCK_SIZE;
|
|
- op->dir = AES_DIR_DECRYPT;
|
|
-
|
|
- geode_aes_crypt(op);
|
|
+ geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL,
|
|
+ AES_MODE_ECB, AES_DIR_DECRYPT);
|
|
}
|
|
|
|
static int fallback_init_cip(struct crypto_tfm *tfm)
|
|
{
|
|
const char *name = crypto_tfm_alg_name(tfm);
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm);
|
|
|
|
- op->fallback.cip = crypto_alloc_cipher(name, 0,
|
|
- CRYPTO_ALG_NEED_FALLBACK);
|
|
+ tctx->fallback.cip = crypto_alloc_cipher(name, 0,
|
|
+ CRYPTO_ALG_NEED_FALLBACK);
|
|
|
|
- if (IS_ERR(op->fallback.cip)) {
|
|
+ if (IS_ERR(tctx->fallback.cip)) {
|
|
printk(KERN_ERR "Error allocating fallback algo %s\n", name);
|
|
- return PTR_ERR(op->fallback.cip);
|
|
+ return PTR_ERR(tctx->fallback.cip);
|
|
}
|
|
|
|
return 0;
|
|
@@ -267,10 +222,9 @@ static int fallback_init_cip(struct crypto_tfm *tfm)
|
|
|
|
static void fallback_exit_cip(struct crypto_tfm *tfm)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm);
|
|
|
|
- crypto_free_cipher(op->fallback.cip);
|
|
- op->fallback.cip = NULL;
|
|
+ crypto_free_cipher(tctx->fallback.cip);
|
|
}
|
|
|
|
static struct crypto_alg geode_alg = {
|
|
@@ -283,7 +237,7 @@ static struct crypto_alg geode_alg = {
|
|
.cra_init = fallback_init_cip,
|
|
.cra_exit = fallback_exit_cip,
|
|
.cra_blocksize = AES_BLOCK_SIZE,
|
|
- .cra_ctxsize = sizeof(struct geode_aes_op),
|
|
+ .cra_ctxsize = sizeof(struct geode_aes_tfm_ctx),
|
|
.cra_module = THIS_MODULE,
|
|
.cra_u = {
|
|
.cipher = {
|
|
@@ -296,220 +250,126 @@ static struct crypto_alg geode_alg = {
|
|
}
|
|
};
|
|
|
|
-static int
|
|
-geode_cbc_decrypt(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
+static int geode_init_skcipher(struct crypto_skcipher *tfm)
|
|
{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- struct blkcipher_walk walk;
|
|
- int err, ret;
|
|
-
|
|
- if (nbytes % AES_BLOCK_SIZE)
|
|
- return -EINVAL;
|
|
-
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128))
|
|
- return fallback_blk_dec(desc, dst, src, nbytes);
|
|
+ const char *name = crypto_tfm_alg_name(&tfm->base);
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
|
|
|
|
- blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
- err = blkcipher_walk_virt(desc, &walk);
|
|
- op->iv = walk.iv;
|
|
-
|
|
- while ((nbytes = walk.nbytes)) {
|
|
- op->src = walk.src.virt.addr,
|
|
- op->dst = walk.dst.virt.addr;
|
|
- op->mode = AES_MODE_CBC;
|
|
- op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
|
|
- op->dir = AES_DIR_DECRYPT;
|
|
-
|
|
- ret = geode_aes_crypt(op);
|
|
-
|
|
- nbytes -= ret;
|
|
- err = blkcipher_walk_done(desc, &walk, nbytes);
|
|
+ tctx->fallback.skcipher =
|
|
+ crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK |
|
|
+ CRYPTO_ALG_ASYNC);
|
|
+ if (IS_ERR(tctx->fallback.skcipher)) {
|
|
+ printk(KERN_ERR "Error allocating fallback algo %s\n", name);
|
|
+ return PTR_ERR(tctx->fallback.skcipher);
|
|
}
|
|
|
|
- return err;
|
|
+ crypto_skcipher_set_reqsize(tfm, sizeof(struct skcipher_request) +
|
|
+ crypto_skcipher_reqsize(tctx->fallback.skcipher));
|
|
+ return 0;
|
|
}
|
|
|
|
-static int
|
|
-geode_cbc_encrypt(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
+static void geode_exit_skcipher(struct crypto_skcipher *tfm)
|
|
{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- struct blkcipher_walk walk;
|
|
- int err, ret;
|
|
+ struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
|
|
|
|
- if (nbytes % AES_BLOCK_SIZE)
|
|
- return -EINVAL;
|
|
-
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128))
|
|
- return fallback_blk_enc(desc, dst, src, nbytes);
|
|
+ crypto_free_skcipher(tctx->fallback.skcipher);
|
|
+}
|
|
|
|
- blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
- err = blkcipher_walk_virt(desc, &walk);
|
|
- op->iv = walk.iv;
|
|
+static int geode_skcipher_crypt(struct skcipher_request *req, int mode, int dir)
|
|
+{
|
|
+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
|
|
+ const struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm);
|
|
+ struct skcipher_walk walk;
|
|
+ unsigned int nbytes;
|
|
+ int err;
|
|
+
|
|
+ if (unlikely(tctx->keylen != AES_KEYSIZE_128)) {
|
|
+ struct skcipher_request *subreq = skcipher_request_ctx(req);
|
|
+
|
|
+ *subreq = *req;
|
|
+ skcipher_request_set_tfm(subreq, tctx->fallback.skcipher);
|
|
+ if (dir == AES_DIR_DECRYPT)
|
|
+ return crypto_skcipher_decrypt(subreq);
|
|
+ else
|
|
+ return crypto_skcipher_encrypt(subreq);
|
|
+ }
|
|
|
|
- while ((nbytes = walk.nbytes)) {
|
|
- op->src = walk.src.virt.addr,
|
|
- op->dst = walk.dst.virt.addr;
|
|
- op->mode = AES_MODE_CBC;
|
|
- op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
|
|
- op->dir = AES_DIR_ENCRYPT;
|
|
+ err = skcipher_walk_virt(&walk, req, false);
|
|
|
|
- ret = geode_aes_crypt(op);
|
|
- nbytes -= ret;
|
|
- err = blkcipher_walk_done(desc, &walk, nbytes);
|
|
+ while ((nbytes = walk.nbytes) != 0) {
|
|
+ geode_aes_crypt(tctx, walk.src.virt.addr, walk.dst.virt.addr,
|
|
+ round_down(nbytes, AES_BLOCK_SIZE),
|
|
+ walk.iv, mode, dir);
|
|
+ err = skcipher_walk_done(&walk, nbytes % AES_BLOCK_SIZE);
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
-static int fallback_init_blk(struct crypto_tfm *tfm)
|
|
+static int geode_cbc_encrypt(struct skcipher_request *req)
|
|
{
|
|
- const char *name = crypto_tfm_alg_name(tfm);
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
-
|
|
- op->fallback.blk = crypto_alloc_sync_skcipher(name, 0,
|
|
- CRYPTO_ALG_NEED_FALLBACK);
|
|
- if (IS_ERR(op->fallback.blk)) {
|
|
- printk(KERN_ERR "Error allocating fallback algo %s\n", name);
|
|
- return PTR_ERR(op->fallback.blk);
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_ENCRYPT);
|
|
}
|
|
|
|
-static void fallback_exit_blk(struct crypto_tfm *tfm)
|
|
+static int geode_cbc_decrypt(struct skcipher_request *req)
|
|
{
|
|
- struct geode_aes_op *op = crypto_tfm_ctx(tfm);
|
|
-
|
|
- crypto_free_sync_skcipher(op->fallback.blk);
|
|
- op->fallback.blk = NULL;
|
|
+ return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_DECRYPT);
|
|
}
|
|
|
|
-static struct crypto_alg geode_cbc_alg = {
|
|
- .cra_name = "cbc(aes)",
|
|
- .cra_driver_name = "cbc-aes-geode",
|
|
- .cra_priority = 400,
|
|
- .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER |
|
|
- CRYPTO_ALG_KERN_DRIVER_ONLY |
|
|
- CRYPTO_ALG_NEED_FALLBACK,
|
|
- .cra_init = fallback_init_blk,
|
|
- .cra_exit = fallback_exit_blk,
|
|
- .cra_blocksize = AES_BLOCK_SIZE,
|
|
- .cra_ctxsize = sizeof(struct geode_aes_op),
|
|
- .cra_alignmask = 15,
|
|
- .cra_type = &crypto_blkcipher_type,
|
|
- .cra_module = THIS_MODULE,
|
|
- .cra_u = {
|
|
- .blkcipher = {
|
|
- .min_keysize = AES_MIN_KEY_SIZE,
|
|
- .max_keysize = AES_MAX_KEY_SIZE,
|
|
- .setkey = geode_setkey_blk,
|
|
- .encrypt = geode_cbc_encrypt,
|
|
- .decrypt = geode_cbc_decrypt,
|
|
- .ivsize = AES_BLOCK_SIZE,
|
|
- }
|
|
- }
|
|
-};
|
|
-
|
|
-static int
|
|
-geode_ecb_decrypt(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
+static int geode_ecb_encrypt(struct skcipher_request *req)
|
|
{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- struct blkcipher_walk walk;
|
|
- int err, ret;
|
|
-
|
|
- if (nbytes % AES_BLOCK_SIZE)
|
|
- return -EINVAL;
|
|
-
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128))
|
|
- return fallback_blk_dec(desc, dst, src, nbytes);
|
|
-
|
|
- blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
- err = blkcipher_walk_virt(desc, &walk);
|
|
-
|
|
- while ((nbytes = walk.nbytes)) {
|
|
- op->src = walk.src.virt.addr,
|
|
- op->dst = walk.dst.virt.addr;
|
|
- op->mode = AES_MODE_ECB;
|
|
- op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
|
|
- op->dir = AES_DIR_DECRYPT;
|
|
-
|
|
- ret = geode_aes_crypt(op);
|
|
- nbytes -= ret;
|
|
- err = blkcipher_walk_done(desc, &walk, nbytes);
|
|
- }
|
|
-
|
|
- return err;
|
|
+ return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_ENCRYPT);
|
|
}
|
|
|
|
-static int
|
|
-geode_ecb_encrypt(struct blkcipher_desc *desc,
|
|
- struct scatterlist *dst, struct scatterlist *src,
|
|
- unsigned int nbytes)
|
|
+static int geode_ecb_decrypt(struct skcipher_request *req)
|
|
{
|
|
- struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm);
|
|
- struct blkcipher_walk walk;
|
|
- int err, ret;
|
|
-
|
|
- if (nbytes % AES_BLOCK_SIZE)
|
|
- return -EINVAL;
|
|
-
|
|
- if (unlikely(op->keylen != AES_KEYSIZE_128))
|
|
- return fallback_blk_enc(desc, dst, src, nbytes);
|
|
-
|
|
- blkcipher_walk_init(&walk, dst, src, nbytes);
|
|
- err = blkcipher_walk_virt(desc, &walk);
|
|
-
|
|
- while ((nbytes = walk.nbytes)) {
|
|
- op->src = walk.src.virt.addr,
|
|
- op->dst = walk.dst.virt.addr;
|
|
- op->mode = AES_MODE_ECB;
|
|
- op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
|
|
- op->dir = AES_DIR_ENCRYPT;
|
|
-
|
|
- ret = geode_aes_crypt(op);
|
|
- nbytes -= ret;
|
|
- ret = blkcipher_walk_done(desc, &walk, nbytes);
|
|
- }
|
|
-
|
|
- return err;
|
|
+ return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_DECRYPT);
|
|
}
|
|
|
|
-static struct crypto_alg geode_ecb_alg = {
|
|
- .cra_name = "ecb(aes)",
|
|
- .cra_driver_name = "ecb-aes-geode",
|
|
- .cra_priority = 400,
|
|
- .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER |
|
|
- CRYPTO_ALG_KERN_DRIVER_ONLY |
|
|
- CRYPTO_ALG_NEED_FALLBACK,
|
|
- .cra_init = fallback_init_blk,
|
|
- .cra_exit = fallback_exit_blk,
|
|
- .cra_blocksize = AES_BLOCK_SIZE,
|
|
- .cra_ctxsize = sizeof(struct geode_aes_op),
|
|
- .cra_alignmask = 15,
|
|
- .cra_type = &crypto_blkcipher_type,
|
|
- .cra_module = THIS_MODULE,
|
|
- .cra_u = {
|
|
- .blkcipher = {
|
|
- .min_keysize = AES_MIN_KEY_SIZE,
|
|
- .max_keysize = AES_MAX_KEY_SIZE,
|
|
- .setkey = geode_setkey_blk,
|
|
- .encrypt = geode_ecb_encrypt,
|
|
- .decrypt = geode_ecb_decrypt,
|
|
- }
|
|
- }
|
|
+static struct skcipher_alg geode_skcipher_algs[] = {
|
|
+ {
|
|
+ .base.cra_name = "cbc(aes)",
|
|
+ .base.cra_driver_name = "cbc-aes-geode",
|
|
+ .base.cra_priority = 400,
|
|
+ .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |
|
|
+ CRYPTO_ALG_NEED_FALLBACK,
|
|
+ .base.cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx),
|
|
+ .base.cra_alignmask = 15,
|
|
+ .base.cra_module = THIS_MODULE,
|
|
+ .init = geode_init_skcipher,
|
|
+ .exit = geode_exit_skcipher,
|
|
+ .setkey = geode_setkey_skcipher,
|
|
+ .encrypt = geode_cbc_encrypt,
|
|
+ .decrypt = geode_cbc_decrypt,
|
|
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
+ .ivsize = AES_BLOCK_SIZE,
|
|
+ }, {
|
|
+ .base.cra_name = "ecb(aes)",
|
|
+ .base.cra_driver_name = "ecb-aes-geode",
|
|
+ .base.cra_priority = 400,
|
|
+ .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY |
|
|
+ CRYPTO_ALG_NEED_FALLBACK,
|
|
+ .base.cra_blocksize = AES_BLOCK_SIZE,
|
|
+ .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx),
|
|
+ .base.cra_alignmask = 15,
|
|
+ .base.cra_module = THIS_MODULE,
|
|
+ .init = geode_init_skcipher,
|
|
+ .exit = geode_exit_skcipher,
|
|
+ .setkey = geode_setkey_skcipher,
|
|
+ .encrypt = geode_ecb_encrypt,
|
|
+ .decrypt = geode_ecb_decrypt,
|
|
+ .min_keysize = AES_MIN_KEY_SIZE,
|
|
+ .max_keysize = AES_MAX_KEY_SIZE,
|
|
+ },
|
|
};
|
|
|
|
static void geode_aes_remove(struct pci_dev *dev)
|
|
{
|
|
crypto_unregister_alg(&geode_alg);
|
|
- crypto_unregister_alg(&geode_ecb_alg);
|
|
- crypto_unregister_alg(&geode_cbc_alg);
|
|
+ crypto_unregister_skciphers(geode_skcipher_algs,
|
|
+ ARRAY_SIZE(geode_skcipher_algs));
|
|
|
|
pci_iounmap(dev, _iobase);
|
|
_iobase = NULL;
|
|
@@ -547,20 +407,14 @@ static int geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|
if (ret)
|
|
goto eiomap;
|
|
|
|
- ret = crypto_register_alg(&geode_ecb_alg);
|
|
+ ret = crypto_register_skciphers(geode_skcipher_algs,
|
|
+ ARRAY_SIZE(geode_skcipher_algs));
|
|
if (ret)
|
|
goto ealg;
|
|
|
|
- ret = crypto_register_alg(&geode_cbc_alg);
|
|
- if (ret)
|
|
- goto eecb;
|
|
-
|
|
dev_notice(&dev->dev, "GEODE AES engine enabled.\n");
|
|
return 0;
|
|
|
|
- eecb:
|
|
- crypto_unregister_alg(&geode_ecb_alg);
|
|
-
|
|
ealg:
|
|
crypto_unregister_alg(&geode_alg);
|
|
|
|
diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h
|
|
index f8a86898ac22..6d0a0cdc7647 100644
|
|
--- a/drivers/crypto/geode-aes.h
|
|
+++ b/drivers/crypto/geode-aes.h
|
|
@@ -46,21 +46,10 @@
|
|
|
|
#define AES_OP_TIMEOUT 0x50000
|
|
|
|
-struct geode_aes_op {
|
|
-
|
|
- void *src;
|
|
- void *dst;
|
|
-
|
|
- u32 mode;
|
|
- u32 dir;
|
|
- u32 flags;
|
|
- int len;
|
|
-
|
|
+struct geode_aes_tfm_ctx {
|
|
u8 key[AES_KEYSIZE_128];
|
|
- u8 *iv;
|
|
-
|
|
union {
|
|
- struct crypto_sync_skcipher *blk;
|
|
+ struct crypto_skcipher *skcipher;
|
|
struct crypto_cipher *cip;
|
|
} fallback;
|
|
u32 keylen;
|
|
diff --git a/drivers/crypto/hisilicon/Kconfig b/drivers/crypto/hisilicon/Kconfig
|
|
index ebaf91e0146d..504daff7687d 100644
|
|
--- a/drivers/crypto/hisilicon/Kconfig
|
|
+++ b/drivers/crypto/hisilicon/Kconfig
|
|
@@ -17,6 +17,7 @@ config CRYPTO_DEV_HISI_SEC
|
|
config CRYPTO_DEV_HISI_QM
|
|
tristate
|
|
depends on ARM64 && PCI && PCI_MSI
|
|
+ select NEED_SG_DMA_LENGTH
|
|
help
|
|
HiSilicon accelerator engines use a common queue management
|
|
interface. Specific engine driver may use this module.
|
|
diff --git a/drivers/crypto/virtio/virtio_crypto_algs.c b/drivers/crypto/virtio/virtio_crypto_algs.c
|
|
index 673fb29fda53..82b316b2f537 100644
|
|
--- a/drivers/crypto/virtio/virtio_crypto_algs.c
|
|
+++ b/drivers/crypto/virtio/virtio_crypto_algs.c
|
|
@@ -435,6 +435,11 @@ __virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req,
|
|
goto free;
|
|
}
|
|
memcpy(iv, req->info, ivsize);
|
|
+ if (!vc_sym_req->encrypt)
|
|
+ scatterwalk_map_and_copy(req->info, req->src,
|
|
+ req->nbytes - AES_BLOCK_SIZE,
|
|
+ AES_BLOCK_SIZE, 0);
|
|
+
|
|
sg_init_one(&iv_sg, iv, ivsize);
|
|
sgs[num_out++] = &iv_sg;
|
|
vc_sym_req->iv = iv;
|
|
@@ -571,6 +576,10 @@ static void virtio_crypto_ablkcipher_finalize_req(
|
|
struct ablkcipher_request *req,
|
|
int err)
|
|
{
|
|
+ if (vc_sym_req->encrypt)
|
|
+ scatterwalk_map_and_copy(req->info, req->dst,
|
|
+ req->nbytes - AES_BLOCK_SIZE,
|
|
+ AES_BLOCK_SIZE, 0);
|
|
crypto_finalize_ablkcipher_request(vc_sym_req->base.dataq->engine,
|
|
req, err);
|
|
kzfree(vc_sym_req->iv);
|
|
diff --git a/drivers/devfreq/Kconfig b/drivers/devfreq/Kconfig
|
|
index defe1d438710..af4a3ccb96b3 100644
|
|
--- a/drivers/devfreq/Kconfig
|
|
+++ b/drivers/devfreq/Kconfig
|
|
@@ -99,6 +99,7 @@ config ARM_TEGRA_DEVFREQ
|
|
ARCH_TEGRA_210_SOC || \
|
|
COMPILE_TEST
|
|
select PM_OPP
|
|
+ depends on COMMON_CLK
|
|
help
|
|
This adds the DEVFREQ driver for the Tegra family of SoCs.
|
|
It reads ACTMON counters of memory controllers and adjusts the
|
|
diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c
|
|
index c90c798e5ec3..0585d749d935 100644
|
|
--- a/drivers/dma/dw/platform.c
|
|
+++ b/drivers/dma/dw/platform.c
|
|
@@ -66,7 +66,7 @@ static int dw_probe(struct platform_device *pdev)
|
|
|
|
data->chip = chip;
|
|
|
|
- chip->clk = devm_clk_get(chip->dev, "hclk");
|
|
+ chip->clk = devm_clk_get_optional(chip->dev, "hclk");
|
|
if (IS_ERR(chip->clk))
|
|
return PTR_ERR(chip->clk);
|
|
err = clk_prepare_enable(chip->clk);
|
|
diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c
|
|
index 1a422a8b43cf..18c011e57592 100644
|
|
--- a/drivers/dma/ioat/dma.c
|
|
+++ b/drivers/dma/ioat/dma.c
|
|
@@ -377,10 +377,11 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
|
|
|
|
descs->virt = dma_alloc_coherent(to_dev(ioat_chan),
|
|
SZ_2M, &descs->hw, flags);
|
|
- if (!descs->virt && (i > 0)) {
|
|
+ if (!descs->virt) {
|
|
int idx;
|
|
|
|
for (idx = 0; idx < i; idx++) {
|
|
+ descs = &ioat_chan->descs[idx];
|
|
dma_free_coherent(to_dev(ioat_chan), SZ_2M,
|
|
descs->virt, descs->hw);
|
|
descs->virt = NULL;
|
|
diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c
|
|
index 4b36c8810517..d05471653224 100644
|
|
--- a/drivers/dma/k3dma.c
|
|
+++ b/drivers/dma/k3dma.c
|
|
@@ -229,9 +229,11 @@ static irqreturn_t k3_dma_int_handler(int irq, void *dev_id)
|
|
c = p->vchan;
|
|
if (c && (tc1 & BIT(i))) {
|
|
spin_lock_irqsave(&c->vc.lock, flags);
|
|
- vchan_cookie_complete(&p->ds_run->vd);
|
|
- p->ds_done = p->ds_run;
|
|
- p->ds_run = NULL;
|
|
+ if (p->ds_run != NULL) {
|
|
+ vchan_cookie_complete(&p->ds_run->vd);
|
|
+ p->ds_done = p->ds_run;
|
|
+ p->ds_run = NULL;
|
|
+ }
|
|
spin_unlock_irqrestore(&c->vc.lock, flags);
|
|
}
|
|
if (c && (tc2 & BIT(i))) {
|
|
@@ -271,6 +273,10 @@ static int k3_dma_start_txd(struct k3_dma_chan *c)
|
|
if (BIT(c->phy->idx) & k3_dma_get_chan_stat(d))
|
|
return -EAGAIN;
|
|
|
|
+ /* Avoid losing track of ds_run if a transaction is in flight */
|
|
+ if (c->phy->ds_run)
|
|
+ return -EAGAIN;
|
|
+
|
|
if (vd) {
|
|
struct k3_dma_desc_sw *ds =
|
|
container_of(vd, struct k3_dma_desc_sw, vd);
|
|
diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c
|
|
index a031cbcdf6ef..d72a3a5507b0 100644
|
|
--- a/drivers/gpio/gpio-mpc8xxx.c
|
|
+++ b/drivers/gpio/gpio-mpc8xxx.c
|
|
@@ -346,6 +346,7 @@ static int mpc8xxx_probe(struct platform_device *pdev)
|
|
return -ENOMEM;
|
|
|
|
gc = &mpc8xxx_gc->gc;
|
|
+ gc->parent = &pdev->dev;
|
|
|
|
if (of_property_read_bool(np, "little-endian")) {
|
|
ret = bgpio_init(gc, &pdev->dev, 4,
|
|
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c
|
|
index cd475ff4bcad..7835aad6d162 100644
|
|
--- a/drivers/gpio/gpio-zynq.c
|
|
+++ b/drivers/gpio/gpio-zynq.c
|
|
@@ -681,6 +681,8 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio)
|
|
unsigned int bank_num;
|
|
|
|
for (bank_num = 0; bank_num < gpio->p_data->max_bank; bank_num++) {
|
|
+ writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr +
|
|
+ ZYNQ_GPIO_INTDIS_OFFSET(bank_num));
|
|
writel_relaxed(gpio->context.datalsw[bank_num],
|
|
gpio->base_addr +
|
|
ZYNQ_GPIO_DATA_LSW_OFFSET(bank_num));
|
|
@@ -690,9 +692,6 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio)
|
|
writel_relaxed(gpio->context.dirm[bank_num],
|
|
gpio->base_addr +
|
|
ZYNQ_GPIO_DIRM_OFFSET(bank_num));
|
|
- writel_relaxed(gpio->context.int_en[bank_num],
|
|
- gpio->base_addr +
|
|
- ZYNQ_GPIO_INTEN_OFFSET(bank_num));
|
|
writel_relaxed(gpio->context.int_type[bank_num],
|
|
gpio->base_addr +
|
|
ZYNQ_GPIO_INTTYPE_OFFSET(bank_num));
|
|
@@ -702,6 +701,9 @@ static void zynq_gpio_restore_context(struct zynq_gpio *gpio)
|
|
writel_relaxed(gpio->context.int_any[bank_num],
|
|
gpio->base_addr +
|
|
ZYNQ_GPIO_INTANY_OFFSET(bank_num));
|
|
+ writel_relaxed(~(gpio->context.int_en[bank_num]),
|
|
+ gpio->base_addr +
|
|
+ ZYNQ_GPIO_INTEN_OFFSET(bank_num));
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
|
|
index 99d19f80440e..3d9524a2abc4 100644
|
|
--- a/drivers/gpio/gpiolib.c
|
|
+++ b/drivers/gpio/gpiolib.c
|
|
@@ -4328,8 +4328,9 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
|
|
|
|
if (chip->ngpio <= p->chip_hwnum) {
|
|
dev_err(dev,
|
|
- "requested GPIO %d is out of range [0..%d] for chip %s\n",
|
|
- idx, chip->ngpio, chip->label);
|
|
+ "requested GPIO %u (%u) is out of range [0..%u] for chip %s\n",
|
|
+ idx, p->chip_hwnum, chip->ngpio - 1,
|
|
+ chip->label);
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
|
|
index bd37df5dd6d0..d1e278e999ee 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
|
|
@@ -813,6 +813,7 @@ struct amdgpu_device {
|
|
uint8_t *bios;
|
|
uint32_t bios_size;
|
|
struct amdgpu_bo *stolen_vga_memory;
|
|
+ struct amdgpu_bo *discovery_memory;
|
|
uint32_t bios_scratch_reg_offset;
|
|
uint32_t bios_scratch[AMDGPU_BIOS_NUM_SCRATCH];
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
|
|
index 1481899f86c1..71198c5318e1 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
|
|
@@ -136,7 +136,7 @@ static int amdgpu_discovery_read_binary(struct amdgpu_device *adev, uint8_t *bin
|
|
{
|
|
uint32_t *p = (uint32_t *)binary;
|
|
uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20;
|
|
- uint64_t pos = vram_size - BINARY_MAX_SIZE;
|
|
+ uint64_t pos = vram_size - DISCOVERY_TMR_SIZE;
|
|
unsigned long flags;
|
|
|
|
while (pos < vram_size) {
|
|
@@ -179,7 +179,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)
|
|
uint16_t checksum;
|
|
int r;
|
|
|
|
- adev->discovery = kzalloc(BINARY_MAX_SIZE, GFP_KERNEL);
|
|
+ adev->discovery = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL);
|
|
if (!adev->discovery)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
|
|
index 85b8c4d4d576..5a6693d7d269 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
|
|
@@ -24,6 +24,8 @@
|
|
#ifndef __AMDGPU_DISCOVERY__
|
|
#define __AMDGPU_DISCOVERY__
|
|
|
|
+#define DISCOVERY_TMR_SIZE (64 << 10)
|
|
+
|
|
int amdgpu_discovery_init(struct amdgpu_device *adev);
|
|
void amdgpu_discovery_fini(struct amdgpu_device *adev);
|
|
int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
index 7289e1b4fb60..28361a9c5add 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
|
|
@@ -342,6 +342,67 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
|
|
return 0;
|
|
}
|
|
|
|
+/**
|
|
+ * amdgpu_bo_create_kernel_at - create BO for kernel use at specific location
|
|
+ *
|
|
+ * @adev: amdgpu device object
|
|
+ * @offset: offset of the BO
|
|
+ * @size: size of the BO
|
|
+ * @domain: where to place it
|
|
+ * @bo_ptr: used to initialize BOs in structures
|
|
+ * @cpu_addr: optional CPU address mapping
|
|
+ *
|
|
+ * Creates a kernel BO at a specific offset in the address space of the domain.
|
|
+ *
|
|
+ * Returns:
|
|
+ * 0 on success, negative error code otherwise.
|
|
+ */
|
|
+int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
|
|
+ uint64_t offset, uint64_t size, uint32_t domain,
|
|
+ struct amdgpu_bo **bo_ptr, void **cpu_addr)
|
|
+{
|
|
+ struct ttm_operation_ctx ctx = { false, false };
|
|
+ unsigned int i;
|
|
+ int r;
|
|
+
|
|
+ offset &= PAGE_MASK;
|
|
+ size = ALIGN(size, PAGE_SIZE);
|
|
+
|
|
+ r = amdgpu_bo_create_reserved(adev, size, PAGE_SIZE, domain, bo_ptr,
|
|
+ NULL, NULL);
|
|
+ if (r)
|
|
+ return r;
|
|
+
|
|
+ /*
|
|
+ * Remove the original mem node and create a new one at the request
|
|
+ * position.
|
|
+ */
|
|
+ for (i = 0; i < (*bo_ptr)->placement.num_placement; ++i) {
|
|
+ (*bo_ptr)->placements[i].fpfn = offset >> PAGE_SHIFT;
|
|
+ (*bo_ptr)->placements[i].lpfn = (offset + size) >> PAGE_SHIFT;
|
|
+ }
|
|
+
|
|
+ ttm_bo_mem_put(&(*bo_ptr)->tbo, &(*bo_ptr)->tbo.mem);
|
|
+ r = ttm_bo_mem_space(&(*bo_ptr)->tbo, &(*bo_ptr)->placement,
|
|
+ &(*bo_ptr)->tbo.mem, &ctx);
|
|
+ if (r)
|
|
+ goto error;
|
|
+
|
|
+ if (cpu_addr) {
|
|
+ r = amdgpu_bo_kmap(*bo_ptr, cpu_addr);
|
|
+ if (r)
|
|
+ goto error;
|
|
+ }
|
|
+
|
|
+ amdgpu_bo_unreserve(*bo_ptr);
|
|
+ return 0;
|
|
+
|
|
+error:
|
|
+ amdgpu_bo_unreserve(*bo_ptr);
|
|
+ amdgpu_bo_unref(bo_ptr);
|
|
+ return r;
|
|
+}
|
|
+
|
|
/**
|
|
* amdgpu_bo_free_kernel - free BO for kernel use
|
|
*
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
index 658f4c9779b7..4fcea23ee516 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
|
|
@@ -237,6 +237,9 @@ int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
|
|
unsigned long size, int align,
|
|
u32 domain, struct amdgpu_bo **bo_ptr,
|
|
u64 *gpu_addr, void **cpu_addr);
|
|
+int amdgpu_bo_create_kernel_at(struct amdgpu_device *adev,
|
|
+ uint64_t offset, uint64_t size, uint32_t domain,
|
|
+ struct amdgpu_bo **bo_ptr, void **cpu_addr);
|
|
void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
|
|
void **cpu_addr);
|
|
int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
|
|
index 016ea274b955..9c5cbc47edf1 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
|
|
@@ -65,12 +65,6 @@ const char *ras_block_string[] = {
|
|
/* inject address is 52 bits */
|
|
#define RAS_UMC_INJECT_ADDR_LIMIT (0x1ULL << 52)
|
|
|
|
-static int amdgpu_ras_reserve_vram(struct amdgpu_device *adev,
|
|
- uint64_t offset, uint64_t size,
|
|
- struct amdgpu_bo **bo_ptr);
|
|
-static int amdgpu_ras_release_vram(struct amdgpu_device *adev,
|
|
- struct amdgpu_bo **bo_ptr);
|
|
-
|
|
static ssize_t amdgpu_ras_debugfs_read(struct file *f, char __user *buf,
|
|
size_t size, loff_t *pos)
|
|
{
|
|
@@ -1214,75 +1208,6 @@ static void amdgpu_ras_do_recovery(struct work_struct *work)
|
|
atomic_set(&ras->in_recovery, 0);
|
|
}
|
|
|
|
-static int amdgpu_ras_release_vram(struct amdgpu_device *adev,
|
|
- struct amdgpu_bo **bo_ptr)
|
|
-{
|
|
- /* no need to free it actually. */
|
|
- amdgpu_bo_free_kernel(bo_ptr, NULL, NULL);
|
|
- return 0;
|
|
-}
|
|
-
|
|
-/* reserve vram with size@offset */
|
|
-static int amdgpu_ras_reserve_vram(struct amdgpu_device *adev,
|
|
- uint64_t offset, uint64_t size,
|
|
- struct amdgpu_bo **bo_ptr)
|
|
-{
|
|
- struct ttm_operation_ctx ctx = { false, false };
|
|
- struct amdgpu_bo_param bp;
|
|
- int r = 0;
|
|
- int i;
|
|
- struct amdgpu_bo *bo;
|
|
-
|
|
- if (bo_ptr)
|
|
- *bo_ptr = NULL;
|
|
- memset(&bp, 0, sizeof(bp));
|
|
- bp.size = size;
|
|
- bp.byte_align = PAGE_SIZE;
|
|
- bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
|
|
- bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |
|
|
- AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
|
|
- bp.type = ttm_bo_type_kernel;
|
|
- bp.resv = NULL;
|
|
-
|
|
- r = amdgpu_bo_create(adev, &bp, &bo);
|
|
- if (r)
|
|
- return -EINVAL;
|
|
-
|
|
- r = amdgpu_bo_reserve(bo, false);
|
|
- if (r)
|
|
- goto error_reserve;
|
|
-
|
|
- offset = ALIGN(offset, PAGE_SIZE);
|
|
- for (i = 0; i < bo->placement.num_placement; ++i) {
|
|
- bo->placements[i].fpfn = offset >> PAGE_SHIFT;
|
|
- bo->placements[i].lpfn = (offset + size) >> PAGE_SHIFT;
|
|
- }
|
|
-
|
|
- ttm_bo_mem_put(&bo->tbo, &bo->tbo.mem);
|
|
- r = ttm_bo_mem_space(&bo->tbo, &bo->placement, &bo->tbo.mem, &ctx);
|
|
- if (r)
|
|
- goto error_pin;
|
|
-
|
|
- r = amdgpu_bo_pin_restricted(bo,
|
|
- AMDGPU_GEM_DOMAIN_VRAM,
|
|
- offset,
|
|
- offset + size);
|
|
- if (r)
|
|
- goto error_pin;
|
|
-
|
|
- if (bo_ptr)
|
|
- *bo_ptr = bo;
|
|
-
|
|
- amdgpu_bo_unreserve(bo);
|
|
- return r;
|
|
-
|
|
-error_pin:
|
|
- amdgpu_bo_unreserve(bo);
|
|
-error_reserve:
|
|
- amdgpu_bo_unref(&bo);
|
|
- return r;
|
|
-}
|
|
-
|
|
/* alloc/realloc bps array */
|
|
static int amdgpu_ras_realloc_eh_data_space(struct amdgpu_device *adev,
|
|
struct ras_err_handler_data *data, int pages)
|
|
@@ -1345,7 +1270,7 @@ int amdgpu_ras_reserve_bad_pages(struct amdgpu_device *adev)
|
|
struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
|
|
struct ras_err_handler_data *data;
|
|
uint64_t bp;
|
|
- struct amdgpu_bo *bo;
|
|
+ struct amdgpu_bo *bo = NULL;
|
|
int i;
|
|
|
|
if (!con || !con->eh_data)
|
|
@@ -1359,12 +1284,14 @@ int amdgpu_ras_reserve_bad_pages(struct amdgpu_device *adev)
|
|
for (i = data->last_reserved; i < data->count; i++) {
|
|
bp = data->bps[i].bp;
|
|
|
|
- if (amdgpu_ras_reserve_vram(adev, bp << PAGE_SHIFT,
|
|
- PAGE_SIZE, &bo))
|
|
+ if (amdgpu_bo_create_kernel_at(adev, bp << PAGE_SHIFT, PAGE_SIZE,
|
|
+ AMDGPU_GEM_DOMAIN_VRAM,
|
|
+ &bo, NULL))
|
|
DRM_ERROR("RAS ERROR: reserve vram %llx fail\n", bp);
|
|
|
|
data->bps[i].bo = bo;
|
|
data->last_reserved = i + 1;
|
|
+ bo = NULL;
|
|
}
|
|
out:
|
|
mutex_unlock(&con->recovery_lock);
|
|
@@ -1390,7 +1317,7 @@ static int amdgpu_ras_release_bad_pages(struct amdgpu_device *adev)
|
|
for (i = data->last_reserved - 1; i >= 0; i--) {
|
|
bo = data->bps[i].bo;
|
|
|
|
- amdgpu_ras_release_vram(adev, &bo);
|
|
+ amdgpu_bo_free_kernel(&bo, NULL, NULL);
|
|
|
|
data->bps[i].bo = bo;
|
|
data->last_reserved = i;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
index c0e41f1f0c23..f15ded1ce905 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
|
|
@@ -1639,81 +1639,25 @@ static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
|
|
*/
|
|
static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
|
|
{
|
|
- struct ttm_operation_ctx ctx = { false, false };
|
|
- struct amdgpu_bo_param bp;
|
|
- int r = 0;
|
|
- int i;
|
|
- u64 vram_size = adev->gmc.visible_vram_size;
|
|
- u64 offset = adev->fw_vram_usage.start_offset;
|
|
- u64 size = adev->fw_vram_usage.size;
|
|
- struct amdgpu_bo *bo;
|
|
-
|
|
- memset(&bp, 0, sizeof(bp));
|
|
- bp.size = adev->fw_vram_usage.size;
|
|
- bp.byte_align = PAGE_SIZE;
|
|
- bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
|
|
- bp.flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
|
|
- AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS;
|
|
- bp.type = ttm_bo_type_kernel;
|
|
- bp.resv = NULL;
|
|
+ uint64_t vram_size = adev->gmc.visible_vram_size;
|
|
+ int r;
|
|
+
|
|
adev->fw_vram_usage.va = NULL;
|
|
adev->fw_vram_usage.reserved_bo = NULL;
|
|
|
|
- if (adev->fw_vram_usage.size > 0 &&
|
|
- adev->fw_vram_usage.size <= vram_size) {
|
|
-
|
|
- r = amdgpu_bo_create(adev, &bp,
|
|
- &adev->fw_vram_usage.reserved_bo);
|
|
- if (r)
|
|
- goto error_create;
|
|
-
|
|
- r = amdgpu_bo_reserve(adev->fw_vram_usage.reserved_bo, false);
|
|
- if (r)
|
|
- goto error_reserve;
|
|
-
|
|
- /* remove the original mem node and create a new one at the
|
|
- * request position
|
|
- */
|
|
- bo = adev->fw_vram_usage.reserved_bo;
|
|
- offset = ALIGN(offset, PAGE_SIZE);
|
|
- for (i = 0; i < bo->placement.num_placement; ++i) {
|
|
- bo->placements[i].fpfn = offset >> PAGE_SHIFT;
|
|
- bo->placements[i].lpfn = (offset + size) >> PAGE_SHIFT;
|
|
- }
|
|
-
|
|
- ttm_bo_mem_put(&bo->tbo, &bo->tbo.mem);
|
|
- r = ttm_bo_mem_space(&bo->tbo, &bo->placement,
|
|
- &bo->tbo.mem, &ctx);
|
|
- if (r)
|
|
- goto error_pin;
|
|
-
|
|
- r = amdgpu_bo_pin_restricted(adev->fw_vram_usage.reserved_bo,
|
|
- AMDGPU_GEM_DOMAIN_VRAM,
|
|
- adev->fw_vram_usage.start_offset,
|
|
- (adev->fw_vram_usage.start_offset +
|
|
- adev->fw_vram_usage.size));
|
|
- if (r)
|
|
- goto error_pin;
|
|
- r = amdgpu_bo_kmap(adev->fw_vram_usage.reserved_bo,
|
|
- &adev->fw_vram_usage.va);
|
|
- if (r)
|
|
- goto error_kmap;
|
|
-
|
|
- amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo);
|
|
- }
|
|
- return r;
|
|
+ if (adev->fw_vram_usage.size == 0 ||
|
|
+ adev->fw_vram_usage.size > vram_size)
|
|
+ return 0;
|
|
|
|
-error_kmap:
|
|
- amdgpu_bo_unpin(adev->fw_vram_usage.reserved_bo);
|
|
-error_pin:
|
|
- amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo);
|
|
-error_reserve:
|
|
- amdgpu_bo_unref(&adev->fw_vram_usage.reserved_bo);
|
|
-error_create:
|
|
- adev->fw_vram_usage.va = NULL;
|
|
- adev->fw_vram_usage.reserved_bo = NULL;
|
|
+ return amdgpu_bo_create_kernel_at(adev,
|
|
+ adev->fw_vram_usage.start_offset,
|
|
+ adev->fw_vram_usage.size,
|
|
+ AMDGPU_GEM_DOMAIN_VRAM,
|
|
+ &adev->fw_vram_usage.reserved_bo,
|
|
+ &adev->fw_vram_usage.va);
|
|
return r;
|
|
}
|
|
+
|
|
/**
|
|
* amdgpu_ttm_init - Init the memory management (ttm) as well as various
|
|
* gtt/vram related fields.
|
|
@@ -1786,6 +1730,20 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
|
NULL, &stolen_vga_buf);
|
|
if (r)
|
|
return r;
|
|
+
|
|
+ /*
|
|
+ * reserve one TMR (64K) memory at the top of VRAM which holds
|
|
+ * IP Discovery data and is protected by PSP.
|
|
+ */
|
|
+ r = amdgpu_bo_create_kernel_at(adev,
|
|
+ adev->gmc.real_vram_size - DISCOVERY_TMR_SIZE,
|
|
+ DISCOVERY_TMR_SIZE,
|
|
+ AMDGPU_GEM_DOMAIN_VRAM,
|
|
+ &adev->discovery_memory,
|
|
+ NULL);
|
|
+ if (r)
|
|
+ return r;
|
|
+
|
|
DRM_INFO("amdgpu: %uM of VRAM memory ready\n",
|
|
(unsigned) (adev->gmc.real_vram_size / (1024 * 1024)));
|
|
|
|
@@ -1850,6 +1808,9 @@ void amdgpu_ttm_late_init(struct amdgpu_device *adev)
|
|
void *stolen_vga_buf;
|
|
/* return the VGA stolen memory (if any) back to VRAM */
|
|
amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, &stolen_vga_buf);
|
|
+
|
|
+ /* return the IP Discovery TMR memory back to VRAM */
|
|
+ amdgpu_bo_free_kernel(&adev->discovery_memory, NULL, NULL);
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
index c9ba2ec6d038..ab4a0d8545dc 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
@@ -1038,17 +1038,10 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)
|
|
case CHIP_VEGA20:
|
|
break;
|
|
case CHIP_RAVEN:
|
|
- /* Disable GFXOFF on original raven. There are combinations
|
|
- * of sbios and platforms that are not stable.
|
|
- */
|
|
- if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8))
|
|
- adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
|
- else if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8)
|
|
- &&((adev->gfx.rlc_fw_version != 106 &&
|
|
- adev->gfx.rlc_fw_version < 531) ||
|
|
- (adev->gfx.rlc_fw_version == 53815) ||
|
|
- (adev->gfx.rlc_feature_version < 1) ||
|
|
- !adev->gfx.rlc.is_rlc_v2_1))
|
|
+ if (!(adev->rev_id >= 0x8 ||
|
|
+ adev->pdev->device == 0x15d8) &&
|
|
+ (adev->pm.fw_version < 0x41e2b || /* not raven1 fresh */
|
|
+ !adev->gfx.rlc.is_rlc_v2_1)) /* without rlc save restore ucodes */
|
|
adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
|
|
|
if (adev->pm.pp_feature & PP_GFXOFF_MASK)
|
|
diff --git a/drivers/gpu/drm/amd/include/discovery.h b/drivers/gpu/drm/amd/include/discovery.h
|
|
index 5dcb776548d8..7ec4331e67f2 100644
|
|
--- a/drivers/gpu/drm/amd/include/discovery.h
|
|
+++ b/drivers/gpu/drm/amd/include/discovery.h
|
|
@@ -25,7 +25,6 @@
|
|
#define _DISCOVERY_H_
|
|
|
|
#define PSP_HEADER_SIZE 256
|
|
-#define BINARY_MAX_SIZE (64 << 10)
|
|
#define BINARY_SIGNATURE 0x28211407
|
|
#define DISCOVERY_TABLE_SIGNATURE 0x53445049
|
|
|
|
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
|
|
index 875a3a9eabfa..7d0e7b031e44 100644
|
|
--- a/drivers/gpu/drm/arm/malidp_mw.c
|
|
+++ b/drivers/gpu/drm/arm/malidp_mw.c
|
|
@@ -56,7 +56,7 @@ malidp_mw_connector_mode_valid(struct drm_connector *connector,
|
|
return MODE_OK;
|
|
}
|
|
|
|
-const struct drm_connector_helper_funcs malidp_mw_connector_helper_funcs = {
|
|
+static const struct drm_connector_helper_funcs malidp_mw_connector_helper_funcs = {
|
|
.get_modes = malidp_mw_connector_get_modes,
|
|
.mode_valid = malidp_mw_connector_mode_valid,
|
|
};
|
|
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
|
|
index 6fb7d74ff553..bc7cc32140f8 100644
|
|
--- a/drivers/gpu/drm/tegra/drm.c
|
|
+++ b/drivers/gpu/drm/tegra/drm.c
|
|
@@ -201,19 +201,19 @@ hub:
|
|
if (tegra->hub)
|
|
tegra_display_hub_cleanup(tegra->hub);
|
|
device:
|
|
- host1x_device_exit(device);
|
|
-fbdev:
|
|
- drm_kms_helper_poll_fini(drm);
|
|
- tegra_drm_fb_free(drm);
|
|
-config:
|
|
- drm_mode_config_cleanup(drm);
|
|
-
|
|
if (tegra->domain) {
|
|
mutex_destroy(&tegra->mm_lock);
|
|
drm_mm_takedown(&tegra->mm);
|
|
put_iova_domain(&tegra->carveout.domain);
|
|
iova_cache_put();
|
|
}
|
|
+
|
|
+ host1x_device_exit(device);
|
|
+fbdev:
|
|
+ drm_kms_helper_poll_fini(drm);
|
|
+ tegra_drm_fb_free(drm);
|
|
+config:
|
|
+ drm_mode_config_cleanup(drm);
|
|
domain:
|
|
if (tegra->domain)
|
|
iommu_domain_free(tegra->domain);
|
|
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
|
|
index a662394f6892..0a88ef11b9d3 100644
|
|
--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c
|
|
+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c
|
|
@@ -463,29 +463,25 @@ out:
|
|
}
|
|
|
|
static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data,
|
|
- struct drm_file *file)
|
|
+ struct drm_file *file)
|
|
{
|
|
struct drm_virtgpu_3d_wait *args = data;
|
|
- struct drm_gem_object *obj;
|
|
- long timeout = 15 * HZ;
|
|
+ struct drm_gem_object *gobj = NULL;
|
|
+ struct virtio_gpu_object *qobj = NULL;
|
|
int ret;
|
|
+ bool nowait = false;
|
|
|
|
- obj = drm_gem_object_lookup(file, args->handle);
|
|
- if (obj == NULL)
|
|
+ gobj = drm_gem_object_lookup(file, args->handle);
|
|
+ if (gobj == NULL)
|
|
return -ENOENT;
|
|
|
|
- if (args->flags & VIRTGPU_WAIT_NOWAIT) {
|
|
- ret = dma_resv_test_signaled_rcu(obj->resv, true);
|
|
- } else {
|
|
- ret = dma_resv_wait_timeout_rcu(obj->resv, true, true,
|
|
- timeout);
|
|
- }
|
|
- if (ret == 0)
|
|
- ret = -EBUSY;
|
|
- else if (ret > 0)
|
|
- ret = 0;
|
|
+ qobj = gem_to_virtio_gpu_obj(gobj);
|
|
|
|
- drm_gem_object_put_unlocked(obj);
|
|
+ if (args->flags & VIRTGPU_WAIT_NOWAIT)
|
|
+ nowait = true;
|
|
+ ret = virtio_gpu_object_wait(qobj, nowait);
|
|
+
|
|
+ drm_gem_object_put_unlocked(gobj);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
|
|
index c25e95c19cad..b382c6bf2c5c 100644
|
|
--- a/drivers/hid/hidraw.c
|
|
+++ b/drivers/hid/hidraw.c
|
|
@@ -249,13 +249,14 @@ out:
|
|
static __poll_t hidraw_poll(struct file *file, poll_table *wait)
|
|
{
|
|
struct hidraw_list *list = file->private_data;
|
|
+ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* hidraw is always writable */
|
|
|
|
poll_wait(file, &list->hidraw->wait, wait);
|
|
if (list->head != list->tail)
|
|
- return EPOLLIN | EPOLLRDNORM;
|
|
+ mask |= EPOLLIN | EPOLLRDNORM;
|
|
if (!list->hidraw->exist)
|
|
- return EPOLLERR | EPOLLHUP;
|
|
- return EPOLLOUT | EPOLLWRNORM;
|
|
+ mask |= EPOLLERR | EPOLLHUP;
|
|
+ return mask;
|
|
}
|
|
|
|
static int hidraw_open(struct inode *inode, struct file *file)
|
|
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
|
|
index 935c3d0a3b63..8fe3efcb8327 100644
|
|
--- a/drivers/hid/uhid.c
|
|
+++ b/drivers/hid/uhid.c
|
|
@@ -766,13 +766,14 @@ unlock:
|
|
static __poll_t uhid_char_poll(struct file *file, poll_table *wait)
|
|
{
|
|
struct uhid_device *uhid = file->private_data;
|
|
+ __poll_t mask = EPOLLOUT | EPOLLWRNORM; /* uhid is always writable */
|
|
|
|
poll_wait(file, &uhid->waitq, wait);
|
|
|
|
if (uhid->head != uhid->tail)
|
|
- return EPOLLIN | EPOLLRDNORM;
|
|
+ mask |= EPOLLIN | EPOLLRDNORM;
|
|
|
|
- return EPOLLOUT | EPOLLWRNORM;
|
|
+ return mask;
|
|
}
|
|
|
|
static const struct file_operations uhid_fops = {
|
|
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
|
|
index e01b2b57e724..5ab901ad615d 100644
|
|
--- a/drivers/i2c/busses/i2c-bcm2835.c
|
|
+++ b/drivers/i2c/busses/i2c-bcm2835.c
|
|
@@ -58,6 +58,7 @@ struct bcm2835_i2c_dev {
|
|
struct i2c_adapter adapter;
|
|
struct completion completion;
|
|
struct i2c_msg *curr_msg;
|
|
+ struct clk *bus_clk;
|
|
int num_msgs;
|
|
u32 msg_err;
|
|
u8 *msg_buf;
|
|
@@ -404,7 +405,6 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
|
|
struct resource *mem, *irq;
|
|
int ret;
|
|
struct i2c_adapter *adap;
|
|
- struct clk *bus_clk;
|
|
struct clk *mclk;
|
|
u32 bus_clk_rate;
|
|
|
|
@@ -427,11 +427,11 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
|
|
return PTR_ERR(mclk);
|
|
}
|
|
|
|
- bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev);
|
|
+ i2c_dev->bus_clk = bcm2835_i2c_register_div(&pdev->dev, mclk, i2c_dev);
|
|
|
|
- if (IS_ERR(bus_clk)) {
|
|
+ if (IS_ERR(i2c_dev->bus_clk)) {
|
|
dev_err(&pdev->dev, "Could not register clock\n");
|
|
- return PTR_ERR(bus_clk);
|
|
+ return PTR_ERR(i2c_dev->bus_clk);
|
|
}
|
|
|
|
ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency",
|
|
@@ -442,13 +442,13 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
|
|
bus_clk_rate = 100000;
|
|
}
|
|
|
|
- ret = clk_set_rate_exclusive(bus_clk, bus_clk_rate);
|
|
+ ret = clk_set_rate_exclusive(i2c_dev->bus_clk, bus_clk_rate);
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "Could not set clock frequency\n");
|
|
return ret;
|
|
}
|
|
|
|
- ret = clk_prepare_enable(bus_clk);
|
|
+ ret = clk_prepare_enable(i2c_dev->bus_clk);
|
|
if (ret) {
|
|
dev_err(&pdev->dev, "Couldn't prepare clock");
|
|
return ret;
|
|
@@ -491,10 +491,9 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
|
|
static int bcm2835_i2c_remove(struct platform_device *pdev)
|
|
{
|
|
struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
|
|
- struct clk *bus_clk = devm_clk_get(i2c_dev->dev, "div");
|
|
|
|
- clk_rate_exclusive_put(bus_clk);
|
|
- clk_disable_unprepare(bus_clk);
|
|
+ clk_rate_exclusive_put(i2c_dev->bus_clk);
|
|
+ clk_disable_unprepare(i2c_dev->bus_clk);
|
|
|
|
free_irq(i2c_dev->irq, i2c_dev);
|
|
i2c_del_adapter(&i2c_dev->adapter);
|
|
diff --git a/drivers/iio/imu/adis16480.c b/drivers/iio/imu/adis16480.c
|
|
index 7b966a41d623..cf7b59d97802 100644
|
|
--- a/drivers/iio/imu/adis16480.c
|
|
+++ b/drivers/iio/imu/adis16480.c
|
|
@@ -454,12 +454,14 @@ static int adis16480_get_calibbias(struct iio_dev *indio_dev,
|
|
case IIO_MAGN:
|
|
case IIO_PRESSURE:
|
|
ret = adis_read_reg_16(&st->adis, reg, &val16);
|
|
- *bias = sign_extend32(val16, 15);
|
|
+ if (ret == 0)
|
|
+ *bias = sign_extend32(val16, 15);
|
|
break;
|
|
case IIO_ANGL_VEL:
|
|
case IIO_ACCEL:
|
|
ret = adis_read_reg_32(&st->adis, reg, &val32);
|
|
- *bias = sign_extend32(val32, 31);
|
|
+ if (ret == 0)
|
|
+ *bias = sign_extend32(val32, 31);
|
|
break;
|
|
default:
|
|
ret = -EINVAL;
|
|
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
|
|
index 28e011b35f21..3e0528793d95 100644
|
|
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
|
|
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
|
|
@@ -152,9 +152,10 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
|
|
.addr = 0x10,
|
|
.mask = GENMASK(4, 3),
|
|
},
|
|
- .fs_avl[0] = { IIO_DEGREE_TO_RAD(245), 0x0 },
|
|
- .fs_avl[1] = { IIO_DEGREE_TO_RAD(500), 0x1 },
|
|
- .fs_avl[2] = { IIO_DEGREE_TO_RAD(2000), 0x3 },
|
|
+
|
|
+ .fs_avl[0] = { IIO_DEGREE_TO_RAD(8750), 0x0 },
|
|
+ .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 },
|
|
+ .fs_avl[2] = { IIO_DEGREE_TO_RAD(70000), 0x3 },
|
|
.fs_len = 3,
|
|
},
|
|
},
|
|
diff --git a/drivers/infiniband/core/counters.c b/drivers/infiniband/core/counters.c
|
|
index 023478107f0e..46dd50ff7c85 100644
|
|
--- a/drivers/infiniband/core/counters.c
|
|
+++ b/drivers/infiniband/core/counters.c
|
|
@@ -466,10 +466,15 @@ static struct rdma_counter *rdma_get_counter_by_id(struct ib_device *dev,
|
|
int rdma_counter_bind_qpn(struct ib_device *dev, u8 port,
|
|
u32 qp_num, u32 counter_id)
|
|
{
|
|
+ struct rdma_port_counter *port_counter;
|
|
struct rdma_counter *counter;
|
|
struct ib_qp *qp;
|
|
int ret;
|
|
|
|
+ port_counter = &dev->port_data[port].port_counter;
|
|
+ if (port_counter->mode.mode == RDMA_COUNTER_MODE_AUTO)
|
|
+ return -EINVAL;
|
|
+
|
|
qp = rdma_counter_get_qp(dev, qp_num);
|
|
if (!qp)
|
|
return -ENOENT;
|
|
@@ -506,6 +511,7 @@ err:
|
|
int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port,
|
|
u32 qp_num, u32 *counter_id)
|
|
{
|
|
+ struct rdma_port_counter *port_counter;
|
|
struct rdma_counter *counter;
|
|
struct ib_qp *qp;
|
|
int ret;
|
|
@@ -513,9 +519,13 @@ int rdma_counter_bind_qpn_alloc(struct ib_device *dev, u8 port,
|
|
if (!rdma_is_port_valid(dev, port))
|
|
return -EINVAL;
|
|
|
|
- if (!dev->port_data[port].port_counter.hstats)
|
|
+ port_counter = &dev->port_data[port].port_counter;
|
|
+ if (!port_counter->hstats)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ if (port_counter->mode.mode == RDMA_COUNTER_MODE_AUTO)
|
|
+ return -EINVAL;
|
|
+
|
|
qp = rdma_counter_get_qp(dev, qp_num);
|
|
if (!qp)
|
|
return -ENOENT;
|
|
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
|
|
index b4149dc9e824..ebc3e3d4a6e2 100644
|
|
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
|
|
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
|
|
@@ -3323,8 +3323,10 @@ int bnxt_re_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
|
|
int rc;
|
|
|
|
rc = bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
|
|
- if (rc)
|
|
+ if (rc) {
|
|
dev_err(rdev_to_dev(rdev), "Dereg MR failed: %#x\n", rc);
|
|
+ return rc;
|
|
+ }
|
|
|
|
if (mr->pages) {
|
|
rc = bnxt_qplib_free_fast_reg_page_list(&rdev->qplib_res,
|
|
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
|
|
index 958c1ff9c515..4d07d22bfa7b 100644
|
|
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
|
|
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
|
|
@@ -2283,13 +2283,13 @@ static int bnxt_qplib_cq_process_req(struct bnxt_qplib_cq *cq,
|
|
/* Add qp to flush list of the CQ */
|
|
bnxt_qplib_add_flush_qp(qp);
|
|
} else {
|
|
+ /* Before we complete, do WA 9060 */
|
|
+ if (do_wa9060(qp, cq, cq_cons, sw_sq_cons,
|
|
+ cqe_sq_cons)) {
|
|
+ *lib_qp = qp;
|
|
+ goto out;
|
|
+ }
|
|
if (swq->flags & SQ_SEND_FLAGS_SIGNAL_COMP) {
|
|
- /* Before we complete, do WA 9060 */
|
|
- if (do_wa9060(qp, cq, cq_cons, sw_sq_cons,
|
|
- cqe_sq_cons)) {
|
|
- *lib_qp = qp;
|
|
- goto out;
|
|
- }
|
|
cqe->status = CQ_REQ_STATUS_OK;
|
|
cqe++;
|
|
(*budget)--;
|
|
diff --git a/drivers/infiniband/hw/hfi1/iowait.c b/drivers/infiniband/hw/hfi1/iowait.c
|
|
index adb4a1ba921b..5836fe7b2817 100644
|
|
--- a/drivers/infiniband/hw/hfi1/iowait.c
|
|
+++ b/drivers/infiniband/hw/hfi1/iowait.c
|
|
@@ -81,7 +81,9 @@ void iowait_init(struct iowait *wait, u32 tx_limit,
|
|
void iowait_cancel_work(struct iowait *w)
|
|
{
|
|
cancel_work_sync(&iowait_get_ib_work(w)->iowork);
|
|
- cancel_work_sync(&iowait_get_tid_work(w)->iowork);
|
|
+ /* Make sure that the iowork for TID RDMA is used */
|
|
+ if (iowait_get_tid_work(w)->iowork.func)
|
|
+ cancel_work_sync(&iowait_get_tid_work(w)->iowork);
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/infiniband/hw/hns/Kconfig b/drivers/infiniband/hw/hns/Kconfig
|
|
index d602b698b57e..4921c1e40ccd 100644
|
|
--- a/drivers/infiniband/hw/hns/Kconfig
|
|
+++ b/drivers/infiniband/hw/hns/Kconfig
|
|
@@ -1,23 +1,34 @@
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
config INFINIBAND_HNS
|
|
- bool "HNS RoCE Driver"
|
|
+ tristate "HNS RoCE Driver"
|
|
depends on NET_VENDOR_HISILICON
|
|
depends on ARM64 || (COMPILE_TEST && 64BIT)
|
|
+ depends on (HNS_DSAF && HNS_ENET) || HNS3
|
|
---help---
|
|
This is a RoCE/RDMA driver for the Hisilicon RoCE engine. The engine
|
|
is used in Hisilicon Hip06 and more further ICT SoC based on
|
|
platform device.
|
|
|
|
+ To compile HIP06 or HIP08 driver as module, choose M here.
|
|
+
|
|
config INFINIBAND_HNS_HIP06
|
|
- tristate "Hisilicon Hip06 Family RoCE support"
|
|
+ bool "Hisilicon Hip06 Family RoCE support"
|
|
depends on INFINIBAND_HNS && HNS && HNS_DSAF && HNS_ENET
|
|
+ depends on INFINIBAND_HNS=m || (HNS_DSAF=y && HNS_ENET=y)
|
|
---help---
|
|
RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip06 and
|
|
Hip07 SoC. These RoCE engines are platform devices.
|
|
|
|
+ To compile this driver, choose Y here: if INFINIBAND_HNS is m, this
|
|
+ module will be called hns-roce-hw-v1
|
|
+
|
|
config INFINIBAND_HNS_HIP08
|
|
- tristate "Hisilicon Hip08 Family RoCE support"
|
|
+ bool "Hisilicon Hip08 Family RoCE support"
|
|
depends on INFINIBAND_HNS && PCI && HNS3
|
|
+ depends on INFINIBAND_HNS=m || HNS3=y
|
|
---help---
|
|
RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip08 SoC.
|
|
The RoCE engine is a PCI device.
|
|
+
|
|
+ To compile this driver, choose Y here: if INFINIBAND_HNS is m, this
|
|
+ module will be called hns-roce-hw-v2.
|
|
diff --git a/drivers/infiniband/hw/hns/Makefile b/drivers/infiniband/hw/hns/Makefile
|
|
index 449a2d81319d..e105945b94a1 100644
|
|
--- a/drivers/infiniband/hw/hns/Makefile
|
|
+++ b/drivers/infiniband/hw/hns/Makefile
|
|
@@ -9,8 +9,12 @@ hns-roce-objs := hns_roce_main.o hns_roce_cmd.o hns_roce_pd.o \
|
|
hns_roce_ah.o hns_roce_hem.o hns_roce_mr.o hns_roce_qp.o \
|
|
hns_roce_cq.o hns_roce_alloc.o hns_roce_db.o hns_roce_srq.o hns_roce_restrack.o
|
|
|
|
+ifdef CONFIG_INFINIBAND_HNS_HIP06
|
|
hns-roce-hw-v1-objs := hns_roce_hw_v1.o $(hns-roce-objs)
|
|
-obj-$(CONFIG_INFINIBAND_HNS_HIP06) += hns-roce-hw-v1.o
|
|
+obj-$(CONFIG_INFINIBAND_HNS) += hns-roce-hw-v1.o
|
|
+endif
|
|
|
|
+ifdef CONFIG_INFINIBAND_HNS_HIP08
|
|
hns-roce-hw-v2-objs := hns_roce_hw_v2.o hns_roce_hw_v2_dfx.o $(hns-roce-objs)
|
|
-obj-$(CONFIG_INFINIBAND_HNS_HIP08) += hns-roce-hw-v2.o
|
|
+obj-$(CONFIG_INFINIBAND_HNS) += hns-roce-hw-v2.o
|
|
+endif
|
|
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
|
|
index e82567fcdeb7..79294f278b26 100644
|
|
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
|
|
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
|
|
@@ -389,7 +389,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp,
|
|
roce_set_field(ud_sq_wqe->byte_36,
|
|
V2_UD_SEND_WQE_BYTE_36_VLAN_M,
|
|
V2_UD_SEND_WQE_BYTE_36_VLAN_S,
|
|
- le16_to_cpu(ah->av.vlan));
|
|
+ ah->av.vlan);
|
|
roce_set_field(ud_sq_wqe->byte_36,
|
|
V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_M,
|
|
V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_S,
|
|
@@ -4650,16 +4650,14 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
|
|
{
|
|
struct hns_roce_cq *send_cq, *recv_cq;
|
|
struct ib_device *ibdev = &hr_dev->ib_dev;
|
|
- int ret;
|
|
+ int ret = 0;
|
|
|
|
if (hr_qp->ibqp.qp_type == IB_QPT_RC && hr_qp->state != IB_QPS_RESET) {
|
|
/* Modify qp to reset before destroying qp */
|
|
ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0,
|
|
hr_qp->state, IB_QPS_RESET);
|
|
- if (ret) {
|
|
+ if (ret)
|
|
ibdev_err(ibdev, "modify QP to Reset failed.\n");
|
|
- return ret;
|
|
- }
|
|
}
|
|
|
|
send_cq = to_hr_cq(hr_qp->ibqp.send_cq);
|
|
@@ -4715,7 +4713,7 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
|
|
kfree(hr_qp->rq_inl_buf.wqe_list);
|
|
}
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
|
|
@@ -4725,11 +4723,9 @@ static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
|
|
int ret;
|
|
|
|
ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, udata);
|
|
- if (ret) {
|
|
+ if (ret)
|
|
ibdev_err(&hr_dev->ib_dev, "Destroy qp 0x%06lx failed(%d)\n",
|
|
hr_qp->qpn, ret);
|
|
- return ret;
|
|
- }
|
|
|
|
if (hr_qp->ibqp.qp_type == IB_QPT_GSI)
|
|
kfree(hr_to_hr_sqp(hr_qp));
|
|
@@ -6092,11 +6088,11 @@ static void hns_roce_v2_write_srqc(struct hns_roce_dev *hr_dev,
|
|
roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
|
|
SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_M,
|
|
SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_S,
|
|
- hr_dev->caps.idx_ba_pg_sz);
|
|
+ hr_dev->caps.idx_ba_pg_sz + PG_SHIFT_OFFSET);
|
|
roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
|
|
SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_M,
|
|
SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_S,
|
|
- hr_dev->caps.idx_buf_pg_sz);
|
|
+ hr_dev->caps.idx_buf_pg_sz + PG_SHIFT_OFFSET);
|
|
|
|
srq_context->idx_nxt_blk_addr =
|
|
cpu_to_le32(mtts_idx[1] >> PAGE_ADDR_SHIFT);
|
|
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
|
|
index 43219d2f7de0..76a14db7028d 100644
|
|
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
|
|
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
|
|
@@ -87,8 +87,8 @@
|
|
#define HNS_ROCE_V2_MTT_ENTRY_SZ 64
|
|
#define HNS_ROCE_V2_CQE_ENTRY_SIZE 32
|
|
#define HNS_ROCE_V2_SCCC_ENTRY_SZ 32
|
|
-#define HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ 4096
|
|
-#define HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ 4096
|
|
+#define HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ PAGE_SIZE
|
|
+#define HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ PAGE_SIZE
|
|
#define HNS_ROCE_V2_PAGE_SIZE_SUPPORTED 0xFFFFF000
|
|
#define HNS_ROCE_V2_MAX_INNER_MTPT_NUM 2
|
|
#define HNS_ROCE_INVALID_LKEY 0x100
|
|
diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
|
|
index bd78ff90d998..8dd2d666f687 100644
|
|
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
|
|
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
|
|
@@ -332,9 +332,8 @@ static int check_sq_size_with_integrity(struct hns_roce_dev *hr_dev,
|
|
u8 max_sq_stride = ilog2(roundup_sq_stride);
|
|
|
|
/* Sanity check SQ size before proceeding */
|
|
- if ((u32)(1 << ucmd->log_sq_bb_count) > hr_dev->caps.max_wqes ||
|
|
- ucmd->log_sq_stride > max_sq_stride ||
|
|
- ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) {
|
|
+ if (ucmd->log_sq_stride > max_sq_stride ||
|
|
+ ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) {
|
|
ibdev_err(&hr_dev->ib_dev, "check SQ size error!\n");
|
|
return -EINVAL;
|
|
}
|
|
@@ -358,13 +357,16 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev,
|
|
u32 max_cnt;
|
|
int ret;
|
|
|
|
+ if (check_shl_overflow(1, ucmd->log_sq_bb_count, &hr_qp->sq.wqe_cnt) ||
|
|
+ hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes)
|
|
+ return -EINVAL;
|
|
+
|
|
ret = check_sq_size_with_integrity(hr_dev, cap, ucmd);
|
|
if (ret) {
|
|
ibdev_err(&hr_dev->ib_dev, "Sanity check sq size failed\n");
|
|
return ret;
|
|
}
|
|
|
|
- hr_qp->sq.wqe_cnt = 1 << ucmd->log_sq_bb_count;
|
|
hr_qp->sq.wqe_shift = ucmd->log_sq_stride;
|
|
|
|
max_cnt = max(1U, cap->max_send_sge);
|
|
diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c
|
|
index 06871731ac43..39c08217e861 100644
|
|
--- a/drivers/infiniband/hw/hns/hns_roce_restrack.c
|
|
+++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c
|
|
@@ -95,7 +95,7 @@ static int hns_roce_fill_res_cq_entry(struct sk_buff *msg,
|
|
|
|
ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context);
|
|
if (ret)
|
|
- goto err;
|
|
+ return -EINVAL;
|
|
|
|
table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
|
|
if (!table_attr) {
|
|
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
|
|
index 7019c12005f4..99d563dba91b 100644
|
|
--- a/drivers/infiniband/hw/mlx5/mr.c
|
|
+++ b/drivers/infiniband/hw/mlx5/mr.c
|
|
@@ -428,7 +428,7 @@ struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev, int entry)
|
|
|
|
if (entry < 0 || entry >= MAX_MR_CACHE_ENTRIES) {
|
|
mlx5_ib_err(dev, "cache entry %d is out of range\n", entry);
|
|
- return NULL;
|
|
+ return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
ent = &cache->ent[entry];
|
|
diff --git a/drivers/infiniband/sw/siw/siw_cm.c b/drivers/infiniband/sw/siw/siw_cm.c
|
|
index 8c1931a57f4a..0454561718d9 100644
|
|
--- a/drivers/infiniband/sw/siw/siw_cm.c
|
|
+++ b/drivers/infiniband/sw/siw/siw_cm.c
|
|
@@ -1867,14 +1867,7 @@ static int siw_listen_address(struct iw_cm_id *id, int backlog,
|
|
list_add_tail(&cep->listenq, (struct list_head *)id->provider_data);
|
|
cep->state = SIW_EPSTATE_LISTENING;
|
|
|
|
- if (addr_family == AF_INET)
|
|
- siw_dbg(id->device, "Listen at laddr %pI4 %u\n",
|
|
- &(((struct sockaddr_in *)laddr)->sin_addr),
|
|
- ((struct sockaddr_in *)laddr)->sin_port);
|
|
- else
|
|
- siw_dbg(id->device, "Listen at laddr %pI6 %u\n",
|
|
- &(((struct sockaddr_in6 *)laddr)->sin6_addr),
|
|
- ((struct sockaddr_in6 *)laddr)->sin6_port);
|
|
+ siw_dbg(id->device, "Listen at laddr %pISp\n", laddr);
|
|
|
|
return 0;
|
|
|
|
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
|
|
index e25c70a56be6..02b92e3cd9a8 100644
|
|
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
|
|
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
|
|
@@ -1364,9 +1364,11 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch,
|
|
struct srpt_send_ioctx *ioctx, u64 tag,
|
|
int status)
|
|
{
|
|
+ struct se_cmd *cmd = &ioctx->cmd;
|
|
struct srp_rsp *srp_rsp;
|
|
const u8 *sense_data;
|
|
int sense_data_len, max_sense_len;
|
|
+ u32 resid = cmd->residual_count;
|
|
|
|
/*
|
|
* The lowest bit of all SAM-3 status codes is zero (see also
|
|
@@ -1388,6 +1390,28 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch,
|
|
srp_rsp->tag = tag;
|
|
srp_rsp->status = status;
|
|
|
|
+ if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) {
|
|
+ if (cmd->data_direction == DMA_TO_DEVICE) {
|
|
+ /* residual data from an underflow write */
|
|
+ srp_rsp->flags = SRP_RSP_FLAG_DOUNDER;
|
|
+ srp_rsp->data_out_res_cnt = cpu_to_be32(resid);
|
|
+ } else if (cmd->data_direction == DMA_FROM_DEVICE) {
|
|
+ /* residual data from an underflow read */
|
|
+ srp_rsp->flags = SRP_RSP_FLAG_DIUNDER;
|
|
+ srp_rsp->data_in_res_cnt = cpu_to_be32(resid);
|
|
+ }
|
|
+ } else if (cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
|
|
+ if (cmd->data_direction == DMA_TO_DEVICE) {
|
|
+ /* residual data from an overflow write */
|
|
+ srp_rsp->flags = SRP_RSP_FLAG_DOOVER;
|
|
+ srp_rsp->data_out_res_cnt = cpu_to_be32(resid);
|
|
+ } else if (cmd->data_direction == DMA_FROM_DEVICE) {
|
|
+ /* residual data from an overflow read */
|
|
+ srp_rsp->flags = SRP_RSP_FLAG_DIOVER;
|
|
+ srp_rsp->data_in_res_cnt = cpu_to_be32(resid);
|
|
+ }
|
|
+ }
|
|
+
|
|
if (sense_data_len) {
|
|
BUILD_BUG_ON(MIN_MAX_RSP_SIZE <= sizeof(*srp_rsp));
|
|
max_sense_len = ch->max_ti_iu_len - sizeof(*srp_rsp);
|
|
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
|
|
index 67aa317de6db..e84c5dfe146f 100644
|
|
--- a/drivers/iommu/intel-iommu.c
|
|
+++ b/drivers/iommu/intel-iommu.c
|
|
@@ -5593,8 +5593,10 @@ static int intel_iommu_add_device(struct device *dev)
|
|
|
|
group = iommu_group_get_for_dev(dev);
|
|
|
|
- if (IS_ERR(group))
|
|
- return PTR_ERR(group);
|
|
+ if (IS_ERR(group)) {
|
|
+ ret = PTR_ERR(group);
|
|
+ goto unlink;
|
|
+ }
|
|
|
|
iommu_group_put(group);
|
|
|
|
@@ -5620,7 +5622,8 @@ static int intel_iommu_add_device(struct device *dev)
|
|
if (!get_private_domain_for_dev(dev)) {
|
|
dev_warn(dev,
|
|
"Failed to get a private domain.\n");
|
|
- return -ENOMEM;
|
|
+ ret = -ENOMEM;
|
|
+ goto unlink;
|
|
}
|
|
|
|
dev_info(dev,
|
|
@@ -5635,6 +5638,10 @@ static int intel_iommu_add_device(struct device *dev)
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+unlink:
|
|
+ iommu_device_unlink(&iommu->iommu, dev);
|
|
+ return ret;
|
|
}
|
|
|
|
static void intel_iommu_remove_device(struct device *dev)
|
|
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
|
|
index 24248aa8a7e5..cd3c0ea56657 100644
|
|
--- a/drivers/iommu/iommu.c
|
|
+++ b/drivers/iommu/iommu.c
|
|
@@ -751,6 +751,7 @@ err_put_group:
|
|
mutex_unlock(&group->mutex);
|
|
dev->iommu_group = NULL;
|
|
kobject_put(group->devices_kobj);
|
|
+ sysfs_remove_link(group->devices_kobj, device->name);
|
|
err_free_name:
|
|
kfree(device->name);
|
|
err_remove_link:
|
|
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
|
|
index 67a483c1a935..c2f6c78fee44 100644
|
|
--- a/drivers/iommu/mtk_iommu.c
|
|
+++ b/drivers/iommu/mtk_iommu.c
|
|
@@ -219,22 +219,37 @@ static void mtk_iommu_tlb_sync(void *cookie)
|
|
static void mtk_iommu_tlb_flush_walk(unsigned long iova, size_t size,
|
|
size_t granule, void *cookie)
|
|
{
|
|
+ struct mtk_iommu_data *data = cookie;
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&data->tlb_lock, flags);
|
|
mtk_iommu_tlb_add_flush_nosync(iova, size, granule, false, cookie);
|
|
mtk_iommu_tlb_sync(cookie);
|
|
+ spin_unlock_irqrestore(&data->tlb_lock, flags);
|
|
}
|
|
|
|
static void mtk_iommu_tlb_flush_leaf(unsigned long iova, size_t size,
|
|
size_t granule, void *cookie)
|
|
{
|
|
+ struct mtk_iommu_data *data = cookie;
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&data->tlb_lock, flags);
|
|
mtk_iommu_tlb_add_flush_nosync(iova, size, granule, true, cookie);
|
|
mtk_iommu_tlb_sync(cookie);
|
|
+ spin_unlock_irqrestore(&data->tlb_lock, flags);
|
|
}
|
|
|
|
static void mtk_iommu_tlb_flush_page_nosync(struct iommu_iotlb_gather *gather,
|
|
unsigned long iova, size_t granule,
|
|
void *cookie)
|
|
{
|
|
+ struct mtk_iommu_data *data = cookie;
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&data->tlb_lock, flags);
|
|
mtk_iommu_tlb_add_flush_nosync(iova, granule, granule, true, cookie);
|
|
+ spin_unlock_irqrestore(&data->tlb_lock, flags);
|
|
}
|
|
|
|
static const struct iommu_flush_ops mtk_iommu_flush_ops = {
|
|
@@ -447,13 +462,18 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain,
|
|
|
|
static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain)
|
|
{
|
|
- mtk_iommu_tlb_sync(mtk_iommu_get_m4u_data());
|
|
+ mtk_iommu_tlb_flush_all(mtk_iommu_get_m4u_data());
|
|
}
|
|
|
|
static void mtk_iommu_iotlb_sync(struct iommu_domain *domain,
|
|
struct iommu_iotlb_gather *gather)
|
|
{
|
|
- mtk_iommu_tlb_sync(mtk_iommu_get_m4u_data());
|
|
+ struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&data->tlb_lock, flags);
|
|
+ mtk_iommu_tlb_sync(data);
|
|
+ spin_unlock_irqrestore(&data->tlb_lock, flags);
|
|
}
|
|
|
|
static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
|
|
@@ -733,6 +753,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ spin_lock_init(&data->tlb_lock);
|
|
list_add_tail(&data->list, &m4ulist);
|
|
|
|
if (!iommu_present(&platform_bus_type))
|
|
diff --git a/drivers/iommu/mtk_iommu.h b/drivers/iommu/mtk_iommu.h
|
|
index fc0f16eabacd..8cae22de7663 100644
|
|
--- a/drivers/iommu/mtk_iommu.h
|
|
+++ b/drivers/iommu/mtk_iommu.h
|
|
@@ -58,6 +58,7 @@ struct mtk_iommu_data {
|
|
struct iommu_group *m4u_group;
|
|
bool enable_4GB;
|
|
bool tlb_flush_active;
|
|
+ spinlock_t tlb_lock; /* lock for tlb range flush */
|
|
|
|
struct iommu_device iommu;
|
|
const struct mtk_iommu_plat_data *plat_data;
|
|
diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c
|
|
index a5b2448c0abc..af482620f94a 100644
|
|
--- a/drivers/media/i2c/ov6650.c
|
|
+++ b/drivers/media/i2c/ov6650.c
|
|
@@ -201,7 +201,6 @@ struct ov6650 {
|
|
unsigned long pclk_max; /* from resolution and format */
|
|
struct v4l2_fract tpf; /* as requested with s_frame_interval */
|
|
u32 code;
|
|
- enum v4l2_colorspace colorspace;
|
|
};
|
|
|
|
|
|
@@ -214,6 +213,17 @@ static u32 ov6650_codes[] = {
|
|
MEDIA_BUS_FMT_Y8_1X8,
|
|
};
|
|
|
|
+static const struct v4l2_mbus_framefmt ov6650_def_fmt = {
|
|
+ .width = W_CIF,
|
|
+ .height = H_CIF,
|
|
+ .code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
|
+ .colorspace = V4L2_COLORSPACE_SRGB,
|
|
+ .field = V4L2_FIELD_NONE,
|
|
+ .ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
|
|
+ .quantization = V4L2_QUANTIZATION_DEFAULT,
|
|
+ .xfer_func = V4L2_XFER_FUNC_DEFAULT,
|
|
+};
|
|
+
|
|
/* read a register */
|
|
static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val)
|
|
{
|
|
@@ -514,12 +524,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd,
|
|
if (format->pad)
|
|
return -EINVAL;
|
|
|
|
- mf->width = priv->rect.width >> priv->half_scale;
|
|
- mf->height = priv->rect.height >> priv->half_scale;
|
|
- mf->code = priv->code;
|
|
- mf->colorspace = priv->colorspace;
|
|
- mf->field = V4L2_FIELD_NONE;
|
|
+ /* initialize response with default media bus frame format */
|
|
+ *mf = ov6650_def_fmt;
|
|
+
|
|
+ /* update media bus format code and frame size */
|
|
+ if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
|
+ mf->width = cfg->try_fmt.width;
|
|
+ mf->height = cfg->try_fmt.height;
|
|
+ mf->code = cfg->try_fmt.code;
|
|
|
|
+ } else {
|
|
+ mf->width = priv->rect.width >> priv->half_scale;
|
|
+ mf->height = priv->rect.height >> priv->half_scale;
|
|
+ mf->code = priv->code;
|
|
+ }
|
|
return 0;
|
|
}
|
|
|
|
@@ -624,11 +642,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|
priv->pclk_max = 8000000;
|
|
}
|
|
|
|
- if (code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
|
- priv->colorspace = V4L2_COLORSPACE_SRGB;
|
|
- else if (code != 0)
|
|
- priv->colorspace = V4L2_COLORSPACE_JPEG;
|
|
-
|
|
if (half_scale) {
|
|
dev_dbg(&client->dev, "max resolution: QCIF\n");
|
|
coma_set |= COMA_QCIF;
|
|
@@ -662,11 +675,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
|
if (!ret)
|
|
priv->code = code;
|
|
|
|
- if (!ret) {
|
|
- mf->colorspace = priv->colorspace;
|
|
- mf->width = priv->rect.width >> half_scale;
|
|
- mf->height = priv->rect.height >> half_scale;
|
|
- }
|
|
return ret;
|
|
}
|
|
|
|
@@ -685,8 +693,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd,
|
|
v4l_bound_align_image(&mf->width, 2, W_CIF, 1,
|
|
&mf->height, 2, H_CIF, 1, 0);
|
|
|
|
- mf->field = V4L2_FIELD_NONE;
|
|
-
|
|
switch (mf->code) {
|
|
case MEDIA_BUS_FMT_Y10_1X10:
|
|
mf->code = MEDIA_BUS_FMT_Y8_1X8;
|
|
@@ -696,20 +702,39 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd,
|
|
case MEDIA_BUS_FMT_YUYV8_2X8:
|
|
case MEDIA_BUS_FMT_VYUY8_2X8:
|
|
case MEDIA_BUS_FMT_UYVY8_2X8:
|
|
- mf->colorspace = V4L2_COLORSPACE_JPEG;
|
|
break;
|
|
default:
|
|
mf->code = MEDIA_BUS_FMT_SBGGR8_1X8;
|
|
/* fall through */
|
|
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
|
- mf->colorspace = V4L2_COLORSPACE_SRGB;
|
|
break;
|
|
}
|
|
|
|
- if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE)
|
|
- return ov6650_s_fmt(sd, mf);
|
|
- cfg->try_fmt = *mf;
|
|
+ if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
|
+ /* store media bus format code and frame size in pad config */
|
|
+ cfg->try_fmt.width = mf->width;
|
|
+ cfg->try_fmt.height = mf->height;
|
|
+ cfg->try_fmt.code = mf->code;
|
|
|
|
+ /* return default mbus frame format updated with pad config */
|
|
+ *mf = ov6650_def_fmt;
|
|
+ mf->width = cfg->try_fmt.width;
|
|
+ mf->height = cfg->try_fmt.height;
|
|
+ mf->code = cfg->try_fmt.code;
|
|
+
|
|
+ } else {
|
|
+ /* apply new media bus format code and frame size */
|
|
+ int ret = ov6650_s_fmt(sd, mf);
|
|
+
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ /* return default format updated with active size and code */
|
|
+ *mf = ov6650_def_fmt;
|
|
+ mf->width = priv->rect.width >> priv->half_scale;
|
|
+ mf->height = priv->rect.height >> priv->half_scale;
|
|
+ mf->code = priv->code;
|
|
+ }
|
|
return 0;
|
|
}
|
|
|
|
@@ -852,6 +877,11 @@ static int ov6650_video_probe(struct v4l2_subdev *sd)
|
|
ret = ov6650_reset(client);
|
|
if (!ret)
|
|
ret = ov6650_prog_dflt(client);
|
|
+ if (!ret) {
|
|
+ struct v4l2_mbus_framefmt mf = ov6650_def_fmt;
|
|
+
|
|
+ ret = ov6650_s_fmt(sd, &mf);
|
|
+ }
|
|
if (!ret)
|
|
ret = v4l2_ctrl_handler_setup(&priv->hdl);
|
|
|
|
@@ -1006,9 +1036,6 @@ static int ov6650_probe(struct i2c_client *client,
|
|
priv->rect.top = DEF_VSTRT << 1;
|
|
priv->rect.width = W_CIF;
|
|
priv->rect.height = H_CIF;
|
|
- priv->half_scale = false;
|
|
- priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
|
- priv->colorspace = V4L2_COLORSPACE_JPEG;
|
|
|
|
/* Hardware default frame interval */
|
|
priv->tpf.numerator = GET_CLKRC_DIV(DEF_CLKRC);
|
|
diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
|
|
index 096a7c9a8963..4eaaf39b9223 100644
|
|
--- a/drivers/media/platform/aspeed-video.c
|
|
+++ b/drivers/media/platform/aspeed-video.c
|
|
@@ -1658,7 +1658,8 @@ static int aspeed_video_probe(struct platform_device *pdev)
|
|
{
|
|
int rc;
|
|
struct resource *res;
|
|
- struct aspeed_video *video = kzalloc(sizeof(*video), GFP_KERNEL);
|
|
+ struct aspeed_video *video =
|
|
+ devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL);
|
|
|
|
if (!video)
|
|
return -ENOMEM;
|
|
diff --git a/drivers/media/platform/cadence/cdns-csi2rx.c b/drivers/media/platform/cadence/cdns-csi2rx.c
|
|
index 31ace114eda1..be9ec59774d6 100644
|
|
--- a/drivers/media/platform/cadence/cdns-csi2rx.c
|
|
+++ b/drivers/media/platform/cadence/cdns-csi2rx.c
|
|
@@ -129,7 +129,7 @@ static int csi2rx_start(struct csi2rx_priv *csi2rx)
|
|
*/
|
|
for (i = csi2rx->num_lanes; i < csi2rx->max_lanes; i++) {
|
|
unsigned int idx = find_first_zero_bit(&lanes_used,
|
|
- sizeof(lanes_used));
|
|
+ csi2rx->max_lanes);
|
|
set_bit(idx, &lanes_used);
|
|
reg |= CSI2RX_STATIC_CFG_DLANE_MAP(i, i + 1);
|
|
}
|
|
diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c
|
|
index 73222c0615c0..834f11fe9dc2 100644
|
|
--- a/drivers/media/platform/coda/coda-common.c
|
|
+++ b/drivers/media/platform/coda/coda-common.c
|
|
@@ -1084,16 +1084,16 @@ static int coda_decoder_cmd(struct file *file, void *fh,
|
|
|
|
switch (dc->cmd) {
|
|
case V4L2_DEC_CMD_START:
|
|
- mutex_lock(&ctx->bitstream_mutex);
|
|
mutex_lock(&dev->coda_mutex);
|
|
+ mutex_lock(&ctx->bitstream_mutex);
|
|
coda_bitstream_flush(ctx);
|
|
- mutex_unlock(&dev->coda_mutex);
|
|
dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
|
|
V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
|
vb2_clear_last_buffer_dequeued(dst_vq);
|
|
ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG;
|
|
coda_fill_bitstream(ctx, NULL);
|
|
mutex_unlock(&ctx->bitstream_mutex);
|
|
+ mutex_unlock(&dev->coda_mutex);
|
|
break;
|
|
case V4L2_DEC_CMD_STOP:
|
|
stream_end = false;
|
|
diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
index 378cc302e1f8..d2cbcdca0463 100644
|
|
--- a/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
+++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
@@ -313,7 +313,7 @@ static int isp_video_release(struct file *file)
|
|
ivc->streaming = 0;
|
|
}
|
|
|
|
- vb2_fop_release(file);
|
|
+ _vb2_fop_release(file, NULL);
|
|
|
|
if (v4l2_fh_is_singular_file(file)) {
|
|
fimc_pipeline_call(&ivc->ve, close);
|
|
diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c
|
|
index cbc1c07f0a96..ec2796413e26 100644
|
|
--- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
|
|
+++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
|
|
@@ -208,6 +208,7 @@ static int rvin_try_format(struct rvin_dev *vin, u32 which,
|
|
ret = v4l2_subdev_call(sd, pad, set_fmt, pad_cfg, &format);
|
|
if (ret < 0 && ret != -ENOIOCTLCMD)
|
|
goto done;
|
|
+ ret = 0;
|
|
|
|
v4l2_fill_pix_format(pix, &format.format);
|
|
|
|
@@ -242,7 +243,7 @@ static int rvin_try_format(struct rvin_dev *vin, u32 which,
|
|
done:
|
|
v4l2_subdev_free_pad_config(pad_cfg);
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
static int rvin_querycap(struct file *file, void *priv,
|
|
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
|
|
index 439d7d886873..a113e811faab 100644
|
|
--- a/drivers/memory/mtk-smi.c
|
|
+++ b/drivers/memory/mtk-smi.c
|
|
@@ -366,6 +366,8 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
|
|
|
|
static const struct dev_pm_ops smi_larb_pm_ops = {
|
|
SET_RUNTIME_PM_OPS(mtk_smi_larb_suspend, mtk_smi_larb_resume, NULL)
|
|
+ SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
|
|
+ pm_runtime_force_resume)
|
|
};
|
|
|
|
static struct platform_driver mtk_smi_larb_driver = {
|
|
@@ -507,6 +509,8 @@ static int __maybe_unused mtk_smi_common_suspend(struct device *dev)
|
|
|
|
static const struct dev_pm_ops smi_common_pm_ops = {
|
|
SET_RUNTIME_PM_OPS(mtk_smi_common_suspend, mtk_smi_common_resume, NULL)
|
|
+ SET_LATE_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
|
|
+ pm_runtime_force_resume)
|
|
};
|
|
|
|
static struct platform_driver mtk_smi_common_driver = {
|
|
diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
|
|
index 6d27ccfe0680..3c2d405bc79b 100644
|
|
--- a/drivers/misc/enclosure.c
|
|
+++ b/drivers/misc/enclosure.c
|
|
@@ -406,10 +406,9 @@ int enclosure_remove_device(struct enclosure_device *edev, struct device *dev)
|
|
cdev = &edev->component[i];
|
|
if (cdev->dev == dev) {
|
|
enclosure_remove_links(cdev);
|
|
- device_del(&cdev->cdev);
|
|
put_device(dev);
|
|
cdev->dev = NULL;
|
|
- return device_add(&cdev->cdev);
|
|
+ return 0;
|
|
}
|
|
}
|
|
return -ENODEV;
|
|
diff --git a/drivers/mtd/nand/onenand/omap2.c b/drivers/mtd/nand/onenand/omap2.c
|
|
index edf94ee54ec7..71a632b815aa 100644
|
|
--- a/drivers/mtd/nand/onenand/omap2.c
|
|
+++ b/drivers/mtd/nand/onenand/omap2.c
|
|
@@ -328,7 +328,8 @@ static inline int omap2_onenand_dma_transfer(struct omap2_onenand *c,
|
|
struct dma_async_tx_descriptor *tx;
|
|
dma_cookie_t cookie;
|
|
|
|
- tx = dmaengine_prep_dma_memcpy(c->dma_chan, dst, src, count, 0);
|
|
+ tx = dmaengine_prep_dma_memcpy(c->dma_chan, dst, src, count,
|
|
+ DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
|
if (!tx) {
|
|
dev_err(&c->pdev->dev, "Failed to prepare DMA memcpy\n");
|
|
return -EIO;
|
|
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
|
|
index 8cc852dc7d54..5c06e0b4d4ef 100644
|
|
--- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
|
|
+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
|
|
@@ -37,6 +37,7 @@
|
|
/* Max ECC buffer length */
|
|
#define FMC2_MAX_ECC_BUF_LEN (FMC2_BCHDSRS_LEN * FMC2_MAX_SG)
|
|
|
|
+#define FMC2_TIMEOUT_US 1000
|
|
#define FMC2_TIMEOUT_MS 1000
|
|
|
|
/* Timings */
|
|
@@ -53,6 +54,8 @@
|
|
#define FMC2_PMEM 0x88
|
|
#define FMC2_PATT 0x8c
|
|
#define FMC2_HECCR 0x94
|
|
+#define FMC2_ISR 0x184
|
|
+#define FMC2_ICR 0x188
|
|
#define FMC2_CSQCR 0x200
|
|
#define FMC2_CSQCFGR1 0x204
|
|
#define FMC2_CSQCFGR2 0x208
|
|
@@ -118,6 +121,12 @@
|
|
#define FMC2_PATT_ATTHIZ(x) (((x) & 0xff) << 24)
|
|
#define FMC2_PATT_DEFAULT 0x0a0a0a0a
|
|
|
|
+/* Register: FMC2_ISR */
|
|
+#define FMC2_ISR_IHLF BIT(1)
|
|
+
|
|
+/* Register: FMC2_ICR */
|
|
+#define FMC2_ICR_CIHLF BIT(1)
|
|
+
|
|
/* Register: FMC2_CSQCR */
|
|
#define FMC2_CSQCR_CSQSTART BIT(0)
|
|
|
|
@@ -1322,6 +1331,31 @@ static void stm32_fmc2_write_data(struct nand_chip *chip, const void *buf,
|
|
stm32_fmc2_set_buswidth_16(fmc2, true);
|
|
}
|
|
|
|
+static int stm32_fmc2_waitrdy(struct nand_chip *chip, unsigned long timeout_ms)
|
|
+{
|
|
+ struct stm32_fmc2_nfc *fmc2 = to_stm32_nfc(chip->controller);
|
|
+ const struct nand_sdr_timings *timings;
|
|
+ u32 isr, sr;
|
|
+
|
|
+ /* Check if there is no pending requests to the NAND flash */
|
|
+ if (readl_relaxed_poll_timeout_atomic(fmc2->io_base + FMC2_SR, sr,
|
|
+ sr & FMC2_SR_NWRF, 1,
|
|
+ FMC2_TIMEOUT_US))
|
|
+ dev_warn(fmc2->dev, "Waitrdy timeout\n");
|
|
+
|
|
+ /* Wait tWB before R/B# signal is low */
|
|
+ timings = nand_get_sdr_timings(&chip->data_interface);
|
|
+ ndelay(PSEC_TO_NSEC(timings->tWB_max));
|
|
+
|
|
+ /* R/B# signal is low, clear high level flag */
|
|
+ writel_relaxed(FMC2_ICR_CIHLF, fmc2->io_base + FMC2_ICR);
|
|
+
|
|
+ /* Wait R/B# signal is high */
|
|
+ return readl_relaxed_poll_timeout_atomic(fmc2->io_base + FMC2_ISR,
|
|
+ isr, isr & FMC2_ISR_IHLF,
|
|
+ 5, 1000 * timeout_ms);
|
|
+}
|
|
+
|
|
static int stm32_fmc2_exec_op(struct nand_chip *chip,
|
|
const struct nand_operation *op,
|
|
bool check_only)
|
|
@@ -1366,8 +1400,8 @@ static int stm32_fmc2_exec_op(struct nand_chip *chip,
|
|
break;
|
|
|
|
case NAND_OP_WAITRDY_INSTR:
|
|
- ret = nand_soft_waitrdy(chip,
|
|
- instr->ctx.waitrdy.timeout_ms);
|
|
+ ret = stm32_fmc2_waitrdy(chip,
|
|
+ instr->ctx.waitrdy.timeout_ms);
|
|
break;
|
|
}
|
|
}
|
|
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
|
|
index 7acf4a93b592..1548e0f7f5f4 100644
|
|
--- a/drivers/mtd/spi-nor/spi-nor.c
|
|
+++ b/drivers/mtd/spi-nor/spi-nor.c
|
|
@@ -2544,7 +2544,7 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
|
|
size_t *retlen, u_char *buf)
|
|
{
|
|
struct spi_nor *nor = mtd_to_spi_nor(mtd);
|
|
- int ret;
|
|
+ ssize_t ret;
|
|
|
|
dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len);
|
|
|
|
@@ -2865,7 +2865,7 @@ static int spi_nor_hwcaps_pp2cmd(u32 hwcaps)
|
|
*/
|
|
static int spi_nor_read_raw(struct spi_nor *nor, u32 addr, size_t len, u8 *buf)
|
|
{
|
|
- int ret;
|
|
+ ssize_t ret;
|
|
|
|
while (len) {
|
|
ret = spi_nor_read_data(nor, addr, len, buf);
|
|
diff --git a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
|
index 159490f5a111..60731e07f681 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/ath9k_pci_owl_loader.c
|
|
@@ -84,7 +84,7 @@ static int ath9k_pci_fixup(struct pci_dev *pdev, const u16 *cal_data,
|
|
val = swahb32(val);
|
|
}
|
|
|
|
- __raw_writel(val, mem + reg);
|
|
+ iowrite32(val, mem + reg);
|
|
usleep_range(100, 120);
|
|
}
|
|
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
index d9eb2b286438..c59cbb8cbdd7 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
|
|
@@ -514,6 +514,18 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
|
|
struct iwl_phy_cfg_cmd phy_cfg_cmd;
|
|
enum iwl_ucode_type ucode_type = mvm->fwrt.cur_fw_img;
|
|
|
|
+ if (iwl_mvm_has_unified_ucode(mvm) &&
|
|
+ !mvm->trans->cfg->tx_with_siso_diversity) {
|
|
+ return 0;
|
|
+ } else if (mvm->trans->cfg->tx_with_siso_diversity) {
|
|
+ /*
|
|
+ * TODO: currently we don't set the antenna but letting the NIC
|
|
+ * to decide which antenna to use. This should come from BIOS.
|
|
+ */
|
|
+ phy_cfg_cmd.phy_cfg =
|
|
+ cpu_to_le32(FW_PHY_CFG_CHAIN_SAD_ENABLED);
|
|
+ }
|
|
+
|
|
/* Set parameters */
|
|
phy_cfg_cmd.phy_cfg = cpu_to_le32(iwl_mvm_get_phy_config(mvm));
|
|
|
|
@@ -1344,12 +1356,12 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
|
ret = iwl_send_phy_db_data(mvm->phy_db);
|
|
if (ret)
|
|
goto error;
|
|
-
|
|
- ret = iwl_send_phy_cfg_cmd(mvm);
|
|
- if (ret)
|
|
- goto error;
|
|
}
|
|
|
|
+ ret = iwl_send_phy_cfg_cmd(mvm);
|
|
+ if (ret)
|
|
+ goto error;
|
|
+
|
|
ret = iwl_mvm_send_bt_init_conf(mvm);
|
|
if (ret)
|
|
goto error;
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
|
|
index 8f50e2b121bd..098d48153a38 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
|
|
@@ -350,7 +350,13 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm,
|
|
u16 size = le32_to_cpu(notif->amsdu_size);
|
|
int i;
|
|
|
|
- if (WARN_ON(sta->max_amsdu_len < size))
|
|
+ /*
|
|
+ * In debug sta->max_amsdu_len < size
|
|
+ * so also check with orig_amsdu_len which holds the original
|
|
+ * data before debugfs changed the value
|
|
+ */
|
|
+ if (WARN_ON(sta->max_amsdu_len < size &&
|
|
+ mvmsta->orig_amsdu_len < size))
|
|
goto out;
|
|
|
|
mvmsta->amsdu_enabled = le32_to_cpu(notif->amsdu_enabled);
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
index 8a059da7a1fa..e3b2a2bf3863 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
@@ -935,7 +935,12 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
!(mvmsta->amsdu_enabled & BIT(tid)))
|
|
return iwl_mvm_tx_tso_segment(skb, 1, netdev_flags, mpdus_skb);
|
|
|
|
- max_amsdu_len = iwl_mvm_max_amsdu_size(mvm, sta, tid);
|
|
+ /*
|
|
+ * Take the min of ieee80211 station and mvm station
|
|
+ */
|
|
+ max_amsdu_len =
|
|
+ min_t(unsigned int, sta->max_amsdu_len,
|
|
+ iwl_mvm_max_amsdu_size(mvm, sta, tid));
|
|
|
|
/*
|
|
* Limit A-MSDU in A-MPDU to 4095 bytes when VHT is not
|
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/regd.c b/drivers/net/wireless/realtek/rtlwifi/regd.c
|
|
index c10432cd703e..8be31e0ad878 100644
|
|
--- a/drivers/net/wireless/realtek/rtlwifi/regd.c
|
|
+++ b/drivers/net/wireless/realtek/rtlwifi/regd.c
|
|
@@ -386,7 +386,7 @@ int rtl_regd_init(struct ieee80211_hw *hw,
|
|
struct wiphy *wiphy = hw->wiphy;
|
|
struct country_code_to_enum_rd *country = NULL;
|
|
|
|
- if (wiphy == NULL || &rtlpriv->regd == NULL)
|
|
+ if (!wiphy)
|
|
return -EINVAL;
|
|
|
|
/* init country_code from efuse channel plan */
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
index 760eaffeebd6..23a1d00b5f38 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
|
|
@@ -793,7 +793,7 @@ static int rsi_probe(struct usb_interface *pfunction,
|
|
adapter->device_model = RSI_DEV_9116;
|
|
} else {
|
|
rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n",
|
|
- __func__, id->idProduct);
|
|
+ __func__, id ? id->idProduct : 0x0);
|
|
goto err1;
|
|
}
|
|
|
|
diff --git a/drivers/pci/controller/dwc/pci-meson.c b/drivers/pci/controller/dwc/pci-meson.c
|
|
index e35e9eaa50ee..b927a92e3463 100644
|
|
--- a/drivers/pci/controller/dwc/pci-meson.c
|
|
+++ b/drivers/pci/controller/dwc/pci-meson.c
|
|
@@ -250,15 +250,15 @@ static int meson_pcie_probe_clocks(struct meson_pcie *mp)
|
|
if (IS_ERR(res->port_clk))
|
|
return PTR_ERR(res->port_clk);
|
|
|
|
- res->mipi_gate = meson_pcie_probe_clock(dev, "pcie_mipi_en", 0);
|
|
+ res->mipi_gate = meson_pcie_probe_clock(dev, "mipi", 0);
|
|
if (IS_ERR(res->mipi_gate))
|
|
return PTR_ERR(res->mipi_gate);
|
|
|
|
- res->general_clk = meson_pcie_probe_clock(dev, "pcie_general", 0);
|
|
+ res->general_clk = meson_pcie_probe_clock(dev, "general", 0);
|
|
if (IS_ERR(res->general_clk))
|
|
return PTR_ERR(res->general_clk);
|
|
|
|
- res->clk = meson_pcie_probe_clock(dev, "pcie", 0);
|
|
+ res->clk = meson_pcie_probe_clock(dev, "pclk", 0);
|
|
if (IS_ERR(res->clk))
|
|
return PTR_ERR(res->clk);
|
|
|
|
diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
|
|
index 0f36a926059a..8615f1548882 100644
|
|
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
|
|
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
|
|
@@ -78,7 +78,8 @@ static struct msi_domain_info dw_pcie_msi_domain_info = {
|
|
irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
|
|
{
|
|
int i, pos, irq;
|
|
- u32 val, num_ctrls;
|
|
+ unsigned long val;
|
|
+ u32 status, num_ctrls;
|
|
irqreturn_t ret = IRQ_NONE;
|
|
|
|
num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
|
|
@@ -86,14 +87,14 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
|
|
for (i = 0; i < num_ctrls; i++) {
|
|
dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_STATUS +
|
|
(i * MSI_REG_CTRL_BLOCK_SIZE),
|
|
- 4, &val);
|
|
- if (!val)
|
|
+ 4, &status);
|
|
+ if (!status)
|
|
continue;
|
|
|
|
ret = IRQ_HANDLED;
|
|
+ val = status;
|
|
pos = 0;
|
|
- while ((pos = find_next_bit((unsigned long *) &val,
|
|
- MAX_MSI_IRQS_PER_CTRL,
|
|
+ while ((pos = find_next_bit(&val, MAX_MSI_IRQS_PER_CTRL,
|
|
pos)) != MAX_MSI_IRQS_PER_CTRL) {
|
|
irq = irq_find_mapping(pp->irq_domain,
|
|
(i * MAX_MSI_IRQS_PER_CTRL) +
|
|
diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
|
|
index fc0fe4d4de49..97245e076548 100644
|
|
--- a/drivers/pci/controller/pci-aardvark.c
|
|
+++ b/drivers/pci/controller/pci-aardvark.c
|
|
@@ -180,6 +180,8 @@
|
|
#define LINK_WAIT_MAX_RETRIES 10
|
|
#define LINK_WAIT_USLEEP_MIN 90000
|
|
#define LINK_WAIT_USLEEP_MAX 100000
|
|
+#define RETRAIN_WAIT_MAX_RETRIES 10
|
|
+#define RETRAIN_WAIT_USLEEP_US 2000
|
|
|
|
#define MSI_IRQ_NUM 32
|
|
|
|
@@ -239,6 +241,17 @@ static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
|
|
return -ETIMEDOUT;
|
|
}
|
|
|
|
+static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie)
|
|
+{
|
|
+ size_t retries;
|
|
+
|
|
+ for (retries = 0; retries < RETRAIN_WAIT_MAX_RETRIES; ++retries) {
|
|
+ if (!advk_pcie_link_up(pcie))
|
|
+ break;
|
|
+ udelay(RETRAIN_WAIT_USLEEP_US);
|
|
+ }
|
|
+}
|
|
+
|
|
static void advk_pcie_setup_hw(struct advk_pcie *pcie)
|
|
{
|
|
u32 reg;
|
|
@@ -415,7 +428,7 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge,
|
|
|
|
case PCI_EXP_RTCTL: {
|
|
u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG);
|
|
- *value = (val & PCIE_MSG_PM_PME_MASK) ? PCI_EXP_RTCTL_PMEIE : 0;
|
|
+ *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE;
|
|
return PCI_BRIDGE_EMUL_HANDLED;
|
|
}
|
|
|
|
@@ -426,11 +439,20 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge,
|
|
return PCI_BRIDGE_EMUL_HANDLED;
|
|
}
|
|
|
|
+ case PCI_EXP_LNKCTL: {
|
|
+ /* u32 contains both PCI_EXP_LNKCTL and PCI_EXP_LNKSTA */
|
|
+ u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg) &
|
|
+ ~(PCI_EXP_LNKSTA_LT << 16);
|
|
+ if (!advk_pcie_link_up(pcie))
|
|
+ val |= (PCI_EXP_LNKSTA_LT << 16);
|
|
+ *value = val;
|
|
+ return PCI_BRIDGE_EMUL_HANDLED;
|
|
+ }
|
|
+
|
|
case PCI_CAP_LIST_ID:
|
|
case PCI_EXP_DEVCAP:
|
|
case PCI_EXP_DEVCTL:
|
|
case PCI_EXP_LNKCAP:
|
|
- case PCI_EXP_LNKCTL:
|
|
*value = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg);
|
|
return PCI_BRIDGE_EMUL_HANDLED;
|
|
default:
|
|
@@ -447,14 +469,24 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge,
|
|
|
|
switch (reg) {
|
|
case PCI_EXP_DEVCTL:
|
|
+ advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg);
|
|
+ break;
|
|
+
|
|
case PCI_EXP_LNKCTL:
|
|
advk_writel(pcie, new, PCIE_CORE_PCIEXP_CAP + reg);
|
|
+ if (new & PCI_EXP_LNKCTL_RL)
|
|
+ advk_pcie_wait_for_retrain(pcie);
|
|
break;
|
|
|
|
- case PCI_EXP_RTCTL:
|
|
- new = (new & PCI_EXP_RTCTL_PMEIE) << 3;
|
|
- advk_writel(pcie, new, PCIE_ISR0_MASK_REG);
|
|
+ case PCI_EXP_RTCTL: {
|
|
+ /* Only mask/unmask PME interrupt */
|
|
+ u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG) &
|
|
+ ~PCIE_MSG_PM_PME_MASK;
|
|
+ if ((new & PCI_EXP_RTCTL_PMEIE) == 0)
|
|
+ val |= PCIE_MSG_PM_PME_MASK;
|
|
+ advk_writel(pcie, val, PCIE_ISR0_MASK_REG);
|
|
break;
|
|
+ }
|
|
|
|
case PCI_EXP_RTSTA:
|
|
new = (new & PCI_EXP_RTSTA_PME) >> 9;
|
|
diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
|
|
index b3122c151b80..56daad828c9e 100644
|
|
--- a/drivers/pci/hotplug/pciehp_core.c
|
|
+++ b/drivers/pci/hotplug/pciehp_core.c
|
|
@@ -253,7 +253,7 @@ static bool pme_is_native(struct pcie_device *dev)
|
|
return pcie_ports_native || host->native_pme;
|
|
}
|
|
|
|
-static int pciehp_suspend(struct pcie_device *dev)
|
|
+static void pciehp_disable_interrupt(struct pcie_device *dev)
|
|
{
|
|
/*
|
|
* Disable hotplug interrupt so that it does not trigger
|
|
@@ -261,7 +261,19 @@ static int pciehp_suspend(struct pcie_device *dev)
|
|
*/
|
|
if (pme_is_native(dev))
|
|
pcie_disable_interrupt(get_service_data(dev));
|
|
+}
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+static int pciehp_suspend(struct pcie_device *dev)
|
|
+{
|
|
+ /*
|
|
+ * If the port is already runtime suspended we can keep it that
|
|
+ * way.
|
|
+ */
|
|
+ if (dev_pm_smart_suspend_and_suspended(&dev->port->dev))
|
|
+ return 0;
|
|
+
|
|
+ pciehp_disable_interrupt(dev);
|
|
return 0;
|
|
}
|
|
|
|
@@ -279,6 +291,7 @@ static int pciehp_resume_noirq(struct pcie_device *dev)
|
|
|
|
return 0;
|
|
}
|
|
+#endif
|
|
|
|
static int pciehp_resume(struct pcie_device *dev)
|
|
{
|
|
@@ -292,6 +305,12 @@ static int pciehp_resume(struct pcie_device *dev)
|
|
return 0;
|
|
}
|
|
|
|
+static int pciehp_runtime_suspend(struct pcie_device *dev)
|
|
+{
|
|
+ pciehp_disable_interrupt(dev);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int pciehp_runtime_resume(struct pcie_device *dev)
|
|
{
|
|
struct controller *ctrl = get_service_data(dev);
|
|
@@ -318,10 +337,12 @@ static struct pcie_port_service_driver hpdriver_portdrv = {
|
|
.remove = pciehp_remove,
|
|
|
|
#ifdef CONFIG_PM
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
.suspend = pciehp_suspend,
|
|
.resume_noirq = pciehp_resume_noirq,
|
|
.resume = pciehp_resume,
|
|
- .runtime_suspend = pciehp_suspend,
|
|
+#endif
|
|
+ .runtime_suspend = pciehp_runtime_suspend,
|
|
.runtime_resume = pciehp_runtime_resume,
|
|
#endif /* PM */
|
|
};
|
|
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
|
|
index d4ac8ce8c1f9..0c3086793e4e 100644
|
|
--- a/drivers/pci/pci-driver.c
|
|
+++ b/drivers/pci/pci-driver.c
|
|
@@ -941,12 +941,11 @@ static int pci_pm_resume_noirq(struct device *dev)
|
|
pci_pm_default_resume_early(pci_dev);
|
|
|
|
pci_fixup_device(pci_fixup_resume_early, pci_dev);
|
|
+ pcie_pme_root_status_cleanup(pci_dev);
|
|
|
|
if (pci_has_legacy_pm_support(pci_dev))
|
|
return pci_legacy_resume_early(dev);
|
|
|
|
- pcie_pme_root_status_cleanup(pci_dev);
|
|
-
|
|
if (drv && drv->pm && drv->pm->resume_noirq)
|
|
error = drv->pm->resume_noirq(dev);
|
|
|
|
diff --git a/drivers/pci/pcie/ptm.c b/drivers/pci/pcie/ptm.c
|
|
index 98cfa30f3fae..9361f3aa26ab 100644
|
|
--- a/drivers/pci/pcie/ptm.c
|
|
+++ b/drivers/pci/pcie/ptm.c
|
|
@@ -21,7 +21,7 @@ static void pci_ptm_info(struct pci_dev *dev)
|
|
snprintf(clock_desc, sizeof(clock_desc), ">254ns");
|
|
break;
|
|
default:
|
|
- snprintf(clock_desc, sizeof(clock_desc), "%udns",
|
|
+ snprintf(clock_desc, sizeof(clock_desc), "%uns",
|
|
dev->ptm_granularity);
|
|
break;
|
|
}
|
|
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
|
|
index 64ebe3e5e611..d3033873395d 100644
|
|
--- a/drivers/pci/probe.c
|
|
+++ b/drivers/pci/probe.c
|
|
@@ -572,6 +572,7 @@ static void devm_pci_release_host_bridge_dev(struct device *dev)
|
|
bridge->release_fn(bridge);
|
|
|
|
pci_free_resource_list(&bridge->windows);
|
|
+ pci_free_resource_list(&bridge->dma_ranges);
|
|
}
|
|
|
|
static void pci_release_host_bridge_dev(struct device *dev)
|
|
diff --git a/drivers/phy/motorola/phy-mapphone-mdm6600.c b/drivers/phy/motorola/phy-mapphone-mdm6600.c
|
|
index ee184d5607bd..f20524f0c21d 100644
|
|
--- a/drivers/phy/motorola/phy-mapphone-mdm6600.c
|
|
+++ b/drivers/phy/motorola/phy-mapphone-mdm6600.c
|
|
@@ -200,7 +200,7 @@ static void phy_mdm6600_status(struct work_struct *work)
|
|
struct phy_mdm6600 *ddata;
|
|
struct device *dev;
|
|
DECLARE_BITMAP(values, PHY_MDM6600_NR_STATUS_LINES);
|
|
- int error, i, val = 0;
|
|
+ int error;
|
|
|
|
ddata = container_of(work, struct phy_mdm6600, status_work.work);
|
|
dev = ddata->dev;
|
|
@@ -212,16 +212,11 @@ static void phy_mdm6600_status(struct work_struct *work)
|
|
if (error)
|
|
return;
|
|
|
|
- for (i = 0; i < PHY_MDM6600_NR_STATUS_LINES; i++) {
|
|
- val |= test_bit(i, values) << i;
|
|
- dev_dbg(ddata->dev, "XXX %s: i: %i values[i]: %i val: %i\n",
|
|
- __func__, i, test_bit(i, values), val);
|
|
- }
|
|
- ddata->status = values[0];
|
|
+ ddata->status = values[0] & ((1 << PHY_MDM6600_NR_STATUS_LINES) - 1);
|
|
|
|
dev_info(dev, "modem status: %i %s\n",
|
|
ddata->status,
|
|
- phy_mdm6600_status_name[ddata->status & 7]);
|
|
+ phy_mdm6600_status_name[ddata->status]);
|
|
complete(&ddata->ack);
|
|
}
|
|
|
|
diff --git a/drivers/pinctrl/cirrus/Kconfig b/drivers/pinctrl/cirrus/Kconfig
|
|
index f1806fd781a0..530426a74f75 100644
|
|
--- a/drivers/pinctrl/cirrus/Kconfig
|
|
+++ b/drivers/pinctrl/cirrus/Kconfig
|
|
@@ -2,6 +2,7 @@
|
|
config PINCTRL_LOCHNAGAR
|
|
tristate "Cirrus Logic Lochnagar pinctrl driver"
|
|
depends on MFD_LOCHNAGAR
|
|
+ select GPIOLIB
|
|
select PINMUX
|
|
select PINCONF
|
|
select GENERIC_PINCONF
|
|
diff --git a/drivers/pinctrl/intel/pinctrl-lewisburg.c b/drivers/pinctrl/intel/pinctrl-lewisburg.c
|
|
index 2e06fb1464ab..7fdf4257df1e 100644
|
|
--- a/drivers/pinctrl/intel/pinctrl-lewisburg.c
|
|
+++ b/drivers/pinctrl/intel/pinctrl-lewisburg.c
|
|
@@ -33,6 +33,7 @@
|
|
.npins = ((e) - (s) + 1), \
|
|
}
|
|
|
|
+/* Lewisburg */
|
|
static const struct pinctrl_pin_desc lbg_pins[] = {
|
|
/* GPP_A */
|
|
PINCTRL_PIN(0, "RCINB"),
|
|
@@ -72,7 +73,7 @@ static const struct pinctrl_pin_desc lbg_pins[] = {
|
|
PINCTRL_PIN(33, "SRCCLKREQB_4"),
|
|
PINCTRL_PIN(34, "SRCCLKREQB_5"),
|
|
PINCTRL_PIN(35, "GPP_B_11"),
|
|
- PINCTRL_PIN(36, "GLB_RST_WARN_N"),
|
|
+ PINCTRL_PIN(36, "SLP_S0B"),
|
|
PINCTRL_PIN(37, "PLTRSTB"),
|
|
PINCTRL_PIN(38, "SPKR"),
|
|
PINCTRL_PIN(39, "GPP_B_15"),
|
|
@@ -185,96 +186,96 @@ static const struct pinctrl_pin_desc lbg_pins[] = {
|
|
PINCTRL_PIN(141, "GBE_PCI_DIS"),
|
|
PINCTRL_PIN(142, "GBE_LAN_DIS"),
|
|
PINCTRL_PIN(143, "GPP_I_10"),
|
|
- PINCTRL_PIN(144, "GPIO_RCOMP_3P3"),
|
|
/* GPP_J */
|
|
- PINCTRL_PIN(145, "GBE_LED_0_0"),
|
|
- PINCTRL_PIN(146, "GBE_LED_0_1"),
|
|
- PINCTRL_PIN(147, "GBE_LED_1_0"),
|
|
- PINCTRL_PIN(148, "GBE_LED_1_1"),
|
|
- PINCTRL_PIN(149, "GBE_LED_2_0"),
|
|
- PINCTRL_PIN(150, "GBE_LED_2_1"),
|
|
- PINCTRL_PIN(151, "GBE_LED_3_0"),
|
|
- PINCTRL_PIN(152, "GBE_LED_3_1"),
|
|
- PINCTRL_PIN(153, "GBE_SCL_0"),
|
|
- PINCTRL_PIN(154, "GBE_SDA_0"),
|
|
- PINCTRL_PIN(155, "GBE_SCL_1"),
|
|
- PINCTRL_PIN(156, "GBE_SDA_1"),
|
|
- PINCTRL_PIN(157, "GBE_SCL_2"),
|
|
- PINCTRL_PIN(158, "GBE_SDA_2"),
|
|
- PINCTRL_PIN(159, "GBE_SCL_3"),
|
|
- PINCTRL_PIN(160, "GBE_SDA_3"),
|
|
- PINCTRL_PIN(161, "GBE_SDP_0_0"),
|
|
- PINCTRL_PIN(162, "GBE_SDP_0_1"),
|
|
- PINCTRL_PIN(163, "GBE_SDP_1_0"),
|
|
- PINCTRL_PIN(164, "GBE_SDP_1_1"),
|
|
- PINCTRL_PIN(165, "GBE_SDP_2_0"),
|
|
- PINCTRL_PIN(166, "GBE_SDP_2_1"),
|
|
- PINCTRL_PIN(167, "GBE_SDP_3_0"),
|
|
- PINCTRL_PIN(168, "GBE_SDP_3_1"),
|
|
+ PINCTRL_PIN(144, "GBE_LED_0_0"),
|
|
+ PINCTRL_PIN(145, "GBE_LED_0_1"),
|
|
+ PINCTRL_PIN(146, "GBE_LED_1_0"),
|
|
+ PINCTRL_PIN(147, "GBE_LED_1_1"),
|
|
+ PINCTRL_PIN(148, "GBE_LED_2_0"),
|
|
+ PINCTRL_PIN(149, "GBE_LED_2_1"),
|
|
+ PINCTRL_PIN(150, "GBE_LED_3_0"),
|
|
+ PINCTRL_PIN(151, "GBE_LED_3_1"),
|
|
+ PINCTRL_PIN(152, "GBE_SCL_0"),
|
|
+ PINCTRL_PIN(153, "GBE_SDA_0"),
|
|
+ PINCTRL_PIN(154, "GBE_SCL_1"),
|
|
+ PINCTRL_PIN(155, "GBE_SDA_1"),
|
|
+ PINCTRL_PIN(156, "GBE_SCL_2"),
|
|
+ PINCTRL_PIN(157, "GBE_SDA_2"),
|
|
+ PINCTRL_PIN(158, "GBE_SCL_3"),
|
|
+ PINCTRL_PIN(159, "GBE_SDA_3"),
|
|
+ PINCTRL_PIN(160, "GBE_SDP_0_0"),
|
|
+ PINCTRL_PIN(161, "GBE_SDP_0_1"),
|
|
+ PINCTRL_PIN(162, "GBE_SDP_1_0"),
|
|
+ PINCTRL_PIN(163, "GBE_SDP_1_1"),
|
|
+ PINCTRL_PIN(164, "GBE_SDP_2_0"),
|
|
+ PINCTRL_PIN(165, "GBE_SDP_2_1"),
|
|
+ PINCTRL_PIN(166, "GBE_SDP_3_0"),
|
|
+ PINCTRL_PIN(167, "GBE_SDP_3_1"),
|
|
/* GPP_K */
|
|
- PINCTRL_PIN(169, "GBE_RMIICLK"),
|
|
- PINCTRL_PIN(170, "GBE_RMII_TXD_0"),
|
|
- PINCTRL_PIN(171, "GBE_RMII_TXD_1"),
|
|
+ PINCTRL_PIN(168, "GBE_RMIICLK"),
|
|
+ PINCTRL_PIN(169, "GBE_RMII_RXD_0"),
|
|
+ PINCTRL_PIN(170, "GBE_RMII_RXD_1"),
|
|
+ PINCTRL_PIN(171, "GBE_RMII_CRS_DV"),
|
|
PINCTRL_PIN(172, "GBE_RMII_TX_EN"),
|
|
- PINCTRL_PIN(173, "GBE_RMII_CRS_DV"),
|
|
- PINCTRL_PIN(174, "GBE_RMII_RXD_0"),
|
|
- PINCTRL_PIN(175, "GBE_RMII_RXD_1"),
|
|
- PINCTRL_PIN(176, "GBE_RMII_RX_ER"),
|
|
- PINCTRL_PIN(177, "GBE_RMII_ARBIN"),
|
|
- PINCTRL_PIN(178, "GBE_RMII_ARB_OUT"),
|
|
- PINCTRL_PIN(179, "PE_RST_N"),
|
|
- PINCTRL_PIN(180, "GPIO_RCOMP_1P8_3P3"),
|
|
+ PINCTRL_PIN(173, "GBE_RMII_TXD_0"),
|
|
+ PINCTRL_PIN(174, "GBE_RMII_TXD_1"),
|
|
+ PINCTRL_PIN(175, "GBE_RMII_RX_ER"),
|
|
+ PINCTRL_PIN(176, "GBE_RMII_ARBIN"),
|
|
+ PINCTRL_PIN(177, "GBE_RMII_ARB_OUT"),
|
|
+ PINCTRL_PIN(178, "PE_RST_N"),
|
|
/* GPP_G */
|
|
- PINCTRL_PIN(181, "FAN_TACH_0"),
|
|
- PINCTRL_PIN(182, "FAN_TACH_1"),
|
|
- PINCTRL_PIN(183, "FAN_TACH_2"),
|
|
- PINCTRL_PIN(184, "FAN_TACH_3"),
|
|
- PINCTRL_PIN(185, "FAN_TACH_4"),
|
|
- PINCTRL_PIN(186, "FAN_TACH_5"),
|
|
- PINCTRL_PIN(187, "FAN_TACH_6"),
|
|
- PINCTRL_PIN(188, "FAN_TACH_7"),
|
|
- PINCTRL_PIN(189, "FAN_PWM_0"),
|
|
- PINCTRL_PIN(190, "FAN_PWM_1"),
|
|
- PINCTRL_PIN(191, "FAN_PWM_2"),
|
|
- PINCTRL_PIN(192, "FAN_PWM_3"),
|
|
- PINCTRL_PIN(193, "GSXDOUT"),
|
|
- PINCTRL_PIN(194, "GSXSLOAD"),
|
|
- PINCTRL_PIN(195, "GSXDIN"),
|
|
- PINCTRL_PIN(196, "GSXSRESETB"),
|
|
- PINCTRL_PIN(197, "GSXCLK"),
|
|
- PINCTRL_PIN(198, "ADR_COMPLETE"),
|
|
- PINCTRL_PIN(199, "NMIB"),
|
|
- PINCTRL_PIN(200, "SMIB"),
|
|
- PINCTRL_PIN(201, "SSATA_DEVSLP_0"),
|
|
- PINCTRL_PIN(202, "SSATA_DEVSLP_1"),
|
|
- PINCTRL_PIN(203, "SSATA_DEVSLP_2"),
|
|
- PINCTRL_PIN(204, "SSATAXPCIE0_SSATAGP0"),
|
|
+ PINCTRL_PIN(179, "FAN_TACH_0"),
|
|
+ PINCTRL_PIN(180, "FAN_TACH_1"),
|
|
+ PINCTRL_PIN(181, "FAN_TACH_2"),
|
|
+ PINCTRL_PIN(182, "FAN_TACH_3"),
|
|
+ PINCTRL_PIN(183, "FAN_TACH_4"),
|
|
+ PINCTRL_PIN(184, "FAN_TACH_5"),
|
|
+ PINCTRL_PIN(185, "FAN_TACH_6"),
|
|
+ PINCTRL_PIN(186, "FAN_TACH_7"),
|
|
+ PINCTRL_PIN(187, "FAN_PWM_0"),
|
|
+ PINCTRL_PIN(188, "FAN_PWM_1"),
|
|
+ PINCTRL_PIN(189, "FAN_PWM_2"),
|
|
+ PINCTRL_PIN(190, "FAN_PWM_3"),
|
|
+ PINCTRL_PIN(191, "GSXDOUT"),
|
|
+ PINCTRL_PIN(192, "GSXSLOAD"),
|
|
+ PINCTRL_PIN(193, "GSXDIN"),
|
|
+ PINCTRL_PIN(194, "GSXSRESETB"),
|
|
+ PINCTRL_PIN(195, "GSXCLK"),
|
|
+ PINCTRL_PIN(196, "ADR_COMPLETE"),
|
|
+ PINCTRL_PIN(197, "NMIB"),
|
|
+ PINCTRL_PIN(198, "SMIB"),
|
|
+ PINCTRL_PIN(199, "SSATA_DEVSLP_0"),
|
|
+ PINCTRL_PIN(200, "SSATA_DEVSLP_1"),
|
|
+ PINCTRL_PIN(201, "SSATA_DEVSLP_2"),
|
|
+ PINCTRL_PIN(202, "SSATAXPCIE0_SSATAGP0"),
|
|
/* GPP_H */
|
|
- PINCTRL_PIN(205, "SRCCLKREQB_6"),
|
|
- PINCTRL_PIN(206, "SRCCLKREQB_7"),
|
|
- PINCTRL_PIN(207, "SRCCLKREQB_8"),
|
|
- PINCTRL_PIN(208, "SRCCLKREQB_9"),
|
|
- PINCTRL_PIN(209, "SRCCLKREQB_10"),
|
|
- PINCTRL_PIN(210, "SRCCLKREQB_11"),
|
|
- PINCTRL_PIN(211, "SRCCLKREQB_12"),
|
|
- PINCTRL_PIN(212, "SRCCLKREQB_13"),
|
|
- PINCTRL_PIN(213, "SRCCLKREQB_14"),
|
|
- PINCTRL_PIN(214, "SRCCLKREQB_15"),
|
|
- PINCTRL_PIN(215, "SML2CLK"),
|
|
- PINCTRL_PIN(216, "SML2DATA"),
|
|
- PINCTRL_PIN(217, "SML2ALERTB"),
|
|
- PINCTRL_PIN(218, "SML3CLK"),
|
|
- PINCTRL_PIN(219, "SML3DATA"),
|
|
- PINCTRL_PIN(220, "SML3ALERTB"),
|
|
- PINCTRL_PIN(221, "SML4CLK"),
|
|
- PINCTRL_PIN(222, "SML4DATA"),
|
|
- PINCTRL_PIN(223, "SML4ALERTB"),
|
|
- PINCTRL_PIN(224, "SSATAXPCIE1_SSATAGP1"),
|
|
- PINCTRL_PIN(225, "SSATAXPCIE2_SSATAGP2"),
|
|
- PINCTRL_PIN(226, "SSATAXPCIE3_SSATAGP3"),
|
|
- PINCTRL_PIN(227, "SSATAXPCIE4_SSATAGP4"),
|
|
- PINCTRL_PIN(228, "SSATAXPCIE5_SSATAGP5"),
|
|
+ PINCTRL_PIN(203, "SRCCLKREQB_6"),
|
|
+ PINCTRL_PIN(204, "SRCCLKREQB_7"),
|
|
+ PINCTRL_PIN(205, "SRCCLKREQB_8"),
|
|
+ PINCTRL_PIN(206, "SRCCLKREQB_9"),
|
|
+ PINCTRL_PIN(207, "SRCCLKREQB_10"),
|
|
+ PINCTRL_PIN(208, "SRCCLKREQB_11"),
|
|
+ PINCTRL_PIN(209, "SRCCLKREQB_12"),
|
|
+ PINCTRL_PIN(210, "SRCCLKREQB_13"),
|
|
+ PINCTRL_PIN(211, "SRCCLKREQB_14"),
|
|
+ PINCTRL_PIN(212, "SRCCLKREQB_15"),
|
|
+ PINCTRL_PIN(213, "SML2CLK"),
|
|
+ PINCTRL_PIN(214, "SML2DATA"),
|
|
+ PINCTRL_PIN(215, "SML2ALERTB"),
|
|
+ PINCTRL_PIN(216, "SML3CLK"),
|
|
+ PINCTRL_PIN(217, "SML3DATA"),
|
|
+ PINCTRL_PIN(218, "SML3ALERTB"),
|
|
+ PINCTRL_PIN(219, "SML4CLK"),
|
|
+ PINCTRL_PIN(220, "SML4DATA"),
|
|
+ PINCTRL_PIN(221, "SML4ALERTB"),
|
|
+ PINCTRL_PIN(222, "SSATAXPCIE1_SSATAGP1"),
|
|
+ PINCTRL_PIN(223, "SSATAXPCIE2_SSATAGP2"),
|
|
+ PINCTRL_PIN(224, "SSATAXPCIE3_SSATAGP3"),
|
|
+ PINCTRL_PIN(225, "SSATAXPCIE4_SSATAGP4"),
|
|
+ PINCTRL_PIN(226, "SSATAXPCIE5_SSATAGP5"),
|
|
/* GPP_L */
|
|
+ PINCTRL_PIN(227, "GPP_L_0"),
|
|
+ PINCTRL_PIN(228, "EC_CSME_INTR_OUT"),
|
|
PINCTRL_PIN(229, "VISA2CH0_D0"),
|
|
PINCTRL_PIN(230, "VISA2CH0_D1"),
|
|
PINCTRL_PIN(231, "VISA2CH0_D2"),
|
|
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
|
|
index 8bba9d053d9f..aba479a1150c 100644
|
|
--- a/drivers/pinctrl/meson/pinctrl-meson.c
|
|
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
|
|
@@ -441,6 +441,7 @@ static int meson_pinconf_get_drive_strength(struct meson_pinctrl *pc,
|
|
return ret;
|
|
|
|
meson_calc_reg_and_bit(bank, pin, REG_DS, ®, &bit);
|
|
+ bit = bit << 1;
|
|
|
|
ret = regmap_read(pc->reg_ds, reg, &val);
|
|
if (ret)
|
|
diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c
|
|
index b8640ad41bef..ce983247c9e2 100644
|
|
--- a/drivers/pinctrl/sh-pfc/core.c
|
|
+++ b/drivers/pinctrl/sh-pfc/core.c
|
|
@@ -29,12 +29,12 @@
|
|
static int sh_pfc_map_resources(struct sh_pfc *pfc,
|
|
struct platform_device *pdev)
|
|
{
|
|
- unsigned int num_windows, num_irqs;
|
|
struct sh_pfc_window *windows;
|
|
unsigned int *irqs = NULL;
|
|
+ unsigned int num_windows;
|
|
struct resource *res;
|
|
unsigned int i;
|
|
- int irq;
|
|
+ int num_irqs;
|
|
|
|
/* Count the MEM and IRQ resources. */
|
|
for (num_windows = 0;; num_windows++) {
|
|
@@ -42,17 +42,13 @@ static int sh_pfc_map_resources(struct sh_pfc *pfc,
|
|
if (!res)
|
|
break;
|
|
}
|
|
- for (num_irqs = 0;; num_irqs++) {
|
|
- irq = platform_get_irq(pdev, num_irqs);
|
|
- if (irq == -EPROBE_DEFER)
|
|
- return irq;
|
|
- if (irq < 0)
|
|
- break;
|
|
- }
|
|
-
|
|
if (num_windows == 0)
|
|
return -EINVAL;
|
|
|
|
+ num_irqs = platform_irq_count(pdev);
|
|
+ if (num_irqs < 0)
|
|
+ return num_irqs;
|
|
+
|
|
/* Allocate memory windows and IRQs arrays. */
|
|
windows = devm_kcalloc(pfc->dev, num_windows, sizeof(*windows),
|
|
GFP_KERNEL);
|
|
diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h
|
|
index 835148fc0f28..cab7da130925 100644
|
|
--- a/drivers/pinctrl/sh-pfc/sh_pfc.h
|
|
+++ b/drivers/pinctrl/sh-pfc/sh_pfc.h
|
|
@@ -422,12 +422,12 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info;
|
|
/*
|
|
* Describe a pinmux configuration in which a pin is physically multiplexed
|
|
* with other pins.
|
|
- * - ipsr: IPSR field (unused, for documentation purposes only)
|
|
+ * - ipsr: IPSR field
|
|
* - fn: Function name
|
|
* - psel: Physical multiplexing selector
|
|
*/
|
|
#define PINMUX_IPSR_PHYS(ipsr, fn, psel) \
|
|
- PINMUX_DATA(fn##_MARK, FN_##psel)
|
|
+ PINMUX_DATA(fn##_MARK, FN_##psel, FN_##ipsr)
|
|
|
|
/*
|
|
* Describe a pinmux configuration for a single-function pin with GPIO
|
|
diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
|
|
index e5e7f1f22813..b522ca010332 100644
|
|
--- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
|
|
+++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
|
|
@@ -496,7 +496,7 @@ static int ti_iodelay_dt_node_to_map(struct pinctrl_dev *pctldev,
|
|
return -EINVAL;
|
|
|
|
rows = pinctrl_count_index_with_args(np, name);
|
|
- if (rows == -EINVAL)
|
|
+ if (rows < 0)
|
|
return rows;
|
|
|
|
*map = devm_kzalloc(iod->dev, sizeof(**map), GFP_KERNEL);
|
|
diff --git a/drivers/platform/mellanox/mlxbf-tmfifo.c b/drivers/platform/mellanox/mlxbf-tmfifo.c
|
|
index 9a5c9fd2dbc6..5739a9669b29 100644
|
|
--- a/drivers/platform/mellanox/mlxbf-tmfifo.c
|
|
+++ b/drivers/platform/mellanox/mlxbf-tmfifo.c
|
|
@@ -149,7 +149,7 @@ struct mlxbf_tmfifo_irq_info {
|
|
* @work: work struct for deferred process
|
|
* @timer: background timer
|
|
* @vring: Tx/Rx ring
|
|
- * @spin_lock: spin lock
|
|
+ * @spin_lock: Tx/Rx spin lock
|
|
* @is_ready: ready flag
|
|
*/
|
|
struct mlxbf_tmfifo {
|
|
@@ -164,7 +164,7 @@ struct mlxbf_tmfifo {
|
|
struct work_struct work;
|
|
struct timer_list timer;
|
|
struct mlxbf_tmfifo_vring *vring[2];
|
|
- spinlock_t spin_lock; /* spin lock */
|
|
+ spinlock_t spin_lock[2]; /* spin lock */
|
|
bool is_ready;
|
|
};
|
|
|
|
@@ -525,7 +525,7 @@ static void mlxbf_tmfifo_console_tx(struct mlxbf_tmfifo *fifo, int avail)
|
|
writeq(*(u64 *)&hdr, fifo->tx_base + MLXBF_TMFIFO_TX_DATA);
|
|
|
|
/* Use spin-lock to protect the 'cons->tx_buf'. */
|
|
- spin_lock_irqsave(&fifo->spin_lock, flags);
|
|
+ spin_lock_irqsave(&fifo->spin_lock[0], flags);
|
|
|
|
while (size > 0) {
|
|
addr = cons->tx_buf.buf + cons->tx_buf.tail;
|
|
@@ -552,7 +552,7 @@ static void mlxbf_tmfifo_console_tx(struct mlxbf_tmfifo *fifo, int avail)
|
|
}
|
|
}
|
|
|
|
- spin_unlock_irqrestore(&fifo->spin_lock, flags);
|
|
+ spin_unlock_irqrestore(&fifo->spin_lock[0], flags);
|
|
}
|
|
|
|
/* Rx/Tx one word in the descriptor buffer. */
|
|
@@ -731,9 +731,9 @@ static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring,
|
|
fifo->vring[is_rx] = NULL;
|
|
|
|
/* Notify upper layer that packet is done. */
|
|
- spin_lock_irqsave(&fifo->spin_lock, flags);
|
|
+ spin_lock_irqsave(&fifo->spin_lock[is_rx], flags);
|
|
vring_interrupt(0, vring->vq);
|
|
- spin_unlock_irqrestore(&fifo->spin_lock, flags);
|
|
+ spin_unlock_irqrestore(&fifo->spin_lock[is_rx], flags);
|
|
}
|
|
|
|
mlxbf_tmfifo_desc_done:
|
|
@@ -852,10 +852,10 @@ static bool mlxbf_tmfifo_virtio_notify(struct virtqueue *vq)
|
|
* worker handler.
|
|
*/
|
|
if (vring->vdev_id == VIRTIO_ID_CONSOLE) {
|
|
- spin_lock_irqsave(&fifo->spin_lock, flags);
|
|
+ spin_lock_irqsave(&fifo->spin_lock[0], flags);
|
|
tm_vdev = fifo->vdev[VIRTIO_ID_CONSOLE];
|
|
mlxbf_tmfifo_console_output(tm_vdev, vring);
|
|
- spin_unlock_irqrestore(&fifo->spin_lock, flags);
|
|
+ spin_unlock_irqrestore(&fifo->spin_lock[0], flags);
|
|
} else if (test_and_set_bit(MLXBF_TM_TX_LWM_IRQ,
|
|
&fifo->pend_events)) {
|
|
return true;
|
|
@@ -1189,7 +1189,8 @@ static int mlxbf_tmfifo_probe(struct platform_device *pdev)
|
|
if (!fifo)
|
|
return -ENOMEM;
|
|
|
|
- spin_lock_init(&fifo->spin_lock);
|
|
+ spin_lock_init(&fifo->spin_lock[0]);
|
|
+ spin_lock_init(&fifo->spin_lock[1]);
|
|
INIT_WORK(&fifo->work, mlxbf_tmfifo_work_handler);
|
|
mutex_init(&fifo->lock);
|
|
|
|
diff --git a/drivers/platform/mips/cpu_hwmon.c b/drivers/platform/mips/cpu_hwmon.c
|
|
index a7f184bb47e0..3d29a11c1d6b 100644
|
|
--- a/drivers/platform/mips/cpu_hwmon.c
|
|
+++ b/drivers/platform/mips/cpu_hwmon.c
|
|
@@ -161,7 +161,7 @@ static int __init loongson_hwmon_init(void)
|
|
|
|
cpu_hwmon_dev = hwmon_device_register(NULL);
|
|
if (IS_ERR(cpu_hwmon_dev)) {
|
|
- ret = -ENOMEM;
|
|
+ ret = PTR_ERR(cpu_hwmon_dev);
|
|
pr_err("hwmon_device_register fail!\n");
|
|
goto fail_hwmon_device_register;
|
|
}
|
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
|
index 821b08e01635..982f0cc8270c 100644
|
|
--- a/drivers/platform/x86/asus-wmi.c
|
|
+++ b/drivers/platform/x86/asus-wmi.c
|
|
@@ -512,13 +512,7 @@ static void kbd_led_update(struct asus_wmi *asus)
|
|
{
|
|
int ctrl_param = 0;
|
|
|
|
- /*
|
|
- * bits 0-2: level
|
|
- * bit 7: light on/off
|
|
- */
|
|
- if (asus->kbd_led_wk > 0)
|
|
- ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
|
|
-
|
|
+ ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F);
|
|
asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL);
|
|
}
|
|
|
|
diff --git a/drivers/platform/x86/gpd-pocket-fan.c b/drivers/platform/x86/gpd-pocket-fan.c
|
|
index be85ed966bf3..73eb1572b966 100644
|
|
--- a/drivers/platform/x86/gpd-pocket-fan.c
|
|
+++ b/drivers/platform/x86/gpd-pocket-fan.c
|
|
@@ -16,17 +16,27 @@
|
|
|
|
#define MAX_SPEED 3
|
|
|
|
-static int temp_limits[3] = { 55000, 60000, 65000 };
|
|
+#define TEMP_LIMIT0_DEFAULT 55000
|
|
+#define TEMP_LIMIT1_DEFAULT 60000
|
|
+#define TEMP_LIMIT2_DEFAULT 65000
|
|
+
|
|
+#define HYSTERESIS_DEFAULT 3000
|
|
+
|
|
+#define SPEED_ON_AC_DEFAULT 2
|
|
+
|
|
+static int temp_limits[3] = {
|
|
+ TEMP_LIMIT0_DEFAULT, TEMP_LIMIT1_DEFAULT, TEMP_LIMIT2_DEFAULT,
|
|
+};
|
|
module_param_array(temp_limits, int, NULL, 0444);
|
|
MODULE_PARM_DESC(temp_limits,
|
|
"Millicelsius values above which the fan speed increases");
|
|
|
|
-static int hysteresis = 3000;
|
|
+static int hysteresis = HYSTERESIS_DEFAULT;
|
|
module_param(hysteresis, int, 0444);
|
|
MODULE_PARM_DESC(hysteresis,
|
|
"Hysteresis in millicelsius before lowering the fan speed");
|
|
|
|
-static int speed_on_ac = 2;
|
|
+static int speed_on_ac = SPEED_ON_AC_DEFAULT;
|
|
module_param(speed_on_ac, int, 0444);
|
|
MODULE_PARM_DESC(speed_on_ac,
|
|
"minimum fan speed to allow when system is powered by AC");
|
|
@@ -120,18 +130,21 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev)
|
|
if (temp_limits[i] < 40000 || temp_limits[i] > 70000) {
|
|
dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n",
|
|
temp_limits[i]);
|
|
- return -EINVAL;
|
|
+ temp_limits[0] = TEMP_LIMIT0_DEFAULT;
|
|
+ temp_limits[1] = TEMP_LIMIT1_DEFAULT;
|
|
+ temp_limits[2] = TEMP_LIMIT2_DEFAULT;
|
|
+ break;
|
|
}
|
|
}
|
|
if (hysteresis < 1000 || hysteresis > 10000) {
|
|
dev_err(&pdev->dev, "Invalid hysteresis %d (must be between 1000 and 10000)\n",
|
|
hysteresis);
|
|
- return -EINVAL;
|
|
+ hysteresis = HYSTERESIS_DEFAULT;
|
|
}
|
|
if (speed_on_ac < 0 || speed_on_ac > MAX_SPEED) {
|
|
dev_err(&pdev->dev, "Invalid speed_on_ac %d (must be between 0 and 3)\n",
|
|
speed_on_ac);
|
|
- return -EINVAL;
|
|
+ speed_on_ac = SPEED_ON_AC_DEFAULT;
|
|
}
|
|
|
|
fan = devm_kzalloc(&pdev->dev, sizeof(*fan), GFP_KERNEL);
|
|
diff --git a/drivers/reset/reset-brcmstb.c b/drivers/reset/reset-brcmstb.c
|
|
index a608f445dad6..f213264c8567 100644
|
|
--- a/drivers/reset/reset-brcmstb.c
|
|
+++ b/drivers/reset/reset-brcmstb.c
|
|
@@ -91,12 +91,6 @@ static int brcmstb_reset_probe(struct platform_device *pdev)
|
|
return -ENOMEM;
|
|
|
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
- if (!IS_ALIGNED(res->start, SW_INIT_BANK_SIZE) ||
|
|
- !IS_ALIGNED(resource_size(res), SW_INIT_BANK_SIZE)) {
|
|
- dev_err(kdev, "incorrect register range\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
priv->base = devm_ioremap_resource(kdev, res);
|
|
if (IS_ERR(priv->base))
|
|
return PTR_ERR(priv->base);
|
|
diff --git a/drivers/rtc/rtc-bd70528.c b/drivers/rtc/rtc-bd70528.c
|
|
index 7744333b0f40..ddfef4d43bab 100644
|
|
--- a/drivers/rtc/rtc-bd70528.c
|
|
+++ b/drivers/rtc/rtc-bd70528.c
|
|
@@ -491,3 +491,4 @@ module_platform_driver(bd70528_rtc);
|
|
MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
|
|
MODULE_DESCRIPTION("BD70528 RTC driver");
|
|
MODULE_LICENSE("GPL");
|
|
+MODULE_ALIAS("platofrm:bd70528-rtc");
|
|
diff --git a/drivers/rtc/rtc-brcmstb-waketimer.c b/drivers/rtc/rtc-brcmstb-waketimer.c
|
|
index 3e9800f9878a..82d2ab0b3e9c 100644
|
|
--- a/drivers/rtc/rtc-brcmstb-waketimer.c
|
|
+++ b/drivers/rtc/rtc-brcmstb-waketimer.c
|
|
@@ -277,6 +277,7 @@ static int brcmstb_waketmr_remove(struct platform_device *pdev)
|
|
struct brcmstb_waketmr *timer = dev_get_drvdata(&pdev->dev);
|
|
|
|
unregister_reboot_notifier(&timer->reboot_notifier);
|
|
+ clk_disable_unprepare(timer->clk);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/rtc/rtc-msm6242.c b/drivers/rtc/rtc-msm6242.c
|
|
index 1c2d3c4a4963..b1f2bedee77e 100644
|
|
--- a/drivers/rtc/rtc-msm6242.c
|
|
+++ b/drivers/rtc/rtc-msm6242.c
|
|
@@ -133,7 +133,8 @@ static int msm6242_read_time(struct device *dev, struct rtc_time *tm)
|
|
msm6242_read(priv, MSM6242_SECOND1);
|
|
tm->tm_min = msm6242_read(priv, MSM6242_MINUTE10) * 10 +
|
|
msm6242_read(priv, MSM6242_MINUTE1);
|
|
- tm->tm_hour = (msm6242_read(priv, MSM6242_HOUR10 & 3)) * 10 +
|
|
+ tm->tm_hour = (msm6242_read(priv, MSM6242_HOUR10) &
|
|
+ MSM6242_HOUR10_HR_MASK) * 10 +
|
|
msm6242_read(priv, MSM6242_HOUR1);
|
|
tm->tm_mday = msm6242_read(priv, MSM6242_DAY10) * 10 +
|
|
msm6242_read(priv, MSM6242_DAY1);
|
|
diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c
|
|
index 704229eb0cac..b216bdcba0da 100644
|
|
--- a/drivers/rtc/rtc-mt6397.c
|
|
+++ b/drivers/rtc/rtc-mt6397.c
|
|
@@ -47,6 +47,14 @@
|
|
|
|
#define RTC_AL_SEC 0x0018
|
|
|
|
+#define RTC_AL_SEC_MASK 0x003f
|
|
+#define RTC_AL_MIN_MASK 0x003f
|
|
+#define RTC_AL_HOU_MASK 0x001f
|
|
+#define RTC_AL_DOM_MASK 0x001f
|
|
+#define RTC_AL_DOW_MASK 0x0007
|
|
+#define RTC_AL_MTH_MASK 0x000f
|
|
+#define RTC_AL_YEA_MASK 0x007f
|
|
+
|
|
#define RTC_PDN2 0x002e
|
|
#define RTC_PDN2_PWRON_ALARM BIT(4)
|
|
|
|
@@ -103,7 +111,7 @@ static irqreturn_t mtk_rtc_irq_handler_thread(int irq, void *data)
|
|
irqen = irqsta & ~RTC_IRQ_EN_AL;
|
|
mutex_lock(&rtc->lock);
|
|
if (regmap_write(rtc->regmap, rtc->addr_base + RTC_IRQ_EN,
|
|
- irqen) < 0)
|
|
+ irqen) == 0)
|
|
mtk_rtc_write_trigger(rtc);
|
|
mutex_unlock(&rtc->lock);
|
|
|
|
@@ -225,12 +233,12 @@ static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
|
|
alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);
|
|
mutex_unlock(&rtc->lock);
|
|
|
|
- tm->tm_sec = data[RTC_OFFSET_SEC];
|
|
- tm->tm_min = data[RTC_OFFSET_MIN];
|
|
- tm->tm_hour = data[RTC_OFFSET_HOUR];
|
|
- tm->tm_mday = data[RTC_OFFSET_DOM];
|
|
- tm->tm_mon = data[RTC_OFFSET_MTH];
|
|
- tm->tm_year = data[RTC_OFFSET_YEAR];
|
|
+ tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK;
|
|
+ tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK;
|
|
+ tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK;
|
|
+ tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK;
|
|
+ tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK;
|
|
+ tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;
|
|
|
|
tm->tm_year += RTC_MIN_YEAR_OFFSET;
|
|
tm->tm_mon--;
|
|
@@ -251,14 +259,25 @@ static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
|
|
tm->tm_year -= RTC_MIN_YEAR_OFFSET;
|
|
tm->tm_mon++;
|
|
|
|
- data[RTC_OFFSET_SEC] = tm->tm_sec;
|
|
- data[RTC_OFFSET_MIN] = tm->tm_min;
|
|
- data[RTC_OFFSET_HOUR] = tm->tm_hour;
|
|
- data[RTC_OFFSET_DOM] = tm->tm_mday;
|
|
- data[RTC_OFFSET_MTH] = tm->tm_mon;
|
|
- data[RTC_OFFSET_YEAR] = tm->tm_year;
|
|
-
|
|
mutex_lock(&rtc->lock);
|
|
+ ret = regmap_bulk_read(rtc->regmap, rtc->addr_base + RTC_AL_SEC,
|
|
+ data, RTC_OFFSET_COUNT);
|
|
+ if (ret < 0)
|
|
+ goto exit;
|
|
+
|
|
+ data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
|
|
+ (tm->tm_sec & RTC_AL_SEC_MASK));
|
|
+ data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
|
|
+ (tm->tm_min & RTC_AL_MIN_MASK));
|
|
+ data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
|
|
+ (tm->tm_hour & RTC_AL_HOU_MASK));
|
|
+ data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
|
|
+ (tm->tm_mday & RTC_AL_DOM_MASK));
|
|
+ data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
|
|
+ (tm->tm_mon & RTC_AL_MTH_MASK));
|
|
+ data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
|
|
+ (tm->tm_year & RTC_AL_YEA_MASK));
|
|
+
|
|
if (alm->enabled) {
|
|
ret = regmap_bulk_write(rtc->regmap,
|
|
rtc->addr_base + RTC_AL_SEC,
|
|
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
|
|
index 9df47421d69c..5be4d800e4ba 100644
|
|
--- a/drivers/s390/net/qeth_core_main.c
|
|
+++ b/drivers/s390/net/qeth_core_main.c
|
|
@@ -2451,50 +2451,46 @@ static int qeth_mpc_initialize(struct qeth_card *card)
|
|
rc = qeth_cm_enable(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "2err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_cm_setup(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "3err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_ulp_enable(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "4err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_ulp_setup(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "5err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_alloc_qdio_queues(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "5err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_qdio_establish(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "6err%d", rc);
|
|
qeth_free_qdio_queues(card);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_qdio_activate(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "7err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
rc = qeth_dm_act(card);
|
|
if (rc) {
|
|
QETH_CARD_TEXT_(card, 2, "8err%d", rc);
|
|
- goto out_qdio;
|
|
+ return rc;
|
|
}
|
|
|
|
return 0;
|
|
-out_qdio:
|
|
- qeth_qdio_clear_card(card, !IS_IQD(card));
|
|
- qdio_free(CARD_DDEV(card));
|
|
- return rc;
|
|
}
|
|
|
|
void qeth_print_status_message(struct qeth_card *card)
|
|
@@ -3382,11 +3378,6 @@ int qeth_configure_cq(struct qeth_card *card, enum qeth_cq cq)
|
|
goto out;
|
|
}
|
|
|
|
- if (card->state != CARD_STATE_DOWN) {
|
|
- rc = -1;
|
|
- goto out;
|
|
- }
|
|
-
|
|
qeth_free_qdio_queues(card);
|
|
card->options.cq = cq;
|
|
rc = 0;
|
|
@@ -4972,10 +4963,8 @@ retriable:
|
|
}
|
|
if (qeth_adp_supported(card, IPA_SETADP_SET_DIAG_ASSIST)) {
|
|
rc = qeth_query_setdiagass(card);
|
|
- if (rc < 0) {
|
|
+ if (rc)
|
|
QETH_CARD_TEXT_(card, 2, "8err%d", rc);
|
|
- goto out;
|
|
- }
|
|
}
|
|
return 0;
|
|
out:
|
|
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
|
|
index 8b7d911dccd8..11e3292c0adf 100644
|
|
--- a/drivers/s390/net/qeth_l2_main.c
|
|
+++ b/drivers/s390/net/qeth_l2_main.c
|
|
@@ -287,12 +287,12 @@ static void qeth_l2_stop_card(struct qeth_card *card)
|
|
card->state = CARD_STATE_HARDSETUP;
|
|
}
|
|
if (card->state == CARD_STATE_HARDSETUP) {
|
|
- qeth_qdio_clear_card(card, 0);
|
|
qeth_drain_output_queues(card);
|
|
qeth_clear_working_pool_list(card);
|
|
card->state = CARD_STATE_DOWN;
|
|
}
|
|
|
|
+ qeth_qdio_clear_card(card, 0);
|
|
flush_workqueue(card->event_wq);
|
|
card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;
|
|
card->info.promisc_mode = 0;
|
|
@@ -1983,8 +1983,7 @@ int qeth_l2_vnicc_get_timeout(struct qeth_card *card, u32 *timeout)
|
|
/* check if VNICC is currently enabled */
|
|
bool qeth_l2_vnicc_is_in_use(struct qeth_card *card)
|
|
{
|
|
- /* if everything is turned off, VNICC is not active */
|
|
- if (!card->options.vnicc.cur_chars)
|
|
+ if (!card->options.vnicc.sup_chars)
|
|
return false;
|
|
/* default values are only OK if rx_bcast was not enabled by user
|
|
* or the card is offline.
|
|
@@ -2071,8 +2070,9 @@ static void qeth_l2_vnicc_init(struct qeth_card *card)
|
|
/* enforce assumed default values and recover settings, if changed */
|
|
error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING,
|
|
timeout);
|
|
- chars_tmp = card->options.vnicc.wanted_chars ^ QETH_VNICC_DEFAULT;
|
|
- chars_tmp |= QETH_VNICC_BRIDGE_INVISIBLE;
|
|
+ /* Change chars, if necessary */
|
|
+ chars_tmp = card->options.vnicc.wanted_chars ^
|
|
+ card->options.vnicc.cur_chars;
|
|
chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE;
|
|
for_each_set_bit(i, &chars_tmp, chars_len) {
|
|
vnicc = BIT(i);
|
|
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
|
|
index 32385327539b..5152970a9aa4 100644
|
|
--- a/drivers/s390/net/qeth_l3_main.c
|
|
+++ b/drivers/s390/net/qeth_l3_main.c
|
|
@@ -1426,12 +1426,12 @@ static void qeth_l3_stop_card(struct qeth_card *card)
|
|
card->state = CARD_STATE_HARDSETUP;
|
|
}
|
|
if (card->state == CARD_STATE_HARDSETUP) {
|
|
- qeth_qdio_clear_card(card, 0);
|
|
qeth_drain_output_queues(card);
|
|
qeth_clear_working_pool_list(card);
|
|
card->state = CARD_STATE_DOWN;
|
|
}
|
|
|
|
+ qeth_qdio_clear_card(card, 0);
|
|
flush_workqueue(card->event_wq);
|
|
card->info.promisc_mode = 0;
|
|
}
|
|
diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c
|
|
index 2f73b33c9347..333fd4619dc6 100644
|
|
--- a/drivers/s390/net/qeth_l3_sys.c
|
|
+++ b/drivers/s390/net/qeth_l3_sys.c
|
|
@@ -270,24 +270,36 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
struct qeth_card *card = dev_get_drvdata(dev);
|
|
+ int rc = 0;
|
|
char *tmp;
|
|
- int rc;
|
|
|
|
if (!card)
|
|
return -EINVAL;
|
|
|
|
if (!IS_IQD(card))
|
|
return -EPERM;
|
|
- if (card->state != CARD_STATE_DOWN)
|
|
- return -EPERM;
|
|
- if (card->options.sniffer)
|
|
- return -EPERM;
|
|
- if (card->options.cq == QETH_CQ_NOTAVAILABLE)
|
|
- return -EPERM;
|
|
+
|
|
+ mutex_lock(&card->conf_mutex);
|
|
+ if (card->state != CARD_STATE_DOWN) {
|
|
+ rc = -EPERM;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (card->options.sniffer) {
|
|
+ rc = -EPERM;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (card->options.cq == QETH_CQ_NOTAVAILABLE) {
|
|
+ rc = -EPERM;
|
|
+ goto out;
|
|
+ }
|
|
|
|
tmp = strsep((char **)&buf, "\n");
|
|
- if (strlen(tmp) > 8)
|
|
- return -EINVAL;
|
|
+ if (strlen(tmp) > 8) {
|
|
+ rc = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
|
|
if (card->options.hsuid[0])
|
|
/* delete old ip address */
|
|
@@ -298,11 +310,13 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
|
|
card->options.hsuid[0] = '\0';
|
|
memcpy(card->dev->perm_addr, card->options.hsuid, 9);
|
|
qeth_configure_cq(card, QETH_CQ_DISABLED);
|
|
- return count;
|
|
+ goto out;
|
|
}
|
|
|
|
- if (qeth_configure_cq(card, QETH_CQ_ENABLED))
|
|
- return -EPERM;
|
|
+ if (qeth_configure_cq(card, QETH_CQ_ENABLED)) {
|
|
+ rc = -EPERM;
|
|
+ goto out;
|
|
+ }
|
|
|
|
snprintf(card->options.hsuid, sizeof(card->options.hsuid),
|
|
"%-8s", tmp);
|
|
@@ -311,6 +325,8 @@ static ssize_t qeth_l3_dev_hsuid_store(struct device *dev,
|
|
|
|
rc = qeth_l3_modify_hsuid(card, true);
|
|
|
|
+out:
|
|
+ mutex_unlock(&card->conf_mutex);
|
|
return rc ? rc : count;
|
|
}
|
|
|
|
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
|
|
index 3e17af8aedeb..2cd2761bd249 100644
|
|
--- a/drivers/scsi/cxgbi/libcxgbi.c
|
|
+++ b/drivers/scsi/cxgbi/libcxgbi.c
|
|
@@ -121,7 +121,8 @@ static inline void cxgbi_device_destroy(struct cxgbi_device *cdev)
|
|
"cdev 0x%p, p# %u.\n", cdev, cdev->nports);
|
|
cxgbi_hbas_remove(cdev);
|
|
cxgbi_device_portmap_cleanup(cdev);
|
|
- cxgbi_ppm_release(cdev->cdev2ppm(cdev));
|
|
+ if (cdev->cdev2ppm)
|
|
+ cxgbi_ppm_release(cdev->cdev2ppm(cdev));
|
|
if (cdev->pmap.max_connect)
|
|
cxgbi_free_big_mem(cdev->pmap.port_csk);
|
|
kfree(cdev);
|
|
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
index fea3cb6a090b..752b71cfbe12 100644
|
|
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
|
|
@@ -5234,7 +5234,6 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc)
|
|
&ct->chain_buffer_dma);
|
|
if (!ct->chain_buffer) {
|
|
ioc_err(ioc, "chain_lookup: pci_pool_alloc failed\n");
|
|
- _base_release_memory_pools(ioc);
|
|
goto out;
|
|
}
|
|
}
|
|
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
|
|
index ebb40160539f..ac2e88ec1190 100644
|
|
--- a/drivers/scsi/sd.c
|
|
+++ b/drivers/scsi/sd.c
|
|
@@ -1694,20 +1694,30 @@ static void sd_rescan(struct device *dev)
|
|
static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
|
|
unsigned int cmd, unsigned long arg)
|
|
{
|
|
- struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
|
|
+ struct gendisk *disk = bdev->bd_disk;
|
|
+ struct scsi_disk *sdkp = scsi_disk(disk);
|
|
+ struct scsi_device *sdev = sdkp->device;
|
|
+ void __user *p = compat_ptr(arg);
|
|
int error;
|
|
|
|
+ error = scsi_verify_blk_ioctl(bdev, cmd);
|
|
+ if (error < 0)
|
|
+ return error;
|
|
+
|
|
error = scsi_ioctl_block_when_processing_errors(sdev, cmd,
|
|
(mode & FMODE_NDELAY) != 0);
|
|
if (error)
|
|
return error;
|
|
+
|
|
+ if (is_sed_ioctl(cmd))
|
|
+ return sed_ioctl(sdkp->opal_dev, cmd, p);
|
|
|
|
/*
|
|
* Let the static ioctl translation table take care of it.
|
|
*/
|
|
if (!sdev->host->hostt->compat_ioctl)
|
|
return -ENOIOCTLCMD;
|
|
- return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
|
|
+ return sdev->host->hostt->compat_ioctl(sdev, cmd, p);
|
|
}
|
|
#endif
|
|
|
|
@@ -2192,8 +2202,10 @@ static int sd_read_protection_type(struct scsi_disk *sdkp, unsigned char *buffer
|
|
u8 type;
|
|
int ret = 0;
|
|
|
|
- if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0)
|
|
+ if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) {
|
|
+ sdkp->protection_type = 0;
|
|
return ret;
|
|
+ }
|
|
|
|
type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */
|
|
|
|
diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c
|
|
index dc2f6d2b46ed..d2197a31abe5 100644
|
|
--- a/drivers/scsi/ufs/ufs_bsg.c
|
|
+++ b/drivers/scsi/ufs/ufs_bsg.c
|
|
@@ -202,7 +202,7 @@ int ufs_bsg_probe(struct ufs_hba *hba)
|
|
bsg_dev->parent = get_device(parent);
|
|
bsg_dev->release = ufs_bsg_node_release;
|
|
|
|
- dev_set_name(bsg_dev, "ufs-bsg");
|
|
+ dev_set_name(bsg_dev, "ufs-bsg%u", shost->host_no);
|
|
|
|
ret = device_add(bsg_dev);
|
|
if (ret)
|
|
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
|
|
index ba8eff41b746..abbc1582f457 100644
|
|
--- a/drivers/spi/spi-atmel.c
|
|
+++ b/drivers/spi/spi-atmel.c
|
|
@@ -302,7 +302,6 @@ struct atmel_spi {
|
|
bool use_cs_gpios;
|
|
|
|
bool keep_cs;
|
|
- bool cs_active;
|
|
|
|
u32 fifo_size;
|
|
};
|
|
@@ -1374,11 +1373,9 @@ static int atmel_spi_one_transfer(struct spi_master *master,
|
|
&msg->transfers)) {
|
|
as->keep_cs = true;
|
|
} else {
|
|
- as->cs_active = !as->cs_active;
|
|
- if (as->cs_active)
|
|
- cs_activate(as, msg->spi);
|
|
- else
|
|
- cs_deactivate(as, msg->spi);
|
|
+ cs_deactivate(as, msg->spi);
|
|
+ udelay(10);
|
|
+ cs_activate(as, msg->spi);
|
|
}
|
|
}
|
|
|
|
@@ -1401,7 +1398,6 @@ static int atmel_spi_transfer_one_message(struct spi_master *master,
|
|
atmel_spi_lock(as);
|
|
cs_activate(as, spi);
|
|
|
|
- as->cs_active = true;
|
|
as->keep_cs = false;
|
|
|
|
msg->status = 0;
|
|
diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
|
|
index d08e9324140e..3528ed5eea9b 100644
|
|
--- a/drivers/spi/spi-fsl-lpspi.c
|
|
+++ b/drivers/spi/spi-fsl-lpspi.c
|
|
@@ -938,7 +938,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
|
|
ret = pm_runtime_get_sync(fsl_lpspi->dev);
|
|
if (ret < 0) {
|
|
dev_err(fsl_lpspi->dev, "failed to enable clock\n");
|
|
- return ret;
|
|
+ goto out_controller_put;
|
|
}
|
|
|
|
temp = readl(fsl_lpspi->base + IMX7ULP_PARAM);
|
|
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
|
|
index ae95ec0bc964..9f92165fe09f 100644
|
|
--- a/drivers/spi/spi-pxa2xx.c
|
|
+++ b/drivers/spi/spi-pxa2xx.c
|
|
@@ -1612,6 +1612,11 @@ static int pxa2xx_spi_fw_translate_cs(struct spi_controller *controller,
|
|
return cs;
|
|
}
|
|
|
|
+static size_t pxa2xx_spi_max_dma_transfer_size(struct spi_device *spi)
|
|
+{
|
|
+ return MAX_DMA_LEN;
|
|
+}
|
|
+
|
|
static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
@@ -1717,6 +1722,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
|
} else {
|
|
controller->can_dma = pxa2xx_spi_can_dma;
|
|
controller->max_dma_len = MAX_DMA_LEN;
|
|
+ controller->max_transfer_size =
|
|
+ pxa2xx_spi_max_dma_transfer_size;
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
|
|
index 15f5723d9f95..7222c7689c3c 100644
|
|
--- a/drivers/spi/spi-rspi.c
|
|
+++ b/drivers/spi/spi-rspi.c
|
|
@@ -1257,9 +1257,9 @@ static int rspi_probe(struct platform_device *pdev)
|
|
ctlr->flags = ops->flags;
|
|
ctlr->dev.of_node = pdev->dev.of_node;
|
|
|
|
- ret = platform_get_irq_byname(pdev, "rx");
|
|
+ ret = platform_get_irq_byname_optional(pdev, "rx");
|
|
if (ret < 0) {
|
|
- ret = platform_get_irq_byname(pdev, "mux");
|
|
+ ret = platform_get_irq_byname_optional(pdev, "mux");
|
|
if (ret < 0)
|
|
ret = platform_get_irq(pdev, 0);
|
|
if (ret >= 0)
|
|
@@ -1270,10 +1270,6 @@ static int rspi_probe(struct platform_device *pdev)
|
|
if (ret >= 0)
|
|
rspi->tx_irq = ret;
|
|
}
|
|
- if (ret < 0) {
|
|
- dev_err(&pdev->dev, "platform_get_irq error\n");
|
|
- goto error2;
|
|
- }
|
|
|
|
if (rspi->rx_irq == rspi->tx_irq) {
|
|
/* Single multiplexed interrupt */
|
|
diff --git a/drivers/spi/spi-sprd.c b/drivers/spi/spi-sprd.c
|
|
index 8c9021b7f7a9..fa597e27be17 100644
|
|
--- a/drivers/spi/spi-sprd.c
|
|
+++ b/drivers/spi/spi-sprd.c
|
|
@@ -674,7 +674,7 @@ static void sprd_spi_init_hw(struct sprd_spi *ss, struct spi_transfer *t)
|
|
u16 word_delay, interval;
|
|
u32 val;
|
|
|
|
- val = readl_relaxed(ss->base + SPRD_SPI_CTL7);
|
|
+ val = readl_relaxed(ss->base + SPRD_SPI_CTL0);
|
|
val &= ~(SPRD_SPI_SCK_REV | SPRD_SPI_NG_TX | SPRD_SPI_NG_RX);
|
|
/* Set default chip selection, clock phase and clock polarity */
|
|
val |= ss->hw_mode & SPI_CPHA ? SPRD_SPI_NG_RX : SPRD_SPI_NG_TX;
|
|
diff --git a/drivers/staging/media/hantro/hantro_g1_h264_dec.c b/drivers/staging/media/hantro/hantro_g1_h264_dec.c
|
|
index 636bf972adcf..5f29b7a836db 100644
|
|
--- a/drivers/staging/media/hantro/hantro_g1_h264_dec.c
|
|
+++ b/drivers/staging/media/hantro/hantro_g1_h264_dec.c
|
|
@@ -63,7 +63,7 @@ static void set_params(struct hantro_ctx *ctx)
|
|
/* always use the matrix sent from userspace */
|
|
reg |= G1_REG_DEC_CTRL2_TYPE1_QUANT_E;
|
|
|
|
- if (slices[0].flags & V4L2_H264_SLICE_FLAG_FIELD_PIC)
|
|
+ if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY))
|
|
reg |= G1_REG_DEC_CTRL2_FIELDPIC_FLAG_E;
|
|
vdpu_write_relaxed(vpu, reg, G1_REG_DEC_CTRL2);
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_h264.c b/drivers/staging/media/hantro/hantro_h264.c
|
|
index 0d758e0c0f99..a9c134204351 100644
|
|
--- a/drivers/staging/media/hantro/hantro_h264.c
|
|
+++ b/drivers/staging/media/hantro/hantro_h264.c
|
|
@@ -20,7 +20,7 @@
|
|
/* Size with u32 units. */
|
|
#define CABAC_INIT_BUFFER_SIZE (460 * 2)
|
|
#define POC_BUFFER_SIZE 34
|
|
-#define SCALING_LIST_SIZE (6 * 16 + 6 * 64)
|
|
+#define SCALING_LIST_SIZE (6 * 16 + 2 * 64)
|
|
|
|
#define POC_CMP(p0, p1) ((p0) < (p1) ? -1 : 1)
|
|
|
|
@@ -194,23 +194,6 @@ static const u32 h264_cabac_table[] = {
|
|
0x1f0c2517, 0x1f261440
|
|
};
|
|
|
|
-/*
|
|
- * NOTE: The scaling lists are in zig-zag order, apply inverse scanning process
|
|
- * to get the values in matrix order. In addition, the hardware requires bytes
|
|
- * swapped within each subsequent 4 bytes. Both arrays below include both
|
|
- * transformations.
|
|
- */
|
|
-static const u32 zig_zag_4x4[] = {
|
|
- 3, 2, 7, 11, 6, 1, 0, 5, 10, 15, 14, 9, 4, 8, 13, 12
|
|
-};
|
|
-
|
|
-static const u32 zig_zag_8x8[] = {
|
|
- 3, 2, 11, 19, 10, 1, 0, 9, 18, 27, 35, 26, 17, 8, 7, 6,
|
|
- 15, 16, 25, 34, 43, 51, 42, 33, 24, 23, 14, 5, 4, 13, 22, 31,
|
|
- 32, 41, 50, 59, 58, 49, 40, 39, 30, 21, 12, 20, 29, 38, 47, 48,
|
|
- 57, 56, 55, 46, 37, 28, 36, 45, 54, 63, 62, 53, 44, 52, 61, 60
|
|
-};
|
|
-
|
|
static void
|
|
reorder_scaling_list(struct hantro_ctx *ctx)
|
|
{
|
|
@@ -218,33 +201,23 @@ reorder_scaling_list(struct hantro_ctx *ctx)
|
|
const struct v4l2_ctrl_h264_scaling_matrix *scaling = ctrls->scaling;
|
|
const size_t num_list_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4);
|
|
const size_t list_len_4x4 = ARRAY_SIZE(scaling->scaling_list_4x4[0]);
|
|
- const size_t num_list_8x8 = ARRAY_SIZE(scaling->scaling_list_8x8);
|
|
const size_t list_len_8x8 = ARRAY_SIZE(scaling->scaling_list_8x8[0]);
|
|
struct hantro_h264_dec_priv_tbl *tbl = ctx->h264_dec.priv.cpu;
|
|
- u8 *dst = tbl->scaling_list;
|
|
- const u8 *src;
|
|
+ u32 *dst = (u32 *)tbl->scaling_list;
|
|
+ const u32 *src;
|
|
int i, j;
|
|
|
|
- BUILD_BUG_ON(ARRAY_SIZE(zig_zag_4x4) != list_len_4x4);
|
|
- BUILD_BUG_ON(ARRAY_SIZE(zig_zag_8x8) != list_len_8x8);
|
|
- BUILD_BUG_ON(ARRAY_SIZE(tbl->scaling_list) !=
|
|
- num_list_4x4 * list_len_4x4 +
|
|
- num_list_8x8 * list_len_8x8);
|
|
-
|
|
- src = &scaling->scaling_list_4x4[0][0];
|
|
- for (i = 0; i < num_list_4x4; ++i) {
|
|
- for (j = 0; j < list_len_4x4; ++j)
|
|
- dst[zig_zag_4x4[j]] = src[j];
|
|
- src += list_len_4x4;
|
|
- dst += list_len_4x4;
|
|
+ for (i = 0; i < num_list_4x4; i++) {
|
|
+ src = (u32 *)&scaling->scaling_list_4x4[i];
|
|
+ for (j = 0; j < list_len_4x4 / 4; j++)
|
|
+ *dst++ = swab32(src[j]);
|
|
}
|
|
|
|
- src = &scaling->scaling_list_8x8[0][0];
|
|
- for (i = 0; i < num_list_8x8; ++i) {
|
|
- for (j = 0; j < list_len_8x8; ++j)
|
|
- dst[zig_zag_8x8[j]] = src[j];
|
|
- src += list_len_8x8;
|
|
- dst += list_len_8x8;
|
|
+ /* Only Intra/Inter Y lists */
|
|
+ for (i = 0; i < 2; i++) {
|
|
+ src = (u32 *)&scaling->scaling_list_8x8[i];
|
|
+ for (j = 0; j < list_len_8x8 / 4; j++)
|
|
+ *dst++ = swab32(src[j]);
|
|
}
|
|
}
|
|
|
|
@@ -271,6 +244,7 @@ struct hantro_h264_reflist_builder {
|
|
const struct v4l2_h264_dpb_entry *dpb;
|
|
s32 pocs[HANTRO_H264_DPB_SIZE];
|
|
u8 unordered_reflist[HANTRO_H264_DPB_SIZE];
|
|
+ int frame_nums[HANTRO_H264_DPB_SIZE];
|
|
s32 curpoc;
|
|
u8 num_valid;
|
|
};
|
|
@@ -294,13 +268,20 @@ static void
|
|
init_reflist_builder(struct hantro_ctx *ctx,
|
|
struct hantro_h264_reflist_builder *b)
|
|
{
|
|
+ const struct v4l2_ctrl_h264_slice_params *slice_params;
|
|
const struct v4l2_ctrl_h264_decode_params *dec_param;
|
|
+ const struct v4l2_ctrl_h264_sps *sps;
|
|
struct vb2_v4l2_buffer *buf = hantro_get_dst_buf(ctx);
|
|
const struct v4l2_h264_dpb_entry *dpb = ctx->h264_dec.dpb;
|
|
struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q;
|
|
+ int cur_frame_num, max_frame_num;
|
|
unsigned int i;
|
|
|
|
dec_param = ctx->h264_dec.ctrls.decode;
|
|
+ slice_params = &ctx->h264_dec.ctrls.slices[0];
|
|
+ sps = ctx->h264_dec.ctrls.sps;
|
|
+ max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4);
|
|
+ cur_frame_num = slice_params->frame_num;
|
|
|
|
memset(b, 0, sizeof(*b));
|
|
b->dpb = dpb;
|
|
@@ -318,6 +299,18 @@ init_reflist_builder(struct hantro_ctx *ctx,
|
|
continue;
|
|
|
|
buf = to_vb2_v4l2_buffer(vb2_get_buffer(cap_q, buf_idx));
|
|
+
|
|
+ /*
|
|
+ * Handle frame_num wraparound as described in section
|
|
+ * '8.2.4.1 Decoding process for picture numbers' of the spec.
|
|
+ * TODO: This logic will have to be adjusted when we start
|
|
+ * supporting interlaced content.
|
|
+ */
|
|
+ if (dpb[i].frame_num > cur_frame_num)
|
|
+ b->frame_nums[i] = (int)dpb[i].frame_num - max_frame_num;
|
|
+ else
|
|
+ b->frame_nums[i] = dpb[i].frame_num;
|
|
+
|
|
b->pocs[i] = get_poc(buf->field, dpb[i].top_field_order_cnt,
|
|
dpb[i].bottom_field_order_cnt);
|
|
b->unordered_reflist[b->num_valid] = i;
|
|
@@ -353,7 +346,7 @@ static int p_ref_list_cmp(const void *ptra, const void *ptrb, const void *data)
|
|
* ascending order.
|
|
*/
|
|
if (!(a->flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM))
|
|
- return b->frame_num - a->frame_num;
|
|
+ return builder->frame_nums[idxb] - builder->frame_nums[idxa];
|
|
|
|
return a->pic_num - b->pic_num;
|
|
}
|
|
diff --git a/drivers/staging/media/ipu3/include/intel-ipu3.h b/drivers/staging/media/ipu3/include/intel-ipu3.h
|
|
index c7cd27efac8a..0b1cb9f9cbd1 100644
|
|
--- a/drivers/staging/media/ipu3/include/intel-ipu3.h
|
|
+++ b/drivers/staging/media/ipu3/include/intel-ipu3.h
|
|
@@ -449,7 +449,7 @@ struct ipu3_uapi_awb_fr_config_s {
|
|
__u16 reserved1;
|
|
__u32 bayer_sign;
|
|
__u8 bayer_nf;
|
|
- __u8 reserved2[3];
|
|
+ __u8 reserved2[7];
|
|
} __attribute__((aligned(32))) __packed;
|
|
|
|
/**
|
|
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
|
|
index 08c6c9c410cc..c07526c12629 100644
|
|
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
|
|
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
|
|
@@ -244,8 +244,8 @@ static void cedrus_write_scaling_lists(struct cedrus_ctx *ctx,
|
|
sizeof(scaling->scaling_list_8x8[0]));
|
|
|
|
cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_1,
|
|
- scaling->scaling_list_8x8[3],
|
|
- sizeof(scaling->scaling_list_8x8[3]));
|
|
+ scaling->scaling_list_8x8[1],
|
|
+ sizeof(scaling->scaling_list_8x8[1]));
|
|
|
|
cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_4x4,
|
|
scaling->scaling_list_4x4,
|
|
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
|
|
index 6949ea8bc387..51ffd5c002de 100644
|
|
--- a/drivers/target/target_core_iblock.c
|
|
+++ b/drivers/target/target_core_iblock.c
|
|
@@ -646,7 +646,9 @@ iblock_alloc_bip(struct se_cmd *cmd, struct bio *bio,
|
|
}
|
|
|
|
bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
|
|
- bip_set_seed(bip, bio->bi_iter.bi_sector);
|
|
+ /* virtual start sector must be in integrity interval units */
|
|
+ bip_set_seed(bip, bio->bi_iter.bi_sector >>
|
|
+ (bi->interval_exp - SECTOR_SHIFT));
|
|
|
|
pr_debug("IBLOCK BIP Size: %u Sector: %llu\n", bip->bip_iter.bi_size,
|
|
(unsigned long long)bip->bip_iter.bi_sector);
|
|
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
|
|
index 5e08f2657b90..34f602c3a882 100644
|
|
--- a/drivers/tty/serial/imx.c
|
|
+++ b/drivers/tty/serial/imx.c
|
|
@@ -619,7 +619,7 @@ static void imx_uart_dma_tx(struct imx_port *sport)
|
|
dev_err(dev, "DMA mapping error for TX.\n");
|
|
return;
|
|
}
|
|
- desc = dmaengine_prep_slave_sg(chan, sgl, sport->dma_tx_nents,
|
|
+ desc = dmaengine_prep_slave_sg(chan, sgl, ret,
|
|
DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);
|
|
if (!desc) {
|
|
dma_unmap_sg(dev, sgl, sport->dma_tx_nents,
|
|
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
|
|
index 6157213a8359..c16234bca78f 100644
|
|
--- a/drivers/tty/serial/pch_uart.c
|
|
+++ b/drivers/tty/serial/pch_uart.c
|
|
@@ -233,6 +233,7 @@ struct eg20t_port {
|
|
struct dma_chan *chan_rx;
|
|
struct scatterlist *sg_tx_p;
|
|
int nent;
|
|
+ int orig_nent;
|
|
struct scatterlist sg_rx;
|
|
int tx_dma_use;
|
|
void *rx_buf_virt;
|
|
@@ -787,9 +788,10 @@ static void pch_dma_tx_complete(void *arg)
|
|
}
|
|
xmit->tail &= UART_XMIT_SIZE - 1;
|
|
async_tx_ack(priv->desc_tx);
|
|
- dma_unmap_sg(port->dev, sg, priv->nent, DMA_TO_DEVICE);
|
|
+ dma_unmap_sg(port->dev, sg, priv->orig_nent, DMA_TO_DEVICE);
|
|
priv->tx_dma_use = 0;
|
|
priv->nent = 0;
|
|
+ priv->orig_nent = 0;
|
|
kfree(priv->sg_tx_p);
|
|
pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT);
|
|
}
|
|
@@ -1010,6 +1012,7 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
|
|
dev_err(priv->port.dev, "%s:dma_map_sg Failed\n", __func__);
|
|
return 0;
|
|
}
|
|
+ priv->orig_nent = num;
|
|
priv->nent = nent;
|
|
|
|
for (i = 0; i < nent; i++, sg++) {
|
|
diff --git a/fs/affs/super.c b/fs/affs/super.c
|
|
index cc463ae47c12..3812f7bc3a7f 100644
|
|
--- a/fs/affs/super.c
|
|
+++ b/fs/affs/super.c
|
|
@@ -561,14 +561,9 @@ affs_remount(struct super_block *sb, int *flags, char *data)
|
|
int root_block;
|
|
unsigned long mount_flags;
|
|
int res = 0;
|
|
- char *new_opts;
|
|
char volume[32];
|
|
char *prefix = NULL;
|
|
|
|
- new_opts = kstrdup(data, GFP_KERNEL);
|
|
- if (data && !new_opts)
|
|
- return -ENOMEM;
|
|
-
|
|
pr_debug("%s(flags=0x%x,opts=\"%s\")\n", __func__, *flags, data);
|
|
|
|
sync_filesystem(sb);
|
|
@@ -579,7 +574,6 @@ affs_remount(struct super_block *sb, int *flags, char *data)
|
|
&blocksize, &prefix, volume,
|
|
&mount_flags)) {
|
|
kfree(prefix);
|
|
- kfree(new_opts);
|
|
return -EINVAL;
|
|
}
|
|
|
|
diff --git a/fs/afs/dir.c b/fs/afs/dir.c
|
|
index 497f979018c2..5c794f4b051a 100644
|
|
--- a/fs/afs/dir.c
|
|
+++ b/fs/afs/dir.c
|
|
@@ -908,6 +908,7 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
|
|
unsigned int flags)
|
|
{
|
|
struct afs_vnode *dvnode = AFS_FS_I(dir);
|
|
+ struct afs_fid fid = {};
|
|
struct inode *inode;
|
|
struct dentry *d;
|
|
struct key *key;
|
|
@@ -951,21 +952,18 @@ static struct dentry *afs_lookup(struct inode *dir, struct dentry *dentry,
|
|
afs_stat_v(dvnode, n_lookup);
|
|
inode = afs_do_lookup(dir, dentry, key);
|
|
key_put(key);
|
|
- if (inode == ERR_PTR(-ENOENT)) {
|
|
+ if (inode == ERR_PTR(-ENOENT))
|
|
inode = afs_try_auto_mntpt(dentry, dir);
|
|
- } else {
|
|
- dentry->d_fsdata =
|
|
- (void *)(unsigned long)dvnode->status.data_version;
|
|
- }
|
|
+
|
|
+ if (!IS_ERR_OR_NULL(inode))
|
|
+ fid = AFS_FS_I(inode)->fid;
|
|
+
|
|
d = d_splice_alias(inode, dentry);
|
|
if (!IS_ERR_OR_NULL(d)) {
|
|
d->d_fsdata = dentry->d_fsdata;
|
|
- trace_afs_lookup(dvnode, &d->d_name,
|
|
- inode ? AFS_FS_I(inode) : NULL);
|
|
+ trace_afs_lookup(dvnode, &d->d_name, &fid);
|
|
} else {
|
|
- trace_afs_lookup(dvnode, &dentry->d_name,
|
|
- IS_ERR_OR_NULL(inode) ? NULL
|
|
- : AFS_FS_I(inode));
|
|
+ trace_afs_lookup(dvnode, &dentry->d_name, &fid);
|
|
}
|
|
return d;
|
|
}
|
|
diff --git a/fs/afs/super.c b/fs/afs/super.c
|
|
index d9a6036b70b9..7f8a9b3137bf 100644
|
|
--- a/fs/afs/super.c
|
|
+++ b/fs/afs/super.c
|
|
@@ -404,6 +404,7 @@ static int afs_test_super(struct super_block *sb, struct fs_context *fc)
|
|
return (as->net_ns == fc->net_ns &&
|
|
as->volume &&
|
|
as->volume->vid == ctx->volume->vid &&
|
|
+ as->cell == ctx->cell &&
|
|
!as->dyn_root);
|
|
}
|
|
|
|
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
|
|
index eaafd00f93d4..5739b8fc7fff 100644
|
|
--- a/fs/btrfs/file.c
|
|
+++ b/fs/btrfs/file.c
|
|
@@ -1903,9 +1903,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
|
|
(iocb->ki_flags & IOCB_NOWAIT))
|
|
return -EOPNOTSUPP;
|
|
|
|
- if (!inode_trylock(inode)) {
|
|
- if (iocb->ki_flags & IOCB_NOWAIT)
|
|
+ if (iocb->ki_flags & IOCB_NOWAIT) {
|
|
+ if (!inode_trylock(inode))
|
|
return -EAGAIN;
|
|
+ } else {
|
|
inode_lock(inode);
|
|
}
|
|
|
|
diff --git a/fs/buffer.c b/fs/buffer.c
|
|
index 7744488f7bde..91ceca52d14f 100644
|
|
--- a/fs/buffer.c
|
|
+++ b/fs/buffer.c
|
|
@@ -2991,7 +2991,7 @@ static void end_bio_bh_io_sync(struct bio *bio)
|
|
* errors, this only handles the "we need to be able to
|
|
* do IO at the final sector" case.
|
|
*/
|
|
-void guard_bio_eod(int op, struct bio *bio)
|
|
+void guard_bio_eod(struct bio *bio)
|
|
{
|
|
sector_t maxsector;
|
|
struct hd_struct *part;
|
|
@@ -3055,15 +3055,15 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
|
|
bio->bi_end_io = end_bio_bh_io_sync;
|
|
bio->bi_private = bh;
|
|
|
|
- /* Take care of bh's that straddle the end of the device */
|
|
- guard_bio_eod(op, bio);
|
|
-
|
|
if (buffer_meta(bh))
|
|
op_flags |= REQ_META;
|
|
if (buffer_prio(bh))
|
|
op_flags |= REQ_PRIO;
|
|
bio_set_op_attrs(bio, op, op_flags);
|
|
|
|
+ /* Take care of bh's that straddle the end of the device */
|
|
+ guard_bio_eod(bio);
|
|
+
|
|
if (wbc) {
|
|
wbc_init_bio(wbc, bio);
|
|
wbc_account_cgroup_owner(wbc, bh->b_page, bh->b_size);
|
|
diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
|
|
index 8b0b512c5792..afe1f03aabe3 100644
|
|
--- a/fs/cifs/smb2file.c
|
|
+++ b/fs/cifs/smb2file.c
|
|
@@ -67,7 +67,7 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms,
|
|
goto out;
|
|
|
|
|
|
- if (oparms->tcon->use_resilient) {
|
|
+ if (oparms->tcon->use_resilient) {
|
|
/* default timeout is 0, servers pick default (120 seconds) */
|
|
nr_ioctl_req.Timeout =
|
|
cpu_to_le32(oparms->tcon->handle_timeout);
|
|
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
|
|
index 5755e897a5f0..2e9c73165800 100644
|
|
--- a/fs/f2fs/data.c
|
|
+++ b/fs/f2fs/data.c
|
|
@@ -2098,7 +2098,7 @@ static int __write_data_page(struct page *page, bool *submitted,
|
|
loff_t i_size = i_size_read(inode);
|
|
const pgoff_t end_index = ((unsigned long long) i_size)
|
|
>> PAGE_SHIFT;
|
|
- loff_t psize = (page->index + 1) << PAGE_SHIFT;
|
|
+ loff_t psize = (loff_t)(page->index + 1) << PAGE_SHIFT;
|
|
unsigned offset = 0;
|
|
bool need_balance_fs = false;
|
|
int err = 0;
|
|
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
|
|
index 8ed8e4328bd1..fae665691481 100644
|
|
--- a/fs/f2fs/file.c
|
|
+++ b/fs/f2fs/file.c
|
|
@@ -1139,7 +1139,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,
|
|
}
|
|
dn.ofs_in_node++;
|
|
i++;
|
|
- new_size = (dst + i) << PAGE_SHIFT;
|
|
+ new_size = (loff_t)(dst + i) << PAGE_SHIFT;
|
|
if (dst_inode->i_size < new_size)
|
|
f2fs_i_size_write(dst_inode, new_size);
|
|
} while (--ilen && (do_replace[i] || blkaddr[i] == NULL_ADDR));
|
|
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
|
|
index c53e3b892210..01ff37b76652 100644
|
|
--- a/fs/gfs2/file.c
|
|
+++ b/fs/gfs2/file.c
|
|
@@ -6,6 +6,7 @@
|
|
|
|
#include <linux/slab.h>
|
|
#include <linux/spinlock.h>
|
|
+#include <linux/compat.h>
|
|
#include <linux/completion.h>
|
|
#include <linux/buffer_head.h>
|
|
#include <linux/pagemap.h>
|
|
@@ -354,6 +355,31 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
return -ENOTTY;
|
|
}
|
|
|
|
+#ifdef CONFIG_COMPAT
|
|
+static long gfs2_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
+{
|
|
+ switch(cmd) {
|
|
+ /* These are just misnamed, they actually get/put from/to user an int */
|
|
+ case FS_IOC32_GETFLAGS:
|
|
+ cmd = FS_IOC_GETFLAGS;
|
|
+ break;
|
|
+ case FS_IOC32_SETFLAGS:
|
|
+ cmd = FS_IOC_SETFLAGS;
|
|
+ break;
|
|
+ /* Keep this list in sync with gfs2_ioctl */
|
|
+ case FITRIM:
|
|
+ case FS_IOC_GETFSLABEL:
|
|
+ break;
|
|
+ default:
|
|
+ return -ENOIOCTLCMD;
|
|
+ }
|
|
+
|
|
+ return gfs2_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
|
|
+}
|
|
+#else
|
|
+#define gfs2_compat_ioctl NULL
|
|
+#endif
|
|
+
|
|
/**
|
|
* gfs2_size_hint - Give a hint to the size of a write request
|
|
* @filep: The struct file
|
|
@@ -1294,6 +1320,7 @@ const struct file_operations gfs2_file_fops = {
|
|
.write_iter = gfs2_file_write_iter,
|
|
.iopoll = iomap_dio_iopoll,
|
|
.unlocked_ioctl = gfs2_ioctl,
|
|
+ .compat_ioctl = gfs2_compat_ioctl,
|
|
.mmap = gfs2_mmap,
|
|
.open = gfs2_open,
|
|
.release = gfs2_release,
|
|
@@ -1309,6 +1336,7 @@ const struct file_operations gfs2_file_fops = {
|
|
const struct file_operations gfs2_dir_fops = {
|
|
.iterate_shared = gfs2_readdir,
|
|
.unlocked_ioctl = gfs2_ioctl,
|
|
+ .compat_ioctl = gfs2_compat_ioctl,
|
|
.open = gfs2_open,
|
|
.release = gfs2_release,
|
|
.fsync = gfs2_fsync,
|
|
@@ -1325,6 +1353,7 @@ const struct file_operations gfs2_file_fops_nolock = {
|
|
.write_iter = gfs2_file_write_iter,
|
|
.iopoll = iomap_dio_iopoll,
|
|
.unlocked_ioctl = gfs2_ioctl,
|
|
+ .compat_ioctl = gfs2_compat_ioctl,
|
|
.mmap = gfs2_mmap,
|
|
.open = gfs2_open,
|
|
.release = gfs2_release,
|
|
@@ -1338,6 +1367,7 @@ const struct file_operations gfs2_file_fops_nolock = {
|
|
const struct file_operations gfs2_dir_fops_nolock = {
|
|
.iterate_shared = gfs2_readdir,
|
|
.unlocked_ioctl = gfs2_ioctl,
|
|
+ .compat_ioctl = gfs2_compat_ioctl,
|
|
.open = gfs2_open,
|
|
.release = gfs2_release,
|
|
.fsync = gfs2_fsync,
|
|
diff --git a/fs/internal.h b/fs/internal.h
|
|
index 315fcd8d237c..7651e8b8ef13 100644
|
|
--- a/fs/internal.h
|
|
+++ b/fs/internal.h
|
|
@@ -38,7 +38,7 @@ static inline int __sync_blockdev(struct block_device *bdev, int wait)
|
|
/*
|
|
* buffer.c
|
|
*/
|
|
-extern void guard_bio_eod(int rw, struct bio *bio);
|
|
+extern void guard_bio_eod(struct bio *bio);
|
|
extern int __block_write_begin_int(struct page *page, loff_t pos, unsigned len,
|
|
get_block_t *get_block, struct iomap *iomap);
|
|
|
|
diff --git a/fs/mpage.c b/fs/mpage.c
|
|
index a63620cdb73a..ccba3c4c4479 100644
|
|
--- a/fs/mpage.c
|
|
+++ b/fs/mpage.c
|
|
@@ -62,7 +62,7 @@ static struct bio *mpage_bio_submit(int op, int op_flags, struct bio *bio)
|
|
{
|
|
bio->bi_end_io = mpage_end_io;
|
|
bio_set_op_attrs(bio, op, op_flags);
|
|
- guard_bio_eod(op, bio);
|
|
+ guard_bio_eod(bio);
|
|
submit_bio(bio);
|
|
return NULL;
|
|
}
|
|
diff --git a/fs/nfs/nfs2xdr.c b/fs/nfs/nfs2xdr.c
|
|
index cbc17a203248..887f9136a9db 100644
|
|
--- a/fs/nfs/nfs2xdr.c
|
|
+++ b/fs/nfs/nfs2xdr.c
|
|
@@ -370,7 +370,7 @@ static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr,
|
|
} else
|
|
p = xdr_time_not_set(p);
|
|
if (attr->ia_valid & ATTR_MTIME_SET) {
|
|
- ts = timespec64_to_timespec(attr->ia_atime);
|
|
+ ts = timespec64_to_timespec(attr->ia_mtime);
|
|
xdr_encode_time(p, &ts);
|
|
} else if (attr->ia_valid & ATTR_MTIME) {
|
|
ts = timespec64_to_timespec(attr->ia_mtime);
|
|
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
|
index caacf5e7f5e1..f26d714f9f28 100644
|
|
--- a/fs/nfs/nfs4proc.c
|
|
+++ b/fs/nfs/nfs4proc.c
|
|
@@ -521,9 +521,7 @@ static int nfs4_do_handle_exception(struct nfs_server *server,
|
|
case -NFS4ERR_DEADSESSION:
|
|
case -NFS4ERR_SEQ_FALSE_RETRY:
|
|
case -NFS4ERR_SEQ_MISORDERED:
|
|
- dprintk("%s ERROR: %d Reset session\n", __func__,
|
|
- errorcode);
|
|
- nfs4_schedule_session_recovery(clp->cl_session, errorcode);
|
|
+ /* Handled in nfs41_sequence_process() */
|
|
goto wait_on_recovery;
|
|
#endif /* defined(CONFIG_NFS_V4_1) */
|
|
case -NFS4ERR_FILE_OPEN:
|
|
@@ -782,6 +780,7 @@ static int nfs41_sequence_process(struct rpc_task *task,
|
|
struct nfs4_session *session;
|
|
struct nfs4_slot *slot = res->sr_slot;
|
|
struct nfs_client *clp;
|
|
+ int status;
|
|
int ret = 1;
|
|
|
|
if (slot == NULL)
|
|
@@ -793,8 +792,13 @@ static int nfs41_sequence_process(struct rpc_task *task,
|
|
session = slot->table->session;
|
|
|
|
trace_nfs4_sequence_done(session, res);
|
|
+
|
|
+ status = res->sr_status;
|
|
+ if (task->tk_status == -NFS4ERR_DEADSESSION)
|
|
+ status = -NFS4ERR_DEADSESSION;
|
|
+
|
|
/* Check the SEQUENCE operation status */
|
|
- switch (res->sr_status) {
|
|
+ switch (status) {
|
|
case 0:
|
|
/* Mark this sequence number as having been acked */
|
|
nfs4_slot_sequence_acked(slot, slot->seq_nr);
|
|
@@ -866,6 +870,10 @@ static int nfs41_sequence_process(struct rpc_task *task,
|
|
*/
|
|
slot->seq_nr = slot->seq_nr_highest_sent;
|
|
goto out_retry;
|
|
+ case -NFS4ERR_BADSESSION:
|
|
+ case -NFS4ERR_DEADSESSION:
|
|
+ case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
|
|
+ goto session_recover;
|
|
default:
|
|
/* Just update the slot sequence no. */
|
|
slot->seq_done = 1;
|
|
@@ -876,8 +884,10 @@ out:
|
|
out_noaction:
|
|
return ret;
|
|
session_recover:
|
|
- nfs4_schedule_session_recovery(session, res->sr_status);
|
|
- goto retry_nowait;
|
|
+ nfs4_schedule_session_recovery(session, status);
|
|
+ dprintk("%s ERROR: %d Reset session\n", __func__, status);
|
|
+ nfs41_sequence_free_slot(res);
|
|
+ goto out;
|
|
retry_new_seq:
|
|
++slot->seq_nr;
|
|
retry_nowait:
|
|
@@ -2188,7 +2198,6 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct
|
|
case -NFS4ERR_BAD_HIGH_SLOT:
|
|
case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
|
|
case -NFS4ERR_DEADSESSION:
|
|
- nfs4_schedule_session_recovery(server->nfs_client->cl_session, err);
|
|
return -EAGAIN;
|
|
case -NFS4ERR_STALE_CLIENTID:
|
|
case -NFS4ERR_STALE_STATEID:
|
|
@@ -6243,8 +6252,10 @@ static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
|
|
|
|
d_data = (struct nfs4_delegreturndata *)data;
|
|
|
|
- if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task))
|
|
+ if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) {
|
|
+ nfs4_sequence_done(task, &d_data->res.seq_res);
|
|
return;
|
|
+ }
|
|
|
|
lo = d_data->args.lr_args ? d_data->args.lr_args->layout : NULL;
|
|
if (lo && !pnfs_layout_is_valid(lo)) {
|
|
@@ -7820,6 +7831,15 @@ nfs41_same_server_scope(struct nfs41_server_scope *a,
|
|
static void
|
|
nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
|
|
{
|
|
+ struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp;
|
|
+ struct nfs_client *clp = args->client;
|
|
+
|
|
+ switch (task->tk_status) {
|
|
+ case -NFS4ERR_BADSESSION:
|
|
+ case -NFS4ERR_DEADSESSION:
|
|
+ nfs4_schedule_session_recovery(clp->cl_session,
|
|
+ task->tk_status);
|
|
+ }
|
|
}
|
|
|
|
static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
|
|
@@ -8867,8 +8887,6 @@ static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nf
|
|
case -NFS4ERR_BADSESSION:
|
|
case -NFS4ERR_DEADSESSION:
|
|
case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
|
|
- nfs4_schedule_session_recovery(clp->cl_session,
|
|
- task->tk_status);
|
|
break;
|
|
default:
|
|
nfs4_schedule_lease_recovery(clp);
|
|
diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig
|
|
index 10cefb0c07c7..c4b1a89b8845 100644
|
|
--- a/fs/nfsd/Kconfig
|
|
+++ b/fs/nfsd/Kconfig
|
|
@@ -73,7 +73,7 @@ config NFSD_V4
|
|
select NFSD_V3
|
|
select FS_POSIX_ACL
|
|
select SUNRPC_GSS
|
|
- select CRYPTO
|
|
+ select CRYPTO_SHA256
|
|
select GRACE_PERIOD
|
|
help
|
|
This option enables support in your system's NFS server for
|
|
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
|
|
index 38c0aeda500e..4798667af647 100644
|
|
--- a/fs/nfsd/nfs4proc.c
|
|
+++ b/fs/nfsd/nfs4proc.c
|
|
@@ -1298,7 +1298,8 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
out:
|
|
return status;
|
|
out_err:
|
|
- cleanup_async_copy(async_copy);
|
|
+ if (async_copy)
|
|
+ cleanup_async_copy(async_copy);
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c
|
|
index cdc75ad4438b..c35c0ebaf722 100644
|
|
--- a/fs/nfsd/nfs4recover.c
|
|
+++ b/fs/nfsd/nfs4recover.c
|
|
@@ -1578,6 +1578,7 @@ nfsd4_cld_tracking_init(struct net *net)
|
|
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
|
bool running;
|
|
int retries = 10;
|
|
+ struct crypto_shash *tfm;
|
|
|
|
status = nfs4_cld_state_init(net);
|
|
if (status)
|
|
@@ -1586,11 +1587,6 @@ nfsd4_cld_tracking_init(struct net *net)
|
|
status = __nfsd4_init_cld_pipe(net);
|
|
if (status)
|
|
goto err_shutdown;
|
|
- nn->cld_net->cn_tfm = crypto_alloc_shash("sha256", 0, 0);
|
|
- if (IS_ERR(nn->cld_net->cn_tfm)) {
|
|
- status = PTR_ERR(nn->cld_net->cn_tfm);
|
|
- goto err_remove;
|
|
- }
|
|
|
|
/*
|
|
* rpc pipe upcalls take 30 seconds to time out, so we don't want to
|
|
@@ -1607,6 +1603,12 @@ nfsd4_cld_tracking_init(struct net *net)
|
|
status = -ETIMEDOUT;
|
|
goto err_remove;
|
|
}
|
|
+ tfm = crypto_alloc_shash("sha256", 0, 0);
|
|
+ if (IS_ERR(tfm)) {
|
|
+ status = PTR_ERR(tfm);
|
|
+ goto err_remove;
|
|
+ }
|
|
+ nn->cld_net->cn_tfm = tfm;
|
|
|
|
status = nfsd4_cld_get_version(nn);
|
|
if (status == -EOPNOTSUPP)
|
|
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
|
|
index 699a560efbb0..900e4ef686bf 100644
|
|
--- a/fs/ocfs2/journal.c
|
|
+++ b/fs/ocfs2/journal.c
|
|
@@ -1066,6 +1066,14 @@ int ocfs2_journal_load(struct ocfs2_journal *journal, int local, int replayed)
|
|
|
|
ocfs2_clear_journal_error(osb->sb, journal->j_journal, osb->slot_num);
|
|
|
|
+ if (replayed) {
|
|
+ jbd2_journal_lock_updates(journal->j_journal);
|
|
+ status = jbd2_journal_flush(journal->j_journal);
|
|
+ jbd2_journal_unlock_updates(journal->j_journal);
|
|
+ if (status < 0)
|
|
+ mlog_errno(status);
|
|
+ }
|
|
+
|
|
status = ocfs2_journal_toggle_dirty(osb, 1, replayed);
|
|
if (status < 0) {
|
|
mlog_errno(status);
|
|
diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c
|
|
index 4fd9683b8245..826dad0243dc 100644
|
|
--- a/fs/ubifs/journal.c
|
|
+++ b/fs/ubifs/journal.c
|
|
@@ -899,7 +899,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode)
|
|
fname_name(&nm) = xent->name;
|
|
fname_len(&nm) = le16_to_cpu(xent->nlen);
|
|
|
|
- xino = ubifs_iget(c->vfs_sb, xent->inum);
|
|
+ xino = ubifs_iget(c->vfs_sb, le64_to_cpu(xent->inum));
|
|
if (IS_ERR(xino)) {
|
|
err = PTR_ERR(xino);
|
|
ubifs_err(c, "dead directory entry '%s', error %d",
|
|
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c
|
|
index 3b4b4114f208..54d6db61106f 100644
|
|
--- a/fs/ubifs/orphan.c
|
|
+++ b/fs/ubifs/orphan.c
|
|
@@ -631,12 +631,17 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
|
|
ino_t inum;
|
|
int i, n, err, first = 1;
|
|
|
|
+ ino = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
|
|
+ if (!ino)
|
|
+ return -ENOMEM;
|
|
+
|
|
list_for_each_entry(snod, &sleb->nodes, list) {
|
|
if (snod->type != UBIFS_ORPH_NODE) {
|
|
ubifs_err(c, "invalid node type %d in orphan area at %d:%d",
|
|
snod->type, sleb->lnum, snod->offs);
|
|
ubifs_dump_node(c, snod->node);
|
|
- return -EINVAL;
|
|
+ err = -EINVAL;
|
|
+ goto out_free;
|
|
}
|
|
|
|
orph = snod->node;
|
|
@@ -663,20 +668,18 @@ static int do_kill_orphans(struct ubifs_info *c, struct ubifs_scan_leb *sleb,
|
|
ubifs_err(c, "out of order commit number %llu in orphan node at %d:%d",
|
|
cmt_no, sleb->lnum, snod->offs);
|
|
ubifs_dump_node(c, snod->node);
|
|
- return -EINVAL;
|
|
+ err = -EINVAL;
|
|
+ goto out_free;
|
|
}
|
|
dbg_rcvry("out of date LEB %d", sleb->lnum);
|
|
*outofdate = 1;
|
|
- return 0;
|
|
+ err = 0;
|
|
+ goto out_free;
|
|
}
|
|
|
|
if (first)
|
|
first = 0;
|
|
|
|
- ino = kmalloc(UBIFS_MAX_INO_NODE_SZ, GFP_NOFS);
|
|
- if (!ino)
|
|
- return -ENOMEM;
|
|
-
|
|
n = (le32_to_cpu(orph->ch.len) - UBIFS_ORPH_NODE_SZ) >> 3;
|
|
for (i = 0; i < n; i++) {
|
|
union ubifs_key key1, key2;
|
|
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
|
|
index 7d4547e5202d..5e1e8ec0589e 100644
|
|
--- a/fs/ubifs/super.c
|
|
+++ b/fs/ubifs/super.c
|
|
@@ -2267,10 +2267,8 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,
|
|
}
|
|
} else {
|
|
err = ubifs_fill_super(sb, data, flags & SB_SILENT ? 1 : 0);
|
|
- if (err) {
|
|
- kfree(c);
|
|
+ if (err)
|
|
goto out_deact;
|
|
- }
|
|
/* We do not support atime */
|
|
sb->s_flags |= SB_ACTIVE;
|
|
if (IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT))
|
|
diff --git a/include/asm-generic/cacheflush.h b/include/asm-generic/cacheflush.h
|
|
index a950a22c4890..cac7404b2bdd 100644
|
|
--- a/include/asm-generic/cacheflush.h
|
|
+++ b/include/asm-generic/cacheflush.h
|
|
@@ -11,71 +11,102 @@
|
|
* The cache doesn't need to be flushed when TLB entries change when
|
|
* the cache is mapped to physical memory, not virtual memory
|
|
*/
|
|
+#ifndef flush_cache_all
|
|
static inline void flush_cache_all(void)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_mm
|
|
static inline void flush_cache_mm(struct mm_struct *mm)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_dup_mm
|
|
static inline void flush_cache_dup_mm(struct mm_struct *mm)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_range
|
|
static inline void flush_cache_range(struct vm_area_struct *vma,
|
|
unsigned long start,
|
|
unsigned long end)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_page
|
|
static inline void flush_cache_page(struct vm_area_struct *vma,
|
|
unsigned long vmaddr,
|
|
unsigned long pfn)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_dcache_page
|
|
static inline void flush_dcache_page(struct page *page)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_dcache_mmap_lock
|
|
static inline void flush_dcache_mmap_lock(struct address_space *mapping)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_dcache_mmap_unlock
|
|
static inline void flush_dcache_mmap_unlock(struct address_space *mapping)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_icache_range
|
|
static inline void flush_icache_range(unsigned long start, unsigned long end)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_icache_page
|
|
static inline void flush_icache_page(struct vm_area_struct *vma,
|
|
struct page *page)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_icache_user_range
|
|
static inline void flush_icache_user_range(struct vm_area_struct *vma,
|
|
struct page *page,
|
|
unsigned long addr, int len)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_vmap
|
|
static inline void flush_cache_vmap(unsigned long start, unsigned long end)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
+#ifndef flush_cache_vunmap
|
|
static inline void flush_cache_vunmap(unsigned long start, unsigned long end)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
-#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
|
+#ifndef copy_to_user_page
|
|
+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
|
do { \
|
|
memcpy(dst, src, len); \
|
|
flush_icache_user_range(vma, page, vaddr, len); \
|
|
} while (0)
|
|
+#endif
|
|
+
|
|
+#ifndef copy_from_user_page
|
|
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
|
memcpy(dst, src, len)
|
|
+#endif
|
|
|
|
#endif /* __ASM_CACHEFLUSH_H */
|
|
diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h
|
|
index 734b6f7081b8..3175dfeaed2c 100644
|
|
--- a/include/crypto/internal/skcipher.h
|
|
+++ b/include/crypto/internal/skcipher.h
|
|
@@ -205,19 +205,6 @@ static inline unsigned int crypto_skcipher_alg_max_keysize(
|
|
return alg->max_keysize;
|
|
}
|
|
|
|
-static inline unsigned int crypto_skcipher_alg_chunksize(
|
|
- struct skcipher_alg *alg)
|
|
-{
|
|
- if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
|
|
- CRYPTO_ALG_TYPE_BLKCIPHER)
|
|
- return alg->base.cra_blocksize;
|
|
-
|
|
- if (alg->base.cra_ablkcipher.encrypt)
|
|
- return alg->base.cra_blocksize;
|
|
-
|
|
- return alg->chunksize;
|
|
-}
|
|
-
|
|
static inline unsigned int crypto_skcipher_alg_walksize(
|
|
struct skcipher_alg *alg)
|
|
{
|
|
@@ -231,23 +218,6 @@ static inline unsigned int crypto_skcipher_alg_walksize(
|
|
return alg->walksize;
|
|
}
|
|
|
|
-/**
|
|
- * crypto_skcipher_chunksize() - obtain chunk size
|
|
- * @tfm: cipher handle
|
|
- *
|
|
- * The block size is set to one for ciphers such as CTR. However,
|
|
- * you still need to provide incremental updates in multiples of
|
|
- * the underlying block size as the IV does not have sub-block
|
|
- * granularity. This is known in this API as the chunk size.
|
|
- *
|
|
- * Return: chunk size in bytes
|
|
- */
|
|
-static inline unsigned int crypto_skcipher_chunksize(
|
|
- struct crypto_skcipher *tfm)
|
|
-{
|
|
- return crypto_skcipher_alg_chunksize(crypto_skcipher_alg(tfm));
|
|
-}
|
|
-
|
|
/**
|
|
* crypto_skcipher_walksize() - obtain walk size
|
|
* @tfm: cipher handle
|
|
diff --git a/include/crypto/skcipher.h b/include/crypto/skcipher.h
|
|
index 37c164234d97..aada87916918 100644
|
|
--- a/include/crypto/skcipher.h
|
|
+++ b/include/crypto/skcipher.h
|
|
@@ -304,6 +304,36 @@ static inline unsigned int crypto_skcipher_blocksize(
|
|
return crypto_tfm_alg_blocksize(crypto_skcipher_tfm(tfm));
|
|
}
|
|
|
|
+static inline unsigned int crypto_skcipher_alg_chunksize(
|
|
+ struct skcipher_alg *alg)
|
|
+{
|
|
+ if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
|
|
+ CRYPTO_ALG_TYPE_BLKCIPHER)
|
|
+ return alg->base.cra_blocksize;
|
|
+
|
|
+ if (alg->base.cra_ablkcipher.encrypt)
|
|
+ return alg->base.cra_blocksize;
|
|
+
|
|
+ return alg->chunksize;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * crypto_skcipher_chunksize() - obtain chunk size
|
|
+ * @tfm: cipher handle
|
|
+ *
|
|
+ * The block size is set to one for ciphers such as CTR. However,
|
|
+ * you still need to provide incremental updates in multiples of
|
|
+ * the underlying block size as the IV does not have sub-block
|
|
+ * granularity. This is known in this API as the chunk size.
|
|
+ *
|
|
+ * Return: chunk size in bytes
|
|
+ */
|
|
+static inline unsigned int crypto_skcipher_chunksize(
|
|
+ struct crypto_skcipher *tfm)
|
|
+{
|
|
+ return crypto_skcipher_alg_chunksize(crypto_skcipher_alg(tfm));
|
|
+}
|
|
+
|
|
static inline unsigned int crypto_sync_skcipher_blocksize(
|
|
struct crypto_sync_skcipher *tfm)
|
|
{
|
|
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
|
|
index d4ee6e942562..38555435a64a 100644
|
|
--- a/include/linux/uaccess.h
|
|
+++ b/include/linux/uaccess.h
|
|
@@ -337,6 +337,18 @@ extern long __probe_user_read(void *dst, const void __user *src, size_t size);
|
|
extern long notrace probe_kernel_write(void *dst, const void *src, size_t size);
|
|
extern long notrace __probe_kernel_write(void *dst, const void *src, size_t size);
|
|
|
|
+/*
|
|
+ * probe_user_write(): safely attempt to write to a location in user space
|
|
+ * @dst: address to write to
|
|
+ * @src: pointer to the data that shall be written
|
|
+ * @size: size of the data chunk
|
|
+ *
|
|
+ * Safely write to address @dst from the buffer at @src. If a kernel fault
|
|
+ * happens, handle that and return -EFAULT.
|
|
+ */
|
|
+extern long notrace probe_user_write(void __user *dst, const void *src, size_t size);
|
|
+extern long notrace __probe_user_write(void __user *dst, const void *src, size_t size);
|
|
+
|
|
extern long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count);
|
|
extern long strncpy_from_unsafe_user(char *dst, const void __user *unsafe_addr,
|
|
long count);
|
|
diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
|
|
index 31f76b6abf71..bbdd1542d6f1 100644
|
|
--- a/include/sound/simple_card_utils.h
|
|
+++ b/include/sound/simple_card_utils.h
|
|
@@ -8,6 +8,7 @@
|
|
#ifndef __SIMPLE_CARD_UTILS_H
|
|
#define __SIMPLE_CARD_UTILS_H
|
|
|
|
+#include <linux/clk.h>
|
|
#include <sound/soc.h>
|
|
|
|
#define asoc_simple_init_hp(card, sjack, prefix) \
|
|
diff --git a/include/trace/events/afs.h b/include/trace/events/afs.h
|
|
index d5ec4fac82ae..564ba1b5cf57 100644
|
|
--- a/include/trace/events/afs.h
|
|
+++ b/include/trace/events/afs.h
|
|
@@ -915,9 +915,9 @@ TRACE_EVENT(afs_call_state,
|
|
|
|
TRACE_EVENT(afs_lookup,
|
|
TP_PROTO(struct afs_vnode *dvnode, const struct qstr *name,
|
|
- struct afs_vnode *vnode),
|
|
+ struct afs_fid *fid),
|
|
|
|
- TP_ARGS(dvnode, name, vnode),
|
|
+ TP_ARGS(dvnode, name, fid),
|
|
|
|
TP_STRUCT__entry(
|
|
__field_struct(struct afs_fid, dfid )
|
|
@@ -928,13 +928,7 @@ TRACE_EVENT(afs_lookup,
|
|
TP_fast_assign(
|
|
int __len = min_t(int, name->len, 23);
|
|
__entry->dfid = dvnode->fid;
|
|
- if (vnode) {
|
|
- __entry->fid = vnode->fid;
|
|
- } else {
|
|
- __entry->fid.vid = 0;
|
|
- __entry->fid.vnode = 0;
|
|
- __entry->fid.unique = 0;
|
|
- }
|
|
+ __entry->fid = *fid;
|
|
memcpy(__entry->name, name->name, __len);
|
|
__entry->name[__len] = 0;
|
|
),
|
|
diff --git a/include/trace/events/rpcrdma.h b/include/trace/events/rpcrdma.h
|
|
index a13830616107..7fd11ec1c9a4 100644
|
|
--- a/include/trace/events/rpcrdma.h
|
|
+++ b/include/trace/events/rpcrdma.h
|
|
@@ -735,6 +735,31 @@ TRACE_EVENT(xprtrdma_post_recvs,
|
|
)
|
|
);
|
|
|
|
+TRACE_EVENT(xprtrdma_post_linv,
|
|
+ TP_PROTO(
|
|
+ const struct rpcrdma_req *req,
|
|
+ int status
|
|
+ ),
|
|
+
|
|
+ TP_ARGS(req, status),
|
|
+
|
|
+ TP_STRUCT__entry(
|
|
+ __field(const void *, req)
|
|
+ __field(int, status)
|
|
+ __field(u32, xid)
|
|
+ ),
|
|
+
|
|
+ TP_fast_assign(
|
|
+ __entry->req = req;
|
|
+ __entry->status = status;
|
|
+ __entry->xid = be32_to_cpu(req->rl_slot.rq_xid);
|
|
+ ),
|
|
+
|
|
+ TP_printk("req=%p xid=0x%08x status=%d",
|
|
+ __entry->req, __entry->xid, __entry->status
|
|
+ )
|
|
+);
|
|
+
|
|
/**
|
|
** Completion events
|
|
**/
|
|
diff --git a/include/uapi/rdma/nes-abi.h b/include/uapi/rdma/nes-abi.h
|
|
deleted file mode 100644
|
|
index f80495baa969..000000000000
|
|
--- a/include/uapi/rdma/nes-abi.h
|
|
+++ /dev/null
|
|
@@ -1,115 +0,0 @@
|
|
-/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */
|
|
-/*
|
|
- * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved.
|
|
- * Copyright (c) 2005 Topspin Communications. All rights reserved.
|
|
- * Copyright (c) 2005 Cisco Systems. All rights reserved.
|
|
- * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
|
- *
|
|
- * This software is available to you under a choice of one of two
|
|
- * licenses. You may choose to be licensed under the terms of the GNU
|
|
- * General Public License (GPL) Version 2, available from the file
|
|
- * COPYING in the main directory of this source tree, or the
|
|
- * OpenIB.org BSD license below:
|
|
- *
|
|
- * Redistribution and use in source and binary forms, with or
|
|
- * without modification, are permitted provided that the following
|
|
- * conditions are met:
|
|
- *
|
|
- * - Redistributions of source code must retain the above
|
|
- * copyright notice, this list of conditions and the following
|
|
- * disclaimer.
|
|
- *
|
|
- * - Redistributions in binary form must reproduce the above
|
|
- * copyright notice, this list of conditions and the following
|
|
- * disclaimer in the documentation and/or other materials
|
|
- * provided with the distribution.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
- * SOFTWARE.
|
|
- *
|
|
- */
|
|
-
|
|
-#ifndef NES_ABI_USER_H
|
|
-#define NES_ABI_USER_H
|
|
-
|
|
-#include <linux/types.h>
|
|
-
|
|
-#define NES_ABI_USERSPACE_VER 2
|
|
-#define NES_ABI_KERNEL_VER 2
|
|
-
|
|
-/*
|
|
- * Make sure that all structs defined in this file remain laid out so
|
|
- * that they pack the same way on 32-bit and 64-bit architectures (to
|
|
- * avoid incompatibility between 32-bit userspace and 64-bit kernels).
|
|
- * In particular do not use pointer types -- pass pointers in __u64
|
|
- * instead.
|
|
- */
|
|
-
|
|
-struct nes_alloc_ucontext_req {
|
|
- __u32 reserved32;
|
|
- __u8 userspace_ver;
|
|
- __u8 reserved8[3];
|
|
-};
|
|
-
|
|
-struct nes_alloc_ucontext_resp {
|
|
- __u32 max_pds; /* maximum pds allowed for this user process */
|
|
- __u32 max_qps; /* maximum qps allowed for this user process */
|
|
- __u32 wq_size; /* size of the WQs (sq+rq) allocated to the mmaped area */
|
|
- __u8 virtwq; /* flag to indicate if virtual WQ are to be used or not */
|
|
- __u8 kernel_ver;
|
|
- __u8 reserved[2];
|
|
-};
|
|
-
|
|
-struct nes_alloc_pd_resp {
|
|
- __u32 pd_id;
|
|
- __u32 mmap_db_index;
|
|
-};
|
|
-
|
|
-struct nes_create_cq_req {
|
|
- __aligned_u64 user_cq_buffer;
|
|
- __u32 mcrqf;
|
|
- __u8 reserved[4];
|
|
-};
|
|
-
|
|
-struct nes_create_qp_req {
|
|
- __aligned_u64 user_wqe_buffers;
|
|
- __aligned_u64 user_qp_buffer;
|
|
-};
|
|
-
|
|
-enum iwnes_memreg_type {
|
|
- IWNES_MEMREG_TYPE_MEM = 0x0000,
|
|
- IWNES_MEMREG_TYPE_QP = 0x0001,
|
|
- IWNES_MEMREG_TYPE_CQ = 0x0002,
|
|
- IWNES_MEMREG_TYPE_MW = 0x0003,
|
|
- IWNES_MEMREG_TYPE_FMR = 0x0004,
|
|
- IWNES_MEMREG_TYPE_FMEM = 0x0005,
|
|
-};
|
|
-
|
|
-struct nes_mem_reg_req {
|
|
- __u32 reg_type; /* indicates if id is memory, QP or CQ */
|
|
- __u32 reserved;
|
|
-};
|
|
-
|
|
-struct nes_create_cq_resp {
|
|
- __u32 cq_id;
|
|
- __u32 cq_size;
|
|
- __u32 mmap_db_index;
|
|
- __u32 reserved;
|
|
-};
|
|
-
|
|
-struct nes_create_qp_resp {
|
|
- __u32 qp_id;
|
|
- __u32 actual_sq_size;
|
|
- __u32 actual_rq_size;
|
|
- __u32 mmap_sq_db_index;
|
|
- __u32 mmap_rq_db_index;
|
|
- __u32 nes_drv_opt;
|
|
-};
|
|
-
|
|
-#endif /* NES_ABI_USER_H */
|
|
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
|
|
index a3eaf08e7dd3..8bd69062fbe5 100644
|
|
--- a/kernel/bpf/cgroup.c
|
|
+++ b/kernel/bpf/cgroup.c
|
|
@@ -35,8 +35,8 @@ void cgroup_bpf_offline(struct cgroup *cgrp)
|
|
*/
|
|
static void cgroup_bpf_release(struct work_struct *work)
|
|
{
|
|
- struct cgroup *cgrp = container_of(work, struct cgroup,
|
|
- bpf.release_work);
|
|
+ struct cgroup *p, *cgrp = container_of(work, struct cgroup,
|
|
+ bpf.release_work);
|
|
enum bpf_cgroup_storage_type stype;
|
|
struct bpf_prog_array *old_array;
|
|
unsigned int type;
|
|
@@ -65,6 +65,9 @@ static void cgroup_bpf_release(struct work_struct *work)
|
|
|
|
mutex_unlock(&cgroup_mutex);
|
|
|
|
+ for (p = cgroup_parent(cgrp); p; p = cgroup_parent(p))
|
|
+ cgroup_bpf_put(p);
|
|
+
|
|
percpu_ref_exit(&cgrp->bpf.refcnt);
|
|
cgroup_put(cgrp);
|
|
}
|
|
@@ -199,6 +202,7 @@ int cgroup_bpf_inherit(struct cgroup *cgrp)
|
|
*/
|
|
#define NR ARRAY_SIZE(cgrp->bpf.effective)
|
|
struct bpf_prog_array *arrays[NR] = {};
|
|
+ struct cgroup *p;
|
|
int ret, i;
|
|
|
|
ret = percpu_ref_init(&cgrp->bpf.refcnt, cgroup_bpf_release_fn, 0,
|
|
@@ -206,6 +210,9 @@ int cgroup_bpf_inherit(struct cgroup *cgrp)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ for (p = cgroup_parent(cgrp); p; p = cgroup_parent(p))
|
|
+ cgroup_bpf_get(p);
|
|
+
|
|
for (i = 0; i < NR; i++)
|
|
INIT_LIST_HEAD(&cgrp->bpf.progs[i]);
|
|
|
|
diff --git a/kernel/cred.c b/kernel/cred.c
|
|
index 9ed51b70ed80..809a985b1793 100644
|
|
--- a/kernel/cred.c
|
|
+++ b/kernel/cred.c
|
|
@@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk)
|
|
put_cred(cred);
|
|
|
|
#ifdef CONFIG_KEYS_REQUEST_CACHE
|
|
- key_put(current->cached_requested_key);
|
|
- current->cached_requested_key = NULL;
|
|
+ key_put(tsk->cached_requested_key);
|
|
+ tsk->cached_requested_key = NULL;
|
|
#endif
|
|
}
|
|
|
|
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
|
|
index 44bd08f2443b..89bdac61233d 100644
|
|
--- a/kernel/trace/bpf_trace.c
|
|
+++ b/kernel/trace/bpf_trace.c
|
|
@@ -163,7 +163,7 @@ static const struct bpf_func_proto bpf_probe_read_proto = {
|
|
.arg3_type = ARG_ANYTHING,
|
|
};
|
|
|
|
-BPF_CALL_3(bpf_probe_write_user, void *, unsafe_ptr, const void *, src,
|
|
+BPF_CALL_3(bpf_probe_write_user, void __user *, unsafe_ptr, const void *, src,
|
|
u32, size)
|
|
{
|
|
/*
|
|
@@ -186,10 +186,8 @@ BPF_CALL_3(bpf_probe_write_user, void *, unsafe_ptr, const void *, src,
|
|
return -EPERM;
|
|
if (unlikely(!nmi_uaccess_okay()))
|
|
return -EPERM;
|
|
- if (!access_ok(unsafe_ptr, size))
|
|
- return -EPERM;
|
|
|
|
- return probe_kernel_write(unsafe_ptr, src, size);
|
|
+ return probe_user_write(unsafe_ptr, src, size);
|
|
}
|
|
|
|
static const struct bpf_func_proto bpf_probe_write_user_proto = {
|
|
diff --git a/mm/maccess.c b/mm/maccess.c
|
|
index d065736f6b87..2d3c3d01064c 100644
|
|
--- a/mm/maccess.c
|
|
+++ b/mm/maccess.c
|
|
@@ -18,6 +18,18 @@ probe_read_common(void *dst, const void __user *src, size_t size)
|
|
return ret ? -EFAULT : 0;
|
|
}
|
|
|
|
+static __always_inline long
|
|
+probe_write_common(void __user *dst, const void *src, size_t size)
|
|
+{
|
|
+ long ret;
|
|
+
|
|
+ pagefault_disable();
|
|
+ ret = __copy_to_user_inatomic(dst, src, size);
|
|
+ pagefault_enable();
|
|
+
|
|
+ return ret ? -EFAULT : 0;
|
|
+}
|
|
+
|
|
/**
|
|
* probe_kernel_read(): safely attempt to read from a kernel-space location
|
|
* @dst: pointer to the buffer that shall take the data
|
|
@@ -85,6 +97,7 @@ EXPORT_SYMBOL_GPL(probe_user_read);
|
|
* Safely write to address @dst from the buffer at @src. If a kernel fault
|
|
* happens, handle that and return -EFAULT.
|
|
*/
|
|
+
|
|
long __weak probe_kernel_write(void *dst, const void *src, size_t size)
|
|
__attribute__((alias("__probe_kernel_write")));
|
|
|
|
@@ -94,15 +107,39 @@ long __probe_kernel_write(void *dst, const void *src, size_t size)
|
|
mm_segment_t old_fs = get_fs();
|
|
|
|
set_fs(KERNEL_DS);
|
|
- pagefault_disable();
|
|
- ret = __copy_to_user_inatomic((__force void __user *)dst, src, size);
|
|
- pagefault_enable();
|
|
+ ret = probe_write_common((__force void __user *)dst, src, size);
|
|
set_fs(old_fs);
|
|
|
|
- return ret ? -EFAULT : 0;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(probe_kernel_write);
|
|
|
|
+/**
|
|
+ * probe_user_write(): safely attempt to write to a user-space location
|
|
+ * @dst: address to write to
|
|
+ * @src: pointer to the data that shall be written
|
|
+ * @size: size of the data chunk
|
|
+ *
|
|
+ * Safely write to address @dst from the buffer at @src. If a kernel fault
|
|
+ * happens, handle that and return -EFAULT.
|
|
+ */
|
|
+
|
|
+long __weak probe_user_write(void __user *dst, const void *src, size_t size)
|
|
+ __attribute__((alias("__probe_user_write")));
|
|
+
|
|
+long __probe_user_write(void __user *dst, const void *src, size_t size)
|
|
+{
|
|
+ long ret = -EFAULT;
|
|
+ mm_segment_t old_fs = get_fs();
|
|
+
|
|
+ set_fs(USER_DS);
|
|
+ if (access_ok(dst, size))
|
|
+ ret = probe_write_common(dst, src, size);
|
|
+ set_fs(old_fs);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(probe_user_write);
|
|
|
|
/**
|
|
* strncpy_from_unsafe: - Copy a NUL terminated string from unsafe address.
|
|
diff --git a/net/core/skmsg.c b/net/core/skmsg.c
|
|
index 0675d022584e..ded2d5227678 100644
|
|
--- a/net/core/skmsg.c
|
|
+++ b/net/core/skmsg.c
|
|
@@ -793,15 +793,18 @@ static void sk_psock_strp_data_ready(struct sock *sk)
|
|
static void sk_psock_write_space(struct sock *sk)
|
|
{
|
|
struct sk_psock *psock;
|
|
- void (*write_space)(struct sock *sk);
|
|
+ void (*write_space)(struct sock *sk) = NULL;
|
|
|
|
rcu_read_lock();
|
|
psock = sk_psock(sk);
|
|
- if (likely(psock && sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED)))
|
|
- schedule_work(&psock->work);
|
|
- write_space = psock->saved_write_space;
|
|
+ if (likely(psock)) {
|
|
+ if (sk_psock_test_state(psock, SK_PSOCK_TX_ENABLED))
|
|
+ schedule_work(&psock->work);
|
|
+ write_space = psock->saved_write_space;
|
|
+ }
|
|
rcu_read_unlock();
|
|
- write_space(sk);
|
|
+ if (write_space)
|
|
+ write_space(sk);
|
|
}
|
|
|
|
int sk_psock_init_strp(struct sock *sk, struct sk_psock *psock)
|
|
diff --git a/net/hsr/hsr_debugfs.c b/net/hsr/hsr_debugfs.c
|
|
index 6618a9d8e58e..d5f709b940ff 100644
|
|
--- a/net/hsr/hsr_debugfs.c
|
|
+++ b/net/hsr/hsr_debugfs.c
|
|
@@ -20,6 +20,8 @@
|
|
#include "hsr_main.h"
|
|
#include "hsr_framereg.h"
|
|
|
|
+static struct dentry *hsr_debugfs_root_dir;
|
|
+
|
|
static void print_mac_address(struct seq_file *sfp, unsigned char *mac)
|
|
{
|
|
seq_printf(sfp, "%02x:%02x:%02x:%02x:%02x:%02x:",
|
|
@@ -63,6 +65,19 @@ hsr_node_table_open(struct inode *inode, struct file *filp)
|
|
return single_open(filp, hsr_node_table_show, inode->i_private);
|
|
}
|
|
|
|
+void hsr_debugfs_rename(struct net_device *dev)
|
|
+{
|
|
+ struct hsr_priv *priv = netdev_priv(dev);
|
|
+ struct dentry *d;
|
|
+
|
|
+ d = debugfs_rename(hsr_debugfs_root_dir, priv->node_tbl_root,
|
|
+ hsr_debugfs_root_dir, dev->name);
|
|
+ if (IS_ERR(d))
|
|
+ netdev_warn(dev, "failed to rename\n");
|
|
+ else
|
|
+ priv->node_tbl_root = d;
|
|
+}
|
|
+
|
|
static const struct file_operations hsr_fops = {
|
|
.open = hsr_node_table_open,
|
|
.read = seq_read,
|
|
@@ -81,9 +96,9 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev)
|
|
{
|
|
struct dentry *de = NULL;
|
|
|
|
- de = debugfs_create_dir(hsr_dev->name, NULL);
|
|
+ de = debugfs_create_dir(hsr_dev->name, hsr_debugfs_root_dir);
|
|
if (IS_ERR(de)) {
|
|
- pr_err("Cannot create hsr debugfs root\n");
|
|
+ pr_err("Cannot create hsr debugfs directory\n");
|
|
return;
|
|
}
|
|
|
|
@@ -93,7 +108,7 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev)
|
|
priv->node_tbl_root, priv,
|
|
&hsr_fops);
|
|
if (IS_ERR(de)) {
|
|
- pr_err("Cannot create hsr node_table directory\n");
|
|
+ pr_err("Cannot create hsr node_table file\n");
|
|
debugfs_remove(priv->node_tbl_root);
|
|
priv->node_tbl_root = NULL;
|
|
return;
|
|
@@ -115,3 +130,18 @@ hsr_debugfs_term(struct hsr_priv *priv)
|
|
debugfs_remove(priv->node_tbl_root);
|
|
priv->node_tbl_root = NULL;
|
|
}
|
|
+
|
|
+void hsr_debugfs_create_root(void)
|
|
+{
|
|
+ hsr_debugfs_root_dir = debugfs_create_dir("hsr", NULL);
|
|
+ if (IS_ERR(hsr_debugfs_root_dir)) {
|
|
+ pr_err("Cannot create hsr debugfs root directory\n");
|
|
+ hsr_debugfs_root_dir = NULL;
|
|
+ }
|
|
+}
|
|
+
|
|
+void hsr_debugfs_remove_root(void)
|
|
+{
|
|
+ /* debugfs_remove() internally checks NULL and ERROR */
|
|
+ debugfs_remove(hsr_debugfs_root_dir);
|
|
+}
|
|
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c
|
|
index 62c03f0d0079..c7bd6c49fadf 100644
|
|
--- a/net/hsr/hsr_device.c
|
|
+++ b/net/hsr/hsr_device.c
|
|
@@ -272,6 +272,8 @@ static void send_hsr_supervision_frame(struct hsr_port *master,
|
|
skb->dev->dev_addr, skb->len) <= 0)
|
|
goto out;
|
|
skb_reset_mac_header(skb);
|
|
+ skb_reset_network_header(skb);
|
|
+ skb_reset_transport_header(skb);
|
|
|
|
if (hsr_ver > 0) {
|
|
hsr_tag = skb_put(skb, sizeof(struct hsr_tag));
|
|
diff --git a/net/hsr/hsr_main.c b/net/hsr/hsr_main.c
|
|
index 6deb8fa8d5c8..9e389accbfc7 100644
|
|
--- a/net/hsr/hsr_main.c
|
|
+++ b/net/hsr/hsr_main.c
|
|
@@ -45,6 +45,10 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
|
|
case NETDEV_CHANGE: /* Link (carrier) state changes */
|
|
hsr_check_carrier_and_operstate(hsr);
|
|
break;
|
|
+ case NETDEV_CHANGENAME:
|
|
+ if (is_hsr_master(dev))
|
|
+ hsr_debugfs_rename(dev);
|
|
+ break;
|
|
case NETDEV_CHANGEADDR:
|
|
if (port->type == HSR_PT_MASTER) {
|
|
/* This should not happen since there's no
|
|
@@ -123,6 +127,7 @@ static void __exit hsr_exit(void)
|
|
{
|
|
unregister_netdevice_notifier(&hsr_nb);
|
|
hsr_netlink_exit();
|
|
+ hsr_debugfs_remove_root();
|
|
}
|
|
|
|
module_init(hsr_init);
|
|
diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h
|
|
index 9ec38e33b8b1..d40de84a637f 100644
|
|
--- a/net/hsr/hsr_main.h
|
|
+++ b/net/hsr/hsr_main.h
|
|
@@ -185,14 +185,24 @@ static inline u16 hsr_get_skb_sequence_nr(struct sk_buff *skb)
|
|
}
|
|
|
|
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
|
+void hsr_debugfs_rename(struct net_device *dev);
|
|
void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev);
|
|
void hsr_debugfs_term(struct hsr_priv *priv);
|
|
+void hsr_debugfs_create_root(void);
|
|
+void hsr_debugfs_remove_root(void);
|
|
#else
|
|
+static inline void void hsr_debugfs_rename(struct net_device *dev)
|
|
+{
|
|
+}
|
|
static inline void hsr_debugfs_init(struct hsr_priv *priv,
|
|
struct net_device *hsr_dev)
|
|
{}
|
|
static inline void hsr_debugfs_term(struct hsr_priv *priv)
|
|
{}
|
|
+static inline void hsr_debugfs_create_root(void)
|
|
+{}
|
|
+static inline void hsr_debugfs_remove_root(void)
|
|
+{}
|
|
#endif
|
|
|
|
#endif /* __HSR_PRIVATE_H */
|
|
diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c
|
|
index 8f8337f893ba..8dc0547f01d0 100644
|
|
--- a/net/hsr/hsr_netlink.c
|
|
+++ b/net/hsr/hsr_netlink.c
|
|
@@ -476,6 +476,7 @@ int __init hsr_netlink_init(void)
|
|
if (rc)
|
|
goto fail_genl_register_family;
|
|
|
|
+ hsr_debugfs_create_root();
|
|
return 0;
|
|
|
|
fail_genl_register_family:
|
|
diff --git a/net/netfilter/nf_tables_offload.c b/net/netfilter/nf_tables_offload.c
|
|
index e743f811245f..96a64e7594a5 100644
|
|
--- a/net/netfilter/nf_tables_offload.c
|
|
+++ b/net/netfilter/nf_tables_offload.c
|
|
@@ -358,14 +358,14 @@ int nft_flow_rule_offload_commit(struct net *net)
|
|
continue;
|
|
|
|
if (trans->ctx.flags & NLM_F_REPLACE ||
|
|
- !(trans->ctx.flags & NLM_F_APPEND))
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
+ !(trans->ctx.flags & NLM_F_APPEND)) {
|
|
+ err = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
err = nft_flow_offload_rule(trans->ctx.chain,
|
|
nft_trans_rule(trans),
|
|
nft_trans_flow_rule(trans),
|
|
FLOW_CLS_REPLACE);
|
|
- nft_flow_rule_destroy(nft_trans_flow_rule(trans));
|
|
break;
|
|
case NFT_MSG_DELRULE:
|
|
if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD))
|
|
@@ -379,7 +379,23 @@ int nft_flow_rule_offload_commit(struct net *net)
|
|
}
|
|
|
|
if (err)
|
|
- return err;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ list_for_each_entry(trans, &net->nft.commit_list, list) {
|
|
+ if (trans->ctx.family != NFPROTO_NETDEV)
|
|
+ continue;
|
|
+
|
|
+ switch (trans->msg_type) {
|
|
+ case NFT_MSG_NEWRULE:
|
|
+ if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD))
|
|
+ continue;
|
|
+
|
|
+ nft_flow_rule_destroy(nft_trans_flow_rule(trans));
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
}
|
|
|
|
return err;
|
|
diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c
|
|
index f29bbc74c4bf..ff5ac173e897 100644
|
|
--- a/net/netfilter/nft_flow_offload.c
|
|
+++ b/net/netfilter/nft_flow_offload.c
|
|
@@ -197,9 +197,6 @@ static void nft_flow_offload_activate(const struct nft_ctx *ctx,
|
|
static void nft_flow_offload_destroy(const struct nft_ctx *ctx,
|
|
const struct nft_expr *expr)
|
|
{
|
|
- struct nft_flow_offload *priv = nft_expr_priv(expr);
|
|
-
|
|
- priv->flowtable->use--;
|
|
nf_ct_netns_put(ctx->net, ctx->family);
|
|
}
|
|
|
|
diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c
|
|
index 317e3a9e8c5b..dda1e55d5801 100644
|
|
--- a/net/netfilter/nft_meta.c
|
|
+++ b/net/netfilter/nft_meta.c
|
|
@@ -33,19 +33,19 @@
|
|
|
|
static DEFINE_PER_CPU(struct rnd_state, nft_prandom_state);
|
|
|
|
-static u8 nft_meta_weekday(unsigned long secs)
|
|
+static u8 nft_meta_weekday(time64_t secs)
|
|
{
|
|
unsigned int dse;
|
|
u8 wday;
|
|
|
|
secs -= NFT_META_SECS_PER_MINUTE * sys_tz.tz_minuteswest;
|
|
- dse = secs / NFT_META_SECS_PER_DAY;
|
|
+ dse = div_u64(secs, NFT_META_SECS_PER_DAY);
|
|
wday = (4 + dse) % NFT_META_DAYS_PER_WEEK;
|
|
|
|
return wday;
|
|
}
|
|
|
|
-static u32 nft_meta_hour(unsigned long secs)
|
|
+static u32 nft_meta_hour(time64_t secs)
|
|
{
|
|
struct tm tm;
|
|
|
|
@@ -250,10 +250,10 @@ void nft_meta_get_eval(const struct nft_expr *expr,
|
|
nft_reg_store64(dest, ktime_get_real_ns());
|
|
break;
|
|
case NFT_META_TIME_DAY:
|
|
- nft_reg_store8(dest, nft_meta_weekday(get_seconds()));
|
|
+ nft_reg_store8(dest, nft_meta_weekday(ktime_get_real_seconds()));
|
|
break;
|
|
case NFT_META_TIME_HOUR:
|
|
- *dest = nft_meta_hour(get_seconds());
|
|
+ *dest = nft_meta_hour(ktime_get_real_seconds());
|
|
break;
|
|
default:
|
|
WARN_ON(1);
|
|
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
|
|
index 7c7d10f2e0c1..5e99df80e80a 100644
|
|
--- a/net/rxrpc/ar-internal.h
|
|
+++ b/net/rxrpc/ar-internal.h
|
|
@@ -209,6 +209,7 @@ struct rxrpc_skb_priv {
|
|
struct rxrpc_security {
|
|
const char *name; /* name of this service */
|
|
u8 security_index; /* security type provided */
|
|
+ u32 no_key_abort; /* Abort code indicating no key */
|
|
|
|
/* Initialise a security service */
|
|
int (*init)(void);
|
|
@@ -977,8 +978,9 @@ static inline void rxrpc_reduce_conn_timer(struct rxrpc_connection *conn,
|
|
struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *,
|
|
struct sk_buff *);
|
|
struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *, gfp_t);
|
|
-void rxrpc_new_incoming_connection(struct rxrpc_sock *,
|
|
- struct rxrpc_connection *, struct sk_buff *);
|
|
+void rxrpc_new_incoming_connection(struct rxrpc_sock *, struct rxrpc_connection *,
|
|
+ const struct rxrpc_security *, struct key *,
|
|
+ struct sk_buff *);
|
|
void rxrpc_unpublish_service_conn(struct rxrpc_connection *);
|
|
|
|
/*
|
|
@@ -1103,7 +1105,9 @@ extern const struct rxrpc_security rxkad;
|
|
int __init rxrpc_init_security(void);
|
|
void rxrpc_exit_security(void);
|
|
int rxrpc_init_client_conn_security(struct rxrpc_connection *);
|
|
-int rxrpc_init_server_conn_security(struct rxrpc_connection *);
|
|
+bool rxrpc_look_up_server_security(struct rxrpc_local *, struct rxrpc_sock *,
|
|
+ const struct rxrpc_security **, struct key **,
|
|
+ struct sk_buff *);
|
|
|
|
/*
|
|
* sendmsg.c
|
|
diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c
|
|
index 135bf5cd8dd5..70e44abf106c 100644
|
|
--- a/net/rxrpc/call_accept.c
|
|
+++ b/net/rxrpc/call_accept.c
|
|
@@ -239,6 +239,22 @@ void rxrpc_discard_prealloc(struct rxrpc_sock *rx)
|
|
kfree(b);
|
|
}
|
|
|
|
+/*
|
|
+ * Ping the other end to fill our RTT cache and to retrieve the rwind
|
|
+ * and MTU parameters.
|
|
+ */
|
|
+static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb)
|
|
+{
|
|
+ struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
+ ktime_t now = skb->tstamp;
|
|
+
|
|
+ if (call->peer->rtt_usage < 3 ||
|
|
+ ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now))
|
|
+ rxrpc_propose_ACK(call, RXRPC_ACK_PING, sp->hdr.serial,
|
|
+ true, true,
|
|
+ rxrpc_propose_ack_ping_for_params);
|
|
+}
|
|
+
|
|
/*
|
|
* Allocate a new incoming call from the prealloc pool, along with a connection
|
|
* and a peer as necessary.
|
|
@@ -247,6 +263,8 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx,
|
|
struct rxrpc_local *local,
|
|
struct rxrpc_peer *peer,
|
|
struct rxrpc_connection *conn,
|
|
+ const struct rxrpc_security *sec,
|
|
+ struct key *key,
|
|
struct sk_buff *skb)
|
|
{
|
|
struct rxrpc_backlog *b = rx->backlog;
|
|
@@ -294,7 +312,7 @@ static struct rxrpc_call *rxrpc_alloc_incoming_call(struct rxrpc_sock *rx,
|
|
conn->params.local = rxrpc_get_local(local);
|
|
conn->params.peer = peer;
|
|
rxrpc_see_connection(conn);
|
|
- rxrpc_new_incoming_connection(rx, conn, skb);
|
|
+ rxrpc_new_incoming_connection(rx, conn, sec, key, skb);
|
|
} else {
|
|
rxrpc_get_connection(conn);
|
|
}
|
|
@@ -333,9 +351,11 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|
struct sk_buff *skb)
|
|
{
|
|
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
+ const struct rxrpc_security *sec = NULL;
|
|
struct rxrpc_connection *conn;
|
|
struct rxrpc_peer *peer = NULL;
|
|
- struct rxrpc_call *call;
|
|
+ struct rxrpc_call *call = NULL;
|
|
+ struct key *key = NULL;
|
|
|
|
_enter("");
|
|
|
|
@@ -346,9 +366,7 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|
sp->hdr.seq, RX_INVALID_OPERATION, ESHUTDOWN);
|
|
skb->mark = RXRPC_SKB_MARK_REJECT_ABORT;
|
|
skb->priority = RX_INVALID_OPERATION;
|
|
- _leave(" = NULL [close]");
|
|
- call = NULL;
|
|
- goto out;
|
|
+ goto no_call;
|
|
}
|
|
|
|
/* The peer, connection and call may all have sprung into existence due
|
|
@@ -358,29 +376,19 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|
*/
|
|
conn = rxrpc_find_connection_rcu(local, skb, &peer);
|
|
|
|
- call = rxrpc_alloc_incoming_call(rx, local, peer, conn, skb);
|
|
+ if (!conn && !rxrpc_look_up_server_security(local, rx, &sec, &key, skb))
|
|
+ goto no_call;
|
|
+
|
|
+ call = rxrpc_alloc_incoming_call(rx, local, peer, conn, sec, key, skb);
|
|
+ key_put(key);
|
|
if (!call) {
|
|
skb->mark = RXRPC_SKB_MARK_REJECT_BUSY;
|
|
- _leave(" = NULL [busy]");
|
|
- call = NULL;
|
|
- goto out;
|
|
+ goto no_call;
|
|
}
|
|
|
|
trace_rxrpc_receive(call, rxrpc_receive_incoming,
|
|
sp->hdr.serial, sp->hdr.seq);
|
|
|
|
- /* Lock the call to prevent rxrpc_kernel_send/recv_data() and
|
|
- * sendmsg()/recvmsg() inconveniently stealing the mutex once the
|
|
- * notification is generated.
|
|
- *
|
|
- * The BUG should never happen because the kernel should be well
|
|
- * behaved enough not to access the call before the first notification
|
|
- * event and userspace is prevented from doing so until the state is
|
|
- * appropriate.
|
|
- */
|
|
- if (!mutex_trylock(&call->user_mutex))
|
|
- BUG();
|
|
-
|
|
/* Make the call live. */
|
|
rxrpc_incoming_call(rx, call, skb);
|
|
conn = call->conn;
|
|
@@ -421,6 +429,9 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|
BUG();
|
|
}
|
|
spin_unlock(&conn->state_lock);
|
|
+ spin_unlock(&rx->incoming_lock);
|
|
+
|
|
+ rxrpc_send_ping(call, skb);
|
|
|
|
if (call->state == RXRPC_CALL_SERVER_ACCEPTING)
|
|
rxrpc_notify_socket(call);
|
|
@@ -433,9 +444,12 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local,
|
|
rxrpc_put_call(call, rxrpc_call_put);
|
|
|
|
_leave(" = %p{%d}", call, call->debug_id);
|
|
-out:
|
|
- spin_unlock(&rx->incoming_lock);
|
|
return call;
|
|
+
|
|
+no_call:
|
|
+ spin_unlock(&rx->incoming_lock);
|
|
+ _leave(" = NULL [%u]", skb->mark);
|
|
+ return NULL;
|
|
}
|
|
|
|
/*
|
|
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c
|
|
index a1ceef4f5cd0..808a4723f868 100644
|
|
--- a/net/rxrpc/conn_event.c
|
|
+++ b/net/rxrpc/conn_event.c
|
|
@@ -376,21 +376,7 @@ static void rxrpc_secure_connection(struct rxrpc_connection *conn)
|
|
_enter("{%d}", conn->debug_id);
|
|
|
|
ASSERT(conn->security_ix != 0);
|
|
-
|
|
- if (!conn->params.key) {
|
|
- _debug("set up security");
|
|
- ret = rxrpc_init_server_conn_security(conn);
|
|
- switch (ret) {
|
|
- case 0:
|
|
- break;
|
|
- case -ENOENT:
|
|
- abort_code = RX_CALL_DEAD;
|
|
- goto abort;
|
|
- default:
|
|
- abort_code = RXKADNOAUTH;
|
|
- goto abort;
|
|
- }
|
|
- }
|
|
+ ASSERT(conn->server_key);
|
|
|
|
if (conn->security->issue_challenge(conn) < 0) {
|
|
abort_code = RX_CALL_DEAD;
|
|
diff --git a/net/rxrpc/conn_service.c b/net/rxrpc/conn_service.c
|
|
index 123d6ceab15c..21da48e3d2e5 100644
|
|
--- a/net/rxrpc/conn_service.c
|
|
+++ b/net/rxrpc/conn_service.c
|
|
@@ -148,6 +148,8 @@ struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *rxn
|
|
*/
|
|
void rxrpc_new_incoming_connection(struct rxrpc_sock *rx,
|
|
struct rxrpc_connection *conn,
|
|
+ const struct rxrpc_security *sec,
|
|
+ struct key *key,
|
|
struct sk_buff *skb)
|
|
{
|
|
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
@@ -160,6 +162,8 @@ void rxrpc_new_incoming_connection(struct rxrpc_sock *rx,
|
|
conn->service_id = sp->hdr.serviceId;
|
|
conn->security_ix = sp->hdr.securityIndex;
|
|
conn->out_clientflag = 0;
|
|
+ conn->security = sec;
|
|
+ conn->server_key = key_get(key);
|
|
if (conn->security_ix)
|
|
conn->state = RXRPC_CONN_SERVICE_UNSECURED;
|
|
else
|
|
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c
|
|
index 157be1ff8697..86bd133b4fa0 100644
|
|
--- a/net/rxrpc/input.c
|
|
+++ b/net/rxrpc/input.c
|
|
@@ -192,22 +192,6 @@ send_extra_data:
|
|
goto out_no_clear_ca;
|
|
}
|
|
|
|
-/*
|
|
- * Ping the other end to fill our RTT cache and to retrieve the rwind
|
|
- * and MTU parameters.
|
|
- */
|
|
-static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb)
|
|
-{
|
|
- struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
- ktime_t now = skb->tstamp;
|
|
-
|
|
- if (call->peer->rtt_usage < 3 ||
|
|
- ktime_before(ktime_add_ms(call->peer->rtt_last_req, 1000), now))
|
|
- rxrpc_propose_ACK(call, RXRPC_ACK_PING, sp->hdr.serial,
|
|
- true, true,
|
|
- rxrpc_propose_ack_ping_for_params);
|
|
-}
|
|
-
|
|
/*
|
|
* Apply a hard ACK by advancing the Tx window.
|
|
*/
|
|
@@ -1396,8 +1380,6 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb)
|
|
call = rxrpc_new_incoming_call(local, rx, skb);
|
|
if (!call)
|
|
goto reject_packet;
|
|
- rxrpc_send_ping(call, skb);
|
|
- mutex_unlock(&call->user_mutex);
|
|
}
|
|
|
|
/* Process a call packet; this either discards or passes on the ref
|
|
diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
|
|
index 8d8aa3c230b5..098f1f9ec53b 100644
|
|
--- a/net/rxrpc/rxkad.c
|
|
+++ b/net/rxrpc/rxkad.c
|
|
@@ -648,9 +648,9 @@ static int rxkad_issue_challenge(struct rxrpc_connection *conn)
|
|
u32 serial;
|
|
int ret;
|
|
|
|
- _enter("{%d,%x}", conn->debug_id, key_serial(conn->params.key));
|
|
+ _enter("{%d,%x}", conn->debug_id, key_serial(conn->server_key));
|
|
|
|
- ret = key_validate(conn->params.key);
|
|
+ ret = key_validate(conn->server_key);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
@@ -1293,6 +1293,7 @@ static void rxkad_exit(void)
|
|
const struct rxrpc_security rxkad = {
|
|
.name = "rxkad",
|
|
.security_index = RXRPC_SECURITY_RXKAD,
|
|
+ .no_key_abort = RXKADUNKNOWNKEY,
|
|
.init = rxkad_init,
|
|
.exit = rxkad_exit,
|
|
.init_connection_security = rxkad_init_connection_security,
|
|
diff --git a/net/rxrpc/security.c b/net/rxrpc/security.c
|
|
index a4c47d2b7054..9b1fb9ed0717 100644
|
|
--- a/net/rxrpc/security.c
|
|
+++ b/net/rxrpc/security.c
|
|
@@ -101,62 +101,58 @@ int rxrpc_init_client_conn_security(struct rxrpc_connection *conn)
|
|
}
|
|
|
|
/*
|
|
- * initialise the security on a server connection
|
|
+ * Find the security key for a server connection.
|
|
*/
|
|
-int rxrpc_init_server_conn_security(struct rxrpc_connection *conn)
|
|
+bool rxrpc_look_up_server_security(struct rxrpc_local *local, struct rxrpc_sock *rx,
|
|
+ const struct rxrpc_security **_sec,
|
|
+ struct key **_key,
|
|
+ struct sk_buff *skb)
|
|
{
|
|
const struct rxrpc_security *sec;
|
|
- struct rxrpc_local *local = conn->params.local;
|
|
- struct rxrpc_sock *rx;
|
|
- struct key *key;
|
|
- key_ref_t kref;
|
|
+ struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
|
|
+ key_ref_t kref = NULL;
|
|
char kdesc[5 + 1 + 3 + 1];
|
|
|
|
_enter("");
|
|
|
|
- sprintf(kdesc, "%u:%u", conn->service_id, conn->security_ix);
|
|
+ sprintf(kdesc, "%u:%u", sp->hdr.serviceId, sp->hdr.securityIndex);
|
|
|
|
- sec = rxrpc_security_lookup(conn->security_ix);
|
|
+ sec = rxrpc_security_lookup(sp->hdr.securityIndex);
|
|
if (!sec) {
|
|
- _leave(" = -ENOKEY [lookup]");
|
|
- return -ENOKEY;
|
|
+ trace_rxrpc_abort(0, "SVS",
|
|
+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq,
|
|
+ RX_INVALID_OPERATION, EKEYREJECTED);
|
|
+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT;
|
|
+ skb->priority = RX_INVALID_OPERATION;
|
|
+ return false;
|
|
}
|
|
|
|
- /* find the service */
|
|
- read_lock(&local->services_lock);
|
|
- rx = rcu_dereference_protected(local->service,
|
|
- lockdep_is_held(&local->services_lock));
|
|
- if (rx && (rx->srx.srx_service == conn->service_id ||
|
|
- rx->second_service == conn->service_id))
|
|
- goto found_service;
|
|
+ if (sp->hdr.securityIndex == RXRPC_SECURITY_NONE)
|
|
+ goto out;
|
|
|
|
- /* the service appears to have died */
|
|
- read_unlock(&local->services_lock);
|
|
- _leave(" = -ENOENT");
|
|
- return -ENOENT;
|
|
-
|
|
-found_service:
|
|
if (!rx->securities) {
|
|
- read_unlock(&local->services_lock);
|
|
- _leave(" = -ENOKEY");
|
|
- return -ENOKEY;
|
|
+ trace_rxrpc_abort(0, "SVR",
|
|
+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq,
|
|
+ RX_INVALID_OPERATION, EKEYREJECTED);
|
|
+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT;
|
|
+ skb->priority = RX_INVALID_OPERATION;
|
|
+ return false;
|
|
}
|
|
|
|
/* look through the service's keyring */
|
|
kref = keyring_search(make_key_ref(rx->securities, 1UL),
|
|
&key_type_rxrpc_s, kdesc, true);
|
|
if (IS_ERR(kref)) {
|
|
- read_unlock(&local->services_lock);
|
|
- _leave(" = %ld [search]", PTR_ERR(kref));
|
|
- return PTR_ERR(kref);
|
|
+ trace_rxrpc_abort(0, "SVK",
|
|
+ sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq,
|
|
+ sec->no_key_abort, EKEYREJECTED);
|
|
+ skb->mark = RXRPC_SKB_MARK_REJECT_ABORT;
|
|
+ skb->priority = sec->no_key_abort;
|
|
+ return false;
|
|
}
|
|
|
|
- key = key_ref_to_ptr(kref);
|
|
- read_unlock(&local->services_lock);
|
|
-
|
|
- conn->server_key = key;
|
|
- conn->security = sec;
|
|
-
|
|
- _leave(" = 0");
|
|
- return 0;
|
|
+out:
|
|
+ *_sec = sec;
|
|
+ *_key = key_ref_to_ptr(kref);
|
|
+ return true;
|
|
}
|
|
diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c
|
|
index dd0e8680b030..2277369feae5 100644
|
|
--- a/net/sched/sch_cake.c
|
|
+++ b/net/sched/sch_cake.c
|
|
@@ -2184,6 +2184,7 @@ static const struct nla_policy cake_policy[TCA_CAKE_MAX + 1] = {
|
|
[TCA_CAKE_MPU] = { .type = NLA_U32 },
|
|
[TCA_CAKE_INGRESS] = { .type = NLA_U32 },
|
|
[TCA_CAKE_ACK_FILTER] = { .type = NLA_U32 },
|
|
+ [TCA_CAKE_SPLIT_GSO] = { .type = NLA_U32 },
|
|
[TCA_CAKE_FWMARK] = { .type = NLA_U32 },
|
|
};
|
|
|
|
diff --git a/net/socket.c b/net/socket.c
|
|
index ca8de9e1582d..432800b39ddb 100644
|
|
--- a/net/socket.c
|
|
+++ b/net/socket.c
|
|
@@ -3532,6 +3532,7 @@ static int compat_sock_ioctl_trans(struct file *file, struct socket *sock,
|
|
case SIOCSARP:
|
|
case SIOCGARP:
|
|
case SIOCDARP:
|
|
+ case SIOCOUTQNSD:
|
|
case SIOCATMARK:
|
|
return sock_do_ioctl(net, sock, cmd, arg);
|
|
}
|
|
diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c
|
|
index 30065a28628c..9901a811f598 100644
|
|
--- a/net/sunrpc/xprtrdma/frwr_ops.c
|
|
+++ b/net/sunrpc/xprtrdma/frwr_ops.c
|
|
@@ -570,7 +570,6 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
|
|
*/
|
|
bad_wr = NULL;
|
|
rc = ib_post_send(r_xprt->rx_ia.ri_id->qp, first, &bad_wr);
|
|
- trace_xprtrdma_post_send(req, rc);
|
|
|
|
/* The final LOCAL_INV WR in the chain is supposed to
|
|
* do the wake. If it was never posted, the wake will
|
|
@@ -583,6 +582,7 @@ void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
|
|
|
|
/* Recycle MRs in the LOCAL_INV chain that did not get posted.
|
|
*/
|
|
+ trace_xprtrdma_post_linv(req, rc);
|
|
while (bad_wr) {
|
|
frwr = container_of(bad_wr, struct rpcrdma_frwr,
|
|
fr_invwr);
|
|
@@ -673,12 +673,12 @@ void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
|
|
*/
|
|
bad_wr = NULL;
|
|
rc = ib_post_send(r_xprt->rx_ia.ri_id->qp, first, &bad_wr);
|
|
- trace_xprtrdma_post_send(req, rc);
|
|
if (!rc)
|
|
return;
|
|
|
|
/* Recycle MRs in the LOCAL_INV chain that did not get posted.
|
|
*/
|
|
+ trace_xprtrdma_post_linv(req, rc);
|
|
while (bad_wr) {
|
|
frwr = container_of(bad_wr, struct rpcrdma_frwr, fr_invwr);
|
|
mr = container_of(frwr, struct rpcrdma_mr, frwr);
|
|
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c
|
|
index b86b5fd62d9f..ef5102b60589 100644
|
|
--- a/net/sunrpc/xprtrdma/rpc_rdma.c
|
|
+++ b/net/sunrpc/xprtrdma/rpc_rdma.c
|
|
@@ -1362,6 +1362,7 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep)
|
|
xprt->cwnd = credits << RPC_CWNDSHIFT;
|
|
spin_unlock(&xprt->transport_lock);
|
|
}
|
|
+ rpcrdma_post_recvs(r_xprt, false);
|
|
|
|
req = rpcr_to_rdmar(rqst);
|
|
if (req->rl_reply) {
|
|
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
|
|
index 160558b4135e..c67d465dc062 100644
|
|
--- a/net/sunrpc/xprtrdma/transport.c
|
|
+++ b/net/sunrpc/xprtrdma/transport.c
|
|
@@ -428,8 +428,11 @@ void xprt_rdma_close(struct rpc_xprt *xprt)
|
|
/* Prepare @xprt for the next connection by reinitializing
|
|
* its credit grant to one (see RFC 8166, Section 3.3.3).
|
|
*/
|
|
+ spin_lock(&xprt->transport_lock);
|
|
r_xprt->rx_buf.rb_credits = 1;
|
|
+ xprt->cong = 0;
|
|
xprt->cwnd = RPC_CWNDSHIFT;
|
|
+ spin_unlock(&xprt->transport_lock);
|
|
|
|
out:
|
|
xprt->reestablish_timeout = 0;
|
|
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
|
|
index 3a907537e2cf..0f4d39fdb48f 100644
|
|
--- a/net/sunrpc/xprtrdma/verbs.c
|
|
+++ b/net/sunrpc/xprtrdma/verbs.c
|
|
@@ -75,16 +75,15 @@
|
|
* internal functions
|
|
*/
|
|
static void rpcrdma_sendctx_put_locked(struct rpcrdma_sendctx *sc);
|
|
-static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf);
|
|
+static void rpcrdma_reqs_reset(struct rpcrdma_xprt *r_xprt);
|
|
+static void rpcrdma_reps_unmap(struct rpcrdma_xprt *r_xprt);
|
|
static void rpcrdma_mrs_create(struct rpcrdma_xprt *r_xprt);
|
|
static void rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf);
|
|
-static void rpcrdma_mr_free(struct rpcrdma_mr *mr);
|
|
static struct rpcrdma_regbuf *
|
|
rpcrdma_regbuf_alloc(size_t size, enum dma_data_direction direction,
|
|
gfp_t flags);
|
|
static void rpcrdma_regbuf_dma_unmap(struct rpcrdma_regbuf *rb);
|
|
static void rpcrdma_regbuf_free(struct rpcrdma_regbuf *rb);
|
|
-static void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp);
|
|
|
|
/* Wait for outstanding transport work to finish. ib_drain_qp
|
|
* handles the drains in the wrong order for us, so open code
|
|
@@ -170,7 +169,6 @@ rpcrdma_wc_receive(struct ib_cq *cq, struct ib_wc *wc)
|
|
rdmab_addr(rep->rr_rdmabuf),
|
|
wc->byte_len, DMA_FROM_DEVICE);
|
|
|
|
- rpcrdma_post_recvs(r_xprt, false);
|
|
rpcrdma_reply_handler(rep);
|
|
return;
|
|
|
|
@@ -247,6 +245,7 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
|
|
ia->ri_id->device->name,
|
|
rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
|
|
#endif
|
|
+ init_completion(&ia->ri_remove_done);
|
|
set_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags);
|
|
ep->rep_connected = -ENODEV;
|
|
xprt_force_disconnect(xprt);
|
|
@@ -301,7 +300,6 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt, struct rpcrdma_ia *ia)
|
|
trace_xprtrdma_conn_start(xprt);
|
|
|
|
init_completion(&ia->ri_done);
|
|
- init_completion(&ia->ri_remove_done);
|
|
|
|
id = rdma_create_id(xprt->rx_xprt.xprt_net, rpcrdma_cm_event_handler,
|
|
xprt, RDMA_PS_TCP, IB_QPT_RC);
|
|
@@ -431,7 +429,7 @@ rpcrdma_ia_remove(struct rpcrdma_ia *ia)
|
|
/* The ULP is responsible for ensuring all DMA
|
|
* mappings and MRs are gone.
|
|
*/
|
|
- rpcrdma_reps_destroy(buf);
|
|
+ rpcrdma_reps_unmap(r_xprt);
|
|
list_for_each_entry(req, &buf->rb_allreqs, rl_all) {
|
|
rpcrdma_regbuf_dma_unmap(req->rl_rdmabuf);
|
|
rpcrdma_regbuf_dma_unmap(req->rl_sendbuf);
|
|
@@ -609,6 +607,7 @@ static int rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt,
|
|
struct ib_qp_init_attr *qp_init_attr)
|
|
{
|
|
struct rpcrdma_ia *ia = &r_xprt->rx_ia;
|
|
+ struct rpcrdma_ep *ep = &r_xprt->rx_ep;
|
|
int rc, err;
|
|
|
|
trace_xprtrdma_reinsert(r_xprt);
|
|
@@ -623,6 +622,7 @@ static int rpcrdma_ep_recreate_xprt(struct rpcrdma_xprt *r_xprt,
|
|
pr_err("rpcrdma: rpcrdma_ep_create returned %d\n", err);
|
|
goto out2;
|
|
}
|
|
+ memcpy(qp_init_attr, &ep->rep_attr, sizeof(*qp_init_attr));
|
|
|
|
rc = -ENETUNREACH;
|
|
err = rdma_create_qp(ia->ri_id, ia->ri_pd, qp_init_attr);
|
|
@@ -780,6 +780,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
|
|
trace_xprtrdma_disconnect(r_xprt, rc);
|
|
|
|
rpcrdma_xprt_drain(r_xprt);
|
|
+ rpcrdma_reqs_reset(r_xprt);
|
|
}
|
|
|
|
/* Fixed-size circular FIFO queue. This implementation is wait-free and
|
|
@@ -965,7 +966,7 @@ rpcrdma_mrs_create(struct rpcrdma_xprt *r_xprt)
|
|
mr->mr_xprt = r_xprt;
|
|
|
|
spin_lock(&buf->rb_lock);
|
|
- list_add(&mr->mr_list, &buf->rb_mrs);
|
|
+ rpcrdma_mr_push(mr, &buf->rb_mrs);
|
|
list_add(&mr->mr_all, &buf->rb_all_mrs);
|
|
spin_unlock(&buf->rb_lock);
|
|
}
|
|
@@ -1042,6 +1043,26 @@ out1:
|
|
return NULL;
|
|
}
|
|
|
|
+/**
|
|
+ * rpcrdma_reqs_reset - Reset all reqs owned by a transport
|
|
+ * @r_xprt: controlling transport instance
|
|
+ *
|
|
+ * ASSUMPTION: the rb_allreqs list is stable for the duration,
|
|
+ * and thus can be walked without holding rb_lock. Eg. the
|
|
+ * caller is holding the transport send lock to exclude
|
|
+ * device removal or disconnection.
|
|
+ */
|
|
+static void rpcrdma_reqs_reset(struct rpcrdma_xprt *r_xprt)
|
|
+{
|
|
+ struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
|
|
+ struct rpcrdma_req *req;
|
|
+
|
|
+ list_for_each_entry(req, &buf->rb_allreqs, rl_all) {
|
|
+ /* Credits are valid only for one connection */
|
|
+ req->rl_slot.rq_cong = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
|
|
bool temp)
|
|
{
|
|
@@ -1065,6 +1086,7 @@ static struct rpcrdma_rep *rpcrdma_rep_create(struct rpcrdma_xprt *r_xprt,
|
|
rep->rr_recv_wr.sg_list = &rep->rr_rdmabuf->rg_iov;
|
|
rep->rr_recv_wr.num_sge = 1;
|
|
rep->rr_temp = temp;
|
|
+ list_add(&rep->rr_all, &r_xprt->rx_buf.rb_all_reps);
|
|
return rep;
|
|
|
|
out_free:
|
|
@@ -1075,6 +1097,7 @@ out:
|
|
|
|
static void rpcrdma_rep_destroy(struct rpcrdma_rep *rep)
|
|
{
|
|
+ list_del(&rep->rr_all);
|
|
rpcrdma_regbuf_free(rep->rr_rdmabuf);
|
|
kfree(rep);
|
|
}
|
|
@@ -1093,10 +1116,16 @@ static struct rpcrdma_rep *rpcrdma_rep_get_locked(struct rpcrdma_buffer *buf)
|
|
static void rpcrdma_rep_put(struct rpcrdma_buffer *buf,
|
|
struct rpcrdma_rep *rep)
|
|
{
|
|
- if (!rep->rr_temp)
|
|
- llist_add(&rep->rr_node, &buf->rb_free_reps);
|
|
- else
|
|
- rpcrdma_rep_destroy(rep);
|
|
+ llist_add(&rep->rr_node, &buf->rb_free_reps);
|
|
+}
|
|
+
|
|
+static void rpcrdma_reps_unmap(struct rpcrdma_xprt *r_xprt)
|
|
+{
|
|
+ struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
|
|
+ struct rpcrdma_rep *rep;
|
|
+
|
|
+ list_for_each_entry(rep, &buf->rb_all_reps, rr_all)
|
|
+ rpcrdma_regbuf_dma_unmap(rep->rr_rdmabuf);
|
|
}
|
|
|
|
static void rpcrdma_reps_destroy(struct rpcrdma_buffer *buf)
|
|
@@ -1129,6 +1158,7 @@ int rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt)
|
|
|
|
INIT_LIST_HEAD(&buf->rb_send_bufs);
|
|
INIT_LIST_HEAD(&buf->rb_allreqs);
|
|
+ INIT_LIST_HEAD(&buf->rb_all_reps);
|
|
|
|
rc = -ENOMEM;
|
|
for (i = 0; i < buf->rb_max_requests; i++) {
|
|
@@ -1163,10 +1193,19 @@ out:
|
|
*/
|
|
void rpcrdma_req_destroy(struct rpcrdma_req *req)
|
|
{
|
|
+ struct rpcrdma_mr *mr;
|
|
+
|
|
list_del(&req->rl_all);
|
|
|
|
- while (!list_empty(&req->rl_free_mrs))
|
|
- rpcrdma_mr_free(rpcrdma_mr_pop(&req->rl_free_mrs));
|
|
+ while ((mr = rpcrdma_mr_pop(&req->rl_free_mrs))) {
|
|
+ struct rpcrdma_buffer *buf = &mr->mr_xprt->rx_buf;
|
|
+
|
|
+ spin_lock(&buf->rb_lock);
|
|
+ list_del(&mr->mr_all);
|
|
+ spin_unlock(&buf->rb_lock);
|
|
+
|
|
+ frwr_release_mr(mr);
|
|
+ }
|
|
|
|
rpcrdma_regbuf_free(req->rl_recvbuf);
|
|
rpcrdma_regbuf_free(req->rl_sendbuf);
|
|
@@ -1174,24 +1213,28 @@ void rpcrdma_req_destroy(struct rpcrdma_req *req)
|
|
kfree(req);
|
|
}
|
|
|
|
-static void
|
|
-rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf)
|
|
+/**
|
|
+ * rpcrdma_mrs_destroy - Release all of a transport's MRs
|
|
+ * @buf: controlling buffer instance
|
|
+ *
|
|
+ * Relies on caller holding the transport send lock to protect
|
|
+ * removing mr->mr_list from req->rl_free_mrs safely.
|
|
+ */
|
|
+static void rpcrdma_mrs_destroy(struct rpcrdma_buffer *buf)
|
|
{
|
|
struct rpcrdma_xprt *r_xprt = container_of(buf, struct rpcrdma_xprt,
|
|
rx_buf);
|
|
struct rpcrdma_mr *mr;
|
|
- unsigned int count;
|
|
|
|
- count = 0;
|
|
spin_lock(&buf->rb_lock);
|
|
while ((mr = list_first_entry_or_null(&buf->rb_all_mrs,
|
|
struct rpcrdma_mr,
|
|
mr_all)) != NULL) {
|
|
+ list_del(&mr->mr_list);
|
|
list_del(&mr->mr_all);
|
|
spin_unlock(&buf->rb_lock);
|
|
|
|
frwr_release_mr(mr);
|
|
- count++;
|
|
spin_lock(&buf->rb_lock);
|
|
}
|
|
spin_unlock(&buf->rb_lock);
|
|
@@ -1264,17 +1307,6 @@ void rpcrdma_mr_put(struct rpcrdma_mr *mr)
|
|
rpcrdma_mr_push(mr, &mr->mr_req->rl_free_mrs);
|
|
}
|
|
|
|
-static void rpcrdma_mr_free(struct rpcrdma_mr *mr)
|
|
-{
|
|
- struct rpcrdma_xprt *r_xprt = mr->mr_xprt;
|
|
- struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
|
|
-
|
|
- mr->mr_req = NULL;
|
|
- spin_lock(&buf->rb_lock);
|
|
- rpcrdma_mr_push(mr, &buf->rb_mrs);
|
|
- spin_unlock(&buf->rb_lock);
|
|
-}
|
|
-
|
|
/**
|
|
* rpcrdma_buffer_get - Get a request buffer
|
|
* @buffers: Buffer pool from which to obtain a buffer
|
|
@@ -1455,8 +1487,13 @@ rpcrdma_ep_post(struct rpcrdma_ia *ia,
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
-rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp)
|
|
+/**
|
|
+ * rpcrdma_post_recvs - Refill the Receive Queue
|
|
+ * @r_xprt: controlling transport instance
|
|
+ * @temp: mark Receive buffers to be deleted after use
|
|
+ *
|
|
+ */
|
|
+void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp)
|
|
{
|
|
struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
|
|
struct rpcrdma_ep *ep = &r_xprt->rx_ep;
|
|
@@ -1478,6 +1515,10 @@ rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp)
|
|
wr = NULL;
|
|
while (needed) {
|
|
rep = rpcrdma_rep_get_locked(buf);
|
|
+ if (rep && rep->rr_temp) {
|
|
+ rpcrdma_rep_destroy(rep);
|
|
+ continue;
|
|
+ }
|
|
if (!rep)
|
|
rep = rpcrdma_rep_create(r_xprt, temp);
|
|
if (!rep)
|
|
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h
|
|
index 65e6b0eb862e..fc761679487c 100644
|
|
--- a/net/sunrpc/xprtrdma/xprt_rdma.h
|
|
+++ b/net/sunrpc/xprtrdma/xprt_rdma.h
|
|
@@ -203,6 +203,7 @@ struct rpcrdma_rep {
|
|
struct xdr_stream rr_stream;
|
|
struct llist_node rr_node;
|
|
struct ib_recv_wr rr_recv_wr;
|
|
+ struct list_head rr_all;
|
|
};
|
|
|
|
/* To reduce the rate at which a transport invokes ib_post_recv
|
|
@@ -372,6 +373,7 @@ struct rpcrdma_buffer {
|
|
|
|
struct list_head rb_allreqs;
|
|
struct list_head rb_all_mrs;
|
|
+ struct list_head rb_all_reps;
|
|
|
|
struct llist_head rb_free_reps;
|
|
|
|
@@ -474,6 +476,7 @@ void rpcrdma_ep_disconnect(struct rpcrdma_ep *, struct rpcrdma_ia *);
|
|
|
|
int rpcrdma_ep_post(struct rpcrdma_ia *, struct rpcrdma_ep *,
|
|
struct rpcrdma_req *);
|
|
+void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp);
|
|
|
|
/*
|
|
* Buffer calls - xprtrdma/verbs.c
|
|
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
|
index 0d8da809bea2..b3369d678f1a 100644
|
|
--- a/net/unix/af_unix.c
|
|
+++ b/net/unix/af_unix.c
|
|
@@ -646,6 +646,9 @@ static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
|
|
static __poll_t unix_dgram_poll(struct file *, struct socket *,
|
|
poll_table *);
|
|
static int unix_ioctl(struct socket *, unsigned int, unsigned long);
|
|
+#ifdef CONFIG_COMPAT
|
|
+static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
|
|
+#endif
|
|
static int unix_shutdown(struct socket *, int);
|
|
static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t);
|
|
static int unix_stream_recvmsg(struct socket *, struct msghdr *, size_t, int);
|
|
@@ -687,6 +690,9 @@ static const struct proto_ops unix_stream_ops = {
|
|
.getname = unix_getname,
|
|
.poll = unix_poll,
|
|
.ioctl = unix_ioctl,
|
|
+#ifdef CONFIG_COMPAT
|
|
+ .compat_ioctl = unix_compat_ioctl,
|
|
+#endif
|
|
.listen = unix_listen,
|
|
.shutdown = unix_shutdown,
|
|
.setsockopt = sock_no_setsockopt,
|
|
@@ -710,6 +716,9 @@ static const struct proto_ops unix_dgram_ops = {
|
|
.getname = unix_getname,
|
|
.poll = unix_dgram_poll,
|
|
.ioctl = unix_ioctl,
|
|
+#ifdef CONFIG_COMPAT
|
|
+ .compat_ioctl = unix_compat_ioctl,
|
|
+#endif
|
|
.listen = sock_no_listen,
|
|
.shutdown = unix_shutdown,
|
|
.setsockopt = sock_no_setsockopt,
|
|
@@ -732,6 +741,9 @@ static const struct proto_ops unix_seqpacket_ops = {
|
|
.getname = unix_getname,
|
|
.poll = unix_dgram_poll,
|
|
.ioctl = unix_ioctl,
|
|
+#ifdef CONFIG_COMPAT
|
|
+ .compat_ioctl = unix_compat_ioctl,
|
|
+#endif
|
|
.listen = unix_listen,
|
|
.shutdown = unix_shutdown,
|
|
.setsockopt = sock_no_setsockopt,
|
|
@@ -2582,6 +2594,13 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
return err;
|
|
}
|
|
|
|
+#ifdef CONFIG_COMPAT
|
|
+static int unix_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
|
+{
|
|
+ return unix_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
|
|
+}
|
|
+#endif
|
|
+
|
|
static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait)
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
|
|
index 06495379fcd8..2998ddb323e3 100755
|
|
--- a/scripts/link-vmlinux.sh
|
|
+++ b/scripts/link-vmlinux.sh
|
|
@@ -127,7 +127,8 @@ gen_btf()
|
|
cut -d, -f1 | cut -d' ' -f2)
|
|
bin_format=$(LANG=C ${OBJDUMP} -f ${1} | grep 'file format' | \
|
|
awk '{print $4}')
|
|
- ${OBJCOPY} --dump-section .BTF=.btf.vmlinux.bin ${1} 2>/dev/null
|
|
+ ${OBJCOPY} --set-section-flags .BTF=alloc -O binary \
|
|
+ --only-section=.BTF ${1} .btf.vmlinux.bin 2>/dev/null
|
|
${OBJCOPY} -I binary -O ${bin_format} -B ${bin_arch} \
|
|
--rename-section .data=.BTF .btf.vmlinux.bin ${2}
|
|
}
|
|
@@ -253,6 +254,10 @@ btf_vmlinux_bin_o=""
|
|
if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
|
|
if gen_btf .tmp_vmlinux.btf .btf.vmlinux.bin.o ; then
|
|
btf_vmlinux_bin_o=.btf.vmlinux.bin.o
|
|
+ else
|
|
+ echo >&2 "Failed to generate BTF for vmlinux"
|
|
+ echo >&2 "Try to disable CONFIG_DEBUG_INFO_BTF"
|
|
+ exit 1
|
|
fi
|
|
fi
|
|
|
|
diff --git a/scripts/package/mkdebian b/scripts/package/mkdebian
|
|
index 7c230016b08d..357dc56bcf30 100755
|
|
--- a/scripts/package/mkdebian
|
|
+++ b/scripts/package/mkdebian
|
|
@@ -136,7 +136,7 @@ mkdir -p debian/source/
|
|
echo "1.0" > debian/source/format
|
|
|
|
echo $debarch > debian/arch
|
|
-extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev)"
|
|
+extra_build_depends=", $(if_enabled_echo CONFIG_UNWINDER_ORC libelf-dev:native)"
|
|
extra_build_depends="$extra_build_depends, $(if_enabled_echo CONFIG_SYSTEM_TRUSTED_KEYRING libssl-dev:native)"
|
|
|
|
# Generate a simple changelog template
|
|
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
|
|
index dd3d5942e669..c36bafbcd77e 100644
|
|
--- a/security/tomoyo/common.c
|
|
+++ b/security/tomoyo/common.c
|
|
@@ -951,7 +951,8 @@ static bool tomoyo_manager(void)
|
|
exe = tomoyo_get_exe();
|
|
if (!exe)
|
|
return false;
|
|
- list_for_each_entry_rcu(ptr, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER], head.list) {
|
|
+ list_for_each_entry_rcu(ptr, &tomoyo_kernel_namespace.policy_list[TOMOYO_ID_MANAGER], head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (!ptr->head.is_deleted &&
|
|
(!tomoyo_pathcmp(domainname, ptr->manager) ||
|
|
!strcmp(exe, ptr->manager->name))) {
|
|
@@ -1095,7 +1096,8 @@ static int tomoyo_delete_domain(char *domainname)
|
|
if (mutex_lock_interruptible(&tomoyo_policy_lock))
|
|
return -EINTR;
|
|
/* Is there an active domain? */
|
|
- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) {
|
|
+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
/* Never delete tomoyo_kernel_domain */
|
|
if (domain == &tomoyo_kernel_domain)
|
|
continue;
|
|
@@ -2778,7 +2780,8 @@ void tomoyo_check_profile(void)
|
|
|
|
tomoyo_policy_loaded = true;
|
|
pr_info("TOMOYO: 2.6.0\n");
|
|
- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) {
|
|
+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
const u8 profile = domain->profile;
|
|
struct tomoyo_policy_namespace *ns = domain->ns;
|
|
|
|
diff --git a/security/tomoyo/domain.c b/security/tomoyo/domain.c
|
|
index 8526a0a74023..7869d6a9980b 100644
|
|
--- a/security/tomoyo/domain.c
|
|
+++ b/security/tomoyo/domain.c
|
|
@@ -41,7 +41,8 @@ int tomoyo_update_policy(struct tomoyo_acl_head *new_entry, const int size,
|
|
|
|
if (mutex_lock_interruptible(&tomoyo_policy_lock))
|
|
return -ENOMEM;
|
|
- list_for_each_entry_rcu(entry, list, list) {
|
|
+ list_for_each_entry_rcu(entry, list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (entry->is_deleted == TOMOYO_GC_IN_PROGRESS)
|
|
continue;
|
|
if (!check_duplicate(entry, new_entry))
|
|
@@ -119,7 +120,8 @@ int tomoyo_update_domain(struct tomoyo_acl_info *new_entry, const int size,
|
|
}
|
|
if (mutex_lock_interruptible(&tomoyo_policy_lock))
|
|
goto out;
|
|
- list_for_each_entry_rcu(entry, list, list) {
|
|
+ list_for_each_entry_rcu(entry, list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (entry->is_deleted == TOMOYO_GC_IN_PROGRESS)
|
|
continue;
|
|
if (!tomoyo_same_acl_head(entry, new_entry) ||
|
|
@@ -166,7 +168,8 @@ void tomoyo_check_acl(struct tomoyo_request_info *r,
|
|
u16 i = 0;
|
|
|
|
retry:
|
|
- list_for_each_entry_rcu(ptr, list, list) {
|
|
+ list_for_each_entry_rcu(ptr, list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (ptr->is_deleted || ptr->type != r->param_type)
|
|
continue;
|
|
if (!check_entry(r, ptr))
|
|
@@ -298,7 +301,8 @@ static inline bool tomoyo_scan_transition
|
|
{
|
|
const struct tomoyo_transition_control *ptr;
|
|
|
|
- list_for_each_entry_rcu(ptr, list, head.list) {
|
|
+ list_for_each_entry_rcu(ptr, list, head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (ptr->head.is_deleted || ptr->type != type)
|
|
continue;
|
|
if (ptr->domainname) {
|
|
@@ -735,7 +739,8 @@ retry:
|
|
|
|
/* Check 'aggregator' directive. */
|
|
candidate = &exename;
|
|
- list_for_each_entry_rcu(ptr, list, head.list) {
|
|
+ list_for_each_entry_rcu(ptr, list, head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (ptr->head.is_deleted ||
|
|
!tomoyo_path_matches_pattern(&exename,
|
|
ptr->original_name))
|
|
diff --git a/security/tomoyo/group.c b/security/tomoyo/group.c
|
|
index a37c7dc66e44..1cecdd797597 100644
|
|
--- a/security/tomoyo/group.c
|
|
+++ b/security/tomoyo/group.c
|
|
@@ -133,7 +133,8 @@ tomoyo_path_matches_group(const struct tomoyo_path_info *pathname,
|
|
{
|
|
struct tomoyo_path_group *member;
|
|
|
|
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
|
|
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (member->head.is_deleted)
|
|
continue;
|
|
if (!tomoyo_path_matches_pattern(pathname, member->member_name))
|
|
@@ -161,7 +162,8 @@ bool tomoyo_number_matches_group(const unsigned long min,
|
|
struct tomoyo_number_group *member;
|
|
bool matched = false;
|
|
|
|
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
|
|
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (member->head.is_deleted)
|
|
continue;
|
|
if (min > member->number.values[1] ||
|
|
@@ -191,7 +193,8 @@ bool tomoyo_address_matches_group(const bool is_ipv6, const __be32 *address,
|
|
bool matched = false;
|
|
const u8 size = is_ipv6 ? 16 : 4;
|
|
|
|
- list_for_each_entry_rcu(member, &group->member_list, head.list) {
|
|
+ list_for_each_entry_rcu(member, &group->member_list, head.list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (member->head.is_deleted)
|
|
continue;
|
|
if (member->address.is_ipv6 != is_ipv6)
|
|
diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c
|
|
index 52752e1a84ed..eba0b3395851 100644
|
|
--- a/security/tomoyo/util.c
|
|
+++ b/security/tomoyo/util.c
|
|
@@ -594,7 +594,8 @@ struct tomoyo_domain_info *tomoyo_find_domain(const char *domainname)
|
|
|
|
name.name = domainname;
|
|
tomoyo_fill_path_info(&name);
|
|
- list_for_each_entry_rcu(domain, &tomoyo_domain_list, list) {
|
|
+ list_for_each_entry_rcu(domain, &tomoyo_domain_list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
if (!domain->is_deleted &&
|
|
!tomoyo_pathcmp(&name, domain->domainname))
|
|
return domain;
|
|
@@ -1028,7 +1029,8 @@ bool tomoyo_domain_quota_is_ok(struct tomoyo_request_info *r)
|
|
return false;
|
|
if (!domain)
|
|
return true;
|
|
- list_for_each_entry_rcu(ptr, &domain->acl_info_list, list) {
|
|
+ list_for_each_entry_rcu(ptr, &domain->acl_info_list, list,
|
|
+ srcu_read_lock_held(&tomoyo_ss)) {
|
|
u16 perm;
|
|
u8 i;
|
|
|
|
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
|
|
index a78e4ab478df..c7a49d03463a 100644
|
|
--- a/sound/soc/fsl/fsl_esai.c
|
|
+++ b/sound/soc/fsl/fsl_esai.c
|
|
@@ -33,6 +33,7 @@
|
|
* @fsysclk: system clock source to derive HCK, SCK and FS
|
|
* @spbaclk: SPBA clock (optional, depending on SoC design)
|
|
* @task: tasklet to handle the reset operation
|
|
+ * @lock: spin lock between hw_reset() and trigger()
|
|
* @fifo_depth: depth of tx/rx FIFO
|
|
* @slot_width: width of each DAI slot
|
|
* @slots: number of slots
|
|
@@ -56,6 +57,7 @@ struct fsl_esai {
|
|
struct clk *fsysclk;
|
|
struct clk *spbaclk;
|
|
struct tasklet_struct task;
|
|
+ spinlock_t lock; /* Protect hw_reset and trigger */
|
|
u32 fifo_depth;
|
|
u32 slot_width;
|
|
u32 slots;
|
|
@@ -676,8 +678,10 @@ static void fsl_esai_hw_reset(unsigned long arg)
|
|
{
|
|
struct fsl_esai *esai_priv = (struct fsl_esai *)arg;
|
|
bool tx = true, rx = false, enabled[2];
|
|
+ unsigned long lock_flags;
|
|
u32 tfcr, rfcr;
|
|
|
|
+ spin_lock_irqsave(&esai_priv->lock, lock_flags);
|
|
/* Save the registers */
|
|
regmap_read(esai_priv->regmap, REG_ESAI_TFCR, &tfcr);
|
|
regmap_read(esai_priv->regmap, REG_ESAI_RFCR, &rfcr);
|
|
@@ -715,6 +719,8 @@ static void fsl_esai_hw_reset(unsigned long arg)
|
|
fsl_esai_trigger_start(esai_priv, tx);
|
|
if (enabled[rx])
|
|
fsl_esai_trigger_start(esai_priv, rx);
|
|
+
|
|
+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
|
|
}
|
|
|
|
static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|
@@ -722,6 +728,7 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|
{
|
|
struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai);
|
|
bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
|
|
+ unsigned long lock_flags;
|
|
|
|
esai_priv->channels[tx] = substream->runtime->channels;
|
|
|
|
@@ -729,12 +736,16 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|
case SNDRV_PCM_TRIGGER_START:
|
|
case SNDRV_PCM_TRIGGER_RESUME:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
+ spin_lock_irqsave(&esai_priv->lock, lock_flags);
|
|
fsl_esai_trigger_start(esai_priv, tx);
|
|
+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
|
|
break;
|
|
case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
case SNDRV_PCM_TRIGGER_STOP:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
+ spin_lock_irqsave(&esai_priv->lock, lock_flags);
|
|
fsl_esai_trigger_stop(esai_priv, tx);
|
|
+ spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -1002,6 +1013,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
|
|
|
dev_set_drvdata(&pdev->dev, esai_priv);
|
|
|
|
+ spin_lock_init(&esai_priv->lock);
|
|
ret = fsl_esai_hw_init(esai_priv);
|
|
if (ret)
|
|
return ret;
|
|
diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
|
|
index 01c99750212a..ef493cae78ff 100644
|
|
--- a/sound/soc/intel/Kconfig
|
|
+++ b/sound/soc/intel/Kconfig
|
|
@@ -59,6 +59,9 @@ config SND_SOC_INTEL_HASWELL
|
|
If you have a Intel Haswell or Broadwell platform connected to
|
|
an I2S codec, then enable this option by saying Y or m. This is
|
|
typically used for Chromebooks. This is a recommended option.
|
|
+ This option is mutually exclusive with the SOF support on
|
|
+ Broadwell. If you want to enable SOF on Broadwell, you need to
|
|
+ deselect this option first.
|
|
|
|
config SND_SOC_INTEL_BAYTRAIL
|
|
tristate "Baytrail (legacy) Platforms"
|
|
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
|
|
index e9596c2096cd..a6c1cf987e6e 100644
|
|
--- a/sound/soc/sh/rcar/core.c
|
|
+++ b/sound/soc/sh/rcar/core.c
|
|
@@ -376,6 +376,17 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
|
|
*/
|
|
u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
|
|
{
|
|
+ static const u32 dalign_values[8][2] = {
|
|
+ {0x76543210, 0x67452301},
|
|
+ {0x00000032, 0x00000023},
|
|
+ {0x00007654, 0x00006745},
|
|
+ {0x00000076, 0x00000067},
|
|
+ {0xfedcba98, 0xefcdab89},
|
|
+ {0x000000ba, 0x000000ab},
|
|
+ {0x0000fedc, 0x0000efcd},
|
|
+ {0x000000fe, 0x000000ef},
|
|
+ };
|
|
+ int id = 0, inv;
|
|
struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
|
|
struct rsnd_mod *target;
|
|
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
|
@@ -411,13 +422,18 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
|
|
target = cmd ? cmd : ssiu;
|
|
}
|
|
|
|
+ if (mod == ssiu)
|
|
+ id = rsnd_mod_id_sub(mod);
|
|
+
|
|
/* Non target mod or non 16bit needs normal DALIGN */
|
|
if ((snd_pcm_format_width(runtime->format) != 16) ||
|
|
(mod != target))
|
|
- return 0x76543210;
|
|
+ inv = 0;
|
|
/* Target mod needs inverted DALIGN when 16bit */
|
|
else
|
|
- return 0x67452301;
|
|
+ inv = 1;
|
|
+
|
|
+ return dalign_values[id][inv];
|
|
}
|
|
|
|
u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod)
|
|
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
|
|
index 88978a3036c4..9d3b546bae7b 100644
|
|
--- a/sound/soc/soc-core.c
|
|
+++ b/sound/soc/soc-core.c
|
|
@@ -1886,6 +1886,8 @@ match:
|
|
|
|
/* convert non BE into BE */
|
|
dai_link->no_pcm = 1;
|
|
+ dai_link->dpcm_playback = 1;
|
|
+ dai_link->dpcm_capture = 1;
|
|
|
|
/* override any BE fixups */
|
|
dai_link->be_hw_params_fixup =
|
|
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
|
index a6e96cf1d8ff..d07026a846b9 100644
|
|
--- a/sound/soc/soc-pcm.c
|
|
+++ b/sound/soc/soc-pcm.c
|
|
@@ -1148,7 +1148,9 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
|
|
{
|
|
struct snd_soc_dpcm *dpcm;
|
|
unsigned long flags;
|
|
+#ifdef CONFIG_DEBUG_FS
|
|
char *name;
|
|
+#endif
|
|
|
|
/* only add new dpcms */
|
|
for_each_dpcm_be(fe, stream, dpcm) {
|
|
diff --git a/sound/soc/sof/imx/imx8.c b/sound/soc/sof/imx/imx8.c
|
|
index 2a22b18e5ec0..69785f688ddf 100644
|
|
--- a/sound/soc/sof/imx/imx8.c
|
|
+++ b/sound/soc/sof/imx/imx8.c
|
|
@@ -209,7 +209,7 @@ static int imx8_probe(struct snd_sof_dev *sdev)
|
|
|
|
priv->pd_dev = devm_kmalloc_array(&pdev->dev, priv->num_domains,
|
|
sizeof(*priv->pd_dev), GFP_KERNEL);
|
|
- if (!priv)
|
|
+ if (!priv->pd_dev)
|
|
return -ENOMEM;
|
|
|
|
priv->link = devm_kmalloc_array(&pdev->dev, priv->num_domains,
|
|
@@ -304,6 +304,9 @@ static int imx8_probe(struct snd_sof_dev *sdev)
|
|
}
|
|
sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM;
|
|
|
|
+ /* set default mailbox offset for FW ready message */
|
|
+ sdev->dsp_box.offset = MBOX_OFFSET;
|
|
+
|
|
return 0;
|
|
|
|
exit_pdev_unregister:
|
|
diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig
|
|
index d62f51d33be1..8421b97d949e 100644
|
|
--- a/sound/soc/sof/intel/Kconfig
|
|
+++ b/sound/soc/sof/intel/Kconfig
|
|
@@ -76,10 +76,18 @@ config SND_SOC_SOF_BAYTRAIL
|
|
|
|
config SND_SOC_SOF_BROADWELL_SUPPORT
|
|
bool "SOF support for Broadwell"
|
|
+ depends on SND_SOC_INTEL_HASWELL=n
|
|
help
|
|
This adds support for Sound Open Firmware for Intel(R) platforms
|
|
using the Broadwell processors.
|
|
- Say Y if you have such a device.
|
|
+ This option is mutually exclusive with the Haswell/Broadwell legacy
|
|
+ driver. If you want to enable SOF on Broadwell you need to deselect
|
|
+ the legacy driver first.
|
|
+ SOF does fully support Broadwell yet, so this option is not
|
|
+ recommended for distros. At some point all legacy drivers will be
|
|
+ deprecated but not before all userspace firmware/topology/UCM files
|
|
+ are made available to downstream distros.
|
|
+ Say Y if you want to enable SOF on Broadwell
|
|
If unsure select "N".
|
|
|
|
config SND_SOC_SOF_BROADWELL
|
|
diff --git a/sound/soc/stm/stm32_spdifrx.c b/sound/soc/stm/stm32_spdifrx.c
|
|
index cd4b235fce57..e53fb4bd66b3 100644
|
|
--- a/sound/soc/stm/stm32_spdifrx.c
|
|
+++ b/sound/soc/stm/stm32_spdifrx.c
|
|
@@ -12,7 +12,6 @@
|
|
#include <linux/delay.h>
|
|
#include <linux/module.h>
|
|
#include <linux/of_platform.h>
|
|
-#include <linux/pinctrl/consumer.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/reset.h>
|
|
|
|
@@ -220,6 +219,7 @@
|
|
* @slave_config: dma slave channel runtime config pointer
|
|
* @phys_addr: SPDIFRX registers physical base address
|
|
* @lock: synchronization enabling lock
|
|
+ * @irq_lock: prevent race condition with IRQ on stream state
|
|
* @cs: channel status buffer
|
|
* @ub: user data buffer
|
|
* @irq: SPDIFRX interrupt line
|
|
@@ -240,6 +240,7 @@ struct stm32_spdifrx_data {
|
|
struct dma_slave_config slave_config;
|
|
dma_addr_t phys_addr;
|
|
spinlock_t lock; /* Sync enabling lock */
|
|
+ spinlock_t irq_lock; /* Prevent race condition on stream state */
|
|
unsigned char cs[SPDIFRX_CS_BYTES_NB];
|
|
unsigned char ub[SPDIFRX_UB_BYTES_NB];
|
|
int irq;
|
|
@@ -320,6 +321,7 @@ static void stm32_spdifrx_dma_ctrl_stop(struct stm32_spdifrx_data *spdifrx)
|
|
static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
|
|
{
|
|
int cr, cr_mask, imr, ret;
|
|
+ unsigned long flags;
|
|
|
|
/* Enable IRQs */
|
|
imr = SPDIFRX_IMR_IFEIE | SPDIFRX_IMR_SYNCDIE | SPDIFRX_IMR_PERRIE;
|
|
@@ -327,7 +329,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- spin_lock(&spdifrx->lock);
|
|
+ spin_lock_irqsave(&spdifrx->lock, flags);
|
|
|
|
spdifrx->refcount++;
|
|
|
|
@@ -360,7 +362,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
|
|
"Failed to start synchronization\n");
|
|
}
|
|
|
|
- spin_unlock(&spdifrx->lock);
|
|
+ spin_unlock_irqrestore(&spdifrx->lock, flags);
|
|
|
|
return ret;
|
|
}
|
|
@@ -368,11 +370,12 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx)
|
|
static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx)
|
|
{
|
|
int cr, cr_mask, reg;
|
|
+ unsigned long flags;
|
|
|
|
- spin_lock(&spdifrx->lock);
|
|
+ spin_lock_irqsave(&spdifrx->lock, flags);
|
|
|
|
if (--spdifrx->refcount) {
|
|
- spin_unlock(&spdifrx->lock);
|
|
+ spin_unlock_irqrestore(&spdifrx->lock, flags);
|
|
return;
|
|
}
|
|
|
|
@@ -391,7 +394,7 @@ static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx)
|
|
regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, ®);
|
|
regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, ®);
|
|
|
|
- spin_unlock(&spdifrx->lock);
|
|
+ spin_unlock_irqrestore(&spdifrx->lock, flags);
|
|
}
|
|
|
|
static int stm32_spdifrx_dma_ctrl_register(struct device *dev,
|
|
@@ -478,8 +481,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx)
|
|
memset(spdifrx->cs, 0, SPDIFRX_CS_BYTES_NB);
|
|
memset(spdifrx->ub, 0, SPDIFRX_UB_BYTES_NB);
|
|
|
|
- pinctrl_pm_select_default_state(&spdifrx->pdev->dev);
|
|
-
|
|
ret = stm32_spdifrx_dma_ctrl_start(spdifrx);
|
|
if (ret < 0)
|
|
return ret;
|
|
@@ -511,7 +512,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx)
|
|
|
|
end:
|
|
clk_disable_unprepare(spdifrx->kclk);
|
|
- pinctrl_pm_select_sleep_state(&spdifrx->pdev->dev);
|
|
|
|
return ret;
|
|
}
|
|
@@ -663,7 +663,6 @@ static const struct regmap_config stm32_h7_spdifrx_regmap_conf = {
|
|
static irqreturn_t stm32_spdifrx_isr(int irq, void *devid)
|
|
{
|
|
struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)devid;
|
|
- struct snd_pcm_substream *substream = spdifrx->substream;
|
|
struct platform_device *pdev = spdifrx->pdev;
|
|
unsigned int cr, mask, sr, imr;
|
|
unsigned int flags;
|
|
@@ -731,14 +730,19 @@ static irqreturn_t stm32_spdifrx_isr(int irq, void *devid)
|
|
regmap_update_bits(spdifrx->regmap, STM32_SPDIFRX_CR,
|
|
SPDIFRX_CR_SPDIFEN_MASK, cr);
|
|
|
|
- if (substream)
|
|
- snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
|
|
+ spin_lock(&spdifrx->irq_lock);
|
|
+ if (spdifrx->substream)
|
|
+ snd_pcm_stop(spdifrx->substream,
|
|
+ SNDRV_PCM_STATE_DISCONNECTED);
|
|
+ spin_unlock(&spdifrx->irq_lock);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
- if (err_xrun && substream)
|
|
- snd_pcm_stop_xrun(substream);
|
|
+ spin_lock(&spdifrx->irq_lock);
|
|
+ if (err_xrun && spdifrx->substream)
|
|
+ snd_pcm_stop_xrun(spdifrx->substream);
|
|
+ spin_unlock(&spdifrx->irq_lock);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
@@ -747,9 +751,12 @@ static int stm32_spdifrx_startup(struct snd_pcm_substream *substream,
|
|
struct snd_soc_dai *cpu_dai)
|
|
{
|
|
struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
|
|
+ unsigned long flags;
|
|
int ret;
|
|
|
|
+ spin_lock_irqsave(&spdifrx->irq_lock, flags);
|
|
spdifrx->substream = substream;
|
|
+ spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
|
|
|
|
ret = clk_prepare_enable(spdifrx->kclk);
|
|
if (ret)
|
|
@@ -825,8 +832,12 @@ static void stm32_spdifrx_shutdown(struct snd_pcm_substream *substream,
|
|
struct snd_soc_dai *cpu_dai)
|
|
{
|
|
struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai);
|
|
+ unsigned long flags;
|
|
|
|
+ spin_lock_irqsave(&spdifrx->irq_lock, flags);
|
|
spdifrx->substream = NULL;
|
|
+ spin_unlock_irqrestore(&spdifrx->irq_lock, flags);
|
|
+
|
|
clk_disable_unprepare(spdifrx->kclk);
|
|
}
|
|
|
|
@@ -930,6 +941,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev)
|
|
spdifrx->pdev = pdev;
|
|
init_completion(&spdifrx->cs_completion);
|
|
spin_lock_init(&spdifrx->lock);
|
|
+ spin_lock_init(&spdifrx->irq_lock);
|
|
|
|
platform_set_drvdata(pdev, spdifrx);
|
|
|
|
diff --git a/tools/lib/bpf/Makefile b/tools/lib/bpf/Makefile
|
|
index 56ce6292071b..33e2638ef7f0 100644
|
|
--- a/tools/lib/bpf/Makefile
|
|
+++ b/tools/lib/bpf/Makefile
|
|
@@ -215,7 +215,7 @@ check_abi: $(OUTPUT)libbpf.so
|
|
"versioned symbols in $^ ($(VERSIONED_SYM_COUNT))." \
|
|
"Please make sure all LIBBPF_API symbols are" \
|
|
"versioned in $(VERSION_SCRIPT)." >&2; \
|
|
- readelf -s --wide $(OUTPUT)libbpf-in.o | \
|
|
+ readelf -s --wide $(BPF_IN_SHARED) | \
|
|
cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
|
|
awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}'| \
|
|
sort -u > $(OUTPUT)libbpf_global_syms.tmp; \
|
|
diff --git a/tools/pci/pcitest.c b/tools/pci/pcitest.c
|
|
index cb1e51fcc84e..32b7c6f9043d 100644
|
|
--- a/tools/pci/pcitest.c
|
|
+++ b/tools/pci/pcitest.c
|
|
@@ -129,6 +129,7 @@ static int run_test(struct pci_test *test)
|
|
}
|
|
|
|
fflush(stdout);
|
|
+ close(fd);
|
|
return (ret < 0) ? ret : 1 - ret; /* return 0 if test succeeded */
|
|
}
|
|
|
|
diff --git a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
|
|
index 68618152ea2c..89e070727e1b 100644
|
|
--- a/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
|
|
+++ b/tools/perf/pmu-events/arch/s390/cf_z14/extended.json
|
|
@@ -4,7 +4,7 @@
|
|
"EventCode": "128",
|
|
"EventName": "L1D_RO_EXCL_WRITES",
|
|
"BriefDescription": "L1D Read-only Exclusive Writes",
|
|
- "PublicDescription": "L1D_RO_EXCL_WRITES A directory write to the Level-1 Data cache where the line was originally in a Read-Only state in the cache but has been updated to be in the Exclusive state that allows stores to the cache line"
|
|
+ "PublicDescription": "A directory write to the Level-1 Data cache where the line was originally in a Read-Only state in the cache but has been updated to be in the Exclusive state that allows stores to the cache line"
|
|
},
|
|
{
|
|
"Unit": "CPU-M-CF",
|
|
diff --git a/tools/testing/selftests/firmware/fw_lib.sh b/tools/testing/selftests/firmware/fw_lib.sh
|
|
index b879305a766d..5b8c0fedee76 100755
|
|
--- a/tools/testing/selftests/firmware/fw_lib.sh
|
|
+++ b/tools/testing/selftests/firmware/fw_lib.sh
|
|
@@ -34,6 +34,12 @@ test_modprobe()
|
|
|
|
check_mods()
|
|
{
|
|
+ local uid=$(id -u)
|
|
+ if [ $uid -ne 0 ]; then
|
|
+ echo "skip all tests: must be run as root" >&2
|
|
+ exit $ksft_skip
|
|
+ fi
|
|
+
|
|
trap "test_modprobe" EXIT
|
|
if [ ! -d $DIR ]; then
|
|
modprobe test_firmware
|
|
diff --git a/tools/testing/selftests/net/forwarding/loopback.sh b/tools/testing/selftests/net/forwarding/loopback.sh
|
|
index 6e4626ae71b0..8f4057310b5b 100755
|
|
--- a/tools/testing/selftests/net/forwarding/loopback.sh
|
|
+++ b/tools/testing/selftests/net/forwarding/loopback.sh
|
|
@@ -1,6 +1,9 @@
|
|
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
+# Kselftest framework requirement - SKIP code is 4.
|
|
+ksft_skip=4
|
|
+
|
|
ALL_TESTS="loopback_test"
|
|
NUM_NETIFS=2
|
|
source tc_common.sh
|
|
@@ -72,6 +75,11 @@ setup_prepare()
|
|
|
|
h1_create
|
|
h2_create
|
|
+
|
|
+ if ethtool -k $h1 | grep loopback | grep -q fixed; then
|
|
+ log_test "SKIP: dev $h1 does not support loopback feature"
|
|
+ exit $ksft_skip
|
|
+ fi
|
|
}
|
|
|
|
cleanup()
|
|
diff --git a/tools/testing/selftests/rseq/settings b/tools/testing/selftests/rseq/settings
|
|
new file mode 100644
|
|
index 000000000000..e7b9417537fb
|
|
--- /dev/null
|
|
+++ b/tools/testing/selftests/rseq/settings
|
|
@@ -0,0 +1 @@
|
|
+timeout=0
|