mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-07 15:01:44 +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
|
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?
|
What is netdev?
|
||||||
---------------
|
---------------
|
||||||
It is a mailing list for all network-related Linux stuff. This
|
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
|
version that should be applied. If there is any doubt, the maintainer
|
||||||
will reply and ask what should be done.
|
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?
|
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
|
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
|
* 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?
|
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
|
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: Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
|
||||||
F: drivers/iio/accel/bma400*
|
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: Alexei Starovoitov <ast@kernel.org>
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
M: Andrii Nakryiko <andrii@kernel.org>
|
M: Andrii Nakryiko <andrii@kernel.org>
|
||||||
R: Martin KaFai Lau <kafai@fb.com>
|
R: Martin KaFai Lau <martin.lau@linux.dev>
|
||||||
R: Song Liu <songliubraving@fb.com>
|
R: Song Liu <song@kernel.org>
|
||||||
R: Yonghong Song <yhs@fb.com>
|
R: Yonghong Song <yhs@fb.com>
|
||||||
R: John Fastabend <john.fastabend@gmail.com>
|
R: John Fastabend <john.fastabend@gmail.com>
|
||||||
R: KP Singh <kpsingh@kernel.org>
|
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
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://bpf.io/
|
W: https://bpf.io/
|
||||||
|
@ -3659,12 +3661,9 @@ F: scripts/pahole-version.sh
|
||||||
F: tools/bpf/
|
F: tools/bpf/
|
||||||
F: tools/lib/bpf/
|
F: tools/lib/bpf/
|
||||||
F: tools/testing/selftests/bpf/
|
F: tools/testing/selftests/bpf/
|
||||||
N: bpf
|
|
||||||
K: bpf
|
|
||||||
|
|
||||||
BPF JIT for ARM
|
BPF JIT for ARM
|
||||||
M: Shubham Bansal <illusionist.neo@gmail.com>
|
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: arch/arm/net/
|
F: arch/arm/net/
|
||||||
|
@ -3673,7 +3672,6 @@ BPF JIT for ARM64
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
M: Alexei Starovoitov <ast@kernel.org>
|
M: Alexei Starovoitov <ast@kernel.org>
|
||||||
M: Zi Shen Lim <zlim.lnx@gmail.com>
|
M: Zi Shen Lim <zlim.lnx@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arm64/net/
|
F: arch/arm64/net/
|
||||||
|
@ -3681,14 +3679,12 @@ F: arch/arm64/net/
|
||||||
BPF JIT for MIPS (32-BIT AND 64-BIT)
|
BPF JIT for MIPS (32-BIT AND 64-BIT)
|
||||||
M: Johan Almbladh <johan.almbladh@anyfinetworks.com>
|
M: Johan Almbladh <johan.almbladh@anyfinetworks.com>
|
||||||
M: Paul Burton <paulburton@kernel.org>
|
M: Paul Burton <paulburton@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/mips/net/
|
F: arch/mips/net/
|
||||||
|
|
||||||
BPF JIT for NFP NICs
|
BPF JIT for NFP NICs
|
||||||
M: Jakub Kicinski <kuba@kernel.org>
|
M: Jakub Kicinski <kuba@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: drivers/net/ethernet/netronome/nfp/bpf/
|
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)
|
BPF JIT for POWERPC (32-BIT AND 64-BIT)
|
||||||
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
M: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
|
||||||
M: Michael Ellerman <mpe@ellerman.id.au>
|
M: Michael Ellerman <mpe@ellerman.id.au>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/powerpc/net/
|
F: arch/powerpc/net/
|
||||||
|
@ -3704,7 +3699,6 @@ F: arch/powerpc/net/
|
||||||
BPF JIT for RISC-V (32-bit)
|
BPF JIT for RISC-V (32-bit)
|
||||||
M: Luke Nelson <luke.r.nels@gmail.com>
|
M: Luke Nelson <luke.r.nels@gmail.com>
|
||||||
M: Xi Wang <xi.wang@gmail.com>
|
M: Xi Wang <xi.wang@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/riscv/net/
|
F: arch/riscv/net/
|
||||||
|
@ -3712,7 +3706,6 @@ X: arch/riscv/net/bpf_jit_comp64.c
|
||||||
|
|
||||||
BPF JIT for RISC-V (64-bit)
|
BPF JIT for RISC-V (64-bit)
|
||||||
M: Björn Töpel <bjorn@kernel.org>
|
M: Björn Töpel <bjorn@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/riscv/net/
|
F: arch/riscv/net/
|
||||||
|
@ -3722,7 +3715,6 @@ BPF JIT for S390
|
||||||
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
M: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||||
M: Heiko Carstens <hca@linux.ibm.com>
|
M: Heiko Carstens <hca@linux.ibm.com>
|
||||||
M: Vasily Gorbik <gor@linux.ibm.com>
|
M: Vasily Gorbik <gor@linux.ibm.com>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/s390/net/
|
F: arch/s390/net/
|
||||||
|
@ -3730,14 +3722,12 @@ X: arch/s390/net/pnet.c
|
||||||
|
|
||||||
BPF JIT for SPARC (32-BIT AND 64-BIT)
|
BPF JIT for SPARC (32-BIT AND 64-BIT)
|
||||||
M: David S. Miller <davem@davemloft.net>
|
M: David S. Miller <davem@davemloft.net>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: arch/sparc/net/
|
F: arch/sparc/net/
|
||||||
|
|
||||||
BPF JIT for X86 32-BIT
|
BPF JIT for X86 32-BIT
|
||||||
M: Wang YanQing <udknight@gmail.com>
|
M: Wang YanQing <udknight@gmail.com>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: arch/x86/net/bpf_jit_comp32.c
|
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
|
BPF JIT for X86 64-BIT
|
||||||
M: Alexei Starovoitov <ast@kernel.org>
|
M: Alexei Starovoitov <ast@kernel.org>
|
||||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||||
L: netdev@vger.kernel.org
|
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/net/
|
F: arch/x86/net/
|
||||||
X: arch/x86/net/bpf_jit_comp32.c
|
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>
|
M: KP Singh <kpsingh@kernel.org>
|
||||||
R: Florent Revest <revest@chromium.org>
|
R: Florent Revest <revest@chromium.org>
|
||||||
R: Brendan Jackman <jackmanb@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: kernel/bpf/bpf_lsm.c
|
||||||
F: security/bpf/
|
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: John Fastabend <john.fastabend@gmail.com>
|
||||||
M: Jakub Sitnicki <jakub@cloudflare.com>
|
M: Jakub Sitnicki <jakub@cloudflare.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -3775,13 +3832,31 @@ F: net/ipv4/tcp_bpf.c
|
||||||
F: net/ipv4/udp_bpf.c
|
F: net/ipv4/udp_bpf.c
|
||||||
F: net/unix/unix_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>
|
M: Quentin Monnet <quentin@isovalent.com>
|
||||||
L: bpf@vger.kernel.org
|
L: bpf@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: kernel/bpf/disasm.*
|
F: kernel/bpf/disasm.*
|
||||||
F: tools/bpf/bpftool/
|
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
|
BROADCOM B44 10/100 ETHERNET DRIVER
|
||||||
M: Michael Chan <michael.chan@broadcom.com>
|
M: Michael Chan <michael.chan@broadcom.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
|
@ -18109,6 +18184,7 @@ F: drivers/misc/sgi-xp/
|
||||||
|
|
||||||
SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
|
SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
|
||||||
M: Karsten Graul <kgraul@linux.ibm.com>
|
M: Karsten Graul <kgraul@linux.ibm.com>
|
||||||
|
M: Wenjia Zhang <wenjia@linux.ibm.com>
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
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
|
CRC32c and CRC32 CRC algorithms implemented using mips crypto
|
||||||
instructions, when available.
|
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
|
config CRYPTO_XXHASH
|
||||||
tristate "xxHash hash algorithm"
|
tristate "xxHash hash algorithm"
|
||||||
|
@ -898,6 +910,16 @@ config CRYPTO_SHA512_SSSE3
|
||||||
Extensions version 1 (AVX1), or Advanced Vector Extensions
|
Extensions version 1 (AVX1), or Advanced Vector Extensions
|
||||||
version 2 (AVX2) instructions, when available.
|
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
|
config CRYPTO_SHA1_OCTEON
|
||||||
tristate "SHA1 digest algorithm (OCTEON)"
|
tristate "SHA1 digest algorithm (OCTEON)"
|
||||||
depends on CPU_CAVIUM_OCTEON
|
depends on CPU_CAVIUM_OCTEON
|
||||||
|
@ -930,6 +952,16 @@ config CRYPTO_SHA1_PPC_SPE
|
||||||
SHA-1 secure hash standard (DFIPS 180-4) implemented
|
SHA-1 secure hash standard (DFIPS 180-4) implemented
|
||||||
using powerpc SPE SIMD instruction set.
|
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
|
config CRYPTO_SHA256
|
||||||
tristate "SHA224 and SHA256 digest algorithm"
|
tristate "SHA224 and SHA256 digest algorithm"
|
||||||
select CRYPTO_HASH
|
select CRYPTO_HASH
|
||||||
|
@ -970,6 +1002,16 @@ config CRYPTO_SHA256_SPARC64
|
||||||
SHA-256 secure hash standard (DFIPS 180-2) implemented
|
SHA-256 secure hash standard (DFIPS 180-2) implemented
|
||||||
using sparc64 crypto instructions, when available.
|
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
|
config CRYPTO_SHA512
|
||||||
tristate "SHA384 and SHA512 digest algorithms"
|
tristate "SHA384 and SHA512 digest algorithms"
|
||||||
select CRYPTO_HASH
|
select CRYPTO_HASH
|
||||||
|
@ -1010,6 +1052,26 @@ config CRYPTO_SHA3
|
||||||
References:
|
References:
|
||||||
http://keccak.noekeon.org/
|
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
|
config CRYPTO_SM3
|
||||||
tristate
|
tristate
|
||||||
|
|
||||||
|
@ -1070,6 +1132,16 @@ config CRYPTO_GHASH_CLMUL_NI_INTEL
|
||||||
This is the x86_64 CLMUL-NI accelerated implementation of
|
This is the x86_64 CLMUL-NI accelerated implementation of
|
||||||
GHASH, the hash function used in GCM (Galois/Counter mode).
|
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"
|
comment "Ciphers"
|
||||||
|
|
||||||
config CRYPTO_AES
|
config CRYPTO_AES
|
||||||
|
@ -1185,6 +1257,23 @@ config CRYPTO_AES_PPC_SPE
|
||||||
architecture specific assembler implementations that work on 1KB
|
architecture specific assembler implementations that work on 1KB
|
||||||
tables or 256 bytes S-boxes.
|
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
|
config CRYPTO_ANUBIS
|
||||||
tristate "Anubis cipher algorithm"
|
tristate "Anubis cipher algorithm"
|
||||||
depends on CRYPTO_USER_API_ENABLE_OBSOLETE
|
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
|
algorithm are provided; regular processing one input block and
|
||||||
one that processes three blocks parallel.
|
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
|
config CRYPTO_FCRYPT
|
||||||
tristate "FCrypt cipher algorithm"
|
tristate "FCrypt cipher algorithm"
|
||||||
select CRYPTO_ALGAPI
|
select CRYPTO_ALGAPI
|
||||||
|
@ -1474,6 +1576,18 @@ config CRYPTO_CHACHA_MIPS
|
||||||
select CRYPTO_SKCIPHER
|
select CRYPTO_SKCIPHER
|
||||||
select CRYPTO_ARCH_HAVE_LIB_CHACHA
|
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
|
config CRYPTO_SEED
|
||||||
tristate "SEED cipher algorithm"
|
tristate "SEED cipher algorithm"
|
||||||
depends on CRYPTO_USER_API_ENABLE_OBSOLETE
|
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
|
Select this option if you want to use the paes cipher
|
||||||
for example to use protected key encrypted devices.
|
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
|
config S390_PRNG
|
||||||
tristate "Pseudo random number generator device driver"
|
tristate "Pseudo random number generator device driver"
|
||||||
depends on S390
|
depends on S390
|
||||||
|
@ -238,29 +146,6 @@ config S390_PRNG
|
||||||
|
|
||||||
It is available as of z9.
|
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
|
config CRYPTO_DEV_NIAGARA2
|
||||||
tristate "Niagara2 Stream Processing Unit driver"
|
tristate "Niagara2 Stream Processing Unit driver"
|
||||||
select CRYPTO_LIB_DES
|
select CRYPTO_LIB_DES
|
||||||
|
|
|
@ -94,6 +94,7 @@ config WIREGUARD
|
||||||
select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
|
select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
|
||||||
select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
|
select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
|
||||||
select CRYPTO_POLY1305_MIPS if MIPS
|
select CRYPTO_POLY1305_MIPS if MIPS
|
||||||
|
select CRYPTO_CHACHA_S390 if S390
|
||||||
help
|
help
|
||||||
WireGuard is a secure, fast, and easy to use replacement for IPSec
|
WireGuard is a secure, fast, and easy to use replacement for IPSec
|
||||||
that uses modern cryptography and clever networking tricks. It's
|
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");
|
sysid_parent = of_find_node_by_path("/ambapp0");
|
||||||
if (sysid_parent) {
|
if (sysid_parent) {
|
||||||
of_node_get(sysid_parent);
|
|
||||||
err = of_property_read_u32(sysid_parent, "systemid", &sysid);
|
err = of_property_read_u32(sysid_parent, "systemid", &sysid);
|
||||||
if (!err && ((sysid & GRLIB_VERSION_MASK) >=
|
if (!err && ((sysid & GRLIB_VERSION_MASK) >=
|
||||||
GRCAN_TXBUG_SAFE_GRLIB_VERSION))
|
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 */
|
/* acknowledge rx fifo 0 */
|
||||||
m_can_write(cdev, M_CAN_RXF0A, fgi);
|
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);
|
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);
|
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 */
|
/* ack txe element */
|
||||||
m_can_write(cdev, M_CAN_TXEFA, FIELD_PREP(TXEFA_EFAI_MASK,
|
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
|
/* enable internal timestamp generation, with a prescalar of 16. The
|
||||||
* prescalar is applied to the nominal bit timing
|
* 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);
|
m_can_config_endisable(cdev, false);
|
||||||
|
|
||||||
|
|
|
@ -1332,6 +1332,9 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
|
||||||
cfg = (RCANFD_DCFG_DTSEG1(gpriv, tseg1) | RCANFD_DCFG_DBRP(brp) |
|
cfg = (RCANFD_DCFG_DTSEG1(gpriv, tseg1) | RCANFD_DCFG_DBRP(brp) |
|
||||||
RCANFD_DCFG_DSJW(sjw) | RCANFD_DCFG_DTSEG2(gpriv, tseg2));
|
RCANFD_DCFG_DSJW(sjw) | RCANFD_DCFG_DTSEG2(gpriv, tseg2));
|
||||||
|
|
||||||
|
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);
|
rcar_canfd_write(priv->base, RCANFD_F_DCFG(ch), cfg);
|
||||||
netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n",
|
netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n",
|
||||||
brp, sjw, tseg1, tseg2);
|
brp, sjw, tseg1, tseg2);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
// Copyright (c) 2019 Martin Sperl <kernel@martin.sperl.org>
|
// Copyright (c) 2019 Martin Sperl <kernel@martin.sperl.org>
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <asm/unaligned.h>
|
||||||
#include <linux/bitfield.h>
|
#include <linux/bitfield.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
@ -1650,6 +1651,7 @@ static int mcp251xfd_stop(struct net_device *ndev)
|
||||||
netif_stop_queue(ndev);
|
netif_stop_queue(ndev);
|
||||||
set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
|
set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
|
||||||
hrtimer_cancel(&priv->rx_irq_timer);
|
hrtimer_cancel(&priv->rx_irq_timer);
|
||||||
|
hrtimer_cancel(&priv->tx_irq_timer);
|
||||||
mcp251xfd_chip_interrupts_disable(priv);
|
mcp251xfd_chip_interrupts_disable(priv);
|
||||||
free_irq(ndev->irq, priv);
|
free_irq(ndev->irq, priv);
|
||||||
can_rx_offload_disable(&priv->offload);
|
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].len = sizeof(buf_tx->cmd);
|
||||||
xfer[0].speed_hz = priv->spi_max_speed_hz_slow;
|
xfer[0].speed_hz = priv->spi_max_speed_hz_slow;
|
||||||
xfer[1].rx_buf = buf_rx->data;
|
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;
|
xfer[1].speed_hz = priv->spi_max_speed_hz_fast;
|
||||||
|
|
||||||
mcp251xfd_spi_cmd_read_nocrc(&buf_tx->cmd, MCP251XFD_REG_DEVID);
|
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)
|
if (err)
|
||||||
goto out_kfree_buf_tx;
|
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_slow = xfer[0].effective_speed_hz;
|
||||||
*effective_speed_hz_fast = xfer[1].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,
|
* register. It increments once per SYS clock tick,
|
||||||
* which is 20 or 40 MHz.
|
* which is 20 or 40 MHz.
|
||||||
*
|
*
|
||||||
* Observation shows that if the lowest byte (which is
|
* Observation on the mcp2518fd shows that if the
|
||||||
* transferred first on the SPI bus) of that register
|
* lowest byte (which is transferred first on the SPI
|
||||||
* is 0x00 or 0x80 the calculated CRC doesn't always
|
* bus) of that register is 0x00 or 0x80 the
|
||||||
* match the transferred one.
|
* 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
|
* If the highest bit in the lowest byte is flipped
|
||||||
* the transferred CRC matches the calculated one. We
|
* the transferred CRC matches the calculated one. We
|
||||||
* assume for now the CRC calculation in the chip
|
* assume for now the CRC operates on the correct
|
||||||
* works on wrong data and the transferred data is
|
* data.
|
||||||
* correct.
|
|
||||||
*/
|
*/
|
||||||
if (reg == MCP251XFD_REG_TBC &&
|
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 */
|
/* Flip highest bit in lowest byte of le32 */
|
||||||
buf_rx->data[0] ^= 0x80;
|
buf_rx->data[0] ^= 0x80;
|
||||||
|
|
||||||
|
@ -356,10 +358,8 @@ mcp251xfd_regmap_crc_read(void *context,
|
||||||
val_len);
|
val_len);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
/* If CRC is now correct, assume
|
/* If CRC is now correct, assume
|
||||||
* transferred data was OK, flip bit
|
* flipped data is OK.
|
||||||
* back to original value.
|
|
||||||
*/
|
*/
|
||||||
buf_rx->data[0] ^= 0x80;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -268,6 +268,8 @@ struct gs_can {
|
||||||
|
|
||||||
struct usb_anchor tx_submitted;
|
struct usb_anchor tx_submitted;
|
||||||
atomic_t active_tx_urbs;
|
atomic_t active_tx_urbs;
|
||||||
|
void *rxbuf[GS_MAX_RX_URBS];
|
||||||
|
dma_addr_t rxbuf_dma[GS_MAX_RX_URBS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* usb interface struct */
|
/* 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++) {
|
for (i = 0; i < GS_MAX_RX_URBS; i++) {
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
u8 *buf;
|
u8 *buf;
|
||||||
|
dma_addr_t buf_dma;
|
||||||
|
|
||||||
/* alloc rx urb */
|
/* alloc rx urb */
|
||||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
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,
|
buf = usb_alloc_coherent(dev->udev,
|
||||||
dev->parent->hf_size_rx,
|
dev->parent->hf_size_rx,
|
||||||
GFP_KERNEL,
|
GFP_KERNEL,
|
||||||
&urb->transfer_dma);
|
&buf_dma);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
netdev_err(netdev,
|
netdev_err(netdev,
|
||||||
"No memory left for USB buffer\n");
|
"No memory left for USB buffer\n");
|
||||||
|
@ -760,6 +763,8 @@ static int gs_can_open(struct net_device *netdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
urb->transfer_dma = buf_dma;
|
||||||
|
|
||||||
/* fill, anchor, and submit rx urb */
|
/* fill, anchor, and submit rx urb */
|
||||||
usb_fill_bulk_urb(urb,
|
usb_fill_bulk_urb(urb,
|
||||||
dev->udev,
|
dev->udev,
|
||||||
|
@ -781,10 +786,17 @@ static int gs_can_open(struct net_device *netdev)
|
||||||
"usb_submit failed (err=%d)\n", rc);
|
"usb_submit failed (err=%d)\n", rc);
|
||||||
|
|
||||||
usb_unanchor_urb(urb);
|
usb_unanchor_urb(urb);
|
||||||
|
usb_free_coherent(dev->udev,
|
||||||
|
sizeof(struct gs_host_frame),
|
||||||
|
buf,
|
||||||
|
buf_dma);
|
||||||
usb_free_urb(urb);
|
usb_free_urb(urb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev->rxbuf[i] = buf;
|
||||||
|
dev->rxbuf_dma[i] = buf_dma;
|
||||||
|
|
||||||
/* Drop reference,
|
/* Drop reference,
|
||||||
* USB core will take care of freeing it
|
* USB core will take care of freeing it
|
||||||
*/
|
*/
|
||||||
|
@ -842,13 +854,20 @@ static int gs_can_close(struct net_device *netdev)
|
||||||
int rc;
|
int rc;
|
||||||
struct gs_can *dev = netdev_priv(netdev);
|
struct gs_can *dev = netdev_priv(netdev);
|
||||||
struct gs_usb *parent = dev->parent;
|
struct gs_usb *parent = dev->parent;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
|
|
||||||
/* Stop polling */
|
/* Stop polling */
|
||||||
parent->active_channels--;
|
parent->active_channels--;
|
||||||
if (!parent->active_channels)
|
if (!parent->active_channels) {
|
||||||
usb_kill_anchored_urbs(&parent->rx_submitted);
|
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 */
|
/* Stop sending URBs */
|
||||||
usb_kill_anchored_urbs(&dev->tx_submitted);
|
usb_kill_anchored_urbs(&dev->tx_submitted);
|
||||||
|
|
|
@ -35,9 +35,10 @@
|
||||||
#define KVASER_USB_RX_BUFFER_SIZE 3072
|
#define KVASER_USB_RX_BUFFER_SIZE 3072
|
||||||
#define KVASER_USB_MAX_NET_DEVICES 5
|
#define KVASER_USB_MAX_NET_DEVICES 5
|
||||||
|
|
||||||
/* USB devices features */
|
/* Kvaser USB device quirks */
|
||||||
#define KVASER_USB_HAS_SILENT_MODE BIT(0)
|
#define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0)
|
||||||
#define KVASER_USB_HAS_TXRX_ERRORS BIT(1)
|
#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1)
|
||||||
|
#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ BIT(2)
|
||||||
|
|
||||||
/* Device capabilities */
|
/* Device capabilities */
|
||||||
#define KVASER_USB_CAP_BERR_CAP 0x01
|
#define KVASER_USB_CAP_BERR_CAP 0x01
|
||||||
|
@ -65,13 +66,8 @@ struct kvaser_usb_dev_card_data_hydra {
|
||||||
struct kvaser_usb_dev_card_data {
|
struct kvaser_usb_dev_card_data {
|
||||||
u32 ctrlmode_supported;
|
u32 ctrlmode_supported;
|
||||||
u32 capabilities;
|
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 */
|
/* Context for an outstanding, not yet ACKed, transmission */
|
||||||
struct kvaser_usb_tx_urb_context {
|
struct kvaser_usb_tx_urb_context {
|
||||||
|
@ -83,7 +79,7 @@ struct kvaser_usb {
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
struct usb_interface *intf;
|
struct usb_interface *intf;
|
||||||
struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
|
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;
|
const struct kvaser_usb_dev_cfg *cfg;
|
||||||
|
|
||||||
struct usb_endpoint_descriptor *bulk_in, *bulk_out;
|
struct usb_endpoint_descriptor *bulk_in, *bulk_out;
|
||||||
|
@ -165,6 +161,12 @@ struct kvaser_usb_dev_ops {
|
||||||
u16 transid);
|
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 {
|
struct kvaser_usb_dev_cfg {
|
||||||
const struct can_clock clock;
|
const struct can_clock clock;
|
||||||
const unsigned int timestamp_freq;
|
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 len);
|
||||||
|
|
||||||
int kvaser_usb_can_rx_over_error(struct net_device *netdev);
|
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 */
|
#endif /* KVASER_USB_H */
|
||||||
|
|
|
@ -61,8 +61,6 @@
|
||||||
#define USB_USBCAN_R_V2_PRODUCT_ID 294
|
#define USB_USBCAN_R_V2_PRODUCT_ID 294
|
||||||
#define USB_LEAF_LIGHT_R_V2_PRODUCT_ID 295
|
#define USB_LEAF_LIGHT_R_V2_PRODUCT_ID 295
|
||||||
#define USB_LEAF_LIGHT_HS_V2_OEM2_PRODUCT_ID 296
|
#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 */
|
/* Kvaser USBCan-II devices product ids */
|
||||||
#define USB_USBCAN_REVB_PRODUCT_ID 2
|
#define USB_USBCAN_REVB_PRODUCT_ID 2
|
||||||
|
@ -89,116 +87,153 @@
|
||||||
#define USB_USBCAN_PRO_4HS_PRODUCT_ID 276
|
#define USB_USBCAN_PRO_4HS_PRODUCT_ID 276
|
||||||
#define USB_HYBRID_CANLIN_PRODUCT_ID 277
|
#define USB_HYBRID_CANLIN_PRODUCT_ID 277
|
||||||
#define USB_HYBRID_PRO_CANLIN_PRODUCT_ID 278
|
#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)
|
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_hydra = {
|
||||||
{
|
.quirks = 0,
|
||||||
return (id->idProduct >= USB_LEAF_DEVEL_PRODUCT_ID &&
|
.ops = &kvaser_usb_hydra_dev_ops,
|
||||||
id->idProduct <= USB_CAN_R_PRODUCT_ID) ||
|
};
|
||||||
(id->idProduct >= USB_LEAF_LITE_V2_PRODUCT_ID &&
|
|
||||||
id->idProduct <= USB_LEAF_PRODUCT_ID_END);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool kvaser_is_usbcan(const struct usb_device_id *id)
|
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_usbcan = {
|
||||||
{
|
.quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS |
|
||||||
return id->idProduct >= USB_USBCAN_REVB_PRODUCT_ID &&
|
KVASER_USB_QUIRK_HAS_SILENT_MODE,
|
||||||
id->idProduct <= USB_MEMORATOR_PRODUCT_ID;
|
.family = KVASER_USBCAN,
|
||||||
}
|
.ops = &kvaser_usb_leaf_dev_ops,
|
||||||
|
};
|
||||||
|
|
||||||
static inline bool kvaser_is_hydra(const struct usb_device_id *id)
|
static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = {
|
||||||
{
|
.quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ,
|
||||||
return id->idProduct >= USB_BLACKBIRD_V2_PRODUCT_ID &&
|
.family = KVASER_LEAF,
|
||||||
id->idProduct <= USB_HYDRA_PRODUCT_ID_END;
|
.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[] = {
|
static const struct usb_device_id kvaser_usb_table[] = {
|
||||||
/* Leaf USB product IDs */
|
/* Leaf M32C USB product IDs */
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID),
|
||||||
{ 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_LITE_PRODUCT_ID),
|
||||||
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf },
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_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_GI_PRODUCT_ID) },
|
{ 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),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID),
|
||||||
.driver_info = KVASER_USB_HAS_TXRX_ERRORS |
|
.driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen },
|
||||||
KVASER_USB_HAS_SILENT_MODE },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID),
|
{ 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),
|
{ 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),
|
{ 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),
|
{ 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),
|
{ 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),
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_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_V2_PRODUCT_ID) },
|
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) },
|
/* Leaf i.MX28 USB product IDs */
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID),
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM2_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 */
|
/* USBCANII USB product IDs */
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID),
|
{ 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),
|
{ 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),
|
{ 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),
|
{ 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 */
|
/* Minihydra USB product IDs */
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_5HS_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_5HS_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_4HS_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_HS_V2_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_2HS_V2_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_2HS_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID),
|
||||||
{ 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) },
|
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_2CANLIN_PRODUCT_ID),
|
||||||
{ USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_CANLIN_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);
|
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)
|
static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
||||||
{
|
{
|
||||||
struct kvaser_usb *dev = urb->context;
|
struct kvaser_usb *dev = urb->context;
|
||||||
|
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||||
int err;
|
int err;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -301,7 +337,7 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
||||||
goto resubmit_urb;
|
goto resubmit_urb;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->ops->dev_read_bulk_callback(dev, urb->transfer_buffer,
|
ops->dev_read_bulk_callback(dev, urb->transfer_buffer,
|
||||||
urb->actual_length);
|
urb->actual_length);
|
||||||
|
|
||||||
resubmit_urb:
|
resubmit_urb:
|
||||||
|
@ -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_net_priv *priv = netdev_priv(netdev);
|
||||||
struct kvaser_usb *dev = priv->dev;
|
struct kvaser_usb *dev = priv->dev;
|
||||||
|
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = open_candev(netdev);
|
err = open_candev(netdev);
|
||||||
|
@ -406,11 +443,11 @@ static int kvaser_usb_open(struct net_device *netdev)
|
||||||
if (err)
|
if (err)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
err = dev->ops->dev_set_opt_mode(priv);
|
err = ops->dev_set_opt_mode(priv);
|
||||||
if (err)
|
if (err)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
err = dev->ops->dev_start_chip(priv);
|
err = ops->dev_start_chip(priv);
|
||||||
if (err) {
|
if (err) {
|
||||||
netdev_warn(netdev, "Cannot start device, error %d\n", err);
|
netdev_warn(netdev, "Cannot start device, error %d\n", err);
|
||||||
goto error;
|
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_net_priv *priv = netdev_priv(netdev);
|
||||||
struct kvaser_usb *dev = priv->dev;
|
struct kvaser_usb *dev = priv->dev;
|
||||||
|
const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
|
|
||||||
err = dev->ops->dev_flush_queue(priv);
|
err = ops->dev_flush_queue(priv);
|
||||||
if (err)
|
if (err)
|
||||||
netdev_warn(netdev, "Cannot flush queue, error %d\n", err);
|
netdev_warn(netdev, "Cannot flush queue, error %d\n", err);
|
||||||
|
|
||||||
if (dev->ops->dev_reset_chip) {
|
if (ops->dev_reset_chip) {
|
||||||
err = dev->ops->dev_reset_chip(dev, priv->channel);
|
err = ops->dev_reset_chip(dev, priv->channel);
|
||||||
if (err)
|
if (err)
|
||||||
netdev_warn(netdev, "Cannot reset card, error %d\n",
|
netdev_warn(netdev, "Cannot reset card, error %d\n",
|
||||||
err);
|
err);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = dev->ops->dev_stop_chip(priv);
|
err = ops->dev_stop_chip(priv);
|
||||||
if (err)
|
if (err)
|
||||||
netdev_warn(netdev, "Cannot stop device, error %d\n", 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_net_priv *priv = netdev_priv(netdev);
|
||||||
struct kvaser_usb *dev = priv->dev;
|
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 net_device_stats *stats = &netdev->stats;
|
||||||
struct kvaser_usb_tx_urb_context *context = NULL;
|
struct kvaser_usb_tx_urb_context *context = NULL;
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
|
@ -563,8 +602,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
||||||
goto freeurb;
|
goto freeurb;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = dev->ops->dev_frame_to_cmd(priv, skb, &cmd_len,
|
buf = ops->dev_frame_to_cmd(priv, skb, &cmd_len, context->echo_index);
|
||||||
context->echo_index);
|
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
stats->tx_dropped++;
|
stats->tx_dropped++;
|
||||||
dev_kfree_skb(skb);
|
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,
|
static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel)
|
||||||
const struct usb_device_id *id, int channel)
|
|
||||||
{
|
{
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct kvaser_usb_net_priv *priv;
|
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;
|
int err;
|
||||||
|
|
||||||
if (dev->ops->dev_reset_chip) {
|
if (ops->dev_reset_chip) {
|
||||||
err = dev->ops->dev_reset_chip(dev, channel);
|
err = ops->dev_reset_chip(dev, channel);
|
||||||
if (err)
|
if (err)
|
||||||
return 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.state = CAN_STATE_STOPPED;
|
||||||
priv->can.clock.freq = dev->cfg->clock.freq;
|
priv->can.clock.freq = dev->cfg->clock.freq;
|
||||||
priv->can.bittiming_const = dev->cfg->bittiming_const;
|
priv->can.bittiming_const = dev->cfg->bittiming_const;
|
||||||
priv->can.do_set_bittiming = dev->ops->dev_set_bittiming;
|
priv->can.do_set_bittiming = ops->dev_set_bittiming;
|
||||||
priv->can.do_set_mode = dev->ops->dev_set_mode;
|
priv->can.do_set_mode = ops->dev_set_mode;
|
||||||
if ((id->driver_info & KVASER_USB_HAS_TXRX_ERRORS) ||
|
if ((driver_info->quirks & KVASER_USB_QUIRK_HAS_TXRX_ERRORS) ||
|
||||||
(priv->dev->card_data.capabilities & KVASER_USB_CAP_BERR_CAP))
|
(priv->dev->card_data.capabilities & KVASER_USB_CAP_BERR_CAP))
|
||||||
priv->can.do_get_berr_counter = dev->ops->dev_get_berr_counter;
|
priv->can.do_get_berr_counter = ops->dev_get_berr_counter;
|
||||||
if (id->driver_info & KVASER_USB_HAS_SILENT_MODE)
|
if (driver_info->quirks & KVASER_USB_QUIRK_HAS_SILENT_MODE)
|
||||||
priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
|
priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
|
||||||
|
|
||||||
priv->can.ctrlmode_supported |= dev->card_data.ctrlmode_supported;
|
priv->can.ctrlmode_supported |= dev->card_data.ctrlmode_supported;
|
||||||
|
|
||||||
if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) {
|
if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) {
|
||||||
priv->can.data_bittiming_const = dev->cfg->data_bittiming_const;
|
priv->can.data_bittiming_const = dev->cfg->data_bittiming_const;
|
||||||
priv->can.do_set_data_bittiming =
|
priv->can.do_set_data_bittiming = ops->dev_set_data_bittiming;
|
||||||
dev->ops->dev_set_data_bittiming;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev->flags |= IFF_ECHO;
|
netdev->flags |= IFF_ECHO;
|
||||||
|
@ -729,29 +767,22 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
||||||
struct kvaser_usb *dev;
|
struct kvaser_usb *dev;
|
||||||
int err;
|
int err;
|
||||||
int i;
|
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);
|
dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENOMEM;
|
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->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) {
|
if (err) {
|
||||||
dev_err(&intf->dev, "Cannot get usb endpoint(s)");
|
dev_err(&intf->dev, "Cannot get usb endpoint(s)");
|
||||||
return err;
|
return err;
|
||||||
|
@ -765,22 +796,22 @@ static int kvaser_usb_probe(struct usb_interface *intf,
|
||||||
|
|
||||||
dev->card_data.ctrlmode_supported = 0;
|
dev->card_data.ctrlmode_supported = 0;
|
||||||
dev->card_data.capabilities = 0;
|
dev->card_data.capabilities = 0;
|
||||||
err = dev->ops->dev_init_card(dev);
|
err = ops->dev_init_card(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&intf->dev,
|
dev_err(&intf->dev,
|
||||||
"Failed to initialize card, error %d\n", err);
|
"Failed to initialize card, error %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = dev->ops->dev_get_software_info(dev);
|
err = ops->dev_get_software_info(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&intf->dev,
|
dev_err(&intf->dev,
|
||||||
"Cannot get software info, error %d\n", err);
|
"Cannot get software info, error %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->ops->dev_get_software_details) {
|
if (ops->dev_get_software_details) {
|
||||||
err = dev->ops->dev_get_software_details(dev);
|
err = ops->dev_get_software_details(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&intf->dev,
|
dev_err(&intf->dev,
|
||||||
"Cannot get software details, error %d\n", err);
|
"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);
|
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) {
|
if (err) {
|
||||||
dev_err(&intf->dev, "Cannot get card info, error %d\n", err);
|
dev_err(&intf->dev, "Cannot get card info, error %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->ops->dev_get_capabilities) {
|
if (ops->dev_get_capabilities) {
|
||||||
err = dev->ops->dev_get_capabilities(dev);
|
err = ops->dev_get_capabilities(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&intf->dev,
|
dev_err(&intf->dev,
|
||||||
"Cannot get capabilities, error %d\n", err);
|
"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++) {
|
for (i = 0; i < dev->nchannels; i++) {
|
||||||
err = kvaser_usb_init_one(dev, id, i);
|
err = kvaser_usb_init_one(dev, i);
|
||||||
if (err) {
|
if (err) {
|
||||||
kvaser_usb_remove_interfaces(dev);
|
kvaser_usb_remove_interfaces(dev);
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -375,7 +375,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
|
||||||
.brp_inc = 1,
|
.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",
|
.name = "kvaser_usb_flex",
|
||||||
.tseg1_min = 4,
|
.tseg1_min = 4,
|
||||||
.tseg1_max = 16,
|
.tseg1_max = 16,
|
||||||
|
@ -2052,7 +2052,7 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = {
|
||||||
.freq = 24 * MEGA /* Hz */,
|
.freq = 24 * MEGA /* Hz */,
|
||||||
},
|
},
|
||||||
.timestamp_freq = 1,
|
.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 = {
|
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_RX_ERROR BIT(1)
|
||||||
#define USBCAN_ERROR_STATE_BUSERROR BIT(2)
|
#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 */
|
/* ctrl modes */
|
||||||
#define KVASER_CTRL_MODE_NORMAL 1
|
#define KVASER_CTRL_MODE_NORMAL 1
|
||||||
#define KVASER_CTRL_MODE_SILENT 2
|
#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 = {
|
static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = {
|
||||||
.name = "kvaser_usb",
|
.name = "kvaser_usb_ucii",
|
||||||
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
.tseg1_min = 4,
|
||||||
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
.tseg1_max = 16,
|
||||||
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
.tseg2_min = 2,
|
||||||
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
.tseg2_max = 8,
|
||||||
.sjw_max = KVASER_USB_SJW_MAX,
|
.sjw_max = 4,
|
||||||
.brp_min = KVASER_USB_BRP_MIN,
|
.brp_min = 1,
|
||||||
.brp_max = KVASER_USB_BRP_MAX,
|
.brp_max = 16,
|
||||||
.brp_inc = KVASER_USB_BRP_INC,
|
.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 = {
|
.clock = {
|
||||||
.freq = 8 * MEGA /* Hz */,
|
.freq = 8 * MEGA /* Hz */,
|
||||||
},
|
},
|
||||||
.timestamp_freq = 1,
|
.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 = {
|
.clock = {
|
||||||
.freq = 16 * MEGA /* Hz */,
|
.freq = 16 * MEGA /* Hz */,
|
||||||
},
|
},
|
||||||
.timestamp_freq = 1,
|
.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 = {
|
.clock = {
|
||||||
.freq = 24 * MEGA /* Hz */,
|
.freq = 24 * MEGA /* Hz */,
|
||||||
},
|
},
|
||||||
.timestamp_freq = 1,
|
.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 = {
|
.clock = {
|
||||||
.freq = 32 * MEGA /* Hz */,
|
.freq = 32 * MEGA /* Hz */,
|
||||||
},
|
},
|
||||||
.timestamp_freq = 1,
|
.timestamp_freq = 1,
|
||||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
.bittiming_const = &kvaser_usb_flexc_bittiming_const,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void *
|
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);
|
sizeof(struct kvaser_cmd_tx_can);
|
||||||
cmd->u.tx_can.channel = priv->channel;
|
cmd->u.tx_can.channel = priv->channel;
|
||||||
|
|
||||||
switch (dev->card_data.leaf.family) {
|
switch (dev->driver_info->family) {
|
||||||
case KVASER_LEAF:
|
case KVASER_LEAF:
|
||||||
cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;
|
cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;
|
||||||
break;
|
break;
|
||||||
|
@ -524,18 +534,25 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
|
||||||
dev->fw_version = le32_to_cpu(softinfo->fw_version);
|
dev->fw_version = le32_to_cpu(softinfo->fw_version);
|
||||||
dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
|
dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
|
||||||
|
|
||||||
|
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) {
|
switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
|
||||||
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
|
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
|
||||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
|
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_16mhz;
|
||||||
break;
|
break;
|
||||||
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
||||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz;
|
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_24mhz;
|
||||||
break;
|
break;
|
||||||
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
||||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz;
|
dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_32mhz;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
||||||
{
|
{
|
||||||
|
@ -550,7 +567,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
switch (dev->card_data.leaf.family) {
|
switch (dev->driver_info->family) {
|
||||||
case KVASER_LEAF:
|
case KVASER_LEAF:
|
||||||
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
|
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
|
||||||
break;
|
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->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version);
|
||||||
dev->max_tx_urbs =
|
dev->max_tx_urbs =
|
||||||
le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,7 +614,7 @@ static int kvaser_usb_leaf_get_card_info(struct kvaser_usb *dev)
|
||||||
|
|
||||||
dev->nchannels = cmd.u.cardinfo.nchannels;
|
dev->nchannels = cmd.u.cardinfo.nchannels;
|
||||||
if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES ||
|
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))
|
dev->nchannels > MAX_USBCAN_NET_DEVICES))
|
||||||
return -EINVAL;
|
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)
|
new_state < CAN_STATE_BUS_OFF)
|
||||||
priv->can.can_stats.restarts++;
|
priv->can.can_stats.restarts++;
|
||||||
|
|
||||||
switch (dev->card_data.leaf.family) {
|
switch (dev->driver_info->family) {
|
||||||
case KVASER_LEAF:
|
case KVASER_LEAF:
|
||||||
if (es->leaf.error_factor) {
|
if (es->leaf.error_factor) {
|
||||||
priv->can.can_stats.bus_error++;
|
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:
|
case KVASER_LEAF:
|
||||||
if (es->leaf.error_factor) {
|
if (es->leaf.error_factor) {
|
||||||
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT;
|
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;
|
stats = &priv->netdev->stats;
|
||||||
|
|
||||||
if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) &&
|
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)) {
|
cmd->id == CMD_LEAF_LOG_MESSAGE)) {
|
||||||
kvaser_usb_leaf_leaf_rx_error(dev, cmd);
|
kvaser_usb_leaf_leaf_rx_error(dev, cmd);
|
||||||
return;
|
return;
|
||||||
|
@ -1015,7 +1032,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (dev->card_data.leaf.family) {
|
switch (dev->driver_info->family) {
|
||||||
case KVASER_LEAF:
|
case KVASER_LEAF:
|
||||||
rx_data = cmd->u.leaf.rx_can.data;
|
rx_data = cmd->u.leaf.rx_can.data;
|
||||||
break;
|
break;
|
||||||
|
@ -1030,7 +1047,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id ==
|
if (dev->driver_info->family == KVASER_LEAF && cmd->id ==
|
||||||
CMD_LEAF_LOG_MESSAGE) {
|
CMD_LEAF_LOG_MESSAGE) {
|
||||||
cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id);
|
cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id);
|
||||||
if (cf->can_id & KVASER_EXTENDED_FRAME)
|
if (cf->can_id & KVASER_EXTENDED_FRAME)
|
||||||
|
@ -1128,14 +1145,14 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_LEAF_LOG_MESSAGE:
|
case CMD_LEAF_LOG_MESSAGE:
|
||||||
if (dev->card_data.leaf.family != KVASER_LEAF)
|
if (dev->driver_info->family != KVASER_LEAF)
|
||||||
goto warn;
|
goto warn;
|
||||||
kvaser_usb_leaf_rx_can_msg(dev, cmd);
|
kvaser_usb_leaf_rx_can_msg(dev, cmd);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_CHIP_STATE_EVENT:
|
case CMD_CHIP_STATE_EVENT:
|
||||||
case CMD_CAN_ERROR_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);
|
kvaser_usb_leaf_leaf_rx_error(dev, cmd);
|
||||||
else
|
else
|
||||||
kvaser_usb_leaf_usbcan_rx_error(dev, cmd);
|
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 */
|
/* Ignored commands */
|
||||||
case CMD_USBCAN_CLOCK_OVERFLOW_EVENT:
|
case CMD_USBCAN_CLOCK_OVERFLOW_EVENT:
|
||||||
if (dev->card_data.leaf.family != KVASER_USBCAN)
|
if (dev->driver_info->family != KVASER_USBCAN)
|
||||||
goto warn;
|
goto warn;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CMD_FLUSH_QUEUE_REPLY:
|
case CMD_FLUSH_QUEUE_REPLY:
|
||||||
if (dev->card_data.leaf.family != KVASER_LEAF)
|
if (dev->driver_info->family != KVASER_LEAF)
|
||||||
goto warn;
|
goto warn;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -258,7 +258,7 @@ static const struct can_bittiming_const xcan_bittiming_const_canfd2 = {
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 128,
|
.tseg2_max = 128,
|
||||||
.sjw_max = 128,
|
.sjw_max = 128,
|
||||||
.brp_min = 2,
|
.brp_min = 1,
|
||||||
.brp_max = 256,
|
.brp_max = 256,
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
@ -271,7 +271,7 @@ static const struct can_bittiming_const xcan_data_bittiming_const_canfd2 = {
|
||||||
.tseg2_min = 1,
|
.tseg2_min = 1,
|
||||||
.tseg2_max = 16,
|
.tseg2_max = 16,
|
||||||
.sjw_max = 16,
|
.sjw_max = 16,
|
||||||
.brp_min = 2,
|
.brp_min = 1,
|
||||||
.brp_max = 256,
|
.brp_max = 256,
|
||||||
.brp_inc = 1,
|
.brp_inc = 1,
|
||||||
};
|
};
|
||||||
|
|
|
@ -5981,6 +5981,15 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset)
|
||||||
release_sub_crqs(adapter, 0);
|
release_sub_crqs(adapter, 0);
|
||||||
rc = init_sub_crqs(adapter);
|
rc = init_sub_crqs(adapter);
|
||||||
} else {
|
} 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);
|
rc = reset_sub_crq_queues(adapter);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <net/tc_act/tc_mirred.h>
|
#include <net/tc_act/tc_mirred.h>
|
||||||
#include <net/udp_tunnel.h>
|
#include <net/udp_tunnel.h>
|
||||||
#include <net/xdp_sock.h>
|
#include <net/xdp_sock.h>
|
||||||
|
#include <linux/bitfield.h>
|
||||||
#include "i40e_type.h"
|
#include "i40e_type.h"
|
||||||
#include "i40e_prototype.h"
|
#include "i40e_prototype.h"
|
||||||
#include <linux/net/intel/i40e_client.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));
|
(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 */
|
/* needed by i40e_ethtool.c */
|
||||||
int i40e_up(struct i40e_vsi *vsi);
|
int i40e_up(struct i40e_vsi *vsi);
|
||||||
void i40e_down(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;
|
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
|
* i40e_stat_update48 - read and update a 48 bit stat from the chip
|
||||||
* @hw: ptr to the hardware info
|
* @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;
|
*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.
|
* i40e_update_eth_stats - Update VSI-specific ethernet statistics counters.
|
||||||
* @vsi: the VSI to be updated
|
* @vsi: the VSI to be updated
|
||||||
|
@ -680,6 +749,10 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)
|
||||||
I40E_GLV_BPTCL(stat_idx),
|
I40E_GLV_BPTCL(stat_idx),
|
||||||
vsi->stat_offsets_loaded,
|
vsi->stat_offsets_loaded,
|
||||||
&oes->tx_broadcast, &es->tx_broadcast);
|
&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;
|
vsi->stat_offsets_loaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -211,6 +211,11 @@
|
||||||
#define I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT 0
|
#define I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT 0
|
||||||
#define I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT 16
|
#define I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT 16
|
||||||
#define I40E_GLGEN_MSRWD_MDIRDDATA_MASK I40E_MASK(0xFFFF, I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT)
|
#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 0x000B8188 /* Reset: POR */
|
||||||
#define I40E_GLGEN_RSTAT_DEVSTATE_SHIFT 0
|
#define I40E_GLGEN_RSTAT_DEVSTATE_SHIFT 0
|
||||||
#define I40E_GLGEN_RSTAT_DEVSTATE_MASK I40E_MASK(0x3, I40E_GLGEN_RSTAT_DEVSTATE_SHIFT)
|
#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_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(_i, _VF) (0x00220000 + ((_i) * 1024 + (_VF) * 4)) /* _i=0...15, _VF=0...127 */ /* Reset: CORER */
|
||||||
#define I40E_VFQF_HLUT1_MAX_INDEX 15
|
#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_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_BPRCL(_i) (0x003005E0 + ((_i) * 8)) /* _i=0...3 */ /* Reset: CORER */
|
||||||
#define I40E_GLPRT_BPTCH(_i) (0x00300A04 + ((_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_broadcast; /* bptc */
|
||||||
u64 tx_discards; /* tdpc */
|
u64 tx_discards; /* tdpc */
|
||||||
u64 tx_errors; /* tepc */
|
u64 tx_errors; /* tepc */
|
||||||
|
u64 rx_discards_other; /* rxerr1 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Statistics collected per VEB per TC */
|
/* 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 */
|
/* VFs only use TC 0 */
|
||||||
vfres->vsi_res[0].qset_handle
|
vfres->vsi_res[0].qset_handle
|
||||||
= le16_to_cpu(vsi->info.qs_handle[0]);
|
= 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,
|
ether_addr_copy(vfres->vsi_res[0].default_mac_addr,
|
||||||
vf->default_lan_addr.addr);
|
vf->default_lan_addr.addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4529,13 +4529,6 @@ static int mlx5e_policer_validate(const struct flow_action *action,
|
||||||
return -EOPNOTSUPP;
|
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 &&
|
if (act->police.notexceed.act_id == FLOW_ACTION_ACCEPT &&
|
||||||
!flow_action_is_last_entry(action, act)) {
|
!flow_action_is_last_entry(action, act)) {
|
||||||
NL_SET_ERR_MSG_MOD(extack,
|
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) {
|
flow_action_for_each(i, act, flow_action) {
|
||||||
switch (act->id) {
|
switch (act->id) {
|
||||||
case FLOW_ACTION_POLICE:
|
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);
|
err = mlx5e_policer_validate(flow_action, act, extack);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -994,7 +994,7 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||||
struct fwnode_handle *ports, *portnp;
|
struct fwnode_handle *ports, *portnp;
|
||||||
struct lan966x *lan966x;
|
struct lan966x *lan966x;
|
||||||
u8 mac_addr[ETH_ALEN];
|
u8 mac_addr[ETH_ALEN];
|
||||||
int err, i;
|
int err;
|
||||||
|
|
||||||
lan966x = devm_kzalloc(&pdev->dev, sizeof(*lan966x), GFP_KERNEL);
|
lan966x = devm_kzalloc(&pdev->dev, sizeof(*lan966x), GFP_KERNEL);
|
||||||
if (!lan966x)
|
if (!lan966x)
|
||||||
|
@ -1025,11 +1025,7 @@ static int lan966x_probe(struct platform_device *pdev)
|
||||||
if (err)
|
if (err)
|
||||||
return dev_err_probe(&pdev->dev, err, "Reset failed");
|
return dev_err_probe(&pdev->dev, err, "Reset failed");
|
||||||
|
|
||||||
i = 0;
|
lan966x->num_phys_ports = NUM_PHYS_PORTS;
|
||||||
fwnode_for_each_available_child_node(ports, portnp)
|
|
||||||
++i;
|
|
||||||
|
|
||||||
lan966x->num_phys_ports = i;
|
|
||||||
lan966x->ports = devm_kcalloc(&pdev->dev, lan966x->num_phys_ports,
|
lan966x->ports = devm_kcalloc(&pdev->dev, lan966x->num_phys_ports,
|
||||||
sizeof(struct lan966x_port *),
|
sizeof(struct lan966x_port *),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
/* Reserved amount for (SRC, PRIO) at index 8*SRC + PRIO */
|
/* Reserved amount for (SRC, PRIO) at index 8*SRC + PRIO */
|
||||||
#define QSYS_Q_RSRV 95
|
#define QSYS_Q_RSRV 95
|
||||||
|
|
||||||
|
#define NUM_PHYS_PORTS 8
|
||||||
#define CPU_PORT 8
|
#define CPU_PORT 8
|
||||||
|
|
||||||
/* Reserved PGIDs */
|
/* 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,
|
static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
||||||
struct sk_buff *skb, u32 *opts)
|
struct sk_buff *skb, u32 *opts)
|
||||||
{
|
{
|
||||||
u32 transport_offset = (u32)skb_transport_offset(skb);
|
|
||||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||||
u32 mss = shinfo->gso_size;
|
u32 mss = shinfo->gso_size;
|
||||||
|
|
||||||
|
@ -4207,7 +4206,7 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
opts[0] |= transport_offset << GTTCPHO_SHIFT;
|
opts[0] |= skb_transport_offset(skb) << GTTCPHO_SHIFT;
|
||||||
opts[1] |= mss << TD1_MSS_SHIFT;
|
opts[1] |= mss << TD1_MSS_SHIFT;
|
||||||
} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||||
u8 ip_protocol;
|
u8 ip_protocol;
|
||||||
|
@ -4235,7 +4234,7 @@ static bool rtl8169_tso_csum_v2(struct rtl8169_private *tp,
|
||||||
else
|
else
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
|
|
||||||
opts[1] |= transport_offset << TCPHO_SHIFT;
|
opts[1] |= skb_transport_offset(skb) << TCPHO_SHIFT;
|
||||||
} else {
|
} else {
|
||||||
unsigned int padto = rtl_quirk_packet_padto(tp, skb);
|
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,
|
struct net_device *dev,
|
||||||
netdev_features_t features)
|
netdev_features_t features)
|
||||||
{
|
{
|
||||||
int transport_offset = skb_transport_offset(skb);
|
|
||||||
struct rtl8169_private *tp = netdev_priv(dev);
|
struct rtl8169_private *tp = netdev_priv(dev);
|
||||||
|
|
||||||
if (skb_is_gso(skb)) {
|
if (skb_is_gso(skb)) {
|
||||||
if (tp->mac_version == RTL_GIGA_MAC_VER_34)
|
if (tp->mac_version == RTL_GIGA_MAC_VER_34)
|
||||||
features = rtl8168evl_fix_tso(skb, features);
|
features = rtl8168evl_fix_tso(skb, features);
|
||||||
|
|
||||||
if (transport_offset > GTTCPHO_MAX &&
|
if (skb_transport_offset(skb) > GTTCPHO_MAX &&
|
||||||
rtl_chip_supports_csum_v2(tp))
|
rtl_chip_supports_csum_v2(tp))
|
||||||
features &= ~NETIF_F_ALL_TSO;
|
features &= ~NETIF_F_ALL_TSO;
|
||||||
} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
} 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))
|
if (rtl_quirk_packet_padto(tp, skb))
|
||||||
features &= ~NETIF_F_CSUM_MASK;
|
features &= ~NETIF_F_CSUM_MASK;
|
||||||
|
|
||||||
if (transport_offset > TCPHO_MAX &&
|
if (skb_transport_offset(skb) > TCPHO_MAX &&
|
||||||
rtl_chip_supports_csum_v2(tp))
|
rtl_chip_supports_csum_v2(tp))
|
||||||
features &= ~NETIF_F_CSUM_MASK;
|
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)) {
|
intf->altsetting->desc.bInterfaceNumber, 1)) {
|
||||||
dev_err(dev, "Can't set altsetting 1.\n");
|
dev_err(dev, "Can't set altsetting 1.\n");
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto fail_mem;;
|
goto fail_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
netdev = alloc_etherdev(sizeof(struct catc));
|
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,
|
int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
||||||
u16 value, u16 index, const void *data, u16 size)
|
u16 value, u16 index, const void *data, u16 size)
|
||||||
{
|
{
|
||||||
struct usb_ctrlrequest *req = NULL;
|
struct usb_ctrlrequest *req;
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
int err = -ENOMEM;
|
int err = -ENOMEM;
|
||||||
void *buf = NULL;
|
void *buf = NULL;
|
||||||
|
@ -2155,7 +2155,7 @@ int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
netdev_err(dev->net, "Error allocating buffer"
|
netdev_err(dev->net, "Error allocating buffer"
|
||||||
" in %s!\n", __func__);
|
" 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) {
|
if (err < 0) {
|
||||||
netdev_err(dev->net, "Error submitting the control"
|
netdev_err(dev->net, "Error submitting the control"
|
||||||
" message: status=%d\n", err);
|
" message: status=%d\n", err);
|
||||||
goto fail_free;
|
goto fail_free_all;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail_free_all:
|
||||||
|
kfree(req);
|
||||||
fail_free_buf:
|
fail_free_buf:
|
||||||
kfree(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);
|
usb_free_urb(urb);
|
||||||
fail:
|
fail:
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -152,6 +152,7 @@ enum flow_action_id {
|
||||||
FLOW_ACTION_PIPE,
|
FLOW_ACTION_PIPE,
|
||||||
FLOW_ACTION_VLAN_PUSH_ETH,
|
FLOW_ACTION_VLAN_PUSH_ETH,
|
||||||
FLOW_ACTION_VLAN_POP_ETH,
|
FLOW_ACTION_VLAN_POP_ETH,
|
||||||
|
FLOW_ACTION_CONTINUE,
|
||||||
NUM_FLOW_ACTIONS,
|
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);
|
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)
|
static bool __reg32_bound_s64(s32 a)
|
||||||
{
|
{
|
||||||
return a >= 0 && a <= S32_MAX;
|
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.
|
* so they do not impact tnum bounds calculation.
|
||||||
*/
|
*/
|
||||||
__mark_reg64_unbounded(reg);
|
__mark_reg64_unbounded(reg);
|
||||||
__update_reg_bounds(reg);
|
|
||||||
}
|
}
|
||||||
|
reg_bounds_sync(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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool __reg64_bound_s32(s64 a)
|
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)
|
static void __reg_combine_64_into_32(struct bpf_reg_state *reg)
|
||||||
{
|
{
|
||||||
__mark_reg32_unbounded(reg);
|
__mark_reg32_unbounded(reg);
|
||||||
|
|
||||||
if (__reg64_bound_s32(reg->smin_value) && __reg64_bound_s32(reg->smax_value)) {
|
if (__reg64_bound_s32(reg->smin_value) && __reg64_bound_s32(reg->smax_value)) {
|
||||||
reg->s32_min_value = (s32)reg->smin_value;
|
reg->s32_min_value = (s32)reg->smin_value;
|
||||||
reg->s32_max_value = (s32)reg->smax_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_min_value = (u32)reg->umin_value;
|
||||||
reg->u32_max_value = (u32)reg->umax_value;
|
reg->u32_max_value = (u32)reg->umax_value;
|
||||||
}
|
}
|
||||||
|
reg_bounds_sync(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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark a register as having a completely unknown (scalar) value. */
|
/* 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->s32_max_value = meta->msize_max_value;
|
||||||
ret_reg->smin_value = -MAX_ERRNO;
|
ret_reg->smin_value = -MAX_ERRNO;
|
||||||
ret_reg->s32_min_value = -MAX_ERRNO;
|
ret_reg->s32_min_value = -MAX_ERRNO;
|
||||||
__reg_deduce_bounds(ret_reg);
|
reg_bounds_sync(ret_reg);
|
||||||
__reg_bound_offset(ret_reg);
|
|
||||||
__update_reg_bounds(ret_reg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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))
|
if (!check_reg_sane_offset(env, dst_reg, ptr_reg->type))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
reg_bounds_sync(dst_reg);
|
||||||
__update_reg_bounds(dst_reg);
|
|
||||||
__reg_deduce_bounds(dst_reg);
|
|
||||||
__reg_bound_offset(dst_reg);
|
|
||||||
|
|
||||||
if (sanitize_check_bounds(env, insn, dst_reg) < 0)
|
if (sanitize_check_bounds(env, insn, dst_reg) < 0)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
if (sanitize_needed(opcode)) {
|
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 */
|
/* ALU32 ops are zero extended into 64bit register */
|
||||||
if (alu32)
|
if (alu32)
|
||||||
zext_32_to_64(dst_reg);
|
zext_32_to_64(dst_reg);
|
||||||
|
reg_bounds_sync(dst_reg);
|
||||||
__update_reg_bounds(dst_reg);
|
|
||||||
__reg_deduce_bounds(dst_reg);
|
|
||||||
__reg_bound_offset(dst_reg);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9136,10 +9126,7 @@ static int check_alu_op(struct bpf_verifier_env *env, struct bpf_insn *insn)
|
||||||
insn->dst_reg);
|
insn->dst_reg);
|
||||||
}
|
}
|
||||||
zext_32_to_64(dst_reg);
|
zext_32_to_64(dst_reg);
|
||||||
|
reg_bounds_sync(dst_reg);
|
||||||
__update_reg_bounds(dst_reg);
|
|
||||||
__reg_deduce_bounds(dst_reg);
|
|
||||||
__reg_bound_offset(dst_reg);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* case: R = imm
|
/* case: R = imm
|
||||||
|
@ -9577,13 +9564,8 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
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.
|
/* JEQ/JNE comparison doesn't change the register equivalence.
|
||||||
|
*
|
||||||
* r1 = r2;
|
* r1 = r2;
|
||||||
* if (r1 == 42) goto label;
|
* if (r1 == 42) goto label;
|
||||||
* ...
|
* ...
|
||||||
|
@ -9591,12 +9573,24 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg,
|
||||||
*
|
*
|
||||||
* Hence when marking register as known preserve it's ID.
|
* Hence when marking register as known preserve it's ID.
|
||||||
*/
|
*/
|
||||||
if (is_jmp32)
|
case BPF_JEQ:
|
||||||
__mark_reg32_known(reg, val32);
|
if (is_jmp32) {
|
||||||
else
|
__mark_reg32_known(true_reg, val32);
|
||||||
___mark_reg_known(reg, val);
|
true_32off = tnum_subreg(true_reg->var_off);
|
||||||
break;
|
} 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:
|
case BPF_JSET:
|
||||||
if (is_jmp32) {
|
if (is_jmp32) {
|
||||||
false_32off = tnum_and(false_32off, tnum_const(~val32));
|
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);
|
dst_reg->smax_value);
|
||||||
src_reg->var_off = dst_reg->var_off = tnum_intersect(src_reg->var_off,
|
src_reg->var_off = dst_reg->var_off = tnum_intersect(src_reg->var_off,
|
||||||
dst_reg->var_off);
|
dst_reg->var_off);
|
||||||
/* We might have learned new bounds from the var_off. */
|
reg_bounds_sync(src_reg);
|
||||||
__update_reg_bounds(src_reg);
|
reg_bounds_sync(dst_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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reg_combine_min_max(struct bpf_reg_state *true_src,
|
static void reg_combine_min_max(struct bpf_reg_state *true_src,
|
||||||
|
|
|
@ -571,6 +571,7 @@ int hci_dev_close(__u16 dev)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cancel_work_sync(&hdev->power_on);
|
||||||
if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF))
|
if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF))
|
||||||
cancel_delayed_work(&hdev->power_off);
|
cancel_delayed_work(&hdev->power_off);
|
||||||
|
|
||||||
|
@ -2675,6 +2676,8 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
||||||
list_del(&hdev->list);
|
list_del(&hdev->list);
|
||||||
write_unlock(&hci_dev_list_lock);
|
write_unlock(&hci_dev_list_lock);
|
||||||
|
|
||||||
|
cancel_work_sync(&hdev->power_on);
|
||||||
|
|
||||||
hci_cmd_sync_clear(hdev);
|
hci_cmd_sync_clear(hdev);
|
||||||
|
|
||||||
if (!test_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks))
|
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, "");
|
bt_dev_dbg(hdev, "");
|
||||||
|
|
||||||
cancel_work_sync(&hdev->power_on);
|
|
||||||
cancel_delayed_work(&hdev->power_off);
|
cancel_delayed_work(&hdev->power_off);
|
||||||
cancel_delayed_work(&hdev->ncmd_timer);
|
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 bcm_op {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
struct rcu_head rcu;
|
||||||
int ifindex;
|
int ifindex;
|
||||||
canid_t can_id;
|
canid_t can_id;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
@ -718,10 +719,9 @@ static struct bcm_op *bcm_find_op(struct list_head *ops,
|
||||||
return NULL;
|
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);
|
struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);
|
||||||
hrtimer_cancel(&op->thrtimer);
|
|
||||||
|
|
||||||
if ((op->frames) && (op->frames != &op->sframe))
|
if ((op->frames) && (op->frames != &op->sframe))
|
||||||
kfree(op->frames);
|
kfree(op->frames);
|
||||||
|
@ -732,6 +732,14 @@ static void bcm_remove_op(struct bcm_op *op)
|
||||||
kfree(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)
|
static void bcm_rx_unreg(struct net_device *dev, struct bcm_op *op)
|
||||||
{
|
{
|
||||||
if (op->rx_reg_dev == dev) {
|
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) &&
|
if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) &&
|
||||||
(op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) {
|
(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
|
* Don't care if we're bound or not (due to netdev
|
||||||
* problems) can_rx_unregister() is always a save
|
* 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);
|
bcm_rx_handler, op);
|
||||||
|
|
||||||
list_del(&op->list);
|
list_del(&op->list);
|
||||||
synchronize_rcu();
|
|
||||||
bcm_remove_op(op);
|
bcm_remove_op(op);
|
||||||
return 1; /* done */
|
return 1; /* done */
|
||||||
}
|
}
|
||||||
|
|
|
@ -1584,6 +1584,9 @@ mp_rst:
|
||||||
*ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
|
*ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
|
||||||
TCPOLEN_MPTCP_PRIO,
|
TCPOLEN_MPTCP_PRIO,
|
||||||
opts->backup, TCPOPT_NOP);
|
opts->backup, TCPOPT_NOP);
|
||||||
|
|
||||||
|
MPTCP_INC_STATS(sock_net((const struct sock *)tp),
|
||||||
|
MPTCP_MIB_MPPRIOTX);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_capable_done:
|
mp_capable_done:
|
||||||
|
|
|
@ -717,8 +717,9 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
|
||||||
struct mptcp_addr_info *addr,
|
struct mptcp_addr_info *addr,
|
||||||
|
struct mptcp_addr_info *rem,
|
||||||
u8 bkup)
|
u8 bkup)
|
||||||
{
|
{
|
||||||
struct mptcp_subflow_context *subflow;
|
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) {
|
mptcp_for_each_subflow(msk, subflow) {
|
||||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||||
struct sock *sk = (struct sock *)msk;
|
struct mptcp_addr_info local, remote;
|
||||||
struct mptcp_addr_info local;
|
bool slow;
|
||||||
|
|
||||||
local_address((struct sock_common *)ssk, &local);
|
local_address((struct sock_common *)ssk, &local);
|
||||||
if (!mptcp_addresses_equal(&local, addr, addr->port))
|
if (!mptcp_addresses_equal(&local, addr, addr->port))
|
||||||
continue;
|
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)
|
if (subflow->backup != bkup)
|
||||||
msk->last_snd = NULL;
|
msk->last_snd = NULL;
|
||||||
subflow->backup = bkup;
|
subflow->backup = bkup;
|
||||||
subflow->send_mp_prio = 1;
|
subflow->send_mp_prio = 1;
|
||||||
subflow->request_bkup = bkup;
|
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");
|
pr_debug("send ack for mp_prio");
|
||||||
mptcp_subflow_send_ack(ssk);
|
__mptcp_subflow_send_ack(ssk);
|
||||||
spin_lock_bh(&msk->pm.lock);
|
unlock_sock_fast(ssk, slow);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -801,6 +807,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
|
||||||
removed = true;
|
removed = true;
|
||||||
__MPTCP_INC_STATS(sock_net(sk), rm_type);
|
__MPTCP_INC_STATS(sock_net(sk), rm_type);
|
||||||
}
|
}
|
||||||
|
if (rm_type == MPTCP_MIB_RMSUBFLOW)
|
||||||
__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
|
__set_bit(rm_list->ids[i], msk->pm.id_avail_bitmap);
|
||||||
if (!removed)
|
if (!removed)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1816,8 +1823,10 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
|
||||||
|
|
||||||
list.ids[list.nr++] = addr->id;
|
list.ids[list.nr++] = addr->id;
|
||||||
|
|
||||||
|
spin_lock_bh(&msk->pm.lock);
|
||||||
mptcp_pm_nl_rm_subflow_received(msk, &list);
|
mptcp_pm_nl_rm_subflow_received(msk, &list);
|
||||||
mptcp_pm_create_subflow_or_signal_addr(msk);
|
mptcp_pm_create_subflow_or_signal_addr(msk);
|
||||||
|
spin_unlock_bh(&msk->pm.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mptcp_nl_set_flags(struct net *net,
|
static int mptcp_nl_set_flags(struct net *net,
|
||||||
|
@ -1835,12 +1844,10 @@ static int mptcp_nl_set_flags(struct net *net,
|
||||||
goto next;
|
goto next;
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
spin_lock_bh(&msk->pm.lock);
|
|
||||||
if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
|
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)
|
if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
|
||||||
mptcp_pm_nl_fullmesh(msk, addr);
|
mptcp_pm_nl_fullmesh(msk, addr);
|
||||||
spin_unlock_bh(&msk->pm.lock);
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
|
|
||||||
next:
|
next:
|
||||||
|
@ -1854,6 +1861,9 @@ next:
|
||||||
static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
|
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 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 nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
|
||||||
struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
|
struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
|
||||||
u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
|
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)
|
if (ret < 0)
|
||||||
return ret;
|
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)
|
if (addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
|
||||||
bkup = 1;
|
bkup = 1;
|
||||||
if (addr.addr.family == AF_UNSPEC) {
|
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;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (token)
|
||||||
|
return mptcp_userspace_pm_set_flags(sock_net(skb->sk),
|
||||||
|
token, &addr, &remote, bkup);
|
||||||
|
|
||||||
spin_lock_bh(&pernet->lock);
|
spin_lock_bh(&pernet->lock);
|
||||||
entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);
|
entry = __lookup_addr(pernet, &addr.addr, lookup_by_id);
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
|
#include "mib.h"
|
||||||
|
|
||||||
void mptcp_free_local_addr_list(struct mptcp_sock *msk)
|
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 *local,
|
||||||
const struct mptcp_addr_info *remote)
|
const struct mptcp_addr_info *remote)
|
||||||
{
|
{
|
||||||
struct sock *sk = &msk->sk.icsk_inet.sk;
|
|
||||||
struct mptcp_subflow_context *subflow;
|
struct mptcp_subflow_context *subflow;
|
||||||
struct sock *found = NULL;
|
|
||||||
|
|
||||||
if (local->family != remote->family)
|
if (local->family != remote->family)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
lock_sock(sk);
|
|
||||||
|
|
||||||
mptcp_for_each_subflow(msk, subflow) {
|
mptcp_for_each_subflow(msk, subflow) {
|
||||||
const struct inet_sock *issk;
|
const struct inet_sock *issk;
|
||||||
struct sock *ssk;
|
struct sock *ssk;
|
||||||
|
@ -347,16 +344,11 @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issk->inet_sport == local->port &&
|
if (issk->inet_sport == local->port &&
|
||||||
issk->inet_dport == remote->port) {
|
issk->inet_dport == remote->port)
|
||||||
found = ssk;
|
return ssk;
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
found:
|
return NULL;
|
||||||
release_sock(sk);
|
|
||||||
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info)
|
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;
|
sk = &msk->sk.icsk_inet.sk;
|
||||||
|
lock_sock(sk);
|
||||||
ssk = mptcp_nl_find_ssk(msk, &addr_l, &addr_r);
|
ssk = mptcp_nl_find_ssk(msk, &addr_l, &addr_r);
|
||||||
if (ssk) {
|
if (ssk) {
|
||||||
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
|
||||||
|
|
||||||
mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
|
mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
|
||||||
mptcp_close_ssk(sk, ssk, subflow);
|
mptcp_close_ssk(sk, ssk, subflow);
|
||||||
|
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
|
||||||
err = 0;
|
err = 0;
|
||||||
} else {
|
} else {
|
||||||
err = -ESRCH;
|
err = -ESRCH;
|
||||||
}
|
}
|
||||||
|
release_sock(sk);
|
||||||
|
|
||||||
destroy_err:
|
destroy_err:
|
||||||
sock_put((struct sock *)msk);
|
sock_put((struct sock *)msk);
|
||||||
return err;
|
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));
|
(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)
|
void mptcp_subflow_send_ack(struct sock *ssk)
|
||||||
{
|
{
|
||||||
bool slow;
|
bool slow;
|
||||||
|
|
||||||
slow = lock_sock_fast(ssk);
|
slow = lock_sock_fast(ssk);
|
||||||
if (tcp_can_send_ack(ssk))
|
__mptcp_subflow_send_ack(ssk);
|
||||||
tcp_send_ack(ssk);
|
|
||||||
unlock_sock_fast(ssk, slow);
|
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_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
|
||||||
void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
void mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
||||||
struct mptcp_subflow_context *subflow);
|
struct mptcp_subflow_context *subflow);
|
||||||
|
void __mptcp_subflow_send_ack(struct sock *ssk);
|
||||||
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_reset(struct sock *ssk);
|
||||||
void mptcp_subflow_queue_clean(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);
|
const struct mptcp_rm_list *rm_list);
|
||||||
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
|
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
|
||||||
void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
|
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,
|
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
|
||||||
const struct mptcp_pm_addr_entry *entry);
|
const struct mptcp_pm_addr_entry *entry);
|
||||||
void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
|
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,
|
int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk,
|
||||||
unsigned int id,
|
unsigned int id,
|
||||||
u8 *flags, int *ifindex);
|
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,
|
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
|
||||||
const struct mptcp_addr_info *addr,
|
const struct mptcp_addr_info *addr,
|
||||||
bool echo);
|
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 nft_data *data,
|
||||||
struct nlattr *attr)
|
struct nlattr *attr)
|
||||||
{
|
{
|
||||||
|
u32 dtype;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
|
err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
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);
|
nft_data_release(data, desc->type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2125,19 +2125,15 @@ out_scratch:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nft_pipapo_destroy() - Free private data for set and all committed elements
|
* nft_set_pipapo_match_destroy() - Destroy elements from key mapping array
|
||||||
* @set: nftables API set representation
|
* @set: nftables API set representation
|
||||||
|
* @m: matching data pointing to key mapping array
|
||||||
*/
|
*/
|
||||||
static void nft_pipapo_destroy(const struct nft_set *set)
|
static void nft_set_pipapo_match_destroy(const struct nft_set *set,
|
||||||
|
struct nft_pipapo_match *m)
|
||||||
{
|
{
|
||||||
struct nft_pipapo *priv = nft_set_priv(set);
|
|
||||||
struct nft_pipapo_match *m;
|
|
||||||
struct nft_pipapo_field *f;
|
struct nft_pipapo_field *f;
|
||||||
int i, r, cpu;
|
int i, r;
|
||||||
|
|
||||||
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 (i = 0, f = m->f; i < m->field_count - 1; i++, f++)
|
||||||
;
|
;
|
||||||
|
@ -2152,6 +2148,23 @@ static void nft_pipapo_destroy(const struct nft_set *set)
|
||||||
|
|
||||||
nft_set_elem_destroy(set, e, true);
|
nft_set_elem_destroy(set, e, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nft_pipapo_destroy() - Free private data for set and all committed elements
|
||||||
|
* @set: nftables API set representation
|
||||||
|
*/
|
||||||
|
static void nft_pipapo_destroy(const struct nft_set *set)
|
||||||
|
{
|
||||||
|
struct nft_pipapo *priv = nft_set_priv(set);
|
||||||
|
struct nft_pipapo_match *m;
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
m = rcu_dereference_protected(priv->match, true);
|
||||||
|
if (m) {
|
||||||
|
rcu_barrier();
|
||||||
|
|
||||||
|
nft_set_pipapo_match_destroy(set, m);
|
||||||
|
|
||||||
#ifdef NFT_PIPAPO_ALIGN
|
#ifdef NFT_PIPAPO_ALIGN
|
||||||
free_percpu(m->scratch_aligned);
|
free_percpu(m->scratch_aligned);
|
||||||
|
@ -2165,6 +2178,11 @@ static void nft_pipapo_destroy(const struct nft_set *set)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->clone) {
|
if (priv->clone) {
|
||||||
|
m = priv->clone;
|
||||||
|
|
||||||
|
if (priv->dirty)
|
||||||
|
nft_set_pipapo_match_destroy(set, m);
|
||||||
|
|
||||||
#ifdef NFT_PIPAPO_ALIGN
|
#ifdef NFT_PIPAPO_ALIGN
|
||||||
free_percpu(priv->clone->scratch_aligned);
|
free_percpu(priv->clone->scratch_aligned);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -227,8 +227,8 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh)
|
||||||
{
|
{
|
||||||
struct rose_neigh *s;
|
struct rose_neigh *s;
|
||||||
|
|
||||||
rose_stop_ftimer(rose_neigh);
|
del_timer_sync(&rose_neigh->ftimer);
|
||||||
rose_stop_t0timer(rose_neigh);
|
del_timer_sync(&rose_neigh->t0timer);
|
||||||
|
|
||||||
skb_queue_purge(&rose_neigh->queue);
|
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;
|
act_id = FLOW_ACTION_JUMP;
|
||||||
*extval = tc_act & TC_ACT_EXT_VAL_MASK;
|
*extval = tc_act & TC_ACT_EXT_VAL_MASK;
|
||||||
} else if (tc_act == TC_ACT_UNSPEC) {
|
} 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 {
|
} else {
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported conform/exceed action offload");
|
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;
|
darg->async = false;
|
||||||
|
|
||||||
if (ret == -EBADMSG)
|
|
||||||
TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSDECRYPTERROR);
|
|
||||||
|
|
||||||
return ret;
|
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);
|
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;
|
return err;
|
||||||
|
}
|
||||||
if (darg->async)
|
if (darg->async)
|
||||||
goto decrypt_next;
|
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++) {
|
for (i = 0; i < dma_map->dma_pages_cnt; i++) {
|
||||||
dma = &dma_map->dma_pages[i];
|
dma = &dma_map->dma_pages[i];
|
||||||
if (*dma) {
|
if (*dma) {
|
||||||
|
*dma &= ~XSK_NEXT_PG_CONTIG_MASK;
|
||||||
dma_unmap_page_attrs(dma_map->dev, *dma, PAGE_SIZE,
|
dma_unmap_page_attrs(dma_map->dev, *dma, PAGE_SIZE,
|
||||||
DMA_BIDIRECTIONAL, attrs);
|
DMA_BIDIRECTIONAL, attrs);
|
||||||
*dma = 0;
|
*dma = 0;
|
||||||
|
|
|
@ -25,12 +25,19 @@ static unsigned long nhit;
|
||||||
|
|
||||||
static char symbol[MAX_SYMBOL_LEN] = "kernel_clone";
|
static char symbol[MAX_SYMBOL_LEN] = "kernel_clone";
|
||||||
module_param_string(symbol, symbol, sizeof(symbol), 0644);
|
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] = "";
|
static char nosymbol[MAX_SYMBOL_LEN] = "";
|
||||||
module_param_string(nosymbol, nosymbol, sizeof(nosymbol), 0644);
|
module_param_string(nosymbol, nosymbol, sizeof(nosymbol), 0644);
|
||||||
|
MODULE_PARM_DESC(nosymbol, "Not-probed symbols, given by a wildcard pattern.");
|
||||||
|
|
||||||
static bool stackdump = true;
|
static bool stackdump = true;
|
||||||
module_param(stackdump, bool, 0644);
|
module_param(stackdump, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(stackdump, "Enable stackdump.");
|
||||||
|
|
||||||
static bool use_trace = false;
|
static bool use_trace = false;
|
||||||
module_param(use_trace, bool, 0644);
|
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)
|
static void show_backtrace(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -864,3 +864,24 @@
|
||||||
.result = ACCEPT,
|
.result = ACCEPT,
|
||||||
.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
|
.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,
|
.result = ACCEPT,
|
||||||
.retval = 3,
|
.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.
|
# FDB entry was installed.
|
||||||
bridge link set dev $br_port1 flood off
|
bridge link set dev $br_port1 flood off
|
||||||
|
|
||||||
|
ip link set $host1_if promisc on
|
||||||
tc qdisc add dev $host1_if ingress
|
tc qdisc add dev $host1_if ingress
|
||||||
tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \
|
tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \
|
||||||
flower dst_mac $mac action drop
|
flower dst_mac $mac action drop
|
||||||
|
@ -1250,7 +1251,7 @@ learning_test()
|
||||||
tc -j -s filter show dev $host1_if ingress \
|
tc -j -s filter show dev $host1_if ingress \
|
||||||
| jq -e ".[] | select(.options.handle == 101) \
|
| jq -e ".[] | select(.options.handle == 101) \
|
||||||
| select(.options.actions[0].stats.packets == 1)" &> /dev/null
|
| 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
|
$MZ $host1_if -c 1 -p 64 -a $mac -t ip -q
|
||||||
sleep 1
|
sleep 1
|
||||||
|
@ -1289,6 +1290,7 @@ learning_test()
|
||||||
|
|
||||||
tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower
|
tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower
|
||||||
tc qdisc del dev $host1_if ingress
|
tc qdisc del dev $host1_if ingress
|
||||||
|
ip link set $host1_if promisc off
|
||||||
|
|
||||||
bridge link set dev $br_port1 flood on
|
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
|
# Add an ACL on `host2_if` which will tell us whether the packet
|
||||||
# was flooded to it or not.
|
# was flooded to it or not.
|
||||||
|
ip link set $host2_if promisc on
|
||||||
tc qdisc add dev $host2_if ingress
|
tc qdisc add dev $host2_if ingress
|
||||||
tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \
|
tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \
|
||||||
flower dst_mac $mac action drop
|
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 filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower
|
||||||
tc qdisc del dev $host2_if ingress
|
tc qdisc del dev $host2_if ingress
|
||||||
|
ip link set $host2_if promisc off
|
||||||
|
|
||||||
return $err
|
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, "\tdsf lip <local-ip> lport <local-port> rip <remote-ip> rport <remote-port> token <token>\n");
|
||||||
fprintf(stderr, "\tdel <id> [<ip>]\n");
|
fprintf(stderr, "\tdel <id> [<ip>]\n");
|
||||||
fprintf(stderr, "\tget <id>\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, "\tflush\n");
|
||||||
fprintf(stderr, "\tdump\n");
|
fprintf(stderr, "\tdump\n");
|
||||||
fprintf(stderr, "\tlimits [<rcv addr max> <subflow max>]\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 rtattr *rta, *nest;
|
||||||
struct nlmsghdr *nh;
|
struct nlmsghdr *nh;
|
||||||
u_int32_t flags = 0;
|
u_int32_t flags = 0;
|
||||||
|
u_int32_t token = 0;
|
||||||
|
u_int16_t rport = 0;
|
||||||
u_int16_t family;
|
u_int16_t family;
|
||||||
|
void *rip = NULL;
|
||||||
int nest_start;
|
int nest_start;
|
||||||
int use_id = 0;
|
int use_id = 0;
|
||||||
u_int8_t id;
|
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");
|
error(1, 0, " missing flags keyword");
|
||||||
|
|
||||||
for (; arg < argc; arg++) {
|
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;
|
char *tok, *str;
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
|
@ -1378,12 +1387,72 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
|
||||||
rta->rta_len = RTA_LENGTH(2);
|
rta->rta_len = RTA_LENGTH(2);
|
||||||
memcpy(RTA_DATA(rta), &port, 2);
|
memcpy(RTA_DATA(rta), &port, 2);
|
||||||
off += NLMSG_ALIGN(rta->rta_len);
|
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 {
|
} else {
|
||||||
error(1, 0, "unknown keyword %s", argv[arg]);
|
error(1, 0, "unknown keyword %s", argv[arg]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nest->rta_len = off - nest_start;
|
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);
|
do_nl_req(fd, nh, off, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -770,10 +770,42 @@ test_subflows()
|
||||||
rm -f "$evts"
|
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
|
||||||
make_connection "v6"
|
make_connection "v6"
|
||||||
test_announce
|
test_announce
|
||||||
test_remove
|
test_remove
|
||||||
test_subflows
|
test_subflows
|
||||||
|
test_prio
|
||||||
|
|
||||||
exit 0
|
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 192.168.1.1/24
|
||||||
ip -netns "${PEER_NS}" addr add dev veth1 2001:db8::1/64 nodad
|
ip -netns "${PEER_NS}" addr add dev veth1 2001:db8::1/64 nodad
|
||||||
ip -netns "${PEER_NS}" link set dev veth1 up
|
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() {
|
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}" addr add dev veth1 2001:db8::1/64 nodad
|
||||||
ip -netns "${PEER_NS}" link set dev veth1 up
|
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 ${rx_args} -r &
|
||||||
ip netns exec "${PEER_NS}" ./udpgso_bench_rx -t ${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 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}" 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 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
|
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_V4$ns/24
|
||||||
ip -n $BASE$ns addr add dev veth$ns $BM_NET_V6$ns/64 nodad
|
ip -n $BASE$ns addr add dev veth$ns $BM_NET_V6$ns/64 nodad
|
||||||
done
|
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() {
|
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
|
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"
|
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 \
|
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 "
|
echo "fail - set operation successful ?!?" || echo " ok "
|
||||||
|
|
||||||
# the following tests will run with multiple channels active
|
# the following tests will run with multiple channels active
|
||||||
ip netns exec $NS_SRC ethtool -L veth$SRC rx 2
|
ip netns exec $NS_SRC ethtool -L veth$SRC rx 2
|
||||||
ip netns exec $NS_DST ethtool -L veth$DST 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 \
|
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"
|
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 &&\
|
ip netns exec $NS_DST ethtool -L veth$DST rx 1 2>/dev/null &&\
|
||||||
echo "fail - set operation successful ?!?" || echo " ok "
|
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
|
chk_channels "setting invalid channels nr" $DST 2 2
|
||||||
fi
|
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 "with xdp attached - gro flag" $DST on
|
||||||
chk_gro_flag " - peer gro flag" $SRC off
|
chk_gro_flag " - peer gro flag" $SRC off
|
||||||
chk_tso_flag " - tso flag" $SRC off
|
chk_tso_flag " - tso flag" $SRC off
|
||||||
|
|
|
@ -19,8 +19,6 @@ endif
|
||||||
MIRROR := https://download.wireguard.com/qemu-test/distfiles/
|
MIRROR := https://download.wireguard.com/qemu-test/distfiles/
|
||||||
|
|
||||||
KERNEL_BUILD_PATH := $(BUILD_PATH)/kernel$(if $(findstring yes,$(DEBUG_KERNEL)),-debug)
|
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
|
default: qemu
|
||||||
|
|
||||||
|
@ -109,20 +107,22 @@ CHOST := x86_64-linux-musl
|
||||||
QEMU_ARCH := x86_64
|
QEMU_ARCH := x86_64
|
||||||
KERNEL_ARCH := x86_64
|
KERNEL_ARCH := x86_64
|
||||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
||||||
|
QEMU_VPORT_RESULT := virtio-serial-device
|
||||||
ifeq ($(HOST_ARCH),$(ARCH))
|
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
|
else
|
||||||
QEMU_MACHINE := -cpu max -machine q35
|
QEMU_MACHINE := -cpu max -machine microvm -no-acpi
|
||||||
endif
|
endif
|
||||||
else ifeq ($(ARCH),i686)
|
else ifeq ($(ARCH),i686)
|
||||||
CHOST := i686-linux-musl
|
CHOST := i686-linux-musl
|
||||||
QEMU_ARCH := i386
|
QEMU_ARCH := i386
|
||||||
KERNEL_ARCH := x86
|
KERNEL_ARCH := x86
|
||||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
|
||||||
|
QEMU_VPORT_RESULT := virtio-serial-device
|
||||||
ifeq ($(subst x86_64,i686,$(HOST_ARCH)),$(ARCH))
|
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
|
else
|
||||||
QEMU_MACHINE := -cpu max -machine q35
|
QEMU_MACHINE := -cpu coreduo -machine microvm -no-acpi
|
||||||
endif
|
endif
|
||||||
else ifeq ($(ARCH),mips64)
|
else ifeq ($(ARCH),mips64)
|
||||||
CHOST := mips64-linux-musl
|
CHOST := mips64-linux-musl
|
||||||
|
@ -208,10 +208,11 @@ QEMU_ARCH := m68k
|
||||||
KERNEL_ARCH := m68k
|
KERNEL_ARCH := m68k
|
||||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
|
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
|
||||||
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config)
|
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config)
|
||||||
|
QEMU_VPORT_RESULT := virtio-serial-device
|
||||||
ifeq ($(HOST_ARCH),$(ARCH))
|
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
|
else
|
||||||
QEMU_MACHINE := -machine q800 -smp 1 -append $(KERNEL_CMDLINE)
|
QEMU_MACHINE := -machine virt -smp 1 -append $(KERNEL_CMDLINE)
|
||||||
endif
|
endif
|
||||||
else ifeq ($(ARCH),riscv64)
|
else ifeq ($(ARCH),riscv64)
|
||||||
CHOST := riscv64-linux-musl
|
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
|
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,)
|
$(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)
|
$(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
|
$(TOOLCHAIN_PATH)/$(CHOST)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config $(TOOLCHAIN_PATH)/.installed
|
||||||
rm -rf $(TOOLCHAIN_PATH)/$(CHOST)/include/linux
|
rm -rf $(TOOLCHAIN_PATH)/$(CHOST)/include/linux
|
||||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
CONFIG_VIRTIO_MENU=y
|
CONFIG_VIRTIO_MENU=y
|
||||||
CONFIG_VIRTIO_MMIO=y
|
CONFIG_VIRTIO_MMIO=y
|
||||||
CONFIG_VIRTIO_CONSOLE=y
|
CONFIG_VIRTIO_CONSOLE=y
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
||||||
CONFIG_FRAME_WARN=1024
|
CONFIG_FRAME_WARN=1024
|
||||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
CONFIG_VIRTIO_MENU=y
|
CONFIG_VIRTIO_MENU=y
|
||||||
CONFIG_VIRTIO_MMIO=y
|
CONFIG_VIRTIO_MMIO=y
|
||||||
CONFIG_VIRTIO_CONSOLE=y
|
CONFIG_VIRTIO_CONSOLE=y
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
CONFIG_CMDLINE="console=ttyAMA0 wg.success=vport0p1 panic_on_warn=1"
|
||||||
CONFIG_CPU_BIG_ENDIAN=y
|
CONFIG_CPU_BIG_ENDIAN=y
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
CONFIG_ACPI=y
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=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_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
|
CONFIG_FRAME_WARN=1024
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
CONFIG_VIRT=y
|
||||||
CONFIG_M68KCLASSIC=y
|
CONFIG_M68KCLASSIC=y
|
||||||
CONFIG_M68040=y
|
CONFIG_VIRTIO_CONSOLE=y
|
||||||
CONFIG_MAC=y
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_SERIAL_PMACZILOG=y
|
CONFIG_CMDLINE="console=ttyGF0 wg.success=vport0p1 panic_on_warn=1"
|
||||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
|
||||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
|
||||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
|
||||||
CONFIG_FRAME_WARN=1024
|
CONFIG_FRAME_WARN=1024
|
||||||
|
|
|
@ -6,6 +6,7 @@ CONFIG_POWER_RESET=y
|
||||||
CONFIG_POWER_RESET_SYSCON=y
|
CONFIG_POWER_RESET_SYSCON=y
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||||
CONFIG_FRAME_WARN=1024
|
CONFIG_FRAME_WARN=1024
|
||||||
|
|
|
@ -7,6 +7,7 @@ CONFIG_POWER_RESET=y
|
||||||
CONFIG_POWER_RESET_SYSCON=y
|
CONFIG_POWER_RESET_SYSCON=y
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
||||||
CONFIG_FRAME_WARN=1024
|
CONFIG_FRAME_WARN=1024
|
||||||
|
|
|
@ -4,6 +4,7 @@ CONFIG_PPC_85xx=y
|
||||||
CONFIG_PHYS_64BIT=y
|
CONFIG_PHYS_64BIT=y
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
CONFIG_MATH_EMULATION=y
|
CONFIG_MATH_EMULATION=y
|
||||||
CONFIG_CMDLINE_BOOL=y
|
CONFIG_CMDLINE_BOOL=y
|
||||||
CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1 panic_on_warn=1"
|
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=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=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_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
|
CONFIG_FRAME_WARN=1280
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <time.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -70,6 +71,15 @@ static void seed_rng(void)
|
||||||
close(fd);
|
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)
|
static void mount_filesystems(void)
|
||||||
{
|
{
|
||||||
pretty_message("[+] Mounting filesystems...");
|
pretty_message("[+] Mounting filesystems...");
|
||||||
|
@ -259,6 +269,7 @@ int main(int argc, char *argv[])
|
||||||
print_banner();
|
print_banner();
|
||||||
mount_filesystems();
|
mount_filesystems();
|
||||||
seed_rng();
|
seed_rng();
|
||||||
|
set_time();
|
||||||
kmod_selftests();
|
kmod_selftests();
|
||||||
enable_logging();
|
enable_logging();
|
||||||
clear_leaks();
|
clear_leaks();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue