mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 12:14:06 +00:00
Networking fixes for 5.19-rc6, including fixes from bpf, netfilter,
can, bluetooth Current release - regressions: - bluetooth: fix deadlock on hci_power_on_sync. Previous releases - regressions: - sched: act_police: allow 'continue' action offload - eth: usbnet: fix memory leak in error case - eth: ibmvnic: properly dispose of all skbs during a failover. Previous releases - always broken: - bpf: - fix insufficient bounds propagation from adjust_scalar_min_max_vals - clear page contiguity bit when unmapping pool - netfilter: nft_set_pipapo: release elements in clone from abort path - mptcp: netlink: issue MP_PRIO signals from userspace PMs - can: - rcar_canfd: fix data transmission failed on R-Car V3U - gs_usb: gs_usb_open/close(): fix memory leak Misc: - add Wenjia as SMC maintainer Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmLGqsUSHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkz8kQAINYcsrZ7sBKAVeGNq/PzPXpIuIvxLVL XP+9nqs+8JiBG0xPQNfV/AlRWilWckMzQf1F8SfuDwg5ahz0HSN9XJVf+v9p9uYs GthlBgLCH+Kp06831wVC/j8GBcQm2cneOaaZN4udLRORztbOGkn5xFhJOu3lezap IqvAIlyQFCi6uan+iGUXEwh/hEPgH2imOM+1ICao/fp9m7cGkBQKyqAY/ztxgby4 H1DdSsPSZ7e1wjAczdr0oGPzEE5OMxdJUk9yigSNnKwGavoGtizRefStWD+yEUBj XzeWwlAO/otJsklp9cesRYPKiiIx1bmVG14ZTSRpzobg3FEKjP0H4iBgtO67972W RJcolGUtxPd6lgrP5ZxzcStS2v44GeuKkvhKbMMsEEvEDg/we9vBZc6AX6Xs8yr3 fBBkSQnzCJF7CtHxSf7n/6RM4VfaHMbSBb2u23DVsf9N0rU2atNPRvwT2koe0SyO 8lSECzUdjRE2f48PIk0/+nl4zFmAjDBMI1W8+YeeBrjcYQmBtkmHn9eMjAWu5E1f 1pGqmtc3N/LqI4f6l9/oAE2IuiIvdTyo53/Zdqm5SLmIDttVzxAeHrEAaOCwoiWV QXxpvwG3nYd1mE0MfBQLcjD0tpw7ZK3oG/IqDTSiLwGaRXVPxqqQ6jdSriWFUzGm 3zl8fnai73hd =x7Dr -----END PGP SIGNATURE----- Merge tag 'net-5.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from bpf, netfilter, can, and bluetooth. Current release - regressions: - bluetooth: fix deadlock on hci_power_on_sync Previous releases - regressions: - sched: act_police: allow 'continue' action offload - eth: usbnet: fix memory leak in error case - eth: ibmvnic: properly dispose of all skbs during a failover Previous releases - always broken: - bpf: - fix insufficient bounds propagation from adjust_scalar_min_max_vals - clear page contiguity bit when unmapping pool - netfilter: nft_set_pipapo: release elements in clone from abort path - mptcp: netlink: issue MP_PRIO signals from userspace PMs - can: - rcar_canfd: fix data transmission failed on R-Car V3U - gs_usb: gs_usb_open/close(): fix memory leak Misc: - add Wenjia as SMC maintainer" * tag 'net-5.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (57 commits) wireguard: Kconfig: select CRYPTO_CHACHA_S390 crypto: s390 - do not depend on CRYPTO_HW for SIMD implementations wireguard: selftests: use microvm on x86 wireguard: selftests: always call kernel makefile wireguard: selftests: use virt machine on m68k wireguard: selftests: set fake real time in init r8169: fix accessing unset transport header net: rose: fix UAF bug caused by rose_t0timer_expiry usbnet: fix memory leak in error case Revert "tls: rx: move counting TlsDecryptErrors for sync" mptcp: update MIB_RMSUBFLOW in cmd_sf_destroy mptcp: fix local endpoint accounting selftests: mptcp: userspace PM support for MP_PRIO signals mptcp: netlink: issue MP_PRIO signals from userspace PMs mptcp: Acquire the subflow socket lock before modifying MP_PRIO flags mptcp: Avoid acquiring PM lock for subflow priority changes mptcp: fix locking in mptcp_nl_cmd_sf_destroy() net/mlx5e: Fix matchall police parameters validation net/sched: act_police: allow 'continue' action offload net: lan966x: hardcode the number of external ports ...
This commit is contained in:
commit
ef4ab3ba4e
65 changed files with 1090 additions and 525 deletions
|
@ -6,6 +6,15 @@
|
|||
netdev FAQ
|
||||
==========
|
||||
|
||||
tl;dr
|
||||
-----
|
||||
|
||||
- designate your patch to a tree - ``[PATCH net]`` or ``[PATCH net-next]``
|
||||
- for fixes the ``Fixes:`` tag is required, regardless of the tree
|
||||
- don't post large series (> 15 patches), break them up
|
||||
- don't repost your patches within one 24h period
|
||||
- reverse xmas tree
|
||||
|
||||
What is netdev?
|
||||
---------------
|
||||
It is a mailing list for all network-related Linux stuff. This
|
||||
|
@ -136,6 +145,20 @@ it to the maintainer to figure out what is the most recent and current
|
|||
version that should be applied. If there is any doubt, the maintainer
|
||||
will reply and ask what should be done.
|
||||
|
||||
How do I divide my work into patches?
|
||||
-------------------------------------
|
||||
|
||||
Put yourself in the shoes of the reviewer. Each patch is read separately
|
||||
and therefore should constitute a comprehensible step towards your stated
|
||||
goal.
|
||||
|
||||
Avoid sending series longer than 15 patches. Larger series takes longer
|
||||
to review as reviewers will defer looking at it until they find a large
|
||||
chunk of time. A small series can be reviewed in a short time, so Maintainers
|
||||
just do it. As a result, a sequence of smaller series gets merged quicker and
|
||||
with better review coverage. Re-posting large series also increases the mailing
|
||||
list traffic.
|
||||
|
||||
I made changes to only a few patches in a patch series should I resend only those changed?
|
||||
------------------------------------------------------------------------------------------
|
||||
No, please resend the entire patch series and make sure you do number your
|
||||
|
@ -183,6 +206,19 @@ it is requested that you make it look like this::
|
|||
* another line of text
|
||||
*/
|
||||
|
||||
What is "reverse xmas tree"?
|
||||
----------------------------
|
||||
|
||||
Netdev has a convention for ordering local variables in functions.
|
||||
Order the variable declaration lines longest to shortest, e.g.::
|
||||
|
||||
struct scatterlist *sg;
|
||||
struct sk_buff *skb;
|
||||
int err, i;
|
||||
|
||||
If there are dependencies between the variables preventing the ordering
|
||||
move the initialization out of line.
|
||||
|
||||
I am working in existing code which uses non-standard formatting. Which formatting should I use?
|
||||
------------------------------------------------------------------------------------------------
|
||||
Make your code follow the most recent guidelines, so that eventually all code
|
||||
|
|
116
MAINTAINERS
116
MAINTAINERS
|
@ -3618,16 +3618,18 @@ S: Maintained
|
|||
F: Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
|
||||
F: drivers/iio/accel/bma400*
|
||||
|
||||
BPF (Safe dynamic programs and tools)
|
||||
BPF [GENERAL] (Safe Dynamic Programs and Tools)
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Andrii Nakryiko <andrii@kernel.org>
|
||||
R: Martin KaFai Lau <kafai@fb.com>
|
||||
R: Song Liu <songliubraving@fb.com>
|
||||
R: Martin KaFai Lau <martin.lau@linux.dev>
|
||||
R: Song Liu <song@kernel.org>
|
||||
R: Yonghong Song <yhs@fb.com>
|
||||
R: John Fastabend <john.fastabend@gmail.com>
|
||||
R: KP Singh <kpsingh@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
R: Stanislav Fomichev <sdf@google.com>
|
||||
R: Hao Luo <haoluo@google.com>
|
||||
R: Jiri Olsa <jolsa@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
W: https://bpf.io/
|
||||
|
@ -3659,12 +3661,9 @@ F: scripts/pahole-version.sh
|
|||
F: tools/bpf/
|
||||
F: tools/lib/bpf/
|
||||
F: tools/testing/selftests/bpf/
|
||||
N: bpf
|
||||
K: bpf
|
||||
|
||||
BPF JIT for ARM
|
||||
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: arch/arm/net/
|
||||
|
@ -3673,7 +3672,6 @@ BPF JIT for ARM64
|
|||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Zi Shen Lim <zlim.lnx@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/arm64/net/
|
||||
|
@ -3681,14 +3679,12 @@ F: arch/arm64/net/
|
|||
BPF JIT for MIPS (32-BIT AND 64-BIT)
|
||||
M: Johan Almbladh <johan.almbladh@anyfinetworks.com>
|
||||
M: Paul Burton <paulburton@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/mips/net/
|
||||
|
||||
BPF JIT for NFP NICs
|
||||
M: Jakub Kicinski <kuba@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: drivers/net/ethernet/netronome/nfp/bpf/
|
||||
|
@ -3696,7 +3692,6 @@ F: drivers/net/ethernet/netronome/nfp/bpf/
|
|||
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
||||
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
||||
M: Michael Ellerman <mpe@ellerman.id.au>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/powerpc/net/
|
||||
|
@ -3704,7 +3699,6 @@ F: arch/powerpc/net/
|
|||
BPF JIT for RISC-V (32-bit)
|
||||
M: Luke Nelson <luke.r.nels@gmail.com>
|
||||
M: Xi Wang <xi.wang@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/riscv/net/
|
||||
|
@ -3712,7 +3706,6 @@ X: arch/riscv/net/bpf_jit_comp64.c
|
|||
|
||||
BPF JIT for RISC-V (64-bit)
|
||||
M: Björn Töpel <bjorn@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/riscv/net/
|
||||
|
@ -3722,7 +3715,6 @@ BPF JIT for S390
|
|||
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
M: Heiko Carstens <hca@linux.ibm.com>
|
||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/s390/net/
|
||||
|
@ -3730,14 +3722,12 @@ X: arch/s390/net/pnet.c
|
|||
|
||||
BPF JIT for SPARC (32-BIT AND 64-BIT)
|
||||
M: David S. Miller <davem@davemloft.net>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: arch/sparc/net/
|
||||
|
||||
BPF JIT for X86 32-BIT
|
||||
M: Wang YanQing <udknight@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: arch/x86/net/bpf_jit_comp32.c
|
||||
|
@ -3745,13 +3735,60 @@ F: arch/x86/net/bpf_jit_comp32.c
|
|||
BPF JIT for X86 64-BIT
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
L: netdev@vger.kernel.org
|
||||
L: bpf@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/x86/net/
|
||||
X: arch/x86/net/bpf_jit_comp32.c
|
||||
|
||||
BPF LSM (Security Audit and Enforcement using BPF)
|
||||
BPF [CORE]
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
R: John Fastabend <john.fastabend@gmail.com>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/verifier.c
|
||||
F: kernel/bpf/tnum.c
|
||||
F: kernel/bpf/core.c
|
||||
F: kernel/bpf/syscall.c
|
||||
F: kernel/bpf/dispatcher.c
|
||||
F: kernel/bpf/trampoline.c
|
||||
F: include/linux/bpf*
|
||||
F: include/linux/filter.h
|
||||
|
||||
BPF [BTF]
|
||||
M: Martin KaFai Lau <martin.lau@linux.dev>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/btf.c
|
||||
F: include/linux/btf*
|
||||
|
||||
BPF [TRACING]
|
||||
M: Song Liu <song@kernel.org>
|
||||
R: Jiri Olsa <jolsa@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/trace/bpf_trace.c
|
||||
F: kernel/bpf/stackmap.c
|
||||
|
||||
BPF [NETWORKING] (tc BPF, sock_addr)
|
||||
M: Martin KaFai Lau <martin.lau@linux.dev>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
R: John Fastabend <john.fastabend@gmail.com>
|
||||
L: bpf@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: net/core/filter.c
|
||||
F: net/sched/act_bpf.c
|
||||
F: net/sched/cls_bpf.c
|
||||
|
||||
BPF [NETWORKING] (struct_ops, reuseport)
|
||||
M: Martin KaFai Lau <martin.lau@linux.dev>
|
||||
L: bpf@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/bpf_struct*
|
||||
|
||||
BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
|
||||
M: KP Singh <kpsingh@kernel.org>
|
||||
R: Florent Revest <revest@chromium.org>
|
||||
R: Brendan Jackman <jackmanb@chromium.org>
|
||||
|
@ -3762,7 +3799,27 @@ F: include/linux/bpf_lsm.h
|
|||
F: kernel/bpf/bpf_lsm.c
|
||||
F: security/bpf/
|
||||
|
||||
BPF L7 FRAMEWORK
|
||||
BPF [STORAGE & CGROUPS]
|
||||
M: Martin KaFai Lau <martin.lau@linux.dev>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/cgroup.c
|
||||
F: kernel/bpf/*storage.c
|
||||
F: kernel/bpf/bpf_lru*
|
||||
|
||||
BPF [RINGBUF]
|
||||
M: Andrii Nakryiko <andrii@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/ringbuf.c
|
||||
|
||||
BPF [ITERATOR]
|
||||
M: Yonghong Song <yhs@fb.com>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/*iter.c
|
||||
|
||||
BPF [L7 FRAMEWORK] (sockmap)
|
||||
M: John Fastabend <john.fastabend@gmail.com>
|
||||
M: Jakub Sitnicki <jakub@cloudflare.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -3775,13 +3832,31 @@ F: net/ipv4/tcp_bpf.c
|
|||
F: net/ipv4/udp_bpf.c
|
||||
F: net/unix/unix_bpf.c
|
||||
|
||||
BPFTOOL
|
||||
BPF [LIBRARY] (libbpf)
|
||||
M: Andrii Nakryiko <andrii@kernel.org>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: tools/lib/bpf/
|
||||
|
||||
BPF [TOOLING] (bpftool)
|
||||
M: Quentin Monnet <quentin@isovalent.com>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/bpf/disasm.*
|
||||
F: tools/bpf/bpftool/
|
||||
|
||||
BPF [SELFTESTS] (Test Runners & Infrastructure)
|
||||
M: Andrii Nakryiko <andrii@kernel.org>
|
||||
R: Mykola Lysenko <mykolal@fb.com>
|
||||
L: bpf@vger.kernel.org
|
||||
S: Maintained
|
||||
F: tools/testing/selftests/bpf/
|
||||
|
||||
BPF [MISC]
|
||||
L: bpf@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
K: (?:\b|_)bpf(?:\b|_)
|
||||
|
||||
BROADCOM B44 10/100 ETHERNET DRIVER
|
||||
M: Michael Chan <michael.chan@broadcom.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
@ -18109,6 +18184,7 @@ F: drivers/misc/sgi-xp/
|
|||
|
||||
SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
|
||||
M: Karsten Graul <kgraul@linux.ibm.com>
|
||||
M: Wenjia Zhang <wenjia@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||
|
|
114
crypto/Kconfig
114
crypto/Kconfig
|
@ -666,6 +666,18 @@ config CRYPTO_CRC32_MIPS
|
|||
CRC32c and CRC32 CRC algorithms implemented using mips crypto
|
||||
instructions, when available.
|
||||
|
||||
config CRYPTO_CRC32_S390
|
||||
tristate "CRC-32 algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
select CRC32
|
||||
help
|
||||
Select this option if you want to use hardware accelerated
|
||||
implementations of CRC algorithms. With this option, you
|
||||
can optimize the computation of CRC-32 (IEEE 802.3 Ethernet)
|
||||
and CRC-32C (Castagnoli).
|
||||
|
||||
It is available with IBM z13 or later.
|
||||
|
||||
config CRYPTO_XXHASH
|
||||
tristate "xxHash hash algorithm"
|
||||
|
@ -898,6 +910,16 @@ config CRYPTO_SHA512_SSSE3
|
|||
Extensions version 1 (AVX1), or Advanced Vector Extensions
|
||||
version 2 (AVX2) instructions, when available.
|
||||
|
||||
config CRYPTO_SHA512_S390
|
||||
tristate "SHA384 and SHA512 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA512 secure hash standard.
|
||||
|
||||
It is available as of z10.
|
||||
|
||||
config CRYPTO_SHA1_OCTEON
|
||||
tristate "SHA1 digest algorithm (OCTEON)"
|
||||
depends on CPU_CAVIUM_OCTEON
|
||||
|
@ -930,6 +952,16 @@ config CRYPTO_SHA1_PPC_SPE
|
|||
SHA-1 secure hash standard (DFIPS 180-4) implemented
|
||||
using powerpc SPE SIMD instruction set.
|
||||
|
||||
config CRYPTO_SHA1_S390
|
||||
tristate "SHA1 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
|
||||
|
||||
It is available as of z990.
|
||||
|
||||
config CRYPTO_SHA256
|
||||
tristate "SHA224 and SHA256 digest algorithm"
|
||||
select CRYPTO_HASH
|
||||
|
@ -970,6 +1002,16 @@ config CRYPTO_SHA256_SPARC64
|
|||
SHA-256 secure hash standard (DFIPS 180-2) implemented
|
||||
using sparc64 crypto instructions, when available.
|
||||
|
||||
config CRYPTO_SHA256_S390
|
||||
tristate "SHA256 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA256 secure hash standard (DFIPS 180-2).
|
||||
|
||||
It is available as of z9.
|
||||
|
||||
config CRYPTO_SHA512
|
||||
tristate "SHA384 and SHA512 digest algorithms"
|
||||
select CRYPTO_HASH
|
||||
|
@ -1010,6 +1052,26 @@ config CRYPTO_SHA3
|
|||
References:
|
||||
http://keccak.noekeon.org/
|
||||
|
||||
config CRYPTO_SHA3_256_S390
|
||||
tristate "SHA3_224 and SHA3_256 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA3_256 secure hash standard.
|
||||
|
||||
It is available as of z14.
|
||||
|
||||
config CRYPTO_SHA3_512_S390
|
||||
tristate "SHA3_384 and SHA3_512 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA3_512 secure hash standard.
|
||||
|
||||
It is available as of z14.
|
||||
|
||||
config CRYPTO_SM3
|
||||
tristate
|
||||
|
||||
|
@ -1070,6 +1132,16 @@ config CRYPTO_GHASH_CLMUL_NI_INTEL
|
|||
This is the x86_64 CLMUL-NI accelerated implementation of
|
||||
GHASH, the hash function used in GCM (Galois/Counter mode).
|
||||
|
||||
config CRYPTO_GHASH_S390
|
||||
tristate "GHASH hash function"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of GHASH,
|
||||
the hash function used in GCM (Galois/Counter mode).
|
||||
|
||||
It is available as of z196.
|
||||
|
||||
comment "Ciphers"
|
||||
|
||||
config CRYPTO_AES
|
||||
|
@ -1185,6 +1257,23 @@ config CRYPTO_AES_PPC_SPE
|
|||
architecture specific assembler implementations that work on 1KB
|
||||
tables or 256 bytes S-boxes.
|
||||
|
||||
config CRYPTO_AES_S390
|
||||
tristate "AES cipher algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_SKCIPHER
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
AES cipher algorithms (FIPS-197).
|
||||
|
||||
As of z9 the ECB and CBC modes are hardware accelerated
|
||||
for 128 bit keys.
|
||||
As of z10 the ECB and CBC modes are hardware accelerated
|
||||
for all AES key sizes.
|
||||
As of z196 the CTR mode is hardware accelerated for all AES
|
||||
key sizes and XTS mode is hardware accelerated for 256 and
|
||||
512 bit keys.
|
||||
|
||||
config CRYPTO_ANUBIS
|
||||
tristate "Anubis cipher algorithm"
|
||||
depends on CRYPTO_USER_API_ENABLE_OBSOLETE
|
||||
|
@ -1415,6 +1504,19 @@ config CRYPTO_DES3_EDE_X86_64
|
|||
algorithm are provided; regular processing one input block and
|
||||
one that processes three blocks parallel.
|
||||
|
||||
config CRYPTO_DES_S390
|
||||
tristate "DES and Triple DES cipher algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_LIB_DES
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
|
||||
|
||||
As of z990 the ECB and CBC mode are hardware accelerated.
|
||||
As of z196 the CTR mode is hardware accelerated.
|
||||
|
||||
config CRYPTO_FCRYPT
|
||||
tristate "FCrypt cipher algorithm"
|
||||
select CRYPTO_ALGAPI
|
||||
|
@ -1474,6 +1576,18 @@ config CRYPTO_CHACHA_MIPS
|
|||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||
|
||||
config CRYPTO_CHACHA_S390
|
||||
tristate "ChaCha20 stream cipher"
|
||||
depends on S390
|
||||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_LIB_CHACHA_GENERIC
|
||||
select CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||
help
|
||||
This is the s390 SIMD implementation of the ChaCha20 stream
|
||||
cipher (RFC 7539).
|
||||
|
||||
It is available as of z13.
|
||||
|
||||
config CRYPTO_SEED
|
||||
tristate "SEED cipher algorithm"
|
||||
depends on CRYPTO_USER_API_ENABLE_OBSOLETE
|
||||
|
|
|
@ -133,98 +133,6 @@ config CRYPTO_PAES_S390
|
|||
Select this option if you want to use the paes cipher
|
||||
for example to use protected key encrypted devices.
|
||||
|
||||
config CRYPTO_SHA1_S390
|
||||
tristate "SHA1 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
|
||||
|
||||
It is available as of z990.
|
||||
|
||||
config CRYPTO_SHA256_S390
|
||||
tristate "SHA256 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA256 secure hash standard (DFIPS 180-2).
|
||||
|
||||
It is available as of z9.
|
||||
|
||||
config CRYPTO_SHA512_S390
|
||||
tristate "SHA384 and SHA512 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA512 secure hash standard.
|
||||
|
||||
It is available as of z10.
|
||||
|
||||
config CRYPTO_SHA3_256_S390
|
||||
tristate "SHA3_224 and SHA3_256 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA3_256 secure hash standard.
|
||||
|
||||
It is available as of z14.
|
||||
|
||||
config CRYPTO_SHA3_512_S390
|
||||
tristate "SHA3_384 and SHA3_512 digest algorithm"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
SHA3_512 secure hash standard.
|
||||
|
||||
It is available as of z14.
|
||||
|
||||
config CRYPTO_DES_S390
|
||||
tristate "DES and Triple DES cipher algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_LIB_DES
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
|
||||
|
||||
As of z990 the ECB and CBC mode are hardware accelerated.
|
||||
As of z196 the CTR mode is hardware accelerated.
|
||||
|
||||
config CRYPTO_AES_S390
|
||||
tristate "AES cipher algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_SKCIPHER
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of the
|
||||
AES cipher algorithms (FIPS-197).
|
||||
|
||||
As of z9 the ECB and CBC modes are hardware accelerated
|
||||
for 128 bit keys.
|
||||
As of z10 the ECB and CBC modes are hardware accelerated
|
||||
for all AES key sizes.
|
||||
As of z196 the CTR mode is hardware accelerated for all AES
|
||||
key sizes and XTS mode is hardware accelerated for 256 and
|
||||
512 bit keys.
|
||||
|
||||
config CRYPTO_CHACHA_S390
|
||||
tristate "ChaCha20 stream cipher"
|
||||
depends on S390
|
||||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_LIB_CHACHA_GENERIC
|
||||
select CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||
help
|
||||
This is the s390 SIMD implementation of the ChaCha20 stream
|
||||
cipher (RFC 7539).
|
||||
|
||||
It is available as of z13.
|
||||
|
||||
config S390_PRNG
|
||||
tristate "Pseudo random number generator device driver"
|
||||
depends on S390
|
||||
|
@ -238,29 +146,6 @@ config S390_PRNG
|
|||
|
||||
It is available as of z9.
|
||||
|
||||
config CRYPTO_GHASH_S390
|
||||
tristate "GHASH hash function"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This is the s390 hardware accelerated implementation of GHASH,
|
||||
the hash function used in GCM (Galois/Counter mode).
|
||||
|
||||
It is available as of z196.
|
||||
|
||||
config CRYPTO_CRC32_S390
|
||||
tristate "CRC-32 algorithms"
|
||||
depends on S390
|
||||
select CRYPTO_HASH
|
||||
select CRC32
|
||||
help
|
||||
Select this option if you want to use hardware accelerated
|
||||
implementations of CRC algorithms. With this option, you
|
||||
can optimize the computation of CRC-32 (IEEE 802.3 Ethernet)
|
||||
and CRC-32C (Castagnoli).
|
||||
|
||||
It is available with IBM z13 or later.
|
||||
|
||||
config CRYPTO_DEV_NIAGARA2
|
||||
tristate "Niagara2 Stream Processing Unit driver"
|
||||
select CRYPTO_LIB_DES
|
||||
|
|
|
@ -94,6 +94,7 @@ config WIREGUARD
|
|||
select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
|
||||
select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
|
||||
select CRYPTO_POLY1305_MIPS if MIPS
|
||||
select CRYPTO_CHACHA_S390 if S390
|
||||
help
|
||||
WireGuard is a secure, fast, and easy to use replacement for IPSec
|
||||
that uses modern cryptography and clever networking tricks. It's
|
||||
|
|
|
@ -1646,7 +1646,6 @@ static int grcan_probe(struct platform_device *ofdev)
|
|||
*/
|
||||
sysid_parent = of_find_node_by_path("/ambapp0");
|
||||
if (sysid_parent) {
|
||||
of_node_get(sysid_parent);
|
||||
err = of_property_read_u32(sysid_parent, "systemid", &sysid);
|
||||
if (!err && ((sysid & GRLIB_VERSION_MASK) >=
|
||||
GRCAN_TXBUG_SAFE_GRLIB_VERSION))
|
||||
|
|
|
@ -529,7 +529,7 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
|
|||
/* acknowledge rx fifo 0 */
|
||||
m_can_write(cdev, M_CAN_RXF0A, fgi);
|
||||
|
||||
timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc);
|
||||
timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc) << 16;
|
||||
|
||||
m_can_receive_skb(cdev, skb, timestamp);
|
||||
|
||||
|
@ -1030,7 +1030,7 @@ static int m_can_echo_tx_event(struct net_device *dev)
|
|||
}
|
||||
|
||||
msg_mark = FIELD_GET(TX_EVENT_MM_MASK, txe);
|
||||
timestamp = FIELD_GET(TX_EVENT_TXTS_MASK, txe);
|
||||
timestamp = FIELD_GET(TX_EVENT_TXTS_MASK, txe) << 16;
|
||||
|
||||
/* ack txe element */
|
||||
m_can_write(cdev, M_CAN_TXEFA, FIELD_PREP(TXEFA_EFAI_MASK,
|
||||
|
@ -1351,7 +1351,9 @@ static void m_can_chip_config(struct net_device *dev)
|
|||
/* enable internal timestamp generation, with a prescalar of 16. The
|
||||
* prescalar is applied to the nominal bit timing
|
||||
*/
|
||||
m_can_write(cdev, M_CAN_TSCC, FIELD_PREP(TSCC_TCP_MASK, 0xf));
|
||||
m_can_write(cdev, M_CAN_TSCC,
|
||||
FIELD_PREP(TSCC_TCP_MASK, 0xf) |
|
||||
FIELD_PREP(TSCC_TSS_MASK, TSCC_TSS_INTERNAL));
|
||||
|
||||
m_can_config_endisable(cdev, false);
|
||||
|
||||
|
|
|
@ -1332,7 +1332,10 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
|
|||
cfg = (RCANFD_DCFG_DTSEG1(gpriv, tseg1) | RCANFD_DCFG_DBRP(brp) |
|
||||
RCANFD_DCFG_DSJW(sjw) | RCANFD_DCFG_DTSEG2(gpriv, tseg2));
|
||||
|
||||
rcar_canfd_write(priv->base, RCANFD_F_DCFG(ch), cfg);
|
||||
if (is_v3u(gpriv))
|
||||
rcar_canfd_write(priv->base, RCANFD_V3U_DCFG(ch), cfg);
|
||||
else
|
||||
rcar_canfd_write(priv->base, RCANFD_F_DCFG(ch), cfg);
|
||||
netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n",
|
||||
brp, sjw, tseg1, tseg2);
|
||||
} else {
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
// Copyright (c) 2019 Martin Sperl <kernel@martin.sperl.org>
|
||||
//
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -1650,6 +1651,7 @@ static int mcp251xfd_stop(struct net_device *ndev)
|
|||
netif_stop_queue(ndev);
|
||||
set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
|
||||
hrtimer_cancel(&priv->rx_irq_timer);
|
||||
hrtimer_cancel(&priv->tx_irq_timer);
|
||||
mcp251xfd_chip_interrupts_disable(priv);
|
||||
free_irq(ndev->irq, priv);
|
||||
can_rx_offload_disable(&priv->offload);
|
||||
|
@ -1777,7 +1779,7 @@ mcp251xfd_register_get_dev_id(const struct mcp251xfd_priv *priv, u32 *dev_id,
|
|||
xfer[0].len = sizeof(buf_tx->cmd);
|
||||
xfer[0].speed_hz = priv->spi_max_speed_hz_slow;
|
||||
xfer[1].rx_buf = buf_rx->data;
|
||||
xfer[1].len = sizeof(dev_id);
|
||||
xfer[1].len = sizeof(*dev_id);
|
||||
xfer[1].speed_hz = priv->spi_max_speed_hz_fast;
|
||||
|
||||
mcp251xfd_spi_cmd_read_nocrc(&buf_tx->cmd, MCP251XFD_REG_DEVID);
|
||||
|
@ -1786,7 +1788,7 @@ mcp251xfd_register_get_dev_id(const struct mcp251xfd_priv *priv, u32 *dev_id,
|
|||
if (err)
|
||||
goto out_kfree_buf_tx;
|
||||
|
||||
*dev_id = be32_to_cpup((__be32 *)buf_rx->data);
|
||||
*dev_id = get_unaligned_le32(buf_rx->data);
|
||||
*effective_speed_hz_slow = xfer[0].effective_speed_hz;
|
||||
*effective_speed_hz_fast = xfer[1].effective_speed_hz;
|
||||
|
||||
|
|
|
@ -334,19 +334,21 @@ mcp251xfd_regmap_crc_read(void *context,
|
|||
* register. It increments once per SYS clock tick,
|
||||
* which is 20 or 40 MHz.
|
||||
*
|
||||
* Observation shows that if the lowest byte (which is
|
||||
* transferred first on the SPI bus) of that register
|
||||
* is 0x00 or 0x80 the calculated CRC doesn't always
|
||||
* match the transferred one.
|
||||
* Observation on the mcp2518fd shows that if the
|
||||
* lowest byte (which is transferred first on the SPI
|
||||
* bus) of that register is 0x00 or 0x80 the
|
||||
* calculated CRC doesn't always match the transferred
|
||||
* one. On the mcp2517fd this problem is not limited
|
||||
* to the first byte being 0x00 or 0x80.
|
||||
*
|
||||
* If the highest bit in the lowest byte is flipped
|
||||
* the transferred CRC matches the calculated one. We
|
||||
* assume for now the CRC calculation in the chip
|
||||
* works on wrong data and the transferred data is
|
||||
* correct.
|
||||
* assume for now the CRC operates on the correct
|
||||
* data.
|
||||
*/
|
||||
if (reg == MCP251XFD_REG_TBC &&
|
||||
(buf_rx->data[0] == 0x0 || buf_rx->data[0] == 0x80)) {
|
||||
((buf_rx->data[0] & 0xf8) == 0x0 ||
|
||||
(buf_rx->data[0] & 0xf8) == 0x80)) {
|
||||
/* Flip highest bit in lowest byte of le32 */
|
||||
buf_rx->data[0] ^= 0x80;
|
||||
|
||||
|
@ -356,10 +358,8 @@ mcp251xfd_regmap_crc_read(void *context,
|
|||
val_len);
|
||||
if (!err) {
|
||||
/* If CRC is now correct, assume
|
||||
* transferred data was OK, flip bit
|
||||
* back to original value.
|
||||
* flipped data is OK.
|
||||
*/
|
||||
buf_rx->data[0] ^= 0x80;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -268,6 +268,8 @@ struct gs_can {
|
|||
|
||||
struct usb_anchor tx_submitted;
|
||||
atomic_t active_tx_urbs;
|
||||
void *rxbuf[GS_MAX_RX_URBS];
|
||||
dma_addr_t rxbuf_dma[GS_MAX_RX_URBS];
|
||||
};
|
||||
|
||||
/* usb interface struct */
|
||||
|
@ -742,6 +744,7 @@ static int gs_can_open(struct net_device *netdev)
|
|||
for (i = 0; i < GS_MAX_RX_URBS; i++) {
|
||||
struct urb *urb;
|
||||
u8 *buf;
|
||||
dma_addr_t buf_dma;
|
||||
|
||||
/* alloc rx urb */
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
@ -752,7 +755,7 @@ static int gs_can_open(struct net_device *netdev)
|
|||
buf = usb_alloc_coherent(dev->udev,
|
||||
dev->parent->hf_size_rx,
|
||||
GFP_KERNEL,
|
||||
&urb->transfer_dma);
|
||||
&buf_dma);
|
||||
if (!buf) {
|
||||
netdev_err(netdev,
|
||||
"No memory left for USB buffer\n");
|
||||
|
@ -760,6 +763,8 @@ static int gs_can_open(struct net_device *netdev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
urb->transfer_dma = buf_dma;
|
||||
|
||||
/* fill, anchor, and submit rx urb */
|
||||
usb_fill_bulk_urb(urb,
|
||||
dev->udev,
|
||||
|
@ -781,10 +786,17 @@ static int gs_can_open(struct net_device *netdev)
|
|||
"usb_submit failed (err=%d)\n", rc);
|
||||
|
||||
usb_unanchor_urb(urb);
|
||||
usb_free_coherent(dev->udev,
|
||||
sizeof(struct gs_host_frame),
|
||||
buf,
|
||||
buf_dma);
|
||||
usb_free_urb(urb);
|
||||
break;
|
||||
}
|
||||
|
||||
dev->rxbuf[i] = buf;
|
||||
dev->rxbuf_dma[i] = buf_dma;
|
||||
|
||||
/* Drop reference,
|
||||
* USB core will take care of freeing it
|
||||
*/
|
||||
|
@ -842,13 +854,20 @@ static int gs_can_close(struct net_device *netdev)
|
|||
int rc;
|
||||
struct gs_can *dev = netdev_priv(netdev);
|
||||
struct gs_usb *parent = dev->parent;
|
||||
unsigned int i;
|
||||
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
/* Stop polling */
|
||||
parent->active_channels--;
|
||||
if (!parent->active_channels)
|
||||
if (!parent->active_channels) {
|
||||
usb_kill_anchored_urbs(&parent->rx_submitted);
|
||||
for (i = 0; i < GS_MAX_RX_URBS; i++)
|
||||
usb_free_coherent(dev->udev,
|
||||
sizeof(struct gs_host_frame),
|
||||
dev->rxbuf[i],
|
||||
dev->rxbuf_dma[i]);
|
||||
}
|
||||
|
||||
/* Stop sending URBs */
|
||||
usb_kill_anchored_urbs(&dev->tx_submitted);
|
||||
|
|
|
@ -35,9 +35,10 @@
|
|||
#define KVASER_USB_RX_BUFFER_SIZE 3072
|
||||
#define KVASER_USB_MAX_NET_DEVICES 5
|
||||
|
||||
/* USB devices features */
|
||||
#define KVASER_USB_HAS_SILENT_MODE BIT(0)
|
||||
#define KVASER_USB_HAS_TXRX_ERRORS BIT(1)
|
||||
/* Kvaser USB device quirks */
|
||||
#define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0)
|
||||
#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1)
|
||||
#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ BIT(2)
|
||||
|
||||
/* Device capabilities */
|
||||
#define KVASER_USB_CAP_BERR_CAP 0x01
|
||||
|
@ -65,12 +66,7 @@ struct kvaser_usb_dev_card_data_hydra {
|
|||
struct kvaser_usb_dev_card_data {
|
||||
u32 ctrlmode_supported;
|
||||
u32 capabilities;
|
||||
union {
|
||||
struct {
|
||||
enum kvaser_usb_leaf_family family;
|
||||
} leaf;
|
||||
struct kvaser_usb_dev_card_data_hydra hydra;
|
||||
};
|
||||
struct kvaser_usb_dev_card_data_hydra hydra;
|
||||
};
|
||||
|
||||
/* Context for an outstanding, not yet ACKed, transmission */
|
||||
|
@ -83,7 +79,7 @@ struct kvaser_usb {
|
|||
struct usb_device *udev;
|
||||
struct usb_interface *intf;
|
||||
struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
|
||||
const struct kvaser_usb_dev_ops *ops;
|
||||
const struct kvaser_usb_driver_info *driver_info;
|
||||
const struct kvaser_usb_dev_cfg *cfg;
|
||||
|
||||
struct usb_endpoint_descriptor *bulk_in, *bulk_out;
|
||||
|
@ -165,6 +161,12 @@ struct kvaser_usb_dev_ops {
|
|||
u16 transid);
|
||||
};
|
||||
|
||||
struct kvaser_usb_driver_info {
|
||||
u32 quirks;
|
||||
enum kvaser_usb_leaf_family family;
|
||||
const struct kvaser_usb_dev_ops *ops;
|
||||
};
|
||||
|
||||
struct kvaser_usb_dev_cfg {
|
||||
const struct can_clock clock;
|
||||
const unsigned int timestamp_freq;
|
||||
|
@ -184,4 +186,7 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
|
|||
int len);
|
||||
|
||||
int kvaser_usb_can_rx_over_error(struct net_device *netdev);
|
||||
|
||||
extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
|
||||
|
||||
#endif /* KVASER_USB_H */
|
||||
|
|
|
@ -61,8 +61,6 @@
|
|||
#define USB_USBCAN_R_V2_PRODUCT_ID 294
|
||||
#define USB_LEAF_LIGHT_R_V2_PRODUCT_ID 295
|
||||
#define USB_LEAF_LIGHT_HS_V2_OEM2_PRODUCT_ID 296
|
||||
#define USB_LEAF_PRODUCT_ID_END \
|
||||
USB_LEAF_LIGHT_HS_V2_OEM2_PRODUCT_ID
|
||||
|
||||
/* Kvaser USBCan-II devices product ids */
|
||||
#define USB_USBCAN_REVB_PRODUCT_ID 2
|
||||
|
@ -89,116 +87,153 @@
|
|||
#define USB_USBCAN_PRO_4HS_PRODUCT_ID 276
|
||||
#define USB_HYBRID_CANLIN_PRODUCT_ID 277
|
||||
#define USB_HYBRID_PRO_CANLIN_PRODUCT_ID 278
|
||||
#define USB_HYDRA_PRODUCT_ID_END \
|
||||
USB_HYBRID_PRO_CANLIN_PRODUCT_ID
|
||||
|
||||
static inline bool kvaser_is_leaf(const struct usb_device_id *id)
|
||||
{
|
||||
return (id->idProduct >= USB_LEAF_DEVEL_PRODUCT_ID &&
|
||||
id->idProduct <= USB_CAN_R_PRODUCT_ID) ||
|
||||
(id->idProduct >= USB_LEAF_LITE_V2_PRODUCT_ID &&
|
||||
id->idProduct <= USB_LEAF_PRODUCT_ID_END);
|
||||
}
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_hydra = {
|
||||
.quirks = 0,
|
||||
.ops = &kvaser_usb_hydra_dev_ops,
|
||||
};
|
||||
|
||||
static inline bool kvaser_is_usbcan(const struct usb_device_id *id)
|
||||
{
|
||||
return id->idProduct >= USB_USBCAN_REVB_PRODUCT_ID &&
|
||||
id->idProduct <= USB_MEMORATOR_PRODUCT_ID;
|
||||
}
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_usbcan = {
|
||||
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_QUIRK_HAS_SILENT_MODE,
|
||||
.family = KVASER_USBCAN,
|
||||
.ops = &kvaser_usb_leaf_dev_ops,
|
||||
};
|
||||
|
||||
static inline bool kvaser_is_hydra(const struct usb_device_id *id)
|
||||
{
|
||||
return id->idProduct >= USB_BLACKBIRD_V2_PRODUCT_ID &&
|
||||
id->idProduct <= USB_HYDRA_PRODUCT_ID_END;
|
||||
}
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = {
|
||||
.quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
|
||||
.family = KVASER_LEAF,
|
||||
.ops = &kvaser_usb_leaf_dev_ops,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err = {
|
||||
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
|
||||
.family = KVASER_LEAF,
|
||||
.ops = &kvaser_usb_leaf_dev_ops,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err_listen = {
|
||||
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_QUIRK_HAS_SILENT_MODE |
|
||||
KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
|
||||
.family = KVASER_LEAF,
|
||||
.ops = &kvaser_usb_leaf_dev_ops,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leafimx = {
|
||||
.quirks = 0,
|
||||
.ops = &kvaser_usb_leaf_dev_ops,
|
||||
};
|
||||
|
||||
static const struct usb_device_id kvaser_usb_table[] = {
|
||||
/* Leaf USB product IDs */
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID) },
|
||||
/* Leaf M32C USB product IDs */
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID) },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
||||
KVASER_USB_HAS_SILENT_MODE },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_CH_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_SPRO_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_MERCURY_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_LEAF_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_R_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_R_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM2_PRODUCT_ID) },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err },
|
||||
|
||||
/* Leaf i.MX28 USB product IDs */
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_R_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_R_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx },
|
||||
|
||||
/* USBCANII USB product IDs */
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_REVB_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMORATOR_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_VCI2_PRODUCT_ID),
|
||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS },
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan },
|
||||
|
||||
/* Minihydra USB product IDs */
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_5HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_5HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_4HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_HS_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_2HS_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_2HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_2CANLIN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_MEMO_PRO_2HS_V2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_2CANLIN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100P_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100S_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_4HS_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_CANLIN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_5HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_5HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_4HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_HS_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_2HS_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_2HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_2CANLIN_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_MEMO_PRO_2HS_V2_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_2CANLIN_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100P_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_U100S_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_4HS_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_CANLIN_PRODUCT_ID),
|
||||
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, kvaser_usb_table);
|
||||
|
@ -285,6 +320,7 @@ int kvaser_usb_can_rx_over_error(struct net_device *netdev)
|
|||
static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
||||
{
|
||||
struct kvaser_usb *dev = urb->context;
|
||||
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||
int err;
|
||||
unsigned int i;
|
||||
|
||||
|
@ -301,8 +337,8 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
|||
goto resubmit_urb;
|
||||
}
|
||||
|
||||
dev->ops->dev_read_bulk_callback(dev, urb->transfer_buffer,
|
||||
urb->actual_length);
|
||||
ops->dev_read_bulk_callback(dev, urb->transfer_buffer,
|
||||
urb->actual_length);
|
||||
|
||||
resubmit_urb:
|
||||
usb_fill_bulk_urb(urb, dev->udev,
|
||||
|
@ -396,6 +432,7 @@ static int kvaser_usb_open(struct net_device *netdev)
|
|||
{
|
||||
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||
int err;
|
||||
|
||||
err = open_candev(netdev);
|
||||
|
@ -406,11 +443,11 @@ static int kvaser_usb_open(struct net_device *netdev)
|
|||
if (err)
|
||||
goto error;
|
||||
|
||||
err = dev->ops->dev_set_opt_mode(priv);
|
||||
err = ops->dev_set_opt_mode(priv);
|
||||
if (err)
|
||||
goto error;
|
||||
|
||||
err = dev->ops->dev_start_chip(priv);
|
||||
err = ops->dev_start_chip(priv);
|
||||
if (err) {
|
||||
netdev_warn(netdev, "Cannot start device, error %d\n", err);
|
||||
goto error;
|
||||
|
@ -467,22 +504,23 @@ static int kvaser_usb_close(struct net_device *netdev)
|
|||
{
|
||||
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||
int err;
|
||||
|
||||
netif_stop_queue(netdev);
|
||||
|
||||
err = dev->ops->dev_flush_queue(priv);
|
||||
err = ops->dev_flush_queue(priv);
|
||||
if (err)
|
||||
netdev_warn(netdev, "Cannot flush queue, error %d\n", err);
|
||||
|
||||
if (dev->ops->dev_reset_chip) {
|
||||
err = dev->ops->dev_reset_chip(dev, priv->channel);
|
||||
if (ops->dev_reset_chip) {
|
||||
err = ops->dev_reset_chip(dev, priv->channel);
|
||||
if (err)
|
||||
netdev_warn(netdev, "Cannot reset card, error %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
err = dev->ops->dev_stop_chip(priv);
|
||||
err = ops->dev_stop_chip(priv);
|
||||
if (err)
|
||||
netdev_warn(netdev, "Cannot stop device, error %d\n", err);
|
||||
|
||||
|
@ -521,6 +559,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
{
|
||||
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
||||
struct kvaser_usb *dev = priv->dev;
|
||||
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||
struct net_device_stats *stats = &netdev->stats;
|
||||
struct kvaser_usb_tx_urb_context *context = NULL;
|
||||
struct urb *urb;
|
||||
|
@ -563,8 +602,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
goto freeurb;
|
||||
}
|
||||
|
||||
buf = dev->ops->dev_frame_to_cmd(priv, skb, &cmd_len,
|
||||
context->echo_index);
|
||||
buf = ops->dev_frame_to_cmd(priv, skb, &cmd_len, context->echo_index);
|
||||
if (!buf) {
|
||||
stats->tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
|
@ -648,15 +686,16 @@ static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static int kvaser_usb_init_one(struct kvaser_usb *dev,
|
||||
const struct usb_device_id *id, int channel)
|
||||
static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct kvaser_usb_net_priv *priv;
|
||||
const struct kvaser_usb_driver_info *driver_info = dev->driver_info;
|
||||
const struct kvaser_usb_dev_ops *ops = driver_info->ops;
|
||||
int err;
|
||||
|
||||
if (dev->ops->dev_reset_chip) {
|
||||
err = dev->ops->dev_reset_chip(dev, channel);
|
||||
if (ops->dev_reset_chip) {
|
||||
err = ops->dev_reset_chip(dev, channel);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@ -685,20 +724,19 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev,
|
|||
priv->can.state = CAN_STATE_STOPPED;
|
||||
priv->can.clock.freq = dev->cfg->clock.freq;
|
||||
priv->can.bittiming_const = dev->cfg->bittiming_const;
|
||||
priv->can.do_set_bittiming = dev->ops->dev_set_bittiming;
|
||||
priv->can.do_set_mode = dev->ops->dev_set_mode;
|
||||
if ((id->driver_info & KVASER_USB_HAS_TXRX_ERRORS) ||
|
||||
priv->can.do_set_bittiming = ops->dev_set_bittiming;
|
||||
priv->can.do_set_mode = ops->dev_set_mode;
|
||||
if ((driver_info->quirks & KVASER_USB_QUIRK_HAS_TXRX_ERRORS) ||
|
||||
(priv->dev->card_data.capabilities & KVASER_USB_CAP_BERR_CAP))
|
||||
priv->can.do_get_berr_counter = dev->ops->dev_get_berr_counter;
|
||||
if (id->driver_info & KVASER_USB_HAS_SILENT_MODE)
|
||||
priv->can.do_get_berr_counter = ops->dev_get_berr_counter;
|
||||
if (driver_info->quirks & KVASER_USB_QUIRK_HAS_SILENT_MODE)
|
||||
priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
|
||||
|
||||
priv->can.ctrlmode_supported |= dev->card_data.ctrlmode_supported;
|
||||
|
||||
if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) {
|
||||
priv->can.data_bittiming_const = dev->cfg->data_bittiming_const;
|
||||
priv->can.do_set_data_bittiming =
|
||||
dev->ops->dev_set_data_bittiming;
|
||||
priv->can.do_set_data_bittiming = ops->dev_set_data_bittiming;
|
||||
}
|
||||
|
||||
netdev->flags |= IFF_ECHO;
|
||||
|
@ -729,29 +767,22 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|||
struct kvaser_usb *dev;
|
||||
int err;
|
||||
int i;
|
||||
const struct kvaser_usb_driver_info *driver_info;
|
||||
const struct kvaser_usb_dev_ops *ops;
|
||||
|
||||
driver_info = (const struct kvaser_usb_driver_info *)id->driver_info;
|
||||
if (!driver_info)
|
||||
return -ENODEV;
|
||||
|
||||
dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
if (kvaser_is_leaf(id)) {
|
||||
dev->card_data.leaf.family = KVASER_LEAF;
|
||||
dev->ops = &kvaser_usb_leaf_dev_ops;
|
||||
} else if (kvaser_is_usbcan(id)) {
|
||||
dev->card_data.leaf.family = KVASER_USBCAN;
|
||||
dev->ops = &kvaser_usb_leaf_dev_ops;
|
||||
} else if (kvaser_is_hydra(id)) {
|
||||
dev->ops = &kvaser_usb_hydra_dev_ops;
|
||||
} else {
|
||||
dev_err(&intf->dev,
|
||||
"Product ID (%d) is not a supported Kvaser USB device\n",
|
||||
id->idProduct);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
dev->intf = intf;
|
||||
dev->driver_info = driver_info;
|
||||
ops = driver_info->ops;
|
||||
|
||||
err = dev->ops->dev_setup_endpoints(dev);
|
||||
err = ops->dev_setup_endpoints(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev, "Cannot get usb endpoint(s)");
|
||||
return err;
|
||||
|
@ -765,22 +796,22 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|||
|
||||
dev->card_data.ctrlmode_supported = 0;
|
||||
dev->card_data.capabilities = 0;
|
||||
err = dev->ops->dev_init_card(dev);
|
||||
err = ops->dev_init_card(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev,
|
||||
"Failed to initialize card, error %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = dev->ops->dev_get_software_info(dev);
|
||||
err = ops->dev_get_software_info(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev,
|
||||
"Cannot get software info, error %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (dev->ops->dev_get_software_details) {
|
||||
err = dev->ops->dev_get_software_details(dev);
|
||||
if (ops->dev_get_software_details) {
|
||||
err = ops->dev_get_software_details(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev,
|
||||
"Cannot get software details, error %d\n", err);
|
||||
|
@ -798,14 +829,14 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|||
|
||||
dev_dbg(&intf->dev, "Max outstanding tx = %d URBs\n", dev->max_tx_urbs);
|
||||
|
||||
err = dev->ops->dev_get_card_info(dev);
|
||||
err = ops->dev_get_card_info(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev, "Cannot get card info, error %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (dev->ops->dev_get_capabilities) {
|
||||
err = dev->ops->dev_get_capabilities(dev);
|
||||
if (ops->dev_get_capabilities) {
|
||||
err = ops->dev_get_capabilities(dev);
|
||||
if (err) {
|
||||
dev_err(&intf->dev,
|
||||
"Cannot get capabilities, error %d\n", err);
|
||||
|
@ -815,7 +846,7 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
|||
}
|
||||
|
||||
for (i = 0; i < dev->nchannels; i++) {
|
||||
err = kvaser_usb_init_one(dev, id, i);
|
||||
err = kvaser_usb_init_one(dev, i);
|
||||
if (err) {
|
||||
kvaser_usb_remove_interfaces(dev);
|
||||
return err;
|
||||
|
|
|
@ -375,7 +375,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
|
|||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const kvaser_usb_hydra_flexc_bittiming_c = {
|
||||
const struct can_bittiming_const kvaser_usb_flexc_bittiming_const = {
|
||||
.name = "kvaser_usb_flex",
|
||||
.tseg1_min = 4,
|
||||
.tseg1_max = 16,
|
||||
|
@ -2052,7 +2052,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = {
|
|||
.freq = 24 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c,
|
||||
.bittiming_const = &kvaser_usb_flexc_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_rt = {
|
||||
|
|
|
@ -101,16 +101,6 @@
|
|||
#define USBCAN_ERROR_STATE_RX_ERROR BIT(1)
|
||||
#define USBCAN_ERROR_STATE_BUSERROR BIT(2)
|
||||
|
||||
/* bittiming parameters */
|
||||
#define KVASER_USB_TSEG1_MIN 1
|
||||
#define KVASER_USB_TSEG1_MAX 16
|
||||
#define KVASER_USB_TSEG2_MIN 1
|
||||
#define KVASER_USB_TSEG2_MAX 8
|
||||
#define KVASER_USB_SJW_MAX 4
|
||||
#define KVASER_USB_BRP_MIN 1
|
||||
#define KVASER_USB_BRP_MAX 64
|
||||
#define KVASER_USB_BRP_INC 1
|
||||
|
||||
/* ctrl modes */
|
||||
#define KVASER_CTRL_MODE_NORMAL 1
|
||||
#define KVASER_CTRL_MODE_SILENT 2
|
||||
|
@ -343,48 +333,68 @@ struct kvaser_usb_err_summary {
|
|||
};
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
||||
.name = "kvaser_usb",
|
||||
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
||||
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
||||
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
||||
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
||||
.sjw_max = KVASER_USB_SJW_MAX,
|
||||
.brp_min = KVASER_USB_BRP_MIN,
|
||||
.brp_max = KVASER_USB_BRP_MAX,
|
||||
.brp_inc = KVASER_USB_BRP_INC,
|
||||
static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = {
|
||||
.name = "kvaser_usb_ucii",
|
||||
.tseg1_min = 4,
|
||||
.tseg1_max = 16,
|
||||
.tseg2_min = 2,
|
||||
.tseg2_max = 8,
|
||||
.sjw_max = 4,
|
||||
.brp_min = 1,
|
||||
.brp_max = 16,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
|
||||
static const struct can_bittiming_const kvaser_usb_leaf_m32c_bittiming_const = {
|
||||
.name = "kvaser_usb_leaf",
|
||||
.tseg1_min = 3,
|
||||
.tseg1_max = 16,
|
||||
.tseg2_min = 2,
|
||||
.tseg2_max = 8,
|
||||
.sjw_max = 4,
|
||||
.brp_min = 2,
|
||||
.brp_max = 128,
|
||||
.brp_inc = 2,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_usbcan_dev_cfg = {
|
||||
.clock = {
|
||||
.freq = 8 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
.bittiming_const = &kvaser_usb_leaf_m16c_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_m32c_dev_cfg = {
|
||||
.clock = {
|
||||
.freq = 16 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
.bittiming_const = &kvaser_usb_leaf_m32c_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_16mhz = {
|
||||
.clock = {
|
||||
.freq = 16 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_flexc_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_24mhz = {
|
||||
.clock = {
|
||||
.freq = 24 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
.bittiming_const = &kvaser_usb_flexc_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_32mhz = {
|
||||
.clock = {
|
||||
.freq = 32 * MEGA /* Hz */,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
.bittiming_const = &kvaser_usb_flexc_bittiming_const,
|
||||
};
|
||||
|
||||
static void *
|
||||
|
@ -404,7 +414,7 @@ kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
|||
sizeof(struct kvaser_cmd_tx_can);
|
||||
cmd->u.tx_can.channel = priv->channel;
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
switch (dev->driver_info->family) {
|
||||
case KVASER_LEAF:
|
||||
cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;
|
||||
break;
|
||||
|
@ -524,16 +534,23 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
|
|||
dev->fw_version = le32_to_cpu(softinfo->fw_version);
|
||||
dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
|
||||
|
||||
switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz;
|
||||
break;
|
||||
if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) {
|
||||
/* Firmware expects bittiming parameters calculated for 16MHz
|
||||
* clock, regardless of the actual clock
|
||||
*/
|
||||
dev->cfg = &kvaser_usb_leaf_m32c_dev_cfg;
|
||||
} else {
|
||||
switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_16mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_24mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_32mhz;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -550,7 +567,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
switch (dev->driver_info->family) {
|
||||
case KVASER_LEAF:
|
||||
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
|
||||
break;
|
||||
|
@ -558,7 +575,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
|||
dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version);
|
||||
dev->max_tx_urbs =
|
||||
le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx);
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_8mhz;
|
||||
dev->cfg = &kvaser_usb_leaf_usbcan_dev_cfg;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -597,7 +614,7 @@ static int kvaser_usb_leaf_get_card_info(struct kvaser_usb *dev)
|
|||
|
||||
dev->nchannels = cmd.u.cardinfo.nchannels;
|
||||
if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES ||
|
||||
(dev->card_data.leaf.family == KVASER_USBCAN &&
|
||||
(dev->driver_info->family == KVASER_USBCAN &&
|
||||
dev->nchannels > MAX_USBCAN_NET_DEVICES))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -730,7 +747,7 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
|
|||
new_state < CAN_STATE_BUS_OFF)
|
||||
priv->can.can_stats.restarts++;
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
switch (dev->driver_info->family) {
|
||||
case KVASER_LEAF:
|
||||
if (es->leaf.error_factor) {
|
||||
priv->can.can_stats.bus_error++;
|
||||
|
@ -809,7 +826,7 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
|
|||
}
|
||||
}
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
switch (dev->driver_info->family) {
|
||||
case KVASER_LEAF:
|
||||
if (es->leaf.error_factor) {
|
||||
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT;
|
||||
|
@ -999,7 +1016,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
|||
stats = &priv->netdev->stats;
|
||||
|
||||
if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) &&
|
||||
(dev->card_data.leaf.family == KVASER_LEAF &&
|
||||
(dev->driver_info->family == KVASER_LEAF &&
|
||||
cmd->id == CMD_LEAF_LOG_MESSAGE)) {
|
||||
kvaser_usb_leaf_leaf_rx_error(dev, cmd);
|
||||
return;
|
||||
|
@ -1015,7 +1032,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
|||
return;
|
||||
}
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
switch (dev->driver_info->family) {
|
||||
case KVASER_LEAF:
|
||||
rx_data = cmd->u.leaf.rx_can.data;
|
||||
break;
|
||||
|
@ -1030,7 +1047,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
|||
return;
|
||||
}
|
||||
|
||||
if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id ==
|
||||
if (dev->driver_info->family == KVASER_LEAF && cmd->id ==
|
||||
CMD_LEAF_LOG_MESSAGE) {
|
||||
cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id);
|
||||
if (cf->can_id & KVASER_EXTENDED_FRAME)
|
||||
|
@ -1128,14 +1145,14 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
|
|||
break;
|
||||
|
||||
case CMD_LEAF_LOG_MESSAGE:
|
||||
if (dev->card_data.leaf.family != KVASER_LEAF)
|
||||
if (dev->driver_info->family != KVASER_LEAF)
|
||||
goto warn;
|
||||
kvaser_usb_leaf_rx_can_msg(dev, cmd);
|
||||
break;
|
||||
|
||||
case CMD_CHIP_STATE_EVENT:
|
||||
case CMD_CAN_ERROR_EVENT:
|
||||
if (dev->card_data.leaf.family == KVASER_LEAF)
|
||||
if (dev->driver_info->family == KVASER_LEAF)
|
||||
kvaser_usb_leaf_leaf_rx_error(dev, cmd);
|
||||
else
|
||||
kvaser_usb_leaf_usbcan_rx_error(dev, cmd);
|
||||
|
@ -1147,12 +1164,12 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
|
|||
|
||||
/* Ignored commands */
|
||||
case CMD_USBCAN_CLOCK_OVERFLOW_EVENT:
|
||||
if (dev->card_data.leaf.family != KVASER_USBCAN)
|
||||
if (dev->driver_info->family != KVASER_USBCAN)
|
||||
goto warn;
|
||||
break;
|
||||
|
||||
case CMD_FLUSH_QUEUE_REPLY:
|
||||
if (dev->card_data.leaf.family != KVASER_LEAF)
|
||||
if (dev->driver_info->family != KVASER_LEAF)
|
||||
goto warn;
|
||||
break;
|
||||
|
||||
|
|
|
@ -258,7 +258,7 @@ static const struct can_bittiming_const xcan_bittiming_const_canfd2 = {
|
|||
.tseg2_min = 1,
|
||||
.tseg2_max = 128,
|
||||
.sjw_max = 128,
|
||||
.brp_min = 2,
|
||||
.brp_min = 1,
|
||||
.brp_max = 256,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
@ -271,7 +271,7 @@ static const struct can_bittiming_const xcan_data_bittiming_const_canfd2 = {
|
|||
.tseg2_min = 1,
|
||||
.tseg2_max = 16,
|
||||
.sjw_max = 16,
|
||||
.brp_min = 2,
|
||||
.brp_min = 1,
|
||||
.brp_max = 256,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
|
|
@ -5981,6 +5981,15 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset)
|
|||
release_sub_crqs(adapter, 0);
|
||||
rc = init_sub_crqs(adapter);
|
||||
} else {
|
||||
/* no need to reinitialize completely, but we do
|
||||
* need to clean up transmits that were in flight
|
||||
* when we processed the reset. Failure to do so
|
||||
* will confound the upper layer, usually TCP, by
|
||||
* creating the illusion of transmits that are
|
||||
* awaiting completion.
|
||||
*/
|
||||
clean_tx_pools(adapter);
|
||||
|
||||
rc = reset_sub_crq_queues(adapter);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <net/tc_act/tc_mirred.h>
|
||||
#include <net/udp_tunnel.h>
|
||||
#include <net/xdp_sock.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include "i40e_type.h"
|
||||
#include "i40e_prototype.h"
|
||||
#include <linux/net/intel/i40e_client.h>
|
||||
|
@ -1092,6 +1093,21 @@ static inline void i40e_write_fd_input_set(struct i40e_pf *pf,
|
|||
(u32)(val & 0xFFFFFFFFULL));
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_get_pf_count - get PCI PF count.
|
||||
* @hw: pointer to a hw.
|
||||
*
|
||||
* Reports the function number of the highest PCI physical
|
||||
* function plus 1 as it is loaded from the NVM.
|
||||
*
|
||||
* Return: PCI PF count.
|
||||
**/
|
||||
static inline u32 i40e_get_pf_count(struct i40e_hw *hw)
|
||||
{
|
||||
return FIELD_GET(I40E_GLGEN_PCIFCNCNT_PCIPFCNT_MASK,
|
||||
rd32(hw, I40E_GLGEN_PCIFCNCNT));
|
||||
}
|
||||
|
||||
/* needed by i40e_ethtool.c */
|
||||
int i40e_up(struct i40e_vsi *vsi);
|
||||
void i40e_down(struct i40e_vsi *vsi);
|
||||
|
|
|
@ -550,6 +550,47 @@ void i40e_pf_reset_stats(struct i40e_pf *pf)
|
|||
pf->hw_csum_rx_error = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_compute_pci_to_hw_id - compute index form PCI function.
|
||||
* @vsi: ptr to the VSI to read from.
|
||||
* @hw: ptr to the hardware info.
|
||||
**/
|
||||
static u32 i40e_compute_pci_to_hw_id(struct i40e_vsi *vsi, struct i40e_hw *hw)
|
||||
{
|
||||
int pf_count = i40e_get_pf_count(hw);
|
||||
|
||||
if (vsi->type == I40E_VSI_SRIOV)
|
||||
return (hw->port * BIT(7)) / pf_count + vsi->vf_id;
|
||||
|
||||
return hw->port + BIT(7);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_stat_update64 - read and update a 64 bit stat from the chip.
|
||||
* @hw: ptr to the hardware info.
|
||||
* @hireg: the high 32 bit reg to read.
|
||||
* @loreg: the low 32 bit reg to read.
|
||||
* @offset_loaded: has the initial offset been loaded yet.
|
||||
* @offset: ptr to current offset value.
|
||||
* @stat: ptr to the stat.
|
||||
*
|
||||
* Since the device stats are not reset at PFReset, they will not
|
||||
* be zeroed when the driver starts. We'll save the first values read
|
||||
* and use them as offsets to be subtracted from the raw values in order
|
||||
* to report stats that count from zero.
|
||||
**/
|
||||
static void i40e_stat_update64(struct i40e_hw *hw, u32 hireg, u32 loreg,
|
||||
bool offset_loaded, u64 *offset, u64 *stat)
|
||||
{
|
||||
u64 new_data;
|
||||
|
||||
new_data = rd64(hw, loreg);
|
||||
|
||||
if (!offset_loaded || new_data < *offset)
|
||||
*offset = new_data;
|
||||
*stat = new_data - *offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_stat_update48 - read and update a 48 bit stat from the chip
|
||||
* @hw: ptr to the hardware info
|
||||
|
@ -621,6 +662,34 @@ static void i40e_stat_update_and_clear32(struct i40e_hw *hw, u32 reg, u64 *stat)
|
|||
*stat += new_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_stats_update_rx_discards - update rx_discards.
|
||||
* @vsi: ptr to the VSI to be updated.
|
||||
* @hw: ptr to the hardware info.
|
||||
* @stat_idx: VSI's stat_counter_idx.
|
||||
* @offset_loaded: ptr to the VSI's stat_offsets_loaded.
|
||||
* @stat_offset: ptr to stat_offset to store first read of specific register.
|
||||
* @stat: ptr to VSI's stat to be updated.
|
||||
**/
|
||||
static void
|
||||
i40e_stats_update_rx_discards(struct i40e_vsi *vsi, struct i40e_hw *hw,
|
||||
int stat_idx, bool offset_loaded,
|
||||
struct i40e_eth_stats *stat_offset,
|
||||
struct i40e_eth_stats *stat)
|
||||
{
|
||||
u64 rx_rdpc, rx_rxerr;
|
||||
|
||||
i40e_stat_update32(hw, I40E_GLV_RDPC(stat_idx), offset_loaded,
|
||||
&stat_offset->rx_discards, &rx_rdpc);
|
||||
i40e_stat_update64(hw,
|
||||
I40E_GL_RXERR1H(i40e_compute_pci_to_hw_id(vsi, hw)),
|
||||
I40E_GL_RXERR1L(i40e_compute_pci_to_hw_id(vsi, hw)),
|
||||
offset_loaded, &stat_offset->rx_discards_other,
|
||||
&rx_rxerr);
|
||||
|
||||
stat->rx_discards = rx_rdpc + rx_rxerr;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_update_eth_stats - Update VSI-specific ethernet statistics counters.
|
||||
* @vsi: the VSI to be updated
|
||||
|
@ -680,6 +749,10 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)
|
|||
I40E_GLV_BPTCL(stat_idx),
|
||||
vsi->stat_offsets_loaded,
|
||||
&oes->tx_broadcast, &es->tx_broadcast);
|
||||
|
||||
i40e_stats_update_rx_discards(vsi, hw, stat_idx,
|
||||
vsi->stat_offsets_loaded, oes, es);
|
||||
|
||||
vsi->stat_offsets_loaded = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -211,6 +211,11 @@
|
|||
#define I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT 0
|
||||
#define I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT 16
|
||||
#define I40E_GLGEN_MSRWD_MDIRDDATA_MASK I40E_MASK(0xFFFF, I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT)
|
||||
#define I40E_GLGEN_PCIFCNCNT 0x001C0AB4 /* Reset: PCIR */
|
||||
#define I40E_GLGEN_PCIFCNCNT_PCIPFCNT_SHIFT 0
|
||||
#define I40E_GLGEN_PCIFCNCNT_PCIPFCNT_MASK I40E_MASK(0x1F, I40E_GLGEN_PCIFCNCNT_PCIPFCNT_SHIFT)
|
||||
#define I40E_GLGEN_PCIFCNCNT_PCIVFCNT_SHIFT 16
|
||||
#define I40E_GLGEN_PCIFCNCNT_PCIVFCNT_MASK I40E_MASK(0xFF, I40E_GLGEN_PCIFCNCNT_PCIVFCNT_SHIFT)
|
||||
#define I40E_GLGEN_RSTAT 0x000B8188 /* Reset: POR */
|
||||
#define I40E_GLGEN_RSTAT_DEVSTATE_SHIFT 0
|
||||
#define I40E_GLGEN_RSTAT_DEVSTATE_MASK I40E_MASK(0x3, I40E_GLGEN_RSTAT_DEVSTATE_SHIFT)
|
||||
|
@ -643,6 +648,14 @@
|
|||
#define I40E_VFQF_HKEY1_MAX_INDEX 12
|
||||
#define I40E_VFQF_HLUT1(_i, _VF) (0x00220000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...15, _VF=0...127 */ /* Reset: CORER */
|
||||
#define I40E_VFQF_HLUT1_MAX_INDEX 15
|
||||
#define I40E_GL_RXERR1H(_i) (0x00318004 + ((_i) * 8)) /* _i=0...143 */ /* Reset: CORER */
|
||||
#define I40E_GL_RXERR1H_MAX_INDEX 143
|
||||
#define I40E_GL_RXERR1H_RXERR1H_SHIFT 0
|
||||
#define I40E_GL_RXERR1H_RXERR1H_MASK I40E_MASK(0xFFFFFFFF, I40E_GL_RXERR1H_RXERR1H_SHIFT)
|
||||
#define I40E_GL_RXERR1L(_i) (0x00318000 + ((_i) * 8)) /* _i=0...143 */ /* Reset: CORER */
|
||||
#define I40E_GL_RXERR1L_MAX_INDEX 143
|
||||
#define I40E_GL_RXERR1L_RXERR1L_SHIFT 0
|
||||
#define I40E_GL_RXERR1L_RXERR1L_MASK I40E_MASK(0xFFFFFFFF, I40E_GL_RXERR1L_RXERR1L_SHIFT)
|
||||
#define I40E_GLPRT_BPRCH(_i) (0x003005E4 + ((_i) * 8)) /* _i=0...3 */ /* Reset: CORER */
|
||||
#define I40E_GLPRT_BPRCL(_i) (0x003005E0 + ((_i) * 8)) /* _i=0...3 */ /* Reset: CORER */
|
||||
#define I40E_GLPRT_BPTCH(_i) (0x00300A04 + ((_i) * 8)) /* _i=0...3 */ /* Reset: CORER */
|
||||
|
|
|
@ -1172,6 +1172,7 @@ struct i40e_eth_stats {
|
|||
u64 tx_broadcast; /* bptc */
|
||||
u64 tx_discards; /* tdpc */
|
||||
u64 tx_errors; /* tepc */
|
||||
u64 rx_discards_other; /* rxerr1 */
|
||||
};
|
||||
|
||||
/* Statistics collected per VEB per TC */
|
||||
|
|
|
@ -2147,6 +2147,10 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)
|
|||
/* VFs only use TC 0 */
|
||||
vfres->vsi_res[0].qset_handle
|
||||
= le16_to_cpu(vsi->info.qs_handle[0]);
|
||||
if (!(vf->driver_caps & VIRTCHNL_VF_OFFLOAD_USO) && !vf->pf_set_mac) {
|
||||
i40e_del_mac_filter(vsi, vf->default_lan_addr.addr);
|
||||
eth_zero_addr(vf->default_lan_addr.addr);
|
||||
}
|
||||
ether_addr_copy(vfres->vsi_res[0].default_mac_addr,
|
||||
vf->default_lan_addr.addr);
|
||||
}
|
||||
|
|
|
@ -4529,13 +4529,6 @@ static int mlx5e_policer_validate(const struct flow_action *action,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (act->police.notexceed.act_id != FLOW_ACTION_PIPE &&
|
||||
act->police.notexceed.act_id != FLOW_ACTION_ACCEPT) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Offload not supported when conform action is not pipe or ok");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (act->police.notexceed.act_id == FLOW_ACTION_ACCEPT &&
|
||||
!flow_action_is_last_entry(action, act)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
|
@ -4586,6 +4579,12 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv,
|
|||
flow_action_for_each(i, act, flow_action) {
|
||||
switch (act->id) {
|
||||
case FLOW_ACTION_POLICE:
|
||||
if (act->police.notexceed.act_id != FLOW_ACTION_CONTINUE) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Offload not supported when conform action is not continue");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
err = mlx5e_policer_validate(flow_action, act, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
|
@ -994,7 +994,7 @@ static int lan966x_probe(struct platform_device *pdev)
|
|||
struct fwnode_handle *ports, *portnp;
|
||||
struct lan966x *lan966x;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
int err, i;
|
||||
int err;
|
||||
|
||||
lan966x = devm_kzalloc(&pdev->dev, sizeof(*lan966x), GFP_KERNEL);
|
||||
if (!lan966x)
|
||||
|
@ -1025,11 +1025,7 @@ static int lan966x_probe(struct platform_device *pdev)
|
|||
if (err)
|
||||
return dev_err_probe(&pdev->dev, err, "Reset failed");
|
||||
|
||||
i = 0;
|
||||
fwnode_for_each_available_child_node(ports, portnp)
|
||||
++i;
|
||||
|
||||
lan966x->num_phys_ports = i;
|
||||
lan966x->num_phys_ports = NUM_PHYS_PORTS;
|
||||
lan966x->ports = devm_kcalloc(&pdev->dev, lan966x->num_phys_ports,
|
||||
sizeof(struct lan966x_port *),
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
/* Reserved amount for (SRC, PRIO) at index 8*SRC + PRIO */
|
||||
#define QSYS_Q_RSRV 95
|
||||
|
||||
#define NUM_PHYS_PORTS 8
|
||||
#define CPU_PORT 8
|
||||
|
||||
/* Reserved PGIDs */
|
||||
|
|
|
@ -4190,7 +4190,6 @@ static void rtl8169_tso_csum_v1(struct sk_buff *skb, u32 *opts)
|
|||
static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
||||
struct sk_buff *skb, u32 *opts)
|
||||
{
|
||||
u32 transport_offset = (u32)skb_transport_offset(skb);
|
||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||
u32 mss = shinfo->gso_size;
|
||||
|
||||
|
@ -4207,7 +4206,7 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
|||
WARN_ON_ONCE(1);
|
||||
}
|
||||
|
||||
opts[0] |= transport_offset << GTTCPHO_SHIFT;
|
||||
opts[0] |= skb_transport_offset(skb) << GTTCPHO_SHIFT;
|
||||
opts[1] |= mss << TD1_MSS_SHIFT;
|
||||
} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
u8 ip_protocol;
|
||||
|
@ -4235,7 +4234,7 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
|||
else
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
opts[1] |= transport_offset << TCPHO_SHIFT;
|
||||
opts[1] |= skb_transport_offset(skb) << TCPHO_SHIFT;
|
||||
} else {
|
||||
unsigned int padto = rtl_quirk_packet_padto(tp, skb);
|
||||
|
||||
|
@ -4402,14 +4401,13 @@ static netdev_features_t rtl8169_features_check(struct sk_buff *skb,
|
|||
struct net_device *dev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
int transport_offset = skb_transport_offset(skb);
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
|
||||
if (skb_is_gso(skb)) {
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_34)
|
||||
features = rtl8168evl_fix_tso(skb, features);
|
||||
|
||||
if (transport_offset > GTTCPHO_MAX &&
|
||||
if (skb_transport_offset(skb) > GTTCPHO_MAX &&
|
||||
rtl_chip_supports_csum_v2(tp))
|
||||
features &= ~NETIF_F_ALL_TSO;
|
||||
} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
|
@ -4420,7 +4418,7 @@ static netdev_features_t rtl8169_features_check(struct sk_buff *skb,
|
|||
if (rtl_quirk_packet_padto(tp, skb))
|
||||
features &= ~NETIF_F_CSUM_MASK;
|
||||
|
||||
if (transport_offset > TCPHO_MAX &&
|
||||
if (skb_transport_offset(skb) > TCPHO_MAX &&
|
||||
rtl_chip_supports_csum_v2(tp))
|
||||
features &= ~NETIF_F_CSUM_MASK;
|
||||
}
|
||||
|
|
|
@ -781,7 +781,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|||
intf->altsetting->desc.bInterfaceNumber, 1)) {
|
||||
dev_err(dev, "Can't set altsetting 1.\n");
|
||||
ret = -EIO;
|
||||
goto fail_mem;;
|
||||
goto fail_mem;
|
||||
}
|
||||
|
||||
netdev = alloc_etherdev(sizeof(struct catc));
|
||||
|
|
|
@ -2137,7 +2137,7 @@ static void usbnet_async_cmd_cb(struct urb *urb)
|
|||
int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
||||
u16 value, u16 index, const void *data, u16 size)
|
||||
{
|
||||
struct usb_ctrlrequest *req = NULL;
|
||||
struct usb_ctrlrequest *req;
|
||||
struct urb *urb;
|
||||
int err = -ENOMEM;
|
||||
void *buf = NULL;
|
||||
|
@ -2155,7 +2155,7 @@ int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|||
if (!buf) {
|
||||
netdev_err(dev->net, "Error allocating buffer"
|
||||
" in %s!\n", __func__);
|
||||
goto fail_free;
|
||||
goto fail_free_urb;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2179,14 +2179,21 @@ int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|||
if (err < 0) {
|
||||
netdev_err(dev->net, "Error submitting the control"
|
||||
" message: status=%d\n", err);
|
||||
goto fail_free;
|
||||
goto fail_free_all;
|
||||
}
|
||||
return 0;
|
||||
|
||||
fail_free_all:
|
||||
kfree(req);
|
||||
fail_free_buf:
|
||||
kfree(buf);
|
||||
fail_free:
|
||||
kfree(req);
|
||||
/*
|
||||
* avoid a double free
|
||||
* needed because the flag can be set only
|
||||
* after filling the URB
|
||||
*/
|
||||
urb->transfer_flags = 0;
|
||||
fail_free_urb:
|
||||
usb_free_urb(urb);
|
||||
fail:
|
||||
return err;
|
||||
|
|
|
@ -152,6 +152,7 @@ enum flow_action_id {
|
|||
FLOW_ACTION_PIPE,
|
||||
FLOW_ACTION_VLAN_PUSH_ETH,
|
||||
FLOW_ACTION_VLAN_POP_ETH,
|
||||
FLOW_ACTION_CONTINUE,
|
||||
NUM_FLOW_ACTIONS,
|
||||
};
|
||||
|
||||
|
|
|
@ -1562,6 +1562,21 @@ static void __reg_bound_offset(struct bpf_reg_state *reg)
|
|||
reg->var_off = tnum_or(tnum_clear_subreg(var64_off), var32_off);
|
||||
}
|
||||
|
||||
static void reg_bounds_sync(struct bpf_reg_state *reg)
|
||||
{
|
||||
/* We might have learned new bounds from the var_off. */
|
||||
__update_reg_bounds(reg);
|
||||
/* We might have learned something about the sign bit. */
|
||||
__reg_deduce_bounds(reg);
|
||||
/* We might have learned some bits from the bounds. */
|
||||
__reg_bound_offset(reg);
|
||||
/* Intersecting with the old var_off might have improved our bounds
|
||||
* slightly, e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc),
|
||||
* then new var_off is (0; 0x7f...fc) which improves our umax.
|
||||
*/
|
||||
__update_reg_bounds(reg);
|
||||
}
|
||||
|
||||
static bool __reg32_bound_s64(s32 a)
|
||||
{
|
||||
return a >= 0 && a <= S32_MAX;
|
||||
|
@ -1603,16 +1618,8 @@ static void __reg_combine_32_into_64(struct bpf_reg_state *reg)
|
|||
* so they do not impact tnum bounds calculation.
|
||||
*/
|
||||
__mark_reg64_unbounded(reg);
|
||||
__update_reg_bounds(reg);
|
||||
}
|
||||
|
||||
/* Intersecting with the old var_off might have improved our bounds
|
||||
* slightly. e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc),
|
||||
* then new var_off is (0; 0x7f...fc) which improves our umax.
|
||||
*/
|
||||
__reg_deduce_bounds(reg);
|
||||
__reg_bound_offset(reg);
|
||||
__update_reg_bounds(reg);
|
||||
reg_bounds_sync(reg);
|
||||
}
|
||||
|
||||
static bool __reg64_bound_s32(s64 a)
|
||||
|
@ -1628,7 +1635,6 @@ static bool __reg64_bound_u32(u64 a)
|
|||
static void __reg_combine_64_into_32(struct bpf_reg_state *reg)
|
||||
{
|
||||
__mark_reg32_unbounded(reg);
|
||||
|
||||
if (__reg64_bound_s32(reg->smin_value) && __reg64_bound_s32(reg->smax_value)) {
|
||||
reg->s32_min_value = (s32)reg->smin_value;
|
||||
reg->s32_max_value = (s32)reg->smax_value;
|
||||
|
@ -1637,14 +1643,7 @@ static void __reg_combine_64_into_32(struct bpf_reg_state *reg)
|
|||
reg->u32_min_value = (u32)reg->umin_value;
|
||||
reg->u32_max_value = (u32)reg->umax_value;
|
||||
}
|
||||
|
||||
/* Intersecting with the old var_off might have improved our bounds
|
||||
* slightly. e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc),
|
||||
* then new var_off is (0; 0x7f...fc) which improves our umax.
|
||||
*/
|
||||
__reg_deduce_bounds(reg);
|
||||
__reg_bound_offset(reg);
|
||||
__update_reg_bounds(reg);
|
||||
reg_bounds_sync(reg);
|
||||
}
|
||||
|
||||
/* Mark a register as having a completely unknown (scalar) value. */
|
||||
|
@ -6943,9 +6942,7 @@ static void do_refine_retval_range(struct bpf_reg_state *regs, int ret_type,
|
|||
ret_reg->s32_max_value = meta->msize_max_value;
|
||||
ret_reg->smin_value = -MAX_ERRNO;
|
||||
ret_reg->s32_min_value = -MAX_ERRNO;
|
||||
__reg_deduce_bounds(ret_reg);
|
||||
__reg_bound_offset(ret_reg);
|
||||
__update_reg_bounds(ret_reg);
|
||||
reg_bounds_sync(ret_reg);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -8202,11 +8199,7 @@ static int adjust_ptr_min_max_vals(struct bpf_verifier_env *env,
|
|||
|
||||
if (!check_reg_sane_offset(env, dst_reg, ptr_reg->type))
|
||||
return -EINVAL;
|
||||
|
||||
__update_reg_bounds(dst_reg);
|
||||
__reg_deduce_bounds(dst_reg);
|
||||
__reg_bound_offset(dst_reg);
|
||||
|
||||
reg_bounds_sync(dst_reg);
|
||||
if (sanitize_check_bounds(env, insn, dst_reg) < 0)
|
||||
return -EACCES;
|
||||
if (sanitize_needed(opcode)) {
|
||||
|
@ -8944,10 +8937,7 @@ static int adjust_scalar_min_max_vals(struct bpf_verifier_env *env,
|
|||
/* ALU32 ops are zero extended into 64bit register */
|
||||
if (alu32)
|
||||
zext_32_to_64(dst_reg);
|
||||
|
||||
__update_reg_bounds(dst_reg);
|
||||
__reg_deduce_bounds(dst_reg);
|
||||
__reg_bound_offset(dst_reg);
|
||||
reg_bounds_sync(dst_reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -9136,10 +9126,7 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
|
|||
insn->dst_reg);
|
||||
}
|
||||
zext_32_to_64(dst_reg);
|
||||
|
||||
__update_reg_bounds(dst_reg);
|
||||
__reg_deduce_bounds(dst_reg);
|
||||
__reg_bound_offset(dst_reg);
|
||||
reg_bounds_sync(dst_reg);
|
||||
}
|
||||
} else {
|
||||
/* case: R = imm
|
||||
|
@ -9577,26 +9564,33 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
|
|||
return;
|
||||
|
||||
switch (opcode) {
|
||||
/* JEQ/JNE comparison doesn't change the register equivalence.
|
||||
*
|
||||
* r1 = r2;
|
||||
* if (r1 == 42) goto label;
|
||||
* ...
|
||||
* label: // here both r1 and r2 are known to be 42.
|
||||
*
|
||||
* Hence when marking register as known preserve it's ID.
|
||||
*/
|
||||
case BPF_JEQ:
|
||||
case BPF_JNE:
|
||||
{
|
||||
struct bpf_reg_state *reg =
|
||||
opcode == BPF_JEQ ? true_reg : false_reg;
|
||||
|
||||
/* JEQ/JNE comparison doesn't change the register equivalence.
|
||||
* r1 = r2;
|
||||
* if (r1 == 42) goto label;
|
||||
* ...
|
||||
* label: // here both r1 and r2 are known to be 42.
|
||||
*
|
||||
* Hence when marking register as known preserve it's ID.
|
||||
*/
|
||||
if (is_jmp32)
|
||||
__mark_reg32_known(reg, val32);
|
||||
else
|
||||
___mark_reg_known(reg, val);
|
||||
if (is_jmp32) {
|
||||
__mark_reg32_known(true_reg, val32);
|
||||
true_32off = tnum_subreg(true_reg->var_off);
|
||||
} else {
|
||||
___mark_reg_known(true_reg, val);
|
||||
true_64off = true_reg->var_off;
|
||||
}
|
||||
break;
|
||||
case BPF_JNE:
|
||||
if (is_jmp32) {
|
||||
__mark_reg32_known(false_reg, val32);
|
||||
false_32off = tnum_subreg(false_reg->var_off);
|
||||
} else {
|
||||
___mark_reg_known(false_reg, val);
|
||||
false_64off = false_reg->var_off;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BPF_JSET:
|
||||
if (is_jmp32) {
|
||||
false_32off = tnum_and(false_32off, tnum_const(~val32));
|
||||
|
@ -9735,21 +9729,8 @@ static void __reg_combine_min_max(struct bpf_reg_state *src_reg,
|
|||
dst_reg->smax_value);
|
||||
src_reg->var_off = dst_reg->var_off = tnum_intersect(src_reg->var_off,
|
||||
dst_reg->var_off);
|
||||
/* We might have learned new bounds from the var_off. */
|
||||
__update_reg_bounds(src_reg);
|
||||
__update_reg_bounds(dst_reg);
|
||||
/* We might have learned something about the sign bit. */
|
||||
__reg_deduce_bounds(src_reg);
|
||||
__reg_deduce_bounds(dst_reg);
|
||||
/* We might have learned some bits from the bounds. */
|
||||
__reg_bound_offset(src_reg);
|
||||
__reg_bound_offset(dst_reg);
|
||||
/* Intersecting with the old var_off might have improved our bounds
|
||||
* slightly. e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc),
|
||||
* then new var_off is (0; 0x7f...fc) which improves our umax.
|
||||
*/
|
||||
__update_reg_bounds(src_reg);
|
||||
__update_reg_bounds(dst_reg);
|
||||
reg_bounds_sync(src_reg);
|
||||
reg_bounds_sync(dst_reg);
|
||||
}
|
||||
|
||||
static void reg_combine_min_max(struct bpf_reg_state *true_src,
|
||||
|
|
|
@ -571,6 +571,7 @@ int hci_dev_close(__u16 dev)
|
|||
goto done;
|
||||
}
|
||||
|
||||
cancel_work_sync(&hdev->power_on);
|
||||
if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF))
|
||||
cancel_delayed_work(&hdev->power_off);
|
||||
|
||||
|
@ -2675,6 +2676,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
|||
list_del(&hdev->list);
|
||||
write_unlock(&hci_dev_list_lock);
|
||||
|
||||
cancel_work_sync(&hdev->power_on);
|
||||
|
||||
hci_cmd_sync_clear(hdev);
|
||||
|
||||
if (!test_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks))
|
||||
|
|
|
@ -4088,7 +4088,6 @@ int hci_dev_close_sync(struct hci_dev *hdev)
|
|||
|
||||
bt_dev_dbg(hdev, "");
|
||||
|
||||
cancel_work_sync(&hdev->power_on);
|
||||
cancel_delayed_work(&hdev->power_off);
|
||||
cancel_delayed_work(&hdev->ncmd_timer);
|
||||
|
||||
|
|
|
@ -100,6 +100,7 @@ static inline u64 get_u64(const struct canfd_frame *cp, int offset)
|
|||
|
||||
struct bcm_op {
|
||||
struct list_head list;
|
||||
struct rcu_head rcu;
|
||||
int ifindex;
|
||||
canid_t can_id;
|
||||
u32 flags;
|
||||
|
@ -718,10 +719,9 @@ static struct bcm_op *bcm_find_op(struct list_head *ops,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void bcm_remove_op(struct bcm_op *op)
|
||||
static void bcm_free_op_rcu(struct rcu_head *rcu_head)
|
||||
{
|
||||
hrtimer_cancel(&op->timer);
|
||||
hrtimer_cancel(&op->thrtimer);
|
||||
struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);
|
||||
|
||||
if ((op->frames) && (op->frames != &op->sframe))
|
||||
kfree(op->frames);
|
||||
|
@ -732,6 +732,14 @@ static void bcm_remove_op(struct bcm_op *op)
|
|||
kfree(op);
|
||||
}
|
||||
|
||||
static void bcm_remove_op(struct bcm_op *op)
|
||||
{
|
||||
hrtimer_cancel(&op->timer);
|
||||
hrtimer_cancel(&op->thrtimer);
|
||||
|
||||
call_rcu(&op->rcu, bcm_free_op_rcu);
|
||||
}
|
||||
|
||||
static void bcm_rx_unreg(struct net_device *dev, struct bcm_op *op)
|
||||
{
|
||||
if (op->rx_reg_dev == dev) {
|
||||
|
@ -757,6 +765,9 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
|
|||
if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) &&
|
||||
(op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) {
|
||||
|
||||
/* disable automatic timer on frame reception */
|
||||
op->flags |= RX_NO_AUTOTIMER;
|
||||
|
||||
/*
|
||||
* Don't care if we're bound or not (due to netdev
|
||||
* problems) can_rx_unregister() is always a save
|
||||
|
@ -785,7 +796,6 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
|
|||
bcm_rx_handler, op);
|
||||
|
||||
list_del(&op->list);
|
||||
synchronize_rcu();
|
||||
bcm_remove_op(op);
|
||||
return 1; /* done */
|
||||
}
|
||||
|
|
|
@ -1584,6 +1584,9 @@ mp_rst:
|
|||
*ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
|
||||
TCPOLEN_MPTCP_PRIO,
|
||||
opts->backup, TCPOPT_NOP);
|
||||
|
||||
MPTCP_INC_STATS(sock_net((const struct sock *)tp),
|
||||
MPTCP_MIB_MPPRIOTX);
|
||||
}
|
||||
|
||||
mp_capable_done:
|
||||
|
|
|
@ -717,9 +717,10 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
|
|||
}
|
||||
}
|
||||
|
||||
static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr,
|
||||
u8 bkup)
|
||||
int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr,
|
||||
struct mptcp_addr_info *rem,
|
||||
u8 bkup)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow;
|
||||
|
||||
|
@ -727,24 +728,29 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
|||
|
||||
mptcp_for_each_subflow(msk, subflow) {
|
||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||
struct sock *sk = (struct sock *)msk;
|
||||
struct mptcp_addr_info local;
|
||||
struct mptcp_addr_info local, remote;
|
||||
bool slow;
|
||||
|
||||
local_address((struct sock_common *)ssk, &local);
|
||||
if (!mptcp_addresses_equal(&local, addr, addr->port))
|
||||
continue;
|
||||
|
||||
if (rem && rem->family != AF_UNSPEC) {
|
||||
remote_address((struct sock_common *)ssk, &remote);
|
||||
if (!mptcp_addresses_equal(&remote, rem, rem->port))
|
||||
continue;
|
||||
}
|
||||
|
||||
slow = lock_sock_fast(ssk);
|
||||
if (subflow->backup != bkup)
|
||||
msk->last_snd = NULL;
|
||||
subflow->backup = bkup;
|
||||
subflow->send_mp_prio = 1;
|
||||
subflow->request_bkup = bkup;
|
||||
__MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIOTX);
|
||||
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
pr_debug("send ack for mp_prio");
|
||||
mptcp_subflow_send_ack(ssk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
__mptcp_subflow_send_ack(ssk);
|
||||
unlock_sock_fast(ssk, slow);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -801,7 +807,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
|
|||
removed = true;
|
||||
__MPTCP_INC_STATS(sock_net(sk), rm_type);
|
||||
}
|
||||
__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
|
||||
if (rm_type == MPTCP_MIB_RMSUBFLOW)
|
||||
__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
|
||||
if (!removed)
|
||||
continue;
|
||||
|
||||
|
@ -1816,8 +1823,10 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
|
|||
|
||||
list.ids[list.nr++] = addr->id;
|
||||
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
mptcp_pm_nl_rm_subflow_received(msk, &list);
|
||||
mptcp_pm_create_subflow_or_signal_addr(msk);
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
}
|
||||
|
||||
static int mptcp_nl_set_flags(struct net *net,
|
||||
|
@ -1835,12 +1844,10 @@ static int mptcp_nl_set_flags(struct net *net,
|
|||
goto next;
|
||||
|
||||
lock_sock(sk);
|
||||
spin_lock_bh(&msk->pm.lock);
|
||||
if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
|
||||
ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
|
||||
ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
|
||||
if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
|
||||
mptcp_pm_nl_fullmesh(msk, addr);
|
||||
spin_unlock_bh(&msk->pm.lock);
|
||||
release_sock(sk);
|
||||
|
||||
next:
|
||||
|
@ -1854,6 +1861,9 @@ next:
|
|||
static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct mptcp_pm_addr_entry addr = { .addr = { .family = AF_UNSPEC }, }, *entry;
|
||||
struct mptcp_pm_addr_entry remote = { .addr = { .family = AF_UNSPEC }, };
|
||||
struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
|
||||
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
|
||||
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
|
||||
struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
|
||||
u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
|
||||
|
@ -1866,6 +1876,12 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (attr_rem) {
|
||||
ret = mptcp_pm_parse_entry(attr_rem, info, false, &remote);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
|
||||
bkup = 1;
|
||||
if (addr.addr.family == AF_UNSPEC) {
|
||||
|
@ -1874,6 +1890,10 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (token)
|
||||
return mptcp_userspace_pm_set_flags(sock_net(skb->sk),
|
||||
token, &addr, &remote, bkup);
|
||||
|
||||
spin_lock_bh(&pernet->lock);
|
||||
entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);
|
||||
if (!entry) {
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "protocol.h"
|
||||
#include "mib.h"
|
||||
|
||||
void mptcp_free_local_addr_list(struct mptcp_sock *msk)
|
||||
{
|
||||
|
@ -306,15 +307,11 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
|
|||
const struct mptcp_addr_info *local,
|
||||
const struct mptcp_addr_info *remote)
|
||||
{
|
||||
struct sock *sk = &msk->sk.icsk_inet.sk;
|
||||
struct mptcp_subflow_context *subflow;
|
||||
struct sock *found = NULL;
|
||||
|
||||
if (local->family != remote->family)
|
||||
return NULL;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
mptcp_for_each_subflow(msk, subflow) {
|
||||
const struct inet_sock *issk;
|
||||
struct sock *ssk;
|
||||
|
@ -347,16 +344,11 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
|
|||
}
|
||||
|
||||
if (issk->inet_sport == local->port &&
|
||||
issk->inet_dport == remote->port) {
|
||||
found = ssk;
|
||||
goto found;
|
||||
}
|
||||
issk->inet_dport == remote->port)
|
||||
return ssk;
|
||||
}
|
||||
|
||||
found:
|
||||
release_sock(sk);
|
||||
|
||||
return found;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
|
||||
|
@ -412,18 +404,51 @@ int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
|
|||
}
|
||||
|
||||
sk = &msk->sk.icsk_inet.sk;
|
||||
lock_sock(sk);
|
||||
ssk = mptcp_nl_find_ssk(msk, &addr_l, &addr_r);
|
||||
if (ssk) {
|
||||
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
||||
|
||||
mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
|
||||
mptcp_close_ssk(sk, ssk, subflow);
|
||||
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
|
||||
err = 0;
|
||||
} else {
|
||||
err = -ESRCH;
|
||||
}
|
||||
release_sock(sk);
|
||||
|
||||
destroy_err:
|
||||
destroy_err:
|
||||
sock_put((struct sock *)msk);
|
||||
return err;
|
||||
}
|
||||
|
||||
int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
|
||||
struct mptcp_pm_addr_entry *loc,
|
||||
struct mptcp_pm_addr_entry *rem, u8 bkup)
|
||||
{
|
||||
struct mptcp_sock *msk;
|
||||
int ret = -EINVAL;
|
||||
u32 token_val;
|
||||
|
||||
token_val = nla_get_u32(token);
|
||||
|
||||
msk = mptcp_token_get_sock(net, token_val);
|
||||
if (!msk)
|
||||
return ret;
|
||||
|
||||
if (!mptcp_pm_is_userspace(msk))
|
||||
goto set_flags_err;
|
||||
|
||||
if (loc->addr.family == AF_UNSPEC ||
|
||||
rem->addr.family == AF_UNSPEC)
|
||||
goto set_flags_err;
|
||||
|
||||
lock_sock((struct sock *)msk);
|
||||
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc->addr, &rem->addr, bkup);
|
||||
release_sock((struct sock *)msk);
|
||||
|
||||
set_flags_err:
|
||||
sock_put((struct sock *)msk);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -506,13 +506,18 @@ static inline bool tcp_can_send_ack(const struct sock *ssk)
|
|||
(TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_TIME_WAIT | TCPF_CLOSE | TCPF_LISTEN));
|
||||
}
|
||||
|
||||
void __mptcp_subflow_send_ack(struct sock *ssk)
|
||||
{
|
||||
if (tcp_can_send_ack(ssk))
|
||||
tcp_send_ack(ssk);
|
||||
}
|
||||
|
||||
void mptcp_subflow_send_ack(struct sock *ssk)
|
||||
{
|
||||
bool slow;
|
||||
|
||||
slow = lock_sock_fast(ssk);
|
||||
if (tcp_can_send_ack(ssk))
|
||||
tcp_send_ack(ssk);
|
||||
__mptcp_subflow_send_ack(ssk);
|
||||
unlock_sock_fast(ssk, slow);
|
||||
}
|
||||
|
||||
|
|
|
@ -607,6 +607,7 @@ void __init mptcp_subflow_init(void);
|
|||
void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
|
||||
void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
||||
struct mptcp_subflow_context *subflow);
|
||||
void __mptcp_subflow_send_ack(struct sock *ssk);
|
||||
void mptcp_subflow_send_ack(struct sock *ssk);
|
||||
void mptcp_subflow_reset(struct sock *ssk);
|
||||
void mptcp_subflow_queue_clean(struct sock *ssk);
|
||||
|
@ -771,6 +772,10 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
|
|||
const struct mptcp_rm_list *rm_list);
|
||||
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
|
||||
void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
|
||||
int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
||||
struct mptcp_addr_info *addr,
|
||||
struct mptcp_addr_info *rem,
|
||||
u8 bkup);
|
||||
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||
const struct mptcp_pm_addr_entry *entry);
|
||||
void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
|
||||
|
@ -787,7 +792,9 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
|
|||
int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
|
||||
unsigned int id,
|
||||
u8 *flags, int *ifindex);
|
||||
|
||||
int mptcp_userspace_pm_set_flags(struct net *net, struct nlattr *token,
|
||||
struct mptcp_pm_addr_entry *loc,
|
||||
struct mptcp_pm_addr_entry *rem, u8 bkup);
|
||||
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
||||
const struct mptcp_addr_info *addr,
|
||||
bool echo);
|
||||
|
|
|
@ -5213,13 +5213,20 @@ static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set,
|
|||
struct nft_data *data,
|
||||
struct nlattr *attr)
|
||||
{
|
||||
u32 dtype;
|
||||
int err;
|
||||
|
||||
err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (desc->type != NFT_DATA_VERDICT && desc->len != set->dlen) {
|
||||
if (set->dtype == NFT_DATA_VERDICT)
|
||||
dtype = NFT_DATA_VERDICT;
|
||||
else
|
||||
dtype = NFT_DATA_VALUE;
|
||||
|
||||
if (dtype != desc->type ||
|
||||
set->dlen != desc->len) {
|
||||
nft_data_release(data, desc->type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -2124,6 +2124,32 @@ out_scratch:
|
|||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* nft_set_pipapo_match_destroy() - Destroy elements from key mapping array
|
||||
* @set: nftables API set representation
|
||||
* @m: matching data pointing to key mapping array
|
||||
*/
|
||||
static void nft_set_pipapo_match_destroy(const struct nft_set *set,
|
||||
struct nft_pipapo_match *m)
|
||||
{
|
||||
struct nft_pipapo_field *f;
|
||||
int i, r;
|
||||
|
||||
for (i = 0, f = m->f; i < m->field_count - 1; i++, f++)
|
||||
;
|
||||
|
||||
for (r = 0; r < f->rules; r++) {
|
||||
struct nft_pipapo_elem *e;
|
||||
|
||||
if (r < f->rules - 1 && f->mt[r + 1].e == f->mt[r].e)
|
||||
continue;
|
||||
|
||||
e = f->mt[r].e;
|
||||
|
||||
nft_set_elem_destroy(set, e, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* nft_pipapo_destroy() - Free private data for set and all committed elements
|
||||
* @set: nftables API set representation
|
||||
|
@ -2132,26 +2158,13 @@ static void nft_pipapo_destroy(const struct nft_set *set)
|
|||
{
|
||||
struct nft_pipapo *priv = nft_set_priv(set);
|
||||
struct nft_pipapo_match *m;
|
||||
struct nft_pipapo_field *f;
|
||||
int i, r, cpu;
|
||||
int cpu;
|
||||
|
||||
m = rcu_dereference_protected(priv->match, true);
|
||||
if (m) {
|
||||
rcu_barrier();
|
||||
|
||||
for (i = 0, f = m->f; i < m->field_count - 1; i++, f++)
|
||||
;
|
||||
|
||||
for (r = 0; r < f->rules; r++) {
|
||||
struct nft_pipapo_elem *e;
|
||||
|
||||
if (r < f->rules - 1 && f->mt[r + 1].e == f->mt[r].e)
|
||||
continue;
|
||||
|
||||
e = f->mt[r].e;
|
||||
|
||||
nft_set_elem_destroy(set, e, true);
|
||||
}
|
||||
nft_set_pipapo_match_destroy(set, m);
|
||||
|
||||
#ifdef NFT_PIPAPO_ALIGN
|
||||
free_percpu(m->scratch_aligned);
|
||||
|
@ -2165,6 +2178,11 @@ static void nft_pipapo_destroy(const struct nft_set *set)
|
|||
}
|
||||
|
||||
if (priv->clone) {
|
||||
m = priv->clone;
|
||||
|
||||
if (priv->dirty)
|
||||
nft_set_pipapo_match_destroy(set, m);
|
||||
|
||||
#ifdef NFT_PIPAPO_ALIGN
|
||||
free_percpu(priv->clone->scratch_aligned);
|
||||
#endif
|
||||
|
|
|
@ -227,8 +227,8 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh)
|
|||
{
|
||||
struct rose_neigh *s;
|
||||
|
||||
rose_stop_ftimer(rose_neigh);
|
||||
rose_stop_t0timer(rose_neigh);
|
||||
del_timer_sync(&rose_neigh->ftimer);
|
||||
del_timer_sync(&rose_neigh->t0timer);
|
||||
|
||||
skb_queue_purge(&rose_neigh->queue);
|
||||
|
||||
|
|
|
@ -442,7 +442,7 @@ static int tcf_police_act_to_flow_act(int tc_act, u32 *extval,
|
|||
act_id = FLOW_ACTION_JUMP;
|
||||
*extval = tc_act & TC_ACT_EXT_VAL_MASK;
|
||||
} else if (tc_act == TC_ACT_UNSPEC) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Offload not supported when conform/exceed action is \"continue\"");
|
||||
act_id = FLOW_ACTION_CONTINUE;
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported conform/exceed action offload");
|
||||
}
|
||||
|
|
|
@ -267,9 +267,6 @@ static int tls_do_decryption(struct sock *sk,
|
|||
}
|
||||
darg->async = false;
|
||||
|
||||
if (ret == -EBADMSG)
|
||||
TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSDECRYPTERROR);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1579,8 +1576,11 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
err = decrypt_internal(sk, skb, dest, NULL, darg);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
if (err == -EBADMSG)
|
||||
TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSDECRYPTERROR);
|
||||
return err;
|
||||
}
|
||||
if (darg->async)
|
||||
goto decrypt_next;
|
||||
|
||||
|
|
|
@ -332,6 +332,7 @@ static void __xp_dma_unmap(struct xsk_dma_map *dma_map, unsigned long attrs)
|
|||
for (i = 0; i < dma_map->dma_pages_cnt; i++) {
|
||||
dma = &dma_map->dma_pages[i];
|
||||
if (*dma) {
|
||||
*dma &= ~XSK_NEXT_PG_CONTIG_MASK;
|
||||
dma_unmap_page_attrs(dma_map->dev, *dma, PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, attrs);
|
||||
*dma = 0;
|
||||
|
|
|
@ -25,12 +25,19 @@ static unsigned long nhit;
|
|||
|
||||
static char symbol[MAX_SYMBOL_LEN] = "kernel_clone";
|
||||
module_param_string(symbol, symbol, sizeof(symbol), 0644);
|
||||
MODULE_PARM_DESC(symbol, "Probed symbol(s), given by comma separated symbols or a wildcard pattern.");
|
||||
|
||||
static char nosymbol[MAX_SYMBOL_LEN] = "";
|
||||
module_param_string(nosymbol, nosymbol, sizeof(nosymbol), 0644);
|
||||
MODULE_PARM_DESC(nosymbol, "Not-probed symbols, given by a wildcard pattern.");
|
||||
|
||||
static bool stackdump = true;
|
||||
module_param(stackdump, bool, 0644);
|
||||
MODULE_PARM_DESC(stackdump, "Enable stackdump.");
|
||||
|
||||
static bool use_trace = false;
|
||||
module_param(use_trace, bool, 0644);
|
||||
MODULE_PARM_DESC(use_trace, "Use trace_printk instead of printk. This is only for debugging.");
|
||||
|
||||
static void show_backtrace(void)
|
||||
{
|
||||
|
|
|
@ -864,3 +864,24 @@
|
|||
.result = ACCEPT,
|
||||
.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
|
||||
},
|
||||
{
|
||||
"jeq32/jne32: bounds checking",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_6, 563),
|
||||
BPF_MOV64_IMM(BPF_REG_2, 0),
|
||||
BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
|
||||
BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
|
||||
BPF_ALU32_REG(BPF_OR, BPF_REG_2, BPF_REG_6),
|
||||
BPF_JMP32_IMM(BPF_JNE, BPF_REG_2, 8, 5),
|
||||
BPF_JMP_IMM(BPF_JSGE, BPF_REG_2, 500, 2),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 2),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
|
||||
.result = ACCEPT,
|
||||
.retval = 1,
|
||||
},
|
||||
|
|
|
@ -373,3 +373,25 @@
|
|||
.result = ACCEPT,
|
||||
.retval = 3,
|
||||
},
|
||||
{
|
||||
"jump & dead code elimination",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 1),
|
||||
BPF_MOV64_IMM(BPF_REG_3, 0),
|
||||
BPF_ALU64_IMM(BPF_NEG, BPF_REG_3, 0),
|
||||
BPF_ALU64_IMM(BPF_NEG, BPF_REG_3, 0),
|
||||
BPF_ALU64_IMM(BPF_OR, BPF_REG_3, 32767),
|
||||
BPF_JMP_IMM(BPF_JSGE, BPF_REG_3, 0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0x8000, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -32767),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 2),
|
||||
BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 0, 1),
|
||||
BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.prog_type = BPF_PROG_TYPE_SCHED_CLS,
|
||||
.result = ACCEPT,
|
||||
.retval = 2,
|
||||
},
|
||||
|
|
|
@ -1240,6 +1240,7 @@ learning_test()
|
|||
# FDB entry was installed.
|
||||
bridge link set dev $br_port1 flood off
|
||||
|
||||
ip link set $host1_if promisc on
|
||||
tc qdisc add dev $host1_if ingress
|
||||
tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \
|
||||
flower dst_mac $mac action drop
|
||||
|
@ -1250,7 +1251,7 @@ learning_test()
|
|||
tc -j -s filter show dev $host1_if ingress \
|
||||
| jq -e ".[] | select(.options.handle == 101) \
|
||||
| select(.options.actions[0].stats.packets == 1)" &> /dev/null
|
||||
check_fail $? "Packet reached second host when should not"
|
||||
check_fail $? "Packet reached first host when should not"
|
||||
|
||||
$MZ $host1_if -c 1 -p 64 -a $mac -t ip -q
|
||||
sleep 1
|
||||
|
@ -1289,6 +1290,7 @@ learning_test()
|
|||
|
||||
tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower
|
||||
tc qdisc del dev $host1_if ingress
|
||||
ip link set $host1_if promisc off
|
||||
|
||||
bridge link set dev $br_port1 flood on
|
||||
|
||||
|
@ -1306,6 +1308,7 @@ flood_test_do()
|
|||
|
||||
# Add an ACL on `host2_if` which will tell us whether the packet
|
||||
# was flooded to it or not.
|
||||
ip link set $host2_if promisc on
|
||||
tc qdisc add dev $host2_if ingress
|
||||
tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \
|
||||
flower dst_mac $mac action drop
|
||||
|
@ -1323,6 +1326,7 @@ flood_test_do()
|
|||
|
||||
tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower
|
||||
tc qdisc del dev $host2_if ingress
|
||||
ip link set $host2_if promisc off
|
||||
|
||||
return $err
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ static void syntax(char *argv[])
|
|||
fprintf(stderr, "\tdsf lip <local-ip> lport <local-port> rip <remote-ip> rport <remote-port> token <token>\n");
|
||||
fprintf(stderr, "\tdel <id> [<ip>]\n");
|
||||
fprintf(stderr, "\tget <id>\n");
|
||||
fprintf(stderr, "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>]\n");
|
||||
fprintf(stderr, "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>] [token <token>] [rip <ip>] [rport <port>]\n");
|
||||
fprintf(stderr, "\tflush\n");
|
||||
fprintf(stderr, "\tdump\n");
|
||||
fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\n");
|
||||
|
@ -1279,7 +1279,10 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
|
|||
struct rtattr *rta, *nest;
|
||||
struct nlmsghdr *nh;
|
||||
u_int32_t flags = 0;
|
||||
u_int32_t token = 0;
|
||||
u_int16_t rport = 0;
|
||||
u_int16_t family;
|
||||
void *rip = NULL;
|
||||
int nest_start;
|
||||
int use_id = 0;
|
||||
u_int8_t id;
|
||||
|
@ -1339,7 +1342,13 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
|
|||
error(1, 0, " missing flags keyword");
|
||||
|
||||
for (; arg < argc; arg++) {
|
||||
if (!strcmp(argv[arg], "flags")) {
|
||||
if (!strcmp(argv[arg], "token")) {
|
||||
if (++arg >= argc)
|
||||
error(1, 0, " missing token value");
|
||||
|
||||
/* token */
|
||||
token = atoi(argv[arg]);
|
||||
} else if (!strcmp(argv[arg], "flags")) {
|
||||
char *tok, *str;
|
||||
|
||||
/* flags */
|
||||
|
@ -1378,12 +1387,72 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
|
|||
rta->rta_len = RTA_LENGTH(2);
|
||||
memcpy(RTA_DATA(rta), &port, 2);
|
||||
off += NLMSG_ALIGN(rta->rta_len);
|
||||
} else if (!strcmp(argv[arg], "rport")) {
|
||||
if (++arg >= argc)
|
||||
error(1, 0, " missing remote port");
|
||||
|
||||
rport = atoi(argv[arg]);
|
||||
} else if (!strcmp(argv[arg], "rip")) {
|
||||
if (++arg >= argc)
|
||||
error(1, 0, " missing remote ip");
|
||||
|
||||
rip = argv[arg];
|
||||
} else {
|
||||
error(1, 0, "unknown keyword %s", argv[arg]);
|
||||
}
|
||||
}
|
||||
nest->rta_len = off - nest_start;
|
||||
|
||||
/* token */
|
||||
if (token) {
|
||||
rta = (void *)(data + off);
|
||||
rta->rta_type = MPTCP_PM_ATTR_TOKEN;
|
||||
rta->rta_len = RTA_LENGTH(4);
|
||||
memcpy(RTA_DATA(rta), &token, 4);
|
||||
off += NLMSG_ALIGN(rta->rta_len);
|
||||
}
|
||||
|
||||
/* remote addr/port */
|
||||
if (rip) {
|
||||
nest_start = off;
|
||||
nest = (void *)(data + off);
|
||||
nest->rta_type = NLA_F_NESTED | MPTCP_PM_ATTR_ADDR_REMOTE;
|
||||
nest->rta_len = RTA_LENGTH(0);
|
||||
off += NLMSG_ALIGN(nest->rta_len);
|
||||
|
||||
/* addr data */
|
||||
rta = (void *)(data + off);
|
||||
if (inet_pton(AF_INET, rip, RTA_DATA(rta))) {
|
||||
family = AF_INET;
|
||||
rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR4;
|
||||
rta->rta_len = RTA_LENGTH(4);
|
||||
} else if (inet_pton(AF_INET6, rip, RTA_DATA(rta))) {
|
||||
family = AF_INET6;
|
||||
rta->rta_type = MPTCP_PM_ADDR_ATTR_ADDR6;
|
||||
rta->rta_len = RTA_LENGTH(16);
|
||||
} else {
|
||||
error(1, errno, "can't parse ip %s", (char *)rip);
|
||||
}
|
||||
off += NLMSG_ALIGN(rta->rta_len);
|
||||
|
||||
/* family */
|
||||
rta = (void *)(data + off);
|
||||
rta->rta_type = MPTCP_PM_ADDR_ATTR_FAMILY;
|
||||
rta->rta_len = RTA_LENGTH(2);
|
||||
memcpy(RTA_DATA(rta), &family, 2);
|
||||
off += NLMSG_ALIGN(rta->rta_len);
|
||||
|
||||
if (rport) {
|
||||
rta = (void *)(data + off);
|
||||
rta->rta_type = MPTCP_PM_ADDR_ATTR_PORT;
|
||||
rta->rta_len = RTA_LENGTH(2);
|
||||
memcpy(RTA_DATA(rta), &rport, 2);
|
||||
off += NLMSG_ALIGN(rta->rta_len);
|
||||
}
|
||||
|
||||
nest->rta_len = off - nest_start;
|
||||
}
|
||||
|
||||
do_nl_req(fd, nh, off, 0);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -770,10 +770,42 @@ test_subflows()
|
|||
rm -f "$evts"
|
||||
}
|
||||
|
||||
test_prio()
|
||||
{
|
||||
local count
|
||||
|
||||
# Send MP_PRIO signal from client to server machine
|
||||
ip netns exec "$ns2" ./pm_nl_ctl set 10.0.1.2 port "$client4_port" flags backup token "$client4_token" rip 10.0.1.1 rport "$server4_port"
|
||||
sleep 0.5
|
||||
|
||||
# Check TX
|
||||
stdbuf -o0 -e0 printf "MP_PRIO TX \t"
|
||||
count=$(ip netns exec "$ns2" nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}')
|
||||
[ -z "$count" ] && count=0
|
||||
if [ $count != 1 ]; then
|
||||
stdbuf -o0 -e0 printf "[FAIL]\n"
|
||||
exit 1
|
||||
else
|
||||
stdbuf -o0 -e0 printf "[OK]\n"
|
||||
fi
|
||||
|
||||
# Check RX
|
||||
stdbuf -o0 -e0 printf "MP_PRIO RX \t"
|
||||
count=$(ip netns exec "$ns1" nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}')
|
||||
[ -z "$count" ] && count=0
|
||||
if [ $count != 1 ]; then
|
||||
stdbuf -o0 -e0 printf "[FAIL]\n"
|
||||
exit 1
|
||||
else
|
||||
stdbuf -o0 -e0 printf "[OK]\n"
|
||||
fi
|
||||
}
|
||||
|
||||
make_connection
|
||||
make_connection "v6"
|
||||
test_announce
|
||||
test_remove
|
||||
test_subflows
|
||||
test_prio
|
||||
|
||||
exit 0
|
||||
|
|
|
@ -34,7 +34,7 @@ cfg_veth() {
|
|||
ip -netns "${PEER_NS}" addr add dev veth1 192.168.1.1/24
|
||||
ip -netns "${PEER_NS}" addr add dev veth1 2001:db8::1/64 nodad
|
||||
ip -netns "${PEER_NS}" link set dev veth1 up
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp_dummy
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp
|
||||
}
|
||||
|
||||
run_one() {
|
||||
|
|
|
@ -34,7 +34,7 @@ run_one() {
|
|||
ip -netns "${PEER_NS}" addr add dev veth1 2001:db8::1/64 nodad
|
||||
ip -netns "${PEER_NS}" link set dev veth1 up
|
||||
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp_dummy
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp
|
||||
ip netns exec "${PEER_NS}" ./udpgso_bench_rx ${rx_args} -r &
|
||||
ip netns exec "${PEER_NS}" ./udpgso_bench_rx -t ${rx_args} -r &
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ run_one() {
|
|||
ip netns exec "${PEER_NS}" ethtool -K veth1 rx-gro-list on
|
||||
|
||||
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp_dummy
|
||||
ip -n "${PEER_NS}" link set veth1 xdp object ../bpf/xdp_dummy.o section xdp
|
||||
tc -n "${PEER_NS}" qdisc add dev veth1 clsact
|
||||
tc -n "${PEER_NS}" filter add dev veth1 ingress prio 4 protocol ipv6 bpf object-file ../bpf/nat6to4.o section schedcls/ingress6/nat_6 direct-action
|
||||
tc -n "${PEER_NS}" filter add dev veth1 egress prio 4 protocol ip bpf object-file ../bpf/nat6to4.o section schedcls/egress4/snat4 direct-action
|
||||
|
|
|
@ -46,7 +46,7 @@ create_ns() {
|
|||
ip -n $BASE$ns addr add dev veth$ns $BM_NET_V4$ns/24
|
||||
ip -n $BASE$ns addr add dev veth$ns $BM_NET_V6$ns/64 nodad
|
||||
done
|
||||
ip -n $NS_DST link set veth$DST xdp object ../bpf/xdp_dummy.o section xdp_dummy 2>/dev/null
|
||||
ip -n $NS_DST link set veth$DST xdp object ../bpf/xdp_dummy.o section xdp 2>/dev/null
|
||||
}
|
||||
|
||||
create_vxlan_endpoint() {
|
||||
|
|
|
@ -289,14 +289,14 @@ if [ $CPUS -gt 1 ]; then
|
|||
ip netns exec $NS_SRC ethtool -L veth$SRC rx 1 tx 2 2>/dev/null
|
||||
printf "%-60s" "bad setting: XDP with RX nr less than TX"
|
||||
ip -n $NS_DST link set dev veth$DST xdp object ../bpf/xdp_dummy.o \
|
||||
section xdp_dummy 2>/dev/null &&\
|
||||
section xdp 2>/dev/null &&\
|
||||
echo "fail - set operation successful ?!?" || echo " ok "
|
||||
|
||||
# the following tests will run with multiple channels active
|
||||
ip netns exec $NS_SRC ethtool -L veth$SRC rx 2
|
||||
ip netns exec $NS_DST ethtool -L veth$DST rx 2
|
||||
ip -n $NS_DST link set dev veth$DST xdp object ../bpf/xdp_dummy.o \
|
||||
section xdp_dummy 2>/dev/null
|
||||
section xdp 2>/dev/null
|
||||
printf "%-60s" "bad setting: reducing RX nr below peer TX with XDP set"
|
||||
ip netns exec $NS_DST ethtool -L veth$DST rx 1 2>/dev/null &&\
|
||||
echo "fail - set operation successful ?!?" || echo " ok "
|
||||
|
@ -311,7 +311,7 @@ if [ $CPUS -gt 2 ]; then
|
|||
chk_channels "setting invalid channels nr" $DST 2 2
|
||||
fi
|
||||
|
||||
ip -n $NS_DST link set dev veth$DST xdp object ../bpf/xdp_dummy.o section xdp_dummy 2>/dev/null
|
||||
ip -n $NS_DST link set dev veth$DST xdp object ../bpf/xdp_dummy.o section xdp 2>/dev/null
|
||||
chk_gro_flag "with xdp attached - gro flag" $DST on
|
||||
chk_gro_flag " - peer gro flag" $SRC off
|
||||
chk_tso_flag " - tso flag" $SRC off
|
||||
|
|
|
@ -19,8 +19,6 @@ endif
|
|||
MIRROR := https://download.wireguard.com/qemu-test/distfiles/
|
||||
|
||||
KERNEL_BUILD_PATH := $(BUILD_PATH)/kernel$(if $(findstring yes,$(DEBUG_KERNEL)),-debug)
|
||||
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
|
||||
WIREGUARD_SOURCES := $(call rwildcard,$(KERNEL_PATH)/drivers/net/wireguard/,*)
|
||||
|
||||
default: qemu
|
||||
|
||||
|
@ -109,20 +107,22 @@ CHOST := x86_64-linux-musl
|
|||
QEMU_ARCH := x86_64
|
||||
KERNEL_ARCH := x86_64
|
||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
||||
QEMU_VPORT_RESULT := virtio-serial-device
|
||||
ifeq ($(HOST_ARCH),$(ARCH))
|
||||
QEMU_MACHINE := -cpu host -machine q35,accel=kvm
|
||||
QEMU_MACHINE := -cpu host -machine microvm,accel=kvm,pit=off,pic=off,rtc=off -no-acpi
|
||||
else
|
||||
QEMU_MACHINE := -cpu max -machine q35
|
||||
QEMU_MACHINE := -cpu max -machine microvm -no-acpi
|
||||
endif
|
||||
else ifeq ($(ARCH),i686)
|
||||
CHOST := i686-linux-musl
|
||||
QEMU_ARCH := i386
|
||||
KERNEL_ARCH := x86
|
||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
||||
QEMU_VPORT_RESULT := virtio-serial-device
|
||||
ifeq ($(subst x86_64,i686,$(HOST_ARCH)),$(ARCH))
|
||||
QEMU_MACHINE := -cpu host -machine q35,accel=kvm
|
||||
QEMU_MACHINE := -cpu host -machine microvm,accel=kvm,pit=off,pic=off,rtc=off -no-acpi
|
||||
else
|
||||
QEMU_MACHINE := -cpu max -machine q35
|
||||
QEMU_MACHINE := -cpu coreduo -machine microvm -no-acpi
|
||||
endif
|
||||
else ifeq ($(ARCH),mips64)
|
||||
CHOST := mips64-linux-musl
|
||||
|
@ -208,10 +208,11 @@ QEMU_ARCH := m68k
|
|||
KERNEL_ARCH := m68k
|
||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
|
||||
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config)
|
||||
QEMU_VPORT_RESULT := virtio-serial-device
|
||||
ifeq ($(HOST_ARCH),$(ARCH))
|
||||
QEMU_MACHINE := -cpu host,accel=kvm -machine q800 -append $(KERNEL_CMDLINE)
|
||||
QEMU_MACHINE := -cpu host,accel=kvm -machine virt -append $(KERNEL_CMDLINE)
|
||||
else
|
||||
QEMU_MACHINE := -machine q800 -smp 1 -append $(KERNEL_CMDLINE)
|
||||
QEMU_MACHINE := -machine virt -smp 1 -append $(KERNEL_CMDLINE)
|
||||
endif
|
||||
else ifeq ($(ARCH),riscv64)
|
||||
CHOST := riscv64-linux-musl
|
||||
|
@ -322,8 +323,9 @@ $(KERNEL_BUILD_PATH)/.config: $(TOOLCHAIN_PATH)/.installed kernel.config arch/$(
|
|||
cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config $(KERNEL_BUILD_PATH)/minimal.config
|
||||
$(if $(findstring yes,$(DEBUG_KERNEL)),cp debug.config $(KERNEL_BUILD_PATH) && cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config debug.config,)
|
||||
|
||||
$(KERNEL_BZIMAGE): $(TOOLCHAIN_PATH)/.installed $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-legacy-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/wg $(BUILD_PATH)/init ../netns.sh $(WIREGUARD_SOURCES)
|
||||
$(KERNEL_BZIMAGE): $(TOOLCHAIN_PATH)/.installed $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-legacy-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/wg $(BUILD_PATH)/init
|
||||
$(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
|
||||
.PHONY: $(KERNEL_BZIMAGE)
|
||||
|
||||
$(TOOLCHAIN_PATH)/$(CHOST)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config $(TOOLCHAIN_PATH)/.installed
|
||||
rm -rf $(TOOLCHAIN_PATH)/$(CHOST)/include/linux
|
||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
|||
CONFIG_VIRTIO_MENU=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
||||
CONFIG_FRAME_WARN=1024
|
||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
|||
CONFIG_VIRTIO_MENU=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
||||
CONFIG_CPU_BIG_ENDIAN=y
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
CONFIG_ACPI=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_VIRTIO_MENU=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=vport0p1 panic_on_warn=1 reboot=t"
|
||||
CONFIG_FRAME_WARN=1024
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
CONFIG_MMU=y
|
||||
CONFIG_VIRT=y
|
||||
CONFIG_M68KCLASSIC=y
|
||||
CONFIG_M68040=y
|
||||
CONFIG_MAC=y
|
||||
CONFIG_SERIAL_PMACZILOG=y
|
||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE="console=ttyGF0 wg.success=vport0p1 panic_on_warn=1"
|
||||
CONFIG_FRAME_WARN=1024
|
||||
|
|
|
@ -6,6 +6,7 @@ CONFIG_POWER_RESET=y
|
|||
CONFIG_POWER_RESET_SYSCON=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
CONFIG_FRAME_WARN=1024
|
||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_POWER_RESET=y
|
|||
CONFIG_POWER_RESET_SYSCON=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
CONFIG_FRAME_WARN=1024
|
||||
|
|
|
@ -4,6 +4,7 @@ CONFIG_PPC_85xx=y
|
|||
CONFIG_PHYS_64BIT=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_COMPAT_32BIT_TIME=y
|
||||
CONFIG_MATH_EMULATION=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
CONFIG_ACPI=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_VIRTIO_MENU=y
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||
CONFIG_CMDLINE="console=ttyS0 wg.success=vport0p1 panic_on_warn=1 reboot=t"
|
||||
CONFIG_FRAME_WARN=1280
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/stat.h>
|
||||
|
@ -70,6 +71,15 @@ static void seed_rng(void)
|
|||
close(fd);
|
||||
}
|
||||
|
||||
static void set_time(void)
|
||||
{
|
||||
if (time(NULL))
|
||||
return;
|
||||
pretty_message("[+] Setting fake time...");
|
||||
if (stime(&(time_t){1433512680}) < 0)
|
||||
panic("settimeofday()");
|
||||
}
|
||||
|
||||
static void mount_filesystems(void)
|
||||
{
|
||||
pretty_message("[+] Mounting filesystems...");
|
||||
|
@ -259,6 +269,7 @@ int main(int argc, char *argv[])
|
|||
print_banner();
|
||||
mount_filesystems();
|
||||
seed_rng();
|
||||
set_time();
|
||||
kmod_selftests();
|
||||
enable_logging();
|
||||
clear_leaks();
|
||||
|
|
Loading…
Add table
Reference in a new issue