aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic')
-rw-r--r--target/linux/generic/backport-5.4/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch30
-rw-r--r--target/linux/generic/backport-5.4/011-kbuild-export-SUBARCH.patch21
-rw-r--r--target/linux/generic/backport-5.4/025-power-reset-add-driver-for-LinkStation-power-off.patch199
-rw-r--r--target/linux/generic/backport-5.4/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch27
-rw-r--r--target/linux/generic/backport-5.4/030-modpost-add-a-helper-to-get-data-pointed-by-a-symbol.patch53
-rw-r--r--target/linux/generic/backport-5.4/031-modpost-refactor-namespace_from_kstrtabns-to-not-har.patch62
-rw-r--r--target/linux/generic/backport-5.4/041-v5.5-arm64-Implement-optimised-checksum-routine.patch176
-rw-r--r--target/linux/generic/backport-5.4/042-v5.5-arm64-csum-Fix-pathological-zero-length-calls.patch28
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch65
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch31
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch3078
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch1005
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch120
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch54
-rw-r--r--target/linux/generic/backport-5.4/071-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch387
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0001-crypto-lib-tidy-up-lib-crypto-Kconfig-and-Makefile.patch112
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0002-crypto-chacha-move-existing-library-code-into-lib-cr.patch668
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0003-crypto-x86-chacha-depend-on-generic-chacha-library-i.patch192
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0004-crypto-x86-chacha-expose-SIMD-ChaCha-routine-as-libr.patch205
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0005-crypto-arm64-chacha-depend-on-generic-chacha-library.patch129
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0006-crypto-arm64-chacha-expose-arm64-ChaCha-routine-as-l.patch138
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0007-crypto-arm-chacha-import-Eric-Biggers-s-scalar-accel.patch480
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0008-crypto-arm-chacha-remove-dependency-on-generic-ChaCh.patch691
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0009-crypto-arm-chacha-expose-ARM-ChaCha-routine-as-libra.patch108
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0010-crypto-mips-chacha-import-32r2-ChaCha-code-from-Zinc.patch451
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0011-crypto-mips-chacha-wire-up-accelerated-32r2-code-fro.patch559
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0012-crypto-chacha-unexport-chacha_generic-routines.patch115
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0013-crypto-poly1305-move-core-routines-into-a-separate-l.patch649
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0014-crypto-x86-poly1305-unify-Poly1305-state-struct-with.patch251
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0015-crypto-poly1305-expose-init-update-final-library-int.patch224
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0016-crypto-x86-poly1305-depend-on-generic-library-not-ge.patch217
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0017-crypto-x86-poly1305-expose-existing-driver-as-poly13.patch163
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0018-crypto-arm64-poly1305-incorporate-OpenSSL-CRYPTOGAMS.patch2083
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0019-crypto-arm-poly1305-incorporate-OpenSSL-CRYPTOGAMS-N.patch2776
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0020-crypto-mips-poly1305-incorporate-OpenSSL-CRYPTOGAMS-.patch1563
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0021-crypto-blake2s-generic-C-library-implementation-and-.patch1097
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0022-crypto-testmgr-add-test-cases-for-Blake2s.patch322
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0023-crypto-blake2s-implement-generic-shash-driver.patch245
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0024-crypto-blake2s-x86_64-SIMD-implementation.patch557
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0025-crypto-curve25519-generic-C-library-implementations.patch1849
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0026-crypto-curve25519-add-kpp-selftest.patch1268
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0027-crypto-curve25519-implement-generic-KPP-driver.patch136
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0028-crypto-lib-curve25519-work-around-Clang-stack-spilli.patch75
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0029-crypto-curve25519-x86_64-library-and-KPP-implementat.patch2536
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0030-crypto-arm-curve25519-import-Bernstein-and-Schwabe-s.patch2135
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0031-crypto-arm-curve25519-wire-up-NEON-implementation.patch1058
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0032-crypto-chacha20poly1305-import-construction-and-self.patch7677
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0033-crypto-lib-chacha20poly1305-reimplement-crypt_from_s.patch295
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0034-crypto-chacha_generic-remove-unnecessary-setkey-func.patch68
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0035-crypto-x86-chacha-only-unregister-algorithms-if-regi.patch31
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0036-crypto-lib-chacha20poly1305-use-chacha20_crypt.patch83
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0037-crypto-arch-conditionalize-crypto-api-in-arch-glue-f.patch275
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0038-crypto-chacha-fix-warning-message-in-header-file.patch35
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0039-crypto-arm-curve25519-add-arch-specific-key-generati.patch38
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0040-crypto-lib-curve25519-re-add-selftests.patch1387
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0041-crypto-poly1305-add-new-32-and-64-bit-generic-versio.patch1164
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0042-crypto-x86-poly1305-import-unmodified-cryptogams-imp.patch4183
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0043-crypto-x86-poly1305-wire-up-faster-implementations-f.patch2927
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0044-crypto-arm-arm64-mips-poly1305-remove-redundant-non-.patch171
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0045-crypto-curve25519-Fix-selftest-build-error.patch102
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0046-crypto-x86-poly1305-fix-.gitignore-typo.patch23
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0047-crypto-chacha20poly1305-add-back-missing-test-vector.patch1858
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0048-crypto-x86-poly1305-emit-does-base-conversion-itself.patch36
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0049-crypto-arm-chacha-fix-build-failured-when-kernel-mod.patch58
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0050-crypto-Kconfig-allow-tests-to-be-disabled-when-manag.patch40
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0051-crypto-chacha20poly1305-prevent-integer-overflow-on-.patch40
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0052-crypto-x86-curve25519-support-assemblers-with-no-adx.patch84
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0053-crypto-arm64-chacha-correctly-walk-through-blocks.patch68
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0054-crypto-x86-curve25519-replace-with-formally-verified.patch3765
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0055-crypto-x86-curve25519-leave-r12-as-spare-register.patch376
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0056-crypto-arm-64-poly1305-add-artifact-to-.gitignore-fi.patch35
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0057-crypto-arch-lib-limit-simd-usage-to-4k-chunks.patch243
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0058-crypto-lib-chacha20poly1305-Add-missing-function-dec.patch38
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0059-crypto-x86-chacha-sse3-use-unaligned-loads-for-state.patch147
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0060-crypto-x86-curve25519-Remove-unused-carry-variables.patch46
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0061-crypto-arm-curve25519-include-linux-scatterlist.h.patch36
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0062-crypto-arm-poly1305-Add-prototype-for-poly1305_block.patch33
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0063-crypto-curve25519-x86_64-Use-XORL-r32-32.patch261
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0064-crypto-poly1305-x86_64-Use-XORL-r32-32.patch59
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0065-crypto-x86-poly1305-Remove-assignments-with-no-effec.patch29
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0066-crypto-x86-poly1305-add-back-a-needed-assignment.patch33
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0067-crypto-Kconfig-CRYPTO_MANAGER_EXTRA_TESTS-requires-t.patch33
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0068-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch272
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0069-crypto-arm64-chacha-simplify-tail-block-handling.patch324
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0070-crypto-lib-chacha20poly1305-define-empty-module-exit.patch37
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0071-crypto-arm-chacha-neon-add-missing-counter-increment.patch38
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0072-net-WireGuard-secure-network-tunnel.patch8071
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0073-wireguard-selftests-import-harness-makefile-for-test.patch1078
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0074-wireguard-Kconfig-select-parent-dependency-for-crypt.patch30
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0075-wireguard-global-fix-spelling-mistakes-in-comments.patch66
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0076-wireguard-main-remove-unused-include-linux-version.h.patch28
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0077-wireguard-allowedips-use-kfree_rcu-instead-of-call_r.patch41
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0078-wireguard-selftests-remove-ancient-kernel-compatibil.patch373
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0079-wireguard-queueing-do-not-account-for-pfmemalloc-whe.patch39
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0080-wireguard-socket-mark-skbs-as-not-on-list-when-recei.patch34
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0081-wireguard-allowedips-fix-use-after-free-in-root_remo.patch164
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0082-wireguard-noise-reject-peers-with-low-order-public-k.patch233
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0083-wireguard-selftests-ensure-non-addition-of-peers-wit.patch34
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0084-wireguard-selftests-tie-socket-waiting-to-target-pid.patch77
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0085-wireguard-device-use-icmp_ndo_send-helper.patch64
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0086-wireguard-selftests-reduce-complexity-and-fix-make-r.patch104
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0087-wireguard-receive-reset-last_under_load-to-zero.patch38
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0088-wireguard-send-account-for-mtu-0-devices.patch95
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0089-wireguard-socket-remove-extra-call-to-synchronize_ne.patch32
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0090-wireguard-selftests-remove-duplicated-include-sys-ty.patch27
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0091-wireguard-queueing-account-for-skb-protocol-0.patch100
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0092-wireguard-receive-remove-dead-code-from-default-pack.patch35
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0093-wireguard-noise-error-out-precomputed-DH-during-hand.patch224
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0094-wireguard-send-remove-errant-newline-from-packet_enc.patch29
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0095-wireguard-queueing-cleanup-ptr_ring-in-error-path-of.patch35
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0096-wireguard-receive-use-tunnel-helpers-for-decapsulati.patch50
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0097-wireguard-selftests-use-normal-kernel-stack-size-on-.patch28
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0098-wireguard-socket-remove-errant-restriction-on-loopin.patch162
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0099-wireguard-send-receive-cond_resched-when-processing-.patch58
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0100-wireguard-selftests-initalize-ipv6-members-to-NULL-t.patch51
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0101-wireguard-send-receive-use-explicit-unlikely-branch-.patch88
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0102-wireguard-selftests-use-newer-iproute2-for-gcc-10.patch31
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0103-wireguard-noise-read-preshared-key-while-taking-lock.patch61
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0104-wireguard-queueing-preserve-flow-hash-across-packet-.patch116
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0105-wireguard-noise-separate-receive-counter-from-send-c.patch330
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0106-wireguard-noise-do-not-assign-initiation-time-in-if-.patch33
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0107-wireguard-device-avoid-circular-netns-references.patch296
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0108-wireguard-receive-account-for-napi_gro_receive-never.patch42
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0109-net-ip_tunnel-add-header_ops-for-layer-3-devices.patch58
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0110-wireguard-implement-header_ops-parse_protocol-for-AF.patch36
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0111-wireguard-queueing-make-use-of-ip_tunnel_parse_proto.patch68
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0112-netlink-consistently-use-NLA_POLICY_EXACT_LEN.patch49
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0113-netlink-consistently-use-NLA_POLICY_MIN_LEN.patch39
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0114-wireguard-noise-take-lock-when-removing-handshake-en.patch127
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0115-wireguard-peerlookup-take-lock-before-checking-hash-.patch62
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0116-wireguard-selftests-check-that-route_me_harder-packe.patch56
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0117-wireguard-avoid-double-unlikely-notation-when-using-.patch55
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0118-wireguard-socket-remove-bogus-__be32-annotation.patch52
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0119-wireguard-selftests-test-multiple-parallel-streams.patch52
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0120-wireguard-peer-put-frequently-used-members-above-cac.patch42
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0121-wireguard-device-do-not-generate-ICMP-for-non-IP-pac.patch47
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0122-wireguard-queueing-get-rid-of-per-peer-ring-buffers.patch560
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0123-wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch30
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0124-crypto-mips-poly1305-enable-for-all-MIPS-processors.patch60
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0125-crypto-mips-add-poly1305-core.S-to-.gitignore.patch24
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0126-crypto-poly1305-fix-poly1305_core_setkey-declaration.patch172
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0127-wireguard-selftests-remove-old-conntrack-kconfig-val.patch29
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0128-wireguard-selftests-make-sure-rp_filter-is-disabled-.patch31
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0129-wireguard-do-not-use-O3.patch33
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0130-wireguard-use-synchronize_net-rather-than-synchroniz.patch66
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0131-wireguard-peer-allocate-in-kmem_cache.patch125
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0132-wireguard-allowedips-initialize-list-head-in-selftes.patch43
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0133-wireguard-allowedips-remove-nodes-in-O-1.patch237
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0134-wireguard-allowedips-allocate-nodes-in-kmem_cache.patch173
-rw-r--r--target/linux/generic/backport-5.4/080-wireguard-0135-wireguard-allowedips-free-empty-intermediate-nodes-w.patch521
-rw-r--r--target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch134
-rw-r--r--target/linux/generic/backport-5.4/310-mips-Kconfig-Add-ARCH_HAS_FORTIFY_SOURCE.patch32
-rw-r--r--target/linux/generic/backport-5.4/310-v5.6-mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch54
-rw-r--r--target/linux/generic/backport-5.4/311-MIPS-Fix-exception-handler-memcpy.patch107
-rw-r--r--target/linux/generic/backport-5.4/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch99
-rw-r--r--target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch114
-rw-r--r--target/linux/generic/backport-5.4/371-netfilter-nf_flow_table-fix-up-ct-state-of-flows-aft.patch24
-rw-r--r--target/linux/generic/backport-5.4/393-v5.5-sch_cake-drop-unused-variable-tin_quantum_prio.patch158
-rw-r--r--target/linux/generic/backport-5.4/395-v5.8-net-sch_cake-Take-advantage-of-skb-hash-where-appropriate.patch170
-rw-r--r--target/linux/generic/backport-5.4/399-5.9-sch_cake-add-RFC-8622-LE-PHB-support-to-CAKE-diffser.patch57
-rw-r--r--target/linux/generic/backport-5.4/400-v5.8-dt-bindings-mtd-partition-Document-the-slc-mode-prop.patch28
-rw-r--r--target/linux/generic/backport-5.4/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch324
-rw-r--r--target/linux/generic/backport-5.4/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch115
-rw-r--r--target/linux/generic/backport-5.4/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch92
-rw-r--r--target/linux/generic/backport-5.4/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch648
-rw-r--r--target/linux/generic/backport-5.4/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch69
-rw-r--r--target/linux/generic/backport-5.4/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch34
-rw-r--r--target/linux/generic/backport-5.4/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch40
-rw-r--r--target/linux/generic/backport-5.4/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch28
-rw-r--r--target/linux/generic/backport-5.4/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch119
-rw-r--r--target/linux/generic/backport-5.4/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch98
-rw-r--r--target/linux/generic/backport-5.4/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch156
-rw-r--r--target/linux/generic/backport-5.4/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch54
-rw-r--r--target/linux/generic/backport-5.4/410-mtd-fix-calculating-partition-end-address.patch28
-rw-r--r--target/linux/generic/backport-5.4/500-v5.13-ubifs-default-to-zstd-compression.patch25
-rw-r--r--target/linux/generic/backport-5.4/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch88
-rw-r--r--target/linux/generic/backport-5.4/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch261
-rw-r--r--target/linux/generic/backport-5.4/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch177
-rw-r--r--target/linux/generic/backport-5.4/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch93
-rw-r--r--target/linux/generic/backport-5.4/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch53
-rw-r--r--target/linux/generic/backport-5.4/610-v5.9-net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch28
-rw-r--r--target/linux/generic/backport-5.4/700-v5.5-net-core-allow-fast-GRO-for-skbs-with-Ethernet-heade.patch78
-rw-r--r--target/linux/generic/backport-5.4/716-v5.5-net-sfp-move-fwnode-parsing-into-sfp-bus-layer.patch179
-rw-r--r--target/linux/generic/backport-5.4/717-v5.5-net-sfp-rework-upstream-interface.patch254
-rw-r--r--target/linux/generic/backport-5.4/718-v5.5-net-sfp-fix-sfp_bus_put-kernel-documentation.patch27
-rw-r--r--target/linux/generic/backport-5.4/719-v5.5-net-sfp-fix-sfp_bus_add_upstream-warning.patch27
-rw-r--r--target/linux/generic/backport-5.4/720-v5.5-net-sfp-move-sfp-sub-state-machines-into-separate-fu.patch124
-rw-r--r--target/linux/generic/backport-5.4/721-v5.5-net-sfp-move-tx-disable-on-device-down-to-main-state.patch41
-rw-r--r--target/linux/generic/backport-5.4/722-v5.5-net-sfp-rename-sfp_sm_ins_next-as-sfp_sm_mod_next.patch71
-rw-r--r--target/linux/generic/backport-5.4/723-v5.5-net-sfp-handle-module-remove-outside-state-machine.patch53
-rw-r--r--target/linux/generic/backport-5.4/724-v5.5-net-sfp-rename-T_PROBE_WAIT-to-T_SERIAL.patch51
-rw-r--r--target/linux/generic/backport-5.4/725-v5.5-net-sfp-parse-SFP-power-requirement-earlier.patch115
-rw-r--r--target/linux/generic/backport-5.4/726-v5.5-net-sfp-avoid-power-switch-on-address-change-modules.patch65
-rw-r--r--target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch52
-rw-r--r--target/linux/generic/backport-5.4/728-v5.5-net-sfp-split-the-PHY-probe-from-sfp_sm_mod_init.patch53
-rw-r--r--target/linux/generic/backport-5.4/729-v5.5-net-sfp-eliminate-mdelay-from-PHY-probe.patch130
-rw-r--r--target/linux/generic/backport-5.4/730-v5.5-net-sfp-allow-fault-processing-to-transition-to-othe.patch69
-rw-r--r--target/linux/generic/backport-5.4/731-v5.5-net-sfp-ensure-TX_FAULT-has-deasserted-before-probin.patch80
-rw-r--r--target/linux/generic/backport-5.4/732-v5.5-net-sfp-track-upstream-s-attachment-state-in-state-m.patch153
-rw-r--r--target/linux/generic/backport-5.4/733-v5.5-net-sfp-split-power-mode-switching-from-probe.patch184
-rw-r--r--target/linux/generic/backport-5.4/734-v5.5-net-sfp-move-module-insert-reporting-out-of-probe.patch159
-rw-r--r--target/linux/generic/backport-5.4/735-v5.5-net-sfp-allow-sfp-to-probe-slow-to-initialise-GPON-m.patch110
-rw-r--r--target/linux/generic/backport-5.4/736-v5.5-net-sfp-allow-modules-with-slow-diagnostics-to-probe.patch198
-rw-r--r--target/linux/generic/backport-5.4/737-v5.5-net-phy-add-core-phylib-sfp-support.patch183
-rw-r--r--target/linux/generic/backport-5.4/738-v5.5-net-phy-marvell10g-add-SFP-support.patch67
-rw-r--r--target/linux/generic/backport-5.4/739-v5.5-net-phylink-update-to-use-phy_support_asym_pause.patch43
-rw-r--r--target/linux/generic/backport-5.4/744-v5.5-net-sfp-soft-status-and-control-support.patch225
-rw-r--r--target/linux/generic/backport-5.4/745-v5.7-net-dsa-mt7530-add-support-for-port-mirroring.patch123
-rw-r--r--target/linux/generic/backport-5.4/746-v5.5-net-dsa-mv88e6xxx-Split-monitor-port-configuration.patch149
-rw-r--r--target/linux/generic/backport-5.4/747-v5.5-net-dsa-mv88e6xxx-Add-support-for-port-mirroring.patch266
-rw-r--r--target/linux/generic/backport-5.4/748-v5.5-net-dsa-mv88e6xxx-fix-broken-if-statement-because-of.patch30
-rw-r--r--target/linux/generic/backport-5.4/749-v5.5-net-dsa-mv88e6xxx-Fix-masking-of-egress-port.patch34
-rw-r--r--target/linux/generic/backport-5.4/750-v5.5-net-phy-add-support-for-clause-37-auto-negotiation.patch195
-rw-r--r--target/linux/generic/backport-5.4/751-v5.6-net-mvmdio-avoid-error-message-for-optional-IRQ.patch33
-rw-r--r--target/linux/generic/backport-5.4/752-v5.8-net-dsa-provide-an-option-for-drivers-to-always-rece.patch121
-rw-r--r--target/linux/generic/backport-5.4/753-v5.8-net-dsa-mt7530-fix-VLAN-setup.patch51
-rw-r--r--target/linux/generic/backport-5.4/756-v5.8-net-dsa-rtl8366-Pass-GENMASK-signed-bits.patch27
-rw-r--r--target/linux/generic/backport-5.4/757-v5.8-net-dsa-tag_rtl4_a-Implement-Realtek-4-byte-A-tag.patch232
-rw-r--r--target/linux/generic/backport-5.4/758-v5.8-net-dsa-rtl8366rb-Support-the-CPU-DSA-tag.patch100
-rw-r--r--target/linux/generic/backport-5.4/760-net-ethernet-mediatek-Integrate-GDM-PSE-setup-operat.patch80
-rw-r--r--target/linux/generic/backport-5.4/761-net-ethernet-mediatek-Refine-the-timing-of-GDM-PSE-s.patch45
-rw-r--r--target/linux/generic/backport-5.4/762-net-ethernet-mediatek-Enable-GDM-GDMA_DROP_ALL-mode.patch33
-rw-r--r--target/linux/generic/backport-5.4/765-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch85
-rw-r--r--target/linux/generic/backport-5.4/770-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch126
-rw-r--r--target/linux/generic/backport-5.4/771-mdio-bus-add-generic-find-bus.patch67
-rw-r--r--target/linux/generic/backport-5.4/771-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch52
-rw-r--r--target/linux/generic/backport-5.4/772-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch226
-rw-r--r--target/linux/generic/backport-5.4/773-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch85
-rw-r--r--target/linux/generic/backport-5.4/774-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch42
-rw-r--r--target/linux/generic/backport-5.4/775-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch263
-rw-r--r--target/linux/generic/backport-5.4/780-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch84
-rw-r--r--target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch1875
-rw-r--r--target/linux/generic/backport-5.4/782-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch77
-rw-r--r--target/linux/generic/backport-5.4/790-net-phy-at803x-select-correct-page-on-config-init.patch104
-rw-r--r--target/linux/generic/backport-5.4/791-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch41
-rw-r--r--target/linux/generic/backport-5.4/800-v5.5-iio-imu-Add-support-for-the-FXOS8700-IMU.patch893
-rw-r--r--target/linux/generic/backport-5.4/800-v5.5-scsi-core-Add-sysfs-attributes-for-VPD-pages-0h-and-.patch122
-rw-r--r--target/linux/generic/backport-5.4/801-v5.5-hwmon-Driver-for-disk-and-solid-state-drives-with-te.patch737
-rw-r--r--target/linux/generic/backport-5.4/801-v5.6-leds-populate-the-device-s-of_node.patch36
-rw-r--r--target/linux/generic/backport-5.4/803-v5.8-i2c-pxa-use-official-address-byte-helper.patch59
-rw-r--r--target/linux/generic/backport-5.4/804-v5.8-i2c-pxa-remove-unneeded-includes.patch37
-rw-r--r--target/linux/generic/backport-5.4/805-v5.8-i2c-pxa-re-arrange-includes-to-be-in-alphabetical-or.patch52
-rw-r--r--target/linux/generic/backport-5.4/806-v5.8-i2c-pxa-re-arrange-functions-to-flow-better.patch380
-rw-r--r--target/linux/generic/backport-5.4/807-v5.8-i2c-pxa-re-arrange-register-field-definitions.patch161
-rw-r--r--target/linux/generic/backport-5.4/808-v5.8-i2c-pxa-add-and-use-definitions-for-IBMR-register.patch66
-rw-r--r--target/linux/generic/backport-5.4/809-v5.8-i2c-pxa-always-set-fm-and-hs-members-for-each-type.patch66
-rw-r--r--target/linux/generic/backport-5.4/810-v5.8-i2c-pxa-move-private-definitions-to-i2c-pxa.c.patch128
-rw-r--r--target/linux/generic/backport-5.4/811-v5.8-i2c-pxa-move-DT-IDs-along-side-platform-IDs.patch50
-rw-r--r--target/linux/generic/backport-5.4/813-v5.8-i2c-pxa-clean-up-decode_bits.patch53
-rw-r--r--target/linux/generic/backport-5.4/814-v5.8-i2c-pxa-fix-i2c_pxa_wait_bus_not_busy-boundary-condi.patch53
-rw-r--r--target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch91
-rw-r--r--target/linux/generic/backport-5.4/816-v5.8-i2c-pxa-avoid-complaints-with-non-responsive-slaves.patch67
-rw-r--r--target/linux/generic/backport-5.4/817-v5.8-i2c-pxa-ensure-timeout-messages-are-unique.patch45
-rw-r--r--target/linux/generic/backport-5.4/818-v5.8-i2c-pxa-remove-some-unnecessary-debug.patch34
-rw-r--r--target/linux/generic/backport-5.4/820-v5.8-i2c-pxa-use-master-abort-for-device-probes.patch35
-rw-r--r--target/linux/generic/backport-5.4/821-v5.8-i2c-pxa-implement-generic-i2c-bus-recovery.patch285
-rw-r--r--target/linux/generic/backport-5.4/825-v5.8-spi-rb4xx-null-pointer-bug-fix.patch48
-rw-r--r--target/linux/generic/backport-5.4/826-v5.8-spi-rb4xx-update-driver-to-be-device-tree-aware.patch60
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch80
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch90
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch80
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch37
-rw-r--r--target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch70
-rw-r--r--target/linux/generic/backport-5.4/850-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch88
-rw-r--r--target/linux/generic/backport-5.4/851-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch31
-rw-r--r--target/linux/generic/backport-5.4/852-v5.10-0001-net-sfp-VSOL-V2801F-CarlitoxxPro-CPGOS03-0490-v2.0-w.patch144
-rw-r--r--target/linux/generic/backport-5.4/852-v5.10-0002-net-sfp-add-workaround-for-Realtek-RTL8672-and-RTL96.patch211
-rw-r--r--target/linux/generic/backport-5.4/900-v5.9-0001-dt-bindings-Add-multicolor-class-dt-bindings-documen.patch76
-rw-r--r--target/linux/generic/backport-5.4/900-v5.9-0002-leds-Add-multicolor-ID-to-the-color-ID-list.patch29
-rw-r--r--target/linux/generic/backport-5.4/900-v5.9-0003-leds-add-RGB-color-option-as-that-is-different-from-.patch48
-rw-r--r--target/linux/generic/config-5.46603
-rw-r--r--target/linux/generic/hack-5.4/204-module_strip.patch220
-rw-r--r--target/linux/generic/hack-5.4/205-kconfig-exit.patch11
-rw-r--r--target/linux/generic/hack-5.4/210-darwin_scripts_include.patch3053
-rw-r--r--target/linux/generic/hack-5.4/211-darwin-uuid-typedef-clash.patch22
-rw-r--r--target/linux/generic/hack-5.4/212-tools_portability.patch110
-rw-r--r--target/linux/generic/hack-5.4/214-spidev_h_portability.patch24
-rw-r--r--target/linux/generic/hack-5.4/220-arm-gc_sections.patch138
-rw-r--r--target/linux/generic/hack-5.4/221-module_exports.patch109
-rw-r--r--target/linux/generic/hack-5.4/230-openwrt_lzma_options.patch71
-rw-r--r--target/linux/generic/hack-5.4/249-udp-tunnel-selection.patch11
-rw-r--r--target/linux/generic/hack-5.4/250-netfilter_depends.patch27
-rw-r--r--target/linux/generic/hack-5.4/251-sound_kconfig.patch199
-rw-r--r--target/linux/generic/hack-5.4/259-regmap_dynamic.patch125
-rw-r--r--target/linux/generic/hack-5.4/260-crypto_test_dependencies.patch52
-rw-r--r--target/linux/generic/hack-5.4/260-lib-arc4-unhide.patch15
-rw-r--r--target/linux/generic/hack-5.4/280-rfkill-stubs.patch84
-rw-r--r--target/linux/generic/hack-5.4/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch64
-rw-r--r--target/linux/generic/hack-5.4/301-mips_image_cmdline_hack.patch38
-rw-r--r--target/linux/generic/hack-5.4/321-powerpc_crtsavres_prereq.patch39
-rw-r--r--target/linux/generic/hack-5.4/400-block-fit-partition-parser.patch176
-rw-r--r--target/linux/generic/hack-5.4/400-unlock_mx25l6406e_with_4bit_block_protect.patch69
-rw-r--r--target/linux/generic/hack-5.4/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch120
-rw-r--r--target/linux/generic/hack-5.4/531-debloat_lzma.patch1040
-rw-r--r--target/linux/generic/hack-5.4/550-loop-Report-EOPNOTSUPP-properly.patch41
-rw-r--r--target/linux/generic/hack-5.4/645-netfilter-connmark-introduce-set-dscpmark.patch212
-rw-r--r--target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch70
-rw-r--r--target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch589
-rw-r--r--target/linux/generic/hack-5.4/651-wireless_mesh_header.patch24
-rw-r--r--target/linux/generic/hack-5.4/660-fq_codel_defaults.patch27
-rw-r--r--target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch100
-rw-r--r--target/linux/generic/hack-5.4/662-remove_pfifo_fast.patch243
-rw-r--r--target/linux/generic/hack-5.4/700-swconfig_switch_drivers.patch130
-rw-r--r--target/linux/generic/hack-5.4/703-add_vsc8504_support.patch57
-rw-r--r--target/linux/generic/hack-5.4/710-net-dsa-mv88e6xxx-default-VID-1.patch18
-rw-r--r--target/linux/generic/hack-5.4/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch12
-rw-r--r--target/linux/generic/hack-5.4/721-phy_packets.patch176
-rw-r--r--target/linux/generic/hack-5.4/760-net-usb-r8152-add-LED-configuration-from-OF.patch74
-rw-r--r--target/linux/generic/hack-5.4/761-dt-bindings-net-add-RTL8152-binding-documentation.patch54
-rw-r--r--target/linux/generic/hack-5.4/773-bgmac-add-srab-switch.patch98
-rw-r--r--target/linux/generic/hack-5.4/901-debloat_sock_diag.patch145
-rw-r--r--target/linux/generic/hack-5.4/902-debloat_proc.patch408
-rw-r--r--target/linux/generic/hack-5.4/904-debloat_dma_buf.patch74
-rw-r--r--target/linux/generic/hack-5.4/910-kobject_uevent.patch32
-rw-r--r--target/linux/generic/hack-5.4/911-kobject_add_broadcast_uevent.patch76
-rw-r--r--target/linux/generic/hack-5.4/920-device_tree_cmdline.patch12
-rw-r--r--target/linux/generic/hack-5.4/921-always-create-console-node-in-initramfs.patch40
-rw-r--r--target/linux/generic/pending-5.4/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch26
-rw-r--r--target/linux/generic/pending-5.4/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch57
-rw-r--r--target/linux/generic/pending-5.4/103-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch37
-rw-r--r--target/linux/generic/pending-5.4/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch82
-rw-r--r--target/linux/generic/pending-5.4/130-add-linux-spidev-compatible-si3210.patch18
-rw-r--r--target/linux/generic/pending-5.4/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch62
-rw-r--r--target/linux/generic/pending-5.4/141-jffs2-add-RENAME_EXCHANGE-support.patch73
-rw-r--r--target/linux/generic/pending-5.4/150-bridge_allow_receiption_on_disabled_port.patch45
-rw-r--r--target/linux/generic/pending-5.4/180-net-phy-at803x-add-support-for-AT8032.patch63
-rw-r--r--target/linux/generic/pending-5.4/190-rtc-rs5c372-support_alarms_up_to_1_week.patch94
-rw-r--r--target/linux/generic/pending-5.4/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch70
-rw-r--r--target/linux/generic/pending-5.4/201-extra_optimization.patch31
-rw-r--r--target/linux/generic/pending-5.4/203-kallsyms_uncompressed.patch119
-rw-r--r--target/linux/generic/pending-5.4/205-backtrace_module_info.patch41
-rw-r--r--target/linux/generic/pending-5.4/240-remove-unsane-filenames-from-deps_initramfs-list.patch47
-rw-r--r--target/linux/generic/pending-5.4/261-enable_wilink_platform_without_drivers.patch20
-rw-r--r--target/linux/generic/pending-5.4/270-platform-mikrotik-build-bits.patch31
-rw-r--r--target/linux/generic/pending-5.4/300-mips_expose_boot_raw.patch40
-rw-r--r--target/linux/generic/pending-5.4/302-mips_no_branch_likely.patch22
-rw-r--r--target/linux/generic/pending-5.4/305-mips_module_reloc.patch371
-rw-r--r--target/linux/generic/pending-5.4/307-mips_highmem_offset.patch19
-rw-r--r--target/linux/generic/pending-5.4/308-mips32r2_tune.patch22
-rw-r--r--target/linux/generic/pending-5.4/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch142
-rw-r--r--target/linux/generic/pending-5.4/310-arm_module_unresolved_weak_sym.patch22
-rw-r--r--target/linux/generic/pending-5.4/311-MIPS-zboot-put-appended-dtb-into-a-section.patch36
-rw-r--r--target/linux/generic/pending-5.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch281
-rw-r--r--target/linux/generic/pending-5.4/332-arc-add-OWRTDTB-section.patch84
-rw-r--r--target/linux/generic/pending-5.4/333-arc-enable-unaligned-access-in-kernel-mode.patch24
-rw-r--r--target/linux/generic/pending-5.4/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch25
-rw-r--r--target/linux/generic/pending-5.4/400-mtd-add-rootfs-split-support.patch107
-rw-r--r--target/linux/generic/pending-5.4/401-mtd-add-support-for-different-partition-parser-types.patch142
-rw-r--r--target/linux/generic/pending-5.4/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch44
-rw-r--r--target/linux/generic/pending-5.4/403-mtd-hook-mtdsplit-to-Kbuild.patch32
-rw-r--r--target/linux/generic/pending-5.4/404-mtd-add-more-helper-functions.patch76
-rw-r--r--target/linux/generic/pending-5.4/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch76
-rw-r--r--target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch130
-rw-r--r--target/linux/generic/pending-5.4/412-mtd-partial_eraseblock_unlock.patch40
-rw-r--r--target/linux/generic/pending-5.4/419-mtd-redboot-add-of_match_table-with-DT-binding.patch22
-rw-r--r--target/linux/generic/pending-5.4/420-mtd-redboot_space.patch41
-rw-r--r--target/linux/generic/pending-5.4/430-mtd-add-myloader-partition-parser.patch229
-rw-r--r--target/linux/generic/pending-5.4/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch68
-rw-r--r--target/linux/generic/pending-5.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch37
-rw-r--r--target/linux/generic/pending-5.4/435-mtd-add-routerbootpart-parser-config.patch38
-rw-r--r--target/linux/generic/pending-5.4/447-mtd-spinand-gigadevice-Add-support-for-GD5F4GQ4xC.patch87
-rw-r--r--target/linux/generic/pending-5.4/450-mtd-spi-nor-allow-NOR-driver-to-write-fewer-bytes-th.patch22
-rw-r--r--target/linux/generic/pending-5.4/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch25
-rw-r--r--target/linux/generic/pending-5.4/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch17
-rw-r--r--target/linux/generic/pending-5.4/465-m25p80-mx-disable-software-protection.patch18
-rw-r--r--target/linux/generic/pending-5.4/466-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch35
-rw-r--r--target/linux/generic/pending-5.4/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch79
-rw-r--r--target/linux/generic/pending-5.4/476-mtd-spi-nor-add-eon-en25q128.patch18
-rw-r--r--target/linux/generic/pending-5.4/479-mtd-spi-nor-add-xtx-xt25f128b.patch42
-rw-r--r--target/linux/generic/pending-5.4/480-mtd-set-rootfs-to-be-root-dev.patch38
-rw-r--r--target/linux/generic/pending-5.4/481-mtd-spi-nor-rework-broken-flash-reset-support.patch167
-rw-r--r--target/linux/generic/pending-5.4/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch24
-rw-r--r--target/linux/generic/pending-5.4/482-mtd-spi-nor-fix-4-byte-opcode-support-for-w25q256.patch60
-rw-r--r--target/linux/generic/pending-5.4/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch195
-rw-r--r--target/linux/generic/pending-5.4/484-mtd-spi-nor-add-esmt-f25l16pa.patch10
-rw-r--r--target/linux/generic/pending-5.4/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch97
-rw-r--r--target/linux/generic/pending-5.4/491-ubi-auto-create-ubiblock-device-for-rootfs.patch69
-rw-r--r--target/linux/generic/pending-5.4/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch53
-rw-r--r--target/linux/generic/pending-5.4/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch34
-rw-r--r--target/linux/generic/pending-5.4/494-mtd-ubi-add-EOF-marker-support.patch60
-rw-r--r--target/linux/generic/pending-5.4/495-mtd-core-add-get_mtd_device_by_node.patch75
-rw-r--r--target/linux/generic/pending-5.4/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch52
-rw-r--r--target/linux/generic/pending-5.4/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch216
-rw-r--r--target/linux/generic/pending-5.4/498-mtd-mtdconcat-select-readwrite-function.patch24
-rw-r--r--target/linux/generic/pending-5.4/530-jffs2_make_lzma_available.patch5180
-rw-r--r--target/linux/generic/pending-5.4/532-jffs2_eofdetect.patch65
-rw-r--r--target/linux/generic/pending-5.4/600-netfilter_conntrack_flush.patch88
-rw-r--r--target/linux/generic/pending-5.4/610-netfilter_match_bypass_default_checks.patch110
-rw-r--r--target/linux/generic/pending-5.4/611-netfilter_match_bypass_default_table.patch106
-rw-r--r--target/linux/generic/pending-5.4/612-netfilter_match_reduce_memory_access.patch22
-rw-r--r--target/linux/generic/pending-5.4/613-netfilter_optional_tcp_window_check.patch73
-rw-r--r--target/linux/generic/pending-5.4/620-net_sched-codel-do-not-defer-queue-length-update.patch86
-rw-r--r--target/linux/generic/pending-5.4/630-packet_socket_type.patch138
-rw-r--r--target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch564
-rw-r--r--target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch306
-rw-r--r--target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch61
-rw-r--r--target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch61
-rw-r--r--target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch125
-rw-r--r--target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch37
-rw-r--r--target/linux/generic/pending-5.4/646-netfilter-nf_flow_table-rework-private-driver-data.patch25
-rw-r--r--target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch78
-rw-r--r--target/linux/generic/pending-5.4/655-increase_skb_pad.patch20
-rw-r--r--target/linux/generic/pending-5.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch501
-rw-r--r--target/linux/generic/pending-5.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch263
-rw-r--r--target/linux/generic/pending-5.4/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch50
-rw-r--r--target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch149
-rw-r--r--target/linux/generic/pending-5.4/682-of_net-add-mac-address-increment-support.patch89
-rw-r--r--target/linux/generic/pending-5.4/683-of_net-add-mac-address-to-of-tree.patch38
-rw-r--r--target/linux/generic/pending-5.4/703-phy-add-detach-callback-to-struct-phy_driver.patch38
-rw-r--r--target/linux/generic/pending-5.4/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch177
-rw-r--r--target/linux/generic/pending-5.4/730-net-phy-at803x-fix-feature-detection.patch66
-rw-r--r--target/linux/generic/pending-5.4/739-net-avoid-tx-fault-with-Nokia-GPON-module.patch108
-rw-r--r--target/linux/generic/pending-5.4/740-net-sfp-remove-incomplete-100BASE-FX-and-100BASE-LX-.patch52
-rw-r--r--target/linux/generic/pending-5.4/741-net-sfp-derive-interface-mode-from-ethtool-link-mode.patch89
-rw-r--r--target/linux/generic/pending-5.4/742-net-sfp-add-more-extended-compliance-codes.patch251
-rw-r--r--target/linux/generic/pending-5.4/743-net-sfp-add-module-start-stop-upstream-notifications.patch131
-rw-r--r--target/linux/generic/pending-5.4/744-net-sfp-move-phy_start-phy_stop-to-phylink.patch72
-rw-r--r--target/linux/generic/pending-5.4/745-net-mdio-i2c-add-support-for-Clause-45-accesses.patch74
-rw-r--r--target/linux/generic/pending-5.4/746-net-phylink-re-split-__phylink_connect_phy.patch93
-rw-r--r--target/linux/generic/pending-5.4/747-net-phylink-support-Clause-45-PHYs-on-SFP-modules.patch89
-rw-r--r--target/linux/generic/pending-5.4/748-net-phylink-split-link_an_mode-configured-and-curren.patch257
-rw-r--r--target/linux/generic/pending-5.4/749-net-phylink-split-phylink_sfp_module_insert.patch120
-rw-r--r--target/linux/generic/pending-5.4/750-net-phylink-delay-MAC-configuration-for-copper-SFP-m.patch201
-rw-r--r--target/linux/generic/pending-5.4/751-net-phylink-make-Broadcom-BCM84881-based-SFPs-work.patch59
-rw-r--r--target/linux/generic/pending-5.4/752-net-phy-add-Broadcom-BCM84881-PHY-driver.patch315
-rw-r--r--target/linux/generic/pending-5.4/753-net-sfp-add-support-for-Clause-45-PHYs.patch94
-rw-r--r--target/linux/generic/pending-5.4/754-net-sfp-fix-unbind.patch28
-rw-r--r--target/linux/generic/pending-5.4/755-net-sfp-fix-hwmon.patch44
-rw-r--r--target/linux/generic/pending-5.4/756-net-sfp-use-a-definition-for-the-fault-recovery-atte.patch55
-rw-r--r--target/linux/generic/pending-5.4/757-net-sfp-rename-sm_retries.patch60
-rw-r--r--target/linux/generic/pending-5.4/758-net-sfp-error-handling-for-phy-probe.patch97
-rw-r--r--target/linux/generic/pending-5.4/759-net-sfp-re-attempt-probing-for-phy.patch132
-rw-r--r--target/linux/generic/pending-5.4/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch27
-rw-r--r--target/linux/generic/pending-5.4/761-net-dsa-mt7530-Support-EEE-features.patch121
-rw-r--r--target/linux/generic/pending-5.4/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch71
-rw-r--r--target/linux/generic/pending-5.4/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch42
-rw-r--r--target/linux/generic/pending-5.4/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch94
-rw-r--r--target/linux/generic/pending-5.4/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch36
-rw-r--r--target/linux/generic/pending-5.4/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch30
-rw-r--r--target/linux/generic/pending-5.4/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch56
-rw-r--r--target/linux/generic/pending-5.4/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch27
-rw-r--r--target/linux/generic/pending-5.4/770-00-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch72
-rw-r--r--target/linux/generic/pending-5.4/770-01-net-ethernet-mtk_eth_soc-significantly-reduce-mdio-b.patch26
-rw-r--r--target/linux/generic/pending-5.4/770-03-net-ethernet-mtk_eth_soc-fix-unnecessary-tx-queue-st.patch50
-rw-r--r--target/linux/generic/pending-5.4/770-04-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-q.patch32
-rw-r--r--target/linux/generic/pending-5.4/770-05-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch21
-rw-r--r--target/linux/generic/pending-5.4/770-06-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch281
-rw-r--r--target/linux/generic/pending-5.4/770-08-net-ethernet-mtk_eth_soc-cache-hardware-pointer-of-l.patch67
-rw-r--r--target/linux/generic/pending-5.4/770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch44
-rw-r--r--target/linux/generic/pending-5.4/770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch44
-rw-r--r--target/linux/generic/pending-5.4/770-11-net-ethernet-mtk_eth_soc-avoid-rearming-interrupt-if.patch35
-rw-r--r--target/linux/generic/pending-5.4/770-13-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch67
-rw-r--r--target/linux/generic/pending-5.4/770-14-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch41
-rw-r--r--target/linux/generic/pending-5.4/770-15-net-ethernet-mediatek-mtk_eth_soc-add-support-for-in.patch1058
-rw-r--r--target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch401
-rw-r--r--target/linux/generic/pending-5.4/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch61
-rw-r--r--target/linux/generic/pending-5.4/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch64
-rw-r--r--target/linux/generic/pending-5.4/810-pci_disable_common_quirks.patch62
-rw-r--r--target/linux/generic/pending-5.4/811-pci_disable_usb_common_quirks.patch115
-rw-r--r--target/linux/generic/pending-5.4/820-libata-Assign-OF-node-to-the-SCSI-device.patch86
-rw-r--r--target/linux/generic/pending-5.4/834-ledtrig-libata.patch149
-rw-r--r--target/linux/generic/pending-5.4/840-hwrng-bcm2835-set-quality-to-1000.patch26
-rw-r--r--target/linux/generic/pending-5.4/920-mangle_bootargs.patch71
463 files changed, 0 insertions, 119615 deletions
diff --git a/target/linux/generic/backport-5.4/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch b/target/linux/generic/backport-5.4/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch
deleted file mode 100644
index 7ac4f9d240..0000000000
--- a/target/linux/generic/backport-5.4/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 13b1ecc3401653a355798eb1dee10cc1608202f4 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 18 Jan 2016 12:27:49 +0100
-Subject: [PATCH 33/34] Kbuild: don't hardcode path to awk in
- scripts/ld-version.sh
-
-On some systems /usr/bin/awk does not exist, or is broken. Find it via
-$PATH instead.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- scripts/ld-version.sh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/scripts/ld-version.sh
-+++ b/scripts/ld-version.sh
-@@ -1,6 +1,7 @@
--#!/usr/bin/awk -f
-+#!/bin/sh
- # SPDX-License-Identifier: GPL-2.0
- # extract linker version number from stdin and turn into single number
-+exec awk '
- {
- gsub(".*\\)", "");
- gsub(".*version ", "");
-@@ -9,3 +10,4 @@
- print a[1]*100000000 + a[2]*1000000 + a[3]*10000;
- exit
- }
-+'
diff --git a/target/linux/generic/backport-5.4/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-5.4/011-kbuild-export-SUBARCH.patch
deleted file mode 100644
index 60defa39c5..0000000000
--- a/target/linux/generic/backport-5.4/011-kbuild-export-SUBARCH.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 9 Jul 2017 00:26:53 +0200
-Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- Makefile | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -493,7 +493,7 @@ KBUILD_LDFLAGS :=
- GCC_PLUGINS_CFLAGS :=
- CLANG_FLAGS :=
-
--export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
-+export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
- export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE LEX YACC AWK INSTALLKERNEL
- export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
- export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ
diff --git a/target/linux/generic/backport-5.4/025-power-reset-add-driver-for-LinkStation-power-off.patch b/target/linux/generic/backport-5.4/025-power-reset-add-driver-for-LinkStation-power-off.patch
deleted file mode 100644
index 7bf48c3405..0000000000
--- a/target/linux/generic/backport-5.4/025-power-reset-add-driver-for-LinkStation-power-off.patch
+++ /dev/null
@@ -1,199 +0,0 @@
-From a7f79f99541eff4e6bcae0014eb08d3019337565 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Cabanelas?= <dgcbueu@gmail.com>
-Date: Wed, 15 Jul 2020 15:35:14 +0200
-Subject: [PATCH] power: reset: add driver for LinkStation power off
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Some Buffalo LinkStations perform the power off operation, at restart
-time, depending on the state of an output pin (LED2/INTn) at the ethernet
-PHY. This pin is also used to wake the machine when a WoL packet is
-received by the PHY.
-
-The driver is required by the Buffalo LinkStation LS421DE (ARM MVEBU),
-and other models. Without it, the board remains forever halted if a
-power off command is executed, unless the PSU is disconnected and
-connected again.
-
-Add the driver to provide the power off function and also make the WoL
-feature to be available.
-
-Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
-Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
----
- drivers/power/reset/Kconfig | 11 ++
- drivers/power/reset/Makefile | 1 +
- drivers/power/reset/linkstation-poweroff.c | 136 +++++++++++++++++++++
- 3 files changed, 148 insertions(+)
- create mode 100644 drivers/power/reset/linkstation-poweroff.c
-
---- a/drivers/power/reset/Kconfig
-+++ b/drivers/power/reset/Kconfig
-@@ -99,6 +99,17 @@ config POWER_RESET_HISI
- help
- Reboot support for Hisilicon boards.
-
-+config POWER_RESET_LINKSTATION
-+ tristate "Buffalo LinkStation power-off driver"
-+ depends on ARCH_MVEBU || COMPILE_TEST
-+ depends on OF_MDIO && PHYLIB
-+ help
-+ This driver supports turning off some Buffalo LinkStations by
-+ setting an output pin at the ethernet PHY to the correct state.
-+ It also makes the device compatible with the WoL function.
-+
-+ Say Y here if you have a Buffalo LinkStation LS421D/E.
-+
- config POWER_RESET_MSM
- bool "Qualcomm MSM power-off driver"
- depends on ARCH_QCOM
---- a/drivers/power/reset/Makefile
-+++ b/drivers/power/reset/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_POWER_RESET_GEMINI_POWEROFF
- obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
- obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o
- obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o
-+obj-${CONFIG_POWER_RESET_LINKSTATION} += linkstation-poweroff.o
- obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
- obj-$(CONFIG_POWER_RESET_QCOM_PON) += qcom-pon.o
- obj-$(CONFIG_POWER_RESET_OCELOT_RESET) += ocelot-reset.o
---- /dev/null
-+++ b/drivers/power/reset/linkstation-poweroff.c
-@@ -0,0 +1,136 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * LinkStation power off restart driver
-+ * Copyright (C) 2020 Daniel González Cabanelas <dgcbueu@gmail.com>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/notifier.h>
-+#include <linux/of.h>
-+#include <linux/of_mdio.h>
-+#include <linux/of_platform.h>
-+#include <linux/reboot.h>
-+#include <linux/phy.h>
-+
-+/* Defines from the eth phy Marvell driver */
-+#define MII_MARVELL_COPPER_PAGE 0
-+#define MII_MARVELL_LED_PAGE 3
-+#define MII_MARVELL_WOL_PAGE 17
-+#define MII_MARVELL_PHY_PAGE 22
-+
-+#define MII_PHY_LED_CTRL 16
-+#define MII_88E1318S_PHY_LED_TCR 18
-+#define MII_88E1318S_PHY_WOL_CTRL 16
-+#define MII_M1011_IEVENT 19
-+
-+#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE BIT(7)
-+#define MII_88E1318S_PHY_LED_TCR_FORCE_INT BIT(15)
-+#define MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS BIT(12)
-+#define LED2_FORCE_ON (0x8 << 8)
-+#define LEDMASK GENMASK(11,8)
-+
-+static struct phy_device *phydev;
-+
-+static void mvphy_reg_intn(u16 data)
-+{
-+ int rc = 0, saved_page;
-+
-+ saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE);
-+ if (saved_page < 0)
-+ goto err;
-+
-+ /* Force manual LED2 control to let INTn work */
-+ __phy_modify(phydev, MII_PHY_LED_CTRL, LEDMASK, LED2_FORCE_ON);
-+
-+ /* Set the LED[2]/INTn pin to the required state */
-+ __phy_modify(phydev, MII_88E1318S_PHY_LED_TCR,
-+ MII_88E1318S_PHY_LED_TCR_FORCE_INT,
-+ MII_88E1318S_PHY_LED_TCR_INTn_ENABLE | data);
-+
-+ if (!data) {
-+ /* Clear interrupts to ensure INTn won't be holded in high state */
-+ __phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_COPPER_PAGE);
-+ __phy_read(phydev, MII_M1011_IEVENT);
-+
-+ /* If WOL was enabled and a magic packet was received before powering
-+ * off, we won't be able to wake up by sending another magic packet.
-+ * Clear WOL status.
-+ */
-+ __phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_WOL_PAGE);
-+ __phy_set_bits(phydev, MII_88E1318S_PHY_WOL_CTRL,
-+ MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS);
-+ }
-+err:
-+ rc = phy_restore_page(phydev, saved_page, rc);
-+ if (rc < 0)
-+ dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc);
-+}
-+
-+static int linkstation_reboot_notifier(struct notifier_block *nb,
-+ unsigned long action, void *unused)
-+{
-+ if (action == SYS_RESTART)
-+ mvphy_reg_intn(MII_88E1318S_PHY_LED_TCR_FORCE_INT);
-+
-+ return NOTIFY_DONE;
-+}
-+
-+static struct notifier_block linkstation_reboot_nb = {
-+ .notifier_call = linkstation_reboot_notifier,
-+};
-+
-+static void linkstation_poweroff(void)
-+{
-+ unregister_reboot_notifier(&linkstation_reboot_nb);
-+ mvphy_reg_intn(0);
-+
-+ kernel_restart("Power off");
-+}
-+
-+static const struct of_device_id ls_poweroff_of_match[] = {
-+ { .compatible = "buffalo,ls421d" },
-+ { .compatible = "buffalo,ls421de" },
-+ { },
-+};
-+
-+static int __init linkstation_poweroff_init(void)
-+{
-+ struct mii_bus *bus;
-+ struct device_node *dn;
-+
-+ dn = of_find_matching_node(NULL, ls_poweroff_of_match);
-+ if (!dn)
-+ return -ENODEV;
-+ of_node_put(dn);
-+
-+ dn = of_find_node_by_name(NULL, "mdio");
-+ if (!dn)
-+ return -ENODEV;
-+
-+ bus = of_mdio_find_bus(dn);
-+ of_node_put(dn);
-+ if (!bus)
-+ return -EPROBE_DEFER;
-+
-+ phydev = phy_find_first(bus);
-+ if (!phydev)
-+ return -EPROBE_DEFER;
-+
-+ register_reboot_notifier(&linkstation_reboot_nb);
-+ pm_power_off = linkstation_poweroff;
-+
-+ return 0;
-+}
-+
-+static void __exit linkstation_poweroff_exit(void)
-+{
-+ pm_power_off = NULL;
-+ unregister_reboot_notifier(&linkstation_reboot_nb);
-+}
-+
-+module_init(linkstation_poweroff_init);
-+module_exit(linkstation_poweroff_exit);
-+
-+MODULE_AUTHOR("Daniel González Cabanelas <dgcbueu@gmail.com>");
-+MODULE_DESCRIPTION("LinkStation power off driver");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/generic/backport-5.4/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch b/target/linux/generic/backport-5.4/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch
deleted file mode 100644
index 66e75bf514..0000000000
--- a/target/linux/generic/backport-5.4/026-power-reset-linkstation-poweroff-add-missing-put_dev.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 1027a42c25cbf8cfc4ade6503c5110aae04866af Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Cabanelas?= <dgcbueu@gmail.com>
-Date: Fri, 16 Oct 2020 20:22:37 +0200
-Subject: [PATCH] power: reset: linkstation-poweroff: add missing put_device()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The of_mdio_find_bus() takes a reference to the underlying device
-structure, we should release that reference using a put_device() call.
-
-Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
-Signed-off-by: Sebastian Reichel <sre@kernel.org>
----
- drivers/power/reset/linkstation-poweroff.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/power/reset/linkstation-poweroff.c
-+++ b/drivers/power/reset/linkstation-poweroff.c
-@@ -113,6 +113,7 @@ static int __init linkstation_poweroff_i
- return -EPROBE_DEFER;
-
- phydev = phy_find_first(bus);
-+ put_device(&bus->dev);
- if (!phydev)
- return -EPROBE_DEFER;
-
diff --git a/target/linux/generic/backport-5.4/030-modpost-add-a-helper-to-get-data-pointed-by-a-symbol.patch b/target/linux/generic/backport-5.4/030-modpost-add-a-helper-to-get-data-pointed-by-a-symbol.patch
deleted file mode 100644
index cf88c0c69f..0000000000
--- a/target/linux/generic/backport-5.4/030-modpost-add-a-helper-to-get-data-pointed-by-a-symbol.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From afa0459daa7b08c7b2c879705b69d39b734a11d0 Mon Sep 17 00:00:00 2001
-From: Masahiro Yamada <yamada.masahiro@socionext.com>
-Date: Fri, 15 Nov 2019 02:42:21 +0900
-Subject: [PATCH] modpost: add a helper to get data pointed by a symbol
-
-When CONFIG_MODULE_REL_CRCS is enabled, the value of __crc_* is not
-an absolute value, but the address to the CRC data embedded in the
-.rodata section.
-
-Getting the data pointed by the symbol value is somewhat complex.
-Split it out into a new helper, sym_get_data().
-
-I will reuse it to refactor namespace_from_kstrtabns() in the next
-commit.
-
-Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
----
- scripts/mod/modpost.c | 17 +++++++++++++----
- 1 file changed, 13 insertions(+), 4 deletions(-)
-
---- a/scripts/mod/modpost.c
-+++ b/scripts/mod/modpost.c
-@@ -312,6 +312,18 @@ static const char *sec_name(struct elf_i
- return sech_name(elf, &elf->sechdrs[secindex]);
- }
-
-+static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
-+{
-+ Elf_Shdr *sechdr = &info->sechdrs[sym->st_shndx];
-+ unsigned long offset;
-+
-+ offset = sym->st_value;
-+ if (info->hdr->e_type != ET_REL)
-+ offset -= sechdr->sh_addr;
-+
-+ return (void *)info->hdr + sechdr->sh_offset + offset;
-+}
-+
- #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
-
- static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
-@@ -701,10 +713,7 @@ static void handle_modversions(struct mo
- unsigned int *crcp;
-
- /* symbol points to the CRC in the ELF object */
-- crcp = (void *)info->hdr + sym->st_value +
-- info->sechdrs[sym->st_shndx].sh_offset -
-- (info->hdr->e_type != ET_REL ?
-- info->sechdrs[sym->st_shndx].sh_addr : 0);
-+ crcp = sym_get_data(info, sym);
- crc = TO_NATIVE(*crcp);
- }
- sym_update_crc(symname + strlen("__crc_"), mod, crc,
diff --git a/target/linux/generic/backport-5.4/031-modpost-refactor-namespace_from_kstrtabns-to-not-har.patch b/target/linux/generic/backport-5.4/031-modpost-refactor-namespace_from_kstrtabns-to-not-har.patch
deleted file mode 100644
index 230dc6b89a..0000000000
--- a/target/linux/generic/backport-5.4/031-modpost-refactor-namespace_from_kstrtabns-to-not-har.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From e84f9fbbece1585f45a03ccc11eeabe121cadc1b Mon Sep 17 00:00:00 2001
-From: Masahiro Yamada <yamada.masahiro@socionext.com>
-Date: Fri, 15 Nov 2019 02:42:22 +0900
-Subject: [PATCH] modpost: refactor namespace_from_kstrtabns() to not hard-code
- section name
-
-Currently, namespace_from_kstrtabns() relies on the fact that
-namespace strings are recorded in the __ksymtab_strings section.
-Actually, it is coded in include/linux/export.h, but modpost does
-not need to hard-code the section name.
-
-Elf_Sym::st_shndx holds the index of the relevant section. Using it is
-a more portable way to get the namespace string.
-
-Make namespace_from_kstrtabns() simply call sym_get_data(), and delete
-the info->ksymtab_strings .
-
-While I was here, I added more 'const' qualifiers to pointers.
-
-Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
----
- scripts/mod/modpost.c | 10 +++-------
- scripts/mod/modpost.h | 1 -
- 2 files changed, 3 insertions(+), 8 deletions(-)
-
---- a/scripts/mod/modpost.c
-+++ b/scripts/mod/modpost.c
-@@ -360,10 +360,10 @@ static enum export export_from_sec(struc
- return export_unknown;
- }
-
--static const char *namespace_from_kstrtabns(struct elf_info *info,
-- Elf_Sym *kstrtabns)
-+static const char *namespace_from_kstrtabns(const struct elf_info *info,
-+ const Elf_Sym *sym)
- {
-- char *value = info->ksymtab_strings + kstrtabns->st_value;
-+ const char *value = sym_get_data(info, sym);
- return value[0] ? value : NULL;
- }
-
-@@ -605,10 +605,6 @@ static int parse_elf(struct elf_info *in
- info->export_unused_gpl_sec = i;
- else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
- info->export_gpl_future_sec = i;
-- else if (strcmp(secname, "__ksymtab_strings") == 0)
-- info->ksymtab_strings = (void *)hdr +
-- sechdrs[i].sh_offset -
-- sechdrs[i].sh_addr;
-
- if (sechdrs[i].sh_type == SHT_SYMTAB) {
- unsigned int sh_link_idx;
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -143,7 +143,6 @@ struct elf_info {
- Elf_Section export_gpl_sec;
- Elf_Section export_unused_gpl_sec;
- Elf_Section export_gpl_future_sec;
-- char *ksymtab_strings;
- char *strtab;
- char *modinfo;
- unsigned int modinfo_len;
diff --git a/target/linux/generic/backport-5.4/041-v5.5-arm64-Implement-optimised-checksum-routine.patch b/target/linux/generic/backport-5.4/041-v5.5-arm64-Implement-optimised-checksum-routine.patch
deleted file mode 100644
index 00ec7d0207..0000000000
--- a/target/linux/generic/backport-5.4/041-v5.5-arm64-Implement-optimised-checksum-routine.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-From: Robin Murphy <robin.murphy@arm.com>
-Date: Wed, 15 Jan 2020 16:42:39 +0000
-Subject: [PATCH] arm64: Implement optimised checksum routine
-
-Apparently there exist certain workloads which rely heavily on software
-checksumming, for which the generic do_csum() implementation becomes a
-significant bottleneck. Therefore let's give arm64 its own optimised
-version - for ease of maintenance this foregoes assembly or intrisics,
-and is thus not actually arm64-specific, but does rely heavily on C
-idioms that translate well to the A64 ISA and the typical load/store
-capabilities of most ARMv8 CPU cores.
-
-The resulting increase in checksum throughput scales nicely with buffer
-size, tending towards 4x for a small in-order core (Cortex-A53), and up
-to 6x or more for an aggressive big core (Ampere eMAG).
-
-Reported-by: Lingyan Huang <huanglingyan2@huawei.com>
-Tested-by: Lingyan Huang <huanglingyan2@huawei.com>
-Signed-off-by: Robin Murphy <robin.murphy@arm.com>
-Signed-off-by: Will Deacon <will@kernel.org>
----
- create mode 100644 arch/arm64/lib/csum.c
-
---- a/arch/arm64/include/asm/checksum.h
-+++ b/arch/arm64/include/asm/checksum.h
-@@ -36,6 +36,9 @@ static inline __sum16 ip_fast_csum(const
- }
- #define ip_fast_csum ip_fast_csum
-
-+extern unsigned int do_csum(const unsigned char *buff, int len);
-+#define do_csum do_csum
-+
- #include <asm-generic/checksum.h>
-
- #endif /* __ASM_CHECKSUM_H */
---- a/arch/arm64/lib/Makefile
-+++ b/arch/arm64/lib/Makefile
-@@ -1,9 +1,9 @@
- # SPDX-License-Identifier: GPL-2.0
- lib-y := clear_user.o delay.o copy_from_user.o \
- copy_to_user.o copy_in_user.o copy_page.o \
-- clear_page.o memchr.o memcpy.o memmove.o memset.o \
-- memcmp.o strcmp.o strncmp.o strlen.o strnlen.o \
-- strchr.o strrchr.o tishift.o
-+ clear_page.o csum.o memchr.o memcpy.o memmove.o \
-+ memset.o memcmp.o strcmp.o strncmp.o strlen.o \
-+ strnlen.o strchr.o strrchr.o tishift.o
-
- ifeq ($(CONFIG_KERNEL_MODE_NEON), y)
- obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
---- /dev/null
-+++ b/arch/arm64/lib/csum.c
-@@ -0,0 +1,123 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+// Copyright (C) 2019-2020 Arm Ltd.
-+
-+#include <linux/compiler.h>
-+#include <linux/kasan-checks.h>
-+#include <linux/kernel.h>
-+
-+#include <net/checksum.h>
-+
-+/* Looks dumb, but generates nice-ish code */
-+static u64 accumulate(u64 sum, u64 data)
-+{
-+ __uint128_t tmp = (__uint128_t)sum + data;
-+ return tmp + (tmp >> 64);
-+}
-+
-+unsigned int do_csum(const unsigned char *buff, int len)
-+{
-+ unsigned int offset, shift, sum;
-+ const u64 *ptr;
-+ u64 data, sum64 = 0;
-+
-+ offset = (unsigned long)buff & 7;
-+ /*
-+ * This is to all intents and purposes safe, since rounding down cannot
-+ * result in a different page or cache line being accessed, and @buff
-+ * should absolutely not be pointing to anything read-sensitive. We do,
-+ * however, have to be careful not to piss off KASAN, which means using
-+ * unchecked reads to accommodate the head and tail, for which we'll
-+ * compensate with an explicit check up-front.
-+ */
-+ kasan_check_read(buff, len);
-+ ptr = (u64 *)(buff - offset);
-+ len = len + offset - 8;
-+
-+ /*
-+ * Head: zero out any excess leading bytes. Shifting back by the same
-+ * amount should be at least as fast as any other way of handling the
-+ * odd/even alignment, and means we can ignore it until the very end.
-+ */
-+ shift = offset * 8;
-+ data = READ_ONCE_NOCHECK(*ptr++);
-+#ifdef __LITTLE_ENDIAN
-+ data = (data >> shift) << shift;
-+#else
-+ data = (data << shift) >> shift;
-+#endif
-+
-+ /*
-+ * Body: straightforward aligned loads from here on (the paired loads
-+ * underlying the quadword type still only need dword alignment). The
-+ * main loop strictly excludes the tail, so the second loop will always
-+ * run at least once.
-+ */
-+ while (unlikely(len > 64)) {
-+ __uint128_t tmp1, tmp2, tmp3, tmp4;
-+
-+ tmp1 = READ_ONCE_NOCHECK(*(__uint128_t *)ptr);
-+ tmp2 = READ_ONCE_NOCHECK(*(__uint128_t *)(ptr + 2));
-+ tmp3 = READ_ONCE_NOCHECK(*(__uint128_t *)(ptr + 4));
-+ tmp4 = READ_ONCE_NOCHECK(*(__uint128_t *)(ptr + 6));
-+
-+ len -= 64;
-+ ptr += 8;
-+
-+ /* This is the "don't dump the carry flag into a GPR" idiom */
-+ tmp1 += (tmp1 >> 64) | (tmp1 << 64);
-+ tmp2 += (tmp2 >> 64) | (tmp2 << 64);
-+ tmp3 += (tmp3 >> 64) | (tmp3 << 64);
-+ tmp4 += (tmp4 >> 64) | (tmp4 << 64);
-+ tmp1 = ((tmp1 >> 64) << 64) | (tmp2 >> 64);
-+ tmp1 += (tmp1 >> 64) | (tmp1 << 64);
-+ tmp3 = ((tmp3 >> 64) << 64) | (tmp4 >> 64);
-+ tmp3 += (tmp3 >> 64) | (tmp3 << 64);
-+ tmp1 = ((tmp1 >> 64) << 64) | (tmp3 >> 64);
-+ tmp1 += (tmp1 >> 64) | (tmp1 << 64);
-+ tmp1 = ((tmp1 >> 64) << 64) | sum64;
-+ tmp1 += (tmp1 >> 64) | (tmp1 << 64);
-+ sum64 = tmp1 >> 64;
-+ }
-+ while (len > 8) {
-+ __uint128_t tmp;
-+
-+ sum64 = accumulate(sum64, data);
-+ tmp = READ_ONCE_NOCHECK(*(__uint128_t *)ptr);
-+
-+ len -= 16;
-+ ptr += 2;
-+
-+#ifdef __LITTLE_ENDIAN
-+ data = tmp >> 64;
-+ sum64 = accumulate(sum64, tmp);
-+#else
-+ data = tmp;
-+ sum64 = accumulate(sum64, tmp >> 64);
-+#endif
-+ }
-+ if (len > 0) {
-+ sum64 = accumulate(sum64, data);
-+ data = READ_ONCE_NOCHECK(*ptr);
-+ len -= 8;
-+ }
-+ /*
-+ * Tail: zero any over-read bytes similarly to the head, again
-+ * preserving odd/even alignment.
-+ */
-+ shift = len * -8;
-+#ifdef __LITTLE_ENDIAN
-+ data = (data << shift) >> shift;
-+#else
-+ data = (data >> shift) << shift;
-+#endif
-+ sum64 = accumulate(sum64, data);
-+
-+ /* Finally, folding */
-+ sum64 += (sum64 >> 32) | (sum64 << 32);
-+ sum = sum64 >> 32;
-+ sum += (sum >> 16) | (sum << 16);
-+ if (offset & 1)
-+ return (u16)swab32(sum);
-+
-+ return sum >> 16;
-+}
diff --git a/target/linux/generic/backport-5.4/042-v5.5-arm64-csum-Fix-pathological-zero-length-calls.patch b/target/linux/generic/backport-5.4/042-v5.5-arm64-csum-Fix-pathological-zero-length-calls.patch
deleted file mode 100644
index 50b210e14f..0000000000
--- a/target/linux/generic/backport-5.4/042-v5.5-arm64-csum-Fix-pathological-zero-length-calls.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Robin Murphy <robin.murphy@arm.com>
-Date: Fri, 17 Jan 2020 15:48:39 +0000
-Subject: [PATCH] arm64: csum: Fix pathological zero-length calls
-
-In validating the checksumming results of the new routine, I sadly
-neglected to test its not-checksumming results. Thus it slipped through
-that the one case where @buff is already dword-aligned and @len = 0
-manages to defeat the tail-masking logic and behave as if @len = 8.
-For a zero length it doesn't make much sense to deference @buff anyway,
-so just add an early return (which has essentially zero impact on
-performance).
-
-Signed-off-by: Robin Murphy <robin.murphy@arm.com>
-Signed-off-by: Will Deacon <will@kernel.org>
----
-
---- a/arch/arm64/lib/csum.c
-+++ b/arch/arm64/lib/csum.c
-@@ -20,6 +20,9 @@ unsigned int do_csum(const unsigned char
- const u64 *ptr;
- u64 data, sum64 = 0;
-
-+ if (unlikely(len == 0))
-+ return 0;
-+
- offset = (unsigned long)buff & 7;
- /*
- * This is to all intents and purposes safe, since rounding down cannot
diff --git a/target/linux/generic/backport-5.4/071-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch b/target/linux/generic/backport-5.4/071-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch
deleted file mode 100644
index 82feb7421d..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-00-MIPS-uasm-Enable-muhu-opcode-for-MIPS-R6.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:02 +0200
-Subject: [PATCH] MIPS: uasm: Enable muhu opcode for MIPS R6
-
-Enable the 'muhu' instruction, complementing the existing 'mulu', needed
-to implement a MIPS32 BPF JIT.
-
-Also fix a typo in the existing definition of 'dmulu'.
-
-Signed-off-by: Tony Ambardar <Tony.Ambardar@gmail.com>
-
-This patch is a dependency for my 32-bit MIPS eBPF JIT.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
----
-
---- a/arch/mips/include/asm/uasm.h
-+++ b/arch/mips/include/asm/uasm.h
-@@ -145,6 +145,7 @@ Ip_u1(_mtlo);
- Ip_u3u1u2(_mul);
- Ip_u1u2(_multu);
- Ip_u3u1u2(_mulu);
-+Ip_u3u1u2(_muhu);
- Ip_u3u1u2(_nor);
- Ip_u3u1u2(_or);
- Ip_u2u1u3(_ori);
---- a/arch/mips/mm/uasm-mips.c
-+++ b/arch/mips/mm/uasm-mips.c
-@@ -90,7 +90,7 @@ static const struct insn insn_table[insn
- RS | RT | RD},
- [insn_dmtc0] = {M(cop0_op, dmtc_op, 0, 0, 0, 0), RT | RD | SET},
- [insn_dmultu] = {M(spec_op, 0, 0, 0, 0, dmultu_op), RS | RT},
-- [insn_dmulu] = {M(spec_op, 0, 0, 0, dmult_dmul_op, dmultu_op),
-+ [insn_dmulu] = {M(spec_op, 0, 0, 0, dmultu_dmulu_op, dmultu_op),
- RS | RT | RD},
- [insn_drotr] = {M(spec_op, 1, 0, 0, 0, dsrl_op), RT | RD | RE},
- [insn_drotr32] = {M(spec_op, 1, 0, 0, 0, dsrl32_op), RT | RD | RE},
-@@ -150,6 +150,8 @@ static const struct insn insn_table[insn
- [insn_mtlo] = {M(spec_op, 0, 0, 0, 0, mtlo_op), RS},
- [insn_mulu] = {M(spec_op, 0, 0, 0, multu_mulu_op, multu_op),
- RS | RT | RD},
-+ [insn_muhu] = {M(spec_op, 0, 0, 0, multu_muhu_op, multu_op),
-+ RS | RT | RD},
- #ifndef CONFIG_CPU_MIPSR6
- [insn_mul] = {M(spec2_op, 0, 0, 0, 0, mul_op), RS | RT | RD},
- #else
---- a/arch/mips/mm/uasm.c
-+++ b/arch/mips/mm/uasm.c
-@@ -59,7 +59,7 @@ enum opcode {
- insn_lddir, insn_ldpte, insn_ldx, insn_lh, insn_lhu, insn_ll, insn_lld,
- insn_lui, insn_lw, insn_lwu, insn_lwx, insn_mfc0, insn_mfhc0, insn_mfhi,
- insn_mflo, insn_modu, insn_movn, insn_movz, insn_mtc0, insn_mthc0,
-- insn_mthi, insn_mtlo, insn_mul, insn_multu, insn_mulu, insn_nor,
-+ insn_mthi, insn_mtlo, insn_mul, insn_multu, insn_mulu, insn_muhu, insn_nor,
- insn_or, insn_ori, insn_pref, insn_rfe, insn_rotr, insn_sb, insn_sc,
- insn_scd, insn_seleqz, insn_selnez, insn_sd, insn_sh, insn_sll,
- insn_sllv, insn_slt, insn_slti, insn_sltiu, insn_sltu, insn_sra,
-@@ -344,6 +344,7 @@ I_u1(_mtlo)
- I_u3u1u2(_mul)
- I_u1u2(_multu)
- I_u3u1u2(_mulu)
-+I_u3u1u2(_muhu)
- I_u3u1u2(_nor)
- I_u3u1u2(_or)
- I_u2u1u3(_ori)
diff --git a/target/linux/generic/backport-5.4/071-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch b/target/linux/generic/backport-5.4/071-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch
deleted file mode 100644
index 3a4d573f80..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-01-mips-uasm-Add-workaround-for-Loongson-2F-nop-CPU-err.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:03 +0200
-Subject: [PATCH] mips: uasm: Add workaround for Loongson-2F nop CPU errata
-
-This patch implements a workaround for the Loongson-2F nop in generated,
-code, if the existing option CONFIG_CPU_NOP_WORKAROUND is set. Before,
-the binutils option -mfix-loongson2f-nop was enabled, but no workaround
-was done when emitting MIPS code. Now, the nop pseudo instruction is
-emitted as "or ax,ax,zero" instead of the default "sll zero,zero,0". This
-is consistent with the workaround implemented by binutils.
-
-Link: https://sourceware.org/legacy-ml/binutils/2009-11/msg00387.html
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
----
-
---- a/arch/mips/include/asm/uasm.h
-+++ b/arch/mips/include/asm/uasm.h
-@@ -249,7 +249,11 @@ static inline void uasm_l##lb(struct uas
- #define uasm_i_bnezl(buf, rs, off) uasm_i_bnel(buf, rs, 0, off)
- #define uasm_i_ehb(buf) uasm_i_sll(buf, 0, 0, 3)
- #define uasm_i_move(buf, a, b) UASM_i_ADDU(buf, a, 0, b)
-+#ifdef CONFIG_CPU_NOP_WORKAROUNDS
-+#define uasm_i_nop(buf) uasm_i_or(buf, 1, 1, 0)
-+#else
- #define uasm_i_nop(buf) uasm_i_sll(buf, 0, 0, 0)
-+#endif
- #define uasm_i_ssnop(buf) uasm_i_sll(buf, 0, 0, 1)
-
- static inline void uasm_i_drotr_safe(u32 **p, unsigned int a1,
diff --git a/target/linux/generic/backport-5.4/071-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch b/target/linux/generic/backport-5.4/071-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch
deleted file mode 100644
index 7980659961..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-02-mips-bpf-Add-eBPF-JIT-for-32-bit-MIPS.patch
+++ /dev/null
@@ -1,3078 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:04 +0200
-Subject: [PATCH] mips: bpf: Add eBPF JIT for 32-bit MIPS
-
-This is an implementation of an eBPF JIT for 32-bit MIPS I-V and MIPS32.
-The implementation supports all 32-bit and 64-bit ALU and JMP operations,
-including the recently-added atomics. 64-bit div/mod and 64-bit atomics
-are implemented using function calls to math64 and atomic64 functions,
-respectively. All 32-bit operations are implemented natively by the JIT,
-except if the CPU lacks ll/sc instructions.
-
-Register mapping
-================
-All 64-bit eBPF registers are mapped to native 32-bit MIPS register pairs,
-and does not use any stack scratch space for register swapping. This means
-that all eBPF register data is kept in CPU registers all the time, and
-this simplifies the register management a lot. It also reduces the JIT's
-pressure on temporary registers since we do not have to move data around.
-
-Native register pairs are ordered according to CPU endiannes, following
-the O32 calling convention for passing 64-bit arguments and return values.
-The eBPF return value, arguments and callee-saved registers are mapped to
-their native MIPS equivalents.
-
-Since the 32 highest bits in the eBPF FP (frame pointer) register are
-always zero, only one general-purpose register is actually needed for the
-mapping. The MIPS fp register is used for this purpose. The high bits are
-mapped to MIPS register r0. This saves us one CPU register, which is much
-needed for temporaries, while still allowing us to treat the R10 (FP)
-register just like any other eBPF register in the JIT.
-
-The MIPS gp (global pointer) and at (assembler temporary) registers are
-used as internal temporary registers for constant blinding. CPU registers
-t6-t9 are used internally by the JIT when constructing more complex 64-bit
-operations. This is precisely what is needed - two registers to store an
-operand value, and two more as scratch registers when performing the
-operation.
-
-The register mapping is shown below.
-
- R0 - $v1, $v0 return value
- R1 - $a1, $a0 argument 1, passed in registers
- R2 - $a3, $a2 argument 2, passed in registers
- R3 - $t1, $t0 argument 3, passed on stack
- R4 - $t3, $t2 argument 4, passed on stack
- R5 - $t4, $t3 argument 5, passed on stack
- R6 - $s1, $s0 callee-saved
- R7 - $s3, $s2 callee-saved
- R8 - $s5, $s4 callee-saved
- R9 - $s7, $s6 callee-saved
- FP - $r0, $fp 32-bit frame pointer
- AX - $gp, $at constant-blinding
- $t6 - $t9 unallocated, JIT temporaries
-
-Jump offsets
-============
-The JIT tries to map all conditional JMP operations to MIPS conditional
-PC-relative branches. The MIPS branch offset field is 18 bits, in bytes,
-which is equivalent to the eBPF 16-bit instruction offset. However, since
-the JIT may emit more than one CPU instruction per eBPF instruction, the
-field width may overflow. If that happens, the JIT converts the long
-conditional jump to a short PC-relative branch with the condition
-inverted, jumping over a long unconditional absolute jmp (j).
-
-This conversion will change the instruction offset mapping used for jumps,
-and may in turn result in more branch offset overflows. The JIT therefore
-dry-runs the translation until no more branches are converted and the
-offsets do not change anymore. There is an upper bound on this of course,
-and if the JIT hits that limit, the last two iterations are run with all
-branches being converted.
-
-Tail call count
-===============
-The current tail call count is stored in the 16-byte area of the caller's
-stack frame that is reserved for the callee in the o32 ABI. The value is
-initialized in the prologue, and propagated to the tail-callee by skipping
-the initialization instructions when emitting the tail call.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
----
- create mode 100644 arch/mips/net/bpf_jit_comp.c
- create mode 100644 arch/mips/net/bpf_jit_comp.h
- create mode 100644 arch/mips/net/bpf_jit_comp32.c
-
---- a/arch/mips/net/Makefile
-+++ b/arch/mips/net/Makefile
-@@ -2,4 +2,9 @@
- # MIPS networking code
-
- obj-$(CONFIG_MIPS_CBPF_JIT) += bpf_jit.o bpf_jit_asm.o
--obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o
-+
-+ifeq ($(CONFIG_32BIT),y)
-+ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o bpf_jit_comp32.o
-+else
-+ obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o
-+endif
---- /dev/null
-+++ b/arch/mips/net/bpf_jit_comp.c
-@@ -0,0 +1,1020 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/*
-+ * Just-In-Time compiler for eBPF bytecode on MIPS.
-+ * Implementation of JIT functions common to 32-bit and 64-bit CPUs.
-+ *
-+ * Copyright (c) 2021 Anyfi Networks AB.
-+ * Author: Johan Almbladh <johan.almbladh@gmail.com>
-+ *
-+ * Based on code and ideas from
-+ * Copyright (c) 2017 Cavium, Inc.
-+ * Copyright (c) 2017 Shubham Bansal <illusionist.neo@gmail.com>
-+ * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
-+ */
-+
-+/*
-+ * Code overview
-+ * =============
-+ *
-+ * - bpf_jit_comp.h
-+ * Common definitions and utilities.
-+ *
-+ * - bpf_jit_comp.c
-+ * Implementation of JIT top-level logic and exported JIT API functions.
-+ * Implementation of internal operations shared by 32-bit and 64-bit code.
-+ * JMP and ALU JIT control code, register control code, shared ALU and
-+ * JMP/JMP32 JIT operations.
-+ *
-+ * - bpf_jit_comp32.c
-+ * Implementation of functions to JIT prologue, epilogue and a single eBPF
-+ * instruction for 32-bit MIPS CPUs. The functions use shared operations
-+ * where possible, and implement the rest for 32-bit MIPS such as ALU64
-+ * operations.
-+ *
-+ * - bpf_jit_comp64.c
-+ * Ditto, for 64-bit MIPS CPUs.
-+ *
-+ * Zero and sign extension
-+ * ========================
-+ * 32-bit MIPS instructions on 64-bit MIPS registers use sign extension,
-+ * but the eBPF instruction set mandates zero extension. We let the verifier
-+ * insert explicit zero-extensions after 32-bit ALU operations, both for
-+ * 32-bit and 64-bit MIPS JITs. Conditional JMP32 operations on 64-bit MIPs
-+ * are JITed with sign extensions inserted when so expected.
-+ *
-+ * ALU operations
-+ * ==============
-+ * ALU operations on 32/64-bit MIPS and ALU64 operations on 64-bit MIPS are
-+ * JITed in the following steps. ALU64 operations on 32-bit MIPS are more
-+ * complicated and therefore only processed by special implementations in
-+ * step (3).
-+ *
-+ * 1) valid_alu_i:
-+ * Determine if an immediate operation can be emitted as such, or if
-+ * we must fall back to the register version.
-+ *
-+ * 2) rewrite_alu_i:
-+ * Convert BPF operation and immediate value to a canonical form for
-+ * JITing. In some degenerate cases this form may be a no-op.
-+ *
-+ * 3) emit_alu_{i,i64,r,64}:
-+ * Emit instructions for an ALU or ALU64 immediate or register operation.
-+ *
-+ * JMP operations
-+ * ==============
-+ * JMP and JMP32 operations require an JIT instruction offset table for
-+ * translating the jump offset. This table is computed by dry-running the
-+ * JIT without actually emitting anything. However, the computed PC-relative
-+ * offset may overflow the 18-bit offset field width of the native MIPS
-+ * branch instruction. In such cases, the long jump is converted into the
-+ * following sequence.
-+ *
-+ * <branch> !<cond> +2 Inverted PC-relative branch
-+ * nop Delay slot
-+ * j <offset> Unconditional absolute long jump
-+ * nop Delay slot
-+ *
-+ * Since this converted sequence alters the offset table, all offsets must
-+ * be re-calculated. This may in turn trigger new branch conversions, so
-+ * the process is repeated until no further changes are made. Normally it
-+ * completes in 1-2 iterations. If JIT_MAX_ITERATIONS should reached, we
-+ * fall back to converting every remaining jump operation. The branch
-+ * conversion is independent of how the JMP or JMP32 condition is JITed.
-+ *
-+ * JMP32 and JMP operations are JITed as follows.
-+ *
-+ * 1) setup_jmp_{i,r}:
-+ * Convert jump conditional and offset into a form that can be JITed.
-+ * This form may be a no-op, a canonical form, or an inverted PC-relative
-+ * jump if branch conversion is necessary.
-+ *
-+ * 2) valid_jmp_i:
-+ * Determine if an immediate operations can be emitted as such, or if
-+ * we must fall back to the register version. Applies to JMP32 for 32-bit
-+ * MIPS, and both JMP and JMP32 for 64-bit MIPS.
-+ *
-+ * 3) emit_jmp_{i,i64,r,r64}:
-+ * Emit instructions for an JMP or JMP32 immediate or register operation.
-+ *
-+ * 4) finish_jmp_{i,r}:
-+ * Emit any instructions needed to finish the jump. This includes a nop
-+ * for the delay slot if a branch was emitted, and a long absolute jump
-+ * if the branch was converted.
-+ */
-+
-+#include <linux/limits.h>
-+#include <linux/bitops.h>
-+#include <linux/errno.h>
-+#include <linux/filter.h>
-+#include <linux/bpf.h>
-+#include <linux/slab.h>
-+#include <asm/bitops.h>
-+#include <asm/cacheflush.h>
-+#include <asm/cpu-features.h>
-+#include <asm/isa-rev.h>
-+#include <asm/uasm.h>
-+
-+#include "bpf_jit_comp.h"
-+
-+/* Convenience macros for descriptor access */
-+#define CONVERTED(desc) ((desc) & JIT_DESC_CONVERT)
-+#define INDEX(desc) ((desc) & ~JIT_DESC_CONVERT)
-+
-+/*
-+ * Push registers on the stack, starting at a given depth from the stack
-+ * pointer and increasing. The next depth to be written is returned.
-+ */
-+int push_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth)
-+{
-+ int reg;
-+
-+ for (reg = 0; reg < BITS_PER_BYTE * sizeof(mask); reg++)
-+ if (mask & BIT(reg)) {
-+ if ((excl & BIT(reg)) == 0) {
-+ if (sizeof(long) == 4)
-+ emit(ctx, sw, reg, depth, MIPS_R_SP);
-+ else /* sizeof(long) == 8 */
-+ emit(ctx, sd, reg, depth, MIPS_R_SP);
-+ }
-+ depth += sizeof(long);
-+ }
-+
-+ ctx->stack_used = max((int)ctx->stack_used, depth);
-+ return depth;
-+}
-+
-+/*
-+ * Pop registers from the stack, starting at a given depth from the stack
-+ * pointer and increasing. The next depth to be read is returned.
-+ */
-+int pop_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth)
-+{
-+ int reg;
-+
-+ for (reg = 0; reg < BITS_PER_BYTE * sizeof(mask); reg++)
-+ if (mask & BIT(reg)) {
-+ if ((excl & BIT(reg)) == 0) {
-+ if (sizeof(long) == 4)
-+ emit(ctx, lw, reg, depth, MIPS_R_SP);
-+ else /* sizeof(long) == 8 */
-+ emit(ctx, ld, reg, depth, MIPS_R_SP);
-+ }
-+ depth += sizeof(long);
-+ }
-+
-+ return depth;
-+}
-+
-+/* Compute the 28-bit jump target address from a BPF program location */
-+int get_target(struct jit_context *ctx, u32 loc)
-+{
-+ u32 index = INDEX(ctx->descriptors[loc]);
-+ unsigned long pc = (unsigned long)&ctx->target[ctx->jit_index];
-+ unsigned long addr = (unsigned long)&ctx->target[index];
-+
-+ if (!ctx->target)
-+ return 0;
-+
-+ if ((addr ^ pc) & ~MIPS_JMP_MASK)
-+ return -1;
-+
-+ return addr & MIPS_JMP_MASK;
-+}
-+
-+/* Compute the PC-relative offset to relative BPF program offset */
-+int get_offset(const struct jit_context *ctx, int off)
-+{
-+ return (INDEX(ctx->descriptors[ctx->bpf_index + off]) -
-+ ctx->jit_index - 1) * sizeof(u32);
-+}
-+
-+/* dst = imm (register width) */
-+void emit_mov_i(struct jit_context *ctx, u8 dst, s32 imm)
-+{
-+ if (imm >= -0x8000 && imm <= 0x7fff) {
-+ emit(ctx, addiu, dst, MIPS_R_ZERO, imm);
-+ } else {
-+ emit(ctx, lui, dst, (s16)((u32)imm >> 16));
-+ emit(ctx, ori, dst, dst, (u16)(imm & 0xffff));
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* dst = src (register width) */
-+void emit_mov_r(struct jit_context *ctx, u8 dst, u8 src)
-+{
-+ emit(ctx, ori, dst, src, 0);
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Validate ALU immediate range */
-+bool valid_alu_i(u8 op, s32 imm)
-+{
-+ switch (BPF_OP(op)) {
-+ case BPF_NEG:
-+ case BPF_LSH:
-+ case BPF_RSH:
-+ case BPF_ARSH:
-+ /* All legal eBPF values are valid */
-+ return true;
-+ case BPF_ADD:
-+ /* imm must be 16 bits */
-+ return imm >= -0x8000 && imm <= 0x7fff;
-+ case BPF_SUB:
-+ /* -imm must be 16 bits */
-+ return imm >= -0x7fff && imm <= 0x8000;
-+ case BPF_AND:
-+ case BPF_OR:
-+ case BPF_XOR:
-+ /* imm must be 16 bits unsigned */
-+ return imm >= 0 && imm <= 0xffff;
-+ case BPF_MUL:
-+ /* imm must be zero or a positive power of two */
-+ return imm == 0 || (imm > 0 && is_power_of_2(imm));
-+ case BPF_DIV:
-+ case BPF_MOD:
-+ /* imm must be an 17-bit power of two */
-+ return (u32)imm <= 0x10000 && is_power_of_2((u32)imm);
-+ }
-+ return false;
-+}
-+
-+/* Rewrite ALU immediate operation */
-+bool rewrite_alu_i(u8 op, s32 imm, u8 *alu, s32 *val)
-+{
-+ bool act = true;
-+
-+ switch (BPF_OP(op)) {
-+ case BPF_LSH:
-+ case BPF_RSH:
-+ case BPF_ARSH:
-+ case BPF_ADD:
-+ case BPF_SUB:
-+ case BPF_OR:
-+ case BPF_XOR:
-+ /* imm == 0 is a no-op */
-+ act = imm != 0;
-+ break;
-+ case BPF_MUL:
-+ if (imm == 1) {
-+ /* dst * 1 is a no-op */
-+ act = false;
-+ } else if (imm == 0) {
-+ /* dst * 0 is dst & 0 */
-+ op = BPF_AND;
-+ } else {
-+ /* dst * (1 << n) is dst << n */
-+ op = BPF_LSH;
-+ imm = ilog2(abs(imm));
-+ }
-+ break;
-+ case BPF_DIV:
-+ if (imm == 1) {
-+ /* dst / 1 is a no-op */
-+ act = false;
-+ } else {
-+ /* dst / (1 << n) is dst >> n */
-+ op = BPF_RSH;
-+ imm = ilog2(imm);
-+ }
-+ break;
-+ case BPF_MOD:
-+ /* dst % (1 << n) is dst & ((1 << n) - 1) */
-+ op = BPF_AND;
-+ imm--;
-+ break;
-+ }
-+
-+ *alu = op;
-+ *val = imm;
-+ return act;
-+}
-+
-+/* ALU immediate operation (32-bit) */
-+void emit_alu_i(struct jit_context *ctx, u8 dst, s32 imm, u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = -dst */
-+ case BPF_NEG:
-+ emit(ctx, subu, dst, MIPS_R_ZERO, dst);
-+ break;
-+ /* dst = dst & imm */
-+ case BPF_AND:
-+ emit(ctx, andi, dst, dst, (u16)imm);
-+ break;
-+ /* dst = dst | imm */
-+ case BPF_OR:
-+ emit(ctx, ori, dst, dst, (u16)imm);
-+ break;
-+ /* dst = dst ^ imm */
-+ case BPF_XOR:
-+ emit(ctx, xori, dst, dst, (u16)imm);
-+ break;
-+ /* dst = dst << imm */
-+ case BPF_LSH:
-+ emit(ctx, sll, dst, dst, imm);
-+ break;
-+ /* dst = dst >> imm */
-+ case BPF_RSH:
-+ emit(ctx, srl, dst, dst, imm);
-+ break;
-+ /* dst = dst >> imm (arithmetic) */
-+ case BPF_ARSH:
-+ emit(ctx, sra, dst, dst, imm);
-+ break;
-+ /* dst = dst + imm */
-+ case BPF_ADD:
-+ emit(ctx, addiu, dst, dst, imm);
-+ break;
-+ /* dst = dst - imm */
-+ case BPF_SUB:
-+ emit(ctx, addiu, dst, dst, -imm);
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* ALU register operation (32-bit) */
-+void emit_alu_r(struct jit_context *ctx, u8 dst, u8 src, u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = dst & src */
-+ case BPF_AND:
-+ emit(ctx, and, dst, dst, src);
-+ break;
-+ /* dst = dst | src */
-+ case BPF_OR:
-+ emit(ctx, or, dst, dst, src);
-+ break;
-+ /* dst = dst ^ src */
-+ case BPF_XOR:
-+ emit(ctx, xor, dst, dst, src);
-+ break;
-+ /* dst = dst << src */
-+ case BPF_LSH:
-+ emit(ctx, sllv, dst, dst, src);
-+ break;
-+ /* dst = dst >> src */
-+ case BPF_RSH:
-+ emit(ctx, srlv, dst, dst, src);
-+ break;
-+ /* dst = dst >> src (arithmetic) */
-+ case BPF_ARSH:
-+ emit(ctx, srav, dst, dst, src);
-+ break;
-+ /* dst = dst + src */
-+ case BPF_ADD:
-+ emit(ctx, addu, dst, dst, src);
-+ break;
-+ /* dst = dst - src */
-+ case BPF_SUB:
-+ emit(ctx, subu, dst, dst, src);
-+ break;
-+ /* dst = dst * src */
-+ case BPF_MUL:
-+ if (cpu_has_mips32r1 || cpu_has_mips32r6) {
-+ emit(ctx, mul, dst, dst, src);
-+ } else {
-+ emit(ctx, multu, dst, src);
-+ emit(ctx, mflo, dst);
-+ }
-+ break;
-+ /* dst = dst / src */
-+ case BPF_DIV:
-+ if (cpu_has_mips32r6) {
-+ emit(ctx, divu_r6, dst, dst, src);
-+ } else {
-+ emit(ctx, divu, dst, src);
-+ emit(ctx, mflo, dst);
-+ }
-+ break;
-+ /* dst = dst % src */
-+ case BPF_MOD:
-+ if (cpu_has_mips32r6) {
-+ emit(ctx, modu, dst, dst, src);
-+ } else {
-+ emit(ctx, divu, dst, src);
-+ emit(ctx, mfhi, dst);
-+ }
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Atomic read-modify-write (32-bit) */
-+void emit_atomic_r(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 code)
-+{
-+ emit(ctx, ll, MIPS_R_T9, off, dst);
-+ switch (code) {
-+ case BPF_ADD:
-+ emit(ctx, addu, MIPS_R_T8, MIPS_R_T9, src);
-+ break;
-+ case BPF_AND:
-+ emit(ctx, and, MIPS_R_T8, MIPS_R_T9, src);
-+ break;
-+ case BPF_OR:
-+ emit(ctx, or, MIPS_R_T8, MIPS_R_T9, src);
-+ break;
-+ case BPF_XOR:
-+ emit(ctx, xor, MIPS_R_T8, MIPS_R_T9, src);
-+ break;
-+ }
-+ emit(ctx, sc, MIPS_R_T8, off, dst);
-+ emit(ctx, beqz, MIPS_R_T8, -16);
-+ emit(ctx, nop); /* Delay slot */
-+}
-+
-+/* Atomic compare-and-exchange (32-bit) */
-+void emit_cmpxchg_r(struct jit_context *ctx, u8 dst, u8 src, u8 res, s16 off)
-+{
-+ emit(ctx, ll, MIPS_R_T9, off, dst);
-+ emit(ctx, bne, MIPS_R_T9, res, 12);
-+ emit(ctx, move, MIPS_R_T8, src); /* Delay slot */
-+ emit(ctx, sc, MIPS_R_T8, off, dst);
-+ emit(ctx, beqz, MIPS_R_T8, -20);
-+ emit(ctx, move, res, MIPS_R_T9); /* Delay slot */
-+ clobber_reg(ctx, res);
-+}
-+
-+/* Swap bytes and truncate a register word or half word */
-+void emit_bswap_r(struct jit_context *ctx, u8 dst, u32 width)
-+{
-+ u8 tmp = MIPS_R_T8;
-+ u8 msk = MIPS_R_T9;
-+
-+ switch (width) {
-+ /* Swap bytes in a word */
-+ case 32:
-+ if (cpu_has_mips32r2 || cpu_has_mips32r6) {
-+ emit(ctx, wsbh, dst, dst);
-+ emit(ctx, rotr, dst, dst, 16);
-+ } else {
-+ emit(ctx, sll, tmp, dst, 16); /* tmp = dst << 16 */
-+ emit(ctx, srl, dst, dst, 16); /* dst = dst >> 16 */
-+ emit(ctx, or, dst, dst, tmp); /* dst = dst | tmp */
-+
-+ emit(ctx, lui, msk, 0xff); /* msk = 0x00ff0000 */
-+ emit(ctx, ori, msk, msk, 0xff); /* msk = msk | 0xff */
-+
-+ emit(ctx, and, tmp, dst, msk); /* tmp = dst & msk */
-+ emit(ctx, sll, tmp, tmp, 8); /* tmp = tmp << 8 */
-+ emit(ctx, srl, dst, dst, 8); /* dst = dst >> 8 */
-+ emit(ctx, and, dst, dst, msk); /* dst = dst & msk */
-+ emit(ctx, or, dst, dst, tmp); /* reg = dst | tmp */
-+ }
-+ break;
-+ /* Swap bytes in a half word */
-+ case 16:
-+ if (cpu_has_mips32r2 || cpu_has_mips32r6) {
-+ emit(ctx, wsbh, dst, dst);
-+ emit(ctx, andi, dst, dst, 0xffff);
-+ } else {
-+ emit(ctx, andi, tmp, dst, 0xff00); /* t = d & 0xff00 */
-+ emit(ctx, srl, tmp, tmp, 8); /* t = t >> 8 */
-+ emit(ctx, andi, dst, dst, 0x00ff); /* d = d & 0x00ff */
-+ emit(ctx, sll, dst, dst, 8); /* d = d << 8 */
-+ emit(ctx, or, dst, dst, tmp); /* d = d | t */
-+ }
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Validate jump immediate range */
-+bool valid_jmp_i(u8 op, s32 imm)
-+{
-+ switch (op) {
-+ case JIT_JNOP:
-+ /* Immediate value not used */
-+ return true;
-+ case BPF_JEQ:
-+ case BPF_JNE:
-+ /* No immediate operation */
-+ return false;
-+ case BPF_JSET:
-+ case JIT_JNSET:
-+ /* imm must be 16 bits unsigned */
-+ return imm >= 0 && imm <= 0xffff;
-+ case BPF_JGE:
-+ case BPF_JLT:
-+ case BPF_JSGE:
-+ case BPF_JSLT:
-+ /* imm must be 16 bits */
-+ return imm >= -0x8000 && imm <= 0x7fff;
-+ case BPF_JGT:
-+ case BPF_JLE:
-+ case BPF_JSGT:
-+ case BPF_JSLE:
-+ /* imm + 1 must be 16 bits */
-+ return imm >= -0x8001 && imm <= 0x7ffe;
-+ }
-+ return false;
-+}
-+
-+/* Invert a conditional jump operation */
-+static u8 invert_jmp(u8 op)
-+{
-+ switch (op) {
-+ case BPF_JA: return JIT_JNOP;
-+ case BPF_JEQ: return BPF_JNE;
-+ case BPF_JNE: return BPF_JEQ;
-+ case BPF_JSET: return JIT_JNSET;
-+ case BPF_JGT: return BPF_JLE;
-+ case BPF_JGE: return BPF_JLT;
-+ case BPF_JLT: return BPF_JGE;
-+ case BPF_JLE: return BPF_JGT;
-+ case BPF_JSGT: return BPF_JSLE;
-+ case BPF_JSGE: return BPF_JSLT;
-+ case BPF_JSLT: return BPF_JSGE;
-+ case BPF_JSLE: return BPF_JSGT;
-+ }
-+ return 0;
-+}
-+
-+/* Prepare a PC-relative jump operation */
-+static void setup_jmp(struct jit_context *ctx, u8 bpf_op,
-+ s16 bpf_off, u8 *jit_op, s32 *jit_off)
-+{
-+ u32 *descp = &ctx->descriptors[ctx->bpf_index];
-+ int op = bpf_op;
-+ int offset = 0;
-+
-+ /* Do not compute offsets on the first pass */
-+ if (INDEX(*descp) == 0)
-+ goto done;
-+
-+ /* Skip jumps never taken */
-+ if (bpf_op == JIT_JNOP)
-+ goto done;
-+
-+ /* Convert jumps always taken */
-+ if (bpf_op == BPF_JA)
-+ *descp |= JIT_DESC_CONVERT;
-+
-+ /*
-+ * Current ctx->jit_index points to the start of the branch preamble.
-+ * Since the preamble differs among different branch conditionals,
-+ * the current index cannot be used to compute the branch offset.
-+ * Instead, we use the offset table value for the next instruction,
-+ * which gives the index immediately after the branch delay slot.
-+ */
-+ if (!CONVERTED(*descp)) {
-+ int target = ctx->bpf_index + bpf_off + 1;
-+ int origin = ctx->bpf_index + 1;
-+
-+ offset = (INDEX(ctx->descriptors[target]) -
-+ INDEX(ctx->descriptors[origin]) + 1) * sizeof(u32);
-+ }
-+
-+ /*
-+ * The PC-relative branch offset field on MIPS is 18 bits signed,
-+ * so if the computed offset is larger than this we generate a an
-+ * absolute jump that we skip with an inverted conditional branch.
-+ */
-+ if (CONVERTED(*descp) || offset < -0x20000 || offset > 0x1ffff) {
-+ offset = 3 * sizeof(u32);
-+ op = invert_jmp(bpf_op);
-+ ctx->changes += !CONVERTED(*descp);
-+ *descp |= JIT_DESC_CONVERT;
-+ }
-+
-+done:
-+ *jit_off = offset;
-+ *jit_op = op;
-+}
-+
-+/* Prepare a PC-relative jump operation with immediate conditional */
-+void setup_jmp_i(struct jit_context *ctx, s32 imm, u8 width,
-+ u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off)
-+{
-+ bool always = false;
-+ bool never = false;
-+
-+ switch (bpf_op) {
-+ case BPF_JEQ:
-+ case BPF_JNE:
-+ break;
-+ case BPF_JSET:
-+ case BPF_JLT:
-+ never = imm == 0;
-+ break;
-+ case BPF_JGE:
-+ always = imm == 0;
-+ break;
-+ case BPF_JGT:
-+ never = (u32)imm == U32_MAX;
-+ break;
-+ case BPF_JLE:
-+ always = (u32)imm == U32_MAX;
-+ break;
-+ case BPF_JSGT:
-+ never = imm == S32_MAX && width == 32;
-+ break;
-+ case BPF_JSGE:
-+ always = imm == S32_MIN && width == 32;
-+ break;
-+ case BPF_JSLT:
-+ never = imm == S32_MIN && width == 32;
-+ break;
-+ case BPF_JSLE:
-+ always = imm == S32_MAX && width == 32;
-+ break;
-+ }
-+
-+ if (never)
-+ bpf_op = JIT_JNOP;
-+ if (always)
-+ bpf_op = BPF_JA;
-+ setup_jmp(ctx, bpf_op, bpf_off, jit_op, jit_off);
-+}
-+
-+/* Prepare a PC-relative jump operation with register conditional */
-+void setup_jmp_r(struct jit_context *ctx, bool same_reg,
-+ u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off)
-+{
-+ switch (bpf_op) {
-+ case BPF_JSET:
-+ break;
-+ case BPF_JEQ:
-+ case BPF_JGE:
-+ case BPF_JLE:
-+ case BPF_JSGE:
-+ case BPF_JSLE:
-+ if (same_reg)
-+ bpf_op = BPF_JA;
-+ break;
-+ case BPF_JNE:
-+ case BPF_JLT:
-+ case BPF_JGT:
-+ case BPF_JSGT:
-+ case BPF_JSLT:
-+ if (same_reg)
-+ bpf_op = JIT_JNOP;
-+ break;
-+ }
-+ setup_jmp(ctx, bpf_op, bpf_off, jit_op, jit_off);
-+}
-+
-+/* Finish a PC-relative jump operation */
-+int finish_jmp(struct jit_context *ctx, u8 jit_op, s16 bpf_off)
-+{
-+ /* Emit conditional branch delay slot */
-+ if (jit_op != JIT_JNOP)
-+ emit(ctx, nop);
-+ /*
-+ * Emit an absolute long jump with delay slot,
-+ * if the PC-relative branch was converted.
-+ */
-+ if (CONVERTED(ctx->descriptors[ctx->bpf_index])) {
-+ int target = get_target(ctx, ctx->bpf_index + bpf_off + 1);
-+
-+ if (target < 0)
-+ return -1;
-+ emit(ctx, j, target);
-+ emit(ctx, nop);
-+ }
-+ return 0;
-+}
-+
-+/* Jump immediate (32-bit) */
-+void emit_jmp_i(struct jit_context *ctx, u8 dst, s32 imm, s32 off, u8 op)
-+{
-+ switch (op) {
-+ /* No-op, used internally for branch optimization */
-+ case JIT_JNOP:
-+ break;
-+ /* PC += off if dst & imm */
-+ case BPF_JSET:
-+ emit(ctx, andi, MIPS_R_T9, dst, (u16)imm);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if (dst & imm) == 0 (not in BPF, used for long jumps) */
-+ case JIT_JNSET:
-+ emit(ctx, andi, MIPS_R_T9, dst, (u16)imm);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst > imm */
-+ case BPF_JGT:
-+ emit(ctx, sltiu, MIPS_R_T9, dst, imm + 1);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst >= imm */
-+ case BPF_JGE:
-+ emit(ctx, sltiu, MIPS_R_T9, dst, imm);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst < imm */
-+ case BPF_JLT:
-+ emit(ctx, sltiu, MIPS_R_T9, dst, imm);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst <= imm */
-+ case BPF_JLE:
-+ emit(ctx, sltiu, MIPS_R_T9, dst, imm + 1);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst > imm (signed) */
-+ case BPF_JSGT:
-+ emit(ctx, slti, MIPS_R_T9, dst, imm + 1);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst >= imm (signed) */
-+ case BPF_JSGE:
-+ emit(ctx, slti, MIPS_R_T9, dst, imm);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst < imm (signed) */
-+ case BPF_JSLT:
-+ emit(ctx, slti, MIPS_R_T9, dst, imm);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JSLE:
-+ emit(ctx, slti, MIPS_R_T9, dst, imm + 1);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ }
-+}
-+
-+/* Jump register (32-bit) */
-+void emit_jmp_r(struct jit_context *ctx, u8 dst, u8 src, s32 off, u8 op)
-+{
-+ switch (op) {
-+ /* No-op, used internally for branch optimization */
-+ case JIT_JNOP:
-+ break;
-+ /* PC += off if dst == src */
-+ case BPF_JEQ:
-+ emit(ctx, beq, dst, src, off);
-+ break;
-+ /* PC += off if dst != src */
-+ case BPF_JNE:
-+ emit(ctx, bne, dst, src, off);
-+ break;
-+ /* PC += off if dst & src */
-+ case BPF_JSET:
-+ emit(ctx, and, MIPS_R_T9, dst, src);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if (dst & imm) == 0 (not in BPF, used for long jumps) */
-+ case JIT_JNSET:
-+ emit(ctx, and, MIPS_R_T9, dst, src);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst > src */
-+ case BPF_JGT:
-+ emit(ctx, sltu, MIPS_R_T9, src, dst);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst >= src */
-+ case BPF_JGE:
-+ emit(ctx, sltu, MIPS_R_T9, dst, src);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst < src */
-+ case BPF_JLT:
-+ emit(ctx, sltu, MIPS_R_T9, dst, src);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst <= src */
-+ case BPF_JLE:
-+ emit(ctx, sltu, MIPS_R_T9, src, dst);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst > src (signed) */
-+ case BPF_JSGT:
-+ emit(ctx, slt, MIPS_R_T9, src, dst);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst >= src (signed) */
-+ case BPF_JSGE:
-+ emit(ctx, slt, MIPS_R_T9, dst, src);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst < src (signed) */
-+ case BPF_JSLT:
-+ emit(ctx, slt, MIPS_R_T9, dst, src);
-+ emit(ctx, bnez, MIPS_R_T9, off);
-+ break;
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JSLE:
-+ emit(ctx, slt, MIPS_R_T9, src, dst);
-+ emit(ctx, beqz, MIPS_R_T9, off);
-+ break;
-+ }
-+}
-+
-+/* Jump always */
-+int emit_ja(struct jit_context *ctx, s16 off)
-+{
-+ int target = get_target(ctx, ctx->bpf_index + off + 1);
-+
-+ if (target < 0)
-+ return -1;
-+ emit(ctx, j, target);
-+ emit(ctx, nop);
-+ return 0;
-+}
-+
-+/* Jump to epilogue */
-+int emit_exit(struct jit_context *ctx)
-+{
-+ int target = get_target(ctx, ctx->program->len);
-+
-+ if (target < 0)
-+ return -1;
-+ emit(ctx, j, target);
-+ emit(ctx, nop);
-+ return 0;
-+}
-+
-+/* Build the program body from eBPF bytecode */
-+static int build_body(struct jit_context *ctx)
-+{
-+ const struct bpf_prog *prog = ctx->program;
-+ unsigned int i;
-+
-+ ctx->stack_used = 0;
-+ for (i = 0; i < prog->len; i++) {
-+ const struct bpf_insn *insn = &prog->insnsi[i];
-+ u32 *descp = &ctx->descriptors[i];
-+ int ret;
-+
-+ access_reg(ctx, insn->src_reg);
-+ access_reg(ctx, insn->dst_reg);
-+
-+ ctx->bpf_index = i;
-+ if (ctx->target == NULL) {
-+ ctx->changes += INDEX(*descp) != ctx->jit_index;
-+ *descp &= JIT_DESC_CONVERT;
-+ *descp |= ctx->jit_index;
-+ }
-+
-+ ret = build_insn(insn, ctx);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (ret > 0) {
-+ i++;
-+ if (ctx->target == NULL)
-+ descp[1] = ctx->jit_index;
-+ }
-+ }
-+
-+ /* Store the end offset, where the epilogue begins */
-+ ctx->descriptors[prog->len] = ctx->jit_index;
-+ return 0;
-+}
-+
-+/* Set the branch conversion flag on all instructions */
-+static void set_convert_flag(struct jit_context *ctx, bool enable)
-+{
-+ const struct bpf_prog *prog = ctx->program;
-+ u32 flag = enable ? JIT_DESC_CONVERT : 0;
-+ unsigned int i;
-+
-+ for (i = 0; i <= prog->len; i++)
-+ ctx->descriptors[i] = INDEX(ctx->descriptors[i]) | flag;
-+}
-+
-+static void jit_fill_hole(void *area, unsigned int size)
-+{
-+ u32 *p;
-+
-+ /* We are guaranteed to have aligned memory. */
-+ for (p = area; size >= sizeof(u32); size -= sizeof(u32))
-+ uasm_i_break(&p, BRK_BUG); /* Increments p */
-+}
-+
-+bool bpf_jit_needs_zext(void)
-+{
-+ return true;
-+}
-+
-+struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
-+{
-+ struct bpf_prog *tmp, *orig_prog = prog;
-+ struct bpf_binary_header *header = NULL;
-+ struct jit_context ctx;
-+ bool tmp_blinded = false;
-+ unsigned int tmp_idx;
-+ unsigned int image_size;
-+ u8 *image_ptr;
-+ int tries;
-+
-+ /*
-+ * If BPF JIT was not enabled then we must fall back to
-+ * the interpreter.
-+ */
-+ if (!prog->jit_requested)
-+ return orig_prog;
-+ /*
-+ * If constant blinding was enabled and we failed during blinding
-+ * then we must fall back to the interpreter. Otherwise, we save
-+ * the new JITed code.
-+ */
-+ tmp = bpf_jit_blind_constants(prog);
-+ if (IS_ERR(tmp))
-+ return orig_prog;
-+ if (tmp != prog) {
-+ tmp_blinded = true;
-+ prog = tmp;
-+ }
-+
-+ memset(&ctx, 0, sizeof(ctx));
-+ ctx.program = prog;
-+
-+ /*
-+ * Not able to allocate memory for descriptors[], then
-+ * we must fall back to the interpreter
-+ */
-+ ctx.descriptors = kcalloc(prog->len + 1, sizeof(*ctx.descriptors),
-+ GFP_KERNEL);
-+ if (ctx.descriptors == NULL)
-+ goto out_err;
-+
-+ /* First pass discovers used resources */
-+ if (build_body(&ctx) < 0)
-+ goto out_err;
-+ /*
-+ * Second pass computes instruction offsets.
-+ * If any PC-relative branches are out of range, a sequence of
-+ * a PC-relative branch + a jump is generated, and we have to
-+ * try again from the beginning to generate the new offsets.
-+ * This is done until no additional conversions are necessary.
-+ * The last two iterations are done with all branches being
-+ * converted, to guarantee offset table convergence within a
-+ * fixed number of iterations.
-+ */
-+ ctx.jit_index = 0;
-+ build_prologue(&ctx);
-+ tmp_idx = ctx.jit_index;
-+
-+ tries = JIT_MAX_ITERATIONS;
-+ do {
-+ ctx.jit_index = tmp_idx;
-+ ctx.changes = 0;
-+ if (tries == 2)
-+ set_convert_flag(&ctx, true);
-+ if (build_body(&ctx) < 0)
-+ goto out_err;
-+ } while (ctx.changes > 0 && --tries > 0);
-+
-+ if (WARN_ONCE(ctx.changes > 0, "JIT offsets failed to converge"))
-+ goto out_err;
-+
-+ build_epilogue(&ctx, MIPS_R_RA);
-+
-+ /* Now we know the size of the structure to make */
-+ image_size = sizeof(u32) * ctx.jit_index;
-+ header = bpf_jit_binary_alloc(image_size, &image_ptr,
-+ sizeof(u32), jit_fill_hole);
-+ /*
-+ * Not able to allocate memory for the structure then
-+ * we must fall back to the interpretation
-+ */
-+ if (header == NULL)
-+ goto out_err;
-+
-+ /* Actual pass to generate final JIT code */
-+ ctx.target = (u32 *)image_ptr;
-+ ctx.jit_index = 0;
-+
-+ /*
-+ * If building the JITed code fails somehow,
-+ * we fall back to the interpretation.
-+ */
-+ build_prologue(&ctx);
-+ if (build_body(&ctx) < 0)
-+ goto out_err;
-+ build_epilogue(&ctx, MIPS_R_RA);
-+
-+ /* Populate line info meta data */
-+ set_convert_flag(&ctx, false);
-+ bpf_prog_fill_jited_linfo(prog, &ctx.descriptors[1]);
-+
-+ /* Set as read-only exec and flush instruction cache */
-+ bpf_jit_binary_lock_ro(header);
-+ flush_icache_range((unsigned long)header,
-+ (unsigned long)&ctx.target[ctx.jit_index]);
-+
-+ if (bpf_jit_enable > 1)
-+ bpf_jit_dump(prog->len, image_size, 2, ctx.target);
-+
-+ prog->bpf_func = (void *)ctx.target;
-+ prog->jited = 1;
-+ prog->jited_len = image_size;
-+
-+out:
-+ if (tmp_blinded)
-+ bpf_jit_prog_release_other(prog, prog == orig_prog ?
-+ tmp : orig_prog);
-+ kfree(ctx.descriptors);
-+ return prog;
-+
-+out_err:
-+ prog = orig_prog;
-+ if (header)
-+ bpf_jit_binary_free(header);
-+ goto out;
-+}
---- /dev/null
-+++ b/arch/mips/net/bpf_jit_comp.h
-@@ -0,0 +1,211 @@
-+/* SPDX-License-Identifier: GPL-2.0-only */
-+/*
-+ * Just-In-Time compiler for eBPF bytecode on 32-bit and 64-bit MIPS.
-+ *
-+ * Copyright (c) 2021 Anyfi Networks AB.
-+ * Author: Johan Almbladh <johan.almbladh@gmail.com>
-+ *
-+ * Based on code and ideas from
-+ * Copyright (c) 2017 Cavium, Inc.
-+ * Copyright (c) 2017 Shubham Bansal <illusionist.neo@gmail.com>
-+ * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
-+ */
-+
-+#ifndef _BPF_JIT_COMP_H
-+#define _BPF_JIT_COMP_H
-+
-+/* MIPS registers */
-+#define MIPS_R_ZERO 0 /* Const zero */
-+#define MIPS_R_AT 1 /* Asm temp */
-+#define MIPS_R_V0 2 /* Result */
-+#define MIPS_R_V1 3 /* Result */
-+#define MIPS_R_A0 4 /* Argument */
-+#define MIPS_R_A1 5 /* Argument */
-+#define MIPS_R_A2 6 /* Argument */
-+#define MIPS_R_A3 7 /* Argument */
-+#define MIPS_R_A4 8 /* Arg (n64) */
-+#define MIPS_R_A5 9 /* Arg (n64) */
-+#define MIPS_R_A6 10 /* Arg (n64) */
-+#define MIPS_R_A7 11 /* Arg (n64) */
-+#define MIPS_R_T0 8 /* Temp (o32) */
-+#define MIPS_R_T1 9 /* Temp (o32) */
-+#define MIPS_R_T2 10 /* Temp (o32) */
-+#define MIPS_R_T3 11 /* Temp (o32) */
-+#define MIPS_R_T4 12 /* Temporary */
-+#define MIPS_R_T5 13 /* Temporary */
-+#define MIPS_R_T6 14 /* Temporary */
-+#define MIPS_R_T7 15 /* Temporary */
-+#define MIPS_R_S0 16 /* Saved */
-+#define MIPS_R_S1 17 /* Saved */
-+#define MIPS_R_S2 18 /* Saved */
-+#define MIPS_R_S3 19 /* Saved */
-+#define MIPS_R_S4 20 /* Saved */
-+#define MIPS_R_S5 21 /* Saved */
-+#define MIPS_R_S6 22 /* Saved */
-+#define MIPS_R_S7 23 /* Saved */
-+#define MIPS_R_T8 24 /* Temporary */
-+#define MIPS_R_T9 25 /* Temporary */
-+/* MIPS_R_K0 26 Reserved */
-+/* MIPS_R_K1 27 Reserved */
-+#define MIPS_R_GP 28 /* Global ptr */
-+#define MIPS_R_SP 29 /* Stack ptr */
-+#define MIPS_R_FP 30 /* Frame ptr */
-+#define MIPS_R_RA 31 /* Return */
-+
-+/*
-+ * Jump address mask for immediate jumps. The four most significant bits
-+ * must be equal to PC.
-+ */
-+#define MIPS_JMP_MASK 0x0fffffffUL
-+
-+/* Maximum number of iterations in offset table computation */
-+#define JIT_MAX_ITERATIONS 8
-+
-+/*
-+ * Jump pseudo-instructions used internally
-+ * for branch conversion and branch optimization.
-+ */
-+#define JIT_JNSET 0xe0
-+#define JIT_JNOP 0xf0
-+
-+/* Descriptor flag for PC-relative branch conversion */
-+#define JIT_DESC_CONVERT BIT(31)
-+
-+/* JIT context for an eBPF program */
-+struct jit_context {
-+ struct bpf_prog *program; /* The eBPF program being JITed */
-+ u32 *descriptors; /* eBPF to JITed CPU insn descriptors */
-+ u32 *target; /* JITed code buffer */
-+ u32 bpf_index; /* Index of current BPF program insn */
-+ u32 jit_index; /* Index of current JIT target insn */
-+ u32 changes; /* Number of PC-relative branch conv */
-+ u32 accessed; /* Bit mask of read eBPF registers */
-+ u32 clobbered; /* Bit mask of modified CPU registers */
-+ u32 stack_size; /* Total allocated stack size in bytes */
-+ u32 saved_size; /* Size of callee-saved registers */
-+ u32 stack_used; /* Stack size used for function calls */
-+};
-+
-+/* Emit the instruction if the JIT memory space has been allocated */
-+#define emit(ctx, func, ...) \
-+do { \
-+ if ((ctx)->target != NULL) { \
-+ u32 *p = &(ctx)->target[ctx->jit_index]; \
-+ uasm_i_##func(&p, ##__VA_ARGS__); \
-+ } \
-+ (ctx)->jit_index++; \
-+} while (0)
-+
-+/*
-+ * Mark a BPF register as accessed, it needs to be
-+ * initialized by the program if expected, e.g. FP.
-+ */
-+static inline void access_reg(struct jit_context *ctx, u8 reg)
-+{
-+ ctx->accessed |= BIT(reg);
-+}
-+
-+/*
-+ * Mark a CPU register as clobbered, it needs to be
-+ * saved/restored by the program if callee-saved.
-+ */
-+static inline void clobber_reg(struct jit_context *ctx, u8 reg)
-+{
-+ ctx->clobbered |= BIT(reg);
-+}
-+
-+/*
-+ * Push registers on the stack, starting at a given depth from the stack
-+ * pointer and increasing. The next depth to be written is returned.
-+ */
-+int push_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth);
-+
-+/*
-+ * Pop registers from the stack, starting at a given depth from the stack
-+ * pointer and increasing. The next depth to be read is returned.
-+ */
-+int pop_regs(struct jit_context *ctx, u32 mask, u32 excl, int depth);
-+
-+/* Compute the 28-bit jump target address from a BPF program location */
-+int get_target(struct jit_context *ctx, u32 loc);
-+
-+/* Compute the PC-relative offset to relative BPF program offset */
-+int get_offset(const struct jit_context *ctx, int off);
-+
-+/* dst = imm (32-bit) */
-+void emit_mov_i(struct jit_context *ctx, u8 dst, s32 imm);
-+
-+/* dst = src (32-bit) */
-+void emit_mov_r(struct jit_context *ctx, u8 dst, u8 src);
-+
-+/* Validate ALU/ALU64 immediate range */
-+bool valid_alu_i(u8 op, s32 imm);
-+
-+/* Rewrite ALU/ALU64 immediate operation */
-+bool rewrite_alu_i(u8 op, s32 imm, u8 *alu, s32 *val);
-+
-+/* ALU immediate operation (32-bit) */
-+void emit_alu_i(struct jit_context *ctx, u8 dst, s32 imm, u8 op);
-+
-+/* ALU register operation (32-bit) */
-+void emit_alu_r(struct jit_context *ctx, u8 dst, u8 src, u8 op);
-+
-+/* Atomic read-modify-write (32-bit) */
-+void emit_atomic_r(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 code);
-+
-+/* Atomic compare-and-exchange (32-bit) */
-+void emit_cmpxchg_r(struct jit_context *ctx, u8 dst, u8 src, u8 res, s16 off);
-+
-+/* Swap bytes and truncate a register word or half word */
-+void emit_bswap_r(struct jit_context *ctx, u8 dst, u32 width);
-+
-+/* Validate JMP/JMP32 immediate range */
-+bool valid_jmp_i(u8 op, s32 imm);
-+
-+/* Prepare a PC-relative jump operation with immediate conditional */
-+void setup_jmp_i(struct jit_context *ctx, s32 imm, u8 width,
-+ u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off);
-+
-+/* Prepare a PC-relative jump operation with register conditional */
-+void setup_jmp_r(struct jit_context *ctx, bool same_reg,
-+ u8 bpf_op, s16 bpf_off, u8 *jit_op, s32 *jit_off);
-+
-+/* Finish a PC-relative jump operation */
-+int finish_jmp(struct jit_context *ctx, u8 jit_op, s16 bpf_off);
-+
-+/* Conditional JMP/JMP32 immediate */
-+void emit_jmp_i(struct jit_context *ctx, u8 dst, s32 imm, s32 off, u8 op);
-+
-+/* Conditional JMP/JMP32 register */
-+void emit_jmp_r(struct jit_context *ctx, u8 dst, u8 src, s32 off, u8 op);
-+
-+/* Jump always */
-+int emit_ja(struct jit_context *ctx, s16 off);
-+
-+/* Jump to epilogue */
-+int emit_exit(struct jit_context *ctx);
-+
-+/*
-+ * Build program prologue to set up the stack and registers.
-+ * This function is implemented separately for 32-bit and 64-bit JITs.
-+ */
-+void build_prologue(struct jit_context *ctx);
-+
-+/*
-+ * Build the program epilogue to restore the stack and registers.
-+ * This function is implemented separately for 32-bit and 64-bit JITs.
-+ */
-+void build_epilogue(struct jit_context *ctx, int dest_reg);
-+
-+/*
-+ * Convert an eBPF instruction to native instruction, i.e
-+ * JITs an eBPF instruction.
-+ * Returns :
-+ * 0 - Successfully JITed an 8-byte eBPF instruction
-+ * >0 - Successfully JITed a 16-byte eBPF instruction
-+ * <0 - Failed to JIT.
-+ * This function is implemented separately for 32-bit and 64-bit JITs.
-+ */
-+int build_insn(const struct bpf_insn *insn, struct jit_context *ctx);
-+
-+#endif /* _BPF_JIT_COMP_H */
---- /dev/null
-+++ b/arch/mips/net/bpf_jit_comp32.c
-@@ -0,0 +1,1741 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/*
-+ * Just-In-Time compiler for eBPF bytecode on MIPS.
-+ * Implementation of JIT functions for 32-bit CPUs.
-+ *
-+ * Copyright (c) 2021 Anyfi Networks AB.
-+ * Author: Johan Almbladh <johan.almbladh@gmail.com>
-+ *
-+ * Based on code and ideas from
-+ * Copyright (c) 2017 Cavium, Inc.
-+ * Copyright (c) 2017 Shubham Bansal <illusionist.neo@gmail.com>
-+ * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
-+ */
-+
-+#include <linux/math64.h>
-+#include <linux/errno.h>
-+#include <linux/filter.h>
-+#include <linux/bpf.h>
-+#include <asm/cpu-features.h>
-+#include <asm/isa-rev.h>
-+#include <asm/uasm.h>
-+
-+#include "bpf_jit_comp.h"
-+
-+/* MIPS a4-a7 are not available in the o32 ABI */
-+#undef MIPS_R_A4
-+#undef MIPS_R_A5
-+#undef MIPS_R_A6
-+#undef MIPS_R_A7
-+
-+/* Stack is 8-byte aligned in o32 ABI */
-+#define MIPS_STACK_ALIGNMENT 8
-+
-+/*
-+ * The top 16 bytes of a stack frame is reserved for the callee in O32 ABI.
-+ * This corresponds to stack space for register arguments a0-a3.
-+ */
-+#define JIT_RESERVED_STACK 16
-+
-+/* Temporary 64-bit register used by JIT */
-+#define JIT_REG_TMP MAX_BPF_JIT_REG
-+
-+/*
-+ * Number of prologue bytes to skip when doing a tail call.
-+ * Tail call count (TCC) initialization (8 bytes) always, plus
-+ * R0-to-v0 assignment (4 bytes) if big endian.
-+ */
-+#ifdef __BIG_ENDIAN
-+#define JIT_TCALL_SKIP 12
-+#else
-+#define JIT_TCALL_SKIP 8
-+#endif
-+
-+/* CPU registers holding the callee return value */
-+#define JIT_RETURN_REGS \
-+ (BIT(MIPS_R_V0) | \
-+ BIT(MIPS_R_V1))
-+
-+/* CPU registers arguments passed to callee directly */
-+#define JIT_ARG_REGS \
-+ (BIT(MIPS_R_A0) | \
-+ BIT(MIPS_R_A1) | \
-+ BIT(MIPS_R_A2) | \
-+ BIT(MIPS_R_A3))
-+
-+/* CPU register arguments passed to callee on stack */
-+#define JIT_STACK_REGS \
-+ (BIT(MIPS_R_T0) | \
-+ BIT(MIPS_R_T1) | \
-+ BIT(MIPS_R_T2) | \
-+ BIT(MIPS_R_T3) | \
-+ BIT(MIPS_R_T4) | \
-+ BIT(MIPS_R_T5))
-+
-+/* Caller-saved CPU registers */
-+#define JIT_CALLER_REGS \
-+ (JIT_RETURN_REGS | \
-+ JIT_ARG_REGS | \
-+ JIT_STACK_REGS)
-+
-+/* Callee-saved CPU registers */
-+#define JIT_CALLEE_REGS \
-+ (BIT(MIPS_R_S0) | \
-+ BIT(MIPS_R_S1) | \
-+ BIT(MIPS_R_S2) | \
-+ BIT(MIPS_R_S3) | \
-+ BIT(MIPS_R_S4) | \
-+ BIT(MIPS_R_S5) | \
-+ BIT(MIPS_R_S6) | \
-+ BIT(MIPS_R_S7) | \
-+ BIT(MIPS_R_GP) | \
-+ BIT(MIPS_R_FP) | \
-+ BIT(MIPS_R_RA))
-+
-+/*
-+ * Mapping of 64-bit eBPF registers to 32-bit native MIPS registers.
-+ *
-+ * 1) Native register pairs are ordered according to CPU endiannes, following
-+ * the MIPS convention for passing 64-bit arguments and return values.
-+ * 2) The eBPF return value, arguments and callee-saved registers are mapped
-+ * to their native MIPS equivalents.
-+ * 3) Since the 32 highest bits in the eBPF FP register are always zero,
-+ * only one general-purpose register is actually needed for the mapping.
-+ * We use the fp register for this purpose, and map the highest bits to
-+ * the MIPS register r0 (zero).
-+ * 4) We use the MIPS gp and at registers as internal temporary registers
-+ * for constant blinding. The gp register is callee-saved.
-+ * 5) One 64-bit temporary register is mapped for use when sign-extending
-+ * immediate operands. MIPS registers t6-t9 are available to the JIT
-+ * for as temporaries when implementing complex 64-bit operations.
-+ *
-+ * With this scheme all eBPF registers are being mapped to native MIPS
-+ * registers without having to use any stack scratch space. The direct
-+ * register mapping (2) simplifies the handling of function calls.
-+ */
-+static const u8 bpf2mips32[][2] = {
-+ /* Return value from in-kernel function, and exit value from eBPF */
-+ [BPF_REG_0] = {MIPS_R_V1, MIPS_R_V0},
-+ /* Arguments from eBPF program to in-kernel function */
-+ [BPF_REG_1] = {MIPS_R_A1, MIPS_R_A0},
-+ [BPF_REG_2] = {MIPS_R_A3, MIPS_R_A2},
-+ /* Remaining arguments, to be passed on the stack per O32 ABI */
-+ [BPF_REG_3] = {MIPS_R_T1, MIPS_R_T0},
-+ [BPF_REG_4] = {MIPS_R_T3, MIPS_R_T2},
-+ [BPF_REG_5] = {MIPS_R_T5, MIPS_R_T4},
-+ /* Callee-saved registers that in-kernel function will preserve */
-+ [BPF_REG_6] = {MIPS_R_S1, MIPS_R_S0},
-+ [BPF_REG_7] = {MIPS_R_S3, MIPS_R_S2},
-+ [BPF_REG_8] = {MIPS_R_S5, MIPS_R_S4},
-+ [BPF_REG_9] = {MIPS_R_S7, MIPS_R_S6},
-+ /* Read-only frame pointer to access the eBPF stack */
-+#ifdef __BIG_ENDIAN
-+ [BPF_REG_FP] = {MIPS_R_FP, MIPS_R_ZERO},
-+#else
-+ [BPF_REG_FP] = {MIPS_R_ZERO, MIPS_R_FP},
-+#endif
-+ /* Temporary register for blinding constants */
-+ [BPF_REG_AX] = {MIPS_R_GP, MIPS_R_AT},
-+ /* Temporary register for internal JIT use */
-+ [JIT_REG_TMP] = {MIPS_R_T7, MIPS_R_T6},
-+};
-+
-+/* Get low CPU register for a 64-bit eBPF register mapping */
-+static inline u8 lo(const u8 reg[])
-+{
-+#ifdef __BIG_ENDIAN
-+ return reg[0];
-+#else
-+ return reg[1];
-+#endif
-+}
-+
-+/* Get high CPU register for a 64-bit eBPF register mapping */
-+static inline u8 hi(const u8 reg[])
-+{
-+#ifdef __BIG_ENDIAN
-+ return reg[1];
-+#else
-+ return reg[0];
-+#endif
-+}
-+
-+/*
-+ * Mark a 64-bit CPU register pair as clobbered, it needs to be
-+ * saved/restored by the program if callee-saved.
-+ */
-+static void clobber_reg64(struct jit_context *ctx, const u8 reg[])
-+{
-+ clobber_reg(ctx, reg[0]);
-+ clobber_reg(ctx, reg[1]);
-+}
-+
-+/* dst = imm (sign-extended) */
-+static void emit_mov_se_i64(struct jit_context *ctx, const u8 dst[], s32 imm)
-+{
-+ emit_mov_i(ctx, lo(dst), imm);
-+ if (imm < 0)
-+ emit(ctx, addiu, hi(dst), MIPS_R_ZERO, -1);
-+ else
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* Zero extension, if verifier does not do it for us */
-+static void emit_zext_ver(struct jit_context *ctx, const u8 dst[])
-+{
-+ if (!ctx->program->aux->verifier_zext) {
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ clobber_reg(ctx, hi(dst));
-+ }
-+}
-+
-+/* Load delay slot, if ISA mandates it */
-+static void emit_load_delay(struct jit_context *ctx)
-+{
-+ if (!cpu_has_mips_2_3_4_5_r)
-+ emit(ctx, nop);
-+}
-+
-+/* ALU immediate operation (64-bit) */
-+static void emit_alu_i64(struct jit_context *ctx,
-+ const u8 dst[], s32 imm, u8 op)
-+{
-+ u8 src = MIPS_R_T6;
-+
-+ /*
-+ * ADD/SUB with all but the max negative imm can be handled by
-+ * inverting the operation and the imm value, saving one insn.
-+ */
-+ if (imm > S32_MIN && imm < 0)
-+ switch (op) {
-+ case BPF_ADD:
-+ op = BPF_SUB;
-+ imm = -imm;
-+ break;
-+ case BPF_SUB:
-+ op = BPF_ADD;
-+ imm = -imm;
-+ break;
-+ }
-+
-+ /* Move immediate to temporary register */
-+ emit_mov_i(ctx, src, imm);
-+
-+ switch (op) {
-+ /* dst = dst + imm */
-+ case BPF_ADD:
-+ emit(ctx, addu, lo(dst), lo(dst), src);
-+ emit(ctx, sltu, MIPS_R_T9, lo(dst), src);
-+ emit(ctx, addu, hi(dst), hi(dst), MIPS_R_T9);
-+ if (imm < 0)
-+ emit(ctx, addiu, hi(dst), hi(dst), -1);
-+ break;
-+ /* dst = dst - imm */
-+ case BPF_SUB:
-+ emit(ctx, sltu, MIPS_R_T9, lo(dst), src);
-+ emit(ctx, subu, lo(dst), lo(dst), src);
-+ emit(ctx, subu, hi(dst), hi(dst), MIPS_R_T9);
-+ if (imm < 0)
-+ emit(ctx, addiu, hi(dst), hi(dst), 1);
-+ break;
-+ /* dst = dst | imm */
-+ case BPF_OR:
-+ emit(ctx, or, lo(dst), lo(dst), src);
-+ if (imm < 0)
-+ emit(ctx, addiu, hi(dst), MIPS_R_ZERO, -1);
-+ break;
-+ /* dst = dst & imm */
-+ case BPF_AND:
-+ emit(ctx, and, lo(dst), lo(dst), src);
-+ if (imm >= 0)
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ break;
-+ /* dst = dst ^ imm */
-+ case BPF_XOR:
-+ emit(ctx, xor, lo(dst), lo(dst), src);
-+ if (imm < 0) {
-+ emit(ctx, subu, hi(dst), MIPS_R_ZERO, hi(dst));
-+ emit(ctx, addiu, hi(dst), hi(dst), -1);
-+ }
-+ break;
-+ }
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* ALU register operation (64-bit) */
-+static void emit_alu_r64(struct jit_context *ctx,
-+ const u8 dst[], const u8 src[], u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = dst + src */
-+ case BPF_ADD:
-+ if (src == dst) {
-+ emit(ctx, srl, MIPS_R_T9, lo(dst), 31);
-+ emit(ctx, addu, lo(dst), lo(dst), lo(dst));
-+ } else {
-+ emit(ctx, addu, lo(dst), lo(dst), lo(src));
-+ emit(ctx, sltu, MIPS_R_T9, lo(dst), lo(src));
-+ }
-+ emit(ctx, addu, hi(dst), hi(dst), hi(src));
-+ emit(ctx, addu, hi(dst), hi(dst), MIPS_R_T9);
-+ break;
-+ /* dst = dst - src */
-+ case BPF_SUB:
-+ emit(ctx, sltu, MIPS_R_T9, lo(dst), lo(src));
-+ emit(ctx, subu, lo(dst), lo(dst), lo(src));
-+ emit(ctx, subu, hi(dst), hi(dst), hi(src));
-+ emit(ctx, subu, hi(dst), hi(dst), MIPS_R_T9);
-+ break;
-+ /* dst = dst | src */
-+ case BPF_OR:
-+ emit(ctx, or, lo(dst), lo(dst), lo(src));
-+ emit(ctx, or, hi(dst), hi(dst), hi(src));
-+ break;
-+ /* dst = dst & src */
-+ case BPF_AND:
-+ emit(ctx, and, lo(dst), lo(dst), lo(src));
-+ emit(ctx, and, hi(dst), hi(dst), hi(src));
-+ break;
-+ /* dst = dst ^ src */
-+ case BPF_XOR:
-+ emit(ctx, xor, lo(dst), lo(dst), lo(src));
-+ emit(ctx, xor, hi(dst), hi(dst), hi(src));
-+ break;
-+ }
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* ALU invert (64-bit) */
-+static void emit_neg_i64(struct jit_context *ctx, const u8 dst[])
-+{
-+ emit(ctx, sltu, MIPS_R_T9, MIPS_R_ZERO, lo(dst));
-+ emit(ctx, subu, lo(dst), MIPS_R_ZERO, lo(dst));
-+ emit(ctx, subu, hi(dst), MIPS_R_ZERO, hi(dst));
-+ emit(ctx, subu, hi(dst), hi(dst), MIPS_R_T9);
-+
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* ALU shift immediate (64-bit) */
-+static void emit_shift_i64(struct jit_context *ctx,
-+ const u8 dst[], u32 imm, u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = dst << imm */
-+ case BPF_LSH:
-+ if (imm < 32) {
-+ emit(ctx, srl, MIPS_R_T9, lo(dst), 32 - imm);
-+ emit(ctx, sll, lo(dst), lo(dst), imm);
-+ emit(ctx, sll, hi(dst), hi(dst), imm);
-+ emit(ctx, or, hi(dst), hi(dst), MIPS_R_T9);
-+ } else {
-+ emit(ctx, sll, hi(dst), lo(dst), imm - 32);
-+ emit(ctx, move, lo(dst), MIPS_R_ZERO);
-+ }
-+ break;
-+ /* dst = dst >> imm */
-+ case BPF_RSH:
-+ if (imm < 32) {
-+ emit(ctx, sll, MIPS_R_T9, hi(dst), 32 - imm);
-+ emit(ctx, srl, lo(dst), lo(dst), imm);
-+ emit(ctx, srl, hi(dst), hi(dst), imm);
-+ emit(ctx, or, lo(dst), lo(dst), MIPS_R_T9);
-+ } else {
-+ emit(ctx, srl, lo(dst), hi(dst), imm - 32);
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ }
-+ break;
-+ /* dst = dst >> imm (arithmetic) */
-+ case BPF_ARSH:
-+ if (imm < 32) {
-+ emit(ctx, sll, MIPS_R_T9, hi(dst), 32 - imm);
-+ emit(ctx, srl, lo(dst), lo(dst), imm);
-+ emit(ctx, sra, hi(dst), hi(dst), imm);
-+ emit(ctx, or, lo(dst), lo(dst), MIPS_R_T9);
-+ } else {
-+ emit(ctx, sra, lo(dst), hi(dst), imm - 32);
-+ emit(ctx, sra, hi(dst), hi(dst), 31);
-+ }
-+ break;
-+ }
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* ALU shift register (64-bit) */
-+static void emit_shift_r64(struct jit_context *ctx,
-+ const u8 dst[], u8 src, u8 op)
-+{
-+ u8 t1 = MIPS_R_T8;
-+ u8 t2 = MIPS_R_T9;
-+
-+ emit(ctx, andi, t1, src, 32); /* t1 = src & 32 */
-+ emit(ctx, beqz, t1, 16); /* PC += 16 if t1 == 0 */
-+ emit(ctx, nor, t2, src, MIPS_R_ZERO); /* t2 = ~src (delay slot) */
-+
-+ switch (BPF_OP(op)) {
-+ /* dst = dst << src */
-+ case BPF_LSH:
-+ /* Next: shift >= 32 */
-+ emit(ctx, sllv, hi(dst), lo(dst), src); /* dh = dl << src */
-+ emit(ctx, move, lo(dst), MIPS_R_ZERO); /* dl = 0 */
-+ emit(ctx, b, 20); /* PC += 20 */
-+ /* +16: shift < 32 */
-+ emit(ctx, srl, t1, lo(dst), 1); /* t1 = dl >> 1 */
-+ emit(ctx, srlv, t1, t1, t2); /* t1 = t1 >> t2 */
-+ emit(ctx, sllv, lo(dst), lo(dst), src); /* dl = dl << src */
-+ emit(ctx, sllv, hi(dst), hi(dst), src); /* dh = dh << src */
-+ emit(ctx, or, hi(dst), hi(dst), t1); /* dh = dh | t1 */
-+ break;
-+ /* dst = dst >> src */
-+ case BPF_RSH:
-+ /* Next: shift >= 32 */
-+ emit(ctx, srlv, lo(dst), hi(dst), src); /* dl = dh >> src */
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO); /* dh = 0 */
-+ emit(ctx, b, 20); /* PC += 20 */
-+ /* +16: shift < 32 */
-+ emit(ctx, sll, t1, hi(dst), 1); /* t1 = dl << 1 */
-+ emit(ctx, sllv, t1, t1, t2); /* t1 = t1 << t2 */
-+ emit(ctx, srlv, lo(dst), lo(dst), src); /* dl = dl >> src */
-+ emit(ctx, srlv, hi(dst), hi(dst), src); /* dh = dh >> src */
-+ emit(ctx, or, lo(dst), lo(dst), t1); /* dl = dl | t1 */
-+ break;
-+ /* dst = dst >> src (arithmetic) */
-+ case BPF_ARSH:
-+ /* Next: shift >= 32 */
-+ emit(ctx, srav, lo(dst), hi(dst), src); /* dl = dh >>a src */
-+ emit(ctx, sra, hi(dst), hi(dst), 31); /* dh = dh >>a 31 */
-+ emit(ctx, b, 20); /* PC += 20 */
-+ /* +16: shift < 32 */
-+ emit(ctx, sll, t1, hi(dst), 1); /* t1 = dl << 1 */
-+ emit(ctx, sllv, t1, t1, t2); /* t1 = t1 << t2 */
-+ emit(ctx, srlv, lo(dst), lo(dst), src); /* dl = dl >>a src */
-+ emit(ctx, srav, hi(dst), hi(dst), src); /* dh = dh >> src */
-+ emit(ctx, or, lo(dst), lo(dst), t1); /* dl = dl | t1 */
-+ break;
-+ }
-+
-+ /* +20: Done */
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* ALU mul immediate (64x32-bit) */
-+static void emit_mul_i64(struct jit_context *ctx, const u8 dst[], s32 imm)
-+{
-+ u8 src = MIPS_R_T6;
-+ u8 tmp = MIPS_R_T9;
-+
-+ switch (imm) {
-+ /* dst = dst * 1 is a no-op */
-+ case 1:
-+ break;
-+ /* dst = dst * -1 */
-+ case -1:
-+ emit_neg_i64(ctx, dst);
-+ break;
-+ case 0:
-+ emit_mov_r(ctx, lo(dst), MIPS_R_ZERO);
-+ emit_mov_r(ctx, hi(dst), MIPS_R_ZERO);
-+ break;
-+ /* Full 64x32 multiply */
-+ default:
-+ /* hi(dst) = hi(dst) * src(imm) */
-+ emit_mov_i(ctx, src, imm);
-+ if (cpu_has_mips32r1 || cpu_has_mips32r6) {
-+ emit(ctx, mul, hi(dst), hi(dst), src);
-+ } else {
-+ emit(ctx, multu, hi(dst), src);
-+ emit(ctx, mflo, hi(dst));
-+ }
-+
-+ /* hi(dst) = hi(dst) - lo(dst) */
-+ if (imm < 0)
-+ emit(ctx, subu, hi(dst), hi(dst), lo(dst));
-+
-+ /* tmp = lo(dst) * src(imm) >> 32 */
-+ /* lo(dst) = lo(dst) * src(imm) */
-+ if (cpu_has_mips32r6) {
-+ emit(ctx, muhu, tmp, lo(dst), src);
-+ emit(ctx, mulu, lo(dst), lo(dst), src);
-+ } else {
-+ emit(ctx, multu, lo(dst), src);
-+ emit(ctx, mflo, lo(dst));
-+ emit(ctx, mfhi, tmp);
-+ }
-+
-+ /* hi(dst) += tmp */
-+ emit(ctx, addu, hi(dst), hi(dst), tmp);
-+ clobber_reg64(ctx, dst);
-+ break;
-+ }
-+}
-+
-+/* ALU mul register (64x64-bit) */
-+static void emit_mul_r64(struct jit_context *ctx,
-+ const u8 dst[], const u8 src[])
-+{
-+ u8 acc = MIPS_R_T8;
-+ u8 tmp = MIPS_R_T9;
-+
-+ /* acc = hi(dst) * lo(src) */
-+ if (cpu_has_mips32r1 || cpu_has_mips32r6) {
-+ emit(ctx, mul, acc, hi(dst), lo(src));
-+ } else {
-+ emit(ctx, multu, hi(dst), lo(src));
-+ emit(ctx, mflo, acc);
-+ }
-+
-+ /* tmp = lo(dst) * hi(src) */
-+ if (cpu_has_mips32r1 || cpu_has_mips32r6) {
-+ emit(ctx, mul, tmp, lo(dst), hi(src));
-+ } else {
-+ emit(ctx, multu, lo(dst), hi(src));
-+ emit(ctx, mflo, tmp);
-+ }
-+
-+ /* acc += tmp */
-+ emit(ctx, addu, acc, acc, tmp);
-+
-+ /* tmp = lo(dst) * lo(src) >> 32 */
-+ /* lo(dst) = lo(dst) * lo(src) */
-+ if (cpu_has_mips32r6) {
-+ emit(ctx, muhu, tmp, lo(dst), lo(src));
-+ emit(ctx, mulu, lo(dst), lo(dst), lo(src));
-+ } else {
-+ emit(ctx, multu, lo(dst), lo(src));
-+ emit(ctx, mflo, lo(dst));
-+ emit(ctx, mfhi, tmp);
-+ }
-+
-+ /* hi(dst) = acc + tmp */
-+ emit(ctx, addu, hi(dst), acc, tmp);
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* Helper function for 64-bit modulo */
-+static u64 jit_mod64(u64 a, u64 b)
-+{
-+ u64 rem;
-+
-+ div64_u64_rem(a, b, &rem);
-+ return rem;
-+}
-+
-+/* ALU div/mod register (64-bit) */
-+static void emit_divmod_r64(struct jit_context *ctx,
-+ const u8 dst[], const u8 src[], u8 op)
-+{
-+ const u8 *r0 = bpf2mips32[BPF_REG_0]; /* Mapped to v0-v1 */
-+ const u8 *r1 = bpf2mips32[BPF_REG_1]; /* Mapped to a0-a1 */
-+ const u8 *r2 = bpf2mips32[BPF_REG_2]; /* Mapped to a2-a3 */
-+ int exclude, k;
-+ u32 addr = 0;
-+
-+ /* Push caller-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ 0, JIT_RESERVED_STACK);
-+
-+ /* Put 64-bit arguments 1 and 2 in registers a0-a3 */
-+ for (k = 0; k < 2; k++) {
-+ emit(ctx, move, MIPS_R_T9, src[k]);
-+ emit(ctx, move, r1[k], dst[k]);
-+ emit(ctx, move, r2[k], MIPS_R_T9);
-+ }
-+
-+ /* Emit function call */
-+ switch (BPF_OP(op)) {
-+ /* dst = dst / src */
-+ case BPF_DIV:
-+ addr = (u32)&div64_u64;
-+ break;
-+ /* dst = dst % src */
-+ case BPF_MOD:
-+ addr = (u32)&jit_mod64;
-+ break;
-+ }
-+ emit_mov_i(ctx, MIPS_R_T9, addr);
-+ emit(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* Store the 64-bit result in dst */
-+ emit(ctx, move, dst[0], r0[0]);
-+ emit(ctx, move, dst[1], r0[1]);
-+
-+ /* Restore caller-saved registers, excluding the computed result */
-+ exclude = BIT(lo(dst)) | BIT(hi(dst));
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ exclude, JIT_RESERVED_STACK);
-+ emit_load_delay(ctx);
-+
-+ clobber_reg64(ctx, dst);
-+ clobber_reg(ctx, MIPS_R_V0);
-+ clobber_reg(ctx, MIPS_R_V1);
-+ clobber_reg(ctx, MIPS_R_RA);
-+}
-+
-+/* Swap bytes in a register word */
-+static void emit_swap8_r(struct jit_context *ctx, u8 dst, u8 src, u8 mask)
-+{
-+ u8 tmp = MIPS_R_T9;
-+
-+ emit(ctx, and, tmp, src, mask); /* tmp = src & 0x00ff00ff */
-+ emit(ctx, sll, tmp, tmp, 8); /* tmp = tmp << 8 */
-+ emit(ctx, srl, dst, src, 8); /* dst = src >> 8 */
-+ emit(ctx, and, dst, dst, mask); /* dst = dst & 0x00ff00ff */
-+ emit(ctx, or, dst, dst, tmp); /* dst = dst | tmp */
-+}
-+
-+/* Swap half words in a register word */
-+static void emit_swap16_r(struct jit_context *ctx, u8 dst, u8 src)
-+{
-+ u8 tmp = MIPS_R_T9;
-+
-+ emit(ctx, sll, tmp, src, 16); /* tmp = src << 16 */
-+ emit(ctx, srl, dst, src, 16); /* dst = src >> 16 */
-+ emit(ctx, or, dst, dst, tmp); /* dst = dst | tmp */
-+}
-+
-+/* Swap bytes and truncate a register double word, word or half word */
-+static void emit_bswap_r64(struct jit_context *ctx, const u8 dst[], u32 width)
-+{
-+ u8 tmp = MIPS_R_T8;
-+
-+ switch (width) {
-+ /* Swap bytes in a double word */
-+ case 64:
-+ if (cpu_has_mips32r2 || cpu_has_mips32r6) {
-+ emit(ctx, rotr, tmp, hi(dst), 16);
-+ emit(ctx, rotr, hi(dst), lo(dst), 16);
-+ emit(ctx, wsbh, lo(dst), tmp);
-+ emit(ctx, wsbh, hi(dst), hi(dst));
-+ } else {
-+ emit_swap16_r(ctx, tmp, lo(dst));
-+ emit_swap16_r(ctx, lo(dst), hi(dst));
-+ emit(ctx, move, hi(dst), tmp);
-+
-+ emit(ctx, lui, tmp, 0xff); /* tmp = 0x00ff0000 */
-+ emit(ctx, ori, tmp, tmp, 0xff); /* tmp = 0x00ff00ff */
-+ emit_swap8_r(ctx, lo(dst), lo(dst), tmp);
-+ emit_swap8_r(ctx, hi(dst), hi(dst), tmp);
-+ }
-+ break;
-+ /* Swap bytes in a word */
-+ /* Swap bytes in a half word */
-+ case 32:
-+ case 16:
-+ emit_bswap_r(ctx, lo(dst), width);
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ break;
-+ }
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* Truncate a register double word, word or half word */
-+static void emit_trunc_r64(struct jit_context *ctx, const u8 dst[], u32 width)
-+{
-+ switch (width) {
-+ case 64:
-+ break;
-+ /* Zero-extend a word */
-+ case 32:
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ clobber_reg(ctx, hi(dst));
-+ break;
-+ /* Zero-extend a half word */
-+ case 16:
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ emit(ctx, andi, lo(dst), lo(dst), 0xffff);
-+ clobber_reg64(ctx, dst);
-+ break;
-+ }
-+}
-+
-+/* Load operation: dst = *(size*)(src + off) */
-+static void emit_ldx(struct jit_context *ctx,
-+ const u8 dst[], u8 src, s16 off, u8 size)
-+{
-+ switch (size) {
-+ /* Load a byte */
-+ case BPF_B:
-+ emit(ctx, lbu, lo(dst), off, src);
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ break;
-+ /* Load a half word */
-+ case BPF_H:
-+ emit(ctx, lhu, lo(dst), off, src);
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ break;
-+ /* Load a word */
-+ case BPF_W:
-+ emit(ctx, lw, lo(dst), off, src);
-+ emit(ctx, move, hi(dst), MIPS_R_ZERO);
-+ break;
-+ /* Load a double word */
-+ case BPF_DW:
-+ if (dst[1] == src) {
-+ emit(ctx, lw, dst[0], off + 4, src);
-+ emit(ctx, lw, dst[1], off, src);
-+ } else {
-+ emit(ctx, lw, dst[1], off, src);
-+ emit(ctx, lw, dst[0], off + 4, src);
-+ }
-+ emit_load_delay(ctx);
-+ break;
-+ }
-+ clobber_reg64(ctx, dst);
-+}
-+
-+/* Store operation: *(size *)(dst + off) = src */
-+static void emit_stx(struct jit_context *ctx,
-+ const u8 dst, const u8 src[], s16 off, u8 size)
-+{
-+ switch (size) {
-+ /* Store a byte */
-+ case BPF_B:
-+ emit(ctx, sb, lo(src), off, dst);
-+ break;
-+ /* Store a half word */
-+ case BPF_H:
-+ emit(ctx, sh, lo(src), off, dst);
-+ break;
-+ /* Store a word */
-+ case BPF_W:
-+ emit(ctx, sw, lo(src), off, dst);
-+ break;
-+ /* Store a double word */
-+ case BPF_DW:
-+ emit(ctx, sw, src[1], off, dst);
-+ emit(ctx, sw, src[0], off + 4, dst);
-+ break;
-+ }
-+}
-+
-+/* Atomic read-modify-write (32-bit, non-ll/sc fallback) */
-+static void emit_atomic_r32(struct jit_context *ctx,
-+ u8 dst, u8 src, s16 off, u8 code)
-+{
-+ u32 exclude = 0;
-+ u32 addr = 0;
-+
-+ /* Push caller-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ 0, JIT_RESERVED_STACK);
-+ /*
-+ * Argument 1: dst+off if xchg, otherwise src, passed in register a0
-+ * Argument 2: src if xchg, othersize dst+off, passed in register a1
-+ */
-+ emit(ctx, move, MIPS_R_T9, dst);
-+ emit(ctx, move, MIPS_R_A0, src);
-+ emit(ctx, addiu, MIPS_R_A1, MIPS_R_T9, off);
-+
-+ /* Emit function call */
-+ switch (code) {
-+ case BPF_ADD:
-+ addr = (u32)&atomic_add;
-+ break;
-+ case BPF_SUB:
-+ addr = (u32)&atomic_sub;
-+ break;
-+ case BPF_OR:
-+ addr = (u32)&atomic_or;
-+ break;
-+ case BPF_AND:
-+ addr = (u32)&atomic_and;
-+ break;
-+ case BPF_XOR:
-+ addr = (u32)&atomic_xor;
-+ break;
-+ }
-+ emit_mov_i(ctx, MIPS_R_T9, addr);
-+ emit(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* Restore caller-saved registers, except any fetched value */
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ exclude, JIT_RESERVED_STACK);
-+ emit_load_delay(ctx);
-+ clobber_reg(ctx, MIPS_R_RA);
-+}
-+
-+/* Atomic read-modify-write (64-bit) */
-+static void emit_atomic_r64(struct jit_context *ctx,
-+ u8 dst, const u8 src[], s16 off, u8 code)
-+{
-+ const u8 *r1 = bpf2mips32[BPF_REG_1]; /* Mapped to a0-a1 */
-+ u32 exclude = 0;
-+ u32 addr = 0;
-+
-+ /* Push caller-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ 0, JIT_RESERVED_STACK);
-+ /*
-+ * Argument 1: 64-bit src, passed in registers a0-a1
-+ * Argument 2: 32-bit dst+off, passed in register a2
-+ */
-+ emit(ctx, move, MIPS_R_T9, dst);
-+ emit(ctx, move, r1[0], src[0]);
-+ emit(ctx, move, r1[1], src[1]);
-+ emit(ctx, addiu, MIPS_R_A2, MIPS_R_T9, off);
-+
-+ /* Emit function call */
-+ switch (code) {
-+ case BPF_ADD:
-+ addr = (u32)&atomic64_add;
-+ break;
-+ case BPF_SUB:
-+ addr = (u32)&atomic64_sub;
-+ break;
-+ case BPF_OR:
-+ addr = (u32)&atomic64_or;
-+ break;
-+ case BPF_AND:
-+ addr = (u32)&atomic64_and;
-+ break;
-+ case BPF_XOR:
-+ addr = (u32)&atomic64_xor;
-+ break;
-+ }
-+ emit_mov_i(ctx, MIPS_R_T9, addr);
-+ emit(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* Restore caller-saved registers, except any fetched value */
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLER_REGS,
-+ exclude, JIT_RESERVED_STACK);
-+ emit_load_delay(ctx);
-+ clobber_reg(ctx, MIPS_R_RA);
-+}
-+
-+/*
-+ * Conditional movz or an emulated equivalent.
-+ * Note that the rs register may be modified.
-+ */
-+static void emit_movz_r(struct jit_context *ctx, u8 rd, u8 rs, u8 rt)
-+{
-+ if (cpu_has_mips_2) {
-+ emit(ctx, movz, rd, rs, rt); /* rd = rt ? rd : rs */
-+ } else if (cpu_has_mips32r6) {
-+ if (rs != MIPS_R_ZERO)
-+ emit(ctx, seleqz, rs, rs, rt); /* rs = 0 if rt == 0 */
-+ emit(ctx, selnez, rd, rd, rt); /* rd = 0 if rt != 0 */
-+ if (rs != MIPS_R_ZERO)
-+ emit(ctx, or, rd, rd, rs); /* rd = rd | rs */
-+ } else {
-+ emit(ctx, bnez, rt, 8); /* PC += 8 if rd != 0 */
-+ emit(ctx, nop); /* +0: delay slot */
-+ emit(ctx, or, rd, rs, MIPS_R_ZERO); /* +4: rd = rs */
-+ }
-+ clobber_reg(ctx, rd);
-+ clobber_reg(ctx, rs);
-+}
-+
-+/*
-+ * Conditional movn or an emulated equivalent.
-+ * Note that the rs register may be modified.
-+ */
-+static void emit_movn_r(struct jit_context *ctx, u8 rd, u8 rs, u8 rt)
-+{
-+ if (cpu_has_mips_2) {
-+ emit(ctx, movn, rd, rs, rt); /* rd = rt ? rs : rd */
-+ } else if (cpu_has_mips32r6) {
-+ if (rs != MIPS_R_ZERO)
-+ emit(ctx, selnez, rs, rs, rt); /* rs = 0 if rt == 0 */
-+ emit(ctx, seleqz, rd, rd, rt); /* rd = 0 if rt != 0 */
-+ if (rs != MIPS_R_ZERO)
-+ emit(ctx, or, rd, rd, rs); /* rd = rd | rs */
-+ } else {
-+ emit(ctx, beqz, rt, 8); /* PC += 8 if rd == 0 */
-+ emit(ctx, nop); /* +0: delay slot */
-+ emit(ctx, or, rd, rs, MIPS_R_ZERO); /* +4: rd = rs */
-+ }
-+ clobber_reg(ctx, rd);
-+ clobber_reg(ctx, rs);
-+}
-+
-+/* Emulation of 64-bit sltiu rd, rs, imm, where imm may be S32_MAX + 1 */
-+static void emit_sltiu_r64(struct jit_context *ctx, u8 rd,
-+ const u8 rs[], s64 imm)
-+{
-+ u8 tmp = MIPS_R_T9;
-+
-+ if (imm < 0) {
-+ emit_mov_i(ctx, rd, imm); /* rd = imm */
-+ emit(ctx, sltu, rd, lo(rs), rd); /* rd = rsl < rd */
-+ emit(ctx, sltiu, tmp, hi(rs), -1); /* tmp = rsh < ~0U */
-+ emit(ctx, or, rd, rd, tmp); /* rd = rd | tmp */
-+ } else { /* imm >= 0 */
-+ if (imm > 0x7fff) {
-+ emit_mov_i(ctx, rd, (s32)imm); /* rd = imm */
-+ emit(ctx, sltu, rd, lo(rs), rd); /* rd = rsl < rd */
-+ } else {
-+ emit(ctx, sltiu, rd, lo(rs), imm); /* rd = rsl < imm */
-+ }
-+ emit_movn_r(ctx, rd, MIPS_R_ZERO, hi(rs)); /* rd = 0 if rsh */
-+ }
-+}
-+
-+/* Emulation of 64-bit sltu rd, rs, rt */
-+static void emit_sltu_r64(struct jit_context *ctx, u8 rd,
-+ const u8 rs[], const u8 rt[])
-+{
-+ u8 tmp = MIPS_R_T9;
-+
-+ emit(ctx, sltu, rd, lo(rs), lo(rt)); /* rd = rsl < rtl */
-+ emit(ctx, subu, tmp, hi(rs), hi(rt)); /* tmp = rsh - rth */
-+ emit_movn_r(ctx, rd, MIPS_R_ZERO, tmp); /* rd = 0 if tmp != 0 */
-+ emit(ctx, sltu, tmp, hi(rs), hi(rt)); /* tmp = rsh < rth */
-+ emit(ctx, or, rd, rd, tmp); /* rd = rd | tmp */
-+}
-+
-+/* Emulation of 64-bit slti rd, rs, imm, where imm may be S32_MAX + 1 */
-+static void emit_slti_r64(struct jit_context *ctx, u8 rd,
-+ const u8 rs[], s64 imm)
-+{
-+ u8 t1 = MIPS_R_T8;
-+ u8 t2 = MIPS_R_T9;
-+ u8 cmp;
-+
-+ /*
-+ * if ((rs < 0) ^ (imm < 0)) t1 = imm >u rsl
-+ * else t1 = rsl <u imm
-+ */
-+ emit_mov_i(ctx, rd, (s32)imm);
-+ emit(ctx, sltu, t1, lo(rs), rd); /* t1 = rsl <u imm */
-+ emit(ctx, sltu, t2, rd, lo(rs)); /* t2 = imm <u rsl */
-+ emit(ctx, srl, rd, hi(rs), 31); /* rd = rsh >> 31 */
-+ if (imm < 0)
-+ emit_movz_r(ctx, t1, t2, rd); /* t1 = rd ? t1 : t2 */
-+ else
-+ emit_movn_r(ctx, t1, t2, rd); /* t1 = rd ? t2 : t1 */
-+ /*
-+ * if ((imm < 0 && rsh != 0xffffffff) ||
-+ * (imm >= 0 && rsh != 0))
-+ * t1 = 0
-+ */
-+ if (imm < 0) {
-+ emit(ctx, addiu, rd, hi(rs), 1); /* rd = rsh + 1 */
-+ cmp = rd;
-+ } else { /* imm >= 0 */
-+ cmp = hi(rs);
-+ }
-+ emit_movn_r(ctx, t1, MIPS_R_ZERO, cmp); /* t1 = 0 if cmp != 0 */
-+
-+ /*
-+ * if (imm < 0) rd = rsh < -1
-+ * else rd = rsh != 0
-+ * rd = rd | t1
-+ */
-+ emit(ctx, slti, rd, hi(rs), imm < 0 ? -1 : 0); /* rd = rsh < hi(imm) */
-+ emit(ctx, or, rd, rd, t1); /* rd = rd | t1 */
-+}
-+
-+/* Emulation of 64-bit(slt rd, rs, rt) */
-+static void emit_slt_r64(struct jit_context *ctx, u8 rd,
-+ const u8 rs[], const u8 rt[])
-+{
-+ u8 t1 = MIPS_R_T7;
-+ u8 t2 = MIPS_R_T8;
-+ u8 t3 = MIPS_R_T9;
-+
-+ /*
-+ * if ((rs < 0) ^ (rt < 0)) t1 = rtl <u rsl
-+ * else t1 = rsl <u rtl
-+ * if (rsh == rth) t1 = 0
-+ */
-+ emit(ctx, sltu, t1, lo(rs), lo(rt)); /* t1 = rsl <u rtl */
-+ emit(ctx, sltu, t2, lo(rt), lo(rs)); /* t2 = rtl <u rsl */
-+ emit(ctx, xor, t3, hi(rs), hi(rt)); /* t3 = rlh ^ rth */
-+ emit(ctx, srl, rd, t3, 31); /* rd = t3 >> 31 */
-+ emit_movn_r(ctx, t1, t2, rd); /* t1 = rd ? t2 : t1 */
-+ emit_movn_r(ctx, t1, MIPS_R_ZERO, t3); /* t1 = 0 if t3 != 0 */
-+
-+ /* rd = (rsh < rth) | t1 */
-+ emit(ctx, slt, rd, hi(rs), hi(rt)); /* rd = rsh <s rth */
-+ emit(ctx, or, rd, rd, t1); /* rd = rd | t1 */
-+}
-+
-+/* Jump immediate (64-bit) */
-+static void emit_jmp_i64(struct jit_context *ctx,
-+ const u8 dst[], s32 imm, s32 off, u8 op)
-+{
-+ u8 tmp = MIPS_R_T6;
-+
-+ switch (op) {
-+ /* No-op, used internally for branch optimization */
-+ case JIT_JNOP:
-+ break;
-+ /* PC += off if dst == imm */
-+ /* PC += off if dst != imm */
-+ case BPF_JEQ:
-+ case BPF_JNE:
-+ if (imm >= -0x7fff && imm <= 0x8000) {
-+ emit(ctx, addiu, tmp, lo(dst), -imm);
-+ } else if ((u32)imm <= 0xffff) {
-+ emit(ctx, xori, tmp, lo(dst), imm);
-+ } else { /* Register fallback */
-+ emit_mov_i(ctx, tmp, imm);
-+ emit(ctx, xor, tmp, lo(dst), tmp);
-+ }
-+ if (imm < 0) { /* Compare sign extension */
-+ emit(ctx, addu, MIPS_R_T9, hi(dst), 1);
-+ emit(ctx, or, tmp, tmp, MIPS_R_T9);
-+ } else { /* Compare zero extension */
-+ emit(ctx, or, tmp, tmp, hi(dst));
-+ }
-+ if (op == BPF_JEQ)
-+ emit(ctx, beqz, tmp, off);
-+ else /* BPF_JNE */
-+ emit(ctx, bnez, tmp, off);
-+ break;
-+ /* PC += off if dst & imm */
-+ /* PC += off if (dst & imm) == 0 (not in BPF, used for long jumps) */
-+ case BPF_JSET:
-+ case JIT_JNSET:
-+ if ((u32)imm <= 0xffff) {
-+ emit(ctx, andi, tmp, lo(dst), imm);
-+ } else { /* Register fallback */
-+ emit_mov_i(ctx, tmp, imm);
-+ emit(ctx, and, tmp, lo(dst), tmp);
-+ }
-+ if (imm < 0) /* Sign-extension pulls in high word */
-+ emit(ctx, or, tmp, tmp, hi(dst));
-+ if (op == BPF_JSET)
-+ emit(ctx, bnez, tmp, off);
-+ else /* JIT_JNSET */
-+ emit(ctx, beqz, tmp, off);
-+ break;
-+ /* PC += off if dst > imm */
-+ case BPF_JGT:
-+ emit_sltiu_r64(ctx, tmp, dst, (s64)imm + 1);
-+ emit(ctx, beqz, tmp, off);
-+ break;
-+ /* PC += off if dst >= imm */
-+ case BPF_JGE:
-+ emit_sltiu_r64(ctx, tmp, dst, imm);
-+ emit(ctx, beqz, tmp, off);
-+ break;
-+ /* PC += off if dst < imm */
-+ case BPF_JLT:
-+ emit_sltiu_r64(ctx, tmp, dst, imm);
-+ emit(ctx, bnez, tmp, off);
-+ break;
-+ /* PC += off if dst <= imm */
-+ case BPF_JLE:
-+ emit_sltiu_r64(ctx, tmp, dst, (s64)imm + 1);
-+ emit(ctx, bnez, tmp, off);
-+ break;
-+ /* PC += off if dst > imm (signed) */
-+ case BPF_JSGT:
-+ emit_slti_r64(ctx, tmp, dst, (s64)imm + 1);
-+ emit(ctx, beqz, tmp, off);
-+ break;
-+ /* PC += off if dst >= imm (signed) */
-+ case BPF_JSGE:
-+ emit_slti_r64(ctx, tmp, dst, imm);
-+ emit(ctx, beqz, tmp, off);
-+ break;
-+ /* PC += off if dst < imm (signed) */
-+ case BPF_JSLT:
-+ emit_slti_r64(ctx, tmp, dst, imm);
-+ emit(ctx, bnez, tmp, off);
-+ break;
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JSLE:
-+ emit_slti_r64(ctx, tmp, dst, (s64)imm + 1);
-+ emit(ctx, bnez, tmp, off);
-+ break;
-+ }
-+}
-+
-+/* Jump register (64-bit) */
-+static void emit_jmp_r64(struct jit_context *ctx,
-+ const u8 dst[], const u8 src[], s32 off, u8 op)
-+{
-+ u8 t1 = MIPS_R_T6;
-+ u8 t2 = MIPS_R_T7;
-+
-+ switch (op) {
-+ /* No-op, used internally for branch optimization */
-+ case JIT_JNOP:
-+ break;
-+ /* PC += off if dst == src */
-+ /* PC += off if dst != src */
-+ case BPF_JEQ:
-+ case BPF_JNE:
-+ emit(ctx, subu, t1, lo(dst), lo(src));
-+ emit(ctx, subu, t2, hi(dst), hi(src));
-+ emit(ctx, or, t1, t1, t2);
-+ if (op == BPF_JEQ)
-+ emit(ctx, beqz, t1, off);
-+ else /* BPF_JNE */
-+ emit(ctx, bnez, t1, off);
-+ break;
-+ /* PC += off if dst & src */
-+ /* PC += off if (dst & imm) == 0 (not in BPF, used for long jumps) */
-+ case BPF_JSET:
-+ case JIT_JNSET:
-+ emit(ctx, and, t1, lo(dst), lo(src));
-+ emit(ctx, and, t2, hi(dst), hi(src));
-+ emit(ctx, or, t1, t1, t2);
-+ if (op == BPF_JSET)
-+ emit(ctx, bnez, t1, off);
-+ else /* JIT_JNSET */
-+ emit(ctx, beqz, t1, off);
-+ break;
-+ /* PC += off if dst > src */
-+ case BPF_JGT:
-+ emit_sltu_r64(ctx, t1, src, dst);
-+ emit(ctx, bnez, t1, off);
-+ break;
-+ /* PC += off if dst >= src */
-+ case BPF_JGE:
-+ emit_sltu_r64(ctx, t1, dst, src);
-+ emit(ctx, beqz, t1, off);
-+ break;
-+ /* PC += off if dst < src */
-+ case BPF_JLT:
-+ emit_sltu_r64(ctx, t1, dst, src);
-+ emit(ctx, bnez, t1, off);
-+ break;
-+ /* PC += off if dst <= src */
-+ case BPF_JLE:
-+ emit_sltu_r64(ctx, t1, src, dst);
-+ emit(ctx, beqz, t1, off);
-+ break;
-+ /* PC += off if dst > src (signed) */
-+ case BPF_JSGT:
-+ emit_slt_r64(ctx, t1, src, dst);
-+ emit(ctx, bnez, t1, off);
-+ break;
-+ /* PC += off if dst >= src (signed) */
-+ case BPF_JSGE:
-+ emit_slt_r64(ctx, t1, dst, src);
-+ emit(ctx, beqz, t1, off);
-+ break;
-+ /* PC += off if dst < src (signed) */
-+ case BPF_JSLT:
-+ emit_slt_r64(ctx, t1, dst, src);
-+ emit(ctx, bnez, t1, off);
-+ break;
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JSLE:
-+ emit_slt_r64(ctx, t1, src, dst);
-+ emit(ctx, beqz, t1, off);
-+ break;
-+ }
-+}
-+
-+/* Function call */
-+static int emit_call(struct jit_context *ctx, const struct bpf_insn *insn)
-+{
-+ bool fixed;
-+ u64 addr;
-+
-+ /* Decode the call address */
-+ if (bpf_jit_get_func_addr(ctx->program, insn, false,
-+ &addr, &fixed) < 0)
-+ return -1;
-+ if (!fixed)
-+ return -1;
-+
-+ /* Push stack arguments */
-+ push_regs(ctx, JIT_STACK_REGS, 0, JIT_RESERVED_STACK);
-+
-+ /* Emit function call */
-+ emit_mov_i(ctx, MIPS_R_T9, addr);
-+ emit(ctx, jalr, MIPS_R_RA, MIPS_R_T9);
-+ emit(ctx, nop); /* Delay slot */
-+
-+ clobber_reg(ctx, MIPS_R_RA);
-+ clobber_reg(ctx, MIPS_R_V0);
-+ clobber_reg(ctx, MIPS_R_V1);
-+ return 0;
-+}
-+
-+/* Function tail call */
-+static int emit_tail_call(struct jit_context *ctx)
-+{
-+ u8 ary = lo(bpf2mips32[BPF_REG_2]);
-+ u8 ind = lo(bpf2mips32[BPF_REG_3]);
-+ u8 t1 = MIPS_R_T8;
-+ u8 t2 = MIPS_R_T9;
-+ int off;
-+
-+ /*
-+ * Tail call:
-+ * eBPF R1 - function argument (context ptr), passed in a0-a1
-+ * eBPF R2 - ptr to object with array of function entry points
-+ * eBPF R3 - array index of function to be called
-+ * stack[sz] - remaining tail call count, initialized in prologue
-+ */
-+
-+ /* if (ind >= ary->map.max_entries) goto out */
-+ off = offsetof(struct bpf_array, map.max_entries);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, lw, t1, off, ary); /* t1 = ary->map.max_entries*/
-+ emit_load_delay(ctx); /* Load delay slot */
-+ emit(ctx, sltu, t1, ind, t1); /* t1 = ind < t1 */
-+ emit(ctx, beqz, t1, get_offset(ctx, 1)); /* PC += off(1) if t1 == 0 */
-+ /* (next insn delay slot) */
-+ /* if (TCC-- <= 0) goto out */
-+ emit(ctx, lw, t2, ctx->stack_size, MIPS_R_SP); /* t2 = *(SP + size) */
-+ emit_load_delay(ctx); /* Load delay slot */
-+ emit(ctx, blez, t2, get_offset(ctx, 1)); /* PC += off(1) if t2 < 0 */
-+ emit(ctx, addiu, t2, t2, -1); /* t2-- (delay slot) */
-+ emit(ctx, sw, t2, ctx->stack_size, MIPS_R_SP); /* *(SP + size) = t2 */
-+
-+ /* prog = ary->ptrs[ind] */
-+ off = offsetof(struct bpf_array, ptrs);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, sll, t1, ind, 2); /* t1 = ind << 2 */
-+ emit(ctx, addu, t1, t1, ary); /* t1 += ary */
-+ emit(ctx, lw, t2, off, t1); /* t2 = *(t1 + off) */
-+ emit_load_delay(ctx); /* Load delay slot */
-+
-+ /* if (prog == 0) goto out */
-+ emit(ctx, beqz, t2, get_offset(ctx, 1)); /* PC += off(1) if t2 == 0 */
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* func = prog->bpf_func + 8 (prologue skip offset) */
-+ off = offsetof(struct bpf_prog, bpf_func);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, lw, t1, off, t2); /* t1 = *(t2 + off) */
-+ emit_load_delay(ctx); /* Load delay slot */
-+ emit(ctx, addiu, t1, t1, JIT_TCALL_SKIP); /* t1 += skip (8 or 12) */
-+
-+ /* goto func */
-+ build_epilogue(ctx, t1);
-+ return 0;
-+}
-+
-+/*
-+ * Stack frame layout for a JITed program (stack grows down).
-+ *
-+ * Higher address : Caller's stack frame :
-+ * :----------------------------:
-+ * : 64-bit eBPF args r3-r5 :
-+ * :----------------------------:
-+ * : Reserved / tail call count :
-+ * +============================+ <--- MIPS sp before call
-+ * | Callee-saved registers, |
-+ * | including RA and FP |
-+ * +----------------------------+ <--- eBPF FP (MIPS zero,fp)
-+ * | Local eBPF variables |
-+ * | allocated by program |
-+ * +----------------------------+
-+ * | Reserved for caller-saved |
-+ * | registers |
-+ * +----------------------------+
-+ * | Reserved for 64-bit eBPF |
-+ * | args r3-r5 & args passed |
-+ * | on stack in kernel calls |
-+ * Lower address +============================+ <--- MIPS sp
-+ */
-+
-+/* Build program prologue to set up the stack and registers */
-+void build_prologue(struct jit_context *ctx)
-+{
-+ const u8 *r1 = bpf2mips32[BPF_REG_1];
-+ const u8 *fp = bpf2mips32[BPF_REG_FP];
-+ int stack, saved, locals, reserved;
-+
-+ /*
-+ * The first two instructions initialize TCC in the reserved (for us)
-+ * 16-byte area in the parent's stack frame. On a tail call, the
-+ * calling function jumps into the prologue after these instructions.
-+ */
-+ emit(ctx, ori, MIPS_R_T9, MIPS_R_ZERO,
-+ min(MAX_TAIL_CALL_CNT + 1, 0xffff));
-+ emit(ctx, sw, MIPS_R_T9, 0, MIPS_R_SP);
-+
-+ /*
-+ * Register eBPF R1 contains the 32-bit context pointer argument.
-+ * A 32-bit argument is always passed in MIPS register a0, regardless
-+ * of CPU endianness. Initialize R1 accordingly and zero-extend.
-+ */
-+#ifdef __BIG_ENDIAN
-+ emit(ctx, move, lo(r1), MIPS_R_A0);
-+#endif
-+
-+ /* === Entry-point for tail calls === */
-+
-+ /* Zero-extend the 32-bit argument */
-+ emit(ctx, move, hi(r1), MIPS_R_ZERO);
-+
-+ /* If the eBPF frame pointer was accessed it must be saved */
-+ if (ctx->accessed & BIT(BPF_REG_FP))
-+ clobber_reg64(ctx, fp);
-+
-+ /* Compute the stack space needed for callee-saved registers */
-+ saved = hweight32(ctx->clobbered & JIT_CALLEE_REGS) * sizeof(u32);
-+ saved = ALIGN(saved, MIPS_STACK_ALIGNMENT);
-+
-+ /* Stack space used by eBPF program local data */
-+ locals = ALIGN(ctx->program->aux->stack_depth, MIPS_STACK_ALIGNMENT);
-+
-+ /*
-+ * If we are emitting function calls, reserve extra stack space for
-+ * caller-saved registers and function arguments passed on the stack.
-+ * The required space is computed automatically during resource
-+ * usage discovery (pass 1).
-+ */
-+ reserved = ctx->stack_used;
-+
-+ /* Allocate the stack frame */
-+ stack = ALIGN(saved + locals + reserved, MIPS_STACK_ALIGNMENT);
-+ emit(ctx, addiu, MIPS_R_SP, MIPS_R_SP, -stack);
-+
-+ /* Store callee-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0, stack - saved);
-+
-+ /* Initialize the eBPF frame pointer if accessed */
-+ if (ctx->accessed & BIT(BPF_REG_FP))
-+ emit(ctx, addiu, lo(fp), MIPS_R_SP, stack - saved);
-+
-+ ctx->saved_size = saved;
-+ ctx->stack_size = stack;
-+}
-+
-+/* Build the program epilogue to restore the stack and registers */
-+void build_epilogue(struct jit_context *ctx, int dest_reg)
-+{
-+ /* Restore callee-saved registers from stack */
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0,
-+ ctx->stack_size - ctx->saved_size);
-+ /*
-+ * A 32-bit return value is always passed in MIPS register v0,
-+ * but on big-endian targets the low part of R0 is mapped to v1.
-+ */
-+#ifdef __BIG_ENDIAN
-+ emit(ctx, move, MIPS_R_V0, MIPS_R_V1);
-+#endif
-+
-+ /* Jump to the return address and adjust the stack pointer */
-+ emit(ctx, jr, dest_reg);
-+ emit(ctx, addiu, MIPS_R_SP, MIPS_R_SP, ctx->stack_size);
-+}
-+
-+/* Build one eBPF instruction */
-+int build_insn(const struct bpf_insn *insn, struct jit_context *ctx)
-+{
-+ const u8 *dst = bpf2mips32[insn->dst_reg];
-+ const u8 *src = bpf2mips32[insn->src_reg];
-+ const u8 *tmp = bpf2mips32[JIT_REG_TMP];
-+ u8 code = insn->code;
-+ s16 off = insn->off;
-+ s32 imm = insn->imm;
-+ s32 val, rel;
-+ u8 alu, jmp;
-+
-+ switch (code) {
-+ /* ALU operations */
-+ /* dst = imm */
-+ case BPF_ALU | BPF_MOV | BPF_K:
-+ emit_mov_i(ctx, lo(dst), imm);
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = src */
-+ case BPF_ALU | BPF_MOV | BPF_X:
-+ if (imm == 1) {
-+ /* Special mov32 for zext */
-+ emit_mov_i(ctx, hi(dst), 0);
-+ } else {
-+ emit_mov_r(ctx, lo(dst), lo(src));
-+ emit_zext_ver(ctx, dst);
-+ }
-+ break;
-+ /* dst = -dst */
-+ case BPF_ALU | BPF_NEG:
-+ emit_alu_i(ctx, lo(dst), 0, BPF_NEG);
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst & imm */
-+ /* dst = dst | imm */
-+ /* dst = dst ^ imm */
-+ /* dst = dst << imm */
-+ /* dst = dst >> imm */
-+ /* dst = dst >> imm (arithmetic) */
-+ /* dst = dst + imm */
-+ /* dst = dst - imm */
-+ /* dst = dst * imm */
-+ /* dst = dst / imm */
-+ /* dst = dst % imm */
-+ case BPF_ALU | BPF_OR | BPF_K:
-+ case BPF_ALU | BPF_AND | BPF_K:
-+ case BPF_ALU | BPF_XOR | BPF_K:
-+ case BPF_ALU | BPF_LSH | BPF_K:
-+ case BPF_ALU | BPF_RSH | BPF_K:
-+ case BPF_ALU | BPF_ARSH | BPF_K:
-+ case BPF_ALU | BPF_ADD | BPF_K:
-+ case BPF_ALU | BPF_SUB | BPF_K:
-+ case BPF_ALU | BPF_MUL | BPF_K:
-+ case BPF_ALU | BPF_DIV | BPF_K:
-+ case BPF_ALU | BPF_MOD | BPF_K:
-+ if (!valid_alu_i(BPF_OP(code), imm)) {
-+ emit_mov_i(ctx, MIPS_R_T6, imm);
-+ emit_alu_r(ctx, lo(dst), MIPS_R_T6, BPF_OP(code));
-+ } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
-+ emit_alu_i(ctx, lo(dst), val, alu);
-+ }
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst & src */
-+ /* dst = dst | src */
-+ /* dst = dst ^ src */
-+ /* dst = dst << src */
-+ /* dst = dst >> src */
-+ /* dst = dst >> src (arithmetic) */
-+ /* dst = dst + src */
-+ /* dst = dst - src */
-+ /* dst = dst * src */
-+ /* dst = dst / src */
-+ /* dst = dst % src */
-+ case BPF_ALU | BPF_AND | BPF_X:
-+ case BPF_ALU | BPF_OR | BPF_X:
-+ case BPF_ALU | BPF_XOR | BPF_X:
-+ case BPF_ALU | BPF_LSH | BPF_X:
-+ case BPF_ALU | BPF_RSH | BPF_X:
-+ case BPF_ALU | BPF_ARSH | BPF_X:
-+ case BPF_ALU | BPF_ADD | BPF_X:
-+ case BPF_ALU | BPF_SUB | BPF_X:
-+ case BPF_ALU | BPF_MUL | BPF_X:
-+ case BPF_ALU | BPF_DIV | BPF_X:
-+ case BPF_ALU | BPF_MOD | BPF_X:
-+ emit_alu_r(ctx, lo(dst), lo(src), BPF_OP(code));
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = imm (64-bit) */
-+ case BPF_ALU64 | BPF_MOV | BPF_K:
-+ emit_mov_se_i64(ctx, dst, imm);
-+ break;
-+ /* dst = src (64-bit) */
-+ case BPF_ALU64 | BPF_MOV | BPF_X:
-+ emit_mov_r(ctx, lo(dst), lo(src));
-+ emit_mov_r(ctx, hi(dst), hi(src));
-+ break;
-+ /* dst = -dst (64-bit) */
-+ case BPF_ALU64 | BPF_NEG:
-+ emit_neg_i64(ctx, dst);
-+ break;
-+ /* dst = dst & imm (64-bit) */
-+ case BPF_ALU64 | BPF_AND | BPF_K:
-+ emit_alu_i64(ctx, dst, imm, BPF_OP(code));
-+ break;
-+ /* dst = dst | imm (64-bit) */
-+ /* dst = dst ^ imm (64-bit) */
-+ /* dst = dst + imm (64-bit) */
-+ /* dst = dst - imm (64-bit) */
-+ case BPF_ALU64 | BPF_OR | BPF_K:
-+ case BPF_ALU64 | BPF_XOR | BPF_K:
-+ case BPF_ALU64 | BPF_ADD | BPF_K:
-+ case BPF_ALU64 | BPF_SUB | BPF_K:
-+ if (imm)
-+ emit_alu_i64(ctx, dst, imm, BPF_OP(code));
-+ break;
-+ /* dst = dst << imm (64-bit) */
-+ /* dst = dst >> imm (64-bit) */
-+ /* dst = dst >> imm (64-bit, arithmetic) */
-+ case BPF_ALU64 | BPF_LSH | BPF_K:
-+ case BPF_ALU64 | BPF_RSH | BPF_K:
-+ case BPF_ALU64 | BPF_ARSH | BPF_K:
-+ if (imm)
-+ emit_shift_i64(ctx, dst, imm, BPF_OP(code));
-+ break;
-+ /* dst = dst * imm (64-bit) */
-+ case BPF_ALU64 | BPF_MUL | BPF_K:
-+ emit_mul_i64(ctx, dst, imm);
-+ break;
-+ /* dst = dst / imm (64-bit) */
-+ /* dst = dst % imm (64-bit) */
-+ case BPF_ALU64 | BPF_DIV | BPF_K:
-+ case BPF_ALU64 | BPF_MOD | BPF_K:
-+ /*
-+ * Sign-extend the immediate value into a temporary register,
-+ * and then do the operation on this register.
-+ */
-+ emit_mov_se_i64(ctx, tmp, imm);
-+ emit_divmod_r64(ctx, dst, tmp, BPF_OP(code));
-+ break;
-+ /* dst = dst & src (64-bit) */
-+ /* dst = dst | src (64-bit) */
-+ /* dst = dst ^ src (64-bit) */
-+ /* dst = dst + src (64-bit) */
-+ /* dst = dst - src (64-bit) */
-+ case BPF_ALU64 | BPF_AND | BPF_X:
-+ case BPF_ALU64 | BPF_OR | BPF_X:
-+ case BPF_ALU64 | BPF_XOR | BPF_X:
-+ case BPF_ALU64 | BPF_ADD | BPF_X:
-+ case BPF_ALU64 | BPF_SUB | BPF_X:
-+ emit_alu_r64(ctx, dst, src, BPF_OP(code));
-+ break;
-+ /* dst = dst << src (64-bit) */
-+ /* dst = dst >> src (64-bit) */
-+ /* dst = dst >> src (64-bit, arithmetic) */
-+ case BPF_ALU64 | BPF_LSH | BPF_X:
-+ case BPF_ALU64 | BPF_RSH | BPF_X:
-+ case BPF_ALU64 | BPF_ARSH | BPF_X:
-+ emit_shift_r64(ctx, dst, lo(src), BPF_OP(code));
-+ break;
-+ /* dst = dst * src (64-bit) */
-+ case BPF_ALU64 | BPF_MUL | BPF_X:
-+ emit_mul_r64(ctx, dst, src);
-+ break;
-+ /* dst = dst / src (64-bit) */
-+ /* dst = dst % src (64-bit) */
-+ case BPF_ALU64 | BPF_DIV | BPF_X:
-+ case BPF_ALU64 | BPF_MOD | BPF_X:
-+ emit_divmod_r64(ctx, dst, src, BPF_OP(code));
-+ break;
-+ /* dst = htole(dst) */
-+ /* dst = htobe(dst) */
-+ case BPF_ALU | BPF_END | BPF_FROM_LE:
-+ case BPF_ALU | BPF_END | BPF_FROM_BE:
-+ if (BPF_SRC(code) ==
-+#ifdef __BIG_ENDIAN
-+ BPF_FROM_LE
-+#else
-+ BPF_FROM_BE
-+#endif
-+ )
-+ emit_bswap_r64(ctx, dst, imm);
-+ else
-+ emit_trunc_r64(ctx, dst, imm);
-+ break;
-+ /* dst = imm64 */
-+ case BPF_LD | BPF_IMM | BPF_DW:
-+ emit_mov_i(ctx, lo(dst), imm);
-+ emit_mov_i(ctx, hi(dst), insn[1].imm);
-+ return 1;
-+ /* LDX: dst = *(size *)(src + off) */
-+ case BPF_LDX | BPF_MEM | BPF_W:
-+ case BPF_LDX | BPF_MEM | BPF_H:
-+ case BPF_LDX | BPF_MEM | BPF_B:
-+ case BPF_LDX | BPF_MEM | BPF_DW:
-+ emit_ldx(ctx, dst, lo(src), off, BPF_SIZE(code));
-+ break;
-+ /* ST: *(size *)(dst + off) = imm */
-+ case BPF_ST | BPF_MEM | BPF_W:
-+ case BPF_ST | BPF_MEM | BPF_H:
-+ case BPF_ST | BPF_MEM | BPF_B:
-+ case BPF_ST | BPF_MEM | BPF_DW:
-+ switch (BPF_SIZE(code)) {
-+ case BPF_DW:
-+ /* Sign-extend immediate value into temporary reg */
-+ emit_mov_se_i64(ctx, tmp, imm);
-+ break;
-+ case BPF_W:
-+ case BPF_H:
-+ case BPF_B:
-+ emit_mov_i(ctx, lo(tmp), imm);
-+ break;
-+ }
-+ emit_stx(ctx, lo(dst), tmp, off, BPF_SIZE(code));
-+ break;
-+ /* STX: *(size *)(dst + off) = src */
-+ case BPF_STX | BPF_MEM | BPF_W:
-+ case BPF_STX | BPF_MEM | BPF_H:
-+ case BPF_STX | BPF_MEM | BPF_B:
-+ case BPF_STX | BPF_MEM | BPF_DW:
-+ emit_stx(ctx, lo(dst), src, off, BPF_SIZE(code));
-+ break;
-+ /* Speculation barrier */
-+ case BPF_ST | BPF_NOSPEC:
-+ break;
-+ /* Atomics */
-+ case BPF_STX | BPF_XADD | BPF_W:
-+ switch (imm) {
-+ case BPF_ADD:
-+ case BPF_AND:
-+ case BPF_OR:
-+ case BPF_XOR:
-+ if (cpu_has_llsc)
-+ emit_atomic_r(ctx, lo(dst), lo(src), off, imm);
-+ else /* Non-ll/sc fallback */
-+ emit_atomic_r32(ctx, lo(dst), lo(src),
-+ off, imm);
-+ break;
-+ default:
-+ goto notyet;
-+ }
-+ break;
-+ /* Atomics (64-bit) */
-+ case BPF_STX | BPF_XADD | BPF_DW:
-+ switch (imm) {
-+ case BPF_ADD:
-+ case BPF_AND:
-+ case BPF_OR:
-+ case BPF_XOR:
-+ emit_atomic_r64(ctx, lo(dst), src, off, imm);
-+ break;
-+ default:
-+ goto notyet;
-+ }
-+ break;
-+ /* PC += off if dst == src */
-+ /* PC += off if dst != src */
-+ /* PC += off if dst & src */
-+ /* PC += off if dst > src */
-+ /* PC += off if dst >= src */
-+ /* PC += off if dst < src */
-+ /* PC += off if dst <= src */
-+ /* PC += off if dst > src (signed) */
-+ /* PC += off if dst >= src (signed) */
-+ /* PC += off if dst < src (signed) */
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JMP32 | BPF_JEQ | BPF_X:
-+ case BPF_JMP32 | BPF_JNE | BPF_X:
-+ case BPF_JMP32 | BPF_JSET | BPF_X:
-+ case BPF_JMP32 | BPF_JGT | BPF_X:
-+ case BPF_JMP32 | BPF_JGE | BPF_X:
-+ case BPF_JMP32 | BPF_JLT | BPF_X:
-+ case BPF_JMP32 | BPF_JLE | BPF_X:
-+ case BPF_JMP32 | BPF_JSGT | BPF_X:
-+ case BPF_JMP32 | BPF_JSGE | BPF_X:
-+ case BPF_JMP32 | BPF_JSLT | BPF_X:
-+ case BPF_JMP32 | BPF_JSLE | BPF_X:
-+ if (off == 0)
-+ break;
-+ setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
-+ emit_jmp_r(ctx, lo(dst), lo(src), rel, jmp);
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == imm */
-+ /* PC += off if dst != imm */
-+ /* PC += off if dst & imm */
-+ /* PC += off if dst > imm */
-+ /* PC += off if dst >= imm */
-+ /* PC += off if dst < imm */
-+ /* PC += off if dst <= imm */
-+ /* PC += off if dst > imm (signed) */
-+ /* PC += off if dst >= imm (signed) */
-+ /* PC += off if dst < imm (signed) */
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JMP32 | BPF_JEQ | BPF_K:
-+ case BPF_JMP32 | BPF_JNE | BPF_K:
-+ case BPF_JMP32 | BPF_JSET | BPF_K:
-+ case BPF_JMP32 | BPF_JGT | BPF_K:
-+ case BPF_JMP32 | BPF_JGE | BPF_K:
-+ case BPF_JMP32 | BPF_JLT | BPF_K:
-+ case BPF_JMP32 | BPF_JLE | BPF_K:
-+ case BPF_JMP32 | BPF_JSGT | BPF_K:
-+ case BPF_JMP32 | BPF_JSGE | BPF_K:
-+ case BPF_JMP32 | BPF_JSLT | BPF_K:
-+ case BPF_JMP32 | BPF_JSLE | BPF_K:
-+ if (off == 0)
-+ break;
-+ setup_jmp_i(ctx, imm, 32, BPF_OP(code), off, &jmp, &rel);
-+ if (valid_jmp_i(jmp, imm)) {
-+ emit_jmp_i(ctx, lo(dst), imm, rel, jmp);
-+ } else {
-+ /* Move large immediate to register */
-+ emit_mov_i(ctx, MIPS_R_T6, imm);
-+ emit_jmp_r(ctx, lo(dst), MIPS_R_T6, rel, jmp);
-+ }
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == src */
-+ /* PC += off if dst != src */
-+ /* PC += off if dst & src */
-+ /* PC += off if dst > src */
-+ /* PC += off if dst >= src */
-+ /* PC += off if dst < src */
-+ /* PC += off if dst <= src */
-+ /* PC += off if dst > src (signed) */
-+ /* PC += off if dst >= src (signed) */
-+ /* PC += off if dst < src (signed) */
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JMP | BPF_JEQ | BPF_X:
-+ case BPF_JMP | BPF_JNE | BPF_X:
-+ case BPF_JMP | BPF_JSET | BPF_X:
-+ case BPF_JMP | BPF_JGT | BPF_X:
-+ case BPF_JMP | BPF_JGE | BPF_X:
-+ case BPF_JMP | BPF_JLT | BPF_X:
-+ case BPF_JMP | BPF_JLE | BPF_X:
-+ case BPF_JMP | BPF_JSGT | BPF_X:
-+ case BPF_JMP | BPF_JSGE | BPF_X:
-+ case BPF_JMP | BPF_JSLT | BPF_X:
-+ case BPF_JMP | BPF_JSLE | BPF_X:
-+ if (off == 0)
-+ break;
-+ setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
-+ emit_jmp_r64(ctx, dst, src, rel, jmp);
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == imm */
-+ /* PC += off if dst != imm */
-+ /* PC += off if dst & imm */
-+ /* PC += off if dst > imm */
-+ /* PC += off if dst >= imm */
-+ /* PC += off if dst < imm */
-+ /* PC += off if dst <= imm */
-+ /* PC += off if dst > imm (signed) */
-+ /* PC += off if dst >= imm (signed) */
-+ /* PC += off if dst < imm (signed) */
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JMP | BPF_JEQ | BPF_K:
-+ case BPF_JMP | BPF_JNE | BPF_K:
-+ case BPF_JMP | BPF_JSET | BPF_K:
-+ case BPF_JMP | BPF_JGT | BPF_K:
-+ case BPF_JMP | BPF_JGE | BPF_K:
-+ case BPF_JMP | BPF_JLT | BPF_K:
-+ case BPF_JMP | BPF_JLE | BPF_K:
-+ case BPF_JMP | BPF_JSGT | BPF_K:
-+ case BPF_JMP | BPF_JSGE | BPF_K:
-+ case BPF_JMP | BPF_JSLT | BPF_K:
-+ case BPF_JMP | BPF_JSLE | BPF_K:
-+ if (off == 0)
-+ break;
-+ setup_jmp_i(ctx, imm, 64, BPF_OP(code), off, &jmp, &rel);
-+ emit_jmp_i64(ctx, dst, imm, rel, jmp);
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off */
-+ case BPF_JMP | BPF_JA:
-+ if (off == 0)
-+ break;
-+ if (emit_ja(ctx, off) < 0)
-+ goto toofar;
-+ break;
-+ /* Tail call */
-+ case BPF_JMP | BPF_TAIL_CALL:
-+ if (emit_tail_call(ctx) < 0)
-+ goto invalid;
-+ break;
-+ /* Function call */
-+ case BPF_JMP | BPF_CALL:
-+ if (emit_call(ctx, insn) < 0)
-+ goto invalid;
-+ break;
-+ /* Function return */
-+ case BPF_JMP | BPF_EXIT:
-+ /*
-+ * Optimization: when last instruction is EXIT
-+ * simply continue to epilogue.
-+ */
-+ if (ctx->bpf_index == ctx->program->len - 1)
-+ break;
-+ if (emit_exit(ctx) < 0)
-+ goto toofar;
-+ break;
-+
-+ default:
-+invalid:
-+ pr_err_once("unknown opcode %02x\n", code);
-+ return -EINVAL;
-+notyet:
-+ pr_info_once("*** NOT YET: opcode %02x ***\n", code);
-+ return -EFAULT;
-+toofar:
-+ pr_info_once("*** TOO FAR: jump at %u opcode %02x ***\n",
-+ ctx->bpf_index, code);
-+ return -E2BIG;
-+ }
-+ return 0;
-+}
diff --git a/target/linux/generic/backport-5.4/071-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch b/target/linux/generic/backport-5.4/071-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch
deleted file mode 100644
index 38b46c0b76..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-03-mips-bpf-Add-new-eBPF-JIT-for-64-bit-MIPS.patch
+++ /dev/null
@@ -1,1005 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:05 +0200
-Subject: [PATCH] mips: bpf: Add new eBPF JIT for 64-bit MIPS
-
-This is an implementation on of an eBPF JIT for 64-bit MIPS III-V and
-MIPS64r1-r6. It uses the same framework introduced by the 32-bit JIT.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
----
- create mode 100644 arch/mips/net/bpf_jit_comp64.c
-
---- /dev/null
-+++ b/arch/mips/net/bpf_jit_comp64.c
-@@ -0,0 +1,991 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/*
-+ * Just-In-Time compiler for eBPF bytecode on MIPS.
-+ * Implementation of JIT functions for 64-bit CPUs.
-+ *
-+ * Copyright (c) 2021 Anyfi Networks AB.
-+ * Author: Johan Almbladh <johan.almbladh@gmail.com>
-+ *
-+ * Based on code and ideas from
-+ * Copyright (c) 2017 Cavium, Inc.
-+ * Copyright (c) 2017 Shubham Bansal <illusionist.neo@gmail.com>
-+ * Copyright (c) 2011 Mircea Gherzan <mgherzan@gmail.com>
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/filter.h>
-+#include <linux/bpf.h>
-+#include <asm/cpu-features.h>
-+#include <asm/isa-rev.h>
-+#include <asm/uasm.h>
-+
-+#include "bpf_jit_comp.h"
-+
-+/* MIPS t0-t3 are not available in the n64 ABI */
-+#undef MIPS_R_T0
-+#undef MIPS_R_T1
-+#undef MIPS_R_T2
-+#undef MIPS_R_T3
-+
-+/* Stack is 16-byte aligned in n64 ABI */
-+#define MIPS_STACK_ALIGNMENT 16
-+
-+/* Extra 64-bit eBPF registers used by JIT */
-+#define JIT_REG_TC (MAX_BPF_JIT_REG + 0)
-+#define JIT_REG_ZX (MAX_BPF_JIT_REG + 1)
-+
-+/* Number of prologue bytes to skip when doing a tail call */
-+#define JIT_TCALL_SKIP 4
-+
-+/* Callee-saved CPU registers that the JIT must preserve */
-+#define JIT_CALLEE_REGS \
-+ (BIT(MIPS_R_S0) | \
-+ BIT(MIPS_R_S1) | \
-+ BIT(MIPS_R_S2) | \
-+ BIT(MIPS_R_S3) | \
-+ BIT(MIPS_R_S4) | \
-+ BIT(MIPS_R_S5) | \
-+ BIT(MIPS_R_S6) | \
-+ BIT(MIPS_R_S7) | \
-+ BIT(MIPS_R_GP) | \
-+ BIT(MIPS_R_FP) | \
-+ BIT(MIPS_R_RA))
-+
-+/* Caller-saved CPU registers available for JIT use */
-+#define JIT_CALLER_REGS \
-+ (BIT(MIPS_R_A5) | \
-+ BIT(MIPS_R_A6) | \
-+ BIT(MIPS_R_A7))
-+/*
-+ * Mapping of 64-bit eBPF registers to 64-bit native MIPS registers.
-+ * MIPS registers t4 - t7 may be used by the JIT as temporary registers.
-+ * MIPS registers t8 - t9 are reserved for single-register common functions.
-+ */
-+static const u8 bpf2mips64[] = {
-+ /* Return value from in-kernel function, and exit value from eBPF */
-+ [BPF_REG_0] = MIPS_R_V0,
-+ /* Arguments from eBPF program to in-kernel function */
-+ [BPF_REG_1] = MIPS_R_A0,
-+ [BPF_REG_2] = MIPS_R_A1,
-+ [BPF_REG_3] = MIPS_R_A2,
-+ [BPF_REG_4] = MIPS_R_A3,
-+ [BPF_REG_5] = MIPS_R_A4,
-+ /* Callee-saved registers that in-kernel function will preserve */
-+ [BPF_REG_6] = MIPS_R_S0,
-+ [BPF_REG_7] = MIPS_R_S1,
-+ [BPF_REG_8] = MIPS_R_S2,
-+ [BPF_REG_9] = MIPS_R_S3,
-+ /* Read-only frame pointer to access the eBPF stack */
-+ [BPF_REG_FP] = MIPS_R_FP,
-+ /* Temporary register for blinding constants */
-+ [BPF_REG_AX] = MIPS_R_AT,
-+ /* Tail call count register, caller-saved */
-+ [JIT_REG_TC] = MIPS_R_A5,
-+ /* Constant for register zero-extension */
-+ [JIT_REG_ZX] = MIPS_R_V1,
-+};
-+
-+/*
-+ * MIPS 32-bit operations on 64-bit registers generate a sign-extended
-+ * result. However, the eBPF ISA mandates zero-extension, so we rely on the
-+ * verifier to add that for us (emit_zext_ver). In addition, ALU arithmetic
-+ * operations, right shift and byte swap require properly sign-extended
-+ * operands or the result is unpredictable. We emit explicit sign-extensions
-+ * in those cases.
-+ */
-+
-+/* Sign extension */
-+static void emit_sext(struct jit_context *ctx, u8 dst, u8 src)
-+{
-+ emit(ctx, sll, dst, src, 0);
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Zero extension */
-+static void emit_zext(struct jit_context *ctx, u8 dst)
-+{
-+ if (cpu_has_mips64r2 || cpu_has_mips64r6) {
-+ emit(ctx, dinsu, dst, MIPS_R_ZERO, 32, 32);
-+ } else {
-+ emit(ctx, and, dst, dst, bpf2mips64[JIT_REG_ZX]);
-+ access_reg(ctx, JIT_REG_ZX); /* We need the ZX register */
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Zero extension, if verifier does not do it for us */
-+static void emit_zext_ver(struct jit_context *ctx, u8 dst)
-+{
-+ if (!ctx->program->aux->verifier_zext)
-+ emit_zext(ctx, dst);
-+}
-+
-+/* dst = imm (64-bit) */
-+static void emit_mov_i64(struct jit_context *ctx, u8 dst, u64 imm64)
-+{
-+ if (imm64 >= 0xffffffffffff8000ULL || imm64 < 0x8000ULL) {
-+ emit(ctx, daddiu, dst, MIPS_R_ZERO, (s16)imm64);
-+ } else if (imm64 >= 0xffffffff80000000ULL ||
-+ (imm64 < 0x80000000 && imm64 > 0xffff)) {
-+ emit(ctx, lui, dst, (s16)(imm64 >> 16));
-+ emit(ctx, ori, dst, dst, (u16)imm64 & 0xffff);
-+ } else {
-+ u8 acc = MIPS_R_ZERO;
-+ int k;
-+
-+ for (k = 0; k < 4; k++) {
-+ u16 half = imm64 >> (48 - 16 * k);
-+
-+ if (acc == dst)
-+ emit(ctx, dsll, dst, dst, 16);
-+
-+ if (half) {
-+ emit(ctx, ori, dst, acc, half);
-+ acc = dst;
-+ }
-+ }
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* ALU immediate operation (64-bit) */
-+static void emit_alu_i64(struct jit_context *ctx, u8 dst, s32 imm, u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = dst | imm */
-+ case BPF_OR:
-+ emit(ctx, ori, dst, dst, (u16)imm);
-+ break;
-+ /* dst = dst ^ imm */
-+ case BPF_XOR:
-+ emit(ctx, xori, dst, dst, (u16)imm);
-+ break;
-+ /* dst = -dst */
-+ case BPF_NEG:
-+ emit(ctx, dsubu, dst, MIPS_R_ZERO, dst);
-+ break;
-+ /* dst = dst << imm */
-+ case BPF_LSH:
-+ emit(ctx, dsll_safe, dst, dst, imm);
-+ break;
-+ /* dst = dst >> imm */
-+ case BPF_RSH:
-+ emit(ctx, dsrl_safe, dst, dst, imm);
-+ break;
-+ /* dst = dst >> imm (arithmetic) */
-+ case BPF_ARSH:
-+ emit(ctx, dsra_safe, dst, dst, imm);
-+ break;
-+ /* dst = dst + imm */
-+ case BPF_ADD:
-+ emit(ctx, daddiu, dst, dst, imm);
-+ break;
-+ /* dst = dst - imm */
-+ case BPF_SUB:
-+ emit(ctx, daddiu, dst, dst, -imm);
-+ break;
-+ default:
-+ /* Width-generic operations */
-+ emit_alu_i(ctx, dst, imm, op);
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* ALU register operation (64-bit) */
-+static void emit_alu_r64(struct jit_context *ctx, u8 dst, u8 src, u8 op)
-+{
-+ switch (BPF_OP(op)) {
-+ /* dst = dst << src */
-+ case BPF_LSH:
-+ emit(ctx, dsllv, dst, dst, src);
-+ break;
-+ /* dst = dst >> src */
-+ case BPF_RSH:
-+ emit(ctx, dsrlv, dst, dst, src);
-+ break;
-+ /* dst = dst >> src (arithmetic) */
-+ case BPF_ARSH:
-+ emit(ctx, dsrav, dst, dst, src);
-+ break;
-+ /* dst = dst + src */
-+ case BPF_ADD:
-+ emit(ctx, daddu, dst, dst, src);
-+ break;
-+ /* dst = dst - src */
-+ case BPF_SUB:
-+ emit(ctx, dsubu, dst, dst, src);
-+ break;
-+ /* dst = dst * src */
-+ case BPF_MUL:
-+ if (cpu_has_mips64r6) {
-+ emit(ctx, dmulu, dst, dst, src);
-+ } else {
-+ emit(ctx, dmultu, dst, src);
-+ emit(ctx, mflo, dst);
-+ }
-+ break;
-+ /* dst = dst / src */
-+ case BPF_DIV:
-+ if (cpu_has_mips64r6) {
-+ emit(ctx, ddivu_r6, dst, dst, src);
-+ } else {
-+ emit(ctx, ddivu, dst, src);
-+ emit(ctx, mflo, dst);
-+ }
-+ break;
-+ /* dst = dst % src */
-+ case BPF_MOD:
-+ if (cpu_has_mips64r6) {
-+ emit(ctx, dmodu, dst, dst, src);
-+ } else {
-+ emit(ctx, ddivu, dst, src);
-+ emit(ctx, mfhi, dst);
-+ }
-+ break;
-+ default:
-+ /* Width-generic operations */
-+ emit_alu_r(ctx, dst, src, op);
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Swap sub words in a register double word */
-+static void emit_swap_r64(struct jit_context *ctx, u8 dst, u8 mask, u32 bits)
-+{
-+ u8 tmp = MIPS_R_T9;
-+
-+ emit(ctx, and, tmp, dst, mask); /* tmp = dst & mask */
-+ emit(ctx, dsll, tmp, tmp, bits); /* tmp = tmp << bits */
-+ emit(ctx, dsrl, dst, dst, bits); /* dst = dst >> bits */
-+ emit(ctx, and, dst, dst, mask); /* dst = dst & mask */
-+ emit(ctx, or, dst, dst, tmp); /* dst = dst | tmp */
-+}
-+
-+/* Swap bytes and truncate a register double word, word or half word */
-+static void emit_bswap_r64(struct jit_context *ctx, u8 dst, u32 width)
-+{
-+ switch (width) {
-+ /* Swap bytes in a double word */
-+ case 64:
-+ if (cpu_has_mips64r2 || cpu_has_mips64r6) {
-+ emit(ctx, dsbh, dst, dst);
-+ emit(ctx, dshd, dst, dst);
-+ } else {
-+ u8 t1 = MIPS_R_T6;
-+ u8 t2 = MIPS_R_T7;
-+
-+ emit(ctx, dsll32, t2, dst, 0); /* t2 = dst << 32 */
-+ emit(ctx, dsrl32, dst, dst, 0); /* dst = dst >> 32 */
-+ emit(ctx, or, dst, dst, t2); /* dst = dst | t2 */
-+
-+ emit(ctx, ori, t2, MIPS_R_ZERO, 0xffff);
-+ emit(ctx, dsll32, t1, t2, 0); /* t1 = t2 << 32 */
-+ emit(ctx, or, t1, t1, t2); /* t1 = t1 | t2 */
-+ emit_swap_r64(ctx, dst, t1, 16);/* dst = swap16(dst) */
-+
-+ emit(ctx, lui, t2, 0xff); /* t2 = 0x00ff0000 */
-+ emit(ctx, ori, t2, t2, 0xff); /* t2 = t2 | 0x00ff */
-+ emit(ctx, dsll32, t1, t2, 0); /* t1 = t2 << 32 */
-+ emit(ctx, or, t1, t1, t2); /* t1 = t1 | t2 */
-+ emit_swap_r64(ctx, dst, t1, 8); /* dst = swap8(dst) */
-+ }
-+ break;
-+ /* Swap bytes in a half word */
-+ /* Swap bytes in a word */
-+ case 32:
-+ case 16:
-+ emit_sext(ctx, dst, dst);
-+ emit_bswap_r(ctx, dst, width);
-+ if (cpu_has_mips64r2 || cpu_has_mips64r6)
-+ emit_zext(ctx, dst);
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Truncate a register double word, word or half word */
-+static void emit_trunc_r64(struct jit_context *ctx, u8 dst, u32 width)
-+{
-+ switch (width) {
-+ case 64:
-+ break;
-+ /* Zero-extend a word */
-+ case 32:
-+ emit_zext(ctx, dst);
-+ break;
-+ /* Zero-extend a half word */
-+ case 16:
-+ emit(ctx, andi, dst, dst, 0xffff);
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Load operation: dst = *(size*)(src + off) */
-+static void emit_ldx(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 size)
-+{
-+ switch (size) {
-+ /* Load a byte */
-+ case BPF_B:
-+ emit(ctx, lbu, dst, off, src);
-+ break;
-+ /* Load a half word */
-+ case BPF_H:
-+ emit(ctx, lhu, dst, off, src);
-+ break;
-+ /* Load a word */
-+ case BPF_W:
-+ emit(ctx, lwu, dst, off, src);
-+ break;
-+ /* Load a double word */
-+ case BPF_DW:
-+ emit(ctx, ld, dst, off, src);
-+ break;
-+ }
-+ clobber_reg(ctx, dst);
-+}
-+
-+/* Store operation: *(size *)(dst + off) = src */
-+static void emit_stx(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 size)
-+{
-+ switch (size) {
-+ /* Store a byte */
-+ case BPF_B:
-+ emit(ctx, sb, src, off, dst);
-+ break;
-+ /* Store a half word */
-+ case BPF_H:
-+ emit(ctx, sh, src, off, dst);
-+ break;
-+ /* Store a word */
-+ case BPF_W:
-+ emit(ctx, sw, src, off, dst);
-+ break;
-+ /* Store a double word */
-+ case BPF_DW:
-+ emit(ctx, sd, src, off, dst);
-+ break;
-+ }
-+}
-+
-+/* Atomic read-modify-write */
-+static void emit_atomic_r64(struct jit_context *ctx,
-+ u8 dst, u8 src, s16 off, u8 code)
-+{
-+ u8 t1 = MIPS_R_T6;
-+ u8 t2 = MIPS_R_T7;
-+
-+ emit(ctx, lld, t1, off, dst);
-+ switch (code) {
-+ case BPF_ADD:
-+ emit(ctx, daddu, t2, t1, src);
-+ break;
-+ case BPF_AND:
-+ emit(ctx, and, t2, t1, src);
-+ break;
-+ case BPF_OR:
-+ emit(ctx, or, t2, t1, src);
-+ break;
-+ case BPF_XOR:
-+ emit(ctx, xor, t2, t1, src);
-+ break;
-+ }
-+ emit(ctx, scd, t2, off, dst);
-+ emit(ctx, beqz, t2, -16);
-+ emit(ctx, nop); /* Delay slot */
-+}
-+
-+/* Function call */
-+static int emit_call(struct jit_context *ctx, const struct bpf_insn *insn)
-+{
-+ u8 zx = bpf2mips64[JIT_REG_ZX];
-+ u8 tmp = MIPS_R_T6;
-+ bool fixed;
-+ u64 addr;
-+
-+ /* Decode the call address */
-+ if (bpf_jit_get_func_addr(ctx->program, insn, false,
-+ &addr, &fixed) < 0)
-+ return -1;
-+ if (!fixed)
-+ return -1;
-+
-+ /* Push caller-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS, 0, 0);
-+
-+ /* Emit function call */
-+ emit_mov_i64(ctx, tmp, addr);
-+ emit(ctx, jalr, MIPS_R_RA, tmp);
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* Restore caller-saved registers */
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLER_REGS, 0, 0);
-+
-+ /* Re-initialize the JIT zero-extension register if accessed */
-+ if (ctx->accessed & BIT(JIT_REG_ZX)) {
-+ emit(ctx, daddiu, zx, MIPS_R_ZERO, -1);
-+ emit(ctx, dsrl32, zx, zx, 0);
-+ }
-+
-+ clobber_reg(ctx, MIPS_R_RA);
-+ clobber_reg(ctx, MIPS_R_V0);
-+ clobber_reg(ctx, MIPS_R_V1);
-+ return 0;
-+}
-+
-+/* Function tail call */
-+static int emit_tail_call(struct jit_context *ctx)
-+{
-+ u8 ary = bpf2mips64[BPF_REG_2];
-+ u8 ind = bpf2mips64[BPF_REG_3];
-+ u8 tcc = bpf2mips64[JIT_REG_TC];
-+ u8 tmp = MIPS_R_T6;
-+ int off;
-+
-+ /*
-+ * Tail call:
-+ * eBPF R1 - function argument (context ptr), passed in a0-a1
-+ * eBPF R2 - ptr to object with array of function entry points
-+ * eBPF R3 - array index of function to be called
-+ */
-+
-+ /* if (ind >= ary->map.max_entries) goto out */
-+ off = offsetof(struct bpf_array, map.max_entries);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, lwu, tmp, off, ary); /* tmp = ary->map.max_entrs*/
-+ emit(ctx, sltu, tmp, ind, tmp); /* tmp = ind < t1 */
-+ emit(ctx, beqz, tmp, get_offset(ctx, 1)); /* PC += off(1) if tmp == 0*/
-+
-+ /* if (--TCC < 0) goto out */
-+ emit(ctx, daddiu, tcc, tcc, -1); /* tcc-- (delay slot) */
-+ emit(ctx, bltz, tcc, get_offset(ctx, 1)); /* PC += off(1) if tcc < 0 */
-+ /* (next insn delay slot) */
-+ /* prog = ary->ptrs[ind] */
-+ off = offsetof(struct bpf_array, ptrs);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, dsll, tmp, ind, 3); /* tmp = ind << 3 */
-+ emit(ctx, daddu, tmp, tmp, ary); /* tmp += ary */
-+ emit(ctx, ld, tmp, off, tmp); /* tmp = *(tmp + off) */
-+
-+ /* if (prog == 0) goto out */
-+ emit(ctx, beqz, tmp, get_offset(ctx, 1)); /* PC += off(1) if tmp == 0*/
-+ emit(ctx, nop); /* Delay slot */
-+
-+ /* func = prog->bpf_func + 8 (prologue skip offset) */
-+ off = offsetof(struct bpf_prog, bpf_func);
-+ if (off > 0x7fff)
-+ return -1;
-+ emit(ctx, ld, tmp, off, tmp); /* tmp = *(tmp + off) */
-+ emit(ctx, daddiu, tmp, tmp, JIT_TCALL_SKIP); /* tmp += skip (4) */
-+
-+ /* goto func */
-+ build_epilogue(ctx, tmp);
-+ access_reg(ctx, JIT_REG_TC);
-+ return 0;
-+}
-+
-+/*
-+ * Stack frame layout for a JITed program (stack grows down).
-+ *
-+ * Higher address : Previous stack frame :
-+ * +===========================+ <--- MIPS sp before call
-+ * | Callee-saved registers, |
-+ * | including RA and FP |
-+ * +---------------------------+ <--- eBPF FP (MIPS fp)
-+ * | Local eBPF variables |
-+ * | allocated by program |
-+ * +---------------------------+
-+ * | Reserved for caller-saved |
-+ * | registers |
-+ * Lower address +===========================+ <--- MIPS sp
-+ */
-+
-+/* Build program prologue to set up the stack and registers */
-+void build_prologue(struct jit_context *ctx)
-+{
-+ u8 fp = bpf2mips64[BPF_REG_FP];
-+ u8 tc = bpf2mips64[JIT_REG_TC];
-+ u8 zx = bpf2mips64[JIT_REG_ZX];
-+ int stack, saved, locals, reserved;
-+
-+ /*
-+ * The first instruction initializes the tail call count register.
-+ * On a tail call, the calling function jumps into the prologue
-+ * after this instruction.
-+ */
-+ emit(ctx, addiu, tc, MIPS_R_ZERO, min(MAX_TAIL_CALL_CNT + 1, 0xffff));
-+
-+ /* === Entry-point for tail calls === */
-+
-+ /*
-+ * If the eBPF frame pointer and tail call count registers were
-+ * accessed they must be preserved. Mark them as clobbered here
-+ * to save and restore them on the stack as needed.
-+ */
-+ if (ctx->accessed & BIT(BPF_REG_FP))
-+ clobber_reg(ctx, fp);
-+ if (ctx->accessed & BIT(JIT_REG_TC))
-+ clobber_reg(ctx, tc);
-+ if (ctx->accessed & BIT(JIT_REG_ZX))
-+ clobber_reg(ctx, zx);
-+
-+ /* Compute the stack space needed for callee-saved registers */
-+ saved = hweight32(ctx->clobbered & JIT_CALLEE_REGS) * sizeof(u64);
-+ saved = ALIGN(saved, MIPS_STACK_ALIGNMENT);
-+
-+ /* Stack space used by eBPF program local data */
-+ locals = ALIGN(ctx->program->aux->stack_depth, MIPS_STACK_ALIGNMENT);
-+
-+ /*
-+ * If we are emitting function calls, reserve extra stack space for
-+ * caller-saved registers needed by the JIT. The required space is
-+ * computed automatically during resource usage discovery (pass 1).
-+ */
-+ reserved = ctx->stack_used;
-+
-+ /* Allocate the stack frame */
-+ stack = ALIGN(saved + locals + reserved, MIPS_STACK_ALIGNMENT);
-+ if (stack)
-+ emit(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, -stack);
-+
-+ /* Store callee-saved registers on stack */
-+ push_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0, stack - saved);
-+
-+ /* Initialize the eBPF frame pointer if accessed */
-+ if (ctx->accessed & BIT(BPF_REG_FP))
-+ emit(ctx, daddiu, fp, MIPS_R_SP, stack - saved);
-+
-+ /* Initialize the ePF JIT zero-extension register if accessed */
-+ if (ctx->accessed & BIT(JIT_REG_ZX)) {
-+ emit(ctx, daddiu, zx, MIPS_R_ZERO, -1);
-+ emit(ctx, dsrl32, zx, zx, 0);
-+ }
-+
-+ ctx->saved_size = saved;
-+ ctx->stack_size = stack;
-+}
-+
-+/* Build the program epilogue to restore the stack and registers */
-+void build_epilogue(struct jit_context *ctx, int dest_reg)
-+{
-+ /* Restore callee-saved registers from stack */
-+ pop_regs(ctx, ctx->clobbered & JIT_CALLEE_REGS, 0,
-+ ctx->stack_size - ctx->saved_size);
-+
-+ /* Release the stack frame */
-+ if (ctx->stack_size)
-+ emit(ctx, daddiu, MIPS_R_SP, MIPS_R_SP, ctx->stack_size);
-+
-+ /* Jump to return address and sign-extend the 32-bit return value */
-+ emit(ctx, jr, dest_reg);
-+ emit(ctx, sll, MIPS_R_V0, MIPS_R_V0, 0); /* Delay slot */
-+}
-+
-+/* Build one eBPF instruction */
-+int build_insn(const struct bpf_insn *insn, struct jit_context *ctx)
-+{
-+ u8 dst = bpf2mips64[insn->dst_reg];
-+ u8 src = bpf2mips64[insn->src_reg];
-+ u8 code = insn->code;
-+ s16 off = insn->off;
-+ s32 imm = insn->imm;
-+ s32 val, rel;
-+ u8 alu, jmp;
-+
-+ switch (code) {
-+ /* ALU operations */
-+ /* dst = imm */
-+ case BPF_ALU | BPF_MOV | BPF_K:
-+ emit_mov_i(ctx, dst, imm);
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = src */
-+ case BPF_ALU | BPF_MOV | BPF_X:
-+ if (imm == 1) {
-+ /* Special mov32 for zext */
-+ emit_zext(ctx, dst);
-+ } else {
-+ emit_mov_r(ctx, dst, src);
-+ emit_zext_ver(ctx, dst);
-+ }
-+ break;
-+ /* dst = -dst */
-+ case BPF_ALU | BPF_NEG:
-+ emit_sext(ctx, dst, dst);
-+ emit_alu_i(ctx, dst, 0, BPF_NEG);
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst & imm */
-+ /* dst = dst | imm */
-+ /* dst = dst ^ imm */
-+ /* dst = dst << imm */
-+ case BPF_ALU | BPF_OR | BPF_K:
-+ case BPF_ALU | BPF_AND | BPF_K:
-+ case BPF_ALU | BPF_XOR | BPF_K:
-+ case BPF_ALU | BPF_LSH | BPF_K:
-+ if (!valid_alu_i(BPF_OP(code), imm)) {
-+ emit_mov_i(ctx, MIPS_R_T4, imm);
-+ emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
-+ } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
-+ emit_alu_i(ctx, dst, val, alu);
-+ }
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst >> imm */
-+ /* dst = dst >> imm (arithmetic) */
-+ /* dst = dst + imm */
-+ /* dst = dst - imm */
-+ /* dst = dst * imm */
-+ /* dst = dst / imm */
-+ /* dst = dst % imm */
-+ case BPF_ALU | BPF_RSH | BPF_K:
-+ case BPF_ALU | BPF_ARSH | BPF_K:
-+ case BPF_ALU | BPF_ADD | BPF_K:
-+ case BPF_ALU | BPF_SUB | BPF_K:
-+ case BPF_ALU | BPF_MUL | BPF_K:
-+ case BPF_ALU | BPF_DIV | BPF_K:
-+ case BPF_ALU | BPF_MOD | BPF_K:
-+ if (!valid_alu_i(BPF_OP(code), imm)) {
-+ emit_sext(ctx, dst, dst);
-+ emit_mov_i(ctx, MIPS_R_T4, imm);
-+ emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
-+ } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
-+ emit_sext(ctx, dst, dst);
-+ emit_alu_i(ctx, dst, val, alu);
-+ }
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst & src */
-+ /* dst = dst | src */
-+ /* dst = dst ^ src */
-+ /* dst = dst << src */
-+ case BPF_ALU | BPF_AND | BPF_X:
-+ case BPF_ALU | BPF_OR | BPF_X:
-+ case BPF_ALU | BPF_XOR | BPF_X:
-+ case BPF_ALU | BPF_LSH | BPF_X:
-+ emit_alu_r(ctx, dst, src, BPF_OP(code));
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = dst >> src */
-+ /* dst = dst >> src (arithmetic) */
-+ /* dst = dst + src */
-+ /* dst = dst - src */
-+ /* dst = dst * src */
-+ /* dst = dst / src */
-+ /* dst = dst % src */
-+ case BPF_ALU | BPF_RSH | BPF_X:
-+ case BPF_ALU | BPF_ARSH | BPF_X:
-+ case BPF_ALU | BPF_ADD | BPF_X:
-+ case BPF_ALU | BPF_SUB | BPF_X:
-+ case BPF_ALU | BPF_MUL | BPF_X:
-+ case BPF_ALU | BPF_DIV | BPF_X:
-+ case BPF_ALU | BPF_MOD | BPF_X:
-+ emit_sext(ctx, dst, dst);
-+ emit_sext(ctx, MIPS_R_T4, src);
-+ emit_alu_r(ctx, dst, MIPS_R_T4, BPF_OP(code));
-+ emit_zext_ver(ctx, dst);
-+ break;
-+ /* dst = imm (64-bit) */
-+ case BPF_ALU64 | BPF_MOV | BPF_K:
-+ emit_mov_i(ctx, dst, imm);
-+ break;
-+ /* dst = src (64-bit) */
-+ case BPF_ALU64 | BPF_MOV | BPF_X:
-+ emit_mov_r(ctx, dst, src);
-+ break;
-+ /* dst = -dst (64-bit) */
-+ case BPF_ALU64 | BPF_NEG:
-+ emit_alu_i64(ctx, dst, 0, BPF_NEG);
-+ break;
-+ /* dst = dst & imm (64-bit) */
-+ /* dst = dst | imm (64-bit) */
-+ /* dst = dst ^ imm (64-bit) */
-+ /* dst = dst << imm (64-bit) */
-+ /* dst = dst >> imm (64-bit) */
-+ /* dst = dst >> imm ((64-bit, arithmetic) */
-+ /* dst = dst + imm (64-bit) */
-+ /* dst = dst - imm (64-bit) */
-+ /* dst = dst * imm (64-bit) */
-+ /* dst = dst / imm (64-bit) */
-+ /* dst = dst % imm (64-bit) */
-+ case BPF_ALU64 | BPF_AND | BPF_K:
-+ case BPF_ALU64 | BPF_OR | BPF_K:
-+ case BPF_ALU64 | BPF_XOR | BPF_K:
-+ case BPF_ALU64 | BPF_LSH | BPF_K:
-+ case BPF_ALU64 | BPF_RSH | BPF_K:
-+ case BPF_ALU64 | BPF_ARSH | BPF_K:
-+ case BPF_ALU64 | BPF_ADD | BPF_K:
-+ case BPF_ALU64 | BPF_SUB | BPF_K:
-+ case BPF_ALU64 | BPF_MUL | BPF_K:
-+ case BPF_ALU64 | BPF_DIV | BPF_K:
-+ case BPF_ALU64 | BPF_MOD | BPF_K:
-+ if (!valid_alu_i(BPF_OP(code), imm)) {
-+ emit_mov_i(ctx, MIPS_R_T4, imm);
-+ emit_alu_r64(ctx, dst, MIPS_R_T4, BPF_OP(code));
-+ } else if (rewrite_alu_i(BPF_OP(code), imm, &alu, &val)) {
-+ emit_alu_i64(ctx, dst, val, alu);
-+ }
-+ break;
-+ /* dst = dst & src (64-bit) */
-+ /* dst = dst | src (64-bit) */
-+ /* dst = dst ^ src (64-bit) */
-+ /* dst = dst << src (64-bit) */
-+ /* dst = dst >> src (64-bit) */
-+ /* dst = dst >> src (64-bit, arithmetic) */
-+ /* dst = dst + src (64-bit) */
-+ /* dst = dst - src (64-bit) */
-+ /* dst = dst * src (64-bit) */
-+ /* dst = dst / src (64-bit) */
-+ /* dst = dst % src (64-bit) */
-+ case BPF_ALU64 | BPF_AND | BPF_X:
-+ case BPF_ALU64 | BPF_OR | BPF_X:
-+ case BPF_ALU64 | BPF_XOR | BPF_X:
-+ case BPF_ALU64 | BPF_LSH | BPF_X:
-+ case BPF_ALU64 | BPF_RSH | BPF_X:
-+ case BPF_ALU64 | BPF_ARSH | BPF_X:
-+ case BPF_ALU64 | BPF_ADD | BPF_X:
-+ case BPF_ALU64 | BPF_SUB | BPF_X:
-+ case BPF_ALU64 | BPF_MUL | BPF_X:
-+ case BPF_ALU64 | BPF_DIV | BPF_X:
-+ case BPF_ALU64 | BPF_MOD | BPF_X:
-+ emit_alu_r64(ctx, dst, src, BPF_OP(code));
-+ break;
-+ /* dst = htole(dst) */
-+ /* dst = htobe(dst) */
-+ case BPF_ALU | BPF_END | BPF_FROM_LE:
-+ case BPF_ALU | BPF_END | BPF_FROM_BE:
-+ if (BPF_SRC(code) ==
-+#ifdef __BIG_ENDIAN
-+ BPF_FROM_LE
-+#else
-+ BPF_FROM_BE
-+#endif
-+ )
-+ emit_bswap_r64(ctx, dst, imm);
-+ else
-+ emit_trunc_r64(ctx, dst, imm);
-+ break;
-+ /* dst = imm64 */
-+ case BPF_LD | BPF_IMM | BPF_DW:
-+ emit_mov_i64(ctx, dst, (u32)imm | ((u64)insn[1].imm << 32));
-+ return 1;
-+ /* LDX: dst = *(size *)(src + off) */
-+ case BPF_LDX | BPF_MEM | BPF_W:
-+ case BPF_LDX | BPF_MEM | BPF_H:
-+ case BPF_LDX | BPF_MEM | BPF_B:
-+ case BPF_LDX | BPF_MEM | BPF_DW:
-+ emit_ldx(ctx, dst, src, off, BPF_SIZE(code));
-+ break;
-+ /* ST: *(size *)(dst + off) = imm */
-+ case BPF_ST | BPF_MEM | BPF_W:
-+ case BPF_ST | BPF_MEM | BPF_H:
-+ case BPF_ST | BPF_MEM | BPF_B:
-+ case BPF_ST | BPF_MEM | BPF_DW:
-+ emit_mov_i(ctx, MIPS_R_T4, imm);
-+ emit_stx(ctx, dst, MIPS_R_T4, off, BPF_SIZE(code));
-+ break;
-+ /* STX: *(size *)(dst + off) = src */
-+ case BPF_STX | BPF_MEM | BPF_W:
-+ case BPF_STX | BPF_MEM | BPF_H:
-+ case BPF_STX | BPF_MEM | BPF_B:
-+ case BPF_STX | BPF_MEM | BPF_DW:
-+ emit_stx(ctx, dst, src, off, BPF_SIZE(code));
-+ break;
-+ /* Speculation barrier */
-+ case BPF_ST | BPF_NOSPEC:
-+ break;
-+ /* Atomics */
-+ case BPF_STX | BPF_XADD | BPF_W:
-+ case BPF_STX | BPF_XADD | BPF_DW:
-+ switch (imm) {
-+ case BPF_ADD:
-+ case BPF_AND:
-+ case BPF_OR:
-+ case BPF_XOR:
-+ if (BPF_SIZE(code) == BPF_DW) {
-+ emit_atomic_r64(ctx, dst, src, off, imm);
-+ } else { /* 32-bit, no fetch */
-+ emit_sext(ctx, MIPS_R_T4, src);
-+ emit_atomic_r(ctx, dst, MIPS_R_T4, off, imm);
-+ }
-+ break;
-+ default:
-+ goto notyet;
-+ }
-+ break;
-+ /* PC += off if dst == src */
-+ /* PC += off if dst != src */
-+ /* PC += off if dst & src */
-+ /* PC += off if dst > src */
-+ /* PC += off if dst >= src */
-+ /* PC += off if dst < src */
-+ /* PC += off if dst <= src */
-+ /* PC += off if dst > src (signed) */
-+ /* PC += off if dst >= src (signed) */
-+ /* PC += off if dst < src (signed) */
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JMP32 | BPF_JEQ | BPF_X:
-+ case BPF_JMP32 | BPF_JNE | BPF_X:
-+ case BPF_JMP32 | BPF_JSET | BPF_X:
-+ case BPF_JMP32 | BPF_JGT | BPF_X:
-+ case BPF_JMP32 | BPF_JGE | BPF_X:
-+ case BPF_JMP32 | BPF_JLT | BPF_X:
-+ case BPF_JMP32 | BPF_JLE | BPF_X:
-+ case BPF_JMP32 | BPF_JSGT | BPF_X:
-+ case BPF_JMP32 | BPF_JSGE | BPF_X:
-+ case BPF_JMP32 | BPF_JSLT | BPF_X:
-+ case BPF_JMP32 | BPF_JSLE | BPF_X:
-+ if (off == 0)
-+ break;
-+ setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
-+ emit_sext(ctx, MIPS_R_T4, dst); /* Sign-extended dst */
-+ emit_sext(ctx, MIPS_R_T5, src); /* Sign-extended src */
-+ emit_jmp_r(ctx, MIPS_R_T4, MIPS_R_T5, rel, jmp);
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == imm */
-+ /* PC += off if dst != imm */
-+ /* PC += off if dst & imm */
-+ /* PC += off if dst > imm */
-+ /* PC += off if dst >= imm */
-+ /* PC += off if dst < imm */
-+ /* PC += off if dst <= imm */
-+ /* PC += off if dst > imm (signed) */
-+ /* PC += off if dst >= imm (signed) */
-+ /* PC += off if dst < imm (signed) */
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JMP32 | BPF_JEQ | BPF_K:
-+ case BPF_JMP32 | BPF_JNE | BPF_K:
-+ case BPF_JMP32 | BPF_JSET | BPF_K:
-+ case BPF_JMP32 | BPF_JGT | BPF_K:
-+ case BPF_JMP32 | BPF_JGE | BPF_K:
-+ case BPF_JMP32 | BPF_JLT | BPF_K:
-+ case BPF_JMP32 | BPF_JLE | BPF_K:
-+ case BPF_JMP32 | BPF_JSGT | BPF_K:
-+ case BPF_JMP32 | BPF_JSGE | BPF_K:
-+ case BPF_JMP32 | BPF_JSLT | BPF_K:
-+ case BPF_JMP32 | BPF_JSLE | BPF_K:
-+ if (off == 0)
-+ break;
-+ setup_jmp_i(ctx, imm, 32, BPF_OP(code), off, &jmp, &rel);
-+ emit_sext(ctx, MIPS_R_T4, dst); /* Sign-extended dst */
-+ if (valid_jmp_i(jmp, imm)) {
-+ emit_jmp_i(ctx, MIPS_R_T4, imm, rel, jmp);
-+ } else {
-+ /* Move large immediate to register, sign-extended */
-+ emit_mov_i(ctx, MIPS_R_T5, imm);
-+ emit_jmp_r(ctx, MIPS_R_T4, MIPS_R_T5, rel, jmp);
-+ }
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == src */
-+ /* PC += off if dst != src */
-+ /* PC += off if dst & src */
-+ /* PC += off if dst > src */
-+ /* PC += off if dst >= src */
-+ /* PC += off if dst < src */
-+ /* PC += off if dst <= src */
-+ /* PC += off if dst > src (signed) */
-+ /* PC += off if dst >= src (signed) */
-+ /* PC += off if dst < src (signed) */
-+ /* PC += off if dst <= src (signed) */
-+ case BPF_JMP | BPF_JEQ | BPF_X:
-+ case BPF_JMP | BPF_JNE | BPF_X:
-+ case BPF_JMP | BPF_JSET | BPF_X:
-+ case BPF_JMP | BPF_JGT | BPF_X:
-+ case BPF_JMP | BPF_JGE | BPF_X:
-+ case BPF_JMP | BPF_JLT | BPF_X:
-+ case BPF_JMP | BPF_JLE | BPF_X:
-+ case BPF_JMP | BPF_JSGT | BPF_X:
-+ case BPF_JMP | BPF_JSGE | BPF_X:
-+ case BPF_JMP | BPF_JSLT | BPF_X:
-+ case BPF_JMP | BPF_JSLE | BPF_X:
-+ if (off == 0)
-+ break;
-+ setup_jmp_r(ctx, dst == src, BPF_OP(code), off, &jmp, &rel);
-+ emit_jmp_r(ctx, dst, src, rel, jmp);
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off if dst == imm */
-+ /* PC += off if dst != imm */
-+ /* PC += off if dst & imm */
-+ /* PC += off if dst > imm */
-+ /* PC += off if dst >= imm */
-+ /* PC += off if dst < imm */
-+ /* PC += off if dst <= imm */
-+ /* PC += off if dst > imm (signed) */
-+ /* PC += off if dst >= imm (signed) */
-+ /* PC += off if dst < imm (signed) */
-+ /* PC += off if dst <= imm (signed) */
-+ case BPF_JMP | BPF_JEQ | BPF_K:
-+ case BPF_JMP | BPF_JNE | BPF_K:
-+ case BPF_JMP | BPF_JSET | BPF_K:
-+ case BPF_JMP | BPF_JGT | BPF_K:
-+ case BPF_JMP | BPF_JGE | BPF_K:
-+ case BPF_JMP | BPF_JLT | BPF_K:
-+ case BPF_JMP | BPF_JLE | BPF_K:
-+ case BPF_JMP | BPF_JSGT | BPF_K:
-+ case BPF_JMP | BPF_JSGE | BPF_K:
-+ case BPF_JMP | BPF_JSLT | BPF_K:
-+ case BPF_JMP | BPF_JSLE | BPF_K:
-+ if (off == 0)
-+ break;
-+ setup_jmp_i(ctx, imm, 64, BPF_OP(code), off, &jmp, &rel);
-+ if (valid_jmp_i(jmp, imm)) {
-+ emit_jmp_i(ctx, dst, imm, rel, jmp);
-+ } else {
-+ /* Move large immediate to register */
-+ emit_mov_i(ctx, MIPS_R_T4, imm);
-+ emit_jmp_r(ctx, dst, MIPS_R_T4, rel, jmp);
-+ }
-+ if (finish_jmp(ctx, jmp, off) < 0)
-+ goto toofar;
-+ break;
-+ /* PC += off */
-+ case BPF_JMP | BPF_JA:
-+ if (off == 0)
-+ break;
-+ if (emit_ja(ctx, off) < 0)
-+ goto toofar;
-+ break;
-+ /* Tail call */
-+ case BPF_JMP | BPF_TAIL_CALL:
-+ if (emit_tail_call(ctx) < 0)
-+ goto invalid;
-+ break;
-+ /* Function call */
-+ case BPF_JMP | BPF_CALL:
-+ if (emit_call(ctx, insn) < 0)
-+ goto invalid;
-+ break;
-+ /* Function return */
-+ case BPF_JMP | BPF_EXIT:
-+ /*
-+ * Optimization: when last instruction is EXIT
-+ * simply continue to epilogue.
-+ */
-+ if (ctx->bpf_index == ctx->program->len - 1)
-+ break;
-+ if (emit_exit(ctx) < 0)
-+ goto toofar;
-+ break;
-+
-+ default:
-+invalid:
-+ pr_err_once("unknown opcode %02x\n", code);
-+ return -EINVAL;
-+notyet:
-+ pr_info_once("*** NOT YET: opcode %02x ***\n", code);
-+ return -EFAULT;
-+toofar:
-+ pr_info_once("*** TOO FAR: jump at %u opcode %02x ***\n",
-+ ctx->bpf_index, code);
-+ return -E2BIG;
-+ }
-+ return 0;
-+}
diff --git a/target/linux/generic/backport-5.4/071-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch b/target/linux/generic/backport-5.4/071-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch
deleted file mode 100644
index 63553ebe58..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-04-mips-bpf-Add-JIT-workarounds-for-CPU-errata.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:06 +0200
-Subject: [PATCH] mips: bpf: Add JIT workarounds for CPU errata
-
-This patch adds workarounds for the following CPU errata to the MIPS
-eBPF JIT, if enabled in the kernel configuration.
-
- - R10000 ll/sc weak ordering
- - Loongson-3 ll/sc weak ordering
- - Loongson-2F jump hang
-
-The Loongson-2F nop errata is implemented in uasm, which the JIT uses,
-so no additional mitigations are needed for that.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
----
-
---- a/arch/mips/net/bpf_jit_comp.c
-+++ b/arch/mips/net/bpf_jit_comp.c
-@@ -404,6 +404,7 @@ void emit_alu_r(struct jit_context *ctx,
- /* Atomic read-modify-write (32-bit) */
- void emit_atomic_r(struct jit_context *ctx, u8 dst, u8 src, s16 off, u8 code)
- {
-+ LLSC_sync(ctx);
- emit(ctx, ll, MIPS_R_T9, off, dst);
- switch (code) {
- case BPF_ADD:
-@@ -420,18 +421,19 @@ void emit_atomic_r(struct jit_context *c
- break;
- }
- emit(ctx, sc, MIPS_R_T8, off, dst);
-- emit(ctx, beqz, MIPS_R_T8, -16);
-+ emit(ctx, LLSC_beqz, MIPS_R_T8, -16 - LLSC_offset);
- emit(ctx, nop); /* Delay slot */
- }
-
- /* Atomic compare-and-exchange (32-bit) */
- void emit_cmpxchg_r(struct jit_context *ctx, u8 dst, u8 src, u8 res, s16 off)
- {
-+ LLSC_sync(ctx);
- emit(ctx, ll, MIPS_R_T9, off, dst);
- emit(ctx, bne, MIPS_R_T9, res, 12);
- emit(ctx, move, MIPS_R_T8, src); /* Delay slot */
- emit(ctx, sc, MIPS_R_T8, off, dst);
-- emit(ctx, beqz, MIPS_R_T8, -20);
-+ emit(ctx, LLSC_beqz, MIPS_R_T8, -20 - LLSC_offset);
- emit(ctx, move, res, MIPS_R_T9); /* Delay slot */
- clobber_reg(ctx, res);
- }
---- a/arch/mips/net/bpf_jit_comp.h
-+++ b/arch/mips/net/bpf_jit_comp.h
-@@ -87,7 +87,7 @@ struct jit_context {
- };
-
- /* Emit the instruction if the JIT memory space has been allocated */
--#define emit(ctx, func, ...) \
-+#define __emit(ctx, func, ...) \
- do { \
- if ((ctx)->target != NULL) { \
- u32 *p = &(ctx)->target[ctx->jit_index]; \
-@@ -95,6 +95,30 @@ do { \
- } \
- (ctx)->jit_index++; \
- } while (0)
-+#define emit(...) __emit(__VA_ARGS__)
-+
-+/* Workaround for R10000 ll/sc errata */
-+#ifdef CONFIG_WAR_R10000
-+#define LLSC_beqz beqzl
-+#else
-+#define LLSC_beqz beqz
-+#endif
-+
-+/* Workaround for Loongson-3 ll/sc errata */
-+#ifdef CONFIG_CPU_LOONGSON3_WORKAROUNDS
-+#define LLSC_sync(ctx) emit(ctx, sync, 0)
-+#define LLSC_offset 4
-+#else
-+#define LLSC_sync(ctx)
-+#define LLSC_offset 0
-+#endif
-+
-+/* Workaround for Loongson-2F jump errata */
-+#ifdef CONFIG_CPU_JUMP_WORKAROUNDS
-+#define JALR_MASK 0xffffffffcfffffffULL
-+#else
-+#define JALR_MASK (~0ULL)
-+#endif
-
- /*
- * Mark a BPF register as accessed, it needs to be
---- a/arch/mips/net/bpf_jit_comp64.c
-+++ b/arch/mips/net/bpf_jit_comp64.c
-@@ -375,6 +375,7 @@ static void emit_atomic_r64(struct jit_c
- u8 t1 = MIPS_R_T6;
- u8 t2 = MIPS_R_T7;
-
-+ LLSC_sync(ctx);
- emit(ctx, lld, t1, off, dst);
- switch (code) {
- case BPF_ADD:
-@@ -391,7 +392,7 @@ static void emit_atomic_r64(struct jit_c
- break;
- }
- emit(ctx, scd, t2, off, dst);
-- emit(ctx, beqz, t2, -16);
-+ emit(ctx, LLSC_beqz, t2, -16 - LLSC_offset);
- emit(ctx, nop); /* Delay slot */
- }
-
-@@ -414,7 +415,7 @@ static int emit_call(struct jit_context
- push_regs(ctx, ctx->clobbered & JIT_CALLER_REGS, 0, 0);
-
- /* Emit function call */
-- emit_mov_i64(ctx, tmp, addr);
-+ emit_mov_i64(ctx, tmp, addr & JALR_MASK);
- emit(ctx, jalr, MIPS_R_RA, tmp);
- emit(ctx, nop); /* Delay slot */
-
diff --git a/target/linux/generic/backport-5.4/071-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch b/target/linux/generic/backport-5.4/071-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch
deleted file mode 100644
index c8ce0becf9..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-05-mips-bpf-Enable-eBPF-JITs.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:07 +0200
-Subject: [PATCH] mips: bpf: Enable eBPF JITs
-
-This patch enables the new eBPF JITs for 32-bit and 64-bit MIPS. It also
-disables the old cBPF JIT to so cBPF programs are converted to use the
-new JIT.
-
-Workarounds for R4000 CPU errata are not implemented by the JIT, so the
-JIT is disabled if any of those workarounds are configured.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
----
-
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -3099,6 +3099,7 @@ S: Supported
- F: arch/arm64/net/
-
- BPF JIT for MIPS (32-BIT AND 64-BIT)
-+M: Johan Almbladh <johan.almbladh@anyfinetworks.com>
- M: Paul Burton <paulburton@kernel.org>
- L: netdev@vger.kernel.org
- L: bpf@vger.kernel.org
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -46,8 +46,10 @@ config MIPS
- select HAVE_ARCH_TRACEHOOK
- select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
- select HAVE_ASM_MODVERSIONS
-- select HAVE_CBPF_JIT if !64BIT && !CPU_MICROMIPS
-- select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2
-+ select HAVE_EBPF_JIT if !CPU_MICROMIPS && \
-+ !CPU_DADDI_WORKAROUNDS && \
-+ !CPU_R4000_WORKAROUNDS && \
-+ !CPU_R4400_WORKAROUNDS
- select HAVE_CONTEXT_TRACKING
- select HAVE_COPY_THREAD_TLS
- select HAVE_C_RECORDMCOUNT
---- a/arch/mips/net/Makefile
-+++ b/arch/mips/net/Makefile
-@@ -2,9 +2,10 @@
- # MIPS networking code
-
- obj-$(CONFIG_MIPS_CBPF_JIT) += bpf_jit.o bpf_jit_asm.o
-+obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o
-
- ifeq ($(CONFIG_32BIT),y)
-- obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp.o bpf_jit_comp32.o
-+ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp32.o
- else
-- obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o
-+ obj-$(CONFIG_MIPS_EBPF_JIT) += bpf_jit_comp64.o
- endif
diff --git a/target/linux/generic/backport-5.4/071-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch b/target/linux/generic/backport-5.4/071-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch
deleted file mode 100644
index e25c336831..0000000000
--- a/target/linux/generic/backport-5.4/071-v5.16-06-mips-bpf-Remove-old-BPF-JIT-implementations.patch
+++ /dev/null
@@ -1,387 +0,0 @@
-From: Johan Almbladh <johan.almbladh@anyfinetworks.com>
-Date: Tue, 5 Oct 2021 18:54:08 +0200
-Subject: [PATCH] mips: bpf: Remove old BPF JIT implementations
-
-This patch removes the old 32-bit cBPF and 64-bit eBPF JIT implementations.
-They are replaced by a new eBPF implementation that supports both 32-bit
-and 64-bit MIPS CPUs.
-
-Signed-off-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
----
- delete mode 100644 arch/mips/net/bpf_jit.c
- delete mode 100644 arch/mips/net/bpf_jit.h
- delete mode 100644 arch/mips/net/bpf_jit_asm.S
- delete mode 100644 arch/mips/net/ebpf_jit.c
-
---- a/arch/mips/net/bpf_jit.h
-+++ /dev/null
-@@ -1,81 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0-only */
--/*
-- * Just-In-Time compiler for BPF filters on MIPS
-- *
-- * Copyright (c) 2014 Imagination Technologies Ltd.
-- * Author: Markos Chandras <markos.chandras@imgtec.com>
-- */
--
--#ifndef BPF_JIT_MIPS_OP_H
--#define BPF_JIT_MIPS_OP_H
--
--/* Registers used by JIT */
--#define MIPS_R_ZERO 0
--#define MIPS_R_V0 2
--#define MIPS_R_A0 4
--#define MIPS_R_A1 5
--#define MIPS_R_T4 12
--#define MIPS_R_T5 13
--#define MIPS_R_T6 14
--#define MIPS_R_T7 15
--#define MIPS_R_S0 16
--#define MIPS_R_S1 17
--#define MIPS_R_S2 18
--#define MIPS_R_S3 19
--#define MIPS_R_S4 20
--#define MIPS_R_S5 21
--#define MIPS_R_S6 22
--#define MIPS_R_S7 23
--#define MIPS_R_SP 29
--#define MIPS_R_RA 31
--
--/* Conditional codes */
--#define MIPS_COND_EQ 0x1
--#define MIPS_COND_GE (0x1 << 1)
--#define MIPS_COND_GT (0x1 << 2)
--#define MIPS_COND_NE (0x1 << 3)
--#define MIPS_COND_ALL (0x1 << 4)
--/* Conditionals on X register or K immediate */
--#define MIPS_COND_X (0x1 << 5)
--#define MIPS_COND_K (0x1 << 6)
--
--#define r_ret MIPS_R_V0
--
--/*
-- * Use 2 scratch registers to avoid pipeline interlocks.
-- * There is no overhead during epilogue and prologue since
-- * any of the $s0-$s6 registers will only be preserved if
-- * they are going to actually be used.
-- */
--#define r_skb_hl MIPS_R_S0 /* skb header length */
--#define r_skb_data MIPS_R_S1 /* skb actual data */
--#define r_off MIPS_R_S2
--#define r_A MIPS_R_S3
--#define r_X MIPS_R_S4
--#define r_skb MIPS_R_S5
--#define r_M MIPS_R_S6
--#define r_skb_len MIPS_R_S7
--#define r_s0 MIPS_R_T4 /* scratch reg 1 */
--#define r_s1 MIPS_R_T5 /* scratch reg 2 */
--#define r_tmp_imm MIPS_R_T6 /* No need to preserve this */
--#define r_tmp MIPS_R_T7 /* No need to preserve this */
--#define r_zero MIPS_R_ZERO
--#define r_sp MIPS_R_SP
--#define r_ra MIPS_R_RA
--
--#ifndef __ASSEMBLY__
--
--/* Declare ASM helpers */
--
--#define DECLARE_LOAD_FUNC(func) \
-- extern u8 func(unsigned long *skb, int offset); \
-- extern u8 func##_negative(unsigned long *skb, int offset); \
-- extern u8 func##_positive(unsigned long *skb, int offset)
--
--DECLARE_LOAD_FUNC(sk_load_word);
--DECLARE_LOAD_FUNC(sk_load_half);
--DECLARE_LOAD_FUNC(sk_load_byte);
--
--#endif
--
--#endif /* BPF_JIT_MIPS_OP_H */
---- a/arch/mips/net/bpf_jit_asm.S
-+++ /dev/null
-@@ -1,285 +0,0 @@
--/*
-- * bpf_jib_asm.S: Packet/header access helper functions for MIPS/MIPS64 BPF
-- * compiler.
-- *
-- * Copyright (C) 2015 Imagination Technologies Ltd.
-- * Author: Markos Chandras <markos.chandras@imgtec.com>
-- *
-- * This program is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License as published by the
-- * Free Software Foundation; version 2 of the License.
-- */
--
--#include <asm/asm.h>
--#include <asm/isa-rev.h>
--#include <asm/regdef.h>
--#include "bpf_jit.h"
--
--/* ABI
-- *
-- * r_skb_hl skb header length
-- * r_skb_data skb data
-- * r_off(a1) offset register
-- * r_A BPF register A
-- * r_X PF register X
-- * r_skb(a0) *skb
-- * r_M *scratch memory
-- * r_skb_le skb length
-- * r_s0 Scratch register 0
-- * r_s1 Scratch register 1
-- *
-- * On entry:
-- * a0: *skb
-- * a1: offset (imm or imm + X)
-- *
-- * All non-BPF-ABI registers are free for use. On return, we only
-- * care about r_ret. The BPF-ABI registers are assumed to remain
-- * unmodified during the entire filter operation.
-- */
--
--#define skb a0
--#define offset a1
--#define SKF_LL_OFF (-0x200000) /* Can't include linux/filter.h in assembly */
--
-- /* We know better :) so prevent assembler reordering etc */
-- .set noreorder
--
--#define is_offset_negative(TYPE) \
-- /* If offset is negative we have more work to do */ \
-- slti t0, offset, 0; \
-- bgtz t0, bpf_slow_path_##TYPE##_neg; \
-- /* Be careful what follows in DS. */
--
--#define is_offset_in_header(SIZE, TYPE) \
-- /* Reading from header? */ \
-- addiu $r_s0, $r_skb_hl, -SIZE; \
-- slt t0, $r_s0, offset; \
-- bgtz t0, bpf_slow_path_##TYPE; \
--
--LEAF(sk_load_word)
-- is_offset_negative(word)
--FEXPORT(sk_load_word_positive)
-- is_offset_in_header(4, word)
-- /* Offset within header boundaries */
-- PTR_ADDU t1, $r_skb_data, offset
-- .set reorder
-- lw $r_A, 0(t1)
-- .set noreorder
--#ifdef CONFIG_CPU_LITTLE_ENDIAN
--# if MIPS_ISA_REV >= 2
-- wsbh t0, $r_A
-- rotr $r_A, t0, 16
--# else
-- sll t0, $r_A, 24
-- srl t1, $r_A, 24
-- srl t2, $r_A, 8
-- or t0, t0, t1
-- andi t2, t2, 0xff00
-- andi t1, $r_A, 0xff00
-- or t0, t0, t2
-- sll t1, t1, 8
-- or $r_A, t0, t1
--# endif
--#endif
-- jr $r_ra
-- move $r_ret, zero
-- END(sk_load_word)
--
--LEAF(sk_load_half)
-- is_offset_negative(half)
--FEXPORT(sk_load_half_positive)
-- is_offset_in_header(2, half)
-- /* Offset within header boundaries */
-- PTR_ADDU t1, $r_skb_data, offset
-- lhu $r_A, 0(t1)
--#ifdef CONFIG_CPU_LITTLE_ENDIAN
--# if MIPS_ISA_REV >= 2
-- wsbh $r_A, $r_A
--# else
-- sll t0, $r_A, 8
-- srl t1, $r_A, 8
-- andi t0, t0, 0xff00
-- or $r_A, t0, t1
--# endif
--#endif
-- jr $r_ra
-- move $r_ret, zero
-- END(sk_load_half)
--
--LEAF(sk_load_byte)
-- is_offset_negative(byte)
--FEXPORT(sk_load_byte_positive)
-- is_offset_in_header(1, byte)
-- /* Offset within header boundaries */
-- PTR_ADDU t1, $r_skb_data, offset
-- lbu $r_A, 0(t1)
-- jr $r_ra
-- move $r_ret, zero
-- END(sk_load_byte)
--
--/*
-- * call skb_copy_bits:
-- * (prototype in linux/skbuff.h)
-- *
-- * int skb_copy_bits(sk_buff *skb, int offset, void *to, int len)
-- *
-- * o32 mandates we leave 4 spaces for argument registers in case
-- * the callee needs to use them. Even though we don't care about
-- * the argument registers ourselves, we need to allocate that space
-- * to remain ABI compliant since the callee may want to use that space.
-- * We also allocate 2 more spaces for $r_ra and our return register (*to).
-- *
-- * n64 is a bit different. The *caller* will allocate the space to preserve
-- * the arguments. So in 64-bit kernels, we allocate the 4-arg space for no
-- * good reason but it does not matter that much really.
-- *
-- * (void *to) is returned in r_s0
-- *
-- */
--#ifdef CONFIG_CPU_LITTLE_ENDIAN
--#define DS_OFFSET(SIZE) (4 * SZREG)
--#else
--#define DS_OFFSET(SIZE) ((4 * SZREG) + (4 - SIZE))
--#endif
--#define bpf_slow_path_common(SIZE) \
-- /* Quick check. Are we within reasonable boundaries? */ \
-- LONG_ADDIU $r_s1, $r_skb_len, -SIZE; \
-- sltu $r_s0, offset, $r_s1; \
-- beqz $r_s0, fault; \
-- /* Load 4th argument in DS */ \
-- LONG_ADDIU a3, zero, SIZE; \
-- PTR_ADDIU $r_sp, $r_sp, -(6 * SZREG); \
-- PTR_LA t0, skb_copy_bits; \
-- PTR_S $r_ra, (5 * SZREG)($r_sp); \
-- /* Assign low slot to a2 */ \
-- PTR_ADDIU a2, $r_sp, DS_OFFSET(SIZE); \
-- jalr t0; \
-- /* Reset our destination slot (DS but it's ok) */ \
-- INT_S zero, (4 * SZREG)($r_sp); \
-- /* \
-- * skb_copy_bits returns 0 on success and -EFAULT \
-- * on error. Our data live in a2. Do not bother with \
-- * our data if an error has been returned. \
-- */ \
-- /* Restore our frame */ \
-- PTR_L $r_ra, (5 * SZREG)($r_sp); \
-- INT_L $r_s0, (4 * SZREG)($r_sp); \
-- bltz v0, fault; \
-- PTR_ADDIU $r_sp, $r_sp, 6 * SZREG; \
-- move $r_ret, zero; \
--
--NESTED(bpf_slow_path_word, (6 * SZREG), $r_sp)
-- bpf_slow_path_common(4)
--#ifdef CONFIG_CPU_LITTLE_ENDIAN
--# if MIPS_ISA_REV >= 2
-- wsbh t0, $r_s0
-- jr $r_ra
-- rotr $r_A, t0, 16
--# else
-- sll t0, $r_s0, 24
-- srl t1, $r_s0, 24
-- srl t2, $r_s0, 8
-- or t0, t0, t1
-- andi t2, t2, 0xff00
-- andi t1, $r_s0, 0xff00
-- or t0, t0, t2
-- sll t1, t1, 8
-- jr $r_ra
-- or $r_A, t0, t1
--# endif
--#else
-- jr $r_ra
-- move $r_A, $r_s0
--#endif
--
-- END(bpf_slow_path_word)
--
--NESTED(bpf_slow_path_half, (6 * SZREG), $r_sp)
-- bpf_slow_path_common(2)
--#ifdef CONFIG_CPU_LITTLE_ENDIAN
--# if MIPS_ISA_REV >= 2
-- jr $r_ra
-- wsbh $r_A, $r_s0
--# else
-- sll t0, $r_s0, 8
-- andi t1, $r_s0, 0xff00
-- andi t0, t0, 0xff00
-- srl t1, t1, 8
-- jr $r_ra
-- or $r_A, t0, t1
--# endif
--#else
-- jr $r_ra
-- move $r_A, $r_s0
--#endif
--
-- END(bpf_slow_path_half)
--
--NESTED(bpf_slow_path_byte, (6 * SZREG), $r_sp)
-- bpf_slow_path_common(1)
-- jr $r_ra
-- move $r_A, $r_s0
--
-- END(bpf_slow_path_byte)
--
--/*
-- * Negative entry points
-- */
-- .macro bpf_is_end_of_data
-- li t0, SKF_LL_OFF
-- /* Reading link layer data? */
-- slt t1, offset, t0
-- bgtz t1, fault
-- /* Be careful what follows in DS. */
-- .endm
--/*
-- * call skb_copy_bits:
-- * (prototype in linux/filter.h)
-- *
-- * void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb,
-- * int k, unsigned int size)
-- *
-- * see above (bpf_slow_path_common) for ABI restrictions
-- */
--#define bpf_negative_common(SIZE) \
-- PTR_ADDIU $r_sp, $r_sp, -(6 * SZREG); \
-- PTR_LA t0, bpf_internal_load_pointer_neg_helper; \
-- PTR_S $r_ra, (5 * SZREG)($r_sp); \
-- jalr t0; \
-- li a2, SIZE; \
-- PTR_L $r_ra, (5 * SZREG)($r_sp); \
-- /* Check return pointer */ \
-- beqz v0, fault; \
-- PTR_ADDIU $r_sp, $r_sp, 6 * SZREG; \
-- /* Preserve our pointer */ \
-- move $r_s0, v0; \
-- /* Set return value */ \
-- move $r_ret, zero; \
--
--bpf_slow_path_word_neg:
-- bpf_is_end_of_data
--NESTED(sk_load_word_negative, (6 * SZREG), $r_sp)
-- bpf_negative_common(4)
-- jr $r_ra
-- lw $r_A, 0($r_s0)
-- END(sk_load_word_negative)
--
--bpf_slow_path_half_neg:
-- bpf_is_end_of_data
--NESTED(sk_load_half_negative, (6 * SZREG), $r_sp)
-- bpf_negative_common(2)
-- jr $r_ra
-- lhu $r_A, 0($r_s0)
-- END(sk_load_half_negative)
--
--bpf_slow_path_byte_neg:
-- bpf_is_end_of_data
--NESTED(sk_load_byte_negative, (6 * SZREG), $r_sp)
-- bpf_negative_common(1)
-- jr $r_ra
-- lbu $r_A, 0($r_s0)
-- END(sk_load_byte_negative)
--
--fault:
-- jr $r_ra
-- addiu $r_ret, zero, 1
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0001-crypto-lib-tidy-up-lib-crypto-Kconfig-and-Makefile.patch b/target/linux/generic/backport-5.4/080-wireguard-0001-crypto-lib-tidy-up-lib-crypto-Kconfig-and-Makefile.patch
deleted file mode 100644
index e32e18a357..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0001-crypto-lib-tidy-up-lib-crypto-Kconfig-and-Makefile.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:07 +0100
-Subject: [PATCH] crypto: lib - tidy up lib/crypto Kconfig and Makefile
-
-commit 746b2e024c67aa605ac12d135cd7085a49cf9dc4 upstream.
-
-In preparation of introducing a set of crypto library interfaces, tidy
-up the Makefile and split off the Kconfig symbols into a separate file.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/Kconfig | 13 +------------
- lib/crypto/Kconfig | 15 +++++++++++++++
- lib/crypto/Makefile | 16 ++++++++--------
- 3 files changed, 24 insertions(+), 20 deletions(-)
- create mode 100644 lib/crypto/Kconfig
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -878,9 +878,6 @@ config CRYPTO_SHA1_PPC_SPE
- SHA-1 secure hash standard (DFIPS 180-4) implemented
- using powerpc SPE SIMD instruction set.
-
--config CRYPTO_LIB_SHA256
-- tristate
--
- config CRYPTO_SHA256
- tristate "SHA224 and SHA256 digest algorithm"
- select CRYPTO_HASH
-@@ -1019,9 +1016,6 @@ config CRYPTO_GHASH_CLMUL_NI_INTEL
-
- comment "Ciphers"
-
--config CRYPTO_LIB_AES
-- tristate
--
- config CRYPTO_AES
- tristate "AES cipher algorithms"
- select CRYPTO_ALGAPI
-@@ -1150,9 +1144,6 @@ config CRYPTO_ANUBIS
- <https://www.cosic.esat.kuleuven.be/nessie/reports/>
- <http://www.larc.usp.br/~pbarreto/AnubisPage.html>
-
--config CRYPTO_LIB_ARC4
-- tristate
--
- config CRYPTO_ARC4
- tristate "ARC4 cipher algorithm"
- select CRYPTO_BLKCIPHER
-@@ -1339,9 +1330,6 @@ config CRYPTO_CAST6_AVX_X86_64
- This module provides the Cast6 cipher algorithm that processes
- eight blocks parallel using the AVX instruction set.
-
--config CRYPTO_LIB_DES
-- tristate
--
- config CRYPTO_DES
- tristate "DES and Triple DES EDE cipher algorithms"
- select CRYPTO_ALGAPI
-@@ -1845,6 +1833,7 @@ config CRYPTO_STATS
- config CRYPTO_HASH_INFO
- bool
-
-+source "lib/crypto/Kconfig"
- source "drivers/crypto/Kconfig"
- source "crypto/asymmetric_keys/Kconfig"
- source "certs/Kconfig"
---- /dev/null
-+++ b/lib/crypto/Kconfig
-@@ -0,0 +1,15 @@
-+# SPDX-License-Identifier: GPL-2.0
-+
-+comment "Crypto library routines"
-+
-+config CRYPTO_LIB_AES
-+ tristate
-+
-+config CRYPTO_LIB_ARC4
-+ tristate
-+
-+config CRYPTO_LIB_DES
-+ tristate
-+
-+config CRYPTO_LIB_SHA256
-+ tristate
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -1,13 +1,13 @@
- # SPDX-License-Identifier: GPL-2.0
-
--obj-$(CONFIG_CRYPTO_LIB_AES) += libaes.o
--libaes-y := aes.o
-+obj-$(CONFIG_CRYPTO_LIB_AES) += libaes.o
-+libaes-y := aes.o
-
--obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
--libarc4-y := arc4.o
-+obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
-+libarc4-y := arc4.o
-
--obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
--libdes-y := des.o
-+obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
-+libdes-y := des.o
-
--obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
--libsha256-y := sha256.o
-+obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
-+libsha256-y := sha256.o
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0002-crypto-chacha-move-existing-library-code-into-lib-cr.patch b/target/linux/generic/backport-5.4/080-wireguard-0002-crypto-chacha-move-existing-library-code-into-lib-cr.patch
deleted file mode 100644
index 177b5840d5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0002-crypto-chacha-move-existing-library-code-into-lib-cr.patch
+++ /dev/null
@@ -1,668 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:08 +0100
-Subject: [PATCH] crypto: chacha - move existing library code into lib/crypto
-
-commit 5fb8ef25803ef33e2eb60b626435828b937bed75 upstream.
-
-Currently, our generic ChaCha implementation consists of a permute
-function in lib/chacha.c that operates on the 64-byte ChaCha state
-directly [and which is always included into the core kernel since it
-is used by the /dev/random driver], and the crypto API plumbing to
-expose it as a skcipher.
-
-In order to support in-kernel users that need the ChaCha streamcipher
-but have no need [or tolerance] for going through the abstractions of
-the crypto API, let's expose the streamcipher bits via a library API
-as well, in a way that permits the implementation to be superseded by
-an architecture specific one if provided.
-
-So move the streamcipher code into a separate module in lib/crypto,
-and expose the init() and crypt() routines to users of the library.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-neon-glue.c | 2 +-
- arch/arm64/crypto/chacha-neon-glue.c | 2 +-
- arch/x86/crypto/chacha_glue.c | 2 +-
- crypto/Kconfig | 1 +
- crypto/chacha_generic.c | 60 ++--------------------
- include/crypto/chacha.h | 77 ++++++++++++++++++++++------
- include/crypto/internal/chacha.h | 53 +++++++++++++++++++
- lib/Makefile | 3 +-
- lib/crypto/Kconfig | 26 ++++++++++
- lib/crypto/Makefile | 4 ++
- lib/{ => crypto}/chacha.c | 20 ++++----
- lib/crypto/libchacha.c | 35 +++++++++++++
- 12 files changed, 199 insertions(+), 86 deletions(-)
- create mode 100644 include/crypto/internal/chacha.h
- rename lib/{ => crypto}/chacha.c (88%)
- create mode 100644 lib/crypto/libchacha.c
-
---- a/arch/arm/crypto/chacha-neon-glue.c
-+++ b/arch/arm/crypto/chacha-neon-glue.c
-@@ -20,7 +20,7 @@
- */
-
- #include <crypto/algapi.h>
--#include <crypto/chacha.h>
-+#include <crypto/internal/chacha.h>
- #include <crypto/internal/simd.h>
- #include <crypto/internal/skcipher.h>
- #include <linux/kernel.h>
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -20,7 +20,7 @@
- */
-
- #include <crypto/algapi.h>
--#include <crypto/chacha.h>
-+#include <crypto/internal/chacha.h>
- #include <crypto/internal/simd.h>
- #include <crypto/internal/skcipher.h>
- #include <linux/kernel.h>
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -7,7 +7,7 @@
- */
-
- #include <crypto/algapi.h>
--#include <crypto/chacha.h>
-+#include <crypto/internal/chacha.h>
- #include <crypto/internal/simd.h>
- #include <crypto/internal/skcipher.h>
- #include <linux/kernel.h>
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -1393,6 +1393,7 @@ config CRYPTO_SALSA20
-
- config CRYPTO_CHACHA20
- tristate "ChaCha stream cipher algorithms"
-+ select CRYPTO_LIB_CHACHA_GENERIC
- select CRYPTO_BLKCIPHER
- help
- The ChaCha20, XChaCha20, and XChaCha12 stream cipher algorithms.
---- a/crypto/chacha_generic.c
-+++ b/crypto/chacha_generic.c
-@@ -8,29 +8,10 @@
-
- #include <asm/unaligned.h>
- #include <crypto/algapi.h>
--#include <crypto/chacha.h>
-+#include <crypto/internal/chacha.h>
- #include <crypto/internal/skcipher.h>
- #include <linux/module.h>
-
--static void chacha_docrypt(u32 *state, u8 *dst, const u8 *src,
-- unsigned int bytes, int nrounds)
--{
-- /* aligned to potentially speed up crypto_xor() */
-- u8 stream[CHACHA_BLOCK_SIZE] __aligned(sizeof(long));
--
-- while (bytes >= CHACHA_BLOCK_SIZE) {
-- chacha_block(state, stream, nrounds);
-- crypto_xor_cpy(dst, src, stream, CHACHA_BLOCK_SIZE);
-- bytes -= CHACHA_BLOCK_SIZE;
-- dst += CHACHA_BLOCK_SIZE;
-- src += CHACHA_BLOCK_SIZE;
-- }
-- if (bytes) {
-- chacha_block(state, stream, nrounds);
-- crypto_xor_cpy(dst, src, stream, bytes);
-- }
--}
--
- static int chacha_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv)
- {
-@@ -48,8 +29,8 @@ static int chacha_stream_xor(struct skci
- if (nbytes < walk.total)
- nbytes = round_down(nbytes, CHACHA_BLOCK_SIZE);
-
-- chacha_docrypt(state, walk.dst.virt.addr, walk.src.virt.addr,
-- nbytes, ctx->nrounds);
-+ chacha_crypt_generic(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes, ctx->nrounds);
- err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
- }
-
-@@ -58,41 +39,10 @@ static int chacha_stream_xor(struct skci
-
- void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv)
- {
-- state[0] = 0x61707865; /* "expa" */
-- state[1] = 0x3320646e; /* "nd 3" */
-- state[2] = 0x79622d32; /* "2-by" */
-- state[3] = 0x6b206574; /* "te k" */
-- state[4] = ctx->key[0];
-- state[5] = ctx->key[1];
-- state[6] = ctx->key[2];
-- state[7] = ctx->key[3];
-- state[8] = ctx->key[4];
-- state[9] = ctx->key[5];
-- state[10] = ctx->key[6];
-- state[11] = ctx->key[7];
-- state[12] = get_unaligned_le32(iv + 0);
-- state[13] = get_unaligned_le32(iv + 4);
-- state[14] = get_unaligned_le32(iv + 8);
-- state[15] = get_unaligned_le32(iv + 12);
-+ chacha_init_generic(state, ctx->key, iv);
- }
- EXPORT_SYMBOL_GPL(crypto_chacha_init);
-
--static int chacha_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize, int nrounds)
--{
-- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-- int i;
--
-- if (keysize != CHACHA_KEY_SIZE)
-- return -EINVAL;
--
-- for (i = 0; i < ARRAY_SIZE(ctx->key); i++)
-- ctx->key[i] = get_unaligned_le32(key + i * sizeof(u32));
--
-- ctx->nrounds = nrounds;
-- return 0;
--}
--
- int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
- unsigned int keysize)
- {
-@@ -126,7 +76,7 @@ int crypto_xchacha_crypt(struct skcipher
-
- /* Compute the subkey given the original key and first 128 nonce bits */
- crypto_chacha_init(state, ctx, req->iv);
-- hchacha_block(state, subctx.key, ctx->nrounds);
-+ hchacha_block_generic(state, subctx.key, ctx->nrounds);
- subctx.nrounds = ctx->nrounds;
-
- /* Build the real IV */
---- a/include/crypto/chacha.h
-+++ b/include/crypto/chacha.h
-@@ -15,9 +15,8 @@
- #ifndef _CRYPTO_CHACHA_H
- #define _CRYPTO_CHACHA_H
-
--#include <crypto/skcipher.h>
-+#include <asm/unaligned.h>
- #include <linux/types.h>
--#include <linux/crypto.h>
-
- /* 32-bit stream position, then 96-bit nonce (RFC7539 convention) */
- #define CHACHA_IV_SIZE 16
-@@ -29,26 +28,70 @@
- /* 192-bit nonce, then 64-bit stream position */
- #define XCHACHA_IV_SIZE 32
-
--struct chacha_ctx {
-- u32 key[8];
-- int nrounds;
--};
--
--void chacha_block(u32 *state, u8 *stream, int nrounds);
-+void chacha_block_generic(u32 *state, u8 *stream, int nrounds);
- static inline void chacha20_block(u32 *state, u8 *stream)
- {
-- chacha_block(state, stream, 20);
-+ chacha_block_generic(state, stream, 20);
- }
--void hchacha_block(const u32 *in, u32 *out, int nrounds);
-
--void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv);
-+void hchacha_block_arch(const u32 *state, u32 *out, int nrounds);
-+void hchacha_block_generic(const u32 *state, u32 *out, int nrounds);
-+
-+static inline void hchacha_block(const u32 *state, u32 *out, int nrounds)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA))
-+ hchacha_block_arch(state, out, nrounds);
-+ else
-+ hchacha_block_generic(state, out, nrounds);
-+}
-
--int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize);
--int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize);
-+void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv);
-+static inline void chacha_init_generic(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ state[0] = 0x61707865; /* "expa" */
-+ state[1] = 0x3320646e; /* "nd 3" */
-+ state[2] = 0x79622d32; /* "2-by" */
-+ state[3] = 0x6b206574; /* "te k" */
-+ state[4] = key[0];
-+ state[5] = key[1];
-+ state[6] = key[2];
-+ state[7] = key[3];
-+ state[8] = key[4];
-+ state[9] = key[5];
-+ state[10] = key[6];
-+ state[11] = key[7];
-+ state[12] = get_unaligned_le32(iv + 0);
-+ state[13] = get_unaligned_le32(iv + 4);
-+ state[14] = get_unaligned_le32(iv + 8);
-+ state[15] = get_unaligned_le32(iv + 12);
-+}
-
--int crypto_chacha_crypt(struct skcipher_request *req);
--int crypto_xchacha_crypt(struct skcipher_request *req);
-+static inline void chacha_init(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA))
-+ chacha_init_arch(state, key, iv);
-+ else
-+ chacha_init_generic(state, key, iv);
-+}
-+
-+void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds);
-+void chacha_crypt_generic(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds);
-+
-+static inline void chacha_crypt(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA))
-+ chacha_crypt_arch(state, dst, src, bytes, nrounds);
-+ else
-+ chacha_crypt_generic(state, dst, src, bytes, nrounds);
-+}
-+
-+static inline void chacha20_crypt(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes)
-+{
-+ chacha_crypt(state, dst, src, bytes, 20);
-+}
-
- #endif /* _CRYPTO_CHACHA_H */
---- /dev/null
-+++ b/include/crypto/internal/chacha.h
-@@ -0,0 +1,53 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+
-+#ifndef _CRYPTO_INTERNAL_CHACHA_H
-+#define _CRYPTO_INTERNAL_CHACHA_H
-+
-+#include <crypto/chacha.h>
-+#include <crypto/internal/skcipher.h>
-+#include <linux/crypto.h>
-+
-+struct chacha_ctx {
-+ u32 key[8];
-+ int nrounds;
-+};
-+
-+void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv);
-+
-+static inline int chacha_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize, int nrounds)
-+{
-+ struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-+ int i;
-+
-+ if (keysize != CHACHA_KEY_SIZE)
-+ return -EINVAL;
-+
-+ for (i = 0; i < ARRAY_SIZE(ctx->key); i++)
-+ ctx->key[i] = get_unaligned_le32(key + i * sizeof(u32));
-+
-+ ctx->nrounds = nrounds;
-+ return 0;
-+}
-+
-+static inline int chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize)
-+{
-+ return chacha_setkey(tfm, key, keysize, 20);
-+}
-+
-+static int inline chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize)
-+{
-+ return chacha_setkey(tfm, key, keysize, 12);
-+}
-+
-+int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize);
-+int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize);
-+
-+int crypto_chacha_crypt(struct skcipher_request *req);
-+int crypto_xchacha_crypt(struct skcipher_request *req);
-+
-+#endif /* _CRYPTO_CHACHA_H */
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -26,8 +26,7 @@ endif
-
- lib-y := ctype.o string.o vsprintf.o cmdline.o \
- rbtree.o radix-tree.o timerqueue.o xarray.o \
-- idr.o extable.o \
-- sha1.o chacha.o irq_regs.o argv_split.o \
-+ idr.o extable.o sha1.o irq_regs.o argv_split.o \
- flex_proportions.o ratelimit.o show_mem.o \
- is_single_threaded.o plist.o decompress.o kobject_uevent.o \
- earlycpio.o seq_buf.o siphash.o dec_and_lock.o \
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -8,6 +8,32 @@ config CRYPTO_LIB_AES
- config CRYPTO_LIB_ARC4
- tristate
-
-+config CRYPTO_ARCH_HAVE_LIB_CHACHA
-+ tristate
-+ help
-+ Declares whether the architecture provides an arch-specific
-+ accelerated implementation of the ChaCha library interface,
-+ either builtin or as a module.
-+
-+config CRYPTO_LIB_CHACHA_GENERIC
-+ tristate
-+ select CRYPTO_ALGAPI
-+ help
-+ This symbol can be depended upon by arch implementations of the
-+ ChaCha library interface that require the generic code as a
-+ fallback, e.g., for SIMD implementations. If no arch specific
-+ implementation is enabled, this implementation serves the users
-+ of CRYPTO_LIB_CHACHA.
-+
-+config CRYPTO_LIB_CHACHA
-+ tristate "ChaCha library interface"
-+ depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
-+ select CRYPTO_LIB_CHACHA_GENERIC if CRYPTO_ARCH_HAVE_LIB_CHACHA=n
-+ help
-+ Enable the ChaCha library interface. This interface may be fulfilled
-+ by either the generic implementation or an arch-specific one, if one
-+ is available and enabled.
-+
- config CRYPTO_LIB_DES
- tristate
-
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -1,5 +1,9 @@
- # SPDX-License-Identifier: GPL-2.0
-
-+# chacha is used by the /dev/random driver which is always builtin
-+obj-y += chacha.o
-+obj-$(CONFIG_CRYPTO_LIB_CHACHA_GENERIC) += libchacha.o
-+
- obj-$(CONFIG_CRYPTO_LIB_AES) += libaes.o
- libaes-y := aes.o
-
---- a/lib/chacha.c
-+++ /dev/null
-@@ -1,113 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0-or-later
--/*
-- * The "hash function" used as the core of the ChaCha stream cipher (RFC7539)
-- *
-- * Copyright (C) 2015 Martin Willi
-- */
--
--#include <linux/kernel.h>
--#include <linux/export.h>
--#include <linux/bitops.h>
--#include <linux/cryptohash.h>
--#include <asm/unaligned.h>
--#include <crypto/chacha.h>
--
--static void chacha_permute(u32 *x, int nrounds)
--{
-- int i;
--
-- /* whitelist the allowed round counts */
-- WARN_ON_ONCE(nrounds != 20 && nrounds != 12);
--
-- for (i = 0; i < nrounds; i += 2) {
-- x[0] += x[4]; x[12] = rol32(x[12] ^ x[0], 16);
-- x[1] += x[5]; x[13] = rol32(x[13] ^ x[1], 16);
-- x[2] += x[6]; x[14] = rol32(x[14] ^ x[2], 16);
-- x[3] += x[7]; x[15] = rol32(x[15] ^ x[3], 16);
--
-- x[8] += x[12]; x[4] = rol32(x[4] ^ x[8], 12);
-- x[9] += x[13]; x[5] = rol32(x[5] ^ x[9], 12);
-- x[10] += x[14]; x[6] = rol32(x[6] ^ x[10], 12);
-- x[11] += x[15]; x[7] = rol32(x[7] ^ x[11], 12);
--
-- x[0] += x[4]; x[12] = rol32(x[12] ^ x[0], 8);
-- x[1] += x[5]; x[13] = rol32(x[13] ^ x[1], 8);
-- x[2] += x[6]; x[14] = rol32(x[14] ^ x[2], 8);
-- x[3] += x[7]; x[15] = rol32(x[15] ^ x[3], 8);
--
-- x[8] += x[12]; x[4] = rol32(x[4] ^ x[8], 7);
-- x[9] += x[13]; x[5] = rol32(x[5] ^ x[9], 7);
-- x[10] += x[14]; x[6] = rol32(x[6] ^ x[10], 7);
-- x[11] += x[15]; x[7] = rol32(x[7] ^ x[11], 7);
--
-- x[0] += x[5]; x[15] = rol32(x[15] ^ x[0], 16);
-- x[1] += x[6]; x[12] = rol32(x[12] ^ x[1], 16);
-- x[2] += x[7]; x[13] = rol32(x[13] ^ x[2], 16);
-- x[3] += x[4]; x[14] = rol32(x[14] ^ x[3], 16);
--
-- x[10] += x[15]; x[5] = rol32(x[5] ^ x[10], 12);
-- x[11] += x[12]; x[6] = rol32(x[6] ^ x[11], 12);
-- x[8] += x[13]; x[7] = rol32(x[7] ^ x[8], 12);
-- x[9] += x[14]; x[4] = rol32(x[4] ^ x[9], 12);
--
-- x[0] += x[5]; x[15] = rol32(x[15] ^ x[0], 8);
-- x[1] += x[6]; x[12] = rol32(x[12] ^ x[1], 8);
-- x[2] += x[7]; x[13] = rol32(x[13] ^ x[2], 8);
-- x[3] += x[4]; x[14] = rol32(x[14] ^ x[3], 8);
--
-- x[10] += x[15]; x[5] = rol32(x[5] ^ x[10], 7);
-- x[11] += x[12]; x[6] = rol32(x[6] ^ x[11], 7);
-- x[8] += x[13]; x[7] = rol32(x[7] ^ x[8], 7);
-- x[9] += x[14]; x[4] = rol32(x[4] ^ x[9], 7);
-- }
--}
--
--/**
-- * chacha_block - generate one keystream block and increment block counter
-- * @state: input state matrix (16 32-bit words)
-- * @stream: output keystream block (64 bytes)
-- * @nrounds: number of rounds (20 or 12; 20 is recommended)
-- *
-- * This is the ChaCha core, a function from 64-byte strings to 64-byte strings.
-- * The caller has already converted the endianness of the input. This function
-- * also handles incrementing the block counter in the input matrix.
-- */
--void chacha_block(u32 *state, u8 *stream, int nrounds)
--{
-- u32 x[16];
-- int i;
--
-- memcpy(x, state, 64);
--
-- chacha_permute(x, nrounds);
--
-- for (i = 0; i < ARRAY_SIZE(x); i++)
-- put_unaligned_le32(x[i] + state[i], &stream[i * sizeof(u32)]);
--
-- state[12]++;
--}
--EXPORT_SYMBOL(chacha_block);
--
--/**
-- * hchacha_block - abbreviated ChaCha core, for XChaCha
-- * @in: input state matrix (16 32-bit words)
-- * @out: output (8 32-bit words)
-- * @nrounds: number of rounds (20 or 12; 20 is recommended)
-- *
-- * HChaCha is the ChaCha equivalent of HSalsa and is an intermediate step
-- * towards XChaCha (see https://cr.yp.to/snuffle/xsalsa-20081128.pdf). HChaCha
-- * skips the final addition of the initial state, and outputs only certain words
-- * of the state. It should not be used for streaming directly.
-- */
--void hchacha_block(const u32 *in, u32 *out, int nrounds)
--{
-- u32 x[16];
--
-- memcpy(x, in, 64);
--
-- chacha_permute(x, nrounds);
--
-- memcpy(&out[0], &x[0], 16);
-- memcpy(&out[4], &x[12], 16);
--}
--EXPORT_SYMBOL(hchacha_block);
---- /dev/null
-+++ b/lib/crypto/chacha.c
-@@ -0,0 +1,115 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later
-+/*
-+ * The "hash function" used as the core of the ChaCha stream cipher (RFC7539)
-+ *
-+ * Copyright (C) 2015 Martin Willi
-+ */
-+
-+#include <linux/bug.h>
-+#include <linux/kernel.h>
-+#include <linux/export.h>
-+#include <linux/bitops.h>
-+#include <linux/string.h>
-+#include <linux/cryptohash.h>
-+#include <asm/unaligned.h>
-+#include <crypto/chacha.h>
-+
-+static void chacha_permute(u32 *x, int nrounds)
-+{
-+ int i;
-+
-+ /* whitelist the allowed round counts */
-+ WARN_ON_ONCE(nrounds != 20 && nrounds != 12);
-+
-+ for (i = 0; i < nrounds; i += 2) {
-+ x[0] += x[4]; x[12] = rol32(x[12] ^ x[0], 16);
-+ x[1] += x[5]; x[13] = rol32(x[13] ^ x[1], 16);
-+ x[2] += x[6]; x[14] = rol32(x[14] ^ x[2], 16);
-+ x[3] += x[7]; x[15] = rol32(x[15] ^ x[3], 16);
-+
-+ x[8] += x[12]; x[4] = rol32(x[4] ^ x[8], 12);
-+ x[9] += x[13]; x[5] = rol32(x[5] ^ x[9], 12);
-+ x[10] += x[14]; x[6] = rol32(x[6] ^ x[10], 12);
-+ x[11] += x[15]; x[7] = rol32(x[7] ^ x[11], 12);
-+
-+ x[0] += x[4]; x[12] = rol32(x[12] ^ x[0], 8);
-+ x[1] += x[5]; x[13] = rol32(x[13] ^ x[1], 8);
-+ x[2] += x[6]; x[14] = rol32(x[14] ^ x[2], 8);
-+ x[3] += x[7]; x[15] = rol32(x[15] ^ x[3], 8);
-+
-+ x[8] += x[12]; x[4] = rol32(x[4] ^ x[8], 7);
-+ x[9] += x[13]; x[5] = rol32(x[5] ^ x[9], 7);
-+ x[10] += x[14]; x[6] = rol32(x[6] ^ x[10], 7);
-+ x[11] += x[15]; x[7] = rol32(x[7] ^ x[11], 7);
-+
-+ x[0] += x[5]; x[15] = rol32(x[15] ^ x[0], 16);
-+ x[1] += x[6]; x[12] = rol32(x[12] ^ x[1], 16);
-+ x[2] += x[7]; x[13] = rol32(x[13] ^ x[2], 16);
-+ x[3] += x[4]; x[14] = rol32(x[14] ^ x[3], 16);
-+
-+ x[10] += x[15]; x[5] = rol32(x[5] ^ x[10], 12);
-+ x[11] += x[12]; x[6] = rol32(x[6] ^ x[11], 12);
-+ x[8] += x[13]; x[7] = rol32(x[7] ^ x[8], 12);
-+ x[9] += x[14]; x[4] = rol32(x[4] ^ x[9], 12);
-+
-+ x[0] += x[5]; x[15] = rol32(x[15] ^ x[0], 8);
-+ x[1] += x[6]; x[12] = rol32(x[12] ^ x[1], 8);
-+ x[2] += x[7]; x[13] = rol32(x[13] ^ x[2], 8);
-+ x[3] += x[4]; x[14] = rol32(x[14] ^ x[3], 8);
-+
-+ x[10] += x[15]; x[5] = rol32(x[5] ^ x[10], 7);
-+ x[11] += x[12]; x[6] = rol32(x[6] ^ x[11], 7);
-+ x[8] += x[13]; x[7] = rol32(x[7] ^ x[8], 7);
-+ x[9] += x[14]; x[4] = rol32(x[4] ^ x[9], 7);
-+ }
-+}
-+
-+/**
-+ * chacha_block - generate one keystream block and increment block counter
-+ * @state: input state matrix (16 32-bit words)
-+ * @stream: output keystream block (64 bytes)
-+ * @nrounds: number of rounds (20 or 12; 20 is recommended)
-+ *
-+ * This is the ChaCha core, a function from 64-byte strings to 64-byte strings.
-+ * The caller has already converted the endianness of the input. This function
-+ * also handles incrementing the block counter in the input matrix.
-+ */
-+void chacha_block_generic(u32 *state, u8 *stream, int nrounds)
-+{
-+ u32 x[16];
-+ int i;
-+
-+ memcpy(x, state, 64);
-+
-+ chacha_permute(x, nrounds);
-+
-+ for (i = 0; i < ARRAY_SIZE(x); i++)
-+ put_unaligned_le32(x[i] + state[i], &stream[i * sizeof(u32)]);
-+
-+ state[12]++;
-+}
-+EXPORT_SYMBOL(chacha_block_generic);
-+
-+/**
-+ * hchacha_block_generic - abbreviated ChaCha core, for XChaCha
-+ * @state: input state matrix (16 32-bit words)
-+ * @out: output (8 32-bit words)
-+ * @nrounds: number of rounds (20 or 12; 20 is recommended)
-+ *
-+ * HChaCha is the ChaCha equivalent of HSalsa and is an intermediate step
-+ * towards XChaCha (see https://cr.yp.to/snuffle/xsalsa-20081128.pdf). HChaCha
-+ * skips the final addition of the initial state, and outputs only certain words
-+ * of the state. It should not be used for streaming directly.
-+ */
-+void hchacha_block_generic(const u32 *state, u32 *stream, int nrounds)
-+{
-+ u32 x[16];
-+
-+ memcpy(x, state, 64);
-+
-+ chacha_permute(x, nrounds);
-+
-+ memcpy(&stream[0], &x[0], 16);
-+ memcpy(&stream[4], &x[12], 16);
-+}
-+EXPORT_SYMBOL(hchacha_block_generic);
---- /dev/null
-+++ b/lib/crypto/libchacha.c
-@@ -0,0 +1,35 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later
-+/*
-+ * The ChaCha stream cipher (RFC7539)
-+ *
-+ * Copyright (C) 2015 Martin Willi
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/export.h>
-+#include <linux/module.h>
-+
-+#include <crypto/algapi.h> // for crypto_xor_cpy
-+#include <crypto/chacha.h>
-+
-+void chacha_crypt_generic(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds)
-+{
-+ /* aligned to potentially speed up crypto_xor() */
-+ u8 stream[CHACHA_BLOCK_SIZE] __aligned(sizeof(long));
-+
-+ while (bytes >= CHACHA_BLOCK_SIZE) {
-+ chacha_block_generic(state, stream, nrounds);
-+ crypto_xor_cpy(dst, src, stream, CHACHA_BLOCK_SIZE);
-+ bytes -= CHACHA_BLOCK_SIZE;
-+ dst += CHACHA_BLOCK_SIZE;
-+ src += CHACHA_BLOCK_SIZE;
-+ }
-+ if (bytes) {
-+ chacha_block_generic(state, stream, nrounds);
-+ crypto_xor_cpy(dst, src, stream, bytes);
-+ }
-+}
-+EXPORT_SYMBOL(chacha_crypt_generic);
-+
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0003-crypto-x86-chacha-depend-on-generic-chacha-library-i.patch b/target/linux/generic/backport-5.4/080-wireguard-0003-crypto-x86-chacha-depend-on-generic-chacha-library-i.patch
deleted file mode 100644
index b1f59cc38f..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0003-crypto-x86-chacha-depend-on-generic-chacha-library-i.patch
+++ /dev/null
@@ -1,192 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:09 +0100
-Subject: [PATCH] crypto: x86/chacha - depend on generic chacha library instead
- of crypto driver
-
-commit 28e8d89b1ce8d2e7badfb5f69971dd635acb8863 upstream.
-
-In preparation of extending the x86 ChaCha driver to also expose the ChaCha
-library interface, drop the dependency on the chacha_generic crypto driver
-as a non-SIMD fallback, and depend on the generic ChaCha library directly.
-This way, we only pull in the code we actually need, without registering
-a set of ChaCha skciphers that we will never use.
-
-Since turning the FPU on and off is cheap these days, simplify the SIMD
-routine by dropping the per-page yield, which makes for a cleaner switch
-to the library API as well. This also allows use to invoke the skcipher
-walk routines in non-atomic mode.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/chacha_glue.c | 90 ++++++++++++++---------------------
- crypto/Kconfig | 2 +-
- 2 files changed, 36 insertions(+), 56 deletions(-)
-
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -123,37 +123,38 @@ static void chacha_dosimd(u32 *state, u8
- }
- }
-
--static int chacha_simd_stream_xor(struct skcipher_walk *walk,
-+static int chacha_simd_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv)
- {
- u32 *state, state_buf[16 + 2] __aligned(8);
-- int next_yield = 4096; /* bytes until next FPU yield */
-- int err = 0;
-+ struct skcipher_walk walk;
-+ int err;
-+
-+ err = skcipher_walk_virt(&walk, req, false);
-
- BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
- state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
-
-- crypto_chacha_init(state, ctx, iv);
-+ chacha_init_generic(state, ctx->key, iv);
-
-- while (walk->nbytes > 0) {
-- unsigned int nbytes = walk->nbytes;
-+ while (walk.nbytes > 0) {
-+ unsigned int nbytes = walk.nbytes;
-
-- if (nbytes < walk->total) {
-- nbytes = round_down(nbytes, walk->stride);
-- next_yield -= nbytes;
-- }
--
-- chacha_dosimd(state, walk->dst.virt.addr, walk->src.virt.addr,
-- nbytes, ctx->nrounds);
-+ if (nbytes < walk.total)
-+ nbytes = round_down(nbytes, walk.stride);
-
-- if (next_yield <= 0) {
-- /* temporarily allow preemption */
-- kernel_fpu_end();
-+ if (!crypto_simd_usable()) {
-+ chacha_crypt_generic(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes,
-+ ctx->nrounds);
-+ } else {
- kernel_fpu_begin();
-- next_yield = 4096;
-+ chacha_dosimd(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes,
-+ ctx->nrounds);
-+ kernel_fpu_end();
- }
--
-- err = skcipher_walk_done(walk, walk->nbytes - nbytes);
-+ err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
- }
-
- return err;
-@@ -163,55 +164,34 @@ static int chacha_simd(struct skcipher_r
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-- struct skcipher_walk walk;
-- int err;
--
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_chacha_crypt(req);
-
-- err = skcipher_walk_virt(&walk, req, true);
-- if (err)
-- return err;
--
-- kernel_fpu_begin();
-- err = chacha_simd_stream_xor(&walk, ctx, req->iv);
-- kernel_fpu_end();
-- return err;
-+ return chacha_simd_stream_xor(req, ctx, req->iv);
- }
-
- static int xchacha_simd(struct skcipher_request *req)
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-- struct skcipher_walk walk;
-- struct chacha_ctx subctx;
- u32 *state, state_buf[16 + 2] __aligned(8);
-+ struct chacha_ctx subctx;
- u8 real_iv[16];
-- int err;
--
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_xchacha_crypt(req);
--
-- err = skcipher_walk_virt(&walk, req, true);
-- if (err)
-- return err;
-
- BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
- state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
-- crypto_chacha_init(state, ctx, req->iv);
-+ chacha_init_generic(state, ctx->key, req->iv);
-
-- kernel_fpu_begin();
--
-- hchacha_block_ssse3(state, subctx.key, ctx->nrounds);
-+ if (req->cryptlen > CHACHA_BLOCK_SIZE && crypto_simd_usable()) {
-+ kernel_fpu_begin();
-+ hchacha_block_ssse3(state, subctx.key, ctx->nrounds);
-+ kernel_fpu_end();
-+ } else {
-+ hchacha_block_generic(state, subctx.key, ctx->nrounds);
-+ }
- subctx.nrounds = ctx->nrounds;
-
- memcpy(&real_iv[0], req->iv + 24, 8);
- memcpy(&real_iv[8], req->iv + 16, 8);
-- err = chacha_simd_stream_xor(&walk, &subctx, real_iv);
--
-- kernel_fpu_end();
--
-- return err;
-+ return chacha_simd_stream_xor(req, &subctx, real_iv);
- }
-
- static struct skcipher_alg algs[] = {
-@@ -227,7 +207,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = CHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = chacha_simd,
- .decrypt = chacha_simd,
- }, {
-@@ -242,7 +222,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = xchacha_simd,
- .decrypt = xchacha_simd,
- }, {
-@@ -257,7 +237,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha12_setkey,
-+ .setkey = chacha12_setkey,
- .encrypt = xchacha_simd,
- .decrypt = xchacha_simd,
- },
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -1417,7 +1417,7 @@ config CRYPTO_CHACHA20_X86_64
- tristate "ChaCha stream cipher algorithms (x86_64/SSSE3/AVX2/AVX-512VL)"
- depends on X86 && 64BIT
- select CRYPTO_BLKCIPHER
-- select CRYPTO_CHACHA20
-+ select CRYPTO_LIB_CHACHA_GENERIC
- help
- SSSE3, AVX2, and AVX-512VL optimized implementations of the ChaCha20,
- XChaCha20, and XChaCha12 stream ciphers.
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0004-crypto-x86-chacha-expose-SIMD-ChaCha-routine-as-libr.patch b/target/linux/generic/backport-5.4/080-wireguard-0004-crypto-x86-chacha-expose-SIMD-ChaCha-routine-as-libr.patch
deleted file mode 100644
index 0e5462837b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0004-crypto-x86-chacha-expose-SIMD-ChaCha-routine-as-libr.patch
+++ /dev/null
@@ -1,205 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:10 +0100
-Subject: [PATCH] crypto: x86/chacha - expose SIMD ChaCha routine as library
- function
-
-commit 84e03fa39fbe95a5567d43bff458c6d3b3a23ad1 upstream.
-
-Wire the existing x86 SIMD ChaCha code into the new ChaCha library
-interface, so that users of the library interface will get the
-accelerated version when available.
-
-Given that calls into the library API will always go through the
-routines in this module if it is enabled, switch to static keys
-to select the optimal implementation available (which may be none
-at all, in which case we defer to the generic implementation for
-all invocations).
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/chacha_glue.c | 91 +++++++++++++++++++++++++----------
- crypto/Kconfig | 1 +
- include/crypto/chacha.h | 6 +++
- 3 files changed, 73 insertions(+), 25 deletions(-)
-
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -21,24 +21,24 @@ asmlinkage void chacha_block_xor_ssse3(u
- asmlinkage void chacha_4block_xor_ssse3(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void hchacha_block_ssse3(const u32 *state, u32 *out, int nrounds);
--#ifdef CONFIG_AS_AVX2
-+
- asmlinkage void chacha_2block_xor_avx2(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void chacha_4block_xor_avx2(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void chacha_8block_xor_avx2(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
--static bool chacha_use_avx2;
--#ifdef CONFIG_AS_AVX512
-+
- asmlinkage void chacha_2block_xor_avx512vl(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void chacha_4block_xor_avx512vl(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void chacha_8block_xor_avx512vl(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
--static bool chacha_use_avx512vl;
--#endif
--#endif
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(chacha_use_simd);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(chacha_use_avx2);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(chacha_use_avx512vl);
-
- static unsigned int chacha_advance(unsigned int len, unsigned int maxblocks)
- {
-@@ -49,9 +49,8 @@ static unsigned int chacha_advance(unsig
- static void chacha_dosimd(u32 *state, u8 *dst, const u8 *src,
- unsigned int bytes, int nrounds)
- {
--#ifdef CONFIG_AS_AVX2
--#ifdef CONFIG_AS_AVX512
-- if (chacha_use_avx512vl) {
-+ if (IS_ENABLED(CONFIG_AS_AVX512) &&
-+ static_branch_likely(&chacha_use_avx512vl)) {
- while (bytes >= CHACHA_BLOCK_SIZE * 8) {
- chacha_8block_xor_avx512vl(state, dst, src, bytes,
- nrounds);
-@@ -79,8 +78,9 @@ static void chacha_dosimd(u32 *state, u8
- return;
- }
- }
--#endif
-- if (chacha_use_avx2) {
-+
-+ if (IS_ENABLED(CONFIG_AS_AVX2) &&
-+ static_branch_likely(&chacha_use_avx2)) {
- while (bytes >= CHACHA_BLOCK_SIZE * 8) {
- chacha_8block_xor_avx2(state, dst, src, bytes, nrounds);
- bytes -= CHACHA_BLOCK_SIZE * 8;
-@@ -104,7 +104,7 @@ static void chacha_dosimd(u32 *state, u8
- return;
- }
- }
--#endif
-+
- while (bytes >= CHACHA_BLOCK_SIZE * 4) {
- chacha_4block_xor_ssse3(state, dst, src, bytes, nrounds);
- bytes -= CHACHA_BLOCK_SIZE * 4;
-@@ -123,6 +123,43 @@ static void chacha_dosimd(u32 *state, u8
- }
- }
-
-+void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds)
-+{
-+ state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-+
-+ if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable()) {
-+ hchacha_block_generic(state, stream, nrounds);
-+ } else {
-+ kernel_fpu_begin();
-+ hchacha_block_ssse3(state, stream, nrounds);
-+ kernel_fpu_end();
-+ }
-+}
-+EXPORT_SYMBOL(hchacha_block_arch);
-+
-+void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-+
-+ chacha_init_generic(state, key, iv);
-+}
-+EXPORT_SYMBOL(chacha_init_arch);
-+
-+void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
-+ int nrounds)
-+{
-+ state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
-+
-+ if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable() ||
-+ bytes <= CHACHA_BLOCK_SIZE)
-+ return chacha_crypt_generic(state, dst, src, bytes, nrounds);
-+
-+ kernel_fpu_begin();
-+ chacha_dosimd(state, dst, src, bytes, nrounds);
-+ kernel_fpu_end();
-+}
-+EXPORT_SYMBOL(chacha_crypt_arch);
-+
- static int chacha_simd_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv)
- {
-@@ -143,7 +180,8 @@ static int chacha_simd_stream_xor(struct
- if (nbytes < walk.total)
- nbytes = round_down(nbytes, walk.stride);
-
-- if (!crypto_simd_usable()) {
-+ if (!static_branch_likely(&chacha_use_simd) ||
-+ !crypto_simd_usable()) {
- chacha_crypt_generic(state, walk.dst.virt.addr,
- walk.src.virt.addr, nbytes,
- ctx->nrounds);
-@@ -246,18 +284,21 @@ static struct skcipher_alg algs[] = {
- static int __init chacha_simd_mod_init(void)
- {
- if (!boot_cpu_has(X86_FEATURE_SSSE3))
-- return -ENODEV;
-+ return 0;
-
--#ifdef CONFIG_AS_AVX2
-- chacha_use_avx2 = boot_cpu_has(X86_FEATURE_AVX) &&
-- boot_cpu_has(X86_FEATURE_AVX2) &&
-- cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL);
--#ifdef CONFIG_AS_AVX512
-- chacha_use_avx512vl = chacha_use_avx2 &&
-- boot_cpu_has(X86_FEATURE_AVX512VL) &&
-- boot_cpu_has(X86_FEATURE_AVX512BW); /* kmovq */
--#endif
--#endif
-+ static_branch_enable(&chacha_use_simd);
-+
-+ if (IS_ENABLED(CONFIG_AS_AVX2) &&
-+ boot_cpu_has(X86_FEATURE_AVX) &&
-+ boot_cpu_has(X86_FEATURE_AVX2) &&
-+ cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
-+ static_branch_enable(&chacha_use_avx2);
-+
-+ if (IS_ENABLED(CONFIG_AS_AVX512) &&
-+ boot_cpu_has(X86_FEATURE_AVX512VL) &&
-+ boot_cpu_has(X86_FEATURE_AVX512BW)) /* kmovq */
-+ static_branch_enable(&chacha_use_avx512vl);
-+ }
- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
- }
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -1418,6 +1418,7 @@ config CRYPTO_CHACHA20_X86_64
- depends on X86 && 64BIT
- select CRYPTO_BLKCIPHER
- select CRYPTO_LIB_CHACHA_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_CHACHA
- help
- SSSE3, AVX2, and AVX-512VL optimized implementations of the ChaCha20,
- XChaCha20, and XChaCha12 stream ciphers.
---- a/include/crypto/chacha.h
-+++ b/include/crypto/chacha.h
-@@ -25,6 +25,12 @@
- #define CHACHA_BLOCK_SIZE 64
- #define CHACHAPOLY_IV_SIZE 12
-
-+#ifdef CONFIG_X86_64
-+#define CHACHA_STATE_WORDS ((CHACHA_BLOCK_SIZE + 12) / sizeof(u32))
-+#else
-+#define CHACHA_STATE_WORDS (CHACHA_BLOCK_SIZE / sizeof(u32))
-+#endif
-+
- /* 192-bit nonce, then 64-bit stream position */
- #define XCHACHA_IV_SIZE 32
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0005-crypto-arm64-chacha-depend-on-generic-chacha-library.patch b/target/linux/generic/backport-5.4/080-wireguard-0005-crypto-arm64-chacha-depend-on-generic-chacha-library.patch
deleted file mode 100644
index 10e49c192c..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0005-crypto-arm64-chacha-depend-on-generic-chacha-library.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:11 +0100
-Subject: [PATCH] crypto: arm64/chacha - depend on generic chacha library
- instead of crypto driver
-
-commit c77da4867cbb7841177275dbb250f5c09679fae4 upstream.
-
-Depend on the generic ChaCha library routines instead of pulling in the
-generic ChaCha skcipher driver, which is more than we need, and makes
-managing the dependencies between the generic library, generic driver,
-accelerated library and driver more complicated.
-
-While at it, drop the logic to prefer the scalar code on short inputs.
-Turning the NEON on and off is cheap these days, and one major use case
-for ChaCha20 is ChaCha20-Poly1305, which is guaranteed to hit the scalar
-path upon every invocation (when doing the Poly1305 nonce generation)
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm64/crypto/Kconfig | 2 +-
- arch/arm64/crypto/chacha-neon-glue.c | 40 +++++++++++++++-------------
- 2 files changed, 23 insertions(+), 19 deletions(-)
-
---- a/arch/arm64/crypto/Kconfig
-+++ b/arch/arm64/crypto/Kconfig
-@@ -103,7 +103,7 @@ config CRYPTO_CHACHA20_NEON
- tristate "ChaCha20, XChaCha20, and XChaCha12 stream ciphers using NEON instructions"
- depends on KERNEL_MODE_NEON
- select CRYPTO_BLKCIPHER
-- select CRYPTO_CHACHA20
-+ select CRYPTO_LIB_CHACHA_GENERIC
-
- config CRYPTO_NHPOLY1305_NEON
- tristate "NHPoly1305 hash function using NEON instructions (for Adiantum)"
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -68,7 +68,7 @@ static int chacha_neon_stream_xor(struct
-
- err = skcipher_walk_virt(&walk, req, false);
-
-- crypto_chacha_init(state, ctx, iv);
-+ chacha_init_generic(state, ctx->key, iv);
-
- while (walk.nbytes > 0) {
- unsigned int nbytes = walk.nbytes;
-@@ -76,10 +76,16 @@ static int chacha_neon_stream_xor(struct
- if (nbytes < walk.total)
- nbytes = rounddown(nbytes, walk.stride);
-
-- kernel_neon_begin();
-- chacha_doneon(state, walk.dst.virt.addr, walk.src.virt.addr,
-- nbytes, ctx->nrounds);
-- kernel_neon_end();
-+ if (!crypto_simd_usable()) {
-+ chacha_crypt_generic(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes,
-+ ctx->nrounds);
-+ } else {
-+ kernel_neon_begin();
-+ chacha_doneon(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes, ctx->nrounds);
-+ kernel_neon_end();
-+ }
- err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
- }
-
-@@ -91,9 +97,6 @@ static int chacha_neon(struct skcipher_r
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_chacha_crypt(req);
--
- return chacha_neon_stream_xor(req, ctx, req->iv);
- }
-
-@@ -105,14 +108,15 @@ static int xchacha_neon(struct skcipher_
- u32 state[16];
- u8 real_iv[16];
-
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_xchacha_crypt(req);
--
-- crypto_chacha_init(state, ctx, req->iv);
-+ chacha_init_generic(state, ctx->key, req->iv);
-
-- kernel_neon_begin();
-- hchacha_block_neon(state, subctx.key, ctx->nrounds);
-- kernel_neon_end();
-+ if (crypto_simd_usable()) {
-+ kernel_neon_begin();
-+ hchacha_block_neon(state, subctx.key, ctx->nrounds);
-+ kernel_neon_end();
-+ } else {
-+ hchacha_block_generic(state, subctx.key, ctx->nrounds);
-+ }
- subctx.nrounds = ctx->nrounds;
-
- memcpy(&real_iv[0], req->iv + 24, 8);
-@@ -134,7 +138,7 @@ static struct skcipher_alg algs[] = {
- .ivsize = CHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
- .walksize = 5 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = chacha_neon,
- .decrypt = chacha_neon,
- }, {
-@@ -150,7 +154,7 @@ static struct skcipher_alg algs[] = {
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
- .walksize = 5 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = xchacha_neon,
- .decrypt = xchacha_neon,
- }, {
-@@ -166,7 +170,7 @@ static struct skcipher_alg algs[] = {
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
- .walksize = 5 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha12_setkey,
-+ .setkey = chacha12_setkey,
- .encrypt = xchacha_neon,
- .decrypt = xchacha_neon,
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0006-crypto-arm64-chacha-expose-arm64-ChaCha-routine-as-l.patch b/target/linux/generic/backport-5.4/080-wireguard-0006-crypto-arm64-chacha-expose-arm64-ChaCha-routine-as-l.patch
deleted file mode 100644
index 71665e8bfd..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0006-crypto-arm64-chacha-expose-arm64-ChaCha-routine-as-l.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:12 +0100
-Subject: [PATCH] crypto: arm64/chacha - expose arm64 ChaCha routine as library
- function
-
-commit b3aad5bad26a01a4bd8c49a5c5f52aec665f3b7c upstream.
-
-Expose the accelerated NEON ChaCha routine directly as a symbol
-export so that users of the ChaCha library API can use it directly.
-
-Given that calls into the library API will always go through the
-routines in this module if it is enabled, switch to static keys
-to select the optimal implementation available (which may be none
-at all, in which case we defer to the generic implementation for
-all invocations).
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm64/crypto/Kconfig | 1 +
- arch/arm64/crypto/chacha-neon-glue.c | 53 ++++++++++++++++++++++------
- 2 files changed, 43 insertions(+), 11 deletions(-)
-
---- a/arch/arm64/crypto/Kconfig
-+++ b/arch/arm64/crypto/Kconfig
-@@ -104,6 +104,7 @@ config CRYPTO_CHACHA20_NEON
- depends on KERNEL_MODE_NEON
- select CRYPTO_BLKCIPHER
- select CRYPTO_LIB_CHACHA_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_CHACHA
-
- config CRYPTO_NHPOLY1305_NEON
- tristate "NHPoly1305 hash function using NEON instructions (for Adiantum)"
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -23,6 +23,7 @@
- #include <crypto/internal/chacha.h>
- #include <crypto/internal/simd.h>
- #include <crypto/internal/skcipher.h>
-+#include <linux/jump_label.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
-
-@@ -36,6 +37,8 @@ asmlinkage void chacha_4block_xor_neon(u
- int nrounds, int bytes);
- asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
-
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-+
- static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
- int bytes, int nrounds)
- {
-@@ -59,6 +62,37 @@ static void chacha_doneon(u32 *state, u8
- }
- }
-
-+void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds)
-+{
-+ if (!static_branch_likely(&have_neon) || !crypto_simd_usable()) {
-+ hchacha_block_generic(state, stream, nrounds);
-+ } else {
-+ kernel_neon_begin();
-+ hchacha_block_neon(state, stream, nrounds);
-+ kernel_neon_end();
-+ }
-+}
-+EXPORT_SYMBOL(hchacha_block_arch);
-+
-+void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ chacha_init_generic(state, key, iv);
-+}
-+EXPORT_SYMBOL(chacha_init_arch);
-+
-+void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
-+ int nrounds)
-+{
-+ if (!static_branch_likely(&have_neon) || bytes <= CHACHA_BLOCK_SIZE ||
-+ !crypto_simd_usable())
-+ return chacha_crypt_generic(state, dst, src, bytes, nrounds);
-+
-+ kernel_neon_begin();
-+ chacha_doneon(state, dst, src, bytes, nrounds);
-+ kernel_neon_end();
-+}
-+EXPORT_SYMBOL(chacha_crypt_arch);
-+
- static int chacha_neon_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv)
- {
-@@ -76,7 +110,8 @@ static int chacha_neon_stream_xor(struct
- if (nbytes < walk.total)
- nbytes = rounddown(nbytes, walk.stride);
-
-- if (!crypto_simd_usable()) {
-+ if (!static_branch_likely(&have_neon) ||
-+ !crypto_simd_usable()) {
- chacha_crypt_generic(state, walk.dst.virt.addr,
- walk.src.virt.addr, nbytes,
- ctx->nrounds);
-@@ -109,14 +144,7 @@ static int xchacha_neon(struct skcipher_
- u8 real_iv[16];
-
- chacha_init_generic(state, ctx->key, req->iv);
--
-- if (crypto_simd_usable()) {
-- kernel_neon_begin();
-- hchacha_block_neon(state, subctx.key, ctx->nrounds);
-- kernel_neon_end();
-- } else {
-- hchacha_block_generic(state, subctx.key, ctx->nrounds);
-- }
-+ hchacha_block_arch(state, subctx.key, ctx->nrounds);
- subctx.nrounds = ctx->nrounds;
-
- memcpy(&real_iv[0], req->iv + 24, 8);
-@@ -179,14 +207,17 @@ static struct skcipher_alg algs[] = {
- static int __init chacha_simd_mod_init(void)
- {
- if (!cpu_have_named_feature(ASIMD))
-- return -ENODEV;
-+ return 0;
-+
-+ static_branch_enable(&have_neon);
-
- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
- }
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-+ if (cpu_have_named_feature(ASIMD))
-+ crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
- }
-
- module_init(chacha_simd_mod_init);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0007-crypto-arm-chacha-import-Eric-Biggers-s-scalar-accel.patch b/target/linux/generic/backport-5.4/080-wireguard-0007-crypto-arm-chacha-import-Eric-Biggers-s-scalar-accel.patch
deleted file mode 100644
index 978f2f55be..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0007-crypto-arm-chacha-import-Eric-Biggers-s-scalar-accel.patch
+++ /dev/null
@@ -1,480 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:13 +0100
-Subject: [PATCH] crypto: arm/chacha - import Eric Biggers's scalar accelerated
- ChaCha code
-
-commit 29621d099f9c642b22a69dc8e7e20c108473a392 upstream.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-scalar-core.S | 461 +++++++++++++++++++++++++++
- 1 file changed, 461 insertions(+)
- create mode 100644 arch/arm/crypto/chacha-scalar-core.S
-
---- /dev/null
-+++ b/arch/arm/crypto/chacha-scalar-core.S
-@@ -0,0 +1,461 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2018 Google, Inc.
-+ */
-+
-+#include <linux/linkage.h>
-+#include <asm/assembler.h>
-+
-+/*
-+ * Design notes:
-+ *
-+ * 16 registers would be needed to hold the state matrix, but only 14 are
-+ * available because 'sp' and 'pc' cannot be used. So we spill the elements
-+ * (x8, x9) to the stack and swap them out with (x10, x11). This adds one
-+ * 'ldrd' and one 'strd' instruction per round.
-+ *
-+ * All rotates are performed using the implicit rotate operand accepted by the
-+ * 'add' and 'eor' instructions. This is faster than using explicit rotate
-+ * instructions. To make this work, we allow the values in the second and last
-+ * rows of the ChaCha state matrix (rows 'b' and 'd') to temporarily have the
-+ * wrong rotation amount. The rotation amount is then fixed up just in time
-+ * when the values are used. 'brot' is the number of bits the values in row 'b'
-+ * need to be rotated right to arrive at the correct values, and 'drot'
-+ * similarly for row 'd'. (brot, drot) start out as (0, 0) but we make it such
-+ * that they end up as (25, 24) after every round.
-+ */
-+
-+ // ChaCha state registers
-+ X0 .req r0
-+ X1 .req r1
-+ X2 .req r2
-+ X3 .req r3
-+ X4 .req r4
-+ X5 .req r5
-+ X6 .req r6
-+ X7 .req r7
-+ X8_X10 .req r8 // shared by x8 and x10
-+ X9_X11 .req r9 // shared by x9 and x11
-+ X12 .req r10
-+ X13 .req r11
-+ X14 .req r12
-+ X15 .req r14
-+
-+.Lexpand_32byte_k:
-+ // "expand 32-byte k"
-+ .word 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574
-+
-+#ifdef __thumb2__
-+# define adrl adr
-+#endif
-+
-+.macro __rev out, in, t0, t1, t2
-+.if __LINUX_ARM_ARCH__ >= 6
-+ rev \out, \in
-+.else
-+ lsl \t0, \in, #24
-+ and \t1, \in, #0xff00
-+ and \t2, \in, #0xff0000
-+ orr \out, \t0, \in, lsr #24
-+ orr \out, \out, \t1, lsl #8
-+ orr \out, \out, \t2, lsr #8
-+.endif
-+.endm
-+
-+.macro _le32_bswap x, t0, t1, t2
-+#ifdef __ARMEB__
-+ __rev \x, \x, \t0, \t1, \t2
-+#endif
-+.endm
-+
-+.macro _le32_bswap_4x a, b, c, d, t0, t1, t2
-+ _le32_bswap \a, \t0, \t1, \t2
-+ _le32_bswap \b, \t0, \t1, \t2
-+ _le32_bswap \c, \t0, \t1, \t2
-+ _le32_bswap \d, \t0, \t1, \t2
-+.endm
-+
-+.macro __ldrd a, b, src, offset
-+#if __LINUX_ARM_ARCH__ >= 6
-+ ldrd \a, \b, [\src, #\offset]
-+#else
-+ ldr \a, [\src, #\offset]
-+ ldr \b, [\src, #\offset + 4]
-+#endif
-+.endm
-+
-+.macro __strd a, b, dst, offset
-+#if __LINUX_ARM_ARCH__ >= 6
-+ strd \a, \b, [\dst, #\offset]
-+#else
-+ str \a, [\dst, #\offset]
-+ str \b, [\dst, #\offset + 4]
-+#endif
-+.endm
-+
-+.macro _halfround a1, b1, c1, d1, a2, b2, c2, d2
-+
-+ // a += b; d ^= a; d = rol(d, 16);
-+ add \a1, \a1, \b1, ror #brot
-+ add \a2, \a2, \b2, ror #brot
-+ eor \d1, \a1, \d1, ror #drot
-+ eor \d2, \a2, \d2, ror #drot
-+ // drot == 32 - 16 == 16
-+
-+ // c += d; b ^= c; b = rol(b, 12);
-+ add \c1, \c1, \d1, ror #16
-+ add \c2, \c2, \d2, ror #16
-+ eor \b1, \c1, \b1, ror #brot
-+ eor \b2, \c2, \b2, ror #brot
-+ // brot == 32 - 12 == 20
-+
-+ // a += b; d ^= a; d = rol(d, 8);
-+ add \a1, \a1, \b1, ror #20
-+ add \a2, \a2, \b2, ror #20
-+ eor \d1, \a1, \d1, ror #16
-+ eor \d2, \a2, \d2, ror #16
-+ // drot == 32 - 8 == 24
-+
-+ // c += d; b ^= c; b = rol(b, 7);
-+ add \c1, \c1, \d1, ror #24
-+ add \c2, \c2, \d2, ror #24
-+ eor \b1, \c1, \b1, ror #20
-+ eor \b2, \c2, \b2, ror #20
-+ // brot == 32 - 7 == 25
-+.endm
-+
-+.macro _doubleround
-+
-+ // column round
-+
-+ // quarterrounds: (x0, x4, x8, x12) and (x1, x5, x9, x13)
-+ _halfround X0, X4, X8_X10, X12, X1, X5, X9_X11, X13
-+
-+ // save (x8, x9); restore (x10, x11)
-+ __strd X8_X10, X9_X11, sp, 0
-+ __ldrd X8_X10, X9_X11, sp, 8
-+
-+ // quarterrounds: (x2, x6, x10, x14) and (x3, x7, x11, x15)
-+ _halfround X2, X6, X8_X10, X14, X3, X7, X9_X11, X15
-+
-+ .set brot, 25
-+ .set drot, 24
-+
-+ // diagonal round
-+
-+ // quarterrounds: (x0, x5, x10, x15) and (x1, x6, x11, x12)
-+ _halfround X0, X5, X8_X10, X15, X1, X6, X9_X11, X12
-+
-+ // save (x10, x11); restore (x8, x9)
-+ __strd X8_X10, X9_X11, sp, 8
-+ __ldrd X8_X10, X9_X11, sp, 0
-+
-+ // quarterrounds: (x2, x7, x8, x13) and (x3, x4, x9, x14)
-+ _halfround X2, X7, X8_X10, X13, X3, X4, X9_X11, X14
-+.endm
-+
-+.macro _chacha_permute nrounds
-+ .set brot, 0
-+ .set drot, 0
-+ .rept \nrounds / 2
-+ _doubleround
-+ .endr
-+.endm
-+
-+.macro _chacha nrounds
-+
-+.Lnext_block\@:
-+ // Stack: unused0-unused1 x10-x11 x0-x15 OUT IN LEN
-+ // Registers contain x0-x9,x12-x15.
-+
-+ // Do the core ChaCha permutation to update x0-x15.
-+ _chacha_permute \nrounds
-+
-+ add sp, #8
-+ // Stack: x10-x11 orig_x0-orig_x15 OUT IN LEN
-+ // Registers contain x0-x9,x12-x15.
-+ // x4-x7 are rotated by 'brot'; x12-x15 are rotated by 'drot'.
-+
-+ // Free up some registers (r8-r12,r14) by pushing (x8-x9,x12-x15).
-+ push {X8_X10, X9_X11, X12, X13, X14, X15}
-+
-+ // Load (OUT, IN, LEN).
-+ ldr r14, [sp, #96]
-+ ldr r12, [sp, #100]
-+ ldr r11, [sp, #104]
-+
-+ orr r10, r14, r12
-+
-+ // Use slow path if fewer than 64 bytes remain.
-+ cmp r11, #64
-+ blt .Lxor_slowpath\@
-+
-+ // Use slow path if IN and/or OUT isn't 4-byte aligned. Needed even on
-+ // ARMv6+, since ldmia and stmia (used below) still require alignment.
-+ tst r10, #3
-+ bne .Lxor_slowpath\@
-+
-+ // Fast path: XOR 64 bytes of aligned data.
-+
-+ // Stack: x8-x9 x12-x15 x10-x11 orig_x0-orig_x15 OUT IN LEN
-+ // Registers: r0-r7 are x0-x7; r8-r11 are free; r12 is IN; r14 is OUT.
-+ // x4-x7 are rotated by 'brot'; x12-x15 are rotated by 'drot'.
-+
-+ // x0-x3
-+ __ldrd r8, r9, sp, 32
-+ __ldrd r10, r11, sp, 40
-+ add X0, X0, r8
-+ add X1, X1, r9
-+ add X2, X2, r10
-+ add X3, X3, r11
-+ _le32_bswap_4x X0, X1, X2, X3, r8, r9, r10
-+ ldmia r12!, {r8-r11}
-+ eor X0, X0, r8
-+ eor X1, X1, r9
-+ eor X2, X2, r10
-+ eor X3, X3, r11
-+ stmia r14!, {X0-X3}
-+
-+ // x4-x7
-+ __ldrd r8, r9, sp, 48
-+ __ldrd r10, r11, sp, 56
-+ add X4, r8, X4, ror #brot
-+ add X5, r9, X5, ror #brot
-+ ldmia r12!, {X0-X3}
-+ add X6, r10, X6, ror #brot
-+ add X7, r11, X7, ror #brot
-+ _le32_bswap_4x X4, X5, X6, X7, r8, r9, r10
-+ eor X4, X4, X0
-+ eor X5, X5, X1
-+ eor X6, X6, X2
-+ eor X7, X7, X3
-+ stmia r14!, {X4-X7}
-+
-+ // x8-x15
-+ pop {r0-r7} // (x8-x9,x12-x15,x10-x11)
-+ __ldrd r8, r9, sp, 32
-+ __ldrd r10, r11, sp, 40
-+ add r0, r0, r8 // x8
-+ add r1, r1, r9 // x9
-+ add r6, r6, r10 // x10
-+ add r7, r7, r11 // x11
-+ _le32_bswap_4x r0, r1, r6, r7, r8, r9, r10
-+ ldmia r12!, {r8-r11}
-+ eor r0, r0, r8 // x8
-+ eor r1, r1, r9 // x9
-+ eor r6, r6, r10 // x10
-+ eor r7, r7, r11 // x11
-+ stmia r14!, {r0,r1,r6,r7}
-+ ldmia r12!, {r0,r1,r6,r7}
-+ __ldrd r8, r9, sp, 48
-+ __ldrd r10, r11, sp, 56
-+ add r2, r8, r2, ror #drot // x12
-+ add r3, r9, r3, ror #drot // x13
-+ add r4, r10, r4, ror #drot // x14
-+ add r5, r11, r5, ror #drot // x15
-+ _le32_bswap_4x r2, r3, r4, r5, r9, r10, r11
-+ ldr r9, [sp, #72] // load LEN
-+ eor r2, r2, r0 // x12
-+ eor r3, r3, r1 // x13
-+ eor r4, r4, r6 // x14
-+ eor r5, r5, r7 // x15
-+ subs r9, #64 // decrement and check LEN
-+ stmia r14!, {r2-r5}
-+
-+ beq .Ldone\@
-+
-+.Lprepare_for_next_block\@:
-+
-+ // Stack: x0-x15 OUT IN LEN
-+
-+ // Increment block counter (x12)
-+ add r8, #1
-+
-+ // Store updated (OUT, IN, LEN)
-+ str r14, [sp, #64]
-+ str r12, [sp, #68]
-+ str r9, [sp, #72]
-+
-+ mov r14, sp
-+
-+ // Store updated block counter (x12)
-+ str r8, [sp, #48]
-+
-+ sub sp, #16
-+
-+ // Reload state and do next block
-+ ldmia r14!, {r0-r11} // load x0-x11
-+ __strd r10, r11, sp, 8 // store x10-x11 before state
-+ ldmia r14, {r10-r12,r14} // load x12-x15
-+ b .Lnext_block\@
-+
-+.Lxor_slowpath\@:
-+ // Slow path: < 64 bytes remaining, or unaligned input or output buffer.
-+ // We handle it by storing the 64 bytes of keystream to the stack, then
-+ // XOR-ing the needed portion with the data.
-+
-+ // Allocate keystream buffer
-+ sub sp, #64
-+ mov r14, sp
-+
-+ // Stack: ks0-ks15 x8-x9 x12-x15 x10-x11 orig_x0-orig_x15 OUT IN LEN
-+ // Registers: r0-r7 are x0-x7; r8-r11 are free; r12 is IN; r14 is &ks0.
-+ // x4-x7 are rotated by 'brot'; x12-x15 are rotated by 'drot'.
-+
-+ // Save keystream for x0-x3
-+ __ldrd r8, r9, sp, 96
-+ __ldrd r10, r11, sp, 104
-+ add X0, X0, r8
-+ add X1, X1, r9
-+ add X2, X2, r10
-+ add X3, X3, r11
-+ _le32_bswap_4x X0, X1, X2, X3, r8, r9, r10
-+ stmia r14!, {X0-X3}
-+
-+ // Save keystream for x4-x7
-+ __ldrd r8, r9, sp, 112
-+ __ldrd r10, r11, sp, 120
-+ add X4, r8, X4, ror #brot
-+ add X5, r9, X5, ror #brot
-+ add X6, r10, X6, ror #brot
-+ add X7, r11, X7, ror #brot
-+ _le32_bswap_4x X4, X5, X6, X7, r8, r9, r10
-+ add r8, sp, #64
-+ stmia r14!, {X4-X7}
-+
-+ // Save keystream for x8-x15
-+ ldm r8, {r0-r7} // (x8-x9,x12-x15,x10-x11)
-+ __ldrd r8, r9, sp, 128
-+ __ldrd r10, r11, sp, 136
-+ add r0, r0, r8 // x8
-+ add r1, r1, r9 // x9
-+ add r6, r6, r10 // x10
-+ add r7, r7, r11 // x11
-+ _le32_bswap_4x r0, r1, r6, r7, r8, r9, r10
-+ stmia r14!, {r0,r1,r6,r7}
-+ __ldrd r8, r9, sp, 144
-+ __ldrd r10, r11, sp, 152
-+ add r2, r8, r2, ror #drot // x12
-+ add r3, r9, r3, ror #drot // x13
-+ add r4, r10, r4, ror #drot // x14
-+ add r5, r11, r5, ror #drot // x15
-+ _le32_bswap_4x r2, r3, r4, r5, r9, r10, r11
-+ stmia r14, {r2-r5}
-+
-+ // Stack: ks0-ks15 unused0-unused7 x0-x15 OUT IN LEN
-+ // Registers: r8 is block counter, r12 is IN.
-+
-+ ldr r9, [sp, #168] // LEN
-+ ldr r14, [sp, #160] // OUT
-+ cmp r9, #64
-+ mov r0, sp
-+ movle r1, r9
-+ movgt r1, #64
-+ // r1 is number of bytes to XOR, in range [1, 64]
-+
-+.if __LINUX_ARM_ARCH__ < 6
-+ orr r2, r12, r14
-+ tst r2, #3 // IN or OUT misaligned?
-+ bne .Lxor_next_byte\@
-+.endif
-+
-+ // XOR a word at a time
-+.rept 16
-+ subs r1, #4
-+ blt .Lxor_words_done\@
-+ ldr r2, [r12], #4
-+ ldr r3, [r0], #4
-+ eor r2, r2, r3
-+ str r2, [r14], #4
-+.endr
-+ b .Lxor_slowpath_done\@
-+.Lxor_words_done\@:
-+ ands r1, r1, #3
-+ beq .Lxor_slowpath_done\@
-+
-+ // XOR a byte at a time
-+.Lxor_next_byte\@:
-+ ldrb r2, [r12], #1
-+ ldrb r3, [r0], #1
-+ eor r2, r2, r3
-+ strb r2, [r14], #1
-+ subs r1, #1
-+ bne .Lxor_next_byte\@
-+
-+.Lxor_slowpath_done\@:
-+ subs r9, #64
-+ add sp, #96
-+ bgt .Lprepare_for_next_block\@
-+
-+.Ldone\@:
-+.endm // _chacha
-+
-+/*
-+ * void chacha20_arm(u8 *out, const u8 *in, size_t len, const u32 key[8],
-+ * const u32 iv[4]);
-+ */
-+ENTRY(chacha20_arm)
-+ cmp r2, #0 // len == 0?
-+ reteq lr
-+
-+ push {r0-r2,r4-r11,lr}
-+
-+ // Push state x0-x15 onto stack.
-+ // Also store an extra copy of x10-x11 just before the state.
-+
-+ ldr r4, [sp, #48] // iv
-+ mov r0, sp
-+ sub sp, #80
-+
-+ // iv: x12-x15
-+ ldm r4, {X12,X13,X14,X15}
-+ stmdb r0!, {X12,X13,X14,X15}
-+
-+ // key: x4-x11
-+ __ldrd X8_X10, X9_X11, r3, 24
-+ __strd X8_X10, X9_X11, sp, 8
-+ stmdb r0!, {X8_X10, X9_X11}
-+ ldm r3, {X4-X9_X11}
-+ stmdb r0!, {X4-X9_X11}
-+
-+ // constants: x0-x3
-+ adrl X3, .Lexpand_32byte_k
-+ ldm X3, {X0-X3}
-+ __strd X0, X1, sp, 16
-+ __strd X2, X3, sp, 24
-+
-+ _chacha 20
-+
-+ add sp, #76
-+ pop {r4-r11, pc}
-+ENDPROC(chacha20_arm)
-+
-+/*
-+ * void hchacha20_arm(const u32 state[16], u32 out[8]);
-+ */
-+ENTRY(hchacha20_arm)
-+ push {r1,r4-r11,lr}
-+
-+ mov r14, r0
-+ ldmia r14!, {r0-r11} // load x0-x11
-+ push {r10-r11} // store x10-x11 to stack
-+ ldm r14, {r10-r12,r14} // load x12-x15
-+ sub sp, #8
-+
-+ _chacha_permute 20
-+
-+ // Skip over (unused0-unused1, x10-x11)
-+ add sp, #16
-+
-+ // Fix up rotations of x12-x15
-+ ror X12, X12, #drot
-+ ror X13, X13, #drot
-+ pop {r4} // load 'out'
-+ ror X14, X14, #drot
-+ ror X15, X15, #drot
-+
-+ // Store (x0-x3,x12-x15) to 'out'
-+ stm r4, {X0,X1,X2,X3,X12,X13,X14,X15}
-+
-+ pop {r4-r11,pc}
-+ENDPROC(hchacha20_arm)
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0008-crypto-arm-chacha-remove-dependency-on-generic-ChaCh.patch b/target/linux/generic/backport-5.4/080-wireguard-0008-crypto-arm-chacha-remove-dependency-on-generic-ChaCh.patch
deleted file mode 100644
index 88c9738dbc..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0008-crypto-arm-chacha-remove-dependency-on-generic-ChaCh.patch
+++ /dev/null
@@ -1,691 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:14 +0100
-Subject: [PATCH] crypto: arm/chacha - remove dependency on generic ChaCha
- driver
-
-commit b36d8c09e710c71f6a9690b6586fea2d1c9e1e27 upstream.
-
-Instead of falling back to the generic ChaCha skcipher driver for
-non-SIMD cases, use a fast scalar implementation for ARM authored
-by Eric Biggers. This removes the module dependency on chacha-generic
-altogether, which also simplifies things when we expose the ChaCha
-library interface from this module.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/Kconfig | 4 +-
- arch/arm/crypto/Makefile | 3 +-
- arch/arm/crypto/chacha-glue.c | 304 +++++++++++++++++++++++++++
- arch/arm/crypto/chacha-neon-glue.c | 202 ------------------
- arch/arm/crypto/chacha-scalar-core.S | 65 +++---
- arch/arm64/crypto/chacha-neon-glue.c | 2 +-
- 6 files changed, 340 insertions(+), 240 deletions(-)
- create mode 100644 arch/arm/crypto/chacha-glue.c
- delete mode 100644 arch/arm/crypto/chacha-neon-glue.c
-
---- a/arch/arm/crypto/Kconfig
-+++ b/arch/arm/crypto/Kconfig
-@@ -127,10 +127,8 @@ config CRYPTO_CRC32_ARM_CE
- select CRYPTO_HASH
-
- config CRYPTO_CHACHA20_NEON
-- tristate "NEON accelerated ChaCha stream cipher algorithms"
-- depends on KERNEL_MODE_NEON
-+ tristate "NEON and scalar accelerated ChaCha stream cipher algorithms"
- select CRYPTO_BLKCIPHER
-- select CRYPTO_CHACHA20
-
- config CRYPTO_NHPOLY1305_NEON
- tristate "NEON accelerated NHPoly1305 hash function (for Adiantum)"
---- a/arch/arm/crypto/Makefile
-+++ b/arch/arm/crypto/Makefile
-@@ -53,7 +53,8 @@ aes-arm-ce-y := aes-ce-core.o aes-ce-glu
- ghash-arm-ce-y := ghash-ce-core.o ghash-ce-glue.o
- crct10dif-arm-ce-y := crct10dif-ce-core.o crct10dif-ce-glue.o
- crc32-arm-ce-y:= crc32-ce-core.o crc32-ce-glue.o
--chacha-neon-y := chacha-neon-core.o chacha-neon-glue.o
-+chacha-neon-y := chacha-scalar-core.o chacha-glue.o
-+chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o
- nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
-
- ifdef REGENERATE_ARM_CRYPTO
---- /dev/null
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -0,0 +1,304 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * ARM NEON accelerated ChaCha and XChaCha stream ciphers,
-+ * including ChaCha20 (RFC7539)
-+ *
-+ * Copyright (C) 2016-2019 Linaro, Ltd. <ard.biesheuvel@linaro.org>
-+ * Copyright (C) 2015 Martin Willi
-+ */
-+
-+#include <crypto/algapi.h>
-+#include <crypto/internal/chacha.h>
-+#include <crypto/internal/simd.h>
-+#include <crypto/internal/skcipher.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+#include <asm/cputype.h>
-+#include <asm/hwcap.h>
-+#include <asm/neon.h>
-+#include <asm/simd.h>
-+
-+asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
-+ int nrounds);
-+asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
-+ int nrounds);
-+asmlinkage void hchacha_block_arm(const u32 *state, u32 *out, int nrounds);
-+asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
-+
-+asmlinkage void chacha_doarm(u8 *dst, const u8 *src, unsigned int bytes,
-+ const u32 *state, int nrounds);
-+
-+static inline bool neon_usable(void)
-+{
-+ return crypto_simd_usable();
-+}
-+
-+static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds)
-+{
-+ u8 buf[CHACHA_BLOCK_SIZE];
-+
-+ while (bytes >= CHACHA_BLOCK_SIZE * 4) {
-+ chacha_4block_xor_neon(state, dst, src, nrounds);
-+ bytes -= CHACHA_BLOCK_SIZE * 4;
-+ src += CHACHA_BLOCK_SIZE * 4;
-+ dst += CHACHA_BLOCK_SIZE * 4;
-+ state[12] += 4;
-+ }
-+ while (bytes >= CHACHA_BLOCK_SIZE) {
-+ chacha_block_xor_neon(state, dst, src, nrounds);
-+ bytes -= CHACHA_BLOCK_SIZE;
-+ src += CHACHA_BLOCK_SIZE;
-+ dst += CHACHA_BLOCK_SIZE;
-+ state[12]++;
-+ }
-+ if (bytes) {
-+ memcpy(buf, src, bytes);
-+ chacha_block_xor_neon(state, buf, buf, nrounds);
-+ memcpy(dst, buf, bytes);
-+ }
-+}
-+
-+static int chacha_stream_xor(struct skcipher_request *req,
-+ const struct chacha_ctx *ctx, const u8 *iv,
-+ bool neon)
-+{
-+ struct skcipher_walk walk;
-+ u32 state[16];
-+ int err;
-+
-+ err = skcipher_walk_virt(&walk, req, false);
-+
-+ chacha_init_generic(state, ctx->key, iv);
-+
-+ while (walk.nbytes > 0) {
-+ unsigned int nbytes = walk.nbytes;
-+
-+ if (nbytes < walk.total)
-+ nbytes = round_down(nbytes, walk.stride);
-+
-+ if (!neon) {
-+ chacha_doarm(walk.dst.virt.addr, walk.src.virt.addr,
-+ nbytes, state, ctx->nrounds);
-+ state[12] += DIV_ROUND_UP(nbytes, CHACHA_BLOCK_SIZE);
-+ } else {
-+ kernel_neon_begin();
-+ chacha_doneon(state, walk.dst.virt.addr,
-+ walk.src.virt.addr, nbytes, ctx->nrounds);
-+ kernel_neon_end();
-+ }
-+ err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-+ }
-+
-+ return err;
-+}
-+
-+static int do_chacha(struct skcipher_request *req, bool neon)
-+{
-+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-+ struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-+
-+ return chacha_stream_xor(req, ctx, req->iv, neon);
-+}
-+
-+static int chacha_arm(struct skcipher_request *req)
-+{
-+ return do_chacha(req, false);
-+}
-+
-+static int chacha_neon(struct skcipher_request *req)
-+{
-+ return do_chacha(req, neon_usable());
-+}
-+
-+static int do_xchacha(struct skcipher_request *req, bool neon)
-+{
-+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-+ struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-+ struct chacha_ctx subctx;
-+ u32 state[16];
-+ u8 real_iv[16];
-+
-+ chacha_init_generic(state, ctx->key, req->iv);
-+
-+ if (!neon) {
-+ hchacha_block_arm(state, subctx.key, ctx->nrounds);
-+ } else {
-+ kernel_neon_begin();
-+ hchacha_block_neon(state, subctx.key, ctx->nrounds);
-+ kernel_neon_end();
-+ }
-+ subctx.nrounds = ctx->nrounds;
-+
-+ memcpy(&real_iv[0], req->iv + 24, 8);
-+ memcpy(&real_iv[8], req->iv + 16, 8);
-+ return chacha_stream_xor(req, &subctx, real_iv, neon);
-+}
-+
-+static int xchacha_arm(struct skcipher_request *req)
-+{
-+ return do_xchacha(req, false);
-+}
-+
-+static int xchacha_neon(struct skcipher_request *req)
-+{
-+ return do_xchacha(req, neon_usable());
-+}
-+
-+static struct skcipher_alg arm_algs[] = {
-+ {
-+ .base.cra_name = "chacha20",
-+ .base.cra_driver_name = "chacha20-arm",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = CHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = chacha_arm,
-+ .decrypt = chacha_arm,
-+ }, {
-+ .base.cra_name = "xchacha20",
-+ .base.cra_driver_name = "xchacha20-arm",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = xchacha_arm,
-+ .decrypt = xchacha_arm,
-+ }, {
-+ .base.cra_name = "xchacha12",
-+ .base.cra_driver_name = "xchacha12-arm",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha12_setkey,
-+ .encrypt = xchacha_arm,
-+ .decrypt = xchacha_arm,
-+ },
-+};
-+
-+static struct skcipher_alg neon_algs[] = {
-+ {
-+ .base.cra_name = "chacha20",
-+ .base.cra_driver_name = "chacha20-neon",
-+ .base.cra_priority = 300,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = CHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .walksize = 4 * CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = chacha_neon,
-+ .decrypt = chacha_neon,
-+ }, {
-+ .base.cra_name = "xchacha20",
-+ .base.cra_driver_name = "xchacha20-neon",
-+ .base.cra_priority = 300,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .walksize = 4 * CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = xchacha_neon,
-+ .decrypt = xchacha_neon,
-+ }, {
-+ .base.cra_name = "xchacha12",
-+ .base.cra_driver_name = "xchacha12-neon",
-+ .base.cra_priority = 300,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .walksize = 4 * CHACHA_BLOCK_SIZE,
-+ .setkey = chacha12_setkey,
-+ .encrypt = xchacha_neon,
-+ .decrypt = xchacha_neon,
-+ }
-+};
-+
-+static int __init chacha_simd_mod_init(void)
-+{
-+ int err;
-+
-+ err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ if (err)
-+ return err;
-+
-+ if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON)) {
-+ int i;
-+
-+ switch (read_cpuid_part()) {
-+ case ARM_CPU_PART_CORTEX_A7:
-+ case ARM_CPU_PART_CORTEX_A5:
-+ /*
-+ * The Cortex-A7 and Cortex-A5 do not perform well with
-+ * the NEON implementation but do incredibly with the
-+ * scalar one and use less power.
-+ */
-+ for (i = 0; i < ARRAY_SIZE(neon_algs); i++)
-+ neon_algs[i].base.cra_priority = 0;
-+ break;
-+ }
-+
-+ err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-+ if (err)
-+ crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ }
-+ return err;
-+}
-+
-+static void __exit chacha_simd_mod_fini(void)
-+{
-+ crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
-+ crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-+}
-+
-+module_init(chacha_simd_mod_init);
-+module_exit(chacha_simd_mod_fini);
-+
-+MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (scalar and NEON accelerated)");
-+MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CRYPTO("chacha20");
-+MODULE_ALIAS_CRYPTO("chacha20-arm");
-+MODULE_ALIAS_CRYPTO("xchacha20");
-+MODULE_ALIAS_CRYPTO("xchacha20-arm");
-+MODULE_ALIAS_CRYPTO("xchacha12");
-+MODULE_ALIAS_CRYPTO("xchacha12-arm");
-+#ifdef CONFIG_KERNEL_MODE_NEON
-+MODULE_ALIAS_CRYPTO("chacha20-neon");
-+MODULE_ALIAS_CRYPTO("xchacha20-neon");
-+MODULE_ALIAS_CRYPTO("xchacha12-neon");
-+#endif
---- a/arch/arm/crypto/chacha-neon-glue.c
-+++ /dev/null
-@@ -1,202 +0,0 @@
--/*
-- * ARM NEON accelerated ChaCha and XChaCha stream ciphers,
-- * including ChaCha20 (RFC7539)
-- *
-- * Copyright (C) 2016 Linaro, Ltd. <ard.biesheuvel@linaro.org>
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- *
-- * Based on:
-- * ChaCha20 256-bit cipher algorithm, RFC7539, SIMD glue code
-- *
-- * Copyright (C) 2015 Martin Willi
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- */
--
--#include <crypto/algapi.h>
--#include <crypto/internal/chacha.h>
--#include <crypto/internal/simd.h>
--#include <crypto/internal/skcipher.h>
--#include <linux/kernel.h>
--#include <linux/module.h>
--
--#include <asm/hwcap.h>
--#include <asm/neon.h>
--#include <asm/simd.h>
--
--asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
-- int nrounds);
--asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
-- int nrounds);
--asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
--
--static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
-- unsigned int bytes, int nrounds)
--{
-- u8 buf[CHACHA_BLOCK_SIZE];
--
-- while (bytes >= CHACHA_BLOCK_SIZE * 4) {
-- chacha_4block_xor_neon(state, dst, src, nrounds);
-- bytes -= CHACHA_BLOCK_SIZE * 4;
-- src += CHACHA_BLOCK_SIZE * 4;
-- dst += CHACHA_BLOCK_SIZE * 4;
-- state[12] += 4;
-- }
-- while (bytes >= CHACHA_BLOCK_SIZE) {
-- chacha_block_xor_neon(state, dst, src, nrounds);
-- bytes -= CHACHA_BLOCK_SIZE;
-- src += CHACHA_BLOCK_SIZE;
-- dst += CHACHA_BLOCK_SIZE;
-- state[12]++;
-- }
-- if (bytes) {
-- memcpy(buf, src, bytes);
-- chacha_block_xor_neon(state, buf, buf, nrounds);
-- memcpy(dst, buf, bytes);
-- }
--}
--
--static int chacha_neon_stream_xor(struct skcipher_request *req,
-- const struct chacha_ctx *ctx, const u8 *iv)
--{
-- struct skcipher_walk walk;
-- u32 state[16];
-- int err;
--
-- err = skcipher_walk_virt(&walk, req, false);
--
-- crypto_chacha_init(state, ctx, iv);
--
-- while (walk.nbytes > 0) {
-- unsigned int nbytes = walk.nbytes;
--
-- if (nbytes < walk.total)
-- nbytes = round_down(nbytes, walk.stride);
--
-- kernel_neon_begin();
-- chacha_doneon(state, walk.dst.virt.addr, walk.src.virt.addr,
-- nbytes, ctx->nrounds);
-- kernel_neon_end();
-- err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-- }
--
-- return err;
--}
--
--static int chacha_neon(struct skcipher_request *req)
--{
-- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
--
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_chacha_crypt(req);
--
-- return chacha_neon_stream_xor(req, ctx, req->iv);
--}
--
--static int xchacha_neon(struct skcipher_request *req)
--{
-- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-- struct chacha_ctx subctx;
-- u32 state[16];
-- u8 real_iv[16];
--
-- if (req->cryptlen <= CHACHA_BLOCK_SIZE || !crypto_simd_usable())
-- return crypto_xchacha_crypt(req);
--
-- crypto_chacha_init(state, ctx, req->iv);
--
-- kernel_neon_begin();
-- hchacha_block_neon(state, subctx.key, ctx->nrounds);
-- kernel_neon_end();
-- subctx.nrounds = ctx->nrounds;
--
-- memcpy(&real_iv[0], req->iv + 24, 8);
-- memcpy(&real_iv[8], req->iv + 16, 8);
-- return chacha_neon_stream_xor(req, &subctx, real_iv);
--}
--
--static struct skcipher_alg algs[] = {
-- {
-- .base.cra_name = "chacha20",
-- .base.cra_driver_name = "chacha20-neon",
-- .base.cra_priority = 300,
-- .base.cra_blocksize = 1,
-- .base.cra_ctxsize = sizeof(struct chacha_ctx),
-- .base.cra_module = THIS_MODULE,
--
-- .min_keysize = CHACHA_KEY_SIZE,
-- .max_keysize = CHACHA_KEY_SIZE,
-- .ivsize = CHACHA_IV_SIZE,
-- .chunksize = CHACHA_BLOCK_SIZE,
-- .walksize = 4 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-- .encrypt = chacha_neon,
-- .decrypt = chacha_neon,
-- }, {
-- .base.cra_name = "xchacha20",
-- .base.cra_driver_name = "xchacha20-neon",
-- .base.cra_priority = 300,
-- .base.cra_blocksize = 1,
-- .base.cra_ctxsize = sizeof(struct chacha_ctx),
-- .base.cra_module = THIS_MODULE,
--
-- .min_keysize = CHACHA_KEY_SIZE,
-- .max_keysize = CHACHA_KEY_SIZE,
-- .ivsize = XCHACHA_IV_SIZE,
-- .chunksize = CHACHA_BLOCK_SIZE,
-- .walksize = 4 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-- .encrypt = xchacha_neon,
-- .decrypt = xchacha_neon,
-- }, {
-- .base.cra_name = "xchacha12",
-- .base.cra_driver_name = "xchacha12-neon",
-- .base.cra_priority = 300,
-- .base.cra_blocksize = 1,
-- .base.cra_ctxsize = sizeof(struct chacha_ctx),
-- .base.cra_module = THIS_MODULE,
--
-- .min_keysize = CHACHA_KEY_SIZE,
-- .max_keysize = CHACHA_KEY_SIZE,
-- .ivsize = XCHACHA_IV_SIZE,
-- .chunksize = CHACHA_BLOCK_SIZE,
-- .walksize = 4 * CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha12_setkey,
-- .encrypt = xchacha_neon,
-- .decrypt = xchacha_neon,
-- }
--};
--
--static int __init chacha_simd_mod_init(void)
--{
-- if (!(elf_hwcap & HWCAP_NEON))
-- return -ENODEV;
--
-- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
--}
--
--static void __exit chacha_simd_mod_fini(void)
--{
-- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
--}
--
--module_init(chacha_simd_mod_init);
--module_exit(chacha_simd_mod_fini);
--
--MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (NEON accelerated)");
--MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
--MODULE_LICENSE("GPL v2");
--MODULE_ALIAS_CRYPTO("chacha20");
--MODULE_ALIAS_CRYPTO("chacha20-neon");
--MODULE_ALIAS_CRYPTO("xchacha20");
--MODULE_ALIAS_CRYPTO("xchacha20-neon");
--MODULE_ALIAS_CRYPTO("xchacha12");
--MODULE_ALIAS_CRYPTO("xchacha12-neon");
---- a/arch/arm/crypto/chacha-scalar-core.S
-+++ b/arch/arm/crypto/chacha-scalar-core.S
-@@ -41,14 +41,6 @@
- X14 .req r12
- X15 .req r14
-
--.Lexpand_32byte_k:
-- // "expand 32-byte k"
-- .word 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574
--
--#ifdef __thumb2__
--# define adrl adr
--#endif
--
- .macro __rev out, in, t0, t1, t2
- .if __LINUX_ARM_ARCH__ >= 6
- rev \out, \in
-@@ -391,61 +383,65 @@
- .endm // _chacha
-
- /*
-- * void chacha20_arm(u8 *out, const u8 *in, size_t len, const u32 key[8],
-- * const u32 iv[4]);
-+ * void chacha_doarm(u8 *dst, const u8 *src, unsigned int bytes,
-+ * const u32 *state, int nrounds);
- */
--ENTRY(chacha20_arm)
-+ENTRY(chacha_doarm)
- cmp r2, #0 // len == 0?
- reteq lr
-
-+ ldr ip, [sp]
-+ cmp ip, #12
-+
- push {r0-r2,r4-r11,lr}
-
- // Push state x0-x15 onto stack.
- // Also store an extra copy of x10-x11 just before the state.
-
-- ldr r4, [sp, #48] // iv
-- mov r0, sp
-- sub sp, #80
--
-- // iv: x12-x15
-- ldm r4, {X12,X13,X14,X15}
-- stmdb r0!, {X12,X13,X14,X15}
-+ add X12, r3, #48
-+ ldm X12, {X12,X13,X14,X15}
-+ push {X12,X13,X14,X15}
-+ sub sp, sp, #64
-
-- // key: x4-x11
-- __ldrd X8_X10, X9_X11, r3, 24
-+ __ldrd X8_X10, X9_X11, r3, 40
- __strd X8_X10, X9_X11, sp, 8
-- stmdb r0!, {X8_X10, X9_X11}
-- ldm r3, {X4-X9_X11}
-- stmdb r0!, {X4-X9_X11}
--
-- // constants: x0-x3
-- adrl X3, .Lexpand_32byte_k
-- ldm X3, {X0-X3}
-+ __strd X8_X10, X9_X11, sp, 56
-+ ldm r3, {X0-X9_X11}
- __strd X0, X1, sp, 16
- __strd X2, X3, sp, 24
-+ __strd X4, X5, sp, 32
-+ __strd X6, X7, sp, 40
-+ __strd X8_X10, X9_X11, sp, 48
-
-+ beq 1f
- _chacha 20
-
-- add sp, #76
-+0: add sp, #76
- pop {r4-r11, pc}
--ENDPROC(chacha20_arm)
-+
-+1: _chacha 12
-+ b 0b
-+ENDPROC(chacha_doarm)
-
- /*
-- * void hchacha20_arm(const u32 state[16], u32 out[8]);
-+ * void hchacha_block_arm(const u32 state[16], u32 out[8], int nrounds);
- */
--ENTRY(hchacha20_arm)
-+ENTRY(hchacha_block_arm)
- push {r1,r4-r11,lr}
-
-+ cmp r2, #12 // ChaCha12 ?
-+
- mov r14, r0
- ldmia r14!, {r0-r11} // load x0-x11
- push {r10-r11} // store x10-x11 to stack
- ldm r14, {r10-r12,r14} // load x12-x15
- sub sp, #8
-
-+ beq 1f
- _chacha_permute 20
-
- // Skip over (unused0-unused1, x10-x11)
-- add sp, #16
-+0: add sp, #16
-
- // Fix up rotations of x12-x15
- ror X12, X12, #drot
-@@ -458,4 +454,7 @@ ENTRY(hchacha20_arm)
- stm r4, {X0,X1,X2,X3,X12,X13,X14,X15}
-
- pop {r4-r11,pc}
--ENDPROC(hchacha20_arm)
-+
-+1: _chacha_permute 12
-+ b 0b
-+ENDPROC(hchacha_block_arm)
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -1,5 +1,5 @@
- /*
-- * ARM NEON accelerated ChaCha and XChaCha stream ciphers,
-+ * ARM NEON and scalar accelerated ChaCha and XChaCha stream ciphers,
- * including ChaCha20 (RFC7539)
- *
- * Copyright (C) 2016 - 2017 Linaro, Ltd. <ard.biesheuvel@linaro.org>
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0009-crypto-arm-chacha-expose-ARM-ChaCha-routine-as-libra.patch b/target/linux/generic/backport-5.4/080-wireguard-0009-crypto-arm-chacha-expose-ARM-ChaCha-routine-as-libra.patch
deleted file mode 100644
index 4006dc63b2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0009-crypto-arm-chacha-expose-ARM-ChaCha-routine-as-libra.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:15 +0100
-Subject: [PATCH] crypto: arm/chacha - expose ARM ChaCha routine as library
- function
-
-commit a44a3430d71bad4ee56788a59fff099b291ea54c upstream.
-
-Expose the accelerated NEON ChaCha routine directly as a symbol
-export so that users of the ChaCha library API can use it directly.
-
-Given that calls into the library API will always go through the
-routines in this module if it is enabled, switch to static keys
-to select the optimal implementation available (which may be none
-at all, in which case we defer to the generic implementation for
-all invocations).
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/Kconfig | 1 +
- arch/arm/crypto/chacha-glue.c | 41 ++++++++++++++++++++++++++++++++++-
- 2 files changed, 41 insertions(+), 1 deletion(-)
-
---- a/arch/arm/crypto/Kconfig
-+++ b/arch/arm/crypto/Kconfig
-@@ -129,6 +129,7 @@ config CRYPTO_CRC32_ARM_CE
- config CRYPTO_CHACHA20_NEON
- tristate "NEON and scalar accelerated ChaCha stream cipher algorithms"
- select CRYPTO_BLKCIPHER
-+ select CRYPTO_ARCH_HAVE_LIB_CHACHA
-
- config CRYPTO_NHPOLY1305_NEON
- tristate "NEON accelerated NHPoly1305 hash function (for Adiantum)"
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -11,6 +11,7 @@
- #include <crypto/internal/chacha.h>
- #include <crypto/internal/simd.h>
- #include <crypto/internal/skcipher.h>
-+#include <linux/jump_label.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
-
-@@ -29,9 +30,11 @@ asmlinkage void hchacha_block_neon(const
- asmlinkage void chacha_doarm(u8 *dst, const u8 *src, unsigned int bytes,
- const u32 *state, int nrounds);
-
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(use_neon);
-+
- static inline bool neon_usable(void)
- {
-- return crypto_simd_usable();
-+ return static_branch_likely(&use_neon) && crypto_simd_usable();
- }
-
- static void chacha_doneon(u32 *state, u8 *dst, const u8 *src,
-@@ -60,6 +63,40 @@ static void chacha_doneon(u32 *state, u8
- }
- }
-
-+void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds)
-+{
-+ if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon_usable()) {
-+ hchacha_block_arm(state, stream, nrounds);
-+ } else {
-+ kernel_neon_begin();
-+ hchacha_block_neon(state, stream, nrounds);
-+ kernel_neon_end();
-+ }
-+}
-+EXPORT_SYMBOL(hchacha_block_arch);
-+
-+void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ chacha_init_generic(state, key, iv);
-+}
-+EXPORT_SYMBOL(chacha_init_arch);
-+
-+void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
-+ int nrounds)
-+{
-+ if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon_usable() ||
-+ bytes <= CHACHA_BLOCK_SIZE) {
-+ chacha_doarm(dst, src, bytes, state, nrounds);
-+ state[12] += DIV_ROUND_UP(bytes, CHACHA_BLOCK_SIZE);
-+ return;
-+ }
-+
-+ kernel_neon_begin();
-+ chacha_doneon(state, dst, src, bytes, nrounds);
-+ kernel_neon_end();
-+}
-+EXPORT_SYMBOL(chacha_crypt_arch);
-+
- static int chacha_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv,
- bool neon)
-@@ -269,6 +306,8 @@ static int __init chacha_simd_mod_init(v
- for (i = 0; i < ARRAY_SIZE(neon_algs); i++)
- neon_algs[i].base.cra_priority = 0;
- break;
-+ default:
-+ static_branch_enable(&use_neon);
- }
-
- err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0010-crypto-mips-chacha-import-32r2-ChaCha-code-from-Zinc.patch b/target/linux/generic/backport-5.4/080-wireguard-0010-crypto-mips-chacha-import-32r2-ChaCha-code-from-Zinc.patch
deleted file mode 100644
index 0a2b4c4523..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0010-crypto-mips-chacha-import-32r2-ChaCha-code-from-Zinc.patch
+++ /dev/null
@@ -1,451 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:16 +0100
-Subject: [PATCH] crypto: mips/chacha - import 32r2 ChaCha code from Zinc
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit 49aa7c00eddf8d8f462b0256bd82e81762d7b0c6 upstream.
-
-This imports the accelerated MIPS 32r2 ChaCha20 implementation from the
-Zinc patch set.
-
-Co-developed-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/crypto/chacha-core.S | 424 +++++++++++++++++++++++++++++++++
- 1 file changed, 424 insertions(+)
- create mode 100644 arch/mips/crypto/chacha-core.S
-
---- /dev/null
-+++ b/arch/mips/crypto/chacha-core.S
-@@ -0,0 +1,424 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+/*
-+ * Copyright (C) 2016-2018 René van Dorst <opensource@vdorst.com>. All Rights Reserved.
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#define MASK_U32 0x3c
-+#define CHACHA20_BLOCK_SIZE 64
-+#define STACK_SIZE 32
-+
-+#define X0 $t0
-+#define X1 $t1
-+#define X2 $t2
-+#define X3 $t3
-+#define X4 $t4
-+#define X5 $t5
-+#define X6 $t6
-+#define X7 $t7
-+#define X8 $t8
-+#define X9 $t9
-+#define X10 $v1
-+#define X11 $s6
-+#define X12 $s5
-+#define X13 $s4
-+#define X14 $s3
-+#define X15 $s2
-+/* Use regs which are overwritten on exit for Tx so we don't leak clear data. */
-+#define T0 $s1
-+#define T1 $s0
-+#define T(n) T ## n
-+#define X(n) X ## n
-+
-+/* Input arguments */
-+#define STATE $a0
-+#define OUT $a1
-+#define IN $a2
-+#define BYTES $a3
-+
-+/* Output argument */
-+/* NONCE[0] is kept in a register and not in memory.
-+ * We don't want to touch original value in memory.
-+ * Must be incremented every loop iteration.
-+ */
-+#define NONCE_0 $v0
-+
-+/* SAVED_X and SAVED_CA are set in the jump table.
-+ * Use regs which are overwritten on exit else we don't leak clear data.
-+ * They are used to handling the last bytes which are not multiple of 4.
-+ */
-+#define SAVED_X X15
-+#define SAVED_CA $s7
-+
-+#define IS_UNALIGNED $s7
-+
-+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-+#define MSB 0
-+#define LSB 3
-+#define ROTx rotl
-+#define ROTR(n) rotr n, 24
-+#define CPU_TO_LE32(n) \
-+ wsbh n; \
-+ rotr n, 16;
-+#else
-+#define MSB 3
-+#define LSB 0
-+#define ROTx rotr
-+#define CPU_TO_LE32(n)
-+#define ROTR(n)
-+#endif
-+
-+#define FOR_EACH_WORD(x) \
-+ x( 0); \
-+ x( 1); \
-+ x( 2); \
-+ x( 3); \
-+ x( 4); \
-+ x( 5); \
-+ x( 6); \
-+ x( 7); \
-+ x( 8); \
-+ x( 9); \
-+ x(10); \
-+ x(11); \
-+ x(12); \
-+ x(13); \
-+ x(14); \
-+ x(15);
-+
-+#define FOR_EACH_WORD_REV(x) \
-+ x(15); \
-+ x(14); \
-+ x(13); \
-+ x(12); \
-+ x(11); \
-+ x(10); \
-+ x( 9); \
-+ x( 8); \
-+ x( 7); \
-+ x( 6); \
-+ x( 5); \
-+ x( 4); \
-+ x( 3); \
-+ x( 2); \
-+ x( 1); \
-+ x( 0);
-+
-+#define PLUS_ONE_0 1
-+#define PLUS_ONE_1 2
-+#define PLUS_ONE_2 3
-+#define PLUS_ONE_3 4
-+#define PLUS_ONE_4 5
-+#define PLUS_ONE_5 6
-+#define PLUS_ONE_6 7
-+#define PLUS_ONE_7 8
-+#define PLUS_ONE_8 9
-+#define PLUS_ONE_9 10
-+#define PLUS_ONE_10 11
-+#define PLUS_ONE_11 12
-+#define PLUS_ONE_12 13
-+#define PLUS_ONE_13 14
-+#define PLUS_ONE_14 15
-+#define PLUS_ONE_15 16
-+#define PLUS_ONE(x) PLUS_ONE_ ## x
-+#define _CONCAT3(a,b,c) a ## b ## c
-+#define CONCAT3(a,b,c) _CONCAT3(a,b,c)
-+
-+#define STORE_UNALIGNED(x) \
-+CONCAT3(.Lchacha20_mips_xor_unaligned_, PLUS_ONE(x), _b: ;) \
-+ .if (x != 12); \
-+ lw T0, (x*4)(STATE); \
-+ .endif; \
-+ lwl T1, (x*4)+MSB ## (IN); \
-+ lwr T1, (x*4)+LSB ## (IN); \
-+ .if (x == 12); \
-+ addu X ## x, NONCE_0; \
-+ .else; \
-+ addu X ## x, T0; \
-+ .endif; \
-+ CPU_TO_LE32(X ## x); \
-+ xor X ## x, T1; \
-+ swl X ## x, (x*4)+MSB ## (OUT); \
-+ swr X ## x, (x*4)+LSB ## (OUT);
-+
-+#define STORE_ALIGNED(x) \
-+CONCAT3(.Lchacha20_mips_xor_aligned_, PLUS_ONE(x), _b: ;) \
-+ .if (x != 12); \
-+ lw T0, (x*4)(STATE); \
-+ .endif; \
-+ lw T1, (x*4) ## (IN); \
-+ .if (x == 12); \
-+ addu X ## x, NONCE_0; \
-+ .else; \
-+ addu X ## x, T0; \
-+ .endif; \
-+ CPU_TO_LE32(X ## x); \
-+ xor X ## x, T1; \
-+ sw X ## x, (x*4) ## (OUT);
-+
-+/* Jump table macro.
-+ * Used for setup and handling the last bytes, which are not multiple of 4.
-+ * X15 is free to store Xn
-+ * Every jumptable entry must be equal in size.
-+ */
-+#define JMPTBL_ALIGNED(x) \
-+.Lchacha20_mips_jmptbl_aligned_ ## x: ; \
-+ .set noreorder; \
-+ b .Lchacha20_mips_xor_aligned_ ## x ## _b; \
-+ .if (x == 12); \
-+ addu SAVED_X, X ## x, NONCE_0; \
-+ .else; \
-+ addu SAVED_X, X ## x, SAVED_CA; \
-+ .endif; \
-+ .set reorder
-+
-+#define JMPTBL_UNALIGNED(x) \
-+.Lchacha20_mips_jmptbl_unaligned_ ## x: ; \
-+ .set noreorder; \
-+ b .Lchacha20_mips_xor_unaligned_ ## x ## _b; \
-+ .if (x == 12); \
-+ addu SAVED_X, X ## x, NONCE_0; \
-+ .else; \
-+ addu SAVED_X, X ## x, SAVED_CA; \
-+ .endif; \
-+ .set reorder
-+
-+#define AXR(A, B, C, D, K, L, M, N, V, W, Y, Z, S) \
-+ addu X(A), X(K); \
-+ addu X(B), X(L); \
-+ addu X(C), X(M); \
-+ addu X(D), X(N); \
-+ xor X(V), X(A); \
-+ xor X(W), X(B); \
-+ xor X(Y), X(C); \
-+ xor X(Z), X(D); \
-+ rotl X(V), S; \
-+ rotl X(W), S; \
-+ rotl X(Y), S; \
-+ rotl X(Z), S;
-+
-+.text
-+.set reorder
-+.set noat
-+.globl chacha20_mips
-+.ent chacha20_mips
-+chacha20_mips:
-+ .frame $sp, STACK_SIZE, $ra
-+
-+ addiu $sp, -STACK_SIZE
-+
-+ /* Return bytes = 0. */
-+ beqz BYTES, .Lchacha20_mips_end
-+
-+ lw NONCE_0, 48(STATE)
-+
-+ /* Save s0-s7 */
-+ sw $s0, 0($sp)
-+ sw $s1, 4($sp)
-+ sw $s2, 8($sp)
-+ sw $s3, 12($sp)
-+ sw $s4, 16($sp)
-+ sw $s5, 20($sp)
-+ sw $s6, 24($sp)
-+ sw $s7, 28($sp)
-+
-+ /* Test IN or OUT is unaligned.
-+ * IS_UNALIGNED = ( IN | OUT ) & 0x00000003
-+ */
-+ or IS_UNALIGNED, IN, OUT
-+ andi IS_UNALIGNED, 0x3
-+
-+ /* Set number of rounds */
-+ li $at, 20
-+
-+ b .Lchacha20_rounds_start
-+
-+.align 4
-+.Loop_chacha20_rounds:
-+ addiu IN, CHACHA20_BLOCK_SIZE
-+ addiu OUT, CHACHA20_BLOCK_SIZE
-+ addiu NONCE_0, 1
-+
-+.Lchacha20_rounds_start:
-+ lw X0, 0(STATE)
-+ lw X1, 4(STATE)
-+ lw X2, 8(STATE)
-+ lw X3, 12(STATE)
-+
-+ lw X4, 16(STATE)
-+ lw X5, 20(STATE)
-+ lw X6, 24(STATE)
-+ lw X7, 28(STATE)
-+ lw X8, 32(STATE)
-+ lw X9, 36(STATE)
-+ lw X10, 40(STATE)
-+ lw X11, 44(STATE)
-+
-+ move X12, NONCE_0
-+ lw X13, 52(STATE)
-+ lw X14, 56(STATE)
-+ lw X15, 60(STATE)
-+
-+.Loop_chacha20_xor_rounds:
-+ addiu $at, -2
-+ AXR( 0, 1, 2, 3, 4, 5, 6, 7, 12,13,14,15, 16);
-+ AXR( 8, 9,10,11, 12,13,14,15, 4, 5, 6, 7, 12);
-+ AXR( 0, 1, 2, 3, 4, 5, 6, 7, 12,13,14,15, 8);
-+ AXR( 8, 9,10,11, 12,13,14,15, 4, 5, 6, 7, 7);
-+ AXR( 0, 1, 2, 3, 5, 6, 7, 4, 15,12,13,14, 16);
-+ AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 12);
-+ AXR( 0, 1, 2, 3, 5, 6, 7, 4, 15,12,13,14, 8);
-+ AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 7);
-+ bnez $at, .Loop_chacha20_xor_rounds
-+
-+ addiu BYTES, -(CHACHA20_BLOCK_SIZE)
-+
-+ /* Is data src/dst unaligned? Jump */
-+ bnez IS_UNALIGNED, .Loop_chacha20_unaligned
-+
-+ /* Set number rounds here to fill delayslot. */
-+ li $at, 20
-+
-+ /* BYTES < 0, it has no full block. */
-+ bltz BYTES, .Lchacha20_mips_no_full_block_aligned
-+
-+ FOR_EACH_WORD_REV(STORE_ALIGNED)
-+
-+ /* BYTES > 0? Loop again. */
-+ bgtz BYTES, .Loop_chacha20_rounds
-+
-+ /* Place this here to fill delay slot */
-+ addiu NONCE_0, 1
-+
-+ /* BYTES < 0? Handle last bytes */
-+ bltz BYTES, .Lchacha20_mips_xor_bytes
-+
-+.Lchacha20_mips_xor_done:
-+ /* Restore used registers */
-+ lw $s0, 0($sp)
-+ lw $s1, 4($sp)
-+ lw $s2, 8($sp)
-+ lw $s3, 12($sp)
-+ lw $s4, 16($sp)
-+ lw $s5, 20($sp)
-+ lw $s6, 24($sp)
-+ lw $s7, 28($sp)
-+
-+ /* Write NONCE_0 back to right location in state */
-+ sw NONCE_0, 48(STATE)
-+
-+.Lchacha20_mips_end:
-+ addiu $sp, STACK_SIZE
-+ jr $ra
-+
-+.Lchacha20_mips_no_full_block_aligned:
-+ /* Restore the offset on BYTES */
-+ addiu BYTES, CHACHA20_BLOCK_SIZE
-+
-+ /* Get number of full WORDS */
-+ andi $at, BYTES, MASK_U32
-+
-+ /* Load upper half of jump table addr */
-+ lui T0, %hi(.Lchacha20_mips_jmptbl_aligned_0)
-+
-+ /* Calculate lower half jump table offset */
-+ ins T0, $at, 1, 6
-+
-+ /* Add offset to STATE */
-+ addu T1, STATE, $at
-+
-+ /* Add lower half jump table addr */
-+ addiu T0, %lo(.Lchacha20_mips_jmptbl_aligned_0)
-+
-+ /* Read value from STATE */
-+ lw SAVED_CA, 0(T1)
-+
-+ /* Store remaining bytecounter as negative value */
-+ subu BYTES, $at, BYTES
-+
-+ jr T0
-+
-+ /* Jump table */
-+ FOR_EACH_WORD(JMPTBL_ALIGNED)
-+
-+
-+.Loop_chacha20_unaligned:
-+ /* Set number rounds here to fill delayslot. */
-+ li $at, 20
-+
-+ /* BYTES > 0, it has no full block. */
-+ bltz BYTES, .Lchacha20_mips_no_full_block_unaligned
-+
-+ FOR_EACH_WORD_REV(STORE_UNALIGNED)
-+
-+ /* BYTES > 0? Loop again. */
-+ bgtz BYTES, .Loop_chacha20_rounds
-+
-+ /* Write NONCE_0 back to right location in state */
-+ sw NONCE_0, 48(STATE)
-+
-+ .set noreorder
-+ /* Fall through to byte handling */
-+ bgez BYTES, .Lchacha20_mips_xor_done
-+.Lchacha20_mips_xor_unaligned_0_b:
-+.Lchacha20_mips_xor_aligned_0_b:
-+ /* Place this here to fill delay slot */
-+ addiu NONCE_0, 1
-+ .set reorder
-+
-+.Lchacha20_mips_xor_bytes:
-+ addu IN, $at
-+ addu OUT, $at
-+ /* First byte */
-+ lbu T1, 0(IN)
-+ addiu $at, BYTES, 1
-+ CPU_TO_LE32(SAVED_X)
-+ ROTR(SAVED_X)
-+ xor T1, SAVED_X
-+ sb T1, 0(OUT)
-+ beqz $at, .Lchacha20_mips_xor_done
-+ /* Second byte */
-+ lbu T1, 1(IN)
-+ addiu $at, BYTES, 2
-+ ROTx SAVED_X, 8
-+ xor T1, SAVED_X
-+ sb T1, 1(OUT)
-+ beqz $at, .Lchacha20_mips_xor_done
-+ /* Third byte */
-+ lbu T1, 2(IN)
-+ ROTx SAVED_X, 8
-+ xor T1, SAVED_X
-+ sb T1, 2(OUT)
-+ b .Lchacha20_mips_xor_done
-+
-+.Lchacha20_mips_no_full_block_unaligned:
-+ /* Restore the offset on BYTES */
-+ addiu BYTES, CHACHA20_BLOCK_SIZE
-+
-+ /* Get number of full WORDS */
-+ andi $at, BYTES, MASK_U32
-+
-+ /* Load upper half of jump table addr */
-+ lui T0, %hi(.Lchacha20_mips_jmptbl_unaligned_0)
-+
-+ /* Calculate lower half jump table offset */
-+ ins T0, $at, 1, 6
-+
-+ /* Add offset to STATE */
-+ addu T1, STATE, $at
-+
-+ /* Add lower half jump table addr */
-+ addiu T0, %lo(.Lchacha20_mips_jmptbl_unaligned_0)
-+
-+ /* Read value from STATE */
-+ lw SAVED_CA, 0(T1)
-+
-+ /* Store remaining bytecounter as negative value */
-+ subu BYTES, $at, BYTES
-+
-+ jr T0
-+
-+ /* Jump table */
-+ FOR_EACH_WORD(JMPTBL_UNALIGNED)
-+.end chacha20_mips
-+.set at
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0011-crypto-mips-chacha-wire-up-accelerated-32r2-code-fro.patch b/target/linux/generic/backport-5.4/080-wireguard-0011-crypto-mips-chacha-wire-up-accelerated-32r2-code-fro.patch
deleted file mode 100644
index 0d24ce29e5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0011-crypto-mips-chacha-wire-up-accelerated-32r2-code-fro.patch
+++ /dev/null
@@ -1,559 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:17 +0100
-Subject: [PATCH] crypto: mips/chacha - wire up accelerated 32r2 code from Zinc
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit 3a2f58f3ba4f6f44e33d1a48240d5eadb882cb59 upstream.
-
-This integrates the accelerated MIPS 32r2 implementation of ChaCha
-into both the API and library interfaces of the kernel crypto stack.
-
-The significance of this is that, in addition to becoming available
-as an accelerated library implementation, it can also be used by
-existing crypto API code such as Adiantum (for block encryption on
-ultra low performance cores) or IPsec using chacha20poly1305. These
-are use cases that have already opted into using the abstract crypto
-API. In order to support Adiantum, the core assembler routine has
-been adapted to take the round count as a function argument rather
-than hardcoding it to 20.
-
-Co-developed-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/Makefile | 2 +-
- arch/mips/crypto/Makefile | 4 +
- arch/mips/crypto/chacha-core.S | 159 ++++++++++++++++++++++++---------
- arch/mips/crypto/chacha-glue.c | 150 +++++++++++++++++++++++++++++++
- crypto/Kconfig | 6 ++
- 5 files changed, 277 insertions(+), 44 deletions(-)
- create mode 100644 arch/mips/crypto/chacha-glue.c
-
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -334,7 +334,7 @@ libs-$(CONFIG_MIPS_FP_SUPPORT) += arch/m
- # See arch/mips/Kbuild for content of core part of the kernel
- core-y += arch/mips/
-
--drivers-$(CONFIG_MIPS_CRC_SUPPORT) += arch/mips/crypto/
-+drivers-y += arch/mips/crypto/
- drivers-$(CONFIG_OPROFILE) += arch/mips/oprofile/
-
- # suspend and hibernation support
---- a/arch/mips/crypto/Makefile
-+++ b/arch/mips/crypto/Makefile
-@@ -4,3 +4,7 @@
- #
-
- obj-$(CONFIG_CRYPTO_CRC32_MIPS) += crc32-mips.o
-+
-+obj-$(CONFIG_CRYPTO_CHACHA_MIPS) += chacha-mips.o
-+chacha-mips-y := chacha-core.o chacha-glue.o
-+AFLAGS_chacha-core.o += -O2 # needed to fill branch delay slots
---- a/arch/mips/crypto/chacha-core.S
-+++ b/arch/mips/crypto/chacha-core.S
-@@ -125,7 +125,7 @@
- #define CONCAT3(a,b,c) _CONCAT3(a,b,c)
-
- #define STORE_UNALIGNED(x) \
--CONCAT3(.Lchacha20_mips_xor_unaligned_, PLUS_ONE(x), _b: ;) \
-+CONCAT3(.Lchacha_mips_xor_unaligned_, PLUS_ONE(x), _b: ;) \
- .if (x != 12); \
- lw T0, (x*4)(STATE); \
- .endif; \
-@@ -142,7 +142,7 @@ CONCAT3(.Lchacha20_mips_xor_unaligned_,
- swr X ## x, (x*4)+LSB ## (OUT);
-
- #define STORE_ALIGNED(x) \
--CONCAT3(.Lchacha20_mips_xor_aligned_, PLUS_ONE(x), _b: ;) \
-+CONCAT3(.Lchacha_mips_xor_aligned_, PLUS_ONE(x), _b: ;) \
- .if (x != 12); \
- lw T0, (x*4)(STATE); \
- .endif; \
-@@ -162,9 +162,9 @@ CONCAT3(.Lchacha20_mips_xor_aligned_, PL
- * Every jumptable entry must be equal in size.
- */
- #define JMPTBL_ALIGNED(x) \
--.Lchacha20_mips_jmptbl_aligned_ ## x: ; \
-+.Lchacha_mips_jmptbl_aligned_ ## x: ; \
- .set noreorder; \
-- b .Lchacha20_mips_xor_aligned_ ## x ## _b; \
-+ b .Lchacha_mips_xor_aligned_ ## x ## _b; \
- .if (x == 12); \
- addu SAVED_X, X ## x, NONCE_0; \
- .else; \
-@@ -173,9 +173,9 @@ CONCAT3(.Lchacha20_mips_xor_aligned_, PL
- .set reorder
-
- #define JMPTBL_UNALIGNED(x) \
--.Lchacha20_mips_jmptbl_unaligned_ ## x: ; \
-+.Lchacha_mips_jmptbl_unaligned_ ## x: ; \
- .set noreorder; \
-- b .Lchacha20_mips_xor_unaligned_ ## x ## _b; \
-+ b .Lchacha_mips_xor_unaligned_ ## x ## _b; \
- .if (x == 12); \
- addu SAVED_X, X ## x, NONCE_0; \
- .else; \
-@@ -200,15 +200,18 @@ CONCAT3(.Lchacha20_mips_xor_aligned_, PL
- .text
- .set reorder
- .set noat
--.globl chacha20_mips
--.ent chacha20_mips
--chacha20_mips:
-+.globl chacha_crypt_arch
-+.ent chacha_crypt_arch
-+chacha_crypt_arch:
- .frame $sp, STACK_SIZE, $ra
-
-+ /* Load number of rounds */
-+ lw $at, 16($sp)
-+
- addiu $sp, -STACK_SIZE
-
- /* Return bytes = 0. */
-- beqz BYTES, .Lchacha20_mips_end
-+ beqz BYTES, .Lchacha_mips_end
-
- lw NONCE_0, 48(STATE)
-
-@@ -228,18 +231,15 @@ chacha20_mips:
- or IS_UNALIGNED, IN, OUT
- andi IS_UNALIGNED, 0x3
-
-- /* Set number of rounds */
-- li $at, 20
--
-- b .Lchacha20_rounds_start
-+ b .Lchacha_rounds_start
-
- .align 4
--.Loop_chacha20_rounds:
-+.Loop_chacha_rounds:
- addiu IN, CHACHA20_BLOCK_SIZE
- addiu OUT, CHACHA20_BLOCK_SIZE
- addiu NONCE_0, 1
-
--.Lchacha20_rounds_start:
-+.Lchacha_rounds_start:
- lw X0, 0(STATE)
- lw X1, 4(STATE)
- lw X2, 8(STATE)
-@@ -259,7 +259,7 @@ chacha20_mips:
- lw X14, 56(STATE)
- lw X15, 60(STATE)
-
--.Loop_chacha20_xor_rounds:
-+.Loop_chacha_xor_rounds:
- addiu $at, -2
- AXR( 0, 1, 2, 3, 4, 5, 6, 7, 12,13,14,15, 16);
- AXR( 8, 9,10,11, 12,13,14,15, 4, 5, 6, 7, 12);
-@@ -269,31 +269,31 @@ chacha20_mips:
- AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 12);
- AXR( 0, 1, 2, 3, 5, 6, 7, 4, 15,12,13,14, 8);
- AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 7);
-- bnez $at, .Loop_chacha20_xor_rounds
-+ bnez $at, .Loop_chacha_xor_rounds
-
- addiu BYTES, -(CHACHA20_BLOCK_SIZE)
-
- /* Is data src/dst unaligned? Jump */
-- bnez IS_UNALIGNED, .Loop_chacha20_unaligned
-+ bnez IS_UNALIGNED, .Loop_chacha_unaligned
-
- /* Set number rounds here to fill delayslot. */
-- li $at, 20
-+ lw $at, (STACK_SIZE+16)($sp)
-
- /* BYTES < 0, it has no full block. */
-- bltz BYTES, .Lchacha20_mips_no_full_block_aligned
-+ bltz BYTES, .Lchacha_mips_no_full_block_aligned
-
- FOR_EACH_WORD_REV(STORE_ALIGNED)
-
- /* BYTES > 0? Loop again. */
-- bgtz BYTES, .Loop_chacha20_rounds
-+ bgtz BYTES, .Loop_chacha_rounds
-
- /* Place this here to fill delay slot */
- addiu NONCE_0, 1
-
- /* BYTES < 0? Handle last bytes */
-- bltz BYTES, .Lchacha20_mips_xor_bytes
-+ bltz BYTES, .Lchacha_mips_xor_bytes
-
--.Lchacha20_mips_xor_done:
-+.Lchacha_mips_xor_done:
- /* Restore used registers */
- lw $s0, 0($sp)
- lw $s1, 4($sp)
-@@ -307,11 +307,11 @@ chacha20_mips:
- /* Write NONCE_0 back to right location in state */
- sw NONCE_0, 48(STATE)
-
--.Lchacha20_mips_end:
-+.Lchacha_mips_end:
- addiu $sp, STACK_SIZE
- jr $ra
-
--.Lchacha20_mips_no_full_block_aligned:
-+.Lchacha_mips_no_full_block_aligned:
- /* Restore the offset on BYTES */
- addiu BYTES, CHACHA20_BLOCK_SIZE
-
-@@ -319,7 +319,7 @@ chacha20_mips:
- andi $at, BYTES, MASK_U32
-
- /* Load upper half of jump table addr */
-- lui T0, %hi(.Lchacha20_mips_jmptbl_aligned_0)
-+ lui T0, %hi(.Lchacha_mips_jmptbl_aligned_0)
-
- /* Calculate lower half jump table offset */
- ins T0, $at, 1, 6
-@@ -328,7 +328,7 @@ chacha20_mips:
- addu T1, STATE, $at
-
- /* Add lower half jump table addr */
-- addiu T0, %lo(.Lchacha20_mips_jmptbl_aligned_0)
-+ addiu T0, %lo(.Lchacha_mips_jmptbl_aligned_0)
-
- /* Read value from STATE */
- lw SAVED_CA, 0(T1)
-@@ -342,31 +342,31 @@ chacha20_mips:
- FOR_EACH_WORD(JMPTBL_ALIGNED)
-
-
--.Loop_chacha20_unaligned:
-+.Loop_chacha_unaligned:
- /* Set number rounds here to fill delayslot. */
-- li $at, 20
-+ lw $at, (STACK_SIZE+16)($sp)
-
- /* BYTES > 0, it has no full block. */
-- bltz BYTES, .Lchacha20_mips_no_full_block_unaligned
-+ bltz BYTES, .Lchacha_mips_no_full_block_unaligned
-
- FOR_EACH_WORD_REV(STORE_UNALIGNED)
-
- /* BYTES > 0? Loop again. */
-- bgtz BYTES, .Loop_chacha20_rounds
-+ bgtz BYTES, .Loop_chacha_rounds
-
- /* Write NONCE_0 back to right location in state */
- sw NONCE_0, 48(STATE)
-
- .set noreorder
- /* Fall through to byte handling */
-- bgez BYTES, .Lchacha20_mips_xor_done
--.Lchacha20_mips_xor_unaligned_0_b:
--.Lchacha20_mips_xor_aligned_0_b:
-+ bgez BYTES, .Lchacha_mips_xor_done
-+.Lchacha_mips_xor_unaligned_0_b:
-+.Lchacha_mips_xor_aligned_0_b:
- /* Place this here to fill delay slot */
- addiu NONCE_0, 1
- .set reorder
-
--.Lchacha20_mips_xor_bytes:
-+.Lchacha_mips_xor_bytes:
- addu IN, $at
- addu OUT, $at
- /* First byte */
-@@ -376,22 +376,22 @@ chacha20_mips:
- ROTR(SAVED_X)
- xor T1, SAVED_X
- sb T1, 0(OUT)
-- beqz $at, .Lchacha20_mips_xor_done
-+ beqz $at, .Lchacha_mips_xor_done
- /* Second byte */
- lbu T1, 1(IN)
- addiu $at, BYTES, 2
- ROTx SAVED_X, 8
- xor T1, SAVED_X
- sb T1, 1(OUT)
-- beqz $at, .Lchacha20_mips_xor_done
-+ beqz $at, .Lchacha_mips_xor_done
- /* Third byte */
- lbu T1, 2(IN)
- ROTx SAVED_X, 8
- xor T1, SAVED_X
- sb T1, 2(OUT)
-- b .Lchacha20_mips_xor_done
-+ b .Lchacha_mips_xor_done
-
--.Lchacha20_mips_no_full_block_unaligned:
-+.Lchacha_mips_no_full_block_unaligned:
- /* Restore the offset on BYTES */
- addiu BYTES, CHACHA20_BLOCK_SIZE
-
-@@ -399,7 +399,7 @@ chacha20_mips:
- andi $at, BYTES, MASK_U32
-
- /* Load upper half of jump table addr */
-- lui T0, %hi(.Lchacha20_mips_jmptbl_unaligned_0)
-+ lui T0, %hi(.Lchacha_mips_jmptbl_unaligned_0)
-
- /* Calculate lower half jump table offset */
- ins T0, $at, 1, 6
-@@ -408,7 +408,7 @@ chacha20_mips:
- addu T1, STATE, $at
-
- /* Add lower half jump table addr */
-- addiu T0, %lo(.Lchacha20_mips_jmptbl_unaligned_0)
-+ addiu T0, %lo(.Lchacha_mips_jmptbl_unaligned_0)
-
- /* Read value from STATE */
- lw SAVED_CA, 0(T1)
-@@ -420,5 +420,78 @@ chacha20_mips:
-
- /* Jump table */
- FOR_EACH_WORD(JMPTBL_UNALIGNED)
--.end chacha20_mips
-+.end chacha_crypt_arch
-+.set at
-+
-+/* Input arguments
-+ * STATE $a0
-+ * OUT $a1
-+ * NROUND $a2
-+ */
-+
-+#undef X12
-+#undef X13
-+#undef X14
-+#undef X15
-+
-+#define X12 $a3
-+#define X13 $at
-+#define X14 $v0
-+#define X15 STATE
-+
-+.set noat
-+.globl hchacha_block_arch
-+.ent hchacha_block_arch
-+hchacha_block_arch:
-+ .frame $sp, STACK_SIZE, $ra
-+
-+ addiu $sp, -STACK_SIZE
-+
-+ /* Save X11(s6) */
-+ sw X11, 0($sp)
-+
-+ lw X0, 0(STATE)
-+ lw X1, 4(STATE)
-+ lw X2, 8(STATE)
-+ lw X3, 12(STATE)
-+ lw X4, 16(STATE)
-+ lw X5, 20(STATE)
-+ lw X6, 24(STATE)
-+ lw X7, 28(STATE)
-+ lw X8, 32(STATE)
-+ lw X9, 36(STATE)
-+ lw X10, 40(STATE)
-+ lw X11, 44(STATE)
-+ lw X12, 48(STATE)
-+ lw X13, 52(STATE)
-+ lw X14, 56(STATE)
-+ lw X15, 60(STATE)
-+
-+.Loop_hchacha_xor_rounds:
-+ addiu $a2, -2
-+ AXR( 0, 1, 2, 3, 4, 5, 6, 7, 12,13,14,15, 16);
-+ AXR( 8, 9,10,11, 12,13,14,15, 4, 5, 6, 7, 12);
-+ AXR( 0, 1, 2, 3, 4, 5, 6, 7, 12,13,14,15, 8);
-+ AXR( 8, 9,10,11, 12,13,14,15, 4, 5, 6, 7, 7);
-+ AXR( 0, 1, 2, 3, 5, 6, 7, 4, 15,12,13,14, 16);
-+ AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 12);
-+ AXR( 0, 1, 2, 3, 5, 6, 7, 4, 15,12,13,14, 8);
-+ AXR(10,11, 8, 9, 15,12,13,14, 5, 6, 7, 4, 7);
-+ bnez $a2, .Loop_hchacha_xor_rounds
-+
-+ /* Restore used register */
-+ lw X11, 0($sp)
-+
-+ sw X0, 0(OUT)
-+ sw X1, 4(OUT)
-+ sw X2, 8(OUT)
-+ sw X3, 12(OUT)
-+ sw X12, 16(OUT)
-+ sw X13, 20(OUT)
-+ sw X14, 24(OUT)
-+ sw X15, 28(OUT)
-+
-+ addiu $sp, STACK_SIZE
-+ jr $ra
-+.end hchacha_block_arch
- .set at
---- /dev/null
-+++ b/arch/mips/crypto/chacha-glue.c
-@@ -0,0 +1,150 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * MIPS accelerated ChaCha and XChaCha stream ciphers,
-+ * including ChaCha20 (RFC7539)
-+ *
-+ * Copyright (C) 2019 Linaro, Ltd. <ard.biesheuvel@linaro.org>
-+ */
-+
-+#include <asm/byteorder.h>
-+#include <crypto/algapi.h>
-+#include <crypto/internal/chacha.h>
-+#include <crypto/internal/skcipher.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+asmlinkage void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src,
-+ unsigned int bytes, int nrounds);
-+EXPORT_SYMBOL(chacha_crypt_arch);
-+
-+asmlinkage void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds);
-+EXPORT_SYMBOL(hchacha_block_arch);
-+
-+void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
-+{
-+ chacha_init_generic(state, key, iv);
-+}
-+EXPORT_SYMBOL(chacha_init_arch);
-+
-+static int chacha_mips_stream_xor(struct skcipher_request *req,
-+ const struct chacha_ctx *ctx, const u8 *iv)
-+{
-+ struct skcipher_walk walk;
-+ u32 state[16];
-+ int err;
-+
-+ err = skcipher_walk_virt(&walk, req, false);
-+
-+ chacha_init_generic(state, ctx->key, iv);
-+
-+ while (walk.nbytes > 0) {
-+ unsigned int nbytes = walk.nbytes;
-+
-+ if (nbytes < walk.total)
-+ nbytes = round_down(nbytes, walk.stride);
-+
-+ chacha_crypt(state, walk.dst.virt.addr, walk.src.virt.addr,
-+ nbytes, ctx->nrounds);
-+ err = skcipher_walk_done(&walk, walk.nbytes - nbytes);
-+ }
-+
-+ return err;
-+}
-+
-+static int chacha_mips(struct skcipher_request *req)
-+{
-+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-+ struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-+
-+ return chacha_mips_stream_xor(req, ctx, req->iv);
-+}
-+
-+static int xchacha_mips(struct skcipher_request *req)
-+{
-+ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-+ struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-+ struct chacha_ctx subctx;
-+ u32 state[16];
-+ u8 real_iv[16];
-+
-+ chacha_init_generic(state, ctx->key, req->iv);
-+
-+ hchacha_block(state, subctx.key, ctx->nrounds);
-+ subctx.nrounds = ctx->nrounds;
-+
-+ memcpy(&real_iv[0], req->iv + 24, 8);
-+ memcpy(&real_iv[8], req->iv + 16, 8);
-+ return chacha_mips_stream_xor(req, &subctx, real_iv);
-+}
-+
-+static struct skcipher_alg algs[] = {
-+ {
-+ .base.cra_name = "chacha20",
-+ .base.cra_driver_name = "chacha20-mips",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = CHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = chacha_mips,
-+ .decrypt = chacha_mips,
-+ }, {
-+ .base.cra_name = "xchacha20",
-+ .base.cra_driver_name = "xchacha20-mips",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha20_setkey,
-+ .encrypt = xchacha_mips,
-+ .decrypt = xchacha_mips,
-+ }, {
-+ .base.cra_name = "xchacha12",
-+ .base.cra_driver_name = "xchacha12-mips",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = 1,
-+ .base.cra_ctxsize = sizeof(struct chacha_ctx),
-+ .base.cra_module = THIS_MODULE,
-+
-+ .min_keysize = CHACHA_KEY_SIZE,
-+ .max_keysize = CHACHA_KEY_SIZE,
-+ .ivsize = XCHACHA_IV_SIZE,
-+ .chunksize = CHACHA_BLOCK_SIZE,
-+ .setkey = chacha12_setkey,
-+ .encrypt = xchacha_mips,
-+ .decrypt = xchacha_mips,
-+ }
-+};
-+
-+static int __init chacha_simd_mod_init(void)
-+{
-+ return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-+}
-+
-+static void __exit chacha_simd_mod_fini(void)
-+{
-+ crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-+}
-+
-+module_init(chacha_simd_mod_init);
-+module_exit(chacha_simd_mod_fini);
-+
-+MODULE_DESCRIPTION("ChaCha and XChaCha stream ciphers (MIPS accelerated)");
-+MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CRYPTO("chacha20");
-+MODULE_ALIAS_CRYPTO("chacha20-mips");
-+MODULE_ALIAS_CRYPTO("xchacha20");
-+MODULE_ALIAS_CRYPTO("xchacha20-mips");
-+MODULE_ALIAS_CRYPTO("xchacha12");
-+MODULE_ALIAS_CRYPTO("xchacha12-mips");
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -1423,6 +1423,12 @@ config CRYPTO_CHACHA20_X86_64
- SSSE3, AVX2, and AVX-512VL optimized implementations of the ChaCha20,
- XChaCha20, and XChaCha12 stream ciphers.
-
-+config CRYPTO_CHACHA_MIPS
-+ tristate "ChaCha stream cipher algorithms (MIPS 32r2 optimized)"
-+ depends on CPU_MIPS32_R2
-+ select CRYPTO_BLKCIPHER
-+ select CRYPTO_ARCH_HAVE_LIB_CHACHA
-+
- config CRYPTO_SEED
- tristate "SEED cipher algorithm"
- select CRYPTO_ALGAPI
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0012-crypto-chacha-unexport-chacha_generic-routines.patch b/target/linux/generic/backport-5.4/080-wireguard-0012-crypto-chacha-unexport-chacha_generic-routines.patch
deleted file mode 100644
index d06f47a100..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0012-crypto-chacha-unexport-chacha_generic-routines.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:18 +0100
-Subject: [PATCH] crypto: chacha - unexport chacha_generic routines
-
-commit 22cf705360707ced15f9fe5423938f313c7df536 upstream.
-
-Now that all users of generic ChaCha code have moved to the core library,
-there is no longer a need for the generic ChaCha skcpiher driver to
-export parts of it implementation for reuse by other drivers. So drop
-the exports, and make the symbols static.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/chacha_generic.c | 26 ++++++++------------------
- include/crypto/internal/chacha.h | 10 ----------
- 2 files changed, 8 insertions(+), 28 deletions(-)
-
---- a/crypto/chacha_generic.c
-+++ b/crypto/chacha_generic.c
-@@ -21,7 +21,7 @@ static int chacha_stream_xor(struct skci
-
- err = skcipher_walk_virt(&walk, req, false);
-
-- crypto_chacha_init(state, ctx, iv);
-+ chacha_init_generic(state, ctx->key, iv);
-
- while (walk.nbytes > 0) {
- unsigned int nbytes = walk.nbytes;
-@@ -37,36 +37,27 @@ static int chacha_stream_xor(struct skci
- return err;
- }
-
--void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv)
--{
-- chacha_init_generic(state, ctx->key, iv);
--}
--EXPORT_SYMBOL_GPL(crypto_chacha_init);
--
--int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize)
-+static int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize)
- {
- return chacha_setkey(tfm, key, keysize, 20);
- }
--EXPORT_SYMBOL_GPL(crypto_chacha20_setkey);
-
--int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize)
-+static int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+ unsigned int keysize)
- {
- return chacha_setkey(tfm, key, keysize, 12);
- }
--EXPORT_SYMBOL_GPL(crypto_chacha12_setkey);
-
--int crypto_chacha_crypt(struct skcipher_request *req)
-+static int crypto_chacha_crypt(struct skcipher_request *req)
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-
- return chacha_stream_xor(req, ctx, req->iv);
- }
--EXPORT_SYMBOL_GPL(crypto_chacha_crypt);
-
--int crypto_xchacha_crypt(struct skcipher_request *req)
-+static int crypto_xchacha_crypt(struct skcipher_request *req)
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-@@ -75,7 +66,7 @@ int crypto_xchacha_crypt(struct skcipher
- u8 real_iv[16];
-
- /* Compute the subkey given the original key and first 128 nonce bits */
-- crypto_chacha_init(state, ctx, req->iv);
-+ chacha_init_generic(state, ctx->key, req->iv);
- hchacha_block_generic(state, subctx.key, ctx->nrounds);
- subctx.nrounds = ctx->nrounds;
-
-@@ -86,7 +77,6 @@ int crypto_xchacha_crypt(struct skcipher
- /* Generate the stream and XOR it with the data */
- return chacha_stream_xor(req, &subctx, real_iv);
- }
--EXPORT_SYMBOL_GPL(crypto_xchacha_crypt);
-
- static struct skcipher_alg algs[] = {
- {
---- a/include/crypto/internal/chacha.h
-+++ b/include/crypto/internal/chacha.h
-@@ -12,8 +12,6 @@ struct chacha_ctx {
- int nrounds;
- };
-
--void crypto_chacha_init(u32 *state, const struct chacha_ctx *ctx, const u8 *iv);
--
- static inline int chacha_setkey(struct crypto_skcipher *tfm, const u8 *key,
- unsigned int keysize, int nrounds)
- {
-@@ -42,12 +40,4 @@ static int inline chacha12_setkey(struct
- return chacha_setkey(tfm, key, keysize, 12);
- }
-
--int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize);
--int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize);
--
--int crypto_chacha_crypt(struct skcipher_request *req);
--int crypto_xchacha_crypt(struct skcipher_request *req);
--
- #endif /* _CRYPTO_CHACHA_H */
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0013-crypto-poly1305-move-core-routines-into-a-separate-l.patch b/target/linux/generic/backport-5.4/080-wireguard-0013-crypto-poly1305-move-core-routines-into-a-separate-l.patch
deleted file mode 100644
index 960300d2a5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0013-crypto-poly1305-move-core-routines-into-a-separate-l.patch
+++ /dev/null
@@ -1,649 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:19 +0100
-Subject: [PATCH] crypto: poly1305 - move core routines into a separate library
-
-commit 48ea8c6ebc96bc0990e12ee1c43d0832c23576bb upstream.
-
-Move the core Poly1305 routines shared between the generic Poly1305
-shash driver and the Adiantum and NHPoly1305 drivers into a separate
-library so that using just this pieces does not pull in the crypto
-API pieces of the generic Poly1305 routine.
-
-In a subsequent patch, we will augment this generic library with
-init/update/final routines so that Poyl1305 algorithm can be used
-directly without the need for using the crypto API's shash abstraction.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 2 +-
- crypto/Kconfig | 5 +-
- crypto/adiantum.c | 5 +-
- crypto/nhpoly1305.c | 3 +-
- crypto/poly1305_generic.c | 195 ++---------------------------
- include/crypto/internal/poly1305.h | 67 ++++++++++
- include/crypto/poly1305.h | 23 ----
- lib/crypto/Kconfig | 3 +
- lib/crypto/Makefile | 3 +
- lib/crypto/poly1305.c | 158 +++++++++++++++++++++++
- 10 files changed, 248 insertions(+), 216 deletions(-)
- create mode 100644 include/crypto/internal/poly1305.h
- create mode 100644 lib/crypto/poly1305.c
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -7,8 +7,8 @@
-
- #include <crypto/algapi.h>
- #include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
- #include <crypto/internal/simd.h>
--#include <crypto/poly1305.h>
- #include <linux/crypto.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -446,7 +446,7 @@ config CRYPTO_KEYWRAP
- config CRYPTO_NHPOLY1305
- tristate
- select CRYPTO_HASH
-- select CRYPTO_POLY1305
-+ select CRYPTO_LIB_POLY1305_GENERIC
-
- config CRYPTO_NHPOLY1305_SSE2
- tristate "NHPoly1305 hash function (x86_64 SSE2 implementation)"
-@@ -467,7 +467,7 @@ config CRYPTO_NHPOLY1305_AVX2
- config CRYPTO_ADIANTUM
- tristate "Adiantum support"
- select CRYPTO_CHACHA20
-- select CRYPTO_POLY1305
-+ select CRYPTO_LIB_POLY1305_GENERIC
- select CRYPTO_NHPOLY1305
- select CRYPTO_MANAGER
- help
-@@ -686,6 +686,7 @@ config CRYPTO_GHASH
- config CRYPTO_POLY1305
- tristate "Poly1305 authenticator algorithm"
- select CRYPTO_HASH
-+ select CRYPTO_LIB_POLY1305_GENERIC
- help
- Poly1305 authenticator algorithm, RFC7539.
-
---- a/crypto/adiantum.c
-+++ b/crypto/adiantum.c
-@@ -33,6 +33,7 @@
- #include <crypto/b128ops.h>
- #include <crypto/chacha.h>
- #include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
- #include <crypto/internal/skcipher.h>
- #include <crypto/nhpoly1305.h>
- #include <crypto/scatterwalk.h>
-@@ -242,11 +243,11 @@ static void adiantum_hash_header(struct
-
- BUILD_BUG_ON(sizeof(header) % POLY1305_BLOCK_SIZE != 0);
- poly1305_core_blocks(&state, &tctx->header_hash_key,
-- &header, sizeof(header) / POLY1305_BLOCK_SIZE);
-+ &header, sizeof(header) / POLY1305_BLOCK_SIZE, 1);
-
- BUILD_BUG_ON(TWEAK_SIZE % POLY1305_BLOCK_SIZE != 0);
- poly1305_core_blocks(&state, &tctx->header_hash_key, req->iv,
-- TWEAK_SIZE / POLY1305_BLOCK_SIZE);
-+ TWEAK_SIZE / POLY1305_BLOCK_SIZE, 1);
-
- poly1305_core_emit(&state, &rctx->header_hash);
- }
---- a/crypto/nhpoly1305.c
-+++ b/crypto/nhpoly1305.c
-@@ -33,6 +33,7 @@
- #include <asm/unaligned.h>
- #include <crypto/algapi.h>
- #include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
- #include <crypto/nhpoly1305.h>
- #include <linux/crypto.h>
- #include <linux/kernel.h>
-@@ -78,7 +79,7 @@ static void process_nh_hash_value(struct
- BUILD_BUG_ON(NH_HASH_BYTES % POLY1305_BLOCK_SIZE != 0);
-
- poly1305_core_blocks(&state->poly_state, &key->poly_key, state->nh_hash,
-- NH_HASH_BYTES / POLY1305_BLOCK_SIZE);
-+ NH_HASH_BYTES / POLY1305_BLOCK_SIZE, 1);
- }
-
- /*
---- a/crypto/poly1305_generic.c
-+++ b/crypto/poly1305_generic.c
-@@ -13,27 +13,12 @@
-
- #include <crypto/algapi.h>
- #include <crypto/internal/hash.h>
--#include <crypto/poly1305.h>
-+#include <crypto/internal/poly1305.h>
- #include <linux/crypto.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <asm/unaligned.h>
-
--static inline u64 mlt(u64 a, u64 b)
--{
-- return a * b;
--}
--
--static inline u32 sr(u64 v, u_char n)
--{
-- return v >> n;
--}
--
--static inline u32 and(u32 v, u32 mask)
--{
-- return v & mask;
--}
--
- int crypto_poly1305_init(struct shash_desc *desc)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-@@ -47,124 +32,8 @@ int crypto_poly1305_init(struct shash_de
- }
- EXPORT_SYMBOL_GPL(crypto_poly1305_init);
-
--void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key)
--{
-- /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-- key->r[0] = (get_unaligned_le32(raw_key + 0) >> 0) & 0x3ffffff;
-- key->r[1] = (get_unaligned_le32(raw_key + 3) >> 2) & 0x3ffff03;
-- key->r[2] = (get_unaligned_le32(raw_key + 6) >> 4) & 0x3ffc0ff;
-- key->r[3] = (get_unaligned_le32(raw_key + 9) >> 6) & 0x3f03fff;
-- key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
--}
--EXPORT_SYMBOL_GPL(poly1305_core_setkey);
--
--/*
-- * Poly1305 requires a unique key for each tag, which implies that we can't set
-- * it on the tfm that gets accessed by multiple users simultaneously. Instead we
-- * expect the key as the first 32 bytes in the update() call.
-- */
--unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen)
--{
-- if (!dctx->sset) {
-- if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_core_setkey(&dctx->r, src);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->rset = true;
-- }
-- if (srclen >= POLY1305_BLOCK_SIZE) {
-- dctx->s[0] = get_unaligned_le32(src + 0);
-- dctx->s[1] = get_unaligned_le32(src + 4);
-- dctx->s[2] = get_unaligned_le32(src + 8);
-- dctx->s[3] = get_unaligned_le32(src + 12);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->sset = true;
-- }
-- }
-- return srclen;
--}
--EXPORT_SYMBOL_GPL(crypto_poly1305_setdesckey);
--
--static void poly1305_blocks_internal(struct poly1305_state *state,
-- const struct poly1305_key *key,
-- const void *src, unsigned int nblocks,
-- u32 hibit)
--{
-- u32 r0, r1, r2, r3, r4;
-- u32 s1, s2, s3, s4;
-- u32 h0, h1, h2, h3, h4;
-- u64 d0, d1, d2, d3, d4;
--
-- if (!nblocks)
-- return;
--
-- r0 = key->r[0];
-- r1 = key->r[1];
-- r2 = key->r[2];
-- r3 = key->r[3];
-- r4 = key->r[4];
--
-- s1 = r1 * 5;
-- s2 = r2 * 5;
-- s3 = r3 * 5;
-- s4 = r4 * 5;
--
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- do {
-- /* h += m[i] */
-- h0 += (get_unaligned_le32(src + 0) >> 0) & 0x3ffffff;
-- h1 += (get_unaligned_le32(src + 3) >> 2) & 0x3ffffff;
-- h2 += (get_unaligned_le32(src + 6) >> 4) & 0x3ffffff;
-- h3 += (get_unaligned_le32(src + 9) >> 6) & 0x3ffffff;
-- h4 += (get_unaligned_le32(src + 12) >> 8) | hibit;
--
-- /* h *= r */
-- d0 = mlt(h0, r0) + mlt(h1, s4) + mlt(h2, s3) +
-- mlt(h3, s2) + mlt(h4, s1);
-- d1 = mlt(h0, r1) + mlt(h1, r0) + mlt(h2, s4) +
-- mlt(h3, s3) + mlt(h4, s2);
-- d2 = mlt(h0, r2) + mlt(h1, r1) + mlt(h2, r0) +
-- mlt(h3, s4) + mlt(h4, s3);
-- d3 = mlt(h0, r3) + mlt(h1, r2) + mlt(h2, r1) +
-- mlt(h3, r0) + mlt(h4, s4);
-- d4 = mlt(h0, r4) + mlt(h1, r3) + mlt(h2, r2) +
-- mlt(h3, r1) + mlt(h4, r0);
--
-- /* (partial) h %= p */
-- d1 += sr(d0, 26); h0 = and(d0, 0x3ffffff);
-- d2 += sr(d1, 26); h1 = and(d1, 0x3ffffff);
-- d3 += sr(d2, 26); h2 = and(d2, 0x3ffffff);
-- d4 += sr(d3, 26); h3 = and(d3, 0x3ffffff);
-- h0 += sr(d4, 26) * 5; h4 = and(d4, 0x3ffffff);
-- h1 += h0 >> 26; h0 = h0 & 0x3ffffff;
--
-- src += POLY1305_BLOCK_SIZE;
-- } while (--nblocks);
--
-- state->h[0] = h0;
-- state->h[1] = h1;
-- state->h[2] = h2;
-- state->h[3] = h3;
-- state->h[4] = h4;
--}
--
--void poly1305_core_blocks(struct poly1305_state *state,
-- const struct poly1305_key *key,
-- const void *src, unsigned int nblocks)
--{
-- poly1305_blocks_internal(state, key, src, nblocks, 1 << 24);
--}
--EXPORT_SYMBOL_GPL(poly1305_core_blocks);
--
--static void poly1305_blocks(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen, u32 hibit)
-+static void poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ unsigned int srclen)
- {
- unsigned int datalen;
-
-@@ -174,8 +43,8 @@ static void poly1305_blocks(struct poly1
- srclen = datalen;
- }
-
-- poly1305_blocks_internal(&dctx->h, &dctx->r,
-- src, srclen / POLY1305_BLOCK_SIZE, hibit);
-+ poly1305_core_blocks(&dctx->h, &dctx->r, src,
-+ srclen / POLY1305_BLOCK_SIZE, 1);
- }
-
- int crypto_poly1305_update(struct shash_desc *desc,
-@@ -193,13 +62,13 @@ int crypto_poly1305_update(struct shash_
-
- if (dctx->buflen == POLY1305_BLOCK_SIZE) {
- poly1305_blocks(dctx, dctx->buf,
-- POLY1305_BLOCK_SIZE, 1 << 24);
-+ POLY1305_BLOCK_SIZE);
- dctx->buflen = 0;
- }
- }
-
- if (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-- poly1305_blocks(dctx, src, srclen, 1 << 24);
-+ poly1305_blocks(dctx, src, srclen);
- src += srclen - (srclen % POLY1305_BLOCK_SIZE);
- srclen %= POLY1305_BLOCK_SIZE;
- }
-@@ -213,54 +82,6 @@ int crypto_poly1305_update(struct shash_
- }
- EXPORT_SYMBOL_GPL(crypto_poly1305_update);
-
--void poly1305_core_emit(const struct poly1305_state *state, void *dst)
--{
-- u32 h0, h1, h2, h3, h4;
-- u32 g0, g1, g2, g3, g4;
-- u32 mask;
--
-- /* fully carry h */
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- h2 += (h1 >> 26); h1 = h1 & 0x3ffffff;
-- h3 += (h2 >> 26); h2 = h2 & 0x3ffffff;
-- h4 += (h3 >> 26); h3 = h3 & 0x3ffffff;
-- h0 += (h4 >> 26) * 5; h4 = h4 & 0x3ffffff;
-- h1 += (h0 >> 26); h0 = h0 & 0x3ffffff;
--
-- /* compute h + -p */
-- g0 = h0 + 5;
-- g1 = h1 + (g0 >> 26); g0 &= 0x3ffffff;
-- g2 = h2 + (g1 >> 26); g1 &= 0x3ffffff;
-- g3 = h3 + (g2 >> 26); g2 &= 0x3ffffff;
-- g4 = h4 + (g3 >> 26) - (1 << 26); g3 &= 0x3ffffff;
--
-- /* select h if h < p, or h + -p if h >= p */
-- mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-- g0 &= mask;
-- g1 &= mask;
-- g2 &= mask;
-- g3 &= mask;
-- g4 &= mask;
-- mask = ~mask;
-- h0 = (h0 & mask) | g0;
-- h1 = (h1 & mask) | g1;
-- h2 = (h2 & mask) | g2;
-- h3 = (h3 & mask) | g3;
-- h4 = (h4 & mask) | g4;
--
-- /* h = h % (2^128) */
-- put_unaligned_le32((h0 >> 0) | (h1 << 26), dst + 0);
-- put_unaligned_le32((h1 >> 6) | (h2 << 20), dst + 4);
-- put_unaligned_le32((h2 >> 12) | (h3 << 14), dst + 8);
-- put_unaligned_le32((h3 >> 18) | (h4 << 8), dst + 12);
--}
--EXPORT_SYMBOL_GPL(poly1305_core_emit);
--
- int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-@@ -274,7 +95,7 @@ int crypto_poly1305_final(struct shash_d
- dctx->buf[dctx->buflen++] = 1;
- memset(dctx->buf + dctx->buflen, 0,
- POLY1305_BLOCK_SIZE - dctx->buflen);
-- poly1305_blocks(dctx, dctx->buf, POLY1305_BLOCK_SIZE, 0);
-+ poly1305_core_blocks(&dctx->h, &dctx->r, dctx->buf, 1, 0);
- }
-
- poly1305_core_emit(&dctx->h, digest);
---- /dev/null
-+++ b/include/crypto/internal/poly1305.h
-@@ -0,0 +1,67 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Common values for the Poly1305 algorithm
-+ */
-+
-+#ifndef _CRYPTO_INTERNAL_POLY1305_H
-+#define _CRYPTO_INTERNAL_POLY1305_H
-+
-+#include <asm/unaligned.h>
-+#include <linux/types.h>
-+#include <crypto/poly1305.h>
-+
-+struct shash_desc;
-+
-+/*
-+ * Poly1305 core functions. These implement the ε-almost-∆-universal hash
-+ * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
-+ * ("s key") at the end. They also only support block-aligned inputs.
-+ */
-+void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key);
-+static inline void poly1305_core_init(struct poly1305_state *state)
-+{
-+ *state = (struct poly1305_state){};
-+}
-+
-+void poly1305_core_blocks(struct poly1305_state *state,
-+ const struct poly1305_key *key, const void *src,
-+ unsigned int nblocks, u32 hibit);
-+void poly1305_core_emit(const struct poly1305_state *state, void *dst);
-+
-+/* Crypto API helper functions for the Poly1305 MAC */
-+int crypto_poly1305_init(struct shash_desc *desc);
-+
-+int crypto_poly1305_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen);
-+int crypto_poly1305_final(struct shash_desc *desc, u8 *dst);
-+
-+/*
-+ * Poly1305 requires a unique key for each tag, which implies that we can't set
-+ * it on the tfm that gets accessed by multiple users simultaneously. Instead we
-+ * expect the key as the first 32 bytes in the update() call.
-+ */
-+static inline
-+unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, unsigned int srclen)
-+{
-+ if (!dctx->sset) {
-+ if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-+ poly1305_core_setkey(&dctx->r, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = true;
-+ }
-+ if (srclen >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ }
-+ return srclen;
-+}
-+
-+#endif
---- a/include/crypto/poly1305.h
-+++ b/include/crypto/poly1305.h
-@@ -38,27 +38,4 @@ struct poly1305_desc_ctx {
- bool sset;
- };
-
--/*
-- * Poly1305 core functions. These implement the ε-almost-∆-universal hash
-- * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
-- * ("s key") at the end. They also only support block-aligned inputs.
-- */
--void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key);
--static inline void poly1305_core_init(struct poly1305_state *state)
--{
-- memset(state->h, 0, sizeof(state->h));
--}
--void poly1305_core_blocks(struct poly1305_state *state,
-- const struct poly1305_key *key,
-- const void *src, unsigned int nblocks);
--void poly1305_core_emit(const struct poly1305_state *state, void *dst);
--
--/* Crypto API helper functions for the Poly1305 MAC */
--int crypto_poly1305_init(struct shash_desc *desc);
--unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen);
--int crypto_poly1305_update(struct shash_desc *desc,
-- const u8 *src, unsigned int srclen);
--int crypto_poly1305_final(struct shash_desc *desc, u8 *dst);
--
- #endif
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -37,5 +37,8 @@ config CRYPTO_LIB_CHACHA
- config CRYPTO_LIB_DES
- tristate
-
-+config CRYPTO_LIB_POLY1305_GENERIC
-+ tristate
-+
- config CRYPTO_LIB_SHA256
- tristate
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -13,5 +13,8 @@ libarc4-y := arc4.o
- obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
- libdes-y := des.o
-
-+obj-$(CONFIG_CRYPTO_LIB_POLY1305_GENERIC) += libpoly1305.o
-+libpoly1305-y := poly1305.o
-+
- obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
- libsha256-y := sha256.o
---- /dev/null
-+++ b/lib/crypto/poly1305.c
-@@ -0,0 +1,158 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later
-+/*
-+ * Poly1305 authenticator algorithm, RFC7539
-+ *
-+ * Copyright (C) 2015 Martin Willi
-+ *
-+ * Based on public domain code by Andrew Moon and Daniel J. Bernstein.
-+ */
-+
-+#include <crypto/internal/poly1305.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <asm/unaligned.h>
-+
-+static inline u64 mlt(u64 a, u64 b)
-+{
-+ return a * b;
-+}
-+
-+static inline u32 sr(u64 v, u_char n)
-+{
-+ return v >> n;
-+}
-+
-+static inline u32 and(u32 v, u32 mask)
-+{
-+ return v & mask;
-+}
-+
-+void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key)
-+{
-+ /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-+ key->r[0] = (get_unaligned_le32(raw_key + 0) >> 0) & 0x3ffffff;
-+ key->r[1] = (get_unaligned_le32(raw_key + 3) >> 2) & 0x3ffff03;
-+ key->r[2] = (get_unaligned_le32(raw_key + 6) >> 4) & 0x3ffc0ff;
-+ key->r[3] = (get_unaligned_le32(raw_key + 9) >> 6) & 0x3f03fff;
-+ key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
-+}
-+EXPORT_SYMBOL_GPL(poly1305_core_setkey);
-+
-+void poly1305_core_blocks(struct poly1305_state *state,
-+ const struct poly1305_key *key, const void *src,
-+ unsigned int nblocks, u32 hibit)
-+{
-+ u32 r0, r1, r2, r3, r4;
-+ u32 s1, s2, s3, s4;
-+ u32 h0, h1, h2, h3, h4;
-+ u64 d0, d1, d2, d3, d4;
-+
-+ if (!nblocks)
-+ return;
-+
-+ r0 = key->r[0];
-+ r1 = key->r[1];
-+ r2 = key->r[2];
-+ r3 = key->r[3];
-+ r4 = key->r[4];
-+
-+ s1 = r1 * 5;
-+ s2 = r2 * 5;
-+ s3 = r3 * 5;
-+ s4 = r4 * 5;
-+
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ do {
-+ /* h += m[i] */
-+ h0 += (get_unaligned_le32(src + 0) >> 0) & 0x3ffffff;
-+ h1 += (get_unaligned_le32(src + 3) >> 2) & 0x3ffffff;
-+ h2 += (get_unaligned_le32(src + 6) >> 4) & 0x3ffffff;
-+ h3 += (get_unaligned_le32(src + 9) >> 6) & 0x3ffffff;
-+ h4 += (get_unaligned_le32(src + 12) >> 8) | (hibit << 24);
-+
-+ /* h *= r */
-+ d0 = mlt(h0, r0) + mlt(h1, s4) + mlt(h2, s3) +
-+ mlt(h3, s2) + mlt(h4, s1);
-+ d1 = mlt(h0, r1) + mlt(h1, r0) + mlt(h2, s4) +
-+ mlt(h3, s3) + mlt(h4, s2);
-+ d2 = mlt(h0, r2) + mlt(h1, r1) + mlt(h2, r0) +
-+ mlt(h3, s4) + mlt(h4, s3);
-+ d3 = mlt(h0, r3) + mlt(h1, r2) + mlt(h2, r1) +
-+ mlt(h3, r0) + mlt(h4, s4);
-+ d4 = mlt(h0, r4) + mlt(h1, r3) + mlt(h2, r2) +
-+ mlt(h3, r1) + mlt(h4, r0);
-+
-+ /* (partial) h %= p */
-+ d1 += sr(d0, 26); h0 = and(d0, 0x3ffffff);
-+ d2 += sr(d1, 26); h1 = and(d1, 0x3ffffff);
-+ d3 += sr(d2, 26); h2 = and(d2, 0x3ffffff);
-+ d4 += sr(d3, 26); h3 = and(d3, 0x3ffffff);
-+ h0 += sr(d4, 26) * 5; h4 = and(d4, 0x3ffffff);
-+ h1 += h0 >> 26; h0 = h0 & 0x3ffffff;
-+
-+ src += POLY1305_BLOCK_SIZE;
-+ } while (--nblocks);
-+
-+ state->h[0] = h0;
-+ state->h[1] = h1;
-+ state->h[2] = h2;
-+ state->h[3] = h3;
-+ state->h[4] = h4;
-+}
-+EXPORT_SYMBOL_GPL(poly1305_core_blocks);
-+
-+void poly1305_core_emit(const struct poly1305_state *state, void *dst)
-+{
-+ u32 h0, h1, h2, h3, h4;
-+ u32 g0, g1, g2, g3, g4;
-+ u32 mask;
-+
-+ /* fully carry h */
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ h2 += (h1 >> 26); h1 = h1 & 0x3ffffff;
-+ h3 += (h2 >> 26); h2 = h2 & 0x3ffffff;
-+ h4 += (h3 >> 26); h3 = h3 & 0x3ffffff;
-+ h0 += (h4 >> 26) * 5; h4 = h4 & 0x3ffffff;
-+ h1 += (h0 >> 26); h0 = h0 & 0x3ffffff;
-+
-+ /* compute h + -p */
-+ g0 = h0 + 5;
-+ g1 = h1 + (g0 >> 26); g0 &= 0x3ffffff;
-+ g2 = h2 + (g1 >> 26); g1 &= 0x3ffffff;
-+ g3 = h3 + (g2 >> 26); g2 &= 0x3ffffff;
-+ g4 = h4 + (g3 >> 26) - (1 << 26); g3 &= 0x3ffffff;
-+
-+ /* select h if h < p, or h + -p if h >= p */
-+ mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-+ g0 &= mask;
-+ g1 &= mask;
-+ g2 &= mask;
-+ g3 &= mask;
-+ g4 &= mask;
-+ mask = ~mask;
-+ h0 = (h0 & mask) | g0;
-+ h1 = (h1 & mask) | g1;
-+ h2 = (h2 & mask) | g2;
-+ h3 = (h3 & mask) | g3;
-+ h4 = (h4 & mask) | g4;
-+
-+ /* h = h % (2^128) */
-+ put_unaligned_le32((h0 >> 0) | (h1 << 26), dst + 0);
-+ put_unaligned_le32((h1 >> 6) | (h2 << 20), dst + 4);
-+ put_unaligned_le32((h2 >> 12) | (h3 << 14), dst + 8);
-+ put_unaligned_le32((h3 >> 18) | (h4 << 8), dst + 12);
-+}
-+EXPORT_SYMBOL_GPL(poly1305_core_emit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0014-crypto-x86-poly1305-unify-Poly1305-state-struct-with.patch b/target/linux/generic/backport-5.4/080-wireguard-0014-crypto-x86-poly1305-unify-Poly1305-state-struct-with.patch
deleted file mode 100644
index 7d237549b0..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0014-crypto-x86-poly1305-unify-Poly1305-state-struct-with.patch
+++ /dev/null
@@ -1,251 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:20 +0100
-Subject: [PATCH] crypto: x86/poly1305 - unify Poly1305 state struct with
- generic code
-
-commit ad8f5b88383ea685f2b8df2a12ee3e08089a1287 upstream.
-
-In preparation of exposing a Poly1305 library interface directly from
-the accelerated x86 driver, align the state descriptor of the x86 code
-with the one used by the generic driver. This is needed to make the
-library interface unified between all implementations.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 88 ++++++++++--------------------
- crypto/poly1305_generic.c | 6 +-
- include/crypto/internal/poly1305.h | 4 +-
- include/crypto/poly1305.h | 18 +++---
- 4 files changed, 43 insertions(+), 73 deletions(-)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -14,40 +14,14 @@
- #include <linux/module.h>
- #include <asm/simd.h>
-
--struct poly1305_simd_desc_ctx {
-- struct poly1305_desc_ctx base;
-- /* derived key u set? */
-- bool uset;
--#ifdef CONFIG_AS_AVX2
-- /* derived keys r^3, r^4 set? */
-- bool wset;
--#endif
-- /* derived Poly1305 key r^2 */
-- u32 u[5];
-- /* ... silently appended r^3 and r^4 when using AVX2 */
--};
--
- asmlinkage void poly1305_block_sse2(u32 *h, const u8 *src,
- const u32 *r, unsigned int blocks);
- asmlinkage void poly1305_2block_sse2(u32 *h, const u8 *src, const u32 *r,
- unsigned int blocks, const u32 *u);
--#ifdef CONFIG_AS_AVX2
- asmlinkage void poly1305_4block_avx2(u32 *h, const u8 *src, const u32 *r,
- unsigned int blocks, const u32 *u);
--static bool poly1305_use_avx2;
--#endif
-
--static int poly1305_simd_init(struct shash_desc *desc)
--{
-- struct poly1305_simd_desc_ctx *sctx = shash_desc_ctx(desc);
--
-- sctx->uset = false;
--#ifdef CONFIG_AS_AVX2
-- sctx->wset = false;
--#endif
--
-- return crypto_poly1305_init(desc);
--}
-+static bool poly1305_use_avx2 __ro_after_init;
-
- static void poly1305_simd_mult(u32 *a, const u32 *b)
- {
-@@ -63,53 +37,49 @@ static void poly1305_simd_mult(u32 *a, c
- static unsigned int poly1305_simd_blocks(struct poly1305_desc_ctx *dctx,
- const u8 *src, unsigned int srclen)
- {
-- struct poly1305_simd_desc_ctx *sctx;
- unsigned int blocks, datalen;
-
-- BUILD_BUG_ON(offsetof(struct poly1305_simd_desc_ctx, base));
-- sctx = container_of(dctx, struct poly1305_simd_desc_ctx, base);
--
- if (unlikely(!dctx->sset)) {
- datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
- src += srclen - datalen;
- srclen = datalen;
- }
-
--#ifdef CONFIG_AS_AVX2
-- if (poly1305_use_avx2 && srclen >= POLY1305_BLOCK_SIZE * 4) {
-- if (unlikely(!sctx->wset)) {
-- if (!sctx->uset) {
-- memcpy(sctx->u, dctx->r.r, sizeof(sctx->u));
-- poly1305_simd_mult(sctx->u, dctx->r.r);
-- sctx->uset = true;
-+ if (IS_ENABLED(CONFIG_AS_AVX2) &&
-+ poly1305_use_avx2 &&
-+ srclen >= POLY1305_BLOCK_SIZE * 4) {
-+ if (unlikely(dctx->rset < 4)) {
-+ if (dctx->rset < 2) {
-+ dctx->r[1] = dctx->r[0];
-+ poly1305_simd_mult(dctx->r[1].r, dctx->r[0].r);
- }
-- memcpy(sctx->u + 5, sctx->u, sizeof(sctx->u));
-- poly1305_simd_mult(sctx->u + 5, dctx->r.r);
-- memcpy(sctx->u + 10, sctx->u + 5, sizeof(sctx->u));
-- poly1305_simd_mult(sctx->u + 10, dctx->r.r);
-- sctx->wset = true;
-+ dctx->r[2] = dctx->r[1];
-+ poly1305_simd_mult(dctx->r[2].r, dctx->r[0].r);
-+ dctx->r[3] = dctx->r[2];
-+ poly1305_simd_mult(dctx->r[3].r, dctx->r[0].r);
-+ dctx->rset = 4;
- }
- blocks = srclen / (POLY1305_BLOCK_SIZE * 4);
-- poly1305_4block_avx2(dctx->h.h, src, dctx->r.r, blocks,
-- sctx->u);
-+ poly1305_4block_avx2(dctx->h.h, src, dctx->r[0].r, blocks,
-+ dctx->r[1].r);
- src += POLY1305_BLOCK_SIZE * 4 * blocks;
- srclen -= POLY1305_BLOCK_SIZE * 4 * blocks;
- }
--#endif
-+
- if (likely(srclen >= POLY1305_BLOCK_SIZE * 2)) {
-- if (unlikely(!sctx->uset)) {
-- memcpy(sctx->u, dctx->r.r, sizeof(sctx->u));
-- poly1305_simd_mult(sctx->u, dctx->r.r);
-- sctx->uset = true;
-+ if (unlikely(dctx->rset < 2)) {
-+ dctx->r[1] = dctx->r[0];
-+ poly1305_simd_mult(dctx->r[1].r, dctx->r[0].r);
-+ dctx->rset = 2;
- }
- blocks = srclen / (POLY1305_BLOCK_SIZE * 2);
-- poly1305_2block_sse2(dctx->h.h, src, dctx->r.r, blocks,
-- sctx->u);
-+ poly1305_2block_sse2(dctx->h.h, src, dctx->r[0].r,
-+ blocks, dctx->r[1].r);
- src += POLY1305_BLOCK_SIZE * 2 * blocks;
- srclen -= POLY1305_BLOCK_SIZE * 2 * blocks;
- }
- if (srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_block_sse2(dctx->h.h, src, dctx->r.r, 1);
-+ poly1305_block_sse2(dctx->h.h, src, dctx->r[0].r, 1);
- srclen -= POLY1305_BLOCK_SIZE;
- }
- return srclen;
-@@ -159,10 +129,10 @@ static int poly1305_simd_update(struct s
-
- static struct shash_alg alg = {
- .digestsize = POLY1305_DIGEST_SIZE,
-- .init = poly1305_simd_init,
-+ .init = crypto_poly1305_init,
- .update = poly1305_simd_update,
- .final = crypto_poly1305_final,
-- .descsize = sizeof(struct poly1305_simd_desc_ctx),
-+ .descsize = sizeof(struct poly1305_desc_ctx),
- .base = {
- .cra_name = "poly1305",
- .cra_driver_name = "poly1305-simd",
-@@ -177,14 +147,14 @@ static int __init poly1305_simd_mod_init
- if (!boot_cpu_has(X86_FEATURE_XMM2))
- return -ENODEV;
-
--#ifdef CONFIG_AS_AVX2
-- poly1305_use_avx2 = boot_cpu_has(X86_FEATURE_AVX) &&
-+ poly1305_use_avx2 = IS_ENABLED(CONFIG_AS_AVX2) &&
-+ boot_cpu_has(X86_FEATURE_AVX) &&
- boot_cpu_has(X86_FEATURE_AVX2) &&
- cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL);
-- alg.descsize = sizeof(struct poly1305_simd_desc_ctx);
-+ alg.descsize = sizeof(struct poly1305_desc_ctx) + 5 * sizeof(u32);
- if (poly1305_use_avx2)
- alg.descsize += 10 * sizeof(u32);
--#endif
-+
- return crypto_register_shash(&alg);
- }
-
---- a/crypto/poly1305_generic.c
-+++ b/crypto/poly1305_generic.c
-@@ -25,7 +25,7 @@ int crypto_poly1305_init(struct shash_de
-
- poly1305_core_init(&dctx->h);
- dctx->buflen = 0;
-- dctx->rset = false;
-+ dctx->rset = 0;
- dctx->sset = false;
-
- return 0;
-@@ -43,7 +43,7 @@ static void poly1305_blocks(struct poly1
- srclen = datalen;
- }
-
-- poly1305_core_blocks(&dctx->h, &dctx->r, src,
-+ poly1305_core_blocks(&dctx->h, dctx->r, src,
- srclen / POLY1305_BLOCK_SIZE, 1);
- }
-
-@@ -95,7 +95,7 @@ int crypto_poly1305_final(struct shash_d
- dctx->buf[dctx->buflen++] = 1;
- memset(dctx->buf + dctx->buflen, 0,
- POLY1305_BLOCK_SIZE - dctx->buflen);
-- poly1305_core_blocks(&dctx->h, &dctx->r, dctx->buf, 1, 0);
-+ poly1305_core_blocks(&dctx->h, dctx->r, dctx->buf, 1, 0);
- }
-
- poly1305_core_emit(&dctx->h, digest);
---- a/include/crypto/internal/poly1305.h
-+++ b/include/crypto/internal/poly1305.h
-@@ -46,10 +46,10 @@ unsigned int crypto_poly1305_setdesckey(
- {
- if (!dctx->sset) {
- if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_core_setkey(&dctx->r, src);
-+ poly1305_core_setkey(dctx->r, src);
- src += POLY1305_BLOCK_SIZE;
- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->rset = true;
-+ dctx->rset = 1;
- }
- if (srclen >= POLY1305_BLOCK_SIZE) {
- dctx->s[0] = get_unaligned_le32(src + 0);
---- a/include/crypto/poly1305.h
-+++ b/include/crypto/poly1305.h
-@@ -22,20 +22,20 @@ struct poly1305_state {
- };
-
- struct poly1305_desc_ctx {
-- /* key */
-- struct poly1305_key r;
-- /* finalize key */
-- u32 s[4];
-- /* accumulator */
-- struct poly1305_state h;
- /* partial buffer */
- u8 buf[POLY1305_BLOCK_SIZE];
- /* bytes used in partial buffer */
- unsigned int buflen;
-- /* r key has been set */
-- bool rset;
-- /* s key has been set */
-+ /* how many keys have been set in r[] */
-+ unsigned short rset;
-+ /* whether s[] has been set */
- bool sset;
-+ /* finalize key */
-+ u32 s[4];
-+ /* accumulator */
-+ struct poly1305_state h;
-+ /* key */
-+ struct poly1305_key r[1];
- };
-
- #endif
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0015-crypto-poly1305-expose-init-update-final-library-int.patch b/target/linux/generic/backport-5.4/080-wireguard-0015-crypto-poly1305-expose-init-update-final-library-int.patch
deleted file mode 100644
index bf8e90bf02..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0015-crypto-poly1305-expose-init-update-final-library-int.patch
+++ /dev/null
@@ -1,224 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:21 +0100
-Subject: [PATCH] crypto: poly1305 - expose init/update/final library interface
-
-commit a1d93064094cc5e24d64e35cf093e7191d0c9344 upstream.
-
-Expose the existing generic Poly1305 code via a init/update/final
-library interface so that callers are not required to go through
-the crypto API's shash abstraction to access it. At the same time,
-make some preparations so that the library implementation can be
-superseded by an accelerated arch-specific version in the future.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/poly1305_generic.c | 22 +-----------
- include/crypto/poly1305.h | 38 +++++++++++++++++++-
- lib/crypto/Kconfig | 26 ++++++++++++++
- lib/crypto/poly1305.c | 74 +++++++++++++++++++++++++++++++++++++++
- 4 files changed, 138 insertions(+), 22 deletions(-)
-
---- a/crypto/poly1305_generic.c
-+++ b/crypto/poly1305_generic.c
-@@ -85,31 +85,11 @@ EXPORT_SYMBOL_GPL(crypto_poly1305_update
- int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-- __le32 digest[4];
-- u64 f = 0;
-
- if (unlikely(!dctx->sset))
- return -ENOKEY;
-
-- if (unlikely(dctx->buflen)) {
-- dctx->buf[dctx->buflen++] = 1;
-- memset(dctx->buf + dctx->buflen, 0,
-- POLY1305_BLOCK_SIZE - dctx->buflen);
-- poly1305_core_blocks(&dctx->h, dctx->r, dctx->buf, 1, 0);
-- }
--
-- poly1305_core_emit(&dctx->h, digest);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]) + dctx->s[0];
-- put_unaligned_le32(f, dst + 0);
-- f = (f >> 32) + le32_to_cpu(digest[1]) + dctx->s[1];
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]) + dctx->s[2];
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]) + dctx->s[3];
-- put_unaligned_le32(f, dst + 12);
--
-+ poly1305_final_generic(dctx, dst);
- return 0;
- }
- EXPORT_SYMBOL_GPL(crypto_poly1305_final);
---- a/include/crypto/poly1305.h
-+++ b/include/crypto/poly1305.h
-@@ -35,7 +35,43 @@ struct poly1305_desc_ctx {
- /* accumulator */
- struct poly1305_state h;
- /* key */
-- struct poly1305_key r[1];
-+ struct poly1305_key r[CONFIG_CRYPTO_LIB_POLY1305_RSIZE];
- };
-
-+void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key);
-+void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key);
-+
-+static inline void poly1305_init(struct poly1305_desc_ctx *desc, const u8 *key)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
-+ poly1305_init_arch(desc, key);
-+ else
-+ poly1305_init_generic(desc, key);
-+}
-+
-+void poly1305_update_arch(struct poly1305_desc_ctx *desc, const u8 *src,
-+ unsigned int nbytes);
-+void poly1305_update_generic(struct poly1305_desc_ctx *desc, const u8 *src,
-+ unsigned int nbytes);
-+
-+static inline void poly1305_update(struct poly1305_desc_ctx *desc,
-+ const u8 *src, unsigned int nbytes)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
-+ poly1305_update_arch(desc, src, nbytes);
-+ else
-+ poly1305_update_generic(desc, src, nbytes);
-+}
-+
-+void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *digest);
-+void poly1305_final_generic(struct poly1305_desc_ctx *desc, u8 *digest);
-+
-+static inline void poly1305_final(struct poly1305_desc_ctx *desc, u8 *digest)
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305))
-+ poly1305_final_arch(desc, digest);
-+ else
-+ poly1305_final_generic(desc, digest);
-+}
-+
- #endif
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -37,8 +37,34 @@ config CRYPTO_LIB_CHACHA
- config CRYPTO_LIB_DES
- tristate
-
-+config CRYPTO_LIB_POLY1305_RSIZE
-+ int
-+ default 1
-+
-+config CRYPTO_ARCH_HAVE_LIB_POLY1305
-+ tristate
-+ help
-+ Declares whether the architecture provides an arch-specific
-+ accelerated implementation of the Poly1305 library interface,
-+ either builtin or as a module.
-+
- config CRYPTO_LIB_POLY1305_GENERIC
- tristate
-+ help
-+ This symbol can be depended upon by arch implementations of the
-+ Poly1305 library interface that require the generic code as a
-+ fallback, e.g., for SIMD implementations. If no arch specific
-+ implementation is enabled, this implementation serves the users
-+ of CRYPTO_LIB_POLY1305.
-+
-+config CRYPTO_LIB_POLY1305
-+ tristate "Poly1305 library interface"
-+ depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
-+ select CRYPTO_LIB_POLY1305_GENERIC if CRYPTO_ARCH_HAVE_LIB_POLY1305=n
-+ help
-+ Enable the Poly1305 library interface. This interface may be fulfilled
-+ by either the generic implementation or an arch-specific one, if one
-+ is available and enabled.
-
- config CRYPTO_LIB_SHA256
- tristate
---- a/lib/crypto/poly1305.c
-+++ b/lib/crypto/poly1305.c
-@@ -154,5 +154,79 @@ void poly1305_core_emit(const struct pol
- }
- EXPORT_SYMBOL_GPL(poly1305_core_emit);
-
-+void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key)
-+{
-+ poly1305_core_setkey(desc->r, key);
-+ desc->s[0] = get_unaligned_le32(key + 16);
-+ desc->s[1] = get_unaligned_le32(key + 20);
-+ desc->s[2] = get_unaligned_le32(key + 24);
-+ desc->s[3] = get_unaligned_le32(key + 28);
-+ poly1305_core_init(&desc->h);
-+ desc->buflen = 0;
-+ desc->sset = true;
-+ desc->rset = 1;
-+}
-+EXPORT_SYMBOL_GPL(poly1305_init_generic);
-+
-+void poly1305_update_generic(struct poly1305_desc_ctx *desc, const u8 *src,
-+ unsigned int nbytes)
-+{
-+ unsigned int bytes;
-+
-+ if (unlikely(desc->buflen)) {
-+ bytes = min(nbytes, POLY1305_BLOCK_SIZE - desc->buflen);
-+ memcpy(desc->buf + desc->buflen, src, bytes);
-+ src += bytes;
-+ nbytes -= bytes;
-+ desc->buflen += bytes;
-+
-+ if (desc->buflen == POLY1305_BLOCK_SIZE) {
-+ poly1305_core_blocks(&desc->h, desc->r, desc->buf, 1, 1);
-+ desc->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(nbytes >= POLY1305_BLOCK_SIZE)) {
-+ poly1305_core_blocks(&desc->h, desc->r, src,
-+ nbytes / POLY1305_BLOCK_SIZE, 1);
-+ src += nbytes - (nbytes % POLY1305_BLOCK_SIZE);
-+ nbytes %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(nbytes)) {
-+ desc->buflen = nbytes;
-+ memcpy(desc->buf, src, nbytes);
-+ }
-+}
-+EXPORT_SYMBOL_GPL(poly1305_update_generic);
-+
-+void poly1305_final_generic(struct poly1305_desc_ctx *desc, u8 *dst)
-+{
-+ __le32 digest[4];
-+ u64 f = 0;
-+
-+ if (unlikely(desc->buflen)) {
-+ desc->buf[desc->buflen++] = 1;
-+ memset(desc->buf + desc->buflen, 0,
-+ POLY1305_BLOCK_SIZE - desc->buflen);
-+ poly1305_core_blocks(&desc->h, desc->r, desc->buf, 1, 0);
-+ }
-+
-+ poly1305_core_emit(&desc->h, digest);
-+
-+ /* mac = (h + s) % (2^128) */
-+ f = (f >> 32) + le32_to_cpu(digest[0]) + desc->s[0];
-+ put_unaligned_le32(f, dst + 0);
-+ f = (f >> 32) + le32_to_cpu(digest[1]) + desc->s[1];
-+ put_unaligned_le32(f, dst + 4);
-+ f = (f >> 32) + le32_to_cpu(digest[2]) + desc->s[2];
-+ put_unaligned_le32(f, dst + 8);
-+ f = (f >> 32) + le32_to_cpu(digest[3]) + desc->s[3];
-+ put_unaligned_le32(f, dst + 12);
-+
-+ *desc = (struct poly1305_desc_ctx){};
-+}
-+EXPORT_SYMBOL_GPL(poly1305_final_generic);
-+
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0016-crypto-x86-poly1305-depend-on-generic-library-not-ge.patch b/target/linux/generic/backport-5.4/080-wireguard-0016-crypto-x86-poly1305-depend-on-generic-library-not-ge.patch
deleted file mode 100644
index 8ea63f3b91..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0016-crypto-x86-poly1305-depend-on-generic-library-not-ge.patch
+++ /dev/null
@@ -1,217 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:22 +0100
-Subject: [PATCH] crypto: x86/poly1305 - depend on generic library not generic
- shash
-
-commit 1b2c6a5120489d41c8ea3b8dacd0b4586289b158 upstream.
-
-Remove the dependency on the generic Poly1305 driver. Instead, depend
-on the generic library so that we only reuse code without pulling in
-the generic skcipher implementation as well.
-
-While at it, remove the logic that prefers the non-SIMD path for short
-inputs - this is no longer necessary after recent FPU handling changes
-on x86.
-
-Since this removes the last remaining user of the routines exported
-by the generic shash driver, unexport them and make them static.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 66 +++++++++++++++++++++++++-----
- crypto/Kconfig | 2 +-
- crypto/poly1305_generic.c | 11 ++---
- include/crypto/internal/poly1305.h | 9 ----
- 4 files changed, 60 insertions(+), 28 deletions(-)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -34,6 +34,24 @@ static void poly1305_simd_mult(u32 *a, c
- poly1305_block_sse2(a, m, b, 1);
- }
-
-+static unsigned int poly1305_scalar_blocks(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, unsigned int srclen)
-+{
-+ unsigned int datalen;
-+
-+ if (unlikely(!dctx->sset)) {
-+ datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
-+ src += srclen - datalen;
-+ srclen = datalen;
-+ }
-+ if (srclen >= POLY1305_BLOCK_SIZE) {
-+ poly1305_core_blocks(&dctx->h, dctx->r, src,
-+ srclen / POLY1305_BLOCK_SIZE, 1);
-+ srclen %= POLY1305_BLOCK_SIZE;
-+ }
-+ return srclen;
-+}
-+
- static unsigned int poly1305_simd_blocks(struct poly1305_desc_ctx *dctx,
- const u8 *src, unsigned int srclen)
- {
-@@ -91,12 +109,6 @@ static int poly1305_simd_update(struct s
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
- unsigned int bytes;
-
-- /* kernel_fpu_begin/end is costly, use fallback for small updates */
-- if (srclen <= 288 || !crypto_simd_usable())
-- return crypto_poly1305_update(desc, src, srclen);
--
-- kernel_fpu_begin();
--
- if (unlikely(dctx->buflen)) {
- bytes = min(srclen, POLY1305_BLOCK_SIZE - dctx->buflen);
- memcpy(dctx->buf + dctx->buflen, src, bytes);
-@@ -105,25 +117,57 @@ static int poly1305_simd_update(struct s
- dctx->buflen += bytes;
-
- if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-- poly1305_simd_blocks(dctx, dctx->buf,
-- POLY1305_BLOCK_SIZE);
-+ if (likely(crypto_simd_usable())) {
-+ kernel_fpu_begin();
-+ poly1305_simd_blocks(dctx, dctx->buf,
-+ POLY1305_BLOCK_SIZE);
-+ kernel_fpu_end();
-+ } else {
-+ poly1305_scalar_blocks(dctx, dctx->buf,
-+ POLY1305_BLOCK_SIZE);
-+ }
- dctx->buflen = 0;
- }
- }
-
- if (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-- bytes = poly1305_simd_blocks(dctx, src, srclen);
-+ if (likely(crypto_simd_usable())) {
-+ kernel_fpu_begin();
-+ bytes = poly1305_simd_blocks(dctx, src, srclen);
-+ kernel_fpu_end();
-+ } else {
-+ bytes = poly1305_scalar_blocks(dctx, src, srclen);
-+ }
- src += srclen - bytes;
- srclen = bytes;
- }
-
-- kernel_fpu_end();
--
- if (unlikely(srclen)) {
- dctx->buflen = srclen;
- memcpy(dctx->buf, src, srclen);
- }
-+}
-+
-+static int crypto_poly1305_init(struct shash_desc *desc)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ poly1305_core_init(&dctx->h);
-+ dctx->buflen = 0;
-+ dctx->rset = 0;
-+ dctx->sset = false;
-+
-+ return 0;
-+}
-+
-+static int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (unlikely(!dctx->sset))
-+ return -ENOKEY;
-
-+ poly1305_final_generic(dctx, dst);
- return 0;
- }
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -697,7 +697,7 @@ config CRYPTO_POLY1305
- config CRYPTO_POLY1305_X86_64
- tristate "Poly1305 authenticator algorithm (x86_64/SSE2/AVX2)"
- depends on X86 && 64BIT
-- select CRYPTO_POLY1305
-+ select CRYPTO_LIB_POLY1305_GENERIC
- help
- Poly1305 authenticator algorithm, RFC7539.
-
---- a/crypto/poly1305_generic.c
-+++ b/crypto/poly1305_generic.c
-@@ -19,7 +19,7 @@
- #include <linux/module.h>
- #include <asm/unaligned.h>
-
--int crypto_poly1305_init(struct shash_desc *desc)
-+static int crypto_poly1305_init(struct shash_desc *desc)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-
-@@ -30,7 +30,6 @@ int crypto_poly1305_init(struct shash_de
-
- return 0;
- }
--EXPORT_SYMBOL_GPL(crypto_poly1305_init);
-
- static void poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
- unsigned int srclen)
-@@ -47,8 +46,8 @@ static void poly1305_blocks(struct poly1
- srclen / POLY1305_BLOCK_SIZE, 1);
- }
-
--int crypto_poly1305_update(struct shash_desc *desc,
-- const u8 *src, unsigned int srclen)
-+static int crypto_poly1305_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
- unsigned int bytes;
-@@ -80,9 +79,8 @@ int crypto_poly1305_update(struct shash_
-
- return 0;
- }
--EXPORT_SYMBOL_GPL(crypto_poly1305_update);
-
--int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
-+static int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-
-@@ -92,7 +90,6 @@ int crypto_poly1305_final(struct shash_d
- poly1305_final_generic(dctx, dst);
- return 0;
- }
--EXPORT_SYMBOL_GPL(crypto_poly1305_final);
-
- static struct shash_alg poly1305_alg = {
- .digestsize = POLY1305_DIGEST_SIZE,
---- a/include/crypto/internal/poly1305.h
-+++ b/include/crypto/internal/poly1305.h
-@@ -10,8 +10,6 @@
- #include <linux/types.h>
- #include <crypto/poly1305.h>
-
--struct shash_desc;
--
- /*
- * Poly1305 core functions. These implement the ε-almost-∆-universal hash
- * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
-@@ -28,13 +26,6 @@ void poly1305_core_blocks(struct poly130
- unsigned int nblocks, u32 hibit);
- void poly1305_core_emit(const struct poly1305_state *state, void *dst);
-
--/* Crypto API helper functions for the Poly1305 MAC */
--int crypto_poly1305_init(struct shash_desc *desc);
--
--int crypto_poly1305_update(struct shash_desc *desc,
-- const u8 *src, unsigned int srclen);
--int crypto_poly1305_final(struct shash_desc *desc, u8 *dst);
--
- /*
- * Poly1305 requires a unique key for each tag, which implies that we can't set
- * it on the tfm that gets accessed by multiple users simultaneously. Instead we
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0017-crypto-x86-poly1305-expose-existing-driver-as-poly13.patch b/target/linux/generic/backport-5.4/080-wireguard-0017-crypto-x86-poly1305-expose-existing-driver-as-poly13.patch
deleted file mode 100644
index 6514987b4d..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0017-crypto-x86-poly1305-expose-existing-driver-as-poly13.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:23 +0100
-Subject: [PATCH] crypto: x86/poly1305 - expose existing driver as poly1305
- library
-
-commit f0e89bcfbb894e5844cd1bbf6b3cf7c63cb0f5ac upstream.
-
-Implement the arch init/update/final Poly1305 library routines in the
-accelerated SIMD driver for x86 so they are accessible to users of
-the Poly1305 library interface as well.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 57 ++++++++++++++++++++++++---------
- crypto/Kconfig | 1 +
- lib/crypto/Kconfig | 1 +
- 3 files changed, 43 insertions(+), 16 deletions(-)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -10,6 +10,7 @@
- #include <crypto/internal/poly1305.h>
- #include <crypto/internal/simd.h>
- #include <linux/crypto.h>
-+#include <linux/jump_label.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <asm/simd.h>
-@@ -21,7 +22,8 @@ asmlinkage void poly1305_2block_sse2(u32
- asmlinkage void poly1305_4block_avx2(u32 *h, const u8 *src, const u32 *r,
- unsigned int blocks, const u32 *u);
-
--static bool poly1305_use_avx2 __ro_after_init;
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_simd);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_avx2);
-
- static void poly1305_simd_mult(u32 *a, const u32 *b)
- {
-@@ -64,7 +66,7 @@ static unsigned int poly1305_simd_blocks
- }
-
- if (IS_ENABLED(CONFIG_AS_AVX2) &&
-- poly1305_use_avx2 &&
-+ static_branch_likely(&poly1305_use_avx2) &&
- srclen >= POLY1305_BLOCK_SIZE * 4) {
- if (unlikely(dctx->rset < 4)) {
- if (dctx->rset < 2) {
-@@ -103,10 +105,15 @@ static unsigned int poly1305_simd_blocks
- return srclen;
- }
-
--static int poly1305_simd_update(struct shash_desc *desc,
-- const u8 *src, unsigned int srclen)
-+void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key)
-+{
-+ poly1305_init_generic(desc, key);
-+}
-+EXPORT_SYMBOL(poly1305_init_arch);
-+
-+void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ unsigned int srclen)
- {
-- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
- unsigned int bytes;
-
- if (unlikely(dctx->buflen)) {
-@@ -117,7 +124,8 @@ static int poly1305_simd_update(struct s
- dctx->buflen += bytes;
-
- if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-- if (likely(crypto_simd_usable())) {
-+ if (static_branch_likely(&poly1305_use_simd) &&
-+ likely(crypto_simd_usable())) {
- kernel_fpu_begin();
- poly1305_simd_blocks(dctx, dctx->buf,
- POLY1305_BLOCK_SIZE);
-@@ -131,7 +139,8 @@ static int poly1305_simd_update(struct s
- }
-
- if (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-- if (likely(crypto_simd_usable())) {
-+ if (static_branch_likely(&poly1305_use_simd) &&
-+ likely(crypto_simd_usable())) {
- kernel_fpu_begin();
- bytes = poly1305_simd_blocks(dctx, src, srclen);
- kernel_fpu_end();
-@@ -147,6 +156,13 @@ static int poly1305_simd_update(struct s
- memcpy(dctx->buf, src, srclen);
- }
- }
-+EXPORT_SYMBOL(poly1305_update_arch);
-+
-+void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *digest)
-+{
-+ poly1305_final_generic(desc, digest);
-+}
-+EXPORT_SYMBOL(poly1305_final_arch);
-
- static int crypto_poly1305_init(struct shash_desc *desc)
- {
-@@ -171,6 +187,15 @@ static int crypto_poly1305_final(struct
- return 0;
- }
-
-+static int poly1305_simd_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ poly1305_update_arch(dctx, src, srclen);
-+ return 0;
-+}
-+
- static struct shash_alg alg = {
- .digestsize = POLY1305_DIGEST_SIZE,
- .init = crypto_poly1305_init,
-@@ -189,15 +214,15 @@ static struct shash_alg alg = {
- static int __init poly1305_simd_mod_init(void)
- {
- if (!boot_cpu_has(X86_FEATURE_XMM2))
-- return -ENODEV;
-+ return 0;
-
-- poly1305_use_avx2 = IS_ENABLED(CONFIG_AS_AVX2) &&
-- boot_cpu_has(X86_FEATURE_AVX) &&
-- boot_cpu_has(X86_FEATURE_AVX2) &&
-- cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL);
-- alg.descsize = sizeof(struct poly1305_desc_ctx) + 5 * sizeof(u32);
-- if (poly1305_use_avx2)
-- alg.descsize += 10 * sizeof(u32);
-+ static_branch_enable(&poly1305_use_simd);
-+
-+ if (IS_ENABLED(CONFIG_AS_AVX2) &&
-+ boot_cpu_has(X86_FEATURE_AVX) &&
-+ boot_cpu_has(X86_FEATURE_AVX2) &&
-+ cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
-+ static_branch_enable(&poly1305_use_avx2);
-
- return crypto_register_shash(&alg);
- }
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -698,6 +698,7 @@ config CRYPTO_POLY1305_X86_64
- tristate "Poly1305 authenticator algorithm (x86_64/SSE2/AVX2)"
- depends on X86 && 64BIT
- select CRYPTO_LIB_POLY1305_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_POLY1305
- help
- Poly1305 authenticator algorithm, RFC7539.
-
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -39,6 +39,7 @@ config CRYPTO_LIB_DES
-
- config CRYPTO_LIB_POLY1305_RSIZE
- int
-+ default 4 if X86_64
- default 1
-
- config CRYPTO_ARCH_HAVE_LIB_POLY1305
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0018-crypto-arm64-poly1305-incorporate-OpenSSL-CRYPTOGAMS.patch b/target/linux/generic/backport-5.4/080-wireguard-0018-crypto-arm64-poly1305-incorporate-OpenSSL-CRYPTOGAMS.patch
deleted file mode 100644
index 464c6568f6..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0018-crypto-arm64-poly1305-incorporate-OpenSSL-CRYPTOGAMS.patch
+++ /dev/null
@@ -1,2083 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:24 +0100
-Subject: [PATCH] crypto: arm64/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON
- implementation
-
-commit f569ca16475155013525686d0f73bc379c67e635 upstream.
-
-This is a straight import of the OpenSSL/CRYPTOGAMS Poly1305 implementation
-for NEON authored by Andy Polyakov, and contributed by him to the OpenSSL
-project. The file 'poly1305-armv8.pl' is taken straight from this upstream
-GitHub repository [0] at commit ec55a08dc0244ce570c4fc7cade330c60798952f,
-and already contains all the changes required to build it as part of a
-Linux kernel module.
-
-[0] https://github.com/dot-asm/cryptogams
-
-Co-developed-by: Andy Polyakov <appro@cryptogams.org>
-Signed-off-by: Andy Polyakov <appro@cryptogams.org>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm64/crypto/Kconfig | 6 +
- arch/arm64/crypto/Makefile | 10 +-
- arch/arm64/crypto/poly1305-armv8.pl | 913 ++++++++++++++++++++++
- arch/arm64/crypto/poly1305-core.S_shipped | 835 ++++++++++++++++++++
- arch/arm64/crypto/poly1305-glue.c | 237 ++++++
- lib/crypto/Kconfig | 1 +
- 6 files changed, 2001 insertions(+), 1 deletion(-)
- create mode 100644 arch/arm64/crypto/poly1305-armv8.pl
- create mode 100644 arch/arm64/crypto/poly1305-core.S_shipped
- create mode 100644 arch/arm64/crypto/poly1305-glue.c
-
---- a/arch/arm64/crypto/Kconfig
-+++ b/arch/arm64/crypto/Kconfig
-@@ -106,6 +106,12 @@ config CRYPTO_CHACHA20_NEON
- select CRYPTO_LIB_CHACHA_GENERIC
- select CRYPTO_ARCH_HAVE_LIB_CHACHA
-
-+config CRYPTO_POLY1305_NEON
-+ tristate "Poly1305 hash function using scalar or NEON instructions"
-+ depends on KERNEL_MODE_NEON
-+ select CRYPTO_HASH
-+ select CRYPTO_ARCH_HAVE_LIB_POLY1305
-+
- config CRYPTO_NHPOLY1305_NEON
- tristate "NHPoly1305 hash function using NEON instructions (for Adiantum)"
- depends on KERNEL_MODE_NEON
---- a/arch/arm64/crypto/Makefile
-+++ b/arch/arm64/crypto/Makefile
-@@ -50,6 +50,10 @@ sha512-arm64-y := sha512-glue.o sha512-c
- obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
- chacha-neon-y := chacha-neon-core.o chacha-neon-glue.o
-
-+obj-$(CONFIG_CRYPTO_POLY1305_NEON) += poly1305-neon.o
-+poly1305-neon-y := poly1305-core.o poly1305-glue.o
-+AFLAGS_poly1305-core.o += -Dpoly1305_init=poly1305_init_arm64
-+
- obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
- nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
-
-@@ -68,11 +72,15 @@ ifdef REGENERATE_ARM64_CRYPTO
- quiet_cmd_perlasm = PERLASM $@
- cmd_perlasm = $(PERL) $(<) void $(@)
-
-+$(src)/poly1305-core.S_shipped: $(src)/poly1305-armv8.pl
-+ $(call cmd,perlasm)
-+
- $(src)/sha256-core.S_shipped: $(src)/sha512-armv8.pl
- $(call cmd,perlasm)
-
- $(src)/sha512-core.S_shipped: $(src)/sha512-armv8.pl
- $(call cmd,perlasm)
-+
- endif
-
--clean-files += sha256-core.S sha512-core.S
-+clean-files += poly1305-core.S sha256-core.S sha512-core.S
---- /dev/null
-+++ b/arch/arm64/crypto/poly1305-armv8.pl
-@@ -0,0 +1,913 @@
-+#!/usr/bin/env perl
-+# SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause
-+#
-+# ====================================================================
-+# Written by Andy Polyakov, @dot-asm, initially for the OpenSSL
-+# project.
-+# ====================================================================
-+#
-+# This module implements Poly1305 hash for ARMv8.
-+#
-+# June 2015
-+#
-+# Numbers are cycles per processed byte with poly1305_blocks alone.
-+#
-+# IALU/gcc-4.9 NEON
-+#
-+# Apple A7 1.86/+5% 0.72
-+# Cortex-A53 2.69/+58% 1.47
-+# Cortex-A57 2.70/+7% 1.14
-+# Denver 1.64/+50% 1.18(*)
-+# X-Gene 2.13/+68% 2.27
-+# Mongoose 1.77/+75% 1.12
-+# Kryo 2.70/+55% 1.13
-+# ThunderX2 1.17/+95% 1.36
-+#
-+# (*) estimate based on resources availability is less than 1.0,
-+# i.e. measured result is worse than expected, presumably binary
-+# translator is not almighty;
-+
-+$flavour=shift;
-+$output=shift;
-+
-+if ($flavour && $flavour ne "void") {
-+ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-+ ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-+ ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
-+ die "can't locate arm-xlate.pl";
-+
-+ open STDOUT,"| \"$^X\" $xlate $flavour $output";
-+} else {
-+ open STDOUT,">$output";
-+}
-+
-+my ($ctx,$inp,$len,$padbit) = map("x$_",(0..3));
-+my ($mac,$nonce)=($inp,$len);
-+
-+my ($h0,$h1,$h2,$r0,$r1,$s1,$t0,$t1,$d0,$d1,$d2) = map("x$_",(4..14));
-+
-+$code.=<<___;
-+#ifndef __KERNEL__
-+# include "arm_arch.h"
-+.extern OPENSSL_armcap_P
-+#endif
-+
-+.text
-+
-+// forward "declarations" are required for Apple
-+.globl poly1305_blocks
-+.globl poly1305_emit
-+
-+.globl poly1305_init
-+.type poly1305_init,%function
-+.align 5
-+poly1305_init:
-+ cmp $inp,xzr
-+ stp xzr,xzr,[$ctx] // zero hash value
-+ stp xzr,xzr,[$ctx,#16] // [along with is_base2_26]
-+
-+ csel x0,xzr,x0,eq
-+ b.eq .Lno_key
-+
-+#ifndef __KERNEL__
-+ adrp x17,OPENSSL_armcap_P
-+ ldr w17,[x17,#:lo12:OPENSSL_armcap_P]
-+#endif
-+
-+ ldp $r0,$r1,[$inp] // load key
-+ mov $s1,#0xfffffffc0fffffff
-+ movk $s1,#0x0fff,lsl#48
-+#ifdef __AARCH64EB__
-+ rev $r0,$r0 // flip bytes
-+ rev $r1,$r1
-+#endif
-+ and $r0,$r0,$s1 // &=0ffffffc0fffffff
-+ and $s1,$s1,#-4
-+ and $r1,$r1,$s1 // &=0ffffffc0ffffffc
-+ mov w#$s1,#-1
-+ stp $r0,$r1,[$ctx,#32] // save key value
-+ str w#$s1,[$ctx,#48] // impossible key power value
-+
-+#ifndef __KERNEL__
-+ tst w17,#ARMV7_NEON
-+
-+ adr $d0,.Lpoly1305_blocks
-+ adr $r0,.Lpoly1305_blocks_neon
-+ adr $d1,.Lpoly1305_emit
-+
-+ csel $d0,$d0,$r0,eq
-+
-+# ifdef __ILP32__
-+ stp w#$d0,w#$d1,[$len]
-+# else
-+ stp $d0,$d1,[$len]
-+# endif
-+#endif
-+ mov x0,#1
-+.Lno_key:
-+ ret
-+.size poly1305_init,.-poly1305_init
-+
-+.type poly1305_blocks,%function
-+.align 5
-+poly1305_blocks:
-+.Lpoly1305_blocks:
-+ ands $len,$len,#-16
-+ b.eq .Lno_data
-+
-+ ldp $h0,$h1,[$ctx] // load hash value
-+ ldp $h2,x17,[$ctx,#16] // [along with is_base2_26]
-+ ldp $r0,$r1,[$ctx,#32] // load key value
-+
-+#ifdef __AARCH64EB__
-+ lsr $d0,$h0,#32
-+ mov w#$d1,w#$h0
-+ lsr $d2,$h1,#32
-+ mov w15,w#$h1
-+ lsr x16,$h2,#32
-+#else
-+ mov w#$d0,w#$h0
-+ lsr $d1,$h0,#32
-+ mov w#$d2,w#$h1
-+ lsr x15,$h1,#32
-+ mov w16,w#$h2
-+#endif
-+
-+ add $d0,$d0,$d1,lsl#26 // base 2^26 -> base 2^64
-+ lsr $d1,$d2,#12
-+ adds $d0,$d0,$d2,lsl#52
-+ add $d1,$d1,x15,lsl#14
-+ adc $d1,$d1,xzr
-+ lsr $d2,x16,#24
-+ adds $d1,$d1,x16,lsl#40
-+ adc $d2,$d2,xzr
-+
-+ cmp x17,#0 // is_base2_26?
-+ add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2)
-+ csel $h0,$h0,$d0,eq // choose between radixes
-+ csel $h1,$h1,$d1,eq
-+ csel $h2,$h2,$d2,eq
-+
-+.Loop:
-+ ldp $t0,$t1,[$inp],#16 // load input
-+ sub $len,$len,#16
-+#ifdef __AARCH64EB__
-+ rev $t0,$t0
-+ rev $t1,$t1
-+#endif
-+ adds $h0,$h0,$t0 // accumulate input
-+ adcs $h1,$h1,$t1
-+
-+ mul $d0,$h0,$r0 // h0*r0
-+ adc $h2,$h2,$padbit
-+ umulh $d1,$h0,$r0
-+
-+ mul $t0,$h1,$s1 // h1*5*r1
-+ umulh $t1,$h1,$s1
-+
-+ adds $d0,$d0,$t0
-+ mul $t0,$h0,$r1 // h0*r1
-+ adc $d1,$d1,$t1
-+ umulh $d2,$h0,$r1
-+
-+ adds $d1,$d1,$t0
-+ mul $t0,$h1,$r0 // h1*r0
-+ adc $d2,$d2,xzr
-+ umulh $t1,$h1,$r0
-+
-+ adds $d1,$d1,$t0
-+ mul $t0,$h2,$s1 // h2*5*r1
-+ adc $d2,$d2,$t1
-+ mul $t1,$h2,$r0 // h2*r0
-+
-+ adds $d1,$d1,$t0
-+ adc $d2,$d2,$t1
-+
-+ and $t0,$d2,#-4 // final reduction
-+ and $h2,$d2,#3
-+ add $t0,$t0,$d2,lsr#2
-+ adds $h0,$d0,$t0
-+ adcs $h1,$d1,xzr
-+ adc $h2,$h2,xzr
-+
-+ cbnz $len,.Loop
-+
-+ stp $h0,$h1,[$ctx] // store hash value
-+ stp $h2,xzr,[$ctx,#16] // [and clear is_base2_26]
-+
-+.Lno_data:
-+ ret
-+.size poly1305_blocks,.-poly1305_blocks
-+
-+.type poly1305_emit,%function
-+.align 5
-+poly1305_emit:
-+.Lpoly1305_emit:
-+ ldp $h0,$h1,[$ctx] // load hash base 2^64
-+ ldp $h2,$r0,[$ctx,#16] // [along with is_base2_26]
-+ ldp $t0,$t1,[$nonce] // load nonce
-+
-+#ifdef __AARCH64EB__
-+ lsr $d0,$h0,#32
-+ mov w#$d1,w#$h0
-+ lsr $d2,$h1,#32
-+ mov w15,w#$h1
-+ lsr x16,$h2,#32
-+#else
-+ mov w#$d0,w#$h0
-+ lsr $d1,$h0,#32
-+ mov w#$d2,w#$h1
-+ lsr x15,$h1,#32
-+ mov w16,w#$h2
-+#endif
-+
-+ add $d0,$d0,$d1,lsl#26 // base 2^26 -> base 2^64
-+ lsr $d1,$d2,#12
-+ adds $d0,$d0,$d2,lsl#52
-+ add $d1,$d1,x15,lsl#14
-+ adc $d1,$d1,xzr
-+ lsr $d2,x16,#24
-+ adds $d1,$d1,x16,lsl#40
-+ adc $d2,$d2,xzr
-+
-+ cmp $r0,#0 // is_base2_26?
-+ csel $h0,$h0,$d0,eq // choose between radixes
-+ csel $h1,$h1,$d1,eq
-+ csel $h2,$h2,$d2,eq
-+
-+ adds $d0,$h0,#5 // compare to modulus
-+ adcs $d1,$h1,xzr
-+ adc $d2,$h2,xzr
-+
-+ tst $d2,#-4 // see if it's carried/borrowed
-+
-+ csel $h0,$h0,$d0,eq
-+ csel $h1,$h1,$d1,eq
-+
-+#ifdef __AARCH64EB__
-+ ror $t0,$t0,#32 // flip nonce words
-+ ror $t1,$t1,#32
-+#endif
-+ adds $h0,$h0,$t0 // accumulate nonce
-+ adc $h1,$h1,$t1
-+#ifdef __AARCH64EB__
-+ rev $h0,$h0 // flip output bytes
-+ rev $h1,$h1
-+#endif
-+ stp $h0,$h1,[$mac] // write result
-+
-+ ret
-+.size poly1305_emit,.-poly1305_emit
-+___
-+my ($R0,$R1,$S1,$R2,$S2,$R3,$S3,$R4,$S4) = map("v$_.4s",(0..8));
-+my ($IN01_0,$IN01_1,$IN01_2,$IN01_3,$IN01_4) = map("v$_.2s",(9..13));
-+my ($IN23_0,$IN23_1,$IN23_2,$IN23_3,$IN23_4) = map("v$_.2s",(14..18));
-+my ($ACC0,$ACC1,$ACC2,$ACC3,$ACC4) = map("v$_.2d",(19..23));
-+my ($H0,$H1,$H2,$H3,$H4) = map("v$_.2s",(24..28));
-+my ($T0,$T1,$MASK) = map("v$_",(29..31));
-+
-+my ($in2,$zeros)=("x16","x17");
-+my $is_base2_26 = $zeros; # borrow
-+
-+$code.=<<___;
-+.type poly1305_mult,%function
-+.align 5
-+poly1305_mult:
-+ mul $d0,$h0,$r0 // h0*r0
-+ umulh $d1,$h0,$r0
-+
-+ mul $t0,$h1,$s1 // h1*5*r1
-+ umulh $t1,$h1,$s1
-+
-+ adds $d0,$d0,$t0
-+ mul $t0,$h0,$r1 // h0*r1
-+ adc $d1,$d1,$t1
-+ umulh $d2,$h0,$r1
-+
-+ adds $d1,$d1,$t0
-+ mul $t0,$h1,$r0 // h1*r0
-+ adc $d2,$d2,xzr
-+ umulh $t1,$h1,$r0
-+
-+ adds $d1,$d1,$t0
-+ mul $t0,$h2,$s1 // h2*5*r1
-+ adc $d2,$d2,$t1
-+ mul $t1,$h2,$r0 // h2*r0
-+
-+ adds $d1,$d1,$t0
-+ adc $d2,$d2,$t1
-+
-+ and $t0,$d2,#-4 // final reduction
-+ and $h2,$d2,#3
-+ add $t0,$t0,$d2,lsr#2
-+ adds $h0,$d0,$t0
-+ adcs $h1,$d1,xzr
-+ adc $h2,$h2,xzr
-+
-+ ret
-+.size poly1305_mult,.-poly1305_mult
-+
-+.type poly1305_splat,%function
-+.align 4
-+poly1305_splat:
-+ and x12,$h0,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x13,$h0,#26,#26
-+ extr x14,$h1,$h0,#52
-+ and x14,x14,#0x03ffffff
-+ ubfx x15,$h1,#14,#26
-+ extr x16,$h2,$h1,#40
-+
-+ str w12,[$ctx,#16*0] // r0
-+ add w12,w13,w13,lsl#2 // r1*5
-+ str w13,[$ctx,#16*1] // r1
-+ add w13,w14,w14,lsl#2 // r2*5
-+ str w12,[$ctx,#16*2] // s1
-+ str w14,[$ctx,#16*3] // r2
-+ add w14,w15,w15,lsl#2 // r3*5
-+ str w13,[$ctx,#16*4] // s2
-+ str w15,[$ctx,#16*5] // r3
-+ add w15,w16,w16,lsl#2 // r4*5
-+ str w14,[$ctx,#16*6] // s3
-+ str w16,[$ctx,#16*7] // r4
-+ str w15,[$ctx,#16*8] // s4
-+
-+ ret
-+.size poly1305_splat,.-poly1305_splat
-+
-+#ifdef __KERNEL__
-+.globl poly1305_blocks_neon
-+#endif
-+.type poly1305_blocks_neon,%function
-+.align 5
-+poly1305_blocks_neon:
-+.Lpoly1305_blocks_neon:
-+ ldr $is_base2_26,[$ctx,#24]
-+ cmp $len,#128
-+ b.lo .Lpoly1305_blocks
-+
-+ .inst 0xd503233f // paciasp
-+ stp x29,x30,[sp,#-80]!
-+ add x29,sp,#0
-+
-+ stp d8,d9,[sp,#16] // meet ABI requirements
-+ stp d10,d11,[sp,#32]
-+ stp d12,d13,[sp,#48]
-+ stp d14,d15,[sp,#64]
-+
-+ cbz $is_base2_26,.Lbase2_64_neon
-+
-+ ldp w10,w11,[$ctx] // load hash value base 2^26
-+ ldp w12,w13,[$ctx,#8]
-+ ldr w14,[$ctx,#16]
-+
-+ tst $len,#31
-+ b.eq .Leven_neon
-+
-+ ldp $r0,$r1,[$ctx,#32] // load key value
-+
-+ add $h0,x10,x11,lsl#26 // base 2^26 -> base 2^64
-+ lsr $h1,x12,#12
-+ adds $h0,$h0,x12,lsl#52
-+ add $h1,$h1,x13,lsl#14
-+ adc $h1,$h1,xzr
-+ lsr $h2,x14,#24
-+ adds $h1,$h1,x14,lsl#40
-+ adc $d2,$h2,xzr // can be partially reduced...
-+
-+ ldp $d0,$d1,[$inp],#16 // load input
-+ sub $len,$len,#16
-+ add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2)
-+
-+#ifdef __AARCH64EB__
-+ rev $d0,$d0
-+ rev $d1,$d1
-+#endif
-+ adds $h0,$h0,$d0 // accumulate input
-+ adcs $h1,$h1,$d1
-+ adc $h2,$h2,$padbit
-+
-+ bl poly1305_mult
-+
-+ and x10,$h0,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x11,$h0,#26,#26
-+ extr x12,$h1,$h0,#52
-+ and x12,x12,#0x03ffffff
-+ ubfx x13,$h1,#14,#26
-+ extr x14,$h2,$h1,#40
-+
-+ b .Leven_neon
-+
-+.align 4
-+.Lbase2_64_neon:
-+ ldp $r0,$r1,[$ctx,#32] // load key value
-+
-+ ldp $h0,$h1,[$ctx] // load hash value base 2^64
-+ ldr $h2,[$ctx,#16]
-+
-+ tst $len,#31
-+ b.eq .Linit_neon
-+
-+ ldp $d0,$d1,[$inp],#16 // load input
-+ sub $len,$len,#16
-+ add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2)
-+#ifdef __AARCH64EB__
-+ rev $d0,$d0
-+ rev $d1,$d1
-+#endif
-+ adds $h0,$h0,$d0 // accumulate input
-+ adcs $h1,$h1,$d1
-+ adc $h2,$h2,$padbit
-+
-+ bl poly1305_mult
-+
-+.Linit_neon:
-+ ldr w17,[$ctx,#48] // first table element
-+ and x10,$h0,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x11,$h0,#26,#26
-+ extr x12,$h1,$h0,#52
-+ and x12,x12,#0x03ffffff
-+ ubfx x13,$h1,#14,#26
-+ extr x14,$h2,$h1,#40
-+
-+ cmp w17,#-1 // is value impossible?
-+ b.ne .Leven_neon
-+
-+ fmov ${H0},x10
-+ fmov ${H1},x11
-+ fmov ${H2},x12
-+ fmov ${H3},x13
-+ fmov ${H4},x14
-+
-+ ////////////////////////////////// initialize r^n table
-+ mov $h0,$r0 // r^1
-+ add $s1,$r1,$r1,lsr#2 // s1 = r1 + (r1 >> 2)
-+ mov $h1,$r1
-+ mov $h2,xzr
-+ add $ctx,$ctx,#48+12
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^2
-+ sub $ctx,$ctx,#4
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^3
-+ sub $ctx,$ctx,#4
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^4
-+ sub $ctx,$ctx,#4
-+ bl poly1305_splat
-+ sub $ctx,$ctx,#48 // restore original $ctx
-+ b .Ldo_neon
-+
-+.align 4
-+.Leven_neon:
-+ fmov ${H0},x10
-+ fmov ${H1},x11
-+ fmov ${H2},x12
-+ fmov ${H3},x13
-+ fmov ${H4},x14
-+
-+.Ldo_neon:
-+ ldp x8,x12,[$inp,#32] // inp[2:3]
-+ subs $len,$len,#64
-+ ldp x9,x13,[$inp,#48]
-+ add $in2,$inp,#96
-+ adr $zeros,.Lzeros
-+
-+ lsl $padbit,$padbit,#24
-+ add x15,$ctx,#48
-+
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ and x5,x9,#0x03ffffff
-+ ubfx x6,x8,#26,#26
-+ ubfx x7,x9,#26,#26
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ extr x8,x12,x8,#52
-+ extr x9,x13,x9,#52
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ fmov $IN23_0,x4
-+ and x8,x8,#0x03ffffff
-+ and x9,x9,#0x03ffffff
-+ ubfx x10,x12,#14,#26
-+ ubfx x11,x13,#14,#26
-+ add x12,$padbit,x12,lsr#40
-+ add x13,$padbit,x13,lsr#40
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ fmov $IN23_1,x6
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ fmov $IN23_2,x8
-+ fmov $IN23_3,x10
-+ fmov $IN23_4,x12
-+
-+ ldp x8,x12,[$inp],#16 // inp[0:1]
-+ ldp x9,x13,[$inp],#48
-+
-+ ld1 {$R0,$R1,$S1,$R2},[x15],#64
-+ ld1 {$S2,$R3,$S3,$R4},[x15],#64
-+ ld1 {$S4},[x15]
-+
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ and x5,x9,#0x03ffffff
-+ ubfx x6,x8,#26,#26
-+ ubfx x7,x9,#26,#26
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ extr x8,x12,x8,#52
-+ extr x9,x13,x9,#52
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ fmov $IN01_0,x4
-+ and x8,x8,#0x03ffffff
-+ and x9,x9,#0x03ffffff
-+ ubfx x10,x12,#14,#26
-+ ubfx x11,x13,#14,#26
-+ add x12,$padbit,x12,lsr#40
-+ add x13,$padbit,x13,lsr#40
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ fmov $IN01_1,x6
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ movi $MASK.2d,#-1
-+ fmov $IN01_2,x8
-+ fmov $IN01_3,x10
-+ fmov $IN01_4,x12
-+ ushr $MASK.2d,$MASK.2d,#38
-+
-+ b.ls .Lskip_loop
-+
-+.align 4
-+.Loop_neon:
-+ ////////////////////////////////////////////////////////////////
-+ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2
-+ // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r
-+ // \___________________/
-+ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2
-+ // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r
-+ // \___________________/ \____________________/
-+ //
-+ // Note that we start with inp[2:3]*r^2. This is because it
-+ // doesn't depend on reduction in previous iteration.
-+ ////////////////////////////////////////////////////////////////
-+ // d4 = h0*r4 + h1*r3 + h2*r2 + h3*r1 + h4*r0
-+ // d3 = h0*r3 + h1*r2 + h2*r1 + h3*r0 + h4*5*r4
-+ // d2 = h0*r2 + h1*r1 + h2*r0 + h3*5*r4 + h4*5*r3
-+ // d1 = h0*r1 + h1*r0 + h2*5*r4 + h3*5*r3 + h4*5*r2
-+ // d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1
-+
-+ subs $len,$len,#64
-+ umull $ACC4,$IN23_0,${R4}[2]
-+ csel $in2,$zeros,$in2,lo
-+ umull $ACC3,$IN23_0,${R3}[2]
-+ umull $ACC2,$IN23_0,${R2}[2]
-+ ldp x8,x12,[$in2],#16 // inp[2:3] (or zero)
-+ umull $ACC1,$IN23_0,${R1}[2]
-+ ldp x9,x13,[$in2],#48
-+ umull $ACC0,$IN23_0,${R0}[2]
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+
-+ umlal $ACC4,$IN23_1,${R3}[2]
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ umlal $ACC3,$IN23_1,${R2}[2]
-+ and x5,x9,#0x03ffffff
-+ umlal $ACC2,$IN23_1,${R1}[2]
-+ ubfx x6,x8,#26,#26
-+ umlal $ACC1,$IN23_1,${R0}[2]
-+ ubfx x7,x9,#26,#26
-+ umlal $ACC0,$IN23_1,${S4}[2]
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+
-+ umlal $ACC4,$IN23_2,${R2}[2]
-+ extr x8,x12,x8,#52
-+ umlal $ACC3,$IN23_2,${R1}[2]
-+ extr x9,x13,x9,#52
-+ umlal $ACC2,$IN23_2,${R0}[2]
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ umlal $ACC1,$IN23_2,${S4}[2]
-+ fmov $IN23_0,x4
-+ umlal $ACC0,$IN23_2,${S3}[2]
-+ and x8,x8,#0x03ffffff
-+
-+ umlal $ACC4,$IN23_3,${R1}[2]
-+ and x9,x9,#0x03ffffff
-+ umlal $ACC3,$IN23_3,${R0}[2]
-+ ubfx x10,x12,#14,#26
-+ umlal $ACC2,$IN23_3,${S4}[2]
-+ ubfx x11,x13,#14,#26
-+ umlal $ACC1,$IN23_3,${S3}[2]
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ umlal $ACC0,$IN23_3,${S2}[2]
-+ fmov $IN23_1,x6
-+
-+ add $IN01_2,$IN01_2,$H2
-+ add x12,$padbit,x12,lsr#40
-+ umlal $ACC4,$IN23_4,${R0}[2]
-+ add x13,$padbit,x13,lsr#40
-+ umlal $ACC3,$IN23_4,${S4}[2]
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ umlal $ACC2,$IN23_4,${S3}[2]
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ umlal $ACC1,$IN23_4,${S2}[2]
-+ fmov $IN23_2,x8
-+ umlal $ACC0,$IN23_4,${S1}[2]
-+ fmov $IN23_3,x10
-+
-+ ////////////////////////////////////////////////////////////////
-+ // (hash+inp[0:1])*r^4 and accumulate
-+
-+ add $IN01_0,$IN01_0,$H0
-+ fmov $IN23_4,x12
-+ umlal $ACC3,$IN01_2,${R1}[0]
-+ ldp x8,x12,[$inp],#16 // inp[0:1]
-+ umlal $ACC0,$IN01_2,${S3}[0]
-+ ldp x9,x13,[$inp],#48
-+ umlal $ACC4,$IN01_2,${R2}[0]
-+ umlal $ACC1,$IN01_2,${S4}[0]
-+ umlal $ACC2,$IN01_2,${R0}[0]
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+
-+ add $IN01_1,$IN01_1,$H1
-+ umlal $ACC3,$IN01_0,${R3}[0]
-+ umlal $ACC4,$IN01_0,${R4}[0]
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ umlal $ACC2,$IN01_0,${R2}[0]
-+ and x5,x9,#0x03ffffff
-+ umlal $ACC0,$IN01_0,${R0}[0]
-+ ubfx x6,x8,#26,#26
-+ umlal $ACC1,$IN01_0,${R1}[0]
-+ ubfx x7,x9,#26,#26
-+
-+ add $IN01_3,$IN01_3,$H3
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ umlal $ACC3,$IN01_1,${R2}[0]
-+ extr x8,x12,x8,#52
-+ umlal $ACC4,$IN01_1,${R3}[0]
-+ extr x9,x13,x9,#52
-+ umlal $ACC0,$IN01_1,${S4}[0]
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ umlal $ACC2,$IN01_1,${R1}[0]
-+ fmov $IN01_0,x4
-+ umlal $ACC1,$IN01_1,${R0}[0]
-+ and x8,x8,#0x03ffffff
-+
-+ add $IN01_4,$IN01_4,$H4
-+ and x9,x9,#0x03ffffff
-+ umlal $ACC3,$IN01_3,${R0}[0]
-+ ubfx x10,x12,#14,#26
-+ umlal $ACC0,$IN01_3,${S2}[0]
-+ ubfx x11,x13,#14,#26
-+ umlal $ACC4,$IN01_3,${R1}[0]
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ umlal $ACC1,$IN01_3,${S3}[0]
-+ fmov $IN01_1,x6
-+ umlal $ACC2,$IN01_3,${S4}[0]
-+ add x12,$padbit,x12,lsr#40
-+
-+ umlal $ACC3,$IN01_4,${S4}[0]
-+ add x13,$padbit,x13,lsr#40
-+ umlal $ACC0,$IN01_4,${S1}[0]
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ umlal $ACC4,$IN01_4,${R0}[0]
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ umlal $ACC1,$IN01_4,${S2}[0]
-+ fmov $IN01_2,x8
-+ umlal $ACC2,$IN01_4,${S3}[0]
-+ fmov $IN01_3,x10
-+ fmov $IN01_4,x12
-+
-+ /////////////////////////////////////////////////////////////////
-+ // lazy reduction as discussed in "NEON crypto" by D.J. Bernstein
-+ // and P. Schwabe
-+ //
-+ // [see discussion in poly1305-armv4 module]
-+
-+ ushr $T0.2d,$ACC3,#26
-+ xtn $H3,$ACC3
-+ ushr $T1.2d,$ACC0,#26
-+ and $ACC0,$ACC0,$MASK.2d
-+ add $ACC4,$ACC4,$T0.2d // h3 -> h4
-+ bic $H3,#0xfc,lsl#24 // &=0x03ffffff
-+ add $ACC1,$ACC1,$T1.2d // h0 -> h1
-+
-+ ushr $T0.2d,$ACC4,#26
-+ xtn $H4,$ACC4
-+ ushr $T1.2d,$ACC1,#26
-+ xtn $H1,$ACC1
-+ bic $H4,#0xfc,lsl#24
-+ add $ACC2,$ACC2,$T1.2d // h1 -> h2
-+
-+ add $ACC0,$ACC0,$T0.2d
-+ shl $T0.2d,$T0.2d,#2
-+ shrn $T1.2s,$ACC2,#26
-+ xtn $H2,$ACC2
-+ add $ACC0,$ACC0,$T0.2d // h4 -> h0
-+ bic $H1,#0xfc,lsl#24
-+ add $H3,$H3,$T1.2s // h2 -> h3
-+ bic $H2,#0xfc,lsl#24
-+
-+ shrn $T0.2s,$ACC0,#26
-+ xtn $H0,$ACC0
-+ ushr $T1.2s,$H3,#26
-+ bic $H3,#0xfc,lsl#24
-+ bic $H0,#0xfc,lsl#24
-+ add $H1,$H1,$T0.2s // h0 -> h1
-+ add $H4,$H4,$T1.2s // h3 -> h4
-+
-+ b.hi .Loop_neon
-+
-+.Lskip_loop:
-+ dup $IN23_2,${IN23_2}[0]
-+ add $IN01_2,$IN01_2,$H2
-+
-+ ////////////////////////////////////////////////////////////////
-+ // multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1
-+
-+ adds $len,$len,#32
-+ b.ne .Long_tail
-+
-+ dup $IN23_2,${IN01_2}[0]
-+ add $IN23_0,$IN01_0,$H0
-+ add $IN23_3,$IN01_3,$H3
-+ add $IN23_1,$IN01_1,$H1
-+ add $IN23_4,$IN01_4,$H4
-+
-+.Long_tail:
-+ dup $IN23_0,${IN23_0}[0]
-+ umull2 $ACC0,$IN23_2,${S3}
-+ umull2 $ACC3,$IN23_2,${R1}
-+ umull2 $ACC4,$IN23_2,${R2}
-+ umull2 $ACC2,$IN23_2,${R0}
-+ umull2 $ACC1,$IN23_2,${S4}
-+
-+ dup $IN23_1,${IN23_1}[0]
-+ umlal2 $ACC0,$IN23_0,${R0}
-+ umlal2 $ACC2,$IN23_0,${R2}
-+ umlal2 $ACC3,$IN23_0,${R3}
-+ umlal2 $ACC4,$IN23_0,${R4}
-+ umlal2 $ACC1,$IN23_0,${R1}
-+
-+ dup $IN23_3,${IN23_3}[0]
-+ umlal2 $ACC0,$IN23_1,${S4}
-+ umlal2 $ACC3,$IN23_1,${R2}
-+ umlal2 $ACC2,$IN23_1,${R1}
-+ umlal2 $ACC4,$IN23_1,${R3}
-+ umlal2 $ACC1,$IN23_1,${R0}
-+
-+ dup $IN23_4,${IN23_4}[0]
-+ umlal2 $ACC3,$IN23_3,${R0}
-+ umlal2 $ACC4,$IN23_3,${R1}
-+ umlal2 $ACC0,$IN23_3,${S2}
-+ umlal2 $ACC1,$IN23_3,${S3}
-+ umlal2 $ACC2,$IN23_3,${S4}
-+
-+ umlal2 $ACC3,$IN23_4,${S4}
-+ umlal2 $ACC0,$IN23_4,${S1}
-+ umlal2 $ACC4,$IN23_4,${R0}
-+ umlal2 $ACC1,$IN23_4,${S2}
-+ umlal2 $ACC2,$IN23_4,${S3}
-+
-+ b.eq .Lshort_tail
-+
-+ ////////////////////////////////////////////////////////////////
-+ // (hash+inp[0:1])*r^4:r^3 and accumulate
-+
-+ add $IN01_0,$IN01_0,$H0
-+ umlal $ACC3,$IN01_2,${R1}
-+ umlal $ACC0,$IN01_2,${S3}
-+ umlal $ACC4,$IN01_2,${R2}
-+ umlal $ACC1,$IN01_2,${S4}
-+ umlal $ACC2,$IN01_2,${R0}
-+
-+ add $IN01_1,$IN01_1,$H1
-+ umlal $ACC3,$IN01_0,${R3}
-+ umlal $ACC0,$IN01_0,${R0}
-+ umlal $ACC4,$IN01_0,${R4}
-+ umlal $ACC1,$IN01_0,${R1}
-+ umlal $ACC2,$IN01_0,${R2}
-+
-+ add $IN01_3,$IN01_3,$H3
-+ umlal $ACC3,$IN01_1,${R2}
-+ umlal $ACC0,$IN01_1,${S4}
-+ umlal $ACC4,$IN01_1,${R3}
-+ umlal $ACC1,$IN01_1,${R0}
-+ umlal $ACC2,$IN01_1,${R1}
-+
-+ add $IN01_4,$IN01_4,$H4
-+ umlal $ACC3,$IN01_3,${R0}
-+ umlal $ACC0,$IN01_3,${S2}
-+ umlal $ACC4,$IN01_3,${R1}
-+ umlal $ACC1,$IN01_3,${S3}
-+ umlal $ACC2,$IN01_3,${S4}
-+
-+ umlal $ACC3,$IN01_4,${S4}
-+ umlal $ACC0,$IN01_4,${S1}
-+ umlal $ACC4,$IN01_4,${R0}
-+ umlal $ACC1,$IN01_4,${S2}
-+ umlal $ACC2,$IN01_4,${S3}
-+
-+.Lshort_tail:
-+ ////////////////////////////////////////////////////////////////
-+ // horizontal add
-+
-+ addp $ACC3,$ACC3,$ACC3
-+ ldp d8,d9,[sp,#16] // meet ABI requirements
-+ addp $ACC0,$ACC0,$ACC0
-+ ldp d10,d11,[sp,#32]
-+ addp $ACC4,$ACC4,$ACC4
-+ ldp d12,d13,[sp,#48]
-+ addp $ACC1,$ACC1,$ACC1
-+ ldp d14,d15,[sp,#64]
-+ addp $ACC2,$ACC2,$ACC2
-+ ldr x30,[sp,#8]
-+ .inst 0xd50323bf // autiasp
-+
-+ ////////////////////////////////////////////////////////////////
-+ // lazy reduction, but without narrowing
-+
-+ ushr $T0.2d,$ACC3,#26
-+ and $ACC3,$ACC3,$MASK.2d
-+ ushr $T1.2d,$ACC0,#26
-+ and $ACC0,$ACC0,$MASK.2d
-+
-+ add $ACC4,$ACC4,$T0.2d // h3 -> h4
-+ add $ACC1,$ACC1,$T1.2d // h0 -> h1
-+
-+ ushr $T0.2d,$ACC4,#26
-+ and $ACC4,$ACC4,$MASK.2d
-+ ushr $T1.2d,$ACC1,#26
-+ and $ACC1,$ACC1,$MASK.2d
-+ add $ACC2,$ACC2,$T1.2d // h1 -> h2
-+
-+ add $ACC0,$ACC0,$T0.2d
-+ shl $T0.2d,$T0.2d,#2
-+ ushr $T1.2d,$ACC2,#26
-+ and $ACC2,$ACC2,$MASK.2d
-+ add $ACC0,$ACC0,$T0.2d // h4 -> h0
-+ add $ACC3,$ACC3,$T1.2d // h2 -> h3
-+
-+ ushr $T0.2d,$ACC0,#26
-+ and $ACC0,$ACC0,$MASK.2d
-+ ushr $T1.2d,$ACC3,#26
-+ and $ACC3,$ACC3,$MASK.2d
-+ add $ACC1,$ACC1,$T0.2d // h0 -> h1
-+ add $ACC4,$ACC4,$T1.2d // h3 -> h4
-+
-+ ////////////////////////////////////////////////////////////////
-+ // write the result, can be partially reduced
-+
-+ st4 {$ACC0,$ACC1,$ACC2,$ACC3}[0],[$ctx],#16
-+ mov x4,#1
-+ st1 {$ACC4}[0],[$ctx]
-+ str x4,[$ctx,#8] // set is_base2_26
-+
-+ ldr x29,[sp],#80
-+ ret
-+.size poly1305_blocks_neon,.-poly1305_blocks_neon
-+
-+.align 5
-+.Lzeros:
-+.long 0,0,0,0,0,0,0,0
-+.asciz "Poly1305 for ARMv8, CRYPTOGAMS by \@dot-asm"
-+.align 2
-+#if !defined(__KERNEL__) && !defined(_WIN64)
-+.comm OPENSSL_armcap_P,4,4
-+.hidden OPENSSL_armcap_P
-+#endif
-+___
-+
-+foreach (split("\n",$code)) {
-+ s/\b(shrn\s+v[0-9]+)\.[24]d/$1.2s/ or
-+ s/\b(fmov\s+)v([0-9]+)[^,]*,\s*x([0-9]+)/$1d$2,x$3/ or
-+ (m/\bdup\b/ and (s/\.[24]s/.2d/g or 1)) or
-+ (m/\b(eor|and)/ and (s/\.[248][sdh]/.16b/g or 1)) or
-+ (m/\bum(ul|la)l\b/ and (s/\.4s/.2s/g or 1)) or
-+ (m/\bum(ul|la)l2\b/ and (s/\.2s/.4s/g or 1)) or
-+ (m/\bst[1-4]\s+{[^}]+}\[/ and (s/\.[24]d/.s/g or 1));
-+
-+ s/\.[124]([sd])\[/.$1\[/;
-+ s/w#x([0-9]+)/w$1/g;
-+
-+ print $_,"\n";
-+}
-+close STDOUT;
---- /dev/null
-+++ b/arch/arm64/crypto/poly1305-core.S_shipped
-@@ -0,0 +1,835 @@
-+#ifndef __KERNEL__
-+# include "arm_arch.h"
-+.extern OPENSSL_armcap_P
-+#endif
-+
-+.text
-+
-+// forward "declarations" are required for Apple
-+.globl poly1305_blocks
-+.globl poly1305_emit
-+
-+.globl poly1305_init
-+.type poly1305_init,%function
-+.align 5
-+poly1305_init:
-+ cmp x1,xzr
-+ stp xzr,xzr,[x0] // zero hash value
-+ stp xzr,xzr,[x0,#16] // [along with is_base2_26]
-+
-+ csel x0,xzr,x0,eq
-+ b.eq .Lno_key
-+
-+#ifndef __KERNEL__
-+ adrp x17,OPENSSL_armcap_P
-+ ldr w17,[x17,#:lo12:OPENSSL_armcap_P]
-+#endif
-+
-+ ldp x7,x8,[x1] // load key
-+ mov x9,#0xfffffffc0fffffff
-+ movk x9,#0x0fff,lsl#48
-+#ifdef __AARCH64EB__
-+ rev x7,x7 // flip bytes
-+ rev x8,x8
-+#endif
-+ and x7,x7,x9 // &=0ffffffc0fffffff
-+ and x9,x9,#-4
-+ and x8,x8,x9 // &=0ffffffc0ffffffc
-+ mov w9,#-1
-+ stp x7,x8,[x0,#32] // save key value
-+ str w9,[x0,#48] // impossible key power value
-+
-+#ifndef __KERNEL__
-+ tst w17,#ARMV7_NEON
-+
-+ adr x12,.Lpoly1305_blocks
-+ adr x7,.Lpoly1305_blocks_neon
-+ adr x13,.Lpoly1305_emit
-+
-+ csel x12,x12,x7,eq
-+
-+# ifdef __ILP32__
-+ stp w12,w13,[x2]
-+# else
-+ stp x12,x13,[x2]
-+# endif
-+#endif
-+ mov x0,#1
-+.Lno_key:
-+ ret
-+.size poly1305_init,.-poly1305_init
-+
-+.type poly1305_blocks,%function
-+.align 5
-+poly1305_blocks:
-+.Lpoly1305_blocks:
-+ ands x2,x2,#-16
-+ b.eq .Lno_data
-+
-+ ldp x4,x5,[x0] // load hash value
-+ ldp x6,x17,[x0,#16] // [along with is_base2_26]
-+ ldp x7,x8,[x0,#32] // load key value
-+
-+#ifdef __AARCH64EB__
-+ lsr x12,x4,#32
-+ mov w13,w4
-+ lsr x14,x5,#32
-+ mov w15,w5
-+ lsr x16,x6,#32
-+#else
-+ mov w12,w4
-+ lsr x13,x4,#32
-+ mov w14,w5
-+ lsr x15,x5,#32
-+ mov w16,w6
-+#endif
-+
-+ add x12,x12,x13,lsl#26 // base 2^26 -> base 2^64
-+ lsr x13,x14,#12
-+ adds x12,x12,x14,lsl#52
-+ add x13,x13,x15,lsl#14
-+ adc x13,x13,xzr
-+ lsr x14,x16,#24
-+ adds x13,x13,x16,lsl#40
-+ adc x14,x14,xzr
-+
-+ cmp x17,#0 // is_base2_26?
-+ add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2)
-+ csel x4,x4,x12,eq // choose between radixes
-+ csel x5,x5,x13,eq
-+ csel x6,x6,x14,eq
-+
-+.Loop:
-+ ldp x10,x11,[x1],#16 // load input
-+ sub x2,x2,#16
-+#ifdef __AARCH64EB__
-+ rev x10,x10
-+ rev x11,x11
-+#endif
-+ adds x4,x4,x10 // accumulate input
-+ adcs x5,x5,x11
-+
-+ mul x12,x4,x7 // h0*r0
-+ adc x6,x6,x3
-+ umulh x13,x4,x7
-+
-+ mul x10,x5,x9 // h1*5*r1
-+ umulh x11,x5,x9
-+
-+ adds x12,x12,x10
-+ mul x10,x4,x8 // h0*r1
-+ adc x13,x13,x11
-+ umulh x14,x4,x8
-+
-+ adds x13,x13,x10
-+ mul x10,x5,x7 // h1*r0
-+ adc x14,x14,xzr
-+ umulh x11,x5,x7
-+
-+ adds x13,x13,x10
-+ mul x10,x6,x9 // h2*5*r1
-+ adc x14,x14,x11
-+ mul x11,x6,x7 // h2*r0
-+
-+ adds x13,x13,x10
-+ adc x14,x14,x11
-+
-+ and x10,x14,#-4 // final reduction
-+ and x6,x14,#3
-+ add x10,x10,x14,lsr#2
-+ adds x4,x12,x10
-+ adcs x5,x13,xzr
-+ adc x6,x6,xzr
-+
-+ cbnz x2,.Loop
-+
-+ stp x4,x5,[x0] // store hash value
-+ stp x6,xzr,[x0,#16] // [and clear is_base2_26]
-+
-+.Lno_data:
-+ ret
-+.size poly1305_blocks,.-poly1305_blocks
-+
-+.type poly1305_emit,%function
-+.align 5
-+poly1305_emit:
-+.Lpoly1305_emit:
-+ ldp x4,x5,[x0] // load hash base 2^64
-+ ldp x6,x7,[x0,#16] // [along with is_base2_26]
-+ ldp x10,x11,[x2] // load nonce
-+
-+#ifdef __AARCH64EB__
-+ lsr x12,x4,#32
-+ mov w13,w4
-+ lsr x14,x5,#32
-+ mov w15,w5
-+ lsr x16,x6,#32
-+#else
-+ mov w12,w4
-+ lsr x13,x4,#32
-+ mov w14,w5
-+ lsr x15,x5,#32
-+ mov w16,w6
-+#endif
-+
-+ add x12,x12,x13,lsl#26 // base 2^26 -> base 2^64
-+ lsr x13,x14,#12
-+ adds x12,x12,x14,lsl#52
-+ add x13,x13,x15,lsl#14
-+ adc x13,x13,xzr
-+ lsr x14,x16,#24
-+ adds x13,x13,x16,lsl#40
-+ adc x14,x14,xzr
-+
-+ cmp x7,#0 // is_base2_26?
-+ csel x4,x4,x12,eq // choose between radixes
-+ csel x5,x5,x13,eq
-+ csel x6,x6,x14,eq
-+
-+ adds x12,x4,#5 // compare to modulus
-+ adcs x13,x5,xzr
-+ adc x14,x6,xzr
-+
-+ tst x14,#-4 // see if it's carried/borrowed
-+
-+ csel x4,x4,x12,eq
-+ csel x5,x5,x13,eq
-+
-+#ifdef __AARCH64EB__
-+ ror x10,x10,#32 // flip nonce words
-+ ror x11,x11,#32
-+#endif
-+ adds x4,x4,x10 // accumulate nonce
-+ adc x5,x5,x11
-+#ifdef __AARCH64EB__
-+ rev x4,x4 // flip output bytes
-+ rev x5,x5
-+#endif
-+ stp x4,x5,[x1] // write result
-+
-+ ret
-+.size poly1305_emit,.-poly1305_emit
-+.type poly1305_mult,%function
-+.align 5
-+poly1305_mult:
-+ mul x12,x4,x7 // h0*r0
-+ umulh x13,x4,x7
-+
-+ mul x10,x5,x9 // h1*5*r1
-+ umulh x11,x5,x9
-+
-+ adds x12,x12,x10
-+ mul x10,x4,x8 // h0*r1
-+ adc x13,x13,x11
-+ umulh x14,x4,x8
-+
-+ adds x13,x13,x10
-+ mul x10,x5,x7 // h1*r0
-+ adc x14,x14,xzr
-+ umulh x11,x5,x7
-+
-+ adds x13,x13,x10
-+ mul x10,x6,x9 // h2*5*r1
-+ adc x14,x14,x11
-+ mul x11,x6,x7 // h2*r0
-+
-+ adds x13,x13,x10
-+ adc x14,x14,x11
-+
-+ and x10,x14,#-4 // final reduction
-+ and x6,x14,#3
-+ add x10,x10,x14,lsr#2
-+ adds x4,x12,x10
-+ adcs x5,x13,xzr
-+ adc x6,x6,xzr
-+
-+ ret
-+.size poly1305_mult,.-poly1305_mult
-+
-+.type poly1305_splat,%function
-+.align 4
-+poly1305_splat:
-+ and x12,x4,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x13,x4,#26,#26
-+ extr x14,x5,x4,#52
-+ and x14,x14,#0x03ffffff
-+ ubfx x15,x5,#14,#26
-+ extr x16,x6,x5,#40
-+
-+ str w12,[x0,#16*0] // r0
-+ add w12,w13,w13,lsl#2 // r1*5
-+ str w13,[x0,#16*1] // r1
-+ add w13,w14,w14,lsl#2 // r2*5
-+ str w12,[x0,#16*2] // s1
-+ str w14,[x0,#16*3] // r2
-+ add w14,w15,w15,lsl#2 // r3*5
-+ str w13,[x0,#16*4] // s2
-+ str w15,[x0,#16*5] // r3
-+ add w15,w16,w16,lsl#2 // r4*5
-+ str w14,[x0,#16*6] // s3
-+ str w16,[x0,#16*7] // r4
-+ str w15,[x0,#16*8] // s4
-+
-+ ret
-+.size poly1305_splat,.-poly1305_splat
-+
-+#ifdef __KERNEL__
-+.globl poly1305_blocks_neon
-+#endif
-+.type poly1305_blocks_neon,%function
-+.align 5
-+poly1305_blocks_neon:
-+.Lpoly1305_blocks_neon:
-+ ldr x17,[x0,#24]
-+ cmp x2,#128
-+ b.lo .Lpoly1305_blocks
-+
-+ .inst 0xd503233f // paciasp
-+ stp x29,x30,[sp,#-80]!
-+ add x29,sp,#0
-+
-+ stp d8,d9,[sp,#16] // meet ABI requirements
-+ stp d10,d11,[sp,#32]
-+ stp d12,d13,[sp,#48]
-+ stp d14,d15,[sp,#64]
-+
-+ cbz x17,.Lbase2_64_neon
-+
-+ ldp w10,w11,[x0] // load hash value base 2^26
-+ ldp w12,w13,[x0,#8]
-+ ldr w14,[x0,#16]
-+
-+ tst x2,#31
-+ b.eq .Leven_neon
-+
-+ ldp x7,x8,[x0,#32] // load key value
-+
-+ add x4,x10,x11,lsl#26 // base 2^26 -> base 2^64
-+ lsr x5,x12,#12
-+ adds x4,x4,x12,lsl#52
-+ add x5,x5,x13,lsl#14
-+ adc x5,x5,xzr
-+ lsr x6,x14,#24
-+ adds x5,x5,x14,lsl#40
-+ adc x14,x6,xzr // can be partially reduced...
-+
-+ ldp x12,x13,[x1],#16 // load input
-+ sub x2,x2,#16
-+ add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2)
-+
-+#ifdef __AARCH64EB__
-+ rev x12,x12
-+ rev x13,x13
-+#endif
-+ adds x4,x4,x12 // accumulate input
-+ adcs x5,x5,x13
-+ adc x6,x6,x3
-+
-+ bl poly1305_mult
-+
-+ and x10,x4,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x11,x4,#26,#26
-+ extr x12,x5,x4,#52
-+ and x12,x12,#0x03ffffff
-+ ubfx x13,x5,#14,#26
-+ extr x14,x6,x5,#40
-+
-+ b .Leven_neon
-+
-+.align 4
-+.Lbase2_64_neon:
-+ ldp x7,x8,[x0,#32] // load key value
-+
-+ ldp x4,x5,[x0] // load hash value base 2^64
-+ ldr x6,[x0,#16]
-+
-+ tst x2,#31
-+ b.eq .Linit_neon
-+
-+ ldp x12,x13,[x1],#16 // load input
-+ sub x2,x2,#16
-+ add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2)
-+#ifdef __AARCH64EB__
-+ rev x12,x12
-+ rev x13,x13
-+#endif
-+ adds x4,x4,x12 // accumulate input
-+ adcs x5,x5,x13
-+ adc x6,x6,x3
-+
-+ bl poly1305_mult
-+
-+.Linit_neon:
-+ ldr w17,[x0,#48] // first table element
-+ and x10,x4,#0x03ffffff // base 2^64 -> base 2^26
-+ ubfx x11,x4,#26,#26
-+ extr x12,x5,x4,#52
-+ and x12,x12,#0x03ffffff
-+ ubfx x13,x5,#14,#26
-+ extr x14,x6,x5,#40
-+
-+ cmp w17,#-1 // is value impossible?
-+ b.ne .Leven_neon
-+
-+ fmov d24,x10
-+ fmov d25,x11
-+ fmov d26,x12
-+ fmov d27,x13
-+ fmov d28,x14
-+
-+ ////////////////////////////////// initialize r^n table
-+ mov x4,x7 // r^1
-+ add x9,x8,x8,lsr#2 // s1 = r1 + (r1 >> 2)
-+ mov x5,x8
-+ mov x6,xzr
-+ add x0,x0,#48+12
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^2
-+ sub x0,x0,#4
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^3
-+ sub x0,x0,#4
-+ bl poly1305_splat
-+
-+ bl poly1305_mult // r^4
-+ sub x0,x0,#4
-+ bl poly1305_splat
-+ sub x0,x0,#48 // restore original x0
-+ b .Ldo_neon
-+
-+.align 4
-+.Leven_neon:
-+ fmov d24,x10
-+ fmov d25,x11
-+ fmov d26,x12
-+ fmov d27,x13
-+ fmov d28,x14
-+
-+.Ldo_neon:
-+ ldp x8,x12,[x1,#32] // inp[2:3]
-+ subs x2,x2,#64
-+ ldp x9,x13,[x1,#48]
-+ add x16,x1,#96
-+ adr x17,.Lzeros
-+
-+ lsl x3,x3,#24
-+ add x15,x0,#48
-+
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ and x5,x9,#0x03ffffff
-+ ubfx x6,x8,#26,#26
-+ ubfx x7,x9,#26,#26
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ extr x8,x12,x8,#52
-+ extr x9,x13,x9,#52
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ fmov d14,x4
-+ and x8,x8,#0x03ffffff
-+ and x9,x9,#0x03ffffff
-+ ubfx x10,x12,#14,#26
-+ ubfx x11,x13,#14,#26
-+ add x12,x3,x12,lsr#40
-+ add x13,x3,x13,lsr#40
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ fmov d15,x6
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ fmov d16,x8
-+ fmov d17,x10
-+ fmov d18,x12
-+
-+ ldp x8,x12,[x1],#16 // inp[0:1]
-+ ldp x9,x13,[x1],#48
-+
-+ ld1 {v0.4s,v1.4s,v2.4s,v3.4s},[x15],#64
-+ ld1 {v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64
-+ ld1 {v8.4s},[x15]
-+
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ and x5,x9,#0x03ffffff
-+ ubfx x6,x8,#26,#26
-+ ubfx x7,x9,#26,#26
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ extr x8,x12,x8,#52
-+ extr x9,x13,x9,#52
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ fmov d9,x4
-+ and x8,x8,#0x03ffffff
-+ and x9,x9,#0x03ffffff
-+ ubfx x10,x12,#14,#26
-+ ubfx x11,x13,#14,#26
-+ add x12,x3,x12,lsr#40
-+ add x13,x3,x13,lsr#40
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ fmov d10,x6
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ movi v31.2d,#-1
-+ fmov d11,x8
-+ fmov d12,x10
-+ fmov d13,x12
-+ ushr v31.2d,v31.2d,#38
-+
-+ b.ls .Lskip_loop
-+
-+.align 4
-+.Loop_neon:
-+ ////////////////////////////////////////////////////////////////
-+ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2
-+ // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r
-+ // ___________________/
-+ // ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2
-+ // ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r
-+ // ___________________/ ____________________/
-+ //
-+ // Note that we start with inp[2:3]*r^2. This is because it
-+ // doesn't depend on reduction in previous iteration.
-+ ////////////////////////////////////////////////////////////////
-+ // d4 = h0*r4 + h1*r3 + h2*r2 + h3*r1 + h4*r0
-+ // d3 = h0*r3 + h1*r2 + h2*r1 + h3*r0 + h4*5*r4
-+ // d2 = h0*r2 + h1*r1 + h2*r0 + h3*5*r4 + h4*5*r3
-+ // d1 = h0*r1 + h1*r0 + h2*5*r4 + h3*5*r3 + h4*5*r2
-+ // d0 = h0*r0 + h1*5*r4 + h2*5*r3 + h3*5*r2 + h4*5*r1
-+
-+ subs x2,x2,#64
-+ umull v23.2d,v14.2s,v7.s[2]
-+ csel x16,x17,x16,lo
-+ umull v22.2d,v14.2s,v5.s[2]
-+ umull v21.2d,v14.2s,v3.s[2]
-+ ldp x8,x12,[x16],#16 // inp[2:3] (or zero)
-+ umull v20.2d,v14.2s,v1.s[2]
-+ ldp x9,x13,[x16],#48
-+ umull v19.2d,v14.2s,v0.s[2]
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+
-+ umlal v23.2d,v15.2s,v5.s[2]
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ umlal v22.2d,v15.2s,v3.s[2]
-+ and x5,x9,#0x03ffffff
-+ umlal v21.2d,v15.2s,v1.s[2]
-+ ubfx x6,x8,#26,#26
-+ umlal v20.2d,v15.2s,v0.s[2]
-+ ubfx x7,x9,#26,#26
-+ umlal v19.2d,v15.2s,v8.s[2]
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+
-+ umlal v23.2d,v16.2s,v3.s[2]
-+ extr x8,x12,x8,#52
-+ umlal v22.2d,v16.2s,v1.s[2]
-+ extr x9,x13,x9,#52
-+ umlal v21.2d,v16.2s,v0.s[2]
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ umlal v20.2d,v16.2s,v8.s[2]
-+ fmov d14,x4
-+ umlal v19.2d,v16.2s,v6.s[2]
-+ and x8,x8,#0x03ffffff
-+
-+ umlal v23.2d,v17.2s,v1.s[2]
-+ and x9,x9,#0x03ffffff
-+ umlal v22.2d,v17.2s,v0.s[2]
-+ ubfx x10,x12,#14,#26
-+ umlal v21.2d,v17.2s,v8.s[2]
-+ ubfx x11,x13,#14,#26
-+ umlal v20.2d,v17.2s,v6.s[2]
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ umlal v19.2d,v17.2s,v4.s[2]
-+ fmov d15,x6
-+
-+ add v11.2s,v11.2s,v26.2s
-+ add x12,x3,x12,lsr#40
-+ umlal v23.2d,v18.2s,v0.s[2]
-+ add x13,x3,x13,lsr#40
-+ umlal v22.2d,v18.2s,v8.s[2]
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ umlal v21.2d,v18.2s,v6.s[2]
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ umlal v20.2d,v18.2s,v4.s[2]
-+ fmov d16,x8
-+ umlal v19.2d,v18.2s,v2.s[2]
-+ fmov d17,x10
-+
-+ ////////////////////////////////////////////////////////////////
-+ // (hash+inp[0:1])*r^4 and accumulate
-+
-+ add v9.2s,v9.2s,v24.2s
-+ fmov d18,x12
-+ umlal v22.2d,v11.2s,v1.s[0]
-+ ldp x8,x12,[x1],#16 // inp[0:1]
-+ umlal v19.2d,v11.2s,v6.s[0]
-+ ldp x9,x13,[x1],#48
-+ umlal v23.2d,v11.2s,v3.s[0]
-+ umlal v20.2d,v11.2s,v8.s[0]
-+ umlal v21.2d,v11.2s,v0.s[0]
-+#ifdef __AARCH64EB__
-+ rev x8,x8
-+ rev x12,x12
-+ rev x9,x9
-+ rev x13,x13
-+#endif
-+
-+ add v10.2s,v10.2s,v25.2s
-+ umlal v22.2d,v9.2s,v5.s[0]
-+ umlal v23.2d,v9.2s,v7.s[0]
-+ and x4,x8,#0x03ffffff // base 2^64 -> base 2^26
-+ umlal v21.2d,v9.2s,v3.s[0]
-+ and x5,x9,#0x03ffffff
-+ umlal v19.2d,v9.2s,v0.s[0]
-+ ubfx x6,x8,#26,#26
-+ umlal v20.2d,v9.2s,v1.s[0]
-+ ubfx x7,x9,#26,#26
-+
-+ add v12.2s,v12.2s,v27.2s
-+ add x4,x4,x5,lsl#32 // bfi x4,x5,#32,#32
-+ umlal v22.2d,v10.2s,v3.s[0]
-+ extr x8,x12,x8,#52
-+ umlal v23.2d,v10.2s,v5.s[0]
-+ extr x9,x13,x9,#52
-+ umlal v19.2d,v10.2s,v8.s[0]
-+ add x6,x6,x7,lsl#32 // bfi x6,x7,#32,#32
-+ umlal v21.2d,v10.2s,v1.s[0]
-+ fmov d9,x4
-+ umlal v20.2d,v10.2s,v0.s[0]
-+ and x8,x8,#0x03ffffff
-+
-+ add v13.2s,v13.2s,v28.2s
-+ and x9,x9,#0x03ffffff
-+ umlal v22.2d,v12.2s,v0.s[0]
-+ ubfx x10,x12,#14,#26
-+ umlal v19.2d,v12.2s,v4.s[0]
-+ ubfx x11,x13,#14,#26
-+ umlal v23.2d,v12.2s,v1.s[0]
-+ add x8,x8,x9,lsl#32 // bfi x8,x9,#32,#32
-+ umlal v20.2d,v12.2s,v6.s[0]
-+ fmov d10,x6
-+ umlal v21.2d,v12.2s,v8.s[0]
-+ add x12,x3,x12,lsr#40
-+
-+ umlal v22.2d,v13.2s,v8.s[0]
-+ add x13,x3,x13,lsr#40
-+ umlal v19.2d,v13.2s,v2.s[0]
-+ add x10,x10,x11,lsl#32 // bfi x10,x11,#32,#32
-+ umlal v23.2d,v13.2s,v0.s[0]
-+ add x12,x12,x13,lsl#32 // bfi x12,x13,#32,#32
-+ umlal v20.2d,v13.2s,v4.s[0]
-+ fmov d11,x8
-+ umlal v21.2d,v13.2s,v6.s[0]
-+ fmov d12,x10
-+ fmov d13,x12
-+
-+ /////////////////////////////////////////////////////////////////
-+ // lazy reduction as discussed in "NEON crypto" by D.J. Bernstein
-+ // and P. Schwabe
-+ //
-+ // [see discussion in poly1305-armv4 module]
-+
-+ ushr v29.2d,v22.2d,#26
-+ xtn v27.2s,v22.2d
-+ ushr v30.2d,v19.2d,#26
-+ and v19.16b,v19.16b,v31.16b
-+ add v23.2d,v23.2d,v29.2d // h3 -> h4
-+ bic v27.2s,#0xfc,lsl#24 // &=0x03ffffff
-+ add v20.2d,v20.2d,v30.2d // h0 -> h1
-+
-+ ushr v29.2d,v23.2d,#26
-+ xtn v28.2s,v23.2d
-+ ushr v30.2d,v20.2d,#26
-+ xtn v25.2s,v20.2d
-+ bic v28.2s,#0xfc,lsl#24
-+ add v21.2d,v21.2d,v30.2d // h1 -> h2
-+
-+ add v19.2d,v19.2d,v29.2d
-+ shl v29.2d,v29.2d,#2
-+ shrn v30.2s,v21.2d,#26
-+ xtn v26.2s,v21.2d
-+ add v19.2d,v19.2d,v29.2d // h4 -> h0
-+ bic v25.2s,#0xfc,lsl#24
-+ add v27.2s,v27.2s,v30.2s // h2 -> h3
-+ bic v26.2s,#0xfc,lsl#24
-+
-+ shrn v29.2s,v19.2d,#26
-+ xtn v24.2s,v19.2d
-+ ushr v30.2s,v27.2s,#26
-+ bic v27.2s,#0xfc,lsl#24
-+ bic v24.2s,#0xfc,lsl#24
-+ add v25.2s,v25.2s,v29.2s // h0 -> h1
-+ add v28.2s,v28.2s,v30.2s // h3 -> h4
-+
-+ b.hi .Loop_neon
-+
-+.Lskip_loop:
-+ dup v16.2d,v16.d[0]
-+ add v11.2s,v11.2s,v26.2s
-+
-+ ////////////////////////////////////////////////////////////////
-+ // multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1
-+
-+ adds x2,x2,#32
-+ b.ne .Long_tail
-+
-+ dup v16.2d,v11.d[0]
-+ add v14.2s,v9.2s,v24.2s
-+ add v17.2s,v12.2s,v27.2s
-+ add v15.2s,v10.2s,v25.2s
-+ add v18.2s,v13.2s,v28.2s
-+
-+.Long_tail:
-+ dup v14.2d,v14.d[0]
-+ umull2 v19.2d,v16.4s,v6.4s
-+ umull2 v22.2d,v16.4s,v1.4s
-+ umull2 v23.2d,v16.4s,v3.4s
-+ umull2 v21.2d,v16.4s,v0.4s
-+ umull2 v20.2d,v16.4s,v8.4s
-+
-+ dup v15.2d,v15.d[0]
-+ umlal2 v19.2d,v14.4s,v0.4s
-+ umlal2 v21.2d,v14.4s,v3.4s
-+ umlal2 v22.2d,v14.4s,v5.4s
-+ umlal2 v23.2d,v14.4s,v7.4s
-+ umlal2 v20.2d,v14.4s,v1.4s
-+
-+ dup v17.2d,v17.d[0]
-+ umlal2 v19.2d,v15.4s,v8.4s
-+ umlal2 v22.2d,v15.4s,v3.4s
-+ umlal2 v21.2d,v15.4s,v1.4s
-+ umlal2 v23.2d,v15.4s,v5.4s
-+ umlal2 v20.2d,v15.4s,v0.4s
-+
-+ dup v18.2d,v18.d[0]
-+ umlal2 v22.2d,v17.4s,v0.4s
-+ umlal2 v23.2d,v17.4s,v1.4s
-+ umlal2 v19.2d,v17.4s,v4.4s
-+ umlal2 v20.2d,v17.4s,v6.4s
-+ umlal2 v21.2d,v17.4s,v8.4s
-+
-+ umlal2 v22.2d,v18.4s,v8.4s
-+ umlal2 v19.2d,v18.4s,v2.4s
-+ umlal2 v23.2d,v18.4s,v0.4s
-+ umlal2 v20.2d,v18.4s,v4.4s
-+ umlal2 v21.2d,v18.4s,v6.4s
-+
-+ b.eq .Lshort_tail
-+
-+ ////////////////////////////////////////////////////////////////
-+ // (hash+inp[0:1])*r^4:r^3 and accumulate
-+
-+ add v9.2s,v9.2s,v24.2s
-+ umlal v22.2d,v11.2s,v1.2s
-+ umlal v19.2d,v11.2s,v6.2s
-+ umlal v23.2d,v11.2s,v3.2s
-+ umlal v20.2d,v11.2s,v8.2s
-+ umlal v21.2d,v11.2s,v0.2s
-+
-+ add v10.2s,v10.2s,v25.2s
-+ umlal v22.2d,v9.2s,v5.2s
-+ umlal v19.2d,v9.2s,v0.2s
-+ umlal v23.2d,v9.2s,v7.2s
-+ umlal v20.2d,v9.2s,v1.2s
-+ umlal v21.2d,v9.2s,v3.2s
-+
-+ add v12.2s,v12.2s,v27.2s
-+ umlal v22.2d,v10.2s,v3.2s
-+ umlal v19.2d,v10.2s,v8.2s
-+ umlal v23.2d,v10.2s,v5.2s
-+ umlal v20.2d,v10.2s,v0.2s
-+ umlal v21.2d,v10.2s,v1.2s
-+
-+ add v13.2s,v13.2s,v28.2s
-+ umlal v22.2d,v12.2s,v0.2s
-+ umlal v19.2d,v12.2s,v4.2s
-+ umlal v23.2d,v12.2s,v1.2s
-+ umlal v20.2d,v12.2s,v6.2s
-+ umlal v21.2d,v12.2s,v8.2s
-+
-+ umlal v22.2d,v13.2s,v8.2s
-+ umlal v19.2d,v13.2s,v2.2s
-+ umlal v23.2d,v13.2s,v0.2s
-+ umlal v20.2d,v13.2s,v4.2s
-+ umlal v21.2d,v13.2s,v6.2s
-+
-+.Lshort_tail:
-+ ////////////////////////////////////////////////////////////////
-+ // horizontal add
-+
-+ addp v22.2d,v22.2d,v22.2d
-+ ldp d8,d9,[sp,#16] // meet ABI requirements
-+ addp v19.2d,v19.2d,v19.2d
-+ ldp d10,d11,[sp,#32]
-+ addp v23.2d,v23.2d,v23.2d
-+ ldp d12,d13,[sp,#48]
-+ addp v20.2d,v20.2d,v20.2d
-+ ldp d14,d15,[sp,#64]
-+ addp v21.2d,v21.2d,v21.2d
-+ ldr x30,[sp,#8]
-+ .inst 0xd50323bf // autiasp
-+
-+ ////////////////////////////////////////////////////////////////
-+ // lazy reduction, but without narrowing
-+
-+ ushr v29.2d,v22.2d,#26
-+ and v22.16b,v22.16b,v31.16b
-+ ushr v30.2d,v19.2d,#26
-+ and v19.16b,v19.16b,v31.16b
-+
-+ add v23.2d,v23.2d,v29.2d // h3 -> h4
-+ add v20.2d,v20.2d,v30.2d // h0 -> h1
-+
-+ ushr v29.2d,v23.2d,#26
-+ and v23.16b,v23.16b,v31.16b
-+ ushr v30.2d,v20.2d,#26
-+ and v20.16b,v20.16b,v31.16b
-+ add v21.2d,v21.2d,v30.2d // h1 -> h2
-+
-+ add v19.2d,v19.2d,v29.2d
-+ shl v29.2d,v29.2d,#2
-+ ushr v30.2d,v21.2d,#26
-+ and v21.16b,v21.16b,v31.16b
-+ add v19.2d,v19.2d,v29.2d // h4 -> h0
-+ add v22.2d,v22.2d,v30.2d // h2 -> h3
-+
-+ ushr v29.2d,v19.2d,#26
-+ and v19.16b,v19.16b,v31.16b
-+ ushr v30.2d,v22.2d,#26
-+ and v22.16b,v22.16b,v31.16b
-+ add v20.2d,v20.2d,v29.2d // h0 -> h1
-+ add v23.2d,v23.2d,v30.2d // h3 -> h4
-+
-+ ////////////////////////////////////////////////////////////////
-+ // write the result, can be partially reduced
-+
-+ st4 {v19.s,v20.s,v21.s,v22.s}[0],[x0],#16
-+ mov x4,#1
-+ st1 {v23.s}[0],[x0]
-+ str x4,[x0,#8] // set is_base2_26
-+
-+ ldr x29,[sp],#80
-+ ret
-+.size poly1305_blocks_neon,.-poly1305_blocks_neon
-+
-+.align 5
-+.Lzeros:
-+.long 0,0,0,0,0,0,0,0
-+.asciz "Poly1305 for ARMv8, CRYPTOGAMS by @dot-asm"
-+.align 2
-+#if !defined(__KERNEL__) && !defined(_WIN64)
-+.comm OPENSSL_armcap_P,4,4
-+.hidden OPENSSL_armcap_P
-+#endif
---- /dev/null
-+++ b/arch/arm64/crypto/poly1305-glue.c
-@@ -0,0 +1,237 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * OpenSSL/Cryptogams accelerated Poly1305 transform for arm64
-+ *
-+ * Copyright (C) 2019 Linaro Ltd. <ard.biesheuvel@linaro.org>
-+ */
-+
-+#include <asm/hwcap.h>
-+#include <asm/neon.h>
-+#include <asm/simd.h>
-+#include <asm/unaligned.h>
-+#include <crypto/algapi.h>
-+#include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
-+#include <crypto/internal/simd.h>
-+#include <linux/cpufeature.h>
-+#include <linux/crypto.h>
-+#include <linux/jump_label.h>
-+#include <linux/module.h>
-+
-+asmlinkage void poly1305_init_arm64(void *state, const u8 *key);
-+asmlinkage void poly1305_blocks(void *state, const u8 *src, u32 len, u32 hibit);
-+asmlinkage void poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit);
-+asmlinkage void poly1305_emit(void *state, __le32 *digest, const u32 *nonce);
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-+
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+{
-+ poly1305_init_arm64(&dctx->h, key);
-+ dctx->s[0] = get_unaligned_le32(key + 16);
-+ dctx->s[1] = get_unaligned_le32(key + 20);
-+ dctx->s[2] = get_unaligned_le32(key + 24);
-+ dctx->s[3] = get_unaligned_le32(key + 28);
-+ dctx->buflen = 0;
-+}
-+EXPORT_SYMBOL(poly1305_init_arch);
-+
-+static int neon_poly1305_init(struct shash_desc *desc)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ dctx->buflen = 0;
-+ dctx->rset = 0;
-+ dctx->sset = false;
-+
-+ return 0;
-+}
-+
-+static void neon_poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ u32 len, u32 hibit, bool do_neon)
-+{
-+ if (unlikely(!dctx->sset)) {
-+ if (!dctx->rset) {
-+ poly1305_init_arch(dctx, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = 1;
-+ }
-+ if (len >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ if (len < POLY1305_BLOCK_SIZE)
-+ return;
-+ }
-+
-+ len &= ~(POLY1305_BLOCK_SIZE - 1);
-+
-+ if (static_branch_likely(&have_neon) && likely(do_neon))
-+ poly1305_blocks_neon(&dctx->h, src, len, hibit);
-+ else
-+ poly1305_blocks(&dctx->h, src, len, hibit);
-+}
-+
-+static void neon_poly1305_do_update(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, u32 len, bool do_neon)
-+{
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(len, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ len -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ neon_poly1305_blocks(dctx, dctx->buf,
-+ POLY1305_BLOCK_SIZE, 1, false);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(len >= POLY1305_BLOCK_SIZE)) {
-+ neon_poly1305_blocks(dctx, src, len, 1, do_neon);
-+ src += round_down(len, POLY1305_BLOCK_SIZE);
-+ len %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(len)) {
-+ dctx->buflen = len;
-+ memcpy(dctx->buf, src, len);
-+ }
-+}
-+
-+static int neon_poly1305_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen)
-+{
-+ bool do_neon = crypto_simd_usable() && srclen > 128;
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (static_branch_likely(&have_neon) && do_neon)
-+ kernel_neon_begin();
-+ neon_poly1305_do_update(dctx, src, srclen, do_neon);
-+ if (static_branch_likely(&have_neon) && do_neon)
-+ kernel_neon_end();
-+ return 0;
-+}
-+
-+void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ unsigned int nbytes)
-+{
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(nbytes, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ nbytes -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ poly1305_blocks(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 1);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(nbytes >= POLY1305_BLOCK_SIZE)) {
-+ unsigned int len = round_down(nbytes, POLY1305_BLOCK_SIZE);
-+
-+ if (static_branch_likely(&have_neon) && crypto_simd_usable()) {
-+ kernel_neon_begin();
-+ poly1305_blocks_neon(&dctx->h, src, len, 1);
-+ kernel_neon_end();
-+ } else {
-+ poly1305_blocks(&dctx->h, src, len, 1);
-+ }
-+ src += len;
-+ nbytes %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(nbytes)) {
-+ dctx->buflen = nbytes;
-+ memcpy(dctx->buf, src, nbytes);
-+ }
-+}
-+EXPORT_SYMBOL(poly1305_update_arch);
-+
-+void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
-+{
-+ __le32 digest[4];
-+ u64 f = 0;
-+
-+ if (unlikely(dctx->buflen)) {
-+ dctx->buf[dctx->buflen++] = 1;
-+ memset(dctx->buf + dctx->buflen, 0,
-+ POLY1305_BLOCK_SIZE - dctx->buflen);
-+ poly1305_blocks(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
-+ }
-+
-+ poly1305_emit(&dctx->h, digest, dctx->s);
-+
-+ /* mac = (h + s) % (2^128) */
-+ f = (f >> 32) + le32_to_cpu(digest[0]);
-+ put_unaligned_le32(f, dst);
-+ f = (f >> 32) + le32_to_cpu(digest[1]);
-+ put_unaligned_le32(f, dst + 4);
-+ f = (f >> 32) + le32_to_cpu(digest[2]);
-+ put_unaligned_le32(f, dst + 8);
-+ f = (f >> 32) + le32_to_cpu(digest[3]);
-+ put_unaligned_le32(f, dst + 12);
-+
-+ *dctx = (struct poly1305_desc_ctx){};
-+}
-+EXPORT_SYMBOL(poly1305_final_arch);
-+
-+static int neon_poly1305_final(struct shash_desc *desc, u8 *dst)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (unlikely(!dctx->sset))
-+ return -ENOKEY;
-+
-+ poly1305_final_arch(dctx, dst);
-+ return 0;
-+}
-+
-+static struct shash_alg neon_poly1305_alg = {
-+ .init = neon_poly1305_init,
-+ .update = neon_poly1305_update,
-+ .final = neon_poly1305_final,
-+ .digestsize = POLY1305_DIGEST_SIZE,
-+ .descsize = sizeof(struct poly1305_desc_ctx),
-+
-+ .base.cra_name = "poly1305",
-+ .base.cra_driver_name = "poly1305-neon",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = POLY1305_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+};
-+
-+static int __init neon_poly1305_mod_init(void)
-+{
-+ if (!cpu_have_named_feature(ASIMD))
-+ return 0;
-+
-+ static_branch_enable(&have_neon);
-+
-+ return crypto_register_shash(&neon_poly1305_alg);
-+}
-+
-+static void __exit neon_poly1305_mod_exit(void)
-+{
-+ if (cpu_have_named_feature(ASIMD))
-+ crypto_unregister_shash(&neon_poly1305_alg);
-+}
-+
-+module_init(neon_poly1305_mod_init);
-+module_exit(neon_poly1305_mod_exit);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CRYPTO("poly1305");
-+MODULE_ALIAS_CRYPTO("poly1305-neon");
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -40,6 +40,7 @@ config CRYPTO_LIB_DES
- config CRYPTO_LIB_POLY1305_RSIZE
- int
- default 4 if X86_64
-+ default 9 if ARM64
- default 1
-
- config CRYPTO_ARCH_HAVE_LIB_POLY1305
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0019-crypto-arm-poly1305-incorporate-OpenSSL-CRYPTOGAMS-N.patch b/target/linux/generic/backport-5.4/080-wireguard-0019-crypto-arm-poly1305-incorporate-OpenSSL-CRYPTOGAMS-N.patch
deleted file mode 100644
index 367b20fc3a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0019-crypto-arm-poly1305-incorporate-OpenSSL-CRYPTOGAMS-N.patch
+++ /dev/null
@@ -1,2776 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:25 +0100
-Subject: [PATCH] crypto: arm/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON
- implementation
-
-commit a6b803b3ddc793d6db0c16f12fc12d30d20fa9cc upstream.
-
-This is a straight import of the OpenSSL/CRYPTOGAMS Poly1305 implementation
-for NEON authored by Andy Polyakov, and contributed by him to the OpenSSL
-project. The file 'poly1305-armv4.pl' is taken straight from this upstream
-GitHub repository [0] at commit ec55a08dc0244ce570c4fc7cade330c60798952f,
-and already contains all the changes required to build it as part of a
-Linux kernel module.
-
-[0] https://github.com/dot-asm/cryptogams
-
-Co-developed-by: Andy Polyakov <appro@cryptogams.org>
-Signed-off-by: Andy Polyakov <appro@cryptogams.org>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/Kconfig | 5 +
- arch/arm/crypto/Makefile | 12 +-
- arch/arm/crypto/poly1305-armv4.pl | 1236 +++++++++++++++++++++++
- arch/arm/crypto/poly1305-core.S_shipped | 1158 +++++++++++++++++++++
- arch/arm/crypto/poly1305-glue.c | 276 +++++
- lib/crypto/Kconfig | 2 +-
- 6 files changed, 2687 insertions(+), 2 deletions(-)
- create mode 100644 arch/arm/crypto/poly1305-armv4.pl
- create mode 100644 arch/arm/crypto/poly1305-core.S_shipped
- create mode 100644 arch/arm/crypto/poly1305-glue.c
-
---- a/arch/arm/crypto/Kconfig
-+++ b/arch/arm/crypto/Kconfig
-@@ -131,6 +131,11 @@ config CRYPTO_CHACHA20_NEON
- select CRYPTO_BLKCIPHER
- select CRYPTO_ARCH_HAVE_LIB_CHACHA
-
-+config CRYPTO_POLY1305_ARM
-+ tristate "Accelerated scalar and SIMD Poly1305 hash implementations"
-+ select CRYPTO_HASH
-+ select CRYPTO_ARCH_HAVE_LIB_POLY1305
-+
- config CRYPTO_NHPOLY1305_NEON
- tristate "NEON accelerated NHPoly1305 hash function (for Adiantum)"
- depends on KERNEL_MODE_NEON
---- a/arch/arm/crypto/Makefile
-+++ b/arch/arm/crypto/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sh
- obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
- obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
- obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
-+obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
- obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
-
- ce-obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
-@@ -55,12 +56,16 @@ crct10dif-arm-ce-y := crct10dif-ce-core.
- crc32-arm-ce-y:= crc32-ce-core.o crc32-ce-glue.o
- chacha-neon-y := chacha-scalar-core.o chacha-glue.o
- chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o
-+poly1305-arm-y := poly1305-core.o poly1305-glue.o
- nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
-
- ifdef REGENERATE_ARM_CRYPTO
- quiet_cmd_perl = PERL $@
- cmd_perl = $(PERL) $(<) > $(@)
-
-+$(src)/poly1305-core.S_shipped: $(src)/poly1305-armv4.pl
-+ $(call cmd,perl)
-+
- $(src)/sha256-core.S_shipped: $(src)/sha256-armv4.pl
- $(call cmd,perl)
-
-@@ -68,4 +73,9 @@ $(src)/sha512-core.S_shipped: $(src)/sha
- $(call cmd,perl)
- endif
-
--clean-files += sha256-core.S sha512-core.S
-+clean-files += poly1305-core.S sha256-core.S sha512-core.S
-+
-+# massage the perlasm code a bit so we only get the NEON routine if we need it
-+poly1305-aflags-$(CONFIG_CPU_V7) := -U__LINUX_ARM_ARCH__ -D__LINUX_ARM_ARCH__=5
-+poly1305-aflags-$(CONFIG_KERNEL_MODE_NEON) := -U__LINUX_ARM_ARCH__ -D__LINUX_ARM_ARCH__=7
-+AFLAGS_poly1305-core.o += $(poly1305-aflags-y)
---- /dev/null
-+++ b/arch/arm/crypto/poly1305-armv4.pl
-@@ -0,0 +1,1236 @@
-+#!/usr/bin/env perl
-+# SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause
-+#
-+# ====================================================================
-+# Written by Andy Polyakov, @dot-asm, initially for the OpenSSL
-+# project.
-+# ====================================================================
-+#
-+# IALU(*)/gcc-4.4 NEON
-+#
-+# ARM11xx(ARMv6) 7.78/+100% -
-+# Cortex-A5 6.35/+130% 3.00
-+# Cortex-A8 6.25/+115% 2.36
-+# Cortex-A9 5.10/+95% 2.55
-+# Cortex-A15 3.85/+85% 1.25(**)
-+# Snapdragon S4 5.70/+100% 1.48(**)
-+#
-+# (*) this is for -march=armv6, i.e. with bunch of ldrb loading data;
-+# (**) these are trade-off results, they can be improved by ~8% but at
-+# the cost of 15/12% regression on Cortex-A5/A7, it's even possible
-+# to improve Cortex-A9 result, but then A5/A7 loose more than 20%;
-+
-+$flavour = shift;
-+if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; }
-+else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} }
-+
-+if ($flavour && $flavour ne "void") {
-+ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-+ ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-+ ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
-+ die "can't locate arm-xlate.pl";
-+
-+ open STDOUT,"| \"$^X\" $xlate $flavour $output";
-+} else {
-+ open STDOUT,">$output";
-+}
-+
-+($ctx,$inp,$len,$padbit)=map("r$_",(0..3));
-+
-+$code.=<<___;
-+#ifndef __KERNEL__
-+# include "arm_arch.h"
-+#else
-+# define __ARM_ARCH__ __LINUX_ARM_ARCH__
-+# define __ARM_MAX_ARCH__ __LINUX_ARM_ARCH__
-+# define poly1305_init poly1305_init_arm
-+# define poly1305_blocks poly1305_blocks_arm
-+# define poly1305_emit poly1305_emit_arm
-+.globl poly1305_blocks_neon
-+#endif
-+
-+#if defined(__thumb2__)
-+.syntax unified
-+.thumb
-+#else
-+.code 32
-+#endif
-+
-+.text
-+
-+.globl poly1305_emit
-+.globl poly1305_blocks
-+.globl poly1305_init
-+.type poly1305_init,%function
-+.align 5
-+poly1305_init:
-+.Lpoly1305_init:
-+ stmdb sp!,{r4-r11}
-+
-+ eor r3,r3,r3
-+ cmp $inp,#0
-+ str r3,[$ctx,#0] @ zero hash value
-+ str r3,[$ctx,#4]
-+ str r3,[$ctx,#8]
-+ str r3,[$ctx,#12]
-+ str r3,[$ctx,#16]
-+ str r3,[$ctx,#36] @ clear is_base2_26
-+ add $ctx,$ctx,#20
-+
-+#ifdef __thumb2__
-+ it eq
-+#endif
-+ moveq r0,#0
-+ beq .Lno_key
-+
-+#if __ARM_MAX_ARCH__>=7
-+ mov r3,#-1
-+ str r3,[$ctx,#28] @ impossible key power value
-+# ifndef __KERNEL__
-+ adr r11,.Lpoly1305_init
-+ ldr r12,.LOPENSSL_armcap
-+# endif
-+#endif
-+ ldrb r4,[$inp,#0]
-+ mov r10,#0x0fffffff
-+ ldrb r5,[$inp,#1]
-+ and r3,r10,#-4 @ 0x0ffffffc
-+ ldrb r6,[$inp,#2]
-+ ldrb r7,[$inp,#3]
-+ orr r4,r4,r5,lsl#8
-+ ldrb r5,[$inp,#4]
-+ orr r4,r4,r6,lsl#16
-+ ldrb r6,[$inp,#5]
-+ orr r4,r4,r7,lsl#24
-+ ldrb r7,[$inp,#6]
-+ and r4,r4,r10
-+
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+# if !defined(_WIN32)
-+ ldr r12,[r11,r12] @ OPENSSL_armcap_P
-+# endif
-+# if defined(__APPLE__) || defined(_WIN32)
-+ ldr r12,[r12]
-+# endif
-+#endif
-+ ldrb r8,[$inp,#7]
-+ orr r5,r5,r6,lsl#8
-+ ldrb r6,[$inp,#8]
-+ orr r5,r5,r7,lsl#16
-+ ldrb r7,[$inp,#9]
-+ orr r5,r5,r8,lsl#24
-+ ldrb r8,[$inp,#10]
-+ and r5,r5,r3
-+
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+ tst r12,#ARMV7_NEON @ check for NEON
-+# ifdef __thumb2__
-+ adr r9,.Lpoly1305_blocks_neon
-+ adr r11,.Lpoly1305_blocks
-+ it ne
-+ movne r11,r9
-+ adr r12,.Lpoly1305_emit
-+ orr r11,r11,#1 @ thumb-ify addresses
-+ orr r12,r12,#1
-+# else
-+ add r12,r11,#(.Lpoly1305_emit-.Lpoly1305_init)
-+ ite eq
-+ addeq r11,r11,#(.Lpoly1305_blocks-.Lpoly1305_init)
-+ addne r11,r11,#(.Lpoly1305_blocks_neon-.Lpoly1305_init)
-+# endif
-+#endif
-+ ldrb r9,[$inp,#11]
-+ orr r6,r6,r7,lsl#8
-+ ldrb r7,[$inp,#12]
-+ orr r6,r6,r8,lsl#16
-+ ldrb r8,[$inp,#13]
-+ orr r6,r6,r9,lsl#24
-+ ldrb r9,[$inp,#14]
-+ and r6,r6,r3
-+
-+ ldrb r10,[$inp,#15]
-+ orr r7,r7,r8,lsl#8
-+ str r4,[$ctx,#0]
-+ orr r7,r7,r9,lsl#16
-+ str r5,[$ctx,#4]
-+ orr r7,r7,r10,lsl#24
-+ str r6,[$ctx,#8]
-+ and r7,r7,r3
-+ str r7,[$ctx,#12]
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+ stmia r2,{r11,r12} @ fill functions table
-+ mov r0,#1
-+#else
-+ mov r0,#0
-+#endif
-+.Lno_key:
-+ ldmia sp!,{r4-r11}
-+#if __ARM_ARCH__>=5
-+ ret @ bx lr
-+#else
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ bx lr @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_init,.-poly1305_init
-+___
-+{
-+my ($h0,$h1,$h2,$h3,$h4,$r0,$r1,$r2,$r3)=map("r$_",(4..12));
-+my ($s1,$s2,$s3)=($r1,$r2,$r3);
-+
-+$code.=<<___;
-+.type poly1305_blocks,%function
-+.align 5
-+poly1305_blocks:
-+.Lpoly1305_blocks:
-+ stmdb sp!,{r3-r11,lr}
-+
-+ ands $len,$len,#-16
-+ beq .Lno_data
-+
-+ add $len,$len,$inp @ end pointer
-+ sub sp,sp,#32
-+
-+#if __ARM_ARCH__<7
-+ ldmia $ctx,{$h0-$r3} @ load context
-+ add $ctx,$ctx,#20
-+ str $len,[sp,#16] @ offload stuff
-+ str $ctx,[sp,#12]
-+#else
-+ ldr lr,[$ctx,#36] @ is_base2_26
-+ ldmia $ctx!,{$h0-$h4} @ load hash value
-+ str $len,[sp,#16] @ offload stuff
-+ str $ctx,[sp,#12]
-+
-+ adds $r0,$h0,$h1,lsl#26 @ base 2^26 -> base 2^32
-+ mov $r1,$h1,lsr#6
-+ adcs $r1,$r1,$h2,lsl#20
-+ mov $r2,$h2,lsr#12
-+ adcs $r2,$r2,$h3,lsl#14
-+ mov $r3,$h3,lsr#18
-+ adcs $r3,$r3,$h4,lsl#8
-+ mov $len,#0
-+ teq lr,#0
-+ str $len,[$ctx,#16] @ clear is_base2_26
-+ adc $len,$len,$h4,lsr#24
-+
-+ itttt ne
-+ movne $h0,$r0 @ choose between radixes
-+ movne $h1,$r1
-+ movne $h2,$r2
-+ movne $h3,$r3
-+ ldmia $ctx,{$r0-$r3} @ load key
-+ it ne
-+ movne $h4,$len
-+#endif
-+
-+ mov lr,$inp
-+ cmp $padbit,#0
-+ str $r1,[sp,#20]
-+ str $r2,[sp,#24]
-+ str $r3,[sp,#28]
-+ b .Loop
-+
-+.align 4
-+.Loop:
-+#if __ARM_ARCH__<7
-+ ldrb r0,[lr],#16 @ load input
-+# ifdef __thumb2__
-+ it hi
-+# endif
-+ addhi $h4,$h4,#1 @ 1<<128
-+ ldrb r1,[lr,#-15]
-+ ldrb r2,[lr,#-14]
-+ ldrb r3,[lr,#-13]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-12]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-11]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-10]
-+ adds $h0,$h0,r3 @ accumulate input
-+
-+ ldrb r3,[lr,#-9]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-8]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-7]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-6]
-+ adcs $h1,$h1,r3
-+
-+ ldrb r3,[lr,#-5]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-4]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-3]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-2]
-+ adcs $h2,$h2,r3
-+
-+ ldrb r3,[lr,#-1]
-+ orr r1,r0,r1,lsl#8
-+ str lr,[sp,#8] @ offload input pointer
-+ orr r2,r1,r2,lsl#16
-+ add $s1,$r1,$r1,lsr#2
-+ orr r3,r2,r3,lsl#24
-+#else
-+ ldr r0,[lr],#16 @ load input
-+ it hi
-+ addhi $h4,$h4,#1 @ padbit
-+ ldr r1,[lr,#-12]
-+ ldr r2,[lr,#-8]
-+ ldr r3,[lr,#-4]
-+# ifdef __ARMEB__
-+ rev r0,r0
-+ rev r1,r1
-+ rev r2,r2
-+ rev r3,r3
-+# endif
-+ adds $h0,$h0,r0 @ accumulate input
-+ str lr,[sp,#8] @ offload input pointer
-+ adcs $h1,$h1,r1
-+ add $s1,$r1,$r1,lsr#2
-+ adcs $h2,$h2,r2
-+#endif
-+ add $s2,$r2,$r2,lsr#2
-+ adcs $h3,$h3,r3
-+ add $s3,$r3,$r3,lsr#2
-+
-+ umull r2,r3,$h1,$r0
-+ adc $h4,$h4,#0
-+ umull r0,r1,$h0,$r0
-+ umlal r2,r3,$h4,$s1
-+ umlal r0,r1,$h3,$s1
-+ ldr $r1,[sp,#20] @ reload $r1
-+ umlal r2,r3,$h2,$s3
-+ umlal r0,r1,$h1,$s3
-+ umlal r2,r3,$h3,$s2
-+ umlal r0,r1,$h2,$s2
-+ umlal r2,r3,$h0,$r1
-+ str r0,[sp,#0] @ future $h0
-+ mul r0,$s2,$h4
-+ ldr $r2,[sp,#24] @ reload $r2
-+ adds r2,r2,r1 @ d1+=d0>>32
-+ eor r1,r1,r1
-+ adc lr,r3,#0 @ future $h2
-+ str r2,[sp,#4] @ future $h1
-+
-+ mul r2,$s3,$h4
-+ eor r3,r3,r3
-+ umlal r0,r1,$h3,$s3
-+ ldr $r3,[sp,#28] @ reload $r3
-+ umlal r2,r3,$h3,$r0
-+ umlal r0,r1,$h2,$r0
-+ umlal r2,r3,$h2,$r1
-+ umlal r0,r1,$h1,$r1
-+ umlal r2,r3,$h1,$r2
-+ umlal r0,r1,$h0,$r2
-+ umlal r2,r3,$h0,$r3
-+ ldr $h0,[sp,#0]
-+ mul $h4,$r0,$h4
-+ ldr $h1,[sp,#4]
-+
-+ adds $h2,lr,r0 @ d2+=d1>>32
-+ ldr lr,[sp,#8] @ reload input pointer
-+ adc r1,r1,#0
-+ adds $h3,r2,r1 @ d3+=d2>>32
-+ ldr r0,[sp,#16] @ reload end pointer
-+ adc r3,r3,#0
-+ add $h4,$h4,r3 @ h4+=d3>>32
-+
-+ and r1,$h4,#-4
-+ and $h4,$h4,#3
-+ add r1,r1,r1,lsr#2 @ *=5
-+ adds $h0,$h0,r1
-+ adcs $h1,$h1,#0
-+ adcs $h2,$h2,#0
-+ adcs $h3,$h3,#0
-+ adc $h4,$h4,#0
-+
-+ cmp r0,lr @ done yet?
-+ bhi .Loop
-+
-+ ldr $ctx,[sp,#12]
-+ add sp,sp,#32
-+ stmdb $ctx,{$h0-$h4} @ store the result
-+
-+.Lno_data:
-+#if __ARM_ARCH__>=5
-+ ldmia sp!,{r3-r11,pc}
-+#else
-+ ldmia sp!,{r3-r11,lr}
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ bx lr @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_blocks,.-poly1305_blocks
-+___
-+}
-+{
-+my ($ctx,$mac,$nonce)=map("r$_",(0..2));
-+my ($h0,$h1,$h2,$h3,$h4,$g0,$g1,$g2,$g3)=map("r$_",(3..11));
-+my $g4=$ctx;
-+
-+$code.=<<___;
-+.type poly1305_emit,%function
-+.align 5
-+poly1305_emit:
-+.Lpoly1305_emit:
-+ stmdb sp!,{r4-r11}
-+
-+ ldmia $ctx,{$h0-$h4}
-+
-+#if __ARM_ARCH__>=7
-+ ldr ip,[$ctx,#36] @ is_base2_26
-+
-+ adds $g0,$h0,$h1,lsl#26 @ base 2^26 -> base 2^32
-+ mov $g1,$h1,lsr#6
-+ adcs $g1,$g1,$h2,lsl#20
-+ mov $g2,$h2,lsr#12
-+ adcs $g2,$g2,$h3,lsl#14
-+ mov $g3,$h3,lsr#18
-+ adcs $g3,$g3,$h4,lsl#8
-+ mov $g4,#0
-+ adc $g4,$g4,$h4,lsr#24
-+
-+ tst ip,ip
-+ itttt ne
-+ movne $h0,$g0
-+ movne $h1,$g1
-+ movne $h2,$g2
-+ movne $h3,$g3
-+ it ne
-+ movne $h4,$g4
-+#endif
-+
-+ adds $g0,$h0,#5 @ compare to modulus
-+ adcs $g1,$h1,#0
-+ adcs $g2,$h2,#0
-+ adcs $g3,$h3,#0
-+ adc $g4,$h4,#0
-+ tst $g4,#4 @ did it carry/borrow?
-+
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne $h0,$g0
-+ ldr $g0,[$nonce,#0]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne $h1,$g1
-+ ldr $g1,[$nonce,#4]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne $h2,$g2
-+ ldr $g2,[$nonce,#8]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne $h3,$g3
-+ ldr $g3,[$nonce,#12]
-+
-+ adds $h0,$h0,$g0
-+ adcs $h1,$h1,$g1
-+ adcs $h2,$h2,$g2
-+ adc $h3,$h3,$g3
-+
-+#if __ARM_ARCH__>=7
-+# ifdef __ARMEB__
-+ rev $h0,$h0
-+ rev $h1,$h1
-+ rev $h2,$h2
-+ rev $h3,$h3
-+# endif
-+ str $h0,[$mac,#0]
-+ str $h1,[$mac,#4]
-+ str $h2,[$mac,#8]
-+ str $h3,[$mac,#12]
-+#else
-+ strb $h0,[$mac,#0]
-+ mov $h0,$h0,lsr#8
-+ strb $h1,[$mac,#4]
-+ mov $h1,$h1,lsr#8
-+ strb $h2,[$mac,#8]
-+ mov $h2,$h2,lsr#8
-+ strb $h3,[$mac,#12]
-+ mov $h3,$h3,lsr#8
-+
-+ strb $h0,[$mac,#1]
-+ mov $h0,$h0,lsr#8
-+ strb $h1,[$mac,#5]
-+ mov $h1,$h1,lsr#8
-+ strb $h2,[$mac,#9]
-+ mov $h2,$h2,lsr#8
-+ strb $h3,[$mac,#13]
-+ mov $h3,$h3,lsr#8
-+
-+ strb $h0,[$mac,#2]
-+ mov $h0,$h0,lsr#8
-+ strb $h1,[$mac,#6]
-+ mov $h1,$h1,lsr#8
-+ strb $h2,[$mac,#10]
-+ mov $h2,$h2,lsr#8
-+ strb $h3,[$mac,#14]
-+ mov $h3,$h3,lsr#8
-+
-+ strb $h0,[$mac,#3]
-+ strb $h1,[$mac,#7]
-+ strb $h2,[$mac,#11]
-+ strb $h3,[$mac,#15]
-+#endif
-+ ldmia sp!,{r4-r11}
-+#if __ARM_ARCH__>=5
-+ ret @ bx lr
-+#else
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ bx lr @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_emit,.-poly1305_emit
-+___
-+{
-+my ($R0,$R1,$S1,$R2,$S2,$R3,$S3,$R4,$S4) = map("d$_",(0..9));
-+my ($D0,$D1,$D2,$D3,$D4, $H0,$H1,$H2,$H3,$H4) = map("q$_",(5..14));
-+my ($T0,$T1,$MASK) = map("q$_",(15,4,0));
-+
-+my ($in2,$zeros,$tbl0,$tbl1) = map("r$_",(4..7));
-+
-+$code.=<<___;
-+#if __ARM_MAX_ARCH__>=7
-+.fpu neon
-+
-+.type poly1305_init_neon,%function
-+.align 5
-+poly1305_init_neon:
-+.Lpoly1305_init_neon:
-+ ldr r3,[$ctx,#48] @ first table element
-+ cmp r3,#-1 @ is value impossible?
-+ bne .Lno_init_neon
-+
-+ ldr r4,[$ctx,#20] @ load key base 2^32
-+ ldr r5,[$ctx,#24]
-+ ldr r6,[$ctx,#28]
-+ ldr r7,[$ctx,#32]
-+
-+ and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26
-+ mov r3,r4,lsr#26
-+ mov r4,r5,lsr#20
-+ orr r3,r3,r5,lsl#6
-+ mov r5,r6,lsr#14
-+ orr r4,r4,r6,lsl#12
-+ mov r6,r7,lsr#8
-+ orr r5,r5,r7,lsl#18
-+ and r3,r3,#0x03ffffff
-+ and r4,r4,#0x03ffffff
-+ and r5,r5,#0x03ffffff
-+
-+ vdup.32 $R0,r2 @ r^1 in both lanes
-+ add r2,r3,r3,lsl#2 @ *5
-+ vdup.32 $R1,r3
-+ add r3,r4,r4,lsl#2
-+ vdup.32 $S1,r2
-+ vdup.32 $R2,r4
-+ add r4,r5,r5,lsl#2
-+ vdup.32 $S2,r3
-+ vdup.32 $R3,r5
-+ add r5,r6,r6,lsl#2
-+ vdup.32 $S3,r4
-+ vdup.32 $R4,r6
-+ vdup.32 $S4,r5
-+
-+ mov $zeros,#2 @ counter
-+
-+.Lsquare_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+ @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+
-+ vmull.u32 $D0,$R0,${R0}[1]
-+ vmull.u32 $D1,$R1,${R0}[1]
-+ vmull.u32 $D2,$R2,${R0}[1]
-+ vmull.u32 $D3,$R3,${R0}[1]
-+ vmull.u32 $D4,$R4,${R0}[1]
-+
-+ vmlal.u32 $D0,$R4,${S1}[1]
-+ vmlal.u32 $D1,$R0,${R1}[1]
-+ vmlal.u32 $D2,$R1,${R1}[1]
-+ vmlal.u32 $D3,$R2,${R1}[1]
-+ vmlal.u32 $D4,$R3,${R1}[1]
-+
-+ vmlal.u32 $D0,$R3,${S2}[1]
-+ vmlal.u32 $D1,$R4,${S2}[1]
-+ vmlal.u32 $D3,$R1,${R2}[1]
-+ vmlal.u32 $D2,$R0,${R2}[1]
-+ vmlal.u32 $D4,$R2,${R2}[1]
-+
-+ vmlal.u32 $D0,$R2,${S3}[1]
-+ vmlal.u32 $D3,$R0,${R3}[1]
-+ vmlal.u32 $D1,$R3,${S3}[1]
-+ vmlal.u32 $D2,$R4,${S3}[1]
-+ vmlal.u32 $D4,$R1,${R3}[1]
-+
-+ vmlal.u32 $D3,$R4,${S4}[1]
-+ vmlal.u32 $D0,$R1,${S4}[1]
-+ vmlal.u32 $D1,$R2,${S4}[1]
-+ vmlal.u32 $D2,$R3,${S4}[1]
-+ vmlal.u32 $D4,$R0,${R4}[1]
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction as discussed in "NEON crypto" by D.J. Bernstein
-+ @ and P. Schwabe
-+ @
-+ @ H0>>+H1>>+H2>>+H3>>+H4
-+ @ H3>>+H4>>*5+H0>>+H1
-+ @
-+ @ Trivia.
-+ @
-+ @ Result of multiplication of n-bit number by m-bit number is
-+ @ n+m bits wide. However! Even though 2^n is a n+1-bit number,
-+ @ m-bit number multiplied by 2^n is still n+m bits wide.
-+ @
-+ @ Sum of two n-bit numbers is n+1 bits wide, sum of three - n+2,
-+ @ and so is sum of four. Sum of 2^m n-m-bit numbers and n-bit
-+ @ one is n+1 bits wide.
-+ @
-+ @ >>+ denotes Hnext += Hn>>26, Hn &= 0x3ffffff. This means that
-+ @ H0, H2, H3 are guaranteed to be 26 bits wide, while H1 and H4
-+ @ can be 27. However! In cases when their width exceeds 26 bits
-+ @ they are limited by 2^26+2^6. This in turn means that *sum*
-+ @ of the products with these values can still be viewed as sum
-+ @ of 52-bit numbers as long as the amount of addends is not a
-+ @ power of 2. For example,
-+ @
-+ @ H4 = H4*R0 + H3*R1 + H2*R2 + H1*R3 + H0 * R4,
-+ @
-+ @ which can't be larger than 5 * (2^26 + 2^6) * (2^26 + 2^6), or
-+ @ 5 * (2^52 + 2*2^32 + 2^12), which in turn is smaller than
-+ @ 8 * (2^52) or 2^55. However, the value is then multiplied by
-+ @ by 5, so we should be looking at 5 * 5 * (2^52 + 2^33 + 2^12),
-+ @ which is less than 32 * (2^52) or 2^57. And when processing
-+ @ data we are looking at triple as many addends...
-+ @
-+ @ In key setup procedure pre-reduced H0 is limited by 5*4+1 and
-+ @ 5*H4 - by 5*5 52-bit addends, or 57 bits. But when hashing the
-+ @ input H0 is limited by (5*4+1)*3 addends, or 58 bits, while
-+ @ 5*H4 by 5*5*3, or 59[!] bits. How is this relevant? vmlal.u32
-+ @ instruction accepts 2x32-bit input and writes 2x64-bit result.
-+ @ This means that result of reduction have to be compressed upon
-+ @ loop wrap-around. This can be done in the process of reduction
-+ @ to minimize amount of instructions [as well as amount of
-+ @ 128-bit instructions, which benefits low-end processors], but
-+ @ one has to watch for H2 (which is narrower than H0) and 5*H4
-+ @ not being wider than 58 bits, so that result of right shift
-+ @ by 26 bits fits in 32 bits. This is also useful on x86,
-+ @ because it allows to use paddd in place for paddq, which
-+ @ benefits Atom, where paddq is ridiculously slow.
-+
-+ vshr.u64 $T0,$D3,#26
-+ vmovn.i64 $D3#lo,$D3
-+ vshr.u64 $T1,$D0,#26
-+ vmovn.i64 $D0#lo,$D0
-+ vadd.i64 $D4,$D4,$T0 @ h3 -> h4
-+ vbic.i32 $D3#lo,#0xfc000000 @ &=0x03ffffff
-+ vadd.i64 $D1,$D1,$T1 @ h0 -> h1
-+ vbic.i32 $D0#lo,#0xfc000000
-+
-+ vshrn.u64 $T0#lo,$D4,#26
-+ vmovn.i64 $D4#lo,$D4
-+ vshr.u64 $T1,$D1,#26
-+ vmovn.i64 $D1#lo,$D1
-+ vadd.i64 $D2,$D2,$T1 @ h1 -> h2
-+ vbic.i32 $D4#lo,#0xfc000000
-+ vbic.i32 $D1#lo,#0xfc000000
-+
-+ vadd.i32 $D0#lo,$D0#lo,$T0#lo
-+ vshl.u32 $T0#lo,$T0#lo,#2
-+ vshrn.u64 $T1#lo,$D2,#26
-+ vmovn.i64 $D2#lo,$D2
-+ vadd.i32 $D0#lo,$D0#lo,$T0#lo @ h4 -> h0
-+ vadd.i32 $D3#lo,$D3#lo,$T1#lo @ h2 -> h3
-+ vbic.i32 $D2#lo,#0xfc000000
-+
-+ vshr.u32 $T0#lo,$D0#lo,#26
-+ vbic.i32 $D0#lo,#0xfc000000
-+ vshr.u32 $T1#lo,$D3#lo,#26
-+ vbic.i32 $D3#lo,#0xfc000000
-+ vadd.i32 $D1#lo,$D1#lo,$T0#lo @ h0 -> h1
-+ vadd.i32 $D4#lo,$D4#lo,$T1#lo @ h3 -> h4
-+
-+ subs $zeros,$zeros,#1
-+ beq .Lsquare_break_neon
-+
-+ add $tbl0,$ctx,#(48+0*9*4)
-+ add $tbl1,$ctx,#(48+1*9*4)
-+
-+ vtrn.32 $R0,$D0#lo @ r^2:r^1
-+ vtrn.32 $R2,$D2#lo
-+ vtrn.32 $R3,$D3#lo
-+ vtrn.32 $R1,$D1#lo
-+ vtrn.32 $R4,$D4#lo
-+
-+ vshl.u32 $S2,$R2,#2 @ *5
-+ vshl.u32 $S3,$R3,#2
-+ vshl.u32 $S1,$R1,#2
-+ vshl.u32 $S4,$R4,#2
-+ vadd.i32 $S2,$S2,$R2
-+ vadd.i32 $S1,$S1,$R1
-+ vadd.i32 $S3,$S3,$R3
-+ vadd.i32 $S4,$S4,$R4
-+
-+ vst4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]!
-+ vst4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]!
-+ vst4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]!
-+ vst4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]!
-+ vst1.32 {${S4}[0]},[$tbl0,:32]
-+ vst1.32 {${S4}[1]},[$tbl1,:32]
-+
-+ b .Lsquare_neon
-+
-+.align 4
-+.Lsquare_break_neon:
-+ add $tbl0,$ctx,#(48+2*4*9)
-+ add $tbl1,$ctx,#(48+3*4*9)
-+
-+ vmov $R0,$D0#lo @ r^4:r^3
-+ vshl.u32 $S1,$D1#lo,#2 @ *5
-+ vmov $R1,$D1#lo
-+ vshl.u32 $S2,$D2#lo,#2
-+ vmov $R2,$D2#lo
-+ vshl.u32 $S3,$D3#lo,#2
-+ vmov $R3,$D3#lo
-+ vshl.u32 $S4,$D4#lo,#2
-+ vmov $R4,$D4#lo
-+ vadd.i32 $S1,$S1,$D1#lo
-+ vadd.i32 $S2,$S2,$D2#lo
-+ vadd.i32 $S3,$S3,$D3#lo
-+ vadd.i32 $S4,$S4,$D4#lo
-+
-+ vst4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]!
-+ vst4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]!
-+ vst4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]!
-+ vst4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]!
-+ vst1.32 {${S4}[0]},[$tbl0]
-+ vst1.32 {${S4}[1]},[$tbl1]
-+
-+.Lno_init_neon:
-+ ret @ bx lr
-+.size poly1305_init_neon,.-poly1305_init_neon
-+
-+.type poly1305_blocks_neon,%function
-+.align 5
-+poly1305_blocks_neon:
-+.Lpoly1305_blocks_neon:
-+ ldr ip,[$ctx,#36] @ is_base2_26
-+
-+ cmp $len,#64
-+ blo .Lpoly1305_blocks
-+
-+ stmdb sp!,{r4-r7}
-+ vstmdb sp!,{d8-d15} @ ABI specification says so
-+
-+ tst ip,ip @ is_base2_26?
-+ bne .Lbase2_26_neon
-+
-+ stmdb sp!,{r1-r3,lr}
-+ bl .Lpoly1305_init_neon
-+
-+ ldr r4,[$ctx,#0] @ load hash value base 2^32
-+ ldr r5,[$ctx,#4]
-+ ldr r6,[$ctx,#8]
-+ ldr r7,[$ctx,#12]
-+ ldr ip,[$ctx,#16]
-+
-+ and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26
-+ mov r3,r4,lsr#26
-+ veor $D0#lo,$D0#lo,$D0#lo
-+ mov r4,r5,lsr#20
-+ orr r3,r3,r5,lsl#6
-+ veor $D1#lo,$D1#lo,$D1#lo
-+ mov r5,r6,lsr#14
-+ orr r4,r4,r6,lsl#12
-+ veor $D2#lo,$D2#lo,$D2#lo
-+ mov r6,r7,lsr#8
-+ orr r5,r5,r7,lsl#18
-+ veor $D3#lo,$D3#lo,$D3#lo
-+ and r3,r3,#0x03ffffff
-+ orr r6,r6,ip,lsl#24
-+ veor $D4#lo,$D4#lo,$D4#lo
-+ and r4,r4,#0x03ffffff
-+ mov r1,#1
-+ and r5,r5,#0x03ffffff
-+ str r1,[$ctx,#36] @ set is_base2_26
-+
-+ vmov.32 $D0#lo[0],r2
-+ vmov.32 $D1#lo[0],r3
-+ vmov.32 $D2#lo[0],r4
-+ vmov.32 $D3#lo[0],r5
-+ vmov.32 $D4#lo[0],r6
-+ adr $zeros,.Lzeros
-+
-+ ldmia sp!,{r1-r3,lr}
-+ b .Lhash_loaded
-+
-+.align 4
-+.Lbase2_26_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ load hash value
-+
-+ veor $D0#lo,$D0#lo,$D0#lo
-+ veor $D1#lo,$D1#lo,$D1#lo
-+ veor $D2#lo,$D2#lo,$D2#lo
-+ veor $D3#lo,$D3#lo,$D3#lo
-+ veor $D4#lo,$D4#lo,$D4#lo
-+ vld4.32 {$D0#lo[0],$D1#lo[0],$D2#lo[0],$D3#lo[0]},[$ctx]!
-+ adr $zeros,.Lzeros
-+ vld1.32 {$D4#lo[0]},[$ctx]
-+ sub $ctx,$ctx,#16 @ rewind
-+
-+.Lhash_loaded:
-+ add $in2,$inp,#32
-+ mov $padbit,$padbit,lsl#24
-+ tst $len,#31
-+ beq .Leven
-+
-+ vld4.32 {$H0#lo[0],$H1#lo[0],$H2#lo[0],$H3#lo[0]},[$inp]!
-+ vmov.32 $H4#lo[0],$padbit
-+ sub $len,$len,#16
-+ add $in2,$inp,#32
-+
-+# ifdef __ARMEB__
-+ vrev32.8 $H0,$H0
-+ vrev32.8 $H3,$H3
-+ vrev32.8 $H1,$H1
-+ vrev32.8 $H2,$H2
-+# endif
-+ vsri.u32 $H4#lo,$H3#lo,#8 @ base 2^32 -> base 2^26
-+ vshl.u32 $H3#lo,$H3#lo,#18
-+
-+ vsri.u32 $H3#lo,$H2#lo,#14
-+ vshl.u32 $H2#lo,$H2#lo,#12
-+ vadd.i32 $H4#hi,$H4#lo,$D4#lo @ add hash value and move to #hi
-+
-+ vbic.i32 $H3#lo,#0xfc000000
-+ vsri.u32 $H2#lo,$H1#lo,#20
-+ vshl.u32 $H1#lo,$H1#lo,#6
-+
-+ vbic.i32 $H2#lo,#0xfc000000
-+ vsri.u32 $H1#lo,$H0#lo,#26
-+ vadd.i32 $H3#hi,$H3#lo,$D3#lo
-+
-+ vbic.i32 $H0#lo,#0xfc000000
-+ vbic.i32 $H1#lo,#0xfc000000
-+ vadd.i32 $H2#hi,$H2#lo,$D2#lo
-+
-+ vadd.i32 $H0#hi,$H0#lo,$D0#lo
-+ vadd.i32 $H1#hi,$H1#lo,$D1#lo
-+
-+ mov $tbl1,$zeros
-+ add $tbl0,$ctx,#48
-+
-+ cmp $len,$len
-+ b .Long_tail
-+
-+.align 4
-+.Leven:
-+ subs $len,$len,#64
-+ it lo
-+ movlo $in2,$zeros
-+
-+ vmov.i32 $H4,#1<<24 @ padbit, yes, always
-+ vld4.32 {$H0#lo,$H1#lo,$H2#lo,$H3#lo},[$inp] @ inp[0:1]
-+ add $inp,$inp,#64
-+ vld4.32 {$H0#hi,$H1#hi,$H2#hi,$H3#hi},[$in2] @ inp[2:3] (or 0)
-+ add $in2,$in2,#64
-+ itt hi
-+ addhi $tbl1,$ctx,#(48+1*9*4)
-+ addhi $tbl0,$ctx,#(48+3*9*4)
-+
-+# ifdef __ARMEB__
-+ vrev32.8 $H0,$H0
-+ vrev32.8 $H3,$H3
-+ vrev32.8 $H1,$H1
-+ vrev32.8 $H2,$H2
-+# endif
-+ vsri.u32 $H4,$H3,#8 @ base 2^32 -> base 2^26
-+ vshl.u32 $H3,$H3,#18
-+
-+ vsri.u32 $H3,$H2,#14
-+ vshl.u32 $H2,$H2,#12
-+
-+ vbic.i32 $H3,#0xfc000000
-+ vsri.u32 $H2,$H1,#20
-+ vshl.u32 $H1,$H1,#6
-+
-+ vbic.i32 $H2,#0xfc000000
-+ vsri.u32 $H1,$H0,#26
-+
-+ vbic.i32 $H0,#0xfc000000
-+ vbic.i32 $H1,#0xfc000000
-+
-+ bls .Lskip_loop
-+
-+ vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^2
-+ vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^4
-+ vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]!
-+ vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]!
-+ b .Loop_neon
-+
-+.align 5
-+.Loop_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2
-+ @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r
-+ @ \___________________/
-+ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2
-+ @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r
-+ @ \___________________/ \____________________/
-+ @
-+ @ Note that we start with inp[2:3]*r^2. This is because it
-+ @ doesn't depend on reduction in previous iteration.
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ inp[2:3]*r^2
-+
-+ vadd.i32 $H2#lo,$H2#lo,$D2#lo @ accumulate inp[0:1]
-+ vmull.u32 $D2,$H2#hi,${R0}[1]
-+ vadd.i32 $H0#lo,$H0#lo,$D0#lo
-+ vmull.u32 $D0,$H0#hi,${R0}[1]
-+ vadd.i32 $H3#lo,$H3#lo,$D3#lo
-+ vmull.u32 $D3,$H3#hi,${R0}[1]
-+ vmlal.u32 $D2,$H1#hi,${R1}[1]
-+ vadd.i32 $H1#lo,$H1#lo,$D1#lo
-+ vmull.u32 $D1,$H1#hi,${R0}[1]
-+
-+ vadd.i32 $H4#lo,$H4#lo,$D4#lo
-+ vmull.u32 $D4,$H4#hi,${R0}[1]
-+ subs $len,$len,#64
-+ vmlal.u32 $D0,$H4#hi,${S1}[1]
-+ it lo
-+ movlo $in2,$zeros
-+ vmlal.u32 $D3,$H2#hi,${R1}[1]
-+ vld1.32 ${S4}[1],[$tbl1,:32]
-+ vmlal.u32 $D1,$H0#hi,${R1}[1]
-+ vmlal.u32 $D4,$H3#hi,${R1}[1]
-+
-+ vmlal.u32 $D0,$H3#hi,${S2}[1]
-+ vmlal.u32 $D3,$H1#hi,${R2}[1]
-+ vmlal.u32 $D4,$H2#hi,${R2}[1]
-+ vmlal.u32 $D1,$H4#hi,${S2}[1]
-+ vmlal.u32 $D2,$H0#hi,${R2}[1]
-+
-+ vmlal.u32 $D3,$H0#hi,${R3}[1]
-+ vmlal.u32 $D0,$H2#hi,${S3}[1]
-+ vmlal.u32 $D4,$H1#hi,${R3}[1]
-+ vmlal.u32 $D1,$H3#hi,${S3}[1]
-+ vmlal.u32 $D2,$H4#hi,${S3}[1]
-+
-+ vmlal.u32 $D3,$H4#hi,${S4}[1]
-+ vmlal.u32 $D0,$H1#hi,${S4}[1]
-+ vmlal.u32 $D4,$H0#hi,${R4}[1]
-+ vmlal.u32 $D1,$H2#hi,${S4}[1]
-+ vmlal.u32 $D2,$H3#hi,${S4}[1]
-+
-+ vld4.32 {$H0#hi,$H1#hi,$H2#hi,$H3#hi},[$in2] @ inp[2:3] (or 0)
-+ add $in2,$in2,#64
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ (hash+inp[0:1])*r^4 and accumulate
-+
-+ vmlal.u32 $D3,$H3#lo,${R0}[0]
-+ vmlal.u32 $D0,$H0#lo,${R0}[0]
-+ vmlal.u32 $D4,$H4#lo,${R0}[0]
-+ vmlal.u32 $D1,$H1#lo,${R0}[0]
-+ vmlal.u32 $D2,$H2#lo,${R0}[0]
-+ vld1.32 ${S4}[0],[$tbl0,:32]
-+
-+ vmlal.u32 $D3,$H2#lo,${R1}[0]
-+ vmlal.u32 $D0,$H4#lo,${S1}[0]
-+ vmlal.u32 $D4,$H3#lo,${R1}[0]
-+ vmlal.u32 $D1,$H0#lo,${R1}[0]
-+ vmlal.u32 $D2,$H1#lo,${R1}[0]
-+
-+ vmlal.u32 $D3,$H1#lo,${R2}[0]
-+ vmlal.u32 $D0,$H3#lo,${S2}[0]
-+ vmlal.u32 $D4,$H2#lo,${R2}[0]
-+ vmlal.u32 $D1,$H4#lo,${S2}[0]
-+ vmlal.u32 $D2,$H0#lo,${R2}[0]
-+
-+ vmlal.u32 $D3,$H0#lo,${R3}[0]
-+ vmlal.u32 $D0,$H2#lo,${S3}[0]
-+ vmlal.u32 $D4,$H1#lo,${R3}[0]
-+ vmlal.u32 $D1,$H3#lo,${S3}[0]
-+ vmlal.u32 $D3,$H4#lo,${S4}[0]
-+
-+ vmlal.u32 $D2,$H4#lo,${S3}[0]
-+ vmlal.u32 $D0,$H1#lo,${S4}[0]
-+ vmlal.u32 $D4,$H0#lo,${R4}[0]
-+ vmov.i32 $H4,#1<<24 @ padbit, yes, always
-+ vmlal.u32 $D1,$H2#lo,${S4}[0]
-+ vmlal.u32 $D2,$H3#lo,${S4}[0]
-+
-+ vld4.32 {$H0#lo,$H1#lo,$H2#lo,$H3#lo},[$inp] @ inp[0:1]
-+ add $inp,$inp,#64
-+# ifdef __ARMEB__
-+ vrev32.8 $H0,$H0
-+ vrev32.8 $H1,$H1
-+ vrev32.8 $H2,$H2
-+ vrev32.8 $H3,$H3
-+# endif
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction interleaved with base 2^32 -> base 2^26 of
-+ @ inp[0:3] previously loaded to $H0-$H3 and smashed to $H0-$H4.
-+
-+ vshr.u64 $T0,$D3,#26
-+ vmovn.i64 $D3#lo,$D3
-+ vshr.u64 $T1,$D0,#26
-+ vmovn.i64 $D0#lo,$D0
-+ vadd.i64 $D4,$D4,$T0 @ h3 -> h4
-+ vbic.i32 $D3#lo,#0xfc000000
-+ vsri.u32 $H4,$H3,#8 @ base 2^32 -> base 2^26
-+ vadd.i64 $D1,$D1,$T1 @ h0 -> h1
-+ vshl.u32 $H3,$H3,#18
-+ vbic.i32 $D0#lo,#0xfc000000
-+
-+ vshrn.u64 $T0#lo,$D4,#26
-+ vmovn.i64 $D4#lo,$D4
-+ vshr.u64 $T1,$D1,#26
-+ vmovn.i64 $D1#lo,$D1
-+ vadd.i64 $D2,$D2,$T1 @ h1 -> h2
-+ vsri.u32 $H3,$H2,#14
-+ vbic.i32 $D4#lo,#0xfc000000
-+ vshl.u32 $H2,$H2,#12
-+ vbic.i32 $D1#lo,#0xfc000000
-+
-+ vadd.i32 $D0#lo,$D0#lo,$T0#lo
-+ vshl.u32 $T0#lo,$T0#lo,#2
-+ vbic.i32 $H3,#0xfc000000
-+ vshrn.u64 $T1#lo,$D2,#26
-+ vmovn.i64 $D2#lo,$D2
-+ vaddl.u32 $D0,$D0#lo,$T0#lo @ h4 -> h0 [widen for a sec]
-+ vsri.u32 $H2,$H1,#20
-+ vadd.i32 $D3#lo,$D3#lo,$T1#lo @ h2 -> h3
-+ vshl.u32 $H1,$H1,#6
-+ vbic.i32 $D2#lo,#0xfc000000
-+ vbic.i32 $H2,#0xfc000000
-+
-+ vshrn.u64 $T0#lo,$D0,#26 @ re-narrow
-+ vmovn.i64 $D0#lo,$D0
-+ vsri.u32 $H1,$H0,#26
-+ vbic.i32 $H0,#0xfc000000
-+ vshr.u32 $T1#lo,$D3#lo,#26
-+ vbic.i32 $D3#lo,#0xfc000000
-+ vbic.i32 $D0#lo,#0xfc000000
-+ vadd.i32 $D1#lo,$D1#lo,$T0#lo @ h0 -> h1
-+ vadd.i32 $D4#lo,$D4#lo,$T1#lo @ h3 -> h4
-+ vbic.i32 $H1,#0xfc000000
-+
-+ bhi .Loop_neon
-+
-+.Lskip_loop:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1
-+
-+ add $tbl1,$ctx,#(48+0*9*4)
-+ add $tbl0,$ctx,#(48+1*9*4)
-+ adds $len,$len,#32
-+ it ne
-+ movne $len,#0
-+ bne .Long_tail
-+
-+ vadd.i32 $H2#hi,$H2#lo,$D2#lo @ add hash value and move to #hi
-+ vadd.i32 $H0#hi,$H0#lo,$D0#lo
-+ vadd.i32 $H3#hi,$H3#lo,$D3#lo
-+ vadd.i32 $H1#hi,$H1#lo,$D1#lo
-+ vadd.i32 $H4#hi,$H4#lo,$D4#lo
-+
-+.Long_tail:
-+ vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^1
-+ vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^2
-+
-+ vadd.i32 $H2#lo,$H2#lo,$D2#lo @ can be redundant
-+ vmull.u32 $D2,$H2#hi,$R0
-+ vadd.i32 $H0#lo,$H0#lo,$D0#lo
-+ vmull.u32 $D0,$H0#hi,$R0
-+ vadd.i32 $H3#lo,$H3#lo,$D3#lo
-+ vmull.u32 $D3,$H3#hi,$R0
-+ vadd.i32 $H1#lo,$H1#lo,$D1#lo
-+ vmull.u32 $D1,$H1#hi,$R0
-+ vadd.i32 $H4#lo,$H4#lo,$D4#lo
-+ vmull.u32 $D4,$H4#hi,$R0
-+
-+ vmlal.u32 $D0,$H4#hi,$S1
-+ vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]!
-+ vmlal.u32 $D3,$H2#hi,$R1
-+ vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]!
-+ vmlal.u32 $D1,$H0#hi,$R1
-+ vmlal.u32 $D4,$H3#hi,$R1
-+ vmlal.u32 $D2,$H1#hi,$R1
-+
-+ vmlal.u32 $D3,$H1#hi,$R2
-+ vld1.32 ${S4}[1],[$tbl1,:32]
-+ vmlal.u32 $D0,$H3#hi,$S2
-+ vld1.32 ${S4}[0],[$tbl0,:32]
-+ vmlal.u32 $D4,$H2#hi,$R2
-+ vmlal.u32 $D1,$H4#hi,$S2
-+ vmlal.u32 $D2,$H0#hi,$R2
-+
-+ vmlal.u32 $D3,$H0#hi,$R3
-+ it ne
-+ addne $tbl1,$ctx,#(48+2*9*4)
-+ vmlal.u32 $D0,$H2#hi,$S3
-+ it ne
-+ addne $tbl0,$ctx,#(48+3*9*4)
-+ vmlal.u32 $D4,$H1#hi,$R3
-+ vmlal.u32 $D1,$H3#hi,$S3
-+ vmlal.u32 $D2,$H4#hi,$S3
-+
-+ vmlal.u32 $D3,$H4#hi,$S4
-+ vorn $MASK,$MASK,$MASK @ all-ones, can be redundant
-+ vmlal.u32 $D0,$H1#hi,$S4
-+ vshr.u64 $MASK,$MASK,#38
-+ vmlal.u32 $D4,$H0#hi,$R4
-+ vmlal.u32 $D1,$H2#hi,$S4
-+ vmlal.u32 $D2,$H3#hi,$S4
-+
-+ beq .Lshort_tail
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ (hash+inp[0:1])*r^4:r^3 and accumulate
-+
-+ vld4.32 {${R0}[1],${R1}[1],${S1}[1],${R2}[1]},[$tbl1]! @ load r^3
-+ vld4.32 {${R0}[0],${R1}[0],${S1}[0],${R2}[0]},[$tbl0]! @ load r^4
-+
-+ vmlal.u32 $D2,$H2#lo,$R0
-+ vmlal.u32 $D0,$H0#lo,$R0
-+ vmlal.u32 $D3,$H3#lo,$R0
-+ vmlal.u32 $D1,$H1#lo,$R0
-+ vmlal.u32 $D4,$H4#lo,$R0
-+
-+ vmlal.u32 $D0,$H4#lo,$S1
-+ vld4.32 {${S2}[1],${R3}[1],${S3}[1],${R4}[1]},[$tbl1]!
-+ vmlal.u32 $D3,$H2#lo,$R1
-+ vld4.32 {${S2}[0],${R3}[0],${S3}[0],${R4}[0]},[$tbl0]!
-+ vmlal.u32 $D1,$H0#lo,$R1
-+ vmlal.u32 $D4,$H3#lo,$R1
-+ vmlal.u32 $D2,$H1#lo,$R1
-+
-+ vmlal.u32 $D3,$H1#lo,$R2
-+ vld1.32 ${S4}[1],[$tbl1,:32]
-+ vmlal.u32 $D0,$H3#lo,$S2
-+ vld1.32 ${S4}[0],[$tbl0,:32]
-+ vmlal.u32 $D4,$H2#lo,$R2
-+ vmlal.u32 $D1,$H4#lo,$S2
-+ vmlal.u32 $D2,$H0#lo,$R2
-+
-+ vmlal.u32 $D3,$H0#lo,$R3
-+ vmlal.u32 $D0,$H2#lo,$S3
-+ vmlal.u32 $D4,$H1#lo,$R3
-+ vmlal.u32 $D1,$H3#lo,$S3
-+ vmlal.u32 $D2,$H4#lo,$S3
-+
-+ vmlal.u32 $D3,$H4#lo,$S4
-+ vorn $MASK,$MASK,$MASK @ all-ones
-+ vmlal.u32 $D0,$H1#lo,$S4
-+ vshr.u64 $MASK,$MASK,#38
-+ vmlal.u32 $D4,$H0#lo,$R4
-+ vmlal.u32 $D1,$H2#lo,$S4
-+ vmlal.u32 $D2,$H3#lo,$S4
-+
-+.Lshort_tail:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ horizontal addition
-+
-+ vadd.i64 $D3#lo,$D3#lo,$D3#hi
-+ vadd.i64 $D0#lo,$D0#lo,$D0#hi
-+ vadd.i64 $D4#lo,$D4#lo,$D4#hi
-+ vadd.i64 $D1#lo,$D1#lo,$D1#hi
-+ vadd.i64 $D2#lo,$D2#lo,$D2#hi
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction, but without narrowing
-+
-+ vshr.u64 $T0,$D3,#26
-+ vand.i64 $D3,$D3,$MASK
-+ vshr.u64 $T1,$D0,#26
-+ vand.i64 $D0,$D0,$MASK
-+ vadd.i64 $D4,$D4,$T0 @ h3 -> h4
-+ vadd.i64 $D1,$D1,$T1 @ h0 -> h1
-+
-+ vshr.u64 $T0,$D4,#26
-+ vand.i64 $D4,$D4,$MASK
-+ vshr.u64 $T1,$D1,#26
-+ vand.i64 $D1,$D1,$MASK
-+ vadd.i64 $D2,$D2,$T1 @ h1 -> h2
-+
-+ vadd.i64 $D0,$D0,$T0
-+ vshl.u64 $T0,$T0,#2
-+ vshr.u64 $T1,$D2,#26
-+ vand.i64 $D2,$D2,$MASK
-+ vadd.i64 $D0,$D0,$T0 @ h4 -> h0
-+ vadd.i64 $D3,$D3,$T1 @ h2 -> h3
-+
-+ vshr.u64 $T0,$D0,#26
-+ vand.i64 $D0,$D0,$MASK
-+ vshr.u64 $T1,$D3,#26
-+ vand.i64 $D3,$D3,$MASK
-+ vadd.i64 $D1,$D1,$T0 @ h0 -> h1
-+ vadd.i64 $D4,$D4,$T1 @ h3 -> h4
-+
-+ cmp $len,#0
-+ bne .Leven
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ store hash value
-+
-+ vst4.32 {$D0#lo[0],$D1#lo[0],$D2#lo[0],$D3#lo[0]},[$ctx]!
-+ vst1.32 {$D4#lo[0]},[$ctx]
-+
-+ vldmia sp!,{d8-d15} @ epilogue
-+ ldmia sp!,{r4-r7}
-+ ret @ bx lr
-+.size poly1305_blocks_neon,.-poly1305_blocks_neon
-+
-+.align 5
-+.Lzeros:
-+.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-+#ifndef __KERNEL__
-+.LOPENSSL_armcap:
-+# ifdef _WIN32
-+.word OPENSSL_armcap_P
-+# else
-+.word OPENSSL_armcap_P-.Lpoly1305_init
-+# endif
-+.comm OPENSSL_armcap_P,4,4
-+.hidden OPENSSL_armcap_P
-+#endif
-+#endif
-+___
-+} }
-+$code.=<<___;
-+.asciz "Poly1305 for ARMv4/NEON, CRYPTOGAMS by \@dot-asm"
-+.align 2
-+___
-+
-+foreach (split("\n",$code)) {
-+ s/\`([^\`]*)\`/eval $1/geo;
-+
-+ s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or
-+ s/\bret\b/bx lr/go or
-+ s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4
-+
-+ print $_,"\n";
-+}
-+close STDOUT; # enforce flush
---- /dev/null
-+++ b/arch/arm/crypto/poly1305-core.S_shipped
-@@ -0,0 +1,1158 @@
-+#ifndef __KERNEL__
-+# include "arm_arch.h"
-+#else
-+# define __ARM_ARCH__ __LINUX_ARM_ARCH__
-+# define __ARM_MAX_ARCH__ __LINUX_ARM_ARCH__
-+# define poly1305_init poly1305_init_arm
-+# define poly1305_blocks poly1305_blocks_arm
-+# define poly1305_emit poly1305_emit_arm
-+.globl poly1305_blocks_neon
-+#endif
-+
-+#if defined(__thumb2__)
-+.syntax unified
-+.thumb
-+#else
-+.code 32
-+#endif
-+
-+.text
-+
-+.globl poly1305_emit
-+.globl poly1305_blocks
-+.globl poly1305_init
-+.type poly1305_init,%function
-+.align 5
-+poly1305_init:
-+.Lpoly1305_init:
-+ stmdb sp!,{r4-r11}
-+
-+ eor r3,r3,r3
-+ cmp r1,#0
-+ str r3,[r0,#0] @ zero hash value
-+ str r3,[r0,#4]
-+ str r3,[r0,#8]
-+ str r3,[r0,#12]
-+ str r3,[r0,#16]
-+ str r3,[r0,#36] @ clear is_base2_26
-+ add r0,r0,#20
-+
-+#ifdef __thumb2__
-+ it eq
-+#endif
-+ moveq r0,#0
-+ beq .Lno_key
-+
-+#if __ARM_MAX_ARCH__>=7
-+ mov r3,#-1
-+ str r3,[r0,#28] @ impossible key power value
-+# ifndef __KERNEL__
-+ adr r11,.Lpoly1305_init
-+ ldr r12,.LOPENSSL_armcap
-+# endif
-+#endif
-+ ldrb r4,[r1,#0]
-+ mov r10,#0x0fffffff
-+ ldrb r5,[r1,#1]
-+ and r3,r10,#-4 @ 0x0ffffffc
-+ ldrb r6,[r1,#2]
-+ ldrb r7,[r1,#3]
-+ orr r4,r4,r5,lsl#8
-+ ldrb r5,[r1,#4]
-+ orr r4,r4,r6,lsl#16
-+ ldrb r6,[r1,#5]
-+ orr r4,r4,r7,lsl#24
-+ ldrb r7,[r1,#6]
-+ and r4,r4,r10
-+
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+# if !defined(_WIN32)
-+ ldr r12,[r11,r12] @ OPENSSL_armcap_P
-+# endif
-+# if defined(__APPLE__) || defined(_WIN32)
-+ ldr r12,[r12]
-+# endif
-+#endif
-+ ldrb r8,[r1,#7]
-+ orr r5,r5,r6,lsl#8
-+ ldrb r6,[r1,#8]
-+ orr r5,r5,r7,lsl#16
-+ ldrb r7,[r1,#9]
-+ orr r5,r5,r8,lsl#24
-+ ldrb r8,[r1,#10]
-+ and r5,r5,r3
-+
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+ tst r12,#ARMV7_NEON @ check for NEON
-+# ifdef __thumb2__
-+ adr r9,.Lpoly1305_blocks_neon
-+ adr r11,.Lpoly1305_blocks
-+ it ne
-+ movne r11,r9
-+ adr r12,.Lpoly1305_emit
-+ orr r11,r11,#1 @ thumb-ify addresses
-+ orr r12,r12,#1
-+# else
-+ add r12,r11,#(.Lpoly1305_emit-.Lpoly1305_init)
-+ ite eq
-+ addeq r11,r11,#(.Lpoly1305_blocks-.Lpoly1305_init)
-+ addne r11,r11,#(.Lpoly1305_blocks_neon-.Lpoly1305_init)
-+# endif
-+#endif
-+ ldrb r9,[r1,#11]
-+ orr r6,r6,r7,lsl#8
-+ ldrb r7,[r1,#12]
-+ orr r6,r6,r8,lsl#16
-+ ldrb r8,[r1,#13]
-+ orr r6,r6,r9,lsl#24
-+ ldrb r9,[r1,#14]
-+ and r6,r6,r3
-+
-+ ldrb r10,[r1,#15]
-+ orr r7,r7,r8,lsl#8
-+ str r4,[r0,#0]
-+ orr r7,r7,r9,lsl#16
-+ str r5,[r0,#4]
-+ orr r7,r7,r10,lsl#24
-+ str r6,[r0,#8]
-+ and r7,r7,r3
-+ str r7,[r0,#12]
-+#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
-+ stmia r2,{r11,r12} @ fill functions table
-+ mov r0,#1
-+#else
-+ mov r0,#0
-+#endif
-+.Lno_key:
-+ ldmia sp!,{r4-r11}
-+#if __ARM_ARCH__>=5
-+ bx lr @ bx lr
-+#else
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ .word 0xe12fff1e @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_init,.-poly1305_init
-+.type poly1305_blocks,%function
-+.align 5
-+poly1305_blocks:
-+.Lpoly1305_blocks:
-+ stmdb sp!,{r3-r11,lr}
-+
-+ ands r2,r2,#-16
-+ beq .Lno_data
-+
-+ add r2,r2,r1 @ end pointer
-+ sub sp,sp,#32
-+
-+#if __ARM_ARCH__<7
-+ ldmia r0,{r4-r12} @ load context
-+ add r0,r0,#20
-+ str r2,[sp,#16] @ offload stuff
-+ str r0,[sp,#12]
-+#else
-+ ldr lr,[r0,#36] @ is_base2_26
-+ ldmia r0!,{r4-r8} @ load hash value
-+ str r2,[sp,#16] @ offload stuff
-+ str r0,[sp,#12]
-+
-+ adds r9,r4,r5,lsl#26 @ base 2^26 -> base 2^32
-+ mov r10,r5,lsr#6
-+ adcs r10,r10,r6,lsl#20
-+ mov r11,r6,lsr#12
-+ adcs r11,r11,r7,lsl#14
-+ mov r12,r7,lsr#18
-+ adcs r12,r12,r8,lsl#8
-+ mov r2,#0
-+ teq lr,#0
-+ str r2,[r0,#16] @ clear is_base2_26
-+ adc r2,r2,r8,lsr#24
-+
-+ itttt ne
-+ movne r4,r9 @ choose between radixes
-+ movne r5,r10
-+ movne r6,r11
-+ movne r7,r12
-+ ldmia r0,{r9-r12} @ load key
-+ it ne
-+ movne r8,r2
-+#endif
-+
-+ mov lr,r1
-+ cmp r3,#0
-+ str r10,[sp,#20]
-+ str r11,[sp,#24]
-+ str r12,[sp,#28]
-+ b .Loop
-+
-+.align 4
-+.Loop:
-+#if __ARM_ARCH__<7
-+ ldrb r0,[lr],#16 @ load input
-+# ifdef __thumb2__
-+ it hi
-+# endif
-+ addhi r8,r8,#1 @ 1<<128
-+ ldrb r1,[lr,#-15]
-+ ldrb r2,[lr,#-14]
-+ ldrb r3,[lr,#-13]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-12]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-11]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-10]
-+ adds r4,r4,r3 @ accumulate input
-+
-+ ldrb r3,[lr,#-9]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-8]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-7]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-6]
-+ adcs r5,r5,r3
-+
-+ ldrb r3,[lr,#-5]
-+ orr r1,r0,r1,lsl#8
-+ ldrb r0,[lr,#-4]
-+ orr r2,r1,r2,lsl#16
-+ ldrb r1,[lr,#-3]
-+ orr r3,r2,r3,lsl#24
-+ ldrb r2,[lr,#-2]
-+ adcs r6,r6,r3
-+
-+ ldrb r3,[lr,#-1]
-+ orr r1,r0,r1,lsl#8
-+ str lr,[sp,#8] @ offload input pointer
-+ orr r2,r1,r2,lsl#16
-+ add r10,r10,r10,lsr#2
-+ orr r3,r2,r3,lsl#24
-+#else
-+ ldr r0,[lr],#16 @ load input
-+ it hi
-+ addhi r8,r8,#1 @ padbit
-+ ldr r1,[lr,#-12]
-+ ldr r2,[lr,#-8]
-+ ldr r3,[lr,#-4]
-+# ifdef __ARMEB__
-+ rev r0,r0
-+ rev r1,r1
-+ rev r2,r2
-+ rev r3,r3
-+# endif
-+ adds r4,r4,r0 @ accumulate input
-+ str lr,[sp,#8] @ offload input pointer
-+ adcs r5,r5,r1
-+ add r10,r10,r10,lsr#2
-+ adcs r6,r6,r2
-+#endif
-+ add r11,r11,r11,lsr#2
-+ adcs r7,r7,r3
-+ add r12,r12,r12,lsr#2
-+
-+ umull r2,r3,r5,r9
-+ adc r8,r8,#0
-+ umull r0,r1,r4,r9
-+ umlal r2,r3,r8,r10
-+ umlal r0,r1,r7,r10
-+ ldr r10,[sp,#20] @ reload r10
-+ umlal r2,r3,r6,r12
-+ umlal r0,r1,r5,r12
-+ umlal r2,r3,r7,r11
-+ umlal r0,r1,r6,r11
-+ umlal r2,r3,r4,r10
-+ str r0,[sp,#0] @ future r4
-+ mul r0,r11,r8
-+ ldr r11,[sp,#24] @ reload r11
-+ adds r2,r2,r1 @ d1+=d0>>32
-+ eor r1,r1,r1
-+ adc lr,r3,#0 @ future r6
-+ str r2,[sp,#4] @ future r5
-+
-+ mul r2,r12,r8
-+ eor r3,r3,r3
-+ umlal r0,r1,r7,r12
-+ ldr r12,[sp,#28] @ reload r12
-+ umlal r2,r3,r7,r9
-+ umlal r0,r1,r6,r9
-+ umlal r2,r3,r6,r10
-+ umlal r0,r1,r5,r10
-+ umlal r2,r3,r5,r11
-+ umlal r0,r1,r4,r11
-+ umlal r2,r3,r4,r12
-+ ldr r4,[sp,#0]
-+ mul r8,r9,r8
-+ ldr r5,[sp,#4]
-+
-+ adds r6,lr,r0 @ d2+=d1>>32
-+ ldr lr,[sp,#8] @ reload input pointer
-+ adc r1,r1,#0
-+ adds r7,r2,r1 @ d3+=d2>>32
-+ ldr r0,[sp,#16] @ reload end pointer
-+ adc r3,r3,#0
-+ add r8,r8,r3 @ h4+=d3>>32
-+
-+ and r1,r8,#-4
-+ and r8,r8,#3
-+ add r1,r1,r1,lsr#2 @ *=5
-+ adds r4,r4,r1
-+ adcs r5,r5,#0
-+ adcs r6,r6,#0
-+ adcs r7,r7,#0
-+ adc r8,r8,#0
-+
-+ cmp r0,lr @ done yet?
-+ bhi .Loop
-+
-+ ldr r0,[sp,#12]
-+ add sp,sp,#32
-+ stmdb r0,{r4-r8} @ store the result
-+
-+.Lno_data:
-+#if __ARM_ARCH__>=5
-+ ldmia sp!,{r3-r11,pc}
-+#else
-+ ldmia sp!,{r3-r11,lr}
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ .word 0xe12fff1e @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_blocks,.-poly1305_blocks
-+.type poly1305_emit,%function
-+.align 5
-+poly1305_emit:
-+.Lpoly1305_emit:
-+ stmdb sp!,{r4-r11}
-+
-+ ldmia r0,{r3-r7}
-+
-+#if __ARM_ARCH__>=7
-+ ldr ip,[r0,#36] @ is_base2_26
-+
-+ adds r8,r3,r4,lsl#26 @ base 2^26 -> base 2^32
-+ mov r9,r4,lsr#6
-+ adcs r9,r9,r5,lsl#20
-+ mov r10,r5,lsr#12
-+ adcs r10,r10,r6,lsl#14
-+ mov r11,r6,lsr#18
-+ adcs r11,r11,r7,lsl#8
-+ mov r0,#0
-+ adc r0,r0,r7,lsr#24
-+
-+ tst ip,ip
-+ itttt ne
-+ movne r3,r8
-+ movne r4,r9
-+ movne r5,r10
-+ movne r6,r11
-+ it ne
-+ movne r7,r0
-+#endif
-+
-+ adds r8,r3,#5 @ compare to modulus
-+ adcs r9,r4,#0
-+ adcs r10,r5,#0
-+ adcs r11,r6,#0
-+ adc r0,r7,#0
-+ tst r0,#4 @ did it carry/borrow?
-+
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne r3,r8
-+ ldr r8,[r2,#0]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne r4,r9
-+ ldr r9,[r2,#4]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne r5,r10
-+ ldr r10,[r2,#8]
-+#ifdef __thumb2__
-+ it ne
-+#endif
-+ movne r6,r11
-+ ldr r11,[r2,#12]
-+
-+ adds r3,r3,r8
-+ adcs r4,r4,r9
-+ adcs r5,r5,r10
-+ adc r6,r6,r11
-+
-+#if __ARM_ARCH__>=7
-+# ifdef __ARMEB__
-+ rev r3,r3
-+ rev r4,r4
-+ rev r5,r5
-+ rev r6,r6
-+# endif
-+ str r3,[r1,#0]
-+ str r4,[r1,#4]
-+ str r5,[r1,#8]
-+ str r6,[r1,#12]
-+#else
-+ strb r3,[r1,#0]
-+ mov r3,r3,lsr#8
-+ strb r4,[r1,#4]
-+ mov r4,r4,lsr#8
-+ strb r5,[r1,#8]
-+ mov r5,r5,lsr#8
-+ strb r6,[r1,#12]
-+ mov r6,r6,lsr#8
-+
-+ strb r3,[r1,#1]
-+ mov r3,r3,lsr#8
-+ strb r4,[r1,#5]
-+ mov r4,r4,lsr#8
-+ strb r5,[r1,#9]
-+ mov r5,r5,lsr#8
-+ strb r6,[r1,#13]
-+ mov r6,r6,lsr#8
-+
-+ strb r3,[r1,#2]
-+ mov r3,r3,lsr#8
-+ strb r4,[r1,#6]
-+ mov r4,r4,lsr#8
-+ strb r5,[r1,#10]
-+ mov r5,r5,lsr#8
-+ strb r6,[r1,#14]
-+ mov r6,r6,lsr#8
-+
-+ strb r3,[r1,#3]
-+ strb r4,[r1,#7]
-+ strb r5,[r1,#11]
-+ strb r6,[r1,#15]
-+#endif
-+ ldmia sp!,{r4-r11}
-+#if __ARM_ARCH__>=5
-+ bx lr @ bx lr
-+#else
-+ tst lr,#1
-+ moveq pc,lr @ be binary compatible with V4, yet
-+ .word 0xe12fff1e @ interoperable with Thumb ISA:-)
-+#endif
-+.size poly1305_emit,.-poly1305_emit
-+#if __ARM_MAX_ARCH__>=7
-+.fpu neon
-+
-+.type poly1305_init_neon,%function
-+.align 5
-+poly1305_init_neon:
-+.Lpoly1305_init_neon:
-+ ldr r3,[r0,#48] @ first table element
-+ cmp r3,#-1 @ is value impossible?
-+ bne .Lno_init_neon
-+
-+ ldr r4,[r0,#20] @ load key base 2^32
-+ ldr r5,[r0,#24]
-+ ldr r6,[r0,#28]
-+ ldr r7,[r0,#32]
-+
-+ and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26
-+ mov r3,r4,lsr#26
-+ mov r4,r5,lsr#20
-+ orr r3,r3,r5,lsl#6
-+ mov r5,r6,lsr#14
-+ orr r4,r4,r6,lsl#12
-+ mov r6,r7,lsr#8
-+ orr r5,r5,r7,lsl#18
-+ and r3,r3,#0x03ffffff
-+ and r4,r4,#0x03ffffff
-+ and r5,r5,#0x03ffffff
-+
-+ vdup.32 d0,r2 @ r^1 in both lanes
-+ add r2,r3,r3,lsl#2 @ *5
-+ vdup.32 d1,r3
-+ add r3,r4,r4,lsl#2
-+ vdup.32 d2,r2
-+ vdup.32 d3,r4
-+ add r4,r5,r5,lsl#2
-+ vdup.32 d4,r3
-+ vdup.32 d5,r5
-+ add r5,r6,r6,lsl#2
-+ vdup.32 d6,r4
-+ vdup.32 d7,r6
-+ vdup.32 d8,r5
-+
-+ mov r5,#2 @ counter
-+
-+.Lsquare_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+ @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+
-+ vmull.u32 q5,d0,d0[1]
-+ vmull.u32 q6,d1,d0[1]
-+ vmull.u32 q7,d3,d0[1]
-+ vmull.u32 q8,d5,d0[1]
-+ vmull.u32 q9,d7,d0[1]
-+
-+ vmlal.u32 q5,d7,d2[1]
-+ vmlal.u32 q6,d0,d1[1]
-+ vmlal.u32 q7,d1,d1[1]
-+ vmlal.u32 q8,d3,d1[1]
-+ vmlal.u32 q9,d5,d1[1]
-+
-+ vmlal.u32 q5,d5,d4[1]
-+ vmlal.u32 q6,d7,d4[1]
-+ vmlal.u32 q8,d1,d3[1]
-+ vmlal.u32 q7,d0,d3[1]
-+ vmlal.u32 q9,d3,d3[1]
-+
-+ vmlal.u32 q5,d3,d6[1]
-+ vmlal.u32 q8,d0,d5[1]
-+ vmlal.u32 q6,d5,d6[1]
-+ vmlal.u32 q7,d7,d6[1]
-+ vmlal.u32 q9,d1,d5[1]
-+
-+ vmlal.u32 q8,d7,d8[1]
-+ vmlal.u32 q5,d1,d8[1]
-+ vmlal.u32 q6,d3,d8[1]
-+ vmlal.u32 q7,d5,d8[1]
-+ vmlal.u32 q9,d0,d7[1]
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction as discussed in "NEON crypto" by D.J. Bernstein
-+ @ and P. Schwabe
-+ @
-+ @ H0>>+H1>>+H2>>+H3>>+H4
-+ @ H3>>+H4>>*5+H0>>+H1
-+ @
-+ @ Trivia.
-+ @
-+ @ Result of multiplication of n-bit number by m-bit number is
-+ @ n+m bits wide. However! Even though 2^n is a n+1-bit number,
-+ @ m-bit number multiplied by 2^n is still n+m bits wide.
-+ @
-+ @ Sum of two n-bit numbers is n+1 bits wide, sum of three - n+2,
-+ @ and so is sum of four. Sum of 2^m n-m-bit numbers and n-bit
-+ @ one is n+1 bits wide.
-+ @
-+ @ >>+ denotes Hnext += Hn>>26, Hn &= 0x3ffffff. This means that
-+ @ H0, H2, H3 are guaranteed to be 26 bits wide, while H1 and H4
-+ @ can be 27. However! In cases when their width exceeds 26 bits
-+ @ they are limited by 2^26+2^6. This in turn means that *sum*
-+ @ of the products with these values can still be viewed as sum
-+ @ of 52-bit numbers as long as the amount of addends is not a
-+ @ power of 2. For example,
-+ @
-+ @ H4 = H4*R0 + H3*R1 + H2*R2 + H1*R3 + H0 * R4,
-+ @
-+ @ which can't be larger than 5 * (2^26 + 2^6) * (2^26 + 2^6), or
-+ @ 5 * (2^52 + 2*2^32 + 2^12), which in turn is smaller than
-+ @ 8 * (2^52) or 2^55. However, the value is then multiplied by
-+ @ by 5, so we should be looking at 5 * 5 * (2^52 + 2^33 + 2^12),
-+ @ which is less than 32 * (2^52) or 2^57. And when processing
-+ @ data we are looking at triple as many addends...
-+ @
-+ @ In key setup procedure pre-reduced H0 is limited by 5*4+1 and
-+ @ 5*H4 - by 5*5 52-bit addends, or 57 bits. But when hashing the
-+ @ input H0 is limited by (5*4+1)*3 addends, or 58 bits, while
-+ @ 5*H4 by 5*5*3, or 59[!] bits. How is this relevant? vmlal.u32
-+ @ instruction accepts 2x32-bit input and writes 2x64-bit result.
-+ @ This means that result of reduction have to be compressed upon
-+ @ loop wrap-around. This can be done in the process of reduction
-+ @ to minimize amount of instructions [as well as amount of
-+ @ 128-bit instructions, which benefits low-end processors], but
-+ @ one has to watch for H2 (which is narrower than H0) and 5*H4
-+ @ not being wider than 58 bits, so that result of right shift
-+ @ by 26 bits fits in 32 bits. This is also useful on x86,
-+ @ because it allows to use paddd in place for paddq, which
-+ @ benefits Atom, where paddq is ridiculously slow.
-+
-+ vshr.u64 q15,q8,#26
-+ vmovn.i64 d16,q8
-+ vshr.u64 q4,q5,#26
-+ vmovn.i64 d10,q5
-+ vadd.i64 q9,q9,q15 @ h3 -> h4
-+ vbic.i32 d16,#0xfc000000 @ &=0x03ffffff
-+ vadd.i64 q6,q6,q4 @ h0 -> h1
-+ vbic.i32 d10,#0xfc000000
-+
-+ vshrn.u64 d30,q9,#26
-+ vmovn.i64 d18,q9
-+ vshr.u64 q4,q6,#26
-+ vmovn.i64 d12,q6
-+ vadd.i64 q7,q7,q4 @ h1 -> h2
-+ vbic.i32 d18,#0xfc000000
-+ vbic.i32 d12,#0xfc000000
-+
-+ vadd.i32 d10,d10,d30
-+ vshl.u32 d30,d30,#2
-+ vshrn.u64 d8,q7,#26
-+ vmovn.i64 d14,q7
-+ vadd.i32 d10,d10,d30 @ h4 -> h0
-+ vadd.i32 d16,d16,d8 @ h2 -> h3
-+ vbic.i32 d14,#0xfc000000
-+
-+ vshr.u32 d30,d10,#26
-+ vbic.i32 d10,#0xfc000000
-+ vshr.u32 d8,d16,#26
-+ vbic.i32 d16,#0xfc000000
-+ vadd.i32 d12,d12,d30 @ h0 -> h1
-+ vadd.i32 d18,d18,d8 @ h3 -> h4
-+
-+ subs r5,r5,#1
-+ beq .Lsquare_break_neon
-+
-+ add r6,r0,#(48+0*9*4)
-+ add r7,r0,#(48+1*9*4)
-+
-+ vtrn.32 d0,d10 @ r^2:r^1
-+ vtrn.32 d3,d14
-+ vtrn.32 d5,d16
-+ vtrn.32 d1,d12
-+ vtrn.32 d7,d18
-+
-+ vshl.u32 d4,d3,#2 @ *5
-+ vshl.u32 d6,d5,#2
-+ vshl.u32 d2,d1,#2
-+ vshl.u32 d8,d7,#2
-+ vadd.i32 d4,d4,d3
-+ vadd.i32 d2,d2,d1
-+ vadd.i32 d6,d6,d5
-+ vadd.i32 d8,d8,d7
-+
-+ vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]!
-+ vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]!
-+ vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]!
-+ vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]!
-+ vst1.32 {d8[0]},[r6,:32]
-+ vst1.32 {d8[1]},[r7,:32]
-+
-+ b .Lsquare_neon
-+
-+.align 4
-+.Lsquare_break_neon:
-+ add r6,r0,#(48+2*4*9)
-+ add r7,r0,#(48+3*4*9)
-+
-+ vmov d0,d10 @ r^4:r^3
-+ vshl.u32 d2,d12,#2 @ *5
-+ vmov d1,d12
-+ vshl.u32 d4,d14,#2
-+ vmov d3,d14
-+ vshl.u32 d6,d16,#2
-+ vmov d5,d16
-+ vshl.u32 d8,d18,#2
-+ vmov d7,d18
-+ vadd.i32 d2,d2,d12
-+ vadd.i32 d4,d4,d14
-+ vadd.i32 d6,d6,d16
-+ vadd.i32 d8,d8,d18
-+
-+ vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]!
-+ vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]!
-+ vst4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]!
-+ vst4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]!
-+ vst1.32 {d8[0]},[r6]
-+ vst1.32 {d8[1]},[r7]
-+
-+.Lno_init_neon:
-+ bx lr @ bx lr
-+.size poly1305_init_neon,.-poly1305_init_neon
-+
-+.type poly1305_blocks_neon,%function
-+.align 5
-+poly1305_blocks_neon:
-+.Lpoly1305_blocks_neon:
-+ ldr ip,[r0,#36] @ is_base2_26
-+
-+ cmp r2,#64
-+ blo .Lpoly1305_blocks
-+
-+ stmdb sp!,{r4-r7}
-+ vstmdb sp!,{d8-d15} @ ABI specification says so
-+
-+ tst ip,ip @ is_base2_26?
-+ bne .Lbase2_26_neon
-+
-+ stmdb sp!,{r1-r3,lr}
-+ bl .Lpoly1305_init_neon
-+
-+ ldr r4,[r0,#0] @ load hash value base 2^32
-+ ldr r5,[r0,#4]
-+ ldr r6,[r0,#8]
-+ ldr r7,[r0,#12]
-+ ldr ip,[r0,#16]
-+
-+ and r2,r4,#0x03ffffff @ base 2^32 -> base 2^26
-+ mov r3,r4,lsr#26
-+ veor d10,d10,d10
-+ mov r4,r5,lsr#20
-+ orr r3,r3,r5,lsl#6
-+ veor d12,d12,d12
-+ mov r5,r6,lsr#14
-+ orr r4,r4,r6,lsl#12
-+ veor d14,d14,d14
-+ mov r6,r7,lsr#8
-+ orr r5,r5,r7,lsl#18
-+ veor d16,d16,d16
-+ and r3,r3,#0x03ffffff
-+ orr r6,r6,ip,lsl#24
-+ veor d18,d18,d18
-+ and r4,r4,#0x03ffffff
-+ mov r1,#1
-+ and r5,r5,#0x03ffffff
-+ str r1,[r0,#36] @ set is_base2_26
-+
-+ vmov.32 d10[0],r2
-+ vmov.32 d12[0],r3
-+ vmov.32 d14[0],r4
-+ vmov.32 d16[0],r5
-+ vmov.32 d18[0],r6
-+ adr r5,.Lzeros
-+
-+ ldmia sp!,{r1-r3,lr}
-+ b .Lhash_loaded
-+
-+.align 4
-+.Lbase2_26_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ load hash value
-+
-+ veor d10,d10,d10
-+ veor d12,d12,d12
-+ veor d14,d14,d14
-+ veor d16,d16,d16
-+ veor d18,d18,d18
-+ vld4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]!
-+ adr r5,.Lzeros
-+ vld1.32 {d18[0]},[r0]
-+ sub r0,r0,#16 @ rewind
-+
-+.Lhash_loaded:
-+ add r4,r1,#32
-+ mov r3,r3,lsl#24
-+ tst r2,#31
-+ beq .Leven
-+
-+ vld4.32 {d20[0],d22[0],d24[0],d26[0]},[r1]!
-+ vmov.32 d28[0],r3
-+ sub r2,r2,#16
-+ add r4,r1,#32
-+
-+# ifdef __ARMEB__
-+ vrev32.8 q10,q10
-+ vrev32.8 q13,q13
-+ vrev32.8 q11,q11
-+ vrev32.8 q12,q12
-+# endif
-+ vsri.u32 d28,d26,#8 @ base 2^32 -> base 2^26
-+ vshl.u32 d26,d26,#18
-+
-+ vsri.u32 d26,d24,#14
-+ vshl.u32 d24,d24,#12
-+ vadd.i32 d29,d28,d18 @ add hash value and move to #hi
-+
-+ vbic.i32 d26,#0xfc000000
-+ vsri.u32 d24,d22,#20
-+ vshl.u32 d22,d22,#6
-+
-+ vbic.i32 d24,#0xfc000000
-+ vsri.u32 d22,d20,#26
-+ vadd.i32 d27,d26,d16
-+
-+ vbic.i32 d20,#0xfc000000
-+ vbic.i32 d22,#0xfc000000
-+ vadd.i32 d25,d24,d14
-+
-+ vadd.i32 d21,d20,d10
-+ vadd.i32 d23,d22,d12
-+
-+ mov r7,r5
-+ add r6,r0,#48
-+
-+ cmp r2,r2
-+ b .Long_tail
-+
-+.align 4
-+.Leven:
-+ subs r2,r2,#64
-+ it lo
-+ movlo r4,r5
-+
-+ vmov.i32 q14,#1<<24 @ padbit, yes, always
-+ vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1]
-+ add r1,r1,#64
-+ vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0)
-+ add r4,r4,#64
-+ itt hi
-+ addhi r7,r0,#(48+1*9*4)
-+ addhi r6,r0,#(48+3*9*4)
-+
-+# ifdef __ARMEB__
-+ vrev32.8 q10,q10
-+ vrev32.8 q13,q13
-+ vrev32.8 q11,q11
-+ vrev32.8 q12,q12
-+# endif
-+ vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26
-+ vshl.u32 q13,q13,#18
-+
-+ vsri.u32 q13,q12,#14
-+ vshl.u32 q12,q12,#12
-+
-+ vbic.i32 q13,#0xfc000000
-+ vsri.u32 q12,q11,#20
-+ vshl.u32 q11,q11,#6
-+
-+ vbic.i32 q12,#0xfc000000
-+ vsri.u32 q11,q10,#26
-+
-+ vbic.i32 q10,#0xfc000000
-+ vbic.i32 q11,#0xfc000000
-+
-+ bls .Lskip_loop
-+
-+ vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^2
-+ vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4
-+ vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]!
-+ vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]!
-+ b .Loop_neon
-+
-+.align 5
-+.Loop_neon:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2
-+ @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r
-+ @ ___________________/
-+ @ ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2
-+ @ ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r
-+ @ ___________________/ ____________________/
-+ @
-+ @ Note that we start with inp[2:3]*r^2. This is because it
-+ @ doesn't depend on reduction in previous iteration.
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ @ d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ @ d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ @ d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ @ d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ inp[2:3]*r^2
-+
-+ vadd.i32 d24,d24,d14 @ accumulate inp[0:1]
-+ vmull.u32 q7,d25,d0[1]
-+ vadd.i32 d20,d20,d10
-+ vmull.u32 q5,d21,d0[1]
-+ vadd.i32 d26,d26,d16
-+ vmull.u32 q8,d27,d0[1]
-+ vmlal.u32 q7,d23,d1[1]
-+ vadd.i32 d22,d22,d12
-+ vmull.u32 q6,d23,d0[1]
-+
-+ vadd.i32 d28,d28,d18
-+ vmull.u32 q9,d29,d0[1]
-+ subs r2,r2,#64
-+ vmlal.u32 q5,d29,d2[1]
-+ it lo
-+ movlo r4,r5
-+ vmlal.u32 q8,d25,d1[1]
-+ vld1.32 d8[1],[r7,:32]
-+ vmlal.u32 q6,d21,d1[1]
-+ vmlal.u32 q9,d27,d1[1]
-+
-+ vmlal.u32 q5,d27,d4[1]
-+ vmlal.u32 q8,d23,d3[1]
-+ vmlal.u32 q9,d25,d3[1]
-+ vmlal.u32 q6,d29,d4[1]
-+ vmlal.u32 q7,d21,d3[1]
-+
-+ vmlal.u32 q8,d21,d5[1]
-+ vmlal.u32 q5,d25,d6[1]
-+ vmlal.u32 q9,d23,d5[1]
-+ vmlal.u32 q6,d27,d6[1]
-+ vmlal.u32 q7,d29,d6[1]
-+
-+ vmlal.u32 q8,d29,d8[1]
-+ vmlal.u32 q5,d23,d8[1]
-+ vmlal.u32 q9,d21,d7[1]
-+ vmlal.u32 q6,d25,d8[1]
-+ vmlal.u32 q7,d27,d8[1]
-+
-+ vld4.32 {d21,d23,d25,d27},[r4] @ inp[2:3] (or 0)
-+ add r4,r4,#64
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ (hash+inp[0:1])*r^4 and accumulate
-+
-+ vmlal.u32 q8,d26,d0[0]
-+ vmlal.u32 q5,d20,d0[0]
-+ vmlal.u32 q9,d28,d0[0]
-+ vmlal.u32 q6,d22,d0[0]
-+ vmlal.u32 q7,d24,d0[0]
-+ vld1.32 d8[0],[r6,:32]
-+
-+ vmlal.u32 q8,d24,d1[0]
-+ vmlal.u32 q5,d28,d2[0]
-+ vmlal.u32 q9,d26,d1[0]
-+ vmlal.u32 q6,d20,d1[0]
-+ vmlal.u32 q7,d22,d1[0]
-+
-+ vmlal.u32 q8,d22,d3[0]
-+ vmlal.u32 q5,d26,d4[0]
-+ vmlal.u32 q9,d24,d3[0]
-+ vmlal.u32 q6,d28,d4[0]
-+ vmlal.u32 q7,d20,d3[0]
-+
-+ vmlal.u32 q8,d20,d5[0]
-+ vmlal.u32 q5,d24,d6[0]
-+ vmlal.u32 q9,d22,d5[0]
-+ vmlal.u32 q6,d26,d6[0]
-+ vmlal.u32 q8,d28,d8[0]
-+
-+ vmlal.u32 q7,d28,d6[0]
-+ vmlal.u32 q5,d22,d8[0]
-+ vmlal.u32 q9,d20,d7[0]
-+ vmov.i32 q14,#1<<24 @ padbit, yes, always
-+ vmlal.u32 q6,d24,d8[0]
-+ vmlal.u32 q7,d26,d8[0]
-+
-+ vld4.32 {d20,d22,d24,d26},[r1] @ inp[0:1]
-+ add r1,r1,#64
-+# ifdef __ARMEB__
-+ vrev32.8 q10,q10
-+ vrev32.8 q11,q11
-+ vrev32.8 q12,q12
-+ vrev32.8 q13,q13
-+# endif
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction interleaved with base 2^32 -> base 2^26 of
-+ @ inp[0:3] previously loaded to q10-q13 and smashed to q10-q14.
-+
-+ vshr.u64 q15,q8,#26
-+ vmovn.i64 d16,q8
-+ vshr.u64 q4,q5,#26
-+ vmovn.i64 d10,q5
-+ vadd.i64 q9,q9,q15 @ h3 -> h4
-+ vbic.i32 d16,#0xfc000000
-+ vsri.u32 q14,q13,#8 @ base 2^32 -> base 2^26
-+ vadd.i64 q6,q6,q4 @ h0 -> h1
-+ vshl.u32 q13,q13,#18
-+ vbic.i32 d10,#0xfc000000
-+
-+ vshrn.u64 d30,q9,#26
-+ vmovn.i64 d18,q9
-+ vshr.u64 q4,q6,#26
-+ vmovn.i64 d12,q6
-+ vadd.i64 q7,q7,q4 @ h1 -> h2
-+ vsri.u32 q13,q12,#14
-+ vbic.i32 d18,#0xfc000000
-+ vshl.u32 q12,q12,#12
-+ vbic.i32 d12,#0xfc000000
-+
-+ vadd.i32 d10,d10,d30
-+ vshl.u32 d30,d30,#2
-+ vbic.i32 q13,#0xfc000000
-+ vshrn.u64 d8,q7,#26
-+ vmovn.i64 d14,q7
-+ vaddl.u32 q5,d10,d30 @ h4 -> h0 [widen for a sec]
-+ vsri.u32 q12,q11,#20
-+ vadd.i32 d16,d16,d8 @ h2 -> h3
-+ vshl.u32 q11,q11,#6
-+ vbic.i32 d14,#0xfc000000
-+ vbic.i32 q12,#0xfc000000
-+
-+ vshrn.u64 d30,q5,#26 @ re-narrow
-+ vmovn.i64 d10,q5
-+ vsri.u32 q11,q10,#26
-+ vbic.i32 q10,#0xfc000000
-+ vshr.u32 d8,d16,#26
-+ vbic.i32 d16,#0xfc000000
-+ vbic.i32 d10,#0xfc000000
-+ vadd.i32 d12,d12,d30 @ h0 -> h1
-+ vadd.i32 d18,d18,d8 @ h3 -> h4
-+ vbic.i32 q11,#0xfc000000
-+
-+ bhi .Loop_neon
-+
-+.Lskip_loop:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1
-+
-+ add r7,r0,#(48+0*9*4)
-+ add r6,r0,#(48+1*9*4)
-+ adds r2,r2,#32
-+ it ne
-+ movne r2,#0
-+ bne .Long_tail
-+
-+ vadd.i32 d25,d24,d14 @ add hash value and move to #hi
-+ vadd.i32 d21,d20,d10
-+ vadd.i32 d27,d26,d16
-+ vadd.i32 d23,d22,d12
-+ vadd.i32 d29,d28,d18
-+
-+.Long_tail:
-+ vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^1
-+ vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^2
-+
-+ vadd.i32 d24,d24,d14 @ can be redundant
-+ vmull.u32 q7,d25,d0
-+ vadd.i32 d20,d20,d10
-+ vmull.u32 q5,d21,d0
-+ vadd.i32 d26,d26,d16
-+ vmull.u32 q8,d27,d0
-+ vadd.i32 d22,d22,d12
-+ vmull.u32 q6,d23,d0
-+ vadd.i32 d28,d28,d18
-+ vmull.u32 q9,d29,d0
-+
-+ vmlal.u32 q5,d29,d2
-+ vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]!
-+ vmlal.u32 q8,d25,d1
-+ vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]!
-+ vmlal.u32 q6,d21,d1
-+ vmlal.u32 q9,d27,d1
-+ vmlal.u32 q7,d23,d1
-+
-+ vmlal.u32 q8,d23,d3
-+ vld1.32 d8[1],[r7,:32]
-+ vmlal.u32 q5,d27,d4
-+ vld1.32 d8[0],[r6,:32]
-+ vmlal.u32 q9,d25,d3
-+ vmlal.u32 q6,d29,d4
-+ vmlal.u32 q7,d21,d3
-+
-+ vmlal.u32 q8,d21,d5
-+ it ne
-+ addne r7,r0,#(48+2*9*4)
-+ vmlal.u32 q5,d25,d6
-+ it ne
-+ addne r6,r0,#(48+3*9*4)
-+ vmlal.u32 q9,d23,d5
-+ vmlal.u32 q6,d27,d6
-+ vmlal.u32 q7,d29,d6
-+
-+ vmlal.u32 q8,d29,d8
-+ vorn q0,q0,q0 @ all-ones, can be redundant
-+ vmlal.u32 q5,d23,d8
-+ vshr.u64 q0,q0,#38
-+ vmlal.u32 q9,d21,d7
-+ vmlal.u32 q6,d25,d8
-+ vmlal.u32 q7,d27,d8
-+
-+ beq .Lshort_tail
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ (hash+inp[0:1])*r^4:r^3 and accumulate
-+
-+ vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r7]! @ load r^3
-+ vld4.32 {d0[0],d1[0],d2[0],d3[0]},[r6]! @ load r^4
-+
-+ vmlal.u32 q7,d24,d0
-+ vmlal.u32 q5,d20,d0
-+ vmlal.u32 q8,d26,d0
-+ vmlal.u32 q6,d22,d0
-+ vmlal.u32 q9,d28,d0
-+
-+ vmlal.u32 q5,d28,d2
-+ vld4.32 {d4[1],d5[1],d6[1],d7[1]},[r7]!
-+ vmlal.u32 q8,d24,d1
-+ vld4.32 {d4[0],d5[0],d6[0],d7[0]},[r6]!
-+ vmlal.u32 q6,d20,d1
-+ vmlal.u32 q9,d26,d1
-+ vmlal.u32 q7,d22,d1
-+
-+ vmlal.u32 q8,d22,d3
-+ vld1.32 d8[1],[r7,:32]
-+ vmlal.u32 q5,d26,d4
-+ vld1.32 d8[0],[r6,:32]
-+ vmlal.u32 q9,d24,d3
-+ vmlal.u32 q6,d28,d4
-+ vmlal.u32 q7,d20,d3
-+
-+ vmlal.u32 q8,d20,d5
-+ vmlal.u32 q5,d24,d6
-+ vmlal.u32 q9,d22,d5
-+ vmlal.u32 q6,d26,d6
-+ vmlal.u32 q7,d28,d6
-+
-+ vmlal.u32 q8,d28,d8
-+ vorn q0,q0,q0 @ all-ones
-+ vmlal.u32 q5,d22,d8
-+ vshr.u64 q0,q0,#38
-+ vmlal.u32 q9,d20,d7
-+ vmlal.u32 q6,d24,d8
-+ vmlal.u32 q7,d26,d8
-+
-+.Lshort_tail:
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ horizontal addition
-+
-+ vadd.i64 d16,d16,d17
-+ vadd.i64 d10,d10,d11
-+ vadd.i64 d18,d18,d19
-+ vadd.i64 d12,d12,d13
-+ vadd.i64 d14,d14,d15
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ lazy reduction, but without narrowing
-+
-+ vshr.u64 q15,q8,#26
-+ vand.i64 q8,q8,q0
-+ vshr.u64 q4,q5,#26
-+ vand.i64 q5,q5,q0
-+ vadd.i64 q9,q9,q15 @ h3 -> h4
-+ vadd.i64 q6,q6,q4 @ h0 -> h1
-+
-+ vshr.u64 q15,q9,#26
-+ vand.i64 q9,q9,q0
-+ vshr.u64 q4,q6,#26
-+ vand.i64 q6,q6,q0
-+ vadd.i64 q7,q7,q4 @ h1 -> h2
-+
-+ vadd.i64 q5,q5,q15
-+ vshl.u64 q15,q15,#2
-+ vshr.u64 q4,q7,#26
-+ vand.i64 q7,q7,q0
-+ vadd.i64 q5,q5,q15 @ h4 -> h0
-+ vadd.i64 q8,q8,q4 @ h2 -> h3
-+
-+ vshr.u64 q15,q5,#26
-+ vand.i64 q5,q5,q0
-+ vshr.u64 q4,q8,#26
-+ vand.i64 q8,q8,q0
-+ vadd.i64 q6,q6,q15 @ h0 -> h1
-+ vadd.i64 q9,q9,q4 @ h3 -> h4
-+
-+ cmp r2,#0
-+ bne .Leven
-+
-+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-+ @ store hash value
-+
-+ vst4.32 {d10[0],d12[0],d14[0],d16[0]},[r0]!
-+ vst1.32 {d18[0]},[r0]
-+
-+ vldmia sp!,{d8-d15} @ epilogue
-+ ldmia sp!,{r4-r7}
-+ bx lr @ bx lr
-+.size poly1305_blocks_neon,.-poly1305_blocks_neon
-+
-+.align 5
-+.Lzeros:
-+.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-+#ifndef __KERNEL__
-+.LOPENSSL_armcap:
-+# ifdef _WIN32
-+.word OPENSSL_armcap_P
-+# else
-+.word OPENSSL_armcap_P-.Lpoly1305_init
-+# endif
-+.comm OPENSSL_armcap_P,4,4
-+.hidden OPENSSL_armcap_P
-+#endif
-+#endif
-+.asciz "Poly1305 for ARMv4/NEON, CRYPTOGAMS by @dot-asm"
-+.align 2
---- /dev/null
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -0,0 +1,276 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * OpenSSL/Cryptogams accelerated Poly1305 transform for ARM
-+ *
-+ * Copyright (C) 2019 Linaro Ltd. <ard.biesheuvel@linaro.org>
-+ */
-+
-+#include <asm/hwcap.h>
-+#include <asm/neon.h>
-+#include <asm/simd.h>
-+#include <asm/unaligned.h>
-+#include <crypto/algapi.h>
-+#include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
-+#include <crypto/internal/simd.h>
-+#include <linux/cpufeature.h>
-+#include <linux/crypto.h>
-+#include <linux/jump_label.h>
-+#include <linux/module.h>
-+
-+void poly1305_init_arm(void *state, const u8 *key);
-+void poly1305_blocks_arm(void *state, const u8 *src, u32 len, u32 hibit);
-+void poly1305_emit_arm(void *state, __le32 *digest, const u32 *nonce);
-+
-+void __weak poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit)
-+{
-+}
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-+
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+{
-+ poly1305_init_arm(&dctx->h, key);
-+ dctx->s[0] = get_unaligned_le32(key + 16);
-+ dctx->s[1] = get_unaligned_le32(key + 20);
-+ dctx->s[2] = get_unaligned_le32(key + 24);
-+ dctx->s[3] = get_unaligned_le32(key + 28);
-+ dctx->buflen = 0;
-+}
-+EXPORT_SYMBOL(poly1305_init_arch);
-+
-+static int arm_poly1305_init(struct shash_desc *desc)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ dctx->buflen = 0;
-+ dctx->rset = 0;
-+ dctx->sset = false;
-+
-+ return 0;
-+}
-+
-+static void arm_poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ u32 len, u32 hibit, bool do_neon)
-+{
-+ if (unlikely(!dctx->sset)) {
-+ if (!dctx->rset) {
-+ poly1305_init_arm(&dctx->h, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = 1;
-+ }
-+ if (len >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ if (len < POLY1305_BLOCK_SIZE)
-+ return;
-+ }
-+
-+ len &= ~(POLY1305_BLOCK_SIZE - 1);
-+
-+ if (static_branch_likely(&have_neon) && likely(do_neon))
-+ poly1305_blocks_neon(&dctx->h, src, len, hibit);
-+ else
-+ poly1305_blocks_arm(&dctx->h, src, len, hibit);
-+}
-+
-+static void arm_poly1305_do_update(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, u32 len, bool do_neon)
-+{
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(len, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ len -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ arm_poly1305_blocks(dctx, dctx->buf,
-+ POLY1305_BLOCK_SIZE, 1, false);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(len >= POLY1305_BLOCK_SIZE)) {
-+ arm_poly1305_blocks(dctx, src, len, 1, do_neon);
-+ src += round_down(len, POLY1305_BLOCK_SIZE);
-+ len %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(len)) {
-+ dctx->buflen = len;
-+ memcpy(dctx->buf, src, len);
-+ }
-+}
-+
-+static int arm_poly1305_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ arm_poly1305_do_update(dctx, src, srclen, false);
-+ return 0;
-+}
-+
-+static int __maybe_unused arm_poly1305_update_neon(struct shash_desc *desc,
-+ const u8 *src,
-+ unsigned int srclen)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+ bool do_neon = crypto_simd_usable() && srclen > 128;
-+
-+ if (static_branch_likely(&have_neon) && do_neon)
-+ kernel_neon_begin();
-+ arm_poly1305_do_update(dctx, src, srclen, do_neon);
-+ if (static_branch_likely(&have_neon) && do_neon)
-+ kernel_neon_end();
-+ return 0;
-+}
-+
-+void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ unsigned int nbytes)
-+{
-+ bool do_neon = IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
-+ crypto_simd_usable();
-+
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(nbytes, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ nbytes -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ poly1305_blocks_arm(&dctx->h, dctx->buf,
-+ POLY1305_BLOCK_SIZE, 1);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(nbytes >= POLY1305_BLOCK_SIZE)) {
-+ unsigned int len = round_down(nbytes, POLY1305_BLOCK_SIZE);
-+
-+ if (static_branch_likely(&have_neon) && do_neon) {
-+ kernel_neon_begin();
-+ poly1305_blocks_neon(&dctx->h, src, len, 1);
-+ kernel_neon_end();
-+ } else {
-+ poly1305_blocks_arm(&dctx->h, src, len, 1);
-+ }
-+ src += len;
-+ nbytes %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(nbytes)) {
-+ dctx->buflen = nbytes;
-+ memcpy(dctx->buf, src, nbytes);
-+ }
-+}
-+EXPORT_SYMBOL(poly1305_update_arch);
-+
-+void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
-+{
-+ __le32 digest[4];
-+ u64 f = 0;
-+
-+ if (unlikely(dctx->buflen)) {
-+ dctx->buf[dctx->buflen++] = 1;
-+ memset(dctx->buf + dctx->buflen, 0,
-+ POLY1305_BLOCK_SIZE - dctx->buflen);
-+ poly1305_blocks_arm(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
-+ }
-+
-+ poly1305_emit_arm(&dctx->h, digest, dctx->s);
-+
-+ /* mac = (h + s) % (2^128) */
-+ f = (f >> 32) + le32_to_cpu(digest[0]);
-+ put_unaligned_le32(f, dst);
-+ f = (f >> 32) + le32_to_cpu(digest[1]);
-+ put_unaligned_le32(f, dst + 4);
-+ f = (f >> 32) + le32_to_cpu(digest[2]);
-+ put_unaligned_le32(f, dst + 8);
-+ f = (f >> 32) + le32_to_cpu(digest[3]);
-+ put_unaligned_le32(f, dst + 12);
-+
-+ *dctx = (struct poly1305_desc_ctx){};
-+}
-+EXPORT_SYMBOL(poly1305_final_arch);
-+
-+static int arm_poly1305_final(struct shash_desc *desc, u8 *dst)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (unlikely(!dctx->sset))
-+ return -ENOKEY;
-+
-+ poly1305_final_arch(dctx, dst);
-+ return 0;
-+}
-+
-+static struct shash_alg arm_poly1305_algs[] = {{
-+ .init = arm_poly1305_init,
-+ .update = arm_poly1305_update,
-+ .final = arm_poly1305_final,
-+ .digestsize = POLY1305_DIGEST_SIZE,
-+ .descsize = sizeof(struct poly1305_desc_ctx),
-+
-+ .base.cra_name = "poly1305",
-+ .base.cra_driver_name = "poly1305-arm",
-+ .base.cra_priority = 150,
-+ .base.cra_blocksize = POLY1305_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+#ifdef CONFIG_KERNEL_MODE_NEON
-+}, {
-+ .init = arm_poly1305_init,
-+ .update = arm_poly1305_update_neon,
-+ .final = arm_poly1305_final,
-+ .digestsize = POLY1305_DIGEST_SIZE,
-+ .descsize = sizeof(struct poly1305_desc_ctx),
-+
-+ .base.cra_name = "poly1305",
-+ .base.cra_driver_name = "poly1305-neon",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = POLY1305_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+#endif
-+}};
-+
-+static int __init arm_poly1305_mod_init(void)
-+{
-+ if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
-+ (elf_hwcap & HWCAP_NEON))
-+ static_branch_enable(&have_neon);
-+ else
-+ /* register only the first entry */
-+ return crypto_register_shash(&arm_poly1305_algs[0]);
-+
-+ return crypto_register_shashes(arm_poly1305_algs,
-+ ARRAY_SIZE(arm_poly1305_algs));
-+}
-+
-+static void __exit arm_poly1305_mod_exit(void)
-+{
-+ if (!static_branch_likely(&have_neon)) {
-+ crypto_unregister_shash(&arm_poly1305_algs[0]);
-+ return;
-+ }
-+ crypto_unregister_shashes(arm_poly1305_algs,
-+ ARRAY_SIZE(arm_poly1305_algs));
-+}
-+
-+module_init(arm_poly1305_mod_init);
-+module_exit(arm_poly1305_mod_exit);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CRYPTO("poly1305");
-+MODULE_ALIAS_CRYPTO("poly1305-arm");
-+MODULE_ALIAS_CRYPTO("poly1305-neon");
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -40,7 +40,7 @@ config CRYPTO_LIB_DES
- config CRYPTO_LIB_POLY1305_RSIZE
- int
- default 4 if X86_64
-- default 9 if ARM64
-+ default 9 if ARM || ARM64
- default 1
-
- config CRYPTO_ARCH_HAVE_LIB_POLY1305
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0020-crypto-mips-poly1305-incorporate-OpenSSL-CRYPTOGAMS-.patch b/target/linux/generic/backport-5.4/080-wireguard-0020-crypto-mips-poly1305-incorporate-OpenSSL-CRYPTOGAMS-.patch
deleted file mode 100644
index 272e1797da..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0020-crypto-mips-poly1305-incorporate-OpenSSL-CRYPTOGAMS-.patch
+++ /dev/null
@@ -1,1563 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:26 +0100
-Subject: [PATCH] crypto: mips/poly1305 - incorporate OpenSSL/CRYPTOGAMS
- optimized implementation
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit a11d055e7a64ac34a5e99b6fe731299449cbcd58 upstream.
-
-This is a straight import of the OpenSSL/CRYPTOGAMS Poly1305 implementation for
-MIPS authored by Andy Polyakov, a prior 64-bit only version of which has been
-contributed by him to the OpenSSL project. The file 'poly1305-mips.pl' is taken
-straight from this upstream GitHub repository [0] at commit
-d22ade312a7af958ec955620b0d241cf42c37feb, and already contains all the changes
-required to build it as part of a Linux kernel module.
-
-[0] https://github.com/dot-asm/cryptogams
-
-Co-developed-by: Andy Polyakov <appro@cryptogams.org>
-Signed-off-by: Andy Polyakov <appro@cryptogams.org>
-Co-developed-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: René van Dorst <opensource@vdorst.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/crypto/Makefile | 14 +
- arch/mips/crypto/poly1305-glue.c | 203 +++++
- arch/mips/crypto/poly1305-mips.pl | 1273 +++++++++++++++++++++++++++++
- crypto/Kconfig | 5 +
- lib/crypto/Kconfig | 1 +
- 5 files changed, 1496 insertions(+)
- create mode 100644 arch/mips/crypto/poly1305-glue.c
- create mode 100644 arch/mips/crypto/poly1305-mips.pl
-
---- a/arch/mips/crypto/Makefile
-+++ b/arch/mips/crypto/Makefile
-@@ -8,3 +8,17 @@ obj-$(CONFIG_CRYPTO_CRC32_MIPS) += crc32
- obj-$(CONFIG_CRYPTO_CHACHA_MIPS) += chacha-mips.o
- chacha-mips-y := chacha-core.o chacha-glue.o
- AFLAGS_chacha-core.o += -O2 # needed to fill branch delay slots
-+
-+obj-$(CONFIG_CRYPTO_POLY1305_MIPS) += poly1305-mips.o
-+poly1305-mips-y := poly1305-core.o poly1305-glue.o
-+
-+perlasm-flavour-$(CONFIG_CPU_MIPS32) := o32
-+perlasm-flavour-$(CONFIG_CPU_MIPS64) := 64
-+
-+quiet_cmd_perlasm = PERLASM $@
-+ cmd_perlasm = $(PERL) $(<) $(perlasm-flavour-y) $(@)
-+
-+$(obj)/poly1305-core.S: $(src)/poly1305-mips.pl FORCE
-+ $(call if_changed,perlasm)
-+
-+targets += poly1305-core.S
---- /dev/null
-+++ b/arch/mips/crypto/poly1305-glue.c
-@@ -0,0 +1,203 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * OpenSSL/Cryptogams accelerated Poly1305 transform for MIPS
-+ *
-+ * Copyright (C) 2019 Linaro Ltd. <ard.biesheuvel@linaro.org>
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <crypto/algapi.h>
-+#include <crypto/internal/hash.h>
-+#include <crypto/internal/poly1305.h>
-+#include <linux/cpufeature.h>
-+#include <linux/crypto.h>
-+#include <linux/module.h>
-+
-+asmlinkage void poly1305_init_mips(void *state, const u8 *key);
-+asmlinkage void poly1305_blocks_mips(void *state, const u8 *src, u32 len, u32 hibit);
-+asmlinkage void poly1305_emit_mips(void *state, __le32 *digest, const u32 *nonce);
-+
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+{
-+ poly1305_init_mips(&dctx->h, key);
-+ dctx->s[0] = get_unaligned_le32(key + 16);
-+ dctx->s[1] = get_unaligned_le32(key + 20);
-+ dctx->s[2] = get_unaligned_le32(key + 24);
-+ dctx->s[3] = get_unaligned_le32(key + 28);
-+ dctx->buflen = 0;
-+}
-+EXPORT_SYMBOL(poly1305_init_arch);
-+
-+static int mips_poly1305_init(struct shash_desc *desc)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ dctx->buflen = 0;
-+ dctx->rset = 0;
-+ dctx->sset = false;
-+
-+ return 0;
-+}
-+
-+static void mips_poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ u32 len, u32 hibit)
-+{
-+ if (unlikely(!dctx->sset)) {
-+ if (!dctx->rset) {
-+ poly1305_init_mips(&dctx->h, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = 1;
-+ }
-+ if (len >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ if (len < POLY1305_BLOCK_SIZE)
-+ return;
-+ }
-+
-+ len &= ~(POLY1305_BLOCK_SIZE - 1);
-+
-+ poly1305_blocks_mips(&dctx->h, src, len, hibit);
-+}
-+
-+static int mips_poly1305_update(struct shash_desc *desc, const u8 *src,
-+ unsigned int len)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(len, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ len -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ mips_poly1305_blocks(dctx, dctx->buf, POLY1305_BLOCK_SIZE, 1);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(len >= POLY1305_BLOCK_SIZE)) {
-+ mips_poly1305_blocks(dctx, src, len, 1);
-+ src += round_down(len, POLY1305_BLOCK_SIZE);
-+ len %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(len)) {
-+ dctx->buflen = len;
-+ memcpy(dctx->buf, src, len);
-+ }
-+ return 0;
-+}
-+
-+void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
-+ unsigned int nbytes)
-+{
-+ if (unlikely(dctx->buflen)) {
-+ u32 bytes = min(nbytes, POLY1305_BLOCK_SIZE - dctx->buflen);
-+
-+ memcpy(dctx->buf + dctx->buflen, src, bytes);
-+ src += bytes;
-+ nbytes -= bytes;
-+ dctx->buflen += bytes;
-+
-+ if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-+ poly1305_blocks_mips(&dctx->h, dctx->buf,
-+ POLY1305_BLOCK_SIZE, 1);
-+ dctx->buflen = 0;
-+ }
-+ }
-+
-+ if (likely(nbytes >= POLY1305_BLOCK_SIZE)) {
-+ unsigned int len = round_down(nbytes, POLY1305_BLOCK_SIZE);
-+
-+ poly1305_blocks_mips(&dctx->h, src, len, 1);
-+ src += len;
-+ nbytes %= POLY1305_BLOCK_SIZE;
-+ }
-+
-+ if (unlikely(nbytes)) {
-+ dctx->buflen = nbytes;
-+ memcpy(dctx->buf, src, nbytes);
-+ }
-+}
-+EXPORT_SYMBOL(poly1305_update_arch);
-+
-+void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
-+{
-+ __le32 digest[4];
-+ u64 f = 0;
-+
-+ if (unlikely(dctx->buflen)) {
-+ dctx->buf[dctx->buflen++] = 1;
-+ memset(dctx->buf + dctx->buflen, 0,
-+ POLY1305_BLOCK_SIZE - dctx->buflen);
-+ poly1305_blocks_mips(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
-+ }
-+
-+ poly1305_emit_mips(&dctx->h, digest, dctx->s);
-+
-+ /* mac = (h + s) % (2^128) */
-+ f = (f >> 32) + le32_to_cpu(digest[0]);
-+ put_unaligned_le32(f, dst);
-+ f = (f >> 32) + le32_to_cpu(digest[1]);
-+ put_unaligned_le32(f, dst + 4);
-+ f = (f >> 32) + le32_to_cpu(digest[2]);
-+ put_unaligned_le32(f, dst + 8);
-+ f = (f >> 32) + le32_to_cpu(digest[3]);
-+ put_unaligned_le32(f, dst + 12);
-+
-+ *dctx = (struct poly1305_desc_ctx){};
-+}
-+EXPORT_SYMBOL(poly1305_final_arch);
-+
-+static int mips_poly1305_final(struct shash_desc *desc, u8 *dst)
-+{
-+ struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-+
-+ if (unlikely(!dctx->sset))
-+ return -ENOKEY;
-+
-+ poly1305_final_arch(dctx, dst);
-+ return 0;
-+}
-+
-+static struct shash_alg mips_poly1305_alg = {
-+ .init = mips_poly1305_init,
-+ .update = mips_poly1305_update,
-+ .final = mips_poly1305_final,
-+ .digestsize = POLY1305_DIGEST_SIZE,
-+ .descsize = sizeof(struct poly1305_desc_ctx),
-+
-+ .base.cra_name = "poly1305",
-+ .base.cra_driver_name = "poly1305-mips",
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = POLY1305_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+};
-+
-+static int __init mips_poly1305_mod_init(void)
-+{
-+ return crypto_register_shash(&mips_poly1305_alg);
-+}
-+
-+static void __exit mips_poly1305_mod_exit(void)
-+{
-+ crypto_unregister_shash(&mips_poly1305_alg);
-+}
-+
-+module_init(mips_poly1305_mod_init);
-+module_exit(mips_poly1305_mod_exit);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CRYPTO("poly1305");
-+MODULE_ALIAS_CRYPTO("poly1305-mips");
---- /dev/null
-+++ b/arch/mips/crypto/poly1305-mips.pl
-@@ -0,0 +1,1273 @@
-+#!/usr/bin/env perl
-+# SPDX-License-Identifier: GPL-1.0+ OR BSD-3-Clause
-+#
-+# ====================================================================
-+# Written by Andy Polyakov, @dot-asm, originally for the OpenSSL
-+# project.
-+# ====================================================================
-+
-+# Poly1305 hash for MIPS.
-+#
-+# May 2016
-+#
-+# Numbers are cycles per processed byte with poly1305_blocks alone.
-+#
-+# IALU/gcc
-+# R1x000 ~5.5/+130% (big-endian)
-+# Octeon II 2.50/+70% (little-endian)
-+#
-+# March 2019
-+#
-+# Add 32-bit code path.
-+#
-+# October 2019
-+#
-+# Modulo-scheduling reduction allows to omit dependency chain at the
-+# end of inner loop and improve performance. Also optimize MIPS32R2
-+# code path for MIPS 1004K core. Per René von Dorst's suggestions.
-+#
-+# IALU/gcc
-+# R1x000 ~9.8/? (big-endian)
-+# Octeon II 3.65/+140% (little-endian)
-+# MT7621/1004K 4.75/? (little-endian)
-+#
-+######################################################################
-+# There is a number of MIPS ABI in use, O32 and N32/64 are most
-+# widely used. Then there is a new contender: NUBI. It appears that if
-+# one picks the latter, it's possible to arrange code in ABI neutral
-+# manner. Therefore let's stick to NUBI register layout:
-+#
-+($zero,$at,$t0,$t1,$t2)=map("\$$_",(0..2,24,25));
-+($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
-+($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11)=map("\$$_",(12..23));
-+($gp,$tp,$sp,$fp,$ra)=map("\$$_",(3,28..31));
-+#
-+# The return value is placed in $a0. Following coding rules facilitate
-+# interoperability:
-+#
-+# - never ever touch $tp, "thread pointer", former $gp [o32 can be
-+# excluded from the rule, because it's specified volatile];
-+# - copy return value to $t0, former $v0 [or to $a0 if you're adapting
-+# old code];
-+# - on O32 populate $a4-$a7 with 'lw $aN,4*N($sp)' if necessary;
-+#
-+# For reference here is register layout for N32/64 MIPS ABIs:
-+#
-+# ($zero,$at,$v0,$v1)=map("\$$_",(0..3));
-+# ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("\$$_",(4..11));
-+# ($t0,$t1,$t2,$t3,$t8,$t9)=map("\$$_",(12..15,24,25));
-+# ($s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7)=map("\$$_",(16..23));
-+# ($gp,$sp,$fp,$ra)=map("\$$_",(28..31));
-+#
-+# <appro@openssl.org>
-+#
-+######################################################################
-+
-+$flavour = shift || "64"; # supported flavours are o32,n32,64,nubi32,nubi64
-+
-+$v0 = ($flavour =~ /nubi/i) ? $a0 : $t0;
-+
-+if ($flavour =~ /64|n32/i) {{{
-+######################################################################
-+# 64-bit code path
-+#
-+
-+my ($ctx,$inp,$len,$padbit) = ($a0,$a1,$a2,$a3);
-+my ($in0,$in1,$tmp0,$tmp1,$tmp2,$tmp3,$tmp4) = ($a4,$a5,$a6,$a7,$at,$t0,$t1);
-+
-+$code.=<<___;
-+#if (defined(_MIPS_ARCH_MIPS64R3) || defined(_MIPS_ARCH_MIPS64R5) || \\
-+ defined(_MIPS_ARCH_MIPS64R6)) \\
-+ && !defined(_MIPS_ARCH_MIPS64R2)
-+# define _MIPS_ARCH_MIPS64R2
-+#endif
-+
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+# define dmultu(rs,rt)
-+# define mflo(rd,rs,rt) dmulu rd,rs,rt
-+# define mfhi(rd,rs,rt) dmuhu rd,rs,rt
-+#else
-+# define dmultu(rs,rt) dmultu rs,rt
-+# define mflo(rd,rs,rt) mflo rd
-+# define mfhi(rd,rs,rt) mfhi rd
-+#endif
-+
-+#ifdef __KERNEL__
-+# define poly1305_init poly1305_init_mips
-+# define poly1305_blocks poly1305_blocks_mips
-+# define poly1305_emit poly1305_emit_mips
-+#endif
-+
-+#if defined(__MIPSEB__) && !defined(MIPSEB)
-+# define MIPSEB
-+#endif
-+
-+#ifdef MIPSEB
-+# define MSB 0
-+# define LSB 7
-+#else
-+# define MSB 7
-+# define LSB 0
-+#endif
-+
-+.text
-+.set noat
-+.set noreorder
-+
-+.align 5
-+.globl poly1305_init
-+.ent poly1305_init
-+poly1305_init:
-+ .frame $sp,0,$ra
-+ .set reorder
-+
-+ sd $zero,0($ctx)
-+ sd $zero,8($ctx)
-+ sd $zero,16($ctx)
-+
-+ beqz $inp,.Lno_key
-+
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ andi $tmp0,$inp,7 # $inp % 8
-+ dsubu $inp,$inp,$tmp0 # align $inp
-+ sll $tmp0,$tmp0,3 # byte to bit offset
-+ ld $in0,0($inp)
-+ ld $in1,8($inp)
-+ beqz $tmp0,.Laligned_key
-+ ld $tmp2,16($inp)
-+
-+ subu $tmp1,$zero,$tmp0
-+# ifdef MIPSEB
-+ dsllv $in0,$in0,$tmp0
-+ dsrlv $tmp3,$in1,$tmp1
-+ dsllv $in1,$in1,$tmp0
-+ dsrlv $tmp2,$tmp2,$tmp1
-+# else
-+ dsrlv $in0,$in0,$tmp0
-+ dsllv $tmp3,$in1,$tmp1
-+ dsrlv $in1,$in1,$tmp0
-+ dsllv $tmp2,$tmp2,$tmp1
-+# endif
-+ or $in0,$in0,$tmp3
-+ or $in1,$in1,$tmp2
-+.Laligned_key:
-+#else
-+ ldl $in0,0+MSB($inp)
-+ ldl $in1,8+MSB($inp)
-+ ldr $in0,0+LSB($inp)
-+ ldr $in1,8+LSB($inp)
-+#endif
-+#ifdef MIPSEB
-+# if defined(_MIPS_ARCH_MIPS64R2)
-+ dsbh $in0,$in0 # byte swap
-+ dsbh $in1,$in1
-+ dshd $in0,$in0
-+ dshd $in1,$in1
-+# else
-+ ori $tmp0,$zero,0xFF
-+ dsll $tmp2,$tmp0,32
-+ or $tmp0,$tmp2 # 0x000000FF000000FF
-+
-+ and $tmp1,$in0,$tmp0 # byte swap
-+ and $tmp3,$in1,$tmp0
-+ dsrl $tmp2,$in0,24
-+ dsrl $tmp4,$in1,24
-+ dsll $tmp1,24
-+ dsll $tmp3,24
-+ and $tmp2,$tmp0
-+ and $tmp4,$tmp0
-+ dsll $tmp0,8 # 0x0000FF000000FF00
-+ or $tmp1,$tmp2
-+ or $tmp3,$tmp4
-+ and $tmp2,$in0,$tmp0
-+ and $tmp4,$in1,$tmp0
-+ dsrl $in0,8
-+ dsrl $in1,8
-+ dsll $tmp2,8
-+ dsll $tmp4,8
-+ and $in0,$tmp0
-+ and $in1,$tmp0
-+ or $tmp1,$tmp2
-+ or $tmp3,$tmp4
-+ or $in0,$tmp1
-+ or $in1,$tmp3
-+ dsrl $tmp1,$in0,32
-+ dsrl $tmp3,$in1,32
-+ dsll $in0,32
-+ dsll $in1,32
-+ or $in0,$tmp1
-+ or $in1,$tmp3
-+# endif
-+#endif
-+ li $tmp0,1
-+ dsll $tmp0,32 # 0x0000000100000000
-+ daddiu $tmp0,-63 # 0x00000000ffffffc1
-+ dsll $tmp0,28 # 0x0ffffffc10000000
-+ daddiu $tmp0,-1 # 0x0ffffffc0fffffff
-+
-+ and $in0,$tmp0
-+ daddiu $tmp0,-3 # 0x0ffffffc0ffffffc
-+ and $in1,$tmp0
-+
-+ sd $in0,24($ctx)
-+ dsrl $tmp0,$in1,2
-+ sd $in1,32($ctx)
-+ daddu $tmp0,$in1 # s1 = r1 + (r1 >> 2)
-+ sd $tmp0,40($ctx)
-+
-+.Lno_key:
-+ li $v0,0 # return 0
-+ jr $ra
-+.end poly1305_init
-+___
-+{
-+my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? "0x0003f000" : "0x00030000";
-+
-+my ($h0,$h1,$h2,$r0,$r1,$rs1,$d0,$d1,$d2) =
-+ ($s0,$s1,$s2,$s3,$s4,$s5,$in0,$in1,$t2);
-+my ($shr,$shl) = ($s6,$s7); # used on R6
-+
-+$code.=<<___;
-+.align 5
-+.globl poly1305_blocks
-+.ent poly1305_blocks
-+poly1305_blocks:
-+ .set noreorder
-+ dsrl $len,4 # number of complete blocks
-+ bnez $len,poly1305_blocks_internal
-+ nop
-+ jr $ra
-+ nop
-+.end poly1305_blocks
-+
-+.align 5
-+.ent poly1305_blocks_internal
-+poly1305_blocks_internal:
-+ .set noreorder
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ .frame $sp,8*8,$ra
-+ .mask $SAVED_REGS_MASK|0x000c0000,-8
-+ dsubu $sp,8*8
-+ sd $s7,56($sp)
-+ sd $s6,48($sp)
-+#else
-+ .frame $sp,6*8,$ra
-+ .mask $SAVED_REGS_MASK,-8
-+ dsubu $sp,6*8
-+#endif
-+ sd $s5,40($sp)
-+ sd $s4,32($sp)
-+___
-+$code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
-+ sd $s3,24($sp)
-+ sd $s2,16($sp)
-+ sd $s1,8($sp)
-+ sd $s0,0($sp)
-+___
-+$code.=<<___;
-+ .set reorder
-+
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ andi $shr,$inp,7
-+ dsubu $inp,$inp,$shr # align $inp
-+ sll $shr,$shr,3 # byte to bit offset
-+ subu $shl,$zero,$shr
-+#endif
-+
-+ ld $h0,0($ctx) # load hash value
-+ ld $h1,8($ctx)
-+ ld $h2,16($ctx)
-+
-+ ld $r0,24($ctx) # load key
-+ ld $r1,32($ctx)
-+ ld $rs1,40($ctx)
-+
-+ dsll $len,4
-+ daddu $len,$inp # end of buffer
-+ b .Loop
-+
-+.align 4
-+.Loop:
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ ld $in0,0($inp) # load input
-+ ld $in1,8($inp)
-+ beqz $shr,.Laligned_inp
-+
-+ ld $tmp2,16($inp)
-+# ifdef MIPSEB
-+ dsllv $in0,$in0,$shr
-+ dsrlv $tmp3,$in1,$shl
-+ dsllv $in1,$in1,$shr
-+ dsrlv $tmp2,$tmp2,$shl
-+# else
-+ dsrlv $in0,$in0,$shr
-+ dsllv $tmp3,$in1,$shl
-+ dsrlv $in1,$in1,$shr
-+ dsllv $tmp2,$tmp2,$shl
-+# endif
-+ or $in0,$in0,$tmp3
-+ or $in1,$in1,$tmp2
-+.Laligned_inp:
-+#else
-+ ldl $in0,0+MSB($inp) # load input
-+ ldl $in1,8+MSB($inp)
-+ ldr $in0,0+LSB($inp)
-+ ldr $in1,8+LSB($inp)
-+#endif
-+ daddiu $inp,16
-+#ifdef MIPSEB
-+# if defined(_MIPS_ARCH_MIPS64R2)
-+ dsbh $in0,$in0 # byte swap
-+ dsbh $in1,$in1
-+ dshd $in0,$in0
-+ dshd $in1,$in1
-+# else
-+ ori $tmp0,$zero,0xFF
-+ dsll $tmp2,$tmp0,32
-+ or $tmp0,$tmp2 # 0x000000FF000000FF
-+
-+ and $tmp1,$in0,$tmp0 # byte swap
-+ and $tmp3,$in1,$tmp0
-+ dsrl $tmp2,$in0,24
-+ dsrl $tmp4,$in1,24
-+ dsll $tmp1,24
-+ dsll $tmp3,24
-+ and $tmp2,$tmp0
-+ and $tmp4,$tmp0
-+ dsll $tmp0,8 # 0x0000FF000000FF00
-+ or $tmp1,$tmp2
-+ or $tmp3,$tmp4
-+ and $tmp2,$in0,$tmp0
-+ and $tmp4,$in1,$tmp0
-+ dsrl $in0,8
-+ dsrl $in1,8
-+ dsll $tmp2,8
-+ dsll $tmp4,8
-+ and $in0,$tmp0
-+ and $in1,$tmp0
-+ or $tmp1,$tmp2
-+ or $tmp3,$tmp4
-+ or $in0,$tmp1
-+ or $in1,$tmp3
-+ dsrl $tmp1,$in0,32
-+ dsrl $tmp3,$in1,32
-+ dsll $in0,32
-+ dsll $in1,32
-+ or $in0,$tmp1
-+ or $in1,$tmp3
-+# endif
-+#endif
-+ dsrl $tmp1,$h2,2 # modulo-scheduled reduction
-+ andi $h2,$h2,3
-+ dsll $tmp0,$tmp1,2
-+
-+ daddu $d0,$h0,$in0 # accumulate input
-+ daddu $tmp1,$tmp0
-+ sltu $tmp0,$d0,$h0
-+ daddu $d0,$d0,$tmp1 # ... and residue
-+ sltu $tmp1,$d0,$tmp1
-+ daddu $d1,$h1,$in1
-+ daddu $tmp0,$tmp1
-+ sltu $tmp1,$d1,$h1
-+ daddu $d1,$tmp0
-+
-+ dmultu ($r0,$d0) # h0*r0
-+ daddu $d2,$h2,$padbit
-+ sltu $tmp0,$d1,$tmp0
-+ mflo ($h0,$r0,$d0)
-+ mfhi ($h1,$r0,$d0)
-+
-+ dmultu ($rs1,$d1) # h1*5*r1
-+ daddu $d2,$tmp1
-+ daddu $d2,$tmp0
-+ mflo ($tmp0,$rs1,$d1)
-+ mfhi ($tmp1,$rs1,$d1)
-+
-+ dmultu ($r1,$d0) # h0*r1
-+ mflo ($tmp2,$r1,$d0)
-+ mfhi ($h2,$r1,$d0)
-+ daddu $h0,$tmp0
-+ daddu $h1,$tmp1
-+ sltu $tmp0,$h0,$tmp0
-+
-+ dmultu ($r0,$d1) # h1*r0
-+ daddu $h1,$tmp0
-+ daddu $h1,$tmp2
-+ mflo ($tmp0,$r0,$d1)
-+ mfhi ($tmp1,$r0,$d1)
-+
-+ dmultu ($rs1,$d2) # h2*5*r1
-+ sltu $tmp2,$h1,$tmp2
-+ daddu $h2,$tmp2
-+ mflo ($tmp2,$rs1,$d2)
-+
-+ dmultu ($r0,$d2) # h2*r0
-+ daddu $h1,$tmp0
-+ daddu $h2,$tmp1
-+ mflo ($tmp3,$r0,$d2)
-+ sltu $tmp0,$h1,$tmp0
-+ daddu $h2,$tmp0
-+
-+ daddu $h1,$tmp2
-+ sltu $tmp2,$h1,$tmp2
-+ daddu $h2,$tmp2
-+ daddu $h2,$tmp3
-+
-+ bne $inp,$len,.Loop
-+
-+ sd $h0,0($ctx) # store hash value
-+ sd $h1,8($ctx)
-+ sd $h2,16($ctx)
-+
-+ .set noreorder
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ ld $s7,56($sp)
-+ ld $s6,48($sp)
-+#endif
-+ ld $s5,40($sp) # epilogue
-+ ld $s4,32($sp)
-+___
-+$code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi epilogue
-+ ld $s3,24($sp)
-+ ld $s2,16($sp)
-+ ld $s1,8($sp)
-+ ld $s0,0($sp)
-+___
-+$code.=<<___;
-+ jr $ra
-+#if defined(_MIPS_ARCH_MIPS64R6)
-+ daddu $sp,8*8
-+#else
-+ daddu $sp,6*8
-+#endif
-+.end poly1305_blocks_internal
-+___
-+}
-+{
-+my ($ctx,$mac,$nonce) = ($a0,$a1,$a2);
-+
-+$code.=<<___;
-+.align 5
-+.globl poly1305_emit
-+.ent poly1305_emit
-+poly1305_emit:
-+ .frame $sp,0,$ra
-+ .set reorder
-+
-+ ld $tmp2,16($ctx)
-+ ld $tmp0,0($ctx)
-+ ld $tmp1,8($ctx)
-+
-+ li $in0,-4 # final reduction
-+ dsrl $in1,$tmp2,2
-+ and $in0,$tmp2
-+ andi $tmp2,$tmp2,3
-+ daddu $in0,$in1
-+
-+ daddu $tmp0,$tmp0,$in0
-+ sltu $in1,$tmp0,$in0
-+ daddiu $in0,$tmp0,5 # compare to modulus
-+ daddu $tmp1,$tmp1,$in1
-+ sltiu $tmp3,$in0,5
-+ sltu $tmp4,$tmp1,$in1
-+ daddu $in1,$tmp1,$tmp3
-+ daddu $tmp2,$tmp2,$tmp4
-+ sltu $tmp3,$in1,$tmp3
-+ daddu $tmp2,$tmp2,$tmp3
-+
-+ dsrl $tmp2,2 # see if it carried/borrowed
-+ dsubu $tmp2,$zero,$tmp2
-+
-+ xor $in0,$tmp0
-+ xor $in1,$tmp1
-+ and $in0,$tmp2
-+ and $in1,$tmp2
-+ xor $in0,$tmp0
-+ xor $in1,$tmp1
-+
-+ lwu $tmp0,0($nonce) # load nonce
-+ lwu $tmp1,4($nonce)
-+ lwu $tmp2,8($nonce)
-+ lwu $tmp3,12($nonce)
-+ dsll $tmp1,32
-+ dsll $tmp3,32
-+ or $tmp0,$tmp1
-+ or $tmp2,$tmp3
-+
-+ daddu $in0,$tmp0 # accumulate nonce
-+ daddu $in1,$tmp2
-+ sltu $tmp0,$in0,$tmp0
-+ daddu $in1,$tmp0
-+
-+ dsrl $tmp0,$in0,8 # write mac value
-+ dsrl $tmp1,$in0,16
-+ dsrl $tmp2,$in0,24
-+ sb $in0,0($mac)
-+ dsrl $tmp3,$in0,32
-+ sb $tmp0,1($mac)
-+ dsrl $tmp0,$in0,40
-+ sb $tmp1,2($mac)
-+ dsrl $tmp1,$in0,48
-+ sb $tmp2,3($mac)
-+ dsrl $tmp2,$in0,56
-+ sb $tmp3,4($mac)
-+ dsrl $tmp3,$in1,8
-+ sb $tmp0,5($mac)
-+ dsrl $tmp0,$in1,16
-+ sb $tmp1,6($mac)
-+ dsrl $tmp1,$in1,24
-+ sb $tmp2,7($mac)
-+
-+ sb $in1,8($mac)
-+ dsrl $tmp2,$in1,32
-+ sb $tmp3,9($mac)
-+ dsrl $tmp3,$in1,40
-+ sb $tmp0,10($mac)
-+ dsrl $tmp0,$in1,48
-+ sb $tmp1,11($mac)
-+ dsrl $tmp1,$in1,56
-+ sb $tmp2,12($mac)
-+ sb $tmp3,13($mac)
-+ sb $tmp0,14($mac)
-+ sb $tmp1,15($mac)
-+
-+ jr $ra
-+.end poly1305_emit
-+.rdata
-+.asciiz "Poly1305 for MIPS64, CRYPTOGAMS by \@dot-asm"
-+.align 2
-+___
-+}
-+}}} else {{{
-+######################################################################
-+# 32-bit code path
-+#
-+
-+my ($ctx,$inp,$len,$padbit) = ($a0,$a1,$a2,$a3);
-+my ($in0,$in1,$in2,$in3,$tmp0,$tmp1,$tmp2,$tmp3) =
-+ ($a4,$a5,$a6,$a7,$at,$t0,$t1,$t2);
-+
-+$code.=<<___;
-+#if (defined(_MIPS_ARCH_MIPS32R3) || defined(_MIPS_ARCH_MIPS32R5) || \\
-+ defined(_MIPS_ARCH_MIPS32R6)) \\
-+ && !defined(_MIPS_ARCH_MIPS32R2)
-+# define _MIPS_ARCH_MIPS32R2
-+#endif
-+
-+#if defined(_MIPS_ARCH_MIPS32R6)
-+# define multu(rs,rt)
-+# define mflo(rd,rs,rt) mulu rd,rs,rt
-+# define mfhi(rd,rs,rt) muhu rd,rs,rt
-+#else
-+# define multu(rs,rt) multu rs,rt
-+# define mflo(rd,rs,rt) mflo rd
-+# define mfhi(rd,rs,rt) mfhi rd
-+#endif
-+
-+#ifdef __KERNEL__
-+# define poly1305_init poly1305_init_mips
-+# define poly1305_blocks poly1305_blocks_mips
-+# define poly1305_emit poly1305_emit_mips
-+#endif
-+
-+#if defined(__MIPSEB__) && !defined(MIPSEB)
-+# define MIPSEB
-+#endif
-+
-+#ifdef MIPSEB
-+# define MSB 0
-+# define LSB 3
-+#else
-+# define MSB 3
-+# define LSB 0
-+#endif
-+
-+.text
-+.set noat
-+.set noreorder
-+
-+.align 5
-+.globl poly1305_init
-+.ent poly1305_init
-+poly1305_init:
-+ .frame $sp,0,$ra
-+ .set reorder
-+
-+ sw $zero,0($ctx)
-+ sw $zero,4($ctx)
-+ sw $zero,8($ctx)
-+ sw $zero,12($ctx)
-+ sw $zero,16($ctx)
-+
-+ beqz $inp,.Lno_key
-+
-+#if defined(_MIPS_ARCH_MIPS32R6)
-+ andi $tmp0,$inp,3 # $inp % 4
-+ subu $inp,$inp,$tmp0 # align $inp
-+ sll $tmp0,$tmp0,3 # byte to bit offset
-+ lw $in0,0($inp)
-+ lw $in1,4($inp)
-+ lw $in2,8($inp)
-+ lw $in3,12($inp)
-+ beqz $tmp0,.Laligned_key
-+
-+ lw $tmp2,16($inp)
-+ subu $tmp1,$zero,$tmp0
-+# ifdef MIPSEB
-+ sllv $in0,$in0,$tmp0
-+ srlv $tmp3,$in1,$tmp1
-+ sllv $in1,$in1,$tmp0
-+ or $in0,$in0,$tmp3
-+ srlv $tmp3,$in2,$tmp1
-+ sllv $in2,$in2,$tmp0
-+ or $in1,$in1,$tmp3
-+ srlv $tmp3,$in3,$tmp1
-+ sllv $in3,$in3,$tmp0
-+ or $in2,$in2,$tmp3
-+ srlv $tmp2,$tmp2,$tmp1
-+ or $in3,$in3,$tmp2
-+# else
-+ srlv $in0,$in0,$tmp0
-+ sllv $tmp3,$in1,$tmp1
-+ srlv $in1,$in1,$tmp0
-+ or $in0,$in0,$tmp3
-+ sllv $tmp3,$in2,$tmp1
-+ srlv $in2,$in2,$tmp0
-+ or $in1,$in1,$tmp3
-+ sllv $tmp3,$in3,$tmp1
-+ srlv $in3,$in3,$tmp0
-+ or $in2,$in2,$tmp3
-+ sllv $tmp2,$tmp2,$tmp1
-+ or $in3,$in3,$tmp2
-+# endif
-+.Laligned_key:
-+#else
-+ lwl $in0,0+MSB($inp)
-+ lwl $in1,4+MSB($inp)
-+ lwl $in2,8+MSB($inp)
-+ lwl $in3,12+MSB($inp)
-+ lwr $in0,0+LSB($inp)
-+ lwr $in1,4+LSB($inp)
-+ lwr $in2,8+LSB($inp)
-+ lwr $in3,12+LSB($inp)
-+#endif
-+#ifdef MIPSEB
-+# if defined(_MIPS_ARCH_MIPS32R2)
-+ wsbh $in0,$in0 # byte swap
-+ wsbh $in1,$in1
-+ wsbh $in2,$in2
-+ wsbh $in3,$in3
-+ rotr $in0,$in0,16
-+ rotr $in1,$in1,16
-+ rotr $in2,$in2,16
-+ rotr $in3,$in3,16
-+# else
-+ srl $tmp0,$in0,24 # byte swap
-+ srl $tmp1,$in0,8
-+ andi $tmp2,$in0,0xFF00
-+ sll $in0,$in0,24
-+ andi $tmp1,0xFF00
-+ sll $tmp2,$tmp2,8
-+ or $in0,$tmp0
-+ srl $tmp0,$in1,24
-+ or $tmp1,$tmp2
-+ srl $tmp2,$in1,8
-+ or $in0,$tmp1
-+ andi $tmp1,$in1,0xFF00
-+ sll $in1,$in1,24
-+ andi $tmp2,0xFF00
-+ sll $tmp1,$tmp1,8
-+ or $in1,$tmp0
-+ srl $tmp0,$in2,24
-+ or $tmp2,$tmp1
-+ srl $tmp1,$in2,8
-+ or $in1,$tmp2
-+ andi $tmp2,$in2,0xFF00
-+ sll $in2,$in2,24
-+ andi $tmp1,0xFF00
-+ sll $tmp2,$tmp2,8
-+ or $in2,$tmp0
-+ srl $tmp0,$in3,24
-+ or $tmp1,$tmp2
-+ srl $tmp2,$in3,8
-+ or $in2,$tmp1
-+ andi $tmp1,$in3,0xFF00
-+ sll $in3,$in3,24
-+ andi $tmp2,0xFF00
-+ sll $tmp1,$tmp1,8
-+ or $in3,$tmp0
-+ or $tmp2,$tmp1
-+ or $in3,$tmp2
-+# endif
-+#endif
-+ lui $tmp0,0x0fff
-+ ori $tmp0,0xffff # 0x0fffffff
-+ and $in0,$in0,$tmp0
-+ subu $tmp0,3 # 0x0ffffffc
-+ and $in1,$in1,$tmp0
-+ and $in2,$in2,$tmp0
-+ and $in3,$in3,$tmp0
-+
-+ sw $in0,20($ctx)
-+ sw $in1,24($ctx)
-+ sw $in2,28($ctx)
-+ sw $in3,32($ctx)
-+
-+ srl $tmp1,$in1,2
-+ srl $tmp2,$in2,2
-+ srl $tmp3,$in3,2
-+ addu $in1,$in1,$tmp1 # s1 = r1 + (r1 >> 2)
-+ addu $in2,$in2,$tmp2
-+ addu $in3,$in3,$tmp3
-+ sw $in1,36($ctx)
-+ sw $in2,40($ctx)
-+ sw $in3,44($ctx)
-+.Lno_key:
-+ li $v0,0
-+ jr $ra
-+.end poly1305_init
-+___
-+{
-+my $SAVED_REGS_MASK = ($flavour =~ /nubi/i) ? "0x00fff000" : "0x00ff0000";
-+
-+my ($h0,$h1,$h2,$h3,$h4, $r0,$r1,$r2,$r3, $rs1,$rs2,$rs3) =
-+ ($s0,$s1,$s2,$s3,$s4, $s5,$s6,$s7,$s8, $s9,$s10,$s11);
-+my ($d0,$d1,$d2,$d3) =
-+ ($a4,$a5,$a6,$a7);
-+my $shr = $t2; # used on R6
-+my $one = $t2; # used on R2
-+
-+$code.=<<___;
-+.globl poly1305_blocks
-+.align 5
-+.ent poly1305_blocks
-+poly1305_blocks:
-+ .frame $sp,16*4,$ra
-+ .mask $SAVED_REGS_MASK,-4
-+ .set noreorder
-+ subu $sp, $sp,4*12
-+ sw $s11,4*11($sp)
-+ sw $s10,4*10($sp)
-+ sw $s9, 4*9($sp)
-+ sw $s8, 4*8($sp)
-+ sw $s7, 4*7($sp)
-+ sw $s6, 4*6($sp)
-+ sw $s5, 4*5($sp)
-+ sw $s4, 4*4($sp)
-+___
-+$code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
-+ sw $s3, 4*3($sp)
-+ sw $s2, 4*2($sp)
-+ sw $s1, 4*1($sp)
-+ sw $s0, 4*0($sp)
-+___
-+$code.=<<___;
-+ .set reorder
-+
-+ srl $len,4 # number of complete blocks
-+ li $one,1
-+ beqz $len,.Labort
-+
-+#if defined(_MIPS_ARCH_MIPS32R6)
-+ andi $shr,$inp,3
-+ subu $inp,$inp,$shr # align $inp
-+ sll $shr,$shr,3 # byte to bit offset
-+#endif
-+
-+ lw $h0,0($ctx) # load hash value
-+ lw $h1,4($ctx)
-+ lw $h2,8($ctx)
-+ lw $h3,12($ctx)
-+ lw $h4,16($ctx)
-+
-+ lw $r0,20($ctx) # load key
-+ lw $r1,24($ctx)
-+ lw $r2,28($ctx)
-+ lw $r3,32($ctx)
-+ lw $rs1,36($ctx)
-+ lw $rs2,40($ctx)
-+ lw $rs3,44($ctx)
-+
-+ sll $len,4
-+ addu $len,$len,$inp # end of buffer
-+ b .Loop
-+
-+.align 4
-+.Loop:
-+#if defined(_MIPS_ARCH_MIPS32R6)
-+ lw $d0,0($inp) # load input
-+ lw $d1,4($inp)
-+ lw $d2,8($inp)
-+ lw $d3,12($inp)
-+ beqz $shr,.Laligned_inp
-+
-+ lw $t0,16($inp)
-+ subu $t1,$zero,$shr
-+# ifdef MIPSEB
-+ sllv $d0,$d0,$shr
-+ srlv $at,$d1,$t1
-+ sllv $d1,$d1,$shr
-+ or $d0,$d0,$at
-+ srlv $at,$d2,$t1
-+ sllv $d2,$d2,$shr
-+ or $d1,$d1,$at
-+ srlv $at,$d3,$t1
-+ sllv $d3,$d3,$shr
-+ or $d2,$d2,$at
-+ srlv $t0,$t0,$t1
-+ or $d3,$d3,$t0
-+# else
-+ srlv $d0,$d0,$shr
-+ sllv $at,$d1,$t1
-+ srlv $d1,$d1,$shr
-+ or $d0,$d0,$at
-+ sllv $at,$d2,$t1
-+ srlv $d2,$d2,$shr
-+ or $d1,$d1,$at
-+ sllv $at,$d3,$t1
-+ srlv $d3,$d3,$shr
-+ or $d2,$d2,$at
-+ sllv $t0,$t0,$t1
-+ or $d3,$d3,$t0
-+# endif
-+.Laligned_inp:
-+#else
-+ lwl $d0,0+MSB($inp) # load input
-+ lwl $d1,4+MSB($inp)
-+ lwl $d2,8+MSB($inp)
-+ lwl $d3,12+MSB($inp)
-+ lwr $d0,0+LSB($inp)
-+ lwr $d1,4+LSB($inp)
-+ lwr $d2,8+LSB($inp)
-+ lwr $d3,12+LSB($inp)
-+#endif
-+#ifdef MIPSEB
-+# if defined(_MIPS_ARCH_MIPS32R2)
-+ wsbh $d0,$d0 # byte swap
-+ wsbh $d1,$d1
-+ wsbh $d2,$d2
-+ wsbh $d3,$d3
-+ rotr $d0,$d0,16
-+ rotr $d1,$d1,16
-+ rotr $d2,$d2,16
-+ rotr $d3,$d3,16
-+# else
-+ srl $at,$d0,24 # byte swap
-+ srl $t0,$d0,8
-+ andi $t1,$d0,0xFF00
-+ sll $d0,$d0,24
-+ andi $t0,0xFF00
-+ sll $t1,$t1,8
-+ or $d0,$at
-+ srl $at,$d1,24
-+ or $t0,$t1
-+ srl $t1,$d1,8
-+ or $d0,$t0
-+ andi $t0,$d1,0xFF00
-+ sll $d1,$d1,24
-+ andi $t1,0xFF00
-+ sll $t0,$t0,8
-+ or $d1,$at
-+ srl $at,$d2,24
-+ or $t1,$t0
-+ srl $t0,$d2,8
-+ or $d1,$t1
-+ andi $t1,$d2,0xFF00
-+ sll $d2,$d2,24
-+ andi $t0,0xFF00
-+ sll $t1,$t1,8
-+ or $d2,$at
-+ srl $at,$d3,24
-+ or $t0,$t1
-+ srl $t1,$d3,8
-+ or $d2,$t0
-+ andi $t0,$d3,0xFF00
-+ sll $d3,$d3,24
-+ andi $t1,0xFF00
-+ sll $t0,$t0,8
-+ or $d3,$at
-+ or $t1,$t0
-+ or $d3,$t1
-+# endif
-+#endif
-+ srl $t0,$h4,2 # modulo-scheduled reduction
-+ andi $h4,$h4,3
-+ sll $at,$t0,2
-+
-+ addu $d0,$d0,$h0 # accumulate input
-+ addu $t0,$t0,$at
-+ sltu $h0,$d0,$h0
-+ addu $d0,$d0,$t0 # ... and residue
-+ sltu $at,$d0,$t0
-+
-+ addu $d1,$d1,$h1
-+ addu $h0,$h0,$at # carry
-+ sltu $h1,$d1,$h1
-+ addu $d1,$d1,$h0
-+ sltu $h0,$d1,$h0
-+
-+ addu $d2,$d2,$h2
-+ addu $h1,$h1,$h0 # carry
-+ sltu $h2,$d2,$h2
-+ addu $d2,$d2,$h1
-+ sltu $h1,$d2,$h1
-+
-+ addu $d3,$d3,$h3
-+ addu $h2,$h2,$h1 # carry
-+ sltu $h3,$d3,$h3
-+ addu $d3,$d3,$h2
-+
-+#if defined(_MIPS_ARCH_MIPS32R2) && !defined(_MIPS_ARCH_MIPS32R6)
-+ multu $r0,$d0 # d0*r0
-+ sltu $h2,$d3,$h2
-+ maddu $rs3,$d1 # d1*s3
-+ addu $h3,$h3,$h2 # carry
-+ maddu $rs2,$d2 # d2*s2
-+ addu $h4,$h4,$padbit
-+ maddu $rs1,$d3 # d3*s1
-+ addu $h4,$h4,$h3
-+ mfhi $at
-+ mflo $h0
-+
-+ multu $r1,$d0 # d0*r1
-+ maddu $r0,$d1 # d1*r0
-+ maddu $rs3,$d2 # d2*s3
-+ maddu $rs2,$d3 # d3*s2
-+ maddu $rs1,$h4 # h4*s1
-+ maddu $at,$one # hi*1
-+ mfhi $at
-+ mflo $h1
-+
-+ multu $r2,$d0 # d0*r2
-+ maddu $r1,$d1 # d1*r1
-+ maddu $r0,$d2 # d2*r0
-+ maddu $rs3,$d3 # d3*s3
-+ maddu $rs2,$h4 # h4*s2
-+ maddu $at,$one # hi*1
-+ mfhi $at
-+ mflo $h2
-+
-+ mul $t0,$r0,$h4 # h4*r0
-+
-+ multu $r3,$d0 # d0*r3
-+ maddu $r2,$d1 # d1*r2
-+ maddu $r1,$d2 # d2*r1
-+ maddu $r0,$d3 # d3*r0
-+ maddu $rs3,$h4 # h4*s3
-+ maddu $at,$one # hi*1
-+ mfhi $at
-+ mflo $h3
-+
-+ addiu $inp,$inp,16
-+
-+ addu $h4,$t0,$at
-+#else
-+ multu ($r0,$d0) # d0*r0
-+ mflo ($h0,$r0,$d0)
-+ mfhi ($h1,$r0,$d0)
-+
-+ sltu $h2,$d3,$h2
-+ addu $h3,$h3,$h2 # carry
-+
-+ multu ($rs3,$d1) # d1*s3
-+ mflo ($at,$rs3,$d1)
-+ mfhi ($t0,$rs3,$d1)
-+
-+ addu $h4,$h4,$padbit
-+ addiu $inp,$inp,16
-+ addu $h4,$h4,$h3
-+
-+ multu ($rs2,$d2) # d2*s2
-+ mflo ($a3,$rs2,$d2)
-+ mfhi ($t1,$rs2,$d2)
-+ addu $h0,$h0,$at
-+ addu $h1,$h1,$t0
-+ multu ($rs1,$d3) # d3*s1
-+ sltu $at,$h0,$at
-+ addu $h1,$h1,$at
-+
-+ mflo ($at,$rs1,$d3)
-+ mfhi ($t0,$rs1,$d3)
-+ addu $h0,$h0,$a3
-+ addu $h1,$h1,$t1
-+ multu ($r1,$d0) # d0*r1
-+ sltu $a3,$h0,$a3
-+ addu $h1,$h1,$a3
-+
-+
-+ mflo ($a3,$r1,$d0)
-+ mfhi ($h2,$r1,$d0)
-+ addu $h0,$h0,$at
-+ addu $h1,$h1,$t0
-+ multu ($r0,$d1) # d1*r0
-+ sltu $at,$h0,$at
-+ addu $h1,$h1,$at
-+
-+ mflo ($at,$r0,$d1)
-+ mfhi ($t0,$r0,$d1)
-+ addu $h1,$h1,$a3
-+ sltu $a3,$h1,$a3
-+ multu ($rs3,$d2) # d2*s3
-+ addu $h2,$h2,$a3
-+
-+ mflo ($a3,$rs3,$d2)
-+ mfhi ($t1,$rs3,$d2)
-+ addu $h1,$h1,$at
-+ addu $h2,$h2,$t0
-+ multu ($rs2,$d3) # d3*s2
-+ sltu $at,$h1,$at
-+ addu $h2,$h2,$at
-+
-+ mflo ($at,$rs2,$d3)
-+ mfhi ($t0,$rs2,$d3)
-+ addu $h1,$h1,$a3
-+ addu $h2,$h2,$t1
-+ multu ($rs1,$h4) # h4*s1
-+ sltu $a3,$h1,$a3
-+ addu $h2,$h2,$a3
-+
-+ mflo ($a3,$rs1,$h4)
-+ addu $h1,$h1,$at
-+ addu $h2,$h2,$t0
-+ multu ($r2,$d0) # d0*r2
-+ sltu $at,$h1,$at
-+ addu $h2,$h2,$at
-+
-+
-+ mflo ($at,$r2,$d0)
-+ mfhi ($h3,$r2,$d0)
-+ addu $h1,$h1,$a3
-+ sltu $a3,$h1,$a3
-+ multu ($r1,$d1) # d1*r1
-+ addu $h2,$h2,$a3
-+
-+ mflo ($a3,$r1,$d1)
-+ mfhi ($t1,$r1,$d1)
-+ addu $h2,$h2,$at
-+ sltu $at,$h2,$at
-+ multu ($r0,$d2) # d2*r0
-+ addu $h3,$h3,$at
-+
-+ mflo ($at,$r0,$d2)
-+ mfhi ($t0,$r0,$d2)
-+ addu $h2,$h2,$a3
-+ addu $h3,$h3,$t1
-+ multu ($rs3,$d3) # d3*s3
-+ sltu $a3,$h2,$a3
-+ addu $h3,$h3,$a3
-+
-+ mflo ($a3,$rs3,$d3)
-+ mfhi ($t1,$rs3,$d3)
-+ addu $h2,$h2,$at
-+ addu $h3,$h3,$t0
-+ multu ($rs2,$h4) # h4*s2
-+ sltu $at,$h2,$at
-+ addu $h3,$h3,$at
-+
-+ mflo ($at,$rs2,$h4)
-+ addu $h2,$h2,$a3
-+ addu $h3,$h3,$t1
-+ multu ($r3,$d0) # d0*r3
-+ sltu $a3,$h2,$a3
-+ addu $h3,$h3,$a3
-+
-+
-+ mflo ($a3,$r3,$d0)
-+ mfhi ($t1,$r3,$d0)
-+ addu $h2,$h2,$at
-+ sltu $at,$h2,$at
-+ multu ($r2,$d1) # d1*r2
-+ addu $h3,$h3,$at
-+
-+ mflo ($at,$r2,$d1)
-+ mfhi ($t0,$r2,$d1)
-+ addu $h3,$h3,$a3
-+ sltu $a3,$h3,$a3
-+ multu ($r0,$d3) # d3*r0
-+ addu $t1,$t1,$a3
-+
-+ mflo ($a3,$r0,$d3)
-+ mfhi ($d3,$r0,$d3)
-+ addu $h3,$h3,$at
-+ addu $t1,$t1,$t0
-+ multu ($r1,$d2) # d2*r1
-+ sltu $at,$h3,$at
-+ addu $t1,$t1,$at
-+
-+ mflo ($at,$r1,$d2)
-+ mfhi ($t0,$r1,$d2)
-+ addu $h3,$h3,$a3
-+ addu $t1,$t1,$d3
-+ multu ($rs3,$h4) # h4*s3
-+ sltu $a3,$h3,$a3
-+ addu $t1,$t1,$a3
-+
-+ mflo ($a3,$rs3,$h4)
-+ addu $h3,$h3,$at
-+ addu $t1,$t1,$t0
-+ multu ($r0,$h4) # h4*r0
-+ sltu $at,$h3,$at
-+ addu $t1,$t1,$at
-+
-+
-+ mflo ($h4,$r0,$h4)
-+ addu $h3,$h3,$a3
-+ sltu $a3,$h3,$a3
-+ addu $t1,$t1,$a3
-+ addu $h4,$h4,$t1
-+
-+ li $padbit,1 # if we loop, padbit is 1
-+#endif
-+ bne $inp,$len,.Loop
-+
-+ sw $h0,0($ctx) # store hash value
-+ sw $h1,4($ctx)
-+ sw $h2,8($ctx)
-+ sw $h3,12($ctx)
-+ sw $h4,16($ctx)
-+
-+ .set noreorder
-+.Labort:
-+ lw $s11,4*11($sp)
-+ lw $s10,4*10($sp)
-+ lw $s9, 4*9($sp)
-+ lw $s8, 4*8($sp)
-+ lw $s7, 4*7($sp)
-+ lw $s6, 4*6($sp)
-+ lw $s5, 4*5($sp)
-+ lw $s4, 4*4($sp)
-+___
-+$code.=<<___ if ($flavour =~ /nubi/i); # optimize non-nubi prologue
-+ lw $s3, 4*3($sp)
-+ lw $s2, 4*2($sp)
-+ lw $s1, 4*1($sp)
-+ lw $s0, 4*0($sp)
-+___
-+$code.=<<___;
-+ jr $ra
-+ addu $sp,$sp,4*12
-+.end poly1305_blocks
-+___
-+}
-+{
-+my ($ctx,$mac,$nonce,$tmp4) = ($a0,$a1,$a2,$a3);
-+
-+$code.=<<___;
-+.align 5
-+.globl poly1305_emit
-+.ent poly1305_emit
-+poly1305_emit:
-+ .frame $sp,0,$ra
-+ .set reorder
-+
-+ lw $tmp4,16($ctx)
-+ lw $tmp0,0($ctx)
-+ lw $tmp1,4($ctx)
-+ lw $tmp2,8($ctx)
-+ lw $tmp3,12($ctx)
-+
-+ li $in0,-4 # final reduction
-+ srl $ctx,$tmp4,2
-+ and $in0,$in0,$tmp4
-+ andi $tmp4,$tmp4,3
-+ addu $ctx,$ctx,$in0
-+
-+ addu $tmp0,$tmp0,$ctx
-+ sltu $ctx,$tmp0,$ctx
-+ addiu $in0,$tmp0,5 # compare to modulus
-+ addu $tmp1,$tmp1,$ctx
-+ sltiu $in1,$in0,5
-+ sltu $ctx,$tmp1,$ctx
-+ addu $in1,$in1,$tmp1
-+ addu $tmp2,$tmp2,$ctx
-+ sltu $in2,$in1,$tmp1
-+ sltu $ctx,$tmp2,$ctx
-+ addu $in2,$in2,$tmp2
-+ addu $tmp3,$tmp3,$ctx
-+ sltu $in3,$in2,$tmp2
-+ sltu $ctx,$tmp3,$ctx
-+ addu $in3,$in3,$tmp3
-+ addu $tmp4,$tmp4,$ctx
-+ sltu $ctx,$in3,$tmp3
-+ addu $ctx,$tmp4
-+
-+ srl $ctx,2 # see if it carried/borrowed
-+ subu $ctx,$zero,$ctx
-+
-+ xor $in0,$tmp0
-+ xor $in1,$tmp1
-+ xor $in2,$tmp2
-+ xor $in3,$tmp3
-+ and $in0,$ctx
-+ and $in1,$ctx
-+ and $in2,$ctx
-+ and $in3,$ctx
-+ xor $in0,$tmp0
-+ xor $in1,$tmp1
-+ xor $in2,$tmp2
-+ xor $in3,$tmp3
-+
-+ lw $tmp0,0($nonce) # load nonce
-+ lw $tmp1,4($nonce)
-+ lw $tmp2,8($nonce)
-+ lw $tmp3,12($nonce)
-+
-+ addu $in0,$tmp0 # accumulate nonce
-+ sltu $ctx,$in0,$tmp0
-+
-+ addu $in1,$tmp1
-+ sltu $tmp1,$in1,$tmp1
-+ addu $in1,$ctx
-+ sltu $ctx,$in1,$ctx
-+ addu $ctx,$tmp1
-+
-+ addu $in2,$tmp2
-+ sltu $tmp2,$in2,$tmp2
-+ addu $in2,$ctx
-+ sltu $ctx,$in2,$ctx
-+ addu $ctx,$tmp2
-+
-+ addu $in3,$tmp3
-+ addu $in3,$ctx
-+
-+ srl $tmp0,$in0,8 # write mac value
-+ srl $tmp1,$in0,16
-+ srl $tmp2,$in0,24
-+ sb $in0, 0($mac)
-+ sb $tmp0,1($mac)
-+ srl $tmp0,$in1,8
-+ sb $tmp1,2($mac)
-+ srl $tmp1,$in1,16
-+ sb $tmp2,3($mac)
-+ srl $tmp2,$in1,24
-+ sb $in1, 4($mac)
-+ sb $tmp0,5($mac)
-+ srl $tmp0,$in2,8
-+ sb $tmp1,6($mac)
-+ srl $tmp1,$in2,16
-+ sb $tmp2,7($mac)
-+ srl $tmp2,$in2,24
-+ sb $in2, 8($mac)
-+ sb $tmp0,9($mac)
-+ srl $tmp0,$in3,8
-+ sb $tmp1,10($mac)
-+ srl $tmp1,$in3,16
-+ sb $tmp2,11($mac)
-+ srl $tmp2,$in3,24
-+ sb $in3, 12($mac)
-+ sb $tmp0,13($mac)
-+ sb $tmp1,14($mac)
-+ sb $tmp2,15($mac)
-+
-+ jr $ra
-+.end poly1305_emit
-+.rdata
-+.asciiz "Poly1305 for MIPS32, CRYPTOGAMS by \@dot-asm"
-+.align 2
-+___
-+}
-+}}}
-+
-+$output=pop and open STDOUT,">$output";
-+print $code;
-+close STDOUT;
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -707,6 +707,11 @@ config CRYPTO_POLY1305_X86_64
- in IETF protocols. This is the x86_64 assembler implementation using SIMD
- instructions.
-
-+config CRYPTO_POLY1305_MIPS
-+ tristate "Poly1305 authenticator algorithm (MIPS optimized)"
-+ depends on CPU_MIPS32 || (CPU_MIPS64 && 64BIT)
-+ select CRYPTO_ARCH_HAVE_LIB_POLY1305
-+
- config CRYPTO_MD4
- tristate "MD4 digest algorithm"
- select CRYPTO_HASH
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -39,6 +39,7 @@ config CRYPTO_LIB_DES
-
- config CRYPTO_LIB_POLY1305_RSIZE
- int
-+ default 2 if MIPS
- default 4 if X86_64
- default 9 if ARM || ARM64
- default 1
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0021-crypto-blake2s-generic-C-library-implementation-and-.patch b/target/linux/generic/backport-5.4/080-wireguard-0021-crypto-blake2s-generic-C-library-implementation-and-.patch
deleted file mode 100644
index 97f73b983a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0021-crypto-blake2s-generic-C-library-implementation-and-.patch
+++ /dev/null
@@ -1,1097 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:28 +0100
-Subject: [PATCH] crypto: blake2s - generic C library implementation and
- selftest
-
-commit 66d7fb94e4ffe5acc589e0b2b4710aecc1f07a28 upstream.
-
-The C implementation was originally based on Samuel Neves' public
-domain reference implementation but has since been heavily modified
-for the kernel. We're able to do compile-time optimizations by moving
-some scaffolding around the final function into the header file.
-
-Information: https://blake2.net/
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
-Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
-[ardb: - move from lib/zinc to lib/crypto
- - remove simd handling
- - rewrote selftest for better coverage
- - use fixed digest length for blake2s_hmac() and rename to
- blake2s256_hmac() ]
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/blake2s.h | 106 +++++
- include/crypto/internal/blake2s.h | 19 +
- lib/crypto/Kconfig | 25 ++
- lib/crypto/Makefile | 10 +
- lib/crypto/blake2s-generic.c | 111 ++++++
- lib/crypto/blake2s-selftest.c | 622 ++++++++++++++++++++++++++++++
- lib/crypto/blake2s.c | 126 ++++++
- 7 files changed, 1019 insertions(+)
- create mode 100644 include/crypto/blake2s.h
- create mode 100644 include/crypto/internal/blake2s.h
- create mode 100644 lib/crypto/blake2s-generic.c
- create mode 100644 lib/crypto/blake2s-selftest.c
- create mode 100644 lib/crypto/blake2s.c
-
---- /dev/null
-+++ b/include/crypto/blake2s.h
-@@ -0,0 +1,106 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef BLAKE2S_H
-+#define BLAKE2S_H
-+
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+
-+#include <asm/bug.h>
-+
-+enum blake2s_lengths {
-+ BLAKE2S_BLOCK_SIZE = 64,
-+ BLAKE2S_HASH_SIZE = 32,
-+ BLAKE2S_KEY_SIZE = 32,
-+
-+ BLAKE2S_128_HASH_SIZE = 16,
-+ BLAKE2S_160_HASH_SIZE = 20,
-+ BLAKE2S_224_HASH_SIZE = 28,
-+ BLAKE2S_256_HASH_SIZE = 32,
-+};
-+
-+struct blake2s_state {
-+ u32 h[8];
-+ u32 t[2];
-+ u32 f[2];
-+ u8 buf[BLAKE2S_BLOCK_SIZE];
-+ unsigned int buflen;
-+ unsigned int outlen;
-+};
-+
-+enum blake2s_iv {
-+ BLAKE2S_IV0 = 0x6A09E667UL,
-+ BLAKE2S_IV1 = 0xBB67AE85UL,
-+ BLAKE2S_IV2 = 0x3C6EF372UL,
-+ BLAKE2S_IV3 = 0xA54FF53AUL,
-+ BLAKE2S_IV4 = 0x510E527FUL,
-+ BLAKE2S_IV5 = 0x9B05688CUL,
-+ BLAKE2S_IV6 = 0x1F83D9ABUL,
-+ BLAKE2S_IV7 = 0x5BE0CD19UL,
-+};
-+
-+void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen);
-+void blake2s_final(struct blake2s_state *state, u8 *out);
-+
-+static inline void blake2s_init_param(struct blake2s_state *state,
-+ const u32 param)
-+{
-+ *state = (struct blake2s_state){{
-+ BLAKE2S_IV0 ^ param,
-+ BLAKE2S_IV1,
-+ BLAKE2S_IV2,
-+ BLAKE2S_IV3,
-+ BLAKE2S_IV4,
-+ BLAKE2S_IV5,
-+ BLAKE2S_IV6,
-+ BLAKE2S_IV7,
-+ }};
-+}
-+
-+static inline void blake2s_init(struct blake2s_state *state,
-+ const size_t outlen)
-+{
-+ blake2s_init_param(state, 0x01010000 | outlen);
-+ state->outlen = outlen;
-+}
-+
-+static inline void blake2s_init_key(struct blake2s_state *state,
-+ const size_t outlen, const void *key,
-+ const size_t keylen)
-+{
-+ WARN_ON(IS_ENABLED(DEBUG) && (!outlen || outlen > BLAKE2S_HASH_SIZE ||
-+ !key || !keylen || keylen > BLAKE2S_KEY_SIZE));
-+
-+ blake2s_init_param(state, 0x01010000 | keylen << 8 | outlen);
-+ memcpy(state->buf, key, keylen);
-+ state->buflen = BLAKE2S_BLOCK_SIZE;
-+ state->outlen = outlen;
-+}
-+
-+static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
-+ const size_t outlen, const size_t inlen,
-+ const size_t keylen)
-+{
-+ struct blake2s_state state;
-+
-+ WARN_ON(IS_ENABLED(DEBUG) && ((!in && inlen > 0) || !out || !outlen ||
-+ outlen > BLAKE2S_HASH_SIZE || keylen > BLAKE2S_KEY_SIZE ||
-+ (!key && keylen)));
-+
-+ if (keylen)
-+ blake2s_init_key(&state, outlen, key, keylen);
-+ else
-+ blake2s_init(&state, outlen);
-+
-+ blake2s_update(&state, in, inlen);
-+ blake2s_final(&state, out);
-+}
-+
-+void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
-+ const size_t keylen);
-+
-+#endif /* BLAKE2S_H */
---- /dev/null
-+++ b/include/crypto/internal/blake2s.h
-@@ -0,0 +1,19 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+
-+#ifndef BLAKE2S_INTERNAL_H
-+#define BLAKE2S_INTERNAL_H
-+
-+#include <crypto/blake2s.h>
-+
-+void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
-+ size_t nblocks, const u32 inc);
-+
-+void blake2s_compress_arch(struct blake2s_state *state,const u8 *block,
-+ size_t nblocks, const u32 inc);
-+
-+static inline void blake2s_set_lastblock(struct blake2s_state *state)
-+{
-+ state->f[0] = -1;
-+}
-+
-+#endif /* BLAKE2S_INTERNAL_H */
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -8,6 +8,31 @@ config CRYPTO_LIB_AES
- config CRYPTO_LIB_ARC4
- tristate
-
-+config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
-+ tristate
-+ help
-+ Declares whether the architecture provides an arch-specific
-+ accelerated implementation of the Blake2s library interface,
-+ either builtin or as a module.
-+
-+config CRYPTO_LIB_BLAKE2S_GENERIC
-+ tristate
-+ help
-+ This symbol can be depended upon by arch implementations of the
-+ Blake2s library interface that require the generic code as a
-+ fallback, e.g., for SIMD implementations. If no arch specific
-+ implementation is enabled, this implementation serves the users
-+ of CRYPTO_LIB_BLAKE2S.
-+
-+config CRYPTO_LIB_BLAKE2S
-+ tristate "BLAKE2s hash function library"
-+ depends on CRYPTO_ARCH_HAVE_LIB_BLAKE2S || !CRYPTO_ARCH_HAVE_LIB_BLAKE2S
-+ select CRYPTO_LIB_BLAKE2S_GENERIC if CRYPTO_ARCH_HAVE_LIB_BLAKE2S=n
-+ help
-+ Enable the Blake2s library interface. This interface may be fulfilled
-+ by either the generic implementation or an arch-specific one, if one
-+ is available and enabled.
-+
- config CRYPTO_ARCH_HAVE_LIB_CHACHA
- tristate
- help
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -10,6 +10,12 @@ libaes-y := aes.o
- obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
- libarc4-y := arc4.o
-
-+obj-$(CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC) += libblake2s-generic.o
-+libblake2s-generic-y += blake2s-generic.o
-+
-+obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o
-+libblake2s-y += blake2s.o
-+
- obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
- libdes-y := des.o
-
-@@ -18,3 +24,7 @@ libpoly1305-y := poly1305.o
-
- obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
- libsha256-y := sha256.o
-+
-+ifneq ($(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS),y)
-+libblake2s-y += blake2s-selftest.o
-+endif
---- /dev/null
-+++ b/lib/crypto/blake2s-generic.c
-@@ -0,0 +1,111 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is an implementation of the BLAKE2s hash and PRF functions.
-+ *
-+ * Information: https://blake2.net/
-+ *
-+ */
-+
-+#include <crypto/internal/blake2s.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/bug.h>
-+#include <asm/unaligned.h>
-+
-+static const u8 blake2s_sigma[10][16] = {
-+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
-+ { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
-+ { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },
-+ { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
-+ { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },
-+ { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
-+ { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },
-+ { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
-+ { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },
-+ { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 },
-+};
-+
-+static inline void blake2s_increment_counter(struct blake2s_state *state,
-+ const u32 inc)
-+{
-+ state->t[0] += inc;
-+ state->t[1] += (state->t[0] < inc);
-+}
-+
-+void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
-+ size_t nblocks, const u32 inc)
-+{
-+ u32 m[16];
-+ u32 v[16];
-+ int i;
-+
-+ WARN_ON(IS_ENABLED(DEBUG) &&
-+ (nblocks > 1 && inc != BLAKE2S_BLOCK_SIZE));
-+
-+ while (nblocks > 0) {
-+ blake2s_increment_counter(state, inc);
-+ memcpy(m, block, BLAKE2S_BLOCK_SIZE);
-+ le32_to_cpu_array(m, ARRAY_SIZE(m));
-+ memcpy(v, state->h, 32);
-+ v[ 8] = BLAKE2S_IV0;
-+ v[ 9] = BLAKE2S_IV1;
-+ v[10] = BLAKE2S_IV2;
-+ v[11] = BLAKE2S_IV3;
-+ v[12] = BLAKE2S_IV4 ^ state->t[0];
-+ v[13] = BLAKE2S_IV5 ^ state->t[1];
-+ v[14] = BLAKE2S_IV6 ^ state->f[0];
-+ v[15] = BLAKE2S_IV7 ^ state->f[1];
-+
-+#define G(r, i, a, b, c, d) do { \
-+ a += b + m[blake2s_sigma[r][2 * i + 0]]; \
-+ d = ror32(d ^ a, 16); \
-+ c += d; \
-+ b = ror32(b ^ c, 12); \
-+ a += b + m[blake2s_sigma[r][2 * i + 1]]; \
-+ d = ror32(d ^ a, 8); \
-+ c += d; \
-+ b = ror32(b ^ c, 7); \
-+} while (0)
-+
-+#define ROUND(r) do { \
-+ G(r, 0, v[0], v[ 4], v[ 8], v[12]); \
-+ G(r, 1, v[1], v[ 5], v[ 9], v[13]); \
-+ G(r, 2, v[2], v[ 6], v[10], v[14]); \
-+ G(r, 3, v[3], v[ 7], v[11], v[15]); \
-+ G(r, 4, v[0], v[ 5], v[10], v[15]); \
-+ G(r, 5, v[1], v[ 6], v[11], v[12]); \
-+ G(r, 6, v[2], v[ 7], v[ 8], v[13]); \
-+ G(r, 7, v[3], v[ 4], v[ 9], v[14]); \
-+} while (0)
-+ ROUND(0);
-+ ROUND(1);
-+ ROUND(2);
-+ ROUND(3);
-+ ROUND(4);
-+ ROUND(5);
-+ ROUND(6);
-+ ROUND(7);
-+ ROUND(8);
-+ ROUND(9);
-+
-+#undef G
-+#undef ROUND
-+
-+ for (i = 0; i < 8; ++i)
-+ state->h[i] ^= v[i] ^ v[i + 8];
-+
-+ block += BLAKE2S_BLOCK_SIZE;
-+ --nblocks;
-+ }
-+}
-+
-+EXPORT_SYMBOL(blake2s_compress_generic);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("BLAKE2s hash function");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
---- /dev/null
-+++ b/lib/crypto/blake2s-selftest.c
-@@ -0,0 +1,622 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include <crypto/blake2s.h>
-+#include <linux/string.h>
-+
-+/*
-+ * blake2s_testvecs[] generated with the program below (using libb2-dev and
-+ * libssl-dev [OpenSSL])
-+ *
-+ * #include <blake2.h>
-+ * #include <stdint.h>
-+ * #include <stdio.h>
-+ *
-+ * #include <openssl/evp.h>
-+ * #include <openssl/hmac.h>
-+ *
-+ * #define BLAKE2S_TESTVEC_COUNT 256
-+ *
-+ * static void print_vec(const uint8_t vec[], int len)
-+ * {
-+ * int i;
-+ *
-+ * printf(" { ");
-+ * for (i = 0; i < len; i++) {
-+ * if (i && (i % 12) == 0)
-+ * printf("\n ");
-+ * printf("0x%02x, ", vec[i]);
-+ * }
-+ * printf("},\n");
-+ * }
-+ *
-+ * int main(void)
-+ * {
-+ * uint8_t key[BLAKE2S_KEYBYTES];
-+ * uint8_t buf[BLAKE2S_TESTVEC_COUNT];
-+ * uint8_t hash[BLAKE2S_OUTBYTES];
-+ * int i, j;
-+ *
-+ * key[0] = key[1] = 1;
-+ * for (i = 2; i < BLAKE2S_KEYBYTES; ++i)
-+ * key[i] = key[i - 2] + key[i - 1];
-+ *
-+ * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i)
-+ * buf[i] = (uint8_t)i;
-+ *
-+ * printf("static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n");
-+ *
-+ * for (i = 0; i < BLAKE2S_TESTVEC_COUNT; ++i) {
-+ * int outlen = 1 + i % BLAKE2S_OUTBYTES;
-+ * int keylen = (13 * i) % (BLAKE2S_KEYBYTES + 1);
-+ *
-+ * blake2s(hash, buf, key + BLAKE2S_KEYBYTES - keylen, outlen, i,
-+ * keylen);
-+ * print_vec(hash, outlen);
-+ * }
-+ * printf("};\n\n");
-+ *
-+ * printf("static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n");
-+ *
-+ * HMAC(EVP_blake2s256(), key, sizeof(key), buf, sizeof(buf), hash, NULL);
-+ * print_vec(hash, BLAKE2S_OUTBYTES);
-+ *
-+ * HMAC(EVP_blake2s256(), buf, sizeof(buf), key, sizeof(key), hash, NULL);
-+ * print_vec(hash, BLAKE2S_OUTBYTES);
-+ *
-+ * printf("};\n");
-+ *
-+ * return 0;
-+ *}
-+ */
-+static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
-+ { 0xa1, },
-+ { 0x7c, 0x89, },
-+ { 0x74, 0x0e, 0xd4, },
-+ { 0x47, 0x0c, 0x21, 0x15, },
-+ { 0x18, 0xd6, 0x9c, 0xa6, 0xc4, },
-+ { 0x13, 0x5d, 0x16, 0x63, 0x2e, 0xf9, },
-+ { 0x2c, 0xb5, 0x04, 0xb7, 0x99, 0xe2, 0x73, },
-+ { 0x9a, 0x0f, 0xd2, 0x39, 0xd6, 0x68, 0x1b, 0x92, },
-+ { 0xc8, 0xde, 0x7a, 0xea, 0x2f, 0xf4, 0xd2, 0xe3, 0x2b, },
-+ { 0x5b, 0xf9, 0x43, 0x52, 0x0c, 0x12, 0xba, 0xb5, 0x93, 0x9f, },
-+ { 0xc6, 0x2c, 0x4e, 0x80, 0xfc, 0x32, 0x5b, 0x33, 0xb8, 0xb8, 0x0a, },
-+ { 0xa7, 0x5c, 0xfd, 0x3a, 0xcc, 0xbf, 0x90, 0xca, 0xb7, 0x97, 0xde, 0xd8, },
-+ { 0x66, 0xca, 0x3c, 0xc4, 0x19, 0xef, 0x92, 0x66, 0x3f, 0x21, 0x8f, 0xda,
-+ 0xb7, },
-+ { 0xba, 0xe5, 0xbb, 0x30, 0x25, 0x94, 0x6d, 0xc3, 0x89, 0x09, 0xc4, 0x25,
-+ 0x52, 0x3e, },
-+ { 0xa2, 0xef, 0x0e, 0x52, 0x0b, 0x5f, 0xa2, 0x01, 0x6d, 0x0a, 0x25, 0xbc,
-+ 0x57, 0xe2, 0x27, },
-+ { 0x4f, 0xe0, 0xf9, 0x52, 0x12, 0xda, 0x84, 0xb7, 0xab, 0xae, 0xb0, 0xa6,
-+ 0x47, 0x2a, 0xc7, 0xf5, },
-+ { 0x56, 0xe7, 0xa8, 0x1c, 0x4c, 0xca, 0xed, 0x90, 0x31, 0xec, 0x87, 0x43,
-+ 0xe7, 0x72, 0x08, 0xec, 0xbe, },
-+ { 0x7e, 0xdf, 0x80, 0x1c, 0x93, 0x33, 0xfd, 0x53, 0x44, 0xba, 0xfd, 0x96,
-+ 0xe1, 0xbb, 0xb5, 0x65, 0xa5, 0x00, },
-+ { 0xec, 0x6b, 0xed, 0xf7, 0x7b, 0x62, 0x1d, 0x7d, 0xf4, 0x82, 0xf3, 0x1e,
-+ 0x18, 0xff, 0x2b, 0xc4, 0x06, 0x20, 0x2a, },
-+ { 0x74, 0x98, 0xd7, 0x68, 0x63, 0xed, 0x87, 0xe4, 0x5d, 0x8d, 0x9e, 0x1d,
-+ 0xfd, 0x2a, 0xbb, 0x86, 0xac, 0xe9, 0x2a, 0x89, },
-+ { 0x89, 0xc3, 0x88, 0xce, 0x2b, 0x33, 0x1e, 0x10, 0xd1, 0x37, 0x20, 0x86,
-+ 0x28, 0x43, 0x70, 0xd9, 0xfb, 0x96, 0xd9, 0xb5, 0xd3, },
-+ { 0xcb, 0x56, 0x74, 0x41, 0x8d, 0x80, 0x01, 0x9a, 0x6b, 0x38, 0xe1, 0x41,
-+ 0xad, 0x9c, 0x62, 0x74, 0xce, 0x35, 0xd5, 0x6c, 0x89, 0x6e, },
-+ { 0x79, 0xaf, 0x94, 0x59, 0x99, 0x26, 0xe1, 0xc9, 0x34, 0xfe, 0x7c, 0x22,
-+ 0xf7, 0x43, 0xd7, 0x65, 0xd4, 0x48, 0x18, 0xac, 0x3d, 0xfd, 0x93, },
-+ { 0x85, 0x0d, 0xff, 0xb8, 0x3e, 0x87, 0x41, 0xb0, 0x95, 0xd3, 0x3d, 0x00,
-+ 0x47, 0x55, 0x9e, 0xd2, 0x69, 0xea, 0xbf, 0xe9, 0x7a, 0x2d, 0x61, 0x45, },
-+ { 0x03, 0xe0, 0x85, 0xec, 0x54, 0xb5, 0x16, 0x53, 0xa8, 0xc4, 0x71, 0xe9,
-+ 0x6a, 0xe7, 0xcb, 0xc4, 0x15, 0x02, 0xfc, 0x34, 0xa4, 0xa4, 0x28, 0x13,
-+ 0xd1, },
-+ { 0xe3, 0x34, 0x4b, 0xe1, 0xd0, 0x4b, 0x55, 0x61, 0x8f, 0xc0, 0x24, 0x05,
-+ 0xe6, 0xe0, 0x3d, 0x70, 0x24, 0x4d, 0xda, 0xb8, 0x91, 0x05, 0x29, 0x07,
-+ 0x01, 0x3e, },
-+ { 0x61, 0xff, 0x01, 0x72, 0xb1, 0x4d, 0xf6, 0xfe, 0xd1, 0xd1, 0x08, 0x74,
-+ 0xe6, 0x91, 0x44, 0xeb, 0x61, 0xda, 0x40, 0xaf, 0xfc, 0x8c, 0x91, 0x6b,
-+ 0xec, 0x13, 0xed, },
-+ { 0xd4, 0x40, 0xd2, 0xa0, 0x7f, 0xc1, 0x58, 0x0c, 0x85, 0xa0, 0x86, 0xc7,
-+ 0x86, 0xb9, 0x61, 0xc9, 0xea, 0x19, 0x86, 0x1f, 0xab, 0x07, 0xce, 0x37,
-+ 0x72, 0x67, 0x09, 0xfc, },
-+ { 0x9e, 0xf8, 0x18, 0x67, 0x93, 0x10, 0x9b, 0x39, 0x75, 0xe8, 0x8b, 0x38,
-+ 0x82, 0x7d, 0xb8, 0xb7, 0xa5, 0xaf, 0xe6, 0x6a, 0x22, 0x5e, 0x1f, 0x9c,
-+ 0x95, 0x29, 0x19, 0xf2, 0x4b, },
-+ { 0xc8, 0x62, 0x25, 0xf5, 0x98, 0xc9, 0xea, 0xe5, 0x29, 0x3a, 0xd3, 0x22,
-+ 0xeb, 0xeb, 0x07, 0x7c, 0x15, 0x07, 0xee, 0x15, 0x61, 0xbb, 0x05, 0x30,
-+ 0x99, 0x7f, 0x11, 0xf6, 0x0a, 0x1d, },
-+ { 0x68, 0x70, 0xf7, 0x90, 0xa1, 0x8b, 0x1f, 0x0f, 0xbb, 0xce, 0xd2, 0x0e,
-+ 0x33, 0x1f, 0x7f, 0xa9, 0x78, 0xa8, 0xa6, 0x81, 0x66, 0xab, 0x8d, 0xcd,
-+ 0x58, 0x55, 0x3a, 0x0b, 0x7a, 0xdb, 0xb5, },
-+ { 0xdd, 0x35, 0xd2, 0xb4, 0xf6, 0xc7, 0xea, 0xab, 0x64, 0x24, 0x4e, 0xfe,
-+ 0xe5, 0x3d, 0x4e, 0x95, 0x8b, 0x6d, 0x6c, 0xbc, 0xb0, 0xf8, 0x88, 0x61,
-+ 0x09, 0xb7, 0x78, 0xa3, 0x31, 0xfe, 0xd9, 0x2f, },
-+ { 0x0a, },
-+ { 0x6e, 0xd4, },
-+ { 0x64, 0xe9, 0xd1, },
-+ { 0x30, 0xdd, 0x71, 0xef, },
-+ { 0x11, 0xb5, 0x0c, 0x87, 0xc9, },
-+ { 0x06, 0x1c, 0x6d, 0x04, 0x82, 0xd0, },
-+ { 0x5c, 0x42, 0x0b, 0xee, 0xc5, 0x9c, 0xb2, },
-+ { 0xe8, 0x29, 0xd6, 0xb4, 0x5d, 0xf7, 0x2b, 0x93, },
-+ { 0x18, 0xca, 0x27, 0x72, 0x43, 0x39, 0x16, 0xbc, 0x6a, },
-+ { 0x39, 0x8f, 0xfd, 0x64, 0xf5, 0x57, 0x23, 0xb0, 0x45, 0xf8, },
-+ { 0xbb, 0x3a, 0x78, 0x6b, 0x02, 0x1d, 0x0b, 0x16, 0xe3, 0xb2, 0x9a, },
-+ { 0xb8, 0xb4, 0x0b, 0xe5, 0xd4, 0x1d, 0x0d, 0x85, 0x49, 0x91, 0x35, 0xfa, },
-+ { 0x6d, 0x48, 0x2a, 0x0c, 0x42, 0x08, 0xbd, 0xa9, 0x78, 0x6f, 0x18, 0xaf,
-+ 0xe2, },
-+ { 0x10, 0x45, 0xd4, 0x58, 0x88, 0xec, 0x4e, 0x1e, 0xf6, 0x14, 0x92, 0x64,
-+ 0x7e, 0xb0, },
-+ { 0x8b, 0x0b, 0x95, 0xee, 0x92, 0xc6, 0x3b, 0x91, 0xf1, 0x1e, 0xeb, 0x51,
-+ 0x98, 0x0a, 0x8d, },
-+ { 0xa3, 0x50, 0x4d, 0xa5, 0x1d, 0x03, 0x68, 0xe9, 0x57, 0x78, 0xd6, 0x04,
-+ 0xf1, 0xc3, 0x94, 0xd8, },
-+ { 0xb8, 0x66, 0x6e, 0xdd, 0x46, 0x15, 0xae, 0x3d, 0x83, 0x7e, 0xcf, 0xe7,
-+ 0x2c, 0xe8, 0x8f, 0xc7, 0x34, },
-+ { 0x2e, 0xc0, 0x1f, 0x29, 0xea, 0xf6, 0xb9, 0xe2, 0xc2, 0x93, 0xeb, 0x41,
-+ 0x0d, 0xf0, 0x0a, 0x13, 0x0e, 0xa2, },
-+ { 0x71, 0xb8, 0x33, 0xa9, 0x1b, 0xac, 0xf1, 0xb5, 0x42, 0x8f, 0x5e, 0x81,
-+ 0x34, 0x43, 0xb7, 0xa4, 0x18, 0x5c, 0x47, },
-+ { 0xda, 0x45, 0xb8, 0x2e, 0x82, 0x1e, 0xc0, 0x59, 0x77, 0x9d, 0xfa, 0xb4,
-+ 0x1c, 0x5e, 0xa0, 0x2b, 0x33, 0x96, 0x5a, 0x58, },
-+ { 0xe3, 0x09, 0x05, 0xa9, 0xeb, 0x48, 0x13, 0xad, 0x71, 0x88, 0x81, 0x9a,
-+ 0x3e, 0x2c, 0xe1, 0x23, 0x99, 0x13, 0x35, 0x9f, 0xb5, },
-+ { 0xb7, 0x86, 0x2d, 0x16, 0xe1, 0x04, 0x00, 0x47, 0x47, 0x61, 0x31, 0xfb,
-+ 0x14, 0xac, 0xd8, 0xe9, 0xe3, 0x49, 0xbd, 0xf7, 0x9c, 0x3f, },
-+ { 0x7f, 0xd9, 0x95, 0xa8, 0xa7, 0xa0, 0xcc, 0xba, 0xef, 0xb1, 0x0a, 0xa9,
-+ 0x21, 0x62, 0x08, 0x0f, 0x1b, 0xff, 0x7b, 0x9d, 0xae, 0xb2, 0x95, },
-+ { 0x85, 0x99, 0xea, 0x33, 0xe0, 0x56, 0xff, 0x13, 0xc6, 0x61, 0x8c, 0xf9,
-+ 0x57, 0x05, 0x03, 0x11, 0xf9, 0xfb, 0x3a, 0xf7, 0xce, 0xbb, 0x52, 0x30, },
-+ { 0xb2, 0x72, 0x9c, 0xf8, 0x77, 0x4e, 0x8f, 0x6b, 0x01, 0x6c, 0xff, 0x4e,
-+ 0x4f, 0x02, 0xd2, 0xbc, 0xeb, 0x51, 0x28, 0x99, 0x50, 0xab, 0xc4, 0x42,
-+ 0xe3, },
-+ { 0x8b, 0x0a, 0xb5, 0x90, 0x8f, 0xf5, 0x7b, 0xdd, 0xba, 0x47, 0x37, 0xc9,
-+ 0x2a, 0xd5, 0x4b, 0x25, 0x08, 0x8b, 0x02, 0x17, 0xa7, 0x9e, 0x6b, 0x6e,
-+ 0xe3, 0x90, },
-+ { 0x90, 0xdd, 0xf7, 0x75, 0xa7, 0xa3, 0x99, 0x5e, 0x5b, 0x7d, 0x75, 0xc3,
-+ 0x39, 0x6b, 0xa0, 0xe2, 0x44, 0x53, 0xb1, 0x9e, 0xc8, 0xf1, 0x77, 0x10,
-+ 0x58, 0x06, 0x9a, },
-+ { 0x99, 0x52, 0xf0, 0x49, 0xa8, 0x8c, 0xec, 0xa6, 0x97, 0x32, 0x13, 0xb5,
-+ 0xf7, 0xa3, 0x8e, 0xfb, 0x4b, 0x59, 0x31, 0x3d, 0x01, 0x59, 0x98, 0x5d,
-+ 0x53, 0x03, 0x1a, 0x39, },
-+ { 0x9f, 0xe0, 0xc2, 0xe5, 0x5d, 0x93, 0xd6, 0x9b, 0x47, 0x8f, 0x9b, 0xe0,
-+ 0x26, 0x35, 0x84, 0x20, 0x1d, 0xc5, 0x53, 0x10, 0x0f, 0x22, 0xb9, 0xb5,
-+ 0xd4, 0x36, 0xb1, 0xac, 0x73, },
-+ { 0x30, 0x32, 0x20, 0x3b, 0x10, 0x28, 0xec, 0x1f, 0x4f, 0x9b, 0x47, 0x59,
-+ 0xeb, 0x7b, 0xee, 0x45, 0xfb, 0x0c, 0x49, 0xd8, 0x3d, 0x69, 0xbd, 0x90,
-+ 0x2c, 0xf0, 0x9e, 0x8d, 0xbf, 0xd5, },
-+ { 0x2a, 0x37, 0x73, 0x7f, 0xf9, 0x96, 0x19, 0xaa, 0x25, 0xd8, 0x13, 0x28,
-+ 0x01, 0x29, 0x89, 0xdf, 0x6e, 0x0c, 0x9b, 0x43, 0x44, 0x51, 0xe9, 0x75,
-+ 0x26, 0x0c, 0xb7, 0x87, 0x66, 0x0b, 0x5f, },
-+ { 0x23, 0xdf, 0x96, 0x68, 0x91, 0x86, 0xd0, 0x93, 0x55, 0x33, 0x24, 0xf6,
-+ 0xba, 0x08, 0x75, 0x5b, 0x59, 0x11, 0x69, 0xb8, 0xb9, 0xe5, 0x2c, 0x77,
-+ 0x02, 0xf6, 0x47, 0xee, 0x81, 0xdd, 0xb9, 0x06, },
-+ { 0x9d, },
-+ { 0x9d, 0x7d, },
-+ { 0xfd, 0xc3, 0xda, },
-+ { 0xe8, 0x82, 0xcd, 0x21, },
-+ { 0xc3, 0x1d, 0x42, 0x4c, 0x74, },
-+ { 0xe9, 0xda, 0xf1, 0xa2, 0xe5, 0x7c, },
-+ { 0x52, 0xb8, 0x6f, 0x81, 0x5c, 0x3a, 0x4c, },
-+ { 0x5b, 0x39, 0x26, 0xfc, 0x92, 0x5e, 0xe0, 0x49, },
-+ { 0x59, 0xe4, 0x7c, 0x93, 0x1c, 0xf9, 0x28, 0x93, 0xde, },
-+ { 0xde, 0xdf, 0xb2, 0x43, 0x61, 0x0b, 0x86, 0x16, 0x4c, 0x2e, },
-+ { 0x14, 0x8f, 0x75, 0x51, 0xaf, 0xb9, 0xee, 0x51, 0x5a, 0xae, 0x23, },
-+ { 0x43, 0x5f, 0x50, 0xd5, 0x70, 0xb0, 0x5b, 0x87, 0xf5, 0xd9, 0xb3, 0x6d, },
-+ { 0x66, 0x0a, 0x64, 0x93, 0x79, 0x71, 0x94, 0x40, 0xb7, 0x68, 0x2d, 0xd3,
-+ 0x63, },
-+ { 0x15, 0x00, 0xc4, 0x0c, 0x7d, 0x1b, 0x10, 0xa9, 0x73, 0x1b, 0x90, 0x6f,
-+ 0xe6, 0xa9, },
-+ { 0x34, 0x75, 0xf3, 0x86, 0x8f, 0x56, 0xcf, 0x2a, 0x0a, 0xf2, 0x62, 0x0a,
-+ 0xf6, 0x0e, 0x20, },
-+ { 0xb1, 0xde, 0xc9, 0xf5, 0xdb, 0xf3, 0x2f, 0x4c, 0xd6, 0x41, 0x7d, 0x39,
-+ 0x18, 0x3e, 0xc7, 0xc3, },
-+ { 0xc5, 0x89, 0xb2, 0xf8, 0xb8, 0xc0, 0xa3, 0xb9, 0x3b, 0x10, 0x6d, 0x7c,
-+ 0x92, 0xfc, 0x7f, 0x34, 0x41, },
-+ { 0xc4, 0xd8, 0xef, 0xba, 0xef, 0xd2, 0xaa, 0xc5, 0x6c, 0x8e, 0x3e, 0xbb,
-+ 0x12, 0xfc, 0x0f, 0x72, 0xbf, 0x0f, },
-+ { 0xdd, 0x91, 0xd1, 0x15, 0x9e, 0x7d, 0xf8, 0xc1, 0xb9, 0x14, 0x63, 0x96,
-+ 0xb5, 0xcb, 0x83, 0x1d, 0x35, 0x1c, 0xec, },
-+ { 0xa9, 0xf8, 0x52, 0xc9, 0x67, 0x76, 0x2b, 0xad, 0xfb, 0xd8, 0x3a, 0xa6,
-+ 0x74, 0x02, 0xae, 0xb8, 0x25, 0x2c, 0x63, 0x49, },
-+ { 0x77, 0x1f, 0x66, 0x70, 0xfd, 0x50, 0x29, 0xaa, 0xeb, 0xdc, 0xee, 0xba,
-+ 0x75, 0x98, 0xdc, 0x93, 0x12, 0x3f, 0xdc, 0x7c, 0x38, },
-+ { 0xe2, 0xe1, 0x89, 0x5c, 0x37, 0x38, 0x6a, 0xa3, 0x40, 0xac, 0x3f, 0xb0,
-+ 0xca, 0xfc, 0xa7, 0xf3, 0xea, 0xf9, 0x0f, 0x5d, 0x8e, 0x39, },
-+ { 0x0f, 0x67, 0xc8, 0x38, 0x01, 0xb1, 0xb7, 0xb8, 0xa2, 0xe7, 0x0a, 0x6d,
-+ 0xd2, 0x63, 0x69, 0x9e, 0xcc, 0xf0, 0xf2, 0xbe, 0x9b, 0x98, 0xdd, },
-+ { 0x13, 0xe1, 0x36, 0x30, 0xfe, 0xc6, 0x01, 0x8a, 0xa1, 0x63, 0x96, 0x59,
-+ 0xc2, 0xa9, 0x68, 0x3f, 0x58, 0xd4, 0x19, 0x0c, 0x40, 0xf3, 0xde, 0x02, },
-+ { 0xa3, 0x9e, 0xce, 0xda, 0x42, 0xee, 0x8c, 0x6c, 0x5a, 0x7d, 0xdc, 0x89,
-+ 0x02, 0x77, 0xdd, 0xe7, 0x95, 0xbb, 0xff, 0x0d, 0xa4, 0xb5, 0x38, 0x1e,
-+ 0xaf, },
-+ { 0x9a, 0xf6, 0xb5, 0x9a, 0x4f, 0xa9, 0x4f, 0x2c, 0x35, 0x3c, 0x24, 0xdc,
-+ 0x97, 0x6f, 0xd9, 0xa1, 0x7d, 0x1a, 0x85, 0x0b, 0xf5, 0xda, 0x2e, 0xe7,
-+ 0xb1, 0x1d, },
-+ { 0x84, 0x1e, 0x8e, 0x3d, 0x45, 0xa5, 0xf2, 0x27, 0xf3, 0x31, 0xfe, 0xb9,
-+ 0xfb, 0xc5, 0x45, 0x99, 0x99, 0xdd, 0x93, 0x43, 0x02, 0xee, 0x58, 0xaf,
-+ 0xee, 0x6a, 0xbe, },
-+ { 0x07, 0x2f, 0xc0, 0xa2, 0x04, 0xc4, 0xab, 0x7c, 0x26, 0xbb, 0xa8, 0xd8,
-+ 0xe3, 0x1c, 0x75, 0x15, 0x64, 0x5d, 0x02, 0x6a, 0xf0, 0x86, 0xe9, 0xcd,
-+ 0x5c, 0xef, 0xa3, 0x25, },
-+ { 0x2f, 0x3b, 0x1f, 0xb5, 0x91, 0x8f, 0x86, 0xe0, 0xdc, 0x31, 0x48, 0xb6,
-+ 0xa1, 0x8c, 0xfd, 0x75, 0xbb, 0x7d, 0x3d, 0xc1, 0xf0, 0x10, 0x9a, 0xd8,
-+ 0x4b, 0x0e, 0xe3, 0x94, 0x9f, },
-+ { 0x29, 0xbb, 0x8f, 0x6c, 0xd1, 0xf2, 0xb6, 0xaf, 0xe5, 0xe3, 0x2d, 0xdc,
-+ 0x6f, 0xa4, 0x53, 0x88, 0xd8, 0xcf, 0x4d, 0x45, 0x42, 0x62, 0xdb, 0xdf,
-+ 0xf8, 0x45, 0xc2, 0x13, 0xec, 0x35, },
-+ { 0x06, 0x3c, 0xe3, 0x2c, 0x15, 0xc6, 0x43, 0x03, 0x81, 0xfb, 0x08, 0x76,
-+ 0x33, 0xcb, 0x02, 0xc1, 0xba, 0x33, 0xe5, 0xe0, 0xd1, 0x92, 0xa8, 0x46,
-+ 0x28, 0x3f, 0x3e, 0x9d, 0x2c, 0x44, 0x54, },
-+ { 0xea, 0xbb, 0x96, 0xf8, 0xd1, 0x8b, 0x04, 0x11, 0x40, 0x78, 0x42, 0x02,
-+ 0x19, 0xd1, 0xbc, 0x65, 0x92, 0xd3, 0xc3, 0xd6, 0xd9, 0x19, 0xe7, 0xc3,
-+ 0x40, 0x97, 0xbd, 0xd4, 0xed, 0xfa, 0x5e, 0x28, },
-+ { 0x02, },
-+ { 0x52, 0xa8, },
-+ { 0x38, 0x25, 0x0d, },
-+ { 0xe3, 0x04, 0xd4, 0x92, },
-+ { 0x97, 0xdb, 0xf7, 0x81, 0xca, },
-+ { 0x8a, 0x56, 0x9d, 0x62, 0x56, 0xcc, },
-+ { 0xa1, 0x8e, 0x3c, 0x72, 0x8f, 0x63, 0x03, },
-+ { 0xf7, 0xf3, 0x39, 0x09, 0x0a, 0xa1, 0xbb, 0x23, },
-+ { 0x6b, 0x03, 0xc0, 0xe9, 0xd9, 0x83, 0x05, 0x22, 0x01, },
-+ { 0x1b, 0x4b, 0xf5, 0xd6, 0x4f, 0x05, 0x75, 0x91, 0x4c, 0x7f, },
-+ { 0x4c, 0x8c, 0x25, 0x20, 0x21, 0xcb, 0xc2, 0x4b, 0x3a, 0x5b, 0x8d, },
-+ { 0x56, 0xe2, 0x77, 0xa0, 0xb6, 0x9f, 0x81, 0xec, 0x83, 0x75, 0xc4, 0xf9, },
-+ { 0x71, 0x70, 0x0f, 0xad, 0x4d, 0x35, 0x81, 0x9d, 0x88, 0x69, 0xf9, 0xaa,
-+ 0xd3, },
-+ { 0x50, 0x6e, 0x86, 0x6e, 0x43, 0xc0, 0xc2, 0x44, 0xc2, 0xe2, 0xa0, 0x1c,
-+ 0xb7, 0x9a, },
-+ { 0xe4, 0x7e, 0x72, 0xc6, 0x12, 0x8e, 0x7c, 0xfc, 0xbd, 0xe2, 0x08, 0x31,
-+ 0x3d, 0x47, 0x3d, },
-+ { 0x08, 0x97, 0x5b, 0x80, 0xae, 0xc4, 0x1d, 0x50, 0x77, 0xdf, 0x1f, 0xd0,
-+ 0x24, 0xf0, 0x17, 0xc0, },
-+ { 0x01, 0xb6, 0x29, 0xf4, 0xaf, 0x78, 0x5f, 0xb6, 0x91, 0xdd, 0x76, 0x76,
-+ 0xd2, 0xfd, 0x0c, 0x47, 0x40, },
-+ { 0xa1, 0xd8, 0x09, 0x97, 0x7a, 0xa6, 0xc8, 0x94, 0xf6, 0x91, 0x7b, 0xae,
-+ 0x2b, 0x9f, 0x0d, 0x83, 0x48, 0xf7, },
-+ { 0x12, 0xd5, 0x53, 0x7d, 0x9a, 0xb0, 0xbe, 0xd9, 0xed, 0xe9, 0x9e, 0xee,
-+ 0x61, 0x5b, 0x42, 0xf2, 0xc0, 0x73, 0xc0, },
-+ { 0xd5, 0x77, 0xd6, 0x5c, 0x6e, 0xa5, 0x69, 0x2b, 0x3b, 0x8c, 0xd6, 0x7d,
-+ 0x1d, 0xbe, 0x2c, 0xa1, 0x02, 0x21, 0xcd, 0x29, },
-+ { 0xa4, 0x98, 0x80, 0xca, 0x22, 0xcf, 0x6a, 0xab, 0x5e, 0x40, 0x0d, 0x61,
-+ 0x08, 0x21, 0xef, 0xc0, 0x6c, 0x52, 0xb4, 0xb0, 0x53, },
-+ { 0xbf, 0xaf, 0x8f, 0x3b, 0x7a, 0x97, 0x33, 0xe5, 0xca, 0x07, 0x37, 0xfd,
-+ 0x15, 0xdf, 0xce, 0x26, 0x2a, 0xb1, 0xa7, 0x0b, 0xb3, 0xac, },
-+ { 0x16, 0x22, 0xe1, 0xbc, 0x99, 0x4e, 0x01, 0xf0, 0xfa, 0xff, 0x8f, 0xa5,
-+ 0x0c, 0x61, 0xb0, 0xad, 0xcc, 0xb1, 0xe1, 0x21, 0x46, 0xfa, 0x2e, },
-+ { 0x11, 0x5b, 0x0b, 0x2b, 0xe6, 0x14, 0xc1, 0xd5, 0x4d, 0x71, 0x5e, 0x17,
-+ 0xea, 0x23, 0xdd, 0x6c, 0xbd, 0x1d, 0xbe, 0x12, 0x1b, 0xee, 0x4c, 0x1a, },
-+ { 0x40, 0x88, 0x22, 0xf3, 0x20, 0x6c, 0xed, 0xe1, 0x36, 0x34, 0x62, 0x2c,
-+ 0x98, 0x83, 0x52, 0xe2, 0x25, 0xee, 0xe9, 0xf5, 0xe1, 0x17, 0xf0, 0x5c,
-+ 0xae, },
-+ { 0xc3, 0x76, 0x37, 0xde, 0x95, 0x8c, 0xca, 0x2b, 0x0c, 0x23, 0xe7, 0xb5,
-+ 0x38, 0x70, 0x61, 0xcc, 0xff, 0xd3, 0x95, 0x7b, 0xf3, 0xff, 0x1f, 0x9d,
-+ 0x59, 0x00, },
-+ { 0x0c, 0x19, 0x52, 0x05, 0x22, 0x53, 0xcb, 0x48, 0xd7, 0x10, 0x0e, 0x7e,
-+ 0x14, 0x69, 0xb5, 0xa2, 0x92, 0x43, 0xa3, 0x9e, 0x4b, 0x8f, 0x51, 0x2c,
-+ 0x5a, 0x2c, 0x3b, },
-+ { 0xe1, 0x9d, 0x70, 0x70, 0x28, 0xec, 0x86, 0x40, 0x55, 0x33, 0x56, 0xda,
-+ 0x88, 0xca, 0xee, 0xc8, 0x6a, 0x20, 0xb1, 0xe5, 0x3d, 0x57, 0xf8, 0x3c,
-+ 0x10, 0x07, 0x2a, 0xc4, },
-+ { 0x0b, 0xae, 0xf1, 0xc4, 0x79, 0xee, 0x1b, 0x3d, 0x27, 0x35, 0x8d, 0x14,
-+ 0xd6, 0xae, 0x4e, 0x3c, 0xe9, 0x53, 0x50, 0xb5, 0xcc, 0x0c, 0xf7, 0xdf,
-+ 0xee, 0xa1, 0x74, 0xd6, 0x71, },
-+ { 0xe6, 0xa4, 0xf4, 0x99, 0x98, 0xb9, 0x80, 0xea, 0x96, 0x7f, 0x4f, 0x33,
-+ 0xcf, 0x74, 0x25, 0x6f, 0x17, 0x6c, 0xbf, 0xf5, 0x5c, 0x38, 0xd0, 0xff,
-+ 0x96, 0xcb, 0x13, 0xf9, 0xdf, 0xfd, },
-+ { 0xbe, 0x92, 0xeb, 0xba, 0x44, 0x2c, 0x24, 0x74, 0xd4, 0x03, 0x27, 0x3c,
-+ 0x5d, 0x5b, 0x03, 0x30, 0x87, 0x63, 0x69, 0xe0, 0xb8, 0x94, 0xf4, 0x44,
-+ 0x7e, 0xad, 0xcd, 0x20, 0x12, 0x16, 0x79, },
-+ { 0x30, 0xf1, 0xc4, 0x8e, 0x05, 0x90, 0x2a, 0x97, 0x63, 0x94, 0x46, 0xff,
-+ 0xce, 0xd8, 0x67, 0xa7, 0xac, 0x33, 0x8c, 0x95, 0xb7, 0xcd, 0xa3, 0x23,
-+ 0x98, 0x9d, 0x76, 0x6c, 0x9d, 0xa8, 0xd6, 0x8a, },
-+ { 0xbe, },
-+ { 0x17, 0x6c, },
-+ { 0x1a, 0x42, 0x4f, },
-+ { 0xba, 0xaf, 0xb7, 0x65, },
-+ { 0xc2, 0x63, 0x43, 0x6a, 0xea, },
-+ { 0xe4, 0x4d, 0xad, 0xf2, 0x0b, 0x02, },
-+ { 0x04, 0xc7, 0xc4, 0x7f, 0xa9, 0x2b, 0xce, },
-+ { 0x66, 0xf6, 0x67, 0xcb, 0x03, 0x53, 0xc8, 0xf1, },
-+ { 0x56, 0xa3, 0x60, 0x78, 0xc9, 0x5f, 0x70, 0x1b, 0x5e, },
-+ { 0x99, 0xff, 0x81, 0x7c, 0x13, 0x3c, 0x29, 0x79, 0x4b, 0x65, },
-+ { 0x51, 0x10, 0x50, 0x93, 0x01, 0x93, 0xb7, 0x01, 0xc9, 0x18, 0xb7, },
-+ { 0x8e, 0x3c, 0x42, 0x1e, 0x5e, 0x7d, 0xc1, 0x50, 0x70, 0x1f, 0x00, 0x98, },
-+ { 0x5f, 0xd9, 0x9b, 0xc8, 0xd7, 0xb2, 0x72, 0x62, 0x1a, 0x1e, 0xba, 0x92,
-+ 0xe9, },
-+ { 0x70, 0x2b, 0xba, 0xfe, 0xad, 0x5d, 0x96, 0x3f, 0x27, 0xc2, 0x41, 0x6d,
-+ 0xc4, 0xb3, },
-+ { 0xae, 0xe0, 0xd5, 0xd4, 0xc7, 0xae, 0x15, 0x5e, 0xdc, 0xdd, 0x33, 0x60,
-+ 0xd7, 0xd3, 0x5e, },
-+ { 0x79, 0x8e, 0xbc, 0x9e, 0x20, 0xb9, 0x19, 0x4b, 0x63, 0x80, 0xf3, 0x16,
-+ 0xaf, 0x39, 0xbd, 0x92, },
-+ { 0xc2, 0x0e, 0x85, 0xa0, 0x0b, 0x9a, 0xb0, 0xec, 0xde, 0x38, 0xd3, 0x10,
-+ 0xd9, 0xa7, 0x66, 0x27, 0xcf, },
-+ { 0x0e, 0x3b, 0x75, 0x80, 0x67, 0x14, 0x0c, 0x02, 0x90, 0xd6, 0xb3, 0x02,
-+ 0x81, 0xf6, 0xa6, 0x87, 0xce, 0x58, },
-+ { 0x79, 0xb5, 0xe9, 0x5d, 0x52, 0x4d, 0xf7, 0x59, 0xf4, 0x2e, 0x27, 0xdd,
-+ 0xb3, 0xed, 0x57, 0x5b, 0x82, 0xea, 0x6f, },
-+ { 0xa2, 0x97, 0xf5, 0x80, 0x02, 0x3d, 0xde, 0xa3, 0xf9, 0xf6, 0xab, 0xe3,
-+ 0x57, 0x63, 0x7b, 0x9b, 0x10, 0x42, 0x6f, 0xf2, },
-+ { 0x12, 0x7a, 0xfc, 0xb7, 0x67, 0x06, 0x0c, 0x78, 0x1a, 0xfe, 0x88, 0x4f,
-+ 0xc6, 0xac, 0x52, 0x96, 0x64, 0x28, 0x97, 0x84, 0x06, },
-+ { 0xc5, 0x04, 0x44, 0x6b, 0xb2, 0xa5, 0xa4, 0x66, 0xe1, 0x76, 0xa2, 0x51,
-+ 0xf9, 0x59, 0x69, 0x97, 0x56, 0x0b, 0xbf, 0x50, 0xb3, 0x34, },
-+ { 0x21, 0x32, 0x6b, 0x42, 0xb5, 0xed, 0x71, 0x8d, 0xf7, 0x5a, 0x35, 0xe3,
-+ 0x90, 0xe2, 0xee, 0xaa, 0x89, 0xf6, 0xc9, 0x9c, 0x4d, 0x73, 0xf4, },
-+ { 0x4c, 0xa6, 0x09, 0xf4, 0x48, 0xe7, 0x46, 0xbc, 0x49, 0xfc, 0xe5, 0xda,
-+ 0xd1, 0x87, 0x13, 0x17, 0x4c, 0x59, 0x71, 0x26, 0x5b, 0x2c, 0x42, 0xb7, },
-+ { 0x13, 0x63, 0xf3, 0x40, 0x02, 0xe5, 0xa3, 0x3a, 0x5e, 0x8e, 0xf8, 0xb6,
-+ 0x8a, 0x49, 0x60, 0x76, 0x34, 0x72, 0x94, 0x73, 0xf6, 0xd9, 0x21, 0x6a,
-+ 0x26, },
-+ { 0xdf, 0x75, 0x16, 0x10, 0x1b, 0x5e, 0x81, 0xc3, 0xc8, 0xde, 0x34, 0x24,
-+ 0xb0, 0x98, 0xeb, 0x1b, 0x8f, 0xa1, 0x9b, 0x05, 0xee, 0xa5, 0xe9, 0x35,
-+ 0xf4, 0x1d, },
-+ { 0xcd, 0x21, 0x93, 0x6e, 0x5b, 0xa0, 0x26, 0x2b, 0x21, 0x0e, 0xa0, 0xb9,
-+ 0x1c, 0xb5, 0xbb, 0xb8, 0xf8, 0x1e, 0xff, 0x5c, 0xa8, 0xf9, 0x39, 0x46,
-+ 0x4e, 0x29, 0x26, },
-+ { 0x73, 0x7f, 0x0e, 0x3b, 0x0b, 0x5c, 0xf9, 0x60, 0xaa, 0x88, 0xa1, 0x09,
-+ 0xb1, 0x5d, 0x38, 0x7b, 0x86, 0x8f, 0x13, 0x7a, 0x8d, 0x72, 0x7a, 0x98,
-+ 0x1a, 0x5b, 0xff, 0xc9, },
-+ { 0xd3, 0x3c, 0x61, 0x71, 0x44, 0x7e, 0x31, 0x74, 0x98, 0x9d, 0x9a, 0xd2,
-+ 0x27, 0xf3, 0x46, 0x43, 0x42, 0x51, 0xd0, 0x5f, 0xe9, 0x1c, 0x5c, 0x69,
-+ 0xbf, 0xf6, 0xbe, 0x3c, 0x40, },
-+ { 0x31, 0x99, 0x31, 0x9f, 0xaa, 0x43, 0x2e, 0x77, 0x3e, 0x74, 0x26, 0x31,
-+ 0x5e, 0x61, 0xf1, 0x87, 0xe2, 0xeb, 0x9b, 0xcd, 0xd0, 0x3a, 0xee, 0x20,
-+ 0x7e, 0x10, 0x0a, 0x0b, 0x7e, 0xfa, },
-+ { 0xa4, 0x27, 0x80, 0x67, 0x81, 0x2a, 0xa7, 0x62, 0xf7, 0x6e, 0xda, 0xd4,
-+ 0x5c, 0x39, 0x74, 0xad, 0x7e, 0xbe, 0xad, 0xa5, 0x84, 0x7f, 0xa9, 0x30,
-+ 0x5d, 0xdb, 0xe2, 0x05, 0x43, 0xf7, 0x1b, },
-+ { 0x0b, 0x37, 0xd8, 0x02, 0xe1, 0x83, 0xd6, 0x80, 0xf2, 0x35, 0xc2, 0xb0,
-+ 0x37, 0xef, 0xef, 0x5e, 0x43, 0x93, 0xf0, 0x49, 0x45, 0x0a, 0xef, 0xb5,
-+ 0x76, 0x70, 0x12, 0x44, 0xc4, 0xdb, 0xf5, 0x7a, },
-+ { 0x1f, },
-+ { 0x82, 0x60, },
-+ { 0xcc, 0xe3, 0x08, },
-+ { 0x56, 0x17, 0xe4, 0x59, },
-+ { 0xe2, 0xd7, 0x9e, 0xc4, 0x4c, },
-+ { 0xb2, 0xad, 0xd3, 0x78, 0x58, 0x5a, },
-+ { 0xce, 0x43, 0xb4, 0x02, 0x96, 0xab, 0x3c, },
-+ { 0xe6, 0x05, 0x1a, 0x73, 0x22, 0x32, 0xbb, 0x77, },
-+ { 0x23, 0xe7, 0xda, 0xfe, 0x2c, 0xef, 0x8c, 0x22, 0xec, },
-+ { 0xe9, 0x8e, 0x55, 0x38, 0xd1, 0xd7, 0x35, 0x23, 0x98, 0xc7, },
-+ { 0xb5, 0x81, 0x1a, 0xe5, 0xb5, 0xa5, 0xd9, 0x4d, 0xca, 0x41, 0xe7, },
-+ { 0x41, 0x16, 0x16, 0x95, 0x8d, 0x9e, 0x0c, 0xea, 0x8c, 0x71, 0x9a, 0xc1, },
-+ { 0x7c, 0x33, 0xc0, 0xa4, 0x00, 0x62, 0xea, 0x60, 0x67, 0xe4, 0x20, 0xbc,
-+ 0x5b, },
-+ { 0xdb, 0xb1, 0xdc, 0xfd, 0x08, 0xc0, 0xde, 0x82, 0xd1, 0xde, 0x38, 0xc0,
-+ 0x90, 0x48, },
-+ { 0x37, 0x18, 0x2e, 0x0d, 0x61, 0xaa, 0x61, 0xd7, 0x86, 0x20, 0x16, 0x60,
-+ 0x04, 0xd9, 0xd5, },
-+ { 0xb0, 0xcf, 0x2c, 0x4c, 0x5e, 0x5b, 0x4f, 0x2a, 0x23, 0x25, 0x58, 0x47,
-+ 0xe5, 0x31, 0x06, 0x70, },
-+ { 0x91, 0xa0, 0xa3, 0x86, 0x4e, 0xe0, 0x72, 0x38, 0x06, 0x67, 0x59, 0x5c,
-+ 0x70, 0x25, 0xdb, 0x33, 0x27, },
-+ { 0x44, 0x58, 0x66, 0xb8, 0x58, 0xc7, 0x13, 0xed, 0x4c, 0xc0, 0xf4, 0x9a,
-+ 0x1e, 0x67, 0x75, 0x33, 0xb6, 0xb8, },
-+ { 0x7f, 0x98, 0x4a, 0x8e, 0x50, 0xa2, 0x5c, 0xcd, 0x59, 0xde, 0x72, 0xb3,
-+ 0x9d, 0xc3, 0x09, 0x8a, 0xab, 0x56, 0xf1, },
-+ { 0x80, 0x96, 0x49, 0x1a, 0x59, 0xa2, 0xc5, 0xd5, 0xa7, 0x20, 0x8a, 0xb7,
-+ 0x27, 0x62, 0x84, 0x43, 0xc6, 0xe1, 0x1b, 0x5d, },
-+ { 0x6b, 0xb7, 0x2b, 0x26, 0x62, 0x14, 0x70, 0x19, 0x3d, 0x4d, 0xac, 0xac,
-+ 0x63, 0x58, 0x5e, 0x94, 0xb5, 0xb7, 0xe8, 0xe8, 0xa2, },
-+ { 0x20, 0xa8, 0xc0, 0xfd, 0x63, 0x3d, 0x6e, 0x98, 0xcf, 0x0c, 0x49, 0x98,
-+ 0xe4, 0x5a, 0xfe, 0x8c, 0xaa, 0x70, 0x82, 0x1c, 0x7b, 0x74, },
-+ { 0xc8, 0xe8, 0xdd, 0xdf, 0x69, 0x30, 0x01, 0xc2, 0x0f, 0x7e, 0x2f, 0x11,
-+ 0xcc, 0x3e, 0x17, 0xa5, 0x69, 0x40, 0x3f, 0x0e, 0x79, 0x7f, 0xcf, },
-+ { 0xdb, 0x61, 0xc0, 0xe2, 0x2e, 0x49, 0x07, 0x31, 0x1d, 0x91, 0x42, 0x8a,
-+ 0xfc, 0x5e, 0xd3, 0xf8, 0x56, 0x1f, 0x2b, 0x73, 0xfd, 0x9f, 0xb2, 0x8e, },
-+ { 0x0c, 0x89, 0x55, 0x0c, 0x1f, 0x59, 0x2c, 0x9d, 0x1b, 0x29, 0x1d, 0x41,
-+ 0x1d, 0xe6, 0x47, 0x8f, 0x8c, 0x2b, 0xea, 0x8f, 0xf0, 0xff, 0x21, 0x70,
-+ 0x88, },
-+ { 0x12, 0x18, 0x95, 0xa6, 0x59, 0xb1, 0x31, 0x24, 0x45, 0x67, 0x55, 0xa4,
-+ 0x1a, 0x2d, 0x48, 0x67, 0x1b, 0x43, 0x88, 0x2d, 0x8e, 0xa0, 0x70, 0xb3,
-+ 0xc6, 0xbb, },
-+ { 0xe7, 0xb1, 0x1d, 0xb2, 0x76, 0x4d, 0x68, 0x68, 0x68, 0x23, 0x02, 0x55,
-+ 0x3a, 0xe2, 0xe5, 0xd5, 0x4b, 0x43, 0xf9, 0x34, 0x77, 0x5c, 0xa1, 0xf5,
-+ 0x55, 0xfd, 0x4f, },
-+ { 0x8c, 0x87, 0x5a, 0x08, 0x3a, 0x73, 0xad, 0x61, 0xe1, 0xe7, 0x99, 0x7e,
-+ 0xf0, 0x5d, 0xe9, 0x5d, 0x16, 0x43, 0x80, 0x2f, 0xd0, 0x66, 0x34, 0xe2,
-+ 0x42, 0x64, 0x3b, 0x1a, },
-+ { 0x39, 0xc1, 0x99, 0xcf, 0x22, 0xbf, 0x16, 0x8f, 0x9f, 0x80, 0x7f, 0x95,
-+ 0x0a, 0x05, 0x67, 0x27, 0xe7, 0x15, 0xdf, 0x9d, 0xb2, 0xfe, 0x1c, 0xb5,
-+ 0x1d, 0x60, 0x8f, 0x8a, 0x1d, },
-+ { 0x9b, 0x6e, 0x08, 0x09, 0x06, 0x73, 0xab, 0x68, 0x02, 0x62, 0x1a, 0xe4,
-+ 0xd4, 0xdf, 0xc7, 0x02, 0x4c, 0x6a, 0x5f, 0xfd, 0x23, 0xac, 0xae, 0x6d,
-+ 0x43, 0xa4, 0x7a, 0x50, 0x60, 0x3c, },
-+ { 0x1d, 0xb4, 0xc6, 0xe1, 0xb1, 0x4b, 0xe3, 0xf2, 0xe2, 0x1a, 0x73, 0x1b,
-+ 0xa0, 0x92, 0xa7, 0xf5, 0xff, 0x8f, 0x8b, 0x5d, 0xdf, 0xa8, 0x04, 0xb3,
-+ 0xb0, 0xf7, 0xcc, 0x12, 0xfa, 0x35, 0x46, },
-+ { 0x49, 0x45, 0x97, 0x11, 0x0f, 0x1c, 0x60, 0x8e, 0xe8, 0x47, 0x30, 0xcf,
-+ 0x60, 0xa8, 0x71, 0xc5, 0x1b, 0xe9, 0x39, 0x4d, 0x49, 0xb6, 0x12, 0x1f,
-+ 0x24, 0xab, 0x37, 0xff, 0x83, 0xc2, 0xe1, 0x3a, },
-+ { 0x60, },
-+ { 0x24, 0x26, },
-+ { 0x47, 0xeb, 0xc9, },
-+ { 0x4a, 0xd0, 0xbc, 0xf0, },
-+ { 0x8e, 0x2b, 0xc9, 0x85, 0x3c, },
-+ { 0xa2, 0x07, 0x15, 0xb8, 0x12, 0x74, },
-+ { 0x0f, 0xdb, 0x5b, 0x33, 0x69, 0xfe, 0x4b, },
-+ { 0xa2, 0x86, 0x54, 0xf4, 0xfd, 0xb2, 0xd4, 0xe6, },
-+ { 0xbb, 0x84, 0x78, 0x49, 0x27, 0x8e, 0x61, 0xda, 0x60, },
-+ { 0x04, 0xc3, 0xcd, 0xaa, 0x8f, 0xa7, 0x03, 0xc9, 0xf9, 0xb6, },
-+ { 0xf8, 0x27, 0x1d, 0x61, 0xdc, 0x21, 0x42, 0xdd, 0xad, 0x92, 0x40, },
-+ { 0x12, 0x87, 0xdf, 0xc2, 0x41, 0x45, 0x5a, 0x36, 0x48, 0x5b, 0x51, 0x2b, },
-+ { 0xbb, 0x37, 0x5d, 0x1f, 0xf1, 0x68, 0x7a, 0xc4, 0xa5, 0xd2, 0xa4, 0x91,
-+ 0x8d, },
-+ { 0x5b, 0x27, 0xd1, 0x04, 0x54, 0x52, 0x9f, 0xa3, 0x47, 0x86, 0x33, 0x33,
-+ 0xbf, 0xa0, },
-+ { 0xcf, 0x04, 0xea, 0xf8, 0x03, 0x2a, 0x43, 0xff, 0xa6, 0x68, 0x21, 0x4c,
-+ 0xd5, 0x4b, 0xed, },
-+ { 0xaf, 0xb8, 0xbc, 0x63, 0x0f, 0x18, 0x4d, 0xe2, 0x7a, 0xdd, 0x46, 0x44,
-+ 0xc8, 0x24, 0x0a, 0xb7, },
-+ { 0x3e, 0xdc, 0x36, 0xe4, 0x89, 0xb1, 0xfa, 0xc6, 0x40, 0x93, 0x2e, 0x75,
-+ 0xb2, 0x15, 0xd1, 0xb1, 0x10, },
-+ { 0x6c, 0xd8, 0x20, 0x3b, 0x82, 0x79, 0xf9, 0xc8, 0xbc, 0x9d, 0xe0, 0x35,
-+ 0xbe, 0x1b, 0x49, 0x1a, 0xbc, 0x3a, },
-+ { 0x78, 0x65, 0x2c, 0xbe, 0x35, 0x67, 0xdc, 0x78, 0xd4, 0x41, 0xf6, 0xc9,
-+ 0xde, 0xde, 0x1f, 0x18, 0x13, 0x31, 0x11, },
-+ { 0x8a, 0x7f, 0xb1, 0x33, 0x8f, 0x0c, 0x3c, 0x0a, 0x06, 0x61, 0xf0, 0x47,
-+ 0x29, 0x1b, 0x29, 0xbc, 0x1c, 0x47, 0xef, 0x7a, },
-+ { 0x65, 0x91, 0xf1, 0xe6, 0xb3, 0x96, 0xd3, 0x8c, 0xc2, 0x4a, 0x59, 0x35,
-+ 0x72, 0x8e, 0x0b, 0x9a, 0x87, 0xca, 0x34, 0x7b, 0x63, },
-+ { 0x5f, 0x08, 0x87, 0x80, 0x56, 0x25, 0x89, 0x77, 0x61, 0x8c, 0x64, 0xa1,
-+ 0x59, 0x6d, 0x59, 0x62, 0xe8, 0x4a, 0xc8, 0x58, 0x99, 0xd1, },
-+ { 0x23, 0x87, 0x1d, 0xed, 0x6f, 0xf2, 0x91, 0x90, 0xe2, 0xfe, 0x43, 0x21,
-+ 0xaf, 0x97, 0xc6, 0xbc, 0xd7, 0x15, 0xc7, 0x2d, 0x08, 0x77, 0x91, },
-+ { 0x90, 0x47, 0x9a, 0x9e, 0x3a, 0xdf, 0xf3, 0xc9, 0x4c, 0x1e, 0xa7, 0xd4,
-+ 0x6a, 0x32, 0x90, 0xfe, 0xb7, 0xb6, 0x7b, 0xfa, 0x96, 0x61, 0xfb, 0xa4, },
-+ { 0xb1, 0x67, 0x60, 0x45, 0xb0, 0x96, 0xc5, 0x15, 0x9f, 0x4d, 0x26, 0xd7,
-+ 0x9d, 0xf1, 0xf5, 0x6d, 0x21, 0x00, 0x94, 0x31, 0x64, 0x94, 0xd3, 0xa7,
-+ 0xd3, },
-+ { 0x02, 0x3e, 0xaf, 0xf3, 0x79, 0x73, 0xa5, 0xf5, 0xcc, 0x7a, 0x7f, 0xfb,
-+ 0x79, 0x2b, 0x85, 0x8c, 0x88, 0x72, 0x06, 0xbe, 0xfe, 0xaf, 0xc1, 0x16,
-+ 0xa6, 0xd6, },
-+ { 0x2a, 0xb0, 0x1a, 0xe5, 0xaa, 0x6e, 0xb3, 0xae, 0x53, 0x85, 0x33, 0x80,
-+ 0x75, 0xae, 0x30, 0xe6, 0xb8, 0x72, 0x42, 0xf6, 0x25, 0x4f, 0x38, 0x88,
-+ 0x55, 0xd1, 0xa9, },
-+ { 0x90, 0xd8, 0x0c, 0xc0, 0x93, 0x4b, 0x4f, 0x9e, 0x65, 0x6c, 0xa1, 0x54,
-+ 0xa6, 0xf6, 0x6e, 0xca, 0xd2, 0xbb, 0x7e, 0x6a, 0x1c, 0xd3, 0xce, 0x46,
-+ 0xef, 0xb0, 0x00, 0x8d, },
-+ { 0xed, 0x9c, 0x49, 0xcd, 0xc2, 0xde, 0x38, 0x0e, 0xe9, 0x98, 0x6c, 0xc8,
-+ 0x90, 0x9e, 0x3c, 0xd4, 0xd3, 0xeb, 0x88, 0x32, 0xc7, 0x28, 0xe3, 0x94,
-+ 0x1c, 0x9f, 0x8b, 0xf3, 0xcb, },
-+ { 0xac, 0xe7, 0x92, 0x16, 0xb4, 0x14, 0xa0, 0xe4, 0x04, 0x79, 0xa2, 0xf4,
-+ 0x31, 0xe6, 0x0c, 0x26, 0xdc, 0xbf, 0x2f, 0x69, 0x1b, 0x55, 0x94, 0x67,
-+ 0xda, 0x0c, 0xd7, 0x32, 0x1f, 0xef, },
-+ { 0x68, 0x63, 0x85, 0x57, 0x95, 0x9e, 0x42, 0x27, 0x41, 0x43, 0x42, 0x02,
-+ 0xa5, 0x78, 0xa7, 0xc6, 0x43, 0xc1, 0x6a, 0xba, 0x70, 0x80, 0xcd, 0x04,
-+ 0xb6, 0x78, 0x76, 0x29, 0xf3, 0xe8, 0xa0, },
-+ { 0xe6, 0xac, 0x8d, 0x9d, 0xf0, 0xc0, 0xf7, 0xf7, 0xe3, 0x3e, 0x4e, 0x28,
-+ 0x0f, 0x59, 0xb2, 0x67, 0x9e, 0x84, 0x34, 0x42, 0x96, 0x30, 0x2b, 0xca,
-+ 0x49, 0xb6, 0xc5, 0x9a, 0x84, 0x59, 0xa7, 0x81, },
-+ { 0x7e, },
-+ { 0x1e, 0x21, },
-+ { 0x26, 0xd3, 0xdd, },
-+ { 0x2c, 0xd4, 0xb3, 0x3d, },
-+ { 0x86, 0x7b, 0x76, 0x3c, 0xf0, },
-+ { 0x12, 0xc3, 0x70, 0x1d, 0x55, 0x18, },
-+ { 0x96, 0xc2, 0xbd, 0x61, 0x55, 0xf4, 0x24, },
-+ { 0x20, 0x51, 0xf7, 0x86, 0x58, 0x8f, 0x07, 0x2a, },
-+ { 0x93, 0x15, 0xa8, 0x1d, 0xda, 0x97, 0xee, 0x0e, 0x6c, },
-+ { 0x39, 0x93, 0xdf, 0xd5, 0x0e, 0xca, 0xdc, 0x7a, 0x92, 0xce, },
-+ { 0x60, 0xd5, 0xfd, 0xf5, 0x1b, 0x26, 0x82, 0x26, 0x73, 0x02, 0xbc, },
-+ { 0x98, 0xf2, 0x34, 0xe1, 0xf5, 0xfb, 0x00, 0xac, 0x10, 0x4a, 0x38, 0x9f, },
-+ { 0xda, 0x3a, 0x92, 0x8a, 0xd0, 0xcd, 0x12, 0xcd, 0x15, 0xbb, 0xab, 0x77,
-+ 0x66, },
-+ { 0xa2, 0x92, 0x1a, 0xe5, 0xca, 0x0c, 0x30, 0x75, 0xeb, 0xaf, 0x00, 0x31,
-+ 0x55, 0x66, },
-+ { 0x06, 0xea, 0xfd, 0x3e, 0x86, 0x38, 0x62, 0x4e, 0xa9, 0x12, 0xa4, 0x12,
-+ 0x43, 0xbf, 0xa1, },
-+ { 0xe4, 0x71, 0x7b, 0x94, 0xdb, 0xa0, 0xd2, 0xff, 0x9b, 0xeb, 0xad, 0x8e,
-+ 0x95, 0x8a, 0xc5, 0xed, },
-+ { 0x25, 0x5a, 0x77, 0x71, 0x41, 0x0e, 0x7a, 0xe9, 0xed, 0x0c, 0x10, 0xef,
-+ 0xf6, 0x2b, 0x3a, 0xba, 0x60, },
-+ { 0xee, 0xe2, 0xa3, 0x67, 0x64, 0x1d, 0xc6, 0x04, 0xc4, 0xe1, 0x68, 0xd2,
-+ 0x6e, 0xd2, 0x91, 0x75, 0x53, 0x07, },
-+ { 0xe0, 0xf6, 0x4d, 0x8f, 0x68, 0xfc, 0x06, 0x7e, 0x18, 0x79, 0x7f, 0x2b,
-+ 0x6d, 0xef, 0x46, 0x7f, 0xab, 0xb2, 0xad, },
-+ { 0x3d, 0x35, 0x88, 0x9f, 0x2e, 0xcf, 0x96, 0x45, 0x07, 0x60, 0x71, 0x94,
-+ 0x00, 0x8d, 0xbf, 0xf4, 0xef, 0x46, 0x2e, 0x3c, },
-+ { 0x43, 0xcf, 0x98, 0xf7, 0x2d, 0xf4, 0x17, 0xe7, 0x8c, 0x05, 0x2d, 0x9b,
-+ 0x24, 0xfb, 0x4d, 0xea, 0x4a, 0xec, 0x01, 0x25, 0x29, },
-+ { 0x8e, 0x73, 0x9a, 0x78, 0x11, 0xfe, 0x48, 0xa0, 0x3b, 0x1a, 0x26, 0xdf,
-+ 0x25, 0xe9, 0x59, 0x1c, 0x70, 0x07, 0x9f, 0xdc, 0xa0, 0xa6, },
-+ { 0xe8, 0x47, 0x71, 0xc7, 0x3e, 0xdf, 0xb5, 0x13, 0xb9, 0x85, 0x13, 0xa8,
-+ 0x54, 0x47, 0x6e, 0x59, 0x96, 0x09, 0x13, 0x5f, 0x82, 0x16, 0x0b, },
-+ { 0xfb, 0xc0, 0x8c, 0x03, 0x21, 0xb3, 0xc4, 0xb5, 0x43, 0x32, 0x6c, 0xea,
-+ 0x7f, 0xa8, 0x43, 0x91, 0xe8, 0x4e, 0x3f, 0xbf, 0x45, 0x58, 0x6a, 0xa3, },
-+ { 0x55, 0xf8, 0xf3, 0x00, 0x76, 0x09, 0xef, 0x69, 0x5d, 0xd2, 0x8a, 0xf2,
-+ 0x65, 0xc3, 0xcb, 0x9b, 0x43, 0xfd, 0xb1, 0x7e, 0x7f, 0xa1, 0x94, 0xb0,
-+ 0xd7, },
-+ { 0xaa, 0x13, 0xc1, 0x51, 0x40, 0x6d, 0x8d, 0x4c, 0x0a, 0x95, 0x64, 0x7b,
-+ 0xd1, 0x96, 0xb6, 0x56, 0xb4, 0x5b, 0xcf, 0xd6, 0xd9, 0x15, 0x97, 0xdd,
-+ 0xb6, 0xef, },
-+ { 0xaf, 0xb7, 0x36, 0xb0, 0x04, 0xdb, 0xd7, 0x9c, 0x9a, 0x44, 0xc4, 0xf6,
-+ 0x1f, 0x12, 0x21, 0x2d, 0x59, 0x30, 0x54, 0xab, 0x27, 0x61, 0xa3, 0x57,
-+ 0xef, 0xf8, 0x53, },
-+ { 0x97, 0x34, 0x45, 0x3e, 0xce, 0x7c, 0x35, 0xa2, 0xda, 0x9f, 0x4b, 0x46,
-+ 0x6c, 0x11, 0x67, 0xff, 0x2f, 0x76, 0x58, 0x15, 0x71, 0xfa, 0x44, 0x89,
-+ 0x89, 0xfd, 0xf7, 0x99, },
-+ { 0x1f, 0xb1, 0x62, 0xeb, 0x83, 0xc5, 0x9c, 0x89, 0xf9, 0x2c, 0xd2, 0x03,
-+ 0x61, 0xbc, 0xbb, 0xa5, 0x74, 0x0e, 0x9b, 0x7e, 0x82, 0x3e, 0x70, 0x0a,
-+ 0xa9, 0x8f, 0x2b, 0x59, 0xfb, },
-+ { 0xf8, 0xca, 0x5e, 0x3a, 0x4f, 0x9e, 0x10, 0x69, 0x10, 0xd5, 0x4c, 0xeb,
-+ 0x1a, 0x0f, 0x3c, 0x6a, 0x98, 0xf5, 0xb0, 0x97, 0x5b, 0x37, 0x2f, 0x0d,
-+ 0xbd, 0x42, 0x4b, 0x69, 0xa1, 0x82, },
-+ { 0x12, 0x8c, 0x6d, 0x52, 0x08, 0xef, 0x74, 0xb2, 0xe6, 0xaa, 0xd3, 0xb0,
-+ 0x26, 0xb0, 0xd9, 0x94, 0xb6, 0x11, 0x45, 0x0e, 0x36, 0x71, 0x14, 0x2d,
-+ 0x41, 0x8c, 0x21, 0x53, 0x31, 0xe9, 0x68, },
-+ { 0xee, 0xea, 0x0d, 0x89, 0x47, 0x7e, 0x72, 0xd1, 0xd8, 0xce, 0x58, 0x4c,
-+ 0x94, 0x1f, 0x0d, 0x51, 0x08, 0xa3, 0xb6, 0x3d, 0xe7, 0x82, 0x46, 0x92,
-+ 0xd6, 0x98, 0x6b, 0x07, 0x10, 0x65, 0x52, 0x65, },
-+};
-+
-+static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
-+ { 0xce, 0xe1, 0x57, 0x69, 0x82, 0xdc, 0xbf, 0x43, 0xad, 0x56, 0x4c, 0x70,
-+ 0xed, 0x68, 0x16, 0x96, 0xcf, 0xa4, 0x73, 0xe8, 0xe8, 0xfc, 0x32, 0x79,
-+ 0x08, 0x0a, 0x75, 0x82, 0xda, 0x3f, 0x05, 0x11, },
-+ { 0x77, 0x2f, 0x0c, 0x71, 0x41, 0xf4, 0x4b, 0x2b, 0xb3, 0xc6, 0xb6, 0xf9,
-+ 0x60, 0xde, 0xe4, 0x52, 0x38, 0x66, 0xe8, 0xbf, 0x9b, 0x96, 0xc4, 0x9f,
-+ 0x60, 0xd9, 0x24, 0x37, 0x99, 0xd6, 0xec, 0x31, },
-+};
-+
-+bool __init blake2s_selftest(void)
-+{
-+ u8 key[BLAKE2S_KEY_SIZE];
-+ u8 buf[ARRAY_SIZE(blake2s_testvecs)];
-+ u8 hash[BLAKE2S_HASH_SIZE];
-+ struct blake2s_state state;
-+ bool success = true;
-+ int i, l;
-+
-+ key[0] = key[1] = 1;
-+ for (i = 2; i < sizeof(key); ++i)
-+ key[i] = key[i - 2] + key[i - 1];
-+
-+ for (i = 0; i < sizeof(buf); ++i)
-+ buf[i] = (u8)i;
-+
-+ for (i = l = 0; i < ARRAY_SIZE(blake2s_testvecs); l = (l + 37) % ++i) {
-+ int outlen = 1 + i % BLAKE2S_HASH_SIZE;
-+ int keylen = (13 * i) % (BLAKE2S_KEY_SIZE + 1);
-+
-+ blake2s(hash, buf, key + BLAKE2S_KEY_SIZE - keylen, outlen, i,
-+ keylen);
-+ if (memcmp(hash, blake2s_testvecs[i], outlen)) {
-+ pr_err("blake2s self-test %d: FAIL\n", i + 1);
-+ success = false;
-+ }
-+
-+ if (!keylen)
-+ blake2s_init(&state, outlen);
-+ else
-+ blake2s_init_key(&state, outlen,
-+ key + BLAKE2S_KEY_SIZE - keylen,
-+ keylen);
-+
-+ blake2s_update(&state, buf, l);
-+ blake2s_update(&state, buf + l, i - l);
-+ blake2s_final(&state, hash);
-+ if (memcmp(hash, blake2s_testvecs[i], outlen)) {
-+ pr_err("blake2s init/update/final self-test %d: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+
-+ if (success) {
-+ blake2s256_hmac(hash, buf, key, sizeof(buf), sizeof(key));
-+ success &= !memcmp(hash, blake2s_hmac_testvecs[0], BLAKE2S_HASH_SIZE);
-+
-+ blake2s256_hmac(hash, key, buf, sizeof(key), sizeof(buf));
-+ success &= !memcmp(hash, blake2s_hmac_testvecs[1], BLAKE2S_HASH_SIZE);
-+
-+ if (!success)
-+ pr_err("blake2s256_hmac self-test: FAIL\n");
-+ }
-+
-+ return success;
-+}
---- /dev/null
-+++ b/lib/crypto/blake2s.c
-@@ -0,0 +1,126 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is an implementation of the BLAKE2s hash and PRF functions.
-+ *
-+ * Information: https://blake2.net/
-+ *
-+ */
-+
-+#include <crypto/internal/blake2s.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/bug.h>
-+#include <asm/unaligned.h>
-+
-+bool blake2s_selftest(void);
-+
-+void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
-+{
-+ const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-+
-+ if (unlikely(!inlen))
-+ return;
-+ if (inlen > fill) {
-+ memcpy(state->buf + state->buflen, in, fill);
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-+ blake2s_compress_arch(state, state->buf, 1,
-+ BLAKE2S_BLOCK_SIZE);
-+ else
-+ blake2s_compress_generic(state, state->buf, 1,
-+ BLAKE2S_BLOCK_SIZE);
-+ state->buflen = 0;
-+ in += fill;
-+ inlen -= fill;
-+ }
-+ if (inlen > BLAKE2S_BLOCK_SIZE) {
-+ const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-+ /* Hash one less (full) block than strictly possible */
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-+ blake2s_compress_arch(state, in, nblocks - 1,
-+ BLAKE2S_BLOCK_SIZE);
-+ else
-+ blake2s_compress_generic(state, in, nblocks - 1,
-+ BLAKE2S_BLOCK_SIZE);
-+ in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ }
-+ memcpy(state->buf + state->buflen, in, inlen);
-+ state->buflen += inlen;
-+}
-+EXPORT_SYMBOL(blake2s_update);
-+
-+void blake2s_final(struct blake2s_state *state, u8 *out)
-+{
-+ WARN_ON(IS_ENABLED(DEBUG) && !out);
-+ blake2s_set_lastblock(state);
-+ memset(state->buf + state->buflen, 0,
-+ BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S))
-+ blake2s_compress_arch(state, state->buf, 1, state->buflen);
-+ else
-+ blake2s_compress_generic(state, state->buf, 1, state->buflen);
-+ cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-+ memcpy(out, state->h, state->outlen);
-+ memzero_explicit(state, sizeof(*state));
-+}
-+EXPORT_SYMBOL(blake2s_final);
-+
-+void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
-+ const size_t keylen)
-+{
-+ struct blake2s_state state;
-+ u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 };
-+ u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32));
-+ int i;
-+
-+ if (keylen > BLAKE2S_BLOCK_SIZE) {
-+ blake2s_init(&state, BLAKE2S_HASH_SIZE);
-+ blake2s_update(&state, key, keylen);
-+ blake2s_final(&state, x_key);
-+ } else
-+ memcpy(x_key, key, keylen);
-+
-+ for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
-+ x_key[i] ^= 0x36;
-+
-+ blake2s_init(&state, BLAKE2S_HASH_SIZE);
-+ blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
-+ blake2s_update(&state, in, inlen);
-+ blake2s_final(&state, i_hash);
-+
-+ for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
-+ x_key[i] ^= 0x5c ^ 0x36;
-+
-+ blake2s_init(&state, BLAKE2S_HASH_SIZE);
-+ blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
-+ blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE);
-+ blake2s_final(&state, i_hash);
-+
-+ memcpy(out, i_hash, BLAKE2S_HASH_SIZE);
-+ memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE);
-+ memzero_explicit(i_hash, BLAKE2S_HASH_SIZE);
-+}
-+EXPORT_SYMBOL(blake2s256_hmac);
-+
-+static int __init mod_init(void)
-+{
-+ if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
-+ WARN_ON(!blake2s_selftest()))
-+ return -ENODEV;
-+ return 0;
-+}
-+
-+static void __exit mod_exit(void)
-+{
-+}
-+
-+module_init(mod_init);
-+module_exit(mod_exit);
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("BLAKE2s hash function");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0022-crypto-testmgr-add-test-cases-for-Blake2s.patch b/target/linux/generic/backport-5.4/080-wireguard-0022-crypto-testmgr-add-test-cases-for-Blake2s.patch
deleted file mode 100644
index 9adc75eb98..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0022-crypto-testmgr-add-test-cases-for-Blake2s.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:29 +0100
-Subject: [PATCH] crypto: testmgr - add test cases for Blake2s
-
-commit 17e1df67023a5c9ccaeb5de8bf5b88f63127ecf7 upstream.
-
-As suggested by Eric for the Blake2b implementation contributed by
-David, introduce a set of test vectors for Blake2s covering different
-digest and key sizes.
-
- blake2s-128 blake2s-160 blake2s-224 blake2s-256
- ---------------------------------------------------
-len=0 | klen=0 klen=1 klen=16 klen=32
-len=1 | klen=16 klen=32 klen=0 klen=1
-len=7 | klen=32 klen=0 klen=1 klen=16
-len=15 | klen=1 klen=16 klen=32 klen=0
-len=64 | klen=0 klen=1 klen=16 klen=32
-len=247 | klen=16 klen=32 klen=0 klen=1
-len=256 | klen=32 klen=0 klen=1 klen=16
-
-Cc: David Sterba <dsterba@suse.com>
-Cc: Eric Biggers <ebiggers@google.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/testmgr.c | 24 +++++
- crypto/testmgr.h | 251 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 275 insertions(+)
-
---- a/crypto/testmgr.c
-+++ b/crypto/testmgr.c
-@@ -4035,6 +4035,30 @@ static const struct alg_test_desc alg_te
- .test = alg_test_null,
- .fips_allowed = 1,
- }, {
-+ .alg = "blake2s-128",
-+ .test = alg_test_hash,
-+ .suite = {
-+ .hash = __VECS(blakes2s_128_tv_template)
-+ }
-+ }, {
-+ .alg = "blake2s-160",
-+ .test = alg_test_hash,
-+ .suite = {
-+ .hash = __VECS(blakes2s_160_tv_template)
-+ }
-+ }, {
-+ .alg = "blake2s-224",
-+ .test = alg_test_hash,
-+ .suite = {
-+ .hash = __VECS(blakes2s_224_tv_template)
-+ }
-+ }, {
-+ .alg = "blake2s-256",
-+ .test = alg_test_hash,
-+ .suite = {
-+ .hash = __VECS(blakes2s_256_tv_template)
-+ }
-+ }, {
- .alg = "cbc(aes)",
- .test = alg_test_skcipher,
- .fips_allowed = 1,
---- a/crypto/testmgr.h
-+++ b/crypto/testmgr.h
-@@ -31567,4 +31567,255 @@ static const struct aead_testvec essiv_h
- },
- };
-
-+static const char blake2_ordered_sequence[] =
-+ "\x00\x01\x02\x03\x04\x05\x06\x07"
-+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-+ "\x10\x11\x12\x13\x14\x15\x16\x17"
-+ "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
-+ "\x20\x21\x22\x23\x24\x25\x26\x27"
-+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
-+ "\x30\x31\x32\x33\x34\x35\x36\x37"
-+ "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
-+ "\x40\x41\x42\x43\x44\x45\x46\x47"
-+ "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
-+ "\x50\x51\x52\x53\x54\x55\x56\x57"
-+ "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
-+ "\x60\x61\x62\x63\x64\x65\x66\x67"
-+ "\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
-+ "\x70\x71\x72\x73\x74\x75\x76\x77"
-+ "\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
-+ "\x80\x81\x82\x83\x84\x85\x86\x87"
-+ "\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
-+ "\x90\x91\x92\x93\x94\x95\x96\x97"
-+ "\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
-+ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
-+ "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
-+ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
-+ "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
-+ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
-+ "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
-+ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
-+ "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
-+ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7"
-+ "\xe8\xe9\xea\xeb\xec\xed\xee\xef"
-+ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
-+ "\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
-+
-+static const struct hash_testvec blakes2s_128_tv_template[] = {{
-+ .digest = (u8[]){ 0x64, 0x55, 0x0d, 0x6f, 0xfe, 0x2c, 0x0a, 0x01,
-+ 0xa1, 0x4a, 0xba, 0x1e, 0xad, 0xe0, 0x20, 0x0c, },
-+}, {
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 64,
-+ .digest = (u8[]){ 0xdc, 0x66, 0xca, 0x8f, 0x03, 0x86, 0x58, 0x01,
-+ 0xb0, 0xff, 0xe0, 0x6e, 0xd8, 0xa1, 0xa9, 0x0e, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 1,
-+ .digest = (u8[]){ 0x88, 0x1e, 0x42, 0xe7, 0xbb, 0x35, 0x80, 0x82,
-+ 0x63, 0x7c, 0x0a, 0x0f, 0xd7, 0xec, 0x6c, 0x2f, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 7,
-+ .digest = (u8[]){ 0xcf, 0x9e, 0x07, 0x2a, 0xd5, 0x22, 0xf2, 0xcd,
-+ 0xa2, 0xd8, 0x25, 0x21, 0x80, 0x86, 0x73, 0x1c, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 15,
-+ .digest = (u8[]){ 0xf6, 0x33, 0x5a, 0x2c, 0x22, 0xa0, 0x64, 0xb2,
-+ 0xb6, 0x3f, 0xeb, 0xbc, 0xd1, 0xc3, 0xe5, 0xb2, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 247,
-+ .digest = (u8[]){ 0x72, 0x66, 0x49, 0x60, 0xf9, 0x4a, 0xea, 0xbe,
-+ 0x1f, 0xf4, 0x60, 0xce, 0xb7, 0x81, 0xcb, 0x09, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 256,
-+ .digest = (u8[]){ 0xd5, 0xa4, 0x0e, 0xc3, 0x16, 0xc7, 0x51, 0xa6,
-+ 0x3c, 0xd0, 0xd9, 0x11, 0x57, 0xfa, 0x1e, 0xbb, },
-+}};
-+
-+static const struct hash_testvec blakes2s_160_tv_template[] = {{
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 7,
-+ .digest = (u8[]){ 0xb4, 0xf2, 0x03, 0x49, 0x37, 0xed, 0xb1, 0x3e,
-+ 0x5b, 0x2a, 0xca, 0x64, 0x82, 0x74, 0xf6, 0x62,
-+ 0xe3, 0xf2, 0x84, 0xff, },
-+}, {
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 256,
-+ .digest = (u8[]){ 0xaa, 0x56, 0x9b, 0xdc, 0x98, 0x17, 0x75, 0xf2,
-+ 0xb3, 0x68, 0x83, 0xb7, 0x9b, 0x8d, 0x48, 0xb1,
-+ 0x9b, 0x2d, 0x35, 0x05, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .digest = (u8[]){ 0x50, 0x16, 0xe7, 0x0c, 0x01, 0xd0, 0xd3, 0xc3,
-+ 0xf4, 0x3e, 0xb1, 0x6e, 0x97, 0xa9, 0x4e, 0xd1,
-+ 0x79, 0x65, 0x32, 0x93, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 1,
-+ .digest = (u8[]){ 0x1c, 0x2b, 0xcd, 0x9a, 0x68, 0xca, 0x8c, 0x71,
-+ 0x90, 0x29, 0x6c, 0x54, 0xfa, 0x56, 0x4a, 0xef,
-+ 0xa2, 0x3a, 0x56, 0x9c, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 15,
-+ .digest = (u8[]){ 0x36, 0xc3, 0x5f, 0x9a, 0xdc, 0x7e, 0xbf, 0x19,
-+ 0x68, 0xaa, 0xca, 0xd8, 0x81, 0xbf, 0x09, 0x34,
-+ 0x83, 0x39, 0x0f, 0x30, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 64,
-+ .digest = (u8[]){ 0x86, 0x80, 0x78, 0xa4, 0x14, 0xec, 0x03, 0xe5,
-+ 0xb6, 0x9a, 0x52, 0x0e, 0x42, 0xee, 0x39, 0x9d,
-+ 0xac, 0xa6, 0x81, 0x63, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 247,
-+ .digest = (u8[]){ 0x2d, 0xd8, 0xd2, 0x53, 0x66, 0xfa, 0xa9, 0x01,
-+ 0x1c, 0x9c, 0xaf, 0xa3, 0xe2, 0x9d, 0x9b, 0x10,
-+ 0x0a, 0xf6, 0x73, 0xe8, },
-+}};
-+
-+static const struct hash_testvec blakes2s_224_tv_template[] = {{
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 1,
-+ .digest = (u8[]){ 0x61, 0xb9, 0x4e, 0xc9, 0x46, 0x22, 0xa3, 0x91,
-+ 0xd2, 0xae, 0x42, 0xe6, 0x45, 0x6c, 0x90, 0x12,
-+ 0xd5, 0x80, 0x07, 0x97, 0xb8, 0x86, 0x5a, 0xfc,
-+ 0x48, 0x21, 0x97, 0xbb, },
-+}, {
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 247,
-+ .digest = (u8[]){ 0x9e, 0xda, 0xc7, 0x20, 0x2c, 0xd8, 0x48, 0x2e,
-+ 0x31, 0x94, 0xab, 0x46, 0x6d, 0x94, 0xd8, 0xb4,
-+ 0x69, 0xcd, 0xae, 0x19, 0x6d, 0x9e, 0x41, 0xcc,
-+ 0x2b, 0xa4, 0xd5, 0xf6, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .digest = (u8[]){ 0x32, 0xc0, 0xac, 0xf4, 0x3b, 0xd3, 0x07, 0x9f,
-+ 0xbe, 0xfb, 0xfa, 0x4d, 0x6b, 0x4e, 0x56, 0xb3,
-+ 0xaa, 0xd3, 0x27, 0xf6, 0x14, 0xbf, 0xb9, 0x32,
-+ 0xa7, 0x19, 0xfc, 0xb8, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 7,
-+ .digest = (u8[]){ 0x73, 0xad, 0x5e, 0x6d, 0xb9, 0x02, 0x8e, 0x76,
-+ 0xf2, 0x66, 0x42, 0x4b, 0x4c, 0xfa, 0x1f, 0xe6,
-+ 0x2e, 0x56, 0x40, 0xe5, 0xa2, 0xb0, 0x3c, 0xe8,
-+ 0x7b, 0x45, 0xfe, 0x05, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 15,
-+ .digest = (u8[]){ 0x16, 0x60, 0xfb, 0x92, 0x54, 0xb3, 0x6e, 0x36,
-+ 0x81, 0xf4, 0x16, 0x41, 0xc3, 0x3d, 0xd3, 0x43,
-+ 0x84, 0xed, 0x10, 0x6f, 0x65, 0x80, 0x7a, 0x3e,
-+ 0x25, 0xab, 0xc5, 0x02, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 64,
-+ .digest = (u8[]){ 0xca, 0xaa, 0x39, 0x67, 0x9c, 0xf7, 0x6b, 0xc7,
-+ 0xb6, 0x82, 0xca, 0x0e, 0x65, 0x36, 0x5b, 0x7c,
-+ 0x24, 0x00, 0xfa, 0x5f, 0xda, 0x06, 0x91, 0x93,
-+ 0x6a, 0x31, 0x83, 0xb5, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 256,
-+ .digest = (u8[]){ 0x90, 0x02, 0x26, 0xb5, 0x06, 0x9c, 0x36, 0x86,
-+ 0x94, 0x91, 0x90, 0x1e, 0x7d, 0x2a, 0x71, 0xb2,
-+ 0x48, 0xb5, 0xe8, 0x16, 0xfd, 0x64, 0x33, 0x45,
-+ 0xb3, 0xd7, 0xec, 0xcc, },
-+}};
-+
-+static const struct hash_testvec blakes2s_256_tv_template[] = {{
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 15,
-+ .digest = (u8[]){ 0xd9, 0x7c, 0x82, 0x8d, 0x81, 0x82, 0xa7, 0x21,
-+ 0x80, 0xa0, 0x6a, 0x78, 0x26, 0x83, 0x30, 0x67,
-+ 0x3f, 0x7c, 0x4e, 0x06, 0x35, 0x94, 0x7c, 0x04,
-+ 0xc0, 0x23, 0x23, 0xfd, 0x45, 0xc0, 0xa5, 0x2d, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .digest = (u8[]){ 0x48, 0xa8, 0x99, 0x7d, 0xa4, 0x07, 0x87, 0x6b,
-+ 0x3d, 0x79, 0xc0, 0xd9, 0x23, 0x25, 0xad, 0x3b,
-+ 0x89, 0xcb, 0xb7, 0x54, 0xd8, 0x6a, 0xb7, 0x1a,
-+ 0xee, 0x04, 0x7a, 0xd3, 0x45, 0xfd, 0x2c, 0x49, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 1,
-+ .digest = (u8[]){ 0x22, 0x27, 0xae, 0xaa, 0x6e, 0x81, 0x56, 0x03,
-+ 0xa7, 0xe3, 0xa1, 0x18, 0xa5, 0x9a, 0x2c, 0x18,
-+ 0xf4, 0x63, 0xbc, 0x16, 0x70, 0xf1, 0xe7, 0x4b,
-+ 0x00, 0x6d, 0x66, 0x16, 0xae, 0x9e, 0x74, 0x4e, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 7,
-+ .digest = (u8[]){ 0x58, 0x5d, 0xa8, 0x60, 0x1c, 0xa4, 0xd8, 0x03,
-+ 0x86, 0x86, 0x84, 0x64, 0xd7, 0xa0, 0x8e, 0x15,
-+ 0x2f, 0x05, 0xa2, 0x1b, 0xbc, 0xef, 0x7a, 0x34,
-+ 0xb3, 0xc5, 0xbc, 0x4b, 0xf0, 0x32, 0xeb, 0x12, },
-+}, {
-+ .ksize = 32,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 64,
-+ .digest = (u8[]){ 0x89, 0x75, 0xb0, 0x57, 0x7f, 0xd3, 0x55, 0x66,
-+ 0xd7, 0x50, 0xb3, 0x62, 0xb0, 0x89, 0x7a, 0x26,
-+ 0xc3, 0x99, 0x13, 0x6d, 0xf0, 0x7b, 0xab, 0xab,
-+ 0xbd, 0xe6, 0x20, 0x3f, 0xf2, 0x95, 0x4e, 0xd4, },
-+}, {
-+ .ksize = 1,
-+ .key = "B",
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 247,
-+ .digest = (u8[]){ 0x2e, 0x74, 0x1c, 0x1d, 0x03, 0xf4, 0x9d, 0x84,
-+ 0x6f, 0xfc, 0x86, 0x32, 0x92, 0x49, 0x7e, 0x66,
-+ 0xd7, 0xc3, 0x10, 0x88, 0xfe, 0x28, 0xb3, 0xe0,
-+ 0xbf, 0x50, 0x75, 0xad, 0x8e, 0xa4, 0xe6, 0xb2, },
-+}, {
-+ .ksize = 16,
-+ .key = blake2_ordered_sequence,
-+ .plaintext = blake2_ordered_sequence,
-+ .psize = 256,
-+ .digest = (u8[]){ 0xb9, 0xd2, 0x81, 0x0e, 0x3a, 0xb1, 0x62, 0x9b,
-+ 0xad, 0x44, 0x05, 0xf4, 0x92, 0x2e, 0x99, 0xc1,
-+ 0x4a, 0x47, 0xbb, 0x5b, 0x6f, 0xb2, 0x96, 0xed,
-+ 0xd5, 0x06, 0xb5, 0x3a, 0x7c, 0x7a, 0x65, 0x1d, },
-+}};
-+
- #endif /* _CRYPTO_TESTMGR_H */
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0023-crypto-blake2s-implement-generic-shash-driver.patch b/target/linux/generic/backport-5.4/080-wireguard-0023-crypto-blake2s-implement-generic-shash-driver.patch
deleted file mode 100644
index e25edf5dda..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0023-crypto-blake2s-implement-generic-shash-driver.patch
+++ /dev/null
@@ -1,245 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:30 +0100
-Subject: [PATCH] crypto: blake2s - implement generic shash driver
-
-commit 7f9b0880925f1f9d7d59504ea0892d2ae9cfc233 upstream.
-
-Wire up our newly added Blake2s implementation via the shash API.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/Kconfig | 18 ++++
- crypto/Makefile | 1 +
- crypto/blake2s_generic.c | 171 ++++++++++++++++++++++++++++++
- include/crypto/internal/blake2s.h | 5 +
- 4 files changed, 195 insertions(+)
- create mode 100644 crypto/blake2s_generic.c
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -639,6 +639,24 @@ config CRYPTO_XXHASH
- xxHash non-cryptographic hash algorithm. Extremely fast, working at
- speeds close to RAM limits.
-
-+config CRYPTO_BLAKE2S
-+ tristate "BLAKE2s digest algorithm"
-+ select CRYPTO_LIB_BLAKE2S_GENERIC
-+ select CRYPTO_HASH
-+ help
-+ Implementation of cryptographic hash function BLAKE2s
-+ optimized for 8-32bit platforms and can produce digests of any size
-+ between 1 to 32. The keyed hash is also implemented.
-+
-+ This module provides the following algorithms:
-+
-+ - blake2s-128
-+ - blake2s-160
-+ - blake2s-224
-+ - blake2s-256
-+
-+ See https://blake2.net for further information.
-+
- config CRYPTO_CRCT10DIF
- tristate "CRCT10DIF algorithm"
- select CRYPTO_HASH
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -74,6 +74,7 @@ obj-$(CONFIG_CRYPTO_STREEBOG) += streebo
- obj-$(CONFIG_CRYPTO_WP512) += wp512.o
- CFLAGS_wp512.o := $(call cc-option,-fno-schedule-insns) # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79149
- obj-$(CONFIG_CRYPTO_TGR192) += tgr192.o
-+obj-$(CONFIG_CRYPTO_BLAKE2S) += blake2s_generic.o
- obj-$(CONFIG_CRYPTO_GF128MUL) += gf128mul.o
- obj-$(CONFIG_CRYPTO_ECB) += ecb.o
- obj-$(CONFIG_CRYPTO_CBC) += cbc.o
---- /dev/null
-+++ b/crypto/blake2s_generic.c
-@@ -0,0 +1,171 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include <crypto/internal/blake2s.h>
-+#include <crypto/internal/simd.h>
-+#include <crypto/internal/hash.h>
-+
-+#include <linux/types.h>
-+#include <linux/jump_label.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+static int crypto_blake2s_setkey(struct crypto_shash *tfm, const u8 *key,
-+ unsigned int keylen)
-+{
-+ struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(tfm);
-+
-+ if (keylen == 0 || keylen > BLAKE2S_KEY_SIZE) {
-+ crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
-+ return -EINVAL;
-+ }
-+
-+ memcpy(tctx->key, key, keylen);
-+ tctx->keylen = keylen;
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_init(struct shash_desc *desc)
-+{
-+ struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+ const int outlen = crypto_shash_digestsize(desc->tfm);
-+
-+ if (tctx->keylen)
-+ blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
-+ else
-+ blake2s_init(state, outlen);
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_update(struct shash_desc *desc, const u8 *in,
-+ unsigned int inlen)
-+{
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+ const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-+
-+ if (unlikely(!inlen))
-+ return 0;
-+ if (inlen > fill) {
-+ memcpy(state->buf + state->buflen, in, fill);
-+ blake2s_compress_generic(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
-+ state->buflen = 0;
-+ in += fill;
-+ inlen -= fill;
-+ }
-+ if (inlen > BLAKE2S_BLOCK_SIZE) {
-+ const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-+ /* Hash one less (full) block than strictly possible */
-+ blake2s_compress_generic(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
-+ in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ }
-+ memcpy(state->buf + state->buflen, in, inlen);
-+ state->buflen += inlen;
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
-+{
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+
-+ blake2s_set_lastblock(state);
-+ memset(state->buf + state->buflen, 0,
-+ BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-+ blake2s_compress_generic(state, state->buf, 1, state->buflen);
-+ cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-+ memcpy(out, state->h, state->outlen);
-+ memzero_explicit(state, sizeof(*state));
-+
-+ return 0;
-+}
-+
-+static struct shash_alg blake2s_algs[] = {{
-+ .base.cra_name = "blake2s-128",
-+ .base.cra_driver_name = "blake2s-128-generic",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_128_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-160",
-+ .base.cra_driver_name = "blake2s-160-generic",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_160_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-224",
-+ .base.cra_driver_name = "blake2s-224-generic",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_224_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-256",
-+ .base.cra_driver_name = "blake2s-256-generic",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_256_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}};
-+
-+static int __init blake2s_mod_init(void)
-+{
-+ return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
-+}
-+
-+static void __exit blake2s_mod_exit(void)
-+{
-+ crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
-+}
-+
-+subsys_initcall(blake2s_mod_init);
-+module_exit(blake2s_mod_exit);
-+
-+MODULE_ALIAS_CRYPTO("blake2s-128");
-+MODULE_ALIAS_CRYPTO("blake2s-128-generic");
-+MODULE_ALIAS_CRYPTO("blake2s-160");
-+MODULE_ALIAS_CRYPTO("blake2s-160-generic");
-+MODULE_ALIAS_CRYPTO("blake2s-224");
-+MODULE_ALIAS_CRYPTO("blake2s-224-generic");
-+MODULE_ALIAS_CRYPTO("blake2s-256");
-+MODULE_ALIAS_CRYPTO("blake2s-256-generic");
-+MODULE_LICENSE("GPL v2");
---- a/include/crypto/internal/blake2s.h
-+++ b/include/crypto/internal/blake2s.h
-@@ -5,6 +5,11 @@
-
- #include <crypto/blake2s.h>
-
-+struct blake2s_tfm_ctx {
-+ u8 key[BLAKE2S_KEY_SIZE];
-+ unsigned int keylen;
-+};
-+
- void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
- size_t nblocks, const u32 inc);
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0024-crypto-blake2s-x86_64-SIMD-implementation.patch b/target/linux/generic/backport-5.4/080-wireguard-0024-crypto-blake2s-x86_64-SIMD-implementation.patch
deleted file mode 100644
index 04405581d2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0024-crypto-blake2s-x86_64-SIMD-implementation.patch
+++ /dev/null
@@ -1,557 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:31 +0100
-Subject: [PATCH] crypto: blake2s - x86_64 SIMD implementation
-
-commit ed0356eda153f6a95649e11feb7b07083caf9e20 upstream.
-
-These implementations from Samuel Neves support AVX and AVX-512VL.
-Originally this used AVX-512F, but Skylake thermal throttling made
-AVX-512VL more attractive and possible to do with negligable difference.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
-Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
-[ardb: move to arch/x86/crypto, wire into lib/crypto framework]
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/Makefile | 2 +
- arch/x86/crypto/blake2s-core.S | 258 +++++++++++++++++++++++++++++++++
- arch/x86/crypto/blake2s-glue.c | 233 +++++++++++++++++++++++++++++
- crypto/Kconfig | 6 +
- 4 files changed, 499 insertions(+)
- create mode 100644 arch/x86/crypto/blake2s-core.S
- create mode 100644 arch/x86/crypto/blake2s-glue.c
-
---- a/arch/x86/crypto/Makefile
-+++ b/arch/x86/crypto/Makefile
-@@ -48,6 +48,7 @@ ifeq ($(avx_supported),yes)
- obj-$(CONFIG_CRYPTO_CAST6_AVX_X86_64) += cast6-avx-x86_64.o
- obj-$(CONFIG_CRYPTO_TWOFISH_AVX_X86_64) += twofish-avx-x86_64.o
- obj-$(CONFIG_CRYPTO_SERPENT_AVX_X86_64) += serpent-avx-x86_64.o
-+ obj-$(CONFIG_CRYPTO_BLAKE2S_X86) += blake2s-x86_64.o
- endif
-
- # These modules require assembler to support AVX2.
-@@ -70,6 +71,7 @@ serpent-sse2-x86_64-y := serpent-sse2-x8
- aegis128-aesni-y := aegis128-aesni-asm.o aegis128-aesni-glue.o
-
- nhpoly1305-sse2-y := nh-sse2-x86_64.o nhpoly1305-sse2-glue.o
-+blake2s-x86_64-y := blake2s-core.o blake2s-glue.o
-
- ifeq ($(avx_supported),yes)
- camellia-aesni-avx-x86_64-y := camellia-aesni-avx-asm_64.o \
---- /dev/null
-+++ b/arch/x86/crypto/blake2s-core.S
-@@ -0,0 +1,258 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ * Copyright (C) 2017-2019 Samuel Neves <sneves@dei.uc.pt>. All Rights Reserved.
-+ */
-+
-+#include <linux/linkage.h>
-+
-+.section .rodata.cst32.BLAKE2S_IV, "aM", @progbits, 32
-+.align 32
-+IV: .octa 0xA54FF53A3C6EF372BB67AE856A09E667
-+ .octa 0x5BE0CD191F83D9AB9B05688C510E527F
-+.section .rodata.cst16.ROT16, "aM", @progbits, 16
-+.align 16
-+ROT16: .octa 0x0D0C0F0E09080B0A0504070601000302
-+.section .rodata.cst16.ROR328, "aM", @progbits, 16
-+.align 16
-+ROR328: .octa 0x0C0F0E0D080B0A090407060500030201
-+.section .rodata.cst64.BLAKE2S_SIGMA, "aM", @progbits, 160
-+.align 64
-+SIGMA:
-+.byte 0, 2, 4, 6, 1, 3, 5, 7, 14, 8, 10, 12, 15, 9, 11, 13
-+.byte 14, 4, 9, 13, 10, 8, 15, 6, 5, 1, 0, 11, 3, 12, 2, 7
-+.byte 11, 12, 5, 15, 8, 0, 2, 13, 9, 10, 3, 7, 4, 14, 6, 1
-+.byte 7, 3, 13, 11, 9, 1, 12, 14, 15, 2, 5, 4, 8, 6, 10, 0
-+.byte 9, 5, 2, 10, 0, 7, 4, 15, 3, 14, 11, 6, 13, 1, 12, 8
-+.byte 2, 6, 0, 8, 12, 10, 11, 3, 1, 4, 7, 15, 9, 13, 5, 14
-+.byte 12, 1, 14, 4, 5, 15, 13, 10, 8, 0, 6, 9, 11, 7, 3, 2
-+.byte 13, 7, 12, 3, 11, 14, 1, 9, 2, 5, 15, 8, 10, 0, 4, 6
-+.byte 6, 14, 11, 0, 15, 9, 3, 8, 10, 12, 13, 1, 5, 2, 7, 4
-+.byte 10, 8, 7, 1, 2, 4, 6, 5, 13, 15, 9, 3, 0, 11, 14, 12
-+#ifdef CONFIG_AS_AVX512
-+.section .rodata.cst64.BLAKE2S_SIGMA2, "aM", @progbits, 640
-+.align 64
-+SIGMA2:
-+.long 0, 2, 4, 6, 1, 3, 5, 7, 14, 8, 10, 12, 15, 9, 11, 13
-+.long 8, 2, 13, 15, 10, 9, 12, 3, 6, 4, 0, 14, 5, 11, 1, 7
-+.long 11, 13, 8, 6, 5, 10, 14, 3, 2, 4, 12, 15, 1, 0, 7, 9
-+.long 11, 10, 7, 0, 8, 15, 1, 13, 3, 6, 2, 12, 4, 14, 9, 5
-+.long 4, 10, 9, 14, 15, 0, 11, 8, 1, 7, 3, 13, 2, 5, 6, 12
-+.long 2, 11, 4, 15, 14, 3, 10, 8, 13, 6, 5, 7, 0, 12, 1, 9
-+.long 4, 8, 15, 9, 14, 11, 13, 5, 3, 2, 1, 12, 6, 10, 7, 0
-+.long 6, 13, 0, 14, 12, 2, 1, 11, 15, 4, 5, 8, 7, 9, 3, 10
-+.long 15, 5, 4, 13, 10, 7, 3, 11, 12, 2, 0, 6, 9, 8, 1, 14
-+.long 8, 7, 14, 11, 13, 15, 0, 12, 10, 4, 5, 6, 3, 2, 1, 9
-+#endif /* CONFIG_AS_AVX512 */
-+
-+.text
-+#ifdef CONFIG_AS_SSSE3
-+ENTRY(blake2s_compress_ssse3)
-+ testq %rdx,%rdx
-+ je .Lendofloop
-+ movdqu (%rdi),%xmm0
-+ movdqu 0x10(%rdi),%xmm1
-+ movdqa ROT16(%rip),%xmm12
-+ movdqa ROR328(%rip),%xmm13
-+ movdqu 0x20(%rdi),%xmm14
-+ movq %rcx,%xmm15
-+ leaq SIGMA+0xa0(%rip),%r8
-+ jmp .Lbeginofloop
-+ .align 32
-+.Lbeginofloop:
-+ movdqa %xmm0,%xmm10
-+ movdqa %xmm1,%xmm11
-+ paddq %xmm15,%xmm14
-+ movdqa IV(%rip),%xmm2
-+ movdqa %xmm14,%xmm3
-+ pxor IV+0x10(%rip),%xmm3
-+ leaq SIGMA(%rip),%rcx
-+.Lroundloop:
-+ movzbl (%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm4
-+ movzbl 0x1(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm5
-+ movzbl 0x2(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm6
-+ movzbl 0x3(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm7
-+ punpckldq %xmm5,%xmm4
-+ punpckldq %xmm7,%xmm6
-+ punpcklqdq %xmm6,%xmm4
-+ paddd %xmm4,%xmm0
-+ paddd %xmm1,%xmm0
-+ pxor %xmm0,%xmm3
-+ pshufb %xmm12,%xmm3
-+ paddd %xmm3,%xmm2
-+ pxor %xmm2,%xmm1
-+ movdqa %xmm1,%xmm8
-+ psrld $0xc,%xmm1
-+ pslld $0x14,%xmm8
-+ por %xmm8,%xmm1
-+ movzbl 0x4(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm5
-+ movzbl 0x5(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm6
-+ movzbl 0x6(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm7
-+ movzbl 0x7(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm4
-+ punpckldq %xmm6,%xmm5
-+ punpckldq %xmm4,%xmm7
-+ punpcklqdq %xmm7,%xmm5
-+ paddd %xmm5,%xmm0
-+ paddd %xmm1,%xmm0
-+ pxor %xmm0,%xmm3
-+ pshufb %xmm13,%xmm3
-+ paddd %xmm3,%xmm2
-+ pxor %xmm2,%xmm1
-+ movdqa %xmm1,%xmm8
-+ psrld $0x7,%xmm1
-+ pslld $0x19,%xmm8
-+ por %xmm8,%xmm1
-+ pshufd $0x93,%xmm0,%xmm0
-+ pshufd $0x4e,%xmm3,%xmm3
-+ pshufd $0x39,%xmm2,%xmm2
-+ movzbl 0x8(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm6
-+ movzbl 0x9(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm7
-+ movzbl 0xa(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm4
-+ movzbl 0xb(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm5
-+ punpckldq %xmm7,%xmm6
-+ punpckldq %xmm5,%xmm4
-+ punpcklqdq %xmm4,%xmm6
-+ paddd %xmm6,%xmm0
-+ paddd %xmm1,%xmm0
-+ pxor %xmm0,%xmm3
-+ pshufb %xmm12,%xmm3
-+ paddd %xmm3,%xmm2
-+ pxor %xmm2,%xmm1
-+ movdqa %xmm1,%xmm8
-+ psrld $0xc,%xmm1
-+ pslld $0x14,%xmm8
-+ por %xmm8,%xmm1
-+ movzbl 0xc(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm7
-+ movzbl 0xd(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm4
-+ movzbl 0xe(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm5
-+ movzbl 0xf(%rcx),%eax
-+ movd (%rsi,%rax,4),%xmm6
-+ punpckldq %xmm4,%xmm7
-+ punpckldq %xmm6,%xmm5
-+ punpcklqdq %xmm5,%xmm7
-+ paddd %xmm7,%xmm0
-+ paddd %xmm1,%xmm0
-+ pxor %xmm0,%xmm3
-+ pshufb %xmm13,%xmm3
-+ paddd %xmm3,%xmm2
-+ pxor %xmm2,%xmm1
-+ movdqa %xmm1,%xmm8
-+ psrld $0x7,%xmm1
-+ pslld $0x19,%xmm8
-+ por %xmm8,%xmm1
-+ pshufd $0x39,%xmm0,%xmm0
-+ pshufd $0x4e,%xmm3,%xmm3
-+ pshufd $0x93,%xmm2,%xmm2
-+ addq $0x10,%rcx
-+ cmpq %r8,%rcx
-+ jnz .Lroundloop
-+ pxor %xmm2,%xmm0
-+ pxor %xmm3,%xmm1
-+ pxor %xmm10,%xmm0
-+ pxor %xmm11,%xmm1
-+ addq $0x40,%rsi
-+ decq %rdx
-+ jnz .Lbeginofloop
-+ movdqu %xmm0,(%rdi)
-+ movdqu %xmm1,0x10(%rdi)
-+ movdqu %xmm14,0x20(%rdi)
-+.Lendofloop:
-+ ret
-+ENDPROC(blake2s_compress_ssse3)
-+#endif /* CONFIG_AS_SSSE3 */
-+
-+#ifdef CONFIG_AS_AVX512
-+ENTRY(blake2s_compress_avx512)
-+ vmovdqu (%rdi),%xmm0
-+ vmovdqu 0x10(%rdi),%xmm1
-+ vmovdqu 0x20(%rdi),%xmm4
-+ vmovq %rcx,%xmm5
-+ vmovdqa IV(%rip),%xmm14
-+ vmovdqa IV+16(%rip),%xmm15
-+ jmp .Lblake2s_compress_avx512_mainloop
-+.align 32
-+.Lblake2s_compress_avx512_mainloop:
-+ vmovdqa %xmm0,%xmm10
-+ vmovdqa %xmm1,%xmm11
-+ vpaddq %xmm5,%xmm4,%xmm4
-+ vmovdqa %xmm14,%xmm2
-+ vpxor %xmm15,%xmm4,%xmm3
-+ vmovdqu (%rsi),%ymm6
-+ vmovdqu 0x20(%rsi),%ymm7
-+ addq $0x40,%rsi
-+ leaq SIGMA2(%rip),%rax
-+ movb $0xa,%cl
-+.Lblake2s_compress_avx512_roundloop:
-+ addq $0x40,%rax
-+ vmovdqa -0x40(%rax),%ymm8
-+ vmovdqa -0x20(%rax),%ymm9
-+ vpermi2d %ymm7,%ymm6,%ymm8
-+ vpermi2d %ymm7,%ymm6,%ymm9
-+ vmovdqa %ymm8,%ymm6
-+ vmovdqa %ymm9,%ymm7
-+ vpaddd %xmm8,%xmm0,%xmm0
-+ vpaddd %xmm1,%xmm0,%xmm0
-+ vpxor %xmm0,%xmm3,%xmm3
-+ vprord $0x10,%xmm3,%xmm3
-+ vpaddd %xmm3,%xmm2,%xmm2
-+ vpxor %xmm2,%xmm1,%xmm1
-+ vprord $0xc,%xmm1,%xmm1
-+ vextracti128 $0x1,%ymm8,%xmm8
-+ vpaddd %xmm8,%xmm0,%xmm0
-+ vpaddd %xmm1,%xmm0,%xmm0
-+ vpxor %xmm0,%xmm3,%xmm3
-+ vprord $0x8,%xmm3,%xmm3
-+ vpaddd %xmm3,%xmm2,%xmm2
-+ vpxor %xmm2,%xmm1,%xmm1
-+ vprord $0x7,%xmm1,%xmm1
-+ vpshufd $0x93,%xmm0,%xmm0
-+ vpshufd $0x4e,%xmm3,%xmm3
-+ vpshufd $0x39,%xmm2,%xmm2
-+ vpaddd %xmm9,%xmm0,%xmm0
-+ vpaddd %xmm1,%xmm0,%xmm0
-+ vpxor %xmm0,%xmm3,%xmm3
-+ vprord $0x10,%xmm3,%xmm3
-+ vpaddd %xmm3,%xmm2,%xmm2
-+ vpxor %xmm2,%xmm1,%xmm1
-+ vprord $0xc,%xmm1,%xmm1
-+ vextracti128 $0x1,%ymm9,%xmm9
-+ vpaddd %xmm9,%xmm0,%xmm0
-+ vpaddd %xmm1,%xmm0,%xmm0
-+ vpxor %xmm0,%xmm3,%xmm3
-+ vprord $0x8,%xmm3,%xmm3
-+ vpaddd %xmm3,%xmm2,%xmm2
-+ vpxor %xmm2,%xmm1,%xmm1
-+ vprord $0x7,%xmm1,%xmm1
-+ vpshufd $0x39,%xmm0,%xmm0
-+ vpshufd $0x4e,%xmm3,%xmm3
-+ vpshufd $0x93,%xmm2,%xmm2
-+ decb %cl
-+ jne .Lblake2s_compress_avx512_roundloop
-+ vpxor %xmm10,%xmm0,%xmm0
-+ vpxor %xmm11,%xmm1,%xmm1
-+ vpxor %xmm2,%xmm0,%xmm0
-+ vpxor %xmm3,%xmm1,%xmm1
-+ decq %rdx
-+ jne .Lblake2s_compress_avx512_mainloop
-+ vmovdqu %xmm0,(%rdi)
-+ vmovdqu %xmm1,0x10(%rdi)
-+ vmovdqu %xmm4,0x20(%rdi)
-+ vzeroupper
-+ retq
-+ENDPROC(blake2s_compress_avx512)
-+#endif /* CONFIG_AS_AVX512 */
---- /dev/null
-+++ b/arch/x86/crypto/blake2s-glue.c
-@@ -0,0 +1,233 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include <crypto/internal/blake2s.h>
-+#include <crypto/internal/simd.h>
-+#include <crypto/internal/hash.h>
-+
-+#include <linux/types.h>
-+#include <linux/jump_label.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+#include <asm/cpufeature.h>
-+#include <asm/fpu/api.h>
-+#include <asm/processor.h>
-+#include <asm/simd.h>
-+
-+asmlinkage void blake2s_compress_ssse3(struct blake2s_state *state,
-+ const u8 *block, const size_t nblocks,
-+ const u32 inc);
-+asmlinkage void blake2s_compress_avx512(struct blake2s_state *state,
-+ const u8 *block, const size_t nblocks,
-+ const u32 inc);
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_ssse3);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_avx512);
-+
-+void blake2s_compress_arch(struct blake2s_state *state,
-+ const u8 *block, size_t nblocks,
-+ const u32 inc)
-+{
-+ /* SIMD disables preemption, so relax after processing each page. */
-+ BUILD_BUG_ON(PAGE_SIZE / BLAKE2S_BLOCK_SIZE < 8);
-+
-+ if (!static_branch_likely(&blake2s_use_ssse3) || !crypto_simd_usable()) {
-+ blake2s_compress_generic(state, block, nblocks, inc);
-+ return;
-+ }
-+
-+ for (;;) {
-+ const size_t blocks = min_t(size_t, nblocks,
-+ PAGE_SIZE / BLAKE2S_BLOCK_SIZE);
-+
-+ kernel_fpu_begin();
-+ if (IS_ENABLED(CONFIG_AS_AVX512) &&
-+ static_branch_likely(&blake2s_use_avx512))
-+ blake2s_compress_avx512(state, block, blocks, inc);
-+ else
-+ blake2s_compress_ssse3(state, block, blocks, inc);
-+ kernel_fpu_end();
-+
-+ nblocks -= blocks;
-+ if (!nblocks)
-+ break;
-+ block += blocks * BLAKE2S_BLOCK_SIZE;
-+ }
-+}
-+EXPORT_SYMBOL(blake2s_compress_arch);
-+
-+static int crypto_blake2s_setkey(struct crypto_shash *tfm, const u8 *key,
-+ unsigned int keylen)
-+{
-+ struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(tfm);
-+
-+ if (keylen == 0 || keylen > BLAKE2S_KEY_SIZE) {
-+ crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
-+ return -EINVAL;
-+ }
-+
-+ memcpy(tctx->key, key, keylen);
-+ tctx->keylen = keylen;
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_init(struct shash_desc *desc)
-+{
-+ struct blake2s_tfm_ctx *tctx = crypto_shash_ctx(desc->tfm);
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+ const int outlen = crypto_shash_digestsize(desc->tfm);
-+
-+ if (tctx->keylen)
-+ blake2s_init_key(state, outlen, tctx->key, tctx->keylen);
-+ else
-+ blake2s_init(state, outlen);
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_update(struct shash_desc *desc, const u8 *in,
-+ unsigned int inlen)
-+{
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+ const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
-+
-+ if (unlikely(!inlen))
-+ return 0;
-+ if (inlen > fill) {
-+ memcpy(state->buf + state->buflen, in, fill);
-+ blake2s_compress_arch(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
-+ state->buflen = 0;
-+ in += fill;
-+ inlen -= fill;
-+ }
-+ if (inlen > BLAKE2S_BLOCK_SIZE) {
-+ const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
-+ /* Hash one less (full) block than strictly possible */
-+ blake2s_compress_arch(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
-+ in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
-+ }
-+ memcpy(state->buf + state->buflen, in, inlen);
-+ state->buflen += inlen;
-+
-+ return 0;
-+}
-+
-+static int crypto_blake2s_final(struct shash_desc *desc, u8 *out)
-+{
-+ struct blake2s_state *state = shash_desc_ctx(desc);
-+
-+ blake2s_set_lastblock(state);
-+ memset(state->buf + state->buflen, 0,
-+ BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
-+ blake2s_compress_arch(state, state->buf, 1, state->buflen);
-+ cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
-+ memcpy(out, state->h, state->outlen);
-+ memzero_explicit(state, sizeof(*state));
-+
-+ return 0;
-+}
-+
-+static struct shash_alg blake2s_algs[] = {{
-+ .base.cra_name = "blake2s-128",
-+ .base.cra_driver_name = "blake2s-128-x86",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_128_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-160",
-+ .base.cra_driver_name = "blake2s-160-x86",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_160_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-224",
-+ .base.cra_driver_name = "blake2s-224-x86",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_224_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}, {
-+ .base.cra_name = "blake2s-256",
-+ .base.cra_driver_name = "blake2s-256-x86",
-+ .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY,
-+ .base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx),
-+ .base.cra_priority = 200,
-+ .base.cra_blocksize = BLAKE2S_BLOCK_SIZE,
-+ .base.cra_module = THIS_MODULE,
-+
-+ .digestsize = BLAKE2S_256_HASH_SIZE,
-+ .setkey = crypto_blake2s_setkey,
-+ .init = crypto_blake2s_init,
-+ .update = crypto_blake2s_update,
-+ .final = crypto_blake2s_final,
-+ .descsize = sizeof(struct blake2s_state),
-+}};
-+
-+static int __init blake2s_mod_init(void)
-+{
-+ if (!boot_cpu_has(X86_FEATURE_SSSE3))
-+ return 0;
-+
-+ static_branch_enable(&blake2s_use_ssse3);
-+
-+ if (IS_ENABLED(CONFIG_AS_AVX512) &&
-+ boot_cpu_has(X86_FEATURE_AVX) &&
-+ boot_cpu_has(X86_FEATURE_AVX2) &&
-+ boot_cpu_has(X86_FEATURE_AVX512F) &&
-+ boot_cpu_has(X86_FEATURE_AVX512VL) &&
-+ cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM |
-+ XFEATURE_MASK_AVX512, NULL))
-+ static_branch_enable(&blake2s_use_avx512);
-+
-+ return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
-+}
-+
-+static void __exit blake2s_mod_exit(void)
-+{
-+ if (boot_cpu_has(X86_FEATURE_SSSE3))
-+ crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
-+}
-+
-+module_init(blake2s_mod_init);
-+module_exit(blake2s_mod_exit);
-+
-+MODULE_ALIAS_CRYPTO("blake2s-128");
-+MODULE_ALIAS_CRYPTO("blake2s-128-x86");
-+MODULE_ALIAS_CRYPTO("blake2s-160");
-+MODULE_ALIAS_CRYPTO("blake2s-160-x86");
-+MODULE_ALIAS_CRYPTO("blake2s-224");
-+MODULE_ALIAS_CRYPTO("blake2s-224-x86");
-+MODULE_ALIAS_CRYPTO("blake2s-256");
-+MODULE_ALIAS_CRYPTO("blake2s-256-x86");
-+MODULE_LICENSE("GPL v2");
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -657,6 +657,12 @@ config CRYPTO_BLAKE2S
-
- See https://blake2.net for further information.
-
-+config CRYPTO_BLAKE2S_X86
-+ tristate "BLAKE2s digest algorithm (x86 accelerated version)"
-+ depends on X86 && 64BIT
-+ select CRYPTO_LIB_BLAKE2S_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_BLAKE2S
-+
- config CRYPTO_CRCT10DIF
- tristate "CRCT10DIF algorithm"
- select CRYPTO_HASH
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0025-crypto-curve25519-generic-C-library-implementations.patch b/target/linux/generic/backport-5.4/080-wireguard-0025-crypto-curve25519-generic-C-library-implementations.patch
deleted file mode 100644
index e58dda9213..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0025-crypto-curve25519-generic-C-library-implementations.patch
+++ /dev/null
@@ -1,1849 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:32 +0100
-Subject: [PATCH] crypto: curve25519 - generic C library implementations
-
-commit 0ed42a6f431e930b2e8fae21955406e09fe75d70 upstream.
-
-This contains two formally verified C implementations of the Curve25519
-scalar multiplication function, one for 32-bit systems, and one for
-64-bit systems whose compiler supports efficient 128-bit integer types.
-Not only are these implementations formally verified, but they are also
-the fastest available C implementations. They have been modified to be
-friendly to kernel space and to be generally less horrendous looking,
-but still an effort has been made to retain their formally verified
-characteristic, and so the C might look slightly unidiomatic.
-
-The 64-bit version comes from HACL*: https://github.com/project-everest/hacl-star
-The 32-bit version comes from Fiat: https://github.com/mit-plv/fiat-crypto
-
-Information: https://cr.yp.to/ecdh.html
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-[ardb: - move from lib/zinc to lib/crypto
- - replace .c #includes with Kconfig based object selection
- - drop simd handling and simplify support for per-arch versions ]
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/curve25519.h | 71 +++
- lib/crypto/Kconfig | 25 +
- lib/crypto/Makefile | 5 +
- lib/crypto/curve25519-fiat32.c | 864 +++++++++++++++++++++++++++++++++
- lib/crypto/curve25519-hacl64.c | 788 ++++++++++++++++++++++++++++++
- lib/crypto/curve25519.c | 25 +
- 6 files changed, 1778 insertions(+)
- create mode 100644 include/crypto/curve25519.h
- create mode 100644 lib/crypto/curve25519-fiat32.c
- create mode 100644 lib/crypto/curve25519-hacl64.c
- create mode 100644 lib/crypto/curve25519.c
-
---- /dev/null
-+++ b/include/crypto/curve25519.h
-@@ -0,0 +1,71 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef CURVE25519_H
-+#define CURVE25519_H
-+
-+#include <crypto/algapi.h> // For crypto_memneq.
-+#include <linux/types.h>
-+#include <linux/random.h>
-+
-+enum curve25519_lengths {
-+ CURVE25519_KEY_SIZE = 32
-+};
-+
-+extern const u8 curve25519_null_point[];
-+extern const u8 curve25519_base_point[];
-+
-+void curve25519_generic(u8 out[CURVE25519_KEY_SIZE],
-+ const u8 scalar[CURVE25519_KEY_SIZE],
-+ const u8 point[CURVE25519_KEY_SIZE]);
-+
-+void curve25519_arch(u8 out[CURVE25519_KEY_SIZE],
-+ const u8 scalar[CURVE25519_KEY_SIZE],
-+ const u8 point[CURVE25519_KEY_SIZE]);
-+
-+void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE]);
-+
-+static inline
-+bool __must_check curve25519(u8 mypublic[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE],
-+ const u8 basepoint[CURVE25519_KEY_SIZE])
-+{
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))
-+ curve25519_arch(mypublic, secret, basepoint);
-+ else
-+ curve25519_generic(mypublic, secret, basepoint);
-+ return crypto_memneq(mypublic, curve25519_null_point,
-+ CURVE25519_KEY_SIZE);
-+}
-+
-+static inline bool
-+__must_check curve25519_generate_public(u8 pub[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE])
-+{
-+ if (unlikely(!crypto_memneq(secret, curve25519_null_point,
-+ CURVE25519_KEY_SIZE)))
-+ return false;
-+
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))
-+ curve25519_base_arch(pub, secret);
-+ else
-+ curve25519_generic(pub, secret, curve25519_base_point);
-+ return crypto_memneq(pub, curve25519_null_point, CURVE25519_KEY_SIZE);
-+}
-+
-+static inline void curve25519_clamp_secret(u8 secret[CURVE25519_KEY_SIZE])
-+{
-+ secret[0] &= 248;
-+ secret[31] = (secret[31] & 127) | 64;
-+}
-+
-+static inline void curve25519_generate_secret(u8 secret[CURVE25519_KEY_SIZE])
-+{
-+ get_random_bytes_wait(secret, CURVE25519_KEY_SIZE);
-+ curve25519_clamp_secret(secret);
-+}
-+
-+#endif /* CURVE25519_H */
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -59,6 +59,31 @@ config CRYPTO_LIB_CHACHA
- by either the generic implementation or an arch-specific one, if one
- is available and enabled.
-
-+config CRYPTO_ARCH_HAVE_LIB_CURVE25519
-+ tristate
-+ help
-+ Declares whether the architecture provides an arch-specific
-+ accelerated implementation of the Curve25519 library interface,
-+ either builtin or as a module.
-+
-+config CRYPTO_LIB_CURVE25519_GENERIC
-+ tristate
-+ help
-+ This symbol can be depended upon by arch implementations of the
-+ Curve25519 library interface that require the generic code as a
-+ fallback, e.g., for SIMD implementations. If no arch specific
-+ implementation is enabled, this implementation serves the users
-+ of CRYPTO_LIB_CURVE25519.
-+
-+config CRYPTO_LIB_CURVE25519
-+ tristate "Curve25519 scalar multiplication library"
-+ depends on CRYPTO_ARCH_HAVE_LIB_CURVE25519 || !CRYPTO_ARCH_HAVE_LIB_CURVE25519
-+ select CRYPTO_LIB_CURVE25519_GENERIC if CRYPTO_ARCH_HAVE_LIB_CURVE25519=n
-+ help
-+ Enable the Curve25519 library interface. This interface may be
-+ fulfilled by either the generic implementation or an arch-specific
-+ one, if one is available and enabled.
-+
- config CRYPTO_LIB_DES
- tristate
-
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -16,6 +16,11 @@ libblake2s-generic-y += blake2s-gener
- obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o
- libblake2s-y += blake2s.o
-
-+obj-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += libcurve25519.o
-+libcurve25519-y := curve25519-fiat32.o
-+libcurve25519-$(CONFIG_ARCH_SUPPORTS_INT128) := curve25519-hacl64.o
-+libcurve25519-y += curve25519.o
-+
- obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
- libdes-y := des.o
-
---- /dev/null
-+++ b/lib/crypto/curve25519-fiat32.c
-@@ -0,0 +1,864 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2016 The fiat-crypto Authors.
-+ * Copyright (C) 2018-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is a machine-generated formally verified implementation of Curve25519
-+ * ECDH from: <https://github.com/mit-plv/fiat-crypto>. Though originally
-+ * machine generated, it has been tweaked to be suitable for use in the kernel.
-+ * It is optimized for 32-bit machines and machines that cannot work efficiently
-+ * with 128-bit integer types.
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <crypto/curve25519.h>
-+#include <linux/string.h>
-+
-+/* fe means field element. Here the field is \Z/(2^255-19). An element t,
-+ * entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
-+ * t[3]+2^102 t[4]+...+2^230 t[9].
-+ * fe limbs are bounded by 1.125*2^26,1.125*2^25,1.125*2^26,1.125*2^25,etc.
-+ * Multiplication and carrying produce fe from fe_loose.
-+ */
-+typedef struct fe { u32 v[10]; } fe;
-+
-+/* fe_loose limbs are bounded by 3.375*2^26,3.375*2^25,3.375*2^26,3.375*2^25,etc
-+ * Addition and subtraction produce fe_loose from (fe, fe).
-+ */
-+typedef struct fe_loose { u32 v[10]; } fe_loose;
-+
-+static __always_inline void fe_frombytes_impl(u32 h[10], const u8 *s)
-+{
-+ /* Ignores top bit of s. */
-+ u32 a0 = get_unaligned_le32(s);
-+ u32 a1 = get_unaligned_le32(s+4);
-+ u32 a2 = get_unaligned_le32(s+8);
-+ u32 a3 = get_unaligned_le32(s+12);
-+ u32 a4 = get_unaligned_le32(s+16);
-+ u32 a5 = get_unaligned_le32(s+20);
-+ u32 a6 = get_unaligned_le32(s+24);
-+ u32 a7 = get_unaligned_le32(s+28);
-+ h[0] = a0&((1<<26)-1); /* 26 used, 32-26 left. 26 */
-+ h[1] = (a0>>26) | ((a1&((1<<19)-1))<< 6); /* (32-26) + 19 = 6+19 = 25 */
-+ h[2] = (a1>>19) | ((a2&((1<<13)-1))<<13); /* (32-19) + 13 = 13+13 = 26 */
-+ h[3] = (a2>>13) | ((a3&((1<< 6)-1))<<19); /* (32-13) + 6 = 19+ 6 = 25 */
-+ h[4] = (a3>> 6); /* (32- 6) = 26 */
-+ h[5] = a4&((1<<25)-1); /* 25 */
-+ h[6] = (a4>>25) | ((a5&((1<<19)-1))<< 7); /* (32-25) + 19 = 7+19 = 26 */
-+ h[7] = (a5>>19) | ((a6&((1<<12)-1))<<13); /* (32-19) + 12 = 13+12 = 25 */
-+ h[8] = (a6>>12) | ((a7&((1<< 6)-1))<<20); /* (32-12) + 6 = 20+ 6 = 26 */
-+ h[9] = (a7>> 6)&((1<<25)-1); /* 25 */
-+}
-+
-+static __always_inline void fe_frombytes(fe *h, const u8 *s)
-+{
-+ fe_frombytes_impl(h->v, s);
-+}
-+
-+static __always_inline u8 /*bool*/
-+addcarryx_u25(u8 /*bool*/ c, u32 a, u32 b, u32 *low)
-+{
-+ /* This function extracts 25 bits of result and 1 bit of carry
-+ * (26 total), so a 32-bit intermediate is sufficient.
-+ */
-+ u32 x = a + b + c;
-+ *low = x & ((1 << 25) - 1);
-+ return (x >> 25) & 1;
-+}
-+
-+static __always_inline u8 /*bool*/
-+addcarryx_u26(u8 /*bool*/ c, u32 a, u32 b, u32 *low)
-+{
-+ /* This function extracts 26 bits of result and 1 bit of carry
-+ * (27 total), so a 32-bit intermediate is sufficient.
-+ */
-+ u32 x = a + b + c;
-+ *low = x & ((1 << 26) - 1);
-+ return (x >> 26) & 1;
-+}
-+
-+static __always_inline u8 /*bool*/
-+subborrow_u25(u8 /*bool*/ c, u32 a, u32 b, u32 *low)
-+{
-+ /* This function extracts 25 bits of result and 1 bit of borrow
-+ * (26 total), so a 32-bit intermediate is sufficient.
-+ */
-+ u32 x = a - b - c;
-+ *low = x & ((1 << 25) - 1);
-+ return x >> 31;
-+}
-+
-+static __always_inline u8 /*bool*/
-+subborrow_u26(u8 /*bool*/ c, u32 a, u32 b, u32 *low)
-+{
-+ /* This function extracts 26 bits of result and 1 bit of borrow
-+ *(27 total), so a 32-bit intermediate is sufficient.
-+ */
-+ u32 x = a - b - c;
-+ *low = x & ((1 << 26) - 1);
-+ return x >> 31;
-+}
-+
-+static __always_inline u32 cmovznz32(u32 t, u32 z, u32 nz)
-+{
-+ t = -!!t; /* all set if nonzero, 0 if 0 */
-+ return (t&nz) | ((~t)&z);
-+}
-+
-+static __always_inline void fe_freeze(u32 out[10], const u32 in1[10])
-+{
-+ { const u32 x17 = in1[9];
-+ { const u32 x18 = in1[8];
-+ { const u32 x16 = in1[7];
-+ { const u32 x14 = in1[6];
-+ { const u32 x12 = in1[5];
-+ { const u32 x10 = in1[4];
-+ { const u32 x8 = in1[3];
-+ { const u32 x6 = in1[2];
-+ { const u32 x4 = in1[1];
-+ { const u32 x2 = in1[0];
-+ { u32 x20; u8/*bool*/ x21 = subborrow_u26(0x0, x2, 0x3ffffed, &x20);
-+ { u32 x23; u8/*bool*/ x24 = subborrow_u25(x21, x4, 0x1ffffff, &x23);
-+ { u32 x26; u8/*bool*/ x27 = subborrow_u26(x24, x6, 0x3ffffff, &x26);
-+ { u32 x29; u8/*bool*/ x30 = subborrow_u25(x27, x8, 0x1ffffff, &x29);
-+ { u32 x32; u8/*bool*/ x33 = subborrow_u26(x30, x10, 0x3ffffff, &x32);
-+ { u32 x35; u8/*bool*/ x36 = subborrow_u25(x33, x12, 0x1ffffff, &x35);
-+ { u32 x38; u8/*bool*/ x39 = subborrow_u26(x36, x14, 0x3ffffff, &x38);
-+ { u32 x41; u8/*bool*/ x42 = subborrow_u25(x39, x16, 0x1ffffff, &x41);
-+ { u32 x44; u8/*bool*/ x45 = subborrow_u26(x42, x18, 0x3ffffff, &x44);
-+ { u32 x47; u8/*bool*/ x48 = subborrow_u25(x45, x17, 0x1ffffff, &x47);
-+ { u32 x49 = cmovznz32(x48, 0x0, 0xffffffff);
-+ { u32 x50 = (x49 & 0x3ffffed);
-+ { u32 x52; u8/*bool*/ x53 = addcarryx_u26(0x0, x20, x50, &x52);
-+ { u32 x54 = (x49 & 0x1ffffff);
-+ { u32 x56; u8/*bool*/ x57 = addcarryx_u25(x53, x23, x54, &x56);
-+ { u32 x58 = (x49 & 0x3ffffff);
-+ { u32 x60; u8/*bool*/ x61 = addcarryx_u26(x57, x26, x58, &x60);
-+ { u32 x62 = (x49 & 0x1ffffff);
-+ { u32 x64; u8/*bool*/ x65 = addcarryx_u25(x61, x29, x62, &x64);
-+ { u32 x66 = (x49 & 0x3ffffff);
-+ { u32 x68; u8/*bool*/ x69 = addcarryx_u26(x65, x32, x66, &x68);
-+ { u32 x70 = (x49 & 0x1ffffff);
-+ { u32 x72; u8/*bool*/ x73 = addcarryx_u25(x69, x35, x70, &x72);
-+ { u32 x74 = (x49 & 0x3ffffff);
-+ { u32 x76; u8/*bool*/ x77 = addcarryx_u26(x73, x38, x74, &x76);
-+ { u32 x78 = (x49 & 0x1ffffff);
-+ { u32 x80; u8/*bool*/ x81 = addcarryx_u25(x77, x41, x78, &x80);
-+ { u32 x82 = (x49 & 0x3ffffff);
-+ { u32 x84; u8/*bool*/ x85 = addcarryx_u26(x81, x44, x82, &x84);
-+ { u32 x86 = (x49 & 0x1ffffff);
-+ { u32 x88; addcarryx_u25(x85, x47, x86, &x88);
-+ out[0] = x52;
-+ out[1] = x56;
-+ out[2] = x60;
-+ out[3] = x64;
-+ out[4] = x68;
-+ out[5] = x72;
-+ out[6] = x76;
-+ out[7] = x80;
-+ out[8] = x84;
-+ out[9] = x88;
-+ }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
-+}
-+
-+static __always_inline void fe_tobytes(u8 s[32], const fe *f)
-+{
-+ u32 h[10];
-+ fe_freeze(h, f->v);
-+ s[0] = h[0] >> 0;
-+ s[1] = h[0] >> 8;
-+ s[2] = h[0] >> 16;
-+ s[3] = (h[0] >> 24) | (h[1] << 2);
-+ s[4] = h[1] >> 6;
-+ s[5] = h[1] >> 14;
-+ s[6] = (h[1] >> 22) | (h[2] << 3);
-+ s[7] = h[2] >> 5;
-+ s[8] = h[2] >> 13;
-+ s[9] = (h[2] >> 21) | (h[3] << 5);
-+ s[10] = h[3] >> 3;
-+ s[11] = h[3] >> 11;
-+ s[12] = (h[3] >> 19) | (h[4] << 6);
-+ s[13] = h[4] >> 2;
-+ s[14] = h[4] >> 10;
-+ s[15] = h[4] >> 18;
-+ s[16] = h[5] >> 0;
-+ s[17] = h[5] >> 8;
-+ s[18] = h[5] >> 16;
-+ s[19] = (h[5] >> 24) | (h[6] << 1);
-+ s[20] = h[6] >> 7;
-+ s[21] = h[6] >> 15;
-+ s[22] = (h[6] >> 23) | (h[7] << 3);
-+ s[23] = h[7] >> 5;
-+ s[24] = h[7] >> 13;
-+ s[25] = (h[7] >> 21) | (h[8] << 4);
-+ s[26] = h[8] >> 4;
-+ s[27] = h[8] >> 12;
-+ s[28] = (h[8] >> 20) | (h[9] << 6);
-+ s[29] = h[9] >> 2;
-+ s[30] = h[9] >> 10;
-+ s[31] = h[9] >> 18;
-+}
-+
-+/* h = f */
-+static __always_inline void fe_copy(fe *h, const fe *f)
-+{
-+ memmove(h, f, sizeof(u32) * 10);
-+}
-+
-+static __always_inline void fe_copy_lt(fe_loose *h, const fe *f)
-+{
-+ memmove(h, f, sizeof(u32) * 10);
-+}
-+
-+/* h = 0 */
-+static __always_inline void fe_0(fe *h)
-+{
-+ memset(h, 0, sizeof(u32) * 10);
-+}
-+
-+/* h = 1 */
-+static __always_inline void fe_1(fe *h)
-+{
-+ memset(h, 0, sizeof(u32) * 10);
-+ h->v[0] = 1;
-+}
-+
-+static void fe_add_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+{
-+ { const u32 x20 = in1[9];
-+ { const u32 x21 = in1[8];
-+ { const u32 x19 = in1[7];
-+ { const u32 x17 = in1[6];
-+ { const u32 x15 = in1[5];
-+ { const u32 x13 = in1[4];
-+ { const u32 x11 = in1[3];
-+ { const u32 x9 = in1[2];
-+ { const u32 x7 = in1[1];
-+ { const u32 x5 = in1[0];
-+ { const u32 x38 = in2[9];
-+ { const u32 x39 = in2[8];
-+ { const u32 x37 = in2[7];
-+ { const u32 x35 = in2[6];
-+ { const u32 x33 = in2[5];
-+ { const u32 x31 = in2[4];
-+ { const u32 x29 = in2[3];
-+ { const u32 x27 = in2[2];
-+ { const u32 x25 = in2[1];
-+ { const u32 x23 = in2[0];
-+ out[0] = (x5 + x23);
-+ out[1] = (x7 + x25);
-+ out[2] = (x9 + x27);
-+ out[3] = (x11 + x29);
-+ out[4] = (x13 + x31);
-+ out[5] = (x15 + x33);
-+ out[6] = (x17 + x35);
-+ out[7] = (x19 + x37);
-+ out[8] = (x21 + x39);
-+ out[9] = (x20 + x38);
-+ }}}}}}}}}}}}}}}}}}}}
-+}
-+
-+/* h = f + g
-+ * Can overlap h with f or g.
-+ */
-+static __always_inline void fe_add(fe_loose *h, const fe *f, const fe *g)
-+{
-+ fe_add_impl(h->v, f->v, g->v);
-+}
-+
-+static void fe_sub_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+{
-+ { const u32 x20 = in1[9];
-+ { const u32 x21 = in1[8];
-+ { const u32 x19 = in1[7];
-+ { const u32 x17 = in1[6];
-+ { const u32 x15 = in1[5];
-+ { const u32 x13 = in1[4];
-+ { const u32 x11 = in1[3];
-+ { const u32 x9 = in1[2];
-+ { const u32 x7 = in1[1];
-+ { const u32 x5 = in1[0];
-+ { const u32 x38 = in2[9];
-+ { const u32 x39 = in2[8];
-+ { const u32 x37 = in2[7];
-+ { const u32 x35 = in2[6];
-+ { const u32 x33 = in2[5];
-+ { const u32 x31 = in2[4];
-+ { const u32 x29 = in2[3];
-+ { const u32 x27 = in2[2];
-+ { const u32 x25 = in2[1];
-+ { const u32 x23 = in2[0];
-+ out[0] = ((0x7ffffda + x5) - x23);
-+ out[1] = ((0x3fffffe + x7) - x25);
-+ out[2] = ((0x7fffffe + x9) - x27);
-+ out[3] = ((0x3fffffe + x11) - x29);
-+ out[4] = ((0x7fffffe + x13) - x31);
-+ out[5] = ((0x3fffffe + x15) - x33);
-+ out[6] = ((0x7fffffe + x17) - x35);
-+ out[7] = ((0x3fffffe + x19) - x37);
-+ out[8] = ((0x7fffffe + x21) - x39);
-+ out[9] = ((0x3fffffe + x20) - x38);
-+ }}}}}}}}}}}}}}}}}}}}
-+}
-+
-+/* h = f - g
-+ * Can overlap h with f or g.
-+ */
-+static __always_inline void fe_sub(fe_loose *h, const fe *f, const fe *g)
-+{
-+ fe_sub_impl(h->v, f->v, g->v);
-+}
-+
-+static void fe_mul_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+{
-+ { const u32 x20 = in1[9];
-+ { const u32 x21 = in1[8];
-+ { const u32 x19 = in1[7];
-+ { const u32 x17 = in1[6];
-+ { const u32 x15 = in1[5];
-+ { const u32 x13 = in1[4];
-+ { const u32 x11 = in1[3];
-+ { const u32 x9 = in1[2];
-+ { const u32 x7 = in1[1];
-+ { const u32 x5 = in1[0];
-+ { const u32 x38 = in2[9];
-+ { const u32 x39 = in2[8];
-+ { const u32 x37 = in2[7];
-+ { const u32 x35 = in2[6];
-+ { const u32 x33 = in2[5];
-+ { const u32 x31 = in2[4];
-+ { const u32 x29 = in2[3];
-+ { const u32 x27 = in2[2];
-+ { const u32 x25 = in2[1];
-+ { const u32 x23 = in2[0];
-+ { u64 x40 = ((u64)x23 * x5);
-+ { u64 x41 = (((u64)x23 * x7) + ((u64)x25 * x5));
-+ { u64 x42 = ((((u64)(0x2 * x25) * x7) + ((u64)x23 * x9)) + ((u64)x27 * x5));
-+ { u64 x43 = (((((u64)x25 * x9) + ((u64)x27 * x7)) + ((u64)x23 * x11)) + ((u64)x29 * x5));
-+ { u64 x44 = (((((u64)x27 * x9) + (0x2 * (((u64)x25 * x11) + ((u64)x29 * x7)))) + ((u64)x23 * x13)) + ((u64)x31 * x5));
-+ { u64 x45 = (((((((u64)x27 * x11) + ((u64)x29 * x9)) + ((u64)x25 * x13)) + ((u64)x31 * x7)) + ((u64)x23 * x15)) + ((u64)x33 * x5));
-+ { u64 x46 = (((((0x2 * ((((u64)x29 * x11) + ((u64)x25 * x15)) + ((u64)x33 * x7))) + ((u64)x27 * x13)) + ((u64)x31 * x9)) + ((u64)x23 * x17)) + ((u64)x35 * x5));
-+ { u64 x47 = (((((((((u64)x29 * x13) + ((u64)x31 * x11)) + ((u64)x27 * x15)) + ((u64)x33 * x9)) + ((u64)x25 * x17)) + ((u64)x35 * x7)) + ((u64)x23 * x19)) + ((u64)x37 * x5));
-+ { u64 x48 = (((((((u64)x31 * x13) + (0x2 * (((((u64)x29 * x15) + ((u64)x33 * x11)) + ((u64)x25 * x19)) + ((u64)x37 * x7)))) + ((u64)x27 * x17)) + ((u64)x35 * x9)) + ((u64)x23 * x21)) + ((u64)x39 * x5));
-+ { u64 x49 = (((((((((((u64)x31 * x15) + ((u64)x33 * x13)) + ((u64)x29 * x17)) + ((u64)x35 * x11)) + ((u64)x27 * x19)) + ((u64)x37 * x9)) + ((u64)x25 * x21)) + ((u64)x39 * x7)) + ((u64)x23 * x20)) + ((u64)x38 * x5));
-+ { u64 x50 = (((((0x2 * ((((((u64)x33 * x15) + ((u64)x29 * x19)) + ((u64)x37 * x11)) + ((u64)x25 * x20)) + ((u64)x38 * x7))) + ((u64)x31 * x17)) + ((u64)x35 * x13)) + ((u64)x27 * x21)) + ((u64)x39 * x9));
-+ { u64 x51 = (((((((((u64)x33 * x17) + ((u64)x35 * x15)) + ((u64)x31 * x19)) + ((u64)x37 * x13)) + ((u64)x29 * x21)) + ((u64)x39 * x11)) + ((u64)x27 * x20)) + ((u64)x38 * x9));
-+ { u64 x52 = (((((u64)x35 * x17) + (0x2 * (((((u64)x33 * x19) + ((u64)x37 * x15)) + ((u64)x29 * x20)) + ((u64)x38 * x11)))) + ((u64)x31 * x21)) + ((u64)x39 * x13));
-+ { u64 x53 = (((((((u64)x35 * x19) + ((u64)x37 * x17)) + ((u64)x33 * x21)) + ((u64)x39 * x15)) + ((u64)x31 * x20)) + ((u64)x38 * x13));
-+ { u64 x54 = (((0x2 * ((((u64)x37 * x19) + ((u64)x33 * x20)) + ((u64)x38 * x15))) + ((u64)x35 * x21)) + ((u64)x39 * x17));
-+ { u64 x55 = (((((u64)x37 * x21) + ((u64)x39 * x19)) + ((u64)x35 * x20)) + ((u64)x38 * x17));
-+ { u64 x56 = (((u64)x39 * x21) + (0x2 * (((u64)x37 * x20) + ((u64)x38 * x19))));
-+ { u64 x57 = (((u64)x39 * x20) + ((u64)x38 * x21));
-+ { u64 x58 = ((u64)(0x2 * x38) * x20);
-+ { u64 x59 = (x48 + (x58 << 0x4));
-+ { u64 x60 = (x59 + (x58 << 0x1));
-+ { u64 x61 = (x60 + x58);
-+ { u64 x62 = (x47 + (x57 << 0x4));
-+ { u64 x63 = (x62 + (x57 << 0x1));
-+ { u64 x64 = (x63 + x57);
-+ { u64 x65 = (x46 + (x56 << 0x4));
-+ { u64 x66 = (x65 + (x56 << 0x1));
-+ { u64 x67 = (x66 + x56);
-+ { u64 x68 = (x45 + (x55 << 0x4));
-+ { u64 x69 = (x68 + (x55 << 0x1));
-+ { u64 x70 = (x69 + x55);
-+ { u64 x71 = (x44 + (x54 << 0x4));
-+ { u64 x72 = (x71 + (x54 << 0x1));
-+ { u64 x73 = (x72 + x54);
-+ { u64 x74 = (x43 + (x53 << 0x4));
-+ { u64 x75 = (x74 + (x53 << 0x1));
-+ { u64 x76 = (x75 + x53);
-+ { u64 x77 = (x42 + (x52 << 0x4));
-+ { u64 x78 = (x77 + (x52 << 0x1));
-+ { u64 x79 = (x78 + x52);
-+ { u64 x80 = (x41 + (x51 << 0x4));
-+ { u64 x81 = (x80 + (x51 << 0x1));
-+ { u64 x82 = (x81 + x51);
-+ { u64 x83 = (x40 + (x50 << 0x4));
-+ { u64 x84 = (x83 + (x50 << 0x1));
-+ { u64 x85 = (x84 + x50);
-+ { u64 x86 = (x85 >> 0x1a);
-+ { u32 x87 = ((u32)x85 & 0x3ffffff);
-+ { u64 x88 = (x86 + x82);
-+ { u64 x89 = (x88 >> 0x19);
-+ { u32 x90 = ((u32)x88 & 0x1ffffff);
-+ { u64 x91 = (x89 + x79);
-+ { u64 x92 = (x91 >> 0x1a);
-+ { u32 x93 = ((u32)x91 & 0x3ffffff);
-+ { u64 x94 = (x92 + x76);
-+ { u64 x95 = (x94 >> 0x19);
-+ { u32 x96 = ((u32)x94 & 0x1ffffff);
-+ { u64 x97 = (x95 + x73);
-+ { u64 x98 = (x97 >> 0x1a);
-+ { u32 x99 = ((u32)x97 & 0x3ffffff);
-+ { u64 x100 = (x98 + x70);
-+ { u64 x101 = (x100 >> 0x19);
-+ { u32 x102 = ((u32)x100 & 0x1ffffff);
-+ { u64 x103 = (x101 + x67);
-+ { u64 x104 = (x103 >> 0x1a);
-+ { u32 x105 = ((u32)x103 & 0x3ffffff);
-+ { u64 x106 = (x104 + x64);
-+ { u64 x107 = (x106 >> 0x19);
-+ { u32 x108 = ((u32)x106 & 0x1ffffff);
-+ { u64 x109 = (x107 + x61);
-+ { u64 x110 = (x109 >> 0x1a);
-+ { u32 x111 = ((u32)x109 & 0x3ffffff);
-+ { u64 x112 = (x110 + x49);
-+ { u64 x113 = (x112 >> 0x19);
-+ { u32 x114 = ((u32)x112 & 0x1ffffff);
-+ { u64 x115 = (x87 + (0x13 * x113));
-+ { u32 x116 = (u32) (x115 >> 0x1a);
-+ { u32 x117 = ((u32)x115 & 0x3ffffff);
-+ { u32 x118 = (x116 + x90);
-+ { u32 x119 = (x118 >> 0x19);
-+ { u32 x120 = (x118 & 0x1ffffff);
-+ out[0] = x117;
-+ out[1] = x120;
-+ out[2] = (x119 + x93);
-+ out[3] = x96;
-+ out[4] = x99;
-+ out[5] = x102;
-+ out[6] = x105;
-+ out[7] = x108;
-+ out[8] = x111;
-+ out[9] = x114;
-+ }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
-+}
-+
-+static __always_inline void fe_mul_ttt(fe *h, const fe *f, const fe *g)
-+{
-+ fe_mul_impl(h->v, f->v, g->v);
-+}
-+
-+static __always_inline void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g)
-+{
-+ fe_mul_impl(h->v, f->v, g->v);
-+}
-+
-+static __always_inline void
-+fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g)
-+{
-+ fe_mul_impl(h->v, f->v, g->v);
-+}
-+
-+static void fe_sqr_impl(u32 out[10], const u32 in1[10])
-+{
-+ { const u32 x17 = in1[9];
-+ { const u32 x18 = in1[8];
-+ { const u32 x16 = in1[7];
-+ { const u32 x14 = in1[6];
-+ { const u32 x12 = in1[5];
-+ { const u32 x10 = in1[4];
-+ { const u32 x8 = in1[3];
-+ { const u32 x6 = in1[2];
-+ { const u32 x4 = in1[1];
-+ { const u32 x2 = in1[0];
-+ { u64 x19 = ((u64)x2 * x2);
-+ { u64 x20 = ((u64)(0x2 * x2) * x4);
-+ { u64 x21 = (0x2 * (((u64)x4 * x4) + ((u64)x2 * x6)));
-+ { u64 x22 = (0x2 * (((u64)x4 * x6) + ((u64)x2 * x8)));
-+ { u64 x23 = ((((u64)x6 * x6) + ((u64)(0x4 * x4) * x8)) + ((u64)(0x2 * x2) * x10));
-+ { u64 x24 = (0x2 * ((((u64)x6 * x8) + ((u64)x4 * x10)) + ((u64)x2 * x12)));
-+ { u64 x25 = (0x2 * (((((u64)x8 * x8) + ((u64)x6 * x10)) + ((u64)x2 * x14)) + ((u64)(0x2 * x4) * x12)));
-+ { u64 x26 = (0x2 * (((((u64)x8 * x10) + ((u64)x6 * x12)) + ((u64)x4 * x14)) + ((u64)x2 * x16)));
-+ { u64 x27 = (((u64)x10 * x10) + (0x2 * ((((u64)x6 * x14) + ((u64)x2 * x18)) + (0x2 * (((u64)x4 * x16) + ((u64)x8 * x12))))));
-+ { u64 x28 = (0x2 * ((((((u64)x10 * x12) + ((u64)x8 * x14)) + ((u64)x6 * x16)) + ((u64)x4 * x18)) + ((u64)x2 * x17)));
-+ { u64 x29 = (0x2 * (((((u64)x12 * x12) + ((u64)x10 * x14)) + ((u64)x6 * x18)) + (0x2 * (((u64)x8 * x16) + ((u64)x4 * x17)))));
-+ { u64 x30 = (0x2 * (((((u64)x12 * x14) + ((u64)x10 * x16)) + ((u64)x8 * x18)) + ((u64)x6 * x17)));
-+ { u64 x31 = (((u64)x14 * x14) + (0x2 * (((u64)x10 * x18) + (0x2 * (((u64)x12 * x16) + ((u64)x8 * x17))))));
-+ { u64 x32 = (0x2 * ((((u64)x14 * x16) + ((u64)x12 * x18)) + ((u64)x10 * x17)));
-+ { u64 x33 = (0x2 * ((((u64)x16 * x16) + ((u64)x14 * x18)) + ((u64)(0x2 * x12) * x17)));
-+ { u64 x34 = (0x2 * (((u64)x16 * x18) + ((u64)x14 * x17)));
-+ { u64 x35 = (((u64)x18 * x18) + ((u64)(0x4 * x16) * x17));
-+ { u64 x36 = ((u64)(0x2 * x18) * x17);
-+ { u64 x37 = ((u64)(0x2 * x17) * x17);
-+ { u64 x38 = (x27 + (x37 << 0x4));
-+ { u64 x39 = (x38 + (x37 << 0x1));
-+ { u64 x40 = (x39 + x37);
-+ { u64 x41 = (x26 + (x36 << 0x4));
-+ { u64 x42 = (x41 + (x36 << 0x1));
-+ { u64 x43 = (x42 + x36);
-+ { u64 x44 = (x25 + (x35 << 0x4));
-+ { u64 x45 = (x44 + (x35 << 0x1));
-+ { u64 x46 = (x45 + x35);
-+ { u64 x47 = (x24 + (x34 << 0x4));
-+ { u64 x48 = (x47 + (x34 << 0x1));
-+ { u64 x49 = (x48 + x34);
-+ { u64 x50 = (x23 + (x33 << 0x4));
-+ { u64 x51 = (x50 + (x33 << 0x1));
-+ { u64 x52 = (x51 + x33);
-+ { u64 x53 = (x22 + (x32 << 0x4));
-+ { u64 x54 = (x53 + (x32 << 0x1));
-+ { u64 x55 = (x54 + x32);
-+ { u64 x56 = (x21 + (x31 << 0x4));
-+ { u64 x57 = (x56 + (x31 << 0x1));
-+ { u64 x58 = (x57 + x31);
-+ { u64 x59 = (x20 + (x30 << 0x4));
-+ { u64 x60 = (x59 + (x30 << 0x1));
-+ { u64 x61 = (x60 + x30);
-+ { u64 x62 = (x19 + (x29 << 0x4));
-+ { u64 x63 = (x62 + (x29 << 0x1));
-+ { u64 x64 = (x63 + x29);
-+ { u64 x65 = (x64 >> 0x1a);
-+ { u32 x66 = ((u32)x64 & 0x3ffffff);
-+ { u64 x67 = (x65 + x61);
-+ { u64 x68 = (x67 >> 0x19);
-+ { u32 x69 = ((u32)x67 & 0x1ffffff);
-+ { u64 x70 = (x68 + x58);
-+ { u64 x71 = (x70 >> 0x1a);
-+ { u32 x72 = ((u32)x70 & 0x3ffffff);
-+ { u64 x73 = (x71 + x55);
-+ { u64 x74 = (x73 >> 0x19);
-+ { u32 x75 = ((u32)x73 & 0x1ffffff);
-+ { u64 x76 = (x74 + x52);
-+ { u64 x77 = (x76 >> 0x1a);
-+ { u32 x78 = ((u32)x76 & 0x3ffffff);
-+ { u64 x79 = (x77 + x49);
-+ { u64 x80 = (x79 >> 0x19);
-+ { u32 x81 = ((u32)x79 & 0x1ffffff);
-+ { u64 x82 = (x80 + x46);
-+ { u64 x83 = (x82 >> 0x1a);
-+ { u32 x84 = ((u32)x82 & 0x3ffffff);
-+ { u64 x85 = (x83 + x43);
-+ { u64 x86 = (x85 >> 0x19);
-+ { u32 x87 = ((u32)x85 & 0x1ffffff);
-+ { u64 x88 = (x86 + x40);
-+ { u64 x89 = (x88 >> 0x1a);
-+ { u32 x90 = ((u32)x88 & 0x3ffffff);
-+ { u64 x91 = (x89 + x28);
-+ { u64 x92 = (x91 >> 0x19);
-+ { u32 x93 = ((u32)x91 & 0x1ffffff);
-+ { u64 x94 = (x66 + (0x13 * x92));
-+ { u32 x95 = (u32) (x94 >> 0x1a);
-+ { u32 x96 = ((u32)x94 & 0x3ffffff);
-+ { u32 x97 = (x95 + x69);
-+ { u32 x98 = (x97 >> 0x19);
-+ { u32 x99 = (x97 & 0x1ffffff);
-+ out[0] = x96;
-+ out[1] = x99;
-+ out[2] = (x98 + x72);
-+ out[3] = x75;
-+ out[4] = x78;
-+ out[5] = x81;
-+ out[6] = x84;
-+ out[7] = x87;
-+ out[8] = x90;
-+ out[9] = x93;
-+ }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
-+}
-+
-+static __always_inline void fe_sq_tl(fe *h, const fe_loose *f)
-+{
-+ fe_sqr_impl(h->v, f->v);
-+}
-+
-+static __always_inline void fe_sq_tt(fe *h, const fe *f)
-+{
-+ fe_sqr_impl(h->v, f->v);
-+}
-+
-+static __always_inline void fe_loose_invert(fe *out, const fe_loose *z)
-+{
-+ fe t0;
-+ fe t1;
-+ fe t2;
-+ fe t3;
-+ int i;
-+
-+ fe_sq_tl(&t0, z);
-+ fe_sq_tt(&t1, &t0);
-+ for (i = 1; i < 2; ++i)
-+ fe_sq_tt(&t1, &t1);
-+ fe_mul_tlt(&t1, z, &t1);
-+ fe_mul_ttt(&t0, &t0, &t1);
-+ fe_sq_tt(&t2, &t0);
-+ fe_mul_ttt(&t1, &t1, &t2);
-+ fe_sq_tt(&t2, &t1);
-+ for (i = 1; i < 5; ++i)
-+ fe_sq_tt(&t2, &t2);
-+ fe_mul_ttt(&t1, &t2, &t1);
-+ fe_sq_tt(&t2, &t1);
-+ for (i = 1; i < 10; ++i)
-+ fe_sq_tt(&t2, &t2);
-+ fe_mul_ttt(&t2, &t2, &t1);
-+ fe_sq_tt(&t3, &t2);
-+ for (i = 1; i < 20; ++i)
-+ fe_sq_tt(&t3, &t3);
-+ fe_mul_ttt(&t2, &t3, &t2);
-+ fe_sq_tt(&t2, &t2);
-+ for (i = 1; i < 10; ++i)
-+ fe_sq_tt(&t2, &t2);
-+ fe_mul_ttt(&t1, &t2, &t1);
-+ fe_sq_tt(&t2, &t1);
-+ for (i = 1; i < 50; ++i)
-+ fe_sq_tt(&t2, &t2);
-+ fe_mul_ttt(&t2, &t2, &t1);
-+ fe_sq_tt(&t3, &t2);
-+ for (i = 1; i < 100; ++i)
-+ fe_sq_tt(&t3, &t3);
-+ fe_mul_ttt(&t2, &t3, &t2);
-+ fe_sq_tt(&t2, &t2);
-+ for (i = 1; i < 50; ++i)
-+ fe_sq_tt(&t2, &t2);
-+ fe_mul_ttt(&t1, &t2, &t1);
-+ fe_sq_tt(&t1, &t1);
-+ for (i = 1; i < 5; ++i)
-+ fe_sq_tt(&t1, &t1);
-+ fe_mul_ttt(out, &t1, &t0);
-+}
-+
-+static __always_inline void fe_invert(fe *out, const fe *z)
-+{
-+ fe_loose l;
-+ fe_copy_lt(&l, z);
-+ fe_loose_invert(out, &l);
-+}
-+
-+/* Replace (f,g) with (g,f) if b == 1;
-+ * replace (f,g) with (f,g) if b == 0.
-+ *
-+ * Preconditions: b in {0,1}
-+ */
-+static __always_inline void fe_cswap(fe *f, fe *g, unsigned int b)
-+{
-+ unsigned i;
-+ b = 0 - b;
-+ for (i = 0; i < 10; i++) {
-+ u32 x = f->v[i] ^ g->v[i];
-+ x &= b;
-+ f->v[i] ^= x;
-+ g->v[i] ^= x;
-+ }
-+}
-+
-+/* NOTE: based on fiat-crypto fe_mul, edited for in2=121666, 0, 0.*/
-+static __always_inline void fe_mul_121666_impl(u32 out[10], const u32 in1[10])
-+{
-+ { const u32 x20 = in1[9];
-+ { const u32 x21 = in1[8];
-+ { const u32 x19 = in1[7];
-+ { const u32 x17 = in1[6];
-+ { const u32 x15 = in1[5];
-+ { const u32 x13 = in1[4];
-+ { const u32 x11 = in1[3];
-+ { const u32 x9 = in1[2];
-+ { const u32 x7 = in1[1];
-+ { const u32 x5 = in1[0];
-+ { const u32 x38 = 0;
-+ { const u32 x39 = 0;
-+ { const u32 x37 = 0;
-+ { const u32 x35 = 0;
-+ { const u32 x33 = 0;
-+ { const u32 x31 = 0;
-+ { const u32 x29 = 0;
-+ { const u32 x27 = 0;
-+ { const u32 x25 = 0;
-+ { const u32 x23 = 121666;
-+ { u64 x40 = ((u64)x23 * x5);
-+ { u64 x41 = (((u64)x23 * x7) + ((u64)x25 * x5));
-+ { u64 x42 = ((((u64)(0x2 * x25) * x7) + ((u64)x23 * x9)) + ((u64)x27 * x5));
-+ { u64 x43 = (((((u64)x25 * x9) + ((u64)x27 * x7)) + ((u64)x23 * x11)) + ((u64)x29 * x5));
-+ { u64 x44 = (((((u64)x27 * x9) + (0x2 * (((u64)x25 * x11) + ((u64)x29 * x7)))) + ((u64)x23 * x13)) + ((u64)x31 * x5));
-+ { u64 x45 = (((((((u64)x27 * x11) + ((u64)x29 * x9)) + ((u64)x25 * x13)) + ((u64)x31 * x7)) + ((u64)x23 * x15)) + ((u64)x33 * x5));
-+ { u64 x46 = (((((0x2 * ((((u64)x29 * x11) + ((u64)x25 * x15)) + ((u64)x33 * x7))) + ((u64)x27 * x13)) + ((u64)x31 * x9)) + ((u64)x23 * x17)) + ((u64)x35 * x5));
-+ { u64 x47 = (((((((((u64)x29 * x13) + ((u64)x31 * x11)) + ((u64)x27 * x15)) + ((u64)x33 * x9)) + ((u64)x25 * x17)) + ((u64)x35 * x7)) + ((u64)x23 * x19)) + ((u64)x37 * x5));
-+ { u64 x48 = (((((((u64)x31 * x13) + (0x2 * (((((u64)x29 * x15) + ((u64)x33 * x11)) + ((u64)x25 * x19)) + ((u64)x37 * x7)))) + ((u64)x27 * x17)) + ((u64)x35 * x9)) + ((u64)x23 * x21)) + ((u64)x39 * x5));
-+ { u64 x49 = (((((((((((u64)x31 * x15) + ((u64)x33 * x13)) + ((u64)x29 * x17)) + ((u64)x35 * x11)) + ((u64)x27 * x19)) + ((u64)x37 * x9)) + ((u64)x25 * x21)) + ((u64)x39 * x7)) + ((u64)x23 * x20)) + ((u64)x38 * x5));
-+ { u64 x50 = (((((0x2 * ((((((u64)x33 * x15) + ((u64)x29 * x19)) + ((u64)x37 * x11)) + ((u64)x25 * x20)) + ((u64)x38 * x7))) + ((u64)x31 * x17)) + ((u64)x35 * x13)) + ((u64)x27 * x21)) + ((u64)x39 * x9));
-+ { u64 x51 = (((((((((u64)x33 * x17) + ((u64)x35 * x15)) + ((u64)x31 * x19)) + ((u64)x37 * x13)) + ((u64)x29 * x21)) + ((u64)x39 * x11)) + ((u64)x27 * x20)) + ((u64)x38 * x9));
-+ { u64 x52 = (((((u64)x35 * x17) + (0x2 * (((((u64)x33 * x19) + ((u64)x37 * x15)) + ((u64)x29 * x20)) + ((u64)x38 * x11)))) + ((u64)x31 * x21)) + ((u64)x39 * x13));
-+ { u64 x53 = (((((((u64)x35 * x19) + ((u64)x37 * x17)) + ((u64)x33 * x21)) + ((u64)x39 * x15)) + ((u64)x31 * x20)) + ((u64)x38 * x13));
-+ { u64 x54 = (((0x2 * ((((u64)x37 * x19) + ((u64)x33 * x20)) + ((u64)x38 * x15))) + ((u64)x35 * x21)) + ((u64)x39 * x17));
-+ { u64 x55 = (((((u64)x37 * x21) + ((u64)x39 * x19)) + ((u64)x35 * x20)) + ((u64)x38 * x17));
-+ { u64 x56 = (((u64)x39 * x21) + (0x2 * (((u64)x37 * x20) + ((u64)x38 * x19))));
-+ { u64 x57 = (((u64)x39 * x20) + ((u64)x38 * x21));
-+ { u64 x58 = ((u64)(0x2 * x38) * x20);
-+ { u64 x59 = (x48 + (x58 << 0x4));
-+ { u64 x60 = (x59 + (x58 << 0x1));
-+ { u64 x61 = (x60 + x58);
-+ { u64 x62 = (x47 + (x57 << 0x4));
-+ { u64 x63 = (x62 + (x57 << 0x1));
-+ { u64 x64 = (x63 + x57);
-+ { u64 x65 = (x46 + (x56 << 0x4));
-+ { u64 x66 = (x65 + (x56 << 0x1));
-+ { u64 x67 = (x66 + x56);
-+ { u64 x68 = (x45 + (x55 << 0x4));
-+ { u64 x69 = (x68 + (x55 << 0x1));
-+ { u64 x70 = (x69 + x55);
-+ { u64 x71 = (x44 + (x54 << 0x4));
-+ { u64 x72 = (x71 + (x54 << 0x1));
-+ { u64 x73 = (x72 + x54);
-+ { u64 x74 = (x43 + (x53 << 0x4));
-+ { u64 x75 = (x74 + (x53 << 0x1));
-+ { u64 x76 = (x75 + x53);
-+ { u64 x77 = (x42 + (x52 << 0x4));
-+ { u64 x78 = (x77 + (x52 << 0x1));
-+ { u64 x79 = (x78 + x52);
-+ { u64 x80 = (x41 + (x51 << 0x4));
-+ { u64 x81 = (x80 + (x51 << 0x1));
-+ { u64 x82 = (x81 + x51);
-+ { u64 x83 = (x40 + (x50 << 0x4));
-+ { u64 x84 = (x83 + (x50 << 0x1));
-+ { u64 x85 = (x84 + x50);
-+ { u64 x86 = (x85 >> 0x1a);
-+ { u32 x87 = ((u32)x85 & 0x3ffffff);
-+ { u64 x88 = (x86 + x82);
-+ { u64 x89 = (x88 >> 0x19);
-+ { u32 x90 = ((u32)x88 & 0x1ffffff);
-+ { u64 x91 = (x89 + x79);
-+ { u64 x92 = (x91 >> 0x1a);
-+ { u32 x93 = ((u32)x91 & 0x3ffffff);
-+ { u64 x94 = (x92 + x76);
-+ { u64 x95 = (x94 >> 0x19);
-+ { u32 x96 = ((u32)x94 & 0x1ffffff);
-+ { u64 x97 = (x95 + x73);
-+ { u64 x98 = (x97 >> 0x1a);
-+ { u32 x99 = ((u32)x97 & 0x3ffffff);
-+ { u64 x100 = (x98 + x70);
-+ { u64 x101 = (x100 >> 0x19);
-+ { u32 x102 = ((u32)x100 & 0x1ffffff);
-+ { u64 x103 = (x101 + x67);
-+ { u64 x104 = (x103 >> 0x1a);
-+ { u32 x105 = ((u32)x103 & 0x3ffffff);
-+ { u64 x106 = (x104 + x64);
-+ { u64 x107 = (x106 >> 0x19);
-+ { u32 x108 = ((u32)x106 & 0x1ffffff);
-+ { u64 x109 = (x107 + x61);
-+ { u64 x110 = (x109 >> 0x1a);
-+ { u32 x111 = ((u32)x109 & 0x3ffffff);
-+ { u64 x112 = (x110 + x49);
-+ { u64 x113 = (x112 >> 0x19);
-+ { u32 x114 = ((u32)x112 & 0x1ffffff);
-+ { u64 x115 = (x87 + (0x13 * x113));
-+ { u32 x116 = (u32) (x115 >> 0x1a);
-+ { u32 x117 = ((u32)x115 & 0x3ffffff);
-+ { u32 x118 = (x116 + x90);
-+ { u32 x119 = (x118 >> 0x19);
-+ { u32 x120 = (x118 & 0x1ffffff);
-+ out[0] = x117;
-+ out[1] = x120;
-+ out[2] = (x119 + x93);
-+ out[3] = x96;
-+ out[4] = x99;
-+ out[5] = x102;
-+ out[6] = x105;
-+ out[7] = x108;
-+ out[8] = x111;
-+ out[9] = x114;
-+ }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
-+}
-+
-+static __always_inline void fe_mul121666(fe *h, const fe_loose *f)
-+{
-+ fe_mul_121666_impl(h->v, f->v);
-+}
-+
-+void curve25519_generic(u8 out[CURVE25519_KEY_SIZE],
-+ const u8 scalar[CURVE25519_KEY_SIZE],
-+ const u8 point[CURVE25519_KEY_SIZE])
-+{
-+ fe x1, x2, z2, x3, z3;
-+ fe_loose x2l, z2l, x3l;
-+ unsigned swap = 0;
-+ int pos;
-+ u8 e[32];
-+
-+ memcpy(e, scalar, 32);
-+ curve25519_clamp_secret(e);
-+
-+ /* The following implementation was transcribed to Coq and proven to
-+ * correspond to unary scalar multiplication in affine coordinates given
-+ * that x1 != 0 is the x coordinate of some point on the curve. It was
-+ * also checked in Coq that doing a ladderstep with x1 = x3 = 0 gives
-+ * z2' = z3' = 0, and z2 = z3 = 0 gives z2' = z3' = 0. The statement was
-+ * quantified over the underlying field, so it applies to Curve25519
-+ * itself and the quadratic twist of Curve25519. It was not proven in
-+ * Coq that prime-field arithmetic correctly simulates extension-field
-+ * arithmetic on prime-field values. The decoding of the byte array
-+ * representation of e was not considered.
-+ *
-+ * Specification of Montgomery curves in affine coordinates:
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Spec/MontgomeryCurve.v#L27>
-+ *
-+ * Proof that these form a group that is isomorphic to a Weierstrass
-+ * curve:
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/AffineProofs.v#L35>
-+ *
-+ * Coq transcription and correctness proof of the loop
-+ * (where scalarbits=255):
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZ.v#L118>
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L278>
-+ * preconditions: 0 <= e < 2^255 (not necessarily e < order),
-+ * fe_invert(0) = 0
-+ */
-+ fe_frombytes(&x1, point);
-+ fe_1(&x2);
-+ fe_0(&z2);
-+ fe_copy(&x3, &x1);
-+ fe_1(&z3);
-+
-+ for (pos = 254; pos >= 0; --pos) {
-+ fe tmp0, tmp1;
-+ fe_loose tmp0l, tmp1l;
-+ /* loop invariant as of right before the test, for the case
-+ * where x1 != 0:
-+ * pos >= -1; if z2 = 0 then x2 is nonzero; if z3 = 0 then x3
-+ * is nonzero
-+ * let r := e >> (pos+1) in the following equalities of
-+ * projective points:
-+ * to_xz (r*P) === if swap then (x3, z3) else (x2, z2)
-+ * to_xz ((r+1)*P) === if swap then (x2, z2) else (x3, z3)
-+ * x1 is the nonzero x coordinate of the nonzero
-+ * point (r*P-(r+1)*P)
-+ */
-+ unsigned b = 1 & (e[pos / 8] >> (pos & 7));
-+ swap ^= b;
-+ fe_cswap(&x2, &x3, swap);
-+ fe_cswap(&z2, &z3, swap);
-+ swap = b;
-+ /* Coq transcription of ladderstep formula (called from
-+ * transcribed loop):
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZ.v#L89>
-+ * <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L131>
-+ * x1 != 0 <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L217>
-+ * x1 = 0 <https://github.com/mit-plv/fiat-crypto/blob/2456d821825521f7e03e65882cc3521795b0320f/src/Curves/Montgomery/XZProofs.v#L147>
-+ */
-+ fe_sub(&tmp0l, &x3, &z3);
-+ fe_sub(&tmp1l, &x2, &z2);
-+ fe_add(&x2l, &x2, &z2);
-+ fe_add(&z2l, &x3, &z3);
-+ fe_mul_tll(&z3, &tmp0l, &x2l);
-+ fe_mul_tll(&z2, &z2l, &tmp1l);
-+ fe_sq_tl(&tmp0, &tmp1l);
-+ fe_sq_tl(&tmp1, &x2l);
-+ fe_add(&x3l, &z3, &z2);
-+ fe_sub(&z2l, &z3, &z2);
-+ fe_mul_ttt(&x2, &tmp1, &tmp0);
-+ fe_sub(&tmp1l, &tmp1, &tmp0);
-+ fe_sq_tl(&z2, &z2l);
-+ fe_mul121666(&z3, &tmp1l);
-+ fe_sq_tl(&x3, &x3l);
-+ fe_add(&tmp0l, &tmp0, &z3);
-+ fe_mul_ttt(&z3, &x1, &z2);
-+ fe_mul_tll(&z2, &tmp1l, &tmp0l);
-+ }
-+ /* here pos=-1, so r=e, so to_xz (e*P) === if swap then (x3, z3)
-+ * else (x2, z2)
-+ */
-+ fe_cswap(&x2, &x3, swap);
-+ fe_cswap(&z2, &z3, swap);
-+
-+ fe_invert(&z2, &z2);
-+ fe_mul_ttt(&x2, &x2, &z2);
-+ fe_tobytes(out, &x2);
-+
-+ memzero_explicit(&x1, sizeof(x1));
-+ memzero_explicit(&x2, sizeof(x2));
-+ memzero_explicit(&z2, sizeof(z2));
-+ memzero_explicit(&x3, sizeof(x3));
-+ memzero_explicit(&z3, sizeof(z3));
-+ memzero_explicit(&x2l, sizeof(x2l));
-+ memzero_explicit(&z2l, sizeof(z2l));
-+ memzero_explicit(&x3l, sizeof(x3l));
-+ memzero_explicit(&e, sizeof(e));
-+}
---- /dev/null
-+++ b/lib/crypto/curve25519-hacl64.c
-@@ -0,0 +1,788 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2016-2017 INRIA and Microsoft Corporation.
-+ * Copyright (C) 2018-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is a machine-generated formally verified implementation of Curve25519
-+ * ECDH from: <https://github.com/mitls/hacl-star>. Though originally machine
-+ * generated, it has been tweaked to be suitable for use in the kernel. It is
-+ * optimized for 64-bit machines that can efficiently work with 128-bit
-+ * integer types.
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <crypto/curve25519.h>
-+#include <linux/string.h>
-+
-+typedef __uint128_t u128;
-+
-+static __always_inline u64 u64_eq_mask(u64 a, u64 b)
-+{
-+ u64 x = a ^ b;
-+ u64 minus_x = ~x + (u64)1U;
-+ u64 x_or_minus_x = x | minus_x;
-+ u64 xnx = x_or_minus_x >> (u32)63U;
-+ u64 c = xnx - (u64)1U;
-+ return c;
-+}
-+
-+static __always_inline u64 u64_gte_mask(u64 a, u64 b)
-+{
-+ u64 x = a;
-+ u64 y = b;
-+ u64 x_xor_y = x ^ y;
-+ u64 x_sub_y = x - y;
-+ u64 x_sub_y_xor_y = x_sub_y ^ y;
-+ u64 q = x_xor_y | x_sub_y_xor_y;
-+ u64 x_xor_q = x ^ q;
-+ u64 x_xor_q_ = x_xor_q >> (u32)63U;
-+ u64 c = x_xor_q_ - (u64)1U;
-+ return c;
-+}
-+
-+static __always_inline void modulo_carry_top(u64 *b)
-+{
-+ u64 b4 = b[4];
-+ u64 b0 = b[0];
-+ u64 b4_ = b4 & 0x7ffffffffffffLLU;
-+ u64 b0_ = b0 + 19 * (b4 >> 51);
-+ b[4] = b4_;
-+ b[0] = b0_;
-+}
-+
-+static __always_inline void fproduct_copy_from_wide_(u64 *output, u128 *input)
-+{
-+ {
-+ u128 xi = input[0];
-+ output[0] = ((u64)(xi));
-+ }
-+ {
-+ u128 xi = input[1];
-+ output[1] = ((u64)(xi));
-+ }
-+ {
-+ u128 xi = input[2];
-+ output[2] = ((u64)(xi));
-+ }
-+ {
-+ u128 xi = input[3];
-+ output[3] = ((u64)(xi));
-+ }
-+ {
-+ u128 xi = input[4];
-+ output[4] = ((u64)(xi));
-+ }
-+}
-+
-+static __always_inline void
-+fproduct_sum_scalar_multiplication_(u128 *output, u64 *input, u64 s)
-+{
-+ output[0] += (u128)input[0] * s;
-+ output[1] += (u128)input[1] * s;
-+ output[2] += (u128)input[2] * s;
-+ output[3] += (u128)input[3] * s;
-+ output[4] += (u128)input[4] * s;
-+}
-+
-+static __always_inline void fproduct_carry_wide_(u128 *tmp)
-+{
-+ {
-+ u32 ctr = 0;
-+ u128 tctr = tmp[ctr];
-+ u128 tctrp1 = tmp[ctr + 1];
-+ u64 r0 = ((u64)(tctr)) & 0x7ffffffffffffLLU;
-+ u128 c = ((tctr) >> (51));
-+ tmp[ctr] = ((u128)(r0));
-+ tmp[ctr + 1] = ((tctrp1) + (c));
-+ }
-+ {
-+ u32 ctr = 1;
-+ u128 tctr = tmp[ctr];
-+ u128 tctrp1 = tmp[ctr + 1];
-+ u64 r0 = ((u64)(tctr)) & 0x7ffffffffffffLLU;
-+ u128 c = ((tctr) >> (51));
-+ tmp[ctr] = ((u128)(r0));
-+ tmp[ctr + 1] = ((tctrp1) + (c));
-+ }
-+
-+ {
-+ u32 ctr = 2;
-+ u128 tctr = tmp[ctr];
-+ u128 tctrp1 = tmp[ctr + 1];
-+ u64 r0 = ((u64)(tctr)) & 0x7ffffffffffffLLU;
-+ u128 c = ((tctr) >> (51));
-+ tmp[ctr] = ((u128)(r0));
-+ tmp[ctr + 1] = ((tctrp1) + (c));
-+ }
-+ {
-+ u32 ctr = 3;
-+ u128 tctr = tmp[ctr];
-+ u128 tctrp1 = tmp[ctr + 1];
-+ u64 r0 = ((u64)(tctr)) & 0x7ffffffffffffLLU;
-+ u128 c = ((tctr) >> (51));
-+ tmp[ctr] = ((u128)(r0));
-+ tmp[ctr + 1] = ((tctrp1) + (c));
-+ }
-+}
-+
-+static __always_inline void fmul_shift_reduce(u64 *output)
-+{
-+ u64 tmp = output[4];
-+ u64 b0;
-+ {
-+ u32 ctr = 5 - 0 - 1;
-+ u64 z = output[ctr - 1];
-+ output[ctr] = z;
-+ }
-+ {
-+ u32 ctr = 5 - 1 - 1;
-+ u64 z = output[ctr - 1];
-+ output[ctr] = z;
-+ }
-+ {
-+ u32 ctr = 5 - 2 - 1;
-+ u64 z = output[ctr - 1];
-+ output[ctr] = z;
-+ }
-+ {
-+ u32 ctr = 5 - 3 - 1;
-+ u64 z = output[ctr - 1];
-+ output[ctr] = z;
-+ }
-+ output[0] = tmp;
-+ b0 = output[0];
-+ output[0] = 19 * b0;
-+}
-+
-+static __always_inline void fmul_mul_shift_reduce_(u128 *output, u64 *input,
-+ u64 *input21)
-+{
-+ u32 i;
-+ u64 input2i;
-+ {
-+ u64 input2i = input21[0];
-+ fproduct_sum_scalar_multiplication_(output, input, input2i);
-+ fmul_shift_reduce(input);
-+ }
-+ {
-+ u64 input2i = input21[1];
-+ fproduct_sum_scalar_multiplication_(output, input, input2i);
-+ fmul_shift_reduce(input);
-+ }
-+ {
-+ u64 input2i = input21[2];
-+ fproduct_sum_scalar_multiplication_(output, input, input2i);
-+ fmul_shift_reduce(input);
-+ }
-+ {
-+ u64 input2i = input21[3];
-+ fproduct_sum_scalar_multiplication_(output, input, input2i);
-+ fmul_shift_reduce(input);
-+ }
-+ i = 4;
-+ input2i = input21[i];
-+ fproduct_sum_scalar_multiplication_(output, input, input2i);
-+}
-+
-+static __always_inline void fmul_fmul(u64 *output, u64 *input, u64 *input21)
-+{
-+ u64 tmp[5] = { input[0], input[1], input[2], input[3], input[4] };
-+ {
-+ u128 b4;
-+ u128 b0;
-+ u128 b4_;
-+ u128 b0_;
-+ u64 i0;
-+ u64 i1;
-+ u64 i0_;
-+ u64 i1_;
-+ u128 t[5] = { 0 };
-+ fmul_mul_shift_reduce_(t, tmp, input21);
-+ fproduct_carry_wide_(t);
-+ b4 = t[4];
-+ b0 = t[0];
-+ b4_ = ((b4) & (((u128)(0x7ffffffffffffLLU))));
-+ b0_ = ((b0) + (((u128)(19) * (((u64)(((b4) >> (51))))))));
-+ t[4] = b4_;
-+ t[0] = b0_;
-+ fproduct_copy_from_wide_(output, t);
-+ i0 = output[0];
-+ i1 = output[1];
-+ i0_ = i0 & 0x7ffffffffffffLLU;
-+ i1_ = i1 + (i0 >> 51);
-+ output[0] = i0_;
-+ output[1] = i1_;
-+ }
-+}
-+
-+static __always_inline void fsquare_fsquare__(u128 *tmp, u64 *output)
-+{
-+ u64 r0 = output[0];
-+ u64 r1 = output[1];
-+ u64 r2 = output[2];
-+ u64 r3 = output[3];
-+ u64 r4 = output[4];
-+ u64 d0 = r0 * 2;
-+ u64 d1 = r1 * 2;
-+ u64 d2 = r2 * 2 * 19;
-+ u64 d419 = r4 * 19;
-+ u64 d4 = d419 * 2;
-+ u128 s0 = ((((((u128)(r0) * (r0))) + (((u128)(d4) * (r1))))) +
-+ (((u128)(d2) * (r3))));
-+ u128 s1 = ((((((u128)(d0) * (r1))) + (((u128)(d4) * (r2))))) +
-+ (((u128)(r3 * 19) * (r3))));
-+ u128 s2 = ((((((u128)(d0) * (r2))) + (((u128)(r1) * (r1))))) +
-+ (((u128)(d4) * (r3))));
-+ u128 s3 = ((((((u128)(d0) * (r3))) + (((u128)(d1) * (r2))))) +
-+ (((u128)(r4) * (d419))));
-+ u128 s4 = ((((((u128)(d0) * (r4))) + (((u128)(d1) * (r3))))) +
-+ (((u128)(r2) * (r2))));
-+ tmp[0] = s0;
-+ tmp[1] = s1;
-+ tmp[2] = s2;
-+ tmp[3] = s3;
-+ tmp[4] = s4;
-+}
-+
-+static __always_inline void fsquare_fsquare_(u128 *tmp, u64 *output)
-+{
-+ u128 b4;
-+ u128 b0;
-+ u128 b4_;
-+ u128 b0_;
-+ u64 i0;
-+ u64 i1;
-+ u64 i0_;
-+ u64 i1_;
-+ fsquare_fsquare__(tmp, output);
-+ fproduct_carry_wide_(tmp);
-+ b4 = tmp[4];
-+ b0 = tmp[0];
-+ b4_ = ((b4) & (((u128)(0x7ffffffffffffLLU))));
-+ b0_ = ((b0) + (((u128)(19) * (((u64)(((b4) >> (51))))))));
-+ tmp[4] = b4_;
-+ tmp[0] = b0_;
-+ fproduct_copy_from_wide_(output, tmp);
-+ i0 = output[0];
-+ i1 = output[1];
-+ i0_ = i0 & 0x7ffffffffffffLLU;
-+ i1_ = i1 + (i0 >> 51);
-+ output[0] = i0_;
-+ output[1] = i1_;
-+}
-+
-+static __always_inline void fsquare_fsquare_times_(u64 *output, u128 *tmp,
-+ u32 count1)
-+{
-+ u32 i;
-+ fsquare_fsquare_(tmp, output);
-+ for (i = 1; i < count1; ++i)
-+ fsquare_fsquare_(tmp, output);
-+}
-+
-+static __always_inline void fsquare_fsquare_times(u64 *output, u64 *input,
-+ u32 count1)
-+{
-+ u128 t[5];
-+ memcpy(output, input, 5 * sizeof(*input));
-+ fsquare_fsquare_times_(output, t, count1);
-+}
-+
-+static __always_inline void fsquare_fsquare_times_inplace(u64 *output,
-+ u32 count1)
-+{
-+ u128 t[5];
-+ fsquare_fsquare_times_(output, t, count1);
-+}
-+
-+static __always_inline void crecip_crecip(u64 *out, u64 *z)
-+{
-+ u64 buf[20] = { 0 };
-+ u64 *a0 = buf;
-+ u64 *t00 = buf + 5;
-+ u64 *b0 = buf + 10;
-+ u64 *t01;
-+ u64 *b1;
-+ u64 *c0;
-+ u64 *a;
-+ u64 *t0;
-+ u64 *b;
-+ u64 *c;
-+ fsquare_fsquare_times(a0, z, 1);
-+ fsquare_fsquare_times(t00, a0, 2);
-+ fmul_fmul(b0, t00, z);
-+ fmul_fmul(a0, b0, a0);
-+ fsquare_fsquare_times(t00, a0, 1);
-+ fmul_fmul(b0, t00, b0);
-+ fsquare_fsquare_times(t00, b0, 5);
-+ t01 = buf + 5;
-+ b1 = buf + 10;
-+ c0 = buf + 15;
-+ fmul_fmul(b1, t01, b1);
-+ fsquare_fsquare_times(t01, b1, 10);
-+ fmul_fmul(c0, t01, b1);
-+ fsquare_fsquare_times(t01, c0, 20);
-+ fmul_fmul(t01, t01, c0);
-+ fsquare_fsquare_times_inplace(t01, 10);
-+ fmul_fmul(b1, t01, b1);
-+ fsquare_fsquare_times(t01, b1, 50);
-+ a = buf;
-+ t0 = buf + 5;
-+ b = buf + 10;
-+ c = buf + 15;
-+ fmul_fmul(c, t0, b);
-+ fsquare_fsquare_times(t0, c, 100);
-+ fmul_fmul(t0, t0, c);
-+ fsquare_fsquare_times_inplace(t0, 50);
-+ fmul_fmul(t0, t0, b);
-+ fsquare_fsquare_times_inplace(t0, 5);
-+ fmul_fmul(out, t0, a);
-+}
-+
-+static __always_inline void fsum(u64 *a, u64 *b)
-+{
-+ a[0] += b[0];
-+ a[1] += b[1];
-+ a[2] += b[2];
-+ a[3] += b[3];
-+ a[4] += b[4];
-+}
-+
-+static __always_inline void fdifference(u64 *a, u64 *b)
-+{
-+ u64 tmp[5] = { 0 };
-+ u64 b0;
-+ u64 b1;
-+ u64 b2;
-+ u64 b3;
-+ u64 b4;
-+ memcpy(tmp, b, 5 * sizeof(*b));
-+ b0 = tmp[0];
-+ b1 = tmp[1];
-+ b2 = tmp[2];
-+ b3 = tmp[3];
-+ b4 = tmp[4];
-+ tmp[0] = b0 + 0x3fffffffffff68LLU;
-+ tmp[1] = b1 + 0x3ffffffffffff8LLU;
-+ tmp[2] = b2 + 0x3ffffffffffff8LLU;
-+ tmp[3] = b3 + 0x3ffffffffffff8LLU;
-+ tmp[4] = b4 + 0x3ffffffffffff8LLU;
-+ {
-+ u64 xi = a[0];
-+ u64 yi = tmp[0];
-+ a[0] = yi - xi;
-+ }
-+ {
-+ u64 xi = a[1];
-+ u64 yi = tmp[1];
-+ a[1] = yi - xi;
-+ }
-+ {
-+ u64 xi = a[2];
-+ u64 yi = tmp[2];
-+ a[2] = yi - xi;
-+ }
-+ {
-+ u64 xi = a[3];
-+ u64 yi = tmp[3];
-+ a[3] = yi - xi;
-+ }
-+ {
-+ u64 xi = a[4];
-+ u64 yi = tmp[4];
-+ a[4] = yi - xi;
-+ }
-+}
-+
-+static __always_inline void fscalar(u64 *output, u64 *b, u64 s)
-+{
-+ u128 tmp[5];
-+ u128 b4;
-+ u128 b0;
-+ u128 b4_;
-+ u128 b0_;
-+ {
-+ u64 xi = b[0];
-+ tmp[0] = ((u128)(xi) * (s));
-+ }
-+ {
-+ u64 xi = b[1];
-+ tmp[1] = ((u128)(xi) * (s));
-+ }
-+ {
-+ u64 xi = b[2];
-+ tmp[2] = ((u128)(xi) * (s));
-+ }
-+ {
-+ u64 xi = b[3];
-+ tmp[3] = ((u128)(xi) * (s));
-+ }
-+ {
-+ u64 xi = b[4];
-+ tmp[4] = ((u128)(xi) * (s));
-+ }
-+ fproduct_carry_wide_(tmp);
-+ b4 = tmp[4];
-+ b0 = tmp[0];
-+ b4_ = ((b4) & (((u128)(0x7ffffffffffffLLU))));
-+ b0_ = ((b0) + (((u128)(19) * (((u64)(((b4) >> (51))))))));
-+ tmp[4] = b4_;
-+ tmp[0] = b0_;
-+ fproduct_copy_from_wide_(output, tmp);
-+}
-+
-+static __always_inline void fmul(u64 *output, u64 *a, u64 *b)
-+{
-+ fmul_fmul(output, a, b);
-+}
-+
-+static __always_inline void crecip(u64 *output, u64 *input)
-+{
-+ crecip_crecip(output, input);
-+}
-+
-+static __always_inline void point_swap_conditional_step(u64 *a, u64 *b,
-+ u64 swap1, u32 ctr)
-+{
-+ u32 i = ctr - 1;
-+ u64 ai = a[i];
-+ u64 bi = b[i];
-+ u64 x = swap1 & (ai ^ bi);
-+ u64 ai1 = ai ^ x;
-+ u64 bi1 = bi ^ x;
-+ a[i] = ai1;
-+ b[i] = bi1;
-+}
-+
-+static __always_inline void point_swap_conditional5(u64 *a, u64 *b, u64 swap1)
-+{
-+ point_swap_conditional_step(a, b, swap1, 5);
-+ point_swap_conditional_step(a, b, swap1, 4);
-+ point_swap_conditional_step(a, b, swap1, 3);
-+ point_swap_conditional_step(a, b, swap1, 2);
-+ point_swap_conditional_step(a, b, swap1, 1);
-+}
-+
-+static __always_inline void point_swap_conditional(u64 *a, u64 *b, u64 iswap)
-+{
-+ u64 swap1 = 0 - iswap;
-+ point_swap_conditional5(a, b, swap1);
-+ point_swap_conditional5(a + 5, b + 5, swap1);
-+}
-+
-+static __always_inline void point_copy(u64 *output, u64 *input)
-+{
-+ memcpy(output, input, 5 * sizeof(*input));
-+ memcpy(output + 5, input + 5, 5 * sizeof(*input));
-+}
-+
-+static __always_inline void addanddouble_fmonty(u64 *pp, u64 *ppq, u64 *p,
-+ u64 *pq, u64 *qmqp)
-+{
-+ u64 *qx = qmqp;
-+ u64 *x2 = pp;
-+ u64 *z2 = pp + 5;
-+ u64 *x3 = ppq;
-+ u64 *z3 = ppq + 5;
-+ u64 *x = p;
-+ u64 *z = p + 5;
-+ u64 *xprime = pq;
-+ u64 *zprime = pq + 5;
-+ u64 buf[40] = { 0 };
-+ u64 *origx = buf;
-+ u64 *origxprime0 = buf + 5;
-+ u64 *xxprime0;
-+ u64 *zzprime0;
-+ u64 *origxprime;
-+ xxprime0 = buf + 25;
-+ zzprime0 = buf + 30;
-+ memcpy(origx, x, 5 * sizeof(*x));
-+ fsum(x, z);
-+ fdifference(z, origx);
-+ memcpy(origxprime0, xprime, 5 * sizeof(*xprime));
-+ fsum(xprime, zprime);
-+ fdifference(zprime, origxprime0);
-+ fmul(xxprime0, xprime, z);
-+ fmul(zzprime0, x, zprime);
-+ origxprime = buf + 5;
-+ {
-+ u64 *xx0;
-+ u64 *zz0;
-+ u64 *xxprime;
-+ u64 *zzprime;
-+ u64 *zzzprime;
-+ xx0 = buf + 15;
-+ zz0 = buf + 20;
-+ xxprime = buf + 25;
-+ zzprime = buf + 30;
-+ zzzprime = buf + 35;
-+ memcpy(origxprime, xxprime, 5 * sizeof(*xxprime));
-+ fsum(xxprime, zzprime);
-+ fdifference(zzprime, origxprime);
-+ fsquare_fsquare_times(x3, xxprime, 1);
-+ fsquare_fsquare_times(zzzprime, zzprime, 1);
-+ fmul(z3, zzzprime, qx);
-+ fsquare_fsquare_times(xx0, x, 1);
-+ fsquare_fsquare_times(zz0, z, 1);
-+ {
-+ u64 *zzz;
-+ u64 *xx;
-+ u64 *zz;
-+ u64 scalar;
-+ zzz = buf + 10;
-+ xx = buf + 15;
-+ zz = buf + 20;
-+ fmul(x2, xx, zz);
-+ fdifference(zz, xx);
-+ scalar = 121665;
-+ fscalar(zzz, zz, scalar);
-+ fsum(zzz, xx);
-+ fmul(z2, zzz, zz);
-+ }
-+ }
-+}
-+
-+static __always_inline void
-+ladder_smallloop_cmult_small_loop_step(u64 *nq, u64 *nqpq, u64 *nq2, u64 *nqpq2,
-+ u64 *q, u8 byt)
-+{
-+ u64 bit0 = (u64)(byt >> 7);
-+ u64 bit;
-+ point_swap_conditional(nq, nqpq, bit0);
-+ addanddouble_fmonty(nq2, nqpq2, nq, nqpq, q);
-+ bit = (u64)(byt >> 7);
-+ point_swap_conditional(nq2, nqpq2, bit);
-+}
-+
-+static __always_inline void
-+ladder_smallloop_cmult_small_loop_double_step(u64 *nq, u64 *nqpq, u64 *nq2,
-+ u64 *nqpq2, u64 *q, u8 byt)
-+{
-+ u8 byt1;
-+ ladder_smallloop_cmult_small_loop_step(nq, nqpq, nq2, nqpq2, q, byt);
-+ byt1 = byt << 1;
-+ ladder_smallloop_cmult_small_loop_step(nq2, nqpq2, nq, nqpq, q, byt1);
-+}
-+
-+static __always_inline void
-+ladder_smallloop_cmult_small_loop(u64 *nq, u64 *nqpq, u64 *nq2, u64 *nqpq2,
-+ u64 *q, u8 byt, u32 i)
-+{
-+ while (i--) {
-+ ladder_smallloop_cmult_small_loop_double_step(nq, nqpq, nq2,
-+ nqpq2, q, byt);
-+ byt <<= 2;
-+ }
-+}
-+
-+static __always_inline void ladder_bigloop_cmult_big_loop(u8 *n1, u64 *nq,
-+ u64 *nqpq, u64 *nq2,
-+ u64 *nqpq2, u64 *q,
-+ u32 i)
-+{
-+ while (i--) {
-+ u8 byte = n1[i];
-+ ladder_smallloop_cmult_small_loop(nq, nqpq, nq2, nqpq2, q,
-+ byte, 4);
-+ }
-+}
-+
-+static void ladder_cmult(u64 *result, u8 *n1, u64 *q)
-+{
-+ u64 point_buf[40] = { 0 };
-+ u64 *nq = point_buf;
-+ u64 *nqpq = point_buf + 10;
-+ u64 *nq2 = point_buf + 20;
-+ u64 *nqpq2 = point_buf + 30;
-+ point_copy(nqpq, q);
-+ nq[0] = 1;
-+ ladder_bigloop_cmult_big_loop(n1, nq, nqpq, nq2, nqpq2, q, 32);
-+ point_copy(result, nq);
-+}
-+
-+static __always_inline void format_fexpand(u64 *output, const u8 *input)
-+{
-+ const u8 *x00 = input + 6;
-+ const u8 *x01 = input + 12;
-+ const u8 *x02 = input + 19;
-+ const u8 *x0 = input + 24;
-+ u64 i0, i1, i2, i3, i4, output0, output1, output2, output3, output4;
-+ i0 = get_unaligned_le64(input);
-+ i1 = get_unaligned_le64(x00);
-+ i2 = get_unaligned_le64(x01);
-+ i3 = get_unaligned_le64(x02);
-+ i4 = get_unaligned_le64(x0);
-+ output0 = i0 & 0x7ffffffffffffLLU;
-+ output1 = i1 >> 3 & 0x7ffffffffffffLLU;
-+ output2 = i2 >> 6 & 0x7ffffffffffffLLU;
-+ output3 = i3 >> 1 & 0x7ffffffffffffLLU;
-+ output4 = i4 >> 12 & 0x7ffffffffffffLLU;
-+ output[0] = output0;
-+ output[1] = output1;
-+ output[2] = output2;
-+ output[3] = output3;
-+ output[4] = output4;
-+}
-+
-+static __always_inline void format_fcontract_first_carry_pass(u64 *input)
-+{
-+ u64 t0 = input[0];
-+ u64 t1 = input[1];
-+ u64 t2 = input[2];
-+ u64 t3 = input[3];
-+ u64 t4 = input[4];
-+ u64 t1_ = t1 + (t0 >> 51);
-+ u64 t0_ = t0 & 0x7ffffffffffffLLU;
-+ u64 t2_ = t2 + (t1_ >> 51);
-+ u64 t1__ = t1_ & 0x7ffffffffffffLLU;
-+ u64 t3_ = t3 + (t2_ >> 51);
-+ u64 t2__ = t2_ & 0x7ffffffffffffLLU;
-+ u64 t4_ = t4 + (t3_ >> 51);
-+ u64 t3__ = t3_ & 0x7ffffffffffffLLU;
-+ input[0] = t0_;
-+ input[1] = t1__;
-+ input[2] = t2__;
-+ input[3] = t3__;
-+ input[4] = t4_;
-+}
-+
-+static __always_inline void format_fcontract_first_carry_full(u64 *input)
-+{
-+ format_fcontract_first_carry_pass(input);
-+ modulo_carry_top(input);
-+}
-+
-+static __always_inline void format_fcontract_second_carry_pass(u64 *input)
-+{
-+ u64 t0 = input[0];
-+ u64 t1 = input[1];
-+ u64 t2 = input[2];
-+ u64 t3 = input[3];
-+ u64 t4 = input[4];
-+ u64 t1_ = t1 + (t0 >> 51);
-+ u64 t0_ = t0 & 0x7ffffffffffffLLU;
-+ u64 t2_ = t2 + (t1_ >> 51);
-+ u64 t1__ = t1_ & 0x7ffffffffffffLLU;
-+ u64 t3_ = t3 + (t2_ >> 51);
-+ u64 t2__ = t2_ & 0x7ffffffffffffLLU;
-+ u64 t4_ = t4 + (t3_ >> 51);
-+ u64 t3__ = t3_ & 0x7ffffffffffffLLU;
-+ input[0] = t0_;
-+ input[1] = t1__;
-+ input[2] = t2__;
-+ input[3] = t3__;
-+ input[4] = t4_;
-+}
-+
-+static __always_inline void format_fcontract_second_carry_full(u64 *input)
-+{
-+ u64 i0;
-+ u64 i1;
-+ u64 i0_;
-+ u64 i1_;
-+ format_fcontract_second_carry_pass(input);
-+ modulo_carry_top(input);
-+ i0 = input[0];
-+ i1 = input[1];
-+ i0_ = i0 & 0x7ffffffffffffLLU;
-+ i1_ = i1 + (i0 >> 51);
-+ input[0] = i0_;
-+ input[1] = i1_;
-+}
-+
-+static __always_inline void format_fcontract_trim(u64 *input)
-+{
-+ u64 a0 = input[0];
-+ u64 a1 = input[1];
-+ u64 a2 = input[2];
-+ u64 a3 = input[3];
-+ u64 a4 = input[4];
-+ u64 mask0 = u64_gte_mask(a0, 0x7ffffffffffedLLU);
-+ u64 mask1 = u64_eq_mask(a1, 0x7ffffffffffffLLU);
-+ u64 mask2 = u64_eq_mask(a2, 0x7ffffffffffffLLU);
-+ u64 mask3 = u64_eq_mask(a3, 0x7ffffffffffffLLU);
-+ u64 mask4 = u64_eq_mask(a4, 0x7ffffffffffffLLU);
-+ u64 mask = (((mask0 & mask1) & mask2) & mask3) & mask4;
-+ u64 a0_ = a0 - (0x7ffffffffffedLLU & mask);
-+ u64 a1_ = a1 - (0x7ffffffffffffLLU & mask);
-+ u64 a2_ = a2 - (0x7ffffffffffffLLU & mask);
-+ u64 a3_ = a3 - (0x7ffffffffffffLLU & mask);
-+ u64 a4_ = a4 - (0x7ffffffffffffLLU & mask);
-+ input[0] = a0_;
-+ input[1] = a1_;
-+ input[2] = a2_;
-+ input[3] = a3_;
-+ input[4] = a4_;
-+}
-+
-+static __always_inline void format_fcontract_store(u8 *output, u64 *input)
-+{
-+ u64 t0 = input[0];
-+ u64 t1 = input[1];
-+ u64 t2 = input[2];
-+ u64 t3 = input[3];
-+ u64 t4 = input[4];
-+ u64 o0 = t1 << 51 | t0;
-+ u64 o1 = t2 << 38 | t1 >> 13;
-+ u64 o2 = t3 << 25 | t2 >> 26;
-+ u64 o3 = t4 << 12 | t3 >> 39;
-+ u8 *b0 = output;
-+ u8 *b1 = output + 8;
-+ u8 *b2 = output + 16;
-+ u8 *b3 = output + 24;
-+ put_unaligned_le64(o0, b0);
-+ put_unaligned_le64(o1, b1);
-+ put_unaligned_le64(o2, b2);
-+ put_unaligned_le64(o3, b3);
-+}
-+
-+static __always_inline void format_fcontract(u8 *output, u64 *input)
-+{
-+ format_fcontract_first_carry_full(input);
-+ format_fcontract_second_carry_full(input);
-+ format_fcontract_trim(input);
-+ format_fcontract_store(output, input);
-+}
-+
-+static __always_inline void format_scalar_of_point(u8 *scalar, u64 *point)
-+{
-+ u64 *x = point;
-+ u64 *z = point + 5;
-+ u64 buf[10] __aligned(32) = { 0 };
-+ u64 *zmone = buf;
-+ u64 *sc = buf + 5;
-+ crecip(zmone, z);
-+ fmul(sc, x, zmone);
-+ format_fcontract(scalar, sc);
-+}
-+
-+void curve25519_generic(u8 mypublic[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE],
-+ const u8 basepoint[CURVE25519_KEY_SIZE])
-+{
-+ u64 buf0[10] __aligned(32) = { 0 };
-+ u64 *x0 = buf0;
-+ u64 *z = buf0 + 5;
-+ u64 *q;
-+ format_fexpand(x0, basepoint);
-+ z[0] = 1;
-+ q = buf0;
-+ {
-+ u8 e[32] __aligned(32) = { 0 };
-+ u8 *scalar;
-+ memcpy(e, secret, 32);
-+ curve25519_clamp_secret(e);
-+ scalar = e;
-+ {
-+ u64 buf[15] = { 0 };
-+ u64 *nq = buf;
-+ u64 *x = nq;
-+ x[0] = 1;
-+ ladder_cmult(nq, scalar, q);
-+ format_scalar_of_point(mypublic, nq);
-+ memzero_explicit(buf, sizeof(buf));
-+ }
-+ memzero_explicit(e, sizeof(e));
-+ }
-+ memzero_explicit(buf0, sizeof(buf0));
-+}
---- /dev/null
-+++ b/lib/crypto/curve25519.c
-@@ -0,0 +1,25 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is an implementation of the Curve25519 ECDH algorithm, using either
-+ * a 32-bit implementation or a 64-bit implementation with 128-bit integers,
-+ * depending on what is supported by the target compiler.
-+ *
-+ * Information: https://cr.yp.to/ecdh.html
-+ */
-+
-+#include <crypto/curve25519.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+
-+const u8 curve25519_null_point[CURVE25519_KEY_SIZE] __aligned(32) = { 0 };
-+const u8 curve25519_base_point[CURVE25519_KEY_SIZE] __aligned(32) = { 9 };
-+
-+EXPORT_SYMBOL(curve25519_null_point);
-+EXPORT_SYMBOL(curve25519_base_point);
-+EXPORT_SYMBOL(curve25519_generic);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("Curve25519 scalar multiplication");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0026-crypto-curve25519-add-kpp-selftest.patch b/target/linux/generic/backport-5.4/080-wireguard-0026-crypto-curve25519-add-kpp-selftest.patch
deleted file mode 100644
index b2813aeb6a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0026-crypto-curve25519-add-kpp-selftest.patch
+++ /dev/null
@@ -1,1268 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:33 +0100
-Subject: [PATCH] crypto: curve25519 - add kpp selftest
-
-commit f613457a7af085728297bef71233c37faf3c01b1 upstream.
-
-In preparation of introducing KPP implementations of Curve25519, import
-the set of test cases proposed by the Zinc patch set, but converted to
-the KPP format.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/testmgr.c | 6 +
- crypto/testmgr.h | 1225 ++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 1231 insertions(+)
-
---- a/crypto/testmgr.c
-+++ b/crypto/testmgr.c
-@@ -4296,6 +4296,12 @@ static const struct alg_test_desc alg_te
- .test = alg_test_null,
- .fips_allowed = 1,
- }, {
-+ .alg = "curve25519",
-+ .test = alg_test_kpp,
-+ .suite = {
-+ .kpp = __VECS(curve25519_tv_template)
-+ }
-+ }, {
- .alg = "deflate",
- .test = alg_test_comp,
- .fips_allowed = 1,
---- a/crypto/testmgr.h
-+++ b/crypto/testmgr.h
-@@ -1030,6 +1030,1231 @@ static const struct kpp_testvec dh_tv_te
- }
- };
-
-+static const struct kpp_testvec curve25519_tv_template[] = {
-+{
-+ .secret = (u8[32]){ 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d,
-+ 0x3c, 0x16, 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45,
-+ 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0, 0x99, 0x2a,
-+ 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a },
-+ .b_public = (u8[32]){ 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4,
-+ 0xd3, 0x5b, 0x61, 0xc2, 0xec, 0xe4, 0x35, 0x37,
-+ 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78, 0x67, 0x4d,
-+ 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f },
-+ .expected_ss = (u8[32]){ 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
-+ 0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
-+ 0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
-+ 0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b,
-+ 0x79, 0xe1, 0x7f, 0x8b, 0x83, 0x80, 0x0e, 0xe6,
-+ 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18, 0xb6, 0xfd,
-+ 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb },
-+ .b_public = (u8[32]){ 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54,
-+ 0x74, 0x8b, 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a,
-+ 0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38, 0x1a, 0xf4,
-+ 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a },
-+ .expected_ss = (u8[32]){ 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
-+ 0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
-+ 0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
-+ 0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 1 },
-+ .b_public = (u8[32]){ 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x3c, 0x77, 0x77, 0xca, 0xf9, 0x97, 0xb2, 0x64,
-+ 0x41, 0x60, 0x77, 0x66, 0x5b, 0x4e, 0x22, 0x9d,
-+ 0x0b, 0x95, 0x48, 0xdc, 0x0c, 0xd8, 0x19, 0x98,
-+ 0xdd, 0xcd, 0xc5, 0xc8, 0x53, 0x3c, 0x79, 0x7f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 1 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0xb3, 0x2d, 0x13, 0x62, 0xc2, 0x48, 0xd6, 0x2f,
-+ 0xe6, 0x26, 0x19, 0xcf, 0xf0, 0x4d, 0xd4, 0x3d,
-+ 0xb7, 0x3f, 0xfc, 0x1b, 0x63, 0x08, 0xed, 0xe3,
-+ 0x0b, 0x78, 0xd8, 0x73, 0x80, 0xf1, 0xe8, 0x34 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 0xa5, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
-+ 0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
-+ 0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
-+ 0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0xc4 },
-+ .b_public = (u8[32]){ 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
-+ 0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
-+ 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
-+ 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
-+ .expected_ss = (u8[32]){ 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
-+ 0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
-+ 0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
-+ 0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0x0a, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0xfb, 0x9f },
-+ .expected_ss = (u8[32]){ 0x77, 0x52, 0xb6, 0x18, 0xc1, 0x2d, 0x48, 0xd2,
-+ 0xc6, 0x93, 0x46, 0x83, 0x81, 0x7c, 0xc6, 0x57,
-+ 0xf3, 0x31, 0x03, 0x19, 0x49, 0x48, 0x20, 0x05,
-+ 0x42, 0x2b, 0x4e, 0xae, 0x8d, 0x1d, 0x43, 0x23 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+{
-+ .secret = (u8[32]){ 0x8e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .b_public = (u8[32]){ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x06 },
-+ .expected_ss = (u8[32]){ 0x5a, 0xdf, 0xaa, 0x25, 0x86, 0x8e, 0x32, 0x3d,
-+ 0xae, 0x49, 0x62, 0xc1, 0x01, 0x5c, 0xb3, 0x12,
-+ 0xe1, 0xc5, 0xc7, 0x9e, 0x95, 0x3f, 0x03, 0x99,
-+ 0xb0, 0xba, 0x16, 0x22, 0xf3, 0xb6, 0xf7, 0x0c },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - normal case */
-+{
-+ .secret = (u8[32]){ 0x48, 0x52, 0x83, 0x4d, 0x9d, 0x6b, 0x77, 0xda,
-+ 0xde, 0xab, 0xaa, 0xf2, 0xe1, 0x1d, 0xca, 0x66,
-+ 0xd1, 0x9f, 0xe7, 0x49, 0x93, 0xa7, 0xbe, 0xc3,
-+ 0x6c, 0x6e, 0x16, 0xa0, 0x98, 0x3f, 0xea, 0xba },
-+ .b_public = (u8[32]){ 0x9c, 0x64, 0x7d, 0x9a, 0xe5, 0x89, 0xb9, 0xf5,
-+ 0x8f, 0xdc, 0x3c, 0xa4, 0x94, 0x7e, 0xfb, 0xc9,
-+ 0x15, 0xc4, 0xb2, 0xe0, 0x8e, 0x74, 0x4a, 0x0e,
-+ 0xdf, 0x46, 0x9d, 0xac, 0x59, 0xc8, 0xf8, 0x5a },
-+ .expected_ss = (u8[32]){ 0x87, 0xb7, 0xf2, 0x12, 0xb6, 0x27, 0xf7, 0xa5,
-+ 0x4c, 0xa5, 0xe0, 0xbc, 0xda, 0xdd, 0xd5, 0x38,
-+ 0x9d, 0x9d, 0xe6, 0x15, 0x6c, 0xdb, 0xcf, 0x8e,
-+ 0xbe, 0x14, 0xff, 0xbc, 0xfb, 0x43, 0x65, 0x51 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key on twist */
-+{
-+ .secret = (u8[32]){ 0x58, 0x8c, 0x06, 0x1a, 0x50, 0x80, 0x4a, 0xc4,
-+ 0x88, 0xad, 0x77, 0x4a, 0xc7, 0x16, 0xc3, 0xf5,
-+ 0xba, 0x71, 0x4b, 0x27, 0x12, 0xe0, 0x48, 0x49,
-+ 0x13, 0x79, 0xa5, 0x00, 0x21, 0x19, 0x98, 0xa8 },
-+ .b_public = (u8[32]){ 0x63, 0xaa, 0x40, 0xc6, 0xe3, 0x83, 0x46, 0xc5,
-+ 0xca, 0xf2, 0x3a, 0x6d, 0xf0, 0xa5, 0xe6, 0xc8,
-+ 0x08, 0x89, 0xa0, 0x86, 0x47, 0xe5, 0x51, 0xb3,
-+ 0x56, 0x34, 0x49, 0xbe, 0xfc, 0xfc, 0x97, 0x33 },
-+ .expected_ss = (u8[32]){ 0xb1, 0xa7, 0x07, 0x51, 0x94, 0x95, 0xff, 0xff,
-+ 0xb2, 0x98, 0xff, 0x94, 0x17, 0x16, 0xb0, 0x6d,
-+ 0xfa, 0xb8, 0x7c, 0xf8, 0xd9, 0x11, 0x23, 0xfe,
-+ 0x2b, 0xe9, 0xa2, 0x33, 0xdd, 0xa2, 0x22, 0x12 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key on twist */
-+{
-+ .secret = (u8[32]){ 0xb0, 0x5b, 0xfd, 0x32, 0xe5, 0x53, 0x25, 0xd9,
-+ 0xfd, 0x64, 0x8c, 0xb3, 0x02, 0x84, 0x80, 0x39,
-+ 0x00, 0x0b, 0x39, 0x0e, 0x44, 0xd5, 0x21, 0xe5,
-+ 0x8a, 0xab, 0x3b, 0x29, 0xa6, 0x96, 0x0b, 0xa8 },
-+ .b_public = (u8[32]){ 0x0f, 0x83, 0xc3, 0x6f, 0xde, 0xd9, 0xd3, 0x2f,
-+ 0xad, 0xf4, 0xef, 0xa3, 0xae, 0x93, 0xa9, 0x0b,
-+ 0xb5, 0xcf, 0xa6, 0x68, 0x93, 0xbc, 0x41, 0x2c,
-+ 0x43, 0xfa, 0x72, 0x87, 0xdb, 0xb9, 0x97, 0x79 },
-+ .expected_ss = (u8[32]){ 0x67, 0xdd, 0x4a, 0x6e, 0x16, 0x55, 0x33, 0x53,
-+ 0x4c, 0x0e, 0x3f, 0x17, 0x2e, 0x4a, 0xb8, 0x57,
-+ 0x6b, 0xca, 0x92, 0x3a, 0x5f, 0x07, 0xb2, 0xc0,
-+ 0x69, 0xb4, 0xc3, 0x10, 0xff, 0x2e, 0x93, 0x5b },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key on twist */
-+{
-+ .secret = (u8[32]){ 0x70, 0xe3, 0x4b, 0xcb, 0xe1, 0xf4, 0x7f, 0xbc,
-+ 0x0f, 0xdd, 0xfd, 0x7c, 0x1e, 0x1a, 0xa5, 0x3d,
-+ 0x57, 0xbf, 0xe0, 0xf6, 0x6d, 0x24, 0x30, 0x67,
-+ 0xb4, 0x24, 0xbb, 0x62, 0x10, 0xbe, 0xd1, 0x9c },
-+ .b_public = (u8[32]){ 0x0b, 0x82, 0x11, 0xa2, 0xb6, 0x04, 0x90, 0x97,
-+ 0xf6, 0x87, 0x1c, 0x6c, 0x05, 0x2d, 0x3c, 0x5f,
-+ 0xc1, 0xba, 0x17, 0xda, 0x9e, 0x32, 0xae, 0x45,
-+ 0x84, 0x03, 0xb0, 0x5b, 0xb2, 0x83, 0x09, 0x2a },
-+ .expected_ss = (u8[32]){ 0x4a, 0x06, 0x38, 0xcf, 0xaa, 0x9e, 0xf1, 0x93,
-+ 0x3b, 0x47, 0xf8, 0x93, 0x92, 0x96, 0xa6, 0xb2,
-+ 0x5b, 0xe5, 0x41, 0xef, 0x7f, 0x70, 0xe8, 0x44,
-+ 0xc0, 0xbc, 0xc0, 0x0b, 0x13, 0x4d, 0xe6, 0x4a },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key on twist */
-+{
-+ .secret = (u8[32]){ 0x68, 0xc1, 0xf3, 0xa6, 0x53, 0xa4, 0xcd, 0xb1,
-+ 0xd3, 0x7b, 0xba, 0x94, 0x73, 0x8f, 0x8b, 0x95,
-+ 0x7a, 0x57, 0xbe, 0xb2, 0x4d, 0x64, 0x6e, 0x99,
-+ 0x4d, 0xc2, 0x9a, 0x27, 0x6a, 0xad, 0x45, 0x8d },
-+ .b_public = (u8[32]){ 0x34, 0x3a, 0xc2, 0x0a, 0x3b, 0x9c, 0x6a, 0x27,
-+ 0xb1, 0x00, 0x81, 0x76, 0x50, 0x9a, 0xd3, 0x07,
-+ 0x35, 0x85, 0x6e, 0xc1, 0xc8, 0xd8, 0xfc, 0xae,
-+ 0x13, 0x91, 0x2d, 0x08, 0xd1, 0x52, 0xf4, 0x6c },
-+ .expected_ss = (u8[32]){ 0x39, 0x94, 0x91, 0xfc, 0xe8, 0xdf, 0xab, 0x73,
-+ 0xb4, 0xf9, 0xf6, 0x11, 0xde, 0x8e, 0xa0, 0xb2,
-+ 0x7b, 0x28, 0xf8, 0x59, 0x94, 0x25, 0x0b, 0x0f,
-+ 0x47, 0x5d, 0x58, 0x5d, 0x04, 0x2a, 0xc2, 0x07 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key on twist */
-+{
-+ .secret = (u8[32]){ 0xd8, 0x77, 0xb2, 0x6d, 0x06, 0xdf, 0xf9, 0xd9,
-+ 0xf7, 0xfd, 0x4c, 0x5b, 0x37, 0x69, 0xf8, 0xcd,
-+ 0xd5, 0xb3, 0x05, 0x16, 0xa5, 0xab, 0x80, 0x6b,
-+ 0xe3, 0x24, 0xff, 0x3e, 0xb6, 0x9e, 0xa0, 0xb2 },
-+ .b_public = (u8[32]){ 0xfa, 0x69, 0x5f, 0xc7, 0xbe, 0x8d, 0x1b, 0xe5,
-+ 0xbf, 0x70, 0x48, 0x98, 0xf3, 0x88, 0xc4, 0x52,
-+ 0xba, 0xfd, 0xd3, 0xb8, 0xea, 0xe8, 0x05, 0xf8,
-+ 0x68, 0x1a, 0x8d, 0x15, 0xc2, 0xd4, 0xe1, 0x42 },
-+ .expected_ss = (u8[32]){ 0x2c, 0x4f, 0xe1, 0x1d, 0x49, 0x0a, 0x53, 0x86,
-+ 0x17, 0x76, 0xb1, 0x3b, 0x43, 0x54, 0xab, 0xd4,
-+ 0xcf, 0x5a, 0x97, 0x69, 0x9d, 0xb6, 0xe6, 0xc6,
-+ 0x8c, 0x16, 0x26, 0xd0, 0x76, 0x62, 0xf7, 0x58 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0x38, 0xdd, 0xe9, 0xf3, 0xe7, 0xb7, 0x99, 0x04,
-+ 0x5f, 0x9a, 0xc3, 0x79, 0x3d, 0x4a, 0x92, 0x77,
-+ 0xda, 0xde, 0xad, 0xc4, 0x1b, 0xec, 0x02, 0x90,
-+ 0xf8, 0x1f, 0x74, 0x4f, 0x73, 0x77, 0x5f, 0x84 },
-+ .b_public = (u8[32]){ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x9a, 0x2c, 0xfe, 0x84, 0xff, 0x9c, 0x4a, 0x97,
-+ 0x39, 0x62, 0x5c, 0xae, 0x4a, 0x3b, 0x82, 0xa9,
-+ 0x06, 0x87, 0x7a, 0x44, 0x19, 0x46, 0xf8, 0xd7,
-+ 0xb3, 0xd7, 0x95, 0xfe, 0x8f, 0x5d, 0x16, 0x39 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0x98, 0x57, 0xa9, 0x14, 0xe3, 0xc2, 0x90, 0x36,
-+ 0xfd, 0x9a, 0x44, 0x2b, 0xa5, 0x26, 0xb5, 0xcd,
-+ 0xcd, 0xf2, 0x82, 0x16, 0x15, 0x3e, 0x63, 0x6c,
-+ 0x10, 0x67, 0x7a, 0xca, 0xb6, 0xbd, 0x6a, 0xa5 },
-+ .b_public = (u8[32]){ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x4d, 0xa4, 0xe0, 0xaa, 0x07, 0x2c, 0x23, 0x2e,
-+ 0xe2, 0xf0, 0xfa, 0x4e, 0x51, 0x9a, 0xe5, 0x0b,
-+ 0x52, 0xc1, 0xed, 0xd0, 0x8a, 0x53, 0x4d, 0x4e,
-+ 0xf3, 0x46, 0xc2, 0xe1, 0x06, 0xd2, 0x1d, 0x60 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0x48, 0xe2, 0x13, 0x0d, 0x72, 0x33, 0x05, 0xed,
-+ 0x05, 0xe6, 0xe5, 0x89, 0x4d, 0x39, 0x8a, 0x5e,
-+ 0x33, 0x36, 0x7a, 0x8c, 0x6a, 0xac, 0x8f, 0xcd,
-+ 0xf0, 0xa8, 0x8e, 0x4b, 0x42, 0x82, 0x0d, 0xb7 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xf8, 0xff,
-+ 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
-+ 0x00, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x9e, 0xd1, 0x0c, 0x53, 0x74, 0x7f, 0x64, 0x7f,
-+ 0x82, 0xf4, 0x51, 0x25, 0xd3, 0xde, 0x15, 0xa1,
-+ 0xe6, 0xb8, 0x24, 0x49, 0x6a, 0xb4, 0x04, 0x10,
-+ 0xff, 0xcc, 0x3c, 0xfe, 0x95, 0x76, 0x0f, 0x3b },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0x28, 0xf4, 0x10, 0x11, 0x69, 0x18, 0x51, 0xb3,
-+ 0xa6, 0x2b, 0x64, 0x15, 0x53, 0xb3, 0x0d, 0x0d,
-+ 0xfd, 0xdc, 0xb8, 0xff, 0xfc, 0xf5, 0x37, 0x00,
-+ 0xa7, 0xbe, 0x2f, 0x6a, 0x87, 0x2e, 0x9f, 0xb0 },
-+ .b_public = (u8[32]){ 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x00,
-+ 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xf8, 0xff,
-+ 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0xcf, 0x72, 0xb4, 0xaa, 0x6a, 0xa1, 0xc9, 0xf8,
-+ 0x94, 0xf4, 0x16, 0x5b, 0x86, 0x10, 0x9a, 0xa4,
-+ 0x68, 0x51, 0x76, 0x48, 0xe1, 0xf0, 0xcc, 0x70,
-+ 0xe1, 0xab, 0x08, 0x46, 0x01, 0x76, 0x50, 0x6b },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0x18, 0xa9, 0x3b, 0x64, 0x99, 0xb9, 0xf6, 0xb3,
-+ 0x22, 0x5c, 0xa0, 0x2f, 0xef, 0x41, 0x0e, 0x0a,
-+ 0xde, 0xc2, 0x35, 0x32, 0x32, 0x1d, 0x2d, 0x8e,
-+ 0xf1, 0xa6, 0xd6, 0x02, 0xa8, 0xc6, 0x5b, 0x83 },
-+ .b_public = (u8[32]){ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x5d, 0x50, 0xb6, 0x28, 0x36, 0xbb, 0x69, 0x57,
-+ 0x94, 0x10, 0x38, 0x6c, 0xf7, 0xbb, 0x81, 0x1c,
-+ 0x14, 0xbf, 0x85, 0xb1, 0xc7, 0xb1, 0x7e, 0x59,
-+ 0x24, 0xc7, 0xff, 0xea, 0x91, 0xef, 0x9e, 0x12 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case on twist */
-+{
-+ .secret = (u8[32]){ 0xc0, 0x1d, 0x13, 0x05, 0xa1, 0x33, 0x8a, 0x1f,
-+ 0xca, 0xc2, 0xba, 0x7e, 0x2e, 0x03, 0x2b, 0x42,
-+ 0x7e, 0x0b, 0x04, 0x90, 0x31, 0x65, 0xac, 0xa9,
-+ 0x57, 0xd8, 0xd0, 0x55, 0x3d, 0x87, 0x17, 0xb0 },
-+ .b_public = (u8[32]){ 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x19, 0x23, 0x0e, 0xb1, 0x48, 0xd5, 0xd6, 0x7c,
-+ 0x3c, 0x22, 0xab, 0x1d, 0xae, 0xff, 0x80, 0xa5,
-+ 0x7e, 0xae, 0x42, 0x65, 0xce, 0x28, 0x72, 0x65,
-+ 0x7b, 0x2c, 0x80, 0x99, 0xfc, 0x69, 0x8e, 0x50 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0x38, 0x6f, 0x7f, 0x16, 0xc5, 0x07, 0x31, 0xd6,
-+ 0x4f, 0x82, 0xe6, 0xa1, 0x70, 0xb1, 0x42, 0xa4,
-+ 0xe3, 0x4f, 0x31, 0xfd, 0x77, 0x68, 0xfc, 0xb8,
-+ 0x90, 0x29, 0x25, 0xe7, 0xd1, 0xe2, 0x1a, 0xbe },
-+ .b_public = (u8[32]){ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x0f, 0xca, 0xb5, 0xd8, 0x42, 0xa0, 0x78, 0xd7,
-+ 0xa7, 0x1f, 0xc5, 0x9b, 0x57, 0xbf, 0xb4, 0xca,
-+ 0x0b, 0xe6, 0x87, 0x3b, 0x49, 0xdc, 0xdb, 0x9f,
-+ 0x44, 0xe1, 0x4a, 0xe8, 0xfb, 0xdf, 0xa5, 0x42 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0xe0, 0x23, 0xa2, 0x89, 0xbd, 0x5e, 0x90, 0xfa,
-+ 0x28, 0x04, 0xdd, 0xc0, 0x19, 0xa0, 0x5e, 0xf3,
-+ 0xe7, 0x9d, 0x43, 0x4b, 0xb6, 0xea, 0x2f, 0x52,
-+ 0x2e, 0xcb, 0x64, 0x3a, 0x75, 0x29, 0x6e, 0x95 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 },
-+ .expected_ss = (u8[32]){ 0x54, 0xce, 0x8f, 0x22, 0x75, 0xc0, 0x77, 0xe3,
-+ 0xb1, 0x30, 0x6a, 0x39, 0x39, 0xc5, 0xe0, 0x3e,
-+ 0xef, 0x6b, 0xbb, 0x88, 0x06, 0x05, 0x44, 0x75,
-+ 0x8d, 0x9f, 0xef, 0x59, 0xb0, 0xbc, 0x3e, 0x4f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0x68, 0xf0, 0x10, 0xd6, 0x2e, 0xe8, 0xd9, 0x26,
-+ 0x05, 0x3a, 0x36, 0x1c, 0x3a, 0x75, 0xc6, 0xea,
-+ 0x4e, 0xbd, 0xc8, 0x60, 0x6a, 0xb2, 0x85, 0x00,
-+ 0x3a, 0x6f, 0x8f, 0x40, 0x76, 0xb0, 0x1e, 0x83 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
-+ .expected_ss = (u8[32]){ 0xf1, 0x36, 0x77, 0x5c, 0x5b, 0xeb, 0x0a, 0xf8,
-+ 0x11, 0x0a, 0xf1, 0x0b, 0x20, 0x37, 0x23, 0x32,
-+ 0x04, 0x3c, 0xab, 0x75, 0x24, 0x19, 0x67, 0x87,
-+ 0x75, 0xa2, 0x23, 0xdf, 0x57, 0xc9, 0xd3, 0x0d },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0x58, 0xeb, 0xcb, 0x35, 0xb0, 0xf8, 0x84, 0x5c,
-+ 0xaf, 0x1e, 0xc6, 0x30, 0xf9, 0x65, 0x76, 0xb6,
-+ 0x2c, 0x4b, 0x7b, 0x6c, 0x36, 0xb2, 0x9d, 0xeb,
-+ 0x2c, 0xb0, 0x08, 0x46, 0x51, 0x75, 0x5c, 0x96 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff,
-+ 0xff, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-+ 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf7, 0xff,
-+ 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x3f },
-+ .expected_ss = (u8[32]){ 0xbf, 0x9a, 0xff, 0xd0, 0x6b, 0x84, 0x40, 0x85,
-+ 0x58, 0x64, 0x60, 0x96, 0x2e, 0xf2, 0x14, 0x6f,
-+ 0xf3, 0xd4, 0x53, 0x3d, 0x94, 0x44, 0xaa, 0xb0,
-+ 0x06, 0xeb, 0x88, 0xcc, 0x30, 0x54, 0x40, 0x7d },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0x18, 0x8c, 0x4b, 0xc5, 0xb9, 0xc4, 0x4b, 0x38,
-+ 0xbb, 0x65, 0x8b, 0x9b, 0x2a, 0xe8, 0x2d, 0x5b,
-+ 0x01, 0x01, 0x5e, 0x09, 0x31, 0x84, 0xb1, 0x7c,
-+ 0xb7, 0x86, 0x35, 0x03, 0xa7, 0x83, 0xe1, 0xbb },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .expected_ss = (u8[32]){ 0xd4, 0x80, 0xde, 0x04, 0xf6, 0x99, 0xcb, 0x3b,
-+ 0xe0, 0x68, 0x4a, 0x9c, 0xc2, 0xe3, 0x12, 0x81,
-+ 0xea, 0x0b, 0xc5, 0xa9, 0xdc, 0xc1, 0x57, 0xd3,
-+ 0xd2, 0x01, 0x58, 0xd4, 0x6c, 0xa5, 0x24, 0x6d },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0xe0, 0x6c, 0x11, 0xbb, 0x2e, 0x13, 0xce, 0x3d,
-+ 0xc7, 0x67, 0x3f, 0x67, 0xf5, 0x48, 0x22, 0x42,
-+ 0x90, 0x94, 0x23, 0xa9, 0xae, 0x95, 0xee, 0x98,
-+ 0x6a, 0x98, 0x8d, 0x98, 0xfa, 0xee, 0x23, 0xa2 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x4c, 0x44, 0x01, 0xcc, 0xe6, 0xb5, 0x1e, 0x4c,
-+ 0xb1, 0x8f, 0x27, 0x90, 0x24, 0x6c, 0x9b, 0xf9,
-+ 0x14, 0xdb, 0x66, 0x77, 0x50, 0xa1, 0xcb, 0x89,
-+ 0x06, 0x90, 0x92, 0xaf, 0x07, 0x29, 0x22, 0x76 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for public key */
-+{
-+ .secret = (u8[32]){ 0xc0, 0x65, 0x8c, 0x46, 0xdd, 0xe1, 0x81, 0x29,
-+ 0x29, 0x38, 0x77, 0x53, 0x5b, 0x11, 0x62, 0xb6,
-+ 0xf9, 0xf5, 0x41, 0x4a, 0x23, 0xcf, 0x4d, 0x2c,
-+ 0xbc, 0x14, 0x0a, 0x4d, 0x99, 0xda, 0x2b, 0x8f },
-+ .b_public = (u8[32]){ 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x57, 0x8b, 0xa8, 0xcc, 0x2d, 0xbd, 0xc5, 0x75,
-+ 0xaf, 0xcf, 0x9d, 0xf2, 0xb3, 0xee, 0x61, 0x89,
-+ 0xf5, 0x33, 0x7d, 0x68, 0x54, 0xc7, 0x9b, 0x4c,
-+ 0xe1, 0x65, 0xea, 0x12, 0x29, 0x3b, 0x3a, 0x0f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xf0, 0x1e, 0x48, 0xda, 0xfa, 0xc9, 0xd7, 0xbc,
-+ 0xf5, 0x89, 0xcb, 0xc3, 0x82, 0xc8, 0x78, 0xd1,
-+ 0x8b, 0xda, 0x35, 0x50, 0x58, 0x9f, 0xfb, 0x5d,
-+ 0x50, 0xb5, 0x23, 0xbe, 0xbe, 0x32, 0x9d, 0xae },
-+ .b_public = (u8[32]){ 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0xbd, 0x36, 0xa0, 0x79, 0x0e, 0xb8, 0x83, 0x09,
-+ 0x8c, 0x98, 0x8b, 0x21, 0x78, 0x67, 0x73, 0xde,
-+ 0x0b, 0x3a, 0x4d, 0xf1, 0x62, 0x28, 0x2c, 0xf1,
-+ 0x10, 0xde, 0x18, 0xdd, 0x48, 0x4c, 0xe7, 0x4b },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x28, 0x87, 0x96, 0xbc, 0x5a, 0xff, 0x4b, 0x81,
-+ 0xa3, 0x75, 0x01, 0x75, 0x7b, 0xc0, 0x75, 0x3a,
-+ 0x3c, 0x21, 0x96, 0x47, 0x90, 0xd3, 0x86, 0x99,
-+ 0x30, 0x8d, 0xeb, 0xc1, 0x7a, 0x6e, 0xaf, 0x8d },
-+ .b_public = (u8[32]){ 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0xb4, 0xe0, 0xdd, 0x76, 0xda, 0x7b, 0x07, 0x17,
-+ 0x28, 0xb6, 0x1f, 0x85, 0x67, 0x71, 0xaa, 0x35,
-+ 0x6e, 0x57, 0xed, 0xa7, 0x8a, 0x5b, 0x16, 0x55,
-+ 0xcc, 0x38, 0x20, 0xfb, 0x5f, 0x85, 0x4c, 0x5c },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x98, 0xdf, 0x84, 0x5f, 0x66, 0x51, 0xbf, 0x11,
-+ 0x38, 0x22, 0x1f, 0x11, 0x90, 0x41, 0xf7, 0x2b,
-+ 0x6d, 0xbc, 0x3c, 0x4a, 0xce, 0x71, 0x43, 0xd9,
-+ 0x9f, 0xd5, 0x5a, 0xd8, 0x67, 0x48, 0x0d, 0xa8 },
-+ .b_public = (u8[32]){ 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x6f, 0xdf, 0x6c, 0x37, 0x61, 0x1d, 0xbd, 0x53,
-+ 0x04, 0xdc, 0x0f, 0x2e, 0xb7, 0xc9, 0x51, 0x7e,
-+ 0xb3, 0xc5, 0x0e, 0x12, 0xfd, 0x05, 0x0a, 0xc6,
-+ 0xde, 0xc2, 0x70, 0x71, 0xd4, 0xbf, 0xc0, 0x34 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xf0, 0x94, 0x98, 0xe4, 0x6f, 0x02, 0xf8, 0x78,
-+ 0x82, 0x9e, 0x78, 0xb8, 0x03, 0xd3, 0x16, 0xa2,
-+ 0xed, 0x69, 0x5d, 0x04, 0x98, 0xa0, 0x8a, 0xbd,
-+ 0xf8, 0x27, 0x69, 0x30, 0xe2, 0x4e, 0xdc, 0xb0 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .expected_ss = (u8[32]){ 0x4c, 0x8f, 0xc4, 0xb1, 0xc6, 0xab, 0x88, 0xfb,
-+ 0x21, 0xf1, 0x8f, 0x6d, 0x4c, 0x81, 0x02, 0x40,
-+ 0xd4, 0xe9, 0x46, 0x51, 0xba, 0x44, 0xf7, 0xa2,
-+ 0xc8, 0x63, 0xce, 0xc7, 0xdc, 0x56, 0x60, 0x2d },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x18, 0x13, 0xc1, 0x0a, 0x5c, 0x7f, 0x21, 0xf9,
-+ 0x6e, 0x17, 0xf2, 0x88, 0xc0, 0xcc, 0x37, 0x60,
-+ 0x7c, 0x04, 0xc5, 0xf5, 0xae, 0xa2, 0xdb, 0x13,
-+ 0x4f, 0x9e, 0x2f, 0xfc, 0x66, 0xbd, 0x9d, 0xb8 },
-+ .b_public = (u8[32]){ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .expected_ss = (u8[32]){ 0x1c, 0xd0, 0xb2, 0x82, 0x67, 0xdc, 0x54, 0x1c,
-+ 0x64, 0x2d, 0x6d, 0x7d, 0xca, 0x44, 0xa8, 0xb3,
-+ 0x8a, 0x63, 0x73, 0x6e, 0xef, 0x5c, 0x4e, 0x65,
-+ 0x01, 0xff, 0xbb, 0xb1, 0x78, 0x0c, 0x03, 0x3c },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x78, 0x57, 0xfb, 0x80, 0x86, 0x53, 0x64, 0x5a,
-+ 0x0b, 0xeb, 0x13, 0x8a, 0x64, 0xf5, 0xf4, 0xd7,
-+ 0x33, 0xa4, 0x5e, 0xa8, 0x4c, 0x3c, 0xda, 0x11,
-+ 0xa9, 0xc0, 0x6f, 0x7e, 0x71, 0x39, 0x14, 0x9e },
-+ .b_public = (u8[32]){ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .expected_ss = (u8[32]){ 0x87, 0x55, 0xbe, 0x01, 0xc6, 0x0a, 0x7e, 0x82,
-+ 0x5c, 0xff, 0x3e, 0x0e, 0x78, 0xcb, 0x3a, 0xa4,
-+ 0x33, 0x38, 0x61, 0x51, 0x6a, 0xa5, 0x9b, 0x1c,
-+ 0x51, 0xa8, 0xb2, 0xa5, 0x43, 0xdf, 0xa8, 0x22 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xe0, 0x3a, 0xa8, 0x42, 0xe2, 0xab, 0xc5, 0x6e,
-+ 0x81, 0xe8, 0x7b, 0x8b, 0x9f, 0x41, 0x7b, 0x2a,
-+ 0x1e, 0x59, 0x13, 0xc7, 0x23, 0xee, 0xd2, 0x8d,
-+ 0x75, 0x2f, 0x8d, 0x47, 0xa5, 0x9f, 0x49, 0x8f },
-+ .b_public = (u8[32]){ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .expected_ss = (u8[32]){ 0x54, 0xc9, 0xa1, 0xed, 0x95, 0xe5, 0x46, 0xd2,
-+ 0x78, 0x22, 0xa3, 0x60, 0x93, 0x1d, 0xda, 0x60,
-+ 0xa1, 0xdf, 0x04, 0x9d, 0xa6, 0xf9, 0x04, 0x25,
-+ 0x3c, 0x06, 0x12, 0xbb, 0xdc, 0x08, 0x74, 0x76 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xf8, 0xf7, 0x07, 0xb7, 0x99, 0x9b, 0x18, 0xcb,
-+ 0x0d, 0x6b, 0x96, 0x12, 0x4f, 0x20, 0x45, 0x97,
-+ 0x2c, 0xa2, 0x74, 0xbf, 0xc1, 0x54, 0xad, 0x0c,
-+ 0x87, 0x03, 0x8c, 0x24, 0xc6, 0xd0, 0xd4, 0xb2 },
-+ .b_public = (u8[32]){ 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0xcc, 0x1f, 0x40, 0xd7, 0x43, 0xcd, 0xc2, 0x23,
-+ 0x0e, 0x10, 0x43, 0xda, 0xba, 0x8b, 0x75, 0xe8,
-+ 0x10, 0xf1, 0xfb, 0xab, 0x7f, 0x25, 0x52, 0x69,
-+ 0xbd, 0x9e, 0xbb, 0x29, 0xe6, 0xbf, 0x49, 0x4f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xa0, 0x34, 0xf6, 0x84, 0xfa, 0x63, 0x1e, 0x1a,
-+ 0x34, 0x81, 0x18, 0xc1, 0xce, 0x4c, 0x98, 0x23,
-+ 0x1f, 0x2d, 0x9e, 0xec, 0x9b, 0xa5, 0x36, 0x5b,
-+ 0x4a, 0x05, 0xd6, 0x9a, 0x78, 0x5b, 0x07, 0x96 },
-+ .b_public = (u8[32]){ 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x54, 0x99, 0x8e, 0xe4, 0x3a, 0x5b, 0x00, 0x7b,
-+ 0xf4, 0x99, 0xf0, 0x78, 0xe7, 0x36, 0x52, 0x44,
-+ 0x00, 0xa8, 0xb5, 0xc7, 0xe9, 0xb9, 0xb4, 0x37,
-+ 0x71, 0x74, 0x8c, 0x7c, 0xdf, 0x88, 0x04, 0x12 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x30, 0xb6, 0xc6, 0xa0, 0xf2, 0xff, 0xa6, 0x80,
-+ 0x76, 0x8f, 0x99, 0x2b, 0xa8, 0x9e, 0x15, 0x2d,
-+ 0x5b, 0xc9, 0x89, 0x3d, 0x38, 0xc9, 0x11, 0x9b,
-+ 0xe4, 0xf7, 0x67, 0xbf, 0xab, 0x6e, 0x0c, 0xa5 },
-+ .b_public = (u8[32]){ 0xdc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0xea, 0xd9, 0xb3, 0x8e, 0xfd, 0xd7, 0x23, 0x63,
-+ 0x79, 0x34, 0xe5, 0x5a, 0xb7, 0x17, 0xa7, 0xae,
-+ 0x09, 0xeb, 0x86, 0xa2, 0x1d, 0xc3, 0x6a, 0x3f,
-+ 0xee, 0xb8, 0x8b, 0x75, 0x9e, 0x39, 0x1e, 0x09 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x90, 0x1b, 0x9d, 0xcf, 0x88, 0x1e, 0x01, 0xe0,
-+ 0x27, 0x57, 0x50, 0x35, 0xd4, 0x0b, 0x43, 0xbd,
-+ 0xc1, 0xc5, 0x24, 0x2e, 0x03, 0x08, 0x47, 0x49,
-+ 0x5b, 0x0c, 0x72, 0x86, 0x46, 0x9b, 0x65, 0x91 },
-+ .b_public = (u8[32]){ 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x60, 0x2f, 0xf4, 0x07, 0x89, 0xb5, 0x4b, 0x41,
-+ 0x80, 0x59, 0x15, 0xfe, 0x2a, 0x62, 0x21, 0xf0,
-+ 0x7a, 0x50, 0xff, 0xc2, 0xc3, 0xfc, 0x94, 0xcf,
-+ 0x61, 0xf1, 0x3d, 0x79, 0x04, 0xe8, 0x8e, 0x0e },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x80, 0x46, 0x67, 0x7c, 0x28, 0xfd, 0x82, 0xc9,
-+ 0xa1, 0xbd, 0xb7, 0x1a, 0x1a, 0x1a, 0x34, 0xfa,
-+ 0xba, 0x12, 0x25, 0xe2, 0x50, 0x7f, 0xe3, 0xf5,
-+ 0x4d, 0x10, 0xbd, 0x5b, 0x0d, 0x86, 0x5f, 0x8e },
-+ .b_public = (u8[32]){ 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0xe0, 0x0a, 0xe8, 0xb1, 0x43, 0x47, 0x12, 0x47,
-+ 0xba, 0x24, 0xf1, 0x2c, 0x88, 0x55, 0x36, 0xc3,
-+ 0xcb, 0x98, 0x1b, 0x58, 0xe1, 0xe5, 0x6b, 0x2b,
-+ 0xaf, 0x35, 0xc1, 0x2a, 0xe1, 0xf7, 0x9c, 0x26 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x60, 0x2f, 0x7e, 0x2f, 0x68, 0xa8, 0x46, 0xb8,
-+ 0x2c, 0xc2, 0x69, 0xb1, 0xd4, 0x8e, 0x93, 0x98,
-+ 0x86, 0xae, 0x54, 0xfd, 0x63, 0x6c, 0x1f, 0xe0,
-+ 0x74, 0xd7, 0x10, 0x12, 0x7d, 0x47, 0x24, 0x91 },
-+ .b_public = (u8[32]){ 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x98, 0xcb, 0x9b, 0x50, 0xdd, 0x3f, 0xc2, 0xb0,
-+ 0xd4, 0xf2, 0xd2, 0xbf, 0x7c, 0x5c, 0xfd, 0xd1,
-+ 0x0c, 0x8f, 0xcd, 0x31, 0xfc, 0x40, 0xaf, 0x1a,
-+ 0xd4, 0x4f, 0x47, 0xc1, 0x31, 0x37, 0x63, 0x62 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x60, 0x88, 0x7b, 0x3d, 0xc7, 0x24, 0x43, 0x02,
-+ 0x6e, 0xbe, 0xdb, 0xbb, 0xb7, 0x06, 0x65, 0xf4,
-+ 0x2b, 0x87, 0xad, 0xd1, 0x44, 0x0e, 0x77, 0x68,
-+ 0xfb, 0xd7, 0xe8, 0xe2, 0xce, 0x5f, 0x63, 0x9d },
-+ .b_public = (u8[32]){ 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x38, 0xd6, 0x30, 0x4c, 0x4a, 0x7e, 0x6d, 0x9f,
-+ 0x79, 0x59, 0x33, 0x4f, 0xb5, 0x24, 0x5b, 0xd2,
-+ 0xc7, 0x54, 0x52, 0x5d, 0x4c, 0x91, 0xdb, 0x95,
-+ 0x02, 0x06, 0x92, 0x62, 0x34, 0xc1, 0xf6, 0x33 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0x78, 0xd3, 0x1d, 0xfa, 0x85, 0x44, 0x97, 0xd7,
-+ 0x2d, 0x8d, 0xef, 0x8a, 0x1b, 0x7f, 0xb0, 0x06,
-+ 0xce, 0xc2, 0xd8, 0xc4, 0x92, 0x46, 0x47, 0xc9,
-+ 0x38, 0x14, 0xae, 0x56, 0xfa, 0xed, 0xa4, 0x95 },
-+ .b_public = (u8[32]){ 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x78, 0x6c, 0xd5, 0x49, 0x96, 0xf0, 0x14, 0xa5,
-+ 0xa0, 0x31, 0xec, 0x14, 0xdb, 0x81, 0x2e, 0xd0,
-+ 0x83, 0x55, 0x06, 0x1f, 0xdb, 0x5d, 0xe6, 0x80,
-+ 0xa8, 0x00, 0xac, 0x52, 0x1f, 0x31, 0x8e, 0x23 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - public key >= p */
-+{
-+ .secret = (u8[32]){ 0xc0, 0x4c, 0x5b, 0xae, 0xfa, 0x83, 0x02, 0xdd,
-+ 0xde, 0xd6, 0xa4, 0xbb, 0x95, 0x77, 0x61, 0xb4,
-+ 0xeb, 0x97, 0xae, 0xfa, 0x4f, 0xc3, 0xb8, 0x04,
-+ 0x30, 0x85, 0xf9, 0x6a, 0x56, 0x59, 0xb3, 0xa5 },
-+ .b_public = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .expected_ss = (u8[32]){ 0x29, 0xae, 0x8b, 0xc7, 0x3e, 0x9b, 0x10, 0xa0,
-+ 0x8b, 0x4f, 0x68, 0x1c, 0x43, 0xc3, 0xe0, 0xac,
-+ 0x1a, 0x17, 0x1d, 0x31, 0xb3, 0x8f, 0x1a, 0x48,
-+ 0xef, 0xba, 0x29, 0xae, 0x63, 0x9e, 0xa1, 0x34 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - RFC 7748 */
-+{
-+ .secret = (u8[32]){ 0xa0, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
-+ 0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
-+ 0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
-+ 0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0x44 },
-+ .b_public = (u8[32]){ 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
-+ 0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
-+ 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
-+ 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
-+ .expected_ss = (u8[32]){ 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
-+ 0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
-+ 0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
-+ 0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - RFC 7748 */
-+{
-+ .secret = (u8[32]){ 0x48, 0x66, 0xe9, 0xd4, 0xd1, 0xb4, 0x67, 0x3c,
-+ 0x5a, 0xd2, 0x26, 0x91, 0x95, 0x7d, 0x6a, 0xf5,
-+ 0xc1, 0x1b, 0x64, 0x21, 0xe0, 0xea, 0x01, 0xd4,
-+ 0x2c, 0xa4, 0x16, 0x9e, 0x79, 0x18, 0xba, 0x4d },
-+ .b_public = (u8[32]){ 0xe5, 0x21, 0x0f, 0x12, 0x78, 0x68, 0x11, 0xd3,
-+ 0xf4, 0xb7, 0x95, 0x9d, 0x05, 0x38, 0xae, 0x2c,
-+ 0x31, 0xdb, 0xe7, 0x10, 0x6f, 0xc0, 0x3c, 0x3e,
-+ 0xfc, 0x4c, 0xd5, 0x49, 0xc7, 0x15, 0xa4, 0x13 },
-+ .expected_ss = (u8[32]){ 0x95, 0xcb, 0xde, 0x94, 0x76, 0xe8, 0x90, 0x7d,
-+ 0x7a, 0xad, 0xe4, 0x5c, 0xb4, 0xb8, 0x73, 0xf8,
-+ 0x8b, 0x59, 0x5a, 0x68, 0x79, 0x9f, 0xa1, 0x52,
-+ 0xe6, 0xf8, 0xf7, 0x64, 0x7a, 0xac, 0x79, 0x57 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x0a, 0xb4, 0xe7, 0x63, 0x80, 0xd8, 0x4d, 0xde,
-+ 0x4f, 0x68, 0x33, 0xc5, 0x8f, 0x2a, 0x9f, 0xb8,
-+ 0xf8, 0x3b, 0xb0, 0x16, 0x9b, 0x17, 0x2b, 0xe4,
-+ 0xb6, 0xe0, 0x59, 0x28, 0x87, 0x74, 0x1a, 0x36 },
-+ .expected_ss = (u8[32]){ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x89, 0xe1, 0x0d, 0x57, 0x01, 0xb4, 0x33, 0x7d,
-+ 0x2d, 0x03, 0x21, 0x81, 0x53, 0x8b, 0x10, 0x64,
-+ 0xbd, 0x40, 0x84, 0x40, 0x1c, 0xec, 0xa1, 0xfd,
-+ 0x12, 0x66, 0x3a, 0x19, 0x59, 0x38, 0x80, 0x00 },
-+ .expected_ss = (u8[32]){ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x2b, 0x55, 0xd3, 0xaa, 0x4a, 0x8f, 0x80, 0xc8,
-+ 0xc0, 0xb2, 0xae, 0x5f, 0x93, 0x3e, 0x85, 0xaf,
-+ 0x49, 0xbe, 0xac, 0x36, 0xc2, 0xfa, 0x73, 0x94,
-+ 0xba, 0xb7, 0x6c, 0x89, 0x33, 0xf8, 0xf8, 0x1d },
-+ .expected_ss = (u8[32]){ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x63, 0xe5, 0xb1, 0xfe, 0x96, 0x01, 0xfe, 0x84,
-+ 0x38, 0x5d, 0x88, 0x66, 0xb0, 0x42, 0x12, 0x62,
-+ 0xf7, 0x8f, 0xbf, 0xa5, 0xaf, 0xf9, 0x58, 0x5e,
-+ 0x62, 0x66, 0x79, 0xb1, 0x85, 0x47, 0xd9, 0x59 },
-+ .expected_ss = (u8[32]){ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0xe4, 0x28, 0xf3, 0xda, 0xc1, 0x78, 0x09, 0xf8,
-+ 0x27, 0xa5, 0x22, 0xce, 0x32, 0x35, 0x50, 0x58,
-+ 0xd0, 0x73, 0x69, 0x36, 0x4a, 0xa7, 0x89, 0x02,
-+ 0xee, 0x10, 0x13, 0x9b, 0x9f, 0x9d, 0xd6, 0x53 },
-+ .expected_ss = (u8[32]){ 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0xb3, 0xb5, 0x0e, 0x3e, 0xd3, 0xa4, 0x07, 0xb9,
-+ 0x5d, 0xe9, 0x42, 0xef, 0x74, 0x57, 0x5b, 0x5a,
-+ 0xb8, 0xa1, 0x0c, 0x09, 0xee, 0x10, 0x35, 0x44,
-+ 0xd6, 0x0b, 0xdf, 0xed, 0x81, 0x38, 0xab, 0x2b },
-+ .expected_ss = (u8[32]){ 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x21, 0x3f, 0xff, 0xe9, 0x3d, 0x5e, 0xa8, 0xcd,
-+ 0x24, 0x2e, 0x46, 0x28, 0x44, 0x02, 0x99, 0x22,
-+ 0xc4, 0x3c, 0x77, 0xc9, 0xe3, 0xe4, 0x2f, 0x56,
-+ 0x2f, 0x48, 0x5d, 0x24, 0xc5, 0x01, 0xa2, 0x0b },
-+ .expected_ss = (u8[32]){ 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x91, 0xb2, 0x32, 0xa1, 0x78, 0xb3, 0xcd, 0x53,
-+ 0x09, 0x32, 0x44, 0x1e, 0x61, 0x39, 0x41, 0x8f,
-+ 0x72, 0x17, 0x22, 0x92, 0xf1, 0xda, 0x4c, 0x18,
-+ 0x34, 0xfc, 0x5e, 0xbf, 0xef, 0xb5, 0x1e, 0x3f },
-+ .expected_ss = (u8[32]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x04, 0x5c, 0x6e, 0x11, 0xc5, 0xd3, 0x32, 0x55,
-+ 0x6c, 0x78, 0x22, 0xfe, 0x94, 0xeb, 0xf8, 0x9b,
-+ 0x56, 0xa3, 0x87, 0x8d, 0xc2, 0x7c, 0xa0, 0x79,
-+ 0x10, 0x30, 0x58, 0x84, 0x9f, 0xab, 0xcb, 0x4f },
-+ .expected_ss = (u8[32]){ 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x1c, 0xa2, 0x19, 0x0b, 0x71, 0x16, 0x35, 0x39,
-+ 0x06, 0x3c, 0x35, 0x77, 0x3b, 0xda, 0x0c, 0x9c,
-+ 0x92, 0x8e, 0x91, 0x36, 0xf0, 0x62, 0x0a, 0xeb,
-+ 0x09, 0x3f, 0x09, 0x91, 0x97, 0xb7, 0xf7, 0x4e },
-+ .expected_ss = (u8[32]){ 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0xf7, 0x6e, 0x90, 0x10, 0xac, 0x33, 0xc5, 0x04,
-+ 0x3b, 0x2d, 0x3b, 0x76, 0xa8, 0x42, 0x17, 0x10,
-+ 0x00, 0xc4, 0x91, 0x62, 0x22, 0xe9, 0xe8, 0x58,
-+ 0x97, 0xa0, 0xae, 0xc7, 0xf6, 0x35, 0x0b, 0x3c },
-+ .expected_ss = (u8[32]){ 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0xbb, 0x72, 0x68, 0x8d, 0x8f, 0x8a, 0xa7, 0xa3,
-+ 0x9c, 0xd6, 0x06, 0x0c, 0xd5, 0xc8, 0x09, 0x3c,
-+ 0xde, 0xc6, 0xfe, 0x34, 0x19, 0x37, 0xc3, 0x88,
-+ 0x6a, 0x99, 0x34, 0x6c, 0xd0, 0x7f, 0xaa, 0x55 },
-+ .expected_ss = (u8[32]){ 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x88, 0xfd, 0xde, 0xa1, 0x93, 0x39, 0x1c, 0x6a,
-+ 0x59, 0x33, 0xef, 0x9b, 0x71, 0x90, 0x15, 0x49,
-+ 0x44, 0x72, 0x05, 0xaa, 0xe9, 0xda, 0x92, 0x8a,
-+ 0x6b, 0x91, 0xa3, 0x52, 0xba, 0x10, 0xf4, 0x1f },
-+ .expected_ss = (u8[32]){ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - edge case for shared secret */
-+{
-+ .secret = (u8[32]){ 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .b_public = (u8[32]){ 0x30, 0x3b, 0x39, 0x2f, 0x15, 0x31, 0x16, 0xca,
-+ 0xd9, 0xcc, 0x68, 0x2a, 0x00, 0xcc, 0xc4, 0x4c,
-+ 0x95, 0xff, 0x0d, 0x3b, 0xbe, 0x56, 0x8b, 0xeb,
-+ 0x6c, 0x4e, 0x73, 0x9b, 0xaf, 0xdc, 0x2c, 0x68 },
-+ .expected_ss = (u8[32]){ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - checking for overflow */
-+{
-+ .secret = (u8[32]){ 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .b_public = (u8[32]){ 0xfd, 0x30, 0x0a, 0xeb, 0x40, 0xe1, 0xfa, 0x58,
-+ 0x25, 0x18, 0x41, 0x2b, 0x49, 0xb2, 0x08, 0xa7,
-+ 0x84, 0x2b, 0x1e, 0x1f, 0x05, 0x6a, 0x04, 0x01,
-+ 0x78, 0xea, 0x41, 0x41, 0x53, 0x4f, 0x65, 0x2d },
-+ .expected_ss = (u8[32]){ 0xb7, 0x34, 0x10, 0x5d, 0xc2, 0x57, 0x58, 0x5d,
-+ 0x73, 0xb5, 0x66, 0xcc, 0xb7, 0x6f, 0x06, 0x27,
-+ 0x95, 0xcc, 0xbe, 0xc8, 0x91, 0x28, 0xe5, 0x2b,
-+ 0x02, 0xf3, 0xe5, 0x96, 0x39, 0xf1, 0x3c, 0x46 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - checking for overflow */
-+{
-+ .secret = (u8[32]){ 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .b_public = (u8[32]){ 0xc8, 0xef, 0x79, 0xb5, 0x14, 0xd7, 0x68, 0x26,
-+ 0x77, 0xbc, 0x79, 0x31, 0xe0, 0x6e, 0xe5, 0xc2,
-+ 0x7c, 0x9b, 0x39, 0x2b, 0x4a, 0xe9, 0x48, 0x44,
-+ 0x73, 0xf5, 0x54, 0xe6, 0x67, 0x8e, 0xcc, 0x2e },
-+ .expected_ss = (u8[32]){ 0x64, 0x7a, 0x46, 0xb6, 0xfc, 0x3f, 0x40, 0xd6,
-+ 0x21, 0x41, 0xee, 0x3c, 0xee, 0x70, 0x6b, 0x4d,
-+ 0x7a, 0x92, 0x71, 0x59, 0x3a, 0x7b, 0x14, 0x3e,
-+ 0x8e, 0x2e, 0x22, 0x79, 0x88, 0x3e, 0x45, 0x50 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - checking for overflow */
-+{
-+ .secret = (u8[32]){ 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .b_public = (u8[32]){ 0x64, 0xae, 0xac, 0x25, 0x04, 0x14, 0x48, 0x61,
-+ 0x53, 0x2b, 0x7b, 0xbc, 0xb6, 0xc8, 0x7d, 0x67,
-+ 0xdd, 0x4c, 0x1f, 0x07, 0xeb, 0xc2, 0xe0, 0x6e,
-+ 0xff, 0xb9, 0x5a, 0xec, 0xc6, 0x17, 0x0b, 0x2c },
-+ .expected_ss = (u8[32]){ 0x4f, 0xf0, 0x3d, 0x5f, 0xb4, 0x3c, 0xd8, 0x65,
-+ 0x7a, 0x3c, 0xf3, 0x7c, 0x13, 0x8c, 0xad, 0xce,
-+ 0xcc, 0xe5, 0x09, 0xe4, 0xeb, 0xa0, 0x89, 0xd0,
-+ 0xef, 0x40, 0xb4, 0xe4, 0xfb, 0x94, 0x61, 0x55 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - checking for overflow */
-+{
-+ .secret = (u8[32]){ 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .b_public = (u8[32]){ 0xbf, 0x68, 0xe3, 0x5e, 0x9b, 0xdb, 0x7e, 0xee,
-+ 0x1b, 0x50, 0x57, 0x02, 0x21, 0x86, 0x0f, 0x5d,
-+ 0xcd, 0xad, 0x8a, 0xcb, 0xab, 0x03, 0x1b, 0x14,
-+ 0x97, 0x4c, 0xc4, 0x90, 0x13, 0xc4, 0x98, 0x31 },
-+ .expected_ss = (u8[32]){ 0x21, 0xce, 0xe5, 0x2e, 0xfd, 0xbc, 0x81, 0x2e,
-+ 0x1d, 0x02, 0x1a, 0x4a, 0xf1, 0xe1, 0xd8, 0xbc,
-+ 0x4d, 0xb3, 0xc4, 0x00, 0xe4, 0xd2, 0xa2, 0xc5,
-+ 0x6a, 0x39, 0x26, 0xdb, 0x4d, 0x99, 0xc6, 0x5b },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - checking for overflow */
-+{
-+ .secret = (u8[32]){ 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .b_public = (u8[32]){ 0x53, 0x47, 0xc4, 0x91, 0x33, 0x1a, 0x64, 0xb4,
-+ 0x3d, 0xdc, 0x68, 0x30, 0x34, 0xe6, 0x77, 0xf5,
-+ 0x3d, 0xc3, 0x2b, 0x52, 0xa5, 0x2a, 0x57, 0x7c,
-+ 0x15, 0xa8, 0x3b, 0xf2, 0x98, 0xe9, 0x9f, 0x19 },
-+ .expected_ss = (u8[32]){ 0x18, 0xcb, 0x89, 0xe4, 0xe2, 0x0c, 0x0c, 0x2b,
-+ 0xd3, 0x24, 0x30, 0x52, 0x45, 0x26, 0x6c, 0x93,
-+ 0x27, 0x69, 0x0b, 0xbe, 0x79, 0xac, 0xb8, 0x8f,
-+ 0x5b, 0x8f, 0xb3, 0xf7, 0x4e, 0xca, 0x3e, 0x52 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - private key == -1 (mod order) */
-+{
-+ .secret = (u8[32]){ 0xa0, 0x23, 0xcd, 0xd0, 0x83, 0xef, 0x5b, 0xb8,
-+ 0x2f, 0x10, 0xd6, 0x2e, 0x59, 0xe1, 0x5a, 0x68,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50 },
-+ .b_public = (u8[32]){ 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
-+ 0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
-+ 0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
-+ 0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
-+ .expected_ss = (u8[32]){ 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
-+ 0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
-+ 0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
-+ 0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+},
-+/* wycheproof - private key == 1 (mod order) on twist */
-+{
-+ .secret = (u8[32]){ 0x58, 0x08, 0x3d, 0xd2, 0x61, 0xad, 0x91, 0xef,
-+ 0xf9, 0x52, 0x32, 0x2e, 0xc8, 0x24, 0xc6, 0x82,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f },
-+ .b_public = (u8[32]){ 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
-+ 0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
-+ 0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
-+ 0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
-+ .expected_ss = (u8[32]){ 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
-+ 0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
-+ 0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
-+ 0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
-+ .secret_size = 32,
-+ .b_public_size = 32,
-+ .expected_ss_size = 32,
-+
-+}
-+};
-+
- static const struct kpp_testvec ecdh_tv_template[] = {
- {
- #ifndef CONFIG_CRYPTO_FIPS
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0027-crypto-curve25519-implement-generic-KPP-driver.patch b/target/linux/generic/backport-5.4/080-wireguard-0027-crypto-curve25519-implement-generic-KPP-driver.patch
deleted file mode 100644
index d909561690..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0027-crypto-curve25519-implement-generic-KPP-driver.patch
+++ /dev/null
@@ -1,136 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:34 +0100
-Subject: [PATCH] crypto: curve25519 - implement generic KPP driver
-
-commit ee772cb641135739c1530647391d5a04c39db192 upstream.
-
-Expose the generic Curve25519 library via the crypto API KPP interface.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/Kconfig | 5 +++
- crypto/Makefile | 1 +
- crypto/curve25519-generic.c | 90 +++++++++++++++++++++++++++++++++++++
- 3 files changed, 96 insertions(+)
- create mode 100644 crypto/curve25519-generic.c
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -264,6 +264,11 @@ config CRYPTO_ECRDSA
- standard algorithms (called GOST algorithms). Only signature verification
- is implemented.
-
-+config CRYPTO_CURVE25519
-+ tristate "Curve25519 algorithm"
-+ select CRYPTO_KPP
-+ select CRYPTO_LIB_CURVE25519_GENERIC
-+
- comment "Authenticated Encryption with Associated Data"
-
- config CRYPTO_CCM
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -167,6 +167,7 @@ obj-$(CONFIG_CRYPTO_ZSTD) += zstd.o
- obj-$(CONFIG_CRYPTO_OFB) += ofb.o
- obj-$(CONFIG_CRYPTO_ECC) += ecc.o
- obj-$(CONFIG_CRYPTO_ESSIV) += essiv.o
-+obj-$(CONFIG_CRYPTO_CURVE25519) += curve25519-generic.o
-
- ecdh_generic-y += ecdh.o
- ecdh_generic-y += ecdh_helper.o
---- /dev/null
-+++ b/crypto/curve25519-generic.c
-@@ -0,0 +1,90 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later
-+
-+#include <crypto/curve25519.h>
-+#include <crypto/internal/kpp.h>
-+#include <crypto/kpp.h>
-+#include <linux/module.h>
-+#include <linux/scatterlist.h>
-+
-+static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
-+ unsigned int len)
-+{
-+ u8 *secret = kpp_tfm_ctx(tfm);
-+
-+ if (!len)
-+ curve25519_generate_secret(secret);
-+ else if (len == CURVE25519_KEY_SIZE &&
-+ crypto_memneq(buf, curve25519_null_point, CURVE25519_KEY_SIZE))
-+ memcpy(secret, buf, CURVE25519_KEY_SIZE);
-+ else
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static int curve25519_compute_value(struct kpp_request *req)
-+{
-+ struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
-+ const u8 *secret = kpp_tfm_ctx(tfm);
-+ u8 public_key[CURVE25519_KEY_SIZE];
-+ u8 buf[CURVE25519_KEY_SIZE];
-+ int copied, nbytes;
-+ u8 const *bp;
-+
-+ if (req->src) {
-+ copied = sg_copy_to_buffer(req->src,
-+ sg_nents_for_len(req->src,
-+ CURVE25519_KEY_SIZE),
-+ public_key, CURVE25519_KEY_SIZE);
-+ if (copied != CURVE25519_KEY_SIZE)
-+ return -EINVAL;
-+ bp = public_key;
-+ } else {
-+ bp = curve25519_base_point;
-+ }
-+
-+ curve25519_generic(buf, secret, bp);
-+
-+ /* might want less than we've got */
-+ nbytes = min_t(size_t, CURVE25519_KEY_SIZE, req->dst_len);
-+ copied = sg_copy_from_buffer(req->dst, sg_nents_for_len(req->dst,
-+ nbytes),
-+ buf, nbytes);
-+ if (copied != nbytes)
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static unsigned int curve25519_max_size(struct crypto_kpp *tfm)
-+{
-+ return CURVE25519_KEY_SIZE;
-+}
-+
-+static struct kpp_alg curve25519_alg = {
-+ .base.cra_name = "curve25519",
-+ .base.cra_driver_name = "curve25519-generic",
-+ .base.cra_priority = 100,
-+ .base.cra_module = THIS_MODULE,
-+ .base.cra_ctxsize = CURVE25519_KEY_SIZE,
-+
-+ .set_secret = curve25519_set_secret,
-+ .generate_public_key = curve25519_compute_value,
-+ .compute_shared_secret = curve25519_compute_value,
-+ .max_size = curve25519_max_size,
-+};
-+
-+static int curve25519_init(void)
-+{
-+ return crypto_register_kpp(&curve25519_alg);
-+}
-+
-+static void curve25519_exit(void)
-+{
-+ crypto_unregister_kpp(&curve25519_alg);
-+}
-+
-+subsys_initcall(curve25519_init);
-+module_exit(curve25519_exit);
-+
-+MODULE_ALIAS_CRYPTO("curve25519");
-+MODULE_ALIAS_CRYPTO("curve25519-generic");
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0028-crypto-lib-curve25519-work-around-Clang-stack-spilli.patch b/target/linux/generic/backport-5.4/080-wireguard-0028-crypto-lib-curve25519-work-around-Clang-stack-spilli.patch
deleted file mode 100644
index 36b59c9aae..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0028-crypto-lib-curve25519-work-around-Clang-stack-spilli.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:35 +0100
-Subject: [PATCH] crypto: lib/curve25519 - work around Clang stack spilling
- issue
-
-commit 660bb8e1f833ea63185fe80fde847e3e42f18e3b upstream.
-
-Arnd reports that the 32-bit generic library code for Curve25119 ends
-up using an excessive amount of stack space when built with Clang:
-
- lib/crypto/curve25519-fiat32.c:756:6: error: stack frame size
- of 1384 bytes in function 'curve25519_generic'
- [-Werror,-Wframe-larger-than=]
-
-Let's give some hints to the compiler regarding which routines should
-not be inlined, to prevent it from running out of registers and spilling
-to the stack. The resulting code performs identically under both GCC
-and Clang, and makes the warning go away.
-
-Suggested-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/curve25519-fiat32.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/lib/crypto/curve25519-fiat32.c
-+++ b/lib/crypto/curve25519-fiat32.c
-@@ -223,7 +223,7 @@ static __always_inline void fe_1(fe *h)
- h->v[0] = 1;
- }
-
--static void fe_add_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+static noinline void fe_add_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
- {
- { const u32 x20 = in1[9];
- { const u32 x21 = in1[8];
-@@ -266,7 +266,7 @@ static __always_inline void fe_add(fe_lo
- fe_add_impl(h->v, f->v, g->v);
- }
-
--static void fe_sub_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+static noinline void fe_sub_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
- {
- { const u32 x20 = in1[9];
- { const u32 x21 = in1[8];
-@@ -309,7 +309,7 @@ static __always_inline void fe_sub(fe_lo
- fe_sub_impl(h->v, f->v, g->v);
- }
-
--static void fe_mul_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
-+static noinline void fe_mul_impl(u32 out[10], const u32 in1[10], const u32 in2[10])
- {
- { const u32 x20 = in1[9];
- { const u32 x21 = in1[8];
-@@ -441,7 +441,7 @@ fe_mul_tll(fe *h, const fe_loose *f, con
- fe_mul_impl(h->v, f->v, g->v);
- }
-
--static void fe_sqr_impl(u32 out[10], const u32 in1[10])
-+static noinline void fe_sqr_impl(u32 out[10], const u32 in1[10])
- {
- { const u32 x17 = in1[9];
- { const u32 x18 = in1[8];
-@@ -619,7 +619,7 @@ static __always_inline void fe_invert(fe
- *
- * Preconditions: b in {0,1}
- */
--static __always_inline void fe_cswap(fe *f, fe *g, unsigned int b)
-+static noinline void fe_cswap(fe *f, fe *g, unsigned int b)
- {
- unsigned i;
- b = 0 - b;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0029-crypto-curve25519-x86_64-library-and-KPP-implementat.patch b/target/linux/generic/backport-5.4/080-wireguard-0029-crypto-curve25519-x86_64-library-and-KPP-implementat.patch
deleted file mode 100644
index 49fd970767..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0029-crypto-curve25519-x86_64-library-and-KPP-implementat.patch
+++ /dev/null
@@ -1,2536 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:36 +0100
-Subject: [PATCH] crypto: curve25519 - x86_64 library and KPP implementations
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit bb611bdfd6be34d9f822c73305fcc83720499d38 upstream.
-
-This implementation is the fastest available x86_64 implementation, and
-unlike Sandy2x, it doesn't requie use of the floating point registers at
-all. Instead it makes use of BMI2 and ADX, available on recent
-microarchitectures. The implementation was written by Armando
-Faz-Hernández with contributions (upstream) from Samuel Neves and me,
-in addition to further changes in the kernel implementation from us.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
-Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
-[ardb: - move to arch/x86/crypto
- - wire into lib/crypto framework
- - implement crypto API KPP hooks ]
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/Makefile | 1 +
- arch/x86/crypto/curve25519-x86_64.c | 2475 +++++++++++++++++++++++++++
- crypto/Kconfig | 6 +
- 3 files changed, 2482 insertions(+)
- create mode 100644 arch/x86/crypto/curve25519-x86_64.c
-
---- a/arch/x86/crypto/Makefile
-+++ b/arch/x86/crypto/Makefile
-@@ -39,6 +39,7 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2)
-
- obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o
- obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o
-+obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o
-
- # These modules require assembler to support AVX.
- ifeq ($(avx_supported),yes)
---- /dev/null
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -0,0 +1,2475 @@
-+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+/*
-+ * Copyright (c) 2017 Armando Faz <armfazh@ic.unicamp.br>. All Rights Reserved.
-+ * Copyright (C) 2018-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ * Copyright (C) 2018 Samuel Neves <sneves@dei.uc.pt>. All Rights Reserved.
-+ */
-+
-+#include <crypto/curve25519.h>
-+#include <crypto/internal/kpp.h>
-+
-+#include <linux/types.h>
-+#include <linux/jump_label.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+
-+#include <asm/cpufeature.h>
-+#include <asm/processor.h>
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(curve25519_use_bmi2);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(curve25519_use_adx);
-+
-+enum { NUM_WORDS_ELTFP25519 = 4 };
-+typedef __aligned(32) u64 eltfp25519_1w[NUM_WORDS_ELTFP25519];
-+typedef __aligned(32) u64 eltfp25519_1w_buffer[2 * NUM_WORDS_ELTFP25519];
-+
-+#define mul_eltfp25519_1w_adx(c, a, b) do { \
-+ mul_256x256_integer_adx(m.buffer, a, b); \
-+ red_eltfp25519_1w_adx(c, m.buffer); \
-+} while (0)
-+
-+#define mul_eltfp25519_1w_bmi2(c, a, b) do { \
-+ mul_256x256_integer_bmi2(m.buffer, a, b); \
-+ red_eltfp25519_1w_bmi2(c, m.buffer); \
-+} while (0)
-+
-+#define sqr_eltfp25519_1w_adx(a) do { \
-+ sqr_256x256_integer_adx(m.buffer, a); \
-+ red_eltfp25519_1w_adx(a, m.buffer); \
-+} while (0)
-+
-+#define sqr_eltfp25519_1w_bmi2(a) do { \
-+ sqr_256x256_integer_bmi2(m.buffer, a); \
-+ red_eltfp25519_1w_bmi2(a, m.buffer); \
-+} while (0)
-+
-+#define mul_eltfp25519_2w_adx(c, a, b) do { \
-+ mul2_256x256_integer_adx(m.buffer, a, b); \
-+ red_eltfp25519_2w_adx(c, m.buffer); \
-+} while (0)
-+
-+#define mul_eltfp25519_2w_bmi2(c, a, b) do { \
-+ mul2_256x256_integer_bmi2(m.buffer, a, b); \
-+ red_eltfp25519_2w_bmi2(c, m.buffer); \
-+} while (0)
-+
-+#define sqr_eltfp25519_2w_adx(a) do { \
-+ sqr2_256x256_integer_adx(m.buffer, a); \
-+ red_eltfp25519_2w_adx(a, m.buffer); \
-+} while (0)
-+
-+#define sqr_eltfp25519_2w_bmi2(a) do { \
-+ sqr2_256x256_integer_bmi2(m.buffer, a); \
-+ red_eltfp25519_2w_bmi2(a, m.buffer); \
-+} while (0)
-+
-+#define sqrn_eltfp25519_1w_adx(a, times) do { \
-+ int ____counter = (times); \
-+ while (____counter-- > 0) \
-+ sqr_eltfp25519_1w_adx(a); \
-+} while (0)
-+
-+#define sqrn_eltfp25519_1w_bmi2(a, times) do { \
-+ int ____counter = (times); \
-+ while (____counter-- > 0) \
-+ sqr_eltfp25519_1w_bmi2(a); \
-+} while (0)
-+
-+#define copy_eltfp25519_1w(C, A) do { \
-+ (C)[0] = (A)[0]; \
-+ (C)[1] = (A)[1]; \
-+ (C)[2] = (A)[2]; \
-+ (C)[3] = (A)[3]; \
-+} while (0)
-+
-+#define setzero_eltfp25519_1w(C) do { \
-+ (C)[0] = 0; \
-+ (C)[1] = 0; \
-+ (C)[2] = 0; \
-+ (C)[3] = 0; \
-+} while (0)
-+
-+__aligned(32) static const u64 table_ladder_8k[252 * NUM_WORDS_ELTFP25519] = {
-+ /* 1 */ 0xfffffffffffffff3UL, 0xffffffffffffffffUL,
-+ 0xffffffffffffffffUL, 0x5fffffffffffffffUL,
-+ /* 2 */ 0x6b8220f416aafe96UL, 0x82ebeb2b4f566a34UL,
-+ 0xd5a9a5b075a5950fUL, 0x5142b2cf4b2488f4UL,
-+ /* 3 */ 0x6aaebc750069680cUL, 0x89cf7820a0f99c41UL,
-+ 0x2a58d9183b56d0f4UL, 0x4b5aca80e36011a4UL,
-+ /* 4 */ 0x329132348c29745dUL, 0xf4a2e616e1642fd7UL,
-+ 0x1e45bb03ff67bc34UL, 0x306912d0f42a9b4aUL,
-+ /* 5 */ 0xff886507e6af7154UL, 0x04f50e13dfeec82fUL,
-+ 0xaa512fe82abab5ceUL, 0x174e251a68d5f222UL,
-+ /* 6 */ 0xcf96700d82028898UL, 0x1743e3370a2c02c5UL,
-+ 0x379eec98b4e86eaaUL, 0x0c59888a51e0482eUL,
-+ /* 7 */ 0xfbcbf1d699b5d189UL, 0xacaef0d58e9fdc84UL,
-+ 0xc1c20d06231f7614UL, 0x2938218da274f972UL,
-+ /* 8 */ 0xf6af49beff1d7f18UL, 0xcc541c22387ac9c2UL,
-+ 0x96fcc9ef4015c56bUL, 0x69c1627c690913a9UL,
-+ /* 9 */ 0x7a86fd2f4733db0eUL, 0xfdb8c4f29e087de9UL,
-+ 0x095e4b1a8ea2a229UL, 0x1ad7a7c829b37a79UL,
-+ /* 10 */ 0x342d89cad17ea0c0UL, 0x67bedda6cced2051UL,
-+ 0x19ca31bf2bb42f74UL, 0x3df7b4c84980acbbUL,
-+ /* 11 */ 0xa8c6444dc80ad883UL, 0xb91e440366e3ab85UL,
-+ 0xc215cda00164f6d8UL, 0x3d867c6ef247e668UL,
-+ /* 12 */ 0xc7dd582bcc3e658cUL, 0xfd2c4748ee0e5528UL,
-+ 0xa0fd9b95cc9f4f71UL, 0x7529d871b0675ddfUL,
-+ /* 13 */ 0xb8f568b42d3cbd78UL, 0x1233011b91f3da82UL,
-+ 0x2dce6ccd4a7c3b62UL, 0x75e7fc8e9e498603UL,
-+ /* 14 */ 0x2f4f13f1fcd0b6ecUL, 0xf1a8ca1f29ff7a45UL,
-+ 0xc249c1a72981e29bUL, 0x6ebe0dbb8c83b56aUL,
-+ /* 15 */ 0x7114fa8d170bb222UL, 0x65a2dcd5bf93935fUL,
-+ 0xbdc41f68b59c979aUL, 0x2f0eef79a2ce9289UL,
-+ /* 16 */ 0x42ecbf0c083c37ceUL, 0x2930bc09ec496322UL,
-+ 0xf294b0c19cfeac0dUL, 0x3780aa4bedfabb80UL,
-+ /* 17 */ 0x56c17d3e7cead929UL, 0xe7cb4beb2e5722c5UL,
-+ 0x0ce931732dbfe15aUL, 0x41b883c7621052f8UL,
-+ /* 18 */ 0xdbf75ca0c3d25350UL, 0x2936be086eb1e351UL,
-+ 0xc936e03cb4a9b212UL, 0x1d45bf82322225aaUL,
-+ /* 19 */ 0xe81ab1036a024cc5UL, 0xe212201c304c9a72UL,
-+ 0xc5d73fba6832b1fcUL, 0x20ffdb5a4d839581UL,
-+ /* 20 */ 0xa283d367be5d0fadUL, 0x6c2b25ca8b164475UL,
-+ 0x9d4935467caaf22eUL, 0x5166408eee85ff49UL,
-+ /* 21 */ 0x3c67baa2fab4e361UL, 0xb3e433c67ef35cefUL,
-+ 0x5259729241159b1cUL, 0x6a621892d5b0ab33UL,
-+ /* 22 */ 0x20b74a387555cdcbUL, 0x532aa10e1208923fUL,
-+ 0xeaa17b7762281dd1UL, 0x61ab3443f05c44bfUL,
-+ /* 23 */ 0x257a6c422324def8UL, 0x131c6c1017e3cf7fUL,
-+ 0x23758739f630a257UL, 0x295a407a01a78580UL,
-+ /* 24 */ 0xf8c443246d5da8d9UL, 0x19d775450c52fa5dUL,
-+ 0x2afcfc92731bf83dUL, 0x7d10c8e81b2b4700UL,
-+ /* 25 */ 0xc8e0271f70baa20bUL, 0x993748867ca63957UL,
-+ 0x5412efb3cb7ed4bbUL, 0x3196d36173e62975UL,
-+ /* 26 */ 0xde5bcad141c7dffcUL, 0x47cc8cd2b395c848UL,
-+ 0xa34cd942e11af3cbUL, 0x0256dbf2d04ecec2UL,
-+ /* 27 */ 0x875ab7e94b0e667fUL, 0xcad4dd83c0850d10UL,
-+ 0x47f12e8f4e72c79fUL, 0x5f1a87bb8c85b19bUL,
-+ /* 28 */ 0x7ae9d0b6437f51b8UL, 0x12c7ce5518879065UL,
-+ 0x2ade09fe5cf77aeeUL, 0x23a05a2f7d2c5627UL,
-+ /* 29 */ 0x5908e128f17c169aUL, 0xf77498dd8ad0852dUL,
-+ 0x74b4c4ceab102f64UL, 0x183abadd10139845UL,
-+ /* 30 */ 0xb165ba8daa92aaacUL, 0xd5c5ef9599386705UL,
-+ 0xbe2f8f0cf8fc40d1UL, 0x2701e635ee204514UL,
-+ /* 31 */ 0x629fa80020156514UL, 0xf223868764a8c1ceUL,
-+ 0x5b894fff0b3f060eUL, 0x60d9944cf708a3faUL,
-+ /* 32 */ 0xaeea001a1c7a201fUL, 0xebf16a633ee2ce63UL,
-+ 0x6f7709594c7a07e1UL, 0x79b958150d0208cbUL,
-+ /* 33 */ 0x24b55e5301d410e7UL, 0xe3a34edff3fdc84dUL,
-+ 0xd88768e4904032d8UL, 0x131384427b3aaeecUL,
-+ /* 34 */ 0x8405e51286234f14UL, 0x14dc4739adb4c529UL,
-+ 0xb8a2b5b250634ffdUL, 0x2fe2a94ad8a7ff93UL,
-+ /* 35 */ 0xec5c57efe843faddUL, 0x2843ce40f0bb9918UL,
-+ 0xa4b561d6cf3d6305UL, 0x743629bde8fb777eUL,
-+ /* 36 */ 0x343edd46bbaf738fUL, 0xed981828b101a651UL,
-+ 0xa401760b882c797aUL, 0x1fc223e28dc88730UL,
-+ /* 37 */ 0x48604e91fc0fba0eUL, 0xb637f78f052c6fa4UL,
-+ 0x91ccac3d09e9239cUL, 0x23f7eed4437a687cUL,
-+ /* 38 */ 0x5173b1118d9bd800UL, 0x29d641b63189d4a7UL,
-+ 0xfdbf177988bbc586UL, 0x2959894fcad81df5UL,
-+ /* 39 */ 0xaebc8ef3b4bbc899UL, 0x4148995ab26992b9UL,
-+ 0x24e20b0134f92cfbUL, 0x40d158894a05dee8UL,
-+ /* 40 */ 0x46b00b1185af76f6UL, 0x26bac77873187a79UL,
-+ 0x3dc0bf95ab8fff5fUL, 0x2a608bd8945524d7UL,
-+ /* 41 */ 0x26449588bd446302UL, 0x7c4bc21c0388439cUL,
-+ 0x8e98a4f383bd11b2UL, 0x26218d7bc9d876b9UL,
-+ /* 42 */ 0xe3081542997c178aUL, 0x3c2d29a86fb6606fUL,
-+ 0x5c217736fa279374UL, 0x7dde05734afeb1faUL,
-+ /* 43 */ 0x3bf10e3906d42babUL, 0xe4f7803e1980649cUL,
-+ 0xe6053bf89595bf7aUL, 0x394faf38da245530UL,
-+ /* 44 */ 0x7a8efb58896928f4UL, 0xfbc778e9cc6a113cUL,
-+ 0x72670ce330af596fUL, 0x48f222a81d3d6cf7UL,
-+ /* 45 */ 0xf01fce410d72caa7UL, 0x5a20ecc7213b5595UL,
-+ 0x7bc21165c1fa1483UL, 0x07f89ae31da8a741UL,
-+ /* 46 */ 0x05d2c2b4c6830ff9UL, 0xd43e330fc6316293UL,
-+ 0xa5a5590a96d3a904UL, 0x705edb91a65333b6UL,
-+ /* 47 */ 0x048ee15e0bb9a5f7UL, 0x3240cfca9e0aaf5dUL,
-+ 0x8f4b71ceedc4a40bUL, 0x621c0da3de544a6dUL,
-+ /* 48 */ 0x92872836a08c4091UL, 0xce8375b010c91445UL,
-+ 0x8a72eb524f276394UL, 0x2667fcfa7ec83635UL,
-+ /* 49 */ 0x7f4c173345e8752aUL, 0x061b47feee7079a5UL,
-+ 0x25dd9afa9f86ff34UL, 0x3780cef5425dc89cUL,
-+ /* 50 */ 0x1a46035a513bb4e9UL, 0x3e1ef379ac575adaUL,
-+ 0xc78c5f1c5fa24b50UL, 0x321a967634fd9f22UL,
-+ /* 51 */ 0x946707b8826e27faUL, 0x3dca84d64c506fd0UL,
-+ 0xc189218075e91436UL, 0x6d9284169b3b8484UL,
-+ /* 52 */ 0x3a67e840383f2ddfUL, 0x33eec9a30c4f9b75UL,
-+ 0x3ec7c86fa783ef47UL, 0x26ec449fbac9fbc4UL,
-+ /* 53 */ 0x5c0f38cba09b9e7dUL, 0x81168cc762a3478cUL,
-+ 0x3e23b0d306fc121cUL, 0x5a238aa0a5efdcddUL,
-+ /* 54 */ 0x1ba26121c4ea43ffUL, 0x36f8c77f7c8832b5UL,
-+ 0x88fbea0b0adcf99aUL, 0x5ca9938ec25bebf9UL,
-+ /* 55 */ 0xd5436a5e51fccda0UL, 0x1dbc4797c2cd893bUL,
-+ 0x19346a65d3224a08UL, 0x0f5034e49b9af466UL,
-+ /* 56 */ 0xf23c3967a1e0b96eUL, 0xe58b08fa867a4d88UL,
-+ 0xfb2fabc6a7341679UL, 0x2a75381eb6026946UL,
-+ /* 57 */ 0xc80a3be4c19420acUL, 0x66b1f6c681f2b6dcUL,
-+ 0x7cf7036761e93388UL, 0x25abbbd8a660a4c4UL,
-+ /* 58 */ 0x91ea12ba14fd5198UL, 0x684950fc4a3cffa9UL,
-+ 0xf826842130f5ad28UL, 0x3ea988f75301a441UL,
-+ /* 59 */ 0xc978109a695f8c6fUL, 0x1746eb4a0530c3f3UL,
-+ 0x444d6d77b4459995UL, 0x75952b8c054e5cc7UL,
-+ /* 60 */ 0xa3703f7915f4d6aaUL, 0x66c346202f2647d8UL,
-+ 0xd01469df811d644bUL, 0x77fea47d81a5d71fUL,
-+ /* 61 */ 0xc5e9529ef57ca381UL, 0x6eeeb4b9ce2f881aUL,
-+ 0xb6e91a28e8009bd6UL, 0x4b80be3e9afc3fecUL,
-+ /* 62 */ 0x7e3773c526aed2c5UL, 0x1b4afcb453c9a49dUL,
-+ 0xa920bdd7baffb24dUL, 0x7c54699f122d400eUL,
-+ /* 63 */ 0xef46c8e14fa94bc8UL, 0xe0b074ce2952ed5eUL,
-+ 0xbea450e1dbd885d5UL, 0x61b68649320f712cUL,
-+ /* 64 */ 0x8a485f7309ccbdd1UL, 0xbd06320d7d4d1a2dUL,
-+ 0x25232973322dbef4UL, 0x445dc4758c17f770UL,
-+ /* 65 */ 0xdb0434177cc8933cUL, 0xed6fe82175ea059fUL,
-+ 0x1efebefdc053db34UL, 0x4adbe867c65daf99UL,
-+ /* 66 */ 0x3acd71a2a90609dfUL, 0xe5e991856dd04050UL,
-+ 0x1ec69b688157c23cUL, 0x697427f6885cfe4dUL,
-+ /* 67 */ 0xd7be7b9b65e1a851UL, 0xa03d28d522c536ddUL,
-+ 0x28399d658fd2b645UL, 0x49e5b7e17c2641e1UL,
-+ /* 68 */ 0x6f8c3a98700457a4UL, 0x5078f0a25ebb6778UL,
-+ 0xd13c3ccbc382960fUL, 0x2e003258a7df84b1UL,
-+ /* 69 */ 0x8ad1f39be6296a1cUL, 0xc1eeaa652a5fbfb2UL,
-+ 0x33ee0673fd26f3cbUL, 0x59256173a69d2cccUL,
-+ /* 70 */ 0x41ea07aa4e18fc41UL, 0xd9fc19527c87a51eUL,
-+ 0xbdaacb805831ca6fUL, 0x445b652dc916694fUL,
-+ /* 71 */ 0xce92a3a7f2172315UL, 0x1edc282de11b9964UL,
-+ 0xa1823aafe04c314aUL, 0x790a2d94437cf586UL,
-+ /* 72 */ 0x71c447fb93f6e009UL, 0x8922a56722845276UL,
-+ 0xbf70903b204f5169UL, 0x2f7a89891ba319feUL,
-+ /* 73 */ 0x02a08eb577e2140cUL, 0xed9a4ed4427bdcf4UL,
-+ 0x5253ec44e4323cd1UL, 0x3e88363c14e9355bUL,
-+ /* 74 */ 0xaa66c14277110b8cUL, 0x1ae0391610a23390UL,
-+ 0x2030bd12c93fc2a2UL, 0x3ee141579555c7abUL,
-+ /* 75 */ 0x9214de3a6d6e7d41UL, 0x3ccdd88607f17efeUL,
-+ 0x674f1288f8e11217UL, 0x5682250f329f93d0UL,
-+ /* 76 */ 0x6cf00b136d2e396eUL, 0x6e4cf86f1014debfUL,
-+ 0x5930b1b5bfcc4e83UL, 0x047069b48aba16b6UL,
-+ /* 77 */ 0x0d4ce4ab69b20793UL, 0xb24db91a97d0fb9eUL,
-+ 0xcdfa50f54e00d01dUL, 0x221b1085368bddb5UL,
-+ /* 78 */ 0xe7e59468b1e3d8d2UL, 0x53c56563bd122f93UL,
-+ 0xeee8a903e0663f09UL, 0x61efa662cbbe3d42UL,
-+ /* 79 */ 0x2cf8ddddde6eab2aUL, 0x9bf80ad51435f231UL,
-+ 0x5deadacec9f04973UL, 0x29275b5d41d29b27UL,
-+ /* 80 */ 0xcfde0f0895ebf14fUL, 0xb9aab96b054905a7UL,
-+ 0xcae80dd9a1c420fdUL, 0x0a63bf2f1673bbc7UL,
-+ /* 81 */ 0x092f6e11958fbc8cUL, 0x672a81e804822fadUL,
-+ 0xcac8351560d52517UL, 0x6f3f7722c8f192f8UL,
-+ /* 82 */ 0xf8ba90ccc2e894b7UL, 0x2c7557a438ff9f0dUL,
-+ 0x894d1d855ae52359UL, 0x68e122157b743d69UL,
-+ /* 83 */ 0xd87e5570cfb919f3UL, 0x3f2cdecd95798db9UL,
-+ 0x2121154710c0a2ceUL, 0x3c66a115246dc5b2UL,
-+ /* 84 */ 0xcbedc562294ecb72UL, 0xba7143c36a280b16UL,
-+ 0x9610c2efd4078b67UL, 0x6144735d946a4b1eUL,
-+ /* 85 */ 0x536f111ed75b3350UL, 0x0211db8c2041d81bUL,
-+ 0xf93cb1000e10413cUL, 0x149dfd3c039e8876UL,
-+ /* 86 */ 0xd479dde46b63155bUL, 0xb66e15e93c837976UL,
-+ 0xdafde43b1f13e038UL, 0x5fafda1a2e4b0b35UL,
-+ /* 87 */ 0x3600bbdf17197581UL, 0x3972050bbe3cd2c2UL,
-+ 0x5938906dbdd5be86UL, 0x34fce5e43f9b860fUL,
-+ /* 88 */ 0x75a8a4cd42d14d02UL, 0x828dabc53441df65UL,
-+ 0x33dcabedd2e131d3UL, 0x3ebad76fb814d25fUL,
-+ /* 89 */ 0xd4906f566f70e10fUL, 0x5d12f7aa51690f5aUL,
-+ 0x45adb16e76cefcf2UL, 0x01f768aead232999UL,
-+ /* 90 */ 0x2b6cc77b6248febdUL, 0x3cd30628ec3aaffdUL,
-+ 0xce1c0b80d4ef486aUL, 0x4c3bff2ea6f66c23UL,
-+ /* 91 */ 0x3f2ec4094aeaeb5fUL, 0x61b19b286e372ca7UL,
-+ 0x5eefa966de2a701dUL, 0x23b20565de55e3efUL,
-+ /* 92 */ 0xe301ca5279d58557UL, 0x07b2d4ce27c2874fUL,
-+ 0xa532cd8a9dcf1d67UL, 0x2a52fee23f2bff56UL,
-+ /* 93 */ 0x8624efb37cd8663dUL, 0xbbc7ac20ffbd7594UL,
-+ 0x57b85e9c82d37445UL, 0x7b3052cb86a6ec66UL,
-+ /* 94 */ 0x3482f0ad2525e91eUL, 0x2cb68043d28edca0UL,
-+ 0xaf4f6d052e1b003aUL, 0x185f8c2529781b0aUL,
-+ /* 95 */ 0xaa41de5bd80ce0d6UL, 0x9407b2416853e9d6UL,
-+ 0x563ec36e357f4c3aUL, 0x4cc4b8dd0e297bceUL,
-+ /* 96 */ 0xa2fc1a52ffb8730eUL, 0x1811f16e67058e37UL,
-+ 0x10f9a366cddf4ee1UL, 0x72f4a0c4a0b9f099UL,
-+ /* 97 */ 0x8c16c06f663f4ea7UL, 0x693b3af74e970fbaUL,
-+ 0x2102e7f1d69ec345UL, 0x0ba53cbc968a8089UL,
-+ /* 98 */ 0xca3d9dc7fea15537UL, 0x4c6824bb51536493UL,
-+ 0xb9886314844006b1UL, 0x40d2a72ab454cc60UL,
-+ /* 99 */ 0x5936a1b712570975UL, 0x91b9d648debda657UL,
-+ 0x3344094bb64330eaUL, 0x006ba10d12ee51d0UL,
-+ /* 100 */ 0x19228468f5de5d58UL, 0x0eb12f4c38cc05b0UL,
-+ 0xa1039f9dd5601990UL, 0x4502d4ce4fff0e0bUL,
-+ /* 101 */ 0xeb2054106837c189UL, 0xd0f6544c6dd3b93cUL,
-+ 0x40727064c416d74fUL, 0x6e15c6114b502ef0UL,
-+ /* 102 */ 0x4df2a398cfb1a76bUL, 0x11256c7419f2f6b1UL,
-+ 0x4a497962066e6043UL, 0x705b3aab41355b44UL,
-+ /* 103 */ 0x365ef536d797b1d8UL, 0x00076bd622ddf0dbUL,
-+ 0x3bbf33b0e0575a88UL, 0x3777aa05c8e4ca4dUL,
-+ /* 104 */ 0x392745c85578db5fUL, 0x6fda4149dbae5ae2UL,
-+ 0xb1f0b00b8adc9867UL, 0x09963437d36f1da3UL,
-+ /* 105 */ 0x7e824e90a5dc3853UL, 0xccb5f6641f135cbdUL,
-+ 0x6736d86c87ce8fccUL, 0x625f3ce26604249fUL,
-+ /* 106 */ 0xaf8ac8059502f63fUL, 0x0c05e70a2e351469UL,
-+ 0x35292e9c764b6305UL, 0x1a394360c7e23ac3UL,
-+ /* 107 */ 0xd5c6d53251183264UL, 0x62065abd43c2b74fUL,
-+ 0xb5fbf5d03b973f9bUL, 0x13a3da3661206e5eUL,
-+ /* 108 */ 0xc6bd5837725d94e5UL, 0x18e30912205016c5UL,
-+ 0x2088ce1570033c68UL, 0x7fba1f495c837987UL,
-+ /* 109 */ 0x5a8c7423f2f9079dUL, 0x1735157b34023fc5UL,
-+ 0xe4f9b49ad2fab351UL, 0x6691ff72c878e33cUL,
-+ /* 110 */ 0x122c2adedc5eff3eUL, 0xf8dd4bf1d8956cf4UL,
-+ 0xeb86205d9e9e5bdaUL, 0x049b92b9d975c743UL,
-+ /* 111 */ 0xa5379730b0f6c05aUL, 0x72a0ffacc6f3a553UL,
-+ 0xb0032c34b20dcd6dUL, 0x470e9dbc88d5164aUL,
-+ /* 112 */ 0xb19cf10ca237c047UL, 0xb65466711f6c81a2UL,
-+ 0xb3321bd16dd80b43UL, 0x48c14f600c5fbe8eUL,
-+ /* 113 */ 0x66451c264aa6c803UL, 0xb66e3904a4fa7da6UL,
-+ 0xd45f19b0b3128395UL, 0x31602627c3c9bc10UL,
-+ /* 114 */ 0x3120dc4832e4e10dUL, 0xeb20c46756c717f7UL,
-+ 0x00f52e3f67280294UL, 0x566d4fc14730c509UL,
-+ /* 115 */ 0x7e3a5d40fd837206UL, 0xc1e926dc7159547aUL,
-+ 0x216730fba68d6095UL, 0x22e8c3843f69cea7UL,
-+ /* 116 */ 0x33d074e8930e4b2bUL, 0xb6e4350e84d15816UL,
-+ 0x5534c26ad6ba2365UL, 0x7773c12f89f1f3f3UL,
-+ /* 117 */ 0x8cba404da57962aaUL, 0x5b9897a81999ce56UL,
-+ 0x508e862f121692fcUL, 0x3a81907fa093c291UL,
-+ /* 118 */ 0x0dded0ff4725a510UL, 0x10d8cc10673fc503UL,
-+ 0x5b9d151c9f1f4e89UL, 0x32a5c1d5cb09a44cUL,
-+ /* 119 */ 0x1e0aa442b90541fbUL, 0x5f85eb7cc1b485dbUL,
-+ 0xbee595ce8a9df2e5UL, 0x25e496c722422236UL,
-+ /* 120 */ 0x5edf3c46cd0fe5b9UL, 0x34e75a7ed2a43388UL,
-+ 0xe488de11d761e352UL, 0x0e878a01a085545cUL,
-+ /* 121 */ 0xba493c77e021bb04UL, 0x2b4d1843c7df899aUL,
-+ 0x9ea37a487ae80d67UL, 0x67a9958011e41794UL,
-+ /* 122 */ 0x4b58051a6697b065UL, 0x47e33f7d8d6ba6d4UL,
-+ 0xbb4da8d483ca46c1UL, 0x68becaa181c2db0dUL,
-+ /* 123 */ 0x8d8980e90b989aa5UL, 0xf95eb14a2c93c99bUL,
-+ 0x51c6c7c4796e73a2UL, 0x6e228363b5efb569UL,
-+ /* 124 */ 0xc6bbc0b02dd624c8UL, 0x777eb47dec8170eeUL,
-+ 0x3cde15a004cfafa9UL, 0x1dc6bc087160bf9bUL,
-+ /* 125 */ 0x2e07e043eec34002UL, 0x18e9fc677a68dc7fUL,
-+ 0xd8da03188bd15b9aUL, 0x48fbc3bb00568253UL,
-+ /* 126 */ 0x57547d4cfb654ce1UL, 0xd3565b82a058e2adUL,
-+ 0xf63eaf0bbf154478UL, 0x47531ef114dfbb18UL,
-+ /* 127 */ 0xe1ec630a4278c587UL, 0x5507d546ca8e83f3UL,
-+ 0x85e135c63adc0c2bUL, 0x0aa7efa85682844eUL,
-+ /* 128 */ 0x72691ba8b3e1f615UL, 0x32b4e9701fbe3ffaUL,
-+ 0x97b6d92e39bb7868UL, 0x2cfe53dea02e39e8UL,
-+ /* 129 */ 0x687392cd85cd52b0UL, 0x27ff66c910e29831UL,
-+ 0x97134556a9832d06UL, 0x269bb0360a84f8a0UL,
-+ /* 130 */ 0x706e55457643f85cUL, 0x3734a48c9b597d1bUL,
-+ 0x7aee91e8c6efa472UL, 0x5cd6abc198a9d9e0UL,
-+ /* 131 */ 0x0e04de06cb3ce41aUL, 0xd8c6eb893402e138UL,
-+ 0x904659bb686e3772UL, 0x7215c371746ba8c8UL,
-+ /* 132 */ 0xfd12a97eeae4a2d9UL, 0x9514b7516394f2c5UL,
-+ 0x266fd5809208f294UL, 0x5c847085619a26b9UL,
-+ /* 133 */ 0x52985410fed694eaUL, 0x3c905b934a2ed254UL,
-+ 0x10bb47692d3be467UL, 0x063b3d2d69e5e9e1UL,
-+ /* 134 */ 0x472726eedda57debUL, 0xefb6c4ae10f41891UL,
-+ 0x2b1641917b307614UL, 0x117c554fc4f45b7cUL,
-+ /* 135 */ 0xc07cf3118f9d8812UL, 0x01dbd82050017939UL,
-+ 0xd7e803f4171b2827UL, 0x1015e87487d225eaUL,
-+ /* 136 */ 0xc58de3fed23acc4dUL, 0x50db91c294a7be2dUL,
-+ 0x0b94d43d1c9cf457UL, 0x6b1640fa6e37524aUL,
-+ /* 137 */ 0x692f346c5fda0d09UL, 0x200b1c59fa4d3151UL,
-+ 0xb8c46f760777a296UL, 0x4b38395f3ffdfbcfUL,
-+ /* 138 */ 0x18d25e00be54d671UL, 0x60d50582bec8aba6UL,
-+ 0x87ad8f263b78b982UL, 0x50fdf64e9cda0432UL,
-+ /* 139 */ 0x90f567aac578dcf0UL, 0xef1e9b0ef2a3133bUL,
-+ 0x0eebba9242d9de71UL, 0x15473c9bf03101c7UL,
-+ /* 140 */ 0x7c77e8ae56b78095UL, 0xb678e7666e6f078eUL,
-+ 0x2da0b9615348ba1fUL, 0x7cf931c1ff733f0bUL,
-+ /* 141 */ 0x26b357f50a0a366cUL, 0xe9708cf42b87d732UL,
-+ 0xc13aeea5f91cb2c0UL, 0x35d90c991143bb4cUL,
-+ /* 142 */ 0x47c1c404a9a0d9dcUL, 0x659e58451972d251UL,
-+ 0x3875a8c473b38c31UL, 0x1fbd9ed379561f24UL,
-+ /* 143 */ 0x11fabc6fd41ec28dUL, 0x7ef8dfe3cd2a2dcaUL,
-+ 0x72e73b5d8c404595UL, 0x6135fa4954b72f27UL,
-+ /* 144 */ 0xccfc32a2de24b69cUL, 0x3f55698c1f095d88UL,
-+ 0xbe3350ed5ac3f929UL, 0x5e9bf806ca477eebUL,
-+ /* 145 */ 0xe9ce8fb63c309f68UL, 0x5376f63565e1f9f4UL,
-+ 0xd1afcfb35a6393f1UL, 0x6632a1ede5623506UL,
-+ /* 146 */ 0x0b7d6c390c2ded4cUL, 0x56cb3281df04cb1fUL,
-+ 0x66305a1249ecc3c7UL, 0x5d588b60a38ca72aUL,
-+ /* 147 */ 0xa6ecbf78e8e5f42dUL, 0x86eeb44b3c8a3eecUL,
-+ 0xec219c48fbd21604UL, 0x1aaf1af517c36731UL,
-+ /* 148 */ 0xc306a2836769bde7UL, 0x208280622b1e2adbUL,
-+ 0x8027f51ffbff94a6UL, 0x76cfa1ce1124f26bUL,
-+ /* 149 */ 0x18eb00562422abb6UL, 0xf377c4d58f8c29c3UL,
-+ 0x4dbbc207f531561aUL, 0x0253b7f082128a27UL,
-+ /* 150 */ 0x3d1f091cb62c17e0UL, 0x4860e1abd64628a9UL,
-+ 0x52d17436309d4253UL, 0x356f97e13efae576UL,
-+ /* 151 */ 0xd351e11aa150535bUL, 0x3e6b45bb1dd878ccUL,
-+ 0x0c776128bed92c98UL, 0x1d34ae93032885b8UL,
-+ /* 152 */ 0x4ba0488ca85ba4c3UL, 0x985348c33c9ce6ceUL,
-+ 0x66124c6f97bda770UL, 0x0f81a0290654124aUL,
-+ /* 153 */ 0x9ed09ca6569b86fdUL, 0x811009fd18af9a2dUL,
-+ 0xff08d03f93d8c20aUL, 0x52a148199faef26bUL,
-+ /* 154 */ 0x3e03f9dc2d8d1b73UL, 0x4205801873961a70UL,
-+ 0xc0d987f041a35970UL, 0x07aa1f15a1c0d549UL,
-+ /* 155 */ 0xdfd46ce08cd27224UL, 0x6d0a024f934e4239UL,
-+ 0x808a7a6399897b59UL, 0x0a4556e9e13d95a2UL,
-+ /* 156 */ 0xd21a991fe9c13045UL, 0x9b0e8548fe7751b8UL,
-+ 0x5da643cb4bf30035UL, 0x77db28d63940f721UL,
-+ /* 157 */ 0xfc5eeb614adc9011UL, 0x5229419ae8c411ebUL,
-+ 0x9ec3e7787d1dcf74UL, 0x340d053e216e4cb5UL,
-+ /* 158 */ 0xcac7af39b48df2b4UL, 0xc0faec2871a10a94UL,
-+ 0x140a69245ca575edUL, 0x0cf1c37134273a4cUL,
-+ /* 159 */ 0xc8ee306ac224b8a5UL, 0x57eaee7ccb4930b0UL,
-+ 0xa1e806bdaacbe74fUL, 0x7d9a62742eeb657dUL,
-+ /* 160 */ 0x9eb6b6ef546c4830UL, 0x885cca1fddb36e2eUL,
-+ 0xe6b9f383ef0d7105UL, 0x58654fef9d2e0412UL,
-+ /* 161 */ 0xa905c4ffbe0e8e26UL, 0x942de5df9b31816eUL,
-+ 0x497d723f802e88e1UL, 0x30684dea602f408dUL,
-+ /* 162 */ 0x21e5a278a3e6cb34UL, 0xaefb6e6f5b151dc4UL,
-+ 0xb30b8e049d77ca15UL, 0x28c3c9cf53b98981UL,
-+ /* 163 */ 0x287fb721556cdd2aUL, 0x0d317ca897022274UL,
-+ 0x7468c7423a543258UL, 0x4a7f11464eb5642fUL,
-+ /* 164 */ 0xa237a4774d193aa6UL, 0xd865986ea92129a1UL,
-+ 0x24c515ecf87c1a88UL, 0x604003575f39f5ebUL,
-+ /* 165 */ 0x47b9f189570a9b27UL, 0x2b98cede465e4b78UL,
-+ 0x026df551dbb85c20UL, 0x74fcd91047e21901UL,
-+ /* 166 */ 0x13e2a90a23c1bfa3UL, 0x0cb0074e478519f6UL,
-+ 0x5ff1cbbe3af6cf44UL, 0x67fe5438be812dbeUL,
-+ /* 167 */ 0xd13cf64fa40f05b0UL, 0x054dfb2f32283787UL,
-+ 0x4173915b7f0d2aeaUL, 0x482f144f1f610d4eUL,
-+ /* 168 */ 0xf6210201b47f8234UL, 0x5d0ae1929e70b990UL,
-+ 0xdcd7f455b049567cUL, 0x7e93d0f1f0916f01UL,
-+ /* 169 */ 0xdd79cbf18a7db4faUL, 0xbe8391bf6f74c62fUL,
-+ 0x027145d14b8291bdUL, 0x585a73ea2cbf1705UL,
-+ /* 170 */ 0x485ca03e928a0db2UL, 0x10fc01a5742857e7UL,
-+ 0x2f482edbd6d551a7UL, 0x0f0433b5048fdb8aUL,
-+ /* 171 */ 0x60da2e8dd7dc6247UL, 0x88b4c9d38cd4819aUL,
-+ 0x13033ac001f66697UL, 0x273b24fe3b367d75UL,
-+ /* 172 */ 0xc6e8f66a31b3b9d4UL, 0x281514a494df49d5UL,
-+ 0xd1726fdfc8b23da7UL, 0x4b3ae7d103dee548UL,
-+ /* 173 */ 0xc6256e19ce4b9d7eUL, 0xff5c5cf186e3c61cUL,
-+ 0xacc63ca34b8ec145UL, 0x74621888fee66574UL,
-+ /* 174 */ 0x956f409645290a1eUL, 0xef0bf8e3263a962eUL,
-+ 0xed6a50eb5ec2647bUL, 0x0694283a9dca7502UL,
-+ /* 175 */ 0x769b963643a2dcd1UL, 0x42b7c8ea09fc5353UL,
-+ 0x4f002aee13397eabUL, 0x63005e2c19b7d63aUL,
-+ /* 176 */ 0xca6736da63023beaUL, 0x966c7f6db12a99b7UL,
-+ 0xace09390c537c5e1UL, 0x0b696063a1aa89eeUL,
-+ /* 177 */ 0xebb03e97288c56e5UL, 0x432a9f9f938c8be8UL,
-+ 0xa6a5a93d5b717f71UL, 0x1a5fb4c3e18f9d97UL,
-+ /* 178 */ 0x1c94e7ad1c60cdceUL, 0xee202a43fc02c4a0UL,
-+ 0x8dafe4d867c46a20UL, 0x0a10263c8ac27b58UL,
-+ /* 179 */ 0xd0dea9dfe4432a4aUL, 0x856af87bbe9277c5UL,
-+ 0xce8472acc212c71aUL, 0x6f151b6d9bbb1e91UL,
-+ /* 180 */ 0x26776c527ceed56aUL, 0x7d211cb7fbf8faecUL,
-+ 0x37ae66a6fd4609ccUL, 0x1f81b702d2770c42UL,
-+ /* 181 */ 0x2fb0b057eac58392UL, 0xe1dd89fe29744e9dUL,
-+ 0xc964f8eb17beb4f8UL, 0x29571073c9a2d41eUL,
-+ /* 182 */ 0xa948a18981c0e254UL, 0x2df6369b65b22830UL,
-+ 0xa33eb2d75fcfd3c6UL, 0x078cd6ec4199a01fUL,
-+ /* 183 */ 0x4a584a41ad900d2fUL, 0x32142b78e2c74c52UL,
-+ 0x68c4e8338431c978UL, 0x7f69ea9008689fc2UL,
-+ /* 184 */ 0x52f2c81e46a38265UL, 0xfd78072d04a832fdUL,
-+ 0x8cd7d5fa25359e94UL, 0x4de71b7454cc29d2UL,
-+ /* 185 */ 0x42eb60ad1eda6ac9UL, 0x0aad37dfdbc09c3aUL,
-+ 0x81004b71e33cc191UL, 0x44e6be345122803cUL,
-+ /* 186 */ 0x03fe8388ba1920dbUL, 0xf5d57c32150db008UL,
-+ 0x49c8c4281af60c29UL, 0x21edb518de701aeeUL,
-+ /* 187 */ 0x7fb63e418f06dc99UL, 0xa4460d99c166d7b8UL,
-+ 0x24dd5248ce520a83UL, 0x5ec3ad712b928358UL,
-+ /* 188 */ 0x15022a5fbd17930fUL, 0xa4f64a77d82570e3UL,
-+ 0x12bc8d6915783712UL, 0x498194c0fc620abbUL,
-+ /* 189 */ 0x38a2d9d255686c82UL, 0x785c6bd9193e21f0UL,
-+ 0xe4d5c81ab24a5484UL, 0x56307860b2e20989UL,
-+ /* 190 */ 0x429d55f78b4d74c4UL, 0x22f1834643350131UL,
-+ 0x1e60c24598c71fffUL, 0x59f2f014979983efUL,
-+ /* 191 */ 0x46a47d56eb494a44UL, 0x3e22a854d636a18eUL,
-+ 0xb346e15274491c3bUL, 0x2ceafd4e5390cde7UL,
-+ /* 192 */ 0xba8a8538be0d6675UL, 0x4b9074bb50818e23UL,
-+ 0xcbdab89085d304c3UL, 0x61a24fe0e56192c4UL,
-+ /* 193 */ 0xcb7615e6db525bcbUL, 0xdd7d8c35a567e4caUL,
-+ 0xe6b4153acafcdd69UL, 0x2d668e097f3c9766UL,
-+ /* 194 */ 0xa57e7e265ce55ef0UL, 0x5d9f4e527cd4b967UL,
-+ 0xfbc83606492fd1e5UL, 0x090d52beb7c3f7aeUL,
-+ /* 195 */ 0x09b9515a1e7b4d7cUL, 0x1f266a2599da44c0UL,
-+ 0xa1c49548e2c55504UL, 0x7ef04287126f15ccUL,
-+ /* 196 */ 0xfed1659dbd30ef15UL, 0x8b4ab9eec4e0277bUL,
-+ 0x884d6236a5df3291UL, 0x1fd96ea6bf5cf788UL,
-+ /* 197 */ 0x42a161981f190d9aUL, 0x61d849507e6052c1UL,
-+ 0x9fe113bf285a2cd5UL, 0x7c22d676dbad85d8UL,
-+ /* 198 */ 0x82e770ed2bfbd27dUL, 0x4c05b2ece996f5a5UL,
-+ 0xcd40a9c2b0900150UL, 0x5895319213d9bf64UL,
-+ /* 199 */ 0xe7cc5d703fea2e08UL, 0xb50c491258e2188cUL,
-+ 0xcce30baa48205bf0UL, 0x537c659ccfa32d62UL,
-+ /* 200 */ 0x37b6623a98cfc088UL, 0xfe9bed1fa4d6aca4UL,
-+ 0x04d29b8e56a8d1b0UL, 0x725f71c40b519575UL,
-+ /* 201 */ 0x28c7f89cd0339ce6UL, 0x8367b14469ddc18bUL,
-+ 0x883ada83a6a1652cUL, 0x585f1974034d6c17UL,
-+ /* 202 */ 0x89cfb266f1b19188UL, 0xe63b4863e7c35217UL,
-+ 0xd88c9da6b4c0526aUL, 0x3e035c9df0954635UL,
-+ /* 203 */ 0xdd9d5412fb45de9dUL, 0xdd684532e4cff40dUL,
-+ 0x4b5c999b151d671cUL, 0x2d8c2cc811e7f690UL,
-+ /* 204 */ 0x7f54be1d90055d40UL, 0xa464c5df464aaf40UL,
-+ 0x33979624f0e917beUL, 0x2c018dc527356b30UL,
-+ /* 205 */ 0xa5415024e330b3d4UL, 0x73ff3d96691652d3UL,
-+ 0x94ec42c4ef9b59f1UL, 0x0747201618d08e5aUL,
-+ /* 206 */ 0x4d6ca48aca411c53UL, 0x66415f2fcfa66119UL,
-+ 0x9c4dd40051e227ffUL, 0x59810bc09a02f7ebUL,
-+ /* 207 */ 0x2a7eb171b3dc101dUL, 0x441c5ab99ffef68eUL,
-+ 0x32025c9b93b359eaUL, 0x5e8ce0a71e9d112fUL,
-+ /* 208 */ 0xbfcccb92429503fdUL, 0xd271ba752f095d55UL,
-+ 0x345ead5e972d091eUL, 0x18c8df11a83103baUL,
-+ /* 209 */ 0x90cd949a9aed0f4cUL, 0xc5d1f4cb6660e37eUL,
-+ 0xb8cac52d56c52e0bUL, 0x6e42e400c5808e0dUL,
-+ /* 210 */ 0xa3b46966eeaefd23UL, 0x0c4f1f0be39ecdcaUL,
-+ 0x189dc8c9d683a51dUL, 0x51f27f054c09351bUL,
-+ /* 211 */ 0x4c487ccd2a320682UL, 0x587ea95bb3df1c96UL,
-+ 0xc8ccf79e555cb8e8UL, 0x547dc829a206d73dUL,
-+ /* 212 */ 0xb822a6cd80c39b06UL, 0xe96d54732000d4c6UL,
-+ 0x28535b6f91463b4dUL, 0x228f4660e2486e1dUL,
-+ /* 213 */ 0x98799538de8d3abfUL, 0x8cd8330045ebca6eUL,
-+ 0x79952a008221e738UL, 0x4322e1a7535cd2bbUL,
-+ /* 214 */ 0xb114c11819d1801cUL, 0x2016e4d84f3f5ec7UL,
-+ 0xdd0e2df409260f4cUL, 0x5ec362c0ae5f7266UL,
-+ /* 215 */ 0xc0462b18b8b2b4eeUL, 0x7cc8d950274d1afbUL,
-+ 0xf25f7105436b02d2UL, 0x43bbf8dcbff9ccd3UL,
-+ /* 216 */ 0xb6ad1767a039e9dfUL, 0xb0714da8f69d3583UL,
-+ 0x5e55fa18b42931f5UL, 0x4ed5558f33c60961UL,
-+ /* 217 */ 0x1fe37901c647a5ddUL, 0x593ddf1f8081d357UL,
-+ 0x0249a4fd813fd7a6UL, 0x69acca274e9caf61UL,
-+ /* 218 */ 0x047ba3ea330721c9UL, 0x83423fc20e7e1ea0UL,
-+ 0x1df4c0af01314a60UL, 0x09a62dab89289527UL,
-+ /* 219 */ 0xa5b325a49cc6cb00UL, 0xe94b5dc654b56cb6UL,
-+ 0x3be28779adc994a0UL, 0x4296e8f8ba3a4aadUL,
-+ /* 220 */ 0x328689761e451eabUL, 0x2e4d598bff59594aUL,
-+ 0x49b96853d7a7084aUL, 0x4980a319601420a8UL,
-+ /* 221 */ 0x9565b9e12f552c42UL, 0x8a5318db7100fe96UL,
-+ 0x05c90b4d43add0d7UL, 0x538b4cd66a5d4edaUL,
-+ /* 222 */ 0xf4e94fc3e89f039fUL, 0x592c9af26f618045UL,
-+ 0x08a36eb5fd4b9550UL, 0x25fffaf6c2ed1419UL,
-+ /* 223 */ 0x34434459cc79d354UL, 0xeeecbfb4b1d5476bUL,
-+ 0xddeb34a061615d99UL, 0x5129cecceb64b773UL,
-+ /* 224 */ 0xee43215894993520UL, 0x772f9c7cf14c0b3bUL,
-+ 0xd2e2fce306bedad5UL, 0x715f42b546f06a97UL,
-+ /* 225 */ 0x434ecdceda5b5f1aUL, 0x0da17115a49741a9UL,
-+ 0x680bd77c73edad2eUL, 0x487c02354edd9041UL,
-+ /* 226 */ 0xb8efeff3a70ed9c4UL, 0x56a32aa3e857e302UL,
-+ 0xdf3a68bd48a2a5a0UL, 0x07f650b73176c444UL,
-+ /* 227 */ 0xe38b9b1626e0ccb1UL, 0x79e053c18b09fb36UL,
-+ 0x56d90319c9f94964UL, 0x1ca941e7ac9ff5c4UL,
-+ /* 228 */ 0x49c4df29162fa0bbUL, 0x8488cf3282b33305UL,
-+ 0x95dfda14cabb437dUL, 0x3391f78264d5ad86UL,
-+ /* 229 */ 0x729ae06ae2b5095dUL, 0xd58a58d73259a946UL,
-+ 0xe9834262d13921edUL, 0x27fedafaa54bb592UL,
-+ /* 230 */ 0xa99dc5b829ad48bbUL, 0x5f025742499ee260UL,
-+ 0x802c8ecd5d7513fdUL, 0x78ceb3ef3f6dd938UL,
-+ /* 231 */ 0xc342f44f8a135d94UL, 0x7b9edb44828cdda3UL,
-+ 0x9436d11a0537cfe7UL, 0x5064b164ec1ab4c8UL,
-+ /* 232 */ 0x7020eccfd37eb2fcUL, 0x1f31ea3ed90d25fcUL,
-+ 0x1b930d7bdfa1bb34UL, 0x5344467a48113044UL,
-+ /* 233 */ 0x70073170f25e6dfbUL, 0xe385dc1a50114cc8UL,
-+ 0x2348698ac8fc4f00UL, 0x2a77a55284dd40d8UL,
-+ /* 234 */ 0xfe06afe0c98c6ce4UL, 0xc235df96dddfd6e4UL,
-+ 0x1428d01e33bf1ed3UL, 0x785768ec9300bdafUL,
-+ /* 235 */ 0x9702e57a91deb63bUL, 0x61bdb8bfe5ce8b80UL,
-+ 0x645b426f3d1d58acUL, 0x4804a82227a557bcUL,
-+ /* 236 */ 0x8e57048ab44d2601UL, 0x68d6501a4b3a6935UL,
-+ 0xc39c9ec3f9e1c293UL, 0x4172f257d4de63e2UL,
-+ /* 237 */ 0xd368b450330c6401UL, 0x040d3017418f2391UL,
-+ 0x2c34bb6090b7d90dUL, 0x16f649228fdfd51fUL,
-+ /* 238 */ 0xbea6818e2b928ef5UL, 0xe28ccf91cdc11e72UL,
-+ 0x594aaa68e77a36cdUL, 0x313034806c7ffd0fUL,
-+ /* 239 */ 0x8a9d27ac2249bd65UL, 0x19a3b464018e9512UL,
-+ 0xc26ccff352b37ec7UL, 0x056f68341d797b21UL,
-+ /* 240 */ 0x5e79d6757efd2327UL, 0xfabdbcb6553afe15UL,
-+ 0xd3e7222c6eaf5a60UL, 0x7046c76d4dae743bUL,
-+ /* 241 */ 0x660be872b18d4a55UL, 0x19992518574e1496UL,
-+ 0xc103053a302bdcbbUL, 0x3ed8e9800b218e8eUL,
-+ /* 242 */ 0x7b0b9239fa75e03eUL, 0xefe9fb684633c083UL,
-+ 0x98a35fbe391a7793UL, 0x6065510fe2d0fe34UL,
-+ /* 243 */ 0x55cb668548abad0cUL, 0xb4584548da87e527UL,
-+ 0x2c43ecea0107c1ddUL, 0x526028809372de35UL,
-+ /* 244 */ 0x3415c56af9213b1fUL, 0x5bee1a4d017e98dbUL,
-+ 0x13f6b105b5cf709bUL, 0x5ff20e3482b29ab6UL,
-+ /* 245 */ 0x0aa29c75cc2e6c90UL, 0xfc7d73ca3a70e206UL,
-+ 0x899fc38fc4b5c515UL, 0x250386b124ffc207UL,
-+ /* 246 */ 0x54ea28d5ae3d2b56UL, 0x9913149dd6de60ceUL,
-+ 0x16694fc58f06d6c1UL, 0x46b23975eb018fc7UL,
-+ /* 247 */ 0x470a6a0fb4b7b4e2UL, 0x5d92475a8f7253deUL,
-+ 0xabeee5b52fbd3adbUL, 0x7fa20801a0806968UL,
-+ /* 248 */ 0x76f3faf19f7714d2UL, 0xb3e840c12f4660c3UL,
-+ 0x0fb4cd8df212744eUL, 0x4b065a251d3a2dd2UL,
-+ /* 249 */ 0x5cebde383d77cd4aUL, 0x6adf39df882c9cb1UL,
-+ 0xa2dd242eb09af759UL, 0x3147c0e50e5f6422UL,
-+ /* 250 */ 0x164ca5101d1350dbUL, 0xf8d13479c33fc962UL,
-+ 0xe640ce4d13e5da08UL, 0x4bdee0c45061f8baUL,
-+ /* 251 */ 0xd7c46dc1a4edb1c9UL, 0x5514d7b6437fd98aUL,
-+ 0x58942f6bb2a1c00bUL, 0x2dffb2ab1d70710eUL,
-+ /* 252 */ 0xccdfcf2fc18b6d68UL, 0xa8ebcba8b7806167UL,
-+ 0x980697f95e2937e3UL, 0x02fbba1cd0126e8cUL
-+};
-+
-+/* c is two 512-bit products: c0[0:7]=a0[0:3]*b0[0:3] and c1[8:15]=a1[4:7]*b1[4:7]
-+ * a is two 256-bit integers: a0[0:3] and a1[4:7]
-+ * b is two 256-bit integers: b0[0:3] and b1[4:7]
-+ */
-+static void mul2_256x256_integer_adx(u64 *const c, const u64 *const a,
-+ const u64 *const b)
-+{
-+ asm volatile(
-+ "xorl %%r14d, %%r14d ;"
-+ "movq (%1), %%rdx; " /* A[0] */
-+ "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "movq %%r8, (%0) ;"
-+ "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-+ "adox %%r10, %%r15 ;"
-+ "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-+ "adox %%r8, %%rax ;"
-+ "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-+ "adox %%r10, %%rbx ;"
-+ /******************************************/
-+ "adox %%r14, %%rcx ;"
-+
-+ "movq 8(%1), %%rdx; " /* A[1] */
-+ "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-+ "adox %%r15, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rax ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%rbx ;"
-+ "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%rcx ;"
-+ /******************************************/
-+ "adox %%r14, %%r15 ;"
-+ "adcx %%r14, %%r15 ;"
-+
-+ "movq 16(%1), %%rdx; " /* A[2] */
-+ "xorl %%r10d, %%r10d ;"
-+ "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-+ "adox %%rax, %%r8 ;"
-+ "movq %%r8, 16(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rbx ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%rcx ;"
-+ "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%r15 ;"
-+ /******************************************/
-+ "adox %%r14, %%rax ;"
-+ "adcx %%r14, %%rax ;"
-+
-+ "movq 24(%1), %%rdx; " /* A[3] */
-+ "xorl %%r10d, %%r10d ;"
-+ "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-+ "adox %%rbx, %%r8 ;"
-+ "movq %%r8, 24(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rcx ;"
-+ "movq %%rcx, 32(%0) ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%rax ;"
-+ "movq %%rax, 48(%0) ;"
-+ /******************************************/
-+ "adox %%r14, %%rbx ;"
-+ "adcx %%r14, %%rbx ;"
-+ "movq %%rbx, 56(%0) ;"
-+
-+ "movq 32(%1), %%rdx; " /* C[0] */
-+ "mulx 32(%2), %%r8, %%r15; " /* C[0]*D[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "movq %%r8, 64(%0);"
-+ "mulx 40(%2), %%r10, %%rax; " /* C[0]*D[1] */
-+ "adox %%r10, %%r15 ;"
-+ "mulx 48(%2), %%r8, %%rbx; " /* C[0]*D[2] */
-+ "adox %%r8, %%rax ;"
-+ "mulx 56(%2), %%r10, %%rcx; " /* C[0]*D[3] */
-+ "adox %%r10, %%rbx ;"
-+ /******************************************/
-+ "adox %%r14, %%rcx ;"
-+
-+ "movq 40(%1), %%rdx; " /* C[1] */
-+ "xorl %%r10d, %%r10d ;"
-+ "mulx 32(%2), %%r8, %%r9; " /* C[1]*D[0] */
-+ "adox %%r15, %%r8 ;"
-+ "movq %%r8, 72(%0);"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[1]*D[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rax ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[1]*D[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%rbx ;"
-+ "mulx 56(%2), %%r10, %%r15; " /* C[1]*D[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%rcx ;"
-+ /******************************************/
-+ "adox %%r14, %%r15 ;"
-+ "adcx %%r14, %%r15 ;"
-+
-+ "movq 48(%1), %%rdx; " /* C[2] */
-+ "xorl %%r10d, %%r10d ;"
-+ "mulx 32(%2), %%r8, %%r9; " /* C[2]*D[0] */
-+ "adox %%rax, %%r8 ;"
-+ "movq %%r8, 80(%0);"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[2]*D[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rbx ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[2]*D[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%rcx ;"
-+ "mulx 56(%2), %%r10, %%rax; " /* C[2]*D[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%r15 ;"
-+ /******************************************/
-+ "adox %%r14, %%rax ;"
-+ "adcx %%r14, %%rax ;"
-+
-+ "movq 56(%1), %%rdx; " /* C[3] */
-+ "xorl %%r10d, %%r10d ;"
-+ "mulx 32(%2), %%r8, %%r9; " /* C[3]*D[0] */
-+ "adox %%rbx, %%r8 ;"
-+ "movq %%r8, 88(%0);"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[3]*D[1] */
-+ "adox %%r10, %%r9 ;"
-+ "adcx %%r9, %%rcx ;"
-+ "movq %%rcx, 96(%0) ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[3]*D[2] */
-+ "adox %%r8, %%r11 ;"
-+ "adcx %%r11, %%r15 ;"
-+ "movq %%r15, 104(%0) ;"
-+ "mulx 56(%2), %%r10, %%rbx; " /* C[3]*D[3] */
-+ "adox %%r10, %%r13 ;"
-+ "adcx %%r13, %%rax ;"
-+ "movq %%rax, 112(%0) ;"
-+ /******************************************/
-+ "adox %%r14, %%rbx ;"
-+ "adcx %%r14, %%rbx ;"
-+ "movq %%rbx, 120(%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11", "%r13", "%r14", "%r15");
-+}
-+
-+static void mul2_256x256_integer_bmi2(u64 *const c, const u64 *const a,
-+ const u64 *const b)
-+{
-+ asm volatile(
-+ "movq (%1), %%rdx; " /* A[0] */
-+ "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-+ "movq %%r8, (%0) ;"
-+ "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-+ "addq %%r10, %%r15 ;"
-+ "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-+ "adcq %%r8, %%rax ;"
-+ "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-+ "adcq %%r10, %%rbx ;"
-+ /******************************************/
-+ "adcq $0, %%rcx ;"
-+
-+ "movq 8(%1), %%rdx; " /* A[1] */
-+ "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-+ "addq %%r15, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%r15 ;"
-+
-+ "addq %%r9, %%rax ;"
-+ "adcq %%r11, %%rbx ;"
-+ "adcq %%r13, %%rcx ;"
-+ "adcq $0, %%r15 ;"
-+
-+ "movq 16(%1), %%rdx; " /* A[2] */
-+ "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-+ "addq %%rax, %%r8 ;"
-+ "movq %%r8, 16(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rax ;"
-+
-+ "addq %%r9, %%rbx ;"
-+ "adcq %%r11, %%rcx ;"
-+ "adcq %%r13, %%r15 ;"
-+ "adcq $0, %%rax ;"
-+
-+ "movq 24(%1), %%rdx; " /* A[3] */
-+ "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-+ "addq %%rbx, %%r8 ;"
-+ "movq %%r8, 24(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rbx ;"
-+
-+ "addq %%r9, %%rcx ;"
-+ "movq %%rcx, 32(%0) ;"
-+ "adcq %%r11, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "adcq %%r13, %%rax ;"
-+ "movq %%rax, 48(%0) ;"
-+ "adcq $0, %%rbx ;"
-+ "movq %%rbx, 56(%0) ;"
-+
-+ "movq 32(%1), %%rdx; " /* C[0] */
-+ "mulx 32(%2), %%r8, %%r15; " /* C[0]*D[0] */
-+ "movq %%r8, 64(%0) ;"
-+ "mulx 40(%2), %%r10, %%rax; " /* C[0]*D[1] */
-+ "addq %%r10, %%r15 ;"
-+ "mulx 48(%2), %%r8, %%rbx; " /* C[0]*D[2] */
-+ "adcq %%r8, %%rax ;"
-+ "mulx 56(%2), %%r10, %%rcx; " /* C[0]*D[3] */
-+ "adcq %%r10, %%rbx ;"
-+ /******************************************/
-+ "adcq $0, %%rcx ;"
-+
-+ "movq 40(%1), %%rdx; " /* C[1] */
-+ "mulx 32(%2), %%r8, %%r9; " /* C[1]*D[0] */
-+ "addq %%r15, %%r8 ;"
-+ "movq %%r8, 72(%0) ;"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[1]*D[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[1]*D[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 56(%2), %%r10, %%r15; " /* C[1]*D[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%r15 ;"
-+
-+ "addq %%r9, %%rax ;"
-+ "adcq %%r11, %%rbx ;"
-+ "adcq %%r13, %%rcx ;"
-+ "adcq $0, %%r15 ;"
-+
-+ "movq 48(%1), %%rdx; " /* C[2] */
-+ "mulx 32(%2), %%r8, %%r9; " /* C[2]*D[0] */
-+ "addq %%rax, %%r8 ;"
-+ "movq %%r8, 80(%0) ;"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[2]*D[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[2]*D[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 56(%2), %%r10, %%rax; " /* C[2]*D[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rax ;"
-+
-+ "addq %%r9, %%rbx ;"
-+ "adcq %%r11, %%rcx ;"
-+ "adcq %%r13, %%r15 ;"
-+ "adcq $0, %%rax ;"
-+
-+ "movq 56(%1), %%rdx; " /* C[3] */
-+ "mulx 32(%2), %%r8, %%r9; " /* C[3]*D[0] */
-+ "addq %%rbx, %%r8 ;"
-+ "movq %%r8, 88(%0) ;"
-+ "mulx 40(%2), %%r10, %%r11; " /* C[3]*D[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 48(%2), %%r8, %%r13; " /* C[3]*D[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 56(%2), %%r10, %%rbx; " /* C[3]*D[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rbx ;"
-+
-+ "addq %%r9, %%rcx ;"
-+ "movq %%rcx, 96(%0) ;"
-+ "adcq %%r11, %%r15 ;"
-+ "movq %%r15, 104(%0) ;"
-+ "adcq %%r13, %%rax ;"
-+ "movq %%rax, 112(%0) ;"
-+ "adcq $0, %%rbx ;"
-+ "movq %%rbx, 120(%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11", "%r13", "%r15");
-+}
-+
-+static void sqr2_256x256_integer_adx(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movq (%1), %%rdx ;" /* A[0] */
-+ "mulx 8(%1), %%r8, %%r14 ;" /* A[1]*A[0] */
-+ "xorl %%r15d, %%r15d;"
-+ "mulx 16(%1), %%r9, %%r10 ;" /* A[2]*A[0] */
-+ "adcx %%r14, %%r9 ;"
-+ "mulx 24(%1), %%rax, %%rcx ;" /* A[3]*A[0] */
-+ "adcx %%rax, %%r10 ;"
-+ "movq 24(%1), %%rdx ;" /* A[3] */
-+ "mulx 8(%1), %%r11, %%rbx ;" /* A[1]*A[3] */
-+ "adcx %%rcx, %%r11 ;"
-+ "mulx 16(%1), %%rax, %%r13 ;" /* A[2]*A[3] */
-+ "adcx %%rax, %%rbx ;"
-+ "movq 8(%1), %%rdx ;" /* A[1] */
-+ "adcx %%r15, %%r13 ;"
-+ "mulx 16(%1), %%rax, %%rcx ;" /* A[2]*A[1] */
-+ "movq $0, %%r14 ;"
-+ /******************************************/
-+ "adcx %%r15, %%r14 ;"
-+
-+ "xorl %%r15d, %%r15d;"
-+ "adox %%rax, %%r10 ;"
-+ "adcx %%r8, %%r8 ;"
-+ "adox %%rcx, %%r11 ;"
-+ "adcx %%r9, %%r9 ;"
-+ "adox %%r15, %%rbx ;"
-+ "adcx %%r10, %%r10 ;"
-+ "adox %%r15, %%r13 ;"
-+ "adcx %%r11, %%r11 ;"
-+ "adox %%r15, %%r14 ;"
-+ "adcx %%rbx, %%rbx ;"
-+ "adcx %%r13, %%r13 ;"
-+ "adcx %%r14, %%r14 ;"
-+
-+ "movq (%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-+ /*******************/
-+ "movq %%rax, 0(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "movq 8(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 16(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 24(%0) ;"
-+ "movq 16(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 32(%0) ;"
-+ "adcq %%rcx, %%rbx ;"
-+ "movq %%rbx, 40(%0) ;"
-+ "movq 24(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 48(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 56(%0) ;"
-+
-+
-+ "movq 32(%1), %%rdx ;" /* B[0] */
-+ "mulx 40(%1), %%r8, %%r14 ;" /* B[1]*B[0] */
-+ "xorl %%r15d, %%r15d;"
-+ "mulx 48(%1), %%r9, %%r10 ;" /* B[2]*B[0] */
-+ "adcx %%r14, %%r9 ;"
-+ "mulx 56(%1), %%rax, %%rcx ;" /* B[3]*B[0] */
-+ "adcx %%rax, %%r10 ;"
-+ "movq 56(%1), %%rdx ;" /* B[3] */
-+ "mulx 40(%1), %%r11, %%rbx ;" /* B[1]*B[3] */
-+ "adcx %%rcx, %%r11 ;"
-+ "mulx 48(%1), %%rax, %%r13 ;" /* B[2]*B[3] */
-+ "adcx %%rax, %%rbx ;"
-+ "movq 40(%1), %%rdx ;" /* B[1] */
-+ "adcx %%r15, %%r13 ;"
-+ "mulx 48(%1), %%rax, %%rcx ;" /* B[2]*B[1] */
-+ "movq $0, %%r14 ;"
-+ /******************************************/
-+ "adcx %%r15, %%r14 ;"
-+
-+ "xorl %%r15d, %%r15d;"
-+ "adox %%rax, %%r10 ;"
-+ "adcx %%r8, %%r8 ;"
-+ "adox %%rcx, %%r11 ;"
-+ "adcx %%r9, %%r9 ;"
-+ "adox %%r15, %%rbx ;"
-+ "adcx %%r10, %%r10 ;"
-+ "adox %%r15, %%r13 ;"
-+ "adcx %%r11, %%r11 ;"
-+ "adox %%r15, %%r14 ;"
-+ "adcx %%rbx, %%rbx ;"
-+ "adcx %%r13, %%r13 ;"
-+ "adcx %%r14, %%r14 ;"
-+
-+ "movq 32(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* B[0]^2 */
-+ /*******************/
-+ "movq %%rax, 64(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 72(%0) ;"
-+ "movq 40(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* B[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 80(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 88(%0) ;"
-+ "movq 48(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* B[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 96(%0) ;"
-+ "adcq %%rcx, %%rbx ;"
-+ "movq %%rbx, 104(%0) ;"
-+ "movq 56(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* B[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 112(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 120(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11", "%r13", "%r14", "%r15");
-+}
-+
-+static void sqr2_256x256_integer_bmi2(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movq 8(%1), %%rdx ;" /* A[1] */
-+ "mulx (%1), %%r8, %%r9 ;" /* A[0]*A[1] */
-+ "mulx 16(%1), %%r10, %%r11 ;" /* A[2]*A[1] */
-+ "mulx 24(%1), %%rcx, %%r14 ;" /* A[3]*A[1] */
-+
-+ "movq 16(%1), %%rdx ;" /* A[2] */
-+ "mulx 24(%1), %%r15, %%r13 ;" /* A[3]*A[2] */
-+ "mulx (%1), %%rax, %%rdx ;" /* A[0]*A[2] */
-+
-+ "addq %%rax, %%r9 ;"
-+ "adcq %%rdx, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq %%r14, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "movq $0, %%r14 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "movq (%1), %%rdx ;" /* A[0] */
-+ "mulx 24(%1), %%rax, %%rcx ;" /* A[0]*A[3] */
-+
-+ "addq %%rax, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq $0, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "shldq $1, %%r13, %%r14 ;"
-+ "shldq $1, %%r15, %%r13 ;"
-+ "shldq $1, %%r11, %%r15 ;"
-+ "shldq $1, %%r10, %%r11 ;"
-+ "shldq $1, %%r9, %%r10 ;"
-+ "shldq $1, %%r8, %%r9 ;"
-+ "shlq $1, %%r8 ;"
-+
-+ /*******************/
-+ "mulx %%rdx, %%rax, %%rcx ; " /* A[0]^2 */
-+ /*******************/
-+ "movq %%rax, 0(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "movq 8(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* A[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 16(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 24(%0) ;"
-+ "movq 16(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* A[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 32(%0) ;"
-+ "adcq %%rcx, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "movq 24(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* A[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 48(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 56(%0) ;"
-+
-+ "movq 40(%1), %%rdx ;" /* B[1] */
-+ "mulx 32(%1), %%r8, %%r9 ;" /* B[0]*B[1] */
-+ "mulx 48(%1), %%r10, %%r11 ;" /* B[2]*B[1] */
-+ "mulx 56(%1), %%rcx, %%r14 ;" /* B[3]*B[1] */
-+
-+ "movq 48(%1), %%rdx ;" /* B[2] */
-+ "mulx 56(%1), %%r15, %%r13 ;" /* B[3]*B[2] */
-+ "mulx 32(%1), %%rax, %%rdx ;" /* B[0]*B[2] */
-+
-+ "addq %%rax, %%r9 ;"
-+ "adcq %%rdx, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq %%r14, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "movq $0, %%r14 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "movq 32(%1), %%rdx ;" /* B[0] */
-+ "mulx 56(%1), %%rax, %%rcx ;" /* B[0]*B[3] */
-+
-+ "addq %%rax, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq $0, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "shldq $1, %%r13, %%r14 ;"
-+ "shldq $1, %%r15, %%r13 ;"
-+ "shldq $1, %%r11, %%r15 ;"
-+ "shldq $1, %%r10, %%r11 ;"
-+ "shldq $1, %%r9, %%r10 ;"
-+ "shldq $1, %%r8, %%r9 ;"
-+ "shlq $1, %%r8 ;"
-+
-+ /*******************/
-+ "mulx %%rdx, %%rax, %%rcx ; " /* B[0]^2 */
-+ /*******************/
-+ "movq %%rax, 64(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 72(%0) ;"
-+ "movq 40(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* B[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 80(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 88(%0) ;"
-+ "movq 48(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* B[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 96(%0) ;"
-+ "adcq %%rcx, %%r15 ;"
-+ "movq %%r15, 104(%0) ;"
-+ "movq 56(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ; " /* B[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 112(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 120(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-+ "%r11", "%r13", "%r14", "%r15");
-+}
-+
-+static void red_eltfp25519_2w_adx(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movl $38, %%edx; " /* 2*c = 38 = 2^256 */
-+ "mulx 32(%1), %%r8, %%r10; " /* c*C[4] */
-+ "xorl %%ebx, %%ebx ;"
-+ "adox (%1), %%r8 ;"
-+ "mulx 40(%1), %%r9, %%r11; " /* c*C[5] */
-+ "adcx %%r10, %%r9 ;"
-+ "adox 8(%1), %%r9 ;"
-+ "mulx 48(%1), %%r10, %%rax; " /* c*C[6] */
-+ "adcx %%r11, %%r10 ;"
-+ "adox 16(%1), %%r10 ;"
-+ "mulx 56(%1), %%r11, %%rcx; " /* c*C[7] */
-+ "adcx %%rax, %%r11 ;"
-+ "adox 24(%1), %%r11 ;"
-+ /***************************************/
-+ "adcx %%rbx, %%rcx ;"
-+ "adox %%rbx, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-+ "adcx %%rcx, %%r8 ;"
-+ "adcx %%rbx, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcx %%rbx, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcx %%rbx, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+
-+ "mulx 96(%1), %%r8, %%r10; " /* c*C[4] */
-+ "xorl %%ebx, %%ebx ;"
-+ "adox 64(%1), %%r8 ;"
-+ "mulx 104(%1), %%r9, %%r11; " /* c*C[5] */
-+ "adcx %%r10, %%r9 ;"
-+ "adox 72(%1), %%r9 ;"
-+ "mulx 112(%1), %%r10, %%rax; " /* c*C[6] */
-+ "adcx %%r11, %%r10 ;"
-+ "adox 80(%1), %%r10 ;"
-+ "mulx 120(%1), %%r11, %%rcx; " /* c*C[7] */
-+ "adcx %%rax, %%r11 ;"
-+ "adox 88(%1), %%r11 ;"
-+ /****************************************/
-+ "adcx %%rbx, %%rcx ;"
-+ "adox %%rbx, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-+ "adcx %%rcx, %%r8 ;"
-+ "adcx %%rbx, %%r9 ;"
-+ "movq %%r9, 40(%0) ;"
-+ "adcx %%rbx, %%r10 ;"
-+ "movq %%r10, 48(%0) ;"
-+ "adcx %%rbx, %%r11 ;"
-+ "movq %%r11, 56(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 32(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11");
-+}
-+
-+static void red_eltfp25519_2w_bmi2(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movl $38, %%edx ; " /* 2*c = 38 = 2^256 */
-+ "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-+ "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-+ "addq %%r10, %%r9 ;"
-+ "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-+ "adcq %%r11, %%r10 ;"
-+ "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-+ "adcq %%rax, %%r11 ;"
-+ /***************************************/
-+ "adcq $0, %%rcx ;"
-+ "addq (%1), %%r8 ;"
-+ "adcq 8(%1), %%r9 ;"
-+ "adcq 16(%1), %%r10 ;"
-+ "adcq 24(%1), %%r11 ;"
-+ "adcq $0, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-+ "addq %%rcx, %%r8 ;"
-+ "adcq $0, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcq $0, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcq $0, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+
-+ "mulx 96(%1), %%r8, %%r10 ;" /* c*C[4] */
-+ "mulx 104(%1), %%r9, %%r11 ;" /* c*C[5] */
-+ "addq %%r10, %%r9 ;"
-+ "mulx 112(%1), %%r10, %%rax ;" /* c*C[6] */
-+ "adcq %%r11, %%r10 ;"
-+ "mulx 120(%1), %%r11, %%rcx ;" /* c*C[7] */
-+ "adcq %%rax, %%r11 ;"
-+ /****************************************/
-+ "adcq $0, %%rcx ;"
-+ "addq 64(%1), %%r8 ;"
-+ "adcq 72(%1), %%r9 ;"
-+ "adcq 80(%1), %%r10 ;"
-+ "adcq 88(%1), %%r11 ;"
-+ "adcq $0, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-+ "addq %%rcx, %%r8 ;"
-+ "adcq $0, %%r9 ;"
-+ "movq %%r9, 40(%0) ;"
-+ "adcq $0, %%r10 ;"
-+ "movq %%r10, 48(%0) ;"
-+ "adcq $0, %%r11 ;"
-+ "movq %%r11, 56(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 32(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-+ "%r11");
-+}
-+
-+static void mul_256x256_integer_adx(u64 *const c, const u64 *const a,
-+ const u64 *const b)
-+{
-+ asm volatile(
-+ "movq (%1), %%rdx; " /* A[0] */
-+ "mulx (%2), %%r8, %%r9; " /* A[0]*B[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "movq %%r8, (%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[0]*B[1] */
-+ "adox %%r9, %%r10 ;"
-+ "movq %%r10, 8(%0) ;"
-+ "mulx 16(%2), %%r15, %%r13; " /* A[0]*B[2] */
-+ "adox %%r11, %%r15 ;"
-+ "mulx 24(%2), %%r14, %%rdx; " /* A[0]*B[3] */
-+ "adox %%r13, %%r14 ;"
-+ "movq $0, %%rax ;"
-+ /******************************************/
-+ "adox %%rdx, %%rax ;"
-+
-+ "movq 8(%1), %%rdx; " /* A[1] */
-+ "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "adcx 8(%0), %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-+ "adox %%r9, %%r10 ;"
-+ "adcx %%r15, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "mulx 16(%2), %%r15, %%r13; " /* A[1]*B[2] */
-+ "adox %%r11, %%r15 ;"
-+ "adcx %%r14, %%r15 ;"
-+ "movq $0, %%r8 ;"
-+ "mulx 24(%2), %%r14, %%rdx; " /* A[1]*B[3] */
-+ "adox %%r13, %%r14 ;"
-+ "adcx %%rax, %%r14 ;"
-+ "movq $0, %%rax ;"
-+ /******************************************/
-+ "adox %%rdx, %%rax ;"
-+ "adcx %%r8, %%rax ;"
-+
-+ "movq 16(%1), %%rdx; " /* A[2] */
-+ "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "adcx 16(%0), %%r8 ;"
-+ "movq %%r8, 16(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-+ "adox %%r9, %%r10 ;"
-+ "adcx %%r15, %%r10 ;"
-+ "movq %%r10, 24(%0) ;"
-+ "mulx 16(%2), %%r15, %%r13; " /* A[2]*B[2] */
-+ "adox %%r11, %%r15 ;"
-+ "adcx %%r14, %%r15 ;"
-+ "movq $0, %%r8 ;"
-+ "mulx 24(%2), %%r14, %%rdx; " /* A[2]*B[3] */
-+ "adox %%r13, %%r14 ;"
-+ "adcx %%rax, %%r14 ;"
-+ "movq $0, %%rax ;"
-+ /******************************************/
-+ "adox %%rdx, %%rax ;"
-+ "adcx %%r8, %%rax ;"
-+
-+ "movq 24(%1), %%rdx; " /* A[3] */
-+ "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-+ "xorl %%r10d, %%r10d ;"
-+ "adcx 24(%0), %%r8 ;"
-+ "movq %%r8, 24(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-+ "adox %%r9, %%r10 ;"
-+ "adcx %%r15, %%r10 ;"
-+ "movq %%r10, 32(%0) ;"
-+ "mulx 16(%2), %%r15, %%r13; " /* A[3]*B[2] */
-+ "adox %%r11, %%r15 ;"
-+ "adcx %%r14, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "movq $0, %%r8 ;"
-+ "mulx 24(%2), %%r14, %%rdx; " /* A[3]*B[3] */
-+ "adox %%r13, %%r14 ;"
-+ "adcx %%rax, %%r14 ;"
-+ "movq %%r14, 48(%0) ;"
-+ "movq $0, %%rax ;"
-+ /******************************************/
-+ "adox %%rdx, %%rax ;"
-+ "adcx %%r8, %%rax ;"
-+ "movq %%rax, 56(%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11",
-+ "%r13", "%r14", "%r15");
-+}
-+
-+static void mul_256x256_integer_bmi2(u64 *const c, const u64 *const a,
-+ const u64 *const b)
-+{
-+ asm volatile(
-+ "movq (%1), %%rdx; " /* A[0] */
-+ "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-+ "movq %%r8, (%0) ;"
-+ "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-+ "addq %%r10, %%r15 ;"
-+ "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-+ "adcq %%r8, %%rax ;"
-+ "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-+ "adcq %%r10, %%rbx ;"
-+ /******************************************/
-+ "adcq $0, %%rcx ;"
-+
-+ "movq 8(%1), %%rdx; " /* A[1] */
-+ "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-+ "addq %%r15, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%r15 ;"
-+
-+ "addq %%r9, %%rax ;"
-+ "adcq %%r11, %%rbx ;"
-+ "adcq %%r13, %%rcx ;"
-+ "adcq $0, %%r15 ;"
-+
-+ "movq 16(%1), %%rdx; " /* A[2] */
-+ "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-+ "addq %%rax, %%r8 ;"
-+ "movq %%r8, 16(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rax ;"
-+
-+ "addq %%r9, %%rbx ;"
-+ "adcq %%r11, %%rcx ;"
-+ "adcq %%r13, %%r15 ;"
-+ "adcq $0, %%rax ;"
-+
-+ "movq 24(%1), %%rdx; " /* A[3] */
-+ "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-+ "addq %%rbx, %%r8 ;"
-+ "movq %%r8, 24(%0) ;"
-+ "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-+ "adcq %%r10, %%r9 ;"
-+ "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-+ "adcq %%r8, %%r11 ;"
-+ "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-+ "adcq %%r10, %%r13 ;"
-+ /******************************************/
-+ "adcq $0, %%rbx ;"
-+
-+ "addq %%r9, %%rcx ;"
-+ "movq %%rcx, 32(%0) ;"
-+ "adcq %%r11, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "adcq %%r13, %%rax ;"
-+ "movq %%rax, 48(%0) ;"
-+ "adcq $0, %%rbx ;"
-+ "movq %%rbx, 56(%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11", "%r13", "%r15");
-+}
-+
-+static void sqr_256x256_integer_adx(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movq (%1), %%rdx ;" /* A[0] */
-+ "mulx 8(%1), %%r8, %%r14 ;" /* A[1]*A[0] */
-+ "xorl %%r15d, %%r15d;"
-+ "mulx 16(%1), %%r9, %%r10 ;" /* A[2]*A[0] */
-+ "adcx %%r14, %%r9 ;"
-+ "mulx 24(%1), %%rax, %%rcx ;" /* A[3]*A[0] */
-+ "adcx %%rax, %%r10 ;"
-+ "movq 24(%1), %%rdx ;" /* A[3] */
-+ "mulx 8(%1), %%r11, %%rbx ;" /* A[1]*A[3] */
-+ "adcx %%rcx, %%r11 ;"
-+ "mulx 16(%1), %%rax, %%r13 ;" /* A[2]*A[3] */
-+ "adcx %%rax, %%rbx ;"
-+ "movq 8(%1), %%rdx ;" /* A[1] */
-+ "adcx %%r15, %%r13 ;"
-+ "mulx 16(%1), %%rax, %%rcx ;" /* A[2]*A[1] */
-+ "movq $0, %%r14 ;"
-+ /******************************************/
-+ "adcx %%r15, %%r14 ;"
-+
-+ "xorl %%r15d, %%r15d;"
-+ "adox %%rax, %%r10 ;"
-+ "adcx %%r8, %%r8 ;"
-+ "adox %%rcx, %%r11 ;"
-+ "adcx %%r9, %%r9 ;"
-+ "adox %%r15, %%rbx ;"
-+ "adcx %%r10, %%r10 ;"
-+ "adox %%r15, %%r13 ;"
-+ "adcx %%r11, %%r11 ;"
-+ "adox %%r15, %%r14 ;"
-+ "adcx %%rbx, %%rbx ;"
-+ "adcx %%r13, %%r13 ;"
-+ "adcx %%r14, %%r14 ;"
-+
-+ "movq (%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-+ /*******************/
-+ "movq %%rax, 0(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "movq 8(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 16(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 24(%0) ;"
-+ "movq 16(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 32(%0) ;"
-+ "adcq %%rcx, %%rbx ;"
-+ "movq %%rbx, 40(%0) ;"
-+ "movq 24(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 48(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 56(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11", "%r13", "%r14", "%r15");
-+}
-+
-+static void sqr_256x256_integer_bmi2(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movq 8(%1), %%rdx ;" /* A[1] */
-+ "mulx (%1), %%r8, %%r9 ;" /* A[0]*A[1] */
-+ "mulx 16(%1), %%r10, %%r11 ;" /* A[2]*A[1] */
-+ "mulx 24(%1), %%rcx, %%r14 ;" /* A[3]*A[1] */
-+
-+ "movq 16(%1), %%rdx ;" /* A[2] */
-+ "mulx 24(%1), %%r15, %%r13 ;" /* A[3]*A[2] */
-+ "mulx (%1), %%rax, %%rdx ;" /* A[0]*A[2] */
-+
-+ "addq %%rax, %%r9 ;"
-+ "adcq %%rdx, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq %%r14, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "movq $0, %%r14 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "movq (%1), %%rdx ;" /* A[0] */
-+ "mulx 24(%1), %%rax, %%rcx ;" /* A[0]*A[3] */
-+
-+ "addq %%rax, %%r10 ;"
-+ "adcq %%rcx, %%r11 ;"
-+ "adcq $0, %%r15 ;"
-+ "adcq $0, %%r13 ;"
-+ "adcq $0, %%r14 ;"
-+
-+ "shldq $1, %%r13, %%r14 ;"
-+ "shldq $1, %%r15, %%r13 ;"
-+ "shldq $1, %%r11, %%r15 ;"
-+ "shldq $1, %%r10, %%r11 ;"
-+ "shldq $1, %%r9, %%r10 ;"
-+ "shldq $1, %%r8, %%r9 ;"
-+ "shlq $1, %%r8 ;"
-+
-+ /*******************/
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-+ /*******************/
-+ "movq %%rax, 0(%0) ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, 8(%0) ;"
-+ "movq 8(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-+ "adcq %%rax, %%r9 ;"
-+ "movq %%r9, 16(%0) ;"
-+ "adcq %%rcx, %%r10 ;"
-+ "movq %%r10, 24(%0) ;"
-+ "movq 16(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-+ "adcq %%rax, %%r11 ;"
-+ "movq %%r11, 32(%0) ;"
-+ "adcq %%rcx, %%r15 ;"
-+ "movq %%r15, 40(%0) ;"
-+ "movq 24(%1), %%rdx ;"
-+ "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-+ "adcq %%rax, %%r13 ;"
-+ "movq %%r13, 48(%0) ;"
-+ "adcq %%rcx, %%r14 ;"
-+ "movq %%r14, 56(%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-+ "%r11", "%r13", "%r14", "%r15");
-+}
-+
-+static void red_eltfp25519_1w_adx(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movl $38, %%edx ;" /* 2*c = 38 = 2^256 */
-+ "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-+ "xorl %%ebx, %%ebx ;"
-+ "adox (%1), %%r8 ;"
-+ "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-+ "adcx %%r10, %%r9 ;"
-+ "adox 8(%1), %%r9 ;"
-+ "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-+ "adcx %%r11, %%r10 ;"
-+ "adox 16(%1), %%r10 ;"
-+ "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-+ "adcx %%rax, %%r11 ;"
-+ "adox 24(%1), %%r11 ;"
-+ /***************************************/
-+ "adcx %%rbx, %%rcx ;"
-+ "adox %%rbx, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-+ "adcx %%rcx, %%r8 ;"
-+ "adcx %%rbx, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcx %%rbx, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcx %%rbx, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-+ "%r10", "%r11");
-+}
-+
-+static void red_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a)
-+{
-+ asm volatile(
-+ "movl $38, %%edx ;" /* 2*c = 38 = 2^256 */
-+ "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-+ "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-+ "addq %%r10, %%r9 ;"
-+ "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-+ "adcq %%r11, %%r10 ;"
-+ "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-+ "adcq %%rax, %%r11 ;"
-+ /***************************************/
-+ "adcq $0, %%rcx ;"
-+ "addq (%1), %%r8 ;"
-+ "adcq 8(%1), %%r9 ;"
-+ "adcq 16(%1), %%r10 ;"
-+ "adcq 24(%1), %%r11 ;"
-+ "adcq $0, %%rcx ;"
-+ "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-+ "addq %%rcx, %%r8 ;"
-+ "adcq $0, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcq $0, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcq $0, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a)
-+ : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-+ "%r11");
-+}
-+
-+static __always_inline void
-+add_eltfp25519_1w_adx(u64 *const c, const u64 *const a, const u64 *const b)
-+{
-+ asm volatile(
-+ "mov $38, %%eax ;"
-+ "xorl %%ecx, %%ecx ;"
-+ "movq (%2), %%r8 ;"
-+ "adcx (%1), %%r8 ;"
-+ "movq 8(%2), %%r9 ;"
-+ "adcx 8(%1), %%r9 ;"
-+ "movq 16(%2), %%r10 ;"
-+ "adcx 16(%1), %%r10 ;"
-+ "movq 24(%2), %%r11 ;"
-+ "adcx 24(%1), %%r11 ;"
-+ "cmovc %%eax, %%ecx ;"
-+ "xorl %%eax, %%eax ;"
-+ "adcx %%rcx, %%r8 ;"
-+ "adcx %%rax, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcx %%rax, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcx %%rax, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $38, %%ecx ;"
-+ "cmovc %%ecx, %%eax ;"
-+ "addq %%rax, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
-+}
-+
-+static __always_inline void
-+add_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a, const u64 *const b)
-+{
-+ asm volatile(
-+ "mov $38, %%eax ;"
-+ "movq (%2), %%r8 ;"
-+ "addq (%1), %%r8 ;"
-+ "movq 8(%2), %%r9 ;"
-+ "adcq 8(%1), %%r9 ;"
-+ "movq 16(%2), %%r10 ;"
-+ "adcq 16(%1), %%r10 ;"
-+ "movq 24(%2), %%r11 ;"
-+ "adcq 24(%1), %%r11 ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%eax, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "adcq $0, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcq $0, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcq $0, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%eax, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
-+}
-+
-+static __always_inline void
-+sub_eltfp25519_1w(u64 *const c, const u64 *const a, const u64 *const b)
-+{
-+ asm volatile(
-+ "mov $38, %%eax ;"
-+ "movq (%1), %%r8 ;"
-+ "subq (%2), %%r8 ;"
-+ "movq 8(%1), %%r9 ;"
-+ "sbbq 8(%2), %%r9 ;"
-+ "movq 16(%1), %%r10 ;"
-+ "sbbq 16(%2), %%r10 ;"
-+ "movq 24(%1), %%r11 ;"
-+ "sbbq 24(%2), %%r11 ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%eax, %%ecx ;"
-+ "subq %%rcx, %%r8 ;"
-+ "sbbq $0, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "sbbq $0, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "sbbq $0, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%eax, %%ecx ;"
-+ "subq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(b)
-+ : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
-+}
-+
-+/* Multiplication by a24 = (A+2)/4 = (486662+2)/4 = 121666 */
-+static __always_inline void
-+mul_a24_eltfp25519_1w(u64 *const c, const u64 *const a)
-+{
-+ const u64 a24 = 121666;
-+ asm volatile(
-+ "movq %2, %%rdx ;"
-+ "mulx (%1), %%r8, %%r10 ;"
-+ "mulx 8(%1), %%r9, %%r11 ;"
-+ "addq %%r10, %%r9 ;"
-+ "mulx 16(%1), %%r10, %%rax ;"
-+ "adcq %%r11, %%r10 ;"
-+ "mulx 24(%1), %%r11, %%rcx ;"
-+ "adcq %%rax, %%r11 ;"
-+ /**************************/
-+ "adcq $0, %%rcx ;"
-+ "movl $38, %%edx ;" /* 2*c = 38 = 2^256 mod 2^255-19*/
-+ "imul %%rdx, %%rcx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "adcq $0, %%r9 ;"
-+ "movq %%r9, 8(%0) ;"
-+ "adcq $0, %%r10 ;"
-+ "movq %%r10, 16(%0) ;"
-+ "adcq $0, %%r11 ;"
-+ "movq %%r11, 24(%0) ;"
-+ "mov $0, %%ecx ;"
-+ "cmovc %%edx, %%ecx ;"
-+ "addq %%rcx, %%r8 ;"
-+ "movq %%r8, (%0) ;"
-+ :
-+ : "r"(c), "r"(a), "r"(a24)
-+ : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-+ "%r11");
-+}
-+
-+static void inv_eltfp25519_1w_adx(u64 *const c, const u64 *const a)
-+{
-+ struct {
-+ eltfp25519_1w_buffer buffer;
-+ eltfp25519_1w x0, x1, x2;
-+ } __aligned(32) m;
-+ u64 *T[4];
-+
-+ T[0] = m.x0;
-+ T[1] = c; /* x^(-1) */
-+ T[2] = m.x1;
-+ T[3] = m.x2;
-+
-+ copy_eltfp25519_1w(T[1], a);
-+ sqrn_eltfp25519_1w_adx(T[1], 1);
-+ copy_eltfp25519_1w(T[2], T[1]);
-+ sqrn_eltfp25519_1w_adx(T[2], 2);
-+ mul_eltfp25519_1w_adx(T[0], a, T[2]);
-+ mul_eltfp25519_1w_adx(T[1], T[1], T[0]);
-+ copy_eltfp25519_1w(T[2], T[1]);
-+ sqrn_eltfp25519_1w_adx(T[2], 1);
-+ mul_eltfp25519_1w_adx(T[0], T[0], T[2]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_adx(T[2], 5);
-+ mul_eltfp25519_1w_adx(T[0], T[0], T[2]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_adx(T[2], 10);
-+ mul_eltfp25519_1w_adx(T[2], T[2], T[0]);
-+ copy_eltfp25519_1w(T[3], T[2]);
-+ sqrn_eltfp25519_1w_adx(T[3], 20);
-+ mul_eltfp25519_1w_adx(T[3], T[3], T[2]);
-+ sqrn_eltfp25519_1w_adx(T[3], 10);
-+ mul_eltfp25519_1w_adx(T[3], T[3], T[0]);
-+ copy_eltfp25519_1w(T[0], T[3]);
-+ sqrn_eltfp25519_1w_adx(T[0], 50);
-+ mul_eltfp25519_1w_adx(T[0], T[0], T[3]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_adx(T[2], 100);
-+ mul_eltfp25519_1w_adx(T[2], T[2], T[0]);
-+ sqrn_eltfp25519_1w_adx(T[2], 50);
-+ mul_eltfp25519_1w_adx(T[2], T[2], T[3]);
-+ sqrn_eltfp25519_1w_adx(T[2], 5);
-+ mul_eltfp25519_1w_adx(T[1], T[1], T[2]);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+static void inv_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a)
-+{
-+ struct {
-+ eltfp25519_1w_buffer buffer;
-+ eltfp25519_1w x0, x1, x2;
-+ } __aligned(32) m;
-+ u64 *T[5];
-+
-+ T[0] = m.x0;
-+ T[1] = c; /* x^(-1) */
-+ T[2] = m.x1;
-+ T[3] = m.x2;
-+
-+ copy_eltfp25519_1w(T[1], a);
-+ sqrn_eltfp25519_1w_bmi2(T[1], 1);
-+ copy_eltfp25519_1w(T[2], T[1]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 2);
-+ mul_eltfp25519_1w_bmi2(T[0], a, T[2]);
-+ mul_eltfp25519_1w_bmi2(T[1], T[1], T[0]);
-+ copy_eltfp25519_1w(T[2], T[1]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 1);
-+ mul_eltfp25519_1w_bmi2(T[0], T[0], T[2]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 5);
-+ mul_eltfp25519_1w_bmi2(T[0], T[0], T[2]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 10);
-+ mul_eltfp25519_1w_bmi2(T[2], T[2], T[0]);
-+ copy_eltfp25519_1w(T[3], T[2]);
-+ sqrn_eltfp25519_1w_bmi2(T[3], 20);
-+ mul_eltfp25519_1w_bmi2(T[3], T[3], T[2]);
-+ sqrn_eltfp25519_1w_bmi2(T[3], 10);
-+ mul_eltfp25519_1w_bmi2(T[3], T[3], T[0]);
-+ copy_eltfp25519_1w(T[0], T[3]);
-+ sqrn_eltfp25519_1w_bmi2(T[0], 50);
-+ mul_eltfp25519_1w_bmi2(T[0], T[0], T[3]);
-+ copy_eltfp25519_1w(T[2], T[0]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 100);
-+ mul_eltfp25519_1w_bmi2(T[2], T[2], T[0]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 50);
-+ mul_eltfp25519_1w_bmi2(T[2], T[2], T[3]);
-+ sqrn_eltfp25519_1w_bmi2(T[2], 5);
-+ mul_eltfp25519_1w_bmi2(T[1], T[1], T[2]);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+/* Given c, a 256-bit number, fred_eltfp25519_1w updates c
-+ * with a number such that 0 <= C < 2**255-19.
-+ */
-+static __always_inline void fred_eltfp25519_1w(u64 *const c)
-+{
-+ u64 tmp0 = 38, tmp1 = 19;
-+ asm volatile(
-+ "btrq $63, %3 ;" /* Put bit 255 in carry flag and clear */
-+ "cmovncl %k5, %k4 ;" /* c[255] ? 38 : 19 */
-+
-+ /* Add either 19 or 38 to c */
-+ "addq %4, %0 ;"
-+ "adcq $0, %1 ;"
-+ "adcq $0, %2 ;"
-+ "adcq $0, %3 ;"
-+
-+ /* Test for bit 255 again; only triggered on overflow modulo 2^255-19 */
-+ "movl $0, %k4 ;"
-+ "cmovnsl %k5, %k4 ;" /* c[255] ? 0 : 19 */
-+ "btrq $63, %3 ;" /* Clear bit 255 */
-+
-+ /* Subtract 19 if necessary */
-+ "subq %4, %0 ;"
-+ "sbbq $0, %1 ;"
-+ "sbbq $0, %2 ;"
-+ "sbbq $0, %3 ;"
-+
-+ : "+r"(c[0]), "+r"(c[1]), "+r"(c[2]), "+r"(c[3]), "+r"(tmp0),
-+ "+r"(tmp1)
-+ :
-+ : "memory", "cc");
-+}
-+
-+static __always_inline void cswap(u8 bit, u64 *const px, u64 *const py)
-+{
-+ u64 temp;
-+ asm volatile(
-+ "test %9, %9 ;"
-+ "movq %0, %8 ;"
-+ "cmovnzq %4, %0 ;"
-+ "cmovnzq %8, %4 ;"
-+ "movq %1, %8 ;"
-+ "cmovnzq %5, %1 ;"
-+ "cmovnzq %8, %5 ;"
-+ "movq %2, %8 ;"
-+ "cmovnzq %6, %2 ;"
-+ "cmovnzq %8, %6 ;"
-+ "movq %3, %8 ;"
-+ "cmovnzq %7, %3 ;"
-+ "cmovnzq %8, %7 ;"
-+ : "+r"(px[0]), "+r"(px[1]), "+r"(px[2]), "+r"(px[3]),
-+ "+r"(py[0]), "+r"(py[1]), "+r"(py[2]), "+r"(py[3]),
-+ "=r"(temp)
-+ : "r"(bit)
-+ : "cc"
-+ );
-+}
-+
-+static __always_inline void cselect(u8 bit, u64 *const px, const u64 *const py)
-+{
-+ asm volatile(
-+ "test %4, %4 ;"
-+ "cmovnzq %5, %0 ;"
-+ "cmovnzq %6, %1 ;"
-+ "cmovnzq %7, %2 ;"
-+ "cmovnzq %8, %3 ;"
-+ : "+r"(px[0]), "+r"(px[1]), "+r"(px[2]), "+r"(px[3])
-+ : "r"(bit), "rm"(py[0]), "rm"(py[1]), "rm"(py[2]), "rm"(py[3])
-+ : "cc"
-+ );
-+}
-+
-+static void curve25519_adx(u8 shared[CURVE25519_KEY_SIZE],
-+ const u8 private_key[CURVE25519_KEY_SIZE],
-+ const u8 session_key[CURVE25519_KEY_SIZE])
-+{
-+ struct {
-+ u64 buffer[4 * NUM_WORDS_ELTFP25519];
-+ u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-+ u64 workspace[6 * NUM_WORDS_ELTFP25519];
-+ u8 session[CURVE25519_KEY_SIZE];
-+ u8 private[CURVE25519_KEY_SIZE];
-+ } __aligned(32) m;
-+
-+ int i = 0, j = 0;
-+ u64 prev = 0;
-+ u64 *const X1 = (u64 *)m.session;
-+ u64 *const key = (u64 *)m.private;
-+ u64 *const Px = m.coordinates + 0;
-+ u64 *const Pz = m.coordinates + 4;
-+ u64 *const Qx = m.coordinates + 8;
-+ u64 *const Qz = m.coordinates + 12;
-+ u64 *const X2 = Qx;
-+ u64 *const Z2 = Qz;
-+ u64 *const X3 = Px;
-+ u64 *const Z3 = Pz;
-+ u64 *const X2Z2 = Qx;
-+ u64 *const X3Z3 = Px;
-+
-+ u64 *const A = m.workspace + 0;
-+ u64 *const B = m.workspace + 4;
-+ u64 *const D = m.workspace + 8;
-+ u64 *const C = m.workspace + 12;
-+ u64 *const DA = m.workspace + 16;
-+ u64 *const CB = m.workspace + 20;
-+ u64 *const AB = A;
-+ u64 *const DC = D;
-+ u64 *const DACB = DA;
-+
-+ memcpy(m.private, private_key, sizeof(m.private));
-+ memcpy(m.session, session_key, sizeof(m.session));
-+
-+ curve25519_clamp_secret(m.private);
-+
-+ /* As in the draft:
-+ * When receiving such an array, implementations of curve25519
-+ * MUST mask the most-significant bit in the final byte. This
-+ * is done to preserve compatibility with point formats which
-+ * reserve the sign bit for use in other protocols and to
-+ * increase resistance to implementation fingerprinting
-+ */
-+ m.session[CURVE25519_KEY_SIZE - 1] &= (1 << (255 % 8)) - 1;
-+
-+ copy_eltfp25519_1w(Px, X1);
-+ setzero_eltfp25519_1w(Pz);
-+ setzero_eltfp25519_1w(Qx);
-+ setzero_eltfp25519_1w(Qz);
-+
-+ Pz[0] = 1;
-+ Qx[0] = 1;
-+
-+ /* main-loop */
-+ prev = 0;
-+ j = 62;
-+ for (i = 3; i >= 0; --i) {
-+ while (j >= 0) {
-+ u64 bit = (key[i] >> j) & 0x1;
-+ u64 swap = bit ^ prev;
-+ prev = bit;
-+
-+ add_eltfp25519_1w_adx(A, X2, Z2); /* A = (X2+Z2) */
-+ sub_eltfp25519_1w(B, X2, Z2); /* B = (X2-Z2) */
-+ add_eltfp25519_1w_adx(C, X3, Z3); /* C = (X3+Z3) */
-+ sub_eltfp25519_1w(D, X3, Z3); /* D = (X3-Z3) */
-+ mul_eltfp25519_2w_adx(DACB, AB, DC); /* [DA|CB] = [A|B]*[D|C] */
-+
-+ cselect(swap, A, C);
-+ cselect(swap, B, D);
-+
-+ sqr_eltfp25519_2w_adx(AB); /* [AA|BB] = [A^2|B^2] */
-+ add_eltfp25519_1w_adx(X3, DA, CB); /* X3 = (DA+CB) */
-+ sub_eltfp25519_1w(Z3, DA, CB); /* Z3 = (DA-CB) */
-+ sqr_eltfp25519_2w_adx(X3Z3); /* [X3|Z3] = [(DA+CB)|(DA+CB)]^2 */
-+
-+ copy_eltfp25519_1w(X2, B); /* X2 = B^2 */
-+ sub_eltfp25519_1w(Z2, A, B); /* Z2 = E = AA-BB */
-+
-+ mul_a24_eltfp25519_1w(B, Z2); /* B = a24*E */
-+ add_eltfp25519_1w_adx(B, B, X2); /* B = a24*E+B */
-+ mul_eltfp25519_2w_adx(X2Z2, X2Z2, AB); /* [X2|Z2] = [B|E]*[A|a24*E+B] */
-+ mul_eltfp25519_1w_adx(Z3, Z3, X1); /* Z3 = Z3*X1 */
-+ --j;
-+ }
-+ j = 63;
-+ }
-+
-+ inv_eltfp25519_1w_adx(A, Qz);
-+ mul_eltfp25519_1w_adx((u64 *)shared, Qx, A);
-+ fred_eltfp25519_1w((u64 *)shared);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+static void curve25519_adx_base(u8 session_key[CURVE25519_KEY_SIZE],
-+ const u8 private_key[CURVE25519_KEY_SIZE])
-+{
-+ struct {
-+ u64 buffer[4 * NUM_WORDS_ELTFP25519];
-+ u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-+ u64 workspace[4 * NUM_WORDS_ELTFP25519];
-+ u8 private[CURVE25519_KEY_SIZE];
-+ } __aligned(32) m;
-+
-+ const int ite[4] = { 64, 64, 64, 63 };
-+ const int q = 3;
-+ u64 swap = 1;
-+
-+ int i = 0, j = 0, k = 0;
-+ u64 *const key = (u64 *)m.private;
-+ u64 *const Ur1 = m.coordinates + 0;
-+ u64 *const Zr1 = m.coordinates + 4;
-+ u64 *const Ur2 = m.coordinates + 8;
-+ u64 *const Zr2 = m.coordinates + 12;
-+
-+ u64 *const UZr1 = m.coordinates + 0;
-+ u64 *const ZUr2 = m.coordinates + 8;
-+
-+ u64 *const A = m.workspace + 0;
-+ u64 *const B = m.workspace + 4;
-+ u64 *const C = m.workspace + 8;
-+ u64 *const D = m.workspace + 12;
-+
-+ u64 *const AB = m.workspace + 0;
-+ u64 *const CD = m.workspace + 8;
-+
-+ const u64 *const P = table_ladder_8k;
-+
-+ memcpy(m.private, private_key, sizeof(m.private));
-+
-+ curve25519_clamp_secret(m.private);
-+
-+ setzero_eltfp25519_1w(Ur1);
-+ setzero_eltfp25519_1w(Zr1);
-+ setzero_eltfp25519_1w(Zr2);
-+ Ur1[0] = 1;
-+ Zr1[0] = 1;
-+ Zr2[0] = 1;
-+
-+ /* G-S */
-+ Ur2[3] = 0x1eaecdeee27cab34UL;
-+ Ur2[2] = 0xadc7a0b9235d48e2UL;
-+ Ur2[1] = 0xbbf095ae14b2edf8UL;
-+ Ur2[0] = 0x7e94e1fec82faabdUL;
-+
-+ /* main-loop */
-+ j = q;
-+ for (i = 0; i < NUM_WORDS_ELTFP25519; ++i) {
-+ while (j < ite[i]) {
-+ u64 bit = (key[i] >> j) & 0x1;
-+ k = (64 * i + j - q);
-+ swap = swap ^ bit;
-+ cswap(swap, Ur1, Ur2);
-+ cswap(swap, Zr1, Zr2);
-+ swap = bit;
-+ /* Addition */
-+ sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-+ add_eltfp25519_1w_adx(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-+ mul_eltfp25519_1w_adx(C, &P[4 * k], B); /* C = M0-B */
-+ sub_eltfp25519_1w(B, A, C); /* B = (Ur1+Zr1) - M*(Ur1-Zr1) */
-+ add_eltfp25519_1w_adx(A, A, C); /* A = (Ur1+Zr1) + M*(Ur1-Zr1) */
-+ sqr_eltfp25519_2w_adx(AB); /* A = A^2 | B = B^2 */
-+ mul_eltfp25519_2w_adx(UZr1, ZUr2, AB); /* Ur1 = Zr2*A | Zr1 = Ur2*B */
-+ ++j;
-+ }
-+ j = 0;
-+ }
-+
-+ /* Doubling */
-+ for (i = 0; i < q; ++i) {
-+ add_eltfp25519_1w_adx(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-+ sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-+ sqr_eltfp25519_2w_adx(AB); /* A = A**2 B = B**2 */
-+ copy_eltfp25519_1w(C, B); /* C = B */
-+ sub_eltfp25519_1w(B, A, B); /* B = A-B */
-+ mul_a24_eltfp25519_1w(D, B); /* D = my_a24*B */
-+ add_eltfp25519_1w_adx(D, D, C); /* D = D+C */
-+ mul_eltfp25519_2w_adx(UZr1, AB, CD); /* Ur1 = A*B Zr1 = Zr1*A */
-+ }
-+
-+ /* Convert to affine coordinates */
-+ inv_eltfp25519_1w_adx(A, Zr1);
-+ mul_eltfp25519_1w_adx((u64 *)session_key, Ur1, A);
-+ fred_eltfp25519_1w((u64 *)session_key);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+static void curve25519_bmi2(u8 shared[CURVE25519_KEY_SIZE],
-+ const u8 private_key[CURVE25519_KEY_SIZE],
-+ const u8 session_key[CURVE25519_KEY_SIZE])
-+{
-+ struct {
-+ u64 buffer[4 * NUM_WORDS_ELTFP25519];
-+ u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-+ u64 workspace[6 * NUM_WORDS_ELTFP25519];
-+ u8 session[CURVE25519_KEY_SIZE];
-+ u8 private[CURVE25519_KEY_SIZE];
-+ } __aligned(32) m;
-+
-+ int i = 0, j = 0;
-+ u64 prev = 0;
-+ u64 *const X1 = (u64 *)m.session;
-+ u64 *const key = (u64 *)m.private;
-+ u64 *const Px = m.coordinates + 0;
-+ u64 *const Pz = m.coordinates + 4;
-+ u64 *const Qx = m.coordinates + 8;
-+ u64 *const Qz = m.coordinates + 12;
-+ u64 *const X2 = Qx;
-+ u64 *const Z2 = Qz;
-+ u64 *const X3 = Px;
-+ u64 *const Z3 = Pz;
-+ u64 *const X2Z2 = Qx;
-+ u64 *const X3Z3 = Px;
-+
-+ u64 *const A = m.workspace + 0;
-+ u64 *const B = m.workspace + 4;
-+ u64 *const D = m.workspace + 8;
-+ u64 *const C = m.workspace + 12;
-+ u64 *const DA = m.workspace + 16;
-+ u64 *const CB = m.workspace + 20;
-+ u64 *const AB = A;
-+ u64 *const DC = D;
-+ u64 *const DACB = DA;
-+
-+ memcpy(m.private, private_key, sizeof(m.private));
-+ memcpy(m.session, session_key, sizeof(m.session));
-+
-+ curve25519_clamp_secret(m.private);
-+
-+ /* As in the draft:
-+ * When receiving such an array, implementations of curve25519
-+ * MUST mask the most-significant bit in the final byte. This
-+ * is done to preserve compatibility with point formats which
-+ * reserve the sign bit for use in other protocols and to
-+ * increase resistance to implementation fingerprinting
-+ */
-+ m.session[CURVE25519_KEY_SIZE - 1] &= (1 << (255 % 8)) - 1;
-+
-+ copy_eltfp25519_1w(Px, X1);
-+ setzero_eltfp25519_1w(Pz);
-+ setzero_eltfp25519_1w(Qx);
-+ setzero_eltfp25519_1w(Qz);
-+
-+ Pz[0] = 1;
-+ Qx[0] = 1;
-+
-+ /* main-loop */
-+ prev = 0;
-+ j = 62;
-+ for (i = 3; i >= 0; --i) {
-+ while (j >= 0) {
-+ u64 bit = (key[i] >> j) & 0x1;
-+ u64 swap = bit ^ prev;
-+ prev = bit;
-+
-+ add_eltfp25519_1w_bmi2(A, X2, Z2); /* A = (X2+Z2) */
-+ sub_eltfp25519_1w(B, X2, Z2); /* B = (X2-Z2) */
-+ add_eltfp25519_1w_bmi2(C, X3, Z3); /* C = (X3+Z3) */
-+ sub_eltfp25519_1w(D, X3, Z3); /* D = (X3-Z3) */
-+ mul_eltfp25519_2w_bmi2(DACB, AB, DC); /* [DA|CB] = [A|B]*[D|C] */
-+
-+ cselect(swap, A, C);
-+ cselect(swap, B, D);
-+
-+ sqr_eltfp25519_2w_bmi2(AB); /* [AA|BB] = [A^2|B^2] */
-+ add_eltfp25519_1w_bmi2(X3, DA, CB); /* X3 = (DA+CB) */
-+ sub_eltfp25519_1w(Z3, DA, CB); /* Z3 = (DA-CB) */
-+ sqr_eltfp25519_2w_bmi2(X3Z3); /* [X3|Z3] = [(DA+CB)|(DA+CB)]^2 */
-+
-+ copy_eltfp25519_1w(X2, B); /* X2 = B^2 */
-+ sub_eltfp25519_1w(Z2, A, B); /* Z2 = E = AA-BB */
-+
-+ mul_a24_eltfp25519_1w(B, Z2); /* B = a24*E */
-+ add_eltfp25519_1w_bmi2(B, B, X2); /* B = a24*E+B */
-+ mul_eltfp25519_2w_bmi2(X2Z2, X2Z2, AB); /* [X2|Z2] = [B|E]*[A|a24*E+B] */
-+ mul_eltfp25519_1w_bmi2(Z3, Z3, X1); /* Z3 = Z3*X1 */
-+ --j;
-+ }
-+ j = 63;
-+ }
-+
-+ inv_eltfp25519_1w_bmi2(A, Qz);
-+ mul_eltfp25519_1w_bmi2((u64 *)shared, Qx, A);
-+ fred_eltfp25519_1w((u64 *)shared);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+static void curve25519_bmi2_base(u8 session_key[CURVE25519_KEY_SIZE],
-+ const u8 private_key[CURVE25519_KEY_SIZE])
-+{
-+ struct {
-+ u64 buffer[4 * NUM_WORDS_ELTFP25519];
-+ u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-+ u64 workspace[4 * NUM_WORDS_ELTFP25519];
-+ u8 private[CURVE25519_KEY_SIZE];
-+ } __aligned(32) m;
-+
-+ const int ite[4] = { 64, 64, 64, 63 };
-+ const int q = 3;
-+ u64 swap = 1;
-+
-+ int i = 0, j = 0, k = 0;
-+ u64 *const key = (u64 *)m.private;
-+ u64 *const Ur1 = m.coordinates + 0;
-+ u64 *const Zr1 = m.coordinates + 4;
-+ u64 *const Ur2 = m.coordinates + 8;
-+ u64 *const Zr2 = m.coordinates + 12;
-+
-+ u64 *const UZr1 = m.coordinates + 0;
-+ u64 *const ZUr2 = m.coordinates + 8;
-+
-+ u64 *const A = m.workspace + 0;
-+ u64 *const B = m.workspace + 4;
-+ u64 *const C = m.workspace + 8;
-+ u64 *const D = m.workspace + 12;
-+
-+ u64 *const AB = m.workspace + 0;
-+ u64 *const CD = m.workspace + 8;
-+
-+ const u64 *const P = table_ladder_8k;
-+
-+ memcpy(m.private, private_key, sizeof(m.private));
-+
-+ curve25519_clamp_secret(m.private);
-+
-+ setzero_eltfp25519_1w(Ur1);
-+ setzero_eltfp25519_1w(Zr1);
-+ setzero_eltfp25519_1w(Zr2);
-+ Ur1[0] = 1;
-+ Zr1[0] = 1;
-+ Zr2[0] = 1;
-+
-+ /* G-S */
-+ Ur2[3] = 0x1eaecdeee27cab34UL;
-+ Ur2[2] = 0xadc7a0b9235d48e2UL;
-+ Ur2[1] = 0xbbf095ae14b2edf8UL;
-+ Ur2[0] = 0x7e94e1fec82faabdUL;
-+
-+ /* main-loop */
-+ j = q;
-+ for (i = 0; i < NUM_WORDS_ELTFP25519; ++i) {
-+ while (j < ite[i]) {
-+ u64 bit = (key[i] >> j) & 0x1;
-+ k = (64 * i + j - q);
-+ swap = swap ^ bit;
-+ cswap(swap, Ur1, Ur2);
-+ cswap(swap, Zr1, Zr2);
-+ swap = bit;
-+ /* Addition */
-+ sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-+ add_eltfp25519_1w_bmi2(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-+ mul_eltfp25519_1w_bmi2(C, &P[4 * k], B);/* C = M0-B */
-+ sub_eltfp25519_1w(B, A, C); /* B = (Ur1+Zr1) - M*(Ur1-Zr1) */
-+ add_eltfp25519_1w_bmi2(A, A, C); /* A = (Ur1+Zr1) + M*(Ur1-Zr1) */
-+ sqr_eltfp25519_2w_bmi2(AB); /* A = A^2 | B = B^2 */
-+ mul_eltfp25519_2w_bmi2(UZr1, ZUr2, AB); /* Ur1 = Zr2*A | Zr1 = Ur2*B */
-+ ++j;
-+ }
-+ j = 0;
-+ }
-+
-+ /* Doubling */
-+ for (i = 0; i < q; ++i) {
-+ add_eltfp25519_1w_bmi2(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-+ sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-+ sqr_eltfp25519_2w_bmi2(AB); /* A = A**2 B = B**2 */
-+ copy_eltfp25519_1w(C, B); /* C = B */
-+ sub_eltfp25519_1w(B, A, B); /* B = A-B */
-+ mul_a24_eltfp25519_1w(D, B); /* D = my_a24*B */
-+ add_eltfp25519_1w_bmi2(D, D, C); /* D = D+C */
-+ mul_eltfp25519_2w_bmi2(UZr1, AB, CD); /* Ur1 = A*B Zr1 = Zr1*A */
-+ }
-+
-+ /* Convert to affine coordinates */
-+ inv_eltfp25519_1w_bmi2(A, Zr1);
-+ mul_eltfp25519_1w_bmi2((u64 *)session_key, Ur1, A);
-+ fred_eltfp25519_1w((u64 *)session_key);
-+
-+ memzero_explicit(&m, sizeof(m));
-+}
-+
-+void curve25519_arch(u8 mypublic[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE],
-+ const u8 basepoint[CURVE25519_KEY_SIZE])
-+{
-+ if (static_branch_likely(&curve25519_use_adx))
-+ curve25519_adx(mypublic, secret, basepoint);
-+ else if (static_branch_likely(&curve25519_use_bmi2))
-+ curve25519_bmi2(mypublic, secret, basepoint);
-+ else
-+ curve25519_generic(mypublic, secret, basepoint);
-+}
-+EXPORT_SYMBOL(curve25519_arch);
-+
-+void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE])
-+{
-+ if (static_branch_likely(&curve25519_use_adx))
-+ curve25519_adx_base(pub, secret);
-+ else if (static_branch_likely(&curve25519_use_bmi2))
-+ curve25519_bmi2_base(pub, secret);
-+ else
-+ curve25519_generic(pub, secret, curve25519_base_point);
-+}
-+EXPORT_SYMBOL(curve25519_base_arch);
-+
-+static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
-+ unsigned int len)
-+{
-+ u8 *secret = kpp_tfm_ctx(tfm);
-+
-+ if (!len)
-+ curve25519_generate_secret(secret);
-+ else if (len == CURVE25519_KEY_SIZE &&
-+ crypto_memneq(buf, curve25519_null_point, CURVE25519_KEY_SIZE))
-+ memcpy(secret, buf, CURVE25519_KEY_SIZE);
-+ else
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static int curve25519_generate_public_key(struct kpp_request *req)
-+{
-+ struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
-+ const u8 *secret = kpp_tfm_ctx(tfm);
-+ u8 buf[CURVE25519_KEY_SIZE];
-+ int copied, nbytes;
-+
-+ if (req->src)
-+ return -EINVAL;
-+
-+ curve25519_base_arch(buf, secret);
-+
-+ /* might want less than we've got */
-+ nbytes = min_t(size_t, CURVE25519_KEY_SIZE, req->dst_len);
-+ copied = sg_copy_from_buffer(req->dst, sg_nents_for_len(req->dst,
-+ nbytes),
-+ buf, nbytes);
-+ if (copied != nbytes)
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static int curve25519_compute_shared_secret(struct kpp_request *req)
-+{
-+ struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
-+ const u8 *secret = kpp_tfm_ctx(tfm);
-+ u8 public_key[CURVE25519_KEY_SIZE];
-+ u8 buf[CURVE25519_KEY_SIZE];
-+ int copied, nbytes;
-+
-+ if (!req->src)
-+ return -EINVAL;
-+
-+ copied = sg_copy_to_buffer(req->src,
-+ sg_nents_for_len(req->src,
-+ CURVE25519_KEY_SIZE),
-+ public_key, CURVE25519_KEY_SIZE);
-+ if (copied != CURVE25519_KEY_SIZE)
-+ return -EINVAL;
-+
-+ curve25519_arch(buf, secret, public_key);
-+
-+ /* might want less than we've got */
-+ nbytes = min_t(size_t, CURVE25519_KEY_SIZE, req->dst_len);
-+ copied = sg_copy_from_buffer(req->dst, sg_nents_for_len(req->dst,
-+ nbytes),
-+ buf, nbytes);
-+ if (copied != nbytes)
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static unsigned int curve25519_max_size(struct crypto_kpp *tfm)
-+{
-+ return CURVE25519_KEY_SIZE;
-+}
-+
-+static struct kpp_alg curve25519_alg = {
-+ .base.cra_name = "curve25519",
-+ .base.cra_driver_name = "curve25519-x86",
-+ .base.cra_priority = 200,
-+ .base.cra_module = THIS_MODULE,
-+ .base.cra_ctxsize = CURVE25519_KEY_SIZE,
-+
-+ .set_secret = curve25519_set_secret,
-+ .generate_public_key = curve25519_generate_public_key,
-+ .compute_shared_secret = curve25519_compute_shared_secret,
-+ .max_size = curve25519_max_size,
-+};
-+
-+static int __init curve25519_mod_init(void)
-+{
-+ if (boot_cpu_has(X86_FEATURE_BMI2))
-+ static_branch_enable(&curve25519_use_bmi2);
-+ else if (boot_cpu_has(X86_FEATURE_ADX))
-+ static_branch_enable(&curve25519_use_adx);
-+ else
-+ return 0;
-+ return crypto_register_kpp(&curve25519_alg);
-+}
-+
-+static void __exit curve25519_mod_exit(void)
-+{
-+ if (boot_cpu_has(X86_FEATURE_BMI2) ||
-+ boot_cpu_has(X86_FEATURE_ADX))
-+ crypto_unregister_kpp(&curve25519_alg);
-+}
-+
-+module_init(curve25519_mod_init);
-+module_exit(curve25519_mod_exit);
-+
-+MODULE_ALIAS_CRYPTO("curve25519");
-+MODULE_ALIAS_CRYPTO("curve25519-x86");
-+MODULE_LICENSE("GPL v2");
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -269,6 +269,12 @@ config CRYPTO_CURVE25519
- select CRYPTO_KPP
- select CRYPTO_LIB_CURVE25519_GENERIC
-
-+config CRYPTO_CURVE25519_X86
-+ tristate "x86_64 accelerated Curve25519 scalar multiplication library"
-+ depends on X86 && 64BIT
-+ select CRYPTO_LIB_CURVE25519_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_CURVE25519
-+
- comment "Authenticated Encryption with Associated Data"
-
- config CRYPTO_CCM
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0030-crypto-arm-curve25519-import-Bernstein-and-Schwabe-s.patch b/target/linux/generic/backport-5.4/080-wireguard-0030-crypto-arm-curve25519-import-Bernstein-and-Schwabe-s.patch
deleted file mode 100644
index 8fda25d60a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0030-crypto-arm-curve25519-import-Bernstein-and-Schwabe-s.patch
+++ /dev/null
@@ -1,2135 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:37 +0100
-Subject: [PATCH] crypto: arm/curve25519 - import Bernstein and Schwabe's
- Curve25519 ARM implementation
-
-commit f0fb006b604f98e2309a30f34ef455ac734f7c1c upstream.
-
-This comes from Dan Bernstein and Peter Schwabe's public domain NEON
-code, and is included here in raw form so that subsequent commits that
-fix these up for the kernel can see how it has changed. This code does
-have some entirely cosmetic formatting differences, adding indentation
-and so forth, so that when we actually port it for use in the kernel in
-the subsequent commit, it's obvious what's changed in the process.
-
-This code originates from SUPERCOP 20180818, available at
-<https://bench.cr.yp.to/supercop.html>.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/curve25519-core.S | 2105 +++++++++++++++++++++++++++++
- 1 file changed, 2105 insertions(+)
- create mode 100644 arch/arm/crypto/curve25519-core.S
-
---- /dev/null
-+++ b/arch/arm/crypto/curve25519-core.S
-@@ -0,0 +1,2105 @@
-+/*
-+ * Public domain code from Daniel J. Bernstein and Peter Schwabe, from
-+ * SUPERCOP's curve25519/neon2/scalarmult.s.
-+ */
-+
-+.fpu neon
-+.text
-+.align 4
-+.global _crypto_scalarmult_curve25519_neon2
-+.global crypto_scalarmult_curve25519_neon2
-+.type _crypto_scalarmult_curve25519_neon2 STT_FUNC
-+.type crypto_scalarmult_curve25519_neon2 STT_FUNC
-+ _crypto_scalarmult_curve25519_neon2:
-+ crypto_scalarmult_curve25519_neon2:
-+ vpush {q4, q5, q6, q7}
-+ mov r12, sp
-+ sub sp, sp, #736
-+ and sp, sp, #0xffffffe0
-+ strd r4, [sp, #0]
-+ strd r6, [sp, #8]
-+ strd r8, [sp, #16]
-+ strd r10, [sp, #24]
-+ str r12, [sp, #480]
-+ str r14, [sp, #484]
-+ mov r0, r0
-+ mov r1, r1
-+ mov r2, r2
-+ add r3, sp, #32
-+ ldr r4, =0
-+ ldr r5, =254
-+ vmov.i32 q0, #1
-+ vshr.u64 q1, q0, #7
-+ vshr.u64 q0, q0, #8
-+ vmov.i32 d4, #19
-+ vmov.i32 d5, #38
-+ add r6, sp, #512
-+ vst1.8 {d2-d3}, [r6, : 128]
-+ add r6, sp, #528
-+ vst1.8 {d0-d1}, [r6, : 128]
-+ add r6, sp, #544
-+ vst1.8 {d4-d5}, [r6, : 128]
-+ add r6, r3, #0
-+ vmov.i32 q2, #0
-+ vst1.8 {d4-d5}, [r6, : 128]!
-+ vst1.8 {d4-d5}, [r6, : 128]!
-+ vst1.8 d4, [r6, : 64]
-+ add r6, r3, #0
-+ ldr r7, =960
-+ sub r7, r7, #2
-+ neg r7, r7
-+ sub r7, r7, r7, LSL #7
-+ str r7, [r6]
-+ add r6, sp, #704
-+ vld1.8 {d4-d5}, [r1]!
-+ vld1.8 {d6-d7}, [r1]
-+ vst1.8 {d4-d5}, [r6, : 128]!
-+ vst1.8 {d6-d7}, [r6, : 128]
-+ sub r1, r6, #16
-+ ldrb r6, [r1]
-+ and r6, r6, #248
-+ strb r6, [r1]
-+ ldrb r6, [r1, #31]
-+ and r6, r6, #127
-+ orr r6, r6, #64
-+ strb r6, [r1, #31]
-+ vmov.i64 q2, #0xffffffff
-+ vshr.u64 q3, q2, #7
-+ vshr.u64 q2, q2, #6
-+ vld1.8 {d8}, [r2]
-+ vld1.8 {d10}, [r2]
-+ add r2, r2, #6
-+ vld1.8 {d12}, [r2]
-+ vld1.8 {d14}, [r2]
-+ add r2, r2, #6
-+ vld1.8 {d16}, [r2]
-+ add r2, r2, #4
-+ vld1.8 {d18}, [r2]
-+ vld1.8 {d20}, [r2]
-+ add r2, r2, #6
-+ vld1.8 {d22}, [r2]
-+ add r2, r2, #2
-+ vld1.8 {d24}, [r2]
-+ vld1.8 {d26}, [r2]
-+ vshr.u64 q5, q5, #26
-+ vshr.u64 q6, q6, #3
-+ vshr.u64 q7, q7, #29
-+ vshr.u64 q8, q8, #6
-+ vshr.u64 q10, q10, #25
-+ vshr.u64 q11, q11, #3
-+ vshr.u64 q12, q12, #12
-+ vshr.u64 q13, q13, #38
-+ vand q4, q4, q2
-+ vand q6, q6, q2
-+ vand q8, q8, q2
-+ vand q10, q10, q2
-+ vand q2, q12, q2
-+ vand q5, q5, q3
-+ vand q7, q7, q3
-+ vand q9, q9, q3
-+ vand q11, q11, q3
-+ vand q3, q13, q3
-+ add r2, r3, #48
-+ vadd.i64 q12, q4, q1
-+ vadd.i64 q13, q10, q1
-+ vshr.s64 q12, q12, #26
-+ vshr.s64 q13, q13, #26
-+ vadd.i64 q5, q5, q12
-+ vshl.i64 q12, q12, #26
-+ vadd.i64 q14, q5, q0
-+ vadd.i64 q11, q11, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q15, q11, q0
-+ vsub.i64 q4, q4, q12
-+ vshr.s64 q12, q14, #25
-+ vsub.i64 q10, q10, q13
-+ vshr.s64 q13, q15, #25
-+ vadd.i64 q6, q6, q12
-+ vshl.i64 q12, q12, #25
-+ vadd.i64 q14, q6, q1
-+ vadd.i64 q2, q2, q13
-+ vsub.i64 q5, q5, q12
-+ vshr.s64 q12, q14, #26
-+ vshl.i64 q13, q13, #25
-+ vadd.i64 q14, q2, q1
-+ vadd.i64 q7, q7, q12
-+ vshl.i64 q12, q12, #26
-+ vadd.i64 q15, q7, q0
-+ vsub.i64 q11, q11, q13
-+ vshr.s64 q13, q14, #26
-+ vsub.i64 q6, q6, q12
-+ vshr.s64 q12, q15, #25
-+ vadd.i64 q3, q3, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q14, q3, q0
-+ vadd.i64 q8, q8, q12
-+ vshl.i64 q12, q12, #25
-+ vadd.i64 q15, q8, q1
-+ add r2, r2, #8
-+ vsub.i64 q2, q2, q13
-+ vshr.s64 q13, q14, #25
-+ vsub.i64 q7, q7, q12
-+ vshr.s64 q12, q15, #26
-+ vadd.i64 q14, q13, q13
-+ vadd.i64 q9, q9, q12
-+ vtrn.32 d12, d14
-+ vshl.i64 q12, q12, #26
-+ vtrn.32 d13, d15
-+ vadd.i64 q0, q9, q0
-+ vadd.i64 q4, q4, q14
-+ vst1.8 d12, [r2, : 64]!
-+ vshl.i64 q6, q13, #4
-+ vsub.i64 q7, q8, q12
-+ vshr.s64 q0, q0, #25
-+ vadd.i64 q4, q4, q6
-+ vadd.i64 q6, q10, q0
-+ vshl.i64 q0, q0, #25
-+ vadd.i64 q8, q6, q1
-+ vadd.i64 q4, q4, q13
-+ vshl.i64 q10, q13, #25
-+ vadd.i64 q1, q4, q1
-+ vsub.i64 q0, q9, q0
-+ vshr.s64 q8, q8, #26
-+ vsub.i64 q3, q3, q10
-+ vtrn.32 d14, d0
-+ vshr.s64 q1, q1, #26
-+ vtrn.32 d15, d1
-+ vadd.i64 q0, q11, q8
-+ vst1.8 d14, [r2, : 64]
-+ vshl.i64 q7, q8, #26
-+ vadd.i64 q5, q5, q1
-+ vtrn.32 d4, d6
-+ vshl.i64 q1, q1, #26
-+ vtrn.32 d5, d7
-+ vsub.i64 q3, q6, q7
-+ add r2, r2, #16
-+ vsub.i64 q1, q4, q1
-+ vst1.8 d4, [r2, : 64]
-+ vtrn.32 d6, d0
-+ vtrn.32 d7, d1
-+ sub r2, r2, #8
-+ vtrn.32 d2, d10
-+ vtrn.32 d3, d11
-+ vst1.8 d6, [r2, : 64]
-+ sub r2, r2, #24
-+ vst1.8 d2, [r2, : 64]
-+ add r2, r3, #96
-+ vmov.i32 q0, #0
-+ vmov.i64 d2, #0xff
-+ vmov.i64 d3, #0
-+ vshr.u32 q1, q1, #7
-+ vst1.8 {d2-d3}, [r2, : 128]!
-+ vst1.8 {d0-d1}, [r2, : 128]!
-+ vst1.8 d0, [r2, : 64]
-+ add r2, r3, #144
-+ vmov.i32 q0, #0
-+ vst1.8 {d0-d1}, [r2, : 128]!
-+ vst1.8 {d0-d1}, [r2, : 128]!
-+ vst1.8 d0, [r2, : 64]
-+ add r2, r3, #240
-+ vmov.i32 q0, #0
-+ vmov.i64 d2, #0xff
-+ vmov.i64 d3, #0
-+ vshr.u32 q1, q1, #7
-+ vst1.8 {d2-d3}, [r2, : 128]!
-+ vst1.8 {d0-d1}, [r2, : 128]!
-+ vst1.8 d0, [r2, : 64]
-+ add r2, r3, #48
-+ add r6, r3, #192
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d4}, [r2, : 64]
-+ vst1.8 {d0-d1}, [r6, : 128]!
-+ vst1.8 {d2-d3}, [r6, : 128]!
-+ vst1.8 d4, [r6, : 64]
-+._mainloop:
-+ mov r2, r5, LSR #3
-+ and r6, r5, #7
-+ ldrb r2, [r1, r2]
-+ mov r2, r2, LSR r6
-+ and r2, r2, #1
-+ str r5, [sp, #488]
-+ eor r4, r4, r2
-+ str r2, [sp, #492]
-+ neg r2, r4
-+ add r4, r3, #96
-+ add r5, r3, #192
-+ add r6, r3, #144
-+ vld1.8 {d8-d9}, [r4, : 128]!
-+ add r7, r3, #240
-+ vld1.8 {d10-d11}, [r5, : 128]!
-+ veor q6, q4, q5
-+ vld1.8 {d14-d15}, [r6, : 128]!
-+ vdup.i32 q8, r2
-+ vld1.8 {d18-d19}, [r7, : 128]!
-+ veor q10, q7, q9
-+ vld1.8 {d22-d23}, [r4, : 128]!
-+ vand q6, q6, q8
-+ vld1.8 {d24-d25}, [r5, : 128]!
-+ vand q10, q10, q8
-+ vld1.8 {d26-d27}, [r6, : 128]!
-+ veor q4, q4, q6
-+ vld1.8 {d28-d29}, [r7, : 128]!
-+ veor q5, q5, q6
-+ vld1.8 {d0}, [r4, : 64]
-+ veor q6, q7, q10
-+ vld1.8 {d2}, [r5, : 64]
-+ veor q7, q9, q10
-+ vld1.8 {d4}, [r6, : 64]
-+ veor q9, q11, q12
-+ vld1.8 {d6}, [r7, : 64]
-+ veor q10, q0, q1
-+ sub r2, r4, #32
-+ vand q9, q9, q8
-+ sub r4, r5, #32
-+ vand q10, q10, q8
-+ sub r5, r6, #32
-+ veor q11, q11, q9
-+ sub r6, r7, #32
-+ veor q0, q0, q10
-+ veor q9, q12, q9
-+ veor q1, q1, q10
-+ veor q10, q13, q14
-+ veor q12, q2, q3
-+ vand q10, q10, q8
-+ vand q8, q12, q8
-+ veor q12, q13, q10
-+ veor q2, q2, q8
-+ veor q10, q14, q10
-+ veor q3, q3, q8
-+ vadd.i32 q8, q4, q6
-+ vsub.i32 q4, q4, q6
-+ vst1.8 {d16-d17}, [r2, : 128]!
-+ vadd.i32 q6, q11, q12
-+ vst1.8 {d8-d9}, [r5, : 128]!
-+ vsub.i32 q4, q11, q12
-+ vst1.8 {d12-d13}, [r2, : 128]!
-+ vadd.i32 q6, q0, q2
-+ vst1.8 {d8-d9}, [r5, : 128]!
-+ vsub.i32 q0, q0, q2
-+ vst1.8 d12, [r2, : 64]
-+ vadd.i32 q2, q5, q7
-+ vst1.8 d0, [r5, : 64]
-+ vsub.i32 q0, q5, q7
-+ vst1.8 {d4-d5}, [r4, : 128]!
-+ vadd.i32 q2, q9, q10
-+ vst1.8 {d0-d1}, [r6, : 128]!
-+ vsub.i32 q0, q9, q10
-+ vst1.8 {d4-d5}, [r4, : 128]!
-+ vadd.i32 q2, q1, q3
-+ vst1.8 {d0-d1}, [r6, : 128]!
-+ vsub.i32 q0, q1, q3
-+ vst1.8 d4, [r4, : 64]
-+ vst1.8 d0, [r6, : 64]
-+ add r2, sp, #544
-+ add r4, r3, #96
-+ add r5, r3, #144
-+ vld1.8 {d0-d1}, [r2, : 128]
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vld1.8 {d4-d5}, [r5, : 128]!
-+ vzip.i32 q1, q2
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vld1.8 {d8-d9}, [r5, : 128]!
-+ vshl.i32 q5, q1, #1
-+ vzip.i32 q3, q4
-+ vshl.i32 q6, q2, #1
-+ vld1.8 {d14}, [r4, : 64]
-+ vshl.i32 q8, q3, #1
-+ vld1.8 {d15}, [r5, : 64]
-+ vshl.i32 q9, q4, #1
-+ vmul.i32 d21, d7, d1
-+ vtrn.32 d14, d15
-+ vmul.i32 q11, q4, q0
-+ vmul.i32 q0, q7, q0
-+ vmull.s32 q12, d2, d2
-+ vmlal.s32 q12, d11, d1
-+ vmlal.s32 q12, d12, d0
-+ vmlal.s32 q12, d13, d23
-+ vmlal.s32 q12, d16, d22
-+ vmlal.s32 q12, d7, d21
-+ vmull.s32 q10, d2, d11
-+ vmlal.s32 q10, d4, d1
-+ vmlal.s32 q10, d13, d0
-+ vmlal.s32 q10, d6, d23
-+ vmlal.s32 q10, d17, d22
-+ vmull.s32 q13, d10, d4
-+ vmlal.s32 q13, d11, d3
-+ vmlal.s32 q13, d13, d1
-+ vmlal.s32 q13, d16, d0
-+ vmlal.s32 q13, d17, d23
-+ vmlal.s32 q13, d8, d22
-+ vmull.s32 q1, d10, d5
-+ vmlal.s32 q1, d11, d4
-+ vmlal.s32 q1, d6, d1
-+ vmlal.s32 q1, d17, d0
-+ vmlal.s32 q1, d8, d23
-+ vmull.s32 q14, d10, d6
-+ vmlal.s32 q14, d11, d13
-+ vmlal.s32 q14, d4, d4
-+ vmlal.s32 q14, d17, d1
-+ vmlal.s32 q14, d18, d0
-+ vmlal.s32 q14, d9, d23
-+ vmull.s32 q11, d10, d7
-+ vmlal.s32 q11, d11, d6
-+ vmlal.s32 q11, d12, d5
-+ vmlal.s32 q11, d8, d1
-+ vmlal.s32 q11, d19, d0
-+ vmull.s32 q15, d10, d8
-+ vmlal.s32 q15, d11, d17
-+ vmlal.s32 q15, d12, d6
-+ vmlal.s32 q15, d13, d5
-+ vmlal.s32 q15, d19, d1
-+ vmlal.s32 q15, d14, d0
-+ vmull.s32 q2, d10, d9
-+ vmlal.s32 q2, d11, d8
-+ vmlal.s32 q2, d12, d7
-+ vmlal.s32 q2, d13, d6
-+ vmlal.s32 q2, d14, d1
-+ vmull.s32 q0, d15, d1
-+ vmlal.s32 q0, d10, d14
-+ vmlal.s32 q0, d11, d19
-+ vmlal.s32 q0, d12, d8
-+ vmlal.s32 q0, d13, d17
-+ vmlal.s32 q0, d6, d6
-+ add r2, sp, #512
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmull.s32 q3, d16, d7
-+ vmlal.s32 q3, d10, d15
-+ vmlal.s32 q3, d11, d14
-+ vmlal.s32 q3, d12, d9
-+ vmlal.s32 q3, d13, d8
-+ add r2, sp, #528
-+ vld1.8 {d8-d9}, [r2, : 128]
-+ vadd.i64 q5, q12, q9
-+ vadd.i64 q6, q15, q9
-+ vshr.s64 q5, q5, #26
-+ vshr.s64 q6, q6, #26
-+ vadd.i64 q7, q10, q5
-+ vshl.i64 q5, q5, #26
-+ vadd.i64 q8, q7, q4
-+ vadd.i64 q2, q2, q6
-+ vshl.i64 q6, q6, #26
-+ vadd.i64 q10, q2, q4
-+ vsub.i64 q5, q12, q5
-+ vshr.s64 q8, q8, #25
-+ vsub.i64 q6, q15, q6
-+ vshr.s64 q10, q10, #25
-+ vadd.i64 q12, q13, q8
-+ vshl.i64 q8, q8, #25
-+ vadd.i64 q13, q12, q9
-+ vadd.i64 q0, q0, q10
-+ vsub.i64 q7, q7, q8
-+ vshr.s64 q8, q13, #26
-+ vshl.i64 q10, q10, #25
-+ vadd.i64 q13, q0, q9
-+ vadd.i64 q1, q1, q8
-+ vshl.i64 q8, q8, #26
-+ vadd.i64 q15, q1, q4
-+ vsub.i64 q2, q2, q10
-+ vshr.s64 q10, q13, #26
-+ vsub.i64 q8, q12, q8
-+ vshr.s64 q12, q15, #25
-+ vadd.i64 q3, q3, q10
-+ vshl.i64 q10, q10, #26
-+ vadd.i64 q13, q3, q4
-+ vadd.i64 q14, q14, q12
-+ add r2, r3, #288
-+ vshl.i64 q12, q12, #25
-+ add r4, r3, #336
-+ vadd.i64 q15, q14, q9
-+ add r2, r2, #8
-+ vsub.i64 q0, q0, q10
-+ add r4, r4, #8
-+ vshr.s64 q10, q13, #25
-+ vsub.i64 q1, q1, q12
-+ vshr.s64 q12, q15, #26
-+ vadd.i64 q13, q10, q10
-+ vadd.i64 q11, q11, q12
-+ vtrn.32 d16, d2
-+ vshl.i64 q12, q12, #26
-+ vtrn.32 d17, d3
-+ vadd.i64 q1, q11, q4
-+ vadd.i64 q4, q5, q13
-+ vst1.8 d16, [r2, : 64]!
-+ vshl.i64 q5, q10, #4
-+ vst1.8 d17, [r4, : 64]!
-+ vsub.i64 q8, q14, q12
-+ vshr.s64 q1, q1, #25
-+ vadd.i64 q4, q4, q5
-+ vadd.i64 q5, q6, q1
-+ vshl.i64 q1, q1, #25
-+ vadd.i64 q6, q5, q9
-+ vadd.i64 q4, q4, q10
-+ vshl.i64 q10, q10, #25
-+ vadd.i64 q9, q4, q9
-+ vsub.i64 q1, q11, q1
-+ vshr.s64 q6, q6, #26
-+ vsub.i64 q3, q3, q10
-+ vtrn.32 d16, d2
-+ vshr.s64 q9, q9, #26
-+ vtrn.32 d17, d3
-+ vadd.i64 q1, q2, q6
-+ vst1.8 d16, [r2, : 64]
-+ vshl.i64 q2, q6, #26
-+ vst1.8 d17, [r4, : 64]
-+ vadd.i64 q6, q7, q9
-+ vtrn.32 d0, d6
-+ vshl.i64 q7, q9, #26
-+ vtrn.32 d1, d7
-+ vsub.i64 q2, q5, q2
-+ add r2, r2, #16
-+ vsub.i64 q3, q4, q7
-+ vst1.8 d0, [r2, : 64]
-+ add r4, r4, #16
-+ vst1.8 d1, [r4, : 64]
-+ vtrn.32 d4, d2
-+ vtrn.32 d5, d3
-+ sub r2, r2, #8
-+ sub r4, r4, #8
-+ vtrn.32 d6, d12
-+ vtrn.32 d7, d13
-+ vst1.8 d4, [r2, : 64]
-+ vst1.8 d5, [r4, : 64]
-+ sub r2, r2, #24
-+ sub r4, r4, #24
-+ vst1.8 d6, [r2, : 64]
-+ vst1.8 d7, [r4, : 64]
-+ add r2, r3, #240
-+ add r4, r3, #96
-+ vld1.8 {d0-d1}, [r4, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vld1.8 {d4}, [r4, : 64]
-+ add r4, r3, #144
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vtrn.32 q0, q3
-+ vld1.8 {d8-d9}, [r4, : 128]!
-+ vshl.i32 q5, q0, #4
-+ vtrn.32 q1, q4
-+ vshl.i32 q6, q3, #4
-+ vadd.i32 q5, q5, q0
-+ vadd.i32 q6, q6, q3
-+ vshl.i32 q7, q1, #4
-+ vld1.8 {d5}, [r4, : 64]
-+ vshl.i32 q8, q4, #4
-+ vtrn.32 d4, d5
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d18-d19}, [r2, : 128]!
-+ vshl.i32 q10, q2, #4
-+ vld1.8 {d22-d23}, [r2, : 128]!
-+ vadd.i32 q10, q10, q2
-+ vld1.8 {d24}, [r2, : 64]
-+ vadd.i32 q5, q5, q0
-+ add r2, r3, #192
-+ vld1.8 {d26-d27}, [r2, : 128]!
-+ vadd.i32 q6, q6, q3
-+ vld1.8 {d28-d29}, [r2, : 128]!
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d25}, [r2, : 64]
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 q9, q13
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q5, q5, q0
-+ vtrn.32 q11, q14
-+ vadd.i32 q6, q6, q3
-+ add r2, sp, #560
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 d24, d25
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q6, q13, #1
-+ add r2, sp, #576
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vshl.i32 q10, q14, #1
-+ add r2, sp, #592
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q15, q12, #1
-+ vadd.i32 q8, q8, q4
-+ vext.32 d10, d31, d30, #0
-+ vadd.i32 q7, q7, q1
-+ add r2, sp, #608
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q8, d18, d5
-+ vmlal.s32 q8, d26, d4
-+ vmlal.s32 q8, d19, d9
-+ vmlal.s32 q8, d27, d3
-+ vmlal.s32 q8, d22, d8
-+ vmlal.s32 q8, d28, d2
-+ vmlal.s32 q8, d23, d7
-+ vmlal.s32 q8, d29, d1
-+ vmlal.s32 q8, d24, d6
-+ vmlal.s32 q8, d25, d0
-+ add r2, sp, #624
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q2, d18, d4
-+ vmlal.s32 q2, d12, d9
-+ vmlal.s32 q2, d13, d8
-+ vmlal.s32 q2, d19, d3
-+ vmlal.s32 q2, d22, d2
-+ vmlal.s32 q2, d23, d1
-+ vmlal.s32 q2, d24, d0
-+ add r2, sp, #640
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vmull.s32 q7, d18, d9
-+ vmlal.s32 q7, d26, d3
-+ vmlal.s32 q7, d19, d8
-+ vmlal.s32 q7, d27, d2
-+ vmlal.s32 q7, d22, d7
-+ vmlal.s32 q7, d28, d1
-+ vmlal.s32 q7, d23, d6
-+ vmlal.s32 q7, d29, d0
-+ add r2, sp, #656
-+ vst1.8 {d10-d11}, [r2, : 128]
-+ vmull.s32 q5, d18, d3
-+ vmlal.s32 q5, d19, d2
-+ vmlal.s32 q5, d22, d1
-+ vmlal.s32 q5, d23, d0
-+ vmlal.s32 q5, d12, d8
-+ add r2, sp, #672
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q4, d18, d8
-+ vmlal.s32 q4, d26, d2
-+ vmlal.s32 q4, d19, d7
-+ vmlal.s32 q4, d27, d1
-+ vmlal.s32 q4, d22, d6
-+ vmlal.s32 q4, d28, d0
-+ vmull.s32 q8, d18, d7
-+ vmlal.s32 q8, d26, d1
-+ vmlal.s32 q8, d19, d6
-+ vmlal.s32 q8, d27, d0
-+ add r2, sp, #576
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q7, d24, d21
-+ vmlal.s32 q7, d25, d20
-+ vmlal.s32 q4, d23, d21
-+ vmlal.s32 q4, d29, d20
-+ vmlal.s32 q8, d22, d21
-+ vmlal.s32 q8, d28, d20
-+ vmlal.s32 q5, d24, d20
-+ add r2, sp, #576
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q7, d18, d6
-+ vmlal.s32 q7, d26, d0
-+ add r2, sp, #656
-+ vld1.8 {d30-d31}, [r2, : 128]
-+ vmlal.s32 q2, d30, d21
-+ vmlal.s32 q7, d19, d21
-+ vmlal.s32 q7, d27, d20
-+ add r2, sp, #624
-+ vld1.8 {d26-d27}, [r2, : 128]
-+ vmlal.s32 q4, d25, d27
-+ vmlal.s32 q8, d29, d27
-+ vmlal.s32 q8, d25, d26
-+ vmlal.s32 q7, d28, d27
-+ vmlal.s32 q7, d29, d26
-+ add r2, sp, #608
-+ vld1.8 {d28-d29}, [r2, : 128]
-+ vmlal.s32 q4, d24, d29
-+ vmlal.s32 q8, d23, d29
-+ vmlal.s32 q8, d24, d28
-+ vmlal.s32 q7, d22, d29
-+ vmlal.s32 q7, d23, d28
-+ add r2, sp, #608
-+ vst1.8 {d8-d9}, [r2, : 128]
-+ add r2, sp, #560
-+ vld1.8 {d8-d9}, [r2, : 128]
-+ vmlal.s32 q7, d24, d9
-+ vmlal.s32 q7, d25, d31
-+ vmull.s32 q1, d18, d2
-+ vmlal.s32 q1, d19, d1
-+ vmlal.s32 q1, d22, d0
-+ vmlal.s32 q1, d24, d27
-+ vmlal.s32 q1, d23, d20
-+ vmlal.s32 q1, d12, d7
-+ vmlal.s32 q1, d13, d6
-+ vmull.s32 q6, d18, d1
-+ vmlal.s32 q6, d19, d0
-+ vmlal.s32 q6, d23, d27
-+ vmlal.s32 q6, d22, d20
-+ vmlal.s32 q6, d24, d26
-+ vmull.s32 q0, d18, d0
-+ vmlal.s32 q0, d22, d27
-+ vmlal.s32 q0, d23, d26
-+ vmlal.s32 q0, d24, d31
-+ vmlal.s32 q0, d19, d20
-+ add r2, sp, #640
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q2, d18, d7
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d18, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d18, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d18, d28
-+ vmlal.s32 q0, d19, d9
-+ vmlal.s32 q6, d18, d29
-+ vmlal.s32 q6, d19, d28
-+ add r2, sp, #592
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ add r2, sp, #512
-+ vld1.8 {d22-d23}, [r2, : 128]
-+ vmlal.s32 q5, d19, d7
-+ vmlal.s32 q0, d18, d21
-+ vmlal.s32 q0, d19, d29
-+ vmlal.s32 q6, d18, d6
-+ add r2, sp, #528
-+ vld1.8 {d6-d7}, [r2, : 128]
-+ vmlal.s32 q6, d19, d21
-+ add r2, sp, #576
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q0, d30, d8
-+ add r2, sp, #672
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q5, d30, d29
-+ add r2, sp, #608
-+ vld1.8 {d24-d25}, [r2, : 128]
-+ vmlal.s32 q1, d30, d28
-+ vadd.i64 q13, q0, q11
-+ vadd.i64 q14, q5, q11
-+ vmlal.s32 q6, d30, d9
-+ vshr.s64 q4, q13, #26
-+ vshr.s64 q13, q14, #26
-+ vadd.i64 q7, q7, q4
-+ vshl.i64 q4, q4, #26
-+ vadd.i64 q14, q7, q3
-+ vadd.i64 q9, q9, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q15, q9, q3
-+ vsub.i64 q0, q0, q4
-+ vshr.s64 q4, q14, #25
-+ vsub.i64 q5, q5, q13
-+ vshr.s64 q13, q15, #25
-+ vadd.i64 q6, q6, q4
-+ vshl.i64 q4, q4, #25
-+ vadd.i64 q14, q6, q11
-+ vadd.i64 q2, q2, q13
-+ vsub.i64 q4, q7, q4
-+ vshr.s64 q7, q14, #26
-+ vshl.i64 q13, q13, #25
-+ vadd.i64 q14, q2, q11
-+ vadd.i64 q8, q8, q7
-+ vshl.i64 q7, q7, #26
-+ vadd.i64 q15, q8, q3
-+ vsub.i64 q9, q9, q13
-+ vshr.s64 q13, q14, #26
-+ vsub.i64 q6, q6, q7
-+ vshr.s64 q7, q15, #25
-+ vadd.i64 q10, q10, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q14, q10, q3
-+ vadd.i64 q1, q1, q7
-+ add r2, r3, #144
-+ vshl.i64 q7, q7, #25
-+ add r4, r3, #96
-+ vadd.i64 q15, q1, q11
-+ add r2, r2, #8
-+ vsub.i64 q2, q2, q13
-+ add r4, r4, #8
-+ vshr.s64 q13, q14, #25
-+ vsub.i64 q7, q8, q7
-+ vshr.s64 q8, q15, #26
-+ vadd.i64 q14, q13, q13
-+ vadd.i64 q12, q12, q8
-+ vtrn.32 d12, d14
-+ vshl.i64 q8, q8, #26
-+ vtrn.32 d13, d15
-+ vadd.i64 q3, q12, q3
-+ vadd.i64 q0, q0, q14
-+ vst1.8 d12, [r2, : 64]!
-+ vshl.i64 q7, q13, #4
-+ vst1.8 d13, [r4, : 64]!
-+ vsub.i64 q1, q1, q8
-+ vshr.s64 q3, q3, #25
-+ vadd.i64 q0, q0, q7
-+ vadd.i64 q5, q5, q3
-+ vshl.i64 q3, q3, #25
-+ vadd.i64 q6, q5, q11
-+ vadd.i64 q0, q0, q13
-+ vshl.i64 q7, q13, #25
-+ vadd.i64 q8, q0, q11
-+ vsub.i64 q3, q12, q3
-+ vshr.s64 q6, q6, #26
-+ vsub.i64 q7, q10, q7
-+ vtrn.32 d2, d6
-+ vshr.s64 q8, q8, #26
-+ vtrn.32 d3, d7
-+ vadd.i64 q3, q9, q6
-+ vst1.8 d2, [r2, : 64]
-+ vshl.i64 q6, q6, #26
-+ vst1.8 d3, [r4, : 64]
-+ vadd.i64 q1, q4, q8
-+ vtrn.32 d4, d14
-+ vshl.i64 q4, q8, #26
-+ vtrn.32 d5, d15
-+ vsub.i64 q5, q5, q6
-+ add r2, r2, #16
-+ vsub.i64 q0, q0, q4
-+ vst1.8 d4, [r2, : 64]
-+ add r4, r4, #16
-+ vst1.8 d5, [r4, : 64]
-+ vtrn.32 d10, d6
-+ vtrn.32 d11, d7
-+ sub r2, r2, #8
-+ sub r4, r4, #8
-+ vtrn.32 d0, d2
-+ vtrn.32 d1, d3
-+ vst1.8 d10, [r2, : 64]
-+ vst1.8 d11, [r4, : 64]
-+ sub r2, r2, #24
-+ sub r4, r4, #24
-+ vst1.8 d0, [r2, : 64]
-+ vst1.8 d1, [r4, : 64]
-+ add r2, r3, #288
-+ add r4, r3, #336
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vsub.i32 q0, q0, q1
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d4-d5}, [r4, : 128]!
-+ vsub.i32 q1, q1, q2
-+ add r5, r3, #240
-+ vld1.8 {d4}, [r2, : 64]
-+ vld1.8 {d6}, [r4, : 64]
-+ vsub.i32 q2, q2, q3
-+ vst1.8 {d0-d1}, [r5, : 128]!
-+ vst1.8 {d2-d3}, [r5, : 128]!
-+ vst1.8 d4, [r5, : 64]
-+ add r2, r3, #144
-+ add r4, r3, #96
-+ add r5, r3, #144
-+ add r6, r3, #192
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vsub.i32 q2, q0, q1
-+ vadd.i32 q0, q0, q1
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vsub.i32 q4, q1, q3
-+ vadd.i32 q1, q1, q3
-+ vld1.8 {d6}, [r2, : 64]
-+ vld1.8 {d10}, [r4, : 64]
-+ vsub.i32 q6, q3, q5
-+ vadd.i32 q3, q3, q5
-+ vst1.8 {d4-d5}, [r5, : 128]!
-+ vst1.8 {d0-d1}, [r6, : 128]!
-+ vst1.8 {d8-d9}, [r5, : 128]!
-+ vst1.8 {d2-d3}, [r6, : 128]!
-+ vst1.8 d12, [r5, : 64]
-+ vst1.8 d6, [r6, : 64]
-+ add r2, r3, #0
-+ add r4, r3, #240
-+ vld1.8 {d0-d1}, [r4, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vld1.8 {d4}, [r4, : 64]
-+ add r4, r3, #336
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vtrn.32 q0, q3
-+ vld1.8 {d8-d9}, [r4, : 128]!
-+ vshl.i32 q5, q0, #4
-+ vtrn.32 q1, q4
-+ vshl.i32 q6, q3, #4
-+ vadd.i32 q5, q5, q0
-+ vadd.i32 q6, q6, q3
-+ vshl.i32 q7, q1, #4
-+ vld1.8 {d5}, [r4, : 64]
-+ vshl.i32 q8, q4, #4
-+ vtrn.32 d4, d5
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d18-d19}, [r2, : 128]!
-+ vshl.i32 q10, q2, #4
-+ vld1.8 {d22-d23}, [r2, : 128]!
-+ vadd.i32 q10, q10, q2
-+ vld1.8 {d24}, [r2, : 64]
-+ vadd.i32 q5, q5, q0
-+ add r2, r3, #288
-+ vld1.8 {d26-d27}, [r2, : 128]!
-+ vadd.i32 q6, q6, q3
-+ vld1.8 {d28-d29}, [r2, : 128]!
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d25}, [r2, : 64]
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 q9, q13
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q5, q5, q0
-+ vtrn.32 q11, q14
-+ vadd.i32 q6, q6, q3
-+ add r2, sp, #560
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 d24, d25
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q6, q13, #1
-+ add r2, sp, #576
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vshl.i32 q10, q14, #1
-+ add r2, sp, #592
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q15, q12, #1
-+ vadd.i32 q8, q8, q4
-+ vext.32 d10, d31, d30, #0
-+ vadd.i32 q7, q7, q1
-+ add r2, sp, #608
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q8, d18, d5
-+ vmlal.s32 q8, d26, d4
-+ vmlal.s32 q8, d19, d9
-+ vmlal.s32 q8, d27, d3
-+ vmlal.s32 q8, d22, d8
-+ vmlal.s32 q8, d28, d2
-+ vmlal.s32 q8, d23, d7
-+ vmlal.s32 q8, d29, d1
-+ vmlal.s32 q8, d24, d6
-+ vmlal.s32 q8, d25, d0
-+ add r2, sp, #624
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q2, d18, d4
-+ vmlal.s32 q2, d12, d9
-+ vmlal.s32 q2, d13, d8
-+ vmlal.s32 q2, d19, d3
-+ vmlal.s32 q2, d22, d2
-+ vmlal.s32 q2, d23, d1
-+ vmlal.s32 q2, d24, d0
-+ add r2, sp, #640
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vmull.s32 q7, d18, d9
-+ vmlal.s32 q7, d26, d3
-+ vmlal.s32 q7, d19, d8
-+ vmlal.s32 q7, d27, d2
-+ vmlal.s32 q7, d22, d7
-+ vmlal.s32 q7, d28, d1
-+ vmlal.s32 q7, d23, d6
-+ vmlal.s32 q7, d29, d0
-+ add r2, sp, #656
-+ vst1.8 {d10-d11}, [r2, : 128]
-+ vmull.s32 q5, d18, d3
-+ vmlal.s32 q5, d19, d2
-+ vmlal.s32 q5, d22, d1
-+ vmlal.s32 q5, d23, d0
-+ vmlal.s32 q5, d12, d8
-+ add r2, sp, #672
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q4, d18, d8
-+ vmlal.s32 q4, d26, d2
-+ vmlal.s32 q4, d19, d7
-+ vmlal.s32 q4, d27, d1
-+ vmlal.s32 q4, d22, d6
-+ vmlal.s32 q4, d28, d0
-+ vmull.s32 q8, d18, d7
-+ vmlal.s32 q8, d26, d1
-+ vmlal.s32 q8, d19, d6
-+ vmlal.s32 q8, d27, d0
-+ add r2, sp, #576
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q7, d24, d21
-+ vmlal.s32 q7, d25, d20
-+ vmlal.s32 q4, d23, d21
-+ vmlal.s32 q4, d29, d20
-+ vmlal.s32 q8, d22, d21
-+ vmlal.s32 q8, d28, d20
-+ vmlal.s32 q5, d24, d20
-+ add r2, sp, #576
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q7, d18, d6
-+ vmlal.s32 q7, d26, d0
-+ add r2, sp, #656
-+ vld1.8 {d30-d31}, [r2, : 128]
-+ vmlal.s32 q2, d30, d21
-+ vmlal.s32 q7, d19, d21
-+ vmlal.s32 q7, d27, d20
-+ add r2, sp, #624
-+ vld1.8 {d26-d27}, [r2, : 128]
-+ vmlal.s32 q4, d25, d27
-+ vmlal.s32 q8, d29, d27
-+ vmlal.s32 q8, d25, d26
-+ vmlal.s32 q7, d28, d27
-+ vmlal.s32 q7, d29, d26
-+ add r2, sp, #608
-+ vld1.8 {d28-d29}, [r2, : 128]
-+ vmlal.s32 q4, d24, d29
-+ vmlal.s32 q8, d23, d29
-+ vmlal.s32 q8, d24, d28
-+ vmlal.s32 q7, d22, d29
-+ vmlal.s32 q7, d23, d28
-+ add r2, sp, #608
-+ vst1.8 {d8-d9}, [r2, : 128]
-+ add r2, sp, #560
-+ vld1.8 {d8-d9}, [r2, : 128]
-+ vmlal.s32 q7, d24, d9
-+ vmlal.s32 q7, d25, d31
-+ vmull.s32 q1, d18, d2
-+ vmlal.s32 q1, d19, d1
-+ vmlal.s32 q1, d22, d0
-+ vmlal.s32 q1, d24, d27
-+ vmlal.s32 q1, d23, d20
-+ vmlal.s32 q1, d12, d7
-+ vmlal.s32 q1, d13, d6
-+ vmull.s32 q6, d18, d1
-+ vmlal.s32 q6, d19, d0
-+ vmlal.s32 q6, d23, d27
-+ vmlal.s32 q6, d22, d20
-+ vmlal.s32 q6, d24, d26
-+ vmull.s32 q0, d18, d0
-+ vmlal.s32 q0, d22, d27
-+ vmlal.s32 q0, d23, d26
-+ vmlal.s32 q0, d24, d31
-+ vmlal.s32 q0, d19, d20
-+ add r2, sp, #640
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q2, d18, d7
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d18, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d18, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d18, d28
-+ vmlal.s32 q0, d19, d9
-+ vmlal.s32 q6, d18, d29
-+ vmlal.s32 q6, d19, d28
-+ add r2, sp, #592
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ add r2, sp, #512
-+ vld1.8 {d22-d23}, [r2, : 128]
-+ vmlal.s32 q5, d19, d7
-+ vmlal.s32 q0, d18, d21
-+ vmlal.s32 q0, d19, d29
-+ vmlal.s32 q6, d18, d6
-+ add r2, sp, #528
-+ vld1.8 {d6-d7}, [r2, : 128]
-+ vmlal.s32 q6, d19, d21
-+ add r2, sp, #576
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q0, d30, d8
-+ add r2, sp, #672
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q5, d30, d29
-+ add r2, sp, #608
-+ vld1.8 {d24-d25}, [r2, : 128]
-+ vmlal.s32 q1, d30, d28
-+ vadd.i64 q13, q0, q11
-+ vadd.i64 q14, q5, q11
-+ vmlal.s32 q6, d30, d9
-+ vshr.s64 q4, q13, #26
-+ vshr.s64 q13, q14, #26
-+ vadd.i64 q7, q7, q4
-+ vshl.i64 q4, q4, #26
-+ vadd.i64 q14, q7, q3
-+ vadd.i64 q9, q9, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q15, q9, q3
-+ vsub.i64 q0, q0, q4
-+ vshr.s64 q4, q14, #25
-+ vsub.i64 q5, q5, q13
-+ vshr.s64 q13, q15, #25
-+ vadd.i64 q6, q6, q4
-+ vshl.i64 q4, q4, #25
-+ vadd.i64 q14, q6, q11
-+ vadd.i64 q2, q2, q13
-+ vsub.i64 q4, q7, q4
-+ vshr.s64 q7, q14, #26
-+ vshl.i64 q13, q13, #25
-+ vadd.i64 q14, q2, q11
-+ vadd.i64 q8, q8, q7
-+ vshl.i64 q7, q7, #26
-+ vadd.i64 q15, q8, q3
-+ vsub.i64 q9, q9, q13
-+ vshr.s64 q13, q14, #26
-+ vsub.i64 q6, q6, q7
-+ vshr.s64 q7, q15, #25
-+ vadd.i64 q10, q10, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q14, q10, q3
-+ vadd.i64 q1, q1, q7
-+ add r2, r3, #288
-+ vshl.i64 q7, q7, #25
-+ add r4, r3, #96
-+ vadd.i64 q15, q1, q11
-+ add r2, r2, #8
-+ vsub.i64 q2, q2, q13
-+ add r4, r4, #8
-+ vshr.s64 q13, q14, #25
-+ vsub.i64 q7, q8, q7
-+ vshr.s64 q8, q15, #26
-+ vadd.i64 q14, q13, q13
-+ vadd.i64 q12, q12, q8
-+ vtrn.32 d12, d14
-+ vshl.i64 q8, q8, #26
-+ vtrn.32 d13, d15
-+ vadd.i64 q3, q12, q3
-+ vadd.i64 q0, q0, q14
-+ vst1.8 d12, [r2, : 64]!
-+ vshl.i64 q7, q13, #4
-+ vst1.8 d13, [r4, : 64]!
-+ vsub.i64 q1, q1, q8
-+ vshr.s64 q3, q3, #25
-+ vadd.i64 q0, q0, q7
-+ vadd.i64 q5, q5, q3
-+ vshl.i64 q3, q3, #25
-+ vadd.i64 q6, q5, q11
-+ vadd.i64 q0, q0, q13
-+ vshl.i64 q7, q13, #25
-+ vadd.i64 q8, q0, q11
-+ vsub.i64 q3, q12, q3
-+ vshr.s64 q6, q6, #26
-+ vsub.i64 q7, q10, q7
-+ vtrn.32 d2, d6
-+ vshr.s64 q8, q8, #26
-+ vtrn.32 d3, d7
-+ vadd.i64 q3, q9, q6
-+ vst1.8 d2, [r2, : 64]
-+ vshl.i64 q6, q6, #26
-+ vst1.8 d3, [r4, : 64]
-+ vadd.i64 q1, q4, q8
-+ vtrn.32 d4, d14
-+ vshl.i64 q4, q8, #26
-+ vtrn.32 d5, d15
-+ vsub.i64 q5, q5, q6
-+ add r2, r2, #16
-+ vsub.i64 q0, q0, q4
-+ vst1.8 d4, [r2, : 64]
-+ add r4, r4, #16
-+ vst1.8 d5, [r4, : 64]
-+ vtrn.32 d10, d6
-+ vtrn.32 d11, d7
-+ sub r2, r2, #8
-+ sub r4, r4, #8
-+ vtrn.32 d0, d2
-+ vtrn.32 d1, d3
-+ vst1.8 d10, [r2, : 64]
-+ vst1.8 d11, [r4, : 64]
-+ sub r2, r2, #24
-+ sub r4, r4, #24
-+ vst1.8 d0, [r2, : 64]
-+ vst1.8 d1, [r4, : 64]
-+ add r2, sp, #544
-+ add r4, r3, #144
-+ add r5, r3, #192
-+ vld1.8 {d0-d1}, [r2, : 128]
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vld1.8 {d4-d5}, [r5, : 128]!
-+ vzip.i32 q1, q2
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vld1.8 {d8-d9}, [r5, : 128]!
-+ vshl.i32 q5, q1, #1
-+ vzip.i32 q3, q4
-+ vshl.i32 q6, q2, #1
-+ vld1.8 {d14}, [r4, : 64]
-+ vshl.i32 q8, q3, #1
-+ vld1.8 {d15}, [r5, : 64]
-+ vshl.i32 q9, q4, #1
-+ vmul.i32 d21, d7, d1
-+ vtrn.32 d14, d15
-+ vmul.i32 q11, q4, q0
-+ vmul.i32 q0, q7, q0
-+ vmull.s32 q12, d2, d2
-+ vmlal.s32 q12, d11, d1
-+ vmlal.s32 q12, d12, d0
-+ vmlal.s32 q12, d13, d23
-+ vmlal.s32 q12, d16, d22
-+ vmlal.s32 q12, d7, d21
-+ vmull.s32 q10, d2, d11
-+ vmlal.s32 q10, d4, d1
-+ vmlal.s32 q10, d13, d0
-+ vmlal.s32 q10, d6, d23
-+ vmlal.s32 q10, d17, d22
-+ vmull.s32 q13, d10, d4
-+ vmlal.s32 q13, d11, d3
-+ vmlal.s32 q13, d13, d1
-+ vmlal.s32 q13, d16, d0
-+ vmlal.s32 q13, d17, d23
-+ vmlal.s32 q13, d8, d22
-+ vmull.s32 q1, d10, d5
-+ vmlal.s32 q1, d11, d4
-+ vmlal.s32 q1, d6, d1
-+ vmlal.s32 q1, d17, d0
-+ vmlal.s32 q1, d8, d23
-+ vmull.s32 q14, d10, d6
-+ vmlal.s32 q14, d11, d13
-+ vmlal.s32 q14, d4, d4
-+ vmlal.s32 q14, d17, d1
-+ vmlal.s32 q14, d18, d0
-+ vmlal.s32 q14, d9, d23
-+ vmull.s32 q11, d10, d7
-+ vmlal.s32 q11, d11, d6
-+ vmlal.s32 q11, d12, d5
-+ vmlal.s32 q11, d8, d1
-+ vmlal.s32 q11, d19, d0
-+ vmull.s32 q15, d10, d8
-+ vmlal.s32 q15, d11, d17
-+ vmlal.s32 q15, d12, d6
-+ vmlal.s32 q15, d13, d5
-+ vmlal.s32 q15, d19, d1
-+ vmlal.s32 q15, d14, d0
-+ vmull.s32 q2, d10, d9
-+ vmlal.s32 q2, d11, d8
-+ vmlal.s32 q2, d12, d7
-+ vmlal.s32 q2, d13, d6
-+ vmlal.s32 q2, d14, d1
-+ vmull.s32 q0, d15, d1
-+ vmlal.s32 q0, d10, d14
-+ vmlal.s32 q0, d11, d19
-+ vmlal.s32 q0, d12, d8
-+ vmlal.s32 q0, d13, d17
-+ vmlal.s32 q0, d6, d6
-+ add r2, sp, #512
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmull.s32 q3, d16, d7
-+ vmlal.s32 q3, d10, d15
-+ vmlal.s32 q3, d11, d14
-+ vmlal.s32 q3, d12, d9
-+ vmlal.s32 q3, d13, d8
-+ add r2, sp, #528
-+ vld1.8 {d8-d9}, [r2, : 128]
-+ vadd.i64 q5, q12, q9
-+ vadd.i64 q6, q15, q9
-+ vshr.s64 q5, q5, #26
-+ vshr.s64 q6, q6, #26
-+ vadd.i64 q7, q10, q5
-+ vshl.i64 q5, q5, #26
-+ vadd.i64 q8, q7, q4
-+ vadd.i64 q2, q2, q6
-+ vshl.i64 q6, q6, #26
-+ vadd.i64 q10, q2, q4
-+ vsub.i64 q5, q12, q5
-+ vshr.s64 q8, q8, #25
-+ vsub.i64 q6, q15, q6
-+ vshr.s64 q10, q10, #25
-+ vadd.i64 q12, q13, q8
-+ vshl.i64 q8, q8, #25
-+ vadd.i64 q13, q12, q9
-+ vadd.i64 q0, q0, q10
-+ vsub.i64 q7, q7, q8
-+ vshr.s64 q8, q13, #26
-+ vshl.i64 q10, q10, #25
-+ vadd.i64 q13, q0, q9
-+ vadd.i64 q1, q1, q8
-+ vshl.i64 q8, q8, #26
-+ vadd.i64 q15, q1, q4
-+ vsub.i64 q2, q2, q10
-+ vshr.s64 q10, q13, #26
-+ vsub.i64 q8, q12, q8
-+ vshr.s64 q12, q15, #25
-+ vadd.i64 q3, q3, q10
-+ vshl.i64 q10, q10, #26
-+ vadd.i64 q13, q3, q4
-+ vadd.i64 q14, q14, q12
-+ add r2, r3, #144
-+ vshl.i64 q12, q12, #25
-+ add r4, r3, #192
-+ vadd.i64 q15, q14, q9
-+ add r2, r2, #8
-+ vsub.i64 q0, q0, q10
-+ add r4, r4, #8
-+ vshr.s64 q10, q13, #25
-+ vsub.i64 q1, q1, q12
-+ vshr.s64 q12, q15, #26
-+ vadd.i64 q13, q10, q10
-+ vadd.i64 q11, q11, q12
-+ vtrn.32 d16, d2
-+ vshl.i64 q12, q12, #26
-+ vtrn.32 d17, d3
-+ vadd.i64 q1, q11, q4
-+ vadd.i64 q4, q5, q13
-+ vst1.8 d16, [r2, : 64]!
-+ vshl.i64 q5, q10, #4
-+ vst1.8 d17, [r4, : 64]!
-+ vsub.i64 q8, q14, q12
-+ vshr.s64 q1, q1, #25
-+ vadd.i64 q4, q4, q5
-+ vadd.i64 q5, q6, q1
-+ vshl.i64 q1, q1, #25
-+ vadd.i64 q6, q5, q9
-+ vadd.i64 q4, q4, q10
-+ vshl.i64 q10, q10, #25
-+ vadd.i64 q9, q4, q9
-+ vsub.i64 q1, q11, q1
-+ vshr.s64 q6, q6, #26
-+ vsub.i64 q3, q3, q10
-+ vtrn.32 d16, d2
-+ vshr.s64 q9, q9, #26
-+ vtrn.32 d17, d3
-+ vadd.i64 q1, q2, q6
-+ vst1.8 d16, [r2, : 64]
-+ vshl.i64 q2, q6, #26
-+ vst1.8 d17, [r4, : 64]
-+ vadd.i64 q6, q7, q9
-+ vtrn.32 d0, d6
-+ vshl.i64 q7, q9, #26
-+ vtrn.32 d1, d7
-+ vsub.i64 q2, q5, q2
-+ add r2, r2, #16
-+ vsub.i64 q3, q4, q7
-+ vst1.8 d0, [r2, : 64]
-+ add r4, r4, #16
-+ vst1.8 d1, [r4, : 64]
-+ vtrn.32 d4, d2
-+ vtrn.32 d5, d3
-+ sub r2, r2, #8
-+ sub r4, r4, #8
-+ vtrn.32 d6, d12
-+ vtrn.32 d7, d13
-+ vst1.8 d4, [r2, : 64]
-+ vst1.8 d5, [r4, : 64]
-+ sub r2, r2, #24
-+ sub r4, r4, #24
-+ vst1.8 d6, [r2, : 64]
-+ vst1.8 d7, [r4, : 64]
-+ add r2, r3, #336
-+ add r4, r3, #288
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vadd.i32 q0, q0, q1
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d4-d5}, [r4, : 128]!
-+ vadd.i32 q1, q1, q2
-+ add r5, r3, #288
-+ vld1.8 {d4}, [r2, : 64]
-+ vld1.8 {d6}, [r4, : 64]
-+ vadd.i32 q2, q2, q3
-+ vst1.8 {d0-d1}, [r5, : 128]!
-+ vst1.8 {d2-d3}, [r5, : 128]!
-+ vst1.8 d4, [r5, : 64]
-+ add r2, r3, #48
-+ add r4, r3, #144
-+ vld1.8 {d0-d1}, [r4, : 128]!
-+ vld1.8 {d2-d3}, [r4, : 128]!
-+ vld1.8 {d4}, [r4, : 64]
-+ add r4, r3, #288
-+ vld1.8 {d6-d7}, [r4, : 128]!
-+ vtrn.32 q0, q3
-+ vld1.8 {d8-d9}, [r4, : 128]!
-+ vshl.i32 q5, q0, #4
-+ vtrn.32 q1, q4
-+ vshl.i32 q6, q3, #4
-+ vadd.i32 q5, q5, q0
-+ vadd.i32 q6, q6, q3
-+ vshl.i32 q7, q1, #4
-+ vld1.8 {d5}, [r4, : 64]
-+ vshl.i32 q8, q4, #4
-+ vtrn.32 d4, d5
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d18-d19}, [r2, : 128]!
-+ vshl.i32 q10, q2, #4
-+ vld1.8 {d22-d23}, [r2, : 128]!
-+ vadd.i32 q10, q10, q2
-+ vld1.8 {d24}, [r2, : 64]
-+ vadd.i32 q5, q5, q0
-+ add r2, r3, #240
-+ vld1.8 {d26-d27}, [r2, : 128]!
-+ vadd.i32 q6, q6, q3
-+ vld1.8 {d28-d29}, [r2, : 128]!
-+ vadd.i32 q8, q8, q4
-+ vld1.8 {d25}, [r2, : 64]
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 q9, q13
-+ vadd.i32 q7, q7, q1
-+ vadd.i32 q5, q5, q0
-+ vtrn.32 q11, q14
-+ vadd.i32 q6, q6, q3
-+ add r2, sp, #560
-+ vadd.i32 q10, q10, q2
-+ vtrn.32 d24, d25
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q6, q13, #1
-+ add r2, sp, #576
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vshl.i32 q10, q14, #1
-+ add r2, sp, #592
-+ vst1.8 {d12-d13}, [r2, : 128]
-+ vshl.i32 q15, q12, #1
-+ vadd.i32 q8, q8, q4
-+ vext.32 d10, d31, d30, #0
-+ vadd.i32 q7, q7, q1
-+ add r2, sp, #608
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q8, d18, d5
-+ vmlal.s32 q8, d26, d4
-+ vmlal.s32 q8, d19, d9
-+ vmlal.s32 q8, d27, d3
-+ vmlal.s32 q8, d22, d8
-+ vmlal.s32 q8, d28, d2
-+ vmlal.s32 q8, d23, d7
-+ vmlal.s32 q8, d29, d1
-+ vmlal.s32 q8, d24, d6
-+ vmlal.s32 q8, d25, d0
-+ add r2, sp, #624
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q2, d18, d4
-+ vmlal.s32 q2, d12, d9
-+ vmlal.s32 q2, d13, d8
-+ vmlal.s32 q2, d19, d3
-+ vmlal.s32 q2, d22, d2
-+ vmlal.s32 q2, d23, d1
-+ vmlal.s32 q2, d24, d0
-+ add r2, sp, #640
-+ vst1.8 {d20-d21}, [r2, : 128]
-+ vmull.s32 q7, d18, d9
-+ vmlal.s32 q7, d26, d3
-+ vmlal.s32 q7, d19, d8
-+ vmlal.s32 q7, d27, d2
-+ vmlal.s32 q7, d22, d7
-+ vmlal.s32 q7, d28, d1
-+ vmlal.s32 q7, d23, d6
-+ vmlal.s32 q7, d29, d0
-+ add r2, sp, #656
-+ vst1.8 {d10-d11}, [r2, : 128]
-+ vmull.s32 q5, d18, d3
-+ vmlal.s32 q5, d19, d2
-+ vmlal.s32 q5, d22, d1
-+ vmlal.s32 q5, d23, d0
-+ vmlal.s32 q5, d12, d8
-+ add r2, sp, #672
-+ vst1.8 {d16-d17}, [r2, : 128]
-+ vmull.s32 q4, d18, d8
-+ vmlal.s32 q4, d26, d2
-+ vmlal.s32 q4, d19, d7
-+ vmlal.s32 q4, d27, d1
-+ vmlal.s32 q4, d22, d6
-+ vmlal.s32 q4, d28, d0
-+ vmull.s32 q8, d18, d7
-+ vmlal.s32 q8, d26, d1
-+ vmlal.s32 q8, d19, d6
-+ vmlal.s32 q8, d27, d0
-+ add r2, sp, #576
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q7, d24, d21
-+ vmlal.s32 q7, d25, d20
-+ vmlal.s32 q4, d23, d21
-+ vmlal.s32 q4, d29, d20
-+ vmlal.s32 q8, d22, d21
-+ vmlal.s32 q8, d28, d20
-+ vmlal.s32 q5, d24, d20
-+ add r2, sp, #576
-+ vst1.8 {d14-d15}, [r2, : 128]
-+ vmull.s32 q7, d18, d6
-+ vmlal.s32 q7, d26, d0
-+ add r2, sp, #656
-+ vld1.8 {d30-d31}, [r2, : 128]
-+ vmlal.s32 q2, d30, d21
-+ vmlal.s32 q7, d19, d21
-+ vmlal.s32 q7, d27, d20
-+ add r2, sp, #624
-+ vld1.8 {d26-d27}, [r2, : 128]
-+ vmlal.s32 q4, d25, d27
-+ vmlal.s32 q8, d29, d27
-+ vmlal.s32 q8, d25, d26
-+ vmlal.s32 q7, d28, d27
-+ vmlal.s32 q7, d29, d26
-+ add r2, sp, #608
-+ vld1.8 {d28-d29}, [r2, : 128]
-+ vmlal.s32 q4, d24, d29
-+ vmlal.s32 q8, d23, d29
-+ vmlal.s32 q8, d24, d28
-+ vmlal.s32 q7, d22, d29
-+ vmlal.s32 q7, d23, d28
-+ add r2, sp, #608
-+ vst1.8 {d8-d9}, [r2, : 128]
-+ add r2, sp, #560
-+ vld1.8 {d8-d9}, [r2, : 128]
-+ vmlal.s32 q7, d24, d9
-+ vmlal.s32 q7, d25, d31
-+ vmull.s32 q1, d18, d2
-+ vmlal.s32 q1, d19, d1
-+ vmlal.s32 q1, d22, d0
-+ vmlal.s32 q1, d24, d27
-+ vmlal.s32 q1, d23, d20
-+ vmlal.s32 q1, d12, d7
-+ vmlal.s32 q1, d13, d6
-+ vmull.s32 q6, d18, d1
-+ vmlal.s32 q6, d19, d0
-+ vmlal.s32 q6, d23, d27
-+ vmlal.s32 q6, d22, d20
-+ vmlal.s32 q6, d24, d26
-+ vmull.s32 q0, d18, d0
-+ vmlal.s32 q0, d22, d27
-+ vmlal.s32 q0, d23, d26
-+ vmlal.s32 q0, d24, d31
-+ vmlal.s32 q0, d19, d20
-+ add r2, sp, #640
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q2, d18, d7
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d18, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d18, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d18, d28
-+ vmlal.s32 q0, d19, d9
-+ vmlal.s32 q6, d18, d29
-+ vmlal.s32 q6, d19, d28
-+ add r2, sp, #592
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ add r2, sp, #512
-+ vld1.8 {d22-d23}, [r2, : 128]
-+ vmlal.s32 q5, d19, d7
-+ vmlal.s32 q0, d18, d21
-+ vmlal.s32 q0, d19, d29
-+ vmlal.s32 q6, d18, d6
-+ add r2, sp, #528
-+ vld1.8 {d6-d7}, [r2, : 128]
-+ vmlal.s32 q6, d19, d21
-+ add r2, sp, #576
-+ vld1.8 {d18-d19}, [r2, : 128]
-+ vmlal.s32 q0, d30, d8
-+ add r2, sp, #672
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vmlal.s32 q5, d30, d29
-+ add r2, sp, #608
-+ vld1.8 {d24-d25}, [r2, : 128]
-+ vmlal.s32 q1, d30, d28
-+ vadd.i64 q13, q0, q11
-+ vadd.i64 q14, q5, q11
-+ vmlal.s32 q6, d30, d9
-+ vshr.s64 q4, q13, #26
-+ vshr.s64 q13, q14, #26
-+ vadd.i64 q7, q7, q4
-+ vshl.i64 q4, q4, #26
-+ vadd.i64 q14, q7, q3
-+ vadd.i64 q9, q9, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q15, q9, q3
-+ vsub.i64 q0, q0, q4
-+ vshr.s64 q4, q14, #25
-+ vsub.i64 q5, q5, q13
-+ vshr.s64 q13, q15, #25
-+ vadd.i64 q6, q6, q4
-+ vshl.i64 q4, q4, #25
-+ vadd.i64 q14, q6, q11
-+ vadd.i64 q2, q2, q13
-+ vsub.i64 q4, q7, q4
-+ vshr.s64 q7, q14, #26
-+ vshl.i64 q13, q13, #25
-+ vadd.i64 q14, q2, q11
-+ vadd.i64 q8, q8, q7
-+ vshl.i64 q7, q7, #26
-+ vadd.i64 q15, q8, q3
-+ vsub.i64 q9, q9, q13
-+ vshr.s64 q13, q14, #26
-+ vsub.i64 q6, q6, q7
-+ vshr.s64 q7, q15, #25
-+ vadd.i64 q10, q10, q13
-+ vshl.i64 q13, q13, #26
-+ vadd.i64 q14, q10, q3
-+ vadd.i64 q1, q1, q7
-+ add r2, r3, #240
-+ vshl.i64 q7, q7, #25
-+ add r4, r3, #144
-+ vadd.i64 q15, q1, q11
-+ add r2, r2, #8
-+ vsub.i64 q2, q2, q13
-+ add r4, r4, #8
-+ vshr.s64 q13, q14, #25
-+ vsub.i64 q7, q8, q7
-+ vshr.s64 q8, q15, #26
-+ vadd.i64 q14, q13, q13
-+ vadd.i64 q12, q12, q8
-+ vtrn.32 d12, d14
-+ vshl.i64 q8, q8, #26
-+ vtrn.32 d13, d15
-+ vadd.i64 q3, q12, q3
-+ vadd.i64 q0, q0, q14
-+ vst1.8 d12, [r2, : 64]!
-+ vshl.i64 q7, q13, #4
-+ vst1.8 d13, [r4, : 64]!
-+ vsub.i64 q1, q1, q8
-+ vshr.s64 q3, q3, #25
-+ vadd.i64 q0, q0, q7
-+ vadd.i64 q5, q5, q3
-+ vshl.i64 q3, q3, #25
-+ vadd.i64 q6, q5, q11
-+ vadd.i64 q0, q0, q13
-+ vshl.i64 q7, q13, #25
-+ vadd.i64 q8, q0, q11
-+ vsub.i64 q3, q12, q3
-+ vshr.s64 q6, q6, #26
-+ vsub.i64 q7, q10, q7
-+ vtrn.32 d2, d6
-+ vshr.s64 q8, q8, #26
-+ vtrn.32 d3, d7
-+ vadd.i64 q3, q9, q6
-+ vst1.8 d2, [r2, : 64]
-+ vshl.i64 q6, q6, #26
-+ vst1.8 d3, [r4, : 64]
-+ vadd.i64 q1, q4, q8
-+ vtrn.32 d4, d14
-+ vshl.i64 q4, q8, #26
-+ vtrn.32 d5, d15
-+ vsub.i64 q5, q5, q6
-+ add r2, r2, #16
-+ vsub.i64 q0, q0, q4
-+ vst1.8 d4, [r2, : 64]
-+ add r4, r4, #16
-+ vst1.8 d5, [r4, : 64]
-+ vtrn.32 d10, d6
-+ vtrn.32 d11, d7
-+ sub r2, r2, #8
-+ sub r4, r4, #8
-+ vtrn.32 d0, d2
-+ vtrn.32 d1, d3
-+ vst1.8 d10, [r2, : 64]
-+ vst1.8 d11, [r4, : 64]
-+ sub r2, r2, #24
-+ sub r4, r4, #24
-+ vst1.8 d0, [r2, : 64]
-+ vst1.8 d1, [r4, : 64]
-+ ldr r2, [sp, #488]
-+ ldr r4, [sp, #492]
-+ subs r5, r2, #1
-+ bge ._mainloop
-+ add r1, r3, #144
-+ add r2, r3, #336
-+ vld1.8 {d0-d1}, [r1, : 128]!
-+ vld1.8 {d2-d3}, [r1, : 128]!
-+ vld1.8 {d4}, [r1, : 64]
-+ vst1.8 {d0-d1}, [r2, : 128]!
-+ vst1.8 {d2-d3}, [r2, : 128]!
-+ vst1.8 d4, [r2, : 64]
-+ ldr r1, =0
-+._invertloop:
-+ add r2, r3, #144
-+ ldr r4, =0
-+ ldr r5, =2
-+ cmp r1, #1
-+ ldreq r5, =1
-+ addeq r2, r3, #336
-+ addeq r4, r3, #48
-+ cmp r1, #2
-+ ldreq r5, =1
-+ addeq r2, r3, #48
-+ cmp r1, #3
-+ ldreq r5, =5
-+ addeq r4, r3, #336
-+ cmp r1, #4
-+ ldreq r5, =10
-+ cmp r1, #5
-+ ldreq r5, =20
-+ cmp r1, #6
-+ ldreq r5, =10
-+ addeq r2, r3, #336
-+ addeq r4, r3, #336
-+ cmp r1, #7
-+ ldreq r5, =50
-+ cmp r1, #8
-+ ldreq r5, =100
-+ cmp r1, #9
-+ ldreq r5, =50
-+ addeq r2, r3, #336
-+ cmp r1, #10
-+ ldreq r5, =5
-+ addeq r2, r3, #48
-+ cmp r1, #11
-+ ldreq r5, =0
-+ addeq r2, r3, #96
-+ add r6, r3, #144
-+ add r7, r3, #288
-+ vld1.8 {d0-d1}, [r6, : 128]!
-+ vld1.8 {d2-d3}, [r6, : 128]!
-+ vld1.8 {d4}, [r6, : 64]
-+ vst1.8 {d0-d1}, [r7, : 128]!
-+ vst1.8 {d2-d3}, [r7, : 128]!
-+ vst1.8 d4, [r7, : 64]
-+ cmp r5, #0
-+ beq ._skipsquaringloop
-+._squaringloop:
-+ add r6, r3, #288
-+ add r7, r3, #288
-+ add r8, r3, #288
-+ vmov.i32 q0, #19
-+ vmov.i32 q1, #0
-+ vmov.i32 q2, #1
-+ vzip.i32 q1, q2
-+ vld1.8 {d4-d5}, [r7, : 128]!
-+ vld1.8 {d6-d7}, [r7, : 128]!
-+ vld1.8 {d9}, [r7, : 64]
-+ vld1.8 {d10-d11}, [r6, : 128]!
-+ add r7, sp, #416
-+ vld1.8 {d12-d13}, [r6, : 128]!
-+ vmul.i32 q7, q2, q0
-+ vld1.8 {d8}, [r6, : 64]
-+ vext.32 d17, d11, d10, #1
-+ vmul.i32 q9, q3, q0
-+ vext.32 d16, d10, d8, #1
-+ vshl.u32 q10, q5, q1
-+ vext.32 d22, d14, d4, #1
-+ vext.32 d24, d18, d6, #1
-+ vshl.u32 q13, q6, q1
-+ vshl.u32 d28, d8, d2
-+ vrev64.i32 d22, d22
-+ vmul.i32 d1, d9, d1
-+ vrev64.i32 d24, d24
-+ vext.32 d29, d8, d13, #1
-+ vext.32 d0, d1, d9, #1
-+ vrev64.i32 d0, d0
-+ vext.32 d2, d9, d1, #1
-+ vext.32 d23, d15, d5, #1
-+ vmull.s32 q4, d20, d4
-+ vrev64.i32 d23, d23
-+ vmlal.s32 q4, d21, d1
-+ vrev64.i32 d2, d2
-+ vmlal.s32 q4, d26, d19
-+ vext.32 d3, d5, d15, #1
-+ vmlal.s32 q4, d27, d18
-+ vrev64.i32 d3, d3
-+ vmlal.s32 q4, d28, d15
-+ vext.32 d14, d12, d11, #1
-+ vmull.s32 q5, d16, d23
-+ vext.32 d15, d13, d12, #1
-+ vmlal.s32 q5, d17, d4
-+ vst1.8 d8, [r7, : 64]!
-+ vmlal.s32 q5, d14, d1
-+ vext.32 d12, d9, d8, #0
-+ vmlal.s32 q5, d15, d19
-+ vmov.i64 d13, #0
-+ vmlal.s32 q5, d29, d18
-+ vext.32 d25, d19, d7, #1
-+ vmlal.s32 q6, d20, d5
-+ vrev64.i32 d25, d25
-+ vmlal.s32 q6, d21, d4
-+ vst1.8 d11, [r7, : 64]!
-+ vmlal.s32 q6, d26, d1
-+ vext.32 d9, d10, d10, #0
-+ vmlal.s32 q6, d27, d19
-+ vmov.i64 d8, #0
-+ vmlal.s32 q6, d28, d18
-+ vmlal.s32 q4, d16, d24
-+ vmlal.s32 q4, d17, d5
-+ vmlal.s32 q4, d14, d4
-+ vst1.8 d12, [r7, : 64]!
-+ vmlal.s32 q4, d15, d1
-+ vext.32 d10, d13, d12, #0
-+ vmlal.s32 q4, d29, d19
-+ vmov.i64 d11, #0
-+ vmlal.s32 q5, d20, d6
-+ vmlal.s32 q5, d21, d5
-+ vmlal.s32 q5, d26, d4
-+ vext.32 d13, d8, d8, #0
-+ vmlal.s32 q5, d27, d1
-+ vmov.i64 d12, #0
-+ vmlal.s32 q5, d28, d19
-+ vst1.8 d9, [r7, : 64]!
-+ vmlal.s32 q6, d16, d25
-+ vmlal.s32 q6, d17, d6
-+ vst1.8 d10, [r7, : 64]
-+ vmlal.s32 q6, d14, d5
-+ vext.32 d8, d11, d10, #0
-+ vmlal.s32 q6, d15, d4
-+ vmov.i64 d9, #0
-+ vmlal.s32 q6, d29, d1
-+ vmlal.s32 q4, d20, d7
-+ vmlal.s32 q4, d21, d6
-+ vmlal.s32 q4, d26, d5
-+ vext.32 d11, d12, d12, #0
-+ vmlal.s32 q4, d27, d4
-+ vmov.i64 d10, #0
-+ vmlal.s32 q4, d28, d1
-+ vmlal.s32 q5, d16, d0
-+ sub r6, r7, #32
-+ vmlal.s32 q5, d17, d7
-+ vmlal.s32 q5, d14, d6
-+ vext.32 d30, d9, d8, #0
-+ vmlal.s32 q5, d15, d5
-+ vld1.8 {d31}, [r6, : 64]!
-+ vmlal.s32 q5, d29, d4
-+ vmlal.s32 q15, d20, d0
-+ vext.32 d0, d6, d18, #1
-+ vmlal.s32 q15, d21, d25
-+ vrev64.i32 d0, d0
-+ vmlal.s32 q15, d26, d24
-+ vext.32 d1, d7, d19, #1
-+ vext.32 d7, d10, d10, #0
-+ vmlal.s32 q15, d27, d23
-+ vrev64.i32 d1, d1
-+ vld1.8 {d6}, [r6, : 64]
-+ vmlal.s32 q15, d28, d22
-+ vmlal.s32 q3, d16, d4
-+ add r6, r6, #24
-+ vmlal.s32 q3, d17, d2
-+ vext.32 d4, d31, d30, #0
-+ vmov d17, d11
-+ vmlal.s32 q3, d14, d1
-+ vext.32 d11, d13, d13, #0
-+ vext.32 d13, d30, d30, #0
-+ vmlal.s32 q3, d15, d0
-+ vext.32 d1, d8, d8, #0
-+ vmlal.s32 q3, d29, d3
-+ vld1.8 {d5}, [r6, : 64]
-+ sub r6, r6, #16
-+ vext.32 d10, d6, d6, #0
-+ vmov.i32 q1, #0xffffffff
-+ vshl.i64 q4, q1, #25
-+ add r7, sp, #512
-+ vld1.8 {d14-d15}, [r7, : 128]
-+ vadd.i64 q9, q2, q7
-+ vshl.i64 q1, q1, #26
-+ vshr.s64 q10, q9, #26
-+ vld1.8 {d0}, [r6, : 64]!
-+ vadd.i64 q5, q5, q10
-+ vand q9, q9, q1
-+ vld1.8 {d16}, [r6, : 64]!
-+ add r6, sp, #528
-+ vld1.8 {d20-d21}, [r6, : 128]
-+ vadd.i64 q11, q5, q10
-+ vsub.i64 q2, q2, q9
-+ vshr.s64 q9, q11, #25
-+ vext.32 d12, d5, d4, #0
-+ vand q11, q11, q4
-+ vadd.i64 q0, q0, q9
-+ vmov d19, d7
-+ vadd.i64 q3, q0, q7
-+ vsub.i64 q5, q5, q11
-+ vshr.s64 q11, q3, #26
-+ vext.32 d18, d11, d10, #0
-+ vand q3, q3, q1
-+ vadd.i64 q8, q8, q11
-+ vadd.i64 q11, q8, q10
-+ vsub.i64 q0, q0, q3
-+ vshr.s64 q3, q11, #25
-+ vand q11, q11, q4
-+ vadd.i64 q3, q6, q3
-+ vadd.i64 q6, q3, q7
-+ vsub.i64 q8, q8, q11
-+ vshr.s64 q11, q6, #26
-+ vand q6, q6, q1
-+ vadd.i64 q9, q9, q11
-+ vadd.i64 d25, d19, d21
-+ vsub.i64 q3, q3, q6
-+ vshr.s64 d23, d25, #25
-+ vand q4, q12, q4
-+ vadd.i64 d21, d23, d23
-+ vshl.i64 d25, d23, #4
-+ vadd.i64 d21, d21, d23
-+ vadd.i64 d25, d25, d21
-+ vadd.i64 d4, d4, d25
-+ vzip.i32 q0, q8
-+ vadd.i64 d12, d4, d14
-+ add r6, r8, #8
-+ vst1.8 d0, [r6, : 64]
-+ vsub.i64 d19, d19, d9
-+ add r6, r6, #16
-+ vst1.8 d16, [r6, : 64]
-+ vshr.s64 d22, d12, #26
-+ vand q0, q6, q1
-+ vadd.i64 d10, d10, d22
-+ vzip.i32 q3, q9
-+ vsub.i64 d4, d4, d0
-+ sub r6, r6, #8
-+ vst1.8 d6, [r6, : 64]
-+ add r6, r6, #16
-+ vst1.8 d18, [r6, : 64]
-+ vzip.i32 q2, q5
-+ sub r6, r6, #32
-+ vst1.8 d4, [r6, : 64]
-+ subs r5, r5, #1
-+ bhi ._squaringloop
-+._skipsquaringloop:
-+ mov r2, r2
-+ add r5, r3, #288
-+ add r6, r3, #144
-+ vmov.i32 q0, #19
-+ vmov.i32 q1, #0
-+ vmov.i32 q2, #1
-+ vzip.i32 q1, q2
-+ vld1.8 {d4-d5}, [r5, : 128]!
-+ vld1.8 {d6-d7}, [r5, : 128]!
-+ vld1.8 {d9}, [r5, : 64]
-+ vld1.8 {d10-d11}, [r2, : 128]!
-+ add r5, sp, #416
-+ vld1.8 {d12-d13}, [r2, : 128]!
-+ vmul.i32 q7, q2, q0
-+ vld1.8 {d8}, [r2, : 64]
-+ vext.32 d17, d11, d10, #1
-+ vmul.i32 q9, q3, q0
-+ vext.32 d16, d10, d8, #1
-+ vshl.u32 q10, q5, q1
-+ vext.32 d22, d14, d4, #1
-+ vext.32 d24, d18, d6, #1
-+ vshl.u32 q13, q6, q1
-+ vshl.u32 d28, d8, d2
-+ vrev64.i32 d22, d22
-+ vmul.i32 d1, d9, d1
-+ vrev64.i32 d24, d24
-+ vext.32 d29, d8, d13, #1
-+ vext.32 d0, d1, d9, #1
-+ vrev64.i32 d0, d0
-+ vext.32 d2, d9, d1, #1
-+ vext.32 d23, d15, d5, #1
-+ vmull.s32 q4, d20, d4
-+ vrev64.i32 d23, d23
-+ vmlal.s32 q4, d21, d1
-+ vrev64.i32 d2, d2
-+ vmlal.s32 q4, d26, d19
-+ vext.32 d3, d5, d15, #1
-+ vmlal.s32 q4, d27, d18
-+ vrev64.i32 d3, d3
-+ vmlal.s32 q4, d28, d15
-+ vext.32 d14, d12, d11, #1
-+ vmull.s32 q5, d16, d23
-+ vext.32 d15, d13, d12, #1
-+ vmlal.s32 q5, d17, d4
-+ vst1.8 d8, [r5, : 64]!
-+ vmlal.s32 q5, d14, d1
-+ vext.32 d12, d9, d8, #0
-+ vmlal.s32 q5, d15, d19
-+ vmov.i64 d13, #0
-+ vmlal.s32 q5, d29, d18
-+ vext.32 d25, d19, d7, #1
-+ vmlal.s32 q6, d20, d5
-+ vrev64.i32 d25, d25
-+ vmlal.s32 q6, d21, d4
-+ vst1.8 d11, [r5, : 64]!
-+ vmlal.s32 q6, d26, d1
-+ vext.32 d9, d10, d10, #0
-+ vmlal.s32 q6, d27, d19
-+ vmov.i64 d8, #0
-+ vmlal.s32 q6, d28, d18
-+ vmlal.s32 q4, d16, d24
-+ vmlal.s32 q4, d17, d5
-+ vmlal.s32 q4, d14, d4
-+ vst1.8 d12, [r5, : 64]!
-+ vmlal.s32 q4, d15, d1
-+ vext.32 d10, d13, d12, #0
-+ vmlal.s32 q4, d29, d19
-+ vmov.i64 d11, #0
-+ vmlal.s32 q5, d20, d6
-+ vmlal.s32 q5, d21, d5
-+ vmlal.s32 q5, d26, d4
-+ vext.32 d13, d8, d8, #0
-+ vmlal.s32 q5, d27, d1
-+ vmov.i64 d12, #0
-+ vmlal.s32 q5, d28, d19
-+ vst1.8 d9, [r5, : 64]!
-+ vmlal.s32 q6, d16, d25
-+ vmlal.s32 q6, d17, d6
-+ vst1.8 d10, [r5, : 64]
-+ vmlal.s32 q6, d14, d5
-+ vext.32 d8, d11, d10, #0
-+ vmlal.s32 q6, d15, d4
-+ vmov.i64 d9, #0
-+ vmlal.s32 q6, d29, d1
-+ vmlal.s32 q4, d20, d7
-+ vmlal.s32 q4, d21, d6
-+ vmlal.s32 q4, d26, d5
-+ vext.32 d11, d12, d12, #0
-+ vmlal.s32 q4, d27, d4
-+ vmov.i64 d10, #0
-+ vmlal.s32 q4, d28, d1
-+ vmlal.s32 q5, d16, d0
-+ sub r2, r5, #32
-+ vmlal.s32 q5, d17, d7
-+ vmlal.s32 q5, d14, d6
-+ vext.32 d30, d9, d8, #0
-+ vmlal.s32 q5, d15, d5
-+ vld1.8 {d31}, [r2, : 64]!
-+ vmlal.s32 q5, d29, d4
-+ vmlal.s32 q15, d20, d0
-+ vext.32 d0, d6, d18, #1
-+ vmlal.s32 q15, d21, d25
-+ vrev64.i32 d0, d0
-+ vmlal.s32 q15, d26, d24
-+ vext.32 d1, d7, d19, #1
-+ vext.32 d7, d10, d10, #0
-+ vmlal.s32 q15, d27, d23
-+ vrev64.i32 d1, d1
-+ vld1.8 {d6}, [r2, : 64]
-+ vmlal.s32 q15, d28, d22
-+ vmlal.s32 q3, d16, d4
-+ add r2, r2, #24
-+ vmlal.s32 q3, d17, d2
-+ vext.32 d4, d31, d30, #0
-+ vmov d17, d11
-+ vmlal.s32 q3, d14, d1
-+ vext.32 d11, d13, d13, #0
-+ vext.32 d13, d30, d30, #0
-+ vmlal.s32 q3, d15, d0
-+ vext.32 d1, d8, d8, #0
-+ vmlal.s32 q3, d29, d3
-+ vld1.8 {d5}, [r2, : 64]
-+ sub r2, r2, #16
-+ vext.32 d10, d6, d6, #0
-+ vmov.i32 q1, #0xffffffff
-+ vshl.i64 q4, q1, #25
-+ add r5, sp, #512
-+ vld1.8 {d14-d15}, [r5, : 128]
-+ vadd.i64 q9, q2, q7
-+ vshl.i64 q1, q1, #26
-+ vshr.s64 q10, q9, #26
-+ vld1.8 {d0}, [r2, : 64]!
-+ vadd.i64 q5, q5, q10
-+ vand q9, q9, q1
-+ vld1.8 {d16}, [r2, : 64]!
-+ add r2, sp, #528
-+ vld1.8 {d20-d21}, [r2, : 128]
-+ vadd.i64 q11, q5, q10
-+ vsub.i64 q2, q2, q9
-+ vshr.s64 q9, q11, #25
-+ vext.32 d12, d5, d4, #0
-+ vand q11, q11, q4
-+ vadd.i64 q0, q0, q9
-+ vmov d19, d7
-+ vadd.i64 q3, q0, q7
-+ vsub.i64 q5, q5, q11
-+ vshr.s64 q11, q3, #26
-+ vext.32 d18, d11, d10, #0
-+ vand q3, q3, q1
-+ vadd.i64 q8, q8, q11
-+ vadd.i64 q11, q8, q10
-+ vsub.i64 q0, q0, q3
-+ vshr.s64 q3, q11, #25
-+ vand q11, q11, q4
-+ vadd.i64 q3, q6, q3
-+ vadd.i64 q6, q3, q7
-+ vsub.i64 q8, q8, q11
-+ vshr.s64 q11, q6, #26
-+ vand q6, q6, q1
-+ vadd.i64 q9, q9, q11
-+ vadd.i64 d25, d19, d21
-+ vsub.i64 q3, q3, q6
-+ vshr.s64 d23, d25, #25
-+ vand q4, q12, q4
-+ vadd.i64 d21, d23, d23
-+ vshl.i64 d25, d23, #4
-+ vadd.i64 d21, d21, d23
-+ vadd.i64 d25, d25, d21
-+ vadd.i64 d4, d4, d25
-+ vzip.i32 q0, q8
-+ vadd.i64 d12, d4, d14
-+ add r2, r6, #8
-+ vst1.8 d0, [r2, : 64]
-+ vsub.i64 d19, d19, d9
-+ add r2, r2, #16
-+ vst1.8 d16, [r2, : 64]
-+ vshr.s64 d22, d12, #26
-+ vand q0, q6, q1
-+ vadd.i64 d10, d10, d22
-+ vzip.i32 q3, q9
-+ vsub.i64 d4, d4, d0
-+ sub r2, r2, #8
-+ vst1.8 d6, [r2, : 64]
-+ add r2, r2, #16
-+ vst1.8 d18, [r2, : 64]
-+ vzip.i32 q2, q5
-+ sub r2, r2, #32
-+ vst1.8 d4, [r2, : 64]
-+ cmp r4, #0
-+ beq ._skippostcopy
-+ add r2, r3, #144
-+ mov r4, r4
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d4}, [r2, : 64]
-+ vst1.8 {d0-d1}, [r4, : 128]!
-+ vst1.8 {d2-d3}, [r4, : 128]!
-+ vst1.8 d4, [r4, : 64]
-+._skippostcopy:
-+ cmp r1, #1
-+ bne ._skipfinalcopy
-+ add r2, r3, #288
-+ add r4, r3, #144
-+ vld1.8 {d0-d1}, [r2, : 128]!
-+ vld1.8 {d2-d3}, [r2, : 128]!
-+ vld1.8 {d4}, [r2, : 64]
-+ vst1.8 {d0-d1}, [r4, : 128]!
-+ vst1.8 {d2-d3}, [r4, : 128]!
-+ vst1.8 d4, [r4, : 64]
-+._skipfinalcopy:
-+ add r1, r1, #1
-+ cmp r1, #12
-+ blo ._invertloop
-+ add r1, r3, #144
-+ ldr r2, [r1], #4
-+ ldr r3, [r1], #4
-+ ldr r4, [r1], #4
-+ ldr r5, [r1], #4
-+ ldr r6, [r1], #4
-+ ldr r7, [r1], #4
-+ ldr r8, [r1], #4
-+ ldr r9, [r1], #4
-+ ldr r10, [r1], #4
-+ ldr r1, [r1]
-+ add r11, r1, r1, LSL #4
-+ add r11, r11, r1, LSL #1
-+ add r11, r11, #16777216
-+ mov r11, r11, ASR #25
-+ add r11, r11, r2
-+ mov r11, r11, ASR #26
-+ add r11, r11, r3
-+ mov r11, r11, ASR #25
-+ add r11, r11, r4
-+ mov r11, r11, ASR #26
-+ add r11, r11, r5
-+ mov r11, r11, ASR #25
-+ add r11, r11, r6
-+ mov r11, r11, ASR #26
-+ add r11, r11, r7
-+ mov r11, r11, ASR #25
-+ add r11, r11, r8
-+ mov r11, r11, ASR #26
-+ add r11, r11, r9
-+ mov r11, r11, ASR #25
-+ add r11, r11, r10
-+ mov r11, r11, ASR #26
-+ add r11, r11, r1
-+ mov r11, r11, ASR #25
-+ add r2, r2, r11
-+ add r2, r2, r11, LSL #1
-+ add r2, r2, r11, LSL #4
-+ mov r11, r2, ASR #26
-+ add r3, r3, r11
-+ sub r2, r2, r11, LSL #26
-+ mov r11, r3, ASR #25
-+ add r4, r4, r11
-+ sub r3, r3, r11, LSL #25
-+ mov r11, r4, ASR #26
-+ add r5, r5, r11
-+ sub r4, r4, r11, LSL #26
-+ mov r11, r5, ASR #25
-+ add r6, r6, r11
-+ sub r5, r5, r11, LSL #25
-+ mov r11, r6, ASR #26
-+ add r7, r7, r11
-+ sub r6, r6, r11, LSL #26
-+ mov r11, r7, ASR #25
-+ add r8, r8, r11
-+ sub r7, r7, r11, LSL #25
-+ mov r11, r8, ASR #26
-+ add r9, r9, r11
-+ sub r8, r8, r11, LSL #26
-+ mov r11, r9, ASR #25
-+ add r10, r10, r11
-+ sub r9, r9, r11, LSL #25
-+ mov r11, r10, ASR #26
-+ add r1, r1, r11
-+ sub r10, r10, r11, LSL #26
-+ mov r11, r1, ASR #25
-+ sub r1, r1, r11, LSL #25
-+ add r2, r2, r3, LSL #26
-+ mov r3, r3, LSR #6
-+ add r3, r3, r4, LSL #19
-+ mov r4, r4, LSR #13
-+ add r4, r4, r5, LSL #13
-+ mov r5, r5, LSR #19
-+ add r5, r5, r6, LSL #6
-+ add r6, r7, r8, LSL #25
-+ mov r7, r8, LSR #7
-+ add r7, r7, r9, LSL #19
-+ mov r8, r9, LSR #13
-+ add r8, r8, r10, LSL #12
-+ mov r9, r10, LSR #20
-+ add r1, r9, r1, LSL #6
-+ str r2, [r0], #4
-+ str r3, [r0], #4
-+ str r4, [r0], #4
-+ str r5, [r0], #4
-+ str r6, [r0], #4
-+ str r7, [r0], #4
-+ str r8, [r0], #4
-+ str r1, [r0]
-+ ldrd r4, [sp, #0]
-+ ldrd r6, [sp, #8]
-+ ldrd r8, [sp, #16]
-+ ldrd r10, [sp, #24]
-+ ldr r12, [sp, #480]
-+ ldr r14, [sp, #484]
-+ ldr r0, =0
-+ mov sp, r12
-+ vpop {q4, q5, q6, q7}
-+ bx lr
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0031-crypto-arm-curve25519-wire-up-NEON-implementation.patch b/target/linux/generic/backport-5.4/080-wireguard-0031-crypto-arm-curve25519-wire-up-NEON-implementation.patch
deleted file mode 100644
index d84726b616..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0031-crypto-arm-curve25519-wire-up-NEON-implementation.patch
+++ /dev/null
@@ -1,1058 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 8 Nov 2019 13:22:38 +0100
-Subject: [PATCH] crypto: arm/curve25519 - wire up NEON implementation
-
-commit d8f1308a025fc7e00414194ed742d5f05a21e13c upstream.
-
-This ports the SUPERCOP implementation for usage in kernel space. In
-addition to the usual header, macro, and style changes required for
-kernel space, it makes a few small changes to the code:
-
- - The stack alignment is relaxed to 16 bytes.
- - Superfluous mov statements have been removed.
- - ldr for constants has been replaced with movw.
- - ldreq has been replaced with moveq.
- - The str epilogue has been made more idiomatic.
- - SIMD registers are not pushed and popped at the beginning and end.
- - The prologue and epilogue have been made idiomatic.
- - A hole has been removed from the stack, saving 32 bytes.
- - We write-back the base register whenever possible for vld1.8.
- - Some multiplications have been reordered for better A7 performance.
-
-There are more opportunities for cleanup, since this code is from qhasm,
-which doesn't always do the most opportune thing. But even prior to
-extensive hand optimizations, this code delivers significant performance
-improvements (given in get_cycles() per call):
-
- ----------- -------------
- | generic C | this commit |
- ------------ ----------- -------------
- | Cortex-A7 | 49136 | 22395 |
- ------------ ----------- -------------
- | Cortex-A17 | 17326 | 4983 |
- ------------ ----------- -------------
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-[ardb: - move to arch/arm/crypto
- - wire into lib/crypto framework
- - implement crypto API KPP hooks ]
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/Kconfig | 6 +
- arch/arm/crypto/Makefile | 2 +
- arch/arm/crypto/curve25519-core.S | 347 +++++++++++++-----------------
- arch/arm/crypto/curve25519-glue.c | 127 +++++++++++
- 4 files changed, 287 insertions(+), 195 deletions(-)
- create mode 100644 arch/arm/crypto/curve25519-glue.c
-
---- a/arch/arm/crypto/Kconfig
-+++ b/arch/arm/crypto/Kconfig
-@@ -141,4 +141,10 @@ config CRYPTO_NHPOLY1305_NEON
- depends on KERNEL_MODE_NEON
- select CRYPTO_NHPOLY1305
-
-+config CRYPTO_CURVE25519_NEON
-+ tristate "NEON accelerated Curve25519 scalar multiplication library"
-+ depends on KERNEL_MODE_NEON
-+ select CRYPTO_LIB_CURVE25519_GENERIC
-+ select CRYPTO_ARCH_HAVE_LIB_CURVE25519
-+
- endif
---- a/arch/arm/crypto/Makefile
-+++ b/arch/arm/crypto/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha51
- obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
- obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
- obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o
-+obj-$(CONFIG_CRYPTO_CURVE25519_NEON) += curve25519-neon.o
-
- ce-obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o
- ce-obj-$(CONFIG_CRYPTO_SHA1_ARM_CE) += sha1-arm-ce.o
-@@ -58,6 +59,7 @@ chacha-neon-y := chacha-scalar-core.o ch
- chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o
- poly1305-arm-y := poly1305-core.o poly1305-glue.o
- nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o
-+curve25519-neon-y := curve25519-core.o curve25519-glue.o
-
- ifdef REGENERATE_ARM_CRYPTO
- quiet_cmd_perl = PERL $@
---- a/arch/arm/crypto/curve25519-core.S
-+++ b/arch/arm/crypto/curve25519-core.S
-@@ -1,43 +1,35 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
- /*
-- * Public domain code from Daniel J. Bernstein and Peter Schwabe, from
-- * SUPERCOP's curve25519/neon2/scalarmult.s.
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
-+ * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
-+ * manually reworked for use in kernel space.
- */
-
--.fpu neon
-+#include <linux/linkage.h>
-+
- .text
-+.fpu neon
-+.arch armv7-a
- .align 4
--.global _crypto_scalarmult_curve25519_neon2
--.global crypto_scalarmult_curve25519_neon2
--.type _crypto_scalarmult_curve25519_neon2 STT_FUNC
--.type crypto_scalarmult_curve25519_neon2 STT_FUNC
-- _crypto_scalarmult_curve25519_neon2:
-- crypto_scalarmult_curve25519_neon2:
-- vpush {q4, q5, q6, q7}
-- mov r12, sp
-- sub sp, sp, #736
-- and sp, sp, #0xffffffe0
-- strd r4, [sp, #0]
-- strd r6, [sp, #8]
-- strd r8, [sp, #16]
-- strd r10, [sp, #24]
-- str r12, [sp, #480]
-- str r14, [sp, #484]
-- mov r0, r0
-- mov r1, r1
-- mov r2, r2
-- add r3, sp, #32
-- ldr r4, =0
-- ldr r5, =254
-+
-+ENTRY(curve25519_neon)
-+ push {r4-r11, lr}
-+ mov ip, sp
-+ sub r3, sp, #704
-+ and r3, r3, #0xfffffff0
-+ mov sp, r3
-+ movw r4, #0
-+ movw r5, #254
- vmov.i32 q0, #1
- vshr.u64 q1, q0, #7
- vshr.u64 q0, q0, #8
- vmov.i32 d4, #19
- vmov.i32 d5, #38
-- add r6, sp, #512
-- vst1.8 {d2-d3}, [r6, : 128]
-- add r6, sp, #528
-- vst1.8 {d0-d1}, [r6, : 128]
-- add r6, sp, #544
-+ add r6, sp, #480
-+ vst1.8 {d2-d3}, [r6, : 128]!
-+ vst1.8 {d0-d1}, [r6, : 128]!
- vst1.8 {d4-d5}, [r6, : 128]
- add r6, r3, #0
- vmov.i32 q2, #0
-@@ -45,12 +37,12 @@
- vst1.8 {d4-d5}, [r6, : 128]!
- vst1.8 d4, [r6, : 64]
- add r6, r3, #0
-- ldr r7, =960
-+ movw r7, #960
- sub r7, r7, #2
- neg r7, r7
- sub r7, r7, r7, LSL #7
- str r7, [r6]
-- add r6, sp, #704
-+ add r6, sp, #672
- vld1.8 {d4-d5}, [r1]!
- vld1.8 {d6-d7}, [r1]
- vst1.8 {d4-d5}, [r6, : 128]!
-@@ -212,15 +204,15 @@
- vst1.8 {d0-d1}, [r6, : 128]!
- vst1.8 {d2-d3}, [r6, : 128]!
- vst1.8 d4, [r6, : 64]
--._mainloop:
-+.Lmainloop:
- mov r2, r5, LSR #3
- and r6, r5, #7
- ldrb r2, [r1, r2]
- mov r2, r2, LSR r6
- and r2, r2, #1
-- str r5, [sp, #488]
-+ str r5, [sp, #456]
- eor r4, r4, r2
-- str r2, [sp, #492]
-+ str r2, [sp, #460]
- neg r2, r4
- add r4, r3, #96
- add r5, r3, #192
-@@ -291,7 +283,7 @@
- vsub.i32 q0, q1, q3
- vst1.8 d4, [r4, : 64]
- vst1.8 d0, [r6, : 64]
-- add r2, sp, #544
-+ add r2, sp, #512
- add r4, r3, #96
- add r5, r3, #144
- vld1.8 {d0-d1}, [r2, : 128]
-@@ -361,14 +353,13 @@
- vmlal.s32 q0, d12, d8
- vmlal.s32 q0, d13, d17
- vmlal.s32 q0, d6, d6
-- add r2, sp, #512
-- vld1.8 {d18-d19}, [r2, : 128]
-+ add r2, sp, #480
-+ vld1.8 {d18-d19}, [r2, : 128]!
- vmull.s32 q3, d16, d7
- vmlal.s32 q3, d10, d15
- vmlal.s32 q3, d11, d14
- vmlal.s32 q3, d12, d9
- vmlal.s32 q3, d13, d8
-- add r2, sp, #528
- vld1.8 {d8-d9}, [r2, : 128]
- vadd.i64 q5, q12, q9
- vadd.i64 q6, q15, q9
-@@ -502,22 +493,19 @@
- vadd.i32 q5, q5, q0
- vtrn.32 q11, q14
- vadd.i32 q6, q6, q3
-- add r2, sp, #560
-+ add r2, sp, #528
- vadd.i32 q10, q10, q2
- vtrn.32 d24, d25
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q6, q13, #1
-- add r2, sp, #576
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vshl.i32 q10, q14, #1
-- add r2, sp, #592
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q15, q12, #1
- vadd.i32 q8, q8, q4
- vext.32 d10, d31, d30, #0
- vadd.i32 q7, q7, q1
-- add r2, sp, #608
-- vst1.8 {d16-d17}, [r2, : 128]
-+ vst1.8 {d16-d17}, [r2, : 128]!
- vmull.s32 q8, d18, d5
- vmlal.s32 q8, d26, d4
- vmlal.s32 q8, d19, d9
-@@ -528,8 +516,7 @@
- vmlal.s32 q8, d29, d1
- vmlal.s32 q8, d24, d6
- vmlal.s32 q8, d25, d0
-- add r2, sp, #624
-- vst1.8 {d14-d15}, [r2, : 128]
-+ vst1.8 {d14-d15}, [r2, : 128]!
- vmull.s32 q2, d18, d4
- vmlal.s32 q2, d12, d9
- vmlal.s32 q2, d13, d8
-@@ -537,8 +524,7 @@
- vmlal.s32 q2, d22, d2
- vmlal.s32 q2, d23, d1
- vmlal.s32 q2, d24, d0
-- add r2, sp, #640
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vmull.s32 q7, d18, d9
- vmlal.s32 q7, d26, d3
- vmlal.s32 q7, d19, d8
-@@ -547,14 +533,12 @@
- vmlal.s32 q7, d28, d1
- vmlal.s32 q7, d23, d6
- vmlal.s32 q7, d29, d0
-- add r2, sp, #656
-- vst1.8 {d10-d11}, [r2, : 128]
-+ vst1.8 {d10-d11}, [r2, : 128]!
- vmull.s32 q5, d18, d3
- vmlal.s32 q5, d19, d2
- vmlal.s32 q5, d22, d1
- vmlal.s32 q5, d23, d0
- vmlal.s32 q5, d12, d8
-- add r2, sp, #672
- vst1.8 {d16-d17}, [r2, : 128]
- vmull.s32 q4, d18, d8
- vmlal.s32 q4, d26, d2
-@@ -566,7 +550,7 @@
- vmlal.s32 q8, d26, d1
- vmlal.s32 q8, d19, d6
- vmlal.s32 q8, d27, d0
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q7, d24, d21
- vmlal.s32 q7, d25, d20
-@@ -575,32 +559,30 @@
- vmlal.s32 q8, d22, d21
- vmlal.s32 q8, d28, d20
- vmlal.s32 q5, d24, d20
-- add r2, sp, #576
- vst1.8 {d14-d15}, [r2, : 128]
- vmull.s32 q7, d18, d6
- vmlal.s32 q7, d26, d0
-- add r2, sp, #656
-+ add r2, sp, #624
- vld1.8 {d30-d31}, [r2, : 128]
- vmlal.s32 q2, d30, d21
- vmlal.s32 q7, d19, d21
- vmlal.s32 q7, d27, d20
-- add r2, sp, #624
-+ add r2, sp, #592
- vld1.8 {d26-d27}, [r2, : 128]
- vmlal.s32 q4, d25, d27
- vmlal.s32 q8, d29, d27
- vmlal.s32 q8, d25, d26
- vmlal.s32 q7, d28, d27
- vmlal.s32 q7, d29, d26
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d28-d29}, [r2, : 128]
- vmlal.s32 q4, d24, d29
- vmlal.s32 q8, d23, d29
- vmlal.s32 q8, d24, d28
- vmlal.s32 q7, d22, d29
- vmlal.s32 q7, d23, d28
-- add r2, sp, #608
- vst1.8 {d8-d9}, [r2, : 128]
-- add r2, sp, #560
-+ add r2, sp, #528
- vld1.8 {d8-d9}, [r2, : 128]
- vmlal.s32 q7, d24, d9
- vmlal.s32 q7, d25, d31
-@@ -621,36 +603,36 @@
- vmlal.s32 q0, d23, d26
- vmlal.s32 q0, d24, d31
- vmlal.s32 q0, d19, d20
-- add r2, sp, #640
-+ add r2, sp, #608
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q2, d18, d7
-- vmlal.s32 q2, d19, d6
- vmlal.s32 q5, d18, d6
-- vmlal.s32 q5, d19, d21
- vmlal.s32 q1, d18, d21
-- vmlal.s32 q1, d19, d29
- vmlal.s32 q0, d18, d28
-- vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d18, d29
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d19, d28
-- add r2, sp, #592
-+ add r2, sp, #560
- vld1.8 {d18-d19}, [r2, : 128]
-- add r2, sp, #512
-+ add r2, sp, #480
- vld1.8 {d22-d23}, [r2, : 128]
- vmlal.s32 q5, d19, d7
- vmlal.s32 q0, d18, d21
- vmlal.s32 q0, d19, d29
- vmlal.s32 q6, d18, d6
-- add r2, sp, #528
-+ add r2, sp, #496
- vld1.8 {d6-d7}, [r2, : 128]
- vmlal.s32 q6, d19, d21
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q0, d30, d8
-- add r2, sp, #672
-+ add r2, sp, #640
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q5, d30, d29
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d24-d25}, [r2, : 128]
- vmlal.s32 q1, d30, d28
- vadd.i64 q13, q0, q11
-@@ -823,22 +805,19 @@
- vadd.i32 q5, q5, q0
- vtrn.32 q11, q14
- vadd.i32 q6, q6, q3
-- add r2, sp, #560
-+ add r2, sp, #528
- vadd.i32 q10, q10, q2
- vtrn.32 d24, d25
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q6, q13, #1
-- add r2, sp, #576
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vshl.i32 q10, q14, #1
-- add r2, sp, #592
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q15, q12, #1
- vadd.i32 q8, q8, q4
- vext.32 d10, d31, d30, #0
- vadd.i32 q7, q7, q1
-- add r2, sp, #608
-- vst1.8 {d16-d17}, [r2, : 128]
-+ vst1.8 {d16-d17}, [r2, : 128]!
- vmull.s32 q8, d18, d5
- vmlal.s32 q8, d26, d4
- vmlal.s32 q8, d19, d9
-@@ -849,8 +828,7 @@
- vmlal.s32 q8, d29, d1
- vmlal.s32 q8, d24, d6
- vmlal.s32 q8, d25, d0
-- add r2, sp, #624
-- vst1.8 {d14-d15}, [r2, : 128]
-+ vst1.8 {d14-d15}, [r2, : 128]!
- vmull.s32 q2, d18, d4
- vmlal.s32 q2, d12, d9
- vmlal.s32 q2, d13, d8
-@@ -858,8 +836,7 @@
- vmlal.s32 q2, d22, d2
- vmlal.s32 q2, d23, d1
- vmlal.s32 q2, d24, d0
-- add r2, sp, #640
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vmull.s32 q7, d18, d9
- vmlal.s32 q7, d26, d3
- vmlal.s32 q7, d19, d8
-@@ -868,15 +845,13 @@
- vmlal.s32 q7, d28, d1
- vmlal.s32 q7, d23, d6
- vmlal.s32 q7, d29, d0
-- add r2, sp, #656
-- vst1.8 {d10-d11}, [r2, : 128]
-+ vst1.8 {d10-d11}, [r2, : 128]!
- vmull.s32 q5, d18, d3
- vmlal.s32 q5, d19, d2
- vmlal.s32 q5, d22, d1
- vmlal.s32 q5, d23, d0
- vmlal.s32 q5, d12, d8
-- add r2, sp, #672
-- vst1.8 {d16-d17}, [r2, : 128]
-+ vst1.8 {d16-d17}, [r2, : 128]!
- vmull.s32 q4, d18, d8
- vmlal.s32 q4, d26, d2
- vmlal.s32 q4, d19, d7
-@@ -887,7 +862,7 @@
- vmlal.s32 q8, d26, d1
- vmlal.s32 q8, d19, d6
- vmlal.s32 q8, d27, d0
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q7, d24, d21
- vmlal.s32 q7, d25, d20
-@@ -896,32 +871,30 @@
- vmlal.s32 q8, d22, d21
- vmlal.s32 q8, d28, d20
- vmlal.s32 q5, d24, d20
-- add r2, sp, #576
- vst1.8 {d14-d15}, [r2, : 128]
- vmull.s32 q7, d18, d6
- vmlal.s32 q7, d26, d0
-- add r2, sp, #656
-+ add r2, sp, #624
- vld1.8 {d30-d31}, [r2, : 128]
- vmlal.s32 q2, d30, d21
- vmlal.s32 q7, d19, d21
- vmlal.s32 q7, d27, d20
-- add r2, sp, #624
-+ add r2, sp, #592
- vld1.8 {d26-d27}, [r2, : 128]
- vmlal.s32 q4, d25, d27
- vmlal.s32 q8, d29, d27
- vmlal.s32 q8, d25, d26
- vmlal.s32 q7, d28, d27
- vmlal.s32 q7, d29, d26
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d28-d29}, [r2, : 128]
- vmlal.s32 q4, d24, d29
- vmlal.s32 q8, d23, d29
- vmlal.s32 q8, d24, d28
- vmlal.s32 q7, d22, d29
- vmlal.s32 q7, d23, d28
-- add r2, sp, #608
- vst1.8 {d8-d9}, [r2, : 128]
-- add r2, sp, #560
-+ add r2, sp, #528
- vld1.8 {d8-d9}, [r2, : 128]
- vmlal.s32 q7, d24, d9
- vmlal.s32 q7, d25, d31
-@@ -942,36 +915,36 @@
- vmlal.s32 q0, d23, d26
- vmlal.s32 q0, d24, d31
- vmlal.s32 q0, d19, d20
-- add r2, sp, #640
-+ add r2, sp, #608
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q2, d18, d7
-- vmlal.s32 q2, d19, d6
- vmlal.s32 q5, d18, d6
-- vmlal.s32 q5, d19, d21
- vmlal.s32 q1, d18, d21
-- vmlal.s32 q1, d19, d29
- vmlal.s32 q0, d18, d28
-- vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d18, d29
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d19, d28
-- add r2, sp, #592
-+ add r2, sp, #560
- vld1.8 {d18-d19}, [r2, : 128]
-- add r2, sp, #512
-+ add r2, sp, #480
- vld1.8 {d22-d23}, [r2, : 128]
- vmlal.s32 q5, d19, d7
- vmlal.s32 q0, d18, d21
- vmlal.s32 q0, d19, d29
- vmlal.s32 q6, d18, d6
-- add r2, sp, #528
-+ add r2, sp, #496
- vld1.8 {d6-d7}, [r2, : 128]
- vmlal.s32 q6, d19, d21
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q0, d30, d8
-- add r2, sp, #672
-+ add r2, sp, #640
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q5, d30, d29
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d24-d25}, [r2, : 128]
- vmlal.s32 q1, d30, d28
- vadd.i64 q13, q0, q11
-@@ -1069,7 +1042,7 @@
- sub r4, r4, #24
- vst1.8 d0, [r2, : 64]
- vst1.8 d1, [r4, : 64]
-- add r2, sp, #544
-+ add r2, sp, #512
- add r4, r3, #144
- add r5, r3, #192
- vld1.8 {d0-d1}, [r2, : 128]
-@@ -1139,14 +1112,13 @@
- vmlal.s32 q0, d12, d8
- vmlal.s32 q0, d13, d17
- vmlal.s32 q0, d6, d6
-- add r2, sp, #512
-- vld1.8 {d18-d19}, [r2, : 128]
-+ add r2, sp, #480
-+ vld1.8 {d18-d19}, [r2, : 128]!
- vmull.s32 q3, d16, d7
- vmlal.s32 q3, d10, d15
- vmlal.s32 q3, d11, d14
- vmlal.s32 q3, d12, d9
- vmlal.s32 q3, d13, d8
-- add r2, sp, #528
- vld1.8 {d8-d9}, [r2, : 128]
- vadd.i64 q5, q12, q9
- vadd.i64 q6, q15, q9
-@@ -1295,22 +1267,19 @@
- vadd.i32 q5, q5, q0
- vtrn.32 q11, q14
- vadd.i32 q6, q6, q3
-- add r2, sp, #560
-+ add r2, sp, #528
- vadd.i32 q10, q10, q2
- vtrn.32 d24, d25
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q6, q13, #1
-- add r2, sp, #576
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vshl.i32 q10, q14, #1
-- add r2, sp, #592
-- vst1.8 {d12-d13}, [r2, : 128]
-+ vst1.8 {d12-d13}, [r2, : 128]!
- vshl.i32 q15, q12, #1
- vadd.i32 q8, q8, q4
- vext.32 d10, d31, d30, #0
- vadd.i32 q7, q7, q1
-- add r2, sp, #608
-- vst1.8 {d16-d17}, [r2, : 128]
-+ vst1.8 {d16-d17}, [r2, : 128]!
- vmull.s32 q8, d18, d5
- vmlal.s32 q8, d26, d4
- vmlal.s32 q8, d19, d9
-@@ -1321,8 +1290,7 @@
- vmlal.s32 q8, d29, d1
- vmlal.s32 q8, d24, d6
- vmlal.s32 q8, d25, d0
-- add r2, sp, #624
-- vst1.8 {d14-d15}, [r2, : 128]
-+ vst1.8 {d14-d15}, [r2, : 128]!
- vmull.s32 q2, d18, d4
- vmlal.s32 q2, d12, d9
- vmlal.s32 q2, d13, d8
-@@ -1330,8 +1298,7 @@
- vmlal.s32 q2, d22, d2
- vmlal.s32 q2, d23, d1
- vmlal.s32 q2, d24, d0
-- add r2, sp, #640
-- vst1.8 {d20-d21}, [r2, : 128]
-+ vst1.8 {d20-d21}, [r2, : 128]!
- vmull.s32 q7, d18, d9
- vmlal.s32 q7, d26, d3
- vmlal.s32 q7, d19, d8
-@@ -1340,15 +1307,13 @@
- vmlal.s32 q7, d28, d1
- vmlal.s32 q7, d23, d6
- vmlal.s32 q7, d29, d0
-- add r2, sp, #656
-- vst1.8 {d10-d11}, [r2, : 128]
-+ vst1.8 {d10-d11}, [r2, : 128]!
- vmull.s32 q5, d18, d3
- vmlal.s32 q5, d19, d2
- vmlal.s32 q5, d22, d1
- vmlal.s32 q5, d23, d0
- vmlal.s32 q5, d12, d8
-- add r2, sp, #672
-- vst1.8 {d16-d17}, [r2, : 128]
-+ vst1.8 {d16-d17}, [r2, : 128]!
- vmull.s32 q4, d18, d8
- vmlal.s32 q4, d26, d2
- vmlal.s32 q4, d19, d7
-@@ -1359,7 +1324,7 @@
- vmlal.s32 q8, d26, d1
- vmlal.s32 q8, d19, d6
- vmlal.s32 q8, d27, d0
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q7, d24, d21
- vmlal.s32 q7, d25, d20
-@@ -1368,32 +1333,30 @@
- vmlal.s32 q8, d22, d21
- vmlal.s32 q8, d28, d20
- vmlal.s32 q5, d24, d20
-- add r2, sp, #576
- vst1.8 {d14-d15}, [r2, : 128]
- vmull.s32 q7, d18, d6
- vmlal.s32 q7, d26, d0
-- add r2, sp, #656
-+ add r2, sp, #624
- vld1.8 {d30-d31}, [r2, : 128]
- vmlal.s32 q2, d30, d21
- vmlal.s32 q7, d19, d21
- vmlal.s32 q7, d27, d20
-- add r2, sp, #624
-+ add r2, sp, #592
- vld1.8 {d26-d27}, [r2, : 128]
- vmlal.s32 q4, d25, d27
- vmlal.s32 q8, d29, d27
- vmlal.s32 q8, d25, d26
- vmlal.s32 q7, d28, d27
- vmlal.s32 q7, d29, d26
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d28-d29}, [r2, : 128]
- vmlal.s32 q4, d24, d29
- vmlal.s32 q8, d23, d29
- vmlal.s32 q8, d24, d28
- vmlal.s32 q7, d22, d29
- vmlal.s32 q7, d23, d28
-- add r2, sp, #608
- vst1.8 {d8-d9}, [r2, : 128]
-- add r2, sp, #560
-+ add r2, sp, #528
- vld1.8 {d8-d9}, [r2, : 128]
- vmlal.s32 q7, d24, d9
- vmlal.s32 q7, d25, d31
-@@ -1414,36 +1377,36 @@
- vmlal.s32 q0, d23, d26
- vmlal.s32 q0, d24, d31
- vmlal.s32 q0, d19, d20
-- add r2, sp, #640
-+ add r2, sp, #608
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q2, d18, d7
-- vmlal.s32 q2, d19, d6
- vmlal.s32 q5, d18, d6
-- vmlal.s32 q5, d19, d21
- vmlal.s32 q1, d18, d21
-- vmlal.s32 q1, d19, d29
- vmlal.s32 q0, d18, d28
-- vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d18, d29
-+ vmlal.s32 q2, d19, d6
-+ vmlal.s32 q5, d19, d21
-+ vmlal.s32 q1, d19, d29
-+ vmlal.s32 q0, d19, d9
- vmlal.s32 q6, d19, d28
-- add r2, sp, #592
-+ add r2, sp, #560
- vld1.8 {d18-d19}, [r2, : 128]
-- add r2, sp, #512
-+ add r2, sp, #480
- vld1.8 {d22-d23}, [r2, : 128]
- vmlal.s32 q5, d19, d7
- vmlal.s32 q0, d18, d21
- vmlal.s32 q0, d19, d29
- vmlal.s32 q6, d18, d6
-- add r2, sp, #528
-+ add r2, sp, #496
- vld1.8 {d6-d7}, [r2, : 128]
- vmlal.s32 q6, d19, d21
-- add r2, sp, #576
-+ add r2, sp, #544
- vld1.8 {d18-d19}, [r2, : 128]
- vmlal.s32 q0, d30, d8
-- add r2, sp, #672
-+ add r2, sp, #640
- vld1.8 {d20-d21}, [r2, : 128]
- vmlal.s32 q5, d30, d29
-- add r2, sp, #608
-+ add r2, sp, #576
- vld1.8 {d24-d25}, [r2, : 128]
- vmlal.s32 q1, d30, d28
- vadd.i64 q13, q0, q11
-@@ -1541,10 +1504,10 @@
- sub r4, r4, #24
- vst1.8 d0, [r2, : 64]
- vst1.8 d1, [r4, : 64]
-- ldr r2, [sp, #488]
-- ldr r4, [sp, #492]
-+ ldr r2, [sp, #456]
-+ ldr r4, [sp, #460]
- subs r5, r2, #1
-- bge ._mainloop
-+ bge .Lmainloop
- add r1, r3, #144
- add r2, r3, #336
- vld1.8 {d0-d1}, [r1, : 128]!
-@@ -1553,41 +1516,41 @@
- vst1.8 {d0-d1}, [r2, : 128]!
- vst1.8 {d2-d3}, [r2, : 128]!
- vst1.8 d4, [r2, : 64]
-- ldr r1, =0
--._invertloop:
-+ movw r1, #0
-+.Linvertloop:
- add r2, r3, #144
-- ldr r4, =0
-- ldr r5, =2
-+ movw r4, #0
-+ movw r5, #2
- cmp r1, #1
-- ldreq r5, =1
-+ moveq r5, #1
- addeq r2, r3, #336
- addeq r4, r3, #48
- cmp r1, #2
-- ldreq r5, =1
-+ moveq r5, #1
- addeq r2, r3, #48
- cmp r1, #3
-- ldreq r5, =5
-+ moveq r5, #5
- addeq r4, r3, #336
- cmp r1, #4
-- ldreq r5, =10
-+ moveq r5, #10
- cmp r1, #5
-- ldreq r5, =20
-+ moveq r5, #20
- cmp r1, #6
-- ldreq r5, =10
-+ moveq r5, #10
- addeq r2, r3, #336
- addeq r4, r3, #336
- cmp r1, #7
-- ldreq r5, =50
-+ moveq r5, #50
- cmp r1, #8
-- ldreq r5, =100
-+ moveq r5, #100
- cmp r1, #9
-- ldreq r5, =50
-+ moveq r5, #50
- addeq r2, r3, #336
- cmp r1, #10
-- ldreq r5, =5
-+ moveq r5, #5
- addeq r2, r3, #48
- cmp r1, #11
-- ldreq r5, =0
-+ moveq r5, #0
- addeq r2, r3, #96
- add r6, r3, #144
- add r7, r3, #288
-@@ -1598,8 +1561,8 @@
- vst1.8 {d2-d3}, [r7, : 128]!
- vst1.8 d4, [r7, : 64]
- cmp r5, #0
-- beq ._skipsquaringloop
--._squaringloop:
-+ beq .Lskipsquaringloop
-+.Lsquaringloop:
- add r6, r3, #288
- add r7, r3, #288
- add r8, r3, #288
-@@ -1611,7 +1574,7 @@
- vld1.8 {d6-d7}, [r7, : 128]!
- vld1.8 {d9}, [r7, : 64]
- vld1.8 {d10-d11}, [r6, : 128]!
-- add r7, sp, #416
-+ add r7, sp, #384
- vld1.8 {d12-d13}, [r6, : 128]!
- vmul.i32 q7, q2, q0
- vld1.8 {d8}, [r6, : 64]
-@@ -1726,7 +1689,7 @@
- vext.32 d10, d6, d6, #0
- vmov.i32 q1, #0xffffffff
- vshl.i64 q4, q1, #25
-- add r7, sp, #512
-+ add r7, sp, #480
- vld1.8 {d14-d15}, [r7, : 128]
- vadd.i64 q9, q2, q7
- vshl.i64 q1, q1, #26
-@@ -1735,7 +1698,7 @@
- vadd.i64 q5, q5, q10
- vand q9, q9, q1
- vld1.8 {d16}, [r6, : 64]!
-- add r6, sp, #528
-+ add r6, sp, #496
- vld1.8 {d20-d21}, [r6, : 128]
- vadd.i64 q11, q5, q10
- vsub.i64 q2, q2, q9
-@@ -1789,8 +1752,8 @@
- sub r6, r6, #32
- vst1.8 d4, [r6, : 64]
- subs r5, r5, #1
-- bhi ._squaringloop
--._skipsquaringloop:
-+ bhi .Lsquaringloop
-+.Lskipsquaringloop:
- mov r2, r2
- add r5, r3, #288
- add r6, r3, #144
-@@ -1802,7 +1765,7 @@
- vld1.8 {d6-d7}, [r5, : 128]!
- vld1.8 {d9}, [r5, : 64]
- vld1.8 {d10-d11}, [r2, : 128]!
-- add r5, sp, #416
-+ add r5, sp, #384
- vld1.8 {d12-d13}, [r2, : 128]!
- vmul.i32 q7, q2, q0
- vld1.8 {d8}, [r2, : 64]
-@@ -1917,7 +1880,7 @@
- vext.32 d10, d6, d6, #0
- vmov.i32 q1, #0xffffffff
- vshl.i64 q4, q1, #25
-- add r5, sp, #512
-+ add r5, sp, #480
- vld1.8 {d14-d15}, [r5, : 128]
- vadd.i64 q9, q2, q7
- vshl.i64 q1, q1, #26
-@@ -1926,7 +1889,7 @@
- vadd.i64 q5, q5, q10
- vand q9, q9, q1
- vld1.8 {d16}, [r2, : 64]!
-- add r2, sp, #528
-+ add r2, sp, #496
- vld1.8 {d20-d21}, [r2, : 128]
- vadd.i64 q11, q5, q10
- vsub.i64 q2, q2, q9
-@@ -1980,7 +1943,7 @@
- sub r2, r2, #32
- vst1.8 d4, [r2, : 64]
- cmp r4, #0
-- beq ._skippostcopy
-+ beq .Lskippostcopy
- add r2, r3, #144
- mov r4, r4
- vld1.8 {d0-d1}, [r2, : 128]!
-@@ -1989,9 +1952,9 @@
- vst1.8 {d0-d1}, [r4, : 128]!
- vst1.8 {d2-d3}, [r4, : 128]!
- vst1.8 d4, [r4, : 64]
--._skippostcopy:
-+.Lskippostcopy:
- cmp r1, #1
-- bne ._skipfinalcopy
-+ bne .Lskipfinalcopy
- add r2, r3, #288
- add r4, r3, #144
- vld1.8 {d0-d1}, [r2, : 128]!
-@@ -2000,10 +1963,10 @@
- vst1.8 {d0-d1}, [r4, : 128]!
- vst1.8 {d2-d3}, [r4, : 128]!
- vst1.8 d4, [r4, : 64]
--._skipfinalcopy:
-+.Lskipfinalcopy:
- add r1, r1, #1
- cmp r1, #12
-- blo ._invertloop
-+ blo .Linvertloop
- add r1, r3, #144
- ldr r2, [r1], #4
- ldr r3, [r1], #4
-@@ -2085,21 +2048,15 @@
- add r8, r8, r10, LSL #12
- mov r9, r10, LSR #20
- add r1, r9, r1, LSL #6
-- str r2, [r0], #4
-- str r3, [r0], #4
-- str r4, [r0], #4
-- str r5, [r0], #4
-- str r6, [r0], #4
-- str r7, [r0], #4
-- str r8, [r0], #4
-- str r1, [r0]
-- ldrd r4, [sp, #0]
-- ldrd r6, [sp, #8]
-- ldrd r8, [sp, #16]
-- ldrd r10, [sp, #24]
-- ldr r12, [sp, #480]
-- ldr r14, [sp, #484]
-- ldr r0, =0
-- mov sp, r12
-- vpop {q4, q5, q6, q7}
-- bx lr
-+ str r2, [r0]
-+ str r3, [r0, #4]
-+ str r4, [r0, #8]
-+ str r5, [r0, #12]
-+ str r6, [r0, #16]
-+ str r7, [r0, #20]
-+ str r8, [r0, #24]
-+ str r1, [r0, #28]
-+ movw r0, #0
-+ mov sp, ip
-+ pop {r4-r11, pc}
-+ENDPROC(curve25519_neon)
---- /dev/null
-+++ b/arch/arm/crypto/curve25519-glue.c
-@@ -0,0 +1,127 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
-+ * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
-+ * manually reworked for use in kernel space.
-+ */
-+
-+#include <asm/hwcap.h>
-+#include <asm/neon.h>
-+#include <asm/simd.h>
-+#include <crypto/internal/kpp.h>
-+#include <crypto/internal/simd.h>
-+#include <linux/types.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/jump_label.h>
-+#include <crypto/curve25519.h>
-+
-+asmlinkage void curve25519_neon(u8 mypublic[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE],
-+ const u8 basepoint[CURVE25519_KEY_SIZE]);
-+
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-+
-+void curve25519_arch(u8 out[CURVE25519_KEY_SIZE],
-+ const u8 scalar[CURVE25519_KEY_SIZE],
-+ const u8 point[CURVE25519_KEY_SIZE])
-+{
-+ if (static_branch_likely(&have_neon) && crypto_simd_usable()) {
-+ kernel_neon_begin();
-+ curve25519_neon(out, scalar, point);
-+ kernel_neon_end();
-+ } else {
-+ curve25519_generic(out, scalar, point);
-+ }
-+}
-+EXPORT_SYMBOL(curve25519_arch);
-+
-+static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
-+ unsigned int len)
-+{
-+ u8 *secret = kpp_tfm_ctx(tfm);
-+
-+ if (!len)
-+ curve25519_generate_secret(secret);
-+ else if (len == CURVE25519_KEY_SIZE &&
-+ crypto_memneq(buf, curve25519_null_point, CURVE25519_KEY_SIZE))
-+ memcpy(secret, buf, CURVE25519_KEY_SIZE);
-+ else
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static int curve25519_compute_value(struct kpp_request *req)
-+{
-+ struct crypto_kpp *tfm = crypto_kpp_reqtfm(req);
-+ const u8 *secret = kpp_tfm_ctx(tfm);
-+ u8 public_key[CURVE25519_KEY_SIZE];
-+ u8 buf[CURVE25519_KEY_SIZE];
-+ int copied, nbytes;
-+ u8 const *bp;
-+
-+ if (req->src) {
-+ copied = sg_copy_to_buffer(req->src,
-+ sg_nents_for_len(req->src,
-+ CURVE25519_KEY_SIZE),
-+ public_key, CURVE25519_KEY_SIZE);
-+ if (copied != CURVE25519_KEY_SIZE)
-+ return -EINVAL;
-+ bp = public_key;
-+ } else {
-+ bp = curve25519_base_point;
-+ }
-+
-+ curve25519_arch(buf, secret, bp);
-+
-+ /* might want less than we've got */
-+ nbytes = min_t(size_t, CURVE25519_KEY_SIZE, req->dst_len);
-+ copied = sg_copy_from_buffer(req->dst, sg_nents_for_len(req->dst,
-+ nbytes),
-+ buf, nbytes);
-+ if (copied != nbytes)
-+ return -EINVAL;
-+ return 0;
-+}
-+
-+static unsigned int curve25519_max_size(struct crypto_kpp *tfm)
-+{
-+ return CURVE25519_KEY_SIZE;
-+}
-+
-+static struct kpp_alg curve25519_alg = {
-+ .base.cra_name = "curve25519",
-+ .base.cra_driver_name = "curve25519-neon",
-+ .base.cra_priority = 200,
-+ .base.cra_module = THIS_MODULE,
-+ .base.cra_ctxsize = CURVE25519_KEY_SIZE,
-+
-+ .set_secret = curve25519_set_secret,
-+ .generate_public_key = curve25519_compute_value,
-+ .compute_shared_secret = curve25519_compute_value,
-+ .max_size = curve25519_max_size,
-+};
-+
-+static int __init mod_init(void)
-+{
-+ if (elf_hwcap & HWCAP_NEON) {
-+ static_branch_enable(&have_neon);
-+ return crypto_register_kpp(&curve25519_alg);
-+ }
-+ return 0;
-+}
-+
-+static void __exit mod_exit(void)
-+{
-+ if (elf_hwcap & HWCAP_NEON)
-+ crypto_unregister_kpp(&curve25519_alg);
-+}
-+
-+module_init(mod_init);
-+module_exit(mod_exit);
-+
-+MODULE_ALIAS_CRYPTO("curve25519");
-+MODULE_ALIAS_CRYPTO("curve25519-neon");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0032-crypto-chacha20poly1305-import-construction-and-self.patch b/target/linux/generic/backport-5.4/080-wireguard-0032-crypto-chacha20poly1305-import-construction-and-self.patch
deleted file mode 100644
index 2d5601d7ac..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0032-crypto-chacha20poly1305-import-construction-and-self.patch
+++ /dev/null
@@ -1,7677 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:39 +0100
-Subject: [PATCH] crypto: chacha20poly1305 - import construction and selftest
- from Zinc
-
-commit ed20078b7e3331e82828be357147af6a3282e4ce upstream.
-
-This incorporates the chacha20poly1305 from the Zinc library, retaining
-the library interface, but replacing the implementation with calls into
-the code that already existed in the kernel's crypto API.
-
-Note that this library API does not implement RFC7539 fully, given that
-it is limited to 64-bit nonces. (The 96-bit nonce version that was part
-of the selftest only has been removed, along with the 96-bit nonce test
-vectors that only tested the selftest but not the actual library itself)
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/chacha20poly1305.h | 37 +
- lib/crypto/Kconfig | 7 +
- lib/crypto/Makefile | 4 +
- lib/crypto/chacha20poly1305-selftest.c | 7348 ++++++++++++++++++++++++
- lib/crypto/chacha20poly1305.c | 219 +
- 5 files changed, 7615 insertions(+)
- create mode 100644 include/crypto/chacha20poly1305.h
- create mode 100644 lib/crypto/chacha20poly1305-selftest.c
- create mode 100644 lib/crypto/chacha20poly1305.c
-
---- /dev/null
-+++ b/include/crypto/chacha20poly1305.h
-@@ -0,0 +1,37 @@
-+/* SPDX-License-Identifier: GPL-2.0 OR MIT */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef __CHACHA20POLY1305_H
-+#define __CHACHA20POLY1305_H
-+
-+#include <linux/types.h>
-+
-+enum chacha20poly1305_lengths {
-+ XCHACHA20POLY1305_NONCE_SIZE = 24,
-+ CHACHA20POLY1305_KEY_SIZE = 32,
-+ CHACHA20POLY1305_AUTHTAG_SIZE = 16
-+};
-+
-+void chacha20poly1305_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
-+bool __must_check
-+chacha20poly1305_decrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len, const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
-+void xchacha20poly1305_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u8 nonce[XCHACHA20POLY1305_NONCE_SIZE],
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
-+bool __must_check xchacha20poly1305_decrypt(
-+ u8 *dst, const u8 *src, const size_t src_len, const u8 *ad,
-+ const size_t ad_len, const u8 nonce[XCHACHA20POLY1305_NONCE_SIZE],
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
-+#endif /* __CHACHA20POLY1305_H */
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -119,5 +119,12 @@ config CRYPTO_LIB_POLY1305
- by either the generic implementation or an arch-specific one, if one
- is available and enabled.
-
-+config CRYPTO_LIB_CHACHA20POLY1305
-+ tristate "ChaCha20-Poly1305 AEAD support (8-byte nonce library version)"
-+ depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
-+ depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
-+ select CRYPTO_LIB_CHACHA
-+ select CRYPTO_LIB_POLY1305
-+
- config CRYPTO_LIB_SHA256
- tristate
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -16,6 +16,9 @@ libblake2s-generic-y += blake2s-gener
- obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o
- libblake2s-y += blake2s.o
-
-+obj-$(CONFIG_CRYPTO_LIB_CHACHA20POLY1305) += libchacha20poly1305.o
-+libchacha20poly1305-y += chacha20poly1305.o
-+
- obj-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += libcurve25519.o
- libcurve25519-y := curve25519-fiat32.o
- libcurve25519-$(CONFIG_ARCH_SUPPORTS_INT128) := curve25519-hacl64.o
-@@ -32,4 +35,5 @@ libsha256-y := sha256.o
-
- ifneq ($(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS),y)
- libblake2s-y += blake2s-selftest.o
-+libchacha20poly1305-y += chacha20poly1305-selftest.o
- endif
---- /dev/null
-+++ b/lib/crypto/chacha20poly1305-selftest.c
-@@ -0,0 +1,7348 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include <crypto/chacha20poly1305.h>
-+#include <crypto/poly1305.h>
-+
-+#include <asm/unaligned.h>
-+#include <linux/bug.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+
-+struct chacha20poly1305_testvec {
-+ const u8 *input, *output, *assoc, *nonce, *key;
-+ size_t ilen, alen, nlen;
-+ bool failure;
-+};
-+
-+/* The first of these are the ChaCha20-Poly1305 AEAD test vectors from RFC7539
-+ * 2.8.2. After they are generated by reference implementations. And the final
-+ * marked ones are taken from wycheproof, but we only do these for the encrypt
-+ * side, because mostly we're stressing the primitives rather than the actual
-+ * chapoly construction.
-+ */
-+
-+static const u8 enc_input001[] __initconst = {
-+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
-+ 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20,
-+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x72, 0x61, 0x66,
-+ 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69,
-+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20,
-+ 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
-+ 0x6f, 0x66, 0x20, 0x73, 0x69, 0x78, 0x20, 0x6d,
-+ 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x20, 0x61, 0x6e,
-+ 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
-+ 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
-+ 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
-+ 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f,
-+ 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x64,
-+ 0x20, 0x62, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65,
-+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x61,
-+ 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e,
-+ 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69,
-+ 0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72,
-+ 0x69, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20,
-+ 0x75, 0x73, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65,
-+ 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61,
-+ 0x66, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x72,
-+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-+ 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
-+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20,
-+ 0x63, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65,
-+ 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
-+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x20,
-+ 0x2f, 0xe2, 0x80, 0x9c, 0x77, 0x6f, 0x72, 0x6b,
-+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67,
-+ 0x72, 0x65, 0x73, 0x73, 0x2e, 0x2f, 0xe2, 0x80,
-+ 0x9d
-+};
-+static const u8 enc_output001[] __initconst = {
-+ 0x64, 0xa0, 0x86, 0x15, 0x75, 0x86, 0x1a, 0xf4,
-+ 0x60, 0xf0, 0x62, 0xc7, 0x9b, 0xe6, 0x43, 0xbd,
-+ 0x5e, 0x80, 0x5c, 0xfd, 0x34, 0x5c, 0xf3, 0x89,
-+ 0xf1, 0x08, 0x67, 0x0a, 0xc7, 0x6c, 0x8c, 0xb2,
-+ 0x4c, 0x6c, 0xfc, 0x18, 0x75, 0x5d, 0x43, 0xee,
-+ 0xa0, 0x9e, 0xe9, 0x4e, 0x38, 0x2d, 0x26, 0xb0,
-+ 0xbd, 0xb7, 0xb7, 0x3c, 0x32, 0x1b, 0x01, 0x00,
-+ 0xd4, 0xf0, 0x3b, 0x7f, 0x35, 0x58, 0x94, 0xcf,
-+ 0x33, 0x2f, 0x83, 0x0e, 0x71, 0x0b, 0x97, 0xce,
-+ 0x98, 0xc8, 0xa8, 0x4a, 0xbd, 0x0b, 0x94, 0x81,
-+ 0x14, 0xad, 0x17, 0x6e, 0x00, 0x8d, 0x33, 0xbd,
-+ 0x60, 0xf9, 0x82, 0xb1, 0xff, 0x37, 0xc8, 0x55,
-+ 0x97, 0x97, 0xa0, 0x6e, 0xf4, 0xf0, 0xef, 0x61,
-+ 0xc1, 0x86, 0x32, 0x4e, 0x2b, 0x35, 0x06, 0x38,
-+ 0x36, 0x06, 0x90, 0x7b, 0x6a, 0x7c, 0x02, 0xb0,
-+ 0xf9, 0xf6, 0x15, 0x7b, 0x53, 0xc8, 0x67, 0xe4,
-+ 0xb9, 0x16, 0x6c, 0x76, 0x7b, 0x80, 0x4d, 0x46,
-+ 0xa5, 0x9b, 0x52, 0x16, 0xcd, 0xe7, 0xa4, 0xe9,
-+ 0x90, 0x40, 0xc5, 0xa4, 0x04, 0x33, 0x22, 0x5e,
-+ 0xe2, 0x82, 0xa1, 0xb0, 0xa0, 0x6c, 0x52, 0x3e,
-+ 0xaf, 0x45, 0x34, 0xd7, 0xf8, 0x3f, 0xa1, 0x15,
-+ 0x5b, 0x00, 0x47, 0x71, 0x8c, 0xbc, 0x54, 0x6a,
-+ 0x0d, 0x07, 0x2b, 0x04, 0xb3, 0x56, 0x4e, 0xea,
-+ 0x1b, 0x42, 0x22, 0x73, 0xf5, 0x48, 0x27, 0x1a,
-+ 0x0b, 0xb2, 0x31, 0x60, 0x53, 0xfa, 0x76, 0x99,
-+ 0x19, 0x55, 0xeb, 0xd6, 0x31, 0x59, 0x43, 0x4e,
-+ 0xce, 0xbb, 0x4e, 0x46, 0x6d, 0xae, 0x5a, 0x10,
-+ 0x73, 0xa6, 0x72, 0x76, 0x27, 0x09, 0x7a, 0x10,
-+ 0x49, 0xe6, 0x17, 0xd9, 0x1d, 0x36, 0x10, 0x94,
-+ 0xfa, 0x68, 0xf0, 0xff, 0x77, 0x98, 0x71, 0x30,
-+ 0x30, 0x5b, 0xea, 0xba, 0x2e, 0xda, 0x04, 0xdf,
-+ 0x99, 0x7b, 0x71, 0x4d, 0x6c, 0x6f, 0x2c, 0x29,
-+ 0xa6, 0xad, 0x5c, 0xb4, 0x02, 0x2b, 0x02, 0x70,
-+ 0x9b, 0xee, 0xad, 0x9d, 0x67, 0x89, 0x0c, 0xbb,
-+ 0x22, 0x39, 0x23, 0x36, 0xfe, 0xa1, 0x85, 0x1f,
-+ 0x38
-+};
-+static const u8 enc_assoc001[] __initconst = {
-+ 0xf3, 0x33, 0x88, 0x86, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x4e, 0x91
-+};
-+static const u8 enc_nonce001[] __initconst = {
-+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
-+};
-+static const u8 enc_key001[] __initconst = {
-+ 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
-+ 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
-+ 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
-+ 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
-+};
-+
-+static const u8 enc_input002[] __initconst = { };
-+static const u8 enc_output002[] __initconst = {
-+ 0xea, 0xe0, 0x1e, 0x9e, 0x2c, 0x91, 0xaa, 0xe1,
-+ 0xdb, 0x5d, 0x99, 0x3f, 0x8a, 0xf7, 0x69, 0x92
-+};
-+static const u8 enc_assoc002[] __initconst = { };
-+static const u8 enc_nonce002[] __initconst = {
-+ 0xca, 0xbf, 0x33, 0x71, 0x32, 0x45, 0x77, 0x8e
-+};
-+static const u8 enc_key002[] __initconst = {
-+ 0x4c, 0xf5, 0x96, 0x83, 0x38, 0xe6, 0xae, 0x7f,
-+ 0x2d, 0x29, 0x25, 0x76, 0xd5, 0x75, 0x27, 0x86,
-+ 0x91, 0x9a, 0x27, 0x7a, 0xfb, 0x46, 0xc5, 0xef,
-+ 0x94, 0x81, 0x79, 0x57, 0x14, 0x59, 0x40, 0x68
-+};
-+
-+static const u8 enc_input003[] __initconst = { };
-+static const u8 enc_output003[] __initconst = {
-+ 0xdd, 0x6b, 0x3b, 0x82, 0xce, 0x5a, 0xbd, 0xd6,
-+ 0xa9, 0x35, 0x83, 0xd8, 0x8c, 0x3d, 0x85, 0x77
-+};
-+static const u8 enc_assoc003[] __initconst = {
-+ 0x33, 0x10, 0x41, 0x12, 0x1f, 0xf3, 0xd2, 0x6b
-+};
-+static const u8 enc_nonce003[] __initconst = {
-+ 0x3d, 0x86, 0xb5, 0x6b, 0xc8, 0xa3, 0x1f, 0x1d
-+};
-+static const u8 enc_key003[] __initconst = {
-+ 0x2d, 0xb0, 0x5d, 0x40, 0xc8, 0xed, 0x44, 0x88,
-+ 0x34, 0xd1, 0x13, 0xaf, 0x57, 0xa1, 0xeb, 0x3a,
-+ 0x2a, 0x80, 0x51, 0x36, 0xec, 0x5b, 0xbc, 0x08,
-+ 0x93, 0x84, 0x21, 0xb5, 0x13, 0x88, 0x3c, 0x0d
-+};
-+
-+static const u8 enc_input004[] __initconst = {
-+ 0xa4
-+};
-+static const u8 enc_output004[] __initconst = {
-+ 0xb7, 0x1b, 0xb0, 0x73, 0x59, 0xb0, 0x84, 0xb2,
-+ 0x6d, 0x8e, 0xab, 0x94, 0x31, 0xa1, 0xae, 0xac,
-+ 0x89
-+};
-+static const u8 enc_assoc004[] __initconst = {
-+ 0x6a, 0xe2, 0xad, 0x3f, 0x88, 0x39, 0x5a, 0x40
-+};
-+static const u8 enc_nonce004[] __initconst = {
-+ 0xd2, 0x32, 0x1f, 0x29, 0x28, 0xc6, 0xc4, 0xc4
-+};
-+static const u8 enc_key004[] __initconst = {
-+ 0x4b, 0x28, 0x4b, 0xa3, 0x7b, 0xbe, 0xe9, 0xf8,
-+ 0x31, 0x80, 0x82, 0xd7, 0xd8, 0xe8, 0xb5, 0xa1,
-+ 0xe2, 0x18, 0x18, 0x8a, 0x9c, 0xfa, 0xa3, 0x3d,
-+ 0x25, 0x71, 0x3e, 0x40, 0xbc, 0x54, 0x7a, 0x3e
-+};
-+
-+static const u8 enc_input005[] __initconst = {
-+ 0x2d
-+};
-+static const u8 enc_output005[] __initconst = {
-+ 0xbf, 0xe1, 0x5b, 0x0b, 0xdb, 0x6b, 0xf5, 0x5e,
-+ 0x6c, 0x5d, 0x84, 0x44, 0x39, 0x81, 0xc1, 0x9c,
-+ 0xac
-+};
-+static const u8 enc_assoc005[] __initconst = { };
-+static const u8 enc_nonce005[] __initconst = {
-+ 0x20, 0x1c, 0xaa, 0x5f, 0x9c, 0xbf, 0x92, 0x30
-+};
-+static const u8 enc_key005[] __initconst = {
-+ 0x66, 0xca, 0x9c, 0x23, 0x2a, 0x4b, 0x4b, 0x31,
-+ 0x0e, 0x92, 0x89, 0x8b, 0xf4, 0x93, 0xc7, 0x87,
-+ 0x98, 0xa3, 0xd8, 0x39, 0xf8, 0xf4, 0xa7, 0x01,
-+ 0xc0, 0x2e, 0x0a, 0xa6, 0x7e, 0x5a, 0x78, 0x87
-+};
-+
-+static const u8 enc_input006[] __initconst = {
-+ 0x33, 0x2f, 0x94, 0xc1, 0xa4, 0xef, 0xcc, 0x2a,
-+ 0x5b, 0xa6, 0xe5, 0x8f, 0x1d, 0x40, 0xf0, 0x92,
-+ 0x3c, 0xd9, 0x24, 0x11, 0xa9, 0x71, 0xf9, 0x37,
-+ 0x14, 0x99, 0xfa, 0xbe, 0xe6, 0x80, 0xde, 0x50,
-+ 0xc9, 0x96, 0xd4, 0xb0, 0xec, 0x9e, 0x17, 0xec,
-+ 0xd2, 0x5e, 0x72, 0x99, 0xfc, 0x0a, 0xe1, 0xcb,
-+ 0x48, 0xd2, 0x85, 0xdd, 0x2f, 0x90, 0xe0, 0x66,
-+ 0x3b, 0xe6, 0x20, 0x74, 0xbe, 0x23, 0x8f, 0xcb,
-+ 0xb4, 0xe4, 0xda, 0x48, 0x40, 0xa6, 0xd1, 0x1b,
-+ 0xc7, 0x42, 0xce, 0x2f, 0x0c, 0xa6, 0x85, 0x6e,
-+ 0x87, 0x37, 0x03, 0xb1, 0x7c, 0x25, 0x96, 0xa3,
-+ 0x05, 0xd8, 0xb0, 0xf4, 0xed, 0xea, 0xc2, 0xf0,
-+ 0x31, 0x98, 0x6c, 0xd1, 0x14, 0x25, 0xc0, 0xcb,
-+ 0x01, 0x74, 0xd0, 0x82, 0xf4, 0x36, 0xf5, 0x41,
-+ 0xd5, 0xdc, 0xca, 0xc5, 0xbb, 0x98, 0xfe, 0xfc,
-+ 0x69, 0x21, 0x70, 0xd8, 0xa4, 0x4b, 0xc8, 0xde,
-+ 0x8f
-+};
-+static const u8 enc_output006[] __initconst = {
-+ 0x8b, 0x06, 0xd3, 0x31, 0xb0, 0x93, 0x45, 0xb1,
-+ 0x75, 0x6e, 0x26, 0xf9, 0x67, 0xbc, 0x90, 0x15,
-+ 0x81, 0x2c, 0xb5, 0xf0, 0xc6, 0x2b, 0xc7, 0x8c,
-+ 0x56, 0xd1, 0xbf, 0x69, 0x6c, 0x07, 0xa0, 0xda,
-+ 0x65, 0x27, 0xc9, 0x90, 0x3d, 0xef, 0x4b, 0x11,
-+ 0x0f, 0x19, 0x07, 0xfd, 0x29, 0x92, 0xd9, 0xc8,
-+ 0xf7, 0x99, 0x2e, 0x4a, 0xd0, 0xb8, 0x2c, 0xdc,
-+ 0x93, 0xf5, 0x9e, 0x33, 0x78, 0xd1, 0x37, 0xc3,
-+ 0x66, 0xd7, 0x5e, 0xbc, 0x44, 0xbf, 0x53, 0xa5,
-+ 0xbc, 0xc4, 0xcb, 0x7b, 0x3a, 0x8e, 0x7f, 0x02,
-+ 0xbd, 0xbb, 0xe7, 0xca, 0xa6, 0x6c, 0x6b, 0x93,
-+ 0x21, 0x93, 0x10, 0x61, 0xe7, 0x69, 0xd0, 0x78,
-+ 0xf3, 0x07, 0x5a, 0x1a, 0x8f, 0x73, 0xaa, 0xb1,
-+ 0x4e, 0xd3, 0xda, 0x4f, 0xf3, 0x32, 0xe1, 0x66,
-+ 0x3e, 0x6c, 0xc6, 0x13, 0xba, 0x06, 0x5b, 0xfc,
-+ 0x6a, 0xe5, 0x6f, 0x60, 0xfb, 0x07, 0x40, 0xb0,
-+ 0x8c, 0x9d, 0x84, 0x43, 0x6b, 0xc1, 0xf7, 0x8d,
-+ 0x8d, 0x31, 0xf7, 0x7a, 0x39, 0x4d, 0x8f, 0x9a,
-+ 0xeb
-+};
-+static const u8 enc_assoc006[] __initconst = {
-+ 0x70, 0xd3, 0x33, 0xf3, 0x8b, 0x18, 0x0b
-+};
-+static const u8 enc_nonce006[] __initconst = {
-+ 0xdf, 0x51, 0x84, 0x82, 0x42, 0x0c, 0x75, 0x9c
-+};
-+static const u8 enc_key006[] __initconst = {
-+ 0x68, 0x7b, 0x8d, 0x8e, 0xe3, 0xc4, 0xdd, 0xae,
-+ 0xdf, 0x72, 0x7f, 0x53, 0x72, 0x25, 0x1e, 0x78,
-+ 0x91, 0xcb, 0x69, 0x76, 0x1f, 0x49, 0x93, 0xf9,
-+ 0x6f, 0x21, 0xcc, 0x39, 0x9c, 0xad, 0xb1, 0x01
-+};
-+
-+static const u8 enc_input007[] __initconst = {
-+ 0x9b, 0x18, 0xdb, 0xdd, 0x9a, 0x0f, 0x3e, 0xa5,
-+ 0x15, 0x17, 0xde, 0xdf, 0x08, 0x9d, 0x65, 0x0a,
-+ 0x67, 0x30, 0x12, 0xe2, 0x34, 0x77, 0x4b, 0xc1,
-+ 0xd9, 0xc6, 0x1f, 0xab, 0xc6, 0x18, 0x50, 0x17,
-+ 0xa7, 0x9d, 0x3c, 0xa6, 0xc5, 0x35, 0x8c, 0x1c,
-+ 0xc0, 0xa1, 0x7c, 0x9f, 0x03, 0x89, 0xca, 0xe1,
-+ 0xe6, 0xe9, 0xd4, 0xd3, 0x88, 0xdb, 0xb4, 0x51,
-+ 0x9d, 0xec, 0xb4, 0xfc, 0x52, 0xee, 0x6d, 0xf1,
-+ 0x75, 0x42, 0xc6, 0xfd, 0xbd, 0x7a, 0x8e, 0x86,
-+ 0xfc, 0x44, 0xb3, 0x4f, 0xf3, 0xea, 0x67, 0x5a,
-+ 0x41, 0x13, 0xba, 0xb0, 0xdc, 0xe1, 0xd3, 0x2a,
-+ 0x7c, 0x22, 0xb3, 0xca, 0xac, 0x6a, 0x37, 0x98,
-+ 0x3e, 0x1d, 0x40, 0x97, 0xf7, 0x9b, 0x1d, 0x36,
-+ 0x6b, 0xb3, 0x28, 0xbd, 0x60, 0x82, 0x47, 0x34,
-+ 0xaa, 0x2f, 0x7d, 0xe9, 0xa8, 0x70, 0x81, 0x57,
-+ 0xd4, 0xb9, 0x77, 0x0a, 0x9d, 0x29, 0xa7, 0x84,
-+ 0x52, 0x4f, 0xc2, 0x4a, 0x40, 0x3b, 0x3c, 0xd4,
-+ 0xc9, 0x2a, 0xdb, 0x4a, 0x53, 0xc4, 0xbe, 0x80,
-+ 0xe9, 0x51, 0x7f, 0x8f, 0xc7, 0xa2, 0xce, 0x82,
-+ 0x5c, 0x91, 0x1e, 0x74, 0xd9, 0xd0, 0xbd, 0xd5,
-+ 0xf3, 0xfd, 0xda, 0x4d, 0x25, 0xb4, 0xbb, 0x2d,
-+ 0xac, 0x2f, 0x3d, 0x71, 0x85, 0x7b, 0xcf, 0x3c,
-+ 0x7b, 0x3e, 0x0e, 0x22, 0x78, 0x0c, 0x29, 0xbf,
-+ 0xe4, 0xf4, 0x57, 0xb3, 0xcb, 0x49, 0xa0, 0xfc,
-+ 0x1e, 0x05, 0x4e, 0x16, 0xbc, 0xd5, 0xa8, 0xa3,
-+ 0xee, 0x05, 0x35, 0xc6, 0x7c, 0xab, 0x60, 0x14,
-+ 0x55, 0x1a, 0x8e, 0xc5, 0x88, 0x5d, 0xd5, 0x81,
-+ 0xc2, 0x81, 0xa5, 0xc4, 0x60, 0xdb, 0xaf, 0x77,
-+ 0x91, 0xe1, 0xce, 0xa2, 0x7e, 0x7f, 0x42, 0xe3,
-+ 0xb0, 0x13, 0x1c, 0x1f, 0x25, 0x60, 0x21, 0xe2,
-+ 0x40, 0x5f, 0x99, 0xb7, 0x73, 0xec, 0x9b, 0x2b,
-+ 0xf0, 0x65, 0x11, 0xc8, 0xd0, 0x0a, 0x9f, 0xd3
-+};
-+static const u8 enc_output007[] __initconst = {
-+ 0x85, 0x04, 0xc2, 0xed, 0x8d, 0xfd, 0x97, 0x5c,
-+ 0xd2, 0xb7, 0xe2, 0xc1, 0x6b, 0xa3, 0xba, 0xf8,
-+ 0xc9, 0x50, 0xc3, 0xc6, 0xa5, 0xe3, 0xa4, 0x7c,
-+ 0xc3, 0x23, 0x49, 0x5e, 0xa9, 0xb9, 0x32, 0xeb,
-+ 0x8a, 0x7c, 0xca, 0xe5, 0xec, 0xfb, 0x7c, 0xc0,
-+ 0xcb, 0x7d, 0xdc, 0x2c, 0x9d, 0x92, 0x55, 0x21,
-+ 0x0a, 0xc8, 0x43, 0x63, 0x59, 0x0a, 0x31, 0x70,
-+ 0x82, 0x67, 0x41, 0x03, 0xf8, 0xdf, 0xf2, 0xac,
-+ 0xa7, 0x02, 0xd4, 0xd5, 0x8a, 0x2d, 0xc8, 0x99,
-+ 0x19, 0x66, 0xd0, 0xf6, 0x88, 0x2c, 0x77, 0xd9,
-+ 0xd4, 0x0d, 0x6c, 0xbd, 0x98, 0xde, 0xe7, 0x7f,
-+ 0xad, 0x7e, 0x8a, 0xfb, 0xe9, 0x4b, 0xe5, 0xf7,
-+ 0xe5, 0x50, 0xa0, 0x90, 0x3f, 0xd6, 0x22, 0x53,
-+ 0xe3, 0xfe, 0x1b, 0xcc, 0x79, 0x3b, 0xec, 0x12,
-+ 0x47, 0x52, 0xa7, 0xd6, 0x04, 0xe3, 0x52, 0xe6,
-+ 0x93, 0x90, 0x91, 0x32, 0x73, 0x79, 0xb8, 0xd0,
-+ 0x31, 0xde, 0x1f, 0x9f, 0x2f, 0x05, 0x38, 0x54,
-+ 0x2f, 0x35, 0x04, 0x39, 0xe0, 0xa7, 0xba, 0xc6,
-+ 0x52, 0xf6, 0x37, 0x65, 0x4c, 0x07, 0xa9, 0x7e,
-+ 0xb3, 0x21, 0x6f, 0x74, 0x8c, 0xc9, 0xde, 0xdb,
-+ 0x65, 0x1b, 0x9b, 0xaa, 0x60, 0xb1, 0x03, 0x30,
-+ 0x6b, 0xb2, 0x03, 0xc4, 0x1c, 0x04, 0xf8, 0x0f,
-+ 0x64, 0xaf, 0x46, 0xe4, 0x65, 0x99, 0x49, 0xe2,
-+ 0xea, 0xce, 0x78, 0x00, 0xd8, 0x8b, 0xd5, 0x2e,
-+ 0xcf, 0xfc, 0x40, 0x49, 0xe8, 0x58, 0xdc, 0x34,
-+ 0x9c, 0x8c, 0x61, 0xbf, 0x0a, 0x8e, 0xec, 0x39,
-+ 0xa9, 0x30, 0x05, 0x5a, 0xd2, 0x56, 0x01, 0xc7,
-+ 0xda, 0x8f, 0x4e, 0xbb, 0x43, 0xa3, 0x3a, 0xf9,
-+ 0x15, 0x2a, 0xd0, 0xa0, 0x7a, 0x87, 0x34, 0x82,
-+ 0xfe, 0x8a, 0xd1, 0x2d, 0x5e, 0xc7, 0xbf, 0x04,
-+ 0x53, 0x5f, 0x3b, 0x36, 0xd4, 0x25, 0x5c, 0x34,
-+ 0x7a, 0x8d, 0xd5, 0x05, 0xce, 0x72, 0xca, 0xef,
-+ 0x7a, 0x4b, 0xbc, 0xb0, 0x10, 0x5c, 0x96, 0x42,
-+ 0x3a, 0x00, 0x98, 0xcd, 0x15, 0xe8, 0xb7, 0x53
-+};
-+static const u8 enc_assoc007[] __initconst = { };
-+static const u8 enc_nonce007[] __initconst = {
-+ 0xde, 0x7b, 0xef, 0xc3, 0x65, 0x1b, 0x68, 0xb0
-+};
-+static const u8 enc_key007[] __initconst = {
-+ 0x8d, 0xb8, 0x91, 0x48, 0xf0, 0xe7, 0x0a, 0xbd,
-+ 0xf9, 0x3f, 0xcd, 0xd9, 0xa0, 0x1e, 0x42, 0x4c,
-+ 0xe7, 0xde, 0x25, 0x3d, 0xa3, 0xd7, 0x05, 0x80,
-+ 0x8d, 0xf2, 0x82, 0xac, 0x44, 0x16, 0x51, 0x01
-+};
-+
-+static const u8 enc_input008[] __initconst = {
-+ 0xc3, 0x09, 0x94, 0x62, 0xe6, 0x46, 0x2e, 0x10,
-+ 0xbe, 0x00, 0xe4, 0xfc, 0xf3, 0x40, 0xa3, 0xe2,
-+ 0x0f, 0xc2, 0x8b, 0x28, 0xdc, 0xba, 0xb4, 0x3c,
-+ 0xe4, 0x21, 0x58, 0x61, 0xcd, 0x8b, 0xcd, 0xfb,
-+ 0xac, 0x94, 0xa1, 0x45, 0xf5, 0x1c, 0xe1, 0x12,
-+ 0xe0, 0x3b, 0x67, 0x21, 0x54, 0x5e, 0x8c, 0xaa,
-+ 0xcf, 0xdb, 0xb4, 0x51, 0xd4, 0x13, 0xda, 0xe6,
-+ 0x83, 0x89, 0xb6, 0x92, 0xe9, 0x21, 0x76, 0xa4,
-+ 0x93, 0x7d, 0x0e, 0xfd, 0x96, 0x36, 0x03, 0x91,
-+ 0x43, 0x5c, 0x92, 0x49, 0x62, 0x61, 0x7b, 0xeb,
-+ 0x43, 0x89, 0xb8, 0x12, 0x20, 0x43, 0xd4, 0x47,
-+ 0x06, 0x84, 0xee, 0x47, 0xe9, 0x8a, 0x73, 0x15,
-+ 0x0f, 0x72, 0xcf, 0xed, 0xce, 0x96, 0xb2, 0x7f,
-+ 0x21, 0x45, 0x76, 0xeb, 0x26, 0x28, 0x83, 0x6a,
-+ 0xad, 0xaa, 0xa6, 0x81, 0xd8, 0x55, 0xb1, 0xa3,
-+ 0x85, 0xb3, 0x0c, 0xdf, 0xf1, 0x69, 0x2d, 0x97,
-+ 0x05, 0x2a, 0xbc, 0x7c, 0x7b, 0x25, 0xf8, 0x80,
-+ 0x9d, 0x39, 0x25, 0xf3, 0x62, 0xf0, 0x66, 0x5e,
-+ 0xf4, 0xa0, 0xcf, 0xd8, 0xfd, 0x4f, 0xb1, 0x1f,
-+ 0x60, 0x3a, 0x08, 0x47, 0xaf, 0xe1, 0xf6, 0x10,
-+ 0x77, 0x09, 0xa7, 0x27, 0x8f, 0x9a, 0x97, 0x5a,
-+ 0x26, 0xfa, 0xfe, 0x41, 0x32, 0x83, 0x10, 0xe0,
-+ 0x1d, 0xbf, 0x64, 0x0d, 0xf4, 0x1c, 0x32, 0x35,
-+ 0xe5, 0x1b, 0x36, 0xef, 0xd4, 0x4a, 0x93, 0x4d,
-+ 0x00, 0x7c, 0xec, 0x02, 0x07, 0x8b, 0x5d, 0x7d,
-+ 0x1b, 0x0e, 0xd1, 0xa6, 0xa5, 0x5d, 0x7d, 0x57,
-+ 0x88, 0xa8, 0xcc, 0x81, 0xb4, 0x86, 0x4e, 0xb4,
-+ 0x40, 0xe9, 0x1d, 0xc3, 0xb1, 0x24, 0x3e, 0x7f,
-+ 0xcc, 0x8a, 0x24, 0x9b, 0xdf, 0x6d, 0xf0, 0x39,
-+ 0x69, 0x3e, 0x4c, 0xc0, 0x96, 0xe4, 0x13, 0xda,
-+ 0x90, 0xda, 0xf4, 0x95, 0x66, 0x8b, 0x17, 0x17,
-+ 0xfe, 0x39, 0x43, 0x25, 0xaa, 0xda, 0xa0, 0x43,
-+ 0x3c, 0xb1, 0x41, 0x02, 0xa3, 0xf0, 0xa7, 0x19,
-+ 0x59, 0xbc, 0x1d, 0x7d, 0x6c, 0x6d, 0x91, 0x09,
-+ 0x5c, 0xb7, 0x5b, 0x01, 0xd1, 0x6f, 0x17, 0x21,
-+ 0x97, 0xbf, 0x89, 0x71, 0xa5, 0xb0, 0x6e, 0x07,
-+ 0x45, 0xfd, 0x9d, 0xea, 0x07, 0xf6, 0x7a, 0x9f,
-+ 0x10, 0x18, 0x22, 0x30, 0x73, 0xac, 0xd4, 0x6b,
-+ 0x72, 0x44, 0xed, 0xd9, 0x19, 0x9b, 0x2d, 0x4a,
-+ 0x41, 0xdd, 0xd1, 0x85, 0x5e, 0x37, 0x19, 0xed,
-+ 0xd2, 0x15, 0x8f, 0x5e, 0x91, 0xdb, 0x33, 0xf2,
-+ 0xe4, 0xdb, 0xff, 0x98, 0xfb, 0xa3, 0xb5, 0xca,
-+ 0x21, 0x69, 0x08, 0xe7, 0x8a, 0xdf, 0x90, 0xff,
-+ 0x3e, 0xe9, 0x20, 0x86, 0x3c, 0xe9, 0xfc, 0x0b,
-+ 0xfe, 0x5c, 0x61, 0xaa, 0x13, 0x92, 0x7f, 0x7b,
-+ 0xec, 0xe0, 0x6d, 0xa8, 0x23, 0x22, 0xf6, 0x6b,
-+ 0x77, 0xc4, 0xfe, 0x40, 0x07, 0x3b, 0xb6, 0xf6,
-+ 0x8e, 0x5f, 0xd4, 0xb9, 0xb7, 0x0f, 0x21, 0x04,
-+ 0xef, 0x83, 0x63, 0x91, 0x69, 0x40, 0xa3, 0x48,
-+ 0x5c, 0xd2, 0x60, 0xf9, 0x4f, 0x6c, 0x47, 0x8b,
-+ 0x3b, 0xb1, 0x9f, 0x8e, 0xee, 0x16, 0x8a, 0x13,
-+ 0xfc, 0x46, 0x17, 0xc3, 0xc3, 0x32, 0x56, 0xf8,
-+ 0x3c, 0x85, 0x3a, 0xb6, 0x3e, 0xaa, 0x89, 0x4f,
-+ 0xb3, 0xdf, 0x38, 0xfd, 0xf1, 0xe4, 0x3a, 0xc0,
-+ 0xe6, 0x58, 0xb5, 0x8f, 0xc5, 0x29, 0xa2, 0x92,
-+ 0x4a, 0xb6, 0xa0, 0x34, 0x7f, 0xab, 0xb5, 0x8a,
-+ 0x90, 0xa1, 0xdb, 0x4d, 0xca, 0xb6, 0x2c, 0x41,
-+ 0x3c, 0xf7, 0x2b, 0x21, 0xc3, 0xfd, 0xf4, 0x17,
-+ 0x5c, 0xb5, 0x33, 0x17, 0x68, 0x2b, 0x08, 0x30,
-+ 0xf3, 0xf7, 0x30, 0x3c, 0x96, 0xe6, 0x6a, 0x20,
-+ 0x97, 0xe7, 0x4d, 0x10, 0x5f, 0x47, 0x5f, 0x49,
-+ 0x96, 0x09, 0xf0, 0x27, 0x91, 0xc8, 0xf8, 0x5a,
-+ 0x2e, 0x79, 0xb5, 0xe2, 0xb8, 0xe8, 0xb9, 0x7b,
-+ 0xd5, 0x10, 0xcb, 0xff, 0x5d, 0x14, 0x73, 0xf3
-+};
-+static const u8 enc_output008[] __initconst = {
-+ 0x14, 0xf6, 0x41, 0x37, 0xa6, 0xd4, 0x27, 0xcd,
-+ 0xdb, 0x06, 0x3e, 0x9a, 0x4e, 0xab, 0xd5, 0xb1,
-+ 0x1e, 0x6b, 0xd2, 0xbc, 0x11, 0xf4, 0x28, 0x93,
-+ 0x63, 0x54, 0xef, 0xbb, 0x5e, 0x1d, 0x3a, 0x1d,
-+ 0x37, 0x3c, 0x0a, 0x6c, 0x1e, 0xc2, 0xd1, 0x2c,
-+ 0xb5, 0xa3, 0xb5, 0x7b, 0xb8, 0x8f, 0x25, 0xa6,
-+ 0x1b, 0x61, 0x1c, 0xec, 0x28, 0x58, 0x26, 0xa4,
-+ 0xa8, 0x33, 0x28, 0x25, 0x5c, 0x45, 0x05, 0xe5,
-+ 0x6c, 0x99, 0xe5, 0x45, 0xc4, 0xa2, 0x03, 0x84,
-+ 0x03, 0x73, 0x1e, 0x8c, 0x49, 0xac, 0x20, 0xdd,
-+ 0x8d, 0xb3, 0xc4, 0xf5, 0xe7, 0x4f, 0xf1, 0xed,
-+ 0xa1, 0x98, 0xde, 0xa4, 0x96, 0xdd, 0x2f, 0xab,
-+ 0xab, 0x97, 0xcf, 0x3e, 0xd2, 0x9e, 0xb8, 0x13,
-+ 0x07, 0x28, 0x29, 0x19, 0xaf, 0xfd, 0xf2, 0x49,
-+ 0x43, 0xea, 0x49, 0x26, 0x91, 0xc1, 0x07, 0xd6,
-+ 0xbb, 0x81, 0x75, 0x35, 0x0d, 0x24, 0x7f, 0xc8,
-+ 0xda, 0xd4, 0xb7, 0xeb, 0xe8, 0x5c, 0x09, 0xa2,
-+ 0x2f, 0xdc, 0x28, 0x7d, 0x3a, 0x03, 0xfa, 0x94,
-+ 0xb5, 0x1d, 0x17, 0x99, 0x36, 0xc3, 0x1c, 0x18,
-+ 0x34, 0xe3, 0x9f, 0xf5, 0x55, 0x7c, 0xb0, 0x60,
-+ 0x9d, 0xff, 0xac, 0xd4, 0x61, 0xf2, 0xad, 0xf8,
-+ 0xce, 0xc7, 0xbe, 0x5c, 0xd2, 0x95, 0xa8, 0x4b,
-+ 0x77, 0x13, 0x19, 0x59, 0x26, 0xc9, 0xb7, 0x8f,
-+ 0x6a, 0xcb, 0x2d, 0x37, 0x91, 0xea, 0x92, 0x9c,
-+ 0x94, 0x5b, 0xda, 0x0b, 0xce, 0xfe, 0x30, 0x20,
-+ 0xf8, 0x51, 0xad, 0xf2, 0xbe, 0xe7, 0xc7, 0xff,
-+ 0xb3, 0x33, 0x91, 0x6a, 0xc9, 0x1a, 0x41, 0xc9,
-+ 0x0f, 0xf3, 0x10, 0x0e, 0xfd, 0x53, 0xff, 0x6c,
-+ 0x16, 0x52, 0xd9, 0xf3, 0xf7, 0x98, 0x2e, 0xc9,
-+ 0x07, 0x31, 0x2c, 0x0c, 0x72, 0xd7, 0xc5, 0xc6,
-+ 0x08, 0x2a, 0x7b, 0xda, 0xbd, 0x7e, 0x02, 0xea,
-+ 0x1a, 0xbb, 0xf2, 0x04, 0x27, 0x61, 0x28, 0x8e,
-+ 0xf5, 0x04, 0x03, 0x1f, 0x4c, 0x07, 0x55, 0x82,
-+ 0xec, 0x1e, 0xd7, 0x8b, 0x2f, 0x65, 0x56, 0xd1,
-+ 0xd9, 0x1e, 0x3c, 0xe9, 0x1f, 0x5e, 0x98, 0x70,
-+ 0x38, 0x4a, 0x8c, 0x49, 0xc5, 0x43, 0xa0, 0xa1,
-+ 0x8b, 0x74, 0x9d, 0x4c, 0x62, 0x0d, 0x10, 0x0c,
-+ 0xf4, 0x6c, 0x8f, 0xe0, 0xaa, 0x9a, 0x8d, 0xb7,
-+ 0xe0, 0xbe, 0x4c, 0x87, 0xf1, 0x98, 0x2f, 0xcc,
-+ 0xed, 0xc0, 0x52, 0x29, 0xdc, 0x83, 0xf8, 0xfc,
-+ 0x2c, 0x0e, 0xa8, 0x51, 0x4d, 0x80, 0x0d, 0xa3,
-+ 0xfe, 0xd8, 0x37, 0xe7, 0x41, 0x24, 0xfc, 0xfb,
-+ 0x75, 0xe3, 0x71, 0x7b, 0x57, 0x45, 0xf5, 0x97,
-+ 0x73, 0x65, 0x63, 0x14, 0x74, 0xb8, 0x82, 0x9f,
-+ 0xf8, 0x60, 0x2f, 0x8a, 0xf2, 0x4e, 0xf1, 0x39,
-+ 0xda, 0x33, 0x91, 0xf8, 0x36, 0xe0, 0x8d, 0x3f,
-+ 0x1f, 0x3b, 0x56, 0xdc, 0xa0, 0x8f, 0x3c, 0x9d,
-+ 0x71, 0x52, 0xa7, 0xb8, 0xc0, 0xa5, 0xc6, 0xa2,
-+ 0x73, 0xda, 0xf4, 0x4b, 0x74, 0x5b, 0x00, 0x3d,
-+ 0x99, 0xd7, 0x96, 0xba, 0xe6, 0xe1, 0xa6, 0x96,
-+ 0x38, 0xad, 0xb3, 0xc0, 0xd2, 0xba, 0x91, 0x6b,
-+ 0xf9, 0x19, 0xdd, 0x3b, 0xbe, 0xbe, 0x9c, 0x20,
-+ 0x50, 0xba, 0xa1, 0xd0, 0xce, 0x11, 0xbd, 0x95,
-+ 0xd8, 0xd1, 0xdd, 0x33, 0x85, 0x74, 0xdc, 0xdb,
-+ 0x66, 0x76, 0x44, 0xdc, 0x03, 0x74, 0x48, 0x35,
-+ 0x98, 0xb1, 0x18, 0x47, 0x94, 0x7d, 0xff, 0x62,
-+ 0xe4, 0x58, 0x78, 0xab, 0xed, 0x95, 0x36, 0xd9,
-+ 0x84, 0x91, 0x82, 0x64, 0x41, 0xbb, 0x58, 0xe6,
-+ 0x1c, 0x20, 0x6d, 0x15, 0x6b, 0x13, 0x96, 0xe8,
-+ 0x35, 0x7f, 0xdc, 0x40, 0x2c, 0xe9, 0xbc, 0x8a,
-+ 0x4f, 0x92, 0xec, 0x06, 0x2d, 0x50, 0xdf, 0x93,
-+ 0x5d, 0x65, 0x5a, 0xa8, 0xfc, 0x20, 0x50, 0x14,
-+ 0xa9, 0x8a, 0x7e, 0x1d, 0x08, 0x1f, 0xe2, 0x99,
-+ 0xd0, 0xbe, 0xfb, 0x3a, 0x21, 0x9d, 0xad, 0x86,
-+ 0x54, 0xfd, 0x0d, 0x98, 0x1c, 0x5a, 0x6f, 0x1f,
-+ 0x9a, 0x40, 0xcd, 0xa2, 0xff, 0x6a, 0xf1, 0x54
-+};
-+static const u8 enc_assoc008[] __initconst = { };
-+static const u8 enc_nonce008[] __initconst = {
-+ 0x0e, 0x0d, 0x57, 0xbb, 0x7b, 0x40, 0x54, 0x02
-+};
-+static const u8 enc_key008[] __initconst = {
-+ 0xf2, 0xaa, 0x4f, 0x99, 0xfd, 0x3e, 0xa8, 0x53,
-+ 0xc1, 0x44, 0xe9, 0x81, 0x18, 0xdc, 0xf5, 0xf0,
-+ 0x3e, 0x44, 0x15, 0x59, 0xe0, 0xc5, 0x44, 0x86,
-+ 0xc3, 0x91, 0xa8, 0x75, 0xc0, 0x12, 0x46, 0xba
-+};
-+
-+static const u8 enc_input009[] __initconst = {
-+ 0xe6, 0xc3, 0xdb, 0x63, 0x55, 0x15, 0xe3, 0x5b,
-+ 0xb7, 0x4b, 0x27, 0x8b, 0x5a, 0xdd, 0xc2, 0xe8,
-+ 0x3a, 0x6b, 0xd7, 0x81, 0x96, 0x35, 0x97, 0xca,
-+ 0xd7, 0x68, 0xe8, 0xef, 0xce, 0xab, 0xda, 0x09,
-+ 0x6e, 0xd6, 0x8e, 0xcb, 0x55, 0xb5, 0xe1, 0xe5,
-+ 0x57, 0xfd, 0xc4, 0xe3, 0xe0, 0x18, 0x4f, 0x85,
-+ 0xf5, 0x3f, 0x7e, 0x4b, 0x88, 0xc9, 0x52, 0x44,
-+ 0x0f, 0xea, 0xaf, 0x1f, 0x71, 0x48, 0x9f, 0x97,
-+ 0x6d, 0xb9, 0x6f, 0x00, 0xa6, 0xde, 0x2b, 0x77,
-+ 0x8b, 0x15, 0xad, 0x10, 0xa0, 0x2b, 0x7b, 0x41,
-+ 0x90, 0x03, 0x2d, 0x69, 0xae, 0xcc, 0x77, 0x7c,
-+ 0xa5, 0x9d, 0x29, 0x22, 0xc2, 0xea, 0xb4, 0x00,
-+ 0x1a, 0xd2, 0x7a, 0x98, 0x8a, 0xf9, 0xf7, 0x82,
-+ 0xb0, 0xab, 0xd8, 0xa6, 0x94, 0x8d, 0x58, 0x2f,
-+ 0x01, 0x9e, 0x00, 0x20, 0xfc, 0x49, 0xdc, 0x0e,
-+ 0x03, 0xe8, 0x45, 0x10, 0xd6, 0xa8, 0xda, 0x55,
-+ 0x10, 0x9a, 0xdf, 0x67, 0x22, 0x8b, 0x43, 0xab,
-+ 0x00, 0xbb, 0x02, 0xc8, 0xdd, 0x7b, 0x97, 0x17,
-+ 0xd7, 0x1d, 0x9e, 0x02, 0x5e, 0x48, 0xde, 0x8e,
-+ 0xcf, 0x99, 0x07, 0x95, 0x92, 0x3c, 0x5f, 0x9f,
-+ 0xc5, 0x8a, 0xc0, 0x23, 0xaa, 0xd5, 0x8c, 0x82,
-+ 0x6e, 0x16, 0x92, 0xb1, 0x12, 0x17, 0x07, 0xc3,
-+ 0xfb, 0x36, 0xf5, 0x6c, 0x35, 0xd6, 0x06, 0x1f,
-+ 0x9f, 0xa7, 0x94, 0xa2, 0x38, 0x63, 0x9c, 0xb0,
-+ 0x71, 0xb3, 0xa5, 0xd2, 0xd8, 0xba, 0x9f, 0x08,
-+ 0x01, 0xb3, 0xff, 0x04, 0x97, 0x73, 0x45, 0x1b,
-+ 0xd5, 0xa9, 0x9c, 0x80, 0xaf, 0x04, 0x9a, 0x85,
-+ 0xdb, 0x32, 0x5b, 0x5d, 0x1a, 0xc1, 0x36, 0x28,
-+ 0x10, 0x79, 0xf1, 0x3c, 0xbf, 0x1a, 0x41, 0x5c,
-+ 0x4e, 0xdf, 0xb2, 0x7c, 0x79, 0x3b, 0x7a, 0x62,
-+ 0x3d, 0x4b, 0xc9, 0x9b, 0x2a, 0x2e, 0x7c, 0xa2,
-+ 0xb1, 0x11, 0x98, 0xa7, 0x34, 0x1a, 0x00, 0xf3,
-+ 0xd1, 0xbc, 0x18, 0x22, 0xba, 0x02, 0x56, 0x62,
-+ 0x31, 0x10, 0x11, 0x6d, 0xe0, 0x54, 0x9d, 0x40,
-+ 0x1f, 0x26, 0x80, 0x41, 0xca, 0x3f, 0x68, 0x0f,
-+ 0x32, 0x1d, 0x0a, 0x8e, 0x79, 0xd8, 0xa4, 0x1b,
-+ 0x29, 0x1c, 0x90, 0x8e, 0xc5, 0xe3, 0xb4, 0x91,
-+ 0x37, 0x9a, 0x97, 0x86, 0x99, 0xd5, 0x09, 0xc5,
-+ 0xbb, 0xa3, 0x3f, 0x21, 0x29, 0x82, 0x14, 0x5c,
-+ 0xab, 0x25, 0xfb, 0xf2, 0x4f, 0x58, 0x26, 0xd4,
-+ 0x83, 0xaa, 0x66, 0x89, 0x67, 0x7e, 0xc0, 0x49,
-+ 0xe1, 0x11, 0x10, 0x7f, 0x7a, 0xda, 0x29, 0x04,
-+ 0xff, 0xf0, 0xcb, 0x09, 0x7c, 0x9d, 0xfa, 0x03,
-+ 0x6f, 0x81, 0x09, 0x31, 0x60, 0xfb, 0x08, 0xfa,
-+ 0x74, 0xd3, 0x64, 0x44, 0x7c, 0x55, 0x85, 0xec,
-+ 0x9c, 0x6e, 0x25, 0xb7, 0x6c, 0xc5, 0x37, 0xb6,
-+ 0x83, 0x87, 0x72, 0x95, 0x8b, 0x9d, 0xe1, 0x69,
-+ 0x5c, 0x31, 0x95, 0x42, 0xa6, 0x2c, 0xd1, 0x36,
-+ 0x47, 0x1f, 0xec, 0x54, 0xab, 0xa2, 0x1c, 0xd8,
-+ 0x00, 0xcc, 0xbc, 0x0d, 0x65, 0xe2, 0x67, 0xbf,
-+ 0xbc, 0xea, 0xee, 0x9e, 0xe4, 0x36, 0x95, 0xbe,
-+ 0x73, 0xd9, 0xa6, 0xd9, 0x0f, 0xa0, 0xcc, 0x82,
-+ 0x76, 0x26, 0xad, 0x5b, 0x58, 0x6c, 0x4e, 0xab,
-+ 0x29, 0x64, 0xd3, 0xd9, 0xa9, 0x08, 0x8c, 0x1d,
-+ 0xa1, 0x4f, 0x80, 0xd8, 0x3f, 0x94, 0xfb, 0xd3,
-+ 0x7b, 0xfc, 0xd1, 0x2b, 0xc3, 0x21, 0xeb, 0xe5,
-+ 0x1c, 0x84, 0x23, 0x7f, 0x4b, 0xfa, 0xdb, 0x34,
-+ 0x18, 0xa2, 0xc2, 0xe5, 0x13, 0xfe, 0x6c, 0x49,
-+ 0x81, 0xd2, 0x73, 0xe7, 0xe2, 0xd7, 0xe4, 0x4f,
-+ 0x4b, 0x08, 0x6e, 0xb1, 0x12, 0x22, 0x10, 0x9d,
-+ 0xac, 0x51, 0x1e, 0x17, 0xd9, 0x8a, 0x0b, 0x42,
-+ 0x88, 0x16, 0x81, 0x37, 0x7c, 0x6a, 0xf7, 0xef,
-+ 0x2d, 0xe3, 0xd9, 0xf8, 0x5f, 0xe0, 0x53, 0x27,
-+ 0x74, 0xb9, 0xe2, 0xd6, 0x1c, 0x80, 0x2c, 0x52,
-+ 0x65
-+};
-+static const u8 enc_output009[] __initconst = {
-+ 0xfd, 0x81, 0x8d, 0xd0, 0x3d, 0xb4, 0xd5, 0xdf,
-+ 0xd3, 0x42, 0x47, 0x5a, 0x6d, 0x19, 0x27, 0x66,
-+ 0x4b, 0x2e, 0x0c, 0x27, 0x9c, 0x96, 0x4c, 0x72,
-+ 0x02, 0xa3, 0x65, 0xc3, 0xb3, 0x6f, 0x2e, 0xbd,
-+ 0x63, 0x8a, 0x4a, 0x5d, 0x29, 0xa2, 0xd0, 0x28,
-+ 0x48, 0xc5, 0x3d, 0x98, 0xa3, 0xbc, 0xe0, 0xbe,
-+ 0x3b, 0x3f, 0xe6, 0x8a, 0xa4, 0x7f, 0x53, 0x06,
-+ 0xfa, 0x7f, 0x27, 0x76, 0x72, 0x31, 0xa1, 0xf5,
-+ 0xd6, 0x0c, 0x52, 0x47, 0xba, 0xcd, 0x4f, 0xd7,
-+ 0xeb, 0x05, 0x48, 0x0d, 0x7c, 0x35, 0x4a, 0x09,
-+ 0xc9, 0x76, 0x71, 0x02, 0xa3, 0xfb, 0xb7, 0x1a,
-+ 0x65, 0xb7, 0xed, 0x98, 0xc6, 0x30, 0x8a, 0x00,
-+ 0xae, 0xa1, 0x31, 0xe5, 0xb5, 0x9e, 0x6d, 0x62,
-+ 0xda, 0xda, 0x07, 0x0f, 0x38, 0x38, 0xd3, 0xcb,
-+ 0xc1, 0xb0, 0xad, 0xec, 0x72, 0xec, 0xb1, 0xa2,
-+ 0x7b, 0x59, 0xf3, 0x3d, 0x2b, 0xef, 0xcd, 0x28,
-+ 0x5b, 0x83, 0xcc, 0x18, 0x91, 0x88, 0xb0, 0x2e,
-+ 0xf9, 0x29, 0x31, 0x18, 0xf9, 0x4e, 0xe9, 0x0a,
-+ 0x91, 0x92, 0x9f, 0xae, 0x2d, 0xad, 0xf4, 0xe6,
-+ 0x1a, 0xe2, 0xa4, 0xee, 0x47, 0x15, 0xbf, 0x83,
-+ 0x6e, 0xd7, 0x72, 0x12, 0x3b, 0x2d, 0x24, 0xe9,
-+ 0xb2, 0x55, 0xcb, 0x3c, 0x10, 0xf0, 0x24, 0x8a,
-+ 0x4a, 0x02, 0xea, 0x90, 0x25, 0xf0, 0xb4, 0x79,
-+ 0x3a, 0xef, 0x6e, 0xf5, 0x52, 0xdf, 0xb0, 0x0a,
-+ 0xcd, 0x24, 0x1c, 0xd3, 0x2e, 0x22, 0x74, 0xea,
-+ 0x21, 0x6f, 0xe9, 0xbd, 0xc8, 0x3e, 0x36, 0x5b,
-+ 0x19, 0xf1, 0xca, 0x99, 0x0a, 0xb4, 0xa7, 0x52,
-+ 0x1a, 0x4e, 0xf2, 0xad, 0x8d, 0x56, 0x85, 0xbb,
-+ 0x64, 0x89, 0xba, 0x26, 0xf9, 0xc7, 0xe1, 0x89,
-+ 0x19, 0x22, 0x77, 0xc3, 0xa8, 0xfc, 0xff, 0xad,
-+ 0xfe, 0xb9, 0x48, 0xae, 0x12, 0x30, 0x9f, 0x19,
-+ 0xfb, 0x1b, 0xef, 0x14, 0x87, 0x8a, 0x78, 0x71,
-+ 0xf3, 0xf4, 0xb7, 0x00, 0x9c, 0x1d, 0xb5, 0x3d,
-+ 0x49, 0x00, 0x0c, 0x06, 0xd4, 0x50, 0xf9, 0x54,
-+ 0x45, 0xb2, 0x5b, 0x43, 0xdb, 0x6d, 0xcf, 0x1a,
-+ 0xe9, 0x7a, 0x7a, 0xcf, 0xfc, 0x8a, 0x4e, 0x4d,
-+ 0x0b, 0x07, 0x63, 0x28, 0xd8, 0xe7, 0x08, 0x95,
-+ 0xdf, 0xa6, 0x72, 0x93, 0x2e, 0xbb, 0xa0, 0x42,
-+ 0x89, 0x16, 0xf1, 0xd9, 0x0c, 0xf9, 0xa1, 0x16,
-+ 0xfd, 0xd9, 0x03, 0xb4, 0x3b, 0x8a, 0xf5, 0xf6,
-+ 0xe7, 0x6b, 0x2e, 0x8e, 0x4c, 0x3d, 0xe2, 0xaf,
-+ 0x08, 0x45, 0x03, 0xff, 0x09, 0xb6, 0xeb, 0x2d,
-+ 0xc6, 0x1b, 0x88, 0x94, 0xac, 0x3e, 0xf1, 0x9f,
-+ 0x0e, 0x0e, 0x2b, 0xd5, 0x00, 0x4d, 0x3f, 0x3b,
-+ 0x53, 0xae, 0xaf, 0x1c, 0x33, 0x5f, 0x55, 0x6e,
-+ 0x8d, 0xaf, 0x05, 0x7a, 0x10, 0x34, 0xc9, 0xf4,
-+ 0x66, 0xcb, 0x62, 0x12, 0xa6, 0xee, 0xe8, 0x1c,
-+ 0x5d, 0x12, 0x86, 0xdb, 0x6f, 0x1c, 0x33, 0xc4,
-+ 0x1c, 0xda, 0x82, 0x2d, 0x3b, 0x59, 0xfe, 0xb1,
-+ 0xa4, 0x59, 0x41, 0x86, 0xd0, 0xef, 0xae, 0xfb,
-+ 0xda, 0x6d, 0x11, 0xb8, 0xca, 0xe9, 0x6e, 0xff,
-+ 0xf7, 0xa9, 0xd9, 0x70, 0x30, 0xfc, 0x53, 0xe2,
-+ 0xd7, 0xa2, 0x4e, 0xc7, 0x91, 0xd9, 0x07, 0x06,
-+ 0xaa, 0xdd, 0xb0, 0x59, 0x28, 0x1d, 0x00, 0x66,
-+ 0xc5, 0x54, 0xc2, 0xfc, 0x06, 0xda, 0x05, 0x90,
-+ 0x52, 0x1d, 0x37, 0x66, 0xee, 0xf0, 0xb2, 0x55,
-+ 0x8a, 0x5d, 0xd2, 0x38, 0x86, 0x94, 0x9b, 0xfc,
-+ 0x10, 0x4c, 0xa1, 0xb9, 0x64, 0x3e, 0x44, 0xb8,
-+ 0x5f, 0xb0, 0x0c, 0xec, 0xe0, 0xc9, 0xe5, 0x62,
-+ 0x75, 0x3f, 0x09, 0xd5, 0xf5, 0xd9, 0x26, 0xba,
-+ 0x9e, 0xd2, 0xf4, 0xb9, 0x48, 0x0a, 0xbc, 0xa2,
-+ 0xd6, 0x7c, 0x36, 0x11, 0x7d, 0x26, 0x81, 0x89,
-+ 0xcf, 0xa4, 0xad, 0x73, 0x0e, 0xee, 0xcc, 0x06,
-+ 0xa9, 0xdb, 0xb1, 0xfd, 0xfb, 0x09, 0x7f, 0x90,
-+ 0x42, 0x37, 0x2f, 0xe1, 0x9c, 0x0f, 0x6f, 0xcf,
-+ 0x43, 0xb5, 0xd9, 0x90, 0xe1, 0x85, 0xf5, 0xa8,
-+ 0xae
-+};
-+static const u8 enc_assoc009[] __initconst = {
-+ 0x5a, 0x27, 0xff, 0xeb, 0xdf, 0x84, 0xb2, 0x9e,
-+ 0xef
-+};
-+static const u8 enc_nonce009[] __initconst = {
-+ 0xef, 0x2d, 0x63, 0xee, 0x6b, 0x80, 0x8b, 0x78
-+};
-+static const u8 enc_key009[] __initconst = {
-+ 0xea, 0xbc, 0x56, 0x99, 0xe3, 0x50, 0xff, 0xc5,
-+ 0xcc, 0x1a, 0xd7, 0xc1, 0x57, 0x72, 0xea, 0x86,
-+ 0x5b, 0x89, 0x88, 0x61, 0x3d, 0x2f, 0x9b, 0xb2,
-+ 0xe7, 0x9c, 0xec, 0x74, 0x6e, 0x3e, 0xf4, 0x3b
-+};
-+
-+static const u8 enc_input010[] __initconst = {
-+ 0x42, 0x93, 0xe4, 0xeb, 0x97, 0xb0, 0x57, 0xbf,
-+ 0x1a, 0x8b, 0x1f, 0xe4, 0x5f, 0x36, 0x20, 0x3c,
-+ 0xef, 0x0a, 0xa9, 0x48, 0x5f, 0x5f, 0x37, 0x22,
-+ 0x3a, 0xde, 0xe3, 0xae, 0xbe, 0xad, 0x07, 0xcc,
-+ 0xb1, 0xf6, 0xf5, 0xf9, 0x56, 0xdd, 0xe7, 0x16,
-+ 0x1e, 0x7f, 0xdf, 0x7a, 0x9e, 0x75, 0xb7, 0xc7,
-+ 0xbe, 0xbe, 0x8a, 0x36, 0x04, 0xc0, 0x10, 0xf4,
-+ 0x95, 0x20, 0x03, 0xec, 0xdc, 0x05, 0xa1, 0x7d,
-+ 0xc4, 0xa9, 0x2c, 0x82, 0xd0, 0xbc, 0x8b, 0xc5,
-+ 0xc7, 0x45, 0x50, 0xf6, 0xa2, 0x1a, 0xb5, 0x46,
-+ 0x3b, 0x73, 0x02, 0xa6, 0x83, 0x4b, 0x73, 0x82,
-+ 0x58, 0x5e, 0x3b, 0x65, 0x2f, 0x0e, 0xfd, 0x2b,
-+ 0x59, 0x16, 0xce, 0xa1, 0x60, 0x9c, 0xe8, 0x3a,
-+ 0x99, 0xed, 0x8d, 0x5a, 0xcf, 0xf6, 0x83, 0xaf,
-+ 0xba, 0xd7, 0x73, 0x73, 0x40, 0x97, 0x3d, 0xca,
-+ 0xef, 0x07, 0x57, 0xe6, 0xd9, 0x70, 0x0e, 0x95,
-+ 0xae, 0xa6, 0x8d, 0x04, 0xcc, 0xee, 0xf7, 0x09,
-+ 0x31, 0x77, 0x12, 0xa3, 0x23, 0x97, 0x62, 0xb3,
-+ 0x7b, 0x32, 0xfb, 0x80, 0x14, 0x48, 0x81, 0xc3,
-+ 0xe5, 0xea, 0x91, 0x39, 0x52, 0x81, 0xa2, 0x4f,
-+ 0xe4, 0xb3, 0x09, 0xff, 0xde, 0x5e, 0xe9, 0x58,
-+ 0x84, 0x6e, 0xf9, 0x3d, 0xdf, 0x25, 0xea, 0xad,
-+ 0xae, 0xe6, 0x9a, 0xd1, 0x89, 0x55, 0xd3, 0xde,
-+ 0x6c, 0x52, 0xdb, 0x70, 0xfe, 0x37, 0xce, 0x44,
-+ 0x0a, 0xa8, 0x25, 0x5f, 0x92, 0xc1, 0x33, 0x4a,
-+ 0x4f, 0x9b, 0x62, 0x35, 0xff, 0xce, 0xc0, 0xa9,
-+ 0x60, 0xce, 0x52, 0x00, 0x97, 0x51, 0x35, 0x26,
-+ 0x2e, 0xb9, 0x36, 0xa9, 0x87, 0x6e, 0x1e, 0xcc,
-+ 0x91, 0x78, 0x53, 0x98, 0x86, 0x5b, 0x9c, 0x74,
-+ 0x7d, 0x88, 0x33, 0xe1, 0xdf, 0x37, 0x69, 0x2b,
-+ 0xbb, 0xf1, 0x4d, 0xf4, 0xd1, 0xf1, 0x39, 0x93,
-+ 0x17, 0x51, 0x19, 0xe3, 0x19, 0x1e, 0x76, 0x37,
-+ 0x25, 0xfb, 0x09, 0x27, 0x6a, 0xab, 0x67, 0x6f,
-+ 0x14, 0x12, 0x64, 0xe7, 0xc4, 0x07, 0xdf, 0x4d,
-+ 0x17, 0xbb, 0x6d, 0xe0, 0xe9, 0xb9, 0xab, 0xca,
-+ 0x10, 0x68, 0xaf, 0x7e, 0xb7, 0x33, 0x54, 0x73,
-+ 0x07, 0x6e, 0xf7, 0x81, 0x97, 0x9c, 0x05, 0x6f,
-+ 0x84, 0x5f, 0xd2, 0x42, 0xfb, 0x38, 0xcf, 0xd1,
-+ 0x2f, 0x14, 0x30, 0x88, 0x98, 0x4d, 0x5a, 0xa9,
-+ 0x76, 0xd5, 0x4f, 0x3e, 0x70, 0x6c, 0x85, 0x76,
-+ 0xd7, 0x01, 0xa0, 0x1a, 0xc8, 0x4e, 0xaa, 0xac,
-+ 0x78, 0xfe, 0x46, 0xde, 0x6a, 0x05, 0x46, 0xa7,
-+ 0x43, 0x0c, 0xb9, 0xde, 0xb9, 0x68, 0xfb, 0xce,
-+ 0x42, 0x99, 0x07, 0x4d, 0x0b, 0x3b, 0x5a, 0x30,
-+ 0x35, 0xa8, 0xf9, 0x3a, 0x73, 0xef, 0x0f, 0xdb,
-+ 0x1e, 0x16, 0x42, 0xc4, 0xba, 0xae, 0x58, 0xaa,
-+ 0xf8, 0xe5, 0x75, 0x2f, 0x1b, 0x15, 0x5c, 0xfd,
-+ 0x0a, 0x97, 0xd0, 0xe4, 0x37, 0x83, 0x61, 0x5f,
-+ 0x43, 0xa6, 0xc7, 0x3f, 0x38, 0x59, 0xe6, 0xeb,
-+ 0xa3, 0x90, 0xc3, 0xaa, 0xaa, 0x5a, 0xd3, 0x34,
-+ 0xd4, 0x17, 0xc8, 0x65, 0x3e, 0x57, 0xbc, 0x5e,
-+ 0xdd, 0x9e, 0xb7, 0xf0, 0x2e, 0x5b, 0xb2, 0x1f,
-+ 0x8a, 0x08, 0x0d, 0x45, 0x91, 0x0b, 0x29, 0x53,
-+ 0x4f, 0x4c, 0x5a, 0x73, 0x56, 0xfe, 0xaf, 0x41,
-+ 0x01, 0x39, 0x0a, 0x24, 0x3c, 0x7e, 0xbe, 0x4e,
-+ 0x53, 0xf3, 0xeb, 0x06, 0x66, 0x51, 0x28, 0x1d,
-+ 0xbd, 0x41, 0x0a, 0x01, 0xab, 0x16, 0x47, 0x27,
-+ 0x47, 0x47, 0xf7, 0xcb, 0x46, 0x0a, 0x70, 0x9e,
-+ 0x01, 0x9c, 0x09, 0xe1, 0x2a, 0x00, 0x1a, 0xd8,
-+ 0xd4, 0x79, 0x9d, 0x80, 0x15, 0x8e, 0x53, 0x2a,
-+ 0x65, 0x83, 0x78, 0x3e, 0x03, 0x00, 0x07, 0x12,
-+ 0x1f, 0x33, 0x3e, 0x7b, 0x13, 0x37, 0xf1, 0xc3,
-+ 0xef, 0xb7, 0xc1, 0x20, 0x3c, 0x3e, 0x67, 0x66,
-+ 0x5d, 0x88, 0xa7, 0x7d, 0x33, 0x50, 0x77, 0xb0,
-+ 0x28, 0x8e, 0xe7, 0x2c, 0x2e, 0x7a, 0xf4, 0x3c,
-+ 0x8d, 0x74, 0x83, 0xaf, 0x8e, 0x87, 0x0f, 0xe4,
-+ 0x50, 0xff, 0x84, 0x5c, 0x47, 0x0c, 0x6a, 0x49,
-+ 0xbf, 0x42, 0x86, 0x77, 0x15, 0x48, 0xa5, 0x90,
-+ 0x5d, 0x93, 0xd6, 0x2a, 0x11, 0xd5, 0xd5, 0x11,
-+ 0xaa, 0xce, 0xe7, 0x6f, 0xa5, 0xb0, 0x09, 0x2c,
-+ 0x8d, 0xd3, 0x92, 0xf0, 0x5a, 0x2a, 0xda, 0x5b,
-+ 0x1e, 0xd5, 0x9a, 0xc4, 0xc4, 0xf3, 0x49, 0x74,
-+ 0x41, 0xca, 0xe8, 0xc1, 0xf8, 0x44, 0xd6, 0x3c,
-+ 0xae, 0x6c, 0x1d, 0x9a, 0x30, 0x04, 0x4d, 0x27,
-+ 0x0e, 0xb1, 0x5f, 0x59, 0xa2, 0x24, 0xe8, 0xe1,
-+ 0x98, 0xc5, 0x6a, 0x4c, 0xfe, 0x41, 0xd2, 0x27,
-+ 0x42, 0x52, 0xe1, 0xe9, 0x7d, 0x62, 0xe4, 0x88,
-+ 0x0f, 0xad, 0xb2, 0x70, 0xcb, 0x9d, 0x4c, 0x27,
-+ 0x2e, 0x76, 0x1e, 0x1a, 0x63, 0x65, 0xf5, 0x3b,
-+ 0xf8, 0x57, 0x69, 0xeb, 0x5b, 0x38, 0x26, 0x39,
-+ 0x33, 0x25, 0x45, 0x3e, 0x91, 0xb8, 0xd8, 0xc7,
-+ 0xd5, 0x42, 0xc0, 0x22, 0x31, 0x74, 0xf4, 0xbc,
-+ 0x0c, 0x23, 0xf1, 0xca, 0xc1, 0x8d, 0xd7, 0xbe,
-+ 0xc9, 0x62, 0xe4, 0x08, 0x1a, 0xcf, 0x36, 0xd5,
-+ 0xfe, 0x55, 0x21, 0x59, 0x91, 0x87, 0x87, 0xdf,
-+ 0x06, 0xdb, 0xdf, 0x96, 0x45, 0x58, 0xda, 0x05,
-+ 0xcd, 0x50, 0x4d, 0xd2, 0x7d, 0x05, 0x18, 0x73,
-+ 0x6a, 0x8d, 0x11, 0x85, 0xa6, 0x88, 0xe8, 0xda,
-+ 0xe6, 0x30, 0x33, 0xa4, 0x89, 0x31, 0x75, 0xbe,
-+ 0x69, 0x43, 0x84, 0x43, 0x50, 0x87, 0xdd, 0x71,
-+ 0x36, 0x83, 0xc3, 0x78, 0x74, 0x24, 0x0a, 0xed,
-+ 0x7b, 0xdb, 0xa4, 0x24, 0x0b, 0xb9, 0x7e, 0x5d,
-+ 0xff, 0xde, 0xb1, 0xef, 0x61, 0x5a, 0x45, 0x33,
-+ 0xf6, 0x17, 0x07, 0x08, 0x98, 0x83, 0x92, 0x0f,
-+ 0x23, 0x6d, 0xe6, 0xaa, 0x17, 0x54, 0xad, 0x6a,
-+ 0xc8, 0xdb, 0x26, 0xbe, 0xb8, 0xb6, 0x08, 0xfa,
-+ 0x68, 0xf1, 0xd7, 0x79, 0x6f, 0x18, 0xb4, 0x9e,
-+ 0x2d, 0x3f, 0x1b, 0x64, 0xaf, 0x8d, 0x06, 0x0e,
-+ 0x49, 0x28, 0xe0, 0x5d, 0x45, 0x68, 0x13, 0x87,
-+ 0xfa, 0xde, 0x40, 0x7b, 0xd2, 0xc3, 0x94, 0xd5,
-+ 0xe1, 0xd9, 0xc2, 0xaf, 0x55, 0x89, 0xeb, 0xb4,
-+ 0x12, 0x59, 0xa8, 0xd4, 0xc5, 0x29, 0x66, 0x38,
-+ 0xe6, 0xac, 0x22, 0x22, 0xd9, 0x64, 0x9b, 0x34,
-+ 0x0a, 0x32, 0x9f, 0xc2, 0xbf, 0x17, 0x6c, 0x3f,
-+ 0x71, 0x7a, 0x38, 0x6b, 0x98, 0xfb, 0x49, 0x36,
-+ 0x89, 0xc9, 0xe2, 0xd6, 0xc7, 0x5d, 0xd0, 0x69,
-+ 0x5f, 0x23, 0x35, 0xc9, 0x30, 0xe2, 0xfd, 0x44,
-+ 0x58, 0x39, 0xd7, 0x97, 0xfb, 0x5c, 0x00, 0xd5,
-+ 0x4f, 0x7a, 0x1a, 0x95, 0x8b, 0x62, 0x4b, 0xce,
-+ 0xe5, 0x91, 0x21, 0x7b, 0x30, 0x00, 0xd6, 0xdd,
-+ 0x6d, 0x02, 0x86, 0x49, 0x0f, 0x3c, 0x1a, 0x27,
-+ 0x3c, 0xd3, 0x0e, 0x71, 0xf2, 0xff, 0xf5, 0x2f,
-+ 0x87, 0xac, 0x67, 0x59, 0x81, 0xa3, 0xf7, 0xf8,
-+ 0xd6, 0x11, 0x0c, 0x84, 0xa9, 0x03, 0xee, 0x2a,
-+ 0xc4, 0xf3, 0x22, 0xab, 0x7c, 0xe2, 0x25, 0xf5,
-+ 0x67, 0xa3, 0xe4, 0x11, 0xe0, 0x59, 0xb3, 0xca,
-+ 0x87, 0xa0, 0xae, 0xc9, 0xa6, 0x62, 0x1b, 0x6e,
-+ 0x4d, 0x02, 0x6b, 0x07, 0x9d, 0xfd, 0xd0, 0x92,
-+ 0x06, 0xe1, 0xb2, 0x9a, 0x4a, 0x1f, 0x1f, 0x13,
-+ 0x49, 0x99, 0x97, 0x08, 0xde, 0x7f, 0x98, 0xaf,
-+ 0x51, 0x98, 0xee, 0x2c, 0xcb, 0xf0, 0x0b, 0xc6,
-+ 0xb6, 0xb7, 0x2d, 0x9a, 0xb1, 0xac, 0xa6, 0xe3,
-+ 0x15, 0x77, 0x9d, 0x6b, 0x1a, 0xe4, 0xfc, 0x8b,
-+ 0xf2, 0x17, 0x59, 0x08, 0x04, 0x58, 0x81, 0x9d,
-+ 0x1b, 0x1b, 0x69, 0x55, 0xc2, 0xb4, 0x3c, 0x1f,
-+ 0x50, 0xf1, 0x7f, 0x77, 0x90, 0x4c, 0x66, 0x40,
-+ 0x5a, 0xc0, 0x33, 0x1f, 0xcb, 0x05, 0x6d, 0x5c,
-+ 0x06, 0x87, 0x52, 0xa2, 0x8f, 0x26, 0xd5, 0x4f
-+};
-+static const u8 enc_output010[] __initconst = {
-+ 0xe5, 0x26, 0xa4, 0x3d, 0xbd, 0x33, 0xd0, 0x4b,
-+ 0x6f, 0x05, 0xa7, 0x6e, 0x12, 0x7a, 0xd2, 0x74,
-+ 0xa6, 0xdd, 0xbd, 0x95, 0xeb, 0xf9, 0xa4, 0xf1,
-+ 0x59, 0x93, 0x91, 0x70, 0xd9, 0xfe, 0x9a, 0xcd,
-+ 0x53, 0x1f, 0x3a, 0xab, 0xa6, 0x7c, 0x9f, 0xa6,
-+ 0x9e, 0xbd, 0x99, 0xd9, 0xb5, 0x97, 0x44, 0xd5,
-+ 0x14, 0x48, 0x4d, 0x9d, 0xc0, 0xd0, 0x05, 0x96,
-+ 0xeb, 0x4c, 0x78, 0x55, 0x09, 0x08, 0x01, 0x02,
-+ 0x30, 0x90, 0x7b, 0x96, 0x7a, 0x7b, 0x5f, 0x30,
-+ 0x41, 0x24, 0xce, 0x68, 0x61, 0x49, 0x86, 0x57,
-+ 0x82, 0xdd, 0x53, 0x1c, 0x51, 0x28, 0x2b, 0x53,
-+ 0x6e, 0x2d, 0xc2, 0x20, 0x4c, 0xdd, 0x8f, 0x65,
-+ 0x10, 0x20, 0x50, 0xdd, 0x9d, 0x50, 0xe5, 0x71,
-+ 0x40, 0x53, 0x69, 0xfc, 0x77, 0x48, 0x11, 0xb9,
-+ 0xde, 0xa4, 0x8d, 0x58, 0xe4, 0xa6, 0x1a, 0x18,
-+ 0x47, 0x81, 0x7e, 0xfc, 0xdd, 0xf6, 0xef, 0xce,
-+ 0x2f, 0x43, 0x68, 0xd6, 0x06, 0xe2, 0x74, 0x6a,
-+ 0xad, 0x90, 0xf5, 0x37, 0xf3, 0x3d, 0x82, 0x69,
-+ 0x40, 0xe9, 0x6b, 0xa7, 0x3d, 0xa8, 0x1e, 0xd2,
-+ 0x02, 0x7c, 0xb7, 0x9b, 0xe4, 0xda, 0x8f, 0x95,
-+ 0x06, 0xc5, 0xdf, 0x73, 0xa3, 0x20, 0x9a, 0x49,
-+ 0xde, 0x9c, 0xbc, 0xee, 0x14, 0x3f, 0x81, 0x5e,
-+ 0xf8, 0x3b, 0x59, 0x3c, 0xe1, 0x68, 0x12, 0x5a,
-+ 0x3a, 0x76, 0x3a, 0x3f, 0xf7, 0x87, 0x33, 0x0a,
-+ 0x01, 0xb8, 0xd4, 0xed, 0xb6, 0xbe, 0x94, 0x5e,
-+ 0x70, 0x40, 0x56, 0x67, 0x1f, 0x50, 0x44, 0x19,
-+ 0xce, 0x82, 0x70, 0x10, 0x87, 0x13, 0x20, 0x0b,
-+ 0x4c, 0x5a, 0xb6, 0xf6, 0xa7, 0xae, 0x81, 0x75,
-+ 0x01, 0x81, 0xe6, 0x4b, 0x57, 0x7c, 0xdd, 0x6d,
-+ 0xf8, 0x1c, 0x29, 0x32, 0xf7, 0xda, 0x3c, 0x2d,
-+ 0xf8, 0x9b, 0x25, 0x6e, 0x00, 0xb4, 0xf7, 0x2f,
-+ 0xf7, 0x04, 0xf7, 0xa1, 0x56, 0xac, 0x4f, 0x1a,
-+ 0x64, 0xb8, 0x47, 0x55, 0x18, 0x7b, 0x07, 0x4d,
-+ 0xbd, 0x47, 0x24, 0x80, 0x5d, 0xa2, 0x70, 0xc5,
-+ 0xdd, 0x8e, 0x82, 0xd4, 0xeb, 0xec, 0xb2, 0x0c,
-+ 0x39, 0xd2, 0x97, 0xc1, 0xcb, 0xeb, 0xf4, 0x77,
-+ 0x59, 0xb4, 0x87, 0xef, 0xcb, 0x43, 0x2d, 0x46,
-+ 0x54, 0xd1, 0xa7, 0xd7, 0x15, 0x99, 0x0a, 0x43,
-+ 0xa1, 0xe0, 0x99, 0x33, 0x71, 0xc1, 0xed, 0xfe,
-+ 0x72, 0x46, 0x33, 0x8e, 0x91, 0x08, 0x9f, 0xc8,
-+ 0x2e, 0xca, 0xfa, 0xdc, 0x59, 0xd5, 0xc3, 0x76,
-+ 0x84, 0x9f, 0xa3, 0x37, 0x68, 0xc3, 0xf0, 0x47,
-+ 0x2c, 0x68, 0xdb, 0x5e, 0xc3, 0x49, 0x4c, 0xe8,
-+ 0x92, 0x85, 0xe2, 0x23, 0xd3, 0x3f, 0xad, 0x32,
-+ 0xe5, 0x2b, 0x82, 0xd7, 0x8f, 0x99, 0x0a, 0x59,
-+ 0x5c, 0x45, 0xd9, 0xb4, 0x51, 0x52, 0xc2, 0xae,
-+ 0xbf, 0x80, 0xcf, 0xc9, 0xc9, 0x51, 0x24, 0x2a,
-+ 0x3b, 0x3a, 0x4d, 0xae, 0xeb, 0xbd, 0x22, 0xc3,
-+ 0x0e, 0x0f, 0x59, 0x25, 0x92, 0x17, 0xe9, 0x74,
-+ 0xc7, 0x8b, 0x70, 0x70, 0x36, 0x55, 0x95, 0x75,
-+ 0x4b, 0xad, 0x61, 0x2b, 0x09, 0xbc, 0x82, 0xf2,
-+ 0x6e, 0x94, 0x43, 0xae, 0xc3, 0xd5, 0xcd, 0x8e,
-+ 0xfe, 0x5b, 0x9a, 0x88, 0x43, 0x01, 0x75, 0xb2,
-+ 0x23, 0x09, 0xf7, 0x89, 0x83, 0xe7, 0xfa, 0xf9,
-+ 0xb4, 0x9b, 0xf8, 0xef, 0xbd, 0x1c, 0x92, 0xc1,
-+ 0xda, 0x7e, 0xfe, 0x05, 0xba, 0x5a, 0xcd, 0x07,
-+ 0x6a, 0x78, 0x9e, 0x5d, 0xfb, 0x11, 0x2f, 0x79,
-+ 0x38, 0xb6, 0xc2, 0x5b, 0x6b, 0x51, 0xb4, 0x71,
-+ 0xdd, 0xf7, 0x2a, 0xe4, 0xf4, 0x72, 0x76, 0xad,
-+ 0xc2, 0xdd, 0x64, 0x5d, 0x79, 0xb6, 0xf5, 0x7a,
-+ 0x77, 0x20, 0x05, 0x3d, 0x30, 0x06, 0xd4, 0x4c,
-+ 0x0a, 0x2c, 0x98, 0x5a, 0xb9, 0xd4, 0x98, 0xa9,
-+ 0x3f, 0xc6, 0x12, 0xea, 0x3b, 0x4b, 0xc5, 0x79,
-+ 0x64, 0x63, 0x6b, 0x09, 0x54, 0x3b, 0x14, 0x27,
-+ 0xba, 0x99, 0x80, 0xc8, 0x72, 0xa8, 0x12, 0x90,
-+ 0x29, 0xba, 0x40, 0x54, 0x97, 0x2b, 0x7b, 0xfe,
-+ 0xeb, 0xcd, 0x01, 0x05, 0x44, 0x72, 0xdb, 0x99,
-+ 0xe4, 0x61, 0xc9, 0x69, 0xd6, 0xb9, 0x28, 0xd1,
-+ 0x05, 0x3e, 0xf9, 0x0b, 0x49, 0x0a, 0x49, 0xe9,
-+ 0x8d, 0x0e, 0xa7, 0x4a, 0x0f, 0xaf, 0x32, 0xd0,
-+ 0xe0, 0xb2, 0x3a, 0x55, 0x58, 0xfe, 0x5c, 0x28,
-+ 0x70, 0x51, 0x23, 0xb0, 0x7b, 0x6a, 0x5f, 0x1e,
-+ 0xb8, 0x17, 0xd7, 0x94, 0x15, 0x8f, 0xee, 0x20,
-+ 0xc7, 0x42, 0x25, 0x3e, 0x9a, 0x14, 0xd7, 0x60,
-+ 0x72, 0x39, 0x47, 0x48, 0xa9, 0xfe, 0xdd, 0x47,
-+ 0x0a, 0xb1, 0xe6, 0x60, 0x28, 0x8c, 0x11, 0x68,
-+ 0xe1, 0xff, 0xd7, 0xce, 0xc8, 0xbe, 0xb3, 0xfe,
-+ 0x27, 0x30, 0x09, 0x70, 0xd7, 0xfa, 0x02, 0x33,
-+ 0x3a, 0x61, 0x2e, 0xc7, 0xff, 0xa4, 0x2a, 0xa8,
-+ 0x6e, 0xb4, 0x79, 0x35, 0x6d, 0x4c, 0x1e, 0x38,
-+ 0xf8, 0xee, 0xd4, 0x84, 0x4e, 0x6e, 0x28, 0xa7,
-+ 0xce, 0xc8, 0xc1, 0xcf, 0x80, 0x05, 0xf3, 0x04,
-+ 0xef, 0xc8, 0x18, 0x28, 0x2e, 0x8d, 0x5e, 0x0c,
-+ 0xdf, 0xb8, 0x5f, 0x96, 0xe8, 0xc6, 0x9c, 0x2f,
-+ 0xe5, 0xa6, 0x44, 0xd7, 0xe7, 0x99, 0x44, 0x0c,
-+ 0xec, 0xd7, 0x05, 0x60, 0x97, 0xbb, 0x74, 0x77,
-+ 0x58, 0xd5, 0xbb, 0x48, 0xde, 0x5a, 0xb2, 0x54,
-+ 0x7f, 0x0e, 0x46, 0x70, 0x6a, 0x6f, 0x78, 0xa5,
-+ 0x08, 0x89, 0x05, 0x4e, 0x7e, 0xa0, 0x69, 0xb4,
-+ 0x40, 0x60, 0x55, 0x77, 0x75, 0x9b, 0x19, 0xf2,
-+ 0xd5, 0x13, 0x80, 0x77, 0xf9, 0x4b, 0x3f, 0x1e,
-+ 0xee, 0xe6, 0x76, 0x84, 0x7b, 0x8c, 0xe5, 0x27,
-+ 0xa8, 0x0a, 0x91, 0x01, 0x68, 0x71, 0x8a, 0x3f,
-+ 0x06, 0xab, 0xf6, 0xa9, 0xa5, 0xe6, 0x72, 0x92,
-+ 0xe4, 0x67, 0xe2, 0xa2, 0x46, 0x35, 0x84, 0x55,
-+ 0x7d, 0xca, 0xa8, 0x85, 0xd0, 0xf1, 0x3f, 0xbe,
-+ 0xd7, 0x34, 0x64, 0xfc, 0xae, 0xe3, 0xe4, 0x04,
-+ 0x9f, 0x66, 0x02, 0xb9, 0x88, 0x10, 0xd9, 0xc4,
-+ 0x4c, 0x31, 0x43, 0x7a, 0x93, 0xe2, 0x9b, 0x56,
-+ 0x43, 0x84, 0xdc, 0xdc, 0xde, 0x1d, 0xa4, 0x02,
-+ 0x0e, 0xc2, 0xef, 0xc3, 0xf8, 0x78, 0xd1, 0xb2,
-+ 0x6b, 0x63, 0x18, 0xc9, 0xa9, 0xe5, 0x72, 0xd8,
-+ 0xf3, 0xb9, 0xd1, 0x8a, 0xc7, 0x1a, 0x02, 0x27,
-+ 0x20, 0x77, 0x10, 0xe5, 0xc8, 0xd4, 0x4a, 0x47,
-+ 0xe5, 0xdf, 0x5f, 0x01, 0xaa, 0xb0, 0xd4, 0x10,
-+ 0xbb, 0x69, 0xe3, 0x36, 0xc8, 0xe1, 0x3d, 0x43,
-+ 0xfb, 0x86, 0xcd, 0xcc, 0xbf, 0xf4, 0x88, 0xe0,
-+ 0x20, 0xca, 0xb7, 0x1b, 0xf1, 0x2f, 0x5c, 0xee,
-+ 0xd4, 0xd3, 0xa3, 0xcc, 0xa4, 0x1e, 0x1c, 0x47,
-+ 0xfb, 0xbf, 0xfc, 0xa2, 0x41, 0x55, 0x9d, 0xf6,
-+ 0x5a, 0x5e, 0x65, 0x32, 0x34, 0x7b, 0x52, 0x8d,
-+ 0xd5, 0xd0, 0x20, 0x60, 0x03, 0xab, 0x3f, 0x8c,
-+ 0xd4, 0x21, 0xea, 0x2a, 0xd9, 0xc4, 0xd0, 0xd3,
-+ 0x65, 0xd8, 0x7a, 0x13, 0x28, 0x62, 0x32, 0x4b,
-+ 0x2c, 0x87, 0x93, 0xa8, 0xb4, 0x52, 0x45, 0x09,
-+ 0x44, 0xec, 0xec, 0xc3, 0x17, 0xdb, 0x9a, 0x4d,
-+ 0x5c, 0xa9, 0x11, 0xd4, 0x7d, 0xaf, 0x9e, 0xf1,
-+ 0x2d, 0xb2, 0x66, 0xc5, 0x1d, 0xed, 0xb7, 0xcd,
-+ 0x0b, 0x25, 0x5e, 0x30, 0x47, 0x3f, 0x40, 0xf4,
-+ 0xa1, 0xa0, 0x00, 0x94, 0x10, 0xc5, 0x6a, 0x63,
-+ 0x1a, 0xd5, 0x88, 0x92, 0x8e, 0x82, 0x39, 0x87,
-+ 0x3c, 0x78, 0x65, 0x58, 0x42, 0x75, 0x5b, 0xdd,
-+ 0x77, 0x3e, 0x09, 0x4e, 0x76, 0x5b, 0xe6, 0x0e,
-+ 0x4d, 0x38, 0xb2, 0xc0, 0xb8, 0x95, 0x01, 0x7a,
-+ 0x10, 0xe0, 0xfb, 0x07, 0xf2, 0xab, 0x2d, 0x8c,
-+ 0x32, 0xed, 0x2b, 0xc0, 0x46, 0xc2, 0xf5, 0x38,
-+ 0x83, 0xf0, 0x17, 0xec, 0xc1, 0x20, 0x6a, 0x9a,
-+ 0x0b, 0x00, 0xa0, 0x98, 0x22, 0x50, 0x23, 0xd5,
-+ 0x80, 0x6b, 0xf6, 0x1f, 0xc3, 0xcc, 0x97, 0xc9,
-+ 0x24, 0x9f, 0xf3, 0xaf, 0x43, 0x14, 0xd5, 0xa0
-+};
-+static const u8 enc_assoc010[] __initconst = {
-+ 0xd2, 0xa1, 0x70, 0xdb, 0x7a, 0xf8, 0xfa, 0x27,
-+ 0xba, 0x73, 0x0f, 0xbf, 0x3d, 0x1e, 0x82, 0xb2
-+};
-+static const u8 enc_nonce010[] __initconst = {
-+ 0xdb, 0x92, 0x0f, 0x7f, 0x17, 0x54, 0x0c, 0x30
-+};
-+static const u8 enc_key010[] __initconst = {
-+ 0x47, 0x11, 0xeb, 0x86, 0x2b, 0x2c, 0xab, 0x44,
-+ 0x34, 0xda, 0x7f, 0x57, 0x03, 0x39, 0x0c, 0xaf,
-+ 0x2c, 0x14, 0xfd, 0x65, 0x23, 0xe9, 0x8e, 0x74,
-+ 0xd5, 0x08, 0x68, 0x08, 0xe7, 0xb4, 0x72, 0xd7
-+};
-+
-+static const u8 enc_input011[] __initconst = {
-+ 0x7a, 0x57, 0xf2, 0xc7, 0x06, 0x3f, 0x50, 0x7b,
-+ 0x36, 0x1a, 0x66, 0x5c, 0xb9, 0x0e, 0x5e, 0x3b,
-+ 0x45, 0x60, 0xbe, 0x9a, 0x31, 0x9f, 0xff, 0x5d,
-+ 0x66, 0x34, 0xb4, 0xdc, 0xfb, 0x9d, 0x8e, 0xee,
-+ 0x6a, 0x33, 0xa4, 0x07, 0x3c, 0xf9, 0x4c, 0x30,
-+ 0xa1, 0x24, 0x52, 0xf9, 0x50, 0x46, 0x88, 0x20,
-+ 0x02, 0x32, 0x3a, 0x0e, 0x99, 0x63, 0xaf, 0x1f,
-+ 0x15, 0x28, 0x2a, 0x05, 0xff, 0x57, 0x59, 0x5e,
-+ 0x18, 0xa1, 0x1f, 0xd0, 0x92, 0x5c, 0x88, 0x66,
-+ 0x1b, 0x00, 0x64, 0xa5, 0x93, 0x8d, 0x06, 0x46,
-+ 0xb0, 0x64, 0x8b, 0x8b, 0xef, 0x99, 0x05, 0x35,
-+ 0x85, 0xb3, 0xf3, 0x33, 0xbb, 0xec, 0x66, 0xb6,
-+ 0x3d, 0x57, 0x42, 0xe3, 0xb4, 0xc6, 0xaa, 0xb0,
-+ 0x41, 0x2a, 0xb9, 0x59, 0xa9, 0xf6, 0x3e, 0x15,
-+ 0x26, 0x12, 0x03, 0x21, 0x4c, 0x74, 0x43, 0x13,
-+ 0x2a, 0x03, 0x27, 0x09, 0xb4, 0xfb, 0xe7, 0xb7,
-+ 0x40, 0xff, 0x5e, 0xce, 0x48, 0x9a, 0x60, 0xe3,
-+ 0x8b, 0x80, 0x8c, 0x38, 0x2d, 0xcb, 0x93, 0x37,
-+ 0x74, 0x05, 0x52, 0x6f, 0x73, 0x3e, 0xc3, 0xbc,
-+ 0xca, 0x72, 0x0a, 0xeb, 0xf1, 0x3b, 0xa0, 0x95,
-+ 0xdc, 0x8a, 0xc4, 0xa9, 0xdc, 0xca, 0x44, 0xd8,
-+ 0x08, 0x63, 0x6a, 0x36, 0xd3, 0x3c, 0xb8, 0xac,
-+ 0x46, 0x7d, 0xfd, 0xaa, 0xeb, 0x3e, 0x0f, 0x45,
-+ 0x8f, 0x49, 0xda, 0x2b, 0xf2, 0x12, 0xbd, 0xaf,
-+ 0x67, 0x8a, 0x63, 0x48, 0x4b, 0x55, 0x5f, 0x6d,
-+ 0x8c, 0xb9, 0x76, 0x34, 0x84, 0xae, 0xc2, 0xfc,
-+ 0x52, 0x64, 0x82, 0xf7, 0xb0, 0x06, 0xf0, 0x45,
-+ 0x73, 0x12, 0x50, 0x30, 0x72, 0xea, 0x78, 0x9a,
-+ 0xa8, 0xaf, 0xb5, 0xe3, 0xbb, 0x77, 0x52, 0xec,
-+ 0x59, 0x84, 0xbf, 0x6b, 0x8f, 0xce, 0x86, 0x5e,
-+ 0x1f, 0x23, 0xe9, 0xfb, 0x08, 0x86, 0xf7, 0x10,
-+ 0xb9, 0xf2, 0x44, 0x96, 0x44, 0x63, 0xa9, 0xa8,
-+ 0x78, 0x00, 0x23, 0xd6, 0xc7, 0xe7, 0x6e, 0x66,
-+ 0x4f, 0xcc, 0xee, 0x15, 0xb3, 0xbd, 0x1d, 0xa0,
-+ 0xe5, 0x9c, 0x1b, 0x24, 0x2c, 0x4d, 0x3c, 0x62,
-+ 0x35, 0x9c, 0x88, 0x59, 0x09, 0xdd, 0x82, 0x1b,
-+ 0xcf, 0x0a, 0x83, 0x6b, 0x3f, 0xae, 0x03, 0xc4,
-+ 0xb4, 0xdd, 0x7e, 0x5b, 0x28, 0x76, 0x25, 0x96,
-+ 0xd9, 0xc9, 0x9d, 0x5f, 0x86, 0xfa, 0xf6, 0xd7,
-+ 0xd2, 0xe6, 0x76, 0x1d, 0x0f, 0xa1, 0xdc, 0x74,
-+ 0x05, 0x1b, 0x1d, 0xe0, 0xcd, 0x16, 0xb0, 0xa8,
-+ 0x8a, 0x34, 0x7b, 0x15, 0x11, 0x77, 0xe5, 0x7b,
-+ 0x7e, 0x20, 0xf7, 0xda, 0x38, 0xda, 0xce, 0x70,
-+ 0xe9, 0xf5, 0x6c, 0xd9, 0xbe, 0x0c, 0x4c, 0x95,
-+ 0x4c, 0xc2, 0x9b, 0x34, 0x55, 0x55, 0xe1, 0xf3,
-+ 0x46, 0x8e, 0x48, 0x74, 0x14, 0x4f, 0x9d, 0xc9,
-+ 0xf5, 0xe8, 0x1a, 0xf0, 0x11, 0x4a, 0xc1, 0x8d,
-+ 0xe0, 0x93, 0xa0, 0xbe, 0x09, 0x1c, 0x2b, 0x4e,
-+ 0x0f, 0xb2, 0x87, 0x8b, 0x84, 0xfe, 0x92, 0x32,
-+ 0x14, 0xd7, 0x93, 0xdf, 0xe7, 0x44, 0xbc, 0xc5,
-+ 0xae, 0x53, 0x69, 0xd8, 0xb3, 0x79, 0x37, 0x80,
-+ 0xe3, 0x17, 0x5c, 0xec, 0x53, 0x00, 0x9a, 0xe3,
-+ 0x8e, 0xdc, 0x38, 0xb8, 0x66, 0xf0, 0xd3, 0xad,
-+ 0x1d, 0x02, 0x96, 0x86, 0x3e, 0x9d, 0x3b, 0x5d,
-+ 0xa5, 0x7f, 0x21, 0x10, 0xf1, 0x1f, 0x13, 0x20,
-+ 0xf9, 0x57, 0x87, 0x20, 0xf5, 0x5f, 0xf1, 0x17,
-+ 0x48, 0x0a, 0x51, 0x5a, 0xcd, 0x19, 0x03, 0xa6,
-+ 0x5a, 0xd1, 0x12, 0x97, 0xe9, 0x48, 0xe2, 0x1d,
-+ 0x83, 0x75, 0x50, 0xd9, 0x75, 0x7d, 0x6a, 0x82,
-+ 0xa1, 0xf9, 0x4e, 0x54, 0x87, 0x89, 0xc9, 0x0c,
-+ 0xb7, 0x5b, 0x6a, 0x91, 0xc1, 0x9c, 0xb2, 0xa9,
-+ 0xdc, 0x9a, 0xa4, 0x49, 0x0a, 0x6d, 0x0d, 0xbb,
-+ 0xde, 0x86, 0x44, 0xdd, 0x5d, 0x89, 0x2b, 0x96,
-+ 0x0f, 0x23, 0x95, 0xad, 0xcc, 0xa2, 0xb3, 0xb9,
-+ 0x7e, 0x74, 0x38, 0xba, 0x9f, 0x73, 0xae, 0x5f,
-+ 0xf8, 0x68, 0xa2, 0xe0, 0xa9, 0xce, 0xbd, 0x40,
-+ 0xd4, 0x4c, 0x6b, 0xd2, 0x56, 0x62, 0xb0, 0xcc,
-+ 0x63, 0x7e, 0x5b, 0xd3, 0xae, 0xd1, 0x75, 0xce,
-+ 0xbb, 0xb4, 0x5b, 0xa8, 0xf8, 0xb4, 0xac, 0x71,
-+ 0x75, 0xaa, 0xc9, 0x9f, 0xbb, 0x6c, 0xad, 0x0f,
-+ 0x55, 0x5d, 0xe8, 0x85, 0x7d, 0xf9, 0x21, 0x35,
-+ 0xea, 0x92, 0x85, 0x2b, 0x00, 0xec, 0x84, 0x90,
-+ 0x0a, 0x63, 0x96, 0xe4, 0x6b, 0xa9, 0x77, 0xb8,
-+ 0x91, 0xf8, 0x46, 0x15, 0x72, 0x63, 0x70, 0x01,
-+ 0x40, 0xa3, 0xa5, 0x76, 0x62, 0x2b, 0xbf, 0xf1,
-+ 0xe5, 0x8d, 0x9f, 0xa3, 0xfa, 0x9b, 0x03, 0xbe,
-+ 0xfe, 0x65, 0x6f, 0xa2, 0x29, 0x0d, 0x54, 0xb4,
-+ 0x71, 0xce, 0xa9, 0xd6, 0x3d, 0x88, 0xf9, 0xaf,
-+ 0x6b, 0xa8, 0x9e, 0xf4, 0x16, 0x96, 0x36, 0xb9,
-+ 0x00, 0xdc, 0x10, 0xab, 0xb5, 0x08, 0x31, 0x1f,
-+ 0x00, 0xb1, 0x3c, 0xd9, 0x38, 0x3e, 0xc6, 0x04,
-+ 0xa7, 0x4e, 0xe8, 0xae, 0xed, 0x98, 0xc2, 0xf7,
-+ 0xb9, 0x00, 0x5f, 0x8c, 0x60, 0xd1, 0xe5, 0x15,
-+ 0xf7, 0xae, 0x1e, 0x84, 0x88, 0xd1, 0xf6, 0xbc,
-+ 0x3a, 0x89, 0x35, 0x22, 0x83, 0x7c, 0xca, 0xf0,
-+ 0x33, 0x82, 0x4c, 0x79, 0x3c, 0xfd, 0xb1, 0xae,
-+ 0x52, 0x62, 0x55, 0xd2, 0x41, 0x60, 0xc6, 0xbb,
-+ 0xfa, 0x0e, 0x59, 0xd6, 0xa8, 0xfe, 0x5d, 0xed,
-+ 0x47, 0x3d, 0xe0, 0xea, 0x1f, 0x6e, 0x43, 0x51,
-+ 0xec, 0x10, 0x52, 0x56, 0x77, 0x42, 0x6b, 0x52,
-+ 0x87, 0xd8, 0xec, 0xe0, 0xaa, 0x76, 0xa5, 0x84,
-+ 0x2a, 0x22, 0x24, 0xfd, 0x92, 0x40, 0x88, 0xd5,
-+ 0x85, 0x1c, 0x1f, 0x6b, 0x47, 0xa0, 0xc4, 0xe4,
-+ 0xef, 0xf4, 0xea, 0xd7, 0x59, 0xac, 0x2a, 0x9e,
-+ 0x8c, 0xfa, 0x1f, 0x42, 0x08, 0xfe, 0x4f, 0x74,
-+ 0xa0, 0x26, 0xf5, 0xb3, 0x84, 0xf6, 0x58, 0x5f,
-+ 0x26, 0x66, 0x3e, 0xd7, 0xe4, 0x22, 0x91, 0x13,
-+ 0xc8, 0xac, 0x25, 0x96, 0x23, 0xd8, 0x09, 0xea,
-+ 0x45, 0x75, 0x23, 0xb8, 0x5f, 0xc2, 0x90, 0x8b,
-+ 0x09, 0xc4, 0xfc, 0x47, 0x6c, 0x6d, 0x0a, 0xef,
-+ 0x69, 0xa4, 0x38, 0x19, 0xcf, 0x7d, 0xf9, 0x09,
-+ 0x73, 0x9b, 0x60, 0x5a, 0xf7, 0x37, 0xb5, 0xfe,
-+ 0x9f, 0xe3, 0x2b, 0x4c, 0x0d, 0x6e, 0x19, 0xf1,
-+ 0xd6, 0xc0, 0x70, 0xf3, 0x9d, 0x22, 0x3c, 0xf9,
-+ 0x49, 0xce, 0x30, 0x8e, 0x44, 0xb5, 0x76, 0x15,
-+ 0x8f, 0x52, 0xfd, 0xa5, 0x04, 0xb8, 0x55, 0x6a,
-+ 0x36, 0x59, 0x7c, 0xc4, 0x48, 0xb8, 0xd7, 0xab,
-+ 0x05, 0x66, 0xe9, 0x5e, 0x21, 0x6f, 0x6b, 0x36,
-+ 0x29, 0xbb, 0xe9, 0xe3, 0xa2, 0x9a, 0xa8, 0xcd,
-+ 0x55, 0x25, 0x11, 0xba, 0x5a, 0x58, 0xa0, 0xde,
-+ 0xae, 0x19, 0x2a, 0x48, 0x5a, 0xff, 0x36, 0xcd,
-+ 0x6d, 0x16, 0x7a, 0x73, 0x38, 0x46, 0xe5, 0x47,
-+ 0x59, 0xc8, 0xa2, 0xf6, 0xe2, 0x6c, 0x83, 0xc5,
-+ 0x36, 0x2c, 0x83, 0x7d, 0xb4, 0x01, 0x05, 0x69,
-+ 0xe7, 0xaf, 0x5c, 0xc4, 0x64, 0x82, 0x12, 0x21,
-+ 0xef, 0xf7, 0xd1, 0x7d, 0xb8, 0x8d, 0x8c, 0x98,
-+ 0x7c, 0x5f, 0x7d, 0x92, 0x88, 0xb9, 0x94, 0x07,
-+ 0x9c, 0xd8, 0xe9, 0x9c, 0x17, 0x38, 0xe3, 0x57,
-+ 0x6c, 0xe0, 0xdc, 0xa5, 0x92, 0x42, 0xb3, 0xbd,
-+ 0x50, 0xa2, 0x7e, 0xb5, 0xb1, 0x52, 0x72, 0x03,
-+ 0x97, 0xd8, 0xaa, 0x9a, 0x1e, 0x75, 0x41, 0x11,
-+ 0xa3, 0x4f, 0xcc, 0xd4, 0xe3, 0x73, 0xad, 0x96,
-+ 0xdc, 0x47, 0x41, 0x9f, 0xb0, 0xbe, 0x79, 0x91,
-+ 0xf5, 0xb6, 0x18, 0xfe, 0xc2, 0x83, 0x18, 0x7d,
-+ 0x73, 0xd9, 0x4f, 0x83, 0x84, 0x03, 0xb3, 0xf0,
-+ 0x77, 0x66, 0x3d, 0x83, 0x63, 0x2e, 0x2c, 0xf9,
-+ 0xdd, 0xa6, 0x1f, 0x89, 0x82, 0xb8, 0x23, 0x42,
-+ 0xeb, 0xe2, 0xca, 0x70, 0x82, 0x61, 0x41, 0x0a,
-+ 0x6d, 0x5f, 0x75, 0xc5, 0xe2, 0xc4, 0x91, 0x18,
-+ 0x44, 0x22, 0xfa, 0x34, 0x10, 0xf5, 0x20, 0xdc,
-+ 0xb7, 0xdd, 0x2a, 0x20, 0x77, 0xf5, 0xf9, 0xce,
-+ 0xdb, 0xa0, 0x0a, 0x52, 0x2a, 0x4e, 0xdd, 0xcc,
-+ 0x97, 0xdf, 0x05, 0xe4, 0x5e, 0xb7, 0xaa, 0xf0,
-+ 0xe2, 0x80, 0xff, 0xba, 0x1a, 0x0f, 0xac, 0xdf,
-+ 0x02, 0x32, 0xe6, 0xf7, 0xc7, 0x17, 0x13, 0xb7,
-+ 0xfc, 0x98, 0x48, 0x8c, 0x0d, 0x82, 0xc9, 0x80,
-+ 0x7a, 0xe2, 0x0a, 0xc5, 0xb4, 0xde, 0x7c, 0x3c,
-+ 0x79, 0x81, 0x0e, 0x28, 0x65, 0x79, 0x67, 0x82,
-+ 0x69, 0x44, 0x66, 0x09, 0xf7, 0x16, 0x1a, 0xf9,
-+ 0x7d, 0x80, 0xa1, 0x79, 0x14, 0xa9, 0xc8, 0x20,
-+ 0xfb, 0xa2, 0x46, 0xbe, 0x08, 0x35, 0x17, 0x58,
-+ 0xc1, 0x1a, 0xda, 0x2a, 0x6b, 0x2e, 0x1e, 0xe6,
-+ 0x27, 0x55, 0x7b, 0x19, 0xe2, 0xfb, 0x64, 0xfc,
-+ 0x5e, 0x15, 0x54, 0x3c, 0xe7, 0xc2, 0x11, 0x50,
-+ 0x30, 0xb8, 0x72, 0x03, 0x0b, 0x1a, 0x9f, 0x86,
-+ 0x27, 0x11, 0x5c, 0x06, 0x2b, 0xbd, 0x75, 0x1a,
-+ 0x0a, 0xda, 0x01, 0xfa, 0x5c, 0x4a, 0xc1, 0x80,
-+ 0x3a, 0x6e, 0x30, 0xc8, 0x2c, 0xeb, 0x56, 0xec,
-+ 0x89, 0xfa, 0x35, 0x7b, 0xb2, 0xf0, 0x97, 0x08,
-+ 0x86, 0x53, 0xbe, 0xbd, 0x40, 0x41, 0x38, 0x1c,
-+ 0xb4, 0x8b, 0x79, 0x2e, 0x18, 0x96, 0x94, 0xde,
-+ 0xe8, 0xca, 0xe5, 0x9f, 0x92, 0x9f, 0x15, 0x5d,
-+ 0x56, 0x60, 0x5c, 0x09, 0xf9, 0x16, 0xf4, 0x17,
-+ 0x0f, 0xf6, 0x4c, 0xda, 0xe6, 0x67, 0x89, 0x9f,
-+ 0xca, 0x6c, 0xe7, 0x9b, 0x04, 0x62, 0x0e, 0x26,
-+ 0xa6, 0x52, 0xbd, 0x29, 0xff, 0xc7, 0xa4, 0x96,
-+ 0xe6, 0x6a, 0x02, 0xa5, 0x2e, 0x7b, 0xfe, 0x97,
-+ 0x68, 0x3e, 0x2e, 0x5f, 0x3b, 0x0f, 0x36, 0xd6,
-+ 0x98, 0x19, 0x59, 0x48, 0xd2, 0xc6, 0xe1, 0x55,
-+ 0x1a, 0x6e, 0xd6, 0xed, 0x2c, 0xba, 0xc3, 0x9e,
-+ 0x64, 0xc9, 0x95, 0x86, 0x35, 0x5e, 0x3e, 0x88,
-+ 0x69, 0x99, 0x4b, 0xee, 0xbe, 0x9a, 0x99, 0xb5,
-+ 0x6e, 0x58, 0xae, 0xdd, 0x22, 0xdb, 0xdd, 0x6b,
-+ 0xfc, 0xaf, 0x90, 0xa3, 0x3d, 0xa4, 0xc1, 0x15,
-+ 0x92, 0x18, 0x8d, 0xd2, 0x4b, 0x7b, 0x06, 0xd1,
-+ 0x37, 0xb5, 0xe2, 0x7c, 0x2c, 0xf0, 0x25, 0xe4,
-+ 0x94, 0x2a, 0xbd, 0xe3, 0x82, 0x70, 0x78, 0xa3,
-+ 0x82, 0x10, 0x5a, 0x90, 0xd7, 0xa4, 0xfa, 0xaf,
-+ 0x1a, 0x88, 0x59, 0xdc, 0x74, 0x12, 0xb4, 0x8e,
-+ 0xd7, 0x19, 0x46, 0xf4, 0x84, 0x69, 0x9f, 0xbb,
-+ 0x70, 0xa8, 0x4c, 0x52, 0x81, 0xa9, 0xff, 0x76,
-+ 0x1c, 0xae, 0xd8, 0x11, 0x3d, 0x7f, 0x7d, 0xc5,
-+ 0x12, 0x59, 0x28, 0x18, 0xc2, 0xa2, 0xb7, 0x1c,
-+ 0x88, 0xf8, 0xd6, 0x1b, 0xa6, 0x7d, 0x9e, 0xde,
-+ 0x29, 0xf8, 0xed, 0xff, 0xeb, 0x92, 0x24, 0x4f,
-+ 0x05, 0xaa, 0xd9, 0x49, 0xba, 0x87, 0x59, 0x51,
-+ 0xc9, 0x20, 0x5c, 0x9b, 0x74, 0xcf, 0x03, 0xd9,
-+ 0x2d, 0x34, 0xc7, 0x5b, 0xa5, 0x40, 0xb2, 0x99,
-+ 0xf5, 0xcb, 0xb4, 0xf6, 0xb7, 0x72, 0x4a, 0xd6,
-+ 0xbd, 0xb0, 0xf3, 0x93, 0xe0, 0x1b, 0xa8, 0x04,
-+ 0x1e, 0x35, 0xd4, 0x80, 0x20, 0xf4, 0x9c, 0x31,
-+ 0x6b, 0x45, 0xb9, 0x15, 0xb0, 0x5e, 0xdd, 0x0a,
-+ 0x33, 0x9c, 0x83, 0xcd, 0x58, 0x89, 0x50, 0x56,
-+ 0xbb, 0x81, 0x00, 0x91, 0x32, 0xf3, 0x1b, 0x3e,
-+ 0xcf, 0x45, 0xe1, 0xf9, 0xe1, 0x2c, 0x26, 0x78,
-+ 0x93, 0x9a, 0x60, 0x46, 0xc9, 0xb5, 0x5e, 0x6a,
-+ 0x28, 0x92, 0x87, 0x3f, 0x63, 0x7b, 0xdb, 0xf7,
-+ 0xd0, 0x13, 0x9d, 0x32, 0x40, 0x5e, 0xcf, 0xfb,
-+ 0x79, 0x68, 0x47, 0x4c, 0xfd, 0x01, 0x17, 0xe6,
-+ 0x97, 0x93, 0x78, 0xbb, 0xa6, 0x27, 0xa3, 0xe8,
-+ 0x1a, 0xe8, 0x94, 0x55, 0x7d, 0x08, 0xe5, 0xdc,
-+ 0x66, 0xa3, 0x69, 0xc8, 0xca, 0xc5, 0xa1, 0x84,
-+ 0x55, 0xde, 0x08, 0x91, 0x16, 0x3a, 0x0c, 0x86,
-+ 0xab, 0x27, 0x2b, 0x64, 0x34, 0x02, 0x6c, 0x76,
-+ 0x8b, 0xc6, 0xaf, 0xcc, 0xe1, 0xd6, 0x8c, 0x2a,
-+ 0x18, 0x3d, 0xa6, 0x1b, 0x37, 0x75, 0x45, 0x73,
-+ 0xc2, 0x75, 0xd7, 0x53, 0x78, 0x3a, 0xd6, 0xe8,
-+ 0x29, 0xd2, 0x4a, 0xa8, 0x1e, 0x82, 0xf6, 0xb6,
-+ 0x81, 0xde, 0x21, 0xed, 0x2b, 0x56, 0xbb, 0xf2,
-+ 0xd0, 0x57, 0xc1, 0x7c, 0xd2, 0x6a, 0xd2, 0x56,
-+ 0xf5, 0x13, 0x5f, 0x1c, 0x6a, 0x0b, 0x74, 0xfb,
-+ 0xe9, 0xfe, 0x9e, 0xea, 0x95, 0xb2, 0x46, 0xab,
-+ 0x0a, 0xfc, 0xfd, 0xf3, 0xbb, 0x04, 0x2b, 0x76,
-+ 0x1b, 0xa4, 0x74, 0xb0, 0xc1, 0x78, 0xc3, 0x69,
-+ 0xe2, 0xb0, 0x01, 0xe1, 0xde, 0x32, 0x4c, 0x8d,
-+ 0x1a, 0xb3, 0x38, 0x08, 0xd5, 0xfc, 0x1f, 0xdc,
-+ 0x0e, 0x2c, 0x9c, 0xb1, 0xa1, 0x63, 0x17, 0x22,
-+ 0xf5, 0x6c, 0x93, 0x70, 0x74, 0x00, 0xf8, 0x39,
-+ 0x01, 0x94, 0xd1, 0x32, 0x23, 0x56, 0x5d, 0xa6,
-+ 0x02, 0x76, 0x76, 0x93, 0xce, 0x2f, 0x19, 0xe9,
-+ 0x17, 0x52, 0xae, 0x6e, 0x2c, 0x6d, 0x61, 0x7f,
-+ 0x3b, 0xaa, 0xe0, 0x52, 0x85, 0xc5, 0x65, 0xc1,
-+ 0xbb, 0x8e, 0x5b, 0x21, 0xd5, 0xc9, 0x78, 0x83,
-+ 0x07, 0x97, 0x4c, 0x62, 0x61, 0x41, 0xd4, 0xfc,
-+ 0xc9, 0x39, 0xe3, 0x9b, 0xd0, 0xcc, 0x75, 0xc4,
-+ 0x97, 0xe6, 0xdd, 0x2a, 0x5f, 0xa6, 0xe8, 0x59,
-+ 0x6c, 0x98, 0xb9, 0x02, 0xe2, 0xa2, 0xd6, 0x68,
-+ 0xee, 0x3b, 0x1d, 0xe3, 0x4d, 0x5b, 0x30, 0xef,
-+ 0x03, 0xf2, 0xeb, 0x18, 0x57, 0x36, 0xe8, 0xa1,
-+ 0xf4, 0x47, 0xfb, 0xcb, 0x8f, 0xcb, 0xc8, 0xf3,
-+ 0x4f, 0x74, 0x9d, 0x9d, 0xb1, 0x8d, 0x14, 0x44,
-+ 0xd9, 0x19, 0xb4, 0x54, 0x4f, 0x75, 0x19, 0x09,
-+ 0xa0, 0x75, 0xbc, 0x3b, 0x82, 0xc6, 0x3f, 0xb8,
-+ 0x83, 0x19, 0x6e, 0xd6, 0x37, 0xfe, 0x6e, 0x8a,
-+ 0x4e, 0xe0, 0x4a, 0xab, 0x7b, 0xc8, 0xb4, 0x1d,
-+ 0xf4, 0xed, 0x27, 0x03, 0x65, 0xa2, 0xa1, 0xae,
-+ 0x11, 0xe7, 0x98, 0x78, 0x48, 0x91, 0xd2, 0xd2,
-+ 0xd4, 0x23, 0x78, 0x50, 0xb1, 0x5b, 0x85, 0x10,
-+ 0x8d, 0xca, 0x5f, 0x0f, 0x71, 0xae, 0x72, 0x9a,
-+ 0xf6, 0x25, 0x19, 0x60, 0x06, 0xf7, 0x10, 0x34,
-+ 0x18, 0x0d, 0xc9, 0x9f, 0x7b, 0x0c, 0x9b, 0x8f,
-+ 0x91, 0x1b, 0x9f, 0xcd, 0x10, 0xee, 0x75, 0xf9,
-+ 0x97, 0x66, 0xfc, 0x4d, 0x33, 0x6e, 0x28, 0x2b,
-+ 0x92, 0x85, 0x4f, 0xab, 0x43, 0x8d, 0x8f, 0x7d,
-+ 0x86, 0xa7, 0xc7, 0xd8, 0xd3, 0x0b, 0x8b, 0x57,
-+ 0xb6, 0x1d, 0x95, 0x0d, 0xe9, 0xbc, 0xd9, 0x03,
-+ 0xd9, 0x10, 0x19, 0xc3, 0x46, 0x63, 0x55, 0x87,
-+ 0x61, 0x79, 0x6c, 0x95, 0x0e, 0x9c, 0xdd, 0xca,
-+ 0xc3, 0xf3, 0x64, 0xf0, 0x7d, 0x76, 0xb7, 0x53,
-+ 0x67, 0x2b, 0x1e, 0x44, 0x56, 0x81, 0xea, 0x8f,
-+ 0x5c, 0x42, 0x16, 0xb8, 0x28, 0xeb, 0x1b, 0x61,
-+ 0x10, 0x1e, 0xbf, 0xec, 0xa8
-+};
-+static const u8 enc_output011[] __initconst = {
-+ 0x6a, 0xfc, 0x4b, 0x25, 0xdf, 0xc0, 0xe4, 0xe8,
-+ 0x17, 0x4d, 0x4c, 0xc9, 0x7e, 0xde, 0x3a, 0xcc,
-+ 0x3c, 0xba, 0x6a, 0x77, 0x47, 0xdb, 0xe3, 0x74,
-+ 0x7a, 0x4d, 0x5f, 0x8d, 0x37, 0x55, 0x80, 0x73,
-+ 0x90, 0x66, 0x5d, 0x3a, 0x7d, 0x5d, 0x86, 0x5e,
-+ 0x8d, 0xfd, 0x83, 0xff, 0x4e, 0x74, 0x6f, 0xf9,
-+ 0xe6, 0x70, 0x17, 0x70, 0x3e, 0x96, 0xa7, 0x7e,
-+ 0xcb, 0xab, 0x8f, 0x58, 0x24, 0x9b, 0x01, 0xfd,
-+ 0xcb, 0xe6, 0x4d, 0x9b, 0xf0, 0x88, 0x94, 0x57,
-+ 0x66, 0xef, 0x72, 0x4c, 0x42, 0x6e, 0x16, 0x19,
-+ 0x15, 0xea, 0x70, 0x5b, 0xac, 0x13, 0xdb, 0x9f,
-+ 0x18, 0xe2, 0x3c, 0x26, 0x97, 0xbc, 0xdc, 0x45,
-+ 0x8c, 0x6c, 0x24, 0x69, 0x9c, 0xf7, 0x65, 0x1e,
-+ 0x18, 0x59, 0x31, 0x7c, 0xe4, 0x73, 0xbc, 0x39,
-+ 0x62, 0xc6, 0x5c, 0x9f, 0xbf, 0xfa, 0x90, 0x03,
-+ 0xc9, 0x72, 0x26, 0xb6, 0x1b, 0xc2, 0xb7, 0x3f,
-+ 0xf2, 0x13, 0x77, 0xf2, 0x8d, 0xb9, 0x47, 0xd0,
-+ 0x53, 0xdd, 0xc8, 0x91, 0x83, 0x8b, 0xb1, 0xce,
-+ 0xa3, 0xfe, 0xcd, 0xd9, 0xdd, 0x92, 0x7b, 0xdb,
-+ 0xb8, 0xfb, 0xc9, 0x2d, 0x01, 0x59, 0x39, 0x52,
-+ 0xad, 0x1b, 0xec, 0xcf, 0xd7, 0x70, 0x13, 0x21,
-+ 0xf5, 0x47, 0xaa, 0x18, 0x21, 0x5c, 0xc9, 0x9a,
-+ 0xd2, 0x6b, 0x05, 0x9c, 0x01, 0xa1, 0xda, 0x35,
-+ 0x5d, 0xb3, 0x70, 0xe6, 0xa9, 0x80, 0x8b, 0x91,
-+ 0xb7, 0xb3, 0x5f, 0x24, 0x9a, 0xb7, 0xd1, 0x6b,
-+ 0xa1, 0x1c, 0x50, 0xba, 0x49, 0xe0, 0xee, 0x2e,
-+ 0x75, 0xac, 0x69, 0xc0, 0xeb, 0x03, 0xdd, 0x19,
-+ 0xe5, 0xf6, 0x06, 0xdd, 0xc3, 0xd7, 0x2b, 0x07,
-+ 0x07, 0x30, 0xa7, 0x19, 0x0c, 0xbf, 0xe6, 0x18,
-+ 0xcc, 0xb1, 0x01, 0x11, 0x85, 0x77, 0x1d, 0x96,
-+ 0xa7, 0xa3, 0x00, 0x84, 0x02, 0xa2, 0x83, 0x68,
-+ 0xda, 0x17, 0x27, 0xc8, 0x7f, 0x23, 0xb7, 0xf4,
-+ 0x13, 0x85, 0xcf, 0xdd, 0x7a, 0x7d, 0x24, 0x57,
-+ 0xfe, 0x05, 0x93, 0xf5, 0x74, 0xce, 0xed, 0x0c,
-+ 0x20, 0x98, 0x8d, 0x92, 0x30, 0xa1, 0x29, 0x23,
-+ 0x1a, 0xa0, 0x4f, 0x69, 0x56, 0x4c, 0xe1, 0xc8,
-+ 0xce, 0xf6, 0x9a, 0x0c, 0xa4, 0xfa, 0x04, 0xf6,
-+ 0x62, 0x95, 0xf2, 0xfa, 0xc7, 0x40, 0x68, 0x40,
-+ 0x8f, 0x41, 0xda, 0xb4, 0x26, 0x6f, 0x70, 0xab,
-+ 0x40, 0x61, 0xa4, 0x0e, 0x75, 0xfb, 0x86, 0xeb,
-+ 0x9d, 0x9a, 0x1f, 0xec, 0x76, 0x99, 0xe7, 0xea,
-+ 0xaa, 0x1e, 0x2d, 0xb5, 0xd4, 0xa6, 0x1a, 0xb8,
-+ 0x61, 0x0a, 0x1d, 0x16, 0x5b, 0x98, 0xc2, 0x31,
-+ 0x40, 0xe7, 0x23, 0x1d, 0x66, 0x99, 0xc8, 0xc0,
-+ 0xd7, 0xce, 0xf3, 0x57, 0x40, 0x04, 0x3f, 0xfc,
-+ 0xea, 0xb3, 0xfc, 0xd2, 0xd3, 0x99, 0xa4, 0x94,
-+ 0x69, 0xa0, 0xef, 0xd1, 0x85, 0xb3, 0xa6, 0xb1,
-+ 0x28, 0xbf, 0x94, 0x67, 0x22, 0xc3, 0x36, 0x46,
-+ 0xf8, 0xd2, 0x0f, 0x5f, 0xf4, 0x59, 0x80, 0xe6,
-+ 0x2d, 0x43, 0x08, 0x7d, 0x19, 0x09, 0x97, 0xa7,
-+ 0x4c, 0x3d, 0x8d, 0xba, 0x65, 0x62, 0xa3, 0x71,
-+ 0x33, 0x29, 0x62, 0xdb, 0xc1, 0x33, 0x34, 0x1a,
-+ 0x63, 0x33, 0x16, 0xb6, 0x64, 0x7e, 0xab, 0x33,
-+ 0xf0, 0xe6, 0x26, 0x68, 0xba, 0x1d, 0x2e, 0x38,
-+ 0x08, 0xe6, 0x02, 0xd3, 0x25, 0x2c, 0x47, 0x23,
-+ 0x58, 0x34, 0x0f, 0x9d, 0x63, 0x4f, 0x63, 0xbb,
-+ 0x7f, 0x3b, 0x34, 0x38, 0xa7, 0xb5, 0x8d, 0x65,
-+ 0xd9, 0x9f, 0x79, 0x55, 0x3e, 0x4d, 0xe7, 0x73,
-+ 0xd8, 0xf6, 0x98, 0x97, 0x84, 0x60, 0x9c, 0xc8,
-+ 0xa9, 0x3c, 0xf6, 0xdc, 0x12, 0x5c, 0xe1, 0xbb,
-+ 0x0b, 0x8b, 0x98, 0x9c, 0x9d, 0x26, 0x7c, 0x4a,
-+ 0xe6, 0x46, 0x36, 0x58, 0x21, 0x4a, 0xee, 0xca,
-+ 0xd7, 0x3b, 0xc2, 0x6c, 0x49, 0x2f, 0xe5, 0xd5,
-+ 0x03, 0x59, 0x84, 0x53, 0xcb, 0xfe, 0x92, 0x71,
-+ 0x2e, 0x7c, 0x21, 0xcc, 0x99, 0x85, 0x7f, 0xb8,
-+ 0x74, 0x90, 0x13, 0x42, 0x3f, 0xe0, 0x6b, 0x1d,
-+ 0xf2, 0x4d, 0x54, 0xd4, 0xfc, 0x3a, 0x05, 0xe6,
-+ 0x74, 0xaf, 0xa6, 0xa0, 0x2a, 0x20, 0x23, 0x5d,
-+ 0x34, 0x5c, 0xd9, 0x3e, 0x4e, 0xfa, 0x93, 0xe7,
-+ 0xaa, 0xe9, 0x6f, 0x08, 0x43, 0x67, 0x41, 0xc5,
-+ 0xad, 0xfb, 0x31, 0x95, 0x82, 0x73, 0x32, 0xd8,
-+ 0xa6, 0xa3, 0xed, 0x0e, 0x2d, 0xf6, 0x5f, 0xfd,
-+ 0x80, 0xa6, 0x7a, 0xe0, 0xdf, 0x78, 0x15, 0x29,
-+ 0x74, 0x33, 0xd0, 0x9e, 0x83, 0x86, 0x72, 0x22,
-+ 0x57, 0x29, 0xb9, 0x9e, 0x5d, 0xd3, 0x1a, 0xb5,
-+ 0x96, 0x72, 0x41, 0x3d, 0xf1, 0x64, 0x43, 0x67,
-+ 0xee, 0xaa, 0x5c, 0xd3, 0x9a, 0x96, 0x13, 0x11,
-+ 0x5d, 0xf3, 0x0c, 0x87, 0x82, 0x1e, 0x41, 0x9e,
-+ 0xd0, 0x27, 0xd7, 0x54, 0x3b, 0x67, 0x73, 0x09,
-+ 0x91, 0xe9, 0xd5, 0x36, 0xa7, 0xb5, 0x55, 0xe4,
-+ 0xf3, 0x21, 0x51, 0x49, 0x22, 0x07, 0x55, 0x4f,
-+ 0x44, 0x4b, 0xd2, 0x15, 0x93, 0x17, 0x2a, 0xfa,
-+ 0x4d, 0x4a, 0x57, 0xdb, 0x4c, 0xa6, 0xeb, 0xec,
-+ 0x53, 0x25, 0x6c, 0x21, 0xed, 0x00, 0x4c, 0x3b,
-+ 0xca, 0x14, 0x57, 0xa9, 0xd6, 0x6a, 0xcd, 0x8d,
-+ 0x5e, 0x74, 0xac, 0x72, 0xc1, 0x97, 0xe5, 0x1b,
-+ 0x45, 0x4e, 0xda, 0xfc, 0xcc, 0x40, 0xe8, 0x48,
-+ 0x88, 0x0b, 0xa3, 0xe3, 0x8d, 0x83, 0x42, 0xc3,
-+ 0x23, 0xfd, 0x68, 0xb5, 0x8e, 0xf1, 0x9d, 0x63,
-+ 0x77, 0xe9, 0xa3, 0x8e, 0x8c, 0x26, 0x6b, 0xbd,
-+ 0x72, 0x73, 0x35, 0x0c, 0x03, 0xf8, 0x43, 0x78,
-+ 0x52, 0x71, 0x15, 0x1f, 0x71, 0x5d, 0x6e, 0xed,
-+ 0xb9, 0xcc, 0x86, 0x30, 0xdb, 0x2b, 0xd3, 0x82,
-+ 0x88, 0x23, 0x71, 0x90, 0x53, 0x5c, 0xa9, 0x2f,
-+ 0x76, 0x01, 0xb7, 0x9a, 0xfe, 0x43, 0x55, 0xa3,
-+ 0x04, 0x9b, 0x0e, 0xe4, 0x59, 0xdf, 0xc9, 0xe9,
-+ 0xb1, 0xea, 0x29, 0x28, 0x3c, 0x5c, 0xae, 0x72,
-+ 0x84, 0xb6, 0xc6, 0xeb, 0x0c, 0x27, 0x07, 0x74,
-+ 0x90, 0x0d, 0x31, 0xb0, 0x00, 0x77, 0xe9, 0x40,
-+ 0x70, 0x6f, 0x68, 0xa7, 0xfd, 0x06, 0xec, 0x4b,
-+ 0xc0, 0xb7, 0xac, 0xbc, 0x33, 0xb7, 0x6d, 0x0a,
-+ 0xbd, 0x12, 0x1b, 0x59, 0xcb, 0xdd, 0x32, 0xf5,
-+ 0x1d, 0x94, 0x57, 0x76, 0x9e, 0x0c, 0x18, 0x98,
-+ 0x71, 0xd7, 0x2a, 0xdb, 0x0b, 0x7b, 0xa7, 0x71,
-+ 0xb7, 0x67, 0x81, 0x23, 0x96, 0xae, 0xb9, 0x7e,
-+ 0x32, 0x43, 0x92, 0x8a, 0x19, 0xa0, 0xc4, 0xd4,
-+ 0x3b, 0x57, 0xf9, 0x4a, 0x2c, 0xfb, 0x51, 0x46,
-+ 0xbb, 0xcb, 0x5d, 0xb3, 0xef, 0x13, 0x93, 0x6e,
-+ 0x68, 0x42, 0x54, 0x57, 0xd3, 0x6a, 0x3a, 0x8f,
-+ 0x9d, 0x66, 0xbf, 0xbd, 0x36, 0x23, 0xf5, 0x93,
-+ 0x83, 0x7b, 0x9c, 0xc0, 0xdd, 0xc5, 0x49, 0xc0,
-+ 0x64, 0xed, 0x07, 0x12, 0xb3, 0xe6, 0xe4, 0xe5,
-+ 0x38, 0x95, 0x23, 0xb1, 0xa0, 0x3b, 0x1a, 0x61,
-+ 0xda, 0x17, 0xac, 0xc3, 0x58, 0xdd, 0x74, 0x64,
-+ 0x22, 0x11, 0xe8, 0x32, 0x1d, 0x16, 0x93, 0x85,
-+ 0x99, 0xa5, 0x9c, 0x34, 0x55, 0xb1, 0xe9, 0x20,
-+ 0x72, 0xc9, 0x28, 0x7b, 0x79, 0x00, 0xa1, 0xa6,
-+ 0xa3, 0x27, 0x40, 0x18, 0x8a, 0x54, 0xe0, 0xcc,
-+ 0xe8, 0x4e, 0x8e, 0x43, 0x96, 0xe7, 0x3f, 0xc8,
-+ 0xe9, 0xb2, 0xf9, 0xc9, 0xda, 0x04, 0x71, 0x50,
-+ 0x47, 0xe4, 0xaa, 0xce, 0xa2, 0x30, 0xc8, 0xe4,
-+ 0xac, 0xc7, 0x0d, 0x06, 0x2e, 0xe6, 0xe8, 0x80,
-+ 0x36, 0x29, 0x9e, 0x01, 0xb8, 0xc3, 0xf0, 0xa0,
-+ 0x5d, 0x7a, 0xca, 0x4d, 0xa0, 0x57, 0xbd, 0x2a,
-+ 0x45, 0xa7, 0x7f, 0x9c, 0x93, 0x07, 0x8f, 0x35,
-+ 0x67, 0x92, 0xe3, 0xe9, 0x7f, 0xa8, 0x61, 0x43,
-+ 0x9e, 0x25, 0x4f, 0x33, 0x76, 0x13, 0x6e, 0x12,
-+ 0xb9, 0xdd, 0xa4, 0x7c, 0x08, 0x9f, 0x7c, 0xe7,
-+ 0x0a, 0x8d, 0x84, 0x06, 0xa4, 0x33, 0x17, 0x34,
-+ 0x5e, 0x10, 0x7c, 0xc0, 0xa8, 0x3d, 0x1f, 0x42,
-+ 0x20, 0x51, 0x65, 0x5d, 0x09, 0xc3, 0xaa, 0xc0,
-+ 0xc8, 0x0d, 0xf0, 0x79, 0xbc, 0x20, 0x1b, 0x95,
-+ 0xe7, 0x06, 0x7d, 0x47, 0x20, 0x03, 0x1a, 0x74,
-+ 0xdd, 0xe2, 0xd4, 0xae, 0x38, 0x71, 0x9b, 0xf5,
-+ 0x80, 0xec, 0x08, 0x4e, 0x56, 0xba, 0x76, 0x12,
-+ 0x1a, 0xdf, 0x48, 0xf3, 0xae, 0xb3, 0xe6, 0xe6,
-+ 0xbe, 0xc0, 0x91, 0x2e, 0x01, 0xb3, 0x01, 0x86,
-+ 0xa2, 0xb9, 0x52, 0xd1, 0x21, 0xae, 0xd4, 0x97,
-+ 0x1d, 0xef, 0x41, 0x12, 0x95, 0x3d, 0x48, 0x45,
-+ 0x1c, 0x56, 0x32, 0x8f, 0xb8, 0x43, 0xbb, 0x19,
-+ 0xf3, 0xca, 0xe9, 0xeb, 0x6d, 0x84, 0xbe, 0x86,
-+ 0x06, 0xe2, 0x36, 0xb2, 0x62, 0x9d, 0xd3, 0x4c,
-+ 0x48, 0x18, 0x54, 0x13, 0x4e, 0xcf, 0xfd, 0xba,
-+ 0x84, 0xb9, 0x30, 0x53, 0xcf, 0xfb, 0xb9, 0x29,
-+ 0x8f, 0xdc, 0x9f, 0xef, 0x60, 0x0b, 0x64, 0xf6,
-+ 0x8b, 0xee, 0xa6, 0x91, 0xc2, 0x41, 0x6c, 0xf6,
-+ 0xfa, 0x79, 0x67, 0x4b, 0xc1, 0x3f, 0xaf, 0x09,
-+ 0x81, 0xd4, 0x5d, 0xcb, 0x09, 0xdf, 0x36, 0x31,
-+ 0xc0, 0x14, 0x3c, 0x7c, 0x0e, 0x65, 0x95, 0x99,
-+ 0x6d, 0xa3, 0xf4, 0xd7, 0x38, 0xee, 0x1a, 0x2b,
-+ 0x37, 0xe2, 0xa4, 0x3b, 0x4b, 0xd0, 0x65, 0xca,
-+ 0xf8, 0xc3, 0xe8, 0x15, 0x20, 0xef, 0xf2, 0x00,
-+ 0xfd, 0x01, 0x09, 0xc5, 0xc8, 0x17, 0x04, 0x93,
-+ 0xd0, 0x93, 0x03, 0x55, 0xc5, 0xfe, 0x32, 0xa3,
-+ 0x3e, 0x28, 0x2d, 0x3b, 0x93, 0x8a, 0xcc, 0x07,
-+ 0x72, 0x80, 0x8b, 0x74, 0x16, 0x24, 0xbb, 0xda,
-+ 0x94, 0x39, 0x30, 0x8f, 0xb1, 0xcd, 0x4a, 0x90,
-+ 0x92, 0x7c, 0x14, 0x8f, 0x95, 0x4e, 0xac, 0x9b,
-+ 0xd8, 0x8f, 0x1a, 0x87, 0xa4, 0x32, 0x27, 0x8a,
-+ 0xba, 0xf7, 0x41, 0xcf, 0x84, 0x37, 0x19, 0xe6,
-+ 0x06, 0xf5, 0x0e, 0xcf, 0x36, 0xf5, 0x9e, 0x6c,
-+ 0xde, 0xbc, 0xff, 0x64, 0x7e, 0x4e, 0x59, 0x57,
-+ 0x48, 0xfe, 0x14, 0xf7, 0x9c, 0x93, 0x5d, 0x15,
-+ 0xad, 0xcc, 0x11, 0xb1, 0x17, 0x18, 0xb2, 0x7e,
-+ 0xcc, 0xab, 0xe9, 0xce, 0x7d, 0x77, 0x5b, 0x51,
-+ 0x1b, 0x1e, 0x20, 0xa8, 0x32, 0x06, 0x0e, 0x75,
-+ 0x93, 0xac, 0xdb, 0x35, 0x37, 0x1f, 0xe9, 0x19,
-+ 0x1d, 0xb4, 0x71, 0x97, 0xd6, 0x4e, 0x2c, 0x08,
-+ 0xa5, 0x13, 0xf9, 0x0e, 0x7e, 0x78, 0x6e, 0x14,
-+ 0xe0, 0xa9, 0xb9, 0x96, 0x4c, 0x80, 0x82, 0xba,
-+ 0x17, 0xb3, 0x9d, 0x69, 0xb0, 0x84, 0x46, 0xff,
-+ 0xf9, 0x52, 0x79, 0x94, 0x58, 0x3a, 0x62, 0x90,
-+ 0x15, 0x35, 0x71, 0x10, 0x37, 0xed, 0xa1, 0x8e,
-+ 0x53, 0x6e, 0xf4, 0x26, 0x57, 0x93, 0x15, 0x93,
-+ 0xf6, 0x81, 0x2c, 0x5a, 0x10, 0xda, 0x92, 0xad,
-+ 0x2f, 0xdb, 0x28, 0x31, 0x2d, 0x55, 0x04, 0xd2,
-+ 0x06, 0x28, 0x8c, 0x1e, 0xdc, 0xea, 0x54, 0xac,
-+ 0xff, 0xb7, 0x6c, 0x30, 0x15, 0xd4, 0xb4, 0x0d,
-+ 0x00, 0x93, 0x57, 0xdd, 0xd2, 0x07, 0x07, 0x06,
-+ 0xd9, 0x43, 0x9b, 0xcd, 0x3a, 0xf4, 0x7d, 0x4c,
-+ 0x36, 0x5d, 0x23, 0xa2, 0xcc, 0x57, 0x40, 0x91,
-+ 0xe9, 0x2c, 0x2f, 0x2c, 0xd5, 0x30, 0x9b, 0x17,
-+ 0xb0, 0xc9, 0xf7, 0xa7, 0x2f, 0xd1, 0x93, 0x20,
-+ 0x6b, 0xc6, 0xc1, 0xe4, 0x6f, 0xcb, 0xd1, 0xe7,
-+ 0x09, 0x0f, 0x9e, 0xdc, 0xaa, 0x9f, 0x2f, 0xdf,
-+ 0x56, 0x9f, 0xd4, 0x33, 0x04, 0xaf, 0xd3, 0x6c,
-+ 0x58, 0x61, 0xf0, 0x30, 0xec, 0xf2, 0x7f, 0xf2,
-+ 0x9c, 0xdf, 0x39, 0xbb, 0x6f, 0xa2, 0x8c, 0x7e,
-+ 0xc4, 0x22, 0x51, 0x71, 0xc0, 0x4d, 0x14, 0x1a,
-+ 0xc4, 0xcd, 0x04, 0xd9, 0x87, 0x08, 0x50, 0x05,
-+ 0xcc, 0xaf, 0xf6, 0xf0, 0x8f, 0x92, 0x54, 0x58,
-+ 0xc2, 0xc7, 0x09, 0x7a, 0x59, 0x02, 0x05, 0xe8,
-+ 0xb0, 0x86, 0xd9, 0xbf, 0x7b, 0x35, 0x51, 0x4d,
-+ 0xaf, 0x08, 0x97, 0x2c, 0x65, 0xda, 0x2a, 0x71,
-+ 0x3a, 0xa8, 0x51, 0xcc, 0xf2, 0x73, 0x27, 0xc3,
-+ 0xfd, 0x62, 0xcf, 0xe3, 0xb2, 0xca, 0xcb, 0xbe,
-+ 0x1a, 0x0a, 0xa1, 0x34, 0x7b, 0x77, 0xc4, 0x62,
-+ 0x68, 0x78, 0x5f, 0x94, 0x07, 0x04, 0x65, 0x16,
-+ 0x4b, 0x61, 0xcb, 0xff, 0x75, 0x26, 0x50, 0x66,
-+ 0x1f, 0x6e, 0x93, 0xf8, 0xc5, 0x51, 0xeb, 0xa4,
-+ 0x4a, 0x48, 0x68, 0x6b, 0xe2, 0x5e, 0x44, 0xb2,
-+ 0x50, 0x2c, 0x6c, 0xae, 0x79, 0x4e, 0x66, 0x35,
-+ 0x81, 0x50, 0xac, 0xbc, 0x3f, 0xb1, 0x0c, 0xf3,
-+ 0x05, 0x3c, 0x4a, 0xa3, 0x6c, 0x2a, 0x79, 0xb4,
-+ 0xb7, 0xab, 0xca, 0xc7, 0x9b, 0x8e, 0xcd, 0x5f,
-+ 0x11, 0x03, 0xcb, 0x30, 0xa3, 0xab, 0xda, 0xfe,
-+ 0x64, 0xb9, 0xbb, 0xd8, 0x5e, 0x3a, 0x1a, 0x56,
-+ 0xe5, 0x05, 0x48, 0x90, 0x1e, 0x61, 0x69, 0x1b,
-+ 0x22, 0xe6, 0x1a, 0x3c, 0x75, 0xad, 0x1f, 0x37,
-+ 0x28, 0xdc, 0xe4, 0x6d, 0xbd, 0x42, 0xdc, 0xd3,
-+ 0xc8, 0xb6, 0x1c, 0x48, 0xfe, 0x94, 0x77, 0x7f,
-+ 0xbd, 0x62, 0xac, 0xa3, 0x47, 0x27, 0xcf, 0x5f,
-+ 0xd9, 0xdb, 0xaf, 0xec, 0xf7, 0x5e, 0xc1, 0xb0,
-+ 0x9d, 0x01, 0x26, 0x99, 0x7e, 0x8f, 0x03, 0x70,
-+ 0xb5, 0x42, 0xbe, 0x67, 0x28, 0x1b, 0x7c, 0xbd,
-+ 0x61, 0x21, 0x97, 0xcc, 0x5c, 0xe1, 0x97, 0x8f,
-+ 0x8d, 0xde, 0x2b, 0xaa, 0xa7, 0x71, 0x1d, 0x1e,
-+ 0x02, 0x73, 0x70, 0x58, 0x32, 0x5b, 0x1d, 0x67,
-+ 0x3d, 0xe0, 0x74, 0x4f, 0x03, 0xf2, 0x70, 0x51,
-+ 0x79, 0xf1, 0x61, 0x70, 0x15, 0x74, 0x9d, 0x23,
-+ 0x89, 0xde, 0xac, 0xfd, 0xde, 0xd0, 0x1f, 0xc3,
-+ 0x87, 0x44, 0x35, 0x4b, 0xe5, 0xb0, 0x60, 0xc5,
-+ 0x22, 0xe4, 0x9e, 0xca, 0xeb, 0xd5, 0x3a, 0x09,
-+ 0x45, 0xa4, 0xdb, 0xfa, 0x3f, 0xeb, 0x1b, 0xc7,
-+ 0xc8, 0x14, 0x99, 0x51, 0x92, 0x10, 0xed, 0xed,
-+ 0x28, 0xe0, 0xa1, 0xf8, 0x26, 0xcf, 0xcd, 0xcb,
-+ 0x63, 0xa1, 0x3b, 0xe3, 0xdf, 0x7e, 0xfe, 0xa6,
-+ 0xf0, 0x81, 0x9a, 0xbf, 0x55, 0xde, 0x54, 0xd5,
-+ 0x56, 0x60, 0x98, 0x10, 0x68, 0xf4, 0x38, 0x96,
-+ 0x8e, 0x6f, 0x1d, 0x44, 0x7f, 0xd6, 0x2f, 0xfe,
-+ 0x55, 0xfb, 0x0c, 0x7e, 0x67, 0xe2, 0x61, 0x44,
-+ 0xed, 0xf2, 0x35, 0x30, 0x5d, 0xe9, 0xc7, 0xd6,
-+ 0x6d, 0xe0, 0xa0, 0xed, 0xf3, 0xfc, 0xd8, 0x3e,
-+ 0x0a, 0x7b, 0xcd, 0xaf, 0x65, 0x68, 0x18, 0xc0,
-+ 0xec, 0x04, 0x1c, 0x74, 0x6d, 0xe2, 0x6e, 0x79,
-+ 0xd4, 0x11, 0x2b, 0x62, 0xd5, 0x27, 0xad, 0x4f,
-+ 0x01, 0x59, 0x73, 0xcc, 0x6a, 0x53, 0xfb, 0x2d,
-+ 0xd5, 0x4e, 0x99, 0x21, 0x65, 0x4d, 0xf5, 0x82,
-+ 0xf7, 0xd8, 0x42, 0xce, 0x6f, 0x3d, 0x36, 0x47,
-+ 0xf1, 0x05, 0x16, 0xe8, 0x1b, 0x6a, 0x8f, 0x93,
-+ 0xf2, 0x8f, 0x37, 0x40, 0x12, 0x28, 0xa3, 0xe6,
-+ 0xb9, 0x17, 0x4a, 0x1f, 0xb1, 0xd1, 0x66, 0x69,
-+ 0x86, 0xc4, 0xfc, 0x97, 0xae, 0x3f, 0x8f, 0x1e,
-+ 0x2b, 0xdf, 0xcd, 0xf9, 0x3c
-+};
-+static const u8 enc_assoc011[] __initconst = {
-+ 0xd6, 0x31, 0xda, 0x5d, 0x42, 0x5e, 0xd7
-+};
-+static const u8 enc_nonce011[] __initconst = {
-+ 0xfd, 0x87, 0xd4, 0xd8, 0x62, 0xfd, 0xec, 0xaa
-+};
-+static const u8 enc_key011[] __initconst = {
-+ 0x35, 0x4e, 0xb5, 0x70, 0x50, 0x42, 0x8a, 0x85,
-+ 0xf2, 0xfb, 0xed, 0x7b, 0xd0, 0x9e, 0x97, 0xca,
-+ 0xfa, 0x98, 0x66, 0x63, 0xee, 0x37, 0xcc, 0x52,
-+ 0xfe, 0xd1, 0xdf, 0x95, 0x15, 0x34, 0x29, 0x38
-+};
-+
-+static const u8 enc_input012[] __initconst = {
-+ 0x74, 0xa6, 0x3e, 0xe4, 0xb1, 0xcb, 0xaf, 0xb0,
-+ 0x40, 0xe5, 0x0f, 0x9e, 0xf1, 0xf2, 0x89, 0xb5,
-+ 0x42, 0x34, 0x8a, 0xa1, 0x03, 0xb7, 0xe9, 0x57,
-+ 0x46, 0xbe, 0x20, 0xe4, 0x6e, 0xb0, 0xeb, 0xff,
-+ 0xea, 0x07, 0x7e, 0xef, 0xe2, 0x55, 0x9f, 0xe5,
-+ 0x78, 0x3a, 0xb7, 0x83, 0xc2, 0x18, 0x40, 0x7b,
-+ 0xeb, 0xcd, 0x81, 0xfb, 0x90, 0x12, 0x9e, 0x46,
-+ 0xa9, 0xd6, 0x4a, 0xba, 0xb0, 0x62, 0xdb, 0x6b,
-+ 0x99, 0xc4, 0xdb, 0x54, 0x4b, 0xb8, 0xa5, 0x71,
-+ 0xcb, 0xcd, 0x63, 0x32, 0x55, 0xfb, 0x31, 0xf0,
-+ 0x38, 0xf5, 0xbe, 0x78, 0xe4, 0x45, 0xce, 0x1b,
-+ 0x6a, 0x5b, 0x0e, 0xf4, 0x16, 0xe4, 0xb1, 0x3d,
-+ 0xf6, 0x63, 0x7b, 0xa7, 0x0c, 0xde, 0x6f, 0x8f,
-+ 0x74, 0xdf, 0xe0, 0x1e, 0x9d, 0xce, 0x8f, 0x24,
-+ 0xef, 0x23, 0x35, 0x33, 0x7b, 0x83, 0x34, 0x23,
-+ 0x58, 0x74, 0x14, 0x77, 0x1f, 0xc2, 0x4f, 0x4e,
-+ 0xc6, 0x89, 0xf9, 0x52, 0x09, 0x37, 0x64, 0x14,
-+ 0xc4, 0x01, 0x6b, 0x9d, 0x77, 0xe8, 0x90, 0x5d,
-+ 0xa8, 0x4a, 0x2a, 0xef, 0x5c, 0x7f, 0xeb, 0xbb,
-+ 0xb2, 0xc6, 0x93, 0x99, 0x66, 0xdc, 0x7f, 0xd4,
-+ 0x9e, 0x2a, 0xca, 0x8d, 0xdb, 0xe7, 0x20, 0xcf,
-+ 0xe4, 0x73, 0xae, 0x49, 0x7d, 0x64, 0x0f, 0x0e,
-+ 0x28, 0x46, 0xa9, 0xa8, 0x32, 0xe4, 0x0e, 0xf6,
-+ 0x51, 0x53, 0xb8, 0x3c, 0xb1, 0xff, 0xa3, 0x33,
-+ 0x41, 0x75, 0xff, 0xf1, 0x6f, 0xf1, 0xfb, 0xbb,
-+ 0x83, 0x7f, 0x06, 0x9b, 0xe7, 0x1b, 0x0a, 0xe0,
-+ 0x5c, 0x33, 0x60, 0x5b, 0xdb, 0x5b, 0xed, 0xfe,
-+ 0xa5, 0x16, 0x19, 0x72, 0xa3, 0x64, 0x23, 0x00,
-+ 0x02, 0xc7, 0xf3, 0x6a, 0x81, 0x3e, 0x44, 0x1d,
-+ 0x79, 0x15, 0x5f, 0x9a, 0xde, 0xe2, 0xfd, 0x1b,
-+ 0x73, 0xc1, 0xbc, 0x23, 0xba, 0x31, 0xd2, 0x50,
-+ 0xd5, 0xad, 0x7f, 0x74, 0xa7, 0xc9, 0xf8, 0x3e,
-+ 0x2b, 0x26, 0x10, 0xf6, 0x03, 0x36, 0x74, 0xe4,
-+ 0x0e, 0x6a, 0x72, 0xb7, 0x73, 0x0a, 0x42, 0x28,
-+ 0xc2, 0xad, 0x5e, 0x03, 0xbe, 0xb8, 0x0b, 0xa8,
-+ 0x5b, 0xd4, 0xb8, 0xba, 0x52, 0x89, 0xb1, 0x9b,
-+ 0xc1, 0xc3, 0x65, 0x87, 0xed, 0xa5, 0xf4, 0x86,
-+ 0xfd, 0x41, 0x80, 0x91, 0x27, 0x59, 0x53, 0x67,
-+ 0x15, 0x78, 0x54, 0x8b, 0x2d, 0x3d, 0xc7, 0xff,
-+ 0x02, 0x92, 0x07, 0x5f, 0x7a, 0x4b, 0x60, 0x59,
-+ 0x3c, 0x6f, 0x5c, 0xd8, 0xec, 0x95, 0xd2, 0xfe,
-+ 0xa0, 0x3b, 0xd8, 0x3f, 0xd1, 0x69, 0xa6, 0xd6,
-+ 0x41, 0xb2, 0xf4, 0x4d, 0x12, 0xf4, 0x58, 0x3e,
-+ 0x66, 0x64, 0x80, 0x31, 0x9b, 0xa8, 0x4c, 0x8b,
-+ 0x07, 0xb2, 0xec, 0x66, 0x94, 0x66, 0x47, 0x50,
-+ 0x50, 0x5f, 0x18, 0x0b, 0x0e, 0xd6, 0xc0, 0x39,
-+ 0x21, 0x13, 0x9e, 0x33, 0xbc, 0x79, 0x36, 0x02,
-+ 0x96, 0x70, 0xf0, 0x48, 0x67, 0x2f, 0x26, 0xe9,
-+ 0x6d, 0x10, 0xbb, 0xd6, 0x3f, 0xd1, 0x64, 0x7a,
-+ 0x2e, 0xbe, 0x0c, 0x61, 0xf0, 0x75, 0x42, 0x38,
-+ 0x23, 0xb1, 0x9e, 0x9f, 0x7c, 0x67, 0x66, 0xd9,
-+ 0x58, 0x9a, 0xf1, 0xbb, 0x41, 0x2a, 0x8d, 0x65,
-+ 0x84, 0x94, 0xfc, 0xdc, 0x6a, 0x50, 0x64, 0xdb,
-+ 0x56, 0x33, 0x76, 0x00, 0x10, 0xed, 0xbe, 0xd2,
-+ 0x12, 0xf6, 0xf6, 0x1b, 0xa2, 0x16, 0xde, 0xae,
-+ 0x31, 0x95, 0xdd, 0xb1, 0x08, 0x7e, 0x4e, 0xee,
-+ 0xe7, 0xf9, 0xa5, 0xfb, 0x5b, 0x61, 0x43, 0x00,
-+ 0x40, 0xf6, 0x7e, 0x02, 0x04, 0x32, 0x4e, 0x0c,
-+ 0xe2, 0x66, 0x0d, 0xd7, 0x07, 0x98, 0x0e, 0xf8,
-+ 0x72, 0x34, 0x6d, 0x95, 0x86, 0xd7, 0xcb, 0x31,
-+ 0x54, 0x47, 0xd0, 0x38, 0x29, 0x9c, 0x5a, 0x68,
-+ 0xd4, 0x87, 0x76, 0xc9, 0xe7, 0x7e, 0xe3, 0xf4,
-+ 0x81, 0x6d, 0x18, 0xcb, 0xc9, 0x05, 0xaf, 0xa0,
-+ 0xfb, 0x66, 0xf7, 0xf1, 0x1c, 0xc6, 0x14, 0x11,
-+ 0x4f, 0x2b, 0x79, 0x42, 0x8b, 0xbc, 0xac, 0xe7,
-+ 0x6c, 0xfe, 0x0f, 0x58, 0xe7, 0x7c, 0x78, 0x39,
-+ 0x30, 0xb0, 0x66, 0x2c, 0x9b, 0x6d, 0x3a, 0xe1,
-+ 0xcf, 0xc9, 0xa4, 0x0e, 0x6d, 0x6d, 0x8a, 0xa1,
-+ 0x3a, 0xe7, 0x28, 0xd4, 0x78, 0x4c, 0xa6, 0xa2,
-+ 0x2a, 0xa6, 0x03, 0x30, 0xd7, 0xa8, 0x25, 0x66,
-+ 0x87, 0x2f, 0x69, 0x5c, 0x4e, 0xdd, 0xa5, 0x49,
-+ 0x5d, 0x37, 0x4a, 0x59, 0xc4, 0xaf, 0x1f, 0xa2,
-+ 0xe4, 0xf8, 0xa6, 0x12, 0x97, 0xd5, 0x79, 0xf5,
-+ 0xe2, 0x4a, 0x2b, 0x5f, 0x61, 0xe4, 0x9e, 0xe3,
-+ 0xee, 0xb8, 0xa7, 0x5b, 0x2f, 0xf4, 0x9e, 0x6c,
-+ 0xfb, 0xd1, 0xc6, 0x56, 0x77, 0xba, 0x75, 0xaa,
-+ 0x3d, 0x1a, 0xa8, 0x0b, 0xb3, 0x68, 0x24, 0x00,
-+ 0x10, 0x7f, 0xfd, 0xd7, 0xa1, 0x8d, 0x83, 0x54,
-+ 0x4f, 0x1f, 0xd8, 0x2a, 0xbe, 0x8a, 0x0c, 0x87,
-+ 0xab, 0xa2, 0xde, 0xc3, 0x39, 0xbf, 0x09, 0x03,
-+ 0xa5, 0xf3, 0x05, 0x28, 0xe1, 0xe1, 0xee, 0x39,
-+ 0x70, 0x9c, 0xd8, 0x81, 0x12, 0x1e, 0x02, 0x40,
-+ 0xd2, 0x6e, 0xf0, 0xeb, 0x1b, 0x3d, 0x22, 0xc6,
-+ 0xe5, 0xe3, 0xb4, 0x5a, 0x98, 0xbb, 0xf0, 0x22,
-+ 0x28, 0x8d, 0xe5, 0xd3, 0x16, 0x48, 0x24, 0xa5,
-+ 0xe6, 0x66, 0x0c, 0xf9, 0x08, 0xf9, 0x7e, 0x1e,
-+ 0xe1, 0x28, 0x26, 0x22, 0xc7, 0xc7, 0x0a, 0x32,
-+ 0x47, 0xfa, 0xa3, 0xbe, 0x3c, 0xc4, 0xc5, 0x53,
-+ 0x0a, 0xd5, 0x94, 0x4a, 0xd7, 0x93, 0xd8, 0x42,
-+ 0x99, 0xb9, 0x0a, 0xdb, 0x56, 0xf7, 0xb9, 0x1c,
-+ 0x53, 0x4f, 0xfa, 0xd3, 0x74, 0xad, 0xd9, 0x68,
-+ 0xf1, 0x1b, 0xdf, 0x61, 0xc6, 0x5e, 0xa8, 0x48,
-+ 0xfc, 0xd4, 0x4a, 0x4c, 0x3c, 0x32, 0xf7, 0x1c,
-+ 0x96, 0x21, 0x9b, 0xf9, 0xa3, 0xcc, 0x5a, 0xce,
-+ 0xd5, 0xd7, 0x08, 0x24, 0xf6, 0x1c, 0xfd, 0xdd,
-+ 0x38, 0xc2, 0x32, 0xe9, 0xb8, 0xe7, 0xb6, 0xfa,
-+ 0x9d, 0x45, 0x13, 0x2c, 0x83, 0xfd, 0x4a, 0x69,
-+ 0x82, 0xcd, 0xdc, 0xb3, 0x76, 0x0c, 0x9e, 0xd8,
-+ 0xf4, 0x1b, 0x45, 0x15, 0xb4, 0x97, 0xe7, 0x58,
-+ 0x34, 0xe2, 0x03, 0x29, 0x5a, 0xbf, 0xb6, 0xe0,
-+ 0x5d, 0x13, 0xd9, 0x2b, 0xb4, 0x80, 0xb2, 0x45,
-+ 0x81, 0x6a, 0x2e, 0x6c, 0x89, 0x7d, 0xee, 0xbb,
-+ 0x52, 0xdd, 0x1f, 0x18, 0xe7, 0x13, 0x6b, 0x33,
-+ 0x0e, 0xea, 0x36, 0x92, 0x77, 0x7b, 0x6d, 0x9c,
-+ 0x5a, 0x5f, 0x45, 0x7b, 0x7b, 0x35, 0x62, 0x23,
-+ 0xd1, 0xbf, 0x0f, 0xd0, 0x08, 0x1b, 0x2b, 0x80,
-+ 0x6b, 0x7e, 0xf1, 0x21, 0x47, 0xb0, 0x57, 0xd1,
-+ 0x98, 0x72, 0x90, 0x34, 0x1c, 0x20, 0x04, 0xff,
-+ 0x3d, 0x5c, 0xee, 0x0e, 0x57, 0x5f, 0x6f, 0x24,
-+ 0x4e, 0x3c, 0xea, 0xfc, 0xa5, 0xa9, 0x83, 0xc9,
-+ 0x61, 0xb4, 0x51, 0x24, 0xf8, 0x27, 0x5e, 0x46,
-+ 0x8c, 0xb1, 0x53, 0x02, 0x96, 0x35, 0xba, 0xb8,
-+ 0x4c, 0x71, 0xd3, 0x15, 0x59, 0x35, 0x22, 0x20,
-+ 0xad, 0x03, 0x9f, 0x66, 0x44, 0x3b, 0x9c, 0x35,
-+ 0x37, 0x1f, 0x9b, 0xbb, 0xf3, 0xdb, 0x35, 0x63,
-+ 0x30, 0x64, 0xaa, 0xa2, 0x06, 0xa8, 0x5d, 0xbb,
-+ 0xe1, 0x9f, 0x70, 0xec, 0x82, 0x11, 0x06, 0x36,
-+ 0xec, 0x8b, 0x69, 0x66, 0x24, 0x44, 0xc9, 0x4a,
-+ 0x57, 0xbb, 0x9b, 0x78, 0x13, 0xce, 0x9c, 0x0c,
-+ 0xba, 0x92, 0x93, 0x63, 0xb8, 0xe2, 0x95, 0x0f,
-+ 0x0f, 0x16, 0x39, 0x52, 0xfd, 0x3a, 0x6d, 0x02,
-+ 0x4b, 0xdf, 0x13, 0xd3, 0x2a, 0x22, 0xb4, 0x03,
-+ 0x7c, 0x54, 0x49, 0x96, 0x68, 0x54, 0x10, 0xfa,
-+ 0xef, 0xaa, 0x6c, 0xe8, 0x22, 0xdc, 0x71, 0x16,
-+ 0x13, 0x1a, 0xf6, 0x28, 0xe5, 0x6d, 0x77, 0x3d,
-+ 0xcd, 0x30, 0x63, 0xb1, 0x70, 0x52, 0xa1, 0xc5,
-+ 0x94, 0x5f, 0xcf, 0xe8, 0xb8, 0x26, 0x98, 0xf7,
-+ 0x06, 0xa0, 0x0a, 0x70, 0xfa, 0x03, 0x80, 0xac,
-+ 0xc1, 0xec, 0xd6, 0x4c, 0x54, 0xd7, 0xfe, 0x47,
-+ 0xb6, 0x88, 0x4a, 0xf7, 0x71, 0x24, 0xee, 0xf3,
-+ 0xd2, 0xc2, 0x4a, 0x7f, 0xfe, 0x61, 0xc7, 0x35,
-+ 0xc9, 0x37, 0x67, 0xcb, 0x24, 0x35, 0xda, 0x7e,
-+ 0xca, 0x5f, 0xf3, 0x8d, 0xd4, 0x13, 0x8e, 0xd6,
-+ 0xcb, 0x4d, 0x53, 0x8f, 0x53, 0x1f, 0xc0, 0x74,
-+ 0xf7, 0x53, 0xb9, 0x5e, 0x23, 0x37, 0xba, 0x6e,
-+ 0xe3, 0x9d, 0x07, 0x55, 0x25, 0x7b, 0xe6, 0x2a,
-+ 0x64, 0xd1, 0x32, 0xdd, 0x54, 0x1b, 0x4b, 0xc0,
-+ 0xe1, 0xd7, 0x69, 0x58, 0xf8, 0x93, 0x29, 0xc4,
-+ 0xdd, 0x23, 0x2f, 0xa5, 0xfc, 0x9d, 0x7e, 0xf8,
-+ 0xd4, 0x90, 0xcd, 0x82, 0x55, 0xdc, 0x16, 0x16,
-+ 0x9f, 0x07, 0x52, 0x9b, 0x9d, 0x25, 0xed, 0x32,
-+ 0xc5, 0x7b, 0xdf, 0xf6, 0x83, 0x46, 0x3d, 0x65,
-+ 0xb7, 0xef, 0x87, 0x7a, 0x12, 0x69, 0x8f, 0x06,
-+ 0x7c, 0x51, 0x15, 0x4a, 0x08, 0xe8, 0xac, 0x9a,
-+ 0x0c, 0x24, 0xa7, 0x27, 0xd8, 0x46, 0x2f, 0xe7,
-+ 0x01, 0x0e, 0x1c, 0xc6, 0x91, 0xb0, 0x6e, 0x85,
-+ 0x65, 0xf0, 0x29, 0x0d, 0x2e, 0x6b, 0x3b, 0xfb,
-+ 0x4b, 0xdf, 0xe4, 0x80, 0x93, 0x03, 0x66, 0x46,
-+ 0x3e, 0x8a, 0x6e, 0xf3, 0x5e, 0x4d, 0x62, 0x0e,
-+ 0x49, 0x05, 0xaf, 0xd4, 0xf8, 0x21, 0x20, 0x61,
-+ 0x1d, 0x39, 0x17, 0xf4, 0x61, 0x47, 0x95, 0xfb,
-+ 0x15, 0x2e, 0xb3, 0x4f, 0xd0, 0x5d, 0xf5, 0x7d,
-+ 0x40, 0xda, 0x90, 0x3c, 0x6b, 0xcb, 0x17, 0x00,
-+ 0x13, 0x3b, 0x64, 0x34, 0x1b, 0xf0, 0xf2, 0xe5,
-+ 0x3b, 0xb2, 0xc7, 0xd3, 0x5f, 0x3a, 0x44, 0xa6,
-+ 0x9b, 0xb7, 0x78, 0x0e, 0x42, 0x5d, 0x4c, 0xc1,
-+ 0xe9, 0xd2, 0xcb, 0xb7, 0x78, 0xd1, 0xfe, 0x9a,
-+ 0xb5, 0x07, 0xe9, 0xe0, 0xbe, 0xe2, 0x8a, 0xa7,
-+ 0x01, 0x83, 0x00, 0x8c, 0x5c, 0x08, 0xe6, 0x63,
-+ 0x12, 0x92, 0xb7, 0xb7, 0xa6, 0x19, 0x7d, 0x38,
-+ 0x13, 0x38, 0x92, 0x87, 0x24, 0xf9, 0x48, 0xb3,
-+ 0x5e, 0x87, 0x6a, 0x40, 0x39, 0x5c, 0x3f, 0xed,
-+ 0x8f, 0xee, 0xdb, 0x15, 0x82, 0x06, 0xda, 0x49,
-+ 0x21, 0x2b, 0xb5, 0xbf, 0x32, 0x7c, 0x9f, 0x42,
-+ 0x28, 0x63, 0xcf, 0xaf, 0x1e, 0xf8, 0xc6, 0xa0,
-+ 0xd1, 0x02, 0x43, 0x57, 0x62, 0xec, 0x9b, 0x0f,
-+ 0x01, 0x9e, 0x71, 0xd8, 0x87, 0x9d, 0x01, 0xc1,
-+ 0x58, 0x77, 0xd9, 0xaf, 0xb1, 0x10, 0x7e, 0xdd,
-+ 0xa6, 0x50, 0x96, 0xe5, 0xf0, 0x72, 0x00, 0x6d,
-+ 0x4b, 0xf8, 0x2a, 0x8f, 0x19, 0xf3, 0x22, 0x88,
-+ 0x11, 0x4a, 0x8b, 0x7c, 0xfd, 0xb7, 0xed, 0xe1,
-+ 0xf6, 0x40, 0x39, 0xe0, 0xe9, 0xf6, 0x3d, 0x25,
-+ 0xe6, 0x74, 0x3c, 0x58, 0x57, 0x7f, 0xe1, 0x22,
-+ 0x96, 0x47, 0x31, 0x91, 0xba, 0x70, 0x85, 0x28,
-+ 0x6b, 0x9f, 0x6e, 0x25, 0xac, 0x23, 0x66, 0x2f,
-+ 0x29, 0x88, 0x28, 0xce, 0x8c, 0x5c, 0x88, 0x53,
-+ 0xd1, 0x3b, 0xcc, 0x6a, 0x51, 0xb2, 0xe1, 0x28,
-+ 0x3f, 0x91, 0xb4, 0x0d, 0x00, 0x3a, 0xe3, 0xf8,
-+ 0xc3, 0x8f, 0xd7, 0x96, 0x62, 0x0e, 0x2e, 0xfc,
-+ 0xc8, 0x6c, 0x77, 0xa6, 0x1d, 0x22, 0xc1, 0xb8,
-+ 0xe6, 0x61, 0xd7, 0x67, 0x36, 0x13, 0x7b, 0xbb,
-+ 0x9b, 0x59, 0x09, 0xa6, 0xdf, 0xf7, 0x6b, 0xa3,
-+ 0x40, 0x1a, 0xf5, 0x4f, 0xb4, 0xda, 0xd3, 0xf3,
-+ 0x81, 0x93, 0xc6, 0x18, 0xd9, 0x26, 0xee, 0xac,
-+ 0xf0, 0xaa, 0xdf, 0xc5, 0x9c, 0xca, 0xc2, 0xa2,
-+ 0xcc, 0x7b, 0x5c, 0x24, 0xb0, 0xbc, 0xd0, 0x6a,
-+ 0x4d, 0x89, 0x09, 0xb8, 0x07, 0xfe, 0x87, 0xad,
-+ 0x0a, 0xea, 0xb8, 0x42, 0xf9, 0x5e, 0xb3, 0x3e,
-+ 0x36, 0x4c, 0xaf, 0x75, 0x9e, 0x1c, 0xeb, 0xbd,
-+ 0xbc, 0xbb, 0x80, 0x40, 0xa7, 0x3a, 0x30, 0xbf,
-+ 0xa8, 0x44, 0xf4, 0xeb, 0x38, 0xad, 0x29, 0xba,
-+ 0x23, 0xed, 0x41, 0x0c, 0xea, 0xd2, 0xbb, 0x41,
-+ 0x18, 0xd6, 0xb9, 0xba, 0x65, 0x2b, 0xa3, 0x91,
-+ 0x6d, 0x1f, 0xa9, 0xf4, 0xd1, 0x25, 0x8d, 0x4d,
-+ 0x38, 0xff, 0x64, 0xa0, 0xec, 0xde, 0xa6, 0xb6,
-+ 0x79, 0xab, 0x8e, 0x33, 0x6c, 0x47, 0xde, 0xaf,
-+ 0x94, 0xa4, 0xa5, 0x86, 0x77, 0x55, 0x09, 0x92,
-+ 0x81, 0x31, 0x76, 0xc7, 0x34, 0x22, 0x89, 0x8e,
-+ 0x3d, 0x26, 0x26, 0xd7, 0xfc, 0x1e, 0x16, 0x72,
-+ 0x13, 0x33, 0x63, 0xd5, 0x22, 0xbe, 0xb8, 0x04,
-+ 0x34, 0x84, 0x41, 0xbb, 0x80, 0xd0, 0x9f, 0x46,
-+ 0x48, 0x07, 0xa7, 0xfc, 0x2b, 0x3a, 0x75, 0x55,
-+ 0x8c, 0xc7, 0x6a, 0xbd, 0x7e, 0x46, 0x08, 0x84,
-+ 0x0f, 0xd5, 0x74, 0xc0, 0x82, 0x8e, 0xaa, 0x61,
-+ 0x05, 0x01, 0xb2, 0x47, 0x6e, 0x20, 0x6a, 0x2d,
-+ 0x58, 0x70, 0x48, 0x32, 0xa7, 0x37, 0xd2, 0xb8,
-+ 0x82, 0x1a, 0x51, 0xb9, 0x61, 0xdd, 0xfd, 0x9d,
-+ 0x6b, 0x0e, 0x18, 0x97, 0xf8, 0x45, 0x5f, 0x87,
-+ 0x10, 0xcf, 0x34, 0x72, 0x45, 0x26, 0x49, 0x70,
-+ 0xe7, 0xa3, 0x78, 0xe0, 0x52, 0x89, 0x84, 0x94,
-+ 0x83, 0x82, 0xc2, 0x69, 0x8f, 0xe3, 0xe1, 0x3f,
-+ 0x60, 0x74, 0x88, 0xc4, 0xf7, 0x75, 0x2c, 0xfb,
-+ 0xbd, 0xb6, 0xc4, 0x7e, 0x10, 0x0a, 0x6c, 0x90,
-+ 0x04, 0x9e, 0xc3, 0x3f, 0x59, 0x7c, 0xce, 0x31,
-+ 0x18, 0x60, 0x57, 0x73, 0x46, 0x94, 0x7d, 0x06,
-+ 0xa0, 0x6d, 0x44, 0xec, 0xa2, 0x0a, 0x9e, 0x05,
-+ 0x15, 0xef, 0xca, 0x5c, 0xbf, 0x00, 0xeb, 0xf7,
-+ 0x3d, 0x32, 0xd4, 0xa5, 0xef, 0x49, 0x89, 0x5e,
-+ 0x46, 0xb0, 0xa6, 0x63, 0x5b, 0x8a, 0x73, 0xae,
-+ 0x6f, 0xd5, 0x9d, 0xf8, 0x4f, 0x40, 0xb5, 0xb2,
-+ 0x6e, 0xd3, 0xb6, 0x01, 0xa9, 0x26, 0xa2, 0x21,
-+ 0xcf, 0x33, 0x7a, 0x3a, 0xa4, 0x23, 0x13, 0xb0,
-+ 0x69, 0x6a, 0xee, 0xce, 0xd8, 0x9d, 0x01, 0x1d,
-+ 0x50, 0xc1, 0x30, 0x6c, 0xb1, 0xcd, 0xa0, 0xf0,
-+ 0xf0, 0xa2, 0x64, 0x6f, 0xbb, 0xbf, 0x5e, 0xe6,
-+ 0xab, 0x87, 0xb4, 0x0f, 0x4f, 0x15, 0xaf, 0xb5,
-+ 0x25, 0xa1, 0xb2, 0xd0, 0x80, 0x2c, 0xfb, 0xf9,
-+ 0xfe, 0xd2, 0x33, 0xbb, 0x76, 0xfe, 0x7c, 0xa8,
-+ 0x66, 0xf7, 0xe7, 0x85, 0x9f, 0x1f, 0x85, 0x57,
-+ 0x88, 0xe1, 0xe9, 0x63, 0xe4, 0xd8, 0x1c, 0xa1,
-+ 0xfb, 0xda, 0x44, 0x05, 0x2e, 0x1d, 0x3a, 0x1c,
-+ 0xff, 0xc8, 0x3b, 0xc0, 0xfe, 0xda, 0x22, 0x0b,
-+ 0x43, 0xd6, 0x88, 0x39, 0x4c, 0x4a, 0xa6, 0x69,
-+ 0x18, 0x93, 0x42, 0x4e, 0xb5, 0xcc, 0x66, 0x0d,
-+ 0x09, 0xf8, 0x1e, 0x7c, 0xd3, 0x3c, 0x99, 0x0d,
-+ 0x50, 0x1d, 0x62, 0xe9, 0x57, 0x06, 0xbf, 0x19,
-+ 0x88, 0xdd, 0xad, 0x7b, 0x4f, 0xf9, 0xc7, 0x82,
-+ 0x6d, 0x8d, 0xc8, 0xc4, 0xc5, 0x78, 0x17, 0x20,
-+ 0x15, 0xc5, 0x52, 0x41, 0xcf, 0x5b, 0xd6, 0x7f,
-+ 0x94, 0x02, 0x41, 0xe0, 0x40, 0x22, 0x03, 0x5e,
-+ 0xd1, 0x53, 0xd4, 0x86, 0xd3, 0x2c, 0x9f, 0x0f,
-+ 0x96, 0xe3, 0x6b, 0x9a, 0x76, 0x32, 0x06, 0x47,
-+ 0x4b, 0x11, 0xb3, 0xdd, 0x03, 0x65, 0xbd, 0x9b,
-+ 0x01, 0xda, 0x9c, 0xb9, 0x7e, 0x3f, 0x6a, 0xc4,
-+ 0x7b, 0xea, 0xd4, 0x3c, 0xb9, 0xfb, 0x5c, 0x6b,
-+ 0x64, 0x33, 0x52, 0xba, 0x64, 0x78, 0x8f, 0xa4,
-+ 0xaf, 0x7a, 0x61, 0x8d, 0xbc, 0xc5, 0x73, 0xe9,
-+ 0x6b, 0x58, 0x97, 0x4b, 0xbf, 0x63, 0x22, 0xd3,
-+ 0x37, 0x02, 0x54, 0xc5, 0xb9, 0x16, 0x4a, 0xf0,
-+ 0x19, 0xd8, 0x94, 0x57, 0xb8, 0x8a, 0xb3, 0x16,
-+ 0x3b, 0xd0, 0x84, 0x8e, 0x67, 0xa6, 0xa3, 0x7d,
-+ 0x78, 0xec, 0x00
-+};
-+static const u8 enc_output012[] __initconst = {
-+ 0x52, 0x34, 0xb3, 0x65, 0x3b, 0xb7, 0xe5, 0xd3,
-+ 0xab, 0x49, 0x17, 0x60, 0xd2, 0x52, 0x56, 0xdf,
-+ 0xdf, 0x34, 0x56, 0x82, 0xe2, 0xbe, 0xe5, 0xe1,
-+ 0x28, 0xd1, 0x4e, 0x5f, 0x4f, 0x01, 0x7d, 0x3f,
-+ 0x99, 0x6b, 0x30, 0x6e, 0x1a, 0x7c, 0x4c, 0x8e,
-+ 0x62, 0x81, 0xae, 0x86, 0x3f, 0x6b, 0xd0, 0xb5,
-+ 0xa9, 0xcf, 0x50, 0xf1, 0x02, 0x12, 0xa0, 0x0b,
-+ 0x24, 0xe9, 0xe6, 0x72, 0x89, 0x2c, 0x52, 0x1b,
-+ 0x34, 0x38, 0xf8, 0x75, 0x5f, 0xa0, 0x74, 0xe2,
-+ 0x99, 0xdd, 0xa6, 0x4b, 0x14, 0x50, 0x4e, 0xf1,
-+ 0xbe, 0xd6, 0x9e, 0xdb, 0xb2, 0x24, 0x27, 0x74,
-+ 0x12, 0x4a, 0x78, 0x78, 0x17, 0xa5, 0x58, 0x8e,
-+ 0x2f, 0xf9, 0xf4, 0x8d, 0xee, 0x03, 0x88, 0xae,
-+ 0xb8, 0x29, 0xa1, 0x2f, 0x4b, 0xee, 0x92, 0xbd,
-+ 0x87, 0xb3, 0xce, 0x34, 0x21, 0x57, 0x46, 0x04,
-+ 0x49, 0x0c, 0x80, 0xf2, 0x01, 0x13, 0xa1, 0x55,
-+ 0xb3, 0xff, 0x44, 0x30, 0x3c, 0x1c, 0xd0, 0xef,
-+ 0xbc, 0x18, 0x74, 0x26, 0xad, 0x41, 0x5b, 0x5b,
-+ 0x3e, 0x9a, 0x7a, 0x46, 0x4f, 0x16, 0xd6, 0x74,
-+ 0x5a, 0xb7, 0x3a, 0x28, 0x31, 0xd8, 0xae, 0x26,
-+ 0xac, 0x50, 0x53, 0x86, 0xf2, 0x56, 0xd7, 0x3f,
-+ 0x29, 0xbc, 0x45, 0x68, 0x8e, 0xcb, 0x98, 0x64,
-+ 0xdd, 0xc9, 0xba, 0xb8, 0x4b, 0x7b, 0x82, 0xdd,
-+ 0x14, 0xa7, 0xcb, 0x71, 0x72, 0x00, 0x5c, 0xad,
-+ 0x7b, 0x6a, 0x89, 0xa4, 0x3d, 0xbf, 0xb5, 0x4b,
-+ 0x3e, 0x7c, 0x5a, 0xcf, 0xb8, 0xa1, 0xc5, 0x6e,
-+ 0xc8, 0xb6, 0x31, 0x57, 0x7b, 0xdf, 0xa5, 0x7e,
-+ 0xb1, 0xd6, 0x42, 0x2a, 0x31, 0x36, 0xd1, 0xd0,
-+ 0x3f, 0x7a, 0xe5, 0x94, 0xd6, 0x36, 0xa0, 0x6f,
-+ 0xb7, 0x40, 0x7d, 0x37, 0xc6, 0x55, 0x7c, 0x50,
-+ 0x40, 0x6d, 0x29, 0x89, 0xe3, 0x5a, 0xae, 0x97,
-+ 0xe7, 0x44, 0x49, 0x6e, 0xbd, 0x81, 0x3d, 0x03,
-+ 0x93, 0x06, 0x12, 0x06, 0xe2, 0x41, 0x12, 0x4a,
-+ 0xf1, 0x6a, 0xa4, 0x58, 0xa2, 0xfb, 0xd2, 0x15,
-+ 0xba, 0xc9, 0x79, 0xc9, 0xce, 0x5e, 0x13, 0xbb,
-+ 0xf1, 0x09, 0x04, 0xcc, 0xfd, 0xe8, 0x51, 0x34,
-+ 0x6a, 0xe8, 0x61, 0x88, 0xda, 0xed, 0x01, 0x47,
-+ 0x84, 0xf5, 0x73, 0x25, 0xf9, 0x1c, 0x42, 0x86,
-+ 0x07, 0xf3, 0x5b, 0x1a, 0x01, 0xb3, 0xeb, 0x24,
-+ 0x32, 0x8d, 0xf6, 0xed, 0x7c, 0x4b, 0xeb, 0x3c,
-+ 0x36, 0x42, 0x28, 0xdf, 0xdf, 0xb6, 0xbe, 0xd9,
-+ 0x8c, 0x52, 0xd3, 0x2b, 0x08, 0x90, 0x8c, 0xe7,
-+ 0x98, 0x31, 0xe2, 0x32, 0x8e, 0xfc, 0x11, 0x48,
-+ 0x00, 0xa8, 0x6a, 0x42, 0x4a, 0x02, 0xc6, 0x4b,
-+ 0x09, 0xf1, 0xe3, 0x49, 0xf3, 0x45, 0x1f, 0x0e,
-+ 0xbc, 0x56, 0xe2, 0xe4, 0xdf, 0xfb, 0xeb, 0x61,
-+ 0xfa, 0x24, 0xc1, 0x63, 0x75, 0xbb, 0x47, 0x75,
-+ 0xaf, 0xe1, 0x53, 0x16, 0x96, 0x21, 0x85, 0x26,
-+ 0x11, 0xb3, 0x76, 0xe3, 0x23, 0xa1, 0x6b, 0x74,
-+ 0x37, 0xd0, 0xde, 0x06, 0x90, 0x71, 0x5d, 0x43,
-+ 0x88, 0x9b, 0x00, 0x54, 0xa6, 0x75, 0x2f, 0xa1,
-+ 0xc2, 0x0b, 0x73, 0x20, 0x1d, 0xb6, 0x21, 0x79,
-+ 0x57, 0x3f, 0xfa, 0x09, 0xbe, 0x8a, 0x33, 0xc3,
-+ 0x52, 0xf0, 0x1d, 0x82, 0x31, 0xd1, 0x55, 0xb5,
-+ 0x6c, 0x99, 0x25, 0xcf, 0x5c, 0x32, 0xce, 0xe9,
-+ 0x0d, 0xfa, 0x69, 0x2c, 0xd5, 0x0d, 0xc5, 0x6d,
-+ 0x86, 0xd0, 0x0c, 0x3b, 0x06, 0x50, 0x79, 0xe8,
-+ 0xc3, 0xae, 0x04, 0xe6, 0xcd, 0x51, 0xe4, 0x26,
-+ 0x9b, 0x4f, 0x7e, 0xa6, 0x0f, 0xab, 0xd8, 0xe5,
-+ 0xde, 0xa9, 0x00, 0x95, 0xbe, 0xa3, 0x9d, 0x5d,
-+ 0xb2, 0x09, 0x70, 0x18, 0x1c, 0xf0, 0xac, 0x29,
-+ 0x23, 0x02, 0x29, 0x28, 0xd2, 0x74, 0x35, 0x57,
-+ 0x62, 0x0f, 0x24, 0xea, 0x5e, 0x33, 0xc2, 0x92,
-+ 0xf3, 0x78, 0x4d, 0x30, 0x1e, 0xa1, 0x99, 0xa9,
-+ 0x82, 0xb0, 0x42, 0x31, 0x8d, 0xad, 0x8a, 0xbc,
-+ 0xfc, 0xd4, 0x57, 0x47, 0x3e, 0xb4, 0x50, 0xdd,
-+ 0x6e, 0x2c, 0x80, 0x4d, 0x22, 0xf1, 0xfb, 0x57,
-+ 0xc4, 0xdd, 0x17, 0xe1, 0x8a, 0x36, 0x4a, 0xb3,
-+ 0x37, 0xca, 0xc9, 0x4e, 0xab, 0xd5, 0x69, 0xc4,
-+ 0xf4, 0xbc, 0x0b, 0x3b, 0x44, 0x4b, 0x29, 0x9c,
-+ 0xee, 0xd4, 0x35, 0x22, 0x21, 0xb0, 0x1f, 0x27,
-+ 0x64, 0xa8, 0x51, 0x1b, 0xf0, 0x9f, 0x19, 0x5c,
-+ 0xfb, 0x5a, 0x64, 0x74, 0x70, 0x45, 0x09, 0xf5,
-+ 0x64, 0xfe, 0x1a, 0x2d, 0xc9, 0x14, 0x04, 0x14,
-+ 0xcf, 0xd5, 0x7d, 0x60, 0xaf, 0x94, 0x39, 0x94,
-+ 0xe2, 0x7d, 0x79, 0x82, 0xd0, 0x65, 0x3b, 0x6b,
-+ 0x9c, 0x19, 0x84, 0xb4, 0x6d, 0xb3, 0x0c, 0x99,
-+ 0xc0, 0x56, 0xa8, 0xbd, 0x73, 0xce, 0x05, 0x84,
-+ 0x3e, 0x30, 0xaa, 0xc4, 0x9b, 0x1b, 0x04, 0x2a,
-+ 0x9f, 0xd7, 0x43, 0x2b, 0x23, 0xdf, 0xbf, 0xaa,
-+ 0xd5, 0xc2, 0x43, 0x2d, 0x70, 0xab, 0xdc, 0x75,
-+ 0xad, 0xac, 0xf7, 0xc0, 0xbe, 0x67, 0xb2, 0x74,
-+ 0xed, 0x67, 0x10, 0x4a, 0x92, 0x60, 0xc1, 0x40,
-+ 0x50, 0x19, 0x8a, 0x8a, 0x8c, 0x09, 0x0e, 0x72,
-+ 0xe1, 0x73, 0x5e, 0xe8, 0x41, 0x85, 0x63, 0x9f,
-+ 0x3f, 0xd7, 0x7d, 0xc4, 0xfb, 0x22, 0x5d, 0x92,
-+ 0x6c, 0xb3, 0x1e, 0xe2, 0x50, 0x2f, 0x82, 0xa8,
-+ 0x28, 0xc0, 0xb5, 0xd7, 0x5f, 0x68, 0x0d, 0x2c,
-+ 0x2d, 0xaf, 0x7e, 0xfa, 0x2e, 0x08, 0x0f, 0x1f,
-+ 0x70, 0x9f, 0xe9, 0x19, 0x72, 0x55, 0xf8, 0xfb,
-+ 0x51, 0xd2, 0x33, 0x5d, 0xa0, 0xd3, 0x2b, 0x0a,
-+ 0x6c, 0xbc, 0x4e, 0xcf, 0x36, 0x4d, 0xdc, 0x3b,
-+ 0xe9, 0x3e, 0x81, 0x7c, 0x61, 0xdb, 0x20, 0x2d,
-+ 0x3a, 0xc3, 0xb3, 0x0c, 0x1e, 0x00, 0xb9, 0x7c,
-+ 0xf5, 0xca, 0x10, 0x5f, 0x3a, 0x71, 0xb3, 0xe4,
-+ 0x20, 0xdb, 0x0c, 0x2a, 0x98, 0x63, 0x45, 0x00,
-+ 0x58, 0xf6, 0x68, 0xe4, 0x0b, 0xda, 0x13, 0x3b,
-+ 0x60, 0x5c, 0x76, 0xdb, 0xb9, 0x97, 0x71, 0xe4,
-+ 0xd9, 0xb7, 0xdb, 0xbd, 0x68, 0xc7, 0x84, 0x84,
-+ 0xaa, 0x7c, 0x68, 0x62, 0x5e, 0x16, 0xfc, 0xba,
-+ 0x72, 0xaa, 0x9a, 0xa9, 0xeb, 0x7c, 0x75, 0x47,
-+ 0x97, 0x7e, 0xad, 0xe2, 0xd9, 0x91, 0xe8, 0xe4,
-+ 0xa5, 0x31, 0xd7, 0x01, 0x8e, 0xa2, 0x11, 0x88,
-+ 0x95, 0xb9, 0xf2, 0x9b, 0xd3, 0x7f, 0x1b, 0x81,
-+ 0x22, 0xf7, 0x98, 0x60, 0x0a, 0x64, 0xa6, 0xc1,
-+ 0xf6, 0x49, 0xc7, 0xe3, 0x07, 0x4d, 0x94, 0x7a,
-+ 0xcf, 0x6e, 0x68, 0x0c, 0x1b, 0x3f, 0x6e, 0x2e,
-+ 0xee, 0x92, 0xfa, 0x52, 0xb3, 0x59, 0xf8, 0xf1,
-+ 0x8f, 0x6a, 0x66, 0xa3, 0x82, 0x76, 0x4a, 0x07,
-+ 0x1a, 0xc7, 0xdd, 0xf5, 0xda, 0x9c, 0x3c, 0x24,
-+ 0xbf, 0xfd, 0x42, 0xa1, 0x10, 0x64, 0x6a, 0x0f,
-+ 0x89, 0xee, 0x36, 0xa5, 0xce, 0x99, 0x48, 0x6a,
-+ 0xf0, 0x9f, 0x9e, 0x69, 0xa4, 0x40, 0x20, 0xe9,
-+ 0x16, 0x15, 0xf7, 0xdb, 0x75, 0x02, 0xcb, 0xe9,
-+ 0x73, 0x8b, 0x3b, 0x49, 0x2f, 0xf0, 0xaf, 0x51,
-+ 0x06, 0x5c, 0xdf, 0x27, 0x27, 0x49, 0x6a, 0xd1,
-+ 0xcc, 0xc7, 0xb5, 0x63, 0xb5, 0xfc, 0xb8, 0x5c,
-+ 0x87, 0x7f, 0x84, 0xb4, 0xcc, 0x14, 0xa9, 0x53,
-+ 0xda, 0xa4, 0x56, 0xf8, 0xb6, 0x1b, 0xcc, 0x40,
-+ 0x27, 0x52, 0x06, 0x5a, 0x13, 0x81, 0xd7, 0x3a,
-+ 0xd4, 0x3b, 0xfb, 0x49, 0x65, 0x31, 0x33, 0xb2,
-+ 0xfa, 0xcd, 0xad, 0x58, 0x4e, 0x2b, 0xae, 0xd2,
-+ 0x20, 0xfb, 0x1a, 0x48, 0xb4, 0x3f, 0x9a, 0xd8,
-+ 0x7a, 0x35, 0x4a, 0xc8, 0xee, 0x88, 0x5e, 0x07,
-+ 0x66, 0x54, 0xb9, 0xec, 0x9f, 0xa3, 0xe3, 0xb9,
-+ 0x37, 0xaa, 0x49, 0x76, 0x31, 0xda, 0x74, 0x2d,
-+ 0x3c, 0xa4, 0x65, 0x10, 0x32, 0x38, 0xf0, 0xde,
-+ 0xd3, 0x99, 0x17, 0xaa, 0x71, 0xaa, 0x8f, 0x0f,
-+ 0x8c, 0xaf, 0xa2, 0xf8, 0x5d, 0x64, 0xba, 0x1d,
-+ 0xa3, 0xef, 0x96, 0x73, 0xe8, 0xa1, 0x02, 0x8d,
-+ 0x0c, 0x6d, 0xb8, 0x06, 0x90, 0xb8, 0x08, 0x56,
-+ 0x2c, 0xa7, 0x06, 0xc9, 0xc2, 0x38, 0xdb, 0x7c,
-+ 0x63, 0xb1, 0x57, 0x8e, 0xea, 0x7c, 0x79, 0xf3,
-+ 0x49, 0x1d, 0xfe, 0x9f, 0xf3, 0x6e, 0xb1, 0x1d,
-+ 0xba, 0x19, 0x80, 0x1a, 0x0a, 0xd3, 0xb0, 0x26,
-+ 0x21, 0x40, 0xb1, 0x7c, 0xf9, 0x4d, 0x8d, 0x10,
-+ 0xc1, 0x7e, 0xf4, 0xf6, 0x3c, 0xa8, 0xfd, 0x7c,
-+ 0xa3, 0x92, 0xb2, 0x0f, 0xaa, 0xcc, 0xa6, 0x11,
-+ 0xfe, 0x04, 0xe3, 0xd1, 0x7a, 0x32, 0x89, 0xdf,
-+ 0x0d, 0xc4, 0x8f, 0x79, 0x6b, 0xca, 0x16, 0x7c,
-+ 0x6e, 0xf9, 0xad, 0x0f, 0xf6, 0xfe, 0x27, 0xdb,
-+ 0xc4, 0x13, 0x70, 0xf1, 0x62, 0x1a, 0x4f, 0x79,
-+ 0x40, 0xc9, 0x9b, 0x8b, 0x21, 0xea, 0x84, 0xfa,
-+ 0xf5, 0xf1, 0x89, 0xce, 0xb7, 0x55, 0x0a, 0x80,
-+ 0x39, 0x2f, 0x55, 0x36, 0x16, 0x9c, 0x7b, 0x08,
-+ 0xbd, 0x87, 0x0d, 0xa5, 0x32, 0xf1, 0x52, 0x7c,
-+ 0xe8, 0x55, 0x60, 0x5b, 0xd7, 0x69, 0xe4, 0xfc,
-+ 0xfa, 0x12, 0x85, 0x96, 0xea, 0x50, 0x28, 0xab,
-+ 0x8a, 0xf7, 0xbb, 0x0e, 0x53, 0x74, 0xca, 0xa6,
-+ 0x27, 0x09, 0xc2, 0xb5, 0xde, 0x18, 0x14, 0xd9,
-+ 0xea, 0xe5, 0x29, 0x1c, 0x40, 0x56, 0xcf, 0xd7,
-+ 0xae, 0x05, 0x3f, 0x65, 0xaf, 0x05, 0x73, 0xe2,
-+ 0x35, 0x96, 0x27, 0x07, 0x14, 0xc0, 0xad, 0x33,
-+ 0xf1, 0xdc, 0x44, 0x7a, 0x89, 0x17, 0x77, 0xd2,
-+ 0x9c, 0x58, 0x60, 0xf0, 0x3f, 0x7b, 0x2d, 0x2e,
-+ 0x57, 0x95, 0x54, 0x87, 0xed, 0xf2, 0xc7, 0x4c,
-+ 0xf0, 0xae, 0x56, 0x29, 0x19, 0x7d, 0x66, 0x4b,
-+ 0x9b, 0x83, 0x84, 0x42, 0x3b, 0x01, 0x25, 0x66,
-+ 0x8e, 0x02, 0xde, 0xb9, 0x83, 0x54, 0x19, 0xf6,
-+ 0x9f, 0x79, 0x0d, 0x67, 0xc5, 0x1d, 0x7a, 0x44,
-+ 0x02, 0x98, 0xa7, 0x16, 0x1c, 0x29, 0x0d, 0x74,
-+ 0xff, 0x85, 0x40, 0x06, 0xef, 0x2c, 0xa9, 0xc6,
-+ 0xf5, 0x53, 0x07, 0x06, 0xae, 0xe4, 0xfa, 0x5f,
-+ 0xd8, 0x39, 0x4d, 0xf1, 0x9b, 0x6b, 0xd9, 0x24,
-+ 0x84, 0xfe, 0x03, 0x4c, 0xb2, 0x3f, 0xdf, 0xa1,
-+ 0x05, 0x9e, 0x50, 0x14, 0x5a, 0xd9, 0x1a, 0xa2,
-+ 0xa7, 0xfa, 0xfa, 0x17, 0xf7, 0x78, 0xd6, 0xb5,
-+ 0x92, 0x61, 0x91, 0xac, 0x36, 0xfa, 0x56, 0x0d,
-+ 0x38, 0x32, 0x18, 0x85, 0x08, 0x58, 0x37, 0xf0,
-+ 0x4b, 0xdb, 0x59, 0xe7, 0xa4, 0x34, 0xc0, 0x1b,
-+ 0x01, 0xaf, 0x2d, 0xde, 0xa1, 0xaa, 0x5d, 0xd3,
-+ 0xec, 0xe1, 0xd4, 0xf7, 0xe6, 0x54, 0x68, 0xf0,
-+ 0x51, 0x97, 0xa7, 0x89, 0xea, 0x24, 0xad, 0xd3,
-+ 0x6e, 0x47, 0x93, 0x8b, 0x4b, 0xb4, 0xf7, 0x1c,
-+ 0x42, 0x06, 0x67, 0xe8, 0x99, 0xf6, 0xf5, 0x7b,
-+ 0x85, 0xb5, 0x65, 0xb5, 0xb5, 0xd2, 0x37, 0xf5,
-+ 0xf3, 0x02, 0xa6, 0x4d, 0x11, 0xa7, 0xdc, 0x51,
-+ 0x09, 0x7f, 0xa0, 0xd8, 0x88, 0x1c, 0x13, 0x71,
-+ 0xae, 0x9c, 0xb7, 0x7b, 0x34, 0xd6, 0x4e, 0x68,
-+ 0x26, 0x83, 0x51, 0xaf, 0x1d, 0xee, 0x8b, 0xbb,
-+ 0x69, 0x43, 0x2b, 0x9e, 0x8a, 0xbc, 0x02, 0x0e,
-+ 0xa0, 0x1b, 0xe0, 0xa8, 0x5f, 0x6f, 0xaf, 0x1b,
-+ 0x8f, 0xe7, 0x64, 0x71, 0x74, 0x11, 0x7e, 0xa8,
-+ 0xd8, 0xf9, 0x97, 0x06, 0xc3, 0xb6, 0xfb, 0xfb,
-+ 0xb7, 0x3d, 0x35, 0x9d, 0x3b, 0x52, 0xed, 0x54,
-+ 0xca, 0xf4, 0x81, 0x01, 0x2d, 0x1b, 0xc3, 0xa7,
-+ 0x00, 0x3d, 0x1a, 0x39, 0x54, 0xe1, 0xf6, 0xff,
-+ 0xed, 0x6f, 0x0b, 0x5a, 0x68, 0xda, 0x58, 0xdd,
-+ 0xa9, 0xcf, 0x5c, 0x4a, 0xe5, 0x09, 0x4e, 0xde,
-+ 0x9d, 0xbc, 0x3e, 0xee, 0x5a, 0x00, 0x3b, 0x2c,
-+ 0x87, 0x10, 0x65, 0x60, 0xdd, 0xd7, 0x56, 0xd1,
-+ 0x4c, 0x64, 0x45, 0xe4, 0x21, 0xec, 0x78, 0xf8,
-+ 0x25, 0x7a, 0x3e, 0x16, 0x5d, 0x09, 0x53, 0x14,
-+ 0xbe, 0x4f, 0xae, 0x87, 0xd8, 0xd1, 0xaa, 0x3c,
-+ 0xf6, 0x3e, 0xa4, 0x70, 0x8c, 0x5e, 0x70, 0xa4,
-+ 0xb3, 0x6b, 0x66, 0x73, 0xd3, 0xbf, 0x31, 0x06,
-+ 0x19, 0x62, 0x93, 0x15, 0xf2, 0x86, 0xe4, 0x52,
-+ 0x7e, 0x53, 0x4c, 0x12, 0x38, 0xcc, 0x34, 0x7d,
-+ 0x57, 0xf6, 0x42, 0x93, 0x8a, 0xc4, 0xee, 0x5c,
-+ 0x8a, 0xe1, 0x52, 0x8f, 0x56, 0x64, 0xf6, 0xa6,
-+ 0xd1, 0x91, 0x57, 0x70, 0xcd, 0x11, 0x76, 0xf5,
-+ 0x59, 0x60, 0x60, 0x3c, 0xc1, 0xc3, 0x0b, 0x7f,
-+ 0x58, 0x1a, 0x50, 0x91, 0xf1, 0x68, 0x8f, 0x6e,
-+ 0x74, 0x74, 0xa8, 0x51, 0x0b, 0xf7, 0x7a, 0x98,
-+ 0x37, 0xf2, 0x0a, 0x0e, 0xa4, 0x97, 0x04, 0xb8,
-+ 0x9b, 0xfd, 0xa0, 0xea, 0xf7, 0x0d, 0xe1, 0xdb,
-+ 0x03, 0xf0, 0x31, 0x29, 0xf8, 0xdd, 0x6b, 0x8b,
-+ 0x5d, 0xd8, 0x59, 0xa9, 0x29, 0xcf, 0x9a, 0x79,
-+ 0x89, 0x19, 0x63, 0x46, 0x09, 0x79, 0x6a, 0x11,
-+ 0xda, 0x63, 0x68, 0x48, 0x77, 0x23, 0xfb, 0x7d,
-+ 0x3a, 0x43, 0xcb, 0x02, 0x3b, 0x7a, 0x6d, 0x10,
-+ 0x2a, 0x9e, 0xac, 0xf1, 0xd4, 0x19, 0xf8, 0x23,
-+ 0x64, 0x1d, 0x2c, 0x5f, 0xf2, 0xb0, 0x5c, 0x23,
-+ 0x27, 0xf7, 0x27, 0x30, 0x16, 0x37, 0xb1, 0x90,
-+ 0xab, 0x38, 0xfb, 0x55, 0xcd, 0x78, 0x58, 0xd4,
-+ 0x7d, 0x43, 0xf6, 0x45, 0x5e, 0x55, 0x8d, 0xb1,
-+ 0x02, 0x65, 0x58, 0xb4, 0x13, 0x4b, 0x36, 0xf7,
-+ 0xcc, 0xfe, 0x3d, 0x0b, 0x82, 0xe2, 0x12, 0x11,
-+ 0xbb, 0xe6, 0xb8, 0x3a, 0x48, 0x71, 0xc7, 0x50,
-+ 0x06, 0x16, 0x3a, 0xe6, 0x7c, 0x05, 0xc7, 0xc8,
-+ 0x4d, 0x2f, 0x08, 0x6a, 0x17, 0x9a, 0x95, 0x97,
-+ 0x50, 0x68, 0xdc, 0x28, 0x18, 0xc4, 0x61, 0x38,
-+ 0xb9, 0xe0, 0x3e, 0x78, 0xdb, 0x29, 0xe0, 0x9f,
-+ 0x52, 0xdd, 0xf8, 0x4f, 0x91, 0xc1, 0xd0, 0x33,
-+ 0xa1, 0x7a, 0x8e, 0x30, 0x13, 0x82, 0x07, 0x9f,
-+ 0xd3, 0x31, 0x0f, 0x23, 0xbe, 0x32, 0x5a, 0x75,
-+ 0xcf, 0x96, 0xb2, 0xec, 0xb5, 0x32, 0xac, 0x21,
-+ 0xd1, 0x82, 0x33, 0xd3, 0x15, 0x74, 0xbd, 0x90,
-+ 0xf1, 0x2c, 0xe6, 0x5f, 0x8d, 0xe3, 0x02, 0xe8,
-+ 0xe9, 0xc4, 0xca, 0x96, 0xeb, 0x0e, 0xbc, 0x91,
-+ 0xf4, 0xb9, 0xea, 0xd9, 0x1b, 0x75, 0xbd, 0xe1,
-+ 0xac, 0x2a, 0x05, 0x37, 0x52, 0x9b, 0x1b, 0x3f,
-+ 0x5a, 0xdc, 0x21, 0xc3, 0x98, 0xbb, 0xaf, 0xa3,
-+ 0xf2, 0x00, 0xbf, 0x0d, 0x30, 0x89, 0x05, 0xcc,
-+ 0xa5, 0x76, 0xf5, 0x06, 0xf0, 0xc6, 0x54, 0x8a,
-+ 0x5d, 0xd4, 0x1e, 0xc1, 0xf2, 0xce, 0xb0, 0x62,
-+ 0xc8, 0xfc, 0x59, 0x42, 0x9a, 0x90, 0x60, 0x55,
-+ 0xfe, 0x88, 0xa5, 0x8b, 0xb8, 0x33, 0x0c, 0x23,
-+ 0x24, 0x0d, 0x15, 0x70, 0x37, 0x1e, 0x3d, 0xf6,
-+ 0xd2, 0xea, 0x92, 0x10, 0xb2, 0xc4, 0x51, 0xac,
-+ 0xf2, 0xac, 0xf3, 0x6b, 0x6c, 0xaa, 0xcf, 0x12,
-+ 0xc5, 0x6c, 0x90, 0x50, 0xb5, 0x0c, 0xfc, 0x1a,
-+ 0x15, 0x52, 0xe9, 0x26, 0xc6, 0x52, 0xa4, 0xe7,
-+ 0x81, 0x69, 0xe1, 0xe7, 0x9e, 0x30, 0x01, 0xec,
-+ 0x84, 0x89, 0xb2, 0x0d, 0x66, 0xdd, 0xce, 0x28,
-+ 0x5c, 0xec, 0x98, 0x46, 0x68, 0x21, 0x9f, 0x88,
-+ 0x3f, 0x1f, 0x42, 0x77, 0xce, 0xd0, 0x61, 0xd4,
-+ 0x20, 0xa7, 0xff, 0x53, 0xad, 0x37, 0xd0, 0x17,
-+ 0x35, 0xc9, 0xfc, 0xba, 0x0a, 0x78, 0x3f, 0xf2,
-+ 0xcc, 0x86, 0x89, 0xe8, 0x4b, 0x3c, 0x48, 0x33,
-+ 0x09, 0x7f, 0xc6, 0xc0, 0xdd, 0xb8, 0xfd, 0x7a,
-+ 0x66, 0x66, 0x65, 0xeb, 0x47, 0xa7, 0x04, 0x28,
-+ 0xa3, 0x19, 0x8e, 0xa9, 0xb1, 0x13, 0x67, 0x62,
-+ 0x70, 0xcf, 0xd6
-+};
-+static const u8 enc_assoc012[] __initconst = {
-+ 0xb1, 0x69, 0x83, 0x87, 0x30, 0xaa, 0x5d, 0xb8,
-+ 0x77, 0xe8, 0x21, 0xff, 0x06, 0x59, 0x35, 0xce,
-+ 0x75, 0xfe, 0x38, 0xef, 0xb8, 0x91, 0x43, 0x8c,
-+ 0xcf, 0x70, 0xdd, 0x0a, 0x68, 0xbf, 0xd4, 0xbc,
-+ 0x16, 0x76, 0x99, 0x36, 0x1e, 0x58, 0x79, 0x5e,
-+ 0xd4, 0x29, 0xf7, 0x33, 0x93, 0x48, 0xdb, 0x5f,
-+ 0x01, 0xae, 0x9c, 0xb6, 0xe4, 0x88, 0x6d, 0x2b,
-+ 0x76, 0x75, 0xe0, 0xf3, 0x74, 0xe2, 0xc9
-+};
-+static const u8 enc_nonce012[] __initconst = {
-+ 0x05, 0xa3, 0x93, 0xed, 0x30, 0xc5, 0xa2, 0x06
-+};
-+static const u8 enc_key012[] __initconst = {
-+ 0xb3, 0x35, 0x50, 0x03, 0x54, 0x2e, 0x40, 0x5e,
-+ 0x8f, 0x59, 0x8e, 0xc5, 0x90, 0xd5, 0x27, 0x2d,
-+ 0xba, 0x29, 0x2e, 0xcb, 0x1b, 0x70, 0x44, 0x1e,
-+ 0x65, 0x91, 0x6e, 0x2a, 0x79, 0x22, 0xda, 0x64
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input053[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x80, 0x94, 0x17, 0x83,
-+ 0x55, 0xd3, 0x04, 0x84, 0x64, 0x43, 0xfe, 0xe8,
-+ 0xdf, 0x99, 0x47, 0x03, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x80, 0xe0, 0x30, 0xbe, 0xeb, 0xd3, 0x29, 0xbe
-+};
-+static const u8 enc_output053[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xe6, 0xd3, 0xd7, 0x32, 0x4a, 0x1c, 0xbb, 0xa7,
-+ 0x77, 0xbb, 0xb0, 0xec, 0xdd, 0xa3, 0x78, 0x07
-+};
-+static const u8 enc_assoc053[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce053[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key053[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input054[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x80, 0x94, 0x17, 0x83,
-+ 0x55, 0xd3, 0x04, 0x84, 0x64, 0x43, 0xfe, 0xe8,
-+ 0xdf, 0x99, 0x47, 0x03, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x80, 0xe0, 0x30, 0xbe, 0xeb, 0xd3, 0x29, 0xbe,
-+ 0xe3, 0xbc, 0xdb, 0x5b, 0x1e, 0xde, 0xfc, 0xfe,
-+ 0x8b, 0xcd, 0xa1, 0xb6, 0xa1, 0x5c, 0x8c, 0x2b,
-+ 0x08, 0x69, 0xff, 0xd2, 0xec, 0x5e, 0x26, 0xe5,
-+ 0x53, 0xb7, 0xb2, 0x27, 0xfe, 0x87, 0xfd, 0xbd
-+};
-+static const u8 enc_output054[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x06, 0x2d, 0xe6, 0x79, 0x5f, 0x27, 0x4f, 0xd2,
-+ 0xa3, 0x05, 0xd7, 0x69, 0x80, 0xbc, 0x9c, 0xce
-+};
-+static const u8 enc_assoc054[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce054[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key054[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input055[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x80, 0x94, 0x17, 0x83,
-+ 0x55, 0xd3, 0x04, 0x84, 0x64, 0x43, 0xfe, 0xe8,
-+ 0xdf, 0x99, 0x47, 0x03, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x80, 0xe0, 0x30, 0xbe, 0xeb, 0xd3, 0x29, 0xbe,
-+ 0xe3, 0xbc, 0xdb, 0x5b, 0x1e, 0xde, 0xfc, 0xfe,
-+ 0x8b, 0xcd, 0xa1, 0xb6, 0xa1, 0x5c, 0x8c, 0x2b,
-+ 0x08, 0x69, 0xff, 0xd2, 0xec, 0x5e, 0x26, 0xe5,
-+ 0x53, 0xb7, 0xb2, 0x27, 0xfe, 0x87, 0xfd, 0xbd,
-+ 0x7a, 0xda, 0x44, 0x42, 0x42, 0x69, 0xbf, 0xfa,
-+ 0x55, 0x27, 0xf2, 0x70, 0xac, 0xf6, 0x85, 0x02,
-+ 0xb7, 0x4c, 0x5a, 0xe2, 0xe6, 0x0c, 0x05, 0x80,
-+ 0x98, 0x1a, 0x49, 0x38, 0x45, 0x93, 0x92, 0xc4,
-+ 0x9b, 0xb2, 0xf2, 0x84, 0xb6, 0x46, 0xef, 0xc7,
-+ 0xf3, 0xf0, 0xb1, 0x36, 0x1d, 0xc3, 0x48, 0xed,
-+ 0x77, 0xd3, 0x0b, 0xc5, 0x76, 0x92, 0xed, 0x38,
-+ 0xfb, 0xac, 0x01, 0x88, 0x38, 0x04, 0x88, 0xc7
-+};
-+static const u8 enc_output055[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xd8, 0xb4, 0x79, 0x02, 0xba, 0xae, 0xaf, 0xb3,
-+ 0x42, 0x03, 0x05, 0x15, 0x29, 0xaf, 0x28, 0x2e
-+};
-+static const u8 enc_assoc055[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce055[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key055[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input056[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x9b, 0xbc, 0x01, 0x17,
-+ 0x20, 0x66, 0xb8, 0xfc, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0x14, 0x2c, 0xd6, 0x41
-+};
-+static const u8 enc_output056[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xb3, 0x89, 0x1c, 0x84, 0x9c, 0xb5, 0x2c, 0x27,
-+ 0x74, 0x7e, 0xdf, 0xcf, 0x31, 0x21, 0x3b, 0xb6
-+};
-+static const u8 enc_assoc056[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce056[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key056[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input057[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x9b, 0xbc, 0x01, 0x17,
-+ 0x20, 0x66, 0xb8, 0xfc, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0x14, 0x2c, 0xd6, 0x41,
-+ 0x1c, 0x43, 0x24, 0xa4, 0xe1, 0x21, 0x03, 0x01,
-+ 0x74, 0x32, 0x5e, 0x49, 0x5e, 0xa3, 0x73, 0xd4,
-+ 0xf7, 0x96, 0x00, 0x2d, 0x13, 0xa1, 0xd9, 0x1a,
-+ 0xac, 0x48, 0x4d, 0xd8, 0x01, 0x78, 0x02, 0x42
-+};
-+static const u8 enc_output057[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xf0, 0xc1, 0x2d, 0x26, 0xef, 0x03, 0x02, 0x9b,
-+ 0x62, 0xc0, 0x08, 0xda, 0x27, 0xc5, 0xdc, 0x68
-+};
-+static const u8 enc_assoc057[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce057[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key057[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input058[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x9b, 0xbc, 0x01, 0x17,
-+ 0x20, 0x66, 0xb8, 0xfc, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0x14, 0x2c, 0xd6, 0x41,
-+ 0x1c, 0x43, 0x24, 0xa4, 0xe1, 0x21, 0x03, 0x01,
-+ 0x74, 0x32, 0x5e, 0x49, 0x5e, 0xa3, 0x73, 0xd4,
-+ 0xf7, 0x96, 0x00, 0x2d, 0x13, 0xa1, 0xd9, 0x1a,
-+ 0xac, 0x48, 0x4d, 0xd8, 0x01, 0x78, 0x02, 0x42,
-+ 0x85, 0x25, 0xbb, 0xbd, 0xbd, 0x96, 0x40, 0x05,
-+ 0xaa, 0xd8, 0x0d, 0x8f, 0x53, 0x09, 0x7a, 0xfd,
-+ 0x48, 0xb3, 0xa5, 0x1d, 0x19, 0xf3, 0xfa, 0x7f,
-+ 0x67, 0xe5, 0xb6, 0xc7, 0xba, 0x6c, 0x6d, 0x3b,
-+ 0x64, 0x4d, 0x0d, 0x7b, 0x49, 0xb9, 0x10, 0x38,
-+ 0x0c, 0x0f, 0x4e, 0xc9, 0xe2, 0x3c, 0xb7, 0x12,
-+ 0x88, 0x2c, 0xf4, 0x3a, 0x89, 0x6d, 0x12, 0xc7,
-+ 0x04, 0x53, 0xfe, 0x77, 0xc7, 0xfb, 0x77, 0x38
-+};
-+static const u8 enc_output058[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xee, 0x65, 0x78, 0x30, 0x01, 0xc2, 0x56, 0x91,
-+ 0xfa, 0x28, 0xd0, 0xf5, 0xf1, 0xc1, 0xd7, 0x62
-+};
-+static const u8 enc_assoc058[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce058[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key058[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input059[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x08, 0x80, 0x94, 0x17, 0x03,
-+ 0x55, 0xd3, 0x04, 0x04, 0x64, 0x43, 0xfe, 0x68,
-+ 0xdf, 0x99, 0x47, 0x83, 0x03, 0xfb, 0x3b, 0xfb,
-+ 0x80, 0xe0, 0x30, 0x3e, 0xeb, 0xd3, 0x29, 0x3e
-+};
-+static const u8 enc_output059[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x79, 0xba, 0x7a, 0x29, 0xf5, 0xa7, 0xbb, 0x75,
-+ 0x79, 0x7a, 0xf8, 0x7a, 0x61, 0x01, 0x29, 0xa4
-+};
-+static const u8 enc_assoc059[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
-+};
-+static const u8 enc_nonce059[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key059[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input060[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x08, 0x80, 0x94, 0x17, 0x03,
-+ 0x55, 0xd3, 0x04, 0x04, 0x64, 0x43, 0xfe, 0x68,
-+ 0xdf, 0x99, 0x47, 0x83, 0x03, 0xfb, 0x3b, 0xfb,
-+ 0x80, 0xe0, 0x30, 0x3e, 0xeb, 0xd3, 0x29, 0x3e,
-+ 0xe3, 0xbc, 0xdb, 0xdb, 0x1e, 0xde, 0xfc, 0x7e,
-+ 0x8b, 0xcd, 0xa1, 0x36, 0xa1, 0x5c, 0x8c, 0xab,
-+ 0x08, 0x69, 0xff, 0x52, 0xec, 0x5e, 0x26, 0x65,
-+ 0x53, 0xb7, 0xb2, 0xa7, 0xfe, 0x87, 0xfd, 0x3d
-+};
-+static const u8 enc_output060[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x36, 0xb1, 0x74, 0x38, 0x19, 0xe1, 0xb9, 0xba,
-+ 0x15, 0x51, 0xe8, 0xed, 0x92, 0x2a, 0x95, 0x9a
-+};
-+static const u8 enc_assoc060[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
-+};
-+static const u8 enc_nonce060[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key060[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input061[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x08, 0x80, 0x94, 0x17, 0x03,
-+ 0x55, 0xd3, 0x04, 0x04, 0x64, 0x43, 0xfe, 0x68,
-+ 0xdf, 0x99, 0x47, 0x83, 0x03, 0xfb, 0x3b, 0xfb,
-+ 0x80, 0xe0, 0x30, 0x3e, 0xeb, 0xd3, 0x29, 0x3e,
-+ 0xe3, 0xbc, 0xdb, 0xdb, 0x1e, 0xde, 0xfc, 0x7e,
-+ 0x8b, 0xcd, 0xa1, 0x36, 0xa1, 0x5c, 0x8c, 0xab,
-+ 0x08, 0x69, 0xff, 0x52, 0xec, 0x5e, 0x26, 0x65,
-+ 0x53, 0xb7, 0xb2, 0xa7, 0xfe, 0x87, 0xfd, 0x3d,
-+ 0x7a, 0xda, 0x44, 0xc2, 0x42, 0x69, 0xbf, 0x7a,
-+ 0x55, 0x27, 0xf2, 0xf0, 0xac, 0xf6, 0x85, 0x82,
-+ 0xb7, 0x4c, 0x5a, 0x62, 0xe6, 0x0c, 0x05, 0x00,
-+ 0x98, 0x1a, 0x49, 0xb8, 0x45, 0x93, 0x92, 0x44,
-+ 0x9b, 0xb2, 0xf2, 0x04, 0xb6, 0x46, 0xef, 0x47,
-+ 0xf3, 0xf0, 0xb1, 0xb6, 0x1d, 0xc3, 0x48, 0x6d,
-+ 0x77, 0xd3, 0x0b, 0x45, 0x76, 0x92, 0xed, 0xb8,
-+ 0xfb, 0xac, 0x01, 0x08, 0x38, 0x04, 0x88, 0x47
-+};
-+static const u8 enc_output061[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0xfe, 0xac, 0x49, 0x55, 0x55, 0x4e, 0x80, 0x6f,
-+ 0x3a, 0x19, 0x02, 0xe2, 0x44, 0x32, 0xc0, 0x8a
-+};
-+static const u8 enc_assoc061[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
-+};
-+static const u8 enc_nonce061[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key061[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input062[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0xf7, 0x7f, 0x6b, 0xe8, 0xfc,
-+ 0xaa, 0x2c, 0xfb, 0xfb, 0x9b, 0xbc, 0x01, 0x97,
-+ 0x20, 0x66, 0xb8, 0x7c, 0xfc, 0x04, 0xc4, 0x04,
-+ 0x7f, 0x1f, 0xcf, 0xc1, 0x14, 0x2c, 0xd6, 0xc1
-+};
-+static const u8 enc_output062[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0x20, 0xa3, 0x79, 0x8d, 0xf1, 0x29, 0x2c, 0x59,
-+ 0x72, 0xbf, 0x97, 0x41, 0xae, 0xc3, 0x8a, 0x19
-+};
-+static const u8 enc_assoc062[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f
-+};
-+static const u8 enc_nonce062[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key062[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input063[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0xf7, 0x7f, 0x6b, 0xe8, 0xfc,
-+ 0xaa, 0x2c, 0xfb, 0xfb, 0x9b, 0xbc, 0x01, 0x97,
-+ 0x20, 0x66, 0xb8, 0x7c, 0xfc, 0x04, 0xc4, 0x04,
-+ 0x7f, 0x1f, 0xcf, 0xc1, 0x14, 0x2c, 0xd6, 0xc1,
-+ 0x1c, 0x43, 0x24, 0x24, 0xe1, 0x21, 0x03, 0x81,
-+ 0x74, 0x32, 0x5e, 0xc9, 0x5e, 0xa3, 0x73, 0x54,
-+ 0xf7, 0x96, 0x00, 0xad, 0x13, 0xa1, 0xd9, 0x9a,
-+ 0xac, 0x48, 0x4d, 0x58, 0x01, 0x78, 0x02, 0xc2
-+};
-+static const u8 enc_output063[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xc0, 0x3d, 0x9f, 0x67, 0x35, 0x4a, 0x97, 0xb2,
-+ 0xf0, 0x74, 0xf7, 0x55, 0x15, 0x57, 0xe4, 0x9c
-+};
-+static const u8 enc_assoc063[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f
-+};
-+static const u8 enc_nonce063[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key063[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input064[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0xf7, 0x7f, 0x6b, 0xe8, 0xfc,
-+ 0xaa, 0x2c, 0xfb, 0xfb, 0x9b, 0xbc, 0x01, 0x97,
-+ 0x20, 0x66, 0xb8, 0x7c, 0xfc, 0x04, 0xc4, 0x04,
-+ 0x7f, 0x1f, 0xcf, 0xc1, 0x14, 0x2c, 0xd6, 0xc1,
-+ 0x1c, 0x43, 0x24, 0x24, 0xe1, 0x21, 0x03, 0x81,
-+ 0x74, 0x32, 0x5e, 0xc9, 0x5e, 0xa3, 0x73, 0x54,
-+ 0xf7, 0x96, 0x00, 0xad, 0x13, 0xa1, 0xd9, 0x9a,
-+ 0xac, 0x48, 0x4d, 0x58, 0x01, 0x78, 0x02, 0xc2,
-+ 0x85, 0x25, 0xbb, 0x3d, 0xbd, 0x96, 0x40, 0x85,
-+ 0xaa, 0xd8, 0x0d, 0x0f, 0x53, 0x09, 0x7a, 0x7d,
-+ 0x48, 0xb3, 0xa5, 0x9d, 0x19, 0xf3, 0xfa, 0xff,
-+ 0x67, 0xe5, 0xb6, 0x47, 0xba, 0x6c, 0x6d, 0xbb,
-+ 0x64, 0x4d, 0x0d, 0xfb, 0x49, 0xb9, 0x10, 0xb8,
-+ 0x0c, 0x0f, 0x4e, 0x49, 0xe2, 0x3c, 0xb7, 0x92,
-+ 0x88, 0x2c, 0xf4, 0xba, 0x89, 0x6d, 0x12, 0x47,
-+ 0x04, 0x53, 0xfe, 0xf7, 0xc7, 0xfb, 0x77, 0xb8
-+};
-+static const u8 enc_output064[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xc8, 0x6d, 0xa8, 0xdd, 0x65, 0x22, 0x86, 0xd5,
-+ 0x02, 0x13, 0xd3, 0x28, 0xd6, 0x3e, 0x40, 0x06
-+};
-+static const u8 enc_assoc064[] __initconst = {
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f
-+};
-+static const u8 enc_nonce064[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key064[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input065[] __initconst = {
-+ 0x5a, 0x92, 0xbf, 0x77, 0xff, 0x6b, 0xe8, 0x7c,
-+ 0x2a, 0x2c, 0xfb, 0x7b, 0x1b, 0xbc, 0x01, 0x17,
-+ 0xa0, 0x66, 0xb8, 0xfc, 0x7c, 0x04, 0xc4, 0x84,
-+ 0xff, 0x1f, 0xcf, 0x41, 0x94, 0x2c, 0xd6, 0x41
-+};
-+static const u8 enc_output065[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0xbe, 0xde, 0x90, 0x83, 0xce, 0xb3, 0x6d, 0xdf,
-+ 0xe5, 0xfa, 0x81, 0x1f, 0x95, 0x47, 0x1c, 0x67
-+};
-+static const u8 enc_assoc065[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce065[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key065[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input066[] __initconst = {
-+ 0x5a, 0x92, 0xbf, 0x77, 0xff, 0x6b, 0xe8, 0x7c,
-+ 0x2a, 0x2c, 0xfb, 0x7b, 0x1b, 0xbc, 0x01, 0x17,
-+ 0xa0, 0x66, 0xb8, 0xfc, 0x7c, 0x04, 0xc4, 0x84,
-+ 0xff, 0x1f, 0xcf, 0x41, 0x94, 0x2c, 0xd6, 0x41,
-+ 0x9c, 0x43, 0x24, 0xa4, 0x61, 0x21, 0x03, 0x01,
-+ 0xf4, 0x32, 0x5e, 0x49, 0xde, 0xa3, 0x73, 0xd4,
-+ 0x77, 0x96, 0x00, 0x2d, 0x93, 0xa1, 0xd9, 0x1a,
-+ 0x2c, 0x48, 0x4d, 0xd8, 0x81, 0x78, 0x02, 0x42
-+};
-+static const u8 enc_output066[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x30, 0x08, 0x74, 0xbb, 0x06, 0x92, 0xb6, 0x89,
-+ 0xde, 0xad, 0x9a, 0xe1, 0x5b, 0x06, 0x73, 0x90
-+};
-+static const u8 enc_assoc066[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce066[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key066[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input067[] __initconst = {
-+ 0x5a, 0x92, 0xbf, 0x77, 0xff, 0x6b, 0xe8, 0x7c,
-+ 0x2a, 0x2c, 0xfb, 0x7b, 0x1b, 0xbc, 0x01, 0x17,
-+ 0xa0, 0x66, 0xb8, 0xfc, 0x7c, 0x04, 0xc4, 0x84,
-+ 0xff, 0x1f, 0xcf, 0x41, 0x94, 0x2c, 0xd6, 0x41,
-+ 0x9c, 0x43, 0x24, 0xa4, 0x61, 0x21, 0x03, 0x01,
-+ 0xf4, 0x32, 0x5e, 0x49, 0xde, 0xa3, 0x73, 0xd4,
-+ 0x77, 0x96, 0x00, 0x2d, 0x93, 0xa1, 0xd9, 0x1a,
-+ 0x2c, 0x48, 0x4d, 0xd8, 0x81, 0x78, 0x02, 0x42,
-+ 0x05, 0x25, 0xbb, 0xbd, 0x3d, 0x96, 0x40, 0x05,
-+ 0x2a, 0xd8, 0x0d, 0x8f, 0xd3, 0x09, 0x7a, 0xfd,
-+ 0xc8, 0xb3, 0xa5, 0x1d, 0x99, 0xf3, 0xfa, 0x7f,
-+ 0xe7, 0xe5, 0xb6, 0xc7, 0x3a, 0x6c, 0x6d, 0x3b,
-+ 0xe4, 0x4d, 0x0d, 0x7b, 0xc9, 0xb9, 0x10, 0x38,
-+ 0x8c, 0x0f, 0x4e, 0xc9, 0x62, 0x3c, 0xb7, 0x12,
-+ 0x08, 0x2c, 0xf4, 0x3a, 0x09, 0x6d, 0x12, 0xc7,
-+ 0x84, 0x53, 0xfe, 0x77, 0x47, 0xfb, 0x77, 0x38
-+};
-+static const u8 enc_output067[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x99, 0xca, 0xd8, 0x5f, 0x45, 0xca, 0x40, 0x94,
-+ 0x2d, 0x0d, 0x4d, 0x5e, 0x95, 0x0a, 0xde, 0x22
-+};
-+static const u8 enc_assoc067[] __initconst = {
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
-+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce067[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key067[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input068[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0x55, 0xd3, 0x04, 0x84, 0x9b, 0xbc, 0x01, 0x17,
-+ 0xdf, 0x99, 0x47, 0x03, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x80, 0xe0, 0x30, 0xbe, 0x14, 0x2c, 0xd6, 0x41
-+};
-+static const u8 enc_output068[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x8b, 0xbe, 0x14, 0x52, 0x72, 0xe7, 0xc2, 0xd9,
-+ 0xa1, 0x89, 0x1a, 0x3a, 0xb0, 0x98, 0x3d, 0x9d
-+};
-+static const u8 enc_assoc068[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce068[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key068[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input069[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0x55, 0xd3, 0x04, 0x84, 0x9b, 0xbc, 0x01, 0x17,
-+ 0xdf, 0x99, 0x47, 0x03, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x80, 0xe0, 0x30, 0xbe, 0x14, 0x2c, 0xd6, 0x41,
-+ 0xe3, 0xbc, 0xdb, 0x5b, 0xe1, 0x21, 0x03, 0x01,
-+ 0x8b, 0xcd, 0xa1, 0xb6, 0x5e, 0xa3, 0x73, 0xd4,
-+ 0x08, 0x69, 0xff, 0xd2, 0x13, 0xa1, 0xd9, 0x1a,
-+ 0x53, 0xb7, 0xb2, 0x27, 0x01, 0x78, 0x02, 0x42
-+};
-+static const u8 enc_output069[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x3b, 0x41, 0x86, 0x19, 0x13, 0xa8, 0xf6, 0xde,
-+ 0x7f, 0x61, 0xe2, 0x25, 0x63, 0x1b, 0xc3, 0x82
-+};
-+static const u8 enc_assoc069[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce069[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key069[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input070[] __initconst = {
-+ 0x25, 0x6d, 0x40, 0x88, 0x7f, 0x6b, 0xe8, 0x7c,
-+ 0x55, 0xd3, 0x04, 0x84, 0x9b, 0xbc, 0x01, 0x17,
-+ 0xdf, 0x99, 0x47, 0x03, 0xfc, 0x04, 0xc4, 0x84,
-+ 0x80, 0xe0, 0x30, 0xbe, 0x14, 0x2c, 0xd6, 0x41,
-+ 0xe3, 0xbc, 0xdb, 0x5b, 0xe1, 0x21, 0x03, 0x01,
-+ 0x8b, 0xcd, 0xa1, 0xb6, 0x5e, 0xa3, 0x73, 0xd4,
-+ 0x08, 0x69, 0xff, 0xd2, 0x13, 0xa1, 0xd9, 0x1a,
-+ 0x53, 0xb7, 0xb2, 0x27, 0x01, 0x78, 0x02, 0x42,
-+ 0x7a, 0xda, 0x44, 0x42, 0xbd, 0x96, 0x40, 0x05,
-+ 0x55, 0x27, 0xf2, 0x70, 0x53, 0x09, 0x7a, 0xfd,
-+ 0xb7, 0x4c, 0x5a, 0xe2, 0x19, 0xf3, 0xfa, 0x7f,
-+ 0x98, 0x1a, 0x49, 0x38, 0xba, 0x6c, 0x6d, 0x3b,
-+ 0x9b, 0xb2, 0xf2, 0x84, 0x49, 0xb9, 0x10, 0x38,
-+ 0xf3, 0xf0, 0xb1, 0x36, 0xe2, 0x3c, 0xb7, 0x12,
-+ 0x77, 0xd3, 0x0b, 0xc5, 0x89, 0x6d, 0x12, 0xc7,
-+ 0xfb, 0xac, 0x01, 0x88, 0xc7, 0xfb, 0x77, 0x38
-+};
-+static const u8 enc_output070[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x84, 0x28, 0xbc, 0xf0, 0x23, 0xec, 0x6b, 0xf3,
-+ 0x1f, 0xd9, 0xef, 0xb2, 0x03, 0xff, 0x08, 0x71
-+};
-+static const u8 enc_assoc070[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce070[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key070[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input071[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x80, 0x94, 0x17, 0x83,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x64, 0x43, 0xfe, 0xe8,
-+ 0x20, 0x66, 0xb8, 0xfc, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0xeb, 0xd3, 0x29, 0xbe
-+};
-+static const u8 enc_output071[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0x13, 0x9f, 0xdf, 0x64, 0x74, 0xea, 0x24, 0xf5,
-+ 0x49, 0xb0, 0x75, 0x82, 0x5f, 0x2c, 0x76, 0x20
-+};
-+static const u8 enc_assoc071[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce071[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key071[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input072[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x80, 0x94, 0x17, 0x83,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x64, 0x43, 0xfe, 0xe8,
-+ 0x20, 0x66, 0xb8, 0xfc, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0xeb, 0xd3, 0x29, 0xbe,
-+ 0x1c, 0x43, 0x24, 0xa4, 0x1e, 0xde, 0xfc, 0xfe,
-+ 0x74, 0x32, 0x5e, 0x49, 0xa1, 0x5c, 0x8c, 0x2b,
-+ 0xf7, 0x96, 0x00, 0x2d, 0xec, 0x5e, 0x26, 0xe5,
-+ 0xac, 0x48, 0x4d, 0xd8, 0xfe, 0x87, 0xfd, 0xbd
-+};
-+static const u8 enc_output072[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xbb, 0xad, 0x8d, 0x86, 0x3b, 0x83, 0x5a, 0x8e,
-+ 0x86, 0x64, 0xfd, 0x1d, 0x45, 0x66, 0xb6, 0xb4
-+};
-+static const u8 enc_assoc072[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce072[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key072[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input073[] __initconst = {
-+ 0xda, 0x92, 0xbf, 0x77, 0x80, 0x94, 0x17, 0x83,
-+ 0xaa, 0x2c, 0xfb, 0x7b, 0x64, 0x43, 0xfe, 0xe8,
-+ 0x20, 0x66, 0xb8, 0xfc, 0x03, 0xfb, 0x3b, 0x7b,
-+ 0x7f, 0x1f, 0xcf, 0x41, 0xeb, 0xd3, 0x29, 0xbe,
-+ 0x1c, 0x43, 0x24, 0xa4, 0x1e, 0xde, 0xfc, 0xfe,
-+ 0x74, 0x32, 0x5e, 0x49, 0xa1, 0x5c, 0x8c, 0x2b,
-+ 0xf7, 0x96, 0x00, 0x2d, 0xec, 0x5e, 0x26, 0xe5,
-+ 0xac, 0x48, 0x4d, 0xd8, 0xfe, 0x87, 0xfd, 0xbd,
-+ 0x85, 0x25, 0xbb, 0xbd, 0x42, 0x69, 0xbf, 0xfa,
-+ 0xaa, 0xd8, 0x0d, 0x8f, 0xac, 0xf6, 0x85, 0x02,
-+ 0x48, 0xb3, 0xa5, 0x1d, 0xe6, 0x0c, 0x05, 0x80,
-+ 0x67, 0xe5, 0xb6, 0xc7, 0x45, 0x93, 0x92, 0xc4,
-+ 0x64, 0x4d, 0x0d, 0x7b, 0xb6, 0x46, 0xef, 0xc7,
-+ 0x0c, 0x0f, 0x4e, 0xc9, 0x1d, 0xc3, 0x48, 0xed,
-+ 0x88, 0x2c, 0xf4, 0x3a, 0x76, 0x92, 0xed, 0x38,
-+ 0x04, 0x53, 0xfe, 0x77, 0x38, 0x04, 0x88, 0xc7
-+};
-+static const u8 enc_output073[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0x42, 0xf2, 0x35, 0x42, 0x97, 0x84, 0x9a, 0x51,
-+ 0x1d, 0x53, 0xe5, 0x57, 0x17, 0x72, 0xf7, 0x1f
-+};
-+static const u8 enc_assoc073[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_nonce073[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0x32, 0x00
-+};
-+static const u8 enc_key073[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input076[] __initconst = {
-+ 0x1b, 0x99, 0x6f, 0x9a, 0x3c, 0xcc, 0x67, 0x85,
-+ 0xde, 0x22, 0xff, 0x5b, 0x8a, 0xdd, 0x95, 0x02,
-+ 0xce, 0x03, 0xa0, 0xfa, 0xf5, 0x99, 0x2a, 0x09,
-+ 0x52, 0x2c, 0xdd, 0x12, 0x06, 0xd2, 0x20, 0xb8,
-+ 0xf8, 0xbd, 0x07, 0xd1, 0xf1, 0xf5, 0xa1, 0xbd,
-+ 0x9a, 0x71, 0xd1, 0x1c, 0x7f, 0x57, 0x9b, 0x85,
-+ 0x58, 0x18, 0xc0, 0x8d, 0x4d, 0xe0, 0x36, 0x39,
-+ 0x31, 0x83, 0xb7, 0xf5, 0x90, 0xb3, 0x35, 0xae,
-+ 0xd8, 0xde, 0x5b, 0x57, 0xb1, 0x3c, 0x5f, 0xed,
-+ 0xe2, 0x44, 0x1c, 0x3e, 0x18, 0x4a, 0xa9, 0xd4,
-+ 0x6e, 0x61, 0x59, 0x85, 0x06, 0xb3, 0xe1, 0x1c,
-+ 0x43, 0xc6, 0x2c, 0xbc, 0xac, 0xec, 0xed, 0x33,
-+ 0x19, 0x08, 0x75, 0xb0, 0x12, 0x21, 0x8b, 0x19,
-+ 0x30, 0xfb, 0x7c, 0x38, 0xec, 0x45, 0xac, 0x11,
-+ 0xc3, 0x53, 0xd0, 0xcf, 0x93, 0x8d, 0xcc, 0xb9,
-+ 0xef, 0xad, 0x8f, 0xed, 0xbe, 0x46, 0xda, 0xa5
-+};
-+static const u8 enc_output076[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x4b, 0x0b, 0xda, 0x8a, 0xd0, 0x43, 0x83, 0x0d,
-+ 0x83, 0x19, 0xab, 0x82, 0xc5, 0x0c, 0x76, 0x63
-+};
-+static const u8 enc_assoc076[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce076[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb4, 0xf0
-+};
-+static const u8 enc_key076[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input077[] __initconst = {
-+ 0x86, 0xcb, 0xac, 0xae, 0x4d, 0x3f, 0x74, 0xae,
-+ 0x01, 0x21, 0x3e, 0x05, 0x51, 0xcc, 0x15, 0x16,
-+ 0x0e, 0xa1, 0xbe, 0x84, 0x08, 0xe3, 0xd5, 0xd7,
-+ 0x4f, 0x01, 0x46, 0x49, 0x95, 0xa6, 0x9e, 0x61,
-+ 0x76, 0xcb, 0x9e, 0x02, 0xb2, 0x24, 0x7e, 0xd2,
-+ 0x99, 0x89, 0x2f, 0x91, 0x82, 0xa4, 0x5c, 0xaf,
-+ 0x4c, 0x69, 0x40, 0x56, 0x11, 0x76, 0x6e, 0xdf,
-+ 0xaf, 0xdc, 0x28, 0x55, 0x19, 0xea, 0x30, 0x48,
-+ 0x0c, 0x44, 0xf0, 0x5e, 0x78, 0x1e, 0xac, 0xf8,
-+ 0xfc, 0xec, 0xc7, 0x09, 0x0a, 0xbb, 0x28, 0xfa,
-+ 0x5f, 0xd5, 0x85, 0xac, 0x8c, 0xda, 0x7e, 0x87,
-+ 0x72, 0xe5, 0x94, 0xe4, 0xce, 0x6c, 0x88, 0x32,
-+ 0x81, 0x93, 0x2e, 0x0f, 0x89, 0xf8, 0x77, 0xa1,
-+ 0xf0, 0x4d, 0x9c, 0x32, 0xb0, 0x6c, 0xf9, 0x0b,
-+ 0x0e, 0x76, 0x2b, 0x43, 0x0c, 0x4d, 0x51, 0x7c,
-+ 0x97, 0x10, 0x70, 0x68, 0xf4, 0x98, 0xef, 0x7f
-+};
-+static const u8 enc_output077[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x4b, 0xc9, 0x8f, 0x72, 0xc4, 0x94, 0xc2, 0xa4,
-+ 0x3c, 0x2b, 0x15, 0xa1, 0x04, 0x3f, 0x1c, 0xfa
-+};
-+static const u8 enc_assoc077[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce077[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfb, 0x66
-+};
-+static const u8 enc_key077[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input078[] __initconst = {
-+ 0xfa, 0xb1, 0xcd, 0xdf, 0x4f, 0xe1, 0x98, 0xef,
-+ 0x63, 0xad, 0xd8, 0x81, 0xd6, 0xea, 0xd6, 0xc5,
-+ 0x76, 0x37, 0xbb, 0xe9, 0x20, 0x18, 0xca, 0x7c,
-+ 0x0b, 0x96, 0xfb, 0xa0, 0x87, 0x1e, 0x93, 0x2d,
-+ 0xb1, 0xfb, 0xf9, 0x07, 0x61, 0xbe, 0x25, 0xdf,
-+ 0x8d, 0xfa, 0xf9, 0x31, 0xce, 0x57, 0x57, 0xe6,
-+ 0x17, 0xb3, 0xd7, 0xa9, 0xf0, 0xbf, 0x0f, 0xfe,
-+ 0x5d, 0x59, 0x1a, 0x33, 0xc1, 0x43, 0xb8, 0xf5,
-+ 0x3f, 0xd0, 0xb5, 0xa1, 0x96, 0x09, 0xfd, 0x62,
-+ 0xe5, 0xc2, 0x51, 0xa4, 0x28, 0x1a, 0x20, 0x0c,
-+ 0xfd, 0xc3, 0x4f, 0x28, 0x17, 0x10, 0x40, 0x6f,
-+ 0x4e, 0x37, 0x62, 0x54, 0x46, 0xff, 0x6e, 0xf2,
-+ 0x24, 0x91, 0x3d, 0xeb, 0x0d, 0x89, 0xaf, 0x33,
-+ 0x71, 0x28, 0xe3, 0xd1, 0x55, 0xd1, 0x6d, 0x3e,
-+ 0xc3, 0x24, 0x60, 0x41, 0x43, 0x21, 0x43, 0xe9,
-+ 0xab, 0x3a, 0x6d, 0x2c, 0xcc, 0x2f, 0x4d, 0x62
-+};
-+static const u8 enc_output078[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xf7, 0xe9, 0xe1, 0x51, 0xb0, 0x25, 0x33, 0xc7,
-+ 0x46, 0x58, 0xbf, 0xc7, 0x73, 0x7c, 0x68, 0x0d
-+};
-+static const u8 enc_assoc078[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce078[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xbb, 0x90
-+};
-+static const u8 enc_key078[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input079[] __initconst = {
-+ 0x22, 0x72, 0x02, 0xbe, 0x7f, 0x35, 0x15, 0xe9,
-+ 0xd1, 0xc0, 0x2e, 0xea, 0x2f, 0x19, 0x50, 0xb6,
-+ 0x48, 0x1b, 0x04, 0x8a, 0x4c, 0x91, 0x50, 0x6c,
-+ 0xb4, 0x0d, 0x50, 0x4e, 0x6c, 0x94, 0x9f, 0x82,
-+ 0xd1, 0x97, 0xc2, 0x5a, 0xd1, 0x7d, 0xc7, 0x21,
-+ 0x65, 0x11, 0x25, 0x78, 0x2a, 0xc7, 0xa7, 0x12,
-+ 0x47, 0xfe, 0xae, 0xf3, 0x2f, 0x1f, 0x25, 0x0c,
-+ 0xe4, 0xbb, 0x8f, 0x79, 0xac, 0xaa, 0x17, 0x9d,
-+ 0x45, 0xa7, 0xb0, 0x54, 0x5f, 0x09, 0x24, 0x32,
-+ 0x5e, 0xfa, 0x87, 0xd5, 0xe4, 0x41, 0xd2, 0x84,
-+ 0x78, 0xc6, 0x1f, 0x22, 0x23, 0xee, 0x67, 0xc3,
-+ 0xb4, 0x1f, 0x43, 0x94, 0x53, 0x5e, 0x2a, 0x24,
-+ 0x36, 0x9a, 0x2e, 0x16, 0x61, 0x3c, 0x45, 0x94,
-+ 0x90, 0xc1, 0x4f, 0xb1, 0xd7, 0x55, 0xfe, 0x53,
-+ 0xfb, 0xe1, 0xee, 0x45, 0xb1, 0xb2, 0x1f, 0x71,
-+ 0x62, 0xe2, 0xfc, 0xaa, 0x74, 0x2a, 0xbe, 0xfd
-+};
-+static const u8 enc_output079[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x79, 0x5b, 0xcf, 0xf6, 0x47, 0xc5, 0x53, 0xc2,
-+ 0xe4, 0xeb, 0x6e, 0x0e, 0xaf, 0xd9, 0xe0, 0x4e
-+};
-+static const u8 enc_assoc079[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce079[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x48, 0x4a
-+};
-+static const u8 enc_key079[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input080[] __initconst = {
-+ 0xfa, 0xe5, 0x83, 0x45, 0xc1, 0x6c, 0xb0, 0xf5,
-+ 0xcc, 0x53, 0x7f, 0x2b, 0x1b, 0x34, 0x69, 0xc9,
-+ 0x69, 0x46, 0x3b, 0x3e, 0xa7, 0x1b, 0xcf, 0x6b,
-+ 0x98, 0xd6, 0x69, 0xa8, 0xe6, 0x0e, 0x04, 0xfc,
-+ 0x08, 0xd5, 0xfd, 0x06, 0x9c, 0x36, 0x26, 0x38,
-+ 0xe3, 0x40, 0x0e, 0xf4, 0xcb, 0x24, 0x2e, 0x27,
-+ 0xe2, 0x24, 0x5e, 0x68, 0xcb, 0x9e, 0xc5, 0x83,
-+ 0xda, 0x53, 0x40, 0xb1, 0x2e, 0xdf, 0x42, 0x3b,
-+ 0x73, 0x26, 0xad, 0x20, 0xfe, 0xeb, 0x57, 0xda,
-+ 0xca, 0x2e, 0x04, 0x67, 0xa3, 0x28, 0x99, 0xb4,
-+ 0x2d, 0xf8, 0xe5, 0x6d, 0x84, 0xe0, 0x06, 0xbc,
-+ 0x8a, 0x7a, 0xcc, 0x73, 0x1e, 0x7c, 0x1f, 0x6b,
-+ 0xec, 0xb5, 0x71, 0x9f, 0x70, 0x77, 0xf0, 0xd4,
-+ 0xf4, 0xc6, 0x1a, 0xb1, 0x1e, 0xba, 0xc1, 0x00,
-+ 0x18, 0x01, 0xce, 0x33, 0xc4, 0xe4, 0xa7, 0x7d,
-+ 0x83, 0x1d, 0x3c, 0xe3, 0x4e, 0x84, 0x10, 0xe1
-+};
-+static const u8 enc_output080[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x19, 0x46, 0xd6, 0x53, 0x96, 0x0f, 0x94, 0x7a,
-+ 0x74, 0xd3, 0xe8, 0x09, 0x3c, 0xf4, 0x85, 0x02
-+};
-+static const u8 enc_assoc080[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce080[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x2f, 0x40
-+};
-+static const u8 enc_key080[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input081[] __initconst = {
-+ 0xeb, 0xb2, 0x16, 0xdd, 0xd7, 0xca, 0x70, 0x92,
-+ 0x15, 0xf5, 0x03, 0xdf, 0x9c, 0xe6, 0x3c, 0x5c,
-+ 0xd2, 0x19, 0x4e, 0x7d, 0x90, 0x99, 0xe8, 0xa9,
-+ 0x0b, 0x2a, 0xfa, 0xad, 0x5e, 0xba, 0x35, 0x06,
-+ 0x99, 0x25, 0xa6, 0x03, 0xfd, 0xbc, 0x34, 0x1a,
-+ 0xae, 0xd4, 0x15, 0x05, 0xb1, 0x09, 0x41, 0xfa,
-+ 0x38, 0x56, 0xa7, 0xe2, 0x47, 0xb1, 0x04, 0x07,
-+ 0x09, 0x74, 0x6c, 0xfc, 0x20, 0x96, 0xca, 0xa6,
-+ 0x31, 0xb2, 0xff, 0xf4, 0x1c, 0x25, 0x05, 0x06,
-+ 0xd8, 0x89, 0xc1, 0xc9, 0x06, 0x71, 0xad, 0xe8,
-+ 0x53, 0xee, 0x63, 0x94, 0xc1, 0x91, 0x92, 0xa5,
-+ 0xcf, 0x37, 0x10, 0xd1, 0x07, 0x30, 0x99, 0xe5,
-+ 0xbc, 0x94, 0x65, 0x82, 0xfc, 0x0f, 0xab, 0x9f,
-+ 0x54, 0x3c, 0x71, 0x6a, 0xe2, 0x48, 0x6a, 0x86,
-+ 0x83, 0xfd, 0xca, 0x39, 0xd2, 0xe1, 0x4f, 0x23,
-+ 0xd0, 0x0a, 0x58, 0x26, 0x64, 0xf4, 0xec, 0xb1
-+};
-+static const u8 enc_output081[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x36, 0xc3, 0x00, 0x29, 0x85, 0xdd, 0x21, 0xba,
-+ 0xf8, 0x95, 0xd6, 0x33, 0x57, 0x3f, 0x12, 0xc0
-+};
-+static const u8 enc_assoc081[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce081[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x93, 0x35
-+};
-+static const u8 enc_key081[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input082[] __initconst = {
-+ 0x40, 0x8a, 0xe6, 0xef, 0x1c, 0x7e, 0xf0, 0xfb,
-+ 0x2c, 0x2d, 0x61, 0x08, 0x16, 0xfc, 0x78, 0x49,
-+ 0xef, 0xa5, 0x8f, 0x78, 0x27, 0x3f, 0x5f, 0x16,
-+ 0x6e, 0xa6, 0x5f, 0x81, 0xb5, 0x75, 0x74, 0x7d,
-+ 0x03, 0x5b, 0x30, 0x40, 0xfe, 0xde, 0x1e, 0xb9,
-+ 0x45, 0x97, 0x88, 0x66, 0x97, 0x88, 0x40, 0x8e,
-+ 0x00, 0x41, 0x3b, 0x3e, 0x37, 0x6d, 0x15, 0x2d,
-+ 0x20, 0x4a, 0xa2, 0xb7, 0xa8, 0x35, 0x58, 0xfc,
-+ 0xd4, 0x8a, 0x0e, 0xf7, 0xa2, 0x6b, 0x1c, 0xd6,
-+ 0xd3, 0x5d, 0x23, 0xb3, 0xf5, 0xdf, 0xe0, 0xca,
-+ 0x77, 0xa4, 0xce, 0x32, 0xb9, 0x4a, 0xbf, 0x83,
-+ 0xda, 0x2a, 0xef, 0xca, 0xf0, 0x68, 0x38, 0x08,
-+ 0x79, 0xe8, 0x9f, 0xb0, 0xa3, 0x82, 0x95, 0x95,
-+ 0xcf, 0x44, 0xc3, 0x85, 0x2a, 0xe2, 0xcc, 0x66,
-+ 0x2b, 0x68, 0x9f, 0x93, 0x55, 0xd9, 0xc1, 0x83,
-+ 0x80, 0x1f, 0x6a, 0xcc, 0x31, 0x3f, 0x89, 0x07
-+};
-+static const u8 enc_output082[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x65, 0x14, 0x51, 0x8e, 0x0a, 0x26, 0x41, 0x42,
-+ 0xe0, 0xb7, 0x35, 0x1f, 0x96, 0x7f, 0xc2, 0xae
-+};
-+static const u8 enc_assoc082[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce082[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xf7, 0xd5
-+};
-+static const u8 enc_key082[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input083[] __initconst = {
-+ 0x0a, 0x0a, 0x24, 0x49, 0x9b, 0xca, 0xde, 0x58,
-+ 0xcf, 0x15, 0x76, 0xc3, 0x12, 0xac, 0xa9, 0x84,
-+ 0x71, 0x8c, 0xb4, 0xcc, 0x7e, 0x01, 0x53, 0xf5,
-+ 0xa9, 0x01, 0x58, 0x10, 0x85, 0x96, 0x44, 0xdf,
-+ 0xc0, 0x21, 0x17, 0x4e, 0x0b, 0x06, 0x0a, 0x39,
-+ 0x74, 0x48, 0xde, 0x8b, 0x48, 0x4a, 0x86, 0x03,
-+ 0xbe, 0x68, 0x0a, 0x69, 0x34, 0xc0, 0x90, 0x6f,
-+ 0x30, 0xdd, 0x17, 0xea, 0xe2, 0xd4, 0xc5, 0xfa,
-+ 0xa7, 0x77, 0xf8, 0xca, 0x53, 0x37, 0x0e, 0x08,
-+ 0x33, 0x1b, 0x88, 0xc3, 0x42, 0xba, 0xc9, 0x59,
-+ 0x78, 0x7b, 0xbb, 0x33, 0x93, 0x0e, 0x3b, 0x56,
-+ 0xbe, 0x86, 0xda, 0x7f, 0x2a, 0x6e, 0xb1, 0xf9,
-+ 0x40, 0x89, 0xd1, 0xd1, 0x81, 0x07, 0x4d, 0x43,
-+ 0x02, 0xf8, 0xe0, 0x55, 0x2d, 0x0d, 0xe1, 0xfa,
-+ 0xb3, 0x06, 0xa2, 0x1b, 0x42, 0xd4, 0xc3, 0xba,
-+ 0x6e, 0x6f, 0x0c, 0xbc, 0xc8, 0x1e, 0x87, 0x7a
-+};
-+static const u8 enc_output083[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x4c, 0x19, 0x4d, 0xa6, 0xa9, 0x9f, 0xd6, 0x5b,
-+ 0x40, 0xe9, 0xca, 0xd7, 0x98, 0xf4, 0x4b, 0x19
-+};
-+static const u8 enc_assoc083[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce083[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xfc, 0xe4
-+};
-+static const u8 enc_key083[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input084[] __initconst = {
-+ 0x4a, 0x0a, 0xaf, 0xf8, 0x49, 0x47, 0x29, 0x18,
-+ 0x86, 0x91, 0x70, 0x13, 0x40, 0xf3, 0xce, 0x2b,
-+ 0x8a, 0x78, 0xee, 0xd3, 0xa0, 0xf0, 0x65, 0x99,
-+ 0x4b, 0x72, 0x48, 0x4e, 0x79, 0x91, 0xd2, 0x5c,
-+ 0x29, 0xaa, 0x07, 0x5e, 0xb1, 0xfc, 0x16, 0xde,
-+ 0x93, 0xfe, 0x06, 0x90, 0x58, 0x11, 0x2a, 0xb2,
-+ 0x84, 0xa3, 0xed, 0x18, 0x78, 0x03, 0x26, 0xd1,
-+ 0x25, 0x8a, 0x47, 0x22, 0x2f, 0xa6, 0x33, 0xd8,
-+ 0xb2, 0x9f, 0x3b, 0xd9, 0x15, 0x0b, 0x23, 0x9b,
-+ 0x15, 0x46, 0xc2, 0xbb, 0x9b, 0x9f, 0x41, 0x0f,
-+ 0xeb, 0xea, 0xd3, 0x96, 0x00, 0x0e, 0xe4, 0x77,
-+ 0x70, 0x15, 0x32, 0xc3, 0xd0, 0xf5, 0xfb, 0xf8,
-+ 0x95, 0xd2, 0x80, 0x19, 0x6d, 0x2f, 0x73, 0x7c,
-+ 0x5e, 0x9f, 0xec, 0x50, 0xd9, 0x2b, 0xb0, 0xdf,
-+ 0x5d, 0x7e, 0x51, 0x3b, 0xe5, 0xb8, 0xea, 0x97,
-+ 0x13, 0x10, 0xd5, 0xbf, 0x16, 0xba, 0x7a, 0xee
-+};
-+static const u8 enc_output084[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xc8, 0xae, 0x77, 0x88, 0xcd, 0x28, 0x74, 0xab,
-+ 0xc1, 0x38, 0x54, 0x1e, 0x11, 0xfd, 0x05, 0x87
-+};
-+static const u8 enc_assoc084[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce084[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x84, 0x86, 0xa8
-+};
-+static const u8 enc_key084[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input085[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x78, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x9f, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x9c, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0x47, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0xd4, 0xd2, 0x06, 0x61, 0x6f, 0x92, 0x93, 0xf6,
-+ 0x5b, 0x45, 0xdb, 0xbc, 0x74, 0xe7, 0xc2, 0xed,
-+ 0xfb, 0xcb, 0xbf, 0x1c, 0xfb, 0x67, 0x9b, 0xb7,
-+ 0x39, 0xa5, 0x86, 0x2d, 0xe2, 0xbc, 0xb9, 0x37,
-+ 0xf7, 0x4d, 0x5b, 0xf8, 0x67, 0x1c, 0x5a, 0x8a,
-+ 0x50, 0x92, 0xf6, 0x1d, 0x54, 0xc9, 0xaa, 0x5b
-+};
-+static const u8 enc_output085[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x93, 0x3a, 0x51, 0x63, 0xc7, 0xf6, 0x23, 0x68,
-+ 0x32, 0x7b, 0x3f, 0xbc, 0x10, 0x36, 0xc9, 0x43
-+};
-+static const u8 enc_assoc085[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce085[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key085[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input093[] __initconst = {
-+ 0x00, 0x52, 0x35, 0xd2, 0xa9, 0x19, 0xf2, 0x8d,
-+ 0x3d, 0xb7, 0x66, 0x4a, 0x34, 0xae, 0x6b, 0x44,
-+ 0x4d, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x5b, 0x8b, 0x94, 0x50, 0x9e, 0x2b, 0x74, 0xa3,
-+ 0x6d, 0x34, 0x6e, 0x33, 0xd5, 0x72, 0x65, 0x9b,
-+ 0xa9, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0x83, 0xdc, 0xe9, 0xf3, 0x07, 0x3e, 0xfa, 0xdb,
-+ 0x7d, 0x23, 0xb8, 0x7a, 0xce, 0x35, 0x16, 0x8c
-+};
-+static const u8 enc_output093[] __initconst = {
-+ 0x00, 0x39, 0xe2, 0xfd, 0x2f, 0xd3, 0x12, 0x14,
-+ 0x9e, 0x98, 0x98, 0x80, 0x88, 0x48, 0x13, 0xe7,
-+ 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x3b, 0x0e, 0x86, 0x9a, 0xaa, 0x8e, 0xa4, 0x96,
-+ 0x32, 0xff, 0xff, 0x37, 0xb9, 0xe8, 0xce, 0x00,
-+ 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x3b, 0x0e, 0x86, 0x9a, 0xaa, 0x8e, 0xa4, 0x96,
-+ 0x32, 0xff, 0xff, 0x37, 0xb9, 0xe8, 0xce, 0x00,
-+ 0xa5, 0x19, 0xac, 0x1a, 0x35, 0xb4, 0xa5, 0x77,
-+ 0x87, 0x51, 0x0a, 0xf7, 0x8d, 0x8d, 0x20, 0x0a
-+};
-+static const u8 enc_assoc093[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce093[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key093[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input094[] __initconst = {
-+ 0xd3, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xe5, 0xda, 0x78, 0x76, 0x6f, 0xa1, 0x92, 0x90,
-+ 0xc0, 0x31, 0xf7, 0x52, 0x08, 0x50, 0x67, 0x45,
-+ 0xae, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x49, 0x6d, 0xde, 0xb0, 0x55, 0x09, 0xc6, 0xef,
-+ 0xff, 0xab, 0x75, 0xeb, 0x2d, 0xf4, 0xab, 0x09,
-+ 0x76, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x01, 0x49, 0xef, 0x50, 0x4b, 0x71, 0xb1, 0x20,
-+ 0xca, 0x4f, 0xf3, 0x95, 0x19, 0xc2, 0xc2, 0x10
-+};
-+static const u8 enc_output094[] __initconst = {
-+ 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x62, 0x18, 0xb2, 0x7f, 0x83, 0xb8, 0xb4, 0x66,
-+ 0x02, 0xf6, 0xe1, 0xd8, 0x34, 0x20, 0x7b, 0x02,
-+ 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x2a, 0x64, 0x16, 0xce, 0xdb, 0x1c, 0xdd, 0x29,
-+ 0x6e, 0xf5, 0xd7, 0xd6, 0x92, 0xda, 0xff, 0x02,
-+ 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x2a, 0x64, 0x16, 0xce, 0xdb, 0x1c, 0xdd, 0x29,
-+ 0x6e, 0xf5, 0xd7, 0xd6, 0x92, 0xda, 0xff, 0x02,
-+ 0x30, 0x2f, 0xe8, 0x2a, 0xb0, 0xa0, 0x9a, 0xf6,
-+ 0x44, 0x00, 0xd0, 0x15, 0xae, 0x83, 0xd9, 0xcc
-+};
-+static const u8 enc_assoc094[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce094[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key094[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input095[] __initconst = {
-+ 0xe9, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x6d, 0xf1, 0x39, 0x4e, 0xdc, 0x53, 0x9b, 0x5b,
-+ 0x3a, 0x09, 0x57, 0xbe, 0x0f, 0xb8, 0x59, 0x46,
-+ 0x80, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xd1, 0x76, 0x9f, 0xe8, 0x06, 0xbb, 0xfe, 0xb6,
-+ 0xf5, 0x90, 0x95, 0x0f, 0x2e, 0xac, 0x9e, 0x0a,
-+ 0x58, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x99, 0x52, 0xae, 0x08, 0x18, 0xc3, 0x89, 0x79,
-+ 0xc0, 0x74, 0x13, 0x71, 0x1a, 0x9a, 0xf7, 0x13
-+};
-+static const u8 enc_output095[] __initconst = {
-+ 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xea, 0x33, 0xf3, 0x47, 0x30, 0x4a, 0xbd, 0xad,
-+ 0xf8, 0xce, 0x41, 0x34, 0x33, 0xc8, 0x45, 0x01,
-+ 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xb2, 0x7f, 0x57, 0x96, 0x88, 0xae, 0xe5, 0x70,
-+ 0x64, 0xce, 0x37, 0x32, 0x91, 0x82, 0xca, 0x01,
-+ 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xb2, 0x7f, 0x57, 0x96, 0x88, 0xae, 0xe5, 0x70,
-+ 0x64, 0xce, 0x37, 0x32, 0x91, 0x82, 0xca, 0x01,
-+ 0x98, 0xa7, 0xe8, 0x36, 0xe0, 0xee, 0x4d, 0x02,
-+ 0x35, 0x00, 0xd0, 0x55, 0x7e, 0xc2, 0xcb, 0xe0
-+};
-+static const u8 enc_assoc095[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce095[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key095[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input096[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x64, 0xf9, 0x0f, 0x5b, 0x26, 0x92, 0xb8, 0x60,
-+ 0xd4, 0x59, 0x6f, 0xf4, 0xb3, 0x40, 0x2c, 0x5c,
-+ 0x00, 0xb9, 0xbb, 0x53, 0x70, 0x7a, 0xa6, 0x67,
-+ 0xd3, 0x56, 0xfe, 0x50, 0xc7, 0x19, 0x96, 0x94,
-+ 0x03, 0x35, 0x61, 0xe7, 0xca, 0xca, 0x6d, 0x94,
-+ 0x1d, 0xc3, 0xcd, 0x69, 0x14, 0xad, 0x69, 0x04
-+};
-+static const u8 enc_output096[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xe3, 0x3b, 0xc5, 0x52, 0xca, 0x8b, 0x9e, 0x96,
-+ 0x16, 0x9e, 0x79, 0x7e, 0x8f, 0x30, 0x30, 0x1b,
-+ 0x60, 0x3c, 0xa9, 0x99, 0x44, 0xdf, 0x76, 0x52,
-+ 0x8c, 0x9d, 0x6f, 0x54, 0xab, 0x83, 0x3d, 0x0f,
-+ 0x60, 0x3c, 0xa9, 0x99, 0x44, 0xdf, 0x76, 0x52,
-+ 0x8c, 0x9d, 0x6f, 0x54, 0xab, 0x83, 0x3d, 0x0f,
-+ 0x6a, 0xb8, 0xdc, 0xe2, 0xc5, 0x9d, 0xa4, 0x73,
-+ 0x71, 0x30, 0xb0, 0x25, 0x2f, 0x68, 0xa8, 0xd8
-+};
-+static const u8 enc_assoc096[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce096[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key096[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input097[] __initconst = {
-+ 0x68, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xb0, 0x8f, 0x25, 0x67, 0x5b, 0x9b, 0xcb, 0xf6,
-+ 0xe3, 0x84, 0x07, 0xde, 0x2e, 0xc7, 0x5a, 0x47,
-+ 0x9f, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x2d, 0x2a, 0xf7, 0xcd, 0x6b, 0x08, 0x05, 0x01,
-+ 0xd3, 0x1b, 0xa5, 0x4f, 0xb2, 0xeb, 0x75, 0x96,
-+ 0x47, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x65, 0x0e, 0xc6, 0x2d, 0x75, 0x70, 0x72, 0xce,
-+ 0xe6, 0xff, 0x23, 0x31, 0x86, 0xdd, 0x1c, 0x8f
-+};
-+static const u8 enc_output097[] __initconst = {
-+ 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x37, 0x4d, 0xef, 0x6e, 0xb7, 0x82, 0xed, 0x00,
-+ 0x21, 0x43, 0x11, 0x54, 0x12, 0xb7, 0x46, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x4e, 0x23, 0x3f, 0xb3, 0xe5, 0x1d, 0x1e, 0xc7,
-+ 0x42, 0x45, 0x07, 0x72, 0x0d, 0xc5, 0x21, 0x9d,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x4e, 0x23, 0x3f, 0xb3, 0xe5, 0x1d, 0x1e, 0xc7,
-+ 0x42, 0x45, 0x07, 0x72, 0x0d, 0xc5, 0x21, 0x9d,
-+ 0x04, 0x4d, 0xea, 0x60, 0x88, 0x80, 0x41, 0x2b,
-+ 0xfd, 0xff, 0xcf, 0x35, 0x57, 0x9e, 0x9b, 0x26
-+};
-+static const u8 enc_assoc097[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce097[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key097[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input098[] __initconst = {
-+ 0x6d, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xa1, 0x61, 0xb5, 0xab, 0x04, 0x09, 0x00, 0x62,
-+ 0x9e, 0xfe, 0xff, 0x78, 0xd7, 0xd8, 0x6b, 0x45,
-+ 0x9f, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xc6, 0xf8, 0x07, 0x8c, 0xc8, 0xef, 0x12, 0xa0,
-+ 0xff, 0x65, 0x7d, 0x6d, 0x08, 0xdb, 0x10, 0xb8,
-+ 0x47, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x8e, 0xdc, 0x36, 0x6c, 0xd6, 0x97, 0x65, 0x6f,
-+ 0xca, 0x81, 0xfb, 0x13, 0x3c, 0xed, 0x79, 0xa1
-+};
-+static const u8 enc_output098[] __initconst = {
-+ 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x26, 0xa3, 0x7f, 0xa2, 0xe8, 0x10, 0x26, 0x94,
-+ 0x5c, 0x39, 0xe9, 0xf2, 0xeb, 0xa8, 0x77, 0x02,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xa5, 0xf1, 0xcf, 0xf2, 0x46, 0xfa, 0x09, 0x66,
-+ 0x6e, 0x3b, 0xdf, 0x50, 0xb7, 0xf5, 0x44, 0xb3,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xa5, 0xf1, 0xcf, 0xf2, 0x46, 0xfa, 0x09, 0x66,
-+ 0x6e, 0x3b, 0xdf, 0x50, 0xb7, 0xf5, 0x44, 0xb3,
-+ 0x1e, 0x6b, 0xea, 0x63, 0x14, 0x54, 0x2e, 0x2e,
-+ 0xf9, 0xff, 0xcf, 0x45, 0x0b, 0x2e, 0x98, 0x2b
-+};
-+static const u8 enc_assoc098[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce098[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key098[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input099[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xfc, 0x01, 0xb8, 0x91, 0xe5, 0xf0, 0xf9, 0x12,
-+ 0x8d, 0x7d, 0x1c, 0x57, 0x91, 0x92, 0xb6, 0x98,
-+ 0x63, 0x41, 0x44, 0x15, 0xb6, 0x99, 0x68, 0x95,
-+ 0x9a, 0x72, 0x91, 0xb7, 0xa5, 0xaf, 0x13, 0x48,
-+ 0x60, 0xcd, 0x9e, 0xa1, 0x0c, 0x29, 0xa3, 0x66,
-+ 0x54, 0xe7, 0xa2, 0x8e, 0x76, 0x1b, 0xec, 0xd8
-+};
-+static const u8 enc_output099[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x7b, 0xc3, 0x72, 0x98, 0x09, 0xe9, 0xdf, 0xe4,
-+ 0x4f, 0xba, 0x0a, 0xdd, 0xad, 0xe2, 0xaa, 0xdf,
-+ 0x03, 0xc4, 0x56, 0xdf, 0x82, 0x3c, 0xb8, 0xa0,
-+ 0xc5, 0xb9, 0x00, 0xb3, 0xc9, 0x35, 0xb8, 0xd3,
-+ 0x03, 0xc4, 0x56, 0xdf, 0x82, 0x3c, 0xb8, 0xa0,
-+ 0xc5, 0xb9, 0x00, 0xb3, 0xc9, 0x35, 0xb8, 0xd3,
-+ 0xed, 0x20, 0x17, 0xc8, 0xdb, 0xa4, 0x77, 0x56,
-+ 0x29, 0x04, 0x9d, 0x78, 0x6e, 0x3b, 0xce, 0xb1
-+};
-+static const u8 enc_assoc099[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce099[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key099[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input100[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x6b, 0x6d, 0xc9, 0xd2, 0x1a, 0x81, 0x9e, 0x70,
-+ 0xb5, 0x77, 0xf4, 0x41, 0x37, 0xd3, 0xd6, 0xbd,
-+ 0x13, 0x35, 0xf5, 0xeb, 0x44, 0x49, 0x40, 0x77,
-+ 0xb2, 0x64, 0x49, 0xa5, 0x4b, 0x6c, 0x7c, 0x75,
-+ 0x10, 0xb9, 0x2f, 0x5f, 0xfe, 0xf9, 0x8b, 0x84,
-+ 0x7c, 0xf1, 0x7a, 0x9c, 0x98, 0xd8, 0x83, 0xe5
-+};
-+static const u8 enc_output100[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xec, 0xaf, 0x03, 0xdb, 0xf6, 0x98, 0xb8, 0x86,
-+ 0x77, 0xb0, 0xe2, 0xcb, 0x0b, 0xa3, 0xca, 0xfa,
-+ 0x73, 0xb0, 0xe7, 0x21, 0x70, 0xec, 0x90, 0x42,
-+ 0xed, 0xaf, 0xd8, 0xa1, 0x27, 0xf6, 0xd7, 0xee,
-+ 0x73, 0xb0, 0xe7, 0x21, 0x70, 0xec, 0x90, 0x42,
-+ 0xed, 0xaf, 0xd8, 0xa1, 0x27, 0xf6, 0xd7, 0xee,
-+ 0x07, 0x3f, 0x17, 0xcb, 0x67, 0x78, 0x64, 0x59,
-+ 0x25, 0x04, 0x9d, 0x88, 0x22, 0xcb, 0xca, 0xb6
-+};
-+static const u8 enc_assoc100[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce100[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key100[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input101[] __initconst = {
-+ 0xff, 0xcb, 0x2b, 0x11, 0x06, 0xf8, 0x23, 0x4c,
-+ 0x5e, 0x99, 0xd4, 0xdb, 0x4c, 0x70, 0x48, 0xde,
-+ 0x32, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x16, 0xe9, 0x88, 0x4a, 0x11, 0x4f, 0x0e, 0x92,
-+ 0x66, 0xce, 0xa3, 0x88, 0x5f, 0xe3, 0x6b, 0x9f,
-+ 0xd6, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xce, 0xbe, 0xf5, 0xe9, 0x88, 0x5a, 0x80, 0xea,
-+ 0x76, 0xd9, 0x75, 0xc1, 0x44, 0xa4, 0x18, 0x88
-+};
-+static const u8 enc_output101[] __initconst = {
-+ 0xff, 0xa0, 0xfc, 0x3e, 0x80, 0x32, 0xc3, 0xd5,
-+ 0xfd, 0xb6, 0x2a, 0x11, 0xf0, 0x96, 0x30, 0x7d,
-+ 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x76, 0x6c, 0x9a, 0x80, 0x25, 0xea, 0xde, 0xa7,
-+ 0x39, 0x05, 0x32, 0x8c, 0x33, 0x79, 0xc0, 0x04,
-+ 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x76, 0x6c, 0x9a, 0x80, 0x25, 0xea, 0xde, 0xa7,
-+ 0x39, 0x05, 0x32, 0x8c, 0x33, 0x79, 0xc0, 0x04,
-+ 0x8b, 0x9b, 0xb4, 0xb4, 0x86, 0x12, 0x89, 0x65,
-+ 0x8c, 0x69, 0x6a, 0x83, 0x40, 0x15, 0x04, 0x05
-+};
-+static const u8 enc_assoc101[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce101[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key101[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input102[] __initconst = {
-+ 0x6f, 0x9e, 0x70, 0xed, 0x3b, 0x8b, 0xac, 0xa0,
-+ 0x26, 0xe4, 0x6a, 0x5a, 0x09, 0x43, 0x15, 0x8d,
-+ 0x21, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x0c, 0x61, 0x2c, 0x5e, 0x8d, 0x89, 0xa8, 0x73,
-+ 0xdb, 0xca, 0xad, 0x5b, 0x73, 0x46, 0x42, 0x9b,
-+ 0xc5, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xd4, 0x36, 0x51, 0xfd, 0x14, 0x9c, 0x26, 0x0b,
-+ 0xcb, 0xdd, 0x7b, 0x12, 0x68, 0x01, 0x31, 0x8c
-+};
-+static const u8 enc_output102[] __initconst = {
-+ 0x6f, 0xf5, 0xa7, 0xc2, 0xbd, 0x41, 0x4c, 0x39,
-+ 0x85, 0xcb, 0x94, 0x90, 0xb5, 0xa5, 0x6d, 0x2e,
-+ 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x6c, 0xe4, 0x3e, 0x94, 0xb9, 0x2c, 0x78, 0x46,
-+ 0x84, 0x01, 0x3c, 0x5f, 0x1f, 0xdc, 0xe9, 0x00,
-+ 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x6c, 0xe4, 0x3e, 0x94, 0xb9, 0x2c, 0x78, 0x46,
-+ 0x84, 0x01, 0x3c, 0x5f, 0x1f, 0xdc, 0xe9, 0x00,
-+ 0x8b, 0x3b, 0xbd, 0x51, 0x64, 0x44, 0x59, 0x56,
-+ 0x8d, 0x81, 0xca, 0x1f, 0xa7, 0x2c, 0xe4, 0x04
-+};
-+static const u8 enc_assoc102[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce102[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key102[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input103[] __initconst = {
-+ 0x41, 0x2b, 0x08, 0x0a, 0x3e, 0x19, 0xc1, 0x0d,
-+ 0x44, 0xa1, 0xaf, 0x1e, 0xab, 0xde, 0xb4, 0xce,
-+ 0x35, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x6b, 0x83, 0x94, 0x33, 0x09, 0x21, 0x48, 0x6c,
-+ 0xa1, 0x1d, 0x29, 0x1c, 0x3e, 0x97, 0xee, 0x9a,
-+ 0xd1, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xb3, 0xd4, 0xe9, 0x90, 0x90, 0x34, 0xc6, 0x14,
-+ 0xb1, 0x0a, 0xff, 0x55, 0x25, 0xd0, 0x9d, 0x8d
-+};
-+static const u8 enc_output103[] __initconst = {
-+ 0x41, 0x40, 0xdf, 0x25, 0xb8, 0xd3, 0x21, 0x94,
-+ 0xe7, 0x8e, 0x51, 0xd4, 0x17, 0x38, 0xcc, 0x6d,
-+ 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x0b, 0x06, 0x86, 0xf9, 0x3d, 0x84, 0x98, 0x59,
-+ 0xfe, 0xd6, 0xb8, 0x18, 0x52, 0x0d, 0x45, 0x01,
-+ 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x0b, 0x06, 0x86, 0xf9, 0x3d, 0x84, 0x98, 0x59,
-+ 0xfe, 0xd6, 0xb8, 0x18, 0x52, 0x0d, 0x45, 0x01,
-+ 0x86, 0xfb, 0xab, 0x2b, 0x4a, 0x94, 0xf4, 0x7a,
-+ 0xa5, 0x6f, 0x0a, 0xea, 0x65, 0xd1, 0x10, 0x08
-+};
-+static const u8 enc_assoc103[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce103[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key103[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input104[] __initconst = {
-+ 0xb2, 0x47, 0xa7, 0x47, 0x23, 0x49, 0x1a, 0xac,
-+ 0xac, 0xaa, 0xd7, 0x09, 0xc9, 0x1e, 0x93, 0x2b,
-+ 0x31, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x9a, 0xde, 0x04, 0xe7, 0x5b, 0xb7, 0x01, 0xd9,
-+ 0x66, 0x06, 0x01, 0xb3, 0x47, 0x65, 0xde, 0x98,
-+ 0xd5, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0x42, 0x89, 0x79, 0x44, 0xc2, 0xa2, 0x8f, 0xa1,
-+ 0x76, 0x11, 0xd7, 0xfa, 0x5c, 0x22, 0xad, 0x8f
-+};
-+static const u8 enc_output104[] __initconst = {
-+ 0xb2, 0x2c, 0x70, 0x68, 0xa5, 0x83, 0xfa, 0x35,
-+ 0x0f, 0x85, 0x29, 0xc3, 0x75, 0xf8, 0xeb, 0x88,
-+ 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xfa, 0x5b, 0x16, 0x2d, 0x6f, 0x12, 0xd1, 0xec,
-+ 0x39, 0xcd, 0x90, 0xb7, 0x2b, 0xff, 0x75, 0x03,
-+ 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xfa, 0x5b, 0x16, 0x2d, 0x6f, 0x12, 0xd1, 0xec,
-+ 0x39, 0xcd, 0x90, 0xb7, 0x2b, 0xff, 0x75, 0x03,
-+ 0xa0, 0x19, 0xac, 0x2e, 0xd6, 0x67, 0xe1, 0x7d,
-+ 0xa1, 0x6f, 0x0a, 0xfa, 0x19, 0x61, 0x0d, 0x0d
-+};
-+static const u8 enc_assoc104[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce104[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key104[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input105[] __initconst = {
-+ 0x74, 0x0f, 0x9e, 0x49, 0xf6, 0x10, 0xef, 0xa5,
-+ 0x85, 0xb6, 0x59, 0xca, 0x6e, 0xd8, 0xb4, 0x99,
-+ 0x2d, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x41, 0x2d, 0x96, 0xaf, 0xbe, 0x80, 0xec, 0x3e,
-+ 0x79, 0xd4, 0x51, 0xb0, 0x0a, 0x2d, 0xb2, 0x9a,
-+ 0xc9, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0x99, 0x7a, 0xeb, 0x0c, 0x27, 0x95, 0x62, 0x46,
-+ 0x69, 0xc3, 0x87, 0xf9, 0x11, 0x6a, 0xc1, 0x8d
-+};
-+static const u8 enc_output105[] __initconst = {
-+ 0x74, 0x64, 0x49, 0x66, 0x70, 0xda, 0x0f, 0x3c,
-+ 0x26, 0x99, 0xa7, 0x00, 0xd2, 0x3e, 0xcc, 0x3a,
-+ 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x21, 0xa8, 0x84, 0x65, 0x8a, 0x25, 0x3c, 0x0b,
-+ 0x26, 0x1f, 0xc0, 0xb4, 0x66, 0xb7, 0x19, 0x01,
-+ 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x21, 0xa8, 0x84, 0x65, 0x8a, 0x25, 0x3c, 0x0b,
-+ 0x26, 0x1f, 0xc0, 0xb4, 0x66, 0xb7, 0x19, 0x01,
-+ 0x73, 0x6e, 0x18, 0x18, 0x16, 0x96, 0xa5, 0x88,
-+ 0x9c, 0x31, 0x59, 0xfa, 0xab, 0xab, 0x20, 0xfd
-+};
-+static const u8 enc_assoc105[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce105[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key105[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input106[] __initconst = {
-+ 0xad, 0xba, 0x5d, 0x10, 0x5b, 0xc8, 0xaa, 0x06,
-+ 0x2c, 0x23, 0x36, 0xcb, 0x88, 0x9d, 0xdb, 0xd5,
-+ 0x37, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x17, 0x7c, 0x5f, 0xfe, 0x28, 0x75, 0xf4, 0x68,
-+ 0xf6, 0xc2, 0x96, 0x57, 0x48, 0xf3, 0x59, 0x9a,
-+ 0xd3, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xcf, 0x2b, 0x22, 0x5d, 0xb1, 0x60, 0x7a, 0x10,
-+ 0xe6, 0xd5, 0x40, 0x1e, 0x53, 0xb4, 0x2a, 0x8d
-+};
-+static const u8 enc_output106[] __initconst = {
-+ 0xad, 0xd1, 0x8a, 0x3f, 0xdd, 0x02, 0x4a, 0x9f,
-+ 0x8f, 0x0c, 0xc8, 0x01, 0x34, 0x7b, 0xa3, 0x76,
-+ 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x77, 0xf9, 0x4d, 0x34, 0x1c, 0xd0, 0x24, 0x5d,
-+ 0xa9, 0x09, 0x07, 0x53, 0x24, 0x69, 0xf2, 0x01,
-+ 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x77, 0xf9, 0x4d, 0x34, 0x1c, 0xd0, 0x24, 0x5d,
-+ 0xa9, 0x09, 0x07, 0x53, 0x24, 0x69, 0xf2, 0x01,
-+ 0xba, 0xd5, 0x8f, 0x10, 0xa9, 0x1e, 0x6a, 0x88,
-+ 0x9a, 0xba, 0x32, 0xfd, 0x17, 0xd8, 0x33, 0x1a
-+};
-+static const u8 enc_assoc106[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce106[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key106[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input107[] __initconst = {
-+ 0xfe, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xc0, 0x01, 0xed, 0xc5, 0xda, 0x44, 0x2e, 0x71,
-+ 0x9b, 0xce, 0x9a, 0xbe, 0x27, 0x3a, 0xf1, 0x44,
-+ 0xb4, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x48, 0x02, 0x5f, 0x41, 0xfa, 0x4e, 0x33, 0x6c,
-+ 0x78, 0x69, 0x57, 0xa2, 0xa7, 0xc4, 0x93, 0x0a,
-+ 0x6c, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x00, 0x26, 0x6e, 0xa1, 0xe4, 0x36, 0x44, 0xa3,
-+ 0x4d, 0x8d, 0xd1, 0xdc, 0x93, 0xf2, 0xfa, 0x13
-+};
-+static const u8 enc_output107[] __initconst = {
-+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x47, 0xc3, 0x27, 0xcc, 0x36, 0x5d, 0x08, 0x87,
-+ 0x59, 0x09, 0x8c, 0x34, 0x1b, 0x4a, 0xed, 0x03,
-+ 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x2b, 0x0b, 0x97, 0x3f, 0x74, 0x5b, 0x28, 0xaa,
-+ 0xe9, 0x37, 0xf5, 0x9f, 0x18, 0xea, 0xc7, 0x01,
-+ 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x2b, 0x0b, 0x97, 0x3f, 0x74, 0x5b, 0x28, 0xaa,
-+ 0xe9, 0x37, 0xf5, 0x9f, 0x18, 0xea, 0xc7, 0x01,
-+ 0xd6, 0x8c, 0xe1, 0x74, 0x07, 0x9a, 0xdd, 0x02,
-+ 0x8d, 0xd0, 0x5c, 0xf8, 0x14, 0x63, 0x04, 0x88
-+};
-+static const u8 enc_assoc107[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce107[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key107[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input108[] __initconst = {
-+ 0xb5, 0x13, 0xb0, 0x6a, 0xb9, 0xac, 0x14, 0x43,
-+ 0x5a, 0xcb, 0x8a, 0xa3, 0xa3, 0x7a, 0xfd, 0xb6,
-+ 0x54, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x61, 0x95, 0x01, 0x93, 0xb1, 0xbf, 0x03, 0x11,
-+ 0xff, 0x11, 0x79, 0x89, 0xae, 0xd9, 0xa9, 0x99,
-+ 0xb0, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xb9, 0xc2, 0x7c, 0x30, 0x28, 0xaa, 0x8d, 0x69,
-+ 0xef, 0x06, 0xaf, 0xc0, 0xb5, 0x9e, 0xda, 0x8e
-+};
-+static const u8 enc_output108[] __initconst = {
-+ 0xb5, 0x78, 0x67, 0x45, 0x3f, 0x66, 0xf4, 0xda,
-+ 0xf9, 0xe4, 0x74, 0x69, 0x1f, 0x9c, 0x85, 0x15,
-+ 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x01, 0x10, 0x13, 0x59, 0x85, 0x1a, 0xd3, 0x24,
-+ 0xa0, 0xda, 0xe8, 0x8d, 0xc2, 0x43, 0x02, 0x02,
-+ 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x01, 0x10, 0x13, 0x59, 0x85, 0x1a, 0xd3, 0x24,
-+ 0xa0, 0xda, 0xe8, 0x8d, 0xc2, 0x43, 0x02, 0x02,
-+ 0xaa, 0x48, 0xa3, 0x88, 0x7d, 0x4b, 0x05, 0x96,
-+ 0x99, 0xc2, 0xfd, 0xf9, 0xc6, 0x78, 0x7e, 0x0a
-+};
-+static const u8 enc_assoc108[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce108[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key108[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input109[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xd4, 0xf1, 0x09, 0xe8, 0x14, 0xce, 0xa8, 0x5a,
-+ 0x08, 0xc0, 0x11, 0xd8, 0x50, 0xdd, 0x1d, 0xcb,
-+ 0xcf, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x53, 0x40, 0xb8, 0x5a, 0x9a, 0xa0, 0x82, 0x96,
-+ 0xb7, 0x7a, 0x5f, 0xc3, 0x96, 0x1f, 0x66, 0x0f,
-+ 0x17, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x1b, 0x64, 0x89, 0xba, 0x84, 0xd8, 0xf5, 0x59,
-+ 0x82, 0x9e, 0xd9, 0xbd, 0xa2, 0x29, 0x0f, 0x16
-+};
-+static const u8 enc_output109[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x53, 0x33, 0xc3, 0xe1, 0xf8, 0xd7, 0x8e, 0xac,
-+ 0xca, 0x07, 0x07, 0x52, 0x6c, 0xad, 0x01, 0x8c,
-+ 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x30, 0x49, 0x70, 0x24, 0x14, 0xb5, 0x99, 0x50,
-+ 0x26, 0x24, 0xfd, 0xfe, 0x29, 0x31, 0x32, 0x04,
-+ 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x30, 0x49, 0x70, 0x24, 0x14, 0xb5, 0x99, 0x50,
-+ 0x26, 0x24, 0xfd, 0xfe, 0x29, 0x31, 0x32, 0x04,
-+ 0xb9, 0x36, 0xa8, 0x17, 0xf2, 0x21, 0x1a, 0xf1,
-+ 0x29, 0xe2, 0xcf, 0x16, 0x0f, 0xd4, 0x2b, 0xcb
-+};
-+static const u8 enc_assoc109[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce109[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key109[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input110[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xdf, 0x4c, 0x62, 0x03, 0x2d, 0x41, 0x19, 0xb5,
-+ 0x88, 0x47, 0x7e, 0x99, 0x92, 0x5a, 0x56, 0xd9,
-+ 0xd6, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xfa, 0x84, 0xf0, 0x64, 0x55, 0x36, 0x42, 0x1b,
-+ 0x2b, 0xb9, 0x24, 0x6e, 0xc2, 0x19, 0xed, 0x0b,
-+ 0x0e, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0xb2, 0xa0, 0xc1, 0x84, 0x4b, 0x4e, 0x35, 0xd4,
-+ 0x1e, 0x5d, 0xa2, 0x10, 0xf6, 0x2f, 0x84, 0x12
-+};
-+static const u8 enc_output110[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x58, 0x8e, 0xa8, 0x0a, 0xc1, 0x58, 0x3f, 0x43,
-+ 0x4a, 0x80, 0x68, 0x13, 0xae, 0x2a, 0x4a, 0x9e,
-+ 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x99, 0x8d, 0x38, 0x1a, 0xdb, 0x23, 0x59, 0xdd,
-+ 0xba, 0xe7, 0x86, 0x53, 0x7d, 0x37, 0xb9, 0x00,
-+ 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x99, 0x8d, 0x38, 0x1a, 0xdb, 0x23, 0x59, 0xdd,
-+ 0xba, 0xe7, 0x86, 0x53, 0x7d, 0x37, 0xb9, 0x00,
-+ 0x9f, 0x7a, 0xc4, 0x35, 0x1f, 0x6b, 0x91, 0xe6,
-+ 0x30, 0x97, 0xa7, 0x13, 0x11, 0x5d, 0x05, 0xbe
-+};
-+static const u8 enc_assoc110[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce110[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key110[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input111[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x13, 0xf8, 0x0a, 0x00, 0x6d, 0xc1, 0xbb, 0xda,
-+ 0xd6, 0x39, 0xa9, 0x2f, 0xc7, 0xec, 0xa6, 0x55,
-+ 0xf7, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x63, 0x48, 0xb8, 0xfd, 0x29, 0xbf, 0x96, 0xd5,
-+ 0x63, 0xa5, 0x17, 0xe2, 0x7d, 0x7b, 0xfc, 0x0f,
-+ 0x2f, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x2b, 0x6c, 0x89, 0x1d, 0x37, 0xc7, 0xe1, 0x1a,
-+ 0x56, 0x41, 0x91, 0x9c, 0x49, 0x4d, 0x95, 0x16
-+};
-+static const u8 enc_output111[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x94, 0x3a, 0xc0, 0x09, 0x81, 0xd8, 0x9d, 0x2c,
-+ 0x14, 0xfe, 0xbf, 0xa5, 0xfb, 0x9c, 0xba, 0x12,
-+ 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x41, 0x70, 0x83, 0xa7, 0xaa, 0x8d, 0x13,
-+ 0xf2, 0xfb, 0xb5, 0xdf, 0xc2, 0x55, 0xa8, 0x04,
-+ 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x41, 0x70, 0x83, 0xa7, 0xaa, 0x8d, 0x13,
-+ 0xf2, 0xfb, 0xb5, 0xdf, 0xc2, 0x55, 0xa8, 0x04,
-+ 0x9a, 0x18, 0xa8, 0x28, 0x07, 0x02, 0x69, 0xf4,
-+ 0x47, 0x00, 0xd0, 0x09, 0xe7, 0x17, 0x1c, 0xc9
-+};
-+static const u8 enc_assoc111[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce111[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key111[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input112[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x82, 0xe5, 0x9b, 0x45, 0x82, 0x91, 0x50, 0x38,
-+ 0xf9, 0x33, 0x81, 0x1e, 0x65, 0x2d, 0xc6, 0x6a,
-+ 0xfc, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xb6, 0x71, 0xc8, 0xca, 0xc2, 0x70, 0xc2, 0x65,
-+ 0xa0, 0xac, 0x2f, 0x53, 0x57, 0x99, 0x88, 0x0a,
-+ 0x24, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0xfe, 0x55, 0xf9, 0x2a, 0xdc, 0x08, 0xb5, 0xaa,
-+ 0x95, 0x48, 0xa9, 0x2d, 0x63, 0xaf, 0xe1, 0x13
-+};
-+static const u8 enc_output112[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x05, 0x27, 0x51, 0x4c, 0x6e, 0x88, 0x76, 0xce,
-+ 0x3b, 0xf4, 0x97, 0x94, 0x59, 0x5d, 0xda, 0x2d,
-+ 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xd5, 0x78, 0x00, 0xb4, 0x4c, 0x65, 0xd9, 0xa3,
-+ 0x31, 0xf2, 0x8d, 0x6e, 0xe8, 0xb7, 0xdc, 0x01,
-+ 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xd5, 0x78, 0x00, 0xb4, 0x4c, 0x65, 0xd9, 0xa3,
-+ 0x31, 0xf2, 0x8d, 0x6e, 0xe8, 0xb7, 0xdc, 0x01,
-+ 0xb4, 0x36, 0xa8, 0x2b, 0x93, 0xd5, 0x55, 0xf7,
-+ 0x43, 0x00, 0xd0, 0x19, 0x9b, 0xa7, 0x18, 0xce
-+};
-+static const u8 enc_assoc112[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce112[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key112[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input113[] __initconst = {
-+ 0xff, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0xf1, 0xd1, 0x28, 0x87, 0xb7, 0x21, 0x69, 0x86,
-+ 0xa1, 0x2d, 0x79, 0x09, 0x8b, 0x6d, 0xe6, 0x0f,
-+ 0xc0, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xa7, 0xc7, 0x58, 0x99, 0xf3, 0xe6, 0x0a, 0xf1,
-+ 0xfc, 0xb6, 0xc7, 0x30, 0x7d, 0x87, 0x59, 0x0f,
-+ 0x18, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0xef, 0xe3, 0x69, 0x79, 0xed, 0x9e, 0x7d, 0x3e,
-+ 0xc9, 0x52, 0x41, 0x4e, 0x49, 0xb1, 0x30, 0x16
-+};
-+static const u8 enc_output113[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x76, 0x13, 0xe2, 0x8e, 0x5b, 0x38, 0x4f, 0x70,
-+ 0x63, 0xea, 0x6f, 0x83, 0xb7, 0x1d, 0xfa, 0x48,
-+ 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xc4, 0xce, 0x90, 0xe7, 0x7d, 0xf3, 0x11, 0x37,
-+ 0x6d, 0xe8, 0x65, 0x0d, 0xc2, 0xa9, 0x0d, 0x04,
-+ 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xc4, 0xce, 0x90, 0xe7, 0x7d, 0xf3, 0x11, 0x37,
-+ 0x6d, 0xe8, 0x65, 0x0d, 0xc2, 0xa9, 0x0d, 0x04,
-+ 0xce, 0x54, 0xa8, 0x2e, 0x1f, 0xa9, 0x42, 0xfa,
-+ 0x3f, 0x00, 0xd0, 0x29, 0x4f, 0x37, 0x15, 0xd3
-+};
-+static const u8 enc_assoc113[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce113[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key113[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input114[] __initconst = {
-+ 0xcb, 0xf1, 0xda, 0x9e, 0x0b, 0xa9, 0x37, 0x73,
-+ 0x74, 0xe6, 0x9e, 0x1c, 0x0e, 0x60, 0x0c, 0xfc,
-+ 0x34, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0xbe, 0x3f, 0xa6, 0x6b, 0x6c, 0xe7, 0x80, 0x8a,
-+ 0xa3, 0xe4, 0x59, 0x49, 0xf9, 0x44, 0x64, 0x9f,
-+ 0xd0, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0x66, 0x68, 0xdb, 0xc8, 0xf5, 0xf2, 0x0e, 0xf2,
-+ 0xb3, 0xf3, 0x8f, 0x00, 0xe2, 0x03, 0x17, 0x88
-+};
-+static const u8 enc_output114[] __initconst = {
-+ 0xcb, 0x9a, 0x0d, 0xb1, 0x8d, 0x63, 0xd7, 0xea,
-+ 0xd7, 0xc9, 0x60, 0xd6, 0xb2, 0x86, 0x74, 0x5f,
-+ 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xde, 0xba, 0xb4, 0xa1, 0x58, 0x42, 0x50, 0xbf,
-+ 0xfc, 0x2f, 0xc8, 0x4d, 0x95, 0xde, 0xcf, 0x04,
-+ 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xde, 0xba, 0xb4, 0xa1, 0x58, 0x42, 0x50, 0xbf,
-+ 0xfc, 0x2f, 0xc8, 0x4d, 0x95, 0xde, 0xcf, 0x04,
-+ 0x23, 0x83, 0xab, 0x0b, 0x79, 0x92, 0x05, 0x69,
-+ 0x9b, 0x51, 0x0a, 0xa7, 0x09, 0xbf, 0x31, 0xf1
-+};
-+static const u8 enc_assoc114[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce114[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key114[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input115[] __initconst = {
-+ 0x8f, 0x27, 0x86, 0x94, 0xc4, 0xe9, 0xda, 0xeb,
-+ 0xd5, 0x8d, 0x3e, 0x5b, 0x96, 0x6e, 0x8b, 0x68,
-+ 0x42, 0x3d, 0x35, 0xf6, 0x13, 0xe6, 0xd9, 0x09,
-+ 0x3d, 0x38, 0xe9, 0x75, 0xc3, 0x8f, 0xe3, 0xb8,
-+ 0x06, 0x53, 0xe7, 0xa3, 0x31, 0x71, 0x88, 0x33,
-+ 0xac, 0xc3, 0xb9, 0xad, 0xff, 0x1c, 0x31, 0x98,
-+ 0xa6, 0xf6, 0x37, 0x81, 0x71, 0xea, 0xe4, 0x39,
-+ 0x6e, 0xa1, 0x5d, 0xc2, 0x40, 0xd1, 0xab, 0xf4,
-+ 0xde, 0x04, 0x9a, 0x00, 0xa8, 0x64, 0x06, 0x4b,
-+ 0xbc, 0xd4, 0x6f, 0xe4, 0xe4, 0x5b, 0x42, 0x8f
-+};
-+static const u8 enc_output115[] __initconst = {
-+ 0x8f, 0x4c, 0x51, 0xbb, 0x42, 0x23, 0x3a, 0x72,
-+ 0x76, 0xa2, 0xc0, 0x91, 0x2a, 0x88, 0xf3, 0xcb,
-+ 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x66, 0xd6, 0xf5, 0x69, 0x05, 0xd4, 0x58, 0x06,
-+ 0xf3, 0x08, 0x28, 0xa9, 0x93, 0x86, 0x9a, 0x03,
-+ 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x66, 0xd6, 0xf5, 0x69, 0x05, 0xd4, 0x58, 0x06,
-+ 0xf3, 0x08, 0x28, 0xa9, 0x93, 0x86, 0x9a, 0x03,
-+ 0x8b, 0xfb, 0xab, 0x17, 0xa9, 0xe0, 0xb8, 0x74,
-+ 0x8b, 0x51, 0x0a, 0xe7, 0xd9, 0xfd, 0x23, 0x05
-+};
-+static const u8 enc_assoc115[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce115[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key115[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input116[] __initconst = {
-+ 0xd5, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x9a, 0x22, 0xd7, 0x0a, 0x48, 0xe2, 0x4f, 0xdd,
-+ 0xcd, 0xd4, 0x41, 0x9d, 0xe6, 0x4c, 0x8f, 0x44,
-+ 0xfc, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x77, 0xb5, 0xc9, 0x07, 0xd9, 0xc9, 0xe1, 0xea,
-+ 0x51, 0x85, 0x1a, 0x20, 0x4a, 0xad, 0x9f, 0x0a,
-+ 0x24, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x3f, 0x91, 0xf8, 0xe7, 0xc7, 0xb1, 0x96, 0x25,
-+ 0x64, 0x61, 0x9c, 0x5e, 0x7e, 0x9b, 0xf6, 0x13
-+};
-+static const u8 enc_output116[] __initconst = {
-+ 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x1d, 0xe0, 0x1d, 0x03, 0xa4, 0xfb, 0x69, 0x2b,
-+ 0x0f, 0x13, 0x57, 0x17, 0xda, 0x3c, 0x93, 0x03,
-+ 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x14, 0xbc, 0x01, 0x79, 0x57, 0xdc, 0xfa, 0x2c,
-+ 0xc0, 0xdb, 0xb8, 0x1d, 0xf5, 0x83, 0xcb, 0x01,
-+ 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x14, 0xbc, 0x01, 0x79, 0x57, 0xdc, 0xfa, 0x2c,
-+ 0xc0, 0xdb, 0xb8, 0x1d, 0xf5, 0x83, 0xcb, 0x01,
-+ 0x49, 0xbc, 0x6e, 0x9f, 0xc5, 0x1c, 0x4d, 0x50,
-+ 0x30, 0x36, 0x64, 0x4d, 0x84, 0x27, 0x73, 0xd2
-+};
-+static const u8 enc_assoc116[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce116[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key116[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input117[] __initconst = {
-+ 0xdb, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x75, 0xd5, 0x64, 0x3a, 0xa5, 0xaf, 0x93, 0x4d,
-+ 0x8c, 0xce, 0x39, 0x2c, 0xc3, 0xee, 0xdb, 0x47,
-+ 0xc0, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0x60, 0x1b, 0x5a, 0xd2, 0x06, 0x7f, 0x28, 0x06,
-+ 0x6a, 0x8f, 0x32, 0x81, 0x71, 0x5b, 0xa8, 0x08,
-+ 0x18, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x28, 0x3f, 0x6b, 0x32, 0x18, 0x07, 0x5f, 0xc9,
-+ 0x5f, 0x6b, 0xb4, 0xff, 0x45, 0x6d, 0xc1, 0x11
-+};
-+static const u8 enc_output117[] __initconst = {
-+ 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xf2, 0x17, 0xae, 0x33, 0x49, 0xb6, 0xb5, 0xbb,
-+ 0x4e, 0x09, 0x2f, 0xa6, 0xff, 0x9e, 0xc7, 0x00,
-+ 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x03, 0x12, 0x92, 0xac, 0x88, 0x6a, 0x33, 0xc0,
-+ 0xfb, 0xd1, 0x90, 0xbc, 0xce, 0x75, 0xfc, 0x03,
-+ 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x03, 0x12, 0x92, 0xac, 0x88, 0x6a, 0x33, 0xc0,
-+ 0xfb, 0xd1, 0x90, 0xbc, 0xce, 0x75, 0xfc, 0x03,
-+ 0x63, 0xda, 0x6e, 0xa2, 0x51, 0xf0, 0x39, 0x53,
-+ 0x2c, 0x36, 0x64, 0x5d, 0x38, 0xb7, 0x6f, 0xd7
-+};
-+static const u8 enc_assoc117[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce117[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key117[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - edge case intermediate sums in poly1305 */
-+static const u8 enc_input118[] __initconst = {
-+ 0x93, 0x94, 0x28, 0xd0, 0x79, 0x35, 0x1f, 0x66,
-+ 0x5c, 0xd0, 0x01, 0x35, 0x43, 0x19, 0x87, 0x5c,
-+ 0x62, 0x48, 0x39, 0x60, 0x42, 0x16, 0xe4, 0x03,
-+ 0xeb, 0xcc, 0x6a, 0xf5, 0x59, 0xec, 0x8b, 0x43,
-+ 0x97, 0x7a, 0xed, 0x35, 0xcb, 0x5a, 0x2f, 0xca,
-+ 0xa0, 0x34, 0x6e, 0xfb, 0x93, 0x65, 0x54, 0x64,
-+ 0xd8, 0xc8, 0xc3, 0xfa, 0x1a, 0x9e, 0x47, 0x4a,
-+ 0xbe, 0x52, 0xd0, 0x2c, 0x81, 0x87, 0xe9, 0x0f,
-+ 0x4f, 0x2d, 0x90, 0x96, 0x52, 0x4f, 0xa1, 0xb2,
-+ 0xb0, 0x23, 0xb8, 0xb2, 0x88, 0x22, 0x27, 0x73,
-+ 0x90, 0xec, 0xf2, 0x1a, 0x04, 0xe6, 0x30, 0x85,
-+ 0x8b, 0xb6, 0x56, 0x52, 0xb5, 0xb1, 0x80, 0x16
-+};
-+static const u8 enc_output118[] __initconst = {
-+ 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xe5, 0x8a, 0xf3, 0x69, 0xae, 0x0f, 0xc2, 0xf5,
-+ 0x29, 0x0b, 0x7c, 0x7f, 0x65, 0x9c, 0x97, 0x04,
-+ 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xbb, 0xc1, 0x0b, 0x84, 0x94, 0x8b, 0x5c, 0x8c,
-+ 0x2f, 0x0c, 0x72, 0x11, 0x3e, 0xa9, 0xbd, 0x04,
-+ 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xbb, 0xc1, 0x0b, 0x84, 0x94, 0x8b, 0x5c, 0x8c,
-+ 0x2f, 0x0c, 0x72, 0x11, 0x3e, 0xa9, 0xbd, 0x04,
-+ 0x73, 0xeb, 0x27, 0x24, 0xb5, 0xc4, 0x05, 0xf0,
-+ 0x4d, 0x00, 0xd0, 0xf1, 0x58, 0x40, 0xa1, 0xc1
-+};
-+static const u8 enc_assoc118[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce118[] __initconst = {
-+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x4c, 0x2d, 0x52
-+};
-+static const u8 enc_key118[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+static const struct chacha20poly1305_testvec
-+chacha20poly1305_enc_vectors[] __initconst = {
-+ { enc_input001, enc_output001, enc_assoc001, enc_nonce001, enc_key001,
-+ sizeof(enc_input001), sizeof(enc_assoc001), sizeof(enc_nonce001) },
-+ { enc_input002, enc_output002, enc_assoc002, enc_nonce002, enc_key002,
-+ sizeof(enc_input002), sizeof(enc_assoc002), sizeof(enc_nonce002) },
-+ { enc_input003, enc_output003, enc_assoc003, enc_nonce003, enc_key003,
-+ sizeof(enc_input003), sizeof(enc_assoc003), sizeof(enc_nonce003) },
-+ { enc_input004, enc_output004, enc_assoc004, enc_nonce004, enc_key004,
-+ sizeof(enc_input004), sizeof(enc_assoc004), sizeof(enc_nonce004) },
-+ { enc_input005, enc_output005, enc_assoc005, enc_nonce005, enc_key005,
-+ sizeof(enc_input005), sizeof(enc_assoc005), sizeof(enc_nonce005) },
-+ { enc_input006, enc_output006, enc_assoc006, enc_nonce006, enc_key006,
-+ sizeof(enc_input006), sizeof(enc_assoc006), sizeof(enc_nonce006) },
-+ { enc_input007, enc_output007, enc_assoc007, enc_nonce007, enc_key007,
-+ sizeof(enc_input007), sizeof(enc_assoc007), sizeof(enc_nonce007) },
-+ { enc_input008, enc_output008, enc_assoc008, enc_nonce008, enc_key008,
-+ sizeof(enc_input008), sizeof(enc_assoc008), sizeof(enc_nonce008) },
-+ { enc_input009, enc_output009, enc_assoc009, enc_nonce009, enc_key009,
-+ sizeof(enc_input009), sizeof(enc_assoc009), sizeof(enc_nonce009) },
-+ { enc_input010, enc_output010, enc_assoc010, enc_nonce010, enc_key010,
-+ sizeof(enc_input010), sizeof(enc_assoc010), sizeof(enc_nonce010) },
-+ { enc_input011, enc_output011, enc_assoc011, enc_nonce011, enc_key011,
-+ sizeof(enc_input011), sizeof(enc_assoc011), sizeof(enc_nonce011) },
-+ { enc_input012, enc_output012, enc_assoc012, enc_nonce012, enc_key012,
-+ sizeof(enc_input012), sizeof(enc_assoc012), sizeof(enc_nonce012) },
-+ { enc_input053, enc_output053, enc_assoc053, enc_nonce053, enc_key053,
-+ sizeof(enc_input053), sizeof(enc_assoc053), sizeof(enc_nonce053) },
-+ { enc_input054, enc_output054, enc_assoc054, enc_nonce054, enc_key054,
-+ sizeof(enc_input054), sizeof(enc_assoc054), sizeof(enc_nonce054) },
-+ { enc_input055, enc_output055, enc_assoc055, enc_nonce055, enc_key055,
-+ sizeof(enc_input055), sizeof(enc_assoc055), sizeof(enc_nonce055) },
-+ { enc_input056, enc_output056, enc_assoc056, enc_nonce056, enc_key056,
-+ sizeof(enc_input056), sizeof(enc_assoc056), sizeof(enc_nonce056) },
-+ { enc_input057, enc_output057, enc_assoc057, enc_nonce057, enc_key057,
-+ sizeof(enc_input057), sizeof(enc_assoc057), sizeof(enc_nonce057) },
-+ { enc_input058, enc_output058, enc_assoc058, enc_nonce058, enc_key058,
-+ sizeof(enc_input058), sizeof(enc_assoc058), sizeof(enc_nonce058) },
-+ { enc_input059, enc_output059, enc_assoc059, enc_nonce059, enc_key059,
-+ sizeof(enc_input059), sizeof(enc_assoc059), sizeof(enc_nonce059) },
-+ { enc_input060, enc_output060, enc_assoc060, enc_nonce060, enc_key060,
-+ sizeof(enc_input060), sizeof(enc_assoc060), sizeof(enc_nonce060) },
-+ { enc_input061, enc_output061, enc_assoc061, enc_nonce061, enc_key061,
-+ sizeof(enc_input061), sizeof(enc_assoc061), sizeof(enc_nonce061) },
-+ { enc_input062, enc_output062, enc_assoc062, enc_nonce062, enc_key062,
-+ sizeof(enc_input062), sizeof(enc_assoc062), sizeof(enc_nonce062) },
-+ { enc_input063, enc_output063, enc_assoc063, enc_nonce063, enc_key063,
-+ sizeof(enc_input063), sizeof(enc_assoc063), sizeof(enc_nonce063) },
-+ { enc_input064, enc_output064, enc_assoc064, enc_nonce064, enc_key064,
-+ sizeof(enc_input064), sizeof(enc_assoc064), sizeof(enc_nonce064) },
-+ { enc_input065, enc_output065, enc_assoc065, enc_nonce065, enc_key065,
-+ sizeof(enc_input065), sizeof(enc_assoc065), sizeof(enc_nonce065) },
-+ { enc_input066, enc_output066, enc_assoc066, enc_nonce066, enc_key066,
-+ sizeof(enc_input066), sizeof(enc_assoc066), sizeof(enc_nonce066) },
-+ { enc_input067, enc_output067, enc_assoc067, enc_nonce067, enc_key067,
-+ sizeof(enc_input067), sizeof(enc_assoc067), sizeof(enc_nonce067) },
-+ { enc_input068, enc_output068, enc_assoc068, enc_nonce068, enc_key068,
-+ sizeof(enc_input068), sizeof(enc_assoc068), sizeof(enc_nonce068) },
-+ { enc_input069, enc_output069, enc_assoc069, enc_nonce069, enc_key069,
-+ sizeof(enc_input069), sizeof(enc_assoc069), sizeof(enc_nonce069) },
-+ { enc_input070, enc_output070, enc_assoc070, enc_nonce070, enc_key070,
-+ sizeof(enc_input070), sizeof(enc_assoc070), sizeof(enc_nonce070) },
-+ { enc_input071, enc_output071, enc_assoc071, enc_nonce071, enc_key071,
-+ sizeof(enc_input071), sizeof(enc_assoc071), sizeof(enc_nonce071) },
-+ { enc_input072, enc_output072, enc_assoc072, enc_nonce072, enc_key072,
-+ sizeof(enc_input072), sizeof(enc_assoc072), sizeof(enc_nonce072) },
-+ { enc_input073, enc_output073, enc_assoc073, enc_nonce073, enc_key073,
-+ sizeof(enc_input073), sizeof(enc_assoc073), sizeof(enc_nonce073) },
-+ { enc_input076, enc_output076, enc_assoc076, enc_nonce076, enc_key076,
-+ sizeof(enc_input076), sizeof(enc_assoc076), sizeof(enc_nonce076) },
-+ { enc_input077, enc_output077, enc_assoc077, enc_nonce077, enc_key077,
-+ sizeof(enc_input077), sizeof(enc_assoc077), sizeof(enc_nonce077) },
-+ { enc_input078, enc_output078, enc_assoc078, enc_nonce078, enc_key078,
-+ sizeof(enc_input078), sizeof(enc_assoc078), sizeof(enc_nonce078) },
-+ { enc_input079, enc_output079, enc_assoc079, enc_nonce079, enc_key079,
-+ sizeof(enc_input079), sizeof(enc_assoc079), sizeof(enc_nonce079) },
-+ { enc_input080, enc_output080, enc_assoc080, enc_nonce080, enc_key080,
-+ sizeof(enc_input080), sizeof(enc_assoc080), sizeof(enc_nonce080) },
-+ { enc_input081, enc_output081, enc_assoc081, enc_nonce081, enc_key081,
-+ sizeof(enc_input081), sizeof(enc_assoc081), sizeof(enc_nonce081) },
-+ { enc_input082, enc_output082, enc_assoc082, enc_nonce082, enc_key082,
-+ sizeof(enc_input082), sizeof(enc_assoc082), sizeof(enc_nonce082) },
-+ { enc_input083, enc_output083, enc_assoc083, enc_nonce083, enc_key083,
-+ sizeof(enc_input083), sizeof(enc_assoc083), sizeof(enc_nonce083) },
-+ { enc_input084, enc_output084, enc_assoc084, enc_nonce084, enc_key084,
-+ sizeof(enc_input084), sizeof(enc_assoc084), sizeof(enc_nonce084) },
-+ { enc_input085, enc_output085, enc_assoc085, enc_nonce085, enc_key085,
-+ sizeof(enc_input085), sizeof(enc_assoc085), sizeof(enc_nonce085) },
-+ { enc_input093, enc_output093, enc_assoc093, enc_nonce093, enc_key093,
-+ sizeof(enc_input093), sizeof(enc_assoc093), sizeof(enc_nonce093) },
-+ { enc_input094, enc_output094, enc_assoc094, enc_nonce094, enc_key094,
-+ sizeof(enc_input094), sizeof(enc_assoc094), sizeof(enc_nonce094) },
-+ { enc_input095, enc_output095, enc_assoc095, enc_nonce095, enc_key095,
-+ sizeof(enc_input095), sizeof(enc_assoc095), sizeof(enc_nonce095) },
-+ { enc_input096, enc_output096, enc_assoc096, enc_nonce096, enc_key096,
-+ sizeof(enc_input096), sizeof(enc_assoc096), sizeof(enc_nonce096) },
-+ { enc_input097, enc_output097, enc_assoc097, enc_nonce097, enc_key097,
-+ sizeof(enc_input097), sizeof(enc_assoc097), sizeof(enc_nonce097) },
-+ { enc_input098, enc_output098, enc_assoc098, enc_nonce098, enc_key098,
-+ sizeof(enc_input098), sizeof(enc_assoc098), sizeof(enc_nonce098) },
-+ { enc_input099, enc_output099, enc_assoc099, enc_nonce099, enc_key099,
-+ sizeof(enc_input099), sizeof(enc_assoc099), sizeof(enc_nonce099) },
-+ { enc_input100, enc_output100, enc_assoc100, enc_nonce100, enc_key100,
-+ sizeof(enc_input100), sizeof(enc_assoc100), sizeof(enc_nonce100) },
-+ { enc_input101, enc_output101, enc_assoc101, enc_nonce101, enc_key101,
-+ sizeof(enc_input101), sizeof(enc_assoc101), sizeof(enc_nonce101) },
-+ { enc_input102, enc_output102, enc_assoc102, enc_nonce102, enc_key102,
-+ sizeof(enc_input102), sizeof(enc_assoc102), sizeof(enc_nonce102) },
-+ { enc_input103, enc_output103, enc_assoc103, enc_nonce103, enc_key103,
-+ sizeof(enc_input103), sizeof(enc_assoc103), sizeof(enc_nonce103) },
-+ { enc_input104, enc_output104, enc_assoc104, enc_nonce104, enc_key104,
-+ sizeof(enc_input104), sizeof(enc_assoc104), sizeof(enc_nonce104) },
-+ { enc_input105, enc_output105, enc_assoc105, enc_nonce105, enc_key105,
-+ sizeof(enc_input105), sizeof(enc_assoc105), sizeof(enc_nonce105) },
-+ { enc_input106, enc_output106, enc_assoc106, enc_nonce106, enc_key106,
-+ sizeof(enc_input106), sizeof(enc_assoc106), sizeof(enc_nonce106) },
-+ { enc_input107, enc_output107, enc_assoc107, enc_nonce107, enc_key107,
-+ sizeof(enc_input107), sizeof(enc_assoc107), sizeof(enc_nonce107) },
-+ { enc_input108, enc_output108, enc_assoc108, enc_nonce108, enc_key108,
-+ sizeof(enc_input108), sizeof(enc_assoc108), sizeof(enc_nonce108) },
-+ { enc_input109, enc_output109, enc_assoc109, enc_nonce109, enc_key109,
-+ sizeof(enc_input109), sizeof(enc_assoc109), sizeof(enc_nonce109) },
-+ { enc_input110, enc_output110, enc_assoc110, enc_nonce110, enc_key110,
-+ sizeof(enc_input110), sizeof(enc_assoc110), sizeof(enc_nonce110) },
-+ { enc_input111, enc_output111, enc_assoc111, enc_nonce111, enc_key111,
-+ sizeof(enc_input111), sizeof(enc_assoc111), sizeof(enc_nonce111) },
-+ { enc_input112, enc_output112, enc_assoc112, enc_nonce112, enc_key112,
-+ sizeof(enc_input112), sizeof(enc_assoc112), sizeof(enc_nonce112) },
-+ { enc_input113, enc_output113, enc_assoc113, enc_nonce113, enc_key113,
-+ sizeof(enc_input113), sizeof(enc_assoc113), sizeof(enc_nonce113) },
-+ { enc_input114, enc_output114, enc_assoc114, enc_nonce114, enc_key114,
-+ sizeof(enc_input114), sizeof(enc_assoc114), sizeof(enc_nonce114) },
-+ { enc_input115, enc_output115, enc_assoc115, enc_nonce115, enc_key115,
-+ sizeof(enc_input115), sizeof(enc_assoc115), sizeof(enc_nonce115) },
-+ { enc_input116, enc_output116, enc_assoc116, enc_nonce116, enc_key116,
-+ sizeof(enc_input116), sizeof(enc_assoc116), sizeof(enc_nonce116) },
-+ { enc_input117, enc_output117, enc_assoc117, enc_nonce117, enc_key117,
-+ sizeof(enc_input117), sizeof(enc_assoc117), sizeof(enc_nonce117) },
-+ { enc_input118, enc_output118, enc_assoc118, enc_nonce118, enc_key118,
-+ sizeof(enc_input118), sizeof(enc_assoc118), sizeof(enc_nonce118) }
-+};
-+
-+static const u8 dec_input001[] __initconst = {
-+ 0x64, 0xa0, 0x86, 0x15, 0x75, 0x86, 0x1a, 0xf4,
-+ 0x60, 0xf0, 0x62, 0xc7, 0x9b, 0xe6, 0x43, 0xbd,
-+ 0x5e, 0x80, 0x5c, 0xfd, 0x34, 0x5c, 0xf3, 0x89,
-+ 0xf1, 0x08, 0x67, 0x0a, 0xc7, 0x6c, 0x8c, 0xb2,
-+ 0x4c, 0x6c, 0xfc, 0x18, 0x75, 0x5d, 0x43, 0xee,
-+ 0xa0, 0x9e, 0xe9, 0x4e, 0x38, 0x2d, 0x26, 0xb0,
-+ 0xbd, 0xb7, 0xb7, 0x3c, 0x32, 0x1b, 0x01, 0x00,
-+ 0xd4, 0xf0, 0x3b, 0x7f, 0x35, 0x58, 0x94, 0xcf,
-+ 0x33, 0x2f, 0x83, 0x0e, 0x71, 0x0b, 0x97, 0xce,
-+ 0x98, 0xc8, 0xa8, 0x4a, 0xbd, 0x0b, 0x94, 0x81,
-+ 0x14, 0xad, 0x17, 0x6e, 0x00, 0x8d, 0x33, 0xbd,
-+ 0x60, 0xf9, 0x82, 0xb1, 0xff, 0x37, 0xc8, 0x55,
-+ 0x97, 0x97, 0xa0, 0x6e, 0xf4, 0xf0, 0xef, 0x61,
-+ 0xc1, 0x86, 0x32, 0x4e, 0x2b, 0x35, 0x06, 0x38,
-+ 0x36, 0x06, 0x90, 0x7b, 0x6a, 0x7c, 0x02, 0xb0,
-+ 0xf9, 0xf6, 0x15, 0x7b, 0x53, 0xc8, 0x67, 0xe4,
-+ 0xb9, 0x16, 0x6c, 0x76, 0x7b, 0x80, 0x4d, 0x46,
-+ 0xa5, 0x9b, 0x52, 0x16, 0xcd, 0xe7, 0xa4, 0xe9,
-+ 0x90, 0x40, 0xc5, 0xa4, 0x04, 0x33, 0x22, 0x5e,
-+ 0xe2, 0x82, 0xa1, 0xb0, 0xa0, 0x6c, 0x52, 0x3e,
-+ 0xaf, 0x45, 0x34, 0xd7, 0xf8, 0x3f, 0xa1, 0x15,
-+ 0x5b, 0x00, 0x47, 0x71, 0x8c, 0xbc, 0x54, 0x6a,
-+ 0x0d, 0x07, 0x2b, 0x04, 0xb3, 0x56, 0x4e, 0xea,
-+ 0x1b, 0x42, 0x22, 0x73, 0xf5, 0x48, 0x27, 0x1a,
-+ 0x0b, 0xb2, 0x31, 0x60, 0x53, 0xfa, 0x76, 0x99,
-+ 0x19, 0x55, 0xeb, 0xd6, 0x31, 0x59, 0x43, 0x4e,
-+ 0xce, 0xbb, 0x4e, 0x46, 0x6d, 0xae, 0x5a, 0x10,
-+ 0x73, 0xa6, 0x72, 0x76, 0x27, 0x09, 0x7a, 0x10,
-+ 0x49, 0xe6, 0x17, 0xd9, 0x1d, 0x36, 0x10, 0x94,
-+ 0xfa, 0x68, 0xf0, 0xff, 0x77, 0x98, 0x71, 0x30,
-+ 0x30, 0x5b, 0xea, 0xba, 0x2e, 0xda, 0x04, 0xdf,
-+ 0x99, 0x7b, 0x71, 0x4d, 0x6c, 0x6f, 0x2c, 0x29,
-+ 0xa6, 0xad, 0x5c, 0xb4, 0x02, 0x2b, 0x02, 0x70,
-+ 0x9b, 0xee, 0xad, 0x9d, 0x67, 0x89, 0x0c, 0xbb,
-+ 0x22, 0x39, 0x23, 0x36, 0xfe, 0xa1, 0x85, 0x1f,
-+ 0x38
-+};
-+static const u8 dec_output001[] __initconst = {
-+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
-+ 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20,
-+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x72, 0x61, 0x66,
-+ 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69,
-+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20,
-+ 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
-+ 0x6f, 0x66, 0x20, 0x73, 0x69, 0x78, 0x20, 0x6d,
-+ 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x20, 0x61, 0x6e,
-+ 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
-+ 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
-+ 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
-+ 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f,
-+ 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x64,
-+ 0x20, 0x62, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65,
-+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x61,
-+ 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e,
-+ 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69,
-+ 0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72,
-+ 0x69, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20,
-+ 0x75, 0x73, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65,
-+ 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61,
-+ 0x66, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x72,
-+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-+ 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
-+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20,
-+ 0x63, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65,
-+ 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
-+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x20,
-+ 0x2f, 0xe2, 0x80, 0x9c, 0x77, 0x6f, 0x72, 0x6b,
-+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67,
-+ 0x72, 0x65, 0x73, 0x73, 0x2e, 0x2f, 0xe2, 0x80,
-+ 0x9d
-+};
-+static const u8 dec_assoc001[] __initconst = {
-+ 0xf3, 0x33, 0x88, 0x86, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x4e, 0x91
-+};
-+static const u8 dec_nonce001[] __initconst = {
-+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
-+};
-+static const u8 dec_key001[] __initconst = {
-+ 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
-+ 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
-+ 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
-+ 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
-+};
-+
-+static const u8 dec_input002[] __initconst = {
-+ 0xea, 0xe0, 0x1e, 0x9e, 0x2c, 0x91, 0xaa, 0xe1,
-+ 0xdb, 0x5d, 0x99, 0x3f, 0x8a, 0xf7, 0x69, 0x92
-+};
-+static const u8 dec_output002[] __initconst = { };
-+static const u8 dec_assoc002[] __initconst = { };
-+static const u8 dec_nonce002[] __initconst = {
-+ 0xca, 0xbf, 0x33, 0x71, 0x32, 0x45, 0x77, 0x8e
-+};
-+static const u8 dec_key002[] __initconst = {
-+ 0x4c, 0xf5, 0x96, 0x83, 0x38, 0xe6, 0xae, 0x7f,
-+ 0x2d, 0x29, 0x25, 0x76, 0xd5, 0x75, 0x27, 0x86,
-+ 0x91, 0x9a, 0x27, 0x7a, 0xfb, 0x46, 0xc5, 0xef,
-+ 0x94, 0x81, 0x79, 0x57, 0x14, 0x59, 0x40, 0x68
-+};
-+
-+static const u8 dec_input003[] __initconst = {
-+ 0xdd, 0x6b, 0x3b, 0x82, 0xce, 0x5a, 0xbd, 0xd6,
-+ 0xa9, 0x35, 0x83, 0xd8, 0x8c, 0x3d, 0x85, 0x77
-+};
-+static const u8 dec_output003[] __initconst = { };
-+static const u8 dec_assoc003[] __initconst = {
-+ 0x33, 0x10, 0x41, 0x12, 0x1f, 0xf3, 0xd2, 0x6b
-+};
-+static const u8 dec_nonce003[] __initconst = {
-+ 0x3d, 0x86, 0xb5, 0x6b, 0xc8, 0xa3, 0x1f, 0x1d
-+};
-+static const u8 dec_key003[] __initconst = {
-+ 0x2d, 0xb0, 0x5d, 0x40, 0xc8, 0xed, 0x44, 0x88,
-+ 0x34, 0xd1, 0x13, 0xaf, 0x57, 0xa1, 0xeb, 0x3a,
-+ 0x2a, 0x80, 0x51, 0x36, 0xec, 0x5b, 0xbc, 0x08,
-+ 0x93, 0x84, 0x21, 0xb5, 0x13, 0x88, 0x3c, 0x0d
-+};
-+
-+static const u8 dec_input004[] __initconst = {
-+ 0xb7, 0x1b, 0xb0, 0x73, 0x59, 0xb0, 0x84, 0xb2,
-+ 0x6d, 0x8e, 0xab, 0x94, 0x31, 0xa1, 0xae, 0xac,
-+ 0x89
-+};
-+static const u8 dec_output004[] __initconst = {
-+ 0xa4
-+};
-+static const u8 dec_assoc004[] __initconst = {
-+ 0x6a, 0xe2, 0xad, 0x3f, 0x88, 0x39, 0x5a, 0x40
-+};
-+static const u8 dec_nonce004[] __initconst = {
-+ 0xd2, 0x32, 0x1f, 0x29, 0x28, 0xc6, 0xc4, 0xc4
-+};
-+static const u8 dec_key004[] __initconst = {
-+ 0x4b, 0x28, 0x4b, 0xa3, 0x7b, 0xbe, 0xe9, 0xf8,
-+ 0x31, 0x80, 0x82, 0xd7, 0xd8, 0xe8, 0xb5, 0xa1,
-+ 0xe2, 0x18, 0x18, 0x8a, 0x9c, 0xfa, 0xa3, 0x3d,
-+ 0x25, 0x71, 0x3e, 0x40, 0xbc, 0x54, 0x7a, 0x3e
-+};
-+
-+static const u8 dec_input005[] __initconst = {
-+ 0xbf, 0xe1, 0x5b, 0x0b, 0xdb, 0x6b, 0xf5, 0x5e,
-+ 0x6c, 0x5d, 0x84, 0x44, 0x39, 0x81, 0xc1, 0x9c,
-+ 0xac
-+};
-+static const u8 dec_output005[] __initconst = {
-+ 0x2d
-+};
-+static const u8 dec_assoc005[] __initconst = { };
-+static const u8 dec_nonce005[] __initconst = {
-+ 0x20, 0x1c, 0xaa, 0x5f, 0x9c, 0xbf, 0x92, 0x30
-+};
-+static const u8 dec_key005[] __initconst = {
-+ 0x66, 0xca, 0x9c, 0x23, 0x2a, 0x4b, 0x4b, 0x31,
-+ 0x0e, 0x92, 0x89, 0x8b, 0xf4, 0x93, 0xc7, 0x87,
-+ 0x98, 0xa3, 0xd8, 0x39, 0xf8, 0xf4, 0xa7, 0x01,
-+ 0xc0, 0x2e, 0x0a, 0xa6, 0x7e, 0x5a, 0x78, 0x87
-+};
-+
-+static const u8 dec_input006[] __initconst = {
-+ 0x8b, 0x06, 0xd3, 0x31, 0xb0, 0x93, 0x45, 0xb1,
-+ 0x75, 0x6e, 0x26, 0xf9, 0x67, 0xbc, 0x90, 0x15,
-+ 0x81, 0x2c, 0xb5, 0xf0, 0xc6, 0x2b, 0xc7, 0x8c,
-+ 0x56, 0xd1, 0xbf, 0x69, 0x6c, 0x07, 0xa0, 0xda,
-+ 0x65, 0x27, 0xc9, 0x90, 0x3d, 0xef, 0x4b, 0x11,
-+ 0x0f, 0x19, 0x07, 0xfd, 0x29, 0x92, 0xd9, 0xc8,
-+ 0xf7, 0x99, 0x2e, 0x4a, 0xd0, 0xb8, 0x2c, 0xdc,
-+ 0x93, 0xf5, 0x9e, 0x33, 0x78, 0xd1, 0x37, 0xc3,
-+ 0x66, 0xd7, 0x5e, 0xbc, 0x44, 0xbf, 0x53, 0xa5,
-+ 0xbc, 0xc4, 0xcb, 0x7b, 0x3a, 0x8e, 0x7f, 0x02,
-+ 0xbd, 0xbb, 0xe7, 0xca, 0xa6, 0x6c, 0x6b, 0x93,
-+ 0x21, 0x93, 0x10, 0x61, 0xe7, 0x69, 0xd0, 0x78,
-+ 0xf3, 0x07, 0x5a, 0x1a, 0x8f, 0x73, 0xaa, 0xb1,
-+ 0x4e, 0xd3, 0xda, 0x4f, 0xf3, 0x32, 0xe1, 0x66,
-+ 0x3e, 0x6c, 0xc6, 0x13, 0xba, 0x06, 0x5b, 0xfc,
-+ 0x6a, 0xe5, 0x6f, 0x60, 0xfb, 0x07, 0x40, 0xb0,
-+ 0x8c, 0x9d, 0x84, 0x43, 0x6b, 0xc1, 0xf7, 0x8d,
-+ 0x8d, 0x31, 0xf7, 0x7a, 0x39, 0x4d, 0x8f, 0x9a,
-+ 0xeb
-+};
-+static const u8 dec_output006[] __initconst = {
-+ 0x33, 0x2f, 0x94, 0xc1, 0xa4, 0xef, 0xcc, 0x2a,
-+ 0x5b, 0xa6, 0xe5, 0x8f, 0x1d, 0x40, 0xf0, 0x92,
-+ 0x3c, 0xd9, 0x24, 0x11, 0xa9, 0x71, 0xf9, 0x37,
-+ 0x14, 0x99, 0xfa, 0xbe, 0xe6, 0x80, 0xde, 0x50,
-+ 0xc9, 0x96, 0xd4, 0xb0, 0xec, 0x9e, 0x17, 0xec,
-+ 0xd2, 0x5e, 0x72, 0x99, 0xfc, 0x0a, 0xe1, 0xcb,
-+ 0x48, 0xd2, 0x85, 0xdd, 0x2f, 0x90, 0xe0, 0x66,
-+ 0x3b, 0xe6, 0x20, 0x74, 0xbe, 0x23, 0x8f, 0xcb,
-+ 0xb4, 0xe4, 0xda, 0x48, 0x40, 0xa6, 0xd1, 0x1b,
-+ 0xc7, 0x42, 0xce, 0x2f, 0x0c, 0xa6, 0x85, 0x6e,
-+ 0x87, 0x37, 0x03, 0xb1, 0x7c, 0x25, 0x96, 0xa3,
-+ 0x05, 0xd8, 0xb0, 0xf4, 0xed, 0xea, 0xc2, 0xf0,
-+ 0x31, 0x98, 0x6c, 0xd1, 0x14, 0x25, 0xc0, 0xcb,
-+ 0x01, 0x74, 0xd0, 0x82, 0xf4, 0x36, 0xf5, 0x41,
-+ 0xd5, 0xdc, 0xca, 0xc5, 0xbb, 0x98, 0xfe, 0xfc,
-+ 0x69, 0x21, 0x70, 0xd8, 0xa4, 0x4b, 0xc8, 0xde,
-+ 0x8f
-+};
-+static const u8 dec_assoc006[] __initconst = {
-+ 0x70, 0xd3, 0x33, 0xf3, 0x8b, 0x18, 0x0b
-+};
-+static const u8 dec_nonce006[] __initconst = {
-+ 0xdf, 0x51, 0x84, 0x82, 0x42, 0x0c, 0x75, 0x9c
-+};
-+static const u8 dec_key006[] __initconst = {
-+ 0x68, 0x7b, 0x8d, 0x8e, 0xe3, 0xc4, 0xdd, 0xae,
-+ 0xdf, 0x72, 0x7f, 0x53, 0x72, 0x25, 0x1e, 0x78,
-+ 0x91, 0xcb, 0x69, 0x76, 0x1f, 0x49, 0x93, 0xf9,
-+ 0x6f, 0x21, 0xcc, 0x39, 0x9c, 0xad, 0xb1, 0x01
-+};
-+
-+static const u8 dec_input007[] __initconst = {
-+ 0x85, 0x04, 0xc2, 0xed, 0x8d, 0xfd, 0x97, 0x5c,
-+ 0xd2, 0xb7, 0xe2, 0xc1, 0x6b, 0xa3, 0xba, 0xf8,
-+ 0xc9, 0x50, 0xc3, 0xc6, 0xa5, 0xe3, 0xa4, 0x7c,
-+ 0xc3, 0x23, 0x49, 0x5e, 0xa9, 0xb9, 0x32, 0xeb,
-+ 0x8a, 0x7c, 0xca, 0xe5, 0xec, 0xfb, 0x7c, 0xc0,
-+ 0xcb, 0x7d, 0xdc, 0x2c, 0x9d, 0x92, 0x55, 0x21,
-+ 0x0a, 0xc8, 0x43, 0x63, 0x59, 0x0a, 0x31, 0x70,
-+ 0x82, 0x67, 0x41, 0x03, 0xf8, 0xdf, 0xf2, 0xac,
-+ 0xa7, 0x02, 0xd4, 0xd5, 0x8a, 0x2d, 0xc8, 0x99,
-+ 0x19, 0x66, 0xd0, 0xf6, 0x88, 0x2c, 0x77, 0xd9,
-+ 0xd4, 0x0d, 0x6c, 0xbd, 0x98, 0xde, 0xe7, 0x7f,
-+ 0xad, 0x7e, 0x8a, 0xfb, 0xe9, 0x4b, 0xe5, 0xf7,
-+ 0xe5, 0x50, 0xa0, 0x90, 0x3f, 0xd6, 0x22, 0x53,
-+ 0xe3, 0xfe, 0x1b, 0xcc, 0x79, 0x3b, 0xec, 0x12,
-+ 0x47, 0x52, 0xa7, 0xd6, 0x04, 0xe3, 0x52, 0xe6,
-+ 0x93, 0x90, 0x91, 0x32, 0x73, 0x79, 0xb8, 0xd0,
-+ 0x31, 0xde, 0x1f, 0x9f, 0x2f, 0x05, 0x38, 0x54,
-+ 0x2f, 0x35, 0x04, 0x39, 0xe0, 0xa7, 0xba, 0xc6,
-+ 0x52, 0xf6, 0x37, 0x65, 0x4c, 0x07, 0xa9, 0x7e,
-+ 0xb3, 0x21, 0x6f, 0x74, 0x8c, 0xc9, 0xde, 0xdb,
-+ 0x65, 0x1b, 0x9b, 0xaa, 0x60, 0xb1, 0x03, 0x30,
-+ 0x6b, 0xb2, 0x03, 0xc4, 0x1c, 0x04, 0xf8, 0x0f,
-+ 0x64, 0xaf, 0x46, 0xe4, 0x65, 0x99, 0x49, 0xe2,
-+ 0xea, 0xce, 0x78, 0x00, 0xd8, 0x8b, 0xd5, 0x2e,
-+ 0xcf, 0xfc, 0x40, 0x49, 0xe8, 0x58, 0xdc, 0x34,
-+ 0x9c, 0x8c, 0x61, 0xbf, 0x0a, 0x8e, 0xec, 0x39,
-+ 0xa9, 0x30, 0x05, 0x5a, 0xd2, 0x56, 0x01, 0xc7,
-+ 0xda, 0x8f, 0x4e, 0xbb, 0x43, 0xa3, 0x3a, 0xf9,
-+ 0x15, 0x2a, 0xd0, 0xa0, 0x7a, 0x87, 0x34, 0x82,
-+ 0xfe, 0x8a, 0xd1, 0x2d, 0x5e, 0xc7, 0xbf, 0x04,
-+ 0x53, 0x5f, 0x3b, 0x36, 0xd4, 0x25, 0x5c, 0x34,
-+ 0x7a, 0x8d, 0xd5, 0x05, 0xce, 0x72, 0xca, 0xef,
-+ 0x7a, 0x4b, 0xbc, 0xb0, 0x10, 0x5c, 0x96, 0x42,
-+ 0x3a, 0x00, 0x98, 0xcd, 0x15, 0xe8, 0xb7, 0x53
-+};
-+static const u8 dec_output007[] __initconst = {
-+ 0x9b, 0x18, 0xdb, 0xdd, 0x9a, 0x0f, 0x3e, 0xa5,
-+ 0x15, 0x17, 0xde, 0xdf, 0x08, 0x9d, 0x65, 0x0a,
-+ 0x67, 0x30, 0x12, 0xe2, 0x34, 0x77, 0x4b, 0xc1,
-+ 0xd9, 0xc6, 0x1f, 0xab, 0xc6, 0x18, 0x50, 0x17,
-+ 0xa7, 0x9d, 0x3c, 0xa6, 0xc5, 0x35, 0x8c, 0x1c,
-+ 0xc0, 0xa1, 0x7c, 0x9f, 0x03, 0x89, 0xca, 0xe1,
-+ 0xe6, 0xe9, 0xd4, 0xd3, 0x88, 0xdb, 0xb4, 0x51,
-+ 0x9d, 0xec, 0xb4, 0xfc, 0x52, 0xee, 0x6d, 0xf1,
-+ 0x75, 0x42, 0xc6, 0xfd, 0xbd, 0x7a, 0x8e, 0x86,
-+ 0xfc, 0x44, 0xb3, 0x4f, 0xf3, 0xea, 0x67, 0x5a,
-+ 0x41, 0x13, 0xba, 0xb0, 0xdc, 0xe1, 0xd3, 0x2a,
-+ 0x7c, 0x22, 0xb3, 0xca, 0xac, 0x6a, 0x37, 0x98,
-+ 0x3e, 0x1d, 0x40, 0x97, 0xf7, 0x9b, 0x1d, 0x36,
-+ 0x6b, 0xb3, 0x28, 0xbd, 0x60, 0x82, 0x47, 0x34,
-+ 0xaa, 0x2f, 0x7d, 0xe9, 0xa8, 0x70, 0x81, 0x57,
-+ 0xd4, 0xb9, 0x77, 0x0a, 0x9d, 0x29, 0xa7, 0x84,
-+ 0x52, 0x4f, 0xc2, 0x4a, 0x40, 0x3b, 0x3c, 0xd4,
-+ 0xc9, 0x2a, 0xdb, 0x4a, 0x53, 0xc4, 0xbe, 0x80,
-+ 0xe9, 0x51, 0x7f, 0x8f, 0xc7, 0xa2, 0xce, 0x82,
-+ 0x5c, 0x91, 0x1e, 0x74, 0xd9, 0xd0, 0xbd, 0xd5,
-+ 0xf3, 0xfd, 0xda, 0x4d, 0x25, 0xb4, 0xbb, 0x2d,
-+ 0xac, 0x2f, 0x3d, 0x71, 0x85, 0x7b, 0xcf, 0x3c,
-+ 0x7b, 0x3e, 0x0e, 0x22, 0x78, 0x0c, 0x29, 0xbf,
-+ 0xe4, 0xf4, 0x57, 0xb3, 0xcb, 0x49, 0xa0, 0xfc,
-+ 0x1e, 0x05, 0x4e, 0x16, 0xbc, 0xd5, 0xa8, 0xa3,
-+ 0xee, 0x05, 0x35, 0xc6, 0x7c, 0xab, 0x60, 0x14,
-+ 0x55, 0x1a, 0x8e, 0xc5, 0x88, 0x5d, 0xd5, 0x81,
-+ 0xc2, 0x81, 0xa5, 0xc4, 0x60, 0xdb, 0xaf, 0x77,
-+ 0x91, 0xe1, 0xce, 0xa2, 0x7e, 0x7f, 0x42, 0xe3,
-+ 0xb0, 0x13, 0x1c, 0x1f, 0x25, 0x60, 0x21, 0xe2,
-+ 0x40, 0x5f, 0x99, 0xb7, 0x73, 0xec, 0x9b, 0x2b,
-+ 0xf0, 0x65, 0x11, 0xc8, 0xd0, 0x0a, 0x9f, 0xd3
-+};
-+static const u8 dec_assoc007[] __initconst = { };
-+static const u8 dec_nonce007[] __initconst = {
-+ 0xde, 0x7b, 0xef, 0xc3, 0x65, 0x1b, 0x68, 0xb0
-+};
-+static const u8 dec_key007[] __initconst = {
-+ 0x8d, 0xb8, 0x91, 0x48, 0xf0, 0xe7, 0x0a, 0xbd,
-+ 0xf9, 0x3f, 0xcd, 0xd9, 0xa0, 0x1e, 0x42, 0x4c,
-+ 0xe7, 0xde, 0x25, 0x3d, 0xa3, 0xd7, 0x05, 0x80,
-+ 0x8d, 0xf2, 0x82, 0xac, 0x44, 0x16, 0x51, 0x01
-+};
-+
-+static const u8 dec_input008[] __initconst = {
-+ 0x14, 0xf6, 0x41, 0x37, 0xa6, 0xd4, 0x27, 0xcd,
-+ 0xdb, 0x06, 0x3e, 0x9a, 0x4e, 0xab, 0xd5, 0xb1,
-+ 0x1e, 0x6b, 0xd2, 0xbc, 0x11, 0xf4, 0x28, 0x93,
-+ 0x63, 0x54, 0xef, 0xbb, 0x5e, 0x1d, 0x3a, 0x1d,
-+ 0x37, 0x3c, 0x0a, 0x6c, 0x1e, 0xc2, 0xd1, 0x2c,
-+ 0xb5, 0xa3, 0xb5, 0x7b, 0xb8, 0x8f, 0x25, 0xa6,
-+ 0x1b, 0x61, 0x1c, 0xec, 0x28, 0x58, 0x26, 0xa4,
-+ 0xa8, 0x33, 0x28, 0x25, 0x5c, 0x45, 0x05, 0xe5,
-+ 0x6c, 0x99, 0xe5, 0x45, 0xc4, 0xa2, 0x03, 0x84,
-+ 0x03, 0x73, 0x1e, 0x8c, 0x49, 0xac, 0x20, 0xdd,
-+ 0x8d, 0xb3, 0xc4, 0xf5, 0xe7, 0x4f, 0xf1, 0xed,
-+ 0xa1, 0x98, 0xde, 0xa4, 0x96, 0xdd, 0x2f, 0xab,
-+ 0xab, 0x97, 0xcf, 0x3e, 0xd2, 0x9e, 0xb8, 0x13,
-+ 0x07, 0x28, 0x29, 0x19, 0xaf, 0xfd, 0xf2, 0x49,
-+ 0x43, 0xea, 0x49, 0x26, 0x91, 0xc1, 0x07, 0xd6,
-+ 0xbb, 0x81, 0x75, 0x35, 0x0d, 0x24, 0x7f, 0xc8,
-+ 0xda, 0xd4, 0xb7, 0xeb, 0xe8, 0x5c, 0x09, 0xa2,
-+ 0x2f, 0xdc, 0x28, 0x7d, 0x3a, 0x03, 0xfa, 0x94,
-+ 0xb5, 0x1d, 0x17, 0x99, 0x36, 0xc3, 0x1c, 0x18,
-+ 0x34, 0xe3, 0x9f, 0xf5, 0x55, 0x7c, 0xb0, 0x60,
-+ 0x9d, 0xff, 0xac, 0xd4, 0x61, 0xf2, 0xad, 0xf8,
-+ 0xce, 0xc7, 0xbe, 0x5c, 0xd2, 0x95, 0xa8, 0x4b,
-+ 0x77, 0x13, 0x19, 0x59, 0x26, 0xc9, 0xb7, 0x8f,
-+ 0x6a, 0xcb, 0x2d, 0x37, 0x91, 0xea, 0x92, 0x9c,
-+ 0x94, 0x5b, 0xda, 0x0b, 0xce, 0xfe, 0x30, 0x20,
-+ 0xf8, 0x51, 0xad, 0xf2, 0xbe, 0xe7, 0xc7, 0xff,
-+ 0xb3, 0x33, 0x91, 0x6a, 0xc9, 0x1a, 0x41, 0xc9,
-+ 0x0f, 0xf3, 0x10, 0x0e, 0xfd, 0x53, 0xff, 0x6c,
-+ 0x16, 0x52, 0xd9, 0xf3, 0xf7, 0x98, 0x2e, 0xc9,
-+ 0x07, 0x31, 0x2c, 0x0c, 0x72, 0xd7, 0xc5, 0xc6,
-+ 0x08, 0x2a, 0x7b, 0xda, 0xbd, 0x7e, 0x02, 0xea,
-+ 0x1a, 0xbb, 0xf2, 0x04, 0x27, 0x61, 0x28, 0x8e,
-+ 0xf5, 0x04, 0x03, 0x1f, 0x4c, 0x07, 0x55, 0x82,
-+ 0xec, 0x1e, 0xd7, 0x8b, 0x2f, 0x65, 0x56, 0xd1,
-+ 0xd9, 0x1e, 0x3c, 0xe9, 0x1f, 0x5e, 0x98, 0x70,
-+ 0x38, 0x4a, 0x8c, 0x49, 0xc5, 0x43, 0xa0, 0xa1,
-+ 0x8b, 0x74, 0x9d, 0x4c, 0x62, 0x0d, 0x10, 0x0c,
-+ 0xf4, 0x6c, 0x8f, 0xe0, 0xaa, 0x9a, 0x8d, 0xb7,
-+ 0xe0, 0xbe, 0x4c, 0x87, 0xf1, 0x98, 0x2f, 0xcc,
-+ 0xed, 0xc0, 0x52, 0x29, 0xdc, 0x83, 0xf8, 0xfc,
-+ 0x2c, 0x0e, 0xa8, 0x51, 0x4d, 0x80, 0x0d, 0xa3,
-+ 0xfe, 0xd8, 0x37, 0xe7, 0x41, 0x24, 0xfc, 0xfb,
-+ 0x75, 0xe3, 0x71, 0x7b, 0x57, 0x45, 0xf5, 0x97,
-+ 0x73, 0x65, 0x63, 0x14, 0x74, 0xb8, 0x82, 0x9f,
-+ 0xf8, 0x60, 0x2f, 0x8a, 0xf2, 0x4e, 0xf1, 0x39,
-+ 0xda, 0x33, 0x91, 0xf8, 0x36, 0xe0, 0x8d, 0x3f,
-+ 0x1f, 0x3b, 0x56, 0xdc, 0xa0, 0x8f, 0x3c, 0x9d,
-+ 0x71, 0x52, 0xa7, 0xb8, 0xc0, 0xa5, 0xc6, 0xa2,
-+ 0x73, 0xda, 0xf4, 0x4b, 0x74, 0x5b, 0x00, 0x3d,
-+ 0x99, 0xd7, 0x96, 0xba, 0xe6, 0xe1, 0xa6, 0x96,
-+ 0x38, 0xad, 0xb3, 0xc0, 0xd2, 0xba, 0x91, 0x6b,
-+ 0xf9, 0x19, 0xdd, 0x3b, 0xbe, 0xbe, 0x9c, 0x20,
-+ 0x50, 0xba, 0xa1, 0xd0, 0xce, 0x11, 0xbd, 0x95,
-+ 0xd8, 0xd1, 0xdd, 0x33, 0x85, 0x74, 0xdc, 0xdb,
-+ 0x66, 0x76, 0x44, 0xdc, 0x03, 0x74, 0x48, 0x35,
-+ 0x98, 0xb1, 0x18, 0x47, 0x94, 0x7d, 0xff, 0x62,
-+ 0xe4, 0x58, 0x78, 0xab, 0xed, 0x95, 0x36, 0xd9,
-+ 0x84, 0x91, 0x82, 0x64, 0x41, 0xbb, 0x58, 0xe6,
-+ 0x1c, 0x20, 0x6d, 0x15, 0x6b, 0x13, 0x96, 0xe8,
-+ 0x35, 0x7f, 0xdc, 0x40, 0x2c, 0xe9, 0xbc, 0x8a,
-+ 0x4f, 0x92, 0xec, 0x06, 0x2d, 0x50, 0xdf, 0x93,
-+ 0x5d, 0x65, 0x5a, 0xa8, 0xfc, 0x20, 0x50, 0x14,
-+ 0xa9, 0x8a, 0x7e, 0x1d, 0x08, 0x1f, 0xe2, 0x99,
-+ 0xd0, 0xbe, 0xfb, 0x3a, 0x21, 0x9d, 0xad, 0x86,
-+ 0x54, 0xfd, 0x0d, 0x98, 0x1c, 0x5a, 0x6f, 0x1f,
-+ 0x9a, 0x40, 0xcd, 0xa2, 0xff, 0x6a, 0xf1, 0x54
-+};
-+static const u8 dec_output008[] __initconst = {
-+ 0xc3, 0x09, 0x94, 0x62, 0xe6, 0x46, 0x2e, 0x10,
-+ 0xbe, 0x00, 0xe4, 0xfc, 0xf3, 0x40, 0xa3, 0xe2,
-+ 0x0f, 0xc2, 0x8b, 0x28, 0xdc, 0xba, 0xb4, 0x3c,
-+ 0xe4, 0x21, 0x58, 0x61, 0xcd, 0x8b, 0xcd, 0xfb,
-+ 0xac, 0x94, 0xa1, 0x45, 0xf5, 0x1c, 0xe1, 0x12,
-+ 0xe0, 0x3b, 0x67, 0x21, 0x54, 0x5e, 0x8c, 0xaa,
-+ 0xcf, 0xdb, 0xb4, 0x51, 0xd4, 0x13, 0xda, 0xe6,
-+ 0x83, 0x89, 0xb6, 0x92, 0xe9, 0x21, 0x76, 0xa4,
-+ 0x93, 0x7d, 0x0e, 0xfd, 0x96, 0x36, 0x03, 0x91,
-+ 0x43, 0x5c, 0x92, 0x49, 0x62, 0x61, 0x7b, 0xeb,
-+ 0x43, 0x89, 0xb8, 0x12, 0x20, 0x43, 0xd4, 0x47,
-+ 0x06, 0x84, 0xee, 0x47, 0xe9, 0x8a, 0x73, 0x15,
-+ 0x0f, 0x72, 0xcf, 0xed, 0xce, 0x96, 0xb2, 0x7f,
-+ 0x21, 0x45, 0x76, 0xeb, 0x26, 0x28, 0x83, 0x6a,
-+ 0xad, 0xaa, 0xa6, 0x81, 0xd8, 0x55, 0xb1, 0xa3,
-+ 0x85, 0xb3, 0x0c, 0xdf, 0xf1, 0x69, 0x2d, 0x97,
-+ 0x05, 0x2a, 0xbc, 0x7c, 0x7b, 0x25, 0xf8, 0x80,
-+ 0x9d, 0x39, 0x25, 0xf3, 0x62, 0xf0, 0x66, 0x5e,
-+ 0xf4, 0xa0, 0xcf, 0xd8, 0xfd, 0x4f, 0xb1, 0x1f,
-+ 0x60, 0x3a, 0x08, 0x47, 0xaf, 0xe1, 0xf6, 0x10,
-+ 0x77, 0x09, 0xa7, 0x27, 0x8f, 0x9a, 0x97, 0x5a,
-+ 0x26, 0xfa, 0xfe, 0x41, 0x32, 0x83, 0x10, 0xe0,
-+ 0x1d, 0xbf, 0x64, 0x0d, 0xf4, 0x1c, 0x32, 0x35,
-+ 0xe5, 0x1b, 0x36, 0xef, 0xd4, 0x4a, 0x93, 0x4d,
-+ 0x00, 0x7c, 0xec, 0x02, 0x07, 0x8b, 0x5d, 0x7d,
-+ 0x1b, 0x0e, 0xd1, 0xa6, 0xa5, 0x5d, 0x7d, 0x57,
-+ 0x88, 0xa8, 0xcc, 0x81, 0xb4, 0x86, 0x4e, 0xb4,
-+ 0x40, 0xe9, 0x1d, 0xc3, 0xb1, 0x24, 0x3e, 0x7f,
-+ 0xcc, 0x8a, 0x24, 0x9b, 0xdf, 0x6d, 0xf0, 0x39,
-+ 0x69, 0x3e, 0x4c, 0xc0, 0x96, 0xe4, 0x13, 0xda,
-+ 0x90, 0xda, 0xf4, 0x95, 0x66, 0x8b, 0x17, 0x17,
-+ 0xfe, 0x39, 0x43, 0x25, 0xaa, 0xda, 0xa0, 0x43,
-+ 0x3c, 0xb1, 0x41, 0x02, 0xa3, 0xf0, 0xa7, 0x19,
-+ 0x59, 0xbc, 0x1d, 0x7d, 0x6c, 0x6d, 0x91, 0x09,
-+ 0x5c, 0xb7, 0x5b, 0x01, 0xd1, 0x6f, 0x17, 0x21,
-+ 0x97, 0xbf, 0x89, 0x71, 0xa5, 0xb0, 0x6e, 0x07,
-+ 0x45, 0xfd, 0x9d, 0xea, 0x07, 0xf6, 0x7a, 0x9f,
-+ 0x10, 0x18, 0x22, 0x30, 0x73, 0xac, 0xd4, 0x6b,
-+ 0x72, 0x44, 0xed, 0xd9, 0x19, 0x9b, 0x2d, 0x4a,
-+ 0x41, 0xdd, 0xd1, 0x85, 0x5e, 0x37, 0x19, 0xed,
-+ 0xd2, 0x15, 0x8f, 0x5e, 0x91, 0xdb, 0x33, 0xf2,
-+ 0xe4, 0xdb, 0xff, 0x98, 0xfb, 0xa3, 0xb5, 0xca,
-+ 0x21, 0x69, 0x08, 0xe7, 0x8a, 0xdf, 0x90, 0xff,
-+ 0x3e, 0xe9, 0x20, 0x86, 0x3c, 0xe9, 0xfc, 0x0b,
-+ 0xfe, 0x5c, 0x61, 0xaa, 0x13, 0x92, 0x7f, 0x7b,
-+ 0xec, 0xe0, 0x6d, 0xa8, 0x23, 0x22, 0xf6, 0x6b,
-+ 0x77, 0xc4, 0xfe, 0x40, 0x07, 0x3b, 0xb6, 0xf6,
-+ 0x8e, 0x5f, 0xd4, 0xb9, 0xb7, 0x0f, 0x21, 0x04,
-+ 0xef, 0x83, 0x63, 0x91, 0x69, 0x40, 0xa3, 0x48,
-+ 0x5c, 0xd2, 0x60, 0xf9, 0x4f, 0x6c, 0x47, 0x8b,
-+ 0x3b, 0xb1, 0x9f, 0x8e, 0xee, 0x16, 0x8a, 0x13,
-+ 0xfc, 0x46, 0x17, 0xc3, 0xc3, 0x32, 0x56, 0xf8,
-+ 0x3c, 0x85, 0x3a, 0xb6, 0x3e, 0xaa, 0x89, 0x4f,
-+ 0xb3, 0xdf, 0x38, 0xfd, 0xf1, 0xe4, 0x3a, 0xc0,
-+ 0xe6, 0x58, 0xb5, 0x8f, 0xc5, 0x29, 0xa2, 0x92,
-+ 0x4a, 0xb6, 0xa0, 0x34, 0x7f, 0xab, 0xb5, 0x8a,
-+ 0x90, 0xa1, 0xdb, 0x4d, 0xca, 0xb6, 0x2c, 0x41,
-+ 0x3c, 0xf7, 0x2b, 0x21, 0xc3, 0xfd, 0xf4, 0x17,
-+ 0x5c, 0xb5, 0x33, 0x17, 0x68, 0x2b, 0x08, 0x30,
-+ 0xf3, 0xf7, 0x30, 0x3c, 0x96, 0xe6, 0x6a, 0x20,
-+ 0x97, 0xe7, 0x4d, 0x10, 0x5f, 0x47, 0x5f, 0x49,
-+ 0x96, 0x09, 0xf0, 0x27, 0x91, 0xc8, 0xf8, 0x5a,
-+ 0x2e, 0x79, 0xb5, 0xe2, 0xb8, 0xe8, 0xb9, 0x7b,
-+ 0xd5, 0x10, 0xcb, 0xff, 0x5d, 0x14, 0x73, 0xf3
-+};
-+static const u8 dec_assoc008[] __initconst = { };
-+static const u8 dec_nonce008[] __initconst = {
-+ 0x0e, 0x0d, 0x57, 0xbb, 0x7b, 0x40, 0x54, 0x02
-+};
-+static const u8 dec_key008[] __initconst = {
-+ 0xf2, 0xaa, 0x4f, 0x99, 0xfd, 0x3e, 0xa8, 0x53,
-+ 0xc1, 0x44, 0xe9, 0x81, 0x18, 0xdc, 0xf5, 0xf0,
-+ 0x3e, 0x44, 0x15, 0x59, 0xe0, 0xc5, 0x44, 0x86,
-+ 0xc3, 0x91, 0xa8, 0x75, 0xc0, 0x12, 0x46, 0xba
-+};
-+
-+static const u8 dec_input009[] __initconst = {
-+ 0xfd, 0x81, 0x8d, 0xd0, 0x3d, 0xb4, 0xd5, 0xdf,
-+ 0xd3, 0x42, 0x47, 0x5a, 0x6d, 0x19, 0x27, 0x66,
-+ 0x4b, 0x2e, 0x0c, 0x27, 0x9c, 0x96, 0x4c, 0x72,
-+ 0x02, 0xa3, 0x65, 0xc3, 0xb3, 0x6f, 0x2e, 0xbd,
-+ 0x63, 0x8a, 0x4a, 0x5d, 0x29, 0xa2, 0xd0, 0x28,
-+ 0x48, 0xc5, 0x3d, 0x98, 0xa3, 0xbc, 0xe0, 0xbe,
-+ 0x3b, 0x3f, 0xe6, 0x8a, 0xa4, 0x7f, 0x53, 0x06,
-+ 0xfa, 0x7f, 0x27, 0x76, 0x72, 0x31, 0xa1, 0xf5,
-+ 0xd6, 0x0c, 0x52, 0x47, 0xba, 0xcd, 0x4f, 0xd7,
-+ 0xeb, 0x05, 0x48, 0x0d, 0x7c, 0x35, 0x4a, 0x09,
-+ 0xc9, 0x76, 0x71, 0x02, 0xa3, 0xfb, 0xb7, 0x1a,
-+ 0x65, 0xb7, 0xed, 0x98, 0xc6, 0x30, 0x8a, 0x00,
-+ 0xae, 0xa1, 0x31, 0xe5, 0xb5, 0x9e, 0x6d, 0x62,
-+ 0xda, 0xda, 0x07, 0x0f, 0x38, 0x38, 0xd3, 0xcb,
-+ 0xc1, 0xb0, 0xad, 0xec, 0x72, 0xec, 0xb1, 0xa2,
-+ 0x7b, 0x59, 0xf3, 0x3d, 0x2b, 0xef, 0xcd, 0x28,
-+ 0x5b, 0x83, 0xcc, 0x18, 0x91, 0x88, 0xb0, 0x2e,
-+ 0xf9, 0x29, 0x31, 0x18, 0xf9, 0x4e, 0xe9, 0x0a,
-+ 0x91, 0x92, 0x9f, 0xae, 0x2d, 0xad, 0xf4, 0xe6,
-+ 0x1a, 0xe2, 0xa4, 0xee, 0x47, 0x15, 0xbf, 0x83,
-+ 0x6e, 0xd7, 0x72, 0x12, 0x3b, 0x2d, 0x24, 0xe9,
-+ 0xb2, 0x55, 0xcb, 0x3c, 0x10, 0xf0, 0x24, 0x8a,
-+ 0x4a, 0x02, 0xea, 0x90, 0x25, 0xf0, 0xb4, 0x79,
-+ 0x3a, 0xef, 0x6e, 0xf5, 0x52, 0xdf, 0xb0, 0x0a,
-+ 0xcd, 0x24, 0x1c, 0xd3, 0x2e, 0x22, 0x74, 0xea,
-+ 0x21, 0x6f, 0xe9, 0xbd, 0xc8, 0x3e, 0x36, 0x5b,
-+ 0x19, 0xf1, 0xca, 0x99, 0x0a, 0xb4, 0xa7, 0x52,
-+ 0x1a, 0x4e, 0xf2, 0xad, 0x8d, 0x56, 0x85, 0xbb,
-+ 0x64, 0x89, 0xba, 0x26, 0xf9, 0xc7, 0xe1, 0x89,
-+ 0x19, 0x22, 0x77, 0xc3, 0xa8, 0xfc, 0xff, 0xad,
-+ 0xfe, 0xb9, 0x48, 0xae, 0x12, 0x30, 0x9f, 0x19,
-+ 0xfb, 0x1b, 0xef, 0x14, 0x87, 0x8a, 0x78, 0x71,
-+ 0xf3, 0xf4, 0xb7, 0x00, 0x9c, 0x1d, 0xb5, 0x3d,
-+ 0x49, 0x00, 0x0c, 0x06, 0xd4, 0x50, 0xf9, 0x54,
-+ 0x45, 0xb2, 0x5b, 0x43, 0xdb, 0x6d, 0xcf, 0x1a,
-+ 0xe9, 0x7a, 0x7a, 0xcf, 0xfc, 0x8a, 0x4e, 0x4d,
-+ 0x0b, 0x07, 0x63, 0x28, 0xd8, 0xe7, 0x08, 0x95,
-+ 0xdf, 0xa6, 0x72, 0x93, 0x2e, 0xbb, 0xa0, 0x42,
-+ 0x89, 0x16, 0xf1, 0xd9, 0x0c, 0xf9, 0xa1, 0x16,
-+ 0xfd, 0xd9, 0x03, 0xb4, 0x3b, 0x8a, 0xf5, 0xf6,
-+ 0xe7, 0x6b, 0x2e, 0x8e, 0x4c, 0x3d, 0xe2, 0xaf,
-+ 0x08, 0x45, 0x03, 0xff, 0x09, 0xb6, 0xeb, 0x2d,
-+ 0xc6, 0x1b, 0x88, 0x94, 0xac, 0x3e, 0xf1, 0x9f,
-+ 0x0e, 0x0e, 0x2b, 0xd5, 0x00, 0x4d, 0x3f, 0x3b,
-+ 0x53, 0xae, 0xaf, 0x1c, 0x33, 0x5f, 0x55, 0x6e,
-+ 0x8d, 0xaf, 0x05, 0x7a, 0x10, 0x34, 0xc9, 0xf4,
-+ 0x66, 0xcb, 0x62, 0x12, 0xa6, 0xee, 0xe8, 0x1c,
-+ 0x5d, 0x12, 0x86, 0xdb, 0x6f, 0x1c, 0x33, 0xc4,
-+ 0x1c, 0xda, 0x82, 0x2d, 0x3b, 0x59, 0xfe, 0xb1,
-+ 0xa4, 0x59, 0x41, 0x86, 0xd0, 0xef, 0xae, 0xfb,
-+ 0xda, 0x6d, 0x11, 0xb8, 0xca, 0xe9, 0x6e, 0xff,
-+ 0xf7, 0xa9, 0xd9, 0x70, 0x30, 0xfc, 0x53, 0xe2,
-+ 0xd7, 0xa2, 0x4e, 0xc7, 0x91, 0xd9, 0x07, 0x06,
-+ 0xaa, 0xdd, 0xb0, 0x59, 0x28, 0x1d, 0x00, 0x66,
-+ 0xc5, 0x54, 0xc2, 0xfc, 0x06, 0xda, 0x05, 0x90,
-+ 0x52, 0x1d, 0x37, 0x66, 0xee, 0xf0, 0xb2, 0x55,
-+ 0x8a, 0x5d, 0xd2, 0x38, 0x86, 0x94, 0x9b, 0xfc,
-+ 0x10, 0x4c, 0xa1, 0xb9, 0x64, 0x3e, 0x44, 0xb8,
-+ 0x5f, 0xb0, 0x0c, 0xec, 0xe0, 0xc9, 0xe5, 0x62,
-+ 0x75, 0x3f, 0x09, 0xd5, 0xf5, 0xd9, 0x26, 0xba,
-+ 0x9e, 0xd2, 0xf4, 0xb9, 0x48, 0x0a, 0xbc, 0xa2,
-+ 0xd6, 0x7c, 0x36, 0x11, 0x7d, 0x26, 0x81, 0x89,
-+ 0xcf, 0xa4, 0xad, 0x73, 0x0e, 0xee, 0xcc, 0x06,
-+ 0xa9, 0xdb, 0xb1, 0xfd, 0xfb, 0x09, 0x7f, 0x90,
-+ 0x42, 0x37, 0x2f, 0xe1, 0x9c, 0x0f, 0x6f, 0xcf,
-+ 0x43, 0xb5, 0xd9, 0x90, 0xe1, 0x85, 0xf5, 0xa8,
-+ 0xae
-+};
-+static const u8 dec_output009[] __initconst = {
-+ 0xe6, 0xc3, 0xdb, 0x63, 0x55, 0x15, 0xe3, 0x5b,
-+ 0xb7, 0x4b, 0x27, 0x8b, 0x5a, 0xdd, 0xc2, 0xe8,
-+ 0x3a, 0x6b, 0xd7, 0x81, 0x96, 0x35, 0x97, 0xca,
-+ 0xd7, 0x68, 0xe8, 0xef, 0xce, 0xab, 0xda, 0x09,
-+ 0x6e, 0xd6, 0x8e, 0xcb, 0x55, 0xb5, 0xe1, 0xe5,
-+ 0x57, 0xfd, 0xc4, 0xe3, 0xe0, 0x18, 0x4f, 0x85,
-+ 0xf5, 0x3f, 0x7e, 0x4b, 0x88, 0xc9, 0x52, 0x44,
-+ 0x0f, 0xea, 0xaf, 0x1f, 0x71, 0x48, 0x9f, 0x97,
-+ 0x6d, 0xb9, 0x6f, 0x00, 0xa6, 0xde, 0x2b, 0x77,
-+ 0x8b, 0x15, 0xad, 0x10, 0xa0, 0x2b, 0x7b, 0x41,
-+ 0x90, 0x03, 0x2d, 0x69, 0xae, 0xcc, 0x77, 0x7c,
-+ 0xa5, 0x9d, 0x29, 0x22, 0xc2, 0xea, 0xb4, 0x00,
-+ 0x1a, 0xd2, 0x7a, 0x98, 0x8a, 0xf9, 0xf7, 0x82,
-+ 0xb0, 0xab, 0xd8, 0xa6, 0x94, 0x8d, 0x58, 0x2f,
-+ 0x01, 0x9e, 0x00, 0x20, 0xfc, 0x49, 0xdc, 0x0e,
-+ 0x03, 0xe8, 0x45, 0x10, 0xd6, 0xa8, 0xda, 0x55,
-+ 0x10, 0x9a, 0xdf, 0x67, 0x22, 0x8b, 0x43, 0xab,
-+ 0x00, 0xbb, 0x02, 0xc8, 0xdd, 0x7b, 0x97, 0x17,
-+ 0xd7, 0x1d, 0x9e, 0x02, 0x5e, 0x48, 0xde, 0x8e,
-+ 0xcf, 0x99, 0x07, 0x95, 0x92, 0x3c, 0x5f, 0x9f,
-+ 0xc5, 0x8a, 0xc0, 0x23, 0xaa, 0xd5, 0x8c, 0x82,
-+ 0x6e, 0x16, 0x92, 0xb1, 0x12, 0x17, 0x07, 0xc3,
-+ 0xfb, 0x36, 0xf5, 0x6c, 0x35, 0xd6, 0x06, 0x1f,
-+ 0x9f, 0xa7, 0x94, 0xa2, 0x38, 0x63, 0x9c, 0xb0,
-+ 0x71, 0xb3, 0xa5, 0xd2, 0xd8, 0xba, 0x9f, 0x08,
-+ 0x01, 0xb3, 0xff, 0x04, 0x97, 0x73, 0x45, 0x1b,
-+ 0xd5, 0xa9, 0x9c, 0x80, 0xaf, 0x04, 0x9a, 0x85,
-+ 0xdb, 0x32, 0x5b, 0x5d, 0x1a, 0xc1, 0x36, 0x28,
-+ 0x10, 0x79, 0xf1, 0x3c, 0xbf, 0x1a, 0x41, 0x5c,
-+ 0x4e, 0xdf, 0xb2, 0x7c, 0x79, 0x3b, 0x7a, 0x62,
-+ 0x3d, 0x4b, 0xc9, 0x9b, 0x2a, 0x2e, 0x7c, 0xa2,
-+ 0xb1, 0x11, 0x98, 0xa7, 0x34, 0x1a, 0x00, 0xf3,
-+ 0xd1, 0xbc, 0x18, 0x22, 0xba, 0x02, 0x56, 0x62,
-+ 0x31, 0x10, 0x11, 0x6d, 0xe0, 0x54, 0x9d, 0x40,
-+ 0x1f, 0x26, 0x80, 0x41, 0xca, 0x3f, 0x68, 0x0f,
-+ 0x32, 0x1d, 0x0a, 0x8e, 0x79, 0xd8, 0xa4, 0x1b,
-+ 0x29, 0x1c, 0x90, 0x8e, 0xc5, 0xe3, 0xb4, 0x91,
-+ 0x37, 0x9a, 0x97, 0x86, 0x99, 0xd5, 0x09, 0xc5,
-+ 0xbb, 0xa3, 0x3f, 0x21, 0x29, 0x82, 0x14, 0x5c,
-+ 0xab, 0x25, 0xfb, 0xf2, 0x4f, 0x58, 0x26, 0xd4,
-+ 0x83, 0xaa, 0x66, 0x89, 0x67, 0x7e, 0xc0, 0x49,
-+ 0xe1, 0x11, 0x10, 0x7f, 0x7a, 0xda, 0x29, 0x04,
-+ 0xff, 0xf0, 0xcb, 0x09, 0x7c, 0x9d, 0xfa, 0x03,
-+ 0x6f, 0x81, 0x09, 0x31, 0x60, 0xfb, 0x08, 0xfa,
-+ 0x74, 0xd3, 0x64, 0x44, 0x7c, 0x55, 0x85, 0xec,
-+ 0x9c, 0x6e, 0x25, 0xb7, 0x6c, 0xc5, 0x37, 0xb6,
-+ 0x83, 0x87, 0x72, 0x95, 0x8b, 0x9d, 0xe1, 0x69,
-+ 0x5c, 0x31, 0x95, 0x42, 0xa6, 0x2c, 0xd1, 0x36,
-+ 0x47, 0x1f, 0xec, 0x54, 0xab, 0xa2, 0x1c, 0xd8,
-+ 0x00, 0xcc, 0xbc, 0x0d, 0x65, 0xe2, 0x67, 0xbf,
-+ 0xbc, 0xea, 0xee, 0x9e, 0xe4, 0x36, 0x95, 0xbe,
-+ 0x73, 0xd9, 0xa6, 0xd9, 0x0f, 0xa0, 0xcc, 0x82,
-+ 0x76, 0x26, 0xad, 0x5b, 0x58, 0x6c, 0x4e, 0xab,
-+ 0x29, 0x64, 0xd3, 0xd9, 0xa9, 0x08, 0x8c, 0x1d,
-+ 0xa1, 0x4f, 0x80, 0xd8, 0x3f, 0x94, 0xfb, 0xd3,
-+ 0x7b, 0xfc, 0xd1, 0x2b, 0xc3, 0x21, 0xeb, 0xe5,
-+ 0x1c, 0x84, 0x23, 0x7f, 0x4b, 0xfa, 0xdb, 0x34,
-+ 0x18, 0xa2, 0xc2, 0xe5, 0x13, 0xfe, 0x6c, 0x49,
-+ 0x81, 0xd2, 0x73, 0xe7, 0xe2, 0xd7, 0xe4, 0x4f,
-+ 0x4b, 0x08, 0x6e, 0xb1, 0x12, 0x22, 0x10, 0x9d,
-+ 0xac, 0x51, 0x1e, 0x17, 0xd9, 0x8a, 0x0b, 0x42,
-+ 0x88, 0x16, 0x81, 0x37, 0x7c, 0x6a, 0xf7, 0xef,
-+ 0x2d, 0xe3, 0xd9, 0xf8, 0x5f, 0xe0, 0x53, 0x27,
-+ 0x74, 0xb9, 0xe2, 0xd6, 0x1c, 0x80, 0x2c, 0x52,
-+ 0x65
-+};
-+static const u8 dec_assoc009[] __initconst = {
-+ 0x5a, 0x27, 0xff, 0xeb, 0xdf, 0x84, 0xb2, 0x9e,
-+ 0xef
-+};
-+static const u8 dec_nonce009[] __initconst = {
-+ 0xef, 0x2d, 0x63, 0xee, 0x6b, 0x80, 0x8b, 0x78
-+};
-+static const u8 dec_key009[] __initconst = {
-+ 0xea, 0xbc, 0x56, 0x99, 0xe3, 0x50, 0xff, 0xc5,
-+ 0xcc, 0x1a, 0xd7, 0xc1, 0x57, 0x72, 0xea, 0x86,
-+ 0x5b, 0x89, 0x88, 0x61, 0x3d, 0x2f, 0x9b, 0xb2,
-+ 0xe7, 0x9c, 0xec, 0x74, 0x6e, 0x3e, 0xf4, 0x3b
-+};
-+
-+static const u8 dec_input010[] __initconst = {
-+ 0xe5, 0x26, 0xa4, 0x3d, 0xbd, 0x33, 0xd0, 0x4b,
-+ 0x6f, 0x05, 0xa7, 0x6e, 0x12, 0x7a, 0xd2, 0x74,
-+ 0xa6, 0xdd, 0xbd, 0x95, 0xeb, 0xf9, 0xa4, 0xf1,
-+ 0x59, 0x93, 0x91, 0x70, 0xd9, 0xfe, 0x9a, 0xcd,
-+ 0x53, 0x1f, 0x3a, 0xab, 0xa6, 0x7c, 0x9f, 0xa6,
-+ 0x9e, 0xbd, 0x99, 0xd9, 0xb5, 0x97, 0x44, 0xd5,
-+ 0x14, 0x48, 0x4d, 0x9d, 0xc0, 0xd0, 0x05, 0x96,
-+ 0xeb, 0x4c, 0x78, 0x55, 0x09, 0x08, 0x01, 0x02,
-+ 0x30, 0x90, 0x7b, 0x96, 0x7a, 0x7b, 0x5f, 0x30,
-+ 0x41, 0x24, 0xce, 0x68, 0x61, 0x49, 0x86, 0x57,
-+ 0x82, 0xdd, 0x53, 0x1c, 0x51, 0x28, 0x2b, 0x53,
-+ 0x6e, 0x2d, 0xc2, 0x20, 0x4c, 0xdd, 0x8f, 0x65,
-+ 0x10, 0x20, 0x50, 0xdd, 0x9d, 0x50, 0xe5, 0x71,
-+ 0x40, 0x53, 0x69, 0xfc, 0x77, 0x48, 0x11, 0xb9,
-+ 0xde, 0xa4, 0x8d, 0x58, 0xe4, 0xa6, 0x1a, 0x18,
-+ 0x47, 0x81, 0x7e, 0xfc, 0xdd, 0xf6, 0xef, 0xce,
-+ 0x2f, 0x43, 0x68, 0xd6, 0x06, 0xe2, 0x74, 0x6a,
-+ 0xad, 0x90, 0xf5, 0x37, 0xf3, 0x3d, 0x82, 0x69,
-+ 0x40, 0xe9, 0x6b, 0xa7, 0x3d, 0xa8, 0x1e, 0xd2,
-+ 0x02, 0x7c, 0xb7, 0x9b, 0xe4, 0xda, 0x8f, 0x95,
-+ 0x06, 0xc5, 0xdf, 0x73, 0xa3, 0x20, 0x9a, 0x49,
-+ 0xde, 0x9c, 0xbc, 0xee, 0x14, 0x3f, 0x81, 0x5e,
-+ 0xf8, 0x3b, 0x59, 0x3c, 0xe1, 0x68, 0x12, 0x5a,
-+ 0x3a, 0x76, 0x3a, 0x3f, 0xf7, 0x87, 0x33, 0x0a,
-+ 0x01, 0xb8, 0xd4, 0xed, 0xb6, 0xbe, 0x94, 0x5e,
-+ 0x70, 0x40, 0x56, 0x67, 0x1f, 0x50, 0x44, 0x19,
-+ 0xce, 0x82, 0x70, 0x10, 0x87, 0x13, 0x20, 0x0b,
-+ 0x4c, 0x5a, 0xb6, 0xf6, 0xa7, 0xae, 0x81, 0x75,
-+ 0x01, 0x81, 0xe6, 0x4b, 0x57, 0x7c, 0xdd, 0x6d,
-+ 0xf8, 0x1c, 0x29, 0x32, 0xf7, 0xda, 0x3c, 0x2d,
-+ 0xf8, 0x9b, 0x25, 0x6e, 0x00, 0xb4, 0xf7, 0x2f,
-+ 0xf7, 0x04, 0xf7, 0xa1, 0x56, 0xac, 0x4f, 0x1a,
-+ 0x64, 0xb8, 0x47, 0x55, 0x18, 0x7b, 0x07, 0x4d,
-+ 0xbd, 0x47, 0x24, 0x80, 0x5d, 0xa2, 0x70, 0xc5,
-+ 0xdd, 0x8e, 0x82, 0xd4, 0xeb, 0xec, 0xb2, 0x0c,
-+ 0x39, 0xd2, 0x97, 0xc1, 0xcb, 0xeb, 0xf4, 0x77,
-+ 0x59, 0xb4, 0x87, 0xef, 0xcb, 0x43, 0x2d, 0x46,
-+ 0x54, 0xd1, 0xa7, 0xd7, 0x15, 0x99, 0x0a, 0x43,
-+ 0xa1, 0xe0, 0x99, 0x33, 0x71, 0xc1, 0xed, 0xfe,
-+ 0x72, 0x46, 0x33, 0x8e, 0x91, 0x08, 0x9f, 0xc8,
-+ 0x2e, 0xca, 0xfa, 0xdc, 0x59, 0xd5, 0xc3, 0x76,
-+ 0x84, 0x9f, 0xa3, 0x37, 0x68, 0xc3, 0xf0, 0x47,
-+ 0x2c, 0x68, 0xdb, 0x5e, 0xc3, 0x49, 0x4c, 0xe8,
-+ 0x92, 0x85, 0xe2, 0x23, 0xd3, 0x3f, 0xad, 0x32,
-+ 0xe5, 0x2b, 0x82, 0xd7, 0x8f, 0x99, 0x0a, 0x59,
-+ 0x5c, 0x45, 0xd9, 0xb4, 0x51, 0x52, 0xc2, 0xae,
-+ 0xbf, 0x80, 0xcf, 0xc9, 0xc9, 0x51, 0x24, 0x2a,
-+ 0x3b, 0x3a, 0x4d, 0xae, 0xeb, 0xbd, 0x22, 0xc3,
-+ 0x0e, 0x0f, 0x59, 0x25, 0x92, 0x17, 0xe9, 0x74,
-+ 0xc7, 0x8b, 0x70, 0x70, 0x36, 0x55, 0x95, 0x75,
-+ 0x4b, 0xad, 0x61, 0x2b, 0x09, 0xbc, 0x82, 0xf2,
-+ 0x6e, 0x94, 0x43, 0xae, 0xc3, 0xd5, 0xcd, 0x8e,
-+ 0xfe, 0x5b, 0x9a, 0x88, 0x43, 0x01, 0x75, 0xb2,
-+ 0x23, 0x09, 0xf7, 0x89, 0x83, 0xe7, 0xfa, 0xf9,
-+ 0xb4, 0x9b, 0xf8, 0xef, 0xbd, 0x1c, 0x92, 0xc1,
-+ 0xda, 0x7e, 0xfe, 0x05, 0xba, 0x5a, 0xcd, 0x07,
-+ 0x6a, 0x78, 0x9e, 0x5d, 0xfb, 0x11, 0x2f, 0x79,
-+ 0x38, 0xb6, 0xc2, 0x5b, 0x6b, 0x51, 0xb4, 0x71,
-+ 0xdd, 0xf7, 0x2a, 0xe4, 0xf4, 0x72, 0x76, 0xad,
-+ 0xc2, 0xdd, 0x64, 0x5d, 0x79, 0xb6, 0xf5, 0x7a,
-+ 0x77, 0x20, 0x05, 0x3d, 0x30, 0x06, 0xd4, 0x4c,
-+ 0x0a, 0x2c, 0x98, 0x5a, 0xb9, 0xd4, 0x98, 0xa9,
-+ 0x3f, 0xc6, 0x12, 0xea, 0x3b, 0x4b, 0xc5, 0x79,
-+ 0x64, 0x63, 0x6b, 0x09, 0x54, 0x3b, 0x14, 0x27,
-+ 0xba, 0x99, 0x80, 0xc8, 0x72, 0xa8, 0x12, 0x90,
-+ 0x29, 0xba, 0x40, 0x54, 0x97, 0x2b, 0x7b, 0xfe,
-+ 0xeb, 0xcd, 0x01, 0x05, 0x44, 0x72, 0xdb, 0x99,
-+ 0xe4, 0x61, 0xc9, 0x69, 0xd6, 0xb9, 0x28, 0xd1,
-+ 0x05, 0x3e, 0xf9, 0x0b, 0x49, 0x0a, 0x49, 0xe9,
-+ 0x8d, 0x0e, 0xa7, 0x4a, 0x0f, 0xaf, 0x32, 0xd0,
-+ 0xe0, 0xb2, 0x3a, 0x55, 0x58, 0xfe, 0x5c, 0x28,
-+ 0x70, 0x51, 0x23, 0xb0, 0x7b, 0x6a, 0x5f, 0x1e,
-+ 0xb8, 0x17, 0xd7, 0x94, 0x15, 0x8f, 0xee, 0x20,
-+ 0xc7, 0x42, 0x25, 0x3e, 0x9a, 0x14, 0xd7, 0x60,
-+ 0x72, 0x39, 0x47, 0x48, 0xa9, 0xfe, 0xdd, 0x47,
-+ 0x0a, 0xb1, 0xe6, 0x60, 0x28, 0x8c, 0x11, 0x68,
-+ 0xe1, 0xff, 0xd7, 0xce, 0xc8, 0xbe, 0xb3, 0xfe,
-+ 0x27, 0x30, 0x09, 0x70, 0xd7, 0xfa, 0x02, 0x33,
-+ 0x3a, 0x61, 0x2e, 0xc7, 0xff, 0xa4, 0x2a, 0xa8,
-+ 0x6e, 0xb4, 0x79, 0x35, 0x6d, 0x4c, 0x1e, 0x38,
-+ 0xf8, 0xee, 0xd4, 0x84, 0x4e, 0x6e, 0x28, 0xa7,
-+ 0xce, 0xc8, 0xc1, 0xcf, 0x80, 0x05, 0xf3, 0x04,
-+ 0xef, 0xc8, 0x18, 0x28, 0x2e, 0x8d, 0x5e, 0x0c,
-+ 0xdf, 0xb8, 0x5f, 0x96, 0xe8, 0xc6, 0x9c, 0x2f,
-+ 0xe5, 0xa6, 0x44, 0xd7, 0xe7, 0x99, 0x44, 0x0c,
-+ 0xec, 0xd7, 0x05, 0x60, 0x97, 0xbb, 0x74, 0x77,
-+ 0x58, 0xd5, 0xbb, 0x48, 0xde, 0x5a, 0xb2, 0x54,
-+ 0x7f, 0x0e, 0x46, 0x70, 0x6a, 0x6f, 0x78, 0xa5,
-+ 0x08, 0x89, 0x05, 0x4e, 0x7e, 0xa0, 0x69, 0xb4,
-+ 0x40, 0x60, 0x55, 0x77, 0x75, 0x9b, 0x19, 0xf2,
-+ 0xd5, 0x13, 0x80, 0x77, 0xf9, 0x4b, 0x3f, 0x1e,
-+ 0xee, 0xe6, 0x76, 0x84, 0x7b, 0x8c, 0xe5, 0x27,
-+ 0xa8, 0x0a, 0x91, 0x01, 0x68, 0x71, 0x8a, 0x3f,
-+ 0x06, 0xab, 0xf6, 0xa9, 0xa5, 0xe6, 0x72, 0x92,
-+ 0xe4, 0x67, 0xe2, 0xa2, 0x46, 0x35, 0x84, 0x55,
-+ 0x7d, 0xca, 0xa8, 0x85, 0xd0, 0xf1, 0x3f, 0xbe,
-+ 0xd7, 0x34, 0x64, 0xfc, 0xae, 0xe3, 0xe4, 0x04,
-+ 0x9f, 0x66, 0x02, 0xb9, 0x88, 0x10, 0xd9, 0xc4,
-+ 0x4c, 0x31, 0x43, 0x7a, 0x93, 0xe2, 0x9b, 0x56,
-+ 0x43, 0x84, 0xdc, 0xdc, 0xde, 0x1d, 0xa4, 0x02,
-+ 0x0e, 0xc2, 0xef, 0xc3, 0xf8, 0x78, 0xd1, 0xb2,
-+ 0x6b, 0x63, 0x18, 0xc9, 0xa9, 0xe5, 0x72, 0xd8,
-+ 0xf3, 0xb9, 0xd1, 0x8a, 0xc7, 0x1a, 0x02, 0x27,
-+ 0x20, 0x77, 0x10, 0xe5, 0xc8, 0xd4, 0x4a, 0x47,
-+ 0xe5, 0xdf, 0x5f, 0x01, 0xaa, 0xb0, 0xd4, 0x10,
-+ 0xbb, 0x69, 0xe3, 0x36, 0xc8, 0xe1, 0x3d, 0x43,
-+ 0xfb, 0x86, 0xcd, 0xcc, 0xbf, 0xf4, 0x88, 0xe0,
-+ 0x20, 0xca, 0xb7, 0x1b, 0xf1, 0x2f, 0x5c, 0xee,
-+ 0xd4, 0xd3, 0xa3, 0xcc, 0xa4, 0x1e, 0x1c, 0x47,
-+ 0xfb, 0xbf, 0xfc, 0xa2, 0x41, 0x55, 0x9d, 0xf6,
-+ 0x5a, 0x5e, 0x65, 0x32, 0x34, 0x7b, 0x52, 0x8d,
-+ 0xd5, 0xd0, 0x20, 0x60, 0x03, 0xab, 0x3f, 0x8c,
-+ 0xd4, 0x21, 0xea, 0x2a, 0xd9, 0xc4, 0xd0, 0xd3,
-+ 0x65, 0xd8, 0x7a, 0x13, 0x28, 0x62, 0x32, 0x4b,
-+ 0x2c, 0x87, 0x93, 0xa8, 0xb4, 0x52, 0x45, 0x09,
-+ 0x44, 0xec, 0xec, 0xc3, 0x17, 0xdb, 0x9a, 0x4d,
-+ 0x5c, 0xa9, 0x11, 0xd4, 0x7d, 0xaf, 0x9e, 0xf1,
-+ 0x2d, 0xb2, 0x66, 0xc5, 0x1d, 0xed, 0xb7, 0xcd,
-+ 0x0b, 0x25, 0x5e, 0x30, 0x47, 0x3f, 0x40, 0xf4,
-+ 0xa1, 0xa0, 0x00, 0x94, 0x10, 0xc5, 0x6a, 0x63,
-+ 0x1a, 0xd5, 0x88, 0x92, 0x8e, 0x82, 0x39, 0x87,
-+ 0x3c, 0x78, 0x65, 0x58, 0x42, 0x75, 0x5b, 0xdd,
-+ 0x77, 0x3e, 0x09, 0x4e, 0x76, 0x5b, 0xe6, 0x0e,
-+ 0x4d, 0x38, 0xb2, 0xc0, 0xb8, 0x95, 0x01, 0x7a,
-+ 0x10, 0xe0, 0xfb, 0x07, 0xf2, 0xab, 0x2d, 0x8c,
-+ 0x32, 0xed, 0x2b, 0xc0, 0x46, 0xc2, 0xf5, 0x38,
-+ 0x83, 0xf0, 0x17, 0xec, 0xc1, 0x20, 0x6a, 0x9a,
-+ 0x0b, 0x00, 0xa0, 0x98, 0x22, 0x50, 0x23, 0xd5,
-+ 0x80, 0x6b, 0xf6, 0x1f, 0xc3, 0xcc, 0x97, 0xc9,
-+ 0x24, 0x9f, 0xf3, 0xaf, 0x43, 0x14, 0xd5, 0xa0
-+};
-+static const u8 dec_output010[] __initconst = {
-+ 0x42, 0x93, 0xe4, 0xeb, 0x97, 0xb0, 0x57, 0xbf,
-+ 0x1a, 0x8b, 0x1f, 0xe4, 0x5f, 0x36, 0x20, 0x3c,
-+ 0xef, 0x0a, 0xa9, 0x48, 0x5f, 0x5f, 0x37, 0x22,
-+ 0x3a, 0xde, 0xe3, 0xae, 0xbe, 0xad, 0x07, 0xcc,
-+ 0xb1, 0xf6, 0xf5, 0xf9, 0x56, 0xdd, 0xe7, 0x16,
-+ 0x1e, 0x7f, 0xdf, 0x7a, 0x9e, 0x75, 0xb7, 0xc7,
-+ 0xbe, 0xbe, 0x8a, 0x36, 0x04, 0xc0, 0x10, 0xf4,
-+ 0x95, 0x20, 0x03, 0xec, 0xdc, 0x05, 0xa1, 0x7d,
-+ 0xc4, 0xa9, 0x2c, 0x82, 0xd0, 0xbc, 0x8b, 0xc5,
-+ 0xc7, 0x45, 0x50, 0xf6, 0xa2, 0x1a, 0xb5, 0x46,
-+ 0x3b, 0x73, 0x02, 0xa6, 0x83, 0x4b, 0x73, 0x82,
-+ 0x58, 0x5e, 0x3b, 0x65, 0x2f, 0x0e, 0xfd, 0x2b,
-+ 0x59, 0x16, 0xce, 0xa1, 0x60, 0x9c, 0xe8, 0x3a,
-+ 0x99, 0xed, 0x8d, 0x5a, 0xcf, 0xf6, 0x83, 0xaf,
-+ 0xba, 0xd7, 0x73, 0x73, 0x40, 0x97, 0x3d, 0xca,
-+ 0xef, 0x07, 0x57, 0xe6, 0xd9, 0x70, 0x0e, 0x95,
-+ 0xae, 0xa6, 0x8d, 0x04, 0xcc, 0xee, 0xf7, 0x09,
-+ 0x31, 0x77, 0x12, 0xa3, 0x23, 0x97, 0x62, 0xb3,
-+ 0x7b, 0x32, 0xfb, 0x80, 0x14, 0x48, 0x81, 0xc3,
-+ 0xe5, 0xea, 0x91, 0x39, 0x52, 0x81, 0xa2, 0x4f,
-+ 0xe4, 0xb3, 0x09, 0xff, 0xde, 0x5e, 0xe9, 0x58,
-+ 0x84, 0x6e, 0xf9, 0x3d, 0xdf, 0x25, 0xea, 0xad,
-+ 0xae, 0xe6, 0x9a, 0xd1, 0x89, 0x55, 0xd3, 0xde,
-+ 0x6c, 0x52, 0xdb, 0x70, 0xfe, 0x37, 0xce, 0x44,
-+ 0x0a, 0xa8, 0x25, 0x5f, 0x92, 0xc1, 0x33, 0x4a,
-+ 0x4f, 0x9b, 0x62, 0x35, 0xff, 0xce, 0xc0, 0xa9,
-+ 0x60, 0xce, 0x52, 0x00, 0x97, 0x51, 0x35, 0x26,
-+ 0x2e, 0xb9, 0x36, 0xa9, 0x87, 0x6e, 0x1e, 0xcc,
-+ 0x91, 0x78, 0x53, 0x98, 0x86, 0x5b, 0x9c, 0x74,
-+ 0x7d, 0x88, 0x33, 0xe1, 0xdf, 0x37, 0x69, 0x2b,
-+ 0xbb, 0xf1, 0x4d, 0xf4, 0xd1, 0xf1, 0x39, 0x93,
-+ 0x17, 0x51, 0x19, 0xe3, 0x19, 0x1e, 0x76, 0x37,
-+ 0x25, 0xfb, 0x09, 0x27, 0x6a, 0xab, 0x67, 0x6f,
-+ 0x14, 0x12, 0x64, 0xe7, 0xc4, 0x07, 0xdf, 0x4d,
-+ 0x17, 0xbb, 0x6d, 0xe0, 0xe9, 0xb9, 0xab, 0xca,
-+ 0x10, 0x68, 0xaf, 0x7e, 0xb7, 0x33, 0x54, 0x73,
-+ 0x07, 0x6e, 0xf7, 0x81, 0x97, 0x9c, 0x05, 0x6f,
-+ 0x84, 0x5f, 0xd2, 0x42, 0xfb, 0x38, 0xcf, 0xd1,
-+ 0x2f, 0x14, 0x30, 0x88, 0x98, 0x4d, 0x5a, 0xa9,
-+ 0x76, 0xd5, 0x4f, 0x3e, 0x70, 0x6c, 0x85, 0x76,
-+ 0xd7, 0x01, 0xa0, 0x1a, 0xc8, 0x4e, 0xaa, 0xac,
-+ 0x78, 0xfe, 0x46, 0xde, 0x6a, 0x05, 0x46, 0xa7,
-+ 0x43, 0x0c, 0xb9, 0xde, 0xb9, 0x68, 0xfb, 0xce,
-+ 0x42, 0x99, 0x07, 0x4d, 0x0b, 0x3b, 0x5a, 0x30,
-+ 0x35, 0xa8, 0xf9, 0x3a, 0x73, 0xef, 0x0f, 0xdb,
-+ 0x1e, 0x16, 0x42, 0xc4, 0xba, 0xae, 0x58, 0xaa,
-+ 0xf8, 0xe5, 0x75, 0x2f, 0x1b, 0x15, 0x5c, 0xfd,
-+ 0x0a, 0x97, 0xd0, 0xe4, 0x37, 0x83, 0x61, 0x5f,
-+ 0x43, 0xa6, 0xc7, 0x3f, 0x38, 0x59, 0xe6, 0xeb,
-+ 0xa3, 0x90, 0xc3, 0xaa, 0xaa, 0x5a, 0xd3, 0x34,
-+ 0xd4, 0x17, 0xc8, 0x65, 0x3e, 0x57, 0xbc, 0x5e,
-+ 0xdd, 0x9e, 0xb7, 0xf0, 0x2e, 0x5b, 0xb2, 0x1f,
-+ 0x8a, 0x08, 0x0d, 0x45, 0x91, 0x0b, 0x29, 0x53,
-+ 0x4f, 0x4c, 0x5a, 0x73, 0x56, 0xfe, 0xaf, 0x41,
-+ 0x01, 0x39, 0x0a, 0x24, 0x3c, 0x7e, 0xbe, 0x4e,
-+ 0x53, 0xf3, 0xeb, 0x06, 0x66, 0x51, 0x28, 0x1d,
-+ 0xbd, 0x41, 0x0a, 0x01, 0xab, 0x16, 0x47, 0x27,
-+ 0x47, 0x47, 0xf7, 0xcb, 0x46, 0x0a, 0x70, 0x9e,
-+ 0x01, 0x9c, 0x09, 0xe1, 0x2a, 0x00, 0x1a, 0xd8,
-+ 0xd4, 0x79, 0x9d, 0x80, 0x15, 0x8e, 0x53, 0x2a,
-+ 0x65, 0x83, 0x78, 0x3e, 0x03, 0x00, 0x07, 0x12,
-+ 0x1f, 0x33, 0x3e, 0x7b, 0x13, 0x37, 0xf1, 0xc3,
-+ 0xef, 0xb7, 0xc1, 0x20, 0x3c, 0x3e, 0x67, 0x66,
-+ 0x5d, 0x88, 0xa7, 0x7d, 0x33, 0x50, 0x77, 0xb0,
-+ 0x28, 0x8e, 0xe7, 0x2c, 0x2e, 0x7a, 0xf4, 0x3c,
-+ 0x8d, 0x74, 0x83, 0xaf, 0x8e, 0x87, 0x0f, 0xe4,
-+ 0x50, 0xff, 0x84, 0x5c, 0x47, 0x0c, 0x6a, 0x49,
-+ 0xbf, 0x42, 0x86, 0x77, 0x15, 0x48, 0xa5, 0x90,
-+ 0x5d, 0x93, 0xd6, 0x2a, 0x11, 0xd5, 0xd5, 0x11,
-+ 0xaa, 0xce, 0xe7, 0x6f, 0xa5, 0xb0, 0x09, 0x2c,
-+ 0x8d, 0xd3, 0x92, 0xf0, 0x5a, 0x2a, 0xda, 0x5b,
-+ 0x1e, 0xd5, 0x9a, 0xc4, 0xc4, 0xf3, 0x49, 0x74,
-+ 0x41, 0xca, 0xe8, 0xc1, 0xf8, 0x44, 0xd6, 0x3c,
-+ 0xae, 0x6c, 0x1d, 0x9a, 0x30, 0x04, 0x4d, 0x27,
-+ 0x0e, 0xb1, 0x5f, 0x59, 0xa2, 0x24, 0xe8, 0xe1,
-+ 0x98, 0xc5, 0x6a, 0x4c, 0xfe, 0x41, 0xd2, 0x27,
-+ 0x42, 0x52, 0xe1, 0xe9, 0x7d, 0x62, 0xe4, 0x88,
-+ 0x0f, 0xad, 0xb2, 0x70, 0xcb, 0x9d, 0x4c, 0x27,
-+ 0x2e, 0x76, 0x1e, 0x1a, 0x63, 0x65, 0xf5, 0x3b,
-+ 0xf8, 0x57, 0x69, 0xeb, 0x5b, 0x38, 0x26, 0x39,
-+ 0x33, 0x25, 0x45, 0x3e, 0x91, 0xb8, 0xd8, 0xc7,
-+ 0xd5, 0x42, 0xc0, 0x22, 0x31, 0x74, 0xf4, 0xbc,
-+ 0x0c, 0x23, 0xf1, 0xca, 0xc1, 0x8d, 0xd7, 0xbe,
-+ 0xc9, 0x62, 0xe4, 0x08, 0x1a, 0xcf, 0x36, 0xd5,
-+ 0xfe, 0x55, 0x21, 0x59, 0x91, 0x87, 0x87, 0xdf,
-+ 0x06, 0xdb, 0xdf, 0x96, 0x45, 0x58, 0xda, 0x05,
-+ 0xcd, 0x50, 0x4d, 0xd2, 0x7d, 0x05, 0x18, 0x73,
-+ 0x6a, 0x8d, 0x11, 0x85, 0xa6, 0x88, 0xe8, 0xda,
-+ 0xe6, 0x30, 0x33, 0xa4, 0x89, 0x31, 0x75, 0xbe,
-+ 0x69, 0x43, 0x84, 0x43, 0x50, 0x87, 0xdd, 0x71,
-+ 0x36, 0x83, 0xc3, 0x78, 0x74, 0x24, 0x0a, 0xed,
-+ 0x7b, 0xdb, 0xa4, 0x24, 0x0b, 0xb9, 0x7e, 0x5d,
-+ 0xff, 0xde, 0xb1, 0xef, 0x61, 0x5a, 0x45, 0x33,
-+ 0xf6, 0x17, 0x07, 0x08, 0x98, 0x83, 0x92, 0x0f,
-+ 0x23, 0x6d, 0xe6, 0xaa, 0x17, 0x54, 0xad, 0x6a,
-+ 0xc8, 0xdb, 0x26, 0xbe, 0xb8, 0xb6, 0x08, 0xfa,
-+ 0x68, 0xf1, 0xd7, 0x79, 0x6f, 0x18, 0xb4, 0x9e,
-+ 0x2d, 0x3f, 0x1b, 0x64, 0xaf, 0x8d, 0x06, 0x0e,
-+ 0x49, 0x28, 0xe0, 0x5d, 0x45, 0x68, 0x13, 0x87,
-+ 0xfa, 0xde, 0x40, 0x7b, 0xd2, 0xc3, 0x94, 0xd5,
-+ 0xe1, 0xd9, 0xc2, 0xaf, 0x55, 0x89, 0xeb, 0xb4,
-+ 0x12, 0x59, 0xa8, 0xd4, 0xc5, 0x29, 0x66, 0x38,
-+ 0xe6, 0xac, 0x22, 0x22, 0xd9, 0x64, 0x9b, 0x34,
-+ 0x0a, 0x32, 0x9f, 0xc2, 0xbf, 0x17, 0x6c, 0x3f,
-+ 0x71, 0x7a, 0x38, 0x6b, 0x98, 0xfb, 0x49, 0x36,
-+ 0x89, 0xc9, 0xe2, 0xd6, 0xc7, 0x5d, 0xd0, 0x69,
-+ 0x5f, 0x23, 0x35, 0xc9, 0x30, 0xe2, 0xfd, 0x44,
-+ 0x58, 0x39, 0xd7, 0x97, 0xfb, 0x5c, 0x00, 0xd5,
-+ 0x4f, 0x7a, 0x1a, 0x95, 0x8b, 0x62, 0x4b, 0xce,
-+ 0xe5, 0x91, 0x21, 0x7b, 0x30, 0x00, 0xd6, 0xdd,
-+ 0x6d, 0x02, 0x86, 0x49, 0x0f, 0x3c, 0x1a, 0x27,
-+ 0x3c, 0xd3, 0x0e, 0x71, 0xf2, 0xff, 0xf5, 0x2f,
-+ 0x87, 0xac, 0x67, 0x59, 0x81, 0xa3, 0xf7, 0xf8,
-+ 0xd6, 0x11, 0x0c, 0x84, 0xa9, 0x03, 0xee, 0x2a,
-+ 0xc4, 0xf3, 0x22, 0xab, 0x7c, 0xe2, 0x25, 0xf5,
-+ 0x67, 0xa3, 0xe4, 0x11, 0xe0, 0x59, 0xb3, 0xca,
-+ 0x87, 0xa0, 0xae, 0xc9, 0xa6, 0x62, 0x1b, 0x6e,
-+ 0x4d, 0x02, 0x6b, 0x07, 0x9d, 0xfd, 0xd0, 0x92,
-+ 0x06, 0xe1, 0xb2, 0x9a, 0x4a, 0x1f, 0x1f, 0x13,
-+ 0x49, 0x99, 0x97, 0x08, 0xde, 0x7f, 0x98, 0xaf,
-+ 0x51, 0x98, 0xee, 0x2c, 0xcb, 0xf0, 0x0b, 0xc6,
-+ 0xb6, 0xb7, 0x2d, 0x9a, 0xb1, 0xac, 0xa6, 0xe3,
-+ 0x15, 0x77, 0x9d, 0x6b, 0x1a, 0xe4, 0xfc, 0x8b,
-+ 0xf2, 0x17, 0x59, 0x08, 0x04, 0x58, 0x81, 0x9d,
-+ 0x1b, 0x1b, 0x69, 0x55, 0xc2, 0xb4, 0x3c, 0x1f,
-+ 0x50, 0xf1, 0x7f, 0x77, 0x90, 0x4c, 0x66, 0x40,
-+ 0x5a, 0xc0, 0x33, 0x1f, 0xcb, 0x05, 0x6d, 0x5c,
-+ 0x06, 0x87, 0x52, 0xa2, 0x8f, 0x26, 0xd5, 0x4f
-+};
-+static const u8 dec_assoc010[] __initconst = {
-+ 0xd2, 0xa1, 0x70, 0xdb, 0x7a, 0xf8, 0xfa, 0x27,
-+ 0xba, 0x73, 0x0f, 0xbf, 0x3d, 0x1e, 0x82, 0xb2
-+};
-+static const u8 dec_nonce010[] __initconst = {
-+ 0xdb, 0x92, 0x0f, 0x7f, 0x17, 0x54, 0x0c, 0x30
-+};
-+static const u8 dec_key010[] __initconst = {
-+ 0x47, 0x11, 0xeb, 0x86, 0x2b, 0x2c, 0xab, 0x44,
-+ 0x34, 0xda, 0x7f, 0x57, 0x03, 0x39, 0x0c, 0xaf,
-+ 0x2c, 0x14, 0xfd, 0x65, 0x23, 0xe9, 0x8e, 0x74,
-+ 0xd5, 0x08, 0x68, 0x08, 0xe7, 0xb4, 0x72, 0xd7
-+};
-+
-+static const u8 dec_input011[] __initconst = {
-+ 0x6a, 0xfc, 0x4b, 0x25, 0xdf, 0xc0, 0xe4, 0xe8,
-+ 0x17, 0x4d, 0x4c, 0xc9, 0x7e, 0xde, 0x3a, 0xcc,
-+ 0x3c, 0xba, 0x6a, 0x77, 0x47, 0xdb, 0xe3, 0x74,
-+ 0x7a, 0x4d, 0x5f, 0x8d, 0x37, 0x55, 0x80, 0x73,
-+ 0x90, 0x66, 0x5d, 0x3a, 0x7d, 0x5d, 0x86, 0x5e,
-+ 0x8d, 0xfd, 0x83, 0xff, 0x4e, 0x74, 0x6f, 0xf9,
-+ 0xe6, 0x70, 0x17, 0x70, 0x3e, 0x96, 0xa7, 0x7e,
-+ 0xcb, 0xab, 0x8f, 0x58, 0x24, 0x9b, 0x01, 0xfd,
-+ 0xcb, 0xe6, 0x4d, 0x9b, 0xf0, 0x88, 0x94, 0x57,
-+ 0x66, 0xef, 0x72, 0x4c, 0x42, 0x6e, 0x16, 0x19,
-+ 0x15, 0xea, 0x70, 0x5b, 0xac, 0x13, 0xdb, 0x9f,
-+ 0x18, 0xe2, 0x3c, 0x26, 0x97, 0xbc, 0xdc, 0x45,
-+ 0x8c, 0x6c, 0x24, 0x69, 0x9c, 0xf7, 0x65, 0x1e,
-+ 0x18, 0x59, 0x31, 0x7c, 0xe4, 0x73, 0xbc, 0x39,
-+ 0x62, 0xc6, 0x5c, 0x9f, 0xbf, 0xfa, 0x90, 0x03,
-+ 0xc9, 0x72, 0x26, 0xb6, 0x1b, 0xc2, 0xb7, 0x3f,
-+ 0xf2, 0x13, 0x77, 0xf2, 0x8d, 0xb9, 0x47, 0xd0,
-+ 0x53, 0xdd, 0xc8, 0x91, 0x83, 0x8b, 0xb1, 0xce,
-+ 0xa3, 0xfe, 0xcd, 0xd9, 0xdd, 0x92, 0x7b, 0xdb,
-+ 0xb8, 0xfb, 0xc9, 0x2d, 0x01, 0x59, 0x39, 0x52,
-+ 0xad, 0x1b, 0xec, 0xcf, 0xd7, 0x70, 0x13, 0x21,
-+ 0xf5, 0x47, 0xaa, 0x18, 0x21, 0x5c, 0xc9, 0x9a,
-+ 0xd2, 0x6b, 0x05, 0x9c, 0x01, 0xa1, 0xda, 0x35,
-+ 0x5d, 0xb3, 0x70, 0xe6, 0xa9, 0x80, 0x8b, 0x91,
-+ 0xb7, 0xb3, 0x5f, 0x24, 0x9a, 0xb7, 0xd1, 0x6b,
-+ 0xa1, 0x1c, 0x50, 0xba, 0x49, 0xe0, 0xee, 0x2e,
-+ 0x75, 0xac, 0x69, 0xc0, 0xeb, 0x03, 0xdd, 0x19,
-+ 0xe5, 0xf6, 0x06, 0xdd, 0xc3, 0xd7, 0x2b, 0x07,
-+ 0x07, 0x30, 0xa7, 0x19, 0x0c, 0xbf, 0xe6, 0x18,
-+ 0xcc, 0xb1, 0x01, 0x11, 0x85, 0x77, 0x1d, 0x96,
-+ 0xa7, 0xa3, 0x00, 0x84, 0x02, 0xa2, 0x83, 0x68,
-+ 0xda, 0x17, 0x27, 0xc8, 0x7f, 0x23, 0xb7, 0xf4,
-+ 0x13, 0x85, 0xcf, 0xdd, 0x7a, 0x7d, 0x24, 0x57,
-+ 0xfe, 0x05, 0x93, 0xf5, 0x74, 0xce, 0xed, 0x0c,
-+ 0x20, 0x98, 0x8d, 0x92, 0x30, 0xa1, 0x29, 0x23,
-+ 0x1a, 0xa0, 0x4f, 0x69, 0x56, 0x4c, 0xe1, 0xc8,
-+ 0xce, 0xf6, 0x9a, 0x0c, 0xa4, 0xfa, 0x04, 0xf6,
-+ 0x62, 0x95, 0xf2, 0xfa, 0xc7, 0x40, 0x68, 0x40,
-+ 0x8f, 0x41, 0xda, 0xb4, 0x26, 0x6f, 0x70, 0xab,
-+ 0x40, 0x61, 0xa4, 0x0e, 0x75, 0xfb, 0x86, 0xeb,
-+ 0x9d, 0x9a, 0x1f, 0xec, 0x76, 0x99, 0xe7, 0xea,
-+ 0xaa, 0x1e, 0x2d, 0xb5, 0xd4, 0xa6, 0x1a, 0xb8,
-+ 0x61, 0x0a, 0x1d, 0x16, 0x5b, 0x98, 0xc2, 0x31,
-+ 0x40, 0xe7, 0x23, 0x1d, 0x66, 0x99, 0xc8, 0xc0,
-+ 0xd7, 0xce, 0xf3, 0x57, 0x40, 0x04, 0x3f, 0xfc,
-+ 0xea, 0xb3, 0xfc, 0xd2, 0xd3, 0x99, 0xa4, 0x94,
-+ 0x69, 0xa0, 0xef, 0xd1, 0x85, 0xb3, 0xa6, 0xb1,
-+ 0x28, 0xbf, 0x94, 0x67, 0x22, 0xc3, 0x36, 0x46,
-+ 0xf8, 0xd2, 0x0f, 0x5f, 0xf4, 0x59, 0x80, 0xe6,
-+ 0x2d, 0x43, 0x08, 0x7d, 0x19, 0x09, 0x97, 0xa7,
-+ 0x4c, 0x3d, 0x8d, 0xba, 0x65, 0x62, 0xa3, 0x71,
-+ 0x33, 0x29, 0x62, 0xdb, 0xc1, 0x33, 0x34, 0x1a,
-+ 0x63, 0x33, 0x16, 0xb6, 0x64, 0x7e, 0xab, 0x33,
-+ 0xf0, 0xe6, 0x26, 0x68, 0xba, 0x1d, 0x2e, 0x38,
-+ 0x08, 0xe6, 0x02, 0xd3, 0x25, 0x2c, 0x47, 0x23,
-+ 0x58, 0x34, 0x0f, 0x9d, 0x63, 0x4f, 0x63, 0xbb,
-+ 0x7f, 0x3b, 0x34, 0x38, 0xa7, 0xb5, 0x8d, 0x65,
-+ 0xd9, 0x9f, 0x79, 0x55, 0x3e, 0x4d, 0xe7, 0x73,
-+ 0xd8, 0xf6, 0x98, 0x97, 0x84, 0x60, 0x9c, 0xc8,
-+ 0xa9, 0x3c, 0xf6, 0xdc, 0x12, 0x5c, 0xe1, 0xbb,
-+ 0x0b, 0x8b, 0x98, 0x9c, 0x9d, 0x26, 0x7c, 0x4a,
-+ 0xe6, 0x46, 0x36, 0x58, 0x21, 0x4a, 0xee, 0xca,
-+ 0xd7, 0x3b, 0xc2, 0x6c, 0x49, 0x2f, 0xe5, 0xd5,
-+ 0x03, 0x59, 0x84, 0x53, 0xcb, 0xfe, 0x92, 0x71,
-+ 0x2e, 0x7c, 0x21, 0xcc, 0x99, 0x85, 0x7f, 0xb8,
-+ 0x74, 0x90, 0x13, 0x42, 0x3f, 0xe0, 0x6b, 0x1d,
-+ 0xf2, 0x4d, 0x54, 0xd4, 0xfc, 0x3a, 0x05, 0xe6,
-+ 0x74, 0xaf, 0xa6, 0xa0, 0x2a, 0x20, 0x23, 0x5d,
-+ 0x34, 0x5c, 0xd9, 0x3e, 0x4e, 0xfa, 0x93, 0xe7,
-+ 0xaa, 0xe9, 0x6f, 0x08, 0x43, 0x67, 0x41, 0xc5,
-+ 0xad, 0xfb, 0x31, 0x95, 0x82, 0x73, 0x32, 0xd8,
-+ 0xa6, 0xa3, 0xed, 0x0e, 0x2d, 0xf6, 0x5f, 0xfd,
-+ 0x80, 0xa6, 0x7a, 0xe0, 0xdf, 0x78, 0x15, 0x29,
-+ 0x74, 0x33, 0xd0, 0x9e, 0x83, 0x86, 0x72, 0x22,
-+ 0x57, 0x29, 0xb9, 0x9e, 0x5d, 0xd3, 0x1a, 0xb5,
-+ 0x96, 0x72, 0x41, 0x3d, 0xf1, 0x64, 0x43, 0x67,
-+ 0xee, 0xaa, 0x5c, 0xd3, 0x9a, 0x96, 0x13, 0x11,
-+ 0x5d, 0xf3, 0x0c, 0x87, 0x82, 0x1e, 0x41, 0x9e,
-+ 0xd0, 0x27, 0xd7, 0x54, 0x3b, 0x67, 0x73, 0x09,
-+ 0x91, 0xe9, 0xd5, 0x36, 0xa7, 0xb5, 0x55, 0xe4,
-+ 0xf3, 0x21, 0x51, 0x49, 0x22, 0x07, 0x55, 0x4f,
-+ 0x44, 0x4b, 0xd2, 0x15, 0x93, 0x17, 0x2a, 0xfa,
-+ 0x4d, 0x4a, 0x57, 0xdb, 0x4c, 0xa6, 0xeb, 0xec,
-+ 0x53, 0x25, 0x6c, 0x21, 0xed, 0x00, 0x4c, 0x3b,
-+ 0xca, 0x14, 0x57, 0xa9, 0xd6, 0x6a, 0xcd, 0x8d,
-+ 0x5e, 0x74, 0xac, 0x72, 0xc1, 0x97, 0xe5, 0x1b,
-+ 0x45, 0x4e, 0xda, 0xfc, 0xcc, 0x40, 0xe8, 0x48,
-+ 0x88, 0x0b, 0xa3, 0xe3, 0x8d, 0x83, 0x42, 0xc3,
-+ 0x23, 0xfd, 0x68, 0xb5, 0x8e, 0xf1, 0x9d, 0x63,
-+ 0x77, 0xe9, 0xa3, 0x8e, 0x8c, 0x26, 0x6b, 0xbd,
-+ 0x72, 0x73, 0x35, 0x0c, 0x03, 0xf8, 0x43, 0x78,
-+ 0x52, 0x71, 0x15, 0x1f, 0x71, 0x5d, 0x6e, 0xed,
-+ 0xb9, 0xcc, 0x86, 0x30, 0xdb, 0x2b, 0xd3, 0x82,
-+ 0x88, 0x23, 0x71, 0x90, 0x53, 0x5c, 0xa9, 0x2f,
-+ 0x76, 0x01, 0xb7, 0x9a, 0xfe, 0x43, 0x55, 0xa3,
-+ 0x04, 0x9b, 0x0e, 0xe4, 0x59, 0xdf, 0xc9, 0xe9,
-+ 0xb1, 0xea, 0x29, 0x28, 0x3c, 0x5c, 0xae, 0x72,
-+ 0x84, 0xb6, 0xc6, 0xeb, 0x0c, 0x27, 0x07, 0x74,
-+ 0x90, 0x0d, 0x31, 0xb0, 0x00, 0x77, 0xe9, 0x40,
-+ 0x70, 0x6f, 0x68, 0xa7, 0xfd, 0x06, 0xec, 0x4b,
-+ 0xc0, 0xb7, 0xac, 0xbc, 0x33, 0xb7, 0x6d, 0x0a,
-+ 0xbd, 0x12, 0x1b, 0x59, 0xcb, 0xdd, 0x32, 0xf5,
-+ 0x1d, 0x94, 0x57, 0x76, 0x9e, 0x0c, 0x18, 0x98,
-+ 0x71, 0xd7, 0x2a, 0xdb, 0x0b, 0x7b, 0xa7, 0x71,
-+ 0xb7, 0x67, 0x81, 0x23, 0x96, 0xae, 0xb9, 0x7e,
-+ 0x32, 0x43, 0x92, 0x8a, 0x19, 0xa0, 0xc4, 0xd4,
-+ 0x3b, 0x57, 0xf9, 0x4a, 0x2c, 0xfb, 0x51, 0x46,
-+ 0xbb, 0xcb, 0x5d, 0xb3, 0xef, 0x13, 0x93, 0x6e,
-+ 0x68, 0x42, 0x54, 0x57, 0xd3, 0x6a, 0x3a, 0x8f,
-+ 0x9d, 0x66, 0xbf, 0xbd, 0x36, 0x23, 0xf5, 0x93,
-+ 0x83, 0x7b, 0x9c, 0xc0, 0xdd, 0xc5, 0x49, 0xc0,
-+ 0x64, 0xed, 0x07, 0x12, 0xb3, 0xe6, 0xe4, 0xe5,
-+ 0x38, 0x95, 0x23, 0xb1, 0xa0, 0x3b, 0x1a, 0x61,
-+ 0xda, 0x17, 0xac, 0xc3, 0x58, 0xdd, 0x74, 0x64,
-+ 0x22, 0x11, 0xe8, 0x32, 0x1d, 0x16, 0x93, 0x85,
-+ 0x99, 0xa5, 0x9c, 0x34, 0x55, 0xb1, 0xe9, 0x20,
-+ 0x72, 0xc9, 0x28, 0x7b, 0x79, 0x00, 0xa1, 0xa6,
-+ 0xa3, 0x27, 0x40, 0x18, 0x8a, 0x54, 0xe0, 0xcc,
-+ 0xe8, 0x4e, 0x8e, 0x43, 0x96, 0xe7, 0x3f, 0xc8,
-+ 0xe9, 0xb2, 0xf9, 0xc9, 0xda, 0x04, 0x71, 0x50,
-+ 0x47, 0xe4, 0xaa, 0xce, 0xa2, 0x30, 0xc8, 0xe4,
-+ 0xac, 0xc7, 0x0d, 0x06, 0x2e, 0xe6, 0xe8, 0x80,
-+ 0x36, 0x29, 0x9e, 0x01, 0xb8, 0xc3, 0xf0, 0xa0,
-+ 0x5d, 0x7a, 0xca, 0x4d, 0xa0, 0x57, 0xbd, 0x2a,
-+ 0x45, 0xa7, 0x7f, 0x9c, 0x93, 0x07, 0x8f, 0x35,
-+ 0x67, 0x92, 0xe3, 0xe9, 0x7f, 0xa8, 0x61, 0x43,
-+ 0x9e, 0x25, 0x4f, 0x33, 0x76, 0x13, 0x6e, 0x12,
-+ 0xb9, 0xdd, 0xa4, 0x7c, 0x08, 0x9f, 0x7c, 0xe7,
-+ 0x0a, 0x8d, 0x84, 0x06, 0xa4, 0x33, 0x17, 0x34,
-+ 0x5e, 0x10, 0x7c, 0xc0, 0xa8, 0x3d, 0x1f, 0x42,
-+ 0x20, 0x51, 0x65, 0x5d, 0x09, 0xc3, 0xaa, 0xc0,
-+ 0xc8, 0x0d, 0xf0, 0x79, 0xbc, 0x20, 0x1b, 0x95,
-+ 0xe7, 0x06, 0x7d, 0x47, 0x20, 0x03, 0x1a, 0x74,
-+ 0xdd, 0xe2, 0xd4, 0xae, 0x38, 0x71, 0x9b, 0xf5,
-+ 0x80, 0xec, 0x08, 0x4e, 0x56, 0xba, 0x76, 0x12,
-+ 0x1a, 0xdf, 0x48, 0xf3, 0xae, 0xb3, 0xe6, 0xe6,
-+ 0xbe, 0xc0, 0x91, 0x2e, 0x01, 0xb3, 0x01, 0x86,
-+ 0xa2, 0xb9, 0x52, 0xd1, 0x21, 0xae, 0xd4, 0x97,
-+ 0x1d, 0xef, 0x41, 0x12, 0x95, 0x3d, 0x48, 0x45,
-+ 0x1c, 0x56, 0x32, 0x8f, 0xb8, 0x43, 0xbb, 0x19,
-+ 0xf3, 0xca, 0xe9, 0xeb, 0x6d, 0x84, 0xbe, 0x86,
-+ 0x06, 0xe2, 0x36, 0xb2, 0x62, 0x9d, 0xd3, 0x4c,
-+ 0x48, 0x18, 0x54, 0x13, 0x4e, 0xcf, 0xfd, 0xba,
-+ 0x84, 0xb9, 0x30, 0x53, 0xcf, 0xfb, 0xb9, 0x29,
-+ 0x8f, 0xdc, 0x9f, 0xef, 0x60, 0x0b, 0x64, 0xf6,
-+ 0x8b, 0xee, 0xa6, 0x91, 0xc2, 0x41, 0x6c, 0xf6,
-+ 0xfa, 0x79, 0x67, 0x4b, 0xc1, 0x3f, 0xaf, 0x09,
-+ 0x81, 0xd4, 0x5d, 0xcb, 0x09, 0xdf, 0x36, 0x31,
-+ 0xc0, 0x14, 0x3c, 0x7c, 0x0e, 0x65, 0x95, 0x99,
-+ 0x6d, 0xa3, 0xf4, 0xd7, 0x38, 0xee, 0x1a, 0x2b,
-+ 0x37, 0xe2, 0xa4, 0x3b, 0x4b, 0xd0, 0x65, 0xca,
-+ 0xf8, 0xc3, 0xe8, 0x15, 0x20, 0xef, 0xf2, 0x00,
-+ 0xfd, 0x01, 0x09, 0xc5, 0xc8, 0x17, 0x04, 0x93,
-+ 0xd0, 0x93, 0x03, 0x55, 0xc5, 0xfe, 0x32, 0xa3,
-+ 0x3e, 0x28, 0x2d, 0x3b, 0x93, 0x8a, 0xcc, 0x07,
-+ 0x72, 0x80, 0x8b, 0x74, 0x16, 0x24, 0xbb, 0xda,
-+ 0x94, 0x39, 0x30, 0x8f, 0xb1, 0xcd, 0x4a, 0x90,
-+ 0x92, 0x7c, 0x14, 0x8f, 0x95, 0x4e, 0xac, 0x9b,
-+ 0xd8, 0x8f, 0x1a, 0x87, 0xa4, 0x32, 0x27, 0x8a,
-+ 0xba, 0xf7, 0x41, 0xcf, 0x84, 0x37, 0x19, 0xe6,
-+ 0x06, 0xf5, 0x0e, 0xcf, 0x36, 0xf5, 0x9e, 0x6c,
-+ 0xde, 0xbc, 0xff, 0x64, 0x7e, 0x4e, 0x59, 0x57,
-+ 0x48, 0xfe, 0x14, 0xf7, 0x9c, 0x93, 0x5d, 0x15,
-+ 0xad, 0xcc, 0x11, 0xb1, 0x17, 0x18, 0xb2, 0x7e,
-+ 0xcc, 0xab, 0xe9, 0xce, 0x7d, 0x77, 0x5b, 0x51,
-+ 0x1b, 0x1e, 0x20, 0xa8, 0x32, 0x06, 0x0e, 0x75,
-+ 0x93, 0xac, 0xdb, 0x35, 0x37, 0x1f, 0xe9, 0x19,
-+ 0x1d, 0xb4, 0x71, 0x97, 0xd6, 0x4e, 0x2c, 0x08,
-+ 0xa5, 0x13, 0xf9, 0x0e, 0x7e, 0x78, 0x6e, 0x14,
-+ 0xe0, 0xa9, 0xb9, 0x96, 0x4c, 0x80, 0x82, 0xba,
-+ 0x17, 0xb3, 0x9d, 0x69, 0xb0, 0x84, 0x46, 0xff,
-+ 0xf9, 0x52, 0x79, 0x94, 0x58, 0x3a, 0x62, 0x90,
-+ 0x15, 0x35, 0x71, 0x10, 0x37, 0xed, 0xa1, 0x8e,
-+ 0x53, 0x6e, 0xf4, 0x26, 0x57, 0x93, 0x15, 0x93,
-+ 0xf6, 0x81, 0x2c, 0x5a, 0x10, 0xda, 0x92, 0xad,
-+ 0x2f, 0xdb, 0x28, 0x31, 0x2d, 0x55, 0x04, 0xd2,
-+ 0x06, 0x28, 0x8c, 0x1e, 0xdc, 0xea, 0x54, 0xac,
-+ 0xff, 0xb7, 0x6c, 0x30, 0x15, 0xd4, 0xb4, 0x0d,
-+ 0x00, 0x93, 0x57, 0xdd, 0xd2, 0x07, 0x07, 0x06,
-+ 0xd9, 0x43, 0x9b, 0xcd, 0x3a, 0xf4, 0x7d, 0x4c,
-+ 0x36, 0x5d, 0x23, 0xa2, 0xcc, 0x57, 0x40, 0x91,
-+ 0xe9, 0x2c, 0x2f, 0x2c, 0xd5, 0x30, 0x9b, 0x17,
-+ 0xb0, 0xc9, 0xf7, 0xa7, 0x2f, 0xd1, 0x93, 0x20,
-+ 0x6b, 0xc6, 0xc1, 0xe4, 0x6f, 0xcb, 0xd1, 0xe7,
-+ 0x09, 0x0f, 0x9e, 0xdc, 0xaa, 0x9f, 0x2f, 0xdf,
-+ 0x56, 0x9f, 0xd4, 0x33, 0x04, 0xaf, 0xd3, 0x6c,
-+ 0x58, 0x61, 0xf0, 0x30, 0xec, 0xf2, 0x7f, 0xf2,
-+ 0x9c, 0xdf, 0x39, 0xbb, 0x6f, 0xa2, 0x8c, 0x7e,
-+ 0xc4, 0x22, 0x51, 0x71, 0xc0, 0x4d, 0x14, 0x1a,
-+ 0xc4, 0xcd, 0x04, 0xd9, 0x87, 0x08, 0x50, 0x05,
-+ 0xcc, 0xaf, 0xf6, 0xf0, 0x8f, 0x92, 0x54, 0x58,
-+ 0xc2, 0xc7, 0x09, 0x7a, 0x59, 0x02, 0x05, 0xe8,
-+ 0xb0, 0x86, 0xd9, 0xbf, 0x7b, 0x35, 0x51, 0x4d,
-+ 0xaf, 0x08, 0x97, 0x2c, 0x65, 0xda, 0x2a, 0x71,
-+ 0x3a, 0xa8, 0x51, 0xcc, 0xf2, 0x73, 0x27, 0xc3,
-+ 0xfd, 0x62, 0xcf, 0xe3, 0xb2, 0xca, 0xcb, 0xbe,
-+ 0x1a, 0x0a, 0xa1, 0x34, 0x7b, 0x77, 0xc4, 0x62,
-+ 0x68, 0x78, 0x5f, 0x94, 0x07, 0x04, 0x65, 0x16,
-+ 0x4b, 0x61, 0xcb, 0xff, 0x75, 0x26, 0x50, 0x66,
-+ 0x1f, 0x6e, 0x93, 0xf8, 0xc5, 0x51, 0xeb, 0xa4,
-+ 0x4a, 0x48, 0x68, 0x6b, 0xe2, 0x5e, 0x44, 0xb2,
-+ 0x50, 0x2c, 0x6c, 0xae, 0x79, 0x4e, 0x66, 0x35,
-+ 0x81, 0x50, 0xac, 0xbc, 0x3f, 0xb1, 0x0c, 0xf3,
-+ 0x05, 0x3c, 0x4a, 0xa3, 0x6c, 0x2a, 0x79, 0xb4,
-+ 0xb7, 0xab, 0xca, 0xc7, 0x9b, 0x8e, 0xcd, 0x5f,
-+ 0x11, 0x03, 0xcb, 0x30, 0xa3, 0xab, 0xda, 0xfe,
-+ 0x64, 0xb9, 0xbb, 0xd8, 0x5e, 0x3a, 0x1a, 0x56,
-+ 0xe5, 0x05, 0x48, 0x90, 0x1e, 0x61, 0x69, 0x1b,
-+ 0x22, 0xe6, 0x1a, 0x3c, 0x75, 0xad, 0x1f, 0x37,
-+ 0x28, 0xdc, 0xe4, 0x6d, 0xbd, 0x42, 0xdc, 0xd3,
-+ 0xc8, 0xb6, 0x1c, 0x48, 0xfe, 0x94, 0x77, 0x7f,
-+ 0xbd, 0x62, 0xac, 0xa3, 0x47, 0x27, 0xcf, 0x5f,
-+ 0xd9, 0xdb, 0xaf, 0xec, 0xf7, 0x5e, 0xc1, 0xb0,
-+ 0x9d, 0x01, 0x26, 0x99, 0x7e, 0x8f, 0x03, 0x70,
-+ 0xb5, 0x42, 0xbe, 0x67, 0x28, 0x1b, 0x7c, 0xbd,
-+ 0x61, 0x21, 0x97, 0xcc, 0x5c, 0xe1, 0x97, 0x8f,
-+ 0x8d, 0xde, 0x2b, 0xaa, 0xa7, 0x71, 0x1d, 0x1e,
-+ 0x02, 0x73, 0x70, 0x58, 0x32, 0x5b, 0x1d, 0x67,
-+ 0x3d, 0xe0, 0x74, 0x4f, 0x03, 0xf2, 0x70, 0x51,
-+ 0x79, 0xf1, 0x61, 0x70, 0x15, 0x74, 0x9d, 0x23,
-+ 0x89, 0xde, 0xac, 0xfd, 0xde, 0xd0, 0x1f, 0xc3,
-+ 0x87, 0x44, 0x35, 0x4b, 0xe5, 0xb0, 0x60, 0xc5,
-+ 0x22, 0xe4, 0x9e, 0xca, 0xeb, 0xd5, 0x3a, 0x09,
-+ 0x45, 0xa4, 0xdb, 0xfa, 0x3f, 0xeb, 0x1b, 0xc7,
-+ 0xc8, 0x14, 0x99, 0x51, 0x92, 0x10, 0xed, 0xed,
-+ 0x28, 0xe0, 0xa1, 0xf8, 0x26, 0xcf, 0xcd, 0xcb,
-+ 0x63, 0xa1, 0x3b, 0xe3, 0xdf, 0x7e, 0xfe, 0xa6,
-+ 0xf0, 0x81, 0x9a, 0xbf, 0x55, 0xde, 0x54, 0xd5,
-+ 0x56, 0x60, 0x98, 0x10, 0x68, 0xf4, 0x38, 0x96,
-+ 0x8e, 0x6f, 0x1d, 0x44, 0x7f, 0xd6, 0x2f, 0xfe,
-+ 0x55, 0xfb, 0x0c, 0x7e, 0x67, 0xe2, 0x61, 0x44,
-+ 0xed, 0xf2, 0x35, 0x30, 0x5d, 0xe9, 0xc7, 0xd6,
-+ 0x6d, 0xe0, 0xa0, 0xed, 0xf3, 0xfc, 0xd8, 0x3e,
-+ 0x0a, 0x7b, 0xcd, 0xaf, 0x65, 0x68, 0x18, 0xc0,
-+ 0xec, 0x04, 0x1c, 0x74, 0x6d, 0xe2, 0x6e, 0x79,
-+ 0xd4, 0x11, 0x2b, 0x62, 0xd5, 0x27, 0xad, 0x4f,
-+ 0x01, 0x59, 0x73, 0xcc, 0x6a, 0x53, 0xfb, 0x2d,
-+ 0xd5, 0x4e, 0x99, 0x21, 0x65, 0x4d, 0xf5, 0x82,
-+ 0xf7, 0xd8, 0x42, 0xce, 0x6f, 0x3d, 0x36, 0x47,
-+ 0xf1, 0x05, 0x16, 0xe8, 0x1b, 0x6a, 0x8f, 0x93,
-+ 0xf2, 0x8f, 0x37, 0x40, 0x12, 0x28, 0xa3, 0xe6,
-+ 0xb9, 0x17, 0x4a, 0x1f, 0xb1, 0xd1, 0x66, 0x69,
-+ 0x86, 0xc4, 0xfc, 0x97, 0xae, 0x3f, 0x8f, 0x1e,
-+ 0x2b, 0xdf, 0xcd, 0xf9, 0x3c
-+};
-+static const u8 dec_output011[] __initconst = {
-+ 0x7a, 0x57, 0xf2, 0xc7, 0x06, 0x3f, 0x50, 0x7b,
-+ 0x36, 0x1a, 0x66, 0x5c, 0xb9, 0x0e, 0x5e, 0x3b,
-+ 0x45, 0x60, 0xbe, 0x9a, 0x31, 0x9f, 0xff, 0x5d,
-+ 0x66, 0x34, 0xb4, 0xdc, 0xfb, 0x9d, 0x8e, 0xee,
-+ 0x6a, 0x33, 0xa4, 0x07, 0x3c, 0xf9, 0x4c, 0x30,
-+ 0xa1, 0x24, 0x52, 0xf9, 0x50, 0x46, 0x88, 0x20,
-+ 0x02, 0x32, 0x3a, 0x0e, 0x99, 0x63, 0xaf, 0x1f,
-+ 0x15, 0x28, 0x2a, 0x05, 0xff, 0x57, 0x59, 0x5e,
-+ 0x18, 0xa1, 0x1f, 0xd0, 0x92, 0x5c, 0x88, 0x66,
-+ 0x1b, 0x00, 0x64, 0xa5, 0x93, 0x8d, 0x06, 0x46,
-+ 0xb0, 0x64, 0x8b, 0x8b, 0xef, 0x99, 0x05, 0x35,
-+ 0x85, 0xb3, 0xf3, 0x33, 0xbb, 0xec, 0x66, 0xb6,
-+ 0x3d, 0x57, 0x42, 0xe3, 0xb4, 0xc6, 0xaa, 0xb0,
-+ 0x41, 0x2a, 0xb9, 0x59, 0xa9, 0xf6, 0x3e, 0x15,
-+ 0x26, 0x12, 0x03, 0x21, 0x4c, 0x74, 0x43, 0x13,
-+ 0x2a, 0x03, 0x27, 0x09, 0xb4, 0xfb, 0xe7, 0xb7,
-+ 0x40, 0xff, 0x5e, 0xce, 0x48, 0x9a, 0x60, 0xe3,
-+ 0x8b, 0x80, 0x8c, 0x38, 0x2d, 0xcb, 0x93, 0x37,
-+ 0x74, 0x05, 0x52, 0x6f, 0x73, 0x3e, 0xc3, 0xbc,
-+ 0xca, 0x72, 0x0a, 0xeb, 0xf1, 0x3b, 0xa0, 0x95,
-+ 0xdc, 0x8a, 0xc4, 0xa9, 0xdc, 0xca, 0x44, 0xd8,
-+ 0x08, 0x63, 0x6a, 0x36, 0xd3, 0x3c, 0xb8, 0xac,
-+ 0x46, 0x7d, 0xfd, 0xaa, 0xeb, 0x3e, 0x0f, 0x45,
-+ 0x8f, 0x49, 0xda, 0x2b, 0xf2, 0x12, 0xbd, 0xaf,
-+ 0x67, 0x8a, 0x63, 0x48, 0x4b, 0x55, 0x5f, 0x6d,
-+ 0x8c, 0xb9, 0x76, 0x34, 0x84, 0xae, 0xc2, 0xfc,
-+ 0x52, 0x64, 0x82, 0xf7, 0xb0, 0x06, 0xf0, 0x45,
-+ 0x73, 0x12, 0x50, 0x30, 0x72, 0xea, 0x78, 0x9a,
-+ 0xa8, 0xaf, 0xb5, 0xe3, 0xbb, 0x77, 0x52, 0xec,
-+ 0x59, 0x84, 0xbf, 0x6b, 0x8f, 0xce, 0x86, 0x5e,
-+ 0x1f, 0x23, 0xe9, 0xfb, 0x08, 0x86, 0xf7, 0x10,
-+ 0xb9, 0xf2, 0x44, 0x96, 0x44, 0x63, 0xa9, 0xa8,
-+ 0x78, 0x00, 0x23, 0xd6, 0xc7, 0xe7, 0x6e, 0x66,
-+ 0x4f, 0xcc, 0xee, 0x15, 0xb3, 0xbd, 0x1d, 0xa0,
-+ 0xe5, 0x9c, 0x1b, 0x24, 0x2c, 0x4d, 0x3c, 0x62,
-+ 0x35, 0x9c, 0x88, 0x59, 0x09, 0xdd, 0x82, 0x1b,
-+ 0xcf, 0x0a, 0x83, 0x6b, 0x3f, 0xae, 0x03, 0xc4,
-+ 0xb4, 0xdd, 0x7e, 0x5b, 0x28, 0x76, 0x25, 0x96,
-+ 0xd9, 0xc9, 0x9d, 0x5f, 0x86, 0xfa, 0xf6, 0xd7,
-+ 0xd2, 0xe6, 0x76, 0x1d, 0x0f, 0xa1, 0xdc, 0x74,
-+ 0x05, 0x1b, 0x1d, 0xe0, 0xcd, 0x16, 0xb0, 0xa8,
-+ 0x8a, 0x34, 0x7b, 0x15, 0x11, 0x77, 0xe5, 0x7b,
-+ 0x7e, 0x20, 0xf7, 0xda, 0x38, 0xda, 0xce, 0x70,
-+ 0xe9, 0xf5, 0x6c, 0xd9, 0xbe, 0x0c, 0x4c, 0x95,
-+ 0x4c, 0xc2, 0x9b, 0x34, 0x55, 0x55, 0xe1, 0xf3,
-+ 0x46, 0x8e, 0x48, 0x74, 0x14, 0x4f, 0x9d, 0xc9,
-+ 0xf5, 0xe8, 0x1a, 0xf0, 0x11, 0x4a, 0xc1, 0x8d,
-+ 0xe0, 0x93, 0xa0, 0xbe, 0x09, 0x1c, 0x2b, 0x4e,
-+ 0x0f, 0xb2, 0x87, 0x8b, 0x84, 0xfe, 0x92, 0x32,
-+ 0x14, 0xd7, 0x93, 0xdf, 0xe7, 0x44, 0xbc, 0xc5,
-+ 0xae, 0x53, 0x69, 0xd8, 0xb3, 0x79, 0x37, 0x80,
-+ 0xe3, 0x17, 0x5c, 0xec, 0x53, 0x00, 0x9a, 0xe3,
-+ 0x8e, 0xdc, 0x38, 0xb8, 0x66, 0xf0, 0xd3, 0xad,
-+ 0x1d, 0x02, 0x96, 0x86, 0x3e, 0x9d, 0x3b, 0x5d,
-+ 0xa5, 0x7f, 0x21, 0x10, 0xf1, 0x1f, 0x13, 0x20,
-+ 0xf9, 0x57, 0x87, 0x20, 0xf5, 0x5f, 0xf1, 0x17,
-+ 0x48, 0x0a, 0x51, 0x5a, 0xcd, 0x19, 0x03, 0xa6,
-+ 0x5a, 0xd1, 0x12, 0x97, 0xe9, 0x48, 0xe2, 0x1d,
-+ 0x83, 0x75, 0x50, 0xd9, 0x75, 0x7d, 0x6a, 0x82,
-+ 0xa1, 0xf9, 0x4e, 0x54, 0x87, 0x89, 0xc9, 0x0c,
-+ 0xb7, 0x5b, 0x6a, 0x91, 0xc1, 0x9c, 0xb2, 0xa9,
-+ 0xdc, 0x9a, 0xa4, 0x49, 0x0a, 0x6d, 0x0d, 0xbb,
-+ 0xde, 0x86, 0x44, 0xdd, 0x5d, 0x89, 0x2b, 0x96,
-+ 0x0f, 0x23, 0x95, 0xad, 0xcc, 0xa2, 0xb3, 0xb9,
-+ 0x7e, 0x74, 0x38, 0xba, 0x9f, 0x73, 0xae, 0x5f,
-+ 0xf8, 0x68, 0xa2, 0xe0, 0xa9, 0xce, 0xbd, 0x40,
-+ 0xd4, 0x4c, 0x6b, 0xd2, 0x56, 0x62, 0xb0, 0xcc,
-+ 0x63, 0x7e, 0x5b, 0xd3, 0xae, 0xd1, 0x75, 0xce,
-+ 0xbb, 0xb4, 0x5b, 0xa8, 0xf8, 0xb4, 0xac, 0x71,
-+ 0x75, 0xaa, 0xc9, 0x9f, 0xbb, 0x6c, 0xad, 0x0f,
-+ 0x55, 0x5d, 0xe8, 0x85, 0x7d, 0xf9, 0x21, 0x35,
-+ 0xea, 0x92, 0x85, 0x2b, 0x00, 0xec, 0x84, 0x90,
-+ 0x0a, 0x63, 0x96, 0xe4, 0x6b, 0xa9, 0x77, 0xb8,
-+ 0x91, 0xf8, 0x46, 0x15, 0x72, 0x63, 0x70, 0x01,
-+ 0x40, 0xa3, 0xa5, 0x76, 0x62, 0x2b, 0xbf, 0xf1,
-+ 0xe5, 0x8d, 0x9f, 0xa3, 0xfa, 0x9b, 0x03, 0xbe,
-+ 0xfe, 0x65, 0x6f, 0xa2, 0x29, 0x0d, 0x54, 0xb4,
-+ 0x71, 0xce, 0xa9, 0xd6, 0x3d, 0x88, 0xf9, 0xaf,
-+ 0x6b, 0xa8, 0x9e, 0xf4, 0x16, 0x96, 0x36, 0xb9,
-+ 0x00, 0xdc, 0x10, 0xab, 0xb5, 0x08, 0x31, 0x1f,
-+ 0x00, 0xb1, 0x3c, 0xd9, 0x38, 0x3e, 0xc6, 0x04,
-+ 0xa7, 0x4e, 0xe8, 0xae, 0xed, 0x98, 0xc2, 0xf7,
-+ 0xb9, 0x00, 0x5f, 0x8c, 0x60, 0xd1, 0xe5, 0x15,
-+ 0xf7, 0xae, 0x1e, 0x84, 0x88, 0xd1, 0xf6, 0xbc,
-+ 0x3a, 0x89, 0x35, 0x22, 0x83, 0x7c, 0xca, 0xf0,
-+ 0x33, 0x82, 0x4c, 0x79, 0x3c, 0xfd, 0xb1, 0xae,
-+ 0x52, 0x62, 0x55, 0xd2, 0x41, 0x60, 0xc6, 0xbb,
-+ 0xfa, 0x0e, 0x59, 0xd6, 0xa8, 0xfe, 0x5d, 0xed,
-+ 0x47, 0x3d, 0xe0, 0xea, 0x1f, 0x6e, 0x43, 0x51,
-+ 0xec, 0x10, 0x52, 0x56, 0x77, 0x42, 0x6b, 0x52,
-+ 0x87, 0xd8, 0xec, 0xe0, 0xaa, 0x76, 0xa5, 0x84,
-+ 0x2a, 0x22, 0x24, 0xfd, 0x92, 0x40, 0x88, 0xd5,
-+ 0x85, 0x1c, 0x1f, 0x6b, 0x47, 0xa0, 0xc4, 0xe4,
-+ 0xef, 0xf4, 0xea, 0xd7, 0x59, 0xac, 0x2a, 0x9e,
-+ 0x8c, 0xfa, 0x1f, 0x42, 0x08, 0xfe, 0x4f, 0x74,
-+ 0xa0, 0x26, 0xf5, 0xb3, 0x84, 0xf6, 0x58, 0x5f,
-+ 0x26, 0x66, 0x3e, 0xd7, 0xe4, 0x22, 0x91, 0x13,
-+ 0xc8, 0xac, 0x25, 0x96, 0x23, 0xd8, 0x09, 0xea,
-+ 0x45, 0x75, 0x23, 0xb8, 0x5f, 0xc2, 0x90, 0x8b,
-+ 0x09, 0xc4, 0xfc, 0x47, 0x6c, 0x6d, 0x0a, 0xef,
-+ 0x69, 0xa4, 0x38, 0x19, 0xcf, 0x7d, 0xf9, 0x09,
-+ 0x73, 0x9b, 0x60, 0x5a, 0xf7, 0x37, 0xb5, 0xfe,
-+ 0x9f, 0xe3, 0x2b, 0x4c, 0x0d, 0x6e, 0x19, 0xf1,
-+ 0xd6, 0xc0, 0x70, 0xf3, 0x9d, 0x22, 0x3c, 0xf9,
-+ 0x49, 0xce, 0x30, 0x8e, 0x44, 0xb5, 0x76, 0x15,
-+ 0x8f, 0x52, 0xfd, 0xa5, 0x04, 0xb8, 0x55, 0x6a,
-+ 0x36, 0x59, 0x7c, 0xc4, 0x48, 0xb8, 0xd7, 0xab,
-+ 0x05, 0x66, 0xe9, 0x5e, 0x21, 0x6f, 0x6b, 0x36,
-+ 0x29, 0xbb, 0xe9, 0xe3, 0xa2, 0x9a, 0xa8, 0xcd,
-+ 0x55, 0x25, 0x11, 0xba, 0x5a, 0x58, 0xa0, 0xde,
-+ 0xae, 0x19, 0x2a, 0x48, 0x5a, 0xff, 0x36, 0xcd,
-+ 0x6d, 0x16, 0x7a, 0x73, 0x38, 0x46, 0xe5, 0x47,
-+ 0x59, 0xc8, 0xa2, 0xf6, 0xe2, 0x6c, 0x83, 0xc5,
-+ 0x36, 0x2c, 0x83, 0x7d, 0xb4, 0x01, 0x05, 0x69,
-+ 0xe7, 0xaf, 0x5c, 0xc4, 0x64, 0x82, 0x12, 0x21,
-+ 0xef, 0xf7, 0xd1, 0x7d, 0xb8, 0x8d, 0x8c, 0x98,
-+ 0x7c, 0x5f, 0x7d, 0x92, 0x88, 0xb9, 0x94, 0x07,
-+ 0x9c, 0xd8, 0xe9, 0x9c, 0x17, 0x38, 0xe3, 0x57,
-+ 0x6c, 0xe0, 0xdc, 0xa5, 0x92, 0x42, 0xb3, 0xbd,
-+ 0x50, 0xa2, 0x7e, 0xb5, 0xb1, 0x52, 0x72, 0x03,
-+ 0x97, 0xd8, 0xaa, 0x9a, 0x1e, 0x75, 0x41, 0x11,
-+ 0xa3, 0x4f, 0xcc, 0xd4, 0xe3, 0x73, 0xad, 0x96,
-+ 0xdc, 0x47, 0x41, 0x9f, 0xb0, 0xbe, 0x79, 0x91,
-+ 0xf5, 0xb6, 0x18, 0xfe, 0xc2, 0x83, 0x18, 0x7d,
-+ 0x73, 0xd9, 0x4f, 0x83, 0x84, 0x03, 0xb3, 0xf0,
-+ 0x77, 0x66, 0x3d, 0x83, 0x63, 0x2e, 0x2c, 0xf9,
-+ 0xdd, 0xa6, 0x1f, 0x89, 0x82, 0xb8, 0x23, 0x42,
-+ 0xeb, 0xe2, 0xca, 0x70, 0x82, 0x61, 0x41, 0x0a,
-+ 0x6d, 0x5f, 0x75, 0xc5, 0xe2, 0xc4, 0x91, 0x18,
-+ 0x44, 0x22, 0xfa, 0x34, 0x10, 0xf5, 0x20, 0xdc,
-+ 0xb7, 0xdd, 0x2a, 0x20, 0x77, 0xf5, 0xf9, 0xce,
-+ 0xdb, 0xa0, 0x0a, 0x52, 0x2a, 0x4e, 0xdd, 0xcc,
-+ 0x97, 0xdf, 0x05, 0xe4, 0x5e, 0xb7, 0xaa, 0xf0,
-+ 0xe2, 0x80, 0xff, 0xba, 0x1a, 0x0f, 0xac, 0xdf,
-+ 0x02, 0x32, 0xe6, 0xf7, 0xc7, 0x17, 0x13, 0xb7,
-+ 0xfc, 0x98, 0x48, 0x8c, 0x0d, 0x82, 0xc9, 0x80,
-+ 0x7a, 0xe2, 0x0a, 0xc5, 0xb4, 0xde, 0x7c, 0x3c,
-+ 0x79, 0x81, 0x0e, 0x28, 0x65, 0x79, 0x67, 0x82,
-+ 0x69, 0x44, 0x66, 0x09, 0xf7, 0x16, 0x1a, 0xf9,
-+ 0x7d, 0x80, 0xa1, 0x79, 0x14, 0xa9, 0xc8, 0x20,
-+ 0xfb, 0xa2, 0x46, 0xbe, 0x08, 0x35, 0x17, 0x58,
-+ 0xc1, 0x1a, 0xda, 0x2a, 0x6b, 0x2e, 0x1e, 0xe6,
-+ 0x27, 0x55, 0x7b, 0x19, 0xe2, 0xfb, 0x64, 0xfc,
-+ 0x5e, 0x15, 0x54, 0x3c, 0xe7, 0xc2, 0x11, 0x50,
-+ 0x30, 0xb8, 0x72, 0x03, 0x0b, 0x1a, 0x9f, 0x86,
-+ 0x27, 0x11, 0x5c, 0x06, 0x2b, 0xbd, 0x75, 0x1a,
-+ 0x0a, 0xda, 0x01, 0xfa, 0x5c, 0x4a, 0xc1, 0x80,
-+ 0x3a, 0x6e, 0x30, 0xc8, 0x2c, 0xeb, 0x56, 0xec,
-+ 0x89, 0xfa, 0x35, 0x7b, 0xb2, 0xf0, 0x97, 0x08,
-+ 0x86, 0x53, 0xbe, 0xbd, 0x40, 0x41, 0x38, 0x1c,
-+ 0xb4, 0x8b, 0x79, 0x2e, 0x18, 0x96, 0x94, 0xde,
-+ 0xe8, 0xca, 0xe5, 0x9f, 0x92, 0x9f, 0x15, 0x5d,
-+ 0x56, 0x60, 0x5c, 0x09, 0xf9, 0x16, 0xf4, 0x17,
-+ 0x0f, 0xf6, 0x4c, 0xda, 0xe6, 0x67, 0x89, 0x9f,
-+ 0xca, 0x6c, 0xe7, 0x9b, 0x04, 0x62, 0x0e, 0x26,
-+ 0xa6, 0x52, 0xbd, 0x29, 0xff, 0xc7, 0xa4, 0x96,
-+ 0xe6, 0x6a, 0x02, 0xa5, 0x2e, 0x7b, 0xfe, 0x97,
-+ 0x68, 0x3e, 0x2e, 0x5f, 0x3b, 0x0f, 0x36, 0xd6,
-+ 0x98, 0x19, 0x59, 0x48, 0xd2, 0xc6, 0xe1, 0x55,
-+ 0x1a, 0x6e, 0xd6, 0xed, 0x2c, 0xba, 0xc3, 0x9e,
-+ 0x64, 0xc9, 0x95, 0x86, 0x35, 0x5e, 0x3e, 0x88,
-+ 0x69, 0x99, 0x4b, 0xee, 0xbe, 0x9a, 0x99, 0xb5,
-+ 0x6e, 0x58, 0xae, 0xdd, 0x22, 0xdb, 0xdd, 0x6b,
-+ 0xfc, 0xaf, 0x90, 0xa3, 0x3d, 0xa4, 0xc1, 0x15,
-+ 0x92, 0x18, 0x8d, 0xd2, 0x4b, 0x7b, 0x06, 0xd1,
-+ 0x37, 0xb5, 0xe2, 0x7c, 0x2c, 0xf0, 0x25, 0xe4,
-+ 0x94, 0x2a, 0xbd, 0xe3, 0x82, 0x70, 0x78, 0xa3,
-+ 0x82, 0x10, 0x5a, 0x90, 0xd7, 0xa4, 0xfa, 0xaf,
-+ 0x1a, 0x88, 0x59, 0xdc, 0x74, 0x12, 0xb4, 0x8e,
-+ 0xd7, 0x19, 0x46, 0xf4, 0x84, 0x69, 0x9f, 0xbb,
-+ 0x70, 0xa8, 0x4c, 0x52, 0x81, 0xa9, 0xff, 0x76,
-+ 0x1c, 0xae, 0xd8, 0x11, 0x3d, 0x7f, 0x7d, 0xc5,
-+ 0x12, 0x59, 0x28, 0x18, 0xc2, 0xa2, 0xb7, 0x1c,
-+ 0x88, 0xf8, 0xd6, 0x1b, 0xa6, 0x7d, 0x9e, 0xde,
-+ 0x29, 0xf8, 0xed, 0xff, 0xeb, 0x92, 0x24, 0x4f,
-+ 0x05, 0xaa, 0xd9, 0x49, 0xba, 0x87, 0x59, 0x51,
-+ 0xc9, 0x20, 0x5c, 0x9b, 0x74, 0xcf, 0x03, 0xd9,
-+ 0x2d, 0x34, 0xc7, 0x5b, 0xa5, 0x40, 0xb2, 0x99,
-+ 0xf5, 0xcb, 0xb4, 0xf6, 0xb7, 0x72, 0x4a, 0xd6,
-+ 0xbd, 0xb0, 0xf3, 0x93, 0xe0, 0x1b, 0xa8, 0x04,
-+ 0x1e, 0x35, 0xd4, 0x80, 0x20, 0xf4, 0x9c, 0x31,
-+ 0x6b, 0x45, 0xb9, 0x15, 0xb0, 0x5e, 0xdd, 0x0a,
-+ 0x33, 0x9c, 0x83, 0xcd, 0x58, 0x89, 0x50, 0x56,
-+ 0xbb, 0x81, 0x00, 0x91, 0x32, 0xf3, 0x1b, 0x3e,
-+ 0xcf, 0x45, 0xe1, 0xf9, 0xe1, 0x2c, 0x26, 0x78,
-+ 0x93, 0x9a, 0x60, 0x46, 0xc9, 0xb5, 0x5e, 0x6a,
-+ 0x28, 0x92, 0x87, 0x3f, 0x63, 0x7b, 0xdb, 0xf7,
-+ 0xd0, 0x13, 0x9d, 0x32, 0x40, 0x5e, 0xcf, 0xfb,
-+ 0x79, 0x68, 0x47, 0x4c, 0xfd, 0x01, 0x17, 0xe6,
-+ 0x97, 0x93, 0x78, 0xbb, 0xa6, 0x27, 0xa3, 0xe8,
-+ 0x1a, 0xe8, 0x94, 0x55, 0x7d, 0x08, 0xe5, 0xdc,
-+ 0x66, 0xa3, 0x69, 0xc8, 0xca, 0xc5, 0xa1, 0x84,
-+ 0x55, 0xde, 0x08, 0x91, 0x16, 0x3a, 0x0c, 0x86,
-+ 0xab, 0x27, 0x2b, 0x64, 0x34, 0x02, 0x6c, 0x76,
-+ 0x8b, 0xc6, 0xaf, 0xcc, 0xe1, 0xd6, 0x8c, 0x2a,
-+ 0x18, 0x3d, 0xa6, 0x1b, 0x37, 0x75, 0x45, 0x73,
-+ 0xc2, 0x75, 0xd7, 0x53, 0x78, 0x3a, 0xd6, 0xe8,
-+ 0x29, 0xd2, 0x4a, 0xa8, 0x1e, 0x82, 0xf6, 0xb6,
-+ 0x81, 0xde, 0x21, 0xed, 0x2b, 0x56, 0xbb, 0xf2,
-+ 0xd0, 0x57, 0xc1, 0x7c, 0xd2, 0x6a, 0xd2, 0x56,
-+ 0xf5, 0x13, 0x5f, 0x1c, 0x6a, 0x0b, 0x74, 0xfb,
-+ 0xe9, 0xfe, 0x9e, 0xea, 0x95, 0xb2, 0x46, 0xab,
-+ 0x0a, 0xfc, 0xfd, 0xf3, 0xbb, 0x04, 0x2b, 0x76,
-+ 0x1b, 0xa4, 0x74, 0xb0, 0xc1, 0x78, 0xc3, 0x69,
-+ 0xe2, 0xb0, 0x01, 0xe1, 0xde, 0x32, 0x4c, 0x8d,
-+ 0x1a, 0xb3, 0x38, 0x08, 0xd5, 0xfc, 0x1f, 0xdc,
-+ 0x0e, 0x2c, 0x9c, 0xb1, 0xa1, 0x63, 0x17, 0x22,
-+ 0xf5, 0x6c, 0x93, 0x70, 0x74, 0x00, 0xf8, 0x39,
-+ 0x01, 0x94, 0xd1, 0x32, 0x23, 0x56, 0x5d, 0xa6,
-+ 0x02, 0x76, 0x76, 0x93, 0xce, 0x2f, 0x19, 0xe9,
-+ 0x17, 0x52, 0xae, 0x6e, 0x2c, 0x6d, 0x61, 0x7f,
-+ 0x3b, 0xaa, 0xe0, 0x52, 0x85, 0xc5, 0x65, 0xc1,
-+ 0xbb, 0x8e, 0x5b, 0x21, 0xd5, 0xc9, 0x78, 0x83,
-+ 0x07, 0x97, 0x4c, 0x62, 0x61, 0x41, 0xd4, 0xfc,
-+ 0xc9, 0x39, 0xe3, 0x9b, 0xd0, 0xcc, 0x75, 0xc4,
-+ 0x97, 0xe6, 0xdd, 0x2a, 0x5f, 0xa6, 0xe8, 0x59,
-+ 0x6c, 0x98, 0xb9, 0x02, 0xe2, 0xa2, 0xd6, 0x68,
-+ 0xee, 0x3b, 0x1d, 0xe3, 0x4d, 0x5b, 0x30, 0xef,
-+ 0x03, 0xf2, 0xeb, 0x18, 0x57, 0x36, 0xe8, 0xa1,
-+ 0xf4, 0x47, 0xfb, 0xcb, 0x8f, 0xcb, 0xc8, 0xf3,
-+ 0x4f, 0x74, 0x9d, 0x9d, 0xb1, 0x8d, 0x14, 0x44,
-+ 0xd9, 0x19, 0xb4, 0x54, 0x4f, 0x75, 0x19, 0x09,
-+ 0xa0, 0x75, 0xbc, 0x3b, 0x82, 0xc6, 0x3f, 0xb8,
-+ 0x83, 0x19, 0x6e, 0xd6, 0x37, 0xfe, 0x6e, 0x8a,
-+ 0x4e, 0xe0, 0x4a, 0xab, 0x7b, 0xc8, 0xb4, 0x1d,
-+ 0xf4, 0xed, 0x27, 0x03, 0x65, 0xa2, 0xa1, 0xae,
-+ 0x11, 0xe7, 0x98, 0x78, 0x48, 0x91, 0xd2, 0xd2,
-+ 0xd4, 0x23, 0x78, 0x50, 0xb1, 0x5b, 0x85, 0x10,
-+ 0x8d, 0xca, 0x5f, 0x0f, 0x71, 0xae, 0x72, 0x9a,
-+ 0xf6, 0x25, 0x19, 0x60, 0x06, 0xf7, 0x10, 0x34,
-+ 0x18, 0x0d, 0xc9, 0x9f, 0x7b, 0x0c, 0x9b, 0x8f,
-+ 0x91, 0x1b, 0x9f, 0xcd, 0x10, 0xee, 0x75, 0xf9,
-+ 0x97, 0x66, 0xfc, 0x4d, 0x33, 0x6e, 0x28, 0x2b,
-+ 0x92, 0x85, 0x4f, 0xab, 0x43, 0x8d, 0x8f, 0x7d,
-+ 0x86, 0xa7, 0xc7, 0xd8, 0xd3, 0x0b, 0x8b, 0x57,
-+ 0xb6, 0x1d, 0x95, 0x0d, 0xe9, 0xbc, 0xd9, 0x03,
-+ 0xd9, 0x10, 0x19, 0xc3, 0x46, 0x63, 0x55, 0x87,
-+ 0x61, 0x79, 0x6c, 0x95, 0x0e, 0x9c, 0xdd, 0xca,
-+ 0xc3, 0xf3, 0x64, 0xf0, 0x7d, 0x76, 0xb7, 0x53,
-+ 0x67, 0x2b, 0x1e, 0x44, 0x56, 0x81, 0xea, 0x8f,
-+ 0x5c, 0x42, 0x16, 0xb8, 0x28, 0xeb, 0x1b, 0x61,
-+ 0x10, 0x1e, 0xbf, 0xec, 0xa8
-+};
-+static const u8 dec_assoc011[] __initconst = {
-+ 0xd6, 0x31, 0xda, 0x5d, 0x42, 0x5e, 0xd7
-+};
-+static const u8 dec_nonce011[] __initconst = {
-+ 0xfd, 0x87, 0xd4, 0xd8, 0x62, 0xfd, 0xec, 0xaa
-+};
-+static const u8 dec_key011[] __initconst = {
-+ 0x35, 0x4e, 0xb5, 0x70, 0x50, 0x42, 0x8a, 0x85,
-+ 0xf2, 0xfb, 0xed, 0x7b, 0xd0, 0x9e, 0x97, 0xca,
-+ 0xfa, 0x98, 0x66, 0x63, 0xee, 0x37, 0xcc, 0x52,
-+ 0xfe, 0xd1, 0xdf, 0x95, 0x15, 0x34, 0x29, 0x38
-+};
-+
-+static const u8 dec_input012[] __initconst = {
-+ 0x52, 0x34, 0xb3, 0x65, 0x3b, 0xb7, 0xe5, 0xd3,
-+ 0xab, 0x49, 0x17, 0x60, 0xd2, 0x52, 0x56, 0xdf,
-+ 0xdf, 0x34, 0x56, 0x82, 0xe2, 0xbe, 0xe5, 0xe1,
-+ 0x28, 0xd1, 0x4e, 0x5f, 0x4f, 0x01, 0x7d, 0x3f,
-+ 0x99, 0x6b, 0x30, 0x6e, 0x1a, 0x7c, 0x4c, 0x8e,
-+ 0x62, 0x81, 0xae, 0x86, 0x3f, 0x6b, 0xd0, 0xb5,
-+ 0xa9, 0xcf, 0x50, 0xf1, 0x02, 0x12, 0xa0, 0x0b,
-+ 0x24, 0xe9, 0xe6, 0x72, 0x89, 0x2c, 0x52, 0x1b,
-+ 0x34, 0x38, 0xf8, 0x75, 0x5f, 0xa0, 0x74, 0xe2,
-+ 0x99, 0xdd, 0xa6, 0x4b, 0x14, 0x50, 0x4e, 0xf1,
-+ 0xbe, 0xd6, 0x9e, 0xdb, 0xb2, 0x24, 0x27, 0x74,
-+ 0x12, 0x4a, 0x78, 0x78, 0x17, 0xa5, 0x58, 0x8e,
-+ 0x2f, 0xf9, 0xf4, 0x8d, 0xee, 0x03, 0x88, 0xae,
-+ 0xb8, 0x29, 0xa1, 0x2f, 0x4b, 0xee, 0x92, 0xbd,
-+ 0x87, 0xb3, 0xce, 0x34, 0x21, 0x57, 0x46, 0x04,
-+ 0x49, 0x0c, 0x80, 0xf2, 0x01, 0x13, 0xa1, 0x55,
-+ 0xb3, 0xff, 0x44, 0x30, 0x3c, 0x1c, 0xd0, 0xef,
-+ 0xbc, 0x18, 0x74, 0x26, 0xad, 0x41, 0x5b, 0x5b,
-+ 0x3e, 0x9a, 0x7a, 0x46, 0x4f, 0x16, 0xd6, 0x74,
-+ 0x5a, 0xb7, 0x3a, 0x28, 0x31, 0xd8, 0xae, 0x26,
-+ 0xac, 0x50, 0x53, 0x86, 0xf2, 0x56, 0xd7, 0x3f,
-+ 0x29, 0xbc, 0x45, 0x68, 0x8e, 0xcb, 0x98, 0x64,
-+ 0xdd, 0xc9, 0xba, 0xb8, 0x4b, 0x7b, 0x82, 0xdd,
-+ 0x14, 0xa7, 0xcb, 0x71, 0x72, 0x00, 0x5c, 0xad,
-+ 0x7b, 0x6a, 0x89, 0xa4, 0x3d, 0xbf, 0xb5, 0x4b,
-+ 0x3e, 0x7c, 0x5a, 0xcf, 0xb8, 0xa1, 0xc5, 0x6e,
-+ 0xc8, 0xb6, 0x31, 0x57, 0x7b, 0xdf, 0xa5, 0x7e,
-+ 0xb1, 0xd6, 0x42, 0x2a, 0x31, 0x36, 0xd1, 0xd0,
-+ 0x3f, 0x7a, 0xe5, 0x94, 0xd6, 0x36, 0xa0, 0x6f,
-+ 0xb7, 0x40, 0x7d, 0x37, 0xc6, 0x55, 0x7c, 0x50,
-+ 0x40, 0x6d, 0x29, 0x89, 0xe3, 0x5a, 0xae, 0x97,
-+ 0xe7, 0x44, 0x49, 0x6e, 0xbd, 0x81, 0x3d, 0x03,
-+ 0x93, 0x06, 0x12, 0x06, 0xe2, 0x41, 0x12, 0x4a,
-+ 0xf1, 0x6a, 0xa4, 0x58, 0xa2, 0xfb, 0xd2, 0x15,
-+ 0xba, 0xc9, 0x79, 0xc9, 0xce, 0x5e, 0x13, 0xbb,
-+ 0xf1, 0x09, 0x04, 0xcc, 0xfd, 0xe8, 0x51, 0x34,
-+ 0x6a, 0xe8, 0x61, 0x88, 0xda, 0xed, 0x01, 0x47,
-+ 0x84, 0xf5, 0x73, 0x25, 0xf9, 0x1c, 0x42, 0x86,
-+ 0x07, 0xf3, 0x5b, 0x1a, 0x01, 0xb3, 0xeb, 0x24,
-+ 0x32, 0x8d, 0xf6, 0xed, 0x7c, 0x4b, 0xeb, 0x3c,
-+ 0x36, 0x42, 0x28, 0xdf, 0xdf, 0xb6, 0xbe, 0xd9,
-+ 0x8c, 0x52, 0xd3, 0x2b, 0x08, 0x90, 0x8c, 0xe7,
-+ 0x98, 0x31, 0xe2, 0x32, 0x8e, 0xfc, 0x11, 0x48,
-+ 0x00, 0xa8, 0x6a, 0x42, 0x4a, 0x02, 0xc6, 0x4b,
-+ 0x09, 0xf1, 0xe3, 0x49, 0xf3, 0x45, 0x1f, 0x0e,
-+ 0xbc, 0x56, 0xe2, 0xe4, 0xdf, 0xfb, 0xeb, 0x61,
-+ 0xfa, 0x24, 0xc1, 0x63, 0x75, 0xbb, 0x47, 0x75,
-+ 0xaf, 0xe1, 0x53, 0x16, 0x96, 0x21, 0x85, 0x26,
-+ 0x11, 0xb3, 0x76, 0xe3, 0x23, 0xa1, 0x6b, 0x74,
-+ 0x37, 0xd0, 0xde, 0x06, 0x90, 0x71, 0x5d, 0x43,
-+ 0x88, 0x9b, 0x00, 0x54, 0xa6, 0x75, 0x2f, 0xa1,
-+ 0xc2, 0x0b, 0x73, 0x20, 0x1d, 0xb6, 0x21, 0x79,
-+ 0x57, 0x3f, 0xfa, 0x09, 0xbe, 0x8a, 0x33, 0xc3,
-+ 0x52, 0xf0, 0x1d, 0x82, 0x31, 0xd1, 0x55, 0xb5,
-+ 0x6c, 0x99, 0x25, 0xcf, 0x5c, 0x32, 0xce, 0xe9,
-+ 0x0d, 0xfa, 0x69, 0x2c, 0xd5, 0x0d, 0xc5, 0x6d,
-+ 0x86, 0xd0, 0x0c, 0x3b, 0x06, 0x50, 0x79, 0xe8,
-+ 0xc3, 0xae, 0x04, 0xe6, 0xcd, 0x51, 0xe4, 0x26,
-+ 0x9b, 0x4f, 0x7e, 0xa6, 0x0f, 0xab, 0xd8, 0xe5,
-+ 0xde, 0xa9, 0x00, 0x95, 0xbe, 0xa3, 0x9d, 0x5d,
-+ 0xb2, 0x09, 0x70, 0x18, 0x1c, 0xf0, 0xac, 0x29,
-+ 0x23, 0x02, 0x29, 0x28, 0xd2, 0x74, 0x35, 0x57,
-+ 0x62, 0x0f, 0x24, 0xea, 0x5e, 0x33, 0xc2, 0x92,
-+ 0xf3, 0x78, 0x4d, 0x30, 0x1e, 0xa1, 0x99, 0xa9,
-+ 0x82, 0xb0, 0x42, 0x31, 0x8d, 0xad, 0x8a, 0xbc,
-+ 0xfc, 0xd4, 0x57, 0x47, 0x3e, 0xb4, 0x50, 0xdd,
-+ 0x6e, 0x2c, 0x80, 0x4d, 0x22, 0xf1, 0xfb, 0x57,
-+ 0xc4, 0xdd, 0x17, 0xe1, 0x8a, 0x36, 0x4a, 0xb3,
-+ 0x37, 0xca, 0xc9, 0x4e, 0xab, 0xd5, 0x69, 0xc4,
-+ 0xf4, 0xbc, 0x0b, 0x3b, 0x44, 0x4b, 0x29, 0x9c,
-+ 0xee, 0xd4, 0x35, 0x22, 0x21, 0xb0, 0x1f, 0x27,
-+ 0x64, 0xa8, 0x51, 0x1b, 0xf0, 0x9f, 0x19, 0x5c,
-+ 0xfb, 0x5a, 0x64, 0x74, 0x70, 0x45, 0x09, 0xf5,
-+ 0x64, 0xfe, 0x1a, 0x2d, 0xc9, 0x14, 0x04, 0x14,
-+ 0xcf, 0xd5, 0x7d, 0x60, 0xaf, 0x94, 0x39, 0x94,
-+ 0xe2, 0x7d, 0x79, 0x82, 0xd0, 0x65, 0x3b, 0x6b,
-+ 0x9c, 0x19, 0x84, 0xb4, 0x6d, 0xb3, 0x0c, 0x99,
-+ 0xc0, 0x56, 0xa8, 0xbd, 0x73, 0xce, 0x05, 0x84,
-+ 0x3e, 0x30, 0xaa, 0xc4, 0x9b, 0x1b, 0x04, 0x2a,
-+ 0x9f, 0xd7, 0x43, 0x2b, 0x23, 0xdf, 0xbf, 0xaa,
-+ 0xd5, 0xc2, 0x43, 0x2d, 0x70, 0xab, 0xdc, 0x75,
-+ 0xad, 0xac, 0xf7, 0xc0, 0xbe, 0x67, 0xb2, 0x74,
-+ 0xed, 0x67, 0x10, 0x4a, 0x92, 0x60, 0xc1, 0x40,
-+ 0x50, 0x19, 0x8a, 0x8a, 0x8c, 0x09, 0x0e, 0x72,
-+ 0xe1, 0x73, 0x5e, 0xe8, 0x41, 0x85, 0x63, 0x9f,
-+ 0x3f, 0xd7, 0x7d, 0xc4, 0xfb, 0x22, 0x5d, 0x92,
-+ 0x6c, 0xb3, 0x1e, 0xe2, 0x50, 0x2f, 0x82, 0xa8,
-+ 0x28, 0xc0, 0xb5, 0xd7, 0x5f, 0x68, 0x0d, 0x2c,
-+ 0x2d, 0xaf, 0x7e, 0xfa, 0x2e, 0x08, 0x0f, 0x1f,
-+ 0x70, 0x9f, 0xe9, 0x19, 0x72, 0x55, 0xf8, 0xfb,
-+ 0x51, 0xd2, 0x33, 0x5d, 0xa0, 0xd3, 0x2b, 0x0a,
-+ 0x6c, 0xbc, 0x4e, 0xcf, 0x36, 0x4d, 0xdc, 0x3b,
-+ 0xe9, 0x3e, 0x81, 0x7c, 0x61, 0xdb, 0x20, 0x2d,
-+ 0x3a, 0xc3, 0xb3, 0x0c, 0x1e, 0x00, 0xb9, 0x7c,
-+ 0xf5, 0xca, 0x10, 0x5f, 0x3a, 0x71, 0xb3, 0xe4,
-+ 0x20, 0xdb, 0x0c, 0x2a, 0x98, 0x63, 0x45, 0x00,
-+ 0x58, 0xf6, 0x68, 0xe4, 0x0b, 0xda, 0x13, 0x3b,
-+ 0x60, 0x5c, 0x76, 0xdb, 0xb9, 0x97, 0x71, 0xe4,
-+ 0xd9, 0xb7, 0xdb, 0xbd, 0x68, 0xc7, 0x84, 0x84,
-+ 0xaa, 0x7c, 0x68, 0x62, 0x5e, 0x16, 0xfc, 0xba,
-+ 0x72, 0xaa, 0x9a, 0xa9, 0xeb, 0x7c, 0x75, 0x47,
-+ 0x97, 0x7e, 0xad, 0xe2, 0xd9, 0x91, 0xe8, 0xe4,
-+ 0xa5, 0x31, 0xd7, 0x01, 0x8e, 0xa2, 0x11, 0x88,
-+ 0x95, 0xb9, 0xf2, 0x9b, 0xd3, 0x7f, 0x1b, 0x81,
-+ 0x22, 0xf7, 0x98, 0x60, 0x0a, 0x64, 0xa6, 0xc1,
-+ 0xf6, 0x49, 0xc7, 0xe3, 0x07, 0x4d, 0x94, 0x7a,
-+ 0xcf, 0x6e, 0x68, 0x0c, 0x1b, 0x3f, 0x6e, 0x2e,
-+ 0xee, 0x92, 0xfa, 0x52, 0xb3, 0x59, 0xf8, 0xf1,
-+ 0x8f, 0x6a, 0x66, 0xa3, 0x82, 0x76, 0x4a, 0x07,
-+ 0x1a, 0xc7, 0xdd, 0xf5, 0xda, 0x9c, 0x3c, 0x24,
-+ 0xbf, 0xfd, 0x42, 0xa1, 0x10, 0x64, 0x6a, 0x0f,
-+ 0x89, 0xee, 0x36, 0xa5, 0xce, 0x99, 0x48, 0x6a,
-+ 0xf0, 0x9f, 0x9e, 0x69, 0xa4, 0x40, 0x20, 0xe9,
-+ 0x16, 0x15, 0xf7, 0xdb, 0x75, 0x02, 0xcb, 0xe9,
-+ 0x73, 0x8b, 0x3b, 0x49, 0x2f, 0xf0, 0xaf, 0x51,
-+ 0x06, 0x5c, 0xdf, 0x27, 0x27, 0x49, 0x6a, 0xd1,
-+ 0xcc, 0xc7, 0xb5, 0x63, 0xb5, 0xfc, 0xb8, 0x5c,
-+ 0x87, 0x7f, 0x84, 0xb4, 0xcc, 0x14, 0xa9, 0x53,
-+ 0xda, 0xa4, 0x56, 0xf8, 0xb6, 0x1b, 0xcc, 0x40,
-+ 0x27, 0x52, 0x06, 0x5a, 0x13, 0x81, 0xd7, 0x3a,
-+ 0xd4, 0x3b, 0xfb, 0x49, 0x65, 0x31, 0x33, 0xb2,
-+ 0xfa, 0xcd, 0xad, 0x58, 0x4e, 0x2b, 0xae, 0xd2,
-+ 0x20, 0xfb, 0x1a, 0x48, 0xb4, 0x3f, 0x9a, 0xd8,
-+ 0x7a, 0x35, 0x4a, 0xc8, 0xee, 0x88, 0x5e, 0x07,
-+ 0x66, 0x54, 0xb9, 0xec, 0x9f, 0xa3, 0xe3, 0xb9,
-+ 0x37, 0xaa, 0x49, 0x76, 0x31, 0xda, 0x74, 0x2d,
-+ 0x3c, 0xa4, 0x65, 0x10, 0x32, 0x38, 0xf0, 0xde,
-+ 0xd3, 0x99, 0x17, 0xaa, 0x71, 0xaa, 0x8f, 0x0f,
-+ 0x8c, 0xaf, 0xa2, 0xf8, 0x5d, 0x64, 0xba, 0x1d,
-+ 0xa3, 0xef, 0x96, 0x73, 0xe8, 0xa1, 0x02, 0x8d,
-+ 0x0c, 0x6d, 0xb8, 0x06, 0x90, 0xb8, 0x08, 0x56,
-+ 0x2c, 0xa7, 0x06, 0xc9, 0xc2, 0x38, 0xdb, 0x7c,
-+ 0x63, 0xb1, 0x57, 0x8e, 0xea, 0x7c, 0x79, 0xf3,
-+ 0x49, 0x1d, 0xfe, 0x9f, 0xf3, 0x6e, 0xb1, 0x1d,
-+ 0xba, 0x19, 0x80, 0x1a, 0x0a, 0xd3, 0xb0, 0x26,
-+ 0x21, 0x40, 0xb1, 0x7c, 0xf9, 0x4d, 0x8d, 0x10,
-+ 0xc1, 0x7e, 0xf4, 0xf6, 0x3c, 0xa8, 0xfd, 0x7c,
-+ 0xa3, 0x92, 0xb2, 0x0f, 0xaa, 0xcc, 0xa6, 0x11,
-+ 0xfe, 0x04, 0xe3, 0xd1, 0x7a, 0x32, 0x89, 0xdf,
-+ 0x0d, 0xc4, 0x8f, 0x79, 0x6b, 0xca, 0x16, 0x7c,
-+ 0x6e, 0xf9, 0xad, 0x0f, 0xf6, 0xfe, 0x27, 0xdb,
-+ 0xc4, 0x13, 0x70, 0xf1, 0x62, 0x1a, 0x4f, 0x79,
-+ 0x40, 0xc9, 0x9b, 0x8b, 0x21, 0xea, 0x84, 0xfa,
-+ 0xf5, 0xf1, 0x89, 0xce, 0xb7, 0x55, 0x0a, 0x80,
-+ 0x39, 0x2f, 0x55, 0x36, 0x16, 0x9c, 0x7b, 0x08,
-+ 0xbd, 0x87, 0x0d, 0xa5, 0x32, 0xf1, 0x52, 0x7c,
-+ 0xe8, 0x55, 0x60, 0x5b, 0xd7, 0x69, 0xe4, 0xfc,
-+ 0xfa, 0x12, 0x85, 0x96, 0xea, 0x50, 0x28, 0xab,
-+ 0x8a, 0xf7, 0xbb, 0x0e, 0x53, 0x74, 0xca, 0xa6,
-+ 0x27, 0x09, 0xc2, 0xb5, 0xde, 0x18, 0x14, 0xd9,
-+ 0xea, 0xe5, 0x29, 0x1c, 0x40, 0x56, 0xcf, 0xd7,
-+ 0xae, 0x05, 0x3f, 0x65, 0xaf, 0x05, 0x73, 0xe2,
-+ 0x35, 0x96, 0x27, 0x07, 0x14, 0xc0, 0xad, 0x33,
-+ 0xf1, 0xdc, 0x44, 0x7a, 0x89, 0x17, 0x77, 0xd2,
-+ 0x9c, 0x58, 0x60, 0xf0, 0x3f, 0x7b, 0x2d, 0x2e,
-+ 0x57, 0x95, 0x54, 0x87, 0xed, 0xf2, 0xc7, 0x4c,
-+ 0xf0, 0xae, 0x56, 0x29, 0x19, 0x7d, 0x66, 0x4b,
-+ 0x9b, 0x83, 0x84, 0x42, 0x3b, 0x01, 0x25, 0x66,
-+ 0x8e, 0x02, 0xde, 0xb9, 0x83, 0x54, 0x19, 0xf6,
-+ 0x9f, 0x79, 0x0d, 0x67, 0xc5, 0x1d, 0x7a, 0x44,
-+ 0x02, 0x98, 0xa7, 0x16, 0x1c, 0x29, 0x0d, 0x74,
-+ 0xff, 0x85, 0x40, 0x06, 0xef, 0x2c, 0xa9, 0xc6,
-+ 0xf5, 0x53, 0x07, 0x06, 0xae, 0xe4, 0xfa, 0x5f,
-+ 0xd8, 0x39, 0x4d, 0xf1, 0x9b, 0x6b, 0xd9, 0x24,
-+ 0x84, 0xfe, 0x03, 0x4c, 0xb2, 0x3f, 0xdf, 0xa1,
-+ 0x05, 0x9e, 0x50, 0x14, 0x5a, 0xd9, 0x1a, 0xa2,
-+ 0xa7, 0xfa, 0xfa, 0x17, 0xf7, 0x78, 0xd6, 0xb5,
-+ 0x92, 0x61, 0x91, 0xac, 0x36, 0xfa, 0x56, 0x0d,
-+ 0x38, 0x32, 0x18, 0x85, 0x08, 0x58, 0x37, 0xf0,
-+ 0x4b, 0xdb, 0x59, 0xe7, 0xa4, 0x34, 0xc0, 0x1b,
-+ 0x01, 0xaf, 0x2d, 0xde, 0xa1, 0xaa, 0x5d, 0xd3,
-+ 0xec, 0xe1, 0xd4, 0xf7, 0xe6, 0x54, 0x68, 0xf0,
-+ 0x51, 0x97, 0xa7, 0x89, 0xea, 0x24, 0xad, 0xd3,
-+ 0x6e, 0x47, 0x93, 0x8b, 0x4b, 0xb4, 0xf7, 0x1c,
-+ 0x42, 0x06, 0x67, 0xe8, 0x99, 0xf6, 0xf5, 0x7b,
-+ 0x85, 0xb5, 0x65, 0xb5, 0xb5, 0xd2, 0x37, 0xf5,
-+ 0xf3, 0x02, 0xa6, 0x4d, 0x11, 0xa7, 0xdc, 0x51,
-+ 0x09, 0x7f, 0xa0, 0xd8, 0x88, 0x1c, 0x13, 0x71,
-+ 0xae, 0x9c, 0xb7, 0x7b, 0x34, 0xd6, 0x4e, 0x68,
-+ 0x26, 0x83, 0x51, 0xaf, 0x1d, 0xee, 0x8b, 0xbb,
-+ 0x69, 0x43, 0x2b, 0x9e, 0x8a, 0xbc, 0x02, 0x0e,
-+ 0xa0, 0x1b, 0xe0, 0xa8, 0x5f, 0x6f, 0xaf, 0x1b,
-+ 0x8f, 0xe7, 0x64, 0x71, 0x74, 0x11, 0x7e, 0xa8,
-+ 0xd8, 0xf9, 0x97, 0x06, 0xc3, 0xb6, 0xfb, 0xfb,
-+ 0xb7, 0x3d, 0x35, 0x9d, 0x3b, 0x52, 0xed, 0x54,
-+ 0xca, 0xf4, 0x81, 0x01, 0x2d, 0x1b, 0xc3, 0xa7,
-+ 0x00, 0x3d, 0x1a, 0x39, 0x54, 0xe1, 0xf6, 0xff,
-+ 0xed, 0x6f, 0x0b, 0x5a, 0x68, 0xda, 0x58, 0xdd,
-+ 0xa9, 0xcf, 0x5c, 0x4a, 0xe5, 0x09, 0x4e, 0xde,
-+ 0x9d, 0xbc, 0x3e, 0xee, 0x5a, 0x00, 0x3b, 0x2c,
-+ 0x87, 0x10, 0x65, 0x60, 0xdd, 0xd7, 0x56, 0xd1,
-+ 0x4c, 0x64, 0x45, 0xe4, 0x21, 0xec, 0x78, 0xf8,
-+ 0x25, 0x7a, 0x3e, 0x16, 0x5d, 0x09, 0x53, 0x14,
-+ 0xbe, 0x4f, 0xae, 0x87, 0xd8, 0xd1, 0xaa, 0x3c,
-+ 0xf6, 0x3e, 0xa4, 0x70, 0x8c, 0x5e, 0x70, 0xa4,
-+ 0xb3, 0x6b, 0x66, 0x73, 0xd3, 0xbf, 0x31, 0x06,
-+ 0x19, 0x62, 0x93, 0x15, 0xf2, 0x86, 0xe4, 0x52,
-+ 0x7e, 0x53, 0x4c, 0x12, 0x38, 0xcc, 0x34, 0x7d,
-+ 0x57, 0xf6, 0x42, 0x93, 0x8a, 0xc4, 0xee, 0x5c,
-+ 0x8a, 0xe1, 0x52, 0x8f, 0x56, 0x64, 0xf6, 0xa6,
-+ 0xd1, 0x91, 0x57, 0x70, 0xcd, 0x11, 0x76, 0xf5,
-+ 0x59, 0x60, 0x60, 0x3c, 0xc1, 0xc3, 0x0b, 0x7f,
-+ 0x58, 0x1a, 0x50, 0x91, 0xf1, 0x68, 0x8f, 0x6e,
-+ 0x74, 0x74, 0xa8, 0x51, 0x0b, 0xf7, 0x7a, 0x98,
-+ 0x37, 0xf2, 0x0a, 0x0e, 0xa4, 0x97, 0x04, 0xb8,
-+ 0x9b, 0xfd, 0xa0, 0xea, 0xf7, 0x0d, 0xe1, 0xdb,
-+ 0x03, 0xf0, 0x31, 0x29, 0xf8, 0xdd, 0x6b, 0x8b,
-+ 0x5d, 0xd8, 0x59, 0xa9, 0x29, 0xcf, 0x9a, 0x79,
-+ 0x89, 0x19, 0x63, 0x46, 0x09, 0x79, 0x6a, 0x11,
-+ 0xda, 0x63, 0x68, 0x48, 0x77, 0x23, 0xfb, 0x7d,
-+ 0x3a, 0x43, 0xcb, 0x02, 0x3b, 0x7a, 0x6d, 0x10,
-+ 0x2a, 0x9e, 0xac, 0xf1, 0xd4, 0x19, 0xf8, 0x23,
-+ 0x64, 0x1d, 0x2c, 0x5f, 0xf2, 0xb0, 0x5c, 0x23,
-+ 0x27, 0xf7, 0x27, 0x30, 0x16, 0x37, 0xb1, 0x90,
-+ 0xab, 0x38, 0xfb, 0x55, 0xcd, 0x78, 0x58, 0xd4,
-+ 0x7d, 0x43, 0xf6, 0x45, 0x5e, 0x55, 0x8d, 0xb1,
-+ 0x02, 0x65, 0x58, 0xb4, 0x13, 0x4b, 0x36, 0xf7,
-+ 0xcc, 0xfe, 0x3d, 0x0b, 0x82, 0xe2, 0x12, 0x11,
-+ 0xbb, 0xe6, 0xb8, 0x3a, 0x48, 0x71, 0xc7, 0x50,
-+ 0x06, 0x16, 0x3a, 0xe6, 0x7c, 0x05, 0xc7, 0xc8,
-+ 0x4d, 0x2f, 0x08, 0x6a, 0x17, 0x9a, 0x95, 0x97,
-+ 0x50, 0x68, 0xdc, 0x28, 0x18, 0xc4, 0x61, 0x38,
-+ 0xb9, 0xe0, 0x3e, 0x78, 0xdb, 0x29, 0xe0, 0x9f,
-+ 0x52, 0xdd, 0xf8, 0x4f, 0x91, 0xc1, 0xd0, 0x33,
-+ 0xa1, 0x7a, 0x8e, 0x30, 0x13, 0x82, 0x07, 0x9f,
-+ 0xd3, 0x31, 0x0f, 0x23, 0xbe, 0x32, 0x5a, 0x75,
-+ 0xcf, 0x96, 0xb2, 0xec, 0xb5, 0x32, 0xac, 0x21,
-+ 0xd1, 0x82, 0x33, 0xd3, 0x15, 0x74, 0xbd, 0x90,
-+ 0xf1, 0x2c, 0xe6, 0x5f, 0x8d, 0xe3, 0x02, 0xe8,
-+ 0xe9, 0xc4, 0xca, 0x96, 0xeb, 0x0e, 0xbc, 0x91,
-+ 0xf4, 0xb9, 0xea, 0xd9, 0x1b, 0x75, 0xbd, 0xe1,
-+ 0xac, 0x2a, 0x05, 0x37, 0x52, 0x9b, 0x1b, 0x3f,
-+ 0x5a, 0xdc, 0x21, 0xc3, 0x98, 0xbb, 0xaf, 0xa3,
-+ 0xf2, 0x00, 0xbf, 0x0d, 0x30, 0x89, 0x05, 0xcc,
-+ 0xa5, 0x76, 0xf5, 0x06, 0xf0, 0xc6, 0x54, 0x8a,
-+ 0x5d, 0xd4, 0x1e, 0xc1, 0xf2, 0xce, 0xb0, 0x62,
-+ 0xc8, 0xfc, 0x59, 0x42, 0x9a, 0x90, 0x60, 0x55,
-+ 0xfe, 0x88, 0xa5, 0x8b, 0xb8, 0x33, 0x0c, 0x23,
-+ 0x24, 0x0d, 0x15, 0x70, 0x37, 0x1e, 0x3d, 0xf6,
-+ 0xd2, 0xea, 0x92, 0x10, 0xb2, 0xc4, 0x51, 0xac,
-+ 0xf2, 0xac, 0xf3, 0x6b, 0x6c, 0xaa, 0xcf, 0x12,
-+ 0xc5, 0x6c, 0x90, 0x50, 0xb5, 0x0c, 0xfc, 0x1a,
-+ 0x15, 0x52, 0xe9, 0x26, 0xc6, 0x52, 0xa4, 0xe7,
-+ 0x81, 0x69, 0xe1, 0xe7, 0x9e, 0x30, 0x01, 0xec,
-+ 0x84, 0x89, 0xb2, 0x0d, 0x66, 0xdd, 0xce, 0x28,
-+ 0x5c, 0xec, 0x98, 0x46, 0x68, 0x21, 0x9f, 0x88,
-+ 0x3f, 0x1f, 0x42, 0x77, 0xce, 0xd0, 0x61, 0xd4,
-+ 0x20, 0xa7, 0xff, 0x53, 0xad, 0x37, 0xd0, 0x17,
-+ 0x35, 0xc9, 0xfc, 0xba, 0x0a, 0x78, 0x3f, 0xf2,
-+ 0xcc, 0x86, 0x89, 0xe8, 0x4b, 0x3c, 0x48, 0x33,
-+ 0x09, 0x7f, 0xc6, 0xc0, 0xdd, 0xb8, 0xfd, 0x7a,
-+ 0x66, 0x66, 0x65, 0xeb, 0x47, 0xa7, 0x04, 0x28,
-+ 0xa3, 0x19, 0x8e, 0xa9, 0xb1, 0x13, 0x67, 0x62,
-+ 0x70, 0xcf, 0xd6
-+};
-+static const u8 dec_output012[] __initconst = {
-+ 0x74, 0xa6, 0x3e, 0xe4, 0xb1, 0xcb, 0xaf, 0xb0,
-+ 0x40, 0xe5, 0x0f, 0x9e, 0xf1, 0xf2, 0x89, 0xb5,
-+ 0x42, 0x34, 0x8a, 0xa1, 0x03, 0xb7, 0xe9, 0x57,
-+ 0x46, 0xbe, 0x20, 0xe4, 0x6e, 0xb0, 0xeb, 0xff,
-+ 0xea, 0x07, 0x7e, 0xef, 0xe2, 0x55, 0x9f, 0xe5,
-+ 0x78, 0x3a, 0xb7, 0x83, 0xc2, 0x18, 0x40, 0x7b,
-+ 0xeb, 0xcd, 0x81, 0xfb, 0x90, 0x12, 0x9e, 0x46,
-+ 0xa9, 0xd6, 0x4a, 0xba, 0xb0, 0x62, 0xdb, 0x6b,
-+ 0x99, 0xc4, 0xdb, 0x54, 0x4b, 0xb8, 0xa5, 0x71,
-+ 0xcb, 0xcd, 0x63, 0x32, 0x55, 0xfb, 0x31, 0xf0,
-+ 0x38, 0xf5, 0xbe, 0x78, 0xe4, 0x45, 0xce, 0x1b,
-+ 0x6a, 0x5b, 0x0e, 0xf4, 0x16, 0xe4, 0xb1, 0x3d,
-+ 0xf6, 0x63, 0x7b, 0xa7, 0x0c, 0xde, 0x6f, 0x8f,
-+ 0x74, 0xdf, 0xe0, 0x1e, 0x9d, 0xce, 0x8f, 0x24,
-+ 0xef, 0x23, 0x35, 0x33, 0x7b, 0x83, 0x34, 0x23,
-+ 0x58, 0x74, 0x14, 0x77, 0x1f, 0xc2, 0x4f, 0x4e,
-+ 0xc6, 0x89, 0xf9, 0x52, 0x09, 0x37, 0x64, 0x14,
-+ 0xc4, 0x01, 0x6b, 0x9d, 0x77, 0xe8, 0x90, 0x5d,
-+ 0xa8, 0x4a, 0x2a, 0xef, 0x5c, 0x7f, 0xeb, 0xbb,
-+ 0xb2, 0xc6, 0x93, 0x99, 0x66, 0xdc, 0x7f, 0xd4,
-+ 0x9e, 0x2a, 0xca, 0x8d, 0xdb, 0xe7, 0x20, 0xcf,
-+ 0xe4, 0x73, 0xae, 0x49, 0x7d, 0x64, 0x0f, 0x0e,
-+ 0x28, 0x46, 0xa9, 0xa8, 0x32, 0xe4, 0x0e, 0xf6,
-+ 0x51, 0x53, 0xb8, 0x3c, 0xb1, 0xff, 0xa3, 0x33,
-+ 0x41, 0x75, 0xff, 0xf1, 0x6f, 0xf1, 0xfb, 0xbb,
-+ 0x83, 0x7f, 0x06, 0x9b, 0xe7, 0x1b, 0x0a, 0xe0,
-+ 0x5c, 0x33, 0x60, 0x5b, 0xdb, 0x5b, 0xed, 0xfe,
-+ 0xa5, 0x16, 0x19, 0x72, 0xa3, 0x64, 0x23, 0x00,
-+ 0x02, 0xc7, 0xf3, 0x6a, 0x81, 0x3e, 0x44, 0x1d,
-+ 0x79, 0x15, 0x5f, 0x9a, 0xde, 0xe2, 0xfd, 0x1b,
-+ 0x73, 0xc1, 0xbc, 0x23, 0xba, 0x31, 0xd2, 0x50,
-+ 0xd5, 0xad, 0x7f, 0x74, 0xa7, 0xc9, 0xf8, 0x3e,
-+ 0x2b, 0x26, 0x10, 0xf6, 0x03, 0x36, 0x74, 0xe4,
-+ 0x0e, 0x6a, 0x72, 0xb7, 0x73, 0x0a, 0x42, 0x28,
-+ 0xc2, 0xad, 0x5e, 0x03, 0xbe, 0xb8, 0x0b, 0xa8,
-+ 0x5b, 0xd4, 0xb8, 0xba, 0x52, 0x89, 0xb1, 0x9b,
-+ 0xc1, 0xc3, 0x65, 0x87, 0xed, 0xa5, 0xf4, 0x86,
-+ 0xfd, 0x41, 0x80, 0x91, 0x27, 0x59, 0x53, 0x67,
-+ 0x15, 0x78, 0x54, 0x8b, 0x2d, 0x3d, 0xc7, 0xff,
-+ 0x02, 0x92, 0x07, 0x5f, 0x7a, 0x4b, 0x60, 0x59,
-+ 0x3c, 0x6f, 0x5c, 0xd8, 0xec, 0x95, 0xd2, 0xfe,
-+ 0xa0, 0x3b, 0xd8, 0x3f, 0xd1, 0x69, 0xa6, 0xd6,
-+ 0x41, 0xb2, 0xf4, 0x4d, 0x12, 0xf4, 0x58, 0x3e,
-+ 0x66, 0x64, 0x80, 0x31, 0x9b, 0xa8, 0x4c, 0x8b,
-+ 0x07, 0xb2, 0xec, 0x66, 0x94, 0x66, 0x47, 0x50,
-+ 0x50, 0x5f, 0x18, 0x0b, 0x0e, 0xd6, 0xc0, 0x39,
-+ 0x21, 0x13, 0x9e, 0x33, 0xbc, 0x79, 0x36, 0x02,
-+ 0x96, 0x70, 0xf0, 0x48, 0x67, 0x2f, 0x26, 0xe9,
-+ 0x6d, 0x10, 0xbb, 0xd6, 0x3f, 0xd1, 0x64, 0x7a,
-+ 0x2e, 0xbe, 0x0c, 0x61, 0xf0, 0x75, 0x42, 0x38,
-+ 0x23, 0xb1, 0x9e, 0x9f, 0x7c, 0x67, 0x66, 0xd9,
-+ 0x58, 0x9a, 0xf1, 0xbb, 0x41, 0x2a, 0x8d, 0x65,
-+ 0x84, 0x94, 0xfc, 0xdc, 0x6a, 0x50, 0x64, 0xdb,
-+ 0x56, 0x33, 0x76, 0x00, 0x10, 0xed, 0xbe, 0xd2,
-+ 0x12, 0xf6, 0xf6, 0x1b, 0xa2, 0x16, 0xde, 0xae,
-+ 0x31, 0x95, 0xdd, 0xb1, 0x08, 0x7e, 0x4e, 0xee,
-+ 0xe7, 0xf9, 0xa5, 0xfb, 0x5b, 0x61, 0x43, 0x00,
-+ 0x40, 0xf6, 0x7e, 0x02, 0x04, 0x32, 0x4e, 0x0c,
-+ 0xe2, 0x66, 0x0d, 0xd7, 0x07, 0x98, 0x0e, 0xf8,
-+ 0x72, 0x34, 0x6d, 0x95, 0x86, 0xd7, 0xcb, 0x31,
-+ 0x54, 0x47, 0xd0, 0x38, 0x29, 0x9c, 0x5a, 0x68,
-+ 0xd4, 0x87, 0x76, 0xc9, 0xe7, 0x7e, 0xe3, 0xf4,
-+ 0x81, 0x6d, 0x18, 0xcb, 0xc9, 0x05, 0xaf, 0xa0,
-+ 0xfb, 0x66, 0xf7, 0xf1, 0x1c, 0xc6, 0x14, 0x11,
-+ 0x4f, 0x2b, 0x79, 0x42, 0x8b, 0xbc, 0xac, 0xe7,
-+ 0x6c, 0xfe, 0x0f, 0x58, 0xe7, 0x7c, 0x78, 0x39,
-+ 0x30, 0xb0, 0x66, 0x2c, 0x9b, 0x6d, 0x3a, 0xe1,
-+ 0xcf, 0xc9, 0xa4, 0x0e, 0x6d, 0x6d, 0x8a, 0xa1,
-+ 0x3a, 0xe7, 0x28, 0xd4, 0x78, 0x4c, 0xa6, 0xa2,
-+ 0x2a, 0xa6, 0x03, 0x30, 0xd7, 0xa8, 0x25, 0x66,
-+ 0x87, 0x2f, 0x69, 0x5c, 0x4e, 0xdd, 0xa5, 0x49,
-+ 0x5d, 0x37, 0x4a, 0x59, 0xc4, 0xaf, 0x1f, 0xa2,
-+ 0xe4, 0xf8, 0xa6, 0x12, 0x97, 0xd5, 0x79, 0xf5,
-+ 0xe2, 0x4a, 0x2b, 0x5f, 0x61, 0xe4, 0x9e, 0xe3,
-+ 0xee, 0xb8, 0xa7, 0x5b, 0x2f, 0xf4, 0x9e, 0x6c,
-+ 0xfb, 0xd1, 0xc6, 0x56, 0x77, 0xba, 0x75, 0xaa,
-+ 0x3d, 0x1a, 0xa8, 0x0b, 0xb3, 0x68, 0x24, 0x00,
-+ 0x10, 0x7f, 0xfd, 0xd7, 0xa1, 0x8d, 0x83, 0x54,
-+ 0x4f, 0x1f, 0xd8, 0x2a, 0xbe, 0x8a, 0x0c, 0x87,
-+ 0xab, 0xa2, 0xde, 0xc3, 0x39, 0xbf, 0x09, 0x03,
-+ 0xa5, 0xf3, 0x05, 0x28, 0xe1, 0xe1, 0xee, 0x39,
-+ 0x70, 0x9c, 0xd8, 0x81, 0x12, 0x1e, 0x02, 0x40,
-+ 0xd2, 0x6e, 0xf0, 0xeb, 0x1b, 0x3d, 0x22, 0xc6,
-+ 0xe5, 0xe3, 0xb4, 0x5a, 0x98, 0xbb, 0xf0, 0x22,
-+ 0x28, 0x8d, 0xe5, 0xd3, 0x16, 0x48, 0x24, 0xa5,
-+ 0xe6, 0x66, 0x0c, 0xf9, 0x08, 0xf9, 0x7e, 0x1e,
-+ 0xe1, 0x28, 0x26, 0x22, 0xc7, 0xc7, 0x0a, 0x32,
-+ 0x47, 0xfa, 0xa3, 0xbe, 0x3c, 0xc4, 0xc5, 0x53,
-+ 0x0a, 0xd5, 0x94, 0x4a, 0xd7, 0x93, 0xd8, 0x42,
-+ 0x99, 0xb9, 0x0a, 0xdb, 0x56, 0xf7, 0xb9, 0x1c,
-+ 0x53, 0x4f, 0xfa, 0xd3, 0x74, 0xad, 0xd9, 0x68,
-+ 0xf1, 0x1b, 0xdf, 0x61, 0xc6, 0x5e, 0xa8, 0x48,
-+ 0xfc, 0xd4, 0x4a, 0x4c, 0x3c, 0x32, 0xf7, 0x1c,
-+ 0x96, 0x21, 0x9b, 0xf9, 0xa3, 0xcc, 0x5a, 0xce,
-+ 0xd5, 0xd7, 0x08, 0x24, 0xf6, 0x1c, 0xfd, 0xdd,
-+ 0x38, 0xc2, 0x32, 0xe9, 0xb8, 0xe7, 0xb6, 0xfa,
-+ 0x9d, 0x45, 0x13, 0x2c, 0x83, 0xfd, 0x4a, 0x69,
-+ 0x82, 0xcd, 0xdc, 0xb3, 0x76, 0x0c, 0x9e, 0xd8,
-+ 0xf4, 0x1b, 0x45, 0x15, 0xb4, 0x97, 0xe7, 0x58,
-+ 0x34, 0xe2, 0x03, 0x29, 0x5a, 0xbf, 0xb6, 0xe0,
-+ 0x5d, 0x13, 0xd9, 0x2b, 0xb4, 0x80, 0xb2, 0x45,
-+ 0x81, 0x6a, 0x2e, 0x6c, 0x89, 0x7d, 0xee, 0xbb,
-+ 0x52, 0xdd, 0x1f, 0x18, 0xe7, 0x13, 0x6b, 0x33,
-+ 0x0e, 0xea, 0x36, 0x92, 0x77, 0x7b, 0x6d, 0x9c,
-+ 0x5a, 0x5f, 0x45, 0x7b, 0x7b, 0x35, 0x62, 0x23,
-+ 0xd1, 0xbf, 0x0f, 0xd0, 0x08, 0x1b, 0x2b, 0x80,
-+ 0x6b, 0x7e, 0xf1, 0x21, 0x47, 0xb0, 0x57, 0xd1,
-+ 0x98, 0x72, 0x90, 0x34, 0x1c, 0x20, 0x04, 0xff,
-+ 0x3d, 0x5c, 0xee, 0x0e, 0x57, 0x5f, 0x6f, 0x24,
-+ 0x4e, 0x3c, 0xea, 0xfc, 0xa5, 0xa9, 0x83, 0xc9,
-+ 0x61, 0xb4, 0x51, 0x24, 0xf8, 0x27, 0x5e, 0x46,
-+ 0x8c, 0xb1, 0x53, 0x02, 0x96, 0x35, 0xba, 0xb8,
-+ 0x4c, 0x71, 0xd3, 0x15, 0x59, 0x35, 0x22, 0x20,
-+ 0xad, 0x03, 0x9f, 0x66, 0x44, 0x3b, 0x9c, 0x35,
-+ 0x37, 0x1f, 0x9b, 0xbb, 0xf3, 0xdb, 0x35, 0x63,
-+ 0x30, 0x64, 0xaa, 0xa2, 0x06, 0xa8, 0x5d, 0xbb,
-+ 0xe1, 0x9f, 0x70, 0xec, 0x82, 0x11, 0x06, 0x36,
-+ 0xec, 0x8b, 0x69, 0x66, 0x24, 0x44, 0xc9, 0x4a,
-+ 0x57, 0xbb, 0x9b, 0x78, 0x13, 0xce, 0x9c, 0x0c,
-+ 0xba, 0x92, 0x93, 0x63, 0xb8, 0xe2, 0x95, 0x0f,
-+ 0x0f, 0x16, 0x39, 0x52, 0xfd, 0x3a, 0x6d, 0x02,
-+ 0x4b, 0xdf, 0x13, 0xd3, 0x2a, 0x22, 0xb4, 0x03,
-+ 0x7c, 0x54, 0x49, 0x96, 0x68, 0x54, 0x10, 0xfa,
-+ 0xef, 0xaa, 0x6c, 0xe8, 0x22, 0xdc, 0x71, 0x16,
-+ 0x13, 0x1a, 0xf6, 0x28, 0xe5, 0x6d, 0x77, 0x3d,
-+ 0xcd, 0x30, 0x63, 0xb1, 0x70, 0x52, 0xa1, 0xc5,
-+ 0x94, 0x5f, 0xcf, 0xe8, 0xb8, 0x26, 0x98, 0xf7,
-+ 0x06, 0xa0, 0x0a, 0x70, 0xfa, 0x03, 0x80, 0xac,
-+ 0xc1, 0xec, 0xd6, 0x4c, 0x54, 0xd7, 0xfe, 0x47,
-+ 0xb6, 0x88, 0x4a, 0xf7, 0x71, 0x24, 0xee, 0xf3,
-+ 0xd2, 0xc2, 0x4a, 0x7f, 0xfe, 0x61, 0xc7, 0x35,
-+ 0xc9, 0x37, 0x67, 0xcb, 0x24, 0x35, 0xda, 0x7e,
-+ 0xca, 0x5f, 0xf3, 0x8d, 0xd4, 0x13, 0x8e, 0xd6,
-+ 0xcb, 0x4d, 0x53, 0x8f, 0x53, 0x1f, 0xc0, 0x74,
-+ 0xf7, 0x53, 0xb9, 0x5e, 0x23, 0x37, 0xba, 0x6e,
-+ 0xe3, 0x9d, 0x07, 0x55, 0x25, 0x7b, 0xe6, 0x2a,
-+ 0x64, 0xd1, 0x32, 0xdd, 0x54, 0x1b, 0x4b, 0xc0,
-+ 0xe1, 0xd7, 0x69, 0x58, 0xf8, 0x93, 0x29, 0xc4,
-+ 0xdd, 0x23, 0x2f, 0xa5, 0xfc, 0x9d, 0x7e, 0xf8,
-+ 0xd4, 0x90, 0xcd, 0x82, 0x55, 0xdc, 0x16, 0x16,
-+ 0x9f, 0x07, 0x52, 0x9b, 0x9d, 0x25, 0xed, 0x32,
-+ 0xc5, 0x7b, 0xdf, 0xf6, 0x83, 0x46, 0x3d, 0x65,
-+ 0xb7, 0xef, 0x87, 0x7a, 0x12, 0x69, 0x8f, 0x06,
-+ 0x7c, 0x51, 0x15, 0x4a, 0x08, 0xe8, 0xac, 0x9a,
-+ 0x0c, 0x24, 0xa7, 0x27, 0xd8, 0x46, 0x2f, 0xe7,
-+ 0x01, 0x0e, 0x1c, 0xc6, 0x91, 0xb0, 0x6e, 0x85,
-+ 0x65, 0xf0, 0x29, 0x0d, 0x2e, 0x6b, 0x3b, 0xfb,
-+ 0x4b, 0xdf, 0xe4, 0x80, 0x93, 0x03, 0x66, 0x46,
-+ 0x3e, 0x8a, 0x6e, 0xf3, 0x5e, 0x4d, 0x62, 0x0e,
-+ 0x49, 0x05, 0xaf, 0xd4, 0xf8, 0x21, 0x20, 0x61,
-+ 0x1d, 0x39, 0x17, 0xf4, 0x61, 0x47, 0x95, 0xfb,
-+ 0x15, 0x2e, 0xb3, 0x4f, 0xd0, 0x5d, 0xf5, 0x7d,
-+ 0x40, 0xda, 0x90, 0x3c, 0x6b, 0xcb, 0x17, 0x00,
-+ 0x13, 0x3b, 0x64, 0x34, 0x1b, 0xf0, 0xf2, 0xe5,
-+ 0x3b, 0xb2, 0xc7, 0xd3, 0x5f, 0x3a, 0x44, 0xa6,
-+ 0x9b, 0xb7, 0x78, 0x0e, 0x42, 0x5d, 0x4c, 0xc1,
-+ 0xe9, 0xd2, 0xcb, 0xb7, 0x78, 0xd1, 0xfe, 0x9a,
-+ 0xb5, 0x07, 0xe9, 0xe0, 0xbe, 0xe2, 0x8a, 0xa7,
-+ 0x01, 0x83, 0x00, 0x8c, 0x5c, 0x08, 0xe6, 0x63,
-+ 0x12, 0x92, 0xb7, 0xb7, 0xa6, 0x19, 0x7d, 0x38,
-+ 0x13, 0x38, 0x92, 0x87, 0x24, 0xf9, 0x48, 0xb3,
-+ 0x5e, 0x87, 0x6a, 0x40, 0x39, 0x5c, 0x3f, 0xed,
-+ 0x8f, 0xee, 0xdb, 0x15, 0x82, 0x06, 0xda, 0x49,
-+ 0x21, 0x2b, 0xb5, 0xbf, 0x32, 0x7c, 0x9f, 0x42,
-+ 0x28, 0x63, 0xcf, 0xaf, 0x1e, 0xf8, 0xc6, 0xa0,
-+ 0xd1, 0x02, 0x43, 0x57, 0x62, 0xec, 0x9b, 0x0f,
-+ 0x01, 0x9e, 0x71, 0xd8, 0x87, 0x9d, 0x01, 0xc1,
-+ 0x58, 0x77, 0xd9, 0xaf, 0xb1, 0x10, 0x7e, 0xdd,
-+ 0xa6, 0x50, 0x96, 0xe5, 0xf0, 0x72, 0x00, 0x6d,
-+ 0x4b, 0xf8, 0x2a, 0x8f, 0x19, 0xf3, 0x22, 0x88,
-+ 0x11, 0x4a, 0x8b, 0x7c, 0xfd, 0xb7, 0xed, 0xe1,
-+ 0xf6, 0x40, 0x39, 0xe0, 0xe9, 0xf6, 0x3d, 0x25,
-+ 0xe6, 0x74, 0x3c, 0x58, 0x57, 0x7f, 0xe1, 0x22,
-+ 0x96, 0x47, 0x31, 0x91, 0xba, 0x70, 0x85, 0x28,
-+ 0x6b, 0x9f, 0x6e, 0x25, 0xac, 0x23, 0x66, 0x2f,
-+ 0x29, 0x88, 0x28, 0xce, 0x8c, 0x5c, 0x88, 0x53,
-+ 0xd1, 0x3b, 0xcc, 0x6a, 0x51, 0xb2, 0xe1, 0x28,
-+ 0x3f, 0x91, 0xb4, 0x0d, 0x00, 0x3a, 0xe3, 0xf8,
-+ 0xc3, 0x8f, 0xd7, 0x96, 0x62, 0x0e, 0x2e, 0xfc,
-+ 0xc8, 0x6c, 0x77, 0xa6, 0x1d, 0x22, 0xc1, 0xb8,
-+ 0xe6, 0x61, 0xd7, 0x67, 0x36, 0x13, 0x7b, 0xbb,
-+ 0x9b, 0x59, 0x09, 0xa6, 0xdf, 0xf7, 0x6b, 0xa3,
-+ 0x40, 0x1a, 0xf5, 0x4f, 0xb4, 0xda, 0xd3, 0xf3,
-+ 0x81, 0x93, 0xc6, 0x18, 0xd9, 0x26, 0xee, 0xac,
-+ 0xf0, 0xaa, 0xdf, 0xc5, 0x9c, 0xca, 0xc2, 0xa2,
-+ 0xcc, 0x7b, 0x5c, 0x24, 0xb0, 0xbc, 0xd0, 0x6a,
-+ 0x4d, 0x89, 0x09, 0xb8, 0x07, 0xfe, 0x87, 0xad,
-+ 0x0a, 0xea, 0xb8, 0x42, 0xf9, 0x5e, 0xb3, 0x3e,
-+ 0x36, 0x4c, 0xaf, 0x75, 0x9e, 0x1c, 0xeb, 0xbd,
-+ 0xbc, 0xbb, 0x80, 0x40, 0xa7, 0x3a, 0x30, 0xbf,
-+ 0xa8, 0x44, 0xf4, 0xeb, 0x38, 0xad, 0x29, 0xba,
-+ 0x23, 0xed, 0x41, 0x0c, 0xea, 0xd2, 0xbb, 0x41,
-+ 0x18, 0xd6, 0xb9, 0xba, 0x65, 0x2b, 0xa3, 0x91,
-+ 0x6d, 0x1f, 0xa9, 0xf4, 0xd1, 0x25, 0x8d, 0x4d,
-+ 0x38, 0xff, 0x64, 0xa0, 0xec, 0xde, 0xa6, 0xb6,
-+ 0x79, 0xab, 0x8e, 0x33, 0x6c, 0x47, 0xde, 0xaf,
-+ 0x94, 0xa4, 0xa5, 0x86, 0x77, 0x55, 0x09, 0x92,
-+ 0x81, 0x31, 0x76, 0xc7, 0x34, 0x22, 0x89, 0x8e,
-+ 0x3d, 0x26, 0x26, 0xd7, 0xfc, 0x1e, 0x16, 0x72,
-+ 0x13, 0x33, 0x63, 0xd5, 0x22, 0xbe, 0xb8, 0x04,
-+ 0x34, 0x84, 0x41, 0xbb, 0x80, 0xd0, 0x9f, 0x46,
-+ 0x48, 0x07, 0xa7, 0xfc, 0x2b, 0x3a, 0x75, 0x55,
-+ 0x8c, 0xc7, 0x6a, 0xbd, 0x7e, 0x46, 0x08, 0x84,
-+ 0x0f, 0xd5, 0x74, 0xc0, 0x82, 0x8e, 0xaa, 0x61,
-+ 0x05, 0x01, 0xb2, 0x47, 0x6e, 0x20, 0x6a, 0x2d,
-+ 0x58, 0x70, 0x48, 0x32, 0xa7, 0x37, 0xd2, 0xb8,
-+ 0x82, 0x1a, 0x51, 0xb9, 0x61, 0xdd, 0xfd, 0x9d,
-+ 0x6b, 0x0e, 0x18, 0x97, 0xf8, 0x45, 0x5f, 0x87,
-+ 0x10, 0xcf, 0x34, 0x72, 0x45, 0x26, 0x49, 0x70,
-+ 0xe7, 0xa3, 0x78, 0xe0, 0x52, 0x89, 0x84, 0x94,
-+ 0x83, 0x82, 0xc2, 0x69, 0x8f, 0xe3, 0xe1, 0x3f,
-+ 0x60, 0x74, 0x88, 0xc4, 0xf7, 0x75, 0x2c, 0xfb,
-+ 0xbd, 0xb6, 0xc4, 0x7e, 0x10, 0x0a, 0x6c, 0x90,
-+ 0x04, 0x9e, 0xc3, 0x3f, 0x59, 0x7c, 0xce, 0x31,
-+ 0x18, 0x60, 0x57, 0x73, 0x46, 0x94, 0x7d, 0x06,
-+ 0xa0, 0x6d, 0x44, 0xec, 0xa2, 0x0a, 0x9e, 0x05,
-+ 0x15, 0xef, 0xca, 0x5c, 0xbf, 0x00, 0xeb, 0xf7,
-+ 0x3d, 0x32, 0xd4, 0xa5, 0xef, 0x49, 0x89, 0x5e,
-+ 0x46, 0xb0, 0xa6, 0x63, 0x5b, 0x8a, 0x73, 0xae,
-+ 0x6f, 0xd5, 0x9d, 0xf8, 0x4f, 0x40, 0xb5, 0xb2,
-+ 0x6e, 0xd3, 0xb6, 0x01, 0xa9, 0x26, 0xa2, 0x21,
-+ 0xcf, 0x33, 0x7a, 0x3a, 0xa4, 0x23, 0x13, 0xb0,
-+ 0x69, 0x6a, 0xee, 0xce, 0xd8, 0x9d, 0x01, 0x1d,
-+ 0x50, 0xc1, 0x30, 0x6c, 0xb1, 0xcd, 0xa0, 0xf0,
-+ 0xf0, 0xa2, 0x64, 0x6f, 0xbb, 0xbf, 0x5e, 0xe6,
-+ 0xab, 0x87, 0xb4, 0x0f, 0x4f, 0x15, 0xaf, 0xb5,
-+ 0x25, 0xa1, 0xb2, 0xd0, 0x80, 0x2c, 0xfb, 0xf9,
-+ 0xfe, 0xd2, 0x33, 0xbb, 0x76, 0xfe, 0x7c, 0xa8,
-+ 0x66, 0xf7, 0xe7, 0x85, 0x9f, 0x1f, 0x85, 0x57,
-+ 0x88, 0xe1, 0xe9, 0x63, 0xe4, 0xd8, 0x1c, 0xa1,
-+ 0xfb, 0xda, 0x44, 0x05, 0x2e, 0x1d, 0x3a, 0x1c,
-+ 0xff, 0xc8, 0x3b, 0xc0, 0xfe, 0xda, 0x22, 0x0b,
-+ 0x43, 0xd6, 0x88, 0x39, 0x4c, 0x4a, 0xa6, 0x69,
-+ 0x18, 0x93, 0x42, 0x4e, 0xb5, 0xcc, 0x66, 0x0d,
-+ 0x09, 0xf8, 0x1e, 0x7c, 0xd3, 0x3c, 0x99, 0x0d,
-+ 0x50, 0x1d, 0x62, 0xe9, 0x57, 0x06, 0xbf, 0x19,
-+ 0x88, 0xdd, 0xad, 0x7b, 0x4f, 0xf9, 0xc7, 0x82,
-+ 0x6d, 0x8d, 0xc8, 0xc4, 0xc5, 0x78, 0x17, 0x20,
-+ 0x15, 0xc5, 0x52, 0x41, 0xcf, 0x5b, 0xd6, 0x7f,
-+ 0x94, 0x02, 0x41, 0xe0, 0x40, 0x22, 0x03, 0x5e,
-+ 0xd1, 0x53, 0xd4, 0x86, 0xd3, 0x2c, 0x9f, 0x0f,
-+ 0x96, 0xe3, 0x6b, 0x9a, 0x76, 0x32, 0x06, 0x47,
-+ 0x4b, 0x11, 0xb3, 0xdd, 0x03, 0x65, 0xbd, 0x9b,
-+ 0x01, 0xda, 0x9c, 0xb9, 0x7e, 0x3f, 0x6a, 0xc4,
-+ 0x7b, 0xea, 0xd4, 0x3c, 0xb9, 0xfb, 0x5c, 0x6b,
-+ 0x64, 0x33, 0x52, 0xba, 0x64, 0x78, 0x8f, 0xa4,
-+ 0xaf, 0x7a, 0x61, 0x8d, 0xbc, 0xc5, 0x73, 0xe9,
-+ 0x6b, 0x58, 0x97, 0x4b, 0xbf, 0x63, 0x22, 0xd3,
-+ 0x37, 0x02, 0x54, 0xc5, 0xb9, 0x16, 0x4a, 0xf0,
-+ 0x19, 0xd8, 0x94, 0x57, 0xb8, 0x8a, 0xb3, 0x16,
-+ 0x3b, 0xd0, 0x84, 0x8e, 0x67, 0xa6, 0xa3, 0x7d,
-+ 0x78, 0xec, 0x00
-+};
-+static const u8 dec_assoc012[] __initconst = {
-+ 0xb1, 0x69, 0x83, 0x87, 0x30, 0xaa, 0x5d, 0xb8,
-+ 0x77, 0xe8, 0x21, 0xff, 0x06, 0x59, 0x35, 0xce,
-+ 0x75, 0xfe, 0x38, 0xef, 0xb8, 0x91, 0x43, 0x8c,
-+ 0xcf, 0x70, 0xdd, 0x0a, 0x68, 0xbf, 0xd4, 0xbc,
-+ 0x16, 0x76, 0x99, 0x36, 0x1e, 0x58, 0x79, 0x5e,
-+ 0xd4, 0x29, 0xf7, 0x33, 0x93, 0x48, 0xdb, 0x5f,
-+ 0x01, 0xae, 0x9c, 0xb6, 0xe4, 0x88, 0x6d, 0x2b,
-+ 0x76, 0x75, 0xe0, 0xf3, 0x74, 0xe2, 0xc9
-+};
-+static const u8 dec_nonce012[] __initconst = {
-+ 0x05, 0xa3, 0x93, 0xed, 0x30, 0xc5, 0xa2, 0x06
-+};
-+static const u8 dec_key012[] __initconst = {
-+ 0xb3, 0x35, 0x50, 0x03, 0x54, 0x2e, 0x40, 0x5e,
-+ 0x8f, 0x59, 0x8e, 0xc5, 0x90, 0xd5, 0x27, 0x2d,
-+ 0xba, 0x29, 0x2e, 0xcb, 0x1b, 0x70, 0x44, 0x1e,
-+ 0x65, 0x91, 0x6e, 0x2a, 0x79, 0x22, 0xda, 0x64
-+};
-+
-+static const u8 dec_input013[] __initconst = {
-+ 0x52, 0x34, 0xb3, 0x65, 0x3b, 0xb7, 0xe5, 0xd3,
-+ 0xab, 0x49, 0x17, 0x60, 0xd2, 0x52, 0x56, 0xdf,
-+ 0xdf, 0x34, 0x56, 0x82, 0xe2, 0xbe, 0xe5, 0xe1,
-+ 0x28, 0xd1, 0x4e, 0x5f, 0x4f, 0x01, 0x7d, 0x3f,
-+ 0x99, 0x6b, 0x30, 0x6e, 0x1a, 0x7c, 0x4c, 0x8e,
-+ 0x62, 0x81, 0xae, 0x86, 0x3f, 0x6b, 0xd0, 0xb5,
-+ 0xa9, 0xcf, 0x50, 0xf1, 0x02, 0x12, 0xa0, 0x0b,
-+ 0x24, 0xe9, 0xe6, 0x72, 0x89, 0x2c, 0x52, 0x1b,
-+ 0x34, 0x38, 0xf8, 0x75, 0x5f, 0xa0, 0x74, 0xe2,
-+ 0x99, 0xdd, 0xa6, 0x4b, 0x14, 0x50, 0x4e, 0xf1,
-+ 0xbe, 0xd6, 0x9e, 0xdb, 0xb2, 0x24, 0x27, 0x74,
-+ 0x12, 0x4a, 0x78, 0x78, 0x17, 0xa5, 0x58, 0x8e,
-+ 0x2f, 0xf9, 0xf4, 0x8d, 0xee, 0x03, 0x88, 0xae,
-+ 0xb8, 0x29, 0xa1, 0x2f, 0x4b, 0xee, 0x92, 0xbd,
-+ 0x87, 0xb3, 0xce, 0x34, 0x21, 0x57, 0x46, 0x04,
-+ 0x49, 0x0c, 0x80, 0xf2, 0x01, 0x13, 0xa1, 0x55,
-+ 0xb3, 0xff, 0x44, 0x30, 0x3c, 0x1c, 0xd0, 0xef,
-+ 0xbc, 0x18, 0x74, 0x26, 0xad, 0x41, 0x5b, 0x5b,
-+ 0x3e, 0x9a, 0x7a, 0x46, 0x4f, 0x16, 0xd6, 0x74,
-+ 0x5a, 0xb7, 0x3a, 0x28, 0x31, 0xd8, 0xae, 0x26,
-+ 0xac, 0x50, 0x53, 0x86, 0xf2, 0x56, 0xd7, 0x3f,
-+ 0x29, 0xbc, 0x45, 0x68, 0x8e, 0xcb, 0x98, 0x64,
-+ 0xdd, 0xc9, 0xba, 0xb8, 0x4b, 0x7b, 0x82, 0xdd,
-+ 0x14, 0xa7, 0xcb, 0x71, 0x72, 0x00, 0x5c, 0xad,
-+ 0x7b, 0x6a, 0x89, 0xa4, 0x3d, 0xbf, 0xb5, 0x4b,
-+ 0x3e, 0x7c, 0x5a, 0xcf, 0xb8, 0xa1, 0xc5, 0x6e,
-+ 0xc8, 0xb6, 0x31, 0x57, 0x7b, 0xdf, 0xa5, 0x7e,
-+ 0xb1, 0xd6, 0x42, 0x2a, 0x31, 0x36, 0xd1, 0xd0,
-+ 0x3f, 0x7a, 0xe5, 0x94, 0xd6, 0x36, 0xa0, 0x6f,
-+ 0xb7, 0x40, 0x7d, 0x37, 0xc6, 0x55, 0x7c, 0x50,
-+ 0x40, 0x6d, 0x29, 0x89, 0xe3, 0x5a, 0xae, 0x97,
-+ 0xe7, 0x44, 0x49, 0x6e, 0xbd, 0x81, 0x3d, 0x03,
-+ 0x93, 0x06, 0x12, 0x06, 0xe2, 0x41, 0x12, 0x4a,
-+ 0xf1, 0x6a, 0xa4, 0x58, 0xa2, 0xfb, 0xd2, 0x15,
-+ 0xba, 0xc9, 0x79, 0xc9, 0xce, 0x5e, 0x13, 0xbb,
-+ 0xf1, 0x09, 0x04, 0xcc, 0xfd, 0xe8, 0x51, 0x34,
-+ 0x6a, 0xe8, 0x61, 0x88, 0xda, 0xed, 0x01, 0x47,
-+ 0x84, 0xf5, 0x73, 0x25, 0xf9, 0x1c, 0x42, 0x86,
-+ 0x07, 0xf3, 0x5b, 0x1a, 0x01, 0xb3, 0xeb, 0x24,
-+ 0x32, 0x8d, 0xf6, 0xed, 0x7c, 0x4b, 0xeb, 0x3c,
-+ 0x36, 0x42, 0x28, 0xdf, 0xdf, 0xb6, 0xbe, 0xd9,
-+ 0x8c, 0x52, 0xd3, 0x2b, 0x08, 0x90, 0x8c, 0xe7,
-+ 0x98, 0x31, 0xe2, 0x32, 0x8e, 0xfc, 0x11, 0x48,
-+ 0x00, 0xa8, 0x6a, 0x42, 0x4a, 0x02, 0xc6, 0x4b,
-+ 0x09, 0xf1, 0xe3, 0x49, 0xf3, 0x45, 0x1f, 0x0e,
-+ 0xbc, 0x56, 0xe2, 0xe4, 0xdf, 0xfb, 0xeb, 0x61,
-+ 0xfa, 0x24, 0xc1, 0x63, 0x75, 0xbb, 0x47, 0x75,
-+ 0xaf, 0xe1, 0x53, 0x16, 0x96, 0x21, 0x85, 0x26,
-+ 0x11, 0xb3, 0x76, 0xe3, 0x23, 0xa1, 0x6b, 0x74,
-+ 0x37, 0xd0, 0xde, 0x06, 0x90, 0x71, 0x5d, 0x43,
-+ 0x88, 0x9b, 0x00, 0x54, 0xa6, 0x75, 0x2f, 0xa1,
-+ 0xc2, 0x0b, 0x73, 0x20, 0x1d, 0xb6, 0x21, 0x79,
-+ 0x57, 0x3f, 0xfa, 0x09, 0xbe, 0x8a, 0x33, 0xc3,
-+ 0x52, 0xf0, 0x1d, 0x82, 0x31, 0xd1, 0x55, 0xb5,
-+ 0x6c, 0x99, 0x25, 0xcf, 0x5c, 0x32, 0xce, 0xe9,
-+ 0x0d, 0xfa, 0x69, 0x2c, 0xd5, 0x0d, 0xc5, 0x6d,
-+ 0x86, 0xd0, 0x0c, 0x3b, 0x06, 0x50, 0x79, 0xe8,
-+ 0xc3, 0xae, 0x04, 0xe6, 0xcd, 0x51, 0xe4, 0x26,
-+ 0x9b, 0x4f, 0x7e, 0xa6, 0x0f, 0xab, 0xd8, 0xe5,
-+ 0xde, 0xa9, 0x00, 0x95, 0xbe, 0xa3, 0x9d, 0x5d,
-+ 0xb2, 0x09, 0x70, 0x18, 0x1c, 0xf0, 0xac, 0x29,
-+ 0x23, 0x02, 0x29, 0x28, 0xd2, 0x74, 0x35, 0x57,
-+ 0x62, 0x0f, 0x24, 0xea, 0x5e, 0x33, 0xc2, 0x92,
-+ 0xf3, 0x78, 0x4d, 0x30, 0x1e, 0xa1, 0x99, 0xa9,
-+ 0x82, 0xb0, 0x42, 0x31, 0x8d, 0xad, 0x8a, 0xbc,
-+ 0xfc, 0xd4, 0x57, 0x47, 0x3e, 0xb4, 0x50, 0xdd,
-+ 0x6e, 0x2c, 0x80, 0x4d, 0x22, 0xf1, 0xfb, 0x57,
-+ 0xc4, 0xdd, 0x17, 0xe1, 0x8a, 0x36, 0x4a, 0xb3,
-+ 0x37, 0xca, 0xc9, 0x4e, 0xab, 0xd5, 0x69, 0xc4,
-+ 0xf4, 0xbc, 0x0b, 0x3b, 0x44, 0x4b, 0x29, 0x9c,
-+ 0xee, 0xd4, 0x35, 0x22, 0x21, 0xb0, 0x1f, 0x27,
-+ 0x64, 0xa8, 0x51, 0x1b, 0xf0, 0x9f, 0x19, 0x5c,
-+ 0xfb, 0x5a, 0x64, 0x74, 0x70, 0x45, 0x09, 0xf5,
-+ 0x64, 0xfe, 0x1a, 0x2d, 0xc9, 0x14, 0x04, 0x14,
-+ 0xcf, 0xd5, 0x7d, 0x60, 0xaf, 0x94, 0x39, 0x94,
-+ 0xe2, 0x7d, 0x79, 0x82, 0xd0, 0x65, 0x3b, 0x6b,
-+ 0x9c, 0x19, 0x84, 0xb4, 0x6d, 0xb3, 0x0c, 0x99,
-+ 0xc0, 0x56, 0xa8, 0xbd, 0x73, 0xce, 0x05, 0x84,
-+ 0x3e, 0x30, 0xaa, 0xc4, 0x9b, 0x1b, 0x04, 0x2a,
-+ 0x9f, 0xd7, 0x43, 0x2b, 0x23, 0xdf, 0xbf, 0xaa,
-+ 0xd5, 0xc2, 0x43, 0x2d, 0x70, 0xab, 0xdc, 0x75,
-+ 0xad, 0xac, 0xf7, 0xc0, 0xbe, 0x67, 0xb2, 0x74,
-+ 0xed, 0x67, 0x10, 0x4a, 0x92, 0x60, 0xc1, 0x40,
-+ 0x50, 0x19, 0x8a, 0x8a, 0x8c, 0x09, 0x0e, 0x72,
-+ 0xe1, 0x73, 0x5e, 0xe8, 0x41, 0x85, 0x63, 0x9f,
-+ 0x3f, 0xd7, 0x7d, 0xc4, 0xfb, 0x22, 0x5d, 0x92,
-+ 0x6c, 0xb3, 0x1e, 0xe2, 0x50, 0x2f, 0x82, 0xa8,
-+ 0x28, 0xc0, 0xb5, 0xd7, 0x5f, 0x68, 0x0d, 0x2c,
-+ 0x2d, 0xaf, 0x7e, 0xfa, 0x2e, 0x08, 0x0f, 0x1f,
-+ 0x70, 0x9f, 0xe9, 0x19, 0x72, 0x55, 0xf8, 0xfb,
-+ 0x51, 0xd2, 0x33, 0x5d, 0xa0, 0xd3, 0x2b, 0x0a,
-+ 0x6c, 0xbc, 0x4e, 0xcf, 0x36, 0x4d, 0xdc, 0x3b,
-+ 0xe9, 0x3e, 0x81, 0x7c, 0x61, 0xdb, 0x20, 0x2d,
-+ 0x3a, 0xc3, 0xb3, 0x0c, 0x1e, 0x00, 0xb9, 0x7c,
-+ 0xf5, 0xca, 0x10, 0x5f, 0x3a, 0x71, 0xb3, 0xe4,
-+ 0x20, 0xdb, 0x0c, 0x2a, 0x98, 0x63, 0x45, 0x00,
-+ 0x58, 0xf6, 0x68, 0xe4, 0x0b, 0xda, 0x13, 0x3b,
-+ 0x60, 0x5c, 0x76, 0xdb, 0xb9, 0x97, 0x71, 0xe4,
-+ 0xd9, 0xb7, 0xdb, 0xbd, 0x68, 0xc7, 0x84, 0x84,
-+ 0xaa, 0x7c, 0x68, 0x62, 0x5e, 0x16, 0xfc, 0xba,
-+ 0x72, 0xaa, 0x9a, 0xa9, 0xeb, 0x7c, 0x75, 0x47,
-+ 0x97, 0x7e, 0xad, 0xe2, 0xd9, 0x91, 0xe8, 0xe4,
-+ 0xa5, 0x31, 0xd7, 0x01, 0x8e, 0xa2, 0x11, 0x88,
-+ 0x95, 0xb9, 0xf2, 0x9b, 0xd3, 0x7f, 0x1b, 0x81,
-+ 0x22, 0xf7, 0x98, 0x60, 0x0a, 0x64, 0xa6, 0xc1,
-+ 0xf6, 0x49, 0xc7, 0xe3, 0x07, 0x4d, 0x94, 0x7a,
-+ 0xcf, 0x6e, 0x68, 0x0c, 0x1b, 0x3f, 0x6e, 0x2e,
-+ 0xee, 0x92, 0xfa, 0x52, 0xb3, 0x59, 0xf8, 0xf1,
-+ 0x8f, 0x6a, 0x66, 0xa3, 0x82, 0x76, 0x4a, 0x07,
-+ 0x1a, 0xc7, 0xdd, 0xf5, 0xda, 0x9c, 0x3c, 0x24,
-+ 0xbf, 0xfd, 0x42, 0xa1, 0x10, 0x64, 0x6a, 0x0f,
-+ 0x89, 0xee, 0x36, 0xa5, 0xce, 0x99, 0x48, 0x6a,
-+ 0xf0, 0x9f, 0x9e, 0x69, 0xa4, 0x40, 0x20, 0xe9,
-+ 0x16, 0x15, 0xf7, 0xdb, 0x75, 0x02, 0xcb, 0xe9,
-+ 0x73, 0x8b, 0x3b, 0x49, 0x2f, 0xf0, 0xaf, 0x51,
-+ 0x06, 0x5c, 0xdf, 0x27, 0x27, 0x49, 0x6a, 0xd1,
-+ 0xcc, 0xc7, 0xb5, 0x63, 0xb5, 0xfc, 0xb8, 0x5c,
-+ 0x87, 0x7f, 0x84, 0xb4, 0xcc, 0x14, 0xa9, 0x53,
-+ 0xda, 0xa4, 0x56, 0xf8, 0xb6, 0x1b, 0xcc, 0x40,
-+ 0x27, 0x52, 0x06, 0x5a, 0x13, 0x81, 0xd7, 0x3a,
-+ 0xd4, 0x3b, 0xfb, 0x49, 0x65, 0x31, 0x33, 0xb2,
-+ 0xfa, 0xcd, 0xad, 0x58, 0x4e, 0x2b, 0xae, 0xd2,
-+ 0x20, 0xfb, 0x1a, 0x48, 0xb4, 0x3f, 0x9a, 0xd8,
-+ 0x7a, 0x35, 0x4a, 0xc8, 0xee, 0x88, 0x5e, 0x07,
-+ 0x66, 0x54, 0xb9, 0xec, 0x9f, 0xa3, 0xe3, 0xb9,
-+ 0x37, 0xaa, 0x49, 0x76, 0x31, 0xda, 0x74, 0x2d,
-+ 0x3c, 0xa4, 0x65, 0x10, 0x32, 0x38, 0xf0, 0xde,
-+ 0xd3, 0x99, 0x17, 0xaa, 0x71, 0xaa, 0x8f, 0x0f,
-+ 0x8c, 0xaf, 0xa2, 0xf8, 0x5d, 0x64, 0xba, 0x1d,
-+ 0xa3, 0xef, 0x96, 0x73, 0xe8, 0xa1, 0x02, 0x8d,
-+ 0x0c, 0x6d, 0xb8, 0x06, 0x90, 0xb8, 0x08, 0x56,
-+ 0x2c, 0xa7, 0x06, 0xc9, 0xc2, 0x38, 0xdb, 0x7c,
-+ 0x63, 0xb1, 0x57, 0x8e, 0xea, 0x7c, 0x79, 0xf3,
-+ 0x49, 0x1d, 0xfe, 0x9f, 0xf3, 0x6e, 0xb1, 0x1d,
-+ 0xba, 0x19, 0x80, 0x1a, 0x0a, 0xd3, 0xb0, 0x26,
-+ 0x21, 0x40, 0xb1, 0x7c, 0xf9, 0x4d, 0x8d, 0x10,
-+ 0xc1, 0x7e, 0xf4, 0xf6, 0x3c, 0xa8, 0xfd, 0x7c,
-+ 0xa3, 0x92, 0xb2, 0x0f, 0xaa, 0xcc, 0xa6, 0x11,
-+ 0xfe, 0x04, 0xe3, 0xd1, 0x7a, 0x32, 0x89, 0xdf,
-+ 0x0d, 0xc4, 0x8f, 0x79, 0x6b, 0xca, 0x16, 0x7c,
-+ 0x6e, 0xf9, 0xad, 0x0f, 0xf6, 0xfe, 0x27, 0xdb,
-+ 0xc4, 0x13, 0x70, 0xf1, 0x62, 0x1a, 0x4f, 0x79,
-+ 0x40, 0xc9, 0x9b, 0x8b, 0x21, 0xea, 0x84, 0xfa,
-+ 0xf5, 0xf1, 0x89, 0xce, 0xb7, 0x55, 0x0a, 0x80,
-+ 0x39, 0x2f, 0x55, 0x36, 0x16, 0x9c, 0x7b, 0x08,
-+ 0xbd, 0x87, 0x0d, 0xa5, 0x32, 0xf1, 0x52, 0x7c,
-+ 0xe8, 0x55, 0x60, 0x5b, 0xd7, 0x69, 0xe4, 0xfc,
-+ 0xfa, 0x12, 0x85, 0x96, 0xea, 0x50, 0x28, 0xab,
-+ 0x8a, 0xf7, 0xbb, 0x0e, 0x53, 0x74, 0xca, 0xa6,
-+ 0x27, 0x09, 0xc2, 0xb5, 0xde, 0x18, 0x14, 0xd9,
-+ 0xea, 0xe5, 0x29, 0x1c, 0x40, 0x56, 0xcf, 0xd7,
-+ 0xae, 0x05, 0x3f, 0x65, 0xaf, 0x05, 0x73, 0xe2,
-+ 0x35, 0x96, 0x27, 0x07, 0x14, 0xc0, 0xad, 0x33,
-+ 0xf1, 0xdc, 0x44, 0x7a, 0x89, 0x17, 0x77, 0xd2,
-+ 0x9c, 0x58, 0x60, 0xf0, 0x3f, 0x7b, 0x2d, 0x2e,
-+ 0x57, 0x95, 0x54, 0x87, 0xed, 0xf2, 0xc7, 0x4c,
-+ 0xf0, 0xae, 0x56, 0x29, 0x19, 0x7d, 0x66, 0x4b,
-+ 0x9b, 0x83, 0x84, 0x42, 0x3b, 0x01, 0x25, 0x66,
-+ 0x8e, 0x02, 0xde, 0xb9, 0x83, 0x54, 0x19, 0xf6,
-+ 0x9f, 0x79, 0x0d, 0x67, 0xc5, 0x1d, 0x7a, 0x44,
-+ 0x02, 0x98, 0xa7, 0x16, 0x1c, 0x29, 0x0d, 0x74,
-+ 0xff, 0x85, 0x40, 0x06, 0xef, 0x2c, 0xa9, 0xc6,
-+ 0xf5, 0x53, 0x07, 0x06, 0xae, 0xe4, 0xfa, 0x5f,
-+ 0xd8, 0x39, 0x4d, 0xf1, 0x9b, 0x6b, 0xd9, 0x24,
-+ 0x84, 0xfe, 0x03, 0x4c, 0xb2, 0x3f, 0xdf, 0xa1,
-+ 0x05, 0x9e, 0x50, 0x14, 0x5a, 0xd9, 0x1a, 0xa2,
-+ 0xa7, 0xfa, 0xfa, 0x17, 0xf7, 0x78, 0xd6, 0xb5,
-+ 0x92, 0x61, 0x91, 0xac, 0x36, 0xfa, 0x56, 0x0d,
-+ 0x38, 0x32, 0x18, 0x85, 0x08, 0x58, 0x37, 0xf0,
-+ 0x4b, 0xdb, 0x59, 0xe7, 0xa4, 0x34, 0xc0, 0x1b,
-+ 0x01, 0xaf, 0x2d, 0xde, 0xa1, 0xaa, 0x5d, 0xd3,
-+ 0xec, 0xe1, 0xd4, 0xf7, 0xe6, 0x54, 0x68, 0xf0,
-+ 0x51, 0x97, 0xa7, 0x89, 0xea, 0x24, 0xad, 0xd3,
-+ 0x6e, 0x47, 0x93, 0x8b, 0x4b, 0xb4, 0xf7, 0x1c,
-+ 0x42, 0x06, 0x67, 0xe8, 0x99, 0xf6, 0xf5, 0x7b,
-+ 0x85, 0xb5, 0x65, 0xb5, 0xb5, 0xd2, 0x37, 0xf5,
-+ 0xf3, 0x02, 0xa6, 0x4d, 0x11, 0xa7, 0xdc, 0x51,
-+ 0x09, 0x7f, 0xa0, 0xd8, 0x88, 0x1c, 0x13, 0x71,
-+ 0xae, 0x9c, 0xb7, 0x7b, 0x34, 0xd6, 0x4e, 0x68,
-+ 0x26, 0x83, 0x51, 0xaf, 0x1d, 0xee, 0x8b, 0xbb,
-+ 0x69, 0x43, 0x2b, 0x9e, 0x8a, 0xbc, 0x02, 0x0e,
-+ 0xa0, 0x1b, 0xe0, 0xa8, 0x5f, 0x6f, 0xaf, 0x1b,
-+ 0x8f, 0xe7, 0x64, 0x71, 0x74, 0x11, 0x7e, 0xa8,
-+ 0xd8, 0xf9, 0x97, 0x06, 0xc3, 0xb6, 0xfb, 0xfb,
-+ 0xb7, 0x3d, 0x35, 0x9d, 0x3b, 0x52, 0xed, 0x54,
-+ 0xca, 0xf4, 0x81, 0x01, 0x2d, 0x1b, 0xc3, 0xa7,
-+ 0x00, 0x3d, 0x1a, 0x39, 0x54, 0xe1, 0xf6, 0xff,
-+ 0xed, 0x6f, 0x0b, 0x5a, 0x68, 0xda, 0x58, 0xdd,
-+ 0xa9, 0xcf, 0x5c, 0x4a, 0xe5, 0x09, 0x4e, 0xde,
-+ 0x9d, 0xbc, 0x3e, 0xee, 0x5a, 0x00, 0x3b, 0x2c,
-+ 0x87, 0x10, 0x65, 0x60, 0xdd, 0xd7, 0x56, 0xd1,
-+ 0x4c, 0x64, 0x45, 0xe4, 0x21, 0xec, 0x78, 0xf8,
-+ 0x25, 0x7a, 0x3e, 0x16, 0x5d, 0x09, 0x53, 0x14,
-+ 0xbe, 0x4f, 0xae, 0x87, 0xd8, 0xd1, 0xaa, 0x3c,
-+ 0xf6, 0x3e, 0xa4, 0x70, 0x8c, 0x5e, 0x70, 0xa4,
-+ 0xb3, 0x6b, 0x66, 0x73, 0xd3, 0xbf, 0x31, 0x06,
-+ 0x19, 0x62, 0x93, 0x15, 0xf2, 0x86, 0xe4, 0x52,
-+ 0x7e, 0x53, 0x4c, 0x12, 0x38, 0xcc, 0x34, 0x7d,
-+ 0x57, 0xf6, 0x42, 0x93, 0x8a, 0xc4, 0xee, 0x5c,
-+ 0x8a, 0xe1, 0x52, 0x8f, 0x56, 0x64, 0xf6, 0xa6,
-+ 0xd1, 0x91, 0x57, 0x70, 0xcd, 0x11, 0x76, 0xf5,
-+ 0x59, 0x60, 0x60, 0x3c, 0xc1, 0xc3, 0x0b, 0x7f,
-+ 0x58, 0x1a, 0x50, 0x91, 0xf1, 0x68, 0x8f, 0x6e,
-+ 0x74, 0x74, 0xa8, 0x51, 0x0b, 0xf7, 0x7a, 0x98,
-+ 0x37, 0xf2, 0x0a, 0x0e, 0xa4, 0x97, 0x04, 0xb8,
-+ 0x9b, 0xfd, 0xa0, 0xea, 0xf7, 0x0d, 0xe1, 0xdb,
-+ 0x03, 0xf0, 0x31, 0x29, 0xf8, 0xdd, 0x6b, 0x8b,
-+ 0x5d, 0xd8, 0x59, 0xa9, 0x29, 0xcf, 0x9a, 0x79,
-+ 0x89, 0x19, 0x63, 0x46, 0x09, 0x79, 0x6a, 0x11,
-+ 0xda, 0x63, 0x68, 0x48, 0x77, 0x23, 0xfb, 0x7d,
-+ 0x3a, 0x43, 0xcb, 0x02, 0x3b, 0x7a, 0x6d, 0x10,
-+ 0x2a, 0x9e, 0xac, 0xf1, 0xd4, 0x19, 0xf8, 0x23,
-+ 0x64, 0x1d, 0x2c, 0x5f, 0xf2, 0xb0, 0x5c, 0x23,
-+ 0x27, 0xf7, 0x27, 0x30, 0x16, 0x37, 0xb1, 0x90,
-+ 0xab, 0x38, 0xfb, 0x55, 0xcd, 0x78, 0x58, 0xd4,
-+ 0x7d, 0x43, 0xf6, 0x45, 0x5e, 0x55, 0x8d, 0xb1,
-+ 0x02, 0x65, 0x58, 0xb4, 0x13, 0x4b, 0x36, 0xf7,
-+ 0xcc, 0xfe, 0x3d, 0x0b, 0x82, 0xe2, 0x12, 0x11,
-+ 0xbb, 0xe6, 0xb8, 0x3a, 0x48, 0x71, 0xc7, 0x50,
-+ 0x06, 0x16, 0x3a, 0xe6, 0x7c, 0x05, 0xc7, 0xc8,
-+ 0x4d, 0x2f, 0x08, 0x6a, 0x17, 0x9a, 0x95, 0x97,
-+ 0x50, 0x68, 0xdc, 0x28, 0x18, 0xc4, 0x61, 0x38,
-+ 0xb9, 0xe0, 0x3e, 0x78, 0xdb, 0x29, 0xe0, 0x9f,
-+ 0x52, 0xdd, 0xf8, 0x4f, 0x91, 0xc1, 0xd0, 0x33,
-+ 0xa1, 0x7a, 0x8e, 0x30, 0x13, 0x82, 0x07, 0x9f,
-+ 0xd3, 0x31, 0x0f, 0x23, 0xbe, 0x32, 0x5a, 0x75,
-+ 0xcf, 0x96, 0xb2, 0xec, 0xb5, 0x32, 0xac, 0x21,
-+ 0xd1, 0x82, 0x33, 0xd3, 0x15, 0x74, 0xbd, 0x90,
-+ 0xf1, 0x2c, 0xe6, 0x5f, 0x8d, 0xe3, 0x02, 0xe8,
-+ 0xe9, 0xc4, 0xca, 0x96, 0xeb, 0x0e, 0xbc, 0x91,
-+ 0xf4, 0xb9, 0xea, 0xd9, 0x1b, 0x75, 0xbd, 0xe1,
-+ 0xac, 0x2a, 0x05, 0x37, 0x52, 0x9b, 0x1b, 0x3f,
-+ 0x5a, 0xdc, 0x21, 0xc3, 0x98, 0xbb, 0xaf, 0xa3,
-+ 0xf2, 0x00, 0xbf, 0x0d, 0x30, 0x89, 0x05, 0xcc,
-+ 0xa5, 0x76, 0xf5, 0x06, 0xf0, 0xc6, 0x54, 0x8a,
-+ 0x5d, 0xd4, 0x1e, 0xc1, 0xf2, 0xce, 0xb0, 0x62,
-+ 0xc8, 0xfc, 0x59, 0x42, 0x9a, 0x90, 0x60, 0x55,
-+ 0xfe, 0x88, 0xa5, 0x8b, 0xb8, 0x33, 0x0c, 0x23,
-+ 0x24, 0x0d, 0x15, 0x70, 0x37, 0x1e, 0x3d, 0xf6,
-+ 0xd2, 0xea, 0x92, 0x10, 0xb2, 0xc4, 0x51, 0xac,
-+ 0xf2, 0xac, 0xf3, 0x6b, 0x6c, 0xaa, 0xcf, 0x12,
-+ 0xc5, 0x6c, 0x90, 0x50, 0xb5, 0x0c, 0xfc, 0x1a,
-+ 0x15, 0x52, 0xe9, 0x26, 0xc6, 0x52, 0xa4, 0xe7,
-+ 0x81, 0x69, 0xe1, 0xe7, 0x9e, 0x30, 0x01, 0xec,
-+ 0x84, 0x89, 0xb2, 0x0d, 0x66, 0xdd, 0xce, 0x28,
-+ 0x5c, 0xec, 0x98, 0x46, 0x68, 0x21, 0x9f, 0x88,
-+ 0x3f, 0x1f, 0x42, 0x77, 0xce, 0xd0, 0x61, 0xd4,
-+ 0x20, 0xa7, 0xff, 0x53, 0xad, 0x37, 0xd0, 0x17,
-+ 0x35, 0xc9, 0xfc, 0xba, 0x0a, 0x78, 0x3f, 0xf2,
-+ 0xcc, 0x86, 0x89, 0xe8, 0x4b, 0x3c, 0x48, 0x33,
-+ 0x09, 0x7f, 0xc6, 0xc0, 0xdd, 0xb8, 0xfd, 0x7a,
-+ 0x66, 0x66, 0x65, 0xeb, 0x47, 0xa7, 0x04, 0x28,
-+ 0xa3, 0x19, 0x8e, 0xa9, 0xb1, 0x13, 0x67, 0x62,
-+ 0x70, 0xcf, 0xd7
-+};
-+static const u8 dec_output013[] __initconst = {
-+ 0x74, 0xa6, 0x3e, 0xe4, 0xb1, 0xcb, 0xaf, 0xb0,
-+ 0x40, 0xe5, 0x0f, 0x9e, 0xf1, 0xf2, 0x89, 0xb5,
-+ 0x42, 0x34, 0x8a, 0xa1, 0x03, 0xb7, 0xe9, 0x57,
-+ 0x46, 0xbe, 0x20, 0xe4, 0x6e, 0xb0, 0xeb, 0xff,
-+ 0xea, 0x07, 0x7e, 0xef, 0xe2, 0x55, 0x9f, 0xe5,
-+ 0x78, 0x3a, 0xb7, 0x83, 0xc2, 0x18, 0x40, 0x7b,
-+ 0xeb, 0xcd, 0x81, 0xfb, 0x90, 0x12, 0x9e, 0x46,
-+ 0xa9, 0xd6, 0x4a, 0xba, 0xb0, 0x62, 0xdb, 0x6b,
-+ 0x99, 0xc4, 0xdb, 0x54, 0x4b, 0xb8, 0xa5, 0x71,
-+ 0xcb, 0xcd, 0x63, 0x32, 0x55, 0xfb, 0x31, 0xf0,
-+ 0x38, 0xf5, 0xbe, 0x78, 0xe4, 0x45, 0xce, 0x1b,
-+ 0x6a, 0x5b, 0x0e, 0xf4, 0x16, 0xe4, 0xb1, 0x3d,
-+ 0xf6, 0x63, 0x7b, 0xa7, 0x0c, 0xde, 0x6f, 0x8f,
-+ 0x74, 0xdf, 0xe0, 0x1e, 0x9d, 0xce, 0x8f, 0x24,
-+ 0xef, 0x23, 0x35, 0x33, 0x7b, 0x83, 0x34, 0x23,
-+ 0x58, 0x74, 0x14, 0x77, 0x1f, 0xc2, 0x4f, 0x4e,
-+ 0xc6, 0x89, 0xf9, 0x52, 0x09, 0x37, 0x64, 0x14,
-+ 0xc4, 0x01, 0x6b, 0x9d, 0x77, 0xe8, 0x90, 0x5d,
-+ 0xa8, 0x4a, 0x2a, 0xef, 0x5c, 0x7f, 0xeb, 0xbb,
-+ 0xb2, 0xc6, 0x93, 0x99, 0x66, 0xdc, 0x7f, 0xd4,
-+ 0x9e, 0x2a, 0xca, 0x8d, 0xdb, 0xe7, 0x20, 0xcf,
-+ 0xe4, 0x73, 0xae, 0x49, 0x7d, 0x64, 0x0f, 0x0e,
-+ 0x28, 0x46, 0xa9, 0xa8, 0x32, 0xe4, 0x0e, 0xf6,
-+ 0x51, 0x53, 0xb8, 0x3c, 0xb1, 0xff, 0xa3, 0x33,
-+ 0x41, 0x75, 0xff, 0xf1, 0x6f, 0xf1, 0xfb, 0xbb,
-+ 0x83, 0x7f, 0x06, 0x9b, 0xe7, 0x1b, 0x0a, 0xe0,
-+ 0x5c, 0x33, 0x60, 0x5b, 0xdb, 0x5b, 0xed, 0xfe,
-+ 0xa5, 0x16, 0x19, 0x72, 0xa3, 0x64, 0x23, 0x00,
-+ 0x02, 0xc7, 0xf3, 0x6a, 0x81, 0x3e, 0x44, 0x1d,
-+ 0x79, 0x15, 0x5f, 0x9a, 0xde, 0xe2, 0xfd, 0x1b,
-+ 0x73, 0xc1, 0xbc, 0x23, 0xba, 0x31, 0xd2, 0x50,
-+ 0xd5, 0xad, 0x7f, 0x74, 0xa7, 0xc9, 0xf8, 0x3e,
-+ 0x2b, 0x26, 0x10, 0xf6, 0x03, 0x36, 0x74, 0xe4,
-+ 0x0e, 0x6a, 0x72, 0xb7, 0x73, 0x0a, 0x42, 0x28,
-+ 0xc2, 0xad, 0x5e, 0x03, 0xbe, 0xb8, 0x0b, 0xa8,
-+ 0x5b, 0xd4, 0xb8, 0xba, 0x52, 0x89, 0xb1, 0x9b,
-+ 0xc1, 0xc3, 0x65, 0x87, 0xed, 0xa5, 0xf4, 0x86,
-+ 0xfd, 0x41, 0x80, 0x91, 0x27, 0x59, 0x53, 0x67,
-+ 0x15, 0x78, 0x54, 0x8b, 0x2d, 0x3d, 0xc7, 0xff,
-+ 0x02, 0x92, 0x07, 0x5f, 0x7a, 0x4b, 0x60, 0x59,
-+ 0x3c, 0x6f, 0x5c, 0xd8, 0xec, 0x95, 0xd2, 0xfe,
-+ 0xa0, 0x3b, 0xd8, 0x3f, 0xd1, 0x69, 0xa6, 0xd6,
-+ 0x41, 0xb2, 0xf4, 0x4d, 0x12, 0xf4, 0x58, 0x3e,
-+ 0x66, 0x64, 0x80, 0x31, 0x9b, 0xa8, 0x4c, 0x8b,
-+ 0x07, 0xb2, 0xec, 0x66, 0x94, 0x66, 0x47, 0x50,
-+ 0x50, 0x5f, 0x18, 0x0b, 0x0e, 0xd6, 0xc0, 0x39,
-+ 0x21, 0x13, 0x9e, 0x33, 0xbc, 0x79, 0x36, 0x02,
-+ 0x96, 0x70, 0xf0, 0x48, 0x67, 0x2f, 0x26, 0xe9,
-+ 0x6d, 0x10, 0xbb, 0xd6, 0x3f, 0xd1, 0x64, 0x7a,
-+ 0x2e, 0xbe, 0x0c, 0x61, 0xf0, 0x75, 0x42, 0x38,
-+ 0x23, 0xb1, 0x9e, 0x9f, 0x7c, 0x67, 0x66, 0xd9,
-+ 0x58, 0x9a, 0xf1, 0xbb, 0x41, 0x2a, 0x8d, 0x65,
-+ 0x84, 0x94, 0xfc, 0xdc, 0x6a, 0x50, 0x64, 0xdb,
-+ 0x56, 0x33, 0x76, 0x00, 0x10, 0xed, 0xbe, 0xd2,
-+ 0x12, 0xf6, 0xf6, 0x1b, 0xa2, 0x16, 0xde, 0xae,
-+ 0x31, 0x95, 0xdd, 0xb1, 0x08, 0x7e, 0x4e, 0xee,
-+ 0xe7, 0xf9, 0xa5, 0xfb, 0x5b, 0x61, 0x43, 0x00,
-+ 0x40, 0xf6, 0x7e, 0x02, 0x04, 0x32, 0x4e, 0x0c,
-+ 0xe2, 0x66, 0x0d, 0xd7, 0x07, 0x98, 0x0e, 0xf8,
-+ 0x72, 0x34, 0x6d, 0x95, 0x86, 0xd7, 0xcb, 0x31,
-+ 0x54, 0x47, 0xd0, 0x38, 0x29, 0x9c, 0x5a, 0x68,
-+ 0xd4, 0x87, 0x76, 0xc9, 0xe7, 0x7e, 0xe3, 0xf4,
-+ 0x81, 0x6d, 0x18, 0xcb, 0xc9, 0x05, 0xaf, 0xa0,
-+ 0xfb, 0x66, 0xf7, 0xf1, 0x1c, 0xc6, 0x14, 0x11,
-+ 0x4f, 0x2b, 0x79, 0x42, 0x8b, 0xbc, 0xac, 0xe7,
-+ 0x6c, 0xfe, 0x0f, 0x58, 0xe7, 0x7c, 0x78, 0x39,
-+ 0x30, 0xb0, 0x66, 0x2c, 0x9b, 0x6d, 0x3a, 0xe1,
-+ 0xcf, 0xc9, 0xa4, 0x0e, 0x6d, 0x6d, 0x8a, 0xa1,
-+ 0x3a, 0xe7, 0x28, 0xd4, 0x78, 0x4c, 0xa6, 0xa2,
-+ 0x2a, 0xa6, 0x03, 0x30, 0xd7, 0xa8, 0x25, 0x66,
-+ 0x87, 0x2f, 0x69, 0x5c, 0x4e, 0xdd, 0xa5, 0x49,
-+ 0x5d, 0x37, 0x4a, 0x59, 0xc4, 0xaf, 0x1f, 0xa2,
-+ 0xe4, 0xf8, 0xa6, 0x12, 0x97, 0xd5, 0x79, 0xf5,
-+ 0xe2, 0x4a, 0x2b, 0x5f, 0x61, 0xe4, 0x9e, 0xe3,
-+ 0xee, 0xb8, 0xa7, 0x5b, 0x2f, 0xf4, 0x9e, 0x6c,
-+ 0xfb, 0xd1, 0xc6, 0x56, 0x77, 0xba, 0x75, 0xaa,
-+ 0x3d, 0x1a, 0xa8, 0x0b, 0xb3, 0x68, 0x24, 0x00,
-+ 0x10, 0x7f, 0xfd, 0xd7, 0xa1, 0x8d, 0x83, 0x54,
-+ 0x4f, 0x1f, 0xd8, 0x2a, 0xbe, 0x8a, 0x0c, 0x87,
-+ 0xab, 0xa2, 0xde, 0xc3, 0x39, 0xbf, 0x09, 0x03,
-+ 0xa5, 0xf3, 0x05, 0x28, 0xe1, 0xe1, 0xee, 0x39,
-+ 0x70, 0x9c, 0xd8, 0x81, 0x12, 0x1e, 0x02, 0x40,
-+ 0xd2, 0x6e, 0xf0, 0xeb, 0x1b, 0x3d, 0x22, 0xc6,
-+ 0xe5, 0xe3, 0xb4, 0x5a, 0x98, 0xbb, 0xf0, 0x22,
-+ 0x28, 0x8d, 0xe5, 0xd3, 0x16, 0x48, 0x24, 0xa5,
-+ 0xe6, 0x66, 0x0c, 0xf9, 0x08, 0xf9, 0x7e, 0x1e,
-+ 0xe1, 0x28, 0x26, 0x22, 0xc7, 0xc7, 0x0a, 0x32,
-+ 0x47, 0xfa, 0xa3, 0xbe, 0x3c, 0xc4, 0xc5, 0x53,
-+ 0x0a, 0xd5, 0x94, 0x4a, 0xd7, 0x93, 0xd8, 0x42,
-+ 0x99, 0xb9, 0x0a, 0xdb, 0x56, 0xf7, 0xb9, 0x1c,
-+ 0x53, 0x4f, 0xfa, 0xd3, 0x74, 0xad, 0xd9, 0x68,
-+ 0xf1, 0x1b, 0xdf, 0x61, 0xc6, 0x5e, 0xa8, 0x48,
-+ 0xfc, 0xd4, 0x4a, 0x4c, 0x3c, 0x32, 0xf7, 0x1c,
-+ 0x96, 0x21, 0x9b, 0xf9, 0xa3, 0xcc, 0x5a, 0xce,
-+ 0xd5, 0xd7, 0x08, 0x24, 0xf6, 0x1c, 0xfd, 0xdd,
-+ 0x38, 0xc2, 0x32, 0xe9, 0xb8, 0xe7, 0xb6, 0xfa,
-+ 0x9d, 0x45, 0x13, 0x2c, 0x83, 0xfd, 0x4a, 0x69,
-+ 0x82, 0xcd, 0xdc, 0xb3, 0x76, 0x0c, 0x9e, 0xd8,
-+ 0xf4, 0x1b, 0x45, 0x15, 0xb4, 0x97, 0xe7, 0x58,
-+ 0x34, 0xe2, 0x03, 0x29, 0x5a, 0xbf, 0xb6, 0xe0,
-+ 0x5d, 0x13, 0xd9, 0x2b, 0xb4, 0x80, 0xb2, 0x45,
-+ 0x81, 0x6a, 0x2e, 0x6c, 0x89, 0x7d, 0xee, 0xbb,
-+ 0x52, 0xdd, 0x1f, 0x18, 0xe7, 0x13, 0x6b, 0x33,
-+ 0x0e, 0xea, 0x36, 0x92, 0x77, 0x7b, 0x6d, 0x9c,
-+ 0x5a, 0x5f, 0x45, 0x7b, 0x7b, 0x35, 0x62, 0x23,
-+ 0xd1, 0xbf, 0x0f, 0xd0, 0x08, 0x1b, 0x2b, 0x80,
-+ 0x6b, 0x7e, 0xf1, 0x21, 0x47, 0xb0, 0x57, 0xd1,
-+ 0x98, 0x72, 0x90, 0x34, 0x1c, 0x20, 0x04, 0xff,
-+ 0x3d, 0x5c, 0xee, 0x0e, 0x57, 0x5f, 0x6f, 0x24,
-+ 0x4e, 0x3c, 0xea, 0xfc, 0xa5, 0xa9, 0x83, 0xc9,
-+ 0x61, 0xb4, 0x51, 0x24, 0xf8, 0x27, 0x5e, 0x46,
-+ 0x8c, 0xb1, 0x53, 0x02, 0x96, 0x35, 0xba, 0xb8,
-+ 0x4c, 0x71, 0xd3, 0x15, 0x59, 0x35, 0x22, 0x20,
-+ 0xad, 0x03, 0x9f, 0x66, 0x44, 0x3b, 0x9c, 0x35,
-+ 0x37, 0x1f, 0x9b, 0xbb, 0xf3, 0xdb, 0x35, 0x63,
-+ 0x30, 0x64, 0xaa, 0xa2, 0x06, 0xa8, 0x5d, 0xbb,
-+ 0xe1, 0x9f, 0x70, 0xec, 0x82, 0x11, 0x06, 0x36,
-+ 0xec, 0x8b, 0x69, 0x66, 0x24, 0x44, 0xc9, 0x4a,
-+ 0x57, 0xbb, 0x9b, 0x78, 0x13, 0xce, 0x9c, 0x0c,
-+ 0xba, 0x92, 0x93, 0x63, 0xb8, 0xe2, 0x95, 0x0f,
-+ 0x0f, 0x16, 0x39, 0x52, 0xfd, 0x3a, 0x6d, 0x02,
-+ 0x4b, 0xdf, 0x13, 0xd3, 0x2a, 0x22, 0xb4, 0x03,
-+ 0x7c, 0x54, 0x49, 0x96, 0x68, 0x54, 0x10, 0xfa,
-+ 0xef, 0xaa, 0x6c, 0xe8, 0x22, 0xdc, 0x71, 0x16,
-+ 0x13, 0x1a, 0xf6, 0x28, 0xe5, 0x6d, 0x77, 0x3d,
-+ 0xcd, 0x30, 0x63, 0xb1, 0x70, 0x52, 0xa1, 0xc5,
-+ 0x94, 0x5f, 0xcf, 0xe8, 0xb8, 0x26, 0x98, 0xf7,
-+ 0x06, 0xa0, 0x0a, 0x70, 0xfa, 0x03, 0x80, 0xac,
-+ 0xc1, 0xec, 0xd6, 0x4c, 0x54, 0xd7, 0xfe, 0x47,
-+ 0xb6, 0x88, 0x4a, 0xf7, 0x71, 0x24, 0xee, 0xf3,
-+ 0xd2, 0xc2, 0x4a, 0x7f, 0xfe, 0x61, 0xc7, 0x35,
-+ 0xc9, 0x37, 0x67, 0xcb, 0x24, 0x35, 0xda, 0x7e,
-+ 0xca, 0x5f, 0xf3, 0x8d, 0xd4, 0x13, 0x8e, 0xd6,
-+ 0xcb, 0x4d, 0x53, 0x8f, 0x53, 0x1f, 0xc0, 0x74,
-+ 0xf7, 0x53, 0xb9, 0x5e, 0x23, 0x37, 0xba, 0x6e,
-+ 0xe3, 0x9d, 0x07, 0x55, 0x25, 0x7b, 0xe6, 0x2a,
-+ 0x64, 0xd1, 0x32, 0xdd, 0x54, 0x1b, 0x4b, 0xc0,
-+ 0xe1, 0xd7, 0x69, 0x58, 0xf8, 0x93, 0x29, 0xc4,
-+ 0xdd, 0x23, 0x2f, 0xa5, 0xfc, 0x9d, 0x7e, 0xf8,
-+ 0xd4, 0x90, 0xcd, 0x82, 0x55, 0xdc, 0x16, 0x16,
-+ 0x9f, 0x07, 0x52, 0x9b, 0x9d, 0x25, 0xed, 0x32,
-+ 0xc5, 0x7b, 0xdf, 0xf6, 0x83, 0x46, 0x3d, 0x65,
-+ 0xb7, 0xef, 0x87, 0x7a, 0x12, 0x69, 0x8f, 0x06,
-+ 0x7c, 0x51, 0x15, 0x4a, 0x08, 0xe8, 0xac, 0x9a,
-+ 0x0c, 0x24, 0xa7, 0x27, 0xd8, 0x46, 0x2f, 0xe7,
-+ 0x01, 0x0e, 0x1c, 0xc6, 0x91, 0xb0, 0x6e, 0x85,
-+ 0x65, 0xf0, 0x29, 0x0d, 0x2e, 0x6b, 0x3b, 0xfb,
-+ 0x4b, 0xdf, 0xe4, 0x80, 0x93, 0x03, 0x66, 0x46,
-+ 0x3e, 0x8a, 0x6e, 0xf3, 0x5e, 0x4d, 0x62, 0x0e,
-+ 0x49, 0x05, 0xaf, 0xd4, 0xf8, 0x21, 0x20, 0x61,
-+ 0x1d, 0x39, 0x17, 0xf4, 0x61, 0x47, 0x95, 0xfb,
-+ 0x15, 0x2e, 0xb3, 0x4f, 0xd0, 0x5d, 0xf5, 0x7d,
-+ 0x40, 0xda, 0x90, 0x3c, 0x6b, 0xcb, 0x17, 0x00,
-+ 0x13, 0x3b, 0x64, 0x34, 0x1b, 0xf0, 0xf2, 0xe5,
-+ 0x3b, 0xb2, 0xc7, 0xd3, 0x5f, 0x3a, 0x44, 0xa6,
-+ 0x9b, 0xb7, 0x78, 0x0e, 0x42, 0x5d, 0x4c, 0xc1,
-+ 0xe9, 0xd2, 0xcb, 0xb7, 0x78, 0xd1, 0xfe, 0x9a,
-+ 0xb5, 0x07, 0xe9, 0xe0, 0xbe, 0xe2, 0x8a, 0xa7,
-+ 0x01, 0x83, 0x00, 0x8c, 0x5c, 0x08, 0xe6, 0x63,
-+ 0x12, 0x92, 0xb7, 0xb7, 0xa6, 0x19, 0x7d, 0x38,
-+ 0x13, 0x38, 0x92, 0x87, 0x24, 0xf9, 0x48, 0xb3,
-+ 0x5e, 0x87, 0x6a, 0x40, 0x39, 0x5c, 0x3f, 0xed,
-+ 0x8f, 0xee, 0xdb, 0x15, 0x82, 0x06, 0xda, 0x49,
-+ 0x21, 0x2b, 0xb5, 0xbf, 0x32, 0x7c, 0x9f, 0x42,
-+ 0x28, 0x63, 0xcf, 0xaf, 0x1e, 0xf8, 0xc6, 0xa0,
-+ 0xd1, 0x02, 0x43, 0x57, 0x62, 0xec, 0x9b, 0x0f,
-+ 0x01, 0x9e, 0x71, 0xd8, 0x87, 0x9d, 0x01, 0xc1,
-+ 0x58, 0x77, 0xd9, 0xaf, 0xb1, 0x10, 0x7e, 0xdd,
-+ 0xa6, 0x50, 0x96, 0xe5, 0xf0, 0x72, 0x00, 0x6d,
-+ 0x4b, 0xf8, 0x2a, 0x8f, 0x19, 0xf3, 0x22, 0x88,
-+ 0x11, 0x4a, 0x8b, 0x7c, 0xfd, 0xb7, 0xed, 0xe1,
-+ 0xf6, 0x40, 0x39, 0xe0, 0xe9, 0xf6, 0x3d, 0x25,
-+ 0xe6, 0x74, 0x3c, 0x58, 0x57, 0x7f, 0xe1, 0x22,
-+ 0x96, 0x47, 0x31, 0x91, 0xba, 0x70, 0x85, 0x28,
-+ 0x6b, 0x9f, 0x6e, 0x25, 0xac, 0x23, 0x66, 0x2f,
-+ 0x29, 0x88, 0x28, 0xce, 0x8c, 0x5c, 0x88, 0x53,
-+ 0xd1, 0x3b, 0xcc, 0x6a, 0x51, 0xb2, 0xe1, 0x28,
-+ 0x3f, 0x91, 0xb4, 0x0d, 0x00, 0x3a, 0xe3, 0xf8,
-+ 0xc3, 0x8f, 0xd7, 0x96, 0x62, 0x0e, 0x2e, 0xfc,
-+ 0xc8, 0x6c, 0x77, 0xa6, 0x1d, 0x22, 0xc1, 0xb8,
-+ 0xe6, 0x61, 0xd7, 0x67, 0x36, 0x13, 0x7b, 0xbb,
-+ 0x9b, 0x59, 0x09, 0xa6, 0xdf, 0xf7, 0x6b, 0xa3,
-+ 0x40, 0x1a, 0xf5, 0x4f, 0xb4, 0xda, 0xd3, 0xf3,
-+ 0x81, 0x93, 0xc6, 0x18, 0xd9, 0x26, 0xee, 0xac,
-+ 0xf0, 0xaa, 0xdf, 0xc5, 0x9c, 0xca, 0xc2, 0xa2,
-+ 0xcc, 0x7b, 0x5c, 0x24, 0xb0, 0xbc, 0xd0, 0x6a,
-+ 0x4d, 0x89, 0x09, 0xb8, 0x07, 0xfe, 0x87, 0xad,
-+ 0x0a, 0xea, 0xb8, 0x42, 0xf9, 0x5e, 0xb3, 0x3e,
-+ 0x36, 0x4c, 0xaf, 0x75, 0x9e, 0x1c, 0xeb, 0xbd,
-+ 0xbc, 0xbb, 0x80, 0x40, 0xa7, 0x3a, 0x30, 0xbf,
-+ 0xa8, 0x44, 0xf4, 0xeb, 0x38, 0xad, 0x29, 0xba,
-+ 0x23, 0xed, 0x41, 0x0c, 0xea, 0xd2, 0xbb, 0x41,
-+ 0x18, 0xd6, 0xb9, 0xba, 0x65, 0x2b, 0xa3, 0x91,
-+ 0x6d, 0x1f, 0xa9, 0xf4, 0xd1, 0x25, 0x8d, 0x4d,
-+ 0x38, 0xff, 0x64, 0xa0, 0xec, 0xde, 0xa6, 0xb6,
-+ 0x79, 0xab, 0x8e, 0x33, 0x6c, 0x47, 0xde, 0xaf,
-+ 0x94, 0xa4, 0xa5, 0x86, 0x77, 0x55, 0x09, 0x92,
-+ 0x81, 0x31, 0x76, 0xc7, 0x34, 0x22, 0x89, 0x8e,
-+ 0x3d, 0x26, 0x26, 0xd7, 0xfc, 0x1e, 0x16, 0x72,
-+ 0x13, 0x33, 0x63, 0xd5, 0x22, 0xbe, 0xb8, 0x04,
-+ 0x34, 0x84, 0x41, 0xbb, 0x80, 0xd0, 0x9f, 0x46,
-+ 0x48, 0x07, 0xa7, 0xfc, 0x2b, 0x3a, 0x75, 0x55,
-+ 0x8c, 0xc7, 0x6a, 0xbd, 0x7e, 0x46, 0x08, 0x84,
-+ 0x0f, 0xd5, 0x74, 0xc0, 0x82, 0x8e, 0xaa, 0x61,
-+ 0x05, 0x01, 0xb2, 0x47, 0x6e, 0x20, 0x6a, 0x2d,
-+ 0x58, 0x70, 0x48, 0x32, 0xa7, 0x37, 0xd2, 0xb8,
-+ 0x82, 0x1a, 0x51, 0xb9, 0x61, 0xdd, 0xfd, 0x9d,
-+ 0x6b, 0x0e, 0x18, 0x97, 0xf8, 0x45, 0x5f, 0x87,
-+ 0x10, 0xcf, 0x34, 0x72, 0x45, 0x26, 0x49, 0x70,
-+ 0xe7, 0xa3, 0x78, 0xe0, 0x52, 0x89, 0x84, 0x94,
-+ 0x83, 0x82, 0xc2, 0x69, 0x8f, 0xe3, 0xe1, 0x3f,
-+ 0x60, 0x74, 0x88, 0xc4, 0xf7, 0x75, 0x2c, 0xfb,
-+ 0xbd, 0xb6, 0xc4, 0x7e, 0x10, 0x0a, 0x6c, 0x90,
-+ 0x04, 0x9e, 0xc3, 0x3f, 0x59, 0x7c, 0xce, 0x31,
-+ 0x18, 0x60, 0x57, 0x73, 0x46, 0x94, 0x7d, 0x06,
-+ 0xa0, 0x6d, 0x44, 0xec, 0xa2, 0x0a, 0x9e, 0x05,
-+ 0x15, 0xef, 0xca, 0x5c, 0xbf, 0x00, 0xeb, 0xf7,
-+ 0x3d, 0x32, 0xd4, 0xa5, 0xef, 0x49, 0x89, 0x5e,
-+ 0x46, 0xb0, 0xa6, 0x63, 0x5b, 0x8a, 0x73, 0xae,
-+ 0x6f, 0xd5, 0x9d, 0xf8, 0x4f, 0x40, 0xb5, 0xb2,
-+ 0x6e, 0xd3, 0xb6, 0x01, 0xa9, 0x26, 0xa2, 0x21,
-+ 0xcf, 0x33, 0x7a, 0x3a, 0xa4, 0x23, 0x13, 0xb0,
-+ 0x69, 0x6a, 0xee, 0xce, 0xd8, 0x9d, 0x01, 0x1d,
-+ 0x50, 0xc1, 0x30, 0x6c, 0xb1, 0xcd, 0xa0, 0xf0,
-+ 0xf0, 0xa2, 0x64, 0x6f, 0xbb, 0xbf, 0x5e, 0xe6,
-+ 0xab, 0x87, 0xb4, 0x0f, 0x4f, 0x15, 0xaf, 0xb5,
-+ 0x25, 0xa1, 0xb2, 0xd0, 0x80, 0x2c, 0xfb, 0xf9,
-+ 0xfe, 0xd2, 0x33, 0xbb, 0x76, 0xfe, 0x7c, 0xa8,
-+ 0x66, 0xf7, 0xe7, 0x85, 0x9f, 0x1f, 0x85, 0x57,
-+ 0x88, 0xe1, 0xe9, 0x63, 0xe4, 0xd8, 0x1c, 0xa1,
-+ 0xfb, 0xda, 0x44, 0x05, 0x2e, 0x1d, 0x3a, 0x1c,
-+ 0xff, 0xc8, 0x3b, 0xc0, 0xfe, 0xda, 0x22, 0x0b,
-+ 0x43, 0xd6, 0x88, 0x39, 0x4c, 0x4a, 0xa6, 0x69,
-+ 0x18, 0x93, 0x42, 0x4e, 0xb5, 0xcc, 0x66, 0x0d,
-+ 0x09, 0xf8, 0x1e, 0x7c, 0xd3, 0x3c, 0x99, 0x0d,
-+ 0x50, 0x1d, 0x62, 0xe9, 0x57, 0x06, 0xbf, 0x19,
-+ 0x88, 0xdd, 0xad, 0x7b, 0x4f, 0xf9, 0xc7, 0x82,
-+ 0x6d, 0x8d, 0xc8, 0xc4, 0xc5, 0x78, 0x17, 0x20,
-+ 0x15, 0xc5, 0x52, 0x41, 0xcf, 0x5b, 0xd6, 0x7f,
-+ 0x94, 0x02, 0x41, 0xe0, 0x40, 0x22, 0x03, 0x5e,
-+ 0xd1, 0x53, 0xd4, 0x86, 0xd3, 0x2c, 0x9f, 0x0f,
-+ 0x96, 0xe3, 0x6b, 0x9a, 0x76, 0x32, 0x06, 0x47,
-+ 0x4b, 0x11, 0xb3, 0xdd, 0x03, 0x65, 0xbd, 0x9b,
-+ 0x01, 0xda, 0x9c, 0xb9, 0x7e, 0x3f, 0x6a, 0xc4,
-+ 0x7b, 0xea, 0xd4, 0x3c, 0xb9, 0xfb, 0x5c, 0x6b,
-+ 0x64, 0x33, 0x52, 0xba, 0x64, 0x78, 0x8f, 0xa4,
-+ 0xaf, 0x7a, 0x61, 0x8d, 0xbc, 0xc5, 0x73, 0xe9,
-+ 0x6b, 0x58, 0x97, 0x4b, 0xbf, 0x63, 0x22, 0xd3,
-+ 0x37, 0x02, 0x54, 0xc5, 0xb9, 0x16, 0x4a, 0xf0,
-+ 0x19, 0xd8, 0x94, 0x57, 0xb8, 0x8a, 0xb3, 0x16,
-+ 0x3b, 0xd0, 0x84, 0x8e, 0x67, 0xa6, 0xa3, 0x7d,
-+ 0x78, 0xec, 0x00
-+};
-+static const u8 dec_assoc013[] __initconst = {
-+ 0xb1, 0x69, 0x83, 0x87, 0x30, 0xaa, 0x5d, 0xb8,
-+ 0x77, 0xe8, 0x21, 0xff, 0x06, 0x59, 0x35, 0xce,
-+ 0x75, 0xfe, 0x38, 0xef, 0xb8, 0x91, 0x43, 0x8c,
-+ 0xcf, 0x70, 0xdd, 0x0a, 0x68, 0xbf, 0xd4, 0xbc,
-+ 0x16, 0x76, 0x99, 0x36, 0x1e, 0x58, 0x79, 0x5e,
-+ 0xd4, 0x29, 0xf7, 0x33, 0x93, 0x48, 0xdb, 0x5f,
-+ 0x01, 0xae, 0x9c, 0xb6, 0xe4, 0x88, 0x6d, 0x2b,
-+ 0x76, 0x75, 0xe0, 0xf3, 0x74, 0xe2, 0xc9
-+};
-+static const u8 dec_nonce013[] __initconst = {
-+ 0x05, 0xa3, 0x93, 0xed, 0x30, 0xc5, 0xa2, 0x06
-+};
-+static const u8 dec_key013[] __initconst = {
-+ 0xb3, 0x35, 0x50, 0x03, 0x54, 0x2e, 0x40, 0x5e,
-+ 0x8f, 0x59, 0x8e, 0xc5, 0x90, 0xd5, 0x27, 0x2d,
-+ 0xba, 0x29, 0x2e, 0xcb, 0x1b, 0x70, 0x44, 0x1e,
-+ 0x65, 0x91, 0x6e, 0x2a, 0x79, 0x22, 0xda, 0x64
-+};
-+
-+static const struct chacha20poly1305_testvec
-+chacha20poly1305_dec_vectors[] __initconst = {
-+ { dec_input001, dec_output001, dec_assoc001, dec_nonce001, dec_key001,
-+ sizeof(dec_input001), sizeof(dec_assoc001), sizeof(dec_nonce001) },
-+ { dec_input002, dec_output002, dec_assoc002, dec_nonce002, dec_key002,
-+ sizeof(dec_input002), sizeof(dec_assoc002), sizeof(dec_nonce002) },
-+ { dec_input003, dec_output003, dec_assoc003, dec_nonce003, dec_key003,
-+ sizeof(dec_input003), sizeof(dec_assoc003), sizeof(dec_nonce003) },
-+ { dec_input004, dec_output004, dec_assoc004, dec_nonce004, dec_key004,
-+ sizeof(dec_input004), sizeof(dec_assoc004), sizeof(dec_nonce004) },
-+ { dec_input005, dec_output005, dec_assoc005, dec_nonce005, dec_key005,
-+ sizeof(dec_input005), sizeof(dec_assoc005), sizeof(dec_nonce005) },
-+ { dec_input006, dec_output006, dec_assoc006, dec_nonce006, dec_key006,
-+ sizeof(dec_input006), sizeof(dec_assoc006), sizeof(dec_nonce006) },
-+ { dec_input007, dec_output007, dec_assoc007, dec_nonce007, dec_key007,
-+ sizeof(dec_input007), sizeof(dec_assoc007), sizeof(dec_nonce007) },
-+ { dec_input008, dec_output008, dec_assoc008, dec_nonce008, dec_key008,
-+ sizeof(dec_input008), sizeof(dec_assoc008), sizeof(dec_nonce008) },
-+ { dec_input009, dec_output009, dec_assoc009, dec_nonce009, dec_key009,
-+ sizeof(dec_input009), sizeof(dec_assoc009), sizeof(dec_nonce009) },
-+ { dec_input010, dec_output010, dec_assoc010, dec_nonce010, dec_key010,
-+ sizeof(dec_input010), sizeof(dec_assoc010), sizeof(dec_nonce010) },
-+ { dec_input011, dec_output011, dec_assoc011, dec_nonce011, dec_key011,
-+ sizeof(dec_input011), sizeof(dec_assoc011), sizeof(dec_nonce011) },
-+ { dec_input012, dec_output012, dec_assoc012, dec_nonce012, dec_key012,
-+ sizeof(dec_input012), sizeof(dec_assoc012), sizeof(dec_nonce012) },
-+ { dec_input013, dec_output013, dec_assoc013, dec_nonce013, dec_key013,
-+ sizeof(dec_input013), sizeof(dec_assoc013), sizeof(dec_nonce013),
-+ true }
-+};
-+
-+static const u8 xenc_input001[] __initconst = {
-+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
-+ 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20,
-+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x72, 0x61, 0x66,
-+ 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69,
-+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20,
-+ 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
-+ 0x6f, 0x66, 0x20, 0x73, 0x69, 0x78, 0x20, 0x6d,
-+ 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x20, 0x61, 0x6e,
-+ 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
-+ 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
-+ 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
-+ 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f,
-+ 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x64,
-+ 0x20, 0x62, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65,
-+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x61,
-+ 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e,
-+ 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69,
-+ 0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72,
-+ 0x69, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20,
-+ 0x75, 0x73, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65,
-+ 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61,
-+ 0x66, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x72,
-+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-+ 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
-+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20,
-+ 0x63, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65,
-+ 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
-+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x20,
-+ 0x2f, 0xe2, 0x80, 0x9c, 0x77, 0x6f, 0x72, 0x6b,
-+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67,
-+ 0x72, 0x65, 0x73, 0x73, 0x2e, 0x2f, 0xe2, 0x80,
-+ 0x9d
-+};
-+static const u8 xenc_output001[] __initconst = {
-+ 0x1a, 0x6e, 0x3a, 0xd9, 0xfd, 0x41, 0x3f, 0x77,
-+ 0x54, 0x72, 0x0a, 0x70, 0x9a, 0xa0, 0x29, 0x92,
-+ 0x2e, 0xed, 0x93, 0xcf, 0x0f, 0x71, 0x88, 0x18,
-+ 0x7a, 0x9d, 0x2d, 0x24, 0xe0, 0xf5, 0xea, 0x3d,
-+ 0x55, 0x64, 0xd7, 0xad, 0x2a, 0x1a, 0x1f, 0x7e,
-+ 0x86, 0x6d, 0xb0, 0xce, 0x80, 0x41, 0x72, 0x86,
-+ 0x26, 0xee, 0x84, 0xd7, 0xef, 0x82, 0x9e, 0xe2,
-+ 0x60, 0x9d, 0x5a, 0xfc, 0xf0, 0xe4, 0x19, 0x85,
-+ 0xea, 0x09, 0xc6, 0xfb, 0xb3, 0xa9, 0x50, 0x09,
-+ 0xec, 0x5e, 0x11, 0x90, 0xa1, 0xc5, 0x4e, 0x49,
-+ 0xef, 0x50, 0xd8, 0x8f, 0xe0, 0x78, 0xd7, 0xfd,
-+ 0xb9, 0x3b, 0xc9, 0xf2, 0x91, 0xc8, 0x25, 0xc8,
-+ 0xa7, 0x63, 0x60, 0xce, 0x10, 0xcd, 0xc6, 0x7f,
-+ 0xf8, 0x16, 0xf8, 0xe1, 0x0a, 0xd9, 0xde, 0x79,
-+ 0x50, 0x33, 0xf2, 0x16, 0x0f, 0x17, 0xba, 0xb8,
-+ 0x5d, 0xd8, 0xdf, 0x4e, 0x51, 0xa8, 0x39, 0xd0,
-+ 0x85, 0xca, 0x46, 0x6a, 0x10, 0xa7, 0xa3, 0x88,
-+ 0xef, 0x79, 0xb9, 0xf8, 0x24, 0xf3, 0xe0, 0x71,
-+ 0x7b, 0x76, 0x28, 0x46, 0x3a, 0x3a, 0x1b, 0x91,
-+ 0xb6, 0xd4, 0x3e, 0x23, 0xe5, 0x44, 0x15, 0xbf,
-+ 0x60, 0x43, 0x9d, 0xa4, 0xbb, 0xd5, 0x5f, 0x89,
-+ 0xeb, 0xef, 0x8e, 0xfd, 0xdd, 0xb4, 0x0d, 0x46,
-+ 0xf0, 0x69, 0x23, 0x63, 0xae, 0x94, 0xf5, 0x5e,
-+ 0xa5, 0xad, 0x13, 0x1c, 0x41, 0x76, 0xe6, 0x90,
-+ 0xd6, 0x6d, 0xa2, 0x8f, 0x97, 0x4c, 0xa8, 0x0b,
-+ 0xcf, 0x8d, 0x43, 0x2b, 0x9c, 0x9b, 0xc5, 0x58,
-+ 0xa5, 0xb6, 0x95, 0x9a, 0xbf, 0x81, 0xc6, 0x54,
-+ 0xc9, 0x66, 0x0c, 0xe5, 0x4f, 0x6a, 0x53, 0xa1,
-+ 0xe5, 0x0c, 0xba, 0x31, 0xde, 0x34, 0x64, 0x73,
-+ 0x8a, 0x3b, 0xbd, 0x92, 0x01, 0xdb, 0x71, 0x69,
-+ 0xf3, 0x58, 0x99, 0xbc, 0xd1, 0xcb, 0x4a, 0x05,
-+ 0xe2, 0x58, 0x9c, 0x25, 0x17, 0xcd, 0xdc, 0x83,
-+ 0xb7, 0xff, 0xfb, 0x09, 0x61, 0xad, 0xbf, 0x13,
-+ 0x5b, 0x5e, 0xed, 0x46, 0x82, 0x6f, 0x22, 0xd8,
-+ 0x93, 0xa6, 0x85, 0x5b, 0x40, 0x39, 0x5c, 0xc5,
-+ 0x9c
-+};
-+static const u8 xenc_assoc001[] __initconst = {
-+ 0xf3, 0x33, 0x88, 0x86, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x4e, 0x91
-+};
-+static const u8 xenc_nonce001[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
-+};
-+static const u8 xenc_key001[] __initconst = {
-+ 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
-+ 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
-+ 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
-+ 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
-+};
-+
-+static const struct chacha20poly1305_testvec
-+xchacha20poly1305_enc_vectors[] __initconst = {
-+ { xenc_input001, xenc_output001, xenc_assoc001, xenc_nonce001, xenc_key001,
-+ sizeof(xenc_input001), sizeof(xenc_assoc001), sizeof(xenc_nonce001) }
-+};
-+
-+static const u8 xdec_input001[] __initconst = {
-+ 0x1a, 0x6e, 0x3a, 0xd9, 0xfd, 0x41, 0x3f, 0x77,
-+ 0x54, 0x72, 0x0a, 0x70, 0x9a, 0xa0, 0x29, 0x92,
-+ 0x2e, 0xed, 0x93, 0xcf, 0x0f, 0x71, 0x88, 0x18,
-+ 0x7a, 0x9d, 0x2d, 0x24, 0xe0, 0xf5, 0xea, 0x3d,
-+ 0x55, 0x64, 0xd7, 0xad, 0x2a, 0x1a, 0x1f, 0x7e,
-+ 0x86, 0x6d, 0xb0, 0xce, 0x80, 0x41, 0x72, 0x86,
-+ 0x26, 0xee, 0x84, 0xd7, 0xef, 0x82, 0x9e, 0xe2,
-+ 0x60, 0x9d, 0x5a, 0xfc, 0xf0, 0xe4, 0x19, 0x85,
-+ 0xea, 0x09, 0xc6, 0xfb, 0xb3, 0xa9, 0x50, 0x09,
-+ 0xec, 0x5e, 0x11, 0x90, 0xa1, 0xc5, 0x4e, 0x49,
-+ 0xef, 0x50, 0xd8, 0x8f, 0xe0, 0x78, 0xd7, 0xfd,
-+ 0xb9, 0x3b, 0xc9, 0xf2, 0x91, 0xc8, 0x25, 0xc8,
-+ 0xa7, 0x63, 0x60, 0xce, 0x10, 0xcd, 0xc6, 0x7f,
-+ 0xf8, 0x16, 0xf8, 0xe1, 0x0a, 0xd9, 0xde, 0x79,
-+ 0x50, 0x33, 0xf2, 0x16, 0x0f, 0x17, 0xba, 0xb8,
-+ 0x5d, 0xd8, 0xdf, 0x4e, 0x51, 0xa8, 0x39, 0xd0,
-+ 0x85, 0xca, 0x46, 0x6a, 0x10, 0xa7, 0xa3, 0x88,
-+ 0xef, 0x79, 0xb9, 0xf8, 0x24, 0xf3, 0xe0, 0x71,
-+ 0x7b, 0x76, 0x28, 0x46, 0x3a, 0x3a, 0x1b, 0x91,
-+ 0xb6, 0xd4, 0x3e, 0x23, 0xe5, 0x44, 0x15, 0xbf,
-+ 0x60, 0x43, 0x9d, 0xa4, 0xbb, 0xd5, 0x5f, 0x89,
-+ 0xeb, 0xef, 0x8e, 0xfd, 0xdd, 0xb4, 0x0d, 0x46,
-+ 0xf0, 0x69, 0x23, 0x63, 0xae, 0x94, 0xf5, 0x5e,
-+ 0xa5, 0xad, 0x13, 0x1c, 0x41, 0x76, 0xe6, 0x90,
-+ 0xd6, 0x6d, 0xa2, 0x8f, 0x97, 0x4c, 0xa8, 0x0b,
-+ 0xcf, 0x8d, 0x43, 0x2b, 0x9c, 0x9b, 0xc5, 0x58,
-+ 0xa5, 0xb6, 0x95, 0x9a, 0xbf, 0x81, 0xc6, 0x54,
-+ 0xc9, 0x66, 0x0c, 0xe5, 0x4f, 0x6a, 0x53, 0xa1,
-+ 0xe5, 0x0c, 0xba, 0x31, 0xde, 0x34, 0x64, 0x73,
-+ 0x8a, 0x3b, 0xbd, 0x92, 0x01, 0xdb, 0x71, 0x69,
-+ 0xf3, 0x58, 0x99, 0xbc, 0xd1, 0xcb, 0x4a, 0x05,
-+ 0xe2, 0x58, 0x9c, 0x25, 0x17, 0xcd, 0xdc, 0x83,
-+ 0xb7, 0xff, 0xfb, 0x09, 0x61, 0xad, 0xbf, 0x13,
-+ 0x5b, 0x5e, 0xed, 0x46, 0x82, 0x6f, 0x22, 0xd8,
-+ 0x93, 0xa6, 0x85, 0x5b, 0x40, 0x39, 0x5c, 0xc5,
-+ 0x9c
-+};
-+static const u8 xdec_output001[] __initconst = {
-+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
-+ 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20,
-+ 0x61, 0x72, 0x65, 0x20, 0x64, 0x72, 0x61, 0x66,
-+ 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69,
-+ 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20,
-+ 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
-+ 0x6f, 0x66, 0x20, 0x73, 0x69, 0x78, 0x20, 0x6d,
-+ 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x20, 0x61, 0x6e,
-+ 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65,
-+ 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64,
-+ 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63,
-+ 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f,
-+ 0x62, 0x73, 0x6f, 0x6c, 0x65, 0x74, 0x65, 0x64,
-+ 0x20, 0x62, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65,
-+ 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
-+ 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x61,
-+ 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e,
-+ 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69,
-+ 0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72,
-+ 0x69, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20,
-+ 0x75, 0x73, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65,
-+ 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61,
-+ 0x66, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x72,
-+ 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-+ 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61,
-+ 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20,
-+ 0x63, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65,
-+ 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
-+ 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x20,
-+ 0x2f, 0xe2, 0x80, 0x9c, 0x77, 0x6f, 0x72, 0x6b,
-+ 0x20, 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x67,
-+ 0x72, 0x65, 0x73, 0x73, 0x2e, 0x2f, 0xe2, 0x80,
-+ 0x9d
-+};
-+static const u8 xdec_assoc001[] __initconst = {
-+ 0xf3, 0x33, 0x88, 0x86, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x4e, 0x91
-+};
-+static const u8 xdec_nonce001[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
-+};
-+static const u8 xdec_key001[] __initconst = {
-+ 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
-+ 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
-+ 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
-+ 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
-+};
-+
-+static const struct chacha20poly1305_testvec
-+xchacha20poly1305_dec_vectors[] __initconst = {
-+ { xdec_input001, xdec_output001, xdec_assoc001, xdec_nonce001, xdec_key001,
-+ sizeof(xdec_input001), sizeof(xdec_assoc001), sizeof(xdec_nonce001) }
-+};
-+
-+static void __init
-+chacha20poly1305_selftest_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u8 *nonce, const size_t nonce_len,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ if (nonce_len == 8)
-+ chacha20poly1305_encrypt(dst, src, src_len, ad, ad_len,
-+ get_unaligned_le64(nonce), key);
-+ else
-+ BUG();
-+}
-+
-+static bool __init
-+decryption_success(bool func_ret, bool expect_failure, int memcmp_result)
-+{
-+ if (expect_failure)
-+ return !func_ret;
-+ return func_ret && !memcmp_result;
-+}
-+
-+bool __init chacha20poly1305_selftest(void)
-+{
-+ enum { MAXIMUM_TEST_BUFFER_LEN = 1UL << 12 };
-+ size_t i;
-+ u8 *computed_output = NULL, *heap_src = NULL;
-+ bool success = true, ret;
-+
-+ heap_src = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
-+ computed_output = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
-+ if (!heap_src || !computed_output) {
-+ pr_err("chacha20poly1305 self-test malloc: FAIL\n");
-+ success = false;
-+ goto out;
-+ }
-+
-+ for (i = 0; i < ARRAY_SIZE(chacha20poly1305_enc_vectors); ++i) {
-+ memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
-+ chacha20poly1305_selftest_encrypt(computed_output,
-+ chacha20poly1305_enc_vectors[i].input,
-+ chacha20poly1305_enc_vectors[i].ilen,
-+ chacha20poly1305_enc_vectors[i].assoc,
-+ chacha20poly1305_enc_vectors[i].alen,
-+ chacha20poly1305_enc_vectors[i].nonce,
-+ chacha20poly1305_enc_vectors[i].nlen,
-+ chacha20poly1305_enc_vectors[i].key);
-+ if (memcmp(computed_output,
-+ chacha20poly1305_enc_vectors[i].output,
-+ chacha20poly1305_enc_vectors[i].ilen +
-+ POLY1305_DIGEST_SIZE)) {
-+ pr_err("chacha20poly1305 encryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+
-+ for (i = 0; i < ARRAY_SIZE(chacha20poly1305_dec_vectors); ++i) {
-+ memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
-+ ret = chacha20poly1305_decrypt(computed_output,
-+ chacha20poly1305_dec_vectors[i].input,
-+ chacha20poly1305_dec_vectors[i].ilen,
-+ chacha20poly1305_dec_vectors[i].assoc,
-+ chacha20poly1305_dec_vectors[i].alen,
-+ get_unaligned_le64(chacha20poly1305_dec_vectors[i].nonce),
-+ chacha20poly1305_dec_vectors[i].key);
-+ if (!decryption_success(ret,
-+ chacha20poly1305_dec_vectors[i].failure,
-+ memcmp(computed_output,
-+ chacha20poly1305_dec_vectors[i].output,
-+ chacha20poly1305_dec_vectors[i].ilen -
-+ POLY1305_DIGEST_SIZE))) {
-+ pr_err("chacha20poly1305 decryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+
-+
-+ for (i = 0; i < ARRAY_SIZE(xchacha20poly1305_enc_vectors); ++i) {
-+ memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
-+ xchacha20poly1305_encrypt(computed_output,
-+ xchacha20poly1305_enc_vectors[i].input,
-+ xchacha20poly1305_enc_vectors[i].ilen,
-+ xchacha20poly1305_enc_vectors[i].assoc,
-+ xchacha20poly1305_enc_vectors[i].alen,
-+ xchacha20poly1305_enc_vectors[i].nonce,
-+ xchacha20poly1305_enc_vectors[i].key);
-+ if (memcmp(computed_output,
-+ xchacha20poly1305_enc_vectors[i].output,
-+ xchacha20poly1305_enc_vectors[i].ilen +
-+ POLY1305_DIGEST_SIZE)) {
-+ pr_err("xchacha20poly1305 encryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+ for (i = 0; i < ARRAY_SIZE(xchacha20poly1305_dec_vectors); ++i) {
-+ memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
-+ ret = xchacha20poly1305_decrypt(computed_output,
-+ xchacha20poly1305_dec_vectors[i].input,
-+ xchacha20poly1305_dec_vectors[i].ilen,
-+ xchacha20poly1305_dec_vectors[i].assoc,
-+ xchacha20poly1305_dec_vectors[i].alen,
-+ xchacha20poly1305_dec_vectors[i].nonce,
-+ xchacha20poly1305_dec_vectors[i].key);
-+ if (!decryption_success(ret,
-+ xchacha20poly1305_dec_vectors[i].failure,
-+ memcmp(computed_output,
-+ xchacha20poly1305_dec_vectors[i].output,
-+ xchacha20poly1305_dec_vectors[i].ilen -
-+ POLY1305_DIGEST_SIZE))) {
-+ pr_err("xchacha20poly1305 decryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+
-+out:
-+ kfree(heap_src);
-+ kfree(computed_output);
-+ return success;
-+}
---- /dev/null
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -0,0 +1,219 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is an implementation of the ChaCha20Poly1305 AEAD construction.
-+ *
-+ * Information: https://tools.ietf.org/html/rfc8439
-+ */
-+
-+#include <crypto/algapi.h>
-+#include <crypto/chacha20poly1305.h>
-+#include <crypto/chacha.h>
-+#include <crypto/poly1305.h>
-+
-+#include <asm/unaligned.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+
-+#define CHACHA_KEY_WORDS (CHACHA_KEY_SIZE / sizeof(u32))
-+
-+bool __init chacha20poly1305_selftest(void);
-+
-+static void chacha_load_key(u32 *k, const u8 *in)
-+{
-+ k[0] = get_unaligned_le32(in);
-+ k[1] = get_unaligned_le32(in + 4);
-+ k[2] = get_unaligned_le32(in + 8);
-+ k[3] = get_unaligned_le32(in + 12);
-+ k[4] = get_unaligned_le32(in + 16);
-+ k[5] = get_unaligned_le32(in + 20);
-+ k[6] = get_unaligned_le32(in + 24);
-+ k[7] = get_unaligned_le32(in + 28);
-+}
-+
-+static void xchacha_init(u32 *chacha_state, const u8 *key, const u8 *nonce)
-+{
-+ u32 k[CHACHA_KEY_WORDS];
-+ u8 iv[CHACHA_IV_SIZE];
-+
-+ memset(iv, 0, 8);
-+ memcpy(iv + 8, nonce + 16, 8);
-+
-+ chacha_load_key(k, key);
-+
-+ /* Compute the subkey given the original key and first 128 nonce bits */
-+ chacha_init(chacha_state, k, nonce);
-+ hchacha_block(chacha_state, k, 20);
-+
-+ chacha_init(chacha_state, k, iv);
-+
-+ memzero_explicit(k, sizeof(k));
-+ memzero_explicit(iv, sizeof(iv));
-+}
-+
-+static void
-+__chacha20poly1305_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len, u32 *chacha_state)
-+{
-+ const u8 *pad0 = page_address(ZERO_PAGE(0));
-+ struct poly1305_desc_ctx poly1305_state;
-+ union {
-+ u8 block0[POLY1305_KEY_SIZE];
-+ __le64 lens[2];
-+ } b;
-+
-+ chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ poly1305_init(&poly1305_state, b.block0);
-+
-+ poly1305_update(&poly1305_state, ad, ad_len);
-+ if (ad_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (ad_len & 0xf));
-+
-+ chacha_crypt(chacha_state, dst, src, src_len, 20);
-+
-+ poly1305_update(&poly1305_state, dst, src_len);
-+ if (src_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (src_len & 0xf));
-+
-+ b.lens[0] = cpu_to_le64(ad_len);
-+ b.lens[1] = cpu_to_le64(src_len);
-+ poly1305_update(&poly1305_state, (u8 *)b.lens, sizeof(b.lens));
-+
-+ poly1305_final(&poly1305_state, dst + src_len);
-+
-+ memzero_explicit(chacha_state, CHACHA_STATE_WORDS * sizeof(u32));
-+ memzero_explicit(&b, sizeof(b));
-+}
-+
-+void chacha20poly1305_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ u32 chacha_state[CHACHA_STATE_WORDS];
-+ u32 k[CHACHA_KEY_WORDS];
-+ __le64 iv[2];
-+
-+ chacha_load_key(k, key);
-+
-+ iv[0] = 0;
-+ iv[1] = cpu_to_le64(nonce);
-+
-+ chacha_init(chacha_state, k, (u8 *)iv);
-+ __chacha20poly1305_encrypt(dst, src, src_len, ad, ad_len, chacha_state);
-+
-+ memzero_explicit(iv, sizeof(iv));
-+ memzero_explicit(k, sizeof(k));
-+}
-+EXPORT_SYMBOL(chacha20poly1305_encrypt);
-+
-+void xchacha20poly1305_encrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u8 nonce[XCHACHA20POLY1305_NONCE_SIZE],
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ u32 chacha_state[CHACHA_STATE_WORDS];
-+
-+ xchacha_init(chacha_state, key, nonce);
-+ __chacha20poly1305_encrypt(dst, src, src_len, ad, ad_len, chacha_state);
-+}
-+EXPORT_SYMBOL(xchacha20poly1305_encrypt);
-+
-+static bool
-+__chacha20poly1305_decrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len, u32 *chacha_state)
-+{
-+ const u8 *pad0 = page_address(ZERO_PAGE(0));
-+ struct poly1305_desc_ctx poly1305_state;
-+ size_t dst_len;
-+ int ret;
-+ union {
-+ u8 block0[POLY1305_KEY_SIZE];
-+ u8 mac[POLY1305_DIGEST_SIZE];
-+ __le64 lens[2];
-+ } b;
-+
-+ if (unlikely(src_len < POLY1305_DIGEST_SIZE))
-+ return false;
-+
-+ chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ poly1305_init(&poly1305_state, b.block0);
-+
-+ poly1305_update(&poly1305_state, ad, ad_len);
-+ if (ad_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (ad_len & 0xf));
-+
-+ dst_len = src_len - POLY1305_DIGEST_SIZE;
-+ poly1305_update(&poly1305_state, src, dst_len);
-+ if (dst_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (dst_len & 0xf));
-+
-+ b.lens[0] = cpu_to_le64(ad_len);
-+ b.lens[1] = cpu_to_le64(dst_len);
-+ poly1305_update(&poly1305_state, (u8 *)b.lens, sizeof(b.lens));
-+
-+ poly1305_final(&poly1305_state, b.mac);
-+
-+ ret = crypto_memneq(b.mac, src + dst_len, POLY1305_DIGEST_SIZE);
-+ if (likely(!ret))
-+ chacha_crypt(chacha_state, dst, src, dst_len, 20);
-+
-+ memzero_explicit(&b, sizeof(b));
-+
-+ return !ret;
-+}
-+
-+bool chacha20poly1305_decrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ u32 chacha_state[CHACHA_STATE_WORDS];
-+ u32 k[CHACHA_KEY_WORDS];
-+ __le64 iv[2];
-+ bool ret;
-+
-+ chacha_load_key(k, key);
-+
-+ iv[0] = 0;
-+ iv[1] = cpu_to_le64(nonce);
-+
-+ chacha_init(chacha_state, k, (u8 *)iv);
-+ ret = __chacha20poly1305_decrypt(dst, src, src_len, ad, ad_len,
-+ chacha_state);
-+
-+ memzero_explicit(chacha_state, sizeof(chacha_state));
-+ memzero_explicit(iv, sizeof(iv));
-+ memzero_explicit(k, sizeof(k));
-+ return ret;
-+}
-+EXPORT_SYMBOL(chacha20poly1305_decrypt);
-+
-+bool xchacha20poly1305_decrypt(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u8 nonce[XCHACHA20POLY1305_NONCE_SIZE],
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ u32 chacha_state[CHACHA_STATE_WORDS];
-+
-+ xchacha_init(chacha_state, key, nonce);
-+ return __chacha20poly1305_decrypt(dst, src, src_len, ad, ad_len,
-+ chacha_state);
-+}
-+EXPORT_SYMBOL(xchacha20poly1305_decrypt);
-+
-+static int __init mod_init(void)
-+{
-+ if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
-+ WARN_ON(!chacha20poly1305_selftest()))
-+ return -ENODEV;
-+ return 0;
-+}
-+
-+module_init(mod_init);
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("ChaCha20Poly1305 AEAD construction");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0033-crypto-lib-chacha20poly1305-reimplement-crypt_from_s.patch b/target/linux/generic/backport-5.4/080-wireguard-0033-crypto-lib-chacha20poly1305-reimplement-crypt_from_s.patch
deleted file mode 100644
index e4b2b58b82..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0033-crypto-lib-chacha20poly1305-reimplement-crypt_from_s.patch
+++ /dev/null
@@ -1,295 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 8 Nov 2019 13:22:40 +0100
-Subject: [PATCH] crypto: lib/chacha20poly1305 - reimplement crypt_from_sg()
- routine
-
-commit d95312a3ccc0cd544d374be2fc45aeaa803e5fd9 upstream.
-
-Reimplement the library routines to perform chacha20poly1305 en/decryption
-on scatterlists, without [ab]using the [deprecated] blkcipher interface,
-which is rather heavyweight and does things we don't really need.
-
-Instead, we use the sg_miter API in a novel and clever way, to iterate
-over the scatterlist in-place (i.e., source == destination, which is the
-only way this library is expected to be used). That way, we don't have to
-iterate over two scatterlists in parallel.
-
-Another optimization is that, instead of relying on the blkcipher walker
-to present the input in suitable chunks, we recognize that ChaCha is a
-streamcipher, and so we can simply deal with partial blocks by keeping a
-block of cipherstream on the stack and use crypto_xor() to mix it with
-the in/output.
-
-Finally, we omit the scatterwalk_and_copy() call if the last element of
-the scatterlist covers the MAC as well (which is the common case),
-avoiding the need to walk the scatterlist and kmap() the page twice.
-
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/chacha20poly1305.h | 11 ++
- lib/crypto/chacha20poly1305-selftest.c | 45 ++++++++
- lib/crypto/chacha20poly1305.c | 150 +++++++++++++++++++++++++
- 3 files changed, 206 insertions(+)
-
---- a/include/crypto/chacha20poly1305.h
-+++ b/include/crypto/chacha20poly1305.h
-@@ -7,6 +7,7 @@
- #define __CHACHA20POLY1305_H
-
- #include <linux/types.h>
-+#include <linux/scatterlist.h>
-
- enum chacha20poly1305_lengths {
- XCHACHA20POLY1305_NONCE_SIZE = 24,
-@@ -34,4 +35,14 @@ bool __must_check xchacha20poly1305_decr
- const size_t ad_len, const u8 nonce[XCHACHA20POLY1305_NONCE_SIZE],
- const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-
-+bool chacha20poly1305_encrypt_sg_inplace(struct scatterlist *src, size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
-+bool chacha20poly1305_decrypt_sg_inplace(struct scatterlist *src, size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-+
- #endif /* __CHACHA20POLY1305_H */
---- a/lib/crypto/chacha20poly1305-selftest.c
-+++ b/lib/crypto/chacha20poly1305-selftest.c
-@@ -7250,6 +7250,7 @@ bool __init chacha20poly1305_selftest(vo
- enum { MAXIMUM_TEST_BUFFER_LEN = 1UL << 12 };
- size_t i;
- u8 *computed_output = NULL, *heap_src = NULL;
-+ struct scatterlist sg_src;
- bool success = true, ret;
-
- heap_src = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
-@@ -7280,6 +7281,29 @@ bool __init chacha20poly1305_selftest(vo
- }
- }
-
-+ for (i = 0; i < ARRAY_SIZE(chacha20poly1305_enc_vectors); ++i) {
-+ if (chacha20poly1305_enc_vectors[i].nlen != 8)
-+ continue;
-+ memcpy(heap_src, chacha20poly1305_enc_vectors[i].input,
-+ chacha20poly1305_enc_vectors[i].ilen);
-+ sg_init_one(&sg_src, heap_src,
-+ chacha20poly1305_enc_vectors[i].ilen + POLY1305_DIGEST_SIZE);
-+ chacha20poly1305_encrypt_sg_inplace(&sg_src,
-+ chacha20poly1305_enc_vectors[i].ilen,
-+ chacha20poly1305_enc_vectors[i].assoc,
-+ chacha20poly1305_enc_vectors[i].alen,
-+ get_unaligned_le64(chacha20poly1305_enc_vectors[i].nonce),
-+ chacha20poly1305_enc_vectors[i].key);
-+ if (memcmp(heap_src,
-+ chacha20poly1305_enc_vectors[i].output,
-+ chacha20poly1305_enc_vectors[i].ilen +
-+ POLY1305_DIGEST_SIZE)) {
-+ pr_err("chacha20poly1305 sg encryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-+
- for (i = 0; i < ARRAY_SIZE(chacha20poly1305_dec_vectors); ++i) {
- memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
- ret = chacha20poly1305_decrypt(computed_output,
-@@ -7301,6 +7325,27 @@ bool __init chacha20poly1305_selftest(vo
- }
- }
-
-+ for (i = 0; i < ARRAY_SIZE(chacha20poly1305_dec_vectors); ++i) {
-+ memcpy(heap_src, chacha20poly1305_dec_vectors[i].input,
-+ chacha20poly1305_dec_vectors[i].ilen);
-+ sg_init_one(&sg_src, heap_src,
-+ chacha20poly1305_dec_vectors[i].ilen);
-+ ret = chacha20poly1305_decrypt_sg_inplace(&sg_src,
-+ chacha20poly1305_dec_vectors[i].ilen,
-+ chacha20poly1305_dec_vectors[i].assoc,
-+ chacha20poly1305_dec_vectors[i].alen,
-+ get_unaligned_le64(chacha20poly1305_dec_vectors[i].nonce),
-+ chacha20poly1305_dec_vectors[i].key);
-+ if (!decryption_success(ret,
-+ chacha20poly1305_dec_vectors[i].failure,
-+ memcmp(heap_src, chacha20poly1305_dec_vectors[i].output,
-+ chacha20poly1305_dec_vectors[i].ilen -
-+ POLY1305_DIGEST_SIZE))) {
-+ pr_err("chacha20poly1305 sg decryption self-test %zu: FAIL\n",
-+ i + 1);
-+ success = false;
-+ }
-+ }
-
- for (i = 0; i < ARRAY_SIZE(xchacha20poly1305_enc_vectors); ++i) {
- memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
---- a/lib/crypto/chacha20poly1305.c
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -11,6 +11,7 @@
- #include <crypto/chacha20poly1305.h>
- #include <crypto/chacha.h>
- #include <crypto/poly1305.h>
-+#include <crypto/scatterwalk.h>
-
- #include <asm/unaligned.h>
- #include <linux/kernel.h>
-@@ -205,6 +206,155 @@ bool xchacha20poly1305_decrypt(u8 *dst,
- }
- EXPORT_SYMBOL(xchacha20poly1305_decrypt);
-
-+static
-+bool chacha20poly1305_crypt_sg_inplace(struct scatterlist *src,
-+ const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE],
-+ int encrypt)
-+{
-+ const u8 *pad0 = page_address(ZERO_PAGE(0));
-+ struct poly1305_desc_ctx poly1305_state;
-+ u32 chacha_state[CHACHA_STATE_WORDS];
-+ struct sg_mapping_iter miter;
-+ size_t partial = 0;
-+ unsigned int flags;
-+ bool ret = true;
-+ int sl;
-+ union {
-+ struct {
-+ u32 k[CHACHA_KEY_WORDS];
-+ __le64 iv[2];
-+ };
-+ u8 block0[POLY1305_KEY_SIZE];
-+ u8 chacha_stream[CHACHA_BLOCK_SIZE];
-+ struct {
-+ u8 mac[2][POLY1305_DIGEST_SIZE];
-+ };
-+ __le64 lens[2];
-+ } b __aligned(16);
-+
-+ chacha_load_key(b.k, key);
-+
-+ b.iv[0] = 0;
-+ b.iv[1] = cpu_to_le64(nonce);
-+
-+ chacha_init(chacha_state, b.k, (u8 *)b.iv);
-+ chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ poly1305_init(&poly1305_state, b.block0);
-+
-+ if (unlikely(ad_len)) {
-+ poly1305_update(&poly1305_state, ad, ad_len);
-+ if (ad_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (ad_len & 0xf));
-+ }
-+
-+ flags = SG_MITER_TO_SG;
-+ if (!preemptible())
-+ flags |= SG_MITER_ATOMIC;
-+
-+ sg_miter_start(&miter, src, sg_nents(src), flags);
-+
-+ for (sl = src_len; sl > 0 && sg_miter_next(&miter); sl -= miter.length) {
-+ u8 *addr = miter.addr;
-+ size_t length = min_t(size_t, sl, miter.length);
-+
-+ if (!encrypt)
-+ poly1305_update(&poly1305_state, addr, length);
-+
-+ if (unlikely(partial)) {
-+ size_t l = min(length, CHACHA_BLOCK_SIZE - partial);
-+
-+ crypto_xor(addr, b.chacha_stream + partial, l);
-+ partial = (partial + l) & (CHACHA_BLOCK_SIZE - 1);
-+
-+ addr += l;
-+ length -= l;
-+ }
-+
-+ if (likely(length >= CHACHA_BLOCK_SIZE || length == sl)) {
-+ size_t l = length;
-+
-+ if (unlikely(length < sl))
-+ l &= ~(CHACHA_BLOCK_SIZE - 1);
-+ chacha_crypt(chacha_state, addr, addr, l, 20);
-+ addr += l;
-+ length -= l;
-+ }
-+
-+ if (unlikely(length > 0)) {
-+ chacha_crypt(chacha_state, b.chacha_stream, pad0,
-+ CHACHA_BLOCK_SIZE, 20);
-+ crypto_xor(addr, b.chacha_stream, length);
-+ partial = length;
-+ }
-+
-+ if (encrypt)
-+ poly1305_update(&poly1305_state, miter.addr,
-+ min_t(size_t, sl, miter.length));
-+ }
-+
-+ if (src_len & 0xf)
-+ poly1305_update(&poly1305_state, pad0, 0x10 - (src_len & 0xf));
-+
-+ b.lens[0] = cpu_to_le64(ad_len);
-+ b.lens[1] = cpu_to_le64(src_len);
-+ poly1305_update(&poly1305_state, (u8 *)b.lens, sizeof(b.lens));
-+
-+ if (likely(sl <= -POLY1305_DIGEST_SIZE)) {
-+ if (encrypt) {
-+ poly1305_final(&poly1305_state,
-+ miter.addr + miter.length + sl);
-+ ret = true;
-+ } else {
-+ poly1305_final(&poly1305_state, b.mac[0]);
-+ ret = !crypto_memneq(b.mac[0],
-+ miter.addr + miter.length + sl,
-+ POLY1305_DIGEST_SIZE);
-+ }
-+ }
-+
-+ sg_miter_stop(&miter);
-+
-+ if (unlikely(sl > -POLY1305_DIGEST_SIZE)) {
-+ poly1305_final(&poly1305_state, b.mac[1]);
-+ scatterwalk_map_and_copy(b.mac[encrypt], src, src_len,
-+ sizeof(b.mac[1]), encrypt);
-+ ret = encrypt ||
-+ !crypto_memneq(b.mac[0], b.mac[1], POLY1305_DIGEST_SIZE);
-+ }
-+
-+ memzero_explicit(chacha_state, sizeof(chacha_state));
-+ memzero_explicit(&b, sizeof(b));
-+
-+ return ret;
-+}
-+
-+bool chacha20poly1305_encrypt_sg_inplace(struct scatterlist *src, size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ return chacha20poly1305_crypt_sg_inplace(src, src_len, ad, ad_len,
-+ nonce, key, 1);
-+}
-+EXPORT_SYMBOL(chacha20poly1305_encrypt_sg_inplace);
-+
-+bool chacha20poly1305_decrypt_sg_inplace(struct scatterlist *src, size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u64 nonce,
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ if (unlikely(src_len < POLY1305_DIGEST_SIZE))
-+ return false;
-+
-+ return chacha20poly1305_crypt_sg_inplace(src,
-+ src_len - POLY1305_DIGEST_SIZE,
-+ ad, ad_len, nonce, key, 0);
-+}
-+EXPORT_SYMBOL(chacha20poly1305_decrypt_sg_inplace);
-+
- static int __init mod_init(void)
- {
- if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0034-crypto-chacha_generic-remove-unnecessary-setkey-func.patch b/target/linux/generic/backport-5.4/080-wireguard-0034-crypto-chacha_generic-remove-unnecessary-setkey-func.patch
deleted file mode 100644
index 709b1fbcf5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0034-crypto-chacha_generic-remove-unnecessary-setkey-func.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Eric Biggers <ebiggers@google.com>
-Date: Sun, 17 Nov 2019 23:21:29 -0800
-Subject: [PATCH] crypto: chacha_generic - remove unnecessary setkey()
- functions
-
-commit 2043323a799a660bc84bbee404cf7a2617ec6157 upstream.
-
-Use chacha20_setkey() and chacha12_setkey() from
-<crypto/internal/chacha.h> instead of defining them again in
-chacha_generic.c.
-
-Signed-off-by: Eric Biggers <ebiggers@google.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/chacha_generic.c | 18 +++---------------
- 1 file changed, 3 insertions(+), 15 deletions(-)
-
---- a/crypto/chacha_generic.c
-+++ b/crypto/chacha_generic.c
-@@ -37,18 +37,6 @@ static int chacha_stream_xor(struct skci
- return err;
- }
-
--static int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize)
--{
-- return chacha_setkey(tfm, key, keysize, 20);
--}
--
--static int crypto_chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-- unsigned int keysize)
--{
-- return chacha_setkey(tfm, key, keysize, 12);
--}
--
- static int crypto_chacha_crypt(struct skcipher_request *req)
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
-@@ -91,7 +79,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = CHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = crypto_chacha_crypt,
- .decrypt = crypto_chacha_crypt,
- }, {
-@@ -106,7 +94,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha20_setkey,
-+ .setkey = chacha20_setkey,
- .encrypt = crypto_xchacha_crypt,
- .decrypt = crypto_xchacha_crypt,
- }, {
-@@ -121,7 +109,7 @@ static struct skcipher_alg algs[] = {
- .max_keysize = CHACHA_KEY_SIZE,
- .ivsize = XCHACHA_IV_SIZE,
- .chunksize = CHACHA_BLOCK_SIZE,
-- .setkey = crypto_chacha12_setkey,
-+ .setkey = chacha12_setkey,
- .encrypt = crypto_xchacha_crypt,
- .decrypt = crypto_xchacha_crypt,
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0035-crypto-x86-chacha-only-unregister-algorithms-if-regi.patch b/target/linux/generic/backport-5.4/080-wireguard-0035-crypto-x86-chacha-only-unregister-algorithms-if-regi.patch
deleted file mode 100644
index 4554ea898b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0035-crypto-x86-chacha-only-unregister-algorithms-if-regi.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Eric Biggers <ebiggers@google.com>
-Date: Sun, 17 Nov 2019 23:21:58 -0800
-Subject: [PATCH] crypto: x86/chacha - only unregister algorithms if registered
-
-commit b62755aed3a3f5ca9edd2718339ccea3b6bbbe57 upstream.
-
-It's not valid to call crypto_unregister_skciphers() without a prior
-call to crypto_register_skciphers().
-
-Fixes: 84e03fa39fbe ("crypto: x86/chacha - expose SIMD ChaCha routine as library function")
-Signed-off-by: Eric Biggers <ebiggers@google.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/chacha_glue.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -304,7 +304,8 @@ static int __init chacha_simd_mod_init(v
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-+ if (boot_cpu_has(X86_FEATURE_SSSE3))
-+ crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
- }
-
- module_init(chacha_simd_mod_init);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0036-crypto-lib-chacha20poly1305-use-chacha20_crypt.patch b/target/linux/generic/backport-5.4/080-wireguard-0036-crypto-lib-chacha20poly1305-use-chacha20_crypt.patch
deleted file mode 100644
index 6ad20b999e..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0036-crypto-lib-chacha20poly1305-use-chacha20_crypt.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Eric Biggers <ebiggers@google.com>
-Date: Sun, 17 Nov 2019 23:22:16 -0800
-Subject: [PATCH] crypto: lib/chacha20poly1305 - use chacha20_crypt()
-
-commit 413808b71e6204b0cc1eeaa77960f7c3cd381d33 upstream.
-
-Use chacha20_crypt() instead of chacha_crypt(), since it's not really
-appropriate for users of the ChaCha library API to be passing the number
-of rounds as an argument.
-
-Signed-off-by: Eric Biggers <ebiggers@google.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/chacha20poly1305.c | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
---- a/lib/crypto/chacha20poly1305.c
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -66,14 +66,14 @@ __chacha20poly1305_encrypt(u8 *dst, cons
- __le64 lens[2];
- } b;
-
-- chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ chacha20_crypt(chacha_state, b.block0, pad0, sizeof(b.block0));
- poly1305_init(&poly1305_state, b.block0);
-
- poly1305_update(&poly1305_state, ad, ad_len);
- if (ad_len & 0xf)
- poly1305_update(&poly1305_state, pad0, 0x10 - (ad_len & 0xf));
-
-- chacha_crypt(chacha_state, dst, src, src_len, 20);
-+ chacha20_crypt(chacha_state, dst, src, src_len);
-
- poly1305_update(&poly1305_state, dst, src_len);
- if (src_len & 0xf)
-@@ -140,7 +140,7 @@ __chacha20poly1305_decrypt(u8 *dst, cons
- if (unlikely(src_len < POLY1305_DIGEST_SIZE))
- return false;
-
-- chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ chacha20_crypt(chacha_state, b.block0, pad0, sizeof(b.block0));
- poly1305_init(&poly1305_state, b.block0);
-
- poly1305_update(&poly1305_state, ad, ad_len);
-@@ -160,7 +160,7 @@ __chacha20poly1305_decrypt(u8 *dst, cons
-
- ret = crypto_memneq(b.mac, src + dst_len, POLY1305_DIGEST_SIZE);
- if (likely(!ret))
-- chacha_crypt(chacha_state, dst, src, dst_len, 20);
-+ chacha20_crypt(chacha_state, dst, src, dst_len);
-
- memzero_explicit(&b, sizeof(b));
-
-@@ -241,7 +241,7 @@ bool chacha20poly1305_crypt_sg_inplace(s
- b.iv[1] = cpu_to_le64(nonce);
-
- chacha_init(chacha_state, b.k, (u8 *)b.iv);
-- chacha_crypt(chacha_state, b.block0, pad0, sizeof(b.block0), 20);
-+ chacha20_crypt(chacha_state, b.block0, pad0, sizeof(b.block0));
- poly1305_init(&poly1305_state, b.block0);
-
- if (unlikely(ad_len)) {
-@@ -278,14 +278,14 @@ bool chacha20poly1305_crypt_sg_inplace(s
-
- if (unlikely(length < sl))
- l &= ~(CHACHA_BLOCK_SIZE - 1);
-- chacha_crypt(chacha_state, addr, addr, l, 20);
-+ chacha20_crypt(chacha_state, addr, addr, l);
- addr += l;
- length -= l;
- }
-
- if (unlikely(length > 0)) {
-- chacha_crypt(chacha_state, b.chacha_stream, pad0,
-- CHACHA_BLOCK_SIZE, 20);
-+ chacha20_crypt(chacha_state, b.chacha_stream, pad0,
-+ CHACHA_BLOCK_SIZE);
- crypto_xor(addr, b.chacha_stream, length);
- partial = length;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0037-crypto-arch-conditionalize-crypto-api-in-arch-glue-f.patch b/target/linux/generic/backport-5.4/080-wireguard-0037-crypto-arch-conditionalize-crypto-api-in-arch-glue-f.patch
deleted file mode 100644
index d510438f1d..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0037-crypto-arch-conditionalize-crypto-api-in-arch-glue-f.patch
+++ /dev/null
@@ -1,275 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 25 Nov 2019 11:31:12 +0100
-Subject: [PATCH] crypto: arch - conditionalize crypto api in arch glue for lib
- code
-
-commit 8394bfec51e0e565556101bcc4e2fe7551104cd8 upstream.
-
-For glue code that's used by Zinc, the actual Crypto API functions might
-not necessarily exist, and don't need to exist either. Before this
-patch, there are valid build configurations that lead to a unbuildable
-kernel. This fixes it to conditionalize those symbols on the existence
-of the proper config entry.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-glue.c | 26 ++++++++++++++++----------
- arch/arm/crypto/curve25519-glue.c | 5 +++--
- arch/arm/crypto/poly1305-glue.c | 9 ++++++---
- arch/arm64/crypto/chacha-neon-glue.c | 5 +++--
- arch/arm64/crypto/poly1305-glue.c | 5 +++--
- arch/mips/crypto/chacha-glue.c | 6 ++++--
- arch/mips/crypto/poly1305-glue.c | 6 ++++--
- arch/x86/crypto/blake2s-glue.c | 6 ++++--
- arch/x86/crypto/chacha_glue.c | 5 +++--
- arch/x86/crypto/curve25519-x86_64.c | 7 ++++---
- arch/x86/crypto/poly1305_glue.c | 5 +++--
- 11 files changed, 53 insertions(+), 32 deletions(-)
-
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -286,11 +286,13 @@ static struct skcipher_alg neon_algs[] =
-
- static int __init chacha_simd_mod_init(void)
- {
-- int err;
-+ int err = 0;
-
-- err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-- if (err)
-- return err;
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER)) {
-+ err = crypto_register_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ if (err)
-+ return err;
-+ }
-
- if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON)) {
- int i;
-@@ -310,18 +312,22 @@ static int __init chacha_simd_mod_init(v
- static_branch_enable(&use_neon);
- }
-
-- err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-- if (err)
-- crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER)) {
-+ err = crypto_register_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-+ if (err)
-+ crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ }
- }
- return err;
- }
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-- if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
-- crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER)) {
-+ crypto_unregister_skciphers(arm_algs, ARRAY_SIZE(arm_algs));
-+ if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_NEON))
-+ crypto_unregister_skciphers(neon_algs, ARRAY_SIZE(neon_algs));
-+ }
- }
-
- module_init(chacha_simd_mod_init);
---- a/arch/arm/crypto/curve25519-glue.c
-+++ b/arch/arm/crypto/curve25519-glue.c
-@@ -108,14 +108,15 @@ static int __init mod_init(void)
- {
- if (elf_hwcap & HWCAP_NEON) {
- static_branch_enable(&have_neon);
-- return crypto_register_kpp(&curve25519_alg);
-+ return IS_REACHABLE(CONFIG_CRYPTO_KPP) ?
-+ crypto_register_kpp(&curve25519_alg) : 0;
- }
- return 0;
- }
-
- static void __exit mod_exit(void)
- {
-- if (elf_hwcap & HWCAP_NEON)
-+ if (IS_REACHABLE(CONFIG_CRYPTO_KPP) && elf_hwcap & HWCAP_NEON)
- crypto_unregister_kpp(&curve25519_alg);
- }
-
---- a/arch/arm/crypto/poly1305-glue.c
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -249,16 +249,19 @@ static int __init arm_poly1305_mod_init(
- if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
- (elf_hwcap & HWCAP_NEON))
- static_branch_enable(&have_neon);
-- else
-+ else if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
- /* register only the first entry */
- return crypto_register_shash(&arm_poly1305_algs[0]);
-
-- return crypto_register_shashes(arm_poly1305_algs,
-- ARRAY_SIZE(arm_poly1305_algs));
-+ return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
-+ crypto_register_shashes(arm_poly1305_algs,
-+ ARRAY_SIZE(arm_poly1305_algs)) : 0;
- }
-
- static void __exit arm_poly1305_mod_exit(void)
- {
-+ if (!IS_REACHABLE(CONFIG_CRYPTO_HASH))
-+ return;
- if (!static_branch_likely(&have_neon)) {
- crypto_unregister_shash(&arm_poly1305_algs[0]);
- return;
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -211,12 +211,13 @@ static int __init chacha_simd_mod_init(v
-
- static_branch_enable(&have_neon);
-
-- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-+ return IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER) ?
-+ crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
- }
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- if (cpu_have_named_feature(ASIMD))
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER) && cpu_have_named_feature(ASIMD))
- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
- }
-
---- a/arch/arm64/crypto/poly1305-glue.c
-+++ b/arch/arm64/crypto/poly1305-glue.c
-@@ -220,12 +220,13 @@ static int __init neon_poly1305_mod_init
-
- static_branch_enable(&have_neon);
-
-- return crypto_register_shash(&neon_poly1305_alg);
-+ return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
-+ crypto_register_shash(&neon_poly1305_alg) : 0;
- }
-
- static void __exit neon_poly1305_mod_exit(void)
- {
-- if (cpu_have_named_feature(ASIMD))
-+ if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && cpu_have_named_feature(ASIMD))
- crypto_unregister_shash(&neon_poly1305_alg);
- }
-
---- a/arch/mips/crypto/chacha-glue.c
-+++ b/arch/mips/crypto/chacha-glue.c
-@@ -128,12 +128,14 @@ static struct skcipher_alg algs[] = {
-
- static int __init chacha_simd_mod_init(void)
- {
-- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-+ return IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER) ?
-+ crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
- }
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER))
-+ crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
- }
-
- module_init(chacha_simd_mod_init);
---- a/arch/mips/crypto/poly1305-glue.c
-+++ b/arch/mips/crypto/poly1305-glue.c
-@@ -187,12 +187,14 @@ static struct shash_alg mips_poly1305_al
-
- static int __init mips_poly1305_mod_init(void)
- {
-- return crypto_register_shash(&mips_poly1305_alg);
-+ return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
-+ crypto_register_shash(&mips_poly1305_alg) : 0;
- }
-
- static void __exit mips_poly1305_mod_exit(void)
- {
-- crypto_unregister_shash(&mips_poly1305_alg);
-+ if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
-+ crypto_unregister_shash(&mips_poly1305_alg);
- }
-
- module_init(mips_poly1305_mod_init);
---- a/arch/x86/crypto/blake2s-glue.c
-+++ b/arch/x86/crypto/blake2s-glue.c
-@@ -210,12 +210,14 @@ static int __init blake2s_mod_init(void)
- XFEATURE_MASK_AVX512, NULL))
- static_branch_enable(&blake2s_use_avx512);
-
-- return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
-+ return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
-+ crypto_register_shashes(blake2s_algs,
-+ ARRAY_SIZE(blake2s_algs)) : 0;
- }
-
- static void __exit blake2s_mod_exit(void)
- {
-- if (boot_cpu_has(X86_FEATURE_SSSE3))
-+ if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
- crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
- }
-
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -299,12 +299,13 @@ static int __init chacha_simd_mod_init(v
- boot_cpu_has(X86_FEATURE_AVX512BW)) /* kmovq */
- static_branch_enable(&chacha_use_avx512vl);
- }
-- return crypto_register_skciphers(algs, ARRAY_SIZE(algs));
-+ return IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER) ?
-+ crypto_register_skciphers(algs, ARRAY_SIZE(algs)) : 0;
- }
-
- static void __exit chacha_simd_mod_fini(void)
- {
-- if (boot_cpu_has(X86_FEATURE_SSSE3))
-+ if (IS_REACHABLE(CONFIG_CRYPTO_BLKCIPHER) && boot_cpu_has(X86_FEATURE_SSSE3))
- crypto_unregister_skciphers(algs, ARRAY_SIZE(algs));
- }
-
---- a/arch/x86/crypto/curve25519-x86_64.c
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -2457,13 +2457,14 @@ static int __init curve25519_mod_init(vo
- static_branch_enable(&curve25519_use_adx);
- else
- return 0;
-- return crypto_register_kpp(&curve25519_alg);
-+ return IS_REACHABLE(CONFIG_CRYPTO_KPP) ?
-+ crypto_register_kpp(&curve25519_alg) : 0;
- }
-
- static void __exit curve25519_mod_exit(void)
- {
-- if (boot_cpu_has(X86_FEATURE_BMI2) ||
-- boot_cpu_has(X86_FEATURE_ADX))
-+ if (IS_REACHABLE(CONFIG_CRYPTO_KPP) &&
-+ (boot_cpu_has(X86_FEATURE_BMI2) || boot_cpu_has(X86_FEATURE_ADX)))
- crypto_unregister_kpp(&curve25519_alg);
- }
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -224,12 +224,13 @@ static int __init poly1305_simd_mod_init
- cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
- static_branch_enable(&poly1305_use_avx2);
-
-- return crypto_register_shash(&alg);
-+ return IS_REACHABLE(CONFIG_CRYPTO_HASH) ? crypto_register_shash(&alg) : 0;
- }
-
- static void __exit poly1305_simd_mod_exit(void)
- {
-- crypto_unregister_shash(&alg);
-+ if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
-+ crypto_unregister_shash(&alg);
- }
-
- module_init(poly1305_simd_mod_init);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0038-crypto-chacha-fix-warning-message-in-header-file.patch b/target/linux/generic/backport-5.4/080-wireguard-0038-crypto-chacha-fix-warning-message-in-header-file.patch
deleted file mode 100644
index ccd03e3525..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0038-crypto-chacha-fix-warning-message-in-header-file.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Valdis=20Kl=C4=93tnieks?= <valdis.kletnieks@vt.edu>
-Date: Thu, 5 Dec 2019 20:58:36 -0500
-Subject: [PATCH] crypto: chacha - fix warning message in header file
-
-commit 579d705cd64e44f3fcda1a6cfd5f37468a5ddf63 upstream.
-
-Building with W=1 causes a warning:
-
- CC [M] arch/x86/crypto/chacha_glue.o
-In file included from arch/x86/crypto/chacha_glue.c:10:
-./include/crypto/internal/chacha.h:37:1: warning: 'inline' is not at beginning of declaration [-Wold-style-declaration]
- 37 | static int inline chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
- | ^~~~~~
-
-Straighten out the order to match the rest of the header file.
-
-Signed-off-by: Valdis Kletnieks <valdis.kletnieks@vt.edu>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/internal/chacha.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/include/crypto/internal/chacha.h
-+++ b/include/crypto/internal/chacha.h
-@@ -34,7 +34,7 @@ static inline int chacha20_setkey(struct
- return chacha_setkey(tfm, key, keysize, 20);
- }
-
--static int inline chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
-+static inline int chacha12_setkey(struct crypto_skcipher *tfm, const u8 *key,
- unsigned int keysize)
- {
- return chacha_setkey(tfm, key, keysize, 12);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0039-crypto-arm-curve25519-add-arch-specific-key-generati.patch b/target/linux/generic/backport-5.4/080-wireguard-0039-crypto-arm-curve25519-add-arch-specific-key-generati.patch
deleted file mode 100644
index 67de22deb6..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0039-crypto-arm-curve25519-add-arch-specific-key-generati.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 11 Dec 2019 10:26:39 +0100
-Subject: [PATCH] crypto: arm/curve25519 - add arch-specific key generation
- function
-
-commit 84faa307249b341f6ad8de3e1869d77a65e26669 upstream.
-
-Somehow this was forgotten when Zinc was being split into oddly shaped
-pieces, resulting in linker errors. The x86_64 glue has a specific key
-generation implementation, but the Arm one does not. However, it can
-still receive the NEON speedups by calling the ordinary DH function
-using the base point.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/curve25519-glue.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/arch/arm/crypto/curve25519-glue.c
-+++ b/arch/arm/crypto/curve25519-glue.c
-@@ -38,6 +38,13 @@ void curve25519_arch(u8 out[CURVE25519_K
- }
- EXPORT_SYMBOL(curve25519_arch);
-
-+void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
-+ const u8 secret[CURVE25519_KEY_SIZE])
-+{
-+ return curve25519_arch(pub, secret, curve25519_base_point);
-+}
-+EXPORT_SYMBOL(curve25519_base_arch);
-+
- static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
- unsigned int len)
- {
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0040-crypto-lib-curve25519-re-add-selftests.patch b/target/linux/generic/backport-5.4/080-wireguard-0040-crypto-lib-curve25519-re-add-selftests.patch
deleted file mode 100644
index e43d196a3b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0040-crypto-lib-curve25519-re-add-selftests.patch
+++ /dev/null
@@ -1,1387 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 16 Dec 2019 19:53:26 +0100
-Subject: [PATCH] crypto: lib/curve25519 - re-add selftests
-
-commit aa127963f1cab2b93c74c9b128a84610203fb674 upstream.
-
-Somehow these were dropped when Zinc was being integrated, which is
-problematic, because testing the library interface for Curve25519 is
-important.. This commit simply adds them back and wires them in in the
-same way that the blake2s selftests are wired in.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/Makefile | 1 +
- lib/crypto/curve25519-selftest.c | 1321 ++++++++++++++++++++++++++++++
- lib/crypto/curve25519.c | 17 +
- 3 files changed, 1339 insertions(+)
- create mode 100644 lib/crypto/curve25519-selftest.c
-
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -36,4 +36,5 @@ libsha256-y := sha256.o
- ifneq ($(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS),y)
- libblake2s-y += blake2s-selftest.o
- libchacha20poly1305-y += chacha20poly1305-selftest.o
-+libcurve25519-y += curve25519-selftest.o
- endif
---- /dev/null
-+++ b/lib/crypto/curve25519-selftest.c
-@@ -0,0 +1,1321 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include <crypto/curve25519.h>
-+
-+struct curve25519_test_vector {
-+ u8 private[CURVE25519_KEY_SIZE];
-+ u8 public[CURVE25519_KEY_SIZE];
-+ u8 result[CURVE25519_KEY_SIZE];
-+ bool valid;
-+};
-+static const struct curve25519_test_vector curve25519_test_vectors[] __initconst = {
-+ {
-+ .private = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d,
-+ 0x3c, 0x16, 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45,
-+ 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0, 0x99, 0x2a,
-+ 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a },
-+ .public = { 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4,
-+ 0xd3, 0x5b, 0x61, 0xc2, 0xec, 0xe4, 0x35, 0x37,
-+ 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78, 0x67, 0x4d,
-+ 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f },
-+ .result = { 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
-+ 0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
-+ 0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
-+ 0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
-+ .valid = true
-+ },
-+ {
-+ .private = { 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b,
-+ 0x79, 0xe1, 0x7f, 0x8b, 0x83, 0x80, 0x0e, 0xe6,
-+ 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18, 0xb6, 0xfd,
-+ 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb },
-+ .public = { 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54,
-+ 0x74, 0x8b, 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a,
-+ 0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38, 0x1a, 0xf4,
-+ 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a },
-+ .result = { 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1,
-+ 0x72, 0x8e, 0x3b, 0xf4, 0x80, 0x35, 0x0f, 0x25,
-+ 0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1, 0x9e, 0x33,
-+ 0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 },
-+ .valid = true
-+ },
-+ {
-+ .private = { 1 },
-+ .public = { 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x3c, 0x77, 0x77, 0xca, 0xf9, 0x97, 0xb2, 0x64,
-+ 0x41, 0x60, 0x77, 0x66, 0x5b, 0x4e, 0x22, 0x9d,
-+ 0x0b, 0x95, 0x48, 0xdc, 0x0c, 0xd8, 0x19, 0x98,
-+ 0xdd, 0xcd, 0xc5, 0xc8, 0x53, 0x3c, 0x79, 0x7f },
-+ .valid = true
-+ },
-+ {
-+ .private = { 1 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0xb3, 0x2d, 0x13, 0x62, 0xc2, 0x48, 0xd6, 0x2f,
-+ 0xe6, 0x26, 0x19, 0xcf, 0xf0, 0x4d, 0xd4, 0x3d,
-+ 0xb7, 0x3f, 0xfc, 0x1b, 0x63, 0x08, 0xed, 0xe3,
-+ 0x0b, 0x78, 0xd8, 0x73, 0x80, 0xf1, 0xe8, 0x34 },
-+ .valid = true
-+ },
-+ {
-+ .private = { 0xa5, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
-+ 0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
-+ 0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
-+ 0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0xc4 },
-+ .public = { 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
-+ 0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
-+ 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
-+ 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
-+ .result = { 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
-+ 0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
-+ 0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
-+ 0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
-+ .valid = true
-+ },
-+ {
-+ .private = { 1, 2, 3, 4 },
-+ .public = { 0 },
-+ .result = { 0 },
-+ .valid = false
-+ },
-+ {
-+ .private = { 2, 4, 6, 8 },
-+ .public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
-+ 0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
-+ 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
-+ 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8 },
-+ .result = { 0 },
-+ .valid = false
-+ },
-+ {
-+ .private = { 0xff, 0xff, 0xff, 0xff, 0x0a, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0xfb, 0x9f },
-+ .result = { 0x77, 0x52, 0xb6, 0x18, 0xc1, 0x2d, 0x48, 0xd2,
-+ 0xc6, 0x93, 0x46, 0x83, 0x81, 0x7c, 0xc6, 0x57,
-+ 0xf3, 0x31, 0x03, 0x19, 0x49, 0x48, 0x20, 0x05,
-+ 0x42, 0x2b, 0x4e, 0xae, 0x8d, 0x1d, 0x43, 0x23 },
-+ .valid = true
-+ },
-+ {
-+ .private = { 0x8e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x06 },
-+ .result = { 0x5a, 0xdf, 0xaa, 0x25, 0x86, 0x8e, 0x32, 0x3d,
-+ 0xae, 0x49, 0x62, 0xc1, 0x01, 0x5c, 0xb3, 0x12,
-+ 0xe1, 0xc5, 0xc7, 0x9e, 0x95, 0x3f, 0x03, 0x99,
-+ 0xb0, 0xba, 0x16, 0x22, 0xf3, 0xb6, 0xf7, 0x0c },
-+ .valid = true
-+ },
-+ /* wycheproof - normal case */
-+ {
-+ .private = { 0x48, 0x52, 0x83, 0x4d, 0x9d, 0x6b, 0x77, 0xda,
-+ 0xde, 0xab, 0xaa, 0xf2, 0xe1, 0x1d, 0xca, 0x66,
-+ 0xd1, 0x9f, 0xe7, 0x49, 0x93, 0xa7, 0xbe, 0xc3,
-+ 0x6c, 0x6e, 0x16, 0xa0, 0x98, 0x3f, 0xea, 0xba },
-+ .public = { 0x9c, 0x64, 0x7d, 0x9a, 0xe5, 0x89, 0xb9, 0xf5,
-+ 0x8f, 0xdc, 0x3c, 0xa4, 0x94, 0x7e, 0xfb, 0xc9,
-+ 0x15, 0xc4, 0xb2, 0xe0, 0x8e, 0x74, 0x4a, 0x0e,
-+ 0xdf, 0x46, 0x9d, 0xac, 0x59, 0xc8, 0xf8, 0x5a },
-+ .result = { 0x87, 0xb7, 0xf2, 0x12, 0xb6, 0x27, 0xf7, 0xa5,
-+ 0x4c, 0xa5, 0xe0, 0xbc, 0xda, 0xdd, 0xd5, 0x38,
-+ 0x9d, 0x9d, 0xe6, 0x15, 0x6c, 0xdb, 0xcf, 0x8e,
-+ 0xbe, 0x14, 0xff, 0xbc, 0xfb, 0x43, 0x65, 0x51 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key on twist */
-+ {
-+ .private = { 0x58, 0x8c, 0x06, 0x1a, 0x50, 0x80, 0x4a, 0xc4,
-+ 0x88, 0xad, 0x77, 0x4a, 0xc7, 0x16, 0xc3, 0xf5,
-+ 0xba, 0x71, 0x4b, 0x27, 0x12, 0xe0, 0x48, 0x49,
-+ 0x13, 0x79, 0xa5, 0x00, 0x21, 0x19, 0x98, 0xa8 },
-+ .public = { 0x63, 0xaa, 0x40, 0xc6, 0xe3, 0x83, 0x46, 0xc5,
-+ 0xca, 0xf2, 0x3a, 0x6d, 0xf0, 0xa5, 0xe6, 0xc8,
-+ 0x08, 0x89, 0xa0, 0x86, 0x47, 0xe5, 0x51, 0xb3,
-+ 0x56, 0x34, 0x49, 0xbe, 0xfc, 0xfc, 0x97, 0x33 },
-+ .result = { 0xb1, 0xa7, 0x07, 0x51, 0x94, 0x95, 0xff, 0xff,
-+ 0xb2, 0x98, 0xff, 0x94, 0x17, 0x16, 0xb0, 0x6d,
-+ 0xfa, 0xb8, 0x7c, 0xf8, 0xd9, 0x11, 0x23, 0xfe,
-+ 0x2b, 0xe9, 0xa2, 0x33, 0xdd, 0xa2, 0x22, 0x12 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key on twist */
-+ {
-+ .private = { 0xb0, 0x5b, 0xfd, 0x32, 0xe5, 0x53, 0x25, 0xd9,
-+ 0xfd, 0x64, 0x8c, 0xb3, 0x02, 0x84, 0x80, 0x39,
-+ 0x00, 0x0b, 0x39, 0x0e, 0x44, 0xd5, 0x21, 0xe5,
-+ 0x8a, 0xab, 0x3b, 0x29, 0xa6, 0x96, 0x0b, 0xa8 },
-+ .public = { 0x0f, 0x83, 0xc3, 0x6f, 0xde, 0xd9, 0xd3, 0x2f,
-+ 0xad, 0xf4, 0xef, 0xa3, 0xae, 0x93, 0xa9, 0x0b,
-+ 0xb5, 0xcf, 0xa6, 0x68, 0x93, 0xbc, 0x41, 0x2c,
-+ 0x43, 0xfa, 0x72, 0x87, 0xdb, 0xb9, 0x97, 0x79 },
-+ .result = { 0x67, 0xdd, 0x4a, 0x6e, 0x16, 0x55, 0x33, 0x53,
-+ 0x4c, 0x0e, 0x3f, 0x17, 0x2e, 0x4a, 0xb8, 0x57,
-+ 0x6b, 0xca, 0x92, 0x3a, 0x5f, 0x07, 0xb2, 0xc0,
-+ 0x69, 0xb4, 0xc3, 0x10, 0xff, 0x2e, 0x93, 0x5b },
-+ .valid = true
-+ },
-+ /* wycheproof - public key on twist */
-+ {
-+ .private = { 0x70, 0xe3, 0x4b, 0xcb, 0xe1, 0xf4, 0x7f, 0xbc,
-+ 0x0f, 0xdd, 0xfd, 0x7c, 0x1e, 0x1a, 0xa5, 0x3d,
-+ 0x57, 0xbf, 0xe0, 0xf6, 0x6d, 0x24, 0x30, 0x67,
-+ 0xb4, 0x24, 0xbb, 0x62, 0x10, 0xbe, 0xd1, 0x9c },
-+ .public = { 0x0b, 0x82, 0x11, 0xa2, 0xb6, 0x04, 0x90, 0x97,
-+ 0xf6, 0x87, 0x1c, 0x6c, 0x05, 0x2d, 0x3c, 0x5f,
-+ 0xc1, 0xba, 0x17, 0xda, 0x9e, 0x32, 0xae, 0x45,
-+ 0x84, 0x03, 0xb0, 0x5b, 0xb2, 0x83, 0x09, 0x2a },
-+ .result = { 0x4a, 0x06, 0x38, 0xcf, 0xaa, 0x9e, 0xf1, 0x93,
-+ 0x3b, 0x47, 0xf8, 0x93, 0x92, 0x96, 0xa6, 0xb2,
-+ 0x5b, 0xe5, 0x41, 0xef, 0x7f, 0x70, 0xe8, 0x44,
-+ 0xc0, 0xbc, 0xc0, 0x0b, 0x13, 0x4d, 0xe6, 0x4a },
-+ .valid = true
-+ },
-+ /* wycheproof - public key on twist */
-+ {
-+ .private = { 0x68, 0xc1, 0xf3, 0xa6, 0x53, 0xa4, 0xcd, 0xb1,
-+ 0xd3, 0x7b, 0xba, 0x94, 0x73, 0x8f, 0x8b, 0x95,
-+ 0x7a, 0x57, 0xbe, 0xb2, 0x4d, 0x64, 0x6e, 0x99,
-+ 0x4d, 0xc2, 0x9a, 0x27, 0x6a, 0xad, 0x45, 0x8d },
-+ .public = { 0x34, 0x3a, 0xc2, 0x0a, 0x3b, 0x9c, 0x6a, 0x27,
-+ 0xb1, 0x00, 0x81, 0x76, 0x50, 0x9a, 0xd3, 0x07,
-+ 0x35, 0x85, 0x6e, 0xc1, 0xc8, 0xd8, 0xfc, 0xae,
-+ 0x13, 0x91, 0x2d, 0x08, 0xd1, 0x52, 0xf4, 0x6c },
-+ .result = { 0x39, 0x94, 0x91, 0xfc, 0xe8, 0xdf, 0xab, 0x73,
-+ 0xb4, 0xf9, 0xf6, 0x11, 0xde, 0x8e, 0xa0, 0xb2,
-+ 0x7b, 0x28, 0xf8, 0x59, 0x94, 0x25, 0x0b, 0x0f,
-+ 0x47, 0x5d, 0x58, 0x5d, 0x04, 0x2a, 0xc2, 0x07 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key on twist */
-+ {
-+ .private = { 0xd8, 0x77, 0xb2, 0x6d, 0x06, 0xdf, 0xf9, 0xd9,
-+ 0xf7, 0xfd, 0x4c, 0x5b, 0x37, 0x69, 0xf8, 0xcd,
-+ 0xd5, 0xb3, 0x05, 0x16, 0xa5, 0xab, 0x80, 0x6b,
-+ 0xe3, 0x24, 0xff, 0x3e, 0xb6, 0x9e, 0xa0, 0xb2 },
-+ .public = { 0xfa, 0x69, 0x5f, 0xc7, 0xbe, 0x8d, 0x1b, 0xe5,
-+ 0xbf, 0x70, 0x48, 0x98, 0xf3, 0x88, 0xc4, 0x52,
-+ 0xba, 0xfd, 0xd3, 0xb8, 0xea, 0xe8, 0x05, 0xf8,
-+ 0x68, 0x1a, 0x8d, 0x15, 0xc2, 0xd4, 0xe1, 0x42 },
-+ .result = { 0x2c, 0x4f, 0xe1, 0x1d, 0x49, 0x0a, 0x53, 0x86,
-+ 0x17, 0x76, 0xb1, 0x3b, 0x43, 0x54, 0xab, 0xd4,
-+ 0xcf, 0x5a, 0x97, 0x69, 0x9d, 0xb6, 0xe6, 0xc6,
-+ 0x8c, 0x16, 0x26, 0xd0, 0x76, 0x62, 0xf7, 0x58 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key = 0 */
-+ {
-+ .private = { 0x20, 0x74, 0x94, 0x03, 0x8f, 0x2b, 0xb8, 0x11,
-+ 0xd4, 0x78, 0x05, 0xbc, 0xdf, 0x04, 0xa2, 0xac,
-+ 0x58, 0x5a, 0xda, 0x7f, 0x2f, 0x23, 0x38, 0x9b,
-+ 0xfd, 0x46, 0x58, 0xf9, 0xdd, 0xd4, 0xde, 0xbc },
-+ .public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key = 1 */
-+ {
-+ .private = { 0x20, 0x2e, 0x89, 0x72, 0xb6, 0x1c, 0x7e, 0x61,
-+ 0x93, 0x0e, 0xb9, 0x45, 0x0b, 0x50, 0x70, 0xea,
-+ 0xe1, 0xc6, 0x70, 0x47, 0x56, 0x85, 0x54, 0x1f,
-+ 0x04, 0x76, 0x21, 0x7e, 0x48, 0x18, 0xcf, 0xab },
-+ .public = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0x38, 0xdd, 0xe9, 0xf3, 0xe7, 0xb7, 0x99, 0x04,
-+ 0x5f, 0x9a, 0xc3, 0x79, 0x3d, 0x4a, 0x92, 0x77,
-+ 0xda, 0xde, 0xad, 0xc4, 0x1b, 0xec, 0x02, 0x90,
-+ 0xf8, 0x1f, 0x74, 0x4f, 0x73, 0x77, 0x5f, 0x84 },
-+ .public = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x9a, 0x2c, 0xfe, 0x84, 0xff, 0x9c, 0x4a, 0x97,
-+ 0x39, 0x62, 0x5c, 0xae, 0x4a, 0x3b, 0x82, 0xa9,
-+ 0x06, 0x87, 0x7a, 0x44, 0x19, 0x46, 0xf8, 0xd7,
-+ 0xb3, 0xd7, 0x95, 0xfe, 0x8f, 0x5d, 0x16, 0x39 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0x98, 0x57, 0xa9, 0x14, 0xe3, 0xc2, 0x90, 0x36,
-+ 0xfd, 0x9a, 0x44, 0x2b, 0xa5, 0x26, 0xb5, 0xcd,
-+ 0xcd, 0xf2, 0x82, 0x16, 0x15, 0x3e, 0x63, 0x6c,
-+ 0x10, 0x67, 0x7a, 0xca, 0xb6, 0xbd, 0x6a, 0xa5 },
-+ .public = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x4d, 0xa4, 0xe0, 0xaa, 0x07, 0x2c, 0x23, 0x2e,
-+ 0xe2, 0xf0, 0xfa, 0x4e, 0x51, 0x9a, 0xe5, 0x0b,
-+ 0x52, 0xc1, 0xed, 0xd0, 0x8a, 0x53, 0x4d, 0x4e,
-+ 0xf3, 0x46, 0xc2, 0xe1, 0x06, 0xd2, 0x1d, 0x60 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0x48, 0xe2, 0x13, 0x0d, 0x72, 0x33, 0x05, 0xed,
-+ 0x05, 0xe6, 0xe5, 0x89, 0x4d, 0x39, 0x8a, 0x5e,
-+ 0x33, 0x36, 0x7a, 0x8c, 0x6a, 0xac, 0x8f, 0xcd,
-+ 0xf0, 0xa8, 0x8e, 0x4b, 0x42, 0x82, 0x0d, 0xb7 },
-+ .public = { 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xf8, 0xff,
-+ 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
-+ 0x00, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00 },
-+ .result = { 0x9e, 0xd1, 0x0c, 0x53, 0x74, 0x7f, 0x64, 0x7f,
-+ 0x82, 0xf4, 0x51, 0x25, 0xd3, 0xde, 0x15, 0xa1,
-+ 0xe6, 0xb8, 0x24, 0x49, 0x6a, 0xb4, 0x04, 0x10,
-+ 0xff, 0xcc, 0x3c, 0xfe, 0x95, 0x76, 0x0f, 0x3b },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0x28, 0xf4, 0x10, 0x11, 0x69, 0x18, 0x51, 0xb3,
-+ 0xa6, 0x2b, 0x64, 0x15, 0x53, 0xb3, 0x0d, 0x0d,
-+ 0xfd, 0xdc, 0xb8, 0xff, 0xfc, 0xf5, 0x37, 0x00,
-+ 0xa7, 0xbe, 0x2f, 0x6a, 0x87, 0x2e, 0x9f, 0xb0 },
-+ .public = { 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x00,
-+ 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xf8, 0xff,
-+ 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f },
-+ .result = { 0xcf, 0x72, 0xb4, 0xaa, 0x6a, 0xa1, 0xc9, 0xf8,
-+ 0x94, 0xf4, 0x16, 0x5b, 0x86, 0x10, 0x9a, 0xa4,
-+ 0x68, 0x51, 0x76, 0x48, 0xe1, 0xf0, 0xcc, 0x70,
-+ 0xe1, 0xab, 0x08, 0x46, 0x01, 0x76, 0x50, 0x6b },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0x18, 0xa9, 0x3b, 0x64, 0x99, 0xb9, 0xf6, 0xb3,
-+ 0x22, 0x5c, 0xa0, 0x2f, 0xef, 0x41, 0x0e, 0x0a,
-+ 0xde, 0xc2, 0x35, 0x32, 0x32, 0x1d, 0x2d, 0x8e,
-+ 0xf1, 0xa6, 0xd6, 0x02, 0xa8, 0xc6, 0x5b, 0x83 },
-+ .public = { 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x5d, 0x50, 0xb6, 0x28, 0x36, 0xbb, 0x69, 0x57,
-+ 0x94, 0x10, 0x38, 0x6c, 0xf7, 0xbb, 0x81, 0x1c,
-+ 0x14, 0xbf, 0x85, 0xb1, 0xc7, 0xb1, 0x7e, 0x59,
-+ 0x24, 0xc7, 0xff, 0xea, 0x91, 0xef, 0x9e, 0x12 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case on twist */
-+ {
-+ .private = { 0xc0, 0x1d, 0x13, 0x05, 0xa1, 0x33, 0x8a, 0x1f,
-+ 0xca, 0xc2, 0xba, 0x7e, 0x2e, 0x03, 0x2b, 0x42,
-+ 0x7e, 0x0b, 0x04, 0x90, 0x31, 0x65, 0xac, 0xa9,
-+ 0x57, 0xd8, 0xd0, 0x55, 0x3d, 0x87, 0x17, 0xb0 },
-+ .public = { 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x19, 0x23, 0x0e, 0xb1, 0x48, 0xd5, 0xd6, 0x7c,
-+ 0x3c, 0x22, 0xab, 0x1d, 0xae, 0xff, 0x80, 0xa5,
-+ 0x7e, 0xae, 0x42, 0x65, 0xce, 0x28, 0x72, 0x65,
-+ 0x7b, 0x2c, 0x80, 0x99, 0xfc, 0x69, 0x8e, 0x50 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0x38, 0x6f, 0x7f, 0x16, 0xc5, 0x07, 0x31, 0xd6,
-+ 0x4f, 0x82, 0xe6, 0xa1, 0x70, 0xb1, 0x42, 0xa4,
-+ 0xe3, 0x4f, 0x31, 0xfd, 0x77, 0x68, 0xfc, 0xb8,
-+ 0x90, 0x29, 0x25, 0xe7, 0xd1, 0xe2, 0x1a, 0xbe },
-+ .public = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x0f, 0xca, 0xb5, 0xd8, 0x42, 0xa0, 0x78, 0xd7,
-+ 0xa7, 0x1f, 0xc5, 0x9b, 0x57, 0xbf, 0xb4, 0xca,
-+ 0x0b, 0xe6, 0x87, 0x3b, 0x49, 0xdc, 0xdb, 0x9f,
-+ 0x44, 0xe1, 0x4a, 0xe8, 0xfb, 0xdf, 0xa5, 0x42 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0xe0, 0x23, 0xa2, 0x89, 0xbd, 0x5e, 0x90, 0xfa,
-+ 0x28, 0x04, 0xdd, 0xc0, 0x19, 0xa0, 0x5e, 0xf3,
-+ 0xe7, 0x9d, 0x43, 0x4b, 0xb6, 0xea, 0x2f, 0x52,
-+ 0x2e, 0xcb, 0x64, 0x3a, 0x75, 0x29, 0x6e, 0x95 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 },
-+ .result = { 0x54, 0xce, 0x8f, 0x22, 0x75, 0xc0, 0x77, 0xe3,
-+ 0xb1, 0x30, 0x6a, 0x39, 0x39, 0xc5, 0xe0, 0x3e,
-+ 0xef, 0x6b, 0xbb, 0x88, 0x06, 0x05, 0x44, 0x75,
-+ 0x8d, 0x9f, 0xef, 0x59, 0xb0, 0xbc, 0x3e, 0x4f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0x68, 0xf0, 0x10, 0xd6, 0x2e, 0xe8, 0xd9, 0x26,
-+ 0x05, 0x3a, 0x36, 0x1c, 0x3a, 0x75, 0xc6, 0xea,
-+ 0x4e, 0xbd, 0xc8, 0x60, 0x6a, 0xb2, 0x85, 0x00,
-+ 0x3a, 0x6f, 0x8f, 0x40, 0x76, 0xb0, 0x1e, 0x83 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
-+ .result = { 0xf1, 0x36, 0x77, 0x5c, 0x5b, 0xeb, 0x0a, 0xf8,
-+ 0x11, 0x0a, 0xf1, 0x0b, 0x20, 0x37, 0x23, 0x32,
-+ 0x04, 0x3c, 0xab, 0x75, 0x24, 0x19, 0x67, 0x87,
-+ 0x75, 0xa2, 0x23, 0xdf, 0x57, 0xc9, 0xd3, 0x0d },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0x58, 0xeb, 0xcb, 0x35, 0xb0, 0xf8, 0x84, 0x5c,
-+ 0xaf, 0x1e, 0xc6, 0x30, 0xf9, 0x65, 0x76, 0xb6,
-+ 0x2c, 0x4b, 0x7b, 0x6c, 0x36, 0xb2, 0x9d, 0xeb,
-+ 0x2c, 0xb0, 0x08, 0x46, 0x51, 0x75, 0x5c, 0x96 },
-+ .public = { 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xff,
-+ 0xff, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
-+ 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf7, 0xff,
-+ 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x3f },
-+ .result = { 0xbf, 0x9a, 0xff, 0xd0, 0x6b, 0x84, 0x40, 0x85,
-+ 0x58, 0x64, 0x60, 0x96, 0x2e, 0xf2, 0x14, 0x6f,
-+ 0xf3, 0xd4, 0x53, 0x3d, 0x94, 0x44, 0xaa, 0xb0,
-+ 0x06, 0xeb, 0x88, 0xcc, 0x30, 0x54, 0x40, 0x7d },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0x18, 0x8c, 0x4b, 0xc5, 0xb9, 0xc4, 0x4b, 0x38,
-+ 0xbb, 0x65, 0x8b, 0x9b, 0x2a, 0xe8, 0x2d, 0x5b,
-+ 0x01, 0x01, 0x5e, 0x09, 0x31, 0x84, 0xb1, 0x7c,
-+ 0xb7, 0x86, 0x35, 0x03, 0xa7, 0x83, 0xe1, 0xbb },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .result = { 0xd4, 0x80, 0xde, 0x04, 0xf6, 0x99, 0xcb, 0x3b,
-+ 0xe0, 0x68, 0x4a, 0x9c, 0xc2, 0xe3, 0x12, 0x81,
-+ 0xea, 0x0b, 0xc5, 0xa9, 0xdc, 0xc1, 0x57, 0xd3,
-+ 0xd2, 0x01, 0x58, 0xd4, 0x6c, 0xa5, 0x24, 0x6d },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0xe0, 0x6c, 0x11, 0xbb, 0x2e, 0x13, 0xce, 0x3d,
-+ 0xc7, 0x67, 0x3f, 0x67, 0xf5, 0x48, 0x22, 0x42,
-+ 0x90, 0x94, 0x23, 0xa9, 0xae, 0x95, 0xee, 0x98,
-+ 0x6a, 0x98, 0x8d, 0x98, 0xfa, 0xee, 0x23, 0xa2 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f },
-+ .result = { 0x4c, 0x44, 0x01, 0xcc, 0xe6, 0xb5, 0x1e, 0x4c,
-+ 0xb1, 0x8f, 0x27, 0x90, 0x24, 0x6c, 0x9b, 0xf9,
-+ 0x14, 0xdb, 0x66, 0x77, 0x50, 0xa1, 0xcb, 0x89,
-+ 0x06, 0x90, 0x92, 0xaf, 0x07, 0x29, 0x22, 0x76 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for public key */
-+ {
-+ .private = { 0xc0, 0x65, 0x8c, 0x46, 0xdd, 0xe1, 0x81, 0x29,
-+ 0x29, 0x38, 0x77, 0x53, 0x5b, 0x11, 0x62, 0xb6,
-+ 0xf9, 0xf5, 0x41, 0x4a, 0x23, 0xcf, 0x4d, 0x2c,
-+ 0xbc, 0x14, 0x0a, 0x4d, 0x99, 0xda, 0x2b, 0x8f },
-+ .public = { 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x57, 0x8b, 0xa8, 0xcc, 0x2d, 0xbd, 0xc5, 0x75,
-+ 0xaf, 0xcf, 0x9d, 0xf2, 0xb3, 0xee, 0x61, 0x89,
-+ 0xf5, 0x33, 0x7d, 0x68, 0x54, 0xc7, 0x9b, 0x4c,
-+ 0xe1, 0x65, 0xea, 0x12, 0x29, 0x3b, 0x3a, 0x0f },
-+ .valid = true
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x10, 0x25, 0x5c, 0x92, 0x30, 0xa9, 0x7a, 0x30,
-+ 0xa4, 0x58, 0xca, 0x28, 0x4a, 0x62, 0x96, 0x69,
-+ 0x29, 0x3a, 0x31, 0x89, 0x0c, 0xda, 0x9d, 0x14,
-+ 0x7f, 0xeb, 0xc7, 0xd1, 0xe2, 0x2d, 0x6b, 0xb1 },
-+ .public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
-+ 0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
-+ 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
-+ 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x78, 0xf1, 0xe8, 0xed, 0xf1, 0x44, 0x81, 0xb3,
-+ 0x89, 0x44, 0x8d, 0xac, 0x8f, 0x59, 0xc7, 0x0b,
-+ 0x03, 0x8e, 0x7c, 0xf9, 0x2e, 0xf2, 0xc7, 0xef,
-+ 0xf5, 0x7a, 0x72, 0x46, 0x6e, 0x11, 0x52, 0x96 },
-+ .public = { 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24,
-+ 0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b,
-+ 0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86,
-+ 0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0x57 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0xa0, 0xa0, 0x5a, 0x3e, 0x8f, 0x9f, 0x44, 0x20,
-+ 0x4d, 0x5f, 0x80, 0x59, 0xa9, 0x4a, 0xc7, 0xdf,
-+ 0xc3, 0x9a, 0x49, 0xac, 0x01, 0x6d, 0xd7, 0x43,
-+ 0xdb, 0xfa, 0x43, 0xc5, 0xd6, 0x71, 0xfd, 0x88 },
-+ .public = { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0xd0, 0xdb, 0xb3, 0xed, 0x19, 0x06, 0x66, 0x3f,
-+ 0x15, 0x42, 0x0a, 0xf3, 0x1f, 0x4e, 0xaf, 0x65,
-+ 0x09, 0xd9, 0xa9, 0x94, 0x97, 0x23, 0x50, 0x06,
-+ 0x05, 0xad, 0x7c, 0x1c, 0x6e, 0x74, 0x50, 0xa9 },
-+ .public = { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0xc0, 0xb1, 0xd0, 0xeb, 0x22, 0xb2, 0x44, 0xfe,
-+ 0x32, 0x91, 0x14, 0x00, 0x72, 0xcd, 0xd9, 0xd9,
-+ 0x89, 0xb5, 0xf0, 0xec, 0xd9, 0x6c, 0x10, 0x0f,
-+ 0xeb, 0x5b, 0xca, 0x24, 0x1c, 0x1d, 0x9f, 0x8f },
-+ .public = { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x48, 0x0b, 0xf4, 0x5f, 0x59, 0x49, 0x42, 0xa8,
-+ 0xbc, 0x0f, 0x33, 0x53, 0xc6, 0xe8, 0xb8, 0x85,
-+ 0x3d, 0x77, 0xf3, 0x51, 0xf1, 0xc2, 0xca, 0x6c,
-+ 0x2d, 0x1a, 0xbf, 0x8a, 0x00, 0xb4, 0x22, 0x9c },
-+ .public = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x30, 0xf9, 0x93, 0xfc, 0xf8, 0x51, 0x4f, 0xc8,
-+ 0x9b, 0xd8, 0xdb, 0x14, 0xcd, 0x43, 0xba, 0x0d,
-+ 0x4b, 0x25, 0x30, 0xe7, 0x3c, 0x42, 0x76, 0xa0,
-+ 0x5e, 0x1b, 0x14, 0x5d, 0x42, 0x0c, 0xed, 0xb4 },
-+ .public = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0xc0, 0x49, 0x74, 0xb7, 0x58, 0x38, 0x0e, 0x2a,
-+ 0x5b, 0x5d, 0xf6, 0xeb, 0x09, 0xbb, 0x2f, 0x6b,
-+ 0x34, 0x34, 0xf9, 0x82, 0x72, 0x2a, 0x8e, 0x67,
-+ 0x6d, 0x3d, 0xa2, 0x51, 0xd1, 0xb3, 0xde, 0x83 },
-+ .public = { 0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae,
-+ 0x16, 0x56, 0xe3, 0xfa, 0xf1, 0x9f, 0xc4, 0x6a,
-+ 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32, 0xb1, 0xfd,
-+ 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x80 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x50, 0x2a, 0x31, 0x37, 0x3d, 0xb3, 0x24, 0x46,
-+ 0x84, 0x2f, 0xe5, 0xad, 0xd3, 0xe0, 0x24, 0x02,
-+ 0x2e, 0xa5, 0x4f, 0x27, 0x41, 0x82, 0xaf, 0xc3,
-+ 0xd9, 0xf1, 0xbb, 0x3d, 0x39, 0x53, 0x4e, 0xb5 },
-+ .public = { 0x5f, 0x9c, 0x95, 0xbc, 0xa3, 0x50, 0x8c, 0x24,
-+ 0xb1, 0xd0, 0xb1, 0x55, 0x9c, 0x83, 0xef, 0x5b,
-+ 0x04, 0x44, 0x5c, 0xc4, 0x58, 0x1c, 0x8e, 0x86,
-+ 0xd8, 0x22, 0x4e, 0xdd, 0xd0, 0x9f, 0x11, 0xd7 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x90, 0xfa, 0x64, 0x17, 0xb0, 0xe3, 0x70, 0x30,
-+ 0xfd, 0x6e, 0x43, 0xef, 0xf2, 0xab, 0xae, 0xf1,
-+ 0x4c, 0x67, 0x93, 0x11, 0x7a, 0x03, 0x9c, 0xf6,
-+ 0x21, 0x31, 0x8b, 0xa9, 0x0f, 0x4e, 0x98, 0xbe },
-+ .public = { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x78, 0xad, 0x3f, 0x26, 0x02, 0x7f, 0x1c, 0x9f,
-+ 0xdd, 0x97, 0x5a, 0x16, 0x13, 0xb9, 0x47, 0x77,
-+ 0x9b, 0xad, 0x2c, 0xf2, 0xb7, 0x41, 0xad, 0xe0,
-+ 0x18, 0x40, 0x88, 0x5a, 0x30, 0xbb, 0x97, 0x9c },
-+ .public = { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key with low order */
-+ {
-+ .private = { 0x98, 0xe2, 0x3d, 0xe7, 0xb1, 0xe0, 0x92, 0x6e,
-+ 0xd9, 0xc8, 0x7e, 0x7b, 0x14, 0xba, 0xf5, 0x5f,
-+ 0x49, 0x7a, 0x1d, 0x70, 0x96, 0xf9, 0x39, 0x77,
-+ 0x68, 0x0e, 0x44, 0xdc, 0x1c, 0x7b, 0x7b, 0x8b },
-+ .public = { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = false
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xf0, 0x1e, 0x48, 0xda, 0xfa, 0xc9, 0xd7, 0xbc,
-+ 0xf5, 0x89, 0xcb, 0xc3, 0x82, 0xc8, 0x78, 0xd1,
-+ 0x8b, 0xda, 0x35, 0x50, 0x58, 0x9f, 0xfb, 0x5d,
-+ 0x50, 0xb5, 0x23, 0xbe, 0xbe, 0x32, 0x9d, 0xae },
-+ .public = { 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0xbd, 0x36, 0xa0, 0x79, 0x0e, 0xb8, 0x83, 0x09,
-+ 0x8c, 0x98, 0x8b, 0x21, 0x78, 0x67, 0x73, 0xde,
-+ 0x0b, 0x3a, 0x4d, 0xf1, 0x62, 0x28, 0x2c, 0xf1,
-+ 0x10, 0xde, 0x18, 0xdd, 0x48, 0x4c, 0xe7, 0x4b },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x28, 0x87, 0x96, 0xbc, 0x5a, 0xff, 0x4b, 0x81,
-+ 0xa3, 0x75, 0x01, 0x75, 0x7b, 0xc0, 0x75, 0x3a,
-+ 0x3c, 0x21, 0x96, 0x47, 0x90, 0xd3, 0x86, 0x99,
-+ 0x30, 0x8d, 0xeb, 0xc1, 0x7a, 0x6e, 0xaf, 0x8d },
-+ .public = { 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0xb4, 0xe0, 0xdd, 0x76, 0xda, 0x7b, 0x07, 0x17,
-+ 0x28, 0xb6, 0x1f, 0x85, 0x67, 0x71, 0xaa, 0x35,
-+ 0x6e, 0x57, 0xed, 0xa7, 0x8a, 0x5b, 0x16, 0x55,
-+ 0xcc, 0x38, 0x20, 0xfb, 0x5f, 0x85, 0x4c, 0x5c },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x98, 0xdf, 0x84, 0x5f, 0x66, 0x51, 0xbf, 0x11,
-+ 0x38, 0x22, 0x1f, 0x11, 0x90, 0x41, 0xf7, 0x2b,
-+ 0x6d, 0xbc, 0x3c, 0x4a, 0xce, 0x71, 0x43, 0xd9,
-+ 0x9f, 0xd5, 0x5a, 0xd8, 0x67, 0x48, 0x0d, 0xa8 },
-+ .public = { 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x6f, 0xdf, 0x6c, 0x37, 0x61, 0x1d, 0xbd, 0x53,
-+ 0x04, 0xdc, 0x0f, 0x2e, 0xb7, 0xc9, 0x51, 0x7e,
-+ 0xb3, 0xc5, 0x0e, 0x12, 0xfd, 0x05, 0x0a, 0xc6,
-+ 0xde, 0xc2, 0x70, 0x71, 0xd4, 0xbf, 0xc0, 0x34 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xf0, 0x94, 0x98, 0xe4, 0x6f, 0x02, 0xf8, 0x78,
-+ 0x82, 0x9e, 0x78, 0xb8, 0x03, 0xd3, 0x16, 0xa2,
-+ 0xed, 0x69, 0x5d, 0x04, 0x98, 0xa0, 0x8a, 0xbd,
-+ 0xf8, 0x27, 0x69, 0x30, 0xe2, 0x4e, 0xdc, 0xb0 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .result = { 0x4c, 0x8f, 0xc4, 0xb1, 0xc6, 0xab, 0x88, 0xfb,
-+ 0x21, 0xf1, 0x8f, 0x6d, 0x4c, 0x81, 0x02, 0x40,
-+ 0xd4, 0xe9, 0x46, 0x51, 0xba, 0x44, 0xf7, 0xa2,
-+ 0xc8, 0x63, 0xce, 0xc7, 0xdc, 0x56, 0x60, 0x2d },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x18, 0x13, 0xc1, 0x0a, 0x5c, 0x7f, 0x21, 0xf9,
-+ 0x6e, 0x17, 0xf2, 0x88, 0xc0, 0xcc, 0x37, 0x60,
-+ 0x7c, 0x04, 0xc5, 0xf5, 0xae, 0xa2, 0xdb, 0x13,
-+ 0x4f, 0x9e, 0x2f, 0xfc, 0x66, 0xbd, 0x9d, 0xb8 },
-+ .public = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .result = { 0x1c, 0xd0, 0xb2, 0x82, 0x67, 0xdc, 0x54, 0x1c,
-+ 0x64, 0x2d, 0x6d, 0x7d, 0xca, 0x44, 0xa8, 0xb3,
-+ 0x8a, 0x63, 0x73, 0x6e, 0xef, 0x5c, 0x4e, 0x65,
-+ 0x01, 0xff, 0xbb, 0xb1, 0x78, 0x0c, 0x03, 0x3c },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x78, 0x57, 0xfb, 0x80, 0x86, 0x53, 0x64, 0x5a,
-+ 0x0b, 0xeb, 0x13, 0x8a, 0x64, 0xf5, 0xf4, 0xd7,
-+ 0x33, 0xa4, 0x5e, 0xa8, 0x4c, 0x3c, 0xda, 0x11,
-+ 0xa9, 0xc0, 0x6f, 0x7e, 0x71, 0x39, 0x14, 0x9e },
-+ .public = { 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .result = { 0x87, 0x55, 0xbe, 0x01, 0xc6, 0x0a, 0x7e, 0x82,
-+ 0x5c, 0xff, 0x3e, 0x0e, 0x78, 0xcb, 0x3a, 0xa4,
-+ 0x33, 0x38, 0x61, 0x51, 0x6a, 0xa5, 0x9b, 0x1c,
-+ 0x51, 0xa8, 0xb2, 0xa5, 0x43, 0xdf, 0xa8, 0x22 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xe0, 0x3a, 0xa8, 0x42, 0xe2, 0xab, 0xc5, 0x6e,
-+ 0x81, 0xe8, 0x7b, 0x8b, 0x9f, 0x41, 0x7b, 0x2a,
-+ 0x1e, 0x59, 0x13, 0xc7, 0x23, 0xee, 0xd2, 0x8d,
-+ 0x75, 0x2f, 0x8d, 0x47, 0xa5, 0x9f, 0x49, 0x8f },
-+ .public = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 },
-+ .result = { 0x54, 0xc9, 0xa1, 0xed, 0x95, 0xe5, 0x46, 0xd2,
-+ 0x78, 0x22, 0xa3, 0x60, 0x93, 0x1d, 0xda, 0x60,
-+ 0xa1, 0xdf, 0x04, 0x9d, 0xa6, 0xf9, 0x04, 0x25,
-+ 0x3c, 0x06, 0x12, 0xbb, 0xdc, 0x08, 0x74, 0x76 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xf8, 0xf7, 0x07, 0xb7, 0x99, 0x9b, 0x18, 0xcb,
-+ 0x0d, 0x6b, 0x96, 0x12, 0x4f, 0x20, 0x45, 0x97,
-+ 0x2c, 0xa2, 0x74, 0xbf, 0xc1, 0x54, 0xad, 0x0c,
-+ 0x87, 0x03, 0x8c, 0x24, 0xc6, 0xd0, 0xd4, 0xb2 },
-+ .public = { 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0xcc, 0x1f, 0x40, 0xd7, 0x43, 0xcd, 0xc2, 0x23,
-+ 0x0e, 0x10, 0x43, 0xda, 0xba, 0x8b, 0x75, 0xe8,
-+ 0x10, 0xf1, 0xfb, 0xab, 0x7f, 0x25, 0x52, 0x69,
-+ 0xbd, 0x9e, 0xbb, 0x29, 0xe6, 0xbf, 0x49, 0x4f },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xa0, 0x34, 0xf6, 0x84, 0xfa, 0x63, 0x1e, 0x1a,
-+ 0x34, 0x81, 0x18, 0xc1, 0xce, 0x4c, 0x98, 0x23,
-+ 0x1f, 0x2d, 0x9e, 0xec, 0x9b, 0xa5, 0x36, 0x5b,
-+ 0x4a, 0x05, 0xd6, 0x9a, 0x78, 0x5b, 0x07, 0x96 },
-+ .public = { 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x54, 0x99, 0x8e, 0xe4, 0x3a, 0x5b, 0x00, 0x7b,
-+ 0xf4, 0x99, 0xf0, 0x78, 0xe7, 0x36, 0x52, 0x44,
-+ 0x00, 0xa8, 0xb5, 0xc7, 0xe9, 0xb9, 0xb4, 0x37,
-+ 0x71, 0x74, 0x8c, 0x7c, 0xdf, 0x88, 0x04, 0x12 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x30, 0xb6, 0xc6, 0xa0, 0xf2, 0xff, 0xa6, 0x80,
-+ 0x76, 0x8f, 0x99, 0x2b, 0xa8, 0x9e, 0x15, 0x2d,
-+ 0x5b, 0xc9, 0x89, 0x3d, 0x38, 0xc9, 0x11, 0x9b,
-+ 0xe4, 0xf7, 0x67, 0xbf, 0xab, 0x6e, 0x0c, 0xa5 },
-+ .public = { 0xdc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0xea, 0xd9, 0xb3, 0x8e, 0xfd, 0xd7, 0x23, 0x63,
-+ 0x79, 0x34, 0xe5, 0x5a, 0xb7, 0x17, 0xa7, 0xae,
-+ 0x09, 0xeb, 0x86, 0xa2, 0x1d, 0xc3, 0x6a, 0x3f,
-+ 0xee, 0xb8, 0x8b, 0x75, 0x9e, 0x39, 0x1e, 0x09 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x90, 0x1b, 0x9d, 0xcf, 0x88, 0x1e, 0x01, 0xe0,
-+ 0x27, 0x57, 0x50, 0x35, 0xd4, 0x0b, 0x43, 0xbd,
-+ 0xc1, 0xc5, 0x24, 0x2e, 0x03, 0x08, 0x47, 0x49,
-+ 0x5b, 0x0c, 0x72, 0x86, 0x46, 0x9b, 0x65, 0x91 },
-+ .public = { 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x60, 0x2f, 0xf4, 0x07, 0x89, 0xb5, 0x4b, 0x41,
-+ 0x80, 0x59, 0x15, 0xfe, 0x2a, 0x62, 0x21, 0xf0,
-+ 0x7a, 0x50, 0xff, 0xc2, 0xc3, 0xfc, 0x94, 0xcf,
-+ 0x61, 0xf1, 0x3d, 0x79, 0x04, 0xe8, 0x8e, 0x0e },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x80, 0x46, 0x67, 0x7c, 0x28, 0xfd, 0x82, 0xc9,
-+ 0xa1, 0xbd, 0xb7, 0x1a, 0x1a, 0x1a, 0x34, 0xfa,
-+ 0xba, 0x12, 0x25, 0xe2, 0x50, 0x7f, 0xe3, 0xf5,
-+ 0x4d, 0x10, 0xbd, 0x5b, 0x0d, 0x86, 0x5f, 0x8e },
-+ .public = { 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0xe0, 0x0a, 0xe8, 0xb1, 0x43, 0x47, 0x12, 0x47,
-+ 0xba, 0x24, 0xf1, 0x2c, 0x88, 0x55, 0x36, 0xc3,
-+ 0xcb, 0x98, 0x1b, 0x58, 0xe1, 0xe5, 0x6b, 0x2b,
-+ 0xaf, 0x35, 0xc1, 0x2a, 0xe1, 0xf7, 0x9c, 0x26 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x60, 0x2f, 0x7e, 0x2f, 0x68, 0xa8, 0x46, 0xb8,
-+ 0x2c, 0xc2, 0x69, 0xb1, 0xd4, 0x8e, 0x93, 0x98,
-+ 0x86, 0xae, 0x54, 0xfd, 0x63, 0x6c, 0x1f, 0xe0,
-+ 0x74, 0xd7, 0x10, 0x12, 0x7d, 0x47, 0x24, 0x91 },
-+ .public = { 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x98, 0xcb, 0x9b, 0x50, 0xdd, 0x3f, 0xc2, 0xb0,
-+ 0xd4, 0xf2, 0xd2, 0xbf, 0x7c, 0x5c, 0xfd, 0xd1,
-+ 0x0c, 0x8f, 0xcd, 0x31, 0xfc, 0x40, 0xaf, 0x1a,
-+ 0xd4, 0x4f, 0x47, 0xc1, 0x31, 0x37, 0x63, 0x62 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x60, 0x88, 0x7b, 0x3d, 0xc7, 0x24, 0x43, 0x02,
-+ 0x6e, 0xbe, 0xdb, 0xbb, 0xb7, 0x06, 0x65, 0xf4,
-+ 0x2b, 0x87, 0xad, 0xd1, 0x44, 0x0e, 0x77, 0x68,
-+ 0xfb, 0xd7, 0xe8, 0xe2, 0xce, 0x5f, 0x63, 0x9d },
-+ .public = { 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x38, 0xd6, 0x30, 0x4c, 0x4a, 0x7e, 0x6d, 0x9f,
-+ 0x79, 0x59, 0x33, 0x4f, 0xb5, 0x24, 0x5b, 0xd2,
-+ 0xc7, 0x54, 0x52, 0x5d, 0x4c, 0x91, 0xdb, 0x95,
-+ 0x02, 0x06, 0x92, 0x62, 0x34, 0xc1, 0xf6, 0x33 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0x78, 0xd3, 0x1d, 0xfa, 0x85, 0x44, 0x97, 0xd7,
-+ 0x2d, 0x8d, 0xef, 0x8a, 0x1b, 0x7f, 0xb0, 0x06,
-+ 0xce, 0xc2, 0xd8, 0xc4, 0x92, 0x46, 0x47, 0xc9,
-+ 0x38, 0x14, 0xae, 0x56, 0xfa, 0xed, 0xa4, 0x95 },
-+ .public = { 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x78, 0x6c, 0xd5, 0x49, 0x96, 0xf0, 0x14, 0xa5,
-+ 0xa0, 0x31, 0xec, 0x14, 0xdb, 0x81, 0x2e, 0xd0,
-+ 0x83, 0x55, 0x06, 0x1f, 0xdb, 0x5d, 0xe6, 0x80,
-+ 0xa8, 0x00, 0xac, 0x52, 0x1f, 0x31, 0x8e, 0x23 },
-+ .valid = true
-+ },
-+ /* wycheproof - public key >= p */
-+ {
-+ .private = { 0xc0, 0x4c, 0x5b, 0xae, 0xfa, 0x83, 0x02, 0xdd,
-+ 0xde, 0xd6, 0xa4, 0xbb, 0x95, 0x77, 0x61, 0xb4,
-+ 0xeb, 0x97, 0xae, 0xfa, 0x4f, 0xc3, 0xb8, 0x04,
-+ 0x30, 0x85, 0xf9, 0x6a, 0x56, 0x59, 0xb3, 0xa5 },
-+ .public = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
-+ .result = { 0x29, 0xae, 0x8b, 0xc7, 0x3e, 0x9b, 0x10, 0xa0,
-+ 0x8b, 0x4f, 0x68, 0x1c, 0x43, 0xc3, 0xe0, 0xac,
-+ 0x1a, 0x17, 0x1d, 0x31, 0xb3, 0x8f, 0x1a, 0x48,
-+ 0xef, 0xba, 0x29, 0xae, 0x63, 0x9e, 0xa1, 0x34 },
-+ .valid = true
-+ },
-+ /* wycheproof - RFC 7748 */
-+ {
-+ .private = { 0xa0, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d,
-+ 0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd,
-+ 0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18,
-+ 0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0x44 },
-+ .public = { 0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb,
-+ 0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c,
-+ 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b,
-+ 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c },
-+ .result = { 0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90,
-+ 0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f,
-+ 0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7,
-+ 0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52 },
-+ .valid = true
-+ },
-+ /* wycheproof - RFC 7748 */
-+ {
-+ .private = { 0x48, 0x66, 0xe9, 0xd4, 0xd1, 0xb4, 0x67, 0x3c,
-+ 0x5a, 0xd2, 0x26, 0x91, 0x95, 0x7d, 0x6a, 0xf5,
-+ 0xc1, 0x1b, 0x64, 0x21, 0xe0, 0xea, 0x01, 0xd4,
-+ 0x2c, 0xa4, 0x16, 0x9e, 0x79, 0x18, 0xba, 0x4d },
-+ .public = { 0xe5, 0x21, 0x0f, 0x12, 0x78, 0x68, 0x11, 0xd3,
-+ 0xf4, 0xb7, 0x95, 0x9d, 0x05, 0x38, 0xae, 0x2c,
-+ 0x31, 0xdb, 0xe7, 0x10, 0x6f, 0xc0, 0x3c, 0x3e,
-+ 0xfc, 0x4c, 0xd5, 0x49, 0xc7, 0x15, 0xa4, 0x13 },
-+ .result = { 0x95, 0xcb, 0xde, 0x94, 0x76, 0xe8, 0x90, 0x7d,
-+ 0x7a, 0xad, 0xe4, 0x5c, 0xb4, 0xb8, 0x73, 0xf8,
-+ 0x8b, 0x59, 0x5a, 0x68, 0x79, 0x9f, 0xa1, 0x52,
-+ 0xe6, 0xf8, 0xf7, 0x64, 0x7a, 0xac, 0x79, 0x57 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x0a, 0xb4, 0xe7, 0x63, 0x80, 0xd8, 0x4d, 0xde,
-+ 0x4f, 0x68, 0x33, 0xc5, 0x8f, 0x2a, 0x9f, 0xb8,
-+ 0xf8, 0x3b, 0xb0, 0x16, 0x9b, 0x17, 0x2b, 0xe4,
-+ 0xb6, 0xe0, 0x59, 0x28, 0x87, 0x74, 0x1a, 0x36 },
-+ .result = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x89, 0xe1, 0x0d, 0x57, 0x01, 0xb4, 0x33, 0x7d,
-+ 0x2d, 0x03, 0x21, 0x81, 0x53, 0x8b, 0x10, 0x64,
-+ 0xbd, 0x40, 0x84, 0x40, 0x1c, 0xec, 0xa1, 0xfd,
-+ 0x12, 0x66, 0x3a, 0x19, 0x59, 0x38, 0x80, 0x00 },
-+ .result = { 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x2b, 0x55, 0xd3, 0xaa, 0x4a, 0x8f, 0x80, 0xc8,
-+ 0xc0, 0xb2, 0xae, 0x5f, 0x93, 0x3e, 0x85, 0xaf,
-+ 0x49, 0xbe, 0xac, 0x36, 0xc2, 0xfa, 0x73, 0x94,
-+ 0xba, 0xb7, 0x6c, 0x89, 0x33, 0xf8, 0xf8, 0x1d },
-+ .result = { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x63, 0xe5, 0xb1, 0xfe, 0x96, 0x01, 0xfe, 0x84,
-+ 0x38, 0x5d, 0x88, 0x66, 0xb0, 0x42, 0x12, 0x62,
-+ 0xf7, 0x8f, 0xbf, 0xa5, 0xaf, 0xf9, 0x58, 0x5e,
-+ 0x62, 0x66, 0x79, 0xb1, 0x85, 0x47, 0xd9, 0x59 },
-+ .result = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0xe4, 0x28, 0xf3, 0xda, 0xc1, 0x78, 0x09, 0xf8,
-+ 0x27, 0xa5, 0x22, 0xce, 0x32, 0x35, 0x50, 0x58,
-+ 0xd0, 0x73, 0x69, 0x36, 0x4a, 0xa7, 0x89, 0x02,
-+ 0xee, 0x10, 0x13, 0x9b, 0x9f, 0x9d, 0xd6, 0x53 },
-+ .result = { 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0xb3, 0xb5, 0x0e, 0x3e, 0xd3, 0xa4, 0x07, 0xb9,
-+ 0x5d, 0xe9, 0x42, 0xef, 0x74, 0x57, 0x5b, 0x5a,
-+ 0xb8, 0xa1, 0x0c, 0x09, 0xee, 0x10, 0x35, 0x44,
-+ 0xd6, 0x0b, 0xdf, 0xed, 0x81, 0x38, 0xab, 0x2b },
-+ .result = { 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x21, 0x3f, 0xff, 0xe9, 0x3d, 0x5e, 0xa8, 0xcd,
-+ 0x24, 0x2e, 0x46, 0x28, 0x44, 0x02, 0x99, 0x22,
-+ 0xc4, 0x3c, 0x77, 0xc9, 0xe3, 0xe4, 0x2f, 0x56,
-+ 0x2f, 0x48, 0x5d, 0x24, 0xc5, 0x01, 0xa2, 0x0b },
-+ .result = { 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x91, 0xb2, 0x32, 0xa1, 0x78, 0xb3, 0xcd, 0x53,
-+ 0x09, 0x32, 0x44, 0x1e, 0x61, 0x39, 0x41, 0x8f,
-+ 0x72, 0x17, 0x22, 0x92, 0xf1, 0xda, 0x4c, 0x18,
-+ 0x34, 0xfc, 0x5e, 0xbf, 0xef, 0xb5, 0x1e, 0x3f },
-+ .result = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x04, 0x5c, 0x6e, 0x11, 0xc5, 0xd3, 0x32, 0x55,
-+ 0x6c, 0x78, 0x22, 0xfe, 0x94, 0xeb, 0xf8, 0x9b,
-+ 0x56, 0xa3, 0x87, 0x8d, 0xc2, 0x7c, 0xa0, 0x79,
-+ 0x10, 0x30, 0x58, 0x84, 0x9f, 0xab, 0xcb, 0x4f },
-+ .result = { 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x1c, 0xa2, 0x19, 0x0b, 0x71, 0x16, 0x35, 0x39,
-+ 0x06, 0x3c, 0x35, 0x77, 0x3b, 0xda, 0x0c, 0x9c,
-+ 0x92, 0x8e, 0x91, 0x36, 0xf0, 0x62, 0x0a, 0xeb,
-+ 0x09, 0x3f, 0x09, 0x91, 0x97, 0xb7, 0xf7, 0x4e },
-+ .result = { 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0xf7, 0x6e, 0x90, 0x10, 0xac, 0x33, 0xc5, 0x04,
-+ 0x3b, 0x2d, 0x3b, 0x76, 0xa8, 0x42, 0x17, 0x10,
-+ 0x00, 0xc4, 0x91, 0x62, 0x22, 0xe9, 0xe8, 0x58,
-+ 0x97, 0xa0, 0xae, 0xc7, 0xf6, 0x35, 0x0b, 0x3c },
-+ .result = { 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0xbb, 0x72, 0x68, 0x8d, 0x8f, 0x8a, 0xa7, 0xa3,
-+ 0x9c, 0xd6, 0x06, 0x0c, 0xd5, 0xc8, 0x09, 0x3c,
-+ 0xde, 0xc6, 0xfe, 0x34, 0x19, 0x37, 0xc3, 0x88,
-+ 0x6a, 0x99, 0x34, 0x6c, 0xd0, 0x7f, 0xaa, 0x55 },
-+ .result = { 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x88, 0xfd, 0xde, 0xa1, 0x93, 0x39, 0x1c, 0x6a,
-+ 0x59, 0x33, 0xef, 0x9b, 0x71, 0x90, 0x15, 0x49,
-+ 0x44, 0x72, 0x05, 0xaa, 0xe9, 0xda, 0x92, 0x8a,
-+ 0x6b, 0x91, 0xa3, 0x52, 0xba, 0x10, 0xf4, 0x1f },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 },
-+ .valid = true
-+ },
-+ /* wycheproof - edge case for shared secret */
-+ {
-+ .private = { 0xa0, 0xa4, 0xf1, 0x30, 0xb9, 0x8a, 0x5b, 0xe4,
-+ 0xb1, 0xce, 0xdb, 0x7c, 0xb8, 0x55, 0x84, 0xa3,
-+ 0x52, 0x0e, 0x14, 0x2d, 0x47, 0x4d, 0xc9, 0xcc,
-+ 0xb9, 0x09, 0xa0, 0x73, 0xa9, 0x76, 0xbf, 0x63 },
-+ .public = { 0x30, 0x3b, 0x39, 0x2f, 0x15, 0x31, 0x16, 0xca,
-+ 0xd9, 0xcc, 0x68, 0x2a, 0x00, 0xcc, 0xc4, 0x4c,
-+ 0x95, 0xff, 0x0d, 0x3b, 0xbe, 0x56, 0x8b, 0xeb,
-+ 0x6c, 0x4e, 0x73, 0x9b, 0xaf, 0xdc, 0x2c, 0x68 },
-+ .result = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 },
-+ .valid = true
-+ },
-+ /* wycheproof - checking for overflow */
-+ {
-+ .private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .public = { 0xfd, 0x30, 0x0a, 0xeb, 0x40, 0xe1, 0xfa, 0x58,
-+ 0x25, 0x18, 0x41, 0x2b, 0x49, 0xb2, 0x08, 0xa7,
-+ 0x84, 0x2b, 0x1e, 0x1f, 0x05, 0x6a, 0x04, 0x01,
-+ 0x78, 0xea, 0x41, 0x41, 0x53, 0x4f, 0x65, 0x2d },
-+ .result = { 0xb7, 0x34, 0x10, 0x5d, 0xc2, 0x57, 0x58, 0x5d,
-+ 0x73, 0xb5, 0x66, 0xcc, 0xb7, 0x6f, 0x06, 0x27,
-+ 0x95, 0xcc, 0xbe, 0xc8, 0x91, 0x28, 0xe5, 0x2b,
-+ 0x02, 0xf3, 0xe5, 0x96, 0x39, 0xf1, 0x3c, 0x46 },
-+ .valid = true
-+ },
-+ /* wycheproof - checking for overflow */
-+ {
-+ .private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .public = { 0xc8, 0xef, 0x79, 0xb5, 0x14, 0xd7, 0x68, 0x26,
-+ 0x77, 0xbc, 0x79, 0x31, 0xe0, 0x6e, 0xe5, 0xc2,
-+ 0x7c, 0x9b, 0x39, 0x2b, 0x4a, 0xe9, 0x48, 0x44,
-+ 0x73, 0xf5, 0x54, 0xe6, 0x67, 0x8e, 0xcc, 0x2e },
-+ .result = { 0x64, 0x7a, 0x46, 0xb6, 0xfc, 0x3f, 0x40, 0xd6,
-+ 0x21, 0x41, 0xee, 0x3c, 0xee, 0x70, 0x6b, 0x4d,
-+ 0x7a, 0x92, 0x71, 0x59, 0x3a, 0x7b, 0x14, 0x3e,
-+ 0x8e, 0x2e, 0x22, 0x79, 0x88, 0x3e, 0x45, 0x50 },
-+ .valid = true
-+ },
-+ /* wycheproof - checking for overflow */
-+ {
-+ .private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .public = { 0x64, 0xae, 0xac, 0x25, 0x04, 0x14, 0x48, 0x61,
-+ 0x53, 0x2b, 0x7b, 0xbc, 0xb6, 0xc8, 0x7d, 0x67,
-+ 0xdd, 0x4c, 0x1f, 0x07, 0xeb, 0xc2, 0xe0, 0x6e,
-+ 0xff, 0xb9, 0x5a, 0xec, 0xc6, 0x17, 0x0b, 0x2c },
-+ .result = { 0x4f, 0xf0, 0x3d, 0x5f, 0xb4, 0x3c, 0xd8, 0x65,
-+ 0x7a, 0x3c, 0xf3, 0x7c, 0x13, 0x8c, 0xad, 0xce,
-+ 0xcc, 0xe5, 0x09, 0xe4, 0xeb, 0xa0, 0x89, 0xd0,
-+ 0xef, 0x40, 0xb4, 0xe4, 0xfb, 0x94, 0x61, 0x55 },
-+ .valid = true
-+ },
-+ /* wycheproof - checking for overflow */
-+ {
-+ .private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .public = { 0xbf, 0x68, 0xe3, 0x5e, 0x9b, 0xdb, 0x7e, 0xee,
-+ 0x1b, 0x50, 0x57, 0x02, 0x21, 0x86, 0x0f, 0x5d,
-+ 0xcd, 0xad, 0x8a, 0xcb, 0xab, 0x03, 0x1b, 0x14,
-+ 0x97, 0x4c, 0xc4, 0x90, 0x13, 0xc4, 0x98, 0x31 },
-+ .result = { 0x21, 0xce, 0xe5, 0x2e, 0xfd, 0xbc, 0x81, 0x2e,
-+ 0x1d, 0x02, 0x1a, 0x4a, 0xf1, 0xe1, 0xd8, 0xbc,
-+ 0x4d, 0xb3, 0xc4, 0x00, 0xe4, 0xd2, 0xa2, 0xc5,
-+ 0x6a, 0x39, 0x26, 0xdb, 0x4d, 0x99, 0xc6, 0x5b },
-+ .valid = true
-+ },
-+ /* wycheproof - checking for overflow */
-+ {
-+ .private = { 0xc8, 0x17, 0x24, 0x70, 0x40, 0x00, 0xb2, 0x6d,
-+ 0x31, 0x70, 0x3c, 0xc9, 0x7e, 0x3a, 0x37, 0x8d,
-+ 0x56, 0xfa, 0xd8, 0x21, 0x93, 0x61, 0xc8, 0x8c,
-+ 0xca, 0x8b, 0xd7, 0xc5, 0x71, 0x9b, 0x12, 0xb2 },
-+ .public = { 0x53, 0x47, 0xc4, 0x91, 0x33, 0x1a, 0x64, 0xb4,
-+ 0x3d, 0xdc, 0x68, 0x30, 0x34, 0xe6, 0x77, 0xf5,
-+ 0x3d, 0xc3, 0x2b, 0x52, 0xa5, 0x2a, 0x57, 0x7c,
-+ 0x15, 0xa8, 0x3b, 0xf2, 0x98, 0xe9, 0x9f, 0x19 },
-+ .result = { 0x18, 0xcb, 0x89, 0xe4, 0xe2, 0x0c, 0x0c, 0x2b,
-+ 0xd3, 0x24, 0x30, 0x52, 0x45, 0x26, 0x6c, 0x93,
-+ 0x27, 0x69, 0x0b, 0xbe, 0x79, 0xac, 0xb8, 0x8f,
-+ 0x5b, 0x8f, 0xb3, 0xf7, 0x4e, 0xca, 0x3e, 0x52 },
-+ .valid = true
-+ },
-+ /* wycheproof - private key == -1 (mod order) */
-+ {
-+ .private = { 0xa0, 0x23, 0xcd, 0xd0, 0x83, 0xef, 0x5b, 0xb8,
-+ 0x2f, 0x10, 0xd6, 0x2e, 0x59, 0xe1, 0x5a, 0x68,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50 },
-+ .public = { 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
-+ 0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
-+ 0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
-+ 0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
-+ .result = { 0x25, 0x8e, 0x04, 0x52, 0x3b, 0x8d, 0x25, 0x3e,
-+ 0xe6, 0x57, 0x19, 0xfc, 0x69, 0x06, 0xc6, 0x57,
-+ 0x19, 0x2d, 0x80, 0x71, 0x7e, 0xdc, 0x82, 0x8f,
-+ 0xa0, 0xaf, 0x21, 0x68, 0x6e, 0x2f, 0xaa, 0x75 },
-+ .valid = true
-+ },
-+ /* wycheproof - private key == 1 (mod order) on twist */
-+ {
-+ .private = { 0x58, 0x08, 0x3d, 0xd2, 0x61, 0xad, 0x91, 0xef,
-+ 0xf9, 0x52, 0x32, 0x2e, 0xc8, 0x24, 0xc6, 0x82,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f },
-+ .public = { 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
-+ 0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
-+ 0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
-+ 0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
-+ .result = { 0x2e, 0xae, 0x5e, 0xc3, 0xdd, 0x49, 0x4e, 0x9f,
-+ 0x2d, 0x37, 0xd2, 0x58, 0xf8, 0x73, 0xa8, 0xe6,
-+ 0xe9, 0xd0, 0xdb, 0xd1, 0xe3, 0x83, 0xef, 0x64,
-+ 0xd9, 0x8b, 0xb9, 0x1b, 0x3e, 0x0b, 0xe0, 0x35 },
-+ .valid = true
-+ }
-+};
-+
-+bool __init curve25519_selftest(void)
-+{
-+ bool success = true, ret, ret2;
-+ size_t i = 0, j;
-+ u8 in[CURVE25519_KEY_SIZE];
-+ u8 out[CURVE25519_KEY_SIZE], out2[CURVE25519_KEY_SIZE],
-+ out3[CURVE25519_KEY_SIZE];
-+
-+ for (i = 0; i < ARRAY_SIZE(curve25519_test_vectors); ++i) {
-+ memset(out, 0, CURVE25519_KEY_SIZE);
-+ ret = curve25519(out, curve25519_test_vectors[i].private,
-+ curve25519_test_vectors[i].public);
-+ if (ret != curve25519_test_vectors[i].valid ||
-+ memcmp(out, curve25519_test_vectors[i].result,
-+ CURVE25519_KEY_SIZE)) {
-+ pr_err("curve25519 self-test %zu: FAIL\n", i + 1);
-+ success = false;
-+ }
-+ }
-+
-+ for (i = 0; i < 5; ++i) {
-+ get_random_bytes(in, sizeof(in));
-+ ret = curve25519_generate_public(out, in);
-+ ret2 = curve25519(out2, in, (u8[CURVE25519_KEY_SIZE]){ 9 });
-+ curve25519_generic(out3, in, (u8[CURVE25519_KEY_SIZE]){ 9 });
-+ if (ret != ret2 ||
-+ memcmp(out, out2, CURVE25519_KEY_SIZE) ||
-+ memcmp(out, out3, CURVE25519_KEY_SIZE)) {
-+ pr_err("curve25519 basepoint self-test %zu: FAIL: input - 0x",
-+ i + 1);
-+ for (j = CURVE25519_KEY_SIZE; j-- > 0;)
-+ printk(KERN_CONT "%02x", in[j]);
-+ printk(KERN_CONT "\n");
-+ success = false;
-+ }
-+ }
-+
-+ return success;
-+}
---- a/lib/crypto/curve25519.c
-+++ b/lib/crypto/curve25519.c
-@@ -13,6 +13,8 @@
- #include <linux/module.h>
- #include <linux/init.h>
-
-+bool curve25519_selftest(void);
-+
- const u8 curve25519_null_point[CURVE25519_KEY_SIZE] __aligned(32) = { 0 };
- const u8 curve25519_base_point[CURVE25519_KEY_SIZE] __aligned(32) = { 9 };
-
-@@ -20,6 +22,21 @@ EXPORT_SYMBOL(curve25519_null_point);
- EXPORT_SYMBOL(curve25519_base_point);
- EXPORT_SYMBOL(curve25519_generic);
-
-+static int __init mod_init(void)
-+{
-+ if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
-+ WARN_ON(!curve25519_selftest()))
-+ return -ENODEV;
-+ return 0;
-+}
-+
-+static void __exit mod_exit(void)
-+{
-+}
-+
-+module_init(mod_init);
-+module_exit(mod_exit);
-+
- MODULE_LICENSE("GPL v2");
- MODULE_DESCRIPTION("Curve25519 scalar multiplication");
- MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0041-crypto-poly1305-add-new-32-and-64-bit-generic-versio.patch b/target/linux/generic/backport-5.4/080-wireguard-0041-crypto-poly1305-add-new-32-and-64-bit-generic-versio.patch
deleted file mode 100644
index c41ef55b14..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0041-crypto-poly1305-add-new-32-and-64-bit-generic-versio.patch
+++ /dev/null
@@ -1,1164 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 5 Jan 2020 22:40:46 -0500
-Subject: [PATCH] crypto: poly1305 - add new 32 and 64-bit generic versions
-
-commit 1c08a104360f3e18f4ee6346c21cc3923efb952e upstream.
-
-These two C implementations from Zinc -- a 32x32 one and a 64x64 one,
-depending on the platform -- come from Andrew Moon's public domain
-poly1305-donna portable code, modified for usage in the kernel. The
-precomputation in the 32-bit version and the use of 64x64 multiplies in
-the 64-bit version make these perform better than the code it replaces.
-Moon's code is also very widespread and has received many eyeballs of
-scrutiny.
-
-There's a bit of interference between the x86 implementation, which
-relies on internal details of the old scalar implementation. In the next
-commit, the x86 implementation will be replaced with a faster one that
-doesn't rely on this, so none of this matters much. But for now, to keep
-this passing the tests, we inline the bits of the old implementation
-that the x86 implementation relied on. Also, since we now support a
-slightly larger key space, via the union, some offsets had to be fixed
-up.
-
-Nonce calculation was folded in with the emit function, to take
-advantage of 64x64 arithmetic. However, Adiantum appeared to rely on no
-nonce handling in emit, so this path was conditionalized. We also
-introduced a new struct, poly1305_core_key, to represent the precise
-amount of space that particular implementation uses.
-
-Testing with kbench9000, depending on the CPU, the update function for
-the 32x32 version has been improved by 4%-7%, and for the 64x64 by
-19%-30%. The 32x32 gains are small, but I think there's great value in
-having a parallel implementation to the 64x64 one so that the two can be
-compared side-by-side as nice stand-alone units.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305-avx2-x86_64.S | 20 +--
- arch/x86/crypto/poly1305_glue.c | 215 +++++++++++++++++++++++--
- crypto/adiantum.c | 4 +-
- crypto/nhpoly1305.c | 2 +-
- crypto/poly1305_generic.c | 25 ++-
- include/crypto/internal/poly1305.h | 45 ++----
- include/crypto/nhpoly1305.h | 4 +-
- include/crypto/poly1305.h | 26 ++-
- lib/crypto/Makefile | 4 +-
- lib/crypto/poly1305-donna32.c | 204 +++++++++++++++++++++++
- lib/crypto/poly1305-donna64.c | 185 +++++++++++++++++++++
- lib/crypto/poly1305.c | 169 +------------------
- 12 files changed, 675 insertions(+), 228 deletions(-)
- create mode 100644 lib/crypto/poly1305-donna32.c
- create mode 100644 lib/crypto/poly1305-donna64.c
-
---- a/arch/x86/crypto/poly1305-avx2-x86_64.S
-+++ b/arch/x86/crypto/poly1305-avx2-x86_64.S
-@@ -34,16 +34,16 @@ ORMASK: .octa 0x000000000100000000000000
- #define u2 0x08(%r8)
- #define u3 0x0c(%r8)
- #define u4 0x10(%r8)
--#define w0 0x14(%r8)
--#define w1 0x18(%r8)
--#define w2 0x1c(%r8)
--#define w3 0x20(%r8)
--#define w4 0x24(%r8)
--#define y0 0x28(%r8)
--#define y1 0x2c(%r8)
--#define y2 0x30(%r8)
--#define y3 0x34(%r8)
--#define y4 0x38(%r8)
-+#define w0 0x18(%r8)
-+#define w1 0x1c(%r8)
-+#define w2 0x20(%r8)
-+#define w3 0x24(%r8)
-+#define w4 0x28(%r8)
-+#define y0 0x30(%r8)
-+#define y1 0x34(%r8)
-+#define y2 0x38(%r8)
-+#define y3 0x3c(%r8)
-+#define y4 0x40(%r8)
- #define m %rsi
- #define hc0 %ymm0
- #define hc1 %ymm1
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -25,6 +25,21 @@ asmlinkage void poly1305_4block_avx2(u32
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_simd);
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_avx2);
-
-+static inline u64 mlt(u64 a, u64 b)
-+{
-+ return a * b;
-+}
-+
-+static inline u32 sr(u64 v, u_char n)
-+{
-+ return v >> n;
-+}
-+
-+static inline u32 and(u32 v, u32 mask)
-+{
-+ return v & mask;
-+}
-+
- static void poly1305_simd_mult(u32 *a, const u32 *b)
- {
- u8 m[POLY1305_BLOCK_SIZE];
-@@ -36,6 +51,168 @@ static void poly1305_simd_mult(u32 *a, c
- poly1305_block_sse2(a, m, b, 1);
- }
-
-+static void poly1305_integer_setkey(struct poly1305_key *key, const u8 *raw_key)
-+{
-+ /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-+ key->r[0] = (get_unaligned_le32(raw_key + 0) >> 0) & 0x3ffffff;
-+ key->r[1] = (get_unaligned_le32(raw_key + 3) >> 2) & 0x3ffff03;
-+ key->r[2] = (get_unaligned_le32(raw_key + 6) >> 4) & 0x3ffc0ff;
-+ key->r[3] = (get_unaligned_le32(raw_key + 9) >> 6) & 0x3f03fff;
-+ key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
-+}
-+
-+static void poly1305_integer_blocks(struct poly1305_state *state,
-+ const struct poly1305_key *key,
-+ const void *src,
-+ unsigned int nblocks, u32 hibit)
-+{
-+ u32 r0, r1, r2, r3, r4;
-+ u32 s1, s2, s3, s4;
-+ u32 h0, h1, h2, h3, h4;
-+ u64 d0, d1, d2, d3, d4;
-+
-+ if (!nblocks)
-+ return;
-+
-+ r0 = key->r[0];
-+ r1 = key->r[1];
-+ r2 = key->r[2];
-+ r3 = key->r[3];
-+ r4 = key->r[4];
-+
-+ s1 = r1 * 5;
-+ s2 = r2 * 5;
-+ s3 = r3 * 5;
-+ s4 = r4 * 5;
-+
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ do {
-+ /* h += m[i] */
-+ h0 += (get_unaligned_le32(src + 0) >> 0) & 0x3ffffff;
-+ h1 += (get_unaligned_le32(src + 3) >> 2) & 0x3ffffff;
-+ h2 += (get_unaligned_le32(src + 6) >> 4) & 0x3ffffff;
-+ h3 += (get_unaligned_le32(src + 9) >> 6) & 0x3ffffff;
-+ h4 += (get_unaligned_le32(src + 12) >> 8) | (hibit << 24);
-+
-+ /* h *= r */
-+ d0 = mlt(h0, r0) + mlt(h1, s4) + mlt(h2, s3) +
-+ mlt(h3, s2) + mlt(h4, s1);
-+ d1 = mlt(h0, r1) + mlt(h1, r0) + mlt(h2, s4) +
-+ mlt(h3, s3) + mlt(h4, s2);
-+ d2 = mlt(h0, r2) + mlt(h1, r1) + mlt(h2, r0) +
-+ mlt(h3, s4) + mlt(h4, s3);
-+ d3 = mlt(h0, r3) + mlt(h1, r2) + mlt(h2, r1) +
-+ mlt(h3, r0) + mlt(h4, s4);
-+ d4 = mlt(h0, r4) + mlt(h1, r3) + mlt(h2, r2) +
-+ mlt(h3, r1) + mlt(h4, r0);
-+
-+ /* (partial) h %= p */
-+ d1 += sr(d0, 26); h0 = and(d0, 0x3ffffff);
-+ d2 += sr(d1, 26); h1 = and(d1, 0x3ffffff);
-+ d3 += sr(d2, 26); h2 = and(d2, 0x3ffffff);
-+ d4 += sr(d3, 26); h3 = and(d3, 0x3ffffff);
-+ h0 += sr(d4, 26) * 5; h4 = and(d4, 0x3ffffff);
-+ h1 += h0 >> 26; h0 = h0 & 0x3ffffff;
-+
-+ src += POLY1305_BLOCK_SIZE;
-+ } while (--nblocks);
-+
-+ state->h[0] = h0;
-+ state->h[1] = h1;
-+ state->h[2] = h2;
-+ state->h[3] = h3;
-+ state->h[4] = h4;
-+}
-+
-+static void poly1305_integer_emit(const struct poly1305_state *state, void *dst)
-+{
-+ u32 h0, h1, h2, h3, h4;
-+ u32 g0, g1, g2, g3, g4;
-+ u32 mask;
-+
-+ /* fully carry h */
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ h2 += (h1 >> 26); h1 = h1 & 0x3ffffff;
-+ h3 += (h2 >> 26); h2 = h2 & 0x3ffffff;
-+ h4 += (h3 >> 26); h3 = h3 & 0x3ffffff;
-+ h0 += (h4 >> 26) * 5; h4 = h4 & 0x3ffffff;
-+ h1 += (h0 >> 26); h0 = h0 & 0x3ffffff;
-+
-+ /* compute h + -p */
-+ g0 = h0 + 5;
-+ g1 = h1 + (g0 >> 26); g0 &= 0x3ffffff;
-+ g2 = h2 + (g1 >> 26); g1 &= 0x3ffffff;
-+ g3 = h3 + (g2 >> 26); g2 &= 0x3ffffff;
-+ g4 = h4 + (g3 >> 26) - (1 << 26); g3 &= 0x3ffffff;
-+
-+ /* select h if h < p, or h + -p if h >= p */
-+ mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-+ g0 &= mask;
-+ g1 &= mask;
-+ g2 &= mask;
-+ g3 &= mask;
-+ g4 &= mask;
-+ mask = ~mask;
-+ h0 = (h0 & mask) | g0;
-+ h1 = (h1 & mask) | g1;
-+ h2 = (h2 & mask) | g2;
-+ h3 = (h3 & mask) | g3;
-+ h4 = (h4 & mask) | g4;
-+
-+ /* h = h % (2^128) */
-+ put_unaligned_le32((h0 >> 0) | (h1 << 26), dst + 0);
-+ put_unaligned_le32((h1 >> 6) | (h2 << 20), dst + 4);
-+ put_unaligned_le32((h2 >> 12) | (h3 << 14), dst + 8);
-+ put_unaligned_le32((h3 >> 18) | (h4 << 8), dst + 12);
-+}
-+
-+void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key)
-+{
-+ poly1305_integer_setkey(desc->opaque_r, key);
-+ desc->s[0] = get_unaligned_le32(key + 16);
-+ desc->s[1] = get_unaligned_le32(key + 20);
-+ desc->s[2] = get_unaligned_le32(key + 24);
-+ desc->s[3] = get_unaligned_le32(key + 28);
-+ poly1305_core_init(&desc->h);
-+ desc->buflen = 0;
-+ desc->sset = true;
-+ desc->rset = 1;
-+}
-+EXPORT_SYMBOL_GPL(poly1305_init_arch);
-+
-+static unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, unsigned int srclen)
-+{
-+ if (!dctx->sset) {
-+ if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-+ poly1305_integer_setkey(dctx->r, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = 1;
-+ }
-+ if (srclen >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ }
-+ return srclen;
-+}
-+
- static unsigned int poly1305_scalar_blocks(struct poly1305_desc_ctx *dctx,
- const u8 *src, unsigned int srclen)
- {
-@@ -47,8 +224,8 @@ static unsigned int poly1305_scalar_bloc
- srclen = datalen;
- }
- if (srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_core_blocks(&dctx->h, dctx->r, src,
-- srclen / POLY1305_BLOCK_SIZE, 1);
-+ poly1305_integer_blocks(&dctx->h, dctx->opaque_r, src,
-+ srclen / POLY1305_BLOCK_SIZE, 1);
- srclen %= POLY1305_BLOCK_SIZE;
- }
- return srclen;
-@@ -105,12 +282,6 @@ static unsigned int poly1305_simd_blocks
- return srclen;
- }
-
--void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key)
--{
-- poly1305_init_generic(desc, key);
--}
--EXPORT_SYMBOL(poly1305_init_arch);
--
- void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
- unsigned int srclen)
- {
-@@ -158,9 +329,31 @@ void poly1305_update_arch(struct poly130
- }
- EXPORT_SYMBOL(poly1305_update_arch);
-
--void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *digest)
-+void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *dst)
- {
-- poly1305_final_generic(desc, digest);
-+ __le32 digest[4];
-+ u64 f = 0;
-+
-+ if (unlikely(desc->buflen)) {
-+ desc->buf[desc->buflen++] = 1;
-+ memset(desc->buf + desc->buflen, 0,
-+ POLY1305_BLOCK_SIZE - desc->buflen);
-+ poly1305_integer_blocks(&desc->h, desc->opaque_r, desc->buf, 1, 0);
-+ }
-+
-+ poly1305_integer_emit(&desc->h, digest);
-+
-+ /* mac = (h + s) % (2^128) */
-+ f = (f >> 32) + le32_to_cpu(digest[0]) + desc->s[0];
-+ put_unaligned_le32(f, dst + 0);
-+ f = (f >> 32) + le32_to_cpu(digest[1]) + desc->s[1];
-+ put_unaligned_le32(f, dst + 4);
-+ f = (f >> 32) + le32_to_cpu(digest[2]) + desc->s[2];
-+ put_unaligned_le32(f, dst + 8);
-+ f = (f >> 32) + le32_to_cpu(digest[3]) + desc->s[3];
-+ put_unaligned_le32(f, dst + 12);
-+
-+ *desc = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL(poly1305_final_arch);
-
-@@ -183,7 +376,7 @@ static int crypto_poly1305_final(struct
- if (unlikely(!dctx->sset))
- return -ENOKEY;
-
-- poly1305_final_generic(dctx, dst);
-+ poly1305_final_arch(dctx, dst);
- return 0;
- }
-
---- a/crypto/adiantum.c
-+++ b/crypto/adiantum.c
-@@ -72,7 +72,7 @@ struct adiantum_tfm_ctx {
- struct crypto_skcipher *streamcipher;
- struct crypto_cipher *blockcipher;
- struct crypto_shash *hash;
-- struct poly1305_key header_hash_key;
-+ struct poly1305_core_key header_hash_key;
- };
-
- struct adiantum_request_ctx {
-@@ -249,7 +249,7 @@ static void adiantum_hash_header(struct
- poly1305_core_blocks(&state, &tctx->header_hash_key, req->iv,
- TWEAK_SIZE / POLY1305_BLOCK_SIZE, 1);
-
-- poly1305_core_emit(&state, &rctx->header_hash);
-+ poly1305_core_emit(&state, NULL, &rctx->header_hash);
- }
-
- /* Hash the left-hand part (the "bulk") of the message using NHPoly1305 */
---- a/crypto/nhpoly1305.c
-+++ b/crypto/nhpoly1305.c
-@@ -210,7 +210,7 @@ int crypto_nhpoly1305_final_helper(struc
- if (state->nh_remaining)
- process_nh_hash_value(state, key);
-
-- poly1305_core_emit(&state->poly_state, dst);
-+ poly1305_core_emit(&state->poly_state, NULL, dst);
- return 0;
- }
- EXPORT_SYMBOL(crypto_nhpoly1305_final_helper);
---- a/crypto/poly1305_generic.c
-+++ b/crypto/poly1305_generic.c
-@@ -31,6 +31,29 @@ static int crypto_poly1305_init(struct s
- return 0;
- }
-
-+static unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-+ const u8 *src, unsigned int srclen)
-+{
-+ if (!dctx->sset) {
-+ if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-+ poly1305_core_setkey(&dctx->core_r, src);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->rset = 2;
-+ }
-+ if (srclen >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(src + 0);
-+ dctx->s[1] = get_unaligned_le32(src + 4);
-+ dctx->s[2] = get_unaligned_le32(src + 8);
-+ dctx->s[3] = get_unaligned_le32(src + 12);
-+ src += POLY1305_BLOCK_SIZE;
-+ srclen -= POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
-+ }
-+ }
-+ return srclen;
-+}
-+
- static void poly1305_blocks(struct poly1305_desc_ctx *dctx, const u8 *src,
- unsigned int srclen)
- {
-@@ -42,7 +65,7 @@ static void poly1305_blocks(struct poly1
- srclen = datalen;
- }
-
-- poly1305_core_blocks(&dctx->h, dctx->r, src,
-+ poly1305_core_blocks(&dctx->h, &dctx->core_r, src,
- srclen / POLY1305_BLOCK_SIZE, 1);
- }
-
---- a/include/crypto/internal/poly1305.h
-+++ b/include/crypto/internal/poly1305.h
-@@ -11,48 +11,23 @@
- #include <crypto/poly1305.h>
-
- /*
-- * Poly1305 core functions. These implement the ε-almost-∆-universal hash
-- * function underlying the Poly1305 MAC, i.e. they don't add an encrypted nonce
-- * ("s key") at the end. They also only support block-aligned inputs.
-+ * Poly1305 core functions. These only accept whole blocks; the caller must
-+ * handle any needed block buffering and padding. 'hibit' must be 1 for any
-+ * full blocks, or 0 for the final block if it had to be padded. If 'nonce' is
-+ * non-NULL, then it's added at the end to compute the Poly1305 MAC. Otherwise,
-+ * only the ε-almost-∆-universal hash function (not the full MAC) is computed.
- */
--void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key);
-+
-+void poly1305_core_setkey(struct poly1305_core_key *key, const u8 *raw_key);
- static inline void poly1305_core_init(struct poly1305_state *state)
- {
- *state = (struct poly1305_state){};
- }
-
- void poly1305_core_blocks(struct poly1305_state *state,
-- const struct poly1305_key *key, const void *src,
-+ const struct poly1305_core_key *key, const void *src,
- unsigned int nblocks, u32 hibit);
--void poly1305_core_emit(const struct poly1305_state *state, void *dst);
--
--/*
-- * Poly1305 requires a unique key for each tag, which implies that we can't set
-- * it on the tfm that gets accessed by multiple users simultaneously. Instead we
-- * expect the key as the first 32 bytes in the update() call.
-- */
--static inline
--unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen)
--{
-- if (!dctx->sset) {
-- if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_core_setkey(dctx->r, src);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->rset = 1;
-- }
-- if (srclen >= POLY1305_BLOCK_SIZE) {
-- dctx->s[0] = get_unaligned_le32(src + 0);
-- dctx->s[1] = get_unaligned_le32(src + 4);
-- dctx->s[2] = get_unaligned_le32(src + 8);
-- dctx->s[3] = get_unaligned_le32(src + 12);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->sset = true;
-- }
-- }
-- return srclen;
--}
-+void poly1305_core_emit(const struct poly1305_state *state, const u32 nonce[4],
-+ void *dst);
-
- #endif
---- a/include/crypto/nhpoly1305.h
-+++ b/include/crypto/nhpoly1305.h
-@@ -7,7 +7,7 @@
- #define _NHPOLY1305_H
-
- #include <crypto/hash.h>
--#include <crypto/poly1305.h>
-+#include <crypto/internal/poly1305.h>
-
- /* NH parameterization: */
-
-@@ -33,7 +33,7 @@
- #define NHPOLY1305_KEY_SIZE (POLY1305_BLOCK_SIZE + NH_KEY_BYTES)
-
- struct nhpoly1305_key {
-- struct poly1305_key poly_key;
-+ struct poly1305_core_key poly_key;
- u32 nh_key[NH_KEY_WORDS];
- };
-
---- a/include/crypto/poly1305.h
-+++ b/include/crypto/poly1305.h
-@@ -13,12 +13,29 @@
- #define POLY1305_KEY_SIZE 32
- #define POLY1305_DIGEST_SIZE 16
-
-+/* The poly1305_key and poly1305_state types are mostly opaque and
-+ * implementation-defined. Limbs might be in base 2^64 or base 2^26, or
-+ * different yet. The union type provided keeps these 64-bit aligned for the
-+ * case in which this is implemented using 64x64 multiplies.
-+ */
-+
- struct poly1305_key {
-- u32 r[5]; /* key, base 2^26 */
-+ union {
-+ u32 r[5];
-+ u64 r64[3];
-+ };
-+};
-+
-+struct poly1305_core_key {
-+ struct poly1305_key key;
-+ struct poly1305_key precomputed_s;
- };
-
- struct poly1305_state {
-- u32 h[5]; /* accumulator, base 2^26 */
-+ union {
-+ u32 h[5];
-+ u64 h64[3];
-+ };
- };
-
- struct poly1305_desc_ctx {
-@@ -35,7 +52,10 @@ struct poly1305_desc_ctx {
- /* accumulator */
- struct poly1305_state h;
- /* key */
-- struct poly1305_key r[CONFIG_CRYPTO_LIB_POLY1305_RSIZE];
-+ union {
-+ struct poly1305_key opaque_r[CONFIG_CRYPTO_LIB_POLY1305_RSIZE];
-+ struct poly1305_core_key core_r;
-+ };
- };
-
- void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key);
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -28,7 +28,9 @@ obj-$(CONFIG_CRYPTO_LIB_DES) += libdes
- libdes-y := des.o
-
- obj-$(CONFIG_CRYPTO_LIB_POLY1305_GENERIC) += libpoly1305.o
--libpoly1305-y := poly1305.o
-+libpoly1305-y := poly1305-donna32.o
-+libpoly1305-$(CONFIG_ARCH_SUPPORTS_INT128) := poly1305-donna64.o
-+libpoly1305-y += poly1305.o
-
- obj-$(CONFIG_CRYPTO_LIB_SHA256) += libsha256.o
- libsha256-y := sha256.o
---- /dev/null
-+++ b/lib/crypto/poly1305-donna32.c
-@@ -0,0 +1,204 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is based in part on Andrew Moon's poly1305-donna, which is in the
-+ * public domain.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <asm/unaligned.h>
-+#include <crypto/internal/poly1305.h>
-+
-+void poly1305_core_setkey(struct poly1305_core_key *key, const u8 raw_key[16])
-+{
-+ /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-+ key->key.r[0] = (get_unaligned_le32(&raw_key[0])) & 0x3ffffff;
-+ key->key.r[1] = (get_unaligned_le32(&raw_key[3]) >> 2) & 0x3ffff03;
-+ key->key.r[2] = (get_unaligned_le32(&raw_key[6]) >> 4) & 0x3ffc0ff;
-+ key->key.r[3] = (get_unaligned_le32(&raw_key[9]) >> 6) & 0x3f03fff;
-+ key->key.r[4] = (get_unaligned_le32(&raw_key[12]) >> 8) & 0x00fffff;
-+
-+ /* s = 5*r */
-+ key->precomputed_s.r[0] = key->key.r[1] * 5;
-+ key->precomputed_s.r[1] = key->key.r[2] * 5;
-+ key->precomputed_s.r[2] = key->key.r[3] * 5;
-+ key->precomputed_s.r[3] = key->key.r[4] * 5;
-+}
-+EXPORT_SYMBOL(poly1305_core_setkey);
-+
-+void poly1305_core_blocks(struct poly1305_state *state,
-+ const struct poly1305_core_key *key, const void *src,
-+ unsigned int nblocks, u32 hibit)
-+{
-+ const u8 *input = src;
-+ u32 r0, r1, r2, r3, r4;
-+ u32 s1, s2, s3, s4;
-+ u32 h0, h1, h2, h3, h4;
-+ u64 d0, d1, d2, d3, d4;
-+ u32 c;
-+
-+ if (!nblocks)
-+ return;
-+
-+ hibit <<= 24;
-+
-+ r0 = key->key.r[0];
-+ r1 = key->key.r[1];
-+ r2 = key->key.r[2];
-+ r3 = key->key.r[3];
-+ r4 = key->key.r[4];
-+
-+ s1 = key->precomputed_s.r[0];
-+ s2 = key->precomputed_s.r[1];
-+ s3 = key->precomputed_s.r[2];
-+ s4 = key->precomputed_s.r[3];
-+
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ do {
-+ /* h += m[i] */
-+ h0 += (get_unaligned_le32(&input[0])) & 0x3ffffff;
-+ h1 += (get_unaligned_le32(&input[3]) >> 2) & 0x3ffffff;
-+ h2 += (get_unaligned_le32(&input[6]) >> 4) & 0x3ffffff;
-+ h3 += (get_unaligned_le32(&input[9]) >> 6) & 0x3ffffff;
-+ h4 += (get_unaligned_le32(&input[12]) >> 8) | hibit;
-+
-+ /* h *= r */
-+ d0 = ((u64)h0 * r0) + ((u64)h1 * s4) +
-+ ((u64)h2 * s3) + ((u64)h3 * s2) +
-+ ((u64)h4 * s1);
-+ d1 = ((u64)h0 * r1) + ((u64)h1 * r0) +
-+ ((u64)h2 * s4) + ((u64)h3 * s3) +
-+ ((u64)h4 * s2);
-+ d2 = ((u64)h0 * r2) + ((u64)h1 * r1) +
-+ ((u64)h2 * r0) + ((u64)h3 * s4) +
-+ ((u64)h4 * s3);
-+ d3 = ((u64)h0 * r3) + ((u64)h1 * r2) +
-+ ((u64)h2 * r1) + ((u64)h3 * r0) +
-+ ((u64)h4 * s4);
-+ d4 = ((u64)h0 * r4) + ((u64)h1 * r3) +
-+ ((u64)h2 * r2) + ((u64)h3 * r1) +
-+ ((u64)h4 * r0);
-+
-+ /* (partial) h %= p */
-+ c = (u32)(d0 >> 26);
-+ h0 = (u32)d0 & 0x3ffffff;
-+ d1 += c;
-+ c = (u32)(d1 >> 26);
-+ h1 = (u32)d1 & 0x3ffffff;
-+ d2 += c;
-+ c = (u32)(d2 >> 26);
-+ h2 = (u32)d2 & 0x3ffffff;
-+ d3 += c;
-+ c = (u32)(d3 >> 26);
-+ h3 = (u32)d3 & 0x3ffffff;
-+ d4 += c;
-+ c = (u32)(d4 >> 26);
-+ h4 = (u32)d4 & 0x3ffffff;
-+ h0 += c * 5;
-+ c = (h0 >> 26);
-+ h0 = h0 & 0x3ffffff;
-+ h1 += c;
-+
-+ input += POLY1305_BLOCK_SIZE;
-+ } while (--nblocks);
-+
-+ state->h[0] = h0;
-+ state->h[1] = h1;
-+ state->h[2] = h2;
-+ state->h[3] = h3;
-+ state->h[4] = h4;
-+}
-+EXPORT_SYMBOL(poly1305_core_blocks);
-+
-+void poly1305_core_emit(const struct poly1305_state *state, const u32 nonce[4],
-+ void *dst)
-+{
-+ u8 *mac = dst;
-+ u32 h0, h1, h2, h3, h4, c;
-+ u32 g0, g1, g2, g3, g4;
-+ u64 f;
-+ u32 mask;
-+
-+ /* fully carry h */
-+ h0 = state->h[0];
-+ h1 = state->h[1];
-+ h2 = state->h[2];
-+ h3 = state->h[3];
-+ h4 = state->h[4];
-+
-+ c = h1 >> 26;
-+ h1 = h1 & 0x3ffffff;
-+ h2 += c;
-+ c = h2 >> 26;
-+ h2 = h2 & 0x3ffffff;
-+ h3 += c;
-+ c = h3 >> 26;
-+ h3 = h3 & 0x3ffffff;
-+ h4 += c;
-+ c = h4 >> 26;
-+ h4 = h4 & 0x3ffffff;
-+ h0 += c * 5;
-+ c = h0 >> 26;
-+ h0 = h0 & 0x3ffffff;
-+ h1 += c;
-+
-+ /* compute h + -p */
-+ g0 = h0 + 5;
-+ c = g0 >> 26;
-+ g0 &= 0x3ffffff;
-+ g1 = h1 + c;
-+ c = g1 >> 26;
-+ g1 &= 0x3ffffff;
-+ g2 = h2 + c;
-+ c = g2 >> 26;
-+ g2 &= 0x3ffffff;
-+ g3 = h3 + c;
-+ c = g3 >> 26;
-+ g3 &= 0x3ffffff;
-+ g4 = h4 + c - (1UL << 26);
-+
-+ /* select h if h < p, or h + -p if h >= p */
-+ mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-+ g0 &= mask;
-+ g1 &= mask;
-+ g2 &= mask;
-+ g3 &= mask;
-+ g4 &= mask;
-+ mask = ~mask;
-+
-+ h0 = (h0 & mask) | g0;
-+ h1 = (h1 & mask) | g1;
-+ h2 = (h2 & mask) | g2;
-+ h3 = (h3 & mask) | g3;
-+ h4 = (h4 & mask) | g4;
-+
-+ /* h = h % (2^128) */
-+ h0 = ((h0) | (h1 << 26)) & 0xffffffff;
-+ h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
-+ h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
-+ h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
-+
-+ if (likely(nonce)) {
-+ /* mac = (h + nonce) % (2^128) */
-+ f = (u64)h0 + nonce[0];
-+ h0 = (u32)f;
-+ f = (u64)h1 + nonce[1] + (f >> 32);
-+ h1 = (u32)f;
-+ f = (u64)h2 + nonce[2] + (f >> 32);
-+ h2 = (u32)f;
-+ f = (u64)h3 + nonce[3] + (f >> 32);
-+ h3 = (u32)f;
-+ }
-+
-+ put_unaligned_le32(h0, &mac[0]);
-+ put_unaligned_le32(h1, &mac[4]);
-+ put_unaligned_le32(h2, &mac[8]);
-+ put_unaligned_le32(h3, &mac[12]);
-+}
-+EXPORT_SYMBOL(poly1305_core_emit);
---- /dev/null
-+++ b/lib/crypto/poly1305-donna64.c
-@@ -0,0 +1,185 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is based in part on Andrew Moon's poly1305-donna, which is in the
-+ * public domain.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <asm/unaligned.h>
-+#include <crypto/internal/poly1305.h>
-+
-+typedef __uint128_t u128;
-+
-+void poly1305_core_setkey(struct poly1305_core_key *key, const u8 raw_key[16])
-+{
-+ u64 t0, t1;
-+
-+ /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-+ t0 = get_unaligned_le64(&raw_key[0]);
-+ t1 = get_unaligned_le64(&raw_key[8]);
-+
-+ key->key.r64[0] = t0 & 0xffc0fffffffULL;
-+ key->key.r64[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffffULL;
-+ key->key.r64[2] = ((t1 >> 24)) & 0x00ffffffc0fULL;
-+
-+ /* s = 20*r */
-+ key->precomputed_s.r64[0] = key->key.r64[1] * 20;
-+ key->precomputed_s.r64[1] = key->key.r64[2] * 20;
-+}
-+EXPORT_SYMBOL(poly1305_core_setkey);
-+
-+void poly1305_core_blocks(struct poly1305_state *state,
-+ const struct poly1305_core_key *key, const void *src,
-+ unsigned int nblocks, u32 hibit)
-+{
-+ const u8 *input = src;
-+ u64 hibit64;
-+ u64 r0, r1, r2;
-+ u64 s1, s2;
-+ u64 h0, h1, h2;
-+ u64 c;
-+ u128 d0, d1, d2, d;
-+
-+ if (!nblocks)
-+ return;
-+
-+ hibit64 = ((u64)hibit) << 40;
-+
-+ r0 = key->key.r64[0];
-+ r1 = key->key.r64[1];
-+ r2 = key->key.r64[2];
-+
-+ h0 = state->h64[0];
-+ h1 = state->h64[1];
-+ h2 = state->h64[2];
-+
-+ s1 = key->precomputed_s.r64[0];
-+ s2 = key->precomputed_s.r64[1];
-+
-+ do {
-+ u64 t0, t1;
-+
-+ /* h += m[i] */
-+ t0 = get_unaligned_le64(&input[0]);
-+ t1 = get_unaligned_le64(&input[8]);
-+
-+ h0 += t0 & 0xfffffffffffULL;
-+ h1 += ((t0 >> 44) | (t1 << 20)) & 0xfffffffffffULL;
-+ h2 += (((t1 >> 24)) & 0x3ffffffffffULL) | hibit64;
-+
-+ /* h *= r */
-+ d0 = (u128)h0 * r0;
-+ d = (u128)h1 * s2;
-+ d0 += d;
-+ d = (u128)h2 * s1;
-+ d0 += d;
-+ d1 = (u128)h0 * r1;
-+ d = (u128)h1 * r0;
-+ d1 += d;
-+ d = (u128)h2 * s2;
-+ d1 += d;
-+ d2 = (u128)h0 * r2;
-+ d = (u128)h1 * r1;
-+ d2 += d;
-+ d = (u128)h2 * r0;
-+ d2 += d;
-+
-+ /* (partial) h %= p */
-+ c = (u64)(d0 >> 44);
-+ h0 = (u64)d0 & 0xfffffffffffULL;
-+ d1 += c;
-+ c = (u64)(d1 >> 44);
-+ h1 = (u64)d1 & 0xfffffffffffULL;
-+ d2 += c;
-+ c = (u64)(d2 >> 42);
-+ h2 = (u64)d2 & 0x3ffffffffffULL;
-+ h0 += c * 5;
-+ c = h0 >> 44;
-+ h0 = h0 & 0xfffffffffffULL;
-+ h1 += c;
-+
-+ input += POLY1305_BLOCK_SIZE;
-+ } while (--nblocks);
-+
-+ state->h64[0] = h0;
-+ state->h64[1] = h1;
-+ state->h64[2] = h2;
-+}
-+EXPORT_SYMBOL(poly1305_core_blocks);
-+
-+void poly1305_core_emit(const struct poly1305_state *state, const u32 nonce[4],
-+ void *dst)
-+{
-+ u8 *mac = dst;
-+ u64 h0, h1, h2, c;
-+ u64 g0, g1, g2;
-+ u64 t0, t1;
-+
-+ /* fully carry h */
-+ h0 = state->h64[0];
-+ h1 = state->h64[1];
-+ h2 = state->h64[2];
-+
-+ c = h1 >> 44;
-+ h1 &= 0xfffffffffffULL;
-+ h2 += c;
-+ c = h2 >> 42;
-+ h2 &= 0x3ffffffffffULL;
-+ h0 += c * 5;
-+ c = h0 >> 44;
-+ h0 &= 0xfffffffffffULL;
-+ h1 += c;
-+ c = h1 >> 44;
-+ h1 &= 0xfffffffffffULL;
-+ h2 += c;
-+ c = h2 >> 42;
-+ h2 &= 0x3ffffffffffULL;
-+ h0 += c * 5;
-+ c = h0 >> 44;
-+ h0 &= 0xfffffffffffULL;
-+ h1 += c;
-+
-+ /* compute h + -p */
-+ g0 = h0 + 5;
-+ c = g0 >> 44;
-+ g0 &= 0xfffffffffffULL;
-+ g1 = h1 + c;
-+ c = g1 >> 44;
-+ g1 &= 0xfffffffffffULL;
-+ g2 = h2 + c - (1ULL << 42);
-+
-+ /* select h if h < p, or h + -p if h >= p */
-+ c = (g2 >> ((sizeof(u64) * 8) - 1)) - 1;
-+ g0 &= c;
-+ g1 &= c;
-+ g2 &= c;
-+ c = ~c;
-+ h0 = (h0 & c) | g0;
-+ h1 = (h1 & c) | g1;
-+ h2 = (h2 & c) | g2;
-+
-+ if (likely(nonce)) {
-+ /* h = (h + nonce) */
-+ t0 = ((u64)nonce[1] << 32) | nonce[0];
-+ t1 = ((u64)nonce[3] << 32) | nonce[2];
-+
-+ h0 += t0 & 0xfffffffffffULL;
-+ c = h0 >> 44;
-+ h0 &= 0xfffffffffffULL;
-+ h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffffULL) + c;
-+ c = h1 >> 44;
-+ h1 &= 0xfffffffffffULL;
-+ h2 += (((t1 >> 24)) & 0x3ffffffffffULL) + c;
-+ h2 &= 0x3ffffffffffULL;
-+ }
-+
-+ /* mac = h % (2^128) */
-+ h0 = h0 | (h1 << 44);
-+ h1 = (h1 >> 20) | (h2 << 24);
-+
-+ put_unaligned_le64(h0, &mac[0]);
-+ put_unaligned_le64(h1, &mac[8]);
-+}
-+EXPORT_SYMBOL(poly1305_core_emit);
---- a/lib/crypto/poly1305.c
-+++ b/lib/crypto/poly1305.c
-@@ -12,151 +12,9 @@
- #include <linux/module.h>
- #include <asm/unaligned.h>
-
--static inline u64 mlt(u64 a, u64 b)
--{
-- return a * b;
--}
--
--static inline u32 sr(u64 v, u_char n)
--{
-- return v >> n;
--}
--
--static inline u32 and(u32 v, u32 mask)
--{
-- return v & mask;
--}
--
--void poly1305_core_setkey(struct poly1305_key *key, const u8 *raw_key)
--{
-- /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-- key->r[0] = (get_unaligned_le32(raw_key + 0) >> 0) & 0x3ffffff;
-- key->r[1] = (get_unaligned_le32(raw_key + 3) >> 2) & 0x3ffff03;
-- key->r[2] = (get_unaligned_le32(raw_key + 6) >> 4) & 0x3ffc0ff;
-- key->r[3] = (get_unaligned_le32(raw_key + 9) >> 6) & 0x3f03fff;
-- key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
--}
--EXPORT_SYMBOL_GPL(poly1305_core_setkey);
--
--void poly1305_core_blocks(struct poly1305_state *state,
-- const struct poly1305_key *key, const void *src,
-- unsigned int nblocks, u32 hibit)
--{
-- u32 r0, r1, r2, r3, r4;
-- u32 s1, s2, s3, s4;
-- u32 h0, h1, h2, h3, h4;
-- u64 d0, d1, d2, d3, d4;
--
-- if (!nblocks)
-- return;
--
-- r0 = key->r[0];
-- r1 = key->r[1];
-- r2 = key->r[2];
-- r3 = key->r[3];
-- r4 = key->r[4];
--
-- s1 = r1 * 5;
-- s2 = r2 * 5;
-- s3 = r3 * 5;
-- s4 = r4 * 5;
--
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- do {
-- /* h += m[i] */
-- h0 += (get_unaligned_le32(src + 0) >> 0) & 0x3ffffff;
-- h1 += (get_unaligned_le32(src + 3) >> 2) & 0x3ffffff;
-- h2 += (get_unaligned_le32(src + 6) >> 4) & 0x3ffffff;
-- h3 += (get_unaligned_le32(src + 9) >> 6) & 0x3ffffff;
-- h4 += (get_unaligned_le32(src + 12) >> 8) | (hibit << 24);
--
-- /* h *= r */
-- d0 = mlt(h0, r0) + mlt(h1, s4) + mlt(h2, s3) +
-- mlt(h3, s2) + mlt(h4, s1);
-- d1 = mlt(h0, r1) + mlt(h1, r0) + mlt(h2, s4) +
-- mlt(h3, s3) + mlt(h4, s2);
-- d2 = mlt(h0, r2) + mlt(h1, r1) + mlt(h2, r0) +
-- mlt(h3, s4) + mlt(h4, s3);
-- d3 = mlt(h0, r3) + mlt(h1, r2) + mlt(h2, r1) +
-- mlt(h3, r0) + mlt(h4, s4);
-- d4 = mlt(h0, r4) + mlt(h1, r3) + mlt(h2, r2) +
-- mlt(h3, r1) + mlt(h4, r0);
--
-- /* (partial) h %= p */
-- d1 += sr(d0, 26); h0 = and(d0, 0x3ffffff);
-- d2 += sr(d1, 26); h1 = and(d1, 0x3ffffff);
-- d3 += sr(d2, 26); h2 = and(d2, 0x3ffffff);
-- d4 += sr(d3, 26); h3 = and(d3, 0x3ffffff);
-- h0 += sr(d4, 26) * 5; h4 = and(d4, 0x3ffffff);
-- h1 += h0 >> 26; h0 = h0 & 0x3ffffff;
--
-- src += POLY1305_BLOCK_SIZE;
-- } while (--nblocks);
--
-- state->h[0] = h0;
-- state->h[1] = h1;
-- state->h[2] = h2;
-- state->h[3] = h3;
-- state->h[4] = h4;
--}
--EXPORT_SYMBOL_GPL(poly1305_core_blocks);
--
--void poly1305_core_emit(const struct poly1305_state *state, void *dst)
--{
-- u32 h0, h1, h2, h3, h4;
-- u32 g0, g1, g2, g3, g4;
-- u32 mask;
--
-- /* fully carry h */
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- h2 += (h1 >> 26); h1 = h1 & 0x3ffffff;
-- h3 += (h2 >> 26); h2 = h2 & 0x3ffffff;
-- h4 += (h3 >> 26); h3 = h3 & 0x3ffffff;
-- h0 += (h4 >> 26) * 5; h4 = h4 & 0x3ffffff;
-- h1 += (h0 >> 26); h0 = h0 & 0x3ffffff;
--
-- /* compute h + -p */
-- g0 = h0 + 5;
-- g1 = h1 + (g0 >> 26); g0 &= 0x3ffffff;
-- g2 = h2 + (g1 >> 26); g1 &= 0x3ffffff;
-- g3 = h3 + (g2 >> 26); g2 &= 0x3ffffff;
-- g4 = h4 + (g3 >> 26) - (1 << 26); g3 &= 0x3ffffff;
--
-- /* select h if h < p, or h + -p if h >= p */
-- mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-- g0 &= mask;
-- g1 &= mask;
-- g2 &= mask;
-- g3 &= mask;
-- g4 &= mask;
-- mask = ~mask;
-- h0 = (h0 & mask) | g0;
-- h1 = (h1 & mask) | g1;
-- h2 = (h2 & mask) | g2;
-- h3 = (h3 & mask) | g3;
-- h4 = (h4 & mask) | g4;
--
-- /* h = h % (2^128) */
-- put_unaligned_le32((h0 >> 0) | (h1 << 26), dst + 0);
-- put_unaligned_le32((h1 >> 6) | (h2 << 20), dst + 4);
-- put_unaligned_le32((h2 >> 12) | (h3 << 14), dst + 8);
-- put_unaligned_le32((h3 >> 18) | (h4 << 8), dst + 12);
--}
--EXPORT_SYMBOL_GPL(poly1305_core_emit);
--
- void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key)
- {
-- poly1305_core_setkey(desc->r, key);
-+ poly1305_core_setkey(&desc->core_r, key);
- desc->s[0] = get_unaligned_le32(key + 16);
- desc->s[1] = get_unaligned_le32(key + 20);
- desc->s[2] = get_unaligned_le32(key + 24);
-@@ -164,7 +22,7 @@ void poly1305_init_generic(struct poly13
- poly1305_core_init(&desc->h);
- desc->buflen = 0;
- desc->sset = true;
-- desc->rset = 1;
-+ desc->rset = 2;
- }
- EXPORT_SYMBOL_GPL(poly1305_init_generic);
-
-@@ -181,13 +39,14 @@ void poly1305_update_generic(struct poly
- desc->buflen += bytes;
-
- if (desc->buflen == POLY1305_BLOCK_SIZE) {
-- poly1305_core_blocks(&desc->h, desc->r, desc->buf, 1, 1);
-+ poly1305_core_blocks(&desc->h, &desc->core_r, desc->buf,
-+ 1, 1);
- desc->buflen = 0;
- }
- }
-
- if (likely(nbytes >= POLY1305_BLOCK_SIZE)) {
-- poly1305_core_blocks(&desc->h, desc->r, src,
-+ poly1305_core_blocks(&desc->h, &desc->core_r, src,
- nbytes / POLY1305_BLOCK_SIZE, 1);
- src += nbytes - (nbytes % POLY1305_BLOCK_SIZE);
- nbytes %= POLY1305_BLOCK_SIZE;
-@@ -202,28 +61,14 @@ EXPORT_SYMBOL_GPL(poly1305_update_generi
-
- void poly1305_final_generic(struct poly1305_desc_ctx *desc, u8 *dst)
- {
-- __le32 digest[4];
-- u64 f = 0;
--
- if (unlikely(desc->buflen)) {
- desc->buf[desc->buflen++] = 1;
- memset(desc->buf + desc->buflen, 0,
- POLY1305_BLOCK_SIZE - desc->buflen);
-- poly1305_core_blocks(&desc->h, desc->r, desc->buf, 1, 0);
-+ poly1305_core_blocks(&desc->h, &desc->core_r, desc->buf, 1, 0);
- }
-
-- poly1305_core_emit(&desc->h, digest);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]) + desc->s[0];
-- put_unaligned_le32(f, dst + 0);
-- f = (f >> 32) + le32_to_cpu(digest[1]) + desc->s[1];
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]) + desc->s[2];
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]) + desc->s[3];
-- put_unaligned_le32(f, dst + 12);
--
-+ poly1305_core_emit(&desc->h, desc->s, dst);
- *desc = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL_GPL(poly1305_final_generic);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0042-crypto-x86-poly1305-import-unmodified-cryptogams-imp.patch b/target/linux/generic/backport-5.4/080-wireguard-0042-crypto-x86-poly1305-import-unmodified-cryptogams-imp.patch
deleted file mode 100644
index 8e52383ae1..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0042-crypto-x86-poly1305-import-unmodified-cryptogams-imp.patch
+++ /dev/null
@@ -1,4183 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 5 Jan 2020 22:40:47 -0500
-Subject: [PATCH] crypto: x86/poly1305 - import unmodified cryptogams
- implementation
-
-commit 0896ca2a0cb6127e8a129f1f2a680d49b6b0f65c upstream.
-
-These x86_64 vectorized implementations come from Andy Polyakov's
-CRYPTOGAMS implementation, and are included here in raw form without
-modification, so that subsequent commits that fix these up for the
-kernel can see how it has changed.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 4159 +++++++++++++++++
- 1 file changed, 4159 insertions(+)
- create mode 100644 arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-
---- /dev/null
-+++ b/arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-@@ -0,0 +1,4159 @@
-+#! /usr/bin/env perl
-+# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
-+#
-+# Licensed under the OpenSSL license (the "License"). You may not use
-+# this file except in compliance with the License. You can obtain a copy
-+# in the file LICENSE in the source distribution or at
-+# https://www.openssl.org/source/license.html
-+
-+#
-+# ====================================================================
-+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
-+# project. The module is, however, dual licensed under OpenSSL and
-+# CRYPTOGAMS licenses depending on where you obtain it. For further
-+# details see http://www.openssl.org/~appro/cryptogams/.
-+# ====================================================================
-+#
-+# This module implements Poly1305 hash for x86_64.
-+#
-+# March 2015
-+#
-+# Initial release.
-+#
-+# December 2016
-+#
-+# Add AVX512F+VL+BW code path.
-+#
-+# November 2017
-+#
-+# Convert AVX512F+VL+BW code path to pure AVX512F, so that it can be
-+# executed even on Knights Landing. Trigger for modification was
-+# observation that AVX512 code paths can negatively affect overall
-+# Skylake-X system performance. Since we are likely to suppress
-+# AVX512F capability flag [at least on Skylake-X], conversion serves
-+# as kind of "investment protection". Note that next *lake processor,
-+# Cannolake, has AVX512IFMA code path to execute...
-+#
-+# Numbers are cycles per processed byte with poly1305_blocks alone,
-+# measured with rdtsc at fixed clock frequency.
-+#
-+# IALU/gcc-4.8(*) AVX(**) AVX2 AVX-512
-+# P4 4.46/+120% -
-+# Core 2 2.41/+90% -
-+# Westmere 1.88/+120% -
-+# Sandy Bridge 1.39/+140% 1.10
-+# Haswell 1.14/+175% 1.11 0.65
-+# Skylake[-X] 1.13/+120% 0.96 0.51 [0.35]
-+# Silvermont 2.83/+95% -
-+# Knights L 3.60/? 1.65 1.10 0.41(***)
-+# Goldmont 1.70/+180% -
-+# VIA Nano 1.82/+150% -
-+# Sledgehammer 1.38/+160% -
-+# Bulldozer 2.30/+130% 0.97
-+# Ryzen 1.15/+200% 1.08 1.18
-+#
-+# (*) improvement coefficients relative to clang are more modest and
-+# are ~50% on most processors, in both cases we are comparing to
-+# __int128 code;
-+# (**) SSE2 implementation was attempted, but among non-AVX processors
-+# it was faster than integer-only code only on older Intel P4 and
-+# Core processors, 50-30%, less newer processor is, but slower on
-+# contemporary ones, for example almost 2x slower on Atom, and as
-+# former are naturally disappearing, SSE2 is deemed unnecessary;
-+# (***) strangely enough performance seems to vary from core to core,
-+# listed result is best case;
-+
-+$flavour = shift;
-+$output = shift;
-+if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
-+
-+$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
-+
-+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-+( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-+( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
-+die "can't locate x86_64-xlate.pl";
-+
-+if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
-+ =~ /GNU assembler version ([2-9]\.[0-9]+)/) {
-+ $avx = ($1>=2.19) + ($1>=2.22) + ($1>=2.25) + ($1>=2.26);
-+}
-+
-+if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
-+ `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) {
-+ $avx = ($1>=2.09) + ($1>=2.10) + 2 * ($1>=2.12);
-+ $avx += 2 if ($1==2.11 && $2>=8);
-+}
-+
-+if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
-+ `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-+ $avx = ($1>=10) + ($1>=12);
-+}
-+
-+if (!$avx && `$ENV{CC} -v 2>&1` =~ /((?:^clang|LLVM) version|.*based on LLVM) ([3-9]\.[0-9]+)/) {
-+ $avx = ($2>=3.0) + ($2>3.0);
-+}
-+
-+open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
-+*STDOUT=*OUT;
-+
-+my ($ctx,$inp,$len,$padbit)=("%rdi","%rsi","%rdx","%rcx");
-+my ($mac,$nonce)=($inp,$len); # *_emit arguments
-+my ($d1,$d2,$d3, $r0,$r1,$s1)=map("%r$_",(8..13));
-+my ($h0,$h1,$h2)=("%r14","%rbx","%rbp");
-+
-+sub poly1305_iteration {
-+# input: copy of $r1 in %rax, $h0-$h2, $r0-$r1
-+# output: $h0-$h2 *= $r0-$r1
-+$code.=<<___;
-+ mulq $h0 # h0*r1
-+ mov %rax,$d2
-+ mov $r0,%rax
-+ mov %rdx,$d3
-+
-+ mulq $h0 # h0*r0
-+ mov %rax,$h0 # future $h0
-+ mov $r0,%rax
-+ mov %rdx,$d1
-+
-+ mulq $h1 # h1*r0
-+ add %rax,$d2
-+ mov $s1,%rax
-+ adc %rdx,$d3
-+
-+ mulq $h1 # h1*s1
-+ mov $h2,$h1 # borrow $h1
-+ add %rax,$h0
-+ adc %rdx,$d1
-+
-+ imulq $s1,$h1 # h2*s1
-+ add $h1,$d2
-+ mov $d1,$h1
-+ adc \$0,$d3
-+
-+ imulq $r0,$h2 # h2*r0
-+ add $d2,$h1
-+ mov \$-4,%rax # mask value
-+ adc $h2,$d3
-+
-+ and $d3,%rax # last reduction step
-+ mov $d3,$h2
-+ shr \$2,$d3
-+ and \$3,$h2
-+ add $d3,%rax
-+ add %rax,$h0
-+ adc \$0,$h1
-+ adc \$0,$h2
-+___
-+}
-+
-+########################################################################
-+# Layout of opaque area is following.
-+#
-+# unsigned __int64 h[3]; # current hash value base 2^64
-+# unsigned __int64 r[2]; # key value base 2^64
-+
-+$code.=<<___;
-+.text
-+
-+.extern OPENSSL_ia32cap_P
-+
-+.globl poly1305_init
-+.hidden poly1305_init
-+.globl poly1305_blocks
-+.hidden poly1305_blocks
-+.globl poly1305_emit
-+.hidden poly1305_emit
-+
-+.type poly1305_init,\@function,3
-+.align 32
-+poly1305_init:
-+ xor %rax,%rax
-+ mov %rax,0($ctx) # initialize hash value
-+ mov %rax,8($ctx)
-+ mov %rax,16($ctx)
-+
-+ cmp \$0,$inp
-+ je .Lno_key
-+
-+ lea poly1305_blocks(%rip),%r10
-+ lea poly1305_emit(%rip),%r11
-+___
-+$code.=<<___ if ($avx);
-+ mov OPENSSL_ia32cap_P+4(%rip),%r9
-+ lea poly1305_blocks_avx(%rip),%rax
-+ lea poly1305_emit_avx(%rip),%rcx
-+ bt \$`60-32`,%r9 # AVX?
-+ cmovc %rax,%r10
-+ cmovc %rcx,%r11
-+___
-+$code.=<<___ if ($avx>1);
-+ lea poly1305_blocks_avx2(%rip),%rax
-+ bt \$`5+32`,%r9 # AVX2?
-+ cmovc %rax,%r10
-+___
-+$code.=<<___ if ($avx>3);
-+ mov \$`(1<<31|1<<21|1<<16)`,%rax
-+ shr \$32,%r9
-+ and %rax,%r9
-+ cmp %rax,%r9
-+ je .Linit_base2_44
-+___
-+$code.=<<___;
-+ mov \$0x0ffffffc0fffffff,%rax
-+ mov \$0x0ffffffc0ffffffc,%rcx
-+ and 0($inp),%rax
-+ and 8($inp),%rcx
-+ mov %rax,24($ctx)
-+ mov %rcx,32($ctx)
-+___
-+$code.=<<___ if ($flavour !~ /elf32/);
-+ mov %r10,0(%rdx)
-+ mov %r11,8(%rdx)
-+___
-+$code.=<<___ if ($flavour =~ /elf32/);
-+ mov %r10d,0(%rdx)
-+ mov %r11d,4(%rdx)
-+___
-+$code.=<<___;
-+ mov \$1,%eax
-+.Lno_key:
-+ ret
-+.size poly1305_init,.-poly1305_init
-+
-+.type poly1305_blocks,\@function,4
-+.align 32
-+poly1305_blocks:
-+.cfi_startproc
-+.Lblocks:
-+ shr \$4,$len
-+ jz .Lno_data # too short
-+
-+ push %rbx
-+.cfi_push %rbx
-+ push %rbp
-+.cfi_push %rbp
-+ push %r12
-+.cfi_push %r12
-+ push %r13
-+.cfi_push %r13
-+ push %r14
-+.cfi_push %r14
-+ push %r15
-+.cfi_push %r15
-+.Lblocks_body:
-+
-+ mov $len,%r15 # reassign $len
-+
-+ mov 24($ctx),$r0 # load r
-+ mov 32($ctx),$s1
-+
-+ mov 0($ctx),$h0 # load hash value
-+ mov 8($ctx),$h1
-+ mov 16($ctx),$h2
-+
-+ mov $s1,$r1
-+ shr \$2,$s1
-+ mov $r1,%rax
-+ add $r1,$s1 # s1 = r1 + (r1 >> 2)
-+ jmp .Loop
-+
-+.align 32
-+.Loop:
-+ add 0($inp),$h0 # accumulate input
-+ adc 8($inp),$h1
-+ lea 16($inp),$inp
-+ adc $padbit,$h2
-+___
-+ &poly1305_iteration();
-+$code.=<<___;
-+ mov $r1,%rax
-+ dec %r15 # len-=16
-+ jnz .Loop
-+
-+ mov $h0,0($ctx) # store hash value
-+ mov $h1,8($ctx)
-+ mov $h2,16($ctx)
-+
-+ mov 0(%rsp),%r15
-+.cfi_restore %r15
-+ mov 8(%rsp),%r14
-+.cfi_restore %r14
-+ mov 16(%rsp),%r13
-+.cfi_restore %r13
-+ mov 24(%rsp),%r12
-+.cfi_restore %r12
-+ mov 32(%rsp),%rbp
-+.cfi_restore %rbp
-+ mov 40(%rsp),%rbx
-+.cfi_restore %rbx
-+ lea 48(%rsp),%rsp
-+.cfi_adjust_cfa_offset -48
-+.Lno_data:
-+.Lblocks_epilogue:
-+ ret
-+.cfi_endproc
-+.size poly1305_blocks,.-poly1305_blocks
-+
-+.type poly1305_emit,\@function,3
-+.align 32
-+poly1305_emit:
-+.Lemit:
-+ mov 0($ctx),%r8 # load hash value
-+ mov 8($ctx),%r9
-+ mov 16($ctx),%r10
-+
-+ mov %r8,%rax
-+ add \$5,%r8 # compare to modulus
-+ mov %r9,%rcx
-+ adc \$0,%r9
-+ adc \$0,%r10
-+ shr \$2,%r10 # did 130-bit value overflow?
-+ cmovnz %r8,%rax
-+ cmovnz %r9,%rcx
-+
-+ add 0($nonce),%rax # accumulate nonce
-+ adc 8($nonce),%rcx
-+ mov %rax,0($mac) # write result
-+ mov %rcx,8($mac)
-+
-+ ret
-+.size poly1305_emit,.-poly1305_emit
-+___
-+if ($avx) {
-+
-+########################################################################
-+# Layout of opaque area is following.
-+#
-+# unsigned __int32 h[5]; # current hash value base 2^26
-+# unsigned __int32 is_base2_26;
-+# unsigned __int64 r[2]; # key value base 2^64
-+# unsigned __int64 pad;
-+# struct { unsigned __int32 r^2, r^1, r^4, r^3; } r[9];
-+#
-+# where r^n are base 2^26 digits of degrees of multiplier key. There are
-+# 5 digits, but last four are interleaved with multiples of 5, totalling
-+# in 9 elements: r0, r1, 5*r1, r2, 5*r2, r3, 5*r3, r4, 5*r4.
-+
-+my ($H0,$H1,$H2,$H3,$H4, $T0,$T1,$T2,$T3,$T4, $D0,$D1,$D2,$D3,$D4, $MASK) =
-+ map("%xmm$_",(0..15));
-+
-+$code.=<<___;
-+.type __poly1305_block,\@abi-omnipotent
-+.align 32
-+__poly1305_block:
-+___
-+ &poly1305_iteration();
-+$code.=<<___;
-+ ret
-+.size __poly1305_block,.-__poly1305_block
-+
-+.type __poly1305_init_avx,\@abi-omnipotent
-+.align 32
-+__poly1305_init_avx:
-+ mov $r0,$h0
-+ mov $r1,$h1
-+ xor $h2,$h2
-+
-+ lea 48+64($ctx),$ctx # size optimization
-+
-+ mov $r1,%rax
-+ call __poly1305_block # r^2
-+
-+ mov \$0x3ffffff,%eax # save interleaved r^2 and r base 2^26
-+ mov \$0x3ffffff,%edx
-+ mov $h0,$d1
-+ and $h0#d,%eax
-+ mov $r0,$d2
-+ and $r0#d,%edx
-+ mov %eax,`16*0+0-64`($ctx)
-+ shr \$26,$d1
-+ mov %edx,`16*0+4-64`($ctx)
-+ shr \$26,$d2
-+
-+ mov \$0x3ffffff,%eax
-+ mov \$0x3ffffff,%edx
-+ and $d1#d,%eax
-+ and $d2#d,%edx
-+ mov %eax,`16*1+0-64`($ctx)
-+ lea (%rax,%rax,4),%eax # *5
-+ mov %edx,`16*1+4-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ mov %eax,`16*2+0-64`($ctx)
-+ shr \$26,$d1
-+ mov %edx,`16*2+4-64`($ctx)
-+ shr \$26,$d2
-+
-+ mov $h1,%rax
-+ mov $r1,%rdx
-+ shl \$12,%rax
-+ shl \$12,%rdx
-+ or $d1,%rax
-+ or $d2,%rdx
-+ and \$0x3ffffff,%eax
-+ and \$0x3ffffff,%edx
-+ mov %eax,`16*3+0-64`($ctx)
-+ lea (%rax,%rax,4),%eax # *5
-+ mov %edx,`16*3+4-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ mov %eax,`16*4+0-64`($ctx)
-+ mov $h1,$d1
-+ mov %edx,`16*4+4-64`($ctx)
-+ mov $r1,$d2
-+
-+ mov \$0x3ffffff,%eax
-+ mov \$0x3ffffff,%edx
-+ shr \$14,$d1
-+ shr \$14,$d2
-+ and $d1#d,%eax
-+ and $d2#d,%edx
-+ mov %eax,`16*5+0-64`($ctx)
-+ lea (%rax,%rax,4),%eax # *5
-+ mov %edx,`16*5+4-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ mov %eax,`16*6+0-64`($ctx)
-+ shr \$26,$d1
-+ mov %edx,`16*6+4-64`($ctx)
-+ shr \$26,$d2
-+
-+ mov $h2,%rax
-+ shl \$24,%rax
-+ or %rax,$d1
-+ mov $d1#d,`16*7+0-64`($ctx)
-+ lea ($d1,$d1,4),$d1 # *5
-+ mov $d2#d,`16*7+4-64`($ctx)
-+ lea ($d2,$d2,4),$d2 # *5
-+ mov $d1#d,`16*8+0-64`($ctx)
-+ mov $d2#d,`16*8+4-64`($ctx)
-+
-+ mov $r1,%rax
-+ call __poly1305_block # r^3
-+
-+ mov \$0x3ffffff,%eax # save r^3 base 2^26
-+ mov $h0,$d1
-+ and $h0#d,%eax
-+ shr \$26,$d1
-+ mov %eax,`16*0+12-64`($ctx)
-+
-+ mov \$0x3ffffff,%edx
-+ and $d1#d,%edx
-+ mov %edx,`16*1+12-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ shr \$26,$d1
-+ mov %edx,`16*2+12-64`($ctx)
-+
-+ mov $h1,%rax
-+ shl \$12,%rax
-+ or $d1,%rax
-+ and \$0x3ffffff,%eax
-+ mov %eax,`16*3+12-64`($ctx)
-+ lea (%rax,%rax,4),%eax # *5
-+ mov $h1,$d1
-+ mov %eax,`16*4+12-64`($ctx)
-+
-+ mov \$0x3ffffff,%edx
-+ shr \$14,$d1
-+ and $d1#d,%edx
-+ mov %edx,`16*5+12-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ shr \$26,$d1
-+ mov %edx,`16*6+12-64`($ctx)
-+
-+ mov $h2,%rax
-+ shl \$24,%rax
-+ or %rax,$d1
-+ mov $d1#d,`16*7+12-64`($ctx)
-+ lea ($d1,$d1,4),$d1 # *5
-+ mov $d1#d,`16*8+12-64`($ctx)
-+
-+ mov $r1,%rax
-+ call __poly1305_block # r^4
-+
-+ mov \$0x3ffffff,%eax # save r^4 base 2^26
-+ mov $h0,$d1
-+ and $h0#d,%eax
-+ shr \$26,$d1
-+ mov %eax,`16*0+8-64`($ctx)
-+
-+ mov \$0x3ffffff,%edx
-+ and $d1#d,%edx
-+ mov %edx,`16*1+8-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ shr \$26,$d1
-+ mov %edx,`16*2+8-64`($ctx)
-+
-+ mov $h1,%rax
-+ shl \$12,%rax
-+ or $d1,%rax
-+ and \$0x3ffffff,%eax
-+ mov %eax,`16*3+8-64`($ctx)
-+ lea (%rax,%rax,4),%eax # *5
-+ mov $h1,$d1
-+ mov %eax,`16*4+8-64`($ctx)
-+
-+ mov \$0x3ffffff,%edx
-+ shr \$14,$d1
-+ and $d1#d,%edx
-+ mov %edx,`16*5+8-64`($ctx)
-+ lea (%rdx,%rdx,4),%edx # *5
-+ shr \$26,$d1
-+ mov %edx,`16*6+8-64`($ctx)
-+
-+ mov $h2,%rax
-+ shl \$24,%rax
-+ or %rax,$d1
-+ mov $d1#d,`16*7+8-64`($ctx)
-+ lea ($d1,$d1,4),$d1 # *5
-+ mov $d1#d,`16*8+8-64`($ctx)
-+
-+ lea -48-64($ctx),$ctx # size [de-]optimization
-+ ret
-+.size __poly1305_init_avx,.-__poly1305_init_avx
-+
-+.type poly1305_blocks_avx,\@function,4
-+.align 32
-+poly1305_blocks_avx:
-+.cfi_startproc
-+ mov 20($ctx),%r8d # is_base2_26
-+ cmp \$128,$len
-+ jae .Lblocks_avx
-+ test %r8d,%r8d
-+ jz .Lblocks
-+
-+.Lblocks_avx:
-+ and \$-16,$len
-+ jz .Lno_data_avx
-+
-+ vzeroupper
-+
-+ test %r8d,%r8d
-+ jz .Lbase2_64_avx
-+
-+ test \$31,$len
-+ jz .Leven_avx
-+
-+ push %rbx
-+.cfi_push %rbx
-+ push %rbp
-+.cfi_push %rbp
-+ push %r12
-+.cfi_push %r12
-+ push %r13
-+.cfi_push %r13
-+ push %r14
-+.cfi_push %r14
-+ push %r15
-+.cfi_push %r15
-+.Lblocks_avx_body:
-+
-+ mov $len,%r15 # reassign $len
-+
-+ mov 0($ctx),$d1 # load hash value
-+ mov 8($ctx),$d2
-+ mov 16($ctx),$h2#d
-+
-+ mov 24($ctx),$r0 # load r
-+ mov 32($ctx),$s1
-+
-+ ################################# base 2^26 -> base 2^64
-+ mov $d1#d,$h0#d
-+ and \$`-1*(1<<31)`,$d1
-+ mov $d2,$r1 # borrow $r1
-+ mov $d2#d,$h1#d
-+ and \$`-1*(1<<31)`,$d2
-+
-+ shr \$6,$d1
-+ shl \$52,$r1
-+ add $d1,$h0
-+ shr \$12,$h1
-+ shr \$18,$d2
-+ add $r1,$h0
-+ adc $d2,$h1
-+
-+ mov $h2,$d1
-+ shl \$40,$d1
-+ shr \$24,$h2
-+ add $d1,$h1
-+ adc \$0,$h2 # can be partially reduced...
-+
-+ mov \$-4,$d2 # ... so reduce
-+ mov $h2,$d1
-+ and $h2,$d2
-+ shr \$2,$d1
-+ and \$3,$h2
-+ add $d2,$d1 # =*5
-+ add $d1,$h0
-+ adc \$0,$h1
-+ adc \$0,$h2
-+
-+ mov $s1,$r1
-+ mov $s1,%rax
-+ shr \$2,$s1
-+ add $r1,$s1 # s1 = r1 + (r1 >> 2)
-+
-+ add 0($inp),$h0 # accumulate input
-+ adc 8($inp),$h1
-+ lea 16($inp),$inp
-+ adc $padbit,$h2
-+
-+ call __poly1305_block
-+
-+ test $padbit,$padbit # if $padbit is zero,
-+ jz .Lstore_base2_64_avx # store hash in base 2^64 format
-+
-+ ################################# base 2^64 -> base 2^26
-+ mov $h0,%rax
-+ mov $h0,%rdx
-+ shr \$52,$h0
-+ mov $h1,$r0
-+ mov $h1,$r1
-+ shr \$26,%rdx
-+ and \$0x3ffffff,%rax # h[0]
-+ shl \$12,$r0
-+ and \$0x3ffffff,%rdx # h[1]
-+ shr \$14,$h1
-+ or $r0,$h0
-+ shl \$24,$h2
-+ and \$0x3ffffff,$h0 # h[2]
-+ shr \$40,$r1
-+ and \$0x3ffffff,$h1 # h[3]
-+ or $r1,$h2 # h[4]
-+
-+ sub \$16,%r15
-+ jz .Lstore_base2_26_avx
-+
-+ vmovd %rax#d,$H0
-+ vmovd %rdx#d,$H1
-+ vmovd $h0#d,$H2
-+ vmovd $h1#d,$H3
-+ vmovd $h2#d,$H4
-+ jmp .Lproceed_avx
-+
-+.align 32
-+.Lstore_base2_64_avx:
-+ mov $h0,0($ctx)
-+ mov $h1,8($ctx)
-+ mov $h2,16($ctx) # note that is_base2_26 is zeroed
-+ jmp .Ldone_avx
-+
-+.align 16
-+.Lstore_base2_26_avx:
-+ mov %rax#d,0($ctx) # store hash value base 2^26
-+ mov %rdx#d,4($ctx)
-+ mov $h0#d,8($ctx)
-+ mov $h1#d,12($ctx)
-+ mov $h2#d,16($ctx)
-+.align 16
-+.Ldone_avx:
-+ mov 0(%rsp),%r15
-+.cfi_restore %r15
-+ mov 8(%rsp),%r14
-+.cfi_restore %r14
-+ mov 16(%rsp),%r13
-+.cfi_restore %r13
-+ mov 24(%rsp),%r12
-+.cfi_restore %r12
-+ mov 32(%rsp),%rbp
-+.cfi_restore %rbp
-+ mov 40(%rsp),%rbx
-+.cfi_restore %rbx
-+ lea 48(%rsp),%rsp
-+.cfi_adjust_cfa_offset -48
-+.Lno_data_avx:
-+.Lblocks_avx_epilogue:
-+ ret
-+.cfi_endproc
-+
-+.align 32
-+.Lbase2_64_avx:
-+.cfi_startproc
-+ push %rbx
-+.cfi_push %rbx
-+ push %rbp
-+.cfi_push %rbp
-+ push %r12
-+.cfi_push %r12
-+ push %r13
-+.cfi_push %r13
-+ push %r14
-+.cfi_push %r14
-+ push %r15
-+.cfi_push %r15
-+.Lbase2_64_avx_body:
-+
-+ mov $len,%r15 # reassign $len
-+
-+ mov 24($ctx),$r0 # load r
-+ mov 32($ctx),$s1
-+
-+ mov 0($ctx),$h0 # load hash value
-+ mov 8($ctx),$h1
-+ mov 16($ctx),$h2#d
-+
-+ mov $s1,$r1
-+ mov $s1,%rax
-+ shr \$2,$s1
-+ add $r1,$s1 # s1 = r1 + (r1 >> 2)
-+
-+ test \$31,$len
-+ jz .Linit_avx
-+
-+ add 0($inp),$h0 # accumulate input
-+ adc 8($inp),$h1
-+ lea 16($inp),$inp
-+ adc $padbit,$h2
-+ sub \$16,%r15
-+
-+ call __poly1305_block
-+
-+.Linit_avx:
-+ ################################# base 2^64 -> base 2^26
-+ mov $h0,%rax
-+ mov $h0,%rdx
-+ shr \$52,$h0
-+ mov $h1,$d1
-+ mov $h1,$d2
-+ shr \$26,%rdx
-+ and \$0x3ffffff,%rax # h[0]
-+ shl \$12,$d1
-+ and \$0x3ffffff,%rdx # h[1]
-+ shr \$14,$h1
-+ or $d1,$h0
-+ shl \$24,$h2
-+ and \$0x3ffffff,$h0 # h[2]
-+ shr \$40,$d2
-+ and \$0x3ffffff,$h1 # h[3]
-+ or $d2,$h2 # h[4]
-+
-+ vmovd %rax#d,$H0
-+ vmovd %rdx#d,$H1
-+ vmovd $h0#d,$H2
-+ vmovd $h1#d,$H3
-+ vmovd $h2#d,$H4
-+ movl \$1,20($ctx) # set is_base2_26
-+
-+ call __poly1305_init_avx
-+
-+.Lproceed_avx:
-+ mov %r15,$len
-+
-+ mov 0(%rsp),%r15
-+.cfi_restore %r15
-+ mov 8(%rsp),%r14
-+.cfi_restore %r14
-+ mov 16(%rsp),%r13
-+.cfi_restore %r13
-+ mov 24(%rsp),%r12
-+.cfi_restore %r12
-+ mov 32(%rsp),%rbp
-+.cfi_restore %rbp
-+ mov 40(%rsp),%rbx
-+.cfi_restore %rbx
-+ lea 48(%rsp),%rax
-+ lea 48(%rsp),%rsp
-+.cfi_adjust_cfa_offset -48
-+.Lbase2_64_avx_epilogue:
-+ jmp .Ldo_avx
-+.cfi_endproc
-+
-+.align 32
-+.Leven_avx:
-+.cfi_startproc
-+ vmovd 4*0($ctx),$H0 # load hash value
-+ vmovd 4*1($ctx),$H1
-+ vmovd 4*2($ctx),$H2
-+ vmovd 4*3($ctx),$H3
-+ vmovd 4*4($ctx),$H4
-+
-+.Ldo_avx:
-+___
-+$code.=<<___ if (!$win64);
-+ lea -0x58(%rsp),%r11
-+.cfi_def_cfa %r11,0x60
-+ sub \$0x178,%rsp
-+___
-+$code.=<<___ if ($win64);
-+ lea -0xf8(%rsp),%r11
-+ sub \$0x218,%rsp
-+ vmovdqa %xmm6,0x50(%r11)
-+ vmovdqa %xmm7,0x60(%r11)
-+ vmovdqa %xmm8,0x70(%r11)
-+ vmovdqa %xmm9,0x80(%r11)
-+ vmovdqa %xmm10,0x90(%r11)
-+ vmovdqa %xmm11,0xa0(%r11)
-+ vmovdqa %xmm12,0xb0(%r11)
-+ vmovdqa %xmm13,0xc0(%r11)
-+ vmovdqa %xmm14,0xd0(%r11)
-+ vmovdqa %xmm15,0xe0(%r11)
-+.Ldo_avx_body:
-+___
-+$code.=<<___;
-+ sub \$64,$len
-+ lea -32($inp),%rax
-+ cmovc %rax,$inp
-+
-+ vmovdqu `16*3`($ctx),$D4 # preload r0^2
-+ lea `16*3+64`($ctx),$ctx # size optimization
-+ lea .Lconst(%rip),%rcx
-+
-+ ################################################################
-+ # load input
-+ vmovdqu 16*2($inp),$T0
-+ vmovdqu 16*3($inp),$T1
-+ vmovdqa 64(%rcx),$MASK # .Lmask26
-+
-+ vpsrldq \$6,$T0,$T2 # splat input
-+ vpsrldq \$6,$T1,$T3
-+ vpunpckhqdq $T1,$T0,$T4 # 4
-+ vpunpcklqdq $T1,$T0,$T0 # 0:1
-+ vpunpcklqdq $T3,$T2,$T3 # 2:3
-+
-+ vpsrlq \$40,$T4,$T4 # 4
-+ vpsrlq \$26,$T0,$T1
-+ vpand $MASK,$T0,$T0 # 0
-+ vpsrlq \$4,$T3,$T2
-+ vpand $MASK,$T1,$T1 # 1
-+ vpsrlq \$30,$T3,$T3
-+ vpand $MASK,$T2,$T2 # 2
-+ vpand $MASK,$T3,$T3 # 3
-+ vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-+
-+ jbe .Lskip_loop_avx
-+
-+ # expand and copy pre-calculated table to stack
-+ vmovdqu `16*1-64`($ctx),$D1
-+ vmovdqu `16*2-64`($ctx),$D2
-+ vpshufd \$0xEE,$D4,$D3 # 34xx -> 3434
-+ vpshufd \$0x44,$D4,$D0 # xx12 -> 1212
-+ vmovdqa $D3,-0x90(%r11)
-+ vmovdqa $D0,0x00(%rsp)
-+ vpshufd \$0xEE,$D1,$D4
-+ vmovdqu `16*3-64`($ctx),$D0
-+ vpshufd \$0x44,$D1,$D1
-+ vmovdqa $D4,-0x80(%r11)
-+ vmovdqa $D1,0x10(%rsp)
-+ vpshufd \$0xEE,$D2,$D3
-+ vmovdqu `16*4-64`($ctx),$D1
-+ vpshufd \$0x44,$D2,$D2
-+ vmovdqa $D3,-0x70(%r11)
-+ vmovdqa $D2,0x20(%rsp)
-+ vpshufd \$0xEE,$D0,$D4
-+ vmovdqu `16*5-64`($ctx),$D2
-+ vpshufd \$0x44,$D0,$D0
-+ vmovdqa $D4,-0x60(%r11)
-+ vmovdqa $D0,0x30(%rsp)
-+ vpshufd \$0xEE,$D1,$D3
-+ vmovdqu `16*6-64`($ctx),$D0
-+ vpshufd \$0x44,$D1,$D1
-+ vmovdqa $D3,-0x50(%r11)
-+ vmovdqa $D1,0x40(%rsp)
-+ vpshufd \$0xEE,$D2,$D4
-+ vmovdqu `16*7-64`($ctx),$D1
-+ vpshufd \$0x44,$D2,$D2
-+ vmovdqa $D4,-0x40(%r11)
-+ vmovdqa $D2,0x50(%rsp)
-+ vpshufd \$0xEE,$D0,$D3
-+ vmovdqu `16*8-64`($ctx),$D2
-+ vpshufd \$0x44,$D0,$D0
-+ vmovdqa $D3,-0x30(%r11)
-+ vmovdqa $D0,0x60(%rsp)
-+ vpshufd \$0xEE,$D1,$D4
-+ vpshufd \$0x44,$D1,$D1
-+ vmovdqa $D4,-0x20(%r11)
-+ vmovdqa $D1,0x70(%rsp)
-+ vpshufd \$0xEE,$D2,$D3
-+ vmovdqa 0x00(%rsp),$D4 # preload r0^2
-+ vpshufd \$0x44,$D2,$D2
-+ vmovdqa $D3,-0x10(%r11)
-+ vmovdqa $D2,0x80(%rsp)
-+
-+ jmp .Loop_avx
-+
-+.align 32
-+.Loop_avx:
-+ ################################################################
-+ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2
-+ # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^3+inp[7]*r
-+ # \___________________/
-+ # ((inp[0]*r^4+inp[2]*r^2+inp[4])*r^4+inp[6]*r^2+inp[8])*r^2
-+ # ((inp[1]*r^4+inp[3]*r^2+inp[5])*r^4+inp[7]*r^2+inp[9])*r
-+ # \___________________/ \____________________/
-+ #
-+ # Note that we start with inp[2:3]*r^2. This is because it
-+ # doesn't depend on reduction in previous iteration.
-+ ################################################################
-+ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+ #
-+ # though note that $Tx and $Hx are "reversed" in this section,
-+ # and $D4 is preloaded with r0^2...
-+
-+ vpmuludq $T0,$D4,$D0 # d0 = h0*r0
-+ vpmuludq $T1,$D4,$D1 # d1 = h1*r0
-+ vmovdqa $H2,0x20(%r11) # offload hash
-+ vpmuludq $T2,$D4,$D2 # d3 = h2*r0
-+ vmovdqa 0x10(%rsp),$H2 # r1^2
-+ vpmuludq $T3,$D4,$D3 # d3 = h3*r0
-+ vpmuludq $T4,$D4,$D4 # d4 = h4*r0
-+
-+ vmovdqa $H0,0x00(%r11) #
-+ vpmuludq 0x20(%rsp),$T4,$H0 # h4*s1
-+ vmovdqa $H1,0x10(%r11) #
-+ vpmuludq $T3,$H2,$H1 # h3*r1
-+ vpaddq $H0,$D0,$D0 # d0 += h4*s1
-+ vpaddq $H1,$D4,$D4 # d4 += h3*r1
-+ vmovdqa $H3,0x30(%r11) #
-+ vpmuludq $T2,$H2,$H0 # h2*r1
-+ vpmuludq $T1,$H2,$H1 # h1*r1
-+ vpaddq $H0,$D3,$D3 # d3 += h2*r1
-+ vmovdqa 0x30(%rsp),$H3 # r2^2
-+ vpaddq $H1,$D2,$D2 # d2 += h1*r1
-+ vmovdqa $H4,0x40(%r11) #
-+ vpmuludq $T0,$H2,$H2 # h0*r1
-+ vpmuludq $T2,$H3,$H0 # h2*r2
-+ vpaddq $H2,$D1,$D1 # d1 += h0*r1
-+
-+ vmovdqa 0x40(%rsp),$H4 # s2^2
-+ vpaddq $H0,$D4,$D4 # d4 += h2*r2
-+ vpmuludq $T1,$H3,$H1 # h1*r2
-+ vpmuludq $T0,$H3,$H3 # h0*r2
-+ vpaddq $H1,$D3,$D3 # d3 += h1*r2
-+ vmovdqa 0x50(%rsp),$H2 # r3^2
-+ vpaddq $H3,$D2,$D2 # d2 += h0*r2
-+ vpmuludq $T4,$H4,$H0 # h4*s2
-+ vpmuludq $T3,$H4,$H4 # h3*s2
-+ vpaddq $H0,$D1,$D1 # d1 += h4*s2
-+ vmovdqa 0x60(%rsp),$H3 # s3^2
-+ vpaddq $H4,$D0,$D0 # d0 += h3*s2
-+
-+ vmovdqa 0x80(%rsp),$H4 # s4^2
-+ vpmuludq $T1,$H2,$H1 # h1*r3
-+ vpmuludq $T0,$H2,$H2 # h0*r3
-+ vpaddq $H1,$D4,$D4 # d4 += h1*r3
-+ vpaddq $H2,$D3,$D3 # d3 += h0*r3
-+ vpmuludq $T4,$H3,$H0 # h4*s3
-+ vpmuludq $T3,$H3,$H1 # h3*s3
-+ vpaddq $H0,$D2,$D2 # d2 += h4*s3
-+ vmovdqu 16*0($inp),$H0 # load input
-+ vpaddq $H1,$D1,$D1 # d1 += h3*s3
-+ vpmuludq $T2,$H3,$H3 # h2*s3
-+ vpmuludq $T2,$H4,$T2 # h2*s4
-+ vpaddq $H3,$D0,$D0 # d0 += h2*s3
-+
-+ vmovdqu 16*1($inp),$H1 #
-+ vpaddq $T2,$D1,$D1 # d1 += h2*s4
-+ vpmuludq $T3,$H4,$T3 # h3*s4
-+ vpmuludq $T4,$H4,$T4 # h4*s4
-+ vpsrldq \$6,$H0,$H2 # splat input
-+ vpaddq $T3,$D2,$D2 # d2 += h3*s4
-+ vpaddq $T4,$D3,$D3 # d3 += h4*s4
-+ vpsrldq \$6,$H1,$H3 #
-+ vpmuludq 0x70(%rsp),$T0,$T4 # h0*r4
-+ vpmuludq $T1,$H4,$T0 # h1*s4
-+ vpunpckhqdq $H1,$H0,$H4 # 4
-+ vpaddq $T4,$D4,$D4 # d4 += h0*r4
-+ vmovdqa -0x90(%r11),$T4 # r0^4
-+ vpaddq $T0,$D0,$D0 # d0 += h1*s4
-+
-+ vpunpcklqdq $H1,$H0,$H0 # 0:1
-+ vpunpcklqdq $H3,$H2,$H3 # 2:3
-+
-+ #vpsrlq \$40,$H4,$H4 # 4
-+ vpsrldq \$`40/8`,$H4,$H4 # 4
-+ vpsrlq \$26,$H0,$H1
-+ vpand $MASK,$H0,$H0 # 0
-+ vpsrlq \$4,$H3,$H2
-+ vpand $MASK,$H1,$H1 # 1
-+ vpand 0(%rcx),$H4,$H4 # .Lmask24
-+ vpsrlq \$30,$H3,$H3
-+ vpand $MASK,$H2,$H2 # 2
-+ vpand $MASK,$H3,$H3 # 3
-+ vpor 32(%rcx),$H4,$H4 # padbit, yes, always
-+
-+ vpaddq 0x00(%r11),$H0,$H0 # add hash value
-+ vpaddq 0x10(%r11),$H1,$H1
-+ vpaddq 0x20(%r11),$H2,$H2
-+ vpaddq 0x30(%r11),$H3,$H3
-+ vpaddq 0x40(%r11),$H4,$H4
-+
-+ lea 16*2($inp),%rax
-+ lea 16*4($inp),$inp
-+ sub \$64,$len
-+ cmovc %rax,$inp
-+
-+ ################################################################
-+ # Now we accumulate (inp[0:1]+hash)*r^4
-+ ################################################################
-+ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+
-+ vpmuludq $H0,$T4,$T0 # h0*r0
-+ vpmuludq $H1,$T4,$T1 # h1*r0
-+ vpaddq $T0,$D0,$D0
-+ vpaddq $T1,$D1,$D1
-+ vmovdqa -0x80(%r11),$T2 # r1^4
-+ vpmuludq $H2,$T4,$T0 # h2*r0
-+ vpmuludq $H3,$T4,$T1 # h3*r0
-+ vpaddq $T0,$D2,$D2
-+ vpaddq $T1,$D3,$D3
-+ vpmuludq $H4,$T4,$T4 # h4*r0
-+ vpmuludq -0x70(%r11),$H4,$T0 # h4*s1
-+ vpaddq $T4,$D4,$D4
-+
-+ vpaddq $T0,$D0,$D0 # d0 += h4*s1
-+ vpmuludq $H2,$T2,$T1 # h2*r1
-+ vpmuludq $H3,$T2,$T0 # h3*r1
-+ vpaddq $T1,$D3,$D3 # d3 += h2*r1
-+ vmovdqa -0x60(%r11),$T3 # r2^4
-+ vpaddq $T0,$D4,$D4 # d4 += h3*r1
-+ vpmuludq $H1,$T2,$T1 # h1*r1
-+ vpmuludq $H0,$T2,$T2 # h0*r1
-+ vpaddq $T1,$D2,$D2 # d2 += h1*r1
-+ vpaddq $T2,$D1,$D1 # d1 += h0*r1
-+
-+ vmovdqa -0x50(%r11),$T4 # s2^4
-+ vpmuludq $H2,$T3,$T0 # h2*r2
-+ vpmuludq $H1,$T3,$T1 # h1*r2
-+ vpaddq $T0,$D4,$D4 # d4 += h2*r2
-+ vpaddq $T1,$D3,$D3 # d3 += h1*r2
-+ vmovdqa -0x40(%r11),$T2 # r3^4
-+ vpmuludq $H0,$T3,$T3 # h0*r2
-+ vpmuludq $H4,$T4,$T0 # h4*s2
-+ vpaddq $T3,$D2,$D2 # d2 += h0*r2
-+ vpaddq $T0,$D1,$D1 # d1 += h4*s2
-+ vmovdqa -0x30(%r11),$T3 # s3^4
-+ vpmuludq $H3,$T4,$T4 # h3*s2
-+ vpmuludq $H1,$T2,$T1 # h1*r3
-+ vpaddq $T4,$D0,$D0 # d0 += h3*s2
-+
-+ vmovdqa -0x10(%r11),$T4 # s4^4
-+ vpaddq $T1,$D4,$D4 # d4 += h1*r3
-+ vpmuludq $H0,$T2,$T2 # h0*r3
-+ vpmuludq $H4,$T3,$T0 # h4*s3
-+ vpaddq $T2,$D3,$D3 # d3 += h0*r3
-+ vpaddq $T0,$D2,$D2 # d2 += h4*s3
-+ vmovdqu 16*2($inp),$T0 # load input
-+ vpmuludq $H3,$T3,$T2 # h3*s3
-+ vpmuludq $H2,$T3,$T3 # h2*s3
-+ vpaddq $T2,$D1,$D1 # d1 += h3*s3
-+ vmovdqu 16*3($inp),$T1 #
-+ vpaddq $T3,$D0,$D0 # d0 += h2*s3
-+
-+ vpmuludq $H2,$T4,$H2 # h2*s4
-+ vpmuludq $H3,$T4,$H3 # h3*s4
-+ vpsrldq \$6,$T0,$T2 # splat input
-+ vpaddq $H2,$D1,$D1 # d1 += h2*s4
-+ vpmuludq $H4,$T4,$H4 # h4*s4
-+ vpsrldq \$6,$T1,$T3 #
-+ vpaddq $H3,$D2,$H2 # h2 = d2 + h3*s4
-+ vpaddq $H4,$D3,$H3 # h3 = d3 + h4*s4
-+ vpmuludq -0x20(%r11),$H0,$H4 # h0*r4
-+ vpmuludq $H1,$T4,$H0
-+ vpunpckhqdq $T1,$T0,$T4 # 4
-+ vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4
-+ vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4
-+
-+ vpunpcklqdq $T1,$T0,$T0 # 0:1
-+ vpunpcklqdq $T3,$T2,$T3 # 2:3
-+
-+ #vpsrlq \$40,$T4,$T4 # 4
-+ vpsrldq \$`40/8`,$T4,$T4 # 4
-+ vpsrlq \$26,$T0,$T1
-+ vmovdqa 0x00(%rsp),$D4 # preload r0^2
-+ vpand $MASK,$T0,$T0 # 0
-+ vpsrlq \$4,$T3,$T2
-+ vpand $MASK,$T1,$T1 # 1
-+ vpand 0(%rcx),$T4,$T4 # .Lmask24
-+ vpsrlq \$30,$T3,$T3
-+ vpand $MASK,$T2,$T2 # 2
-+ vpand $MASK,$T3,$T3 # 3
-+ vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-+
-+ ################################################################
-+ # lazy reduction as discussed in "NEON crypto" by D.J. Bernstein
-+ # and P. Schwabe
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$D1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H4,$D0
-+ vpand $MASK,$H4,$H4
-+
-+ vpsrlq \$26,$H1,$D1
-+ vpand $MASK,$H1,$H1
-+ vpaddq $D1,$H2,$H2 # h1 -> h2
-+
-+ vpaddq $D0,$H0,$H0
-+ vpsllq \$2,$D0,$D0
-+ vpaddq $D0,$H0,$H0 # h4 -> h0
-+
-+ vpsrlq \$26,$H2,$D2
-+ vpand $MASK,$H2,$H2
-+ vpaddq $D2,$H3,$H3 # h2 -> h3
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ ja .Loop_avx
-+
-+.Lskip_loop_avx:
-+ ################################################################
-+ # multiply (inp[0:1]+hash) or inp[2:3] by r^2:r^1
-+
-+ vpshufd \$0x10,$D4,$D4 # r0^n, xx12 -> x1x2
-+ add \$32,$len
-+ jnz .Long_tail_avx
-+
-+ vpaddq $H2,$T2,$T2
-+ vpaddq $H0,$T0,$T0
-+ vpaddq $H1,$T1,$T1
-+ vpaddq $H3,$T3,$T3
-+ vpaddq $H4,$T4,$T4
-+
-+.Long_tail_avx:
-+ vmovdqa $H2,0x20(%r11)
-+ vmovdqa $H0,0x00(%r11)
-+ vmovdqa $H1,0x10(%r11)
-+ vmovdqa $H3,0x30(%r11)
-+ vmovdqa $H4,0x40(%r11)
-+
-+ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+
-+ vpmuludq $T2,$D4,$D2 # d2 = h2*r0
-+ vpmuludq $T0,$D4,$D0 # d0 = h0*r0
-+ vpshufd \$0x10,`16*1-64`($ctx),$H2 # r1^n
-+ vpmuludq $T1,$D4,$D1 # d1 = h1*r0
-+ vpmuludq $T3,$D4,$D3 # d3 = h3*r0
-+ vpmuludq $T4,$D4,$D4 # d4 = h4*r0
-+
-+ vpmuludq $T3,$H2,$H0 # h3*r1
-+ vpaddq $H0,$D4,$D4 # d4 += h3*r1
-+ vpshufd \$0x10,`16*2-64`($ctx),$H3 # s1^n
-+ vpmuludq $T2,$H2,$H1 # h2*r1
-+ vpaddq $H1,$D3,$D3 # d3 += h2*r1
-+ vpshufd \$0x10,`16*3-64`($ctx),$H4 # r2^n
-+ vpmuludq $T1,$H2,$H0 # h1*r1
-+ vpaddq $H0,$D2,$D2 # d2 += h1*r1
-+ vpmuludq $T0,$H2,$H2 # h0*r1
-+ vpaddq $H2,$D1,$D1 # d1 += h0*r1
-+ vpmuludq $T4,$H3,$H3 # h4*s1
-+ vpaddq $H3,$D0,$D0 # d0 += h4*s1
-+
-+ vpshufd \$0x10,`16*4-64`($ctx),$H2 # s2^n
-+ vpmuludq $T2,$H4,$H1 # h2*r2
-+ vpaddq $H1,$D4,$D4 # d4 += h2*r2
-+ vpmuludq $T1,$H4,$H0 # h1*r2
-+ vpaddq $H0,$D3,$D3 # d3 += h1*r2
-+ vpshufd \$0x10,`16*5-64`($ctx),$H3 # r3^n
-+ vpmuludq $T0,$H4,$H4 # h0*r2
-+ vpaddq $H4,$D2,$D2 # d2 += h0*r2
-+ vpmuludq $T4,$H2,$H1 # h4*s2
-+ vpaddq $H1,$D1,$D1 # d1 += h4*s2
-+ vpshufd \$0x10,`16*6-64`($ctx),$H4 # s3^n
-+ vpmuludq $T3,$H2,$H2 # h3*s2
-+ vpaddq $H2,$D0,$D0 # d0 += h3*s2
-+
-+ vpmuludq $T1,$H3,$H0 # h1*r3
-+ vpaddq $H0,$D4,$D4 # d4 += h1*r3
-+ vpmuludq $T0,$H3,$H3 # h0*r3
-+ vpaddq $H3,$D3,$D3 # d3 += h0*r3
-+ vpshufd \$0x10,`16*7-64`($ctx),$H2 # r4^n
-+ vpmuludq $T4,$H4,$H1 # h4*s3
-+ vpaddq $H1,$D2,$D2 # d2 += h4*s3
-+ vpshufd \$0x10,`16*8-64`($ctx),$H3 # s4^n
-+ vpmuludq $T3,$H4,$H0 # h3*s3
-+ vpaddq $H0,$D1,$D1 # d1 += h3*s3
-+ vpmuludq $T2,$H4,$H4 # h2*s3
-+ vpaddq $H4,$D0,$D0 # d0 += h2*s3
-+
-+ vpmuludq $T0,$H2,$H2 # h0*r4
-+ vpaddq $H2,$D4,$D4 # h4 = d4 + h0*r4
-+ vpmuludq $T4,$H3,$H1 # h4*s4
-+ vpaddq $H1,$D3,$D3 # h3 = d3 + h4*s4
-+ vpmuludq $T3,$H3,$H0 # h3*s4
-+ vpaddq $H0,$D2,$D2 # h2 = d2 + h3*s4
-+ vpmuludq $T2,$H3,$H1 # h2*s4
-+ vpaddq $H1,$D1,$D1 # h1 = d1 + h2*s4
-+ vpmuludq $T1,$H3,$H3 # h1*s4
-+ vpaddq $H3,$D0,$D0 # h0 = d0 + h1*s4
-+
-+ jz .Lshort_tail_avx
-+
-+ vmovdqu 16*0($inp),$H0 # load input
-+ vmovdqu 16*1($inp),$H1
-+
-+ vpsrldq \$6,$H0,$H2 # splat input
-+ vpsrldq \$6,$H1,$H3
-+ vpunpckhqdq $H1,$H0,$H4 # 4
-+ vpunpcklqdq $H1,$H0,$H0 # 0:1
-+ vpunpcklqdq $H3,$H2,$H3 # 2:3
-+
-+ vpsrlq \$40,$H4,$H4 # 4
-+ vpsrlq \$26,$H0,$H1
-+ vpand $MASK,$H0,$H0 # 0
-+ vpsrlq \$4,$H3,$H2
-+ vpand $MASK,$H1,$H1 # 1
-+ vpsrlq \$30,$H3,$H3
-+ vpand $MASK,$H2,$H2 # 2
-+ vpand $MASK,$H3,$H3 # 3
-+ vpor 32(%rcx),$H4,$H4 # padbit, yes, always
-+
-+ vpshufd \$0x32,`16*0-64`($ctx),$T4 # r0^n, 34xx -> x3x4
-+ vpaddq 0x00(%r11),$H0,$H0
-+ vpaddq 0x10(%r11),$H1,$H1
-+ vpaddq 0x20(%r11),$H2,$H2
-+ vpaddq 0x30(%r11),$H3,$H3
-+ vpaddq 0x40(%r11),$H4,$H4
-+
-+ ################################################################
-+ # multiply (inp[0:1]+hash) by r^4:r^3 and accumulate
-+
-+ vpmuludq $H0,$T4,$T0 # h0*r0
-+ vpaddq $T0,$D0,$D0 # d0 += h0*r0
-+ vpmuludq $H1,$T4,$T1 # h1*r0
-+ vpaddq $T1,$D1,$D1 # d1 += h1*r0
-+ vpmuludq $H2,$T4,$T0 # h2*r0
-+ vpaddq $T0,$D2,$D2 # d2 += h2*r0
-+ vpshufd \$0x32,`16*1-64`($ctx),$T2 # r1^n
-+ vpmuludq $H3,$T4,$T1 # h3*r0
-+ vpaddq $T1,$D3,$D3 # d3 += h3*r0
-+ vpmuludq $H4,$T4,$T4 # h4*r0
-+ vpaddq $T4,$D4,$D4 # d4 += h4*r0
-+
-+ vpmuludq $H3,$T2,$T0 # h3*r1
-+ vpaddq $T0,$D4,$D4 # d4 += h3*r1
-+ vpshufd \$0x32,`16*2-64`($ctx),$T3 # s1
-+ vpmuludq $H2,$T2,$T1 # h2*r1
-+ vpaddq $T1,$D3,$D3 # d3 += h2*r1
-+ vpshufd \$0x32,`16*3-64`($ctx),$T4 # r2
-+ vpmuludq $H1,$T2,$T0 # h1*r1
-+ vpaddq $T0,$D2,$D2 # d2 += h1*r1
-+ vpmuludq $H0,$T2,$T2 # h0*r1
-+ vpaddq $T2,$D1,$D1 # d1 += h0*r1
-+ vpmuludq $H4,$T3,$T3 # h4*s1
-+ vpaddq $T3,$D0,$D0 # d0 += h4*s1
-+
-+ vpshufd \$0x32,`16*4-64`($ctx),$T2 # s2
-+ vpmuludq $H2,$T4,$T1 # h2*r2
-+ vpaddq $T1,$D4,$D4 # d4 += h2*r2
-+ vpmuludq $H1,$T4,$T0 # h1*r2
-+ vpaddq $T0,$D3,$D3 # d3 += h1*r2
-+ vpshufd \$0x32,`16*5-64`($ctx),$T3 # r3
-+ vpmuludq $H0,$T4,$T4 # h0*r2
-+ vpaddq $T4,$D2,$D2 # d2 += h0*r2
-+ vpmuludq $H4,$T2,$T1 # h4*s2
-+ vpaddq $T1,$D1,$D1 # d1 += h4*s2
-+ vpshufd \$0x32,`16*6-64`($ctx),$T4 # s3
-+ vpmuludq $H3,$T2,$T2 # h3*s2
-+ vpaddq $T2,$D0,$D0 # d0 += h3*s2
-+
-+ vpmuludq $H1,$T3,$T0 # h1*r3
-+ vpaddq $T0,$D4,$D4 # d4 += h1*r3
-+ vpmuludq $H0,$T3,$T3 # h0*r3
-+ vpaddq $T3,$D3,$D3 # d3 += h0*r3
-+ vpshufd \$0x32,`16*7-64`($ctx),$T2 # r4
-+ vpmuludq $H4,$T4,$T1 # h4*s3
-+ vpaddq $T1,$D2,$D2 # d2 += h4*s3
-+ vpshufd \$0x32,`16*8-64`($ctx),$T3 # s4
-+ vpmuludq $H3,$T4,$T0 # h3*s3
-+ vpaddq $T0,$D1,$D1 # d1 += h3*s3
-+ vpmuludq $H2,$T4,$T4 # h2*s3
-+ vpaddq $T4,$D0,$D0 # d0 += h2*s3
-+
-+ vpmuludq $H0,$T2,$T2 # h0*r4
-+ vpaddq $T2,$D4,$D4 # d4 += h0*r4
-+ vpmuludq $H4,$T3,$T1 # h4*s4
-+ vpaddq $T1,$D3,$D3 # d3 += h4*s4
-+ vpmuludq $H3,$T3,$T0 # h3*s4
-+ vpaddq $T0,$D2,$D2 # d2 += h3*s4
-+ vpmuludq $H2,$T3,$T1 # h2*s4
-+ vpaddq $T1,$D1,$D1 # d1 += h2*s4
-+ vpmuludq $H1,$T3,$T3 # h1*s4
-+ vpaddq $T3,$D0,$D0 # d0 += h1*s4
-+
-+.Lshort_tail_avx:
-+ ################################################################
-+ # horizontal addition
-+
-+ vpsrldq \$8,$D4,$T4
-+ vpsrldq \$8,$D3,$T3
-+ vpsrldq \$8,$D1,$T1
-+ vpsrldq \$8,$D0,$T0
-+ vpsrldq \$8,$D2,$T2
-+ vpaddq $T3,$D3,$D3
-+ vpaddq $T4,$D4,$D4
-+ vpaddq $T0,$D0,$D0
-+ vpaddq $T1,$D1,$D1
-+ vpaddq $T2,$D2,$D2
-+
-+ ################################################################
-+ # lazy reduction
-+
-+ vpsrlq \$26,$D3,$H3
-+ vpand $MASK,$D3,$D3
-+ vpaddq $H3,$D4,$D4 # h3 -> h4
-+
-+ vpsrlq \$26,$D0,$H0
-+ vpand $MASK,$D0,$D0
-+ vpaddq $H0,$D1,$D1 # h0 -> h1
-+
-+ vpsrlq \$26,$D4,$H4
-+ vpand $MASK,$D4,$D4
-+
-+ vpsrlq \$26,$D1,$H1
-+ vpand $MASK,$D1,$D1
-+ vpaddq $H1,$D2,$D2 # h1 -> h2
-+
-+ vpaddq $H4,$D0,$D0
-+ vpsllq \$2,$H4,$H4
-+ vpaddq $H4,$D0,$D0 # h4 -> h0
-+
-+ vpsrlq \$26,$D2,$H2
-+ vpand $MASK,$D2,$D2
-+ vpaddq $H2,$D3,$D3 # h2 -> h3
-+
-+ vpsrlq \$26,$D0,$H0
-+ vpand $MASK,$D0,$D0
-+ vpaddq $H0,$D1,$D1 # h0 -> h1
-+
-+ vpsrlq \$26,$D3,$H3
-+ vpand $MASK,$D3,$D3
-+ vpaddq $H3,$D4,$D4 # h3 -> h4
-+
-+ vmovd $D0,`4*0-48-64`($ctx) # save partially reduced
-+ vmovd $D1,`4*1-48-64`($ctx)
-+ vmovd $D2,`4*2-48-64`($ctx)
-+ vmovd $D3,`4*3-48-64`($ctx)
-+ vmovd $D4,`4*4-48-64`($ctx)
-+___
-+$code.=<<___ if ($win64);
-+ vmovdqa 0x50(%r11),%xmm6
-+ vmovdqa 0x60(%r11),%xmm7
-+ vmovdqa 0x70(%r11),%xmm8
-+ vmovdqa 0x80(%r11),%xmm9
-+ vmovdqa 0x90(%r11),%xmm10
-+ vmovdqa 0xa0(%r11),%xmm11
-+ vmovdqa 0xb0(%r11),%xmm12
-+ vmovdqa 0xc0(%r11),%xmm13
-+ vmovdqa 0xd0(%r11),%xmm14
-+ vmovdqa 0xe0(%r11),%xmm15
-+ lea 0xf8(%r11),%rsp
-+.Ldo_avx_epilogue:
-+___
-+$code.=<<___ if (!$win64);
-+ lea 0x58(%r11),%rsp
-+.cfi_def_cfa %rsp,8
-+___
-+$code.=<<___;
-+ vzeroupper
-+ ret
-+.cfi_endproc
-+.size poly1305_blocks_avx,.-poly1305_blocks_avx
-+
-+.type poly1305_emit_avx,\@function,3
-+.align 32
-+poly1305_emit_avx:
-+ cmpl \$0,20($ctx) # is_base2_26?
-+ je .Lemit
-+
-+ mov 0($ctx),%eax # load hash value base 2^26
-+ mov 4($ctx),%ecx
-+ mov 8($ctx),%r8d
-+ mov 12($ctx),%r11d
-+ mov 16($ctx),%r10d
-+
-+ shl \$26,%rcx # base 2^26 -> base 2^64
-+ mov %r8,%r9
-+ shl \$52,%r8
-+ add %rcx,%rax
-+ shr \$12,%r9
-+ add %rax,%r8 # h0
-+ adc \$0,%r9
-+
-+ shl \$14,%r11
-+ mov %r10,%rax
-+ shr \$24,%r10
-+ add %r11,%r9
-+ shl \$40,%rax
-+ add %rax,%r9 # h1
-+ adc \$0,%r10 # h2
-+
-+ mov %r10,%rax # could be partially reduced, so reduce
-+ mov %r10,%rcx
-+ and \$3,%r10
-+ shr \$2,%rax
-+ and \$-4,%rcx
-+ add %rcx,%rax
-+ add %rax,%r8
-+ adc \$0,%r9
-+ adc \$0,%r10
-+
-+ mov %r8,%rax
-+ add \$5,%r8 # compare to modulus
-+ mov %r9,%rcx
-+ adc \$0,%r9
-+ adc \$0,%r10
-+ shr \$2,%r10 # did 130-bit value overflow?
-+ cmovnz %r8,%rax
-+ cmovnz %r9,%rcx
-+
-+ add 0($nonce),%rax # accumulate nonce
-+ adc 8($nonce),%rcx
-+ mov %rax,0($mac) # write result
-+ mov %rcx,8($mac)
-+
-+ ret
-+.size poly1305_emit_avx,.-poly1305_emit_avx
-+___
-+
-+if ($avx>1) {
-+my ($H0,$H1,$H2,$H3,$H4, $MASK, $T4,$T0,$T1,$T2,$T3, $D0,$D1,$D2,$D3,$D4) =
-+ map("%ymm$_",(0..15));
-+my $S4=$MASK;
-+
-+$code.=<<___;
-+.type poly1305_blocks_avx2,\@function,4
-+.align 32
-+poly1305_blocks_avx2:
-+.cfi_startproc
-+ mov 20($ctx),%r8d # is_base2_26
-+ cmp \$128,$len
-+ jae .Lblocks_avx2
-+ test %r8d,%r8d
-+ jz .Lblocks
-+
-+.Lblocks_avx2:
-+ and \$-16,$len
-+ jz .Lno_data_avx2
-+
-+ vzeroupper
-+
-+ test %r8d,%r8d
-+ jz .Lbase2_64_avx2
-+
-+ test \$63,$len
-+ jz .Leven_avx2
-+
-+ push %rbx
-+.cfi_push %rbx
-+ push %rbp
-+.cfi_push %rbp
-+ push %r12
-+.cfi_push %r12
-+ push %r13
-+.cfi_push %r13
-+ push %r14
-+.cfi_push %r14
-+ push %r15
-+.cfi_push %r15
-+.Lblocks_avx2_body:
-+
-+ mov $len,%r15 # reassign $len
-+
-+ mov 0($ctx),$d1 # load hash value
-+ mov 8($ctx),$d2
-+ mov 16($ctx),$h2#d
-+
-+ mov 24($ctx),$r0 # load r
-+ mov 32($ctx),$s1
-+
-+ ################################# base 2^26 -> base 2^64
-+ mov $d1#d,$h0#d
-+ and \$`-1*(1<<31)`,$d1
-+ mov $d2,$r1 # borrow $r1
-+ mov $d2#d,$h1#d
-+ and \$`-1*(1<<31)`,$d2
-+
-+ shr \$6,$d1
-+ shl \$52,$r1
-+ add $d1,$h0
-+ shr \$12,$h1
-+ shr \$18,$d2
-+ add $r1,$h0
-+ adc $d2,$h1
-+
-+ mov $h2,$d1
-+ shl \$40,$d1
-+ shr \$24,$h2
-+ add $d1,$h1
-+ adc \$0,$h2 # can be partially reduced...
-+
-+ mov \$-4,$d2 # ... so reduce
-+ mov $h2,$d1
-+ and $h2,$d2
-+ shr \$2,$d1
-+ and \$3,$h2
-+ add $d2,$d1 # =*5
-+ add $d1,$h0
-+ adc \$0,$h1
-+ adc \$0,$h2
-+
-+ mov $s1,$r1
-+ mov $s1,%rax
-+ shr \$2,$s1
-+ add $r1,$s1 # s1 = r1 + (r1 >> 2)
-+
-+.Lbase2_26_pre_avx2:
-+ add 0($inp),$h0 # accumulate input
-+ adc 8($inp),$h1
-+ lea 16($inp),$inp
-+ adc $padbit,$h2
-+ sub \$16,%r15
-+
-+ call __poly1305_block
-+ mov $r1,%rax
-+
-+ test \$63,%r15
-+ jnz .Lbase2_26_pre_avx2
-+
-+ test $padbit,$padbit # if $padbit is zero,
-+ jz .Lstore_base2_64_avx2 # store hash in base 2^64 format
-+
-+ ################################# base 2^64 -> base 2^26
-+ mov $h0,%rax
-+ mov $h0,%rdx
-+ shr \$52,$h0
-+ mov $h1,$r0
-+ mov $h1,$r1
-+ shr \$26,%rdx
-+ and \$0x3ffffff,%rax # h[0]
-+ shl \$12,$r0
-+ and \$0x3ffffff,%rdx # h[1]
-+ shr \$14,$h1
-+ or $r0,$h0
-+ shl \$24,$h2
-+ and \$0x3ffffff,$h0 # h[2]
-+ shr \$40,$r1
-+ and \$0x3ffffff,$h1 # h[3]
-+ or $r1,$h2 # h[4]
-+
-+ test %r15,%r15
-+ jz .Lstore_base2_26_avx2
-+
-+ vmovd %rax#d,%x#$H0
-+ vmovd %rdx#d,%x#$H1
-+ vmovd $h0#d,%x#$H2
-+ vmovd $h1#d,%x#$H3
-+ vmovd $h2#d,%x#$H4
-+ jmp .Lproceed_avx2
-+
-+.align 32
-+.Lstore_base2_64_avx2:
-+ mov $h0,0($ctx)
-+ mov $h1,8($ctx)
-+ mov $h2,16($ctx) # note that is_base2_26 is zeroed
-+ jmp .Ldone_avx2
-+
-+.align 16
-+.Lstore_base2_26_avx2:
-+ mov %rax#d,0($ctx) # store hash value base 2^26
-+ mov %rdx#d,4($ctx)
-+ mov $h0#d,8($ctx)
-+ mov $h1#d,12($ctx)
-+ mov $h2#d,16($ctx)
-+.align 16
-+.Ldone_avx2:
-+ mov 0(%rsp),%r15
-+.cfi_restore %r15
-+ mov 8(%rsp),%r14
-+.cfi_restore %r14
-+ mov 16(%rsp),%r13
-+.cfi_restore %r13
-+ mov 24(%rsp),%r12
-+.cfi_restore %r12
-+ mov 32(%rsp),%rbp
-+.cfi_restore %rbp
-+ mov 40(%rsp),%rbx
-+.cfi_restore %rbx
-+ lea 48(%rsp),%rsp
-+.cfi_adjust_cfa_offset -48
-+.Lno_data_avx2:
-+.Lblocks_avx2_epilogue:
-+ ret
-+.cfi_endproc
-+
-+.align 32
-+.Lbase2_64_avx2:
-+.cfi_startproc
-+ push %rbx
-+.cfi_push %rbx
-+ push %rbp
-+.cfi_push %rbp
-+ push %r12
-+.cfi_push %r12
-+ push %r13
-+.cfi_push %r13
-+ push %r14
-+.cfi_push %r14
-+ push %r15
-+.cfi_push %r15
-+.Lbase2_64_avx2_body:
-+
-+ mov $len,%r15 # reassign $len
-+
-+ mov 24($ctx),$r0 # load r
-+ mov 32($ctx),$s1
-+
-+ mov 0($ctx),$h0 # load hash value
-+ mov 8($ctx),$h1
-+ mov 16($ctx),$h2#d
-+
-+ mov $s1,$r1
-+ mov $s1,%rax
-+ shr \$2,$s1
-+ add $r1,$s1 # s1 = r1 + (r1 >> 2)
-+
-+ test \$63,$len
-+ jz .Linit_avx2
-+
-+.Lbase2_64_pre_avx2:
-+ add 0($inp),$h0 # accumulate input
-+ adc 8($inp),$h1
-+ lea 16($inp),$inp
-+ adc $padbit,$h2
-+ sub \$16,%r15
-+
-+ call __poly1305_block
-+ mov $r1,%rax
-+
-+ test \$63,%r15
-+ jnz .Lbase2_64_pre_avx2
-+
-+.Linit_avx2:
-+ ################################# base 2^64 -> base 2^26
-+ mov $h0,%rax
-+ mov $h0,%rdx
-+ shr \$52,$h0
-+ mov $h1,$d1
-+ mov $h1,$d2
-+ shr \$26,%rdx
-+ and \$0x3ffffff,%rax # h[0]
-+ shl \$12,$d1
-+ and \$0x3ffffff,%rdx # h[1]
-+ shr \$14,$h1
-+ or $d1,$h0
-+ shl \$24,$h2
-+ and \$0x3ffffff,$h0 # h[2]
-+ shr \$40,$d2
-+ and \$0x3ffffff,$h1 # h[3]
-+ or $d2,$h2 # h[4]
-+
-+ vmovd %rax#d,%x#$H0
-+ vmovd %rdx#d,%x#$H1
-+ vmovd $h0#d,%x#$H2
-+ vmovd $h1#d,%x#$H3
-+ vmovd $h2#d,%x#$H4
-+ movl \$1,20($ctx) # set is_base2_26
-+
-+ call __poly1305_init_avx
-+
-+.Lproceed_avx2:
-+ mov %r15,$len # restore $len
-+ mov OPENSSL_ia32cap_P+8(%rip),%r10d
-+ mov \$`(1<<31|1<<30|1<<16)`,%r11d
-+
-+ mov 0(%rsp),%r15
-+.cfi_restore %r15
-+ mov 8(%rsp),%r14
-+.cfi_restore %r14
-+ mov 16(%rsp),%r13
-+.cfi_restore %r13
-+ mov 24(%rsp),%r12
-+.cfi_restore %r12
-+ mov 32(%rsp),%rbp
-+.cfi_restore %rbp
-+ mov 40(%rsp),%rbx
-+.cfi_restore %rbx
-+ lea 48(%rsp),%rax
-+ lea 48(%rsp),%rsp
-+.cfi_adjust_cfa_offset -48
-+.Lbase2_64_avx2_epilogue:
-+ jmp .Ldo_avx2
-+.cfi_endproc
-+
-+.align 32
-+.Leven_avx2:
-+.cfi_startproc
-+ mov OPENSSL_ia32cap_P+8(%rip),%r10d
-+ vmovd 4*0($ctx),%x#$H0 # load hash value base 2^26
-+ vmovd 4*1($ctx),%x#$H1
-+ vmovd 4*2($ctx),%x#$H2
-+ vmovd 4*3($ctx),%x#$H3
-+ vmovd 4*4($ctx),%x#$H4
-+
-+.Ldo_avx2:
-+___
-+$code.=<<___ if ($avx>2);
-+ cmp \$512,$len
-+ jb .Lskip_avx512
-+ and %r11d,%r10d
-+ test \$`1<<16`,%r10d # check for AVX512F
-+ jnz .Lblocks_avx512
-+.Lskip_avx512:
-+___
-+$code.=<<___ if (!$win64);
-+ lea -8(%rsp),%r11
-+.cfi_def_cfa %r11,16
-+ sub \$0x128,%rsp
-+___
-+$code.=<<___ if ($win64);
-+ lea -0xf8(%rsp),%r11
-+ sub \$0x1c8,%rsp
-+ vmovdqa %xmm6,0x50(%r11)
-+ vmovdqa %xmm7,0x60(%r11)
-+ vmovdqa %xmm8,0x70(%r11)
-+ vmovdqa %xmm9,0x80(%r11)
-+ vmovdqa %xmm10,0x90(%r11)
-+ vmovdqa %xmm11,0xa0(%r11)
-+ vmovdqa %xmm12,0xb0(%r11)
-+ vmovdqa %xmm13,0xc0(%r11)
-+ vmovdqa %xmm14,0xd0(%r11)
-+ vmovdqa %xmm15,0xe0(%r11)
-+.Ldo_avx2_body:
-+___
-+$code.=<<___;
-+ lea .Lconst(%rip),%rcx
-+ lea 48+64($ctx),$ctx # size optimization
-+ vmovdqa 96(%rcx),$T0 # .Lpermd_avx2
-+
-+ # expand and copy pre-calculated table to stack
-+ vmovdqu `16*0-64`($ctx),%x#$T2
-+ and \$-512,%rsp
-+ vmovdqu `16*1-64`($ctx),%x#$T3
-+ vmovdqu `16*2-64`($ctx),%x#$T4
-+ vmovdqu `16*3-64`($ctx),%x#$D0
-+ vmovdqu `16*4-64`($ctx),%x#$D1
-+ vmovdqu `16*5-64`($ctx),%x#$D2
-+ lea 0x90(%rsp),%rax # size optimization
-+ vmovdqu `16*6-64`($ctx),%x#$D3
-+ vpermd $T2,$T0,$T2 # 00003412 -> 14243444
-+ vmovdqu `16*7-64`($ctx),%x#$D4
-+ vpermd $T3,$T0,$T3
-+ vmovdqu `16*8-64`($ctx),%x#$MASK
-+ vpermd $T4,$T0,$T4
-+ vmovdqa $T2,0x00(%rsp)
-+ vpermd $D0,$T0,$D0
-+ vmovdqa $T3,0x20-0x90(%rax)
-+ vpermd $D1,$T0,$D1
-+ vmovdqa $T4,0x40-0x90(%rax)
-+ vpermd $D2,$T0,$D2
-+ vmovdqa $D0,0x60-0x90(%rax)
-+ vpermd $D3,$T0,$D3
-+ vmovdqa $D1,0x80-0x90(%rax)
-+ vpermd $D4,$T0,$D4
-+ vmovdqa $D2,0xa0-0x90(%rax)
-+ vpermd $MASK,$T0,$MASK
-+ vmovdqa $D3,0xc0-0x90(%rax)
-+ vmovdqa $D4,0xe0-0x90(%rax)
-+ vmovdqa $MASK,0x100-0x90(%rax)
-+ vmovdqa 64(%rcx),$MASK # .Lmask26
-+
-+ ################################################################
-+ # load input
-+ vmovdqu 16*0($inp),%x#$T0
-+ vmovdqu 16*1($inp),%x#$T1
-+ vinserti128 \$1,16*2($inp),$T0,$T0
-+ vinserti128 \$1,16*3($inp),$T1,$T1
-+ lea 16*4($inp),$inp
-+
-+ vpsrldq \$6,$T0,$T2 # splat input
-+ vpsrldq \$6,$T1,$T3
-+ vpunpckhqdq $T1,$T0,$T4 # 4
-+ vpunpcklqdq $T3,$T2,$T2 # 2:3
-+ vpunpcklqdq $T1,$T0,$T0 # 0:1
-+
-+ vpsrlq \$30,$T2,$T3
-+ vpsrlq \$4,$T2,$T2
-+ vpsrlq \$26,$T0,$T1
-+ vpsrlq \$40,$T4,$T4 # 4
-+ vpand $MASK,$T2,$T2 # 2
-+ vpand $MASK,$T0,$T0 # 0
-+ vpand $MASK,$T1,$T1 # 1
-+ vpand $MASK,$T3,$T3 # 3
-+ vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-+
-+ vpaddq $H2,$T2,$H2 # accumulate input
-+ sub \$64,$len
-+ jz .Ltail_avx2
-+ jmp .Loop_avx2
-+
-+.align 32
-+.Loop_avx2:
-+ ################################################################
-+ # ((inp[0]*r^4+inp[4])*r^4+inp[ 8])*r^4
-+ # ((inp[1]*r^4+inp[5])*r^4+inp[ 9])*r^3
-+ # ((inp[2]*r^4+inp[6])*r^4+inp[10])*r^2
-+ # ((inp[3]*r^4+inp[7])*r^4+inp[11])*r^1
-+ # \________/\__________/
-+ ################################################################
-+ #vpaddq $H2,$T2,$H2 # accumulate input
-+ vpaddq $H0,$T0,$H0
-+ vmovdqa `32*0`(%rsp),$T0 # r0^4
-+ vpaddq $H1,$T1,$H1
-+ vmovdqa `32*1`(%rsp),$T1 # r1^4
-+ vpaddq $H3,$T3,$H3
-+ vmovdqa `32*3`(%rsp),$T2 # r2^4
-+ vpaddq $H4,$T4,$H4
-+ vmovdqa `32*6-0x90`(%rax),$T3 # s3^4
-+ vmovdqa `32*8-0x90`(%rax),$S4 # s4^4
-+
-+ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+ #
-+ # however, as h2 is "chronologically" first one available pull
-+ # corresponding operations up, so it's
-+ #
-+ # d4 = h2*r2 + h4*r0 + h3*r1 + h1*r3 + h0*r4
-+ # d3 = h2*r1 + h3*r0 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h2*5*r4 + h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3
-+ # d0 = h2*5*r3 + h0*r0 + h4*5*r1 + h3*5*r2 + h1*5*r4
-+
-+ vpmuludq $H2,$T0,$D2 # d2 = h2*r0
-+ vpmuludq $H2,$T1,$D3 # d3 = h2*r1
-+ vpmuludq $H2,$T2,$D4 # d4 = h2*r2
-+ vpmuludq $H2,$T3,$D0 # d0 = h2*s3
-+ vpmuludq $H2,$S4,$D1 # d1 = h2*s4
-+
-+ vpmuludq $H0,$T1,$T4 # h0*r1
-+ vpmuludq $H1,$T1,$H2 # h1*r1, borrow $H2 as temp
-+ vpaddq $T4,$D1,$D1 # d1 += h0*r1
-+ vpaddq $H2,$D2,$D2 # d2 += h1*r1
-+ vpmuludq $H3,$T1,$T4 # h3*r1
-+ vpmuludq `32*2`(%rsp),$H4,$H2 # h4*s1
-+ vpaddq $T4,$D4,$D4 # d4 += h3*r1
-+ vpaddq $H2,$D0,$D0 # d0 += h4*s1
-+ vmovdqa `32*4-0x90`(%rax),$T1 # s2
-+
-+ vpmuludq $H0,$T0,$T4 # h0*r0
-+ vpmuludq $H1,$T0,$H2 # h1*r0
-+ vpaddq $T4,$D0,$D0 # d0 += h0*r0
-+ vpaddq $H2,$D1,$D1 # d1 += h1*r0
-+ vpmuludq $H3,$T0,$T4 # h3*r0
-+ vpmuludq $H4,$T0,$H2 # h4*r0
-+ vmovdqu 16*0($inp),%x#$T0 # load input
-+ vpaddq $T4,$D3,$D3 # d3 += h3*r0
-+ vpaddq $H2,$D4,$D4 # d4 += h4*r0
-+ vinserti128 \$1,16*2($inp),$T0,$T0
-+
-+ vpmuludq $H3,$T1,$T4 # h3*s2
-+ vpmuludq $H4,$T1,$H2 # h4*s2
-+ vmovdqu 16*1($inp),%x#$T1
-+ vpaddq $T4,$D0,$D0 # d0 += h3*s2
-+ vpaddq $H2,$D1,$D1 # d1 += h4*s2
-+ vmovdqa `32*5-0x90`(%rax),$H2 # r3
-+ vpmuludq $H1,$T2,$T4 # h1*r2
-+ vpmuludq $H0,$T2,$T2 # h0*r2
-+ vpaddq $T4,$D3,$D3 # d3 += h1*r2
-+ vpaddq $T2,$D2,$D2 # d2 += h0*r2
-+ vinserti128 \$1,16*3($inp),$T1,$T1
-+ lea 16*4($inp),$inp
-+
-+ vpmuludq $H1,$H2,$T4 # h1*r3
-+ vpmuludq $H0,$H2,$H2 # h0*r3
-+ vpsrldq \$6,$T0,$T2 # splat input
-+ vpaddq $T4,$D4,$D4 # d4 += h1*r3
-+ vpaddq $H2,$D3,$D3 # d3 += h0*r3
-+ vpmuludq $H3,$T3,$T4 # h3*s3
-+ vpmuludq $H4,$T3,$H2 # h4*s3
-+ vpsrldq \$6,$T1,$T3
-+ vpaddq $T4,$D1,$D1 # d1 += h3*s3
-+ vpaddq $H2,$D2,$D2 # d2 += h4*s3
-+ vpunpckhqdq $T1,$T0,$T4 # 4
-+
-+ vpmuludq $H3,$S4,$H3 # h3*s4
-+ vpmuludq $H4,$S4,$H4 # h4*s4
-+ vpunpcklqdq $T1,$T0,$T0 # 0:1
-+ vpaddq $H3,$D2,$H2 # h2 = d2 + h3*r4
-+ vpaddq $H4,$D3,$H3 # h3 = d3 + h4*r4
-+ vpunpcklqdq $T3,$T2,$T3 # 2:3
-+ vpmuludq `32*7-0x90`(%rax),$H0,$H4 # h0*r4
-+ vpmuludq $H1,$S4,$H0 # h1*s4
-+ vmovdqa 64(%rcx),$MASK # .Lmask26
-+ vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4
-+ vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4
-+
-+ ################################################################
-+ # lazy reduction (interleaved with tail of input splat)
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$D1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H4,$D4
-+ vpand $MASK,$H4,$H4
-+
-+ vpsrlq \$4,$T3,$T2
-+
-+ vpsrlq \$26,$H1,$D1
-+ vpand $MASK,$H1,$H1
-+ vpaddq $D1,$H2,$H2 # h1 -> h2
-+
-+ vpaddq $D4,$H0,$H0
-+ vpsllq \$2,$D4,$D4
-+ vpaddq $D4,$H0,$H0 # h4 -> h0
-+
-+ vpand $MASK,$T2,$T2 # 2
-+ vpsrlq \$26,$T0,$T1
-+
-+ vpsrlq \$26,$H2,$D2
-+ vpand $MASK,$H2,$H2
-+ vpaddq $D2,$H3,$H3 # h2 -> h3
-+
-+ vpaddq $T2,$H2,$H2 # modulo-scheduled
-+ vpsrlq \$30,$T3,$T3
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$40,$T4,$T4 # 4
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpand $MASK,$T0,$T0 # 0
-+ vpand $MASK,$T1,$T1 # 1
-+ vpand $MASK,$T3,$T3 # 3
-+ vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-+
-+ sub \$64,$len
-+ jnz .Loop_avx2
-+
-+ .byte 0x66,0x90
-+.Ltail_avx2:
-+ ################################################################
-+ # while above multiplications were by r^4 in all lanes, in last
-+ # iteration we multiply least significant lane by r^4 and most
-+ # significant one by r, so copy of above except that references
-+ # to the precomputed table are displaced by 4...
-+
-+ #vpaddq $H2,$T2,$H2 # accumulate input
-+ vpaddq $H0,$T0,$H0
-+ vmovdqu `32*0+4`(%rsp),$T0 # r0^4
-+ vpaddq $H1,$T1,$H1
-+ vmovdqu `32*1+4`(%rsp),$T1 # r1^4
-+ vpaddq $H3,$T3,$H3
-+ vmovdqu `32*3+4`(%rsp),$T2 # r2^4
-+ vpaddq $H4,$T4,$H4
-+ vmovdqu `32*6+4-0x90`(%rax),$T3 # s3^4
-+ vmovdqu `32*8+4-0x90`(%rax),$S4 # s4^4
-+
-+ vpmuludq $H2,$T0,$D2 # d2 = h2*r0
-+ vpmuludq $H2,$T1,$D3 # d3 = h2*r1
-+ vpmuludq $H2,$T2,$D4 # d4 = h2*r2
-+ vpmuludq $H2,$T3,$D0 # d0 = h2*s3
-+ vpmuludq $H2,$S4,$D1 # d1 = h2*s4
-+
-+ vpmuludq $H0,$T1,$T4 # h0*r1
-+ vpmuludq $H1,$T1,$H2 # h1*r1
-+ vpaddq $T4,$D1,$D1 # d1 += h0*r1
-+ vpaddq $H2,$D2,$D2 # d2 += h1*r1
-+ vpmuludq $H3,$T1,$T4 # h3*r1
-+ vpmuludq `32*2+4`(%rsp),$H4,$H2 # h4*s1
-+ vpaddq $T4,$D4,$D4 # d4 += h3*r1
-+ vpaddq $H2,$D0,$D0 # d0 += h4*s1
-+
-+ vpmuludq $H0,$T0,$T4 # h0*r0
-+ vpmuludq $H1,$T0,$H2 # h1*r0
-+ vpaddq $T4,$D0,$D0 # d0 += h0*r0
-+ vmovdqu `32*4+4-0x90`(%rax),$T1 # s2
-+ vpaddq $H2,$D1,$D1 # d1 += h1*r0
-+ vpmuludq $H3,$T0,$T4 # h3*r0
-+ vpmuludq $H4,$T0,$H2 # h4*r0
-+ vpaddq $T4,$D3,$D3 # d3 += h3*r0
-+ vpaddq $H2,$D4,$D4 # d4 += h4*r0
-+
-+ vpmuludq $H3,$T1,$T4 # h3*s2
-+ vpmuludq $H4,$T1,$H2 # h4*s2
-+ vpaddq $T4,$D0,$D0 # d0 += h3*s2
-+ vpaddq $H2,$D1,$D1 # d1 += h4*s2
-+ vmovdqu `32*5+4-0x90`(%rax),$H2 # r3
-+ vpmuludq $H1,$T2,$T4 # h1*r2
-+ vpmuludq $H0,$T2,$T2 # h0*r2
-+ vpaddq $T4,$D3,$D3 # d3 += h1*r2
-+ vpaddq $T2,$D2,$D2 # d2 += h0*r2
-+
-+ vpmuludq $H1,$H2,$T4 # h1*r3
-+ vpmuludq $H0,$H2,$H2 # h0*r3
-+ vpaddq $T4,$D4,$D4 # d4 += h1*r3
-+ vpaddq $H2,$D3,$D3 # d3 += h0*r3
-+ vpmuludq $H3,$T3,$T4 # h3*s3
-+ vpmuludq $H4,$T3,$H2 # h4*s3
-+ vpaddq $T4,$D1,$D1 # d1 += h3*s3
-+ vpaddq $H2,$D2,$D2 # d2 += h4*s3
-+
-+ vpmuludq $H3,$S4,$H3 # h3*s4
-+ vpmuludq $H4,$S4,$H4 # h4*s4
-+ vpaddq $H3,$D2,$H2 # h2 = d2 + h3*r4
-+ vpaddq $H4,$D3,$H3 # h3 = d3 + h4*r4
-+ vpmuludq `32*7+4-0x90`(%rax),$H0,$H4 # h0*r4
-+ vpmuludq $H1,$S4,$H0 # h1*s4
-+ vmovdqa 64(%rcx),$MASK # .Lmask26
-+ vpaddq $H4,$D4,$H4 # h4 = d4 + h0*r4
-+ vpaddq $H0,$D0,$H0 # h0 = d0 + h1*s4
-+
-+ ################################################################
-+ # horizontal addition
-+
-+ vpsrldq \$8,$D1,$T1
-+ vpsrldq \$8,$H2,$T2
-+ vpsrldq \$8,$H3,$T3
-+ vpsrldq \$8,$H4,$T4
-+ vpsrldq \$8,$H0,$T0
-+ vpaddq $T1,$D1,$D1
-+ vpaddq $T2,$H2,$H2
-+ vpaddq $T3,$H3,$H3
-+ vpaddq $T4,$H4,$H4
-+ vpaddq $T0,$H0,$H0
-+
-+ vpermq \$0x2,$H3,$T3
-+ vpermq \$0x2,$H4,$T4
-+ vpermq \$0x2,$H0,$T0
-+ vpermq \$0x2,$D1,$T1
-+ vpermq \$0x2,$H2,$T2
-+ vpaddq $T3,$H3,$H3
-+ vpaddq $T4,$H4,$H4
-+ vpaddq $T0,$H0,$H0
-+ vpaddq $T1,$D1,$D1
-+ vpaddq $T2,$H2,$H2
-+
-+ ################################################################
-+ # lazy reduction
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$D1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H4,$D4
-+ vpand $MASK,$H4,$H4
-+
-+ vpsrlq \$26,$H1,$D1
-+ vpand $MASK,$H1,$H1
-+ vpaddq $D1,$H2,$H2 # h1 -> h2
-+
-+ vpaddq $D4,$H0,$H0
-+ vpsllq \$2,$D4,$D4
-+ vpaddq $D4,$H0,$H0 # h4 -> h0
-+
-+ vpsrlq \$26,$H2,$D2
-+ vpand $MASK,$H2,$H2
-+ vpaddq $D2,$H3,$H3 # h2 -> h3
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vmovd %x#$H0,`4*0-48-64`($ctx)# save partially reduced
-+ vmovd %x#$H1,`4*1-48-64`($ctx)
-+ vmovd %x#$H2,`4*2-48-64`($ctx)
-+ vmovd %x#$H3,`4*3-48-64`($ctx)
-+ vmovd %x#$H4,`4*4-48-64`($ctx)
-+___
-+$code.=<<___ if ($win64);
-+ vmovdqa 0x50(%r11),%xmm6
-+ vmovdqa 0x60(%r11),%xmm7
-+ vmovdqa 0x70(%r11),%xmm8
-+ vmovdqa 0x80(%r11),%xmm9
-+ vmovdqa 0x90(%r11),%xmm10
-+ vmovdqa 0xa0(%r11),%xmm11
-+ vmovdqa 0xb0(%r11),%xmm12
-+ vmovdqa 0xc0(%r11),%xmm13
-+ vmovdqa 0xd0(%r11),%xmm14
-+ vmovdqa 0xe0(%r11),%xmm15
-+ lea 0xf8(%r11),%rsp
-+.Ldo_avx2_epilogue:
-+___
-+$code.=<<___ if (!$win64);
-+ lea 8(%r11),%rsp
-+.cfi_def_cfa %rsp,8
-+___
-+$code.=<<___;
-+ vzeroupper
-+ ret
-+.cfi_endproc
-+.size poly1305_blocks_avx2,.-poly1305_blocks_avx2
-+___
-+#######################################################################
-+if ($avx>2) {
-+# On entry we have input length divisible by 64. But since inner loop
-+# processes 128 bytes per iteration, cases when length is not divisible
-+# by 128 are handled by passing tail 64 bytes to .Ltail_avx2. For this
-+# reason stack layout is kept identical to poly1305_blocks_avx2. If not
-+# for this tail, we wouldn't have to even allocate stack frame...
-+
-+my ($R0,$R1,$R2,$R3,$R4, $S1,$S2,$S3,$S4) = map("%zmm$_",(16..24));
-+my ($M0,$M1,$M2,$M3,$M4) = map("%zmm$_",(25..29));
-+my $PADBIT="%zmm30";
-+
-+map(s/%y/%z/,($T4,$T0,$T1,$T2,$T3)); # switch to %zmm domain
-+map(s/%y/%z/,($D0,$D1,$D2,$D3,$D4));
-+map(s/%y/%z/,($H0,$H1,$H2,$H3,$H4));
-+map(s/%y/%z/,($MASK));
-+
-+$code.=<<___;
-+.type poly1305_blocks_avx512,\@function,4
-+.align 32
-+poly1305_blocks_avx512:
-+.cfi_startproc
-+.Lblocks_avx512:
-+ mov \$15,%eax
-+ kmovw %eax,%k2
-+___
-+$code.=<<___ if (!$win64);
-+ lea -8(%rsp),%r11
-+.cfi_def_cfa %r11,16
-+ sub \$0x128,%rsp
-+___
-+$code.=<<___ if ($win64);
-+ lea -0xf8(%rsp),%r11
-+ sub \$0x1c8,%rsp
-+ vmovdqa %xmm6,0x50(%r11)
-+ vmovdqa %xmm7,0x60(%r11)
-+ vmovdqa %xmm8,0x70(%r11)
-+ vmovdqa %xmm9,0x80(%r11)
-+ vmovdqa %xmm10,0x90(%r11)
-+ vmovdqa %xmm11,0xa0(%r11)
-+ vmovdqa %xmm12,0xb0(%r11)
-+ vmovdqa %xmm13,0xc0(%r11)
-+ vmovdqa %xmm14,0xd0(%r11)
-+ vmovdqa %xmm15,0xe0(%r11)
-+.Ldo_avx512_body:
-+___
-+$code.=<<___;
-+ lea .Lconst(%rip),%rcx
-+ lea 48+64($ctx),$ctx # size optimization
-+ vmovdqa 96(%rcx),%y#$T2 # .Lpermd_avx2
-+
-+ # expand pre-calculated table
-+ vmovdqu `16*0-64`($ctx),%x#$D0 # will become expanded ${R0}
-+ and \$-512,%rsp
-+ vmovdqu `16*1-64`($ctx),%x#$D1 # will become ... ${R1}
-+ mov \$0x20,%rax
-+ vmovdqu `16*2-64`($ctx),%x#$T0 # ... ${S1}
-+ vmovdqu `16*3-64`($ctx),%x#$D2 # ... ${R2}
-+ vmovdqu `16*4-64`($ctx),%x#$T1 # ... ${S2}
-+ vmovdqu `16*5-64`($ctx),%x#$D3 # ... ${R3}
-+ vmovdqu `16*6-64`($ctx),%x#$T3 # ... ${S3}
-+ vmovdqu `16*7-64`($ctx),%x#$D4 # ... ${R4}
-+ vmovdqu `16*8-64`($ctx),%x#$T4 # ... ${S4}
-+ vpermd $D0,$T2,$R0 # 00003412 -> 14243444
-+ vpbroadcastq 64(%rcx),$MASK # .Lmask26
-+ vpermd $D1,$T2,$R1
-+ vpermd $T0,$T2,$S1
-+ vpermd $D2,$T2,$R2
-+ vmovdqa64 $R0,0x00(%rsp){%k2} # save in case $len%128 != 0
-+ vpsrlq \$32,$R0,$T0 # 14243444 -> 01020304
-+ vpermd $T1,$T2,$S2
-+ vmovdqu64 $R1,0x00(%rsp,%rax){%k2}
-+ vpsrlq \$32,$R1,$T1
-+ vpermd $D3,$T2,$R3
-+ vmovdqa64 $S1,0x40(%rsp){%k2}
-+ vpermd $T3,$T2,$S3
-+ vpermd $D4,$T2,$R4
-+ vmovdqu64 $R2,0x40(%rsp,%rax){%k2}
-+ vpermd $T4,$T2,$S4
-+ vmovdqa64 $S2,0x80(%rsp){%k2}
-+ vmovdqu64 $R3,0x80(%rsp,%rax){%k2}
-+ vmovdqa64 $S3,0xc0(%rsp){%k2}
-+ vmovdqu64 $R4,0xc0(%rsp,%rax){%k2}
-+ vmovdqa64 $S4,0x100(%rsp){%k2}
-+
-+ ################################################################
-+ # calculate 5th through 8th powers of the key
-+ #
-+ # d0 = r0'*r0 + r1'*5*r4 + r2'*5*r3 + r3'*5*r2 + r4'*5*r1
-+ # d1 = r0'*r1 + r1'*r0 + r2'*5*r4 + r3'*5*r3 + r4'*5*r2
-+ # d2 = r0'*r2 + r1'*r1 + r2'*r0 + r3'*5*r4 + r4'*5*r3
-+ # d3 = r0'*r3 + r1'*r2 + r2'*r1 + r3'*r0 + r4'*5*r4
-+ # d4 = r0'*r4 + r1'*r3 + r2'*r2 + r3'*r1 + r4'*r0
-+
-+ vpmuludq $T0,$R0,$D0 # d0 = r0'*r0
-+ vpmuludq $T0,$R1,$D1 # d1 = r0'*r1
-+ vpmuludq $T0,$R2,$D2 # d2 = r0'*r2
-+ vpmuludq $T0,$R3,$D3 # d3 = r0'*r3
-+ vpmuludq $T0,$R4,$D4 # d4 = r0'*r4
-+ vpsrlq \$32,$R2,$T2
-+
-+ vpmuludq $T1,$S4,$M0
-+ vpmuludq $T1,$R0,$M1
-+ vpmuludq $T1,$R1,$M2
-+ vpmuludq $T1,$R2,$M3
-+ vpmuludq $T1,$R3,$M4
-+ vpsrlq \$32,$R3,$T3
-+ vpaddq $M0,$D0,$D0 # d0 += r1'*5*r4
-+ vpaddq $M1,$D1,$D1 # d1 += r1'*r0
-+ vpaddq $M2,$D2,$D2 # d2 += r1'*r1
-+ vpaddq $M3,$D3,$D3 # d3 += r1'*r2
-+ vpaddq $M4,$D4,$D4 # d4 += r1'*r3
-+
-+ vpmuludq $T2,$S3,$M0
-+ vpmuludq $T2,$S4,$M1
-+ vpmuludq $T2,$R1,$M3
-+ vpmuludq $T2,$R2,$M4
-+ vpmuludq $T2,$R0,$M2
-+ vpsrlq \$32,$R4,$T4
-+ vpaddq $M0,$D0,$D0 # d0 += r2'*5*r3
-+ vpaddq $M1,$D1,$D1 # d1 += r2'*5*r4
-+ vpaddq $M3,$D3,$D3 # d3 += r2'*r1
-+ vpaddq $M4,$D4,$D4 # d4 += r2'*r2
-+ vpaddq $M2,$D2,$D2 # d2 += r2'*r0
-+
-+ vpmuludq $T3,$S2,$M0
-+ vpmuludq $T3,$R0,$M3
-+ vpmuludq $T3,$R1,$M4
-+ vpmuludq $T3,$S3,$M1
-+ vpmuludq $T3,$S4,$M2
-+ vpaddq $M0,$D0,$D0 # d0 += r3'*5*r2
-+ vpaddq $M3,$D3,$D3 # d3 += r3'*r0
-+ vpaddq $M4,$D4,$D4 # d4 += r3'*r1
-+ vpaddq $M1,$D1,$D1 # d1 += r3'*5*r3
-+ vpaddq $M2,$D2,$D2 # d2 += r3'*5*r4
-+
-+ vpmuludq $T4,$S4,$M3
-+ vpmuludq $T4,$R0,$M4
-+ vpmuludq $T4,$S1,$M0
-+ vpmuludq $T4,$S2,$M1
-+ vpmuludq $T4,$S3,$M2
-+ vpaddq $M3,$D3,$D3 # d3 += r2'*5*r4
-+ vpaddq $M4,$D4,$D4 # d4 += r2'*r0
-+ vpaddq $M0,$D0,$D0 # d0 += r2'*5*r1
-+ vpaddq $M1,$D1,$D1 # d1 += r2'*5*r2
-+ vpaddq $M2,$D2,$D2 # d2 += r2'*5*r3
-+
-+ ################################################################
-+ # load input
-+ vmovdqu64 16*0($inp),%z#$T3
-+ vmovdqu64 16*4($inp),%z#$T4
-+ lea 16*8($inp),$inp
-+
-+ ################################################################
-+ # lazy reduction
-+
-+ vpsrlq \$26,$D3,$M3
-+ vpandq $MASK,$D3,$D3
-+ vpaddq $M3,$D4,$D4 # d3 -> d4
-+
-+ vpsrlq \$26,$D0,$M0
-+ vpandq $MASK,$D0,$D0
-+ vpaddq $M0,$D1,$D1 # d0 -> d1
-+
-+ vpsrlq \$26,$D4,$M4
-+ vpandq $MASK,$D4,$D4
-+
-+ vpsrlq \$26,$D1,$M1
-+ vpandq $MASK,$D1,$D1
-+ vpaddq $M1,$D2,$D2 # d1 -> d2
-+
-+ vpaddq $M4,$D0,$D0
-+ vpsllq \$2,$M4,$M4
-+ vpaddq $M4,$D0,$D0 # d4 -> d0
-+
-+ vpsrlq \$26,$D2,$M2
-+ vpandq $MASK,$D2,$D2
-+ vpaddq $M2,$D3,$D3 # d2 -> d3
-+
-+ vpsrlq \$26,$D0,$M0
-+ vpandq $MASK,$D0,$D0
-+ vpaddq $M0,$D1,$D1 # d0 -> d1
-+
-+ vpsrlq \$26,$D3,$M3
-+ vpandq $MASK,$D3,$D3
-+ vpaddq $M3,$D4,$D4 # d3 -> d4
-+
-+ ################################################################
-+ # at this point we have 14243444 in $R0-$S4 and 05060708 in
-+ # $D0-$D4, ...
-+
-+ vpunpcklqdq $T4,$T3,$T0 # transpose input
-+ vpunpckhqdq $T4,$T3,$T4
-+
-+ # ... since input 64-bit lanes are ordered as 73625140, we could
-+ # "vperm" it to 76543210 (here and in each loop iteration), *or*
-+ # we could just flow along, hence the goal for $R0-$S4 is
-+ # 1858286838784888 ...
-+
-+ vmovdqa32 128(%rcx),$M0 # .Lpermd_avx512:
-+ mov \$0x7777,%eax
-+ kmovw %eax,%k1
-+
-+ vpermd $R0,$M0,$R0 # 14243444 -> 1---2---3---4---
-+ vpermd $R1,$M0,$R1
-+ vpermd $R2,$M0,$R2
-+ vpermd $R3,$M0,$R3
-+ vpermd $R4,$M0,$R4
-+
-+ vpermd $D0,$M0,${R0}{%k1} # 05060708 -> 1858286838784888
-+ vpermd $D1,$M0,${R1}{%k1}
-+ vpermd $D2,$M0,${R2}{%k1}
-+ vpermd $D3,$M0,${R3}{%k1}
-+ vpermd $D4,$M0,${R4}{%k1}
-+
-+ vpslld \$2,$R1,$S1 # *5
-+ vpslld \$2,$R2,$S2
-+ vpslld \$2,$R3,$S3
-+ vpslld \$2,$R4,$S4
-+ vpaddd $R1,$S1,$S1
-+ vpaddd $R2,$S2,$S2
-+ vpaddd $R3,$S3,$S3
-+ vpaddd $R4,$S4,$S4
-+
-+ vpbroadcastq 32(%rcx),$PADBIT # .L129
-+
-+ vpsrlq \$52,$T0,$T2 # splat input
-+ vpsllq \$12,$T4,$T3
-+ vporq $T3,$T2,$T2
-+ vpsrlq \$26,$T0,$T1
-+ vpsrlq \$14,$T4,$T3
-+ vpsrlq \$40,$T4,$T4 # 4
-+ vpandq $MASK,$T2,$T2 # 2
-+ vpandq $MASK,$T0,$T0 # 0
-+ #vpandq $MASK,$T1,$T1 # 1
-+ #vpandq $MASK,$T3,$T3 # 3
-+ #vporq $PADBIT,$T4,$T4 # padbit, yes, always
-+
-+ vpaddq $H2,$T2,$H2 # accumulate input
-+ sub \$192,$len
-+ jbe .Ltail_avx512
-+ jmp .Loop_avx512
-+
-+.align 32
-+.Loop_avx512:
-+ ################################################################
-+ # ((inp[0]*r^8+inp[ 8])*r^8+inp[16])*r^8
-+ # ((inp[1]*r^8+inp[ 9])*r^8+inp[17])*r^7
-+ # ((inp[2]*r^8+inp[10])*r^8+inp[18])*r^6
-+ # ((inp[3]*r^8+inp[11])*r^8+inp[19])*r^5
-+ # ((inp[4]*r^8+inp[12])*r^8+inp[20])*r^4
-+ # ((inp[5]*r^8+inp[13])*r^8+inp[21])*r^3
-+ # ((inp[6]*r^8+inp[14])*r^8+inp[22])*r^2
-+ # ((inp[7]*r^8+inp[15])*r^8+inp[23])*r^1
-+ # \________/\___________/
-+ ################################################################
-+ #vpaddq $H2,$T2,$H2 # accumulate input
-+
-+ # d4 = h4*r0 + h3*r1 + h2*r2 + h1*r3 + h0*r4
-+ # d3 = h3*r0 + h2*r1 + h1*r2 + h0*r3 + h4*5*r4
-+ # d2 = h2*r0 + h1*r1 + h0*r2 + h4*5*r3 + h3*5*r4
-+ # d1 = h1*r0 + h0*r1 + h4*5*r2 + h3*5*r3 + h2*5*r4
-+ # d0 = h0*r0 + h4*5*r1 + h3*5*r2 + h2*5*r3 + h1*5*r4
-+ #
-+ # however, as h2 is "chronologically" first one available pull
-+ # corresponding operations up, so it's
-+ #
-+ # d3 = h2*r1 + h0*r3 + h1*r2 + h3*r0 + h4*5*r4
-+ # d4 = h2*r2 + h0*r4 + h1*r3 + h3*r1 + h4*r0
-+ # d0 = h2*5*r3 + h0*r0 + h1*5*r4 + h3*5*r2 + h4*5*r1
-+ # d1 = h2*5*r4 + h0*r1 + h1*r0 + h3*5*r3 + h4*5*r2
-+ # d2 = h2*r0 + h0*r2 + h1*r1 + h3*5*r4 + h4*5*r3
-+
-+ vpmuludq $H2,$R1,$D3 # d3 = h2*r1
-+ vpaddq $H0,$T0,$H0
-+ vpmuludq $H2,$R2,$D4 # d4 = h2*r2
-+ vpandq $MASK,$T1,$T1 # 1
-+ vpmuludq $H2,$S3,$D0 # d0 = h2*s3
-+ vpandq $MASK,$T3,$T3 # 3
-+ vpmuludq $H2,$S4,$D1 # d1 = h2*s4
-+ vporq $PADBIT,$T4,$T4 # padbit, yes, always
-+ vpmuludq $H2,$R0,$D2 # d2 = h2*r0
-+ vpaddq $H1,$T1,$H1 # accumulate input
-+ vpaddq $H3,$T3,$H3
-+ vpaddq $H4,$T4,$H4
-+
-+ vmovdqu64 16*0($inp),$T3 # load input
-+ vmovdqu64 16*4($inp),$T4
-+ lea 16*8($inp),$inp
-+ vpmuludq $H0,$R3,$M3
-+ vpmuludq $H0,$R4,$M4
-+ vpmuludq $H0,$R0,$M0
-+ vpmuludq $H0,$R1,$M1
-+ vpaddq $M3,$D3,$D3 # d3 += h0*r3
-+ vpaddq $M4,$D4,$D4 # d4 += h0*r4
-+ vpaddq $M0,$D0,$D0 # d0 += h0*r0
-+ vpaddq $M1,$D1,$D1 # d1 += h0*r1
-+
-+ vpmuludq $H1,$R2,$M3
-+ vpmuludq $H1,$R3,$M4
-+ vpmuludq $H1,$S4,$M0
-+ vpmuludq $H0,$R2,$M2
-+ vpaddq $M3,$D3,$D3 # d3 += h1*r2
-+ vpaddq $M4,$D4,$D4 # d4 += h1*r3
-+ vpaddq $M0,$D0,$D0 # d0 += h1*s4
-+ vpaddq $M2,$D2,$D2 # d2 += h0*r2
-+
-+ vpunpcklqdq $T4,$T3,$T0 # transpose input
-+ vpunpckhqdq $T4,$T3,$T4
-+
-+ vpmuludq $H3,$R0,$M3
-+ vpmuludq $H3,$R1,$M4
-+ vpmuludq $H1,$R0,$M1
-+ vpmuludq $H1,$R1,$M2
-+ vpaddq $M3,$D3,$D3 # d3 += h3*r0
-+ vpaddq $M4,$D4,$D4 # d4 += h3*r1
-+ vpaddq $M1,$D1,$D1 # d1 += h1*r0
-+ vpaddq $M2,$D2,$D2 # d2 += h1*r1
-+
-+ vpmuludq $H4,$S4,$M3
-+ vpmuludq $H4,$R0,$M4
-+ vpmuludq $H3,$S2,$M0
-+ vpmuludq $H3,$S3,$M1
-+ vpaddq $M3,$D3,$D3 # d3 += h4*s4
-+ vpmuludq $H3,$S4,$M2
-+ vpaddq $M4,$D4,$D4 # d4 += h4*r0
-+ vpaddq $M0,$D0,$D0 # d0 += h3*s2
-+ vpaddq $M1,$D1,$D1 # d1 += h3*s3
-+ vpaddq $M2,$D2,$D2 # d2 += h3*s4
-+
-+ vpmuludq $H4,$S1,$M0
-+ vpmuludq $H4,$S2,$M1
-+ vpmuludq $H4,$S3,$M2
-+ vpaddq $M0,$D0,$H0 # h0 = d0 + h4*s1
-+ vpaddq $M1,$D1,$H1 # h1 = d2 + h4*s2
-+ vpaddq $M2,$D2,$H2 # h2 = d3 + h4*s3
-+
-+ ################################################################
-+ # lazy reduction (interleaved with input splat)
-+
-+ vpsrlq \$52,$T0,$T2 # splat input
-+ vpsllq \$12,$T4,$T3
-+
-+ vpsrlq \$26,$D3,$H3
-+ vpandq $MASK,$D3,$D3
-+ vpaddq $H3,$D4,$H4 # h3 -> h4
-+
-+ vporq $T3,$T2,$T2
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpandq $MASK,$H0,$H0
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpandq $MASK,$T2,$T2 # 2
-+
-+ vpsrlq \$26,$H4,$D4
-+ vpandq $MASK,$H4,$H4
-+
-+ vpsrlq \$26,$H1,$D1
-+ vpandq $MASK,$H1,$H1
-+ vpaddq $D1,$H2,$H2 # h1 -> h2
-+
-+ vpaddq $D4,$H0,$H0
-+ vpsllq \$2,$D4,$D4
-+ vpaddq $D4,$H0,$H0 # h4 -> h0
-+
-+ vpaddq $T2,$H2,$H2 # modulo-scheduled
-+ vpsrlq \$26,$T0,$T1
-+
-+ vpsrlq \$26,$H2,$D2
-+ vpandq $MASK,$H2,$H2
-+ vpaddq $D2,$D3,$H3 # h2 -> h3
-+
-+ vpsrlq \$14,$T4,$T3
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpandq $MASK,$H0,$H0
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$40,$T4,$T4 # 4
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpandq $MASK,$H3,$H3
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpandq $MASK,$T0,$T0 # 0
-+ #vpandq $MASK,$T1,$T1 # 1
-+ #vpandq $MASK,$T3,$T3 # 3
-+ #vporq $PADBIT,$T4,$T4 # padbit, yes, always
-+
-+ sub \$128,$len
-+ ja .Loop_avx512
-+
-+.Ltail_avx512:
-+ ################################################################
-+ # while above multiplications were by r^8 in all lanes, in last
-+ # iteration we multiply least significant lane by r^8 and most
-+ # significant one by r, that's why table gets shifted...
-+
-+ vpsrlq \$32,$R0,$R0 # 0105020603070408
-+ vpsrlq \$32,$R1,$R1
-+ vpsrlq \$32,$R2,$R2
-+ vpsrlq \$32,$S3,$S3
-+ vpsrlq \$32,$S4,$S4
-+ vpsrlq \$32,$R3,$R3
-+ vpsrlq \$32,$R4,$R4
-+ vpsrlq \$32,$S1,$S1
-+ vpsrlq \$32,$S2,$S2
-+
-+ ################################################################
-+ # load either next or last 64 byte of input
-+ lea ($inp,$len),$inp
-+
-+ #vpaddq $H2,$T2,$H2 # accumulate input
-+ vpaddq $H0,$T0,$H0
-+
-+ vpmuludq $H2,$R1,$D3 # d3 = h2*r1
-+ vpmuludq $H2,$R2,$D4 # d4 = h2*r2
-+ vpmuludq $H2,$S3,$D0 # d0 = h2*s3
-+ vpandq $MASK,$T1,$T1 # 1
-+ vpmuludq $H2,$S4,$D1 # d1 = h2*s4
-+ vpandq $MASK,$T3,$T3 # 3
-+ vpmuludq $H2,$R0,$D2 # d2 = h2*r0
-+ vporq $PADBIT,$T4,$T4 # padbit, yes, always
-+ vpaddq $H1,$T1,$H1 # accumulate input
-+ vpaddq $H3,$T3,$H3
-+ vpaddq $H4,$T4,$H4
-+
-+ vmovdqu 16*0($inp),%x#$T0
-+ vpmuludq $H0,$R3,$M3
-+ vpmuludq $H0,$R4,$M4
-+ vpmuludq $H0,$R0,$M0
-+ vpmuludq $H0,$R1,$M1
-+ vpaddq $M3,$D3,$D3 # d3 += h0*r3
-+ vpaddq $M4,$D4,$D4 # d4 += h0*r4
-+ vpaddq $M0,$D0,$D0 # d0 += h0*r0
-+ vpaddq $M1,$D1,$D1 # d1 += h0*r1
-+
-+ vmovdqu 16*1($inp),%x#$T1
-+ vpmuludq $H1,$R2,$M3
-+ vpmuludq $H1,$R3,$M4
-+ vpmuludq $H1,$S4,$M0
-+ vpmuludq $H0,$R2,$M2
-+ vpaddq $M3,$D3,$D3 # d3 += h1*r2
-+ vpaddq $M4,$D4,$D4 # d4 += h1*r3
-+ vpaddq $M0,$D0,$D0 # d0 += h1*s4
-+ vpaddq $M2,$D2,$D2 # d2 += h0*r2
-+
-+ vinserti128 \$1,16*2($inp),%y#$T0,%y#$T0
-+ vpmuludq $H3,$R0,$M3
-+ vpmuludq $H3,$R1,$M4
-+ vpmuludq $H1,$R0,$M1
-+ vpmuludq $H1,$R1,$M2
-+ vpaddq $M3,$D3,$D3 # d3 += h3*r0
-+ vpaddq $M4,$D4,$D4 # d4 += h3*r1
-+ vpaddq $M1,$D1,$D1 # d1 += h1*r0
-+ vpaddq $M2,$D2,$D2 # d2 += h1*r1
-+
-+ vinserti128 \$1,16*3($inp),%y#$T1,%y#$T1
-+ vpmuludq $H4,$S4,$M3
-+ vpmuludq $H4,$R0,$M4
-+ vpmuludq $H3,$S2,$M0
-+ vpmuludq $H3,$S3,$M1
-+ vpmuludq $H3,$S4,$M2
-+ vpaddq $M3,$D3,$H3 # h3 = d3 + h4*s4
-+ vpaddq $M4,$D4,$D4 # d4 += h4*r0
-+ vpaddq $M0,$D0,$D0 # d0 += h3*s2
-+ vpaddq $M1,$D1,$D1 # d1 += h3*s3
-+ vpaddq $M2,$D2,$D2 # d2 += h3*s4
-+
-+ vpmuludq $H4,$S1,$M0
-+ vpmuludq $H4,$S2,$M1
-+ vpmuludq $H4,$S3,$M2
-+ vpaddq $M0,$D0,$H0 # h0 = d0 + h4*s1
-+ vpaddq $M1,$D1,$H1 # h1 = d2 + h4*s2
-+ vpaddq $M2,$D2,$H2 # h2 = d3 + h4*s3
-+
-+ ################################################################
-+ # horizontal addition
-+
-+ mov \$1,%eax
-+ vpermq \$0xb1,$H3,$D3
-+ vpermq \$0xb1,$D4,$H4
-+ vpermq \$0xb1,$H0,$D0
-+ vpermq \$0xb1,$H1,$D1
-+ vpermq \$0xb1,$H2,$D2
-+ vpaddq $D3,$H3,$H3
-+ vpaddq $D4,$H4,$H4
-+ vpaddq $D0,$H0,$H0
-+ vpaddq $D1,$H1,$H1
-+ vpaddq $D2,$H2,$H2
-+
-+ kmovw %eax,%k3
-+ vpermq \$0x2,$H3,$D3
-+ vpermq \$0x2,$H4,$D4
-+ vpermq \$0x2,$H0,$D0
-+ vpermq \$0x2,$H1,$D1
-+ vpermq \$0x2,$H2,$D2
-+ vpaddq $D3,$H3,$H3
-+ vpaddq $D4,$H4,$H4
-+ vpaddq $D0,$H0,$H0
-+ vpaddq $D1,$H1,$H1
-+ vpaddq $D2,$H2,$H2
-+
-+ vextracti64x4 \$0x1,$H3,%y#$D3
-+ vextracti64x4 \$0x1,$H4,%y#$D4
-+ vextracti64x4 \$0x1,$H0,%y#$D0
-+ vextracti64x4 \$0x1,$H1,%y#$D1
-+ vextracti64x4 \$0x1,$H2,%y#$D2
-+ vpaddq $D3,$H3,${H3}{%k3}{z} # keep single qword in case
-+ vpaddq $D4,$H4,${H4}{%k3}{z} # it's passed to .Ltail_avx2
-+ vpaddq $D0,$H0,${H0}{%k3}{z}
-+ vpaddq $D1,$H1,${H1}{%k3}{z}
-+ vpaddq $D2,$H2,${H2}{%k3}{z}
-+___
-+map(s/%z/%y/,($T0,$T1,$T2,$T3,$T4, $PADBIT));
-+map(s/%z/%y/,($H0,$H1,$H2,$H3,$H4, $D0,$D1,$D2,$D3,$D4, $MASK));
-+$code.=<<___;
-+ ################################################################
-+ # lazy reduction (interleaved with input splat)
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpsrldq \$6,$T0,$T2 # splat input
-+ vpsrldq \$6,$T1,$T3
-+ vpunpckhqdq $T1,$T0,$T4 # 4
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpunpcklqdq $T3,$T2,$T2 # 2:3
-+ vpunpcklqdq $T1,$T0,$T0 # 0:1
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H4,$D4
-+ vpand $MASK,$H4,$H4
-+
-+ vpsrlq \$26,$H1,$D1
-+ vpand $MASK,$H1,$H1
-+ vpsrlq \$30,$T2,$T3
-+ vpsrlq \$4,$T2,$T2
-+ vpaddq $D1,$H2,$H2 # h1 -> h2
-+
-+ vpaddq $D4,$H0,$H0
-+ vpsllq \$2,$D4,$D4
-+ vpsrlq \$26,$T0,$T1
-+ vpsrlq \$40,$T4,$T4 # 4
-+ vpaddq $D4,$H0,$H0 # h4 -> h0
-+
-+ vpsrlq \$26,$H2,$D2
-+ vpand $MASK,$H2,$H2
-+ vpand $MASK,$T2,$T2 # 2
-+ vpand $MASK,$T0,$T0 # 0
-+ vpaddq $D2,$H3,$H3 # h2 -> h3
-+
-+ vpsrlq \$26,$H0,$D0
-+ vpand $MASK,$H0,$H0
-+ vpaddq $H2,$T2,$H2 # accumulate input for .Ltail_avx2
-+ vpand $MASK,$T1,$T1 # 1
-+ vpaddq $D0,$H1,$H1 # h0 -> h1
-+
-+ vpsrlq \$26,$H3,$D3
-+ vpand $MASK,$H3,$H3
-+ vpand $MASK,$T3,$T3 # 3
-+ vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-+ vpaddq $D3,$H4,$H4 # h3 -> h4
-+
-+ lea 0x90(%rsp),%rax # size optimization for .Ltail_avx2
-+ add \$64,$len
-+ jnz .Ltail_avx2
-+
-+ vpsubq $T2,$H2,$H2 # undo input accumulation
-+ vmovd %x#$H0,`4*0-48-64`($ctx)# save partially reduced
-+ vmovd %x#$H1,`4*1-48-64`($ctx)
-+ vmovd %x#$H2,`4*2-48-64`($ctx)
-+ vmovd %x#$H3,`4*3-48-64`($ctx)
-+ vmovd %x#$H4,`4*4-48-64`($ctx)
-+ vzeroall
-+___
-+$code.=<<___ if ($win64);
-+ movdqa 0x50(%r11),%xmm6
-+ movdqa 0x60(%r11),%xmm7
-+ movdqa 0x70(%r11),%xmm8
-+ movdqa 0x80(%r11),%xmm9
-+ movdqa 0x90(%r11),%xmm10
-+ movdqa 0xa0(%r11),%xmm11
-+ movdqa 0xb0(%r11),%xmm12
-+ movdqa 0xc0(%r11),%xmm13
-+ movdqa 0xd0(%r11),%xmm14
-+ movdqa 0xe0(%r11),%xmm15
-+ lea 0xf8(%r11),%rsp
-+.Ldo_avx512_epilogue:
-+___
-+$code.=<<___ if (!$win64);
-+ lea 8(%r11),%rsp
-+.cfi_def_cfa %rsp,8
-+___
-+$code.=<<___;
-+ ret
-+.cfi_endproc
-+.size poly1305_blocks_avx512,.-poly1305_blocks_avx512
-+___
-+if ($avx>3) {
-+########################################################################
-+# VPMADD52 version using 2^44 radix.
-+#
-+# One can argue that base 2^52 would be more natural. Well, even though
-+# some operations would be more natural, one has to recognize couple of
-+# things. Base 2^52 doesn't provide advantage over base 2^44 if you look
-+# at amount of multiply-n-accumulate operations. Secondly, it makes it
-+# impossible to pre-compute multiples of 5 [referred to as s[]/sN in
-+# reference implementations], which means that more such operations
-+# would have to be performed in inner loop, which in turn makes critical
-+# path longer. In other words, even though base 2^44 reduction might
-+# look less elegant, overall critical path is actually shorter...
-+
-+########################################################################
-+# Layout of opaque area is following.
-+#
-+# unsigned __int64 h[3]; # current hash value base 2^44
-+# unsigned __int64 s[2]; # key value*20 base 2^44
-+# unsigned __int64 r[3]; # key value base 2^44
-+# struct { unsigned __int64 r^1, r^3, r^2, r^4; } R[4];
-+# # r^n positions reflect
-+# # placement in register, not
-+# # memory, R[3] is R[1]*20
-+
-+$code.=<<___;
-+.type poly1305_init_base2_44,\@function,3
-+.align 32
-+poly1305_init_base2_44:
-+ xor %rax,%rax
-+ mov %rax,0($ctx) # initialize hash value
-+ mov %rax,8($ctx)
-+ mov %rax,16($ctx)
-+
-+.Linit_base2_44:
-+ lea poly1305_blocks_vpmadd52(%rip),%r10
-+ lea poly1305_emit_base2_44(%rip),%r11
-+
-+ mov \$0x0ffffffc0fffffff,%rax
-+ mov \$0x0ffffffc0ffffffc,%rcx
-+ and 0($inp),%rax
-+ mov \$0x00000fffffffffff,%r8
-+ and 8($inp),%rcx
-+ mov \$0x00000fffffffffff,%r9
-+ and %rax,%r8
-+ shrd \$44,%rcx,%rax
-+ mov %r8,40($ctx) # r0
-+ and %r9,%rax
-+ shr \$24,%rcx
-+ mov %rax,48($ctx) # r1
-+ lea (%rax,%rax,4),%rax # *5
-+ mov %rcx,56($ctx) # r2
-+ shl \$2,%rax # magic <<2
-+ lea (%rcx,%rcx,4),%rcx # *5
-+ shl \$2,%rcx # magic <<2
-+ mov %rax,24($ctx) # s1
-+ mov %rcx,32($ctx) # s2
-+ movq \$-1,64($ctx) # write impossible value
-+___
-+$code.=<<___ if ($flavour !~ /elf32/);
-+ mov %r10,0(%rdx)
-+ mov %r11,8(%rdx)
-+___
-+$code.=<<___ if ($flavour =~ /elf32/);
-+ mov %r10d,0(%rdx)
-+ mov %r11d,4(%rdx)
-+___
-+$code.=<<___;
-+ mov \$1,%eax
-+ ret
-+.size poly1305_init_base2_44,.-poly1305_init_base2_44
-+___
-+{
-+my ($H0,$H1,$H2,$r2r1r0,$r1r0s2,$r0s2s1,$Dlo,$Dhi) = map("%ymm$_",(0..5,16,17));
-+my ($T0,$inp_permd,$inp_shift,$PAD) = map("%ymm$_",(18..21));
-+my ($reduc_mask,$reduc_rght,$reduc_left) = map("%ymm$_",(22..25));
-+
-+$code.=<<___;
-+.type poly1305_blocks_vpmadd52,\@function,4
-+.align 32
-+poly1305_blocks_vpmadd52:
-+ shr \$4,$len
-+ jz .Lno_data_vpmadd52 # too short
-+
-+ shl \$40,$padbit
-+ mov 64($ctx),%r8 # peek on power of the key
-+
-+ # if powers of the key are not calculated yet, process up to 3
-+ # blocks with this single-block subroutine, otherwise ensure that
-+ # length is divisible by 2 blocks and pass the rest down to next
-+ # subroutine...
-+
-+ mov \$3,%rax
-+ mov \$1,%r10
-+ cmp \$4,$len # is input long
-+ cmovae %r10,%rax
-+ test %r8,%r8 # is power value impossible?
-+ cmovns %r10,%rax
-+
-+ and $len,%rax # is input of favourable length?
-+ jz .Lblocks_vpmadd52_4x
-+
-+ sub %rax,$len
-+ mov \$7,%r10d
-+ mov \$1,%r11d
-+ kmovw %r10d,%k7
-+ lea .L2_44_inp_permd(%rip),%r10
-+ kmovw %r11d,%k1
-+
-+ vmovq $padbit,%x#$PAD
-+ vmovdqa64 0(%r10),$inp_permd # .L2_44_inp_permd
-+ vmovdqa64 32(%r10),$inp_shift # .L2_44_inp_shift
-+ vpermq \$0xcf,$PAD,$PAD
-+ vmovdqa64 64(%r10),$reduc_mask # .L2_44_mask
-+
-+ vmovdqu64 0($ctx),${Dlo}{%k7}{z} # load hash value
-+ vmovdqu64 40($ctx),${r2r1r0}{%k7}{z} # load keys
-+ vmovdqu64 32($ctx),${r1r0s2}{%k7}{z}
-+ vmovdqu64 24($ctx),${r0s2s1}{%k7}{z}
-+
-+ vmovdqa64 96(%r10),$reduc_rght # .L2_44_shift_rgt
-+ vmovdqa64 128(%r10),$reduc_left # .L2_44_shift_lft
-+
-+ jmp .Loop_vpmadd52
-+
-+.align 32
-+.Loop_vpmadd52:
-+ vmovdqu32 0($inp),%x#$T0 # load input as ----3210
-+ lea 16($inp),$inp
-+
-+ vpermd $T0,$inp_permd,$T0 # ----3210 -> --322110
-+ vpsrlvq $inp_shift,$T0,$T0
-+ vpandq $reduc_mask,$T0,$T0
-+ vporq $PAD,$T0,$T0
-+
-+ vpaddq $T0,$Dlo,$Dlo # accumulate input
-+
-+ vpermq \$0,$Dlo,${H0}{%k7}{z} # smash hash value
-+ vpermq \$0b01010101,$Dlo,${H1}{%k7}{z}
-+ vpermq \$0b10101010,$Dlo,${H2}{%k7}{z}
-+
-+ vpxord $Dlo,$Dlo,$Dlo
-+ vpxord $Dhi,$Dhi,$Dhi
-+
-+ vpmadd52luq $r2r1r0,$H0,$Dlo
-+ vpmadd52huq $r2r1r0,$H0,$Dhi
-+
-+ vpmadd52luq $r1r0s2,$H1,$Dlo
-+ vpmadd52huq $r1r0s2,$H1,$Dhi
-+
-+ vpmadd52luq $r0s2s1,$H2,$Dlo
-+ vpmadd52huq $r0s2s1,$H2,$Dhi
-+
-+ vpsrlvq $reduc_rght,$Dlo,$T0 # 0 in topmost qword
-+ vpsllvq $reduc_left,$Dhi,$Dhi # 0 in topmost qword
-+ vpandq $reduc_mask,$Dlo,$Dlo
-+
-+ vpaddq $T0,$Dhi,$Dhi
-+
-+ vpermq \$0b10010011,$Dhi,$Dhi # 0 in lowest qword
-+
-+ vpaddq $Dhi,$Dlo,$Dlo # note topmost qword :-)
-+
-+ vpsrlvq $reduc_rght,$Dlo,$T0 # 0 in topmost word
-+ vpandq $reduc_mask,$Dlo,$Dlo
-+
-+ vpermq \$0b10010011,$T0,$T0
-+
-+ vpaddq $T0,$Dlo,$Dlo
-+
-+ vpermq \$0b10010011,$Dlo,${T0}{%k1}{z}
-+
-+ vpaddq $T0,$Dlo,$Dlo
-+ vpsllq \$2,$T0,$T0
-+
-+ vpaddq $T0,$Dlo,$Dlo
-+
-+ dec %rax # len-=16
-+ jnz .Loop_vpmadd52
-+
-+ vmovdqu64 $Dlo,0($ctx){%k7} # store hash value
-+
-+ test $len,$len
-+ jnz .Lblocks_vpmadd52_4x
-+
-+.Lno_data_vpmadd52:
-+ ret
-+.size poly1305_blocks_vpmadd52,.-poly1305_blocks_vpmadd52
-+___
-+}
-+{
-+########################################################################
-+# As implied by its name 4x subroutine processes 4 blocks in parallel
-+# (but handles even 4*n+2 blocks lengths). It takes up to 4th key power
-+# and is handled in 256-bit %ymm registers.
-+
-+my ($H0,$H1,$H2,$R0,$R1,$R2,$S1,$S2) = map("%ymm$_",(0..5,16,17));
-+my ($D0lo,$D0hi,$D1lo,$D1hi,$D2lo,$D2hi) = map("%ymm$_",(18..23));
-+my ($T0,$T1,$T2,$T3,$mask44,$mask42,$tmp,$PAD) = map("%ymm$_",(24..31));
-+
-+$code.=<<___;
-+.type poly1305_blocks_vpmadd52_4x,\@function,4
-+.align 32
-+poly1305_blocks_vpmadd52_4x:
-+ shr \$4,$len
-+ jz .Lno_data_vpmadd52_4x # too short
-+
-+ shl \$40,$padbit
-+ mov 64($ctx),%r8 # peek on power of the key
-+
-+.Lblocks_vpmadd52_4x:
-+ vpbroadcastq $padbit,$PAD
-+
-+ vmovdqa64 .Lx_mask44(%rip),$mask44
-+ mov \$5,%eax
-+ vmovdqa64 .Lx_mask42(%rip),$mask42
-+ kmovw %eax,%k1 # used in 2x path
-+
-+ test %r8,%r8 # is power value impossible?
-+ js .Linit_vpmadd52 # if it is, then init R[4]
-+
-+ vmovq 0($ctx),%x#$H0 # load current hash value
-+ vmovq 8($ctx),%x#$H1
-+ vmovq 16($ctx),%x#$H2
-+
-+ test \$3,$len # is length 4*n+2?
-+ jnz .Lblocks_vpmadd52_2x_do
-+
-+.Lblocks_vpmadd52_4x_do:
-+ vpbroadcastq 64($ctx),$R0 # load 4th power of the key
-+ vpbroadcastq 96($ctx),$R1
-+ vpbroadcastq 128($ctx),$R2
-+ vpbroadcastq 160($ctx),$S1
-+
-+.Lblocks_vpmadd52_4x_key_loaded:
-+ vpsllq \$2,$R2,$S2 # S2 = R2*5*4
-+ vpaddq $R2,$S2,$S2
-+ vpsllq \$2,$S2,$S2
-+
-+ test \$7,$len # is len 8*n?
-+ jz .Lblocks_vpmadd52_8x
-+
-+ vmovdqu64 16*0($inp),$T2 # load data
-+ vmovdqu64 16*2($inp),$T3
-+ lea 16*4($inp),$inp
-+
-+ vpunpcklqdq $T3,$T2,$T1 # transpose data
-+ vpunpckhqdq $T3,$T2,$T3
-+
-+ # at this point 64-bit lanes are ordered as 3-1-2-0
-+
-+ vpsrlq \$24,$T3,$T2 # splat the data
-+ vporq $PAD,$T2,$T2
-+ vpaddq $T2,$H2,$H2 # accumulate input
-+ vpandq $mask44,$T1,$T0
-+ vpsrlq \$44,$T1,$T1
-+ vpsllq \$20,$T3,$T3
-+ vporq $T3,$T1,$T1
-+ vpandq $mask44,$T1,$T1
-+
-+ sub \$4,$len
-+ jz .Ltail_vpmadd52_4x
-+ jmp .Loop_vpmadd52_4x
-+ ud2
-+
-+.align 32
-+.Linit_vpmadd52:
-+ vmovq 24($ctx),%x#$S1 # load key
-+ vmovq 56($ctx),%x#$H2
-+ vmovq 32($ctx),%x#$S2
-+ vmovq 40($ctx),%x#$R0
-+ vmovq 48($ctx),%x#$R1
-+
-+ vmovdqa $R0,$H0
-+ vmovdqa $R1,$H1
-+ vmovdqa $H2,$R2
-+
-+ mov \$2,%eax
-+
-+.Lmul_init_vpmadd52:
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $H2,$S1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $H2,$S1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $H2,$S2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $H2,$S2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $H2,$R0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $H2,$R0,$D2hi
-+
-+ vpmadd52luq $H0,$R0,$D0lo
-+ vpmadd52huq $H0,$R0,$D0hi
-+ vpmadd52luq $H0,$R1,$D1lo
-+ vpmadd52huq $H0,$R1,$D1hi
-+ vpmadd52luq $H0,$R2,$D2lo
-+ vpmadd52huq $H0,$R2,$D2hi
-+
-+ vpmadd52luq $H1,$S2,$D0lo
-+ vpmadd52huq $H1,$S2,$D0hi
-+ vpmadd52luq $H1,$R0,$D1lo
-+ vpmadd52huq $H1,$R0,$D1hi
-+ vpmadd52luq $H1,$R1,$D2lo
-+ vpmadd52huq $H1,$R1,$D2hi
-+
-+ ################################################################
-+ # partial reduction
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$H0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$H1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$H2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+
-+ vpsrlq \$44,$H0,$tmp # additional step
-+ vpandq $mask44,$H0,$H0
-+
-+ vpaddq $tmp,$H1,$H1
-+
-+ dec %eax
-+ jz .Ldone_init_vpmadd52
-+
-+ vpunpcklqdq $R1,$H1,$R1 # 1,2
-+ vpbroadcastq %x#$H1,%x#$H1 # 2,2
-+ vpunpcklqdq $R2,$H2,$R2
-+ vpbroadcastq %x#$H2,%x#$H2
-+ vpunpcklqdq $R0,$H0,$R0
-+ vpbroadcastq %x#$H0,%x#$H0
-+
-+ vpsllq \$2,$R1,$S1 # S1 = R1*5*4
-+ vpsllq \$2,$R2,$S2 # S2 = R2*5*4
-+ vpaddq $R1,$S1,$S1
-+ vpaddq $R2,$S2,$S2
-+ vpsllq \$2,$S1,$S1
-+ vpsllq \$2,$S2,$S2
-+
-+ jmp .Lmul_init_vpmadd52
-+ ud2
-+
-+.align 32
-+.Ldone_init_vpmadd52:
-+ vinserti128 \$1,%x#$R1,$H1,$R1 # 1,2,3,4
-+ vinserti128 \$1,%x#$R2,$H2,$R2
-+ vinserti128 \$1,%x#$R0,$H0,$R0
-+
-+ vpermq \$0b11011000,$R1,$R1 # 1,3,2,4
-+ vpermq \$0b11011000,$R2,$R2
-+ vpermq \$0b11011000,$R0,$R0
-+
-+ vpsllq \$2,$R1,$S1 # S1 = R1*5*4
-+ vpaddq $R1,$S1,$S1
-+ vpsllq \$2,$S1,$S1
-+
-+ vmovq 0($ctx),%x#$H0 # load current hash value
-+ vmovq 8($ctx),%x#$H1
-+ vmovq 16($ctx),%x#$H2
-+
-+ test \$3,$len # is length 4*n+2?
-+ jnz .Ldone_init_vpmadd52_2x
-+
-+ vmovdqu64 $R0,64($ctx) # save key powers
-+ vpbroadcastq %x#$R0,$R0 # broadcast 4th power
-+ vmovdqu64 $R1,96($ctx)
-+ vpbroadcastq %x#$R1,$R1
-+ vmovdqu64 $R2,128($ctx)
-+ vpbroadcastq %x#$R2,$R2
-+ vmovdqu64 $S1,160($ctx)
-+ vpbroadcastq %x#$S1,$S1
-+
-+ jmp .Lblocks_vpmadd52_4x_key_loaded
-+ ud2
-+
-+.align 32
-+.Ldone_init_vpmadd52_2x:
-+ vmovdqu64 $R0,64($ctx) # save key powers
-+ vpsrldq \$8,$R0,$R0 # 0-1-0-2
-+ vmovdqu64 $R1,96($ctx)
-+ vpsrldq \$8,$R1,$R1
-+ vmovdqu64 $R2,128($ctx)
-+ vpsrldq \$8,$R2,$R2
-+ vmovdqu64 $S1,160($ctx)
-+ vpsrldq \$8,$S1,$S1
-+ jmp .Lblocks_vpmadd52_2x_key_loaded
-+ ud2
-+
-+.align 32
-+.Lblocks_vpmadd52_2x_do:
-+ vmovdqu64 128+8($ctx),${R2}{%k1}{z}# load 2nd and 1st key powers
-+ vmovdqu64 160+8($ctx),${S1}{%k1}{z}
-+ vmovdqu64 64+8($ctx),${R0}{%k1}{z}
-+ vmovdqu64 96+8($ctx),${R1}{%k1}{z}
-+
-+.Lblocks_vpmadd52_2x_key_loaded:
-+ vmovdqu64 16*0($inp),$T2 # load data
-+ vpxorq $T3,$T3,$T3
-+ lea 16*2($inp),$inp
-+
-+ vpunpcklqdq $T3,$T2,$T1 # transpose data
-+ vpunpckhqdq $T3,$T2,$T3
-+
-+ # at this point 64-bit lanes are ordered as x-1-x-0
-+
-+ vpsrlq \$24,$T3,$T2 # splat the data
-+ vporq $PAD,$T2,$T2
-+ vpaddq $T2,$H2,$H2 # accumulate input
-+ vpandq $mask44,$T1,$T0
-+ vpsrlq \$44,$T1,$T1
-+ vpsllq \$20,$T3,$T3
-+ vporq $T3,$T1,$T1
-+ vpandq $mask44,$T1,$T1
-+
-+ jmp .Ltail_vpmadd52_2x
-+ ud2
-+
-+.align 32
-+.Loop_vpmadd52_4x:
-+ #vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $T0,$H0,$H0
-+ vpaddq $T1,$H1,$H1
-+
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $H2,$S1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $H2,$S1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $H2,$S2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $H2,$S2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $H2,$R0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $H2,$R0,$D2hi
-+
-+ vmovdqu64 16*0($inp),$T2 # load data
-+ vmovdqu64 16*2($inp),$T3
-+ lea 16*4($inp),$inp
-+ vpmadd52luq $H0,$R0,$D0lo
-+ vpmadd52huq $H0,$R0,$D0hi
-+ vpmadd52luq $H0,$R1,$D1lo
-+ vpmadd52huq $H0,$R1,$D1hi
-+ vpmadd52luq $H0,$R2,$D2lo
-+ vpmadd52huq $H0,$R2,$D2hi
-+
-+ vpunpcklqdq $T3,$T2,$T1 # transpose data
-+ vpunpckhqdq $T3,$T2,$T3
-+ vpmadd52luq $H1,$S2,$D0lo
-+ vpmadd52huq $H1,$S2,$D0hi
-+ vpmadd52luq $H1,$R0,$D1lo
-+ vpmadd52huq $H1,$R0,$D1hi
-+ vpmadd52luq $H1,$R1,$D2lo
-+ vpmadd52huq $H1,$R1,$D2hi
-+
-+ ################################################################
-+ # partial reduction (interleaved with data splat)
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$H0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpsrlq \$24,$T3,$T2
-+ vporq $PAD,$T2,$T2
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$H1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpandq $mask44,$T1,$T0
-+ vpsrlq \$44,$T1,$T1
-+ vpsllq \$20,$T3,$T3
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$H2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $D2hi,$H0,$H0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+ vporq $T3,$T1,$T1
-+ vpandq $mask44,$T1,$T1
-+
-+ vpsrlq \$44,$H0,$tmp # additional step
-+ vpandq $mask44,$H0,$H0
-+
-+ vpaddq $tmp,$H1,$H1
-+
-+ sub \$4,$len # len-=64
-+ jnz .Loop_vpmadd52_4x
-+
-+.Ltail_vpmadd52_4x:
-+ vmovdqu64 128($ctx),$R2 # load all key powers
-+ vmovdqu64 160($ctx),$S1
-+ vmovdqu64 64($ctx),$R0
-+ vmovdqu64 96($ctx),$R1
-+
-+.Ltail_vpmadd52_2x:
-+ vpsllq \$2,$R2,$S2 # S2 = R2*5*4
-+ vpaddq $R2,$S2,$S2
-+ vpsllq \$2,$S2,$S2
-+
-+ #vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $T0,$H0,$H0
-+ vpaddq $T1,$H1,$H1
-+
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $H2,$S1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $H2,$S1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $H2,$S2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $H2,$S2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $H2,$R0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $H2,$R0,$D2hi
-+
-+ vpmadd52luq $H0,$R0,$D0lo
-+ vpmadd52huq $H0,$R0,$D0hi
-+ vpmadd52luq $H0,$R1,$D1lo
-+ vpmadd52huq $H0,$R1,$D1hi
-+ vpmadd52luq $H0,$R2,$D2lo
-+ vpmadd52huq $H0,$R2,$D2hi
-+
-+ vpmadd52luq $H1,$S2,$D0lo
-+ vpmadd52huq $H1,$S2,$D0hi
-+ vpmadd52luq $H1,$R0,$D1lo
-+ vpmadd52huq $H1,$R0,$D1hi
-+ vpmadd52luq $H1,$R1,$D2lo
-+ vpmadd52huq $H1,$R1,$D2hi
-+
-+ ################################################################
-+ # horizontal addition
-+
-+ mov \$1,%eax
-+ kmovw %eax,%k1
-+ vpsrldq \$8,$D0lo,$T0
-+ vpsrldq \$8,$D0hi,$H0
-+ vpsrldq \$8,$D1lo,$T1
-+ vpsrldq \$8,$D1hi,$H1
-+ vpaddq $T0,$D0lo,$D0lo
-+ vpaddq $H0,$D0hi,$D0hi
-+ vpsrldq \$8,$D2lo,$T2
-+ vpsrldq \$8,$D2hi,$H2
-+ vpaddq $T1,$D1lo,$D1lo
-+ vpaddq $H1,$D1hi,$D1hi
-+ vpermq \$0x2,$D0lo,$T0
-+ vpermq \$0x2,$D0hi,$H0
-+ vpaddq $T2,$D2lo,$D2lo
-+ vpaddq $H2,$D2hi,$D2hi
-+
-+ vpermq \$0x2,$D1lo,$T1
-+ vpermq \$0x2,$D1hi,$H1
-+ vpaddq $T0,$D0lo,${D0lo}{%k1}{z}
-+ vpaddq $H0,$D0hi,${D0hi}{%k1}{z}
-+ vpermq \$0x2,$D2lo,$T2
-+ vpermq \$0x2,$D2hi,$H2
-+ vpaddq $T1,$D1lo,${D1lo}{%k1}{z}
-+ vpaddq $H1,$D1hi,${D1hi}{%k1}{z}
-+ vpaddq $T2,$D2lo,${D2lo}{%k1}{z}
-+ vpaddq $H2,$D2hi,${D2hi}{%k1}{z}
-+
-+ ################################################################
-+ # partial reduction
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$H0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$H1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$H2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+
-+ vpsrlq \$44,$H0,$tmp # additional step
-+ vpandq $mask44,$H0,$H0
-+
-+ vpaddq $tmp,$H1,$H1
-+ # at this point $len is
-+ # either 4*n+2 or 0...
-+ sub \$2,$len # len-=32
-+ ja .Lblocks_vpmadd52_4x_do
-+
-+ vmovq %x#$H0,0($ctx)
-+ vmovq %x#$H1,8($ctx)
-+ vmovq %x#$H2,16($ctx)
-+ vzeroall
-+
-+.Lno_data_vpmadd52_4x:
-+ ret
-+.size poly1305_blocks_vpmadd52_4x,.-poly1305_blocks_vpmadd52_4x
-+___
-+}
-+{
-+########################################################################
-+# As implied by its name 8x subroutine processes 8 blocks in parallel...
-+# This is intermediate version, as it's used only in cases when input
-+# length is either 8*n, 8*n+1 or 8*n+2...
-+
-+my ($H0,$H1,$H2,$R0,$R1,$R2,$S1,$S2) = map("%ymm$_",(0..5,16,17));
-+my ($D0lo,$D0hi,$D1lo,$D1hi,$D2lo,$D2hi) = map("%ymm$_",(18..23));
-+my ($T0,$T1,$T2,$T3,$mask44,$mask42,$tmp,$PAD) = map("%ymm$_",(24..31));
-+my ($RR0,$RR1,$RR2,$SS1,$SS2) = map("%ymm$_",(6..10));
-+
-+$code.=<<___;
-+.type poly1305_blocks_vpmadd52_8x,\@function,4
-+.align 32
-+poly1305_blocks_vpmadd52_8x:
-+ shr \$4,$len
-+ jz .Lno_data_vpmadd52_8x # too short
-+
-+ shl \$40,$padbit
-+ mov 64($ctx),%r8 # peek on power of the key
-+
-+ vmovdqa64 .Lx_mask44(%rip),$mask44
-+ vmovdqa64 .Lx_mask42(%rip),$mask42
-+
-+ test %r8,%r8 # is power value impossible?
-+ js .Linit_vpmadd52 # if it is, then init R[4]
-+
-+ vmovq 0($ctx),%x#$H0 # load current hash value
-+ vmovq 8($ctx),%x#$H1
-+ vmovq 16($ctx),%x#$H2
-+
-+.Lblocks_vpmadd52_8x:
-+ ################################################################
-+ # fist we calculate more key powers
-+
-+ vmovdqu64 128($ctx),$R2 # load 1-3-2-4 powers
-+ vmovdqu64 160($ctx),$S1
-+ vmovdqu64 64($ctx),$R0
-+ vmovdqu64 96($ctx),$R1
-+
-+ vpsllq \$2,$R2,$S2 # S2 = R2*5*4
-+ vpaddq $R2,$S2,$S2
-+ vpsllq \$2,$S2,$S2
-+
-+ vpbroadcastq %x#$R2,$RR2 # broadcast 4th power
-+ vpbroadcastq %x#$R0,$RR0
-+ vpbroadcastq %x#$R1,$RR1
-+
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $RR2,$S1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $RR2,$S1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $RR2,$S2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $RR2,$S2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $RR2,$R0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $RR2,$R0,$D2hi
-+
-+ vpmadd52luq $RR0,$R0,$D0lo
-+ vpmadd52huq $RR0,$R0,$D0hi
-+ vpmadd52luq $RR0,$R1,$D1lo
-+ vpmadd52huq $RR0,$R1,$D1hi
-+ vpmadd52luq $RR0,$R2,$D2lo
-+ vpmadd52huq $RR0,$R2,$D2hi
-+
-+ vpmadd52luq $RR1,$S2,$D0lo
-+ vpmadd52huq $RR1,$S2,$D0hi
-+ vpmadd52luq $RR1,$R0,$D1lo
-+ vpmadd52huq $RR1,$R0,$D1hi
-+ vpmadd52luq $RR1,$R1,$D2lo
-+ vpmadd52huq $RR1,$R1,$D2hi
-+
-+ ################################################################
-+ # partial reduction
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$RR0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$RR1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$RR2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$RR0,$RR0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$RR0,$RR0
-+
-+ vpsrlq \$44,$RR0,$tmp # additional step
-+ vpandq $mask44,$RR0,$RR0
-+
-+ vpaddq $tmp,$RR1,$RR1
-+
-+ ################################################################
-+ # At this point Rx holds 1324 powers, RRx - 5768, and the goal
-+ # is 15263748, which reflects how data is loaded...
-+
-+ vpunpcklqdq $R2,$RR2,$T2 # 3748
-+ vpunpckhqdq $R2,$RR2,$R2 # 1526
-+ vpunpcklqdq $R0,$RR0,$T0
-+ vpunpckhqdq $R0,$RR0,$R0
-+ vpunpcklqdq $R1,$RR1,$T1
-+ vpunpckhqdq $R1,$RR1,$R1
-+___
-+######## switch to %zmm
-+map(s/%y/%z/, $H0,$H1,$H2,$R0,$R1,$R2,$S1,$S2);
-+map(s/%y/%z/, $D0lo,$D0hi,$D1lo,$D1hi,$D2lo,$D2hi);
-+map(s/%y/%z/, $T0,$T1,$T2,$T3,$mask44,$mask42,$tmp,$PAD);
-+map(s/%y/%z/, $RR0,$RR1,$RR2,$SS1,$SS2);
-+
-+$code.=<<___;
-+ vshufi64x2 \$0x44,$R2,$T2,$RR2 # 15263748
-+ vshufi64x2 \$0x44,$R0,$T0,$RR0
-+ vshufi64x2 \$0x44,$R1,$T1,$RR1
-+
-+ vmovdqu64 16*0($inp),$T2 # load data
-+ vmovdqu64 16*4($inp),$T3
-+ lea 16*8($inp),$inp
-+
-+ vpsllq \$2,$RR2,$SS2 # S2 = R2*5*4
-+ vpsllq \$2,$RR1,$SS1 # S1 = R1*5*4
-+ vpaddq $RR2,$SS2,$SS2
-+ vpaddq $RR1,$SS1,$SS1
-+ vpsllq \$2,$SS2,$SS2
-+ vpsllq \$2,$SS1,$SS1
-+
-+ vpbroadcastq $padbit,$PAD
-+ vpbroadcastq %x#$mask44,$mask44
-+ vpbroadcastq %x#$mask42,$mask42
-+
-+ vpbroadcastq %x#$SS1,$S1 # broadcast 8th power
-+ vpbroadcastq %x#$SS2,$S2
-+ vpbroadcastq %x#$RR0,$R0
-+ vpbroadcastq %x#$RR1,$R1
-+ vpbroadcastq %x#$RR2,$R2
-+
-+ vpunpcklqdq $T3,$T2,$T1 # transpose data
-+ vpunpckhqdq $T3,$T2,$T3
-+
-+ # at this point 64-bit lanes are ordered as 73625140
-+
-+ vpsrlq \$24,$T3,$T2 # splat the data
-+ vporq $PAD,$T2,$T2
-+ vpaddq $T2,$H2,$H2 # accumulate input
-+ vpandq $mask44,$T1,$T0
-+ vpsrlq \$44,$T1,$T1
-+ vpsllq \$20,$T3,$T3
-+ vporq $T3,$T1,$T1
-+ vpandq $mask44,$T1,$T1
-+
-+ sub \$8,$len
-+ jz .Ltail_vpmadd52_8x
-+ jmp .Loop_vpmadd52_8x
-+
-+.align 32
-+.Loop_vpmadd52_8x:
-+ #vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $T0,$H0,$H0
-+ vpaddq $T1,$H1,$H1
-+
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $H2,$S1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $H2,$S1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $H2,$S2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $H2,$S2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $H2,$R0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $H2,$R0,$D2hi
-+
-+ vmovdqu64 16*0($inp),$T2 # load data
-+ vmovdqu64 16*4($inp),$T3
-+ lea 16*8($inp),$inp
-+ vpmadd52luq $H0,$R0,$D0lo
-+ vpmadd52huq $H0,$R0,$D0hi
-+ vpmadd52luq $H0,$R1,$D1lo
-+ vpmadd52huq $H0,$R1,$D1hi
-+ vpmadd52luq $H0,$R2,$D2lo
-+ vpmadd52huq $H0,$R2,$D2hi
-+
-+ vpunpcklqdq $T3,$T2,$T1 # transpose data
-+ vpunpckhqdq $T3,$T2,$T3
-+ vpmadd52luq $H1,$S2,$D0lo
-+ vpmadd52huq $H1,$S2,$D0hi
-+ vpmadd52luq $H1,$R0,$D1lo
-+ vpmadd52huq $H1,$R0,$D1hi
-+ vpmadd52luq $H1,$R1,$D2lo
-+ vpmadd52huq $H1,$R1,$D2hi
-+
-+ ################################################################
-+ # partial reduction (interleaved with data splat)
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$H0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpsrlq \$24,$T3,$T2
-+ vporq $PAD,$T2,$T2
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$H1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpandq $mask44,$T1,$T0
-+ vpsrlq \$44,$T1,$T1
-+ vpsllq \$20,$T3,$T3
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$H2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $D2hi,$H0,$H0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+ vporq $T3,$T1,$T1
-+ vpandq $mask44,$T1,$T1
-+
-+ vpsrlq \$44,$H0,$tmp # additional step
-+ vpandq $mask44,$H0,$H0
-+
-+ vpaddq $tmp,$H1,$H1
-+
-+ sub \$8,$len # len-=128
-+ jnz .Loop_vpmadd52_8x
-+
-+.Ltail_vpmadd52_8x:
-+ #vpaddq $T2,$H2,$H2 # accumulate input
-+ vpaddq $T0,$H0,$H0
-+ vpaddq $T1,$H1,$H1
-+
-+ vpxorq $D0lo,$D0lo,$D0lo
-+ vpmadd52luq $H2,$SS1,$D0lo
-+ vpxorq $D0hi,$D0hi,$D0hi
-+ vpmadd52huq $H2,$SS1,$D0hi
-+ vpxorq $D1lo,$D1lo,$D1lo
-+ vpmadd52luq $H2,$SS2,$D1lo
-+ vpxorq $D1hi,$D1hi,$D1hi
-+ vpmadd52huq $H2,$SS2,$D1hi
-+ vpxorq $D2lo,$D2lo,$D2lo
-+ vpmadd52luq $H2,$RR0,$D2lo
-+ vpxorq $D2hi,$D2hi,$D2hi
-+ vpmadd52huq $H2,$RR0,$D2hi
-+
-+ vpmadd52luq $H0,$RR0,$D0lo
-+ vpmadd52huq $H0,$RR0,$D0hi
-+ vpmadd52luq $H0,$RR1,$D1lo
-+ vpmadd52huq $H0,$RR1,$D1hi
-+ vpmadd52luq $H0,$RR2,$D2lo
-+ vpmadd52huq $H0,$RR2,$D2hi
-+
-+ vpmadd52luq $H1,$SS2,$D0lo
-+ vpmadd52huq $H1,$SS2,$D0hi
-+ vpmadd52luq $H1,$RR0,$D1lo
-+ vpmadd52huq $H1,$RR0,$D1hi
-+ vpmadd52luq $H1,$RR1,$D2lo
-+ vpmadd52huq $H1,$RR1,$D2hi
-+
-+ ################################################################
-+ # horizontal addition
-+
-+ mov \$1,%eax
-+ kmovw %eax,%k1
-+ vpsrldq \$8,$D0lo,$T0
-+ vpsrldq \$8,$D0hi,$H0
-+ vpsrldq \$8,$D1lo,$T1
-+ vpsrldq \$8,$D1hi,$H1
-+ vpaddq $T0,$D0lo,$D0lo
-+ vpaddq $H0,$D0hi,$D0hi
-+ vpsrldq \$8,$D2lo,$T2
-+ vpsrldq \$8,$D2hi,$H2
-+ vpaddq $T1,$D1lo,$D1lo
-+ vpaddq $H1,$D1hi,$D1hi
-+ vpermq \$0x2,$D0lo,$T0
-+ vpermq \$0x2,$D0hi,$H0
-+ vpaddq $T2,$D2lo,$D2lo
-+ vpaddq $H2,$D2hi,$D2hi
-+
-+ vpermq \$0x2,$D1lo,$T1
-+ vpermq \$0x2,$D1hi,$H1
-+ vpaddq $T0,$D0lo,$D0lo
-+ vpaddq $H0,$D0hi,$D0hi
-+ vpermq \$0x2,$D2lo,$T2
-+ vpermq \$0x2,$D2hi,$H2
-+ vpaddq $T1,$D1lo,$D1lo
-+ vpaddq $H1,$D1hi,$D1hi
-+ vextracti64x4 \$1,$D0lo,%y#$T0
-+ vextracti64x4 \$1,$D0hi,%y#$H0
-+ vpaddq $T2,$D2lo,$D2lo
-+ vpaddq $H2,$D2hi,$D2hi
-+
-+ vextracti64x4 \$1,$D1lo,%y#$T1
-+ vextracti64x4 \$1,$D1hi,%y#$H1
-+ vextracti64x4 \$1,$D2lo,%y#$T2
-+ vextracti64x4 \$1,$D2hi,%y#$H2
-+___
-+######## switch back to %ymm
-+map(s/%z/%y/, $H0,$H1,$H2,$R0,$R1,$R2,$S1,$S2);
-+map(s/%z/%y/, $D0lo,$D0hi,$D1lo,$D1hi,$D2lo,$D2hi);
-+map(s/%z/%y/, $T0,$T1,$T2,$T3,$mask44,$mask42,$tmp,$PAD);
-+
-+$code.=<<___;
-+ vpaddq $T0,$D0lo,${D0lo}{%k1}{z}
-+ vpaddq $H0,$D0hi,${D0hi}{%k1}{z}
-+ vpaddq $T1,$D1lo,${D1lo}{%k1}{z}
-+ vpaddq $H1,$D1hi,${D1hi}{%k1}{z}
-+ vpaddq $T2,$D2lo,${D2lo}{%k1}{z}
-+ vpaddq $H2,$D2hi,${D2hi}{%k1}{z}
-+
-+ ################################################################
-+ # partial reduction
-+ vpsrlq \$44,$D0lo,$tmp
-+ vpsllq \$8,$D0hi,$D0hi
-+ vpandq $mask44,$D0lo,$H0
-+ vpaddq $tmp,$D0hi,$D0hi
-+
-+ vpaddq $D0hi,$D1lo,$D1lo
-+
-+ vpsrlq \$44,$D1lo,$tmp
-+ vpsllq \$8,$D1hi,$D1hi
-+ vpandq $mask44,$D1lo,$H1
-+ vpaddq $tmp,$D1hi,$D1hi
-+
-+ vpaddq $D1hi,$D2lo,$D2lo
-+
-+ vpsrlq \$42,$D2lo,$tmp
-+ vpsllq \$10,$D2hi,$D2hi
-+ vpandq $mask42,$D2lo,$H2
-+ vpaddq $tmp,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+ vpsllq \$2,$D2hi,$D2hi
-+
-+ vpaddq $D2hi,$H0,$H0
-+
-+ vpsrlq \$44,$H0,$tmp # additional step
-+ vpandq $mask44,$H0,$H0
-+
-+ vpaddq $tmp,$H1,$H1
-+
-+ ################################################################
-+
-+ vmovq %x#$H0,0($ctx)
-+ vmovq %x#$H1,8($ctx)
-+ vmovq %x#$H2,16($ctx)
-+ vzeroall
-+
-+.Lno_data_vpmadd52_8x:
-+ ret
-+.size poly1305_blocks_vpmadd52_8x,.-poly1305_blocks_vpmadd52_8x
-+___
-+}
-+$code.=<<___;
-+.type poly1305_emit_base2_44,\@function,3
-+.align 32
-+poly1305_emit_base2_44:
-+ mov 0($ctx),%r8 # load hash value
-+ mov 8($ctx),%r9
-+ mov 16($ctx),%r10
-+
-+ mov %r9,%rax
-+ shr \$20,%r9
-+ shl \$44,%rax
-+ mov %r10,%rcx
-+ shr \$40,%r10
-+ shl \$24,%rcx
-+
-+ add %rax,%r8
-+ adc %rcx,%r9
-+ adc \$0,%r10
-+
-+ mov %r8,%rax
-+ add \$5,%r8 # compare to modulus
-+ mov %r9,%rcx
-+ adc \$0,%r9
-+ adc \$0,%r10
-+ shr \$2,%r10 # did 130-bit value overflow?
-+ cmovnz %r8,%rax
-+ cmovnz %r9,%rcx
-+
-+ add 0($nonce),%rax # accumulate nonce
-+ adc 8($nonce),%rcx
-+ mov %rax,0($mac) # write result
-+ mov %rcx,8($mac)
-+
-+ ret
-+.size poly1305_emit_base2_44,.-poly1305_emit_base2_44
-+___
-+} } }
-+$code.=<<___;
-+.align 64
-+.Lconst:
-+.Lmask24:
-+.long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0
-+.L129:
-+.long `1<<24`,0,`1<<24`,0,`1<<24`,0,`1<<24`,0
-+.Lmask26:
-+.long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0
-+.Lpermd_avx2:
-+.long 2,2,2,3,2,0,2,1
-+.Lpermd_avx512:
-+.long 0,0,0,1, 0,2,0,3, 0,4,0,5, 0,6,0,7
-+
-+.L2_44_inp_permd:
-+.long 0,1,1,2,2,3,7,7
-+.L2_44_inp_shift:
-+.quad 0,12,24,64
-+.L2_44_mask:
-+.quad 0xfffffffffff,0xfffffffffff,0x3ffffffffff,0xffffffffffffffff
-+.L2_44_shift_rgt:
-+.quad 44,44,42,64
-+.L2_44_shift_lft:
-+.quad 8,8,10,64
-+
-+.align 64
-+.Lx_mask44:
-+.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
-+.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
-+.Lx_mask42:
-+.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
-+.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
-+___
-+}
-+$code.=<<___;
-+.asciz "Poly1305 for x86_64, CRYPTOGAMS by <appro\@openssl.org>"
-+.align 16
-+___
-+
-+{ # chacha20-poly1305 helpers
-+my ($out,$inp,$otp,$len)=$win64 ? ("%rcx","%rdx","%r8", "%r9") : # Win64 order
-+ ("%rdi","%rsi","%rdx","%rcx"); # Unix order
-+$code.=<<___;
-+.globl xor128_encrypt_n_pad
-+.type xor128_encrypt_n_pad,\@abi-omnipotent
-+.align 16
-+xor128_encrypt_n_pad:
-+ sub $otp,$inp
-+ sub $otp,$out
-+ mov $len,%r10 # put len aside
-+ shr \$4,$len # len / 16
-+ jz .Ltail_enc
-+ nop
-+.Loop_enc_xmm:
-+ movdqu ($inp,$otp),%xmm0
-+ pxor ($otp),%xmm0
-+ movdqu %xmm0,($out,$otp)
-+ movdqa %xmm0,($otp)
-+ lea 16($otp),$otp
-+ dec $len
-+ jnz .Loop_enc_xmm
-+
-+ and \$15,%r10 # len % 16
-+ jz .Ldone_enc
-+
-+.Ltail_enc:
-+ mov \$16,$len
-+ sub %r10,$len
-+ xor %eax,%eax
-+.Loop_enc_byte:
-+ mov ($inp,$otp),%al
-+ xor ($otp),%al
-+ mov %al,($out,$otp)
-+ mov %al,($otp)
-+ lea 1($otp),$otp
-+ dec %r10
-+ jnz .Loop_enc_byte
-+
-+ xor %eax,%eax
-+.Loop_enc_pad:
-+ mov %al,($otp)
-+ lea 1($otp),$otp
-+ dec $len
-+ jnz .Loop_enc_pad
-+
-+.Ldone_enc:
-+ mov $otp,%rax
-+ ret
-+.size xor128_encrypt_n_pad,.-xor128_encrypt_n_pad
-+
-+.globl xor128_decrypt_n_pad
-+.type xor128_decrypt_n_pad,\@abi-omnipotent
-+.align 16
-+xor128_decrypt_n_pad:
-+ sub $otp,$inp
-+ sub $otp,$out
-+ mov $len,%r10 # put len aside
-+ shr \$4,$len # len / 16
-+ jz .Ltail_dec
-+ nop
-+.Loop_dec_xmm:
-+ movdqu ($inp,$otp),%xmm0
-+ movdqa ($otp),%xmm1
-+ pxor %xmm0,%xmm1
-+ movdqu %xmm1,($out,$otp)
-+ movdqa %xmm0,($otp)
-+ lea 16($otp),$otp
-+ dec $len
-+ jnz .Loop_dec_xmm
-+
-+ pxor %xmm1,%xmm1
-+ and \$15,%r10 # len % 16
-+ jz .Ldone_dec
-+
-+.Ltail_dec:
-+ mov \$16,$len
-+ sub %r10,$len
-+ xor %eax,%eax
-+ xor %r11,%r11
-+.Loop_dec_byte:
-+ mov ($inp,$otp),%r11b
-+ mov ($otp),%al
-+ xor %r11b,%al
-+ mov %al,($out,$otp)
-+ mov %r11b,($otp)
-+ lea 1($otp),$otp
-+ dec %r10
-+ jnz .Loop_dec_byte
-+
-+ xor %eax,%eax
-+.Loop_dec_pad:
-+ mov %al,($otp)
-+ lea 1($otp),$otp
-+ dec $len
-+ jnz .Loop_dec_pad
-+
-+.Ldone_dec:
-+ mov $otp,%rax
-+ ret
-+.size xor128_decrypt_n_pad,.-xor128_decrypt_n_pad
-+___
-+}
-+
-+# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
-+# CONTEXT *context,DISPATCHER_CONTEXT *disp)
-+if ($win64) {
-+$rec="%rcx";
-+$frame="%rdx";
-+$context="%r8";
-+$disp="%r9";
-+
-+$code.=<<___;
-+.extern __imp_RtlVirtualUnwind
-+.type se_handler,\@abi-omnipotent
-+.align 16
-+se_handler:
-+ push %rsi
-+ push %rdi
-+ push %rbx
-+ push %rbp
-+ push %r12
-+ push %r13
-+ push %r14
-+ push %r15
-+ pushfq
-+ sub \$64,%rsp
-+
-+ mov 120($context),%rax # pull context->Rax
-+ mov 248($context),%rbx # pull context->Rip
-+
-+ mov 8($disp),%rsi # disp->ImageBase
-+ mov 56($disp),%r11 # disp->HandlerData
-+
-+ mov 0(%r11),%r10d # HandlerData[0]
-+ lea (%rsi,%r10),%r10 # prologue label
-+ cmp %r10,%rbx # context->Rip<.Lprologue
-+ jb .Lcommon_seh_tail
-+
-+ mov 152($context),%rax # pull context->Rsp
-+
-+ mov 4(%r11),%r10d # HandlerData[1]
-+ lea (%rsi,%r10),%r10 # epilogue label
-+ cmp %r10,%rbx # context->Rip>=.Lepilogue
-+ jae .Lcommon_seh_tail
-+
-+ lea 48(%rax),%rax
-+
-+ mov -8(%rax),%rbx
-+ mov -16(%rax),%rbp
-+ mov -24(%rax),%r12
-+ mov -32(%rax),%r13
-+ mov -40(%rax),%r14
-+ mov -48(%rax),%r15
-+ mov %rbx,144($context) # restore context->Rbx
-+ mov %rbp,160($context) # restore context->Rbp
-+ mov %r12,216($context) # restore context->R12
-+ mov %r13,224($context) # restore context->R13
-+ mov %r14,232($context) # restore context->R14
-+ mov %r15,240($context) # restore context->R14
-+
-+ jmp .Lcommon_seh_tail
-+.size se_handler,.-se_handler
-+
-+.type avx_handler,\@abi-omnipotent
-+.align 16
-+avx_handler:
-+ push %rsi
-+ push %rdi
-+ push %rbx
-+ push %rbp
-+ push %r12
-+ push %r13
-+ push %r14
-+ push %r15
-+ pushfq
-+ sub \$64,%rsp
-+
-+ mov 120($context),%rax # pull context->Rax
-+ mov 248($context),%rbx # pull context->Rip
-+
-+ mov 8($disp),%rsi # disp->ImageBase
-+ mov 56($disp),%r11 # disp->HandlerData
-+
-+ mov 0(%r11),%r10d # HandlerData[0]
-+ lea (%rsi,%r10),%r10 # prologue label
-+ cmp %r10,%rbx # context->Rip<prologue label
-+ jb .Lcommon_seh_tail
-+
-+ mov 152($context),%rax # pull context->Rsp
-+
-+ mov 4(%r11),%r10d # HandlerData[1]
-+ lea (%rsi,%r10),%r10 # epilogue label
-+ cmp %r10,%rbx # context->Rip>=epilogue label
-+ jae .Lcommon_seh_tail
-+
-+ mov 208($context),%rax # pull context->R11
-+
-+ lea 0x50(%rax),%rsi
-+ lea 0xf8(%rax),%rax
-+ lea 512($context),%rdi # &context.Xmm6
-+ mov \$20,%ecx
-+ .long 0xa548f3fc # cld; rep movsq
-+
-+.Lcommon_seh_tail:
-+ mov 8(%rax),%rdi
-+ mov 16(%rax),%rsi
-+ mov %rax,152($context) # restore context->Rsp
-+ mov %rsi,168($context) # restore context->Rsi
-+ mov %rdi,176($context) # restore context->Rdi
-+
-+ mov 40($disp),%rdi # disp->ContextRecord
-+ mov $context,%rsi # context
-+ mov \$154,%ecx # sizeof(CONTEXT)
-+ .long 0xa548f3fc # cld; rep movsq
-+
-+ mov $disp,%rsi
-+ xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER
-+ mov 8(%rsi),%rdx # arg2, disp->ImageBase
-+ mov 0(%rsi),%r8 # arg3, disp->ControlPc
-+ mov 16(%rsi),%r9 # arg4, disp->FunctionEntry
-+ mov 40(%rsi),%r10 # disp->ContextRecord
-+ lea 56(%rsi),%r11 # &disp->HandlerData
-+ lea 24(%rsi),%r12 # &disp->EstablisherFrame
-+ mov %r10,32(%rsp) # arg5
-+ mov %r11,40(%rsp) # arg6
-+ mov %r12,48(%rsp) # arg7
-+ mov %rcx,56(%rsp) # arg8, (NULL)
-+ call *__imp_RtlVirtualUnwind(%rip)
-+
-+ mov \$1,%eax # ExceptionContinueSearch
-+ add \$64,%rsp
-+ popfq
-+ pop %r15
-+ pop %r14
-+ pop %r13
-+ pop %r12
-+ pop %rbp
-+ pop %rbx
-+ pop %rdi
-+ pop %rsi
-+ ret
-+.size avx_handler,.-avx_handler
-+
-+.section .pdata
-+.align 4
-+ .rva .LSEH_begin_poly1305_init
-+ .rva .LSEH_end_poly1305_init
-+ .rva .LSEH_info_poly1305_init
-+
-+ .rva .LSEH_begin_poly1305_blocks
-+ .rva .LSEH_end_poly1305_blocks
-+ .rva .LSEH_info_poly1305_blocks
-+
-+ .rva .LSEH_begin_poly1305_emit
-+ .rva .LSEH_end_poly1305_emit
-+ .rva .LSEH_info_poly1305_emit
-+___
-+$code.=<<___ if ($avx);
-+ .rva .LSEH_begin_poly1305_blocks_avx
-+ .rva .Lbase2_64_avx
-+ .rva .LSEH_info_poly1305_blocks_avx_1
-+
-+ .rva .Lbase2_64_avx
-+ .rva .Leven_avx
-+ .rva .LSEH_info_poly1305_blocks_avx_2
-+
-+ .rva .Leven_avx
-+ .rva .LSEH_end_poly1305_blocks_avx
-+ .rva .LSEH_info_poly1305_blocks_avx_3
-+
-+ .rva .LSEH_begin_poly1305_emit_avx
-+ .rva .LSEH_end_poly1305_emit_avx
-+ .rva .LSEH_info_poly1305_emit_avx
-+___
-+$code.=<<___ if ($avx>1);
-+ .rva .LSEH_begin_poly1305_blocks_avx2
-+ .rva .Lbase2_64_avx2
-+ .rva .LSEH_info_poly1305_blocks_avx2_1
-+
-+ .rva .Lbase2_64_avx2
-+ .rva .Leven_avx2
-+ .rva .LSEH_info_poly1305_blocks_avx2_2
-+
-+ .rva .Leven_avx2
-+ .rva .LSEH_end_poly1305_blocks_avx2
-+ .rva .LSEH_info_poly1305_blocks_avx2_3
-+___
-+$code.=<<___ if ($avx>2);
-+ .rva .LSEH_begin_poly1305_blocks_avx512
-+ .rva .LSEH_end_poly1305_blocks_avx512
-+ .rva .LSEH_info_poly1305_blocks_avx512
-+___
-+$code.=<<___;
-+.section .xdata
-+.align 8
-+.LSEH_info_poly1305_init:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .LSEH_begin_poly1305_init,.LSEH_begin_poly1305_init
-+
-+.LSEH_info_poly1305_blocks:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .Lblocks_body,.Lblocks_epilogue
-+
-+.LSEH_info_poly1305_emit:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .LSEH_begin_poly1305_emit,.LSEH_begin_poly1305_emit
-+___
-+$code.=<<___ if ($avx);
-+.LSEH_info_poly1305_blocks_avx_1:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .Lblocks_avx_body,.Lblocks_avx_epilogue # HandlerData[]
-+
-+.LSEH_info_poly1305_blocks_avx_2:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .Lbase2_64_avx_body,.Lbase2_64_avx_epilogue # HandlerData[]
-+
-+.LSEH_info_poly1305_blocks_avx_3:
-+ .byte 9,0,0,0
-+ .rva avx_handler
-+ .rva .Ldo_avx_body,.Ldo_avx_epilogue # HandlerData[]
-+
-+.LSEH_info_poly1305_emit_avx:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .LSEH_begin_poly1305_emit_avx,.LSEH_begin_poly1305_emit_avx
-+___
-+$code.=<<___ if ($avx>1);
-+.LSEH_info_poly1305_blocks_avx2_1:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .Lblocks_avx2_body,.Lblocks_avx2_epilogue # HandlerData[]
-+
-+.LSEH_info_poly1305_blocks_avx2_2:
-+ .byte 9,0,0,0
-+ .rva se_handler
-+ .rva .Lbase2_64_avx2_body,.Lbase2_64_avx2_epilogue # HandlerData[]
-+
-+.LSEH_info_poly1305_blocks_avx2_3:
-+ .byte 9,0,0,0
-+ .rva avx_handler
-+ .rva .Ldo_avx2_body,.Ldo_avx2_epilogue # HandlerData[]
-+___
-+$code.=<<___ if ($avx>2);
-+.LSEH_info_poly1305_blocks_avx512:
-+ .byte 9,0,0,0
-+ .rva avx_handler
-+ .rva .Ldo_avx512_body,.Ldo_avx512_epilogue # HandlerData[]
-+___
-+}
-+
-+foreach (split('\n',$code)) {
-+ s/\`([^\`]*)\`/eval($1)/ge;
-+ s/%r([a-z]+)#d/%e$1/g;
-+ s/%r([0-9]+)#d/%r$1d/g;
-+ s/%x#%[yz]/%x/g or s/%y#%z/%y/g or s/%z#%[yz]/%z/g;
-+
-+ print $_,"\n";
-+}
-+close STDOUT;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0043-crypto-x86-poly1305-wire-up-faster-implementations-f.patch b/target/linux/generic/backport-5.4/080-wireguard-0043-crypto-x86-poly1305-wire-up-faster-implementations-f.patch
deleted file mode 100644
index 0fc8348585..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0043-crypto-x86-poly1305-wire-up-faster-implementations-f.patch
+++ /dev/null
@@ -1,2927 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 5 Jan 2020 22:40:48 -0500
-Subject: [PATCH] crypto: x86/poly1305 - wire up faster implementations for
- kernel
-
-commit d7d7b853566254648df59f7ea27ea05952a6cfa8 upstream.
-
-These x86_64 vectorized implementations support AVX, AVX-2, and AVX512F.
-The AVX-512F implementation is disabled on Skylake, due to throttling,
-but it is quite fast on >= Cannonlake.
-
-On the left is cycle counts on a Core i7 6700HQ using the AVX-2
-codepath, comparing this implementation ("new") to the implementation in
-the current crypto api ("old"). On the right are benchmarks on a Xeon
-Gold 5120 using the AVX-512 codepath. The new implementation is faster
-on all benchmarks.
-
- AVX-2 AVX-512
- --------- -----------
-
- size old new size old new
- ---- ---- ---- ---- ---- ----
- 0 70 68 0 74 70
- 16 92 90 16 96 92
- 32 134 104 32 136 106
- 48 172 120 48 184 124
- 64 218 136 64 218 138
- 80 254 158 80 260 160
- 96 298 174 96 300 176
- 112 342 192 112 342 194
- 128 388 212 128 384 212
- 144 428 228 144 420 226
- 160 466 246 160 464 248
- 176 510 264 176 504 264
- 192 550 282 192 544 282
- 208 594 302 208 582 300
- 224 628 316 224 624 318
- 240 676 334 240 662 338
- 256 716 354 256 708 358
- 272 764 374 272 748 372
- 288 802 352 288 788 358
- 304 420 366 304 422 370
- 320 428 360 320 432 364
- 336 484 378 336 486 380
- 352 426 384 352 434 390
- 368 478 400 368 480 408
- 384 488 394 384 490 398
- 400 542 408 400 542 412
- 416 486 416 416 492 426
- 432 534 430 432 538 436
- 448 544 422 448 546 432
- 464 600 438 464 600 448
- 480 540 448 480 548 456
- 496 594 464 496 594 476
- 512 602 456 512 606 470
- 528 656 476 528 656 480
- 544 600 480 544 606 498
- 560 650 494 560 652 512
- 576 664 490 576 662 508
- 592 714 508 592 716 522
- 608 656 514 608 664 538
- 624 708 532 624 710 552
- 640 716 524 640 720 516
- 656 770 536 656 772 526
- 672 716 548 672 722 544
- 688 770 562 688 768 556
- 704 774 552 704 778 556
- 720 826 568 720 832 568
- 736 768 574 736 780 584
- 752 822 592 752 826 600
- 768 830 584 768 836 560
- 784 884 602 784 888 572
- 800 828 610 800 838 588
- 816 884 628 816 884 604
- 832 888 618 832 894 598
- 848 942 632 848 946 612
- 864 884 644 864 896 628
- 880 936 660 880 942 644
- 896 948 652 896 952 608
- 912 1000 664 912 1004 616
- 928 942 676 928 954 634
- 944 994 690 944 1000 646
- 960 1002 680 960 1008 646
- 976 1054 694 976 1062 658
- 992 1002 706 992 1012 674
- 1008 1052 720 1008 1058 690
-
-This commit wires in the prior implementation from Andy, and makes the
-following changes to be suitable for kernel land.
-
- - Some cosmetic and structural changes, like renaming labels to
- .Lname, constants, and other Linux conventions, as well as making
- the code easy for us to maintain moving forward.
-
- - CPU feature checking is done in C by the glue code.
-
- - We avoid jumping into the middle of functions, to appease objtool,
- and instead parameterize shared code.
-
- - We maintain frame pointers so that stack traces make sense.
-
- - We remove the dependency on the perl xlate code, which transforms
- the output into things that assemblers we don't care about use.
-
-Importantly, none of our changes affect the arithmetic or core code, but
-just involve the differing environment of kernel space.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
-Co-developed-by: Samuel Neves <sneves@dei.uc.pt>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/.gitignore | 1 +
- arch/x86/crypto/Makefile | 11 +-
- arch/x86/crypto/poly1305-avx2-x86_64.S | 390 ----------
- arch/x86/crypto/poly1305-sse2-x86_64.S | 590 ---------------
- arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 682 ++++++++++--------
- arch/x86/crypto/poly1305_glue.c | 473 +++++-------
- lib/crypto/Kconfig | 2 +-
- 7 files changed, 572 insertions(+), 1577 deletions(-)
- create mode 100644 arch/x86/crypto/.gitignore
- delete mode 100644 arch/x86/crypto/poly1305-avx2-x86_64.S
- delete mode 100644 arch/x86/crypto/poly1305-sse2-x86_64.S
-
---- /dev/null
-+++ b/arch/x86/crypto/.gitignore
-@@ -0,0 +1 @@
-+poly1305-x86_64.S
---- a/arch/x86/crypto/Makefile
-+++ b/arch/x86/crypto/Makefile
-@@ -73,6 +73,10 @@ aegis128-aesni-y := aegis128-aesni-asm.o
-
- nhpoly1305-sse2-y := nh-sse2-x86_64.o nhpoly1305-sse2-glue.o
- blake2s-x86_64-y := blake2s-core.o blake2s-glue.o
-+poly1305-x86_64-y := poly1305-x86_64-cryptogams.o poly1305_glue.o
-+ifneq ($(CONFIG_CRYPTO_POLY1305_X86_64),)
-+targets += poly1305-x86_64-cryptogams.S
-+endif
-
- ifeq ($(avx_supported),yes)
- camellia-aesni-avx-x86_64-y := camellia-aesni-avx-asm_64.o \
-@@ -101,10 +105,8 @@ aesni-intel-y := aesni-intel_asm.o aesni
- aesni-intel-$(CONFIG_64BIT) += aesni-intel_avx-x86_64.o aes_ctrby8_avx-x86_64.o
- ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o
- sha1-ssse3-y := sha1_ssse3_asm.o sha1_ssse3_glue.o
--poly1305-x86_64-y := poly1305-sse2-x86_64.o poly1305_glue.o
- ifeq ($(avx2_supported),yes)
- sha1-ssse3-y += sha1_avx2_x86_64_asm.o
--poly1305-x86_64-y += poly1305-avx2-x86_64.o
- endif
- ifeq ($(sha1_ni_supported),yes)
- sha1-ssse3-y += sha1_ni_asm.o
-@@ -118,3 +120,8 @@ sha256-ssse3-y += sha256_ni_asm.o
- endif
- sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o
- crct10dif-pclmul-y := crct10dif-pcl-asm_64.o crct10dif-pclmul_glue.o
-+
-+quiet_cmd_perlasm = PERLASM $@
-+ cmd_perlasm = $(PERL) $< > $@
-+$(obj)/%.S: $(src)/%.pl FORCE
-+ $(call if_changed,perlasm)
---- a/arch/x86/crypto/poly1305-avx2-x86_64.S
-+++ /dev/null
-@@ -1,390 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0-or-later */
--/*
-- * Poly1305 authenticator algorithm, RFC7539, x64 AVX2 functions
-- *
-- * Copyright (C) 2015 Martin Willi
-- */
--
--#include <linux/linkage.h>
--
--.section .rodata.cst32.ANMASK, "aM", @progbits, 32
--.align 32
--ANMASK: .octa 0x0000000003ffffff0000000003ffffff
-- .octa 0x0000000003ffffff0000000003ffffff
--
--.section .rodata.cst32.ORMASK, "aM", @progbits, 32
--.align 32
--ORMASK: .octa 0x00000000010000000000000001000000
-- .octa 0x00000000010000000000000001000000
--
--.text
--
--#define h0 0x00(%rdi)
--#define h1 0x04(%rdi)
--#define h2 0x08(%rdi)
--#define h3 0x0c(%rdi)
--#define h4 0x10(%rdi)
--#define r0 0x00(%rdx)
--#define r1 0x04(%rdx)
--#define r2 0x08(%rdx)
--#define r3 0x0c(%rdx)
--#define r4 0x10(%rdx)
--#define u0 0x00(%r8)
--#define u1 0x04(%r8)
--#define u2 0x08(%r8)
--#define u3 0x0c(%r8)
--#define u4 0x10(%r8)
--#define w0 0x18(%r8)
--#define w1 0x1c(%r8)
--#define w2 0x20(%r8)
--#define w3 0x24(%r8)
--#define w4 0x28(%r8)
--#define y0 0x30(%r8)
--#define y1 0x34(%r8)
--#define y2 0x38(%r8)
--#define y3 0x3c(%r8)
--#define y4 0x40(%r8)
--#define m %rsi
--#define hc0 %ymm0
--#define hc1 %ymm1
--#define hc2 %ymm2
--#define hc3 %ymm3
--#define hc4 %ymm4
--#define hc0x %xmm0
--#define hc1x %xmm1
--#define hc2x %xmm2
--#define hc3x %xmm3
--#define hc4x %xmm4
--#define t1 %ymm5
--#define t2 %ymm6
--#define t1x %xmm5
--#define t2x %xmm6
--#define ruwy0 %ymm7
--#define ruwy1 %ymm8
--#define ruwy2 %ymm9
--#define ruwy3 %ymm10
--#define ruwy4 %ymm11
--#define ruwy0x %xmm7
--#define ruwy1x %xmm8
--#define ruwy2x %xmm9
--#define ruwy3x %xmm10
--#define ruwy4x %xmm11
--#define svxz1 %ymm12
--#define svxz2 %ymm13
--#define svxz3 %ymm14
--#define svxz4 %ymm15
--#define d0 %r9
--#define d1 %r10
--#define d2 %r11
--#define d3 %r12
--#define d4 %r13
--
--ENTRY(poly1305_4block_avx2)
-- # %rdi: Accumulator h[5]
-- # %rsi: 64 byte input block m
-- # %rdx: Poly1305 key r[5]
-- # %rcx: Quadblock count
-- # %r8: Poly1305 derived key r^2 u[5], r^3 w[5], r^4 y[5],
--
-- # This four-block variant uses loop unrolled block processing. It
-- # requires 4 Poly1305 keys: r, r^2, r^3 and r^4:
-- # h = (h + m) * r => h = (h + m1) * r^4 + m2 * r^3 + m3 * r^2 + m4 * r
--
-- vzeroupper
-- push %rbx
-- push %r12
-- push %r13
--
-- # combine r0,u0,w0,y0
-- vmovd y0,ruwy0x
-- vmovd w0,t1x
-- vpunpcklqdq t1,ruwy0,ruwy0
-- vmovd u0,t1x
-- vmovd r0,t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,ruwy0,ruwy0
--
-- # combine r1,u1,w1,y1 and s1=r1*5,v1=u1*5,x1=w1*5,z1=y1*5
-- vmovd y1,ruwy1x
-- vmovd w1,t1x
-- vpunpcklqdq t1,ruwy1,ruwy1
-- vmovd u1,t1x
-- vmovd r1,t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,ruwy1,ruwy1
-- vpslld $2,ruwy1,svxz1
-- vpaddd ruwy1,svxz1,svxz1
--
-- # combine r2,u2,w2,y2 and s2=r2*5,v2=u2*5,x2=w2*5,z2=y2*5
-- vmovd y2,ruwy2x
-- vmovd w2,t1x
-- vpunpcklqdq t1,ruwy2,ruwy2
-- vmovd u2,t1x
-- vmovd r2,t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,ruwy2,ruwy2
-- vpslld $2,ruwy2,svxz2
-- vpaddd ruwy2,svxz2,svxz2
--
-- # combine r3,u3,w3,y3 and s3=r3*5,v3=u3*5,x3=w3*5,z3=y3*5
-- vmovd y3,ruwy3x
-- vmovd w3,t1x
-- vpunpcklqdq t1,ruwy3,ruwy3
-- vmovd u3,t1x
-- vmovd r3,t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,ruwy3,ruwy3
-- vpslld $2,ruwy3,svxz3
-- vpaddd ruwy3,svxz3,svxz3
--
-- # combine r4,u4,w4,y4 and s4=r4*5,v4=u4*5,x4=w4*5,z4=y4*5
-- vmovd y4,ruwy4x
-- vmovd w4,t1x
-- vpunpcklqdq t1,ruwy4,ruwy4
-- vmovd u4,t1x
-- vmovd r4,t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,ruwy4,ruwy4
-- vpslld $2,ruwy4,svxz4
-- vpaddd ruwy4,svxz4,svxz4
--
--.Ldoblock4:
-- # hc0 = [m[48-51] & 0x3ffffff, m[32-35] & 0x3ffffff,
-- # m[16-19] & 0x3ffffff, m[ 0- 3] & 0x3ffffff + h0]
-- vmovd 0x00(m),hc0x
-- vmovd 0x10(m),t1x
-- vpunpcklqdq t1,hc0,hc0
-- vmovd 0x20(m),t1x
-- vmovd 0x30(m),t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,hc0,hc0
-- vpand ANMASK(%rip),hc0,hc0
-- vmovd h0,t1x
-- vpaddd t1,hc0,hc0
-- # hc1 = [(m[51-54] >> 2) & 0x3ffffff, (m[35-38] >> 2) & 0x3ffffff,
-- # (m[19-22] >> 2) & 0x3ffffff, (m[ 3- 6] >> 2) & 0x3ffffff + h1]
-- vmovd 0x03(m),hc1x
-- vmovd 0x13(m),t1x
-- vpunpcklqdq t1,hc1,hc1
-- vmovd 0x23(m),t1x
-- vmovd 0x33(m),t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,hc1,hc1
-- vpsrld $2,hc1,hc1
-- vpand ANMASK(%rip),hc1,hc1
-- vmovd h1,t1x
-- vpaddd t1,hc1,hc1
-- # hc2 = [(m[54-57] >> 4) & 0x3ffffff, (m[38-41] >> 4) & 0x3ffffff,
-- # (m[22-25] >> 4) & 0x3ffffff, (m[ 6- 9] >> 4) & 0x3ffffff + h2]
-- vmovd 0x06(m),hc2x
-- vmovd 0x16(m),t1x
-- vpunpcklqdq t1,hc2,hc2
-- vmovd 0x26(m),t1x
-- vmovd 0x36(m),t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,hc2,hc2
-- vpsrld $4,hc2,hc2
-- vpand ANMASK(%rip),hc2,hc2
-- vmovd h2,t1x
-- vpaddd t1,hc2,hc2
-- # hc3 = [(m[57-60] >> 6) & 0x3ffffff, (m[41-44] >> 6) & 0x3ffffff,
-- # (m[25-28] >> 6) & 0x3ffffff, (m[ 9-12] >> 6) & 0x3ffffff + h3]
-- vmovd 0x09(m),hc3x
-- vmovd 0x19(m),t1x
-- vpunpcklqdq t1,hc3,hc3
-- vmovd 0x29(m),t1x
-- vmovd 0x39(m),t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,hc3,hc3
-- vpsrld $6,hc3,hc3
-- vpand ANMASK(%rip),hc3,hc3
-- vmovd h3,t1x
-- vpaddd t1,hc3,hc3
-- # hc4 = [(m[60-63] >> 8) | (1<<24), (m[44-47] >> 8) | (1<<24),
-- # (m[28-31] >> 8) | (1<<24), (m[12-15] >> 8) | (1<<24) + h4]
-- vmovd 0x0c(m),hc4x
-- vmovd 0x1c(m),t1x
-- vpunpcklqdq t1,hc4,hc4
-- vmovd 0x2c(m),t1x
-- vmovd 0x3c(m),t2x
-- vpunpcklqdq t2,t1,t1
-- vperm2i128 $0x20,t1,hc4,hc4
-- vpsrld $8,hc4,hc4
-- vpor ORMASK(%rip),hc4,hc4
-- vmovd h4,t1x
-- vpaddd t1,hc4,hc4
--
-- # t1 = [ hc0[3] * r0, hc0[2] * u0, hc0[1] * w0, hc0[0] * y0 ]
-- vpmuludq hc0,ruwy0,t1
-- # t1 += [ hc1[3] * s4, hc1[2] * v4, hc1[1] * x4, hc1[0] * z4 ]
-- vpmuludq hc1,svxz4,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc2[3] * s3, hc2[2] * v3, hc2[1] * x3, hc2[0] * z3 ]
-- vpmuludq hc2,svxz3,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc3[3] * s2, hc3[2] * v2, hc3[1] * x2, hc3[0] * z2 ]
-- vpmuludq hc3,svxz2,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc4[3] * s1, hc4[2] * v1, hc4[1] * x1, hc4[0] * z1 ]
-- vpmuludq hc4,svxz1,t2
-- vpaddq t2,t1,t1
-- # d0 = t1[0] + t1[1] + t[2] + t[3]
-- vpermq $0xee,t1,t2
-- vpaddq t2,t1,t1
-- vpsrldq $8,t1,t2
-- vpaddq t2,t1,t1
-- vmovq t1x,d0
--
-- # t1 = [ hc0[3] * r1, hc0[2] * u1,hc0[1] * w1, hc0[0] * y1 ]
-- vpmuludq hc0,ruwy1,t1
-- # t1 += [ hc1[3] * r0, hc1[2] * u0, hc1[1] * w0, hc1[0] * y0 ]
-- vpmuludq hc1,ruwy0,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc2[3] * s4, hc2[2] * v4, hc2[1] * x4, hc2[0] * z4 ]
-- vpmuludq hc2,svxz4,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc3[3] * s3, hc3[2] * v3, hc3[1] * x3, hc3[0] * z3 ]
-- vpmuludq hc3,svxz3,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc4[3] * s2, hc4[2] * v2, hc4[1] * x2, hc4[0] * z2 ]
-- vpmuludq hc4,svxz2,t2
-- vpaddq t2,t1,t1
-- # d1 = t1[0] + t1[1] + t1[3] + t1[4]
-- vpermq $0xee,t1,t2
-- vpaddq t2,t1,t1
-- vpsrldq $8,t1,t2
-- vpaddq t2,t1,t1
-- vmovq t1x,d1
--
-- # t1 = [ hc0[3] * r2, hc0[2] * u2, hc0[1] * w2, hc0[0] * y2 ]
-- vpmuludq hc0,ruwy2,t1
-- # t1 += [ hc1[3] * r1, hc1[2] * u1, hc1[1] * w1, hc1[0] * y1 ]
-- vpmuludq hc1,ruwy1,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc2[3] * r0, hc2[2] * u0, hc2[1] * w0, hc2[0] * y0 ]
-- vpmuludq hc2,ruwy0,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc3[3] * s4, hc3[2] * v4, hc3[1] * x4, hc3[0] * z4 ]
-- vpmuludq hc3,svxz4,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc4[3] * s3, hc4[2] * v3, hc4[1] * x3, hc4[0] * z3 ]
-- vpmuludq hc4,svxz3,t2
-- vpaddq t2,t1,t1
-- # d2 = t1[0] + t1[1] + t1[2] + t1[3]
-- vpermq $0xee,t1,t2
-- vpaddq t2,t1,t1
-- vpsrldq $8,t1,t2
-- vpaddq t2,t1,t1
-- vmovq t1x,d2
--
-- # t1 = [ hc0[3] * r3, hc0[2] * u3, hc0[1] * w3, hc0[0] * y3 ]
-- vpmuludq hc0,ruwy3,t1
-- # t1 += [ hc1[3] * r2, hc1[2] * u2, hc1[1] * w2, hc1[0] * y2 ]
-- vpmuludq hc1,ruwy2,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc2[3] * r1, hc2[2] * u1, hc2[1] * w1, hc2[0] * y1 ]
-- vpmuludq hc2,ruwy1,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc3[3] * r0, hc3[2] * u0, hc3[1] * w0, hc3[0] * y0 ]
-- vpmuludq hc3,ruwy0,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc4[3] * s4, hc4[2] * v4, hc4[1] * x4, hc4[0] * z4 ]
-- vpmuludq hc4,svxz4,t2
-- vpaddq t2,t1,t1
-- # d3 = t1[0] + t1[1] + t1[2] + t1[3]
-- vpermq $0xee,t1,t2
-- vpaddq t2,t1,t1
-- vpsrldq $8,t1,t2
-- vpaddq t2,t1,t1
-- vmovq t1x,d3
--
-- # t1 = [ hc0[3] * r4, hc0[2] * u4, hc0[1] * w4, hc0[0] * y4 ]
-- vpmuludq hc0,ruwy4,t1
-- # t1 += [ hc1[3] * r3, hc1[2] * u3, hc1[1] * w3, hc1[0] * y3 ]
-- vpmuludq hc1,ruwy3,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc2[3] * r2, hc2[2] * u2, hc2[1] * w2, hc2[0] * y2 ]
-- vpmuludq hc2,ruwy2,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc3[3] * r1, hc3[2] * u1, hc3[1] * w1, hc3[0] * y1 ]
-- vpmuludq hc3,ruwy1,t2
-- vpaddq t2,t1,t1
-- # t1 += [ hc4[3] * r0, hc4[2] * u0, hc4[1] * w0, hc4[0] * y0 ]
-- vpmuludq hc4,ruwy0,t2
-- vpaddq t2,t1,t1
-- # d4 = t1[0] + t1[1] + t1[2] + t1[3]
-- vpermq $0xee,t1,t2
-- vpaddq t2,t1,t1
-- vpsrldq $8,t1,t2
-- vpaddq t2,t1,t1
-- vmovq t1x,d4
--
-- # Now do a partial reduction mod (2^130)-5, carrying h0 -> h1 -> h2 ->
-- # h3 -> h4 -> h0 -> h1 to get h0,h2,h3,h4 < 2^26 and h1 < 2^26 + a small
-- # amount. Careful: we must not assume the carry bits 'd0 >> 26',
-- # 'd1 >> 26', 'd2 >> 26', 'd3 >> 26', and '(d4 >> 26) * 5' fit in 32-bit
-- # integers. It's true in a single-block implementation, but not here.
--
-- # d1 += d0 >> 26
-- mov d0,%rax
-- shr $26,%rax
-- add %rax,d1
-- # h0 = d0 & 0x3ffffff
-- mov d0,%rbx
-- and $0x3ffffff,%ebx
--
-- # d2 += d1 >> 26
-- mov d1,%rax
-- shr $26,%rax
-- add %rax,d2
-- # h1 = d1 & 0x3ffffff
-- mov d1,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h1
--
-- # d3 += d2 >> 26
-- mov d2,%rax
-- shr $26,%rax
-- add %rax,d3
-- # h2 = d2 & 0x3ffffff
-- mov d2,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h2
--
-- # d4 += d3 >> 26
-- mov d3,%rax
-- shr $26,%rax
-- add %rax,d4
-- # h3 = d3 & 0x3ffffff
-- mov d3,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h3
--
-- # h0 += (d4 >> 26) * 5
-- mov d4,%rax
-- shr $26,%rax
-- lea (%rax,%rax,4),%rax
-- add %rax,%rbx
-- # h4 = d4 & 0x3ffffff
-- mov d4,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h4
--
-- # h1 += h0 >> 26
-- mov %rbx,%rax
-- shr $26,%rax
-- add %eax,h1
-- # h0 = h0 & 0x3ffffff
-- andl $0x3ffffff,%ebx
-- mov %ebx,h0
--
-- add $0x40,m
-- dec %rcx
-- jnz .Ldoblock4
--
-- vzeroupper
-- pop %r13
-- pop %r12
-- pop %rbx
-- ret
--ENDPROC(poly1305_4block_avx2)
---- a/arch/x86/crypto/poly1305-sse2-x86_64.S
-+++ /dev/null
-@@ -1,590 +0,0 @@
--/* SPDX-License-Identifier: GPL-2.0-or-later */
--/*
-- * Poly1305 authenticator algorithm, RFC7539, x64 SSE2 functions
-- *
-- * Copyright (C) 2015 Martin Willi
-- */
--
--#include <linux/linkage.h>
--
--.section .rodata.cst16.ANMASK, "aM", @progbits, 16
--.align 16
--ANMASK: .octa 0x0000000003ffffff0000000003ffffff
--
--.section .rodata.cst16.ORMASK, "aM", @progbits, 16
--.align 16
--ORMASK: .octa 0x00000000010000000000000001000000
--
--.text
--
--#define h0 0x00(%rdi)
--#define h1 0x04(%rdi)
--#define h2 0x08(%rdi)
--#define h3 0x0c(%rdi)
--#define h4 0x10(%rdi)
--#define r0 0x00(%rdx)
--#define r1 0x04(%rdx)
--#define r2 0x08(%rdx)
--#define r3 0x0c(%rdx)
--#define r4 0x10(%rdx)
--#define s1 0x00(%rsp)
--#define s2 0x04(%rsp)
--#define s3 0x08(%rsp)
--#define s4 0x0c(%rsp)
--#define m %rsi
--#define h01 %xmm0
--#define h23 %xmm1
--#define h44 %xmm2
--#define t1 %xmm3
--#define t2 %xmm4
--#define t3 %xmm5
--#define t4 %xmm6
--#define mask %xmm7
--#define d0 %r8
--#define d1 %r9
--#define d2 %r10
--#define d3 %r11
--#define d4 %r12
--
--ENTRY(poly1305_block_sse2)
-- # %rdi: Accumulator h[5]
-- # %rsi: 16 byte input block m
-- # %rdx: Poly1305 key r[5]
-- # %rcx: Block count
--
-- # This single block variant tries to improve performance by doing two
-- # multiplications in parallel using SSE instructions. There is quite
-- # some quardword packing involved, hence the speedup is marginal.
--
-- push %rbx
-- push %r12
-- sub $0x10,%rsp
--
-- # s1..s4 = r1..r4 * 5
-- mov r1,%eax
-- lea (%eax,%eax,4),%eax
-- mov %eax,s1
-- mov r2,%eax
-- lea (%eax,%eax,4),%eax
-- mov %eax,s2
-- mov r3,%eax
-- lea (%eax,%eax,4),%eax
-- mov %eax,s3
-- mov r4,%eax
-- lea (%eax,%eax,4),%eax
-- mov %eax,s4
--
-- movdqa ANMASK(%rip),mask
--
--.Ldoblock:
-- # h01 = [0, h1, 0, h0]
-- # h23 = [0, h3, 0, h2]
-- # h44 = [0, h4, 0, h4]
-- movd h0,h01
-- movd h1,t1
-- movd h2,h23
-- movd h3,t2
-- movd h4,h44
-- punpcklqdq t1,h01
-- punpcklqdq t2,h23
-- punpcklqdq h44,h44
--
-- # h01 += [ (m[3-6] >> 2) & 0x3ffffff, m[0-3] & 0x3ffffff ]
-- movd 0x00(m),t1
-- movd 0x03(m),t2
-- psrld $2,t2
-- punpcklqdq t2,t1
-- pand mask,t1
-- paddd t1,h01
-- # h23 += [ (m[9-12] >> 6) & 0x3ffffff, (m[6-9] >> 4) & 0x3ffffff ]
-- movd 0x06(m),t1
-- movd 0x09(m),t2
-- psrld $4,t1
-- psrld $6,t2
-- punpcklqdq t2,t1
-- pand mask,t1
-- paddd t1,h23
-- # h44 += [ (m[12-15] >> 8) | (1 << 24), (m[12-15] >> 8) | (1 << 24) ]
-- mov 0x0c(m),%eax
-- shr $8,%eax
-- or $0x01000000,%eax
-- movd %eax,t1
-- pshufd $0xc4,t1,t1
-- paddd t1,h44
--
-- # t1[0] = h0 * r0 + h2 * s3
-- # t1[1] = h1 * s4 + h3 * s2
-- movd r0,t1
-- movd s4,t2
-- punpcklqdq t2,t1
-- pmuludq h01,t1
-- movd s3,t2
-- movd s2,t3
-- punpcklqdq t3,t2
-- pmuludq h23,t2
-- paddq t2,t1
-- # t2[0] = h0 * r1 + h2 * s4
-- # t2[1] = h1 * r0 + h3 * s3
-- movd r1,t2
-- movd r0,t3
-- punpcklqdq t3,t2
-- pmuludq h01,t2
-- movd s4,t3
-- movd s3,t4
-- punpcklqdq t4,t3
-- pmuludq h23,t3
-- paddq t3,t2
-- # t3[0] = h4 * s1
-- # t3[1] = h4 * s2
-- movd s1,t3
-- movd s2,t4
-- punpcklqdq t4,t3
-- pmuludq h44,t3
-- # d0 = t1[0] + t1[1] + t3[0]
-- # d1 = t2[0] + t2[1] + t3[1]
-- movdqa t1,t4
-- punpcklqdq t2,t4
-- punpckhqdq t2,t1
-- paddq t4,t1
-- paddq t3,t1
-- movq t1,d0
-- psrldq $8,t1
-- movq t1,d1
--
-- # t1[0] = h0 * r2 + h2 * r0
-- # t1[1] = h1 * r1 + h3 * s4
-- movd r2,t1
-- movd r1,t2
-- punpcklqdq t2,t1
-- pmuludq h01,t1
-- movd r0,t2
-- movd s4,t3
-- punpcklqdq t3,t2
-- pmuludq h23,t2
-- paddq t2,t1
-- # t2[0] = h0 * r3 + h2 * r1
-- # t2[1] = h1 * r2 + h3 * r0
-- movd r3,t2
-- movd r2,t3
-- punpcklqdq t3,t2
-- pmuludq h01,t2
-- movd r1,t3
-- movd r0,t4
-- punpcklqdq t4,t3
-- pmuludq h23,t3
-- paddq t3,t2
-- # t3[0] = h4 * s3
-- # t3[1] = h4 * s4
-- movd s3,t3
-- movd s4,t4
-- punpcklqdq t4,t3
-- pmuludq h44,t3
-- # d2 = t1[0] + t1[1] + t3[0]
-- # d3 = t2[0] + t2[1] + t3[1]
-- movdqa t1,t4
-- punpcklqdq t2,t4
-- punpckhqdq t2,t1
-- paddq t4,t1
-- paddq t3,t1
-- movq t1,d2
-- psrldq $8,t1
-- movq t1,d3
--
-- # t1[0] = h0 * r4 + h2 * r2
-- # t1[1] = h1 * r3 + h3 * r1
-- movd r4,t1
-- movd r3,t2
-- punpcklqdq t2,t1
-- pmuludq h01,t1
-- movd r2,t2
-- movd r1,t3
-- punpcklqdq t3,t2
-- pmuludq h23,t2
-- paddq t2,t1
-- # t3[0] = h4 * r0
-- movd r0,t3
-- pmuludq h44,t3
-- # d4 = t1[0] + t1[1] + t3[0]
-- movdqa t1,t4
-- psrldq $8,t4
-- paddq t4,t1
-- paddq t3,t1
-- movq t1,d4
--
-- # d1 += d0 >> 26
-- mov d0,%rax
-- shr $26,%rax
-- add %rax,d1
-- # h0 = d0 & 0x3ffffff
-- mov d0,%rbx
-- and $0x3ffffff,%ebx
--
-- # d2 += d1 >> 26
-- mov d1,%rax
-- shr $26,%rax
-- add %rax,d2
-- # h1 = d1 & 0x3ffffff
-- mov d1,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h1
--
-- # d3 += d2 >> 26
-- mov d2,%rax
-- shr $26,%rax
-- add %rax,d3
-- # h2 = d2 & 0x3ffffff
-- mov d2,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h2
--
-- # d4 += d3 >> 26
-- mov d3,%rax
-- shr $26,%rax
-- add %rax,d4
-- # h3 = d3 & 0x3ffffff
-- mov d3,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h3
--
-- # h0 += (d4 >> 26) * 5
-- mov d4,%rax
-- shr $26,%rax
-- lea (%rax,%rax,4),%rax
-- add %rax,%rbx
-- # h4 = d4 & 0x3ffffff
-- mov d4,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h4
--
-- # h1 += h0 >> 26
-- mov %rbx,%rax
-- shr $26,%rax
-- add %eax,h1
-- # h0 = h0 & 0x3ffffff
-- andl $0x3ffffff,%ebx
-- mov %ebx,h0
--
-- add $0x10,m
-- dec %rcx
-- jnz .Ldoblock
--
-- # Zeroing of key material
-- mov %rcx,0x00(%rsp)
-- mov %rcx,0x08(%rsp)
--
-- add $0x10,%rsp
-- pop %r12
-- pop %rbx
-- ret
--ENDPROC(poly1305_block_sse2)
--
--
--#define u0 0x00(%r8)
--#define u1 0x04(%r8)
--#define u2 0x08(%r8)
--#define u3 0x0c(%r8)
--#define u4 0x10(%r8)
--#define hc0 %xmm0
--#define hc1 %xmm1
--#define hc2 %xmm2
--#define hc3 %xmm5
--#define hc4 %xmm6
--#define ru0 %xmm7
--#define ru1 %xmm8
--#define ru2 %xmm9
--#define ru3 %xmm10
--#define ru4 %xmm11
--#define sv1 %xmm12
--#define sv2 %xmm13
--#define sv3 %xmm14
--#define sv4 %xmm15
--#undef d0
--#define d0 %r13
--
--ENTRY(poly1305_2block_sse2)
-- # %rdi: Accumulator h[5]
-- # %rsi: 16 byte input block m
-- # %rdx: Poly1305 key r[5]
-- # %rcx: Doubleblock count
-- # %r8: Poly1305 derived key r^2 u[5]
--
-- # This two-block variant further improves performance by using loop
-- # unrolled block processing. This is more straight forward and does
-- # less byte shuffling, but requires a second Poly1305 key r^2:
-- # h = (h + m) * r => h = (h + m1) * r^2 + m2 * r
--
-- push %rbx
-- push %r12
-- push %r13
--
-- # combine r0,u0
-- movd u0,ru0
-- movd r0,t1
-- punpcklqdq t1,ru0
--
-- # combine r1,u1 and s1=r1*5,v1=u1*5
-- movd u1,ru1
-- movd r1,t1
-- punpcklqdq t1,ru1
-- movdqa ru1,sv1
-- pslld $2,sv1
-- paddd ru1,sv1
--
-- # combine r2,u2 and s2=r2*5,v2=u2*5
-- movd u2,ru2
-- movd r2,t1
-- punpcklqdq t1,ru2
-- movdqa ru2,sv2
-- pslld $2,sv2
-- paddd ru2,sv2
--
-- # combine r3,u3 and s3=r3*5,v3=u3*5
-- movd u3,ru3
-- movd r3,t1
-- punpcklqdq t1,ru3
-- movdqa ru3,sv3
-- pslld $2,sv3
-- paddd ru3,sv3
--
-- # combine r4,u4 and s4=r4*5,v4=u4*5
-- movd u4,ru4
-- movd r4,t1
-- punpcklqdq t1,ru4
-- movdqa ru4,sv4
-- pslld $2,sv4
-- paddd ru4,sv4
--
--.Ldoblock2:
-- # hc0 = [ m[16-19] & 0x3ffffff, h0 + m[0-3] & 0x3ffffff ]
-- movd 0x00(m),hc0
-- movd 0x10(m),t1
-- punpcklqdq t1,hc0
-- pand ANMASK(%rip),hc0
-- movd h0,t1
-- paddd t1,hc0
-- # hc1 = [ (m[19-22] >> 2) & 0x3ffffff, h1 + (m[3-6] >> 2) & 0x3ffffff ]
-- movd 0x03(m),hc1
-- movd 0x13(m),t1
-- punpcklqdq t1,hc1
-- psrld $2,hc1
-- pand ANMASK(%rip),hc1
-- movd h1,t1
-- paddd t1,hc1
-- # hc2 = [ (m[22-25] >> 4) & 0x3ffffff, h2 + (m[6-9] >> 4) & 0x3ffffff ]
-- movd 0x06(m),hc2
-- movd 0x16(m),t1
-- punpcklqdq t1,hc2
-- psrld $4,hc2
-- pand ANMASK(%rip),hc2
-- movd h2,t1
-- paddd t1,hc2
-- # hc3 = [ (m[25-28] >> 6) & 0x3ffffff, h3 + (m[9-12] >> 6) & 0x3ffffff ]
-- movd 0x09(m),hc3
-- movd 0x19(m),t1
-- punpcklqdq t1,hc3
-- psrld $6,hc3
-- pand ANMASK(%rip),hc3
-- movd h3,t1
-- paddd t1,hc3
-- # hc4 = [ (m[28-31] >> 8) | (1<<24), h4 + (m[12-15] >> 8) | (1<<24) ]
-- movd 0x0c(m),hc4
-- movd 0x1c(m),t1
-- punpcklqdq t1,hc4
-- psrld $8,hc4
-- por ORMASK(%rip),hc4
-- movd h4,t1
-- paddd t1,hc4
--
-- # t1 = [ hc0[1] * r0, hc0[0] * u0 ]
-- movdqa ru0,t1
-- pmuludq hc0,t1
-- # t1 += [ hc1[1] * s4, hc1[0] * v4 ]
-- movdqa sv4,t2
-- pmuludq hc1,t2
-- paddq t2,t1
-- # t1 += [ hc2[1] * s3, hc2[0] * v3 ]
-- movdqa sv3,t2
-- pmuludq hc2,t2
-- paddq t2,t1
-- # t1 += [ hc3[1] * s2, hc3[0] * v2 ]
-- movdqa sv2,t2
-- pmuludq hc3,t2
-- paddq t2,t1
-- # t1 += [ hc4[1] * s1, hc4[0] * v1 ]
-- movdqa sv1,t2
-- pmuludq hc4,t2
-- paddq t2,t1
-- # d0 = t1[0] + t1[1]
-- movdqa t1,t2
-- psrldq $8,t2
-- paddq t2,t1
-- movq t1,d0
--
-- # t1 = [ hc0[1] * r1, hc0[0] * u1 ]
-- movdqa ru1,t1
-- pmuludq hc0,t1
-- # t1 += [ hc1[1] * r0, hc1[0] * u0 ]
-- movdqa ru0,t2
-- pmuludq hc1,t2
-- paddq t2,t1
-- # t1 += [ hc2[1] * s4, hc2[0] * v4 ]
-- movdqa sv4,t2
-- pmuludq hc2,t2
-- paddq t2,t1
-- # t1 += [ hc3[1] * s3, hc3[0] * v3 ]
-- movdqa sv3,t2
-- pmuludq hc3,t2
-- paddq t2,t1
-- # t1 += [ hc4[1] * s2, hc4[0] * v2 ]
-- movdqa sv2,t2
-- pmuludq hc4,t2
-- paddq t2,t1
-- # d1 = t1[0] + t1[1]
-- movdqa t1,t2
-- psrldq $8,t2
-- paddq t2,t1
-- movq t1,d1
--
-- # t1 = [ hc0[1] * r2, hc0[0] * u2 ]
-- movdqa ru2,t1
-- pmuludq hc0,t1
-- # t1 += [ hc1[1] * r1, hc1[0] * u1 ]
-- movdqa ru1,t2
-- pmuludq hc1,t2
-- paddq t2,t1
-- # t1 += [ hc2[1] * r0, hc2[0] * u0 ]
-- movdqa ru0,t2
-- pmuludq hc2,t2
-- paddq t2,t1
-- # t1 += [ hc3[1] * s4, hc3[0] * v4 ]
-- movdqa sv4,t2
-- pmuludq hc3,t2
-- paddq t2,t1
-- # t1 += [ hc4[1] * s3, hc4[0] * v3 ]
-- movdqa sv3,t2
-- pmuludq hc4,t2
-- paddq t2,t1
-- # d2 = t1[0] + t1[1]
-- movdqa t1,t2
-- psrldq $8,t2
-- paddq t2,t1
-- movq t1,d2
--
-- # t1 = [ hc0[1] * r3, hc0[0] * u3 ]
-- movdqa ru3,t1
-- pmuludq hc0,t1
-- # t1 += [ hc1[1] * r2, hc1[0] * u2 ]
-- movdqa ru2,t2
-- pmuludq hc1,t2
-- paddq t2,t1
-- # t1 += [ hc2[1] * r1, hc2[0] * u1 ]
-- movdqa ru1,t2
-- pmuludq hc2,t2
-- paddq t2,t1
-- # t1 += [ hc3[1] * r0, hc3[0] * u0 ]
-- movdqa ru0,t2
-- pmuludq hc3,t2
-- paddq t2,t1
-- # t1 += [ hc4[1] * s4, hc4[0] * v4 ]
-- movdqa sv4,t2
-- pmuludq hc4,t2
-- paddq t2,t1
-- # d3 = t1[0] + t1[1]
-- movdqa t1,t2
-- psrldq $8,t2
-- paddq t2,t1
-- movq t1,d3
--
-- # t1 = [ hc0[1] * r4, hc0[0] * u4 ]
-- movdqa ru4,t1
-- pmuludq hc0,t1
-- # t1 += [ hc1[1] * r3, hc1[0] * u3 ]
-- movdqa ru3,t2
-- pmuludq hc1,t2
-- paddq t2,t1
-- # t1 += [ hc2[1] * r2, hc2[0] * u2 ]
-- movdqa ru2,t2
-- pmuludq hc2,t2
-- paddq t2,t1
-- # t1 += [ hc3[1] * r1, hc3[0] * u1 ]
-- movdqa ru1,t2
-- pmuludq hc3,t2
-- paddq t2,t1
-- # t1 += [ hc4[1] * r0, hc4[0] * u0 ]
-- movdqa ru0,t2
-- pmuludq hc4,t2
-- paddq t2,t1
-- # d4 = t1[0] + t1[1]
-- movdqa t1,t2
-- psrldq $8,t2
-- paddq t2,t1
-- movq t1,d4
--
-- # Now do a partial reduction mod (2^130)-5, carrying h0 -> h1 -> h2 ->
-- # h3 -> h4 -> h0 -> h1 to get h0,h2,h3,h4 < 2^26 and h1 < 2^26 + a small
-- # amount. Careful: we must not assume the carry bits 'd0 >> 26',
-- # 'd1 >> 26', 'd2 >> 26', 'd3 >> 26', and '(d4 >> 26) * 5' fit in 32-bit
-- # integers. It's true in a single-block implementation, but not here.
--
-- # d1 += d0 >> 26
-- mov d0,%rax
-- shr $26,%rax
-- add %rax,d1
-- # h0 = d0 & 0x3ffffff
-- mov d0,%rbx
-- and $0x3ffffff,%ebx
--
-- # d2 += d1 >> 26
-- mov d1,%rax
-- shr $26,%rax
-- add %rax,d2
-- # h1 = d1 & 0x3ffffff
-- mov d1,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h1
--
-- # d3 += d2 >> 26
-- mov d2,%rax
-- shr $26,%rax
-- add %rax,d3
-- # h2 = d2 & 0x3ffffff
-- mov d2,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h2
--
-- # d4 += d3 >> 26
-- mov d3,%rax
-- shr $26,%rax
-- add %rax,d4
-- # h3 = d3 & 0x3ffffff
-- mov d3,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h3
--
-- # h0 += (d4 >> 26) * 5
-- mov d4,%rax
-- shr $26,%rax
-- lea (%rax,%rax,4),%rax
-- add %rax,%rbx
-- # h4 = d4 & 0x3ffffff
-- mov d4,%rax
-- and $0x3ffffff,%eax
-- mov %eax,h4
--
-- # h1 += h0 >> 26
-- mov %rbx,%rax
-- shr $26,%rax
-- add %eax,h1
-- # h0 = h0 & 0x3ffffff
-- andl $0x3ffffff,%ebx
-- mov %ebx,h0
--
-- add $0x20,m
-- dec %rcx
-- jnz .Ldoblock2
--
-- pop %r13
-- pop %r12
-- pop %rbx
-- ret
--ENDPROC(poly1305_2block_sse2)
---- a/arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-+++ b/arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-@@ -1,11 +1,14 @@
--#! /usr/bin/env perl
--# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved.
-+#!/usr/bin/env perl
-+# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
- #
--# Licensed under the OpenSSL license (the "License"). You may not use
--# this file except in compliance with the License. You can obtain a copy
--# in the file LICENSE in the source distribution or at
--# https://www.openssl.org/source/license.html
--
-+# Copyright (C) 2017-2018 Samuel Neves <sneves@dei.uc.pt>. All Rights Reserved.
-+# Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+# Copyright (C) 2006-2017 CRYPTOGAMS by <appro@openssl.org>. All Rights Reserved.
-+#
-+# This code is taken from the OpenSSL project but the author, Andy Polyakov,
-+# has relicensed it under the licenses specified in the SPDX header above.
-+# The original headers, including the original license headers, are
-+# included below for completeness.
- #
- # ====================================================================
- # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
-@@ -32,7 +35,7 @@
- # Skylake-X system performance. Since we are likely to suppress
- # AVX512F capability flag [at least on Skylake-X], conversion serves
- # as kind of "investment protection". Note that next *lake processor,
--# Cannolake, has AVX512IFMA code path to execute...
-+# Cannonlake, has AVX512IFMA code path to execute...
- #
- # Numbers are cycles per processed byte with poly1305_blocks alone,
- # measured with rdtsc at fixed clock frequency.
-@@ -68,39 +71,114 @@ $output = shift;
- if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
-
- $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
-+$kernel=0; $kernel=1 if (!$flavour && !$output);
-
--$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
--( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
--( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
--die "can't locate x86_64-xlate.pl";
--
--if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
-- =~ /GNU assembler version ([2-9]\.[0-9]+)/) {
-- $avx = ($1>=2.19) + ($1>=2.22) + ($1>=2.25) + ($1>=2.26);
-+if (!$kernel) {
-+ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-+ ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-+ ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
-+ die "can't locate x86_64-xlate.pl";
-+
-+ open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
-+ *STDOUT=*OUT;
-+
-+ if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
-+ =~ /GNU assembler version ([2-9]\.[0-9]+)/) {
-+ $avx = ($1>=2.19) + ($1>=2.22) + ($1>=2.25);
-+ }
-+
-+ if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
-+ `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) {
-+ $avx = ($1>=2.09) + ($1>=2.10) + ($1>=2.12);
-+ $avx += 1 if ($1==2.11 && $2>=8);
-+ }
-+
-+ if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
-+ `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-+ $avx = ($1>=10) + ($1>=11);
-+ }
-+
-+ if (!$avx && `$ENV{CC} -v 2>&1` =~ /((?:^clang|LLVM) version|.*based on LLVM) ([3-9]\.[0-9]+)/) {
-+ $avx = ($2>=3.0) + ($2>3.0);
-+ }
-+} else {
-+ $avx = 4; # The kernel uses ifdefs for this.
- }
-
--if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) &&
-- `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)(?:\.([0-9]+))?/) {
-- $avx = ($1>=2.09) + ($1>=2.10) + 2 * ($1>=2.12);
-- $avx += 2 if ($1==2.11 && $2>=8);
-+sub declare_function() {
-+ my ($name, $align, $nargs) = @_;
-+ if($kernel) {
-+ $code .= ".align $align\n";
-+ $code .= "ENTRY($name)\n";
-+ $code .= ".L$name:\n";
-+ } else {
-+ $code .= ".globl $name\n";
-+ $code .= ".type $name,\@function,$nargs\n";
-+ $code .= ".align $align\n";
-+ $code .= "$name:\n";
-+ }
- }
-
--if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) &&
-- `ml64 2>&1` =~ /Version ([0-9]+)\./) {
-- $avx = ($1>=10) + ($1>=12);
-+sub end_function() {
-+ my ($name) = @_;
-+ if($kernel) {
-+ $code .= "ENDPROC($name)\n";
-+ } else {
-+ $code .= ".size $name,.-$name\n";
-+ }
- }
-
--if (!$avx && `$ENV{CC} -v 2>&1` =~ /((?:^clang|LLVM) version|.*based on LLVM) ([3-9]\.[0-9]+)/) {
-- $avx = ($2>=3.0) + ($2>3.0);
--}
-+$code.=<<___ if $kernel;
-+#include <linux/linkage.h>
-+___
-
--open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
--*STDOUT=*OUT;
-+if ($avx) {
-+$code.=<<___ if $kernel;
-+.section .rodata
-+___
-+$code.=<<___;
-+.align 64
-+.Lconst:
-+.Lmask24:
-+.long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0
-+.L129:
-+.long `1<<24`,0,`1<<24`,0,`1<<24`,0,`1<<24`,0
-+.Lmask26:
-+.long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0
-+.Lpermd_avx2:
-+.long 2,2,2,3,2,0,2,1
-+.Lpermd_avx512:
-+.long 0,0,0,1, 0,2,0,3, 0,4,0,5, 0,6,0,7
-+
-+.L2_44_inp_permd:
-+.long 0,1,1,2,2,3,7,7
-+.L2_44_inp_shift:
-+.quad 0,12,24,64
-+.L2_44_mask:
-+.quad 0xfffffffffff,0xfffffffffff,0x3ffffffffff,0xffffffffffffffff
-+.L2_44_shift_rgt:
-+.quad 44,44,42,64
-+.L2_44_shift_lft:
-+.quad 8,8,10,64
-+
-+.align 64
-+.Lx_mask44:
-+.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
-+.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
-+.Lx_mask42:
-+.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
-+.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
-+___
-+}
-+$code.=<<___ if (!$kernel);
-+.asciz "Poly1305 for x86_64, CRYPTOGAMS by <appro\@openssl.org>"
-+.align 16
-+___
-
- my ($ctx,$inp,$len,$padbit)=("%rdi","%rsi","%rdx","%rcx");
- my ($mac,$nonce)=($inp,$len); # *_emit arguments
--my ($d1,$d2,$d3, $r0,$r1,$s1)=map("%r$_",(8..13));
--my ($h0,$h1,$h2)=("%r14","%rbx","%rbp");
-+my ($d1,$d2,$d3, $r0,$r1,$s1)=("%r8","%r9","%rdi","%r11","%r12","%r13");
-+my ($h0,$h1,$h2)=("%r14","%rbx","%r10");
-
- sub poly1305_iteration {
- # input: copy of $r1 in %rax, $h0-$h2, $r0-$r1
-@@ -155,19 +233,19 @@ ___
-
- $code.=<<___;
- .text
--
-+___
-+$code.=<<___ if (!$kernel);
- .extern OPENSSL_ia32cap_P
-
--.globl poly1305_init
--.hidden poly1305_init
--.globl poly1305_blocks
--.hidden poly1305_blocks
--.globl poly1305_emit
--.hidden poly1305_emit
--
--.type poly1305_init,\@function,3
--.align 32
--poly1305_init:
-+.globl poly1305_init_x86_64
-+.hidden poly1305_init_x86_64
-+.globl poly1305_blocks_x86_64
-+.hidden poly1305_blocks_x86_64
-+.globl poly1305_emit_x86_64
-+.hidden poly1305_emit_x86_64
-+___
-+&declare_function("poly1305_init_x86_64", 32, 3);
-+$code.=<<___;
- xor %rax,%rax
- mov %rax,0($ctx) # initialize hash value
- mov %rax,8($ctx)
-@@ -175,11 +253,12 @@ poly1305_init:
-
- cmp \$0,$inp
- je .Lno_key
--
-- lea poly1305_blocks(%rip),%r10
-- lea poly1305_emit(%rip),%r11
- ___
--$code.=<<___ if ($avx);
-+$code.=<<___ if (!$kernel);
-+ lea poly1305_blocks_x86_64(%rip),%r10
-+ lea poly1305_emit_x86_64(%rip),%r11
-+___
-+$code.=<<___ if (!$kernel && $avx);
- mov OPENSSL_ia32cap_P+4(%rip),%r9
- lea poly1305_blocks_avx(%rip),%rax
- lea poly1305_emit_avx(%rip),%rcx
-@@ -187,12 +266,12 @@ $code.=<<___ if ($avx);
- cmovc %rax,%r10
- cmovc %rcx,%r11
- ___
--$code.=<<___ if ($avx>1);
-+$code.=<<___ if (!$kernel && $avx>1);
- lea poly1305_blocks_avx2(%rip),%rax
- bt \$`5+32`,%r9 # AVX2?
- cmovc %rax,%r10
- ___
--$code.=<<___ if ($avx>3);
-+$code.=<<___ if (!$kernel && $avx>3);
- mov \$`(1<<31|1<<21|1<<16)`,%rax
- shr \$32,%r9
- and %rax,%r9
-@@ -207,11 +286,11 @@ $code.=<<___;
- mov %rax,24($ctx)
- mov %rcx,32($ctx)
- ___
--$code.=<<___ if ($flavour !~ /elf32/);
-+$code.=<<___ if (!$kernel && $flavour !~ /elf32/);
- mov %r10,0(%rdx)
- mov %r11,8(%rdx)
- ___
--$code.=<<___ if ($flavour =~ /elf32/);
-+$code.=<<___ if (!$kernel && $flavour =~ /elf32/);
- mov %r10d,0(%rdx)
- mov %r11d,4(%rdx)
- ___
-@@ -219,11 +298,11 @@ $code.=<<___;
- mov \$1,%eax
- .Lno_key:
- ret
--.size poly1305_init,.-poly1305_init
-+___
-+&end_function("poly1305_init_x86_64");
-
--.type poly1305_blocks,\@function,4
--.align 32
--poly1305_blocks:
-+&declare_function("poly1305_blocks_x86_64", 32, 4);
-+$code.=<<___;
- .cfi_startproc
- .Lblocks:
- shr \$4,$len
-@@ -231,8 +310,6 @@ poly1305_blocks:
-
- push %rbx
- .cfi_push %rbx
-- push %rbp
--.cfi_push %rbp
- push %r12
- .cfi_push %r12
- push %r13
-@@ -241,6 +318,8 @@ poly1305_blocks:
- .cfi_push %r14
- push %r15
- .cfi_push %r15
-+ push $ctx
-+.cfi_push $ctx
- .Lblocks_body:
-
- mov $len,%r15 # reassign $len
-@@ -265,26 +344,29 @@ poly1305_blocks:
- lea 16($inp),$inp
- adc $padbit,$h2
- ___
-+
- &poly1305_iteration();
-+
- $code.=<<___;
- mov $r1,%rax
- dec %r15 # len-=16
- jnz .Loop
-
-+ mov 0(%rsp),$ctx
-+.cfi_restore $ctx
-+
- mov $h0,0($ctx) # store hash value
- mov $h1,8($ctx)
- mov $h2,16($ctx)
-
-- mov 0(%rsp),%r15
-+ mov 8(%rsp),%r15
- .cfi_restore %r15
-- mov 8(%rsp),%r14
-+ mov 16(%rsp),%r14
- .cfi_restore %r14
-- mov 16(%rsp),%r13
-+ mov 24(%rsp),%r13
- .cfi_restore %r13
-- mov 24(%rsp),%r12
-+ mov 32(%rsp),%r12
- .cfi_restore %r12
-- mov 32(%rsp),%rbp
--.cfi_restore %rbp
- mov 40(%rsp),%rbx
- .cfi_restore %rbx
- lea 48(%rsp),%rsp
-@@ -293,11 +375,11 @@ $code.=<<___;
- .Lblocks_epilogue:
- ret
- .cfi_endproc
--.size poly1305_blocks,.-poly1305_blocks
-+___
-+&end_function("poly1305_blocks_x86_64");
-
--.type poly1305_emit,\@function,3
--.align 32
--poly1305_emit:
-+&declare_function("poly1305_emit_x86_64", 32, 3);
-+$code.=<<___;
- .Lemit:
- mov 0($ctx),%r8 # load hash value
- mov 8($ctx),%r9
-@@ -318,10 +400,14 @@ poly1305_emit:
- mov %rcx,8($mac)
-
- ret
--.size poly1305_emit,.-poly1305_emit
- ___
-+&end_function("poly1305_emit_x86_64");
- if ($avx) {
-
-+if($kernel) {
-+ $code .= "#ifdef CONFIG_AS_AVX\n";
-+}
-+
- ########################################################################
- # Layout of opaque area is following.
- #
-@@ -342,15 +428,19 @@ $code.=<<___;
- .type __poly1305_block,\@abi-omnipotent
- .align 32
- __poly1305_block:
-+ push $ctx
- ___
- &poly1305_iteration();
- $code.=<<___;
-+ pop $ctx
- ret
- .size __poly1305_block,.-__poly1305_block
-
- .type __poly1305_init_avx,\@abi-omnipotent
- .align 32
- __poly1305_init_avx:
-+ push %rbp
-+ mov %rsp,%rbp
- mov $r0,$h0
- mov $r1,$h1
- xor $h2,$h2
-@@ -507,12 +597,13 @@ __poly1305_init_avx:
- mov $d1#d,`16*8+8-64`($ctx)
-
- lea -48-64($ctx),$ctx # size [de-]optimization
-+ pop %rbp
- ret
- .size __poly1305_init_avx,.-__poly1305_init_avx
-+___
-
--.type poly1305_blocks_avx,\@function,4
--.align 32
--poly1305_blocks_avx:
-+&declare_function("poly1305_blocks_avx", 32, 4);
-+$code.=<<___;
- .cfi_startproc
- mov 20($ctx),%r8d # is_base2_26
- cmp \$128,$len
-@@ -532,10 +623,11 @@ poly1305_blocks_avx:
- test \$31,$len
- jz .Leven_avx
-
-- push %rbx
--.cfi_push %rbx
- push %rbp
- .cfi_push %rbp
-+ mov %rsp,%rbp
-+ push %rbx
-+.cfi_push %rbx
- push %r12
- .cfi_push %r12
- push %r13
-@@ -645,20 +737,18 @@ poly1305_blocks_avx:
- mov $h2#d,16($ctx)
- .align 16
- .Ldone_avx:
-- mov 0(%rsp),%r15
-+ pop %r15
- .cfi_restore %r15
-- mov 8(%rsp),%r14
-+ pop %r14
- .cfi_restore %r14
-- mov 16(%rsp),%r13
-+ pop %r13
- .cfi_restore %r13
-- mov 24(%rsp),%r12
-+ pop %r12
- .cfi_restore %r12
-- mov 32(%rsp),%rbp
--.cfi_restore %rbp
-- mov 40(%rsp),%rbx
-+ pop %rbx
- .cfi_restore %rbx
-- lea 48(%rsp),%rsp
--.cfi_adjust_cfa_offset -48
-+ pop %rbp
-+.cfi_restore %rbp
- .Lno_data_avx:
- .Lblocks_avx_epilogue:
- ret
-@@ -667,10 +757,11 @@ poly1305_blocks_avx:
- .align 32
- .Lbase2_64_avx:
- .cfi_startproc
-- push %rbx
--.cfi_push %rbx
- push %rbp
- .cfi_push %rbp
-+ mov %rsp,%rbp
-+ push %rbx
-+.cfi_push %rbx
- push %r12
- .cfi_push %r12
- push %r13
-@@ -736,22 +827,18 @@ poly1305_blocks_avx:
-
- .Lproceed_avx:
- mov %r15,$len
--
-- mov 0(%rsp),%r15
-+ pop %r15
- .cfi_restore %r15
-- mov 8(%rsp),%r14
-+ pop %r14
- .cfi_restore %r14
-- mov 16(%rsp),%r13
-+ pop %r13
- .cfi_restore %r13
-- mov 24(%rsp),%r12
-+ pop %r12
- .cfi_restore %r12
-- mov 32(%rsp),%rbp
--.cfi_restore %rbp
-- mov 40(%rsp),%rbx
-+ pop %rbx
- .cfi_restore %rbx
-- lea 48(%rsp),%rax
-- lea 48(%rsp),%rsp
--.cfi_adjust_cfa_offset -48
-+ pop %rbp
-+.cfi_restore %rbp
- .Lbase2_64_avx_epilogue:
- jmp .Ldo_avx
- .cfi_endproc
-@@ -768,8 +855,11 @@ poly1305_blocks_avx:
- .Ldo_avx:
- ___
- $code.=<<___ if (!$win64);
-+ lea 8(%rsp),%r10
-+.cfi_def_cfa_register %r10
-+ and \$-32,%rsp
-+ sub \$-8,%rsp
- lea -0x58(%rsp),%r11
--.cfi_def_cfa %r11,0x60
- sub \$0x178,%rsp
- ___
- $code.=<<___ if ($win64);
-@@ -1361,18 +1451,18 @@ $code.=<<___ if ($win64);
- .Ldo_avx_epilogue:
- ___
- $code.=<<___ if (!$win64);
-- lea 0x58(%r11),%rsp
--.cfi_def_cfa %rsp,8
-+ lea -8(%r10),%rsp
-+.cfi_def_cfa_register %rsp
- ___
- $code.=<<___;
- vzeroupper
- ret
- .cfi_endproc
--.size poly1305_blocks_avx,.-poly1305_blocks_avx
-+___
-+&end_function("poly1305_blocks_avx");
-
--.type poly1305_emit_avx,\@function,3
--.align 32
--poly1305_emit_avx:
-+&declare_function("poly1305_emit_avx", 32, 3);
-+$code.=<<___;
- cmpl \$0,20($ctx) # is_base2_26?
- je .Lemit
-
-@@ -1423,41 +1513,51 @@ poly1305_emit_avx:
- mov %rcx,8($mac)
-
- ret
--.size poly1305_emit_avx,.-poly1305_emit_avx
- ___
-+&end_function("poly1305_emit_avx");
-+
-+if ($kernel) {
-+ $code .= "#endif\n";
-+}
-
- if ($avx>1) {
-+
-+if ($kernel) {
-+ $code .= "#ifdef CONFIG_AS_AVX2\n";
-+}
-+
- my ($H0,$H1,$H2,$H3,$H4, $MASK, $T4,$T0,$T1,$T2,$T3, $D0,$D1,$D2,$D3,$D4) =
- map("%ymm$_",(0..15));
- my $S4=$MASK;
-
-+sub poly1305_blocks_avxN {
-+ my ($avx512) = @_;
-+ my $suffix = $avx512 ? "_avx512" : "";
- $code.=<<___;
--.type poly1305_blocks_avx2,\@function,4
--.align 32
--poly1305_blocks_avx2:
- .cfi_startproc
- mov 20($ctx),%r8d # is_base2_26
- cmp \$128,$len
-- jae .Lblocks_avx2
-+ jae .Lblocks_avx2$suffix
- test %r8d,%r8d
- jz .Lblocks
-
--.Lblocks_avx2:
-+.Lblocks_avx2$suffix:
- and \$-16,$len
-- jz .Lno_data_avx2
-+ jz .Lno_data_avx2$suffix
-
- vzeroupper
-
- test %r8d,%r8d
-- jz .Lbase2_64_avx2
-+ jz .Lbase2_64_avx2$suffix
-
- test \$63,$len
-- jz .Leven_avx2
-+ jz .Leven_avx2$suffix
-
-- push %rbx
--.cfi_push %rbx
- push %rbp
- .cfi_push %rbp
-+ mov %rsp,%rbp
-+ push %rbx
-+.cfi_push %rbx
- push %r12
- .cfi_push %r12
- push %r13
-@@ -1466,7 +1566,7 @@ poly1305_blocks_avx2:
- .cfi_push %r14
- push %r15
- .cfi_push %r15
--.Lblocks_avx2_body:
-+.Lblocks_avx2_body$suffix:
-
- mov $len,%r15 # reassign $len
-
-@@ -1513,7 +1613,7 @@ poly1305_blocks_avx2:
- shr \$2,$s1
- add $r1,$s1 # s1 = r1 + (r1 >> 2)
-
--.Lbase2_26_pre_avx2:
-+.Lbase2_26_pre_avx2$suffix:
- add 0($inp),$h0 # accumulate input
- adc 8($inp),$h1
- lea 16($inp),$inp
-@@ -1524,10 +1624,10 @@ poly1305_blocks_avx2:
- mov $r1,%rax
-
- test \$63,%r15
-- jnz .Lbase2_26_pre_avx2
-+ jnz .Lbase2_26_pre_avx2$suffix
-
- test $padbit,$padbit # if $padbit is zero,
-- jz .Lstore_base2_64_avx2 # store hash in base 2^64 format
-+ jz .Lstore_base2_64_avx2$suffix # store hash in base 2^64 format
-
- ################################# base 2^64 -> base 2^26
- mov $h0,%rax
-@@ -1548,57 +1648,56 @@ poly1305_blocks_avx2:
- or $r1,$h2 # h[4]
-
- test %r15,%r15
-- jz .Lstore_base2_26_avx2
-+ jz .Lstore_base2_26_avx2$suffix
-
- vmovd %rax#d,%x#$H0
- vmovd %rdx#d,%x#$H1
- vmovd $h0#d,%x#$H2
- vmovd $h1#d,%x#$H3
- vmovd $h2#d,%x#$H4
-- jmp .Lproceed_avx2
-+ jmp .Lproceed_avx2$suffix
-
- .align 32
--.Lstore_base2_64_avx2:
-+.Lstore_base2_64_avx2$suffix:
- mov $h0,0($ctx)
- mov $h1,8($ctx)
- mov $h2,16($ctx) # note that is_base2_26 is zeroed
-- jmp .Ldone_avx2
-+ jmp .Ldone_avx2$suffix
-
- .align 16
--.Lstore_base2_26_avx2:
-+.Lstore_base2_26_avx2$suffix:
- mov %rax#d,0($ctx) # store hash value base 2^26
- mov %rdx#d,4($ctx)
- mov $h0#d,8($ctx)
- mov $h1#d,12($ctx)
- mov $h2#d,16($ctx)
- .align 16
--.Ldone_avx2:
-- mov 0(%rsp),%r15
-+.Ldone_avx2$suffix:
-+ pop %r15
- .cfi_restore %r15
-- mov 8(%rsp),%r14
-+ pop %r14
- .cfi_restore %r14
-- mov 16(%rsp),%r13
-+ pop %r13
- .cfi_restore %r13
-- mov 24(%rsp),%r12
-+ pop %r12
- .cfi_restore %r12
-- mov 32(%rsp),%rbp
--.cfi_restore %rbp
-- mov 40(%rsp),%rbx
-+ pop %rbx
- .cfi_restore %rbx
-- lea 48(%rsp),%rsp
--.cfi_adjust_cfa_offset -48
--.Lno_data_avx2:
--.Lblocks_avx2_epilogue:
-+ pop %rbp
-+.cfi_restore %rbp
-+.Lno_data_avx2$suffix:
-+.Lblocks_avx2_epilogue$suffix:
- ret
- .cfi_endproc
-
- .align 32
--.Lbase2_64_avx2:
-+.Lbase2_64_avx2$suffix:
- .cfi_startproc
-- push %rbx
--.cfi_push %rbx
- push %rbp
- .cfi_push %rbp
-+ mov %rsp,%rbp
-+ push %rbx
-+.cfi_push %rbx
- push %r12
- .cfi_push %r12
- push %r13
-@@ -1607,7 +1706,7 @@ poly1305_blocks_avx2:
- .cfi_push %r14
- push %r15
- .cfi_push %r15
--.Lbase2_64_avx2_body:
-+.Lbase2_64_avx2_body$suffix:
-
- mov $len,%r15 # reassign $len
-
-@@ -1624,9 +1723,9 @@ poly1305_blocks_avx2:
- add $r1,$s1 # s1 = r1 + (r1 >> 2)
-
- test \$63,$len
-- jz .Linit_avx2
-+ jz .Linit_avx2$suffix
-
--.Lbase2_64_pre_avx2:
-+.Lbase2_64_pre_avx2$suffix:
- add 0($inp),$h0 # accumulate input
- adc 8($inp),$h1
- lea 16($inp),$inp
-@@ -1637,9 +1736,9 @@ poly1305_blocks_avx2:
- mov $r1,%rax
-
- test \$63,%r15
-- jnz .Lbase2_64_pre_avx2
-+ jnz .Lbase2_64_pre_avx2$suffix
-
--.Linit_avx2:
-+.Linit_avx2$suffix:
- ################################# base 2^64 -> base 2^26
- mov $h0,%rax
- mov $h0,%rdx
-@@ -1667,69 +1766,77 @@ poly1305_blocks_avx2:
-
- call __poly1305_init_avx
-
--.Lproceed_avx2:
-+.Lproceed_avx2$suffix:
- mov %r15,$len # restore $len
-- mov OPENSSL_ia32cap_P+8(%rip),%r10d
-+___
-+$code.=<<___ if (!$kernel);
-+ mov OPENSSL_ia32cap_P+8(%rip),%r9d
- mov \$`(1<<31|1<<30|1<<16)`,%r11d
--
-- mov 0(%rsp),%r15
-+___
-+$code.=<<___;
-+ pop %r15
- .cfi_restore %r15
-- mov 8(%rsp),%r14
-+ pop %r14
- .cfi_restore %r14
-- mov 16(%rsp),%r13
-+ pop %r13
- .cfi_restore %r13
-- mov 24(%rsp),%r12
-+ pop %r12
- .cfi_restore %r12
-- mov 32(%rsp),%rbp
--.cfi_restore %rbp
-- mov 40(%rsp),%rbx
-+ pop %rbx
- .cfi_restore %rbx
-- lea 48(%rsp),%rax
-- lea 48(%rsp),%rsp
--.cfi_adjust_cfa_offset -48
--.Lbase2_64_avx2_epilogue:
-- jmp .Ldo_avx2
-+ pop %rbp
-+.cfi_restore %rbp
-+.Lbase2_64_avx2_epilogue$suffix:
-+ jmp .Ldo_avx2$suffix
- .cfi_endproc
-
- .align 32
--.Leven_avx2:
-+.Leven_avx2$suffix:
- .cfi_startproc
-- mov OPENSSL_ia32cap_P+8(%rip),%r10d
-+___
-+$code.=<<___ if (!$kernel);
-+ mov OPENSSL_ia32cap_P+8(%rip),%r9d
-+___
-+$code.=<<___;
- vmovd 4*0($ctx),%x#$H0 # load hash value base 2^26
- vmovd 4*1($ctx),%x#$H1
- vmovd 4*2($ctx),%x#$H2
- vmovd 4*3($ctx),%x#$H3
- vmovd 4*4($ctx),%x#$H4
-
--.Ldo_avx2:
-+.Ldo_avx2$suffix:
- ___
--$code.=<<___ if ($avx>2);
-+$code.=<<___ if (!$kernel && $avx>2);
- cmp \$512,$len
- jb .Lskip_avx512
-- and %r11d,%r10d
-- test \$`1<<16`,%r10d # check for AVX512F
-+ and %r11d,%r9d
-+ test \$`1<<16`,%r9d # check for AVX512F
- jnz .Lblocks_avx512
--.Lskip_avx512:
-+.Lskip_avx512$suffix:
-+___
-+$code.=<<___ if ($avx > 2 && $avx512 && $kernel);
-+ cmp \$512,$len
-+ jae .Lblocks_avx512
- ___
- $code.=<<___ if (!$win64);
-- lea -8(%rsp),%r11
--.cfi_def_cfa %r11,16
-+ lea 8(%rsp),%r10
-+.cfi_def_cfa_register %r10
- sub \$0x128,%rsp
- ___
- $code.=<<___ if ($win64);
-- lea -0xf8(%rsp),%r11
-+ lea 8(%rsp),%r10
- sub \$0x1c8,%rsp
-- vmovdqa %xmm6,0x50(%r11)
-- vmovdqa %xmm7,0x60(%r11)
-- vmovdqa %xmm8,0x70(%r11)
-- vmovdqa %xmm9,0x80(%r11)
-- vmovdqa %xmm10,0x90(%r11)
-- vmovdqa %xmm11,0xa0(%r11)
-- vmovdqa %xmm12,0xb0(%r11)
-- vmovdqa %xmm13,0xc0(%r11)
-- vmovdqa %xmm14,0xd0(%r11)
-- vmovdqa %xmm15,0xe0(%r11)
--.Ldo_avx2_body:
-+ vmovdqa %xmm6,-0xb0(%r10)
-+ vmovdqa %xmm7,-0xa0(%r10)
-+ vmovdqa %xmm8,-0x90(%r10)
-+ vmovdqa %xmm9,-0x80(%r10)
-+ vmovdqa %xmm10,-0x70(%r10)
-+ vmovdqa %xmm11,-0x60(%r10)
-+ vmovdqa %xmm12,-0x50(%r10)
-+ vmovdqa %xmm13,-0x40(%r10)
-+ vmovdqa %xmm14,-0x30(%r10)
-+ vmovdqa %xmm15,-0x20(%r10)
-+.Ldo_avx2_body$suffix:
- ___
- $code.=<<___;
- lea .Lconst(%rip),%rcx
-@@ -1794,11 +1901,11 @@ $code.=<<___;
-
- vpaddq $H2,$T2,$H2 # accumulate input
- sub \$64,$len
-- jz .Ltail_avx2
-- jmp .Loop_avx2
-+ jz .Ltail_avx2$suffix
-+ jmp .Loop_avx2$suffix
-
- .align 32
--.Loop_avx2:
-+.Loop_avx2$suffix:
- ################################################################
- # ((inp[0]*r^4+inp[4])*r^4+inp[ 8])*r^4
- # ((inp[1]*r^4+inp[5])*r^4+inp[ 9])*r^3
-@@ -1946,10 +2053,10 @@ $code.=<<___;
- vpor 32(%rcx),$T4,$T4 # padbit, yes, always
-
- sub \$64,$len
-- jnz .Loop_avx2
-+ jnz .Loop_avx2$suffix
-
- .byte 0x66,0x90
--.Ltail_avx2:
-+.Ltail_avx2$suffix:
- ################################################################
- # while above multiplications were by r^4 in all lanes, in last
- # iteration we multiply least significant lane by r^4 and most
-@@ -2087,37 +2194,29 @@ $code.=<<___;
- vmovd %x#$H4,`4*4-48-64`($ctx)
- ___
- $code.=<<___ if ($win64);
-- vmovdqa 0x50(%r11),%xmm6
-- vmovdqa 0x60(%r11),%xmm7
-- vmovdqa 0x70(%r11),%xmm8
-- vmovdqa 0x80(%r11),%xmm9
-- vmovdqa 0x90(%r11),%xmm10
-- vmovdqa 0xa0(%r11),%xmm11
-- vmovdqa 0xb0(%r11),%xmm12
-- vmovdqa 0xc0(%r11),%xmm13
-- vmovdqa 0xd0(%r11),%xmm14
-- vmovdqa 0xe0(%r11),%xmm15
-- lea 0xf8(%r11),%rsp
--.Ldo_avx2_epilogue:
-+ vmovdqa -0xb0(%r10),%xmm6
-+ vmovdqa -0xa0(%r10),%xmm7
-+ vmovdqa -0x90(%r10),%xmm8
-+ vmovdqa -0x80(%r10),%xmm9
-+ vmovdqa -0x70(%r10),%xmm10
-+ vmovdqa -0x60(%r10),%xmm11
-+ vmovdqa -0x50(%r10),%xmm12
-+ vmovdqa -0x40(%r10),%xmm13
-+ vmovdqa -0x30(%r10),%xmm14
-+ vmovdqa -0x20(%r10),%xmm15
-+ lea -8(%r10),%rsp
-+.Ldo_avx2_epilogue$suffix:
- ___
- $code.=<<___ if (!$win64);
-- lea 8(%r11),%rsp
--.cfi_def_cfa %rsp,8
-+ lea -8(%r10),%rsp
-+.cfi_def_cfa_register %rsp
- ___
- $code.=<<___;
- vzeroupper
- ret
- .cfi_endproc
--.size poly1305_blocks_avx2,.-poly1305_blocks_avx2
- ___
--#######################################################################
--if ($avx>2) {
--# On entry we have input length divisible by 64. But since inner loop
--# processes 128 bytes per iteration, cases when length is not divisible
--# by 128 are handled by passing tail 64 bytes to .Ltail_avx2. For this
--# reason stack layout is kept identical to poly1305_blocks_avx2. If not
--# for this tail, we wouldn't have to even allocate stack frame...
--
-+if($avx > 2 && $avx512) {
- my ($R0,$R1,$R2,$R3,$R4, $S1,$S2,$S3,$S4) = map("%zmm$_",(16..24));
- my ($M0,$M1,$M2,$M3,$M4) = map("%zmm$_",(25..29));
- my $PADBIT="%zmm30";
-@@ -2128,32 +2227,29 @@ map(s/%y/%z/,($H0,$H1,$H2,$H3,$H4));
- map(s/%y/%z/,($MASK));
-
- $code.=<<___;
--.type poly1305_blocks_avx512,\@function,4
--.align 32
--poly1305_blocks_avx512:
- .cfi_startproc
- .Lblocks_avx512:
- mov \$15,%eax
- kmovw %eax,%k2
- ___
- $code.=<<___ if (!$win64);
-- lea -8(%rsp),%r11
--.cfi_def_cfa %r11,16
-+ lea 8(%rsp),%r10
-+.cfi_def_cfa_register %r10
- sub \$0x128,%rsp
- ___
- $code.=<<___ if ($win64);
-- lea -0xf8(%rsp),%r11
-+ lea 8(%rsp),%r10
- sub \$0x1c8,%rsp
-- vmovdqa %xmm6,0x50(%r11)
-- vmovdqa %xmm7,0x60(%r11)
-- vmovdqa %xmm8,0x70(%r11)
-- vmovdqa %xmm9,0x80(%r11)
-- vmovdqa %xmm10,0x90(%r11)
-- vmovdqa %xmm11,0xa0(%r11)
-- vmovdqa %xmm12,0xb0(%r11)
-- vmovdqa %xmm13,0xc0(%r11)
-- vmovdqa %xmm14,0xd0(%r11)
-- vmovdqa %xmm15,0xe0(%r11)
-+ vmovdqa %xmm6,-0xb0(%r10)
-+ vmovdqa %xmm7,-0xa0(%r10)
-+ vmovdqa %xmm8,-0x90(%r10)
-+ vmovdqa %xmm9,-0x80(%r10)
-+ vmovdqa %xmm10,-0x70(%r10)
-+ vmovdqa %xmm11,-0x60(%r10)
-+ vmovdqa %xmm12,-0x50(%r10)
-+ vmovdqa %xmm13,-0x40(%r10)
-+ vmovdqa %xmm14,-0x30(%r10)
-+ vmovdqa %xmm15,-0x20(%r10)
- .Ldo_avx512_body:
- ___
- $code.=<<___;
-@@ -2679,7 +2775,7 @@ $code.=<<___;
-
- lea 0x90(%rsp),%rax # size optimization for .Ltail_avx2
- add \$64,$len
-- jnz .Ltail_avx2
-+ jnz .Ltail_avx2$suffix
-
- vpsubq $T2,$H2,$H2 # undo input accumulation
- vmovd %x#$H0,`4*0-48-64`($ctx)# save partially reduced
-@@ -2690,29 +2786,61 @@ $code.=<<___;
- vzeroall
- ___
- $code.=<<___ if ($win64);
-- movdqa 0x50(%r11),%xmm6
-- movdqa 0x60(%r11),%xmm7
-- movdqa 0x70(%r11),%xmm8
-- movdqa 0x80(%r11),%xmm9
-- movdqa 0x90(%r11),%xmm10
-- movdqa 0xa0(%r11),%xmm11
-- movdqa 0xb0(%r11),%xmm12
-- movdqa 0xc0(%r11),%xmm13
-- movdqa 0xd0(%r11),%xmm14
-- movdqa 0xe0(%r11),%xmm15
-- lea 0xf8(%r11),%rsp
-+ movdqa -0xb0(%r10),%xmm6
-+ movdqa -0xa0(%r10),%xmm7
-+ movdqa -0x90(%r10),%xmm8
-+ movdqa -0x80(%r10),%xmm9
-+ movdqa -0x70(%r10),%xmm10
-+ movdqa -0x60(%r10),%xmm11
-+ movdqa -0x50(%r10),%xmm12
-+ movdqa -0x40(%r10),%xmm13
-+ movdqa -0x30(%r10),%xmm14
-+ movdqa -0x20(%r10),%xmm15
-+ lea -8(%r10),%rsp
- .Ldo_avx512_epilogue:
- ___
- $code.=<<___ if (!$win64);
-- lea 8(%r11),%rsp
--.cfi_def_cfa %rsp,8
-+ lea -8(%r10),%rsp
-+.cfi_def_cfa_register %rsp
- ___
- $code.=<<___;
- ret
- .cfi_endproc
--.size poly1305_blocks_avx512,.-poly1305_blocks_avx512
- ___
--if ($avx>3) {
-+
-+}
-+
-+}
-+
-+&declare_function("poly1305_blocks_avx2", 32, 4);
-+poly1305_blocks_avxN(0);
-+&end_function("poly1305_blocks_avx2");
-+
-+if($kernel) {
-+ $code .= "#endif\n";
-+}
-+
-+#######################################################################
-+if ($avx>2) {
-+# On entry we have input length divisible by 64. But since inner loop
-+# processes 128 bytes per iteration, cases when length is not divisible
-+# by 128 are handled by passing tail 64 bytes to .Ltail_avx2. For this
-+# reason stack layout is kept identical to poly1305_blocks_avx2. If not
-+# for this tail, we wouldn't have to even allocate stack frame...
-+
-+if($kernel) {
-+ $code .= "#ifdef CONFIG_AS_AVX512\n";
-+}
-+
-+&declare_function("poly1305_blocks_avx512", 32, 4);
-+poly1305_blocks_avxN(1);
-+&end_function("poly1305_blocks_avx512");
-+
-+if ($kernel) {
-+ $code .= "#endif\n";
-+}
-+
-+if (!$kernel && $avx>3) {
- ########################################################################
- # VPMADD52 version using 2^44 radix.
- #
-@@ -3753,45 +3881,9 @@ poly1305_emit_base2_44:
- .size poly1305_emit_base2_44,.-poly1305_emit_base2_44
- ___
- } } }
--$code.=<<___;
--.align 64
--.Lconst:
--.Lmask24:
--.long 0x0ffffff,0,0x0ffffff,0,0x0ffffff,0,0x0ffffff,0
--.L129:
--.long `1<<24`,0,`1<<24`,0,`1<<24`,0,`1<<24`,0
--.Lmask26:
--.long 0x3ffffff,0,0x3ffffff,0,0x3ffffff,0,0x3ffffff,0
--.Lpermd_avx2:
--.long 2,2,2,3,2,0,2,1
--.Lpermd_avx512:
--.long 0,0,0,1, 0,2,0,3, 0,4,0,5, 0,6,0,7
--
--.L2_44_inp_permd:
--.long 0,1,1,2,2,3,7,7
--.L2_44_inp_shift:
--.quad 0,12,24,64
--.L2_44_mask:
--.quad 0xfffffffffff,0xfffffffffff,0x3ffffffffff,0xffffffffffffffff
--.L2_44_shift_rgt:
--.quad 44,44,42,64
--.L2_44_shift_lft:
--.quad 8,8,10,64
--
--.align 64
--.Lx_mask44:
--.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
--.quad 0xfffffffffff,0xfffffffffff,0xfffffffffff,0xfffffffffff
--.Lx_mask42:
--.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
--.quad 0x3ffffffffff,0x3ffffffffff,0x3ffffffffff,0x3ffffffffff
--___
- }
--$code.=<<___;
--.asciz "Poly1305 for x86_64, CRYPTOGAMS by <appro\@openssl.org>"
--.align 16
--___
-
-+if (!$kernel)
- { # chacha20-poly1305 helpers
- my ($out,$inp,$otp,$len)=$win64 ? ("%rcx","%rdx","%r8", "%r9") : # Win64 order
- ("%rdi","%rsi","%rdx","%rcx"); # Unix order
-@@ -4038,17 +4130,17 @@ avx_handler:
-
- .section .pdata
- .align 4
-- .rva .LSEH_begin_poly1305_init
-- .rva .LSEH_end_poly1305_init
-- .rva .LSEH_info_poly1305_init
--
-- .rva .LSEH_begin_poly1305_blocks
-- .rva .LSEH_end_poly1305_blocks
-- .rva .LSEH_info_poly1305_blocks
--
-- .rva .LSEH_begin_poly1305_emit
-- .rva .LSEH_end_poly1305_emit
-- .rva .LSEH_info_poly1305_emit
-+ .rva .LSEH_begin_poly1305_init_x86_64
-+ .rva .LSEH_end_poly1305_init_x86_64
-+ .rva .LSEH_info_poly1305_init_x86_64
-+
-+ .rva .LSEH_begin_poly1305_blocks_x86_64
-+ .rva .LSEH_end_poly1305_blocks_x86_64
-+ .rva .LSEH_info_poly1305_blocks_x86_64
-+
-+ .rva .LSEH_begin_poly1305_emit_x86_64
-+ .rva .LSEH_end_poly1305_emit_x86_64
-+ .rva .LSEH_info_poly1305_emit_x86_64
- ___
- $code.=<<___ if ($avx);
- .rva .LSEH_begin_poly1305_blocks_avx
-@@ -4088,20 +4180,20 @@ ___
- $code.=<<___;
- .section .xdata
- .align 8
--.LSEH_info_poly1305_init:
-+.LSEH_info_poly1305_init_x86_64:
- .byte 9,0,0,0
- .rva se_handler
-- .rva .LSEH_begin_poly1305_init,.LSEH_begin_poly1305_init
-+ .rva .LSEH_begin_poly1305_init_x86_64,.LSEH_begin_poly1305_init_x86_64
-
--.LSEH_info_poly1305_blocks:
-+.LSEH_info_poly1305_blocks_x86_64:
- .byte 9,0,0,0
- .rva se_handler
- .rva .Lblocks_body,.Lblocks_epilogue
-
--.LSEH_info_poly1305_emit:
-+.LSEH_info_poly1305_emit_x86_64:
- .byte 9,0,0,0
- .rva se_handler
-- .rva .LSEH_begin_poly1305_emit,.LSEH_begin_poly1305_emit
-+ .rva .LSEH_begin_poly1305_emit_x86_64,.LSEH_begin_poly1305_emit_x86_64
- ___
- $code.=<<___ if ($avx);
- .LSEH_info_poly1305_blocks_avx_1:
-@@ -4148,12 +4240,26 @@ $code.=<<___ if ($avx>2);
- ___
- }
-
-+open SELF,$0;
-+while(<SELF>) {
-+ next if (/^#!/);
-+ last if (!s/^#/\/\// and !/^$/);
-+ print;
-+}
-+close SELF;
-+
- foreach (split('\n',$code)) {
- s/\`([^\`]*)\`/eval($1)/ge;
- s/%r([a-z]+)#d/%e$1/g;
- s/%r([0-9]+)#d/%r$1d/g;
- s/%x#%[yz]/%x/g or s/%y#%z/%y/g or s/%z#%[yz]/%z/g;
-
-+ if ($kernel) {
-+ s/(^\.type.*),[0-9]+$/\1/;
-+ s/(^\.type.*),\@abi-omnipotent+$/\1,\@function/;
-+ next if /^\.cfi.*/;
-+ }
-+
- print $_,"\n";
- }
- close STDOUT;
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -1,8 +1,6 @@
--// SPDX-License-Identifier: GPL-2.0-or-later
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
- /*
-- * Poly1305 authenticator algorithm, RFC7539, SIMD glue code
-- *
-- * Copyright (C) 2015 Martin Willi
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
- */
-
- #include <crypto/algapi.h>
-@@ -13,279 +11,170 @@
- #include <linux/jump_label.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
-+#include <asm/intel-family.h>
- #include <asm/simd.h>
-
--asmlinkage void poly1305_block_sse2(u32 *h, const u8 *src,
-- const u32 *r, unsigned int blocks);
--asmlinkage void poly1305_2block_sse2(u32 *h, const u8 *src, const u32 *r,
-- unsigned int blocks, const u32 *u);
--asmlinkage void poly1305_4block_avx2(u32 *h, const u8 *src, const u32 *r,
-- unsigned int blocks, const u32 *u);
-+asmlinkage void poly1305_init_x86_64(void *ctx,
-+ const u8 key[POLY1305_KEY_SIZE]);
-+asmlinkage void poly1305_blocks_x86_64(void *ctx, const u8 *inp,
-+ const size_t len, const u32 padbit);
-+asmlinkage void poly1305_emit_x86_64(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
-+ const u32 nonce[4]);
-+asmlinkage void poly1305_emit_avx(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
-+ const u32 nonce[4]);
-+asmlinkage void poly1305_blocks_avx(void *ctx, const u8 *inp, const size_t len,
-+ const u32 padbit);
-+asmlinkage void poly1305_blocks_avx2(void *ctx, const u8 *inp, const size_t len,
-+ const u32 padbit);
-+asmlinkage void poly1305_blocks_avx512(void *ctx, const u8 *inp,
-+ const size_t len, const u32 padbit);
-
--static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_simd);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_avx);
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_avx2);
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(poly1305_use_avx512);
-
--static inline u64 mlt(u64 a, u64 b)
--{
-- return a * b;
--}
--
--static inline u32 sr(u64 v, u_char n)
--{
-- return v >> n;
--}
--
--static inline u32 and(u32 v, u32 mask)
--{
-- return v & mask;
--}
--
--static void poly1305_simd_mult(u32 *a, const u32 *b)
--{
-- u8 m[POLY1305_BLOCK_SIZE];
--
-- memset(m, 0, sizeof(m));
-- /* The poly1305 block function adds a hi-bit to the accumulator which
-- * we don't need for key multiplication; compensate for it. */
-- a[4] -= 1 << 24;
-- poly1305_block_sse2(a, m, b, 1);
--}
--
--static void poly1305_integer_setkey(struct poly1305_key *key, const u8 *raw_key)
--{
-- /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
-- key->r[0] = (get_unaligned_le32(raw_key + 0) >> 0) & 0x3ffffff;
-- key->r[1] = (get_unaligned_le32(raw_key + 3) >> 2) & 0x3ffff03;
-- key->r[2] = (get_unaligned_le32(raw_key + 6) >> 4) & 0x3ffc0ff;
-- key->r[3] = (get_unaligned_le32(raw_key + 9) >> 6) & 0x3f03fff;
-- key->r[4] = (get_unaligned_le32(raw_key + 12) >> 8) & 0x00fffff;
--}
-+struct poly1305_arch_internal {
-+ union {
-+ struct {
-+ u32 h[5];
-+ u32 is_base2_26;
-+ };
-+ u64 hs[3];
-+ };
-+ u64 r[2];
-+ u64 pad;
-+ struct { u32 r2, r1, r4, r3; } rn[9];
-+};
-
--static void poly1305_integer_blocks(struct poly1305_state *state,
-- const struct poly1305_key *key,
-- const void *src,
-- unsigned int nblocks, u32 hibit)
-+/* The AVX code uses base 2^26, while the scalar code uses base 2^64. If we hit
-+ * the unfortunate situation of using AVX and then having to go back to scalar
-+ * -- because the user is silly and has called the update function from two
-+ * separate contexts -- then we need to convert back to the original base before
-+ * proceeding. It is possible to reason that the initial reduction below is
-+ * sufficient given the implementation invariants. However, for an avoidance of
-+ * doubt and because this is not performance critical, we do the full reduction
-+ * anyway. Z3 proof of below function: https://xn--4db.cc/ltPtHCKN/py
-+ */
-+static void convert_to_base2_64(void *ctx)
- {
-- u32 r0, r1, r2, r3, r4;
-- u32 s1, s2, s3, s4;
-- u32 h0, h1, h2, h3, h4;
-- u64 d0, d1, d2, d3, d4;
-+ struct poly1305_arch_internal *state = ctx;
-+ u32 cy;
-
-- if (!nblocks)
-+ if (!state->is_base2_26)
- return;
-
-- r0 = key->r[0];
-- r1 = key->r[1];
-- r2 = key->r[2];
-- r3 = key->r[3];
-- r4 = key->r[4];
--
-- s1 = r1 * 5;
-- s2 = r2 * 5;
-- s3 = r3 * 5;
-- s4 = r4 * 5;
--
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- do {
-- /* h += m[i] */
-- h0 += (get_unaligned_le32(src + 0) >> 0) & 0x3ffffff;
-- h1 += (get_unaligned_le32(src + 3) >> 2) & 0x3ffffff;
-- h2 += (get_unaligned_le32(src + 6) >> 4) & 0x3ffffff;
-- h3 += (get_unaligned_le32(src + 9) >> 6) & 0x3ffffff;
-- h4 += (get_unaligned_le32(src + 12) >> 8) | (hibit << 24);
--
-- /* h *= r */
-- d0 = mlt(h0, r0) + mlt(h1, s4) + mlt(h2, s3) +
-- mlt(h3, s2) + mlt(h4, s1);
-- d1 = mlt(h0, r1) + mlt(h1, r0) + mlt(h2, s4) +
-- mlt(h3, s3) + mlt(h4, s2);
-- d2 = mlt(h0, r2) + mlt(h1, r1) + mlt(h2, r0) +
-- mlt(h3, s4) + mlt(h4, s3);
-- d3 = mlt(h0, r3) + mlt(h1, r2) + mlt(h2, r1) +
-- mlt(h3, r0) + mlt(h4, s4);
-- d4 = mlt(h0, r4) + mlt(h1, r3) + mlt(h2, r2) +
-- mlt(h3, r1) + mlt(h4, r0);
--
-- /* (partial) h %= p */
-- d1 += sr(d0, 26); h0 = and(d0, 0x3ffffff);
-- d2 += sr(d1, 26); h1 = and(d1, 0x3ffffff);
-- d3 += sr(d2, 26); h2 = and(d2, 0x3ffffff);
-- d4 += sr(d3, 26); h3 = and(d3, 0x3ffffff);
-- h0 += sr(d4, 26) * 5; h4 = and(d4, 0x3ffffff);
-- h1 += h0 >> 26; h0 = h0 & 0x3ffffff;
--
-- src += POLY1305_BLOCK_SIZE;
-- } while (--nblocks);
--
-- state->h[0] = h0;
-- state->h[1] = h1;
-- state->h[2] = h2;
-- state->h[3] = h3;
-- state->h[4] = h4;
--}
--
--static void poly1305_integer_emit(const struct poly1305_state *state, void *dst)
--{
-- u32 h0, h1, h2, h3, h4;
-- u32 g0, g1, g2, g3, g4;
-- u32 mask;
--
-- /* fully carry h */
-- h0 = state->h[0];
-- h1 = state->h[1];
-- h2 = state->h[2];
-- h3 = state->h[3];
-- h4 = state->h[4];
--
-- h2 += (h1 >> 26); h1 = h1 & 0x3ffffff;
-- h3 += (h2 >> 26); h2 = h2 & 0x3ffffff;
-- h4 += (h3 >> 26); h3 = h3 & 0x3ffffff;
-- h0 += (h4 >> 26) * 5; h4 = h4 & 0x3ffffff;
-- h1 += (h0 >> 26); h0 = h0 & 0x3ffffff;
--
-- /* compute h + -p */
-- g0 = h0 + 5;
-- g1 = h1 + (g0 >> 26); g0 &= 0x3ffffff;
-- g2 = h2 + (g1 >> 26); g1 &= 0x3ffffff;
-- g3 = h3 + (g2 >> 26); g2 &= 0x3ffffff;
-- g4 = h4 + (g3 >> 26) - (1 << 26); g3 &= 0x3ffffff;
--
-- /* select h if h < p, or h + -p if h >= p */
-- mask = (g4 >> ((sizeof(u32) * 8) - 1)) - 1;
-- g0 &= mask;
-- g1 &= mask;
-- g2 &= mask;
-- g3 &= mask;
-- g4 &= mask;
-- mask = ~mask;
-- h0 = (h0 & mask) | g0;
-- h1 = (h1 & mask) | g1;
-- h2 = (h2 & mask) | g2;
-- h3 = (h3 & mask) | g3;
-- h4 = (h4 & mask) | g4;
--
-- /* h = h % (2^128) */
-- put_unaligned_le32((h0 >> 0) | (h1 << 26), dst + 0);
-- put_unaligned_le32((h1 >> 6) | (h2 << 20), dst + 4);
-- put_unaligned_le32((h2 >> 12) | (h3 << 14), dst + 8);
-- put_unaligned_le32((h3 >> 18) | (h4 << 8), dst + 12);
--}
--
--void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key)
--{
-- poly1305_integer_setkey(desc->opaque_r, key);
-- desc->s[0] = get_unaligned_le32(key + 16);
-- desc->s[1] = get_unaligned_le32(key + 20);
-- desc->s[2] = get_unaligned_le32(key + 24);
-- desc->s[3] = get_unaligned_le32(key + 28);
-- poly1305_core_init(&desc->h);
-- desc->buflen = 0;
-- desc->sset = true;
-- desc->rset = 1;
--}
--EXPORT_SYMBOL_GPL(poly1305_init_arch);
--
--static unsigned int crypto_poly1305_setdesckey(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen)
--{
-- if (!dctx->sset) {
-- if (!dctx->rset && srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_integer_setkey(dctx->r, src);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->rset = 1;
-- }
-- if (srclen >= POLY1305_BLOCK_SIZE) {
-- dctx->s[0] = get_unaligned_le32(src + 0);
-- dctx->s[1] = get_unaligned_le32(src + 4);
-- dctx->s[2] = get_unaligned_le32(src + 8);
-- dctx->s[3] = get_unaligned_le32(src + 12);
-- src += POLY1305_BLOCK_SIZE;
-- srclen -= POLY1305_BLOCK_SIZE;
-- dctx->sset = true;
-- }
-+ cy = state->h[0] >> 26; state->h[0] &= 0x3ffffff; state->h[1] += cy;
-+ cy = state->h[1] >> 26; state->h[1] &= 0x3ffffff; state->h[2] += cy;
-+ cy = state->h[2] >> 26; state->h[2] &= 0x3ffffff; state->h[3] += cy;
-+ cy = state->h[3] >> 26; state->h[3] &= 0x3ffffff; state->h[4] += cy;
-+ state->hs[0] = ((u64)state->h[2] << 52) | ((u64)state->h[1] << 26) | state->h[0];
-+ state->hs[1] = ((u64)state->h[4] << 40) | ((u64)state->h[3] << 14) | (state->h[2] >> 12);
-+ state->hs[2] = state->h[4] >> 24;
-+#define ULT(a, b) ((a ^ ((a ^ b) | ((a - b) ^ b))) >> (sizeof(a) * 8 - 1))
-+ cy = (state->hs[2] >> 2) + (state->hs[2] & ~3ULL);
-+ state->hs[2] &= 3;
-+ state->hs[0] += cy;
-+ state->hs[1] += (cy = ULT(state->hs[0], cy));
-+ state->hs[2] += ULT(state->hs[1], cy);
-+#undef ULT
-+ state->is_base2_26 = 0;
-+}
-+
-+static void poly1305_simd_init(void *ctx, const u8 key[POLY1305_KEY_SIZE])
-+{
-+ poly1305_init_x86_64(ctx, key);
-+}
-+
-+static void poly1305_simd_blocks(void *ctx, const u8 *inp, size_t len,
-+ const u32 padbit)
-+{
-+ struct poly1305_arch_internal *state = ctx;
-+
-+ /* SIMD disables preemption, so relax after processing each page. */
-+ BUILD_BUG_ON(PAGE_SIZE < POLY1305_BLOCK_SIZE ||
-+ PAGE_SIZE % POLY1305_BLOCK_SIZE);
-+
-+ if (!IS_ENABLED(CONFIG_AS_AVX) || !static_branch_likely(&poly1305_use_avx) ||
-+ (len < (POLY1305_BLOCK_SIZE * 18) && !state->is_base2_26) ||
-+ !crypto_simd_usable()) {
-+ convert_to_base2_64(ctx);
-+ poly1305_blocks_x86_64(ctx, inp, len, padbit);
-+ return;
- }
-- return srclen;
--}
-
--static unsigned int poly1305_scalar_blocks(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen)
--{
-- unsigned int datalen;
-+ for (;;) {
-+ const size_t bytes = min_t(size_t, len, PAGE_SIZE);
-
-- if (unlikely(!dctx->sset)) {
-- datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
-- src += srclen - datalen;
-- srclen = datalen;
-- }
-- if (srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_integer_blocks(&dctx->h, dctx->opaque_r, src,
-- srclen / POLY1305_BLOCK_SIZE, 1);
-- srclen %= POLY1305_BLOCK_SIZE;
-+ kernel_fpu_begin();
-+ if (IS_ENABLED(CONFIG_AS_AVX512) && static_branch_likely(&poly1305_use_avx512))
-+ poly1305_blocks_avx512(ctx, inp, bytes, padbit);
-+ else if (IS_ENABLED(CONFIG_AS_AVX2) && static_branch_likely(&poly1305_use_avx2))
-+ poly1305_blocks_avx2(ctx, inp, bytes, padbit);
-+ else
-+ poly1305_blocks_avx(ctx, inp, bytes, padbit);
-+ kernel_fpu_end();
-+ len -= bytes;
-+ if (!len)
-+ break;
-+ inp += bytes;
- }
-- return srclen;
- }
-
--static unsigned int poly1305_simd_blocks(struct poly1305_desc_ctx *dctx,
-- const u8 *src, unsigned int srclen)
--{
-- unsigned int blocks, datalen;
-+static void poly1305_simd_emit(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
-+ const u32 nonce[4])
-+{
-+ struct poly1305_arch_internal *state = ctx;
-+
-+ if (!IS_ENABLED(CONFIG_AS_AVX) || !static_branch_likely(&poly1305_use_avx) ||
-+ !state->is_base2_26 || !crypto_simd_usable()) {
-+ convert_to_base2_64(ctx);
-+ poly1305_emit_x86_64(ctx, mac, nonce);
-+ } else
-+ poly1305_emit_avx(ctx, mac, nonce);
-+}
-+
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+{
-+ poly1305_simd_init(&dctx->h, key);
-+ dctx->s[0] = get_unaligned_le32(&key[16]);
-+ dctx->s[1] = get_unaligned_le32(&key[20]);
-+ dctx->s[2] = get_unaligned_le32(&key[24]);
-+ dctx->s[3] = get_unaligned_le32(&key[28]);
-+ dctx->buflen = 0;
-+ dctx->sset = true;
-+}
-+EXPORT_SYMBOL(poly1305_init_arch);
-
-+static unsigned int crypto_poly1305_setdctxkey(struct poly1305_desc_ctx *dctx,
-+ const u8 *inp, unsigned int len)
-+{
-+ unsigned int acc = 0;
- if (unlikely(!dctx->sset)) {
-- datalen = crypto_poly1305_setdesckey(dctx, src, srclen);
-- src += srclen - datalen;
-- srclen = datalen;
-- }
--
-- if (IS_ENABLED(CONFIG_AS_AVX2) &&
-- static_branch_likely(&poly1305_use_avx2) &&
-- srclen >= POLY1305_BLOCK_SIZE * 4) {
-- if (unlikely(dctx->rset < 4)) {
-- if (dctx->rset < 2) {
-- dctx->r[1] = dctx->r[0];
-- poly1305_simd_mult(dctx->r[1].r, dctx->r[0].r);
-- }
-- dctx->r[2] = dctx->r[1];
-- poly1305_simd_mult(dctx->r[2].r, dctx->r[0].r);
-- dctx->r[3] = dctx->r[2];
-- poly1305_simd_mult(dctx->r[3].r, dctx->r[0].r);
-- dctx->rset = 4;
-+ if (!dctx->rset && len >= POLY1305_BLOCK_SIZE) {
-+ poly1305_simd_init(&dctx->h, inp);
-+ inp += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ acc += POLY1305_BLOCK_SIZE;
-+ dctx->rset = 1;
- }
-- blocks = srclen / (POLY1305_BLOCK_SIZE * 4);
-- poly1305_4block_avx2(dctx->h.h, src, dctx->r[0].r, blocks,
-- dctx->r[1].r);
-- src += POLY1305_BLOCK_SIZE * 4 * blocks;
-- srclen -= POLY1305_BLOCK_SIZE * 4 * blocks;
-- }
--
-- if (likely(srclen >= POLY1305_BLOCK_SIZE * 2)) {
-- if (unlikely(dctx->rset < 2)) {
-- dctx->r[1] = dctx->r[0];
-- poly1305_simd_mult(dctx->r[1].r, dctx->r[0].r);
-- dctx->rset = 2;
-+ if (len >= POLY1305_BLOCK_SIZE) {
-+ dctx->s[0] = get_unaligned_le32(&inp[0]);
-+ dctx->s[1] = get_unaligned_le32(&inp[4]);
-+ dctx->s[2] = get_unaligned_le32(&inp[8]);
-+ dctx->s[3] = get_unaligned_le32(&inp[12]);
-+ inp += POLY1305_BLOCK_SIZE;
-+ len -= POLY1305_BLOCK_SIZE;
-+ acc += POLY1305_BLOCK_SIZE;
-+ dctx->sset = true;
- }
-- blocks = srclen / (POLY1305_BLOCK_SIZE * 2);
-- poly1305_2block_sse2(dctx->h.h, src, dctx->r[0].r,
-- blocks, dctx->r[1].r);
-- src += POLY1305_BLOCK_SIZE * 2 * blocks;
-- srclen -= POLY1305_BLOCK_SIZE * 2 * blocks;
-- }
-- if (srclen >= POLY1305_BLOCK_SIZE) {
-- poly1305_block_sse2(dctx->h.h, src, dctx->r[0].r, 1);
-- srclen -= POLY1305_BLOCK_SIZE;
- }
-- return srclen;
-+ return acc;
- }
-
- void poly1305_update_arch(struct poly1305_desc_ctx *dctx, const u8 *src,
- unsigned int srclen)
- {
-- unsigned int bytes;
-+ unsigned int bytes, used;
-
- if (unlikely(dctx->buflen)) {
- bytes = min(srclen, POLY1305_BLOCK_SIZE - dctx->buflen);
-@@ -295,31 +184,19 @@ void poly1305_update_arch(struct poly130
- dctx->buflen += bytes;
-
- if (dctx->buflen == POLY1305_BLOCK_SIZE) {
-- if (static_branch_likely(&poly1305_use_simd) &&
-- likely(crypto_simd_usable())) {
-- kernel_fpu_begin();
-- poly1305_simd_blocks(dctx, dctx->buf,
-- POLY1305_BLOCK_SIZE);
-- kernel_fpu_end();
-- } else {
-- poly1305_scalar_blocks(dctx, dctx->buf,
-- POLY1305_BLOCK_SIZE);
-- }
-+ if (likely(!crypto_poly1305_setdctxkey(dctx, dctx->buf, POLY1305_BLOCK_SIZE)))
-+ poly1305_simd_blocks(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 1);
- dctx->buflen = 0;
- }
- }
-
- if (likely(srclen >= POLY1305_BLOCK_SIZE)) {
-- if (static_branch_likely(&poly1305_use_simd) &&
-- likely(crypto_simd_usable())) {
-- kernel_fpu_begin();
-- bytes = poly1305_simd_blocks(dctx, src, srclen);
-- kernel_fpu_end();
-- } else {
-- bytes = poly1305_scalar_blocks(dctx, src, srclen);
-- }
-- src += srclen - bytes;
-- srclen = bytes;
-+ bytes = round_down(srclen, POLY1305_BLOCK_SIZE);
-+ srclen -= bytes;
-+ used = crypto_poly1305_setdctxkey(dctx, src, bytes);
-+ if (likely(bytes - used))
-+ poly1305_simd_blocks(&dctx->h, src + used, bytes - used, 1);
-+ src += bytes;
- }
-
- if (unlikely(srclen)) {
-@@ -329,31 +206,17 @@ void poly1305_update_arch(struct poly130
- }
- EXPORT_SYMBOL(poly1305_update_arch);
-
--void poly1305_final_arch(struct poly1305_desc_ctx *desc, u8 *dst)
-+void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
- {
-- __le32 digest[4];
-- u64 f = 0;
--
-- if (unlikely(desc->buflen)) {
-- desc->buf[desc->buflen++] = 1;
-- memset(desc->buf + desc->buflen, 0,
-- POLY1305_BLOCK_SIZE - desc->buflen);
-- poly1305_integer_blocks(&desc->h, desc->opaque_r, desc->buf, 1, 0);
-+ if (unlikely(dctx->buflen)) {
-+ dctx->buf[dctx->buflen++] = 1;
-+ memset(dctx->buf + dctx->buflen, 0,
-+ POLY1305_BLOCK_SIZE - dctx->buflen);
-+ poly1305_simd_blocks(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
- }
-
-- poly1305_integer_emit(&desc->h, digest);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]) + desc->s[0];
-- put_unaligned_le32(f, dst + 0);
-- f = (f >> 32) + le32_to_cpu(digest[1]) + desc->s[1];
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]) + desc->s[2];
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]) + desc->s[3];
-- put_unaligned_le32(f, dst + 12);
--
-- *desc = (struct poly1305_desc_ctx){};
-+ poly1305_simd_emit(&dctx->h, dst, dctx->s);
-+ *dctx = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL(poly1305_final_arch);
-
-@@ -361,38 +224,34 @@ static int crypto_poly1305_init(struct s
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-
-- poly1305_core_init(&dctx->h);
-- dctx->buflen = 0;
-- dctx->rset = 0;
-- dctx->sset = false;
--
-+ *dctx = (struct poly1305_desc_ctx){};
- return 0;
- }
-
--static int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
-+static int crypto_poly1305_update(struct shash_desc *desc,
-+ const u8 *src, unsigned int srclen)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-
-- if (unlikely(!dctx->sset))
-- return -ENOKEY;
--
-- poly1305_final_arch(dctx, dst);
-+ poly1305_update_arch(dctx, src, srclen);
- return 0;
- }
-
--static int poly1305_simd_update(struct shash_desc *desc,
-- const u8 *src, unsigned int srclen)
-+static int crypto_poly1305_final(struct shash_desc *desc, u8 *dst)
- {
- struct poly1305_desc_ctx *dctx = shash_desc_ctx(desc);
-
-- poly1305_update_arch(dctx, src, srclen);
-+ if (unlikely(!dctx->sset))
-+ return -ENOKEY;
-+
-+ poly1305_final_arch(dctx, dst);
- return 0;
- }
-
- static struct shash_alg alg = {
- .digestsize = POLY1305_DIGEST_SIZE,
- .init = crypto_poly1305_init,
-- .update = poly1305_simd_update,
-+ .update = crypto_poly1305_update,
- .final = crypto_poly1305_final,
- .descsize = sizeof(struct poly1305_desc_ctx),
- .base = {
-@@ -406,17 +265,19 @@ static struct shash_alg alg = {
-
- static int __init poly1305_simd_mod_init(void)
- {
-- if (!boot_cpu_has(X86_FEATURE_XMM2))
-- return 0;
--
-- static_branch_enable(&poly1305_use_simd);
--
-- if (IS_ENABLED(CONFIG_AS_AVX2) &&
-- boot_cpu_has(X86_FEATURE_AVX) &&
-+ if (IS_ENABLED(CONFIG_AS_AVX) && boot_cpu_has(X86_FEATURE_AVX) &&
-+ cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
-+ static_branch_enable(&poly1305_use_avx);
-+ if (IS_ENABLED(CONFIG_AS_AVX2) && boot_cpu_has(X86_FEATURE_AVX) &&
- boot_cpu_has(X86_FEATURE_AVX2) &&
- cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL))
- static_branch_enable(&poly1305_use_avx2);
--
-+ if (IS_ENABLED(CONFIG_AS_AVX512) && boot_cpu_has(X86_FEATURE_AVX) &&
-+ boot_cpu_has(X86_FEATURE_AVX2) && boot_cpu_has(X86_FEATURE_AVX512F) &&
-+ cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | XFEATURE_MASK_AVX512, NULL) &&
-+ /* Skylake downclocks unacceptably much when using zmm, but later generations are fast. */
-+ boot_cpu_data.x86_model != INTEL_FAM6_SKYLAKE_X)
-+ static_branch_enable(&poly1305_use_avx512);
- return IS_REACHABLE(CONFIG_CRYPTO_HASH) ? crypto_register_shash(&alg) : 0;
- }
-
-@@ -430,7 +291,7 @@ module_init(poly1305_simd_mod_init);
- module_exit(poly1305_simd_mod_exit);
-
- MODULE_LICENSE("GPL");
--MODULE_AUTHOR("Martin Willi <martin@strongswan.org>");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
- MODULE_DESCRIPTION("Poly1305 authenticator");
- MODULE_ALIAS_CRYPTO("poly1305");
- MODULE_ALIAS_CRYPTO("poly1305-simd");
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -90,7 +90,7 @@ config CRYPTO_LIB_DES
- config CRYPTO_LIB_POLY1305_RSIZE
- int
- default 2 if MIPS
-- default 4 if X86_64
-+ default 11 if X86_64
- default 9 if ARM || ARM64
- default 1
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0044-crypto-arm-arm64-mips-poly1305-remove-redundant-non-.patch b/target/linux/generic/backport-5.4/080-wireguard-0044-crypto-arm-arm64-mips-poly1305-remove-redundant-non-.patch
deleted file mode 100644
index b95b998880..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0044-crypto-arm-arm64-mips-poly1305-remove-redundant-non-.patch
+++ /dev/null
@@ -1,171 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 5 Jan 2020 22:40:49 -0500
-Subject: [PATCH] crypto: {arm,arm64,mips}/poly1305 - remove redundant
- non-reduction from emit
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit 31899908a0d248b030b4464425b86c717e0007d4 upstream.
-
-This appears to be some kind of copy and paste error, and is actually
-dead code.
-
-Pre: f = 0 ⇒ (f >> 32) = 0
- f = (f >> 32) + le32_to_cpu(digest[0]);
-Post: 0 ≤ f < 2³²
- put_unaligned_le32(f, dst);
-
-Pre: 0 ≤ f < 2³² ⇒ (f >> 32) = 0
- f = (f >> 32) + le32_to_cpu(digest[1]);
-Post: 0 ≤ f < 2³²
- put_unaligned_le32(f, dst + 4);
-
-Pre: 0 ≤ f < 2³² ⇒ (f >> 32) = 0
- f = (f >> 32) + le32_to_cpu(digest[2]);
-Post: 0 ≤ f < 2³²
- put_unaligned_le32(f, dst + 8);
-
-Pre: 0 ≤ f < 2³² ⇒ (f >> 32) = 0
- f = (f >> 32) + le32_to_cpu(digest[3]);
-Post: 0 ≤ f < 2³²
- put_unaligned_le32(f, dst + 12);
-
-Therefore this sequence is redundant. And Andy's code appears to handle
-misalignment acceptably.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Tested-by: Ard Biesheuvel <ardb@kernel.org>
-Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/poly1305-glue.c | 18 ++----------------
- arch/arm64/crypto/poly1305-glue.c | 18 ++----------------
- arch/mips/crypto/poly1305-glue.c | 18 ++----------------
- 3 files changed, 6 insertions(+), 48 deletions(-)
-
---- a/arch/arm/crypto/poly1305-glue.c
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -20,7 +20,7 @@
-
- void poly1305_init_arm(void *state, const u8 *key);
- void poly1305_blocks_arm(void *state, const u8 *src, u32 len, u32 hibit);
--void poly1305_emit_arm(void *state, __le32 *digest, const u32 *nonce);
-+void poly1305_emit_arm(void *state, u8 *digest, const u32 *nonce);
-
- void __weak poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit)
- {
-@@ -179,9 +179,6 @@ EXPORT_SYMBOL(poly1305_update_arch);
-
- void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
- {
-- __le32 digest[4];
-- u64 f = 0;
--
- if (unlikely(dctx->buflen)) {
- dctx->buf[dctx->buflen++] = 1;
- memset(dctx->buf + dctx->buflen, 0,
-@@ -189,18 +186,7 @@ void poly1305_final_arch(struct poly1305
- poly1305_blocks_arm(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
- }
-
-- poly1305_emit_arm(&dctx->h, digest, dctx->s);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]);
-- put_unaligned_le32(f, dst);
-- f = (f >> 32) + le32_to_cpu(digest[1]);
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]);
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]);
-- put_unaligned_le32(f, dst + 12);
--
-+ poly1305_emit_arm(&dctx->h, dst, dctx->s);
- *dctx = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL(poly1305_final_arch);
---- a/arch/arm64/crypto/poly1305-glue.c
-+++ b/arch/arm64/crypto/poly1305-glue.c
-@@ -21,7 +21,7 @@
- asmlinkage void poly1305_init_arm64(void *state, const u8 *key);
- asmlinkage void poly1305_blocks(void *state, const u8 *src, u32 len, u32 hibit);
- asmlinkage void poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit);
--asmlinkage void poly1305_emit(void *state, __le32 *digest, const u32 *nonce);
-+asmlinkage void poly1305_emit(void *state, u8 *digest, const u32 *nonce);
-
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-
-@@ -162,9 +162,6 @@ EXPORT_SYMBOL(poly1305_update_arch);
-
- void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
- {
-- __le32 digest[4];
-- u64 f = 0;
--
- if (unlikely(dctx->buflen)) {
- dctx->buf[dctx->buflen++] = 1;
- memset(dctx->buf + dctx->buflen, 0,
-@@ -172,18 +169,7 @@ void poly1305_final_arch(struct poly1305
- poly1305_blocks(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
- }
-
-- poly1305_emit(&dctx->h, digest, dctx->s);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]);
-- put_unaligned_le32(f, dst);
-- f = (f >> 32) + le32_to_cpu(digest[1]);
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]);
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]);
-- put_unaligned_le32(f, dst + 12);
--
-+ poly1305_emit(&dctx->h, dst, dctx->s);
- *dctx = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL(poly1305_final_arch);
---- a/arch/mips/crypto/poly1305-glue.c
-+++ b/arch/mips/crypto/poly1305-glue.c
-@@ -15,7 +15,7 @@
-
- asmlinkage void poly1305_init_mips(void *state, const u8 *key);
- asmlinkage void poly1305_blocks_mips(void *state, const u8 *src, u32 len, u32 hibit);
--asmlinkage void poly1305_emit_mips(void *state, __le32 *digest, const u32 *nonce);
-+asmlinkage void poly1305_emit_mips(void *state, u8 *digest, const u32 *nonce);
-
- void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
- {
-@@ -134,9 +134,6 @@ EXPORT_SYMBOL(poly1305_update_arch);
-
- void poly1305_final_arch(struct poly1305_desc_ctx *dctx, u8 *dst)
- {
-- __le32 digest[4];
-- u64 f = 0;
--
- if (unlikely(dctx->buflen)) {
- dctx->buf[dctx->buflen++] = 1;
- memset(dctx->buf + dctx->buflen, 0,
-@@ -144,18 +141,7 @@ void poly1305_final_arch(struct poly1305
- poly1305_blocks_mips(&dctx->h, dctx->buf, POLY1305_BLOCK_SIZE, 0);
- }
-
-- poly1305_emit_mips(&dctx->h, digest, dctx->s);
--
-- /* mac = (h + s) % (2^128) */
-- f = (f >> 32) + le32_to_cpu(digest[0]);
-- put_unaligned_le32(f, dst);
-- f = (f >> 32) + le32_to_cpu(digest[1]);
-- put_unaligned_le32(f, dst + 4);
-- f = (f >> 32) + le32_to_cpu(digest[2]);
-- put_unaligned_le32(f, dst + 8);
-- f = (f >> 32) + le32_to_cpu(digest[3]);
-- put_unaligned_le32(f, dst + 12);
--
-+ poly1305_emit_mips(&dctx->h, dst, dctx->s);
- *dctx = (struct poly1305_desc_ctx){};
- }
- EXPORT_SYMBOL(poly1305_final_arch);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0045-crypto-curve25519-Fix-selftest-build-error.patch b/target/linux/generic/backport-5.4/080-wireguard-0045-crypto-curve25519-Fix-selftest-build-error.patch
deleted file mode 100644
index fa8d8fd6a9..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0045-crypto-curve25519-Fix-selftest-build-error.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Herbert Xu <herbert@gondor.apana.org.au>
-Date: Wed, 8 Jan 2020 12:37:35 +0800
-Subject: [PATCH] crypto: curve25519 - Fix selftest build error
-
-commit a8bdf2c42ee4d1ee42af1f3601f85de94e70a421 upstream.
-
-If CRYPTO_CURVE25519 is y, CRYPTO_LIB_CURVE25519_GENERIC will be
-y, but CRYPTO_LIB_CURVE25519 may be set to m, this causes build
-errors:
-
-lib/crypto/curve25519-selftest.o: In function `curve25519':
-curve25519-selftest.c:(.text.unlikely+0xc): undefined reference to `curve25519_arch'
-lib/crypto/curve25519-selftest.o: In function `curve25519_selftest':
-curve25519-selftest.c:(.init.text+0x17e): undefined reference to `curve25519_base_arch'
-
-This is because the curve25519 self-test code is being controlled
-by the GENERIC option rather than the overall CURVE25519 option,
-as is the case with blake2s. To recap, the GENERIC and ARCH options
-for CURVE25519 are internal only and selected by users such as
-the Crypto API, or the externally visible CURVE25519 option which
-in turn is selected by wireguard. The self-test is specific to the
-the external CURVE25519 option and should not be enabled by the
-Crypto API.
-
-This patch fixes this by splitting the GENERIC module from the
-CURVE25519 module with the latter now containing just the self-test.
-
-Reported-by: Hulk Robot <hulkci@huawei.com>
-Fixes: aa127963f1ca ("crypto: lib/curve25519 - re-add selftests")
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/Makefile | 9 ++++++---
- lib/crypto/curve25519-generic.c | 24 ++++++++++++++++++++++++
- lib/crypto/curve25519.c | 7 -------
- 3 files changed, 30 insertions(+), 10 deletions(-)
- create mode 100644 lib/crypto/curve25519-generic.c
-
---- a/lib/crypto/Makefile
-+++ b/lib/crypto/Makefile
-@@ -19,9 +19,12 @@ libblake2s-y += blake2s.o
- obj-$(CONFIG_CRYPTO_LIB_CHACHA20POLY1305) += libchacha20poly1305.o
- libchacha20poly1305-y += chacha20poly1305.o
-
--obj-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += libcurve25519.o
--libcurve25519-y := curve25519-fiat32.o
--libcurve25519-$(CONFIG_ARCH_SUPPORTS_INT128) := curve25519-hacl64.o
-+obj-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += libcurve25519-generic.o
-+libcurve25519-generic-y := curve25519-fiat32.o
-+libcurve25519-generic-$(CONFIG_ARCH_SUPPORTS_INT128) := curve25519-hacl64.o
-+libcurve25519-generic-y += curve25519-generic.o
-+
-+obj-$(CONFIG_CRYPTO_LIB_CURVE25519) += libcurve25519.o
- libcurve25519-y += curve25519.o
-
- obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o
---- /dev/null
-+++ b/lib/crypto/curve25519-generic.c
-@@ -0,0 +1,24 @@
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This is an implementation of the Curve25519 ECDH algorithm, using either
-+ * a 32-bit implementation or a 64-bit implementation with 128-bit integers,
-+ * depending on what is supported by the target compiler.
-+ *
-+ * Information: https://cr.yp.to/ecdh.html
-+ */
-+
-+#include <crypto/curve25519.h>
-+#include <linux/module.h>
-+
-+const u8 curve25519_null_point[CURVE25519_KEY_SIZE] __aligned(32) = { 0 };
-+const u8 curve25519_base_point[CURVE25519_KEY_SIZE] __aligned(32) = { 9 };
-+
-+EXPORT_SYMBOL(curve25519_null_point);
-+EXPORT_SYMBOL(curve25519_base_point);
-+EXPORT_SYMBOL(curve25519_generic);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("Curve25519 scalar multiplication");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
---- a/lib/crypto/curve25519.c
-+++ b/lib/crypto/curve25519.c
-@@ -15,13 +15,6 @@
-
- bool curve25519_selftest(void);
-
--const u8 curve25519_null_point[CURVE25519_KEY_SIZE] __aligned(32) = { 0 };
--const u8 curve25519_base_point[CURVE25519_KEY_SIZE] __aligned(32) = { 9 };
--
--EXPORT_SYMBOL(curve25519_null_point);
--EXPORT_SYMBOL(curve25519_base_point);
--EXPORT_SYMBOL(curve25519_generic);
--
- static int __init mod_init(void)
- {
- if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0046-crypto-x86-poly1305-fix-.gitignore-typo.patch b/target/linux/generic/backport-5.4/080-wireguard-0046-crypto-x86-poly1305-fix-.gitignore-typo.patch
deleted file mode 100644
index 27f0417ac3..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0046-crypto-x86-poly1305-fix-.gitignore-typo.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 16 Jan 2020 18:23:55 +0100
-Subject: [PATCH] crypto: x86/poly1305 - fix .gitignore typo
-
-commit 1f6868995326cc82102049e349d8dbd116bdb656 upstream.
-
-Admist the kbuild robot induced changes, the .gitignore file for the
-generated file wasn't updated with the non-clashing filename. This
-commit adjusts that.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/.gitignore | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/x86/crypto/.gitignore
-+++ b/arch/x86/crypto/.gitignore
-@@ -1 +1 @@
--poly1305-x86_64.S
-+poly1305-x86_64-cryptogams.S
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0047-crypto-chacha20poly1305-add-back-missing-test-vector.patch b/target/linux/generic/backport-5.4/080-wireguard-0047-crypto-chacha20poly1305-add-back-missing-test-vector.patch
deleted file mode 100644
index eda969577a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0047-crypto-chacha20poly1305-add-back-missing-test-vector.patch
+++ /dev/null
@@ -1,1858 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 16 Jan 2020 21:26:34 +0100
-Subject: [PATCH] crypto: chacha20poly1305 - add back missing test vectors and
- test chunking
-
-commit 72c7943792c9e7788ddd182337bcf8f650cf56f5 upstream.
-
-When this was originally ported, the 12-byte nonce vectors were left out
-to keep things simple. I agree that we don't need nor want a library
-interface for 12-byte nonces. But these test vectors were specially
-crafted to look at issues in the underlying primitives and related
-interactions. Therefore, we actually want to keep around all of the
-test vectors, and simply have a helper function to test them with.
-
-Secondly, the sglist-based chunking code in the library interface is
-rather complicated, so this adds a developer-only test for ensuring that
-all the book keeping is correct, across a wide array of possibilities.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/chacha20poly1305-selftest.c | 1712 +++++++++++++++++++++++-
- 1 file changed, 1698 insertions(+), 14 deletions(-)
-
---- a/lib/crypto/chacha20poly1305-selftest.c
-+++ b/lib/crypto/chacha20poly1305-selftest.c
-@@ -4,6 +4,7 @@
- */
-
- #include <crypto/chacha20poly1305.h>
-+#include <crypto/chacha.h>
- #include <crypto/poly1305.h>
-
- #include <asm/unaligned.h>
-@@ -1926,6 +1927,1104 @@ static const u8 enc_key012[] __initconst
- 0x65, 0x91, 0x6e, 0x2a, 0x79, 0x22, 0xda, 0x64
- };
-
-+/* wycheproof - rfc7539 */
-+static const u8 enc_input013[] __initconst = {
-+ 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61,
-+ 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c,
-+ 0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20,
-+ 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73,
-+ 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39,
-+ 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63,
-+ 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66,
-+ 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f,
-+ 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20,
-+ 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20,
-+ 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75,
-+ 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73,
-+ 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f,
-+ 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69,
-+ 0x74, 0x2e
-+};
-+static const u8 enc_output013[] __initconst = {
-+ 0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb,
-+ 0x7b, 0x86, 0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2,
-+ 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe,
-+ 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6,
-+ 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12,
-+ 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b,
-+ 0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29,
-+ 0x05, 0xd6, 0xa5, 0xb6, 0x7e, 0xcd, 0x3b, 0x36,
-+ 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c,
-+ 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58,
-+ 0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94,
-+ 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc,
-+ 0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d,
-+ 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce, 0xc6, 0x4b,
-+ 0x61, 0x16, 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09,
-+ 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60,
-+ 0x06, 0x91
-+};
-+static const u8 enc_assoc013[] __initconst = {
-+ 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3,
-+ 0xc4, 0xc5, 0xc6, 0xc7
-+};
-+static const u8 enc_nonce013[] __initconst = {
-+ 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43,
-+ 0x44, 0x45, 0x46, 0x47
-+};
-+static const u8 enc_key013[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input014[] __initconst = { };
-+static const u8 enc_output014[] __initconst = {
-+ 0x76, 0xac, 0xb3, 0x42, 0xcf, 0x31, 0x66, 0xa5,
-+ 0xb6, 0x3c, 0x0c, 0x0e, 0xa1, 0x38, 0x3c, 0x8d
-+};
-+static const u8 enc_assoc014[] __initconst = { };
-+static const u8 enc_nonce014[] __initconst = {
-+ 0x4d, 0xa5, 0xbf, 0x8d, 0xfd, 0x58, 0x52, 0xc1,
-+ 0xea, 0x12, 0x37, 0x9d
-+};
-+static const u8 enc_key014[] __initconst = {
-+ 0x80, 0xba, 0x31, 0x92, 0xc8, 0x03, 0xce, 0x96,
-+ 0x5e, 0xa3, 0x71, 0xd5, 0xff, 0x07, 0x3c, 0xf0,
-+ 0xf4, 0x3b, 0x6a, 0x2a, 0xb5, 0x76, 0xb2, 0x08,
-+ 0x42, 0x6e, 0x11, 0x40, 0x9c, 0x09, 0xb9, 0xb0
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input015[] __initconst = { };
-+static const u8 enc_output015[] __initconst = {
-+ 0x90, 0x6f, 0xa6, 0x28, 0x4b, 0x52, 0xf8, 0x7b,
-+ 0x73, 0x59, 0xcb, 0xaa, 0x75, 0x63, 0xc7, 0x09
-+};
-+static const u8 enc_assoc015[] __initconst = {
-+ 0xbd, 0x50, 0x67, 0x64, 0xf2, 0xd2, 0xc4, 0x10
-+};
-+static const u8 enc_nonce015[] __initconst = {
-+ 0xa9, 0x2e, 0xf0, 0xac, 0x99, 0x1d, 0xd5, 0x16,
-+ 0xa3, 0xc6, 0xf6, 0x89
-+};
-+static const u8 enc_key015[] __initconst = {
-+ 0x7a, 0x4c, 0xd7, 0x59, 0x17, 0x2e, 0x02, 0xeb,
-+ 0x20, 0x4d, 0xb2, 0xc3, 0xf5, 0xc7, 0x46, 0x22,
-+ 0x7d, 0xf5, 0x84, 0xfc, 0x13, 0x45, 0x19, 0x63,
-+ 0x91, 0xdb, 0xb9, 0x57, 0x7a, 0x25, 0x07, 0x42
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input016[] __initconst = {
-+ 0x2a
-+};
-+static const u8 enc_output016[] __initconst = {
-+ 0x3a, 0xca, 0xc2, 0x7d, 0xec, 0x09, 0x68, 0x80,
-+ 0x1e, 0x9f, 0x6e, 0xde, 0xd6, 0x9d, 0x80, 0x75,
-+ 0x22
-+};
-+static const u8 enc_assoc016[] __initconst = { };
-+static const u8 enc_nonce016[] __initconst = {
-+ 0x99, 0xe2, 0x3e, 0xc4, 0x89, 0x85, 0xbc, 0xcd,
-+ 0xee, 0xab, 0x60, 0xf1
-+};
-+static const u8 enc_key016[] __initconst = {
-+ 0xcc, 0x56, 0xb6, 0x80, 0x55, 0x2e, 0xb7, 0x50,
-+ 0x08, 0xf5, 0x48, 0x4b, 0x4c, 0xb8, 0x03, 0xfa,
-+ 0x50, 0x63, 0xeb, 0xd6, 0xea, 0xb9, 0x1f, 0x6a,
-+ 0xb6, 0xae, 0xf4, 0x91, 0x6a, 0x76, 0x62, 0x73
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input017[] __initconst = {
-+ 0x51
-+};
-+static const u8 enc_output017[] __initconst = {
-+ 0xc4, 0x16, 0x83, 0x10, 0xca, 0x45, 0xb1, 0xf7,
-+ 0xc6, 0x6c, 0xad, 0x4e, 0x99, 0xe4, 0x3f, 0x72,
-+ 0xb9
-+};
-+static const u8 enc_assoc017[] __initconst = {
-+ 0x91, 0xca, 0x6c, 0x59, 0x2c, 0xbc, 0xca, 0x53
-+};
-+static const u8 enc_nonce017[] __initconst = {
-+ 0xab, 0x0d, 0xca, 0x71, 0x6e, 0xe0, 0x51, 0xd2,
-+ 0x78, 0x2f, 0x44, 0x03
-+};
-+static const u8 enc_key017[] __initconst = {
-+ 0x46, 0xf0, 0x25, 0x49, 0x65, 0xf7, 0x69, 0xd5,
-+ 0x2b, 0xdb, 0x4a, 0x70, 0xb4, 0x43, 0x19, 0x9f,
-+ 0x8e, 0xf2, 0x07, 0x52, 0x0d, 0x12, 0x20, 0xc5,
-+ 0x5e, 0x4b, 0x70, 0xf0, 0xfd, 0xa6, 0x20, 0xee
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input018[] __initconst = {
-+ 0x5c, 0x60
-+};
-+static const u8 enc_output018[] __initconst = {
-+ 0x4d, 0x13, 0x91, 0xe8, 0xb6, 0x1e, 0xfb, 0x39,
-+ 0xc1, 0x22, 0x19, 0x54, 0x53, 0x07, 0x7b, 0x22,
-+ 0xe5, 0xe2
-+};
-+static const u8 enc_assoc018[] __initconst = { };
-+static const u8 enc_nonce018[] __initconst = {
-+ 0x46, 0x1a, 0xf1, 0x22, 0xe9, 0xf2, 0xe0, 0x34,
-+ 0x7e, 0x03, 0xf2, 0xdb
-+};
-+static const u8 enc_key018[] __initconst = {
-+ 0x2f, 0x7f, 0x7e, 0x4f, 0x59, 0x2b, 0xb3, 0x89,
-+ 0x19, 0x49, 0x89, 0x74, 0x35, 0x07, 0xbf, 0x3e,
-+ 0xe9, 0xcb, 0xde, 0x17, 0x86, 0xb6, 0x69, 0x5f,
-+ 0xe6, 0xc0, 0x25, 0xfd, 0x9b, 0xa4, 0xc1, 0x00
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input019[] __initconst = {
-+ 0xdd, 0xf2
-+};
-+static const u8 enc_output019[] __initconst = {
-+ 0xb6, 0x0d, 0xea, 0xd0, 0xfd, 0x46, 0x97, 0xec,
-+ 0x2e, 0x55, 0x58, 0x23, 0x77, 0x19, 0xd0, 0x24,
-+ 0x37, 0xa2
-+};
-+static const u8 enc_assoc019[] __initconst = {
-+ 0x88, 0x36, 0x4f, 0xc8, 0x06, 0x05, 0x18, 0xbf
-+};
-+static const u8 enc_nonce019[] __initconst = {
-+ 0x61, 0x54, 0x6b, 0xa5, 0xf1, 0x72, 0x05, 0x90,
-+ 0xb6, 0x04, 0x0a, 0xc6
-+};
-+static const u8 enc_key019[] __initconst = {
-+ 0xc8, 0x83, 0x3d, 0xce, 0x5e, 0xa9, 0xf2, 0x48,
-+ 0xaa, 0x20, 0x30, 0xea, 0xcf, 0xe7, 0x2b, 0xff,
-+ 0xe6, 0x9a, 0x62, 0x0c, 0xaf, 0x79, 0x33, 0x44,
-+ 0xe5, 0x71, 0x8f, 0xe0, 0xd7, 0xab, 0x1a, 0x58
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input020[] __initconst = {
-+ 0xab, 0x85, 0xe9, 0xc1, 0x57, 0x17, 0x31
-+};
-+static const u8 enc_output020[] __initconst = {
-+ 0x5d, 0xfe, 0x34, 0x40, 0xdb, 0xb3, 0xc3, 0xed,
-+ 0x7a, 0x43, 0x4e, 0x26, 0x02, 0xd3, 0x94, 0x28,
-+ 0x1e, 0x0a, 0xfa, 0x9f, 0xb7, 0xaa, 0x42
-+};
-+static const u8 enc_assoc020[] __initconst = { };
-+static const u8 enc_nonce020[] __initconst = {
-+ 0x3c, 0x4e, 0x65, 0x4d, 0x66, 0x3f, 0xa4, 0x59,
-+ 0x6d, 0xc5, 0x5b, 0xb7
-+};
-+static const u8 enc_key020[] __initconst = {
-+ 0x55, 0x56, 0x81, 0x58, 0xd3, 0xa6, 0x48, 0x3f,
-+ 0x1f, 0x70, 0x21, 0xea, 0xb6, 0x9b, 0x70, 0x3f,
-+ 0x61, 0x42, 0x51, 0xca, 0xdc, 0x1a, 0xf5, 0xd3,
-+ 0x4a, 0x37, 0x4f, 0xdb, 0xfc, 0x5a, 0xda, 0xc7
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input021[] __initconst = {
-+ 0x4e, 0xe5, 0xcd, 0xa2, 0x0d, 0x42, 0x90
-+};
-+static const u8 enc_output021[] __initconst = {
-+ 0x4b, 0xd4, 0x72, 0x12, 0x94, 0x1c, 0xe3, 0x18,
-+ 0x5f, 0x14, 0x08, 0xee, 0x7f, 0xbf, 0x18, 0xf5,
-+ 0xab, 0xad, 0x6e, 0x22, 0x53, 0xa1, 0xba
-+};
-+static const u8 enc_assoc021[] __initconst = {
-+ 0x84, 0xe4, 0x6b, 0xe8, 0xc0, 0x91, 0x90, 0x53
-+};
-+static const u8 enc_nonce021[] __initconst = {
-+ 0x58, 0x38, 0x93, 0x75, 0xc6, 0x9e, 0xe3, 0x98,
-+ 0xde, 0x94, 0x83, 0x96
-+};
-+static const u8 enc_key021[] __initconst = {
-+ 0xe3, 0xc0, 0x9e, 0x7f, 0xab, 0x1a, 0xef, 0xb5,
-+ 0x16, 0xda, 0x6a, 0x33, 0x02, 0x2a, 0x1d, 0xd4,
-+ 0xeb, 0x27, 0x2c, 0x80, 0xd5, 0x40, 0xc5, 0xda,
-+ 0x52, 0xa7, 0x30, 0xf3, 0x4d, 0x84, 0x0d, 0x7f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input022[] __initconst = {
-+ 0xbe, 0x33, 0x08, 0xf7, 0x2a, 0x2c, 0x6a, 0xed
-+};
-+static const u8 enc_output022[] __initconst = {
-+ 0x8e, 0x94, 0x39, 0xa5, 0x6e, 0xee, 0xc8, 0x17,
-+ 0xfb, 0xe8, 0xa6, 0xed, 0x8f, 0xab, 0xb1, 0x93,
-+ 0x75, 0x39, 0xdd, 0x6c, 0x00, 0xe9, 0x00, 0x21
-+};
-+static const u8 enc_assoc022[] __initconst = { };
-+static const u8 enc_nonce022[] __initconst = {
-+ 0x4f, 0x07, 0xaf, 0xed, 0xfd, 0xc3, 0xb6, 0xc2,
-+ 0x36, 0x18, 0x23, 0xd3
-+};
-+static const u8 enc_key022[] __initconst = {
-+ 0x51, 0xe4, 0xbf, 0x2b, 0xad, 0x92, 0xb7, 0xaf,
-+ 0xf1, 0xa4, 0xbc, 0x05, 0x55, 0x0b, 0xa8, 0x1d,
-+ 0xf4, 0xb9, 0x6f, 0xab, 0xf4, 0x1c, 0x12, 0xc7,
-+ 0xb0, 0x0e, 0x60, 0xe4, 0x8d, 0xb7, 0xe1, 0x52
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input023[] __initconst = {
-+ 0xa4, 0xc9, 0xc2, 0x80, 0x1b, 0x71, 0xf7, 0xdf
-+};
-+static const u8 enc_output023[] __initconst = {
-+ 0xb9, 0xb9, 0x10, 0x43, 0x3a, 0xf0, 0x52, 0xb0,
-+ 0x45, 0x30, 0xf5, 0x1a, 0xee, 0xe0, 0x24, 0xe0,
-+ 0xa4, 0x45, 0xa6, 0x32, 0x8f, 0xa6, 0x7a, 0x18
-+};
-+static const u8 enc_assoc023[] __initconst = {
-+ 0x66, 0xc0, 0xae, 0x70, 0x07, 0x6c, 0xb1, 0x4d
-+};
-+static const u8 enc_nonce023[] __initconst = {
-+ 0xb4, 0xea, 0x66, 0x6e, 0xe1, 0x19, 0x56, 0x33,
-+ 0x66, 0x48, 0x4a, 0x78
-+};
-+static const u8 enc_key023[] __initconst = {
-+ 0x11, 0x31, 0xc1, 0x41, 0x85, 0x77, 0xa0, 0x54,
-+ 0xde, 0x7a, 0x4a, 0xc5, 0x51, 0x95, 0x0f, 0x1a,
-+ 0x05, 0x3f, 0x9a, 0xe4, 0x6e, 0x5b, 0x75, 0xfe,
-+ 0x4a, 0xbd, 0x56, 0x08, 0xd7, 0xcd, 0xda, 0xdd
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input024[] __initconst = {
-+ 0x42, 0xba, 0xae, 0x59, 0x78, 0xfe, 0xaf, 0x5c,
-+ 0x36, 0x8d, 0x14, 0xe0
-+};
-+static const u8 enc_output024[] __initconst = {
-+ 0xff, 0x7d, 0xc2, 0x03, 0xb2, 0x6c, 0x46, 0x7a,
-+ 0x6b, 0x50, 0xdb, 0x33, 0x57, 0x8c, 0x0f, 0x27,
-+ 0x58, 0xc2, 0xe1, 0x4e, 0x36, 0xd4, 0xfc, 0x10,
-+ 0x6d, 0xcb, 0x29, 0xb4
-+};
-+static const u8 enc_assoc024[] __initconst = { };
-+static const u8 enc_nonce024[] __initconst = {
-+ 0x9a, 0x59, 0xfc, 0xe2, 0x6d, 0xf0, 0x00, 0x5e,
-+ 0x07, 0x53, 0x86, 0x56
-+};
-+static const u8 enc_key024[] __initconst = {
-+ 0x99, 0xb6, 0x2b, 0xd5, 0xaf, 0xbe, 0x3f, 0xb0,
-+ 0x15, 0xbd, 0xe9, 0x3f, 0x0a, 0xbf, 0x48, 0x39,
-+ 0x57, 0xa1, 0xc3, 0xeb, 0x3c, 0xa5, 0x9c, 0xb5,
-+ 0x0b, 0x39, 0xf7, 0xf8, 0xa9, 0xcc, 0x51, 0xbe
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input025[] __initconst = {
-+ 0xfd, 0xc8, 0x5b, 0x94, 0xa4, 0xb2, 0xa6, 0xb7,
-+ 0x59, 0xb1, 0xa0, 0xda
-+};
-+static const u8 enc_output025[] __initconst = {
-+ 0x9f, 0x88, 0x16, 0xde, 0x09, 0x94, 0xe9, 0x38,
-+ 0xd9, 0xe5, 0x3f, 0x95, 0xd0, 0x86, 0xfc, 0x6c,
-+ 0x9d, 0x8f, 0xa9, 0x15, 0xfd, 0x84, 0x23, 0xa7,
-+ 0xcf, 0x05, 0x07, 0x2f
-+};
-+static const u8 enc_assoc025[] __initconst = {
-+ 0xa5, 0x06, 0xe1, 0xa5, 0xc6, 0x90, 0x93, 0xf9
-+};
-+static const u8 enc_nonce025[] __initconst = {
-+ 0x58, 0xdb, 0xd4, 0xad, 0x2c, 0x4a, 0xd3, 0x5d,
-+ 0xd9, 0x06, 0xe9, 0xce
-+};
-+static const u8 enc_key025[] __initconst = {
-+ 0x85, 0xf3, 0x5b, 0x62, 0x82, 0xcf, 0xf4, 0x40,
-+ 0xbc, 0x10, 0x20, 0xc8, 0x13, 0x6f, 0xf2, 0x70,
-+ 0x31, 0x11, 0x0f, 0xa6, 0x3e, 0xc1, 0x6f, 0x1e,
-+ 0x82, 0x51, 0x18, 0xb0, 0x06, 0xb9, 0x12, 0x57
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input026[] __initconst = {
-+ 0x51, 0xf8, 0xc1, 0xf7, 0x31, 0xea, 0x14, 0xac,
-+ 0xdb, 0x21, 0x0a, 0x6d, 0x97, 0x3e, 0x07
-+};
-+static const u8 enc_output026[] __initconst = {
-+ 0x0b, 0x29, 0x63, 0x8e, 0x1f, 0xbd, 0xd6, 0xdf,
-+ 0x53, 0x97, 0x0b, 0xe2, 0x21, 0x00, 0x42, 0x2a,
-+ 0x91, 0x34, 0x08, 0x7d, 0x67, 0xa4, 0x6e, 0x79,
-+ 0x17, 0x8d, 0x0a, 0x93, 0xf5, 0xe1, 0xd2
-+};
-+static const u8 enc_assoc026[] __initconst = { };
-+static const u8 enc_nonce026[] __initconst = {
-+ 0x68, 0xab, 0x7f, 0xdb, 0xf6, 0x19, 0x01, 0xda,
-+ 0xd4, 0x61, 0xd2, 0x3c
-+};
-+static const u8 enc_key026[] __initconst = {
-+ 0x67, 0x11, 0x96, 0x27, 0xbd, 0x98, 0x8e, 0xda,
-+ 0x90, 0x62, 0x19, 0xe0, 0x8c, 0x0d, 0x0d, 0x77,
-+ 0x9a, 0x07, 0xd2, 0x08, 0xce, 0x8a, 0x4f, 0xe0,
-+ 0x70, 0x9a, 0xf7, 0x55, 0xee, 0xec, 0x6d, 0xcb
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input027[] __initconst = {
-+ 0x97, 0x46, 0x9d, 0xa6, 0x67, 0xd6, 0x11, 0x0f,
-+ 0x9c, 0xbd, 0xa1, 0xd1, 0xa2, 0x06, 0x73
-+};
-+static const u8 enc_output027[] __initconst = {
-+ 0x32, 0xdb, 0x66, 0xc4, 0xa3, 0x81, 0x9d, 0x81,
-+ 0x55, 0x74, 0x55, 0xe5, 0x98, 0x0f, 0xed, 0xfe,
-+ 0xae, 0x30, 0xde, 0xc9, 0x4e, 0x6a, 0xd3, 0xa9,
-+ 0xee, 0xa0, 0x6a, 0x0d, 0x70, 0x39, 0x17
-+};
-+static const u8 enc_assoc027[] __initconst = {
-+ 0x64, 0x53, 0xa5, 0x33, 0x84, 0x63, 0x22, 0x12
-+};
-+static const u8 enc_nonce027[] __initconst = {
-+ 0xd9, 0x5b, 0x32, 0x43, 0xaf, 0xae, 0xf7, 0x14,
-+ 0xc5, 0x03, 0x5b, 0x6a
-+};
-+static const u8 enc_key027[] __initconst = {
-+ 0xe6, 0xf1, 0x11, 0x8d, 0x41, 0xe4, 0xb4, 0x3f,
-+ 0xb5, 0x82, 0x21, 0xb7, 0xed, 0x79, 0x67, 0x38,
-+ 0x34, 0xe0, 0xd8, 0xac, 0x5c, 0x4f, 0xa6, 0x0b,
-+ 0xbc, 0x8b, 0xc4, 0x89, 0x3a, 0x58, 0x89, 0x4d
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input028[] __initconst = {
-+ 0x54, 0x9b, 0x36, 0x5a, 0xf9, 0x13, 0xf3, 0xb0,
-+ 0x81, 0x13, 0x1c, 0xcb, 0x6b, 0x82, 0x55, 0x88
-+};
-+static const u8 enc_output028[] __initconst = {
-+ 0xe9, 0x11, 0x0e, 0x9f, 0x56, 0xab, 0x3c, 0xa4,
-+ 0x83, 0x50, 0x0c, 0xea, 0xba, 0xb6, 0x7a, 0x13,
-+ 0x83, 0x6c, 0xca, 0xbf, 0x15, 0xa6, 0xa2, 0x2a,
-+ 0x51, 0xc1, 0x07, 0x1c, 0xfa, 0x68, 0xfa, 0x0c
-+};
-+static const u8 enc_assoc028[] __initconst = { };
-+static const u8 enc_nonce028[] __initconst = {
-+ 0x2f, 0xcb, 0x1b, 0x38, 0xa9, 0x9e, 0x71, 0xb8,
-+ 0x47, 0x40, 0xad, 0x9b
-+};
-+static const u8 enc_key028[] __initconst = {
-+ 0x59, 0xd4, 0xea, 0xfb, 0x4d, 0xe0, 0xcf, 0xc7,
-+ 0xd3, 0xdb, 0x99, 0xa8, 0xf5, 0x4b, 0x15, 0xd7,
-+ 0xb3, 0x9f, 0x0a, 0xcc, 0x8d, 0xa6, 0x97, 0x63,
-+ 0xb0, 0x19, 0xc1, 0x69, 0x9f, 0x87, 0x67, 0x4a
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input029[] __initconst = {
-+ 0x55, 0xa4, 0x65, 0x64, 0x4f, 0x5b, 0x65, 0x09,
-+ 0x28, 0xcb, 0xee, 0x7c, 0x06, 0x32, 0x14, 0xd6
-+};
-+static const u8 enc_output029[] __initconst = {
-+ 0xe4, 0xb1, 0x13, 0xcb, 0x77, 0x59, 0x45, 0xf3,
-+ 0xd3, 0xa8, 0xae, 0x9e, 0xc1, 0x41, 0xc0, 0x0c,
-+ 0x7c, 0x43, 0xf1, 0x6c, 0xe0, 0x96, 0xd0, 0xdc,
-+ 0x27, 0xc9, 0x58, 0x49, 0xdc, 0x38, 0x3b, 0x7d
-+};
-+static const u8 enc_assoc029[] __initconst = {
-+ 0x03, 0x45, 0x85, 0x62, 0x1a, 0xf8, 0xd7, 0xff
-+};
-+static const u8 enc_nonce029[] __initconst = {
-+ 0x11, 0x8a, 0x69, 0x64, 0xc2, 0xd3, 0xe3, 0x80,
-+ 0x07, 0x1f, 0x52, 0x66
-+};
-+static const u8 enc_key029[] __initconst = {
-+ 0xb9, 0x07, 0xa4, 0x50, 0x75, 0x51, 0x3f, 0xe8,
-+ 0xa8, 0x01, 0x9e, 0xde, 0xe3, 0xf2, 0x59, 0x14,
-+ 0x87, 0xb2, 0xa0, 0x30, 0xb0, 0x3c, 0x6e, 0x1d,
-+ 0x77, 0x1c, 0x86, 0x25, 0x71, 0xd2, 0xea, 0x1e
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input030[] __initconst = {
-+ 0x3f, 0xf1, 0x51, 0x4b, 0x1c, 0x50, 0x39, 0x15,
-+ 0x91, 0x8f, 0x0c, 0x0c, 0x31, 0x09, 0x4a, 0x6e,
-+ 0x1f
-+};
-+static const u8 enc_output030[] __initconst = {
-+ 0x02, 0xcc, 0x3a, 0xcb, 0x5e, 0xe1, 0xfc, 0xdd,
-+ 0x12, 0xa0, 0x3b, 0xb8, 0x57, 0x97, 0x64, 0x74,
-+ 0xd3, 0xd8, 0x3b, 0x74, 0x63, 0xa2, 0xc3, 0x80,
-+ 0x0f, 0xe9, 0x58, 0xc2, 0x8e, 0xaa, 0x29, 0x08,
-+ 0x13
-+};
-+static const u8 enc_assoc030[] __initconst = { };
-+static const u8 enc_nonce030[] __initconst = {
-+ 0x45, 0xaa, 0xa3, 0xe5, 0xd1, 0x6d, 0x2d, 0x42,
-+ 0xdc, 0x03, 0x44, 0x5d
-+};
-+static const u8 enc_key030[] __initconst = {
-+ 0x3b, 0x24, 0x58, 0xd8, 0x17, 0x6e, 0x16, 0x21,
-+ 0xc0, 0xcc, 0x24, 0xc0, 0xc0, 0xe2, 0x4c, 0x1e,
-+ 0x80, 0xd7, 0x2f, 0x7e, 0xe9, 0x14, 0x9a, 0x4b,
-+ 0x16, 0x61, 0x76, 0x62, 0x96, 0x16, 0xd0, 0x11
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input031[] __initconst = {
-+ 0x63, 0x85, 0x8c, 0xa3, 0xe2, 0xce, 0x69, 0x88,
-+ 0x7b, 0x57, 0x8a, 0x3c, 0x16, 0x7b, 0x42, 0x1c,
-+ 0x9c
-+};
-+static const u8 enc_output031[] __initconst = {
-+ 0x35, 0x76, 0x64, 0x88, 0xd2, 0xbc, 0x7c, 0x2b,
-+ 0x8d, 0x17, 0xcb, 0xbb, 0x9a, 0xbf, 0xad, 0x9e,
-+ 0x6d, 0x1f, 0x39, 0x1e, 0x65, 0x7b, 0x27, 0x38,
-+ 0xdd, 0xa0, 0x84, 0x48, 0xcb, 0xa2, 0x81, 0x1c,
-+ 0xeb
-+};
-+static const u8 enc_assoc031[] __initconst = {
-+ 0x9a, 0xaf, 0x29, 0x9e, 0xee, 0xa7, 0x8f, 0x79
-+};
-+static const u8 enc_nonce031[] __initconst = {
-+ 0xf0, 0x38, 0x4f, 0xb8, 0x76, 0x12, 0x14, 0x10,
-+ 0x63, 0x3d, 0x99, 0x3d
-+};
-+static const u8 enc_key031[] __initconst = {
-+ 0xf6, 0x0c, 0x6a, 0x1b, 0x62, 0x57, 0x25, 0xf7,
-+ 0x6c, 0x70, 0x37, 0xb4, 0x8f, 0xe3, 0x57, 0x7f,
-+ 0xa7, 0xf7, 0xb8, 0x7b, 0x1b, 0xd5, 0xa9, 0x82,
-+ 0x17, 0x6d, 0x18, 0x23, 0x06, 0xff, 0xb8, 0x70
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input032[] __initconst = {
-+ 0x10, 0xf1, 0xec, 0xf9, 0xc6, 0x05, 0x84, 0x66,
-+ 0x5d, 0x9a, 0xe5, 0xef, 0xe2, 0x79, 0xe7, 0xf7,
-+ 0x37, 0x7e, 0xea, 0x69, 0x16, 0xd2, 0xb1, 0x11
-+};
-+static const u8 enc_output032[] __initconst = {
-+ 0x42, 0xf2, 0x6c, 0x56, 0xcb, 0x4b, 0xe2, 0x1d,
-+ 0x9d, 0x8d, 0x0c, 0x80, 0xfc, 0x99, 0xdd, 0xe0,
-+ 0x0d, 0x75, 0xf3, 0x80, 0x74, 0xbf, 0xe7, 0x64,
-+ 0x54, 0xaa, 0x7e, 0x13, 0xd4, 0x8f, 0xff, 0x7d,
-+ 0x75, 0x57, 0x03, 0x94, 0x57, 0x04, 0x0a, 0x3a
-+};
-+static const u8 enc_assoc032[] __initconst = { };
-+static const u8 enc_nonce032[] __initconst = {
-+ 0xe6, 0xb1, 0xad, 0xf2, 0xfd, 0x58, 0xa8, 0x76,
-+ 0x2c, 0x65, 0xf3, 0x1b
-+};
-+static const u8 enc_key032[] __initconst = {
-+ 0x02, 0x12, 0xa8, 0xde, 0x50, 0x07, 0xed, 0x87,
-+ 0xb3, 0x3f, 0x1a, 0x70, 0x90, 0xb6, 0x11, 0x4f,
-+ 0x9e, 0x08, 0xce, 0xfd, 0x96, 0x07, 0xf2, 0xc2,
-+ 0x76, 0xbd, 0xcf, 0xdb, 0xc5, 0xce, 0x9c, 0xd7
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input033[] __initconst = {
-+ 0x92, 0x22, 0xf9, 0x01, 0x8e, 0x54, 0xfd, 0x6d,
-+ 0xe1, 0x20, 0x08, 0x06, 0xa9, 0xee, 0x8e, 0x4c,
-+ 0xc9, 0x04, 0xd2, 0x9f, 0x25, 0xcb, 0xa1, 0x93
-+};
-+static const u8 enc_output033[] __initconst = {
-+ 0x12, 0x30, 0x32, 0x43, 0x7b, 0x4b, 0xfd, 0x69,
-+ 0x20, 0xe8, 0xf7, 0xe7, 0xe0, 0x08, 0x7a, 0xe4,
-+ 0x88, 0x9e, 0xbe, 0x7a, 0x0a, 0xd0, 0xe9, 0x00,
-+ 0x3c, 0xf6, 0x8f, 0x17, 0x95, 0x50, 0xda, 0x63,
-+ 0xd3, 0xb9, 0x6c, 0x2d, 0x55, 0x41, 0x18, 0x65
-+};
-+static const u8 enc_assoc033[] __initconst = {
-+ 0x3e, 0x8b, 0xc5, 0xad, 0xe1, 0x82, 0xff, 0x08
-+};
-+static const u8 enc_nonce033[] __initconst = {
-+ 0x6b, 0x28, 0x2e, 0xbe, 0xcc, 0x54, 0x1b, 0xcd,
-+ 0x78, 0x34, 0xed, 0x55
-+};
-+static const u8 enc_key033[] __initconst = {
-+ 0xc5, 0xbc, 0x09, 0x56, 0x56, 0x46, 0xe7, 0xed,
-+ 0xda, 0x95, 0x4f, 0x1f, 0x73, 0x92, 0x23, 0xda,
-+ 0xda, 0x20, 0xb9, 0x5c, 0x44, 0xab, 0x03, 0x3d,
-+ 0x0f, 0xae, 0x4b, 0x02, 0x83, 0xd1, 0x8b, 0xe3
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input034[] __initconst = {
-+ 0xb0, 0x53, 0x99, 0x92, 0x86, 0xa2, 0x82, 0x4f,
-+ 0x42, 0xcc, 0x8c, 0x20, 0x3a, 0xb2, 0x4e, 0x2c,
-+ 0x97, 0xa6, 0x85, 0xad, 0xcc, 0x2a, 0xd3, 0x26,
-+ 0x62, 0x55, 0x8e, 0x55, 0xa5, 0xc7, 0x29
-+};
-+static const u8 enc_output034[] __initconst = {
-+ 0x45, 0xc7, 0xd6, 0xb5, 0x3a, 0xca, 0xd4, 0xab,
-+ 0xb6, 0x88, 0x76, 0xa6, 0xe9, 0x6a, 0x48, 0xfb,
-+ 0x59, 0x52, 0x4d, 0x2c, 0x92, 0xc9, 0xd8, 0xa1,
-+ 0x89, 0xc9, 0xfd, 0x2d, 0xb9, 0x17, 0x46, 0x56,
-+ 0x6d, 0x3c, 0xa1, 0x0e, 0x31, 0x1b, 0x69, 0x5f,
-+ 0x3e, 0xae, 0x15, 0x51, 0x65, 0x24, 0x93
-+};
-+static const u8 enc_assoc034[] __initconst = { };
-+static const u8 enc_nonce034[] __initconst = {
-+ 0x04, 0xa9, 0xbe, 0x03, 0x50, 0x8a, 0x5f, 0x31,
-+ 0x37, 0x1a, 0x6f, 0xd2
-+};
-+static const u8 enc_key034[] __initconst = {
-+ 0x2e, 0xb5, 0x1c, 0x46, 0x9a, 0xa8, 0xeb, 0x9e,
-+ 0x6c, 0x54, 0xa8, 0x34, 0x9b, 0xae, 0x50, 0xa2,
-+ 0x0f, 0x0e, 0x38, 0x27, 0x11, 0xbb, 0xa1, 0x15,
-+ 0x2c, 0x42, 0x4f, 0x03, 0xb6, 0x67, 0x1d, 0x71
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input035[] __initconst = {
-+ 0xf4, 0x52, 0x06, 0xab, 0xc2, 0x55, 0x52, 0xb2,
-+ 0xab, 0xc9, 0xab, 0x7f, 0xa2, 0x43, 0x03, 0x5f,
-+ 0xed, 0xaa, 0xdd, 0xc3, 0xb2, 0x29, 0x39, 0x56,
-+ 0xf1, 0xea, 0x6e, 0x71, 0x56, 0xe7, 0xeb
-+};
-+static const u8 enc_output035[] __initconst = {
-+ 0x46, 0xa8, 0x0c, 0x41, 0x87, 0x02, 0x47, 0x20,
-+ 0x08, 0x46, 0x27, 0x58, 0x00, 0x80, 0xdd, 0xe5,
-+ 0xa3, 0xf4, 0xa1, 0x10, 0x93, 0xa7, 0x07, 0x6e,
-+ 0xd6, 0xf3, 0xd3, 0x26, 0xbc, 0x7b, 0x70, 0x53,
-+ 0x4d, 0x4a, 0xa2, 0x83, 0x5a, 0x52, 0xe7, 0x2d,
-+ 0x14, 0xdf, 0x0e, 0x4f, 0x47, 0xf2, 0x5f
-+};
-+static const u8 enc_assoc035[] __initconst = {
-+ 0x37, 0x46, 0x18, 0xa0, 0x6e, 0xa9, 0x8a, 0x48
-+};
-+static const u8 enc_nonce035[] __initconst = {
-+ 0x47, 0x0a, 0x33, 0x9e, 0xcb, 0x32, 0x19, 0xb8,
-+ 0xb8, 0x1a, 0x1f, 0x8b
-+};
-+static const u8 enc_key035[] __initconst = {
-+ 0x7f, 0x5b, 0x74, 0xc0, 0x7e, 0xd1, 0xb4, 0x0f,
-+ 0xd1, 0x43, 0x58, 0xfe, 0x2f, 0xf2, 0xa7, 0x40,
-+ 0xc1, 0x16, 0xc7, 0x70, 0x65, 0x10, 0xe6, 0xa4,
-+ 0x37, 0xf1, 0x9e, 0xa4, 0x99, 0x11, 0xce, 0xc4
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input036[] __initconst = {
-+ 0xb9, 0xc5, 0x54, 0xcb, 0xc3, 0x6a, 0xc1, 0x8a,
-+ 0xe8, 0x97, 0xdf, 0x7b, 0xee, 0xca, 0xc1, 0xdb,
-+ 0xeb, 0x4e, 0xaf, 0xa1, 0x56, 0xbb, 0x60, 0xce,
-+ 0x2e, 0x5d, 0x48, 0xf0, 0x57, 0x15, 0xe6, 0x78
-+};
-+static const u8 enc_output036[] __initconst = {
-+ 0xea, 0x29, 0xaf, 0xa4, 0x9d, 0x36, 0xe8, 0x76,
-+ 0x0f, 0x5f, 0xe1, 0x97, 0x23, 0xb9, 0x81, 0x1e,
-+ 0xd5, 0xd5, 0x19, 0x93, 0x4a, 0x44, 0x0f, 0x50,
-+ 0x81, 0xac, 0x43, 0x0b, 0x95, 0x3b, 0x0e, 0x21,
-+ 0x22, 0x25, 0x41, 0xaf, 0x46, 0xb8, 0x65, 0x33,
-+ 0xc6, 0xb6, 0x8d, 0x2f, 0xf1, 0x08, 0xa7, 0xea
-+};
-+static const u8 enc_assoc036[] __initconst = { };
-+static const u8 enc_nonce036[] __initconst = {
-+ 0x72, 0xcf, 0xd9, 0x0e, 0xf3, 0x02, 0x6c, 0xa2,
-+ 0x2b, 0x7e, 0x6e, 0x6a
-+};
-+static const u8 enc_key036[] __initconst = {
-+ 0xe1, 0x73, 0x1d, 0x58, 0x54, 0xe1, 0xb7, 0x0c,
-+ 0xb3, 0xff, 0xe8, 0xb7, 0x86, 0xa2, 0xb3, 0xeb,
-+ 0xf0, 0x99, 0x43, 0x70, 0x95, 0x47, 0x57, 0xb9,
-+ 0xdc, 0x8c, 0x7b, 0xc5, 0x35, 0x46, 0x34, 0xa3
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input037[] __initconst = {
-+ 0x6b, 0x26, 0x04, 0x99, 0x6c, 0xd3, 0x0c, 0x14,
-+ 0xa1, 0x3a, 0x52, 0x57, 0xed, 0x6c, 0xff, 0xd3,
-+ 0xbc, 0x5e, 0x29, 0xd6, 0xb9, 0x7e, 0xb1, 0x79,
-+ 0x9e, 0xb3, 0x35, 0xe2, 0x81, 0xea, 0x45, 0x1e
-+};
-+static const u8 enc_output037[] __initconst = {
-+ 0x6d, 0xad, 0x63, 0x78, 0x97, 0x54, 0x4d, 0x8b,
-+ 0xf6, 0xbe, 0x95, 0x07, 0xed, 0x4d, 0x1b, 0xb2,
-+ 0xe9, 0x54, 0xbc, 0x42, 0x7e, 0x5d, 0xe7, 0x29,
-+ 0xda, 0xf5, 0x07, 0x62, 0x84, 0x6f, 0xf2, 0xf4,
-+ 0x7b, 0x99, 0x7d, 0x93, 0xc9, 0x82, 0x18, 0x9d,
-+ 0x70, 0x95, 0xdc, 0x79, 0x4c, 0x74, 0x62, 0x32
-+};
-+static const u8 enc_assoc037[] __initconst = {
-+ 0x23, 0x33, 0xe5, 0xce, 0x0f, 0x93, 0xb0, 0x59
-+};
-+static const u8 enc_nonce037[] __initconst = {
-+ 0x26, 0x28, 0x80, 0xd4, 0x75, 0xf3, 0xda, 0xc5,
-+ 0x34, 0x0d, 0xd1, 0xb8
-+};
-+static const u8 enc_key037[] __initconst = {
-+ 0x27, 0xd8, 0x60, 0x63, 0x1b, 0x04, 0x85, 0xa4,
-+ 0x10, 0x70, 0x2f, 0xea, 0x61, 0xbc, 0x87, 0x3f,
-+ 0x34, 0x42, 0x26, 0x0c, 0xad, 0xed, 0x4a, 0xbd,
-+ 0xe2, 0x5b, 0x78, 0x6a, 0x2d, 0x97, 0xf1, 0x45
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input038[] __initconst = {
-+ 0x97, 0x3d, 0x0c, 0x75, 0x38, 0x26, 0xba, 0xe4,
-+ 0x66, 0xcf, 0x9a, 0xbb, 0x34, 0x93, 0x15, 0x2e,
-+ 0x9d, 0xe7, 0x81, 0x9e, 0x2b, 0xd0, 0xc7, 0x11,
-+ 0x71, 0x34, 0x6b, 0x4d, 0x2c, 0xeb, 0xf8, 0x04,
-+ 0x1a, 0xa3, 0xce, 0xdc, 0x0d, 0xfd, 0x7b, 0x46,
-+ 0x7e, 0x26, 0x22, 0x8b, 0xc8, 0x6c, 0x9a
-+};
-+static const u8 enc_output038[] __initconst = {
-+ 0xfb, 0xa7, 0x8a, 0xe4, 0xf9, 0xd8, 0x08, 0xa6,
-+ 0x2e, 0x3d, 0xa4, 0x0b, 0xe2, 0xcb, 0x77, 0x00,
-+ 0xc3, 0x61, 0x3d, 0x9e, 0xb2, 0xc5, 0x29, 0xc6,
-+ 0x52, 0xe7, 0x6a, 0x43, 0x2c, 0x65, 0x8d, 0x27,
-+ 0x09, 0x5f, 0x0e, 0xb8, 0xf9, 0x40, 0xc3, 0x24,
-+ 0x98, 0x1e, 0xa9, 0x35, 0xe5, 0x07, 0xf9, 0x8f,
-+ 0x04, 0x69, 0x56, 0xdb, 0x3a, 0x51, 0x29, 0x08,
-+ 0xbd, 0x7a, 0xfc, 0x8f, 0x2a, 0xb0, 0xa9
-+};
-+static const u8 enc_assoc038[] __initconst = { };
-+static const u8 enc_nonce038[] __initconst = {
-+ 0xe7, 0x4a, 0x51, 0x5e, 0x7e, 0x21, 0x02, 0xb9,
-+ 0x0b, 0xef, 0x55, 0xd2
-+};
-+static const u8 enc_key038[] __initconst = {
-+ 0xcf, 0x0d, 0x40, 0xa4, 0x64, 0x4e, 0x5f, 0x51,
-+ 0x81, 0x51, 0x65, 0xd5, 0x30, 0x1b, 0x22, 0x63,
-+ 0x1f, 0x45, 0x44, 0xc4, 0x9a, 0x18, 0x78, 0xe3,
-+ 0xa0, 0xa5, 0xe8, 0xe1, 0xaa, 0xe0, 0xf2, 0x64
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input039[] __initconst = {
-+ 0xa9, 0x89, 0x95, 0x50, 0x4d, 0xf1, 0x6f, 0x74,
-+ 0x8b, 0xfb, 0x77, 0x85, 0xff, 0x91, 0xee, 0xb3,
-+ 0xb6, 0x60, 0xea, 0x9e, 0xd3, 0x45, 0x0c, 0x3d,
-+ 0x5e, 0x7b, 0x0e, 0x79, 0xef, 0x65, 0x36, 0x59,
-+ 0xa9, 0x97, 0x8d, 0x75, 0x54, 0x2e, 0xf9, 0x1c,
-+ 0x45, 0x67, 0x62, 0x21, 0x56, 0x40, 0xb9
-+};
-+static const u8 enc_output039[] __initconst = {
-+ 0xa1, 0xff, 0xed, 0x80, 0x76, 0x18, 0x29, 0xec,
-+ 0xce, 0x24, 0x2e, 0x0e, 0x88, 0xb1, 0x38, 0x04,
-+ 0x90, 0x16, 0xbc, 0xa0, 0x18, 0xda, 0x2b, 0x6e,
-+ 0x19, 0x98, 0x6b, 0x3e, 0x31, 0x8c, 0xae, 0x8d,
-+ 0x80, 0x61, 0x98, 0xfb, 0x4c, 0x52, 0x7c, 0xc3,
-+ 0x93, 0x50, 0xeb, 0xdd, 0xea, 0xc5, 0x73, 0xc4,
-+ 0xcb, 0xf0, 0xbe, 0xfd, 0xa0, 0xb7, 0x02, 0x42,
-+ 0xc6, 0x40, 0xd7, 0xcd, 0x02, 0xd7, 0xa3
-+};
-+static const u8 enc_assoc039[] __initconst = {
-+ 0xb3, 0xe4, 0x06, 0x46, 0x83, 0xb0, 0x2d, 0x84
-+};
-+static const u8 enc_nonce039[] __initconst = {
-+ 0xd4, 0xd8, 0x07, 0x34, 0x16, 0x83, 0x82, 0x5b,
-+ 0x31, 0xcd, 0x4d, 0x95
-+};
-+static const u8 enc_key039[] __initconst = {
-+ 0x6c, 0xbf, 0xd7, 0x1c, 0x64, 0x5d, 0x18, 0x4c,
-+ 0xf5, 0xd2, 0x3c, 0x40, 0x2b, 0xdb, 0x0d, 0x25,
-+ 0xec, 0x54, 0x89, 0x8c, 0x8a, 0x02, 0x73, 0xd4,
-+ 0x2e, 0xb5, 0xbe, 0x10, 0x9f, 0xdc, 0xb2, 0xac
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input040[] __initconst = {
-+ 0xd0, 0x96, 0x80, 0x31, 0x81, 0xbe, 0xef, 0x9e,
-+ 0x00, 0x8f, 0xf8, 0x5d, 0x5d, 0xdc, 0x38, 0xdd,
-+ 0xac, 0xf0, 0xf0, 0x9e, 0xe5, 0xf7, 0xe0, 0x7f,
-+ 0x1e, 0x40, 0x79, 0xcb, 0x64, 0xd0, 0xdc, 0x8f,
-+ 0x5e, 0x67, 0x11, 0xcd, 0x49, 0x21, 0xa7, 0x88,
-+ 0x7d, 0xe7, 0x6e, 0x26, 0x78, 0xfd, 0xc6, 0x76,
-+ 0x18, 0xf1, 0x18, 0x55, 0x86, 0xbf, 0xea, 0x9d,
-+ 0x4c, 0x68, 0x5d, 0x50, 0xe4, 0xbb, 0x9a, 0x82
-+};
-+static const u8 enc_output040[] __initconst = {
-+ 0x9a, 0x4e, 0xf2, 0x2b, 0x18, 0x16, 0x77, 0xb5,
-+ 0x75, 0x5c, 0x08, 0xf7, 0x47, 0xc0, 0xf8, 0xd8,
-+ 0xe8, 0xd4, 0xc1, 0x8a, 0x9c, 0xc2, 0x40, 0x5c,
-+ 0x12, 0xbb, 0x51, 0xbb, 0x18, 0x72, 0xc8, 0xe8,
-+ 0xb8, 0x77, 0x67, 0x8b, 0xec, 0x44, 0x2c, 0xfc,
-+ 0xbb, 0x0f, 0xf4, 0x64, 0xa6, 0x4b, 0x74, 0x33,
-+ 0x2c, 0xf0, 0x72, 0x89, 0x8c, 0x7e, 0x0e, 0xdd,
-+ 0xf6, 0x23, 0x2e, 0xa6, 0xe2, 0x7e, 0xfe, 0x50,
-+ 0x9f, 0xf3, 0x42, 0x7a, 0x0f, 0x32, 0xfa, 0x56,
-+ 0x6d, 0x9c, 0xa0, 0xa7, 0x8a, 0xef, 0xc0, 0x13
-+};
-+static const u8 enc_assoc040[] __initconst = { };
-+static const u8 enc_nonce040[] __initconst = {
-+ 0xd6, 0x10, 0x40, 0xa3, 0x13, 0xed, 0x49, 0x28,
-+ 0x23, 0xcc, 0x06, 0x5b
-+};
-+static const u8 enc_key040[] __initconst = {
-+ 0x5b, 0x1d, 0x10, 0x35, 0xc0, 0xb1, 0x7e, 0xe0,
-+ 0xb0, 0x44, 0x47, 0x67, 0xf8, 0x0a, 0x25, 0xb8,
-+ 0xc1, 0xb7, 0x41, 0xf4, 0xb5, 0x0a, 0x4d, 0x30,
-+ 0x52, 0x22, 0x6b, 0xaa, 0x1c, 0x6f, 0xb7, 0x01
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input041[] __initconst = {
-+ 0x94, 0xee, 0x16, 0x6d, 0x6d, 0x6e, 0xcf, 0x88,
-+ 0x32, 0x43, 0x71, 0x36, 0xb4, 0xae, 0x80, 0x5d,
-+ 0x42, 0x88, 0x64, 0x35, 0x95, 0x86, 0xd9, 0x19,
-+ 0x3a, 0x25, 0x01, 0x62, 0x93, 0xed, 0xba, 0x44,
-+ 0x3c, 0x58, 0xe0, 0x7e, 0x7b, 0x71, 0x95, 0xec,
-+ 0x5b, 0xd8, 0x45, 0x82, 0xa9, 0xd5, 0x6c, 0x8d,
-+ 0x4a, 0x10, 0x8c, 0x7d, 0x7c, 0xe3, 0x4e, 0x6c,
-+ 0x6f, 0x8e, 0xa1, 0xbe, 0xc0, 0x56, 0x73, 0x17
-+};
-+static const u8 enc_output041[] __initconst = {
-+ 0x5f, 0xbb, 0xde, 0xcc, 0x34, 0xbe, 0x20, 0x16,
-+ 0x14, 0xf6, 0x36, 0x03, 0x1e, 0xeb, 0x42, 0xf1,
-+ 0xca, 0xce, 0x3c, 0x79, 0xa1, 0x2c, 0xff, 0xd8,
-+ 0x71, 0xee, 0x8e, 0x73, 0x82, 0x0c, 0x82, 0x97,
-+ 0x49, 0xf1, 0xab, 0xb4, 0x29, 0x43, 0x67, 0x84,
-+ 0x9f, 0xb6, 0xc2, 0xaa, 0x56, 0xbd, 0xa8, 0xa3,
-+ 0x07, 0x8f, 0x72, 0x3d, 0x7c, 0x1c, 0x85, 0x20,
-+ 0x24, 0xb0, 0x17, 0xb5, 0x89, 0x73, 0xfb, 0x1e,
-+ 0x09, 0x26, 0x3d, 0xa7, 0xb4, 0xcb, 0x92, 0x14,
-+ 0x52, 0xf9, 0x7d, 0xca, 0x40, 0xf5, 0x80, 0xec
-+};
-+static const u8 enc_assoc041[] __initconst = {
-+ 0x71, 0x93, 0xf6, 0x23, 0x66, 0x33, 0x21, 0xa2
-+};
-+static const u8 enc_nonce041[] __initconst = {
-+ 0xd3, 0x1c, 0x21, 0xab, 0xa1, 0x75, 0xb7, 0x0d,
-+ 0xe4, 0xeb, 0xb1, 0x9c
-+};
-+static const u8 enc_key041[] __initconst = {
-+ 0x97, 0xd6, 0x35, 0xc4, 0xf4, 0x75, 0x74, 0xd9,
-+ 0x99, 0x8a, 0x90, 0x87, 0x5d, 0xa1, 0xd3, 0xa2,
-+ 0x84, 0xb7, 0x55, 0xb2, 0xd3, 0x92, 0x97, 0xa5,
-+ 0x72, 0x52, 0x35, 0x19, 0x0e, 0x10, 0xa9, 0x7e
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input042[] __initconst = {
-+ 0xb4, 0x29, 0xeb, 0x80, 0xfb, 0x8f, 0xe8, 0xba,
-+ 0xed, 0xa0, 0xc8, 0x5b, 0x9c, 0x33, 0x34, 0x58,
-+ 0xe7, 0xc2, 0x99, 0x2e, 0x55, 0x84, 0x75, 0x06,
-+ 0x9d, 0x12, 0xd4, 0x5c, 0x22, 0x21, 0x75, 0x64,
-+ 0x12, 0x15, 0x88, 0x03, 0x22, 0x97, 0xef, 0xf5,
-+ 0x67, 0x83, 0x74, 0x2a, 0x5f, 0xc2, 0x2d, 0x74,
-+ 0x10, 0xff, 0xb2, 0x9d, 0x66, 0x09, 0x86, 0x61,
-+ 0xd7, 0x6f, 0x12, 0x6c, 0x3c, 0x27, 0x68, 0x9e,
-+ 0x43, 0xb3, 0x72, 0x67, 0xca, 0xc5, 0xa3, 0xa6,
-+ 0xd3, 0xab, 0x49, 0xe3, 0x91, 0xda, 0x29, 0xcd,
-+ 0x30, 0x54, 0xa5, 0x69, 0x2e, 0x28, 0x07, 0xe4,
-+ 0xc3, 0xea, 0x46, 0xc8, 0x76, 0x1d, 0x50, 0xf5,
-+ 0x92
-+};
-+static const u8 enc_output042[] __initconst = {
-+ 0xd0, 0x10, 0x2f, 0x6c, 0x25, 0x8b, 0xf4, 0x97,
-+ 0x42, 0xce, 0xc3, 0x4c, 0xf2, 0xd0, 0xfe, 0xdf,
-+ 0x23, 0xd1, 0x05, 0xfb, 0x4c, 0x84, 0xcf, 0x98,
-+ 0x51, 0x5e, 0x1b, 0xc9, 0xa6, 0x4f, 0x8a, 0xd5,
-+ 0xbe, 0x8f, 0x07, 0x21, 0xbd, 0xe5, 0x06, 0x45,
-+ 0xd0, 0x00, 0x83, 0xc3, 0xa2, 0x63, 0xa3, 0x10,
-+ 0x53, 0xb7, 0x60, 0x24, 0x5f, 0x52, 0xae, 0x28,
-+ 0x66, 0xa5, 0xec, 0x83, 0xb1, 0x9f, 0x61, 0xbe,
-+ 0x1d, 0x30, 0xd5, 0xc5, 0xd9, 0xfe, 0xcc, 0x4c,
-+ 0xbb, 0xe0, 0x8f, 0xd3, 0x85, 0x81, 0x3a, 0x2a,
-+ 0xa3, 0x9a, 0x00, 0xff, 0x9c, 0x10, 0xf7, 0xf2,
-+ 0x37, 0x02, 0xad, 0xd1, 0xe4, 0xb2, 0xff, 0xa3,
-+ 0x1c, 0x41, 0x86, 0x5f, 0xc7, 0x1d, 0xe1, 0x2b,
-+ 0x19, 0x61, 0x21, 0x27, 0xce, 0x49, 0x99, 0x3b,
-+ 0xb0
-+};
-+static const u8 enc_assoc042[] __initconst = { };
-+static const u8 enc_nonce042[] __initconst = {
-+ 0x17, 0xc8, 0x6a, 0x8a, 0xbb, 0xb7, 0xe0, 0x03,
-+ 0xac, 0xde, 0x27, 0x99
-+};
-+static const u8 enc_key042[] __initconst = {
-+ 0xfe, 0x6e, 0x55, 0xbd, 0xae, 0xd1, 0xf7, 0x28,
-+ 0x4c, 0xa5, 0xfc, 0x0f, 0x8c, 0x5f, 0x2b, 0x8d,
-+ 0xf5, 0x6d, 0xc0, 0xf4, 0x9e, 0x8c, 0xa6, 0x6a,
-+ 0x41, 0x99, 0x5e, 0x78, 0x33, 0x51, 0xf9, 0x01
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input043[] __initconst = {
-+ 0xce, 0xb5, 0x34, 0xce, 0x50, 0xdc, 0x23, 0xff,
-+ 0x63, 0x8a, 0xce, 0x3e, 0xf6, 0x3a, 0xb2, 0xcc,
-+ 0x29, 0x73, 0xee, 0xad, 0xa8, 0x07, 0x85, 0xfc,
-+ 0x16, 0x5d, 0x06, 0xc2, 0xf5, 0x10, 0x0f, 0xf5,
-+ 0xe8, 0xab, 0x28, 0x82, 0xc4, 0x75, 0xaf, 0xcd,
-+ 0x05, 0xcc, 0xd4, 0x9f, 0x2e, 0x7d, 0x8f, 0x55,
-+ 0xef, 0x3a, 0x72, 0xe3, 0xdc, 0x51, 0xd6, 0x85,
-+ 0x2b, 0x8e, 0x6b, 0x9e, 0x7a, 0xec, 0xe5, 0x7b,
-+ 0xe6, 0x55, 0x6b, 0x0b, 0x6d, 0x94, 0x13, 0xe3,
-+ 0x3f, 0xc5, 0xfc, 0x24, 0xa9, 0xa2, 0x05, 0xad,
-+ 0x59, 0x57, 0x4b, 0xb3, 0x9d, 0x94, 0x4a, 0x92,
-+ 0xdc, 0x47, 0x97, 0x0d, 0x84, 0xa6, 0xad, 0x31,
-+ 0x76
-+};
-+static const u8 enc_output043[] __initconst = {
-+ 0x75, 0x45, 0x39, 0x1b, 0x51, 0xde, 0x01, 0xd5,
-+ 0xc5, 0x3d, 0xfa, 0xca, 0x77, 0x79, 0x09, 0x06,
-+ 0x3e, 0x58, 0xed, 0xee, 0x4b, 0xb1, 0x22, 0x7e,
-+ 0x71, 0x10, 0xac, 0x4d, 0x26, 0x20, 0xc2, 0xae,
-+ 0xc2, 0xf8, 0x48, 0xf5, 0x6d, 0xee, 0xb0, 0x37,
-+ 0xa8, 0xdc, 0xed, 0x75, 0xaf, 0xa8, 0xa6, 0xc8,
-+ 0x90, 0xe2, 0xde, 0xe4, 0x2f, 0x95, 0x0b, 0xb3,
-+ 0x3d, 0x9e, 0x24, 0x24, 0xd0, 0x8a, 0x50, 0x5d,
-+ 0x89, 0x95, 0x63, 0x97, 0x3e, 0xd3, 0x88, 0x70,
-+ 0xf3, 0xde, 0x6e, 0xe2, 0xad, 0xc7, 0xfe, 0x07,
-+ 0x2c, 0x36, 0x6c, 0x14, 0xe2, 0xcf, 0x7c, 0xa6,
-+ 0x2f, 0xb3, 0xd3, 0x6b, 0xee, 0x11, 0x68, 0x54,
-+ 0x61, 0xb7, 0x0d, 0x44, 0xef, 0x8c, 0x66, 0xc5,
-+ 0xc7, 0xbb, 0xf1, 0x0d, 0xca, 0xdd, 0x7f, 0xac,
-+ 0xf6
-+};
-+static const u8 enc_assoc043[] __initconst = {
-+ 0xa1, 0x1c, 0x40, 0xb6, 0x03, 0x76, 0x73, 0x30
-+};
-+static const u8 enc_nonce043[] __initconst = {
-+ 0x46, 0x36, 0x2f, 0x45, 0xd6, 0x37, 0x9e, 0x63,
-+ 0xe5, 0x22, 0x94, 0x60
-+};
-+static const u8 enc_key043[] __initconst = {
-+ 0xaa, 0xbc, 0x06, 0x34, 0x74, 0xe6, 0x5c, 0x4c,
-+ 0x3e, 0x9b, 0xdc, 0x48, 0x0d, 0xea, 0x97, 0xb4,
-+ 0x51, 0x10, 0xc8, 0x61, 0x88, 0x46, 0xff, 0x6b,
-+ 0x15, 0xbd, 0xd2, 0xa4, 0xa5, 0x68, 0x2c, 0x4e
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input044[] __initconst = {
-+ 0xe5, 0xcc, 0xaa, 0x44, 0x1b, 0xc8, 0x14, 0x68,
-+ 0x8f, 0x8f, 0x6e, 0x8f, 0x28, 0xb5, 0x00, 0xb2
-+};
-+static const u8 enc_output044[] __initconst = {
-+ 0x7e, 0x72, 0xf5, 0xa1, 0x85, 0xaf, 0x16, 0xa6,
-+ 0x11, 0x92, 0x1b, 0x43, 0x8f, 0x74, 0x9f, 0x0b,
-+ 0x12, 0x42, 0xc6, 0x70, 0x73, 0x23, 0x34, 0x02,
-+ 0x9a, 0xdf, 0xe1, 0xc5, 0x00, 0x16, 0x51, 0xe4
-+};
-+static const u8 enc_assoc044[] __initconst = {
-+ 0x02
-+};
-+static const u8 enc_nonce044[] __initconst = {
-+ 0x87, 0x34, 0x5f, 0x10, 0x55, 0xfd, 0x9e, 0x21,
-+ 0x02, 0xd5, 0x06, 0x56
-+};
-+static const u8 enc_key044[] __initconst = {
-+ 0x7d, 0x00, 0xb4, 0x80, 0x95, 0xad, 0xfa, 0x32,
-+ 0x72, 0x05, 0x06, 0x07, 0xb2, 0x64, 0x18, 0x50,
-+ 0x02, 0xba, 0x99, 0x95, 0x7c, 0x49, 0x8b, 0xe0,
-+ 0x22, 0x77, 0x0f, 0x2c, 0xe2, 0xf3, 0x14, 0x3c
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input045[] __initconst = {
-+ 0x02, 0xcd, 0xe1, 0x68, 0xfb, 0xa3, 0xf5, 0x44,
-+ 0xbb, 0xd0, 0x33, 0x2f, 0x7a, 0xde, 0xad, 0xa8
-+};
-+static const u8 enc_output045[] __initconst = {
-+ 0x85, 0xf2, 0x9a, 0x71, 0x95, 0x57, 0xcd, 0xd1,
-+ 0x4d, 0x1f, 0x8f, 0xff, 0xab, 0x6d, 0x9e, 0x60,
-+ 0x73, 0x2c, 0xa3, 0x2b, 0xec, 0xd5, 0x15, 0xa1,
-+ 0xed, 0x35, 0x3f, 0x54, 0x2e, 0x99, 0x98, 0x58
-+};
-+static const u8 enc_assoc045[] __initconst = {
-+ 0xb6, 0x48
-+};
-+static const u8 enc_nonce045[] __initconst = {
-+ 0x87, 0xa3, 0x16, 0x3e, 0xc0, 0x59, 0x8a, 0xd9,
-+ 0x5b, 0x3a, 0xa7, 0x13
-+};
-+static const u8 enc_key045[] __initconst = {
-+ 0x64, 0x32, 0x71, 0x7f, 0x1d, 0xb8, 0x5e, 0x41,
-+ 0xac, 0x78, 0x36, 0xbc, 0xe2, 0x51, 0x85, 0xa0,
-+ 0x80, 0xd5, 0x76, 0x2b, 0x9e, 0x2b, 0x18, 0x44,
-+ 0x4b, 0x6e, 0xc7, 0x2c, 0x3b, 0xd8, 0xe4, 0xdc
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input046[] __initconst = {
-+ 0x16, 0xdd, 0xd2, 0x3f, 0xf5, 0x3f, 0x3d, 0x23,
-+ 0xc0, 0x63, 0x34, 0x48, 0x70, 0x40, 0xeb, 0x47
-+};
-+static const u8 enc_output046[] __initconst = {
-+ 0xc1, 0xb2, 0x95, 0x93, 0x6d, 0x56, 0xfa, 0xda,
-+ 0xc0, 0x3e, 0x5f, 0x74, 0x2b, 0xff, 0x73, 0xa1,
-+ 0x39, 0xc4, 0x57, 0xdb, 0xab, 0x66, 0x38, 0x2b,
-+ 0xab, 0xb3, 0xb5, 0x58, 0x00, 0xcd, 0xa5, 0xb8
-+};
-+static const u8 enc_assoc046[] __initconst = {
-+ 0xbd, 0x4c, 0xd0, 0x2f, 0xc7, 0x50, 0x2b, 0xbd,
-+ 0xbd, 0xf6, 0xc9, 0xa3, 0xcb, 0xe8, 0xf0
-+};
-+static const u8 enc_nonce046[] __initconst = {
-+ 0x6f, 0x57, 0x3a, 0xa8, 0x6b, 0xaa, 0x49, 0x2b,
-+ 0xa4, 0x65, 0x96, 0xdf
-+};
-+static const u8 enc_key046[] __initconst = {
-+ 0x8e, 0x34, 0xcf, 0x73, 0xd2, 0x45, 0xa1, 0x08,
-+ 0x2a, 0x92, 0x0b, 0x86, 0x36, 0x4e, 0xb8, 0x96,
-+ 0xc4, 0x94, 0x64, 0x67, 0xbc, 0xb3, 0xd5, 0x89,
-+ 0x29, 0xfc, 0xb3, 0x66, 0x90, 0xe6, 0x39, 0x4f
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input047[] __initconst = {
-+ 0x62, 0x3b, 0x78, 0x50, 0xc3, 0x21, 0xe2, 0xcf,
-+ 0x0c, 0x6f, 0xbc, 0xc8, 0xdf, 0xd1, 0xaf, 0xf2
-+};
-+static const u8 enc_output047[] __initconst = {
-+ 0xc8, 0x4c, 0x9b, 0xb7, 0xc6, 0x1c, 0x1b, 0xcb,
-+ 0x17, 0x77, 0x2a, 0x1c, 0x50, 0x0c, 0x50, 0x95,
-+ 0xdb, 0xad, 0xf7, 0xa5, 0x13, 0x8c, 0xa0, 0x34,
-+ 0x59, 0xa2, 0xcd, 0x65, 0x83, 0x1e, 0x09, 0x2f
-+};
-+static const u8 enc_assoc047[] __initconst = {
-+ 0x89, 0xcc, 0xe9, 0xfb, 0x47, 0x44, 0x1d, 0x07,
-+ 0xe0, 0x24, 0x5a, 0x66, 0xfe, 0x8b, 0x77, 0x8b
-+};
-+static const u8 enc_nonce047[] __initconst = {
-+ 0x1a, 0x65, 0x18, 0xf0, 0x2e, 0xde, 0x1d, 0xa6,
-+ 0x80, 0x92, 0x66, 0xd9
-+};
-+static const u8 enc_key047[] __initconst = {
-+ 0xcb, 0x55, 0x75, 0xf5, 0xc7, 0xc4, 0x5c, 0x91,
-+ 0xcf, 0x32, 0x0b, 0x13, 0x9f, 0xb5, 0x94, 0x23,
-+ 0x75, 0x60, 0xd0, 0xa3, 0xe6, 0xf8, 0x65, 0xa6,
-+ 0x7d, 0x4f, 0x63, 0x3f, 0x2c, 0x08, 0xf0, 0x16
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input048[] __initconst = {
-+ 0x87, 0xb3, 0xa4, 0xd7, 0xb2, 0x6d, 0x8d, 0x32,
-+ 0x03, 0xa0, 0xde, 0x1d, 0x64, 0xef, 0x82, 0xe3
-+};
-+static const u8 enc_output048[] __initconst = {
-+ 0x94, 0xbc, 0x80, 0x62, 0x1e, 0xd1, 0xe7, 0x1b,
-+ 0x1f, 0xd2, 0xb5, 0xc3, 0xa1, 0x5e, 0x35, 0x68,
-+ 0x33, 0x35, 0x11, 0x86, 0x17, 0x96, 0x97, 0x84,
-+ 0x01, 0x59, 0x8b, 0x96, 0x37, 0x22, 0xf5, 0xb3
-+};
-+static const u8 enc_assoc048[] __initconst = {
-+ 0xd1, 0x9f, 0x2d, 0x98, 0x90, 0x95, 0xf7, 0xab,
-+ 0x03, 0xa5, 0xfd, 0xe8, 0x44, 0x16, 0xe0, 0x0c,
-+ 0x0e
-+};
-+static const u8 enc_nonce048[] __initconst = {
-+ 0x56, 0x4d, 0xee, 0x49, 0xab, 0x00, 0xd2, 0x40,
-+ 0xfc, 0x10, 0x68, 0xc3
-+};
-+static const u8 enc_key048[] __initconst = {
-+ 0xa5, 0x56, 0x9e, 0x72, 0x9a, 0x69, 0xb2, 0x4b,
-+ 0xa6, 0xe0, 0xff, 0x15, 0xc4, 0x62, 0x78, 0x97,
-+ 0x43, 0x68, 0x24, 0xc9, 0x41, 0xe9, 0xd0, 0x0b,
-+ 0x2e, 0x93, 0xfd, 0xdc, 0x4b, 0xa7, 0x76, 0x57
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input049[] __initconst = {
-+ 0xe6, 0x01, 0xb3, 0x85, 0x57, 0x79, 0x7d, 0xa2,
-+ 0xf8, 0xa4, 0x10, 0x6a, 0x08, 0x9d, 0x1d, 0xa6
-+};
-+static const u8 enc_output049[] __initconst = {
-+ 0x29, 0x9b, 0x5d, 0x3f, 0x3d, 0x03, 0xc0, 0x87,
-+ 0x20, 0x9a, 0x16, 0xe2, 0x85, 0x14, 0x31, 0x11,
-+ 0x4b, 0x45, 0x4e, 0xd1, 0x98, 0xde, 0x11, 0x7e,
-+ 0x83, 0xec, 0x49, 0xfa, 0x8d, 0x85, 0x08, 0xd6
-+};
-+static const u8 enc_assoc049[] __initconst = {
-+ 0x5e, 0x64, 0x70, 0xfa, 0xcd, 0x99, 0xc1, 0xd8,
-+ 0x1e, 0x37, 0xcd, 0x44, 0x01, 0x5f, 0xe1, 0x94,
-+ 0x80, 0xa2, 0xa4, 0xd3, 0x35, 0x2a, 0x4f, 0xf5,
-+ 0x60, 0xc0, 0x64, 0x0f, 0xdb, 0xda
-+};
-+static const u8 enc_nonce049[] __initconst = {
-+ 0xdf, 0x87, 0x13, 0xe8, 0x7e, 0xc3, 0xdb, 0xcf,
-+ 0xad, 0x14, 0xd5, 0x3e
-+};
-+static const u8 enc_key049[] __initconst = {
-+ 0x56, 0x20, 0x74, 0x65, 0xb4, 0xe4, 0x8e, 0x6d,
-+ 0x04, 0x63, 0x0f, 0x4a, 0x42, 0xf3, 0x5c, 0xfc,
-+ 0x16, 0x3a, 0xb2, 0x89, 0xc2, 0x2a, 0x2b, 0x47,
-+ 0x84, 0xf6, 0xf9, 0x29, 0x03, 0x30, 0xbe, 0xe0
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input050[] __initconst = {
-+ 0xdc, 0x9e, 0x9e, 0xaf, 0x11, 0xe3, 0x14, 0x18,
-+ 0x2d, 0xf6, 0xa4, 0xeb, 0xa1, 0x7a, 0xec, 0x9c
-+};
-+static const u8 enc_output050[] __initconst = {
-+ 0x60, 0x5b, 0xbf, 0x90, 0xae, 0xb9, 0x74, 0xf6,
-+ 0x60, 0x2b, 0xc7, 0x78, 0x05, 0x6f, 0x0d, 0xca,
-+ 0x38, 0xea, 0x23, 0xd9, 0x90, 0x54, 0xb4, 0x6b,
-+ 0x42, 0xff, 0xe0, 0x04, 0x12, 0x9d, 0x22, 0x04
-+};
-+static const u8 enc_assoc050[] __initconst = {
-+ 0xba, 0x44, 0x6f, 0x6f, 0x9a, 0x0c, 0xed, 0x22,
-+ 0x45, 0x0f, 0xeb, 0x10, 0x73, 0x7d, 0x90, 0x07,
-+ 0xfd, 0x69, 0xab, 0xc1, 0x9b, 0x1d, 0x4d, 0x90,
-+ 0x49, 0xa5, 0x55, 0x1e, 0x86, 0xec, 0x2b, 0x37
-+};
-+static const u8 enc_nonce050[] __initconst = {
-+ 0x8d, 0xf4, 0xb1, 0x5a, 0x88, 0x8c, 0x33, 0x28,
-+ 0x6a, 0x7b, 0x76, 0x51
-+};
-+static const u8 enc_key050[] __initconst = {
-+ 0x39, 0x37, 0x98, 0x6a, 0xf8, 0x6d, 0xaf, 0xc1,
-+ 0xba, 0x0c, 0x46, 0x72, 0xd8, 0xab, 0xc4, 0x6c,
-+ 0x20, 0x70, 0x62, 0x68, 0x2d, 0x9c, 0x26, 0x4a,
-+ 0xb0, 0x6d, 0x6c, 0x58, 0x07, 0x20, 0x51, 0x30
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input051[] __initconst = {
-+ 0x81, 0xce, 0x84, 0xed, 0xe9, 0xb3, 0x58, 0x59,
-+ 0xcc, 0x8c, 0x49, 0xa8, 0xf6, 0xbe, 0x7d, 0xc6
-+};
-+static const u8 enc_output051[] __initconst = {
-+ 0x7b, 0x7c, 0xe0, 0xd8, 0x24, 0x80, 0x9a, 0x70,
-+ 0xde, 0x32, 0x56, 0x2c, 0xcf, 0x2c, 0x2b, 0xbd,
-+ 0x15, 0xd4, 0x4a, 0x00, 0xce, 0x0d, 0x19, 0xb4,
-+ 0x23, 0x1f, 0x92, 0x1e, 0x22, 0xbc, 0x0a, 0x43
-+};
-+static const u8 enc_assoc051[] __initconst = {
-+ 0xd4, 0x1a, 0x82, 0x8d, 0x5e, 0x71, 0x82, 0x92,
-+ 0x47, 0x02, 0x19, 0x05, 0x40, 0x2e, 0xa2, 0x57,
-+ 0xdc, 0xcb, 0xc3, 0xb8, 0x0f, 0xcd, 0x56, 0x75,
-+ 0x05, 0x6b, 0x68, 0xbb, 0x59, 0xe6, 0x2e, 0x88,
-+ 0x73
-+};
-+static const u8 enc_nonce051[] __initconst = {
-+ 0xbe, 0x40, 0xe5, 0xf1, 0xa1, 0x18, 0x17, 0xa0,
-+ 0xa8, 0xfa, 0x89, 0x49
-+};
-+static const u8 enc_key051[] __initconst = {
-+ 0x36, 0x37, 0x2a, 0xbc, 0xdb, 0x78, 0xe0, 0x27,
-+ 0x96, 0x46, 0xac, 0x3d, 0x17, 0x6b, 0x96, 0x74,
-+ 0xe9, 0x15, 0x4e, 0xec, 0xf0, 0xd5, 0x46, 0x9c,
-+ 0x65, 0x1e, 0xc7, 0xe1, 0x6b, 0x4c, 0x11, 0x99
-+};
-+
-+/* wycheproof - misc */
-+static const u8 enc_input052[] __initconst = {
-+ 0xa6, 0x67, 0x47, 0xc8, 0x9e, 0x85, 0x7a, 0xf3,
-+ 0xa1, 0x8e, 0x2c, 0x79, 0x50, 0x00, 0x87, 0xed
-+};
-+static const u8 enc_output052[] __initconst = {
-+ 0xca, 0x82, 0xbf, 0xf3, 0xe2, 0xf3, 0x10, 0xcc,
-+ 0xc9, 0x76, 0x67, 0x2c, 0x44, 0x15, 0xe6, 0x9b,
-+ 0x57, 0x63, 0x8c, 0x62, 0xa5, 0xd8, 0x5d, 0xed,
-+ 0x77, 0x4f, 0x91, 0x3c, 0x81, 0x3e, 0xa0, 0x32
-+};
-+static const u8 enc_assoc052[] __initconst = {
-+ 0x3f, 0x2d, 0xd4, 0x9b, 0xbf, 0x09, 0xd6, 0x9a,
-+ 0x78, 0xa3, 0xd8, 0x0e, 0xa2, 0x56, 0x66, 0x14,
-+ 0xfc, 0x37, 0x94, 0x74, 0x19, 0x6c, 0x1a, 0xae,
-+ 0x84, 0x58, 0x3d, 0xa7, 0x3d, 0x7f, 0xf8, 0x5c,
-+ 0x6f, 0x42, 0xca, 0x42, 0x05, 0x6a, 0x97, 0x92,
-+ 0xcc, 0x1b, 0x9f, 0xb3, 0xc7, 0xd2, 0x61
-+};
-+static const u8 enc_nonce052[] __initconst = {
-+ 0x84, 0xc8, 0x7d, 0xae, 0x4e, 0xee, 0x27, 0x73,
-+ 0x0e, 0xc3, 0x5d, 0x12
-+};
-+static const u8 enc_key052[] __initconst = {
-+ 0x9f, 0x14, 0x79, 0xed, 0x09, 0x7d, 0x7f, 0xe5,
-+ 0x29, 0xc1, 0x1f, 0x2f, 0x5a, 0xdd, 0x9a, 0xaf,
-+ 0xf4, 0xa1, 0xca, 0x0b, 0x68, 0x99, 0x7a, 0x2c,
-+ 0xb7, 0xf7, 0x97, 0x49, 0xbd, 0x90, 0xaa, 0xf4
-+};
-+
- /* wycheproof - misc */
- static const u8 enc_input053[] __initconst = {
- 0x25, 0x6d, 0x40, 0x88, 0x80, 0x94, 0x17, 0x83,
-@@ -2760,6 +3859,126 @@ static const u8 enc_key073[] __initconst
- };
-
- /* wycheproof - checking for int overflows */
-+static const u8 enc_input074[] __initconst = {
-+ 0xd4, 0x50, 0x0b, 0xf0, 0x09, 0x49, 0x35, 0x51,
-+ 0xc3, 0x80, 0xad, 0xf5, 0x2c, 0x57, 0x3a, 0x69,
-+ 0xdf, 0x7e, 0x8b, 0x76, 0x24, 0x63, 0x33, 0x0f,
-+ 0xac, 0xc1, 0x6a, 0x57, 0x26, 0xbe, 0x71, 0x90,
-+ 0xc6, 0x3c, 0x5a, 0x1c, 0x92, 0x65, 0x84, 0xa0,
-+ 0x96, 0x75, 0x68, 0x28, 0xdc, 0xdc, 0x64, 0xac,
-+ 0xdf, 0x96, 0x3d, 0x93, 0x1b, 0xf1, 0xda, 0xe2,
-+ 0x38, 0xf3, 0xf1, 0x57, 0x22, 0x4a, 0xc4, 0xb5,
-+ 0x42, 0xd7, 0x85, 0xb0, 0xdd, 0x84, 0xdb, 0x6b,
-+ 0xe3, 0xbc, 0x5a, 0x36, 0x63, 0xe8, 0x41, 0x49,
-+ 0xff, 0xbe, 0xd0, 0x9e, 0x54, 0xf7, 0x8f, 0x16,
-+ 0xa8, 0x22, 0x3b, 0x24, 0xcb, 0x01, 0x9f, 0x58,
-+ 0xb2, 0x1b, 0x0e, 0x55, 0x1e, 0x7a, 0xa0, 0x73,
-+ 0x27, 0x62, 0x95, 0x51, 0x37, 0x6c, 0xcb, 0xc3,
-+ 0x93, 0x76, 0x71, 0xa0, 0x62, 0x9b, 0xd9, 0x5c,
-+ 0x99, 0x15, 0xc7, 0x85, 0x55, 0x77, 0x1e, 0x7a
-+};
-+static const u8 enc_output074[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x0b, 0x30, 0x0d, 0x8d, 0xa5, 0x6c, 0x21, 0x85,
-+ 0x75, 0x52, 0x79, 0x55, 0x3c, 0x4c, 0x82, 0xca
-+};
-+static const u8 enc_assoc074[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce074[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x00, 0x02, 0x50, 0x6e
-+};
-+static const u8 enc_key074[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
-+static const u8 enc_input075[] __initconst = {
-+ 0x7d, 0xe8, 0x7f, 0x67, 0x29, 0x94, 0x52, 0x75,
-+ 0xd0, 0x65, 0x5d, 0xa4, 0xc7, 0xfd, 0xe4, 0x56,
-+ 0x9e, 0x16, 0xf1, 0x11, 0xb5, 0xeb, 0x26, 0xc2,
-+ 0x2d, 0x85, 0x9e, 0x3f, 0xf8, 0x22, 0xec, 0xed,
-+ 0x3a, 0x6d, 0xd9, 0xa6, 0x0f, 0x22, 0x95, 0x7f,
-+ 0x7b, 0x7c, 0x85, 0x7e, 0x88, 0x22, 0xeb, 0x9f,
-+ 0xe0, 0xb8, 0xd7, 0x02, 0x21, 0x41, 0xf2, 0xd0,
-+ 0xb4, 0x8f, 0x4b, 0x56, 0x12, 0xd3, 0x22, 0xa8,
-+ 0x8d, 0xd0, 0xfe, 0x0b, 0x4d, 0x91, 0x79, 0x32,
-+ 0x4f, 0x7c, 0x6c, 0x9e, 0x99, 0x0e, 0xfb, 0xd8,
-+ 0x0e, 0x5e, 0xd6, 0x77, 0x58, 0x26, 0x49, 0x8b,
-+ 0x1e, 0xfe, 0x0f, 0x71, 0xa0, 0xf3, 0xec, 0x5b,
-+ 0x29, 0xcb, 0x28, 0xc2, 0x54, 0x0a, 0x7d, 0xcd,
-+ 0x51, 0xb7, 0xda, 0xae, 0xe0, 0xff, 0x4a, 0x7f,
-+ 0x3a, 0xc1, 0xee, 0x54, 0xc2, 0x9e, 0xe4, 0xc1,
-+ 0x70, 0xde, 0x40, 0x8f, 0x66, 0x69, 0x21, 0x94
-+};
-+static const u8 enc_output075[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xc5, 0x78, 0xe2, 0xaa, 0x44, 0xd3, 0x09, 0xb7,
-+ 0xb6, 0xa5, 0x19, 0x3b, 0xdc, 0x61, 0x18, 0xf5
-+};
-+static const u8 enc_assoc075[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_nonce075[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x00, 0x03, 0x18, 0xa5
-+};
-+static const u8 enc_key075[] __initconst = {
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
-+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
-+};
-+
-+/* wycheproof - checking for int overflows */
- static const u8 enc_input076[] __initconst = {
- 0x1b, 0x99, 0x6f, 0x9a, 0x3c, 0xcc, 0x67, 0x85,
- 0xde, 0x22, 0xff, 0x5b, 0x8a, 0xdd, 0x95, 0x02,
-@@ -3349,6 +4568,286 @@ static const u8 enc_key085[] __initconst
- 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
- };
-
-+/* wycheproof - special case tag */
-+static const u8 enc_input086[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output086[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
-+};
-+static const u8 enc_assoc086[] __initconst = {
-+ 0x85, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xa6, 0x90, 0x2f, 0xcb, 0xc8, 0x83, 0xbb, 0xc1,
-+ 0x80, 0xb2, 0x56, 0xae, 0x34, 0xad, 0x7f, 0x00
-+};
-+static const u8 enc_nonce086[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key086[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input087[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output087[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_assoc087[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x24, 0x7e, 0x50, 0x64, 0x2a, 0x1c, 0x0a, 0x2f,
-+ 0x8f, 0x77, 0x21, 0x96, 0x09, 0xdb, 0xa9, 0x58
-+};
-+static const u8 enc_nonce087[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key087[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input088[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output088[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-+};
-+static const u8 enc_assoc088[] __initconst = {
-+ 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xd9, 0xe7, 0x2c, 0x06, 0x4a, 0xc8, 0x96, 0x1f,
-+ 0x3f, 0xa5, 0x85, 0xe0, 0xe2, 0xab, 0xd6, 0x00
-+};
-+static const u8 enc_nonce088[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key088[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input089[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output089[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
-+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
-+};
-+static const u8 enc_assoc089[] __initconst = {
-+ 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x95, 0xaf, 0x0f, 0x4d, 0x0b, 0x68, 0x6e, 0xae,
-+ 0xcc, 0xca, 0x43, 0x07, 0xd5, 0x96, 0xf5, 0x02
-+};
-+static const u8 enc_nonce089[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key089[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input090[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output090[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
-+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f
-+};
-+static const u8 enc_assoc090[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x85, 0x40, 0xb4, 0x64, 0x35, 0x77, 0x07, 0xbe,
-+ 0x3a, 0x39, 0xd5, 0x5c, 0x34, 0xf8, 0xbc, 0xb3
-+};
-+static const u8 enc_nonce090[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key090[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input091[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output091[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_assoc091[] __initconst = {
-+ 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x66, 0x23, 0xd9, 0x90, 0xb8, 0x98, 0xd8, 0x30,
-+ 0xd2, 0x12, 0xaf, 0x23, 0x83, 0x33, 0x07, 0x01
-+};
-+static const u8 enc_nonce091[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key091[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
-+/* wycheproof - special case tag */
-+static const u8 enc_input092[] __initconst = {
-+ 0x9a, 0x49, 0xc4, 0x0f, 0x8b, 0x48, 0xd7, 0xc6,
-+ 0x6d, 0x1d, 0xb4, 0xe5, 0x3f, 0x20, 0xf2, 0xdd,
-+ 0x4a, 0xaa, 0x24, 0x1d, 0xda, 0xb2, 0x6b, 0x5b,
-+ 0xc0, 0xe2, 0x18, 0xb7, 0x2c, 0x33, 0x90, 0xf2,
-+ 0xdf, 0x3e, 0xbd, 0x01, 0x76, 0x70, 0x44, 0x19,
-+ 0x97, 0x2b, 0xcd, 0xbc, 0x6b, 0xbc, 0xb3, 0xe4,
-+ 0xe7, 0x4a, 0x71, 0x52, 0x8e, 0xf5, 0x12, 0x63,
-+ 0xce, 0x24, 0xe0, 0xd5, 0x75, 0xe0, 0xe4, 0x4d
-+};
-+static const u8 enc_output092[] __initconst = {
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-+};
-+static const u8 enc_assoc092[] __initconst = {
-+ 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-+ 0x5f, 0x16, 0xd0, 0x9f, 0x17, 0x78, 0x72, 0x11,
-+ 0xb7, 0xd4, 0x84, 0xe0, 0x24, 0xf8, 0x97, 0x01
-+};
-+static const u8 enc_nonce092[] __initconst = {
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0a, 0x0b
-+};
-+static const u8 enc_key092[] __initconst = {
-+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-+ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
-+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
-+};
-+
- /* wycheproof - edge case intermediate sums in poly1305 */
- static const u8 enc_input093[] __initconst = {
- 0x00, 0x52, 0x35, 0xd2, 0xa9, 0x19, 0xf2, 0x8d,
-@@ -4455,6 +5954,86 @@ chacha20poly1305_enc_vectors[] __initcon
- sizeof(enc_input011), sizeof(enc_assoc011), sizeof(enc_nonce011) },
- { enc_input012, enc_output012, enc_assoc012, enc_nonce012, enc_key012,
- sizeof(enc_input012), sizeof(enc_assoc012), sizeof(enc_nonce012) },
-+ { enc_input013, enc_output013, enc_assoc013, enc_nonce013, enc_key013,
-+ sizeof(enc_input013), sizeof(enc_assoc013), sizeof(enc_nonce013) },
-+ { enc_input014, enc_output014, enc_assoc014, enc_nonce014, enc_key014,
-+ sizeof(enc_input014), sizeof(enc_assoc014), sizeof(enc_nonce014) },
-+ { enc_input015, enc_output015, enc_assoc015, enc_nonce015, enc_key015,
-+ sizeof(enc_input015), sizeof(enc_assoc015), sizeof(enc_nonce015) },
-+ { enc_input016, enc_output016, enc_assoc016, enc_nonce016, enc_key016,
-+ sizeof(enc_input016), sizeof(enc_assoc016), sizeof(enc_nonce016) },
-+ { enc_input017, enc_output017, enc_assoc017, enc_nonce017, enc_key017,
-+ sizeof(enc_input017), sizeof(enc_assoc017), sizeof(enc_nonce017) },
-+ { enc_input018, enc_output018, enc_assoc018, enc_nonce018, enc_key018,
-+ sizeof(enc_input018), sizeof(enc_assoc018), sizeof(enc_nonce018) },
-+ { enc_input019, enc_output019, enc_assoc019, enc_nonce019, enc_key019,
-+ sizeof(enc_input019), sizeof(enc_assoc019), sizeof(enc_nonce019) },
-+ { enc_input020, enc_output020, enc_assoc020, enc_nonce020, enc_key020,
-+ sizeof(enc_input020), sizeof(enc_assoc020), sizeof(enc_nonce020) },
-+ { enc_input021, enc_output021, enc_assoc021, enc_nonce021, enc_key021,
-+ sizeof(enc_input021), sizeof(enc_assoc021), sizeof(enc_nonce021) },
-+ { enc_input022, enc_output022, enc_assoc022, enc_nonce022, enc_key022,
-+ sizeof(enc_input022), sizeof(enc_assoc022), sizeof(enc_nonce022) },
-+ { enc_input023, enc_output023, enc_assoc023, enc_nonce023, enc_key023,
-+ sizeof(enc_input023), sizeof(enc_assoc023), sizeof(enc_nonce023) },
-+ { enc_input024, enc_output024, enc_assoc024, enc_nonce024, enc_key024,
-+ sizeof(enc_input024), sizeof(enc_assoc024), sizeof(enc_nonce024) },
-+ { enc_input025, enc_output025, enc_assoc025, enc_nonce025, enc_key025,
-+ sizeof(enc_input025), sizeof(enc_assoc025), sizeof(enc_nonce025) },
-+ { enc_input026, enc_output026, enc_assoc026, enc_nonce026, enc_key026,
-+ sizeof(enc_input026), sizeof(enc_assoc026), sizeof(enc_nonce026) },
-+ { enc_input027, enc_output027, enc_assoc027, enc_nonce027, enc_key027,
-+ sizeof(enc_input027), sizeof(enc_assoc027), sizeof(enc_nonce027) },
-+ { enc_input028, enc_output028, enc_assoc028, enc_nonce028, enc_key028,
-+ sizeof(enc_input028), sizeof(enc_assoc028), sizeof(enc_nonce028) },
-+ { enc_input029, enc_output029, enc_assoc029, enc_nonce029, enc_key029,
-+ sizeof(enc_input029), sizeof(enc_assoc029), sizeof(enc_nonce029) },
-+ { enc_input030, enc_output030, enc_assoc030, enc_nonce030, enc_key030,
-+ sizeof(enc_input030), sizeof(enc_assoc030), sizeof(enc_nonce030) },
-+ { enc_input031, enc_output031, enc_assoc031, enc_nonce031, enc_key031,
-+ sizeof(enc_input031), sizeof(enc_assoc031), sizeof(enc_nonce031) },
-+ { enc_input032, enc_output032, enc_assoc032, enc_nonce032, enc_key032,
-+ sizeof(enc_input032), sizeof(enc_assoc032), sizeof(enc_nonce032) },
-+ { enc_input033, enc_output033, enc_assoc033, enc_nonce033, enc_key033,
-+ sizeof(enc_input033), sizeof(enc_assoc033), sizeof(enc_nonce033) },
-+ { enc_input034, enc_output034, enc_assoc034, enc_nonce034, enc_key034,
-+ sizeof(enc_input034), sizeof(enc_assoc034), sizeof(enc_nonce034) },
-+ { enc_input035, enc_output035, enc_assoc035, enc_nonce035, enc_key035,
-+ sizeof(enc_input035), sizeof(enc_assoc035), sizeof(enc_nonce035) },
-+ { enc_input036, enc_output036, enc_assoc036, enc_nonce036, enc_key036,
-+ sizeof(enc_input036), sizeof(enc_assoc036), sizeof(enc_nonce036) },
-+ { enc_input037, enc_output037, enc_assoc037, enc_nonce037, enc_key037,
-+ sizeof(enc_input037), sizeof(enc_assoc037), sizeof(enc_nonce037) },
-+ { enc_input038, enc_output038, enc_assoc038, enc_nonce038, enc_key038,
-+ sizeof(enc_input038), sizeof(enc_assoc038), sizeof(enc_nonce038) },
-+ { enc_input039, enc_output039, enc_assoc039, enc_nonce039, enc_key039,
-+ sizeof(enc_input039), sizeof(enc_assoc039), sizeof(enc_nonce039) },
-+ { enc_input040, enc_output040, enc_assoc040, enc_nonce040, enc_key040,
-+ sizeof(enc_input040), sizeof(enc_assoc040), sizeof(enc_nonce040) },
-+ { enc_input041, enc_output041, enc_assoc041, enc_nonce041, enc_key041,
-+ sizeof(enc_input041), sizeof(enc_assoc041), sizeof(enc_nonce041) },
-+ { enc_input042, enc_output042, enc_assoc042, enc_nonce042, enc_key042,
-+ sizeof(enc_input042), sizeof(enc_assoc042), sizeof(enc_nonce042) },
-+ { enc_input043, enc_output043, enc_assoc043, enc_nonce043, enc_key043,
-+ sizeof(enc_input043), sizeof(enc_assoc043), sizeof(enc_nonce043) },
-+ { enc_input044, enc_output044, enc_assoc044, enc_nonce044, enc_key044,
-+ sizeof(enc_input044), sizeof(enc_assoc044), sizeof(enc_nonce044) },
-+ { enc_input045, enc_output045, enc_assoc045, enc_nonce045, enc_key045,
-+ sizeof(enc_input045), sizeof(enc_assoc045), sizeof(enc_nonce045) },
-+ { enc_input046, enc_output046, enc_assoc046, enc_nonce046, enc_key046,
-+ sizeof(enc_input046), sizeof(enc_assoc046), sizeof(enc_nonce046) },
-+ { enc_input047, enc_output047, enc_assoc047, enc_nonce047, enc_key047,
-+ sizeof(enc_input047), sizeof(enc_assoc047), sizeof(enc_nonce047) },
-+ { enc_input048, enc_output048, enc_assoc048, enc_nonce048, enc_key048,
-+ sizeof(enc_input048), sizeof(enc_assoc048), sizeof(enc_nonce048) },
-+ { enc_input049, enc_output049, enc_assoc049, enc_nonce049, enc_key049,
-+ sizeof(enc_input049), sizeof(enc_assoc049), sizeof(enc_nonce049) },
-+ { enc_input050, enc_output050, enc_assoc050, enc_nonce050, enc_key050,
-+ sizeof(enc_input050), sizeof(enc_assoc050), sizeof(enc_nonce050) },
-+ { enc_input051, enc_output051, enc_assoc051, enc_nonce051, enc_key051,
-+ sizeof(enc_input051), sizeof(enc_assoc051), sizeof(enc_nonce051) },
-+ { enc_input052, enc_output052, enc_assoc052, enc_nonce052, enc_key052,
-+ sizeof(enc_input052), sizeof(enc_assoc052), sizeof(enc_nonce052) },
- { enc_input053, enc_output053, enc_assoc053, enc_nonce053, enc_key053,
- sizeof(enc_input053), sizeof(enc_assoc053), sizeof(enc_nonce053) },
- { enc_input054, enc_output054, enc_assoc054, enc_nonce054, enc_key054,
-@@ -4497,6 +6076,10 @@ chacha20poly1305_enc_vectors[] __initcon
- sizeof(enc_input072), sizeof(enc_assoc072), sizeof(enc_nonce072) },
- { enc_input073, enc_output073, enc_assoc073, enc_nonce073, enc_key073,
- sizeof(enc_input073), sizeof(enc_assoc073), sizeof(enc_nonce073) },
-+ { enc_input074, enc_output074, enc_assoc074, enc_nonce074, enc_key074,
-+ sizeof(enc_input074), sizeof(enc_assoc074), sizeof(enc_nonce074) },
-+ { enc_input075, enc_output075, enc_assoc075, enc_nonce075, enc_key075,
-+ sizeof(enc_input075), sizeof(enc_assoc075), sizeof(enc_nonce075) },
- { enc_input076, enc_output076, enc_assoc076, enc_nonce076, enc_key076,
- sizeof(enc_input076), sizeof(enc_assoc076), sizeof(enc_nonce076) },
- { enc_input077, enc_output077, enc_assoc077, enc_nonce077, enc_key077,
-@@ -4517,6 +6100,20 @@ chacha20poly1305_enc_vectors[] __initcon
- sizeof(enc_input084), sizeof(enc_assoc084), sizeof(enc_nonce084) },
- { enc_input085, enc_output085, enc_assoc085, enc_nonce085, enc_key085,
- sizeof(enc_input085), sizeof(enc_assoc085), sizeof(enc_nonce085) },
-+ { enc_input086, enc_output086, enc_assoc086, enc_nonce086, enc_key086,
-+ sizeof(enc_input086), sizeof(enc_assoc086), sizeof(enc_nonce086) },
-+ { enc_input087, enc_output087, enc_assoc087, enc_nonce087, enc_key087,
-+ sizeof(enc_input087), sizeof(enc_assoc087), sizeof(enc_nonce087) },
-+ { enc_input088, enc_output088, enc_assoc088, enc_nonce088, enc_key088,
-+ sizeof(enc_input088), sizeof(enc_assoc088), sizeof(enc_nonce088) },
-+ { enc_input089, enc_output089, enc_assoc089, enc_nonce089, enc_key089,
-+ sizeof(enc_input089), sizeof(enc_assoc089), sizeof(enc_nonce089) },
-+ { enc_input090, enc_output090, enc_assoc090, enc_nonce090, enc_key090,
-+ sizeof(enc_input090), sizeof(enc_assoc090), sizeof(enc_nonce090) },
-+ { enc_input091, enc_output091, enc_assoc091, enc_nonce091, enc_key091,
-+ sizeof(enc_input091), sizeof(enc_assoc091), sizeof(enc_nonce091) },
-+ { enc_input092, enc_output092, enc_assoc092, enc_nonce092, enc_key092,
-+ sizeof(enc_input092), sizeof(enc_assoc092), sizeof(enc_nonce092) },
- { enc_input093, enc_output093, enc_assoc093, enc_nonce093, enc_key093,
- sizeof(enc_input093), sizeof(enc_assoc093), sizeof(enc_nonce093) },
- { enc_input094, enc_output094, enc_assoc094, enc_nonce094, enc_key094,
-@@ -7224,6 +8821,43 @@ xchacha20poly1305_dec_vectors[] __initco
- sizeof(xdec_input001), sizeof(xdec_assoc001), sizeof(xdec_nonce001) }
- };
-
-+/* This is for the selftests-only, since it is only useful for the purpose of
-+ * testing the underlying primitives and interactions.
-+ */
-+static void __init
-+chacha20poly1305_encrypt_bignonce(u8 *dst, const u8 *src, const size_t src_len,
-+ const u8 *ad, const size_t ad_len,
-+ const u8 nonce[12],
-+ const u8 key[CHACHA20POLY1305_KEY_SIZE])
-+{
-+ const u8 *pad0 = page_address(ZERO_PAGE(0));
-+ struct poly1305_desc_ctx poly1305_state;
-+ u32 chacha20_state[CHACHA_STATE_WORDS];
-+ union {
-+ u8 block0[POLY1305_KEY_SIZE];
-+ __le64 lens[2];
-+ } b = {{ 0 }};
-+ u8 bottom_row[16] = { 0 };
-+ u32 le_key[8];
-+ int i;
-+
-+ memcpy(&bottom_row[4], nonce, 12);
-+ for (i = 0; i < 8; ++i)
-+ le_key[i] = get_unaligned_le32(key + sizeof(le_key[i]) * i);
-+ chacha_init(chacha20_state, le_key, bottom_row);
-+ chacha20_crypt(chacha20_state, b.block0, b.block0, sizeof(b.block0));
-+ poly1305_init(&poly1305_state, b.block0);
-+ poly1305_update(&poly1305_state, ad, ad_len);
-+ poly1305_update(&poly1305_state, pad0, (0x10 - ad_len) & 0xf);
-+ chacha20_crypt(chacha20_state, dst, src, src_len);
-+ poly1305_update(&poly1305_state, dst, src_len);
-+ poly1305_update(&poly1305_state, pad0, (0x10 - src_len) & 0xf);
-+ b.lens[0] = cpu_to_le64(ad_len);
-+ b.lens[1] = cpu_to_le64(src_len);
-+ poly1305_update(&poly1305_state, (u8 *)b.lens, sizeof(b.lens));
-+ poly1305_final(&poly1305_state, dst + src_len);
-+}
-+
- static void __init
- chacha20poly1305_selftest_encrypt(u8 *dst, const u8 *src, const size_t src_len,
- const u8 *ad, const size_t ad_len,
-@@ -7233,6 +8867,9 @@ chacha20poly1305_selftest_encrypt(u8 *ds
- if (nonce_len == 8)
- chacha20poly1305_encrypt(dst, src, src_len, ad, ad_len,
- get_unaligned_le64(nonce), key);
-+ else if (nonce_len == 12)
-+ chacha20poly1305_encrypt_bignonce(dst, src, src_len, ad,
-+ ad_len, nonce, key);
- else
- BUG();
- }
-@@ -7248,14 +8885,14 @@ decryption_success(bool func_ret, bool e
- bool __init chacha20poly1305_selftest(void)
- {
- enum { MAXIMUM_TEST_BUFFER_LEN = 1UL << 12 };
-- size_t i;
-- u8 *computed_output = NULL, *heap_src = NULL;
-- struct scatterlist sg_src;
-+ size_t i, j, k, total_len;
-+ u8 *computed_output = NULL, *input = NULL;
- bool success = true, ret;
-+ struct scatterlist sg_src[3];
-
-- heap_src = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
- computed_output = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
-- if (!heap_src || !computed_output) {
-+ input = kmalloc(MAXIMUM_TEST_BUFFER_LEN, GFP_KERNEL);
-+ if (!computed_output || !input) {
- pr_err("chacha20poly1305 self-test malloc: FAIL\n");
- success = false;
- goto out;
-@@ -7284,17 +8921,17 @@ bool __init chacha20poly1305_selftest(vo
- for (i = 0; i < ARRAY_SIZE(chacha20poly1305_enc_vectors); ++i) {
- if (chacha20poly1305_enc_vectors[i].nlen != 8)
- continue;
-- memcpy(heap_src, chacha20poly1305_enc_vectors[i].input,
-+ memcpy(computed_output, chacha20poly1305_enc_vectors[i].input,
- chacha20poly1305_enc_vectors[i].ilen);
-- sg_init_one(&sg_src, heap_src,
-+ sg_init_one(sg_src, computed_output,
- chacha20poly1305_enc_vectors[i].ilen + POLY1305_DIGEST_SIZE);
-- chacha20poly1305_encrypt_sg_inplace(&sg_src,
-+ ret = chacha20poly1305_encrypt_sg_inplace(sg_src,
- chacha20poly1305_enc_vectors[i].ilen,
- chacha20poly1305_enc_vectors[i].assoc,
- chacha20poly1305_enc_vectors[i].alen,
- get_unaligned_le64(chacha20poly1305_enc_vectors[i].nonce),
- chacha20poly1305_enc_vectors[i].key);
-- if (memcmp(heap_src,
-+ if (!ret || memcmp(computed_output,
- chacha20poly1305_enc_vectors[i].output,
- chacha20poly1305_enc_vectors[i].ilen +
- POLY1305_DIGEST_SIZE)) {
-@@ -7326,11 +8963,11 @@ bool __init chacha20poly1305_selftest(vo
- }
-
- for (i = 0; i < ARRAY_SIZE(chacha20poly1305_dec_vectors); ++i) {
-- memcpy(heap_src, chacha20poly1305_dec_vectors[i].input,
-+ memcpy(computed_output, chacha20poly1305_dec_vectors[i].input,
- chacha20poly1305_dec_vectors[i].ilen);
-- sg_init_one(&sg_src, heap_src,
-+ sg_init_one(sg_src, computed_output,
- chacha20poly1305_dec_vectors[i].ilen);
-- ret = chacha20poly1305_decrypt_sg_inplace(&sg_src,
-+ ret = chacha20poly1305_decrypt_sg_inplace(sg_src,
- chacha20poly1305_dec_vectors[i].ilen,
- chacha20poly1305_dec_vectors[i].assoc,
- chacha20poly1305_dec_vectors[i].alen,
-@@ -7338,7 +8975,7 @@ bool __init chacha20poly1305_selftest(vo
- chacha20poly1305_dec_vectors[i].key);
- if (!decryption_success(ret,
- chacha20poly1305_dec_vectors[i].failure,
-- memcmp(heap_src, chacha20poly1305_dec_vectors[i].output,
-+ memcmp(computed_output, chacha20poly1305_dec_vectors[i].output,
- chacha20poly1305_dec_vectors[i].ilen -
- POLY1305_DIGEST_SIZE))) {
- pr_err("chacha20poly1305 sg decryption self-test %zu: FAIL\n",
-@@ -7365,6 +9002,7 @@ bool __init chacha20poly1305_selftest(vo
- success = false;
- }
- }
-+
- for (i = 0; i < ARRAY_SIZE(xchacha20poly1305_dec_vectors); ++i) {
- memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN);
- ret = xchacha20poly1305_decrypt(computed_output,
-@@ -7386,8 +9024,54 @@ bool __init chacha20poly1305_selftest(vo
- }
- }
-
-+ for (total_len = POLY1305_DIGEST_SIZE; IS_ENABLED(DEBUG_CHACHA20POLY1305_SLOW_CHUNK_TEST)
-+ && total_len <= 1 << 10; ++total_len) {
-+ for (i = 0; i <= total_len; ++i) {
-+ for (j = i; j <= total_len; ++j) {
-+ sg_init_table(sg_src, 3);
-+ sg_set_buf(&sg_src[0], input, i);
-+ sg_set_buf(&sg_src[1], input + i, j - i);
-+ sg_set_buf(&sg_src[2], input + j, total_len - j);
-+ memset(computed_output, 0, total_len);
-+ memset(input, 0, total_len);
-+
-+ if (!chacha20poly1305_encrypt_sg_inplace(sg_src,
-+ total_len - POLY1305_DIGEST_SIZE, NULL, 0,
-+ 0, enc_key001))
-+ goto chunkfail;
-+ chacha20poly1305_encrypt(computed_output,
-+ computed_output,
-+ total_len - POLY1305_DIGEST_SIZE, NULL, 0, 0,
-+ enc_key001);
-+ if (memcmp(computed_output, input, total_len))
-+ goto chunkfail;
-+ if (!chacha20poly1305_decrypt(computed_output,
-+ input, total_len, NULL, 0, 0, enc_key001))
-+ goto chunkfail;
-+ for (k = 0; k < total_len - POLY1305_DIGEST_SIZE; ++k) {
-+ if (computed_output[k])
-+ goto chunkfail;
-+ }
-+ if (!chacha20poly1305_decrypt_sg_inplace(sg_src,
-+ total_len, NULL, 0, 0, enc_key001))
-+ goto chunkfail;
-+ for (k = 0; k < total_len - POLY1305_DIGEST_SIZE; ++k) {
-+ if (input[k])
-+ goto chunkfail;
-+ }
-+ continue;
-+
-+ chunkfail:
-+ pr_err("chacha20poly1305 chunked self-test %zu/%zu/%zu: FAIL\n",
-+ total_len, i, j);
-+ success = false;
-+ }
-+
-+ }
-+ }
-+
- out:
-- kfree(heap_src);
- kfree(computed_output);
-+ kfree(input);
- return success;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0048-crypto-x86-poly1305-emit-does-base-conversion-itself.patch b/target/linux/generic/backport-5.4/080-wireguard-0048-crypto-x86-poly1305-emit-does-base-conversion-itself.patch
deleted file mode 100644
index 8209ca2898..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0048-crypto-x86-poly1305-emit-does-base-conversion-itself.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 17 Jan 2020 11:42:22 +0100
-Subject: [PATCH] crypto: x86/poly1305 - emit does base conversion itself
-
-commit f9e7fe32a792726186301423ff63a465d63386e1 upstream.
-
-The emit code does optional base conversion itself in assembly, so we
-don't need to do that here. Also, neither one of these functions uses
-simd instructions, so checking for that doesn't make sense either.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 8 ++------
- 1 file changed, 2 insertions(+), 6 deletions(-)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -123,13 +123,9 @@ static void poly1305_simd_blocks(void *c
- static void poly1305_simd_emit(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
- const u32 nonce[4])
- {
-- struct poly1305_arch_internal *state = ctx;
--
-- if (!IS_ENABLED(CONFIG_AS_AVX) || !static_branch_likely(&poly1305_use_avx) ||
-- !state->is_base2_26 || !crypto_simd_usable()) {
-- convert_to_base2_64(ctx);
-+ if (!IS_ENABLED(CONFIG_AS_AVX) || !static_branch_likely(&poly1305_use_avx))
- poly1305_emit_x86_64(ctx, mac, nonce);
-- } else
-+ else
- poly1305_emit_avx(ctx, mac, nonce);
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0049-crypto-arm-chacha-fix-build-failured-when-kernel-mod.patch b/target/linux/generic/backport-5.4/080-wireguard-0049-crypto-arm-chacha-fix-build-failured-when-kernel-mod.patch
deleted file mode 100644
index 354f584315..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0049-crypto-arm-chacha-fix-build-failured-when-kernel-mod.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 17 Jan 2020 17:43:18 +0100
-Subject: [PATCH] crypto: arm/chacha - fix build failured when kernel mode NEON
- is disabled
-
-commit 0bc81767c5bd9d005fae1099fb39eb3688370cb1 upstream.
-
-When the ARM accelerated ChaCha driver is built as part of a configuration
-that has kernel mode NEON disabled, we expect the compiler to propagate
-the build time constant expression IS_ENABLED(CONFIG_KERNEL_MODE_NEON) in
-a way that eliminates all the cross-object references to the actual NEON
-routines, which allows the chacha-neon-core.o object to be omitted from
-the build entirely.
-
-Unfortunately, this fails to work as expected in some cases, and we may
-end up with a build error such as
-
- chacha-glue.c:(.text+0xc0): undefined reference to `chacha_4block_xor_neon'
-
-caused by the fact that chacha_doneon() has not been eliminated from the
-object code, even though it will never be called in practice.
-
-Let's fix this by adding some IS_ENABLED(CONFIG_KERNEL_MODE_NEON) tests
-that are not strictly needed from a logical point of view, but should
-help the compiler infer that the NEON code paths are unreachable in
-those cases.
-
-Fixes: b36d8c09e710c71f ("crypto: arm/chacha - remove dependency on generic ...")
-Reported-by: Russell King <linux@armlinux.org.uk>
-Cc: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-glue.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -115,7 +115,7 @@ static int chacha_stream_xor(struct skci
- if (nbytes < walk.total)
- nbytes = round_down(nbytes, walk.stride);
-
-- if (!neon) {
-+ if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon) {
- chacha_doarm(walk.dst.virt.addr, walk.src.virt.addr,
- nbytes, state, ctx->nrounds);
- state[12] += DIV_ROUND_UP(nbytes, CHACHA_BLOCK_SIZE);
-@@ -159,7 +159,7 @@ static int do_xchacha(struct skcipher_re
-
- chacha_init_generic(state, ctx->key, req->iv);
-
-- if (!neon) {
-+ if (!IS_ENABLED(CONFIG_KERNEL_MODE_NEON) || !neon) {
- hchacha_block_arm(state, subctx.key, ctx->nrounds);
- } else {
- kernel_neon_begin();
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0050-crypto-Kconfig-allow-tests-to-be-disabled-when-manag.patch b/target/linux/generic/backport-5.4/080-wireguard-0050-crypto-Kconfig-allow-tests-to-be-disabled-when-manag.patch
deleted file mode 100644
index c52bf0a2a7..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0050-crypto-Kconfig-allow-tests-to-be-disabled-when-manag.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 17 Jan 2020 12:01:36 +0100
-Subject: [PATCH] crypto: Kconfig - allow tests to be disabled when manager is
- disabled
-
-commit 2343d1529aff8b552589f622c23932035ed7a05d upstream.
-
-The library code uses CRYPTO_MANAGER_DISABLE_TESTS to conditionalize its
-tests, but the library code can also exist without CRYPTO_MANAGER. That
-means on minimal configs, the test code winds up being built with no way
-to disable it.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/Kconfig | 4 ----
- 1 file changed, 4 deletions(-)
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -136,8 +136,6 @@ config CRYPTO_USER
- Userspace configuration for cryptographic instantiations such as
- cbc(aes).
-
--if CRYPTO_MANAGER2
--
- config CRYPTO_MANAGER_DISABLE_TESTS
- bool "Disable run-time self tests"
- default y
-@@ -155,8 +153,6 @@ config CRYPTO_MANAGER_EXTRA_TESTS
- This is intended for developer use only, as these tests take much
- longer to run than the normal self tests.
-
--endif # if CRYPTO_MANAGER2
--
- config CRYPTO_GF128MUL
- tristate
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0051-crypto-chacha20poly1305-prevent-integer-overflow-on-.patch b/target/linux/generic/backport-5.4/080-wireguard-0051-crypto-chacha20poly1305-prevent-integer-overflow-on-.patch
deleted file mode 100644
index 1ed49e5b6c..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0051-crypto-chacha20poly1305-prevent-integer-overflow-on-.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 6 Feb 2020 12:42:01 +0100
-Subject: [PATCH] crypto: chacha20poly1305 - prevent integer overflow on large
- input
-
-commit c9cc0517bba9f0213f1e55172feceb99e5512daf upstream.
-
-This code assigns src_len (size_t) to sl (int), which causes problems
-when src_len is very large. Probably nobody in the kernel should be
-passing this much data to chacha20poly1305 all in one go anyway, so I
-don't think we need to change the algorithm or introduce larger types
-or anything. But we should at least error out early in this case and
-print a warning so that we get reports if this does happen and can look
-into why anybody is possibly passing it that much data or if they're
-accidently passing -1 or similar.
-
-Fixes: d95312a3ccc0 ("crypto: lib/chacha20poly1305 - reimplement crypt_from_sg() routine")
-Cc: Ard Biesheuvel <ardb@kernel.org>
-Cc: stable@vger.kernel.org # 5.5+
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/chacha20poly1305.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/lib/crypto/chacha20poly1305.c
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -235,6 +235,9 @@ bool chacha20poly1305_crypt_sg_inplace(s
- __le64 lens[2];
- } b __aligned(16);
-
-+ if (WARN_ON(src_len > INT_MAX))
-+ return false;
-+
- chacha_load_key(b.k, key);
-
- b.iv[0] = 0;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0052-crypto-x86-curve25519-support-assemblers-with-no-adx.patch b/target/linux/generic/backport-5.4/080-wireguard-0052-crypto-x86-curve25519-support-assemblers-with-no-adx.patch
deleted file mode 100644
index cd507b1e44..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0052-crypto-x86-curve25519-support-assemblers-with-no-adx.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 1 Mar 2020 22:52:35 +0800
-Subject: [PATCH] crypto: x86/curve25519 - support assemblers with no adx
- support
-
-commit 1579f1bc3b753d17a44de3457d5c6f4a5b14c752 upstream.
-
-Some older version of GAS do not support the ADX instructions, similarly
-to how they also don't support AVX and such. This commit adds the same
-build-time detection mechanisms we use for AVX and others for ADX, and
-then makes sure that the curve25519 library dispatcher calls the right
-functions.
-
-Reported-by: Willy Tarreau <w@1wt.eu>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/Makefile | 5 +++--
- arch/x86/crypto/Makefile | 7 ++++++-
- include/crypto/curve25519.h | 6 ++++--
- 3 files changed, 13 insertions(+), 5 deletions(-)
-
---- a/arch/x86/Makefile
-+++ b/arch/x86/Makefile
-@@ -198,9 +198,10 @@ avx2_instr :=$(call as-instr,vpbroadcast
- avx512_instr :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,-DCONFIG_AS_AVX512=1)
- sha1_ni_instr :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA1_NI=1)
- sha256_ni_instr :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,-DCONFIG_AS_SHA256_NI=1)
-+adx_instr := $(call as-instr,adox %r10$(comma)%r10,-DCONFIG_AS_ADX=1)
-
--KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr)
--KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr)
-+KBUILD_AFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr)
-+KBUILD_CFLAGS += $(cfi) $(cfi-sigframe) $(cfi-sections) $(asinstr) $(avx_instr) $(avx2_instr) $(avx512_instr) $(sha1_ni_instr) $(sha256_ni_instr) $(adx_instr)
-
- KBUILD_LDFLAGS := -m elf_$(UTS_MACHINE)
-
---- a/arch/x86/crypto/Makefile
-+++ b/arch/x86/crypto/Makefile
-@@ -11,6 +11,7 @@ avx2_supported := $(call as-instr,vpgath
- avx512_supported :=$(call as-instr,vpmovm2b %k1$(comma)%zmm5,yes,no)
- sha1_ni_supported :=$(call as-instr,sha1msg1 %xmm0$(comma)%xmm1,yes,no)
- sha256_ni_supported :=$(call as-instr,sha256msg1 %xmm0$(comma)%xmm1,yes,no)
-+adx_supported := $(call as-instr,adox %r10$(comma)%r10,yes,no)
-
- obj-$(CONFIG_CRYPTO_GLUE_HELPER_X86) += glue_helper.o
-
-@@ -39,7 +40,11 @@ obj-$(CONFIG_CRYPTO_AEGIS128_AESNI_SSE2)
-
- obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o
- obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o
--obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o
-+
-+# These modules require the assembler to support ADX.
-+ifeq ($(adx_supported),yes)
-+ obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o
-+endif
-
- # These modules require assembler to support AVX.
- ifeq ($(avx_supported),yes)
---- a/include/crypto/curve25519.h
-+++ b/include/crypto/curve25519.h
-@@ -33,7 +33,8 @@ bool __must_check curve25519(u8 mypublic
- const u8 secret[CURVE25519_KEY_SIZE],
- const u8 basepoint[CURVE25519_KEY_SIZE])
- {
-- if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519) &&
-+ (!IS_ENABLED(CONFIG_CRYPTO_CURVE25519_X86) || IS_ENABLED(CONFIG_AS_ADX)))
- curve25519_arch(mypublic, secret, basepoint);
- else
- curve25519_generic(mypublic, secret, basepoint);
-@@ -49,7 +50,8 @@ __must_check curve25519_generate_public(
- CURVE25519_KEY_SIZE)))
- return false;
-
-- if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519))
-+ if (IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519) &&
-+ (!IS_ENABLED(CONFIG_CRYPTO_CURVE25519_X86) || IS_ENABLED(CONFIG_AS_ADX)))
- curve25519_base_arch(pub, secret);
- else
- curve25519_generic(pub, secret, curve25519_base_point);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0053-crypto-arm64-chacha-correctly-walk-through-blocks.patch b/target/linux/generic/backport-5.4/080-wireguard-0053-crypto-arm64-chacha-correctly-walk-through-blocks.patch
deleted file mode 100644
index 823a908373..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0053-crypto-arm64-chacha-correctly-walk-through-blocks.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 18 Mar 2020 20:27:32 -0600
-Subject: [PATCH] crypto: arm64/chacha - correctly walk through blocks
-
-commit c8cfcb78c65877313cda7bcbace624d3dbd1f3b3 upstream.
-
-Prior, passing in chunks of 2, 3, or 4, followed by any additional
-chunks would result in the chacha state counter getting out of sync,
-resulting in incorrect encryption/decryption, which is a pretty nasty
-crypto vuln: "why do images look weird on webpages?" WireGuard users
-never experienced this prior, because we have always, out of tree, used
-a different crypto library, until the recent Frankenzinc addition. This
-commit fixes the issue by advancing the pointers and state counter by
-the actual size processed. It also fixes up a bug in the (optional,
-costly) stride test that prevented it from running on arm64.
-
-Fixes: b3aad5bad26a ("crypto: arm64/chacha - expose arm64 ChaCha routine as library function")
-Reported-and-tested-by: Emil Renner Berthing <kernel@esmil.dk>
-Cc: Ard Biesheuvel <ardb@kernel.org>
-Cc: stable@vger.kernel.org # v5.5+
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Reviewed-by: Eric Biggers <ebiggers@google.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm64/crypto/chacha-neon-glue.c | 8 ++++----
- lib/crypto/chacha20poly1305-selftest.c | 11 ++++++++---
- 2 files changed, 12 insertions(+), 7 deletions(-)
-
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -55,10 +55,10 @@ static void chacha_doneon(u32 *state, u8
- break;
- }
- chacha_4block_xor_neon(state, dst, src, nrounds, l);
-- bytes -= CHACHA_BLOCK_SIZE * 5;
-- src += CHACHA_BLOCK_SIZE * 5;
-- dst += CHACHA_BLOCK_SIZE * 5;
-- state[12] += 5;
-+ bytes -= l;
-+ src += l;
-+ dst += l;
-+ state[12] += DIV_ROUND_UP(l, CHACHA_BLOCK_SIZE);
- }
- }
-
---- a/lib/crypto/chacha20poly1305-selftest.c
-+++ b/lib/crypto/chacha20poly1305-selftest.c
-@@ -9028,10 +9028,15 @@ bool __init chacha20poly1305_selftest(vo
- && total_len <= 1 << 10; ++total_len) {
- for (i = 0; i <= total_len; ++i) {
- for (j = i; j <= total_len; ++j) {
-+ k = 0;
- sg_init_table(sg_src, 3);
-- sg_set_buf(&sg_src[0], input, i);
-- sg_set_buf(&sg_src[1], input + i, j - i);
-- sg_set_buf(&sg_src[2], input + j, total_len - j);
-+ if (i)
-+ sg_set_buf(&sg_src[k++], input, i);
-+ if (j - i)
-+ sg_set_buf(&sg_src[k++], input + i, j - i);
-+ if (total_len - j)
-+ sg_set_buf(&sg_src[k++], input + j, total_len - j);
-+ sg_init_marker(sg_src, k);
- memset(computed_output, 0, total_len);
- memset(input, 0, total_len);
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0054-crypto-x86-curve25519-replace-with-formally-verified.patch b/target/linux/generic/backport-5.4/080-wireguard-0054-crypto-x86-curve25519-replace-with-formally-verified.patch
deleted file mode 100644
index 938d700da2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0054-crypto-x86-curve25519-replace-with-formally-verified.patch
+++ /dev/null
@@ -1,3765 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 20 Jan 2020 18:18:15 +0100
-Subject: [PATCH] crypto: x86/curve25519 - replace with formally verified
- implementation
-
-commit 07b586fe06625b0b610dc3d3a969c51913d143d4 upstream.
-
-This comes from INRIA's HACL*/Vale. It implements the same algorithm and
-implementation strategy as the code it replaces, only this code has been
-formally verified, sans the base point multiplication, which uses code
-similar to prior, only it uses the formally verified field arithmetic
-alongside reproducable ladder generation steps. This doesn't have a
-pure-bmi2 version, which means haswell no longer benefits, but the
-increased (doubled) code complexity is not worth it for a single
-generation of chips that's already old.
-
-Performance-wise, this is around 1% slower on older microarchitectures,
-and slightly faster on newer microarchitectures, mainly 10nm ones or
-backports of 10nm to 14nm. This implementation is "everest" below:
-
-Xeon E5-2680 v4 (Broadwell)
-
- armfazh: 133340 cycles per call
- everest: 133436 cycles per call
-
-Xeon Gold 5120 (Sky Lake Server)
-
- armfazh: 112636 cycles per call
- everest: 113906 cycles per call
-
-Core i5-6300U (Sky Lake Client)
-
- armfazh: 116810 cycles per call
- everest: 117916 cycles per call
-
-Core i7-7600U (Kaby Lake)
-
- armfazh: 119523 cycles per call
- everest: 119040 cycles per call
-
-Core i7-8750H (Coffee Lake)
-
- armfazh: 113914 cycles per call
- everest: 113650 cycles per call
-
-Core i9-9880H (Coffee Lake Refresh)
-
- armfazh: 112616 cycles per call
- everest: 114082 cycles per call
-
-Core i3-8121U (Cannon Lake)
-
- armfazh: 113202 cycles per call
- everest: 111382 cycles per call
-
-Core i7-8265U (Whiskey Lake)
-
- armfazh: 127307 cycles per call
- everest: 127697 cycles per call
-
-Core i7-8550U (Kaby Lake Refresh)
-
- armfazh: 127522 cycles per call
- everest: 127083 cycles per call
-
-Xeon Platinum 8275CL (Cascade Lake)
-
- armfazh: 114380 cycles per call
- everest: 114656 cycles per call
-
-Achieving these kind of results with formally verified code is quite
-remarkable, especialy considering that performance is favorable for
-newer chips.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/curve25519-x86_64.c | 3546 ++++++++++-----------------
- 1 file changed, 1292 insertions(+), 2254 deletions(-)
-
---- a/arch/x86/crypto/curve25519-x86_64.c
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -1,8 +1,7 @@
--// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
-+// SPDX-License-Identifier: GPL-2.0 OR MIT
- /*
-- * Copyright (c) 2017 Armando Faz <armfazh@ic.unicamp.br>. All Rights Reserved.
-- * Copyright (C) 2018-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-- * Copyright (C) 2018 Samuel Neves <sneves@dei.uc.pt>. All Rights Reserved.
-+ * Copyright (C) 2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ * Copyright (c) 2016-2020 INRIA, CMU and Microsoft Corporation
- */
-
- #include <crypto/curve25519.h>
-@@ -16,2337 +15,1378 @@
- #include <asm/cpufeature.h>
- #include <asm/processor.h>
-
--static __ro_after_init DEFINE_STATIC_KEY_FALSE(curve25519_use_bmi2);
--static __ro_after_init DEFINE_STATIC_KEY_FALSE(curve25519_use_adx);
--
--enum { NUM_WORDS_ELTFP25519 = 4 };
--typedef __aligned(32) u64 eltfp25519_1w[NUM_WORDS_ELTFP25519];
--typedef __aligned(32) u64 eltfp25519_1w_buffer[2 * NUM_WORDS_ELTFP25519];
--
--#define mul_eltfp25519_1w_adx(c, a, b) do { \
-- mul_256x256_integer_adx(m.buffer, a, b); \
-- red_eltfp25519_1w_adx(c, m.buffer); \
--} while (0)
--
--#define mul_eltfp25519_1w_bmi2(c, a, b) do { \
-- mul_256x256_integer_bmi2(m.buffer, a, b); \
-- red_eltfp25519_1w_bmi2(c, m.buffer); \
--} while (0)
--
--#define sqr_eltfp25519_1w_adx(a) do { \
-- sqr_256x256_integer_adx(m.buffer, a); \
-- red_eltfp25519_1w_adx(a, m.buffer); \
--} while (0)
--
--#define sqr_eltfp25519_1w_bmi2(a) do { \
-- sqr_256x256_integer_bmi2(m.buffer, a); \
-- red_eltfp25519_1w_bmi2(a, m.buffer); \
--} while (0)
--
--#define mul_eltfp25519_2w_adx(c, a, b) do { \
-- mul2_256x256_integer_adx(m.buffer, a, b); \
-- red_eltfp25519_2w_adx(c, m.buffer); \
--} while (0)
--
--#define mul_eltfp25519_2w_bmi2(c, a, b) do { \
-- mul2_256x256_integer_bmi2(m.buffer, a, b); \
-- red_eltfp25519_2w_bmi2(c, m.buffer); \
--} while (0)
--
--#define sqr_eltfp25519_2w_adx(a) do { \
-- sqr2_256x256_integer_adx(m.buffer, a); \
-- red_eltfp25519_2w_adx(a, m.buffer); \
--} while (0)
--
--#define sqr_eltfp25519_2w_bmi2(a) do { \
-- sqr2_256x256_integer_bmi2(m.buffer, a); \
-- red_eltfp25519_2w_bmi2(a, m.buffer); \
--} while (0)
--
--#define sqrn_eltfp25519_1w_adx(a, times) do { \
-- int ____counter = (times); \
-- while (____counter-- > 0) \
-- sqr_eltfp25519_1w_adx(a); \
--} while (0)
--
--#define sqrn_eltfp25519_1w_bmi2(a, times) do { \
-- int ____counter = (times); \
-- while (____counter-- > 0) \
-- sqr_eltfp25519_1w_bmi2(a); \
--} while (0)
--
--#define copy_eltfp25519_1w(C, A) do { \
-- (C)[0] = (A)[0]; \
-- (C)[1] = (A)[1]; \
-- (C)[2] = (A)[2]; \
-- (C)[3] = (A)[3]; \
--} while (0)
--
--#define setzero_eltfp25519_1w(C) do { \
-- (C)[0] = 0; \
-- (C)[1] = 0; \
-- (C)[2] = 0; \
-- (C)[3] = 0; \
--} while (0)
--
--__aligned(32) static const u64 table_ladder_8k[252 * NUM_WORDS_ELTFP25519] = {
-- /* 1 */ 0xfffffffffffffff3UL, 0xffffffffffffffffUL,
-- 0xffffffffffffffffUL, 0x5fffffffffffffffUL,
-- /* 2 */ 0x6b8220f416aafe96UL, 0x82ebeb2b4f566a34UL,
-- 0xd5a9a5b075a5950fUL, 0x5142b2cf4b2488f4UL,
-- /* 3 */ 0x6aaebc750069680cUL, 0x89cf7820a0f99c41UL,
-- 0x2a58d9183b56d0f4UL, 0x4b5aca80e36011a4UL,
-- /* 4 */ 0x329132348c29745dUL, 0xf4a2e616e1642fd7UL,
-- 0x1e45bb03ff67bc34UL, 0x306912d0f42a9b4aUL,
-- /* 5 */ 0xff886507e6af7154UL, 0x04f50e13dfeec82fUL,
-- 0xaa512fe82abab5ceUL, 0x174e251a68d5f222UL,
-- /* 6 */ 0xcf96700d82028898UL, 0x1743e3370a2c02c5UL,
-- 0x379eec98b4e86eaaUL, 0x0c59888a51e0482eUL,
-- /* 7 */ 0xfbcbf1d699b5d189UL, 0xacaef0d58e9fdc84UL,
-- 0xc1c20d06231f7614UL, 0x2938218da274f972UL,
-- /* 8 */ 0xf6af49beff1d7f18UL, 0xcc541c22387ac9c2UL,
-- 0x96fcc9ef4015c56bUL, 0x69c1627c690913a9UL,
-- /* 9 */ 0x7a86fd2f4733db0eUL, 0xfdb8c4f29e087de9UL,
-- 0x095e4b1a8ea2a229UL, 0x1ad7a7c829b37a79UL,
-- /* 10 */ 0x342d89cad17ea0c0UL, 0x67bedda6cced2051UL,
-- 0x19ca31bf2bb42f74UL, 0x3df7b4c84980acbbUL,
-- /* 11 */ 0xa8c6444dc80ad883UL, 0xb91e440366e3ab85UL,
-- 0xc215cda00164f6d8UL, 0x3d867c6ef247e668UL,
-- /* 12 */ 0xc7dd582bcc3e658cUL, 0xfd2c4748ee0e5528UL,
-- 0xa0fd9b95cc9f4f71UL, 0x7529d871b0675ddfUL,
-- /* 13 */ 0xb8f568b42d3cbd78UL, 0x1233011b91f3da82UL,
-- 0x2dce6ccd4a7c3b62UL, 0x75e7fc8e9e498603UL,
-- /* 14 */ 0x2f4f13f1fcd0b6ecUL, 0xf1a8ca1f29ff7a45UL,
-- 0xc249c1a72981e29bUL, 0x6ebe0dbb8c83b56aUL,
-- /* 15 */ 0x7114fa8d170bb222UL, 0x65a2dcd5bf93935fUL,
-- 0xbdc41f68b59c979aUL, 0x2f0eef79a2ce9289UL,
-- /* 16 */ 0x42ecbf0c083c37ceUL, 0x2930bc09ec496322UL,
-- 0xf294b0c19cfeac0dUL, 0x3780aa4bedfabb80UL,
-- /* 17 */ 0x56c17d3e7cead929UL, 0xe7cb4beb2e5722c5UL,
-- 0x0ce931732dbfe15aUL, 0x41b883c7621052f8UL,
-- /* 18 */ 0xdbf75ca0c3d25350UL, 0x2936be086eb1e351UL,
-- 0xc936e03cb4a9b212UL, 0x1d45bf82322225aaUL,
-- /* 19 */ 0xe81ab1036a024cc5UL, 0xe212201c304c9a72UL,
-- 0xc5d73fba6832b1fcUL, 0x20ffdb5a4d839581UL,
-- /* 20 */ 0xa283d367be5d0fadUL, 0x6c2b25ca8b164475UL,
-- 0x9d4935467caaf22eUL, 0x5166408eee85ff49UL,
-- /* 21 */ 0x3c67baa2fab4e361UL, 0xb3e433c67ef35cefUL,
-- 0x5259729241159b1cUL, 0x6a621892d5b0ab33UL,
-- /* 22 */ 0x20b74a387555cdcbUL, 0x532aa10e1208923fUL,
-- 0xeaa17b7762281dd1UL, 0x61ab3443f05c44bfUL,
-- /* 23 */ 0x257a6c422324def8UL, 0x131c6c1017e3cf7fUL,
-- 0x23758739f630a257UL, 0x295a407a01a78580UL,
-- /* 24 */ 0xf8c443246d5da8d9UL, 0x19d775450c52fa5dUL,
-- 0x2afcfc92731bf83dUL, 0x7d10c8e81b2b4700UL,
-- /* 25 */ 0xc8e0271f70baa20bUL, 0x993748867ca63957UL,
-- 0x5412efb3cb7ed4bbUL, 0x3196d36173e62975UL,
-- /* 26 */ 0xde5bcad141c7dffcUL, 0x47cc8cd2b395c848UL,
-- 0xa34cd942e11af3cbUL, 0x0256dbf2d04ecec2UL,
-- /* 27 */ 0x875ab7e94b0e667fUL, 0xcad4dd83c0850d10UL,
-- 0x47f12e8f4e72c79fUL, 0x5f1a87bb8c85b19bUL,
-- /* 28 */ 0x7ae9d0b6437f51b8UL, 0x12c7ce5518879065UL,
-- 0x2ade09fe5cf77aeeUL, 0x23a05a2f7d2c5627UL,
-- /* 29 */ 0x5908e128f17c169aUL, 0xf77498dd8ad0852dUL,
-- 0x74b4c4ceab102f64UL, 0x183abadd10139845UL,
-- /* 30 */ 0xb165ba8daa92aaacUL, 0xd5c5ef9599386705UL,
-- 0xbe2f8f0cf8fc40d1UL, 0x2701e635ee204514UL,
-- /* 31 */ 0x629fa80020156514UL, 0xf223868764a8c1ceUL,
-- 0x5b894fff0b3f060eUL, 0x60d9944cf708a3faUL,
-- /* 32 */ 0xaeea001a1c7a201fUL, 0xebf16a633ee2ce63UL,
-- 0x6f7709594c7a07e1UL, 0x79b958150d0208cbUL,
-- /* 33 */ 0x24b55e5301d410e7UL, 0xe3a34edff3fdc84dUL,
-- 0xd88768e4904032d8UL, 0x131384427b3aaeecUL,
-- /* 34 */ 0x8405e51286234f14UL, 0x14dc4739adb4c529UL,
-- 0xb8a2b5b250634ffdUL, 0x2fe2a94ad8a7ff93UL,
-- /* 35 */ 0xec5c57efe843faddUL, 0x2843ce40f0bb9918UL,
-- 0xa4b561d6cf3d6305UL, 0x743629bde8fb777eUL,
-- /* 36 */ 0x343edd46bbaf738fUL, 0xed981828b101a651UL,
-- 0xa401760b882c797aUL, 0x1fc223e28dc88730UL,
-- /* 37 */ 0x48604e91fc0fba0eUL, 0xb637f78f052c6fa4UL,
-- 0x91ccac3d09e9239cUL, 0x23f7eed4437a687cUL,
-- /* 38 */ 0x5173b1118d9bd800UL, 0x29d641b63189d4a7UL,
-- 0xfdbf177988bbc586UL, 0x2959894fcad81df5UL,
-- /* 39 */ 0xaebc8ef3b4bbc899UL, 0x4148995ab26992b9UL,
-- 0x24e20b0134f92cfbUL, 0x40d158894a05dee8UL,
-- /* 40 */ 0x46b00b1185af76f6UL, 0x26bac77873187a79UL,
-- 0x3dc0bf95ab8fff5fUL, 0x2a608bd8945524d7UL,
-- /* 41 */ 0x26449588bd446302UL, 0x7c4bc21c0388439cUL,
-- 0x8e98a4f383bd11b2UL, 0x26218d7bc9d876b9UL,
-- /* 42 */ 0xe3081542997c178aUL, 0x3c2d29a86fb6606fUL,
-- 0x5c217736fa279374UL, 0x7dde05734afeb1faUL,
-- /* 43 */ 0x3bf10e3906d42babUL, 0xe4f7803e1980649cUL,
-- 0xe6053bf89595bf7aUL, 0x394faf38da245530UL,
-- /* 44 */ 0x7a8efb58896928f4UL, 0xfbc778e9cc6a113cUL,
-- 0x72670ce330af596fUL, 0x48f222a81d3d6cf7UL,
-- /* 45 */ 0xf01fce410d72caa7UL, 0x5a20ecc7213b5595UL,
-- 0x7bc21165c1fa1483UL, 0x07f89ae31da8a741UL,
-- /* 46 */ 0x05d2c2b4c6830ff9UL, 0xd43e330fc6316293UL,
-- 0xa5a5590a96d3a904UL, 0x705edb91a65333b6UL,
-- /* 47 */ 0x048ee15e0bb9a5f7UL, 0x3240cfca9e0aaf5dUL,
-- 0x8f4b71ceedc4a40bUL, 0x621c0da3de544a6dUL,
-- /* 48 */ 0x92872836a08c4091UL, 0xce8375b010c91445UL,
-- 0x8a72eb524f276394UL, 0x2667fcfa7ec83635UL,
-- /* 49 */ 0x7f4c173345e8752aUL, 0x061b47feee7079a5UL,
-- 0x25dd9afa9f86ff34UL, 0x3780cef5425dc89cUL,
-- /* 50 */ 0x1a46035a513bb4e9UL, 0x3e1ef379ac575adaUL,
-- 0xc78c5f1c5fa24b50UL, 0x321a967634fd9f22UL,
-- /* 51 */ 0x946707b8826e27faUL, 0x3dca84d64c506fd0UL,
-- 0xc189218075e91436UL, 0x6d9284169b3b8484UL,
-- /* 52 */ 0x3a67e840383f2ddfUL, 0x33eec9a30c4f9b75UL,
-- 0x3ec7c86fa783ef47UL, 0x26ec449fbac9fbc4UL,
-- /* 53 */ 0x5c0f38cba09b9e7dUL, 0x81168cc762a3478cUL,
-- 0x3e23b0d306fc121cUL, 0x5a238aa0a5efdcddUL,
-- /* 54 */ 0x1ba26121c4ea43ffUL, 0x36f8c77f7c8832b5UL,
-- 0x88fbea0b0adcf99aUL, 0x5ca9938ec25bebf9UL,
-- /* 55 */ 0xd5436a5e51fccda0UL, 0x1dbc4797c2cd893bUL,
-- 0x19346a65d3224a08UL, 0x0f5034e49b9af466UL,
-- /* 56 */ 0xf23c3967a1e0b96eUL, 0xe58b08fa867a4d88UL,
-- 0xfb2fabc6a7341679UL, 0x2a75381eb6026946UL,
-- /* 57 */ 0xc80a3be4c19420acUL, 0x66b1f6c681f2b6dcUL,
-- 0x7cf7036761e93388UL, 0x25abbbd8a660a4c4UL,
-- /* 58 */ 0x91ea12ba14fd5198UL, 0x684950fc4a3cffa9UL,
-- 0xf826842130f5ad28UL, 0x3ea988f75301a441UL,
-- /* 59 */ 0xc978109a695f8c6fUL, 0x1746eb4a0530c3f3UL,
-- 0x444d6d77b4459995UL, 0x75952b8c054e5cc7UL,
-- /* 60 */ 0xa3703f7915f4d6aaUL, 0x66c346202f2647d8UL,
-- 0xd01469df811d644bUL, 0x77fea47d81a5d71fUL,
-- /* 61 */ 0xc5e9529ef57ca381UL, 0x6eeeb4b9ce2f881aUL,
-- 0xb6e91a28e8009bd6UL, 0x4b80be3e9afc3fecUL,
-- /* 62 */ 0x7e3773c526aed2c5UL, 0x1b4afcb453c9a49dUL,
-- 0xa920bdd7baffb24dUL, 0x7c54699f122d400eUL,
-- /* 63 */ 0xef46c8e14fa94bc8UL, 0xe0b074ce2952ed5eUL,
-- 0xbea450e1dbd885d5UL, 0x61b68649320f712cUL,
-- /* 64 */ 0x8a485f7309ccbdd1UL, 0xbd06320d7d4d1a2dUL,
-- 0x25232973322dbef4UL, 0x445dc4758c17f770UL,
-- /* 65 */ 0xdb0434177cc8933cUL, 0xed6fe82175ea059fUL,
-- 0x1efebefdc053db34UL, 0x4adbe867c65daf99UL,
-- /* 66 */ 0x3acd71a2a90609dfUL, 0xe5e991856dd04050UL,
-- 0x1ec69b688157c23cUL, 0x697427f6885cfe4dUL,
-- /* 67 */ 0xd7be7b9b65e1a851UL, 0xa03d28d522c536ddUL,
-- 0x28399d658fd2b645UL, 0x49e5b7e17c2641e1UL,
-- /* 68 */ 0x6f8c3a98700457a4UL, 0x5078f0a25ebb6778UL,
-- 0xd13c3ccbc382960fUL, 0x2e003258a7df84b1UL,
-- /* 69 */ 0x8ad1f39be6296a1cUL, 0xc1eeaa652a5fbfb2UL,
-- 0x33ee0673fd26f3cbUL, 0x59256173a69d2cccUL,
-- /* 70 */ 0x41ea07aa4e18fc41UL, 0xd9fc19527c87a51eUL,
-- 0xbdaacb805831ca6fUL, 0x445b652dc916694fUL,
-- /* 71 */ 0xce92a3a7f2172315UL, 0x1edc282de11b9964UL,
-- 0xa1823aafe04c314aUL, 0x790a2d94437cf586UL,
-- /* 72 */ 0x71c447fb93f6e009UL, 0x8922a56722845276UL,
-- 0xbf70903b204f5169UL, 0x2f7a89891ba319feUL,
-- /* 73 */ 0x02a08eb577e2140cUL, 0xed9a4ed4427bdcf4UL,
-- 0x5253ec44e4323cd1UL, 0x3e88363c14e9355bUL,
-- /* 74 */ 0xaa66c14277110b8cUL, 0x1ae0391610a23390UL,
-- 0x2030bd12c93fc2a2UL, 0x3ee141579555c7abUL,
-- /* 75 */ 0x9214de3a6d6e7d41UL, 0x3ccdd88607f17efeUL,
-- 0x674f1288f8e11217UL, 0x5682250f329f93d0UL,
-- /* 76 */ 0x6cf00b136d2e396eUL, 0x6e4cf86f1014debfUL,
-- 0x5930b1b5bfcc4e83UL, 0x047069b48aba16b6UL,
-- /* 77 */ 0x0d4ce4ab69b20793UL, 0xb24db91a97d0fb9eUL,
-- 0xcdfa50f54e00d01dUL, 0x221b1085368bddb5UL,
-- /* 78 */ 0xe7e59468b1e3d8d2UL, 0x53c56563bd122f93UL,
-- 0xeee8a903e0663f09UL, 0x61efa662cbbe3d42UL,
-- /* 79 */ 0x2cf8ddddde6eab2aUL, 0x9bf80ad51435f231UL,
-- 0x5deadacec9f04973UL, 0x29275b5d41d29b27UL,
-- /* 80 */ 0xcfde0f0895ebf14fUL, 0xb9aab96b054905a7UL,
-- 0xcae80dd9a1c420fdUL, 0x0a63bf2f1673bbc7UL,
-- /* 81 */ 0x092f6e11958fbc8cUL, 0x672a81e804822fadUL,
-- 0xcac8351560d52517UL, 0x6f3f7722c8f192f8UL,
-- /* 82 */ 0xf8ba90ccc2e894b7UL, 0x2c7557a438ff9f0dUL,
-- 0x894d1d855ae52359UL, 0x68e122157b743d69UL,
-- /* 83 */ 0xd87e5570cfb919f3UL, 0x3f2cdecd95798db9UL,
-- 0x2121154710c0a2ceUL, 0x3c66a115246dc5b2UL,
-- /* 84 */ 0xcbedc562294ecb72UL, 0xba7143c36a280b16UL,
-- 0x9610c2efd4078b67UL, 0x6144735d946a4b1eUL,
-- /* 85 */ 0x536f111ed75b3350UL, 0x0211db8c2041d81bUL,
-- 0xf93cb1000e10413cUL, 0x149dfd3c039e8876UL,
-- /* 86 */ 0xd479dde46b63155bUL, 0xb66e15e93c837976UL,
-- 0xdafde43b1f13e038UL, 0x5fafda1a2e4b0b35UL,
-- /* 87 */ 0x3600bbdf17197581UL, 0x3972050bbe3cd2c2UL,
-- 0x5938906dbdd5be86UL, 0x34fce5e43f9b860fUL,
-- /* 88 */ 0x75a8a4cd42d14d02UL, 0x828dabc53441df65UL,
-- 0x33dcabedd2e131d3UL, 0x3ebad76fb814d25fUL,
-- /* 89 */ 0xd4906f566f70e10fUL, 0x5d12f7aa51690f5aUL,
-- 0x45adb16e76cefcf2UL, 0x01f768aead232999UL,
-- /* 90 */ 0x2b6cc77b6248febdUL, 0x3cd30628ec3aaffdUL,
-- 0xce1c0b80d4ef486aUL, 0x4c3bff2ea6f66c23UL,
-- /* 91 */ 0x3f2ec4094aeaeb5fUL, 0x61b19b286e372ca7UL,
-- 0x5eefa966de2a701dUL, 0x23b20565de55e3efUL,
-- /* 92 */ 0xe301ca5279d58557UL, 0x07b2d4ce27c2874fUL,
-- 0xa532cd8a9dcf1d67UL, 0x2a52fee23f2bff56UL,
-- /* 93 */ 0x8624efb37cd8663dUL, 0xbbc7ac20ffbd7594UL,
-- 0x57b85e9c82d37445UL, 0x7b3052cb86a6ec66UL,
-- /* 94 */ 0x3482f0ad2525e91eUL, 0x2cb68043d28edca0UL,
-- 0xaf4f6d052e1b003aUL, 0x185f8c2529781b0aUL,
-- /* 95 */ 0xaa41de5bd80ce0d6UL, 0x9407b2416853e9d6UL,
-- 0x563ec36e357f4c3aUL, 0x4cc4b8dd0e297bceUL,
-- /* 96 */ 0xa2fc1a52ffb8730eUL, 0x1811f16e67058e37UL,
-- 0x10f9a366cddf4ee1UL, 0x72f4a0c4a0b9f099UL,
-- /* 97 */ 0x8c16c06f663f4ea7UL, 0x693b3af74e970fbaUL,
-- 0x2102e7f1d69ec345UL, 0x0ba53cbc968a8089UL,
-- /* 98 */ 0xca3d9dc7fea15537UL, 0x4c6824bb51536493UL,
-- 0xb9886314844006b1UL, 0x40d2a72ab454cc60UL,
-- /* 99 */ 0x5936a1b712570975UL, 0x91b9d648debda657UL,
-- 0x3344094bb64330eaUL, 0x006ba10d12ee51d0UL,
-- /* 100 */ 0x19228468f5de5d58UL, 0x0eb12f4c38cc05b0UL,
-- 0xa1039f9dd5601990UL, 0x4502d4ce4fff0e0bUL,
-- /* 101 */ 0xeb2054106837c189UL, 0xd0f6544c6dd3b93cUL,
-- 0x40727064c416d74fUL, 0x6e15c6114b502ef0UL,
-- /* 102 */ 0x4df2a398cfb1a76bUL, 0x11256c7419f2f6b1UL,
-- 0x4a497962066e6043UL, 0x705b3aab41355b44UL,
-- /* 103 */ 0x365ef536d797b1d8UL, 0x00076bd622ddf0dbUL,
-- 0x3bbf33b0e0575a88UL, 0x3777aa05c8e4ca4dUL,
-- /* 104 */ 0x392745c85578db5fUL, 0x6fda4149dbae5ae2UL,
-- 0xb1f0b00b8adc9867UL, 0x09963437d36f1da3UL,
-- /* 105 */ 0x7e824e90a5dc3853UL, 0xccb5f6641f135cbdUL,
-- 0x6736d86c87ce8fccUL, 0x625f3ce26604249fUL,
-- /* 106 */ 0xaf8ac8059502f63fUL, 0x0c05e70a2e351469UL,
-- 0x35292e9c764b6305UL, 0x1a394360c7e23ac3UL,
-- /* 107 */ 0xd5c6d53251183264UL, 0x62065abd43c2b74fUL,
-- 0xb5fbf5d03b973f9bUL, 0x13a3da3661206e5eUL,
-- /* 108 */ 0xc6bd5837725d94e5UL, 0x18e30912205016c5UL,
-- 0x2088ce1570033c68UL, 0x7fba1f495c837987UL,
-- /* 109 */ 0x5a8c7423f2f9079dUL, 0x1735157b34023fc5UL,
-- 0xe4f9b49ad2fab351UL, 0x6691ff72c878e33cUL,
-- /* 110 */ 0x122c2adedc5eff3eUL, 0xf8dd4bf1d8956cf4UL,
-- 0xeb86205d9e9e5bdaUL, 0x049b92b9d975c743UL,
-- /* 111 */ 0xa5379730b0f6c05aUL, 0x72a0ffacc6f3a553UL,
-- 0xb0032c34b20dcd6dUL, 0x470e9dbc88d5164aUL,
-- /* 112 */ 0xb19cf10ca237c047UL, 0xb65466711f6c81a2UL,
-- 0xb3321bd16dd80b43UL, 0x48c14f600c5fbe8eUL,
-- /* 113 */ 0x66451c264aa6c803UL, 0xb66e3904a4fa7da6UL,
-- 0xd45f19b0b3128395UL, 0x31602627c3c9bc10UL,
-- /* 114 */ 0x3120dc4832e4e10dUL, 0xeb20c46756c717f7UL,
-- 0x00f52e3f67280294UL, 0x566d4fc14730c509UL,
-- /* 115 */ 0x7e3a5d40fd837206UL, 0xc1e926dc7159547aUL,
-- 0x216730fba68d6095UL, 0x22e8c3843f69cea7UL,
-- /* 116 */ 0x33d074e8930e4b2bUL, 0xb6e4350e84d15816UL,
-- 0x5534c26ad6ba2365UL, 0x7773c12f89f1f3f3UL,
-- /* 117 */ 0x8cba404da57962aaUL, 0x5b9897a81999ce56UL,
-- 0x508e862f121692fcUL, 0x3a81907fa093c291UL,
-- /* 118 */ 0x0dded0ff4725a510UL, 0x10d8cc10673fc503UL,
-- 0x5b9d151c9f1f4e89UL, 0x32a5c1d5cb09a44cUL,
-- /* 119 */ 0x1e0aa442b90541fbUL, 0x5f85eb7cc1b485dbUL,
-- 0xbee595ce8a9df2e5UL, 0x25e496c722422236UL,
-- /* 120 */ 0x5edf3c46cd0fe5b9UL, 0x34e75a7ed2a43388UL,
-- 0xe488de11d761e352UL, 0x0e878a01a085545cUL,
-- /* 121 */ 0xba493c77e021bb04UL, 0x2b4d1843c7df899aUL,
-- 0x9ea37a487ae80d67UL, 0x67a9958011e41794UL,
-- /* 122 */ 0x4b58051a6697b065UL, 0x47e33f7d8d6ba6d4UL,
-- 0xbb4da8d483ca46c1UL, 0x68becaa181c2db0dUL,
-- /* 123 */ 0x8d8980e90b989aa5UL, 0xf95eb14a2c93c99bUL,
-- 0x51c6c7c4796e73a2UL, 0x6e228363b5efb569UL,
-- /* 124 */ 0xc6bbc0b02dd624c8UL, 0x777eb47dec8170eeUL,
-- 0x3cde15a004cfafa9UL, 0x1dc6bc087160bf9bUL,
-- /* 125 */ 0x2e07e043eec34002UL, 0x18e9fc677a68dc7fUL,
-- 0xd8da03188bd15b9aUL, 0x48fbc3bb00568253UL,
-- /* 126 */ 0x57547d4cfb654ce1UL, 0xd3565b82a058e2adUL,
-- 0xf63eaf0bbf154478UL, 0x47531ef114dfbb18UL,
-- /* 127 */ 0xe1ec630a4278c587UL, 0x5507d546ca8e83f3UL,
-- 0x85e135c63adc0c2bUL, 0x0aa7efa85682844eUL,
-- /* 128 */ 0x72691ba8b3e1f615UL, 0x32b4e9701fbe3ffaUL,
-- 0x97b6d92e39bb7868UL, 0x2cfe53dea02e39e8UL,
-- /* 129 */ 0x687392cd85cd52b0UL, 0x27ff66c910e29831UL,
-- 0x97134556a9832d06UL, 0x269bb0360a84f8a0UL,
-- /* 130 */ 0x706e55457643f85cUL, 0x3734a48c9b597d1bUL,
-- 0x7aee91e8c6efa472UL, 0x5cd6abc198a9d9e0UL,
-- /* 131 */ 0x0e04de06cb3ce41aUL, 0xd8c6eb893402e138UL,
-- 0x904659bb686e3772UL, 0x7215c371746ba8c8UL,
-- /* 132 */ 0xfd12a97eeae4a2d9UL, 0x9514b7516394f2c5UL,
-- 0x266fd5809208f294UL, 0x5c847085619a26b9UL,
-- /* 133 */ 0x52985410fed694eaUL, 0x3c905b934a2ed254UL,
-- 0x10bb47692d3be467UL, 0x063b3d2d69e5e9e1UL,
-- /* 134 */ 0x472726eedda57debUL, 0xefb6c4ae10f41891UL,
-- 0x2b1641917b307614UL, 0x117c554fc4f45b7cUL,
-- /* 135 */ 0xc07cf3118f9d8812UL, 0x01dbd82050017939UL,
-- 0xd7e803f4171b2827UL, 0x1015e87487d225eaUL,
-- /* 136 */ 0xc58de3fed23acc4dUL, 0x50db91c294a7be2dUL,
-- 0x0b94d43d1c9cf457UL, 0x6b1640fa6e37524aUL,
-- /* 137 */ 0x692f346c5fda0d09UL, 0x200b1c59fa4d3151UL,
-- 0xb8c46f760777a296UL, 0x4b38395f3ffdfbcfUL,
-- /* 138 */ 0x18d25e00be54d671UL, 0x60d50582bec8aba6UL,
-- 0x87ad8f263b78b982UL, 0x50fdf64e9cda0432UL,
-- /* 139 */ 0x90f567aac578dcf0UL, 0xef1e9b0ef2a3133bUL,
-- 0x0eebba9242d9de71UL, 0x15473c9bf03101c7UL,
-- /* 140 */ 0x7c77e8ae56b78095UL, 0xb678e7666e6f078eUL,
-- 0x2da0b9615348ba1fUL, 0x7cf931c1ff733f0bUL,
-- /* 141 */ 0x26b357f50a0a366cUL, 0xe9708cf42b87d732UL,
-- 0xc13aeea5f91cb2c0UL, 0x35d90c991143bb4cUL,
-- /* 142 */ 0x47c1c404a9a0d9dcUL, 0x659e58451972d251UL,
-- 0x3875a8c473b38c31UL, 0x1fbd9ed379561f24UL,
-- /* 143 */ 0x11fabc6fd41ec28dUL, 0x7ef8dfe3cd2a2dcaUL,
-- 0x72e73b5d8c404595UL, 0x6135fa4954b72f27UL,
-- /* 144 */ 0xccfc32a2de24b69cUL, 0x3f55698c1f095d88UL,
-- 0xbe3350ed5ac3f929UL, 0x5e9bf806ca477eebUL,
-- /* 145 */ 0xe9ce8fb63c309f68UL, 0x5376f63565e1f9f4UL,
-- 0xd1afcfb35a6393f1UL, 0x6632a1ede5623506UL,
-- /* 146 */ 0x0b7d6c390c2ded4cUL, 0x56cb3281df04cb1fUL,
-- 0x66305a1249ecc3c7UL, 0x5d588b60a38ca72aUL,
-- /* 147 */ 0xa6ecbf78e8e5f42dUL, 0x86eeb44b3c8a3eecUL,
-- 0xec219c48fbd21604UL, 0x1aaf1af517c36731UL,
-- /* 148 */ 0xc306a2836769bde7UL, 0x208280622b1e2adbUL,
-- 0x8027f51ffbff94a6UL, 0x76cfa1ce1124f26bUL,
-- /* 149 */ 0x18eb00562422abb6UL, 0xf377c4d58f8c29c3UL,
-- 0x4dbbc207f531561aUL, 0x0253b7f082128a27UL,
-- /* 150 */ 0x3d1f091cb62c17e0UL, 0x4860e1abd64628a9UL,
-- 0x52d17436309d4253UL, 0x356f97e13efae576UL,
-- /* 151 */ 0xd351e11aa150535bUL, 0x3e6b45bb1dd878ccUL,
-- 0x0c776128bed92c98UL, 0x1d34ae93032885b8UL,
-- /* 152 */ 0x4ba0488ca85ba4c3UL, 0x985348c33c9ce6ceUL,
-- 0x66124c6f97bda770UL, 0x0f81a0290654124aUL,
-- /* 153 */ 0x9ed09ca6569b86fdUL, 0x811009fd18af9a2dUL,
-- 0xff08d03f93d8c20aUL, 0x52a148199faef26bUL,
-- /* 154 */ 0x3e03f9dc2d8d1b73UL, 0x4205801873961a70UL,
-- 0xc0d987f041a35970UL, 0x07aa1f15a1c0d549UL,
-- /* 155 */ 0xdfd46ce08cd27224UL, 0x6d0a024f934e4239UL,
-- 0x808a7a6399897b59UL, 0x0a4556e9e13d95a2UL,
-- /* 156 */ 0xd21a991fe9c13045UL, 0x9b0e8548fe7751b8UL,
-- 0x5da643cb4bf30035UL, 0x77db28d63940f721UL,
-- /* 157 */ 0xfc5eeb614adc9011UL, 0x5229419ae8c411ebUL,
-- 0x9ec3e7787d1dcf74UL, 0x340d053e216e4cb5UL,
-- /* 158 */ 0xcac7af39b48df2b4UL, 0xc0faec2871a10a94UL,
-- 0x140a69245ca575edUL, 0x0cf1c37134273a4cUL,
-- /* 159 */ 0xc8ee306ac224b8a5UL, 0x57eaee7ccb4930b0UL,
-- 0xa1e806bdaacbe74fUL, 0x7d9a62742eeb657dUL,
-- /* 160 */ 0x9eb6b6ef546c4830UL, 0x885cca1fddb36e2eUL,
-- 0xe6b9f383ef0d7105UL, 0x58654fef9d2e0412UL,
-- /* 161 */ 0xa905c4ffbe0e8e26UL, 0x942de5df9b31816eUL,
-- 0x497d723f802e88e1UL, 0x30684dea602f408dUL,
-- /* 162 */ 0x21e5a278a3e6cb34UL, 0xaefb6e6f5b151dc4UL,
-- 0xb30b8e049d77ca15UL, 0x28c3c9cf53b98981UL,
-- /* 163 */ 0x287fb721556cdd2aUL, 0x0d317ca897022274UL,
-- 0x7468c7423a543258UL, 0x4a7f11464eb5642fUL,
-- /* 164 */ 0xa237a4774d193aa6UL, 0xd865986ea92129a1UL,
-- 0x24c515ecf87c1a88UL, 0x604003575f39f5ebUL,
-- /* 165 */ 0x47b9f189570a9b27UL, 0x2b98cede465e4b78UL,
-- 0x026df551dbb85c20UL, 0x74fcd91047e21901UL,
-- /* 166 */ 0x13e2a90a23c1bfa3UL, 0x0cb0074e478519f6UL,
-- 0x5ff1cbbe3af6cf44UL, 0x67fe5438be812dbeUL,
-- /* 167 */ 0xd13cf64fa40f05b0UL, 0x054dfb2f32283787UL,
-- 0x4173915b7f0d2aeaUL, 0x482f144f1f610d4eUL,
-- /* 168 */ 0xf6210201b47f8234UL, 0x5d0ae1929e70b990UL,
-- 0xdcd7f455b049567cUL, 0x7e93d0f1f0916f01UL,
-- /* 169 */ 0xdd79cbf18a7db4faUL, 0xbe8391bf6f74c62fUL,
-- 0x027145d14b8291bdUL, 0x585a73ea2cbf1705UL,
-- /* 170 */ 0x485ca03e928a0db2UL, 0x10fc01a5742857e7UL,
-- 0x2f482edbd6d551a7UL, 0x0f0433b5048fdb8aUL,
-- /* 171 */ 0x60da2e8dd7dc6247UL, 0x88b4c9d38cd4819aUL,
-- 0x13033ac001f66697UL, 0x273b24fe3b367d75UL,
-- /* 172 */ 0xc6e8f66a31b3b9d4UL, 0x281514a494df49d5UL,
-- 0xd1726fdfc8b23da7UL, 0x4b3ae7d103dee548UL,
-- /* 173 */ 0xc6256e19ce4b9d7eUL, 0xff5c5cf186e3c61cUL,
-- 0xacc63ca34b8ec145UL, 0x74621888fee66574UL,
-- /* 174 */ 0x956f409645290a1eUL, 0xef0bf8e3263a962eUL,
-- 0xed6a50eb5ec2647bUL, 0x0694283a9dca7502UL,
-- /* 175 */ 0x769b963643a2dcd1UL, 0x42b7c8ea09fc5353UL,
-- 0x4f002aee13397eabUL, 0x63005e2c19b7d63aUL,
-- /* 176 */ 0xca6736da63023beaUL, 0x966c7f6db12a99b7UL,
-- 0xace09390c537c5e1UL, 0x0b696063a1aa89eeUL,
-- /* 177 */ 0xebb03e97288c56e5UL, 0x432a9f9f938c8be8UL,
-- 0xa6a5a93d5b717f71UL, 0x1a5fb4c3e18f9d97UL,
-- /* 178 */ 0x1c94e7ad1c60cdceUL, 0xee202a43fc02c4a0UL,
-- 0x8dafe4d867c46a20UL, 0x0a10263c8ac27b58UL,
-- /* 179 */ 0xd0dea9dfe4432a4aUL, 0x856af87bbe9277c5UL,
-- 0xce8472acc212c71aUL, 0x6f151b6d9bbb1e91UL,
-- /* 180 */ 0x26776c527ceed56aUL, 0x7d211cb7fbf8faecUL,
-- 0x37ae66a6fd4609ccUL, 0x1f81b702d2770c42UL,
-- /* 181 */ 0x2fb0b057eac58392UL, 0xe1dd89fe29744e9dUL,
-- 0xc964f8eb17beb4f8UL, 0x29571073c9a2d41eUL,
-- /* 182 */ 0xa948a18981c0e254UL, 0x2df6369b65b22830UL,
-- 0xa33eb2d75fcfd3c6UL, 0x078cd6ec4199a01fUL,
-- /* 183 */ 0x4a584a41ad900d2fUL, 0x32142b78e2c74c52UL,
-- 0x68c4e8338431c978UL, 0x7f69ea9008689fc2UL,
-- /* 184 */ 0x52f2c81e46a38265UL, 0xfd78072d04a832fdUL,
-- 0x8cd7d5fa25359e94UL, 0x4de71b7454cc29d2UL,
-- /* 185 */ 0x42eb60ad1eda6ac9UL, 0x0aad37dfdbc09c3aUL,
-- 0x81004b71e33cc191UL, 0x44e6be345122803cUL,
-- /* 186 */ 0x03fe8388ba1920dbUL, 0xf5d57c32150db008UL,
-- 0x49c8c4281af60c29UL, 0x21edb518de701aeeUL,
-- /* 187 */ 0x7fb63e418f06dc99UL, 0xa4460d99c166d7b8UL,
-- 0x24dd5248ce520a83UL, 0x5ec3ad712b928358UL,
-- /* 188 */ 0x15022a5fbd17930fUL, 0xa4f64a77d82570e3UL,
-- 0x12bc8d6915783712UL, 0x498194c0fc620abbUL,
-- /* 189 */ 0x38a2d9d255686c82UL, 0x785c6bd9193e21f0UL,
-- 0xe4d5c81ab24a5484UL, 0x56307860b2e20989UL,
-- /* 190 */ 0x429d55f78b4d74c4UL, 0x22f1834643350131UL,
-- 0x1e60c24598c71fffUL, 0x59f2f014979983efUL,
-- /* 191 */ 0x46a47d56eb494a44UL, 0x3e22a854d636a18eUL,
-- 0xb346e15274491c3bUL, 0x2ceafd4e5390cde7UL,
-- /* 192 */ 0xba8a8538be0d6675UL, 0x4b9074bb50818e23UL,
-- 0xcbdab89085d304c3UL, 0x61a24fe0e56192c4UL,
-- /* 193 */ 0xcb7615e6db525bcbUL, 0xdd7d8c35a567e4caUL,
-- 0xe6b4153acafcdd69UL, 0x2d668e097f3c9766UL,
-- /* 194 */ 0xa57e7e265ce55ef0UL, 0x5d9f4e527cd4b967UL,
-- 0xfbc83606492fd1e5UL, 0x090d52beb7c3f7aeUL,
-- /* 195 */ 0x09b9515a1e7b4d7cUL, 0x1f266a2599da44c0UL,
-- 0xa1c49548e2c55504UL, 0x7ef04287126f15ccUL,
-- /* 196 */ 0xfed1659dbd30ef15UL, 0x8b4ab9eec4e0277bUL,
-- 0x884d6236a5df3291UL, 0x1fd96ea6bf5cf788UL,
-- /* 197 */ 0x42a161981f190d9aUL, 0x61d849507e6052c1UL,
-- 0x9fe113bf285a2cd5UL, 0x7c22d676dbad85d8UL,
-- /* 198 */ 0x82e770ed2bfbd27dUL, 0x4c05b2ece996f5a5UL,
-- 0xcd40a9c2b0900150UL, 0x5895319213d9bf64UL,
-- /* 199 */ 0xe7cc5d703fea2e08UL, 0xb50c491258e2188cUL,
-- 0xcce30baa48205bf0UL, 0x537c659ccfa32d62UL,
-- /* 200 */ 0x37b6623a98cfc088UL, 0xfe9bed1fa4d6aca4UL,
-- 0x04d29b8e56a8d1b0UL, 0x725f71c40b519575UL,
-- /* 201 */ 0x28c7f89cd0339ce6UL, 0x8367b14469ddc18bUL,
-- 0x883ada83a6a1652cUL, 0x585f1974034d6c17UL,
-- /* 202 */ 0x89cfb266f1b19188UL, 0xe63b4863e7c35217UL,
-- 0xd88c9da6b4c0526aUL, 0x3e035c9df0954635UL,
-- /* 203 */ 0xdd9d5412fb45de9dUL, 0xdd684532e4cff40dUL,
-- 0x4b5c999b151d671cUL, 0x2d8c2cc811e7f690UL,
-- /* 204 */ 0x7f54be1d90055d40UL, 0xa464c5df464aaf40UL,
-- 0x33979624f0e917beUL, 0x2c018dc527356b30UL,
-- /* 205 */ 0xa5415024e330b3d4UL, 0x73ff3d96691652d3UL,
-- 0x94ec42c4ef9b59f1UL, 0x0747201618d08e5aUL,
-- /* 206 */ 0x4d6ca48aca411c53UL, 0x66415f2fcfa66119UL,
-- 0x9c4dd40051e227ffUL, 0x59810bc09a02f7ebUL,
-- /* 207 */ 0x2a7eb171b3dc101dUL, 0x441c5ab99ffef68eUL,
-- 0x32025c9b93b359eaUL, 0x5e8ce0a71e9d112fUL,
-- /* 208 */ 0xbfcccb92429503fdUL, 0xd271ba752f095d55UL,
-- 0x345ead5e972d091eUL, 0x18c8df11a83103baUL,
-- /* 209 */ 0x90cd949a9aed0f4cUL, 0xc5d1f4cb6660e37eUL,
-- 0xb8cac52d56c52e0bUL, 0x6e42e400c5808e0dUL,
-- /* 210 */ 0xa3b46966eeaefd23UL, 0x0c4f1f0be39ecdcaUL,
-- 0x189dc8c9d683a51dUL, 0x51f27f054c09351bUL,
-- /* 211 */ 0x4c487ccd2a320682UL, 0x587ea95bb3df1c96UL,
-- 0xc8ccf79e555cb8e8UL, 0x547dc829a206d73dUL,
-- /* 212 */ 0xb822a6cd80c39b06UL, 0xe96d54732000d4c6UL,
-- 0x28535b6f91463b4dUL, 0x228f4660e2486e1dUL,
-- /* 213 */ 0x98799538de8d3abfUL, 0x8cd8330045ebca6eUL,
-- 0x79952a008221e738UL, 0x4322e1a7535cd2bbUL,
-- /* 214 */ 0xb114c11819d1801cUL, 0x2016e4d84f3f5ec7UL,
-- 0xdd0e2df409260f4cUL, 0x5ec362c0ae5f7266UL,
-- /* 215 */ 0xc0462b18b8b2b4eeUL, 0x7cc8d950274d1afbUL,
-- 0xf25f7105436b02d2UL, 0x43bbf8dcbff9ccd3UL,
-- /* 216 */ 0xb6ad1767a039e9dfUL, 0xb0714da8f69d3583UL,
-- 0x5e55fa18b42931f5UL, 0x4ed5558f33c60961UL,
-- /* 217 */ 0x1fe37901c647a5ddUL, 0x593ddf1f8081d357UL,
-- 0x0249a4fd813fd7a6UL, 0x69acca274e9caf61UL,
-- /* 218 */ 0x047ba3ea330721c9UL, 0x83423fc20e7e1ea0UL,
-- 0x1df4c0af01314a60UL, 0x09a62dab89289527UL,
-- /* 219 */ 0xa5b325a49cc6cb00UL, 0xe94b5dc654b56cb6UL,
-- 0x3be28779adc994a0UL, 0x4296e8f8ba3a4aadUL,
-- /* 220 */ 0x328689761e451eabUL, 0x2e4d598bff59594aUL,
-- 0x49b96853d7a7084aUL, 0x4980a319601420a8UL,
-- /* 221 */ 0x9565b9e12f552c42UL, 0x8a5318db7100fe96UL,
-- 0x05c90b4d43add0d7UL, 0x538b4cd66a5d4edaUL,
-- /* 222 */ 0xf4e94fc3e89f039fUL, 0x592c9af26f618045UL,
-- 0x08a36eb5fd4b9550UL, 0x25fffaf6c2ed1419UL,
-- /* 223 */ 0x34434459cc79d354UL, 0xeeecbfb4b1d5476bUL,
-- 0xddeb34a061615d99UL, 0x5129cecceb64b773UL,
-- /* 224 */ 0xee43215894993520UL, 0x772f9c7cf14c0b3bUL,
-- 0xd2e2fce306bedad5UL, 0x715f42b546f06a97UL,
-- /* 225 */ 0x434ecdceda5b5f1aUL, 0x0da17115a49741a9UL,
-- 0x680bd77c73edad2eUL, 0x487c02354edd9041UL,
-- /* 226 */ 0xb8efeff3a70ed9c4UL, 0x56a32aa3e857e302UL,
-- 0xdf3a68bd48a2a5a0UL, 0x07f650b73176c444UL,
-- /* 227 */ 0xe38b9b1626e0ccb1UL, 0x79e053c18b09fb36UL,
-- 0x56d90319c9f94964UL, 0x1ca941e7ac9ff5c4UL,
-- /* 228 */ 0x49c4df29162fa0bbUL, 0x8488cf3282b33305UL,
-- 0x95dfda14cabb437dUL, 0x3391f78264d5ad86UL,
-- /* 229 */ 0x729ae06ae2b5095dUL, 0xd58a58d73259a946UL,
-- 0xe9834262d13921edUL, 0x27fedafaa54bb592UL,
-- /* 230 */ 0xa99dc5b829ad48bbUL, 0x5f025742499ee260UL,
-- 0x802c8ecd5d7513fdUL, 0x78ceb3ef3f6dd938UL,
-- /* 231 */ 0xc342f44f8a135d94UL, 0x7b9edb44828cdda3UL,
-- 0x9436d11a0537cfe7UL, 0x5064b164ec1ab4c8UL,
-- /* 232 */ 0x7020eccfd37eb2fcUL, 0x1f31ea3ed90d25fcUL,
-- 0x1b930d7bdfa1bb34UL, 0x5344467a48113044UL,
-- /* 233 */ 0x70073170f25e6dfbUL, 0xe385dc1a50114cc8UL,
-- 0x2348698ac8fc4f00UL, 0x2a77a55284dd40d8UL,
-- /* 234 */ 0xfe06afe0c98c6ce4UL, 0xc235df96dddfd6e4UL,
-- 0x1428d01e33bf1ed3UL, 0x785768ec9300bdafUL,
-- /* 235 */ 0x9702e57a91deb63bUL, 0x61bdb8bfe5ce8b80UL,
-- 0x645b426f3d1d58acUL, 0x4804a82227a557bcUL,
-- /* 236 */ 0x8e57048ab44d2601UL, 0x68d6501a4b3a6935UL,
-- 0xc39c9ec3f9e1c293UL, 0x4172f257d4de63e2UL,
-- /* 237 */ 0xd368b450330c6401UL, 0x040d3017418f2391UL,
-- 0x2c34bb6090b7d90dUL, 0x16f649228fdfd51fUL,
-- /* 238 */ 0xbea6818e2b928ef5UL, 0xe28ccf91cdc11e72UL,
-- 0x594aaa68e77a36cdUL, 0x313034806c7ffd0fUL,
-- /* 239 */ 0x8a9d27ac2249bd65UL, 0x19a3b464018e9512UL,
-- 0xc26ccff352b37ec7UL, 0x056f68341d797b21UL,
-- /* 240 */ 0x5e79d6757efd2327UL, 0xfabdbcb6553afe15UL,
-- 0xd3e7222c6eaf5a60UL, 0x7046c76d4dae743bUL,
-- /* 241 */ 0x660be872b18d4a55UL, 0x19992518574e1496UL,
-- 0xc103053a302bdcbbUL, 0x3ed8e9800b218e8eUL,
-- /* 242 */ 0x7b0b9239fa75e03eUL, 0xefe9fb684633c083UL,
-- 0x98a35fbe391a7793UL, 0x6065510fe2d0fe34UL,
-- /* 243 */ 0x55cb668548abad0cUL, 0xb4584548da87e527UL,
-- 0x2c43ecea0107c1ddUL, 0x526028809372de35UL,
-- /* 244 */ 0x3415c56af9213b1fUL, 0x5bee1a4d017e98dbUL,
-- 0x13f6b105b5cf709bUL, 0x5ff20e3482b29ab6UL,
-- /* 245 */ 0x0aa29c75cc2e6c90UL, 0xfc7d73ca3a70e206UL,
-- 0x899fc38fc4b5c515UL, 0x250386b124ffc207UL,
-- /* 246 */ 0x54ea28d5ae3d2b56UL, 0x9913149dd6de60ceUL,
-- 0x16694fc58f06d6c1UL, 0x46b23975eb018fc7UL,
-- /* 247 */ 0x470a6a0fb4b7b4e2UL, 0x5d92475a8f7253deUL,
-- 0xabeee5b52fbd3adbUL, 0x7fa20801a0806968UL,
-- /* 248 */ 0x76f3faf19f7714d2UL, 0xb3e840c12f4660c3UL,
-- 0x0fb4cd8df212744eUL, 0x4b065a251d3a2dd2UL,
-- /* 249 */ 0x5cebde383d77cd4aUL, 0x6adf39df882c9cb1UL,
-- 0xa2dd242eb09af759UL, 0x3147c0e50e5f6422UL,
-- /* 250 */ 0x164ca5101d1350dbUL, 0xf8d13479c33fc962UL,
-- 0xe640ce4d13e5da08UL, 0x4bdee0c45061f8baUL,
-- /* 251 */ 0xd7c46dc1a4edb1c9UL, 0x5514d7b6437fd98aUL,
-- 0x58942f6bb2a1c00bUL, 0x2dffb2ab1d70710eUL,
-- /* 252 */ 0xccdfcf2fc18b6d68UL, 0xa8ebcba8b7806167UL,
-- 0x980697f95e2937e3UL, 0x02fbba1cd0126e8cUL
--};
--
--/* c is two 512-bit products: c0[0:7]=a0[0:3]*b0[0:3] and c1[8:15]=a1[4:7]*b1[4:7]
-- * a is two 256-bit integers: a0[0:3] and a1[4:7]
-- * b is two 256-bit integers: b0[0:3] and b1[4:7]
-- */
--static void mul2_256x256_integer_adx(u64 *const c, const u64 *const a,
-- const u64 *const b)
--{
-- asm volatile(
-- "xorl %%r14d, %%r14d ;"
-- "movq (%1), %%rdx; " /* A[0] */
-- "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-- "xorl %%r10d, %%r10d ;"
-- "movq %%r8, (%0) ;"
-- "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-- "adox %%r10, %%r15 ;"
-- "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-- "adox %%r8, %%rax ;"
-- "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-- "adox %%r10, %%rbx ;"
-- /******************************************/
-- "adox %%r14, %%rcx ;"
--
-- "movq 8(%1), %%rdx; " /* A[1] */
-- "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-- "adox %%r15, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rax ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%rbx ;"
-- "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%rcx ;"
-- /******************************************/
-- "adox %%r14, %%r15 ;"
-- "adcx %%r14, %%r15 ;"
--
-- "movq 16(%1), %%rdx; " /* A[2] */
-- "xorl %%r10d, %%r10d ;"
-- "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-- "adox %%rax, %%r8 ;"
-- "movq %%r8, 16(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rbx ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%rcx ;"
-- "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%r15 ;"
-- /******************************************/
-- "adox %%r14, %%rax ;"
-- "adcx %%r14, %%rax ;"
--
-- "movq 24(%1), %%rdx; " /* A[3] */
-- "xorl %%r10d, %%r10d ;"
-- "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-- "adox %%rbx, %%r8 ;"
-- "movq %%r8, 24(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rcx ;"
-- "movq %%rcx, 32(%0) ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%rax ;"
-- "movq %%rax, 48(%0) ;"
-- /******************************************/
-- "adox %%r14, %%rbx ;"
-- "adcx %%r14, %%rbx ;"
-- "movq %%rbx, 56(%0) ;"
--
-- "movq 32(%1), %%rdx; " /* C[0] */
-- "mulx 32(%2), %%r8, %%r15; " /* C[0]*D[0] */
-- "xorl %%r10d, %%r10d ;"
-- "movq %%r8, 64(%0);"
-- "mulx 40(%2), %%r10, %%rax; " /* C[0]*D[1] */
-- "adox %%r10, %%r15 ;"
-- "mulx 48(%2), %%r8, %%rbx; " /* C[0]*D[2] */
-- "adox %%r8, %%rax ;"
-- "mulx 56(%2), %%r10, %%rcx; " /* C[0]*D[3] */
-- "adox %%r10, %%rbx ;"
-- /******************************************/
-- "adox %%r14, %%rcx ;"
--
-- "movq 40(%1), %%rdx; " /* C[1] */
-- "xorl %%r10d, %%r10d ;"
-- "mulx 32(%2), %%r8, %%r9; " /* C[1]*D[0] */
-- "adox %%r15, %%r8 ;"
-- "movq %%r8, 72(%0);"
-- "mulx 40(%2), %%r10, %%r11; " /* C[1]*D[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rax ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[1]*D[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%rbx ;"
-- "mulx 56(%2), %%r10, %%r15; " /* C[1]*D[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%rcx ;"
-- /******************************************/
-- "adox %%r14, %%r15 ;"
-- "adcx %%r14, %%r15 ;"
--
-- "movq 48(%1), %%rdx; " /* C[2] */
-- "xorl %%r10d, %%r10d ;"
-- "mulx 32(%2), %%r8, %%r9; " /* C[2]*D[0] */
-- "adox %%rax, %%r8 ;"
-- "movq %%r8, 80(%0);"
-- "mulx 40(%2), %%r10, %%r11; " /* C[2]*D[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rbx ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[2]*D[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%rcx ;"
-- "mulx 56(%2), %%r10, %%rax; " /* C[2]*D[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%r15 ;"
-- /******************************************/
-- "adox %%r14, %%rax ;"
-- "adcx %%r14, %%rax ;"
--
-- "movq 56(%1), %%rdx; " /* C[3] */
-- "xorl %%r10d, %%r10d ;"
-- "mulx 32(%2), %%r8, %%r9; " /* C[3]*D[0] */
-- "adox %%rbx, %%r8 ;"
-- "movq %%r8, 88(%0);"
-- "mulx 40(%2), %%r10, %%r11; " /* C[3]*D[1] */
-- "adox %%r10, %%r9 ;"
-- "adcx %%r9, %%rcx ;"
-- "movq %%rcx, 96(%0) ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[3]*D[2] */
-- "adox %%r8, %%r11 ;"
-- "adcx %%r11, %%r15 ;"
-- "movq %%r15, 104(%0) ;"
-- "mulx 56(%2), %%r10, %%rbx; " /* C[3]*D[3] */
-- "adox %%r10, %%r13 ;"
-- "adcx %%r13, %%rax ;"
-- "movq %%rax, 112(%0) ;"
-- /******************************************/
-- "adox %%r14, %%rbx ;"
-- "adcx %%r14, %%rbx ;"
-- "movq %%rbx, 120(%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11", "%r13", "%r14", "%r15");
--}
--
--static void mul2_256x256_integer_bmi2(u64 *const c, const u64 *const a,
-- const u64 *const b)
-+static __always_inline u64 eq_mask(u64 a, u64 b)
- {
-- asm volatile(
-- "movq (%1), %%rdx; " /* A[0] */
-- "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-- "movq %%r8, (%0) ;"
-- "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-- "addq %%r10, %%r15 ;"
-- "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-- "adcq %%r8, %%rax ;"
-- "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-- "adcq %%r10, %%rbx ;"
-- /******************************************/
-- "adcq $0, %%rcx ;"
--
-- "movq 8(%1), %%rdx; " /* A[1] */
-- "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-- "addq %%r15, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%r15 ;"
--
-- "addq %%r9, %%rax ;"
-- "adcq %%r11, %%rbx ;"
-- "adcq %%r13, %%rcx ;"
-- "adcq $0, %%r15 ;"
--
-- "movq 16(%1), %%rdx; " /* A[2] */
-- "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-- "addq %%rax, %%r8 ;"
-- "movq %%r8, 16(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rax ;"
--
-- "addq %%r9, %%rbx ;"
-- "adcq %%r11, %%rcx ;"
-- "adcq %%r13, %%r15 ;"
-- "adcq $0, %%rax ;"
--
-- "movq 24(%1), %%rdx; " /* A[3] */
-- "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-- "addq %%rbx, %%r8 ;"
-- "movq %%r8, 24(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rbx ;"
--
-- "addq %%r9, %%rcx ;"
-- "movq %%rcx, 32(%0) ;"
-- "adcq %%r11, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "adcq %%r13, %%rax ;"
-- "movq %%rax, 48(%0) ;"
-- "adcq $0, %%rbx ;"
-- "movq %%rbx, 56(%0) ;"
--
-- "movq 32(%1), %%rdx; " /* C[0] */
-- "mulx 32(%2), %%r8, %%r15; " /* C[0]*D[0] */
-- "movq %%r8, 64(%0) ;"
-- "mulx 40(%2), %%r10, %%rax; " /* C[0]*D[1] */
-- "addq %%r10, %%r15 ;"
-- "mulx 48(%2), %%r8, %%rbx; " /* C[0]*D[2] */
-- "adcq %%r8, %%rax ;"
-- "mulx 56(%2), %%r10, %%rcx; " /* C[0]*D[3] */
-- "adcq %%r10, %%rbx ;"
-- /******************************************/
-- "adcq $0, %%rcx ;"
--
-- "movq 40(%1), %%rdx; " /* C[1] */
-- "mulx 32(%2), %%r8, %%r9; " /* C[1]*D[0] */
-- "addq %%r15, %%r8 ;"
-- "movq %%r8, 72(%0) ;"
-- "mulx 40(%2), %%r10, %%r11; " /* C[1]*D[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[1]*D[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 56(%2), %%r10, %%r15; " /* C[1]*D[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%r15 ;"
--
-- "addq %%r9, %%rax ;"
-- "adcq %%r11, %%rbx ;"
-- "adcq %%r13, %%rcx ;"
-- "adcq $0, %%r15 ;"
--
-- "movq 48(%1), %%rdx; " /* C[2] */
-- "mulx 32(%2), %%r8, %%r9; " /* C[2]*D[0] */
-- "addq %%rax, %%r8 ;"
-- "movq %%r8, 80(%0) ;"
-- "mulx 40(%2), %%r10, %%r11; " /* C[2]*D[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[2]*D[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 56(%2), %%r10, %%rax; " /* C[2]*D[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rax ;"
--
-- "addq %%r9, %%rbx ;"
-- "adcq %%r11, %%rcx ;"
-- "adcq %%r13, %%r15 ;"
-- "adcq $0, %%rax ;"
--
-- "movq 56(%1), %%rdx; " /* C[3] */
-- "mulx 32(%2), %%r8, %%r9; " /* C[3]*D[0] */
-- "addq %%rbx, %%r8 ;"
-- "movq %%r8, 88(%0) ;"
-- "mulx 40(%2), %%r10, %%r11; " /* C[3]*D[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 48(%2), %%r8, %%r13; " /* C[3]*D[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 56(%2), %%r10, %%rbx; " /* C[3]*D[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rbx ;"
--
-- "addq %%r9, %%rcx ;"
-- "movq %%rcx, 96(%0) ;"
-- "adcq %%r11, %%r15 ;"
-- "movq %%r15, 104(%0) ;"
-- "adcq %%r13, %%rax ;"
-- "movq %%rax, 112(%0) ;"
-- "adcq $0, %%rbx ;"
-- "movq %%rbx, 120(%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11", "%r13", "%r15");
-+ u64 x = a ^ b;
-+ u64 minus_x = ~x + (u64)1U;
-+ u64 x_or_minus_x = x | minus_x;
-+ u64 xnx = x_or_minus_x >> (u32)63U;
-+ return xnx - (u64)1U;
- }
-
--static void sqr2_256x256_integer_adx(u64 *const c, const u64 *const a)
-+static __always_inline u64 gte_mask(u64 a, u64 b)
- {
-- asm volatile(
-- "movq (%1), %%rdx ;" /* A[0] */
-- "mulx 8(%1), %%r8, %%r14 ;" /* A[1]*A[0] */
-- "xorl %%r15d, %%r15d;"
-- "mulx 16(%1), %%r9, %%r10 ;" /* A[2]*A[0] */
-- "adcx %%r14, %%r9 ;"
-- "mulx 24(%1), %%rax, %%rcx ;" /* A[3]*A[0] */
-- "adcx %%rax, %%r10 ;"
-- "movq 24(%1), %%rdx ;" /* A[3] */
-- "mulx 8(%1), %%r11, %%rbx ;" /* A[1]*A[3] */
-- "adcx %%rcx, %%r11 ;"
-- "mulx 16(%1), %%rax, %%r13 ;" /* A[2]*A[3] */
-- "adcx %%rax, %%rbx ;"
-- "movq 8(%1), %%rdx ;" /* A[1] */
-- "adcx %%r15, %%r13 ;"
-- "mulx 16(%1), %%rax, %%rcx ;" /* A[2]*A[1] */
-- "movq $0, %%r14 ;"
-- /******************************************/
-- "adcx %%r15, %%r14 ;"
--
-- "xorl %%r15d, %%r15d;"
-- "adox %%rax, %%r10 ;"
-- "adcx %%r8, %%r8 ;"
-- "adox %%rcx, %%r11 ;"
-- "adcx %%r9, %%r9 ;"
-- "adox %%r15, %%rbx ;"
-- "adcx %%r10, %%r10 ;"
-- "adox %%r15, %%r13 ;"
-- "adcx %%r11, %%r11 ;"
-- "adox %%r15, %%r14 ;"
-- "adcx %%rbx, %%rbx ;"
-- "adcx %%r13, %%r13 ;"
-- "adcx %%r14, %%r14 ;"
--
-- "movq (%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-- /*******************/
-- "movq %%rax, 0(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "movq 8(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 16(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 24(%0) ;"
-- "movq 16(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 32(%0) ;"
-- "adcq %%rcx, %%rbx ;"
-- "movq %%rbx, 40(%0) ;"
-- "movq 24(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 48(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 56(%0) ;"
--
--
-- "movq 32(%1), %%rdx ;" /* B[0] */
-- "mulx 40(%1), %%r8, %%r14 ;" /* B[1]*B[0] */
-- "xorl %%r15d, %%r15d;"
-- "mulx 48(%1), %%r9, %%r10 ;" /* B[2]*B[0] */
-- "adcx %%r14, %%r9 ;"
-- "mulx 56(%1), %%rax, %%rcx ;" /* B[3]*B[0] */
-- "adcx %%rax, %%r10 ;"
-- "movq 56(%1), %%rdx ;" /* B[3] */
-- "mulx 40(%1), %%r11, %%rbx ;" /* B[1]*B[3] */
-- "adcx %%rcx, %%r11 ;"
-- "mulx 48(%1), %%rax, %%r13 ;" /* B[2]*B[3] */
-- "adcx %%rax, %%rbx ;"
-- "movq 40(%1), %%rdx ;" /* B[1] */
-- "adcx %%r15, %%r13 ;"
-- "mulx 48(%1), %%rax, %%rcx ;" /* B[2]*B[1] */
-- "movq $0, %%r14 ;"
-- /******************************************/
-- "adcx %%r15, %%r14 ;"
--
-- "xorl %%r15d, %%r15d;"
-- "adox %%rax, %%r10 ;"
-- "adcx %%r8, %%r8 ;"
-- "adox %%rcx, %%r11 ;"
-- "adcx %%r9, %%r9 ;"
-- "adox %%r15, %%rbx ;"
-- "adcx %%r10, %%r10 ;"
-- "adox %%r15, %%r13 ;"
-- "adcx %%r11, %%r11 ;"
-- "adox %%r15, %%r14 ;"
-- "adcx %%rbx, %%rbx ;"
-- "adcx %%r13, %%r13 ;"
-- "adcx %%r14, %%r14 ;"
--
-- "movq 32(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* B[0]^2 */
-- /*******************/
-- "movq %%rax, 64(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 72(%0) ;"
-- "movq 40(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* B[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 80(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 88(%0) ;"
-- "movq 48(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* B[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 96(%0) ;"
-- "adcq %%rcx, %%rbx ;"
-- "movq %%rbx, 104(%0) ;"
-- "movq 56(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* B[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 112(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 120(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11", "%r13", "%r14", "%r15");
-+ u64 x = a;
-+ u64 y = b;
-+ u64 x_xor_y = x ^ y;
-+ u64 x_sub_y = x - y;
-+ u64 x_sub_y_xor_y = x_sub_y ^ y;
-+ u64 q = x_xor_y | x_sub_y_xor_y;
-+ u64 x_xor_q = x ^ q;
-+ u64 x_xor_q_ = x_xor_q >> (u32)63U;
-+ return x_xor_q_ - (u64)1U;
- }
-
--static void sqr2_256x256_integer_bmi2(u64 *const c, const u64 *const a)
-+/* Computes the addition of four-element f1 with value in f2
-+ * and returns the carry (if any) */
-+static inline u64 add_scalar(u64 *out, const u64 *f1, u64 f2)
- {
-- asm volatile(
-- "movq 8(%1), %%rdx ;" /* A[1] */
-- "mulx (%1), %%r8, %%r9 ;" /* A[0]*A[1] */
-- "mulx 16(%1), %%r10, %%r11 ;" /* A[2]*A[1] */
-- "mulx 24(%1), %%rcx, %%r14 ;" /* A[3]*A[1] */
--
-- "movq 16(%1), %%rdx ;" /* A[2] */
-- "mulx 24(%1), %%r15, %%r13 ;" /* A[3]*A[2] */
-- "mulx (%1), %%rax, %%rdx ;" /* A[0]*A[2] */
--
-- "addq %%rax, %%r9 ;"
-- "adcq %%rdx, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq %%r14, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "movq $0, %%r14 ;"
-- "adcq $0, %%r14 ;"
--
-- "movq (%1), %%rdx ;" /* A[0] */
-- "mulx 24(%1), %%rax, %%rcx ;" /* A[0]*A[3] */
--
-- "addq %%rax, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq $0, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "adcq $0, %%r14 ;"
--
-- "shldq $1, %%r13, %%r14 ;"
-- "shldq $1, %%r15, %%r13 ;"
-- "shldq $1, %%r11, %%r15 ;"
-- "shldq $1, %%r10, %%r11 ;"
-- "shldq $1, %%r9, %%r10 ;"
-- "shldq $1, %%r8, %%r9 ;"
-- "shlq $1, %%r8 ;"
--
-- /*******************/
-- "mulx %%rdx, %%rax, %%rcx ; " /* A[0]^2 */
-- /*******************/
-- "movq %%rax, 0(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "movq 8(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* A[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 16(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 24(%0) ;"
-- "movq 16(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* A[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 32(%0) ;"
-- "adcq %%rcx, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "movq 24(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* A[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 48(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 56(%0) ;"
--
-- "movq 40(%1), %%rdx ;" /* B[1] */
-- "mulx 32(%1), %%r8, %%r9 ;" /* B[0]*B[1] */
-- "mulx 48(%1), %%r10, %%r11 ;" /* B[2]*B[1] */
-- "mulx 56(%1), %%rcx, %%r14 ;" /* B[3]*B[1] */
--
-- "movq 48(%1), %%rdx ;" /* B[2] */
-- "mulx 56(%1), %%r15, %%r13 ;" /* B[3]*B[2] */
-- "mulx 32(%1), %%rax, %%rdx ;" /* B[0]*B[2] */
--
-- "addq %%rax, %%r9 ;"
-- "adcq %%rdx, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq %%r14, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "movq $0, %%r14 ;"
-- "adcq $0, %%r14 ;"
--
-- "movq 32(%1), %%rdx ;" /* B[0] */
-- "mulx 56(%1), %%rax, %%rcx ;" /* B[0]*B[3] */
--
-- "addq %%rax, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq $0, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "adcq $0, %%r14 ;"
--
-- "shldq $1, %%r13, %%r14 ;"
-- "shldq $1, %%r15, %%r13 ;"
-- "shldq $1, %%r11, %%r15 ;"
-- "shldq $1, %%r10, %%r11 ;"
-- "shldq $1, %%r9, %%r10 ;"
-- "shldq $1, %%r8, %%r9 ;"
-- "shlq $1, %%r8 ;"
--
-- /*******************/
-- "mulx %%rdx, %%rax, %%rcx ; " /* B[0]^2 */
-- /*******************/
-- "movq %%rax, 64(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 72(%0) ;"
-- "movq 40(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* B[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 80(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 88(%0) ;"
-- "movq 48(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* B[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 96(%0) ;"
-- "adcq %%rcx, %%r15 ;"
-- "movq %%r15, 104(%0) ;"
-- "movq 56(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ; " /* B[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 112(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 120(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-- "%r11", "%r13", "%r14", "%r15");
--}
-+ u64 carry_r;
-
--static void red_eltfp25519_2w_adx(u64 *const c, const u64 *const a)
--{
- asm volatile(
-- "movl $38, %%edx; " /* 2*c = 38 = 2^256 */
-- "mulx 32(%1), %%r8, %%r10; " /* c*C[4] */
-- "xorl %%ebx, %%ebx ;"
-- "adox (%1), %%r8 ;"
-- "mulx 40(%1), %%r9, %%r11; " /* c*C[5] */
-- "adcx %%r10, %%r9 ;"
-- "adox 8(%1), %%r9 ;"
-- "mulx 48(%1), %%r10, %%rax; " /* c*C[6] */
-- "adcx %%r11, %%r10 ;"
-- "adox 16(%1), %%r10 ;"
-- "mulx 56(%1), %%r11, %%rcx; " /* c*C[7] */
-- "adcx %%rax, %%r11 ;"
-- "adox 24(%1), %%r11 ;"
-- /***************************************/
-- "adcx %%rbx, %%rcx ;"
-- "adox %%rbx, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-- "adcx %%rcx, %%r8 ;"
-- "adcx %%rbx, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcx %%rbx, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcx %%rbx, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
--
-- "mulx 96(%1), %%r8, %%r10; " /* c*C[4] */
-- "xorl %%ebx, %%ebx ;"
-- "adox 64(%1), %%r8 ;"
-- "mulx 104(%1), %%r9, %%r11; " /* c*C[5] */
-- "adcx %%r10, %%r9 ;"
-- "adox 72(%1), %%r9 ;"
-- "mulx 112(%1), %%r10, %%rax; " /* c*C[6] */
-- "adcx %%r11, %%r10 ;"
-- "adox 80(%1), %%r10 ;"
-- "mulx 120(%1), %%r11, %%rcx; " /* c*C[7] */
-- "adcx %%rax, %%r11 ;"
-- "adox 88(%1), %%r11 ;"
-- /****************************************/
-- "adcx %%rbx, %%rcx ;"
-- "adox %%rbx, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-- "adcx %%rcx, %%r8 ;"
-- "adcx %%rbx, %%r9 ;"
-- "movq %%r9, 40(%0) ;"
-- "adcx %%rbx, %%r10 ;"
-- "movq %%r10, 48(%0) ;"
-- "adcx %%rbx, %%r11 ;"
-- "movq %%r11, 56(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 32(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11");
--}
-+ /* Clear registers to propagate the carry bit */
-+ " xor %%r8, %%r8;"
-+ " xor %%r9, %%r9;"
-+ " xor %%r10, %%r10;"
-+ " xor %%r11, %%r11;"
-+ " xor %1, %1;"
-+
-+ /* Begin addition chain */
-+ " addq 0(%3), %0;"
-+ " movq %0, 0(%2);"
-+ " adcxq 8(%3), %%r8;"
-+ " movq %%r8, 8(%2);"
-+ " adcxq 16(%3), %%r9;"
-+ " movq %%r9, 16(%2);"
-+ " adcxq 24(%3), %%r10;"
-+ " movq %%r10, 24(%2);"
-+
-+ /* Return the carry bit in a register */
-+ " adcx %%r11, %1;"
-+ : "+&r" (f2), "=&r" (carry_r)
-+ : "r" (out), "r" (f1)
-+ : "%r8", "%r9", "%r10", "%r11", "memory", "cc"
-+ );
-
--static void red_eltfp25519_2w_bmi2(u64 *const c, const u64 *const a)
--{
-- asm volatile(
-- "movl $38, %%edx ; " /* 2*c = 38 = 2^256 */
-- "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-- "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-- "addq %%r10, %%r9 ;"
-- "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-- "adcq %%r11, %%r10 ;"
-- "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-- "adcq %%rax, %%r11 ;"
-- /***************************************/
-- "adcq $0, %%rcx ;"
-- "addq (%1), %%r8 ;"
-- "adcq 8(%1), %%r9 ;"
-- "adcq 16(%1), %%r10 ;"
-- "adcq 24(%1), %%r11 ;"
-- "adcq $0, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-- "addq %%rcx, %%r8 ;"
-- "adcq $0, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcq $0, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcq $0, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
--
-- "mulx 96(%1), %%r8, %%r10 ;" /* c*C[4] */
-- "mulx 104(%1), %%r9, %%r11 ;" /* c*C[5] */
-- "addq %%r10, %%r9 ;"
-- "mulx 112(%1), %%r10, %%rax ;" /* c*C[6] */
-- "adcq %%r11, %%r10 ;"
-- "mulx 120(%1), %%r11, %%rcx ;" /* c*C[7] */
-- "adcq %%rax, %%r11 ;"
-- /****************************************/
-- "adcq $0, %%rcx ;"
-- "addq 64(%1), %%r8 ;"
-- "adcq 72(%1), %%r9 ;"
-- "adcq 80(%1), %%r10 ;"
-- "adcq 88(%1), %%r11 ;"
-- "adcq $0, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-- "addq %%rcx, %%r8 ;"
-- "adcq $0, %%r9 ;"
-- "movq %%r9, 40(%0) ;"
-- "adcq $0, %%r10 ;"
-- "movq %%r10, 48(%0) ;"
-- "adcq $0, %%r11 ;"
-- "movq %%r11, 56(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 32(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-- "%r11");
-+ return carry_r;
- }
-
--static void mul_256x256_integer_adx(u64 *const c, const u64 *const a,
-- const u64 *const b)
-+/* Computes the field addition of two field elements */
-+static inline void fadd(u64 *out, const u64 *f1, const u64 *f2)
- {
- asm volatile(
-- "movq (%1), %%rdx; " /* A[0] */
-- "mulx (%2), %%r8, %%r9; " /* A[0]*B[0] */
-- "xorl %%r10d, %%r10d ;"
-- "movq %%r8, (%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[0]*B[1] */
-- "adox %%r9, %%r10 ;"
-- "movq %%r10, 8(%0) ;"
-- "mulx 16(%2), %%r15, %%r13; " /* A[0]*B[2] */
-- "adox %%r11, %%r15 ;"
-- "mulx 24(%2), %%r14, %%rdx; " /* A[0]*B[3] */
-- "adox %%r13, %%r14 ;"
-- "movq $0, %%rax ;"
-- /******************************************/
-- "adox %%rdx, %%rax ;"
--
-- "movq 8(%1), %%rdx; " /* A[1] */
-- "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-- "xorl %%r10d, %%r10d ;"
-- "adcx 8(%0), %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-- "adox %%r9, %%r10 ;"
-- "adcx %%r15, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "mulx 16(%2), %%r15, %%r13; " /* A[1]*B[2] */
-- "adox %%r11, %%r15 ;"
-- "adcx %%r14, %%r15 ;"
-- "movq $0, %%r8 ;"
-- "mulx 24(%2), %%r14, %%rdx; " /* A[1]*B[3] */
-- "adox %%r13, %%r14 ;"
-- "adcx %%rax, %%r14 ;"
-- "movq $0, %%rax ;"
-- /******************************************/
-- "adox %%rdx, %%rax ;"
-- "adcx %%r8, %%rax ;"
--
-- "movq 16(%1), %%rdx; " /* A[2] */
-- "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-- "xorl %%r10d, %%r10d ;"
-- "adcx 16(%0), %%r8 ;"
-- "movq %%r8, 16(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-- "adox %%r9, %%r10 ;"
-- "adcx %%r15, %%r10 ;"
-- "movq %%r10, 24(%0) ;"
-- "mulx 16(%2), %%r15, %%r13; " /* A[2]*B[2] */
-- "adox %%r11, %%r15 ;"
-- "adcx %%r14, %%r15 ;"
-- "movq $0, %%r8 ;"
-- "mulx 24(%2), %%r14, %%rdx; " /* A[2]*B[3] */
-- "adox %%r13, %%r14 ;"
-- "adcx %%rax, %%r14 ;"
-- "movq $0, %%rax ;"
-- /******************************************/
-- "adox %%rdx, %%rax ;"
-- "adcx %%r8, %%rax ;"
--
-- "movq 24(%1), %%rdx; " /* A[3] */
-- "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-- "xorl %%r10d, %%r10d ;"
-- "adcx 24(%0), %%r8 ;"
-- "movq %%r8, 24(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-- "adox %%r9, %%r10 ;"
-- "adcx %%r15, %%r10 ;"
-- "movq %%r10, 32(%0) ;"
-- "mulx 16(%2), %%r15, %%r13; " /* A[3]*B[2] */
-- "adox %%r11, %%r15 ;"
-- "adcx %%r14, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "movq $0, %%r8 ;"
-- "mulx 24(%2), %%r14, %%rdx; " /* A[3]*B[3] */
-- "adox %%r13, %%r14 ;"
-- "adcx %%rax, %%r14 ;"
-- "movq %%r14, 48(%0) ;"
-- "movq $0, %%rax ;"
-- /******************************************/
-- "adox %%rdx, %%rax ;"
-- "adcx %%r8, %%rax ;"
-- "movq %%rax, 56(%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11",
-- "%r13", "%r14", "%r15");
-+ /* Compute the raw addition of f1 + f2 */
-+ " movq 0(%0), %%r8;"
-+ " addq 0(%2), %%r8;"
-+ " movq 8(%0), %%r9;"
-+ " adcxq 8(%2), %%r9;"
-+ " movq 16(%0), %%r10;"
-+ " adcxq 16(%2), %%r10;"
-+ " movq 24(%0), %%r11;"
-+ " adcxq 24(%2), %%r11;"
-+
-+ /* Wrap the result back into the field */
-+
-+ /* Step 1: Compute carry*38 */
-+ " mov $0, %%rax;"
-+ " mov $38, %0;"
-+ " cmovc %0, %%rax;"
-+
-+ /* Step 2: Add carry*38 to the original sum */
-+ " xor %%rcx, %%rcx;"
-+ " add %%rax, %%r8;"
-+ " adcx %%rcx, %%r9;"
-+ " movq %%r9, 8(%1);"
-+ " adcx %%rcx, %%r10;"
-+ " movq %%r10, 16(%1);"
-+ " adcx %%rcx, %%r11;"
-+ " movq %%r11, 24(%1);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %0, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%1);"
-+ : "+&r" (f2)
-+ : "r" (out), "r" (f1)
-+ : "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11", "memory", "cc"
-+ );
- }
-
--static void mul_256x256_integer_bmi2(u64 *const c, const u64 *const a,
-- const u64 *const b)
-+/* Computes the field substraction of two field elements */
-+static inline void fsub(u64 *out, const u64 *f1, const u64 *f2)
- {
- asm volatile(
-- "movq (%1), %%rdx; " /* A[0] */
-- "mulx (%2), %%r8, %%r15; " /* A[0]*B[0] */
-- "movq %%r8, (%0) ;"
-- "mulx 8(%2), %%r10, %%rax; " /* A[0]*B[1] */
-- "addq %%r10, %%r15 ;"
-- "mulx 16(%2), %%r8, %%rbx; " /* A[0]*B[2] */
-- "adcq %%r8, %%rax ;"
-- "mulx 24(%2), %%r10, %%rcx; " /* A[0]*B[3] */
-- "adcq %%r10, %%rbx ;"
-- /******************************************/
-- "adcq $0, %%rcx ;"
--
-- "movq 8(%1), %%rdx; " /* A[1] */
-- "mulx (%2), %%r8, %%r9; " /* A[1]*B[0] */
-- "addq %%r15, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[1]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[1]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%r15; " /* A[1]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%r15 ;"
--
-- "addq %%r9, %%rax ;"
-- "adcq %%r11, %%rbx ;"
-- "adcq %%r13, %%rcx ;"
-- "adcq $0, %%r15 ;"
--
-- "movq 16(%1), %%rdx; " /* A[2] */
-- "mulx (%2), %%r8, %%r9; " /* A[2]*B[0] */
-- "addq %%rax, %%r8 ;"
-- "movq %%r8, 16(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[2]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[2]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%rax; " /* A[2]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rax ;"
--
-- "addq %%r9, %%rbx ;"
-- "adcq %%r11, %%rcx ;"
-- "adcq %%r13, %%r15 ;"
-- "adcq $0, %%rax ;"
--
-- "movq 24(%1), %%rdx; " /* A[3] */
-- "mulx (%2), %%r8, %%r9; " /* A[3]*B[0] */
-- "addq %%rbx, %%r8 ;"
-- "movq %%r8, 24(%0) ;"
-- "mulx 8(%2), %%r10, %%r11; " /* A[3]*B[1] */
-- "adcq %%r10, %%r9 ;"
-- "mulx 16(%2), %%r8, %%r13; " /* A[3]*B[2] */
-- "adcq %%r8, %%r11 ;"
-- "mulx 24(%2), %%r10, %%rbx; " /* A[3]*B[3] */
-- "adcq %%r10, %%r13 ;"
-- /******************************************/
-- "adcq $0, %%rbx ;"
--
-- "addq %%r9, %%rcx ;"
-- "movq %%rcx, 32(%0) ;"
-- "adcq %%r11, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "adcq %%r13, %%rax ;"
-- "movq %%rax, 48(%0) ;"
-- "adcq $0, %%rbx ;"
-- "movq %%rbx, 56(%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11", "%r13", "%r15");
-+ /* Compute the raw substraction of f1-f2 */
-+ " movq 0(%1), %%r8;"
-+ " subq 0(%2), %%r8;"
-+ " movq 8(%1), %%r9;"
-+ " sbbq 8(%2), %%r9;"
-+ " movq 16(%1), %%r10;"
-+ " sbbq 16(%2), %%r10;"
-+ " movq 24(%1), %%r11;"
-+ " sbbq 24(%2), %%r11;"
-+
-+ /* Wrap the result back into the field */
-+
-+ /* Step 1: Compute carry*38 */
-+ " mov $0, %%rax;"
-+ " mov $38, %%rcx;"
-+ " cmovc %%rcx, %%rax;"
-+
-+ /* Step 2: Substract carry*38 from the original difference */
-+ " sub %%rax, %%r8;"
-+ " sbb $0, %%r9;"
-+ " sbb $0, %%r10;"
-+ " sbb $0, %%r11;"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rcx, %%rax;"
-+ " sub %%rax, %%r8;"
-+
-+ /* Store the result */
-+ " movq %%r8, 0(%0);"
-+ " movq %%r9, 8(%0);"
-+ " movq %%r10, 16(%0);"
-+ " movq %%r11, 24(%0);"
-+ :
-+ : "r" (out), "r" (f1), "r" (f2)
-+ : "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11", "memory", "cc"
-+ );
- }
-
--static void sqr_256x256_integer_adx(u64 *const c, const u64 *const a)
-+/* Computes a field multiplication: out <- f1 * f2
-+ * Uses the 8-element buffer tmp for intermediate results */
-+static inline void fmul(u64 *out, const u64 *f1, const u64 *f2, u64 *tmp)
- {
- asm volatile(
-- "movq (%1), %%rdx ;" /* A[0] */
-- "mulx 8(%1), %%r8, %%r14 ;" /* A[1]*A[0] */
-- "xorl %%r15d, %%r15d;"
-- "mulx 16(%1), %%r9, %%r10 ;" /* A[2]*A[0] */
-- "adcx %%r14, %%r9 ;"
-- "mulx 24(%1), %%rax, %%rcx ;" /* A[3]*A[0] */
-- "adcx %%rax, %%r10 ;"
-- "movq 24(%1), %%rdx ;" /* A[3] */
-- "mulx 8(%1), %%r11, %%rbx ;" /* A[1]*A[3] */
-- "adcx %%rcx, %%r11 ;"
-- "mulx 16(%1), %%rax, %%r13 ;" /* A[2]*A[3] */
-- "adcx %%rax, %%rbx ;"
-- "movq 8(%1), %%rdx ;" /* A[1] */
-- "adcx %%r15, %%r13 ;"
-- "mulx 16(%1), %%rax, %%rcx ;" /* A[2]*A[1] */
-- "movq $0, %%r14 ;"
-- /******************************************/
-- "adcx %%r15, %%r14 ;"
--
-- "xorl %%r15d, %%r15d;"
-- "adox %%rax, %%r10 ;"
-- "adcx %%r8, %%r8 ;"
-- "adox %%rcx, %%r11 ;"
-- "adcx %%r9, %%r9 ;"
-- "adox %%r15, %%rbx ;"
-- "adcx %%r10, %%r10 ;"
-- "adox %%r15, %%r13 ;"
-- "adcx %%r11, %%r11 ;"
-- "adox %%r15, %%r14 ;"
-- "adcx %%rbx, %%rbx ;"
-- "adcx %%r13, %%r13 ;"
-- "adcx %%r14, %%r14 ;"
--
-- "movq (%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-- /*******************/
-- "movq %%rax, 0(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "movq 8(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 16(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 24(%0) ;"
-- "movq 16(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 32(%0) ;"
-- "adcq %%rcx, %%rbx ;"
-- "movq %%rbx, 40(%0) ;"
-- "movq 24(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 48(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 56(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11", "%r13", "%r14", "%r15");
--}
-+ /* Compute the raw multiplication: tmp <- src1 * src2 */
-
--static void sqr_256x256_integer_bmi2(u64 *const c, const u64 *const a)
--{
-- asm volatile(
-- "movq 8(%1), %%rdx ;" /* A[1] */
-- "mulx (%1), %%r8, %%r9 ;" /* A[0]*A[1] */
-- "mulx 16(%1), %%r10, %%r11 ;" /* A[2]*A[1] */
-- "mulx 24(%1), %%rcx, %%r14 ;" /* A[3]*A[1] */
--
-- "movq 16(%1), %%rdx ;" /* A[2] */
-- "mulx 24(%1), %%r15, %%r13 ;" /* A[3]*A[2] */
-- "mulx (%1), %%rax, %%rdx ;" /* A[0]*A[2] */
--
-- "addq %%rax, %%r9 ;"
-- "adcq %%rdx, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq %%r14, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "movq $0, %%r14 ;"
-- "adcq $0, %%r14 ;"
--
-- "movq (%1), %%rdx ;" /* A[0] */
-- "mulx 24(%1), %%rax, %%rcx ;" /* A[0]*A[3] */
--
-- "addq %%rax, %%r10 ;"
-- "adcq %%rcx, %%r11 ;"
-- "adcq $0, %%r15 ;"
-- "adcq $0, %%r13 ;"
-- "adcq $0, %%r14 ;"
--
-- "shldq $1, %%r13, %%r14 ;"
-- "shldq $1, %%r15, %%r13 ;"
-- "shldq $1, %%r11, %%r15 ;"
-- "shldq $1, %%r10, %%r11 ;"
-- "shldq $1, %%r9, %%r10 ;"
-- "shldq $1, %%r8, %%r9 ;"
-- "shlq $1, %%r8 ;"
--
-- /*******************/
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[0]^2 */
-- /*******************/
-- "movq %%rax, 0(%0) ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, 8(%0) ;"
-- "movq 8(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[1]^2 */
-- "adcq %%rax, %%r9 ;"
-- "movq %%r9, 16(%0) ;"
-- "adcq %%rcx, %%r10 ;"
-- "movq %%r10, 24(%0) ;"
-- "movq 16(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[2]^2 */
-- "adcq %%rax, %%r11 ;"
-- "movq %%r11, 32(%0) ;"
-- "adcq %%rcx, %%r15 ;"
-- "movq %%r15, 40(%0) ;"
-- "movq 24(%1), %%rdx ;"
-- "mulx %%rdx, %%rax, %%rcx ;" /* A[3]^2 */
-- "adcq %%rax, %%r13 ;"
-- "movq %%r13, 48(%0) ;"
-- "adcq %%rcx, %%r14 ;"
-- "movq %%r14, 56(%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-- "%r11", "%r13", "%r14", "%r15");
-+ /* Compute src1[0] * src2 */
-+ " movq 0(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;"
-+ /* Compute src1[1] * src2 */
-+ " movq 8(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 16(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[2] * src2 */
-+ " movq 16(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 24(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[3] * src2 */
-+ " movq 24(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 32(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 40(%0);" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 56(%0);"
-+ /* Line up pointers */
-+ " mov %0, %1;"
-+ " mov %2, %0;"
-+
-+ /* Wrap the result back into the field */
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 32(%1), %%r8, %%r13;"
-+ " xor %3, %3;"
-+ " adoxq 0(%1), %%r8;"
-+ " mulxq 40(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 8(%1), %%r9;"
-+ " mulxq 48(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 16(%1), %%r10;"
-+ " mulxq 56(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 24(%1), %%r11;"
-+ " adcx %3, %%rax;"
-+ " adox %3, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %3, %%r9;"
-+ " movq %%r9, 8(%0);"
-+ " adcx %3, %%r10;"
-+ " movq %%r10, 16(%0);"
-+ " adcx %3, %%r11;"
-+ " movq %%r11, 24(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%0);"
-+ : "+&r" (tmp), "+&r" (f1), "+&r" (out), "+&r" (f2)
-+ :
-+ : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "memory", "cc"
-+ );
- }
-
--static void red_eltfp25519_1w_adx(u64 *const c, const u64 *const a)
-+/* Computes two field multiplications:
-+ * out[0] <- f1[0] * f2[0]
-+ * out[1] <- f1[1] * f2[1]
-+ * Uses the 16-element buffer tmp for intermediate results. */
-+static inline void fmul2(u64 *out, const u64 *f1, const u64 *f2, u64 *tmp)
- {
- asm volatile(
-- "movl $38, %%edx ;" /* 2*c = 38 = 2^256 */
-- "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-- "xorl %%ebx, %%ebx ;"
-- "adox (%1), %%r8 ;"
-- "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-- "adcx %%r10, %%r9 ;"
-- "adox 8(%1), %%r9 ;"
-- "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-- "adcx %%r11, %%r10 ;"
-- "adox 16(%1), %%r10 ;"
-- "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-- "adcx %%rax, %%r11 ;"
-- "adox 24(%1), %%r11 ;"
-- /***************************************/
-- "adcx %%rbx, %%rcx ;"
-- "adox %%rbx, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0, of=0 */
-- "adcx %%rcx, %%r8 ;"
-- "adcx %%rbx, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcx %%rbx, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcx %%rbx, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9",
-- "%r10", "%r11");
--}
-+ /* Compute the raw multiplication tmp[0] <- f1[0] * f2[0] */
-
--static void red_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a)
--{
-- asm volatile(
-- "movl $38, %%edx ;" /* 2*c = 38 = 2^256 */
-- "mulx 32(%1), %%r8, %%r10 ;" /* c*C[4] */
-- "mulx 40(%1), %%r9, %%r11 ;" /* c*C[5] */
-- "addq %%r10, %%r9 ;"
-- "mulx 48(%1), %%r10, %%rax ;" /* c*C[6] */
-- "adcq %%r11, %%r10 ;"
-- "mulx 56(%1), %%r11, %%rcx ;" /* c*C[7] */
-- "adcq %%rax, %%r11 ;"
-- /***************************************/
-- "adcq $0, %%rcx ;"
-- "addq (%1), %%r8 ;"
-- "adcq 8(%1), %%r9 ;"
-- "adcq 16(%1), %%r10 ;"
-- "adcq 24(%1), %%r11 ;"
-- "adcq $0, %%rcx ;"
-- "imul %%rdx, %%rcx ;" /* c*C[4], cf=0 */
-- "addq %%rcx, %%r8 ;"
-- "adcq $0, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcq $0, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcq $0, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a)
-- : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-- "%r11");
-+ /* Compute src1[0] * src2 */
-+ " movq 0(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;"
-+ /* Compute src1[1] * src2 */
-+ " movq 8(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 16(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[2] * src2 */
-+ " movq 16(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 24(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[3] * src2 */
-+ " movq 24(%1), %%rdx;"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 32(%0);"
-+ " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 40(%0);" " mov $0, %%r8;"
-+ " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 56(%0);"
-+
-+ /* Compute the raw multiplication tmp[1] <- f1[1] * f2[1] */
-+
-+ /* Compute src1[0] * src2 */
-+ " movq 32(%1), %%rdx;"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 64(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 72(%0);"
-+ " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;"
-+ /* Compute src1[1] * src2 */
-+ " movq 40(%1), %%rdx;"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 72(%0), %%r8;" " movq %%r8, 72(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 80(%0);"
-+ " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[2] * src2 */
-+ " movq 48(%1), %%rdx;"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 80(%0), %%r8;" " movq %%r8, 80(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 88(%0);"
-+ " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
-+ /* Compute src1[3] * src2 */
-+ " movq 56(%1), %%rdx;"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 88(%0), %%r8;" " movq %%r8, 88(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 96(%0);"
-+ " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 104(%0);" " mov $0, %%r8;"
-+ " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 112(%0);" " mov $0, %%rax;"
-+ " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 120(%0);"
-+ /* Line up pointers */
-+ " mov %0, %1;"
-+ " mov %2, %0;"
-+
-+ /* Wrap the results back into the field */
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 32(%1), %%r8, %%r13;"
-+ " xor %3, %3;"
-+ " adoxq 0(%1), %%r8;"
-+ " mulxq 40(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 8(%1), %%r9;"
-+ " mulxq 48(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 16(%1), %%r10;"
-+ " mulxq 56(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 24(%1), %%r11;"
-+ " adcx %3, %%rax;"
-+ " adox %3, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %3, %%r9;"
-+ " movq %%r9, 8(%0);"
-+ " adcx %3, %%r10;"
-+ " movq %%r10, 16(%0);"
-+ " adcx %3, %%r11;"
-+ " movq %%r11, 24(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%0);"
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 96(%1), %%r8, %%r13;"
-+ " xor %3, %3;"
-+ " adoxq 64(%1), %%r8;"
-+ " mulxq 104(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 72(%1), %%r9;"
-+ " mulxq 112(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 80(%1), %%r10;"
-+ " mulxq 120(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 88(%1), %%r11;"
-+ " adcx %3, %%rax;"
-+ " adox %3, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %3, %%r9;"
-+ " movq %%r9, 40(%0);"
-+ " adcx %3, %%r10;"
-+ " movq %%r10, 48(%0);"
-+ " adcx %3, %%r11;"
-+ " movq %%r11, 56(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 32(%0);"
-+ : "+&r" (tmp), "+&r" (f1), "+&r" (out), "+&r" (f2)
-+ :
-+ : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "memory", "cc"
-+ );
- }
-
--static __always_inline void
--add_eltfp25519_1w_adx(u64 *const c, const u64 *const a, const u64 *const b)
-+/* Computes the field multiplication of four-element f1 with value in f2 */
-+static inline void fmul_scalar(u64 *out, const u64 *f1, u64 f2)
- {
-- asm volatile(
-- "mov $38, %%eax ;"
-- "xorl %%ecx, %%ecx ;"
-- "movq (%2), %%r8 ;"
-- "adcx (%1), %%r8 ;"
-- "movq 8(%2), %%r9 ;"
-- "adcx 8(%1), %%r9 ;"
-- "movq 16(%2), %%r10 ;"
-- "adcx 16(%1), %%r10 ;"
-- "movq 24(%2), %%r11 ;"
-- "adcx 24(%1), %%r11 ;"
-- "cmovc %%eax, %%ecx ;"
-- "xorl %%eax, %%eax ;"
-- "adcx %%rcx, %%r8 ;"
-- "adcx %%rax, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcx %%rax, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcx %%rax, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $38, %%ecx ;"
-- "cmovc %%ecx, %%eax ;"
-- "addq %%rax, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
--}
-+ register u64 f2_r asm("rdx") = f2;
-
--static __always_inline void
--add_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a, const u64 *const b)
--{
- asm volatile(
-- "mov $38, %%eax ;"
-- "movq (%2), %%r8 ;"
-- "addq (%1), %%r8 ;"
-- "movq 8(%2), %%r9 ;"
-- "adcq 8(%1), %%r9 ;"
-- "movq 16(%2), %%r10 ;"
-- "adcq 16(%1), %%r10 ;"
-- "movq 24(%2), %%r11 ;"
-- "adcq 24(%1), %%r11 ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%eax, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "adcq $0, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcq $0, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcq $0, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%eax, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
-+ /* Compute the raw multiplication of f1*f2 */
-+ " mulxq 0(%2), %%r8, %%rcx;" /* f1[0]*f2 */
-+ " mulxq 8(%2), %%r9, %%r12;" /* f1[1]*f2 */
-+ " add %%rcx, %%r9;"
-+ " mov $0, %%rcx;"
-+ " mulxq 16(%2), %%r10, %%r13;" /* f1[2]*f2 */
-+ " adcx %%r12, %%r10;"
-+ " mulxq 24(%2), %%r11, %%rax;" /* f1[3]*f2 */
-+ " adcx %%r13, %%r11;"
-+ " adcx %%rcx, %%rax;"
-+
-+ /* Wrap the result back into the field */
-+
-+ /* Step 1: Compute carry*38 */
-+ " mov $38, %%rdx;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %%rcx, %%r9;"
-+ " movq %%r9, 8(%1);"
-+ " adcx %%rcx, %%r10;"
-+ " movq %%r10, 16(%1);"
-+ " adcx %%rcx, %%r11;"
-+ " movq %%r11, 24(%1);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%1);"
-+ : "+&r" (f2_r)
-+ : "r" (out), "r" (f1)
-+ : "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "memory", "cc"
-+ );
- }
-
--static __always_inline void
--sub_eltfp25519_1w(u64 *const c, const u64 *const a, const u64 *const b)
--{
-- asm volatile(
-- "mov $38, %%eax ;"
-- "movq (%1), %%r8 ;"
-- "subq (%2), %%r8 ;"
-- "movq 8(%1), %%r9 ;"
-- "sbbq 8(%2), %%r9 ;"
-- "movq 16(%1), %%r10 ;"
-- "sbbq 16(%2), %%r10 ;"
-- "movq 24(%1), %%r11 ;"
-- "sbbq 24(%2), %%r11 ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%eax, %%ecx ;"
-- "subq %%rcx, %%r8 ;"
-- "sbbq $0, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "sbbq $0, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "sbbq $0, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%eax, %%ecx ;"
-- "subq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(b)
-- : "memory", "cc", "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11");
--}
--
--/* Multiplication by a24 = (A+2)/4 = (486662+2)/4 = 121666 */
--static __always_inline void
--mul_a24_eltfp25519_1w(u64 *const c, const u64 *const a)
-+/* Computes p1 <- bit ? p2 : p1 in constant time */
-+static inline void cswap2(u64 bit, const u64 *p1, const u64 *p2)
- {
-- const u64 a24 = 121666;
- asm volatile(
-- "movq %2, %%rdx ;"
-- "mulx (%1), %%r8, %%r10 ;"
-- "mulx 8(%1), %%r9, %%r11 ;"
-- "addq %%r10, %%r9 ;"
-- "mulx 16(%1), %%r10, %%rax ;"
-- "adcq %%r11, %%r10 ;"
-- "mulx 24(%1), %%r11, %%rcx ;"
-- "adcq %%rax, %%r11 ;"
-- /**************************/
-- "adcq $0, %%rcx ;"
-- "movl $38, %%edx ;" /* 2*c = 38 = 2^256 mod 2^255-19*/
-- "imul %%rdx, %%rcx ;"
-- "addq %%rcx, %%r8 ;"
-- "adcq $0, %%r9 ;"
-- "movq %%r9, 8(%0) ;"
-- "adcq $0, %%r10 ;"
-- "movq %%r10, 16(%0) ;"
-- "adcq $0, %%r11 ;"
-- "movq %%r11, 24(%0) ;"
-- "mov $0, %%ecx ;"
-- "cmovc %%edx, %%ecx ;"
-- "addq %%rcx, %%r8 ;"
-- "movq %%r8, (%0) ;"
-- :
-- : "r"(c), "r"(a), "r"(a24)
-- : "memory", "cc", "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10",
-- "%r11");
--}
--
--static void inv_eltfp25519_1w_adx(u64 *const c, const u64 *const a)
--{
-- struct {
-- eltfp25519_1w_buffer buffer;
-- eltfp25519_1w x0, x1, x2;
-- } __aligned(32) m;
-- u64 *T[4];
--
-- T[0] = m.x0;
-- T[1] = c; /* x^(-1) */
-- T[2] = m.x1;
-- T[3] = m.x2;
--
-- copy_eltfp25519_1w(T[1], a);
-- sqrn_eltfp25519_1w_adx(T[1], 1);
-- copy_eltfp25519_1w(T[2], T[1]);
-- sqrn_eltfp25519_1w_adx(T[2], 2);
-- mul_eltfp25519_1w_adx(T[0], a, T[2]);
-- mul_eltfp25519_1w_adx(T[1], T[1], T[0]);
-- copy_eltfp25519_1w(T[2], T[1]);
-- sqrn_eltfp25519_1w_adx(T[2], 1);
-- mul_eltfp25519_1w_adx(T[0], T[0], T[2]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_adx(T[2], 5);
-- mul_eltfp25519_1w_adx(T[0], T[0], T[2]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_adx(T[2], 10);
-- mul_eltfp25519_1w_adx(T[2], T[2], T[0]);
-- copy_eltfp25519_1w(T[3], T[2]);
-- sqrn_eltfp25519_1w_adx(T[3], 20);
-- mul_eltfp25519_1w_adx(T[3], T[3], T[2]);
-- sqrn_eltfp25519_1w_adx(T[3], 10);
-- mul_eltfp25519_1w_adx(T[3], T[3], T[0]);
-- copy_eltfp25519_1w(T[0], T[3]);
-- sqrn_eltfp25519_1w_adx(T[0], 50);
-- mul_eltfp25519_1w_adx(T[0], T[0], T[3]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_adx(T[2], 100);
-- mul_eltfp25519_1w_adx(T[2], T[2], T[0]);
-- sqrn_eltfp25519_1w_adx(T[2], 50);
-- mul_eltfp25519_1w_adx(T[2], T[2], T[3]);
-- sqrn_eltfp25519_1w_adx(T[2], 5);
-- mul_eltfp25519_1w_adx(T[1], T[1], T[2]);
--
-- memzero_explicit(&m, sizeof(m));
--}
--
--static void inv_eltfp25519_1w_bmi2(u64 *const c, const u64 *const a)
--{
-- struct {
-- eltfp25519_1w_buffer buffer;
-- eltfp25519_1w x0, x1, x2;
-- } __aligned(32) m;
-- u64 *T[5];
--
-- T[0] = m.x0;
-- T[1] = c; /* x^(-1) */
-- T[2] = m.x1;
-- T[3] = m.x2;
--
-- copy_eltfp25519_1w(T[1], a);
-- sqrn_eltfp25519_1w_bmi2(T[1], 1);
-- copy_eltfp25519_1w(T[2], T[1]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 2);
-- mul_eltfp25519_1w_bmi2(T[0], a, T[2]);
-- mul_eltfp25519_1w_bmi2(T[1], T[1], T[0]);
-- copy_eltfp25519_1w(T[2], T[1]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 1);
-- mul_eltfp25519_1w_bmi2(T[0], T[0], T[2]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 5);
-- mul_eltfp25519_1w_bmi2(T[0], T[0], T[2]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 10);
-- mul_eltfp25519_1w_bmi2(T[2], T[2], T[0]);
-- copy_eltfp25519_1w(T[3], T[2]);
-- sqrn_eltfp25519_1w_bmi2(T[3], 20);
-- mul_eltfp25519_1w_bmi2(T[3], T[3], T[2]);
-- sqrn_eltfp25519_1w_bmi2(T[3], 10);
-- mul_eltfp25519_1w_bmi2(T[3], T[3], T[0]);
-- copy_eltfp25519_1w(T[0], T[3]);
-- sqrn_eltfp25519_1w_bmi2(T[0], 50);
-- mul_eltfp25519_1w_bmi2(T[0], T[0], T[3]);
-- copy_eltfp25519_1w(T[2], T[0]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 100);
-- mul_eltfp25519_1w_bmi2(T[2], T[2], T[0]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 50);
-- mul_eltfp25519_1w_bmi2(T[2], T[2], T[3]);
-- sqrn_eltfp25519_1w_bmi2(T[2], 5);
-- mul_eltfp25519_1w_bmi2(T[1], T[1], T[2]);
-+ /* Invert the polarity of bit to match cmov expectations */
-+ " add $18446744073709551615, %0;"
-
-- memzero_explicit(&m, sizeof(m));
-+ /* cswap p1[0], p2[0] */
-+ " movq 0(%1), %%r8;"
-+ " movq 0(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 0(%1);"
-+ " movq %%r9, 0(%2);"
-+
-+ /* cswap p1[1], p2[1] */
-+ " movq 8(%1), %%r8;"
-+ " movq 8(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 8(%1);"
-+ " movq %%r9, 8(%2);"
-+
-+ /* cswap p1[2], p2[2] */
-+ " movq 16(%1), %%r8;"
-+ " movq 16(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 16(%1);"
-+ " movq %%r9, 16(%2);"
-+
-+ /* cswap p1[3], p2[3] */
-+ " movq 24(%1), %%r8;"
-+ " movq 24(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 24(%1);"
-+ " movq %%r9, 24(%2);"
-+
-+ /* cswap p1[4], p2[4] */
-+ " movq 32(%1), %%r8;"
-+ " movq 32(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 32(%1);"
-+ " movq %%r9, 32(%2);"
-+
-+ /* cswap p1[5], p2[5] */
-+ " movq 40(%1), %%r8;"
-+ " movq 40(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 40(%1);"
-+ " movq %%r9, 40(%2);"
-+
-+ /* cswap p1[6], p2[6] */
-+ " movq 48(%1), %%r8;"
-+ " movq 48(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 48(%1);"
-+ " movq %%r9, 48(%2);"
-+
-+ /* cswap p1[7], p2[7] */
-+ " movq 56(%1), %%r8;"
-+ " movq 56(%2), %%r9;"
-+ " mov %%r8, %%r10;"
-+ " cmovc %%r9, %%r8;"
-+ " cmovc %%r10, %%r9;"
-+ " movq %%r8, 56(%1);"
-+ " movq %%r9, 56(%2);"
-+ : "+&r" (bit)
-+ : "r" (p1), "r" (p2)
-+ : "%r8", "%r9", "%r10", "memory", "cc"
-+ );
- }
-
--/* Given c, a 256-bit number, fred_eltfp25519_1w updates c
-- * with a number such that 0 <= C < 2**255-19.
-- */
--static __always_inline void fred_eltfp25519_1w(u64 *const c)
-+/* Computes the square of a field element: out <- f * f
-+ * Uses the 8-element buffer tmp for intermediate results */
-+static inline void fsqr(u64 *out, const u64 *f, u64 *tmp)
- {
-- u64 tmp0 = 38, tmp1 = 19;
- asm volatile(
-- "btrq $63, %3 ;" /* Put bit 255 in carry flag and clear */
-- "cmovncl %k5, %k4 ;" /* c[255] ? 38 : 19 */
--
-- /* Add either 19 or 38 to c */
-- "addq %4, %0 ;"
-- "adcq $0, %1 ;"
-- "adcq $0, %2 ;"
-- "adcq $0, %3 ;"
--
-- /* Test for bit 255 again; only triggered on overflow modulo 2^255-19 */
-- "movl $0, %k4 ;"
-- "cmovnsl %k5, %k4 ;" /* c[255] ? 0 : 19 */
-- "btrq $63, %3 ;" /* Clear bit 255 */
--
-- /* Subtract 19 if necessary */
-- "subq %4, %0 ;"
-- "sbbq $0, %1 ;"
-- "sbbq $0, %2 ;"
-- "sbbq $0, %3 ;"
--
-- : "+r"(c[0]), "+r"(c[1]), "+r"(c[2]), "+r"(c[3]), "+r"(tmp0),
-- "+r"(tmp1)
-- :
-- : "memory", "cc");
--}
-+ /* Compute the raw multiplication: tmp <- f * f */
-
--static __always_inline void cswap(u8 bit, u64 *const px, u64 *const py)
--{
-- u64 temp;
-- asm volatile(
-- "test %9, %9 ;"
-- "movq %0, %8 ;"
-- "cmovnzq %4, %0 ;"
-- "cmovnzq %8, %4 ;"
-- "movq %1, %8 ;"
-- "cmovnzq %5, %1 ;"
-- "cmovnzq %8, %5 ;"
-- "movq %2, %8 ;"
-- "cmovnzq %6, %2 ;"
-- "cmovnzq %8, %6 ;"
-- "movq %3, %8 ;"
-- "cmovnzq %7, %3 ;"
-- "cmovnzq %8, %7 ;"
-- : "+r"(px[0]), "+r"(px[1]), "+r"(px[2]), "+r"(px[3]),
-- "+r"(py[0]), "+r"(py[1]), "+r"(py[2]), "+r"(py[3]),
-- "=r"(temp)
-- : "r"(bit)
-- : "cc"
-+ /* Step 1: Compute all partial products */
-+ " movq 0(%1), %%rdx;" /* f[0] */
-+ " mulxq 8(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
-+ " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
-+ " movq 24(%1), %%rdx;" /* f[3] */
-+ " mulxq 8(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " movq 8(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
-+ " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-+
-+ /* Step 2: Compute two parallel carry chains */
-+ " xor %%r15, %%r15;"
-+ " adox %%rax, %%r10;"
-+ " adcx %%r8, %%r8;"
-+ " adox %%rcx, %%r11;"
-+ " adcx %%r9, %%r9;"
-+ " adox %%r15, %%r12;"
-+ " adcx %%r10, %%r10;"
-+ " adox %%r15, %%r13;"
-+ " adcx %%r11, %%r11;"
-+ " adox %%r15, %%r14;"
-+ " adcx %%r12, %%r12;"
-+ " adcx %%r13, %%r13;"
-+ " adcx %%r14, %%r14;"
-+
-+ /* Step 3: Compute intermediate squares */
-+ " movq 0(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[0]^2 */
-+ " movq %%rax, 0(%0);"
-+ " add %%rcx, %%r8;" " movq %%r8, 8(%0);"
-+ " movq 8(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[1]^2 */
-+ " adcx %%rax, %%r9;" " movq %%r9, 16(%0);"
-+ " adcx %%rcx, %%r10;" " movq %%r10, 24(%0);"
-+ " movq 16(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
-+ " adcx %%rax, %%r11;" " movq %%r11, 32(%0);"
-+ " adcx %%rcx, %%r12;" " movq %%r12, 40(%0);"
-+ " movq 24(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
-+ " adcx %%rax, %%r13;" " movq %%r13, 48(%0);"
-+ " adcx %%rcx, %%r14;" " movq %%r14, 56(%0);"
-+
-+ /* Line up pointers */
-+ " mov %0, %1;"
-+ " mov %2, %0;"
-+
-+ /* Wrap the result back into the field */
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 32(%1), %%r8, %%r13;"
-+ " xor %%rcx, %%rcx;"
-+ " adoxq 0(%1), %%r8;"
-+ " mulxq 40(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 8(%1), %%r9;"
-+ " mulxq 48(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 16(%1), %%r10;"
-+ " mulxq 56(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 24(%1), %%r11;"
-+ " adcx %%rcx, %%rax;"
-+ " adox %%rcx, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %%rcx, %%r9;"
-+ " movq %%r9, 8(%0);"
-+ " adcx %%rcx, %%r10;"
-+ " movq %%r10, 16(%0);"
-+ " adcx %%rcx, %%r11;"
-+ " movq %%r11, 24(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%0);"
-+ : "+&r" (tmp), "+&r" (f), "+&r" (out)
-+ :
-+ : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "memory", "cc"
- );
- }
-
--static __always_inline void cselect(u8 bit, u64 *const px, const u64 *const py)
-+/* Computes two field squarings:
-+ * out[0] <- f[0] * f[0]
-+ * out[1] <- f[1] * f[1]
-+ * Uses the 16-element buffer tmp for intermediate results */
-+static inline void fsqr2(u64 *out, const u64 *f, u64 *tmp)
- {
- asm volatile(
-- "test %4, %4 ;"
-- "cmovnzq %5, %0 ;"
-- "cmovnzq %6, %1 ;"
-- "cmovnzq %7, %2 ;"
-- "cmovnzq %8, %3 ;"
-- : "+r"(px[0]), "+r"(px[1]), "+r"(px[2]), "+r"(px[3])
-- : "r"(bit), "rm"(py[0]), "rm"(py[1]), "rm"(py[2]), "rm"(py[3])
-- : "cc"
-+ /* Step 1: Compute all partial products */
-+ " movq 0(%1), %%rdx;" /* f[0] */
-+ " mulxq 8(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
-+ " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
-+ " movq 24(%1), %%rdx;" /* f[3] */
-+ " mulxq 8(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " movq 8(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
-+ " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-+
-+ /* Step 2: Compute two parallel carry chains */
-+ " xor %%r15, %%r15;"
-+ " adox %%rax, %%r10;"
-+ " adcx %%r8, %%r8;"
-+ " adox %%rcx, %%r11;"
-+ " adcx %%r9, %%r9;"
-+ " adox %%r15, %%r12;"
-+ " adcx %%r10, %%r10;"
-+ " adox %%r15, %%r13;"
-+ " adcx %%r11, %%r11;"
-+ " adox %%r15, %%r14;"
-+ " adcx %%r12, %%r12;"
-+ " adcx %%r13, %%r13;"
-+ " adcx %%r14, %%r14;"
-+
-+ /* Step 3: Compute intermediate squares */
-+ " movq 0(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[0]^2 */
-+ " movq %%rax, 0(%0);"
-+ " add %%rcx, %%r8;" " movq %%r8, 8(%0);"
-+ " movq 8(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[1]^2 */
-+ " adcx %%rax, %%r9;" " movq %%r9, 16(%0);"
-+ " adcx %%rcx, %%r10;" " movq %%r10, 24(%0);"
-+ " movq 16(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
-+ " adcx %%rax, %%r11;" " movq %%r11, 32(%0);"
-+ " adcx %%rcx, %%r12;" " movq %%r12, 40(%0);"
-+ " movq 24(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
-+ " adcx %%rax, %%r13;" " movq %%r13, 48(%0);"
-+ " adcx %%rcx, %%r14;" " movq %%r14, 56(%0);"
-+
-+ /* Step 1: Compute all partial products */
-+ " movq 32(%1), %%rdx;" /* f[0] */
-+ " mulxq 40(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 48(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
-+ " mulxq 56(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
-+ " movq 56(%1), %%rdx;" /* f[3] */
-+ " mulxq 40(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 48(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " movq 40(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
-+ " mulxq 48(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-+
-+ /* Step 2: Compute two parallel carry chains */
-+ " xor %%r15, %%r15;"
-+ " adox %%rax, %%r10;"
-+ " adcx %%r8, %%r8;"
-+ " adox %%rcx, %%r11;"
-+ " adcx %%r9, %%r9;"
-+ " adox %%r15, %%r12;"
-+ " adcx %%r10, %%r10;"
-+ " adox %%r15, %%r13;"
-+ " adcx %%r11, %%r11;"
-+ " adox %%r15, %%r14;"
-+ " adcx %%r12, %%r12;"
-+ " adcx %%r13, %%r13;"
-+ " adcx %%r14, %%r14;"
-+
-+ /* Step 3: Compute intermediate squares */
-+ " movq 32(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[0]^2 */
-+ " movq %%rax, 64(%0);"
-+ " add %%rcx, %%r8;" " movq %%r8, 72(%0);"
-+ " movq 40(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[1]^2 */
-+ " adcx %%rax, %%r9;" " movq %%r9, 80(%0);"
-+ " adcx %%rcx, %%r10;" " movq %%r10, 88(%0);"
-+ " movq 48(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
-+ " adcx %%rax, %%r11;" " movq %%r11, 96(%0);"
-+ " adcx %%rcx, %%r12;" " movq %%r12, 104(%0);"
-+ " movq 56(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
-+ " adcx %%rax, %%r13;" " movq %%r13, 112(%0);"
-+ " adcx %%rcx, %%r14;" " movq %%r14, 120(%0);"
-+
-+ /* Line up pointers */
-+ " mov %0, %1;"
-+ " mov %2, %0;"
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 32(%1), %%r8, %%r13;"
-+ " xor %%rcx, %%rcx;"
-+ " adoxq 0(%1), %%r8;"
-+ " mulxq 40(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 8(%1), %%r9;"
-+ " mulxq 48(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 16(%1), %%r10;"
-+ " mulxq 56(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 24(%1), %%r11;"
-+ " adcx %%rcx, %%rax;"
-+ " adox %%rcx, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %%rcx, %%r9;"
-+ " movq %%r9, 8(%0);"
-+ " adcx %%rcx, %%r10;"
-+ " movq %%r10, 16(%0);"
-+ " adcx %%rcx, %%r11;"
-+ " movq %%r11, 24(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 0(%0);"
-+
-+ /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
-+ " mov $38, %%rdx;"
-+ " mulxq 96(%1), %%r8, %%r13;"
-+ " xor %%rcx, %%rcx;"
-+ " adoxq 64(%1), %%r8;"
-+ " mulxq 104(%1), %%r9, %%r12;"
-+ " adcx %%r13, %%r9;"
-+ " adoxq 72(%1), %%r9;"
-+ " mulxq 112(%1), %%r10, %%r13;"
-+ " adcx %%r12, %%r10;"
-+ " adoxq 80(%1), %%r10;"
-+ " mulxq 120(%1), %%r11, %%rax;"
-+ " adcx %%r13, %%r11;"
-+ " adoxq 88(%1), %%r11;"
-+ " adcx %%rcx, %%rax;"
-+ " adox %%rcx, %%rax;"
-+ " imul %%rdx, %%rax;"
-+
-+ /* Step 2: Fold the carry back into dst */
-+ " add %%rax, %%r8;"
-+ " adcx %%rcx, %%r9;"
-+ " movq %%r9, 40(%0);"
-+ " adcx %%rcx, %%r10;"
-+ " movq %%r10, 48(%0);"
-+ " adcx %%rcx, %%r11;"
-+ " movq %%r11, 56(%0);"
-+
-+ /* Step 3: Fold the carry bit back in; guaranteed not to carry at this point */
-+ " mov $0, %%rax;"
-+ " cmovc %%rdx, %%rax;"
-+ " add %%rax, %%r8;"
-+ " movq %%r8, 32(%0);"
-+ : "+&r" (tmp), "+&r" (f), "+&r" (out)
-+ :
-+ : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "memory", "cc"
- );
- }
-
--static void curve25519_adx(u8 shared[CURVE25519_KEY_SIZE],
-- const u8 private_key[CURVE25519_KEY_SIZE],
-- const u8 session_key[CURVE25519_KEY_SIZE])
--{
-- struct {
-- u64 buffer[4 * NUM_WORDS_ELTFP25519];
-- u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-- u64 workspace[6 * NUM_WORDS_ELTFP25519];
-- u8 session[CURVE25519_KEY_SIZE];
-- u8 private[CURVE25519_KEY_SIZE];
-- } __aligned(32) m;
--
-- int i = 0, j = 0;
-- u64 prev = 0;
-- u64 *const X1 = (u64 *)m.session;
-- u64 *const key = (u64 *)m.private;
-- u64 *const Px = m.coordinates + 0;
-- u64 *const Pz = m.coordinates + 4;
-- u64 *const Qx = m.coordinates + 8;
-- u64 *const Qz = m.coordinates + 12;
-- u64 *const X2 = Qx;
-- u64 *const Z2 = Qz;
-- u64 *const X3 = Px;
-- u64 *const Z3 = Pz;
-- u64 *const X2Z2 = Qx;
-- u64 *const X3Z3 = Px;
--
-- u64 *const A = m.workspace + 0;
-- u64 *const B = m.workspace + 4;
-- u64 *const D = m.workspace + 8;
-- u64 *const C = m.workspace + 12;
-- u64 *const DA = m.workspace + 16;
-- u64 *const CB = m.workspace + 20;
-- u64 *const AB = A;
-- u64 *const DC = D;
-- u64 *const DACB = DA;
--
-- memcpy(m.private, private_key, sizeof(m.private));
-- memcpy(m.session, session_key, sizeof(m.session));
--
-- curve25519_clamp_secret(m.private);
--
-- /* As in the draft:
-- * When receiving such an array, implementations of curve25519
-- * MUST mask the most-significant bit in the final byte. This
-- * is done to preserve compatibility with point formats which
-- * reserve the sign bit for use in other protocols and to
-- * increase resistance to implementation fingerprinting
-- */
-- m.session[CURVE25519_KEY_SIZE - 1] &= (1 << (255 % 8)) - 1;
--
-- copy_eltfp25519_1w(Px, X1);
-- setzero_eltfp25519_1w(Pz);
-- setzero_eltfp25519_1w(Qx);
-- setzero_eltfp25519_1w(Qz);
--
-- Pz[0] = 1;
-- Qx[0] = 1;
--
-- /* main-loop */
-- prev = 0;
-- j = 62;
-- for (i = 3; i >= 0; --i) {
-- while (j >= 0) {
-- u64 bit = (key[i] >> j) & 0x1;
-- u64 swap = bit ^ prev;
-- prev = bit;
--
-- add_eltfp25519_1w_adx(A, X2, Z2); /* A = (X2+Z2) */
-- sub_eltfp25519_1w(B, X2, Z2); /* B = (X2-Z2) */
-- add_eltfp25519_1w_adx(C, X3, Z3); /* C = (X3+Z3) */
-- sub_eltfp25519_1w(D, X3, Z3); /* D = (X3-Z3) */
-- mul_eltfp25519_2w_adx(DACB, AB, DC); /* [DA|CB] = [A|B]*[D|C] */
--
-- cselect(swap, A, C);
-- cselect(swap, B, D);
--
-- sqr_eltfp25519_2w_adx(AB); /* [AA|BB] = [A^2|B^2] */
-- add_eltfp25519_1w_adx(X3, DA, CB); /* X3 = (DA+CB) */
-- sub_eltfp25519_1w(Z3, DA, CB); /* Z3 = (DA-CB) */
-- sqr_eltfp25519_2w_adx(X3Z3); /* [X3|Z3] = [(DA+CB)|(DA+CB)]^2 */
--
-- copy_eltfp25519_1w(X2, B); /* X2 = B^2 */
-- sub_eltfp25519_1w(Z2, A, B); /* Z2 = E = AA-BB */
--
-- mul_a24_eltfp25519_1w(B, Z2); /* B = a24*E */
-- add_eltfp25519_1w_adx(B, B, X2); /* B = a24*E+B */
-- mul_eltfp25519_2w_adx(X2Z2, X2Z2, AB); /* [X2|Z2] = [B|E]*[A|a24*E+B] */
-- mul_eltfp25519_1w_adx(Z3, Z3, X1); /* Z3 = Z3*X1 */
-- --j;
-- }
-- j = 63;
-- }
--
-- inv_eltfp25519_1w_adx(A, Qz);
-- mul_eltfp25519_1w_adx((u64 *)shared, Qx, A);
-- fred_eltfp25519_1w((u64 *)shared);
--
-- memzero_explicit(&m, sizeof(m));
--}
--
--static void curve25519_adx_base(u8 session_key[CURVE25519_KEY_SIZE],
-- const u8 private_key[CURVE25519_KEY_SIZE])
-+static void point_add_and_double(u64 *q, u64 *p01_tmp1, u64 *tmp2)
- {
-- struct {
-- u64 buffer[4 * NUM_WORDS_ELTFP25519];
-- u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-- u64 workspace[4 * NUM_WORDS_ELTFP25519];
-- u8 private[CURVE25519_KEY_SIZE];
-- } __aligned(32) m;
--
-- const int ite[4] = { 64, 64, 64, 63 };
-- const int q = 3;
-- u64 swap = 1;
--
-- int i = 0, j = 0, k = 0;
-- u64 *const key = (u64 *)m.private;
-- u64 *const Ur1 = m.coordinates + 0;
-- u64 *const Zr1 = m.coordinates + 4;
-- u64 *const Ur2 = m.coordinates + 8;
-- u64 *const Zr2 = m.coordinates + 12;
--
-- u64 *const UZr1 = m.coordinates + 0;
-- u64 *const ZUr2 = m.coordinates + 8;
--
-- u64 *const A = m.workspace + 0;
-- u64 *const B = m.workspace + 4;
-- u64 *const C = m.workspace + 8;
-- u64 *const D = m.workspace + 12;
--
-- u64 *const AB = m.workspace + 0;
-- u64 *const CD = m.workspace + 8;
--
-- const u64 *const P = table_ladder_8k;
--
-- memcpy(m.private, private_key, sizeof(m.private));
--
-- curve25519_clamp_secret(m.private);
--
-- setzero_eltfp25519_1w(Ur1);
-- setzero_eltfp25519_1w(Zr1);
-- setzero_eltfp25519_1w(Zr2);
-- Ur1[0] = 1;
-- Zr1[0] = 1;
-- Zr2[0] = 1;
--
-- /* G-S */
-- Ur2[3] = 0x1eaecdeee27cab34UL;
-- Ur2[2] = 0xadc7a0b9235d48e2UL;
-- Ur2[1] = 0xbbf095ae14b2edf8UL;
-- Ur2[0] = 0x7e94e1fec82faabdUL;
--
-- /* main-loop */
-- j = q;
-- for (i = 0; i < NUM_WORDS_ELTFP25519; ++i) {
-- while (j < ite[i]) {
-- u64 bit = (key[i] >> j) & 0x1;
-- k = (64 * i + j - q);
-- swap = swap ^ bit;
-- cswap(swap, Ur1, Ur2);
-- cswap(swap, Zr1, Zr2);
-- swap = bit;
-- /* Addition */
-- sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-- add_eltfp25519_1w_adx(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-- mul_eltfp25519_1w_adx(C, &P[4 * k], B); /* C = M0-B */
-- sub_eltfp25519_1w(B, A, C); /* B = (Ur1+Zr1) - M*(Ur1-Zr1) */
-- add_eltfp25519_1w_adx(A, A, C); /* A = (Ur1+Zr1) + M*(Ur1-Zr1) */
-- sqr_eltfp25519_2w_adx(AB); /* A = A^2 | B = B^2 */
-- mul_eltfp25519_2w_adx(UZr1, ZUr2, AB); /* Ur1 = Zr2*A | Zr1 = Ur2*B */
-- ++j;
-+ u64 *nq = p01_tmp1;
-+ u64 *nq_p1 = p01_tmp1 + (u32)8U;
-+ u64 *tmp1 = p01_tmp1 + (u32)16U;
-+ u64 *x1 = q;
-+ u64 *x2 = nq;
-+ u64 *z2 = nq + (u32)4U;
-+ u64 *z3 = nq_p1 + (u32)4U;
-+ u64 *a = tmp1;
-+ u64 *b = tmp1 + (u32)4U;
-+ u64 *ab = tmp1;
-+ u64 *dc = tmp1 + (u32)8U;
-+ u64 *x3;
-+ u64 *z31;
-+ u64 *d0;
-+ u64 *c0;
-+ u64 *a1;
-+ u64 *b1;
-+ u64 *d;
-+ u64 *c;
-+ u64 *ab1;
-+ u64 *dc1;
-+ fadd(a, x2, z2);
-+ fsub(b, x2, z2);
-+ x3 = nq_p1;
-+ z31 = nq_p1 + (u32)4U;
-+ d0 = dc;
-+ c0 = dc + (u32)4U;
-+ fadd(c0, x3, z31);
-+ fsub(d0, x3, z31);
-+ fmul2(dc, dc, ab, tmp2);
-+ fadd(x3, d0, c0);
-+ fsub(z31, d0, c0);
-+ a1 = tmp1;
-+ b1 = tmp1 + (u32)4U;
-+ d = tmp1 + (u32)8U;
-+ c = tmp1 + (u32)12U;
-+ ab1 = tmp1;
-+ dc1 = tmp1 + (u32)8U;
-+ fsqr2(dc1, ab1, tmp2);
-+ fsqr2(nq_p1, nq_p1, tmp2);
-+ a1[0U] = c[0U];
-+ a1[1U] = c[1U];
-+ a1[2U] = c[2U];
-+ a1[3U] = c[3U];
-+ fsub(c, d, c);
-+ fmul_scalar(b1, c, (u64)121665U);
-+ fadd(b1, b1, d);
-+ fmul2(nq, dc1, ab1, tmp2);
-+ fmul(z3, z3, x1, tmp2);
-+}
-+
-+static void point_double(u64 *nq, u64 *tmp1, u64 *tmp2)
-+{
-+ u64 *x2 = nq;
-+ u64 *z2 = nq + (u32)4U;
-+ u64 *a = tmp1;
-+ u64 *b = tmp1 + (u32)4U;
-+ u64 *d = tmp1 + (u32)8U;
-+ u64 *c = tmp1 + (u32)12U;
-+ u64 *ab = tmp1;
-+ u64 *dc = tmp1 + (u32)8U;
-+ fadd(a, x2, z2);
-+ fsub(b, x2, z2);
-+ fsqr2(dc, ab, tmp2);
-+ a[0U] = c[0U];
-+ a[1U] = c[1U];
-+ a[2U] = c[2U];
-+ a[3U] = c[3U];
-+ fsub(c, d, c);
-+ fmul_scalar(b, c, (u64)121665U);
-+ fadd(b, b, d);
-+ fmul2(nq, dc, ab, tmp2);
-+}
-+
-+static void montgomery_ladder(u64 *out, const u8 *key, u64 *init1)
-+{
-+ u64 tmp2[16U] = { 0U };
-+ u64 p01_tmp1_swap[33U] = { 0U };
-+ u64 *p0 = p01_tmp1_swap;
-+ u64 *p01 = p01_tmp1_swap;
-+ u64 *p03 = p01;
-+ u64 *p11 = p01 + (u32)8U;
-+ u64 *x0;
-+ u64 *z0;
-+ u64 *p01_tmp1;
-+ u64 *p01_tmp11;
-+ u64 *nq10;
-+ u64 *nq_p11;
-+ u64 *swap1;
-+ u64 sw0;
-+ u64 *nq1;
-+ u64 *tmp1;
-+ memcpy(p11, init1, (u32)8U * sizeof(init1[0U]));
-+ x0 = p03;
-+ z0 = p03 + (u32)4U;
-+ x0[0U] = (u64)1U;
-+ x0[1U] = (u64)0U;
-+ x0[2U] = (u64)0U;
-+ x0[3U] = (u64)0U;
-+ z0[0U] = (u64)0U;
-+ z0[1U] = (u64)0U;
-+ z0[2U] = (u64)0U;
-+ z0[3U] = (u64)0U;
-+ p01_tmp1 = p01_tmp1_swap;
-+ p01_tmp11 = p01_tmp1_swap;
-+ nq10 = p01_tmp1_swap;
-+ nq_p11 = p01_tmp1_swap + (u32)8U;
-+ swap1 = p01_tmp1_swap + (u32)32U;
-+ cswap2((u64)1U, nq10, nq_p11);
-+ point_add_and_double(init1, p01_tmp11, tmp2);
-+ swap1[0U] = (u64)1U;
-+ {
-+ u32 i;
-+ for (i = (u32)0U; i < (u32)251U; i = i + (u32)1U) {
-+ u64 *p01_tmp12 = p01_tmp1_swap;
-+ u64 *swap2 = p01_tmp1_swap + (u32)32U;
-+ u64 *nq2 = p01_tmp12;
-+ u64 *nq_p12 = p01_tmp12 + (u32)8U;
-+ u64 bit = (u64)(key[((u32)253U - i) / (u32)8U] >> ((u32)253U - i) % (u32)8U & (u8)1U);
-+ u64 sw = swap2[0U] ^ bit;
-+ cswap2(sw, nq2, nq_p12);
-+ point_add_and_double(init1, p01_tmp12, tmp2);
-+ swap2[0U] = bit;
- }
-- j = 0;
- }
--
-- /* Doubling */
-- for (i = 0; i < q; ++i) {
-- add_eltfp25519_1w_adx(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-- sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-- sqr_eltfp25519_2w_adx(AB); /* A = A**2 B = B**2 */
-- copy_eltfp25519_1w(C, B); /* C = B */
-- sub_eltfp25519_1w(B, A, B); /* B = A-B */
-- mul_a24_eltfp25519_1w(D, B); /* D = my_a24*B */
-- add_eltfp25519_1w_adx(D, D, C); /* D = D+C */
-- mul_eltfp25519_2w_adx(UZr1, AB, CD); /* Ur1 = A*B Zr1 = Zr1*A */
-- }
--
-- /* Convert to affine coordinates */
-- inv_eltfp25519_1w_adx(A, Zr1);
-- mul_eltfp25519_1w_adx((u64 *)session_key, Ur1, A);
-- fred_eltfp25519_1w((u64 *)session_key);
--
-- memzero_explicit(&m, sizeof(m));
--}
--
--static void curve25519_bmi2(u8 shared[CURVE25519_KEY_SIZE],
-- const u8 private_key[CURVE25519_KEY_SIZE],
-- const u8 session_key[CURVE25519_KEY_SIZE])
--{
-- struct {
-- u64 buffer[4 * NUM_WORDS_ELTFP25519];
-- u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-- u64 workspace[6 * NUM_WORDS_ELTFP25519];
-- u8 session[CURVE25519_KEY_SIZE];
-- u8 private[CURVE25519_KEY_SIZE];
-- } __aligned(32) m;
--
-- int i = 0, j = 0;
-- u64 prev = 0;
-- u64 *const X1 = (u64 *)m.session;
-- u64 *const key = (u64 *)m.private;
-- u64 *const Px = m.coordinates + 0;
-- u64 *const Pz = m.coordinates + 4;
-- u64 *const Qx = m.coordinates + 8;
-- u64 *const Qz = m.coordinates + 12;
-- u64 *const X2 = Qx;
-- u64 *const Z2 = Qz;
-- u64 *const X3 = Px;
-- u64 *const Z3 = Pz;
-- u64 *const X2Z2 = Qx;
-- u64 *const X3Z3 = Px;
--
-- u64 *const A = m.workspace + 0;
-- u64 *const B = m.workspace + 4;
-- u64 *const D = m.workspace + 8;
-- u64 *const C = m.workspace + 12;
-- u64 *const DA = m.workspace + 16;
-- u64 *const CB = m.workspace + 20;
-- u64 *const AB = A;
-- u64 *const DC = D;
-- u64 *const DACB = DA;
--
-- memcpy(m.private, private_key, sizeof(m.private));
-- memcpy(m.session, session_key, sizeof(m.session));
--
-- curve25519_clamp_secret(m.private);
--
-- /* As in the draft:
-- * When receiving such an array, implementations of curve25519
-- * MUST mask the most-significant bit in the final byte. This
-- * is done to preserve compatibility with point formats which
-- * reserve the sign bit for use in other protocols and to
-- * increase resistance to implementation fingerprinting
-- */
-- m.session[CURVE25519_KEY_SIZE - 1] &= (1 << (255 % 8)) - 1;
--
-- copy_eltfp25519_1w(Px, X1);
-- setzero_eltfp25519_1w(Pz);
-- setzero_eltfp25519_1w(Qx);
-- setzero_eltfp25519_1w(Qz);
--
-- Pz[0] = 1;
-- Qx[0] = 1;
--
-- /* main-loop */
-- prev = 0;
-- j = 62;
-- for (i = 3; i >= 0; --i) {
-- while (j >= 0) {
-- u64 bit = (key[i] >> j) & 0x1;
-- u64 swap = bit ^ prev;
-- prev = bit;
--
-- add_eltfp25519_1w_bmi2(A, X2, Z2); /* A = (X2+Z2) */
-- sub_eltfp25519_1w(B, X2, Z2); /* B = (X2-Z2) */
-- add_eltfp25519_1w_bmi2(C, X3, Z3); /* C = (X3+Z3) */
-- sub_eltfp25519_1w(D, X3, Z3); /* D = (X3-Z3) */
-- mul_eltfp25519_2w_bmi2(DACB, AB, DC); /* [DA|CB] = [A|B]*[D|C] */
--
-- cselect(swap, A, C);
-- cselect(swap, B, D);
--
-- sqr_eltfp25519_2w_bmi2(AB); /* [AA|BB] = [A^2|B^2] */
-- add_eltfp25519_1w_bmi2(X3, DA, CB); /* X3 = (DA+CB) */
-- sub_eltfp25519_1w(Z3, DA, CB); /* Z3 = (DA-CB) */
-- sqr_eltfp25519_2w_bmi2(X3Z3); /* [X3|Z3] = [(DA+CB)|(DA+CB)]^2 */
--
-- copy_eltfp25519_1w(X2, B); /* X2 = B^2 */
-- sub_eltfp25519_1w(Z2, A, B); /* Z2 = E = AA-BB */
--
-- mul_a24_eltfp25519_1w(B, Z2); /* B = a24*E */
-- add_eltfp25519_1w_bmi2(B, B, X2); /* B = a24*E+B */
-- mul_eltfp25519_2w_bmi2(X2Z2, X2Z2, AB); /* [X2|Z2] = [B|E]*[A|a24*E+B] */
-- mul_eltfp25519_1w_bmi2(Z3, Z3, X1); /* Z3 = Z3*X1 */
-- --j;
-+ sw0 = swap1[0U];
-+ cswap2(sw0, nq10, nq_p11);
-+ nq1 = p01_tmp1;
-+ tmp1 = p01_tmp1 + (u32)16U;
-+ point_double(nq1, tmp1, tmp2);
-+ point_double(nq1, tmp1, tmp2);
-+ point_double(nq1, tmp1, tmp2);
-+ memcpy(out, p0, (u32)8U * sizeof(p0[0U]));
-+
-+ memzero_explicit(tmp2, sizeof(tmp2));
-+ memzero_explicit(p01_tmp1_swap, sizeof(p01_tmp1_swap));
-+}
-+
-+static void fsquare_times(u64 *o, const u64 *inp, u64 *tmp, u32 n1)
-+{
-+ u32 i;
-+ fsqr(o, inp, tmp);
-+ for (i = (u32)0U; i < n1 - (u32)1U; i = i + (u32)1U)
-+ fsqr(o, o, tmp);
-+}
-+
-+static void finv(u64 *o, const u64 *i, u64 *tmp)
-+{
-+ u64 t1[16U] = { 0U };
-+ u64 *a0 = t1;
-+ u64 *b = t1 + (u32)4U;
-+ u64 *c = t1 + (u32)8U;
-+ u64 *t00 = t1 + (u32)12U;
-+ u64 *tmp1 = tmp;
-+ u64 *a;
-+ u64 *t0;
-+ fsquare_times(a0, i, tmp1, (u32)1U);
-+ fsquare_times(t00, a0, tmp1, (u32)2U);
-+ fmul(b, t00, i, tmp);
-+ fmul(a0, b, a0, tmp);
-+ fsquare_times(t00, a0, tmp1, (u32)1U);
-+ fmul(b, t00, b, tmp);
-+ fsquare_times(t00, b, tmp1, (u32)5U);
-+ fmul(b, t00, b, tmp);
-+ fsquare_times(t00, b, tmp1, (u32)10U);
-+ fmul(c, t00, b, tmp);
-+ fsquare_times(t00, c, tmp1, (u32)20U);
-+ fmul(t00, t00, c, tmp);
-+ fsquare_times(t00, t00, tmp1, (u32)10U);
-+ fmul(b, t00, b, tmp);
-+ fsquare_times(t00, b, tmp1, (u32)50U);
-+ fmul(c, t00, b, tmp);
-+ fsquare_times(t00, c, tmp1, (u32)100U);
-+ fmul(t00, t00, c, tmp);
-+ fsquare_times(t00, t00, tmp1, (u32)50U);
-+ fmul(t00, t00, b, tmp);
-+ fsquare_times(t00, t00, tmp1, (u32)5U);
-+ a = t1;
-+ t0 = t1 + (u32)12U;
-+ fmul(o, t0, a, tmp);
-+}
-+
-+static void store_felem(u64 *b, u64 *f)
-+{
-+ u64 f30 = f[3U];
-+ u64 top_bit0 = f30 >> (u32)63U;
-+ u64 carry0;
-+ u64 f31;
-+ u64 top_bit;
-+ u64 carry;
-+ u64 f0;
-+ u64 f1;
-+ u64 f2;
-+ u64 f3;
-+ u64 m0;
-+ u64 m1;
-+ u64 m2;
-+ u64 m3;
-+ u64 mask;
-+ u64 f0_;
-+ u64 f1_;
-+ u64 f2_;
-+ u64 f3_;
-+ u64 o0;
-+ u64 o1;
-+ u64 o2;
-+ u64 o3;
-+ f[3U] = f30 & (u64)0x7fffffffffffffffU;
-+ carry0 = add_scalar(f, f, (u64)19U * top_bit0);
-+ f31 = f[3U];
-+ top_bit = f31 >> (u32)63U;
-+ f[3U] = f31 & (u64)0x7fffffffffffffffU;
-+ carry = add_scalar(f, f, (u64)19U * top_bit);
-+ f0 = f[0U];
-+ f1 = f[1U];
-+ f2 = f[2U];
-+ f3 = f[3U];
-+ m0 = gte_mask(f0, (u64)0xffffffffffffffedU);
-+ m1 = eq_mask(f1, (u64)0xffffffffffffffffU);
-+ m2 = eq_mask(f2, (u64)0xffffffffffffffffU);
-+ m3 = eq_mask(f3, (u64)0x7fffffffffffffffU);
-+ mask = ((m0 & m1) & m2) & m3;
-+ f0_ = f0 - (mask & (u64)0xffffffffffffffedU);
-+ f1_ = f1 - (mask & (u64)0xffffffffffffffffU);
-+ f2_ = f2 - (mask & (u64)0xffffffffffffffffU);
-+ f3_ = f3 - (mask & (u64)0x7fffffffffffffffU);
-+ o0 = f0_;
-+ o1 = f1_;
-+ o2 = f2_;
-+ o3 = f3_;
-+ b[0U] = o0;
-+ b[1U] = o1;
-+ b[2U] = o2;
-+ b[3U] = o3;
-+}
-+
-+static void encode_point(u8 *o, const u64 *i)
-+{
-+ const u64 *x = i;
-+ const u64 *z = i + (u32)4U;
-+ u64 tmp[4U] = { 0U };
-+ u64 tmp_w[16U] = { 0U };
-+ finv(tmp, z, tmp_w);
-+ fmul(tmp, tmp, x, tmp_w);
-+ store_felem((u64 *)o, tmp);
-+}
-+
-+static void curve25519_ever64(u8 *out, const u8 *priv, const u8 *pub)
-+{
-+ u64 init1[8U] = { 0U };
-+ u64 tmp[4U] = { 0U };
-+ u64 tmp3;
-+ u64 *x;
-+ u64 *z;
-+ {
-+ u32 i;
-+ for (i = (u32)0U; i < (u32)4U; i = i + (u32)1U) {
-+ u64 *os = tmp;
-+ const u8 *bj = pub + i * (u32)8U;
-+ u64 u = *(u64 *)bj;
-+ u64 r = u;
-+ u64 x0 = r;
-+ os[i] = x0;
- }
-- j = 63;
- }
-+ tmp3 = tmp[3U];
-+ tmp[3U] = tmp3 & (u64)0x7fffffffffffffffU;
-+ x = init1;
-+ z = init1 + (u32)4U;
-+ z[0U] = (u64)1U;
-+ z[1U] = (u64)0U;
-+ z[2U] = (u64)0U;
-+ z[3U] = (u64)0U;
-+ x[0U] = tmp[0U];
-+ x[1U] = tmp[1U];
-+ x[2U] = tmp[2U];
-+ x[3U] = tmp[3U];
-+ montgomery_ladder(init1, priv, init1);
-+ encode_point(out, init1);
-+}
-+
-+/* The below constants were generated using this sage script:
-+ *
-+ * #!/usr/bin/env sage
-+ * import sys
-+ * from sage.all import *
-+ * def limbs(n):
-+ * n = int(n)
-+ * l = ((n >> 0) % 2^64, (n >> 64) % 2^64, (n >> 128) % 2^64, (n >> 192) % 2^64)
-+ * return "0x%016xULL, 0x%016xULL, 0x%016xULL, 0x%016xULL" % l
-+ * ec = EllipticCurve(GF(2^255 - 19), [0, 486662, 0, 1, 0])
-+ * p_minus_s = (ec.lift_x(9) - ec.lift_x(1))[0]
-+ * print("static const u64 p_minus_s[] = { %s };\n" % limbs(p_minus_s))
-+ * print("static const u64 table_ladder[] = {")
-+ * p = ec.lift_x(9)
-+ * for i in range(252):
-+ * l = (p[0] + p[2]) / (p[0] - p[2])
-+ * print(("\t%s" + ("," if i != 251 else "")) % limbs(l))
-+ * p = p * 2
-+ * print("};")
-+ *
-+ */
-
-- inv_eltfp25519_1w_bmi2(A, Qz);
-- mul_eltfp25519_1w_bmi2((u64 *)shared, Qx, A);
-- fred_eltfp25519_1w((u64 *)shared);
-+static const u64 p_minus_s[] = { 0x816b1e0137d48290ULL, 0x440f6a51eb4d1207ULL, 0x52385f46dca2b71dULL, 0x215132111d8354cbULL };
-
-- memzero_explicit(&m, sizeof(m));
--}
-+static const u64 table_ladder[] = {
-+ 0xfffffffffffffff3ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0x5fffffffffffffffULL,
-+ 0x6b8220f416aafe96ULL, 0x82ebeb2b4f566a34ULL, 0xd5a9a5b075a5950fULL, 0x5142b2cf4b2488f4ULL,
-+ 0x6aaebc750069680cULL, 0x89cf7820a0f99c41ULL, 0x2a58d9183b56d0f4ULL, 0x4b5aca80e36011a4ULL,
-+ 0x329132348c29745dULL, 0xf4a2e616e1642fd7ULL, 0x1e45bb03ff67bc34ULL, 0x306912d0f42a9b4aULL,
-+ 0xff886507e6af7154ULL, 0x04f50e13dfeec82fULL, 0xaa512fe82abab5ceULL, 0x174e251a68d5f222ULL,
-+ 0xcf96700d82028898ULL, 0x1743e3370a2c02c5ULL, 0x379eec98b4e86eaaULL, 0x0c59888a51e0482eULL,
-+ 0xfbcbf1d699b5d189ULL, 0xacaef0d58e9fdc84ULL, 0xc1c20d06231f7614ULL, 0x2938218da274f972ULL,
-+ 0xf6af49beff1d7f18ULL, 0xcc541c22387ac9c2ULL, 0x96fcc9ef4015c56bULL, 0x69c1627c690913a9ULL,
-+ 0x7a86fd2f4733db0eULL, 0xfdb8c4f29e087de9ULL, 0x095e4b1a8ea2a229ULL, 0x1ad7a7c829b37a79ULL,
-+ 0x342d89cad17ea0c0ULL, 0x67bedda6cced2051ULL, 0x19ca31bf2bb42f74ULL, 0x3df7b4c84980acbbULL,
-+ 0xa8c6444dc80ad883ULL, 0xb91e440366e3ab85ULL, 0xc215cda00164f6d8ULL, 0x3d867c6ef247e668ULL,
-+ 0xc7dd582bcc3e658cULL, 0xfd2c4748ee0e5528ULL, 0xa0fd9b95cc9f4f71ULL, 0x7529d871b0675ddfULL,
-+ 0xb8f568b42d3cbd78ULL, 0x1233011b91f3da82ULL, 0x2dce6ccd4a7c3b62ULL, 0x75e7fc8e9e498603ULL,
-+ 0x2f4f13f1fcd0b6ecULL, 0xf1a8ca1f29ff7a45ULL, 0xc249c1a72981e29bULL, 0x6ebe0dbb8c83b56aULL,
-+ 0x7114fa8d170bb222ULL, 0x65a2dcd5bf93935fULL, 0xbdc41f68b59c979aULL, 0x2f0eef79a2ce9289ULL,
-+ 0x42ecbf0c083c37ceULL, 0x2930bc09ec496322ULL, 0xf294b0c19cfeac0dULL, 0x3780aa4bedfabb80ULL,
-+ 0x56c17d3e7cead929ULL, 0xe7cb4beb2e5722c5ULL, 0x0ce931732dbfe15aULL, 0x41b883c7621052f8ULL,
-+ 0xdbf75ca0c3d25350ULL, 0x2936be086eb1e351ULL, 0xc936e03cb4a9b212ULL, 0x1d45bf82322225aaULL,
-+ 0xe81ab1036a024cc5ULL, 0xe212201c304c9a72ULL, 0xc5d73fba6832b1fcULL, 0x20ffdb5a4d839581ULL,
-+ 0xa283d367be5d0fadULL, 0x6c2b25ca8b164475ULL, 0x9d4935467caaf22eULL, 0x5166408eee85ff49ULL,
-+ 0x3c67baa2fab4e361ULL, 0xb3e433c67ef35cefULL, 0x5259729241159b1cULL, 0x6a621892d5b0ab33ULL,
-+ 0x20b74a387555cdcbULL, 0x532aa10e1208923fULL, 0xeaa17b7762281dd1ULL, 0x61ab3443f05c44bfULL,
-+ 0x257a6c422324def8ULL, 0x131c6c1017e3cf7fULL, 0x23758739f630a257ULL, 0x295a407a01a78580ULL,
-+ 0xf8c443246d5da8d9ULL, 0x19d775450c52fa5dULL, 0x2afcfc92731bf83dULL, 0x7d10c8e81b2b4700ULL,
-+ 0xc8e0271f70baa20bULL, 0x993748867ca63957ULL, 0x5412efb3cb7ed4bbULL, 0x3196d36173e62975ULL,
-+ 0xde5bcad141c7dffcULL, 0x47cc8cd2b395c848ULL, 0xa34cd942e11af3cbULL, 0x0256dbf2d04ecec2ULL,
-+ 0x875ab7e94b0e667fULL, 0xcad4dd83c0850d10ULL, 0x47f12e8f4e72c79fULL, 0x5f1a87bb8c85b19bULL,
-+ 0x7ae9d0b6437f51b8ULL, 0x12c7ce5518879065ULL, 0x2ade09fe5cf77aeeULL, 0x23a05a2f7d2c5627ULL,
-+ 0x5908e128f17c169aULL, 0xf77498dd8ad0852dULL, 0x74b4c4ceab102f64ULL, 0x183abadd10139845ULL,
-+ 0xb165ba8daa92aaacULL, 0xd5c5ef9599386705ULL, 0xbe2f8f0cf8fc40d1ULL, 0x2701e635ee204514ULL,
-+ 0x629fa80020156514ULL, 0xf223868764a8c1ceULL, 0x5b894fff0b3f060eULL, 0x60d9944cf708a3faULL,
-+ 0xaeea001a1c7a201fULL, 0xebf16a633ee2ce63ULL, 0x6f7709594c7a07e1ULL, 0x79b958150d0208cbULL,
-+ 0x24b55e5301d410e7ULL, 0xe3a34edff3fdc84dULL, 0xd88768e4904032d8ULL, 0x131384427b3aaeecULL,
-+ 0x8405e51286234f14ULL, 0x14dc4739adb4c529ULL, 0xb8a2b5b250634ffdULL, 0x2fe2a94ad8a7ff93ULL,
-+ 0xec5c57efe843faddULL, 0x2843ce40f0bb9918ULL, 0xa4b561d6cf3d6305ULL, 0x743629bde8fb777eULL,
-+ 0x343edd46bbaf738fULL, 0xed981828b101a651ULL, 0xa401760b882c797aULL, 0x1fc223e28dc88730ULL,
-+ 0x48604e91fc0fba0eULL, 0xb637f78f052c6fa4ULL, 0x91ccac3d09e9239cULL, 0x23f7eed4437a687cULL,
-+ 0x5173b1118d9bd800ULL, 0x29d641b63189d4a7ULL, 0xfdbf177988bbc586ULL, 0x2959894fcad81df5ULL,
-+ 0xaebc8ef3b4bbc899ULL, 0x4148995ab26992b9ULL, 0x24e20b0134f92cfbULL, 0x40d158894a05dee8ULL,
-+ 0x46b00b1185af76f6ULL, 0x26bac77873187a79ULL, 0x3dc0bf95ab8fff5fULL, 0x2a608bd8945524d7ULL,
-+ 0x26449588bd446302ULL, 0x7c4bc21c0388439cULL, 0x8e98a4f383bd11b2ULL, 0x26218d7bc9d876b9ULL,
-+ 0xe3081542997c178aULL, 0x3c2d29a86fb6606fULL, 0x5c217736fa279374ULL, 0x7dde05734afeb1faULL,
-+ 0x3bf10e3906d42babULL, 0xe4f7803e1980649cULL, 0xe6053bf89595bf7aULL, 0x394faf38da245530ULL,
-+ 0x7a8efb58896928f4ULL, 0xfbc778e9cc6a113cULL, 0x72670ce330af596fULL, 0x48f222a81d3d6cf7ULL,
-+ 0xf01fce410d72caa7ULL, 0x5a20ecc7213b5595ULL, 0x7bc21165c1fa1483ULL, 0x07f89ae31da8a741ULL,
-+ 0x05d2c2b4c6830ff9ULL, 0xd43e330fc6316293ULL, 0xa5a5590a96d3a904ULL, 0x705edb91a65333b6ULL,
-+ 0x048ee15e0bb9a5f7ULL, 0x3240cfca9e0aaf5dULL, 0x8f4b71ceedc4a40bULL, 0x621c0da3de544a6dULL,
-+ 0x92872836a08c4091ULL, 0xce8375b010c91445ULL, 0x8a72eb524f276394ULL, 0x2667fcfa7ec83635ULL,
-+ 0x7f4c173345e8752aULL, 0x061b47feee7079a5ULL, 0x25dd9afa9f86ff34ULL, 0x3780cef5425dc89cULL,
-+ 0x1a46035a513bb4e9ULL, 0x3e1ef379ac575adaULL, 0xc78c5f1c5fa24b50ULL, 0x321a967634fd9f22ULL,
-+ 0x946707b8826e27faULL, 0x3dca84d64c506fd0ULL, 0xc189218075e91436ULL, 0x6d9284169b3b8484ULL,
-+ 0x3a67e840383f2ddfULL, 0x33eec9a30c4f9b75ULL, 0x3ec7c86fa783ef47ULL, 0x26ec449fbac9fbc4ULL,
-+ 0x5c0f38cba09b9e7dULL, 0x81168cc762a3478cULL, 0x3e23b0d306fc121cULL, 0x5a238aa0a5efdcddULL,
-+ 0x1ba26121c4ea43ffULL, 0x36f8c77f7c8832b5ULL, 0x88fbea0b0adcf99aULL, 0x5ca9938ec25bebf9ULL,
-+ 0xd5436a5e51fccda0ULL, 0x1dbc4797c2cd893bULL, 0x19346a65d3224a08ULL, 0x0f5034e49b9af466ULL,
-+ 0xf23c3967a1e0b96eULL, 0xe58b08fa867a4d88ULL, 0xfb2fabc6a7341679ULL, 0x2a75381eb6026946ULL,
-+ 0xc80a3be4c19420acULL, 0x66b1f6c681f2b6dcULL, 0x7cf7036761e93388ULL, 0x25abbbd8a660a4c4ULL,
-+ 0x91ea12ba14fd5198ULL, 0x684950fc4a3cffa9ULL, 0xf826842130f5ad28ULL, 0x3ea988f75301a441ULL,
-+ 0xc978109a695f8c6fULL, 0x1746eb4a0530c3f3ULL, 0x444d6d77b4459995ULL, 0x75952b8c054e5cc7ULL,
-+ 0xa3703f7915f4d6aaULL, 0x66c346202f2647d8ULL, 0xd01469df811d644bULL, 0x77fea47d81a5d71fULL,
-+ 0xc5e9529ef57ca381ULL, 0x6eeeb4b9ce2f881aULL, 0xb6e91a28e8009bd6ULL, 0x4b80be3e9afc3fecULL,
-+ 0x7e3773c526aed2c5ULL, 0x1b4afcb453c9a49dULL, 0xa920bdd7baffb24dULL, 0x7c54699f122d400eULL,
-+ 0xef46c8e14fa94bc8ULL, 0xe0b074ce2952ed5eULL, 0xbea450e1dbd885d5ULL, 0x61b68649320f712cULL,
-+ 0x8a485f7309ccbdd1ULL, 0xbd06320d7d4d1a2dULL, 0x25232973322dbef4ULL, 0x445dc4758c17f770ULL,
-+ 0xdb0434177cc8933cULL, 0xed6fe82175ea059fULL, 0x1efebefdc053db34ULL, 0x4adbe867c65daf99ULL,
-+ 0x3acd71a2a90609dfULL, 0xe5e991856dd04050ULL, 0x1ec69b688157c23cULL, 0x697427f6885cfe4dULL,
-+ 0xd7be7b9b65e1a851ULL, 0xa03d28d522c536ddULL, 0x28399d658fd2b645ULL, 0x49e5b7e17c2641e1ULL,
-+ 0x6f8c3a98700457a4ULL, 0x5078f0a25ebb6778ULL, 0xd13c3ccbc382960fULL, 0x2e003258a7df84b1ULL,
-+ 0x8ad1f39be6296a1cULL, 0xc1eeaa652a5fbfb2ULL, 0x33ee0673fd26f3cbULL, 0x59256173a69d2cccULL,
-+ 0x41ea07aa4e18fc41ULL, 0xd9fc19527c87a51eULL, 0xbdaacb805831ca6fULL, 0x445b652dc916694fULL,
-+ 0xce92a3a7f2172315ULL, 0x1edc282de11b9964ULL, 0xa1823aafe04c314aULL, 0x790a2d94437cf586ULL,
-+ 0x71c447fb93f6e009ULL, 0x8922a56722845276ULL, 0xbf70903b204f5169ULL, 0x2f7a89891ba319feULL,
-+ 0x02a08eb577e2140cULL, 0xed9a4ed4427bdcf4ULL, 0x5253ec44e4323cd1ULL, 0x3e88363c14e9355bULL,
-+ 0xaa66c14277110b8cULL, 0x1ae0391610a23390ULL, 0x2030bd12c93fc2a2ULL, 0x3ee141579555c7abULL,
-+ 0x9214de3a6d6e7d41ULL, 0x3ccdd88607f17efeULL, 0x674f1288f8e11217ULL, 0x5682250f329f93d0ULL,
-+ 0x6cf00b136d2e396eULL, 0x6e4cf86f1014debfULL, 0x5930b1b5bfcc4e83ULL, 0x047069b48aba16b6ULL,
-+ 0x0d4ce4ab69b20793ULL, 0xb24db91a97d0fb9eULL, 0xcdfa50f54e00d01dULL, 0x221b1085368bddb5ULL,
-+ 0xe7e59468b1e3d8d2ULL, 0x53c56563bd122f93ULL, 0xeee8a903e0663f09ULL, 0x61efa662cbbe3d42ULL,
-+ 0x2cf8ddddde6eab2aULL, 0x9bf80ad51435f231ULL, 0x5deadacec9f04973ULL, 0x29275b5d41d29b27ULL,
-+ 0xcfde0f0895ebf14fULL, 0xb9aab96b054905a7ULL, 0xcae80dd9a1c420fdULL, 0x0a63bf2f1673bbc7ULL,
-+ 0x092f6e11958fbc8cULL, 0x672a81e804822fadULL, 0xcac8351560d52517ULL, 0x6f3f7722c8f192f8ULL,
-+ 0xf8ba90ccc2e894b7ULL, 0x2c7557a438ff9f0dULL, 0x894d1d855ae52359ULL, 0x68e122157b743d69ULL,
-+ 0xd87e5570cfb919f3ULL, 0x3f2cdecd95798db9ULL, 0x2121154710c0a2ceULL, 0x3c66a115246dc5b2ULL,
-+ 0xcbedc562294ecb72ULL, 0xba7143c36a280b16ULL, 0x9610c2efd4078b67ULL, 0x6144735d946a4b1eULL,
-+ 0x536f111ed75b3350ULL, 0x0211db8c2041d81bULL, 0xf93cb1000e10413cULL, 0x149dfd3c039e8876ULL,
-+ 0xd479dde46b63155bULL, 0xb66e15e93c837976ULL, 0xdafde43b1f13e038ULL, 0x5fafda1a2e4b0b35ULL,
-+ 0x3600bbdf17197581ULL, 0x3972050bbe3cd2c2ULL, 0x5938906dbdd5be86ULL, 0x34fce5e43f9b860fULL,
-+ 0x75a8a4cd42d14d02ULL, 0x828dabc53441df65ULL, 0x33dcabedd2e131d3ULL, 0x3ebad76fb814d25fULL,
-+ 0xd4906f566f70e10fULL, 0x5d12f7aa51690f5aULL, 0x45adb16e76cefcf2ULL, 0x01f768aead232999ULL,
-+ 0x2b6cc77b6248febdULL, 0x3cd30628ec3aaffdULL, 0xce1c0b80d4ef486aULL, 0x4c3bff2ea6f66c23ULL,
-+ 0x3f2ec4094aeaeb5fULL, 0x61b19b286e372ca7ULL, 0x5eefa966de2a701dULL, 0x23b20565de55e3efULL,
-+ 0xe301ca5279d58557ULL, 0x07b2d4ce27c2874fULL, 0xa532cd8a9dcf1d67ULL, 0x2a52fee23f2bff56ULL,
-+ 0x8624efb37cd8663dULL, 0xbbc7ac20ffbd7594ULL, 0x57b85e9c82d37445ULL, 0x7b3052cb86a6ec66ULL,
-+ 0x3482f0ad2525e91eULL, 0x2cb68043d28edca0ULL, 0xaf4f6d052e1b003aULL, 0x185f8c2529781b0aULL,
-+ 0xaa41de5bd80ce0d6ULL, 0x9407b2416853e9d6ULL, 0x563ec36e357f4c3aULL, 0x4cc4b8dd0e297bceULL,
-+ 0xa2fc1a52ffb8730eULL, 0x1811f16e67058e37ULL, 0x10f9a366cddf4ee1ULL, 0x72f4a0c4a0b9f099ULL,
-+ 0x8c16c06f663f4ea7ULL, 0x693b3af74e970fbaULL, 0x2102e7f1d69ec345ULL, 0x0ba53cbc968a8089ULL,
-+ 0xca3d9dc7fea15537ULL, 0x4c6824bb51536493ULL, 0xb9886314844006b1ULL, 0x40d2a72ab454cc60ULL,
-+ 0x5936a1b712570975ULL, 0x91b9d648debda657ULL, 0x3344094bb64330eaULL, 0x006ba10d12ee51d0ULL,
-+ 0x19228468f5de5d58ULL, 0x0eb12f4c38cc05b0ULL, 0xa1039f9dd5601990ULL, 0x4502d4ce4fff0e0bULL,
-+ 0xeb2054106837c189ULL, 0xd0f6544c6dd3b93cULL, 0x40727064c416d74fULL, 0x6e15c6114b502ef0ULL,
-+ 0x4df2a398cfb1a76bULL, 0x11256c7419f2f6b1ULL, 0x4a497962066e6043ULL, 0x705b3aab41355b44ULL,
-+ 0x365ef536d797b1d8ULL, 0x00076bd622ddf0dbULL, 0x3bbf33b0e0575a88ULL, 0x3777aa05c8e4ca4dULL,
-+ 0x392745c85578db5fULL, 0x6fda4149dbae5ae2ULL, 0xb1f0b00b8adc9867ULL, 0x09963437d36f1da3ULL,
-+ 0x7e824e90a5dc3853ULL, 0xccb5f6641f135cbdULL, 0x6736d86c87ce8fccULL, 0x625f3ce26604249fULL,
-+ 0xaf8ac8059502f63fULL, 0x0c05e70a2e351469ULL, 0x35292e9c764b6305ULL, 0x1a394360c7e23ac3ULL,
-+ 0xd5c6d53251183264ULL, 0x62065abd43c2b74fULL, 0xb5fbf5d03b973f9bULL, 0x13a3da3661206e5eULL,
-+ 0xc6bd5837725d94e5ULL, 0x18e30912205016c5ULL, 0x2088ce1570033c68ULL, 0x7fba1f495c837987ULL,
-+ 0x5a8c7423f2f9079dULL, 0x1735157b34023fc5ULL, 0xe4f9b49ad2fab351ULL, 0x6691ff72c878e33cULL,
-+ 0x122c2adedc5eff3eULL, 0xf8dd4bf1d8956cf4ULL, 0xeb86205d9e9e5bdaULL, 0x049b92b9d975c743ULL,
-+ 0xa5379730b0f6c05aULL, 0x72a0ffacc6f3a553ULL, 0xb0032c34b20dcd6dULL, 0x470e9dbc88d5164aULL,
-+ 0xb19cf10ca237c047ULL, 0xb65466711f6c81a2ULL, 0xb3321bd16dd80b43ULL, 0x48c14f600c5fbe8eULL,
-+ 0x66451c264aa6c803ULL, 0xb66e3904a4fa7da6ULL, 0xd45f19b0b3128395ULL, 0x31602627c3c9bc10ULL,
-+ 0x3120dc4832e4e10dULL, 0xeb20c46756c717f7ULL, 0x00f52e3f67280294ULL, 0x566d4fc14730c509ULL,
-+ 0x7e3a5d40fd837206ULL, 0xc1e926dc7159547aULL, 0x216730fba68d6095ULL, 0x22e8c3843f69cea7ULL,
-+ 0x33d074e8930e4b2bULL, 0xb6e4350e84d15816ULL, 0x5534c26ad6ba2365ULL, 0x7773c12f89f1f3f3ULL,
-+ 0x8cba404da57962aaULL, 0x5b9897a81999ce56ULL, 0x508e862f121692fcULL, 0x3a81907fa093c291ULL,
-+ 0x0dded0ff4725a510ULL, 0x10d8cc10673fc503ULL, 0x5b9d151c9f1f4e89ULL, 0x32a5c1d5cb09a44cULL,
-+ 0x1e0aa442b90541fbULL, 0x5f85eb7cc1b485dbULL, 0xbee595ce8a9df2e5ULL, 0x25e496c722422236ULL,
-+ 0x5edf3c46cd0fe5b9ULL, 0x34e75a7ed2a43388ULL, 0xe488de11d761e352ULL, 0x0e878a01a085545cULL,
-+ 0xba493c77e021bb04ULL, 0x2b4d1843c7df899aULL, 0x9ea37a487ae80d67ULL, 0x67a9958011e41794ULL,
-+ 0x4b58051a6697b065ULL, 0x47e33f7d8d6ba6d4ULL, 0xbb4da8d483ca46c1ULL, 0x68becaa181c2db0dULL,
-+ 0x8d8980e90b989aa5ULL, 0xf95eb14a2c93c99bULL, 0x51c6c7c4796e73a2ULL, 0x6e228363b5efb569ULL,
-+ 0xc6bbc0b02dd624c8ULL, 0x777eb47dec8170eeULL, 0x3cde15a004cfafa9ULL, 0x1dc6bc087160bf9bULL,
-+ 0x2e07e043eec34002ULL, 0x18e9fc677a68dc7fULL, 0xd8da03188bd15b9aULL, 0x48fbc3bb00568253ULL,
-+ 0x57547d4cfb654ce1ULL, 0xd3565b82a058e2adULL, 0xf63eaf0bbf154478ULL, 0x47531ef114dfbb18ULL,
-+ 0xe1ec630a4278c587ULL, 0x5507d546ca8e83f3ULL, 0x85e135c63adc0c2bULL, 0x0aa7efa85682844eULL,
-+ 0x72691ba8b3e1f615ULL, 0x32b4e9701fbe3ffaULL, 0x97b6d92e39bb7868ULL, 0x2cfe53dea02e39e8ULL,
-+ 0x687392cd85cd52b0ULL, 0x27ff66c910e29831ULL, 0x97134556a9832d06ULL, 0x269bb0360a84f8a0ULL,
-+ 0x706e55457643f85cULL, 0x3734a48c9b597d1bULL, 0x7aee91e8c6efa472ULL, 0x5cd6abc198a9d9e0ULL,
-+ 0x0e04de06cb3ce41aULL, 0xd8c6eb893402e138ULL, 0x904659bb686e3772ULL, 0x7215c371746ba8c8ULL,
-+ 0xfd12a97eeae4a2d9ULL, 0x9514b7516394f2c5ULL, 0x266fd5809208f294ULL, 0x5c847085619a26b9ULL,
-+ 0x52985410fed694eaULL, 0x3c905b934a2ed254ULL, 0x10bb47692d3be467ULL, 0x063b3d2d69e5e9e1ULL,
-+ 0x472726eedda57debULL, 0xefb6c4ae10f41891ULL, 0x2b1641917b307614ULL, 0x117c554fc4f45b7cULL,
-+ 0xc07cf3118f9d8812ULL, 0x01dbd82050017939ULL, 0xd7e803f4171b2827ULL, 0x1015e87487d225eaULL,
-+ 0xc58de3fed23acc4dULL, 0x50db91c294a7be2dULL, 0x0b94d43d1c9cf457ULL, 0x6b1640fa6e37524aULL,
-+ 0x692f346c5fda0d09ULL, 0x200b1c59fa4d3151ULL, 0xb8c46f760777a296ULL, 0x4b38395f3ffdfbcfULL,
-+ 0x18d25e00be54d671ULL, 0x60d50582bec8aba6ULL, 0x87ad8f263b78b982ULL, 0x50fdf64e9cda0432ULL,
-+ 0x90f567aac578dcf0ULL, 0xef1e9b0ef2a3133bULL, 0x0eebba9242d9de71ULL, 0x15473c9bf03101c7ULL,
-+ 0x7c77e8ae56b78095ULL, 0xb678e7666e6f078eULL, 0x2da0b9615348ba1fULL, 0x7cf931c1ff733f0bULL,
-+ 0x26b357f50a0a366cULL, 0xe9708cf42b87d732ULL, 0xc13aeea5f91cb2c0ULL, 0x35d90c991143bb4cULL,
-+ 0x47c1c404a9a0d9dcULL, 0x659e58451972d251ULL, 0x3875a8c473b38c31ULL, 0x1fbd9ed379561f24ULL,
-+ 0x11fabc6fd41ec28dULL, 0x7ef8dfe3cd2a2dcaULL, 0x72e73b5d8c404595ULL, 0x6135fa4954b72f27ULL,
-+ 0xccfc32a2de24b69cULL, 0x3f55698c1f095d88ULL, 0xbe3350ed5ac3f929ULL, 0x5e9bf806ca477eebULL,
-+ 0xe9ce8fb63c309f68ULL, 0x5376f63565e1f9f4ULL, 0xd1afcfb35a6393f1ULL, 0x6632a1ede5623506ULL,
-+ 0x0b7d6c390c2ded4cULL, 0x56cb3281df04cb1fULL, 0x66305a1249ecc3c7ULL, 0x5d588b60a38ca72aULL,
-+ 0xa6ecbf78e8e5f42dULL, 0x86eeb44b3c8a3eecULL, 0xec219c48fbd21604ULL, 0x1aaf1af517c36731ULL,
-+ 0xc306a2836769bde7ULL, 0x208280622b1e2adbULL, 0x8027f51ffbff94a6ULL, 0x76cfa1ce1124f26bULL,
-+ 0x18eb00562422abb6ULL, 0xf377c4d58f8c29c3ULL, 0x4dbbc207f531561aULL, 0x0253b7f082128a27ULL,
-+ 0x3d1f091cb62c17e0ULL, 0x4860e1abd64628a9ULL, 0x52d17436309d4253ULL, 0x356f97e13efae576ULL,
-+ 0xd351e11aa150535bULL, 0x3e6b45bb1dd878ccULL, 0x0c776128bed92c98ULL, 0x1d34ae93032885b8ULL,
-+ 0x4ba0488ca85ba4c3ULL, 0x985348c33c9ce6ceULL, 0x66124c6f97bda770ULL, 0x0f81a0290654124aULL,
-+ 0x9ed09ca6569b86fdULL, 0x811009fd18af9a2dULL, 0xff08d03f93d8c20aULL, 0x52a148199faef26bULL,
-+ 0x3e03f9dc2d8d1b73ULL, 0x4205801873961a70ULL, 0xc0d987f041a35970ULL, 0x07aa1f15a1c0d549ULL,
-+ 0xdfd46ce08cd27224ULL, 0x6d0a024f934e4239ULL, 0x808a7a6399897b59ULL, 0x0a4556e9e13d95a2ULL,
-+ 0xd21a991fe9c13045ULL, 0x9b0e8548fe7751b8ULL, 0x5da643cb4bf30035ULL, 0x77db28d63940f721ULL,
-+ 0xfc5eeb614adc9011ULL, 0x5229419ae8c411ebULL, 0x9ec3e7787d1dcf74ULL, 0x340d053e216e4cb5ULL,
-+ 0xcac7af39b48df2b4ULL, 0xc0faec2871a10a94ULL, 0x140a69245ca575edULL, 0x0cf1c37134273a4cULL,
-+ 0xc8ee306ac224b8a5ULL, 0x57eaee7ccb4930b0ULL, 0xa1e806bdaacbe74fULL, 0x7d9a62742eeb657dULL,
-+ 0x9eb6b6ef546c4830ULL, 0x885cca1fddb36e2eULL, 0xe6b9f383ef0d7105ULL, 0x58654fef9d2e0412ULL,
-+ 0xa905c4ffbe0e8e26ULL, 0x942de5df9b31816eULL, 0x497d723f802e88e1ULL, 0x30684dea602f408dULL,
-+ 0x21e5a278a3e6cb34ULL, 0xaefb6e6f5b151dc4ULL, 0xb30b8e049d77ca15ULL, 0x28c3c9cf53b98981ULL,
-+ 0x287fb721556cdd2aULL, 0x0d317ca897022274ULL, 0x7468c7423a543258ULL, 0x4a7f11464eb5642fULL,
-+ 0xa237a4774d193aa6ULL, 0xd865986ea92129a1ULL, 0x24c515ecf87c1a88ULL, 0x604003575f39f5ebULL,
-+ 0x47b9f189570a9b27ULL, 0x2b98cede465e4b78ULL, 0x026df551dbb85c20ULL, 0x74fcd91047e21901ULL,
-+ 0x13e2a90a23c1bfa3ULL, 0x0cb0074e478519f6ULL, 0x5ff1cbbe3af6cf44ULL, 0x67fe5438be812dbeULL,
-+ 0xd13cf64fa40f05b0ULL, 0x054dfb2f32283787ULL, 0x4173915b7f0d2aeaULL, 0x482f144f1f610d4eULL,
-+ 0xf6210201b47f8234ULL, 0x5d0ae1929e70b990ULL, 0xdcd7f455b049567cULL, 0x7e93d0f1f0916f01ULL,
-+ 0xdd79cbf18a7db4faULL, 0xbe8391bf6f74c62fULL, 0x027145d14b8291bdULL, 0x585a73ea2cbf1705ULL,
-+ 0x485ca03e928a0db2ULL, 0x10fc01a5742857e7ULL, 0x2f482edbd6d551a7ULL, 0x0f0433b5048fdb8aULL,
-+ 0x60da2e8dd7dc6247ULL, 0x88b4c9d38cd4819aULL, 0x13033ac001f66697ULL, 0x273b24fe3b367d75ULL,
-+ 0xc6e8f66a31b3b9d4ULL, 0x281514a494df49d5ULL, 0xd1726fdfc8b23da7ULL, 0x4b3ae7d103dee548ULL,
-+ 0xc6256e19ce4b9d7eULL, 0xff5c5cf186e3c61cULL, 0xacc63ca34b8ec145ULL, 0x74621888fee66574ULL,
-+ 0x956f409645290a1eULL, 0xef0bf8e3263a962eULL, 0xed6a50eb5ec2647bULL, 0x0694283a9dca7502ULL,
-+ 0x769b963643a2dcd1ULL, 0x42b7c8ea09fc5353ULL, 0x4f002aee13397eabULL, 0x63005e2c19b7d63aULL,
-+ 0xca6736da63023beaULL, 0x966c7f6db12a99b7ULL, 0xace09390c537c5e1ULL, 0x0b696063a1aa89eeULL,
-+ 0xebb03e97288c56e5ULL, 0x432a9f9f938c8be8ULL, 0xa6a5a93d5b717f71ULL, 0x1a5fb4c3e18f9d97ULL,
-+ 0x1c94e7ad1c60cdceULL, 0xee202a43fc02c4a0ULL, 0x8dafe4d867c46a20ULL, 0x0a10263c8ac27b58ULL,
-+ 0xd0dea9dfe4432a4aULL, 0x856af87bbe9277c5ULL, 0xce8472acc212c71aULL, 0x6f151b6d9bbb1e91ULL,
-+ 0x26776c527ceed56aULL, 0x7d211cb7fbf8faecULL, 0x37ae66a6fd4609ccULL, 0x1f81b702d2770c42ULL,
-+ 0x2fb0b057eac58392ULL, 0xe1dd89fe29744e9dULL, 0xc964f8eb17beb4f8ULL, 0x29571073c9a2d41eULL,
-+ 0xa948a18981c0e254ULL, 0x2df6369b65b22830ULL, 0xa33eb2d75fcfd3c6ULL, 0x078cd6ec4199a01fULL,
-+ 0x4a584a41ad900d2fULL, 0x32142b78e2c74c52ULL, 0x68c4e8338431c978ULL, 0x7f69ea9008689fc2ULL,
-+ 0x52f2c81e46a38265ULL, 0xfd78072d04a832fdULL, 0x8cd7d5fa25359e94ULL, 0x4de71b7454cc29d2ULL,
-+ 0x42eb60ad1eda6ac9ULL, 0x0aad37dfdbc09c3aULL, 0x81004b71e33cc191ULL, 0x44e6be345122803cULL,
-+ 0x03fe8388ba1920dbULL, 0xf5d57c32150db008ULL, 0x49c8c4281af60c29ULL, 0x21edb518de701aeeULL,
-+ 0x7fb63e418f06dc99ULL, 0xa4460d99c166d7b8ULL, 0x24dd5248ce520a83ULL, 0x5ec3ad712b928358ULL,
-+ 0x15022a5fbd17930fULL, 0xa4f64a77d82570e3ULL, 0x12bc8d6915783712ULL, 0x498194c0fc620abbULL,
-+ 0x38a2d9d255686c82ULL, 0x785c6bd9193e21f0ULL, 0xe4d5c81ab24a5484ULL, 0x56307860b2e20989ULL,
-+ 0x429d55f78b4d74c4ULL, 0x22f1834643350131ULL, 0x1e60c24598c71fffULL, 0x59f2f014979983efULL,
-+ 0x46a47d56eb494a44ULL, 0x3e22a854d636a18eULL, 0xb346e15274491c3bULL, 0x2ceafd4e5390cde7ULL,
-+ 0xba8a8538be0d6675ULL, 0x4b9074bb50818e23ULL, 0xcbdab89085d304c3ULL, 0x61a24fe0e56192c4ULL,
-+ 0xcb7615e6db525bcbULL, 0xdd7d8c35a567e4caULL, 0xe6b4153acafcdd69ULL, 0x2d668e097f3c9766ULL,
-+ 0xa57e7e265ce55ef0ULL, 0x5d9f4e527cd4b967ULL, 0xfbc83606492fd1e5ULL, 0x090d52beb7c3f7aeULL,
-+ 0x09b9515a1e7b4d7cULL, 0x1f266a2599da44c0ULL, 0xa1c49548e2c55504ULL, 0x7ef04287126f15ccULL,
-+ 0xfed1659dbd30ef15ULL, 0x8b4ab9eec4e0277bULL, 0x884d6236a5df3291ULL, 0x1fd96ea6bf5cf788ULL,
-+ 0x42a161981f190d9aULL, 0x61d849507e6052c1ULL, 0x9fe113bf285a2cd5ULL, 0x7c22d676dbad85d8ULL,
-+ 0x82e770ed2bfbd27dULL, 0x4c05b2ece996f5a5ULL, 0xcd40a9c2b0900150ULL, 0x5895319213d9bf64ULL,
-+ 0xe7cc5d703fea2e08ULL, 0xb50c491258e2188cULL, 0xcce30baa48205bf0ULL, 0x537c659ccfa32d62ULL,
-+ 0x37b6623a98cfc088ULL, 0xfe9bed1fa4d6aca4ULL, 0x04d29b8e56a8d1b0ULL, 0x725f71c40b519575ULL,
-+ 0x28c7f89cd0339ce6ULL, 0x8367b14469ddc18bULL, 0x883ada83a6a1652cULL, 0x585f1974034d6c17ULL,
-+ 0x89cfb266f1b19188ULL, 0xe63b4863e7c35217ULL, 0xd88c9da6b4c0526aULL, 0x3e035c9df0954635ULL,
-+ 0xdd9d5412fb45de9dULL, 0xdd684532e4cff40dULL, 0x4b5c999b151d671cULL, 0x2d8c2cc811e7f690ULL,
-+ 0x7f54be1d90055d40ULL, 0xa464c5df464aaf40ULL, 0x33979624f0e917beULL, 0x2c018dc527356b30ULL,
-+ 0xa5415024e330b3d4ULL, 0x73ff3d96691652d3ULL, 0x94ec42c4ef9b59f1ULL, 0x0747201618d08e5aULL,
-+ 0x4d6ca48aca411c53ULL, 0x66415f2fcfa66119ULL, 0x9c4dd40051e227ffULL, 0x59810bc09a02f7ebULL,
-+ 0x2a7eb171b3dc101dULL, 0x441c5ab99ffef68eULL, 0x32025c9b93b359eaULL, 0x5e8ce0a71e9d112fULL,
-+ 0xbfcccb92429503fdULL, 0xd271ba752f095d55ULL, 0x345ead5e972d091eULL, 0x18c8df11a83103baULL,
-+ 0x90cd949a9aed0f4cULL, 0xc5d1f4cb6660e37eULL, 0xb8cac52d56c52e0bULL, 0x6e42e400c5808e0dULL,
-+ 0xa3b46966eeaefd23ULL, 0x0c4f1f0be39ecdcaULL, 0x189dc8c9d683a51dULL, 0x51f27f054c09351bULL,
-+ 0x4c487ccd2a320682ULL, 0x587ea95bb3df1c96ULL, 0xc8ccf79e555cb8e8ULL, 0x547dc829a206d73dULL,
-+ 0xb822a6cd80c39b06ULL, 0xe96d54732000d4c6ULL, 0x28535b6f91463b4dULL, 0x228f4660e2486e1dULL,
-+ 0x98799538de8d3abfULL, 0x8cd8330045ebca6eULL, 0x79952a008221e738ULL, 0x4322e1a7535cd2bbULL,
-+ 0xb114c11819d1801cULL, 0x2016e4d84f3f5ec7ULL, 0xdd0e2df409260f4cULL, 0x5ec362c0ae5f7266ULL,
-+ 0xc0462b18b8b2b4eeULL, 0x7cc8d950274d1afbULL, 0xf25f7105436b02d2ULL, 0x43bbf8dcbff9ccd3ULL,
-+ 0xb6ad1767a039e9dfULL, 0xb0714da8f69d3583ULL, 0x5e55fa18b42931f5ULL, 0x4ed5558f33c60961ULL,
-+ 0x1fe37901c647a5ddULL, 0x593ddf1f8081d357ULL, 0x0249a4fd813fd7a6ULL, 0x69acca274e9caf61ULL,
-+ 0x047ba3ea330721c9ULL, 0x83423fc20e7e1ea0ULL, 0x1df4c0af01314a60ULL, 0x09a62dab89289527ULL,
-+ 0xa5b325a49cc6cb00ULL, 0xe94b5dc654b56cb6ULL, 0x3be28779adc994a0ULL, 0x4296e8f8ba3a4aadULL,
-+ 0x328689761e451eabULL, 0x2e4d598bff59594aULL, 0x49b96853d7a7084aULL, 0x4980a319601420a8ULL,
-+ 0x9565b9e12f552c42ULL, 0x8a5318db7100fe96ULL, 0x05c90b4d43add0d7ULL, 0x538b4cd66a5d4edaULL,
-+ 0xf4e94fc3e89f039fULL, 0x592c9af26f618045ULL, 0x08a36eb5fd4b9550ULL, 0x25fffaf6c2ed1419ULL,
-+ 0x34434459cc79d354ULL, 0xeeecbfb4b1d5476bULL, 0xddeb34a061615d99ULL, 0x5129cecceb64b773ULL,
-+ 0xee43215894993520ULL, 0x772f9c7cf14c0b3bULL, 0xd2e2fce306bedad5ULL, 0x715f42b546f06a97ULL,
-+ 0x434ecdceda5b5f1aULL, 0x0da17115a49741a9ULL, 0x680bd77c73edad2eULL, 0x487c02354edd9041ULL,
-+ 0xb8efeff3a70ed9c4ULL, 0x56a32aa3e857e302ULL, 0xdf3a68bd48a2a5a0ULL, 0x07f650b73176c444ULL,
-+ 0xe38b9b1626e0ccb1ULL, 0x79e053c18b09fb36ULL, 0x56d90319c9f94964ULL, 0x1ca941e7ac9ff5c4ULL,
-+ 0x49c4df29162fa0bbULL, 0x8488cf3282b33305ULL, 0x95dfda14cabb437dULL, 0x3391f78264d5ad86ULL,
-+ 0x729ae06ae2b5095dULL, 0xd58a58d73259a946ULL, 0xe9834262d13921edULL, 0x27fedafaa54bb592ULL,
-+ 0xa99dc5b829ad48bbULL, 0x5f025742499ee260ULL, 0x802c8ecd5d7513fdULL, 0x78ceb3ef3f6dd938ULL,
-+ 0xc342f44f8a135d94ULL, 0x7b9edb44828cdda3ULL, 0x9436d11a0537cfe7ULL, 0x5064b164ec1ab4c8ULL,
-+ 0x7020eccfd37eb2fcULL, 0x1f31ea3ed90d25fcULL, 0x1b930d7bdfa1bb34ULL, 0x5344467a48113044ULL,
-+ 0x70073170f25e6dfbULL, 0xe385dc1a50114cc8ULL, 0x2348698ac8fc4f00ULL, 0x2a77a55284dd40d8ULL,
-+ 0xfe06afe0c98c6ce4ULL, 0xc235df96dddfd6e4ULL, 0x1428d01e33bf1ed3ULL, 0x785768ec9300bdafULL,
-+ 0x9702e57a91deb63bULL, 0x61bdb8bfe5ce8b80ULL, 0x645b426f3d1d58acULL, 0x4804a82227a557bcULL,
-+ 0x8e57048ab44d2601ULL, 0x68d6501a4b3a6935ULL, 0xc39c9ec3f9e1c293ULL, 0x4172f257d4de63e2ULL,
-+ 0xd368b450330c6401ULL, 0x040d3017418f2391ULL, 0x2c34bb6090b7d90dULL, 0x16f649228fdfd51fULL,
-+ 0xbea6818e2b928ef5ULL, 0xe28ccf91cdc11e72ULL, 0x594aaa68e77a36cdULL, 0x313034806c7ffd0fULL,
-+ 0x8a9d27ac2249bd65ULL, 0x19a3b464018e9512ULL, 0xc26ccff352b37ec7ULL, 0x056f68341d797b21ULL,
-+ 0x5e79d6757efd2327ULL, 0xfabdbcb6553afe15ULL, 0xd3e7222c6eaf5a60ULL, 0x7046c76d4dae743bULL,
-+ 0x660be872b18d4a55ULL, 0x19992518574e1496ULL, 0xc103053a302bdcbbULL, 0x3ed8e9800b218e8eULL,
-+ 0x7b0b9239fa75e03eULL, 0xefe9fb684633c083ULL, 0x98a35fbe391a7793ULL, 0x6065510fe2d0fe34ULL,
-+ 0x55cb668548abad0cULL, 0xb4584548da87e527ULL, 0x2c43ecea0107c1ddULL, 0x526028809372de35ULL,
-+ 0x3415c56af9213b1fULL, 0x5bee1a4d017e98dbULL, 0x13f6b105b5cf709bULL, 0x5ff20e3482b29ab6ULL,
-+ 0x0aa29c75cc2e6c90ULL, 0xfc7d73ca3a70e206ULL, 0x899fc38fc4b5c515ULL, 0x250386b124ffc207ULL,
-+ 0x54ea28d5ae3d2b56ULL, 0x9913149dd6de60ceULL, 0x16694fc58f06d6c1ULL, 0x46b23975eb018fc7ULL,
-+ 0x470a6a0fb4b7b4e2ULL, 0x5d92475a8f7253deULL, 0xabeee5b52fbd3adbULL, 0x7fa20801a0806968ULL,
-+ 0x76f3faf19f7714d2ULL, 0xb3e840c12f4660c3ULL, 0x0fb4cd8df212744eULL, 0x4b065a251d3a2dd2ULL,
-+ 0x5cebde383d77cd4aULL, 0x6adf39df882c9cb1ULL, 0xa2dd242eb09af759ULL, 0x3147c0e50e5f6422ULL,
-+ 0x164ca5101d1350dbULL, 0xf8d13479c33fc962ULL, 0xe640ce4d13e5da08ULL, 0x4bdee0c45061f8baULL,
-+ 0xd7c46dc1a4edb1c9ULL, 0x5514d7b6437fd98aULL, 0x58942f6bb2a1c00bULL, 0x2dffb2ab1d70710eULL,
-+ 0xccdfcf2fc18b6d68ULL, 0xa8ebcba8b7806167ULL, 0x980697f95e2937e3ULL, 0x02fbba1cd0126e8cULL
-+};
-
--static void curve25519_bmi2_base(u8 session_key[CURVE25519_KEY_SIZE],
-- const u8 private_key[CURVE25519_KEY_SIZE])
-+static void curve25519_ever64_base(u8 *out, const u8 *priv)
- {
-- struct {
-- u64 buffer[4 * NUM_WORDS_ELTFP25519];
-- u64 coordinates[4 * NUM_WORDS_ELTFP25519];
-- u64 workspace[4 * NUM_WORDS_ELTFP25519];
-- u8 private[CURVE25519_KEY_SIZE];
-- } __aligned(32) m;
--
-- const int ite[4] = { 64, 64, 64, 63 };
-- const int q = 3;
- u64 swap = 1;
--
-- int i = 0, j = 0, k = 0;
-- u64 *const key = (u64 *)m.private;
-- u64 *const Ur1 = m.coordinates + 0;
-- u64 *const Zr1 = m.coordinates + 4;
-- u64 *const Ur2 = m.coordinates + 8;
-- u64 *const Zr2 = m.coordinates + 12;
--
-- u64 *const UZr1 = m.coordinates + 0;
-- u64 *const ZUr2 = m.coordinates + 8;
--
-- u64 *const A = m.workspace + 0;
-- u64 *const B = m.workspace + 4;
-- u64 *const C = m.workspace + 8;
-- u64 *const D = m.workspace + 12;
--
-- u64 *const AB = m.workspace + 0;
-- u64 *const CD = m.workspace + 8;
--
-- const u64 *const P = table_ladder_8k;
--
-- memcpy(m.private, private_key, sizeof(m.private));
--
-- curve25519_clamp_secret(m.private);
--
-- setzero_eltfp25519_1w(Ur1);
-- setzero_eltfp25519_1w(Zr1);
-- setzero_eltfp25519_1w(Zr2);
-- Ur1[0] = 1;
-- Zr1[0] = 1;
-- Zr2[0] = 1;
--
-- /* G-S */
-- Ur2[3] = 0x1eaecdeee27cab34UL;
-- Ur2[2] = 0xadc7a0b9235d48e2UL;
-- Ur2[1] = 0xbbf095ae14b2edf8UL;
-- Ur2[0] = 0x7e94e1fec82faabdUL;
--
-- /* main-loop */
-- j = q;
-- for (i = 0; i < NUM_WORDS_ELTFP25519; ++i) {
-- while (j < ite[i]) {
-- u64 bit = (key[i] >> j) & 0x1;
-- k = (64 * i + j - q);
-+ int i, j, k;
-+ u64 tmp[16 + 32 + 4];
-+ u64 *x1 = &tmp[0];
-+ u64 *z1 = &tmp[4];
-+ u64 *x2 = &tmp[8];
-+ u64 *z2 = &tmp[12];
-+ u64 *xz1 = &tmp[0];
-+ u64 *xz2 = &tmp[8];
-+ u64 *a = &tmp[0 + 16];
-+ u64 *b = &tmp[4 + 16];
-+ u64 *c = &tmp[8 + 16];
-+ u64 *ab = &tmp[0 + 16];
-+ u64 *abcd = &tmp[0 + 16];
-+ u64 *ef = &tmp[16 + 16];
-+ u64 *efgh = &tmp[16 + 16];
-+ u64 *key = &tmp[0 + 16 + 32];
-+
-+ memcpy(key, priv, 32);
-+ ((u8 *)key)[0] &= 248;
-+ ((u8 *)key)[31] = (((u8 *)key)[31] & 127) | 64;
-+
-+ x1[0] = 1, x1[1] = x1[2] = x1[3] = 0;
-+ z1[0] = 1, z1[1] = z1[2] = z1[3] = 0;
-+ z2[0] = 1, z2[1] = z2[2] = z2[3] = 0;
-+ memcpy(x2, p_minus_s, sizeof(p_minus_s));
-+
-+ j = 3;
-+ for (i = 0; i < 4; ++i) {
-+ while (j < (const int[]){ 64, 64, 64, 63 }[i]) {
-+ u64 bit = (key[i] >> j) & 1;
-+ k = (64 * i + j - 3);
- swap = swap ^ bit;
-- cswap(swap, Ur1, Ur2);
-- cswap(swap, Zr1, Zr2);
-+ cswap2(swap, xz1, xz2);
- swap = bit;
-- /* Addition */
-- sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-- add_eltfp25519_1w_bmi2(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-- mul_eltfp25519_1w_bmi2(C, &P[4 * k], B);/* C = M0-B */
-- sub_eltfp25519_1w(B, A, C); /* B = (Ur1+Zr1) - M*(Ur1-Zr1) */
-- add_eltfp25519_1w_bmi2(A, A, C); /* A = (Ur1+Zr1) + M*(Ur1-Zr1) */
-- sqr_eltfp25519_2w_bmi2(AB); /* A = A^2 | B = B^2 */
-- mul_eltfp25519_2w_bmi2(UZr1, ZUr2, AB); /* Ur1 = Zr2*A | Zr1 = Ur2*B */
-+ fsub(b, x1, z1);
-+ fadd(a, x1, z1);
-+ fmul(c, &table_ladder[4 * k], b, ef);
-+ fsub(b, a, c);
-+ fadd(a, a, c);
-+ fsqr2(ab, ab, efgh);
-+ fmul2(xz1, xz2, ab, efgh);
- ++j;
- }
- j = 0;
- }
-
-- /* Doubling */
-- for (i = 0; i < q; ++i) {
-- add_eltfp25519_1w_bmi2(A, Ur1, Zr1); /* A = Ur1+Zr1 */
-- sub_eltfp25519_1w(B, Ur1, Zr1); /* B = Ur1-Zr1 */
-- sqr_eltfp25519_2w_bmi2(AB); /* A = A**2 B = B**2 */
-- copy_eltfp25519_1w(C, B); /* C = B */
-- sub_eltfp25519_1w(B, A, B); /* B = A-B */
-- mul_a24_eltfp25519_1w(D, B); /* D = my_a24*B */
-- add_eltfp25519_1w_bmi2(D, D, C); /* D = D+C */
-- mul_eltfp25519_2w_bmi2(UZr1, AB, CD); /* Ur1 = A*B Zr1 = Zr1*A */
-- }
--
-- /* Convert to affine coordinates */
-- inv_eltfp25519_1w_bmi2(A, Zr1);
-- mul_eltfp25519_1w_bmi2((u64 *)session_key, Ur1, A);
-- fred_eltfp25519_1w((u64 *)session_key);
-+ point_double(xz1, abcd, efgh);
-+ point_double(xz1, abcd, efgh);
-+ point_double(xz1, abcd, efgh);
-+ encode_point(out, xz1);
-
-- memzero_explicit(&m, sizeof(m));
-+ memzero_explicit(tmp, sizeof(tmp));
- }
-
-+static __ro_after_init DEFINE_STATIC_KEY_FALSE(curve25519_use_bmi2_adx);
-+
- void curve25519_arch(u8 mypublic[CURVE25519_KEY_SIZE],
- const u8 secret[CURVE25519_KEY_SIZE],
- const u8 basepoint[CURVE25519_KEY_SIZE])
- {
-- if (static_branch_likely(&curve25519_use_adx))
-- curve25519_adx(mypublic, secret, basepoint);
-- else if (static_branch_likely(&curve25519_use_bmi2))
-- curve25519_bmi2(mypublic, secret, basepoint);
-+ if (static_branch_likely(&curve25519_use_bmi2_adx))
-+ curve25519_ever64(mypublic, secret, basepoint);
- else
- curve25519_generic(mypublic, secret, basepoint);
- }
-@@ -2355,10 +1395,8 @@ EXPORT_SYMBOL(curve25519_arch);
- void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
- const u8 secret[CURVE25519_KEY_SIZE])
- {
-- if (static_branch_likely(&curve25519_use_adx))
-- curve25519_adx_base(pub, secret);
-- else if (static_branch_likely(&curve25519_use_bmi2))
-- curve25519_bmi2_base(pub, secret);
-+ if (static_branch_likely(&curve25519_use_bmi2_adx))
-+ curve25519_ever64_base(pub, secret);
- else
- curve25519_generic(pub, secret, curve25519_base_point);
- }
-@@ -2449,12 +1487,11 @@ static struct kpp_alg curve25519_alg = {
- .max_size = curve25519_max_size,
- };
-
-+
- static int __init curve25519_mod_init(void)
- {
-- if (boot_cpu_has(X86_FEATURE_BMI2))
-- static_branch_enable(&curve25519_use_bmi2);
-- else if (boot_cpu_has(X86_FEATURE_ADX))
-- static_branch_enable(&curve25519_use_adx);
-+ if (boot_cpu_has(X86_FEATURE_BMI2) && boot_cpu_has(X86_FEATURE_ADX))
-+ static_branch_enable(&curve25519_use_bmi2_adx);
- else
- return 0;
- return IS_REACHABLE(CONFIG_CRYPTO_KPP) ?
-@@ -2474,3 +1511,4 @@ module_exit(curve25519_mod_exit);
- MODULE_ALIAS_CRYPTO("curve25519");
- MODULE_ALIAS_CRYPTO("curve25519-x86");
- MODULE_LICENSE("GPL v2");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0055-crypto-x86-curve25519-leave-r12-as-spare-register.patch b/target/linux/generic/backport-5.4/080-wireguard-0055-crypto-x86-curve25519-leave-r12-as-spare-register.patch
deleted file mode 100644
index d5b11e0d36..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0055-crypto-x86-curve25519-leave-r12-as-spare-register.patch
+++ /dev/null
@@ -1,376 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 1 Mar 2020 16:06:56 +0800
-Subject: [PATCH] crypto: x86/curve25519 - leave r12 as spare register
-
-commit dc7fc3a53ae158263196b1892b672aedf67796c5 upstream.
-
-This updates to the newer register selection proved by HACL*, which
-leads to a more compact instruction encoding, and saves around 100
-cycles.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/curve25519-x86_64.c | 110 ++++++++++++++--------------
- 1 file changed, 55 insertions(+), 55 deletions(-)
-
---- a/arch/x86/crypto/curve25519-x86_64.c
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -167,28 +167,28 @@ static inline void fmul(u64 *out, const
- " movq 0(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 8(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 16(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 16(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 16(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 24(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 24(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 24(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 32(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 40(%0);" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 32(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 40(%0);" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 56(%0);"
- /* Line up pointers */
-@@ -202,11 +202,11 @@ static inline void fmul(u64 *out, const
- " mulxq 32(%1), %%r8, %%r13;"
- " xor %3, %3;"
- " adoxq 0(%1), %%r8;"
-- " mulxq 40(%1), %%r9, %%r12;"
-+ " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 8(%1), %%r9;"
- " mulxq 48(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 16(%1), %%r10;"
- " mulxq 56(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -231,7 +231,7 @@ static inline void fmul(u64 *out, const
- " movq %%r8, 0(%0);"
- : "+&r" (tmp), "+&r" (f1), "+&r" (out), "+&r" (f2)
- :
-- : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "memory", "cc"
-+ : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%rbx", "%r13", "%r14", "memory", "cc"
- );
- }
-
-@@ -248,28 +248,28 @@ static inline void fmul2(u64 *out, const
- " movq 0(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 8(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 16(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 16(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 16(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 24(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 24(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 24(%1), %%rdx;"
- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 32(%0);"
-- " mulxq 16(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 40(%0);" " mov $0, %%r8;"
-+ " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 32(%0);"
-+ " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 40(%0);" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 56(%0);"
-
-@@ -279,28 +279,28 @@ static inline void fmul2(u64 *out, const
- " movq 32(%1), %%rdx;"
- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 64(%0);"
- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 72(%0);"
-- " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;"
-+ " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 40(%1), %%rdx;"
- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 72(%0), %%r8;" " movq %%r8, 72(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 80(%0);"
-- " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 80(%0);"
-+ " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 48(%1), %%rdx;"
- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 80(%0), %%r8;" " movq %%r8, 80(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 88(%0);"
-- " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " mov $0, %%r8;"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 88(%0);"
-+ " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 56(%1), %%rdx;"
- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 88(%0), %%r8;" " movq %%r8, 88(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%r12, %%r10;" " movq %%r10, 96(%0);"
-- " mulxq 48(%3), %%r12, %%r13;" " adox %%r11, %%r12;" " adcx %%r14, %%r12;" " movq %%r12, 104(%0);" " mov $0, %%r8;"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 96(%0);"
-+ " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 104(%0);" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 112(%0);" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 120(%0);"
- /* Line up pointers */
-@@ -314,11 +314,11 @@ static inline void fmul2(u64 *out, const
- " mulxq 32(%1), %%r8, %%r13;"
- " xor %3, %3;"
- " adoxq 0(%1), %%r8;"
-- " mulxq 40(%1), %%r9, %%r12;"
-+ " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 8(%1), %%r9;"
- " mulxq 48(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 16(%1), %%r10;"
- " mulxq 56(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -347,11 +347,11 @@ static inline void fmul2(u64 *out, const
- " mulxq 96(%1), %%r8, %%r13;"
- " xor %3, %3;"
- " adoxq 64(%1), %%r8;"
-- " mulxq 104(%1), %%r9, %%r12;"
-+ " mulxq 104(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 72(%1), %%r9;"
- " mulxq 112(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 80(%1), %%r10;"
- " mulxq 120(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -376,7 +376,7 @@ static inline void fmul2(u64 *out, const
- " movq %%r8, 32(%0);"
- : "+&r" (tmp), "+&r" (f1), "+&r" (out), "+&r" (f2)
- :
-- : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "memory", "cc"
-+ : "%rax", "%rdx", "%r8", "%r9", "%r10", "%r11", "%rbx", "%r13", "%r14", "memory", "cc"
- );
- }
-
-@@ -388,11 +388,11 @@ static inline void fmul_scalar(u64 *out,
- asm volatile(
- /* Compute the raw multiplication of f1*f2 */
- " mulxq 0(%2), %%r8, %%rcx;" /* f1[0]*f2 */
-- " mulxq 8(%2), %%r9, %%r12;" /* f1[1]*f2 */
-+ " mulxq 8(%2), %%r9, %%rbx;" /* f1[1]*f2 */
- " add %%rcx, %%r9;"
- " mov $0, %%rcx;"
- " mulxq 16(%2), %%r10, %%r13;" /* f1[2]*f2 */
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " mulxq 24(%2), %%r11, %%rax;" /* f1[3]*f2 */
- " adcx %%r13, %%r11;"
- " adcx %%rcx, %%rax;"
-@@ -419,7 +419,7 @@ static inline void fmul_scalar(u64 *out,
- " movq %%r8, 0(%1);"
- : "+&r" (f2_r)
- : "r" (out), "r" (f1)
-- : "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "memory", "cc"
-+ : "%rax", "%rcx", "%r8", "%r9", "%r10", "%r11", "%rbx", "%r13", "memory", "cc"
- );
- }
-
-@@ -520,8 +520,8 @@ static inline void fsqr(u64 *out, const
- " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 24(%1), %%rdx;" /* f[3] */
-- " mulxq 8(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-- " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " mulxq 8(%1), %%r11, %%rbx;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%rbx;" /* f[2]*f[3] */
- " movq 8(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
- " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
-@@ -531,12 +531,12 @@ static inline void fsqr(u64 *out, const
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
- " adcx %%r9, %%r9;"
-- " adox %%r15, %%r12;"
-+ " adox %%r15, %%rbx;"
- " adcx %%r10, %%r10;"
- " adox %%r15, %%r13;"
- " adcx %%r11, %%r11;"
- " adox %%r15, %%r14;"
-- " adcx %%r12, %%r12;"
-+ " adcx %%rbx, %%rbx;"
- " adcx %%r13, %%r13;"
- " adcx %%r14, %%r14;"
-
-@@ -549,7 +549,7 @@ static inline void fsqr(u64 *out, const
- " adcx %%rcx, %%r10;" " movq %%r10, 24(%0);"
- " movq 16(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
- " adcx %%rax, %%r11;" " movq %%r11, 32(%0);"
-- " adcx %%rcx, %%r12;" " movq %%r12, 40(%0);"
-+ " adcx %%rcx, %%rbx;" " movq %%rbx, 40(%0);"
- " movq 24(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
- " adcx %%rax, %%r13;" " movq %%r13, 48(%0);"
- " adcx %%rcx, %%r14;" " movq %%r14, 56(%0);"
-@@ -565,11 +565,11 @@ static inline void fsqr(u64 *out, const
- " mulxq 32(%1), %%r8, %%r13;"
- " xor %%rcx, %%rcx;"
- " adoxq 0(%1), %%r8;"
-- " mulxq 40(%1), %%r9, %%r12;"
-+ " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 8(%1), %%r9;"
- " mulxq 48(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 16(%1), %%r10;"
- " mulxq 56(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -594,7 +594,7 @@ static inline void fsqr(u64 *out, const
- " movq %%r8, 0(%0);"
- : "+&r" (tmp), "+&r" (f), "+&r" (out)
- :
-- : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "memory", "cc"
-+ : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%rbx", "%r13", "%r14", "%r15", "memory", "cc"
- );
- }
-
-@@ -611,8 +611,8 @@ static inline void fsqr2(u64 *out, const
- " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 24(%1), %%rdx;" /* f[3] */
-- " mulxq 8(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-- " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " mulxq 8(%1), %%r11, %%rbx;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 16(%1), %%rax, %%r13;" " adcx %%rax, %%rbx;" /* f[2]*f[3] */
- " movq 8(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
- " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
-@@ -622,12 +622,12 @@ static inline void fsqr2(u64 *out, const
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
- " adcx %%r9, %%r9;"
-- " adox %%r15, %%r12;"
-+ " adox %%r15, %%rbx;"
- " adcx %%r10, %%r10;"
- " adox %%r15, %%r13;"
- " adcx %%r11, %%r11;"
- " adox %%r15, %%r14;"
-- " adcx %%r12, %%r12;"
-+ " adcx %%rbx, %%rbx;"
- " adcx %%r13, %%r13;"
- " adcx %%r14, %%r14;"
-
-@@ -640,7 +640,7 @@ static inline void fsqr2(u64 *out, const
- " adcx %%rcx, %%r10;" " movq %%r10, 24(%0);"
- " movq 16(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
- " adcx %%rax, %%r11;" " movq %%r11, 32(%0);"
-- " adcx %%rcx, %%r12;" " movq %%r12, 40(%0);"
-+ " adcx %%rcx, %%rbx;" " movq %%rbx, 40(%0);"
- " movq 24(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
- " adcx %%rax, %%r13;" " movq %%r13, 48(%0);"
- " adcx %%rcx, %%r14;" " movq %%r14, 56(%0);"
-@@ -651,8 +651,8 @@ static inline void fsqr2(u64 *out, const
- " mulxq 48(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 56(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 56(%1), %%rdx;" /* f[3] */
-- " mulxq 40(%1), %%r11, %%r12;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-- " mulxq 48(%1), %%rax, %%r13;" " adcx %%rax, %%r12;" /* f[2]*f[3] */
-+ " mulxq 40(%1), %%r11, %%rbx;" " adcx %%rcx, %%r11;" /* f[1]*f[3] */
-+ " mulxq 48(%1), %%rax, %%r13;" " adcx %%rax, %%rbx;" /* f[2]*f[3] */
- " movq 40(%1), %%rdx;" " adcx %%r15, %%r13;" /* f1 */
- " mulxq 48(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
-@@ -662,12 +662,12 @@ static inline void fsqr2(u64 *out, const
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
- " adcx %%r9, %%r9;"
-- " adox %%r15, %%r12;"
-+ " adox %%r15, %%rbx;"
- " adcx %%r10, %%r10;"
- " adox %%r15, %%r13;"
- " adcx %%r11, %%r11;"
- " adox %%r15, %%r14;"
-- " adcx %%r12, %%r12;"
-+ " adcx %%rbx, %%rbx;"
- " adcx %%r13, %%r13;"
- " adcx %%r14, %%r14;"
-
-@@ -680,7 +680,7 @@ static inline void fsqr2(u64 *out, const
- " adcx %%rcx, %%r10;" " movq %%r10, 88(%0);"
- " movq 48(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[2]^2 */
- " adcx %%rax, %%r11;" " movq %%r11, 96(%0);"
-- " adcx %%rcx, %%r12;" " movq %%r12, 104(%0);"
-+ " adcx %%rcx, %%rbx;" " movq %%rbx, 104(%0);"
- " movq 56(%1), %%rdx;" " mulx %%rdx, %%rax, %%rcx;" /* f[3]^2 */
- " adcx %%rax, %%r13;" " movq %%r13, 112(%0);"
- " adcx %%rcx, %%r14;" " movq %%r14, 120(%0);"
-@@ -694,11 +694,11 @@ static inline void fsqr2(u64 *out, const
- " mulxq 32(%1), %%r8, %%r13;"
- " xor %%rcx, %%rcx;"
- " adoxq 0(%1), %%r8;"
-- " mulxq 40(%1), %%r9, %%r12;"
-+ " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 8(%1), %%r9;"
- " mulxq 48(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 16(%1), %%r10;"
- " mulxq 56(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -727,11 +727,11 @@ static inline void fsqr2(u64 *out, const
- " mulxq 96(%1), %%r8, %%r13;"
- " xor %%rcx, %%rcx;"
- " adoxq 64(%1), %%r8;"
-- " mulxq 104(%1), %%r9, %%r12;"
-+ " mulxq 104(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
- " adoxq 72(%1), %%r9;"
- " mulxq 112(%1), %%r10, %%r13;"
-- " adcx %%r12, %%r10;"
-+ " adcx %%rbx, %%r10;"
- " adoxq 80(%1), %%r10;"
- " mulxq 120(%1), %%r11, %%rax;"
- " adcx %%r13, %%r11;"
-@@ -756,7 +756,7 @@ static inline void fsqr2(u64 *out, const
- " movq %%r8, 32(%0);"
- : "+&r" (tmp), "+&r" (f), "+&r" (out)
- :
-- : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "memory", "cc"
-+ : "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%rbx", "%r13", "%r14", "%r15", "memory", "cc"
- );
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0056-crypto-arm-64-poly1305-add-artifact-to-.gitignore-fi.patch b/target/linux/generic/backport-5.4/080-wireguard-0056-crypto-arm-64-poly1305-add-artifact-to-.gitignore-fi.patch
deleted file mode 100644
index 655371630c..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0056-crypto-arm-64-poly1305-add-artifact-to-.gitignore-fi.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 19 Mar 2020 11:56:17 -0600
-Subject: [PATCH] crypto: arm[64]/poly1305 - add artifact to .gitignore files
-
-commit 6e4e00d8b68ca7eb30d08afb740033e0d36abe55 upstream.
-
-The .S_shipped yields a .S, and the pattern in these directories is to
-add that to .gitignore so that git-status doesn't raise a fuss.
-
-Fixes: a6b803b3ddc7 ("crypto: arm/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation")
-Fixes: f569ca164751 ("crypto: arm64/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation")
-Reported-by: Emil Renner Berthing <kernel@esmil.dk>
-Cc: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/.gitignore | 1 +
- arch/arm64/crypto/.gitignore | 1 +
- 2 files changed, 2 insertions(+)
-
---- a/arch/arm/crypto/.gitignore
-+++ b/arch/arm/crypto/.gitignore
-@@ -1,3 +1,4 @@
- aesbs-core.S
- sha256-core.S
- sha512-core.S
-+poly1305-core.S
---- a/arch/arm64/crypto/.gitignore
-+++ b/arch/arm64/crypto/.gitignore
-@@ -1,2 +1,3 @@
- sha256-core.S
- sha512-core.S
-+poly1305-core.S
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0057-crypto-arch-lib-limit-simd-usage-to-4k-chunks.patch b/target/linux/generic/backport-5.4/080-wireguard-0057-crypto-arch-lib-limit-simd-usage-to-4k-chunks.patch
deleted file mode 100644
index f8828f243e..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0057-crypto-arch-lib-limit-simd-usage-to-4k-chunks.patch
+++ /dev/null
@@ -1,243 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 23 Apr 2020 15:54:04 -0600
-Subject: [PATCH] crypto: arch/lib - limit simd usage to 4k chunks
-
-commit 706024a52c614b478b63f7728d202532ce6591a9 upstream.
-
-The initial Zinc patchset, after some mailing list discussion, contained
-code to ensure that kernel_fpu_enable would not be kept on for more than
-a 4k chunk, since it disables preemption. The choice of 4k isn't totally
-scientific, but it's not a bad guess either, and it's what's used in
-both the x86 poly1305, blake2s, and nhpoly1305 code already (in the form
-of PAGE_SIZE, which this commit corrects to be explicitly 4k for the
-former two).
-
-Ard did some back of the envelope calculations and found that
-at 5 cycles/byte (overestimate) on a 1ghz processor (pretty slow), 4k
-means we have a maximum preemption disabling of 20us, which Sebastian
-confirmed was probably a good limit.
-
-Unfortunately the chunking appears to have been left out of the final
-patchset that added the glue code. So, this commit adds it back in.
-
-Fixes: 84e03fa39fbe ("crypto: x86/chacha - expose SIMD ChaCha routine as library function")
-Fixes: b3aad5bad26a ("crypto: arm64/chacha - expose arm64 ChaCha routine as library function")
-Fixes: a44a3430d71b ("crypto: arm/chacha - expose ARM ChaCha routine as library function")
-Fixes: d7d7b8535662 ("crypto: x86/poly1305 - wire up faster implementations for kernel")
-Fixes: f569ca164751 ("crypto: arm64/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation")
-Fixes: a6b803b3ddc7 ("crypto: arm/poly1305 - incorporate OpenSSL/CRYPTOGAMS NEON implementation")
-Fixes: ed0356eda153 ("crypto: blake2s - x86_64 SIMD implementation")
-Cc: Eric Biggers <ebiggers@google.com>
-Cc: Ard Biesheuvel <ardb@kernel.org>
-Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-glue.c | 14 +++++++++++---
- arch/arm/crypto/poly1305-glue.c | 15 +++++++++++----
- arch/arm64/crypto/chacha-neon-glue.c | 14 +++++++++++---
- arch/arm64/crypto/poly1305-glue.c | 15 +++++++++++----
- arch/x86/crypto/blake2s-glue.c | 10 ++++------
- arch/x86/crypto/chacha_glue.c | 14 +++++++++++---
- arch/x86/crypto/poly1305_glue.c | 13 ++++++-------
- 7 files changed, 65 insertions(+), 30 deletions(-)
-
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -91,9 +91,17 @@ void chacha_crypt_arch(u32 *state, u8 *d
- return;
- }
-
-- kernel_neon_begin();
-- chacha_doneon(state, dst, src, bytes, nrounds);
-- kernel_neon_end();
-+ do {
-+ unsigned int todo = min_t(unsigned int, bytes, SZ_4K);
-+
-+ kernel_neon_begin();
-+ chacha_doneon(state, dst, src, todo, nrounds);
-+ kernel_neon_end();
-+
-+ bytes -= todo;
-+ src += todo;
-+ dst += todo;
-+ } while (bytes);
- }
- EXPORT_SYMBOL(chacha_crypt_arch);
-
---- a/arch/arm/crypto/poly1305-glue.c
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -160,13 +160,20 @@ void poly1305_update_arch(struct poly130
- unsigned int len = round_down(nbytes, POLY1305_BLOCK_SIZE);
-
- if (static_branch_likely(&have_neon) && do_neon) {
-- kernel_neon_begin();
-- poly1305_blocks_neon(&dctx->h, src, len, 1);
-- kernel_neon_end();
-+ do {
-+ unsigned int todo = min_t(unsigned int, len, SZ_4K);
-+
-+ kernel_neon_begin();
-+ poly1305_blocks_neon(&dctx->h, src, todo, 1);
-+ kernel_neon_end();
-+
-+ len -= todo;
-+ src += todo;
-+ } while (len);
- } else {
- poly1305_blocks_arm(&dctx->h, src, len, 1);
-+ src += len;
- }
-- src += len;
- nbytes %= POLY1305_BLOCK_SIZE;
- }
-
---- a/arch/arm64/crypto/chacha-neon-glue.c
-+++ b/arch/arm64/crypto/chacha-neon-glue.c
-@@ -87,9 +87,17 @@ void chacha_crypt_arch(u32 *state, u8 *d
- !crypto_simd_usable())
- return chacha_crypt_generic(state, dst, src, bytes, nrounds);
-
-- kernel_neon_begin();
-- chacha_doneon(state, dst, src, bytes, nrounds);
-- kernel_neon_end();
-+ do {
-+ unsigned int todo = min_t(unsigned int, bytes, SZ_4K);
-+
-+ kernel_neon_begin();
-+ chacha_doneon(state, dst, src, todo, nrounds);
-+ kernel_neon_end();
-+
-+ bytes -= todo;
-+ src += todo;
-+ dst += todo;
-+ } while (bytes);
- }
- EXPORT_SYMBOL(chacha_crypt_arch);
-
---- a/arch/arm64/crypto/poly1305-glue.c
-+++ b/arch/arm64/crypto/poly1305-glue.c
-@@ -143,13 +143,20 @@ void poly1305_update_arch(struct poly130
- unsigned int len = round_down(nbytes, POLY1305_BLOCK_SIZE);
-
- if (static_branch_likely(&have_neon) && crypto_simd_usable()) {
-- kernel_neon_begin();
-- poly1305_blocks_neon(&dctx->h, src, len, 1);
-- kernel_neon_end();
-+ do {
-+ unsigned int todo = min_t(unsigned int, len, SZ_4K);
-+
-+ kernel_neon_begin();
-+ poly1305_blocks_neon(&dctx->h, src, todo, 1);
-+ kernel_neon_end();
-+
-+ len -= todo;
-+ src += todo;
-+ } while (len);
- } else {
- poly1305_blocks(&dctx->h, src, len, 1);
-+ src += len;
- }
-- src += len;
- nbytes %= POLY1305_BLOCK_SIZE;
- }
-
---- a/arch/x86/crypto/blake2s-glue.c
-+++ b/arch/x86/crypto/blake2s-glue.c
-@@ -32,16 +32,16 @@ void blake2s_compress_arch(struct blake2
- const u32 inc)
- {
- /* SIMD disables preemption, so relax after processing each page. */
-- BUILD_BUG_ON(PAGE_SIZE / BLAKE2S_BLOCK_SIZE < 8);
-+ BUILD_BUG_ON(SZ_4K / BLAKE2S_BLOCK_SIZE < 8);
-
- if (!static_branch_likely(&blake2s_use_ssse3) || !crypto_simd_usable()) {
- blake2s_compress_generic(state, block, nblocks, inc);
- return;
- }
-
-- for (;;) {
-+ do {
- const size_t blocks = min_t(size_t, nblocks,
-- PAGE_SIZE / BLAKE2S_BLOCK_SIZE);
-+ SZ_4K / BLAKE2S_BLOCK_SIZE);
-
- kernel_fpu_begin();
- if (IS_ENABLED(CONFIG_AS_AVX512) &&
-@@ -52,10 +52,8 @@ void blake2s_compress_arch(struct blake2
- kernel_fpu_end();
-
- nblocks -= blocks;
-- if (!nblocks)
-- break;
- block += blocks * BLAKE2S_BLOCK_SIZE;
-- }
-+ } while (nblocks);
- }
- EXPORT_SYMBOL(blake2s_compress_arch);
-
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -154,9 +154,17 @@ void chacha_crypt_arch(u32 *state, u8 *d
- bytes <= CHACHA_BLOCK_SIZE)
- return chacha_crypt_generic(state, dst, src, bytes, nrounds);
-
-- kernel_fpu_begin();
-- chacha_dosimd(state, dst, src, bytes, nrounds);
-- kernel_fpu_end();
-+ do {
-+ unsigned int todo = min_t(unsigned int, bytes, SZ_4K);
-+
-+ kernel_fpu_begin();
-+ chacha_dosimd(state, dst, src, todo, nrounds);
-+ kernel_fpu_end();
-+
-+ bytes -= todo;
-+ src += todo;
-+ dst += todo;
-+ } while (bytes);
- }
- EXPORT_SYMBOL(chacha_crypt_arch);
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -91,8 +91,8 @@ static void poly1305_simd_blocks(void *c
- struct poly1305_arch_internal *state = ctx;
-
- /* SIMD disables preemption, so relax after processing each page. */
-- BUILD_BUG_ON(PAGE_SIZE < POLY1305_BLOCK_SIZE ||
-- PAGE_SIZE % POLY1305_BLOCK_SIZE);
-+ BUILD_BUG_ON(SZ_4K < POLY1305_BLOCK_SIZE ||
-+ SZ_4K % POLY1305_BLOCK_SIZE);
-
- if (!IS_ENABLED(CONFIG_AS_AVX) || !static_branch_likely(&poly1305_use_avx) ||
- (len < (POLY1305_BLOCK_SIZE * 18) && !state->is_base2_26) ||
-@@ -102,8 +102,8 @@ static void poly1305_simd_blocks(void *c
- return;
- }
-
-- for (;;) {
-- const size_t bytes = min_t(size_t, len, PAGE_SIZE);
-+ do {
-+ const size_t bytes = min_t(size_t, len, SZ_4K);
-
- kernel_fpu_begin();
- if (IS_ENABLED(CONFIG_AS_AVX512) && static_branch_likely(&poly1305_use_avx512))
-@@ -113,11 +113,10 @@ static void poly1305_simd_blocks(void *c
- else
- poly1305_blocks_avx(ctx, inp, bytes, padbit);
- kernel_fpu_end();
-+
- len -= bytes;
-- if (!len)
-- break;
- inp += bytes;
-- }
-+ } while (len);
- }
-
- static void poly1305_simd_emit(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0058-crypto-lib-chacha20poly1305-Add-missing-function-dec.patch b/target/linux/generic/backport-5.4/080-wireguard-0058-crypto-lib-chacha20poly1305-Add-missing-function-dec.patch
deleted file mode 100644
index 736147f934..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0058-crypto-lib-chacha20poly1305-Add-missing-function-dec.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Herbert Xu <herbert@gondor.apana.org.au>
-Date: Wed, 8 Jul 2020 12:41:13 +1000
-Subject: [PATCH] crypto: lib/chacha20poly1305 - Add missing function
- declaration
-
-commit 06cc2afbbdf9a9e8df3e2f8db724997dd6e1b4ac upstream.
-
-This patch adds a declaration for chacha20poly1305_selftest to
-silence a sparse warning.
-
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/crypto/chacha20poly1305.h | 2 ++
- lib/crypto/chacha20poly1305.c | 2 --
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
---- a/include/crypto/chacha20poly1305.h
-+++ b/include/crypto/chacha20poly1305.h
-@@ -45,4 +45,6 @@ bool chacha20poly1305_decrypt_sg_inplace
- const u64 nonce,
- const u8 key[CHACHA20POLY1305_KEY_SIZE]);
-
-+bool chacha20poly1305_selftest(void);
-+
- #endif /* __CHACHA20POLY1305_H */
---- a/lib/crypto/chacha20poly1305.c
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -21,8 +21,6 @@
-
- #define CHACHA_KEY_WORDS (CHACHA_KEY_SIZE / sizeof(u32))
-
--bool __init chacha20poly1305_selftest(void);
--
- static void chacha_load_key(u32 *k, const u8 *in)
- {
- k[0] = get_unaligned_le32(in);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0059-crypto-x86-chacha-sse3-use-unaligned-loads-for-state.patch b/target/linux/generic/backport-5.4/080-wireguard-0059-crypto-x86-chacha-sse3-use-unaligned-loads-for-state.patch
deleted file mode 100644
index 52847877f6..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0059-crypto-x86-chacha-sse3-use-unaligned-loads-for-state.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Wed, 8 Jul 2020 12:11:18 +0300
-Subject: [PATCH] crypto: x86/chacha-sse3 - use unaligned loads for state array
-
-commit e79a31715193686e92dadb4caedfbb1f5de3659c upstream.
-
-Due to the fact that the x86 port does not support allocating objects
-on the stack with an alignment that exceeds 8 bytes, we have a rather
-ugly hack in the x86 code for ChaCha to ensure that the state array is
-aligned to 16 bytes, allowing the SSE3 implementation of the algorithm
-to use aligned loads.
-
-Given that the performance benefit of using of aligned loads appears to
-be limited (~0.25% for 1k blocks using tcrypt on a Corei7-8650U), and
-the fact that this hack has leaked into generic ChaCha code, let's just
-remove it.
-
-Cc: Martin Willi <martin@strongswan.org>
-Cc: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: Eric Biggers <ebiggers@kernel.org>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Reviewed-by: Martin Willi <martin@strongswan.org>
-Reviewed-by: Eric Biggers <ebiggers@google.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/chacha-ssse3-x86_64.S | 16 ++++++++--------
- arch/x86/crypto/chacha_glue.c | 17 ++---------------
- include/crypto/chacha.h | 4 ----
- 3 files changed, 10 insertions(+), 27 deletions(-)
-
---- a/arch/x86/crypto/chacha-ssse3-x86_64.S
-+++ b/arch/x86/crypto/chacha-ssse3-x86_64.S
-@@ -120,10 +120,10 @@ ENTRY(chacha_block_xor_ssse3)
- FRAME_BEGIN
-
- # x0..3 = s0..3
-- movdqa 0x00(%rdi),%xmm0
-- movdqa 0x10(%rdi),%xmm1
-- movdqa 0x20(%rdi),%xmm2
-- movdqa 0x30(%rdi),%xmm3
-+ movdqu 0x00(%rdi),%xmm0
-+ movdqu 0x10(%rdi),%xmm1
-+ movdqu 0x20(%rdi),%xmm2
-+ movdqu 0x30(%rdi),%xmm3
- movdqa %xmm0,%xmm8
- movdqa %xmm1,%xmm9
- movdqa %xmm2,%xmm10
-@@ -205,10 +205,10 @@ ENTRY(hchacha_block_ssse3)
- # %edx: nrounds
- FRAME_BEGIN
-
-- movdqa 0x00(%rdi),%xmm0
-- movdqa 0x10(%rdi),%xmm1
-- movdqa 0x20(%rdi),%xmm2
-- movdqa 0x30(%rdi),%xmm3
-+ movdqu 0x00(%rdi),%xmm0
-+ movdqu 0x10(%rdi),%xmm1
-+ movdqu 0x20(%rdi),%xmm2
-+ movdqu 0x30(%rdi),%xmm3
-
- mov %edx,%r8d
- call chacha_permute
---- a/arch/x86/crypto/chacha_glue.c
-+++ b/arch/x86/crypto/chacha_glue.c
-@@ -14,8 +14,6 @@
- #include <linux/module.h>
- #include <asm/simd.h>
-
--#define CHACHA_STATE_ALIGN 16
--
- asmlinkage void chacha_block_xor_ssse3(u32 *state, u8 *dst, const u8 *src,
- unsigned int len, int nrounds);
- asmlinkage void chacha_4block_xor_ssse3(u32 *state, u8 *dst, const u8 *src,
-@@ -125,8 +123,6 @@ static void chacha_dosimd(u32 *state, u8
-
- void hchacha_block_arch(const u32 *state, u32 *stream, int nrounds)
- {
-- state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
--
- if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable()) {
- hchacha_block_generic(state, stream, nrounds);
- } else {
-@@ -139,8 +135,6 @@ EXPORT_SYMBOL(hchacha_block_arch);
-
- void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv)
- {
-- state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
--
- chacha_init_generic(state, key, iv);
- }
- EXPORT_SYMBOL(chacha_init_arch);
-@@ -148,8 +142,6 @@ EXPORT_SYMBOL(chacha_init_arch);
- void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src, unsigned int bytes,
- int nrounds)
- {
-- state = PTR_ALIGN(state, CHACHA_STATE_ALIGN);
--
- if (!static_branch_likely(&chacha_use_simd) || !crypto_simd_usable() ||
- bytes <= CHACHA_BLOCK_SIZE)
- return chacha_crypt_generic(state, dst, src, bytes, nrounds);
-@@ -171,15 +163,12 @@ EXPORT_SYMBOL(chacha_crypt_arch);
- static int chacha_simd_stream_xor(struct skcipher_request *req,
- const struct chacha_ctx *ctx, const u8 *iv)
- {
-- u32 *state, state_buf[16 + 2] __aligned(8);
-+ u32 state[CHACHA_STATE_WORDS] __aligned(8);
- struct skcipher_walk walk;
- int err;
-
- err = skcipher_walk_virt(&walk, req, false);
-
-- BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
-- state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
--
- chacha_init_generic(state, ctx->key, iv);
-
- while (walk.nbytes > 0) {
-@@ -218,12 +207,10 @@ static int xchacha_simd(struct skcipher_
- {
- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
- struct chacha_ctx *ctx = crypto_skcipher_ctx(tfm);
-- u32 *state, state_buf[16 + 2] __aligned(8);
-+ u32 state[CHACHA_STATE_WORDS] __aligned(8);
- struct chacha_ctx subctx;
- u8 real_iv[16];
-
-- BUILD_BUG_ON(CHACHA_STATE_ALIGN != 16);
-- state = PTR_ALIGN(state_buf + 0, CHACHA_STATE_ALIGN);
- chacha_init_generic(state, ctx->key, req->iv);
-
- if (req->cryptlen > CHACHA_BLOCK_SIZE && crypto_simd_usable()) {
---- a/include/crypto/chacha.h
-+++ b/include/crypto/chacha.h
-@@ -25,11 +25,7 @@
- #define CHACHA_BLOCK_SIZE 64
- #define CHACHAPOLY_IV_SIZE 12
-
--#ifdef CONFIG_X86_64
--#define CHACHA_STATE_WORDS ((CHACHA_BLOCK_SIZE + 12) / sizeof(u32))
--#else
- #define CHACHA_STATE_WORDS (CHACHA_BLOCK_SIZE / sizeof(u32))
--#endif
-
- /* 192-bit nonce, then 64-bit stream position */
- #define XCHACHA_IV_SIZE 32
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0060-crypto-x86-curve25519-Remove-unused-carry-variables.patch b/target/linux/generic/backport-5.4/080-wireguard-0060-crypto-x86-curve25519-Remove-unused-carry-variables.patch
deleted file mode 100644
index 5a2d20a982..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0060-crypto-x86-curve25519-Remove-unused-carry-variables.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Herbert Xu <herbert@gondor.apana.org.au>
-Date: Thu, 23 Jul 2020 17:50:48 +1000
-Subject: [PATCH] crypto: x86/curve25519 - Remove unused carry variables
-
-commit 054a5540fb8f7268e2c79e9deab4242db15c8cba upstream.
-
-The carry variables are assigned but never used, which upsets
-the compiler. This patch removes them.
-
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Reviewed-by: Karthikeyan Bhargavan <karthik.bhargavan@gmail.com>
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/curve25519-x86_64.c | 6 ++----
- 1 file changed, 2 insertions(+), 4 deletions(-)
-
---- a/arch/x86/crypto/curve25519-x86_64.c
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -948,10 +948,8 @@ static void store_felem(u64 *b, u64 *f)
- {
- u64 f30 = f[3U];
- u64 top_bit0 = f30 >> (u32)63U;
-- u64 carry0;
- u64 f31;
- u64 top_bit;
-- u64 carry;
- u64 f0;
- u64 f1;
- u64 f2;
-@@ -970,11 +968,11 @@ static void store_felem(u64 *b, u64 *f)
- u64 o2;
- u64 o3;
- f[3U] = f30 & (u64)0x7fffffffffffffffU;
-- carry0 = add_scalar(f, f, (u64)19U * top_bit0);
-+ add_scalar(f, f, (u64)19U * top_bit0);
- f31 = f[3U];
- top_bit = f31 >> (u32)63U;
- f[3U] = f31 & (u64)0x7fffffffffffffffU;
-- carry = add_scalar(f, f, (u64)19U * top_bit);
-+ add_scalar(f, f, (u64)19U * top_bit);
- f0 = f[0U];
- f1 = f[1U];
- f2 = f[2U];
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0061-crypto-arm-curve25519-include-linux-scatterlist.h.patch b/target/linux/generic/backport-5.4/080-wireguard-0061-crypto-arm-curve25519-include-linux-scatterlist.h.patch
deleted file mode 100644
index b58fd08fc9..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0061-crypto-arm-curve25519-include-linux-scatterlist.h.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Fabio Estevam <festevam@gmail.com>
-Date: Mon, 24 Aug 2020 11:09:53 -0300
-Subject: [PATCH] crypto: arm/curve25519 - include <linux/scatterlist.h>
-
-commit 6779d0e6b0fe193ab3010ea201782ca6f75a3862 upstream.
-
-Building ARM allmodconfig leads to the following warnings:
-
-arch/arm/crypto/curve25519-glue.c:73:12: error: implicit declaration of function 'sg_copy_to_buffer' [-Werror=implicit-function-declaration]
-arch/arm/crypto/curve25519-glue.c:74:9: error: implicit declaration of function 'sg_nents_for_len' [-Werror=implicit-function-declaration]
-arch/arm/crypto/curve25519-glue.c:88:11: error: implicit declaration of function 'sg_copy_from_buffer' [-Werror=implicit-function-declaration]
-
-Include <linux/scatterlist.h> to fix such warnings
-
-Reported-by: Olof's autobuilder <build@lixom.net>
-Fixes: 0c3dc787a62a ("crypto: algapi - Remove skbuff.h inclusion")
-Signed-off-by: Fabio Estevam <festevam@gmail.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/curve25519-glue.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/crypto/curve25519-glue.c
-+++ b/arch/arm/crypto/curve25519-glue.c
-@@ -16,6 +16,7 @@
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/jump_label.h>
-+#include <linux/scatterlist.h>
- #include <crypto/curve25519.h>
-
- asmlinkage void curve25519_neon(u8 mypublic[CURVE25519_KEY_SIZE],
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0062-crypto-arm-poly1305-Add-prototype-for-poly1305_block.patch b/target/linux/generic/backport-5.4/080-wireguard-0062-crypto-arm-poly1305-Add-prototype-for-poly1305_block.patch
deleted file mode 100644
index cf3724a499..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0062-crypto-arm-poly1305-Add-prototype-for-poly1305_block.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Herbert Xu <herbert@gondor.apana.org.au>
-Date: Tue, 25 Aug 2020 11:23:00 +1000
-Subject: [PATCH] crypto: arm/poly1305 - Add prototype for poly1305_blocks_neon
-
-commit 51982ea02aef972132eb35c583d3e4c5b83166e5 upstream.
-
-This patch adds a prototype for poly1305_blocks_neon to slience
-a compiler warning:
-
- CC [M] arch/arm/crypto/poly1305-glue.o
-../arch/arm/crypto/poly1305-glue.c:25:13: warning: no previous prototype for `poly1305_blocks_neon' [-Wmissing-prototypes]
- void __weak poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit)
- ^~~~~~~~~~~~~~~~~~~~
-
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/poly1305-glue.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/crypto/poly1305-glue.c
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -20,6 +20,7 @@
-
- void poly1305_init_arm(void *state, const u8 *key);
- void poly1305_blocks_arm(void *state, const u8 *src, u32 len, u32 hibit);
-+void poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit);
- void poly1305_emit_arm(void *state, u8 *digest, const u32 *nonce);
-
- void __weak poly1305_blocks_neon(void *state, const u8 *src, u32 len, u32 hibit)
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0063-crypto-curve25519-x86_64-Use-XORL-r32-32.patch b/target/linux/generic/backport-5.4/080-wireguard-0063-crypto-curve25519-x86_64-Use-XORL-r32-32.patch
deleted file mode 100644
index dd76e2a1f2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0063-crypto-curve25519-x86_64-Use-XORL-r32-32.patch
+++ /dev/null
@@ -1,261 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Uros Bizjak <ubizjak@gmail.com>
-Date: Thu, 27 Aug 2020 19:30:58 +0200
-Subject: [PATCH] crypto: curve25519-x86_64 - Use XORL r32,32
-
-commit db719539fd3889836900bf912755aa30a5985e9a upstream.
-
-x86_64 zero extends 32bit operations, so for 64bit operands,
-XORL r32,r32 is functionally equal to XORL r64,r64, but avoids
-a REX prefix byte when legacy registers are used.
-
-Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
-Cc: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: "David S. Miller" <davem@davemloft.net>
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/curve25519-x86_64.c | 68 ++++++++++++++---------------
- 1 file changed, 34 insertions(+), 34 deletions(-)
-
---- a/arch/x86/crypto/curve25519-x86_64.c
-+++ b/arch/x86/crypto/curve25519-x86_64.c
-@@ -45,11 +45,11 @@ static inline u64 add_scalar(u64 *out, c
-
- asm volatile(
- /* Clear registers to propagate the carry bit */
-- " xor %%r8, %%r8;"
-- " xor %%r9, %%r9;"
-- " xor %%r10, %%r10;"
-- " xor %%r11, %%r11;"
-- " xor %1, %1;"
-+ " xor %%r8d, %%r8d;"
-+ " xor %%r9d, %%r9d;"
-+ " xor %%r10d, %%r10d;"
-+ " xor %%r11d, %%r11d;"
-+ " xor %k1, %k1;"
-
- /* Begin addition chain */
- " addq 0(%3), %0;"
-@@ -93,7 +93,7 @@ static inline void fadd(u64 *out, const
- " cmovc %0, %%rax;"
-
- /* Step 2: Add carry*38 to the original sum */
-- " xor %%rcx, %%rcx;"
-+ " xor %%ecx, %%ecx;"
- " add %%rax, %%r8;"
- " adcx %%rcx, %%r9;"
- " movq %%r9, 8(%1);"
-@@ -165,28 +165,28 @@ static inline void fmul(u64 *out, const
-
- /* Compute src1[0] * src2 */
- " movq 0(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " movq %%r8, 0(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 8(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 16(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 16(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 24(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 24(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 32(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 40(%0);" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
-@@ -200,7 +200,7 @@ static inline void fmul(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 32(%1), %%r8, %%r13;"
-- " xor %3, %3;"
-+ " xor %k3, %k3;"
- " adoxq 0(%1), %%r8;"
- " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
-@@ -246,28 +246,28 @@ static inline void fmul2(u64 *out, const
-
- /* Compute src1[0] * src2 */
- " movq 0(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 0(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " movq %%r8, 0(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 8(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 8(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 8(%0), %%r8;" " movq %%r8, 8(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 16(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 16(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 16(%0), %%r8;" " movq %%r8, 16(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 24(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 24(%1), %%rdx;"
-- " mulxq 0(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
-+ " mulxq 0(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 24(%0), %%r8;" " movq %%r8, 24(%0);"
- " mulxq 8(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 32(%0);"
- " mulxq 16(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 40(%0);" " mov $0, %%r8;"
- " mulxq 24(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 48(%0);" " mov $0, %%rax;"
-@@ -277,29 +277,29 @@ static inline void fmul2(u64 *out, const
-
- /* Compute src1[0] * src2 */
- " movq 32(%1), %%rdx;"
-- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " movq %%r8, 64(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 72(%0);"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " movq %%r8, 64(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " movq %%r10, 72(%0);"
- " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;"
- /* Compute src1[1] * src2 */
- " movq 40(%1), %%rdx;"
-- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 72(%0), %%r8;" " movq %%r8, 72(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 80(%0);"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 72(%0), %%r8;" " movq %%r8, 72(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 80(%0);"
- " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[2] * src2 */
- " movq 48(%1), %%rdx;"
-- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 80(%0), %%r8;" " movq %%r8, 80(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 88(%0);"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 80(%0), %%r8;" " movq %%r8, 80(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 88(%0);"
- " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;"
- /* Compute src1[3] * src2 */
- " movq 56(%1), %%rdx;"
-- " mulxq 32(%3), %%r8, %%r9;" " xor %%r10, %%r10;" " adcxq 88(%0), %%r8;" " movq %%r8, 88(%0);"
-- " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 96(%0);"
-+ " mulxq 32(%3), %%r8, %%r9;" " xor %%r10d, %%r10d;" " adcxq 88(%0), %%r8;" " movq %%r8, 88(%0);"
-+ " mulxq 40(%3), %%r10, %%r11;" " adox %%r9, %%r10;" " adcx %%rbx, %%r10;" " movq %%r10, 96(%0);"
- " mulxq 48(%3), %%rbx, %%r13;" " adox %%r11, %%rbx;" " adcx %%r14, %%rbx;" " movq %%rbx, 104(%0);" " mov $0, %%r8;"
- " mulxq 56(%3), %%r14, %%rdx;" " adox %%r13, %%r14;" " adcx %%rax, %%r14;" " movq %%r14, 112(%0);" " mov $0, %%rax;"
- " adox %%rdx, %%rax;" " adcx %%r8, %%rax;" " movq %%rax, 120(%0);"
-@@ -312,7 +312,7 @@ static inline void fmul2(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 32(%1), %%r8, %%r13;"
-- " xor %3, %3;"
-+ " xor %k3, %k3;"
- " adoxq 0(%1), %%r8;"
- " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
-@@ -345,7 +345,7 @@ static inline void fmul2(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 96(%1), %%r8, %%r13;"
-- " xor %3, %3;"
-+ " xor %k3, %k3;"
- " adoxq 64(%1), %%r8;"
- " mulxq 104(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
-@@ -516,7 +516,7 @@ static inline void fsqr(u64 *out, const
-
- /* Step 1: Compute all partial products */
- " movq 0(%1), %%rdx;" /* f[0] */
-- " mulxq 8(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 8(%1), %%r8, %%r14;" " xor %%r15d, %%r15d;" /* f[1]*f[0] */
- " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 24(%1), %%rdx;" /* f[3] */
-@@ -526,7 +526,7 @@ static inline void fsqr(u64 *out, const
- " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
- /* Step 2: Compute two parallel carry chains */
-- " xor %%r15, %%r15;"
-+ " xor %%r15d, %%r15d;"
- " adox %%rax, %%r10;"
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
-@@ -563,7 +563,7 @@ static inline void fsqr(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 32(%1), %%r8, %%r13;"
-- " xor %%rcx, %%rcx;"
-+ " xor %%ecx, %%ecx;"
- " adoxq 0(%1), %%r8;"
- " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
-@@ -607,7 +607,7 @@ static inline void fsqr2(u64 *out, const
- asm volatile(
- /* Step 1: Compute all partial products */
- " movq 0(%1), %%rdx;" /* f[0] */
-- " mulxq 8(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 8(%1), %%r8, %%r14;" " xor %%r15d, %%r15d;" /* f[1]*f[0] */
- " mulxq 16(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 24(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 24(%1), %%rdx;" /* f[3] */
-@@ -617,7 +617,7 @@ static inline void fsqr2(u64 *out, const
- " mulxq 16(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
- /* Step 2: Compute two parallel carry chains */
-- " xor %%r15, %%r15;"
-+ " xor %%r15d, %%r15d;"
- " adox %%rax, %%r10;"
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
-@@ -647,7 +647,7 @@ static inline void fsqr2(u64 *out, const
-
- /* Step 1: Compute all partial products */
- " movq 32(%1), %%rdx;" /* f[0] */
-- " mulxq 40(%1), %%r8, %%r14;" " xor %%r15, %%r15;" /* f[1]*f[0] */
-+ " mulxq 40(%1), %%r8, %%r14;" " xor %%r15d, %%r15d;" /* f[1]*f[0] */
- " mulxq 48(%1), %%r9, %%r10;" " adcx %%r14, %%r9;" /* f[2]*f[0] */
- " mulxq 56(%1), %%rax, %%rcx;" " adcx %%rax, %%r10;" /* f[3]*f[0] */
- " movq 56(%1), %%rdx;" /* f[3] */
-@@ -657,7 +657,7 @@ static inline void fsqr2(u64 *out, const
- " mulxq 48(%1), %%rax, %%rcx;" " mov $0, %%r14;" /* f[2]*f[1] */
-
- /* Step 2: Compute two parallel carry chains */
-- " xor %%r15, %%r15;"
-+ " xor %%r15d, %%r15d;"
- " adox %%rax, %%r10;"
- " adcx %%r8, %%r8;"
- " adox %%rcx, %%r11;"
-@@ -692,7 +692,7 @@ static inline void fsqr2(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 32(%1), %%r8, %%r13;"
-- " xor %%rcx, %%rcx;"
-+ " xor %%ecx, %%ecx;"
- " adoxq 0(%1), %%r8;"
- " mulxq 40(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
-@@ -725,7 +725,7 @@ static inline void fsqr2(u64 *out, const
- /* Step 1: Compute dst + carry == tmp_hi * 38 + tmp_lo */
- " mov $38, %%rdx;"
- " mulxq 96(%1), %%r8, %%r13;"
-- " xor %%rcx, %%rcx;"
-+ " xor %%ecx, %%ecx;"
- " adoxq 64(%1), %%r8;"
- " mulxq 104(%1), %%r9, %%rbx;"
- " adcx %%r13, %%r9;"
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0064-crypto-poly1305-x86_64-Use-XORL-r32-32.patch b/target/linux/generic/backport-5.4/080-wireguard-0064-crypto-poly1305-x86_64-Use-XORL-r32-32.patch
deleted file mode 100644
index 4fcaa1eb75..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0064-crypto-poly1305-x86_64-Use-XORL-r32-32.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Uros Bizjak <ubizjak@gmail.com>
-Date: Thu, 27 Aug 2020 19:38:31 +0200
-Subject: [PATCH] crypto: poly1305-x86_64 - Use XORL r32,32
-
-commit 7dfd1e01b3dfc13431b1b25720cf2692a7e111ef upstream.
-
-x86_64 zero extends 32bit operations, so for 64bit operands,
-XORL r32,r32 is functionally equal to XORQ r64,r64, but avoids
-a REX prefix byte when legacy registers are used.
-
-Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
-Cc: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: "David S. Miller" <davem@davemloft.net>
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305-x86_64-cryptogams.pl | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-+++ b/arch/x86/crypto/poly1305-x86_64-cryptogams.pl
-@@ -246,7 +246,7 @@ $code.=<<___ if (!$kernel);
- ___
- &declare_function("poly1305_init_x86_64", 32, 3);
- $code.=<<___;
-- xor %rax,%rax
-+ xor %eax,%eax
- mov %rax,0($ctx) # initialize hash value
- mov %rax,8($ctx)
- mov %rax,16($ctx)
-@@ -2869,7 +2869,7 @@ $code.=<<___;
- .type poly1305_init_base2_44,\@function,3
- .align 32
- poly1305_init_base2_44:
-- xor %rax,%rax
-+ xor %eax,%eax
- mov %rax,0($ctx) # initialize hash value
- mov %rax,8($ctx)
- mov %rax,16($ctx)
-@@ -3963,7 +3963,7 @@ xor128_decrypt_n_pad:
- mov \$16,$len
- sub %r10,$len
- xor %eax,%eax
-- xor %r11,%r11
-+ xor %r11d,%r11d
- .Loop_dec_byte:
- mov ($inp,$otp),%r11b
- mov ($otp),%al
-@@ -4101,7 +4101,7 @@ avx_handler:
- .long 0xa548f3fc # cld; rep movsq
-
- mov $disp,%rsi
-- xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER
-+ xor %ecx,%ecx # arg1, UNW_FLAG_NHANDLER
- mov 8(%rsi),%rdx # arg2, disp->ImageBase
- mov 0(%rsi),%r8 # arg3, disp->ControlPc
- mov 16(%rsi),%r9 # arg4, disp->FunctionEntry
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0065-crypto-x86-poly1305-Remove-assignments-with-no-effec.patch b/target/linux/generic/backport-5.4/080-wireguard-0065-crypto-x86-poly1305-Remove-assignments-with-no-effec.patch
deleted file mode 100644
index ee64bfe1fc..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0065-crypto-x86-poly1305-Remove-assignments-with-no-effec.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Herbert Xu <herbert@gondor.apana.org.au>
-Date: Thu, 24 Sep 2020 13:29:04 +1000
-Subject: [PATCH] crypto: x86/poly1305 - Remove assignments with no effect
-
-commit 4a0c1de64bf9d9027a6f19adfba89fc27893db23 upstream.
-
-This patch removes a few ineffectual assignments from the function
-crypto_poly1305_setdctxkey.
-
-Reported-by: kernel test robot <lkp@intel.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 3 ---
- 1 file changed, 3 deletions(-)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -157,9 +157,6 @@ static unsigned int crypto_poly1305_setd
- dctx->s[1] = get_unaligned_le32(&inp[4]);
- dctx->s[2] = get_unaligned_le32(&inp[8]);
- dctx->s[3] = get_unaligned_le32(&inp[12]);
-- inp += POLY1305_BLOCK_SIZE;
-- len -= POLY1305_BLOCK_SIZE;
-- acc += POLY1305_BLOCK_SIZE;
- dctx->sset = true;
- }
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0066-crypto-x86-poly1305-add-back-a-needed-assignment.patch b/target/linux/generic/backport-5.4/080-wireguard-0066-crypto-x86-poly1305-add-back-a-needed-assignment.patch
deleted file mode 100644
index dce8bb912b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0066-crypto-x86-poly1305-add-back-a-needed-assignment.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Eric Biggers <ebiggers@google.com>
-Date: Fri, 23 Oct 2020 15:27:48 -0700
-Subject: [PATCH] crypto: x86/poly1305 - add back a needed assignment
-
-commit c3a98c3ad5c0dc60a1ac66bf91147a3f39cac96b upstream.
-
-One of the assignments that was removed by commit 4a0c1de64bf9 ("crypto:
-x86/poly1305 - Remove assignments with no effect") is actually needed,
-since it affects the return value.
-
-This fixes the following crypto self-test failure:
-
- alg: shash: poly1305-simd test failed (wrong result) on test vector 2, cfg="init+update+final aligned buffer"
-
-Fixes: 4a0c1de64bf9 ("crypto: x86/poly1305 - Remove assignments with no effect")
-Signed-off-by: Eric Biggers <ebiggers@google.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/x86/crypto/poly1305_glue.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -157,6 +157,7 @@ static unsigned int crypto_poly1305_setd
- dctx->s[1] = get_unaligned_le32(&inp[4]);
- dctx->s[2] = get_unaligned_le32(&inp[8]);
- dctx->s[3] = get_unaligned_le32(&inp[12]);
-+ acc += POLY1305_BLOCK_SIZE;
- dctx->sset = true;
- }
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0067-crypto-Kconfig-CRYPTO_MANAGER_EXTRA_TESTS-requires-t.patch b/target/linux/generic/backport-5.4/080-wireguard-0067-crypto-Kconfig-CRYPTO_MANAGER_EXTRA_TESTS-requires-t.patch
deleted file mode 100644
index 31c47df4b3..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0067-crypto-Kconfig-CRYPTO_MANAGER_EXTRA_TESTS-requires-t.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 2 Nov 2020 14:48:15 +0100
-Subject: [PATCH] crypto: Kconfig - CRYPTO_MANAGER_EXTRA_TESTS requires the
- manager
-
-commit 6569e3097f1c4a490bdf2b23d326855e04942dfd upstream.
-
-The extra tests in the manager actually require the manager to be
-selected too. Otherwise the linker gives errors like:
-
-ld: arch/x86/crypto/chacha_glue.o: in function `chacha_simd_stream_xor':
-chacha_glue.c:(.text+0x422): undefined reference to `crypto_simd_disabled_for_test'
-
-Fixes: 2343d1529aff ("crypto: Kconfig - allow tests to be disabled when manager is disabled")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- crypto/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -145,7 +145,7 @@ config CRYPTO_MANAGER_DISABLE_TESTS
-
- config CRYPTO_MANAGER_EXTRA_TESTS
- bool "Enable extra run-time crypto self tests"
-- depends on DEBUG_KERNEL && !CRYPTO_MANAGER_DISABLE_TESTS
-+ depends on DEBUG_KERNEL && !CRYPTO_MANAGER_DISABLE_TESTS && CRYPTO_MANAGER
- help
- Enable extra run-time self tests of registered crypto algorithms,
- including randomized fuzz tests.
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0068-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch b/target/linux/generic/backport-5.4/080-wireguard-0068-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch
deleted file mode 100644
index b31b8d9a0e..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0068-crypto-arm-chacha-neon-optimize-for-non-block-size-m.patch
+++ /dev/null
@@ -1,272 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Tue, 3 Nov 2020 17:28:09 +0100
-Subject: [PATCH] crypto: arm/chacha-neon - optimize for non-block size
- multiples
-
-commit 86cd97ec4b943af35562a74688bc4e909b32c3d1 upstream.
-
-The current NEON based ChaCha implementation for ARM is optimized for
-multiples of 4x the ChaCha block size (64 bytes). This makes sense for
-block encryption, but given that ChaCha is also often used in the
-context of networking, it makes sense to consider arbitrary length
-inputs as well.
-
-For example, WireGuard typically uses 1420 byte packets, and performing
-ChaCha encryption involves 5 invocations of chacha_4block_xor_neon()
-and 3 invocations of chacha_block_xor_neon(), where the last one also
-involves a memcpy() using a buffer on the stack to process the final
-chunk of 1420 % 64 == 12 bytes.
-
-Let's optimize for this case as well, by letting chacha_4block_xor_neon()
-deal with any input size between 64 and 256 bytes, using NEON permutation
-instructions and overlapping loads and stores. This way, the 140 byte
-tail of a 1420 byte input buffer can simply be processed in one go.
-
-This results in the following performance improvements for 1420 byte
-blocks, without significant impact on power-of-2 input sizes. (Note
-that Raspberry Pi is widely used in combination with a 32-bit kernel,
-even though the core is 64-bit capable)
-
- Cortex-A8 (BeagleBone) : 7%
- Cortex-A15 (Calxeda Midway) : 21%
- Cortex-A53 (Raspberry Pi 3) : 3%
- Cortex-A72 (Raspberry Pi 4) : 19%
-
-Cc: Eric Biggers <ebiggers@google.com>
-Cc: "Jason A . Donenfeld" <Jason@zx2c4.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-glue.c | 34 +++++------
- arch/arm/crypto/chacha-neon-core.S | 97 +++++++++++++++++++++++++++---
- 2 files changed, 107 insertions(+), 24 deletions(-)
-
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -23,7 +23,7 @@
- asmlinkage void chacha_block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
- int nrounds);
- asmlinkage void chacha_4block_xor_neon(const u32 *state, u8 *dst, const u8 *src,
-- int nrounds);
-+ int nrounds, unsigned int nbytes);
- asmlinkage void hchacha_block_arm(const u32 *state, u32 *out, int nrounds);
- asmlinkage void hchacha_block_neon(const u32 *state, u32 *out, int nrounds);
-
-@@ -42,24 +42,24 @@ static void chacha_doneon(u32 *state, u8
- {
- u8 buf[CHACHA_BLOCK_SIZE];
-
-- while (bytes >= CHACHA_BLOCK_SIZE * 4) {
-- chacha_4block_xor_neon(state, dst, src, nrounds);
-- bytes -= CHACHA_BLOCK_SIZE * 4;
-- src += CHACHA_BLOCK_SIZE * 4;
-- dst += CHACHA_BLOCK_SIZE * 4;
-- state[12] += 4;
-- }
-- while (bytes >= CHACHA_BLOCK_SIZE) {
-- chacha_block_xor_neon(state, dst, src, nrounds);
-- bytes -= CHACHA_BLOCK_SIZE;
-- src += CHACHA_BLOCK_SIZE;
-- dst += CHACHA_BLOCK_SIZE;
-- state[12]++;
-+ while (bytes > CHACHA_BLOCK_SIZE) {
-+ unsigned int l = min(bytes, CHACHA_BLOCK_SIZE * 4U);
-+
-+ chacha_4block_xor_neon(state, dst, src, nrounds, l);
-+ bytes -= l;
-+ src += l;
-+ dst += l;
-+ state[12] += DIV_ROUND_UP(l, CHACHA_BLOCK_SIZE);
- }
- if (bytes) {
-- memcpy(buf, src, bytes);
-- chacha_block_xor_neon(state, buf, buf, nrounds);
-- memcpy(dst, buf, bytes);
-+ const u8 *s = src;
-+ u8 *d = dst;
-+
-+ if (bytes != CHACHA_BLOCK_SIZE)
-+ s = d = memcpy(buf, src, bytes);
-+ chacha_block_xor_neon(state, d, s, nrounds);
-+ if (d != dst)
-+ memcpy(dst, buf, bytes);
- }
- }
-
---- a/arch/arm/crypto/chacha-neon-core.S
-+++ b/arch/arm/crypto/chacha-neon-core.S
-@@ -47,6 +47,7 @@
- */
-
- #include <linux/linkage.h>
-+#include <asm/cache.h>
-
- .text
- .fpu neon
-@@ -205,7 +206,7 @@ ENDPROC(hchacha_block_neon)
-
- .align 5
- ENTRY(chacha_4block_xor_neon)
-- push {r4-r5}
-+ push {r4, lr}
- mov r4, sp // preserve the stack pointer
- sub ip, sp, #0x20 // allocate a 32 byte buffer
- bic ip, ip, #0x1f // aligned to 32 bytes
-@@ -229,10 +230,10 @@ ENTRY(chacha_4block_xor_neon)
- vld1.32 {q0-q1}, [r0]
- vld1.32 {q2-q3}, [ip]
-
-- adr r5, .Lctrinc
-+ adr lr, .Lctrinc
- vdup.32 q15, d7[1]
- vdup.32 q14, d7[0]
-- vld1.32 {q4}, [r5, :128]
-+ vld1.32 {q4}, [lr, :128]
- vdup.32 q13, d6[1]
- vdup.32 q12, d6[0]
- vdup.32 q11, d5[1]
-@@ -455,7 +456,7 @@ ENTRY(chacha_4block_xor_neon)
-
- // Re-interleave the words in the first two rows of each block (x0..7).
- // Also add the counter values 0-3 to x12[0-3].
-- vld1.32 {q8}, [r5, :128] // load counter values 0-3
-+ vld1.32 {q8}, [lr, :128] // load counter values 0-3
- vzip.32 q0, q1 // => (0 1 0 1) (0 1 0 1)
- vzip.32 q2, q3 // => (2 3 2 3) (2 3 2 3)
- vzip.32 q4, q5 // => (4 5 4 5) (4 5 4 5)
-@@ -493,6 +494,8 @@ ENTRY(chacha_4block_xor_neon)
-
- // Re-interleave the words in the last two rows of each block (x8..15).
- vld1.32 {q8-q9}, [sp, :256]
-+ mov sp, r4 // restore original stack pointer
-+ ldr r4, [r4, #8] // load number of bytes
- vzip.32 q12, q13 // => (12 13 12 13) (12 13 12 13)
- vzip.32 q14, q15 // => (14 15 14 15) (14 15 14 15)
- vzip.32 q8, q9 // => (8 9 8 9) (8 9 8 9)
-@@ -520,41 +523,121 @@ ENTRY(chacha_4block_xor_neon)
- // XOR the rest of the data with the keystream
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #96
- veor q0, q0, q8
- veor q1, q1, q12
-+ ble .Lle96
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #32
- veor q0, q0, q2
- veor q1, q1, q6
-+ ble .Lle128
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #32
- veor q0, q0, q10
- veor q1, q1, q14
-+ ble .Lle160
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #32
- veor q0, q0, q4
- veor q1, q1, q5
-+ ble .Lle192
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #32
- veor q0, q0, q9
- veor q1, q1, q13
-+ ble .Lle224
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]!
-+ subs r4, r4, #32
- veor q0, q0, q3
- veor q1, q1, q7
-+ blt .Llt256
-+.Lout:
- vst1.8 {q0-q1}, [r1]!
-
- vld1.8 {q0-q1}, [r2]
-- mov sp, r4 // restore original stack pointer
- veor q0, q0, q11
- veor q1, q1, q15
- vst1.8 {q0-q1}, [r1]
-
-- pop {r4-r5}
-- bx lr
-+ pop {r4, pc}
-+
-+.Lle192:
-+ vmov q4, q9
-+ vmov q5, q13
-+
-+.Lle160:
-+ // nothing to do
-+
-+.Lfinalblock:
-+ // Process the final block if processing less than 4 full blocks.
-+ // Entered with 32 bytes of ChaCha cipher stream in q4-q5, and the
-+ // previous 32 byte output block that still needs to be written at
-+ // [r1] in q0-q1.
-+ beq .Lfullblock
-+
-+.Lpartialblock:
-+ adr lr, .Lpermute + 32
-+ add r2, r2, r4
-+ add lr, lr, r4
-+ add r4, r4, r1
-+
-+ vld1.8 {q2-q3}, [lr]
-+ vld1.8 {q6-q7}, [r2]
-+
-+ add r4, r4, #32
-+
-+ vtbl.8 d4, {q4-q5}, d4
-+ vtbl.8 d5, {q4-q5}, d5
-+ vtbl.8 d6, {q4-q5}, d6
-+ vtbl.8 d7, {q4-q5}, d7
-+
-+ veor q6, q6, q2
-+ veor q7, q7, q3
-+
-+ vst1.8 {q6-q7}, [r4] // overlapping stores
-+ vst1.8 {q0-q1}, [r1]
-+ pop {r4, pc}
-+
-+.Lfullblock:
-+ vmov q11, q4
-+ vmov q15, q5
-+ b .Lout
-+.Lle96:
-+ vmov q4, q2
-+ vmov q5, q6
-+ b .Lfinalblock
-+.Lle128:
-+ vmov q4, q10
-+ vmov q5, q14
-+ b .Lfinalblock
-+.Lle224:
-+ vmov q4, q3
-+ vmov q5, q7
-+ b .Lfinalblock
-+.Llt256:
-+ vmov q4, q11
-+ vmov q5, q15
-+ b .Lpartialblock
- ENDPROC(chacha_4block_xor_neon)
-+
-+ .align L1_CACHE_SHIFT
-+.Lpermute:
-+ .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
-+ .byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
-+ .byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
-+ .byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
-+ .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
-+ .byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
-+ .byte 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17
-+ .byte 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0069-crypto-arm64-chacha-simplify-tail-block-handling.patch b/target/linux/generic/backport-5.4/080-wireguard-0069-crypto-arm64-chacha-simplify-tail-block-handling.patch
deleted file mode 100644
index 42e9048b99..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0069-crypto-arm64-chacha-simplify-tail-block-handling.patch
+++ /dev/null
@@ -1,324 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Fri, 6 Nov 2020 17:39:38 +0100
-Subject: [PATCH] crypto: arm64/chacha - simplify tail block handling
-
-commit c4fc6328d6c67690a7e6e03f43a5a976a13120ef upstream.
-
-Based on lessons learnt from optimizing the 32-bit version of this driver,
-we can simplify the arm64 version considerably, by reordering the final
-two stores when the last block is not a multiple of 64 bytes. This removes
-the need to use permutation instructions to calculate the elements that are
-clobbered by the final overlapping store, given that the store of the
-penultimate block now follows it, and that one carries the correct values
-for those elements already.
-
-While at it, simplify the overlapping loads as well, by calculating the
-address of the final overlapping load upfront, and switching to this
-address for every load that would otherwise extend past the end of the
-source buffer.
-
-There is no impact on performance, but the resulting code is substantially
-smaller and easier to follow.
-
-Cc: Eric Biggers <ebiggers@google.com>
-Cc: "Jason A . Donenfeld" <Jason@zx2c4.com>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm64/crypto/chacha-neon-core.S | 193 ++++++++++-----------------
- 1 file changed, 69 insertions(+), 124 deletions(-)
-
---- a/arch/arm64/crypto/chacha-neon-core.S
-+++ b/arch/arm64/crypto/chacha-neon-core.S
-@@ -195,7 +195,6 @@ ENTRY(chacha_4block_xor_neon)
- adr_l x10, .Lpermute
- and x5, x4, #63
- add x10, x10, x5
-- add x11, x10, #64
-
- //
- // This function encrypts four consecutive ChaCha blocks by loading
-@@ -645,11 +644,11 @@ CPU_BE( rev a15, a15 )
- zip2 v31.4s, v14.4s, v15.4s
- eor a15, a15, w9
-
-- mov x3, #64
-+ add x3, x2, x4
-+ sub x3, x3, #128 // start of last block
-+
- subs x5, x4, #128
-- add x6, x5, x2
-- csel x3, x3, xzr, ge
-- csel x2, x2, x6, ge
-+ csel x2, x2, x3, ge
-
- // interleave 64-bit words in state n, n+2
- zip1 v0.2d, v16.2d, v18.2d
-@@ -658,13 +657,10 @@ CPU_BE( rev a15, a15 )
- zip1 v8.2d, v17.2d, v19.2d
- zip2 v12.2d, v17.2d, v19.2d
- stp a2, a3, [x1, #-56]
-- ld1 {v16.16b-v19.16b}, [x2], x3
-
- subs x6, x4, #192
-- ccmp x3, xzr, #4, lt
-- add x7, x6, x2
-- csel x3, x3, xzr, eq
-- csel x2, x2, x7, eq
-+ ld1 {v16.16b-v19.16b}, [x2], #64
-+ csel x2, x2, x3, ge
-
- zip1 v1.2d, v20.2d, v22.2d
- zip2 v5.2d, v20.2d, v22.2d
-@@ -672,13 +668,10 @@ CPU_BE( rev a15, a15 )
- zip1 v9.2d, v21.2d, v23.2d
- zip2 v13.2d, v21.2d, v23.2d
- stp a6, a7, [x1, #-40]
-- ld1 {v20.16b-v23.16b}, [x2], x3
-
- subs x7, x4, #256
-- ccmp x3, xzr, #4, lt
-- add x8, x7, x2
-- csel x3, x3, xzr, eq
-- csel x2, x2, x8, eq
-+ ld1 {v20.16b-v23.16b}, [x2], #64
-+ csel x2, x2, x3, ge
-
- zip1 v2.2d, v24.2d, v26.2d
- zip2 v6.2d, v24.2d, v26.2d
-@@ -686,12 +679,10 @@ CPU_BE( rev a15, a15 )
- zip1 v10.2d, v25.2d, v27.2d
- zip2 v14.2d, v25.2d, v27.2d
- stp a10, a11, [x1, #-24]
-- ld1 {v24.16b-v27.16b}, [x2], x3
-
- subs x8, x4, #320
-- ccmp x3, xzr, #4, lt
-- add x9, x8, x2
-- csel x2, x2, x9, eq
-+ ld1 {v24.16b-v27.16b}, [x2], #64
-+ csel x2, x2, x3, ge
-
- zip1 v3.2d, v28.2d, v30.2d
- zip2 v7.2d, v28.2d, v30.2d
-@@ -699,151 +690,105 @@ CPU_BE( rev a15, a15 )
- zip1 v11.2d, v29.2d, v31.2d
- zip2 v15.2d, v29.2d, v31.2d
- stp a14, a15, [x1, #-8]
-+
-+ tbnz x5, #63, .Lt128
- ld1 {v28.16b-v31.16b}, [x2]
-
- // xor with corresponding input, write to output
-- tbnz x5, #63, 0f
- eor v16.16b, v16.16b, v0.16b
- eor v17.16b, v17.16b, v1.16b
- eor v18.16b, v18.16b, v2.16b
- eor v19.16b, v19.16b, v3.16b
-- st1 {v16.16b-v19.16b}, [x1], #64
-- cbz x5, .Lout
-
-- tbnz x6, #63, 1f
-+ tbnz x6, #63, .Lt192
-+
- eor v20.16b, v20.16b, v4.16b
- eor v21.16b, v21.16b, v5.16b
- eor v22.16b, v22.16b, v6.16b
- eor v23.16b, v23.16b, v7.16b
-- st1 {v20.16b-v23.16b}, [x1], #64
-- cbz x6, .Lout
-
-- tbnz x7, #63, 2f
-+ st1 {v16.16b-v19.16b}, [x1], #64
-+ tbnz x7, #63, .Lt256
-+
- eor v24.16b, v24.16b, v8.16b
- eor v25.16b, v25.16b, v9.16b
- eor v26.16b, v26.16b, v10.16b
- eor v27.16b, v27.16b, v11.16b
-- st1 {v24.16b-v27.16b}, [x1], #64
-- cbz x7, .Lout
-
-- tbnz x8, #63, 3f
-+ st1 {v20.16b-v23.16b}, [x1], #64
-+ tbnz x8, #63, .Lt320
-+
- eor v28.16b, v28.16b, v12.16b
- eor v29.16b, v29.16b, v13.16b
- eor v30.16b, v30.16b, v14.16b
- eor v31.16b, v31.16b, v15.16b
-+
-+ st1 {v24.16b-v27.16b}, [x1], #64
- st1 {v28.16b-v31.16b}, [x1]
-
- .Lout: frame_pop
- ret
-
-- // fewer than 128 bytes of in/output
--0: ld1 {v8.16b}, [x10]
-- ld1 {v9.16b}, [x11]
-- movi v10.16b, #16
-- sub x2, x1, #64
-- add x1, x1, x5
-- ld1 {v16.16b-v19.16b}, [x2]
-- tbl v4.16b, {v0.16b-v3.16b}, v8.16b
-- tbx v20.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v5.16b, {v0.16b-v3.16b}, v8.16b
-- tbx v21.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v6.16b, {v0.16b-v3.16b}, v8.16b
-- tbx v22.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v7.16b, {v0.16b-v3.16b}, v8.16b
-- tbx v23.16b, {v16.16b-v19.16b}, v9.16b
--
-- eor v20.16b, v20.16b, v4.16b
-- eor v21.16b, v21.16b, v5.16b
-- eor v22.16b, v22.16b, v6.16b
-- eor v23.16b, v23.16b, v7.16b
-- st1 {v20.16b-v23.16b}, [x1]
-- b .Lout
--
- // fewer than 192 bytes of in/output
--1: ld1 {v8.16b}, [x10]
-- ld1 {v9.16b}, [x11]
-- movi v10.16b, #16
-- add x1, x1, x6
-- tbl v0.16b, {v4.16b-v7.16b}, v8.16b
-- tbx v20.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v1.16b, {v4.16b-v7.16b}, v8.16b
-- tbx v21.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v2.16b, {v4.16b-v7.16b}, v8.16b
-- tbx v22.16b, {v16.16b-v19.16b}, v9.16b
-- add v8.16b, v8.16b, v10.16b
-- add v9.16b, v9.16b, v10.16b
-- tbl v3.16b, {v4.16b-v7.16b}, v8.16b
-- tbx v23.16b, {v16.16b-v19.16b}, v9.16b
--
-- eor v20.16b, v20.16b, v0.16b
-- eor v21.16b, v21.16b, v1.16b
-- eor v22.16b, v22.16b, v2.16b
-- eor v23.16b, v23.16b, v3.16b
-- st1 {v20.16b-v23.16b}, [x1]
-+.Lt192: cbz x5, 1f // exactly 128 bytes?
-+ ld1 {v28.16b-v31.16b}, [x10]
-+ add x5, x5, x1
-+ tbl v28.16b, {v4.16b-v7.16b}, v28.16b
-+ tbl v29.16b, {v4.16b-v7.16b}, v29.16b
-+ tbl v30.16b, {v4.16b-v7.16b}, v30.16b
-+ tbl v31.16b, {v4.16b-v7.16b}, v31.16b
-+
-+0: eor v20.16b, v20.16b, v28.16b
-+ eor v21.16b, v21.16b, v29.16b
-+ eor v22.16b, v22.16b, v30.16b
-+ eor v23.16b, v23.16b, v31.16b
-+ st1 {v20.16b-v23.16b}, [x5] // overlapping stores
-+1: st1 {v16.16b-v19.16b}, [x1]
- b .Lout
-
-+ // fewer than 128 bytes of in/output
-+.Lt128: ld1 {v28.16b-v31.16b}, [x10]
-+ add x5, x5, x1
-+ sub x1, x1, #64
-+ tbl v28.16b, {v0.16b-v3.16b}, v28.16b
-+ tbl v29.16b, {v0.16b-v3.16b}, v29.16b
-+ tbl v30.16b, {v0.16b-v3.16b}, v30.16b
-+ tbl v31.16b, {v0.16b-v3.16b}, v31.16b
-+ ld1 {v16.16b-v19.16b}, [x1] // reload first output block
-+ b 0b
-+
- // fewer than 256 bytes of in/output
--2: ld1 {v4.16b}, [x10]
-- ld1 {v5.16b}, [x11]
-- movi v6.16b, #16
-- add x1, x1, x7
-+.Lt256: cbz x6, 2f // exactly 192 bytes?
-+ ld1 {v4.16b-v7.16b}, [x10]
-+ add x6, x6, x1
- tbl v0.16b, {v8.16b-v11.16b}, v4.16b
-- tbx v24.16b, {v20.16b-v23.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v1.16b, {v8.16b-v11.16b}, v4.16b
-- tbx v25.16b, {v20.16b-v23.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v2.16b, {v8.16b-v11.16b}, v4.16b
-- tbx v26.16b, {v20.16b-v23.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v3.16b, {v8.16b-v11.16b}, v4.16b
-- tbx v27.16b, {v20.16b-v23.16b}, v5.16b
--
-- eor v24.16b, v24.16b, v0.16b
-- eor v25.16b, v25.16b, v1.16b
-- eor v26.16b, v26.16b, v2.16b
-- eor v27.16b, v27.16b, v3.16b
-- st1 {v24.16b-v27.16b}, [x1]
-+ tbl v1.16b, {v8.16b-v11.16b}, v5.16b
-+ tbl v2.16b, {v8.16b-v11.16b}, v6.16b
-+ tbl v3.16b, {v8.16b-v11.16b}, v7.16b
-+
-+ eor v28.16b, v28.16b, v0.16b
-+ eor v29.16b, v29.16b, v1.16b
-+ eor v30.16b, v30.16b, v2.16b
-+ eor v31.16b, v31.16b, v3.16b
-+ st1 {v28.16b-v31.16b}, [x6] // overlapping stores
-+2: st1 {v20.16b-v23.16b}, [x1]
- b .Lout
-
- // fewer than 320 bytes of in/output
--3: ld1 {v4.16b}, [x10]
-- ld1 {v5.16b}, [x11]
-- movi v6.16b, #16
-- add x1, x1, x8
-+.Lt320: cbz x7, 3f // exactly 256 bytes?
-+ ld1 {v4.16b-v7.16b}, [x10]
-+ add x7, x7, x1
- tbl v0.16b, {v12.16b-v15.16b}, v4.16b
-- tbx v28.16b, {v24.16b-v27.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v1.16b, {v12.16b-v15.16b}, v4.16b
-- tbx v29.16b, {v24.16b-v27.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v2.16b, {v12.16b-v15.16b}, v4.16b
-- tbx v30.16b, {v24.16b-v27.16b}, v5.16b
-- add v4.16b, v4.16b, v6.16b
-- add v5.16b, v5.16b, v6.16b
-- tbl v3.16b, {v12.16b-v15.16b}, v4.16b
-- tbx v31.16b, {v24.16b-v27.16b}, v5.16b
-+ tbl v1.16b, {v12.16b-v15.16b}, v5.16b
-+ tbl v2.16b, {v12.16b-v15.16b}, v6.16b
-+ tbl v3.16b, {v12.16b-v15.16b}, v7.16b
-
- eor v28.16b, v28.16b, v0.16b
- eor v29.16b, v29.16b, v1.16b
- eor v30.16b, v30.16b, v2.16b
- eor v31.16b, v31.16b, v3.16b
-- st1 {v28.16b-v31.16b}, [x1]
-+ st1 {v28.16b-v31.16b}, [x7] // overlapping stores
-+3: st1 {v24.16b-v27.16b}, [x1]
- b .Lout
- ENDPROC(chacha_4block_xor_neon)
-
-@@ -851,7 +796,7 @@ ENDPROC(chacha_4block_xor_neon)
- .align L1_CACHE_SHIFT
- .Lpermute:
- .set .Li, 0
-- .rept 192
-+ .rept 128
- .byte (.Li - 64)
- .set .Li, .Li + 1
- .endr
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0070-crypto-lib-chacha20poly1305-define-empty-module-exit.patch b/target/linux/generic/backport-5.4/080-wireguard-0070-crypto-lib-chacha20poly1305-define-empty-module-exit.patch
deleted file mode 100644
index 084ae74bfd..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0070-crypto-lib-chacha20poly1305-define-empty-module-exit.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 15 Jan 2021 20:30:12 +0100
-Subject: [PATCH] crypto: lib/chacha20poly1305 - define empty module exit
- function
-
-commit ac88c322d0f2917d41d13553c69e9d7f043c8b6f upstream.
-
-With no mod_exit function, users are unable to unload the module after
-use. I'm not aware of any reason why module unloading should be
-prohibited for this one, so this commit simply adds an empty exit
-function.
-
-Reported-and-tested-by: John Donnelly <john.p.donnelly@oracle.com>
-Acked-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- lib/crypto/chacha20poly1305.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/lib/crypto/chacha20poly1305.c
-+++ b/lib/crypto/chacha20poly1305.c
-@@ -364,7 +364,12 @@ static int __init mod_init(void)
- return 0;
- }
-
-+static void __exit mod_exit(void)
-+{
-+}
-+
- module_init(mod_init);
-+module_exit(mod_exit);
- MODULE_LICENSE("GPL v2");
- MODULE_DESCRIPTION("ChaCha20Poly1305 AEAD construction");
- MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0071-crypto-arm-chacha-neon-add-missing-counter-increment.patch b/target/linux/generic/backport-5.4/080-wireguard-0071-crypto-arm-chacha-neon-add-missing-counter-increment.patch
deleted file mode 100644
index ea3cc802a9..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0071-crypto-arm-chacha-neon-add-missing-counter-increment.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ard Biesheuvel <ardb@kernel.org>
-Date: Sun, 13 Dec 2020 15:39:29 +0100
-Subject: [PATCH] crypto: arm/chacha-neon - add missing counter increment
-
-commit fd16931a2f518a32753920ff20895e5cf04c8ff1 upstream.
-
-Commit 86cd97ec4b943af3 ("crypto: arm/chacha-neon - optimize for non-block
-size multiples") refactored the chacha block handling in the glue code in
-a way that may result in the counter increment to be omitted when calling
-chacha_block_xor_neon() to process a full block. This violates the skcipher
-API, which requires that the output IV is suitable for handling more input
-as long as the preceding input has been presented in round multiples of the
-block size. Also, the same code is exposed via the chacha library interface
-whose callers may actually rely on this increment to occur even for final
-blocks that are smaller than the chacha block size.
-
-So increment the counter after calling chacha_block_xor_neon().
-
-Fixes: 86cd97ec4b943af3 ("crypto: arm/chacha-neon - optimize for non-block size multiples")
-Reported-by: Eric Biggers <ebiggers@kernel.org>
-Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/chacha-glue.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/crypto/chacha-glue.c
-+++ b/arch/arm/crypto/chacha-glue.c
-@@ -60,6 +60,7 @@ static void chacha_doneon(u32 *state, u8
- chacha_block_xor_neon(state, d, s, nrounds);
- if (d != dst)
- memcpy(dst, buf, bytes);
-+ state[12]++;
- }
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0072-net-WireGuard-secure-network-tunnel.patch b/target/linux/generic/backport-5.4/080-wireguard-0072-net-WireGuard-secure-network-tunnel.patch
deleted file mode 100644
index a29da1e7b2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0072-net-WireGuard-secure-network-tunnel.patch
+++ /dev/null
@@ -1,8071 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 9 Dec 2019 00:27:34 +0100
-Subject: [PATCH] net: WireGuard secure network tunnel
-
-commit e7096c131e5161fa3b8e52a650d7719d2857adfd upstream.
-
-WireGuard is a layer 3 secure networking tunnel made specifically for
-the kernel, that aims to be much simpler and easier to audit than IPsec.
-Extensive documentation and description of the protocol and
-considerations, along with formal proofs of the cryptography, are
-available at:
-
- * https://www.wireguard.com/
- * https://www.wireguard.com/papers/wireguard.pdf
-
-This commit implements WireGuard as a simple network device driver,
-accessible in the usual RTNL way used by virtual network drivers. It
-makes use of the udp_tunnel APIs, GRO, GSO, NAPI, and the usual set of
-networking subsystem APIs. It has a somewhat novel multicore queueing
-system designed for maximum throughput and minimal latency of encryption
-operations, but it is implemented modestly using workqueues and NAPI.
-Configuration is done via generic Netlink, and following a review from
-the Netlink maintainer a year ago, several high profile userspace tools
-have already implemented the API.
-
-This commit also comes with several different tests, both in-kernel
-tests and out-of-kernel tests based on network namespaces, taking profit
-of the fact that sockets used by WireGuard intentionally stay in the
-namespace the WireGuard interface was originally created, exactly like
-the semantics of userspace tun devices. See wireguard.com/netns/ for
-pictures and examples.
-
-The source code is fairly short, but rather than combining everything
-into a single file, WireGuard is developed as cleanly separable files,
-making auditing and comprehension easier. Things are laid out as
-follows:
-
- * noise.[ch], cookie.[ch], messages.h: These implement the bulk of the
- cryptographic aspects of the protocol, and are mostly data-only in
- nature, taking in buffers of bytes and spitting out buffers of
- bytes. They also handle reference counting for their various shared
- pieces of data, like keys and key lists.
-
- * ratelimiter.[ch]: Used as an integral part of cookie.[ch] for
- ratelimiting certain types of cryptographic operations in accordance
- with particular WireGuard semantics.
-
- * allowedips.[ch], peerlookup.[ch]: The main lookup structures of
- WireGuard, the former being trie-like with particular semantics, an
- integral part of the design of the protocol, and the latter just
- being nice helper functions around the various hashtables we use.
-
- * device.[ch]: Implementation of functions for the netdevice and for
- rtnl, responsible for maintaining the life of a given interface and
- wiring it up to the rest of WireGuard.
-
- * peer.[ch]: Each interface has a list of peers, with helper functions
- available here for creation, destruction, and reference counting.
-
- * socket.[ch]: Implementation of functions related to udp_socket and
- the general set of kernel socket APIs, for sending and receiving
- ciphertext UDP packets, and taking care of WireGuard-specific sticky
- socket routing semantics for the automatic roaming.
-
- * netlink.[ch]: Userspace API entry point for configuring WireGuard
- peers and devices. The API has been implemented by several userspace
- tools and network management utility, and the WireGuard project
- distributes the basic wg(8) tool.
-
- * queueing.[ch]: Shared function on the rx and tx path for handling
- the various queues used in the multicore algorithms.
-
- * send.c: Handles encrypting outgoing packets in parallel on
- multiple cores, before sending them in order on a single core, via
- workqueues and ring buffers. Also handles sending handshake and cookie
- messages as part of the protocol, in parallel.
-
- * receive.c: Handles decrypting incoming packets in parallel on
- multiple cores, before passing them off in order to be ingested via
- the rest of the networking subsystem with GRO via the typical NAPI
- poll function. Also handles receiving handshake and cookie messages
- as part of the protocol, in parallel.
-
- * timers.[ch]: Uses the timer wheel to implement protocol particular
- event timeouts, and gives a set of very simple event-driven entry
- point functions for callers.
-
- * main.c, version.h: Initialization and deinitialization of the module.
-
- * selftest/*.h: Runtime unit tests for some of the most security
- sensitive functions.
-
- * tools/testing/selftests/wireguard/netns.sh: Aforementioned testing
- script using network namespaces.
-
-This commit aims to be as self-contained as possible, implementing
-WireGuard as a standalone module not needing much special handling or
-coordination from the network subsystem. I expect for future
-optimizations to the network stack to positively improve WireGuard, and
-vice-versa, but for the time being, this exists as intentionally
-standalone.
-
-We introduce a menu option for CONFIG_WIREGUARD, as well as providing a
-verbose debug log and self-tests via CONFIG_WIREGUARD_DEBUG.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Cc: David Miller <davem@davemloft.net>
-Cc: Greg KH <gregkh@linuxfoundation.org>
-Cc: Linus Torvalds <torvalds@linux-foundation.org>
-Cc: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: linux-crypto@vger.kernel.org
-Cc: linux-kernel@vger.kernel.org
-Cc: netdev@vger.kernel.org
-Signed-off-by: David S. Miller <davem@davemloft.net>
-[Jason: ported to 5.4 by doing the following:
- - wg_get_device_start uses genl_family_attrbuf
- - trival skb_redirect_reset change from 2c64605b590e is folded in
- - skb_list_walk_safe was already backported prior]
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- MAINTAINERS | 8 +
- drivers/net/Kconfig | 41 +
- drivers/net/Makefile | 1 +
- drivers/net/wireguard/Makefile | 18 +
- drivers/net/wireguard/allowedips.c | 381 +++++++++
- drivers/net/wireguard/allowedips.h | 59 ++
- drivers/net/wireguard/cookie.c | 236 ++++++
- drivers/net/wireguard/cookie.h | 59 ++
- drivers/net/wireguard/device.c | 458 ++++++++++
- drivers/net/wireguard/device.h | 65 ++
- drivers/net/wireguard/main.c | 64 ++
- drivers/net/wireguard/messages.h | 128 +++
- drivers/net/wireguard/netlink.c | 648 +++++++++++++++
- drivers/net/wireguard/netlink.h | 12 +
- drivers/net/wireguard/noise.c | 828 +++++++++++++++++++
- drivers/net/wireguard/noise.h | 137 +++
- drivers/net/wireguard/peer.c | 240 ++++++
- drivers/net/wireguard/peer.h | 83 ++
- drivers/net/wireguard/peerlookup.c | 221 +++++
- drivers/net/wireguard/peerlookup.h | 64 ++
- drivers/net/wireguard/queueing.c | 53 ++
- drivers/net/wireguard/queueing.h | 197 +++++
- drivers/net/wireguard/ratelimiter.c | 223 +++++
- drivers/net/wireguard/ratelimiter.h | 19 +
- drivers/net/wireguard/receive.c | 595 +++++++++++++
- drivers/net/wireguard/selftest/allowedips.c | 683 +++++++++++++++
- drivers/net/wireguard/selftest/counter.c | 104 +++
- drivers/net/wireguard/selftest/ratelimiter.c | 226 +++++
- drivers/net/wireguard/send.c | 413 +++++++++
- drivers/net/wireguard/socket.c | 437 ++++++++++
- drivers/net/wireguard/socket.h | 44 +
- drivers/net/wireguard/timers.c | 243 ++++++
- drivers/net/wireguard/timers.h | 31 +
- drivers/net/wireguard/version.h | 1 +
- include/uapi/linux/wireguard.h | 196 +++++
- tools/testing/selftests/wireguard/netns.sh | 537 ++++++++++++
- 36 files changed, 7753 insertions(+)
- create mode 100644 drivers/net/wireguard/Makefile
- create mode 100644 drivers/net/wireguard/allowedips.c
- create mode 100644 drivers/net/wireguard/allowedips.h
- create mode 100644 drivers/net/wireguard/cookie.c
- create mode 100644 drivers/net/wireguard/cookie.h
- create mode 100644 drivers/net/wireguard/device.c
- create mode 100644 drivers/net/wireguard/device.h
- create mode 100644 drivers/net/wireguard/main.c
- create mode 100644 drivers/net/wireguard/messages.h
- create mode 100644 drivers/net/wireguard/netlink.c
- create mode 100644 drivers/net/wireguard/netlink.h
- create mode 100644 drivers/net/wireguard/noise.c
- create mode 100644 drivers/net/wireguard/noise.h
- create mode 100644 drivers/net/wireguard/peer.c
- create mode 100644 drivers/net/wireguard/peer.h
- create mode 100644 drivers/net/wireguard/peerlookup.c
- create mode 100644 drivers/net/wireguard/peerlookup.h
- create mode 100644 drivers/net/wireguard/queueing.c
- create mode 100644 drivers/net/wireguard/queueing.h
- create mode 100644 drivers/net/wireguard/ratelimiter.c
- create mode 100644 drivers/net/wireguard/ratelimiter.h
- create mode 100644 drivers/net/wireguard/receive.c
- create mode 100644 drivers/net/wireguard/selftest/allowedips.c
- create mode 100644 drivers/net/wireguard/selftest/counter.c
- create mode 100644 drivers/net/wireguard/selftest/ratelimiter.c
- create mode 100644 drivers/net/wireguard/send.c
- create mode 100644 drivers/net/wireguard/socket.c
- create mode 100644 drivers/net/wireguard/socket.h
- create mode 100644 drivers/net/wireguard/timers.c
- create mode 100644 drivers/net/wireguard/timers.h
- create mode 100644 drivers/net/wireguard/version.h
- create mode 100644 include/uapi/linux/wireguard.h
- create mode 100755 tools/testing/selftests/wireguard/netns.sh
-
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -17585,6 +17585,14 @@ L: linux-gpio@vger.kernel.org
- S: Maintained
- F: drivers/gpio/gpio-ws16c48.c
-
-+WIREGUARD SECURE NETWORK TUNNEL
-+M: Jason A. Donenfeld <Jason@zx2c4.com>
-+S: Maintained
-+F: drivers/net/wireguard/
-+F: tools/testing/selftests/wireguard/
-+L: wireguard@lists.zx2c4.com
-+L: netdev@vger.kernel.org
-+
- WISTRON LAPTOP BUTTON DRIVER
- M: Miloslav Trmac <mitr@volny.cz>
- S: Maintained
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -71,6 +71,47 @@ config DUMMY
- To compile this driver as a module, choose M here: the module
- will be called dummy.
-
-+config WIREGUARD
-+ tristate "WireGuard secure network tunnel"
-+ depends on NET && INET
-+ depends on IPV6 || !IPV6
-+ select NET_UDP_TUNNEL
-+ select DST_CACHE
-+ select CRYPTO
-+ select CRYPTO_LIB_CURVE25519
-+ select CRYPTO_LIB_CHACHA20POLY1305
-+ select CRYPTO_LIB_BLAKE2S
-+ select CRYPTO_CHACHA20_X86_64 if X86 && 64BIT
-+ select CRYPTO_POLY1305_X86_64 if X86 && 64BIT
-+ select CRYPTO_BLAKE2S_X86 if X86 && 64BIT
-+ select CRYPTO_CURVE25519_X86 if X86 && 64BIT
-+ select CRYPTO_CHACHA20_NEON if (ARM || ARM64) && KERNEL_MODE_NEON
-+ select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON
-+ select CRYPTO_POLY1305_ARM if ARM
-+ select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
-+ select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
-+ select CRYPTO_POLY1305_MIPS if CPU_MIPS32 || (CPU_MIPS64 && 64BIT)
-+ help
-+ WireGuard is a secure, fast, and easy to use replacement for IPSec
-+ that uses modern cryptography and clever networking tricks. It's
-+ designed to be fairly general purpose and abstract enough to fit most
-+ use cases, while at the same time remaining extremely simple to
-+ configure. See www.wireguard.com for more info.
-+
-+ It's safe to say Y or M here, as the driver is very lightweight and
-+ is only in use when an administrator chooses to add an interface.
-+
-+config WIREGUARD_DEBUG
-+ bool "Debugging checks and verbose messages"
-+ depends on WIREGUARD
-+ help
-+ This will write log messages for handshake and other events
-+ that occur for a WireGuard interface. It will also perform some
-+ extra validation checks and unit tests at various points. This is
-+ only useful for debugging.
-+
-+ Say N here unless you know what you're doing.
-+
- config EQUALIZER
- tristate "EQL (serial line load balancing) support"
- ---help---
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_BONDING) += bonding/
- obj-$(CONFIG_IPVLAN) += ipvlan/
- obj-$(CONFIG_IPVTAP) += ipvlan/
- obj-$(CONFIG_DUMMY) += dummy.o
-+obj-$(CONFIG_WIREGUARD) += wireguard/
- obj-$(CONFIG_EQUALIZER) += eql.o
- obj-$(CONFIG_IFB) += ifb.o
- obj-$(CONFIG_MACSEC) += macsec.o
---- /dev/null
-+++ b/drivers/net/wireguard/Makefile
-@@ -0,0 +1,18 @@
-+ccflags-y := -O3
-+ccflags-y += -D'pr_fmt(fmt)=KBUILD_MODNAME ": " fmt'
-+ccflags-$(CONFIG_WIREGUARD_DEBUG) += -DDEBUG
-+wireguard-y := main.o
-+wireguard-y += noise.o
-+wireguard-y += device.o
-+wireguard-y += peer.o
-+wireguard-y += timers.o
-+wireguard-y += queueing.o
-+wireguard-y += send.o
-+wireguard-y += receive.o
-+wireguard-y += socket.o
-+wireguard-y += peerlookup.o
-+wireguard-y += allowedips.o
-+wireguard-y += ratelimiter.o
-+wireguard-y += cookie.o
-+wireguard-y += netlink.o
-+obj-$(CONFIG_WIREGUARD) := wireguard.o
---- /dev/null
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -0,0 +1,381 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "allowedips.h"
-+#include "peer.h"
-+
-+static void swap_endian(u8 *dst, const u8 *src, u8 bits)
-+{
-+ if (bits == 32) {
-+ *(u32 *)dst = be32_to_cpu(*(const __be32 *)src);
-+ } else if (bits == 128) {
-+ ((u64 *)dst)[0] = be64_to_cpu(((const __be64 *)src)[0]);
-+ ((u64 *)dst)[1] = be64_to_cpu(((const __be64 *)src)[1]);
-+ }
-+}
-+
-+static void copy_and_assign_cidr(struct allowedips_node *node, const u8 *src,
-+ u8 cidr, u8 bits)
-+{
-+ node->cidr = cidr;
-+ node->bit_at_a = cidr / 8U;
-+#ifdef __LITTLE_ENDIAN
-+ node->bit_at_a ^= (bits / 8U - 1U) % 8U;
-+#endif
-+ node->bit_at_b = 7U - (cidr % 8U);
-+ node->bitlen = bits;
-+ memcpy(node->bits, src, bits / 8U);
-+}
-+#define CHOOSE_NODE(parent, key) \
-+ parent->bit[(key[parent->bit_at_a] >> parent->bit_at_b) & 1]
-+
-+static void node_free_rcu(struct rcu_head *rcu)
-+{
-+ kfree(container_of(rcu, struct allowedips_node, rcu));
-+}
-+
-+static void push_rcu(struct allowedips_node **stack,
-+ struct allowedips_node __rcu *p, unsigned int *len)
-+{
-+ if (rcu_access_pointer(p)) {
-+ WARN_ON(IS_ENABLED(DEBUG) && *len >= 128);
-+ stack[(*len)++] = rcu_dereference_raw(p);
-+ }
-+}
-+
-+static void root_free_rcu(struct rcu_head *rcu)
-+{
-+ struct allowedips_node *node, *stack[128] = {
-+ container_of(rcu, struct allowedips_node, rcu) };
-+ unsigned int len = 1;
-+
-+ while (len > 0 && (node = stack[--len])) {
-+ push_rcu(stack, node->bit[0], &len);
-+ push_rcu(stack, node->bit[1], &len);
-+ kfree(node);
-+ }
-+}
-+
-+static void root_remove_peer_lists(struct allowedips_node *root)
-+{
-+ struct allowedips_node *node, *stack[128] = { root };
-+ unsigned int len = 1;
-+
-+ while (len > 0 && (node = stack[--len])) {
-+ push_rcu(stack, node->bit[0], &len);
-+ push_rcu(stack, node->bit[1], &len);
-+ if (rcu_access_pointer(node->peer))
-+ list_del(&node->peer_list);
-+ }
-+}
-+
-+static void walk_remove_by_peer(struct allowedips_node __rcu **top,
-+ struct wg_peer *peer, struct mutex *lock)
-+{
-+#define REF(p) rcu_access_pointer(p)
-+#define DEREF(p) rcu_dereference_protected(*(p), lockdep_is_held(lock))
-+#define PUSH(p) ({ \
-+ WARN_ON(IS_ENABLED(DEBUG) && len >= 128); \
-+ stack[len++] = p; \
-+ })
-+
-+ struct allowedips_node __rcu **stack[128], **nptr;
-+ struct allowedips_node *node, *prev;
-+ unsigned int len;
-+
-+ if (unlikely(!peer || !REF(*top)))
-+ return;
-+
-+ for (prev = NULL, len = 0, PUSH(top); len > 0; prev = node) {
-+ nptr = stack[len - 1];
-+ node = DEREF(nptr);
-+ if (!node) {
-+ --len;
-+ continue;
-+ }
-+ if (!prev || REF(prev->bit[0]) == node ||
-+ REF(prev->bit[1]) == node) {
-+ if (REF(node->bit[0]))
-+ PUSH(&node->bit[0]);
-+ else if (REF(node->bit[1]))
-+ PUSH(&node->bit[1]);
-+ } else if (REF(node->bit[0]) == prev) {
-+ if (REF(node->bit[1]))
-+ PUSH(&node->bit[1]);
-+ } else {
-+ if (rcu_dereference_protected(node->peer,
-+ lockdep_is_held(lock)) == peer) {
-+ RCU_INIT_POINTER(node->peer, NULL);
-+ list_del_init(&node->peer_list);
-+ if (!node->bit[0] || !node->bit[1]) {
-+ rcu_assign_pointer(*nptr, DEREF(
-+ &node->bit[!REF(node->bit[0])]));
-+ call_rcu(&node->rcu, node_free_rcu);
-+ node = DEREF(nptr);
-+ }
-+ }
-+ --len;
-+ }
-+ }
-+
-+#undef REF
-+#undef DEREF
-+#undef PUSH
-+}
-+
-+static unsigned int fls128(u64 a, u64 b)
-+{
-+ return a ? fls64(a) + 64U : fls64(b);
-+}
-+
-+static u8 common_bits(const struct allowedips_node *node, const u8 *key,
-+ u8 bits)
-+{
-+ if (bits == 32)
-+ return 32U - fls(*(const u32 *)node->bits ^ *(const u32 *)key);
-+ else if (bits == 128)
-+ return 128U - fls128(
-+ *(const u64 *)&node->bits[0] ^ *(const u64 *)&key[0],
-+ *(const u64 *)&node->bits[8] ^ *(const u64 *)&key[8]);
-+ return 0;
-+}
-+
-+static bool prefix_matches(const struct allowedips_node *node, const u8 *key,
-+ u8 bits)
-+{
-+ /* This could be much faster if it actually just compared the common
-+ * bits properly, by precomputing a mask bswap(~0 << (32 - cidr)), and
-+ * the rest, but it turns out that common_bits is already super fast on
-+ * modern processors, even taking into account the unfortunate bswap.
-+ * So, we just inline it like this instead.
-+ */
-+ return common_bits(node, key, bits) >= node->cidr;
-+}
-+
-+static struct allowedips_node *find_node(struct allowedips_node *trie, u8 bits,
-+ const u8 *key)
-+{
-+ struct allowedips_node *node = trie, *found = NULL;
-+
-+ while (node && prefix_matches(node, key, bits)) {
-+ if (rcu_access_pointer(node->peer))
-+ found = node;
-+ if (node->cidr == bits)
-+ break;
-+ node = rcu_dereference_bh(CHOOSE_NODE(node, key));
-+ }
-+ return found;
-+}
-+
-+/* Returns a strong reference to a peer */
-+static struct wg_peer *lookup(struct allowedips_node __rcu *root, u8 bits,
-+ const void *be_ip)
-+{
-+ /* Aligned so it can be passed to fls/fls64 */
-+ u8 ip[16] __aligned(__alignof(u64));
-+ struct allowedips_node *node;
-+ struct wg_peer *peer = NULL;
-+
-+ swap_endian(ip, be_ip, bits);
-+
-+ rcu_read_lock_bh();
-+retry:
-+ node = find_node(rcu_dereference_bh(root), bits, ip);
-+ if (node) {
-+ peer = wg_peer_get_maybe_zero(rcu_dereference_bh(node->peer));
-+ if (!peer)
-+ goto retry;
-+ }
-+ rcu_read_unlock_bh();
-+ return peer;
-+}
-+
-+static bool node_placement(struct allowedips_node __rcu *trie, const u8 *key,
-+ u8 cidr, u8 bits, struct allowedips_node **rnode,
-+ struct mutex *lock)
-+{
-+ struct allowedips_node *node = rcu_dereference_protected(trie,
-+ lockdep_is_held(lock));
-+ struct allowedips_node *parent = NULL;
-+ bool exact = false;
-+
-+ while (node && node->cidr <= cidr && prefix_matches(node, key, bits)) {
-+ parent = node;
-+ if (parent->cidr == cidr) {
-+ exact = true;
-+ break;
-+ }
-+ node = rcu_dereference_protected(CHOOSE_NODE(parent, key),
-+ lockdep_is_held(lock));
-+ }
-+ *rnode = parent;
-+ return exact;
-+}
-+
-+static int add(struct allowedips_node __rcu **trie, u8 bits, const u8 *key,
-+ u8 cidr, struct wg_peer *peer, struct mutex *lock)
-+{
-+ struct allowedips_node *node, *parent, *down, *newnode;
-+
-+ if (unlikely(cidr > bits || !peer))
-+ return -EINVAL;
-+
-+ if (!rcu_access_pointer(*trie)) {
-+ node = kzalloc(sizeof(*node), GFP_KERNEL);
-+ if (unlikely(!node))
-+ return -ENOMEM;
-+ RCU_INIT_POINTER(node->peer, peer);
-+ list_add_tail(&node->peer_list, &peer->allowedips_list);
-+ copy_and_assign_cidr(node, key, cidr, bits);
-+ rcu_assign_pointer(*trie, node);
-+ return 0;
-+ }
-+ if (node_placement(*trie, key, cidr, bits, &node, lock)) {
-+ rcu_assign_pointer(node->peer, peer);
-+ list_move_tail(&node->peer_list, &peer->allowedips_list);
-+ return 0;
-+ }
-+
-+ newnode = kzalloc(sizeof(*newnode), GFP_KERNEL);
-+ if (unlikely(!newnode))
-+ return -ENOMEM;
-+ RCU_INIT_POINTER(newnode->peer, peer);
-+ list_add_tail(&newnode->peer_list, &peer->allowedips_list);
-+ copy_and_assign_cidr(newnode, key, cidr, bits);
-+
-+ if (!node) {
-+ down = rcu_dereference_protected(*trie, lockdep_is_held(lock));
-+ } else {
-+ down = rcu_dereference_protected(CHOOSE_NODE(node, key),
-+ lockdep_is_held(lock));
-+ if (!down) {
-+ rcu_assign_pointer(CHOOSE_NODE(node, key), newnode);
-+ return 0;
-+ }
-+ }
-+ cidr = min(cidr, common_bits(down, key, bits));
-+ parent = node;
-+
-+ if (newnode->cidr == cidr) {
-+ rcu_assign_pointer(CHOOSE_NODE(newnode, down->bits), down);
-+ if (!parent)
-+ rcu_assign_pointer(*trie, newnode);
-+ else
-+ rcu_assign_pointer(CHOOSE_NODE(parent, newnode->bits),
-+ newnode);
-+ } else {
-+ node = kzalloc(sizeof(*node), GFP_KERNEL);
-+ if (unlikely(!node)) {
-+ kfree(newnode);
-+ return -ENOMEM;
-+ }
-+ INIT_LIST_HEAD(&node->peer_list);
-+ copy_and_assign_cidr(node, newnode->bits, cidr, bits);
-+
-+ rcu_assign_pointer(CHOOSE_NODE(node, down->bits), down);
-+ rcu_assign_pointer(CHOOSE_NODE(node, newnode->bits), newnode);
-+ if (!parent)
-+ rcu_assign_pointer(*trie, node);
-+ else
-+ rcu_assign_pointer(CHOOSE_NODE(parent, node->bits),
-+ node);
-+ }
-+ return 0;
-+}
-+
-+void wg_allowedips_init(struct allowedips *table)
-+{
-+ table->root4 = table->root6 = NULL;
-+ table->seq = 1;
-+}
-+
-+void wg_allowedips_free(struct allowedips *table, struct mutex *lock)
-+{
-+ struct allowedips_node __rcu *old4 = table->root4, *old6 = table->root6;
-+
-+ ++table->seq;
-+ RCU_INIT_POINTER(table->root4, NULL);
-+ RCU_INIT_POINTER(table->root6, NULL);
-+ if (rcu_access_pointer(old4)) {
-+ struct allowedips_node *node = rcu_dereference_protected(old4,
-+ lockdep_is_held(lock));
-+
-+ root_remove_peer_lists(node);
-+ call_rcu(&node->rcu, root_free_rcu);
-+ }
-+ if (rcu_access_pointer(old6)) {
-+ struct allowedips_node *node = rcu_dereference_protected(old6,
-+ lockdep_is_held(lock));
-+
-+ root_remove_peer_lists(node);
-+ call_rcu(&node->rcu, root_free_rcu);
-+ }
-+}
-+
-+int wg_allowedips_insert_v4(struct allowedips *table, const struct in_addr *ip,
-+ u8 cidr, struct wg_peer *peer, struct mutex *lock)
-+{
-+ /* Aligned so it can be passed to fls */
-+ u8 key[4] __aligned(__alignof(u32));
-+
-+ ++table->seq;
-+ swap_endian(key, (const u8 *)ip, 32);
-+ return add(&table->root4, 32, key, cidr, peer, lock);
-+}
-+
-+int wg_allowedips_insert_v6(struct allowedips *table, const struct in6_addr *ip,
-+ u8 cidr, struct wg_peer *peer, struct mutex *lock)
-+{
-+ /* Aligned so it can be passed to fls64 */
-+ u8 key[16] __aligned(__alignof(u64));
-+
-+ ++table->seq;
-+ swap_endian(key, (const u8 *)ip, 128);
-+ return add(&table->root6, 128, key, cidr, peer, lock);
-+}
-+
-+void wg_allowedips_remove_by_peer(struct allowedips *table,
-+ struct wg_peer *peer, struct mutex *lock)
-+{
-+ ++table->seq;
-+ walk_remove_by_peer(&table->root4, peer, lock);
-+ walk_remove_by_peer(&table->root6, peer, lock);
-+}
-+
-+int wg_allowedips_read_node(struct allowedips_node *node, u8 ip[16], u8 *cidr)
-+{
-+ const unsigned int cidr_bytes = DIV_ROUND_UP(node->cidr, 8U);
-+ swap_endian(ip, node->bits, node->bitlen);
-+ memset(ip + cidr_bytes, 0, node->bitlen / 8U - cidr_bytes);
-+ if (node->cidr)
-+ ip[cidr_bytes - 1U] &= ~0U << (-node->cidr % 8U);
-+
-+ *cidr = node->cidr;
-+ return node->bitlen == 32 ? AF_INET : AF_INET6;
-+}
-+
-+/* Returns a strong reference to a peer */
-+struct wg_peer *wg_allowedips_lookup_dst(struct allowedips *table,
-+ struct sk_buff *skb)
-+{
-+ if (skb->protocol == htons(ETH_P_IP))
-+ return lookup(table->root4, 32, &ip_hdr(skb)->daddr);
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ return lookup(table->root6, 128, &ipv6_hdr(skb)->daddr);
-+ return NULL;
-+}
-+
-+/* Returns a strong reference to a peer */
-+struct wg_peer *wg_allowedips_lookup_src(struct allowedips *table,
-+ struct sk_buff *skb)
-+{
-+ if (skb->protocol == htons(ETH_P_IP))
-+ return lookup(table->root4, 32, &ip_hdr(skb)->saddr);
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ return lookup(table->root6, 128, &ipv6_hdr(skb)->saddr);
-+ return NULL;
-+}
-+
-+#include "selftest/allowedips.c"
---- /dev/null
-+++ b/drivers/net/wireguard/allowedips.h
-@@ -0,0 +1,59 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_ALLOWEDIPS_H
-+#define _WG_ALLOWEDIPS_H
-+
-+#include <linux/mutex.h>
-+#include <linux/ip.h>
-+#include <linux/ipv6.h>
-+
-+struct wg_peer;
-+
-+struct allowedips_node {
-+ struct wg_peer __rcu *peer;
-+ struct allowedips_node __rcu *bit[2];
-+ /* While it may seem scandalous that we waste space for v4,
-+ * we're alloc'ing to the nearest power of 2 anyway, so this
-+ * doesn't actually make a difference.
-+ */
-+ u8 bits[16] __aligned(__alignof(u64));
-+ u8 cidr, bit_at_a, bit_at_b, bitlen;
-+
-+ /* Keep rarely used list at bottom to be beyond cache line. */
-+ union {
-+ struct list_head peer_list;
-+ struct rcu_head rcu;
-+ };
-+};
-+
-+struct allowedips {
-+ struct allowedips_node __rcu *root4;
-+ struct allowedips_node __rcu *root6;
-+ u64 seq;
-+};
-+
-+void wg_allowedips_init(struct allowedips *table);
-+void wg_allowedips_free(struct allowedips *table, struct mutex *mutex);
-+int wg_allowedips_insert_v4(struct allowedips *table, const struct in_addr *ip,
-+ u8 cidr, struct wg_peer *peer, struct mutex *lock);
-+int wg_allowedips_insert_v6(struct allowedips *table, const struct in6_addr *ip,
-+ u8 cidr, struct wg_peer *peer, struct mutex *lock);
-+void wg_allowedips_remove_by_peer(struct allowedips *table,
-+ struct wg_peer *peer, struct mutex *lock);
-+/* The ip input pointer should be __aligned(__alignof(u64))) */
-+int wg_allowedips_read_node(struct allowedips_node *node, u8 ip[16], u8 *cidr);
-+
-+/* These return a strong reference to a peer: */
-+struct wg_peer *wg_allowedips_lookup_dst(struct allowedips *table,
-+ struct sk_buff *skb);
-+struct wg_peer *wg_allowedips_lookup_src(struct allowedips *table,
-+ struct sk_buff *skb);
-+
-+#ifdef DEBUG
-+bool wg_allowedips_selftest(void);
-+#endif
-+
-+#endif /* _WG_ALLOWEDIPS_H */
---- /dev/null
-+++ b/drivers/net/wireguard/cookie.c
-@@ -0,0 +1,236 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "cookie.h"
-+#include "peer.h"
-+#include "device.h"
-+#include "messages.h"
-+#include "ratelimiter.h"
-+#include "timers.h"
-+
-+#include <crypto/blake2s.h>
-+#include <crypto/chacha20poly1305.h>
-+
-+#include <net/ipv6.h>
-+#include <crypto/algapi.h>
-+
-+void wg_cookie_checker_init(struct cookie_checker *checker,
-+ struct wg_device *wg)
-+{
-+ init_rwsem(&checker->secret_lock);
-+ checker->secret_birthdate = ktime_get_coarse_boottime_ns();
-+ get_random_bytes(checker->secret, NOISE_HASH_LEN);
-+ checker->device = wg;
-+}
-+
-+enum { COOKIE_KEY_LABEL_LEN = 8 };
-+static const u8 mac1_key_label[COOKIE_KEY_LABEL_LEN] = "mac1----";
-+static const u8 cookie_key_label[COOKIE_KEY_LABEL_LEN] = "cookie--";
-+
-+static void precompute_key(u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ const u8 pubkey[NOISE_PUBLIC_KEY_LEN],
-+ const u8 label[COOKIE_KEY_LABEL_LEN])
-+{
-+ struct blake2s_state blake;
-+
-+ blake2s_init(&blake, NOISE_SYMMETRIC_KEY_LEN);
-+ blake2s_update(&blake, label, COOKIE_KEY_LABEL_LEN);
-+ blake2s_update(&blake, pubkey, NOISE_PUBLIC_KEY_LEN);
-+ blake2s_final(&blake, key);
-+}
-+
-+/* Must hold peer->handshake.static_identity->lock */
-+void wg_cookie_checker_precompute_device_keys(struct cookie_checker *checker)
-+{
-+ if (likely(checker->device->static_identity.has_identity)) {
-+ precompute_key(checker->cookie_encryption_key,
-+ checker->device->static_identity.static_public,
-+ cookie_key_label);
-+ precompute_key(checker->message_mac1_key,
-+ checker->device->static_identity.static_public,
-+ mac1_key_label);
-+ } else {
-+ memset(checker->cookie_encryption_key, 0,
-+ NOISE_SYMMETRIC_KEY_LEN);
-+ memset(checker->message_mac1_key, 0, NOISE_SYMMETRIC_KEY_LEN);
-+ }
-+}
-+
-+void wg_cookie_checker_precompute_peer_keys(struct wg_peer *peer)
-+{
-+ precompute_key(peer->latest_cookie.cookie_decryption_key,
-+ peer->handshake.remote_static, cookie_key_label);
-+ precompute_key(peer->latest_cookie.message_mac1_key,
-+ peer->handshake.remote_static, mac1_key_label);
-+}
-+
-+void wg_cookie_init(struct cookie *cookie)
-+{
-+ memset(cookie, 0, sizeof(*cookie));
-+ init_rwsem(&cookie->lock);
-+}
-+
-+static void compute_mac1(u8 mac1[COOKIE_LEN], const void *message, size_t len,
-+ const u8 key[NOISE_SYMMETRIC_KEY_LEN])
-+{
-+ len = len - sizeof(struct message_macs) +
-+ offsetof(struct message_macs, mac1);
-+ blake2s(mac1, message, key, COOKIE_LEN, len, NOISE_SYMMETRIC_KEY_LEN);
-+}
-+
-+static void compute_mac2(u8 mac2[COOKIE_LEN], const void *message, size_t len,
-+ const u8 cookie[COOKIE_LEN])
-+{
-+ len = len - sizeof(struct message_macs) +
-+ offsetof(struct message_macs, mac2);
-+ blake2s(mac2, message, cookie, COOKIE_LEN, len, COOKIE_LEN);
-+}
-+
-+static void make_cookie(u8 cookie[COOKIE_LEN], struct sk_buff *skb,
-+ struct cookie_checker *checker)
-+{
-+ struct blake2s_state state;
-+
-+ if (wg_birthdate_has_expired(checker->secret_birthdate,
-+ COOKIE_SECRET_MAX_AGE)) {
-+ down_write(&checker->secret_lock);
-+ checker->secret_birthdate = ktime_get_coarse_boottime_ns();
-+ get_random_bytes(checker->secret, NOISE_HASH_LEN);
-+ up_write(&checker->secret_lock);
-+ }
-+
-+ down_read(&checker->secret_lock);
-+
-+ blake2s_init_key(&state, COOKIE_LEN, checker->secret, NOISE_HASH_LEN);
-+ if (skb->protocol == htons(ETH_P_IP))
-+ blake2s_update(&state, (u8 *)&ip_hdr(skb)->saddr,
-+ sizeof(struct in_addr));
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ blake2s_update(&state, (u8 *)&ipv6_hdr(skb)->saddr,
-+ sizeof(struct in6_addr));
-+ blake2s_update(&state, (u8 *)&udp_hdr(skb)->source, sizeof(__be16));
-+ blake2s_final(&state, cookie);
-+
-+ up_read(&checker->secret_lock);
-+}
-+
-+enum cookie_mac_state wg_cookie_validate_packet(struct cookie_checker *checker,
-+ struct sk_buff *skb,
-+ bool check_cookie)
-+{
-+ struct message_macs *macs = (struct message_macs *)
-+ (skb->data + skb->len - sizeof(*macs));
-+ enum cookie_mac_state ret;
-+ u8 computed_mac[COOKIE_LEN];
-+ u8 cookie[COOKIE_LEN];
-+
-+ ret = INVALID_MAC;
-+ compute_mac1(computed_mac, skb->data, skb->len,
-+ checker->message_mac1_key);
-+ if (crypto_memneq(computed_mac, macs->mac1, COOKIE_LEN))
-+ goto out;
-+
-+ ret = VALID_MAC_BUT_NO_COOKIE;
-+
-+ if (!check_cookie)
-+ goto out;
-+
-+ make_cookie(cookie, skb, checker);
-+
-+ compute_mac2(computed_mac, skb->data, skb->len, cookie);
-+ if (crypto_memneq(computed_mac, macs->mac2, COOKIE_LEN))
-+ goto out;
-+
-+ ret = VALID_MAC_WITH_COOKIE_BUT_RATELIMITED;
-+ if (!wg_ratelimiter_allow(skb, dev_net(checker->device->dev)))
-+ goto out;
-+
-+ ret = VALID_MAC_WITH_COOKIE;
-+
-+out:
-+ return ret;
-+}
-+
-+void wg_cookie_add_mac_to_packet(void *message, size_t len,
-+ struct wg_peer *peer)
-+{
-+ struct message_macs *macs = (struct message_macs *)
-+ ((u8 *)message + len - sizeof(*macs));
-+
-+ down_write(&peer->latest_cookie.lock);
-+ compute_mac1(macs->mac1, message, len,
-+ peer->latest_cookie.message_mac1_key);
-+ memcpy(peer->latest_cookie.last_mac1_sent, macs->mac1, COOKIE_LEN);
-+ peer->latest_cookie.have_sent_mac1 = true;
-+ up_write(&peer->latest_cookie.lock);
-+
-+ down_read(&peer->latest_cookie.lock);
-+ if (peer->latest_cookie.is_valid &&
-+ !wg_birthdate_has_expired(peer->latest_cookie.birthdate,
-+ COOKIE_SECRET_MAX_AGE - COOKIE_SECRET_LATENCY))
-+ compute_mac2(macs->mac2, message, len,
-+ peer->latest_cookie.cookie);
-+ else
-+ memset(macs->mac2, 0, COOKIE_LEN);
-+ up_read(&peer->latest_cookie.lock);
-+}
-+
-+void wg_cookie_message_create(struct message_handshake_cookie *dst,
-+ struct sk_buff *skb, __le32 index,
-+ struct cookie_checker *checker)
-+{
-+ struct message_macs *macs = (struct message_macs *)
-+ ((u8 *)skb->data + skb->len - sizeof(*macs));
-+ u8 cookie[COOKIE_LEN];
-+
-+ dst->header.type = cpu_to_le32(MESSAGE_HANDSHAKE_COOKIE);
-+ dst->receiver_index = index;
-+ get_random_bytes_wait(dst->nonce, COOKIE_NONCE_LEN);
-+
-+ make_cookie(cookie, skb, checker);
-+ xchacha20poly1305_encrypt(dst->encrypted_cookie, cookie, COOKIE_LEN,
-+ macs->mac1, COOKIE_LEN, dst->nonce,
-+ checker->cookie_encryption_key);
-+}
-+
-+void wg_cookie_message_consume(struct message_handshake_cookie *src,
-+ struct wg_device *wg)
-+{
-+ struct wg_peer *peer = NULL;
-+ u8 cookie[COOKIE_LEN];
-+ bool ret;
-+
-+ if (unlikely(!wg_index_hashtable_lookup(wg->index_hashtable,
-+ INDEX_HASHTABLE_HANDSHAKE |
-+ INDEX_HASHTABLE_KEYPAIR,
-+ src->receiver_index, &peer)))
-+ return;
-+
-+ down_read(&peer->latest_cookie.lock);
-+ if (unlikely(!peer->latest_cookie.have_sent_mac1)) {
-+ up_read(&peer->latest_cookie.lock);
-+ goto out;
-+ }
-+ ret = xchacha20poly1305_decrypt(
-+ cookie, src->encrypted_cookie, sizeof(src->encrypted_cookie),
-+ peer->latest_cookie.last_mac1_sent, COOKIE_LEN, src->nonce,
-+ peer->latest_cookie.cookie_decryption_key);
-+ up_read(&peer->latest_cookie.lock);
-+
-+ if (ret) {
-+ down_write(&peer->latest_cookie.lock);
-+ memcpy(peer->latest_cookie.cookie, cookie, COOKIE_LEN);
-+ peer->latest_cookie.birthdate = ktime_get_coarse_boottime_ns();
-+ peer->latest_cookie.is_valid = true;
-+ peer->latest_cookie.have_sent_mac1 = false;
-+ up_write(&peer->latest_cookie.lock);
-+ } else {
-+ net_dbg_ratelimited("%s: Could not decrypt invalid cookie response\n",
-+ wg->dev->name);
-+ }
-+
-+out:
-+ wg_peer_put(peer);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/cookie.h
-@@ -0,0 +1,59 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_COOKIE_H
-+#define _WG_COOKIE_H
-+
-+#include "messages.h"
-+#include <linux/rwsem.h>
-+
-+struct wg_peer;
-+
-+struct cookie_checker {
-+ u8 secret[NOISE_HASH_LEN];
-+ u8 cookie_encryption_key[NOISE_SYMMETRIC_KEY_LEN];
-+ u8 message_mac1_key[NOISE_SYMMETRIC_KEY_LEN];
-+ u64 secret_birthdate;
-+ struct rw_semaphore secret_lock;
-+ struct wg_device *device;
-+};
-+
-+struct cookie {
-+ u64 birthdate;
-+ bool is_valid;
-+ u8 cookie[COOKIE_LEN];
-+ bool have_sent_mac1;
-+ u8 last_mac1_sent[COOKIE_LEN];
-+ u8 cookie_decryption_key[NOISE_SYMMETRIC_KEY_LEN];
-+ u8 message_mac1_key[NOISE_SYMMETRIC_KEY_LEN];
-+ struct rw_semaphore lock;
-+};
-+
-+enum cookie_mac_state {
-+ INVALID_MAC,
-+ VALID_MAC_BUT_NO_COOKIE,
-+ VALID_MAC_WITH_COOKIE_BUT_RATELIMITED,
-+ VALID_MAC_WITH_COOKIE
-+};
-+
-+void wg_cookie_checker_init(struct cookie_checker *checker,
-+ struct wg_device *wg);
-+void wg_cookie_checker_precompute_device_keys(struct cookie_checker *checker);
-+void wg_cookie_checker_precompute_peer_keys(struct wg_peer *peer);
-+void wg_cookie_init(struct cookie *cookie);
-+
-+enum cookie_mac_state wg_cookie_validate_packet(struct cookie_checker *checker,
-+ struct sk_buff *skb,
-+ bool check_cookie);
-+void wg_cookie_add_mac_to_packet(void *message, size_t len,
-+ struct wg_peer *peer);
-+
-+void wg_cookie_message_create(struct message_handshake_cookie *src,
-+ struct sk_buff *skb, __le32 index,
-+ struct cookie_checker *checker);
-+void wg_cookie_message_consume(struct message_handshake_cookie *src,
-+ struct wg_device *wg);
-+
-+#endif /* _WG_COOKIE_H */
---- /dev/null
-+++ b/drivers/net/wireguard/device.c
-@@ -0,0 +1,458 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "queueing.h"
-+#include "socket.h"
-+#include "timers.h"
-+#include "device.h"
-+#include "ratelimiter.h"
-+#include "peer.h"
-+#include "messages.h"
-+
-+#include <linux/module.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/inet.h>
-+#include <linux/netdevice.h>
-+#include <linux/inetdevice.h>
-+#include <linux/if_arp.h>
-+#include <linux/icmp.h>
-+#include <linux/suspend.h>
-+#include <net/icmp.h>
-+#include <net/rtnetlink.h>
-+#include <net/ip_tunnels.h>
-+#include <net/addrconf.h>
-+
-+static LIST_HEAD(device_list);
-+
-+static int wg_open(struct net_device *dev)
-+{
-+ struct in_device *dev_v4 = __in_dev_get_rtnl(dev);
-+ struct inet6_dev *dev_v6 = __in6_dev_get(dev);
-+ struct wg_device *wg = netdev_priv(dev);
-+ struct wg_peer *peer;
-+ int ret;
-+
-+ if (dev_v4) {
-+ /* At some point we might put this check near the ip_rt_send_
-+ * redirect call of ip_forward in net/ipv4/ip_forward.c, similar
-+ * to the current secpath check.
-+ */
-+ IN_DEV_CONF_SET(dev_v4, SEND_REDIRECTS, false);
-+ IPV4_DEVCONF_ALL(dev_net(dev), SEND_REDIRECTS) = false;
-+ }
-+ if (dev_v6)
-+ dev_v6->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_NONE;
-+
-+ ret = wg_socket_init(wg, wg->incoming_port);
-+ if (ret < 0)
-+ return ret;
-+ mutex_lock(&wg->device_update_lock);
-+ list_for_each_entry(peer, &wg->peer_list, peer_list) {
-+ wg_packet_send_staged_packets(peer);
-+ if (peer->persistent_keepalive_interval)
-+ wg_packet_send_keepalive(peer);
-+ }
-+ mutex_unlock(&wg->device_update_lock);
-+ return 0;
-+}
-+
-+#ifdef CONFIG_PM_SLEEP
-+static int wg_pm_notification(struct notifier_block *nb, unsigned long action,
-+ void *data)
-+{
-+ struct wg_device *wg;
-+ struct wg_peer *peer;
-+
-+ /* If the machine is constantly suspending and resuming, as part of
-+ * its normal operation rather than as a somewhat rare event, then we
-+ * don't actually want to clear keys.
-+ */
-+ if (IS_ENABLED(CONFIG_PM_AUTOSLEEP) || IS_ENABLED(CONFIG_ANDROID))
-+ return 0;
-+
-+ if (action != PM_HIBERNATION_PREPARE && action != PM_SUSPEND_PREPARE)
-+ return 0;
-+
-+ rtnl_lock();
-+ list_for_each_entry(wg, &device_list, device_list) {
-+ mutex_lock(&wg->device_update_lock);
-+ list_for_each_entry(peer, &wg->peer_list, peer_list) {
-+ del_timer(&peer->timer_zero_key_material);
-+ wg_noise_handshake_clear(&peer->handshake);
-+ wg_noise_keypairs_clear(&peer->keypairs);
-+ }
-+ mutex_unlock(&wg->device_update_lock);
-+ }
-+ rtnl_unlock();
-+ rcu_barrier();
-+ return 0;
-+}
-+
-+static struct notifier_block pm_notifier = { .notifier_call = wg_pm_notification };
-+#endif
-+
-+static int wg_stop(struct net_device *dev)
-+{
-+ struct wg_device *wg = netdev_priv(dev);
-+ struct wg_peer *peer;
-+
-+ mutex_lock(&wg->device_update_lock);
-+ list_for_each_entry(peer, &wg->peer_list, peer_list) {
-+ wg_packet_purge_staged_packets(peer);
-+ wg_timers_stop(peer);
-+ wg_noise_handshake_clear(&peer->handshake);
-+ wg_noise_keypairs_clear(&peer->keypairs);
-+ wg_noise_reset_last_sent_handshake(&peer->last_sent_handshake);
-+ }
-+ mutex_unlock(&wg->device_update_lock);
-+ skb_queue_purge(&wg->incoming_handshakes);
-+ wg_socket_reinit(wg, NULL, NULL);
-+ return 0;
-+}
-+
-+static netdev_tx_t wg_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+ struct wg_device *wg = netdev_priv(dev);
-+ struct sk_buff_head packets;
-+ struct wg_peer *peer;
-+ struct sk_buff *next;
-+ sa_family_t family;
-+ u32 mtu;
-+ int ret;
-+
-+ if (unlikely(wg_skb_examine_untrusted_ip_hdr(skb) != skb->protocol)) {
-+ ret = -EPROTONOSUPPORT;
-+ net_dbg_ratelimited("%s: Invalid IP packet\n", dev->name);
-+ goto err;
-+ }
-+
-+ peer = wg_allowedips_lookup_dst(&wg->peer_allowedips, skb);
-+ if (unlikely(!peer)) {
-+ ret = -ENOKEY;
-+ if (skb->protocol == htons(ETH_P_IP))
-+ net_dbg_ratelimited("%s: No peer has allowed IPs matching %pI4\n",
-+ dev->name, &ip_hdr(skb)->daddr);
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ net_dbg_ratelimited("%s: No peer has allowed IPs matching %pI6\n",
-+ dev->name, &ipv6_hdr(skb)->daddr);
-+ goto err;
-+ }
-+
-+ family = READ_ONCE(peer->endpoint.addr.sa_family);
-+ if (unlikely(family != AF_INET && family != AF_INET6)) {
-+ ret = -EDESTADDRREQ;
-+ net_dbg_ratelimited("%s: No valid endpoint has been configured or discovered for peer %llu\n",
-+ dev->name, peer->internal_id);
-+ goto err_peer;
-+ }
-+
-+ mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
-+
-+ __skb_queue_head_init(&packets);
-+ if (!skb_is_gso(skb)) {
-+ skb_mark_not_on_list(skb);
-+ } else {
-+ struct sk_buff *segs = skb_gso_segment(skb, 0);
-+
-+ if (unlikely(IS_ERR(segs))) {
-+ ret = PTR_ERR(segs);
-+ goto err_peer;
-+ }
-+ dev_kfree_skb(skb);
-+ skb = segs;
-+ }
-+
-+ skb_list_walk_safe(skb, skb, next) {
-+ skb_mark_not_on_list(skb);
-+
-+ skb = skb_share_check(skb, GFP_ATOMIC);
-+ if (unlikely(!skb))
-+ continue;
-+
-+ /* We only need to keep the original dst around for icmp,
-+ * so at this point we're in a position to drop it.
-+ */
-+ skb_dst_drop(skb);
-+
-+ PACKET_CB(skb)->mtu = mtu;
-+
-+ __skb_queue_tail(&packets, skb);
-+ }
-+
-+ spin_lock_bh(&peer->staged_packet_queue.lock);
-+ /* If the queue is getting too big, we start removing the oldest packets
-+ * until it's small again. We do this before adding the new packet, so
-+ * we don't remove GSO segments that are in excess.
-+ */
-+ while (skb_queue_len(&peer->staged_packet_queue) > MAX_STAGED_PACKETS) {
-+ dev_kfree_skb(__skb_dequeue(&peer->staged_packet_queue));
-+ ++dev->stats.tx_dropped;
-+ }
-+ skb_queue_splice_tail(&packets, &peer->staged_packet_queue);
-+ spin_unlock_bh(&peer->staged_packet_queue.lock);
-+
-+ wg_packet_send_staged_packets(peer);
-+
-+ wg_peer_put(peer);
-+ return NETDEV_TX_OK;
-+
-+err_peer:
-+ wg_peer_put(peer);
-+err:
-+ ++dev->stats.tx_errors;
-+ if (skb->protocol == htons(ETH_P_IP))
-+ icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
-+ kfree_skb(skb);
-+ return ret;
-+}
-+
-+static const struct net_device_ops netdev_ops = {
-+ .ndo_open = wg_open,
-+ .ndo_stop = wg_stop,
-+ .ndo_start_xmit = wg_xmit,
-+ .ndo_get_stats64 = ip_tunnel_get_stats64
-+};
-+
-+static void wg_destruct(struct net_device *dev)
-+{
-+ struct wg_device *wg = netdev_priv(dev);
-+
-+ rtnl_lock();
-+ list_del(&wg->device_list);
-+ rtnl_unlock();
-+ mutex_lock(&wg->device_update_lock);
-+ wg->incoming_port = 0;
-+ wg_socket_reinit(wg, NULL, NULL);
-+ /* The final references are cleared in the below calls to destroy_workqueue. */
-+ wg_peer_remove_all(wg);
-+ destroy_workqueue(wg->handshake_receive_wq);
-+ destroy_workqueue(wg->handshake_send_wq);
-+ destroy_workqueue(wg->packet_crypt_wq);
-+ wg_packet_queue_free(&wg->decrypt_queue, true);
-+ wg_packet_queue_free(&wg->encrypt_queue, true);
-+ rcu_barrier(); /* Wait for all the peers to be actually freed. */
-+ wg_ratelimiter_uninit();
-+ memzero_explicit(&wg->static_identity, sizeof(wg->static_identity));
-+ skb_queue_purge(&wg->incoming_handshakes);
-+ free_percpu(dev->tstats);
-+ free_percpu(wg->incoming_handshakes_worker);
-+ if (wg->have_creating_net_ref)
-+ put_net(wg->creating_net);
-+ kvfree(wg->index_hashtable);
-+ kvfree(wg->peer_hashtable);
-+ mutex_unlock(&wg->device_update_lock);
-+
-+ pr_debug("%s: Interface deleted\n", dev->name);
-+ free_netdev(dev);
-+}
-+
-+static const struct device_type device_type = { .name = KBUILD_MODNAME };
-+
-+static void wg_setup(struct net_device *dev)
-+{
-+ struct wg_device *wg = netdev_priv(dev);
-+ enum { WG_NETDEV_FEATURES = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
-+ NETIF_F_SG | NETIF_F_GSO |
-+ NETIF_F_GSO_SOFTWARE | NETIF_F_HIGHDMA };
-+
-+ dev->netdev_ops = &netdev_ops;
-+ dev->hard_header_len = 0;
-+ dev->addr_len = 0;
-+ dev->needed_headroom = DATA_PACKET_HEAD_ROOM;
-+ dev->needed_tailroom = noise_encrypted_len(MESSAGE_PADDING_MULTIPLE);
-+ dev->type = ARPHRD_NONE;
-+ dev->flags = IFF_POINTOPOINT | IFF_NOARP;
-+ dev->priv_flags |= IFF_NO_QUEUE;
-+ dev->features |= NETIF_F_LLTX;
-+ dev->features |= WG_NETDEV_FEATURES;
-+ dev->hw_features |= WG_NETDEV_FEATURES;
-+ dev->hw_enc_features |= WG_NETDEV_FEATURES;
-+ dev->mtu = ETH_DATA_LEN - MESSAGE_MINIMUM_LENGTH -
-+ sizeof(struct udphdr) -
-+ max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
-+
-+ SET_NETDEV_DEVTYPE(dev, &device_type);
-+
-+ /* We need to keep the dst around in case of icmp replies. */
-+ netif_keep_dst(dev);
-+
-+ memset(wg, 0, sizeof(*wg));
-+ wg->dev = dev;
-+}
-+
-+static int wg_newlink(struct net *src_net, struct net_device *dev,
-+ struct nlattr *tb[], struct nlattr *data[],
-+ struct netlink_ext_ack *extack)
-+{
-+ struct wg_device *wg = netdev_priv(dev);
-+ int ret = -ENOMEM;
-+
-+ wg->creating_net = src_net;
-+ init_rwsem(&wg->static_identity.lock);
-+ mutex_init(&wg->socket_update_lock);
-+ mutex_init(&wg->device_update_lock);
-+ skb_queue_head_init(&wg->incoming_handshakes);
-+ wg_allowedips_init(&wg->peer_allowedips);
-+ wg_cookie_checker_init(&wg->cookie_checker, wg);
-+ INIT_LIST_HEAD(&wg->peer_list);
-+ wg->device_update_gen = 1;
-+
-+ wg->peer_hashtable = wg_pubkey_hashtable_alloc();
-+ if (!wg->peer_hashtable)
-+ return ret;
-+
-+ wg->index_hashtable = wg_index_hashtable_alloc();
-+ if (!wg->index_hashtable)
-+ goto err_free_peer_hashtable;
-+
-+ dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
-+ if (!dev->tstats)
-+ goto err_free_index_hashtable;
-+
-+ wg->incoming_handshakes_worker =
-+ wg_packet_percpu_multicore_worker_alloc(
-+ wg_packet_handshake_receive_worker, wg);
-+ if (!wg->incoming_handshakes_worker)
-+ goto err_free_tstats;
-+
-+ wg->handshake_receive_wq = alloc_workqueue("wg-kex-%s",
-+ WQ_CPU_INTENSIVE | WQ_FREEZABLE, 0, dev->name);
-+ if (!wg->handshake_receive_wq)
-+ goto err_free_incoming_handshakes;
-+
-+ wg->handshake_send_wq = alloc_workqueue("wg-kex-%s",
-+ WQ_UNBOUND | WQ_FREEZABLE, 0, dev->name);
-+ if (!wg->handshake_send_wq)
-+ goto err_destroy_handshake_receive;
-+
-+ wg->packet_crypt_wq = alloc_workqueue("wg-crypt-%s",
-+ WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 0, dev->name);
-+ if (!wg->packet_crypt_wq)
-+ goto err_destroy_handshake_send;
-+
-+ ret = wg_packet_queue_init(&wg->encrypt_queue, wg_packet_encrypt_worker,
-+ true, MAX_QUEUED_PACKETS);
-+ if (ret < 0)
-+ goto err_destroy_packet_crypt;
-+
-+ ret = wg_packet_queue_init(&wg->decrypt_queue, wg_packet_decrypt_worker,
-+ true, MAX_QUEUED_PACKETS);
-+ if (ret < 0)
-+ goto err_free_encrypt_queue;
-+
-+ ret = wg_ratelimiter_init();
-+ if (ret < 0)
-+ goto err_free_decrypt_queue;
-+
-+ ret = register_netdevice(dev);
-+ if (ret < 0)
-+ goto err_uninit_ratelimiter;
-+
-+ list_add(&wg->device_list, &device_list);
-+
-+ /* We wait until the end to assign priv_destructor, so that
-+ * register_netdevice doesn't call it for us if it fails.
-+ */
-+ dev->priv_destructor = wg_destruct;
-+
-+ pr_debug("%s: Interface created\n", dev->name);
-+ return ret;
-+
-+err_uninit_ratelimiter:
-+ wg_ratelimiter_uninit();
-+err_free_decrypt_queue:
-+ wg_packet_queue_free(&wg->decrypt_queue, true);
-+err_free_encrypt_queue:
-+ wg_packet_queue_free(&wg->encrypt_queue, true);
-+err_destroy_packet_crypt:
-+ destroy_workqueue(wg->packet_crypt_wq);
-+err_destroy_handshake_send:
-+ destroy_workqueue(wg->handshake_send_wq);
-+err_destroy_handshake_receive:
-+ destroy_workqueue(wg->handshake_receive_wq);
-+err_free_incoming_handshakes:
-+ free_percpu(wg->incoming_handshakes_worker);
-+err_free_tstats:
-+ free_percpu(dev->tstats);
-+err_free_index_hashtable:
-+ kvfree(wg->index_hashtable);
-+err_free_peer_hashtable:
-+ kvfree(wg->peer_hashtable);
-+ return ret;
-+}
-+
-+static struct rtnl_link_ops link_ops __read_mostly = {
-+ .kind = KBUILD_MODNAME,
-+ .priv_size = sizeof(struct wg_device),
-+ .setup = wg_setup,
-+ .newlink = wg_newlink,
-+};
-+
-+static int wg_netdevice_notification(struct notifier_block *nb,
-+ unsigned long action, void *data)
-+{
-+ struct net_device *dev = ((struct netdev_notifier_info *)data)->dev;
-+ struct wg_device *wg = netdev_priv(dev);
-+
-+ ASSERT_RTNL();
-+
-+ if (action != NETDEV_REGISTER || dev->netdev_ops != &netdev_ops)
-+ return 0;
-+
-+ if (dev_net(dev) == wg->creating_net && wg->have_creating_net_ref) {
-+ put_net(wg->creating_net);
-+ wg->have_creating_net_ref = false;
-+ } else if (dev_net(dev) != wg->creating_net &&
-+ !wg->have_creating_net_ref) {
-+ wg->have_creating_net_ref = true;
-+ get_net(wg->creating_net);
-+ }
-+ return 0;
-+}
-+
-+static struct notifier_block netdevice_notifier = {
-+ .notifier_call = wg_netdevice_notification
-+};
-+
-+int __init wg_device_init(void)
-+{
-+ int ret;
-+
-+#ifdef CONFIG_PM_SLEEP
-+ ret = register_pm_notifier(&pm_notifier);
-+ if (ret)
-+ return ret;
-+#endif
-+
-+ ret = register_netdevice_notifier(&netdevice_notifier);
-+ if (ret)
-+ goto error_pm;
-+
-+ ret = rtnl_link_register(&link_ops);
-+ if (ret)
-+ goto error_netdevice;
-+
-+ return 0;
-+
-+error_netdevice:
-+ unregister_netdevice_notifier(&netdevice_notifier);
-+error_pm:
-+#ifdef CONFIG_PM_SLEEP
-+ unregister_pm_notifier(&pm_notifier);
-+#endif
-+ return ret;
-+}
-+
-+void wg_device_uninit(void)
-+{
-+ rtnl_link_unregister(&link_ops);
-+ unregister_netdevice_notifier(&netdevice_notifier);
-+#ifdef CONFIG_PM_SLEEP
-+ unregister_pm_notifier(&pm_notifier);
-+#endif
-+ rcu_barrier();
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/device.h
-@@ -0,0 +1,65 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_DEVICE_H
-+#define _WG_DEVICE_H
-+
-+#include "noise.h"
-+#include "allowedips.h"
-+#include "peerlookup.h"
-+#include "cookie.h"
-+
-+#include <linux/types.h>
-+#include <linux/netdevice.h>
-+#include <linux/workqueue.h>
-+#include <linux/mutex.h>
-+#include <linux/net.h>
-+#include <linux/ptr_ring.h>
-+
-+struct wg_device;
-+
-+struct multicore_worker {
-+ void *ptr;
-+ struct work_struct work;
-+};
-+
-+struct crypt_queue {
-+ struct ptr_ring ring;
-+ union {
-+ struct {
-+ struct multicore_worker __percpu *worker;
-+ int last_cpu;
-+ };
-+ struct work_struct work;
-+ };
-+};
-+
-+struct wg_device {
-+ struct net_device *dev;
-+ struct crypt_queue encrypt_queue, decrypt_queue;
-+ struct sock __rcu *sock4, *sock6;
-+ struct net *creating_net;
-+ struct noise_static_identity static_identity;
-+ struct workqueue_struct *handshake_receive_wq, *handshake_send_wq;
-+ struct workqueue_struct *packet_crypt_wq;
-+ struct sk_buff_head incoming_handshakes;
-+ int incoming_handshake_cpu;
-+ struct multicore_worker __percpu *incoming_handshakes_worker;
-+ struct cookie_checker cookie_checker;
-+ struct pubkey_hashtable *peer_hashtable;
-+ struct index_hashtable *index_hashtable;
-+ struct allowedips peer_allowedips;
-+ struct mutex device_update_lock, socket_update_lock;
-+ struct list_head device_list, peer_list;
-+ unsigned int num_peers, device_update_gen;
-+ u32 fwmark;
-+ u16 incoming_port;
-+ bool have_creating_net_ref;
-+};
-+
-+int wg_device_init(void);
-+void wg_device_uninit(void);
-+
-+#endif /* _WG_DEVICE_H */
---- /dev/null
-+++ b/drivers/net/wireguard/main.c
-@@ -0,0 +1,64 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "version.h"
-+#include "device.h"
-+#include "noise.h"
-+#include "queueing.h"
-+#include "ratelimiter.h"
-+#include "netlink.h"
-+
-+#include <uapi/linux/wireguard.h>
-+
-+#include <linux/version.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/genetlink.h>
-+#include <net/rtnetlink.h>
-+
-+static int __init mod_init(void)
-+{
-+ int ret;
-+
-+#ifdef DEBUG
-+ if (!wg_allowedips_selftest() || !wg_packet_counter_selftest() ||
-+ !wg_ratelimiter_selftest())
-+ return -ENOTRECOVERABLE;
-+#endif
-+ wg_noise_init();
-+
-+ ret = wg_device_init();
-+ if (ret < 0)
-+ goto err_device;
-+
-+ ret = wg_genetlink_init();
-+ if (ret < 0)
-+ goto err_netlink;
-+
-+ pr_info("WireGuard " WIREGUARD_VERSION " loaded. See www.wireguard.com for information.\n");
-+ pr_info("Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.\n");
-+
-+ return 0;
-+
-+err_netlink:
-+ wg_device_uninit();
-+err_device:
-+ return ret;
-+}
-+
-+static void __exit mod_exit(void)
-+{
-+ wg_genetlink_uninit();
-+ wg_device_uninit();
-+}
-+
-+module_init(mod_init);
-+module_exit(mod_exit);
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("WireGuard secure network tunnel");
-+MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
-+MODULE_VERSION(WIREGUARD_VERSION);
-+MODULE_ALIAS_RTNL_LINK(KBUILD_MODNAME);
-+MODULE_ALIAS_GENL_FAMILY(WG_GENL_NAME);
---- /dev/null
-+++ b/drivers/net/wireguard/messages.h
-@@ -0,0 +1,128 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_MESSAGES_H
-+#define _WG_MESSAGES_H
-+
-+#include <crypto/curve25519.h>
-+#include <crypto/chacha20poly1305.h>
-+#include <crypto/blake2s.h>
-+
-+#include <linux/kernel.h>
-+#include <linux/param.h>
-+#include <linux/skbuff.h>
-+
-+enum noise_lengths {
-+ NOISE_PUBLIC_KEY_LEN = CURVE25519_KEY_SIZE,
-+ NOISE_SYMMETRIC_KEY_LEN = CHACHA20POLY1305_KEY_SIZE,
-+ NOISE_TIMESTAMP_LEN = sizeof(u64) + sizeof(u32),
-+ NOISE_AUTHTAG_LEN = CHACHA20POLY1305_AUTHTAG_SIZE,
-+ NOISE_HASH_LEN = BLAKE2S_HASH_SIZE
-+};
-+
-+#define noise_encrypted_len(plain_len) ((plain_len) + NOISE_AUTHTAG_LEN)
-+
-+enum cookie_values {
-+ COOKIE_SECRET_MAX_AGE = 2 * 60,
-+ COOKIE_SECRET_LATENCY = 5,
-+ COOKIE_NONCE_LEN = XCHACHA20POLY1305_NONCE_SIZE,
-+ COOKIE_LEN = 16
-+};
-+
-+enum counter_values {
-+ COUNTER_BITS_TOTAL = 2048,
-+ COUNTER_REDUNDANT_BITS = BITS_PER_LONG,
-+ COUNTER_WINDOW_SIZE = COUNTER_BITS_TOTAL - COUNTER_REDUNDANT_BITS
-+};
-+
-+enum limits {
-+ REKEY_AFTER_MESSAGES = 1ULL << 60,
-+ REJECT_AFTER_MESSAGES = U64_MAX - COUNTER_WINDOW_SIZE - 1,
-+ REKEY_TIMEOUT = 5,
-+ REKEY_TIMEOUT_JITTER_MAX_JIFFIES = HZ / 3,
-+ REKEY_AFTER_TIME = 120,
-+ REJECT_AFTER_TIME = 180,
-+ INITIATIONS_PER_SECOND = 50,
-+ MAX_PEERS_PER_DEVICE = 1U << 20,
-+ KEEPALIVE_TIMEOUT = 10,
-+ MAX_TIMER_HANDSHAKES = 90 / REKEY_TIMEOUT,
-+ MAX_QUEUED_INCOMING_HANDSHAKES = 4096, /* TODO: replace this with DQL */
-+ MAX_STAGED_PACKETS = 128,
-+ MAX_QUEUED_PACKETS = 1024 /* TODO: replace this with DQL */
-+};
-+
-+enum message_type {
-+ MESSAGE_INVALID = 0,
-+ MESSAGE_HANDSHAKE_INITIATION = 1,
-+ MESSAGE_HANDSHAKE_RESPONSE = 2,
-+ MESSAGE_HANDSHAKE_COOKIE = 3,
-+ MESSAGE_DATA = 4
-+};
-+
-+struct message_header {
-+ /* The actual layout of this that we want is:
-+ * u8 type
-+ * u8 reserved_zero[3]
-+ *
-+ * But it turns out that by encoding this as little endian,
-+ * we achieve the same thing, and it makes checking faster.
-+ */
-+ __le32 type;
-+};
-+
-+struct message_macs {
-+ u8 mac1[COOKIE_LEN];
-+ u8 mac2[COOKIE_LEN];
-+};
-+
-+struct message_handshake_initiation {
-+ struct message_header header;
-+ __le32 sender_index;
-+ u8 unencrypted_ephemeral[NOISE_PUBLIC_KEY_LEN];
-+ u8 encrypted_static[noise_encrypted_len(NOISE_PUBLIC_KEY_LEN)];
-+ u8 encrypted_timestamp[noise_encrypted_len(NOISE_TIMESTAMP_LEN)];
-+ struct message_macs macs;
-+};
-+
-+struct message_handshake_response {
-+ struct message_header header;
-+ __le32 sender_index;
-+ __le32 receiver_index;
-+ u8 unencrypted_ephemeral[NOISE_PUBLIC_KEY_LEN];
-+ u8 encrypted_nothing[noise_encrypted_len(0)];
-+ struct message_macs macs;
-+};
-+
-+struct message_handshake_cookie {
-+ struct message_header header;
-+ __le32 receiver_index;
-+ u8 nonce[COOKIE_NONCE_LEN];
-+ u8 encrypted_cookie[noise_encrypted_len(COOKIE_LEN)];
-+};
-+
-+struct message_data {
-+ struct message_header header;
-+ __le32 key_idx;
-+ __le64 counter;
-+ u8 encrypted_data[];
-+};
-+
-+#define message_data_len(plain_len) \
-+ (noise_encrypted_len(plain_len) + sizeof(struct message_data))
-+
-+enum message_alignments {
-+ MESSAGE_PADDING_MULTIPLE = 16,
-+ MESSAGE_MINIMUM_LENGTH = message_data_len(0)
-+};
-+
-+#define SKB_HEADER_LEN \
-+ (max(sizeof(struct iphdr), sizeof(struct ipv6hdr)) + \
-+ sizeof(struct udphdr) + NET_SKB_PAD)
-+#define DATA_PACKET_HEAD_ROOM \
-+ ALIGN(sizeof(struct message_data) + SKB_HEADER_LEN, 4)
-+
-+enum { HANDSHAKE_DSCP = 0x88 /* AF41, plus 00 ECN */ };
-+
-+#endif /* _WG_MESSAGES_H */
---- /dev/null
-+++ b/drivers/net/wireguard/netlink.c
-@@ -0,0 +1,648 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "netlink.h"
-+#include "device.h"
-+#include "peer.h"
-+#include "socket.h"
-+#include "queueing.h"
-+#include "messages.h"
-+
-+#include <uapi/linux/wireguard.h>
-+
-+#include <linux/if.h>
-+#include <net/genetlink.h>
-+#include <net/sock.h>
-+#include <crypto/algapi.h>
-+
-+static struct genl_family genl_family;
-+
-+static const struct nla_policy device_policy[WGDEVICE_A_MAX + 1] = {
-+ [WGDEVICE_A_IFINDEX] = { .type = NLA_U32 },
-+ [WGDEVICE_A_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ - 1 },
-+ [WGDEVICE_A_PRIVATE_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-+ [WGDEVICE_A_PUBLIC_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-+ [WGDEVICE_A_FLAGS] = { .type = NLA_U32 },
-+ [WGDEVICE_A_LISTEN_PORT] = { .type = NLA_U16 },
-+ [WGDEVICE_A_FWMARK] = { .type = NLA_U32 },
-+ [WGDEVICE_A_PEERS] = { .type = NLA_NESTED }
-+};
-+
-+static const struct nla_policy peer_policy[WGPEER_A_MAX + 1] = {
-+ [WGPEER_A_PUBLIC_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-+ [WGPEER_A_PRESHARED_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_SYMMETRIC_KEY_LEN },
-+ [WGPEER_A_FLAGS] = { .type = NLA_U32 },
-+ [WGPEER_A_ENDPOINT] = { .type = NLA_MIN_LEN, .len = sizeof(struct sockaddr) },
-+ [WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL] = { .type = NLA_U16 },
-+ [WGPEER_A_LAST_HANDSHAKE_TIME] = { .type = NLA_EXACT_LEN, .len = sizeof(struct __kernel_timespec) },
-+ [WGPEER_A_RX_BYTES] = { .type = NLA_U64 },
-+ [WGPEER_A_TX_BYTES] = { .type = NLA_U64 },
-+ [WGPEER_A_ALLOWEDIPS] = { .type = NLA_NESTED },
-+ [WGPEER_A_PROTOCOL_VERSION] = { .type = NLA_U32 }
-+};
-+
-+static const struct nla_policy allowedip_policy[WGALLOWEDIP_A_MAX + 1] = {
-+ [WGALLOWEDIP_A_FAMILY] = { .type = NLA_U16 },
-+ [WGALLOWEDIP_A_IPADDR] = { .type = NLA_MIN_LEN, .len = sizeof(struct in_addr) },
-+ [WGALLOWEDIP_A_CIDR_MASK] = { .type = NLA_U8 }
-+};
-+
-+static struct wg_device *lookup_interface(struct nlattr **attrs,
-+ struct sk_buff *skb)
-+{
-+ struct net_device *dev = NULL;
-+
-+ if (!attrs[WGDEVICE_A_IFINDEX] == !attrs[WGDEVICE_A_IFNAME])
-+ return ERR_PTR(-EBADR);
-+ if (attrs[WGDEVICE_A_IFINDEX])
-+ dev = dev_get_by_index(sock_net(skb->sk),
-+ nla_get_u32(attrs[WGDEVICE_A_IFINDEX]));
-+ else if (attrs[WGDEVICE_A_IFNAME])
-+ dev = dev_get_by_name(sock_net(skb->sk),
-+ nla_data(attrs[WGDEVICE_A_IFNAME]));
-+ if (!dev)
-+ return ERR_PTR(-ENODEV);
-+ if (!dev->rtnl_link_ops || !dev->rtnl_link_ops->kind ||
-+ strcmp(dev->rtnl_link_ops->kind, KBUILD_MODNAME)) {
-+ dev_put(dev);
-+ return ERR_PTR(-EOPNOTSUPP);
-+ }
-+ return netdev_priv(dev);
-+}
-+
-+static int get_allowedips(struct sk_buff *skb, const u8 *ip, u8 cidr,
-+ int family)
-+{
-+ struct nlattr *allowedip_nest;
-+
-+ allowedip_nest = nla_nest_start(skb, 0);
-+ if (!allowedip_nest)
-+ return -EMSGSIZE;
-+
-+ if (nla_put_u8(skb, WGALLOWEDIP_A_CIDR_MASK, cidr) ||
-+ nla_put_u16(skb, WGALLOWEDIP_A_FAMILY, family) ||
-+ nla_put(skb, WGALLOWEDIP_A_IPADDR, family == AF_INET6 ?
-+ sizeof(struct in6_addr) : sizeof(struct in_addr), ip)) {
-+ nla_nest_cancel(skb, allowedip_nest);
-+ return -EMSGSIZE;
-+ }
-+
-+ nla_nest_end(skb, allowedip_nest);
-+ return 0;
-+}
-+
-+struct dump_ctx {
-+ struct wg_device *wg;
-+ struct wg_peer *next_peer;
-+ u64 allowedips_seq;
-+ struct allowedips_node *next_allowedip;
-+};
-+
-+#define DUMP_CTX(cb) ((struct dump_ctx *)(cb)->args)
-+
-+static int
-+get_peer(struct wg_peer *peer, struct sk_buff *skb, struct dump_ctx *ctx)
-+{
-+
-+ struct nlattr *allowedips_nest, *peer_nest = nla_nest_start(skb, 0);
-+ struct allowedips_node *allowedips_node = ctx->next_allowedip;
-+ bool fail;
-+
-+ if (!peer_nest)
-+ return -EMSGSIZE;
-+
-+ down_read(&peer->handshake.lock);
-+ fail = nla_put(skb, WGPEER_A_PUBLIC_KEY, NOISE_PUBLIC_KEY_LEN,
-+ peer->handshake.remote_static);
-+ up_read(&peer->handshake.lock);
-+ if (fail)
-+ goto err;
-+
-+ if (!allowedips_node) {
-+ const struct __kernel_timespec last_handshake = {
-+ .tv_sec = peer->walltime_last_handshake.tv_sec,
-+ .tv_nsec = peer->walltime_last_handshake.tv_nsec
-+ };
-+
-+ down_read(&peer->handshake.lock);
-+ fail = nla_put(skb, WGPEER_A_PRESHARED_KEY,
-+ NOISE_SYMMETRIC_KEY_LEN,
-+ peer->handshake.preshared_key);
-+ up_read(&peer->handshake.lock);
-+ if (fail)
-+ goto err;
-+
-+ if (nla_put(skb, WGPEER_A_LAST_HANDSHAKE_TIME,
-+ sizeof(last_handshake), &last_handshake) ||
-+ nla_put_u16(skb, WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL,
-+ peer->persistent_keepalive_interval) ||
-+ nla_put_u64_64bit(skb, WGPEER_A_TX_BYTES, peer->tx_bytes,
-+ WGPEER_A_UNSPEC) ||
-+ nla_put_u64_64bit(skb, WGPEER_A_RX_BYTES, peer->rx_bytes,
-+ WGPEER_A_UNSPEC) ||
-+ nla_put_u32(skb, WGPEER_A_PROTOCOL_VERSION, 1))
-+ goto err;
-+
-+ read_lock_bh(&peer->endpoint_lock);
-+ if (peer->endpoint.addr.sa_family == AF_INET)
-+ fail = nla_put(skb, WGPEER_A_ENDPOINT,
-+ sizeof(peer->endpoint.addr4),
-+ &peer->endpoint.addr4);
-+ else if (peer->endpoint.addr.sa_family == AF_INET6)
-+ fail = nla_put(skb, WGPEER_A_ENDPOINT,
-+ sizeof(peer->endpoint.addr6),
-+ &peer->endpoint.addr6);
-+ read_unlock_bh(&peer->endpoint_lock);
-+ if (fail)
-+ goto err;
-+ allowedips_node =
-+ list_first_entry_or_null(&peer->allowedips_list,
-+ struct allowedips_node, peer_list);
-+ }
-+ if (!allowedips_node)
-+ goto no_allowedips;
-+ if (!ctx->allowedips_seq)
-+ ctx->allowedips_seq = peer->device->peer_allowedips.seq;
-+ else if (ctx->allowedips_seq != peer->device->peer_allowedips.seq)
-+ goto no_allowedips;
-+
-+ allowedips_nest = nla_nest_start(skb, WGPEER_A_ALLOWEDIPS);
-+ if (!allowedips_nest)
-+ goto err;
-+
-+ list_for_each_entry_from(allowedips_node, &peer->allowedips_list,
-+ peer_list) {
-+ u8 cidr, ip[16] __aligned(__alignof(u64));
-+ int family;
-+
-+ family = wg_allowedips_read_node(allowedips_node, ip, &cidr);
-+ if (get_allowedips(skb, ip, cidr, family)) {
-+ nla_nest_end(skb, allowedips_nest);
-+ nla_nest_end(skb, peer_nest);
-+ ctx->next_allowedip = allowedips_node;
-+ return -EMSGSIZE;
-+ }
-+ }
-+ nla_nest_end(skb, allowedips_nest);
-+no_allowedips:
-+ nla_nest_end(skb, peer_nest);
-+ ctx->next_allowedip = NULL;
-+ ctx->allowedips_seq = 0;
-+ return 0;
-+err:
-+ nla_nest_cancel(skb, peer_nest);
-+ return -EMSGSIZE;
-+}
-+
-+static int wg_get_device_start(struct netlink_callback *cb)
-+{
-+ struct nlattr **attrs = genl_family_attrbuf(&genl_family);
-+ struct wg_device *wg;
-+ int ret;
-+
-+ ret = nlmsg_parse(cb->nlh, GENL_HDRLEN + genl_family.hdrsize, attrs,
-+ genl_family.maxattr, device_policy, NULL);
-+ if (ret < 0)
-+ return ret;
-+ wg = lookup_interface(attrs, cb->skb);
-+ if (IS_ERR(wg))
-+ return PTR_ERR(wg);
-+ DUMP_CTX(cb)->wg = wg;
-+ return 0;
-+}
-+
-+static int wg_get_device_dump(struct sk_buff *skb, struct netlink_callback *cb)
-+{
-+ struct wg_peer *peer, *next_peer_cursor;
-+ struct dump_ctx *ctx = DUMP_CTX(cb);
-+ struct wg_device *wg = ctx->wg;
-+ struct nlattr *peers_nest;
-+ int ret = -EMSGSIZE;
-+ bool done = true;
-+ void *hdr;
-+
-+ rtnl_lock();
-+ mutex_lock(&wg->device_update_lock);
-+ cb->seq = wg->device_update_gen;
-+ next_peer_cursor = ctx->next_peer;
-+
-+ hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
-+ &genl_family, NLM_F_MULTI, WG_CMD_GET_DEVICE);
-+ if (!hdr)
-+ goto out;
-+ genl_dump_check_consistent(cb, hdr);
-+
-+ if (!ctx->next_peer) {
-+ if (nla_put_u16(skb, WGDEVICE_A_LISTEN_PORT,
-+ wg->incoming_port) ||
-+ nla_put_u32(skb, WGDEVICE_A_FWMARK, wg->fwmark) ||
-+ nla_put_u32(skb, WGDEVICE_A_IFINDEX, wg->dev->ifindex) ||
-+ nla_put_string(skb, WGDEVICE_A_IFNAME, wg->dev->name))
-+ goto out;
-+
-+ down_read(&wg->static_identity.lock);
-+ if (wg->static_identity.has_identity) {
-+ if (nla_put(skb, WGDEVICE_A_PRIVATE_KEY,
-+ NOISE_PUBLIC_KEY_LEN,
-+ wg->static_identity.static_private) ||
-+ nla_put(skb, WGDEVICE_A_PUBLIC_KEY,
-+ NOISE_PUBLIC_KEY_LEN,
-+ wg->static_identity.static_public)) {
-+ up_read(&wg->static_identity.lock);
-+ goto out;
-+ }
-+ }
-+ up_read(&wg->static_identity.lock);
-+ }
-+
-+ peers_nest = nla_nest_start(skb, WGDEVICE_A_PEERS);
-+ if (!peers_nest)
-+ goto out;
-+ ret = 0;
-+ /* If the last cursor was removed via list_del_init in peer_remove, then
-+ * we just treat this the same as there being no more peers left. The
-+ * reason is that seq_nr should indicate to userspace that this isn't a
-+ * coherent dump anyway, so they'll try again.
-+ */
-+ if (list_empty(&wg->peer_list) ||
-+ (ctx->next_peer && list_empty(&ctx->next_peer->peer_list))) {
-+ nla_nest_cancel(skb, peers_nest);
-+ goto out;
-+ }
-+ lockdep_assert_held(&wg->device_update_lock);
-+ peer = list_prepare_entry(ctx->next_peer, &wg->peer_list, peer_list);
-+ list_for_each_entry_continue(peer, &wg->peer_list, peer_list) {
-+ if (get_peer(peer, skb, ctx)) {
-+ done = false;
-+ break;
-+ }
-+ next_peer_cursor = peer;
-+ }
-+ nla_nest_end(skb, peers_nest);
-+
-+out:
-+ if (!ret && !done && next_peer_cursor)
-+ wg_peer_get(next_peer_cursor);
-+ wg_peer_put(ctx->next_peer);
-+ mutex_unlock(&wg->device_update_lock);
-+ rtnl_unlock();
-+
-+ if (ret) {
-+ genlmsg_cancel(skb, hdr);
-+ return ret;
-+ }
-+ genlmsg_end(skb, hdr);
-+ if (done) {
-+ ctx->next_peer = NULL;
-+ return 0;
-+ }
-+ ctx->next_peer = next_peer_cursor;
-+ return skb->len;
-+
-+ /* At this point, we can't really deal ourselves with safely zeroing out
-+ * the private key material after usage. This will need an additional API
-+ * in the kernel for marking skbs as zero_on_free.
-+ */
-+}
-+
-+static int wg_get_device_done(struct netlink_callback *cb)
-+{
-+ struct dump_ctx *ctx = DUMP_CTX(cb);
-+
-+ if (ctx->wg)
-+ dev_put(ctx->wg->dev);
-+ wg_peer_put(ctx->next_peer);
-+ return 0;
-+}
-+
-+static int set_port(struct wg_device *wg, u16 port)
-+{
-+ struct wg_peer *peer;
-+
-+ if (wg->incoming_port == port)
-+ return 0;
-+ list_for_each_entry(peer, &wg->peer_list, peer_list)
-+ wg_socket_clear_peer_endpoint_src(peer);
-+ if (!netif_running(wg->dev)) {
-+ wg->incoming_port = port;
-+ return 0;
-+ }
-+ return wg_socket_init(wg, port);
-+}
-+
-+static int set_allowedip(struct wg_peer *peer, struct nlattr **attrs)
-+{
-+ int ret = -EINVAL;
-+ u16 family;
-+ u8 cidr;
-+
-+ if (!attrs[WGALLOWEDIP_A_FAMILY] || !attrs[WGALLOWEDIP_A_IPADDR] ||
-+ !attrs[WGALLOWEDIP_A_CIDR_MASK])
-+ return ret;
-+ family = nla_get_u16(attrs[WGALLOWEDIP_A_FAMILY]);
-+ cidr = nla_get_u8(attrs[WGALLOWEDIP_A_CIDR_MASK]);
-+
-+ if (family == AF_INET && cidr <= 32 &&
-+ nla_len(attrs[WGALLOWEDIP_A_IPADDR]) == sizeof(struct in_addr))
-+ ret = wg_allowedips_insert_v4(
-+ &peer->device->peer_allowedips,
-+ nla_data(attrs[WGALLOWEDIP_A_IPADDR]), cidr, peer,
-+ &peer->device->device_update_lock);
-+ else if (family == AF_INET6 && cidr <= 128 &&
-+ nla_len(attrs[WGALLOWEDIP_A_IPADDR]) == sizeof(struct in6_addr))
-+ ret = wg_allowedips_insert_v6(
-+ &peer->device->peer_allowedips,
-+ nla_data(attrs[WGALLOWEDIP_A_IPADDR]), cidr, peer,
-+ &peer->device->device_update_lock);
-+
-+ return ret;
-+}
-+
-+static int set_peer(struct wg_device *wg, struct nlattr **attrs)
-+{
-+ u8 *public_key = NULL, *preshared_key = NULL;
-+ struct wg_peer *peer = NULL;
-+ u32 flags = 0;
-+ int ret;
-+
-+ ret = -EINVAL;
-+ if (attrs[WGPEER_A_PUBLIC_KEY] &&
-+ nla_len(attrs[WGPEER_A_PUBLIC_KEY]) == NOISE_PUBLIC_KEY_LEN)
-+ public_key = nla_data(attrs[WGPEER_A_PUBLIC_KEY]);
-+ else
-+ goto out;
-+ if (attrs[WGPEER_A_PRESHARED_KEY] &&
-+ nla_len(attrs[WGPEER_A_PRESHARED_KEY]) == NOISE_SYMMETRIC_KEY_LEN)
-+ preshared_key = nla_data(attrs[WGPEER_A_PRESHARED_KEY]);
-+
-+ if (attrs[WGPEER_A_FLAGS])
-+ flags = nla_get_u32(attrs[WGPEER_A_FLAGS]);
-+ ret = -EOPNOTSUPP;
-+ if (flags & ~__WGPEER_F_ALL)
-+ goto out;
-+
-+ ret = -EPFNOSUPPORT;
-+ if (attrs[WGPEER_A_PROTOCOL_VERSION]) {
-+ if (nla_get_u32(attrs[WGPEER_A_PROTOCOL_VERSION]) != 1)
-+ goto out;
-+ }
-+
-+ peer = wg_pubkey_hashtable_lookup(wg->peer_hashtable,
-+ nla_data(attrs[WGPEER_A_PUBLIC_KEY]));
-+ ret = 0;
-+ if (!peer) { /* Peer doesn't exist yet. Add a new one. */
-+ if (flags & (WGPEER_F_REMOVE_ME | WGPEER_F_UPDATE_ONLY))
-+ goto out;
-+
-+ /* The peer is new, so there aren't allowed IPs to remove. */
-+ flags &= ~WGPEER_F_REPLACE_ALLOWEDIPS;
-+
-+ down_read(&wg->static_identity.lock);
-+ if (wg->static_identity.has_identity &&
-+ !memcmp(nla_data(attrs[WGPEER_A_PUBLIC_KEY]),
-+ wg->static_identity.static_public,
-+ NOISE_PUBLIC_KEY_LEN)) {
-+ /* We silently ignore peers that have the same public
-+ * key as the device. The reason we do it silently is
-+ * that we'd like for people to be able to reuse the
-+ * same set of API calls across peers.
-+ */
-+ up_read(&wg->static_identity.lock);
-+ ret = 0;
-+ goto out;
-+ }
-+ up_read(&wg->static_identity.lock);
-+
-+ peer = wg_peer_create(wg, public_key, preshared_key);
-+ if (IS_ERR(peer)) {
-+ /* Similar to the above, if the key is invalid, we skip
-+ * it without fanfare, so that services don't need to
-+ * worry about doing key validation themselves.
-+ */
-+ ret = PTR_ERR(peer) == -EKEYREJECTED ? 0 : PTR_ERR(peer);
-+ peer = NULL;
-+ goto out;
-+ }
-+ /* Take additional reference, as though we've just been
-+ * looked up.
-+ */
-+ wg_peer_get(peer);
-+ }
-+
-+ if (flags & WGPEER_F_REMOVE_ME) {
-+ wg_peer_remove(peer);
-+ goto out;
-+ }
-+
-+ if (preshared_key) {
-+ down_write(&peer->handshake.lock);
-+ memcpy(&peer->handshake.preshared_key, preshared_key,
-+ NOISE_SYMMETRIC_KEY_LEN);
-+ up_write(&peer->handshake.lock);
-+ }
-+
-+ if (attrs[WGPEER_A_ENDPOINT]) {
-+ struct sockaddr *addr = nla_data(attrs[WGPEER_A_ENDPOINT]);
-+ size_t len = nla_len(attrs[WGPEER_A_ENDPOINT]);
-+
-+ if ((len == sizeof(struct sockaddr_in) &&
-+ addr->sa_family == AF_INET) ||
-+ (len == sizeof(struct sockaddr_in6) &&
-+ addr->sa_family == AF_INET6)) {
-+ struct endpoint endpoint = { { { 0 } } };
-+
-+ memcpy(&endpoint.addr, addr, len);
-+ wg_socket_set_peer_endpoint(peer, &endpoint);
-+ }
-+ }
-+
-+ if (flags & WGPEER_F_REPLACE_ALLOWEDIPS)
-+ wg_allowedips_remove_by_peer(&wg->peer_allowedips, peer,
-+ &wg->device_update_lock);
-+
-+ if (attrs[WGPEER_A_ALLOWEDIPS]) {
-+ struct nlattr *attr, *allowedip[WGALLOWEDIP_A_MAX + 1];
-+ int rem;
-+
-+ nla_for_each_nested(attr, attrs[WGPEER_A_ALLOWEDIPS], rem) {
-+ ret = nla_parse_nested(allowedip, WGALLOWEDIP_A_MAX,
-+ attr, allowedip_policy, NULL);
-+ if (ret < 0)
-+ goto out;
-+ ret = set_allowedip(peer, allowedip);
-+ if (ret < 0)
-+ goto out;
-+ }
-+ }
-+
-+ if (attrs[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL]) {
-+ const u16 persistent_keepalive_interval = nla_get_u16(
-+ attrs[WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL]);
-+ const bool send_keepalive =
-+ !peer->persistent_keepalive_interval &&
-+ persistent_keepalive_interval &&
-+ netif_running(wg->dev);
-+
-+ peer->persistent_keepalive_interval = persistent_keepalive_interval;
-+ if (send_keepalive)
-+ wg_packet_send_keepalive(peer);
-+ }
-+
-+ if (netif_running(wg->dev))
-+ wg_packet_send_staged_packets(peer);
-+
-+out:
-+ wg_peer_put(peer);
-+ if (attrs[WGPEER_A_PRESHARED_KEY])
-+ memzero_explicit(nla_data(attrs[WGPEER_A_PRESHARED_KEY]),
-+ nla_len(attrs[WGPEER_A_PRESHARED_KEY]));
-+ return ret;
-+}
-+
-+static int wg_set_device(struct sk_buff *skb, struct genl_info *info)
-+{
-+ struct wg_device *wg = lookup_interface(info->attrs, skb);
-+ u32 flags = 0;
-+ int ret;
-+
-+ if (IS_ERR(wg)) {
-+ ret = PTR_ERR(wg);
-+ goto out_nodev;
-+ }
-+
-+ rtnl_lock();
-+ mutex_lock(&wg->device_update_lock);
-+
-+ if (info->attrs[WGDEVICE_A_FLAGS])
-+ flags = nla_get_u32(info->attrs[WGDEVICE_A_FLAGS]);
-+ ret = -EOPNOTSUPP;
-+ if (flags & ~__WGDEVICE_F_ALL)
-+ goto out;
-+
-+ ret = -EPERM;
-+ if ((info->attrs[WGDEVICE_A_LISTEN_PORT] ||
-+ info->attrs[WGDEVICE_A_FWMARK]) &&
-+ !ns_capable(wg->creating_net->user_ns, CAP_NET_ADMIN))
-+ goto out;
-+
-+ ++wg->device_update_gen;
-+
-+ if (info->attrs[WGDEVICE_A_FWMARK]) {
-+ struct wg_peer *peer;
-+
-+ wg->fwmark = nla_get_u32(info->attrs[WGDEVICE_A_FWMARK]);
-+ list_for_each_entry(peer, &wg->peer_list, peer_list)
-+ wg_socket_clear_peer_endpoint_src(peer);
-+ }
-+
-+ if (info->attrs[WGDEVICE_A_LISTEN_PORT]) {
-+ ret = set_port(wg,
-+ nla_get_u16(info->attrs[WGDEVICE_A_LISTEN_PORT]));
-+ if (ret)
-+ goto out;
-+ }
-+
-+ if (flags & WGDEVICE_F_REPLACE_PEERS)
-+ wg_peer_remove_all(wg);
-+
-+ if (info->attrs[WGDEVICE_A_PRIVATE_KEY] &&
-+ nla_len(info->attrs[WGDEVICE_A_PRIVATE_KEY]) ==
-+ NOISE_PUBLIC_KEY_LEN) {
-+ u8 *private_key = nla_data(info->attrs[WGDEVICE_A_PRIVATE_KEY]);
-+ u8 public_key[NOISE_PUBLIC_KEY_LEN];
-+ struct wg_peer *peer, *temp;
-+
-+ if (!crypto_memneq(wg->static_identity.static_private,
-+ private_key, NOISE_PUBLIC_KEY_LEN))
-+ goto skip_set_private_key;
-+
-+ /* We remove before setting, to prevent race, which means doing
-+ * two 25519-genpub ops.
-+ */
-+ if (curve25519_generate_public(public_key, private_key)) {
-+ peer = wg_pubkey_hashtable_lookup(wg->peer_hashtable,
-+ public_key);
-+ if (peer) {
-+ wg_peer_put(peer);
-+ wg_peer_remove(peer);
-+ }
-+ }
-+
-+ down_write(&wg->static_identity.lock);
-+ wg_noise_set_static_identity_private_key(&wg->static_identity,
-+ private_key);
-+ list_for_each_entry_safe(peer, temp, &wg->peer_list,
-+ peer_list) {
-+ if (wg_noise_precompute_static_static(peer))
-+ wg_noise_expire_current_peer_keypairs(peer);
-+ else
-+ wg_peer_remove(peer);
-+ }
-+ wg_cookie_checker_precompute_device_keys(&wg->cookie_checker);
-+ up_write(&wg->static_identity.lock);
-+ }
-+skip_set_private_key:
-+
-+ if (info->attrs[WGDEVICE_A_PEERS]) {
-+ struct nlattr *attr, *peer[WGPEER_A_MAX + 1];
-+ int rem;
-+
-+ nla_for_each_nested(attr, info->attrs[WGDEVICE_A_PEERS], rem) {
-+ ret = nla_parse_nested(peer, WGPEER_A_MAX, attr,
-+ peer_policy, NULL);
-+ if (ret < 0)
-+ goto out;
-+ ret = set_peer(wg, peer);
-+ if (ret < 0)
-+ goto out;
-+ }
-+ }
-+ ret = 0;
-+
-+out:
-+ mutex_unlock(&wg->device_update_lock);
-+ rtnl_unlock();
-+ dev_put(wg->dev);
-+out_nodev:
-+ if (info->attrs[WGDEVICE_A_PRIVATE_KEY])
-+ memzero_explicit(nla_data(info->attrs[WGDEVICE_A_PRIVATE_KEY]),
-+ nla_len(info->attrs[WGDEVICE_A_PRIVATE_KEY]));
-+ return ret;
-+}
-+
-+static const struct genl_ops genl_ops[] = {
-+ {
-+ .cmd = WG_CMD_GET_DEVICE,
-+ .start = wg_get_device_start,
-+ .dumpit = wg_get_device_dump,
-+ .done = wg_get_device_done,
-+ .flags = GENL_UNS_ADMIN_PERM
-+ }, {
-+ .cmd = WG_CMD_SET_DEVICE,
-+ .doit = wg_set_device,
-+ .flags = GENL_UNS_ADMIN_PERM
-+ }
-+};
-+
-+static struct genl_family genl_family __ro_after_init = {
-+ .ops = genl_ops,
-+ .n_ops = ARRAY_SIZE(genl_ops),
-+ .name = WG_GENL_NAME,
-+ .version = WG_GENL_VERSION,
-+ .maxattr = WGDEVICE_A_MAX,
-+ .module = THIS_MODULE,
-+ .policy = device_policy,
-+ .netnsok = true
-+};
-+
-+int __init wg_genetlink_init(void)
-+{
-+ return genl_register_family(&genl_family);
-+}
-+
-+void __exit wg_genetlink_uninit(void)
-+{
-+ genl_unregister_family(&genl_family);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/netlink.h
-@@ -0,0 +1,12 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_NETLINK_H
-+#define _WG_NETLINK_H
-+
-+int wg_genetlink_init(void);
-+void wg_genetlink_uninit(void);
-+
-+#endif /* _WG_NETLINK_H */
---- /dev/null
-+++ b/drivers/net/wireguard/noise.c
-@@ -0,0 +1,828 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "noise.h"
-+#include "device.h"
-+#include "peer.h"
-+#include "messages.h"
-+#include "queueing.h"
-+#include "peerlookup.h"
-+
-+#include <linux/rcupdate.h>
-+#include <linux/slab.h>
-+#include <linux/bitmap.h>
-+#include <linux/scatterlist.h>
-+#include <linux/highmem.h>
-+#include <crypto/algapi.h>
-+
-+/* This implements Noise_IKpsk2:
-+ *
-+ * <- s
-+ * ******
-+ * -> e, es, s, ss, {t}
-+ * <- e, ee, se, psk, {}
-+ */
-+
-+static const u8 handshake_name[37] = "Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s";
-+static const u8 identifier_name[34] = "WireGuard v1 zx2c4 Jason@zx2c4.com";
-+static u8 handshake_init_hash[NOISE_HASH_LEN] __ro_after_init;
-+static u8 handshake_init_chaining_key[NOISE_HASH_LEN] __ro_after_init;
-+static atomic64_t keypair_counter = ATOMIC64_INIT(0);
-+
-+void __init wg_noise_init(void)
-+{
-+ struct blake2s_state blake;
-+
-+ blake2s(handshake_init_chaining_key, handshake_name, NULL,
-+ NOISE_HASH_LEN, sizeof(handshake_name), 0);
-+ blake2s_init(&blake, NOISE_HASH_LEN);
-+ blake2s_update(&blake, handshake_init_chaining_key, NOISE_HASH_LEN);
-+ blake2s_update(&blake, identifier_name, sizeof(identifier_name));
-+ blake2s_final(&blake, handshake_init_hash);
-+}
-+
-+/* Must hold peer->handshake.static_identity->lock */
-+bool wg_noise_precompute_static_static(struct wg_peer *peer)
-+{
-+ bool ret = true;
-+
-+ down_write(&peer->handshake.lock);
-+ if (peer->handshake.static_identity->has_identity)
-+ ret = curve25519(
-+ peer->handshake.precomputed_static_static,
-+ peer->handshake.static_identity->static_private,
-+ peer->handshake.remote_static);
-+ else
-+ memset(peer->handshake.precomputed_static_static, 0,
-+ NOISE_PUBLIC_KEY_LEN);
-+ up_write(&peer->handshake.lock);
-+ return ret;
-+}
-+
-+bool wg_noise_handshake_init(struct noise_handshake *handshake,
-+ struct noise_static_identity *static_identity,
-+ const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-+ struct wg_peer *peer)
-+{
-+ memset(handshake, 0, sizeof(*handshake));
-+ init_rwsem(&handshake->lock);
-+ handshake->entry.type = INDEX_HASHTABLE_HANDSHAKE;
-+ handshake->entry.peer = peer;
-+ memcpy(handshake->remote_static, peer_public_key, NOISE_PUBLIC_KEY_LEN);
-+ if (peer_preshared_key)
-+ memcpy(handshake->preshared_key, peer_preshared_key,
-+ NOISE_SYMMETRIC_KEY_LEN);
-+ handshake->static_identity = static_identity;
-+ handshake->state = HANDSHAKE_ZEROED;
-+ return wg_noise_precompute_static_static(peer);
-+}
-+
-+static void handshake_zero(struct noise_handshake *handshake)
-+{
-+ memset(&handshake->ephemeral_private, 0, NOISE_PUBLIC_KEY_LEN);
-+ memset(&handshake->remote_ephemeral, 0, NOISE_PUBLIC_KEY_LEN);
-+ memset(&handshake->hash, 0, NOISE_HASH_LEN);
-+ memset(&handshake->chaining_key, 0, NOISE_HASH_LEN);
-+ handshake->remote_index = 0;
-+ handshake->state = HANDSHAKE_ZEROED;
-+}
-+
-+void wg_noise_handshake_clear(struct noise_handshake *handshake)
-+{
-+ wg_index_hashtable_remove(
-+ handshake->entry.peer->device->index_hashtable,
-+ &handshake->entry);
-+ down_write(&handshake->lock);
-+ handshake_zero(handshake);
-+ up_write(&handshake->lock);
-+ wg_index_hashtable_remove(
-+ handshake->entry.peer->device->index_hashtable,
-+ &handshake->entry);
-+}
-+
-+static struct noise_keypair *keypair_create(struct wg_peer *peer)
-+{
-+ struct noise_keypair *keypair = kzalloc(sizeof(*keypair), GFP_KERNEL);
-+
-+ if (unlikely(!keypair))
-+ return NULL;
-+ keypair->internal_id = atomic64_inc_return(&keypair_counter);
-+ keypair->entry.type = INDEX_HASHTABLE_KEYPAIR;
-+ keypair->entry.peer = peer;
-+ kref_init(&keypair->refcount);
-+ return keypair;
-+}
-+
-+static void keypair_free_rcu(struct rcu_head *rcu)
-+{
-+ kzfree(container_of(rcu, struct noise_keypair, rcu));
-+}
-+
-+static void keypair_free_kref(struct kref *kref)
-+{
-+ struct noise_keypair *keypair =
-+ container_of(kref, struct noise_keypair, refcount);
-+
-+ net_dbg_ratelimited("%s: Keypair %llu destroyed for peer %llu\n",
-+ keypair->entry.peer->device->dev->name,
-+ keypair->internal_id,
-+ keypair->entry.peer->internal_id);
-+ wg_index_hashtable_remove(keypair->entry.peer->device->index_hashtable,
-+ &keypair->entry);
-+ call_rcu(&keypair->rcu, keypair_free_rcu);
-+}
-+
-+void wg_noise_keypair_put(struct noise_keypair *keypair, bool unreference_now)
-+{
-+ if (unlikely(!keypair))
-+ return;
-+ if (unlikely(unreference_now))
-+ wg_index_hashtable_remove(
-+ keypair->entry.peer->device->index_hashtable,
-+ &keypair->entry);
-+ kref_put(&keypair->refcount, keypair_free_kref);
-+}
-+
-+struct noise_keypair *wg_noise_keypair_get(struct noise_keypair *keypair)
-+{
-+ RCU_LOCKDEP_WARN(!rcu_read_lock_bh_held(),
-+ "Taking noise keypair reference without holding the RCU BH read lock");
-+ if (unlikely(!keypair || !kref_get_unless_zero(&keypair->refcount)))
-+ return NULL;
-+ return keypair;
-+}
-+
-+void wg_noise_keypairs_clear(struct noise_keypairs *keypairs)
-+{
-+ struct noise_keypair *old;
-+
-+ spin_lock_bh(&keypairs->keypair_update_lock);
-+
-+ /* We zero the next_keypair before zeroing the others, so that
-+ * wg_noise_received_with_keypair returns early before subsequent ones
-+ * are zeroed.
-+ */
-+ old = rcu_dereference_protected(keypairs->next_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ RCU_INIT_POINTER(keypairs->next_keypair, NULL);
-+ wg_noise_keypair_put(old, true);
-+
-+ old = rcu_dereference_protected(keypairs->previous_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ RCU_INIT_POINTER(keypairs->previous_keypair, NULL);
-+ wg_noise_keypair_put(old, true);
-+
-+ old = rcu_dereference_protected(keypairs->current_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ RCU_INIT_POINTER(keypairs->current_keypair, NULL);
-+ wg_noise_keypair_put(old, true);
-+
-+ spin_unlock_bh(&keypairs->keypair_update_lock);
-+}
-+
-+void wg_noise_expire_current_peer_keypairs(struct wg_peer *peer)
-+{
-+ struct noise_keypair *keypair;
-+
-+ wg_noise_handshake_clear(&peer->handshake);
-+ wg_noise_reset_last_sent_handshake(&peer->last_sent_handshake);
-+
-+ spin_lock_bh(&peer->keypairs.keypair_update_lock);
-+ keypair = rcu_dereference_protected(peer->keypairs.next_keypair,
-+ lockdep_is_held(&peer->keypairs.keypair_update_lock));
-+ if (keypair)
-+ keypair->sending.is_valid = false;
-+ keypair = rcu_dereference_protected(peer->keypairs.current_keypair,
-+ lockdep_is_held(&peer->keypairs.keypair_update_lock));
-+ if (keypair)
-+ keypair->sending.is_valid = false;
-+ spin_unlock_bh(&peer->keypairs.keypair_update_lock);
-+}
-+
-+static void add_new_keypair(struct noise_keypairs *keypairs,
-+ struct noise_keypair *new_keypair)
-+{
-+ struct noise_keypair *previous_keypair, *next_keypair, *current_keypair;
-+
-+ spin_lock_bh(&keypairs->keypair_update_lock);
-+ previous_keypair = rcu_dereference_protected(keypairs->previous_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ next_keypair = rcu_dereference_protected(keypairs->next_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ current_keypair = rcu_dereference_protected(keypairs->current_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ if (new_keypair->i_am_the_initiator) {
-+ /* If we're the initiator, it means we've sent a handshake, and
-+ * received a confirmation response, which means this new
-+ * keypair can now be used.
-+ */
-+ if (next_keypair) {
-+ /* If there already was a next keypair pending, we
-+ * demote it to be the previous keypair, and free the
-+ * existing current. Note that this means KCI can result
-+ * in this transition. It would perhaps be more sound to
-+ * always just get rid of the unused next keypair
-+ * instead of putting it in the previous slot, but this
-+ * might be a bit less robust. Something to think about
-+ * for the future.
-+ */
-+ RCU_INIT_POINTER(keypairs->next_keypair, NULL);
-+ rcu_assign_pointer(keypairs->previous_keypair,
-+ next_keypair);
-+ wg_noise_keypair_put(current_keypair, true);
-+ } else /* If there wasn't an existing next keypair, we replace
-+ * the previous with the current one.
-+ */
-+ rcu_assign_pointer(keypairs->previous_keypair,
-+ current_keypair);
-+ /* At this point we can get rid of the old previous keypair, and
-+ * set up the new keypair.
-+ */
-+ wg_noise_keypair_put(previous_keypair, true);
-+ rcu_assign_pointer(keypairs->current_keypair, new_keypair);
-+ } else {
-+ /* If we're the responder, it means we can't use the new keypair
-+ * until we receive confirmation via the first data packet, so
-+ * we get rid of the existing previous one, the possibly
-+ * existing next one, and slide in the new next one.
-+ */
-+ rcu_assign_pointer(keypairs->next_keypair, new_keypair);
-+ wg_noise_keypair_put(next_keypair, true);
-+ RCU_INIT_POINTER(keypairs->previous_keypair, NULL);
-+ wg_noise_keypair_put(previous_keypair, true);
-+ }
-+ spin_unlock_bh(&keypairs->keypair_update_lock);
-+}
-+
-+bool wg_noise_received_with_keypair(struct noise_keypairs *keypairs,
-+ struct noise_keypair *received_keypair)
-+{
-+ struct noise_keypair *old_keypair;
-+ bool key_is_new;
-+
-+ /* We first check without taking the spinlock. */
-+ key_is_new = received_keypair ==
-+ rcu_access_pointer(keypairs->next_keypair);
-+ if (likely(!key_is_new))
-+ return false;
-+
-+ spin_lock_bh(&keypairs->keypair_update_lock);
-+ /* After locking, we double check that things didn't change from
-+ * beneath us.
-+ */
-+ if (unlikely(received_keypair !=
-+ rcu_dereference_protected(keypairs->next_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock)))) {
-+ spin_unlock_bh(&keypairs->keypair_update_lock);
-+ return false;
-+ }
-+
-+ /* When we've finally received the confirmation, we slide the next
-+ * into the current, the current into the previous, and get rid of
-+ * the old previous.
-+ */
-+ old_keypair = rcu_dereference_protected(keypairs->previous_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock));
-+ rcu_assign_pointer(keypairs->previous_keypair,
-+ rcu_dereference_protected(keypairs->current_keypair,
-+ lockdep_is_held(&keypairs->keypair_update_lock)));
-+ wg_noise_keypair_put(old_keypair, true);
-+ rcu_assign_pointer(keypairs->current_keypair, received_keypair);
-+ RCU_INIT_POINTER(keypairs->next_keypair, NULL);
-+
-+ spin_unlock_bh(&keypairs->keypair_update_lock);
-+ return true;
-+}
-+
-+/* Must hold static_identity->lock */
-+void wg_noise_set_static_identity_private_key(
-+ struct noise_static_identity *static_identity,
-+ const u8 private_key[NOISE_PUBLIC_KEY_LEN])
-+{
-+ memcpy(static_identity->static_private, private_key,
-+ NOISE_PUBLIC_KEY_LEN);
-+ curve25519_clamp_secret(static_identity->static_private);
-+ static_identity->has_identity = curve25519_generate_public(
-+ static_identity->static_public, private_key);
-+}
-+
-+/* This is Hugo Krawczyk's HKDF:
-+ * - https://eprint.iacr.org/2010/264.pdf
-+ * - https://tools.ietf.org/html/rfc5869
-+ */
-+static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,
-+ size_t first_len, size_t second_len, size_t third_len,
-+ size_t data_len, const u8 chaining_key[NOISE_HASH_LEN])
-+{
-+ u8 output[BLAKE2S_HASH_SIZE + 1];
-+ u8 secret[BLAKE2S_HASH_SIZE];
-+
-+ WARN_ON(IS_ENABLED(DEBUG) &&
-+ (first_len > BLAKE2S_HASH_SIZE ||
-+ second_len > BLAKE2S_HASH_SIZE ||
-+ third_len > BLAKE2S_HASH_SIZE ||
-+ ((second_len || second_dst || third_len || third_dst) &&
-+ (!first_len || !first_dst)) ||
-+ ((third_len || third_dst) && (!second_len || !second_dst))));
-+
-+ /* Extract entropy from data into secret */
-+ blake2s256_hmac(secret, data, chaining_key, data_len, NOISE_HASH_LEN);
-+
-+ if (!first_dst || !first_len)
-+ goto out;
-+
-+ /* Expand first key: key = secret, data = 0x1 */
-+ output[0] = 1;
-+ blake2s256_hmac(output, output, secret, 1, BLAKE2S_HASH_SIZE);
-+ memcpy(first_dst, output, first_len);
-+
-+ if (!second_dst || !second_len)
-+ goto out;
-+
-+ /* Expand second key: key = secret, data = first-key || 0x2 */
-+ output[BLAKE2S_HASH_SIZE] = 2;
-+ blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1,
-+ BLAKE2S_HASH_SIZE);
-+ memcpy(second_dst, output, second_len);
-+
-+ if (!third_dst || !third_len)
-+ goto out;
-+
-+ /* Expand third key: key = secret, data = second-key || 0x3 */
-+ output[BLAKE2S_HASH_SIZE] = 3;
-+ blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1,
-+ BLAKE2S_HASH_SIZE);
-+ memcpy(third_dst, output, third_len);
-+
-+out:
-+ /* Clear sensitive data from stack */
-+ memzero_explicit(secret, BLAKE2S_HASH_SIZE);
-+ memzero_explicit(output, BLAKE2S_HASH_SIZE + 1);
-+}
-+
-+static void symmetric_key_init(struct noise_symmetric_key *key)
-+{
-+ spin_lock_init(&key->counter.receive.lock);
-+ atomic64_set(&key->counter.counter, 0);
-+ memset(key->counter.receive.backtrack, 0,
-+ sizeof(key->counter.receive.backtrack));
-+ key->birthdate = ktime_get_coarse_boottime_ns();
-+ key->is_valid = true;
-+}
-+
-+static void derive_keys(struct noise_symmetric_key *first_dst,
-+ struct noise_symmetric_key *second_dst,
-+ const u8 chaining_key[NOISE_HASH_LEN])
-+{
-+ kdf(first_dst->key, second_dst->key, NULL, NULL,
-+ NOISE_SYMMETRIC_KEY_LEN, NOISE_SYMMETRIC_KEY_LEN, 0, 0,
-+ chaining_key);
-+ symmetric_key_init(first_dst);
-+ symmetric_key_init(second_dst);
-+}
-+
-+static bool __must_check mix_dh(u8 chaining_key[NOISE_HASH_LEN],
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ const u8 private[NOISE_PUBLIC_KEY_LEN],
-+ const u8 public[NOISE_PUBLIC_KEY_LEN])
-+{
-+ u8 dh_calculation[NOISE_PUBLIC_KEY_LEN];
-+
-+ if (unlikely(!curve25519(dh_calculation, private, public)))
-+ return false;
-+ kdf(chaining_key, key, NULL, dh_calculation, NOISE_HASH_LEN,
-+ NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN, chaining_key);
-+ memzero_explicit(dh_calculation, NOISE_PUBLIC_KEY_LEN);
-+ return true;
-+}
-+
-+static void mix_hash(u8 hash[NOISE_HASH_LEN], const u8 *src, size_t src_len)
-+{
-+ struct blake2s_state blake;
-+
-+ blake2s_init(&blake, NOISE_HASH_LEN);
-+ blake2s_update(&blake, hash, NOISE_HASH_LEN);
-+ blake2s_update(&blake, src, src_len);
-+ blake2s_final(&blake, hash);
-+}
-+
-+static void mix_psk(u8 chaining_key[NOISE_HASH_LEN], u8 hash[NOISE_HASH_LEN],
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ const u8 psk[NOISE_SYMMETRIC_KEY_LEN])
-+{
-+ u8 temp_hash[NOISE_HASH_LEN];
-+
-+ kdf(chaining_key, temp_hash, key, psk, NOISE_HASH_LEN, NOISE_HASH_LEN,
-+ NOISE_SYMMETRIC_KEY_LEN, NOISE_SYMMETRIC_KEY_LEN, chaining_key);
-+ mix_hash(hash, temp_hash, NOISE_HASH_LEN);
-+ memzero_explicit(temp_hash, NOISE_HASH_LEN);
-+}
-+
-+static void handshake_init(u8 chaining_key[NOISE_HASH_LEN],
-+ u8 hash[NOISE_HASH_LEN],
-+ const u8 remote_static[NOISE_PUBLIC_KEY_LEN])
-+{
-+ memcpy(hash, handshake_init_hash, NOISE_HASH_LEN);
-+ memcpy(chaining_key, handshake_init_chaining_key, NOISE_HASH_LEN);
-+ mix_hash(hash, remote_static, NOISE_PUBLIC_KEY_LEN);
-+}
-+
-+static void message_encrypt(u8 *dst_ciphertext, const u8 *src_plaintext,
-+ size_t src_len, u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ u8 hash[NOISE_HASH_LEN])
-+{
-+ chacha20poly1305_encrypt(dst_ciphertext, src_plaintext, src_len, hash,
-+ NOISE_HASH_LEN,
-+ 0 /* Always zero for Noise_IK */, key);
-+ mix_hash(hash, dst_ciphertext, noise_encrypted_len(src_len));
-+}
-+
-+static bool message_decrypt(u8 *dst_plaintext, const u8 *src_ciphertext,
-+ size_t src_len, u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ u8 hash[NOISE_HASH_LEN])
-+{
-+ if (!chacha20poly1305_decrypt(dst_plaintext, src_ciphertext, src_len,
-+ hash, NOISE_HASH_LEN,
-+ 0 /* Always zero for Noise_IK */, key))
-+ return false;
-+ mix_hash(hash, src_ciphertext, src_len);
-+ return true;
-+}
-+
-+static void message_ephemeral(u8 ephemeral_dst[NOISE_PUBLIC_KEY_LEN],
-+ const u8 ephemeral_src[NOISE_PUBLIC_KEY_LEN],
-+ u8 chaining_key[NOISE_HASH_LEN],
-+ u8 hash[NOISE_HASH_LEN])
-+{
-+ if (ephemeral_dst != ephemeral_src)
-+ memcpy(ephemeral_dst, ephemeral_src, NOISE_PUBLIC_KEY_LEN);
-+ mix_hash(hash, ephemeral_src, NOISE_PUBLIC_KEY_LEN);
-+ kdf(chaining_key, NULL, NULL, ephemeral_src, NOISE_HASH_LEN, 0, 0,
-+ NOISE_PUBLIC_KEY_LEN, chaining_key);
-+}
-+
-+static void tai64n_now(u8 output[NOISE_TIMESTAMP_LEN])
-+{
-+ struct timespec64 now;
-+
-+ ktime_get_real_ts64(&now);
-+
-+ /* In order to prevent some sort of infoleak from precise timers, we
-+ * round down the nanoseconds part to the closest rounded-down power of
-+ * two to the maximum initiations per second allowed anyway by the
-+ * implementation.
-+ */
-+ now.tv_nsec = ALIGN_DOWN(now.tv_nsec,
-+ rounddown_pow_of_two(NSEC_PER_SEC / INITIATIONS_PER_SECOND));
-+
-+ /* https://cr.yp.to/libtai/tai64.html */
-+ *(__be64 *)output = cpu_to_be64(0x400000000000000aULL + now.tv_sec);
-+ *(__be32 *)(output + sizeof(__be64)) = cpu_to_be32(now.tv_nsec);
-+}
-+
-+bool
-+wg_noise_handshake_create_initiation(struct message_handshake_initiation *dst,
-+ struct noise_handshake *handshake)
-+{
-+ u8 timestamp[NOISE_TIMESTAMP_LEN];
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN];
-+ bool ret = false;
-+
-+ /* We need to wait for crng _before_ taking any locks, since
-+ * curve25519_generate_secret uses get_random_bytes_wait.
-+ */
-+ wait_for_random_bytes();
-+
-+ down_read(&handshake->static_identity->lock);
-+ down_write(&handshake->lock);
-+
-+ if (unlikely(!handshake->static_identity->has_identity))
-+ goto out;
-+
-+ dst->header.type = cpu_to_le32(MESSAGE_HANDSHAKE_INITIATION);
-+
-+ handshake_init(handshake->chaining_key, handshake->hash,
-+ handshake->remote_static);
-+
-+ /* e */
-+ curve25519_generate_secret(handshake->ephemeral_private);
-+ if (!curve25519_generate_public(dst->unencrypted_ephemeral,
-+ handshake->ephemeral_private))
-+ goto out;
-+ message_ephemeral(dst->unencrypted_ephemeral,
-+ dst->unencrypted_ephemeral, handshake->chaining_key,
-+ handshake->hash);
-+
-+ /* es */
-+ if (!mix_dh(handshake->chaining_key, key, handshake->ephemeral_private,
-+ handshake->remote_static))
-+ goto out;
-+
-+ /* s */
-+ message_encrypt(dst->encrypted_static,
-+ handshake->static_identity->static_public,
-+ NOISE_PUBLIC_KEY_LEN, key, handshake->hash);
-+
-+ /* ss */
-+ kdf(handshake->chaining_key, key, NULL,
-+ handshake->precomputed_static_static, NOISE_HASH_LEN,
-+ NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN,
-+ handshake->chaining_key);
-+
-+ /* {t} */
-+ tai64n_now(timestamp);
-+ message_encrypt(dst->encrypted_timestamp, timestamp,
-+ NOISE_TIMESTAMP_LEN, key, handshake->hash);
-+
-+ dst->sender_index = wg_index_hashtable_insert(
-+ handshake->entry.peer->device->index_hashtable,
-+ &handshake->entry);
-+
-+ handshake->state = HANDSHAKE_CREATED_INITIATION;
-+ ret = true;
-+
-+out:
-+ up_write(&handshake->lock);
-+ up_read(&handshake->static_identity->lock);
-+ memzero_explicit(key, NOISE_SYMMETRIC_KEY_LEN);
-+ return ret;
-+}
-+
-+struct wg_peer *
-+wg_noise_handshake_consume_initiation(struct message_handshake_initiation *src,
-+ struct wg_device *wg)
-+{
-+ struct wg_peer *peer = NULL, *ret_peer = NULL;
-+ struct noise_handshake *handshake;
-+ bool replay_attack, flood_attack;
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN];
-+ u8 chaining_key[NOISE_HASH_LEN];
-+ u8 hash[NOISE_HASH_LEN];
-+ u8 s[NOISE_PUBLIC_KEY_LEN];
-+ u8 e[NOISE_PUBLIC_KEY_LEN];
-+ u8 t[NOISE_TIMESTAMP_LEN];
-+ u64 initiation_consumption;
-+
-+ down_read(&wg->static_identity.lock);
-+ if (unlikely(!wg->static_identity.has_identity))
-+ goto out;
-+
-+ handshake_init(chaining_key, hash, wg->static_identity.static_public);
-+
-+ /* e */
-+ message_ephemeral(e, src->unencrypted_ephemeral, chaining_key, hash);
-+
-+ /* es */
-+ if (!mix_dh(chaining_key, key, wg->static_identity.static_private, e))
-+ goto out;
-+
-+ /* s */
-+ if (!message_decrypt(s, src->encrypted_static,
-+ sizeof(src->encrypted_static), key, hash))
-+ goto out;
-+
-+ /* Lookup which peer we're actually talking to */
-+ peer = wg_pubkey_hashtable_lookup(wg->peer_hashtable, s);
-+ if (!peer)
-+ goto out;
-+ handshake = &peer->handshake;
-+
-+ /* ss */
-+ kdf(chaining_key, key, NULL, handshake->precomputed_static_static,
-+ NOISE_HASH_LEN, NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN,
-+ chaining_key);
-+
-+ /* {t} */
-+ if (!message_decrypt(t, src->encrypted_timestamp,
-+ sizeof(src->encrypted_timestamp), key, hash))
-+ goto out;
-+
-+ down_read(&handshake->lock);
-+ replay_attack = memcmp(t, handshake->latest_timestamp,
-+ NOISE_TIMESTAMP_LEN) <= 0;
-+ flood_attack = (s64)handshake->last_initiation_consumption +
-+ NSEC_PER_SEC / INITIATIONS_PER_SECOND >
-+ (s64)ktime_get_coarse_boottime_ns();
-+ up_read(&handshake->lock);
-+ if (replay_attack || flood_attack)
-+ goto out;
-+
-+ /* Success! Copy everything to peer */
-+ down_write(&handshake->lock);
-+ memcpy(handshake->remote_ephemeral, e, NOISE_PUBLIC_KEY_LEN);
-+ if (memcmp(t, handshake->latest_timestamp, NOISE_TIMESTAMP_LEN) > 0)
-+ memcpy(handshake->latest_timestamp, t, NOISE_TIMESTAMP_LEN);
-+ memcpy(handshake->hash, hash, NOISE_HASH_LEN);
-+ memcpy(handshake->chaining_key, chaining_key, NOISE_HASH_LEN);
-+ handshake->remote_index = src->sender_index;
-+ if ((s64)(handshake->last_initiation_consumption -
-+ (initiation_consumption = ktime_get_coarse_boottime_ns())) < 0)
-+ handshake->last_initiation_consumption = initiation_consumption;
-+ handshake->state = HANDSHAKE_CONSUMED_INITIATION;
-+ up_write(&handshake->lock);
-+ ret_peer = peer;
-+
-+out:
-+ memzero_explicit(key, NOISE_SYMMETRIC_KEY_LEN);
-+ memzero_explicit(hash, NOISE_HASH_LEN);
-+ memzero_explicit(chaining_key, NOISE_HASH_LEN);
-+ up_read(&wg->static_identity.lock);
-+ if (!ret_peer)
-+ wg_peer_put(peer);
-+ return ret_peer;
-+}
-+
-+bool wg_noise_handshake_create_response(struct message_handshake_response *dst,
-+ struct noise_handshake *handshake)
-+{
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN];
-+ bool ret = false;
-+
-+ /* We need to wait for crng _before_ taking any locks, since
-+ * curve25519_generate_secret uses get_random_bytes_wait.
-+ */
-+ wait_for_random_bytes();
-+
-+ down_read(&handshake->static_identity->lock);
-+ down_write(&handshake->lock);
-+
-+ if (handshake->state != HANDSHAKE_CONSUMED_INITIATION)
-+ goto out;
-+
-+ dst->header.type = cpu_to_le32(MESSAGE_HANDSHAKE_RESPONSE);
-+ dst->receiver_index = handshake->remote_index;
-+
-+ /* e */
-+ curve25519_generate_secret(handshake->ephemeral_private);
-+ if (!curve25519_generate_public(dst->unencrypted_ephemeral,
-+ handshake->ephemeral_private))
-+ goto out;
-+ message_ephemeral(dst->unencrypted_ephemeral,
-+ dst->unencrypted_ephemeral, handshake->chaining_key,
-+ handshake->hash);
-+
-+ /* ee */
-+ if (!mix_dh(handshake->chaining_key, NULL, handshake->ephemeral_private,
-+ handshake->remote_ephemeral))
-+ goto out;
-+
-+ /* se */
-+ if (!mix_dh(handshake->chaining_key, NULL, handshake->ephemeral_private,
-+ handshake->remote_static))
-+ goto out;
-+
-+ /* psk */
-+ mix_psk(handshake->chaining_key, handshake->hash, key,
-+ handshake->preshared_key);
-+
-+ /* {} */
-+ message_encrypt(dst->encrypted_nothing, NULL, 0, key, handshake->hash);
-+
-+ dst->sender_index = wg_index_hashtable_insert(
-+ handshake->entry.peer->device->index_hashtable,
-+ &handshake->entry);
-+
-+ handshake->state = HANDSHAKE_CREATED_RESPONSE;
-+ ret = true;
-+
-+out:
-+ up_write(&handshake->lock);
-+ up_read(&handshake->static_identity->lock);
-+ memzero_explicit(key, NOISE_SYMMETRIC_KEY_LEN);
-+ return ret;
-+}
-+
-+struct wg_peer *
-+wg_noise_handshake_consume_response(struct message_handshake_response *src,
-+ struct wg_device *wg)
-+{
-+ enum noise_handshake_state state = HANDSHAKE_ZEROED;
-+ struct wg_peer *peer = NULL, *ret_peer = NULL;
-+ struct noise_handshake *handshake;
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN];
-+ u8 hash[NOISE_HASH_LEN];
-+ u8 chaining_key[NOISE_HASH_LEN];
-+ u8 e[NOISE_PUBLIC_KEY_LEN];
-+ u8 ephemeral_private[NOISE_PUBLIC_KEY_LEN];
-+ u8 static_private[NOISE_PUBLIC_KEY_LEN];
-+
-+ down_read(&wg->static_identity.lock);
-+
-+ if (unlikely(!wg->static_identity.has_identity))
-+ goto out;
-+
-+ handshake = (struct noise_handshake *)wg_index_hashtable_lookup(
-+ wg->index_hashtable, INDEX_HASHTABLE_HANDSHAKE,
-+ src->receiver_index, &peer);
-+ if (unlikely(!handshake))
-+ goto out;
-+
-+ down_read(&handshake->lock);
-+ state = handshake->state;
-+ memcpy(hash, handshake->hash, NOISE_HASH_LEN);
-+ memcpy(chaining_key, handshake->chaining_key, NOISE_HASH_LEN);
-+ memcpy(ephemeral_private, handshake->ephemeral_private,
-+ NOISE_PUBLIC_KEY_LEN);
-+ up_read(&handshake->lock);
-+
-+ if (state != HANDSHAKE_CREATED_INITIATION)
-+ goto fail;
-+
-+ /* e */
-+ message_ephemeral(e, src->unencrypted_ephemeral, chaining_key, hash);
-+
-+ /* ee */
-+ if (!mix_dh(chaining_key, NULL, ephemeral_private, e))
-+ goto fail;
-+
-+ /* se */
-+ if (!mix_dh(chaining_key, NULL, wg->static_identity.static_private, e))
-+ goto fail;
-+
-+ /* psk */
-+ mix_psk(chaining_key, hash, key, handshake->preshared_key);
-+
-+ /* {} */
-+ if (!message_decrypt(NULL, src->encrypted_nothing,
-+ sizeof(src->encrypted_nothing), key, hash))
-+ goto fail;
-+
-+ /* Success! Copy everything to peer */
-+ down_write(&handshake->lock);
-+ /* It's important to check that the state is still the same, while we
-+ * have an exclusive lock.
-+ */
-+ if (handshake->state != state) {
-+ up_write(&handshake->lock);
-+ goto fail;
-+ }
-+ memcpy(handshake->remote_ephemeral, e, NOISE_PUBLIC_KEY_LEN);
-+ memcpy(handshake->hash, hash, NOISE_HASH_LEN);
-+ memcpy(handshake->chaining_key, chaining_key, NOISE_HASH_LEN);
-+ handshake->remote_index = src->sender_index;
-+ handshake->state = HANDSHAKE_CONSUMED_RESPONSE;
-+ up_write(&handshake->lock);
-+ ret_peer = peer;
-+ goto out;
-+
-+fail:
-+ wg_peer_put(peer);
-+out:
-+ memzero_explicit(key, NOISE_SYMMETRIC_KEY_LEN);
-+ memzero_explicit(hash, NOISE_HASH_LEN);
-+ memzero_explicit(chaining_key, NOISE_HASH_LEN);
-+ memzero_explicit(ephemeral_private, NOISE_PUBLIC_KEY_LEN);
-+ memzero_explicit(static_private, NOISE_PUBLIC_KEY_LEN);
-+ up_read(&wg->static_identity.lock);
-+ return ret_peer;
-+}
-+
-+bool wg_noise_handshake_begin_session(struct noise_handshake *handshake,
-+ struct noise_keypairs *keypairs)
-+{
-+ struct noise_keypair *new_keypair;
-+ bool ret = false;
-+
-+ down_write(&handshake->lock);
-+ if (handshake->state != HANDSHAKE_CREATED_RESPONSE &&
-+ handshake->state != HANDSHAKE_CONSUMED_RESPONSE)
-+ goto out;
-+
-+ new_keypair = keypair_create(handshake->entry.peer);
-+ if (!new_keypair)
-+ goto out;
-+ new_keypair->i_am_the_initiator = handshake->state ==
-+ HANDSHAKE_CONSUMED_RESPONSE;
-+ new_keypair->remote_index = handshake->remote_index;
-+
-+ if (new_keypair->i_am_the_initiator)
-+ derive_keys(&new_keypair->sending, &new_keypair->receiving,
-+ handshake->chaining_key);
-+ else
-+ derive_keys(&new_keypair->receiving, &new_keypair->sending,
-+ handshake->chaining_key);
-+
-+ handshake_zero(handshake);
-+ rcu_read_lock_bh();
-+ if (likely(!READ_ONCE(container_of(handshake, struct wg_peer,
-+ handshake)->is_dead))) {
-+ add_new_keypair(keypairs, new_keypair);
-+ net_dbg_ratelimited("%s: Keypair %llu created for peer %llu\n",
-+ handshake->entry.peer->device->dev->name,
-+ new_keypair->internal_id,
-+ handshake->entry.peer->internal_id);
-+ ret = wg_index_hashtable_replace(
-+ handshake->entry.peer->device->index_hashtable,
-+ &handshake->entry, &new_keypair->entry);
-+ } else {
-+ kzfree(new_keypair);
-+ }
-+ rcu_read_unlock_bh();
-+
-+out:
-+ up_write(&handshake->lock);
-+ return ret;
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/noise.h
-@@ -0,0 +1,137 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+#ifndef _WG_NOISE_H
-+#define _WG_NOISE_H
-+
-+#include "messages.h"
-+#include "peerlookup.h"
-+
-+#include <linux/types.h>
-+#include <linux/spinlock.h>
-+#include <linux/atomic.h>
-+#include <linux/rwsem.h>
-+#include <linux/mutex.h>
-+#include <linux/kref.h>
-+
-+union noise_counter {
-+ struct {
-+ u64 counter;
-+ unsigned long backtrack[COUNTER_BITS_TOTAL / BITS_PER_LONG];
-+ spinlock_t lock;
-+ } receive;
-+ atomic64_t counter;
-+};
-+
-+struct noise_symmetric_key {
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN];
-+ union noise_counter counter;
-+ u64 birthdate;
-+ bool is_valid;
-+};
-+
-+struct noise_keypair {
-+ struct index_hashtable_entry entry;
-+ struct noise_symmetric_key sending;
-+ struct noise_symmetric_key receiving;
-+ __le32 remote_index;
-+ bool i_am_the_initiator;
-+ struct kref refcount;
-+ struct rcu_head rcu;
-+ u64 internal_id;
-+};
-+
-+struct noise_keypairs {
-+ struct noise_keypair __rcu *current_keypair;
-+ struct noise_keypair __rcu *previous_keypair;
-+ struct noise_keypair __rcu *next_keypair;
-+ spinlock_t keypair_update_lock;
-+};
-+
-+struct noise_static_identity {
-+ u8 static_public[NOISE_PUBLIC_KEY_LEN];
-+ u8 static_private[NOISE_PUBLIC_KEY_LEN];
-+ struct rw_semaphore lock;
-+ bool has_identity;
-+};
-+
-+enum noise_handshake_state {
-+ HANDSHAKE_ZEROED,
-+ HANDSHAKE_CREATED_INITIATION,
-+ HANDSHAKE_CONSUMED_INITIATION,
-+ HANDSHAKE_CREATED_RESPONSE,
-+ HANDSHAKE_CONSUMED_RESPONSE
-+};
-+
-+struct noise_handshake {
-+ struct index_hashtable_entry entry;
-+
-+ enum noise_handshake_state state;
-+ u64 last_initiation_consumption;
-+
-+ struct noise_static_identity *static_identity;
-+
-+ u8 ephemeral_private[NOISE_PUBLIC_KEY_LEN];
-+ u8 remote_static[NOISE_PUBLIC_KEY_LEN];
-+ u8 remote_ephemeral[NOISE_PUBLIC_KEY_LEN];
-+ u8 precomputed_static_static[NOISE_PUBLIC_KEY_LEN];
-+
-+ u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN];
-+
-+ u8 hash[NOISE_HASH_LEN];
-+ u8 chaining_key[NOISE_HASH_LEN];
-+
-+ u8 latest_timestamp[NOISE_TIMESTAMP_LEN];
-+ __le32 remote_index;
-+
-+ /* Protects all members except the immutable (after noise_handshake_
-+ * init): remote_static, precomputed_static_static, static_identity.
-+ */
-+ struct rw_semaphore lock;
-+};
-+
-+struct wg_device;
-+
-+void wg_noise_init(void);
-+bool wg_noise_handshake_init(struct noise_handshake *handshake,
-+ struct noise_static_identity *static_identity,
-+ const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-+ struct wg_peer *peer);
-+void wg_noise_handshake_clear(struct noise_handshake *handshake);
-+static inline void wg_noise_reset_last_sent_handshake(atomic64_t *handshake_ns)
-+{
-+ atomic64_set(handshake_ns, ktime_get_coarse_boottime_ns() -
-+ (u64)(REKEY_TIMEOUT + 1) * NSEC_PER_SEC);
-+}
-+
-+void wg_noise_keypair_put(struct noise_keypair *keypair, bool unreference_now);
-+struct noise_keypair *wg_noise_keypair_get(struct noise_keypair *keypair);
-+void wg_noise_keypairs_clear(struct noise_keypairs *keypairs);
-+bool wg_noise_received_with_keypair(struct noise_keypairs *keypairs,
-+ struct noise_keypair *received_keypair);
-+void wg_noise_expire_current_peer_keypairs(struct wg_peer *peer);
-+
-+void wg_noise_set_static_identity_private_key(
-+ struct noise_static_identity *static_identity,
-+ const u8 private_key[NOISE_PUBLIC_KEY_LEN]);
-+bool wg_noise_precompute_static_static(struct wg_peer *peer);
-+
-+bool
-+wg_noise_handshake_create_initiation(struct message_handshake_initiation *dst,
-+ struct noise_handshake *handshake);
-+struct wg_peer *
-+wg_noise_handshake_consume_initiation(struct message_handshake_initiation *src,
-+ struct wg_device *wg);
-+
-+bool wg_noise_handshake_create_response(struct message_handshake_response *dst,
-+ struct noise_handshake *handshake);
-+struct wg_peer *
-+wg_noise_handshake_consume_response(struct message_handshake_response *src,
-+ struct wg_device *wg);
-+
-+bool wg_noise_handshake_begin_session(struct noise_handshake *handshake,
-+ struct noise_keypairs *keypairs);
-+
-+#endif /* _WG_NOISE_H */
---- /dev/null
-+++ b/drivers/net/wireguard/peer.c
-@@ -0,0 +1,240 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "peer.h"
-+#include "device.h"
-+#include "queueing.h"
-+#include "timers.h"
-+#include "peerlookup.h"
-+#include "noise.h"
-+
-+#include <linux/kref.h>
-+#include <linux/lockdep.h>
-+#include <linux/rcupdate.h>
-+#include <linux/list.h>
-+
-+static atomic64_t peer_counter = ATOMIC64_INIT(0);
-+
-+struct wg_peer *wg_peer_create(struct wg_device *wg,
-+ const u8 public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN])
-+{
-+ struct wg_peer *peer;
-+ int ret = -ENOMEM;
-+
-+ lockdep_assert_held(&wg->device_update_lock);
-+
-+ if (wg->num_peers >= MAX_PEERS_PER_DEVICE)
-+ return ERR_PTR(ret);
-+
-+ peer = kzalloc(sizeof(*peer), GFP_KERNEL);
-+ if (unlikely(!peer))
-+ return ERR_PTR(ret);
-+ peer->device = wg;
-+
-+ if (!wg_noise_handshake_init(&peer->handshake, &wg->static_identity,
-+ public_key, preshared_key, peer)) {
-+ ret = -EKEYREJECTED;
-+ goto err_1;
-+ }
-+ if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL))
-+ goto err_1;
-+ if (wg_packet_queue_init(&peer->tx_queue, wg_packet_tx_worker, false,
-+ MAX_QUEUED_PACKETS))
-+ goto err_2;
-+ if (wg_packet_queue_init(&peer->rx_queue, NULL, false,
-+ MAX_QUEUED_PACKETS))
-+ goto err_3;
-+
-+ peer->internal_id = atomic64_inc_return(&peer_counter);
-+ peer->serial_work_cpu = nr_cpumask_bits;
-+ wg_cookie_init(&peer->latest_cookie);
-+ wg_timers_init(peer);
-+ wg_cookie_checker_precompute_peer_keys(peer);
-+ spin_lock_init(&peer->keypairs.keypair_update_lock);
-+ INIT_WORK(&peer->transmit_handshake_work,
-+ wg_packet_handshake_send_worker);
-+ rwlock_init(&peer->endpoint_lock);
-+ kref_init(&peer->refcount);
-+ skb_queue_head_init(&peer->staged_packet_queue);
-+ wg_noise_reset_last_sent_handshake(&peer->last_sent_handshake);
-+ set_bit(NAPI_STATE_NO_BUSY_POLL, &peer->napi.state);
-+ netif_napi_add(wg->dev, &peer->napi, wg_packet_rx_poll,
-+ NAPI_POLL_WEIGHT);
-+ napi_enable(&peer->napi);
-+ list_add_tail(&peer->peer_list, &wg->peer_list);
-+ INIT_LIST_HEAD(&peer->allowedips_list);
-+ wg_pubkey_hashtable_add(wg->peer_hashtable, peer);
-+ ++wg->num_peers;
-+ pr_debug("%s: Peer %llu created\n", wg->dev->name, peer->internal_id);
-+ return peer;
-+
-+err_3:
-+ wg_packet_queue_free(&peer->tx_queue, false);
-+err_2:
-+ dst_cache_destroy(&peer->endpoint_cache);
-+err_1:
-+ kfree(peer);
-+ return ERR_PTR(ret);
-+}
-+
-+struct wg_peer *wg_peer_get_maybe_zero(struct wg_peer *peer)
-+{
-+ RCU_LOCKDEP_WARN(!rcu_read_lock_bh_held(),
-+ "Taking peer reference without holding the RCU read lock");
-+ if (unlikely(!peer || !kref_get_unless_zero(&peer->refcount)))
-+ return NULL;
-+ return peer;
-+}
-+
-+static void peer_make_dead(struct wg_peer *peer)
-+{
-+ /* Remove from configuration-time lookup structures. */
-+ list_del_init(&peer->peer_list);
-+ wg_allowedips_remove_by_peer(&peer->device->peer_allowedips, peer,
-+ &peer->device->device_update_lock);
-+ wg_pubkey_hashtable_remove(peer->device->peer_hashtable, peer);
-+
-+ /* Mark as dead, so that we don't allow jumping contexts after. */
-+ WRITE_ONCE(peer->is_dead, true);
-+
-+ /* The caller must now synchronize_rcu() for this to take effect. */
-+}
-+
-+static void peer_remove_after_dead(struct wg_peer *peer)
-+{
-+ WARN_ON(!peer->is_dead);
-+
-+ /* No more keypairs can be created for this peer, since is_dead protects
-+ * add_new_keypair, so we can now destroy existing ones.
-+ */
-+ wg_noise_keypairs_clear(&peer->keypairs);
-+
-+ /* Destroy all ongoing timers that were in-flight at the beginning of
-+ * this function.
-+ */
-+ wg_timers_stop(peer);
-+
-+ /* The transition between packet encryption/decryption queues isn't
-+ * guarded by is_dead, but each reference's life is strictly bounded by
-+ * two generations: once for parallel crypto and once for serial
-+ * ingestion, so we can simply flush twice, and be sure that we no
-+ * longer have references inside these queues.
-+ */
-+
-+ /* a) For encrypt/decrypt. */
-+ flush_workqueue(peer->device->packet_crypt_wq);
-+ /* b.1) For send (but not receive, since that's napi). */
-+ flush_workqueue(peer->device->packet_crypt_wq);
-+ /* b.2.1) For receive (but not send, since that's wq). */
-+ napi_disable(&peer->napi);
-+ /* b.2.1) It's now safe to remove the napi struct, which must be done
-+ * here from process context.
-+ */
-+ netif_napi_del(&peer->napi);
-+
-+ /* Ensure any workstructs we own (like transmit_handshake_work or
-+ * clear_peer_work) no longer are in use.
-+ */
-+ flush_workqueue(peer->device->handshake_send_wq);
-+
-+ /* After the above flushes, a peer might still be active in a few
-+ * different contexts: 1) from xmit(), before hitting is_dead and
-+ * returning, 2) from wg_packet_consume_data(), before hitting is_dead
-+ * and returning, 3) from wg_receive_handshake_packet() after a point
-+ * where it has processed an incoming handshake packet, but where
-+ * all calls to pass it off to timers fails because of is_dead. We won't
-+ * have new references in (1) eventually, because we're removed from
-+ * allowedips; we won't have new references in (2) eventually, because
-+ * wg_index_hashtable_lookup will always return NULL, since we removed
-+ * all existing keypairs and no more can be created; we won't have new
-+ * references in (3) eventually, because we're removed from the pubkey
-+ * hash table, which allows for a maximum of one handshake response,
-+ * via the still-uncleared index hashtable entry, but not more than one,
-+ * and in wg_cookie_message_consume, the lookup eventually gets a peer
-+ * with a refcount of zero, so no new reference is taken.
-+ */
-+
-+ --peer->device->num_peers;
-+ wg_peer_put(peer);
-+}
-+
-+/* We have a separate "remove" function make sure that all active places where
-+ * a peer is currently operating will eventually come to an end and not pass
-+ * their reference onto another context.
-+ */
-+void wg_peer_remove(struct wg_peer *peer)
-+{
-+ if (unlikely(!peer))
-+ return;
-+ lockdep_assert_held(&peer->device->device_update_lock);
-+
-+ peer_make_dead(peer);
-+ synchronize_rcu();
-+ peer_remove_after_dead(peer);
-+}
-+
-+void wg_peer_remove_all(struct wg_device *wg)
-+{
-+ struct wg_peer *peer, *temp;
-+ LIST_HEAD(dead_peers);
-+
-+ lockdep_assert_held(&wg->device_update_lock);
-+
-+ /* Avoid having to traverse individually for each one. */
-+ wg_allowedips_free(&wg->peer_allowedips, &wg->device_update_lock);
-+
-+ list_for_each_entry_safe(peer, temp, &wg->peer_list, peer_list) {
-+ peer_make_dead(peer);
-+ list_add_tail(&peer->peer_list, &dead_peers);
-+ }
-+ synchronize_rcu();
-+ list_for_each_entry_safe(peer, temp, &dead_peers, peer_list)
-+ peer_remove_after_dead(peer);
-+}
-+
-+static void rcu_release(struct rcu_head *rcu)
-+{
-+ struct wg_peer *peer = container_of(rcu, struct wg_peer, rcu);
-+
-+ dst_cache_destroy(&peer->endpoint_cache);
-+ wg_packet_queue_free(&peer->rx_queue, false);
-+ wg_packet_queue_free(&peer->tx_queue, false);
-+
-+ /* The final zeroing takes care of clearing any remaining handshake key
-+ * material and other potentially sensitive information.
-+ */
-+ kzfree(peer);
-+}
-+
-+static void kref_release(struct kref *refcount)
-+{
-+ struct wg_peer *peer = container_of(refcount, struct wg_peer, refcount);
-+
-+ pr_debug("%s: Peer %llu (%pISpfsc) destroyed\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+
-+ /* Remove ourself from dynamic runtime lookup structures, now that the
-+ * last reference is gone.
-+ */
-+ wg_index_hashtable_remove(peer->device->index_hashtable,
-+ &peer->handshake.entry);
-+
-+ /* Remove any lingering packets that didn't have a chance to be
-+ * transmitted.
-+ */
-+ wg_packet_purge_staged_packets(peer);
-+
-+ /* Free the memory used. */
-+ call_rcu(&peer->rcu, rcu_release);
-+}
-+
-+void wg_peer_put(struct wg_peer *peer)
-+{
-+ if (unlikely(!peer))
-+ return;
-+ kref_put(&peer->refcount, kref_release);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/peer.h
-@@ -0,0 +1,83 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_PEER_H
-+#define _WG_PEER_H
-+
-+#include "device.h"
-+#include "noise.h"
-+#include "cookie.h"
-+
-+#include <linux/types.h>
-+#include <linux/netfilter.h>
-+#include <linux/spinlock.h>
-+#include <linux/kref.h>
-+#include <net/dst_cache.h>
-+
-+struct wg_device;
-+
-+struct endpoint {
-+ union {
-+ struct sockaddr addr;
-+ struct sockaddr_in addr4;
-+ struct sockaddr_in6 addr6;
-+ };
-+ union {
-+ struct {
-+ struct in_addr src4;
-+ /* Essentially the same as addr6->scope_id */
-+ int src_if4;
-+ };
-+ struct in6_addr src6;
-+ };
-+};
-+
-+struct wg_peer {
-+ struct wg_device *device;
-+ struct crypt_queue tx_queue, rx_queue;
-+ struct sk_buff_head staged_packet_queue;
-+ int serial_work_cpu;
-+ struct noise_keypairs keypairs;
-+ struct endpoint endpoint;
-+ struct dst_cache endpoint_cache;
-+ rwlock_t endpoint_lock;
-+ struct noise_handshake handshake;
-+ atomic64_t last_sent_handshake;
-+ struct work_struct transmit_handshake_work, clear_peer_work;
-+ struct cookie latest_cookie;
-+ struct hlist_node pubkey_hash;
-+ u64 rx_bytes, tx_bytes;
-+ struct timer_list timer_retransmit_handshake, timer_send_keepalive;
-+ struct timer_list timer_new_handshake, timer_zero_key_material;
-+ struct timer_list timer_persistent_keepalive;
-+ unsigned int timer_handshake_attempts;
-+ u16 persistent_keepalive_interval;
-+ bool timer_need_another_keepalive;
-+ bool sent_lastminute_handshake;
-+ struct timespec64 walltime_last_handshake;
-+ struct kref refcount;
-+ struct rcu_head rcu;
-+ struct list_head peer_list;
-+ struct list_head allowedips_list;
-+ u64 internal_id;
-+ struct napi_struct napi;
-+ bool is_dead;
-+};
-+
-+struct wg_peer *wg_peer_create(struct wg_device *wg,
-+ const u8 public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN]);
-+
-+struct wg_peer *__must_check wg_peer_get_maybe_zero(struct wg_peer *peer);
-+static inline struct wg_peer *wg_peer_get(struct wg_peer *peer)
-+{
-+ kref_get(&peer->refcount);
-+ return peer;
-+}
-+void wg_peer_put(struct wg_peer *peer);
-+void wg_peer_remove(struct wg_peer *peer);
-+void wg_peer_remove_all(struct wg_device *wg);
-+
-+#endif /* _WG_PEER_H */
---- /dev/null
-+++ b/drivers/net/wireguard/peerlookup.c
-@@ -0,0 +1,221 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "peerlookup.h"
-+#include "peer.h"
-+#include "noise.h"
-+
-+static struct hlist_head *pubkey_bucket(struct pubkey_hashtable *table,
-+ const u8 pubkey[NOISE_PUBLIC_KEY_LEN])
-+{
-+ /* siphash gives us a secure 64bit number based on a random key. Since
-+ * the bits are uniformly distributed, we can then mask off to get the
-+ * bits we need.
-+ */
-+ const u64 hash = siphash(pubkey, NOISE_PUBLIC_KEY_LEN, &table->key);
-+
-+ return &table->hashtable[hash & (HASH_SIZE(table->hashtable) - 1)];
-+}
-+
-+struct pubkey_hashtable *wg_pubkey_hashtable_alloc(void)
-+{
-+ struct pubkey_hashtable *table = kvmalloc(sizeof(*table), GFP_KERNEL);
-+
-+ if (!table)
-+ return NULL;
-+
-+ get_random_bytes(&table->key, sizeof(table->key));
-+ hash_init(table->hashtable);
-+ mutex_init(&table->lock);
-+ return table;
-+}
-+
-+void wg_pubkey_hashtable_add(struct pubkey_hashtable *table,
-+ struct wg_peer *peer)
-+{
-+ mutex_lock(&table->lock);
-+ hlist_add_head_rcu(&peer->pubkey_hash,
-+ pubkey_bucket(table, peer->handshake.remote_static));
-+ mutex_unlock(&table->lock);
-+}
-+
-+void wg_pubkey_hashtable_remove(struct pubkey_hashtable *table,
-+ struct wg_peer *peer)
-+{
-+ mutex_lock(&table->lock);
-+ hlist_del_init_rcu(&peer->pubkey_hash);
-+ mutex_unlock(&table->lock);
-+}
-+
-+/* Returns a strong reference to a peer */
-+struct wg_peer *
-+wg_pubkey_hashtable_lookup(struct pubkey_hashtable *table,
-+ const u8 pubkey[NOISE_PUBLIC_KEY_LEN])
-+{
-+ struct wg_peer *iter_peer, *peer = NULL;
-+
-+ rcu_read_lock_bh();
-+ hlist_for_each_entry_rcu_bh(iter_peer, pubkey_bucket(table, pubkey),
-+ pubkey_hash) {
-+ if (!memcmp(pubkey, iter_peer->handshake.remote_static,
-+ NOISE_PUBLIC_KEY_LEN)) {
-+ peer = iter_peer;
-+ break;
-+ }
-+ }
-+ peer = wg_peer_get_maybe_zero(peer);
-+ rcu_read_unlock_bh();
-+ return peer;
-+}
-+
-+static struct hlist_head *index_bucket(struct index_hashtable *table,
-+ const __le32 index)
-+{
-+ /* Since the indices are random and thus all bits are uniformly
-+ * distributed, we can find its bucket simply by masking.
-+ */
-+ return &table->hashtable[(__force u32)index &
-+ (HASH_SIZE(table->hashtable) - 1)];
-+}
-+
-+struct index_hashtable *wg_index_hashtable_alloc(void)
-+{
-+ struct index_hashtable *table = kvmalloc(sizeof(*table), GFP_KERNEL);
-+
-+ if (!table)
-+ return NULL;
-+
-+ hash_init(table->hashtable);
-+ spin_lock_init(&table->lock);
-+ return table;
-+}
-+
-+/* At the moment, we limit ourselves to 2^20 total peers, which generally might
-+ * amount to 2^20*3 items in this hashtable. The algorithm below works by
-+ * picking a random number and testing it. We can see that these limits mean we
-+ * usually succeed pretty quickly:
-+ *
-+ * >>> def calculation(tries, size):
-+ * ... return (size / 2**32)**(tries - 1) * (1 - (size / 2**32))
-+ * ...
-+ * >>> calculation(1, 2**20 * 3)
-+ * 0.999267578125
-+ * >>> calculation(2, 2**20 * 3)
-+ * 0.0007318854331970215
-+ * >>> calculation(3, 2**20 * 3)
-+ * 5.360489012673497e-07
-+ * >>> calculation(4, 2**20 * 3)
-+ * 3.9261394135792216e-10
-+ *
-+ * At the moment, we don't do any masking, so this algorithm isn't exactly
-+ * constant time in either the random guessing or in the hash list lookup. We
-+ * could require a minimum of 3 tries, which would successfully mask the
-+ * guessing. this would not, however, help with the growing hash lengths, which
-+ * is another thing to consider moving forward.
-+ */
-+
-+__le32 wg_index_hashtable_insert(struct index_hashtable *table,
-+ struct index_hashtable_entry *entry)
-+{
-+ struct index_hashtable_entry *existing_entry;
-+
-+ spin_lock_bh(&table->lock);
-+ hlist_del_init_rcu(&entry->index_hash);
-+ spin_unlock_bh(&table->lock);
-+
-+ rcu_read_lock_bh();
-+
-+search_unused_slot:
-+ /* First we try to find an unused slot, randomly, while unlocked. */
-+ entry->index = (__force __le32)get_random_u32();
-+ hlist_for_each_entry_rcu_bh(existing_entry,
-+ index_bucket(table, entry->index),
-+ index_hash) {
-+ if (existing_entry->index == entry->index)
-+ /* If it's already in use, we continue searching. */
-+ goto search_unused_slot;
-+ }
-+
-+ /* Once we've found an unused slot, we lock it, and then double-check
-+ * that nobody else stole it from us.
-+ */
-+ spin_lock_bh(&table->lock);
-+ hlist_for_each_entry_rcu_bh(existing_entry,
-+ index_bucket(table, entry->index),
-+ index_hash) {
-+ if (existing_entry->index == entry->index) {
-+ spin_unlock_bh(&table->lock);
-+ /* If it was stolen, we start over. */
-+ goto search_unused_slot;
-+ }
-+ }
-+ /* Otherwise, we know we have it exclusively (since we're locked),
-+ * so we insert.
-+ */
-+ hlist_add_head_rcu(&entry->index_hash,
-+ index_bucket(table, entry->index));
-+ spin_unlock_bh(&table->lock);
-+
-+ rcu_read_unlock_bh();
-+
-+ return entry->index;
-+}
-+
-+bool wg_index_hashtable_replace(struct index_hashtable *table,
-+ struct index_hashtable_entry *old,
-+ struct index_hashtable_entry *new)
-+{
-+ if (unlikely(hlist_unhashed(&old->index_hash)))
-+ return false;
-+ spin_lock_bh(&table->lock);
-+ new->index = old->index;
-+ hlist_replace_rcu(&old->index_hash, &new->index_hash);
-+
-+ /* Calling init here NULLs out index_hash, and in fact after this
-+ * function returns, it's theoretically possible for this to get
-+ * reinserted elsewhere. That means the RCU lookup below might either
-+ * terminate early or jump between buckets, in which case the packet
-+ * simply gets dropped, which isn't terrible.
-+ */
-+ INIT_HLIST_NODE(&old->index_hash);
-+ spin_unlock_bh(&table->lock);
-+ return true;
-+}
-+
-+void wg_index_hashtable_remove(struct index_hashtable *table,
-+ struct index_hashtable_entry *entry)
-+{
-+ spin_lock_bh(&table->lock);
-+ hlist_del_init_rcu(&entry->index_hash);
-+ spin_unlock_bh(&table->lock);
-+}
-+
-+/* Returns a strong reference to a entry->peer */
-+struct index_hashtable_entry *
-+wg_index_hashtable_lookup(struct index_hashtable *table,
-+ const enum index_hashtable_type type_mask,
-+ const __le32 index, struct wg_peer **peer)
-+{
-+ struct index_hashtable_entry *iter_entry, *entry = NULL;
-+
-+ rcu_read_lock_bh();
-+ hlist_for_each_entry_rcu_bh(iter_entry, index_bucket(table, index),
-+ index_hash) {
-+ if (iter_entry->index == index) {
-+ if (likely(iter_entry->type & type_mask))
-+ entry = iter_entry;
-+ break;
-+ }
-+ }
-+ if (likely(entry)) {
-+ entry->peer = wg_peer_get_maybe_zero(entry->peer);
-+ if (likely(entry->peer))
-+ *peer = entry->peer;
-+ else
-+ entry = NULL;
-+ }
-+ rcu_read_unlock_bh();
-+ return entry;
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/peerlookup.h
-@@ -0,0 +1,64 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_PEERLOOKUP_H
-+#define _WG_PEERLOOKUP_H
-+
-+#include "messages.h"
-+
-+#include <linux/hashtable.h>
-+#include <linux/mutex.h>
-+#include <linux/siphash.h>
-+
-+struct wg_peer;
-+
-+struct pubkey_hashtable {
-+ /* TODO: move to rhashtable */
-+ DECLARE_HASHTABLE(hashtable, 11);
-+ siphash_key_t key;
-+ struct mutex lock;
-+};
-+
-+struct pubkey_hashtable *wg_pubkey_hashtable_alloc(void);
-+void wg_pubkey_hashtable_add(struct pubkey_hashtable *table,
-+ struct wg_peer *peer);
-+void wg_pubkey_hashtable_remove(struct pubkey_hashtable *table,
-+ struct wg_peer *peer);
-+struct wg_peer *
-+wg_pubkey_hashtable_lookup(struct pubkey_hashtable *table,
-+ const u8 pubkey[NOISE_PUBLIC_KEY_LEN]);
-+
-+struct index_hashtable {
-+ /* TODO: move to rhashtable */
-+ DECLARE_HASHTABLE(hashtable, 13);
-+ spinlock_t lock;
-+};
-+
-+enum index_hashtable_type {
-+ INDEX_HASHTABLE_HANDSHAKE = 1U << 0,
-+ INDEX_HASHTABLE_KEYPAIR = 1U << 1
-+};
-+
-+struct index_hashtable_entry {
-+ struct wg_peer *peer;
-+ struct hlist_node index_hash;
-+ enum index_hashtable_type type;
-+ __le32 index;
-+};
-+
-+struct index_hashtable *wg_index_hashtable_alloc(void);
-+__le32 wg_index_hashtable_insert(struct index_hashtable *table,
-+ struct index_hashtable_entry *entry);
-+bool wg_index_hashtable_replace(struct index_hashtable *table,
-+ struct index_hashtable_entry *old,
-+ struct index_hashtable_entry *new);
-+void wg_index_hashtable_remove(struct index_hashtable *table,
-+ struct index_hashtable_entry *entry);
-+struct index_hashtable_entry *
-+wg_index_hashtable_lookup(struct index_hashtable *table,
-+ const enum index_hashtable_type type_mask,
-+ const __le32 index, struct wg_peer **peer);
-+
-+#endif /* _WG_PEERLOOKUP_H */
---- /dev/null
-+++ b/drivers/net/wireguard/queueing.c
-@@ -0,0 +1,53 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "queueing.h"
-+
-+struct multicore_worker __percpu *
-+wg_packet_percpu_multicore_worker_alloc(work_func_t function, void *ptr)
-+{
-+ int cpu;
-+ struct multicore_worker __percpu *worker =
-+ alloc_percpu(struct multicore_worker);
-+
-+ if (!worker)
-+ return NULL;
-+
-+ for_each_possible_cpu(cpu) {
-+ per_cpu_ptr(worker, cpu)->ptr = ptr;
-+ INIT_WORK(&per_cpu_ptr(worker, cpu)->work, function);
-+ }
-+ return worker;
-+}
-+
-+int wg_packet_queue_init(struct crypt_queue *queue, work_func_t function,
-+ bool multicore, unsigned int len)
-+{
-+ int ret;
-+
-+ memset(queue, 0, sizeof(*queue));
-+ ret = ptr_ring_init(&queue->ring, len, GFP_KERNEL);
-+ if (ret)
-+ return ret;
-+ if (function) {
-+ if (multicore) {
-+ queue->worker = wg_packet_percpu_multicore_worker_alloc(
-+ function, queue);
-+ if (!queue->worker)
-+ return -ENOMEM;
-+ } else {
-+ INIT_WORK(&queue->work, function);
-+ }
-+ }
-+ return 0;
-+}
-+
-+void wg_packet_queue_free(struct crypt_queue *queue, bool multicore)
-+{
-+ if (multicore)
-+ free_percpu(queue->worker);
-+ WARN_ON(!__ptr_ring_empty(&queue->ring));
-+ ptr_ring_cleanup(&queue->ring, NULL);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/queueing.h
-@@ -0,0 +1,197 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_QUEUEING_H
-+#define _WG_QUEUEING_H
-+
-+#include "peer.h"
-+#include <linux/types.h>
-+#include <linux/skbuff.h>
-+#include <linux/ip.h>
-+#include <linux/ipv6.h>
-+
-+struct wg_device;
-+struct wg_peer;
-+struct multicore_worker;
-+struct crypt_queue;
-+struct sk_buff;
-+
-+/* queueing.c APIs: */
-+int wg_packet_queue_init(struct crypt_queue *queue, work_func_t function,
-+ bool multicore, unsigned int len);
-+void wg_packet_queue_free(struct crypt_queue *queue, bool multicore);
-+struct multicore_worker __percpu *
-+wg_packet_percpu_multicore_worker_alloc(work_func_t function, void *ptr);
-+
-+/* receive.c APIs: */
-+void wg_packet_receive(struct wg_device *wg, struct sk_buff *skb);
-+void wg_packet_handshake_receive_worker(struct work_struct *work);
-+/* NAPI poll function: */
-+int wg_packet_rx_poll(struct napi_struct *napi, int budget);
-+/* Workqueue worker: */
-+void wg_packet_decrypt_worker(struct work_struct *work);
-+
-+/* send.c APIs: */
-+void wg_packet_send_queued_handshake_initiation(struct wg_peer *peer,
-+ bool is_retry);
-+void wg_packet_send_handshake_response(struct wg_peer *peer);
-+void wg_packet_send_handshake_cookie(struct wg_device *wg,
-+ struct sk_buff *initiating_skb,
-+ __le32 sender_index);
-+void wg_packet_send_keepalive(struct wg_peer *peer);
-+void wg_packet_purge_staged_packets(struct wg_peer *peer);
-+void wg_packet_send_staged_packets(struct wg_peer *peer);
-+/* Workqueue workers: */
-+void wg_packet_handshake_send_worker(struct work_struct *work);
-+void wg_packet_tx_worker(struct work_struct *work);
-+void wg_packet_encrypt_worker(struct work_struct *work);
-+
-+enum packet_state {
-+ PACKET_STATE_UNCRYPTED,
-+ PACKET_STATE_CRYPTED,
-+ PACKET_STATE_DEAD
-+};
-+
-+struct packet_cb {
-+ u64 nonce;
-+ struct noise_keypair *keypair;
-+ atomic_t state;
-+ u32 mtu;
-+ u8 ds;
-+};
-+
-+#define PACKET_CB(skb) ((struct packet_cb *)((skb)->cb))
-+#define PACKET_PEER(skb) (PACKET_CB(skb)->keypair->entry.peer)
-+
-+/* Returns either the correct skb->protocol value, or 0 if invalid. */
-+static inline __be16 wg_skb_examine_untrusted_ip_hdr(struct sk_buff *skb)
-+{
-+ if (skb_network_header(skb) >= skb->head &&
-+ (skb_network_header(skb) + sizeof(struct iphdr)) <=
-+ skb_tail_pointer(skb) &&
-+ ip_hdr(skb)->version == 4)
-+ return htons(ETH_P_IP);
-+ if (skb_network_header(skb) >= skb->head &&
-+ (skb_network_header(skb) + sizeof(struct ipv6hdr)) <=
-+ skb_tail_pointer(skb) &&
-+ ipv6_hdr(skb)->version == 6)
-+ return htons(ETH_P_IPV6);
-+ return 0;
-+}
-+
-+static inline void wg_reset_packet(struct sk_buff *skb)
-+{
-+ const int pfmemalloc = skb->pfmemalloc;
-+
-+ skb_scrub_packet(skb, true);
-+ memset(&skb->headers_start, 0,
-+ offsetof(struct sk_buff, headers_end) -
-+ offsetof(struct sk_buff, headers_start));
-+ skb->pfmemalloc = pfmemalloc;
-+ skb->queue_mapping = 0;
-+ skb->nohdr = 0;
-+ skb->peeked = 0;
-+ skb->mac_len = 0;
-+ skb->dev = NULL;
-+#ifdef CONFIG_NET_SCHED
-+ skb->tc_index = 0;
-+#endif
-+ skb_reset_redirect(skb);
-+ skb->hdr_len = skb_headroom(skb);
-+ skb_reset_mac_header(skb);
-+ skb_reset_network_header(skb);
-+ skb_reset_transport_header(skb);
-+ skb_probe_transport_header(skb);
-+ skb_reset_inner_headers(skb);
-+}
-+
-+static inline int wg_cpumask_choose_online(int *stored_cpu, unsigned int id)
-+{
-+ unsigned int cpu = *stored_cpu, cpu_index, i;
-+
-+ if (unlikely(cpu == nr_cpumask_bits ||
-+ !cpumask_test_cpu(cpu, cpu_online_mask))) {
-+ cpu_index = id % cpumask_weight(cpu_online_mask);
-+ cpu = cpumask_first(cpu_online_mask);
-+ for (i = 0; i < cpu_index; ++i)
-+ cpu = cpumask_next(cpu, cpu_online_mask);
-+ *stored_cpu = cpu;
-+ }
-+ return cpu;
-+}
-+
-+/* This function is racy, in the sense that next is unlocked, so it could return
-+ * the same CPU twice. A race-free version of this would be to instead store an
-+ * atomic sequence number, do an increment-and-return, and then iterate through
-+ * every possible CPU until we get to that index -- choose_cpu. However that's
-+ * a bit slower, and it doesn't seem like this potential race actually
-+ * introduces any performance loss, so we live with it.
-+ */
-+static inline int wg_cpumask_next_online(int *next)
-+{
-+ int cpu = *next;
-+
-+ while (unlikely(!cpumask_test_cpu(cpu, cpu_online_mask)))
-+ cpu = cpumask_next(cpu, cpu_online_mask) % nr_cpumask_bits;
-+ *next = cpumask_next(cpu, cpu_online_mask) % nr_cpumask_bits;
-+ return cpu;
-+}
-+
-+static inline int wg_queue_enqueue_per_device_and_peer(
-+ struct crypt_queue *device_queue, struct crypt_queue *peer_queue,
-+ struct sk_buff *skb, struct workqueue_struct *wq, int *next_cpu)
-+{
-+ int cpu;
-+
-+ atomic_set_release(&PACKET_CB(skb)->state, PACKET_STATE_UNCRYPTED);
-+ /* We first queue this up for the peer ingestion, but the consumer
-+ * will wait for the state to change to CRYPTED or DEAD before.
-+ */
-+ if (unlikely(ptr_ring_produce_bh(&peer_queue->ring, skb)))
-+ return -ENOSPC;
-+ /* Then we queue it up in the device queue, which consumes the
-+ * packet as soon as it can.
-+ */
-+ cpu = wg_cpumask_next_online(next_cpu);
-+ if (unlikely(ptr_ring_produce_bh(&device_queue->ring, skb)))
-+ return -EPIPE;
-+ queue_work_on(cpu, wq, &per_cpu_ptr(device_queue->worker, cpu)->work);
-+ return 0;
-+}
-+
-+static inline void wg_queue_enqueue_per_peer(struct crypt_queue *queue,
-+ struct sk_buff *skb,
-+ enum packet_state state)
-+{
-+ /* We take a reference, because as soon as we call atomic_set, the
-+ * peer can be freed from below us.
-+ */
-+ struct wg_peer *peer = wg_peer_get(PACKET_PEER(skb));
-+
-+ atomic_set_release(&PACKET_CB(skb)->state, state);
-+ queue_work_on(wg_cpumask_choose_online(&peer->serial_work_cpu,
-+ peer->internal_id),
-+ peer->device->packet_crypt_wq, &queue->work);
-+ wg_peer_put(peer);
-+}
-+
-+static inline void wg_queue_enqueue_per_peer_napi(struct sk_buff *skb,
-+ enum packet_state state)
-+{
-+ /* We take a reference, because as soon as we call atomic_set, the
-+ * peer can be freed from below us.
-+ */
-+ struct wg_peer *peer = wg_peer_get(PACKET_PEER(skb));
-+
-+ atomic_set_release(&PACKET_CB(skb)->state, state);
-+ napi_schedule(&peer->napi);
-+ wg_peer_put(peer);
-+}
-+
-+#ifdef DEBUG
-+bool wg_packet_counter_selftest(void);
-+#endif
-+
-+#endif /* _WG_QUEUEING_H */
---- /dev/null
-+++ b/drivers/net/wireguard/ratelimiter.c
-@@ -0,0 +1,223 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "ratelimiter.h"
-+#include <linux/siphash.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+#include <net/ip.h>
-+
-+static struct kmem_cache *entry_cache;
-+static hsiphash_key_t key;
-+static spinlock_t table_lock = __SPIN_LOCK_UNLOCKED("ratelimiter_table_lock");
-+static DEFINE_MUTEX(init_lock);
-+static u64 init_refcnt; /* Protected by init_lock, hence not atomic. */
-+static atomic_t total_entries = ATOMIC_INIT(0);
-+static unsigned int max_entries, table_size;
-+static void wg_ratelimiter_gc_entries(struct work_struct *);
-+static DECLARE_DEFERRABLE_WORK(gc_work, wg_ratelimiter_gc_entries);
-+static struct hlist_head *table_v4;
-+#if IS_ENABLED(CONFIG_IPV6)
-+static struct hlist_head *table_v6;
-+#endif
-+
-+struct ratelimiter_entry {
-+ u64 last_time_ns, tokens, ip;
-+ void *net;
-+ spinlock_t lock;
-+ struct hlist_node hash;
-+ struct rcu_head rcu;
-+};
-+
-+enum {
-+ PACKETS_PER_SECOND = 20,
-+ PACKETS_BURSTABLE = 5,
-+ PACKET_COST = NSEC_PER_SEC / PACKETS_PER_SECOND,
-+ TOKEN_MAX = PACKET_COST * PACKETS_BURSTABLE
-+};
-+
-+static void entry_free(struct rcu_head *rcu)
-+{
-+ kmem_cache_free(entry_cache,
-+ container_of(rcu, struct ratelimiter_entry, rcu));
-+ atomic_dec(&total_entries);
-+}
-+
-+static void entry_uninit(struct ratelimiter_entry *entry)
-+{
-+ hlist_del_rcu(&entry->hash);
-+ call_rcu(&entry->rcu, entry_free);
-+}
-+
-+/* Calling this function with a NULL work uninits all entries. */
-+static void wg_ratelimiter_gc_entries(struct work_struct *work)
-+{
-+ const u64 now = ktime_get_coarse_boottime_ns();
-+ struct ratelimiter_entry *entry;
-+ struct hlist_node *temp;
-+ unsigned int i;
-+
-+ for (i = 0; i < table_size; ++i) {
-+ spin_lock(&table_lock);
-+ hlist_for_each_entry_safe(entry, temp, &table_v4[i], hash) {
-+ if (unlikely(!work) ||
-+ now - entry->last_time_ns > NSEC_PER_SEC)
-+ entry_uninit(entry);
-+ }
-+#if IS_ENABLED(CONFIG_IPV6)
-+ hlist_for_each_entry_safe(entry, temp, &table_v6[i], hash) {
-+ if (unlikely(!work) ||
-+ now - entry->last_time_ns > NSEC_PER_SEC)
-+ entry_uninit(entry);
-+ }
-+#endif
-+ spin_unlock(&table_lock);
-+ if (likely(work))
-+ cond_resched();
-+ }
-+ if (likely(work))
-+ queue_delayed_work(system_power_efficient_wq, &gc_work, HZ);
-+}
-+
-+bool wg_ratelimiter_allow(struct sk_buff *skb, struct net *net)
-+{
-+ /* We only take the bottom half of the net pointer, so that we can hash
-+ * 3 words in the end. This way, siphash's len param fits into the final
-+ * u32, and we don't incur an extra round.
-+ */
-+ const u32 net_word = (unsigned long)net;
-+ struct ratelimiter_entry *entry;
-+ struct hlist_head *bucket;
-+ u64 ip;
-+
-+ if (skb->protocol == htons(ETH_P_IP)) {
-+ ip = (u64 __force)ip_hdr(skb)->saddr;
-+ bucket = &table_v4[hsiphash_2u32(net_word, ip, &key) &
-+ (table_size - 1)];
-+ }
-+#if IS_ENABLED(CONFIG_IPV6)
-+ else if (skb->protocol == htons(ETH_P_IPV6)) {
-+ /* Only use 64 bits, so as to ratelimit the whole /64. */
-+ memcpy(&ip, &ipv6_hdr(skb)->saddr, sizeof(ip));
-+ bucket = &table_v6[hsiphash_3u32(net_word, ip >> 32, ip, &key) &
-+ (table_size - 1)];
-+ }
-+#endif
-+ else
-+ return false;
-+ rcu_read_lock();
-+ hlist_for_each_entry_rcu(entry, bucket, hash) {
-+ if (entry->net == net && entry->ip == ip) {
-+ u64 now, tokens;
-+ bool ret;
-+ /* Quasi-inspired by nft_limit.c, but this is actually a
-+ * slightly different algorithm. Namely, we incorporate
-+ * the burst as part of the maximum tokens, rather than
-+ * as part of the rate.
-+ */
-+ spin_lock(&entry->lock);
-+ now = ktime_get_coarse_boottime_ns();
-+ tokens = min_t(u64, TOKEN_MAX,
-+ entry->tokens + now -
-+ entry->last_time_ns);
-+ entry->last_time_ns = now;
-+ ret = tokens >= PACKET_COST;
-+ entry->tokens = ret ? tokens - PACKET_COST : tokens;
-+ spin_unlock(&entry->lock);
-+ rcu_read_unlock();
-+ return ret;
-+ }
-+ }
-+ rcu_read_unlock();
-+
-+ if (atomic_inc_return(&total_entries) > max_entries)
-+ goto err_oom;
-+
-+ entry = kmem_cache_alloc(entry_cache, GFP_KERNEL);
-+ if (unlikely(!entry))
-+ goto err_oom;
-+
-+ entry->net = net;
-+ entry->ip = ip;
-+ INIT_HLIST_NODE(&entry->hash);
-+ spin_lock_init(&entry->lock);
-+ entry->last_time_ns = ktime_get_coarse_boottime_ns();
-+ entry->tokens = TOKEN_MAX - PACKET_COST;
-+ spin_lock(&table_lock);
-+ hlist_add_head_rcu(&entry->hash, bucket);
-+ spin_unlock(&table_lock);
-+ return true;
-+
-+err_oom:
-+ atomic_dec(&total_entries);
-+ return false;
-+}
-+
-+int wg_ratelimiter_init(void)
-+{
-+ mutex_lock(&init_lock);
-+ if (++init_refcnt != 1)
-+ goto out;
-+
-+ entry_cache = KMEM_CACHE(ratelimiter_entry, 0);
-+ if (!entry_cache)
-+ goto err;
-+
-+ /* xt_hashlimit.c uses a slightly different algorithm for ratelimiting,
-+ * but what it shares in common is that it uses a massive hashtable. So,
-+ * we borrow their wisdom about good table sizes on different systems
-+ * dependent on RAM. This calculation here comes from there.
-+ */
-+ table_size = (totalram_pages() > (1U << 30) / PAGE_SIZE) ? 8192 :
-+ max_t(unsigned long, 16, roundup_pow_of_two(
-+ (totalram_pages() << PAGE_SHIFT) /
-+ (1U << 14) / sizeof(struct hlist_head)));
-+ max_entries = table_size * 8;
-+
-+ table_v4 = kvzalloc(table_size * sizeof(*table_v4), GFP_KERNEL);
-+ if (unlikely(!table_v4))
-+ goto err_kmemcache;
-+
-+#if IS_ENABLED(CONFIG_IPV6)
-+ table_v6 = kvzalloc(table_size * sizeof(*table_v6), GFP_KERNEL);
-+ if (unlikely(!table_v6)) {
-+ kvfree(table_v4);
-+ goto err_kmemcache;
-+ }
-+#endif
-+
-+ queue_delayed_work(system_power_efficient_wq, &gc_work, HZ);
-+ get_random_bytes(&key, sizeof(key));
-+out:
-+ mutex_unlock(&init_lock);
-+ return 0;
-+
-+err_kmemcache:
-+ kmem_cache_destroy(entry_cache);
-+err:
-+ --init_refcnt;
-+ mutex_unlock(&init_lock);
-+ return -ENOMEM;
-+}
-+
-+void wg_ratelimiter_uninit(void)
-+{
-+ mutex_lock(&init_lock);
-+ if (!init_refcnt || --init_refcnt)
-+ goto out;
-+
-+ cancel_delayed_work_sync(&gc_work);
-+ wg_ratelimiter_gc_entries(NULL);
-+ rcu_barrier();
-+ kvfree(table_v4);
-+#if IS_ENABLED(CONFIG_IPV6)
-+ kvfree(table_v6);
-+#endif
-+ kmem_cache_destroy(entry_cache);
-+out:
-+ mutex_unlock(&init_lock);
-+}
-+
-+#include "selftest/ratelimiter.c"
---- /dev/null
-+++ b/drivers/net/wireguard/ratelimiter.h
-@@ -0,0 +1,19 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_RATELIMITER_H
-+#define _WG_RATELIMITER_H
-+
-+#include <linux/skbuff.h>
-+
-+int wg_ratelimiter_init(void);
-+void wg_ratelimiter_uninit(void);
-+bool wg_ratelimiter_allow(struct sk_buff *skb, struct net *net);
-+
-+#ifdef DEBUG
-+bool wg_ratelimiter_selftest(void);
-+#endif
-+
-+#endif /* _WG_RATELIMITER_H */
---- /dev/null
-+++ b/drivers/net/wireguard/receive.c
-@@ -0,0 +1,595 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "queueing.h"
-+#include "device.h"
-+#include "peer.h"
-+#include "timers.h"
-+#include "messages.h"
-+#include "cookie.h"
-+#include "socket.h"
-+
-+#include <linux/ip.h>
-+#include <linux/ipv6.h>
-+#include <linux/udp.h>
-+#include <net/ip_tunnels.h>
-+
-+/* Must be called with bh disabled. */
-+static void update_rx_stats(struct wg_peer *peer, size_t len)
-+{
-+ struct pcpu_sw_netstats *tstats =
-+ get_cpu_ptr(peer->device->dev->tstats);
-+
-+ u64_stats_update_begin(&tstats->syncp);
-+ ++tstats->rx_packets;
-+ tstats->rx_bytes += len;
-+ peer->rx_bytes += len;
-+ u64_stats_update_end(&tstats->syncp);
-+ put_cpu_ptr(tstats);
-+}
-+
-+#define SKB_TYPE_LE32(skb) (((struct message_header *)(skb)->data)->type)
-+
-+static size_t validate_header_len(struct sk_buff *skb)
-+{
-+ if (unlikely(skb->len < sizeof(struct message_header)))
-+ return 0;
-+ if (SKB_TYPE_LE32(skb) == cpu_to_le32(MESSAGE_DATA) &&
-+ skb->len >= MESSAGE_MINIMUM_LENGTH)
-+ return sizeof(struct message_data);
-+ if (SKB_TYPE_LE32(skb) == cpu_to_le32(MESSAGE_HANDSHAKE_INITIATION) &&
-+ skb->len == sizeof(struct message_handshake_initiation))
-+ return sizeof(struct message_handshake_initiation);
-+ if (SKB_TYPE_LE32(skb) == cpu_to_le32(MESSAGE_HANDSHAKE_RESPONSE) &&
-+ skb->len == sizeof(struct message_handshake_response))
-+ return sizeof(struct message_handshake_response);
-+ if (SKB_TYPE_LE32(skb) == cpu_to_le32(MESSAGE_HANDSHAKE_COOKIE) &&
-+ skb->len == sizeof(struct message_handshake_cookie))
-+ return sizeof(struct message_handshake_cookie);
-+ return 0;
-+}
-+
-+static int prepare_skb_header(struct sk_buff *skb, struct wg_device *wg)
-+{
-+ size_t data_offset, data_len, header_len;
-+ struct udphdr *udp;
-+
-+ if (unlikely(wg_skb_examine_untrusted_ip_hdr(skb) != skb->protocol ||
-+ skb_transport_header(skb) < skb->head ||
-+ (skb_transport_header(skb) + sizeof(struct udphdr)) >
-+ skb_tail_pointer(skb)))
-+ return -EINVAL; /* Bogus IP header */
-+ udp = udp_hdr(skb);
-+ data_offset = (u8 *)udp - skb->data;
-+ if (unlikely(data_offset > U16_MAX ||
-+ data_offset + sizeof(struct udphdr) > skb->len))
-+ /* Packet has offset at impossible location or isn't big enough
-+ * to have UDP fields.
-+ */
-+ return -EINVAL;
-+ data_len = ntohs(udp->len);
-+ if (unlikely(data_len < sizeof(struct udphdr) ||
-+ data_len > skb->len - data_offset))
-+ /* UDP packet is reporting too small of a size or lying about
-+ * its size.
-+ */
-+ return -EINVAL;
-+ data_len -= sizeof(struct udphdr);
-+ data_offset = (u8 *)udp + sizeof(struct udphdr) - skb->data;
-+ if (unlikely(!pskb_may_pull(skb,
-+ data_offset + sizeof(struct message_header)) ||
-+ pskb_trim(skb, data_len + data_offset) < 0))
-+ return -EINVAL;
-+ skb_pull(skb, data_offset);
-+ if (unlikely(skb->len != data_len))
-+ /* Final len does not agree with calculated len */
-+ return -EINVAL;
-+ header_len = validate_header_len(skb);
-+ if (unlikely(!header_len))
-+ return -EINVAL;
-+ __skb_push(skb, data_offset);
-+ if (unlikely(!pskb_may_pull(skb, data_offset + header_len)))
-+ return -EINVAL;
-+ __skb_pull(skb, data_offset);
-+ return 0;
-+}
-+
-+static void wg_receive_handshake_packet(struct wg_device *wg,
-+ struct sk_buff *skb)
-+{
-+ enum cookie_mac_state mac_state;
-+ struct wg_peer *peer = NULL;
-+ /* This is global, so that our load calculation applies to the whole
-+ * system. We don't care about races with it at all.
-+ */
-+ static u64 last_under_load;
-+ bool packet_needs_cookie;
-+ bool under_load;
-+
-+ if (SKB_TYPE_LE32(skb) == cpu_to_le32(MESSAGE_HANDSHAKE_COOKIE)) {
-+ net_dbg_skb_ratelimited("%s: Receiving cookie response from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ wg_cookie_message_consume(
-+ (struct message_handshake_cookie *)skb->data, wg);
-+ return;
-+ }
-+
-+ under_load = skb_queue_len(&wg->incoming_handshakes) >=
-+ MAX_QUEUED_INCOMING_HANDSHAKES / 8;
-+ if (under_load)
-+ last_under_load = ktime_get_coarse_boottime_ns();
-+ else if (last_under_load)
-+ under_load = !wg_birthdate_has_expired(last_under_load, 1);
-+ mac_state = wg_cookie_validate_packet(&wg->cookie_checker, skb,
-+ under_load);
-+ if ((under_load && mac_state == VALID_MAC_WITH_COOKIE) ||
-+ (!under_load && mac_state == VALID_MAC_BUT_NO_COOKIE)) {
-+ packet_needs_cookie = false;
-+ } else if (under_load && mac_state == VALID_MAC_BUT_NO_COOKIE) {
-+ packet_needs_cookie = true;
-+ } else {
-+ net_dbg_skb_ratelimited("%s: Invalid MAC of handshake, dropping packet from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ return;
-+ }
-+
-+ switch (SKB_TYPE_LE32(skb)) {
-+ case cpu_to_le32(MESSAGE_HANDSHAKE_INITIATION): {
-+ struct message_handshake_initiation *message =
-+ (struct message_handshake_initiation *)skb->data;
-+
-+ if (packet_needs_cookie) {
-+ wg_packet_send_handshake_cookie(wg, skb,
-+ message->sender_index);
-+ return;
-+ }
-+ peer = wg_noise_handshake_consume_initiation(message, wg);
-+ if (unlikely(!peer)) {
-+ net_dbg_skb_ratelimited("%s: Invalid handshake initiation from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ return;
-+ }
-+ wg_socket_set_peer_endpoint_from_skb(peer, skb);
-+ net_dbg_ratelimited("%s: Receiving handshake initiation from peer %llu (%pISpfsc)\n",
-+ wg->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+ wg_packet_send_handshake_response(peer);
-+ break;
-+ }
-+ case cpu_to_le32(MESSAGE_HANDSHAKE_RESPONSE): {
-+ struct message_handshake_response *message =
-+ (struct message_handshake_response *)skb->data;
-+
-+ if (packet_needs_cookie) {
-+ wg_packet_send_handshake_cookie(wg, skb,
-+ message->sender_index);
-+ return;
-+ }
-+ peer = wg_noise_handshake_consume_response(message, wg);
-+ if (unlikely(!peer)) {
-+ net_dbg_skb_ratelimited("%s: Invalid handshake response from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ return;
-+ }
-+ wg_socket_set_peer_endpoint_from_skb(peer, skb);
-+ net_dbg_ratelimited("%s: Receiving handshake response from peer %llu (%pISpfsc)\n",
-+ wg->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+ if (wg_noise_handshake_begin_session(&peer->handshake,
-+ &peer->keypairs)) {
-+ wg_timers_session_derived(peer);
-+ wg_timers_handshake_complete(peer);
-+ /* Calling this function will either send any existing
-+ * packets in the queue and not send a keepalive, which
-+ * is the best case, Or, if there's nothing in the
-+ * queue, it will send a keepalive, in order to give
-+ * immediate confirmation of the session.
-+ */
-+ wg_packet_send_keepalive(peer);
-+ }
-+ break;
-+ }
-+ }
-+
-+ if (unlikely(!peer)) {
-+ WARN(1, "Somehow a wrong type of packet wound up in the handshake queue!\n");
-+ return;
-+ }
-+
-+ local_bh_disable();
-+ update_rx_stats(peer, skb->len);
-+ local_bh_enable();
-+
-+ wg_timers_any_authenticated_packet_received(peer);
-+ wg_timers_any_authenticated_packet_traversal(peer);
-+ wg_peer_put(peer);
-+}
-+
-+void wg_packet_handshake_receive_worker(struct work_struct *work)
-+{
-+ struct wg_device *wg = container_of(work, struct multicore_worker,
-+ work)->ptr;
-+ struct sk_buff *skb;
-+
-+ while ((skb = skb_dequeue(&wg->incoming_handshakes)) != NULL) {
-+ wg_receive_handshake_packet(wg, skb);
-+ dev_kfree_skb(skb);
-+ cond_resched();
-+ }
-+}
-+
-+static void keep_key_fresh(struct wg_peer *peer)
-+{
-+ struct noise_keypair *keypair;
-+ bool send = false;
-+
-+ if (peer->sent_lastminute_handshake)
-+ return;
-+
-+ rcu_read_lock_bh();
-+ keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
-+ if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
-+ keypair->i_am_the_initiator &&
-+ unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
-+ REJECT_AFTER_TIME - KEEPALIVE_TIMEOUT - REKEY_TIMEOUT)))
-+ send = true;
-+ rcu_read_unlock_bh();
-+
-+ if (send) {
-+ peer->sent_lastminute_handshake = true;
-+ wg_packet_send_queued_handshake_initiation(peer, false);
-+ }
-+}
-+
-+static bool decrypt_packet(struct sk_buff *skb, struct noise_symmetric_key *key)
-+{
-+ struct scatterlist sg[MAX_SKB_FRAGS + 8];
-+ struct sk_buff *trailer;
-+ unsigned int offset;
-+ int num_frags;
-+
-+ if (unlikely(!key))
-+ return false;
-+
-+ if (unlikely(!READ_ONCE(key->is_valid) ||
-+ wg_birthdate_has_expired(key->birthdate, REJECT_AFTER_TIME) ||
-+ key->counter.receive.counter >= REJECT_AFTER_MESSAGES)) {
-+ WRITE_ONCE(key->is_valid, false);
-+ return false;
-+ }
-+
-+ PACKET_CB(skb)->nonce =
-+ le64_to_cpu(((struct message_data *)skb->data)->counter);
-+
-+ /* We ensure that the network header is part of the packet before we
-+ * call skb_cow_data, so that there's no chance that data is removed
-+ * from the skb, so that later we can extract the original endpoint.
-+ */
-+ offset = skb->data - skb_network_header(skb);
-+ skb_push(skb, offset);
-+ num_frags = skb_cow_data(skb, 0, &trailer);
-+ offset += sizeof(struct message_data);
-+ skb_pull(skb, offset);
-+ if (unlikely(num_frags < 0 || num_frags > ARRAY_SIZE(sg)))
-+ return false;
-+
-+ sg_init_table(sg, num_frags);
-+ if (skb_to_sgvec(skb, sg, 0, skb->len) <= 0)
-+ return false;
-+
-+ if (!chacha20poly1305_decrypt_sg_inplace(sg, skb->len, NULL, 0,
-+ PACKET_CB(skb)->nonce,
-+ key->key))
-+ return false;
-+
-+ /* Another ugly situation of pushing and pulling the header so as to
-+ * keep endpoint information intact.
-+ */
-+ skb_push(skb, offset);
-+ if (pskb_trim(skb, skb->len - noise_encrypted_len(0)))
-+ return false;
-+ skb_pull(skb, offset);
-+
-+ return true;
-+}
-+
-+/* This is RFC6479, a replay detection bitmap algorithm that avoids bitshifts */
-+static bool counter_validate(union noise_counter *counter, u64 their_counter)
-+{
-+ unsigned long index, index_current, top, i;
-+ bool ret = false;
-+
-+ spin_lock_bh(&counter->receive.lock);
-+
-+ if (unlikely(counter->receive.counter >= REJECT_AFTER_MESSAGES + 1 ||
-+ their_counter >= REJECT_AFTER_MESSAGES))
-+ goto out;
-+
-+ ++their_counter;
-+
-+ if (unlikely((COUNTER_WINDOW_SIZE + their_counter) <
-+ counter->receive.counter))
-+ goto out;
-+
-+ index = their_counter >> ilog2(BITS_PER_LONG);
-+
-+ if (likely(their_counter > counter->receive.counter)) {
-+ index_current = counter->receive.counter >> ilog2(BITS_PER_LONG);
-+ top = min_t(unsigned long, index - index_current,
-+ COUNTER_BITS_TOTAL / BITS_PER_LONG);
-+ for (i = 1; i <= top; ++i)
-+ counter->receive.backtrack[(i + index_current) &
-+ ((COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1)] = 0;
-+ counter->receive.counter = their_counter;
-+ }
-+
-+ index &= (COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1;
-+ ret = !test_and_set_bit(their_counter & (BITS_PER_LONG - 1),
-+ &counter->receive.backtrack[index]);
-+
-+out:
-+ spin_unlock_bh(&counter->receive.lock);
-+ return ret;
-+}
-+
-+#include "selftest/counter.c"
-+
-+static void wg_packet_consume_data_done(struct wg_peer *peer,
-+ struct sk_buff *skb,
-+ struct endpoint *endpoint)
-+{
-+ struct net_device *dev = peer->device->dev;
-+ unsigned int len, len_before_trim;
-+ struct wg_peer *routed_peer;
-+
-+ wg_socket_set_peer_endpoint(peer, endpoint);
-+
-+ if (unlikely(wg_noise_received_with_keypair(&peer->keypairs,
-+ PACKET_CB(skb)->keypair))) {
-+ wg_timers_handshake_complete(peer);
-+ wg_packet_send_staged_packets(peer);
-+ }
-+
-+ keep_key_fresh(peer);
-+
-+ wg_timers_any_authenticated_packet_received(peer);
-+ wg_timers_any_authenticated_packet_traversal(peer);
-+
-+ /* A packet with length 0 is a keepalive packet */
-+ if (unlikely(!skb->len)) {
-+ update_rx_stats(peer, message_data_len(0));
-+ net_dbg_ratelimited("%s: Receiving keepalive packet from peer %llu (%pISpfsc)\n",
-+ dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+ goto packet_processed;
-+ }
-+
-+ wg_timers_data_received(peer);
-+
-+ if (unlikely(skb_network_header(skb) < skb->head))
-+ goto dishonest_packet_size;
-+ if (unlikely(!(pskb_network_may_pull(skb, sizeof(struct iphdr)) &&
-+ (ip_hdr(skb)->version == 4 ||
-+ (ip_hdr(skb)->version == 6 &&
-+ pskb_network_may_pull(skb, sizeof(struct ipv6hdr)))))))
-+ goto dishonest_packet_type;
-+
-+ skb->dev = dev;
-+ /* We've already verified the Poly1305 auth tag, which means this packet
-+ * was not modified in transit. We can therefore tell the networking
-+ * stack that all checksums of every layer of encapsulation have already
-+ * been checked "by the hardware" and therefore is unneccessary to check
-+ * again in software.
-+ */
-+ skb->ip_summed = CHECKSUM_UNNECESSARY;
-+ skb->csum_level = ~0; /* All levels */
-+ skb->protocol = wg_skb_examine_untrusted_ip_hdr(skb);
-+ if (skb->protocol == htons(ETH_P_IP)) {
-+ len = ntohs(ip_hdr(skb)->tot_len);
-+ if (unlikely(len < sizeof(struct iphdr)))
-+ goto dishonest_packet_size;
-+ if (INET_ECN_is_ce(PACKET_CB(skb)->ds))
-+ IP_ECN_set_ce(ip_hdr(skb));
-+ } else if (skb->protocol == htons(ETH_P_IPV6)) {
-+ len = ntohs(ipv6_hdr(skb)->payload_len) +
-+ sizeof(struct ipv6hdr);
-+ if (INET_ECN_is_ce(PACKET_CB(skb)->ds))
-+ IP6_ECN_set_ce(skb, ipv6_hdr(skb));
-+ } else {
-+ goto dishonest_packet_type;
-+ }
-+
-+ if (unlikely(len > skb->len))
-+ goto dishonest_packet_size;
-+ len_before_trim = skb->len;
-+ if (unlikely(pskb_trim(skb, len)))
-+ goto packet_processed;
-+
-+ routed_peer = wg_allowedips_lookup_src(&peer->device->peer_allowedips,
-+ skb);
-+ wg_peer_put(routed_peer); /* We don't need the extra reference. */
-+
-+ if (unlikely(routed_peer != peer))
-+ goto dishonest_packet_peer;
-+
-+ if (unlikely(napi_gro_receive(&peer->napi, skb) == GRO_DROP)) {
-+ ++dev->stats.rx_dropped;
-+ net_dbg_ratelimited("%s: Failed to give packet to userspace from peer %llu (%pISpfsc)\n",
-+ dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+ } else {
-+ update_rx_stats(peer, message_data_len(len_before_trim));
-+ }
-+ return;
-+
-+dishonest_packet_peer:
-+ net_dbg_skb_ratelimited("%s: Packet has unallowed src IP (%pISc) from peer %llu (%pISpfsc)\n",
-+ dev->name, skb, peer->internal_id,
-+ &peer->endpoint.addr);
-+ ++dev->stats.rx_errors;
-+ ++dev->stats.rx_frame_errors;
-+ goto packet_processed;
-+dishonest_packet_type:
-+ net_dbg_ratelimited("%s: Packet is neither ipv4 nor ipv6 from peer %llu (%pISpfsc)\n",
-+ dev->name, peer->internal_id, &peer->endpoint.addr);
-+ ++dev->stats.rx_errors;
-+ ++dev->stats.rx_frame_errors;
-+ goto packet_processed;
-+dishonest_packet_size:
-+ net_dbg_ratelimited("%s: Packet has incorrect size from peer %llu (%pISpfsc)\n",
-+ dev->name, peer->internal_id, &peer->endpoint.addr);
-+ ++dev->stats.rx_errors;
-+ ++dev->stats.rx_length_errors;
-+ goto packet_processed;
-+packet_processed:
-+ dev_kfree_skb(skb);
-+}
-+
-+int wg_packet_rx_poll(struct napi_struct *napi, int budget)
-+{
-+ struct wg_peer *peer = container_of(napi, struct wg_peer, napi);
-+ struct crypt_queue *queue = &peer->rx_queue;
-+ struct noise_keypair *keypair;
-+ struct endpoint endpoint;
-+ enum packet_state state;
-+ struct sk_buff *skb;
-+ int work_done = 0;
-+ bool free;
-+
-+ if (unlikely(budget <= 0))
-+ return 0;
-+
-+ while ((skb = __ptr_ring_peek(&queue->ring)) != NULL &&
-+ (state = atomic_read_acquire(&PACKET_CB(skb)->state)) !=
-+ PACKET_STATE_UNCRYPTED) {
-+ __ptr_ring_discard_one(&queue->ring);
-+ peer = PACKET_PEER(skb);
-+ keypair = PACKET_CB(skb)->keypair;
-+ free = true;
-+
-+ if (unlikely(state != PACKET_STATE_CRYPTED))
-+ goto next;
-+
-+ if (unlikely(!counter_validate(&keypair->receiving.counter,
-+ PACKET_CB(skb)->nonce))) {
-+ net_dbg_ratelimited("%s: Packet has invalid nonce %llu (max %llu)\n",
-+ peer->device->dev->name,
-+ PACKET_CB(skb)->nonce,
-+ keypair->receiving.counter.receive.counter);
-+ goto next;
-+ }
-+
-+ if (unlikely(wg_socket_endpoint_from_skb(&endpoint, skb)))
-+ goto next;
-+
-+ wg_reset_packet(skb);
-+ wg_packet_consume_data_done(peer, skb, &endpoint);
-+ free = false;
-+
-+next:
-+ wg_noise_keypair_put(keypair, false);
-+ wg_peer_put(peer);
-+ if (unlikely(free))
-+ dev_kfree_skb(skb);
-+
-+ if (++work_done >= budget)
-+ break;
-+ }
-+
-+ if (work_done < budget)
-+ napi_complete_done(napi, work_done);
-+
-+ return work_done;
-+}
-+
-+void wg_packet_decrypt_worker(struct work_struct *work)
-+{
-+ struct crypt_queue *queue = container_of(work, struct multicore_worker,
-+ work)->ptr;
-+ struct sk_buff *skb;
-+
-+ while ((skb = ptr_ring_consume_bh(&queue->ring)) != NULL) {
-+ enum packet_state state = likely(decrypt_packet(skb,
-+ &PACKET_CB(skb)->keypair->receiving)) ?
-+ PACKET_STATE_CRYPTED : PACKET_STATE_DEAD;
-+ wg_queue_enqueue_per_peer_napi(skb, state);
-+ }
-+}
-+
-+static void wg_packet_consume_data(struct wg_device *wg, struct sk_buff *skb)
-+{
-+ __le32 idx = ((struct message_data *)skb->data)->key_idx;
-+ struct wg_peer *peer = NULL;
-+ int ret;
-+
-+ rcu_read_lock_bh();
-+ PACKET_CB(skb)->keypair =
-+ (struct noise_keypair *)wg_index_hashtable_lookup(
-+ wg->index_hashtable, INDEX_HASHTABLE_KEYPAIR, idx,
-+ &peer);
-+ if (unlikely(!wg_noise_keypair_get(PACKET_CB(skb)->keypair)))
-+ goto err_keypair;
-+
-+ if (unlikely(READ_ONCE(peer->is_dead)))
-+ goto err;
-+
-+ ret = wg_queue_enqueue_per_device_and_peer(&wg->decrypt_queue,
-+ &peer->rx_queue, skb,
-+ wg->packet_crypt_wq,
-+ &wg->decrypt_queue.last_cpu);
-+ if (unlikely(ret == -EPIPE))
-+ wg_queue_enqueue_per_peer_napi(skb, PACKET_STATE_DEAD);
-+ if (likely(!ret || ret == -EPIPE)) {
-+ rcu_read_unlock_bh();
-+ return;
-+ }
-+err:
-+ wg_noise_keypair_put(PACKET_CB(skb)->keypair, false);
-+err_keypair:
-+ rcu_read_unlock_bh();
-+ wg_peer_put(peer);
-+ dev_kfree_skb(skb);
-+}
-+
-+void wg_packet_receive(struct wg_device *wg, struct sk_buff *skb)
-+{
-+ if (unlikely(prepare_skb_header(skb, wg) < 0))
-+ goto err;
-+ switch (SKB_TYPE_LE32(skb)) {
-+ case cpu_to_le32(MESSAGE_HANDSHAKE_INITIATION):
-+ case cpu_to_le32(MESSAGE_HANDSHAKE_RESPONSE):
-+ case cpu_to_le32(MESSAGE_HANDSHAKE_COOKIE): {
-+ int cpu;
-+
-+ if (skb_queue_len(&wg->incoming_handshakes) >
-+ MAX_QUEUED_INCOMING_HANDSHAKES ||
-+ unlikely(!rng_is_initialized())) {
-+ net_dbg_skb_ratelimited("%s: Dropping handshake packet from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ goto err;
-+ }
-+ skb_queue_tail(&wg->incoming_handshakes, skb);
-+ /* Queues up a call to packet_process_queued_handshake_
-+ * packets(skb):
-+ */
-+ cpu = wg_cpumask_next_online(&wg->incoming_handshake_cpu);
-+ queue_work_on(cpu, wg->handshake_receive_wq,
-+ &per_cpu_ptr(wg->incoming_handshakes_worker, cpu)->work);
-+ break;
-+ }
-+ case cpu_to_le32(MESSAGE_DATA):
-+ PACKET_CB(skb)->ds = ip_tunnel_get_dsfield(ip_hdr(skb), skb);
-+ wg_packet_consume_data(wg, skb);
-+ break;
-+ default:
-+ net_dbg_skb_ratelimited("%s: Invalid packet from %pISpfsc\n",
-+ wg->dev->name, skb);
-+ goto err;
-+ }
-+ return;
-+
-+err:
-+ dev_kfree_skb(skb);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/selftest/allowedips.c
-@@ -0,0 +1,683 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * This contains some basic static unit tests for the allowedips data structure.
-+ * It also has two additional modes that are disabled and meant to be used by
-+ * folks directly playing with this file. If you define the macro
-+ * DEBUG_PRINT_TRIE_GRAPHVIZ to be 1, then every time there's a full tree in
-+ * memory, it will be printed out as KERN_DEBUG in a format that can be passed
-+ * to graphviz (the dot command) to visualize it. If you define the macro
-+ * DEBUG_RANDOM_TRIE to be 1, then there will be an extremely costly set of
-+ * randomized tests done against a trivial implementation, which may take
-+ * upwards of a half-hour to complete. There's no set of users who should be
-+ * enabling these, and the only developers that should go anywhere near these
-+ * nobs are the ones who are reading this comment.
-+ */
-+
-+#ifdef DEBUG
-+
-+#include <linux/siphash.h>
-+
-+static __init void swap_endian_and_apply_cidr(u8 *dst, const u8 *src, u8 bits,
-+ u8 cidr)
-+{
-+ swap_endian(dst, src, bits);
-+ memset(dst + (cidr + 7) / 8, 0, bits / 8 - (cidr + 7) / 8);
-+ if (cidr)
-+ dst[(cidr + 7) / 8 - 1] &= ~0U << ((8 - (cidr % 8)) % 8);
-+}
-+
-+static __init void print_node(struct allowedips_node *node, u8 bits)
-+{
-+ char *fmt_connection = KERN_DEBUG "\t\"%p/%d\" -> \"%p/%d\";\n";
-+ char *fmt_declaration = KERN_DEBUG
-+ "\t\"%p/%d\"[style=%s, color=\"#%06x\"];\n";
-+ char *style = "dotted";
-+ u8 ip1[16], ip2[16];
-+ u32 color = 0;
-+
-+ if (bits == 32) {
-+ fmt_connection = KERN_DEBUG "\t\"%pI4/%d\" -> \"%pI4/%d\";\n";
-+ fmt_declaration = KERN_DEBUG
-+ "\t\"%pI4/%d\"[style=%s, color=\"#%06x\"];\n";
-+ } else if (bits == 128) {
-+ fmt_connection = KERN_DEBUG "\t\"%pI6/%d\" -> \"%pI6/%d\";\n";
-+ fmt_declaration = KERN_DEBUG
-+ "\t\"%pI6/%d\"[style=%s, color=\"#%06x\"];\n";
-+ }
-+ if (node->peer) {
-+ hsiphash_key_t key = { { 0 } };
-+
-+ memcpy(&key, &node->peer, sizeof(node->peer));
-+ color = hsiphash_1u32(0xdeadbeef, &key) % 200 << 16 |
-+ hsiphash_1u32(0xbabecafe, &key) % 200 << 8 |
-+ hsiphash_1u32(0xabad1dea, &key) % 200;
-+ style = "bold";
-+ }
-+ swap_endian_and_apply_cidr(ip1, node->bits, bits, node->cidr);
-+ printk(fmt_declaration, ip1, node->cidr, style, color);
-+ if (node->bit[0]) {
-+ swap_endian_and_apply_cidr(ip2,
-+ rcu_dereference_raw(node->bit[0])->bits, bits,
-+ node->cidr);
-+ printk(fmt_connection, ip1, node->cidr, ip2,
-+ rcu_dereference_raw(node->bit[0])->cidr);
-+ print_node(rcu_dereference_raw(node->bit[0]), bits);
-+ }
-+ if (node->bit[1]) {
-+ swap_endian_and_apply_cidr(ip2,
-+ rcu_dereference_raw(node->bit[1])->bits,
-+ bits, node->cidr);
-+ printk(fmt_connection, ip1, node->cidr, ip2,
-+ rcu_dereference_raw(node->bit[1])->cidr);
-+ print_node(rcu_dereference_raw(node->bit[1]), bits);
-+ }
-+}
-+
-+static __init void print_tree(struct allowedips_node __rcu *top, u8 bits)
-+{
-+ printk(KERN_DEBUG "digraph trie {\n");
-+ print_node(rcu_dereference_raw(top), bits);
-+ printk(KERN_DEBUG "}\n");
-+}
-+
-+enum {
-+ NUM_PEERS = 2000,
-+ NUM_RAND_ROUTES = 400,
-+ NUM_MUTATED_ROUTES = 100,
-+ NUM_QUERIES = NUM_RAND_ROUTES * NUM_MUTATED_ROUTES * 30
-+};
-+
-+struct horrible_allowedips {
-+ struct hlist_head head;
-+};
-+
-+struct horrible_allowedips_node {
-+ struct hlist_node table;
-+ union nf_inet_addr ip;
-+ union nf_inet_addr mask;
-+ u8 ip_version;
-+ void *value;
-+};
-+
-+static __init void horrible_allowedips_init(struct horrible_allowedips *table)
-+{
-+ INIT_HLIST_HEAD(&table->head);
-+}
-+
-+static __init void horrible_allowedips_free(struct horrible_allowedips *table)
-+{
-+ struct horrible_allowedips_node *node;
-+ struct hlist_node *h;
-+
-+ hlist_for_each_entry_safe(node, h, &table->head, table) {
-+ hlist_del(&node->table);
-+ kfree(node);
-+ }
-+}
-+
-+static __init inline union nf_inet_addr horrible_cidr_to_mask(u8 cidr)
-+{
-+ union nf_inet_addr mask;
-+
-+ memset(&mask, 0x00, 128 / 8);
-+ memset(&mask, 0xff, cidr / 8);
-+ if (cidr % 32)
-+ mask.all[cidr / 32] = (__force u32)htonl(
-+ (0xFFFFFFFFUL << (32 - (cidr % 32))) & 0xFFFFFFFFUL);
-+ return mask;
-+}
-+
-+static __init inline u8 horrible_mask_to_cidr(union nf_inet_addr subnet)
-+{
-+ return hweight32(subnet.all[0]) + hweight32(subnet.all[1]) +
-+ hweight32(subnet.all[2]) + hweight32(subnet.all[3]);
-+}
-+
-+static __init inline void
-+horrible_mask_self(struct horrible_allowedips_node *node)
-+{
-+ if (node->ip_version == 4) {
-+ node->ip.ip &= node->mask.ip;
-+ } else if (node->ip_version == 6) {
-+ node->ip.ip6[0] &= node->mask.ip6[0];
-+ node->ip.ip6[1] &= node->mask.ip6[1];
-+ node->ip.ip6[2] &= node->mask.ip6[2];
-+ node->ip.ip6[3] &= node->mask.ip6[3];
-+ }
-+}
-+
-+static __init inline bool
-+horrible_match_v4(const struct horrible_allowedips_node *node,
-+ struct in_addr *ip)
-+{
-+ return (ip->s_addr & node->mask.ip) == node->ip.ip;
-+}
-+
-+static __init inline bool
-+horrible_match_v6(const struct horrible_allowedips_node *node,
-+ struct in6_addr *ip)
-+{
-+ return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) ==
-+ node->ip.ip6[0] &&
-+ (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) ==
-+ node->ip.ip6[1] &&
-+ (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) ==
-+ node->ip.ip6[2] &&
-+ (ip->in6_u.u6_addr32[3] & node->mask.ip6[3]) == node->ip.ip6[3];
-+}
-+
-+static __init void
-+horrible_insert_ordered(struct horrible_allowedips *table,
-+ struct horrible_allowedips_node *node)
-+{
-+ struct horrible_allowedips_node *other = NULL, *where = NULL;
-+ u8 my_cidr = horrible_mask_to_cidr(node->mask);
-+
-+ hlist_for_each_entry(other, &table->head, table) {
-+ if (!memcmp(&other->mask, &node->mask,
-+ sizeof(union nf_inet_addr)) &&
-+ !memcmp(&other->ip, &node->ip,
-+ sizeof(union nf_inet_addr)) &&
-+ other->ip_version == node->ip_version) {
-+ other->value = node->value;
-+ kfree(node);
-+ return;
-+ }
-+ where = other;
-+ if (horrible_mask_to_cidr(other->mask) <= my_cidr)
-+ break;
-+ }
-+ if (!other && !where)
-+ hlist_add_head(&node->table, &table->head);
-+ else if (!other)
-+ hlist_add_behind(&node->table, &where->table);
-+ else
-+ hlist_add_before(&node->table, &where->table);
-+}
-+
-+static __init int
-+horrible_allowedips_insert_v4(struct horrible_allowedips *table,
-+ struct in_addr *ip, u8 cidr, void *value)
-+{
-+ struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-+ GFP_KERNEL);
-+
-+ if (unlikely(!node))
-+ return -ENOMEM;
-+ node->ip.in = *ip;
-+ node->mask = horrible_cidr_to_mask(cidr);
-+ node->ip_version = 4;
-+ node->value = value;
-+ horrible_mask_self(node);
-+ horrible_insert_ordered(table, node);
-+ return 0;
-+}
-+
-+static __init int
-+horrible_allowedips_insert_v6(struct horrible_allowedips *table,
-+ struct in6_addr *ip, u8 cidr, void *value)
-+{
-+ struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-+ GFP_KERNEL);
-+
-+ if (unlikely(!node))
-+ return -ENOMEM;
-+ node->ip.in6 = *ip;
-+ node->mask = horrible_cidr_to_mask(cidr);
-+ node->ip_version = 6;
-+ node->value = value;
-+ horrible_mask_self(node);
-+ horrible_insert_ordered(table, node);
-+ return 0;
-+}
-+
-+static __init void *
-+horrible_allowedips_lookup_v4(struct horrible_allowedips *table,
-+ struct in_addr *ip)
-+{
-+ struct horrible_allowedips_node *node;
-+ void *ret = NULL;
-+
-+ hlist_for_each_entry(node, &table->head, table) {
-+ if (node->ip_version != 4)
-+ continue;
-+ if (horrible_match_v4(node, ip)) {
-+ ret = node->value;
-+ break;
-+ }
-+ }
-+ return ret;
-+}
-+
-+static __init void *
-+horrible_allowedips_lookup_v6(struct horrible_allowedips *table,
-+ struct in6_addr *ip)
-+{
-+ struct horrible_allowedips_node *node;
-+ void *ret = NULL;
-+
-+ hlist_for_each_entry(node, &table->head, table) {
-+ if (node->ip_version != 6)
-+ continue;
-+ if (horrible_match_v6(node, ip)) {
-+ ret = node->value;
-+ break;
-+ }
-+ }
-+ return ret;
-+}
-+
-+static __init bool randomized_test(void)
-+{
-+ unsigned int i, j, k, mutate_amount, cidr;
-+ u8 ip[16], mutate_mask[16], mutated[16];
-+ struct wg_peer **peers, *peer;
-+ struct horrible_allowedips h;
-+ DEFINE_MUTEX(mutex);
-+ struct allowedips t;
-+ bool ret = false;
-+
-+ mutex_init(&mutex);
-+
-+ wg_allowedips_init(&t);
-+ horrible_allowedips_init(&h);
-+
-+ peers = kcalloc(NUM_PEERS, sizeof(*peers), GFP_KERNEL);
-+ if (unlikely(!peers)) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free;
-+ }
-+ for (i = 0; i < NUM_PEERS; ++i) {
-+ peers[i] = kzalloc(sizeof(*peers[i]), GFP_KERNEL);
-+ if (unlikely(!peers[i])) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free;
-+ }
-+ kref_init(&peers[i]->refcount);
-+ }
-+
-+ mutex_lock(&mutex);
-+
-+ for (i = 0; i < NUM_RAND_ROUTES; ++i) {
-+ prandom_bytes(ip, 4);
-+ cidr = prandom_u32_max(32) + 1;
-+ peer = peers[prandom_u32_max(NUM_PEERS)];
-+ if (wg_allowedips_insert_v4(&t, (struct in_addr *)ip, cidr,
-+ peer, &mutex) < 0) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ if (horrible_allowedips_insert_v4(&h, (struct in_addr *)ip,
-+ cidr, peer) < 0) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ for (j = 0; j < NUM_MUTATED_ROUTES; ++j) {
-+ memcpy(mutated, ip, 4);
-+ prandom_bytes(mutate_mask, 4);
-+ mutate_amount = prandom_u32_max(32);
-+ for (k = 0; k < mutate_amount / 8; ++k)
-+ mutate_mask[k] = 0xff;
-+ mutate_mask[k] = 0xff
-+ << ((8 - (mutate_amount % 8)) % 8);
-+ for (; k < 4; ++k)
-+ mutate_mask[k] = 0;
-+ for (k = 0; k < 4; ++k)
-+ mutated[k] = (mutated[k] & mutate_mask[k]) |
-+ (~mutate_mask[k] &
-+ prandom_u32_max(256));
-+ cidr = prandom_u32_max(32) + 1;
-+ peer = peers[prandom_u32_max(NUM_PEERS)];
-+ if (wg_allowedips_insert_v4(&t,
-+ (struct in_addr *)mutated,
-+ cidr, peer, &mutex) < 0) {
-+ pr_err("allowedips random malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ if (horrible_allowedips_insert_v4(&h,
-+ (struct in_addr *)mutated, cidr, peer)) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ }
-+ }
-+
-+ for (i = 0; i < NUM_RAND_ROUTES; ++i) {
-+ prandom_bytes(ip, 16);
-+ cidr = prandom_u32_max(128) + 1;
-+ peer = peers[prandom_u32_max(NUM_PEERS)];
-+ if (wg_allowedips_insert_v6(&t, (struct in6_addr *)ip, cidr,
-+ peer, &mutex) < 0) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ if (horrible_allowedips_insert_v6(&h, (struct in6_addr *)ip,
-+ cidr, peer) < 0) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ for (j = 0; j < NUM_MUTATED_ROUTES; ++j) {
-+ memcpy(mutated, ip, 16);
-+ prandom_bytes(mutate_mask, 16);
-+ mutate_amount = prandom_u32_max(128);
-+ for (k = 0; k < mutate_amount / 8; ++k)
-+ mutate_mask[k] = 0xff;
-+ mutate_mask[k] = 0xff
-+ << ((8 - (mutate_amount % 8)) % 8);
-+ for (; k < 4; ++k)
-+ mutate_mask[k] = 0;
-+ for (k = 0; k < 4; ++k)
-+ mutated[k] = (mutated[k] & mutate_mask[k]) |
-+ (~mutate_mask[k] &
-+ prandom_u32_max(256));
-+ cidr = prandom_u32_max(128) + 1;
-+ peer = peers[prandom_u32_max(NUM_PEERS)];
-+ if (wg_allowedips_insert_v6(&t,
-+ (struct in6_addr *)mutated,
-+ cidr, peer, &mutex) < 0) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ if (horrible_allowedips_insert_v6(
-+ &h, (struct in6_addr *)mutated, cidr,
-+ peer)) {
-+ pr_err("allowedips random self-test malloc: FAIL\n");
-+ goto free_locked;
-+ }
-+ }
-+ }
-+
-+ mutex_unlock(&mutex);
-+
-+ if (IS_ENABLED(DEBUG_PRINT_TRIE_GRAPHVIZ)) {
-+ print_tree(t.root4, 32);
-+ print_tree(t.root6, 128);
-+ }
-+
-+ for (i = 0; i < NUM_QUERIES; ++i) {
-+ prandom_bytes(ip, 4);
-+ if (lookup(t.root4, 32, ip) !=
-+ horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip)) {
-+ pr_err("allowedips random self-test: FAIL\n");
-+ goto free;
-+ }
-+ }
-+
-+ for (i = 0; i < NUM_QUERIES; ++i) {
-+ prandom_bytes(ip, 16);
-+ if (lookup(t.root6, 128, ip) !=
-+ horrible_allowedips_lookup_v6(&h, (struct in6_addr *)ip)) {
-+ pr_err("allowedips random self-test: FAIL\n");
-+ goto free;
-+ }
-+ }
-+ ret = true;
-+
-+free:
-+ mutex_lock(&mutex);
-+free_locked:
-+ wg_allowedips_free(&t, &mutex);
-+ mutex_unlock(&mutex);
-+ horrible_allowedips_free(&h);
-+ if (peers) {
-+ for (i = 0; i < NUM_PEERS; ++i)
-+ kfree(peers[i]);
-+ }
-+ kfree(peers);
-+ return ret;
-+}
-+
-+static __init inline struct in_addr *ip4(u8 a, u8 b, u8 c, u8 d)
-+{
-+ static struct in_addr ip;
-+ u8 *split = (u8 *)&ip;
-+
-+ split[0] = a;
-+ split[1] = b;
-+ split[2] = c;
-+ split[3] = d;
-+ return &ip;
-+}
-+
-+static __init inline struct in6_addr *ip6(u32 a, u32 b, u32 c, u32 d)
-+{
-+ static struct in6_addr ip;
-+ __be32 *split = (__be32 *)&ip;
-+
-+ split[0] = cpu_to_be32(a);
-+ split[1] = cpu_to_be32(b);
-+ split[2] = cpu_to_be32(c);
-+ split[3] = cpu_to_be32(d);
-+ return &ip;
-+}
-+
-+static __init struct wg_peer *init_peer(void)
-+{
-+ struct wg_peer *peer = kzalloc(sizeof(*peer), GFP_KERNEL);
-+
-+ if (!peer)
-+ return NULL;
-+ kref_init(&peer->refcount);
-+ INIT_LIST_HEAD(&peer->allowedips_list);
-+ return peer;
-+}
-+
-+#define insert(version, mem, ipa, ipb, ipc, ipd, cidr) \
-+ wg_allowedips_insert_v##version(&t, ip##version(ipa, ipb, ipc, ipd), \
-+ cidr, mem, &mutex)
-+
-+#define maybe_fail() do { \
-+ ++i; \
-+ if (!_s) { \
-+ pr_info("allowedips self-test %zu: FAIL\n", i); \
-+ success = false; \
-+ } \
-+ } while (0)
-+
-+#define test(version, mem, ipa, ipb, ipc, ipd) do { \
-+ bool _s = lookup(t.root##version, (version) == 4 ? 32 : 128, \
-+ ip##version(ipa, ipb, ipc, ipd)) == (mem); \
-+ maybe_fail(); \
-+ } while (0)
-+
-+#define test_negative(version, mem, ipa, ipb, ipc, ipd) do { \
-+ bool _s = lookup(t.root##version, (version) == 4 ? 32 : 128, \
-+ ip##version(ipa, ipb, ipc, ipd)) != (mem); \
-+ maybe_fail(); \
-+ } while (0)
-+
-+#define test_boolean(cond) do { \
-+ bool _s = (cond); \
-+ maybe_fail(); \
-+ } while (0)
-+
-+bool __init wg_allowedips_selftest(void)
-+{
-+ bool found_a = false, found_b = false, found_c = false, found_d = false,
-+ found_e = false, found_other = false;
-+ struct wg_peer *a = init_peer(), *b = init_peer(), *c = init_peer(),
-+ *d = init_peer(), *e = init_peer(), *f = init_peer(),
-+ *g = init_peer(), *h = init_peer();
-+ struct allowedips_node *iter_node;
-+ bool success = false;
-+ struct allowedips t;
-+ DEFINE_MUTEX(mutex);
-+ struct in6_addr ip;
-+ size_t i = 0, count = 0;
-+ __be64 part;
-+
-+ mutex_init(&mutex);
-+ mutex_lock(&mutex);
-+ wg_allowedips_init(&t);
-+
-+ if (!a || !b || !c || !d || !e || !f || !g || !h) {
-+ pr_err("allowedips self-test malloc: FAIL\n");
-+ goto free;
-+ }
-+
-+ insert(4, a, 192, 168, 4, 0, 24);
-+ insert(4, b, 192, 168, 4, 4, 32);
-+ insert(4, c, 192, 168, 0, 0, 16);
-+ insert(4, d, 192, 95, 5, 64, 27);
-+ /* replaces previous entry, and maskself is required */
-+ insert(4, c, 192, 95, 5, 65, 27);
-+ insert(6, d, 0x26075300, 0x60006b00, 0, 0xc05f0543, 128);
-+ insert(6, c, 0x26075300, 0x60006b00, 0, 0, 64);
-+ insert(4, e, 0, 0, 0, 0, 0);
-+ insert(6, e, 0, 0, 0, 0, 0);
-+ /* replaces previous entry */
-+ insert(6, f, 0, 0, 0, 0, 0);
-+ insert(6, g, 0x24046800, 0, 0, 0, 32);
-+ /* maskself is required */
-+ insert(6, h, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef, 64);
-+ insert(6, a, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef, 128);
-+ insert(6, c, 0x24446800, 0x40e40800, 0xdeaebeef, 0xdefbeef, 128);
-+ insert(6, b, 0x24446800, 0xf0e40800, 0xeeaebeef, 0, 98);
-+ insert(4, g, 64, 15, 112, 0, 20);
-+ /* maskself is required */
-+ insert(4, h, 64, 15, 123, 211, 25);
-+ insert(4, a, 10, 0, 0, 0, 25);
-+ insert(4, b, 10, 0, 0, 128, 25);
-+ insert(4, a, 10, 1, 0, 0, 30);
-+ insert(4, b, 10, 1, 0, 4, 30);
-+ insert(4, c, 10, 1, 0, 8, 29);
-+ insert(4, d, 10, 1, 0, 16, 29);
-+
-+ if (IS_ENABLED(DEBUG_PRINT_TRIE_GRAPHVIZ)) {
-+ print_tree(t.root4, 32);
-+ print_tree(t.root6, 128);
-+ }
-+
-+ success = true;
-+
-+ test(4, a, 192, 168, 4, 20);
-+ test(4, a, 192, 168, 4, 0);
-+ test(4, b, 192, 168, 4, 4);
-+ test(4, c, 192, 168, 200, 182);
-+ test(4, c, 192, 95, 5, 68);
-+ test(4, e, 192, 95, 5, 96);
-+ test(6, d, 0x26075300, 0x60006b00, 0, 0xc05f0543);
-+ test(6, c, 0x26075300, 0x60006b00, 0, 0xc02e01ee);
-+ test(6, f, 0x26075300, 0x60006b01, 0, 0);
-+ test(6, g, 0x24046800, 0x40040806, 0, 0x1006);
-+ test(6, g, 0x24046800, 0x40040806, 0x1234, 0x5678);
-+ test(6, f, 0x240467ff, 0x40040806, 0x1234, 0x5678);
-+ test(6, f, 0x24046801, 0x40040806, 0x1234, 0x5678);
-+ test(6, h, 0x24046800, 0x40040800, 0x1234, 0x5678);
-+ test(6, h, 0x24046800, 0x40040800, 0, 0);
-+ test(6, h, 0x24046800, 0x40040800, 0x10101010, 0x10101010);
-+ test(6, a, 0x24046800, 0x40040800, 0xdeadbeef, 0xdeadbeef);
-+ test(4, g, 64, 15, 116, 26);
-+ test(4, g, 64, 15, 127, 3);
-+ test(4, g, 64, 15, 123, 1);
-+ test(4, h, 64, 15, 123, 128);
-+ test(4, h, 64, 15, 123, 129);
-+ test(4, a, 10, 0, 0, 52);
-+ test(4, b, 10, 0, 0, 220);
-+ test(4, a, 10, 1, 0, 2);
-+ test(4, b, 10, 1, 0, 6);
-+ test(4, c, 10, 1, 0, 10);
-+ test(4, d, 10, 1, 0, 20);
-+
-+ insert(4, a, 1, 0, 0, 0, 32);
-+ insert(4, a, 64, 0, 0, 0, 32);
-+ insert(4, a, 128, 0, 0, 0, 32);
-+ insert(4, a, 192, 0, 0, 0, 32);
-+ insert(4, a, 255, 0, 0, 0, 32);
-+ wg_allowedips_remove_by_peer(&t, a, &mutex);
-+ test_negative(4, a, 1, 0, 0, 0);
-+ test_negative(4, a, 64, 0, 0, 0);
-+ test_negative(4, a, 128, 0, 0, 0);
-+ test_negative(4, a, 192, 0, 0, 0);
-+ test_negative(4, a, 255, 0, 0, 0);
-+
-+ wg_allowedips_free(&t, &mutex);
-+ wg_allowedips_init(&t);
-+ insert(4, a, 192, 168, 0, 0, 16);
-+ insert(4, a, 192, 168, 0, 0, 24);
-+ wg_allowedips_remove_by_peer(&t, a, &mutex);
-+ test_negative(4, a, 192, 168, 0, 1);
-+
-+ /* These will hit the WARN_ON(len >= 128) in free_node if something
-+ * goes wrong.
-+ */
-+ for (i = 0; i < 128; ++i) {
-+ part = cpu_to_be64(~(1LLU << (i % 64)));
-+ memset(&ip, 0xff, 16);
-+ memcpy((u8 *)&ip + (i < 64) * 8, &part, 8);
-+ wg_allowedips_insert_v6(&t, &ip, 128, a, &mutex);
-+ }
-+
-+ wg_allowedips_free(&t, &mutex);
-+
-+ wg_allowedips_init(&t);
-+ insert(4, a, 192, 95, 5, 93, 27);
-+ insert(6, a, 0x26075300, 0x60006b00, 0, 0xc05f0543, 128);
-+ insert(4, a, 10, 1, 0, 20, 29);
-+ insert(6, a, 0x26075300, 0x6d8a6bf8, 0xdab1f1df, 0xc05f1523, 83);
-+ insert(6, a, 0x26075300, 0x6d8a6bf8, 0xdab1f1df, 0xc05f1523, 21);
-+ list_for_each_entry(iter_node, &a->allowedips_list, peer_list) {
-+ u8 cidr, ip[16] __aligned(__alignof(u64));
-+ int family = wg_allowedips_read_node(iter_node, ip, &cidr);
-+
-+ count++;
-+
-+ if (cidr == 27 && family == AF_INET &&
-+ !memcmp(ip, ip4(192, 95, 5, 64), sizeof(struct in_addr)))
-+ found_a = true;
-+ else if (cidr == 128 && family == AF_INET6 &&
-+ !memcmp(ip, ip6(0x26075300, 0x60006b00, 0, 0xc05f0543),
-+ sizeof(struct in6_addr)))
-+ found_b = true;
-+ else if (cidr == 29 && family == AF_INET &&
-+ !memcmp(ip, ip4(10, 1, 0, 16), sizeof(struct in_addr)))
-+ found_c = true;
-+ else if (cidr == 83 && family == AF_INET6 &&
-+ !memcmp(ip, ip6(0x26075300, 0x6d8a6bf8, 0xdab1e000, 0),
-+ sizeof(struct in6_addr)))
-+ found_d = true;
-+ else if (cidr == 21 && family == AF_INET6 &&
-+ !memcmp(ip, ip6(0x26075000, 0, 0, 0),
-+ sizeof(struct in6_addr)))
-+ found_e = true;
-+ else
-+ found_other = true;
-+ }
-+ test_boolean(count == 5);
-+ test_boolean(found_a);
-+ test_boolean(found_b);
-+ test_boolean(found_c);
-+ test_boolean(found_d);
-+ test_boolean(found_e);
-+ test_boolean(!found_other);
-+
-+ if (IS_ENABLED(DEBUG_RANDOM_TRIE) && success)
-+ success = randomized_test();
-+
-+ if (success)
-+ pr_info("allowedips self-tests: pass\n");
-+
-+free:
-+ wg_allowedips_free(&t, &mutex);
-+ kfree(a);
-+ kfree(b);
-+ kfree(c);
-+ kfree(d);
-+ kfree(e);
-+ kfree(f);
-+ kfree(g);
-+ kfree(h);
-+ mutex_unlock(&mutex);
-+
-+ return success;
-+}
-+
-+#undef test_negative
-+#undef test
-+#undef remove
-+#undef insert
-+#undef init_peer
-+
-+#endif
---- /dev/null
-+++ b/drivers/net/wireguard/selftest/counter.c
-@@ -0,0 +1,104 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifdef DEBUG
-+bool __init wg_packet_counter_selftest(void)
-+{
-+ unsigned int test_num = 0, i;
-+ union noise_counter counter;
-+ bool success = true;
-+
-+#define T_INIT do { \
-+ memset(&counter, 0, sizeof(union noise_counter)); \
-+ spin_lock_init(&counter.receive.lock); \
-+ } while (0)
-+#define T_LIM (COUNTER_WINDOW_SIZE + 1)
-+#define T(n, v) do { \
-+ ++test_num; \
-+ if (counter_validate(&counter, n) != (v)) { \
-+ pr_err("nonce counter self-test %u: FAIL\n", \
-+ test_num); \
-+ success = false; \
-+ } \
-+ } while (0)
-+
-+ T_INIT;
-+ /* 1 */ T(0, true);
-+ /* 2 */ T(1, true);
-+ /* 3 */ T(1, false);
-+ /* 4 */ T(9, true);
-+ /* 5 */ T(8, true);
-+ /* 6 */ T(7, true);
-+ /* 7 */ T(7, false);
-+ /* 8 */ T(T_LIM, true);
-+ /* 9 */ T(T_LIM - 1, true);
-+ /* 10 */ T(T_LIM - 1, false);
-+ /* 11 */ T(T_LIM - 2, true);
-+ /* 12 */ T(2, true);
-+ /* 13 */ T(2, false);
-+ /* 14 */ T(T_LIM + 16, true);
-+ /* 15 */ T(3, false);
-+ /* 16 */ T(T_LIM + 16, false);
-+ /* 17 */ T(T_LIM * 4, true);
-+ /* 18 */ T(T_LIM * 4 - (T_LIM - 1), true);
-+ /* 19 */ T(10, false);
-+ /* 20 */ T(T_LIM * 4 - T_LIM, false);
-+ /* 21 */ T(T_LIM * 4 - (T_LIM + 1), false);
-+ /* 22 */ T(T_LIM * 4 - (T_LIM - 2), true);
-+ /* 23 */ T(T_LIM * 4 + 1 - T_LIM, false);
-+ /* 24 */ T(0, false);
-+ /* 25 */ T(REJECT_AFTER_MESSAGES, false);
-+ /* 26 */ T(REJECT_AFTER_MESSAGES - 1, true);
-+ /* 27 */ T(REJECT_AFTER_MESSAGES, false);
-+ /* 28 */ T(REJECT_AFTER_MESSAGES - 1, false);
-+ /* 29 */ T(REJECT_AFTER_MESSAGES - 2, true);
-+ /* 30 */ T(REJECT_AFTER_MESSAGES + 1, false);
-+ /* 31 */ T(REJECT_AFTER_MESSAGES + 2, false);
-+ /* 32 */ T(REJECT_AFTER_MESSAGES - 2, false);
-+ /* 33 */ T(REJECT_AFTER_MESSAGES - 3, true);
-+ /* 34 */ T(0, false);
-+
-+ T_INIT;
-+ for (i = 1; i <= COUNTER_WINDOW_SIZE; ++i)
-+ T(i, true);
-+ T(0, true);
-+ T(0, false);
-+
-+ T_INIT;
-+ for (i = 2; i <= COUNTER_WINDOW_SIZE + 1; ++i)
-+ T(i, true);
-+ T(1, true);
-+ T(0, false);
-+
-+ T_INIT;
-+ for (i = COUNTER_WINDOW_SIZE + 1; i-- > 0;)
-+ T(i, true);
-+
-+ T_INIT;
-+ for (i = COUNTER_WINDOW_SIZE + 2; i-- > 1;)
-+ T(i, true);
-+ T(0, false);
-+
-+ T_INIT;
-+ for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
-+ T(i, true);
-+ T(COUNTER_WINDOW_SIZE + 1, true);
-+ T(0, false);
-+
-+ T_INIT;
-+ for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
-+ T(i, true);
-+ T(0, true);
-+ T(COUNTER_WINDOW_SIZE + 1, true);
-+
-+#undef T
-+#undef T_LIM
-+#undef T_INIT
-+
-+ if (success)
-+ pr_info("nonce counter self-tests: pass\n");
-+ return success;
-+}
-+#endif
---- /dev/null
-+++ b/drivers/net/wireguard/selftest/ratelimiter.c
-@@ -0,0 +1,226 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifdef DEBUG
-+
-+#include <linux/jiffies.h>
-+
-+static const struct {
-+ bool result;
-+ unsigned int msec_to_sleep_before;
-+} expected_results[] __initconst = {
-+ [0 ... PACKETS_BURSTABLE - 1] = { true, 0 },
-+ [PACKETS_BURSTABLE] = { false, 0 },
-+ [PACKETS_BURSTABLE + 1] = { true, MSEC_PER_SEC / PACKETS_PER_SECOND },
-+ [PACKETS_BURSTABLE + 2] = { false, 0 },
-+ [PACKETS_BURSTABLE + 3] = { true, (MSEC_PER_SEC / PACKETS_PER_SECOND) * 2 },
-+ [PACKETS_BURSTABLE + 4] = { true, 0 },
-+ [PACKETS_BURSTABLE + 5] = { false, 0 }
-+};
-+
-+static __init unsigned int maximum_jiffies_at_index(int index)
-+{
-+ unsigned int total_msecs = 2 * MSEC_PER_SEC / PACKETS_PER_SECOND / 3;
-+ int i;
-+
-+ for (i = 0; i <= index; ++i)
-+ total_msecs += expected_results[i].msec_to_sleep_before;
-+ return msecs_to_jiffies(total_msecs);
-+}
-+
-+static __init int timings_test(struct sk_buff *skb4, struct iphdr *hdr4,
-+ struct sk_buff *skb6, struct ipv6hdr *hdr6,
-+ int *test)
-+{
-+ unsigned long loop_start_time;
-+ int i;
-+
-+ wg_ratelimiter_gc_entries(NULL);
-+ rcu_barrier();
-+ loop_start_time = jiffies;
-+
-+ for (i = 0; i < ARRAY_SIZE(expected_results); ++i) {
-+ if (expected_results[i].msec_to_sleep_before)
-+ msleep(expected_results[i].msec_to_sleep_before);
-+
-+ if (time_is_before_jiffies(loop_start_time +
-+ maximum_jiffies_at_index(i)))
-+ return -ETIMEDOUT;
-+ if (wg_ratelimiter_allow(skb4, &init_net) !=
-+ expected_results[i].result)
-+ return -EXFULL;
-+ ++(*test);
-+
-+ hdr4->saddr = htonl(ntohl(hdr4->saddr) + i + 1);
-+ if (time_is_before_jiffies(loop_start_time +
-+ maximum_jiffies_at_index(i)))
-+ return -ETIMEDOUT;
-+ if (!wg_ratelimiter_allow(skb4, &init_net))
-+ return -EXFULL;
-+ ++(*test);
-+
-+ hdr4->saddr = htonl(ntohl(hdr4->saddr) - i - 1);
-+
-+#if IS_ENABLED(CONFIG_IPV6)
-+ hdr6->saddr.in6_u.u6_addr32[2] = htonl(i);
-+ hdr6->saddr.in6_u.u6_addr32[3] = htonl(i);
-+ if (time_is_before_jiffies(loop_start_time +
-+ maximum_jiffies_at_index(i)))
-+ return -ETIMEDOUT;
-+ if (wg_ratelimiter_allow(skb6, &init_net) !=
-+ expected_results[i].result)
-+ return -EXFULL;
-+ ++(*test);
-+
-+ hdr6->saddr.in6_u.u6_addr32[0] =
-+ htonl(ntohl(hdr6->saddr.in6_u.u6_addr32[0]) + i + 1);
-+ if (time_is_before_jiffies(loop_start_time +
-+ maximum_jiffies_at_index(i)))
-+ return -ETIMEDOUT;
-+ if (!wg_ratelimiter_allow(skb6, &init_net))
-+ return -EXFULL;
-+ ++(*test);
-+
-+ hdr6->saddr.in6_u.u6_addr32[0] =
-+ htonl(ntohl(hdr6->saddr.in6_u.u6_addr32[0]) - i - 1);
-+
-+ if (time_is_before_jiffies(loop_start_time +
-+ maximum_jiffies_at_index(i)))
-+ return -ETIMEDOUT;
-+#endif
-+ }
-+ return 0;
-+}
-+
-+static __init int capacity_test(struct sk_buff *skb4, struct iphdr *hdr4,
-+ int *test)
-+{
-+ int i;
-+
-+ wg_ratelimiter_gc_entries(NULL);
-+ rcu_barrier();
-+
-+ if (atomic_read(&total_entries))
-+ return -EXFULL;
-+ ++(*test);
-+
-+ for (i = 0; i <= max_entries; ++i) {
-+ hdr4->saddr = htonl(i);
-+ if (wg_ratelimiter_allow(skb4, &init_net) != (i != max_entries))
-+ return -EXFULL;
-+ ++(*test);
-+ }
-+ return 0;
-+}
-+
-+bool __init wg_ratelimiter_selftest(void)
-+{
-+ enum { TRIALS_BEFORE_GIVING_UP = 5000 };
-+ bool success = false;
-+ int test = 0, trials;
-+ struct sk_buff *skb4, *skb6;
-+ struct iphdr *hdr4;
-+ struct ipv6hdr *hdr6;
-+
-+ if (IS_ENABLED(CONFIG_KASAN) || IS_ENABLED(CONFIG_UBSAN))
-+ return true;
-+
-+ BUILD_BUG_ON(MSEC_PER_SEC % PACKETS_PER_SECOND != 0);
-+
-+ if (wg_ratelimiter_init())
-+ goto out;
-+ ++test;
-+ if (wg_ratelimiter_init()) {
-+ wg_ratelimiter_uninit();
-+ goto out;
-+ }
-+ ++test;
-+ if (wg_ratelimiter_init()) {
-+ wg_ratelimiter_uninit();
-+ wg_ratelimiter_uninit();
-+ goto out;
-+ }
-+ ++test;
-+
-+ skb4 = alloc_skb(sizeof(struct iphdr), GFP_KERNEL);
-+ if (unlikely(!skb4))
-+ goto err_nofree;
-+ skb4->protocol = htons(ETH_P_IP);
-+ hdr4 = (struct iphdr *)skb_put(skb4, sizeof(*hdr4));
-+ hdr4->saddr = htonl(8182);
-+ skb_reset_network_header(skb4);
-+ ++test;
-+
-+#if IS_ENABLED(CONFIG_IPV6)
-+ skb6 = alloc_skb(sizeof(struct ipv6hdr), GFP_KERNEL);
-+ if (unlikely(!skb6)) {
-+ kfree_skb(skb4);
-+ goto err_nofree;
-+ }
-+ skb6->protocol = htons(ETH_P_IPV6);
-+ hdr6 = (struct ipv6hdr *)skb_put(skb6, sizeof(*hdr6));
-+ hdr6->saddr.in6_u.u6_addr32[0] = htonl(1212);
-+ hdr6->saddr.in6_u.u6_addr32[1] = htonl(289188);
-+ skb_reset_network_header(skb6);
-+ ++test;
-+#endif
-+
-+ for (trials = TRIALS_BEFORE_GIVING_UP;;) {
-+ int test_count = 0, ret;
-+
-+ ret = timings_test(skb4, hdr4, skb6, hdr6, &test_count);
-+ if (ret == -ETIMEDOUT) {
-+ if (!trials--) {
-+ test += test_count;
-+ goto err;
-+ }
-+ msleep(500);
-+ continue;
-+ } else if (ret < 0) {
-+ test += test_count;
-+ goto err;
-+ } else {
-+ test += test_count;
-+ break;
-+ }
-+ }
-+
-+ for (trials = TRIALS_BEFORE_GIVING_UP;;) {
-+ int test_count = 0;
-+
-+ if (capacity_test(skb4, hdr4, &test_count) < 0) {
-+ if (!trials--) {
-+ test += test_count;
-+ goto err;
-+ }
-+ msleep(50);
-+ continue;
-+ }
-+ test += test_count;
-+ break;
-+ }
-+
-+ success = true;
-+
-+err:
-+ kfree_skb(skb4);
-+#if IS_ENABLED(CONFIG_IPV6)
-+ kfree_skb(skb6);
-+#endif
-+err_nofree:
-+ wg_ratelimiter_uninit();
-+ wg_ratelimiter_uninit();
-+ wg_ratelimiter_uninit();
-+ /* Uninit one extra time to check underflow detection. */
-+ wg_ratelimiter_uninit();
-+out:
-+ if (success)
-+ pr_info("ratelimiter self-tests: pass\n");
-+ else
-+ pr_err("ratelimiter self-test %d: FAIL\n", test);
-+
-+ return success;
-+}
-+#endif
---- /dev/null
-+++ b/drivers/net/wireguard/send.c
-@@ -0,0 +1,413 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "queueing.h"
-+#include "timers.h"
-+#include "device.h"
-+#include "peer.h"
-+#include "socket.h"
-+#include "messages.h"
-+#include "cookie.h"
-+
-+#include <linux/uio.h>
-+#include <linux/inetdevice.h>
-+#include <linux/socket.h>
-+#include <net/ip_tunnels.h>
-+#include <net/udp.h>
-+#include <net/sock.h>
-+
-+static void wg_packet_send_handshake_initiation(struct wg_peer *peer)
-+{
-+ struct message_handshake_initiation packet;
-+
-+ if (!wg_birthdate_has_expired(atomic64_read(&peer->last_sent_handshake),
-+ REKEY_TIMEOUT))
-+ return; /* This function is rate limited. */
-+
-+ atomic64_set(&peer->last_sent_handshake, ktime_get_coarse_boottime_ns());
-+ net_dbg_ratelimited("%s: Sending handshake initiation to peer %llu (%pISpfsc)\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+
-+ if (wg_noise_handshake_create_initiation(&packet, &peer->handshake)) {
-+ wg_cookie_add_mac_to_packet(&packet, sizeof(packet), peer);
-+ wg_timers_any_authenticated_packet_traversal(peer);
-+ wg_timers_any_authenticated_packet_sent(peer);
-+ atomic64_set(&peer->last_sent_handshake,
-+ ktime_get_coarse_boottime_ns());
-+ wg_socket_send_buffer_to_peer(peer, &packet, sizeof(packet),
-+ HANDSHAKE_DSCP);
-+ wg_timers_handshake_initiated(peer);
-+ }
-+}
-+
-+void wg_packet_handshake_send_worker(struct work_struct *work)
-+{
-+ struct wg_peer *peer = container_of(work, struct wg_peer,
-+ transmit_handshake_work);
-+
-+ wg_packet_send_handshake_initiation(peer);
-+ wg_peer_put(peer);
-+}
-+
-+void wg_packet_send_queued_handshake_initiation(struct wg_peer *peer,
-+ bool is_retry)
-+{
-+ if (!is_retry)
-+ peer->timer_handshake_attempts = 0;
-+
-+ rcu_read_lock_bh();
-+ /* We check last_sent_handshake here in addition to the actual function
-+ * we're queueing up, so that we don't queue things if not strictly
-+ * necessary:
-+ */
-+ if (!wg_birthdate_has_expired(atomic64_read(&peer->last_sent_handshake),
-+ REKEY_TIMEOUT) ||
-+ unlikely(READ_ONCE(peer->is_dead)))
-+ goto out;
-+
-+ wg_peer_get(peer);
-+ /* Queues up calling packet_send_queued_handshakes(peer), where we do a
-+ * peer_put(peer) after:
-+ */
-+ if (!queue_work(peer->device->handshake_send_wq,
-+ &peer->transmit_handshake_work))
-+ /* If the work was already queued, we want to drop the
-+ * extra reference:
-+ */
-+ wg_peer_put(peer);
-+out:
-+ rcu_read_unlock_bh();
-+}
-+
-+void wg_packet_send_handshake_response(struct wg_peer *peer)
-+{
-+ struct message_handshake_response packet;
-+
-+ atomic64_set(&peer->last_sent_handshake, ktime_get_coarse_boottime_ns());
-+ net_dbg_ratelimited("%s: Sending handshake response to peer %llu (%pISpfsc)\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+
-+ if (wg_noise_handshake_create_response(&packet, &peer->handshake)) {
-+ wg_cookie_add_mac_to_packet(&packet, sizeof(packet), peer);
-+ if (wg_noise_handshake_begin_session(&peer->handshake,
-+ &peer->keypairs)) {
-+ wg_timers_session_derived(peer);
-+ wg_timers_any_authenticated_packet_traversal(peer);
-+ wg_timers_any_authenticated_packet_sent(peer);
-+ atomic64_set(&peer->last_sent_handshake,
-+ ktime_get_coarse_boottime_ns());
-+ wg_socket_send_buffer_to_peer(peer, &packet,
-+ sizeof(packet),
-+ HANDSHAKE_DSCP);
-+ }
-+ }
-+}
-+
-+void wg_packet_send_handshake_cookie(struct wg_device *wg,
-+ struct sk_buff *initiating_skb,
-+ __le32 sender_index)
-+{
-+ struct message_handshake_cookie packet;
-+
-+ net_dbg_skb_ratelimited("%s: Sending cookie response for denied handshake message for %pISpfsc\n",
-+ wg->dev->name, initiating_skb);
-+ wg_cookie_message_create(&packet, initiating_skb, sender_index,
-+ &wg->cookie_checker);
-+ wg_socket_send_buffer_as_reply_to_skb(wg, initiating_skb, &packet,
-+ sizeof(packet));
-+}
-+
-+static void keep_key_fresh(struct wg_peer *peer)
-+{
-+ struct noise_keypair *keypair;
-+ bool send = false;
-+
-+ rcu_read_lock_bh();
-+ keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
-+ if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
-+ (unlikely(atomic64_read(&keypair->sending.counter.counter) >
-+ REKEY_AFTER_MESSAGES) ||
-+ (keypair->i_am_the_initiator &&
-+ unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
-+ REKEY_AFTER_TIME)))))
-+ send = true;
-+ rcu_read_unlock_bh();
-+
-+ if (send)
-+ wg_packet_send_queued_handshake_initiation(peer, false);
-+}
-+
-+static unsigned int calculate_skb_padding(struct sk_buff *skb)
-+{
-+ /* We do this modulo business with the MTU, just in case the networking
-+ * layer gives us a packet that's bigger than the MTU. In that case, we
-+ * wouldn't want the final subtraction to overflow in the case of the
-+ * padded_size being clamped.
-+ */
-+ unsigned int last_unit = skb->len % PACKET_CB(skb)->mtu;
-+ unsigned int padded_size = ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE);
-+
-+ if (padded_size > PACKET_CB(skb)->mtu)
-+ padded_size = PACKET_CB(skb)->mtu;
-+ return padded_size - last_unit;
-+}
-+
-+static bool encrypt_packet(struct sk_buff *skb, struct noise_keypair *keypair)
-+{
-+ unsigned int padding_len, plaintext_len, trailer_len;
-+ struct scatterlist sg[MAX_SKB_FRAGS + 8];
-+ struct message_data *header;
-+ struct sk_buff *trailer;
-+ int num_frags;
-+
-+ /* Calculate lengths. */
-+ padding_len = calculate_skb_padding(skb);
-+ trailer_len = padding_len + noise_encrypted_len(0);
-+ plaintext_len = skb->len + padding_len;
-+
-+ /* Expand data section to have room for padding and auth tag. */
-+ num_frags = skb_cow_data(skb, trailer_len, &trailer);
-+ if (unlikely(num_frags < 0 || num_frags > ARRAY_SIZE(sg)))
-+ return false;
-+
-+ /* Set the padding to zeros, and make sure it and the auth tag are part
-+ * of the skb.
-+ */
-+ memset(skb_tail_pointer(trailer), 0, padding_len);
-+
-+ /* Expand head section to have room for our header and the network
-+ * stack's headers.
-+ */
-+ if (unlikely(skb_cow_head(skb, DATA_PACKET_HEAD_ROOM) < 0))
-+ return false;
-+
-+ /* Finalize checksum calculation for the inner packet, if required. */
-+ if (unlikely(skb->ip_summed == CHECKSUM_PARTIAL &&
-+ skb_checksum_help(skb)))
-+ return false;
-+
-+ /* Only after checksumming can we safely add on the padding at the end
-+ * and the header.
-+ */
-+ skb_set_inner_network_header(skb, 0);
-+ header = (struct message_data *)skb_push(skb, sizeof(*header));
-+ header->header.type = cpu_to_le32(MESSAGE_DATA);
-+ header->key_idx = keypair->remote_index;
-+ header->counter = cpu_to_le64(PACKET_CB(skb)->nonce);
-+ pskb_put(skb, trailer, trailer_len);
-+
-+ /* Now we can encrypt the scattergather segments */
-+ sg_init_table(sg, num_frags);
-+ if (skb_to_sgvec(skb, sg, sizeof(struct message_data),
-+ noise_encrypted_len(plaintext_len)) <= 0)
-+ return false;
-+ return chacha20poly1305_encrypt_sg_inplace(sg, plaintext_len, NULL, 0,
-+ PACKET_CB(skb)->nonce,
-+ keypair->sending.key);
-+}
-+
-+void wg_packet_send_keepalive(struct wg_peer *peer)
-+{
-+ struct sk_buff *skb;
-+
-+ if (skb_queue_empty(&peer->staged_packet_queue)) {
-+ skb = alloc_skb(DATA_PACKET_HEAD_ROOM + MESSAGE_MINIMUM_LENGTH,
-+ GFP_ATOMIC);
-+ if (unlikely(!skb))
-+ return;
-+ skb_reserve(skb, DATA_PACKET_HEAD_ROOM);
-+ skb->dev = peer->device->dev;
-+ PACKET_CB(skb)->mtu = skb->dev->mtu;
-+ skb_queue_tail(&peer->staged_packet_queue, skb);
-+ net_dbg_ratelimited("%s: Sending keepalive packet to peer %llu (%pISpfsc)\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr);
-+ }
-+
-+ wg_packet_send_staged_packets(peer);
-+}
-+
-+static void wg_packet_create_data_done(struct sk_buff *first,
-+ struct wg_peer *peer)
-+{
-+ struct sk_buff *skb, *next;
-+ bool is_keepalive, data_sent = false;
-+
-+ wg_timers_any_authenticated_packet_traversal(peer);
-+ wg_timers_any_authenticated_packet_sent(peer);
-+ skb_list_walk_safe(first, skb, next) {
-+ is_keepalive = skb->len == message_data_len(0);
-+ if (likely(!wg_socket_send_skb_to_peer(peer, skb,
-+ PACKET_CB(skb)->ds) && !is_keepalive))
-+ data_sent = true;
-+ }
-+
-+ if (likely(data_sent))
-+ wg_timers_data_sent(peer);
-+
-+ keep_key_fresh(peer);
-+}
-+
-+void wg_packet_tx_worker(struct work_struct *work)
-+{
-+ struct crypt_queue *queue = container_of(work, struct crypt_queue,
-+ work);
-+ struct noise_keypair *keypair;
-+ enum packet_state state;
-+ struct sk_buff *first;
-+ struct wg_peer *peer;
-+
-+ while ((first = __ptr_ring_peek(&queue->ring)) != NULL &&
-+ (state = atomic_read_acquire(&PACKET_CB(first)->state)) !=
-+ PACKET_STATE_UNCRYPTED) {
-+ __ptr_ring_discard_one(&queue->ring);
-+ peer = PACKET_PEER(first);
-+ keypair = PACKET_CB(first)->keypair;
-+
-+ if (likely(state == PACKET_STATE_CRYPTED))
-+ wg_packet_create_data_done(first, peer);
-+ else
-+ kfree_skb_list(first);
-+
-+ wg_noise_keypair_put(keypair, false);
-+ wg_peer_put(peer);
-+ }
-+}
-+
-+void wg_packet_encrypt_worker(struct work_struct *work)
-+{
-+ struct crypt_queue *queue = container_of(work, struct multicore_worker,
-+ work)->ptr;
-+ struct sk_buff *first, *skb, *next;
-+
-+ while ((first = ptr_ring_consume_bh(&queue->ring)) != NULL) {
-+ enum packet_state state = PACKET_STATE_CRYPTED;
-+
-+ skb_list_walk_safe(first, skb, next) {
-+ if (likely(encrypt_packet(skb,
-+ PACKET_CB(first)->keypair))) {
-+ wg_reset_packet(skb);
-+ } else {
-+ state = PACKET_STATE_DEAD;
-+ break;
-+ }
-+ }
-+ wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first,
-+ state);
-+
-+ }
-+}
-+
-+static void wg_packet_create_data(struct sk_buff *first)
-+{
-+ struct wg_peer *peer = PACKET_PEER(first);
-+ struct wg_device *wg = peer->device;
-+ int ret = -EINVAL;
-+
-+ rcu_read_lock_bh();
-+ if (unlikely(READ_ONCE(peer->is_dead)))
-+ goto err;
-+
-+ ret = wg_queue_enqueue_per_device_and_peer(&wg->encrypt_queue,
-+ &peer->tx_queue, first,
-+ wg->packet_crypt_wq,
-+ &wg->encrypt_queue.last_cpu);
-+ if (unlikely(ret == -EPIPE))
-+ wg_queue_enqueue_per_peer(&peer->tx_queue, first,
-+ PACKET_STATE_DEAD);
-+err:
-+ rcu_read_unlock_bh();
-+ if (likely(!ret || ret == -EPIPE))
-+ return;
-+ wg_noise_keypair_put(PACKET_CB(first)->keypair, false);
-+ wg_peer_put(peer);
-+ kfree_skb_list(first);
-+}
-+
-+void wg_packet_purge_staged_packets(struct wg_peer *peer)
-+{
-+ spin_lock_bh(&peer->staged_packet_queue.lock);
-+ peer->device->dev->stats.tx_dropped += peer->staged_packet_queue.qlen;
-+ __skb_queue_purge(&peer->staged_packet_queue);
-+ spin_unlock_bh(&peer->staged_packet_queue.lock);
-+}
-+
-+void wg_packet_send_staged_packets(struct wg_peer *peer)
-+{
-+ struct noise_symmetric_key *key;
-+ struct noise_keypair *keypair;
-+ struct sk_buff_head packets;
-+ struct sk_buff *skb;
-+
-+ /* Steal the current queue into our local one. */
-+ __skb_queue_head_init(&packets);
-+ spin_lock_bh(&peer->staged_packet_queue.lock);
-+ skb_queue_splice_init(&peer->staged_packet_queue, &packets);
-+ spin_unlock_bh(&peer->staged_packet_queue.lock);
-+ if (unlikely(skb_queue_empty(&packets)))
-+ return;
-+
-+ /* First we make sure we have a valid reference to a valid key. */
-+ rcu_read_lock_bh();
-+ keypair = wg_noise_keypair_get(
-+ rcu_dereference_bh(peer->keypairs.current_keypair));
-+ rcu_read_unlock_bh();
-+ if (unlikely(!keypair))
-+ goto out_nokey;
-+ key = &keypair->sending;
-+ if (unlikely(!READ_ONCE(key->is_valid)))
-+ goto out_nokey;
-+ if (unlikely(wg_birthdate_has_expired(key->birthdate,
-+ REJECT_AFTER_TIME)))
-+ goto out_invalid;
-+
-+ /* After we know we have a somewhat valid key, we now try to assign
-+ * nonces to all of the packets in the queue. If we can't assign nonces
-+ * for all of them, we just consider it a failure and wait for the next
-+ * handshake.
-+ */
-+ skb_queue_walk(&packets, skb) {
-+ /* 0 for no outer TOS: no leak. TODO: at some later point, we
-+ * might consider using flowi->tos as outer instead.
-+ */
-+ PACKET_CB(skb)->ds = ip_tunnel_ecn_encap(0, ip_hdr(skb), skb);
-+ PACKET_CB(skb)->nonce =
-+ atomic64_inc_return(&key->counter.counter) - 1;
-+ if (unlikely(PACKET_CB(skb)->nonce >= REJECT_AFTER_MESSAGES))
-+ goto out_invalid;
-+ }
-+
-+ packets.prev->next = NULL;
-+ wg_peer_get(keypair->entry.peer);
-+ PACKET_CB(packets.next)->keypair = keypair;
-+ wg_packet_create_data(packets.next);
-+ return;
-+
-+out_invalid:
-+ WRITE_ONCE(key->is_valid, false);
-+out_nokey:
-+ wg_noise_keypair_put(keypair, false);
-+
-+ /* We orphan the packets if we're waiting on a handshake, so that they
-+ * don't block a socket's pool.
-+ */
-+ skb_queue_walk(&packets, skb)
-+ skb_orphan(skb);
-+ /* Then we put them back on the top of the queue. We're not too
-+ * concerned about accidentally getting things a little out of order if
-+ * packets are being added really fast, because this queue is for before
-+ * packets can even be sent and it's small anyway.
-+ */
-+ spin_lock_bh(&peer->staged_packet_queue.lock);
-+ skb_queue_splice(&packets, &peer->staged_packet_queue);
-+ spin_unlock_bh(&peer->staged_packet_queue.lock);
-+
-+ /* If we're exiting because there's something wrong with the key, it
-+ * means we should initiate a new handshake.
-+ */
-+ wg_packet_send_queued_handshake_initiation(peer, false);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/socket.c
-@@ -0,0 +1,437 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "device.h"
-+#include "peer.h"
-+#include "socket.h"
-+#include "queueing.h"
-+#include "messages.h"
-+
-+#include <linux/ctype.h>
-+#include <linux/net.h>
-+#include <linux/if_vlan.h>
-+#include <linux/if_ether.h>
-+#include <linux/inetdevice.h>
-+#include <net/udp_tunnel.h>
-+#include <net/ipv6.h>
-+
-+static int send4(struct wg_device *wg, struct sk_buff *skb,
-+ struct endpoint *endpoint, u8 ds, struct dst_cache *cache)
-+{
-+ struct flowi4 fl = {
-+ .saddr = endpoint->src4.s_addr,
-+ .daddr = endpoint->addr4.sin_addr.s_addr,
-+ .fl4_dport = endpoint->addr4.sin_port,
-+ .flowi4_mark = wg->fwmark,
-+ .flowi4_proto = IPPROTO_UDP
-+ };
-+ struct rtable *rt = NULL;
-+ struct sock *sock;
-+ int ret = 0;
-+
-+ skb_mark_not_on_list(skb);
-+ skb->dev = wg->dev;
-+ skb->mark = wg->fwmark;
-+
-+ rcu_read_lock_bh();
-+ sock = rcu_dereference_bh(wg->sock4);
-+
-+ if (unlikely(!sock)) {
-+ ret = -ENONET;
-+ goto err;
-+ }
-+
-+ fl.fl4_sport = inet_sk(sock)->inet_sport;
-+
-+ if (cache)
-+ rt = dst_cache_get_ip4(cache, &fl.saddr);
-+
-+ if (!rt) {
-+ security_sk_classify_flow(sock, flowi4_to_flowi(&fl));
-+ if (unlikely(!inet_confirm_addr(sock_net(sock), NULL, 0,
-+ fl.saddr, RT_SCOPE_HOST))) {
-+ endpoint->src4.s_addr = 0;
-+ *(__force __be32 *)&endpoint->src_if4 = 0;
-+ fl.saddr = 0;
-+ if (cache)
-+ dst_cache_reset(cache);
-+ }
-+ rt = ip_route_output_flow(sock_net(sock), &fl, sock);
-+ if (unlikely(endpoint->src_if4 && ((IS_ERR(rt) &&
-+ PTR_ERR(rt) == -EINVAL) || (!IS_ERR(rt) &&
-+ rt->dst.dev->ifindex != endpoint->src_if4)))) {
-+ endpoint->src4.s_addr = 0;
-+ *(__force __be32 *)&endpoint->src_if4 = 0;
-+ fl.saddr = 0;
-+ if (cache)
-+ dst_cache_reset(cache);
-+ if (!IS_ERR(rt))
-+ ip_rt_put(rt);
-+ rt = ip_route_output_flow(sock_net(sock), &fl, sock);
-+ }
-+ if (unlikely(IS_ERR(rt))) {
-+ ret = PTR_ERR(rt);
-+ net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
-+ wg->dev->name, &endpoint->addr, ret);
-+ goto err;
-+ } else if (unlikely(rt->dst.dev == skb->dev)) {
-+ ip_rt_put(rt);
-+ ret = -ELOOP;
-+ net_dbg_ratelimited("%s: Avoiding routing loop to %pISpfsc\n",
-+ wg->dev->name, &endpoint->addr);
-+ goto err;
-+ }
-+ if (cache)
-+ dst_cache_set_ip4(cache, &rt->dst, fl.saddr);
-+ }
-+
-+ skb->ignore_df = 1;
-+ udp_tunnel_xmit_skb(rt, sock, skb, fl.saddr, fl.daddr, ds,
-+ ip4_dst_hoplimit(&rt->dst), 0, fl.fl4_sport,
-+ fl.fl4_dport, false, false);
-+ goto out;
-+
-+err:
-+ kfree_skb(skb);
-+out:
-+ rcu_read_unlock_bh();
-+ return ret;
-+}
-+
-+static int send6(struct wg_device *wg, struct sk_buff *skb,
-+ struct endpoint *endpoint, u8 ds, struct dst_cache *cache)
-+{
-+#if IS_ENABLED(CONFIG_IPV6)
-+ struct flowi6 fl = {
-+ .saddr = endpoint->src6,
-+ .daddr = endpoint->addr6.sin6_addr,
-+ .fl6_dport = endpoint->addr6.sin6_port,
-+ .flowi6_mark = wg->fwmark,
-+ .flowi6_oif = endpoint->addr6.sin6_scope_id,
-+ .flowi6_proto = IPPROTO_UDP
-+ /* TODO: addr->sin6_flowinfo */
-+ };
-+ struct dst_entry *dst = NULL;
-+ struct sock *sock;
-+ int ret = 0;
-+
-+ skb_mark_not_on_list(skb);
-+ skb->dev = wg->dev;
-+ skb->mark = wg->fwmark;
-+
-+ rcu_read_lock_bh();
-+ sock = rcu_dereference_bh(wg->sock6);
-+
-+ if (unlikely(!sock)) {
-+ ret = -ENONET;
-+ goto err;
-+ }
-+
-+ fl.fl6_sport = inet_sk(sock)->inet_sport;
-+
-+ if (cache)
-+ dst = dst_cache_get_ip6(cache, &fl.saddr);
-+
-+ if (!dst) {
-+ security_sk_classify_flow(sock, flowi6_to_flowi(&fl));
-+ if (unlikely(!ipv6_addr_any(&fl.saddr) &&
-+ !ipv6_chk_addr(sock_net(sock), &fl.saddr, NULL, 0))) {
-+ endpoint->src6 = fl.saddr = in6addr_any;
-+ if (cache)
-+ dst_cache_reset(cache);
-+ }
-+ dst = ipv6_stub->ipv6_dst_lookup_flow(sock_net(sock), sock, &fl,
-+ NULL);
-+ if (unlikely(IS_ERR(dst))) {
-+ ret = PTR_ERR(dst);
-+ net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
-+ wg->dev->name, &endpoint->addr, ret);
-+ goto err;
-+ } else if (unlikely(dst->dev == skb->dev)) {
-+ dst_release(dst);
-+ ret = -ELOOP;
-+ net_dbg_ratelimited("%s: Avoiding routing loop to %pISpfsc\n",
-+ wg->dev->name, &endpoint->addr);
-+ goto err;
-+ }
-+ if (cache)
-+ dst_cache_set_ip6(cache, dst, &fl.saddr);
-+ }
-+
-+ skb->ignore_df = 1;
-+ udp_tunnel6_xmit_skb(dst, sock, skb, skb->dev, &fl.saddr, &fl.daddr, ds,
-+ ip6_dst_hoplimit(dst), 0, fl.fl6_sport,
-+ fl.fl6_dport, false);
-+ goto out;
-+
-+err:
-+ kfree_skb(skb);
-+out:
-+ rcu_read_unlock_bh();
-+ return ret;
-+#else
-+ return -EAFNOSUPPORT;
-+#endif
-+}
-+
-+int wg_socket_send_skb_to_peer(struct wg_peer *peer, struct sk_buff *skb, u8 ds)
-+{
-+ size_t skb_len = skb->len;
-+ int ret = -EAFNOSUPPORT;
-+
-+ read_lock_bh(&peer->endpoint_lock);
-+ if (peer->endpoint.addr.sa_family == AF_INET)
-+ ret = send4(peer->device, skb, &peer->endpoint, ds,
-+ &peer->endpoint_cache);
-+ else if (peer->endpoint.addr.sa_family == AF_INET6)
-+ ret = send6(peer->device, skb, &peer->endpoint, ds,
-+ &peer->endpoint_cache);
-+ else
-+ dev_kfree_skb(skb);
-+ if (likely(!ret))
-+ peer->tx_bytes += skb_len;
-+ read_unlock_bh(&peer->endpoint_lock);
-+
-+ return ret;
-+}
-+
-+int wg_socket_send_buffer_to_peer(struct wg_peer *peer, void *buffer,
-+ size_t len, u8 ds)
-+{
-+ struct sk_buff *skb = alloc_skb(len + SKB_HEADER_LEN, GFP_ATOMIC);
-+
-+ if (unlikely(!skb))
-+ return -ENOMEM;
-+
-+ skb_reserve(skb, SKB_HEADER_LEN);
-+ skb_set_inner_network_header(skb, 0);
-+ skb_put_data(skb, buffer, len);
-+ return wg_socket_send_skb_to_peer(peer, skb, ds);
-+}
-+
-+int wg_socket_send_buffer_as_reply_to_skb(struct wg_device *wg,
-+ struct sk_buff *in_skb, void *buffer,
-+ size_t len)
-+{
-+ int ret = 0;
-+ struct sk_buff *skb;
-+ struct endpoint endpoint;
-+
-+ if (unlikely(!in_skb))
-+ return -EINVAL;
-+ ret = wg_socket_endpoint_from_skb(&endpoint, in_skb);
-+ if (unlikely(ret < 0))
-+ return ret;
-+
-+ skb = alloc_skb(len + SKB_HEADER_LEN, GFP_ATOMIC);
-+ if (unlikely(!skb))
-+ return -ENOMEM;
-+ skb_reserve(skb, SKB_HEADER_LEN);
-+ skb_set_inner_network_header(skb, 0);
-+ skb_put_data(skb, buffer, len);
-+
-+ if (endpoint.addr.sa_family == AF_INET)
-+ ret = send4(wg, skb, &endpoint, 0, NULL);
-+ else if (endpoint.addr.sa_family == AF_INET6)
-+ ret = send6(wg, skb, &endpoint, 0, NULL);
-+ /* No other possibilities if the endpoint is valid, which it is,
-+ * as we checked above.
-+ */
-+
-+ return ret;
-+}
-+
-+int wg_socket_endpoint_from_skb(struct endpoint *endpoint,
-+ const struct sk_buff *skb)
-+{
-+ memset(endpoint, 0, sizeof(*endpoint));
-+ if (skb->protocol == htons(ETH_P_IP)) {
-+ endpoint->addr4.sin_family = AF_INET;
-+ endpoint->addr4.sin_port = udp_hdr(skb)->source;
-+ endpoint->addr4.sin_addr.s_addr = ip_hdr(skb)->saddr;
-+ endpoint->src4.s_addr = ip_hdr(skb)->daddr;
-+ endpoint->src_if4 = skb->skb_iif;
-+ } else if (skb->protocol == htons(ETH_P_IPV6)) {
-+ endpoint->addr6.sin6_family = AF_INET6;
-+ endpoint->addr6.sin6_port = udp_hdr(skb)->source;
-+ endpoint->addr6.sin6_addr = ipv6_hdr(skb)->saddr;
-+ endpoint->addr6.sin6_scope_id = ipv6_iface_scope_id(
-+ &ipv6_hdr(skb)->saddr, skb->skb_iif);
-+ endpoint->src6 = ipv6_hdr(skb)->daddr;
-+ } else {
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static bool endpoint_eq(const struct endpoint *a, const struct endpoint *b)
-+{
-+ return (a->addr.sa_family == AF_INET && b->addr.sa_family == AF_INET &&
-+ a->addr4.sin_port == b->addr4.sin_port &&
-+ a->addr4.sin_addr.s_addr == b->addr4.sin_addr.s_addr &&
-+ a->src4.s_addr == b->src4.s_addr && a->src_if4 == b->src_if4) ||
-+ (a->addr.sa_family == AF_INET6 &&
-+ b->addr.sa_family == AF_INET6 &&
-+ a->addr6.sin6_port == b->addr6.sin6_port &&
-+ ipv6_addr_equal(&a->addr6.sin6_addr, &b->addr6.sin6_addr) &&
-+ a->addr6.sin6_scope_id == b->addr6.sin6_scope_id &&
-+ ipv6_addr_equal(&a->src6, &b->src6)) ||
-+ unlikely(!a->addr.sa_family && !b->addr.sa_family);
-+}
-+
-+void wg_socket_set_peer_endpoint(struct wg_peer *peer,
-+ const struct endpoint *endpoint)
-+{
-+ /* First we check unlocked, in order to optimize, since it's pretty rare
-+ * that an endpoint will change. If we happen to be mid-write, and two
-+ * CPUs wind up writing the same thing or something slightly different,
-+ * it doesn't really matter much either.
-+ */
-+ if (endpoint_eq(endpoint, &peer->endpoint))
-+ return;
-+ write_lock_bh(&peer->endpoint_lock);
-+ if (endpoint->addr.sa_family == AF_INET) {
-+ peer->endpoint.addr4 = endpoint->addr4;
-+ peer->endpoint.src4 = endpoint->src4;
-+ peer->endpoint.src_if4 = endpoint->src_if4;
-+ } else if (endpoint->addr.sa_family == AF_INET6) {
-+ peer->endpoint.addr6 = endpoint->addr6;
-+ peer->endpoint.src6 = endpoint->src6;
-+ } else {
-+ goto out;
-+ }
-+ dst_cache_reset(&peer->endpoint_cache);
-+out:
-+ write_unlock_bh(&peer->endpoint_lock);
-+}
-+
-+void wg_socket_set_peer_endpoint_from_skb(struct wg_peer *peer,
-+ const struct sk_buff *skb)
-+{
-+ struct endpoint endpoint;
-+
-+ if (!wg_socket_endpoint_from_skb(&endpoint, skb))
-+ wg_socket_set_peer_endpoint(peer, &endpoint);
-+}
-+
-+void wg_socket_clear_peer_endpoint_src(struct wg_peer *peer)
-+{
-+ write_lock_bh(&peer->endpoint_lock);
-+ memset(&peer->endpoint.src6, 0, sizeof(peer->endpoint.src6));
-+ dst_cache_reset(&peer->endpoint_cache);
-+ write_unlock_bh(&peer->endpoint_lock);
-+}
-+
-+static int wg_receive(struct sock *sk, struct sk_buff *skb)
-+{
-+ struct wg_device *wg;
-+
-+ if (unlikely(!sk))
-+ goto err;
-+ wg = sk->sk_user_data;
-+ if (unlikely(!wg))
-+ goto err;
-+ wg_packet_receive(wg, skb);
-+ return 0;
-+
-+err:
-+ kfree_skb(skb);
-+ return 0;
-+}
-+
-+static void sock_free(struct sock *sock)
-+{
-+ if (unlikely(!sock))
-+ return;
-+ sk_clear_memalloc(sock);
-+ udp_tunnel_sock_release(sock->sk_socket);
-+}
-+
-+static void set_sock_opts(struct socket *sock)
-+{
-+ sock->sk->sk_allocation = GFP_ATOMIC;
-+ sock->sk->sk_sndbuf = INT_MAX;
-+ sk_set_memalloc(sock->sk);
-+}
-+
-+int wg_socket_init(struct wg_device *wg, u16 port)
-+{
-+ int ret;
-+ struct udp_tunnel_sock_cfg cfg = {
-+ .sk_user_data = wg,
-+ .encap_type = 1,
-+ .encap_rcv = wg_receive
-+ };
-+ struct socket *new4 = NULL, *new6 = NULL;
-+ struct udp_port_cfg port4 = {
-+ .family = AF_INET,
-+ .local_ip.s_addr = htonl(INADDR_ANY),
-+ .local_udp_port = htons(port),
-+ .use_udp_checksums = true
-+ };
-+#if IS_ENABLED(CONFIG_IPV6)
-+ int retries = 0;
-+ struct udp_port_cfg port6 = {
-+ .family = AF_INET6,
-+ .local_ip6 = IN6ADDR_ANY_INIT,
-+ .use_udp6_tx_checksums = true,
-+ .use_udp6_rx_checksums = true,
-+ .ipv6_v6only = true
-+ };
-+#endif
-+
-+#if IS_ENABLED(CONFIG_IPV6)
-+retry:
-+#endif
-+
-+ ret = udp_sock_create(wg->creating_net, &port4, &new4);
-+ if (ret < 0) {
-+ pr_err("%s: Could not create IPv4 socket\n", wg->dev->name);
-+ return ret;
-+ }
-+ set_sock_opts(new4);
-+ setup_udp_tunnel_sock(wg->creating_net, new4, &cfg);
-+
-+#if IS_ENABLED(CONFIG_IPV6)
-+ if (ipv6_mod_enabled()) {
-+ port6.local_udp_port = inet_sk(new4->sk)->inet_sport;
-+ ret = udp_sock_create(wg->creating_net, &port6, &new6);
-+ if (ret < 0) {
-+ udp_tunnel_sock_release(new4);
-+ if (ret == -EADDRINUSE && !port && retries++ < 100)
-+ goto retry;
-+ pr_err("%s: Could not create IPv6 socket\n",
-+ wg->dev->name);
-+ return ret;
-+ }
-+ set_sock_opts(new6);
-+ setup_udp_tunnel_sock(wg->creating_net, new6, &cfg);
-+ }
-+#endif
-+
-+ wg_socket_reinit(wg, new4->sk, new6 ? new6->sk : NULL);
-+ return 0;
-+}
-+
-+void wg_socket_reinit(struct wg_device *wg, struct sock *new4,
-+ struct sock *new6)
-+{
-+ struct sock *old4, *old6;
-+
-+ mutex_lock(&wg->socket_update_lock);
-+ old4 = rcu_dereference_protected(wg->sock4,
-+ lockdep_is_held(&wg->socket_update_lock));
-+ old6 = rcu_dereference_protected(wg->sock6,
-+ lockdep_is_held(&wg->socket_update_lock));
-+ rcu_assign_pointer(wg->sock4, new4);
-+ rcu_assign_pointer(wg->sock6, new6);
-+ if (new4)
-+ wg->incoming_port = ntohs(inet_sk(new4)->inet_sport);
-+ mutex_unlock(&wg->socket_update_lock);
-+ synchronize_rcu();
-+ synchronize_net();
-+ sock_free(old4);
-+ sock_free(old6);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/socket.h
-@@ -0,0 +1,44 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_SOCKET_H
-+#define _WG_SOCKET_H
-+
-+#include <linux/netdevice.h>
-+#include <linux/udp.h>
-+#include <linux/if_vlan.h>
-+#include <linux/if_ether.h>
-+
-+int wg_socket_init(struct wg_device *wg, u16 port);
-+void wg_socket_reinit(struct wg_device *wg, struct sock *new4,
-+ struct sock *new6);
-+int wg_socket_send_buffer_to_peer(struct wg_peer *peer, void *data,
-+ size_t len, u8 ds);
-+int wg_socket_send_skb_to_peer(struct wg_peer *peer, struct sk_buff *skb,
-+ u8 ds);
-+int wg_socket_send_buffer_as_reply_to_skb(struct wg_device *wg,
-+ struct sk_buff *in_skb,
-+ void *out_buffer, size_t len);
-+
-+int wg_socket_endpoint_from_skb(struct endpoint *endpoint,
-+ const struct sk_buff *skb);
-+void wg_socket_set_peer_endpoint(struct wg_peer *peer,
-+ const struct endpoint *endpoint);
-+void wg_socket_set_peer_endpoint_from_skb(struct wg_peer *peer,
-+ const struct sk_buff *skb);
-+void wg_socket_clear_peer_endpoint_src(struct wg_peer *peer);
-+
-+#if defined(CONFIG_DYNAMIC_DEBUG) || defined(DEBUG)
-+#define net_dbg_skb_ratelimited(fmt, dev, skb, ...) do { \
-+ struct endpoint __endpoint; \
-+ wg_socket_endpoint_from_skb(&__endpoint, skb); \
-+ net_dbg_ratelimited(fmt, dev, &__endpoint.addr, \
-+ ##__VA_ARGS__); \
-+ } while (0)
-+#else
-+#define net_dbg_skb_ratelimited(fmt, skb, ...)
-+#endif
-+
-+#endif /* _WG_SOCKET_H */
---- /dev/null
-+++ b/drivers/net/wireguard/timers.c
-@@ -0,0 +1,243 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#include "timers.h"
-+#include "device.h"
-+#include "peer.h"
-+#include "queueing.h"
-+#include "socket.h"
-+
-+/*
-+ * - Timer for retransmitting the handshake if we don't hear back after
-+ * `REKEY_TIMEOUT + jitter` ms.
-+ *
-+ * - Timer for sending empty packet if we have received a packet but after have
-+ * not sent one for `KEEPALIVE_TIMEOUT` ms.
-+ *
-+ * - Timer for initiating new handshake if we have sent a packet but after have
-+ * not received one (even empty) for `(KEEPALIVE_TIMEOUT + REKEY_TIMEOUT) +
-+ * jitter` ms.
-+ *
-+ * - Timer for zeroing out all ephemeral keys after `(REJECT_AFTER_TIME * 3)` ms
-+ * if no new keys have been received.
-+ *
-+ * - Timer for, if enabled, sending an empty authenticated packet every user-
-+ * specified seconds.
-+ */
-+
-+static inline void mod_peer_timer(struct wg_peer *peer,
-+ struct timer_list *timer,
-+ unsigned long expires)
-+{
-+ rcu_read_lock_bh();
-+ if (likely(netif_running(peer->device->dev) &&
-+ !READ_ONCE(peer->is_dead)))
-+ mod_timer(timer, expires);
-+ rcu_read_unlock_bh();
-+}
-+
-+static void wg_expired_retransmit_handshake(struct timer_list *timer)
-+{
-+ struct wg_peer *peer = from_timer(peer, timer,
-+ timer_retransmit_handshake);
-+
-+ if (peer->timer_handshake_attempts > MAX_TIMER_HANDSHAKES) {
-+ pr_debug("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d attempts, giving up\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr, MAX_TIMER_HANDSHAKES + 2);
-+
-+ del_timer(&peer->timer_send_keepalive);
-+ /* We drop all packets without a keypair and don't try again,
-+ * if we try unsuccessfully for too long to make a handshake.
-+ */
-+ wg_packet_purge_staged_packets(peer);
-+
-+ /* We set a timer for destroying any residue that might be left
-+ * of a partial exchange.
-+ */
-+ if (!timer_pending(&peer->timer_zero_key_material))
-+ mod_peer_timer(peer, &peer->timer_zero_key_material,
-+ jiffies + REJECT_AFTER_TIME * 3 * HZ);
-+ } else {
-+ ++peer->timer_handshake_attempts;
-+ pr_debug("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d seconds, retrying (try %d)\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr, REKEY_TIMEOUT,
-+ peer->timer_handshake_attempts + 1);
-+
-+ /* We clear the endpoint address src address, in case this is
-+ * the cause of trouble.
-+ */
-+ wg_socket_clear_peer_endpoint_src(peer);
-+
-+ wg_packet_send_queued_handshake_initiation(peer, true);
-+ }
-+}
-+
-+static void wg_expired_send_keepalive(struct timer_list *timer)
-+{
-+ struct wg_peer *peer = from_timer(peer, timer, timer_send_keepalive);
-+
-+ wg_packet_send_keepalive(peer);
-+ if (peer->timer_need_another_keepalive) {
-+ peer->timer_need_another_keepalive = false;
-+ mod_peer_timer(peer, &peer->timer_send_keepalive,
-+ jiffies + KEEPALIVE_TIMEOUT * HZ);
-+ }
-+}
-+
-+static void wg_expired_new_handshake(struct timer_list *timer)
-+{
-+ struct wg_peer *peer = from_timer(peer, timer, timer_new_handshake);
-+
-+ pr_debug("%s: Retrying handshake with peer %llu (%pISpfsc) because we stopped hearing back after %d seconds\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr, KEEPALIVE_TIMEOUT + REKEY_TIMEOUT);
-+ /* We clear the endpoint address src address, in case this is the cause
-+ * of trouble.
-+ */
-+ wg_socket_clear_peer_endpoint_src(peer);
-+ wg_packet_send_queued_handshake_initiation(peer, false);
-+}
-+
-+static void wg_expired_zero_key_material(struct timer_list *timer)
-+{
-+ struct wg_peer *peer = from_timer(peer, timer, timer_zero_key_material);
-+
-+ rcu_read_lock_bh();
-+ if (!READ_ONCE(peer->is_dead)) {
-+ wg_peer_get(peer);
-+ if (!queue_work(peer->device->handshake_send_wq,
-+ &peer->clear_peer_work))
-+ /* If the work was already on the queue, we want to drop
-+ * the extra reference.
-+ */
-+ wg_peer_put(peer);
-+ }
-+ rcu_read_unlock_bh();
-+}
-+
-+static void wg_queued_expired_zero_key_material(struct work_struct *work)
-+{
-+ struct wg_peer *peer = container_of(work, struct wg_peer,
-+ clear_peer_work);
-+
-+ pr_debug("%s: Zeroing out all keys for peer %llu (%pISpfsc), since we haven't received a new one in %d seconds\n",
-+ peer->device->dev->name, peer->internal_id,
-+ &peer->endpoint.addr, REJECT_AFTER_TIME * 3);
-+ wg_noise_handshake_clear(&peer->handshake);
-+ wg_noise_keypairs_clear(&peer->keypairs);
-+ wg_peer_put(peer);
-+}
-+
-+static void wg_expired_send_persistent_keepalive(struct timer_list *timer)
-+{
-+ struct wg_peer *peer = from_timer(peer, timer,
-+ timer_persistent_keepalive);
-+
-+ if (likely(peer->persistent_keepalive_interval))
-+ wg_packet_send_keepalive(peer);
-+}
-+
-+/* Should be called after an authenticated data packet is sent. */
-+void wg_timers_data_sent(struct wg_peer *peer)
-+{
-+ if (!timer_pending(&peer->timer_new_handshake))
-+ mod_peer_timer(peer, &peer->timer_new_handshake,
-+ jiffies + (KEEPALIVE_TIMEOUT + REKEY_TIMEOUT) * HZ +
-+ prandom_u32_max(REKEY_TIMEOUT_JITTER_MAX_JIFFIES));
-+}
-+
-+/* Should be called after an authenticated data packet is received. */
-+void wg_timers_data_received(struct wg_peer *peer)
-+{
-+ if (likely(netif_running(peer->device->dev))) {
-+ if (!timer_pending(&peer->timer_send_keepalive))
-+ mod_peer_timer(peer, &peer->timer_send_keepalive,
-+ jiffies + KEEPALIVE_TIMEOUT * HZ);
-+ else
-+ peer->timer_need_another_keepalive = true;
-+ }
-+}
-+
-+/* Should be called after any type of authenticated packet is sent, whether
-+ * keepalive, data, or handshake.
-+ */
-+void wg_timers_any_authenticated_packet_sent(struct wg_peer *peer)
-+{
-+ del_timer(&peer->timer_send_keepalive);
-+}
-+
-+/* Should be called after any type of authenticated packet is received, whether
-+ * keepalive, data, or handshake.
-+ */
-+void wg_timers_any_authenticated_packet_received(struct wg_peer *peer)
-+{
-+ del_timer(&peer->timer_new_handshake);
-+}
-+
-+/* Should be called after a handshake initiation message is sent. */
-+void wg_timers_handshake_initiated(struct wg_peer *peer)
-+{
-+ mod_peer_timer(peer, &peer->timer_retransmit_handshake,
-+ jiffies + REKEY_TIMEOUT * HZ +
-+ prandom_u32_max(REKEY_TIMEOUT_JITTER_MAX_JIFFIES));
-+}
-+
-+/* Should be called after a handshake response message is received and processed
-+ * or when getting key confirmation via the first data message.
-+ */
-+void wg_timers_handshake_complete(struct wg_peer *peer)
-+{
-+ del_timer(&peer->timer_retransmit_handshake);
-+ peer->timer_handshake_attempts = 0;
-+ peer->sent_lastminute_handshake = false;
-+ ktime_get_real_ts64(&peer->walltime_last_handshake);
-+}
-+
-+/* Should be called after an ephemeral key is created, which is before sending a
-+ * handshake response or after receiving a handshake response.
-+ */
-+void wg_timers_session_derived(struct wg_peer *peer)
-+{
-+ mod_peer_timer(peer, &peer->timer_zero_key_material,
-+ jiffies + REJECT_AFTER_TIME * 3 * HZ);
-+}
-+
-+/* Should be called before a packet with authentication, whether
-+ * keepalive, data, or handshakem is sent, or after one is received.
-+ */
-+void wg_timers_any_authenticated_packet_traversal(struct wg_peer *peer)
-+{
-+ if (peer->persistent_keepalive_interval)
-+ mod_peer_timer(peer, &peer->timer_persistent_keepalive,
-+ jiffies + peer->persistent_keepalive_interval * HZ);
-+}
-+
-+void wg_timers_init(struct wg_peer *peer)
-+{
-+ timer_setup(&peer->timer_retransmit_handshake,
-+ wg_expired_retransmit_handshake, 0);
-+ timer_setup(&peer->timer_send_keepalive, wg_expired_send_keepalive, 0);
-+ timer_setup(&peer->timer_new_handshake, wg_expired_new_handshake, 0);
-+ timer_setup(&peer->timer_zero_key_material,
-+ wg_expired_zero_key_material, 0);
-+ timer_setup(&peer->timer_persistent_keepalive,
-+ wg_expired_send_persistent_keepalive, 0);
-+ INIT_WORK(&peer->clear_peer_work, wg_queued_expired_zero_key_material);
-+ peer->timer_handshake_attempts = 0;
-+ peer->sent_lastminute_handshake = false;
-+ peer->timer_need_another_keepalive = false;
-+}
-+
-+void wg_timers_stop(struct wg_peer *peer)
-+{
-+ del_timer_sync(&peer->timer_retransmit_handshake);
-+ del_timer_sync(&peer->timer_send_keepalive);
-+ del_timer_sync(&peer->timer_new_handshake);
-+ del_timer_sync(&peer->timer_zero_key_material);
-+ del_timer_sync(&peer->timer_persistent_keepalive);
-+ flush_work(&peer->clear_peer_work);
-+}
---- /dev/null
-+++ b/drivers/net/wireguard/timers.h
-@@ -0,0 +1,31 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#ifndef _WG_TIMERS_H
-+#define _WG_TIMERS_H
-+
-+#include <linux/ktime.h>
-+
-+struct wg_peer;
-+
-+void wg_timers_init(struct wg_peer *peer);
-+void wg_timers_stop(struct wg_peer *peer);
-+void wg_timers_data_sent(struct wg_peer *peer);
-+void wg_timers_data_received(struct wg_peer *peer);
-+void wg_timers_any_authenticated_packet_sent(struct wg_peer *peer);
-+void wg_timers_any_authenticated_packet_received(struct wg_peer *peer);
-+void wg_timers_handshake_initiated(struct wg_peer *peer);
-+void wg_timers_handshake_complete(struct wg_peer *peer);
-+void wg_timers_session_derived(struct wg_peer *peer);
-+void wg_timers_any_authenticated_packet_traversal(struct wg_peer *peer);
-+
-+static inline bool wg_birthdate_has_expired(u64 birthday_nanoseconds,
-+ u64 expiration_seconds)
-+{
-+ return (s64)(birthday_nanoseconds + expiration_seconds * NSEC_PER_SEC)
-+ <= (s64)ktime_get_coarse_boottime_ns();
-+}
-+
-+#endif /* _WG_TIMERS_H */
---- /dev/null
-+++ b/drivers/net/wireguard/version.h
-@@ -0,0 +1 @@
-+#define WIREGUARD_VERSION "1.0.0"
---- /dev/null
-+++ b/include/uapi/linux/wireguard.h
-@@ -0,0 +1,196 @@
-+/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ *
-+ * Documentation
-+ * =============
-+ *
-+ * The below enums and macros are for interfacing with WireGuard, using generic
-+ * netlink, with family WG_GENL_NAME and version WG_GENL_VERSION. It defines two
-+ * methods: get and set. Note that while they share many common attributes,
-+ * these two functions actually accept a slightly different set of inputs and
-+ * outputs.
-+ *
-+ * WG_CMD_GET_DEVICE
-+ * -----------------
-+ *
-+ * May only be called via NLM_F_REQUEST | NLM_F_DUMP. The command should contain
-+ * one but not both of:
-+ *
-+ * WGDEVICE_A_IFINDEX: NLA_U32
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ *
-+ * The kernel will then return several messages (NLM_F_MULTI) containing the
-+ * following tree of nested items:
-+ *
-+ * WGDEVICE_A_IFINDEX: NLA_U32
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ * WGDEVICE_A_PRIVATE_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
-+ * WGDEVICE_A_PUBLIC_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
-+ * WGDEVICE_A_LISTEN_PORT: NLA_U16
-+ * WGDEVICE_A_FWMARK: NLA_U32
-+ * WGDEVICE_A_PEERS: NLA_NESTED
-+ * 0: NLA_NESTED
-+ * WGPEER_A_PUBLIC_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
-+ * WGPEER_A_PRESHARED_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
-+ * WGPEER_A_ENDPOINT: NLA_MIN_LEN(struct sockaddr), struct sockaddr_in or struct sockaddr_in6
-+ * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16
-+ * WGPEER_A_LAST_HANDSHAKE_TIME: NLA_EXACT_LEN, struct __kernel_timespec
-+ * WGPEER_A_RX_BYTES: NLA_U64
-+ * WGPEER_A_TX_BYTES: NLA_U64
-+ * WGPEER_A_ALLOWEDIPS: NLA_NESTED
-+ * 0: NLA_NESTED
-+ * WGALLOWEDIP_A_FAMILY: NLA_U16
-+ * WGALLOWEDIP_A_IPADDR: NLA_MIN_LEN(struct in_addr), struct in_addr or struct in6_addr
-+ * WGALLOWEDIP_A_CIDR_MASK: NLA_U8
-+ * 0: NLA_NESTED
-+ * ...
-+ * 0: NLA_NESTED
-+ * ...
-+ * ...
-+ * WGPEER_A_PROTOCOL_VERSION: NLA_U32
-+ * 0: NLA_NESTED
-+ * ...
-+ * ...
-+ *
-+ * It is possible that all of the allowed IPs of a single peer will not
-+ * fit within a single netlink message. In that case, the same peer will
-+ * be written in the following message, except it will only contain
-+ * WGPEER_A_PUBLIC_KEY and WGPEER_A_ALLOWEDIPS. This may occur several
-+ * times in a row for the same peer. It is then up to the receiver to
-+ * coalesce adjacent peers. Likewise, it is possible that all peers will
-+ * not fit within a single message. So, subsequent peers will be sent
-+ * in following messages, except those will only contain WGDEVICE_A_IFNAME
-+ * and WGDEVICE_A_PEERS. It is then up to the receiver to coalesce these
-+ * messages to form the complete list of peers.
-+ *
-+ * Since this is an NLA_F_DUMP command, the final message will always be
-+ * NLMSG_DONE, even if an error occurs. However, this NLMSG_DONE message
-+ * contains an integer error code. It is either zero or a negative error
-+ * code corresponding to the errno.
-+ *
-+ * WG_CMD_SET_DEVICE
-+ * -----------------
-+ *
-+ * May only be called via NLM_F_REQUEST. The command should contain the
-+ * following tree of nested items, containing one but not both of
-+ * WGDEVICE_A_IFINDEX and WGDEVICE_A_IFNAME:
-+ *
-+ * WGDEVICE_A_IFINDEX: NLA_U32
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ * WGDEVICE_A_FLAGS: NLA_U32, 0 or WGDEVICE_F_REPLACE_PEERS if all current
-+ * peers should be removed prior to adding the list below.
-+ * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN, all zeros to remove
-+ * WGDEVICE_A_LISTEN_PORT: NLA_U16, 0 to choose randomly
-+ * WGDEVICE_A_FWMARK: NLA_U32, 0 to disable
-+ * WGDEVICE_A_PEERS: NLA_NESTED
-+ * 0: NLA_NESTED
-+ * WGPEER_A_PUBLIC_KEY: len WG_KEY_LEN
-+ * WGPEER_A_FLAGS: NLA_U32, 0 and/or WGPEER_F_REMOVE_ME if the
-+ * specified peer should not exist at the end of the
-+ * operation, rather than added/updated and/or
-+ * WGPEER_F_REPLACE_ALLOWEDIPS if all current allowed
-+ * IPs of this peer should be removed prior to adding
-+ * the list below and/or WGPEER_F_UPDATE_ONLY if the
-+ * peer should only be set if it already exists.
-+ * WGPEER_A_PRESHARED_KEY: len WG_KEY_LEN, all zeros to remove
-+ * WGPEER_A_ENDPOINT: struct sockaddr_in or struct sockaddr_in6
-+ * WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL: NLA_U16, 0 to disable
-+ * WGPEER_A_ALLOWEDIPS: NLA_NESTED
-+ * 0: NLA_NESTED
-+ * WGALLOWEDIP_A_FAMILY: NLA_U16
-+ * WGALLOWEDIP_A_IPADDR: struct in_addr or struct in6_addr
-+ * WGALLOWEDIP_A_CIDR_MASK: NLA_U8
-+ * 0: NLA_NESTED
-+ * ...
-+ * 0: NLA_NESTED
-+ * ...
-+ * ...
-+ * WGPEER_A_PROTOCOL_VERSION: NLA_U32, should not be set or used at
-+ * all by most users of this API, as the
-+ * most recent protocol will be used when
-+ * this is unset. Otherwise, must be set
-+ * to 1.
-+ * 0: NLA_NESTED
-+ * ...
-+ * ...
-+ *
-+ * It is possible that the amount of configuration data exceeds that of
-+ * the maximum message length accepted by the kernel. In that case, several
-+ * messages should be sent one after another, with each successive one
-+ * filling in information not contained in the prior. Note that if
-+ * WGDEVICE_F_REPLACE_PEERS is specified in the first message, it probably
-+ * should not be specified in fragments that come after, so that the list
-+ * of peers is only cleared the first time but appened after. Likewise for
-+ * peers, if WGPEER_F_REPLACE_ALLOWEDIPS is specified in the first message
-+ * of a peer, it likely should not be specified in subsequent fragments.
-+ *
-+ * If an error occurs, NLMSG_ERROR will reply containing an errno.
-+ */
-+
-+#ifndef _WG_UAPI_WIREGUARD_H
-+#define _WG_UAPI_WIREGUARD_H
-+
-+#define WG_GENL_NAME "wireguard"
-+#define WG_GENL_VERSION 1
-+
-+#define WG_KEY_LEN 32
-+
-+enum wg_cmd {
-+ WG_CMD_GET_DEVICE,
-+ WG_CMD_SET_DEVICE,
-+ __WG_CMD_MAX
-+};
-+#define WG_CMD_MAX (__WG_CMD_MAX - 1)
-+
-+enum wgdevice_flag {
-+ WGDEVICE_F_REPLACE_PEERS = 1U << 0,
-+ __WGDEVICE_F_ALL = WGDEVICE_F_REPLACE_PEERS
-+};
-+enum wgdevice_attribute {
-+ WGDEVICE_A_UNSPEC,
-+ WGDEVICE_A_IFINDEX,
-+ WGDEVICE_A_IFNAME,
-+ WGDEVICE_A_PRIVATE_KEY,
-+ WGDEVICE_A_PUBLIC_KEY,
-+ WGDEVICE_A_FLAGS,
-+ WGDEVICE_A_LISTEN_PORT,
-+ WGDEVICE_A_FWMARK,
-+ WGDEVICE_A_PEERS,
-+ __WGDEVICE_A_LAST
-+};
-+#define WGDEVICE_A_MAX (__WGDEVICE_A_LAST - 1)
-+
-+enum wgpeer_flag {
-+ WGPEER_F_REMOVE_ME = 1U << 0,
-+ WGPEER_F_REPLACE_ALLOWEDIPS = 1U << 1,
-+ WGPEER_F_UPDATE_ONLY = 1U << 2,
-+ __WGPEER_F_ALL = WGPEER_F_REMOVE_ME | WGPEER_F_REPLACE_ALLOWEDIPS |
-+ WGPEER_F_UPDATE_ONLY
-+};
-+enum wgpeer_attribute {
-+ WGPEER_A_UNSPEC,
-+ WGPEER_A_PUBLIC_KEY,
-+ WGPEER_A_PRESHARED_KEY,
-+ WGPEER_A_FLAGS,
-+ WGPEER_A_ENDPOINT,
-+ WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL,
-+ WGPEER_A_LAST_HANDSHAKE_TIME,
-+ WGPEER_A_RX_BYTES,
-+ WGPEER_A_TX_BYTES,
-+ WGPEER_A_ALLOWEDIPS,
-+ WGPEER_A_PROTOCOL_VERSION,
-+ __WGPEER_A_LAST
-+};
-+#define WGPEER_A_MAX (__WGPEER_A_LAST - 1)
-+
-+enum wgallowedip_attribute {
-+ WGALLOWEDIP_A_UNSPEC,
-+ WGALLOWEDIP_A_FAMILY,
-+ WGALLOWEDIP_A_IPADDR,
-+ WGALLOWEDIP_A_CIDR_MASK,
-+ __WGALLOWEDIP_A_LAST
-+};
-+#define WGALLOWEDIP_A_MAX (__WGALLOWEDIP_A_LAST - 1)
-+
-+#endif /* _WG_UAPI_WIREGUARD_H */
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -0,0 +1,537 @@
-+#!/bin/bash
-+# SPDX-License-Identifier: GPL-2.0
-+#
-+# Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+#
-+# This script tests the below topology:
-+#
-+# ┌─────────────────────┐ ┌──────────────────────────────────┐ ┌─────────────────────┐
-+# │ $ns1 namespace │ │ $ns0 namespace │ │ $ns2 namespace │
-+# │ │ │ │ │ │
-+# │┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐│
-+# ││ wg0 │───────────┼───┼────────────│ lo │────────────┼───┼───────────│ wg0 ││
-+# │├────────┴──────────┐│ │ ┌───────┴────────┴────────┐ │ │┌──────────┴────────┤│
-+# ││192.168.241.1/24 ││ │ │(ns1) (ns2) │ │ ││192.168.241.2/24 ││
-+# ││fd00::1/24 ││ │ │127.0.0.1:1 127.0.0.1:2│ │ ││fd00::2/24 ││
-+# │└───────────────────┘│ │ │[::]:1 [::]:2 │ │ │└───────────────────┘│
-+# └─────────────────────┘ │ └─────────────────────────┘ │ └─────────────────────┘
-+# └──────────────────────────────────┘
-+#
-+# After the topology is prepared we run a series of TCP/UDP iperf3 tests between the
-+# wireguard peers in $ns1 and $ns2. Note that $ns0 is the endpoint for the wg0
-+# interfaces in $ns1 and $ns2. See https://www.wireguard.com/netns/ for further
-+# details on how this is accomplished.
-+set -e
-+
-+exec 3>&1
-+export WG_HIDE_KEYS=never
-+netns0="wg-test-$$-0"
-+netns1="wg-test-$$-1"
-+netns2="wg-test-$$-2"
-+pretty() { echo -e "\x1b[32m\x1b[1m[+] ${1:+NS$1: }${2}\x1b[0m" >&3; }
-+pp() { pretty "" "$*"; "$@"; }
-+maybe_exec() { if [[ $BASHPID -eq $$ ]]; then "$@"; else exec "$@"; fi; }
-+n0() { pretty 0 "$*"; maybe_exec ip netns exec $netns0 "$@"; }
-+n1() { pretty 1 "$*"; maybe_exec ip netns exec $netns1 "$@"; }
-+n2() { pretty 2 "$*"; maybe_exec ip netns exec $netns2 "$@"; }
-+ip0() { pretty 0 "ip $*"; ip -n $netns0 "$@"; }
-+ip1() { pretty 1 "ip $*"; ip -n $netns1 "$@"; }
-+ip2() { pretty 2 "ip $*"; ip -n $netns2 "$@"; }
-+sleep() { read -t "$1" -N 0 || true; }
-+waitiperf() { pretty "${1//*-}" "wait for iperf:5201"; while [[ $(ss -N "$1" -tlp 'sport = 5201') != *iperf3* ]]; do sleep 0.1; done; }
-+waitncatudp() { pretty "${1//*-}" "wait for udp:1111"; while [[ $(ss -N "$1" -ulp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
-+waitncattcp() { pretty "${1//*-}" "wait for tcp:1111"; while [[ $(ss -N "$1" -tlp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
-+waitiface() { pretty "${1//*-}" "wait for $2 to come up"; ip netns exec "$1" bash -c "while [[ \$(< \"/sys/class/net/$2/operstate\") != up ]]; do read -t .1 -N 0 || true; done;"; }
-+
-+cleanup() {
-+ set +e
-+ exec 2>/dev/null
-+ printf "$orig_message_cost" > /proc/sys/net/core/message_cost
-+ ip0 link del dev wg0
-+ ip1 link del dev wg0
-+ ip2 link del dev wg0
-+ local to_kill="$(ip netns pids $netns0) $(ip netns pids $netns1) $(ip netns pids $netns2)"
-+ [[ -n $to_kill ]] && kill $to_kill
-+ pp ip netns del $netns1
-+ pp ip netns del $netns2
-+ pp ip netns del $netns0
-+ exit
-+}
-+
-+orig_message_cost="$(< /proc/sys/net/core/message_cost)"
-+trap cleanup EXIT
-+printf 0 > /proc/sys/net/core/message_cost
-+
-+ip netns del $netns0 2>/dev/null || true
-+ip netns del $netns1 2>/dev/null || true
-+ip netns del $netns2 2>/dev/null || true
-+pp ip netns add $netns0
-+pp ip netns add $netns1
-+pp ip netns add $netns2
-+ip0 link set up dev lo
-+
-+ip0 link add dev wg0 type wireguard
-+ip0 link set wg0 netns $netns1
-+ip0 link add dev wg0 type wireguard
-+ip0 link set wg0 netns $netns2
-+key1="$(pp wg genkey)"
-+key2="$(pp wg genkey)"
-+key3="$(pp wg genkey)"
-+pub1="$(pp wg pubkey <<<"$key1")"
-+pub2="$(pp wg pubkey <<<"$key2")"
-+pub3="$(pp wg pubkey <<<"$key3")"
-+psk="$(pp wg genpsk)"
-+[[ -n $key1 && -n $key2 && -n $psk ]]
-+
-+configure_peers() {
-+ ip1 addr add 192.168.241.1/24 dev wg0
-+ ip1 addr add fd00::1/24 dev wg0
-+
-+ ip2 addr add 192.168.241.2/24 dev wg0
-+ ip2 addr add fd00::2/24 dev wg0
-+
-+ n1 wg set wg0 \
-+ private-key <(echo "$key1") \
-+ listen-port 1 \
-+ peer "$pub2" \
-+ preshared-key <(echo "$psk") \
-+ allowed-ips 192.168.241.2/32,fd00::2/128
-+ n2 wg set wg0 \
-+ private-key <(echo "$key2") \
-+ listen-port 2 \
-+ peer "$pub1" \
-+ preshared-key <(echo "$psk") \
-+ allowed-ips 192.168.241.1/32,fd00::1/128
-+
-+ ip1 link set up dev wg0
-+ ip2 link set up dev wg0
-+}
-+configure_peers
-+
-+tests() {
-+ # Ping over IPv4
-+ n2 ping -c 10 -f -W 1 192.168.241.1
-+ n1 ping -c 10 -f -W 1 192.168.241.2
-+
-+ # Ping over IPv6
-+ n2 ping6 -c 10 -f -W 1 fd00::1
-+ n1 ping6 -c 10 -f -W 1 fd00::2
-+
-+ # TCP over IPv4
-+ n2 iperf3 -s -1 -B 192.168.241.2 &
-+ waitiperf $netns2
-+ n1 iperf3 -Z -t 3 -c 192.168.241.2
-+
-+ # TCP over IPv6
-+ n1 iperf3 -s -1 -B fd00::1 &
-+ waitiperf $netns1
-+ n2 iperf3 -Z -t 3 -c fd00::1
-+
-+ # UDP over IPv4
-+ n1 iperf3 -s -1 -B 192.168.241.1 &
-+ waitiperf $netns1
-+ n2 iperf3 -Z -t 3 -b 0 -u -c 192.168.241.1
-+
-+ # UDP over IPv6
-+ n2 iperf3 -s -1 -B fd00::2 &
-+ waitiperf $netns2
-+ n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2
-+}
-+
-+[[ $(ip1 link show dev wg0) =~ mtu\ ([0-9]+) ]] && orig_mtu="${BASH_REMATCH[1]}"
-+big_mtu=$(( 34816 - 1500 + $orig_mtu ))
-+
-+# Test using IPv4 as outer transport
-+n1 wg set wg0 peer "$pub2" endpoint 127.0.0.1:2
-+n2 wg set wg0 peer "$pub1" endpoint 127.0.0.1:1
-+# Before calling tests, we first make sure that the stats counters and timestamper are working
-+n2 ping -c 10 -f -W 1 192.168.241.1
-+{ read _; read _; read _; read rx_bytes _; read _; read tx_bytes _; } < <(ip2 -stats link show dev wg0)
-+(( rx_bytes == 1372 && (tx_bytes == 1428 || tx_bytes == 1460) ))
-+{ read _; read _; read _; read rx_bytes _; read _; read tx_bytes _; } < <(ip1 -stats link show dev wg0)
-+(( tx_bytes == 1372 && (rx_bytes == 1428 || rx_bytes == 1460) ))
-+read _ rx_bytes tx_bytes < <(n2 wg show wg0 transfer)
-+(( rx_bytes == 1372 && (tx_bytes == 1428 || tx_bytes == 1460) ))
-+read _ rx_bytes tx_bytes < <(n1 wg show wg0 transfer)
-+(( tx_bytes == 1372 && (rx_bytes == 1428 || rx_bytes == 1460) ))
-+read _ timestamp < <(n1 wg show wg0 latest-handshakes)
-+(( timestamp != 0 ))
-+
-+tests
-+ip1 link set wg0 mtu $big_mtu
-+ip2 link set wg0 mtu $big_mtu
-+tests
-+
-+ip1 link set wg0 mtu $orig_mtu
-+ip2 link set wg0 mtu $orig_mtu
-+
-+# Test using IPv6 as outer transport
-+n1 wg set wg0 peer "$pub2" endpoint [::1]:2
-+n2 wg set wg0 peer "$pub1" endpoint [::1]:1
-+tests
-+ip1 link set wg0 mtu $big_mtu
-+ip2 link set wg0 mtu $big_mtu
-+tests
-+
-+# Test that route MTUs work with the padding
-+ip1 link set wg0 mtu 1300
-+ip2 link set wg0 mtu 1300
-+n1 wg set wg0 peer "$pub2" endpoint 127.0.0.1:2
-+n2 wg set wg0 peer "$pub1" endpoint 127.0.0.1:1
-+n0 iptables -A INPUT -m length --length 1360 -j DROP
-+n1 ip route add 192.168.241.2/32 dev wg0 mtu 1299
-+n2 ip route add 192.168.241.1/32 dev wg0 mtu 1299
-+n2 ping -c 1 -W 1 -s 1269 192.168.241.1
-+n2 ip route delete 192.168.241.1/32 dev wg0 mtu 1299
-+n1 ip route delete 192.168.241.2/32 dev wg0 mtu 1299
-+n0 iptables -F INPUT
-+
-+ip1 link set wg0 mtu $orig_mtu
-+ip2 link set wg0 mtu $orig_mtu
-+
-+# Test using IPv4 that roaming works
-+ip0 -4 addr del 127.0.0.1/8 dev lo
-+ip0 -4 addr add 127.212.121.99/8 dev lo
-+n1 wg set wg0 listen-port 9999
-+n1 wg set wg0 peer "$pub2" endpoint 127.0.0.1:2
-+n1 ping6 -W 1 -c 1 fd00::2
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 127.212.121.99:9999" ]]
-+
-+# Test using IPv6 that roaming works
-+n1 wg set wg0 listen-port 9998
-+n1 wg set wg0 peer "$pub2" endpoint [::1]:2
-+n1 ping -W 1 -c 1 192.168.241.2
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 [::1]:9998" ]]
-+
-+# Test that crypto-RP filter works
-+n1 wg set wg0 peer "$pub2" allowed-ips 192.168.241.0/24
-+exec 4< <(n1 ncat -l -u -p 1111)
-+ncat_pid=$!
-+waitncatudp $netns1
-+n2 ncat -u 192.168.241.1 1111 <<<"X"
-+read -r -N 1 -t 1 out <&4 && [[ $out == "X" ]]
-+kill $ncat_pid
-+more_specific_key="$(pp wg genkey | pp wg pubkey)"
-+n1 wg set wg0 peer "$more_specific_key" allowed-ips 192.168.241.2/32
-+n2 wg set wg0 listen-port 9997
-+exec 4< <(n1 ncat -l -u -p 1111)
-+ncat_pid=$!
-+waitncatudp $netns1
-+n2 ncat -u 192.168.241.1 1111 <<<"X"
-+! read -r -N 1 -t 1 out <&4 || false
-+kill $ncat_pid
-+n1 wg set wg0 peer "$more_specific_key" remove
-+[[ $(n1 wg show wg0 endpoints) == "$pub2 [::1]:9997" ]]
-+
-+# Test that we can change private keys keys and immediately handshake
-+n1 wg set wg0 private-key <(echo "$key1") peer "$pub2" preshared-key <(echo "$psk") allowed-ips 192.168.241.2/32 endpoint 127.0.0.1:2
-+n2 wg set wg0 private-key <(echo "$key2") listen-port 2 peer "$pub1" preshared-key <(echo "$psk") allowed-ips 192.168.241.1/32
-+n1 ping -W 1 -c 1 192.168.241.2
-+n1 wg set wg0 private-key <(echo "$key3")
-+n2 wg set wg0 peer "$pub3" preshared-key <(echo "$psk") allowed-ips 192.168.241.1/32 peer "$pub1" remove
-+n1 ping -W 1 -c 1 192.168.241.2
-+
-+ip1 link del wg0
-+ip2 link del wg0
-+
-+# Test using NAT. We now change the topology to this:
-+# ┌────────────────────────────────────────┐ ┌────────────────────────────────────────────────┐ ┌────────────────────────────────────────┐
-+# │ $ns1 namespace │ │ $ns0 namespace │ │ $ns2 namespace │
-+# │ │ │ │ │ │
-+# │ ┌─────┐ ┌─────┐ │ │ ┌──────┐ ┌──────┐ │ │ ┌─────┐ ┌─────┐ │
-+# │ │ wg0 │─────────────│vethc│───────────┼────┼────│vethrc│ │vethrs│──────────────┼─────┼──│veths│────────────│ wg0 │ │
-+# │ ├─────┴──────────┐ ├─────┴──────────┐│ │ ├──────┴─────────┐ ├──────┴────────────┐ │ │ ├─────┴──────────┐ ├─────┴──────────┐ │
-+# │ │192.168.241.1/24│ │192.168.1.100/24││ │ │192.168.1.1/24 │ │10.0.0.1/24 │ │ │ │10.0.0.100/24 │ │192.168.241.2/24│ │
-+# │ │fd00::1/24 │ │ ││ │ │ │ │SNAT:192.168.1.0/24│ │ │ │ │ │fd00::2/24 │ │
-+# │ └────────────────┘ └────────────────┘│ │ └────────────────┘ └───────────────────┘ │ │ └────────────────┘ └────────────────┘ │
-+# └────────────────────────────────────────┘ └────────────────────────────────────────────────┘ └────────────────────────────────────────┘
-+
-+ip1 link add dev wg0 type wireguard
-+ip2 link add dev wg0 type wireguard
-+configure_peers
-+
-+ip0 link add vethrc type veth peer name vethc
-+ip0 link add vethrs type veth peer name veths
-+ip0 link set vethc netns $netns1
-+ip0 link set veths netns $netns2
-+ip0 link set vethrc up
-+ip0 link set vethrs up
-+ip0 addr add 192.168.1.1/24 dev vethrc
-+ip0 addr add 10.0.0.1/24 dev vethrs
-+ip1 addr add 192.168.1.100/24 dev vethc
-+ip1 link set vethc up
-+ip1 route add default via 192.168.1.1
-+ip2 addr add 10.0.0.100/24 dev veths
-+ip2 link set veths up
-+waitiface $netns0 vethrc
-+waitiface $netns0 vethrs
-+waitiface $netns1 vethc
-+waitiface $netns2 veths
-+
-+n0 bash -c 'printf 1 > /proc/sys/net/ipv4/ip_forward'
-+n0 bash -c 'printf 2 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout'
-+n0 bash -c 'printf 2 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream'
-+n0 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.0.0.0/24 -j SNAT --to 10.0.0.1
-+
-+n1 wg set wg0 peer "$pub2" endpoint 10.0.0.100:2 persistent-keepalive 1
-+n1 ping -W 1 -c 1 192.168.241.2
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.1:1" ]]
-+# Demonstrate n2 can still send packets to n1, since persistent-keepalive will prevent connection tracking entry from expiring (to see entries: `n0 conntrack -L`).
-+pp sleep 3
-+n2 ping -W 1 -c 1 192.168.241.1
-+n1 wg set wg0 peer "$pub2" persistent-keepalive 0
-+
-+# Do a wg-quick(8)-style policy routing for the default route, making sure vethc has a v6 address to tease out bugs.
-+ip1 -6 addr add fc00::9/96 dev vethc
-+ip1 -6 route add default via fc00::1
-+ip2 -4 addr add 192.168.99.7/32 dev wg0
-+ip2 -6 addr add abab::1111/128 dev wg0
-+n1 wg set wg0 fwmark 51820 peer "$pub2" allowed-ips 192.168.99.7,abab::1111
-+ip1 -6 route add default dev wg0 table 51820
-+ip1 -6 rule add not fwmark 51820 table 51820
-+ip1 -6 rule add table main suppress_prefixlength 0
-+ip1 -4 route add default dev wg0 table 51820
-+ip1 -4 rule add not fwmark 51820 table 51820
-+ip1 -4 rule add table main suppress_prefixlength 0
-+# suppress_prefixlength only got added in 3.12, and we want to support 3.10+.
-+if [[ $(ip1 -4 rule show all) == *suppress_prefixlength* ]]; then
-+ # Flood the pings instead of sending just one, to trigger routing table reference counting bugs.
-+ n1 ping -W 1 -c 100 -f 192.168.99.7
-+ n1 ping -W 1 -c 100 -f abab::1111
-+fi
-+
-+n0 iptables -t nat -F
-+ip0 link del vethrc
-+ip0 link del vethrs
-+ip1 link del wg0
-+ip2 link del wg0
-+
-+# Test that saddr routing is sticky but not too sticky, changing to this topology:
-+# ┌────────────────────────────────────────┐ ┌────────────────────────────────────────┐
-+# │ $ns1 namespace │ │ $ns2 namespace │
-+# │ │ │ │
-+# │ ┌─────┐ ┌─────┐ │ │ ┌─────┐ ┌─────┐ │
-+# │ │ wg0 │─────────────│veth1│───────────┼────┼──│veth2│────────────│ wg0 │ │
-+# │ ├─────┴──────────┐ ├─────┴──────────┐│ │ ├─────┴──────────┐ ├─────┴──────────┐ │
-+# │ │192.168.241.1/24│ │10.0.0.1/24 ││ │ │10.0.0.2/24 │ │192.168.241.2/24│ │
-+# │ │fd00::1/24 │ │fd00:aa::1/96 ││ │ │fd00:aa::2/96 │ │fd00::2/24 │ │
-+# │ └────────────────┘ └────────────────┘│ │ └────────────────┘ └────────────────┘ │
-+# └────────────────────────────────────────┘ └────────────────────────────────────────┘
-+
-+ip1 link add dev wg0 type wireguard
-+ip2 link add dev wg0 type wireguard
-+configure_peers
-+ip1 link add veth1 type veth peer name veth2
-+ip1 link set veth2 netns $netns2
-+n1 bash -c 'printf 0 > /proc/sys/net/ipv6/conf/all/accept_dad'
-+n2 bash -c 'printf 0 > /proc/sys/net/ipv6/conf/all/accept_dad'
-+n1 bash -c 'printf 0 > /proc/sys/net/ipv6/conf/veth1/accept_dad'
-+n2 bash -c 'printf 0 > /proc/sys/net/ipv6/conf/veth2/accept_dad'
-+n1 bash -c 'printf 1 > /proc/sys/net/ipv4/conf/veth1/promote_secondaries'
-+
-+# First we check that we aren't overly sticky and can fall over to new IPs when old ones are removed
-+ip1 addr add 10.0.0.1/24 dev veth1
-+ip1 addr add fd00:aa::1/96 dev veth1
-+ip2 addr add 10.0.0.2/24 dev veth2
-+ip2 addr add fd00:aa::2/96 dev veth2
-+ip1 link set veth1 up
-+ip2 link set veth2 up
-+waitiface $netns1 veth1
-+waitiface $netns2 veth2
-+n1 wg set wg0 peer "$pub2" endpoint 10.0.0.2:2
-+n1 ping -W 1 -c 1 192.168.241.2
-+ip1 addr add 10.0.0.10/24 dev veth1
-+ip1 addr del 10.0.0.1/24 dev veth1
-+n1 ping -W 1 -c 1 192.168.241.2
-+n1 wg set wg0 peer "$pub2" endpoint [fd00:aa::2]:2
-+n1 ping -W 1 -c 1 192.168.241.2
-+ip1 addr add fd00:aa::10/96 dev veth1
-+ip1 addr del fd00:aa::1/96 dev veth1
-+n1 ping -W 1 -c 1 192.168.241.2
-+
-+# Now we show that we can successfully do reply to sender routing
-+ip1 link set veth1 down
-+ip2 link set veth2 down
-+ip1 addr flush dev veth1
-+ip2 addr flush dev veth2
-+ip1 addr add 10.0.0.1/24 dev veth1
-+ip1 addr add 10.0.0.2/24 dev veth1
-+ip1 addr add fd00:aa::1/96 dev veth1
-+ip1 addr add fd00:aa::2/96 dev veth1
-+ip2 addr add 10.0.0.3/24 dev veth2
-+ip2 addr add fd00:aa::3/96 dev veth2
-+ip1 link set veth1 up
-+ip2 link set veth2 up
-+waitiface $netns1 veth1
-+waitiface $netns2 veth2
-+n2 wg set wg0 peer "$pub1" endpoint 10.0.0.1:1
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.1:1" ]]
-+n2 wg set wg0 peer "$pub1" endpoint [fd00:aa::1]:1
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 [fd00:aa::1]:1" ]]
-+n2 wg set wg0 peer "$pub1" endpoint 10.0.0.2:1
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.2:1" ]]
-+n2 wg set wg0 peer "$pub1" endpoint [fd00:aa::2]:1
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 [fd00:aa::2]:1" ]]
-+
-+# What happens if the inbound destination address belongs to a different interface as the default route?
-+ip1 link add dummy0 type dummy
-+ip1 addr add 10.50.0.1/24 dev dummy0
-+ip1 link set dummy0 up
-+ip2 route add 10.50.0.0/24 dev veth2
-+n2 wg set wg0 peer "$pub1" endpoint 10.50.0.1:1
-+n2 ping -W 1 -c 1 192.168.241.1
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.50.0.1:1" ]]
-+
-+ip1 link del dummy0
-+ip1 addr flush dev veth1
-+ip2 addr flush dev veth2
-+ip1 route flush dev veth1
-+ip2 route flush dev veth2
-+
-+# Now we see what happens if another interface route takes precedence over an ongoing one
-+ip1 link add veth3 type veth peer name veth4
-+ip1 link set veth4 netns $netns2
-+ip1 addr add 10.0.0.1/24 dev veth1
-+ip2 addr add 10.0.0.2/24 dev veth2
-+ip1 addr add 10.0.0.3/24 dev veth3
-+ip1 link set veth1 up
-+ip2 link set veth2 up
-+ip1 link set veth3 up
-+ip2 link set veth4 up
-+waitiface $netns1 veth1
-+waitiface $netns2 veth2
-+waitiface $netns1 veth3
-+waitiface $netns2 veth4
-+ip1 route flush dev veth1
-+ip1 route flush dev veth3
-+ip1 route add 10.0.0.0/24 dev veth1 src 10.0.0.1 metric 2
-+n1 wg set wg0 peer "$pub2" endpoint 10.0.0.2:2
-+n1 ping -W 1 -c 1 192.168.241.2
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.1:1" ]]
-+ip1 route add 10.0.0.0/24 dev veth3 src 10.0.0.3 metric 1
-+n1 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter'
-+n2 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/veth4/rp_filter'
-+n1 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/all/rp_filter'
-+n2 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/all/rp_filter'
-+n1 ping -W 1 -c 1 192.168.241.2
-+[[ $(n2 wg show wg0 endpoints) == "$pub1 10.0.0.3:1" ]]
-+
-+ip1 link del veth1
-+ip1 link del veth3
-+ip1 link del wg0
-+ip2 link del wg0
-+
-+# We test that Netlink/IPC is working properly by doing things that usually cause split responses
-+ip0 link add dev wg0 type wireguard
-+config=( "[Interface]" "PrivateKey=$(wg genkey)" "[Peer]" "PublicKey=$(wg genkey)" )
-+for a in {1..255}; do
-+ for b in {0..255}; do
-+ config+=( "AllowedIPs=$a.$b.0.0/16,$a::$b/128" )
-+ done
-+done
-+n0 wg setconf wg0 <(printf '%s\n' "${config[@]}")
-+i=0
-+for ip in $(n0 wg show wg0 allowed-ips); do
-+ ((++i))
-+done
-+((i == 255*256*2+1))
-+ip0 link del wg0
-+ip0 link add dev wg0 type wireguard
-+config=( "[Interface]" "PrivateKey=$(wg genkey)" )
-+for a in {1..40}; do
-+ config+=( "[Peer]" "PublicKey=$(wg genkey)" )
-+ for b in {1..52}; do
-+ config+=( "AllowedIPs=$a.$b.0.0/16" )
-+ done
-+done
-+n0 wg setconf wg0 <(printf '%s\n' "${config[@]}")
-+i=0
-+while read -r line; do
-+ j=0
-+ for ip in $line; do
-+ ((++j))
-+ done
-+ ((j == 53))
-+ ((++i))
-+done < <(n0 wg show wg0 allowed-ips)
-+((i == 40))
-+ip0 link del wg0
-+ip0 link add wg0 type wireguard
-+config=( )
-+for i in {1..29}; do
-+ config+=( "[Peer]" "PublicKey=$(wg genkey)" )
-+done
-+config+=( "[Peer]" "PublicKey=$(wg genkey)" "AllowedIPs=255.2.3.4/32,abcd::255/128" )
-+n0 wg setconf wg0 <(printf '%s\n' "${config[@]}")
-+n0 wg showconf wg0 > /dev/null
-+ip0 link del wg0
-+
-+allowedips=( )
-+for i in {1..197}; do
-+ allowedips+=( abcd::$i )
-+done
-+saved_ifs="$IFS"
-+IFS=,
-+allowedips="${allowedips[*]}"
-+IFS="$saved_ifs"
-+ip0 link add wg0 type wireguard
-+n0 wg set wg0 peer "$pub1"
-+n0 wg set wg0 peer "$pub2" allowed-ips "$allowedips"
-+{
-+ read -r pub allowedips
-+ [[ $pub == "$pub1" && $allowedips == "(none)" ]]
-+ read -r pub allowedips
-+ [[ $pub == "$pub2" ]]
-+ i=0
-+ for _ in $allowedips; do
-+ ((++i))
-+ done
-+ ((i == 197))
-+} < <(n0 wg show wg0 allowed-ips)
-+ip0 link del wg0
-+
-+! n0 wg show doesnotexist || false
-+
-+ip0 link add wg0 type wireguard
-+n0 wg set wg0 private-key <(echo "$key1") peer "$pub2" preshared-key <(echo "$psk")
-+[[ $(n0 wg show wg0 private-key) == "$key1" ]]
-+[[ $(n0 wg show wg0 preshared-keys) == "$pub2 $psk" ]]
-+n0 wg set wg0 private-key /dev/null peer "$pub2" preshared-key /dev/null
-+[[ $(n0 wg show wg0 private-key) == "(none)" ]]
-+[[ $(n0 wg show wg0 preshared-keys) == "$pub2 (none)" ]]
-+n0 wg set wg0 peer "$pub2"
-+n0 wg set wg0 private-key <(echo "$key2")
-+[[ $(n0 wg show wg0 public-key) == "$pub2" ]]
-+[[ -z $(n0 wg show wg0 peers) ]]
-+n0 wg set wg0 peer "$pub2"
-+[[ -z $(n0 wg show wg0 peers) ]]
-+n0 wg set wg0 private-key <(echo "$key1")
-+n0 wg set wg0 peer "$pub2"
-+[[ $(n0 wg show wg0 peers) == "$pub2" ]]
-+n0 wg set wg0 private-key <(echo "/${key1:1}")
-+[[ $(n0 wg show wg0 private-key) == "+${key1:1}" ]]
-+n0 wg set wg0 peer "$pub2" allowed-ips 0.0.0.0/0,10.0.0.0/8,100.0.0.0/10,172.16.0.0/12,192.168.0.0/16
-+n0 wg set wg0 peer "$pub2" allowed-ips 0.0.0.0/0
-+n0 wg set wg0 peer "$pub2" allowed-ips ::/0,1700::/111,5000::/4,e000::/37,9000::/75
-+n0 wg set wg0 peer "$pub2" allowed-ips ::/0
-+ip0 link del wg0
-+
-+declare -A objects
-+while read -t 0.1 -r line 2>/dev/null || [[ $? -ne 142 ]]; do
-+ [[ $line =~ .*(wg[0-9]+:\ [A-Z][a-z]+\ [0-9]+)\ .*(created|destroyed).* ]] || continue
-+ objects["${BASH_REMATCH[1]}"]+="${BASH_REMATCH[2]}"
-+done < /dev/kmsg
-+alldeleted=1
-+for object in "${!objects[@]}"; do
-+ if [[ ${objects["$object"]} != *createddestroyed ]]; then
-+ echo "Error: $object: merely ${objects["$object"]}" >&3
-+ alldeleted=0
-+ fi
-+done
-+[[ $alldeleted -eq 1 ]]
-+pretty "" "Objects that were created were also destroyed."
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0073-wireguard-selftests-import-harness-makefile-for-test.patch b/target/linux/generic/backport-5.4/080-wireguard-0073-wireguard-selftests-import-harness-makefile-for-test.patch
deleted file mode 100644
index ca3853aa19..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0073-wireguard-selftests-import-harness-makefile-for-test.patch
+++ /dev/null
@@ -1,1078 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 15 Dec 2019 22:08:00 +0100
-Subject: [PATCH] wireguard: selftests: import harness makefile for test suite
-
-commit 65d88d04114bca7d85faebd5fed61069cb2b632c upstream.
-
-WireGuard has been using this on build.wireguard.com for the last
-several years with considerable success. It allows for very quick and
-iterative development cycles, and supports several platforms.
-
-To run the test suite on your current platform in QEMU:
-
- $ make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
-
-To run it with KASAN and such turned on:
-
- $ DEBUG_KERNEL=yes make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
-
-To run it emulated for another platform in QEMU:
-
- $ ARCH=arm make -C tools/testing/selftests/wireguard/qemu -j$(nproc)
-
-At the moment, we support aarch64_be, aarch64, arm, armeb, i686, m68k,
-mips64, mips64el, mips, mipsel, powerpc64le, powerpc, and x86_64.
-
-The system supports incremental rebuilding, so it should be very fast to
-change a single file and then test it out and have immediate feedback.
-
-This requires for the right toolchain and qemu to be installed prior.
-I've had success with those from musl.cc.
-
-This is tailored for WireGuard at the moment, though later projects
-might generalize it for other network testing.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- .../selftests/wireguard/qemu/.gitignore | 2 +
- .../testing/selftests/wireguard/qemu/Makefile | 385 ++++++++++++++++++
- .../wireguard/qemu/arch/aarch64.config | 5 +
- .../wireguard/qemu/arch/aarch64_be.config | 6 +
- .../selftests/wireguard/qemu/arch/arm.config | 9 +
- .../wireguard/qemu/arch/armeb.config | 10 +
- .../selftests/wireguard/qemu/arch/i686.config | 5 +
- .../selftests/wireguard/qemu/arch/m68k.config | 9 +
- .../selftests/wireguard/qemu/arch/mips.config | 11 +
- .../wireguard/qemu/arch/mips64.config | 14 +
- .../wireguard/qemu/arch/mips64el.config | 15 +
- .../wireguard/qemu/arch/mipsel.config | 12 +
- .../wireguard/qemu/arch/powerpc.config | 10 +
- .../wireguard/qemu/arch/powerpc64le.config | 12 +
- .../wireguard/qemu/arch/x86_64.config | 5 +
- .../selftests/wireguard/qemu/debug.config | 67 +++
- tools/testing/selftests/wireguard/qemu/init.c | 284 +++++++++++++
- .../selftests/wireguard/qemu/kernel.config | 86 ++++
- 18 files changed, 947 insertions(+)
- create mode 100644 tools/testing/selftests/wireguard/qemu/.gitignore
- create mode 100644 tools/testing/selftests/wireguard/qemu/Makefile
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/aarch64.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/aarch64_be.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/arm.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/armeb.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/i686.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/m68k.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/mips.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/mips64.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/mips64el.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/mipsel.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/powerpc.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/arch/x86_64.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/debug.config
- create mode 100644 tools/testing/selftests/wireguard/qemu/init.c
- create mode 100644 tools/testing/selftests/wireguard/qemu/kernel.config
-
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/.gitignore
-@@ -0,0 +1,2 @@
-+build/
-+distfiles/
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/Makefile
-@@ -0,0 +1,385 @@
-+# SPDX-License-Identifier: GPL-2.0
-+#
-+# Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+
-+PWD := $(shell pwd)
-+
-+CHOST := $(shell gcc -dumpmachine)
-+ifneq (,$(ARCH))
-+CBUILD := $(subst -gcc,,$(lastword $(subst /, ,$(firstword $(wildcard $(foreach bindir,$(subst :, ,$(PATH)),$(bindir)/$(ARCH)-*-gcc))))))
-+ifeq (,$(CBUILD))
-+$(error The toolchain for $(ARCH) is not installed)
-+endif
-+else
-+CBUILD := $(CHOST)
-+ARCH := $(firstword $(subst -, ,$(CBUILD)))
-+endif
-+
-+# Set these from the environment to override
-+KERNEL_PATH ?= $(PWD)/../../../../..
-+BUILD_PATH ?= $(PWD)/build/$(ARCH)
-+DISTFILES_PATH ?= $(PWD)/distfiles
-+NR_CPUS ?= 4
-+
-+MIRROR := https://download.wireguard.com/qemu-test/distfiles/
-+
-+default: qemu
-+
-+# variable name, tarball project name, version, tarball extension, default URI base
-+define tar_download =
-+$(1)_VERSION := $(3)
-+$(1)_NAME := $(2)-$$($(1)_VERSION)
-+$(1)_TAR := $(DISTFILES_PATH)/$$($(1)_NAME)$(4)
-+$(1)_PATH := $(BUILD_PATH)/$$($(1)_NAME)
-+$(call file_download,$$($(1)_NAME)$(4),$(5),$(6))
-+endef
-+
-+define file_download =
-+$(DISTFILES_PATH)/$(1):
-+ mkdir -p $(DISTFILES_PATH)
-+ flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -t inf --retry-on-http-error=404 -O $$@.tmp $(2)$(1) || rm -f $$@.tmp'
-+ if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi
-+endef
-+
-+$(eval $(call tar_download,MUSL,musl,1.1.20,.tar.gz,https://www.musl-libc.org/releases/,44be8771d0e6c6b5f82dd15662eb2957c9a3173a19a8b49966ac0542bbd40d61))
-+$(eval $(call tar_download,LIBMNL,libmnl,1.0.4,.tar.bz2,https://www.netfilter.org/projects/libmnl/files/,171f89699f286a5854b72b91d06e8f8e3683064c5901fb09d954a9ab6f551f81))
-+$(eval $(call tar_download,IPERF,iperf,3.1.7,.tar.gz,http://downloads.es.net/pub/iperf/,a4ef73406fe92250602b8da2ae89ec53211f805df97a1d1d629db5a14043734f))
-+$(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
-+$(eval $(call tar_download,IPROUTE2,iproute2,5.1.0,.tar.gz,https://www.kernel.org/pub/linux/utils/net/iproute2/,9b43707d6075ecdca14803ca8ce0c8553848c49fa1586d12fd508d66577243f2))
-+$(eval $(call tar_download,IPTABLES,iptables,1.6.1,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,0fc2d7bd5d7be11311726466789d4c65fb4c8e096c9182b56ce97440864f0cf5))
-+$(eval $(call tar_download,NMAP,nmap,7.60,.tar.bz2,https://nmap.org/dist/,a8796ecc4fa6c38aad6139d9515dc8113023a82e9d787e5a5fb5fa1b05516f21))
-+$(eval $(call tar_download,IPUTILS,iputils,s20161105,.tar.gz,https://github.com/iputils/iputils/archive/s20161105.tar.gz/#,f813092f03d17294fd23544b129b95cdb87fe19f7970a51908a6b88509acad8a))
-+$(eval $(call tar_download,WIREGUARD_TOOLS,WireGuard,0.0.20191212,.tar.xz,https://git.zx2c4.com/WireGuard/snapshot/,b0d718380f7a8822b2f12d75e462fa4eafa3a77871002981f367cd4fe2a1b071))
-+
-+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/,*)
-+
-+export CFLAGS ?= -O3 -pipe
-+export LDFLAGS ?=
-+export CPPFLAGS := -I$(BUILD_PATH)/include
-+
-+ifeq ($(CHOST),$(CBUILD))
-+CROSS_COMPILE_FLAG := --host=$(CHOST)
-+NOPIE_GCC := gcc -fno-PIE
-+CFLAGS += -march=native
-+STRIP := strip
-+else
-+$(info Cross compilation: building for $(CBUILD) using $(CHOST))
-+CROSS_COMPILE_FLAG := --build=$(CBUILD) --host=$(CHOST)
-+export CROSS_COMPILE=$(CBUILD)-
-+NOPIE_GCC := $(CBUILD)-gcc -fno-PIE
-+STRIP := $(CBUILD)-strip
-+endif
-+ifeq ($(ARCH),aarch64)
-+QEMU_ARCH := aarch64
-+KERNEL_ARCH := arm64
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
-+else
-+QEMU_MACHINE := -cpu cortex-a53 -machine virt
-+CFLAGS += -march=armv8-a -mtune=cortex-a53
-+endif
-+else ifeq ($(ARCH),aarch64_be)
-+QEMU_ARCH := aarch64
-+KERNEL_ARCH := arm64
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
-+else
-+QEMU_MACHINE := -cpu cortex-a53 -machine virt
-+CFLAGS += -march=armv8-a -mtune=cortex-a53
-+endif
-+else ifeq ($(ARCH),arm)
-+QEMU_ARCH := arm
-+KERNEL_ARCH := arm
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
-+else
-+QEMU_MACHINE := -cpu cortex-a15 -machine virt
-+CFLAGS += -march=armv7-a -mtune=cortex-a15 -mabi=aapcs-linux
-+endif
-+else ifeq ($(ARCH),armeb)
-+QEMU_ARCH := arm
-+KERNEL_ARCH := arm
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
-+else
-+QEMU_MACHINE := -cpu cortex-a15 -machine virt
-+CFLAGS += -march=armv7-a -mabi=aapcs-linux # We don't pass -mtune=cortex-a15 due to a compiler bug on big endian.
-+LDFLAGS += -Wl,--be8
-+endif
-+else ifeq ($(ARCH),x86_64)
-+QEMU_ARCH := x86_64
-+KERNEL_ARCH := x86_64
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine q35,accel=kvm
-+else
-+QEMU_MACHINE := -cpu Skylake-Server -machine q35
-+CFLAGS += -march=skylake-avx512
-+endif
-+else ifeq ($(ARCH),i686)
-+QEMU_ARCH := i386
-+KERNEL_ARCH := x86
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
-+ifeq ($(subst i686,x86_64,$(CBUILD)),$(CHOST))
-+QEMU_MACHINE := -cpu host -machine q35,accel=kvm
-+else
-+QEMU_MACHINE := -cpu coreduo -machine q35
-+CFLAGS += -march=prescott
-+endif
-+else ifeq ($(ARCH),mips64)
-+QEMU_ARCH := mips64
-+KERNEL_ARCH := mips
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine malta,accel=kvm
-+CFLAGS += -EB
-+else
-+QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1
-+CFLAGS += -march=mips64r2 -EB
-+endif
-+else ifeq ($(ARCH),mips64el)
-+QEMU_ARCH := mips64el
-+KERNEL_ARCH := mips
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine malta,accel=kvm
-+CFLAGS += -EL
-+else
-+QEMU_MACHINE := -cpu MIPS64R2-generic -machine malta -smp 1
-+CFLAGS += -march=mips64r2 -EL
-+endif
-+else ifeq ($(ARCH),mips)
-+QEMU_ARCH := mips
-+KERNEL_ARCH := mips
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine malta,accel=kvm
-+CFLAGS += -EB
-+else
-+QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1
-+CFLAGS += -march=mips32r2 -EB
-+endif
-+else ifeq ($(ARCH),mipsel)
-+QEMU_ARCH := mipsel
-+KERNEL_ARCH := mips
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host -machine malta,accel=kvm
-+CFLAGS += -EL
-+else
-+QEMU_MACHINE := -cpu 24Kf -machine malta -smp 1
-+CFLAGS += -march=mips32r2 -EL
-+endif
-+else ifeq ($(ARCH),powerpc64le)
-+QEMU_ARCH := ppc64
-+KERNEL_ARCH := powerpc
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host,accel=kvm -machine pseries
-+else
-+QEMU_MACHINE := -machine pseries
-+endif
-+CFLAGS += -mcpu=powerpc64le -mlong-double-64
-+else ifeq ($(ARCH),powerpc)
-+QEMU_ARCH := ppc
-+KERNEL_ARCH := powerpc
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/powerpc/boot/uImage
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host,accel=kvm -machine ppce500
-+else
-+QEMU_MACHINE := -machine ppce500
-+endif
-+CFLAGS += -mcpu=powerpc -mlong-double-64 -msecure-plt
-+else ifeq ($(ARCH),m68k)
-+QEMU_ARCH := m68k
-+KERNEL_ARCH := m68k
-+KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
-+ifeq ($(CHOST),$(CBUILD))
-+QEMU_MACHINE := -cpu host,accel=kvm -machine q800
-+else
-+QEMU_MACHINE := -machine q800
-+endif
-+else
-+$(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64le, powerpc, m68k)
-+endif
-+
-+REAL_CC := $(CBUILD)-gcc
-+MUSL_CC := $(BUILD_PATH)/musl-gcc
-+export CC := $(MUSL_CC)
-+USERSPACE_DEPS := $(MUSL_CC) $(BUILD_PATH)/include/.installed $(BUILD_PATH)/include/linux/.installed
-+
-+build: $(KERNEL_BZIMAGE)
-+qemu: $(KERNEL_BZIMAGE)
-+ rm -f $(BUILD_PATH)/result
-+ timeout --foreground 20m qemu-system-$(QEMU_ARCH) \
-+ -nodefaults \
-+ -nographic \
-+ -smp $(NR_CPUS) \
-+ $(QEMU_MACHINE) \
-+ -m $$(grep -q CONFIG_DEBUG_KMEMLEAK=y $(KERNEL_BUILD_PATH)/.config && echo 1G || echo 256M) \
-+ -serial stdio \
-+ -serial file:$(BUILD_PATH)/result \
-+ -no-reboot \
-+ -monitor none \
-+ -kernel $<
-+ grep -Fq success $(BUILD_PATH)/result
-+
-+$(BUILD_PATH)/init-cpio-spec.txt:
-+ mkdir -p $(BUILD_PATH)
-+ echo "file /init $(BUILD_PATH)/init 755 0 0" > $@
-+ echo "file /init.sh $(PWD)/../netns.sh 755 0 0" >> $@
-+ echo "dir /dev 755 0 0" >> $@
-+ echo "nod /dev/console 644 0 0 c 5 1" >> $@
-+ echo "dir /bin 755 0 0" >> $@
-+ echo "file /bin/iperf3 $(IPERF_PATH)/src/iperf3 755 0 0" >> $@
-+ echo "file /bin/wg $(WIREGUARD_TOOLS_PATH)/src/tools/wg 755 0 0" >> $@
-+ echo "file /bin/bash $(BASH_PATH)/bash 755 0 0" >> $@
-+ echo "file /bin/ip $(IPROUTE2_PATH)/ip/ip 755 0 0" >> $@
-+ echo "file /bin/ss $(IPROUTE2_PATH)/misc/ss 755 0 0" >> $@
-+ echo "file /bin/ping $(IPUTILS_PATH)/ping 755 0 0" >> $@
-+ echo "file /bin/ncat $(NMAP_PATH)/ncat/ncat 755 0 0" >> $@
-+ echo "file /bin/xtables-multi $(IPTABLES_PATH)/iptables/xtables-multi 755 0 0" >> $@
-+ echo "slink /bin/iptables xtables-multi 777 0 0" >> $@
-+ echo "slink /bin/ping6 ping 777 0 0" >> $@
-+ echo "dir /lib 755 0 0" >> $@
-+ echo "file /lib/libc.so $(MUSL_PATH)/lib/libc.so 755 0 0" >> $@
-+ echo "slink /lib/ld-linux.so.1 libc.so 777 0 0" >> $@
-+
-+$(KERNEL_BUILD_PATH)/.config: kernel.config arch/$(ARCH).config
-+ mkdir -p $(KERNEL_BUILD_PATH)
-+ cp kernel.config $(KERNEL_BUILD_PATH)/minimal.config
-+ printf 'CONFIG_NR_CPUS=$(NR_CPUS)\nCONFIG_INITRAMFS_SOURCE="$(BUILD_PATH)/init-cpio-spec.txt"\n' >> $(KERNEL_BUILD_PATH)/minimal.config
-+ cat arch/$(ARCH).config >> $(KERNEL_BUILD_PATH)/minimal.config
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) allnoconfig
-+ cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config $(KERNEL_BUILD_PATH)/minimal.config
-+ $(if $(findstring yes,$(DEBUG_KERNEL)),cp debug.config $(KERNEL_BUILD_PATH) && cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config debug.config,)
-+
-+$(KERNEL_BZIMAGE): $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(MUSL_PATH)/lib/libc.so $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/tools/wg $(BUILD_PATH)/init ../netns.sh $(WIREGUARD_SOURCES)
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) CC="$(NOPIE_GCC)"
-+
-+$(BUILD_PATH)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) INSTALL_HDR_PATH=$(BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) headers_install
-+ touch $@
-+
-+$(MUSL_PATH)/lib/libc.so: $(MUSL_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ cd $(MUSL_PATH) && CC=$(REAL_CC) ./configure --prefix=/ --disable-static --build=$(CBUILD)
-+ $(MAKE) -C $(MUSL_PATH)
-+ $(STRIP) -s $@
-+
-+$(BUILD_PATH)/include/.installed: $(MUSL_PATH)/lib/libc.so
-+ $(MAKE) -C $(MUSL_PATH) DESTDIR=$(BUILD_PATH) install-headers
-+ touch $@
-+
-+$(MUSL_CC): $(MUSL_PATH)/lib/libc.so
-+ sh $(MUSL_PATH)/tools/musl-gcc.specs.sh $(BUILD_PATH)/include $(MUSL_PATH)/lib /lib/ld-linux.so.1 > $(BUILD_PATH)/musl-gcc.specs
-+ printf '#!/bin/sh\nexec "$(REAL_CC)" --specs="$(BUILD_PATH)/musl-gcc.specs" -fno-stack-protector -no-pie "$$@"\n' > $(BUILD_PATH)/musl-gcc
-+ chmod +x $(BUILD_PATH)/musl-gcc
-+
-+$(IPERF_PATH)/.installed: $(IPERF_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ sed -i '1s/^/#include <stdint.h>/' $(IPERF_PATH)/src/cjson.h $(IPERF_PATH)/src/timer.h
-+ sed -i -r 's/-p?g//g' $(IPERF_PATH)/src/Makefile*
-+ touch $@
-+
-+$(IPERF_PATH)/src/iperf3: | $(IPERF_PATH)/.installed $(USERSPACE_DEPS)
-+ cd $(IPERF_PATH) && CFLAGS="$(CFLAGS) -D_GNU_SOURCE" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared
-+ $(MAKE) -C $(IPERF_PATH)
-+ $(STRIP) -s $@
-+
-+$(LIBMNL_PATH)/.installed: $(LIBMNL_TAR)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ touch $@
-+
-+$(LIBMNL_PATH)/src/.libs/libmnl.a: | $(LIBMNL_PATH)/.installed $(USERSPACE_DEPS)
-+ cd $(LIBMNL_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared
-+ $(MAKE) -C $(LIBMNL_PATH)
-+ sed -i 's:prefix=.*:prefix=$(LIBMNL_PATH):' $(LIBMNL_PATH)/libmnl.pc
-+
-+$(WIREGUARD_TOOLS_PATH)/.installed: $(WIREGUARD_TOOLS_TAR)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ touch $@
-+
-+$(WIREGUARD_TOOLS_PATH)/src/tools/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+ LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src/tools LIBMNL_CFLAGS="-I$(LIBMNL_PATH)/include" LIBMNL_LDLIBS="-lmnl" wg
-+ $(STRIP) -s $@
-+
-+$(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS)
-+ mkdir -p $(BUILD_PATH)
-+ $(MUSL_CC) -o $@ $(CFLAGS) $(LDFLAGS) -std=gnu11 $<
-+ $(STRIP) -s $@
-+
-+$(IPUTILS_PATH)/.installed: $(IPUTILS_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ touch $@
-+
-+$(IPUTILS_PATH)/ping: | $(IPUTILS_PATH)/.installed $(USERSPACE_DEPS)
-+ $(MAKE) -C $(IPUTILS_PATH) USE_CAP=no USE_IDN=no USE_NETTLE=no USE_CRYPTO=no ping
-+ $(STRIP) -s $@
-+
-+$(BASH_PATH)/.installed: $(BASH_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ touch $@
-+
-+$(BASH_PATH)/bash: | $(BASH_PATH)/.installed $(USERSPACE_DEPS)
-+ cd $(BASH_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --without-bash-malloc --disable-debugger --disable-help-builtin --disable-history --disable-multibyte --disable-progcomp --disable-readline --disable-mem-scramble
-+ $(MAKE) -C $(BASH_PATH)
-+ $(STRIP) -s $@
-+
-+$(IPROUTE2_PATH)/.installed: $(IPROUTE2_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=y\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS -DHAVE_LIBMNL -I$(LIBMNL_PATH)/include\nLDLIBS+=-lmnl' > $(IPROUTE2_PATH)/config.mk
-+ printf 'lib: snapshot\n\t$$(MAKE) -C lib\nip/ip: lib\n\t$$(MAKE) -C ip ip\nmisc/ss: lib\n\t$$(MAKE) -C misc ss\n' >> $(IPROUTE2_PATH)/Makefile
-+ touch $@
-+
-+$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+ LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ ip/ip
-+ $(STRIP) -s $(IPROUTE2_PATH)/ip/ip
-+
-+$(IPROUTE2_PATH)/misc/ss: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+ LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ misc/ss
-+ $(STRIP) -s $(IPROUTE2_PATH)/misc/ss
-+
-+$(IPTABLES_PATH)/.installed: $(IPTABLES_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ sed -i -e "/nfnetlink=[01]/s:=[01]:=0:" -e "/nfconntrack=[01]/s:=[01]:=0:" $(IPTABLES_PATH)/configure
-+ touch $@
-+
-+$(IPTABLES_PATH)/iptables/xtables-multi: | $(IPTABLES_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+ cd $(IPTABLES_PATH) && PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --with-kernel=$(BUILD_PATH)/include
-+ $(MAKE) -C $(IPTABLES_PATH)
-+ $(STRIP) -s $@
-+
-+$(NMAP_PATH)/.installed: $(NMAP_TAR)
-+ mkdir -p $(BUILD_PATH)
-+ flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-+ touch $@
-+
-+$(NMAP_PATH)/ncat/ncat: | $(NMAP_PATH)/.installed $(USERSPACE_DEPS)
-+ cd $(NMAP_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --without-ndiff --without-zenmap --without-nping --with-libpcap=included --with-libpcre=included --with-libdnet=included --without-liblua --with-liblinear=included --without-nmap-update --without-openssl --with-pcap=linux
-+ $(MAKE) -C $(NMAP_PATH) build-ncat
-+ $(STRIP) -s $@
-+
-+clean:
-+ rm -rf $(BUILD_PATH)
-+
-+distclean: clean
-+ rm -rf $(DISTFILES_PATH)
-+
-+menuconfig: $(KERNEL_BUILD_PATH)/.config
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) CC="$(NOPIE_GCC)" menuconfig
-+
-+.PHONY: qemu build clean distclean menuconfig
-+.DELETE_ON_ERROR:
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/aarch64.config
-@@ -0,0 +1,5 @@
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1"
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/aarch64_be.config
-@@ -0,0 +1,6 @@
-+CONFIG_CPU_BIG_ENDIAN=y
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1"
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/arm.config
-@@ -0,0 +1,9 @@
-+CONFIG_MMU=y
-+CONFIG_ARCH_MULTI_V7=y
-+CONFIG_ARCH_VIRT=y
-+CONFIG_THUMB2_KERNEL=n
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/armeb.config
-@@ -0,0 +1,10 @@
-+CONFIG_MMU=y
-+CONFIG_ARCH_MULTI_V7=y
-+CONFIG_ARCH_VIRT=y
-+CONFIG_THUMB2_KERNEL=n
-+CONFIG_SERIAL_AMBA_PL011=y
-+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyAMA0 wg.success=ttyAMA1"
-+CONFIG_CPU_BIG_ENDIAN=y
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/i686.config
-@@ -0,0 +1,5 @@
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/m68k.config
-@@ -0,0 +1,9 @@
-+CONFIG_MMU=y
-+CONFIG_M68040=y
-+CONFIG_MAC=y
-+CONFIG_SERIAL_PMACZILOG=y
-+CONFIG_SERIAL_PMACZILOG_TTYS=y
-+CONFIG_SERIAL_PMACZILOG_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/mips.config
-@@ -0,0 +1,11 @@
-+CONFIG_CPU_MIPS32_R2=y
-+CONFIG_MIPS_MALTA=y
-+CONFIG_MIPS_CPS=y
-+CONFIG_MIPS_FP_SUPPORT=y
-+CONFIG_POWER_RESET=y
-+CONFIG_POWER_RESET_SYSCON=y
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/mips64.config
-@@ -0,0 +1,14 @@
-+CONFIG_64BIT=y
-+CONFIG_CPU_MIPS64_R2=y
-+CONFIG_MIPS32_N32=y
-+CONFIG_CPU_HAS_MSA=y
-+CONFIG_MIPS_MALTA=y
-+CONFIG_MIPS_CPS=y
-+CONFIG_MIPS_FP_SUPPORT=y
-+CONFIG_POWER_RESET=y
-+CONFIG_POWER_RESET_SYSCON=y
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/mips64el.config
-@@ -0,0 +1,15 @@
-+CONFIG_64BIT=y
-+CONFIG_CPU_MIPS64_R2=y
-+CONFIG_MIPS32_N32=y
-+CONFIG_CPU_HAS_MSA=y
-+CONFIG_MIPS_MALTA=y
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_MIPS_CPS=y
-+CONFIG_MIPS_FP_SUPPORT=y
-+CONFIG_POWER_RESET=y
-+CONFIG_POWER_RESET_SYSCON=y
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/mipsel.config
-@@ -0,0 +1,12 @@
-+CONFIG_CPU_MIPS32_R2=y
-+CONFIG_MIPS_MALTA=y
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_MIPS_CPS=y
-+CONFIG_MIPS_FP_SUPPORT=y
-+CONFIG_POWER_RESET=y
-+CONFIG_POWER_RESET_SYSCON=y
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/powerpc.config
-@@ -0,0 +1,10 @@
-+CONFIG_PPC_QEMU_E500=y
-+CONFIG_FSL_SOC_BOOKE=y
-+CONFIG_PPC_85xx=y
-+CONFIG_PHYS_64BIT=y
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_MATH_EMULATION=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1024
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config
-@@ -0,0 +1,12 @@
-+CONFIG_PPC64=y
-+CONFIG_PPC_PSERIES=y
-+CONFIG_ALTIVEC=y
-+CONFIG_VSX=y
-+CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
-+CONFIG_PPC_RADIX_MMU=y
-+CONFIG_HVC_CONSOLE=y
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=hvc0 wg.success=hvc1"
-+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/arch/x86_64.config
-@@ -0,0 +1,5 @@
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
-+CONFIG_FRAME_WARN=1280
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/debug.config
-@@ -0,0 +1,67 @@
-+CONFIG_LOCALVERSION="-debug"
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_POINTER=y
-+CONFIG_STACK_VALIDATION=y
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_DEBUG_INFO=y
-+CONFIG_DEBUG_INFO_DWARF4=y
-+CONFIG_PAGE_EXTENSION=y
-+CONFIG_PAGE_POISONING=y
-+CONFIG_DEBUG_OBJECTS=y
-+CONFIG_DEBUG_OBJECTS_FREE=y
-+CONFIG_DEBUG_OBJECTS_TIMERS=y
-+CONFIG_DEBUG_OBJECTS_WORK=y
-+CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
-+CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
-+CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
-+CONFIG_SLUB_DEBUG_ON=y
-+CONFIG_DEBUG_VM=y
-+CONFIG_DEBUG_MEMORY_INIT=y
-+CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
-+CONFIG_DEBUG_STACKOVERFLOW=y
-+CONFIG_HAVE_ARCH_KMEMCHECK=y
-+CONFIG_HAVE_ARCH_KASAN=y
-+CONFIG_KASAN=y
-+CONFIG_KASAN_INLINE=y
-+CONFIG_UBSAN=y
-+CONFIG_UBSAN_SANITIZE_ALL=y
-+CONFIG_UBSAN_NO_ALIGNMENT=y
-+CONFIG_UBSAN_NULL=y
-+CONFIG_DEBUG_KMEMLEAK=y
-+CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=8192
-+CONFIG_DEBUG_STACK_USAGE=y
-+CONFIG_DEBUG_SHIRQ=y
-+CONFIG_WQ_WATCHDOG=y
-+CONFIG_SCHED_DEBUG=y
-+CONFIG_SCHED_INFO=y
-+CONFIG_SCHEDSTATS=y
-+CONFIG_SCHED_STACK_END_CHECK=y
-+CONFIG_DEBUG_TIMEKEEPING=y
-+CONFIG_TIMER_STATS=y
-+CONFIG_DEBUG_PREEMPT=y
-+CONFIG_DEBUG_RT_MUTEXES=y
-+CONFIG_DEBUG_SPINLOCK=y
-+CONFIG_DEBUG_MUTEXES=y
-+CONFIG_DEBUG_LOCK_ALLOC=y
-+CONFIG_PROVE_LOCKING=y
-+CONFIG_LOCKDEP=y
-+CONFIG_DEBUG_ATOMIC_SLEEP=y
-+CONFIG_TRACE_IRQFLAGS=y
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_LIST=y
-+CONFIG_DEBUG_PI_LIST=y
-+CONFIG_PROVE_RCU=y
-+CONFIG_SPARSE_RCU_POINTER=y
-+CONFIG_RCU_CPU_STALL_TIMEOUT=21
-+CONFIG_RCU_TRACE=y
-+CONFIG_RCU_EQS_DEBUG=y
-+CONFIG_USER_STACKTRACE_SUPPORT=y
-+CONFIG_DEBUG_SG=y
-+CONFIG_DEBUG_NOTIFIERS=y
-+CONFIG_DOUBLEFAULT=y
-+CONFIG_X86_DEBUG_FPU=y
-+CONFIG_DEBUG_SECTION_MISMATCH=y
-+CONFIG_DEBUG_PAGEALLOC=y
-+CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT=y
-+CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/init.c
-@@ -0,0 +1,284 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
-+ */
-+
-+#define _GNU_SOURCE
-+#include <unistd.h>
-+#include <errno.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <stdbool.h>
-+#include <fcntl.h>
-+#include <sys/wait.h>
-+#include <sys/mount.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <sys/types.h>
-+#include <sys/io.h>
-+#include <sys/ioctl.h>
-+#include <sys/reboot.h>
-+#include <sys/utsname.h>
-+#include <sys/sendfile.h>
-+#include <linux/random.h>
-+#include <linux/version.h>
-+
-+__attribute__((noreturn)) static void poweroff(void)
-+{
-+ fflush(stdout);
-+ fflush(stderr);
-+ reboot(RB_AUTOBOOT);
-+ sleep(30);
-+ fprintf(stderr, "\x1b[37m\x1b[41m\x1b[1mFailed to power off!!!\x1b[0m\n");
-+ exit(1);
-+}
-+
-+static void panic(const char *what)
-+{
-+ fprintf(stderr, "\n\n\x1b[37m\x1b[41m\x1b[1mSOMETHING WENT HORRIBLY WRONG\x1b[0m\n\n \x1b[31m\x1b[1m%s: %s\x1b[0m\n\n\x1b[37m\x1b[44m\x1b[1mPower off...\x1b[0m\n\n", what, strerror(errno));
-+ poweroff();
-+}
-+
-+#define pretty_message(msg) puts("\x1b[32m\x1b[1m" msg "\x1b[0m")
-+
-+static void print_banner(void)
-+{
-+ struct utsname utsname;
-+ int len;
-+
-+ if (uname(&utsname) < 0)
-+ panic("uname");
-+
-+ len = strlen(" WireGuard Test Suite on ") + strlen(utsname.sysname) + strlen(utsname.release) + strlen(utsname.machine);
-+ printf("\x1b[45m\x1b[33m\x1b[1m%*.s\x1b[0m\n\x1b[45m\x1b[33m\x1b[1m WireGuard Test Suite on %s %s %s \x1b[0m\n\x1b[45m\x1b[33m\x1b[1m%*.s\x1b[0m\n\n", len, "", utsname.sysname, utsname.release, utsname.machine, len, "");
-+}
-+
-+static void seed_rng(void)
-+{
-+ int fd;
-+ struct {
-+ int entropy_count;
-+ int buffer_size;
-+ unsigned char buffer[256];
-+ } entropy = {
-+ .entropy_count = sizeof(entropy.buffer) * 8,
-+ .buffer_size = sizeof(entropy.buffer),
-+ .buffer = "Adding real entropy is not actually important for these tests. Don't try this at home, kids!"
-+ };
-+
-+ if (mknod("/dev/urandom", S_IFCHR | 0644, makedev(1, 9)))
-+ panic("mknod(/dev/urandom)");
-+ fd = open("/dev/urandom", O_WRONLY);
-+ if (fd < 0)
-+ panic("open(urandom)");
-+ for (int i = 0; i < 256; ++i) {
-+ if (ioctl(fd, RNDADDENTROPY, &entropy) < 0)
-+ panic("ioctl(urandom)");
-+ }
-+ close(fd);
-+}
-+
-+static void mount_filesystems(void)
-+{
-+ pretty_message("[+] Mounting filesystems...");
-+ mkdir("/dev", 0755);
-+ mkdir("/proc", 0755);
-+ mkdir("/sys", 0755);
-+ mkdir("/tmp", 0755);
-+ mkdir("/run", 0755);
-+ mkdir("/var", 0755);
-+ if (mount("none", "/dev", "devtmpfs", 0, NULL))
-+ panic("devtmpfs mount");
-+ if (mount("none", "/proc", "proc", 0, NULL))
-+ panic("procfs mount");
-+ if (mount("none", "/sys", "sysfs", 0, NULL))
-+ panic("sysfs mount");
-+ if (mount("none", "/tmp", "tmpfs", 0, NULL))
-+ panic("tmpfs mount");
-+ if (mount("none", "/run", "tmpfs", 0, NULL))
-+ panic("tmpfs mount");
-+ if (mount("none", "/sys/kernel/debug", "debugfs", 0, NULL))
-+ ; /* Not a problem if it fails.*/
-+ if (symlink("/run", "/var/run"))
-+ panic("run symlink");
-+ if (symlink("/proc/self/fd", "/dev/fd"))
-+ panic("fd symlink");
-+}
-+
-+static void enable_logging(void)
-+{
-+ int fd;
-+ pretty_message("[+] Enabling logging...");
-+ fd = open("/proc/sys/kernel/printk", O_WRONLY);
-+ if (fd >= 0) {
-+ if (write(fd, "9\n", 2) != 2)
-+ panic("write(printk)");
-+ close(fd);
-+ }
-+ fd = open("/proc/sys/debug/exception-trace", O_WRONLY);
-+ if (fd >= 0) {
-+ if (write(fd, "1\n", 2) != 2)
-+ panic("write(exception-trace)");
-+ close(fd);
-+ }
-+ fd = open("/proc/sys/kernel/panic_on_warn", O_WRONLY);
-+ if (fd >= 0) {
-+ if (write(fd, "1\n", 2) != 2)
-+ panic("write(panic_on_warn)");
-+ close(fd);
-+ }
-+}
-+
-+static void kmod_selftests(void)
-+{
-+ FILE *file;
-+ char line[2048], *start, *pass;
-+ bool success = true;
-+ pretty_message("[+] Module self-tests:");
-+ file = fopen("/proc/kmsg", "r");
-+ if (!file)
-+ panic("fopen(kmsg)");
-+ if (fcntl(fileno(file), F_SETFL, O_NONBLOCK) < 0)
-+ panic("fcntl(kmsg, nonblock)");
-+ while (fgets(line, sizeof(line), file)) {
-+ start = strstr(line, "wireguard: ");
-+ if (!start)
-+ continue;
-+ start += 11;
-+ *strchrnul(start, '\n') = '\0';
-+ if (strstr(start, "www.wireguard.com"))
-+ break;
-+ pass = strstr(start, ": pass");
-+ if (!pass || pass[6] != '\0') {
-+ success = false;
-+ printf(" \x1b[31m* %s\x1b[0m\n", start);
-+ } else
-+ printf(" \x1b[32m* %s\x1b[0m\n", start);
-+ }
-+ fclose(file);
-+ if (!success) {
-+ puts("\x1b[31m\x1b[1m[-] Tests failed! \u2639\x1b[0m");
-+ poweroff();
-+ }
-+}
-+
-+static void launch_tests(void)
-+{
-+ char cmdline[4096], *success_dev;
-+ int status, fd;
-+ pid_t pid;
-+
-+ pretty_message("[+] Launching tests...");
-+ pid = fork();
-+ if (pid == -1)
-+ panic("fork");
-+ else if (pid == 0) {
-+ execl("/init.sh", "init", NULL);
-+ panic("exec");
-+ }
-+ if (waitpid(pid, &status, 0) < 0)
-+ panic("waitpid");
-+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
-+ pretty_message("[+] Tests successful! :-)");
-+ fd = open("/proc/cmdline", O_RDONLY);
-+ if (fd < 0)
-+ panic("open(/proc/cmdline)");
-+ if (read(fd, cmdline, sizeof(cmdline) - 1) <= 0)
-+ panic("read(/proc/cmdline)");
-+ cmdline[sizeof(cmdline) - 1] = '\0';
-+ for (success_dev = strtok(cmdline, " \n"); success_dev; success_dev = strtok(NULL, " \n")) {
-+ if (strncmp(success_dev, "wg.success=", 11))
-+ continue;
-+ memcpy(success_dev + 11 - 5, "/dev/", 5);
-+ success_dev += 11 - 5;
-+ break;
-+ }
-+ if (!success_dev || !strlen(success_dev))
-+ panic("Unable to find success device");
-+
-+ fd = open(success_dev, O_WRONLY);
-+ if (fd < 0)
-+ panic("open(success_dev)");
-+ if (write(fd, "success\n", 8) != 8)
-+ panic("write(success_dev)");
-+ close(fd);
-+ } else {
-+ const char *why = "unknown cause";
-+ int what = -1;
-+
-+ if (WIFEXITED(status)) {
-+ why = "exit code";
-+ what = WEXITSTATUS(status);
-+ } else if (WIFSIGNALED(status)) {
-+ why = "signal";
-+ what = WTERMSIG(status);
-+ }
-+ printf("\x1b[31m\x1b[1m[-] Tests failed with %s %d! \u2639\x1b[0m\n", why, what);
-+ }
-+}
-+
-+static void ensure_console(void)
-+{
-+ for (unsigned int i = 0; i < 1000; ++i) {
-+ int fd = open("/dev/console", O_RDWR);
-+ if (fd < 0) {
-+ usleep(50000);
-+ continue;
-+ }
-+ dup2(fd, 0);
-+ dup2(fd, 1);
-+ dup2(fd, 2);
-+ close(fd);
-+ if (write(1, "\0\0\0\0\n", 5) == 5)
-+ return;
-+ }
-+ panic("Unable to open console device");
-+}
-+
-+static void clear_leaks(void)
-+{
-+ int fd;
-+
-+ fd = open("/sys/kernel/debug/kmemleak", O_WRONLY);
-+ if (fd < 0)
-+ return;
-+ pretty_message("[+] Starting memory leak detection...");
-+ write(fd, "clear\n", 5);
-+ close(fd);
-+}
-+
-+static void check_leaks(void)
-+{
-+ int fd;
-+
-+ fd = open("/sys/kernel/debug/kmemleak", O_WRONLY);
-+ if (fd < 0)
-+ return;
-+ pretty_message("[+] Scanning for memory leaks...");
-+ sleep(2); /* Wait for any grace periods. */
-+ write(fd, "scan\n", 5);
-+ close(fd);
-+
-+ fd = open("/sys/kernel/debug/kmemleak", O_RDONLY);
-+ if (fd < 0)
-+ return;
-+ if (sendfile(1, fd, NULL, 0x7ffff000) > 0)
-+ panic("Memory leaks encountered");
-+ close(fd);
-+}
-+
-+int main(int argc, char *argv[])
-+{
-+ seed_rng();
-+ ensure_console();
-+ print_banner();
-+ mount_filesystems();
-+ kmod_selftests();
-+ enable_logging();
-+ clear_leaks();
-+ launch_tests();
-+ check_leaks();
-+ poweroff();
-+ return 1;
-+}
---- /dev/null
-+++ b/tools/testing/selftests/wireguard/qemu/kernel.config
-@@ -0,0 +1,86 @@
-+CONFIG_LOCALVERSION=""
-+CONFIG_NET=y
-+CONFIG_NETDEVICES=y
-+CONFIG_NET_CORE=y
-+CONFIG_NET_IPIP=y
-+CONFIG_DUMMY=y
-+CONFIG_VETH=y
-+CONFIG_MULTIUSER=y
-+CONFIG_NAMESPACES=y
-+CONFIG_NET_NS=y
-+CONFIG_UNIX=y
-+CONFIG_INET=y
-+CONFIG_IPV6=y
-+CONFIG_NETFILTER=y
-+CONFIG_NETFILTER_ADVANCED=y
-+CONFIG_NF_CONNTRACK=y
-+CONFIG_NF_NAT=y
-+CONFIG_NETFILTER_XTABLES=y
-+CONFIG_NETFILTER_XT_NAT=y
-+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
-+CONFIG_NF_CONNTRACK_IPV4=y
-+CONFIG_NF_NAT_IPV4=y
-+CONFIG_IP_NF_IPTABLES=y
-+CONFIG_IP_NF_FILTER=y
-+CONFIG_IP_NF_NAT=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IPV6_MULTIPLE_TABLES=y
-+CONFIG_TTY=y
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_SCRIPT=y
-+CONFIG_VDSO=y
-+CONFIG_VIRTUALIZATION=y
-+CONFIG_HYPERVISOR_GUEST=y
-+CONFIG_PARAVIRT=y
-+CONFIG_KVM_GUEST=y
-+CONFIG_PARAVIRT_SPINLOCKS=y
-+CONFIG_PRINTK=y
-+CONFIG_KALLSYMS=y
-+CONFIG_BUG=y
-+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
-+CONFIG_EMBEDDED=n
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_SHMEM=y
-+CONFIG_SLUB=y
-+CONFIG_SPARSEMEM_VMEMMAP=y
-+CONFIG_SMP=y
-+CONFIG_SCHED_SMT=y
-+CONFIG_SCHED_MC=y
-+CONFIG_NUMA=y
-+CONFIG_PREEMPT=y
-+CONFIG_NO_HZ=y
-+CONFIG_NO_HZ_IDLE=y
-+CONFIG_NO_HZ_FULL=n
-+CONFIG_HZ_PERIODIC=n
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_ARCH_RANDOM=y
-+CONFIG_FILE_LOCKING=y
-+CONFIG_POSIX_TIMERS=y
-+CONFIG_DEVTMPFS=y
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=15
-+CONFIG_PRINTK_TIME=y
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_LEGACY_VSYSCALL_NONE=y
-+CONFIG_KERNEL_GZIP=y
-+CONFIG_PANIC_ON_OOPS=y
-+CONFIG_BUG_ON_DATA_CORRUPTION=y
-+CONFIG_LOCKUP_DETECTOR=y
-+CONFIG_SOFTLOCKUP_DETECTOR=y
-+CONFIG_HARDLOCKUP_DETECTOR=y
-+CONFIG_WQ_WATCHDOG=y
-+CONFIG_DETECT_HUNG_TASK=y
-+CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y
-+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
-+CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
-+CONFIG_PANIC_TIMEOUT=-1
-+CONFIG_STACKTRACE=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GDB_SCRIPTS=y
-+CONFIG_WIREGUARD=y
-+CONFIG_WIREGUARD_DEBUG=y
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0074-wireguard-Kconfig-select-parent-dependency-for-crypt.patch b/target/linux/generic/backport-5.4/080-wireguard-0074-wireguard-Kconfig-select-parent-dependency-for-crypt.patch
deleted file mode 100644
index c2f8f77f53..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0074-wireguard-Kconfig-select-parent-dependency-for-crypt.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sun, 15 Dec 2019 22:08:01 +0100
-Subject: [PATCH] wireguard: Kconfig: select parent dependency for crypto
-
-commit d7c68a38bb4f9b7c1a2e4a772872c752ee5c44a6 upstream.
-
-This fixes the crypto selection submenu depenencies. Otherwise, we'd
-wind up issuing warnings in which certain dependencies we also select
-couldn't be satisfied. This condition was triggered by the addition of
-the test suite autobuilder in the previous commit.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/Kconfig | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -85,6 +85,8 @@ config WIREGUARD
- select CRYPTO_POLY1305_X86_64 if X86 && 64BIT
- select CRYPTO_BLAKE2S_X86 if X86 && 64BIT
- select CRYPTO_CURVE25519_X86 if X86 && 64BIT
-+ select ARM_CRYPTO if ARM
-+ select ARM64_CRYPTO if ARM64
- select CRYPTO_CHACHA20_NEON if (ARM || ARM64) && KERNEL_MODE_NEON
- select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON
- select CRYPTO_POLY1305_ARM if ARM
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0075-wireguard-global-fix-spelling-mistakes-in-comments.patch b/target/linux/generic/backport-5.4/080-wireguard-0075-wireguard-global-fix-spelling-mistakes-in-comments.patch
deleted file mode 100644
index 9b34e663a9..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0075-wireguard-global-fix-spelling-mistakes-in-comments.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Josh Soref <jsoref@gmail.com>
-Date: Sun, 15 Dec 2019 22:08:02 +0100
-Subject: [PATCH] wireguard: global: fix spelling mistakes in comments
-
-commit a2ec8b5706944d228181c8b91d815f41d6dd8e7b upstream.
-
-This fixes two spelling errors in source code comments.
-
-Signed-off-by: Josh Soref <jsoref@gmail.com>
-[Jason: rewrote commit message]
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 2 +-
- include/uapi/linux/wireguard.h | 8 ++++----
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -380,7 +380,7 @@ static void wg_packet_consume_data_done(
- /* We've already verified the Poly1305 auth tag, which means this packet
- * was not modified in transit. We can therefore tell the networking
- * stack that all checksums of every layer of encapsulation have already
-- * been checked "by the hardware" and therefore is unneccessary to check
-+ * been checked "by the hardware" and therefore is unnecessary to check
- * again in software.
- */
- skb->ip_summed = CHECKSUM_UNNECESSARY;
---- a/include/uapi/linux/wireguard.h
-+++ b/include/uapi/linux/wireguard.h
-@@ -18,13 +18,13 @@
- * one but not both of:
- *
- * WGDEVICE_A_IFINDEX: NLA_U32
-- * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMSIZ - 1
- *
- * The kernel will then return several messages (NLM_F_MULTI) containing the
- * following tree of nested items:
- *
- * WGDEVICE_A_IFINDEX: NLA_U32
-- * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMSIZ - 1
- * WGDEVICE_A_PRIVATE_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
- * WGDEVICE_A_PUBLIC_KEY: NLA_EXACT_LEN, len WG_KEY_LEN
- * WGDEVICE_A_LISTEN_PORT: NLA_U16
-@@ -77,7 +77,7 @@
- * WGDEVICE_A_IFINDEX and WGDEVICE_A_IFNAME:
- *
- * WGDEVICE_A_IFINDEX: NLA_U32
-- * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMESIZ - 1
-+ * WGDEVICE_A_IFNAME: NLA_NUL_STRING, maxlen IFNAMSIZ - 1
- * WGDEVICE_A_FLAGS: NLA_U32, 0 or WGDEVICE_F_REPLACE_PEERS if all current
- * peers should be removed prior to adding the list below.
- * WGDEVICE_A_PRIVATE_KEY: len WG_KEY_LEN, all zeros to remove
-@@ -121,7 +121,7 @@
- * filling in information not contained in the prior. Note that if
- * WGDEVICE_F_REPLACE_PEERS is specified in the first message, it probably
- * should not be specified in fragments that come after, so that the list
-- * of peers is only cleared the first time but appened after. Likewise for
-+ * of peers is only cleared the first time but appended after. Likewise for
- * peers, if WGPEER_F_REPLACE_ALLOWEDIPS is specified in the first message
- * of a peer, it likely should not be specified in subsequent fragments.
- *
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0076-wireguard-main-remove-unused-include-linux-version.h.patch b/target/linux/generic/backport-5.4/080-wireguard-0076-wireguard-main-remove-unused-include-linux-version.h.patch
deleted file mode 100644
index 3cc0b56c3e..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0076-wireguard-main-remove-unused-include-linux-version.h.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: YueHaibing <yuehaibing@huawei.com>
-Date: Sun, 15 Dec 2019 22:08:03 +0100
-Subject: [PATCH] wireguard: main: remove unused include <linux/version.h>
-
-commit 43967b6ff91e53bcce5ae08c16a0588a475b53a1 upstream.
-
-Remove <linux/version.h> from the includes for main.c, which is unused.
-
-Signed-off-by: YueHaibing <yuehaibing@huawei.com>
-[Jason: reworded commit message]
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/main.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/drivers/net/wireguard/main.c
-+++ b/drivers/net/wireguard/main.c
-@@ -12,7 +12,6 @@
-
- #include <uapi/linux/wireguard.h>
-
--#include <linux/version.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/genetlink.h>
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0077-wireguard-allowedips-use-kfree_rcu-instead-of-call_r.patch b/target/linux/generic/backport-5.4/080-wireguard-0077-wireguard-allowedips-use-kfree_rcu-instead-of-call_r.patch
deleted file mode 100644
index edd90484dd..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0077-wireguard-allowedips-use-kfree_rcu-instead-of-call_r.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Wei Yongjun <weiyongjun1@huawei.com>
-Date: Sun, 15 Dec 2019 22:08:04 +0100
-Subject: [PATCH] wireguard: allowedips: use kfree_rcu() instead of call_rcu()
-
-commit d89ee7d5c73af15c1c6f12b016cdf469742b5726 upstream.
-
-The callback function of call_rcu() just calls a kfree(), so we
-can use kfree_rcu() instead of call_rcu() + callback function.
-
-Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/allowedips.c | 7 +------
- 1 file changed, 1 insertion(+), 6 deletions(-)
-
---- a/drivers/net/wireguard/allowedips.c
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -31,11 +31,6 @@ static void copy_and_assign_cidr(struct
- #define CHOOSE_NODE(parent, key) \
- parent->bit[(key[parent->bit_at_a] >> parent->bit_at_b) & 1]
-
--static void node_free_rcu(struct rcu_head *rcu)
--{
-- kfree(container_of(rcu, struct allowedips_node, rcu));
--}
--
- static void push_rcu(struct allowedips_node **stack,
- struct allowedips_node __rcu *p, unsigned int *len)
- {
-@@ -112,7 +107,7 @@ static void walk_remove_by_peer(struct a
- if (!node->bit[0] || !node->bit[1]) {
- rcu_assign_pointer(*nptr, DEREF(
- &node->bit[!REF(node->bit[0])]));
-- call_rcu(&node->rcu, node_free_rcu);
-+ kfree_rcu(node, rcu);
- node = DEREF(nptr);
- }
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0078-wireguard-selftests-remove-ancient-kernel-compatibil.patch b/target/linux/generic/backport-5.4/080-wireguard-0078-wireguard-selftests-remove-ancient-kernel-compatibil.patch
deleted file mode 100644
index 6ff0dd9d10..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0078-wireguard-selftests-remove-ancient-kernel-compatibil.patch
+++ /dev/null
@@ -1,373 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 2 Jan 2020 17:47:49 +0100
-Subject: [PATCH] wireguard: selftests: remove ancient kernel compatibility
- code
-
-commit 9a69a4c8802adf642bc4a13d471b5a86b44ed434 upstream.
-
-Quite a bit of the test suite was designed to work with ancient kernels.
-Thankfully we no longer have to deal with this. This commit updates
-things that we can finally update and removes things that we can finally
-remove, to avoid the build-up of the last several years as a result of
-having to support ancient kernels. We can finally rely on suppress_
-prefixlength being available. On the build side of things, the no-PIE
-hack is no longer required, and we can bump some of the tools, repair
-our m68k and i686-kvm support, and get better coverage of the static
-branches used in the crypto lib and in udp_tunnel.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 11 +--
- .../testing/selftests/wireguard/qemu/Makefile | 82 ++++++++++---------
- .../selftests/wireguard/qemu/arch/m68k.config | 2 +-
- tools/testing/selftests/wireguard/qemu/init.c | 1 +
- .../selftests/wireguard/qemu/kernel.config | 2 +
- 5 files changed, 50 insertions(+), 48 deletions(-)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -37,7 +37,7 @@ n2() { pretty 2 "$*"; maybe_exec ip netn
- ip0() { pretty 0 "ip $*"; ip -n $netns0 "$@"; }
- ip1() { pretty 1 "ip $*"; ip -n $netns1 "$@"; }
- ip2() { pretty 2 "ip $*"; ip -n $netns2 "$@"; }
--sleep() { read -t "$1" -N 0 || true; }
-+sleep() { read -t "$1" -N 1 || true; }
- waitiperf() { pretty "${1//*-}" "wait for iperf:5201"; while [[ $(ss -N "$1" -tlp 'sport = 5201') != *iperf3* ]]; do sleep 0.1; done; }
- waitncatudp() { pretty "${1//*-}" "wait for udp:1111"; while [[ $(ss -N "$1" -ulp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
- waitncattcp() { pretty "${1//*-}" "wait for tcp:1111"; while [[ $(ss -N "$1" -tlp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
-@@ -294,12 +294,9 @@ ip1 -6 rule add table main suppress_pref
- ip1 -4 route add default dev wg0 table 51820
- ip1 -4 rule add not fwmark 51820 table 51820
- ip1 -4 rule add table main suppress_prefixlength 0
--# suppress_prefixlength only got added in 3.12, and we want to support 3.10+.
--if [[ $(ip1 -4 rule show all) == *suppress_prefixlength* ]]; then
-- # Flood the pings instead of sending just one, to trigger routing table reference counting bugs.
-- n1 ping -W 1 -c 100 -f 192.168.99.7
-- n1 ping -W 1 -c 100 -f abab::1111
--fi
-+# Flood the pings instead of sending just one, to trigger routing table reference counting bugs.
-+n1 ping -W 1 -c 100 -f 192.168.99.7
-+n1 ping -W 1 -c 100 -f abab::1111
-
- n0 iptables -t nat -F
- ip0 link del vethrc
---- a/tools/testing/selftests/wireguard/qemu/Makefile
-+++ b/tools/testing/selftests/wireguard/qemu/Makefile
-@@ -5,6 +5,7 @@
- PWD := $(shell pwd)
-
- CHOST := $(shell gcc -dumpmachine)
-+HOST_ARCH := $(firstword $(subst -, ,$(CHOST)))
- ifneq (,$(ARCH))
- CBUILD := $(subst -gcc,,$(lastword $(subst /, ,$(firstword $(wildcard $(foreach bindir,$(subst :, ,$(PATH)),$(bindir)/$(ARCH)-*-gcc))))))
- ifeq (,$(CBUILD))
-@@ -37,19 +38,19 @@ endef
- define file_download =
- $(DISTFILES_PATH)/$(1):
- mkdir -p $(DISTFILES_PATH)
-- flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -t inf --retry-on-http-error=404 -O $$@.tmp $(2)$(1) || rm -f $$@.tmp'
-+ flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp'
- if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi
- endef
-
--$(eval $(call tar_download,MUSL,musl,1.1.20,.tar.gz,https://www.musl-libc.org/releases/,44be8771d0e6c6b5f82dd15662eb2957c9a3173a19a8b49966ac0542bbd40d61))
-+$(eval $(call tar_download,MUSL,musl,1.1.24,.tar.gz,https://www.musl-libc.org/releases/,1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3))
- $(eval $(call tar_download,LIBMNL,libmnl,1.0.4,.tar.bz2,https://www.netfilter.org/projects/libmnl/files/,171f89699f286a5854b72b91d06e8f8e3683064c5901fb09d954a9ab6f551f81))
--$(eval $(call tar_download,IPERF,iperf,3.1.7,.tar.gz,http://downloads.es.net/pub/iperf/,a4ef73406fe92250602b8da2ae89ec53211f805df97a1d1d629db5a14043734f))
-+$(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c))
- $(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
--$(eval $(call tar_download,IPROUTE2,iproute2,5.1.0,.tar.gz,https://www.kernel.org/pub/linux/utils/net/iproute2/,9b43707d6075ecdca14803ca8ce0c8553848c49fa1586d12fd508d66577243f2))
--$(eval $(call tar_download,IPTABLES,iptables,1.6.1,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,0fc2d7bd5d7be11311726466789d4c65fb4c8e096c9182b56ce97440864f0cf5))
--$(eval $(call tar_download,NMAP,nmap,7.60,.tar.bz2,https://nmap.org/dist/,a8796ecc4fa6c38aad6139d9515dc8113023a82e9d787e5a5fb5fa1b05516f21))
--$(eval $(call tar_download,IPUTILS,iputils,s20161105,.tar.gz,https://github.com/iputils/iputils/archive/s20161105.tar.gz/#,f813092f03d17294fd23544b129b95cdb87fe19f7970a51908a6b88509acad8a))
--$(eval $(call tar_download,WIREGUARD_TOOLS,WireGuard,0.0.20191212,.tar.xz,https://git.zx2c4.com/WireGuard/snapshot/,b0d718380f7a8822b2f12d75e462fa4eafa3a77871002981f367cd4fe2a1b071))
-+$(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae))
-+$(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c))
-+$(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa))
-+$(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))
-+$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20191226,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,aa8af0fdc9872d369d8c890a84dbc2a2466b55795dccd5b47721b2d97644b04f))
-
- 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))
-@@ -59,23 +60,21 @@ export CFLAGS ?= -O3 -pipe
- export LDFLAGS ?=
- export CPPFLAGS := -I$(BUILD_PATH)/include
-
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- CROSS_COMPILE_FLAG := --host=$(CHOST)
--NOPIE_GCC := gcc -fno-PIE
- CFLAGS += -march=native
- STRIP := strip
- else
- $(info Cross compilation: building for $(CBUILD) using $(CHOST))
- CROSS_COMPILE_FLAG := --build=$(CBUILD) --host=$(CHOST)
- export CROSS_COMPILE=$(CBUILD)-
--NOPIE_GCC := $(CBUILD)-gcc -fno-PIE
- STRIP := $(CBUILD)-strip
- endif
- ifeq ($(ARCH),aarch64)
- QEMU_ARCH := aarch64
- KERNEL_ARCH := arm64
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
- else
- QEMU_MACHINE := -cpu cortex-a53 -machine virt
-@@ -85,7 +84,7 @@ else ifeq ($(ARCH),aarch64_be)
- QEMU_ARCH := aarch64
- KERNEL_ARCH := arm64
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm64/boot/Image
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
- else
- QEMU_MACHINE := -cpu cortex-a53 -machine virt
-@@ -95,7 +94,7 @@ else ifeq ($(ARCH),arm)
- QEMU_ARCH := arm
- KERNEL_ARCH := arm
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
- else
- QEMU_MACHINE := -cpu cortex-a15 -machine virt
-@@ -105,7 +104,7 @@ else ifeq ($(ARCH),armeb)
- QEMU_ARCH := arm
- KERNEL_ARCH := arm
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/arm/boot/zImage
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine virt,gic_version=host,accel=kvm
- else
- QEMU_MACHINE := -cpu cortex-a15 -machine virt
-@@ -116,7 +115,7 @@ else ifeq ($(ARCH),x86_64)
- QEMU_ARCH := x86_64
- KERNEL_ARCH := x86_64
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine q35,accel=kvm
- else
- QEMU_MACHINE := -cpu Skylake-Server -machine q35
-@@ -126,7 +125,7 @@ else ifeq ($(ARCH),i686)
- QEMU_ARCH := i386
- KERNEL_ARCH := x86
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/x86/boot/bzImage
--ifeq ($(subst i686,x86_64,$(CBUILD)),$(CHOST))
-+ifeq ($(subst x86_64,i686,$(HOST_ARCH)),$(ARCH))
- QEMU_MACHINE := -cpu host -machine q35,accel=kvm
- else
- QEMU_MACHINE := -cpu coreduo -machine q35
-@@ -136,7 +135,7 @@ else ifeq ($(ARCH),mips64)
- QEMU_ARCH := mips64
- KERNEL_ARCH := mips
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine malta,accel=kvm
- CFLAGS += -EB
- else
-@@ -147,7 +146,7 @@ else ifeq ($(ARCH),mips64el)
- QEMU_ARCH := mips64el
- KERNEL_ARCH := mips
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine malta,accel=kvm
- CFLAGS += -EL
- else
-@@ -158,7 +157,7 @@ else ifeq ($(ARCH),mips)
- QEMU_ARCH := mips
- KERNEL_ARCH := mips
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine malta,accel=kvm
- CFLAGS += -EB
- else
-@@ -169,7 +168,7 @@ else ifeq ($(ARCH),mipsel)
- QEMU_ARCH := mipsel
- KERNEL_ARCH := mips
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host -machine malta,accel=kvm
- CFLAGS += -EL
- else
-@@ -180,7 +179,7 @@ else ifeq ($(ARCH),powerpc64le)
- QEMU_ARCH := ppc64
- KERNEL_ARCH := powerpc
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host,accel=kvm -machine pseries
- else
- QEMU_MACHINE := -machine pseries
-@@ -190,7 +189,7 @@ else ifeq ($(ARCH),powerpc)
- QEMU_ARCH := ppc
- KERNEL_ARCH := powerpc
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/arch/powerpc/boot/uImage
--ifeq ($(CHOST),$(CBUILD))
-+ifeq ($(HOST_ARCH),$(ARCH))
- QEMU_MACHINE := -cpu host,accel=kvm -machine ppce500
- else
- QEMU_MACHINE := -machine ppce500
-@@ -200,10 +199,11 @@ else ifeq ($(ARCH),m68k)
- QEMU_ARCH := m68k
- KERNEL_ARCH := m68k
- KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
--ifeq ($(CHOST),$(CBUILD))
--QEMU_MACHINE := -cpu host,accel=kvm -machine q800
-+KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/m68k.config)
-+ifeq ($(HOST_ARCH),$(ARCH))
-+QEMU_MACHINE := -cpu host,accel=kvm -machine q800 -smp 1 -append $(KERNEL_CMDLINE)
- else
--QEMU_MACHINE := -machine q800
-+QEMU_MACHINE := -machine q800 -smp 1 -append $(KERNEL_CMDLINE)
- endif
- else
- $(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64le, powerpc, m68k)
-@@ -238,14 +238,14 @@ $(BUILD_PATH)/init-cpio-spec.txt:
- echo "nod /dev/console 644 0 0 c 5 1" >> $@
- echo "dir /bin 755 0 0" >> $@
- echo "file /bin/iperf3 $(IPERF_PATH)/src/iperf3 755 0 0" >> $@
-- echo "file /bin/wg $(WIREGUARD_TOOLS_PATH)/src/tools/wg 755 0 0" >> $@
-+ echo "file /bin/wg $(WIREGUARD_TOOLS_PATH)/src/wg 755 0 0" >> $@
- echo "file /bin/bash $(BASH_PATH)/bash 755 0 0" >> $@
- echo "file /bin/ip $(IPROUTE2_PATH)/ip/ip 755 0 0" >> $@
- echo "file /bin/ss $(IPROUTE2_PATH)/misc/ss 755 0 0" >> $@
- echo "file /bin/ping $(IPUTILS_PATH)/ping 755 0 0" >> $@
- echo "file /bin/ncat $(NMAP_PATH)/ncat/ncat 755 0 0" >> $@
-- echo "file /bin/xtables-multi $(IPTABLES_PATH)/iptables/xtables-multi 755 0 0" >> $@
-- echo "slink /bin/iptables xtables-multi 777 0 0" >> $@
-+ echo "file /bin/xtables-legacy-multi $(IPTABLES_PATH)/iptables/xtables-legacy-multi 755 0 0" >> $@
-+ echo "slink /bin/iptables xtables-legacy-multi 777 0 0" >> $@
- echo "slink /bin/ping6 ping 777 0 0" >> $@
- echo "dir /lib 755 0 0" >> $@
- echo "file /lib/libc.so $(MUSL_PATH)/lib/libc.so 755 0 0" >> $@
-@@ -260,8 +260,8 @@ $(KERNEL_BUILD_PATH)/.config: kernel.con
- cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config $(KERNEL_BUILD_PATH)/minimal.config
- $(if $(findstring yes,$(DEBUG_KERNEL)),cp debug.config $(KERNEL_BUILD_PATH) && cd $(KERNEL_BUILD_PATH) && ARCH=$(KERNEL_ARCH) $(KERNEL_PATH)/scripts/kconfig/merge_config.sh -n $(KERNEL_BUILD_PATH)/.config debug.config,)
-
--$(KERNEL_BZIMAGE): $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(MUSL_PATH)/lib/libc.so $(IPERF_PATH)/src/iperf3 $(IPUTILS_PATH)/ping $(BASH_PATH)/bash $(IPROUTE2_PATH)/misc/ss $(IPROUTE2_PATH)/ip/ip $(IPTABLES_PATH)/iptables/xtables-multi $(NMAP_PATH)/ncat/ncat $(WIREGUARD_TOOLS_PATH)/src/tools/wg $(BUILD_PATH)/init ../netns.sh $(WIREGUARD_SOURCES)
-- $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) CC="$(NOPIE_GCC)"
-+$(KERNEL_BZIMAGE): $(KERNEL_BUILD_PATH)/.config $(BUILD_PATH)/init-cpio-spec.txt $(MUSL_PATH)/lib/libc.so $(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)
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
-
- $(BUILD_PATH)/include/linux/.installed: | $(KERNEL_BUILD_PATH)/.config
- $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) INSTALL_HDR_PATH=$(BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) headers_install
-@@ -280,7 +280,7 @@ $(BUILD_PATH)/include/.installed: $(MUSL
-
- $(MUSL_CC): $(MUSL_PATH)/lib/libc.so
- sh $(MUSL_PATH)/tools/musl-gcc.specs.sh $(BUILD_PATH)/include $(MUSL_PATH)/lib /lib/ld-linux.so.1 > $(BUILD_PATH)/musl-gcc.specs
-- printf '#!/bin/sh\nexec "$(REAL_CC)" --specs="$(BUILD_PATH)/musl-gcc.specs" -fno-stack-protector -no-pie "$$@"\n' > $(BUILD_PATH)/musl-gcc
-+ printf '#!/bin/sh\nexec "$(REAL_CC)" --specs="$(BUILD_PATH)/musl-gcc.specs" "$$@"\n' > $(BUILD_PATH)/musl-gcc
- chmod +x $(BUILD_PATH)/musl-gcc
-
- $(IPERF_PATH)/.installed: $(IPERF_TAR)
-@@ -291,7 +291,7 @@ $(IPERF_PATH)/.installed: $(IPERF_TAR)
- touch $@
-
- $(IPERF_PATH)/src/iperf3: | $(IPERF_PATH)/.installed $(USERSPACE_DEPS)
-- cd $(IPERF_PATH) && CFLAGS="$(CFLAGS) -D_GNU_SOURCE" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared
-+ cd $(IPERF_PATH) && CFLAGS="$(CFLAGS) -D_GNU_SOURCE" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --with-openssl=no
- $(MAKE) -C $(IPERF_PATH)
- $(STRIP) -s $@
-
-@@ -308,8 +308,8 @@ $(WIREGUARD_TOOLS_PATH)/.installed: $(WI
- flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
- touch $@
-
--$(WIREGUARD_TOOLS_PATH)/src/tools/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-- LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src/tools LIBMNL_CFLAGS="-I$(LIBMNL_PATH)/include" LIBMNL_LDLIBS="-lmnl" wg
-+$(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+ LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src LIBMNL_CFLAGS="-I$(LIBMNL_PATH)/include" LIBMNL_LDLIBS="-lmnl" wg
- $(STRIP) -s $@
-
- $(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS)
-@@ -323,7 +323,8 @@ $(IPUTILS_PATH)/.installed: $(IPUTILS_TA
- touch $@
-
- $(IPUTILS_PATH)/ping: | $(IPUTILS_PATH)/.installed $(USERSPACE_DEPS)
-- $(MAKE) -C $(IPUTILS_PATH) USE_CAP=no USE_IDN=no USE_NETTLE=no USE_CRYPTO=no ping
-+ sed -i /atexit/d $(IPUTILS_PATH)/ping.c
-+ cd $(IPUTILS_PATH) && $(CC) $(CFLAGS) -std=c99 -o $@ ping.c ping_common.c ping6_common.c iputils_common.c -D_GNU_SOURCE -D'IPUTILS_VERSION(f)=f' -lresolv $(LDFLAGS)
- $(STRIP) -s $@
-
- $(BASH_PATH)/.installed: $(BASH_TAR)
-@@ -357,7 +358,7 @@ $(IPTABLES_PATH)/.installed: $(IPTABLES_
- sed -i -e "/nfnetlink=[01]/s:=[01]:=0:" -e "/nfconntrack=[01]/s:=[01]:=0:" $(IPTABLES_PATH)/configure
- touch $@
-
--$(IPTABLES_PATH)/iptables/xtables-multi: | $(IPTABLES_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-+$(IPTABLES_PATH)/iptables/xtables-legacy-multi: | $(IPTABLES_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
- cd $(IPTABLES_PATH) && PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --with-kernel=$(BUILD_PATH)/include
- $(MAKE) -C $(IPTABLES_PATH)
- $(STRIP) -s $@
-@@ -368,8 +369,9 @@ $(NMAP_PATH)/.installed: $(NMAP_TAR)
- touch $@
-
- $(NMAP_PATH)/ncat/ncat: | $(NMAP_PATH)/.installed $(USERSPACE_DEPS)
-- cd $(NMAP_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --without-ndiff --without-zenmap --without-nping --with-libpcap=included --with-libpcre=included --with-libdnet=included --without-liblua --with-liblinear=included --without-nmap-update --without-openssl --with-pcap=linux
-- $(MAKE) -C $(NMAP_PATH) build-ncat
-+ cd $(NMAP_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --without-ndiff --without-zenmap --without-nping --with-libpcap=included --with-libpcre=included --with-libdnet=included --without-liblua --with-liblinear=included --without-nmap-update --without-openssl --with-pcap=linux --without-libssh
-+ $(MAKE) -C $(NMAP_PATH)/libpcap
-+ $(MAKE) -C $(NMAP_PATH)/ncat
- $(STRIP) -s $@
-
- clean:
-@@ -379,7 +381,7 @@ distclean: clean
- rm -rf $(DISTFILES_PATH)
-
- menuconfig: $(KERNEL_BUILD_PATH)/.config
-- $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) CC="$(NOPIE_GCC)" menuconfig
-+ $(MAKE) -C $(KERNEL_PATH) O=$(KERNEL_BUILD_PATH) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) menuconfig
-
- .PHONY: qemu build clean distclean menuconfig
- .DELETE_ON_ERROR:
---- a/tools/testing/selftests/wireguard/qemu/arch/m68k.config
-+++ b/tools/testing/selftests/wireguard/qemu/arch/m68k.config
-@@ -1,9 +1,9 @@
- CONFIG_MMU=y
-+CONFIG_M68KCLASSIC=y
- CONFIG_M68040=y
- CONFIG_MAC=y
- CONFIG_SERIAL_PMACZILOG=y
- CONFIG_SERIAL_PMACZILOG_TTYS=y
- CONFIG_SERIAL_PMACZILOG_CONSOLE=y
--CONFIG_CMDLINE_BOOL=y
- CONFIG_CMDLINE="console=ttyS0 wg.success=ttyS1"
- CONFIG_FRAME_WARN=1024
---- a/tools/testing/selftests/wireguard/qemu/init.c
-+++ b/tools/testing/selftests/wireguard/qemu/init.c
-@@ -21,6 +21,7 @@
- #include <sys/reboot.h>
- #include <sys/utsname.h>
- #include <sys/sendfile.h>
-+#include <sys/sysmacros.h>
- #include <linux/random.h>
- #include <linux/version.h>
-
---- a/tools/testing/selftests/wireguard/qemu/kernel.config
-+++ b/tools/testing/selftests/wireguard/qemu/kernel.config
-@@ -39,6 +39,7 @@ CONFIG_PRINTK=y
- CONFIG_KALLSYMS=y
- CONFIG_BUG=y
- CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
-+CONFIG_JUMP_LABEL=y
- CONFIG_EMBEDDED=n
- CONFIG_BASE_FULL=y
- CONFIG_FUTEX=y
-@@ -55,6 +56,7 @@ CONFIG_NO_HZ_IDLE=y
- CONFIG_NO_HZ_FULL=n
- CONFIG_HZ_PERIODIC=n
- CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_COMPAT_32BIT_TIME=y
- CONFIG_ARCH_RANDOM=y
- CONFIG_FILE_LOCKING=y
- CONFIG_POSIX_TIMERS=y
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0079-wireguard-queueing-do-not-account-for-pfmemalloc-whe.patch b/target/linux/generic/backport-5.4/080-wireguard-0079-wireguard-queueing-do-not-account-for-pfmemalloc-whe.patch
deleted file mode 100644
index fb03b1b1a6..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0079-wireguard-queueing-do-not-account-for-pfmemalloc-whe.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 2 Jan 2020 17:47:50 +0100
-Subject: [PATCH] wireguard: queueing: do not account for pfmemalloc when
- clearing skb header
-
-commit 04d2ea92a18417619182cbb79063f154892b0150 upstream.
-
-Before 8b7008620b84 ("net: Don't copy pfmemalloc flag in __copy_skb_
-header()"), the pfmemalloc flag used to be between headers_start and
-headers_end, which is a region we clear when preparing the packet for
-encryption/decryption. This is a parameter we certainly want to
-preserve, which is why 8b7008620b84 moved it out of there. The code here
-was written in a world before 8b7008620b84, though, where we had to
-manually account for it. This commit brings things up to speed.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/queueing.h | 3 ---
- 1 file changed, 3 deletions(-)
-
---- a/drivers/net/wireguard/queueing.h
-+++ b/drivers/net/wireguard/queueing.h
-@@ -83,13 +83,10 @@ static inline __be16 wg_skb_examine_untr
-
- static inline void wg_reset_packet(struct sk_buff *skb)
- {
-- const int pfmemalloc = skb->pfmemalloc;
--
- skb_scrub_packet(skb, true);
- memset(&skb->headers_start, 0,
- offsetof(struct sk_buff, headers_end) -
- offsetof(struct sk_buff, headers_start));
-- skb->pfmemalloc = pfmemalloc;
- skb->queue_mapping = 0;
- skb->nohdr = 0;
- skb->peeked = 0;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0080-wireguard-socket-mark-skbs-as-not-on-list-when-recei.patch b/target/linux/generic/backport-5.4/080-wireguard-0080-wireguard-socket-mark-skbs-as-not-on-list-when-recei.patch
deleted file mode 100644
index 779491c8db..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0080-wireguard-socket-mark-skbs-as-not-on-list-when-recei.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 2 Jan 2020 17:47:51 +0100
-Subject: [PATCH] wireguard: socket: mark skbs as not on list when receiving
- via gro
-
-commit 736775d06bac60d7a353e405398b48b2bd8b1e54 upstream.
-
-Certain drivers will pass gro skbs to udp, at which point the udp driver
-simply iterates through them and passes them off to encap_rcv, which is
-where we pick up. At the moment, we're not attempting to coalesce these
-into bundles, but we also don't want to wind up having cascaded lists of
-skbs treated separately. The right behavior here, then, is to just mark
-each incoming one as not on a list. This can be seen in practice, for
-example, with Qualcomm's rmnet_perf driver.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Tested-by: Yaroslav Furman <yaro330@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/socket.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -333,6 +333,7 @@ static int wg_receive(struct sock *sk, s
- wg = sk->sk_user_data;
- if (unlikely(!wg))
- goto err;
-+ skb_mark_not_on_list(skb);
- wg_packet_receive(wg, skb);
- return 0;
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0081-wireguard-allowedips-fix-use-after-free-in-root_remo.patch b/target/linux/generic/backport-5.4/080-wireguard-0081-wireguard-allowedips-fix-use-after-free-in-root_remo.patch
deleted file mode 100644
index e77ab5834a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0081-wireguard-allowedips-fix-use-after-free-in-root_remo.patch
+++ /dev/null
@@ -1,164 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Tue, 4 Feb 2020 22:17:25 +0100
-Subject: [PATCH] wireguard: allowedips: fix use-after-free in
- root_remove_peer_lists
-
-commit 9981159fc3b677b357f84e069a11de5a5ec8a2a8 upstream.
-
-In the unlikely case a new node could not be allocated, we need to
-remove @newnode from @peer->allowedips_list before freeing it.
-
-syzbot reported:
-
-BUG: KASAN: use-after-free in __list_del_entry_valid+0xdc/0xf5 lib/list_debug.c:54
-Read of size 8 at addr ffff88809881a538 by task syz-executor.4/30133
-
-CPU: 0 PID: 30133 Comm: syz-executor.4 Not tainted 5.5.0-syzkaller #0
-Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
-Call Trace:
- __dump_stack lib/dump_stack.c:77 [inline]
- dump_stack+0x197/0x210 lib/dump_stack.c:118
- print_address_description.constprop.0.cold+0xd4/0x30b mm/kasan/report.c:374
- __kasan_report.cold+0x1b/0x32 mm/kasan/report.c:506
- kasan_report+0x12/0x20 mm/kasan/common.c:639
- __asan_report_load8_noabort+0x14/0x20 mm/kasan/generic_report.c:135
- __list_del_entry_valid+0xdc/0xf5 lib/list_debug.c:54
- __list_del_entry include/linux/list.h:132 [inline]
- list_del include/linux/list.h:146 [inline]
- root_remove_peer_lists+0x24f/0x4b0 drivers/net/wireguard/allowedips.c:65
- wg_allowedips_free+0x232/0x390 drivers/net/wireguard/allowedips.c:300
- wg_peer_remove_all+0xd5/0x620 drivers/net/wireguard/peer.c:187
- wg_set_device+0xd01/0x1350 drivers/net/wireguard/netlink.c:542
- genl_family_rcv_msg_doit net/netlink/genetlink.c:672 [inline]
- genl_family_rcv_msg net/netlink/genetlink.c:717 [inline]
- genl_rcv_msg+0x67d/0xea0 net/netlink/genetlink.c:734
- netlink_rcv_skb+0x177/0x450 net/netlink/af_netlink.c:2477
- genl_rcv+0x29/0x40 net/netlink/genetlink.c:745
- netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
- netlink_unicast+0x59e/0x7e0 net/netlink/af_netlink.c:1328
- netlink_sendmsg+0x91c/0xea0 net/netlink/af_netlink.c:1917
- sock_sendmsg_nosec net/socket.c:652 [inline]
- sock_sendmsg+0xd7/0x130 net/socket.c:672
- ____sys_sendmsg+0x753/0x880 net/socket.c:2343
- ___sys_sendmsg+0x100/0x170 net/socket.c:2397
- __sys_sendmsg+0x105/0x1d0 net/socket.c:2430
- __do_sys_sendmsg net/socket.c:2439 [inline]
- __se_sys_sendmsg net/socket.c:2437 [inline]
- __x64_sys_sendmsg+0x78/0xb0 net/socket.c:2437
- do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294
- entry_SYSCALL_64_after_hwframe+0x49/0xbe
-RIP: 0033:0x45b399
-Code: ad b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00
-RSP: 002b:00007f99a9bcdc78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
-RAX: ffffffffffffffda RBX: 00007f99a9bce6d4 RCX: 000000000045b399
-RDX: 0000000000000000 RSI: 0000000020001340 RDI: 0000000000000003
-RBP: 000000000075bf20 R08: 0000000000000000 R09: 0000000000000000
-R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000004
-R13: 00000000000009ba R14: 00000000004cb2b8 R15: 0000000000000009
-
-Allocated by task 30103:
- save_stack+0x23/0x90 mm/kasan/common.c:72
- set_track mm/kasan/common.c:80 [inline]
- __kasan_kmalloc mm/kasan/common.c:513 [inline]
- __kasan_kmalloc.constprop.0+0xcf/0xe0 mm/kasan/common.c:486
- kasan_kmalloc+0x9/0x10 mm/kasan/common.c:527
- kmem_cache_alloc_trace+0x158/0x790 mm/slab.c:3551
- kmalloc include/linux/slab.h:556 [inline]
- kzalloc include/linux/slab.h:670 [inline]
- add+0x70a/0x1970 drivers/net/wireguard/allowedips.c:236
- wg_allowedips_insert_v4+0xf6/0x160 drivers/net/wireguard/allowedips.c:320
- set_allowedip drivers/net/wireguard/netlink.c:343 [inline]
- set_peer+0xfb9/0x1150 drivers/net/wireguard/netlink.c:468
- wg_set_device+0xbd4/0x1350 drivers/net/wireguard/netlink.c:591
- genl_family_rcv_msg_doit net/netlink/genetlink.c:672 [inline]
- genl_family_rcv_msg net/netlink/genetlink.c:717 [inline]
- genl_rcv_msg+0x67d/0xea0 net/netlink/genetlink.c:734
- netlink_rcv_skb+0x177/0x450 net/netlink/af_netlink.c:2477
- genl_rcv+0x29/0x40 net/netlink/genetlink.c:745
- netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
- netlink_unicast+0x59e/0x7e0 net/netlink/af_netlink.c:1328
- netlink_sendmsg+0x91c/0xea0 net/netlink/af_netlink.c:1917
- sock_sendmsg_nosec net/socket.c:652 [inline]
- sock_sendmsg+0xd7/0x130 net/socket.c:672
- ____sys_sendmsg+0x753/0x880 net/socket.c:2343
- ___sys_sendmsg+0x100/0x170 net/socket.c:2397
- __sys_sendmsg+0x105/0x1d0 net/socket.c:2430
- __do_sys_sendmsg net/socket.c:2439 [inline]
- __se_sys_sendmsg net/socket.c:2437 [inline]
- __x64_sys_sendmsg+0x78/0xb0 net/socket.c:2437
- do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294
- entry_SYSCALL_64_after_hwframe+0x49/0xbe
-
-Freed by task 30103:
- save_stack+0x23/0x90 mm/kasan/common.c:72
- set_track mm/kasan/common.c:80 [inline]
- kasan_set_free_info mm/kasan/common.c:335 [inline]
- __kasan_slab_free+0x102/0x150 mm/kasan/common.c:474
- kasan_slab_free+0xe/0x10 mm/kasan/common.c:483
- __cache_free mm/slab.c:3426 [inline]
- kfree+0x10a/0x2c0 mm/slab.c:3757
- add+0x12d2/0x1970 drivers/net/wireguard/allowedips.c:266
- wg_allowedips_insert_v4+0xf6/0x160 drivers/net/wireguard/allowedips.c:320
- set_allowedip drivers/net/wireguard/netlink.c:343 [inline]
- set_peer+0xfb9/0x1150 drivers/net/wireguard/netlink.c:468
- wg_set_device+0xbd4/0x1350 drivers/net/wireguard/netlink.c:591
- genl_family_rcv_msg_doit net/netlink/genetlink.c:672 [inline]
- genl_family_rcv_msg net/netlink/genetlink.c:717 [inline]
- genl_rcv_msg+0x67d/0xea0 net/netlink/genetlink.c:734
- netlink_rcv_skb+0x177/0x450 net/netlink/af_netlink.c:2477
- genl_rcv+0x29/0x40 net/netlink/genetlink.c:745
- netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
- netlink_unicast+0x59e/0x7e0 net/netlink/af_netlink.c:1328
- netlink_sendmsg+0x91c/0xea0 net/netlink/af_netlink.c:1917
- sock_sendmsg_nosec net/socket.c:652 [inline]
- sock_sendmsg+0xd7/0x130 net/socket.c:672
- ____sys_sendmsg+0x753/0x880 net/socket.c:2343
- ___sys_sendmsg+0x100/0x170 net/socket.c:2397
- __sys_sendmsg+0x105/0x1d0 net/socket.c:2430
- __do_sys_sendmsg net/socket.c:2439 [inline]
- __se_sys_sendmsg net/socket.c:2437 [inline]
- __x64_sys_sendmsg+0x78/0xb0 net/socket.c:2437
- do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294
- entry_SYSCALL_64_after_hwframe+0x49/0xbe
-
-The buggy address belongs to the object at ffff88809881a500
- which belongs to the cache kmalloc-64 of size 64
-The buggy address is located 56 bytes inside of
- 64-byte region [ffff88809881a500, ffff88809881a540)
-The buggy address belongs to the page:
-page:ffffea0002620680 refcount:1 mapcount:0 mapping:ffff8880aa400380 index:0x0
-raw: 00fffe0000000200 ffffea000250b748 ffffea000254bac8 ffff8880aa400380
-raw: 0000000000000000 ffff88809881a000 0000000100000020 0000000000000000
-page dumped because: kasan: bad access detected
-
-Memory state around the buggy address:
- ffff88809881a400: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
- ffff88809881a480: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc
->ffff88809881a500: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
- ^
- ffff88809881a580: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
- ffff88809881a600: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Reported-by: syzbot <syzkaller@googlegroups.com>
-Cc: Jason A. Donenfeld <Jason@zx2c4.com>
-Cc: wireguard@lists.zx2c4.com
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/allowedips.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireguard/allowedips.c
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -263,6 +263,7 @@ static int add(struct allowedips_node __
- } else {
- node = kzalloc(sizeof(*node), GFP_KERNEL);
- if (unlikely(!node)) {
-+ list_del(&newnode->peer_list);
- kfree(newnode);
- return -ENOMEM;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0082-wireguard-noise-reject-peers-with-low-order-public-k.patch b/target/linux/generic/backport-5.4/080-wireguard-0082-wireguard-noise-reject-peers-with-low-order-public-k.patch
deleted file mode 100644
index 55bb276118..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0082-wireguard-noise-reject-peers-with-low-order-public-k.patch
+++ /dev/null
@@ -1,233 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 4 Feb 2020 22:17:26 +0100
-Subject: [PATCH] wireguard: noise: reject peers with low order public keys
-
-commit ec31c2676a10e064878927b243fada8c2fb0c03c upstream.
-
-Our static-static calculation returns a failure if the public key is of
-low order. We check for this when peers are added, and don't allow them
-to be added if they're low order, except in the case where we haven't
-yet been given a private key. In that case, we would defer the removal
-of the peer until we're given a private key, since at that point we're
-doing new static-static calculations which incur failures we can act on.
-This meant, however, that we wound up removing peers rather late in the
-configuration flow.
-
-Syzkaller points out that peer_remove calls flush_workqueue, which in
-turn might then wait for sending a handshake initiation to complete.
-Since handshake initiation needs the static identity lock, holding the
-static identity lock while calling peer_remove can result in a rare
-deadlock. We have precisely this case in this situation of late-stage
-peer removal based on an invalid public key. We can't drop the lock when
-removing, because then incoming handshakes might interact with a bogus
-static-static calculation.
-
-While the band-aid patch for this would involve breaking up the peer
-removal into two steps like wg_peer_remove_all does, in order to solve
-the locking issue, there's actually a much more elegant way of fixing
-this:
-
-If the static-static calculation succeeds with one private key, it
-*must* succeed with all others, because all 32-byte strings map to valid
-private keys, thanks to clamping. That means we can get rid of this
-silly dance and locking headaches of removing peers late in the
-configuration flow, and instead just reject them early on, regardless of
-whether the device has yet been assigned a private key. For the case
-where the device doesn't yet have a private key, we safely use zeros
-just for the purposes of checking for low order points by way of
-checking the output of the calculation.
-
-The following PoC will trigger the deadlock:
-
-ip link add wg0 type wireguard
-ip addr add 10.0.0.1/24 dev wg0
-ip link set wg0 up
-ping -f 10.0.0.2 &
-while true; do
- wg set wg0 private-key /dev/null peer AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= allowed-ips 10.0.0.0/24 endpoint 10.0.0.3:1234
- wg set wg0 private-key <(echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=)
-done
-
-[ 0.949105] ======================================================
-[ 0.949550] WARNING: possible circular locking dependency detected
-[ 0.950143] 5.5.0-debug+ #18 Not tainted
-[ 0.950431] ------------------------------------------------------
-[ 0.950959] wg/89 is trying to acquire lock:
-[ 0.951252] ffff8880333e2128 ((wq_completion)wg-kex-wg0){+.+.}, at: flush_workqueue+0xe3/0x12f0
-[ 0.951865]
-[ 0.951865] but task is already holding lock:
-[ 0.952280] ffff888032819bc0 (&wg->static_identity.lock){++++}, at: wg_set_device+0x95d/0xcc0
-[ 0.953011]
-[ 0.953011] which lock already depends on the new lock.
-[ 0.953011]
-[ 0.953651]
-[ 0.953651] the existing dependency chain (in reverse order) is:
-[ 0.954292]
-[ 0.954292] -> #2 (&wg->static_identity.lock){++++}:
-[ 0.954804] lock_acquire+0x127/0x350
-[ 0.955133] down_read+0x83/0x410
-[ 0.955428] wg_noise_handshake_create_initiation+0x97/0x700
-[ 0.955885] wg_packet_send_handshake_initiation+0x13a/0x280
-[ 0.956401] wg_packet_handshake_send_worker+0x10/0x20
-[ 0.956841] process_one_work+0x806/0x1500
-[ 0.957167] worker_thread+0x8c/0xcb0
-[ 0.957549] kthread+0x2ee/0x3b0
-[ 0.957792] ret_from_fork+0x24/0x30
-[ 0.958234]
-[ 0.958234] -> #1 ((work_completion)(&peer->transmit_handshake_work)){+.+.}:
-[ 0.958808] lock_acquire+0x127/0x350
-[ 0.959075] process_one_work+0x7ab/0x1500
-[ 0.959369] worker_thread+0x8c/0xcb0
-[ 0.959639] kthread+0x2ee/0x3b0
-[ 0.959896] ret_from_fork+0x24/0x30
-[ 0.960346]
-[ 0.960346] -> #0 ((wq_completion)wg-kex-wg0){+.+.}:
-[ 0.960945] check_prev_add+0x167/0x1e20
-[ 0.961351] __lock_acquire+0x2012/0x3170
-[ 0.961725] lock_acquire+0x127/0x350
-[ 0.961990] flush_workqueue+0x106/0x12f0
-[ 0.962280] peer_remove_after_dead+0x160/0x220
-[ 0.962600] wg_set_device+0xa24/0xcc0
-[ 0.962994] genl_rcv_msg+0x52f/0xe90
-[ 0.963298] netlink_rcv_skb+0x111/0x320
-[ 0.963618] genl_rcv+0x1f/0x30
-[ 0.963853] netlink_unicast+0x3f6/0x610
-[ 0.964245] netlink_sendmsg+0x700/0xb80
-[ 0.964586] __sys_sendto+0x1dd/0x2c0
-[ 0.964854] __x64_sys_sendto+0xd8/0x1b0
-[ 0.965141] do_syscall_64+0x90/0xd9a
-[ 0.965408] entry_SYSCALL_64_after_hwframe+0x49/0xbe
-[ 0.965769]
-[ 0.965769] other info that might help us debug this:
-[ 0.965769]
-[ 0.966337] Chain exists of:
-[ 0.966337] (wq_completion)wg-kex-wg0 --> (work_completion)(&peer->transmit_handshake_work) --> &wg->static_identity.lock
-[ 0.966337]
-[ 0.967417] Possible unsafe locking scenario:
-[ 0.967417]
-[ 0.967836] CPU0 CPU1
-[ 0.968155] ---- ----
-[ 0.968497] lock(&wg->static_identity.lock);
-[ 0.968779] lock((work_completion)(&peer->transmit_handshake_work));
-[ 0.969345] lock(&wg->static_identity.lock);
-[ 0.969809] lock((wq_completion)wg-kex-wg0);
-[ 0.970146]
-[ 0.970146] *** DEADLOCK ***
-[ 0.970146]
-[ 0.970531] 5 locks held by wg/89:
-[ 0.970908] #0: ffffffff827433c8 (cb_lock){++++}, at: genl_rcv+0x10/0x30
-[ 0.971400] #1: ffffffff82743480 (genl_mutex){+.+.}, at: genl_rcv_msg+0x642/0xe90
-[ 0.971924] #2: ffffffff827160c0 (rtnl_mutex){+.+.}, at: wg_set_device+0x9f/0xcc0
-[ 0.972488] #3: ffff888032819de0 (&wg->device_update_lock){+.+.}, at: wg_set_device+0xb0/0xcc0
-[ 0.973095] #4: ffff888032819bc0 (&wg->static_identity.lock){++++}, at: wg_set_device+0x95d/0xcc0
-[ 0.973653]
-[ 0.973653] stack backtrace:
-[ 0.973932] CPU: 1 PID: 89 Comm: wg Not tainted 5.5.0-debug+ #18
-[ 0.974476] Call Trace:
-[ 0.974638] dump_stack+0x97/0xe0
-[ 0.974869] check_noncircular+0x312/0x3e0
-[ 0.975132] ? print_circular_bug+0x1f0/0x1f0
-[ 0.975410] ? __kernel_text_address+0x9/0x30
-[ 0.975727] ? unwind_get_return_address+0x51/0x90
-[ 0.976024] check_prev_add+0x167/0x1e20
-[ 0.976367] ? graph_lock+0x70/0x160
-[ 0.976682] __lock_acquire+0x2012/0x3170
-[ 0.976998] ? register_lock_class+0x1140/0x1140
-[ 0.977323] lock_acquire+0x127/0x350
-[ 0.977627] ? flush_workqueue+0xe3/0x12f0
-[ 0.977890] flush_workqueue+0x106/0x12f0
-[ 0.978147] ? flush_workqueue+0xe3/0x12f0
-[ 0.978410] ? find_held_lock+0x2c/0x110
-[ 0.978662] ? lock_downgrade+0x6e0/0x6e0
-[ 0.978919] ? queue_rcu_work+0x60/0x60
-[ 0.979166] ? netif_napi_del+0x151/0x3b0
-[ 0.979501] ? peer_remove_after_dead+0x160/0x220
-[ 0.979871] peer_remove_after_dead+0x160/0x220
-[ 0.980232] wg_set_device+0xa24/0xcc0
-[ 0.980516] ? deref_stack_reg+0x8e/0xc0
-[ 0.980801] ? set_peer+0xe10/0xe10
-[ 0.981040] ? __ww_mutex_check_waiters+0x150/0x150
-[ 0.981430] ? __nla_validate_parse+0x163/0x270
-[ 0.981719] ? genl_family_rcv_msg_attrs_parse+0x13f/0x310
-[ 0.982078] genl_rcv_msg+0x52f/0xe90
-[ 0.982348] ? genl_family_rcv_msg_attrs_parse+0x310/0x310
-[ 0.982690] ? register_lock_class+0x1140/0x1140
-[ 0.983049] netlink_rcv_skb+0x111/0x320
-[ 0.983298] ? genl_family_rcv_msg_attrs_parse+0x310/0x310
-[ 0.983645] ? netlink_ack+0x880/0x880
-[ 0.983888] genl_rcv+0x1f/0x30
-[ 0.984168] netlink_unicast+0x3f6/0x610
-[ 0.984443] ? netlink_detachskb+0x60/0x60
-[ 0.984729] ? find_held_lock+0x2c/0x110
-[ 0.984976] netlink_sendmsg+0x700/0xb80
-[ 0.985220] ? netlink_broadcast_filtered+0xa60/0xa60
-[ 0.985533] __sys_sendto+0x1dd/0x2c0
-[ 0.985763] ? __x64_sys_getpeername+0xb0/0xb0
-[ 0.986039] ? sockfd_lookup_light+0x17/0x160
-[ 0.986397] ? __sys_recvmsg+0x8c/0xf0
-[ 0.986711] ? __sys_recvmsg_sock+0xd0/0xd0
-[ 0.987018] __x64_sys_sendto+0xd8/0x1b0
-[ 0.987283] ? lockdep_hardirqs_on+0x39b/0x5a0
-[ 0.987666] do_syscall_64+0x90/0xd9a
-[ 0.987903] entry_SYSCALL_64_after_hwframe+0x49/0xbe
-[ 0.988223] RIP: 0033:0x7fe77c12003e
-[ 0.988508] Code: c3 8b 07 85 c0 75 24 49 89 fb 48 89 f0 48 89 d7 48 89 ce 4c 89 c2 4d 89 ca 4c 8b 44 24 08 4c 8b 4c 24 10 4c 4
-[ 0.989666] RSP: 002b:00007fffada2ed58 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
-[ 0.990137] RAX: ffffffffffffffda RBX: 00007fe77c159d48 RCX: 00007fe77c12003e
-[ 0.990583] RDX: 0000000000000040 RSI: 000055fd1d38e020 RDI: 0000000000000004
-[ 0.991091] RBP: 000055fd1d38e020 R08: 000055fd1cb63358 R09: 000000000000000c
-[ 0.991568] R10: 0000000000000000 R11: 0000000000000246 R12: 000000000000002c
-[ 0.992014] R13: 0000000000000004 R14: 000055fd1d38e020 R15: 0000000000000001
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Reported-by: syzbot <syzkaller@googlegroups.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/netlink.c | 6 ++----
- drivers/net/wireguard/noise.c | 10 +++++++---
- 2 files changed, 9 insertions(+), 7 deletions(-)
-
---- a/drivers/net/wireguard/netlink.c
-+++ b/drivers/net/wireguard/netlink.c
-@@ -575,10 +575,8 @@ static int wg_set_device(struct sk_buff
- private_key);
- list_for_each_entry_safe(peer, temp, &wg->peer_list,
- peer_list) {
-- if (wg_noise_precompute_static_static(peer))
-- wg_noise_expire_current_peer_keypairs(peer);
-- else
-- wg_peer_remove(peer);
-+ BUG_ON(!wg_noise_precompute_static_static(peer));
-+ wg_noise_expire_current_peer_keypairs(peer);
- }
- wg_cookie_checker_precompute_device_keys(&wg->cookie_checker);
- up_write(&wg->static_identity.lock);
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -46,17 +46,21 @@ void __init wg_noise_init(void)
- /* Must hold peer->handshake.static_identity->lock */
- bool wg_noise_precompute_static_static(struct wg_peer *peer)
- {
-- bool ret = true;
-+ bool ret;
-
- down_write(&peer->handshake.lock);
-- if (peer->handshake.static_identity->has_identity)
-+ if (peer->handshake.static_identity->has_identity) {
- ret = curve25519(
- peer->handshake.precomputed_static_static,
- peer->handshake.static_identity->static_private,
- peer->handshake.remote_static);
-- else
-+ } else {
-+ u8 empty[NOISE_PUBLIC_KEY_LEN] = { 0 };
-+
-+ ret = curve25519(empty, empty, peer->handshake.remote_static);
- memset(peer->handshake.precomputed_static_static, 0,
- NOISE_PUBLIC_KEY_LEN);
-+ }
- up_write(&peer->handshake.lock);
- return ret;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0083-wireguard-selftests-ensure-non-addition-of-peers-wit.patch b/target/linux/generic/backport-5.4/080-wireguard-0083-wireguard-selftests-ensure-non-addition-of-peers-wit.patch
deleted file mode 100644
index 86877a6590..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0083-wireguard-selftests-ensure-non-addition-of-peers-wit.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 4 Feb 2020 22:17:27 +0100
-Subject: [PATCH] wireguard: selftests: ensure non-addition of peers with
- failed precomputation
-
-commit f9398acba6a4ae9cb98bfe4d56414d376eff8d57 upstream.
-
-Ensure that peers with low order points are ignored, both in the case
-where we already have a device private key and in the case where we do
-not. This adds points that naturally give a zero output.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -516,6 +516,12 @@ n0 wg set wg0 peer "$pub2" allowed-ips 0
- n0 wg set wg0 peer "$pub2" allowed-ips 0.0.0.0/0
- n0 wg set wg0 peer "$pub2" allowed-ips ::/0,1700::/111,5000::/4,e000::/37,9000::/75
- n0 wg set wg0 peer "$pub2" allowed-ips ::/0
-+n0 wg set wg0 peer "$pub2" remove
-+low_order_points=( AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuAA= X5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVc= 7P///////////////////////////////////////38= 7f///////////////////////////////////////38= 7v///////////////////////////////////////38= )
-+n0 wg set wg0 private-key /dev/null ${low_order_points[@]/#/peer }
-+[[ -z $(n0 wg show wg0 peers) ]]
-+n0 wg set wg0 private-key <(echo "$key1") ${low_order_points[@]/#/peer }
-+[[ -z $(n0 wg show wg0 peers) ]]
- ip0 link del wg0
-
- declare -A objects
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0084-wireguard-selftests-tie-socket-waiting-to-target-pid.patch b/target/linux/generic/backport-5.4/080-wireguard-0084-wireguard-selftests-tie-socket-waiting-to-target-pid.patch
deleted file mode 100644
index 4530f0f49a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0084-wireguard-selftests-tie-socket-waiting-to-target-pid.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 4 Feb 2020 22:17:29 +0100
-Subject: [PATCH] wireguard: selftests: tie socket waiting to target pid
-
-commit 88f404a9b1d75388225b1c67b6dd327cb2182777 upstream.
-
-Without this, we wind up proceeding too early sometimes when the
-previous process has just used the same listening port. So, we tie the
-listening socket query to the specific pid we're interested in.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 17 ++++++++---------
- 1 file changed, 8 insertions(+), 9 deletions(-)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -38,9 +38,8 @@ ip0() { pretty 0 "ip $*"; ip -n $netns0
- ip1() { pretty 1 "ip $*"; ip -n $netns1 "$@"; }
- ip2() { pretty 2 "ip $*"; ip -n $netns2 "$@"; }
- sleep() { read -t "$1" -N 1 || true; }
--waitiperf() { pretty "${1//*-}" "wait for iperf:5201"; while [[ $(ss -N "$1" -tlp 'sport = 5201') != *iperf3* ]]; do sleep 0.1; done; }
--waitncatudp() { pretty "${1//*-}" "wait for udp:1111"; while [[ $(ss -N "$1" -ulp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
--waitncattcp() { pretty "${1//*-}" "wait for tcp:1111"; while [[ $(ss -N "$1" -tlp 'sport = 1111') != *ncat* ]]; do sleep 0.1; done; }
-+waitiperf() { pretty "${1//*-}" "wait for iperf:5201 pid $2"; while [[ $(ss -N "$1" -tlpH 'sport = 5201') != *\"iperf3\",pid=$2,fd=* ]]; do sleep 0.1; done; }
-+waitncatudp() { pretty "${1//*-}" "wait for udp:1111 pid $2"; while [[ $(ss -N "$1" -ulpH 'sport = 1111') != *\"ncat\",pid=$2,fd=* ]]; do sleep 0.1; done; }
- waitiface() { pretty "${1//*-}" "wait for $2 to come up"; ip netns exec "$1" bash -c "while [[ \$(< \"/sys/class/net/$2/operstate\") != up ]]; do read -t .1 -N 0 || true; done;"; }
-
- cleanup() {
-@@ -119,22 +118,22 @@ tests() {
-
- # TCP over IPv4
- n2 iperf3 -s -1 -B 192.168.241.2 &
-- waitiperf $netns2
-+ waitiperf $netns2 $!
- n1 iperf3 -Z -t 3 -c 192.168.241.2
-
- # TCP over IPv6
- n1 iperf3 -s -1 -B fd00::1 &
-- waitiperf $netns1
-+ waitiperf $netns1 $!
- n2 iperf3 -Z -t 3 -c fd00::1
-
- # UDP over IPv4
- n1 iperf3 -s -1 -B 192.168.241.1 &
-- waitiperf $netns1
-+ waitiperf $netns1 $!
- n2 iperf3 -Z -t 3 -b 0 -u -c 192.168.241.1
-
- # UDP over IPv6
- n2 iperf3 -s -1 -B fd00::2 &
-- waitiperf $netns2
-+ waitiperf $netns2 $!
- n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2
- }
-
-@@ -207,7 +206,7 @@ n1 ping -W 1 -c 1 192.168.241.2
- n1 wg set wg0 peer "$pub2" allowed-ips 192.168.241.0/24
- exec 4< <(n1 ncat -l -u -p 1111)
- ncat_pid=$!
--waitncatudp $netns1
-+waitncatudp $netns1 $ncat_pid
- n2 ncat -u 192.168.241.1 1111 <<<"X"
- read -r -N 1 -t 1 out <&4 && [[ $out == "X" ]]
- kill $ncat_pid
-@@ -216,7 +215,7 @@ n1 wg set wg0 peer "$more_specific_key"
- n2 wg set wg0 listen-port 9997
- exec 4< <(n1 ncat -l -u -p 1111)
- ncat_pid=$!
--waitncatudp $netns1
-+waitncatudp $netns1 $ncat_pid
- n2 ncat -u 192.168.241.1 1111 <<<"X"
- ! read -r -N 1 -t 1 out <&4 || false
- kill $ncat_pid
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0085-wireguard-device-use-icmp_ndo_send-helper.patch b/target/linux/generic/backport-5.4/080-wireguard-0085-wireguard-device-use-icmp_ndo_send-helper.patch
deleted file mode 100644
index 321db189e1..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0085-wireguard-device-use-icmp_ndo_send-helper.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 11 Feb 2020 20:47:08 +0100
-Subject: [PATCH] wireguard: device: use icmp_ndo_send helper
-
-commit a12d7f3cbdc72c7625881c8dc2660fc2c979fdf2 upstream.
-
-Because wireguard is calling icmp from network device context, it should
-use the ndo helper so that the rate limiting applies correctly. This
-commit adds a small test to the wireguard test suite to ensure that the
-new functions continue doing the right thing in the context of
-wireguard. It does this by setting up a condition that will definately
-evoke an icmp error message from the driver, but along a nat'd path.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 4 ++--
- tools/testing/selftests/wireguard/netns.sh | 11 +++++++++++
- 2 files changed, 13 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -203,9 +203,9 @@ err_peer:
- err:
- ++dev->stats.tx_errors;
- if (skb->protocol == htons(ETH_P_IP))
-- icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
-+ icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
- else if (skb->protocol == htons(ETH_P_IPV6))
-- icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
-+ icmpv6_ndo_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
- kfree_skb(skb);
- return ret;
- }
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -24,6 +24,7 @@
- set -e
-
- exec 3>&1
-+export LANG=C
- export WG_HIDE_KEYS=never
- netns0="wg-test-$$-0"
- netns1="wg-test-$$-1"
-@@ -297,7 +298,17 @@ ip1 -4 rule add table main suppress_pref
- n1 ping -W 1 -c 100 -f 192.168.99.7
- n1 ping -W 1 -c 100 -f abab::1111
-
-+# Have ns2 NAT into wg0 packets from ns0, but return an icmp error along the right route.
-+n2 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -d 192.168.241.0/24 -j SNAT --to 192.168.241.2
-+n0 iptables -t filter -A INPUT \! -s 10.0.0.0/24 -i vethrs -j DROP # Manual rpfilter just to be explicit.
-+n2 bash -c 'printf 1 > /proc/sys/net/ipv4/ip_forward'
-+ip0 -4 route add 192.168.241.1 via 10.0.0.100
-+n2 wg set wg0 peer "$pub1" remove
-+[[ $(! n0 ping -W 1 -c 1 192.168.241.1 || false) == *"From 10.0.0.100 icmp_seq=1 Destination Host Unreachable"* ]]
-+
- n0 iptables -t nat -F
-+n0 iptables -t filter -F
-+n2 iptables -t nat -F
- ip0 link del vethrc
- ip0 link del vethrs
- ip1 link del wg0
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0086-wireguard-selftests-reduce-complexity-and-fix-make-r.patch b/target/linux/generic/backport-5.4/080-wireguard-0086-wireguard-selftests-reduce-complexity-and-fix-make-r.patch
deleted file mode 100644
index ac292a8682..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0086-wireguard-selftests-reduce-complexity-and-fix-make-r.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 14 Feb 2020 23:57:20 +0100
-Subject: [PATCH] wireguard: selftests: reduce complexity and fix make races
-
-commit 04ddf1208f03e1dbc39a4619c40eba640051b950 upstream.
-
-This gives us fewer dependencies and shortens build time, fixes up some
-hash checking race conditions, and also fixes missing directory creation
-that caused issues on massively parallel builds.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- .../testing/selftests/wireguard/qemu/Makefile | 38 +++++++------------
- 1 file changed, 14 insertions(+), 24 deletions(-)
-
---- a/tools/testing/selftests/wireguard/qemu/Makefile
-+++ b/tools/testing/selftests/wireguard/qemu/Makefile
-@@ -38,19 +38,17 @@ endef
- define file_download =
- $(DISTFILES_PATH)/$(1):
- mkdir -p $(DISTFILES_PATH)
-- flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp'
-- if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi
-+ flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp; [ -f $$@.tmp ] || exit 1; if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi'
- endef
-
- $(eval $(call tar_download,MUSL,musl,1.1.24,.tar.gz,https://www.musl-libc.org/releases/,1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3))
--$(eval $(call tar_download,LIBMNL,libmnl,1.0.4,.tar.bz2,https://www.netfilter.org/projects/libmnl/files/,171f89699f286a5854b72b91d06e8f8e3683064c5901fb09d954a9ab6f551f81))
- $(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c))
- $(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
- $(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae))
- $(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c))
- $(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa))
- $(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))
--$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20191226,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,aa8af0fdc9872d369d8c890a84dbc2a2466b55795dccd5b47721b2d97644b04f))
-+$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20200206,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,f5207248c6a3c3e3bfc9ab30b91c1897b00802ed861e1f9faaed873366078c64))
-
- 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))
-@@ -295,21 +293,13 @@ $(IPERF_PATH)/src/iperf3: | $(IPERF_PATH
- $(MAKE) -C $(IPERF_PATH)
- $(STRIP) -s $@
-
--$(LIBMNL_PATH)/.installed: $(LIBMNL_TAR)
-- flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-- touch $@
--
--$(LIBMNL_PATH)/src/.libs/libmnl.a: | $(LIBMNL_PATH)/.installed $(USERSPACE_DEPS)
-- cd $(LIBMNL_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared
-- $(MAKE) -C $(LIBMNL_PATH)
-- sed -i 's:prefix=.*:prefix=$(LIBMNL_PATH):' $(LIBMNL_PATH)/libmnl.pc
--
- $(WIREGUARD_TOOLS_PATH)/.installed: $(WIREGUARD_TOOLS_TAR)
-+ mkdir -p $(BUILD_PATH)
- flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
- touch $@
-
--$(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-- LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src LIBMNL_CFLAGS="-I$(LIBMNL_PATH)/include" LIBMNL_LDLIBS="-lmnl" wg
-+$(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(USERSPACE_DEPS)
-+ $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src wg
- $(STRIP) -s $@
-
- $(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS)
-@@ -340,17 +330,17 @@ $(BASH_PATH)/bash: | $(BASH_PATH)/.insta
- $(IPROUTE2_PATH)/.installed: $(IPROUTE2_TAR)
- mkdir -p $(BUILD_PATH)
- flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
-- printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=y\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS -DHAVE_LIBMNL -I$(LIBMNL_PATH)/include\nLDLIBS+=-lmnl' > $(IPROUTE2_PATH)/config.mk
-+ printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=n\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS\n' > $(IPROUTE2_PATH)/config.mk
- printf 'lib: snapshot\n\t$$(MAKE) -C lib\nip/ip: lib\n\t$$(MAKE) -C ip ip\nmisc/ss: lib\n\t$$(MAKE) -C misc ss\n' >> $(IPROUTE2_PATH)/Makefile
- touch $@
-
--$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-- LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ ip/ip
-- $(STRIP) -s $(IPROUTE2_PATH)/ip/ip
--
--$(IPROUTE2_PATH)/misc/ss: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-- LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ misc/ss
-- $(STRIP) -s $(IPROUTE2_PATH)/misc/ss
-+$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS)
-+ $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ ip/ip
-+ $(STRIP) -s $@
-+
-+$(IPROUTE2_PATH)/misc/ss: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS)
-+ $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ misc/ss
-+ $(STRIP) -s $@
-
- $(IPTABLES_PATH)/.installed: $(IPTABLES_TAR)
- mkdir -p $(BUILD_PATH)
-@@ -358,8 +348,8 @@ $(IPTABLES_PATH)/.installed: $(IPTABLES_
- sed -i -e "/nfnetlink=[01]/s:=[01]:=0:" -e "/nfconntrack=[01]/s:=[01]:=0:" $(IPTABLES_PATH)/configure
- touch $@
-
--$(IPTABLES_PATH)/iptables/xtables-legacy-multi: | $(IPTABLES_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
-- cd $(IPTABLES_PATH) && PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --with-kernel=$(BUILD_PATH)/include
-+$(IPTABLES_PATH)/iptables/xtables-legacy-multi: | $(IPTABLES_PATH)/.installed $(USERSPACE_DEPS)
-+ cd $(IPTABLES_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --disable-connlabel --with-kernel=$(BUILD_PATH)/include
- $(MAKE) -C $(IPTABLES_PATH)
- $(STRIP) -s $@
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0087-wireguard-receive-reset-last_under_load-to-zero.patch b/target/linux/generic/backport-5.4/080-wireguard-0087-wireguard-receive-reset-last_under_load-to-zero.patch
deleted file mode 100644
index 193d28a83f..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0087-wireguard-receive-reset-last_under_load-to-zero.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 14 Feb 2020 23:57:21 +0100
-Subject: [PATCH] wireguard: receive: reset last_under_load to zero
-
-commit 2a8a4df36462aa85b0db87b7c5ea145ba67e34a8 upstream.
-
-This is a small optimization that prevents more expensive comparisons
-from happening when they are no longer necessary, by clearing the
-last_under_load variable whenever we wind up in a state where we were
-under load but we no longer are.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Suggested-by: Matt Dunwoodie <ncon@noconroy.net>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -118,10 +118,13 @@ static void wg_receive_handshake_packet(
-
- under_load = skb_queue_len(&wg->incoming_handshakes) >=
- MAX_QUEUED_INCOMING_HANDSHAKES / 8;
-- if (under_load)
-+ if (under_load) {
- last_under_load = ktime_get_coarse_boottime_ns();
-- else if (last_under_load)
-+ } else if (last_under_load) {
- under_load = !wg_birthdate_has_expired(last_under_load, 1);
-+ if (!under_load)
-+ last_under_load = 0;
-+ }
- mac_state = wg_cookie_validate_packet(&wg->cookie_checker, skb,
- under_load);
- if ((under_load && mac_state == VALID_MAC_WITH_COOKIE) ||
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0088-wireguard-send-account-for-mtu-0-devices.patch b/target/linux/generic/backport-5.4/080-wireguard-0088-wireguard-send-account-for-mtu-0-devices.patch
deleted file mode 100644
index d84efe20f0..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0088-wireguard-send-account-for-mtu-0-devices.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 14 Feb 2020 23:57:22 +0100
-Subject: [PATCH] wireguard: send: account for mtu=0 devices
-
-commit 175f1ca9a9ed8689d2028da1a7c624bb4fb4ff7e upstream.
-
-It turns out there's an easy way to get packets queued up while still
-having an MTU of zero, and that's via persistent keep alive. This commit
-makes sure that in whatever condition, we don't wind up dividing by
-zero. Note that an MTU of zero for a wireguard interface is something
-quasi-valid, so I don't think the correct fix is to limit it via
-min_mtu. This can be reproduced easily with:
-
-ip link add wg0 type wireguard
-ip link add wg1 type wireguard
-ip link set wg0 up mtu 0
-ip link set wg1 up
-wg set wg0 private-key <(wg genkey)
-wg set wg1 listen-port 1 private-key <(wg genkey) peer $(wg show wg0 public-key)
-wg set wg0 peer $(wg show wg1 public-key) persistent-keepalive 1 endpoint 127.0.0.1:1
-
-However, while min_mtu=0 seems fine, it makes sense to restrict the
-max_mtu. This commit also restricts the maximum MTU to the greatest
-number for which rounding up to the padding multiple won't overflow a
-signed integer. Packets this large were always rejected anyway
-eventually, due to checks deeper in, but it seems more sound not to even
-let the administrator configure something that won't work anyway.
-
-We use this opportunity to clean up this function a bit so that it's
-clear which paths we're expecting.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Cc: Eric Dumazet <eric.dumazet@gmail.com>
-Reviewed-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 7 ++++---
- drivers/net/wireguard/send.c | 16 +++++++++++-----
- 2 files changed, 15 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -258,6 +258,8 @@ static void wg_setup(struct net_device *
- enum { WG_NETDEV_FEATURES = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
- NETIF_F_SG | NETIF_F_GSO |
- NETIF_F_GSO_SOFTWARE | NETIF_F_HIGHDMA };
-+ const int overhead = MESSAGE_MINIMUM_LENGTH + sizeof(struct udphdr) +
-+ max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
-
- dev->netdev_ops = &netdev_ops;
- dev->hard_header_len = 0;
-@@ -271,9 +273,8 @@ static void wg_setup(struct net_device *
- dev->features |= WG_NETDEV_FEATURES;
- dev->hw_features |= WG_NETDEV_FEATURES;
- dev->hw_enc_features |= WG_NETDEV_FEATURES;
-- dev->mtu = ETH_DATA_LEN - MESSAGE_MINIMUM_LENGTH -
-- sizeof(struct udphdr) -
-- max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
-+ dev->mtu = ETH_DATA_LEN - overhead;
-+ dev->max_mtu = round_down(INT_MAX, MESSAGE_PADDING_MULTIPLE) - overhead;
-
- SET_NETDEV_DEVTYPE(dev, &device_type);
-
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -143,16 +143,22 @@ static void keep_key_fresh(struct wg_pee
-
- static unsigned int calculate_skb_padding(struct sk_buff *skb)
- {
-+ unsigned int padded_size, last_unit = skb->len;
-+
-+ if (unlikely(!PACKET_CB(skb)->mtu))
-+ return ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE) - last_unit;
-+
- /* We do this modulo business with the MTU, just in case the networking
- * layer gives us a packet that's bigger than the MTU. In that case, we
- * wouldn't want the final subtraction to overflow in the case of the
-- * padded_size being clamped.
-+ * padded_size being clamped. Fortunately, that's very rarely the case,
-+ * so we optimize for that not happening.
- */
-- unsigned int last_unit = skb->len % PACKET_CB(skb)->mtu;
-- unsigned int padded_size = ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE);
-+ if (unlikely(last_unit > PACKET_CB(skb)->mtu))
-+ last_unit %= PACKET_CB(skb)->mtu;
-
-- if (padded_size > PACKET_CB(skb)->mtu)
-- padded_size = PACKET_CB(skb)->mtu;
-+ padded_size = min(PACKET_CB(skb)->mtu,
-+ ALIGN(last_unit, MESSAGE_PADDING_MULTIPLE));
- return padded_size - last_unit;
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0089-wireguard-socket-remove-extra-call-to-synchronize_ne.patch b/target/linux/generic/backport-5.4/080-wireguard-0089-wireguard-socket-remove-extra-call-to-synchronize_ne.patch
deleted file mode 100644
index 458e9d51e5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0089-wireguard-socket-remove-extra-call-to-synchronize_ne.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 14 Feb 2020 23:57:23 +0100
-Subject: [PATCH] wireguard: socket: remove extra call to synchronize_net
-
-commit 1fbc33b0a7feb6ca72bf7dc8a05d81485ee8ee2e upstream.
-
-synchronize_net() is a wrapper around synchronize_rcu(), so there's no
-point in having synchronize_net and synchronize_rcu back to back,
-despite the documentation comment suggesting maybe it's somewhat useful,
-"Wait for packets currently being received to be done." This commit
-removes the extra call.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Suggested-by: Eric Dumazet <eric.dumazet@gmail.com>
-Reviewed-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/socket.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -432,7 +432,6 @@ void wg_socket_reinit(struct wg_device *
- wg->incoming_port = ntohs(inet_sk(new4)->inet_sport);
- mutex_unlock(&wg->socket_update_lock);
- synchronize_rcu();
-- synchronize_net();
- sock_free(old4);
- sock_free(old6);
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0090-wireguard-selftests-remove-duplicated-include-sys-ty.patch b/target/linux/generic/backport-5.4/080-wireguard-0090-wireguard-selftests-remove-duplicated-include-sys-ty.patch
deleted file mode 100644
index 93545e6760..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0090-wireguard-selftests-remove-duplicated-include-sys-ty.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: YueHaibing <yuehaibing@huawei.com>
-Date: Wed, 18 Mar 2020 18:30:43 -0600
-Subject: [PATCH] wireguard: selftests: remove duplicated include <sys/types.h>
-
-commit 166391159c5deb84795d2ff46e95f276177fa5fb upstream.
-
-This commit removes a duplicated include.
-
-Signed-off-by: YueHaibing <yuehaibing@huawei.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/qemu/init.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/tools/testing/selftests/wireguard/qemu/init.c
-+++ b/tools/testing/selftests/wireguard/qemu/init.c
-@@ -13,7 +13,6 @@
- #include <fcntl.h>
- #include <sys/wait.h>
- #include <sys/mount.h>
--#include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <sys/io.h>
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0091-wireguard-queueing-account-for-skb-protocol-0.patch b/target/linux/generic/backport-5.4/080-wireguard-0091-wireguard-queueing-account-for-skb-protocol-0.patch
deleted file mode 100644
index a9ca655e74..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0091-wireguard-queueing-account-for-skb-protocol-0.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 18 Mar 2020 18:30:45 -0600
-Subject: [PATCH] wireguard: queueing: account for skb->protocol==0
-
-commit a5588604af448664e796daf3c1d5a4523c60667b upstream.
-
-We carry out checks to the effect of:
-
- if (skb->protocol != wg_examine_packet_protocol(skb))
- goto err;
-
-By having wg_skb_examine_untrusted_ip_hdr return 0 on failure, this
-means that the check above still passes in the case where skb->protocol
-is zero, which is possible to hit with AF_PACKET:
-
- struct sockaddr_pkt saddr = { .spkt_device = "wg0" };
- unsigned char buffer[5] = { 0 };
- sendto(socket(AF_PACKET, SOCK_PACKET, /* skb->protocol = */ 0),
- buffer, sizeof(buffer), 0, (const struct sockaddr *)&saddr, sizeof(saddr));
-
-Additional checks mean that this isn't actually a problem in the code
-base, but I could imagine it becoming a problem later if the function is
-used more liberally.
-
-I would prefer to fix this by having wg_examine_packet_protocol return a
-32-bit ~0 value on failure, which will never match any value of
-skb->protocol, which would simply change the generated code from a mov
-to a movzx. However, sparse complains, and adding __force casts doesn't
-seem like a good idea, so instead we just add a simple helper function
-to check for the zero return value. Since wg_examine_packet_protocol
-itself gets inlined, this winds up not adding an additional branch to
-the generated code, since the 0 return value already happens in a
-mergable branch.
-
-Reported-by: Fabian Freyer <fabianfreyer@radicallyopensecurity.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 2 +-
- drivers/net/wireguard/queueing.h | 8 +++++++-
- drivers/net/wireguard/receive.c | 4 ++--
- 3 files changed, 10 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -122,7 +122,7 @@ static netdev_tx_t wg_xmit(struct sk_buf
- u32 mtu;
- int ret;
-
-- if (unlikely(wg_skb_examine_untrusted_ip_hdr(skb) != skb->protocol)) {
-+ if (unlikely(!wg_check_packet_protocol(skb))) {
- ret = -EPROTONOSUPPORT;
- net_dbg_ratelimited("%s: Invalid IP packet\n", dev->name);
- goto err;
---- a/drivers/net/wireguard/queueing.h
-+++ b/drivers/net/wireguard/queueing.h
-@@ -66,7 +66,7 @@ struct packet_cb {
- #define PACKET_PEER(skb) (PACKET_CB(skb)->keypair->entry.peer)
-
- /* Returns either the correct skb->protocol value, or 0 if invalid. */
--static inline __be16 wg_skb_examine_untrusted_ip_hdr(struct sk_buff *skb)
-+static inline __be16 wg_examine_packet_protocol(struct sk_buff *skb)
- {
- if (skb_network_header(skb) >= skb->head &&
- (skb_network_header(skb) + sizeof(struct iphdr)) <=
-@@ -81,6 +81,12 @@ static inline __be16 wg_skb_examine_untr
- return 0;
- }
-
-+static inline bool wg_check_packet_protocol(struct sk_buff *skb)
-+{
-+ __be16 real_protocol = wg_examine_packet_protocol(skb);
-+ return real_protocol && skb->protocol == real_protocol;
-+}
-+
- static inline void wg_reset_packet(struct sk_buff *skb)
- {
- skb_scrub_packet(skb, true);
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -56,7 +56,7 @@ static int prepare_skb_header(struct sk_
- size_t data_offset, data_len, header_len;
- struct udphdr *udp;
-
-- if (unlikely(wg_skb_examine_untrusted_ip_hdr(skb) != skb->protocol ||
-+ if (unlikely(!wg_check_packet_protocol(skb) ||
- skb_transport_header(skb) < skb->head ||
- (skb_transport_header(skb) + sizeof(struct udphdr)) >
- skb_tail_pointer(skb)))
-@@ -388,7 +388,7 @@ static void wg_packet_consume_data_done(
- */
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- skb->csum_level = ~0; /* All levels */
-- skb->protocol = wg_skb_examine_untrusted_ip_hdr(skb);
-+ skb->protocol = wg_examine_packet_protocol(skb);
- if (skb->protocol == htons(ETH_P_IP)) {
- len = ntohs(ip_hdr(skb)->tot_len);
- if (unlikely(len < sizeof(struct iphdr)))
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0092-wireguard-receive-remove-dead-code-from-default-pack.patch b/target/linux/generic/backport-5.4/080-wireguard-0092-wireguard-receive-remove-dead-code-from-default-pack.patch
deleted file mode 100644
index bcd4fbfbc1..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0092-wireguard-receive-remove-dead-code-from-default-pack.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 18 Mar 2020 18:30:46 -0600
-Subject: [PATCH] wireguard: receive: remove dead code from default packet type
- case
-
-commit 2b8765c52db24c0fbcc81bac9b5e8390f2c7d3c8 upstream.
-
-The situation in which we wind up hitting the default case here
-indicates a major bug in earlier parsing code. It is not a usual thing
-that should ever happen, which means a "friendly" message for it doesn't
-make sense. Rather, replace this with a WARN_ON, just like we do earlier
-in the file for a similar situation, so that somebody sends us a bug
-report and we can fix it.
-
-Reported-by: Fabian Freyer <fabianfreyer@radicallyopensecurity.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -587,8 +587,7 @@ void wg_packet_receive(struct wg_device
- wg_packet_consume_data(wg, skb);
- break;
- default:
-- net_dbg_skb_ratelimited("%s: Invalid packet from %pISpfsc\n",
-- wg->dev->name, skb);
-+ WARN(1, "Non-exhaustive parsing of packet header lead to unknown packet type!\n");
- goto err;
- }
- return;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0093-wireguard-noise-error-out-precomputed-DH-during-hand.patch b/target/linux/generic/backport-5.4/080-wireguard-0093-wireguard-noise-error-out-precomputed-DH-during-hand.patch
deleted file mode 100644
index dac3046e47..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0093-wireguard-noise-error-out-precomputed-DH-during-hand.patch
+++ /dev/null
@@ -1,224 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 18 Mar 2020 18:30:47 -0600
-Subject: [PATCH] wireguard: noise: error out precomputed DH during handshake
- rather than config
-
-commit 11a7686aa99c7fe4b3f80f6dcccd54129817984d upstream.
-
-We precompute the static-static ECDH during configuration time, in order
-to save an expensive computation later when receiving network packets.
-However, not all ECDH computations yield a contributory result. Prior,
-we were just not letting those peers be added to the interface. However,
-this creates a strange inconsistency, since it was still possible to add
-other weird points, like a valid public key plus a low-order point, and,
-like points that result in zeros, a handshake would not complete. In
-order to make the behavior more uniform and less surprising, simply
-allow all peers to be added. Then, we'll error out later when doing the
-crypto if there's an issue. This also adds more separation between the
-crypto layer and the configuration layer.
-
-Discussed-with: Mathias Hall-Andersen <mathias@hall-andersen.dk>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/netlink.c | 8 +---
- drivers/net/wireguard/noise.c | 55 ++++++++++++----------
- drivers/net/wireguard/noise.h | 12 ++---
- drivers/net/wireguard/peer.c | 7 +--
- tools/testing/selftests/wireguard/netns.sh | 15 ++++--
- 5 files changed, 49 insertions(+), 48 deletions(-)
-
---- a/drivers/net/wireguard/netlink.c
-+++ b/drivers/net/wireguard/netlink.c
-@@ -417,11 +417,7 @@ static int set_peer(struct wg_device *wg
-
- peer = wg_peer_create(wg, public_key, preshared_key);
- if (IS_ERR(peer)) {
-- /* Similar to the above, if the key is invalid, we skip
-- * it without fanfare, so that services don't need to
-- * worry about doing key validation themselves.
-- */
-- ret = PTR_ERR(peer) == -EKEYREJECTED ? 0 : PTR_ERR(peer);
-+ ret = PTR_ERR(peer);
- peer = NULL;
- goto out;
- }
-@@ -575,7 +571,7 @@ static int wg_set_device(struct sk_buff
- private_key);
- list_for_each_entry_safe(peer, temp, &wg->peer_list,
- peer_list) {
-- BUG_ON(!wg_noise_precompute_static_static(peer));
-+ wg_noise_precompute_static_static(peer);
- wg_noise_expire_current_peer_keypairs(peer);
- }
- wg_cookie_checker_precompute_device_keys(&wg->cookie_checker);
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -44,32 +44,23 @@ void __init wg_noise_init(void)
- }
-
- /* Must hold peer->handshake.static_identity->lock */
--bool wg_noise_precompute_static_static(struct wg_peer *peer)
-+void wg_noise_precompute_static_static(struct wg_peer *peer)
- {
-- bool ret;
--
- down_write(&peer->handshake.lock);
-- if (peer->handshake.static_identity->has_identity) {
-- ret = curve25519(
-- peer->handshake.precomputed_static_static,
-+ if (!peer->handshake.static_identity->has_identity ||
-+ !curve25519(peer->handshake.precomputed_static_static,
- peer->handshake.static_identity->static_private,
-- peer->handshake.remote_static);
-- } else {
-- u8 empty[NOISE_PUBLIC_KEY_LEN] = { 0 };
--
-- ret = curve25519(empty, empty, peer->handshake.remote_static);
-+ peer->handshake.remote_static))
- memset(peer->handshake.precomputed_static_static, 0,
- NOISE_PUBLIC_KEY_LEN);
-- }
- up_write(&peer->handshake.lock);
-- return ret;
- }
-
--bool wg_noise_handshake_init(struct noise_handshake *handshake,
-- struct noise_static_identity *static_identity,
-- const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-- const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-- struct wg_peer *peer)
-+void wg_noise_handshake_init(struct noise_handshake *handshake,
-+ struct noise_static_identity *static_identity,
-+ const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-+ struct wg_peer *peer)
- {
- memset(handshake, 0, sizeof(*handshake));
- init_rwsem(&handshake->lock);
-@@ -81,7 +72,7 @@ bool wg_noise_handshake_init(struct nois
- NOISE_SYMMETRIC_KEY_LEN);
- handshake->static_identity = static_identity;
- handshake->state = HANDSHAKE_ZEROED;
-- return wg_noise_precompute_static_static(peer);
-+ wg_noise_precompute_static_static(peer);
- }
-
- static void handshake_zero(struct noise_handshake *handshake)
-@@ -403,6 +394,19 @@ static bool __must_check mix_dh(u8 chain
- return true;
- }
-
-+static bool __must_check mix_precomputed_dh(u8 chaining_key[NOISE_HASH_LEN],
-+ u8 key[NOISE_SYMMETRIC_KEY_LEN],
-+ const u8 precomputed[NOISE_PUBLIC_KEY_LEN])
-+{
-+ static u8 zero_point[NOISE_PUBLIC_KEY_LEN];
-+ if (unlikely(!crypto_memneq(precomputed, zero_point, NOISE_PUBLIC_KEY_LEN)))
-+ return false;
-+ kdf(chaining_key, key, NULL, precomputed, NOISE_HASH_LEN,
-+ NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN,
-+ chaining_key);
-+ return true;
-+}
-+
- static void mix_hash(u8 hash[NOISE_HASH_LEN], const u8 *src, size_t src_len)
- {
- struct blake2s_state blake;
-@@ -531,10 +535,9 @@ wg_noise_handshake_create_initiation(str
- NOISE_PUBLIC_KEY_LEN, key, handshake->hash);
-
- /* ss */
-- kdf(handshake->chaining_key, key, NULL,
-- handshake->precomputed_static_static, NOISE_HASH_LEN,
-- NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN,
-- handshake->chaining_key);
-+ if (!mix_precomputed_dh(handshake->chaining_key, key,
-+ handshake->precomputed_static_static))
-+ goto out;
-
- /* {t} */
- tai64n_now(timestamp);
-@@ -595,9 +598,9 @@ wg_noise_handshake_consume_initiation(st
- handshake = &peer->handshake;
-
- /* ss */
-- kdf(chaining_key, key, NULL, handshake->precomputed_static_static,
-- NOISE_HASH_LEN, NOISE_SYMMETRIC_KEY_LEN, 0, NOISE_PUBLIC_KEY_LEN,
-- chaining_key);
-+ if (!mix_precomputed_dh(chaining_key, key,
-+ handshake->precomputed_static_static))
-+ goto out;
-
- /* {t} */
- if (!message_decrypt(t, src->encrypted_timestamp,
---- a/drivers/net/wireguard/noise.h
-+++ b/drivers/net/wireguard/noise.h
-@@ -94,11 +94,11 @@ struct noise_handshake {
- struct wg_device;
-
- void wg_noise_init(void);
--bool wg_noise_handshake_init(struct noise_handshake *handshake,
-- struct noise_static_identity *static_identity,
-- const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-- const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-- struct wg_peer *peer);
-+void wg_noise_handshake_init(struct noise_handshake *handshake,
-+ struct noise_static_identity *static_identity,
-+ const u8 peer_public_key[NOISE_PUBLIC_KEY_LEN],
-+ const u8 peer_preshared_key[NOISE_SYMMETRIC_KEY_LEN],
-+ struct wg_peer *peer);
- void wg_noise_handshake_clear(struct noise_handshake *handshake);
- static inline void wg_noise_reset_last_sent_handshake(atomic64_t *handshake_ns)
- {
-@@ -116,7 +116,7 @@ void wg_noise_expire_current_peer_keypai
- void wg_noise_set_static_identity_private_key(
- struct noise_static_identity *static_identity,
- const u8 private_key[NOISE_PUBLIC_KEY_LEN]);
--bool wg_noise_precompute_static_static(struct wg_peer *peer);
-+void wg_noise_precompute_static_static(struct wg_peer *peer);
-
- bool
- wg_noise_handshake_create_initiation(struct message_handshake_initiation *dst,
---- a/drivers/net/wireguard/peer.c
-+++ b/drivers/net/wireguard/peer.c
-@@ -34,11 +34,8 @@ struct wg_peer *wg_peer_create(struct wg
- return ERR_PTR(ret);
- peer->device = wg;
-
-- if (!wg_noise_handshake_init(&peer->handshake, &wg->static_identity,
-- public_key, preshared_key, peer)) {
-- ret = -EKEYREJECTED;
-- goto err_1;
-- }
-+ wg_noise_handshake_init(&peer->handshake, &wg->static_identity,
-+ public_key, preshared_key, peer);
- if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL))
- goto err_1;
- if (wg_packet_queue_init(&peer->tx_queue, wg_packet_tx_worker, false,
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -527,11 +527,16 @@ n0 wg set wg0 peer "$pub2" allowed-ips 0
- n0 wg set wg0 peer "$pub2" allowed-ips ::/0,1700::/111,5000::/4,e000::/37,9000::/75
- n0 wg set wg0 peer "$pub2" allowed-ips ::/0
- n0 wg set wg0 peer "$pub2" remove
--low_order_points=( AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuAA= X5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVc= 7P///////////////////////////////////////38= 7f///////////////////////////////////////38= 7v///////////////////////////////////////38= )
--n0 wg set wg0 private-key /dev/null ${low_order_points[@]/#/peer }
--[[ -z $(n0 wg show wg0 peers) ]]
--n0 wg set wg0 private-key <(echo "$key1") ${low_order_points[@]/#/peer }
--[[ -z $(n0 wg show wg0 peers) ]]
-+for low_order_point in AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuAA= X5yVvKNQjCSx0LFVnIPvWwREXMRYHI6G2CJO3dCfEVc= 7P///////////////////////////////////////38= 7f///////////////////////////////////////38= 7v///////////////////////////////////////38=; do
-+ n0 wg set wg0 peer "$low_order_point" persistent-keepalive 1 endpoint 127.0.0.1:1111
-+done
-+[[ -n $(n0 wg show wg0 peers) ]]
-+exec 4< <(n0 ncat -l -u -p 1111)
-+ncat_pid=$!
-+waitncatudp $netns0 $ncat_pid
-+ip0 link set wg0 up
-+! read -r -n 1 -t 2 <&4 || false
-+kill $ncat_pid
- ip0 link del wg0
-
- declare -A objects
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0094-wireguard-send-remove-errant-newline-from-packet_enc.patch b/target/linux/generic/backport-5.4/080-wireguard-0094-wireguard-send-remove-errant-newline-from-packet_enc.patch
deleted file mode 100644
index c92b6a784a..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0094-wireguard-send-remove-errant-newline-from-packet_enc.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sultan Alsawaf <sultan@kerneltoast.com>
-Date: Wed, 29 Apr 2020 14:59:20 -0600
-Subject: [PATCH] wireguard: send: remove errant newline from
- packet_encrypt_worker
-
-commit d6833e42786e050e7522d6a91a9361e54085897d upstream.
-
-This commit removes a useless newline at the end of a scope, which
-doesn't add anything in the way of organization or readability.
-
-Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/send.c | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -304,7 +304,6 @@ void wg_packet_encrypt_worker(struct wor
- }
- wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first,
- state);
--
- }
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0095-wireguard-queueing-cleanup-ptr_ring-in-error-path-of.patch b/target/linux/generic/backport-5.4/080-wireguard-0095-wireguard-queueing-cleanup-ptr_ring-in-error-path-of.patch
deleted file mode 100644
index a72c509894..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0095-wireguard-queueing-cleanup-ptr_ring-in-error-path-of.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 29 Apr 2020 14:59:21 -0600
-Subject: [PATCH] wireguard: queueing: cleanup ptr_ring in error path of
- packet_queue_init
-
-commit 130c58606171326c81841a49cc913cd354113dd9 upstream.
-
-Prior, if the alloc_percpu of packet_percpu_multicore_worker_alloc
-failed, the previously allocated ptr_ring wouldn't be freed. This commit
-adds the missing call to ptr_ring_cleanup in the error case.
-
-Reported-by: Sultan Alsawaf <sultan@kerneltoast.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/queueing.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireguard/queueing.c
-+++ b/drivers/net/wireguard/queueing.c
-@@ -35,8 +35,10 @@ int wg_packet_queue_init(struct crypt_qu
- if (multicore) {
- queue->worker = wg_packet_percpu_multicore_worker_alloc(
- function, queue);
-- if (!queue->worker)
-+ if (!queue->worker) {
-+ ptr_ring_cleanup(&queue->ring, NULL);
- return -ENOMEM;
-+ }
- } else {
- INIT_WORK(&queue->work, function);
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0096-wireguard-receive-use-tunnel-helpers-for-decapsulati.patch b/target/linux/generic/backport-5.4/080-wireguard-0096-wireguard-receive-use-tunnel-helpers-for-decapsulati.patch
deleted file mode 100644
index a72358c302..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0096-wireguard-receive-use-tunnel-helpers-for-decapsulati.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com>
-Date: Wed, 29 Apr 2020 14:59:22 -0600
-Subject: [PATCH] wireguard: receive: use tunnel helpers for decapsulating ECN
- markings
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit eebabcb26ea1e3295704477c6cd4e772c96a9559 upstream.
-
-WireGuard currently only propagates ECN markings on tunnel decap according
-to the old RFC3168 specification. However, the spec has since been updated
-in RFC6040 to recommend slightly different decapsulation semantics. This
-was implemented in the kernel as a set of common helpers for ECN
-decapsulation, so let's just switch over WireGuard to using those, so it
-can benefit from this enhancement and any future tweaks. We do not drop
-packets with invalid ECN marking combinations, because WireGuard is
-frequently used to work around broken ISPs, which could be doing that.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Reported-by: Olivier Tilmans <olivier.tilmans@nokia-bell-labs.com>
-Cc: Dave Taht <dave.taht@gmail.com>
-Cc: Rodney W. Grimes <ietf@gndrsh.dnsmgr.net>
-Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 6 ++----
- 1 file changed, 2 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -393,13 +393,11 @@ static void wg_packet_consume_data_done(
- len = ntohs(ip_hdr(skb)->tot_len);
- if (unlikely(len < sizeof(struct iphdr)))
- goto dishonest_packet_size;
-- if (INET_ECN_is_ce(PACKET_CB(skb)->ds))
-- IP_ECN_set_ce(ip_hdr(skb));
-+ INET_ECN_decapsulate(skb, PACKET_CB(skb)->ds, ip_hdr(skb)->tos);
- } else if (skb->protocol == htons(ETH_P_IPV6)) {
- len = ntohs(ipv6_hdr(skb)->payload_len) +
- sizeof(struct ipv6hdr);
-- if (INET_ECN_is_ce(PACKET_CB(skb)->ds))
-- IP6_ECN_set_ce(skb, ipv6_hdr(skb));
-+ INET_ECN_decapsulate(skb, PACKET_CB(skb)->ds, ipv6_get_dsfield(ipv6_hdr(skb)));
- } else {
- goto dishonest_packet_type;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0097-wireguard-selftests-use-normal-kernel-stack-size-on-.patch b/target/linux/generic/backport-5.4/080-wireguard-0097-wireguard-selftests-use-normal-kernel-stack-size-on-.patch
deleted file mode 100644
index f4543d2568..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0097-wireguard-selftests-use-normal-kernel-stack-size-on-.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 6 May 2020 15:33:02 -0600
-Subject: [PATCH] wireguard: selftests: use normal kernel stack size on ppc64
-
-commit a0fd7cc87a018df1a17f9d3f0bd994c1f22c6b34 upstream.
-
-While at some point it might have made sense to be running these tests
-on ppc64 with 4k stacks, the kernel hasn't actually used 4k stacks on
-64-bit powerpc in a long time, and more interesting things that we test
-don't really work when we deviate from the default (16k). So, we stop
-pushing our luck in this commit, and return to the default instead of
-the minimum.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config
-+++ b/tools/testing/selftests/wireguard/qemu/arch/powerpc64le.config
-@@ -10,3 +10,4 @@ CONFIG_CMDLINE_BOOL=y
- CONFIG_CMDLINE="console=hvc0 wg.success=hvc1"
- CONFIG_SECTION_MISMATCH_WARN_ONLY=y
- CONFIG_FRAME_WARN=1280
-+CONFIG_THREAD_SHIFT=14
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0098-wireguard-socket-remove-errant-restriction-on-loopin.patch b/target/linux/generic/backport-5.4/080-wireguard-0098-wireguard-socket-remove-errant-restriction-on-loopin.patch
deleted file mode 100644
index 6dafa4781b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0098-wireguard-socket-remove-errant-restriction-on-loopin.patch
+++ /dev/null
@@ -1,162 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 6 May 2020 15:33:03 -0600
-Subject: [PATCH] wireguard: socket: remove errant restriction on looping to
- self
-
-commit b673e24aad36981f327a6570412ffa7754de8911 upstream.
-
-It's already possible to create two different interfaces and loop
-packets between them. This has always been possible with tunnels in the
-kernel, and isn't specific to wireguard. Therefore, the networking stack
-already needs to deal with that. At the very least, the packet winds up
-exceeding the MTU and is discarded at that point. So, since this is
-already something that happens, there's no need to forbid the not very
-exceptional case of routing a packet back to the same interface; this
-loop is no different than others, and we shouldn't special case it, but
-rather rely on generic handling of loops in general. This also makes it
-easier to do interesting things with wireguard such as onion routing.
-
-At the same time, we add a selftest for this, ensuring that both onion
-routing works and infinite routing loops do not crash the kernel. We
-also add a test case for wireguard interfaces nesting packets and
-sending traffic between each other, as well as the loop in this case
-too. We make sure to send some throughput-heavy traffic for this use
-case, to stress out any possible recursion issues with the locks around
-workqueues.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/socket.c | 12 -----
- tools/testing/selftests/wireguard/netns.sh | 54 ++++++++++++++++++++--
- 2 files changed, 51 insertions(+), 15 deletions(-)
-
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -76,12 +76,6 @@ static int send4(struct wg_device *wg, s
- net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
- wg->dev->name, &endpoint->addr, ret);
- goto err;
-- } else if (unlikely(rt->dst.dev == skb->dev)) {
-- ip_rt_put(rt);
-- ret = -ELOOP;
-- net_dbg_ratelimited("%s: Avoiding routing loop to %pISpfsc\n",
-- wg->dev->name, &endpoint->addr);
-- goto err;
- }
- if (cache)
- dst_cache_set_ip4(cache, &rt->dst, fl.saddr);
-@@ -149,12 +143,6 @@ static int send6(struct wg_device *wg, s
- net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
- wg->dev->name, &endpoint->addr, ret);
- goto err;
-- } else if (unlikely(dst->dev == skb->dev)) {
-- dst_release(dst);
-- ret = -ELOOP;
-- net_dbg_ratelimited("%s: Avoiding routing loop to %pISpfsc\n",
-- wg->dev->name, &endpoint->addr);
-- goto err;
- }
- if (cache)
- dst_cache_set_ip6(cache, dst, &fl.saddr);
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -48,8 +48,11 @@ cleanup() {
- exec 2>/dev/null
- printf "$orig_message_cost" > /proc/sys/net/core/message_cost
- ip0 link del dev wg0
-+ ip0 link del dev wg1
- ip1 link del dev wg0
-+ ip1 link del dev wg1
- ip2 link del dev wg0
-+ ip2 link del dev wg1
- local to_kill="$(ip netns pids $netns0) $(ip netns pids $netns1) $(ip netns pids $netns2)"
- [[ -n $to_kill ]] && kill $to_kill
- pp ip netns del $netns1
-@@ -77,18 +80,20 @@ ip0 link set wg0 netns $netns2
- key1="$(pp wg genkey)"
- key2="$(pp wg genkey)"
- key3="$(pp wg genkey)"
-+key4="$(pp wg genkey)"
- pub1="$(pp wg pubkey <<<"$key1")"
- pub2="$(pp wg pubkey <<<"$key2")"
- pub3="$(pp wg pubkey <<<"$key3")"
-+pub4="$(pp wg pubkey <<<"$key4")"
- psk="$(pp wg genpsk)"
- [[ -n $key1 && -n $key2 && -n $psk ]]
-
- configure_peers() {
- ip1 addr add 192.168.241.1/24 dev wg0
-- ip1 addr add fd00::1/24 dev wg0
-+ ip1 addr add fd00::1/112 dev wg0
-
- ip2 addr add 192.168.241.2/24 dev wg0
-- ip2 addr add fd00::2/24 dev wg0
-+ ip2 addr add fd00::2/112 dev wg0
-
- n1 wg set wg0 \
- private-key <(echo "$key1") \
-@@ -230,9 +235,38 @@ n1 ping -W 1 -c 1 192.168.241.2
- n1 wg set wg0 private-key <(echo "$key3")
- n2 wg set wg0 peer "$pub3" preshared-key <(echo "$psk") allowed-ips 192.168.241.1/32 peer "$pub1" remove
- n1 ping -W 1 -c 1 192.168.241.2
-+n2 wg set wg0 peer "$pub3" remove
-
--ip1 link del wg0
-+# Test that we can route wg through wg
-+ip1 addr flush dev wg0
-+ip2 addr flush dev wg0
-+ip1 addr add fd00::5:1/112 dev wg0
-+ip2 addr add fd00::5:2/112 dev wg0
-+n1 wg set wg0 private-key <(echo "$key1") peer "$pub2" preshared-key <(echo "$psk") allowed-ips fd00::5:2/128 endpoint 127.0.0.1:2
-+n2 wg set wg0 private-key <(echo "$key2") listen-port 2 peer "$pub1" preshared-key <(echo "$psk") allowed-ips fd00::5:1/128 endpoint 127.212.121.99:9998
-+ip1 link add wg1 type wireguard
-+ip2 link add wg1 type wireguard
-+ip1 addr add 192.168.241.1/24 dev wg1
-+ip1 addr add fd00::1/112 dev wg1
-+ip2 addr add 192.168.241.2/24 dev wg1
-+ip2 addr add fd00::2/112 dev wg1
-+ip1 link set mtu 1340 up dev wg1
-+ip2 link set mtu 1340 up dev wg1
-+n1 wg set wg1 listen-port 5 private-key <(echo "$key3") peer "$pub4" allowed-ips 192.168.241.2/32,fd00::2/128 endpoint [fd00::5:2]:5
-+n2 wg set wg1 listen-port 5 private-key <(echo "$key4") peer "$pub3" allowed-ips 192.168.241.1/32,fd00::1/128 endpoint [fd00::5:1]:5
-+tests
-+# Try to set up a routing loop between the two namespaces
-+ip1 link set netns $netns0 dev wg1
-+ip0 addr add 192.168.241.1/24 dev wg1
-+ip0 link set up dev wg1
-+n0 ping -W 1 -c 1 192.168.241.2
-+n1 wg set wg0 peer "$pub2" endpoint 192.168.241.2:7
- ip2 link del wg0
-+ip2 link del wg1
-+! n0 ping -W 1 -c 10 -f 192.168.241.2 || false # Should not crash kernel
-+
-+ip0 link del wg1
-+ip1 link del wg0
-
- # Test using NAT. We now change the topology to this:
- # ┌────────────────────────────────────────┐ ┌────────────────────────────────────────────────┐ ┌────────────────────────────────────────┐
-@@ -282,6 +316,20 @@ pp sleep 3
- n2 ping -W 1 -c 1 192.168.241.1
- n1 wg set wg0 peer "$pub2" persistent-keepalive 0
-
-+# Test that onion routing works, even when it loops
-+n1 wg set wg0 peer "$pub3" allowed-ips 192.168.242.2/32 endpoint 192.168.241.2:5
-+ip1 addr add 192.168.242.1/24 dev wg0
-+ip2 link add wg1 type wireguard
-+ip2 addr add 192.168.242.2/24 dev wg1
-+n2 wg set wg1 private-key <(echo "$key3") listen-port 5 peer "$pub1" allowed-ips 192.168.242.1/32
-+ip2 link set wg1 up
-+n1 ping -W 1 -c 1 192.168.242.2
-+ip2 link del wg1
-+n1 wg set wg0 peer "$pub3" endpoint 192.168.242.2:5
-+! n1 ping -W 1 -c 1 192.168.242.2 || false # Should not crash kernel
-+n1 wg set wg0 peer "$pub3" remove
-+ip1 addr del 192.168.242.1/24 dev wg0
-+
- # Do a wg-quick(8)-style policy routing for the default route, making sure vethc has a v6 address to tease out bugs.
- ip1 -6 addr add fc00::9/96 dev vethc
- ip1 -6 route add default via fc00::1
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0099-wireguard-send-receive-cond_resched-when-processing-.patch b/target/linux/generic/backport-5.4/080-wireguard-0099-wireguard-send-receive-cond_resched-when-processing-.patch
deleted file mode 100644
index 499b36bc5f..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0099-wireguard-send-receive-cond_resched-when-processing-.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 6 May 2020 15:33:04 -0600
-Subject: [PATCH] wireguard: send/receive: cond_resched() when processing
- worker ringbuffers
-
-commit 4005f5c3c9d006157ba716594e0d70c88a235c5e upstream.
-
-Users with pathological hardware reported CPU stalls on CONFIG_
-PREEMPT_VOLUNTARY=y, because the ringbuffers would stay full, meaning
-these workers would never terminate. That turned out not to be okay on
-systems without forced preemption, which Sultan observed. This commit
-adds a cond_resched() to the bottom of each loop iteration, so that
-these workers don't hog the core. Note that we don't need this on the
-napi poll worker, since that terminates after its budget is expended.
-
-Suggested-by: Sultan Alsawaf <sultan@kerneltoast.com>
-Reported-by: Wang Jian <larkwang@gmail.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 2 ++
- drivers/net/wireguard/send.c | 4 ++++
- 2 files changed, 6 insertions(+)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -516,6 +516,8 @@ void wg_packet_decrypt_worker(struct wor
- &PACKET_CB(skb)->keypair->receiving)) ?
- PACKET_STATE_CRYPTED : PACKET_STATE_DEAD;
- wg_queue_enqueue_per_peer_napi(skb, state);
-+ if (need_resched())
-+ cond_resched();
- }
- }
-
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -281,6 +281,8 @@ void wg_packet_tx_worker(struct work_str
-
- wg_noise_keypair_put(keypair, false);
- wg_peer_put(peer);
-+ if (need_resched())
-+ cond_resched();
- }
- }
-
-@@ -304,6 +306,8 @@ void wg_packet_encrypt_worker(struct wor
- }
- wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first,
- state);
-+ if (need_resched())
-+ cond_resched();
- }
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0100-wireguard-selftests-initalize-ipv6-members-to-NULL-t.patch b/target/linux/generic/backport-5.4/080-wireguard-0100-wireguard-selftests-initalize-ipv6-members-to-NULL-t.patch
deleted file mode 100644
index c1124be5ca..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0100-wireguard-selftests-initalize-ipv6-members-to-NULL-t.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 6 May 2020 15:33:05 -0600
-Subject: [PATCH] wireguard: selftests: initalize ipv6 members to NULL to
- squelch clang warning
-
-commit 4fed818ef54b08d4b29200e416cce65546ad5312 upstream.
-
-Without setting these to NULL, clang complains in certain
-configurations that have CONFIG_IPV6=n:
-
-In file included from drivers/net/wireguard/ratelimiter.c:223:
-drivers/net/wireguard/selftest/ratelimiter.c:173:34: error: variable 'skb6' is uninitialized when used here [-Werror,-Wuninitialized]
- ret = timings_test(skb4, hdr4, skb6, hdr6, &test_count);
- ^~~~
-drivers/net/wireguard/selftest/ratelimiter.c:123:29: note: initialize the variable 'skb6' to silence this warning
- struct sk_buff *skb4, *skb6;
- ^
- = NULL
-drivers/net/wireguard/selftest/ratelimiter.c:173:40: error: variable 'hdr6' is uninitialized when used here [-Werror,-Wuninitialized]
- ret = timings_test(skb4, hdr4, skb6, hdr6, &test_count);
- ^~~~
-drivers/net/wireguard/selftest/ratelimiter.c:125:22: note: initialize the variable 'hdr6' to silence this warning
- struct ipv6hdr *hdr6;
- ^
-
-We silence this warning by setting the variables to NULL as the warning
-suggests.
-
-Reported-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/selftest/ratelimiter.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/selftest/ratelimiter.c
-+++ b/drivers/net/wireguard/selftest/ratelimiter.c
-@@ -120,9 +120,9 @@ bool __init wg_ratelimiter_selftest(void
- enum { TRIALS_BEFORE_GIVING_UP = 5000 };
- bool success = false;
- int test = 0, trials;
-- struct sk_buff *skb4, *skb6;
-+ struct sk_buff *skb4, *skb6 = NULL;
- struct iphdr *hdr4;
-- struct ipv6hdr *hdr6;
-+ struct ipv6hdr *hdr6 = NULL;
-
- if (IS_ENABLED(CONFIG_KASAN) || IS_ENABLED(CONFIG_UBSAN))
- return true;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0101-wireguard-send-receive-use-explicit-unlikely-branch-.patch b/target/linux/generic/backport-5.4/080-wireguard-0101-wireguard-send-receive-use-explicit-unlikely-branch-.patch
deleted file mode 100644
index 900e2f2350..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0101-wireguard-send-receive-use-explicit-unlikely-branch-.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 6 May 2020 15:33:06 -0600
-Subject: [PATCH] wireguard: send/receive: use explicit unlikely branch instead
- of implicit coalescing
-
-commit 243f2148937adc72bcaaa590d482d599c936efde upstream.
-
-It's very unlikely that send will become true. It's nearly always false
-between 0 and 120 seconds of a session, and in most cases becomes true
-only between 120 and 121 seconds before becoming false again. So,
-unlikely(send) is clearly the right option here.
-
-What happened before was that we had this complex boolean expression
-with multiple likely and unlikely clauses nested. Since this is
-evaluated left-to-right anyway, the whole thing got converted to
-unlikely. So, we can clean this up to better represent what's going on.
-
-The generated code is the same.
-
-Suggested-by: Sultan Alsawaf <sultan@kerneltoast.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 13 ++++++-------
- drivers/net/wireguard/send.c | 15 ++++++---------
- 2 files changed, 12 insertions(+), 16 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -226,21 +226,20 @@ void wg_packet_handshake_receive_worker(
- static void keep_key_fresh(struct wg_peer *peer)
- {
- struct noise_keypair *keypair;
-- bool send = false;
-+ bool send;
-
- if (peer->sent_lastminute_handshake)
- return;
-
- rcu_read_lock_bh();
- keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
-- if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
-- keypair->i_am_the_initiator &&
-- unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
-- REJECT_AFTER_TIME - KEEPALIVE_TIMEOUT - REKEY_TIMEOUT)))
-- send = true;
-+ send = keypair && READ_ONCE(keypair->sending.is_valid) &&
-+ keypair->i_am_the_initiator &&
-+ wg_birthdate_has_expired(keypair->sending.birthdate,
-+ REJECT_AFTER_TIME - KEEPALIVE_TIMEOUT - REKEY_TIMEOUT);
- rcu_read_unlock_bh();
-
-- if (send) {
-+ if (unlikely(send)) {
- peer->sent_lastminute_handshake = true;
- wg_packet_send_queued_handshake_initiation(peer, false);
- }
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -124,20 +124,17 @@ void wg_packet_send_handshake_cookie(str
- static void keep_key_fresh(struct wg_peer *peer)
- {
- struct noise_keypair *keypair;
-- bool send = false;
-+ bool send;
-
- rcu_read_lock_bh();
- keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
-- if (likely(keypair && READ_ONCE(keypair->sending.is_valid)) &&
-- (unlikely(atomic64_read(&keypair->sending.counter.counter) >
-- REKEY_AFTER_MESSAGES) ||
-- (keypair->i_am_the_initiator &&
-- unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
-- REKEY_AFTER_TIME)))))
-- send = true;
-+ send = keypair && READ_ONCE(keypair->sending.is_valid) &&
-+ (atomic64_read(&keypair->sending.counter.counter) > REKEY_AFTER_MESSAGES ||
-+ (keypair->i_am_the_initiator &&
-+ wg_birthdate_has_expired(keypair->sending.birthdate, REKEY_AFTER_TIME)));
- rcu_read_unlock_bh();
-
-- if (send)
-+ if (unlikely(send))
- wg_packet_send_queued_handshake_initiation(peer, false);
- }
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0102-wireguard-selftests-use-newer-iproute2-for-gcc-10.patch b/target/linux/generic/backport-5.4/080-wireguard-0102-wireguard-selftests-use-newer-iproute2-for-gcc-10.patch
deleted file mode 100644
index d4efe37a49..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0102-wireguard-selftests-use-newer-iproute2-for-gcc-10.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 19 May 2020 22:49:27 -0600
-Subject: [PATCH] wireguard: selftests: use newer iproute2 for gcc-10
-
-commit ee3c1aa3f34b7842c1557cfe5d8c3f7b8c692de8 upstream.
-
-gcc-10 switched to defaulting to -fno-common, which broke iproute2-5.4.
-This was fixed in iproute-5.6, so switch to that. Because we're after a
-stable testing surface, we generally don't like to bump these
-unnecessarily, but in this case, being able to actually build is a basic
-necessity.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/qemu/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/tools/testing/selftests/wireguard/qemu/Makefile
-+++ b/tools/testing/selftests/wireguard/qemu/Makefile
-@@ -44,7 +44,7 @@ endef
- $(eval $(call tar_download,MUSL,musl,1.1.24,.tar.gz,https://www.musl-libc.org/releases/,1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3))
- $(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c))
- $(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
--$(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae))
-+$(eval $(call tar_download,IPROUTE2,iproute2,5.6.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,1b5b0e25ce6e23da7526ea1da044e814ad85ba761b10dd29c2b027c056b04692))
- $(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c))
- $(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa))
- $(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0103-wireguard-noise-read-preshared-key-while-taking-lock.patch b/target/linux/generic/backport-5.4/080-wireguard-0103-wireguard-noise-read-preshared-key-while-taking-lock.patch
deleted file mode 100644
index 2dac4b7064..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0103-wireguard-noise-read-preshared-key-while-taking-lock.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 19 May 2020 22:49:28 -0600
-Subject: [PATCH] wireguard: noise: read preshared key while taking lock
-
-commit bc67d371256f5c47d824e2eec51e46c8d62d022e upstream.
-
-Prior we read the preshared key after dropping the handshake lock, which
-isn't an actual crypto issue if it races, but it's still not quite
-correct. So copy that part of the state into a temporary like we do with
-the rest of the handshake state variables. Then we can release the lock,
-operate on the temporary, and zero it out at the end of the function. In
-performance tests, the impact of this was entirely unnoticable, probably
-because those bytes are coming from the same cacheline as other things
-that are being copied out in the same manner.
-
-Reported-by: Matt Dunwoodie <ncon@noconroy.net>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/noise.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -715,6 +715,7 @@ wg_noise_handshake_consume_response(stru
- u8 e[NOISE_PUBLIC_KEY_LEN];
- u8 ephemeral_private[NOISE_PUBLIC_KEY_LEN];
- u8 static_private[NOISE_PUBLIC_KEY_LEN];
-+ u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN];
-
- down_read(&wg->static_identity.lock);
-
-@@ -733,6 +734,8 @@ wg_noise_handshake_consume_response(stru
- memcpy(chaining_key, handshake->chaining_key, NOISE_HASH_LEN);
- memcpy(ephemeral_private, handshake->ephemeral_private,
- NOISE_PUBLIC_KEY_LEN);
-+ memcpy(preshared_key, handshake->preshared_key,
-+ NOISE_SYMMETRIC_KEY_LEN);
- up_read(&handshake->lock);
-
- if (state != HANDSHAKE_CREATED_INITIATION)
-@@ -750,7 +753,7 @@ wg_noise_handshake_consume_response(stru
- goto fail;
-
- /* psk */
-- mix_psk(chaining_key, hash, key, handshake->preshared_key);
-+ mix_psk(chaining_key, hash, key, preshared_key);
-
- /* {} */
- if (!message_decrypt(NULL, src->encrypted_nothing,
-@@ -783,6 +786,7 @@ out:
- memzero_explicit(chaining_key, NOISE_HASH_LEN);
- memzero_explicit(ephemeral_private, NOISE_PUBLIC_KEY_LEN);
- memzero_explicit(static_private, NOISE_PUBLIC_KEY_LEN);
-+ memzero_explicit(preshared_key, NOISE_SYMMETRIC_KEY_LEN);
- up_read(&wg->static_identity.lock);
- return ret_peer;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0104-wireguard-queueing-preserve-flow-hash-across-packet-.patch b/target/linux/generic/backport-5.4/080-wireguard-0104-wireguard-queueing-preserve-flow-hash-across-packet-.patch
deleted file mode 100644
index 31deadbfc1..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0104-wireguard-queueing-preserve-flow-hash-across-packet-.patch
+++ /dev/null
@@ -1,116 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 19 May 2020 22:49:29 -0600
-Subject: [PATCH] wireguard: queueing: preserve flow hash across packet
- scrubbing
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit c78a0b4a78839d572d8a80f6a62221c0d7843135 upstream.
-
-It's important that we clear most header fields during encapsulation and
-decapsulation, because the packet is substantially changed, and we don't
-want any info leak or logic bug due to an accidental correlation. But,
-for encapsulation, it's wrong to clear skb->hash, since it's used by
-fq_codel and flow dissection in general. Without it, classification does
-not proceed as usual. This change might make it easier to estimate the
-number of innerflows by examining clustering of out of order packets,
-but this shouldn't open up anything that can't already be inferred
-otherwise (e.g. syn packet size inference), and fq_codel can be disabled
-anyway.
-
-Furthermore, it might be the case that the hash isn't used or queried at
-all until after wireguard transmits the encrypted UDP packet, which
-means skb->hash might still be zero at this point, and thus no hash
-taken over the inner packet data. In order to address this situation, we
-force a calculation of skb->hash before encrypting packet data.
-
-Of course this means that fq_codel might transmit packets slightly more
-out of order than usual. Toke did some testing on beefy machines with
-high quantities of parallel flows and found that increasing the
-reply-attack counter to 8192 takes care of the most pathological cases
-pretty well.
-
-Reported-by: Dave Taht <dave.taht@gmail.com>
-Reviewed-and-tested-by: Toke Høiland-Jørgensen <toke@toke.dk>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/messages.h | 2 +-
- drivers/net/wireguard/queueing.h | 10 +++++++++-
- drivers/net/wireguard/receive.c | 2 +-
- drivers/net/wireguard/send.c | 7 ++++++-
- 4 files changed, 17 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/messages.h
-+++ b/drivers/net/wireguard/messages.h
-@@ -32,7 +32,7 @@ enum cookie_values {
- };
-
- enum counter_values {
-- COUNTER_BITS_TOTAL = 2048,
-+ COUNTER_BITS_TOTAL = 8192,
- COUNTER_REDUNDANT_BITS = BITS_PER_LONG,
- COUNTER_WINDOW_SIZE = COUNTER_BITS_TOTAL - COUNTER_REDUNDANT_BITS
- };
---- a/drivers/net/wireguard/queueing.h
-+++ b/drivers/net/wireguard/queueing.h
-@@ -87,12 +87,20 @@ static inline bool wg_check_packet_proto
- return real_protocol && skb->protocol == real_protocol;
- }
-
--static inline void wg_reset_packet(struct sk_buff *skb)
-+static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating)
- {
-+ u8 l4_hash = skb->l4_hash;
-+ u8 sw_hash = skb->sw_hash;
-+ u32 hash = skb->hash;
- skb_scrub_packet(skb, true);
- memset(&skb->headers_start, 0,
- offsetof(struct sk_buff, headers_end) -
- offsetof(struct sk_buff, headers_start));
-+ if (encapsulating) {
-+ skb->l4_hash = l4_hash;
-+ skb->sw_hash = sw_hash;
-+ skb->hash = hash;
-+ }
- skb->queue_mapping = 0;
- skb->nohdr = 0;
- skb->peeked = 0;
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -484,7 +484,7 @@ int wg_packet_rx_poll(struct napi_struct
- if (unlikely(wg_socket_endpoint_from_skb(&endpoint, skb)))
- goto next;
-
-- wg_reset_packet(skb);
-+ wg_reset_packet(skb, false);
- wg_packet_consume_data_done(peer, skb, &endpoint);
- free = false;
-
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -167,6 +167,11 @@ static bool encrypt_packet(struct sk_buf
- struct sk_buff *trailer;
- int num_frags;
-
-+ /* Force hash calculation before encryption so that flow analysis is
-+ * consistent over the inner packet.
-+ */
-+ skb_get_hash(skb);
-+
- /* Calculate lengths. */
- padding_len = calculate_skb_padding(skb);
- trailer_len = padding_len + noise_encrypted_len(0);
-@@ -295,7 +300,7 @@ void wg_packet_encrypt_worker(struct wor
- skb_list_walk_safe(first, skb, next) {
- if (likely(encrypt_packet(skb,
- PACKET_CB(first)->keypair))) {
-- wg_reset_packet(skb);
-+ wg_reset_packet(skb, true);
- } else {
- state = PACKET_STATE_DEAD;
- break;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0105-wireguard-noise-separate-receive-counter-from-send-c.patch b/target/linux/generic/backport-5.4/080-wireguard-0105-wireguard-noise-separate-receive-counter-from-send-c.patch
deleted file mode 100644
index 87d38d36fe..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0105-wireguard-noise-separate-receive-counter-from-send-c.patch
+++ /dev/null
@@ -1,330 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 19 May 2020 22:49:30 -0600
-Subject: [PATCH] wireguard: noise: separate receive counter from send counter
-
-commit a9e90d9931f3a474f04bab782ccd9d77904941e9 upstream.
-
-In "wireguard: queueing: preserve flow hash across packet scrubbing", we
-were required to slightly increase the size of the receive replay
-counter to something still fairly small, but an increase nonetheless.
-It turns out that we can recoup some of the additional memory overhead
-by splitting up the prior union type into two distinct types. Before, we
-used the same "noise_counter" union for both sending and receiving, with
-sending just using a simple atomic64_t, while receiving used the full
-replay counter checker. This meant that most of the memory being
-allocated for the sending counter was being wasted. Since the old
-"noise_counter" type increased in size in the prior commit, now is a
-good time to split up that union type into a distinct "noise_replay_
-counter" for receiving and a boring atomic64_t for sending, each using
-neither more nor less memory than required.
-
-Also, since sometimes the replay counter is accessed without
-necessitating additional accesses to the bitmap, we can reduce cache
-misses by hoisting the always-necessary lock above the bitmap in the
-struct layout. We also change a "noise_replay_counter" stack allocation
-to kmalloc in a -DDEBUG selftest so that KASAN doesn't trigger a stack
-frame warning.
-
-All and all, removing a bit of abstraction in this commit makes the code
-simpler and smaller, in addition to the motivating memory usage
-recuperation. For example, passing around raw "noise_symmetric_key"
-structs is something that really only makes sense within noise.c, in the
-one place where the sending and receiving keys can safely be thought of
-as the same type of object; subsequent to that, it's important that we
-uniformly access these through keypair->{sending,receiving}, where their
-distinct roles are always made explicit. So this patch allows us to draw
-that distinction clearly as well.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/noise.c | 16 +++------
- drivers/net/wireguard/noise.h | 14 ++++----
- drivers/net/wireguard/receive.c | 42 ++++++++++++------------
- drivers/net/wireguard/selftest/counter.c | 17 +++++++---
- drivers/net/wireguard/send.c | 12 +++----
- 5 files changed, 48 insertions(+), 53 deletions(-)
-
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -104,6 +104,7 @@ static struct noise_keypair *keypair_cre
-
- if (unlikely(!keypair))
- return NULL;
-+ spin_lock_init(&keypair->receiving_counter.lock);
- keypair->internal_id = atomic64_inc_return(&keypair_counter);
- keypair->entry.type = INDEX_HASHTABLE_KEYPAIR;
- keypair->entry.peer = peer;
-@@ -358,25 +359,16 @@ out:
- memzero_explicit(output, BLAKE2S_HASH_SIZE + 1);
- }
-
--static void symmetric_key_init(struct noise_symmetric_key *key)
--{
-- spin_lock_init(&key->counter.receive.lock);
-- atomic64_set(&key->counter.counter, 0);
-- memset(key->counter.receive.backtrack, 0,
-- sizeof(key->counter.receive.backtrack));
-- key->birthdate = ktime_get_coarse_boottime_ns();
-- key->is_valid = true;
--}
--
- static void derive_keys(struct noise_symmetric_key *first_dst,
- struct noise_symmetric_key *second_dst,
- const u8 chaining_key[NOISE_HASH_LEN])
- {
-+ u64 birthdate = ktime_get_coarse_boottime_ns();
- kdf(first_dst->key, second_dst->key, NULL, NULL,
- NOISE_SYMMETRIC_KEY_LEN, NOISE_SYMMETRIC_KEY_LEN, 0, 0,
- chaining_key);
-- symmetric_key_init(first_dst);
-- symmetric_key_init(second_dst);
-+ first_dst->birthdate = second_dst->birthdate = birthdate;
-+ first_dst->is_valid = second_dst->is_valid = true;
- }
-
- static bool __must_check mix_dh(u8 chaining_key[NOISE_HASH_LEN],
---- a/drivers/net/wireguard/noise.h
-+++ b/drivers/net/wireguard/noise.h
-@@ -15,18 +15,14 @@
- #include <linux/mutex.h>
- #include <linux/kref.h>
-
--union noise_counter {
-- struct {
-- u64 counter;
-- unsigned long backtrack[COUNTER_BITS_TOTAL / BITS_PER_LONG];
-- spinlock_t lock;
-- } receive;
-- atomic64_t counter;
-+struct noise_replay_counter {
-+ u64 counter;
-+ spinlock_t lock;
-+ unsigned long backtrack[COUNTER_BITS_TOTAL / BITS_PER_LONG];
- };
-
- struct noise_symmetric_key {
- u8 key[NOISE_SYMMETRIC_KEY_LEN];
-- union noise_counter counter;
- u64 birthdate;
- bool is_valid;
- };
-@@ -34,7 +30,9 @@ struct noise_symmetric_key {
- struct noise_keypair {
- struct index_hashtable_entry entry;
- struct noise_symmetric_key sending;
-+ atomic64_t sending_counter;
- struct noise_symmetric_key receiving;
-+ struct noise_replay_counter receiving_counter;
- __le32 remote_index;
- bool i_am_the_initiator;
- struct kref refcount;
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -245,20 +245,20 @@ static void keep_key_fresh(struct wg_pee
- }
- }
-
--static bool decrypt_packet(struct sk_buff *skb, struct noise_symmetric_key *key)
-+static bool decrypt_packet(struct sk_buff *skb, struct noise_keypair *keypair)
- {
- struct scatterlist sg[MAX_SKB_FRAGS + 8];
- struct sk_buff *trailer;
- unsigned int offset;
- int num_frags;
-
-- if (unlikely(!key))
-+ if (unlikely(!keypair))
- return false;
-
-- if (unlikely(!READ_ONCE(key->is_valid) ||
-- wg_birthdate_has_expired(key->birthdate, REJECT_AFTER_TIME) ||
-- key->counter.receive.counter >= REJECT_AFTER_MESSAGES)) {
-- WRITE_ONCE(key->is_valid, false);
-+ if (unlikely(!READ_ONCE(keypair->receiving.is_valid) ||
-+ wg_birthdate_has_expired(keypair->receiving.birthdate, REJECT_AFTER_TIME) ||
-+ keypair->receiving_counter.counter >= REJECT_AFTER_MESSAGES)) {
-+ WRITE_ONCE(keypair->receiving.is_valid, false);
- return false;
- }
-
-@@ -283,7 +283,7 @@ static bool decrypt_packet(struct sk_buf
-
- if (!chacha20poly1305_decrypt_sg_inplace(sg, skb->len, NULL, 0,
- PACKET_CB(skb)->nonce,
-- key->key))
-+ keypair->receiving.key))
- return false;
-
- /* Another ugly situation of pushing and pulling the header so as to
-@@ -298,41 +298,41 @@ static bool decrypt_packet(struct sk_buf
- }
-
- /* This is RFC6479, a replay detection bitmap algorithm that avoids bitshifts */
--static bool counter_validate(union noise_counter *counter, u64 their_counter)
-+static bool counter_validate(struct noise_replay_counter *counter, u64 their_counter)
- {
- unsigned long index, index_current, top, i;
- bool ret = false;
-
-- spin_lock_bh(&counter->receive.lock);
-+ spin_lock_bh(&counter->lock);
-
-- if (unlikely(counter->receive.counter >= REJECT_AFTER_MESSAGES + 1 ||
-+ if (unlikely(counter->counter >= REJECT_AFTER_MESSAGES + 1 ||
- their_counter >= REJECT_AFTER_MESSAGES))
- goto out;
-
- ++their_counter;
-
- if (unlikely((COUNTER_WINDOW_SIZE + their_counter) <
-- counter->receive.counter))
-+ counter->counter))
- goto out;
-
- index = their_counter >> ilog2(BITS_PER_LONG);
-
-- if (likely(their_counter > counter->receive.counter)) {
-- index_current = counter->receive.counter >> ilog2(BITS_PER_LONG);
-+ if (likely(their_counter > counter->counter)) {
-+ index_current = counter->counter >> ilog2(BITS_PER_LONG);
- top = min_t(unsigned long, index - index_current,
- COUNTER_BITS_TOTAL / BITS_PER_LONG);
- for (i = 1; i <= top; ++i)
-- counter->receive.backtrack[(i + index_current) &
-+ counter->backtrack[(i + index_current) &
- ((COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1)] = 0;
-- counter->receive.counter = their_counter;
-+ counter->counter = their_counter;
- }
-
- index &= (COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1;
- ret = !test_and_set_bit(their_counter & (BITS_PER_LONG - 1),
-- &counter->receive.backtrack[index]);
-+ &counter->backtrack[index]);
-
- out:
-- spin_unlock_bh(&counter->receive.lock);
-+ spin_unlock_bh(&counter->lock);
- return ret;
- }
-
-@@ -472,12 +472,12 @@ int wg_packet_rx_poll(struct napi_struct
- if (unlikely(state != PACKET_STATE_CRYPTED))
- goto next;
-
-- if (unlikely(!counter_validate(&keypair->receiving.counter,
-+ if (unlikely(!counter_validate(&keypair->receiving_counter,
- PACKET_CB(skb)->nonce))) {
- net_dbg_ratelimited("%s: Packet has invalid nonce %llu (max %llu)\n",
- peer->device->dev->name,
- PACKET_CB(skb)->nonce,
-- keypair->receiving.counter.receive.counter);
-+ keypair->receiving_counter.counter);
- goto next;
- }
-
-@@ -511,8 +511,8 @@ void wg_packet_decrypt_worker(struct wor
- struct sk_buff *skb;
-
- while ((skb = ptr_ring_consume_bh(&queue->ring)) != NULL) {
-- enum packet_state state = likely(decrypt_packet(skb,
-- &PACKET_CB(skb)->keypair->receiving)) ?
-+ enum packet_state state =
-+ likely(decrypt_packet(skb, PACKET_CB(skb)->keypair)) ?
- PACKET_STATE_CRYPTED : PACKET_STATE_DEAD;
- wg_queue_enqueue_per_peer_napi(skb, state);
- if (need_resched())
---- a/drivers/net/wireguard/selftest/counter.c
-+++ b/drivers/net/wireguard/selftest/counter.c
-@@ -6,18 +6,24 @@
- #ifdef DEBUG
- bool __init wg_packet_counter_selftest(void)
- {
-+ struct noise_replay_counter *counter;
- unsigned int test_num = 0, i;
-- union noise_counter counter;
- bool success = true;
-
--#define T_INIT do { \
-- memset(&counter, 0, sizeof(union noise_counter)); \
-- spin_lock_init(&counter.receive.lock); \
-+ counter = kmalloc(sizeof(*counter), GFP_KERNEL);
-+ if (unlikely(!counter)) {
-+ pr_err("nonce counter self-test malloc: FAIL\n");
-+ return false;
-+ }
-+
-+#define T_INIT do { \
-+ memset(counter, 0, sizeof(*counter)); \
-+ spin_lock_init(&counter->lock); \
- } while (0)
- #define T_LIM (COUNTER_WINDOW_SIZE + 1)
- #define T(n, v) do { \
- ++test_num; \
-- if (counter_validate(&counter, n) != (v)) { \
-+ if (counter_validate(counter, n) != (v)) { \
- pr_err("nonce counter self-test %u: FAIL\n", \
- test_num); \
- success = false; \
-@@ -99,6 +105,7 @@ bool __init wg_packet_counter_selftest(v
-
- if (success)
- pr_info("nonce counter self-tests: pass\n");
-+ kfree(counter);
- return success;
- }
- #endif
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -129,7 +129,7 @@ static void keep_key_fresh(struct wg_pee
- rcu_read_lock_bh();
- keypair = rcu_dereference_bh(peer->keypairs.current_keypair);
- send = keypair && READ_ONCE(keypair->sending.is_valid) &&
-- (atomic64_read(&keypair->sending.counter.counter) > REKEY_AFTER_MESSAGES ||
-+ (atomic64_read(&keypair->sending_counter) > REKEY_AFTER_MESSAGES ||
- (keypair->i_am_the_initiator &&
- wg_birthdate_has_expired(keypair->sending.birthdate, REKEY_AFTER_TIME)));
- rcu_read_unlock_bh();
-@@ -349,7 +349,6 @@ void wg_packet_purge_staged_packets(stru
-
- void wg_packet_send_staged_packets(struct wg_peer *peer)
- {
-- struct noise_symmetric_key *key;
- struct noise_keypair *keypair;
- struct sk_buff_head packets;
- struct sk_buff *skb;
-@@ -369,10 +368,9 @@ void wg_packet_send_staged_packets(struc
- rcu_read_unlock_bh();
- if (unlikely(!keypair))
- goto out_nokey;
-- key = &keypair->sending;
-- if (unlikely(!READ_ONCE(key->is_valid)))
-+ if (unlikely(!READ_ONCE(keypair->sending.is_valid)))
- goto out_nokey;
-- if (unlikely(wg_birthdate_has_expired(key->birthdate,
-+ if (unlikely(wg_birthdate_has_expired(keypair->sending.birthdate,
- REJECT_AFTER_TIME)))
- goto out_invalid;
-
-@@ -387,7 +385,7 @@ void wg_packet_send_staged_packets(struc
- */
- PACKET_CB(skb)->ds = ip_tunnel_ecn_encap(0, ip_hdr(skb), skb);
- PACKET_CB(skb)->nonce =
-- atomic64_inc_return(&key->counter.counter) - 1;
-+ atomic64_inc_return(&keypair->sending_counter) - 1;
- if (unlikely(PACKET_CB(skb)->nonce >= REJECT_AFTER_MESSAGES))
- goto out_invalid;
- }
-@@ -399,7 +397,7 @@ void wg_packet_send_staged_packets(struc
- return;
-
- out_invalid:
-- WRITE_ONCE(key->is_valid, false);
-+ WRITE_ONCE(keypair->sending.is_valid, false);
- out_nokey:
- wg_noise_keypair_put(keypair, false);
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0106-wireguard-noise-do-not-assign-initiation-time-in-if-.patch b/target/linux/generic/backport-5.4/080-wireguard-0106-wireguard-noise-do-not-assign-initiation-time-in-if-.patch
deleted file mode 100644
index a53c764708..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0106-wireguard-noise-do-not-assign-initiation-time-in-if-.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Frank Werner-Krippendorf <mail@hb9fxq.ch>
-Date: Tue, 23 Jun 2020 03:59:44 -0600
-Subject: [PATCH] wireguard: noise: do not assign initiation time in if
- condition
-
-commit 558b353c9c2a717509f291c066c6bd8f5f5e21be upstream.
-
-Fixes an error condition reported by checkpatch.pl which caused by
-assigning a variable in an if condition in wg_noise_handshake_consume_
-initiation().
-
-Signed-off-by: Frank Werner-Krippendorf <mail@hb9fxq.ch>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/noise.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -617,8 +617,8 @@ wg_noise_handshake_consume_initiation(st
- memcpy(handshake->hash, hash, NOISE_HASH_LEN);
- memcpy(handshake->chaining_key, chaining_key, NOISE_HASH_LEN);
- handshake->remote_index = src->sender_index;
-- if ((s64)(handshake->last_initiation_consumption -
-- (initiation_consumption = ktime_get_coarse_boottime_ns())) < 0)
-+ initiation_consumption = ktime_get_coarse_boottime_ns();
-+ if ((s64)(handshake->last_initiation_consumption - initiation_consumption) < 0)
- handshake->last_initiation_consumption = initiation_consumption;
- handshake->state = HANDSHAKE_CONSUMED_INITIATION;
- up_write(&handshake->lock);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0107-wireguard-device-avoid-circular-netns-references.patch b/target/linux/generic/backport-5.4/080-wireguard-0107-wireguard-device-avoid-circular-netns-references.patch
deleted file mode 100644
index 013023a3e2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0107-wireguard-device-avoid-circular-netns-references.patch
+++ /dev/null
@@ -1,296 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 23 Jun 2020 03:59:45 -0600
-Subject: [PATCH] wireguard: device: avoid circular netns references
-
-commit 900575aa33a3eaaef802b31de187a85c4a4b4bd0 upstream.
-
-Before, we took a reference to the creating netns if the new netns was
-different. This caused issues with circular references, with two
-wireguard interfaces swapping namespaces. The solution is to rather not
-take any extra references at all, but instead simply invalidate the
-creating netns pointer when that netns is deleted.
-
-In order to prevent this from happening again, this commit improves the
-rough object leak tracking by allowing it to account for created and
-destroyed interfaces, aside from just peers and keys. That then makes it
-possible to check for the object leak when having two interfaces take a
-reference to each others' namespaces.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 58 ++++++++++------------
- drivers/net/wireguard/device.h | 3 +-
- drivers/net/wireguard/netlink.c | 14 ++++--
- drivers/net/wireguard/socket.c | 25 +++++++---
- tools/testing/selftests/wireguard/netns.sh | 13 ++++-
- 5 files changed, 67 insertions(+), 46 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -45,17 +45,18 @@ static int wg_open(struct net_device *de
- if (dev_v6)
- dev_v6->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_NONE;
-
-+ mutex_lock(&wg->device_update_lock);
- ret = wg_socket_init(wg, wg->incoming_port);
- if (ret < 0)
-- return ret;
-- mutex_lock(&wg->device_update_lock);
-+ goto out;
- list_for_each_entry(peer, &wg->peer_list, peer_list) {
- wg_packet_send_staged_packets(peer);
- if (peer->persistent_keepalive_interval)
- wg_packet_send_keepalive(peer);
- }
-+out:
- mutex_unlock(&wg->device_update_lock);
-- return 0;
-+ return ret;
- }
-
- #ifdef CONFIG_PM_SLEEP
-@@ -225,6 +226,7 @@ static void wg_destruct(struct net_devic
- list_del(&wg->device_list);
- rtnl_unlock();
- mutex_lock(&wg->device_update_lock);
-+ rcu_assign_pointer(wg->creating_net, NULL);
- wg->incoming_port = 0;
- wg_socket_reinit(wg, NULL, NULL);
- /* The final references are cleared in the below calls to destroy_workqueue. */
-@@ -240,13 +242,11 @@ static void wg_destruct(struct net_devic
- skb_queue_purge(&wg->incoming_handshakes);
- free_percpu(dev->tstats);
- free_percpu(wg->incoming_handshakes_worker);
-- if (wg->have_creating_net_ref)
-- put_net(wg->creating_net);
- kvfree(wg->index_hashtable);
- kvfree(wg->peer_hashtable);
- mutex_unlock(&wg->device_update_lock);
-
-- pr_debug("%s: Interface deleted\n", dev->name);
-+ pr_debug("%s: Interface destroyed\n", dev->name);
- free_netdev(dev);
- }
-
-@@ -292,7 +292,7 @@ static int wg_newlink(struct net *src_ne
- struct wg_device *wg = netdev_priv(dev);
- int ret = -ENOMEM;
-
-- wg->creating_net = src_net;
-+ rcu_assign_pointer(wg->creating_net, src_net);
- init_rwsem(&wg->static_identity.lock);
- mutex_init(&wg->socket_update_lock);
- mutex_init(&wg->device_update_lock);
-@@ -393,30 +393,26 @@ static struct rtnl_link_ops link_ops __r
- .newlink = wg_newlink,
- };
-
--static int wg_netdevice_notification(struct notifier_block *nb,
-- unsigned long action, void *data)
-+static void wg_netns_pre_exit(struct net *net)
- {
-- struct net_device *dev = ((struct netdev_notifier_info *)data)->dev;
-- struct wg_device *wg = netdev_priv(dev);
--
-- ASSERT_RTNL();
--
-- if (action != NETDEV_REGISTER || dev->netdev_ops != &netdev_ops)
-- return 0;
-+ struct wg_device *wg;
-
-- if (dev_net(dev) == wg->creating_net && wg->have_creating_net_ref) {
-- put_net(wg->creating_net);
-- wg->have_creating_net_ref = false;
-- } else if (dev_net(dev) != wg->creating_net &&
-- !wg->have_creating_net_ref) {
-- wg->have_creating_net_ref = true;
-- get_net(wg->creating_net);
-+ rtnl_lock();
-+ list_for_each_entry(wg, &device_list, device_list) {
-+ if (rcu_access_pointer(wg->creating_net) == net) {
-+ pr_debug("%s: Creating namespace exiting\n", wg->dev->name);
-+ netif_carrier_off(wg->dev);
-+ mutex_lock(&wg->device_update_lock);
-+ rcu_assign_pointer(wg->creating_net, NULL);
-+ wg_socket_reinit(wg, NULL, NULL);
-+ mutex_unlock(&wg->device_update_lock);
-+ }
- }
-- return 0;
-+ rtnl_unlock();
- }
-
--static struct notifier_block netdevice_notifier = {
-- .notifier_call = wg_netdevice_notification
-+static struct pernet_operations pernet_ops = {
-+ .pre_exit = wg_netns_pre_exit
- };
-
- int __init wg_device_init(void)
-@@ -429,18 +425,18 @@ int __init wg_device_init(void)
- return ret;
- #endif
-
-- ret = register_netdevice_notifier(&netdevice_notifier);
-+ ret = register_pernet_device(&pernet_ops);
- if (ret)
- goto error_pm;
-
- ret = rtnl_link_register(&link_ops);
- if (ret)
-- goto error_netdevice;
-+ goto error_pernet;
-
- return 0;
-
--error_netdevice:
-- unregister_netdevice_notifier(&netdevice_notifier);
-+error_pernet:
-+ unregister_pernet_device(&pernet_ops);
- error_pm:
- #ifdef CONFIG_PM_SLEEP
- unregister_pm_notifier(&pm_notifier);
-@@ -451,7 +447,7 @@ error_pm:
- void wg_device_uninit(void)
- {
- rtnl_link_unregister(&link_ops);
-- unregister_netdevice_notifier(&netdevice_notifier);
-+ unregister_pernet_device(&pernet_ops);
- #ifdef CONFIG_PM_SLEEP
- unregister_pm_notifier(&pm_notifier);
- #endif
---- a/drivers/net/wireguard/device.h
-+++ b/drivers/net/wireguard/device.h
-@@ -40,7 +40,7 @@ struct wg_device {
- struct net_device *dev;
- struct crypt_queue encrypt_queue, decrypt_queue;
- struct sock __rcu *sock4, *sock6;
-- struct net *creating_net;
-+ struct net __rcu *creating_net;
- struct noise_static_identity static_identity;
- struct workqueue_struct *handshake_receive_wq, *handshake_send_wq;
- struct workqueue_struct *packet_crypt_wq;
-@@ -56,7 +56,6 @@ struct wg_device {
- unsigned int num_peers, device_update_gen;
- u32 fwmark;
- u16 incoming_port;
-- bool have_creating_net_ref;
- };
-
- int wg_device_init(void);
---- a/drivers/net/wireguard/netlink.c
-+++ b/drivers/net/wireguard/netlink.c
-@@ -517,11 +517,15 @@ static int wg_set_device(struct sk_buff
- if (flags & ~__WGDEVICE_F_ALL)
- goto out;
-
-- ret = -EPERM;
-- if ((info->attrs[WGDEVICE_A_LISTEN_PORT] ||
-- info->attrs[WGDEVICE_A_FWMARK]) &&
-- !ns_capable(wg->creating_net->user_ns, CAP_NET_ADMIN))
-- goto out;
-+ if (info->attrs[WGDEVICE_A_LISTEN_PORT] || info->attrs[WGDEVICE_A_FWMARK]) {
-+ struct net *net;
-+ rcu_read_lock();
-+ net = rcu_dereference(wg->creating_net);
-+ ret = !net || !ns_capable(net->user_ns, CAP_NET_ADMIN) ? -EPERM : 0;
-+ rcu_read_unlock();
-+ if (ret)
-+ goto out;
-+ }
-
- ++wg->device_update_gen;
-
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -347,6 +347,7 @@ static void set_sock_opts(struct socket
-
- int wg_socket_init(struct wg_device *wg, u16 port)
- {
-+ struct net *net;
- int ret;
- struct udp_tunnel_sock_cfg cfg = {
- .sk_user_data = wg,
-@@ -371,37 +372,47 @@ int wg_socket_init(struct wg_device *wg,
- };
- #endif
-
-+ rcu_read_lock();
-+ net = rcu_dereference(wg->creating_net);
-+ net = net ? maybe_get_net(net) : NULL;
-+ rcu_read_unlock();
-+ if (unlikely(!net))
-+ return -ENONET;
-+
- #if IS_ENABLED(CONFIG_IPV6)
- retry:
- #endif
-
-- ret = udp_sock_create(wg->creating_net, &port4, &new4);
-+ ret = udp_sock_create(net, &port4, &new4);
- if (ret < 0) {
- pr_err("%s: Could not create IPv4 socket\n", wg->dev->name);
-- return ret;
-+ goto out;
- }
- set_sock_opts(new4);
-- setup_udp_tunnel_sock(wg->creating_net, new4, &cfg);
-+ setup_udp_tunnel_sock(net, new4, &cfg);
-
- #if IS_ENABLED(CONFIG_IPV6)
- if (ipv6_mod_enabled()) {
- port6.local_udp_port = inet_sk(new4->sk)->inet_sport;
-- ret = udp_sock_create(wg->creating_net, &port6, &new6);
-+ ret = udp_sock_create(net, &port6, &new6);
- if (ret < 0) {
- udp_tunnel_sock_release(new4);
- if (ret == -EADDRINUSE && !port && retries++ < 100)
- goto retry;
- pr_err("%s: Could not create IPv6 socket\n",
- wg->dev->name);
-- return ret;
-+ goto out;
- }
- set_sock_opts(new6);
-- setup_udp_tunnel_sock(wg->creating_net, new6, &cfg);
-+ setup_udp_tunnel_sock(net, new6, &cfg);
- }
- #endif
-
- wg_socket_reinit(wg, new4->sk, new6 ? new6->sk : NULL);
-- return 0;
-+ ret = 0;
-+out:
-+ put_net(net);
-+ return ret;
- }
-
- void wg_socket_reinit(struct wg_device *wg, struct sock *new4,
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -587,9 +587,20 @@ ip0 link set wg0 up
- kill $ncat_pid
- ip0 link del wg0
-
-+# Ensure there aren't circular reference loops
-+ip1 link add wg1 type wireguard
-+ip2 link add wg2 type wireguard
-+ip1 link set wg1 netns $netns2
-+ip2 link set wg2 netns $netns1
-+pp ip netns delete $netns1
-+pp ip netns delete $netns2
-+pp ip netns add $netns1
-+pp ip netns add $netns2
-+
-+sleep 2 # Wait for cleanup and grace periods
- declare -A objects
- while read -t 0.1 -r line 2>/dev/null || [[ $? -ne 142 ]]; do
-- [[ $line =~ .*(wg[0-9]+:\ [A-Z][a-z]+\ [0-9]+)\ .*(created|destroyed).* ]] || continue
-+ [[ $line =~ .*(wg[0-9]+:\ [A-Z][a-z]+\ ?[0-9]*)\ .*(created|destroyed).* ]] || continue
- objects["${BASH_REMATCH[1]}"]+="${BASH_REMATCH[2]}"
- done < /dev/kmsg
- alldeleted=1
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0108-wireguard-receive-account-for-napi_gro_receive-never.patch b/target/linux/generic/backport-5.4/080-wireguard-0108-wireguard-receive-account-for-napi_gro_receive-never.patch
deleted file mode 100644
index eceb0b9255..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0108-wireguard-receive-account-for-napi_gro_receive-never.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 24 Jun 2020 16:06:03 -0600
-Subject: [PATCH] wireguard: receive: account for napi_gro_receive never
- returning GRO_DROP
-
-commit df08126e3833e9dca19e2407db5f5860a7c194fb upstream.
-
-The napi_gro_receive function no longer returns GRO_DROP ever, making
-handling GRO_DROP dead code. This commit removes that dead code.
-Further, it's not even clear that device drivers have any business in
-taking action after passing off received packets; that's arguably out of
-their hands.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Fixes: 6570bc79c0df ("net: core: use listified Rx for GRO_NORMAL in napi_gro_receive()")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/receive.c | 10 ++--------
- 1 file changed, 2 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -414,14 +414,8 @@ static void wg_packet_consume_data_done(
- if (unlikely(routed_peer != peer))
- goto dishonest_packet_peer;
-
-- if (unlikely(napi_gro_receive(&peer->napi, skb) == GRO_DROP)) {
-- ++dev->stats.rx_dropped;
-- net_dbg_ratelimited("%s: Failed to give packet to userspace from peer %llu (%pISpfsc)\n",
-- dev->name, peer->internal_id,
-- &peer->endpoint.addr);
-- } else {
-- update_rx_stats(peer, message_data_len(len_before_trim));
-- }
-+ napi_gro_receive(&peer->napi, skb);
-+ update_rx_stats(peer, message_data_len(len_before_trim));
- return;
-
- dishonest_packet_peer:
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0109-net-ip_tunnel-add-header_ops-for-layer-3-devices.patch b/target/linux/generic/backport-5.4/080-wireguard-0109-net-ip_tunnel-add-header_ops-for-layer-3-devices.patch
deleted file mode 100644
index cfd6b1457c..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0109-net-ip_tunnel-add-header_ops-for-layer-3-devices.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 29 Jun 2020 19:06:18 -0600
-Subject: [PATCH] net: ip_tunnel: add header_ops for layer 3 devices
-
-commit 2606aff916854b61234bf85001be9777bab2d5f8 upstream.
-
-Some devices that take straight up layer 3 packets benefit from having a
-shared header_ops so that AF_PACKET sockets can inject packets that are
-recognized. This shared infrastructure will be used by other drivers
-that currently can't inject packets using AF_PACKET. It also exposes the
-parser function, as it is useful in standalone form too.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Acked-by: Willem de Bruijn <willemb@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- include/net/ip_tunnels.h | 3 +++
- net/ipv4/ip_tunnel_core.c | 18 ++++++++++++++++++
- 2 files changed, 21 insertions(+)
-
---- a/include/net/ip_tunnels.h
-+++ b/include/net/ip_tunnels.h
-@@ -289,6 +289,9 @@ int ip_tunnel_newlink(struct net_device
- struct ip_tunnel_parm *p, __u32 fwmark);
- void ip_tunnel_setup(struct net_device *dev, unsigned int net_id);
-
-+extern const struct header_ops ip_tunnel_header_ops;
-+__be16 ip_tunnel_parse_protocol(const struct sk_buff *skb);
-+
- struct ip_tunnel_encap_ops {
- size_t (*encap_hlen)(struct ip_tunnel_encap *e);
- int (*build_header)(struct sk_buff *skb, struct ip_tunnel_encap *e,
---- a/net/ipv4/ip_tunnel_core.c
-+++ b/net/ipv4/ip_tunnel_core.c
-@@ -446,3 +446,21 @@ void ip_tunnel_unneed_metadata(void)
- static_branch_dec(&ip_tunnel_metadata_cnt);
- }
- EXPORT_SYMBOL_GPL(ip_tunnel_unneed_metadata);
-+
-+/* Returns either the correct skb->protocol value, or 0 if invalid. */
-+__be16 ip_tunnel_parse_protocol(const struct sk_buff *skb)
-+{
-+ if (skb_network_header(skb) >= skb->head &&
-+ (skb_network_header(skb) + sizeof(struct iphdr)) <= skb_tail_pointer(skb) &&
-+ ip_hdr(skb)->version == 4)
-+ return htons(ETH_P_IP);
-+ if (skb_network_header(skb) >= skb->head &&
-+ (skb_network_header(skb) + sizeof(struct ipv6hdr)) <= skb_tail_pointer(skb) &&
-+ ipv6_hdr(skb)->version == 6)
-+ return htons(ETH_P_IPV6);
-+ return 0;
-+}
-+EXPORT_SYMBOL(ip_tunnel_parse_protocol);
-+
-+const struct header_ops ip_tunnel_header_ops = { .parse_protocol = ip_tunnel_parse_protocol };
-+EXPORT_SYMBOL(ip_tunnel_header_ops);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0110-wireguard-implement-header_ops-parse_protocol-for-AF.patch b/target/linux/generic/backport-5.4/080-wireguard-0110-wireguard-implement-header_ops-parse_protocol-for-AF.patch
deleted file mode 100644
index 415ecffeef..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0110-wireguard-implement-header_ops-parse_protocol-for-AF.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 29 Jun 2020 19:06:20 -0600
-Subject: [PATCH] wireguard: implement header_ops->parse_protocol for AF_PACKET
-
-commit 01a4967c71c004f8ecad4ab57021348636502fa9 upstream.
-
-WireGuard uses skb->protocol to determine packet type, and bails out if
-it's not set or set to something it's not expecting. For AF_PACKET
-injection, we need to support its call chain of:
-
- packet_sendmsg -> packet_snd -> packet_parse_headers ->
- dev_parse_header_protocol -> parse_protocol
-
-Without a valid parse_protocol, this returns zero, and wireguard then
-rejects the skb. So, this wires up the ip_tunnel handler for layer 3
-packets for that case.
-
-Reported-by: Hans Wippel <ndev@hwipl.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -262,6 +262,7 @@ static void wg_setup(struct net_device *
- max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
-
- dev->netdev_ops = &netdev_ops;
-+ dev->header_ops = &ip_tunnel_header_ops;
- dev->hard_header_len = 0;
- dev->addr_len = 0;
- dev->needed_headroom = DATA_PACKET_HEAD_ROOM;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0111-wireguard-queueing-make-use-of-ip_tunnel_parse_proto.patch b/target/linux/generic/backport-5.4/080-wireguard-0111-wireguard-queueing-make-use-of-ip_tunnel_parse_proto.patch
deleted file mode 100644
index a777732ce7..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0111-wireguard-queueing-make-use-of-ip_tunnel_parse_proto.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 29 Jun 2020 19:06:21 -0600
-Subject: [PATCH] wireguard: queueing: make use of ip_tunnel_parse_protocol
-
-commit 1a574074ae7d1d745c16f7710655f38a53174c27 upstream.
-
-Now that wg_examine_packet_protocol has been added for general
-consumption as ip_tunnel_parse_protocol, it's possible to remove
-wg_examine_packet_protocol and simply use the new
-ip_tunnel_parse_protocol function directly.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/queueing.h | 19 ++-----------------
- drivers/net/wireguard/receive.c | 2 +-
- 2 files changed, 3 insertions(+), 18 deletions(-)
-
---- a/drivers/net/wireguard/queueing.h
-+++ b/drivers/net/wireguard/queueing.h
-@@ -11,6 +11,7 @@
- #include <linux/skbuff.h>
- #include <linux/ip.h>
- #include <linux/ipv6.h>
-+#include <net/ip_tunnels.h>
-
- struct wg_device;
- struct wg_peer;
-@@ -65,25 +66,9 @@ struct packet_cb {
- #define PACKET_CB(skb) ((struct packet_cb *)((skb)->cb))
- #define PACKET_PEER(skb) (PACKET_CB(skb)->keypair->entry.peer)
-
--/* Returns either the correct skb->protocol value, or 0 if invalid. */
--static inline __be16 wg_examine_packet_protocol(struct sk_buff *skb)
--{
-- if (skb_network_header(skb) >= skb->head &&
-- (skb_network_header(skb) + sizeof(struct iphdr)) <=
-- skb_tail_pointer(skb) &&
-- ip_hdr(skb)->version == 4)
-- return htons(ETH_P_IP);
-- if (skb_network_header(skb) >= skb->head &&
-- (skb_network_header(skb) + sizeof(struct ipv6hdr)) <=
-- skb_tail_pointer(skb) &&
-- ipv6_hdr(skb)->version == 6)
-- return htons(ETH_P_IPV6);
-- return 0;
--}
--
- static inline bool wg_check_packet_protocol(struct sk_buff *skb)
- {
-- __be16 real_protocol = wg_examine_packet_protocol(skb);
-+ __be16 real_protocol = ip_tunnel_parse_protocol(skb);
- return real_protocol && skb->protocol == real_protocol;
- }
-
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -387,7 +387,7 @@ static void wg_packet_consume_data_done(
- */
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- skb->csum_level = ~0; /* All levels */
-- skb->protocol = wg_examine_packet_protocol(skb);
-+ skb->protocol = ip_tunnel_parse_protocol(skb);
- if (skb->protocol == htons(ETH_P_IP)) {
- len = ntohs(ip_hdr(skb)->tot_len);
- if (unlikely(len < sizeof(struct iphdr)))
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0112-netlink-consistently-use-NLA_POLICY_EXACT_LEN.patch b/target/linux/generic/backport-5.4/080-wireguard-0112-netlink-consistently-use-NLA_POLICY_EXACT_LEN.patch
deleted file mode 100644
index 4b2712bb2d..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0112-netlink-consistently-use-NLA_POLICY_EXACT_LEN.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Tue, 18 Aug 2020 10:17:31 +0200
-Subject: [PATCH] netlink: consistently use NLA_POLICY_EXACT_LEN()
-
-commit 8140860c817f3e9f78bcd1e420b9777ddcbaa629 upstream.
-
-Change places that open-code NLA_POLICY_EXACT_LEN() to
-use the macro instead, giving us flexibility in how we
-handle the details of the macro.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-[Jason: only picked the drivers/net/wireguard/* part]
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/netlink.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/net/wireguard/netlink.c
-+++ b/drivers/net/wireguard/netlink.c
-@@ -22,8 +22,8 @@ static struct genl_family genl_family;
- static const struct nla_policy device_policy[WGDEVICE_A_MAX + 1] = {
- [WGDEVICE_A_IFINDEX] = { .type = NLA_U32 },
- [WGDEVICE_A_IFNAME] = { .type = NLA_NUL_STRING, .len = IFNAMSIZ - 1 },
-- [WGDEVICE_A_PRIVATE_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-- [WGDEVICE_A_PUBLIC_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-+ [WGDEVICE_A_PRIVATE_KEY] = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
-+ [WGDEVICE_A_PUBLIC_KEY] = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
- [WGDEVICE_A_FLAGS] = { .type = NLA_U32 },
- [WGDEVICE_A_LISTEN_PORT] = { .type = NLA_U16 },
- [WGDEVICE_A_FWMARK] = { .type = NLA_U32 },
-@@ -31,12 +31,12 @@ static const struct nla_policy device_po
- };
-
- static const struct nla_policy peer_policy[WGPEER_A_MAX + 1] = {
-- [WGPEER_A_PUBLIC_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_PUBLIC_KEY_LEN },
-- [WGPEER_A_PRESHARED_KEY] = { .type = NLA_EXACT_LEN, .len = NOISE_SYMMETRIC_KEY_LEN },
-+ [WGPEER_A_PUBLIC_KEY] = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
-+ [WGPEER_A_PRESHARED_KEY] = NLA_POLICY_EXACT_LEN(NOISE_SYMMETRIC_KEY_LEN),
- [WGPEER_A_FLAGS] = { .type = NLA_U32 },
- [WGPEER_A_ENDPOINT] = { .type = NLA_MIN_LEN, .len = sizeof(struct sockaddr) },
- [WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL] = { .type = NLA_U16 },
-- [WGPEER_A_LAST_HANDSHAKE_TIME] = { .type = NLA_EXACT_LEN, .len = sizeof(struct __kernel_timespec) },
-+ [WGPEER_A_LAST_HANDSHAKE_TIME] = NLA_POLICY_EXACT_LEN(sizeof(struct __kernel_timespec)),
- [WGPEER_A_RX_BYTES] = { .type = NLA_U64 },
- [WGPEER_A_TX_BYTES] = { .type = NLA_U64 },
- [WGPEER_A_ALLOWEDIPS] = { .type = NLA_NESTED },
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0113-netlink-consistently-use-NLA_POLICY_MIN_LEN.patch b/target/linux/generic/backport-5.4/080-wireguard-0113-netlink-consistently-use-NLA_POLICY_MIN_LEN.patch
deleted file mode 100644
index 4b414bc309..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0113-netlink-consistently-use-NLA_POLICY_MIN_LEN.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Tue, 18 Aug 2020 10:17:32 +0200
-Subject: [PATCH] netlink: consistently use NLA_POLICY_MIN_LEN()
-
-commit bc0435855041d7fff0b83dd992fc4be34aa11afb upstream.
-
-Change places that open-code NLA_POLICY_MIN_LEN() to
-use the macro instead, giving us flexibility in how we
-handle the details of the macro.
-
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-[Jason: only picked the drivers/net/wireguard/* part]
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/netlink.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/netlink.c
-+++ b/drivers/net/wireguard/netlink.c
-@@ -34,7 +34,7 @@ static const struct nla_policy peer_poli
- [WGPEER_A_PUBLIC_KEY] = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
- [WGPEER_A_PRESHARED_KEY] = NLA_POLICY_EXACT_LEN(NOISE_SYMMETRIC_KEY_LEN),
- [WGPEER_A_FLAGS] = { .type = NLA_U32 },
-- [WGPEER_A_ENDPOINT] = { .type = NLA_MIN_LEN, .len = sizeof(struct sockaddr) },
-+ [WGPEER_A_ENDPOINT] = NLA_POLICY_MIN_LEN(sizeof(struct sockaddr)),
- [WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL] = { .type = NLA_U16 },
- [WGPEER_A_LAST_HANDSHAKE_TIME] = NLA_POLICY_EXACT_LEN(sizeof(struct __kernel_timespec)),
- [WGPEER_A_RX_BYTES] = { .type = NLA_U64 },
-@@ -45,7 +45,7 @@ static const struct nla_policy peer_poli
-
- static const struct nla_policy allowedip_policy[WGALLOWEDIP_A_MAX + 1] = {
- [WGALLOWEDIP_A_FAMILY] = { .type = NLA_U16 },
-- [WGALLOWEDIP_A_IPADDR] = { .type = NLA_MIN_LEN, .len = sizeof(struct in_addr) },
-+ [WGALLOWEDIP_A_IPADDR] = NLA_POLICY_MIN_LEN(sizeof(struct in_addr)),
- [WGALLOWEDIP_A_CIDR_MASK] = { .type = NLA_U8 }
- };
-
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0114-wireguard-noise-take-lock-when-removing-handshake-en.patch b/target/linux/generic/backport-5.4/080-wireguard-0114-wireguard-noise-take-lock-when-removing-handshake-en.patch
deleted file mode 100644
index e80528c91b..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0114-wireguard-noise-take-lock-when-removing-handshake-en.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 9 Sep 2020 13:58:14 +0200
-Subject: [PATCH] wireguard: noise: take lock when removing handshake entry
- from table
-
-commit 9179ba31367bcf481c3c79b5f028c94faad9f30a upstream.
-
-Eric reported that syzkaller found a race of this variety:
-
-CPU 1 CPU 2
--------------------------------------------|---------------------------------------
-wg_index_hashtable_replace(old, ...) |
- if (hlist_unhashed(&old->index_hash)) |
- | wg_index_hashtable_remove(old)
- | hlist_del_init_rcu(&old->index_hash)
- | old->index_hash.pprev = NULL
- hlist_replace_rcu(&old->index_hash, ...) |
- *old->index_hash.pprev |
-
-Syzbot wasn't actually able to reproduce this more than once or create a
-reproducer, because the race window between checking "hlist_unhashed" and
-calling "hlist_replace_rcu" is just so small. Adding an mdelay(5) or
-similar there helps make this demonstrable using this simple script:
-
- #!/bin/bash
- set -ex
- trap 'kill $pid1; kill $pid2; ip link del wg0; ip link del wg1' EXIT
- ip link add wg0 type wireguard
- ip link add wg1 type wireguard
- wg set wg0 private-key <(wg genkey) listen-port 9999
- wg set wg1 private-key <(wg genkey) peer $(wg show wg0 public-key) endpoint 127.0.0.1:9999 persistent-keepalive 1
- wg set wg0 peer $(wg show wg1 public-key)
- ip link set wg0 up
- yes link set wg1 up | ip -force -batch - &
- pid1=$!
- yes link set wg1 down | ip -force -batch - &
- pid2=$!
- wait
-
-The fundumental underlying problem is that we permit calls to wg_index_
-hashtable_remove(handshake.entry) without requiring the caller to take
-the handshake mutex that is intended to protect members of handshake
-during mutations. This is consistently the case with calls to wg_index_
-hashtable_insert(handshake.entry) and wg_index_hashtable_replace(
-handshake.entry), but it's missing from a pertinent callsite of wg_
-index_hashtable_remove(handshake.entry). So, this patch makes sure that
-mutex is taken.
-
-The original code was a little bit funky though, in the form of:
-
- remove(handshake.entry)
- lock(), memzero(handshake.some_members), unlock()
- remove(handshake.entry)
-
-The original intention of that double removal pattern outside the lock
-appears to be some attempt to prevent insertions that might happen while
-locks are dropped during expensive crypto operations, but actually, all
-callers of wg_index_hashtable_insert(handshake.entry) take the write
-lock and then explicitly check handshake.state, as they should, which
-the aforementioned memzero clears, which means an insertion should
-already be impossible. And regardless, the original intention was
-necessarily racy, since it wasn't guaranteed that something else would
-run after the unlock() instead of after the remove(). So, from a
-soundness perspective, it seems positive to remove what looks like a
-hack at best.
-
-The crash from both syzbot and from the script above is as follows:
-
- general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN
- KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
- CPU: 0 PID: 7395 Comm: kworker/0:3 Not tainted 5.9.0-rc4-syzkaller #0
- Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
- Workqueue: wg-kex-wg1 wg_packet_handshake_receive_worker
- RIP: 0010:hlist_replace_rcu include/linux/rculist.h:505 [inline]
- RIP: 0010:wg_index_hashtable_replace+0x176/0x330 drivers/net/wireguard/peerlookup.c:174
- Code: 00 fc ff df 48 89 f9 48 c1 e9 03 80 3c 01 00 0f 85 44 01 00 00 48 b9 00 00 00 00 00 fc ff df 48 8b 45 10 48 89 c6 48 c1 ee 03 <80> 3c 0e 00 0f 85 06 01 00 00 48 85 d2 4c 89 28 74 47 e8 a3 4f b5
- RSP: 0018:ffffc90006a97bf8 EFLAGS: 00010246
- RAX: 0000000000000000 RBX: ffff888050ffc4f8 RCX: dffffc0000000000
- RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88808e04e010
- RBP: ffff88808e04e000 R08: 0000000000000001 R09: ffff8880543d0000
- R10: ffffed100a87a000 R11: 000000000000016e R12: ffff8880543d0000
- R13: ffff88808e04e008 R14: ffff888050ffc508 R15: ffff888050ffc500
- FS: 0000000000000000(0000) GS:ffff8880ae600000(0000) knlGS:0000000000000000
- CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
- CR2: 00000000f5505db0 CR3: 0000000097cf7000 CR4: 00000000001526f0
- DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
- DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
- Call Trace:
- wg_noise_handshake_begin_session+0x752/0xc9a drivers/net/wireguard/noise.c:820
- wg_receive_handshake_packet drivers/net/wireguard/receive.c:183 [inline]
- wg_packet_handshake_receive_worker+0x33b/0x730 drivers/net/wireguard/receive.c:220
- process_one_work+0x94c/0x1670 kernel/workqueue.c:2269
- worker_thread+0x64c/0x1120 kernel/workqueue.c:2415
- kthread+0x3b5/0x4a0 kernel/kthread.c:292
- ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:294
-
-Reported-by: syzbot <syzkaller@googlegroups.com>
-Reported-by: Eric Dumazet <edumazet@google.com>
-Link: https://lore.kernel.org/wireguard/20200908145911.4090480-1-edumazet@google.com/
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/noise.c | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/noise.c
-+++ b/drivers/net/wireguard/noise.c
-@@ -87,15 +87,12 @@ static void handshake_zero(struct noise_
-
- void wg_noise_handshake_clear(struct noise_handshake *handshake)
- {
-+ down_write(&handshake->lock);
- wg_index_hashtable_remove(
- handshake->entry.peer->device->index_hashtable,
- &handshake->entry);
-- down_write(&handshake->lock);
- handshake_zero(handshake);
- up_write(&handshake->lock);
-- wg_index_hashtable_remove(
-- handshake->entry.peer->device->index_hashtable,
-- &handshake->entry);
- }
-
- static struct noise_keypair *keypair_create(struct wg_peer *peer)
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0115-wireguard-peerlookup-take-lock-before-checking-hash-.patch b/target/linux/generic/backport-5.4/080-wireguard-0115-wireguard-peerlookup-take-lock-before-checking-hash-.patch
deleted file mode 100644
index e7f46ddf9c..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0115-wireguard-peerlookup-take-lock-before-checking-hash-.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Wed, 9 Sep 2020 13:58:15 +0200
-Subject: [PATCH] wireguard: peerlookup: take lock before checking hash in
- replace operation
-
-commit 6147f7b1e90ff09bd52afc8b9206a7fcd133daf7 upstream.
-
-Eric's suggested fix for the previous commit's mentioned race condition
-was to simply take the table->lock in wg_index_hashtable_replace(). The
-table->lock of the hash table is supposed to protect the bucket heads,
-not the entires, but actually, since all the mutator functions are
-already taking it, it makes sense to take it too for the test to
-hlist_unhashed, as a defense in depth measure, so that it no longer
-races with deletions, regardless of what other locks are protecting
-individual entries. This is sensible from a performance perspective
-because, as Eric pointed out, the case of being unhashed is already the
-unlikely case, so this won't add common contention. And comparing
-instructions, this basically doesn't make much of a difference other
-than pushing and popping %r13, used by the new `bool ret`. More
-generally, I like the idea of locking consistency across table mutator
-functions, and this might let me rest slightly easier at night.
-
-Suggested-by: Eric Dumazet <edumazet@google.com>
-Link: https://lore.kernel.org/wireguard/20200908145911.4090480-1-edumazet@google.com/
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/peerlookup.c | 11 ++++++++---
- 1 file changed, 8 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireguard/peerlookup.c
-+++ b/drivers/net/wireguard/peerlookup.c
-@@ -167,9 +167,13 @@ bool wg_index_hashtable_replace(struct i
- struct index_hashtable_entry *old,
- struct index_hashtable_entry *new)
- {
-- if (unlikely(hlist_unhashed(&old->index_hash)))
-- return false;
-+ bool ret;
-+
- spin_lock_bh(&table->lock);
-+ ret = !hlist_unhashed(&old->index_hash);
-+ if (unlikely(!ret))
-+ goto out;
-+
- new->index = old->index;
- hlist_replace_rcu(&old->index_hash, &new->index_hash);
-
-@@ -180,8 +184,9 @@ bool wg_index_hashtable_replace(struct i
- * simply gets dropped, which isn't terrible.
- */
- INIT_HLIST_NODE(&old->index_hash);
-+out:
- spin_unlock_bh(&table->lock);
-- return true;
-+ return ret;
- }
-
- void wg_index_hashtable_remove(struct index_hashtable *table,
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0116-wireguard-selftests-check-that-route_me_harder-packe.patch b/target/linux/generic/backport-5.4/080-wireguard-0116-wireguard-selftests-check-that-route_me_harder-packe.patch
deleted file mode 100644
index 09c1b0b8f8..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0116-wireguard-selftests-check-that-route_me_harder-packe.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Thu, 29 Oct 2020 03:56:05 +0100
-Subject: [PATCH] wireguard: selftests: check that route_me_harder packets use
- the right sk
-
-commit af8afcf1fdd5f365f70e2386c2d8c7a1abd853d7 upstream.
-
-If netfilter changes the packet mark, the packet is rerouted. The
-ip_route_me_harder family of functions fails to use the right sk, opting
-to instead use skb->sk, resulting in a routing loop when used with
-tunnels. With the next change fixing this issue in netfilter, test for
-the relevant condition inside our test suite, since wireguard was where
-the bug was discovered.
-
-Reported-by: Chen Minqiang <ptpt52@gmail.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 8 ++++++++
- tools/testing/selftests/wireguard/qemu/kernel.config | 2 ++
- 2 files changed, 10 insertions(+)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -316,6 +316,14 @@ pp sleep 3
- n2 ping -W 1 -c 1 192.168.241.1
- n1 wg set wg0 peer "$pub2" persistent-keepalive 0
-
-+# Test that sk_bound_dev_if works
-+n1 ping -I wg0 -c 1 -W 1 192.168.241.2
-+# What about when the mark changes and the packet must be rerouted?
-+n1 iptables -t mangle -I OUTPUT -j MARK --set-xmark 1
-+n1 ping -c 1 -W 1 192.168.241.2 # First the boring case
-+n1 ping -I wg0 -c 1 -W 1 192.168.241.2 # Then the sk_bound_dev_if case
-+n1 iptables -t mangle -D OUTPUT -j MARK --set-xmark 1
-+
- # Test that onion routing works, even when it loops
- n1 wg set wg0 peer "$pub3" allowed-ips 192.168.242.2/32 endpoint 192.168.241.2:5
- ip1 addr add 192.168.242.1/24 dev wg0
---- a/tools/testing/selftests/wireguard/qemu/kernel.config
-+++ b/tools/testing/selftests/wireguard/qemu/kernel.config
-@@ -18,10 +18,12 @@ CONFIG_NF_NAT=y
- CONFIG_NETFILTER_XTABLES=y
- CONFIG_NETFILTER_XT_NAT=y
- CONFIG_NETFILTER_XT_MATCH_LENGTH=y
-+CONFIG_NETFILTER_XT_MARK=y
- CONFIG_NF_CONNTRACK_IPV4=y
- CONFIG_NF_NAT_IPV4=y
- CONFIG_IP_NF_IPTABLES=y
- CONFIG_IP_NF_FILTER=y
-+CONFIG_IP_NF_MANGLE=y
- CONFIG_IP_NF_NAT=y
- CONFIG_IP_ADVANCED_ROUTER=y
- CONFIG_IP_MULTIPLE_TABLES=y
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0117-wireguard-avoid-double-unlikely-notation-when-using-.patch b/target/linux/generic/backport-5.4/080-wireguard-0117-wireguard-avoid-double-unlikely-notation-when-using-.patch
deleted file mode 100644
index 7dfc1bb919..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0117-wireguard-avoid-double-unlikely-notation-when-using-.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Antonio Quartulli <a@unstable.cc>
-Date: Mon, 22 Feb 2021 17:25:43 +0100
-Subject: [PATCH] wireguard: avoid double unlikely() notation when using
- IS_ERR()
-
-commit 30ac4e2f54ec067b7b9ca0db27e75681581378d6 upstream.
-
-The definition of IS_ERR() already applies the unlikely() notation
-when checking the error status of the passed pointer. For this
-reason there is no need to have the same notation outside of
-IS_ERR() itself.
-
-Clean up code by removing redundant notation.
-
-Signed-off-by: Antonio Quartulli <a@unstable.cc>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 2 +-
- drivers/net/wireguard/socket.c | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -157,7 +157,7 @@ static netdev_tx_t wg_xmit(struct sk_buf
- } else {
- struct sk_buff *segs = skb_gso_segment(skb, 0);
-
-- if (unlikely(IS_ERR(segs))) {
-+ if (IS_ERR(segs)) {
- ret = PTR_ERR(segs);
- goto err_peer;
- }
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -71,7 +71,7 @@ static int send4(struct wg_device *wg, s
- ip_rt_put(rt);
- rt = ip_route_output_flow(sock_net(sock), &fl, sock);
- }
-- if (unlikely(IS_ERR(rt))) {
-+ if (IS_ERR(rt)) {
- ret = PTR_ERR(rt);
- net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
- wg->dev->name, &endpoint->addr, ret);
-@@ -138,7 +138,7 @@ static int send6(struct wg_device *wg, s
- }
- dst = ipv6_stub->ipv6_dst_lookup_flow(sock_net(sock), sock, &fl,
- NULL);
-- if (unlikely(IS_ERR(dst))) {
-+ if (IS_ERR(dst)) {
- ret = PTR_ERR(dst);
- net_dbg_ratelimited("%s: No route to %pISpfsc, error %d\n",
- wg->dev->name, &endpoint->addr, ret);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0118-wireguard-socket-remove-bogus-__be32-annotation.patch b/target/linux/generic/backport-5.4/080-wireguard-0118-wireguard-socket-remove-bogus-__be32-annotation.patch
deleted file mode 100644
index 1796f54de9..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0118-wireguard-socket-remove-bogus-__be32-annotation.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jann Horn <jannh@google.com>
-Date: Mon, 22 Feb 2021 17:25:44 +0100
-Subject: [PATCH] wireguard: socket: remove bogus __be32 annotation
-
-commit 7f57bd8dc22de35ddd895294aa554003e4f19a72 upstream.
-
-The endpoint->src_if4 has nothing to do with fixed-endian numbers; remove
-the bogus annotation.
-
-This was introduced in
-https://git.zx2c4.com/wireguard-monolithic-historical/commit?id=14e7d0a499a676ec55176c0de2f9fcbd34074a82
-in the historical WireGuard repo because the old code used to
-zero-initialize multiple members as follows:
-
- endpoint->src4.s_addr = endpoint->src_if4 = fl.saddr = 0;
-
-Because fl.saddr is fixed-endian and an assignment returns a value with the
-type of its left operand, this meant that sparse detected an assignment
-between values of different endianness.
-
-Since then, this assignment was already split up into separate statements;
-just the cast survived.
-
-Signed-off-by: Jann Horn <jannh@google.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/socket.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -53,7 +53,7 @@ static int send4(struct wg_device *wg, s
- if (unlikely(!inet_confirm_addr(sock_net(sock), NULL, 0,
- fl.saddr, RT_SCOPE_HOST))) {
- endpoint->src4.s_addr = 0;
-- *(__force __be32 *)&endpoint->src_if4 = 0;
-+ endpoint->src_if4 = 0;
- fl.saddr = 0;
- if (cache)
- dst_cache_reset(cache);
-@@ -63,7 +63,7 @@ static int send4(struct wg_device *wg, s
- PTR_ERR(rt) == -EINVAL) || (!IS_ERR(rt) &&
- rt->dst.dev->ifindex != endpoint->src_if4)))) {
- endpoint->src4.s_addr = 0;
-- *(__force __be32 *)&endpoint->src_if4 = 0;
-+ endpoint->src_if4 = 0;
- fl.saddr = 0;
- if (cache)
- dst_cache_reset(cache);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0119-wireguard-selftests-test-multiple-parallel-streams.patch b/target/linux/generic/backport-5.4/080-wireguard-0119-wireguard-selftests-test-multiple-parallel-streams.patch
deleted file mode 100644
index 3093de45f7..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0119-wireguard-selftests-test-multiple-parallel-streams.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 22 Feb 2021 17:25:45 +0100
-Subject: [PATCH] wireguard: selftests: test multiple parallel streams
-
-commit d5a49aa6c3e264a93a7d08485d66e346be0969dd upstream.
-
-In order to test ndo_start_xmit being called in parallel, explicitly add
-separate tests, which should all run on different cores. This should
-help tease out bugs associated with queueing up packets from different
-cores in parallel. Currently, it hasn't found those types of bugs, but
-given future planned work, this is a useful regression to avoid.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -39,7 +39,7 @@ ip0() { pretty 0 "ip $*"; ip -n $netns0
- ip1() { pretty 1 "ip $*"; ip -n $netns1 "$@"; }
- ip2() { pretty 2 "ip $*"; ip -n $netns2 "$@"; }
- sleep() { read -t "$1" -N 1 || true; }
--waitiperf() { pretty "${1//*-}" "wait for iperf:5201 pid $2"; while [[ $(ss -N "$1" -tlpH 'sport = 5201') != *\"iperf3\",pid=$2,fd=* ]]; do sleep 0.1; done; }
-+waitiperf() { pretty "${1//*-}" "wait for iperf:${3:-5201} pid $2"; while [[ $(ss -N "$1" -tlpH "sport = ${3:-5201}") != *\"iperf3\",pid=$2,fd=* ]]; do sleep 0.1; done; }
- waitncatudp() { pretty "${1//*-}" "wait for udp:1111 pid $2"; while [[ $(ss -N "$1" -ulpH 'sport = 1111') != *\"ncat\",pid=$2,fd=* ]]; do sleep 0.1; done; }
- waitiface() { pretty "${1//*-}" "wait for $2 to come up"; ip netns exec "$1" bash -c "while [[ \$(< \"/sys/class/net/$2/operstate\") != up ]]; do read -t .1 -N 0 || true; done;"; }
-
-@@ -141,6 +141,19 @@ tests() {
- n2 iperf3 -s -1 -B fd00::2 &
- waitiperf $netns2 $!
- n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2
-+
-+ # TCP over IPv4, in parallel
-+ for max in 4 5 50; do
-+ local pids=( )
-+ for ((i=0; i < max; ++i)) do
-+ n2 iperf3 -p $(( 5200 + i )) -s -1 -B 192.168.241.2 &
-+ pids+=( $! ); waitiperf $netns2 $! $(( 5200 + i ))
-+ done
-+ for ((i=0; i < max; ++i)) do
-+ n1 iperf3 -Z -t 3 -p $(( 5200 + i )) -c 192.168.241.2 &
-+ done
-+ wait "${pids[@]}"
-+ done
- }
-
- [[ $(ip1 link show dev wg0) =~ mtu\ ([0-9]+) ]] && orig_mtu="${BASH_REMATCH[1]}"
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0120-wireguard-peer-put-frequently-used-members-above-cac.patch b/target/linux/generic/backport-5.4/080-wireguard-0120-wireguard-peer-put-frequently-used-members-above-cac.patch
deleted file mode 100644
index 69e76b96e3..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0120-wireguard-peer-put-frequently-used-members-above-cac.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 22 Feb 2021 17:25:46 +0100
-Subject: [PATCH] wireguard: peer: put frequently used members above cache
- lines
-
-commit 5a0598695634a6bb4126818902dd9140cd9df8b6 upstream.
-
-The is_dead boolean is checked for every single packet, while the
-internal_id member is used basically only for pr_debug messages. So it
-makes sense to hoist up is_dead into some space formerly unused by a
-struct hole, while demoting internal_api to below the lowest struct
-cache line.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/peer.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/peer.h
-+++ b/drivers/net/wireguard/peer.h
-@@ -39,6 +39,7 @@ struct wg_peer {
- struct crypt_queue tx_queue, rx_queue;
- struct sk_buff_head staged_packet_queue;
- int serial_work_cpu;
-+ bool is_dead;
- struct noise_keypairs keypairs;
- struct endpoint endpoint;
- struct dst_cache endpoint_cache;
-@@ -61,9 +62,8 @@ struct wg_peer {
- struct rcu_head rcu;
- struct list_head peer_list;
- struct list_head allowedips_list;
-- u64 internal_id;
- struct napi_struct napi;
-- bool is_dead;
-+ u64 internal_id;
- };
-
- struct wg_peer *wg_peer_create(struct wg_device *wg,
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0121-wireguard-device-do-not-generate-ICMP-for-non-IP-pac.patch b/target/linux/generic/backport-5.4/080-wireguard-0121-wireguard-device-do-not-generate-ICMP-for-non-IP-pac.patch
deleted file mode 100644
index 073ee9b0d5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0121-wireguard-device-do-not-generate-ICMP-for-non-IP-pac.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 22 Feb 2021 17:25:47 +0100
-Subject: [PATCH] wireguard: device: do not generate ICMP for non-IP packets
-
-commit 99fff5264e7ab06f45b0ad60243475be0a8d0559 upstream.
-
-If skb->protocol doesn't match the actual skb->data header, it's
-probably not a good idea to pass it off to icmp{,v6}_ndo_send, which is
-expecting to reply to a valid IP packet. So this commit has that early
-mismatch case jump to a later error label.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -138,7 +138,7 @@ static netdev_tx_t wg_xmit(struct sk_buf
- else if (skb->protocol == htons(ETH_P_IPV6))
- net_dbg_ratelimited("%s: No peer has allowed IPs matching %pI6\n",
- dev->name, &ipv6_hdr(skb)->daddr);
-- goto err;
-+ goto err_icmp;
- }
-
- family = READ_ONCE(peer->endpoint.addr.sa_family);
-@@ -201,12 +201,13 @@ static netdev_tx_t wg_xmit(struct sk_buf
-
- err_peer:
- wg_peer_put(peer);
--err:
-- ++dev->stats.tx_errors;
-+err_icmp:
- if (skb->protocol == htons(ETH_P_IP))
- icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
- else if (skb->protocol == htons(ETH_P_IPV6))
- icmpv6_ndo_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
-+err:
-+ ++dev->stats.tx_errors;
- kfree_skb(skb);
- return ret;
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0122-wireguard-queueing-get-rid-of-per-peer-ring-buffers.patch b/target/linux/generic/backport-5.4/080-wireguard-0122-wireguard-queueing-get-rid-of-per-peer-ring-buffers.patch
deleted file mode 100644
index 9dc7ddae7f..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0122-wireguard-queueing-get-rid-of-per-peer-ring-buffers.patch
+++ /dev/null
@@ -1,560 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 22 Feb 2021 17:25:48 +0100
-Subject: [PATCH] wireguard: queueing: get rid of per-peer ring buffers
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit 8b5553ace83cced775eefd0f3f18b5c6214ccf7a upstream.
-
-Having two ring buffers per-peer means that every peer results in two
-massive ring allocations. On an 8-core x86_64 machine, this commit
-reduces the per-peer allocation from 18,688 bytes to 1,856 bytes, which
-is an 90% reduction. Ninety percent! With some single-machine
-deployments approaching 500,000 peers, we're talking about a reduction
-from 7 gigs of memory down to 700 megs of memory.
-
-In order to get rid of these per-peer allocations, this commit switches
-to using a list-based queueing approach. Currently GSO fragments are
-chained together using the skb->next pointer (the skb_list_* singly
-linked list approach), so we form the per-peer queue around the unused
-skb->prev pointer (which sort of makes sense because the links are
-pointing backwards). Use of skb_queue_* is not possible here, because
-that is based on doubly linked lists and spinlocks. Multiple cores can
-write into the queue at any given time, because its writes occur in the
-start_xmit path or in the udp_recv path. But reads happen in a single
-workqueue item per-peer, amounting to a multi-producer, single-consumer
-paradigm.
-
-The MPSC queue is implemented locklessly and never blocks. However, it
-is not linearizable (though it is serializable), with a very tight and
-unlikely race on writes, which, when hit (some tiny fraction of the
-0.15% of partial adds on a fully loaded 16-core x86_64 system), causes
-the queue reader to terminate early. However, because every packet sent
-queues up the same workqueue item after it is fully added, the worker
-resumes again, and stopping early isn't actually a problem, since at
-that point the packet wouldn't have yet been added to the encryption
-queue. These properties allow us to avoid disabling interrupts or
-spinning. The design is based on Dmitry Vyukov's algorithm [1].
-
-Performance-wise, ordinarily list-based queues aren't preferable to
-ringbuffers, because of cache misses when following pointers around.
-However, we *already* have to follow the adjacent pointers when working
-through fragments, so there shouldn't actually be any change there. A
-potential downside is that dequeueing is a bit more complicated, but the
-ptr_ring structure used prior had a spinlock when dequeueing, so all and
-all the difference appears to be a wash.
-
-Actually, from profiling, the biggest performance hit, by far, of this
-commit winds up being atomic_add_unless(count, 1, max) and atomic_
-dec(count), which account for the majority of CPU time, according to
-perf. In that sense, the previous ring buffer was superior in that it
-could check if it was full by head==tail, which the list-based approach
-cannot do.
-
-But all and all, this enables us to get massive memory savings, allowing
-WireGuard to scale for real world deployments, without taking much of a
-performance hit.
-
-[1] http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue
-
-Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
-Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/device.c | 12 ++---
- drivers/net/wireguard/device.h | 15 +++---
- drivers/net/wireguard/peer.c | 28 ++++-------
- drivers/net/wireguard/peer.h | 4 +-
- drivers/net/wireguard/queueing.c | 86 +++++++++++++++++++++++++-------
- drivers/net/wireguard/queueing.h | 45 ++++++++++++-----
- drivers/net/wireguard/receive.c | 16 +++---
- drivers/net/wireguard/send.c | 31 ++++--------
- 8 files changed, 144 insertions(+), 93 deletions(-)
-
---- a/drivers/net/wireguard/device.c
-+++ b/drivers/net/wireguard/device.c
-@@ -235,8 +235,8 @@ static void wg_destruct(struct net_devic
- destroy_workqueue(wg->handshake_receive_wq);
- destroy_workqueue(wg->handshake_send_wq);
- destroy_workqueue(wg->packet_crypt_wq);
-- wg_packet_queue_free(&wg->decrypt_queue, true);
-- wg_packet_queue_free(&wg->encrypt_queue, true);
-+ wg_packet_queue_free(&wg->decrypt_queue);
-+ wg_packet_queue_free(&wg->encrypt_queue);
- rcu_barrier(); /* Wait for all the peers to be actually freed. */
- wg_ratelimiter_uninit();
- memzero_explicit(&wg->static_identity, sizeof(wg->static_identity));
-@@ -338,12 +338,12 @@ static int wg_newlink(struct net *src_ne
- goto err_destroy_handshake_send;
-
- ret = wg_packet_queue_init(&wg->encrypt_queue, wg_packet_encrypt_worker,
-- true, MAX_QUEUED_PACKETS);
-+ MAX_QUEUED_PACKETS);
- if (ret < 0)
- goto err_destroy_packet_crypt;
-
- ret = wg_packet_queue_init(&wg->decrypt_queue, wg_packet_decrypt_worker,
-- true, MAX_QUEUED_PACKETS);
-+ MAX_QUEUED_PACKETS);
- if (ret < 0)
- goto err_free_encrypt_queue;
-
-@@ -368,9 +368,9 @@ static int wg_newlink(struct net *src_ne
- err_uninit_ratelimiter:
- wg_ratelimiter_uninit();
- err_free_decrypt_queue:
-- wg_packet_queue_free(&wg->decrypt_queue, true);
-+ wg_packet_queue_free(&wg->decrypt_queue);
- err_free_encrypt_queue:
-- wg_packet_queue_free(&wg->encrypt_queue, true);
-+ wg_packet_queue_free(&wg->encrypt_queue);
- err_destroy_packet_crypt:
- destroy_workqueue(wg->packet_crypt_wq);
- err_destroy_handshake_send:
---- a/drivers/net/wireguard/device.h
-+++ b/drivers/net/wireguard/device.h
-@@ -27,13 +27,14 @@ struct multicore_worker {
-
- struct crypt_queue {
- struct ptr_ring ring;
-- union {
-- struct {
-- struct multicore_worker __percpu *worker;
-- int last_cpu;
-- };
-- struct work_struct work;
-- };
-+ struct multicore_worker __percpu *worker;
-+ int last_cpu;
-+};
-+
-+struct prev_queue {
-+ struct sk_buff *head, *tail, *peeked;
-+ struct { struct sk_buff *next, *prev; } empty; // Match first 2 members of struct sk_buff.
-+ atomic_t count;
- };
-
- struct wg_device {
---- a/drivers/net/wireguard/peer.c
-+++ b/drivers/net/wireguard/peer.c
-@@ -32,27 +32,22 @@ struct wg_peer *wg_peer_create(struct wg
- peer = kzalloc(sizeof(*peer), GFP_KERNEL);
- if (unlikely(!peer))
- return ERR_PTR(ret);
-- peer->device = wg;
-+ if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL))
-+ goto err;
-
-+ peer->device = wg;
- wg_noise_handshake_init(&peer->handshake, &wg->static_identity,
- public_key, preshared_key, peer);
-- if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL))
-- goto err_1;
-- if (wg_packet_queue_init(&peer->tx_queue, wg_packet_tx_worker, false,
-- MAX_QUEUED_PACKETS))
-- goto err_2;
-- if (wg_packet_queue_init(&peer->rx_queue, NULL, false,
-- MAX_QUEUED_PACKETS))
-- goto err_3;
--
- peer->internal_id = atomic64_inc_return(&peer_counter);
- peer->serial_work_cpu = nr_cpumask_bits;
- wg_cookie_init(&peer->latest_cookie);
- wg_timers_init(peer);
- wg_cookie_checker_precompute_peer_keys(peer);
- spin_lock_init(&peer->keypairs.keypair_update_lock);
-- INIT_WORK(&peer->transmit_handshake_work,
-- wg_packet_handshake_send_worker);
-+ INIT_WORK(&peer->transmit_handshake_work, wg_packet_handshake_send_worker);
-+ INIT_WORK(&peer->transmit_packet_work, wg_packet_tx_worker);
-+ wg_prev_queue_init(&peer->tx_queue);
-+ wg_prev_queue_init(&peer->rx_queue);
- rwlock_init(&peer->endpoint_lock);
- kref_init(&peer->refcount);
- skb_queue_head_init(&peer->staged_packet_queue);
-@@ -68,11 +63,7 @@ struct wg_peer *wg_peer_create(struct wg
- pr_debug("%s: Peer %llu created\n", wg->dev->name, peer->internal_id);
- return peer;
-
--err_3:
-- wg_packet_queue_free(&peer->tx_queue, false);
--err_2:
-- dst_cache_destroy(&peer->endpoint_cache);
--err_1:
-+err:
- kfree(peer);
- return ERR_PTR(ret);
- }
-@@ -197,8 +188,7 @@ static void rcu_release(struct rcu_head
- struct wg_peer *peer = container_of(rcu, struct wg_peer, rcu);
-
- dst_cache_destroy(&peer->endpoint_cache);
-- wg_packet_queue_free(&peer->rx_queue, false);
-- wg_packet_queue_free(&peer->tx_queue, false);
-+ WARN_ON(wg_prev_queue_peek(&peer->tx_queue) || wg_prev_queue_peek(&peer->rx_queue));
-
- /* The final zeroing takes care of clearing any remaining handshake key
- * material and other potentially sensitive information.
---- a/drivers/net/wireguard/peer.h
-+++ b/drivers/net/wireguard/peer.h
-@@ -36,7 +36,7 @@ struct endpoint {
-
- struct wg_peer {
- struct wg_device *device;
-- struct crypt_queue tx_queue, rx_queue;
-+ struct prev_queue tx_queue, rx_queue;
- struct sk_buff_head staged_packet_queue;
- int serial_work_cpu;
- bool is_dead;
-@@ -46,7 +46,7 @@ struct wg_peer {
- rwlock_t endpoint_lock;
- struct noise_handshake handshake;
- atomic64_t last_sent_handshake;
-- struct work_struct transmit_handshake_work, clear_peer_work;
-+ struct work_struct transmit_handshake_work, clear_peer_work, transmit_packet_work;
- struct cookie latest_cookie;
- struct hlist_node pubkey_hash;
- u64 rx_bytes, tx_bytes;
---- a/drivers/net/wireguard/queueing.c
-+++ b/drivers/net/wireguard/queueing.c
-@@ -9,8 +9,7 @@ struct multicore_worker __percpu *
- wg_packet_percpu_multicore_worker_alloc(work_func_t function, void *ptr)
- {
- int cpu;
-- struct multicore_worker __percpu *worker =
-- alloc_percpu(struct multicore_worker);
-+ struct multicore_worker __percpu *worker = alloc_percpu(struct multicore_worker);
-
- if (!worker)
- return NULL;
-@@ -23,7 +22,7 @@ wg_packet_percpu_multicore_worker_alloc(
- }
-
- int wg_packet_queue_init(struct crypt_queue *queue, work_func_t function,
-- bool multicore, unsigned int len)
-+ unsigned int len)
- {
- int ret;
-
-@@ -31,25 +30,78 @@ int wg_packet_queue_init(struct crypt_qu
- ret = ptr_ring_init(&queue->ring, len, GFP_KERNEL);
- if (ret)
- return ret;
-- if (function) {
-- if (multicore) {
-- queue->worker = wg_packet_percpu_multicore_worker_alloc(
-- function, queue);
-- if (!queue->worker) {
-- ptr_ring_cleanup(&queue->ring, NULL);
-- return -ENOMEM;
-- }
-- } else {
-- INIT_WORK(&queue->work, function);
-- }
-+ queue->worker = wg_packet_percpu_multicore_worker_alloc(function, queue);
-+ if (!queue->worker) {
-+ ptr_ring_cleanup(&queue->ring, NULL);
-+ return -ENOMEM;
- }
- return 0;
- }
-
--void wg_packet_queue_free(struct crypt_queue *queue, bool multicore)
-+void wg_packet_queue_free(struct crypt_queue *queue)
- {
-- if (multicore)
-- free_percpu(queue->worker);
-+ free_percpu(queue->worker);
- WARN_ON(!__ptr_ring_empty(&queue->ring));
- ptr_ring_cleanup(&queue->ring, NULL);
- }
-+
-+#define NEXT(skb) ((skb)->prev)
-+#define STUB(queue) ((struct sk_buff *)&queue->empty)
-+
-+void wg_prev_queue_init(struct prev_queue *queue)
-+{
-+ NEXT(STUB(queue)) = NULL;
-+ queue->head = queue->tail = STUB(queue);
-+ queue->peeked = NULL;
-+ atomic_set(&queue->count, 0);
-+ BUILD_BUG_ON(
-+ offsetof(struct sk_buff, next) != offsetof(struct prev_queue, empty.next) -
-+ offsetof(struct prev_queue, empty) ||
-+ offsetof(struct sk_buff, prev) != offsetof(struct prev_queue, empty.prev) -
-+ offsetof(struct prev_queue, empty));
-+}
-+
-+static void __wg_prev_queue_enqueue(struct prev_queue *queue, struct sk_buff *skb)
-+{
-+ WRITE_ONCE(NEXT(skb), NULL);
-+ WRITE_ONCE(NEXT(xchg_release(&queue->head, skb)), skb);
-+}
-+
-+bool wg_prev_queue_enqueue(struct prev_queue *queue, struct sk_buff *skb)
-+{
-+ if (!atomic_add_unless(&queue->count, 1, MAX_QUEUED_PACKETS))
-+ return false;
-+ __wg_prev_queue_enqueue(queue, skb);
-+ return true;
-+}
-+
-+struct sk_buff *wg_prev_queue_dequeue(struct prev_queue *queue)
-+{
-+ struct sk_buff *tail = queue->tail, *next = smp_load_acquire(&NEXT(tail));
-+
-+ if (tail == STUB(queue)) {
-+ if (!next)
-+ return NULL;
-+ queue->tail = next;
-+ tail = next;
-+ next = smp_load_acquire(&NEXT(next));
-+ }
-+ if (next) {
-+ queue->tail = next;
-+ atomic_dec(&queue->count);
-+ return tail;
-+ }
-+ if (tail != READ_ONCE(queue->head))
-+ return NULL;
-+ __wg_prev_queue_enqueue(queue, STUB(queue));
-+ next = smp_load_acquire(&NEXT(tail));
-+ if (next) {
-+ queue->tail = next;
-+ atomic_dec(&queue->count);
-+ return tail;
-+ }
-+ return NULL;
-+}
-+
-+#undef NEXT
-+#undef STUB
---- a/drivers/net/wireguard/queueing.h
-+++ b/drivers/net/wireguard/queueing.h
-@@ -17,12 +17,13 @@ struct wg_device;
- struct wg_peer;
- struct multicore_worker;
- struct crypt_queue;
-+struct prev_queue;
- struct sk_buff;
-
- /* queueing.c APIs: */
- int wg_packet_queue_init(struct crypt_queue *queue, work_func_t function,
-- bool multicore, unsigned int len);
--void wg_packet_queue_free(struct crypt_queue *queue, bool multicore);
-+ unsigned int len);
-+void wg_packet_queue_free(struct crypt_queue *queue);
- struct multicore_worker __percpu *
- wg_packet_percpu_multicore_worker_alloc(work_func_t function, void *ptr);
-
-@@ -135,8 +136,31 @@ static inline int wg_cpumask_next_online
- return cpu;
- }
-
-+void wg_prev_queue_init(struct prev_queue *queue);
-+
-+/* Multi producer */
-+bool wg_prev_queue_enqueue(struct prev_queue *queue, struct sk_buff *skb);
-+
-+/* Single consumer */
-+struct sk_buff *wg_prev_queue_dequeue(struct prev_queue *queue);
-+
-+/* Single consumer */
-+static inline struct sk_buff *wg_prev_queue_peek(struct prev_queue *queue)
-+{
-+ if (queue->peeked)
-+ return queue->peeked;
-+ queue->peeked = wg_prev_queue_dequeue(queue);
-+ return queue->peeked;
-+}
-+
-+/* Single consumer */
-+static inline void wg_prev_queue_drop_peeked(struct prev_queue *queue)
-+{
-+ queue->peeked = NULL;
-+}
-+
- static inline int wg_queue_enqueue_per_device_and_peer(
-- struct crypt_queue *device_queue, struct crypt_queue *peer_queue,
-+ struct crypt_queue *device_queue, struct prev_queue *peer_queue,
- struct sk_buff *skb, struct workqueue_struct *wq, int *next_cpu)
- {
- int cpu;
-@@ -145,8 +169,9 @@ static inline int wg_queue_enqueue_per_d
- /* We first queue this up for the peer ingestion, but the consumer
- * will wait for the state to change to CRYPTED or DEAD before.
- */
-- if (unlikely(ptr_ring_produce_bh(&peer_queue->ring, skb)))
-+ if (unlikely(!wg_prev_queue_enqueue(peer_queue, skb)))
- return -ENOSPC;
-+
- /* Then we queue it up in the device queue, which consumes the
- * packet as soon as it can.
- */
-@@ -157,9 +182,7 @@ static inline int wg_queue_enqueue_per_d
- return 0;
- }
-
--static inline void wg_queue_enqueue_per_peer(struct crypt_queue *queue,
-- struct sk_buff *skb,
-- enum packet_state state)
-+static inline void wg_queue_enqueue_per_peer_tx(struct sk_buff *skb, enum packet_state state)
- {
- /* We take a reference, because as soon as we call atomic_set, the
- * peer can be freed from below us.
-@@ -167,14 +190,12 @@ static inline void wg_queue_enqueue_per_
- struct wg_peer *peer = wg_peer_get(PACKET_PEER(skb));
-
- atomic_set_release(&PACKET_CB(skb)->state, state);
-- queue_work_on(wg_cpumask_choose_online(&peer->serial_work_cpu,
-- peer->internal_id),
-- peer->device->packet_crypt_wq, &queue->work);
-+ queue_work_on(wg_cpumask_choose_online(&peer->serial_work_cpu, peer->internal_id),
-+ peer->device->packet_crypt_wq, &peer->transmit_packet_work);
- wg_peer_put(peer);
- }
-
--static inline void wg_queue_enqueue_per_peer_napi(struct sk_buff *skb,
-- enum packet_state state)
-+static inline void wg_queue_enqueue_per_peer_rx(struct sk_buff *skb, enum packet_state state)
- {
- /* We take a reference, because as soon as we call atomic_set, the
- * peer can be freed from below us.
---- a/drivers/net/wireguard/receive.c
-+++ b/drivers/net/wireguard/receive.c
-@@ -444,7 +444,6 @@ packet_processed:
- int wg_packet_rx_poll(struct napi_struct *napi, int budget)
- {
- struct wg_peer *peer = container_of(napi, struct wg_peer, napi);
-- struct crypt_queue *queue = &peer->rx_queue;
- struct noise_keypair *keypair;
- struct endpoint endpoint;
- enum packet_state state;
-@@ -455,11 +454,10 @@ int wg_packet_rx_poll(struct napi_struct
- if (unlikely(budget <= 0))
- return 0;
-
-- while ((skb = __ptr_ring_peek(&queue->ring)) != NULL &&
-+ while ((skb = wg_prev_queue_peek(&peer->rx_queue)) != NULL &&
- (state = atomic_read_acquire(&PACKET_CB(skb)->state)) !=
- PACKET_STATE_UNCRYPTED) {
-- __ptr_ring_discard_one(&queue->ring);
-- peer = PACKET_PEER(skb);
-+ wg_prev_queue_drop_peeked(&peer->rx_queue);
- keypair = PACKET_CB(skb)->keypair;
- free = true;
-
-@@ -508,7 +506,7 @@ void wg_packet_decrypt_worker(struct wor
- enum packet_state state =
- likely(decrypt_packet(skb, PACKET_CB(skb)->keypair)) ?
- PACKET_STATE_CRYPTED : PACKET_STATE_DEAD;
-- wg_queue_enqueue_per_peer_napi(skb, state);
-+ wg_queue_enqueue_per_peer_rx(skb, state);
- if (need_resched())
- cond_resched();
- }
-@@ -531,12 +529,10 @@ static void wg_packet_consume_data(struc
- if (unlikely(READ_ONCE(peer->is_dead)))
- goto err;
-
-- ret = wg_queue_enqueue_per_device_and_peer(&wg->decrypt_queue,
-- &peer->rx_queue, skb,
-- wg->packet_crypt_wq,
-- &wg->decrypt_queue.last_cpu);
-+ ret = wg_queue_enqueue_per_device_and_peer(&wg->decrypt_queue, &peer->rx_queue, skb,
-+ wg->packet_crypt_wq, &wg->decrypt_queue.last_cpu);
- if (unlikely(ret == -EPIPE))
-- wg_queue_enqueue_per_peer_napi(skb, PACKET_STATE_DEAD);
-+ wg_queue_enqueue_per_peer_rx(skb, PACKET_STATE_DEAD);
- if (likely(!ret || ret == -EPIPE)) {
- rcu_read_unlock_bh();
- return;
---- a/drivers/net/wireguard/send.c
-+++ b/drivers/net/wireguard/send.c
-@@ -239,8 +239,7 @@ void wg_packet_send_keepalive(struct wg_
- wg_packet_send_staged_packets(peer);
- }
-
--static void wg_packet_create_data_done(struct sk_buff *first,
-- struct wg_peer *peer)
-+static void wg_packet_create_data_done(struct wg_peer *peer, struct sk_buff *first)
- {
- struct sk_buff *skb, *next;
- bool is_keepalive, data_sent = false;
-@@ -262,22 +261,19 @@ static void wg_packet_create_data_done(s
-
- void wg_packet_tx_worker(struct work_struct *work)
- {
-- struct crypt_queue *queue = container_of(work, struct crypt_queue,
-- work);
-+ struct wg_peer *peer = container_of(work, struct wg_peer, transmit_packet_work);
- struct noise_keypair *keypair;
- enum packet_state state;
- struct sk_buff *first;
-- struct wg_peer *peer;
-
-- while ((first = __ptr_ring_peek(&queue->ring)) != NULL &&
-+ while ((first = wg_prev_queue_peek(&peer->tx_queue)) != NULL &&
- (state = atomic_read_acquire(&PACKET_CB(first)->state)) !=
- PACKET_STATE_UNCRYPTED) {
-- __ptr_ring_discard_one(&queue->ring);
-- peer = PACKET_PEER(first);
-+ wg_prev_queue_drop_peeked(&peer->tx_queue);
- keypair = PACKET_CB(first)->keypair;
-
- if (likely(state == PACKET_STATE_CRYPTED))
-- wg_packet_create_data_done(first, peer);
-+ wg_packet_create_data_done(peer, first);
- else
- kfree_skb_list(first);
-
-@@ -306,16 +302,14 @@ void wg_packet_encrypt_worker(struct wor
- break;
- }
- }
-- wg_queue_enqueue_per_peer(&PACKET_PEER(first)->tx_queue, first,
-- state);
-+ wg_queue_enqueue_per_peer_tx(first, state);
- if (need_resched())
- cond_resched();
- }
- }
-
--static void wg_packet_create_data(struct sk_buff *first)
-+static void wg_packet_create_data(struct wg_peer *peer, struct sk_buff *first)
- {
-- struct wg_peer *peer = PACKET_PEER(first);
- struct wg_device *wg = peer->device;
- int ret = -EINVAL;
-
-@@ -323,13 +317,10 @@ static void wg_packet_create_data(struct
- if (unlikely(READ_ONCE(peer->is_dead)))
- goto err;
-
-- ret = wg_queue_enqueue_per_device_and_peer(&wg->encrypt_queue,
-- &peer->tx_queue, first,
-- wg->packet_crypt_wq,
-- &wg->encrypt_queue.last_cpu);
-+ ret = wg_queue_enqueue_per_device_and_peer(&wg->encrypt_queue, &peer->tx_queue, first,
-+ wg->packet_crypt_wq, &wg->encrypt_queue.last_cpu);
- if (unlikely(ret == -EPIPE))
-- wg_queue_enqueue_per_peer(&peer->tx_queue, first,
-- PACKET_STATE_DEAD);
-+ wg_queue_enqueue_per_peer_tx(first, PACKET_STATE_DEAD);
- err:
- rcu_read_unlock_bh();
- if (likely(!ret || ret == -EPIPE))
-@@ -393,7 +384,7 @@ void wg_packet_send_staged_packets(struc
- packets.prev->next = NULL;
- wg_peer_get(keypair->entry.peer);
- PACKET_CB(packets.next)->keypair = keypair;
-- wg_packet_create_data(packets.next);
-+ wg_packet_create_data(peer, packets.next);
- return;
-
- out_invalid:
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0123-wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch b/target/linux/generic/backport-5.4/080-wireguard-0123-wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch
deleted file mode 100644
index 9a251492c2..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0123-wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Mon, 22 Feb 2021 17:25:49 +0100
-Subject: [PATCH] wireguard: kconfig: use arm chacha even with no neon
-
-commit bce2473927af8de12ad131a743f55d69d358c0b9 upstream.
-
-The condition here was incorrect: a non-neon fallback implementation is
-available on arm32 when NEON is not supported.
-
-Reported-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -87,7 +87,7 @@ config WIREGUARD
- select CRYPTO_CURVE25519_X86 if X86 && 64BIT
- select ARM_CRYPTO if ARM
- select ARM64_CRYPTO if ARM64
-- select CRYPTO_CHACHA20_NEON if (ARM || ARM64) && KERNEL_MODE_NEON
-+ select CRYPTO_CHACHA20_NEON if ARM || (ARM64 && KERNEL_MODE_NEON)
- select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON
- select CRYPTO_POLY1305_ARM if ARM
- select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0124-crypto-mips-poly1305-enable-for-all-MIPS-processors.patch b/target/linux/generic/backport-5.4/080-wireguard-0124-crypto-mips-poly1305-enable-for-all-MIPS-processors.patch
deleted file mode 100644
index c0ee841b02..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0124-crypto-mips-poly1305-enable-for-all-MIPS-processors.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Maciej W. Rozycki" <macro@orcam.me.uk>
-Date: Thu, 11 Mar 2021 21:50:47 -0700
-Subject: [PATCH] crypto: mips/poly1305 - enable for all MIPS processors
-
-commit 6c810cf20feef0d4338e9b424ab7f2644a8b353e upstream.
-
-The MIPS Poly1305 implementation is generic MIPS code written such as to
-support down to the original MIPS I and MIPS III ISA for the 32-bit and
-64-bit variant respectively. Lift the current limitation then to enable
-code for MIPSr1 ISA or newer processors only and have it available for
-all MIPS processors.
-
-Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
-Fixes: a11d055e7a64 ("crypto: mips/poly1305 - incorporate OpenSSL/CRYPTOGAMS optimized implementation")
-Cc: stable@vger.kernel.org # v5.5+
-Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/crypto/Makefile | 4 ++--
- crypto/Kconfig | 2 +-
- drivers/net/Kconfig | 2 +-
- 3 files changed, 4 insertions(+), 4 deletions(-)
-
---- a/arch/mips/crypto/Makefile
-+++ b/arch/mips/crypto/Makefile
-@@ -12,8 +12,8 @@ AFLAGS_chacha-core.o += -O2 # needed to
- obj-$(CONFIG_CRYPTO_POLY1305_MIPS) += poly1305-mips.o
- poly1305-mips-y := poly1305-core.o poly1305-glue.o
-
--perlasm-flavour-$(CONFIG_CPU_MIPS32) := o32
--perlasm-flavour-$(CONFIG_CPU_MIPS64) := 64
-+perlasm-flavour-$(CONFIG_32BIT) := o32
-+perlasm-flavour-$(CONFIG_64BIT) := 64
-
- quiet_cmd_perlasm = PERLASM $@
- cmd_perlasm = $(PERL) $(<) $(perlasm-flavour-y) $(@)
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -740,7 +740,7 @@ config CRYPTO_POLY1305_X86_64
-
- config CRYPTO_POLY1305_MIPS
- tristate "Poly1305 authenticator algorithm (MIPS optimized)"
-- depends on CPU_MIPS32 || (CPU_MIPS64 && 64BIT)
-+ depends on MIPS
- select CRYPTO_ARCH_HAVE_LIB_POLY1305
-
- config CRYPTO_MD4
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -92,7 +92,7 @@ config WIREGUARD
- select CRYPTO_POLY1305_ARM if ARM
- select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON
- select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2
-- select CRYPTO_POLY1305_MIPS if CPU_MIPS32 || (CPU_MIPS64 && 64BIT)
-+ select CRYPTO_POLY1305_MIPS if MIPS
- help
- WireGuard is a secure, fast, and easy to use replacement for IPSec
- that uses modern cryptography and clever networking tricks. It's
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0125-crypto-mips-add-poly1305-core.S-to-.gitignore.patch b/target/linux/generic/backport-5.4/080-wireguard-0125-crypto-mips-add-poly1305-core.S-to-.gitignore.patch
deleted file mode 100644
index 856d67d5b8..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0125-crypto-mips-add-poly1305-core.S-to-.gitignore.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
-Date: Sat, 27 Mar 2021 19:39:43 -0700
-Subject: [PATCH] crypto: mips: add poly1305-core.S to .gitignore
-
-commit dc92d0df51dc61de88bf6f4884a17bf73d5c6326 upstream.
-
-poly1305-core.S is an auto-generated file, so it should be ignored.
-
-Fixes: a11d055e7a64 ("crypto: mips/poly1305 - incorporate OpenSSL/CRYPTOGAMS optimized implementation")
-Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
-Cc: Ard Biesheuvel <ardb@kernel.org>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/crypto/.gitignore | 2 ++
- 1 file changed, 2 insertions(+)
- create mode 100644 arch/mips/crypto/.gitignore
-
---- /dev/null
-+++ b/arch/mips/crypto/.gitignore
-@@ -0,0 +1,2 @@
-+# SPDX-License-Identifier: GPL-2.0-only
-+poly1305-core.S
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0126-crypto-poly1305-fix-poly1305_core_setkey-declaration.patch b/target/linux/generic/backport-5.4/080-wireguard-0126-crypto-poly1305-fix-poly1305_core_setkey-declaration.patch
deleted file mode 100644
index ded6625aeb..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0126-crypto-poly1305-fix-poly1305_core_setkey-declaration.patch
+++ /dev/null
@@ -1,172 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Arnd Bergmann <arnd@arndb.de>
-Date: Mon, 22 Mar 2021 18:05:15 +0100
-Subject: [PATCH] crypto: poly1305 - fix poly1305_core_setkey() declaration
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-commit 8d195e7a8ada68928f2aedb2c18302a4518fe68e upstream.
-
-gcc-11 points out a mismatch between the declaration and the definition
-of poly1305_core_setkey():
-
-lib/crypto/poly1305-donna32.c:13:67: error: argument 2 of type ‘const u8[16]’ {aka ‘const unsigned char[16]’} with mismatched bound [-Werror=array-parameter=]
- 13 | void poly1305_core_setkey(struct poly1305_core_key *key, const u8 raw_key[16])
- | ~~~~~~~~~^~~~~~~~~~~
-In file included from lib/crypto/poly1305-donna32.c:11:
-include/crypto/internal/poly1305.h:21:68: note: previously declared as ‘const u8 *’ {aka ‘const unsigned char *’}
- 21 | void poly1305_core_setkey(struct poly1305_core_key *key, const u8 *raw_key);
-
-This is harmless in principle, as the calling conventions are the same,
-but the more specific prototype allows better type checking in the
-caller.
-
-Change the declaration to match the actual function definition.
-The poly1305_simd_init() is a bit suspicious here, as it previously
-had a 32-byte argument type, but looks like it needs to take the
-16-byte POLY1305_BLOCK_SIZE array instead.
-
-Fixes: 1c08a104360f ("crypto: poly1305 - add new 32 and 64-bit generic versions")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
-Reviewed-by: Eric Biggers <ebiggers@google.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/arm/crypto/poly1305-glue.c | 2 +-
- arch/arm64/crypto/poly1305-glue.c | 2 +-
- arch/mips/crypto/poly1305-glue.c | 2 +-
- arch/x86/crypto/poly1305_glue.c | 6 +++---
- include/crypto/internal/poly1305.h | 3 ++-
- include/crypto/poly1305.h | 6 ++++--
- lib/crypto/poly1305-donna32.c | 3 ++-
- lib/crypto/poly1305-donna64.c | 3 ++-
- lib/crypto/poly1305.c | 3 ++-
- 9 files changed, 18 insertions(+), 12 deletions(-)
-
---- a/arch/arm/crypto/poly1305-glue.c
-+++ b/arch/arm/crypto/poly1305-glue.c
-@@ -29,7 +29,7 @@ void __weak poly1305_blocks_neon(void *s
-
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-
--void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 key[POLY1305_KEY_SIZE])
- {
- poly1305_init_arm(&dctx->h, key);
- dctx->s[0] = get_unaligned_le32(key + 16);
---- a/arch/arm64/crypto/poly1305-glue.c
-+++ b/arch/arm64/crypto/poly1305-glue.c
-@@ -25,7 +25,7 @@ asmlinkage void poly1305_emit(void *stat
-
- static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
-
--void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 key[POLY1305_KEY_SIZE])
- {
- poly1305_init_arm64(&dctx->h, key);
- dctx->s[0] = get_unaligned_le32(key + 16);
---- a/arch/mips/crypto/poly1305-glue.c
-+++ b/arch/mips/crypto/poly1305-glue.c
-@@ -17,7 +17,7 @@ asmlinkage void poly1305_init_mips(void
- asmlinkage void poly1305_blocks_mips(void *state, const u8 *src, u32 len, u32 hibit);
- asmlinkage void poly1305_emit_mips(void *state, u8 *digest, const u32 *nonce);
-
--void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 key[POLY1305_KEY_SIZE])
- {
- poly1305_init_mips(&dctx->h, key);
- dctx->s[0] = get_unaligned_le32(key + 16);
---- a/arch/x86/crypto/poly1305_glue.c
-+++ b/arch/x86/crypto/poly1305_glue.c
-@@ -15,7 +15,7 @@
- #include <asm/simd.h>
-
- asmlinkage void poly1305_init_x86_64(void *ctx,
-- const u8 key[POLY1305_KEY_SIZE]);
-+ const u8 key[POLY1305_BLOCK_SIZE]);
- asmlinkage void poly1305_blocks_x86_64(void *ctx, const u8 *inp,
- const size_t len, const u32 padbit);
- asmlinkage void poly1305_emit_x86_64(void *ctx, u8 mac[POLY1305_DIGEST_SIZE],
-@@ -80,7 +80,7 @@ static void convert_to_base2_64(void *ct
- state->is_base2_26 = 0;
- }
-
--static void poly1305_simd_init(void *ctx, const u8 key[POLY1305_KEY_SIZE])
-+static void poly1305_simd_init(void *ctx, const u8 key[POLY1305_BLOCK_SIZE])
- {
- poly1305_init_x86_64(ctx, key);
- }
-@@ -128,7 +128,7 @@ static void poly1305_simd_emit(void *ctx
- poly1305_emit_avx(ctx, mac, nonce);
- }
-
--void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 *key)
-+void poly1305_init_arch(struct poly1305_desc_ctx *dctx, const u8 key[POLY1305_KEY_SIZE])
- {
- poly1305_simd_init(&dctx->h, key);
- dctx->s[0] = get_unaligned_le32(&key[16]);
---- a/include/crypto/internal/poly1305.h
-+++ b/include/crypto/internal/poly1305.h
-@@ -18,7 +18,8 @@
- * only the ε-almost-∆-universal hash function (not the full MAC) is computed.
- */
-
--void poly1305_core_setkey(struct poly1305_core_key *key, const u8 *raw_key);
-+void poly1305_core_setkey(struct poly1305_core_key *key,
-+ const u8 raw_key[POLY1305_BLOCK_SIZE]);
- static inline void poly1305_core_init(struct poly1305_state *state)
- {
- *state = (struct poly1305_state){};
---- a/include/crypto/poly1305.h
-+++ b/include/crypto/poly1305.h
-@@ -58,8 +58,10 @@ struct poly1305_desc_ctx {
- };
- };
-
--void poly1305_init_arch(struct poly1305_desc_ctx *desc, const u8 *key);
--void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key);
-+void poly1305_init_arch(struct poly1305_desc_ctx *desc,
-+ const u8 key[POLY1305_KEY_SIZE]);
-+void poly1305_init_generic(struct poly1305_desc_ctx *desc,
-+ const u8 key[POLY1305_KEY_SIZE]);
-
- static inline void poly1305_init(struct poly1305_desc_ctx *desc, const u8 *key)
- {
---- a/lib/crypto/poly1305-donna32.c
-+++ b/lib/crypto/poly1305-donna32.c
-@@ -10,7 +10,8 @@
- #include <asm/unaligned.h>
- #include <crypto/internal/poly1305.h>
-
--void poly1305_core_setkey(struct poly1305_core_key *key, const u8 raw_key[16])
-+void poly1305_core_setkey(struct poly1305_core_key *key,
-+ const u8 raw_key[POLY1305_BLOCK_SIZE])
- {
- /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */
- key->key.r[0] = (get_unaligned_le32(&raw_key[0])) & 0x3ffffff;
---- a/lib/crypto/poly1305-donna64.c
-+++ b/lib/crypto/poly1305-donna64.c
-@@ -12,7 +12,8 @@
-
- typedef __uint128_t u128;
-
--void poly1305_core_setkey(struct poly1305_core_key *key, const u8 raw_key[16])
-+void poly1305_core_setkey(struct poly1305_core_key *key,
-+ const u8 raw_key[POLY1305_BLOCK_SIZE])
- {
- u64 t0, t1;
-
---- a/lib/crypto/poly1305.c
-+++ b/lib/crypto/poly1305.c
-@@ -12,7 +12,8 @@
- #include <linux/module.h>
- #include <asm/unaligned.h>
-
--void poly1305_init_generic(struct poly1305_desc_ctx *desc, const u8 *key)
-+void poly1305_init_generic(struct poly1305_desc_ctx *desc,
-+ const u8 key[POLY1305_KEY_SIZE])
- {
- poly1305_core_setkey(&desc->core_r, key);
- desc->s[0] = get_unaligned_le32(key + 16);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0127-wireguard-selftests-remove-old-conntrack-kconfig-val.patch b/target/linux/generic/backport-5.4/080-wireguard-0127-wireguard-selftests-remove-old-conntrack-kconfig-val.patch
deleted file mode 100644
index 3e7d1a8e02..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0127-wireguard-selftests-remove-old-conntrack-kconfig-val.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:30 +0200
-Subject: [PATCH] wireguard: selftests: remove old conntrack kconfig value
-
-commit acf2492b51c9a3c4dfb947f4d3477a86d315150f upstream.
-
-On recent kernels, this config symbol is no longer used.
-
-Reported-by: Rui Salvaterra <rsalvaterra@gmail.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/qemu/kernel.config | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/tools/testing/selftests/wireguard/qemu/kernel.config
-+++ b/tools/testing/selftests/wireguard/qemu/kernel.config
-@@ -19,7 +19,6 @@ CONFIG_NETFILTER_XTABLES=y
- CONFIG_NETFILTER_XT_NAT=y
- CONFIG_NETFILTER_XT_MATCH_LENGTH=y
- CONFIG_NETFILTER_XT_MARK=y
--CONFIG_NF_CONNTRACK_IPV4=y
- CONFIG_NF_NAT_IPV4=y
- CONFIG_IP_NF_IPTABLES=y
- CONFIG_IP_NF_FILTER=y
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0128-wireguard-selftests-make-sure-rp_filter-is-disabled-.patch b/target/linux/generic/backport-5.4/080-wireguard-0128-wireguard-selftests-make-sure-rp_filter-is-disabled-.patch
deleted file mode 100644
index 22d0f3e32e..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0128-wireguard-selftests-make-sure-rp_filter-is-disabled-.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:31 +0200
-Subject: [PATCH] wireguard: selftests: make sure rp_filter is disabled on
- vethc
-
-commit f8873d11d4121aad35024f9379e431e0c83abead upstream.
-
-Some distros may enable strict rp_filter by default, which will prevent
-vethc from receiving the packets with an unrouteable reverse path address.
-
-Reported-by: Hangbin Liu <liuhangbin@gmail.com>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- tools/testing/selftests/wireguard/netns.sh | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/tools/testing/selftests/wireguard/netns.sh
-+++ b/tools/testing/selftests/wireguard/netns.sh
-@@ -363,6 +363,7 @@ ip1 -6 rule add table main suppress_pref
- ip1 -4 route add default dev wg0 table 51820
- ip1 -4 rule add not fwmark 51820 table 51820
- ip1 -4 rule add table main suppress_prefixlength 0
-+n1 bash -c 'printf 0 > /proc/sys/net/ipv4/conf/vethc/rp_filter'
- # Flood the pings instead of sending just one, to trigger routing table reference counting bugs.
- n1 ping -W 1 -c 100 -f 192.168.99.7
- n1 ping -W 1 -c 100 -f abab::1111
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0129-wireguard-do-not-use-O3.patch b/target/linux/generic/backport-5.4/080-wireguard-0129-wireguard-do-not-use-O3.patch
deleted file mode 100644
index a7890a7384..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0129-wireguard-do-not-use-O3.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:32 +0200
-Subject: [PATCH] wireguard: do not use -O3
-
-commit cc5060ca0285efe2728bced399a1955a7ce808b2 upstream.
-
-Apparently, various versions of gcc have O3-related miscompiles. Looking
-at the difference between -O2 and -O3 for gcc 11 doesn't indicate
-miscompiles, but the difference also doesn't seem so significant for
-performance that it's worth risking.
-
-Link: https://lore.kernel.org/lkml/CAHk-=wjuoGyxDhAF8SsrTkN0-YfCx7E6jUN3ikC_tn2AKWTTsA@mail.gmail.com/
-Link: https://lore.kernel.org/lkml/CAHmME9otB5Wwxp7H8bR_i2uH2esEMvoBMC8uEXBMH9p0q1s6Bw@mail.gmail.com/
-Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/Makefile | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/net/wireguard/Makefile
-+++ b/drivers/net/wireguard/Makefile
-@@ -1,5 +1,4 @@
--ccflags-y := -O3
--ccflags-y += -D'pr_fmt(fmt)=KBUILD_MODNAME ": " fmt'
-+ccflags-y := -D'pr_fmt(fmt)=KBUILD_MODNAME ": " fmt'
- ccflags-$(CONFIG_WIREGUARD_DEBUG) += -DDEBUG
- wireguard-y := main.o
- wireguard-y += noise.o
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0130-wireguard-use-synchronize_net-rather-than-synchroniz.patch b/target/linux/generic/backport-5.4/080-wireguard-0130-wireguard-use-synchronize_net-rather-than-synchroniz.patch
deleted file mode 100644
index 309fe36198..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0130-wireguard-use-synchronize_net-rather-than-synchroniz.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:33 +0200
-Subject: [PATCH] wireguard: use synchronize_net rather than synchronize_rcu
-
-commit 24b70eeeb4f46c09487f8155239ebfb1f875774a upstream.
-
-Many of the synchronization points are sometimes called under the rtnl
-lock, which means we should use synchronize_net rather than
-synchronize_rcu. Under the hood, this expands to using the expedited
-flavor of function in the event that rtnl is held, in order to not stall
-other concurrent changes.
-
-This fixes some very, very long delays when removing multiple peers at
-once, which would cause some operations to take several minutes.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/peer.c | 6 +++---
- drivers/net/wireguard/socket.c | 2 +-
- 2 files changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/peer.c
-+++ b/drivers/net/wireguard/peer.c
-@@ -88,7 +88,7 @@ static void peer_make_dead(struct wg_pee
- /* Mark as dead, so that we don't allow jumping contexts after. */
- WRITE_ONCE(peer->is_dead, true);
-
-- /* The caller must now synchronize_rcu() for this to take effect. */
-+ /* The caller must now synchronize_net() for this to take effect. */
- }
-
- static void peer_remove_after_dead(struct wg_peer *peer)
-@@ -160,7 +160,7 @@ void wg_peer_remove(struct wg_peer *peer
- lockdep_assert_held(&peer->device->device_update_lock);
-
- peer_make_dead(peer);
-- synchronize_rcu();
-+ synchronize_net();
- peer_remove_after_dead(peer);
- }
-
-@@ -178,7 +178,7 @@ void wg_peer_remove_all(struct wg_device
- peer_make_dead(peer);
- list_add_tail(&peer->peer_list, &dead_peers);
- }
-- synchronize_rcu();
-+ synchronize_net();
- list_for_each_entry_safe(peer, temp, &dead_peers, peer_list)
- peer_remove_after_dead(peer);
- }
---- a/drivers/net/wireguard/socket.c
-+++ b/drivers/net/wireguard/socket.c
-@@ -430,7 +430,7 @@ void wg_socket_reinit(struct wg_device *
- if (new4)
- wg->incoming_port = ntohs(inet_sk(new4)->inet_sport);
- mutex_unlock(&wg->socket_update_lock);
-- synchronize_rcu();
-+ synchronize_net();
- sock_free(old4);
- sock_free(old6);
- }
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0131-wireguard-peer-allocate-in-kmem_cache.patch b/target/linux/generic/backport-5.4/080-wireguard-0131-wireguard-peer-allocate-in-kmem_cache.patch
deleted file mode 100644
index 32ae327037..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0131-wireguard-peer-allocate-in-kmem_cache.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:34 +0200
-Subject: [PATCH] wireguard: peer: allocate in kmem_cache
-
-commit a4e9f8e3287c9eb6bf70df982870980dd3341863 upstream.
-
-With deployments having upwards of 600k peers now, this somewhat heavy
-structure could benefit from more fine-grained allocations.
-Specifically, instead of using a 2048-byte slab for a 1544-byte object,
-we can now use 1544-byte objects directly, thus saving almost 25%
-per-peer, or with 600k peers, that's a savings of 303 MiB. This also
-makes wireguard's memory usage more transparent in tools like slabtop
-and /proc/slabinfo.
-
-Fixes: 8b5553ace83c ("wireguard: queueing: get rid of per-peer ring buffers")
-Suggested-by: Arnd Bergmann <arnd@arndb.de>
-Suggested-by: Matthew Wilcox <willy@infradead.org>
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/main.c | 7 +++++++
- drivers/net/wireguard/peer.c | 21 +++++++++++++++++----
- drivers/net/wireguard/peer.h | 3 +++
- 3 files changed, 27 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireguard/main.c
-+++ b/drivers/net/wireguard/main.c
-@@ -28,6 +28,10 @@ static int __init mod_init(void)
- #endif
- wg_noise_init();
-
-+ ret = wg_peer_init();
-+ if (ret < 0)
-+ goto err_peer;
-+
- ret = wg_device_init();
- if (ret < 0)
- goto err_device;
-@@ -44,6 +48,8 @@ static int __init mod_init(void)
- err_netlink:
- wg_device_uninit();
- err_device:
-+ wg_peer_uninit();
-+err_peer:
- return ret;
- }
-
-@@ -51,6 +57,7 @@ static void __exit mod_exit(void)
- {
- wg_genetlink_uninit();
- wg_device_uninit();
-+ wg_peer_uninit();
- }
-
- module_init(mod_init);
---- a/drivers/net/wireguard/peer.c
-+++ b/drivers/net/wireguard/peer.c
-@@ -15,6 +15,7 @@
- #include <linux/rcupdate.h>
- #include <linux/list.h>
-
-+static struct kmem_cache *peer_cache;
- static atomic64_t peer_counter = ATOMIC64_INIT(0);
-
- struct wg_peer *wg_peer_create(struct wg_device *wg,
-@@ -29,10 +30,10 @@ struct wg_peer *wg_peer_create(struct wg
- if (wg->num_peers >= MAX_PEERS_PER_DEVICE)
- return ERR_PTR(ret);
-
-- peer = kzalloc(sizeof(*peer), GFP_KERNEL);
-+ peer = kmem_cache_zalloc(peer_cache, GFP_KERNEL);
- if (unlikely(!peer))
- return ERR_PTR(ret);
-- if (dst_cache_init(&peer->endpoint_cache, GFP_KERNEL))
-+ if (unlikely(dst_cache_init(&peer->endpoint_cache, GFP_KERNEL)))
- goto err;
-
- peer->device = wg;
-@@ -64,7 +65,7 @@ struct wg_peer *wg_peer_create(struct wg
- return peer;
-
- err:
-- kfree(peer);
-+ kmem_cache_free(peer_cache, peer);
- return ERR_PTR(ret);
- }
-
-@@ -193,7 +194,8 @@ static void rcu_release(struct rcu_head
- /* The final zeroing takes care of clearing any remaining handshake key
- * material and other potentially sensitive information.
- */
-- kzfree(peer);
-+ memzero_explicit(peer, sizeof(*peer));
-+ kmem_cache_free(peer_cache, peer);
- }
-
- static void kref_release(struct kref *refcount)
-@@ -225,3 +227,14 @@ void wg_peer_put(struct wg_peer *peer)
- return;
- kref_put(&peer->refcount, kref_release);
- }
-+
-+int __init wg_peer_init(void)
-+{
-+ peer_cache = KMEM_CACHE(wg_peer, 0);
-+ return peer_cache ? 0 : -ENOMEM;
-+}
-+
-+void wg_peer_uninit(void)
-+{
-+ kmem_cache_destroy(peer_cache);
-+}
---- a/drivers/net/wireguard/peer.h
-+++ b/drivers/net/wireguard/peer.h
-@@ -80,4 +80,7 @@ void wg_peer_put(struct wg_peer *peer);
- void wg_peer_remove(struct wg_peer *peer);
- void wg_peer_remove_all(struct wg_device *wg);
-
-+int wg_peer_init(void);
-+void wg_peer_uninit(void);
-+
- #endif /* _WG_PEER_H */
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0132-wireguard-allowedips-initialize-list-head-in-selftes.patch b/target/linux/generic/backport-5.4/080-wireguard-0132-wireguard-allowedips-initialize-list-head-in-selftes.patch
deleted file mode 100644
index ce4e5dcf50..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0132-wireguard-allowedips-initialize-list-head-in-selftes.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:35 +0200
-Subject: [PATCH] wireguard: allowedips: initialize list head in selftest
-
-commit 46cfe8eee285cde465b420637507884551f5d7ca upstream.
-
-The randomized trie tests weren't initializing the dummy peer list head,
-resulting in a NULL pointer dereference when used. Fix this by
-initializing it in the randomized trie test, just like we do for the
-static unit test.
-
-While we're at it, all of the other strings like this have the word
-"self-test", so add it to the missing place here.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/selftest/allowedips.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/net/wireguard/selftest/allowedips.c
-+++ b/drivers/net/wireguard/selftest/allowedips.c
-@@ -296,6 +296,7 @@ static __init bool randomized_test(void)
- goto free;
- }
- kref_init(&peers[i]->refcount);
-+ INIT_LIST_HEAD(&peers[i]->allowedips_list);
- }
-
- mutex_lock(&mutex);
-@@ -333,7 +334,7 @@ static __init bool randomized_test(void)
- if (wg_allowedips_insert_v4(&t,
- (struct in_addr *)mutated,
- cidr, peer, &mutex) < 0) {
-- pr_err("allowedips random malloc: FAIL\n");
-+ pr_err("allowedips random self-test malloc: FAIL\n");
- goto free_locked;
- }
- if (horrible_allowedips_insert_v4(&h,
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0133-wireguard-allowedips-remove-nodes-in-O-1.patch b/target/linux/generic/backport-5.4/080-wireguard-0133-wireguard-allowedips-remove-nodes-in-O-1.patch
deleted file mode 100644
index 78da24ea46..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0133-wireguard-allowedips-remove-nodes-in-O-1.patch
+++ /dev/null
@@ -1,237 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:36 +0200
-Subject: [PATCH] wireguard: allowedips: remove nodes in O(1)
-
-commit f634f418c227c912e7ea95a3299efdc9b10e4022 upstream.
-
-Previously, deleting peers would require traversing the entire trie in
-order to rebalance nodes and safely free them. This meant that removing
-1000 peers from a trie with a half million nodes would take an extremely
-long time, during which we're holding the rtnl lock. Large-scale users
-were reporting 200ms latencies added to the networking stack as a whole
-every time their userspace software would queue up significant removals.
-That's a serious situation.
-
-This commit fixes that by maintaining a double pointer to the parent's
-bit pointer for each node, and then using the already existing node list
-belonging to each peer to go directly to the node, fix up its pointers,
-and free it with RCU. This means removal is O(1) instead of O(n), and we
-don't use gobs of stack.
-
-The removal algorithm has the same downside as the code that it fixes:
-it won't collapse needlessly long runs of fillers. We can enhance that
-in the future if it ever becomes a problem. This commit documents that
-limitation with a TODO comment in code, a small but meaningful
-improvement over the prior situation.
-
-Currently the biggest flaw, which the next commit addresses, is that
-because this increases the node size on 64-bit machines from 60 bytes to
-68 bytes. 60 rounds up to 64, but 68 rounds up to 128. So we wind up
-using twice as much memory per node, because of power-of-two
-allocations, which is a big bummer. We'll need to figure something out
-there.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/allowedips.c | 132 ++++++++++++-----------------
- drivers/net/wireguard/allowedips.h | 9 +-
- 2 files changed, 57 insertions(+), 84 deletions(-)
-
---- a/drivers/net/wireguard/allowedips.c
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -66,60 +66,6 @@ static void root_remove_peer_lists(struc
- }
- }
-
--static void walk_remove_by_peer(struct allowedips_node __rcu **top,
-- struct wg_peer *peer, struct mutex *lock)
--{
--#define REF(p) rcu_access_pointer(p)
--#define DEREF(p) rcu_dereference_protected(*(p), lockdep_is_held(lock))
--#define PUSH(p) ({ \
-- WARN_ON(IS_ENABLED(DEBUG) && len >= 128); \
-- stack[len++] = p; \
-- })
--
-- struct allowedips_node __rcu **stack[128], **nptr;
-- struct allowedips_node *node, *prev;
-- unsigned int len;
--
-- if (unlikely(!peer || !REF(*top)))
-- return;
--
-- for (prev = NULL, len = 0, PUSH(top); len > 0; prev = node) {
-- nptr = stack[len - 1];
-- node = DEREF(nptr);
-- if (!node) {
-- --len;
-- continue;
-- }
-- if (!prev || REF(prev->bit[0]) == node ||
-- REF(prev->bit[1]) == node) {
-- if (REF(node->bit[0]))
-- PUSH(&node->bit[0]);
-- else if (REF(node->bit[1]))
-- PUSH(&node->bit[1]);
-- } else if (REF(node->bit[0]) == prev) {
-- if (REF(node->bit[1]))
-- PUSH(&node->bit[1]);
-- } else {
-- if (rcu_dereference_protected(node->peer,
-- lockdep_is_held(lock)) == peer) {
-- RCU_INIT_POINTER(node->peer, NULL);
-- list_del_init(&node->peer_list);
-- if (!node->bit[0] || !node->bit[1]) {
-- rcu_assign_pointer(*nptr, DEREF(
-- &node->bit[!REF(node->bit[0])]));
-- kfree_rcu(node, rcu);
-- node = DEREF(nptr);
-- }
-- }
-- --len;
-- }
-- }
--
--#undef REF
--#undef DEREF
--#undef PUSH
--}
--
- static unsigned int fls128(u64 a, u64 b)
- {
- return a ? fls64(a) + 64U : fls64(b);
-@@ -224,6 +170,7 @@ static int add(struct allowedips_node __
- RCU_INIT_POINTER(node->peer, peer);
- list_add_tail(&node->peer_list, &peer->allowedips_list);
- copy_and_assign_cidr(node, key, cidr, bits);
-+ rcu_assign_pointer(node->parent_bit, trie);
- rcu_assign_pointer(*trie, node);
- return 0;
- }
-@@ -243,9 +190,9 @@ static int add(struct allowedips_node __
- if (!node) {
- down = rcu_dereference_protected(*trie, lockdep_is_held(lock));
- } else {
-- down = rcu_dereference_protected(CHOOSE_NODE(node, key),
-- lockdep_is_held(lock));
-+ down = rcu_dereference_protected(CHOOSE_NODE(node, key), lockdep_is_held(lock));
- if (!down) {
-+ rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, key));
- rcu_assign_pointer(CHOOSE_NODE(node, key), newnode);
- return 0;
- }
-@@ -254,29 +201,37 @@ static int add(struct allowedips_node __
- parent = node;
-
- if (newnode->cidr == cidr) {
-+ rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(newnode, down->bits));
- rcu_assign_pointer(CHOOSE_NODE(newnode, down->bits), down);
-- if (!parent)
-+ if (!parent) {
-+ rcu_assign_pointer(newnode->parent_bit, trie);
- rcu_assign_pointer(*trie, newnode);
-- else
-- rcu_assign_pointer(CHOOSE_NODE(parent, newnode->bits),
-- newnode);
-- } else {
-- node = kzalloc(sizeof(*node), GFP_KERNEL);
-- if (unlikely(!node)) {
-- list_del(&newnode->peer_list);
-- kfree(newnode);
-- return -ENOMEM;
-+ } else {
-+ rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(parent, newnode->bits));
-+ rcu_assign_pointer(CHOOSE_NODE(parent, newnode->bits), newnode);
- }
-- INIT_LIST_HEAD(&node->peer_list);
-- copy_and_assign_cidr(node, newnode->bits, cidr, bits);
-+ return 0;
-+ }
-+
-+ node = kzalloc(sizeof(*node), GFP_KERNEL);
-+ if (unlikely(!node)) {
-+ list_del(&newnode->peer_list);
-+ kfree(newnode);
-+ return -ENOMEM;
-+ }
-+ INIT_LIST_HEAD(&node->peer_list);
-+ copy_and_assign_cidr(node, newnode->bits, cidr, bits);
-
-- rcu_assign_pointer(CHOOSE_NODE(node, down->bits), down);
-- rcu_assign_pointer(CHOOSE_NODE(node, newnode->bits), newnode);
-- if (!parent)
-- rcu_assign_pointer(*trie, node);
-- else
-- rcu_assign_pointer(CHOOSE_NODE(parent, node->bits),
-- node);
-+ rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(node, down->bits));
-+ rcu_assign_pointer(CHOOSE_NODE(node, down->bits), down);
-+ rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, newnode->bits));
-+ rcu_assign_pointer(CHOOSE_NODE(node, newnode->bits), newnode);
-+ if (!parent) {
-+ rcu_assign_pointer(node->parent_bit, trie);
-+ rcu_assign_pointer(*trie, node);
-+ } else {
-+ rcu_assign_pointer(node->parent_bit, &CHOOSE_NODE(parent, node->bits));
-+ rcu_assign_pointer(CHOOSE_NODE(parent, node->bits), node);
- }
- return 0;
- }
-@@ -335,9 +290,30 @@ int wg_allowedips_insert_v6(struct allow
- void wg_allowedips_remove_by_peer(struct allowedips *table,
- struct wg_peer *peer, struct mutex *lock)
- {
-+ struct allowedips_node *node, *child, *tmp;
-+
-+ if (list_empty(&peer->allowedips_list))
-+ return;
- ++table->seq;
-- walk_remove_by_peer(&table->root4, peer, lock);
-- walk_remove_by_peer(&table->root6, peer, lock);
-+ list_for_each_entry_safe(node, tmp, &peer->allowedips_list, peer_list) {
-+ list_del_init(&node->peer_list);
-+ RCU_INIT_POINTER(node->peer, NULL);
-+ if (node->bit[0] && node->bit[1])
-+ continue;
-+ child = rcu_dereference_protected(
-+ node->bit[!rcu_access_pointer(node->bit[0])],
-+ lockdep_is_held(lock));
-+ if (child)
-+ child->parent_bit = node->parent_bit;
-+ *rcu_dereference_protected(node->parent_bit, lockdep_is_held(lock)) = child;
-+ kfree_rcu(node, rcu);
-+
-+ /* TODO: Note that we currently don't walk up and down in order to
-+ * free any potential filler nodes. This means that this function
-+ * doesn't free up as much as it could, which could be revisited
-+ * at some point.
-+ */
-+ }
- }
-
- int wg_allowedips_read_node(struct allowedips_node *node, u8 ip[16], u8 *cidr)
---- a/drivers/net/wireguard/allowedips.h
-+++ b/drivers/net/wireguard/allowedips.h
-@@ -15,14 +15,11 @@ struct wg_peer;
- struct allowedips_node {
- struct wg_peer __rcu *peer;
- struct allowedips_node __rcu *bit[2];
-- /* While it may seem scandalous that we waste space for v4,
-- * we're alloc'ing to the nearest power of 2 anyway, so this
-- * doesn't actually make a difference.
-- */
-- u8 bits[16] __aligned(__alignof(u64));
- u8 cidr, bit_at_a, bit_at_b, bitlen;
-+ u8 bits[16] __aligned(__alignof(u64));
-
-- /* Keep rarely used list at bottom to be beyond cache line. */
-+ /* Keep rarely used members at bottom to be beyond cache line. */
-+ struct allowedips_node *__rcu *parent_bit; /* XXX: this puts us at 68->128 bytes instead of 60->64 bytes!! */
- union {
- struct list_head peer_list;
- struct rcu_head rcu;
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0134-wireguard-allowedips-allocate-nodes-in-kmem_cache.patch b/target/linux/generic/backport-5.4/080-wireguard-0134-wireguard-allowedips-allocate-nodes-in-kmem_cache.patch
deleted file mode 100644
index 65b31b05f5..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0134-wireguard-allowedips-allocate-nodes-in-kmem_cache.patch
+++ /dev/null
@@ -1,173 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:37 +0200
-Subject: [PATCH] wireguard: allowedips: allocate nodes in kmem_cache
-
-commit dc680de28ca849dfe589dc15ac56d22505f0ef11 upstream.
-
-The previous commit moved from O(n) to O(1) for removal, but in the
-process introduced an additional pointer member to a struct that
-increased the size from 60 to 68 bytes, putting nodes in the 128-byte
-slab. With deployed systems having as many as 2 million nodes, this
-represents a significant doubling in memory usage (128 MiB -> 256 MiB).
-Fix this by using our own kmem_cache, that's sized exactly right. This
-also makes wireguard's memory usage more transparent in tools like
-slabtop and /proc/slabinfo.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Suggested-by: Arnd Bergmann <arnd@arndb.de>
-Suggested-by: Matthew Wilcox <willy@infradead.org>
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/allowedips.c | 31 ++++++++++++++++++++++++------
- drivers/net/wireguard/allowedips.h | 5 ++++-
- drivers/net/wireguard/main.c | 10 +++++++++-
- 3 files changed, 38 insertions(+), 8 deletions(-)
-
---- a/drivers/net/wireguard/allowedips.c
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -6,6 +6,8 @@
- #include "allowedips.h"
- #include "peer.h"
-
-+static struct kmem_cache *node_cache;
-+
- static void swap_endian(u8 *dst, const u8 *src, u8 bits)
- {
- if (bits == 32) {
-@@ -40,6 +42,11 @@ static void push_rcu(struct allowedips_n
- }
- }
-
-+static void node_free_rcu(struct rcu_head *rcu)
-+{
-+ kmem_cache_free(node_cache, container_of(rcu, struct allowedips_node, rcu));
-+}
-+
- static void root_free_rcu(struct rcu_head *rcu)
- {
- struct allowedips_node *node, *stack[128] = {
-@@ -49,7 +56,7 @@ static void root_free_rcu(struct rcu_hea
- while (len > 0 && (node = stack[--len])) {
- push_rcu(stack, node->bit[0], &len);
- push_rcu(stack, node->bit[1], &len);
-- kfree(node);
-+ kmem_cache_free(node_cache, node);
- }
- }
-
-@@ -164,7 +171,7 @@ static int add(struct allowedips_node __
- return -EINVAL;
-
- if (!rcu_access_pointer(*trie)) {
-- node = kzalloc(sizeof(*node), GFP_KERNEL);
-+ node = kmem_cache_zalloc(node_cache, GFP_KERNEL);
- if (unlikely(!node))
- return -ENOMEM;
- RCU_INIT_POINTER(node->peer, peer);
-@@ -180,7 +187,7 @@ static int add(struct allowedips_node __
- return 0;
- }
-
-- newnode = kzalloc(sizeof(*newnode), GFP_KERNEL);
-+ newnode = kmem_cache_zalloc(node_cache, GFP_KERNEL);
- if (unlikely(!newnode))
- return -ENOMEM;
- RCU_INIT_POINTER(newnode->peer, peer);
-@@ -213,10 +220,10 @@ static int add(struct allowedips_node __
- return 0;
- }
-
-- node = kzalloc(sizeof(*node), GFP_KERNEL);
-+ node = kmem_cache_zalloc(node_cache, GFP_KERNEL);
- if (unlikely(!node)) {
- list_del(&newnode->peer_list);
-- kfree(newnode);
-+ kmem_cache_free(node_cache, newnode);
- return -ENOMEM;
- }
- INIT_LIST_HEAD(&node->peer_list);
-@@ -306,7 +313,7 @@ void wg_allowedips_remove_by_peer(struct
- if (child)
- child->parent_bit = node->parent_bit;
- *rcu_dereference_protected(node->parent_bit, lockdep_is_held(lock)) = child;
-- kfree_rcu(node, rcu);
-+ call_rcu(&node->rcu, node_free_rcu);
-
- /* TODO: Note that we currently don't walk up and down in order to
- * free any potential filler nodes. This means that this function
-@@ -350,4 +357,16 @@ struct wg_peer *wg_allowedips_lookup_src
- return NULL;
- }
-
-+int __init wg_allowedips_slab_init(void)
-+{
-+ node_cache = KMEM_CACHE(allowedips_node, 0);
-+ return node_cache ? 0 : -ENOMEM;
-+}
-+
-+void wg_allowedips_slab_uninit(void)
-+{
-+ rcu_barrier();
-+ kmem_cache_destroy(node_cache);
-+}
-+
- #include "selftest/allowedips.c"
---- a/drivers/net/wireguard/allowedips.h
-+++ b/drivers/net/wireguard/allowedips.h
-@@ -19,7 +19,7 @@ struct allowedips_node {
- u8 bits[16] __aligned(__alignof(u64));
-
- /* Keep rarely used members at bottom to be beyond cache line. */
-- struct allowedips_node *__rcu *parent_bit; /* XXX: this puts us at 68->128 bytes instead of 60->64 bytes!! */
-+ struct allowedips_node *__rcu *parent_bit;
- union {
- struct list_head peer_list;
- struct rcu_head rcu;
-@@ -53,4 +53,7 @@ struct wg_peer *wg_allowedips_lookup_src
- bool wg_allowedips_selftest(void);
- #endif
-
-+int wg_allowedips_slab_init(void);
-+void wg_allowedips_slab_uninit(void);
-+
- #endif /* _WG_ALLOWEDIPS_H */
---- a/drivers/net/wireguard/main.c
-+++ b/drivers/net/wireguard/main.c
-@@ -21,10 +21,15 @@ static int __init mod_init(void)
- {
- int ret;
-
-+ ret = wg_allowedips_slab_init();
-+ if (ret < 0)
-+ goto err_allowedips;
-+
- #ifdef DEBUG
-+ ret = -ENOTRECOVERABLE;
- if (!wg_allowedips_selftest() || !wg_packet_counter_selftest() ||
- !wg_ratelimiter_selftest())
-- return -ENOTRECOVERABLE;
-+ goto err_peer;
- #endif
- wg_noise_init();
-
-@@ -50,6 +55,8 @@ err_netlink:
- err_device:
- wg_peer_uninit();
- err_peer:
-+ wg_allowedips_slab_uninit();
-+err_allowedips:
- return ret;
- }
-
-@@ -58,6 +65,7 @@ static void __exit mod_exit(void)
- wg_genetlink_uninit();
- wg_device_uninit();
- wg_peer_uninit();
-+ wg_allowedips_slab_uninit();
- }
-
- module_init(mod_init);
diff --git a/target/linux/generic/backport-5.4/080-wireguard-0135-wireguard-allowedips-free-empty-intermediate-nodes-w.patch b/target/linux/generic/backport-5.4/080-wireguard-0135-wireguard-allowedips-free-empty-intermediate-nodes-w.patch
deleted file mode 100644
index c044ad25af..0000000000
--- a/target/linux/generic/backport-5.4/080-wireguard-0135-wireguard-allowedips-free-empty-intermediate-nodes-w.patch
+++ /dev/null
@@ -1,521 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Fri, 4 Jun 2021 17:17:38 +0200
-Subject: [PATCH] wireguard: allowedips: free empty intermediate nodes when
- removing single node
-
-commit bf7b042dc62a31f66d3a41dd4dfc7806f267b307 upstream.
-
-When removing single nodes, it's possible that that node's parent is an
-empty intermediate node, in which case, it too should be removed.
-Otherwise the trie fills up and never is fully emptied, leading to
-gradual memory leaks over time for tries that are modified often. There
-was originally code to do this, but was removed during refactoring in
-2016 and never reworked. Now that we have proper parent pointers from
-the previous commits, we can implement this properly.
-
-In order to reduce branching and expensive comparisons, we want to keep
-the double pointer for parent assignment (which lets us easily chain up
-to the root), but we still need to actually get the parent's base
-address. So encode the bit number into the last two bits of the pointer,
-and pack and unpack it as needed. This is a little bit clumsy but is the
-fastest and less memory wasteful of the compromises. Note that we align
-the root struct here to a minimum of 4, because it's embedded into a
-larger struct, and we're relying on having the bottom two bits for our
-flag, which would only be 16-bit aligned on m68k.
-
-The existing macro-based helpers were a bit unwieldy for adding the bit
-packing to, so this commit replaces them with safer and clearer ordinary
-functions.
-
-We add a test to the randomized/fuzzer part of the selftests, to free
-the randomized tries by-peer, refuzz it, and repeat, until it's supposed
-to be empty, and then then see if that actually resulted in the whole
-thing being emptied. That combined with kmemcheck should hopefully make
-sure this commit is doing what it should. Along the way this resulted in
-various other cleanups of the tests and fixes for recent graphviz.
-
-Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
-Cc: stable@vger.kernel.org
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/net/wireguard/allowedips.c | 102 ++++++------
- drivers/net/wireguard/allowedips.h | 4 +-
- drivers/net/wireguard/selftest/allowedips.c | 162 ++++++++++----------
- 3 files changed, 137 insertions(+), 131 deletions(-)
-
---- a/drivers/net/wireguard/allowedips.c
-+++ b/drivers/net/wireguard/allowedips.c
-@@ -30,8 +30,11 @@ static void copy_and_assign_cidr(struct
- node->bitlen = bits;
- memcpy(node->bits, src, bits / 8U);
- }
--#define CHOOSE_NODE(parent, key) \
-- parent->bit[(key[parent->bit_at_a] >> parent->bit_at_b) & 1]
-+
-+static inline u8 choose(struct allowedips_node *node, const u8 *key)
-+{
-+ return (key[node->bit_at_a] >> node->bit_at_b) & 1;
-+}
-
- static void push_rcu(struct allowedips_node **stack,
- struct allowedips_node __rcu *p, unsigned int *len)
-@@ -112,7 +115,7 @@ static struct allowedips_node *find_node
- found = node;
- if (node->cidr == bits)
- break;
-- node = rcu_dereference_bh(CHOOSE_NODE(node, key));
-+ node = rcu_dereference_bh(node->bit[choose(node, key)]);
- }
- return found;
- }
-@@ -144,8 +147,7 @@ static bool node_placement(struct allowe
- u8 cidr, u8 bits, struct allowedips_node **rnode,
- struct mutex *lock)
- {
-- struct allowedips_node *node = rcu_dereference_protected(trie,
-- lockdep_is_held(lock));
-+ struct allowedips_node *node = rcu_dereference_protected(trie, lockdep_is_held(lock));
- struct allowedips_node *parent = NULL;
- bool exact = false;
-
-@@ -155,13 +157,24 @@ static bool node_placement(struct allowe
- exact = true;
- break;
- }
-- node = rcu_dereference_protected(CHOOSE_NODE(parent, key),
-- lockdep_is_held(lock));
-+ node = rcu_dereference_protected(parent->bit[choose(parent, key)], lockdep_is_held(lock));
- }
- *rnode = parent;
- return exact;
- }
-
-+static inline void connect_node(struct allowedips_node **parent, u8 bit, struct allowedips_node *node)
-+{
-+ node->parent_bit_packed = (unsigned long)parent | bit;
-+ rcu_assign_pointer(*parent, node);
-+}
-+
-+static inline void choose_and_connect_node(struct allowedips_node *parent, struct allowedips_node *node)
-+{
-+ u8 bit = choose(parent, node->bits);
-+ connect_node(&parent->bit[bit], bit, node);
-+}
-+
- static int add(struct allowedips_node __rcu **trie, u8 bits, const u8 *key,
- u8 cidr, struct wg_peer *peer, struct mutex *lock)
- {
-@@ -177,8 +190,7 @@ static int add(struct allowedips_node __
- RCU_INIT_POINTER(node->peer, peer);
- list_add_tail(&node->peer_list, &peer->allowedips_list);
- copy_and_assign_cidr(node, key, cidr, bits);
-- rcu_assign_pointer(node->parent_bit, trie);
-- rcu_assign_pointer(*trie, node);
-+ connect_node(trie, 2, node);
- return 0;
- }
- if (node_placement(*trie, key, cidr, bits, &node, lock)) {
-@@ -197,10 +209,10 @@ static int add(struct allowedips_node __
- if (!node) {
- down = rcu_dereference_protected(*trie, lockdep_is_held(lock));
- } else {
-- down = rcu_dereference_protected(CHOOSE_NODE(node, key), lockdep_is_held(lock));
-+ const u8 bit = choose(node, key);
-+ down = rcu_dereference_protected(node->bit[bit], lockdep_is_held(lock));
- if (!down) {
-- rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, key));
-- rcu_assign_pointer(CHOOSE_NODE(node, key), newnode);
-+ connect_node(&node->bit[bit], bit, newnode);
- return 0;
- }
- }
-@@ -208,15 +220,11 @@ static int add(struct allowedips_node __
- parent = node;
-
- if (newnode->cidr == cidr) {
-- rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(newnode, down->bits));
-- rcu_assign_pointer(CHOOSE_NODE(newnode, down->bits), down);
-- if (!parent) {
-- rcu_assign_pointer(newnode->parent_bit, trie);
-- rcu_assign_pointer(*trie, newnode);
-- } else {
-- rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(parent, newnode->bits));
-- rcu_assign_pointer(CHOOSE_NODE(parent, newnode->bits), newnode);
-- }
-+ choose_and_connect_node(newnode, down);
-+ if (!parent)
-+ connect_node(trie, 2, newnode);
-+ else
-+ choose_and_connect_node(parent, newnode);
- return 0;
- }
-
-@@ -229,17 +237,12 @@ static int add(struct allowedips_node __
- INIT_LIST_HEAD(&node->peer_list);
- copy_and_assign_cidr(node, newnode->bits, cidr, bits);
-
-- rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(node, down->bits));
-- rcu_assign_pointer(CHOOSE_NODE(node, down->bits), down);
-- rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, newnode->bits));
-- rcu_assign_pointer(CHOOSE_NODE(node, newnode->bits), newnode);
-- if (!parent) {
-- rcu_assign_pointer(node->parent_bit, trie);
-- rcu_assign_pointer(*trie, node);
-- } else {
-- rcu_assign_pointer(node->parent_bit, &CHOOSE_NODE(parent, node->bits));
-- rcu_assign_pointer(CHOOSE_NODE(parent, node->bits), node);
-- }
-+ choose_and_connect_node(node, down);
-+ choose_and_connect_node(node, newnode);
-+ if (!parent)
-+ connect_node(trie, 2, node);
-+ else
-+ choose_and_connect_node(parent, node);
- return 0;
- }
-
-@@ -297,7 +300,8 @@ int wg_allowedips_insert_v6(struct allow
- void wg_allowedips_remove_by_peer(struct allowedips *table,
- struct wg_peer *peer, struct mutex *lock)
- {
-- struct allowedips_node *node, *child, *tmp;
-+ struct allowedips_node *node, *child, **parent_bit, *parent, *tmp;
-+ bool free_parent;
-
- if (list_empty(&peer->allowedips_list))
- return;
-@@ -307,19 +311,29 @@ void wg_allowedips_remove_by_peer(struct
- RCU_INIT_POINTER(node->peer, NULL);
- if (node->bit[0] && node->bit[1])
- continue;
-- child = rcu_dereference_protected(
-- node->bit[!rcu_access_pointer(node->bit[0])],
-- lockdep_is_held(lock));
-+ child = rcu_dereference_protected(node->bit[!rcu_access_pointer(node->bit[0])],
-+ lockdep_is_held(lock));
- if (child)
-- child->parent_bit = node->parent_bit;
-- *rcu_dereference_protected(node->parent_bit, lockdep_is_held(lock)) = child;
-+ child->parent_bit_packed = node->parent_bit_packed;
-+ parent_bit = (struct allowedips_node **)(node->parent_bit_packed & ~3UL);
-+ *parent_bit = child;
-+ parent = (void *)parent_bit -
-+ offsetof(struct allowedips_node, bit[node->parent_bit_packed & 1]);
-+ free_parent = !rcu_access_pointer(node->bit[0]) &&
-+ !rcu_access_pointer(node->bit[1]) &&
-+ (node->parent_bit_packed & 3) <= 1 &&
-+ !rcu_access_pointer(parent->peer);
-+ if (free_parent)
-+ child = rcu_dereference_protected(
-+ parent->bit[!(node->parent_bit_packed & 1)],
-+ lockdep_is_held(lock));
- call_rcu(&node->rcu, node_free_rcu);
--
-- /* TODO: Note that we currently don't walk up and down in order to
-- * free any potential filler nodes. This means that this function
-- * doesn't free up as much as it could, which could be revisited
-- * at some point.
-- */
-+ if (!free_parent)
-+ continue;
-+ if (child)
-+ child->parent_bit_packed = parent->parent_bit_packed;
-+ *(struct allowedips_node **)(parent->parent_bit_packed & ~3UL) = child;
-+ call_rcu(&parent->rcu, node_free_rcu);
- }
- }
-
---- a/drivers/net/wireguard/allowedips.h
-+++ b/drivers/net/wireguard/allowedips.h
-@@ -19,7 +19,7 @@ struct allowedips_node {
- u8 bits[16] __aligned(__alignof(u64));
-
- /* Keep rarely used members at bottom to be beyond cache line. */
-- struct allowedips_node *__rcu *parent_bit;
-+ unsigned long parent_bit_packed;
- union {
- struct list_head peer_list;
- struct rcu_head rcu;
-@@ -30,7 +30,7 @@ struct allowedips {
- struct allowedips_node __rcu *root4;
- struct allowedips_node __rcu *root6;
- u64 seq;
--};
-+} __aligned(4); /* We pack the lower 2 bits of &root, but m68k only gives 16-bit alignment. */
-
- void wg_allowedips_init(struct allowedips *table);
- void wg_allowedips_free(struct allowedips *table, struct mutex *mutex);
---- a/drivers/net/wireguard/selftest/allowedips.c
-+++ b/drivers/net/wireguard/selftest/allowedips.c
-@@ -19,32 +19,22 @@
-
- #include <linux/siphash.h>
-
--static __init void swap_endian_and_apply_cidr(u8 *dst, const u8 *src, u8 bits,
-- u8 cidr)
--{
-- swap_endian(dst, src, bits);
-- memset(dst + (cidr + 7) / 8, 0, bits / 8 - (cidr + 7) / 8);
-- if (cidr)
-- dst[(cidr + 7) / 8 - 1] &= ~0U << ((8 - (cidr % 8)) % 8);
--}
--
- static __init void print_node(struct allowedips_node *node, u8 bits)
- {
- char *fmt_connection = KERN_DEBUG "\t\"%p/%d\" -> \"%p/%d\";\n";
-- char *fmt_declaration = KERN_DEBUG
-- "\t\"%p/%d\"[style=%s, color=\"#%06x\"];\n";
-+ char *fmt_declaration = KERN_DEBUG "\t\"%p/%d\"[style=%s, color=\"#%06x\"];\n";
-+ u8 ip1[16], ip2[16], cidr1, cidr2;
- char *style = "dotted";
-- u8 ip1[16], ip2[16];
- u32 color = 0;
-
-+ if (node == NULL)
-+ return;
- if (bits == 32) {
- fmt_connection = KERN_DEBUG "\t\"%pI4/%d\" -> \"%pI4/%d\";\n";
-- fmt_declaration = KERN_DEBUG
-- "\t\"%pI4/%d\"[style=%s, color=\"#%06x\"];\n";
-+ fmt_declaration = KERN_DEBUG "\t\"%pI4/%d\"[style=%s, color=\"#%06x\"];\n";
- } else if (bits == 128) {
- fmt_connection = KERN_DEBUG "\t\"%pI6/%d\" -> \"%pI6/%d\";\n";
-- fmt_declaration = KERN_DEBUG
-- "\t\"%pI6/%d\"[style=%s, color=\"#%06x\"];\n";
-+ fmt_declaration = KERN_DEBUG "\t\"%pI6/%d\"[style=%s, color=\"#%06x\"];\n";
- }
- if (node->peer) {
- hsiphash_key_t key = { { 0 } };
-@@ -55,24 +45,20 @@ static __init void print_node(struct all
- hsiphash_1u32(0xabad1dea, &key) % 200;
- style = "bold";
- }
-- swap_endian_and_apply_cidr(ip1, node->bits, bits, node->cidr);
-- printk(fmt_declaration, ip1, node->cidr, style, color);
-+ wg_allowedips_read_node(node, ip1, &cidr1);
-+ printk(fmt_declaration, ip1, cidr1, style, color);
- if (node->bit[0]) {
-- swap_endian_and_apply_cidr(ip2,
-- rcu_dereference_raw(node->bit[0])->bits, bits,
-- node->cidr);
-- printk(fmt_connection, ip1, node->cidr, ip2,
-- rcu_dereference_raw(node->bit[0])->cidr);
-- print_node(rcu_dereference_raw(node->bit[0]), bits);
-+ wg_allowedips_read_node(rcu_dereference_raw(node->bit[0]), ip2, &cidr2);
-+ printk(fmt_connection, ip1, cidr1, ip2, cidr2);
- }
- if (node->bit[1]) {
-- swap_endian_and_apply_cidr(ip2,
-- rcu_dereference_raw(node->bit[1])->bits,
-- bits, node->cidr);
-- printk(fmt_connection, ip1, node->cidr, ip2,
-- rcu_dereference_raw(node->bit[1])->cidr);
-- print_node(rcu_dereference_raw(node->bit[1]), bits);
-+ wg_allowedips_read_node(rcu_dereference_raw(node->bit[1]), ip2, &cidr2);
-+ printk(fmt_connection, ip1, cidr1, ip2, cidr2);
- }
-+ if (node->bit[0])
-+ print_node(rcu_dereference_raw(node->bit[0]), bits);
-+ if (node->bit[1])
-+ print_node(rcu_dereference_raw(node->bit[1]), bits);
- }
-
- static __init void print_tree(struct allowedips_node __rcu *top, u8 bits)
-@@ -121,8 +107,8 @@ static __init inline union nf_inet_addr
- {
- union nf_inet_addr mask;
-
-- memset(&mask, 0x00, 128 / 8);
-- memset(&mask, 0xff, cidr / 8);
-+ memset(&mask, 0, sizeof(mask));
-+ memset(&mask.all, 0xff, cidr / 8);
- if (cidr % 32)
- mask.all[cidr / 32] = (__force u32)htonl(
- (0xFFFFFFFFUL << (32 - (cidr % 32))) & 0xFFFFFFFFUL);
-@@ -149,42 +135,36 @@ horrible_mask_self(struct horrible_allow
- }
-
- static __init inline bool
--horrible_match_v4(const struct horrible_allowedips_node *node,
-- struct in_addr *ip)
-+horrible_match_v4(const struct horrible_allowedips_node *node, struct in_addr *ip)
- {
- return (ip->s_addr & node->mask.ip) == node->ip.ip;
- }
-
- static __init inline bool
--horrible_match_v6(const struct horrible_allowedips_node *node,
-- struct in6_addr *ip)
-+horrible_match_v6(const struct horrible_allowedips_node *node, struct in6_addr *ip)
- {
-- return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) ==
-- node->ip.ip6[0] &&
-- (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) ==
-- node->ip.ip6[1] &&
-- (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) ==
-- node->ip.ip6[2] &&
-+ return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) == node->ip.ip6[0] &&
-+ (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) == node->ip.ip6[1] &&
-+ (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) == node->ip.ip6[2] &&
- (ip->in6_u.u6_addr32[3] & node->mask.ip6[3]) == node->ip.ip6[3];
- }
-
- static __init void
--horrible_insert_ordered(struct horrible_allowedips *table,
-- struct horrible_allowedips_node *node)
-+horrible_insert_ordered(struct horrible_allowedips *table, struct horrible_allowedips_node *node)
- {
- struct horrible_allowedips_node *other = NULL, *where = NULL;
- u8 my_cidr = horrible_mask_to_cidr(node->mask);
-
- hlist_for_each_entry(other, &table->head, table) {
-- if (!memcmp(&other->mask, &node->mask,
-- sizeof(union nf_inet_addr)) &&
-- !memcmp(&other->ip, &node->ip,
-- sizeof(union nf_inet_addr)) &&
-- other->ip_version == node->ip_version) {
-+ if (other->ip_version == node->ip_version &&
-+ !memcmp(&other->mask, &node->mask, sizeof(union nf_inet_addr)) &&
-+ !memcmp(&other->ip, &node->ip, sizeof(union nf_inet_addr))) {
- other->value = node->value;
- kfree(node);
- return;
- }
-+ }
-+ hlist_for_each_entry(other, &table->head, table) {
- where = other;
- if (horrible_mask_to_cidr(other->mask) <= my_cidr)
- break;
-@@ -201,8 +181,7 @@ static __init int
- horrible_allowedips_insert_v4(struct horrible_allowedips *table,
- struct in_addr *ip, u8 cidr, void *value)
- {
-- struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-- GFP_KERNEL);
-+ struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL);
-
- if (unlikely(!node))
- return -ENOMEM;
-@@ -219,8 +198,7 @@ static __init int
- horrible_allowedips_insert_v6(struct horrible_allowedips *table,
- struct in6_addr *ip, u8 cidr, void *value)
- {
-- struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-- GFP_KERNEL);
-+ struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL);
-
- if (unlikely(!node))
- return -ENOMEM;
-@@ -234,39 +212,43 @@ horrible_allowedips_insert_v6(struct hor
- }
-
- static __init void *
--horrible_allowedips_lookup_v4(struct horrible_allowedips *table,
-- struct in_addr *ip)
-+horrible_allowedips_lookup_v4(struct horrible_allowedips *table, struct in_addr *ip)
- {
- struct horrible_allowedips_node *node;
-- void *ret = NULL;
-
- hlist_for_each_entry(node, &table->head, table) {
-- if (node->ip_version != 4)
-- continue;
-- if (horrible_match_v4(node, ip)) {
-- ret = node->value;
-- break;
-- }
-+ if (node->ip_version == 4 && horrible_match_v4(node, ip))
-+ return node->value;
- }
-- return ret;
-+ return NULL;
- }
-
- static __init void *
--horrible_allowedips_lookup_v6(struct horrible_allowedips *table,
-- struct in6_addr *ip)
-+horrible_allowedips_lookup_v6(struct horrible_allowedips *table, struct in6_addr *ip)
- {
- struct horrible_allowedips_node *node;
-- void *ret = NULL;
-
- hlist_for_each_entry(node, &table->head, table) {
-- if (node->ip_version != 6)
-+ if (node->ip_version == 6 && horrible_match_v6(node, ip))
-+ return node->value;
-+ }
-+ return NULL;
-+}
-+
-+
-+static __init void
-+horrible_allowedips_remove_by_value(struct horrible_allowedips *table, void *value)
-+{
-+ struct horrible_allowedips_node *node;
-+ struct hlist_node *h;
-+
-+ hlist_for_each_entry_safe(node, h, &table->head, table) {
-+ if (node->value != value)
- continue;
-- if (horrible_match_v6(node, ip)) {
-- ret = node->value;
-- break;
-- }
-+ hlist_del(&node->table);
-+ kfree(node);
- }
-- return ret;
-+
- }
-
- static __init bool randomized_test(void)
-@@ -397,23 +379,33 @@ static __init bool randomized_test(void)
- print_tree(t.root6, 128);
- }
-
-- for (i = 0; i < NUM_QUERIES; ++i) {
-- prandom_bytes(ip, 4);
-- if (lookup(t.root4, 32, ip) !=
-- horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip)) {
-- pr_err("allowedips random self-test: FAIL\n");
-- goto free;
-+ for (j = 0;; ++j) {
-+ for (i = 0; i < NUM_QUERIES; ++i) {
-+ prandom_bytes(ip, 4);
-+ if (lookup(t.root4, 32, ip) != horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip)) {
-+ horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip);
-+ pr_err("allowedips random v4 self-test: FAIL\n");
-+ goto free;
-+ }
-+ prandom_bytes(ip, 16);
-+ if (lookup(t.root6, 128, ip) != horrible_allowedips_lookup_v6(&h, (struct in6_addr *)ip)) {
-+ pr_err("allowedips random v6 self-test: FAIL\n");
-+ goto free;
-+ }
- }
-+ if (j >= NUM_PEERS)
-+ break;
-+ mutex_lock(&mutex);
-+ wg_allowedips_remove_by_peer(&t, peers[j], &mutex);
-+ mutex_unlock(&mutex);
-+ horrible_allowedips_remove_by_value(&h, peers[j]);
- }
-
-- for (i = 0; i < NUM_QUERIES; ++i) {
-- prandom_bytes(ip, 16);
-- if (lookup(t.root6, 128, ip) !=
-- horrible_allowedips_lookup_v6(&h, (struct in6_addr *)ip)) {
-- pr_err("allowedips random self-test: FAIL\n");
-- goto free;
-- }
-+ if (t.root4 || t.root6) {
-+ pr_err("allowedips random self-test removal: FAIL\n");
-+ goto free;
- }
-+
- ret = true;
-
- free:
diff --git a/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch b/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
deleted file mode 100644
index 0bc58e756b..0000000000
--- a/target/linux/generic/backport-5.4/300-MIPS-Exclude-more-dsemul-code-when-CONFIG_MIPS_FP_SU.patch
+++ /dev/null
@@ -1,134 +0,0 @@
-From d96c3157f9ca177727fbad960fcf6f52f145f471 Mon Sep 17 00:00:00 2001
-From: Yousong Zhou <yszhou4tech@gmail.com>
-Date: Thu, 9 Jan 2020 11:33:19 +0800
-Subject: [PATCH] MIPS: Exclude more dsemul code when CONFIG_MIPS_FP_SUPPORT=n
-
-This furthers what commit 42b10815d559 ("MIPS: Don't compile math-emu
-when CONFIG_MIPS_FP_SUPPORT=n") has done
-
-Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
----
- arch/mips/include/asm/processor.h | 12 ++++++------
- arch/mips/kernel/process.c | 10 ++++++++--
- arch/mips/kernel/vdso.c | 26 +++++++++++++++-----------
- 3 files changed, 29 insertions(+), 19 deletions(-)
-
---- a/arch/mips/include/asm/processor.h
-+++ b/arch/mips/include/asm/processor.h
-@@ -253,13 +253,13 @@ struct thread_struct {
- #ifdef CONFIG_MIPS_FP_SUPPORT
- /* Saved fpu/fpu emulator stuff. */
- struct mips_fpu_struct fpu FPU_ALIGN;
--#endif
- /* Assigned branch delay slot 'emulation' frame */
- atomic_t bd_emu_frame;
- /* PC of the branch from a branch delay slot 'emulation' */
- unsigned long bd_emu_branch_pc;
- /* PC to continue from following a branch delay slot 'emulation' */
- unsigned long bd_emu_cont_pc;
-+#endif
- #ifdef CONFIG_MIPS_MT_FPAFF
- /* Emulated instruction count */
- unsigned long emulated_fp;
-@@ -302,7 +302,11 @@ struct thread_struct {
- .fpr = {{{0,},},}, \
- .fcr31 = 0, \
- .msacsr = 0, \
-- },
-+ }, \
-+ /* Delay slot emulation */ \
-+ .bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE), \
-+ .bd_emu_branch_pc = 0, \
-+ .bd_emu_cont_pc = 0,
- #else
- # define FPU_INIT
- #endif
-@@ -334,10 +338,6 @@ struct thread_struct {
- * FPU affinity state (null if not FPAFF) \
- */ \
- FPAFF_INIT \
-- /* Delay slot emulation */ \
-- .bd_emu_frame = ATOMIC_INIT(BD_EMUFRAME_NONE), \
-- .bd_emu_branch_pc = 0, \
-- .bd_emu_cont_pc = 0, \
- /* \
- * Saved DSP stuff \
- */ \
---- a/arch/mips/kernel/process.c
-+++ b/arch/mips/kernel/process.c
-@@ -75,7 +75,9 @@ void start_thread(struct pt_regs * regs,
- lose_fpu(0);
- clear_thread_flag(TIF_MSA_CTX_LIVE);
- clear_used_math();
-+#ifdef CONFIG_MIPS_FP_SUPPORT
- atomic_set(&current->thread.bd_emu_frame, BD_EMUFRAME_NONE);
-+#endif
- init_dsp();
- regs->cp0_epc = pc;
- regs->regs[29] = sp;
-@@ -176,7 +178,9 @@ int copy_thread_tls(unsigned long clone_
- clear_tsk_thread_flag(p, TIF_FPUBOUND);
- #endif /* CONFIG_MIPS_MT_FPAFF */
-
-+#ifdef CONFIG_MIPS_FP_SUPPORT
- atomic_set(&p->thread.bd_emu_frame, BD_EMUFRAME_NONE);
-+#endif
-
- if (clone_flags & CLONE_SETTLS)
- ti->tp_value = tls;
-@@ -650,8 +654,10 @@ unsigned long mips_stack_top(void)
- {
- unsigned long top = TASK_SIZE & PAGE_MASK;
-
-- /* One page for branch delay slot "emulation" */
-- top -= PAGE_SIZE;
-+ if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
-+ /* One page for branch delay slot "emulation" */
-+ top -= PAGE_SIZE;
-+ }
-
- /* Space for the VDSO, data page & GIC user page */
- top -= PAGE_ALIGN(current->thread.abi->vdso->size);
---- a/arch/mips/kernel/vdso.c
-+++ b/arch/mips/kernel/vdso.c
-@@ -71,10 +71,12 @@ subsys_initcall(init_vdso);
-
- static unsigned long vdso_base(void)
- {
-- unsigned long base;
-+ unsigned long base = STACK_TOP;
-
-- /* Skip the delay slot emulation page */
-- base = STACK_TOP + PAGE_SIZE;
-+ if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
-+ /* Skip the delay slot emulation page */
-+ base += PAGE_SIZE;
-+ }
-
- if (current->flags & PF_RANDOMIZE) {
- base += get_random_int() & (VDSO_RANDOMIZE_SIZE - 1);
-@@ -95,14 +97,16 @@ int arch_setup_additional_pages(struct l
- if (down_write_killable(&mm->mmap_sem))
- return -EINTR;
-
-- /* Map delay slot emulation page */
-- base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
-- VM_READ | VM_EXEC |
-- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
-- 0, NULL);
-- if (IS_ERR_VALUE(base)) {
-- ret = base;
-- goto out;
-+ if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) {
-+ /* Map delay slot emulation page */
-+ base = mmap_region(NULL, STACK_TOP, PAGE_SIZE,
-+ VM_READ | VM_EXEC |
-+ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
-+ 0, NULL);
-+ if (IS_ERR_VALUE(base)) {
-+ ret = base;
-+ goto out;
-+ }
- }
-
- /*
diff --git a/target/linux/generic/backport-5.4/310-mips-Kconfig-Add-ARCH_HAS_FORTIFY_SOURCE.patch b/target/linux/generic/backport-5.4/310-mips-Kconfig-Add-ARCH_HAS_FORTIFY_SOURCE.patch
deleted file mode 100644
index e02f103543..0000000000
--- a/target/linux/generic/backport-5.4/310-mips-Kconfig-Add-ARCH_HAS_FORTIFY_SOURCE.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From a8d2bb0559b5fefa5173ff4e7496cc6250db2c8a Mon Sep 17 00:00:00 2001
-From: Dmitry Korotin <dkorotin@wavecomp.com>
-Date: Thu, 12 Sep 2019 22:53:45 +0000
-Subject: [PATCH] mips: Kconfig: Add ARCH_HAS_FORTIFY_SOURCE
-
-FORTIFY_SOURCE detects various overflows at compile and run time.
-(6974f0c4555e ("include/linux/string.h:
-add the option of fortified string.h functions)
-
-ARCH_HAS_FORTIFY_SOURCE means that the architecture can be built and
-run with CONFIG_FORTIFY_SOURCE.
-
-Since mips can be built and run with that flag,
-select ARCH_HAS_FORTIFY_SOURCE as default.
-
-Signed-off-by: Dmitry Korotin <dkorotin@wavecomp.com>
-Signed-off-by: Paul Burton <paul.burton@mips.com>
-Cc: linux-mips@vger.kernel.org
----
- arch/mips/Kconfig | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -7,6 +7,7 @@ config MIPS
- select ARCH_CLOCKSOURCE_DATA
- select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
- select ARCH_HAS_UBSAN_SANITIZE_ALL
-+ select ARCH_HAS_FORTIFY_SOURCE
- select ARCH_SUPPORTS_UPROBES
- select ARCH_USE_BUILTIN_BSWAP
- select ARCH_USE_CMPXCHG_LOCKREF if 64BIT
diff --git a/target/linux/generic/backport-5.4/310-v5.6-mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch b/target/linux/generic/backport-5.4/310-v5.6-mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch
deleted file mode 100644
index 51eef4b26b..0000000000
--- a/target/linux/generic/backport-5.4/310-v5.6-mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From d3f703c4359ff06619b2322b91f69710453e6b6d Mon Sep 17 00:00:00 2001
-From: Victor Kamensky <kamensky@cisco.com>
-Date: Tue, 11 Feb 2020 11:24:33 -0800
-Subject: [PATCH] mips: vdso: fix 'jalr t9' crash in vdso code
-
-Observed that when kernel is built with Yocto mips64-poky-linux-gcc,
-and mips64-poky-linux-gnun32-gcc toolchain, resulting vdso contains
-'jalr t9' instructions in its code and since in vdso case nobody
-sets GOT table code crashes when instruction reached. On other hand
-observed that when kernel is built mips-poky-linux-gcc toolchain, the
-same 'jalr t9' instruction are replaced with PC relative function
-calls using 'bal' instructions.
-
-The difference boils down to -mrelax-pic-calls and -mexplicit-relocs
-gcc options that gets different default values depending on gcc
-target triplets and corresponding binutils. -mrelax-pic-calls got
-enabled by default only in mips-poky-linux-gcc case. MIPS binutils
-ld relies on R_MIPS_JALR relocation to convert 'jalr t9' into 'bal'
-and such relocation is generated only if -mrelax-pic-calls option
-is on.
-
-Please note 'jalr t9' conversion to 'bal' can happen only to static
-functions. These static PIC calls use mips local GOT entries that
-are supposed to be filled with start of DSO value by run-time linker
-(missing in VDSO case) and they do not have dynamic relocations.
-Global mips GOT entries must have dynamic relocations and they should
-be prevented by cmd_vdso_check Makefile rule.
-
-Solution call out -mrelax-pic-calls and -mexplicit-relocs options
-explicitly while compiling MIPS vdso code. That would get correct
-and consistent between different toolchains behaviour.
-
-Reported-by: Bruce Ashfield <bruce.ashfield@gmail.com>
-Signed-off-by: Victor Kamensky <kamensky@cisco.com>
-Signed-off-by: Paul Burton <paulburton@kernel.org>
-Cc: linux-mips@vger.kernel.org
-Cc: Ralf Baechle <ralf@linux-mips.org>
-Cc: James Hogan <jhogan@kernel.org>
-Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
-Cc: richard.purdie@linuxfoundation.org
----
- arch/mips/vdso/Makefile | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/mips/vdso/Makefile
-+++ b/arch/mips/vdso/Makefile
-@@ -26,6 +26,7 @@ ccflags-vdso := \
- cflags-vdso := $(ccflags-vdso) \
- $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
- -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \
-+ -mrelax-pic-calls -mexplicit-relocs \
- -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
- $(call cc-option, -fno-asynchronous-unwind-tables) \
- $(call cc-option, -fno-stack-protector)
diff --git a/target/linux/generic/backport-5.4/311-MIPS-Fix-exception-handler-memcpy.patch b/target/linux/generic/backport-5.4/311-MIPS-Fix-exception-handler-memcpy.patch
deleted file mode 100644
index 5a6725c7a0..0000000000
--- a/target/linux/generic/backport-5.4/311-MIPS-Fix-exception-handler-memcpy.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From e01c91a360793298c9e1656a61faceff01487a43 Mon Sep 17 00:00:00 2001
-From: Ben Hutchings <ben@decadent.org.uk>
-Date: Sat, 23 May 2020 23:50:34 +0800
-Subject: [PATCH] MIPS: Fix exception handler memcpy()
-
-The exception handler subroutines are declared as a single char, but
-when copied to the required addresses the copy length is 0x80.
-
-When range checks are enabled for memcpy() this results in a build
-failure, with error messages such as:
-
-In file included from arch/mips/mti-malta/malta-init.c:15:
-In function 'memcpy',
- inlined from 'mips_nmi_setup' at arch/mips/mti-malta/malta-init.c:98:2:
-include/linux/string.h:376:4: error: call to '__read_overflow2' declared with attribute error: detected read beyond size of object passed as 2nd parameter
- 376 | __read_overflow2();
- | ^~~~~~~~~~~~~~~~~~
-
-Change the declarations to use type char[].
-
-Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-Signed-off-by: YunQiang Su <syq@debian.org>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- arch/mips/loongson64/common/init.c | 4 ++--
- arch/mips/mti-malta/malta-init.c | 8 ++++----
- arch/mips/pistachio/init.c | 8 ++++----
- 3 files changed, 10 insertions(+), 10 deletions(-)
-
---- a/arch/mips/loongson64/common/init.c
-+++ b/arch/mips/loongson64/common/init.c
-@@ -18,10 +18,10 @@ unsigned long __maybe_unused _loongson_a
- static void __init mips_nmi_setup(void)
- {
- void *base;
-- extern char except_vec_nmi;
-+ extern char except_vec_nmi[];
-
- base = (void *)(CAC_BASE + 0x380);
-- memcpy(base, &except_vec_nmi, 0x80);
-+ memcpy(base, except_vec_nmi, 0x80);
- flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
- }
-
---- a/arch/mips/mti-malta/malta-init.c
-+++ b/arch/mips/mti-malta/malta-init.c
-@@ -90,24 +90,24 @@ static void __init console_config(void)
- static void __init mips_nmi_setup(void)
- {
- void *base;
-- extern char except_vec_nmi;
-+ extern char except_vec_nmi[];
-
- base = cpu_has_veic ?
- (void *)(CAC_BASE + 0xa80) :
- (void *)(CAC_BASE + 0x380);
-- memcpy(base, &except_vec_nmi, 0x80);
-+ memcpy(base, except_vec_nmi, 0x80);
- flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
- }
-
- static void __init mips_ejtag_setup(void)
- {
- void *base;
-- extern char except_vec_ejtag_debug;
-+ extern char except_vec_ejtag_debug[];
-
- base = cpu_has_veic ?
- (void *)(CAC_BASE + 0xa00) :
- (void *)(CAC_BASE + 0x300);
-- memcpy(base, &except_vec_ejtag_debug, 0x80);
-+ memcpy(base, except_vec_ejtag_debug, 0x80);
- flush_icache_range((unsigned long)base, (unsigned long)base + 0x80);
- }
-
---- a/arch/mips/pistachio/init.c
-+++ b/arch/mips/pistachio/init.c
-@@ -83,12 +83,12 @@ phys_addr_t mips_cdmm_phys_base(void)
- static void __init mips_nmi_setup(void)
- {
- void *base;
-- extern char except_vec_nmi;
-+ extern char except_vec_nmi[];
-
- base = cpu_has_veic ?
- (void *)(CAC_BASE + 0xa80) :
- (void *)(CAC_BASE + 0x380);
-- memcpy(base, &except_vec_nmi, 0x80);
-+ memcpy(base, except_vec_nmi, 0x80);
- flush_icache_range((unsigned long)base,
- (unsigned long)base + 0x80);
- }
-@@ -96,12 +96,12 @@ static void __init mips_nmi_setup(void)
- static void __init mips_ejtag_setup(void)
- {
- void *base;
-- extern char except_vec_ejtag_debug;
-+ extern char except_vec_ejtag_debug[];
-
- base = cpu_has_veic ?
- (void *)(CAC_BASE + 0xa00) :
- (void *)(CAC_BASE + 0x300);
-- memcpy(base, &except_vec_ejtag_debug, 0x80);
-+ memcpy(base, except_vec_ejtag_debug, 0x80);
- flush_icache_range((unsigned long)base,
- (unsigned long)base + 0x80);
- }
diff --git a/target/linux/generic/backport-5.4/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch b/target/linux/generic/backport-5.4/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch
deleted file mode 100644
index 501f42d88e..0000000000
--- a/target/linux/generic/backport-5.4/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From: Pablo Neira Ayuso <pablo@netfilter.org>
-Date: Thu, 25 Jan 2018 12:58:55 +0100
-Subject: [PATCH] netfilter: nft_flow_offload: handle netdevice events from
- nf_flow_table
-
-Move the code that deals with device events to the core.
-
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
----
-
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -529,5 +529,35 @@ void nf_flow_table_free(struct nf_flowta
- }
- EXPORT_SYMBOL_GPL(nf_flow_table_free);
-
-+static int nf_flow_table_netdev_event(struct notifier_block *this,
-+ unsigned long event, void *ptr)
-+{
-+ struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-+
-+ if (event != NETDEV_DOWN)
-+ return NOTIFY_DONE;
-+
-+ nf_flow_table_cleanup(dev);
-+
-+ return NOTIFY_DONE;
-+}
-+
-+static struct notifier_block flow_offload_netdev_notifier = {
-+ .notifier_call = nf_flow_table_netdev_event,
-+};
-+
-+static int __init nf_flow_table_module_init(void)
-+{
-+ return register_netdevice_notifier(&flow_offload_netdev_notifier);
-+}
-+
-+static void __exit nf_flow_table_module_exit(void)
-+{
-+ unregister_netdevice_notifier(&flow_offload_netdev_notifier);
-+}
-+
-+module_init(nf_flow_table_module_init);
-+module_exit(nf_flow_table_module_exit);
-+
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Pablo Neira Ayuso <pablo@netfilter.org>");
---- a/net/netfilter/nft_flow_offload.c
-+++ b/net/netfilter/nft_flow_offload.c
-@@ -234,47 +234,14 @@ static struct nft_expr_type nft_flow_off
- .owner = THIS_MODULE,
- };
-
--static int flow_offload_netdev_event(struct notifier_block *this,
-- unsigned long event, void *ptr)
--{
-- struct net_device *dev = netdev_notifier_info_to_dev(ptr);
--
-- if (event != NETDEV_DOWN)
-- return NOTIFY_DONE;
--
-- nf_flow_table_cleanup(dev);
--
-- return NOTIFY_DONE;
--}
--
--static struct notifier_block flow_offload_netdev_notifier = {
-- .notifier_call = flow_offload_netdev_event,
--};
--
- static int __init nft_flow_offload_module_init(void)
- {
-- int err;
--
-- err = register_netdevice_notifier(&flow_offload_netdev_notifier);
-- if (err)
-- goto err;
--
-- err = nft_register_expr(&nft_flow_offload_type);
-- if (err < 0)
-- goto register_expr;
--
-- return 0;
--
--register_expr:
-- unregister_netdevice_notifier(&flow_offload_netdev_notifier);
--err:
-- return err;
-+ return nft_register_expr(&nft_flow_offload_type);
- }
-
- static void __exit nft_flow_offload_module_exit(void)
- {
- nft_unregister_expr(&nft_flow_offload_type);
-- unregister_netdevice_notifier(&flow_offload_netdev_notifier);
- }
-
- module_init(nft_flow_offload_module_init);
diff --git a/target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch b/target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch
deleted file mode 100644
index 373a156429..0000000000
--- a/target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 13 Jun 2018 12:33:39 +0200
-Subject: [PATCH] netfilter: nf_flow_table: fix offloaded connection timeout
- corner case
-
-The full teardown of offloaded flows is deferred to a gc work item,
-however processing of packets by netfilter needs to happen immediately
-after a teardown is requested, because the conntrack state needs to be
-fixed up.
-
-Since the IPS_OFFLOAD_BIT is still kept until the teardown is complete,
-the netfilter conntrack gc can accidentally bump the timeout of a
-connection where offload was just stopped, causing a conntrack entry
-leak.
-
-Fix this by moving the conntrack timeout bumping from conntrack core to
-the nf_flow_offload and add a check to prevent bogus timeout bumps.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/netfilter/nf_conntrack_core.c
-+++ b/net/netfilter/nf_conntrack_core.c
-@@ -1207,18 +1207,6 @@ static bool gc_worker_can_early_drop(con
- return false;
- }
-
--#define DAY (86400 * HZ)
--
--/* Set an arbitrary timeout large enough not to ever expire, this save
-- * us a check for the IPS_OFFLOAD_BIT from the packet path via
-- * nf_ct_is_expired().
-- */
--static void nf_ct_offload_timeout(struct nf_conn *ct)
--{
-- if (nf_ct_expires(ct) < DAY / 2)
-- ct->timeout = nfct_time_stamp + DAY;
--}
--
- static void gc_worker(struct work_struct *work)
- {
- unsigned long end_time = jiffies + GC_SCAN_MAX_DURATION;
-@@ -1250,10 +1238,8 @@ static void gc_worker(struct work_struct
-
- tmp = nf_ct_tuplehash_to_ctrack(h);
-
-- if (test_bit(IPS_OFFLOAD_BIT, &tmp->status)) {
-- nf_ct_offload_timeout(tmp);
-+ if (test_bit(IPS_OFFLOAD_BIT, &tmp->status))
- continue;
-- }
-
- if (nf_ct_is_expired(tmp)) {
- nf_ct_gc_expired(tmp);
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -198,10 +198,29 @@ static const struct rhashtable_params nf
- .automatic_shrinking = true,
- };
-
-+#define DAY (86400 * HZ)
-+
-+/* Set an arbitrary timeout large enough not to ever expire, this save
-+ * us a check for the IPS_OFFLOAD_BIT from the packet path via
-+ * nf_ct_is_expired().
-+ */
-+static void nf_ct_offload_timeout(struct flow_offload *flow)
-+{
-+ struct flow_offload_entry *entry;
-+ struct nf_conn *ct;
-+
-+ entry = container_of(flow, struct flow_offload_entry, flow);
-+ ct = entry->ct;
-+
-+ if (nf_ct_expires(ct) < DAY / 2)
-+ ct->timeout = nfct_time_stamp + DAY;
-+}
-+
- int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow)
- {
- int err;
-
-+ nf_ct_offload_timeout(flow);
- flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
-
- err = rhashtable_insert_fast(&flow_table->rhashtable,
-@@ -304,6 +323,7 @@ nf_flow_table_iterate(struct nf_flowtabl
- rhashtable_walk_start(&hti);
-
- while ((tuplehash = rhashtable_walk_next(&hti))) {
-+
- if (IS_ERR(tuplehash)) {
- if (PTR_ERR(tuplehash) != -EAGAIN) {
- err = PTR_ERR(tuplehash);
-@@ -328,10 +348,17 @@ static void nf_flow_offload_gc_step(stru
- {
- struct nf_flowtable *flow_table = data;
- struct flow_offload_entry *e;
-+ bool teardown;
-
- e = container_of(flow, struct flow_offload_entry, flow);
-- if (nf_flow_has_expired(flow) || nf_ct_is_dying(e->ct) ||
-- (flow->flags & (FLOW_OFFLOAD_DYING | FLOW_OFFLOAD_TEARDOWN)))
-+
-+ teardown = flow->flags & (FLOW_OFFLOAD_DYING |
-+ FLOW_OFFLOAD_TEARDOWN);
-+
-+ if (!teardown)
-+ nf_ct_offload_timeout(flow);
-+
-+ if (nf_flow_has_expired(flow) || teardown)
- flow_offload_del(flow_table, flow);
- }
-
diff --git a/target/linux/generic/backport-5.4/371-netfilter-nf_flow_table-fix-up-ct-state-of-flows-aft.patch b/target/linux/generic/backport-5.4/371-netfilter-nf_flow_table-fix-up-ct-state-of-flows-aft.patch
deleted file mode 100644
index 383641dfb7..0000000000
--- a/target/linux/generic/backport-5.4/371-netfilter-nf_flow_table-fix-up-ct-state-of-flows-aft.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 14 Jun 2018 11:20:09 +0200
-Subject: [PATCH] netfilter: nf_flow_table: fix up ct state of flows after
- timeout
-
-If a connection simply times out instead of being torn down, it is left
-active with a long timeout. Fix this by calling flow_offload_fixup_ct_state
-here as well.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -268,6 +268,9 @@ static void flow_offload_del(struct nf_f
- else if (flow->flags & FLOW_OFFLOAD_TEARDOWN)
- flow_offload_fixup_ct_timeout(e->ct);
-
-+ if (!(flow->flags & FLOW_OFFLOAD_TEARDOWN))
-+ flow_offload_fixup_ct_state(e->ct);
-+
- flow_offload_free(flow);
- }
-
diff --git a/target/linux/generic/backport-5.4/393-v5.5-sch_cake-drop-unused-variable-tin_quantum_prio.patch b/target/linux/generic/backport-5.4/393-v5.5-sch_cake-drop-unused-variable-tin_quantum_prio.patch
deleted file mode 100644
index 6c9e8ad5ee..0000000000
--- a/target/linux/generic/backport-5.4/393-v5.5-sch_cake-drop-unused-variable-tin_quantum_prio.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From d7e1738f0a0b0573ac93cf570ba3df9dee61b68e Mon Sep 17 00:00:00 2001
-From: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Date: Wed, 18 Dec 2019 14:05:13 +0000
-Subject: [PATCH 2/2] sch_cake: drop unused variable tin_quantum_prio
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Turns out tin_quantum_prio isn't used anymore and is a leftover from a
-previous implementation of diffserv tins. Since the variable isn't used
-in any calculations it can be eliminated.
-
-Drop variable and places where it was set. Rename remaining variable
-and consolidate naming of intermediate variables that set it.
-
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/sched/sch_cake.c | 59 ++++++++++++++------------------------------
- 1 file changed, 18 insertions(+), 41 deletions(-)
-
---- a/net/sched/sch_cake.c
-+++ b/net/sched/sch_cake.c
-@@ -173,8 +173,7 @@ struct cake_tin_data {
- u64 tin_rate_bps;
- u16 tin_rate_shft;
-
-- u16 tin_quantum_prio;
-- u16 tin_quantum_band;
-+ u16 tin_quantum;
- s32 tin_deficit;
- u32 tin_backlog;
- u32 tin_dropped;
-@@ -1947,7 +1946,7 @@ begin:
- while (b->tin_deficit < 0 ||
- !(b->sparse_flow_count + b->bulk_flow_count)) {
- if (b->tin_deficit <= 0)
-- b->tin_deficit += b->tin_quantum_band;
-+ b->tin_deficit += b->tin_quantum;
- if (b->sparse_flow_count + b->bulk_flow_count)
- empty = false;
-
-@@ -2269,8 +2268,7 @@ static int cake_config_besteffort(struct
-
- cake_set_rate(b, rate, mtu,
- us_to_ns(q->target), us_to_ns(q->interval));
-- b->tin_quantum_band = 65535;
-- b->tin_quantum_prio = 65535;
-+ b->tin_quantum = 65535;
-
- return 0;
- }
-@@ -2281,8 +2279,7 @@ static int cake_config_precedence(struct
- struct cake_sched_data *q = qdisc_priv(sch);
- u32 mtu = psched_mtu(qdisc_dev(sch));
- u64 rate = q->rate_bps;
-- u32 quantum1 = 256;
-- u32 quantum2 = 256;
-+ u32 quantum = 256;
- u32 i;
-
- q->tin_cnt = 8;
-@@ -2295,18 +2292,14 @@ static int cake_config_precedence(struct
- cake_set_rate(b, rate, mtu, us_to_ns(q->target),
- us_to_ns(q->interval));
-
-- b->tin_quantum_prio = max_t(u16, 1U, quantum1);
-- b->tin_quantum_band = max_t(u16, 1U, quantum2);
-+ b->tin_quantum = max_t(u16, 1U, quantum);
-
- /* calculate next class's parameters */
- rate *= 7;
- rate >>= 3;
-
-- quantum1 *= 3;
-- quantum1 >>= 1;
--
-- quantum2 *= 7;
-- quantum2 >>= 3;
-+ quantum *= 7;
-+ quantum >>= 3;
- }
-
- return 0;
-@@ -2375,8 +2368,7 @@ static int cake_config_diffserv8(struct
- struct cake_sched_data *q = qdisc_priv(sch);
- u32 mtu = psched_mtu(qdisc_dev(sch));
- u64 rate = q->rate_bps;
-- u32 quantum1 = 256;
-- u32 quantum2 = 256;
-+ u32 quantum = 256;
- u32 i;
-
- q->tin_cnt = 8;
-@@ -2392,18 +2384,14 @@ static int cake_config_diffserv8(struct
- cake_set_rate(b, rate, mtu, us_to_ns(q->target),
- us_to_ns(q->interval));
-
-- b->tin_quantum_prio = max_t(u16, 1U, quantum1);
-- b->tin_quantum_band = max_t(u16, 1U, quantum2);
-+ b->tin_quantum = max_t(u16, 1U, quantum);
-
- /* calculate next class's parameters */
- rate *= 7;
- rate >>= 3;
-
-- quantum1 *= 3;
-- quantum1 >>= 1;
--
-- quantum2 *= 7;
-- quantum2 >>= 3;
-+ quantum *= 7;
-+ quantum >>= 3;
- }
-
- return 0;
-@@ -2442,17 +2430,11 @@ static int cake_config_diffserv4(struct
- cake_set_rate(&q->tins[3], rate >> 2, mtu,
- us_to_ns(q->target), us_to_ns(q->interval));
-
-- /* priority weights */
-- q->tins[0].tin_quantum_prio = quantum;
-- q->tins[1].tin_quantum_prio = quantum >> 4;
-- q->tins[2].tin_quantum_prio = quantum << 2;
-- q->tins[3].tin_quantum_prio = quantum << 4;
--
- /* bandwidth-sharing weights */
-- q->tins[0].tin_quantum_band = quantum;
-- q->tins[1].tin_quantum_band = quantum >> 4;
-- q->tins[2].tin_quantum_band = quantum >> 1;
-- q->tins[3].tin_quantum_band = quantum >> 2;
-+ q->tins[0].tin_quantum = quantum;
-+ q->tins[1].tin_quantum = quantum >> 4;
-+ q->tins[2].tin_quantum = quantum >> 1;
-+ q->tins[3].tin_quantum = quantum >> 2;
-
- return 0;
- }
-@@ -2483,15 +2465,10 @@ static int cake_config_diffserv3(struct
- cake_set_rate(&q->tins[2], rate >> 2, mtu,
- us_to_ns(q->target), us_to_ns(q->interval));
-
-- /* priority weights */
-- q->tins[0].tin_quantum_prio = quantum;
-- q->tins[1].tin_quantum_prio = quantum >> 4;
-- q->tins[2].tin_quantum_prio = quantum << 4;
--
- /* bandwidth-sharing weights */
-- q->tins[0].tin_quantum_band = quantum;
-- q->tins[1].tin_quantum_band = quantum >> 4;
-- q->tins[2].tin_quantum_band = quantum >> 2;
-+ q->tins[0].tin_quantum = quantum;
-+ q->tins[1].tin_quantum = quantum >> 4;
-+ q->tins[2].tin_quantum = quantum >> 2;
-
- return 0;
- }
diff --git a/target/linux/generic/backport-5.4/395-v5.8-net-sch_cake-Take-advantage-of-skb-hash-where-appropriate.patch b/target/linux/generic/backport-5.4/395-v5.8-net-sch_cake-Take-advantage-of-skb-hash-where-appropriate.patch
deleted file mode 100644
index a4981acdee..0000000000
--- a/target/linux/generic/backport-5.4/395-v5.8-net-sch_cake-Take-advantage-of-skb-hash-where-appropriate.patch
+++ /dev/null
@@ -1,170 +0,0 @@
-From b0c19ed6088ab41dd2a727b60594b7297c15d6ce Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com>
-Date: Fri, 29 May 2020 14:43:44 +0200
-Subject: [PATCH] sch_cake: Take advantage of skb->hash where appropriate
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-While the other fq-based qdiscs take advantage of skb->hash and doesn't
-recompute it if it is already set, sch_cake does not.
-
-This was a deliberate choice because sch_cake hashes various parts of the
-packet header to support its advanced flow isolation modes. However,
-foregoing the use of skb->hash entirely loses a few important benefits:
-
-- When skb->hash is set by hardware, a few CPU cycles can be saved by not
- hashing again in software.
-
-- Tunnel encapsulations will generally preserve the value of skb->hash from
- before the encapsulation, which allows flow-based qdiscs to distinguish
- between flows even though the outer packet header no longer has flow
- information.
-
-It turns out that we can preserve these desirable properties in many cases,
-while still supporting the advanced flow isolation properties of sch_cake.
-This patch does so by reusing the skb->hash value as the flow_hash part of
-the hashing procedure in cake_hash() only in the following conditions:
-
-- If the skb->hash is marked as covering the flow headers (skb->l4_hash is
- set)
-
-AND
-
-- NAT header rewriting is either disabled, or did not change any values
- used for hashing. The latter is important to match local-origin packets
- such as those of a tunnel endpoint.
-
-The immediate motivation for fixing this was the recent patch to WireGuard
-to preserve the skb->hash on encapsulation. As such, this is also what I
-tested against; with this patch, added latency under load for competing
-flows drops from ~8 ms to sub-1ms on an RRUL test over a WireGuard tunnel
-going through a virtual link shaped to 1Gbps using sch_cake. This matches
-the results we saw with a similar setup using sch_fq_codel when testing the
-WireGuard patch.
-
-Fixes: 046f6fd5daef ("sched: Add Common Applications Kept Enhanced (cake) qdisc")
-Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
----
- net/sched/sch_cake.c | 65 ++++++++++++++++++++++++++++++++++----------
- 1 file changed, 51 insertions(+), 14 deletions(-)
-
---- a/net/sched/sch_cake.c
-+++ b/net/sched/sch_cake.c
-@@ -584,26 +584,48 @@ static bool cobalt_should_drop(struct co
- return drop;
- }
-
--static void cake_update_flowkeys(struct flow_keys *keys,
-+static bool cake_update_flowkeys(struct flow_keys *keys,
- const struct sk_buff *skb)
- {
- #if IS_ENABLED(CONFIG_NF_CONNTRACK)
- struct nf_conntrack_tuple tuple = {};
-- bool rev = !skb->_nfct;
-+ bool rev = !skb->_nfct, upd = false;
-+ __be32 ip;
-
- if (skb_protocol(skb, true) != htons(ETH_P_IP))
-- return;
-+ return false;
-
- if (!nf_ct_get_tuple_skb(&tuple, skb))
-- return;
-+ return false;
-
-- keys->addrs.v4addrs.src = rev ? tuple.dst.u3.ip : tuple.src.u3.ip;
-- keys->addrs.v4addrs.dst = rev ? tuple.src.u3.ip : tuple.dst.u3.ip;
-+ ip = rev ? tuple.dst.u3.ip : tuple.src.u3.ip;
-+ if (ip != keys->addrs.v4addrs.src) {
-+ keys->addrs.v4addrs.src = ip;
-+ upd = true;
-+ }
-+ ip = rev ? tuple.src.u3.ip : tuple.dst.u3.ip;
-+ if (ip != keys->addrs.v4addrs.dst) {
-+ keys->addrs.v4addrs.dst = ip;
-+ upd = true;
-+ }
-
- if (keys->ports.ports) {
-- keys->ports.src = rev ? tuple.dst.u.all : tuple.src.u.all;
-- keys->ports.dst = rev ? tuple.src.u.all : tuple.dst.u.all;
-+ __be16 port;
-+
-+ port = rev ? tuple.dst.u.all : tuple.src.u.all;
-+ if (port != keys->ports.src) {
-+ keys->ports.src = port;
-+ upd = true;
-+ }
-+ port = rev ? tuple.src.u.all : tuple.dst.u.all;
-+ if (port != keys->ports.dst) {
-+ port = keys->ports.dst;
-+ upd = true;
-+ }
- }
-+ return upd;
-+#else
-+ return false;
- #endif
- }
-
-@@ -624,23 +646,36 @@ static bool cake_ddst(int flow_mode)
- static u32 cake_hash(struct cake_tin_data *q, const struct sk_buff *skb,
- int flow_mode, u16 flow_override, u16 host_override)
- {
-+ bool hash_flows = (!flow_override && !!(flow_mode & CAKE_FLOW_FLOWS));
-+ bool hash_hosts = (!host_override && !!(flow_mode & CAKE_FLOW_HOSTS));
-+ bool nat_enabled = !!(flow_mode & CAKE_FLOW_NAT_FLAG);
- u32 flow_hash = 0, srchost_hash = 0, dsthost_hash = 0;
- u16 reduced_hash, srchost_idx, dsthost_idx;
- struct flow_keys keys, host_keys;
-+ bool use_skbhash = skb->l4_hash;
-
- if (unlikely(flow_mode == CAKE_FLOW_NONE))
- return 0;
-
-- /* If both overrides are set we can skip packet dissection entirely */
-- if ((flow_override || !(flow_mode & CAKE_FLOW_FLOWS)) &&
-- (host_override || !(flow_mode & CAKE_FLOW_HOSTS)))
-+ /* If both overrides are set, or we can use the SKB hash and nat mode is
-+ * disabled, we can skip packet dissection entirely. If nat mode is
-+ * enabled there's another check below after doing the conntrack lookup.
-+ */
-+ if ((!hash_flows || (use_skbhash && !nat_enabled)) && !hash_hosts)
- goto skip_hash;
-
- skb_flow_dissect_flow_keys(skb, &keys,
- FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
-
-- if (flow_mode & CAKE_FLOW_NAT_FLAG)
-- cake_update_flowkeys(&keys, skb);
-+ /* Don't use the SKB hash if we change the lookup keys from conntrack */
-+ if (nat_enabled && cake_update_flowkeys(&keys, skb))
-+ use_skbhash = false;
-+
-+ /* If we can still use the SKB hash and don't need the host hash, we can
-+ * skip the rest of the hashing procedure
-+ */
-+ if (use_skbhash && !hash_hosts)
-+ goto skip_hash;
-
- /* flow_hash_from_keys() sorts the addresses by value, so we have
- * to preserve their order in a separate data structure to treat
-@@ -679,12 +714,14 @@ static u32 cake_hash(struct cake_tin_dat
- /* This *must* be after the above switch, since as a
- * side-effect it sorts the src and dst addresses.
- */
-- if (flow_mode & CAKE_FLOW_FLOWS)
-+ if (hash_flows && !use_skbhash)
- flow_hash = flow_hash_from_keys(&keys);
-
- skip_hash:
- if (flow_override)
- flow_hash = flow_override - 1;
-+ else if (use_skbhash)
-+ flow_hash = skb->hash;
- if (host_override) {
- dsthost_hash = host_override - 1;
- srchost_hash = host_override - 1;
diff --git a/target/linux/generic/backport-5.4/399-5.9-sch_cake-add-RFC-8622-LE-PHB-support-to-CAKE-diffser.patch b/target/linux/generic/backport-5.4/399-5.9-sch_cake-add-RFC-8622-LE-PHB-support-to-CAKE-diffser.patch
deleted file mode 100644
index e171b4cec7..0000000000
--- a/target/linux/generic/backport-5.4/399-5.9-sch_cake-add-RFC-8622-LE-PHB-support-to-CAKE-diffser.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From b8392808eb3fc28e523e28cb258c81ca246deb9b Mon Sep 17 00:00:00 2001
-From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Date: Thu, 25 Jun 2020 22:18:00 +0200
-Subject: [PATCH] sch_cake: add RFC 8622 LE PHB support to CAKE diffserv
- handling
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Change tin mapping on diffserv3, 4 & 8 for LE PHB support, in essence
-making LE a member of the Bulk tin.
-
-Bulk has the least priority and minimum of 1/16th total bandwidth in the
-face of higher priority traffic.
-
-NB: Diffserv 3 & 4 swap tin 0 & 1 priorities from the default order as
-found in diffserv8, in case anyone is wondering why it looks a bit odd.
-
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-[ reword commit message slightly ]
-Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/sched/sch_cake.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/net/sched/sch_cake.c
-+++ b/net/sched/sch_cake.c
-@@ -312,8 +312,8 @@ static const u8 precedence[] = {
- };
-
- static const u8 diffserv8[] = {
-- 2, 5, 1, 2, 4, 2, 2, 2,
-- 0, 2, 1, 2, 1, 2, 1, 2,
-+ 2, 0, 1, 2, 4, 2, 2, 2,
-+ 1, 2, 1, 2, 1, 2, 1, 2,
- 5, 2, 4, 2, 4, 2, 4, 2,
- 3, 2, 3, 2, 3, 2, 3, 2,
- 6, 2, 3, 2, 3, 2, 3, 2,
-@@ -323,7 +323,7 @@ static const u8 diffserv8[] = {
- };
-
- static const u8 diffserv4[] = {
-- 0, 2, 0, 0, 2, 0, 0, 0,
-+ 0, 1, 0, 0, 2, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 2, 0, 2, 0, 2, 0,
- 2, 0, 2, 0, 2, 0, 2, 0,
-@@ -334,7 +334,7 @@ static const u8 diffserv4[] = {
- };
-
- static const u8 diffserv3[] = {
-- 0, 0, 0, 0, 2, 0, 0, 0,
-+ 0, 1, 0, 0, 2, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
diff --git a/target/linux/generic/backport-5.4/400-v5.8-dt-bindings-mtd-partition-Document-the-slc-mode-prop.patch b/target/linux/generic/backport-5.4/400-v5.8-dt-bindings-mtd-partition-Document-the-slc-mode-prop.patch
deleted file mode 100644
index 7926843686..0000000000
--- a/target/linux/generic/backport-5.4/400-v5.8-dt-bindings-mtd-partition-Document-the-slc-mode-prop.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 422928a040fe17d17ded69c57903c7908423c7ef Mon Sep 17 00:00:00 2001
-From: Boris Brezillon <bbrezillon@kernel.org>
-Date: Sun, 3 May 2020 17:53:38 +0200
-Subject: [PATCH] dt-bindings: mtd: partition: Document the slc-mode property
-
-Add a boolean property to force a specific partition attached to an MLC
-NAND to be accessed in an emulated SLC mode this making this partition
-immune to paired-pages corruptions.
-
-Signed-off-by: Boris Brezillon <bbrezillon@kernel.org>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20200503155341.16712-6-miquel.raynal@bootlin.com
----
- Documentation/devicetree/bindings/mtd/partition.txt | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/Documentation/devicetree/bindings/mtd/partition.txt
-+++ b/Documentation/devicetree/bindings/mtd/partition.txt
-@@ -61,6 +61,9 @@ Optional properties:
- clobbered.
- - lock : Do not unlock the partition at initialization time (not supported on
- all devices)
-+- slc-mode: This parameter, if present, allows one to emulate SLC mode on a
-+ partition attached to an MLC NAND thus making this partition immune to
-+ paired-pages corruptions
-
- Examples:
-
diff --git a/target/linux/generic/backport-5.4/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch b/target/linux/generic/backport-5.4/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch
deleted file mode 100644
index 8aded43526..0000000000
--- a/target/linux/generic/backport-5.4/401-v5.11-dt-bindings-mtd-convert-fixed-partitions-to-the-json.patch
+++ /dev/null
@@ -1,324 +0,0 @@
-From 04e9ab75267489224364fa510a88ada83e11c325 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 10 Dec 2020 18:23:52 +0100
-Subject: [PATCH] dt-bindings: mtd: convert "fixed-partitions" to the
- json-schema
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This standardizes its documentation, allows validating with Makefile
-checks and helps writing DTS files.
-
-Noticeable changes:
-1. Dropped "Partitions can be represented by sub-nodes of a flash
- device." as we also support subpartitions (don't have to be part of
- flash device node)
-2. Dropped "to Linux" as bindings are meant to be os agnostic.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Link: https://lore.kernel.org/r/20201210172352.31632-1-zajec5@gmail.com
-Signed-off-by: Rob Herring <robh@kernel.org>
----
- .../devicetree/bindings/mtd/partition.txt | 131 +--------------
- .../mtd/partitions/fixed-partitions.yaml | 152 ++++++++++++++++++
- 2 files changed, 154 insertions(+), 129 deletions(-)
- create mode 100644 Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml
-
---- a/Documentation/devicetree/bindings/mtd/partition.txt
-+++ b/Documentation/devicetree/bindings/mtd/partition.txt
-@@ -24,137 +24,10 @@ another partitioning method.
- Available bindings are listed in the "partitions" subdirectory.
-
-
--Fixed Partitions
--================
--
--Partitions can be represented by sub-nodes of a flash device. This can be used
--on platforms which have strong conventions about which portions of a flash are
--used for what purposes, but which don't use an on-flash partition table such
--as RedBoot.
--
--The partition table should be a subnode of the flash node and should be named
--'partitions'. This node should have the following property:
--- compatible : (required) must be "fixed-partitions"
--Partitions are then defined in subnodes of the partitions node.
-+Deprecated: partitions defined in flash node
-+============================================
-
- For backwards compatibility partitions as direct subnodes of the flash device are
- supported. This use is discouraged.
- NOTE: also for backwards compatibility, direct subnodes that have a compatible
- string are not considered partitions, as they may be used for other bindings.
--
--#address-cells & #size-cells must both be present in the partitions subnode of the
--flash device. There are two valid values for both:
--<1>: for partitions that require a single 32-bit cell to represent their
-- size/address (aka the value is below 4 GiB)
--<2>: for partitions that require two 32-bit cells to represent their
-- size/address (aka the value is 4 GiB or greater).
--
--Required properties:
--- reg : The partition's offset and size within the flash
--
--Optional properties:
--- label : The label / name for this partition. If omitted, the label is taken
-- from the node name (excluding the unit address).
--- read-only : This parameter, if present, is a hint to Linux that this
-- partition should only be mounted read-only. This is usually used for flash
-- partitions containing early-boot firmware images or data which should not be
-- clobbered.
--- lock : Do not unlock the partition at initialization time (not supported on
-- all devices)
--- slc-mode: This parameter, if present, allows one to emulate SLC mode on a
-- partition attached to an MLC NAND thus making this partition immune to
-- paired-pages corruptions
--
--Examples:
--
--
--flash@0 {
-- partitions {
-- compatible = "fixed-partitions";
-- #address-cells = <1>;
-- #size-cells = <1>;
--
-- partition@0 {
-- label = "u-boot";
-- reg = <0x0000000 0x100000>;
-- read-only;
-- };
--
-- uimage@100000 {
-- reg = <0x0100000 0x200000>;
-- };
-- };
--};
--
--flash@1 {
-- partitions {
-- compatible = "fixed-partitions";
-- #address-cells = <1>;
-- #size-cells = <2>;
--
-- /* a 4 GiB partition */
-- partition@0 {
-- label = "filesystem";
-- reg = <0x00000000 0x1 0x00000000>;
-- };
-- };
--};
--
--flash@2 {
-- partitions {
-- compatible = "fixed-partitions";
-- #address-cells = <2>;
-- #size-cells = <2>;
--
-- /* an 8 GiB partition */
-- partition@0 {
-- label = "filesystem #1";
-- reg = <0x0 0x00000000 0x2 0x00000000>;
-- };
--
-- /* a 4 GiB partition */
-- partition@200000000 {
-- label = "filesystem #2";
-- reg = <0x2 0x00000000 0x1 0x00000000>;
-- };
-- };
--};
--
--flash@3 {
-- partitions {
-- compatible = "fixed-partitions";
-- #address-cells = <1>;
-- #size-cells = <1>;
--
-- partition@0 {
-- label = "bootloader";
-- reg = <0x000000 0x100000>;
-- read-only;
-- };
--
-- firmware@100000 {
-- label = "firmware";
-- reg = <0x100000 0xe00000>;
-- compatible = "brcm,trx";
-- };
--
-- calibration@f00000 {
-- label = "calibration";
-- reg = <0xf00000 0x100000>;
-- compatible = "fixed-partitions";
-- ranges = <0 0xf00000 0x100000>;
-- #address-cells = <1>;
-- #size-cells = <1>;
--
-- partition@0 {
-- label = "wifi0";
-- reg = <0x000000 0x080000>;
-- };
--
-- partition@80000 {
-- label = "wifi1";
-- reg = <0x080000 0x080000>;
-- };
-- };
-- };
--};
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml
-@@ -0,0 +1,152 @@
-+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/mtd/partitions/fixed-partitions.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Fixed partitions
-+
-+description: |
-+ This binding can be used on platforms which have strong conventions about
-+ which portions of a flash are used for what purposes, but which don't use an
-+ on-flash partition table such as RedBoot.
-+
-+ The partition table should be a node named "partitions". Partitions are then
-+ defined as subnodes.
-+
-+maintainers:
-+ - Rafał Miłecki <rafal@milecki.pl>
-+
-+properties:
-+ compatible:
-+ const: fixed-partitions
-+
-+ "#address-cells": true
-+
-+ "#size-cells": true
-+
-+patternProperties:
-+ "@[0-9a-f]+$":
-+ description: node describing a single flash partition
-+ type: object
-+
-+ properties:
-+ reg:
-+ description: partition's offset and size within the flash
-+ maxItems: 1
-+
-+ label:
-+ description: The label / name for this partition. If omitted, the label
-+ is taken from the node name (excluding the unit address).
-+
-+ read-only:
-+ description: This parameter, if present, is a hint that this partition
-+ should only be mounted read-only. This is usually used for flash
-+ partitions containing early-boot firmware images or data which should
-+ not be clobbered.
-+ type: boolean
-+
-+ lock:
-+ description: Do not unlock the partition at initialization time (not
-+ supported on all devices)
-+ type: boolean
-+
-+ slc-mode:
-+ description: This parameter, if present, allows one to emulate SLC mode
-+ on a partition attached to an MLC NAND thus making this partition
-+ immune to paired-pages corruptions
-+ type: boolean
-+
-+ required:
-+ - reg
-+
-+required:
-+ - "#address-cells"
-+ - "#size-cells"
-+
-+additionalProperties: true
-+
-+examples:
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "u-boot";
-+ reg = <0x0000000 0x100000>;
-+ read-only;
-+ };
-+
-+ uimage@100000 {
-+ reg = <0x0100000 0x200000>;
-+ };
-+ };
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <2>;
-+
-+ /* a 4 GiB partition */
-+ partition@0 {
-+ label = "filesystem";
-+ reg = <0x00000000 0x1 0x00000000>;
-+ };
-+ };
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <2>;
-+ #size-cells = <2>;
-+
-+ /* an 8 GiB partition */
-+ partition@0 {
-+ label = "filesystem #1";
-+ reg = <0x0 0x00000000 0x2 0x00000000>;
-+ };
-+
-+ /* a 4 GiB partition */
-+ partition@200000000 {
-+ label = "filesystem #2";
-+ reg = <0x2 0x00000000 0x1 0x00000000>;
-+ };
-+ };
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "bootloader";
-+ reg = <0x000000 0x100000>;
-+ read-only;
-+ };
-+
-+ firmware@100000 {
-+ compatible = "brcm,trx";
-+ label = "firmware";
-+ reg = <0x100000 0xe00000>;
-+ };
-+
-+ calibration@f00000 {
-+ compatible = "fixed-partitions";
-+ label = "calibration";
-+ reg = <0xf00000 0x100000>;
-+ ranges = <0 0xf00000 0x100000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "wifi0";
-+ reg = <0x000000 0x080000>;
-+ };
-+
-+ partition@80000 {
-+ label = "wifi1";
-+ reg = <0x080000 0x080000>;
-+ };
-+ };
-+ };
diff --git a/target/linux/generic/backport-5.4/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch b/target/linux/generic/backport-5.4/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch
deleted file mode 100644
index f3b1179ecd..0000000000
--- a/target/linux/generic/backport-5.4/402-v5.12-0001-dt-bindings-mtd-move-partition-binding-to-its-own-fi.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 6418522022c706fd867b00b2571edba48b8fa8c7 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 11 Feb 2021 23:04:25 +0100
-Subject: [PATCH] dt-bindings: mtd: move partition binding to its own file
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Single partition binding is quite common and may be:
-1. Used by multiple parsers
-2. Extended for more specific cases
-
-Move it to separated file to avoid code duplication.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Rob Herring <robh@kernel.org>
-Signed-off-by: Richard Weinberger <richard@nod.at>
----
- .../mtd/partitions/fixed-partitions.yaml | 33 +------------
- .../bindings/mtd/partitions/partition.yaml | 47 +++++++++++++++++++
- 2 files changed, 48 insertions(+), 32 deletions(-)
- create mode 100644 Documentation/devicetree/bindings/mtd/partitions/partition.yaml
-
---- a/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml
-+++ b/Documentation/devicetree/bindings/mtd/partitions/fixed-partitions.yaml
-@@ -27,38 +27,7 @@ properties:
-
- patternProperties:
- "@[0-9a-f]+$":
-- description: node describing a single flash partition
-- type: object
--
-- properties:
-- reg:
-- description: partition's offset and size within the flash
-- maxItems: 1
--
-- label:
-- description: The label / name for this partition. If omitted, the label
-- is taken from the node name (excluding the unit address).
--
-- read-only:
-- description: This parameter, if present, is a hint that this partition
-- should only be mounted read-only. This is usually used for flash
-- partitions containing early-boot firmware images or data which should
-- not be clobbered.
-- type: boolean
--
-- lock:
-- description: Do not unlock the partition at initialization time (not
-- supported on all devices)
-- type: boolean
--
-- slc-mode:
-- description: This parameter, if present, allows one to emulate SLC mode
-- on a partition attached to an MLC NAND thus making this partition
-- immune to paired-pages corruptions
-- type: boolean
--
-- required:
-- - reg
-+ $ref: "partition.yaml#"
-
- required:
- - "#address-cells"
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/partitions/partition.yaml
-@@ -0,0 +1,47 @@
-+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/mtd/partitions/partition.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Partition
-+
-+description: |
-+ This binding describes a single flash partition. Each partition must have its
-+ relative offset and size specified. Depending on partition function extra
-+ properties can be used.
-+
-+maintainers:
-+ - Rafał Miłecki <rafal@milecki.pl>
-+
-+properties:
-+ reg:
-+ description: partition's offset and size within the flash
-+ maxItems: 1
-+
-+ label:
-+ description: The label / name for this partition. If omitted, the label
-+ is taken from the node name (excluding the unit address).
-+
-+ read-only:
-+ description: This parameter, if present, is a hint that this partition
-+ should only be mounted read-only. This is usually used for flash
-+ partitions containing early-boot firmware images or data which should
-+ not be clobbered.
-+ type: boolean
-+
-+ lock:
-+ description: Do not unlock the partition at initialization time (not
-+ supported on all devices)
-+ type: boolean
-+
-+ slc-mode:
-+ description: This parameter, if present, allows one to emulate SLC mode
-+ on a partition attached to an MLC NAND thus making this partition
-+ immune to paired-pages corruptions
-+ type: boolean
-+
-+required:
-+ - reg
-+
-+additionalProperties: true
diff --git a/target/linux/generic/backport-5.4/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch b/target/linux/generic/backport-5.4/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch
deleted file mode 100644
index 8576c7d78d..0000000000
--- a/target/linux/generic/backport-5.4/402-v5.12-0002-dt-bindings-mtd-add-binding-for-BCM4908-partitions.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From 6e9dff6fe3fbc452f16566e4a7e293b0decefdba Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 11 Feb 2021 23:04:26 +0100
-Subject: [PATCH] dt-bindings: mtd: add binding for BCM4908 partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-BCM4908 uses fixed partitions layout but function of some partitions may
-vary. Some devices use multiple firmware partitions and those partitions
-should be marked to let system discover their purpose.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Richard Weinberger <richard@nod.at>
----
- .../partitions/brcm,bcm4908-partitions.yaml | 70 +++++++++++++++++++
- 1 file changed, 70 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/partitions/brcm,bcm4908-partitions.yaml
-@@ -0,0 +1,70 @@
-+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/mtd/partitions/brcm,bcm4908-partitions.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Broadcom BCM4908 partitioning
-+
-+description: |
-+ Broadcom BCM4908 CFE bootloader supports two firmware partitions. One is used
-+ for regular booting, the other is treated as fallback.
-+
-+ This binding allows defining all fixed partitions and marking those containing
-+ firmware. System can use that information e.g. for booting or flashing
-+ purposes.
-+
-+maintainers:
-+ - Rafał Miłecki <rafal@milecki.pl>
-+
-+properties:
-+ compatible:
-+ const: brcm,bcm4908-partitions
-+
-+ "#address-cells":
-+ enum: [ 1, 2 ]
-+
-+ "#size-cells":
-+ enum: [ 1, 2 ]
-+
-+patternProperties:
-+ "^partition@[0-9a-f]+$":
-+ $ref: "partition.yaml#"
-+ properties:
-+ compatible:
-+ const: brcm,bcm4908-firmware
-+ unevaluatedProperties: false
-+
-+required:
-+ - "#address-cells"
-+ - "#size-cells"
-+
-+additionalProperties: false
-+
-+examples:
-+ - |
-+ partitions {
-+ compatible = "brcm,bcm4908-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "cferom";
-+ reg = <0x0 0x100000>;
-+ };
-+
-+ partition@100000 {
-+ compatible = "brcm,bcm4908-firmware";
-+ reg = <0x100000 0xf00000>;
-+ };
-+
-+ partition@1000000 {
-+ compatible = "brcm,bcm4908-firmware";
-+ reg = <0x1000000 0xf00000>;
-+ };
-+
-+ partition@1f00000 {
-+ label = "calibration";
-+ reg = <0x1f00000 0x100000>;
-+ };
-+ };
diff --git a/target/linux/generic/backport-5.4/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch b/target/linux/generic/backport-5.4/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch
deleted file mode 100644
index 8f292bd177..0000000000
--- a/target/linux/generic/backport-5.4/403-v5.13-mtd-parsers-ofpart-support-BCM4908-fixed-partitions.patch
+++ /dev/null
@@ -1,648 +0,0 @@
-From afbef8efb591792579c633a7c545f914c6165f82 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 11 Feb 2021 23:04:27 +0100
-Subject: [PATCH] mtd: parsers: ofpart: support BCM4908 fixed partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Some devices use fixed partitioning with some partitions requiring some
-extra logic. E.g. BCM4908 may have multiple firmware partitions but
-detecting currently used one requires checking bootloader parameters.
-
-To support such cases without duplicating a lot of code (without copying
-most of the ofpart.c code) support for post-parsing callback was added.
-
-BCM4908 support in ofpart can be enabled using config option and results
-in compiling & executing a specific callback. It simply reads offset of
-currently used firmware partition from the DT. Bootloader specifies it
-using the "brcm_blparms" property.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
----
- drivers/mtd/parsers/Kconfig | 9 +++
- drivers/mtd/parsers/Makefile | 2 +
- drivers/mtd/parsers/ofpart_bcm4908.c | 64 +++++++++++++++++++
- drivers/mtd/parsers/ofpart_bcm4908.h | 15 +++++
- .../mtd/parsers/{ofpart.c => ofpart_core.c} | 28 +++++++-
- 5 files changed, 116 insertions(+), 2 deletions(-)
- create mode 100644 drivers/mtd/parsers/ofpart_bcm4908.c
- create mode 100644 drivers/mtd/parsers/ofpart_bcm4908.h
- rename drivers/mtd/parsers/{ofpart.c => ofpart_core.c} (88%)
-
---- a/drivers/mtd/parsers/Kconfig
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -67,6 +67,15 @@ config MTD_OF_PARTS
- flash memory node, as described in
- Documentation/devicetree/bindings/mtd/partition.txt.
-
-+config MTD_OF_PARTS_BCM4908
-+ bool "BCM4908 partitioning support"
-+ depends on MTD_OF_PARTS && (ARCH_BCM4908 || COMPILE_TEST)
-+ default ARCH_BCM4908
-+ help
-+ This provides partitions parser for BCM4908 family devices
-+ that can have multiple "firmware" partitions. It takes care of
-+ finding currently used one and backup ones.
-+
- config MTD_PARSER_IMAGETAG
- tristate "Parser for BCM963XX Image Tag format partitions"
- depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST
---- a/drivers/mtd/parsers/Makefile
-+++ b/drivers/mtd/parsers/Makefile
-@@ -4,6 +4,8 @@ obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm4
- obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
- obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
-+ofpart-y += ofpart_core.o
-+ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o
- obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
---- /dev/null
-+++ b/drivers/mtd/parsers/ofpart_bcm4908.c
-@@ -0,0 +1,64 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/of.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/slab.h>
-+#include <linux/mtd/partitions.h>
-+
-+#include "ofpart_bcm4908.h"
-+
-+#define BLPARAMS_FW_OFFSET "NAND_RFS_OFS"
-+
-+static long long bcm4908_partitions_fw_offset(void)
-+{
-+ struct device_node *root;
-+ struct property *prop;
-+ const char *s;
-+
-+ root = of_find_node_by_path("/");
-+ if (!root)
-+ return -ENOENT;
-+
-+ of_property_for_each_string(root, "brcm_blparms", prop, s) {
-+ size_t len = strlen(BLPARAMS_FW_OFFSET);
-+ unsigned long offset;
-+ int err;
-+
-+ if (strncmp(s, BLPARAMS_FW_OFFSET, len) || s[len] != '=')
-+ continue;
-+
-+ err = kstrtoul(s + len + 1, 0, &offset);
-+ if (err) {
-+ pr_err("failed to parse %s\n", s + len + 1);
-+ return err;
-+ }
-+
-+ return offset << 10;
-+ }
-+
-+ return -ENOENT;
-+}
-+
-+int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts)
-+{
-+ long long fw_offset;
-+ int i;
-+
-+ fw_offset = bcm4908_partitions_fw_offset();
-+
-+ for (i = 0; i < nr_parts; i++) {
-+ if (of_device_is_compatible(parts[i].of_node, "brcm,bcm4908-firmware")) {
-+ if (fw_offset < 0 || parts[i].offset == fw_offset)
-+ parts[i].name = "firmware";
-+ else
-+ parts[i].name = "backup";
-+ }
-+ }
-+
-+ return 0;
-+}
---- /dev/null
-+++ b/drivers/mtd/parsers/ofpart_bcm4908.h
-@@ -0,0 +1,15 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+#ifndef __BCM4908_PARTITIONS_H
-+#define __BCM4908_PARTITIONS_H
-+
-+#ifdef CONFIG_MTD_OF_PARTS_BCM4908
-+int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts);
-+#else
-+static inline int bcm4908_partitions_post_parse(struct mtd_info *mtd, struct mtd_partition *parts,
-+ int nr_parts)
-+{
-+ return -EOPNOTSUPP;
-+}
-+#endif
-+
-+#endif
---- a/drivers/mtd/parsers/ofpart.c
-+++ /dev/null
-@@ -1,236 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0-or-later
--/*
-- * Flash partitions described by the OF (or flattened) device tree
-- *
-- * Copyright © 2006 MontaVista Software Inc.
-- * Author: Vitaly Wool <vwool@ru.mvista.com>
-- *
-- * Revised to handle newer style flash binding by:
-- * Copyright © 2007 David Gibson, IBM Corporation.
-- */
--
--#include <linux/module.h>
--#include <linux/init.h>
--#include <linux/of.h>
--#include <linux/mtd/mtd.h>
--#include <linux/slab.h>
--#include <linux/mtd/partitions.h>
--
--static bool node_has_compatible(struct device_node *pp)
--{
-- return of_get_property(pp, "compatible", NULL);
--}
--
--static int parse_fixed_partitions(struct mtd_info *master,
-- const struct mtd_partition **pparts,
-- struct mtd_part_parser_data *data)
--{
-- struct mtd_partition *parts;
-- struct device_node *mtd_node;
-- struct device_node *ofpart_node;
-- const char *partname;
-- struct device_node *pp;
-- int nr_parts, i, ret = 0;
-- bool dedicated = true;
--
--
-- /* Pull of_node from the master device node */
-- mtd_node = mtd_get_of_node(master);
-- if (!mtd_node)
-- return 0;
--
-- ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-- if (!ofpart_node) {
-- /*
-- * We might get here even when ofpart isn't used at all (e.g.,
-- * when using another parser), so don't be louder than
-- * KERN_DEBUG
-- */
-- pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n",
-- master->name, mtd_node);
-- ofpart_node = mtd_node;
-- dedicated = false;
-- } else if (!of_device_is_compatible(ofpart_node, "fixed-partitions")) {
-- /* The 'partitions' subnode might be used by another parser */
-- return 0;
-- }
--
-- /* First count the subnodes */
-- nr_parts = 0;
-- for_each_child_of_node(ofpart_node, pp) {
-- if (!dedicated && node_has_compatible(pp))
-- continue;
--
-- nr_parts++;
-- }
--
-- if (nr_parts == 0)
-- return 0;
--
-- parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL);
-- if (!parts)
-- return -ENOMEM;
--
-- i = 0;
-- for_each_child_of_node(ofpart_node, pp) {
-- const __be32 *reg;
-- int len;
-- int a_cells, s_cells;
--
-- if (!dedicated && node_has_compatible(pp))
-- continue;
--
-- reg = of_get_property(pp, "reg", &len);
-- if (!reg) {
-- if (dedicated) {
-- pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
-- master->name, pp,
-- mtd_node);
-- goto ofpart_fail;
-- } else {
-- nr_parts--;
-- continue;
-- }
-- }
--
-- a_cells = of_n_addr_cells(pp);
-- s_cells = of_n_size_cells(pp);
-- if (len / 4 != a_cells + s_cells) {
-- pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
-- master->name, pp,
-- mtd_node);
-- goto ofpart_fail;
-- }
--
-- parts[i].offset = of_read_number(reg, a_cells);
-- parts[i].size = of_read_number(reg + a_cells, s_cells);
-- parts[i].of_node = pp;
--
-- partname = of_get_property(pp, "label", &len);
-- if (!partname)
-- partname = of_get_property(pp, "name", &len);
-- parts[i].name = partname;
--
-- if (of_get_property(pp, "read-only", &len))
-- parts[i].mask_flags |= MTD_WRITEABLE;
--
-- if (of_get_property(pp, "lock", &len))
-- parts[i].mask_flags |= MTD_POWERUP_LOCK;
--
-- i++;
-- }
--
-- if (!nr_parts)
-- goto ofpart_none;
--
-- *pparts = parts;
-- return nr_parts;
--
--ofpart_fail:
-- pr_err("%s: error parsing ofpart partition %pOF (%pOF)\n",
-- master->name, pp, mtd_node);
-- ret = -EINVAL;
--ofpart_none:
-- of_node_put(pp);
-- kfree(parts);
-- return ret;
--}
--
--static const struct of_device_id parse_ofpart_match_table[] = {
-- { .compatible = "fixed-partitions" },
-- {},
--};
--MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
--
--static struct mtd_part_parser ofpart_parser = {
-- .parse_fn = parse_fixed_partitions,
-- .name = "fixed-partitions",
-- .of_match_table = parse_ofpart_match_table,
--};
--
--static int parse_ofoldpart_partitions(struct mtd_info *master,
-- const struct mtd_partition **pparts,
-- struct mtd_part_parser_data *data)
--{
-- struct mtd_partition *parts;
-- struct device_node *dp;
-- int i, plen, nr_parts;
-- const struct {
-- __be32 offset, len;
-- } *part;
-- const char *names;
--
-- /* Pull of_node from the master device node */
-- dp = mtd_get_of_node(master);
-- if (!dp)
-- return 0;
--
-- part = of_get_property(dp, "partitions", &plen);
-- if (!part)
-- return 0; /* No partitions found */
--
-- pr_warn("Device tree uses obsolete partition map binding: %pOF\n", dp);
--
-- nr_parts = plen / sizeof(part[0]);
--
-- parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL);
-- if (!parts)
-- return -ENOMEM;
--
-- names = of_get_property(dp, "partition-names", &plen);
--
-- for (i = 0; i < nr_parts; i++) {
-- parts[i].offset = be32_to_cpu(part->offset);
-- parts[i].size = be32_to_cpu(part->len) & ~1;
-- /* bit 0 set signifies read only partition */
-- if (be32_to_cpu(part->len) & 1)
-- parts[i].mask_flags = MTD_WRITEABLE;
--
-- if (names && (plen > 0)) {
-- int len = strlen(names) + 1;
--
-- parts[i].name = names;
-- plen -= len;
-- names += len;
-- } else {
-- parts[i].name = "unnamed";
-- }
--
-- part++;
-- }
--
-- *pparts = parts;
-- return nr_parts;
--}
--
--static struct mtd_part_parser ofoldpart_parser = {
-- .parse_fn = parse_ofoldpart_partitions,
-- .name = "ofoldpart",
--};
--
--static int __init ofpart_parser_init(void)
--{
-- register_mtd_parser(&ofpart_parser);
-- register_mtd_parser(&ofoldpart_parser);
-- return 0;
--}
--
--static void __exit ofpart_parser_exit(void)
--{
-- deregister_mtd_parser(&ofpart_parser);
-- deregister_mtd_parser(&ofoldpart_parser);
--}
--
--module_init(ofpart_parser_init);
--module_exit(ofpart_parser_exit);
--
--MODULE_LICENSE("GPL");
--MODULE_DESCRIPTION("Parser for MTD partitioning information in device tree");
--MODULE_AUTHOR("Vitaly Wool, David Gibson");
--/*
-- * When MTD core cannot find the requested parser, it tries to load the module
-- * with the same name. Since we provide the ofoldpart parser, we should have
-- * the corresponding alias.
-- */
--MODULE_ALIAS("fixed-partitions");
--MODULE_ALIAS("ofoldpart");
---- /dev/null
-+++ b/drivers/mtd/parsers/ofpart_core.c
-@@ -0,0 +1,260 @@
-+// SPDX-License-Identifier: GPL-2.0-or-later
-+/*
-+ * Flash partitions described by the OF (or flattened) device tree
-+ *
-+ * Copyright © 2006 MontaVista Software Inc.
-+ * Author: Vitaly Wool <vwool@ru.mvista.com>
-+ *
-+ * Revised to handle newer style flash binding by:
-+ * Copyright © 2007 David Gibson, IBM Corporation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/of.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/slab.h>
-+#include <linux/mtd/partitions.h>
-+
-+#include "ofpart_bcm4908.h"
-+
-+struct fixed_partitions_quirks {
-+ int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts);
-+};
-+
-+struct fixed_partitions_quirks bcm4908_partitions_quirks = {
-+ .post_parse = bcm4908_partitions_post_parse,
-+};
-+
-+static const struct of_device_id parse_ofpart_match_table[];
-+
-+static bool node_has_compatible(struct device_node *pp)
-+{
-+ return of_get_property(pp, "compatible", NULL);
-+}
-+
-+static int parse_fixed_partitions(struct mtd_info *master,
-+ const struct mtd_partition **pparts,
-+ struct mtd_part_parser_data *data)
-+{
-+ const struct fixed_partitions_quirks *quirks;
-+ const struct of_device_id *of_id;
-+ struct mtd_partition *parts;
-+ struct device_node *mtd_node;
-+ struct device_node *ofpart_node;
-+ const char *partname;
-+ struct device_node *pp;
-+ int nr_parts, i, ret = 0;
-+ bool dedicated = true;
-+
-+ /* Pull of_node from the master device node */
-+ mtd_node = mtd_get_of_node(master);
-+ if (!mtd_node)
-+ return 0;
-+
-+ ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-+ if (!ofpart_node) {
-+ /*
-+ * We might get here even when ofpart isn't used at all (e.g.,
-+ * when using another parser), so don't be louder than
-+ * KERN_DEBUG
-+ */
-+ pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n",
-+ master->name, mtd_node);
-+ ofpart_node = mtd_node;
-+ dedicated = false;
-+ }
-+
-+ of_id = of_match_node(parse_ofpart_match_table, ofpart_node);
-+ if (dedicated && !of_id) {
-+ /* The 'partitions' subnode might be used by another parser */
-+ return 0;
-+ }
-+
-+ quirks = of_id ? of_id->data : NULL;
-+
-+ /* First count the subnodes */
-+ nr_parts = 0;
-+ for_each_child_of_node(ofpart_node, pp) {
-+ if (!dedicated && node_has_compatible(pp))
-+ continue;
-+
-+ nr_parts++;
-+ }
-+
-+ if (nr_parts == 0)
-+ return 0;
-+
-+ parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL);
-+ if (!parts)
-+ return -ENOMEM;
-+
-+ i = 0;
-+ for_each_child_of_node(ofpart_node, pp) {
-+ const __be32 *reg;
-+ int len;
-+ int a_cells, s_cells;
-+
-+ if (!dedicated && node_has_compatible(pp))
-+ continue;
-+
-+ reg = of_get_property(pp, "reg", &len);
-+ if (!reg) {
-+ if (dedicated) {
-+ pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
-+ master->name, pp,
-+ mtd_node);
-+ goto ofpart_fail;
-+ } else {
-+ nr_parts--;
-+ continue;
-+ }
-+ }
-+
-+ a_cells = of_n_addr_cells(pp);
-+ s_cells = of_n_size_cells(pp);
-+ if (len / 4 != a_cells + s_cells) {
-+ pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
-+ master->name, pp,
-+ mtd_node);
-+ goto ofpart_fail;
-+ }
-+
-+ parts[i].offset = of_read_number(reg, a_cells);
-+ parts[i].size = of_read_number(reg + a_cells, s_cells);
-+ parts[i].of_node = pp;
-+
-+ partname = of_get_property(pp, "label", &len);
-+ if (!partname)
-+ partname = of_get_property(pp, "name", &len);
-+ parts[i].name = partname;
-+
-+ if (of_get_property(pp, "read-only", &len))
-+ parts[i].mask_flags |= MTD_WRITEABLE;
-+
-+ if (of_get_property(pp, "lock", &len))
-+ parts[i].mask_flags |= MTD_POWERUP_LOCK;
-+
-+ i++;
-+ }
-+
-+ if (!nr_parts)
-+ goto ofpart_none;
-+
-+ if (quirks && quirks->post_parse)
-+ quirks->post_parse(master, parts, nr_parts);
-+
-+ *pparts = parts;
-+ return nr_parts;
-+
-+ofpart_fail:
-+ pr_err("%s: error parsing ofpart partition %pOF (%pOF)\n",
-+ master->name, pp, mtd_node);
-+ ret = -EINVAL;
-+ofpart_none:
-+ of_node_put(pp);
-+ kfree(parts);
-+ return ret;
-+}
-+
-+static const struct of_device_id parse_ofpart_match_table[] = {
-+ /* Generic */
-+ { .compatible = "fixed-partitions" },
-+ /* Customized */
-+ { .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, },
-+ {},
-+};
-+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
-+
-+static struct mtd_part_parser ofpart_parser = {
-+ .parse_fn = parse_fixed_partitions,
-+ .name = "fixed-partitions",
-+ .of_match_table = parse_ofpart_match_table,
-+};
-+
-+static int parse_ofoldpart_partitions(struct mtd_info *master,
-+ const struct mtd_partition **pparts,
-+ struct mtd_part_parser_data *data)
-+{
-+ struct mtd_partition *parts;
-+ struct device_node *dp;
-+ int i, plen, nr_parts;
-+ const struct {
-+ __be32 offset, len;
-+ } *part;
-+ const char *names;
-+
-+ /* Pull of_node from the master device node */
-+ dp = mtd_get_of_node(master);
-+ if (!dp)
-+ return 0;
-+
-+ part = of_get_property(dp, "partitions", &plen);
-+ if (!part)
-+ return 0; /* No partitions found */
-+
-+ pr_warn("Device tree uses obsolete partition map binding: %pOF\n", dp);
-+
-+ nr_parts = plen / sizeof(part[0]);
-+
-+ parts = kcalloc(nr_parts, sizeof(*parts), GFP_KERNEL);
-+ if (!parts)
-+ return -ENOMEM;
-+
-+ names = of_get_property(dp, "partition-names", &plen);
-+
-+ for (i = 0; i < nr_parts; i++) {
-+ parts[i].offset = be32_to_cpu(part->offset);
-+ parts[i].size = be32_to_cpu(part->len) & ~1;
-+ /* bit 0 set signifies read only partition */
-+ if (be32_to_cpu(part->len) & 1)
-+ parts[i].mask_flags = MTD_WRITEABLE;
-+
-+ if (names && (plen > 0)) {
-+ int len = strlen(names) + 1;
-+
-+ parts[i].name = names;
-+ plen -= len;
-+ names += len;
-+ } else {
-+ parts[i].name = "unnamed";
-+ }
-+
-+ part++;
-+ }
-+
-+ *pparts = parts;
-+ return nr_parts;
-+}
-+
-+static struct mtd_part_parser ofoldpart_parser = {
-+ .parse_fn = parse_ofoldpart_partitions,
-+ .name = "ofoldpart",
-+};
-+
-+static int __init ofpart_parser_init(void)
-+{
-+ register_mtd_parser(&ofpart_parser);
-+ register_mtd_parser(&ofoldpart_parser);
-+ return 0;
-+}
-+
-+static void __exit ofpart_parser_exit(void)
-+{
-+ deregister_mtd_parser(&ofpart_parser);
-+ deregister_mtd_parser(&ofoldpart_parser);
-+}
-+
-+module_init(ofpart_parser_init);
-+module_exit(ofpart_parser_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("Parser for MTD partitioning information in device tree");
-+MODULE_AUTHOR("Vitaly Wool, David Gibson");
-+/*
-+ * When MTD core cannot find the requested parser, it tries to load the module
-+ * with the same name. Since we provide the ofoldpart parser, we should have
-+ * the corresponding alias.
-+ */
-+MODULE_ALIAS("fixed-partitions");
-+MODULE_ALIAS("ofoldpart");
diff --git a/target/linux/generic/backport-5.4/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch b/target/linux/generic/backport-5.4/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch
deleted file mode 100644
index 35058adba7..0000000000
--- a/target/linux/generic/backport-5.4/404-v5.13-mtd-parsers-ofpart-limit-parsing-of-deprecated-DT-sy.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 2d751203aacf86a1b301a188d8551c7da91043ab Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 2 Mar 2021 20:00:12 +0100
-Subject: [PATCH] mtd: parsers: ofpart: limit parsing of deprecated DT syntax
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-For backward compatibility ofpart still supports the old syntax like:
-spi-flash@0 {
- compatible = "jedec,spi-nor";
- reg = <0x0>;
-
- partition@0 {
- label = "bootloader";
- reg = <0x0 0x100000>;
- };
-};
-(without "partitions" subnode).
-
-There is no reason however to support nested partitions without a clear
-"compatible" string like:
-partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- label = "bootloader";
- reg = <0x0 0x100000>;
-
- partition@0 {
- label = "config";
- reg = <0x80000 0x80000>;
- };
- };
-};
-(we never officially supported or documented that).
-
-Make sure ofpart doesn't attempt to parse above.
-
-Cc: Ansuel Smith <ansuelsmth@gmail.com>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210302190012.1255-1-zajec5@gmail.com
----
- drivers/mtd/parsers/ofpart_core.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/parsers/ofpart_core.c
-+++ b/drivers/mtd/parsers/ofpart_core.c
-@@ -53,7 +53,7 @@ static int parse_fixed_partitions(struct
- return 0;
-
- ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-- if (!ofpart_node) {
-+ if (!ofpart_node && !mtd_is_partition(master)) {
- /*
- * We might get here even when ofpart isn't used at all (e.g.,
- * when using another parser), so don't be louder than
-@@ -64,6 +64,8 @@ static int parse_fixed_partitions(struct
- ofpart_node = mtd_node;
- dedicated = false;
- }
-+ if (!ofpart_node)
-+ return 0;
-
- of_id = of_match_node(parse_ofpart_match_table, ofpart_node);
- if (dedicated && !of_id) {
diff --git a/target/linux/generic/backport-5.4/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch b/target/linux/generic/backport-5.4/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch
deleted file mode 100644
index f1b778a6e1..0000000000
--- a/target/linux/generic/backport-5.4/405-v5.13-mtd-parsers-ofpart-make-symbol-bcm4908_partitions_qu.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From b87b6d2d6f540e29c3f98e1572d64e560d73d6c1 Mon Sep 17 00:00:00 2001
-From: Wei Yongjun <weiyongjun1@huawei.com>
-Date: Thu, 4 Mar 2021 06:46:00 +0000
-Subject: [PATCH] mtd: parsers: ofpart: make symbol 'bcm4908_partitions_quirks'
- static
-
-The sparse tool complains as follows:
-
-drivers/mtd/parsers/ofpart_core.c:25:32: warning:
- symbol 'bcm4908_partitions_quirks' was not declared. Should it be static?
-
-This symbol is not used outside of ofpart_core.c, so this
-commit marks it static.
-
-Fixes: 457da931b608 ("mtd: parsers: ofpart: support BCM4908 fixed partitions")
-Reported-by: Hulk Robot <hulkci@huawei.com>
-Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210304064600.3279138-1-weiyongjun1@huawei.com
----
- drivers/mtd/parsers/ofpart_core.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/parsers/ofpart_core.c
-+++ b/drivers/mtd/parsers/ofpart_core.c
-@@ -22,7 +22,7 @@ struct fixed_partitions_quirks {
- int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts);
- };
-
--struct fixed_partitions_quirks bcm4908_partitions_quirks = {
-+static struct fixed_partitions_quirks bcm4908_partitions_quirks = {
- .post_parse = bcm4908_partitions_post_parse,
- };
-
diff --git a/target/linux/generic/backport-5.4/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch b/target/linux/generic/backport-5.4/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch
deleted file mode 100644
index ecea743d87..0000000000
--- a/target/linux/generic/backport-5.4/406-v5.13-0001-mtd-core-add-nvmem-cells-compatible-to-parse-mtd-as-.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 658c4448bbbf02a143abf1b89d09a3337ebd3ba6 Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Fri, 12 Mar 2021 07:28:19 +0100
-Subject: [PATCH] mtd: core: add nvmem-cells compatible to parse mtd as nvmem
- cells
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Partitions that contains the nvmem-cells compatible will register
-their direct subonodes as nvmem cells and the node will be treated as a
-nvmem provider.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
-Tested-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210312062830.20548-1-ansuelsmth@gmail.com
----
- drivers/mtd/mtdcore.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -559,6 +559,7 @@ static int mtd_nvmem_reg_read(void *priv
-
- static int mtd_nvmem_add(struct mtd_info *mtd)
- {
-+ struct device_node *node = mtd_get_of_node(mtd);
- struct nvmem_config config = {};
-
- config.id = -1;
-@@ -571,7 +572,7 @@ static int mtd_nvmem_add(struct mtd_info
- config.stride = 1;
- config.read_only = true;
- config.root_only = true;
-- config.no_of_node = true;
-+ config.no_of_node = !of_device_is_compatible(node, "nvmem-cells");
- config.priv = mtd;
-
- mtd->nvmem = nvmem_register(&config);
diff --git a/target/linux/generic/backport-5.4/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch b/target/linux/generic/backport-5.4/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch
deleted file mode 100644
index c0515bd571..0000000000
--- a/target/linux/generic/backport-5.4/406-v5.13-0002-dt-bindings-nvmem-drop-nodename-restriction.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 52981a0fa9f7d68641e0e6bb584054c6d9eb2056 Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Fri, 12 Mar 2021 07:28:20 +0100
-Subject: [PATCH] dt-bindings: nvmem: drop $nodename restriction
-
-Drop $nodename restriction as now mtd partition can also be used as
-nvmem provider.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
-Reviewed-by: Rob Herring <robh@kernel.org>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210312062830.20548-2-ansuelsmth@gmail.com
----
- Documentation/devicetree/bindings/nvmem/nvmem.yaml | 3 ---
- 1 file changed, 3 deletions(-)
-
---- a/Documentation/devicetree/bindings/nvmem/nvmem.yaml
-+++ b/Documentation/devicetree/bindings/nvmem/nvmem.yaml
-@@ -20,9 +20,6 @@ description: |
- storage device.
-
- properties:
-- $nodename:
-- pattern: "^(eeprom|efuse|nvram)(@.*|-[0-9a-f])*$"
--
- "#address-cells":
- const: 1
-
diff --git a/target/linux/generic/backport-5.4/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch b/target/linux/generic/backport-5.4/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch
deleted file mode 100644
index 552919f587..0000000000
--- a/target/linux/generic/backport-5.4/406-v5.13-0003-dt-bindings-mtd-Document-use-of-nvmem-cells-compatib.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From ac42c46f983e4a9003a7bb91ad44a23ab7b8f534 Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Fri, 12 Mar 2021 07:28:21 +0100
-Subject: [PATCH] dt-bindings: mtd: Document use of nvmem-cells compatible
-
-Document nvmem-cells compatible used to treat mtd partitions as a
-nvmem provider.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
-Reviewed-by: Rob Herring <robh@kernel.org>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210312062830.20548-3-ansuelsmth@gmail.com
----
- .../bindings/mtd/partitions/nvmem-cells.yaml | 99 +++++++++++++++++++
- 1 file changed, 99 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/partitions/nvmem-cells.yaml
-@@ -0,0 +1,99 @@
-+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/mtd/partitions/nvmem-cells.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Nvmem cells
-+
-+description: |
-+ Any partition containing the compatible "nvmem-cells" will register as a
-+ nvmem provider.
-+ Each direct subnodes represents a nvmem cell following the nvmem binding.
-+ Nvmem binding to declare nvmem-cells can be found in:
-+ Documentation/devicetree/bindings/nvmem/nvmem.yaml
-+
-+maintainers:
-+ - Ansuel Smith <ansuelsmth@gmail.com>
-+
-+allOf:
-+ - $ref: /schemas/nvmem/nvmem.yaml#
-+
-+properties:
-+ compatible:
-+ const: nvmem-cells
-+
-+required:
-+ - compatible
-+
-+additionalProperties: true
-+
-+examples:
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ /* ... */
-+
-+ };
-+ art: art@1200000 {
-+ compatible = "nvmem-cells";
-+ reg = <0x1200000 0x0140000>;
-+ label = "art";
-+ read-only;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ macaddr_gmac1: macaddr_gmac1@0 {
-+ reg = <0x0 0x6>;
-+ };
-+
-+ macaddr_gmac2: macaddr_gmac2@6 {
-+ reg = <0x6 0x6>;
-+ };
-+
-+ pre_cal_24g: pre_cal_24g@1000 {
-+ reg = <0x1000 0x2f20>;
-+ };
-+
-+ pre_cal_5g: pre_cal_5g@5000{
-+ reg = <0x5000 0x2f20>;
-+ };
-+ };
-+ - |
-+ partitions {
-+ compatible = "fixed-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "bootloader";
-+ reg = <0x000000 0x100000>;
-+ read-only;
-+ };
-+
-+ firmware@100000 {
-+ compatible = "brcm,trx";
-+ label = "firmware";
-+ reg = <0x100000 0xe00000>;
-+ };
-+
-+ calibration@f00000 {
-+ compatible = "nvmem-cells";
-+ label = "calibration";
-+ reg = <0xf00000 0x100000>;
-+ ranges = <0 0xf00000 0x100000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ wifi0@0 {
-+ reg = <0x000000 0x080000>;
-+ };
-+
-+ wifi1@80000 {
-+ reg = <0x080000 0x080000>;
-+ };
-+ };
-+ };
diff --git a/target/linux/generic/backport-5.4/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch b/target/linux/generic/backport-5.4/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch
deleted file mode 100644
index 35a4afd67b..0000000000
--- a/target/linux/generic/backport-5.4/407-v5.13-0001-dt-bindings-mtd-add-binding-for-Linksys-Northstar-pa.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From 2fa7294175c76e1ec568aa75c1891fd908728c8d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Fri, 12 Mar 2021 14:49:18 +0100
-Subject: [PATCH] dt-bindings: mtd: add binding for Linksys Northstar
- partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Linksys on Broadcom Northstar devices uses fixed flash layout with
-multiple firmware partitions.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Rob Herring <robh@kernel.org>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-1-zajec5@gmail.com
----
- .../mtd/partitions/linksys,ns-partitions.yaml | 74 +++++++++++++++++++
- 1 file changed, 74 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/partitions/linksys,ns-partitions.yaml
-@@ -0,0 +1,74 @@
-+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/mtd/partitions/linksys,ns-partitions.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Linksys Northstar partitioning
-+
-+description: |
-+ Linksys devices based on Broadcom Northstar architecture often use two
-+ firmware partitions. One is used for regular booting, the other is treated as
-+ fallback.
-+
-+ This binding allows defining all fixed partitions and marking those containing
-+ firmware. System can use that information e.g. for booting or flashing
-+ purposes.
-+
-+maintainers:
-+ - Rafał Miłecki <rafal@milecki.pl>
-+
-+properties:
-+ compatible:
-+ const: linksys,ns-partitions
-+
-+ "#address-cells":
-+ enum: [ 1, 2 ]
-+
-+ "#size-cells":
-+ enum: [ 1, 2 ]
-+
-+patternProperties:
-+ "^partition@[0-9a-f]+$":
-+ $ref: "partition.yaml#"
-+ properties:
-+ compatible:
-+ items:
-+ - const: linksys,ns-firmware
-+ - const: brcm,trx
-+ unevaluatedProperties: false
-+
-+required:
-+ - "#address-cells"
-+ - "#size-cells"
-+
-+additionalProperties: false
-+
-+examples:
-+ - |
-+ partitions {
-+ compatible = "linksys,ns-partitions";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ partition@0 {
-+ label = "boot";
-+ reg = <0x0 0x100000>;
-+ read-only;
-+ };
-+
-+ partition@100000 {
-+ label = "nvram";
-+ reg = <0x100000 0x100000>;
-+ };
-+
-+ partition@200000 {
-+ compatible = "linksys,ns-firmware", "brcm,trx";
-+ reg = <0x200000 0xf00000>;
-+ };
-+
-+ partition@1100000 {
-+ compatible = "linksys,ns-firmware", "brcm,trx";
-+ reg = <0x1100000 0xf00000>;
-+ };
-+ };
diff --git a/target/linux/generic/backport-5.4/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch b/target/linux/generic/backport-5.4/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch
deleted file mode 100644
index 75eb9391ae..0000000000
--- a/target/linux/generic/backport-5.4/407-v5.13-0002-mtd-parsers-ofpart-support-Linksys-Northstar-partiti.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-From 7134a2d026d942210b4d26d6059c9d979ca7866e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Fri, 12 Mar 2021 14:49:19 +0100
-Subject: [PATCH] mtd: parsers: ofpart: support Linksys Northstar partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This allows extending ofpart parser with support for Linksys Northstar
-devices. That support uses recently added quirks mechanism.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-Link: https://lore.kernel.org/linux-mtd/20210312134919.7767-2-zajec5@gmail.com
----
- drivers/mtd/parsers/Kconfig | 10 +++++
- drivers/mtd/parsers/Makefile | 1 +
- drivers/mtd/parsers/ofpart_core.c | 6 +++
- drivers/mtd/parsers/ofpart_linksys_ns.c | 50 +++++++++++++++++++++++++
- drivers/mtd/parsers/ofpart_linksys_ns.h | 18 +++++++++
- 5 files changed, 85 insertions(+)
- create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.c
- create mode 100644 drivers/mtd/parsers/ofpart_linksys_ns.h
-
---- a/drivers/mtd/parsers/Kconfig
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -76,6 +76,16 @@ config MTD_OF_PARTS_BCM4908
- that can have multiple "firmware" partitions. It takes care of
- finding currently used one and backup ones.
-
-+config MTD_OF_PARTS_LINKSYS_NS
-+ bool "Linksys Northstar partitioning support"
-+ depends on MTD_OF_PARTS && (ARCH_BCM_5301X || ARCH_BCM4908 || COMPILE_TEST)
-+ default ARCH_BCM_5301X
-+ help
-+ This provides partitions parser for Linksys devices based on Broadcom
-+ Northstar architecture. Linksys commonly uses fixed flash layout with
-+ two "firmware" partitions. Currently used firmware has to be detected
-+ using CFE environment variable.
-+
- config MTD_PARSER_IMAGETAG
- tristate "Parser for BCM963XX Image Tag format partitions"
- depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST
---- a/drivers/mtd/parsers/Makefile
-+++ b/drivers/mtd/parsers/Makefile
-@@ -6,6 +6,7 @@ obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdl
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
- ofpart-y += ofpart_core.o
- ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o
-+ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o
- obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o
- obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
---- a/drivers/mtd/parsers/ofpart_core.c
-+++ b/drivers/mtd/parsers/ofpart_core.c
-@@ -17,6 +17,7 @@
- #include <linux/mtd/partitions.h>
-
- #include "ofpart_bcm4908.h"
-+#include "ofpart_linksys_ns.h"
-
- struct fixed_partitions_quirks {
- int (*post_parse)(struct mtd_info *mtd, struct mtd_partition *parts, int nr_parts);
-@@ -26,6 +27,10 @@ static struct fixed_partitions_quirks bc
- .post_parse = bcm4908_partitions_post_parse,
- };
-
-+static struct fixed_partitions_quirks linksys_ns_partitions_quirks = {
-+ .post_parse = linksys_ns_partitions_post_parse,
-+};
-+
- static const struct of_device_id parse_ofpart_match_table[];
-
- static bool node_has_compatible(struct device_node *pp)
-@@ -164,6 +169,7 @@ static const struct of_device_id parse_o
- { .compatible = "fixed-partitions" },
- /* Customized */
- { .compatible = "brcm,bcm4908-partitions", .data = &bcm4908_partitions_quirks, },
-+ { .compatible = "linksys,ns-partitions", .data = &linksys_ns_partitions_quirks, },
- {},
- };
- MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
---- /dev/null
-+++ b/drivers/mtd/parsers/ofpart_linksys_ns.c
-@@ -0,0 +1,50 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl>
-+ */
-+
-+#include <linux/bcm47xx_nvram.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+
-+#include "ofpart_linksys_ns.h"
-+
-+#define NVRAM_BOOT_PART "bootpartition"
-+
-+static int ofpart_linksys_ns_bootpartition(void)
-+{
-+ char buf[4];
-+ int bootpartition;
-+
-+ /* Check CFE environment variable */
-+ if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) {
-+ if (!kstrtoint(buf, 0, &bootpartition))
-+ return bootpartition;
-+ pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART,
-+ buf);
-+ } else {
-+ pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART);
-+ }
-+
-+ return 0;
-+}
-+
-+int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
-+ struct mtd_partition *parts,
-+ int nr_parts)
-+{
-+ int bootpartition = ofpart_linksys_ns_bootpartition();
-+ int trx_idx = 0;
-+ int i;
-+
-+ for (i = 0; i < nr_parts; i++) {
-+ if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) {
-+ if (trx_idx++ == bootpartition)
-+ parts[i].name = "firmware";
-+ else
-+ parts[i].name = "backup";
-+ }
-+ }
-+
-+ return 0;
-+}
---- /dev/null
-+++ b/drivers/mtd/parsers/ofpart_linksys_ns.h
-@@ -0,0 +1,18 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+#ifndef __OFPART_LINKSYS_NS_H
-+#define __OFPART_LINKSYS_NS_H
-+
-+#ifdef CONFIG_MTD_OF_PARTS_LINKSYS_NS
-+int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
-+ struct mtd_partition *parts,
-+ int nr_parts);
-+#else
-+static inline int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
-+ struct mtd_partition *parts,
-+ int nr_parts)
-+{
-+ return -EOPNOTSUPP;
-+}
-+#endif
-+
-+#endif
diff --git a/target/linux/generic/backport-5.4/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch b/target/linux/generic/backport-5.4/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch
deleted file mode 100644
index 3af641e62e..0000000000
--- a/target/linux/generic/backport-5.4/408-v5.13-mtd-cfi_cmdset_0002-Disable-buffered-writes-for-AMD.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 7e4404113686868858a34210c28ae122e967aa64 Mon Sep 17 00:00:00 2001
-From: Mauri Sandberg <sandberg@mailfence.com>
-Date: Tue, 9 Mar 2021 19:48:59 +0200
-Subject: [PATCH] mtd: cfi_cmdset_0002: Disable buffered writes for AMD chip
- 0x2201
-
-Buffer writes do not work with AMD chip 0x2201. The chip in question
-is a AMD/Spansion/Cypress Semiconductor S29GL256N and datasheet [1]
-talks about writing buffers being possible. While waiting for a neater
-solution resort to writing word-sized chunks only.
-
-Without the patch kernel logs will be flooded with entries like below:
-
-jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
-jffs2_build_filesystem(): unlocking the mtd device...
-done.
-jffs2_build_filesystem(): erasing all blocks after the end marker...
-MTD do_write_buffer_wait(): software timeout, address:0x01ec000a.
-jffs2: Write clean marker to block at 0x01920000 failed: -5
-MTD do_write_buffer_wait(): software timeout, address:0x01e2000a.
-jffs2: Write clean marker to block at 0x01880000 failed: -5
-MTD do_write_buffer_wait(): software timeout, address:0x01e0000a.
-jffs2: Write clean marker to block at 0x01860000 failed: -5
-MTD do_write_buffer_wait(): software timeout, address:0x01dc000a.
-jffs2: Write clean marker to block at 0x01820000 failed: -5
-MTD do_write_buffer_wait(): software timeout, address:0x01da000a.
-jffs2: Write clean marker to block at 0x01800000 failed: -5
-...
-
-Tested on a Buffalo wzr-hp-g300nh running kernel 5.10.16.
-
-[1] https://www.cypress.com/file/219941/download
-or https://datasheetspdf.com/pdf-file/565708/SPANSION/S29GL256N/1
-
-Signed-off-by: Mauri Sandberg <sandberg@mailfence.com>
-Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
-Link: https://lore.kernel.org/r/20210309174859.362060-1-sandberg@mailfence.com
----
- drivers/mtd/chips/cfi_cmdset_0002.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -272,6 +272,10 @@ static void fixup_use_write_buffers(stru
- {
- struct map_info *map = mtd->priv;
- struct cfi_private *cfi = map->fldrv_priv;
-+
-+ if (cfi->mfr == CFI_MFR_AMD && cfi->id == 0x2201)
-+ return;
-+
- if (cfi->cfiq->BufWriteTimeoutTyp) {
- pr_debug("Using buffer write method\n");
- mtd->_write = cfi_amdstd_write_buffers;
diff --git a/target/linux/generic/backport-5.4/410-mtd-fix-calculating-partition-end-address.patch b/target/linux/generic/backport-5.4/410-mtd-fix-calculating-partition-end-address.patch
deleted file mode 100644
index 1eae015b28..0000000000
--- a/target/linux/generic/backport-5.4/410-mtd-fix-calculating-partition-end-address.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 9 Mar 2020 08:30:19 +0100
-Subject: [PATCH] mtd: fix calculating partition end address
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This fixes check for partitions that don't start at beginning of their
-parents. Missing partition's offset in formula could result in forcing
-read-only incorrectly.
-
-Fixes: 6750f61a13a0 ("mtd: improve calculating partition boundaries when checking for alignment")
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
----
- drivers/mtd/mtdpart.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -524,7 +524,7 @@ static struct mtd_part *allocate_partiti
- part->name);
- }
-
-- tmp = part_absolute_offset(parent) + slave->mtd.size;
-+ tmp = part_absolute_offset(parent) + slave->offset + slave->mtd.size;
- remainder = do_div(tmp, wr_alignment);
- if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
- slave->mtd.flags &= ~MTD_WRITEABLE;
diff --git a/target/linux/generic/backport-5.4/500-v5.13-ubifs-default-to-zstd-compression.patch b/target/linux/generic/backport-5.4/500-v5.13-ubifs-default-to-zstd-compression.patch
deleted file mode 100644
index dd50c19c27..0000000000
--- a/target/linux/generic/backport-5.4/500-v5.13-ubifs-default-to-zstd-compression.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From dcdf415b740923530dc71d89fecc8361078473f5 Mon Sep 17 00:00:00 2001
-From: Rui Salvaterra <rsalvaterra@gmail.com>
-Date: Mon, 5 Apr 2021 16:11:55 +0100
-Subject: [PATCH] ubifs: default to zstd compression
-
-Compared to lzo and zlib, zstd is the best all-around performer, both in terms
-of speed and compression ratio. Set it as the default, if available.
-
-Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
----
- fs/ubifs/sb.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/fs/ubifs/sb.c
-+++ b/fs/ubifs/sb.c
-@@ -53,6 +53,9 @@
-
- static int get_default_compressor(struct ubifs_info *c)
- {
-+ if (ubifs_compr_present(c, UBIFS_COMPR_ZSTD))
-+ return UBIFS_COMPR_ZSTD;
-+
- if (ubifs_compr_present(c, UBIFS_COMPR_LZO))
- return UBIFS_COMPR_LZO;
-
diff --git a/target/linux/generic/backport-5.4/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch b/target/linux/generic/backport-5.4/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch
deleted file mode 100644
index 35aeb96251..0000000000
--- a/target/linux/generic/backport-5.4/600-v5.12-net-extract-napi-poll-functionality-to-__napi_poll.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 8 Feb 2021 11:34:08 -0800
-Subject: [PATCH] net: extract napi poll functionality to __napi_poll()
-
-This commit introduces a new function __napi_poll() which does the main
-logic of the existing napi_poll() function, and will be called by other
-functions in later commits.
-This idea and implementation is done by Felix Fietkau <nbd@nbd.name> and
-is proposed as part of the patch to move napi work to work_queue
-context.
-This commit by itself is a code restructure.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Wei Wang <weiwan@google.com>
-Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -6325,15 +6325,10 @@ void netif_napi_del(struct napi_struct *
- }
- EXPORT_SYMBOL(netif_napi_del);
-
--static int napi_poll(struct napi_struct *n, struct list_head *repoll)
-+static int __napi_poll(struct napi_struct *n, bool *repoll)
- {
-- void *have;
- int work, weight;
-
-- list_del_init(&n->poll_list);
--
-- have = netpoll_poll_lock(n);
--
- weight = n->weight;
-
- /* This NAPI_STATE_SCHED test is for avoiding a race
-@@ -6351,7 +6346,7 @@ static int napi_poll(struct napi_struct
- WARN_ON_ONCE(work > weight);
-
- if (likely(work < weight))
-- goto out_unlock;
-+ return work;
-
- /* Drivers must not modify the NAPI state if they
- * consume the entire weight. In such cases this code
-@@ -6360,7 +6355,7 @@ static int napi_poll(struct napi_struct
- */
- if (unlikely(napi_disable_pending(n))) {
- napi_complete(n);
-- goto out_unlock;
-+ return work;
- }
-
- if (n->gro_bitmask) {
-@@ -6378,12 +6373,29 @@ static int napi_poll(struct napi_struct
- if (unlikely(!list_empty(&n->poll_list))) {
- pr_warn_once("%s: Budget exhausted after napi rescheduled\n",
- n->dev ? n->dev->name : "backlog");
-- goto out_unlock;
-+ return work;
- }
-
-- list_add_tail(&n->poll_list, repoll);
-+ *repoll = true;
-+
-+ return work;
-+}
-+
-+static int napi_poll(struct napi_struct *n, struct list_head *repoll)
-+{
-+ bool do_repoll = false;
-+ void *have;
-+ int work;
-+
-+ list_del_init(&n->poll_list);
-+
-+ have = netpoll_poll_lock(n);
-+
-+ work = __napi_poll(n, &do_repoll);
-+
-+ if (do_repoll)
-+ list_add_tail(&n->poll_list, repoll);
-
--out_unlock:
- netpoll_poll_unlock(have);
-
- return work;
diff --git a/target/linux/generic/backport-5.4/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch b/target/linux/generic/backport-5.4/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch
deleted file mode 100644
index 0c548f331a..0000000000
--- a/target/linux/generic/backport-5.4/601-v5.12-net-implement-threaded-able-napi-poll-loop-support.patch
+++ /dev/null
@@ -1,261 +0,0 @@
-From: Wei Wang <weiwan@google.com>
-Date: Mon, 8 Feb 2021 11:34:09 -0800
-Subject: [PATCH] net: implement threaded-able napi poll loop support
-
-This patch allows running each napi poll loop inside its own
-kernel thread.
-The kthread is created during netif_napi_add() if dev->threaded
-is set. And threaded mode is enabled in napi_enable(). We will
-provide a way to set dev->threaded and enable threaded mode
-without a device up/down in the following patch.
-
-Once that threaded mode is enabled and the kthread is
-started, napi_schedule() will wake-up such thread instead
-of scheduling the softirq.
-
-The threaded poll loop behaves quite likely the net_rx_action,
-but it does not have to manipulate local irqs and uses
-an explicit scheduling point based on netdev_budget.
-
-Co-developed-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Co-developed-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
-Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
-Co-developed-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Wei Wang <weiwan@google.com>
-Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -340,6 +340,7 @@ struct napi_struct {
- struct list_head dev_list;
- struct hlist_node napi_hash_node;
- unsigned int napi_id;
-+ struct task_struct *thread;
- };
-
- enum {
-@@ -350,6 +351,7 @@ enum {
- NAPI_STATE_HASHED, /* In NAPI hash (busy polling possible) */
- NAPI_STATE_NO_BUSY_POLL,/* Do not add in napi_hash, no busy polling */
- NAPI_STATE_IN_BUSY_POLL,/* sk_busy_loop() owns this NAPI */
-+ NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
- };
-
- enum {
-@@ -360,6 +362,7 @@ enum {
- NAPIF_STATE_HASHED = BIT(NAPI_STATE_HASHED),
- NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL),
- NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL),
-+ NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED),
- };
-
- enum gro_result {
-@@ -504,20 +507,7 @@ bool napi_hash_del(struct napi_struct *n
- */
- void napi_disable(struct napi_struct *n);
-
--/**
-- * napi_enable - enable NAPI scheduling
-- * @n: NAPI context
-- *
-- * Resume NAPI from being scheduled on this context.
-- * Must be paired with napi_disable.
-- */
--static inline void napi_enable(struct napi_struct *n)
--{
-- BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
-- smp_mb__before_atomic();
-- clear_bit(NAPI_STATE_SCHED, &n->state);
-- clear_bit(NAPI_STATE_NPSVC, &n->state);
--}
-+void napi_enable(struct napi_struct *n);
-
- /**
- * napi_synchronize - wait until NAPI is not running
-@@ -1783,6 +1773,8 @@ enum netdev_ml_priv_type {
- *
- * @wol_enabled: Wake-on-LAN is enabled
- *
-+ * @threaded: napi threaded mode is enabled
-+ *
- * FIXME: cleanup struct net_device such that network protocol info
- * moves out.
- */
-@@ -2075,6 +2067,7 @@ struct net_device {
- struct lock_class_key addr_list_lock_key;
- bool proto_down;
- unsigned wol_enabled:1;
-+ unsigned threaded:1;
- };
- #define to_net_dev(d) container_of(d, struct net_device, dev)
-
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -91,6 +91,7 @@
- #include <linux/etherdevice.h>
- #include <linux/ethtool.h>
- #include <linux/skbuff.h>
-+#include <linux/kthread.h>
- #include <linux/bpf.h>
- #include <linux/bpf_trace.h>
- #include <net/net_namespace.h>
-@@ -1289,6 +1290,27 @@ void netdev_notify_peers(struct net_devi
- }
- EXPORT_SYMBOL(netdev_notify_peers);
-
-+static int napi_threaded_poll(void *data);
-+
-+static int napi_kthread_create(struct napi_struct *n)
-+{
-+ int err = 0;
-+
-+ /* Create and wake up the kthread once to put it in
-+ * TASK_INTERRUPTIBLE mode to avoid the blocked task
-+ * warning and work with loadavg.
-+ */
-+ n->thread = kthread_run(napi_threaded_poll, n, "napi/%s-%d",
-+ n->dev->name, n->napi_id);
-+ if (IS_ERR(n->thread)) {
-+ err = PTR_ERR(n->thread);
-+ pr_err("kthread_run failed with err %d\n", err);
-+ n->thread = NULL;
-+ }
-+
-+ return err;
-+}
-+
- static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
- {
- const struct net_device_ops *ops = dev->netdev_ops;
-@@ -3888,6 +3910,21 @@ int gro_normal_batch __read_mostly = 8;
- static inline void ____napi_schedule(struct softnet_data *sd,
- struct napi_struct *napi)
- {
-+ struct task_struct *thread;
-+
-+ if (test_bit(NAPI_STATE_THREADED, &napi->state)) {
-+ /* Paired with smp_mb__before_atomic() in
-+ * napi_enable(). Use READ_ONCE() to guarantee
-+ * a complete read on napi->thread. Only call
-+ * wake_up_process() when it's not NULL.
-+ */
-+ thread = READ_ONCE(napi->thread);
-+ if (thread) {
-+ wake_up_process(thread);
-+ return;
-+ }
-+ }
-+
- list_add_tail(&napi->poll_list, &sd->poll_list);
- __raise_softirq_irqoff(NET_RX_SOFTIRQ);
- }
-@@ -6279,6 +6316,12 @@ void netif_napi_add(struct net_device *d
- set_bit(NAPI_STATE_NPSVC, &napi->state);
- list_add_rcu(&napi->dev_list, &dev->napi_list);
- napi_hash_add(napi);
-+ /* Create kthread for this napi if dev->threaded is set.
-+ * Clear dev->threaded if kthread creation failed so that
-+ * threaded mode will not be enabled in napi_enable().
-+ */
-+ if (dev->threaded && napi_kthread_create(napi))
-+ dev->threaded = 0;
- }
- EXPORT_SYMBOL(netif_napi_add);
-
-@@ -6295,9 +6338,28 @@ void napi_disable(struct napi_struct *n)
- hrtimer_cancel(&n->timer);
-
- clear_bit(NAPI_STATE_DISABLE, &n->state);
-+ clear_bit(NAPI_STATE_THREADED, &n->state);
- }
- EXPORT_SYMBOL(napi_disable);
-
-+/**
-+ * napi_enable - enable NAPI scheduling
-+ * @n: NAPI context
-+ *
-+ * Resume NAPI from being scheduled on this context.
-+ * Must be paired with napi_disable.
-+ */
-+void napi_enable(struct napi_struct *n)
-+{
-+ BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
-+ smp_mb__before_atomic();
-+ clear_bit(NAPI_STATE_SCHED, &n->state);
-+ clear_bit(NAPI_STATE_NPSVC, &n->state);
-+ if (n->dev->threaded && n->thread)
-+ set_bit(NAPI_STATE_THREADED, &n->state);
-+}
-+EXPORT_SYMBOL(napi_enable);
-+
- static void flush_gro_hash(struct napi_struct *napi)
- {
- int i;
-@@ -6322,6 +6384,11 @@ void netif_napi_del(struct napi_struct *
-
- flush_gro_hash(napi);
- napi->gro_bitmask = 0;
-+
-+ if (napi->thread) {
-+ kthread_stop(napi->thread);
-+ napi->thread = NULL;
-+ }
- }
- EXPORT_SYMBOL(netif_napi_del);
-
-@@ -6401,6 +6468,51 @@ static int napi_poll(struct napi_struct
- return work;
- }
-
-+static int napi_thread_wait(struct napi_struct *napi)
-+{
-+ set_current_state(TASK_INTERRUPTIBLE);
-+
-+ while (!kthread_should_stop() && !napi_disable_pending(napi)) {
-+ if (test_bit(NAPI_STATE_SCHED, &napi->state)) {
-+ WARN_ON(!list_empty(&napi->poll_list));
-+ __set_current_state(TASK_RUNNING);
-+ return 0;
-+ }
-+
-+ schedule();
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ }
-+ __set_current_state(TASK_RUNNING);
-+ return -1;
-+}
-+
-+static int napi_threaded_poll(void *data)
-+{
-+ struct napi_struct *napi = data;
-+ void *have;
-+
-+ while (!napi_thread_wait(napi)) {
-+ for (;;) {
-+ bool repoll = false;
-+
-+ local_bh_disable();
-+
-+ have = netpoll_poll_lock(napi);
-+ __napi_poll(napi, &repoll);
-+ netpoll_poll_unlock(have);
-+
-+ __kfree_skb_flush();
-+ local_bh_enable();
-+
-+ if (!repoll)
-+ break;
-+
-+ cond_resched();
-+ }
-+ }
-+ return 0;
-+}
-+
- static __latent_entropy void net_rx_action(struct softirq_action *h)
- {
- struct softnet_data *sd = this_cpu_ptr(&softnet_data);
diff --git a/target/linux/generic/backport-5.4/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch b/target/linux/generic/backport-5.4/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch
deleted file mode 100644
index bdc34a15ea..0000000000
--- a/target/linux/generic/backport-5.4/602-v5.12-net-add-sysfs-attribute-to-control-napi-threaded-mod.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From: Wei Wang <weiwan@google.com>
-Date: Mon, 8 Feb 2021 11:34:10 -0800
-Subject: [PATCH] net: add sysfs attribute to control napi threaded mode
-
-This patch adds a new sysfs attribute to the network device class.
-Said attribute provides a per-device control to enable/disable the
-threaded mode for all the napi instances of the given network device,
-without the need for a device up/down.
-User sets it to 1 or 0 to enable or disable threaded mode.
-Note: when switching between threaded and the current softirq based mode
-for a napi instance, it will not immediately take effect if the napi is
-currently being polled. The mode switch will happen for the next time
-napi_schedule() is called.
-
-Co-developed-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Co-developed-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
-Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
-Co-developed-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Wei Wang <weiwan@google.com>
-Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/Documentation/ABI/testing/sysfs-class-net
-+++ b/Documentation/ABI/testing/sysfs-class-net
-@@ -301,3 +301,18 @@ Contact: netdev@vger.kernel.org
- Description:
- 32-bit unsigned integer counting the number of times the link has
- been down
-+
-+What: /sys/class/net/<iface>/threaded
-+Date: Jan 2021
-+KernelVersion: 5.12
-+Contact: netdev@vger.kernel.org
-+Description:
-+ Boolean value to control the threaded mode per device. User could
-+ set this value to enable/disable threaded mode for all napi
-+ belonging to this device, without the need to do device up/down.
-+
-+ Possible values:
-+ == ==================================
-+ 0 threaded mode disabled for this dev
-+ 1 threaded mode enabled for this dev
-+ == ==================================
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -498,6 +498,8 @@ static inline bool napi_complete(struct
- */
- bool napi_hash_del(struct napi_struct *napi);
-
-+int dev_set_threaded(struct net_device *dev, bool threaded);
-+
- /**
- * napi_disable - prevent NAPI from scheduling
- * @n: NAPI context
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -3914,8 +3914,9 @@ static inline void ____napi_schedule(str
-
- if (test_bit(NAPI_STATE_THREADED, &napi->state)) {
- /* Paired with smp_mb__before_atomic() in
-- * napi_enable(). Use READ_ONCE() to guarantee
-- * a complete read on napi->thread. Only call
-+ * napi_enable()/dev_set_threaded().
-+ * Use READ_ONCE() to guarantee a complete
-+ * read on napi->thread. Only call
- * wake_up_process() when it's not NULL.
- */
- thread = READ_ONCE(napi->thread);
-@@ -6293,6 +6294,49 @@ static void init_gro_hash(struct napi_st
- napi->gro_bitmask = 0;
- }
-
-+int dev_set_threaded(struct net_device *dev, bool threaded)
-+{
-+ struct napi_struct *napi;
-+ int err = 0;
-+
-+ if (dev->threaded == threaded)
-+ return 0;
-+
-+ if (threaded) {
-+ list_for_each_entry(napi, &dev->napi_list, dev_list) {
-+ if (!napi->thread) {
-+ err = napi_kthread_create(napi);
-+ if (err) {
-+ threaded = false;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+
-+ dev->threaded = threaded;
-+
-+ /* Make sure kthread is created before THREADED bit
-+ * is set.
-+ */
-+ smp_mb__before_atomic();
-+
-+ /* Setting/unsetting threaded mode on a napi might not immediately
-+ * take effect, if the current napi instance is actively being
-+ * polled. In this case, the switch between threaded mode and
-+ * softirq mode will happen in the next round of napi_schedule().
-+ * This should not cause hiccups/stalls to the live traffic.
-+ */
-+ list_for_each_entry(napi, &dev->napi_list, dev_list) {
-+ if (threaded)
-+ set_bit(NAPI_STATE_THREADED, &napi->state);
-+ else
-+ clear_bit(NAPI_STATE_THREADED, &napi->state);
-+ }
-+
-+ return err;
-+}
-+
- void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
- int (*poll)(struct napi_struct *, int), int weight)
- {
---- a/net/core/net-sysfs.c
-+++ b/net/core/net-sysfs.c
-@@ -557,6 +557,45 @@ static ssize_t phys_switch_id_show(struc
- }
- static DEVICE_ATTR_RO(phys_switch_id);
-
-+static ssize_t threaded_show(struct device *dev,
-+ struct device_attribute *attr, char *buf)
-+{
-+ struct net_device *netdev = to_net_dev(dev);
-+ ssize_t ret = -EINVAL;
-+
-+ if (!rtnl_trylock())
-+ return restart_syscall();
-+
-+ if (dev_isalive(netdev))
-+ ret = sprintf(buf, fmt_dec, netdev->threaded);
-+
-+ rtnl_unlock();
-+ return ret;
-+}
-+
-+static int modify_napi_threaded(struct net_device *dev, unsigned long val)
-+{
-+ int ret;
-+
-+ if (list_empty(&dev->napi_list))
-+ return -EOPNOTSUPP;
-+
-+ if (val != 0 && val != 1)
-+ return -EOPNOTSUPP;
-+
-+ ret = dev_set_threaded(dev, val);
-+
-+ return ret;
-+}
-+
-+static ssize_t threaded_store(struct device *dev,
-+ struct device_attribute *attr,
-+ const char *buf, size_t len)
-+{
-+ return netdev_store(dev, attr, buf, len, modify_napi_threaded);
-+}
-+static DEVICE_ATTR_RW(threaded);
-+
- static struct attribute *net_class_attrs[] __ro_after_init = {
- &dev_attr_netdev_group.attr,
- &dev_attr_type.attr,
-@@ -587,6 +626,7 @@ static struct attribute *net_class_attrs
- &dev_attr_proto_down.attr,
- &dev_attr_carrier_up_count.attr,
- &dev_attr_carrier_down_count.attr,
-+ &dev_attr_threaded.attr,
- NULL,
- };
- ATTRIBUTE_GROUPS(net_class);
diff --git a/target/linux/generic/backport-5.4/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch b/target/linux/generic/backport-5.4/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch
deleted file mode 100644
index 764f33e3fc..0000000000
--- a/target/linux/generic/backport-5.4/603-v5.12-net-fix-race-between-napi-kthread-mode-and-busy-poll.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From: Wei Wang <weiwan@google.com>
-Date: Mon, 1 Mar 2021 17:21:13 -0800
-Subject: [PATCH] net: fix race between napi kthread mode and busy poll
-
-Currently, napi_thread_wait() checks for NAPI_STATE_SCHED bit to
-determine if the kthread owns this napi and could call napi->poll() on
-it. However, if socket busy poll is enabled, it is possible that the
-busy poll thread grabs this SCHED bit (after the previous napi->poll()
-invokes napi_complete_done() and clears SCHED bit) and tries to poll
-on the same napi. napi_disable() could grab the SCHED bit as well.
-This patch tries to fix this race by adding a new bit
-NAPI_STATE_SCHED_THREADED in napi->state. This bit gets set in
-____napi_schedule() if the threaded mode is enabled, and gets cleared
-in napi_complete_done(), and we only poll the napi in kthread if this
-bit is set. This helps distinguish the ownership of the napi between
-kthread and other scenarios and fixes the race issue.
-
-Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support")
-Reported-by: Martin Zaharinov <micron10@gmail.com>
-Suggested-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Wei Wang <weiwan@google.com>
-Cc: Alexander Duyck <alexanderduyck@fb.com>
-Cc: Eric Dumazet <edumazet@google.com>
-Cc: Paolo Abeni <pabeni@redhat.com>
-Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
----
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -352,6 +352,7 @@ enum {
- NAPI_STATE_NO_BUSY_POLL,/* Do not add in napi_hash, no busy polling */
- NAPI_STATE_IN_BUSY_POLL,/* sk_busy_loop() owns this NAPI */
- NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
-+ NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */
- };
-
- enum {
-@@ -363,6 +364,7 @@ enum {
- NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL),
- NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL),
- NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED),
-+ NAPIF_STATE_SCHED_THREADED = BIT(NAPI_STATE_SCHED_THREADED),
- };
-
- enum gro_result {
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -3921,6 +3921,8 @@ static inline void ____napi_schedule(str
- */
- thread = READ_ONCE(napi->thread);
- if (thread) {
-+ if (thread->state != TASK_INTERRUPTIBLE)
-+ set_bit(NAPI_STATE_SCHED_THREADED, &napi->state);
- wake_up_process(thread);
- return;
- }
-@@ -6081,7 +6083,8 @@ bool napi_complete_done(struct napi_stru
-
- WARN_ON_ONCE(!(val & NAPIF_STATE_SCHED));
-
-- new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED);
-+ new = val & ~(NAPIF_STATE_MISSED | NAPIF_STATE_SCHED |
-+ NAPIF_STATE_SCHED_THREADED);
-
- /* If STATE_MISSED was set, leave STATE_SCHED set,
- * because we will call napi->poll() one more time.
-@@ -6514,16 +6517,25 @@ static int napi_poll(struct napi_struct
-
- static int napi_thread_wait(struct napi_struct *napi)
- {
-+ bool woken = false;
-+
- set_current_state(TASK_INTERRUPTIBLE);
-
- while (!kthread_should_stop() && !napi_disable_pending(napi)) {
-- if (test_bit(NAPI_STATE_SCHED, &napi->state)) {
-+ /* Testing SCHED_THREADED bit here to make sure the current
-+ * kthread owns this napi and could poll on this napi.
-+ * Testing SCHED bit is not enough because SCHED bit might be
-+ * set by some other busy poll thread or by napi_disable().
-+ */
-+ if (test_bit(NAPI_STATE_SCHED_THREADED, &napi->state) || woken) {
- WARN_ON(!list_empty(&napi->poll_list));
- __set_current_state(TASK_RUNNING);
- return 0;
- }
-
- schedule();
-+ /* woken being true indicates this thread owns this napi. */
-+ woken = true;
- set_current_state(TASK_INTERRUPTIBLE);
- }
- __set_current_state(TASK_RUNNING);
diff --git a/target/linux/generic/backport-5.4/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch b/target/linux/generic/backport-5.4/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch
deleted file mode 100644
index 5c48fdf5c1..0000000000
--- a/target/linux/generic/backport-5.4/604-v5.12-net-fix-hangup-on-napi_disable-for-threaded-napi.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Paolo Abeni <pabeni@redhat.com>
-Date: Fri, 9 Apr 2021 17:24:17 +0200
-Subject: [PATCH] net: fix hangup on napi_disable for threaded napi
-
-napi_disable() is subject to an hangup, when the threaded
-mode is enabled and the napi is under heavy traffic.
-
-If the relevant napi has been scheduled and the napi_disable()
-kicks in before the next napi_threaded_wait() completes - so
-that the latter quits due to the napi_disable_pending() condition,
-the existing code leaves the NAPI_STATE_SCHED bit set and the
-napi_disable() loop waiting for such bit will hang.
-
-This patch addresses the issue by dropping the NAPI_STATE_DISABLE
-bit test in napi_thread_wait(). The later napi_threaded_poll()
-iteration will take care of clearing the NAPI_STATE_SCHED.
-
-This also addresses a related problem reported by Jakub:
-before this patch a napi_disable()/napi_enable() pair killed
-the napi thread, effectively disabling the threaded mode.
-On the patched kernel napi_disable() simply stops scheduling
-the relevant thread.
-
-v1 -> v2:
- - let the main napi_thread_poll() loop clear the SCHED bit
-
-Reported-by: Jakub Kicinski <kuba@kernel.org>
-Fixes: 29863d41bb6e ("net: implement threaded-able napi poll loop support")
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Reviewed-by: Eric Dumazet <edumazet@google.com>
-Link: https://lore.kernel.org/r/883923fa22745a9589e8610962b7dc59df09fb1f.1617981844.git.pabeni@redhat.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
-
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -6521,7 +6521,7 @@ static int napi_thread_wait(struct napi_
-
- set_current_state(TASK_INTERRUPTIBLE);
-
-- while (!kthread_should_stop() && !napi_disable_pending(napi)) {
-+ while (!kthread_should_stop()) {
- /* Testing SCHED_THREADED bit here to make sure the current
- * kthread owns this napi and could poll on this napi.
- * Testing SCHED bit is not enough because SCHED bit might be
-@@ -6539,6 +6539,7 @@ static int napi_thread_wait(struct napi_
- set_current_state(TASK_INTERRUPTIBLE);
- }
- __set_current_state(TASK_RUNNING);
-+
- return -1;
- }
-
diff --git a/target/linux/generic/backport-5.4/610-v5.9-net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch b/target/linux/generic/backport-5.4/610-v5.9-net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch
deleted file mode 100644
index f1862943f8..0000000000
--- a/target/linux/generic/backport-5.4/610-v5.9-net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
-Date: Fri, 31 Jul 2020 19:26:16 +0300
-Subject: [PATCH] net: bridge: clear bridge's private skb space on xmit
-
-We need to clear all of the bridge private skb variables as they can be
-stale due to the packet being recirculated through the stack and then
-transmitted through the bridge device. Similar memset is already done on
-bridge's input. We've seen cases where proxyarp_replied was 1 on routed
-multicast packets transmitted through the bridge to ports with neigh
-suppress which were getting dropped. Same thing can in theory happen with
-the port isolation bit as well.
-
-Fixes: 821f1b21cabb ("bridge: add new BR_NEIGH_SUPPRESS port flag to suppress arp and nd flood")
-Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/net/bridge/br_device.c
-+++ b/net/bridge/br_device.c
-@@ -36,6 +36,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff *
- struct ethhdr *eth;
- u16 vid = 0;
-
-+ memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
-+
- rcu_read_lock();
- nf_ops = rcu_dereference(nf_br_ops);
- if (nf_ops && nf_ops->br_dev_xmit_hook(skb)) {
diff --git a/target/linux/generic/backport-5.4/700-v5.5-net-core-allow-fast-GRO-for-skbs-with-Ethernet-heade.patch b/target/linux/generic/backport-5.4/700-v5.5-net-core-allow-fast-GRO-for-skbs-with-Ethernet-heade.patch
deleted file mode 100644
index 24b76cdca4..0000000000
--- a/target/linux/generic/backport-5.4/700-v5.5-net-core-allow-fast-GRO-for-skbs-with-Ethernet-heade.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Alexander Lobakin <alobakin@dlink.ru>
-Date: Fri, 15 Nov 2019 12:11:35 +0300
-Subject: [PATCH] net: core: allow fast GRO for skbs with Ethernet header in
- head
-
-Commit 78d3fd0b7de8 ("gro: Only use skb_gro_header for completely
-non-linear packets") back in May'09 (v2.6.31-rc1) has changed the
-original condition '!skb_headlen(skb)' to
-'skb->mac_header == skb->tail' in gro_reset_offset() saying: "Since
-the drivers that need this optimisation all provide completely
-non-linear packets" (note that this condition has become the current
-'skb_mac_header(skb) == skb_tail_pointer(skb)' later with commmit
-ced14f6804a9 ("net: Correct comparisons and calculations using
-skb->tail and skb-transport_header") without any functional changes).
-
-For now, we have the following rough statistics for v5.4-rc7:
-1) napi_gro_frags: 14
-2) napi_gro_receive with skb->head containing (most of) payload: 83
-3) napi_gro_receive with skb->head containing all the headers: 20
-4) napi_gro_receive with skb->head containing only Ethernet header: 2
-
-With the current condition, fast GRO with the usage of
-NAPI_GRO_CB(skb)->frag0 is available only in the [1] case.
-Packets pushed by [2] and [3] go through the 'slow' path, but
-it's not a problem for them as they already contain all the needed
-headers in skb->head, so pskb_may_pull() only moves skb->data.
-
-The layout of skbs in the fourth [4] case at the moment of
-dev_gro_receive() is identical to skbs that have come through [1],
-as napi_frags_skb() pulls Ethernet header to skb->head. The only
-difference is that the mentioned condition is always false for them,
-because skb_put() and friends irreversibly alter the tail pointer.
-They also go through the 'slow' path, but now every single
-pskb_may_pull() in every single .gro_receive() will call the *really*
-slow __pskb_pull_tail() to pull headers to head. This significantly
-decreases the overall performance for no visible reasons.
-
-The only two users of method [4] is:
-* drivers/staging/qlge
-* drivers/net/wireless/iwlwifi (all three variants: dvm, mvm, mvm-mq)
-
-Note that in case with wireless drivers we can't use [1]
-(napi_gro_frags()) at least for now and mac80211 stack always
-performs pushes and pulls anyways, so performance hit is inavoidable.
-
-At the moment of v2.6.31 the mentioned change was necessary (that's
-why I don't add the "Fixes:" tag), but it became obsolete since
-skb_gro_mac_header() has gone in commit a50e233c50db ("net-gro:
-restore frag0 optimization"), so we can simply revert the condition
-in gro_reset_offset() to allow skbs from [4] go through the 'fast'
-path just like in case [1].
-
-This was tested on a 600 MHz MIPS CPU and a custom driver and this
-patch gave boosts up to 40 Mbps to method [4] in both directions
-comparing to net-next, which made overall performance relatively
-close to [1] (without it, [4] is the slowest).
-
-v2:
-- Add more references and explanations to commit message
-- Fix some typos ibid
-- No functional changes
-
-Signed-off-by: Alexander Lobakin <alobakin@dlink.ru>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -5475,8 +5475,7 @@ static inline void skb_gro_reset_offset(
- NAPI_GRO_CB(skb)->frag0 = NULL;
- NAPI_GRO_CB(skb)->frag0_len = 0;
-
-- if (skb_mac_header(skb) == skb_tail_pointer(skb) &&
-- pinfo->nr_frags &&
-+ if (!skb_headlen(skb) && pinfo->nr_frags &&
- !PageHighMem(skb_frag_page(frag0)) &&
- (!NET_IP_ALIGN || !((skb_frag_off(frag0) + nhoff) & 3))) {
- NAPI_GRO_CB(skb)->frag0 = skb_frag_address(frag0);
diff --git a/target/linux/generic/backport-5.4/716-v5.5-net-sfp-move-fwnode-parsing-into-sfp-bus-layer.patch b/target/linux/generic/backport-5.4/716-v5.5-net-sfp-move-fwnode-parsing-into-sfp-bus-layer.patch
deleted file mode 100644
index 92fe224873..0000000000
--- a/target/linux/generic/backport-5.4/716-v5.5-net-sfp-move-fwnode-parsing-into-sfp-bus-layer.patch
+++ /dev/null
@@ -1,179 +0,0 @@
-From 4054955f0da08c81d42220cb445820d474f1ac92 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sat, 14 Sep 2019 14:21:22 +0100
-Subject: [PATCH 614/660] net: sfp: move fwnode parsing into sfp-bus layer
-
-Rather than parsing the sfp firmware node in phylink, parse it in the
-sfp-bus code, so we can re-use this code for PHYs without having to
-duplicate the parsing.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 21 ++++---------
- drivers/net/phy/sfp-bus.c | 65 +++++++++++++++++++++++++--------------
- include/linux/sfp.h | 10 +++---
- 3 files changed, 53 insertions(+), 43 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -565,26 +565,17 @@ static const struct sfp_upstream_ops sfp
- static int phylink_register_sfp(struct phylink *pl,
- struct fwnode_handle *fwnode)
- {
-- struct fwnode_reference_args ref;
-+ struct sfp_bus *bus;
- int ret;
-
-- if (!fwnode)
-- return 0;
--
-- ret = fwnode_property_get_reference_args(fwnode, "sfp", NULL,
-- 0, 0, &ref);
-- if (ret < 0) {
-- if (ret == -ENOENT)
-- return 0;
--
-- phylink_err(pl, "unable to parse \"sfp\" node: %d\n",
-- ret);
-+ bus = sfp_register_upstream_node(fwnode, pl, &sfp_phylink_ops);
-+ if (IS_ERR(bus)) {
-+ ret = PTR_ERR(bus);
-+ phylink_err(pl, "unable to attach SFP bus: %d\n", ret);
- return ret;
- }
-
-- pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl, &sfp_phylink_ops);
-- if (!pl->sfp_bus)
-- return -ENOMEM;
-+ pl->sfp_bus = bus;
-
- return 0;
- }
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -4,6 +4,7 @@
- #include <linux/list.h>
- #include <linux/mutex.h>
- #include <linux/phylink.h>
-+#include <linux/property.h>
- #include <linux/rtnetlink.h>
- #include <linux/slab.h>
-
-@@ -520,45 +521,63 @@ static void sfp_upstream_clear(struct sf
- }
-
- /**
-- * sfp_register_upstream() - Register the neighbouring device
-- * @fwnode: firmware node for the SFP bus
-+ * sfp_register_upstream_node() - parse and register the neighbouring device
-+ * @fwnode: firmware node for the parent device (MAC or PHY)
- * @upstream: the upstream private data
- * @ops: the upstream's &struct sfp_upstream_ops
- *
-- * Register the upstream device (eg, PHY) with the SFP bus. MAC drivers
-- * should use phylink, which will call this function for them. Returns
-- * a pointer to the allocated &struct sfp_bus.
-+ * Parse the parent device's firmware node for a SFP bus, and register the
-+ * SFP bus using sfp_register_upstream().
- *
-- * On error, returns %NULL.
-+ * Returns: on success, a pointer to the sfp_bus structure,
-+ * %NULL if no SFP is specified,
-+ * on failure, an error pointer value:
-+ * corresponding to the errors detailed for
-+ * fwnode_property_get_reference_args().
-+ * %-ENOMEM if we failed to allocate the bus.
-+ * an error from the upstream's connect_phy() method.
- */
--struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
-- void *upstream,
-- const struct sfp_upstream_ops *ops)
--{
-- struct sfp_bus *bus = sfp_bus_get(fwnode);
-- int ret = 0;
--
-- if (bus) {
-- rtnl_lock();
-- bus->upstream_ops = ops;
-- bus->upstream = upstream;
-+struct sfp_bus *sfp_register_upstream_node(struct fwnode_handle *fwnode,
-+ void *upstream,
-+ const struct sfp_upstream_ops *ops)
-+{
-+ struct fwnode_reference_args ref;
-+ struct sfp_bus *bus;
-+ int ret;
-
-- if (bus->sfp) {
-- ret = sfp_register_bus(bus);
-- if (ret)
-- sfp_upstream_clear(bus);
-- }
-- rtnl_unlock();
-+ ret = fwnode_property_get_reference_args(fwnode, "sfp", NULL,
-+ 0, 0, &ref);
-+ if (ret == -ENOENT)
-+ return NULL;
-+ else if (ret < 0)
-+ return ERR_PTR(ret);
-+
-+ bus = sfp_bus_get(ref.fwnode);
-+ fwnode_handle_put(ref.fwnode);
-+ if (!bus)
-+ return ERR_PTR(-ENOMEM);
-+
-+ rtnl_lock();
-+ bus->upstream_ops = ops;
-+ bus->upstream = upstream;
-+
-+ if (bus->sfp) {
-+ ret = sfp_register_bus(bus);
-+ if (ret)
-+ sfp_upstream_clear(bus);
-+ } else {
-+ ret = 0;
- }
-+ rtnl_unlock();
-
- if (ret) {
- sfp_bus_put(bus);
-- bus = NULL;
-+ bus = ERR_PTR(ret);
- }
-
- return bus;
- }
--EXPORT_SYMBOL_GPL(sfp_register_upstream);
-+EXPORT_SYMBOL_GPL(sfp_register_upstream_node);
-
- /**
- * sfp_unregister_upstream() - Unregister sfp bus
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -508,9 +508,9 @@ int sfp_get_module_eeprom(struct sfp_bus
- u8 *data);
- void sfp_upstream_start(struct sfp_bus *bus);
- void sfp_upstream_stop(struct sfp_bus *bus);
--struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
-- void *upstream,
-- const struct sfp_upstream_ops *ops);
-+struct sfp_bus *sfp_register_upstream_node(struct fwnode_handle *fwnode,
-+ void *upstream,
-+ const struct sfp_upstream_ops *ops);
- void sfp_unregister_upstream(struct sfp_bus *bus);
- #else
- static inline int sfp_parse_port(struct sfp_bus *bus,
-@@ -553,11 +553,11 @@ static inline void sfp_upstream_stop(str
- {
- }
-
--static inline struct sfp_bus *sfp_register_upstream(
-+static inline struct sfp_bus *sfp_register_upstream_node(
- struct fwnode_handle *fwnode, void *upstream,
- const struct sfp_upstream_ops *ops)
- {
-- return (struct sfp_bus *)-1;
-+ return NULL;
- }
-
- static inline void sfp_unregister_upstream(struct sfp_bus *bus)
diff --git a/target/linux/generic/backport-5.4/717-v5.5-net-sfp-rework-upstream-interface.patch b/target/linux/generic/backport-5.4/717-v5.5-net-sfp-rework-upstream-interface.patch
deleted file mode 100644
index 9175f2557a..0000000000
--- a/target/linux/generic/backport-5.4/717-v5.5-net-sfp-rework-upstream-interface.patch
+++ /dev/null
@@ -1,254 +0,0 @@
-From 863b5b6941f9f43b924393b6ba2b36647e7dee42 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 7 Nov 2019 17:06:08 +0000
-Subject: [PATCH 615/660] net: sfp: rework upstream interface
-
-The current upstream interface is an all-or-nothing, which is
-sub-optimal for future changes, as it doesn't allow the upstream driver
-to prepare for the SFP module becoming available, as it is at boot.
-
-Switch to a find-sfp-bus, add-upstream, del-upstream, put-sfp-bus
-interface structure instead, which allows the upstream driver to
-prepare for a module being available as soon as add-upstream is called.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 10 +++--
- drivers/net/phy/sfp-bus.c | 92 +++++++++++++++++++++++++++------------
- include/linux/sfp.h | 25 +++++++----
- 3 files changed, 88 insertions(+), 39 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -568,7 +568,7 @@ static int phylink_register_sfp(struct p
- struct sfp_bus *bus;
- int ret;
-
-- bus = sfp_register_upstream_node(fwnode, pl, &sfp_phylink_ops);
-+ bus = sfp_bus_find_fwnode(fwnode);
- if (IS_ERR(bus)) {
- ret = PTR_ERR(bus);
- phylink_err(pl, "unable to attach SFP bus: %d\n", ret);
-@@ -577,7 +577,10 @@ static int phylink_register_sfp(struct p
-
- pl->sfp_bus = bus;
-
-- return 0;
-+ ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops);
-+ sfp_bus_put(bus);
-+
-+ return ret;
- }
-
- /**
-@@ -675,8 +678,7 @@ EXPORT_SYMBOL_GPL(phylink_create);
- */
- void phylink_destroy(struct phylink *pl)
- {
-- if (pl->sfp_bus)
-- sfp_unregister_upstream(pl->sfp_bus);
-+ sfp_bus_del_upstream(pl->sfp_bus);
- if (pl->link_gpio)
- gpiod_put(pl->link_gpio);
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -404,10 +404,19 @@ static void sfp_bus_release(struct kref
- kfree(bus);
- }
-
--static void sfp_bus_put(struct sfp_bus *bus)
-+/**
-+ * sfp_bus_put() - put a reference on the &struct sfp_bus
-+ * bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
-+ *
-+ * Put a reference on the &struct sfp_bus and free the underlying structure
-+ * if this was the last reference.
-+ */
-+void sfp_bus_put(struct sfp_bus *bus)
- {
-- kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex);
-+ if (bus)
-+ kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex);
- }
-+EXPORT_SYMBOL_GPL(sfp_bus_put);
-
- static int sfp_register_bus(struct sfp_bus *bus)
- {
-@@ -423,11 +432,11 @@ static int sfp_register_bus(struct sfp_b
- return ret;
- }
- }
-+ bus->registered = true;
- bus->socket_ops->attach(bus->sfp);
- if (bus->started)
- bus->socket_ops->start(bus->sfp);
- bus->upstream_ops->attach(bus->upstream, bus);
-- bus->registered = true;
- return 0;
- }
-
-@@ -521,13 +530,12 @@ static void sfp_upstream_clear(struct sf
- }
-
- /**
-- * sfp_register_upstream_node() - parse and register the neighbouring device
-+ * sfp_bus_find_fwnode() - parse and locate the SFP bus from fwnode
- * @fwnode: firmware node for the parent device (MAC or PHY)
-- * @upstream: the upstream private data
-- * @ops: the upstream's &struct sfp_upstream_ops
- *
-- * Parse the parent device's firmware node for a SFP bus, and register the
-- * SFP bus using sfp_register_upstream().
-+ * Parse the parent device's firmware node for a SFP bus, and locate
-+ * the sfp_bus structure, incrementing its reference count. This must
-+ * be put via sfp_bus_put() when done.
- *
- * Returns: on success, a pointer to the sfp_bus structure,
- * %NULL if no SFP is specified,
-@@ -537,9 +545,7 @@ static void sfp_upstream_clear(struct sf
- * %-ENOMEM if we failed to allocate the bus.
- * an error from the upstream's connect_phy() method.
- */
--struct sfp_bus *sfp_register_upstream_node(struct fwnode_handle *fwnode,
-- void *upstream,
-- const struct sfp_upstream_ops *ops)
-+struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode)
- {
- struct fwnode_reference_args ref;
- struct sfp_bus *bus;
-@@ -557,7 +563,39 @@ struct sfp_bus *sfp_register_upstream_no
- if (!bus)
- return ERR_PTR(-ENOMEM);
-
-+ return bus;
-+}
-+EXPORT_SYMBOL_GPL(sfp_bus_find_fwnode);
-+
-+/**
-+ * sfp_bus_add_upstream() - parse and register the neighbouring device
-+ * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
-+ * @upstream: the upstream private data
-+ * @ops: the upstream's &struct sfp_upstream_ops
-+ *
-+ * Add upstream driver for the SFP bus, and if the bus is complete, register
-+ * the SFP bus using sfp_register_upstream(). This takes a reference on the
-+ * bus, so it is safe to put the bus after this call.
-+ *
-+ * Returns: on success, a pointer to the sfp_bus structure,
-+ * %NULL if no SFP is specified,
-+ * on failure, an error pointer value:
-+ * corresponding to the errors detailed for
-+ * fwnode_property_get_reference_args().
-+ * %-ENOMEM if we failed to allocate the bus.
-+ * an error from the upstream's connect_phy() method.
-+ */
-+int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
-+ const struct sfp_upstream_ops *ops)
-+{
-+ int ret;
-+
-+ /* If no bus, return success */
-+ if (!bus)
-+ return 0;
-+
- rtnl_lock();
-+ kref_get(&bus->kref);
- bus->upstream_ops = ops;
- bus->upstream = upstream;
-
-@@ -570,33 +608,33 @@ struct sfp_bus *sfp_register_upstream_no
- }
- rtnl_unlock();
-
-- if (ret) {
-+ if (ret)
- sfp_bus_put(bus);
-- bus = ERR_PTR(ret);
-- }
-
-- return bus;
-+ return ret;
- }
--EXPORT_SYMBOL_GPL(sfp_register_upstream_node);
-+EXPORT_SYMBOL_GPL(sfp_bus_add_upstream);
-
- /**
-- * sfp_unregister_upstream() - Unregister sfp bus
-+ * sfp_bus_del_upstream() - Delete a sfp bus
- * @bus: a pointer to the &struct sfp_bus structure for the sfp module
- *
-- * Unregister a previously registered upstream connection for the SFP
-- * module. @bus is returned from sfp_register_upstream().
-+ * Delete a previously registered upstream connection for the SFP
-+ * module. @bus should have been added by sfp_bus_add_upstream().
- */
--void sfp_unregister_upstream(struct sfp_bus *bus)
-+void sfp_bus_del_upstream(struct sfp_bus *bus)
- {
-- rtnl_lock();
-- if (bus->sfp)
-- sfp_unregister_bus(bus);
-- sfp_upstream_clear(bus);
-- rtnl_unlock();
-+ if (bus) {
-+ rtnl_lock();
-+ if (bus->sfp)
-+ sfp_unregister_bus(bus);
-+ sfp_upstream_clear(bus);
-+ rtnl_unlock();
-
-- sfp_bus_put(bus);
-+ sfp_bus_put(bus);
-+ }
- }
--EXPORT_SYMBOL_GPL(sfp_unregister_upstream);
-+EXPORT_SYMBOL_GPL(sfp_bus_del_upstream);
-
- /* Socket driver entry points */
- int sfp_add_phy(struct sfp_bus *bus, struct phy_device *phydev)
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -508,10 +508,11 @@ int sfp_get_module_eeprom(struct sfp_bus
- u8 *data);
- void sfp_upstream_start(struct sfp_bus *bus);
- void sfp_upstream_stop(struct sfp_bus *bus);
--struct sfp_bus *sfp_register_upstream_node(struct fwnode_handle *fwnode,
-- void *upstream,
-- const struct sfp_upstream_ops *ops);
--void sfp_unregister_upstream(struct sfp_bus *bus);
-+void sfp_bus_put(struct sfp_bus *bus);
-+struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode);
-+int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
-+ const struct sfp_upstream_ops *ops);
-+void sfp_bus_del_upstream(struct sfp_bus *bus);
- #else
- static inline int sfp_parse_port(struct sfp_bus *bus,
- const struct sfp_eeprom_id *id,
-@@ -553,14 +554,22 @@ static inline void sfp_upstream_stop(str
- {
- }
-
--static inline struct sfp_bus *sfp_register_upstream_node(
-- struct fwnode_handle *fwnode, void *upstream,
-- const struct sfp_upstream_ops *ops)
-+static inline void sfp_bus_put(struct sfp_bus *bus)
-+{
-+}
-+
-+static inline struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode)
- {
- return NULL;
- }
-
--static inline void sfp_unregister_upstream(struct sfp_bus *bus)
-+static int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
-+ const struct sfp_upstream_ops *ops)
-+{
-+ return 0;
-+}
-+
-+static inline void sfp_bus_del_upstream(struct sfp_bus *bus)
- {
- }
- #endif
diff --git a/target/linux/generic/backport-5.4/718-v5.5-net-sfp-fix-sfp_bus_put-kernel-documentation.patch b/target/linux/generic/backport-5.4/718-v5.5-net-sfp-fix-sfp_bus_put-kernel-documentation.patch
deleted file mode 100644
index c7bfd8a304..0000000000
--- a/target/linux/generic/backport-5.4/718-v5.5-net-sfp-fix-sfp_bus_put-kernel-documentation.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From ea7bfd81921827d334c2a23bd11ef0e4e2abafd2 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sat, 9 Nov 2019 08:13:50 +0000
-Subject: [PATCH 616/660] net: sfp: fix sfp_bus_put() kernel documentation
-
-The kbuild test robot found a problem with htmldocs with the recent
-change to the SFP interfaces. Fix the kernel documentation for
-sfp_bus_put() which was missing an '@' before the argument name
-description.
-
-Fixes: 727b3668b730 ("net: sfp: rework upstream interface")
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp-bus.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -406,7 +406,7 @@ static void sfp_bus_release(struct kref
-
- /**
- * sfp_bus_put() - put a reference on the &struct sfp_bus
-- * bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
-+ * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
- *
- * Put a reference on the &struct sfp_bus and free the underlying structure
- * if this was the last reference.
diff --git a/target/linux/generic/backport-5.4/719-v5.5-net-sfp-fix-sfp_bus_add_upstream-warning.patch b/target/linux/generic/backport-5.4/719-v5.5-net-sfp-fix-sfp_bus_add_upstream-warning.patch
deleted file mode 100644
index 9528049e1b..0000000000
--- a/target/linux/generic/backport-5.4/719-v5.5-net-sfp-fix-sfp_bus_add_upstream-warning.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From f76d84cd85f8bd3f083495f7ca723822cba8abc9 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Mon, 11 Nov 2019 10:23:35 +0000
-Subject: [PATCH 617/660] net: sfp: fix sfp_bus_add_upstream() warning
-
-When building with SFP disabled, the stub for sfp_bus_add_upstream()
-missed "inline". Add it.
-
-Fixes: 727b3668b730 ("net: sfp: rework upstream interface")
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- include/linux/sfp.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -563,8 +563,8 @@ static inline struct sfp_bus *sfp_bus_fi
- return NULL;
- }
-
--static int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
-- const struct sfp_upstream_ops *ops)
-+static inline int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
-+ const struct sfp_upstream_ops *ops)
- {
- return 0;
- }
diff --git a/target/linux/generic/backport-5.4/720-v5.5-net-sfp-move-sfp-sub-state-machines-into-separate-fu.patch b/target/linux/generic/backport-5.4/720-v5.5-net-sfp-move-sfp-sub-state-machines-into-separate-fu.patch
deleted file mode 100644
index e4ca85b6e2..0000000000
--- a/target/linux/generic/backport-5.4/720-v5.5-net-sfp-move-sfp-sub-state-machines-into-separate-fu.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-From b9d6ed5cdb67533feda7f221eb06f2f9f1ff5047 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 11 Oct 2019 19:33:58 +0100
-Subject: [PATCH 618/660] net: sfp: move sfp sub-state machines into separate
- functions
-
-Move the SFP sub-state machines out of the main state machine function,
-in preparation for it doing a bit more with the device state. By doing
-so, we ensure that our debug after the main state machine is always
-printed.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 74 +++++++++++++++++++++++++------------------
- 1 file changed, 43 insertions(+), 31 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1544,19 +1544,34 @@ static void sfp_sm_mod_remove(struct sfp
- dev_info(sfp->dev, "module removed\n");
- }
-
--static void sfp_sm_event(struct sfp *sfp, unsigned int event)
-+/* This state machine tracks the netdev up/down state */
-+static void sfp_sm_device(struct sfp *sfp, unsigned int event)
- {
-- mutex_lock(&sfp->sm_mutex);
-+ switch (sfp->sm_dev_state) {
-+ default:
-+ if (event == SFP_E_DEV_UP)
-+ sfp->sm_dev_state = SFP_DEV_UP;
-+ break;
-
-- dev_dbg(sfp->dev, "SM: enter %s:%s:%s event %s\n",
-- mod_state_to_str(sfp->sm_mod_state),
-- dev_state_to_str(sfp->sm_dev_state),
-- sm_state_to_str(sfp->sm_state),
-- event_to_str(event));
-+ case SFP_DEV_UP:
-+ if (event == SFP_E_DEV_DOWN) {
-+ /* If the module has a PHY, avoid raising TX disable
-+ * as this resets the PHY. Otherwise, raise it to
-+ * turn the laser off.
-+ */
-+ if (!sfp->mod_phy)
-+ sfp_module_tx_disable(sfp);
-+ sfp->sm_dev_state = SFP_DEV_DOWN;
-+ }
-+ break;
-+ }
-+}
-
-- /* This state machine tracks the insert/remove state of
-- * the module, and handles probing the on-board EEPROM.
-- */
-+/* This state machine tracks the insert/remove state of
-+ * the module, and handles probing the on-board EEPROM.
-+ */
-+static void sfp_sm_module(struct sfp *sfp, unsigned int event)
-+{
- switch (sfp->sm_mod_state) {
- default:
- if (event == SFP_E_INSERT && sfp->attached) {
-@@ -1596,27 +1611,10 @@ static void sfp_sm_event(struct sfp *sfp
- }
- break;
- }
-+}
-
-- /* This state machine tracks the netdev up/down state */
-- switch (sfp->sm_dev_state) {
-- default:
-- if (event == SFP_E_DEV_UP)
-- sfp->sm_dev_state = SFP_DEV_UP;
-- break;
--
-- case SFP_DEV_UP:
-- if (event == SFP_E_DEV_DOWN) {
-- /* If the module has a PHY, avoid raising TX disable
-- * as this resets the PHY. Otherwise, raise it to
-- * turn the laser off.
-- */
-- if (!sfp->mod_phy)
-- sfp_module_tx_disable(sfp);
-- sfp->sm_dev_state = SFP_DEV_DOWN;
-- }
-- break;
-- }
--
-+static void sfp_sm_main(struct sfp *sfp, unsigned int event)
-+{
- /* Some events are global */
- if (sfp->sm_state != SFP_S_DOWN &&
- (sfp->sm_mod_state != SFP_MOD_PRESENT ||
-@@ -1627,7 +1625,6 @@ static void sfp_sm_event(struct sfp *sfp
- if (sfp->mod_phy)
- sfp_sm_phy_detach(sfp);
- sfp_sm_next(sfp, SFP_S_DOWN, 0);
-- mutex_unlock(&sfp->sm_mutex);
- return;
- }
-
-@@ -1682,6 +1679,21 @@ static void sfp_sm_event(struct sfp *sfp
- case SFP_S_TX_DISABLE:
- break;
- }
-+}
-+
-+static void sfp_sm_event(struct sfp *sfp, unsigned int event)
-+{
-+ mutex_lock(&sfp->sm_mutex);
-+
-+ dev_dbg(sfp->dev, "SM: enter %s:%s:%s event %s\n",
-+ mod_state_to_str(sfp->sm_mod_state),
-+ dev_state_to_str(sfp->sm_dev_state),
-+ sm_state_to_str(sfp->sm_state),
-+ event_to_str(event));
-+
-+ sfp_sm_module(sfp, event);
-+ sfp_sm_device(sfp, event);
-+ sfp_sm_main(sfp, event);
-
- dev_dbg(sfp->dev, "SM: exit %s:%s:%s\n",
- mod_state_to_str(sfp->sm_mod_state),
diff --git a/target/linux/generic/backport-5.4/721-v5.5-net-sfp-move-tx-disable-on-device-down-to-main-state.patch b/target/linux/generic/backport-5.4/721-v5.5-net-sfp-move-tx-disable-on-device-down-to-main-state.patch
deleted file mode 100644
index 71021c8f4e..0000000000
--- a/target/linux/generic/backport-5.4/721-v5.5-net-sfp-move-tx-disable-on-device-down-to-main-state.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 7e89b737c97a9e7a81dd1584000bc136b92f12fd Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 11 Oct 2019 22:14:47 +0100
-Subject: [PATCH 619/660] net: sfp: move tx disable on device down to main
- state machine
-
-Move the tx disable assertion on device down to the main state
-machine.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 10 ++--------
- 1 file changed, 2 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1554,15 +1554,8 @@ static void sfp_sm_device(struct sfp *sf
- break;
-
- case SFP_DEV_UP:
-- if (event == SFP_E_DEV_DOWN) {
-- /* If the module has a PHY, avoid raising TX disable
-- * as this resets the PHY. Otherwise, raise it to
-- * turn the laser off.
-- */
-- if (!sfp->mod_phy)
-- sfp_module_tx_disable(sfp);
-+ if (event == SFP_E_DEV_DOWN)
- sfp->sm_dev_state = SFP_DEV_DOWN;
-- }
- break;
- }
- }
-@@ -1624,6 +1617,7 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_sm_link_down(sfp);
- if (sfp->mod_phy)
- sfp_sm_phy_detach(sfp);
-+ sfp_module_tx_disable(sfp);
- sfp_sm_next(sfp, SFP_S_DOWN, 0);
- return;
- }
diff --git a/target/linux/generic/backport-5.4/722-v5.5-net-sfp-rename-sfp_sm_ins_next-as-sfp_sm_mod_next.patch b/target/linux/generic/backport-5.4/722-v5.5-net-sfp-rename-sfp_sm_ins_next-as-sfp_sm_mod_next.patch
deleted file mode 100644
index 2974586b13..0000000000
--- a/target/linux/generic/backport-5.4/722-v5.5-net-sfp-rename-sfp_sm_ins_next-as-sfp_sm_mod_next.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From f2a1ccfc4ad4f97c98c3cc18eb32992151ce089a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 11 Oct 2019 22:27:21 +0100
-Subject: [PATCH 620/660] net: sfp: rename sfp_sm_ins_next() as
- sfp_sm_mod_next()
-
-sfp_sm_ins_next() modifies the module state machine. Change it's name
-to reflect this.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1245,7 +1245,7 @@ static void sfp_sm_next(struct sfp *sfp,
- sfp_sm_set_timer(sfp, timeout);
- }
-
--static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state,
-+static void sfp_sm_mod_next(struct sfp *sfp, unsigned int state,
- unsigned int timeout)
- {
- sfp->sm_mod_state = state;
-@@ -1569,22 +1569,22 @@ static void sfp_sm_module(struct sfp *sf
- default:
- if (event == SFP_E_INSERT && sfp->attached) {
- sfp_module_tx_disable(sfp);
-- sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT);
-+ sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT);
- }
- break;
-
- case SFP_MOD_PROBE:
- if (event == SFP_E_REMOVE) {
-- sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
- } else if (event == SFP_E_TIMEOUT) {
- int val = sfp_sm_mod_probe(sfp);
-
- if (val == 0)
-- sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_PRESENT, 0);
- else if (val > 0)
-- sfp_sm_ins_next(sfp, SFP_MOD_HPOWER, val);
-+ sfp_sm_mod_next(sfp, SFP_MOD_HPOWER, val);
- else if (val != -EAGAIN)
-- sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
- else
- sfp_sm_set_timer(sfp, T_PROBE_RETRY);
- }
-@@ -1592,7 +1592,7 @@ static void sfp_sm_module(struct sfp *sf
-
- case SFP_MOD_HPOWER:
- if (event == SFP_E_TIMEOUT) {
-- sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_PRESENT, 0);
- break;
- }
- /* fallthrough */
-@@ -1600,7 +1600,7 @@ static void sfp_sm_module(struct sfp *sf
- case SFP_MOD_ERROR:
- if (event == SFP_E_REMOVE) {
- sfp_sm_mod_remove(sfp);
-- sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
- }
- break;
- }
diff --git a/target/linux/generic/backport-5.4/723-v5.5-net-sfp-handle-module-remove-outside-state-machine.patch b/target/linux/generic/backport-5.4/723-v5.5-net-sfp-handle-module-remove-outside-state-machine.patch
deleted file mode 100644
index 62cdb8a6ce..0000000000
--- a/target/linux/generic/backport-5.4/723-v5.5-net-sfp-handle-module-remove-outside-state-machine.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From d2591ea5520e2ee8fa557f96bb64c23cafac4b20 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 15 Oct 2019 10:33:13 +0100
-Subject: [PATCH 621/660] net: sfp: handle module remove outside state machine
-
-Removing a module resets the module state machine back to its initial
-state. Rather than explicitly handling this in every state, handle it
-early on outside of the state machine.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1565,6 +1565,14 @@ static void sfp_sm_device(struct sfp *sf
- */
- static void sfp_sm_module(struct sfp *sfp, unsigned int event)
- {
-+ /* Handle remove event globally, it resets this state machine */
-+ if (event == SFP_E_REMOVE) {
-+ if (sfp->sm_mod_state > SFP_MOD_PROBE)
-+ sfp_sm_mod_remove(sfp);
-+ sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-+ return;
-+ }
-+
- switch (sfp->sm_mod_state) {
- default:
- if (event == SFP_E_INSERT && sfp->attached) {
-@@ -1574,9 +1582,7 @@ static void sfp_sm_module(struct sfp *sf
- break;
-
- case SFP_MOD_PROBE:
-- if (event == SFP_E_REMOVE) {
-- sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-- } else if (event == SFP_E_TIMEOUT) {
-+ if (event == SFP_E_TIMEOUT) {
- int val = sfp_sm_mod_probe(sfp);
-
- if (val == 0)
-@@ -1598,10 +1604,6 @@ static void sfp_sm_module(struct sfp *sf
- /* fallthrough */
- case SFP_MOD_PRESENT:
- case SFP_MOD_ERROR:
-- if (event == SFP_E_REMOVE) {
-- sfp_sm_mod_remove(sfp);
-- sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-- }
- break;
- }
- }
diff --git a/target/linux/generic/backport-5.4/724-v5.5-net-sfp-rename-T_PROBE_WAIT-to-T_SERIAL.patch b/target/linux/generic/backport-5.4/724-v5.5-net-sfp-rename-T_PROBE_WAIT-to-T_SERIAL.patch
deleted file mode 100644
index 780e7d7876..0000000000
--- a/target/linux/generic/backport-5.4/724-v5.5-net-sfp-rename-T_PROBE_WAIT-to-T_SERIAL.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 615090acb3c0b41691f3a03522ea38350387c0e4 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 15 Oct 2019 10:54:15 +0100
-Subject: [PATCH 622/660] net: sfp: rename T_PROBE_WAIT to T_SERIAL
-
-SFF-8472 rev 12.2 defines the time for the serial bus to become ready
-using t_serial. Use this as our identifier for this timeout to make
-it clear what we are referring to.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 13 ++++++-------
- 1 file changed, 6 insertions(+), 7 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -149,11 +149,10 @@ static const enum gpiod_flags gpio_flags
- * the same length on the PCB, which means it's possible for MOD DEF 0 to
- * connect before the I2C bus on MOD DEF 1/2.
- *
-- * The SFP MSA specifies 300ms as t_init (the time taken for TX_FAULT to
-- * be deasserted) but makes no mention of the earliest time before we can
-- * access the I2C EEPROM. However, Avago modules require 300ms.
-+ * The SFF-8472 specifies t_serial ("Time from power on until module is
-+ * ready for data transmission over the two wire serial bus.") as 300ms.
- */
--#define T_PROBE_INIT msecs_to_jiffies(300)
-+#define T_SERIAL msecs_to_jiffies(300)
- #define T_HPOWER_LEVEL msecs_to_jiffies(300)
- #define T_PROBE_RETRY msecs_to_jiffies(100)
-
-@@ -1560,8 +1559,8 @@ static void sfp_sm_device(struct sfp *sf
- }
- }
-
--/* This state machine tracks the insert/remove state of
-- * the module, and handles probing the on-board EEPROM.
-+/* This state machine tracks the insert/remove state of the module, probes
-+ * the on-board EEPROM, and sets up the power level.
- */
- static void sfp_sm_module(struct sfp *sfp, unsigned int event)
- {
-@@ -1577,7 +1576,7 @@ static void sfp_sm_module(struct sfp *sf
- default:
- if (event == SFP_E_INSERT && sfp->attached) {
- sfp_module_tx_disable(sfp);
-- sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT);
-+ sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
- }
- break;
-
diff --git a/target/linux/generic/backport-5.4/725-v5.5-net-sfp-parse-SFP-power-requirement-earlier.patch b/target/linux/generic/backport-5.4/725-v5.5-net-sfp-parse-SFP-power-requirement-earlier.patch
deleted file mode 100644
index df5ef9f79e..0000000000
--- a/target/linux/generic/backport-5.4/725-v5.5-net-sfp-parse-SFP-power-requirement-earlier.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From d4b8746219e8c0361e5ed6e440ab3a8a600d1f76 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 11 Oct 2019 17:24:40 +0100
-Subject: [PATCH 623/660] net: sfp: parse SFP power requirement earlier
-
-Parse the SFP power requirement earlier, in preparation for moving the
-power level setup code.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 42 +++++++++++++++++++++++++++++-------------
- 1 file changed, 29 insertions(+), 13 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -198,6 +198,8 @@ struct sfp {
- unsigned int sm_retries;
-
- struct sfp_eeprom_id id;
-+ unsigned int module_power_mW;
-+
- #if IS_ENABLED(CONFIG_HWMON)
- struct sfp_diag diag;
- struct device *hwmon_dev;
-@@ -1374,17 +1376,14 @@ static void sfp_sm_mod_init(struct sfp *
- sfp_sm_probe_phy(sfp);
- }
-
--static int sfp_sm_mod_hpower(struct sfp *sfp)
-+static int sfp_module_parse_power(struct sfp *sfp)
- {
-- u32 power;
-- u8 val;
-- int err;
-+ u32 power_mW = 1000;
-
-- power = 1000;
- if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
-- power = 1500;
-+ power_mW = 1500;
- if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
-- power = 2000;
-+ power_mW = 2000;
-
- if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
- (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) !=
-@@ -1393,23 +1392,33 @@ static int sfp_sm_mod_hpower(struct sfp
- * or requires an address change sequence, so assume that
- * the module powers up in the indicated power mode.
- */
-- if (power > sfp->max_power_mW) {
-+ if (power_mW > sfp->max_power_mW) {
- dev_err(sfp->dev,
- "Host does not support %u.%uW modules\n",
-- power / 1000, (power / 100) % 10);
-+ power_mW / 1000, (power_mW / 100) % 10);
- return -EINVAL;
- }
- return 0;
- }
-
-- if (power > sfp->max_power_mW) {
-+ if (power_mW > sfp->max_power_mW) {
- dev_warn(sfp->dev,
- "Host does not support %u.%uW modules, module left in power mode 1\n",
-- power / 1000, (power / 100) % 10);
-+ power_mW / 1000, (power_mW / 100) % 10);
- return 0;
- }
-
-- if (power <= 1000)
-+ sfp->module_power_mW = power_mW;
-+
-+ return 0;
-+}
-+
-+static int sfp_sm_mod_hpower(struct sfp *sfp)
-+{
-+ u8 val;
-+ int err;
-+
-+ if (sfp->module_power_mW <= 1000)
- return 0;
-
- err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
-@@ -1429,7 +1438,8 @@ static int sfp_sm_mod_hpower(struct sfp
- }
-
- dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
-- power / 1000, (power / 100) % 10);
-+ sfp->module_power_mW / 1000,
-+ (sfp->module_power_mW / 100) % 10);
- return T_HPOWER_LEVEL;
-
- err:
-@@ -1516,6 +1526,11 @@ static int sfp_sm_mod_probe(struct sfp *
- dev_warn(sfp->dev,
- "module address swap to access page 0xA2 is not supported.\n");
-
-+ /* Parse the module power requirement */
-+ ret = sfp_module_parse_power(sfp);
-+ if (ret < 0)
-+ return ret;
-+
- ret = sfp_hwmon_insert(sfp);
- if (ret < 0)
- return ret;
-@@ -1539,6 +1554,7 @@ static void sfp_sm_mod_remove(struct sfp
- sfp_module_tx_disable(sfp);
-
- memset(&sfp->id, 0, sizeof(sfp->id));
-+ sfp->module_power_mW = 0;
-
- dev_info(sfp->dev, "module removed\n");
- }
diff --git a/target/linux/generic/backport-5.4/726-v5.5-net-sfp-avoid-power-switch-on-address-change-modules.patch b/target/linux/generic/backport-5.4/726-v5.5-net-sfp-avoid-power-switch-on-address-change-modules.patch
deleted file mode 100644
index 5237f55055..0000000000
--- a/target/linux/generic/backport-5.4/726-v5.5-net-sfp-avoid-power-switch-on-address-change-modules.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From dca678b8838945572cf50584cb33a7199c1fd397 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 17 Oct 2019 00:24:18 +0100
-Subject: [PATCH 624/660] net: sfp: avoid power switch on address-change
- modules
-
-If the module indicates that it requires an address change sequence to
-switch between address 0x50 and 0x51, which we don't support, we can't
-write to the register that controls the power mode to switch to high
-power mode. Warn the user that the module may not be functional in
-this case, and don't try to change the power mode.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 31 ++++++++++++++++++++-----------
- 1 file changed, 20 insertions(+), 11 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1385,25 +1385,34 @@ static int sfp_module_parse_power(struct
- if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
- power_mW = 2000;
-
-- if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
-- (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) !=
-- SFP_DIAGMON_DDM) {
-- /* The module appears not to implement bus address 0xa2,
-- * or requires an address change sequence, so assume that
-- * the module powers up in the indicated power mode.
-- */
-- if (power_mW > sfp->max_power_mW) {
-+ if (power_mW > sfp->max_power_mW) {
-+ /* Module power specification exceeds the allowed maximum. */
-+ if (sfp->id.ext.sff8472_compliance ==
-+ SFP_SFF8472_COMPLIANCE_NONE &&
-+ !(sfp->id.ext.diagmon & SFP_DIAGMON_DDM)) {
-+ /* The module appears not to implement bus address
-+ * 0xa2, so assume that the module powers up in the
-+ * indicated mode.
-+ */
- dev_err(sfp->dev,
- "Host does not support %u.%uW modules\n",
- power_mW / 1000, (power_mW / 100) % 10);
- return -EINVAL;
-+ } else {
-+ dev_warn(sfp->dev,
-+ "Host does not support %u.%uW modules, module left in power mode 1\n",
-+ power_mW / 1000, (power_mW / 100) % 10);
-+ return 0;
- }
-- return 0;
- }
-
-- if (power_mW > sfp->max_power_mW) {
-+ /* If the module requires a higher power mode, but also requires
-+ * an address change sequence, warn the user that the module may
-+ * not be functional.
-+ */
-+ if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE && power_mW > 1000) {
- dev_warn(sfp->dev,
-- "Host does not support %u.%uW modules, module left in power mode 1\n",
-+ "Address Change Sequence not supported but module requies %u.%uW, module may not be functional\n",
- power_mW / 1000, (power_mW / 100) % 10);
- return 0;
- }
diff --git a/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch b/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch
deleted file mode 100644
index eebcac639f..0000000000
--- a/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From df5c4d93c5a59cba0f7479a4cd4e22b50726ce88 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 17 Oct 2019 11:12:42 +0100
-Subject: [PATCH 625/660] net: sfp: control TX_DISABLE and phy only from main
- state machine
-
-We initialise TX_DISABLE when the sfp cage is probed, and then
-maintain its state in the main state machine. However, the module
-state machine:
-- negates it when detecting a newly inserted module when it's already
- guaranteed to be negated.
-- negates it when the module is removed, but the main state machine
- will do this anyway.
-
-Make TX_DISABLE entirely controlled by the main state machine.
-
-The main state machine also probes the module for a PHY, and removes
-the PHY when the the module is removed. Hence, removing the PHY in
-sfp_sm_module_remove() is also redundant, and is a left-over from
-when we tried to probe for the PHY from the module state machine.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 9 +--------
- 1 file changed, 1 insertion(+), 8 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1557,11 +1557,6 @@ static void sfp_sm_mod_remove(struct sfp
-
- sfp_hwmon_remove(sfp);
-
-- if (sfp->mod_phy)
-- sfp_sm_phy_detach(sfp);
--
-- sfp_module_tx_disable(sfp);
--
- memset(&sfp->id, 0, sizeof(sfp->id));
- sfp->module_power_mW = 0;
-
-@@ -1599,10 +1594,8 @@ static void sfp_sm_module(struct sfp *sf
-
- switch (sfp->sm_mod_state) {
- default:
-- if (event == SFP_E_INSERT && sfp->attached) {
-- sfp_module_tx_disable(sfp);
-+ if (event == SFP_E_INSERT && sfp->attached)
- sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
-- }
- break;
-
- case SFP_MOD_PROBE:
diff --git a/target/linux/generic/backport-5.4/728-v5.5-net-sfp-split-the-PHY-probe-from-sfp_sm_mod_init.patch b/target/linux/generic/backport-5.4/728-v5.5-net-sfp-split-the-PHY-probe-from-sfp_sm_mod_init.patch
deleted file mode 100644
index 92df26c6a2..0000000000
--- a/target/linux/generic/backport-5.4/728-v5.5-net-sfp-split-the-PHY-probe-from-sfp_sm_mod_init.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 5ed0bd49b2d3ac4439c2d7f44e5a82b7cf6f409a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 18 Oct 2019 10:09:02 +0100
-Subject: [PATCH 626/660] net: sfp: split the PHY probe from sfp_sm_mod_init()
-
-Move the PHY probe into a separate function, splitting it from
-sfp_sm_mod_init(). This will allow us to eliminate the 50ms mdelay()
-inside the state machine.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 21 +++++++++++++--------
- 1 file changed, 13 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1353,14 +1353,10 @@ static void sfp_sm_fault(struct sfp *sfp
- static void sfp_sm_mod_init(struct sfp *sfp)
- {
- sfp_module_tx_enable(sfp);
-+}
-
-- /* Wait t_init before indicating that the link is up, provided the
-- * current state indicates no TX_FAULT. If TX_FAULT clears before
-- * this time, that's fine too.
-- */
-- sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
-- sfp->sm_retries = 5;
--
-+static void sfp_sm_probe_for_phy(struct sfp *sfp)
-+{
- /* Setting the serdes link mode is guesswork: there's no
- * field in the EEPROM which indicates what mode should
- * be used.
-@@ -1645,8 +1641,17 @@ static void sfp_sm_main(struct sfp *sfp,
- switch (sfp->sm_state) {
- case SFP_S_DOWN:
- if (sfp->sm_mod_state == SFP_MOD_PRESENT &&
-- sfp->sm_dev_state == SFP_DEV_UP)
-+ sfp->sm_dev_state == SFP_DEV_UP) {
- sfp_sm_mod_init(sfp);
-+ sfp_sm_probe_for_phy(sfp);
-+
-+ /* Wait t_init before indicating that the link is up,
-+ * provided the current state indicates no TX_FAULT. If
-+ * TX_FAULT clears before this time, that's fine too.
-+ */
-+ sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
-+ sfp->sm_retries = 5;
-+ }
- break;
-
- case SFP_S_INIT:
diff --git a/target/linux/generic/backport-5.4/729-v5.5-net-sfp-eliminate-mdelay-from-PHY-probe.patch b/target/linux/generic/backport-5.4/729-v5.5-net-sfp-eliminate-mdelay-from-PHY-probe.patch
deleted file mode 100644
index e26a7276d3..0000000000
--- a/target/linux/generic/backport-5.4/729-v5.5-net-sfp-eliminate-mdelay-from-PHY-probe.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From 0fe72afaa31f98ebd71bd6683fc47021105d0157 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 18 Oct 2019 10:21:46 +0100
-Subject: [PATCH 627/660] net: sfp: eliminate mdelay() from PHY probe
-
-Rather than using mdelay() to wait before probing the PHY (which holds
-several locks, including the rtnl lock), add an extra wait state to
-the state machine to introduce the 50ms delay without holding any
-locks.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 52 +++++++++++++++++++++++++++++++++----------
- 1 file changed, 40 insertions(+), 12 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -54,6 +54,7 @@ enum {
- SFP_DEV_UP,
-
- SFP_S_DOWN = 0,
-+ SFP_S_WAIT,
- SFP_S_INIT,
- SFP_S_WAIT_LOS,
- SFP_S_LINK_UP,
-@@ -110,6 +111,7 @@ static const char *event_to_str(unsigned
-
- static const char * const sm_state_strings[] = {
- [SFP_S_DOWN] = "down",
-+ [SFP_S_WAIT] = "wait",
- [SFP_S_INIT] = "init",
- [SFP_S_WAIT_LOS] = "wait_los",
- [SFP_S_LINK_UP] = "link_up",
-@@ -141,6 +143,7 @@ static const enum gpiod_flags gpio_flags
- GPIOD_ASIS,
- };
-
-+#define T_WAIT msecs_to_jiffies(50)
- #define T_INIT_JIFFIES msecs_to_jiffies(300)
- #define T_RESET_US 10
- #define T_FAULT_RECOVER msecs_to_jiffies(1000)
-@@ -161,9 +164,6 @@ static const enum gpiod_flags gpio_flags
- */
- #define SFP_PHY_ADDR 22
-
--/* Give this long for the PHY to reset. */
--#define T_PHY_RESET_MS 50
--
- struct sff_data {
- unsigned int gpios;
- bool (*module_supported)(const struct sfp_eeprom_id *id);
-@@ -1267,8 +1267,6 @@ static void sfp_sm_probe_phy(struct sfp
- struct phy_device *phy;
- int err;
-
-- msleep(T_PHY_RESET_MS);
--
- phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR);
- if (phy == ERR_PTR(-ENODEV)) {
- dev_info(sfp->dev, "no PHY detected\n");
-@@ -1623,6 +1621,8 @@ static void sfp_sm_module(struct sfp *sf
-
- static void sfp_sm_main(struct sfp *sfp, unsigned int event)
- {
-+ unsigned long timeout;
-+
- /* Some events are global */
- if (sfp->sm_state != SFP_S_DOWN &&
- (sfp->sm_mod_state != SFP_MOD_PRESENT ||
-@@ -1640,17 +1640,45 @@ static void sfp_sm_main(struct sfp *sfp,
- /* The main state machine */
- switch (sfp->sm_state) {
- case SFP_S_DOWN:
-- if (sfp->sm_mod_state == SFP_MOD_PRESENT &&
-- sfp->sm_dev_state == SFP_DEV_UP) {
-- sfp_sm_mod_init(sfp);
-- sfp_sm_probe_for_phy(sfp);
-+ if (sfp->sm_mod_state != SFP_MOD_PRESENT ||
-+ sfp->sm_dev_state != SFP_DEV_UP)
-+ break;
-+
-+ sfp_sm_mod_init(sfp);
-+
-+ /* Initialise the fault clearance retries */
-+ sfp->sm_retries = 5;
-+
-+ /* We need to check the TX_FAULT state, which is not defined
-+ * while TX_DISABLE is asserted. The earliest we want to do
-+ * anything (such as probe for a PHY) is 50ms.
-+ */
-+ sfp_sm_next(sfp, SFP_S_WAIT, T_WAIT);
-+ break;
-+
-+ case SFP_S_WAIT:
-+ if (event != SFP_E_TIMEOUT)
-+ break;
-+
-+ sfp_sm_probe_for_phy(sfp);
-
-+ if (sfp->state & SFP_F_TX_FAULT) {
- /* Wait t_init before indicating that the link is up,
- * provided the current state indicates no TX_FAULT. If
- * TX_FAULT clears before this time, that's fine too.
- */
-- sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
-- sfp->sm_retries = 5;
-+ timeout = T_INIT_JIFFIES;
-+ if (timeout > T_WAIT)
-+ timeout -= T_WAIT;
-+ else
-+ timeout = 1;
-+
-+ sfp_sm_next(sfp, SFP_S_INIT, timeout);
-+ } else {
-+ /* TX_FAULT is not asserted, assume the module has
-+ * finished initialising.
-+ */
-+ goto init_done;
- }
- break;
-
-@@ -1658,7 +1686,7 @@ static void sfp_sm_main(struct sfp *sfp,
- if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT)
- sfp_sm_fault(sfp, true);
- else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR)
-- sfp_sm_link_check_los(sfp);
-+ init_done: sfp_sm_link_check_los(sfp);
- break;
-
- case SFP_S_WAIT_LOS:
diff --git a/target/linux/generic/backport-5.4/730-v5.5-net-sfp-allow-fault-processing-to-transition-to-othe.patch b/target/linux/generic/backport-5.4/730-v5.5-net-sfp-allow-fault-processing-to-transition-to-othe.patch
deleted file mode 100644
index d45b0618bd..0000000000
--- a/target/linux/generic/backport-5.4/730-v5.5-net-sfp-allow-fault-processing-to-transition-to-othe.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From 2aa424ee7fbe43e2cd24e28c2f6388c4e1796bd2 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 18 Oct 2019 09:58:33 +0100
-Subject: [PATCH 628/660] net: sfp: allow fault processing to transition to
- other states
-
-Add the next state to sfp_sm_fault() so that it can branch to other
-states. This will be necessary to improve the initialisation path.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1334,7 +1334,7 @@ static bool sfp_los_event_inactive(struc
- event == SFP_E_LOS_LOW);
- }
-
--static void sfp_sm_fault(struct sfp *sfp, bool warn)
-+static void sfp_sm_fault(struct sfp *sfp, unsigned int next_state, bool warn)
- {
- if (sfp->sm_retries && !--sfp->sm_retries) {
- dev_err(sfp->dev,
-@@ -1344,7 +1344,7 @@ static void sfp_sm_fault(struct sfp *sfp
- if (warn)
- dev_err(sfp->dev, "module transmit fault indicated\n");
-
-- sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER);
-+ sfp_sm_next(sfp, next_state, T_FAULT_RECOVER);
- }
- }
-
-@@ -1684,14 +1684,14 @@ static void sfp_sm_main(struct sfp *sfp,
-
- case SFP_S_INIT:
- if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT)
-- sfp_sm_fault(sfp, true);
-+ sfp_sm_fault(sfp, SFP_S_TX_FAULT, true);
- else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR)
- init_done: sfp_sm_link_check_los(sfp);
- break;
-
- case SFP_S_WAIT_LOS:
- if (event == SFP_E_TX_FAULT)
-- sfp_sm_fault(sfp, true);
-+ sfp_sm_fault(sfp, SFP_S_TX_FAULT, true);
- else if (sfp_los_event_inactive(sfp, event))
- sfp_sm_link_up(sfp);
- break;
-@@ -1699,7 +1699,7 @@ static void sfp_sm_main(struct sfp *sfp,
- case SFP_S_LINK_UP:
- if (event == SFP_E_TX_FAULT) {
- sfp_sm_link_down(sfp);
-- sfp_sm_fault(sfp, true);
-+ sfp_sm_fault(sfp, SFP_S_TX_FAULT, true);
- } else if (sfp_los_event_active(sfp, event)) {
- sfp_sm_link_down(sfp);
- sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0);
-@@ -1715,7 +1715,7 @@ static void sfp_sm_main(struct sfp *sfp,
-
- case SFP_S_REINIT:
- if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
-- sfp_sm_fault(sfp, false);
-+ sfp_sm_fault(sfp, SFP_S_TX_FAULT, false);
- } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
- dev_info(sfp->dev, "module transmit fault recovered\n");
- sfp_sm_link_check_los(sfp);
diff --git a/target/linux/generic/backport-5.4/731-v5.5-net-sfp-ensure-TX_FAULT-has-deasserted-before-probin.patch b/target/linux/generic/backport-5.4/731-v5.5-net-sfp-ensure-TX_FAULT-has-deasserted-before-probin.patch
deleted file mode 100644
index acca29be87..0000000000
--- a/target/linux/generic/backport-5.4/731-v5.5-net-sfp-ensure-TX_FAULT-has-deasserted-before-probin.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 38b62a12231be4b86fc5ca5477579d29831c02a5 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 18 Oct 2019 10:31:07 +0100
-Subject: [PATCH 629/660] net: sfp: ensure TX_FAULT has deasserted before
- probing the PHY
-
-TX_FAULT should be deasserted to indicate that the module has completed
-its initialisation. This may include the on-board PHY, so wait until
-the module has deasserted TX_FAULT before probing the PHY.
-
-This means that we need an extra state to handle a TX_FAULT that
-remains set for longer than t_init, since using the existing handling
-state would bypass the PHY probe.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 31 +++++++++++++++++++++++++------
- 1 file changed, 25 insertions(+), 6 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -56,6 +56,7 @@ enum {
- SFP_S_DOWN = 0,
- SFP_S_WAIT,
- SFP_S_INIT,
-+ SFP_S_INIT_TX_FAULT,
- SFP_S_WAIT_LOS,
- SFP_S_LINK_UP,
- SFP_S_TX_FAULT,
-@@ -113,6 +114,7 @@ static const char * const sm_state_strin
- [SFP_S_DOWN] = "down",
- [SFP_S_WAIT] = "wait",
- [SFP_S_INIT] = "init",
-+ [SFP_S_INIT_TX_FAULT] = "init_tx_fault",
- [SFP_S_WAIT_LOS] = "wait_los",
- [SFP_S_LINK_UP] = "link_up",
- [SFP_S_TX_FAULT] = "tx_fault",
-@@ -1660,8 +1662,6 @@ static void sfp_sm_main(struct sfp *sfp,
- if (event != SFP_E_TIMEOUT)
- break;
-
-- sfp_sm_probe_for_phy(sfp);
--
- if (sfp->state & SFP_F_TX_FAULT) {
- /* Wait t_init before indicating that the link is up,
- * provided the current state indicates no TX_FAULT. If
-@@ -1683,10 +1683,29 @@ static void sfp_sm_main(struct sfp *sfp,
- break;
-
- case SFP_S_INIT:
-- if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT)
-- sfp_sm_fault(sfp, SFP_S_TX_FAULT, true);
-- else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR)
-- init_done: sfp_sm_link_check_los(sfp);
-+ if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
-+ /* TX_FAULT is still asserted after t_init, so assume
-+ * there is a fault.
-+ */
-+ sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
-+ sfp->sm_retries == 5);
-+ } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
-+ init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
-+ * clear. Probe for the PHY and check the LOS state.
-+ */
-+ sfp_sm_probe_for_phy(sfp);
-+ sfp_sm_link_check_los(sfp);
-+
-+ /* Reset the fault retry count */
-+ sfp->sm_retries = 5;
-+ }
-+ break;
-+
-+ case SFP_S_INIT_TX_FAULT:
-+ if (event == SFP_E_TIMEOUT) {
-+ sfp_module_tx_fault_reset(sfp);
-+ sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
-+ }
- break;
-
- case SFP_S_WAIT_LOS:
diff --git a/target/linux/generic/backport-5.4/732-v5.5-net-sfp-track-upstream-s-attachment-state-in-state-m.patch b/target/linux/generic/backport-5.4/732-v5.5-net-sfp-track-upstream-s-attachment-state-in-state-m.patch
deleted file mode 100644
index 714d783c4e..0000000000
--- a/target/linux/generic/backport-5.4/732-v5.5-net-sfp-track-upstream-s-attachment-state-in-state-m.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From ec6036a58f979c66bbd5cd9d0d1c783a98c2c644 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 12:57:40 +0000
-Subject: [PATCH 630/660] net: sfp: track upstream's attachment state in state
- machine
-
-Track the upstream's attachment state in the state machine rather than
-maintaining a boolean, which ensures that we have a strict order of
-ATTACH followed by an UP event - we can never believe that a newly
-attached upstream will be anything but down.
-
-Rearrange the order of state machines so we run the module state
-machine after the upstream device's state machine, so the module state
-machine can check the current state of the device and take action to
-e.g. reset back to empty state when the upstream is detached.
-
-This is to allow the module detection to run independently of the
-network device becoming available.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 42 +++++++++++++++++++++++++++++-------------
- 1 file changed, 29 insertions(+), 13 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -36,6 +36,8 @@ enum {
-
- SFP_E_INSERT = 0,
- SFP_E_REMOVE,
-+ SFP_E_DEV_ATTACH,
-+ SFP_E_DEV_DETACH,
- SFP_E_DEV_DOWN,
- SFP_E_DEV_UP,
- SFP_E_TX_FAULT,
-@@ -50,7 +52,8 @@ enum {
- SFP_MOD_PRESENT,
- SFP_MOD_ERROR,
-
-- SFP_DEV_DOWN = 0,
-+ SFP_DEV_DETACHED = 0,
-+ SFP_DEV_DOWN,
- SFP_DEV_UP,
-
- SFP_S_DOWN = 0,
-@@ -80,6 +83,7 @@ static const char *mod_state_to_str(unsi
- }
-
- static const char * const dev_state_strings[] = {
-+ [SFP_DEV_DETACHED] = "detached",
- [SFP_DEV_DOWN] = "down",
- [SFP_DEV_UP] = "up",
- };
-@@ -94,6 +98,8 @@ static const char *dev_state_to_str(unsi
- static const char * const event_strings[] = {
- [SFP_E_INSERT] = "insert",
- [SFP_E_REMOVE] = "remove",
-+ [SFP_E_DEV_ATTACH] = "dev_attach",
-+ [SFP_E_DEV_DETACH] = "dev_detach",
- [SFP_E_DEV_DOWN] = "dev_down",
- [SFP_E_DEV_UP] = "dev_up",
- [SFP_E_TX_FAULT] = "tx_fault",
-@@ -188,7 +194,6 @@ struct sfp {
- struct gpio_desc *gpio[GPIO_MAX];
- int gpio_irq[GPIO_MAX];
-
-- bool attached;
- struct mutex st_mutex; /* Protects state */
- unsigned int state;
- struct delayed_work poll;
-@@ -1559,17 +1564,26 @@ static void sfp_sm_mod_remove(struct sfp
- dev_info(sfp->dev, "module removed\n");
- }
-
--/* This state machine tracks the netdev up/down state */
-+/* This state machine tracks the upstream's state */
- static void sfp_sm_device(struct sfp *sfp, unsigned int event)
- {
- switch (sfp->sm_dev_state) {
- default:
-- if (event == SFP_E_DEV_UP)
-+ if (event == SFP_E_DEV_ATTACH)
-+ sfp->sm_dev_state = SFP_DEV_DOWN;
-+ break;
-+
-+ case SFP_DEV_DOWN:
-+ if (event == SFP_E_DEV_DETACH)
-+ sfp->sm_dev_state = SFP_DEV_DETACHED;
-+ else if (event == SFP_E_DEV_UP)
- sfp->sm_dev_state = SFP_DEV_UP;
- break;
-
- case SFP_DEV_UP:
-- if (event == SFP_E_DEV_DOWN)
-+ if (event == SFP_E_DEV_DETACH)
-+ sfp->sm_dev_state = SFP_DEV_DETACHED;
-+ else if (event == SFP_E_DEV_DOWN)
- sfp->sm_dev_state = SFP_DEV_DOWN;
- break;
- }
-@@ -1580,17 +1594,20 @@ static void sfp_sm_device(struct sfp *sf
- */
- static void sfp_sm_module(struct sfp *sfp, unsigned int event)
- {
-- /* Handle remove event globally, it resets this state machine */
-- if (event == SFP_E_REMOVE) {
-+ /* Handle remove event globally, it resets this state machine.
-+ * Also deal with upstream detachment.
-+ */
-+ if (event == SFP_E_REMOVE || sfp->sm_dev_state < SFP_DEV_DOWN) {
- if (sfp->sm_mod_state > SFP_MOD_PROBE)
- sfp_sm_mod_remove(sfp);
-- sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-+ if (sfp->sm_mod_state != SFP_MOD_EMPTY)
-+ sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
- return;
- }
-
- switch (sfp->sm_mod_state) {
- default:
-- if (event == SFP_E_INSERT && sfp->attached)
-+ if (event == SFP_E_INSERT)
- sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
- break;
-
-@@ -1756,8 +1773,8 @@ static void sfp_sm_event(struct sfp *sfp
- sm_state_to_str(sfp->sm_state),
- event_to_str(event));
-
-- sfp_sm_module(sfp, event);
- sfp_sm_device(sfp, event);
-+ sfp_sm_module(sfp, event);
- sfp_sm_main(sfp, event);
-
- dev_dbg(sfp->dev, "SM: exit %s:%s:%s\n",
-@@ -1770,15 +1787,14 @@ static void sfp_sm_event(struct sfp *sfp
-
- static void sfp_attach(struct sfp *sfp)
- {
-- sfp->attached = true;
-+ sfp_sm_event(sfp, SFP_E_DEV_ATTACH);
- if (sfp->state & SFP_F_PRESENT)
- sfp_sm_event(sfp, SFP_E_INSERT);
- }
-
- static void sfp_detach(struct sfp *sfp)
- {
-- sfp->attached = false;
-- sfp_sm_event(sfp, SFP_E_REMOVE);
-+ sfp_sm_event(sfp, SFP_E_DEV_DETACH);
- }
-
- static void sfp_start(struct sfp *sfp)
diff --git a/target/linux/generic/backport-5.4/733-v5.5-net-sfp-split-power-mode-switching-from-probe.patch b/target/linux/generic/backport-5.4/733-v5.5-net-sfp-split-power-mode-switching-from-probe.patch
deleted file mode 100644
index f645e44191..0000000000
--- a/target/linux/generic/backport-5.4/733-v5.5-net-sfp-split-power-mode-switching-from-probe.patch
+++ /dev/null
@@ -1,184 +0,0 @@
-From fdff863a4ce3677907f64396e34c45025abb6600 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 12:59:36 +0000
-Subject: [PATCH 631/660] net: sfp: split power mode switching from probe
-
-Switch the power mode switching from the probe, so that we don't
-repeatedly re-probe the SFP device if there is a problem accessing
-the registers at I2C address 0x51.
-
-In splitting this out, we can also fix a bug where we leave the module
-in high-power mode when the upstream device is detached but the module
-is still inserted.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 101 ++++++++++++++++++++++++++----------------
- 1 file changed, 64 insertions(+), 37 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -49,6 +49,7 @@ enum {
- SFP_MOD_EMPTY = 0,
- SFP_MOD_PROBE,
- SFP_MOD_HPOWER,
-+ SFP_MOD_WAITPWR,
- SFP_MOD_PRESENT,
- SFP_MOD_ERROR,
-
-@@ -71,6 +72,7 @@ static const char * const mod_state_str
- [SFP_MOD_EMPTY] = "empty",
- [SFP_MOD_PROBE] = "probe",
- [SFP_MOD_HPOWER] = "hpower",
-+ [SFP_MOD_WAITPWR] = "waitpwr",
- [SFP_MOD_PRESENT] = "present",
- [SFP_MOD_ERROR] = "error",
- };
-@@ -1423,37 +1425,34 @@ static int sfp_module_parse_power(struct
- return 0;
- }
-
--static int sfp_sm_mod_hpower(struct sfp *sfp)
-+static int sfp_sm_mod_hpower(struct sfp *sfp, bool enable)
- {
- u8 val;
- int err;
-
-- if (sfp->module_power_mW <= 1000)
-- return 0;
--
- err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
- if (err != sizeof(val)) {
- dev_err(sfp->dev, "Failed to read EEPROM: %d\n", err);
-- err = -EAGAIN;
-- goto err;
-+ return -EAGAIN;
- }
-
-- val |= BIT(0);
-+ if (enable)
-+ val |= BIT(0);
-+ else
-+ val &= ~BIT(0);
-
- err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
- if (err != sizeof(val)) {
- dev_err(sfp->dev, "Failed to write EEPROM: %d\n", err);
-- err = -EAGAIN;
-- goto err;
-+ return -EAGAIN;
- }
-
-- dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
-- sfp->module_power_mW / 1000,
-- (sfp->module_power_mW / 100) % 10);
-- return T_HPOWER_LEVEL;
-+ if (enable)
-+ dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
-+ sfp->module_power_mW / 1000,
-+ (sfp->module_power_mW / 100) % 10);
-
--err:
-- return err;
-+ return 0;
- }
-
- static int sfp_sm_mod_probe(struct sfp *sfp)
-@@ -1549,7 +1548,7 @@ static int sfp_sm_mod_probe(struct sfp *
- if (ret < 0)
- return ret;
-
-- return sfp_sm_mod_hpower(sfp);
-+ return 0;
- }
-
- static void sfp_sm_mod_remove(struct sfp *sfp)
-@@ -1594,13 +1593,22 @@ static void sfp_sm_device(struct sfp *sf
- */
- static void sfp_sm_module(struct sfp *sfp, unsigned int event)
- {
-- /* Handle remove event globally, it resets this state machine.
-- * Also deal with upstream detachment.
-- */
-- if (event == SFP_E_REMOVE || sfp->sm_dev_state < SFP_DEV_DOWN) {
-+ int err;
-+
-+ /* Handle remove event globally, it resets this state machine */
-+ if (event == SFP_E_REMOVE) {
- if (sfp->sm_mod_state > SFP_MOD_PROBE)
- sfp_sm_mod_remove(sfp);
-- if (sfp->sm_mod_state != SFP_MOD_EMPTY)
-+ sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-+ return;
-+ }
-+
-+ /* Handle device detach globally */
-+ if (sfp->sm_dev_state < SFP_DEV_DOWN) {
-+ if (sfp->module_power_mW > 1000 &&
-+ sfp->sm_mod_state > SFP_MOD_HPOWER)
-+ sfp_sm_mod_hpower(sfp, false);
-+ if (sfp->sm_mod_state > SFP_MOD_EMPTY)
- sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
- return;
- }
-@@ -1612,26 +1620,45 @@ static void sfp_sm_module(struct sfp *sf
- break;
-
- case SFP_MOD_PROBE:
-- if (event == SFP_E_TIMEOUT) {
-- int val = sfp_sm_mod_probe(sfp);
-+ if (event != SFP_E_TIMEOUT)
-+ break;
-
-- if (val == 0)
-- sfp_sm_mod_next(sfp, SFP_MOD_PRESENT, 0);
-- else if (val > 0)
-- sfp_sm_mod_next(sfp, SFP_MOD_HPOWER, val);
-- else if (val != -EAGAIN)
-- sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-- else
-- sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ err = sfp_sm_mod_probe(sfp);
-+ if (err == -EAGAIN) {
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ break;
- }
-- break;
-+ if (err < 0) {
-+ sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-+ break;
-+ }
-+
-+ /* If this is a power level 1 module, we are done */
-+ if (sfp->module_power_mW <= 1000)
-+ goto insert;
-
-+ sfp_sm_mod_next(sfp, SFP_MOD_HPOWER, 0);
-+ /* fall through */
- case SFP_MOD_HPOWER:
-- if (event == SFP_E_TIMEOUT) {
-- sfp_sm_mod_next(sfp, SFP_MOD_PRESENT, 0);
-+ /* Enable high power mode */
-+ err = sfp_sm_mod_hpower(sfp, true);
-+ if (err == 0)
-+ sfp_sm_mod_next(sfp, SFP_MOD_WAITPWR, T_HPOWER_LEVEL);
-+ else if (err != -EAGAIN)
-+ sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-+ else
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ break;
-+
-+ case SFP_MOD_WAITPWR:
-+ /* Wait for T_HPOWER_LEVEL to time out */
-+ if (event != SFP_E_TIMEOUT)
- break;
-- }
-- /* fallthrough */
-+
-+ insert:
-+ sfp_sm_mod_next(sfp, SFP_MOD_PRESENT, 0);
-+ break;
-+
- case SFP_MOD_PRESENT:
- case SFP_MOD_ERROR:
- break;
diff --git a/target/linux/generic/backport-5.4/734-v5.5-net-sfp-move-module-insert-reporting-out-of-probe.patch b/target/linux/generic/backport-5.4/734-v5.5-net-sfp-move-module-insert-reporting-out-of-probe.patch
deleted file mode 100644
index e49bde27e3..0000000000
--- a/target/linux/generic/backport-5.4/734-v5.5-net-sfp-move-module-insert-reporting-out-of-probe.patch
+++ /dev/null
@@ -1,159 +0,0 @@
-From 57cbf7453551db1df619b79410d79fc418d862d5 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 13:00:45 +0000
-Subject: [PATCH 632/660] net: sfp: move module insert reporting out of probe
-
-Move the module insertion reporting out of the probe handling, but
-after we have detected that the upstream has attached (since that is
-whom we are reporting insertion to.)
-
-Only report module removal if we had previously reported a module
-insertion.
-
-This gives cleaner semantics, and means we can probe the module before
-we have an upstream attached.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 58 +++++++++++++++++++++++++++++--------------
- 1 file changed, 40 insertions(+), 18 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -47,11 +47,12 @@ enum {
- SFP_E_TIMEOUT,
-
- SFP_MOD_EMPTY = 0,
-+ SFP_MOD_ERROR,
- SFP_MOD_PROBE,
-+ SFP_MOD_WAITDEV,
- SFP_MOD_HPOWER,
- SFP_MOD_WAITPWR,
- SFP_MOD_PRESENT,
-- SFP_MOD_ERROR,
-
- SFP_DEV_DETACHED = 0,
- SFP_DEV_DOWN,
-@@ -70,11 +71,12 @@ enum {
-
- static const char * const mod_state_strings[] = {
- [SFP_MOD_EMPTY] = "empty",
-+ [SFP_MOD_ERROR] = "error",
- [SFP_MOD_PROBE] = "probe",
-+ [SFP_MOD_WAITDEV] = "waitdev",
- [SFP_MOD_HPOWER] = "hpower",
- [SFP_MOD_WAITPWR] = "waitpwr",
- [SFP_MOD_PRESENT] = "present",
-- [SFP_MOD_ERROR] = "error",
- };
-
- static const char *mod_state_to_str(unsigned short mod_state)
-@@ -1544,16 +1546,13 @@ static int sfp_sm_mod_probe(struct sfp *
- if (ret < 0)
- return ret;
-
-- ret = sfp_module_insert(sfp->sfp_bus, &sfp->id);
-- if (ret < 0)
-- return ret;
--
- return 0;
- }
-
- static void sfp_sm_mod_remove(struct sfp *sfp)
- {
-- sfp_module_remove(sfp->sfp_bus);
-+ if (sfp->sm_mod_state > SFP_MOD_WAITDEV)
-+ sfp_module_remove(sfp->sfp_bus);
-
- sfp_hwmon_remove(sfp);
-
-@@ -1604,12 +1603,12 @@ static void sfp_sm_module(struct sfp *sf
- }
-
- /* Handle device detach globally */
-- if (sfp->sm_dev_state < SFP_DEV_DOWN) {
-+ if (sfp->sm_dev_state < SFP_DEV_DOWN &&
-+ sfp->sm_mod_state > SFP_MOD_WAITDEV) {
- if (sfp->module_power_mW > 1000 &&
- sfp->sm_mod_state > SFP_MOD_HPOWER)
- sfp_sm_mod_hpower(sfp, false);
-- if (sfp->sm_mod_state > SFP_MOD_EMPTY)
-- sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
-+ sfp_sm_mod_next(sfp, SFP_MOD_WAITDEV, 0);
- return;
- }
-
-@@ -1620,6 +1619,7 @@ static void sfp_sm_module(struct sfp *sf
- break;
-
- case SFP_MOD_PROBE:
-+ /* Wait for T_PROBE_INIT to time out */
- if (event != SFP_E_TIMEOUT)
- break;
-
-@@ -1633,6 +1633,20 @@ static void sfp_sm_module(struct sfp *sf
- break;
- }
-
-+ sfp_sm_mod_next(sfp, SFP_MOD_WAITDEV, 0);
-+ /* fall through */
-+ case SFP_MOD_WAITDEV:
-+ /* Ensure that the device is attached before proceeding */
-+ if (sfp->sm_dev_state < SFP_DEV_DOWN)
-+ break;
-+
-+ /* Report the module insertion to the upstream device */
-+ err = sfp_module_insert(sfp->sfp_bus, &sfp->id);
-+ if (err < 0) {
-+ sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-+ break;
-+ }
-+
- /* If this is a power level 1 module, we are done */
- if (sfp->module_power_mW <= 1000)
- goto insert;
-@@ -1642,12 +1656,17 @@ static void sfp_sm_module(struct sfp *sf
- case SFP_MOD_HPOWER:
- /* Enable high power mode */
- err = sfp_sm_mod_hpower(sfp, true);
-- if (err == 0)
-- sfp_sm_mod_next(sfp, SFP_MOD_WAITPWR, T_HPOWER_LEVEL);
-- else if (err != -EAGAIN)
-- sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-- else
-- sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ if (err < 0) {
-+ if (err != -EAGAIN) {
-+ sfp_module_remove(sfp->sfp_bus);
-+ sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-+ } else {
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ }
-+ break;
-+ }
-+
-+ sfp_sm_mod_next(sfp, SFP_MOD_WAITPWR, T_HPOWER_LEVEL);
- break;
-
- case SFP_MOD_WAITPWR:
-@@ -1815,8 +1834,6 @@ static void sfp_sm_event(struct sfp *sfp
- static void sfp_attach(struct sfp *sfp)
- {
- sfp_sm_event(sfp, SFP_E_DEV_ATTACH);
-- if (sfp->state & SFP_F_PRESENT)
-- sfp_sm_event(sfp, SFP_E_INSERT);
- }
-
- static void sfp_detach(struct sfp *sfp)
-@@ -2084,6 +2101,11 @@ static int sfp_probe(struct platform_dev
- sfp->state |= SFP_F_RATE_SELECT;
- sfp_set_state(sfp, sfp->state);
- sfp_module_tx_disable(sfp);
-+ if (sfp->state & SFP_F_PRESENT) {
-+ rtnl_lock();
-+ sfp_sm_event(sfp, SFP_E_INSERT);
-+ rtnl_unlock();
-+ }
-
- for (i = 0; i < GPIO_MAX; i++) {
- if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i])
diff --git a/target/linux/generic/backport-5.4/735-v5.5-net-sfp-allow-sfp-to-probe-slow-to-initialise-GPON-m.patch b/target/linux/generic/backport-5.4/735-v5.5-net-sfp-allow-sfp-to-probe-slow-to-initialise-GPON-m.patch
deleted file mode 100644
index ab1ae753d7..0000000000
--- a/target/linux/generic/backport-5.4/735-v5.5-net-sfp-allow-sfp-to-probe-slow-to-initialise-GPON-m.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From fb56cd08880aff8fb030e684fa4311bef712a499 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 13:02:30 +0000
-Subject: [PATCH 633/660] net: sfp: allow sfp to probe slow to initialise GPON
- modules
-
-Some GPON modules (e.g. Huawei MA5671A) take a significant amount of
-time to start responding on the I2C bus, contary to the SFF
-specifications.
-
-Work around this by implementing a two-level timeout strategy, where
-we initially quickly retry for the module, and then use a slower retry
-after we exceed a maximum number of quick attempts.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 38 ++++++++++++++++++++++++++++----------
- 1 file changed, 28 insertions(+), 10 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -167,9 +167,12 @@ static const enum gpiod_flags gpio_flags
- * The SFF-8472 specifies t_serial ("Time from power on until module is
- * ready for data transmission over the two wire serial bus.") as 300ms.
- */
--#define T_SERIAL msecs_to_jiffies(300)
--#define T_HPOWER_LEVEL msecs_to_jiffies(300)
--#define T_PROBE_RETRY msecs_to_jiffies(100)
-+#define T_SERIAL msecs_to_jiffies(300)
-+#define T_HPOWER_LEVEL msecs_to_jiffies(300)
-+#define T_PROBE_RETRY_INIT msecs_to_jiffies(100)
-+#define R_PROBE_RETRY_INIT 10
-+#define T_PROBE_RETRY_SLOW msecs_to_jiffies(5000)
-+#define R_PROBE_RETRY_SLOW 12
-
- /* SFP modules appear to always have their PHY configured for bus address
- * 0x56 (which with mdio-i2c, translates to a PHY address of 22).
-@@ -204,6 +207,8 @@ struct sfp {
- struct delayed_work timeout;
- struct mutex sm_mutex; /* Protects state machine */
- unsigned char sm_mod_state;
-+ unsigned char sm_mod_tries_init;
-+ unsigned char sm_mod_tries;
- unsigned char sm_dev_state;
- unsigned short sm_state;
- unsigned int sm_retries;
-@@ -1457,7 +1462,7 @@ static int sfp_sm_mod_hpower(struct sfp
- return 0;
- }
-
--static int sfp_sm_mod_probe(struct sfp *sfp)
-+static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
- {
- /* SFP module inserted - read I2C data */
- struct sfp_eeprom_id id;
-@@ -1467,7 +1472,8 @@ static int sfp_sm_mod_probe(struct sfp *
-
- ret = sfp_read(sfp, false, 0, &id, sizeof(id));
- if (ret < 0) {
-- dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret);
-+ if (report)
-+ dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret);
- return -EAGAIN;
- }
-
-@@ -1614,8 +1620,11 @@ static void sfp_sm_module(struct sfp *sf
-
- switch (sfp->sm_mod_state) {
- default:
-- if (event == SFP_E_INSERT)
-+ if (event == SFP_E_INSERT) {
- sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
-+ sfp->sm_mod_tries_init = R_PROBE_RETRY_INIT;
-+ sfp->sm_mod_tries = R_PROBE_RETRY_SLOW;
-+ }
- break;
-
- case SFP_MOD_PROBE:
-@@ -1623,10 +1632,19 @@ static void sfp_sm_module(struct sfp *sf
- if (event != SFP_E_TIMEOUT)
- break;
-
-- err = sfp_sm_mod_probe(sfp);
-+ err = sfp_sm_mod_probe(sfp, sfp->sm_mod_tries == 1);
- if (err == -EAGAIN) {
-- sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-- break;
-+ if (sfp->sm_mod_tries_init &&
-+ --sfp->sm_mod_tries_init) {
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY_INIT);
-+ break;
-+ } else if (sfp->sm_mod_tries && --sfp->sm_mod_tries) {
-+ if (sfp->sm_mod_tries == R_PROBE_RETRY_SLOW - 1)
-+ dev_warn(sfp->dev,
-+ "please wait, module slow to respond\n");
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY_SLOW);
-+ break;
-+ }
- }
- if (err < 0) {
- sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-@@ -1661,7 +1679,7 @@ static void sfp_sm_module(struct sfp *sf
- sfp_module_remove(sfp->sfp_bus);
- sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
- } else {
-- sfp_sm_set_timer(sfp, T_PROBE_RETRY);
-+ sfp_sm_set_timer(sfp, T_PROBE_RETRY_INIT);
- }
- break;
- }
diff --git a/target/linux/generic/backport-5.4/736-v5.5-net-sfp-allow-modules-with-slow-diagnostics-to-probe.patch b/target/linux/generic/backport-5.4/736-v5.5-net-sfp-allow-modules-with-slow-diagnostics-to-probe.patch
deleted file mode 100644
index e6c1fd71d8..0000000000
--- a/target/linux/generic/backport-5.4/736-v5.5-net-sfp-allow-modules-with-slow-diagnostics-to-probe.patch
+++ /dev/null
@@ -1,198 +0,0 @@
-From 559391fc20fae506adcb311b904cc544c76436c0 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 7 Nov 2019 18:52:07 +0000
-Subject: [PATCH 634/660] net: sfp: allow modules with slow diagnostics to
- probe
-
-When a module is inserted, we attempt to read read the ID from address
-0x50. Once we are able to read the ID, we immediately attempt to
-initialise the hwmon support by reading from address 0x51. If this
-fails, then we fall into error state, and assume that the module is
-not usable.
-
-Modules such as the ALCATELLUCENT 3FE46541AA use a real EEPROM for
-I2C address 0x50, which responds immediately. However, address 0x51
-is an emulated, which only becomes available once the on-board firmware
-has booted. This prompts us to fall into the error state.
-
-Since the module may be usable without diagnostics, arrange for the
-hwmon probe independent of the rest of the SFP itself, retrying every
-5s for up to about 60s for the monitoring to become available, and
-print an error message if it doesn't become available.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 96 +++++++++++++++++++++++++++++++++----------
- 1 file changed, 74 insertions(+), 22 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -218,6 +218,8 @@ struct sfp {
-
- #if IS_ENABLED(CONFIG_HWMON)
- struct sfp_diag diag;
-+ struct delayed_work hwmon_probe;
-+ unsigned int hwmon_tries;
- struct device *hwmon_dev;
- char *hwmon_name;
- #endif
-@@ -1159,29 +1161,27 @@ static const struct hwmon_chip_info sfp_
- .info = sfp_hwmon_info,
- };
-
--static int sfp_hwmon_insert(struct sfp *sfp)
-+static void sfp_hwmon_probe(struct work_struct *work)
- {
-+ struct sfp *sfp = container_of(work, struct sfp, hwmon_probe.work);
- int err, i;
-
-- if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE)
-- return 0;
--
-- if (!(sfp->id.ext.diagmon & SFP_DIAGMON_DDM))
-- return 0;
--
-- if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)
-- /* This driver in general does not support address
-- * change.
-- */
-- return 0;
--
- err = sfp_read(sfp, true, 0, &sfp->diag, sizeof(sfp->diag));
-- if (err < 0)
-- return err;
-+ if (err < 0) {
-+ if (sfp->hwmon_tries--) {
-+ mod_delayed_work(system_wq, &sfp->hwmon_probe,
-+ T_PROBE_RETRY_SLOW);
-+ } else {
-+ dev_warn(sfp->dev, "hwmon probe failed: %d\n", err);
-+ }
-+ return;
-+ }
-
- sfp->hwmon_name = kstrdup(dev_name(sfp->dev), GFP_KERNEL);
-- if (!sfp->hwmon_name)
-- return -ENODEV;
-+ if (!sfp->hwmon_name) {
-+ dev_err(sfp->dev, "out of memory for hwmon name\n");
-+ return;
-+ }
-
- for (i = 0; sfp->hwmon_name[i]; i++)
- if (hwmon_is_bad_char(sfp->hwmon_name[i]))
-@@ -1191,18 +1191,52 @@ static int sfp_hwmon_insert(struct sfp *
- sfp->hwmon_name, sfp,
- &sfp_hwmon_chip_info,
- NULL);
-+ if (IS_ERR(sfp->hwmon_dev))
-+ dev_err(sfp->dev, "failed to register hwmon device: %ld\n",
-+ PTR_ERR(sfp->hwmon_dev));
-+}
-+
-+static int sfp_hwmon_insert(struct sfp *sfp)
-+{
-+ if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE)
-+ return 0;
-+
-+ if (!(sfp->id.ext.diagmon & SFP_DIAGMON_DDM))
-+ return 0;
-+
-+ if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)
-+ /* This driver in general does not support address
-+ * change.
-+ */
-+ return 0;
-+
-+ mod_delayed_work(system_wq, &sfp->hwmon_probe, 1);
-+ sfp->hwmon_tries = R_PROBE_RETRY_SLOW;
-
-- return PTR_ERR_OR_ZERO(sfp->hwmon_dev);
-+ return 0;
- }
-
- static void sfp_hwmon_remove(struct sfp *sfp)
- {
-+ cancel_delayed_work_sync(&sfp->hwmon_probe);
- if (!IS_ERR_OR_NULL(sfp->hwmon_dev)) {
- hwmon_device_unregister(sfp->hwmon_dev);
- sfp->hwmon_dev = NULL;
- kfree(sfp->hwmon_name);
- }
- }
-+
-+static int sfp_hwmon_init(struct sfp *sfp)
-+{
-+ INIT_DELAYED_WORK(&sfp->hwmon_probe, sfp_hwmon_probe);
-+
-+ return 0;
-+}
-+
-+static void sfp_hwmon_exit(struct sfp *sfp)
-+{
-+ cancel_delayed_work_sync(&sfp->hwmon_probe);
-+}
- #else
- static int sfp_hwmon_insert(struct sfp *sfp)
- {
-@@ -1212,6 +1246,15 @@ static int sfp_hwmon_insert(struct sfp *
- static void sfp_hwmon_remove(struct sfp *sfp)
- {
- }
-+
-+static int sfp_hwmon_init(struct sfp *sfp)
-+{
-+ return 0;
-+}
-+
-+static void sfp_hwmon_exit(struct sfp *sfp)
-+{
-+}
- #endif
-
- /* Helpers */
-@@ -1548,10 +1591,6 @@ static int sfp_sm_mod_probe(struct sfp *
- if (ret < 0)
- return ret;
-
-- ret = sfp_hwmon_insert(sfp);
-- if (ret < 0)
-- return ret;
--
- return 0;
- }
-
-@@ -1700,6 +1739,15 @@ static void sfp_sm_module(struct sfp *sf
- case SFP_MOD_ERROR:
- break;
- }
-+
-+#if IS_ENABLED(CONFIG_HWMON)
-+ if (sfp->sm_mod_state >= SFP_MOD_WAITDEV &&
-+ IS_ERR_OR_NULL(sfp->hwmon_dev)) {
-+ err = sfp_hwmon_insert(sfp);
-+ if (err)
-+ dev_warn(sfp->dev, "hwmon probe failed: %d\n", err);
-+ }
-+#endif
- }
-
- static void sfp_sm_main(struct sfp *sfp, unsigned int event)
-@@ -2001,6 +2049,8 @@ static struct sfp *sfp_alloc(struct devi
- INIT_DELAYED_WORK(&sfp->poll, sfp_poll);
- INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout);
-
-+ sfp_hwmon_init(sfp);
-+
- return sfp;
- }
-
-@@ -2008,6 +2058,8 @@ static void sfp_cleanup(void *data)
- {
- struct sfp *sfp = data;
-
-+ sfp_hwmon_exit(sfp);
-+
- cancel_delayed_work_sync(&sfp->poll);
- cancel_delayed_work_sync(&sfp->timeout);
- if (sfp->i2c_mii) {
diff --git a/target/linux/generic/backport-5.4/737-v5.5-net-phy-add-core-phylib-sfp-support.patch b/target/linux/generic/backport-5.4/737-v5.5-net-phy-add-core-phylib-sfp-support.patch
deleted file mode 100644
index edfe151725..0000000000
--- a/target/linux/generic/backport-5.4/737-v5.5-net-phy-add-core-phylib-sfp-support.patch
+++ /dev/null
@@ -1,183 +0,0 @@
-From eb156db588ac583cdae7b91eaac9c0ad3a358e63 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sun, 15 Sep 2019 20:05:34 +0100
-Subject: [PATCH 635/660] net: phy: add core phylib sfp support
-
-Add core phylib help for supporting SFP sockets on PHYs. This provides
-a mechanism to inform the SFP layer about PHY up/down events, and also
-unregister the SFP bus when the PHY is going away.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy.c | 7 ++++
- drivers/net/phy/phy_device.c | 66 ++++++++++++++++++++++++++++++++++++
- include/linux/phy.h | 11 ++++++
- 3 files changed, 84 insertions(+)
-
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -23,6 +23,7 @@
- #include <linux/ethtool.h>
- #include <linux/phy.h>
- #include <linux/phy_led_triggers.h>
-+#include <linux/sfp.h>
- #include <linux/workqueue.h>
- #include <linux/mdio.h>
- #include <linux/io.h>
-@@ -863,6 +864,9 @@ void phy_stop(struct phy_device *phydev)
-
- mutex_lock(&phydev->lock);
-
-+ if (phydev->sfp_bus)
-+ sfp_upstream_stop(phydev->sfp_bus);
-+
- phydev->state = PHY_HALTED;
-
- mutex_unlock(&phydev->lock);
-@@ -925,6 +929,9 @@ void phy_state_machine(struct work_struc
-
- old_state = phydev->state;
-
-+ if (phydev->sfp_bus)
-+ sfp_upstream_start(phydev->sfp_bus);
-+
- switch (phydev->state) {
- case PHY_DOWN:
- case PHY_READY:
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -27,6 +27,7 @@
- #include <linux/bitmap.h>
- #include <linux/phy.h>
- #include <linux/phy_led_triggers.h>
-+#include <linux/sfp.h>
- #include <linux/mdio.h>
- #include <linux/io.h>
- #include <linux/uaccess.h>
-@@ -1185,6 +1186,65 @@ phy_standalone_show(struct device *dev,
- static DEVICE_ATTR_RO(phy_standalone);
-
- /**
-+ * phy_sfp_attach - attach the SFP bus to the PHY upstream network device
-+ * @upstream: pointer to the phy device
-+ * @bus: sfp bus representing cage being attached
-+ *
-+ * This is used to fill in the sfp_upstream_ops .attach member.
-+ */
-+void phy_sfp_attach(void *upstream, struct sfp_bus *bus)
-+{
-+ struct phy_device *phydev = upstream;
-+
-+ if (phydev->attached_dev)
-+ phydev->attached_dev->sfp_bus = bus;
-+ phydev->sfp_bus_attached = true;
-+}
-+EXPORT_SYMBOL(phy_sfp_attach);
-+
-+/**
-+ * phy_sfp_detach - detach the SFP bus from the PHY upstream network device
-+ * @upstream: pointer to the phy device
-+ * @bus: sfp bus representing cage being attached
-+ *
-+ * This is used to fill in the sfp_upstream_ops .detach member.
-+ */
-+void phy_sfp_detach(void *upstream, struct sfp_bus *bus)
-+{
-+ struct phy_device *phydev = upstream;
-+
-+ if (phydev->attached_dev)
-+ phydev->attached_dev->sfp_bus = NULL;
-+ phydev->sfp_bus_attached = false;
-+}
-+EXPORT_SYMBOL(phy_sfp_detach);
-+
-+/**
-+ * phy_sfp_probe - probe for a SFP cage attached to this PHY device
-+ * @phydev: Pointer to phy_device
-+ * @ops: SFP's upstream operations
-+ */
-+int phy_sfp_probe(struct phy_device *phydev,
-+ const struct sfp_upstream_ops *ops)
-+{
-+ struct sfp_bus *bus;
-+ int ret;
-+
-+ if (phydev->mdio.dev.fwnode) {
-+ bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode);
-+ if (IS_ERR(bus))
-+ return PTR_ERR(bus);
-+
-+ phydev->sfp_bus = bus;
-+
-+ ret = sfp_bus_add_upstream(bus, phydev, ops);
-+ sfp_bus_put(bus);
-+ }
-+ return 0;
-+}
-+EXPORT_SYMBOL(phy_sfp_probe);
-+
-+/**
- * phy_attach_direct - attach a network device to a given PHY device pointer
- * @dev: network device to attach
- * @phydev: Pointer to phy_device to attach
-@@ -1261,6 +1321,9 @@ int phy_attach_direct(struct net_device
- dev->phydev = phydev;
- }
-
-+ if (phydev->sfp_bus_attached)
-+ dev->sfp_bus = phydev->sfp_bus;
-+
- /* Some Ethernet drivers try to connect to a PHY device before
- * calling register_netdevice() -> netdev_register_kobject() and
- * does the dev->dev.kobj initialization. Here we only check for
-@@ -2291,6 +2354,9 @@ static int phy_remove(struct device *dev
- phydev->state = PHY_DOWN;
- mutex_unlock(&phydev->lock);
-
-+ sfp_bus_del_upstream(phydev->sfp_bus);
-+ phydev->sfp_bus = NULL;
-+
- if (phydev->drv && phydev->drv->remove) {
- phydev->drv->remove(phydev);
-
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -203,6 +203,8 @@ static inline const char *phy_modes(phy_
-
- struct device;
- struct phylink;
-+struct sfp_bus;
-+struct sfp_upstream_ops;
- struct sk_buff;
-
- /*
-@@ -343,6 +345,8 @@ struct phy_c45_device_ids {
- * dev_flags: Device-specific flags used by the PHY driver.
- * irq: IRQ number of the PHY's interrupt (-1 if none)
- * phy_timer: The timer for handling the state machine
-+ * sfp_bus_attached: flag indicating whether the SFP bus has been attached
-+ * sfp_bus: SFP bus attached to this PHY's fiber port
- * attached_dev: The attached enet driver's device instance ptr
- * adjust_link: Callback for the enet controller to respond to
- * changes in the link state.
-@@ -434,6 +438,9 @@ struct phy_device {
-
- struct mutex lock;
-
-+ /* This may be modified under the rtnl lock */
-+ bool sfp_bus_attached;
-+ struct sfp_bus *sfp_bus;
- struct phylink *phylink;
- struct net_device *attached_dev;
-
-@@ -1023,6 +1030,10 @@ int phy_suspend(struct phy_device *phyde
- int phy_resume(struct phy_device *phydev);
- int __phy_resume(struct phy_device *phydev);
- int phy_loopback(struct phy_device *phydev, bool enable);
-+void phy_sfp_attach(void *upstream, struct sfp_bus *bus);
-+void phy_sfp_detach(void *upstream, struct sfp_bus *bus);
-+int phy_sfp_probe(struct phy_device *phydev,
-+ const struct sfp_upstream_ops *ops);
- struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
- phy_interface_t interface);
- struct phy_device *phy_find_first(struct mii_bus *bus);
diff --git a/target/linux/generic/backport-5.4/738-v5.5-net-phy-marvell10g-add-SFP-support.patch b/target/linux/generic/backport-5.4/738-v5.5-net-phy-marvell10g-add-SFP-support.patch
deleted file mode 100644
index 40a666a3f2..0000000000
--- a/target/linux/generic/backport-5.4/738-v5.5-net-phy-marvell10g-add-SFP-support.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From 0836d9fb41ed90090ef4af0d7abe784ee7706f80 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 14 Apr 2017 14:21:25 +0100
-Subject: [PATCH 636/660] net: phy: marvell10g: add SFP+ support
-
-Add support for SFP+ cages to the Marvell 10G PHY driver. This is
-slightly complicated by the way phylib works in that we need to use
-a multi-step process to attach the SFP bus, and we also need to track
-the phylink state machine to know when the module's transmit disable
-signal should change state.
-
-With appropriate DT changes, this allows the SFP+ canges on the
-Macchiatobin platform to be functional.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/marvell10g.c | 25 ++++++++++++++++++++++++-
- 1 file changed, 24 insertions(+), 1 deletion(-)
-
---- a/drivers/net/phy/marvell10g.c
-+++ b/drivers/net/phy/marvell10g.c
-@@ -26,6 +26,7 @@
- #include <linux/hwmon.h>
- #include <linux/marvell_phy.h>
- #include <linux/phy.h>
-+#include <linux/sfp.h>
-
- #define MV_PHY_ALASKA_NBT_QUIRK_MASK 0xfffffffe
- #define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa)
-@@ -206,6 +207,28 @@ static int mv3310_hwmon_probe(struct phy
- }
- #endif
-
-+static int mv3310_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
-+{
-+ struct phy_device *phydev = upstream;
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
-+ phy_interface_t iface;
-+
-+ sfp_parse_support(phydev->sfp_bus, id, support);
-+ iface = sfp_select_interface(phydev->sfp_bus, id, support);
-+
-+ if (iface != PHY_INTERFACE_MODE_10GKR) {
-+ dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static const struct sfp_upstream_ops mv3310_sfp_ops = {
-+ .attach = phy_sfp_attach,
-+ .detach = phy_sfp_detach,
-+ .module_insert = mv3310_sfp_insert,
-+};
-+
- static int mv3310_probe(struct phy_device *phydev)
- {
- struct mv3310_priv *priv;
-@@ -236,7 +259,7 @@ static int mv3310_probe(struct phy_devic
- if (ret)
- return ret;
-
-- return 0;
-+ return phy_sfp_probe(phydev, &mv3310_sfp_ops);
- }
-
- static int mv3310_suspend(struct phy_device *phydev)
diff --git a/target/linux/generic/backport-5.4/739-v5.5-net-phylink-update-to-use-phy_support_asym_pause.patch b/target/linux/generic/backport-5.4/739-v5.5-net-phylink-update-to-use-phy_support_asym_pause.patch
deleted file mode 100644
index 84a8214ca5..0000000000
--- a/target/linux/generic/backport-5.4/739-v5.5-net-phylink-update-to-use-phy_support_asym_pause.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 09d7d8395ec61fba4392b35baa6f71c4e36489df Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 8 Nov 2019 15:18:02 +0000
-Subject: [PATCH 637/660] net: phylink: update to use phy_support_asym_pause()
-
-Use phy_support_asym_pause() rather than open-coding it.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 17 +++++++----------
- 1 file changed, 7 insertions(+), 10 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -718,11 +718,6 @@ static int phylink_bringup_phy(struct ph
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
- int ret;
-
-- memset(&config, 0, sizeof(config));
-- linkmode_copy(supported, phy->supported);
-- linkmode_copy(config.advertising, phy->advertising);
-- config.interface = pl->link_config.interface;
--
- /*
- * This is the new way of dealing with flow control for PHYs,
- * as described by Timur Tabi in commit 529ed1275263 ("net: phy:
-@@ -730,10 +725,12 @@ static int phylink_bringup_phy(struct ph
- * using our validate call to the MAC, we rely upon the MAC
- * clearing the bits from both supported and advertising fields.
- */
-- if (phylink_test(supported, Pause))
-- phylink_set(config.advertising, Pause);
-- if (phylink_test(supported, Asym_Pause))
-- phylink_set(config.advertising, Asym_Pause);
-+ phy_support_asym_pause(phy);
-+
-+ memset(&config, 0, sizeof(config));
-+ linkmode_copy(supported, phy->supported);
-+ linkmode_copy(config.advertising, phy->advertising);
-+ config.interface = pl->link_config.interface;
-
- ret = phylink_validate(pl, supported, &config);
- if (ret)
diff --git a/target/linux/generic/backport-5.4/744-v5.5-net-sfp-soft-status-and-control-support.patch b/target/linux/generic/backport-5.4/744-v5.5-net-sfp-soft-status-and-control-support.patch
deleted file mode 100644
index abc9f65f09..0000000000
--- a/target/linux/generic/backport-5.4/744-v5.5-net-sfp-soft-status-and-control-support.patch
+++ /dev/null
@@ -1,225 +0,0 @@
-From 40e0b3b15f7da92e6b065292b14af7b9bfb1c6e0 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 13 Sep 2019 23:00:35 +0100
-Subject: [PATCH 642/660] net: sfp: soft status and control support
-
-Add support for the soft status and control register, which allows
-TX_FAULT and RX_LOS to be monitored and TX_DISABLE to be set. We
-make use of this when the board does not support GPIOs for these
-signals.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 110 ++++++++++++++++++++++++++++++++++--------
- include/linux/sfp.h | 4 ++
- 2 files changed, 94 insertions(+), 20 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -201,7 +201,10 @@ struct sfp {
- struct gpio_desc *gpio[GPIO_MAX];
- int gpio_irq[GPIO_MAX];
-
-+ bool need_poll;
-+
- struct mutex st_mutex; /* Protects state */
-+ unsigned int state_soft_mask;
- unsigned int state;
- struct delayed_work poll;
- struct delayed_work timeout;
-@@ -395,24 +398,90 @@ static int sfp_i2c_configure(struct sfp
- }
-
- /* Interface */
--static unsigned int sfp_get_state(struct sfp *sfp)
-+static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len)
- {
-- return sfp->get_state(sfp);
-+ return sfp->read(sfp, a2, addr, buf, len);
- }
-
--static void sfp_set_state(struct sfp *sfp, unsigned int state)
-+static int sfp_write(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len)
- {
-- sfp->set_state(sfp, state);
-+ return sfp->write(sfp, a2, addr, buf, len);
- }
-
--static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len)
-+static unsigned int sfp_soft_get_state(struct sfp *sfp)
- {
-- return sfp->read(sfp, a2, addr, buf, len);
-+ unsigned int state = 0;
-+ u8 status;
-+
-+ if (sfp_read(sfp, true, SFP_STATUS, &status, sizeof(status)) ==
-+ sizeof(status)) {
-+ if (status & SFP_STATUS_RX_LOS)
-+ state |= SFP_F_LOS;
-+ if (status & SFP_STATUS_TX_FAULT)
-+ state |= SFP_F_TX_FAULT;
-+ }
-+
-+ return state & sfp->state_soft_mask;
- }
-
--static int sfp_write(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len)
-+static void sfp_soft_set_state(struct sfp *sfp, unsigned int state)
- {
-- return sfp->write(sfp, a2, addr, buf, len);
-+ u8 status;
-+
-+ if (sfp_read(sfp, true, SFP_STATUS, &status, sizeof(status)) ==
-+ sizeof(status)) {
-+ if (state & SFP_F_TX_DISABLE)
-+ status |= SFP_STATUS_TX_DISABLE_FORCE;
-+ else
-+ status &= ~SFP_STATUS_TX_DISABLE_FORCE;
-+
-+ sfp_write(sfp, true, SFP_STATUS, &status, sizeof(status));
-+ }
-+}
-+
-+static void sfp_soft_start_poll(struct sfp *sfp)
-+{
-+ const struct sfp_eeprom_id *id = &sfp->id;
-+
-+ sfp->state_soft_mask = 0;
-+ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_DISABLE &&
-+ !sfp->gpio[GPIO_TX_DISABLE])
-+ sfp->state_soft_mask |= SFP_F_TX_DISABLE;
-+ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_TX_FAULT &&
-+ !sfp->gpio[GPIO_TX_FAULT])
-+ sfp->state_soft_mask |= SFP_F_TX_FAULT;
-+ if (id->ext.enhopts & SFP_ENHOPTS_SOFT_RX_LOS &&
-+ !sfp->gpio[GPIO_LOS])
-+ sfp->state_soft_mask |= SFP_F_LOS;
-+
-+ if (sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT) &&
-+ !sfp->need_poll)
-+ mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
-+}
-+
-+static void sfp_soft_stop_poll(struct sfp *sfp)
-+{
-+ sfp->state_soft_mask = 0;
-+}
-+
-+static unsigned int sfp_get_state(struct sfp *sfp)
-+{
-+ unsigned int state = sfp->get_state(sfp);
-+
-+ if (state & SFP_F_PRESENT &&
-+ sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT))
-+ state |= sfp_soft_get_state(sfp);
-+
-+ return state;
-+}
-+
-+static void sfp_set_state(struct sfp *sfp, unsigned int state)
-+{
-+ sfp->set_state(sfp, state);
-+
-+ if (state & SFP_F_PRESENT &&
-+ sfp->state_soft_mask & SFP_F_TX_DISABLE)
-+ sfp_soft_set_state(sfp, state);
- }
-
- static unsigned int sfp_check(void *buf, size_t len)
-@@ -1407,11 +1476,6 @@ static void sfp_sm_fault(struct sfp *sfp
- }
- }
-
--static void sfp_sm_mod_init(struct sfp *sfp)
--{
-- sfp_module_tx_enable(sfp);
--}
--
- static void sfp_sm_probe_for_phy(struct sfp *sfp)
- {
- /* Setting the serdes link mode is guesswork: there's no
-@@ -1574,7 +1638,7 @@ static int sfp_sm_mod_probe(struct sfp *
- (int)sizeof(id.ext.datecode), id.ext.datecode);
-
- /* Check whether we support this module */
-- if (!sfp->type->module_supported(&sfp->id)) {
-+ if (!sfp->type->module_supported(&id)) {
- dev_err(sfp->dev,
- "module is not supported - phys id 0x%02x 0x%02x\n",
- sfp->id.base.phys_id, sfp->id.base.phys_ext_id);
-@@ -1764,6 +1828,7 @@ static void sfp_sm_main(struct sfp *sfp,
- if (sfp->mod_phy)
- sfp_sm_phy_detach(sfp);
- sfp_module_tx_disable(sfp);
-+ sfp_soft_stop_poll(sfp);
- sfp_sm_next(sfp, SFP_S_DOWN, 0);
- return;
- }
-@@ -1775,7 +1840,10 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp->sm_dev_state != SFP_DEV_UP)
- break;
-
-- sfp_sm_mod_init(sfp);
-+ if (!(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE))
-+ sfp_soft_start_poll(sfp);
-+
-+ sfp_module_tx_enable(sfp);
-
- /* Initialise the fault clearance retries */
- sfp->sm_retries = 5;
-@@ -2031,7 +2099,10 @@ static void sfp_poll(struct work_struct
- struct sfp *sfp = container_of(work, struct sfp, poll.work);
-
- sfp_check_state(sfp);
-- mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
-+
-+ if (sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT) ||
-+ sfp->need_poll)
-+ mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
- }
-
- static struct sfp *sfp_alloc(struct device *dev)
-@@ -2076,7 +2147,6 @@ static int sfp_probe(struct platform_dev
- const struct sff_data *sff;
- struct i2c_adapter *i2c;
- struct sfp *sfp;
-- bool poll = false;
- int err, i;
-
- sfp = sfp_alloc(&pdev->dev);
-@@ -2184,7 +2254,7 @@ static int sfp_probe(struct platform_dev
- sfp->gpio_irq[i] = gpiod_to_irq(sfp->gpio[i]);
- if (sfp->gpio_irq[i] < 0) {
- sfp->gpio_irq[i] = 0;
-- poll = true;
-+ sfp->need_poll = true;
- continue;
- }
-
-@@ -2196,11 +2266,11 @@ static int sfp_probe(struct platform_dev
- dev_name(sfp->dev), sfp);
- if (err) {
- sfp->gpio_irq[i] = 0;
-- poll = true;
-+ sfp->need_poll = true;
- }
- }
-
-- if (poll)
-+ if (sfp->need_poll)
- mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
-
- /* We could have an issue in cases no Tx disable pin is available or
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -428,6 +428,10 @@ enum {
- SFP_TEC_CUR = 0x6c,
-
- SFP_STATUS = 0x6e,
-+ SFP_STATUS_TX_DISABLE = BIT(7),
-+ SFP_STATUS_TX_DISABLE_FORCE = BIT(6),
-+ SFP_STATUS_TX_FAULT = BIT(2),
-+ SFP_STATUS_RX_LOS = BIT(1),
- SFP_ALARM0 = 0x70,
- SFP_ALARM0_TEMP_HIGH = BIT(7),
- SFP_ALARM0_TEMP_LOW = BIT(6),
diff --git a/target/linux/generic/backport-5.4/745-v5.7-net-dsa-mt7530-add-support-for-port-mirroring.patch b/target/linux/generic/backport-5.4/745-v5.7-net-dsa-mt7530-add-support-for-port-mirroring.patch
deleted file mode 100644
index 71a06997c3..0000000000
--- a/target/linux/generic/backport-5.4/745-v5.7-net-dsa-mt7530-add-support-for-port-mirroring.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From 37feab6076aa816ed72fe836759a485353241916 Mon Sep 17 00:00:00 2001
-From: DENG Qingfang <dqfext@gmail.com>
-Date: Fri, 6 Mar 2020 20:35:35 +0800
-Subject: net: dsa: mt7530: add support for port mirroring
-
-Add support for configuring port mirroring through the cls_matchall
-classifier. We do a full ingress and/or egress capture towards a
-capture port.
-MT7530 supports one monitor port and multiple mirrored ports.
-
-Signed-off-by: DENG Qingfang <dqfext@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mt7530.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
- drivers/net/dsa/mt7530.h | 7 ++++++
- 2 files changed, 67 insertions(+)
-
---- a/drivers/net/dsa/mt7530.c
-+++ b/drivers/net/dsa/mt7530.c
-@@ -1143,6 +1143,64 @@ mt7530_port_vlan_del(struct dsa_switch *
- return 0;
- }
-
-+static int mt7530_port_mirror_add(struct dsa_switch *ds, int port,
-+ struct dsa_mall_mirror_tc_entry *mirror,
-+ bool ingress)
-+{
-+ struct mt7530_priv *priv = ds->priv;
-+ u32 val;
-+
-+ /* Check for existent entry */
-+ if ((ingress ? priv->mirror_rx : priv->mirror_tx) & BIT(port))
-+ return -EEXIST;
-+
-+ val = mt7530_read(priv, MT7530_MFC);
-+
-+ /* MT7530 only supports one monitor port */
-+ if (val & MIRROR_EN && MIRROR_PORT(val) != mirror->to_local_port)
-+ return -EEXIST;
-+
-+ val |= MIRROR_EN;
-+ val &= ~MIRROR_MASK;
-+ val |= mirror->to_local_port;
-+ mt7530_write(priv, MT7530_MFC, val);
-+
-+ val = mt7530_read(priv, MT7530_PCR_P(port));
-+ if (ingress) {
-+ val |= PORT_RX_MIR;
-+ priv->mirror_rx |= BIT(port);
-+ } else {
-+ val |= PORT_TX_MIR;
-+ priv->mirror_tx |= BIT(port);
-+ }
-+ mt7530_write(priv, MT7530_PCR_P(port), val);
-+
-+ return 0;
-+}
-+
-+static void mt7530_port_mirror_del(struct dsa_switch *ds, int port,
-+ struct dsa_mall_mirror_tc_entry *mirror)
-+{
-+ struct mt7530_priv *priv = ds->priv;
-+ u32 val;
-+
-+ val = mt7530_read(priv, MT7530_PCR_P(port));
-+ if (mirror->ingress) {
-+ val &= ~PORT_RX_MIR;
-+ priv->mirror_rx &= ~BIT(port);
-+ } else {
-+ val &= ~PORT_TX_MIR;
-+ priv->mirror_tx &= ~BIT(port);
-+ }
-+ mt7530_write(priv, MT7530_PCR_P(port), val);
-+
-+ if (!priv->mirror_rx && !priv->mirror_tx) {
-+ val = mt7530_read(priv, MT7530_MFC);
-+ val &= ~MIRROR_EN;
-+ mt7530_write(priv, MT7530_MFC, val);
-+ }
-+}
-+
- static enum dsa_tag_protocol
- mtk_get_tag_protocol(struct dsa_switch *ds, int port)
- {
-@@ -1520,6 +1578,8 @@ static const struct dsa_switch_ops mt753
- .port_vlan_prepare = mt7530_port_vlan_prepare,
- .port_vlan_add = mt7530_port_vlan_add,
- .port_vlan_del = mt7530_port_vlan_del,
-+ .port_mirror_add = mt7530_port_mirror_add,
-+ .port_mirror_del = mt7530_port_mirror_del,
- .phylink_validate = mt7530_phylink_validate,
- .phylink_mac_link_state = mt7530_phylink_mac_link_state,
- .phylink_mac_config = mt7530_phylink_mac_config,
---- a/drivers/net/dsa/mt7530.h
-+++ b/drivers/net/dsa/mt7530.h
-@@ -37,6 +37,9 @@ enum {
- #define CPU_EN BIT(7)
- #define CPU_PORT(x) ((x) << 4)
- #define CPU_MASK (0xf << 4)
-+#define MIRROR_EN BIT(3)
-+#define MIRROR_PORT(x) ((x) & 0x7)
-+#define MIRROR_MASK 0x7
-
- /* Registers for address table access */
- #define MT7530_ATA1 0x74
-@@ -142,6 +145,8 @@ enum mt7530_stp_state {
-
- /* Register for port control */
- #define MT7530_PCR_P(x) (0x2004 + ((x) * 0x100))
-+#define PORT_TX_MIR BIT(9)
-+#define PORT_RX_MIR BIT(8)
- #define PORT_VLAN(x) ((x) & 0x3)
-
- enum mt7530_port_mode {
-@@ -464,6 +469,8 @@ struct mt7530_priv {
- phy_interface_t p6_interface;
- phy_interface_t p5_interface;
- unsigned int p5_intf_sel;
-+ u8 mirror_rx;
-+ u8 mirror_tx;
-
- struct mt7530_port ports[MT7530_NUM_PORTS];
- /* protect among processes for registers access*/
diff --git a/target/linux/generic/backport-5.4/746-v5.5-net-dsa-mv88e6xxx-Split-monitor-port-configuration.patch b/target/linux/generic/backport-5.4/746-v5.5-net-dsa-mv88e6xxx-Split-monitor-port-configuration.patch
deleted file mode 100644
index 683178727c..0000000000
--- a/target/linux/generic/backport-5.4/746-v5.5-net-dsa-mv88e6xxx-Split-monitor-port-configuration.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From 5c74c54ce6fff719999ff48f128cf4150ee4ff59 Mon Sep 17 00:00:00 2001
-From: Iwan R Timmer <irtimmer@gmail.com>
-Date: Thu, 7 Nov 2019 22:11:13 +0100
-Subject: [PATCH] net: dsa: mv88e6xxx: Split monitor port configuration
-
-Separate the configuration of the egress and ingress monitor port.
-This allows the port mirror functionality to do ingress and egress
-port mirroring to separate ports.
-
-Signed-off-by: Iwan R Timmer <irtimmer@gmail.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mv88e6xxx/chip.c | 9 ++++++-
- drivers/net/dsa/mv88e6xxx/chip.h | 9 ++++++-
- drivers/net/dsa/mv88e6xxx/global1.c | 42 ++++++++++++++++++++---------
- drivers/net/dsa/mv88e6xxx/global1.h | 8 ++++--
- 4 files changed, 52 insertions(+), 16 deletions(-)
-
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -2384,7 +2384,14 @@ static int mv88e6xxx_setup_upstream_port
-
- if (chip->info->ops->set_egress_port) {
- err = chip->info->ops->set_egress_port(chip,
-- upstream_port);
-+ MV88E6XXX_EGRESS_DIR_INGRESS,
-+ upstream_port);
-+ if (err)
-+ return err;
-+
-+ err = chip->info->ops->set_egress_port(chip,
-+ MV88E6XXX_EGRESS_DIR_EGRESS,
-+ upstream_port);
- if (err)
- return err;
- }
---- a/drivers/net/dsa/mv88e6xxx/chip.h
-+++ b/drivers/net/dsa/mv88e6xxx/chip.h
-@@ -33,6 +33,11 @@ enum mv88e6xxx_egress_mode {
- MV88E6XXX_EGRESS_MODE_ETHERTYPE,
- };
-
-+enum mv88e6xxx_egress_direction {
-+ MV88E6XXX_EGRESS_DIR_INGRESS,
-+ MV88E6XXX_EGRESS_DIR_EGRESS,
-+};
-+
- enum mv88e6xxx_frame_mode {
- MV88E6XXX_FRAME_MODE_NORMAL,
- MV88E6XXX_FRAME_MODE_DSA,
-@@ -464,7 +469,9 @@ struct mv88e6xxx_ops {
- int (*stats_get_stats)(struct mv88e6xxx_chip *chip, int port,
- uint64_t *data);
- int (*set_cpu_port)(struct mv88e6xxx_chip *chip, int port);
-- int (*set_egress_port)(struct mv88e6xxx_chip *chip, int port);
-+ int (*set_egress_port)(struct mv88e6xxx_chip *chip,
-+ enum mv88e6xxx_egress_direction direction,
-+ int port);
-
- #define MV88E6XXX_CASCADE_PORT_NONE 0xe
- #define MV88E6XXX_CASCADE_PORT_MULTIPLE 0xf
---- a/drivers/net/dsa/mv88e6xxx/global1.c
-+++ b/drivers/net/dsa/mv88e6xxx/global1.c
-@@ -294,7 +294,9 @@ int mv88e6250_g1_ieee_pri_map(struct mv8
- /* Offset 0x1a: Monitor Control */
- /* Offset 0x1a: Monitor & MGMT Control on some devices */
-
--int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
-+int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip,
-+ enum mv88e6xxx_egress_direction direction,
-+ int port)
- {
- u16 reg;
- int err;
-@@ -303,11 +305,20 @@ int mv88e6095_g1_set_egress_port(struct
- if (err)
- return err;
-
-- reg &= ~(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK |
-- MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
--
-- reg |= port << __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK) |
-- port << __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
-+ switch (direction) {
-+ case MV88E6XXX_EGRESS_DIR_INGRESS:
-+ reg &= MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
-+ reg |= port <<
-+ __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK);
-+ break;
-+ case MV88E6XXX_EGRESS_DIR_EGRESS:
-+ reg &= MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
-+ reg |= port <<
-+ __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-
- return mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
- }
-@@ -341,17 +352,24 @@ static int mv88e6390_g1_monitor_write(st
- return mv88e6xxx_g1_write(chip, MV88E6390_G1_MONITOR_MGMT_CTL, reg);
- }
-
--int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port)
-+int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip,
-+ enum mv88e6xxx_egress_direction direction,
-+ int port)
- {
- u16 ptr;
- int err;
-
-- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
-- err = mv88e6390_g1_monitor_write(chip, ptr, port);
-- if (err)
-- return err;
-+ switch (direction) {
-+ case MV88E6XXX_EGRESS_DIR_INGRESS:
-+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
-+ break;
-+ case MV88E6XXX_EGRESS_DIR_EGRESS:
-+ ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-
-- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
- err = mv88e6390_g1_monitor_write(chip, ptr, port);
- if (err)
- return err;
---- a/drivers/net/dsa/mv88e6xxx/global1.h
-+++ b/drivers/net/dsa/mv88e6xxx/global1.h
-@@ -289,8 +289,12 @@ int mv88e6095_g1_stats_set_histogram(str
- int mv88e6390_g1_stats_set_histogram(struct mv88e6xxx_chip *chip);
- void mv88e6xxx_g1_stats_read(struct mv88e6xxx_chip *chip, int stat, u32 *val);
- int mv88e6xxx_g1_stats_clear(struct mv88e6xxx_chip *chip);
--int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port);
--int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip, int port);
-+int mv88e6095_g1_set_egress_port(struct mv88e6xxx_chip *chip,
-+ enum mv88e6xxx_egress_direction direction,
-+ int port);
-+int mv88e6390_g1_set_egress_port(struct mv88e6xxx_chip *chip,
-+ enum mv88e6xxx_egress_direction direction,
-+ int port);
- int mv88e6095_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
- int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port);
- int mv88e6390_g1_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip);
diff --git a/target/linux/generic/backport-5.4/747-v5.5-net-dsa-mv88e6xxx-Add-support-for-port-mirroring.patch b/target/linux/generic/backport-5.4/747-v5.5-net-dsa-mv88e6xxx-Add-support-for-port-mirroring.patch
deleted file mode 100644
index a23f45075f..0000000000
--- a/target/linux/generic/backport-5.4/747-v5.5-net-dsa-mv88e6xxx-Add-support-for-port-mirroring.patch
+++ /dev/null
@@ -1,266 +0,0 @@
-From f0942e00a1abb6404ca4302c66497fc623676c11 Mon Sep 17 00:00:00 2001
-From: Iwan R Timmer <irtimmer@gmail.com>
-Date: Thu, 7 Nov 2019 22:11:14 +0100
-Subject: [PATCH] net: dsa: mv88e6xxx: Add support for port mirroring
-
-Add support for configuring port mirroring through the cls_matchall
-classifier. We do a full ingress and/or egress capture towards a
-capture port. It allows setting a different capture port for ingress
-and egress traffic.
-
-It keeps track of the mirrored ports and the destination ports to
-prevent changes to the capture port while other ports are being
-mirrored.
-
-Signed-off-by: Iwan R Timmer <irtimmer@gmail.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mv88e6xxx/chip.c | 76 +++++++++++++++++++++++++++++
- drivers/net/dsa/mv88e6xxx/chip.h | 6 +++
- drivers/net/dsa/mv88e6xxx/global1.c | 18 +++++--
- drivers/net/dsa/mv88e6xxx/port.c | 37 ++++++++++++++
- drivers/net/dsa/mv88e6xxx/port.h | 3 ++
- 5 files changed, 136 insertions(+), 4 deletions(-)
-
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -4926,6 +4926,80 @@ static int mv88e6xxx_port_mdb_del(struct
- return err;
- }
-
-+static int mv88e6xxx_port_mirror_add(struct dsa_switch *ds, int port,
-+ struct dsa_mall_mirror_tc_entry *mirror,
-+ bool ingress)
-+{
-+ enum mv88e6xxx_egress_direction direction = ingress ?
-+ MV88E6XXX_EGRESS_DIR_INGRESS :
-+ MV88E6XXX_EGRESS_DIR_EGRESS;
-+ struct mv88e6xxx_chip *chip = ds->priv;
-+ bool other_mirrors = false;
-+ int i;
-+ int err;
-+
-+ if (!chip->info->ops->set_egress_port)
-+ return -EOPNOTSUPP;
-+
-+ mutex_lock(&chip->reg_lock);
-+ if ((ingress ? chip->ingress_dest_port : chip->egress_dest_port) !=
-+ mirror->to_local_port) {
-+ for (i = 0; i < mv88e6xxx_num_ports(chip); i++)
-+ other_mirrors |= ingress ?
-+ chip->ports[i].mirror_ingress :
-+ chip->ports[i].mirror_egress;
-+
-+ /* Can't change egress port when other mirror is active */
-+ if (other_mirrors) {
-+ err = -EBUSY;
-+ goto out;
-+ }
-+
-+ err = chip->info->ops->set_egress_port(chip,
-+ direction,
-+ mirror->to_local_port);
-+ if (err)
-+ goto out;
-+ }
-+
-+ err = mv88e6xxx_port_set_mirror(chip, port, direction, true);
-+out:
-+ mutex_unlock(&chip->reg_lock);
-+
-+ return err;
-+}
-+
-+static void mv88e6xxx_port_mirror_del(struct dsa_switch *ds, int port,
-+ struct dsa_mall_mirror_tc_entry *mirror)
-+{
-+ enum mv88e6xxx_egress_direction direction = mirror->ingress ?
-+ MV88E6XXX_EGRESS_DIR_INGRESS :
-+ MV88E6XXX_EGRESS_DIR_EGRESS;
-+ struct mv88e6xxx_chip *chip = ds->priv;
-+ bool other_mirrors = false;
-+ int i;
-+
-+ mutex_lock(&chip->reg_lock);
-+ if (mv88e6xxx_port_set_mirror(chip, port, direction, false))
-+ dev_err(ds->dev, "p%d: failed to disable mirroring\n", port);
-+
-+ for (i = 0; i < mv88e6xxx_num_ports(chip); i++)
-+ other_mirrors |= mirror->ingress ?
-+ chip->ports[i].mirror_ingress :
-+ chip->ports[i].mirror_egress;
-+
-+ /* Reset egress port when no other mirror is active */
-+ if (!other_mirrors) {
-+ if (chip->info->ops->set_egress_port(chip,
-+ direction,
-+ dsa_upstream_port(ds,
-+ port)));
-+ dev_err(ds->dev, "failed to set egress port\n");
-+ }
-+
-+ mutex_unlock(&chip->reg_lock);
-+}
-+
- static int mv88e6xxx_port_egress_floods(struct dsa_switch *ds, int port,
- bool unicast, bool multicast)
- {
-@@ -4980,6 +5054,8 @@ static const struct dsa_switch_ops mv88e
- .port_mdb_prepare = mv88e6xxx_port_mdb_prepare,
- .port_mdb_add = mv88e6xxx_port_mdb_add,
- .port_mdb_del = mv88e6xxx_port_mdb_del,
-+ .port_mirror_add = mv88e6xxx_port_mirror_add,
-+ .port_mirror_del = mv88e6xxx_port_mirror_del,
- .crosschip_bridge_join = mv88e6xxx_crosschip_bridge_join,
- .crosschip_bridge_leave = mv88e6xxx_crosschip_bridge_leave,
- .port_hwtstamp_set = mv88e6xxx_port_hwtstamp_set,
---- a/drivers/net/dsa/mv88e6xxx/chip.h
-+++ b/drivers/net/dsa/mv88e6xxx/chip.h
-@@ -232,6 +232,8 @@ struct mv88e6xxx_port {
- u64 vtu_member_violation;
- u64 vtu_miss_violation;
- u8 cmode;
-+ bool mirror_ingress;
-+ bool mirror_egress;
- unsigned int serdes_irq;
- };
-
-@@ -315,6 +317,10 @@ struct mv88e6xxx_chip {
- u16 evcap_config;
- u16 enable_count;
-
-+ /* Current ingress and egress monitor ports */
-+ int egress_dest_port;
-+ int ingress_dest_port;
-+
- /* Per-port timestamping resources. */
- struct mv88e6xxx_port_hwtstamp port_hwtstamp[DSA_MAX_PORTS];
-
---- a/drivers/net/dsa/mv88e6xxx/global1.c
-+++ b/drivers/net/dsa/mv88e6xxx/global1.c
-@@ -298,6 +298,7 @@ int mv88e6095_g1_set_egress_port(struct
- enum mv88e6xxx_egress_direction direction,
- int port)
- {
-+ int *dest_port_chip;
- u16 reg;
- int err;
-
-@@ -307,11 +308,13 @@ int mv88e6095_g1_set_egress_port(struct
-
- switch (direction) {
- case MV88E6XXX_EGRESS_DIR_INGRESS:
-+ dest_port_chip = &chip->ingress_dest_port;
- reg &= MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
- reg |= port <<
- __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK);
- break;
- case MV88E6XXX_EGRESS_DIR_EGRESS:
-+ dest_port_chip = &chip->egress_dest_port;
- reg &= MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
- reg |= port <<
- __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
-@@ -320,7 +323,11 @@ int mv88e6095_g1_set_egress_port(struct
- return -EINVAL;
- }
-
-- return mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
-+ err = mv88e6xxx_g1_write(chip, MV88E6185_G1_MONITOR_CTL, reg);
-+ if (!err)
-+ *dest_port_chip = port;
-+
-+ return err;
- }
-
- /* Older generations also call this the ARP destination. It has been
-@@ -356,14 +363,17 @@ int mv88e6390_g1_set_egress_port(struct
- enum mv88e6xxx_egress_direction direction,
- int port)
- {
-+ int *dest_port_chip;
- u16 ptr;
- int err;
-
- switch (direction) {
- case MV88E6XXX_EGRESS_DIR_INGRESS:
-+ dest_port_chip = &chip->ingress_dest_port;
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_INGRESS_DEST;
- break;
- case MV88E6XXX_EGRESS_DIR_EGRESS:
-+ dest_port_chip = &chip->egress_dest_port;
- ptr = MV88E6390_G1_MONITOR_MGMT_CTL_PTR_EGRESS_DEST;
- break;
- default:
-@@ -371,10 +381,10 @@ int mv88e6390_g1_set_egress_port(struct
- }
-
- err = mv88e6390_g1_monitor_write(chip, ptr, port);
-- if (err)
-- return err;
-+ if (!err)
-+ *dest_port_chip = port;
-
-- return 0;
-+ return err;
- }
-
- int mv88e6390_g1_set_cpu_port(struct mv88e6xxx_chip *chip, int port)
---- a/drivers/net/dsa/mv88e6xxx/port.c
-+++ b/drivers/net/dsa/mv88e6xxx/port.c
-@@ -1181,6 +1181,43 @@ int mv88e6095_port_set_upstream_port(str
- return mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
- }
-
-+int mv88e6xxx_port_set_mirror(struct mv88e6xxx_chip *chip, int port,
-+ enum mv88e6xxx_egress_direction direction,
-+ bool mirror)
-+{
-+ bool *mirror_port;
-+ u16 reg;
-+ u16 bit;
-+ int err;
-+
-+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_CTL2, &reg);
-+ if (err)
-+ return err;
-+
-+ switch (direction) {
-+ case MV88E6XXX_EGRESS_DIR_INGRESS:
-+ bit = MV88E6XXX_PORT_CTL2_INGRESS_MONITOR;
-+ mirror_port = &chip->ports[port].mirror_ingress;
-+ break;
-+ case MV88E6XXX_EGRESS_DIR_EGRESS:
-+ bit = MV88E6XXX_PORT_CTL2_EGRESS_MONITOR;
-+ mirror_port = &chip->ports[port].mirror_egress;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ reg &= ~bit;
-+ if (mirror)
-+ reg |= bit;
-+
-+ err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_CTL2, reg);
-+ if (!err)
-+ *mirror_port = mirror;
-+
-+ return err;
-+}
-+
- int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
- u16 mode)
- {
---- a/drivers/net/dsa/mv88e6xxx/port.h
-+++ b/drivers/net/dsa/mv88e6xxx/port.h
-@@ -368,6 +368,9 @@ int mv88e6352_port_link_state(struct mv8
- int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port);
- int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
- int upstream_port);
-+int mv88e6xxx_port_set_mirror(struct mv88e6xxx_chip *chip, int port,
-+ enum mv88e6xxx_egress_direction direction,
-+ bool mirror);
-
- int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port);
- int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port);
diff --git a/target/linux/generic/backport-5.4/748-v5.5-net-dsa-mv88e6xxx-fix-broken-if-statement-because-of.patch b/target/linux/generic/backport-5.4/748-v5.5-net-dsa-mv88e6xxx-fix-broken-if-statement-because-of.patch
deleted file mode 100644
index 37e7a7f2a9..0000000000
--- a/target/linux/generic/backport-5.4/748-v5.5-net-dsa-mv88e6xxx-fix-broken-if-statement-because-of.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 4e4637b10374ede3cd33d7e1b389e6cea6343ea3 Mon Sep 17 00:00:00 2001
-From: Colin Ian King <colin.king@canonical.com>
-Date: Tue, 12 Nov 2019 13:05:23 +0000
-Subject: [PATCH] net: dsa: mv88e6xxx: fix broken if statement because of a
- stray semicolon
-
-There is a stray semicolon in an if statement that will cause a dev_err
-message to be printed unconditionally. Fix this by removing the stray
-semicolon.
-
-Addresses-Coverity: ("Stay semicolon")
-Fixes: f0942e00a1ab ("net: dsa: mv88e6xxx: Add support for port mirroring")
-Signed-off-by: Colin Ian King <colin.king@canonical.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mv88e6xxx/chip.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -4993,7 +4993,7 @@ static void mv88e6xxx_port_mirror_del(st
- if (chip->info->ops->set_egress_port(chip,
- direction,
- dsa_upstream_port(ds,
-- port)));
-+ port)))
- dev_err(ds->dev, "failed to set egress port\n");
- }
-
diff --git a/target/linux/generic/backport-5.4/749-v5.5-net-dsa-mv88e6xxx-Fix-masking-of-egress-port.patch b/target/linux/generic/backport-5.4/749-v5.5-net-dsa-mv88e6xxx-Fix-masking-of-egress-port.patch
deleted file mode 100644
index 497a808511..0000000000
--- a/target/linux/generic/backport-5.4/749-v5.5-net-dsa-mv88e6xxx-Fix-masking-of-egress-port.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 3ee339eb28959629db33aaa2b8cde4c63c6289eb Mon Sep 17 00:00:00 2001
-From: Andrew Lunn <andrew@lunn.ch>
-Date: Thu, 27 Feb 2020 21:20:49 +0100
-Subject: [PATCH] net: dsa: mv88e6xxx: Fix masking of egress port
-
-Add missing ~ to the usage of the mask.
-
-Reported-by: Kevin Benson <Kevin.Benson@zii.aero>
-Reported-by: Chris Healy <Chris.Healy@zii.aero>
-Fixes: 5c74c54ce6ff ("net: dsa: mv88e6xxx: Split monitor port configuration")
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mv88e6xxx/global1.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/net/dsa/mv88e6xxx/global1.c
-+++ b/drivers/net/dsa/mv88e6xxx/global1.c
-@@ -309,13 +309,13 @@ int mv88e6095_g1_set_egress_port(struct
- switch (direction) {
- case MV88E6XXX_EGRESS_DIR_INGRESS:
- dest_port_chip = &chip->ingress_dest_port;
-- reg &= MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
-+ reg &= ~MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK;
- reg |= port <<
- __bf_shf(MV88E6185_G1_MONITOR_CTL_INGRESS_DEST_MASK);
- break;
- case MV88E6XXX_EGRESS_DIR_EGRESS:
- dest_port_chip = &chip->egress_dest_port;
-- reg &= MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
-+ reg &= ~MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK;
- reg |= port <<
- __bf_shf(MV88E6185_G1_MONITOR_CTL_EGRESS_DEST_MASK);
- break;
diff --git a/target/linux/generic/backport-5.4/750-v5.5-net-phy-add-support-for-clause-37-auto-negotiation.patch b/target/linux/generic/backport-5.4/750-v5.5-net-phy-add-support-for-clause-37-auto-negotiation.patch
deleted file mode 100644
index 69c56eca7a..0000000000
--- a/target/linux/generic/backport-5.4/750-v5.5-net-phy-add-support-for-clause-37-auto-negotiation.patch
+++ /dev/null
@@ -1,195 +0,0 @@
-From fa6e98cee558622565c97924e922b97340aeabd8 Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Tue, 22 Oct 2019 11:31:07 -0700
-Subject: [PATCH] net: phy: add support for clause 37 auto-negotiation
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds support for clause 37 1000Base-X auto-negotiation.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: Tao Ren <taoren@fb.com>
-Tested-by: René van Dorst <opensource@vdorst.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phy_device.c | 139 +++++++++++++++++++++++++++++++++++
- include/linux/phy.h | 4 +
- 2 files changed, 143 insertions(+)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1682,6 +1682,40 @@ static int genphy_config_advert(struct p
- }
-
- /**
-+ * genphy_c37_config_advert - sanitize and advertise auto-negotiation parameters
-+ * @phydev: target phy_device struct
-+ *
-+ * Description: Writes MII_ADVERTISE with the appropriate values,
-+ * after sanitizing the values to make sure we only advertise
-+ * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
-+ * hasn't changed, and > 0 if it has changed. This function is intended
-+ * for Clause 37 1000Base-X mode.
-+ */
-+static int genphy_c37_config_advert(struct phy_device *phydev)
-+{
-+ u16 adv = 0;
-+
-+ /* Only allow advertising what this PHY supports */
-+ linkmode_and(phydev->advertising, phydev->advertising,
-+ phydev->supported);
-+
-+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
-+ phydev->advertising))
-+ adv |= ADVERTISE_1000XFULL;
-+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
-+ phydev->advertising))
-+ adv |= ADVERTISE_1000XPAUSE;
-+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
-+ phydev->advertising))
-+ adv |= ADVERTISE_1000XPSE_ASYM;
-+
-+ return phy_modify_changed(phydev, MII_ADVERTISE,
-+ ADVERTISE_1000XFULL | ADVERTISE_1000XPAUSE |
-+ ADVERTISE_1000XHALF | ADVERTISE_1000XPSE_ASYM,
-+ adv);
-+}
-+
-+/**
- * genphy_config_eee_advert - disable unwanted eee mode advertisement
- * @phydev: target phy_device struct
- *
-@@ -1790,6 +1824,54 @@ int __genphy_config_aneg(struct phy_devi
- EXPORT_SYMBOL(__genphy_config_aneg);
-
- /**
-+ * genphy_c37_config_aneg - restart auto-negotiation or write BMCR
-+ * @phydev: target phy_device struct
-+ *
-+ * Description: If auto-negotiation is enabled, we configure the
-+ * advertising, and then restart auto-negotiation. If it is not
-+ * enabled, then we write the BMCR. This function is intended
-+ * for use with Clause 37 1000Base-X mode.
-+ */
-+int genphy_c37_config_aneg(struct phy_device *phydev)
-+{
-+ int err, changed;
-+
-+ if (phydev->autoneg != AUTONEG_ENABLE)
-+ return genphy_setup_forced(phydev);
-+
-+ err = phy_modify(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_SPEED100,
-+ BMCR_SPEED1000);
-+ if (err)
-+ return err;
-+
-+ changed = genphy_c37_config_advert(phydev);
-+ if (changed < 0) /* error */
-+ return changed;
-+
-+ if (!changed) {
-+ /* Advertisement hasn't changed, but maybe aneg was never on to
-+ * begin with? Or maybe phy was isolated?
-+ */
-+ int ctl = phy_read(phydev, MII_BMCR);
-+
-+ if (ctl < 0)
-+ return ctl;
-+
-+ if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
-+ changed = 1; /* do restart aneg */
-+ }
-+
-+ /* Only restart aneg if we are advertising something different
-+ * than we were before.
-+ */
-+ if (changed > 0)
-+ return genphy_restart_aneg(phydev);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(genphy_c37_config_aneg);
-+
-+/**
- * genphy_aneg_done - return auto-negotiation status
- * @phydev: target phy_device struct
- *
-@@ -1962,6 +2044,63 @@ int genphy_read_status(struct phy_device
- EXPORT_SYMBOL(genphy_read_status);
-
- /**
-+ * genphy_c37_read_status - check the link status and update current link state
-+ * @phydev: target phy_device struct
-+ *
-+ * Description: Check the link, then figure out the current state
-+ * by comparing what we advertise with what the link partner
-+ * advertises. This function is for Clause 37 1000Base-X mode.
-+ */
-+int genphy_c37_read_status(struct phy_device *phydev)
-+{
-+ int lpa, err, old_link = phydev->link;
-+
-+ /* Update the link, but return if there was an error */
-+ err = genphy_update_link(phydev);
-+ if (err)
-+ return err;
-+
-+ /* why bother the PHY if nothing can have changed */
-+ if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
-+ return 0;
-+
-+ phydev->duplex = DUPLEX_UNKNOWN;
-+ phydev->pause = 0;
-+ phydev->asym_pause = 0;
-+
-+ if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
-+ lpa = phy_read(phydev, MII_LPA);
-+ if (lpa < 0)
-+ return lpa;
-+
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
-+ phydev->lp_advertising, lpa & LPA_LPACK);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
-+ phydev->lp_advertising, lpa & LPA_1000XFULL);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT,
-+ phydev->lp_advertising, lpa & LPA_1000XPAUSE);
-+ linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
-+ phydev->lp_advertising,
-+ lpa & LPA_1000XPAUSE_ASYM);
-+
-+ phy_resolve_aneg_linkmode(phydev);
-+ } else if (phydev->autoneg == AUTONEG_DISABLE) {
-+ int bmcr = phy_read(phydev, MII_BMCR);
-+
-+ if (bmcr < 0)
-+ return bmcr;
-+
-+ if (bmcr & BMCR_FULLDPLX)
-+ phydev->duplex = DUPLEX_FULL;
-+ else
-+ phydev->duplex = DUPLEX_HALF;
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(genphy_c37_read_status);
-+
-+/**
- * genphy_soft_reset - software reset the PHY via BMCR_RESET bit
- * @phydev: target phy_device struct
- *
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -1120,6 +1120,10 @@ int genphy_read_mmd_unsupported(struct p
- int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
- u16 regnum, u16 val);
-
-+/* Clause 37 */
-+int genphy_c37_config_aneg(struct phy_device *phydev);
-+int genphy_c37_read_status(struct phy_device *phydev);
-+
- /* Clause 45 PHY */
- int genphy_c45_restart_aneg(struct phy_device *phydev);
- int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart);
diff --git a/target/linux/generic/backport-5.4/751-v5.6-net-mvmdio-avoid-error-message-for-optional-IRQ.patch b/target/linux/generic/backport-5.4/751-v5.6-net-mvmdio-avoid-error-message-for-optional-IRQ.patch
deleted file mode 100644
index 6d51de8372..0000000000
--- a/target/linux/generic/backport-5.4/751-v5.6-net-mvmdio-avoid-error-message-for-optional-IRQ.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From fa2632f74e57bbc869c8ad37751a11b6147a3acc Mon Sep 17 00:00:00 2001
-From: Chris Packham <chris.packham@alliedtelesis.co.nz>
-Date: Mon, 16 Mar 2020 20:49:07 +1300
-Subject: [PATCH] net: mvmdio: avoid error message for optional IRQ
-
-Per the dt-binding the interrupt is optional so use
-platform_get_irq_optional() instead of platform_get_irq(). Since
-commit 7723f4c5ecdb ("driver core: platform: Add an error message to
-platform_get_irq*()") platform_get_irq() produces an error message
-
- orion-mdio f1072004.mdio: IRQ index 0 not found
-
-which is perfectly normal if one hasn't specified the optional property
-in the device tree.
-
-Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/ethernet/marvell/mvmdio.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/ethernet/marvell/mvmdio.c
-+++ b/drivers/net/ethernet/marvell/mvmdio.c
-@@ -347,7 +347,7 @@ static int orion_mdio_probe(struct platf
- }
-
-
-- dev->err_interrupt = platform_get_irq(pdev, 0);
-+ dev->err_interrupt = platform_get_irq_optional(pdev, 0);
- if (dev->err_interrupt > 0 &&
- resource_size(r) < MVMDIO_ERR_INT_MASK + 4) {
- dev_err(&pdev->dev,
diff --git a/target/linux/generic/backport-5.4/752-v5.8-net-dsa-provide-an-option-for-drivers-to-always-rece.patch b/target/linux/generic/backport-5.4/752-v5.8-net-dsa-provide-an-option-for-drivers-to-always-rece.patch
deleted file mode 100644
index 52d9351b70..0000000000
--- a/target/linux/generic/backport-5.4/752-v5.8-net-dsa-provide-an-option-for-drivers-to-always-rece.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-From 54a0ed0df49609f4e3f098f8943e38e389dc2e15 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 12 May 2020 20:20:25 +0300
-Subject: net: dsa: provide an option for drivers to always receive bridge
- VLANs
-
-DSA assumes that a bridge which has vlan filtering disabled is not
-vlan aware, and ignores all vlan configuration. However, the kernel
-software bridge code allows configuration in this state.
-
-This causes the kernel's idea of the bridge vlan state and the
-hardware state to disagree, so "bridge vlan show" indicates a correct
-configuration but the hardware lacks all configuration. Even worse,
-enabling vlan filtering on a DSA bridge immediately blocks all traffic
-which, given the output of "bridge vlan show", is very confusing.
-
-Provide an option that drivers can set to indicate they want to receive
-vlan configuration even when vlan filtering is disabled. At the very
-least, this is safe for Marvell DSA bridges, which do not look up
-ingress traffic in the VTU if the port is in 8021Q disabled state. It is
-also safe for the Ocelot switch family. Whether this change is suitable
-for all DSA bridges is not known.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- include/net/dsa.h | 7 +++++++
- net/dsa/dsa_priv.h | 1 +
- net/dsa/port.c | 14 ++++++++++++++
- net/dsa/slave.c | 8 ++++----
- 4 files changed, 26 insertions(+), 4 deletions(-)
-
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -270,6 +270,13 @@ struct dsa_switch {
- */
- bool vlan_filtering_is_global;
-
-+ /* Pass .port_vlan_add and .port_vlan_del to drivers even for bridges
-+ * that have vlan_filtering=0. All drivers should ideally set this (and
-+ * then the option would get removed), but it is unknown whether this
-+ * would break things or not.
-+ */
-+ bool configure_vlan_while_not_filtering;
-+
- /* In case vlan_filtering_is_global is set, the VLAN awareness state
- * should be retrieved from here and not from the per-port settings.
- */
---- a/net/dsa/dsa_priv.h
-+++ b/net/dsa/dsa_priv.h
-@@ -139,6 +139,7 @@ int dsa_port_bridge_join(struct dsa_port
- void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br);
- int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering,
- struct switchdev_trans *trans);
-+bool dsa_port_skip_vlan_configuration(struct dsa_port *dp);
- int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock,
- struct switchdev_trans *trans);
- int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
---- a/net/dsa/port.c
-+++ b/net/dsa/port.c
-@@ -238,6 +238,20 @@ int dsa_port_vlan_filtering(struct dsa_p
- return 0;
- }
-
-+/* This enforces legacy behavior for switch drivers which assume they can't
-+ * receive VLAN configuration when enslaved to a bridge with vlan_filtering=0
-+ */
-+bool dsa_port_skip_vlan_configuration(struct dsa_port *dp)
-+{
-+ struct dsa_switch *ds = dp->ds;
-+
-+ if (!dp->bridge_dev)
-+ return false;
-+
-+ return (!ds->configure_vlan_while_not_filtering &&
-+ !br_vlan_enabled(dp->bridge_dev));
-+}
-+
- int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock,
- struct switchdev_trans *trans)
- {
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -319,7 +319,7 @@ static int dsa_slave_vlan_add(struct net
- if (obj->orig_dev != dev)
- return -EOPNOTSUPP;
-
-- if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
-+ if (dsa_port_skip_vlan_configuration(dp))
- return 0;
-
- vlan = *SWITCHDEV_OBJ_PORT_VLAN(obj);
-@@ -386,7 +386,7 @@ static int dsa_slave_vlan_del(struct net
- if (obj->orig_dev != dev)
- return -EOPNOTSUPP;
-
-- if (dp->bridge_dev && !br_vlan_enabled(dp->bridge_dev))
-+ if (dsa_port_skip_vlan_configuration(dp))
- return 0;
-
- /* Do not deprogram the CPU port as it may be shared with other user
-@@ -1120,7 +1120,7 @@ static int dsa_slave_vlan_rx_add_vid(str
- * need to emulate the switchdev prepare + commit phase.
- */
- if (dp->bridge_dev) {
-- if (!br_vlan_enabled(dp->bridge_dev))
-+ if (dsa_port_skip_vlan_configuration(dp))
- return 0;
-
- /* br_vlan_get_info() returns -EINVAL or -ENOENT if the
-@@ -1154,7 +1154,7 @@ static int dsa_slave_vlan_rx_kill_vid(st
- * need to emulate the switchdev prepare + commit phase.
- */
- if (dp->bridge_dev) {
-- if (!br_vlan_enabled(dp->bridge_dev))
-+ if (dsa_port_skip_vlan_configuration(dp))
- return 0;
-
- /* br_vlan_get_info() returns -EINVAL or -ENOENT if the
diff --git a/target/linux/generic/backport-5.4/753-v5.8-net-dsa-mt7530-fix-VLAN-setup.patch b/target/linux/generic/backport-5.4/753-v5.8-net-dsa-mt7530-fix-VLAN-setup.patch
deleted file mode 100644
index 0804cea9f7..0000000000
--- a/target/linux/generic/backport-5.4/753-v5.8-net-dsa-mt7530-fix-VLAN-setup.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 0141792f8b7300006b874dda1c35acd0abd90d9d Mon Sep 17 00:00:00 2001
-From: DENG Qingfang <dqfext@gmail.com>
-Date: Fri, 15 May 2020 23:25:55 +0800
-Subject: net: dsa: mt7530: fix VLAN setup
-
-Allow DSA to add VLAN entries even if VLAN filtering is disabled, so
-enabling it will not block the traffic of existent ports in the bridge
-
-Signed-off-by: DENG Qingfang <dqfext@gmail.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mt7530.c | 13 +------------
- 1 file changed, 1 insertion(+), 12 deletions(-)
-
---- a/drivers/net/dsa/mt7530.c
-+++ b/drivers/net/dsa/mt7530.c
-@@ -1083,12 +1083,6 @@ mt7530_port_vlan_add(struct dsa_switch *
- struct mt7530_priv *priv = ds->priv;
- u16 vid;
-
-- /* The port is kept as VLAN-unaware if bridge with vlan_filtering not
-- * being set.
-- */
-- if (!dsa_port_is_vlan_filtering(&ds->ports[port]))
-- return;
--
- mutex_lock(&priv->reg_mutex);
-
- for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
-@@ -1114,12 +1108,6 @@ mt7530_port_vlan_del(struct dsa_switch *
- struct mt7530_priv *priv = ds->priv;
- u16 vid, pvid;
-
-- /* The port is kept as VLAN-unaware if bridge with vlan_filtering not
-- * being set.
-- */
-- if (!dsa_port_is_vlan_filtering(&ds->ports[port]))
-- return 0;
--
- mutex_lock(&priv->reg_mutex);
-
- pvid = priv->ports[port].pvid;
-@@ -1232,6 +1220,7 @@ mt7530_setup(struct dsa_switch *ds)
- * as two netdev instances.
- */
- dn = ds->ports[MT7530_CPU_PORT].master->dev.of_node->parent;
-+ ds->configure_vlan_while_not_filtering = true;
-
- if (priv->id == ID_MT7530) {
- regulator_set_voltage(priv->core_pwr, 1000000, 1000000);
diff --git a/target/linux/generic/backport-5.4/756-v5.8-net-dsa-rtl8366-Pass-GENMASK-signed-bits.patch b/target/linux/generic/backport-5.4/756-v5.8-net-dsa-rtl8366-Pass-GENMASK-signed-bits.patch
deleted file mode 100644
index b0ab598365..0000000000
--- a/target/linux/generic/backport-5.4/756-v5.8-net-dsa-rtl8366-Pass-GENMASK-signed-bits.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 733993f502f254912b1415e13f73651d9f2e74ef Mon Sep 17 00:00:00 2001
-From: Andrew Lunn <andrew@lunn.ch>
-Date: Sun, 5 Jul 2020 22:42:27 +0200
-Subject: [PATCH 1/5] net: dsa: rtl8366: Pass GENMASK() signed bits
-
-Oddly, GENMASK() requires signed bit numbers, so that it can compare
-them for < 0. If passed an unsigned type, we get warnings about the
-test never being true.
-
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/rtl8366.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/dsa/rtl8366.c
-+++ b/drivers/net/dsa/rtl8366.c
-@@ -311,7 +311,7 @@ int rtl8366_init_vlan(struct realtek_smi
- /* For the CPU port, make all ports members of this
- * VLAN.
- */
-- mask = GENMASK(smi->num_ports - 1, 0);
-+ mask = GENMASK((int)smi->num_ports - 1, 0);
- else
- /* For all other ports, enable itself plus the
- * CPU port.
diff --git a/target/linux/generic/backport-5.4/757-v5.8-net-dsa-tag_rtl4_a-Implement-Realtek-4-byte-A-tag.patch b/target/linux/generic/backport-5.4/757-v5.8-net-dsa-tag_rtl4_a-Implement-Realtek-4-byte-A-tag.patch
deleted file mode 100644
index 70d7000ba1..0000000000
--- a/target/linux/generic/backport-5.4/757-v5.8-net-dsa-tag_rtl4_a-Implement-Realtek-4-byte-A-tag.patch
+++ /dev/null
@@ -1,232 +0,0 @@
-From 078ced30af696b52a450a016a16eb47499d68117 Mon Sep 17 00:00:00 2001
-From: Linus Walleij <linus.walleij@linaro.org>
-Date: Wed, 8 Jul 2020 14:25:36 +0200
-Subject: [PATCH 2/5] net: dsa: tag_rtl4_a: Implement Realtek 4 byte A tag
-
-This implements the known parts of the Realtek 4 byte
-tag protocol version 0xA, as found in the RTL8366RB
-DSA switch.
-
-It is designated as protocol version 0xA as a
-different Realtek 4 byte tag format with protocol
-version 0x9 is known to exist in the Realtek RTL8306
-chips.
-
-The tag and switch chip lacks public documentation, so
-the tag format has been reverse-engineered from
-packet dumps. As only ingress traffic has been available
-for analysis an egress tag has not been possible to
-develop (even using educated guesses about bit fields)
-so this is as far as it gets. It is not known if the
-switch even supports egress tagging.
-
-Excessive attempts to figure out the egress tag format
-was made. When nothing else worked, I just tried all bit
-combinations with 0xannp where a is protocol and p is
-port. I looped through all values several times trying
-to get a response from ping, without any positive
-result.
-
-Using just these ingress tags however, the switch
-functionality is vastly improved and the packets find
-their way into the destination port without any
-tricky VLAN configuration. On the D-Link DIR-685 the
-LAN ports now come up and respond to ping without
-any command line configuration so this is a real
-improvement for users.
-
-Egress packets need to be restricted to the proper
-target ports using VLAN, which the RTL8366RB DSA
-switch driver already sets up.
-
-Cc: DENG Qingfang <dqfext@gmail.com>
-Cc: Mauri Sandberg <sandberg@mailfence.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- include/net/dsa.h | 2 +
- net/dsa/Kconfig | 7 +++
- net/dsa/Makefile | 1 +
- net/dsa/tag_rtl4_a.c | 130 +++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 140 insertions(+)
- create mode 100644 net/dsa/tag_rtl4_a.c
-
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -42,6 +42,7 @@ struct phylink_link_state;
- #define DSA_TAG_PROTO_8021Q_VALUE 12
- #define DSA_TAG_PROTO_SJA1105_VALUE 13
- #define DSA_TAG_PROTO_KSZ8795_VALUE 14
-+#define DSA_TAG_PROTO_RTL4_A_VALUE 17
-
- enum dsa_tag_protocol {
- DSA_TAG_PROTO_NONE = DSA_TAG_PROTO_NONE_VALUE,
-@@ -59,6 +60,7 @@ enum dsa_tag_protocol {
- DSA_TAG_PROTO_8021Q = DSA_TAG_PROTO_8021Q_VALUE,
- DSA_TAG_PROTO_SJA1105 = DSA_TAG_PROTO_SJA1105_VALUE,
- DSA_TAG_PROTO_KSZ8795 = DSA_TAG_PROTO_KSZ8795_VALUE,
-+ DSA_TAG_PROTO_RTL4_A = DSA_TAG_PROTO_RTL4_A_VALUE,
- };
-
- struct packet_type;
---- a/net/dsa/Kconfig
-+++ b/net/dsa/Kconfig
-@@ -80,6 +80,13 @@ config NET_DSA_TAG_KSZ
- Say Y if you want to enable support for tagging frames for the
- Microchip 8795/9477/9893 families of switches.
-
-+config NET_DSA_TAG_RTL4_A
-+ tristate "Tag driver for Realtek 4 byte protocol A tags"
-+ help
-+ Say Y or M if you want to enable support for tagging frames for the
-+ Realtek switches with 4 byte protocol A tags, sich as found in
-+ the Realtek RTL8366RB.
-+
- config NET_DSA_TAG_QCA
- tristate "Tag driver for Qualcomm Atheros QCA8K switches"
- help
---- a/net/dsa/Makefile
-+++ b/net/dsa/Makefile
-@@ -10,6 +10,7 @@ obj-$(CONFIG_NET_DSA_TAG_DSA) += tag_dsa
- obj-$(CONFIG_NET_DSA_TAG_EDSA) += tag_edsa.o
- obj-$(CONFIG_NET_DSA_TAG_GSWIP) += tag_gswip.o
- obj-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o
-+obj-$(CONFIG_NET_DSA_TAG_RTL4_A) += tag_rtl4_a.o
- obj-$(CONFIG_NET_DSA_TAG_LAN9303) += tag_lan9303.o
- obj-$(CONFIG_NET_DSA_TAG_MTK) += tag_mtk.o
- obj-$(CONFIG_NET_DSA_TAG_QCA) += tag_qca.o
---- /dev/null
-+++ b/net/dsa/tag_rtl4_a.c
-@@ -0,0 +1,130 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Handler for Realtek 4 byte DSA switch tags
-+ * Currently only supports protocol "A" found in RTL8366RB
-+ * Copyright (c) 2020 Linus Walleij <linus.walleij@linaro.org>
-+ *
-+ * This "proprietary tag" header looks like so:
-+ *
-+ * -------------------------------------------------
-+ * | MAC DA | MAC SA | 0x8899 | 2 bytes tag | Type |
-+ * -------------------------------------------------
-+ *
-+ * The 2 bytes tag form a 16 bit big endian word. The exact
-+ * meaning has been guessed from packet dumps from ingress
-+ * frames, as no working egress traffic has been available
-+ * we do not know the format of the egress tags or if they
-+ * are even supported.
-+ */
-+
-+#include <linux/etherdevice.h>
-+#include <linux/bits.h>
-+
-+#include "dsa_priv.h"
-+
-+#define RTL4_A_HDR_LEN 4
-+#define RTL4_A_ETHERTYPE 0x8899
-+#define RTL4_A_PROTOCOL_SHIFT 12
-+/*
-+ * 0x1 = Realtek Remote Control protocol (RRCP)
-+ * 0x2/0x3 seems to be used for loopback testing
-+ * 0x9 = RTL8306 DSA protocol
-+ * 0xa = RTL8366RB DSA protocol
-+ */
-+#define RTL4_A_PROTOCOL_RTL8366RB 0xa
-+
-+static struct sk_buff *rtl4a_tag_xmit(struct sk_buff *skb,
-+ struct net_device *dev)
-+{
-+ /*
-+ * Just let it pass thru, we don't know if it is possible
-+ * to tag a frame with the 0x8899 ethertype and direct it
-+ * to a specific port, all attempts at reverse-engineering have
-+ * ended up with the frames getting dropped.
-+ *
-+ * The VLAN set-up needs to restrict the frames to the right port.
-+ *
-+ * If you have documentation on the tagging format for RTL8366RB
-+ * (tag type A) then please contribute.
-+ */
-+ return skb;
-+}
-+
-+static struct sk_buff *rtl4a_tag_rcv(struct sk_buff *skb,
-+ struct net_device *dev,
-+ struct packet_type *pt)
-+{
-+ u16 protport;
-+ __be16 *p;
-+ u16 etype;
-+ u8 *tag;
-+ u8 prot;
-+ u8 port;
-+
-+ if (unlikely(!pskb_may_pull(skb, RTL4_A_HDR_LEN)))
-+ return NULL;
-+
-+ /* The RTL4 header has its own custom Ethertype 0x8899 and that
-+ * starts right at the beginning of the packet, after the src
-+ * ethernet addr. Apparantly skb->data always points 2 bytes in,
-+ * behind the Ethertype.
-+ */
-+ tag = skb->data - 2;
-+ p = (__be16 *)tag;
-+ etype = ntohs(*p);
-+ if (etype != RTL4_A_ETHERTYPE) {
-+ /* Not custom, just pass through */
-+ netdev_dbg(dev, "non-realtek ethertype 0x%04x\n", etype);
-+ return skb;
-+ }
-+ p = (__be16 *)(tag + 2);
-+ protport = ntohs(*p);
-+ /* The 4 upper bits are the protocol */
-+ prot = (protport >> RTL4_A_PROTOCOL_SHIFT) & 0x0f;
-+ if (prot != RTL4_A_PROTOCOL_RTL8366RB) {
-+ netdev_err(dev, "unknown realtek protocol 0x%01x\n", prot);
-+ return NULL;
-+ }
-+ port = protport & 0xff;
-+
-+ skb->dev = dsa_master_find_slave(dev, 0, port);
-+ if (!skb->dev) {
-+ netdev_dbg(dev, "could not find slave for port %d\n", port);
-+ return NULL;
-+ }
-+
-+ /* Remove RTL4 tag and recalculate checksum */
-+ skb_pull_rcsum(skb, RTL4_A_HDR_LEN);
-+
-+ /* Move ethernet DA and SA in front of the data */
-+ memmove(skb->data - ETH_HLEN,
-+ skb->data - ETH_HLEN - RTL4_A_HDR_LEN,
-+ 2 * ETH_ALEN);
-+
-+ skb->offload_fwd_mark = 1;
-+
-+ return skb;
-+}
-+
-+static int rtl4a_tag_flow_dissect(const struct sk_buff *skb, __be16 *proto,
-+ int *offset)
-+{
-+ *offset = RTL4_A_HDR_LEN;
-+ /* Skip past the tag and fetch the encapsulated Ethertype */
-+ *proto = ((__be16 *)skb->data)[1];
-+
-+ return 0;
-+}
-+
-+static const struct dsa_device_ops rtl4a_netdev_ops = {
-+ .name = "rtl4a",
-+ .proto = DSA_TAG_PROTO_RTL4_A,
-+ .xmit = rtl4a_tag_xmit,
-+ .rcv = rtl4a_tag_rcv,
-+ .flow_dissect = rtl4a_tag_flow_dissect,
-+ .overhead = RTL4_A_HDR_LEN,
-+};
-+module_dsa_tag_driver(rtl4a_netdev_ops);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_RTL4_A);
diff --git a/target/linux/generic/backport-5.4/758-v5.8-net-dsa-rtl8366rb-Support-the-CPU-DSA-tag.patch b/target/linux/generic/backport-5.4/758-v5.8-net-dsa-rtl8366rb-Support-the-CPU-DSA-tag.patch
deleted file mode 100644
index b68c033bbe..0000000000
--- a/target/linux/generic/backport-5.4/758-v5.8-net-dsa-rtl8366rb-Support-the-CPU-DSA-tag.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From c633ba43b7a9c2bfdb992ffd198d4c661520466f Mon Sep 17 00:00:00 2001
-From: Linus Walleij <linus.walleij@linaro.org>
-Date: Wed, 8 Jul 2020 14:25:37 +0200
-Subject: [PATCH 3/5] net: dsa: rtl8366rb: Support the CPU DSA tag
-
-This activates the support to use the CPU tag to properly
-direct ingress traffic to the right port.
-
-Bit 15 in register RTL8368RB_CPU_CTRL_REG can be set to
-1 to disable the insertion of the CPU tag which is what
-the code currently does. The bit 15 define calls this
-setting RTL8368RB_CPU_INSTAG which is confusing since the
-inverse meaning is implied: programmers may think that
-setting this bit to 1 will *enable* inserting the tag
-rather than disabling it, so rename this setting in
-bit 15 to RTL8368RB_CPU_NO_TAG which is more to the
-point.
-
-After this e.g. ping works out-of-the-box with the
-RTL8366RB.
-
-Cc: DENG Qingfang <dqfext@gmail.com>
-Cc: Mauri Sandberg <sandberg@mailfence.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/Kconfig | 1 +
- drivers/net/dsa/rtl8366rb.c | 31 ++++++++-----------------------
- 2 files changed, 9 insertions(+), 23 deletions(-)
-
---- a/drivers/net/dsa/Kconfig
-+++ b/drivers/net/dsa/Kconfig
-@@ -66,6 +66,7 @@ config NET_DSA_QCA8K
- config NET_DSA_REALTEK_SMI
- tristate "Realtek SMI Ethernet switch family support"
- depends on NET_DSA
-+ select NET_DSA_TAG_RTL4_A
- select FIXED_PHY
- select IRQ_DOMAIN
- select REALTEK_PHY
---- a/drivers/net/dsa/rtl8366rb.c
-+++ b/drivers/net/dsa/rtl8366rb.c
-@@ -109,8 +109,8 @@
- /* CPU port control reg */
- #define RTL8368RB_CPU_CTRL_REG 0x0061
- #define RTL8368RB_CPU_PORTS_MSK 0x00FF
--/* Enables inserting custom tag length/type 0x8899 */
--#define RTL8368RB_CPU_INSTAG BIT(15)
-+/* Disables inserting custom tag length/type 0x8899 */
-+#define RTL8368RB_CPU_NO_TAG BIT(15)
-
- #define RTL8366RB_SMAR0 0x0070 /* bits 0..15 */
- #define RTL8366RB_SMAR1 0x0071 /* bits 16..31 */
-@@ -844,16 +844,14 @@ static int rtl8366rb_setup(struct dsa_sw
- if (ret)
- return ret;
-
-- /* Enable CPU port and enable inserting CPU tag
-+ /* Enable CPU port with custom DSA tag 8899.
- *
-- * Disabling RTL8368RB_CPU_INSTAG here will change the behaviour
-- * of the switch totally and it will start talking Realtek RRCP
-- * internally. It is probably possible to experiment with this,
-- * but then the kernel needs to understand and handle RRCP first.
-+ * If you set RTL8368RB_CPU_NO_TAG (bit 15) in this registers
-+ * the custom tag is turned off.
- */
- ret = regmap_update_bits(smi->map, RTL8368RB_CPU_CTRL_REG,
- 0xFFFF,
-- RTL8368RB_CPU_INSTAG | BIT(smi->cpu_port));
-+ BIT(smi->cpu_port));
- if (ret)
- return ret;
-
-@@ -966,21 +964,8 @@ static int rtl8366rb_setup(struct dsa_sw
- static enum dsa_tag_protocol rtl8366_get_tag_protocol(struct dsa_switch *ds,
- int port)
- {
-- /* For now, the RTL switches are handled without any custom tags.
-- *
-- * It is possible to turn on "custom tags" by removing the
-- * RTL8368RB_CPU_INSTAG flag when enabling the port but what it
-- * does is unfamiliar to DSA: ethernet frames of type 8899, the Realtek
-- * Remote Control Protocol (RRCP) start to appear on the CPU port of
-- * the device. So this is not the ordinary few extra bytes in the
-- * frame. Instead it appears that the switch starts to talk Realtek
-- * RRCP internally which means a pretty complex RRCP implementation
-- * decoding and responding the RRCP protocol is needed to exploit this.
-- *
-- * The OpenRRCP project (dormant since 2009) have reverse-egineered
-- * parts of the protocol.
-- */
-- return DSA_TAG_PROTO_NONE;
-+ /* This switch uses the 4 byte protocol A Realtek DSA tag */
-+ return DSA_TAG_PROTO_RTL4_A;
- }
-
- static void rtl8366rb_adjust_link(struct dsa_switch *ds, int port,
diff --git a/target/linux/generic/backport-5.4/760-net-ethernet-mediatek-Integrate-GDM-PSE-setup-operat.patch b/target/linux/generic/backport-5.4/760-net-ethernet-mediatek-Integrate-GDM-PSE-setup-operat.patch
deleted file mode 100644
index e352b0380e..0000000000
--- a/target/linux/generic/backport-5.4/760-net-ethernet-mediatek-Integrate-GDM-PSE-setup-operat.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From: MarkLee <Mark-MC.Lee@mediatek.com>
-Date: Wed, 13 Nov 2019 10:38:42 +0800
-Subject: [PATCH] net: ethernet: mediatek: Integrate GDM/PSE setup operations
-
-Integrate GDM/PSE setup operations into single function "mtk_gdm_config"
-
-Signed-off-by: MarkLee <Mark-MC.Lee@mediatek.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2232,6 +2232,28 @@ static int mtk_start_dma(struct mtk_eth
- return 0;
- }
-
-+static void mtk_gdm_config(struct mtk_eth *eth, u32 config)
-+{
-+ int i;
-+
-+ for (i = 0; i < MTK_MAC_COUNT; i++) {
-+ u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
-+
-+ /* default setup the forward port to send frame to PDMA */
-+ val &= ~0xffff;
-+
-+ /* Enable RX checksum */
-+ val |= MTK_GDMA_ICS_EN | MTK_GDMA_TCS_EN | MTK_GDMA_UCS_EN;
-+
-+ val |= config;
-+
-+ mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
-+ }
-+ /* Reset and enable PSE */
-+ mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
-+ mtk_w32(eth, 0, MTK_RST_GL);
-+}
-+
- static int mtk_open(struct net_device *dev)
- {
- struct mtk_mac *mac = netdev_priv(dev);
-@@ -2427,8 +2449,6 @@ static int mtk_hw_init(struct mtk_eth *e
- mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
- mtk_tx_irq_disable(eth, ~0);
- mtk_rx_irq_disable(eth, ~0);
-- mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
-- mtk_w32(eth, 0, MTK_RST_GL);
-
- /* FE int grouping */
- mtk_w32(eth, MTK_TX_DONE_INT, MTK_PDMA_INT_GRP1);
-@@ -2437,18 +2457,7 @@ static int mtk_hw_init(struct mtk_eth *e
- mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2);
- mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
-
-- for (i = 0; i < MTK_MAC_COUNT; i++) {
-- u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
--
-- /* setup the forward port to send frame to PDMA */
-- val &= ~0xffff;
--
-- /* Enable RX checksum */
-- val |= MTK_GDMA_ICS_EN | MTK_GDMA_TCS_EN | MTK_GDMA_UCS_EN;
--
-- /* setup the mac dma */
-- mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
-- }
-+ mtk_gdm_config(eth, MTK_GDMA_TO_PDMA);
-
- return 0;
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -84,6 +84,7 @@
- #define MTK_GDMA_ICS_EN BIT(22)
- #define MTK_GDMA_TCS_EN BIT(21)
- #define MTK_GDMA_UCS_EN BIT(20)
-+#define MTK_GDMA_TO_PDMA 0x0
-
- /* Unicast Filter MAC Address Register - Low */
- #define MTK_GDMA_MAC_ADRL(x) (0x508 + (x * 0x1000))
diff --git a/target/linux/generic/backport-5.4/761-net-ethernet-mediatek-Refine-the-timing-of-GDM-PSE-s.patch b/target/linux/generic/backport-5.4/761-net-ethernet-mediatek-Refine-the-timing-of-GDM-PSE-s.patch
deleted file mode 100644
index d18d9f93eb..0000000000
--- a/target/linux/generic/backport-5.4/761-net-ethernet-mediatek-Refine-the-timing-of-GDM-PSE-s.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: MarkLee <Mark-MC.Lee@mediatek.com>
-Date: Wed, 13 Nov 2019 10:38:43 +0800
-Subject: [PATCH] net: ethernet: mediatek: Refine the timing of GDM/PSE setup
-
-Refine the timing of GDM/PSE setup, move it from mtk_hw_init
-to mtk_open. This is recommended by the mt762x HW design to
-do GDM/PSE setup only after PDMA has been started.
-
-We exclude mt7628 in mtk_gdm_config function since it is a old IP
-and there is no GDM/PSE block on it.
-
-Signed-off-by: MarkLee <Mark-MC.Lee@mediatek.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2236,6 +2236,9 @@ static void mtk_gdm_config(struct mtk_et
- {
- int i;
-
-+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628))
-+ return;
-+
- for (i = 0; i < MTK_MAC_COUNT; i++) {
- u32 val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
-
-@@ -2274,6 +2277,8 @@ static int mtk_open(struct net_device *d
- if (err)
- return err;
-
-+ mtk_gdm_config(eth, MTK_GDMA_TO_PDMA);
-+
- napi_enable(&eth->tx_napi);
- napi_enable(&eth->rx_napi);
- mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
-@@ -2457,8 +2462,6 @@ static int mtk_hw_init(struct mtk_eth *e
- mtk_w32(eth, MTK_RX_DONE_INT, MTK_QDMA_INT_GRP2);
- mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
-
-- mtk_gdm_config(eth, MTK_GDMA_TO_PDMA);
--
- return 0;
-
- err_disable_pm:
diff --git a/target/linux/generic/backport-5.4/762-net-ethernet-mediatek-Enable-GDM-GDMA_DROP_ALL-mode.patch b/target/linux/generic/backport-5.4/762-net-ethernet-mediatek-Enable-GDM-GDMA_DROP_ALL-mode.patch
deleted file mode 100644
index e25f1211eb..0000000000
--- a/target/linux/generic/backport-5.4/762-net-ethernet-mediatek-Enable-GDM-GDMA_DROP_ALL-mode.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From: MarkLee <Mark-MC.Lee@mediatek.com>
-Date: Wed, 13 Nov 2019 10:38:44 +0800
-Subject: [PATCH] net: ethernet: mediatek: Enable GDM GDMA_DROP_ALL mode
-
-Enable GDM GDMA_DROP_ALL mode to drop all packet during the
-stop operation. This is recommended by the mt762x HW design
-to drop all packet from GMAC before stopping PDMA.
-
-Signed-off-by: MarkLee <Mark-MC.Lee@mediatek.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2331,6 +2331,8 @@ static int mtk_stop(struct net_device *d
- if (!refcount_dec_and_test(&eth->dma_refcnt))
- return 0;
-
-+ mtk_gdm_config(eth, MTK_GDMA_DROP_ALL);
-+
- mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
- mtk_rx_irq_disable(eth, MTK_RX_DONE_INT);
- napi_disable(&eth->tx_napi);
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -85,6 +85,7 @@
- #define MTK_GDMA_TCS_EN BIT(21)
- #define MTK_GDMA_UCS_EN BIT(20)
- #define MTK_GDMA_TO_PDMA 0x0
-+#define MTK_GDMA_DROP_ALL 0x7777
-
- /* Unicast Filter MAC Address Register - Low */
- #define MTK_GDMA_MAC_ADRL(x) (0x508 + (x * 0x1000))
diff --git a/target/linux/generic/backport-5.4/765-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch b/target/linux/generic/backport-5.4/765-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch
deleted file mode 100644
index 7ec26899f9..0000000000
--- a/target/linux/generic/backport-5.4/765-v5.12-net-dsa-automatically-bring-up-DSA-master-when-openi.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From 9d5ef190e5615a7b63af89f88c4106a5bc127974 Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Fri, 5 Feb 2021 15:37:10 +0200
-Subject: [PATCH] net: dsa: automatically bring up DSA master when opening user
- port
-
-DSA wants the master interface to be open before the user port is due to
-historical reasons. The promiscuity of interfaces that are down used to
-have issues, as referenced Lennert Buytenhek in commit df02c6ff2e39
-("dsa: fix master interface allmulti/promisc handling").
-
-The bugfix mentioned there, commit b6c40d68ff64 ("net: only invoke
-dev->change_rx_flags when device is UP"), was basically a "don't do
-that" approach to working around the promiscuity while down issue.
-
-Further work done by Vlad Yasevich in commit d2615bf45069 ("net: core:
-Always propagate flag changes to interfaces") has resolved the
-underlying issue, and it is strictly up to the DSA and 8021q drivers
-now, it is no longer mandated by the networking core that the master
-interface must be up when changing its promiscuity.
-
-From DSA's point of view, deciding to error out in dsa_slave_open
-because the master isn't up is
-(a) a bad user experience and
-(b) knocking at an open door.
-Even if there still was an issue with promiscuity while down, DSA could
-still just open the master and avoid it.
-
-Doing it this way has the additional benefit that user space can now
-remove DSA-specific workarounds, like systemd-networkd with BindCarrier:
-https://github.com/systemd/systemd/issues/7478
-
-And we can finally remove one of the 2 bullets in the "Common pitfalls
-using DSA setups" chapter.
-
-Tested with two cascaded DSA switches:
-
-$ ip link set sw0p2 up
-fsl_enetc 0000:00:00.2 eno2: configuring for fixed/internal link mode
-fsl_enetc 0000:00:00.2 eno2: Link is Up - 1Gbps/Full - flow control rx/tx
-mscc_felix 0000:00:00.5 swp0: configuring for fixed/sgmii link mode
-mscc_felix 0000:00:00.5 swp0: Link is Up - 1Gbps/Full - flow control off
-8021q: adding VLAN 0 to HW filter on device swp0
-sja1105 spi2.0 sw0p2: configuring for phy/rgmii-id link mode
-IPv6: ADDRCONF(NETDEV_CHANGE): eno2: link becomes ready
-IPv6: ADDRCONF(NETDEV_CHANGE): swp0: link becomes ready
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- Documentation/networking/dsa/dsa.rst | 4 ----
- net/dsa/slave.c | 7 +++++--
- 2 files changed, 5 insertions(+), 6 deletions(-)
-
---- a/Documentation/networking/dsa/dsa.rst
-+++ b/Documentation/networking/dsa/dsa.rst
-@@ -273,10 +273,6 @@ will not make us go through the switch t
- the Ethernet switch on the other end, expecting a tag will typically drop this
- frame.
-
--Slave network devices check that the master network device is UP before allowing
--you to administratively bring UP these slave network devices. A common
--configuration mistake is forgetting to bring UP the master network device first.
--
- Interactions with other subsystems
- ==================================
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -70,8 +70,11 @@ static int dsa_slave_open(struct net_dev
- struct dsa_port *dp = dsa_slave_to_port(dev);
- int err;
-
-- if (!(master->flags & IFF_UP))
-- return -ENETDOWN;
-+ err = dev_open(master, NULL);
-+ if (err < 0) {
-+ netdev_err(dev, "failed to open master %s\n", master->name);
-+ goto out;
-+ }
-
- if (!ether_addr_equal(dev->dev_addr, master->dev_addr)) {
- err = dev_uc_add(master, dev->dev_addr);
diff --git a/target/linux/generic/backport-5.4/770-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch b/target/linux/generic/backport-5.4/770-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch
deleted file mode 100644
index df4e74cd96..0000000000
--- a/target/linux/generic/backport-5.4/770-v5.12-net-bridge-notify-switchdev-of-disappearance-of-old-.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From 90dc8fd36078a536671adae884d0b929cce6480a Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:30 +0200
-Subject: [PATCH] net: bridge: notify switchdev of disappearance of old FDB
- entry upon migration
-
-Currently the bridge emits atomic switchdev notifications for
-dynamically learnt FDB entries. Monitoring these notifications works
-wonders for switchdev drivers that want to keep their hardware FDB in
-sync with the bridge's FDB.
-
-For example station A wants to talk to station B in the diagram below,
-and we are concerned with the behavior of the bridge on the DUT device:
-
- DUT
- +-------------------------------------+
- | br0 |
- | +------+ +------+ +------+ +------+ |
- | | | | | | | | | |
- | | swp0 | | swp1 | | swp2 | | eth0 | |
- +-------------------------------------+
- | | |
- Station A | |
- | |
- +--+------+--+ +--+------+--+
- | | | | | | | |
- | | swp0 | | | | swp0 | |
- Another | +------+ | | +------+ | Another
- switch | br0 | | br0 | switch
- | +------+ | | +------+ |
- | | | | | | | |
- | | swp1 | | | | swp1 | |
- +--+------+--+ +--+------+--+
- |
- Station B
-
-Interfaces swp0, swp1, swp2 are handled by a switchdev driver that has
-the following property: frames injected from its control interface bypass
-the internal address analyzer logic, and therefore, this hardware does
-not learn from the source address of packets transmitted by the network
-stack through it. So, since bridging between eth0 (where Station B is
-attached) and swp0 (where Station A is attached) is done in software,
-the switchdev hardware will never learn the source address of Station B.
-So the traffic towards that destination will be treated as unknown, i.e.
-flooded.
-
-This is where the bridge notifications come in handy. When br0 on the
-DUT sees frames with Station B's MAC address on eth0, the switchdev
-driver gets these notifications and can install a rule to send frames
-towards Station B's address that are incoming from swp0, swp1, swp2,
-only towards the control interface. This is all switchdev driver private
-business, which the notification makes possible.
-
-All is fine until someone unplugs Station B's cable and moves it to the
-other switch:
-
- DUT
- +-------------------------------------+
- | br0 |
- | +------+ +------+ +------+ +------+ |
- | | | | | | | | | |
- | | swp0 | | swp1 | | swp2 | | eth0 | |
- +-------------------------------------+
- | | |
- Station A | |
- | |
- +--+------+--+ +--+------+--+
- | | | | | | | |
- | | swp0 | | | | swp0 | |
- Another | +------+ | | +------+ | Another
- switch | br0 | | br0 | switch
- | +------+ | | +------+ |
- | | | | | | | |
- | | swp1 | | | | swp1 | |
- +--+------+--+ +--+------+--+
- |
- Station B
-
-Luckily for the use cases we care about, Station B is noisy enough that
-the DUT hears it (on swp1 this time). swp1 receives the frames and
-delivers them to the bridge, who enters the unlikely path in br_fdb_update
-of updating an existing entry. It moves the entry in the software bridge
-to swp1 and emits an addition notification towards that.
-
-As far as the switchdev driver is concerned, all that it needs to ensure
-is that traffic between Station A and Station B is not forever broken.
-If it does nothing, then the stale rule to send frames for Station B
-towards the control interface remains in place. But Station B is no
-longer reachable via the control interface, but via a port that can
-offload the bridge port learning attribute. It's just that the port is
-prevented from learning this address, since the rule overrides FDB
-updates. So the rule needs to go. The question is via what mechanism.
-
-It sure would be possible for this switchdev driver to keep track of all
-addresses which are sent to the control interface, and then also listen
-for bridge notifier events on its own ports, searching for the ones that
-have a MAC address which was previously sent to the control interface.
-But this is cumbersome and inefficient. Instead, with one small change,
-the bridge could notify of the address deletion from the old port, in a
-symmetrical manner with how it did for the insertion. Then the switchdev
-driver would not be required to monitor learn/forget events for its own
-ports. It could just delete the rule towards the control interface upon
-bridge entry migration. This would make hardware address learning be
-possible again. Then it would take a few more packets until the hardware
-and software FDB would be in sync again.
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
-Reviewed-by: Ido Schimmel <idosch@nvidia.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/bridge/br_fdb.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/net/bridge/br_fdb.c
-+++ b/net/bridge/br_fdb.c
-@@ -581,6 +581,7 @@ void br_fdb_update(struct net_bridge *br
-
- /* fastpath: update of existing entry */
- if (unlikely(source != fdb->dst && !fdb->is_sticky)) {
-+ br_switchdev_fdb_notify(fdb, RTM_DELNEIGH);
- fdb->dst = source;
- fdb_modified = true;
- /* Take over HW learned entry */
diff --git a/target/linux/generic/backport-5.4/771-mdio-bus-add-generic-find-bus.patch b/target/linux/generic/backport-5.4/771-mdio-bus-add-generic-find-bus.patch
deleted file mode 100644
index b79fa0f18a..0000000000
--- a/target/linux/generic/backport-5.4/771-mdio-bus-add-generic-find-bus.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From ce69e2162f158d9d4a0e513971d02dabc7d14cb7 Mon Sep 17 00:00:00 2001
-From: Jeremy Linton <jeremy.linton@arm.com>
-Date: Mon, 24 Feb 2020 16:53:58 -0600
-Subject: [PATCH] mdio_bus: Add generic mdio_find_bus()
-
-It appears most ethernet drivers follow one of two main strategies
-for mdio bus/phy management. A monolithic model where the net driver
-itself creates, probes and uses the phy, and one where an external
-mdio/phy driver instantiates the mdio bus/phy and the net driver
-only attaches to a known phy. Usually in this latter model the phys
-are discovered via DT relationships or simply phy name/address
-hardcoding.
-
-This is a shame because modern well behaved mdio buses are self
-describing and can be probed. The mdio layer itself is fully capable
-of this, yet there isn't a clean way for a standalone net driver
-to attach and enumerate the discovered devices. This is because
-outside of of_mdio_find_bus() there isn't a straightforward way
-to acquire the mii_bus pointer.
-
-So, lets add a mdio_find_bus which can return the mii_bus based
-only on its name.
-
-Signed-off-by: Jeremy Linton <jeremy.linton@arm.com>
-Acked-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/mdio_bus.c | 17 +++++++++++++++++
- include/linux/phy.h | 1 +
- 2 files changed, 18 insertions(+)
-
---- a/drivers/net/phy/mdio_bus.c
-+++ b/drivers/net/phy/mdio_bus.c
-@@ -260,6 +260,23 @@ static struct class mdio_bus_class = {
- .dev_release = mdiobus_release,
- };
-
-+/**
-+ * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
-+ * @mdio_bus_np: Pointer to the mii_bus.
-+ *
-+ * Returns a reference to the mii_bus, or NULL if none found. The
-+ * embedded struct device will have its reference count incremented,
-+ * and this must be put_deviced'ed once the bus is finished with.
-+ */
-+struct mii_bus *mdio_find_bus(const char *mdio_name)
-+{
-+ struct device *d;
-+
-+ d = class_find_device_by_name(&mdio_bus_class, mdio_name);
-+ return d ? to_mii_bus(d) : NULL;
-+}
-+EXPORT_SYMBOL(mdio_find_bus);
-+
- #if IS_ENABLED(CONFIG_OF_MDIO)
- /**
- * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -273,6 +273,7 @@ static inline struct mii_bus *devm_mdiob
- return devm_mdiobus_alloc_size(dev, 0);
- }
-
-+struct mii_bus *mdio_find_bus(const char *mdio_name);
- void devm_mdiobus_free(struct device *dev, struct mii_bus *bus);
- struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr);
-
diff --git a/target/linux/generic/backport-5.4/771-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch b/target/linux/generic/backport-5.4/771-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch
deleted file mode 100644
index 893eb719ca..0000000000
--- a/target/linux/generic/backport-5.4/771-v5.12-net-dsa-be-louder-when-a-non-legacy-FDB-operation-fa.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 2fd186501b1cff155cc4a755c210793cfc0dffb5 Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:31 +0200
-Subject: [PATCH] net: dsa: be louder when a non-legacy FDB operation fails
-
-The dev_close() call was added in commit c9eb3e0f8701 ("net: dsa: Add
-support for learning FDB through notification") "to indicate inconsistent
-situation" when we could not delete an FDB entry from the port.
-
-bridge fdb del d8:58:d7:00:ca:6d dev swp0 self master
-
-It is a bit drastic and at the same time not helpful if the above fails
-to only print with netdev_dbg log level, but on the other hand to bring
-the interface down.
-
-So increase the verbosity of the error message, and drop dev_close().
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/dsa/slave.c | 10 +++++++---
- 1 file changed, 7 insertions(+), 3 deletions(-)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1593,7 +1593,9 @@ static void dsa_slave_switchdev_event_wo
-
- err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid);
- if (err) {
-- netdev_dbg(dev, "fdb add failed err=%d\n", err);
-+ netdev_err(dev,
-+ "failed to add %pM vid %d to fdb: %d\n",
-+ fdb_info->addr, fdb_info->vid, err);
- break;
- }
- fdb_info->offloaded = true;
-@@ -1608,9 +1610,11 @@ static void dsa_slave_switchdev_event_wo
-
- err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid);
- if (err) {
-- netdev_dbg(dev, "fdb del failed err=%d\n", err);
-- dev_close(dev);
-+ netdev_err(dev,
-+ "failed to delete %pM vid %d from fdb: %d\n",
-+ fdb_info->addr, fdb_info->vid, err);
- }
-+
- break;
- }
- rtnl_unlock();
diff --git a/target/linux/generic/backport-5.4/772-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch b/target/linux/generic/backport-5.4/772-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch
deleted file mode 100644
index 275870d19f..0000000000
--- a/target/linux/generic/backport-5.4/772-v5.12-net-dsa-don-t-use-switchdev_notifier_fdb_info-in-dsa.patch
+++ /dev/null
@@ -1,226 +0,0 @@
-From c4bb76a9a0ef87c4cc1f636defed5f12deb9f5a7 Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:32 +0200
-Subject: [PATCH] net: dsa: don't use switchdev_notifier_fdb_info in
- dsa_switchdev_event_work
-
-Currently DSA doesn't add FDB entries on the CPU port, because it only
-does so through switchdev, which is associated with a net_device, and
-there are none of those for the CPU port.
-
-But actually FDB addresses on the CPU port have some use cases of their
-own, if the switchdev operations are initiated from within the DSA
-layer. There is just one problem with the existing code: it passes a
-structure in dsa_switchdev_event_work which was retrieved directly from
-switchdev, so it contains a net_device. We need to generalize the
-contents to something that covers the CPU port as well: the "ds, port"
-tuple is fine for that.
-
-Note that the new procedure for notifying the successful FDB offload is
-inspired from the rocker model.
-
-Also, nothing was being done if added_by_user was false. Let's check for
-that a lot earlier, and don't actually bother to schedule the worker
-for nothing.
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/dsa/dsa_priv.h | 12 +++++
- net/dsa/slave.c | 106 ++++++++++++++++++++++-----------------------
- 2 files changed, 65 insertions(+), 53 deletions(-)
-
---- a/net/dsa/dsa_priv.h
-+++ b/net/dsa/dsa_priv.h
-@@ -62,6 +62,18 @@ struct dsa_notifier_vlan_info {
- int port;
- };
-
-+struct dsa_switchdev_event_work {
-+ struct dsa_switch *ds;
-+ int port;
-+ struct work_struct work;
-+ unsigned long event;
-+ /* Specific for SWITCHDEV_FDB_ADD_TO_DEVICE and
-+ * SWITCHDEV_FDB_DEL_TO_DEVICE
-+ */
-+ unsigned char addr[ETH_ALEN];
-+ u16 vid;
-+};
-+
- struct dsa_slave_priv {
- /* Copy of CPU port xmit for faster access in slave transmit hot path */
- struct sk_buff * (*xmit)(struct sk_buff *skb,
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1568,76 +1568,66 @@ static int dsa_slave_netdevice_event(str
- return NOTIFY_DONE;
- }
-
--struct dsa_switchdev_event_work {
-- struct work_struct work;
-- struct switchdev_notifier_fdb_info fdb_info;
-- struct net_device *dev;
-- unsigned long event;
--};
-+static void
-+dsa_fdb_offload_notify(struct dsa_switchdev_event_work *switchdev_work)
-+{
-+ struct dsa_switch *ds = switchdev_work->ds;
-+ struct switchdev_notifier_fdb_info info;
-+ struct dsa_port *dp;
-+
-+ if (!dsa_is_user_port(ds, switchdev_work->port))
-+ return;
-+
-+ info.addr = switchdev_work->addr;
-+ info.vid = switchdev_work->vid;
-+ info.offloaded = true;
-+ dp = dsa_to_port(ds, switchdev_work->port);
-+ call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
-+ dp->slave, &info.info, NULL);
-+}
-
- static void dsa_slave_switchdev_event_work(struct work_struct *work)
- {
- struct dsa_switchdev_event_work *switchdev_work =
- container_of(work, struct dsa_switchdev_event_work, work);
-- struct net_device *dev = switchdev_work->dev;
-- struct switchdev_notifier_fdb_info *fdb_info;
-- struct dsa_port *dp = dsa_slave_to_port(dev);
-+ struct dsa_switch *ds = switchdev_work->ds;
-+ struct dsa_port *dp;
- int err;
-
-+ dp = dsa_to_port(ds, switchdev_work->port);
-+
- rtnl_lock();
- switch (switchdev_work->event) {
- case SWITCHDEV_FDB_ADD_TO_DEVICE:
-- fdb_info = &switchdev_work->fdb_info;
-- if (!fdb_info->added_by_user)
-- break;
--
-- err = dsa_port_fdb_add(dp, fdb_info->addr, fdb_info->vid);
-+ err = dsa_port_fdb_add(dp, switchdev_work->addr,
-+ switchdev_work->vid);
- if (err) {
-- netdev_err(dev,
-- "failed to add %pM vid %d to fdb: %d\n",
-- fdb_info->addr, fdb_info->vid, err);
-+ dev_err(ds->dev,
-+ "port %d failed to add %pM vid %d to fdb: %d\n",
-+ dp->index, switchdev_work->addr,
-+ switchdev_work->vid, err);
- break;
- }
-- fdb_info->offloaded = true;
-- call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, dev,
-- &fdb_info->info, NULL);
-+ dsa_fdb_offload_notify(switchdev_work);
- break;
-
- case SWITCHDEV_FDB_DEL_TO_DEVICE:
-- fdb_info = &switchdev_work->fdb_info;
-- if (!fdb_info->added_by_user)
-- break;
--
-- err = dsa_port_fdb_del(dp, fdb_info->addr, fdb_info->vid);
-+ err = dsa_port_fdb_del(dp, switchdev_work->addr,
-+ switchdev_work->vid);
- if (err) {
-- netdev_err(dev,
-- "failed to delete %pM vid %d from fdb: %d\n",
-- fdb_info->addr, fdb_info->vid, err);
-+ dev_err(ds->dev,
-+ "port %d failed to delete %pM vid %d from fdb: %d\n",
-+ dp->index, switchdev_work->addr,
-+ switchdev_work->vid, err);
- }
-
- break;
- }
- rtnl_unlock();
-
-- kfree(switchdev_work->fdb_info.addr);
- kfree(switchdev_work);
-- dev_put(dev);
--}
--
--static int
--dsa_slave_switchdev_fdb_work_init(struct dsa_switchdev_event_work *
-- switchdev_work,
-- const struct switchdev_notifier_fdb_info *
-- fdb_info)
--{
-- memcpy(&switchdev_work->fdb_info, fdb_info,
-- sizeof(switchdev_work->fdb_info));
-- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
-- if (!switchdev_work->fdb_info.addr)
-- return -ENOMEM;
-- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
-- fdb_info->addr);
-- return 0;
-+ if (dsa_is_user_port(ds, dp->index))
-+ dev_put(dp->slave);
- }
-
- /* Called under rcu_read_lock() */
-@@ -1645,7 +1635,9 @@ static int dsa_slave_switchdev_event(str
- unsigned long event, void *ptr)
- {
- struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
-+ const struct switchdev_notifier_fdb_info *fdb_info;
- struct dsa_switchdev_event_work *switchdev_work;
-+ struct dsa_port *dp;
- int err;
-
- if (event == SWITCHDEV_PORT_ATTR_SET) {
-@@ -1658,20 +1650,32 @@ static int dsa_slave_switchdev_event(str
- if (!dsa_slave_dev_check(dev))
- return NOTIFY_DONE;
-
-+ dp = dsa_slave_to_port(dev);
-+
- switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
- if (!switchdev_work)
- return NOTIFY_BAD;
-
- INIT_WORK(&switchdev_work->work,
- dsa_slave_switchdev_event_work);
-- switchdev_work->dev = dev;
-+ switchdev_work->ds = dp->ds;
-+ switchdev_work->port = dp->index;
- switchdev_work->event = event;
-
- switch (event) {
- case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */
- case SWITCHDEV_FDB_DEL_TO_DEVICE:
-- if (dsa_slave_switchdev_fdb_work_init(switchdev_work, ptr))
-- goto err_fdb_work_init;
-+ fdb_info = ptr;
-+
-+ if (!fdb_info->added_by_user) {
-+ kfree(switchdev_work);
-+ return NOTIFY_OK;
-+ }
-+
-+ ether_addr_copy(switchdev_work->addr,
-+ fdb_info->addr);
-+ switchdev_work->vid = fdb_info->vid;
-+
- dev_hold(dev);
- break;
- default:
-@@ -1681,10 +1685,6 @@ static int dsa_slave_switchdev_event(str
-
- dsa_schedule_work(&switchdev_work->work);
- return NOTIFY_OK;
--
--err_fdb_work_init:
-- kfree(switchdev_work);
-- return NOTIFY_BAD;
- }
-
- static int dsa_slave_switchdev_blocking_event(struct notifier_block *unused,
diff --git a/target/linux/generic/backport-5.4/773-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch b/target/linux/generic/backport-5.4/773-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch
deleted file mode 100644
index b70986fcc1..0000000000
--- a/target/linux/generic/backport-5.4/773-v5.12-net-dsa-move-switchdev-event-implementation-under-th.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From 447d290a58bd335d68f665713842365d3d6447df Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:33 +0200
-Subject: [PATCH] net: dsa: move switchdev event implementation under the same
- switch/case statement
-
-We'll need to start listening to SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE
-events even for interfaces where dsa_slave_dev_check returns false, so
-we need that check inside the switch-case statement for SWITCHDEV_FDB_*.
-
-This movement also avoids a useless allocation / free of switchdev_work
-on the untreated "default event" case.
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/dsa/slave.c | 35 ++++++++++++++++-------------------
- 1 file changed, 16 insertions(+), 19 deletions(-)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1640,31 +1640,29 @@ static int dsa_slave_switchdev_event(str
- struct dsa_port *dp;
- int err;
-
-- if (event == SWITCHDEV_PORT_ATTR_SET) {
-+ switch (event) {
-+ case SWITCHDEV_PORT_ATTR_SET:
- err = switchdev_handle_port_attr_set(dev, ptr,
- dsa_slave_dev_check,
- dsa_slave_port_attr_set);
- return notifier_from_errno(err);
-- }
--
-- if (!dsa_slave_dev_check(dev))
-- return NOTIFY_DONE;
-+ case SWITCHDEV_FDB_ADD_TO_DEVICE:
-+ case SWITCHDEV_FDB_DEL_TO_DEVICE:
-+ if (!dsa_slave_dev_check(dev))
-+ return NOTIFY_DONE;
-
-- dp = dsa_slave_to_port(dev);
-+ dp = dsa_slave_to_port(dev);
-
-- switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
-- if (!switchdev_work)
-- return NOTIFY_BAD;
--
-- INIT_WORK(&switchdev_work->work,
-- dsa_slave_switchdev_event_work);
-- switchdev_work->ds = dp->ds;
-- switchdev_work->port = dp->index;
-- switchdev_work->event = event;
-+ switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
-+ if (!switchdev_work)
-+ return NOTIFY_BAD;
-+
-+ INIT_WORK(&switchdev_work->work,
-+ dsa_slave_switchdev_event_work);
-+ switchdev_work->ds = dp->ds;
-+ switchdev_work->port = dp->index;
-+ switchdev_work->event = event;
-
-- switch (event) {
-- case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */
-- case SWITCHDEV_FDB_DEL_TO_DEVICE:
- fdb_info = ptr;
-
- if (!fdb_info->added_by_user) {
-@@ -1677,13 +1675,12 @@ static int dsa_slave_switchdev_event(str
- switchdev_work->vid = fdb_info->vid;
-
- dev_hold(dev);
-+ dsa_schedule_work(&switchdev_work->work);
- break;
- default:
-- kfree(switchdev_work);
- return NOTIFY_DONE;
- }
-
-- dsa_schedule_work(&switchdev_work->work);
- return NOTIFY_OK;
- }
-
diff --git a/target/linux/generic/backport-5.4/774-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch b/target/linux/generic/backport-5.4/774-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch
deleted file mode 100644
index c7ed4064e8..0000000000
--- a/target/linux/generic/backport-5.4/774-v5.12-net-dsa-exit-early-in-dsa_slave_switchdev_event-if-w.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 5fb4a451a87d8ed3363d28b63a3295399373d6c4 Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:34 +0200
-Subject: [PATCH] net: dsa: exit early in dsa_slave_switchdev_event if we can't
- program the FDB
-
-Right now, the following would happen for a switch driver that does not
-implement .port_fdb_add or .port_fdb_del.
-
-dsa_slave_switchdev_event returns NOTIFY_OK and schedules:
--> dsa_slave_switchdev_event_work
- -> dsa_port_fdb_add
- -> dsa_port_notify(DSA_NOTIFIER_FDB_ADD)
- -> dsa_switch_fdb_add
- -> if (!ds->ops->port_fdb_add) return -EOPNOTSUPP;
- -> an error is printed with dev_dbg, and
- dsa_fdb_offload_notify(switchdev_work) is not called.
-
-We can avoid scheduling the worker for nothing and say NOTIFY_DONE.
-Because we don't call dsa_fdb_offload_notify, the static FDB entry will
-remain just in the software bridge.
-
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/dsa/slave.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1653,6 +1653,9 @@ static int dsa_slave_switchdev_event(str
-
- dp = dsa_slave_to_port(dev);
-
-+ if (!dp->ds->ops->port_fdb_add || !dp->ds->ops->port_fdb_del)
-+ return NOTIFY_DONE;
-+
- switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
- if (!switchdev_work)
- return NOTIFY_BAD;
diff --git a/target/linux/generic/backport-5.4/775-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch b/target/linux/generic/backport-5.4/775-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch
deleted file mode 100644
index e4ed6e808f..0000000000
--- a/target/linux/generic/backport-5.4/775-v5.12-net-dsa-listen-for-SWITCHDEV_-FDB-DEL-_ADD_TO_DEVICE.patch
+++ /dev/null
@@ -1,263 +0,0 @@
-From d5f19486cee79d04c054427577ac96ed123706db Mon Sep 17 00:00:00 2001
-From: Vladimir Oltean <vladimir.oltean@nxp.com>
-Date: Wed, 6 Jan 2021 11:51:35 +0200
-Subject: [PATCH] net: dsa: listen for SWITCHDEV_{FDB,DEL}_ADD_TO_DEVICE on
- foreign bridge neighbors
-
-Some DSA switches (and not only) cannot learn source MAC addresses from
-packets injected from the CPU. They only perform hardware address
-learning from inbound traffic.
-
-This can be problematic when we have a bridge spanning some DSA switch
-ports and some non-DSA ports (which we'll call "foreign interfaces" from
-DSA's perspective).
-
-There are 2 classes of problems created by the lack of learning on
-CPU-injected traffic:
-- excessive flooding, due to the fact that DSA treats those addresses as
- unknown
-- the risk of stale routes, which can lead to temporary packet loss
-
-To illustrate the second class, consider the following situation, which
-is common in production equipment (wireless access points, where there
-is a WLAN interface and an Ethernet switch, and these form a single
-bridging domain).
-
- AP 1:
- +------------------------------------------------------------------------+
- | br0 |
- +------------------------------------------------------------------------+
- +------------+ +------------+ +------------+ +------------+ +------------+
- | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 |
- +------------+ +------------+ +------------+ +------------+ +------------+
- | ^ ^
- | | |
- | | |
- | Client A Client B
- |
- |
- |
- +------------+ +------------+ +------------+ +------------+ +------------+
- | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 |
- +------------+ +------------+ +------------+ +------------+ +------------+
- +------------------------------------------------------------------------+
- | br0 |
- +------------------------------------------------------------------------+
- AP 2
-
-- br0 of AP 1 will know that Clients A and B are reachable via wlan0
-- the hardware fdb of a DSA switch driver today is not kept in sync with
- the software entries on other bridge ports, so it will not know that
- clients A and B are reachable via the CPU port UNLESS the hardware
- switch itself performs SA learning from traffic injected from the CPU.
- Nonetheless, a substantial number of switches don't.
-- the hardware fdb of the DSA switch on AP 2 may autonomously learn that
- Client A and B are reachable through swp0. Therefore, the software br0
- of AP 2 also may or may not learn this. In the example we're
- illustrating, some Ethernet traffic has been going on, and br0 from AP
- 2 has indeed learnt that it can reach Client B through swp0.
-
-One of the wireless clients, say Client B, disconnects from AP 1 and
-roams to AP 2. The topology now looks like this:
-
- AP 1:
- +------------------------------------------------------------------------+
- | br0 |
- +------------------------------------------------------------------------+
- +------------+ +------------+ +------------+ +------------+ +------------+
- | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 |
- +------------+ +------------+ +------------+ +------------+ +------------+
- | ^
- | |
- | Client A
- |
- |
- | Client B
- | |
- | v
- +------------+ +------------+ +------------+ +------------+ +------------+
- | swp0 | | swp1 | | swp2 | | swp3 | | wlan0 |
- +------------+ +------------+ +------------+ +------------+ +------------+
- +------------------------------------------------------------------------+
- | br0 |
- +------------------------------------------------------------------------+
- AP 2
-
-- br0 of AP 1 still knows that Client A is reachable via wlan0 (no change)
-- br0 of AP 1 will (possibly) know that Client B has left wlan0. There
- are cases where it might never find out though. Either way, DSA today
- does not process that notification in any way.
-- the hardware FDB of the DSA switch on AP 1 may learn autonomously that
- Client B can be reached via swp0, if it receives any packet with
- Client 1's source MAC address over Ethernet.
-- the hardware FDB of the DSA switch on AP 2 still thinks that Client B
- can be reached via swp0. It does not know that it has roamed to wlan0,
- because it doesn't perform SA learning from the CPU port.
-
-Now Client A contacts Client B.
-AP 1 routes the packet fine towards swp0 and delivers it on the Ethernet
-segment.
-AP 2 sees a frame on swp0 and its fdb says that the destination is swp0.
-Hairpinning is disabled => drop.
-
-This problem comes from the fact that these switches have a 'blind spot'
-for addresses coming from software bridging. The generic solution is not
-to assume that hardware learning can be enabled somehow, but to listen
-to more bridge learning events. It turns out that the bridge driver does
-learn in software from all inbound frames, in __br_handle_local_finish.
-A proper SWITCHDEV_FDB_ADD_TO_DEVICE notification is emitted for the
-addresses serviced by the bridge on 'foreign' interfaces. The software
-bridge also does the right thing on migration, by notifying that the old
-entry is deleted, so that does not need to be special-cased in DSA. When
-it is deleted, we just need to delete our static FDB entry towards the
-CPU too, and wait.
-
-The problem is that DSA currently only cares about SWITCHDEV_FDB_ADD_TO_DEVICE
-events received on its own interfaces, such as static FDB entries.
-
-Luckily we can change that, and DSA can listen to all switchdev FDB
-add/del events in the system and figure out if those events were emitted
-by a bridge that spans at least one of DSA's own ports. In case that is
-true, DSA will also offload that address towards its own CPU port, in
-the eventuality that there might be bridge clients attached to the DSA
-switch who want to talk to the station connected to the foreign
-interface.
-
-In terms of implementation, we need to keep the fdb_info->added_by_user
-check for the case where the switchdev event was targeted directly at a
-DSA switch port. But we don't need to look at that flag for snooped
-events. So the check is currently too late, we need to move it earlier.
-This also simplifies the code a bit, since we avoid uselessly allocating
-and freeing switchdev_work.
-
-We could probably do some improvements in the future. For example,
-multi-bridge support is rudimentary at the moment. If there are two
-bridges spanning a DSA switch's ports, and both of them need to service
-the same MAC address, then what will happen is that the migration of one
-of those stations will trigger the deletion of the FDB entry from the
-CPU port while it is still used by other bridge. That could be improved
-with reference counting but is left for another time.
-
-This behavior needs to be enabled at driver level by setting
-ds->assisted_learning_on_cpu_port = true. This is because we don't want
-to inflict a potential performance penalty (accesses through
-MDIO/I2C/SPI are expensive) to hardware that really doesn't need it
-because address learning on the CPU port works there.
-
-Reported-by: DENG Qingfang <dqfext@gmail.com>
-Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-[Backported to linux-5.4.y]
-Signed-off-by: DENG Qingfang <dqfext@gmail.com>
----
- include/net/dsa.h | 5 ++++
- net/dsa/slave.c | 63 ++++++++++++++++++++++++++++++++++++++---------
- 2 files changed, 57 insertions(+), 11 deletions(-)
-
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -279,6 +279,11 @@ struct dsa_switch {
- */
- bool configure_vlan_while_not_filtering;
-
-+ /* Let DSA manage the FDB entries towards the CPU, based on the
-+ * software bridge database.
-+ */
-+ bool assisted_learning_on_cpu_port;
-+
- /* In case vlan_filtering_is_global is set, the VLAN awareness state
- * should be retrieved from here and not from the per-port settings.
- */
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1630,6 +1630,25 @@ static void dsa_slave_switchdev_event_wo
- dev_put(dp->slave);
- }
-
-+static int dsa_lower_dev_walk(struct net_device *lower_dev, void *data)
-+{
-+ if (dsa_slave_dev_check(lower_dev)) {
-+ *((void **)data) = (void *)netdev_priv(lower_dev);
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+static struct dsa_slave_priv *dsa_slave_dev_lower_find(struct net_device *dev)
-+{
-+ struct dsa_slave_priv *data = NULL;
-+
-+ netdev_walk_all_lower_dev_rcu(dev, dsa_lower_dev_walk, (void **) &data);
-+
-+ return data;
-+}
-+
- /* Called under rcu_read_lock() */
- static int dsa_slave_switchdev_event(struct notifier_block *unused,
- unsigned long event, void *ptr)
-@@ -1648,10 +1667,37 @@ static int dsa_slave_switchdev_event(str
- return notifier_from_errno(err);
- case SWITCHDEV_FDB_ADD_TO_DEVICE:
- case SWITCHDEV_FDB_DEL_TO_DEVICE:
-- if (!dsa_slave_dev_check(dev))
-- return NOTIFY_DONE;
-+ fdb_info = ptr;
-+
-+ if (dsa_slave_dev_check(dev)) {
-+ if (!fdb_info->added_by_user)
-+ return NOTIFY_OK;
-+
-+ dp = dsa_slave_to_port(dev);
-+ } else {
-+ /* Snoop addresses learnt on foreign interfaces
-+ * bridged with us, for switches that don't
-+ * automatically learn SA from CPU-injected traffic
-+ */
-+ struct net_device *br_dev;
-+ struct dsa_slave_priv *p;
-+
-+ br_dev = netdev_master_upper_dev_get_rcu(dev);
-+ if (!br_dev)
-+ return NOTIFY_DONE;
-+
-+ if (!netif_is_bridge_master(br_dev))
-+ return NOTIFY_DONE;
-+
-+ p = dsa_slave_dev_lower_find(br_dev);
-+ if (!p)
-+ return NOTIFY_DONE;
-
-- dp = dsa_slave_to_port(dev);
-+ dp = p->dp->cpu_dp;
-+
-+ if (!dp->ds->assisted_learning_on_cpu_port)
-+ return NOTIFY_DONE;
-+ }
-
- if (!dp->ds->ops->port_fdb_add || !dp->ds->ops->port_fdb_del)
- return NOTIFY_DONE;
-@@ -1666,18 +1712,13 @@ static int dsa_slave_switchdev_event(str
- switchdev_work->port = dp->index;
- switchdev_work->event = event;
-
-- fdb_info = ptr;
--
-- if (!fdb_info->added_by_user) {
-- kfree(switchdev_work);
-- return NOTIFY_OK;
-- }
--
- ether_addr_copy(switchdev_work->addr,
- fdb_info->addr);
- switchdev_work->vid = fdb_info->vid;
-
-- dev_hold(dev);
-+ /* Hold a reference on the slave for dsa_fdb_offload_notify */
-+ if (dsa_is_user_port(dp->ds, dp->index))
-+ dev_hold(dev);
- dsa_schedule_work(&switchdev_work->work);
- break;
- default:
diff --git a/target/linux/generic/backport-5.4/780-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch b/target/linux/generic/backport-5.4/780-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch
deleted file mode 100644
index 7ad7cd3a01..0000000000
--- a/target/linux/generic/backport-5.4/780-net-dsa-mt7530-setup-core-clock-even-in-TRGMII-mode.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From c3b8e07909dbe67b0d580416c1a5257643a73be7 Mon Sep 17 00:00:00 2001
-From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
-Date: Fri, 12 Mar 2021 00:07:03 -0800
-Subject: [PATCH] net: dsa: mt7530: setup core clock even in TRGMII mode
-
-A recent change to MIPS ralink reset logic made it so mt7530 actually
-resets the switch on platforms such as mt7621 (where bit 2 is the reset
-line for the switch). That exposed an issue where the switch would not
-function properly in TRGMII mode after a reset.
-
-Reconfigure core clock in TRGMII mode to fix the issue.
-
-Tested on Ubiquiti ER-X (MT7621) with TRGMII mode enabled.
-
-Fixes: 3f9ef7785a9c ("MIPS: ralink: manage low reset lines")
-Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/dsa/mt7530.c | 52 +++++++++++++++++++---------------------
- 1 file changed, 25 insertions(+), 27 deletions(-)
-
---- a/drivers/net/dsa/mt7530.c
-+++ b/drivers/net/dsa/mt7530.c
-@@ -428,34 +428,32 @@ mt7530_pad_clk_setup(struct dsa_switch *
- TD_DM_DRVP(8) | TD_DM_DRVN(8));
-
- /* Setup core clock for MT7530 */
-- if (!trgint) {
-- /* Disable MT7530 core clock */
-- core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
--
-- /* Disable PLL, since phy_device has not yet been created
-- * provided for phy_[read,write]_mmd_indirect is called, we
-- * provide our own core_write_mmd_indirect to complete this
-- * function.
-- */
-- core_write_mmd_indirect(priv,
-- CORE_GSWPLL_GRP1,
-- MDIO_MMD_VEND2,
-- 0);
--
-- /* Set core clock into 500Mhz */
-- core_write(priv, CORE_GSWPLL_GRP2,
-- RG_GSWPLL_POSDIV_500M(1) |
-- RG_GSWPLL_FBKDIV_500M(25));
--
-- /* Enable PLL */
-- core_write(priv, CORE_GSWPLL_GRP1,
-- RG_GSWPLL_EN_PRE |
-- RG_GSWPLL_POSDIV_200M(2) |
-- RG_GSWPLL_FBKDIV_200M(32));
--
-- /* Enable MT7530 core clock */
-- core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
-- }
-+ /* Disable MT7530 core clock */
-+ core_clear(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
-+
-+ /* Disable PLL, since phy_device has not yet been created
-+ * provided for phy_[read,write]_mmd_indirect is called, we
-+ * provide our own core_write_mmd_indirect to complete this
-+ * function.
-+ */
-+ core_write_mmd_indirect(priv,
-+ CORE_GSWPLL_GRP1,
-+ MDIO_MMD_VEND2,
-+ 0);
-+
-+ /* Set core clock into 500Mhz */
-+ core_write(priv, CORE_GSWPLL_GRP2,
-+ RG_GSWPLL_POSDIV_500M(1) |
-+ RG_GSWPLL_FBKDIV_500M(25));
-+
-+ /* Enable PLL */
-+ core_write(priv, CORE_GSWPLL_GRP1,
-+ RG_GSWPLL_EN_PRE |
-+ RG_GSWPLL_POSDIV_200M(2) |
-+ RG_GSWPLL_FBKDIV_200M(32));
-+
-+ /* Enable MT7530 core clock */
-+ core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
-
- /* Setup the MT7530 TRGMII Tx Clock */
- core_set(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
diff --git a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
deleted file mode 100644
index 66d379b859..0000000000
--- a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch
+++ /dev/null
@@ -1,1875 +0,0 @@
-From 83216e3988cd196183542937c9bd58b279f946af Mon Sep 17 00:00:00 2001
-From: Michael Walle <michael@walle.cc>
-Date: Mon, 12 Apr 2021 19:47:17 +0200
-Subject: of: net: pass the dst buffer to of_get_mac_address()
-
-of_get_mac_address() returns a "const void*" pointer to a MAC address.
-Lately, support to fetch the MAC address by an NVMEM provider was added.
-But this will only work with platform devices. It will not work with
-PCI devices (e.g. of an integrated root complex) and esp. not with DSA
-ports.
-
-There is an of_* variant of the nvmem binding which works without
-devices. The returned data of a nvmem_cell_read() has to be freed after
-use. On the other hand the return of_get_mac_address() points to some
-static data without a lifetime. The trick for now, was to allocate a
-device resource managed buffer which is then returned. This will only
-work if we have an actual device.
-
-Change it, so that the caller of of_get_mac_address() has to supply a
-buffer where the MAC address is written to. Unfortunately, this will
-touch all drivers which use the of_get_mac_address().
-
-Usually the code looks like:
-
- const char *addr;
- addr = of_get_mac_address(np);
- if (!IS_ERR(addr))
- ether_addr_copy(ndev->dev_addr, addr);
-
-This can then be simply rewritten as:
-
- of_get_mac_address(np, ndev->dev_addr);
-
-Sometimes is_valid_ether_addr() is used to test the MAC address.
-of_get_mac_address() already makes sure, it just returns a valid MAC
-address. Thus we can just test its return code. But we have to be
-careful if there are still other sources for the MAC address before the
-of_get_mac_address(). In this case we have to keep the
-is_valid_ether_addr() call.
-
-The following coccinelle patch was used to convert common cases to the
-new style. Afterwards, I've manually gone over the drivers and fixed the
-return code variable: either used a new one or if one was already
-available use that. Mansour Moufid, thanks for that coccinelle patch!
-
-<spml>
-@a@
-identifier x;
-expression y, z;
-@@
-- x = of_get_mac_address(y);
-+ x = of_get_mac_address(y, z);
- <...
-- ether_addr_copy(z, x);
- ...>
-
-@@
-identifier a.x;
-@@
-- if (<+... x ...+>) {}
-
-@@
-identifier a.x;
-@@
- if (<+... x ...+>) {
- ...
- }
-- else {}
-
-@@
-identifier a.x;
-expression e;
-@@
-- if (<+... x ...+>@e)
-- {}
-- else
-+ if (!(e))
- {...}
-
-@@
-expression x, y, z;
-@@
-- x = of_get_mac_address(y, z);
-+ of_get_mac_address(y, z);
- ... when != x
-</spml>
-
-All drivers, except drivers/net/ethernet/aeroflex/greth.c, were
-compile-time tested.
-
-Suggested-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Michael Walle <michael@walle.cc>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- arch/arm/mach-mvebu/kirkwood.c | 3 +-
- arch/powerpc/sysdev/tsi108_dev.c | 5 +-
- drivers/net/ethernet/aeroflex/greth.c | 6 +--
- drivers/net/ethernet/allwinner/sun4i-emac.c | 10 ++--
- drivers/net/ethernet/altera/altera_tse_main.c | 7 +--
- drivers/net/ethernet/arc/emac_main.c | 8 +--
- drivers/net/ethernet/atheros/ag71xx.c | 7 +--
- drivers/net/ethernet/broadcom/bcm4908_enet.c | 7 +--
- drivers/net/ethernet/broadcom/bcmsysport.c | 7 +--
- drivers/net/ethernet/broadcom/bgmac-bcma.c | 10 ++--
- drivers/net/ethernet/broadcom/bgmac-platform.c | 11 ++--
- drivers/net/ethernet/cadence/macb_main.c | 11 ++--
- drivers/net/ethernet/cavium/octeon/octeon_mgmt.c | 8 +--
- drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 5 +-
- drivers/net/ethernet/davicom/dm9000.c | 10 ++--
- drivers/net/ethernet/ethoc.c | 6 +--
- drivers/net/ethernet/ezchip/nps_enet.c | 7 +--
- drivers/net/ethernet/freescale/fec_main.c | 7 +--
- drivers/net/ethernet/freescale/fec_mpc52xx.c | 7 +--
- drivers/net/ethernet/freescale/fman/mac.c | 9 ++--
- .../net/ethernet/freescale/fs_enet/fs_enet-main.c | 5 +-
- drivers/net/ethernet/freescale/gianfar.c | 8 +--
- drivers/net/ethernet/freescale/ucc_geth.c | 5 +-
- drivers/net/ethernet/hisilicon/hisi_femac.c | 7 +--
- drivers/net/ethernet/hisilicon/hix5hd2_gmac.c | 7 +--
- drivers/net/ethernet/lantiq_xrx200.c | 7 +--
- drivers/net/ethernet/marvell/mv643xx_eth.c | 5 +-
- drivers/net/ethernet/marvell/mvneta.c | 6 +--
- .../net/ethernet/marvell/prestera/prestera_main.c | 11 ++--
- drivers/net/ethernet/marvell/pxa168_eth.c | 9 +---
- drivers/net/ethernet/marvell/sky2.c | 8 ++-
- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 11 ++--
- drivers/net/ethernet/micrel/ks8851_common.c | 7 ++-
- drivers/net/ethernet/microchip/lan743x_main.c | 5 +-
- drivers/net/ethernet/nxp/lpc_eth.c | 4 +-
- drivers/net/ethernet/qualcomm/qca_spi.c | 10 ++--
- drivers/net/ethernet/qualcomm/qca_uart.c | 9 +---
- drivers/net/ethernet/renesas/ravb_main.c | 12 +++--
- drivers/net/ethernet/renesas/sh_eth.c | 5 +-
- .../net/ethernet/samsung/sxgbe/sxgbe_platform.c | 13 ++---
- drivers/net/ethernet/socionext/sni_ave.c | 10 ++--
- .../net/ethernet/stmicro/stmmac/dwmac-anarion.c | 2 +-
- .../ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-generic.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-imx.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-intel-plat.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-ipq806x.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-mediatek.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c | 2 +-
- .../ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 2 +-
- .../net/ethernet/stmicro/stmmac/dwmac-visconti.c | 2 +-
- drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 +-
- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 +-
- .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 14 ++---
- .../net/ethernet/stmicro/stmmac/stmmac_platform.h | 2 +-
- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 19 ++++---
- drivers/net/ethernet/ti/cpsw.c | 7 +--
- drivers/net/ethernet/ti/cpsw_new.c | 7 +--
- drivers/net/ethernet/ti/davinci_emac.c | 8 +--
- drivers/net/ethernet/ti/netcp_core.c | 7 +--
- drivers/net/ethernet/wiznet/w5100-spi.c | 8 ++-
- drivers/net/ethernet/wiznet/w5100.c | 2 +-
- drivers/net/ethernet/xilinx/ll_temac_main.c | 8 +--
- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 15 +++---
- drivers/net/ethernet/xilinx/xilinx_emaclite.c | 8 +--
- drivers/net/wireless/ath/ath9k/init.c | 5 +-
- drivers/net/wireless/mediatek/mt76/eeprom.c | 9 +---
- drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 6 +--
- drivers/of/of_net.c | 60 ++++++++++------------
- drivers/staging/octeon/ethernet.c | 10 ++--
- drivers/staging/wfx/main.c | 7 ++-
- include/linux/of_net.h | 6 +--
- include/net/dsa.h | 2 +-
- net/dsa/dsa2.c | 2 +-
- net/dsa/slave.c | 2 +-
- net/ethernet/eth.c | 11 ++--
- 85 files changed, 218 insertions(+), 364 deletions(-)
-
---- a/arch/arm/mach-mvebu/kirkwood.c
-+++ b/arch/arm/mach-mvebu/kirkwood.c
-@@ -84,6 +84,7 @@ static void __init kirkwood_dt_eth_fixup
- struct device_node *pnp = of_get_parent(np);
- struct clk *clk;
- struct property *pmac;
-+ u8 tmpmac[ETH_ALEN];
- void __iomem *io;
- u8 *macaddr;
- u32 reg;
-@@ -93,7 +94,7 @@ static void __init kirkwood_dt_eth_fixup
-
- /* skip disabled nodes or nodes with valid MAC address*/
- if (!of_device_is_available(pnp) ||
-- !IS_ERR(of_get_mac_address(np)))
-+ !of_get_mac_address(np, tmpmac))
- goto eth_fixup_skip;
-
- clk = of_clk_get(pnp, 0);
---- a/arch/powerpc/sysdev/tsi108_dev.c
-+++ b/arch/powerpc/sysdev/tsi108_dev.c
-@@ -73,7 +73,6 @@ static int __init tsi108_eth_of_init(voi
- struct device_node *phy, *mdio;
- hw_info tsi_eth_data;
- const unsigned int *phy_id;
-- const void *mac_addr;
- const phandle *ph;
-
- memset(r, 0, sizeof(r));
-@@ -101,9 +100,7 @@ static int __init tsi108_eth_of_init(voi
- goto err;
- }
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(tsi_eth_data.mac_addr, mac_addr);
-+ of_get_mac_address(np, tsi_eth_data.mac_addr);
-
- ph = of_get_property(np, "mdio-handle", NULL);
- mdio = of_find_node_by_phandle(*ph);
---- a/drivers/net/ethernet/aeroflex/greth.c
-+++ b/drivers/net/ethernet/aeroflex/greth.c
-@@ -1451,10 +1451,10 @@ static int greth_of_probe(struct platfor
- break;
- }
- if (i == 6) {
-- const u8 *addr;
-+ u8 addr[ETH_ALEN];
-
-- addr = of_get_mac_address(ofdev->dev.of_node);
-- if (!IS_ERR(addr)) {
-+ err = of_get_mac_address(ofdev->dev.of_node, addr);
-+ if (!err) {
- for (i = 0; i < 6; i++)
- macaddr[i] = (unsigned int) addr[i];
- } else {
---- a/drivers/net/ethernet/allwinner/sun4i-emac.c
-+++ b/drivers/net/ethernet/allwinner/sun4i-emac.c
-@@ -807,7 +807,6 @@ static int emac_probe(struct platform_de
- struct emac_board_info *db;
- struct net_device *ndev;
- int ret = 0;
-- const char *mac_addr;
-
- ndev = alloc_etherdev(sizeof(struct emac_board_info));
- if (!ndev) {
-@@ -870,12 +869,9 @@ static int emac_probe(struct platform_de
- }
-
- /* Read MAC-address from DT */
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
--
-- /* Check if the MAC address is valid, if not get a random one */
-- if (!is_valid_ether_addr(ndev->dev_addr)) {
-+ ret = of_get_mac_address(np, ndev->dev_addr);
-+ if (ret) {
-+ /* if the MAC address is invalid get a random one */
- eth_hw_addr_random(ndev);
- dev_warn(&pdev->dev, "using random MAC address %pM\n",
- ndev->dev_addr);
---- a/drivers/net/ethernet/altera/altera_tse_main.c
-+++ b/drivers/net/ethernet/altera/altera_tse_main.c
-@@ -1351,7 +1351,6 @@ static int altera_tse_probe(struct platf
- struct resource *control_port;
- struct resource *dma_res;
- struct altera_tse_private *priv;
-- const unsigned char *macaddr;
- void __iomem *descmap;
- const struct of_device_id *of_id = NULL;
-
-@@ -1528,10 +1527,8 @@ static int altera_tse_probe(struct platf
- priv->rx_dma_buf_sz = ALTERA_RXDMABUFFER_SIZE;
-
- /* get default MAC address from device tree */
-- macaddr = of_get_mac_address(pdev->dev.of_node);
-- if (!IS_ERR(macaddr))
-- ether_addr_copy(ndev->dev_addr, macaddr);
-- else
-+ ret = of_get_mac_address(pdev->dev.of_node, ndev->dev_addr);
-+ if (ret)
- eth_hw_addr_random(ndev);
-
- /* get phy addr and create mdio */
---- a/drivers/net/ethernet/arc/emac_main.c
-+++ b/drivers/net/ethernet/arc/emac_main.c
-@@ -870,7 +870,6 @@ int arc_emac_probe(struct net_device *nd
- struct device_node *phy_node;
- struct phy_device *phydev = NULL;
- struct arc_emac_priv *priv;
-- const char *mac_addr;
- unsigned int id, clock_frequency, irq;
- int err;
-
-@@ -955,11 +954,8 @@ int arc_emac_probe(struct net_device *nd
- }
-
- /* Get MAC address from device tree */
-- mac_addr = of_get_mac_address(dev->of_node);
--
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- else
-+ err = of_get_mac_address(dev->of_node, ndev->dev_addr);
-+ if (err)
- eth_hw_addr_random(ndev);
-
- arc_emac_set_address_internal(ndev);
---- a/drivers/net/ethernet/atheros/ag71xx.c
-+++ b/drivers/net/ethernet/atheros/ag71xx.c
-@@ -1634,7 +1634,6 @@ static int ag71xx_probe(struct platform_
- const struct ag71xx_dcfg *dcfg;
- struct net_device *ndev;
- struct resource *res;
-- const void *mac_addr;
- int tx_size, err, i;
- struct ag71xx *ag;
-
-@@ -1735,10 +1734,8 @@ static int ag71xx_probe(struct platform_
- ag->stop_desc->ctrl = 0;
- ag->stop_desc->next = (u32)ag->stop_desc_dma;
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
-- if (IS_ERR(mac_addr) || !is_valid_ether_addr(ndev->dev_addr)) {
-+ err = of_get_mac_address(np, ndev->dev_addr);
-+ if (err) {
- netif_err(ag, probe, ndev, "invalid MAC address, using random address\n");
- eth_random_addr(ndev->dev_addr);
- }
---- a/drivers/net/ethernet/broadcom/bcmsysport.c
-+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
-@@ -2423,7 +2423,6 @@ static int bcm_sysport_probe(struct plat
- struct bcm_sysport_priv *priv;
- struct device_node *dn;
- struct net_device *dev;
-- const void *macaddr;
- u32 txq, rxq;
- int ret;
-
-@@ -2505,12 +2504,10 @@ static int bcm_sysport_probe(struct plat
- }
-
- /* Initialize netdevice members */
-- macaddr = of_get_mac_address(dn);
-- if (IS_ERR(macaddr)) {
-+ ret = of_get_mac_address(dn, dev->dev_addr);
-+ if (ret) {
- dev_warn(&pdev->dev, "using random Ethernet MAC\n");
- eth_hw_addr_random(dev);
-- } else {
-- ether_addr_copy(dev->dev_addr, macaddr);
- }
-
- SET_NETDEV_DEV(dev, &pdev->dev);
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -115,7 +115,7 @@ static int bgmac_probe(struct bcma_devic
- struct ssb_sprom *sprom = &core->bus->sprom;
- struct mii_bus *mii_bus;
- struct bgmac *bgmac;
-- const u8 *mac = NULL;
-+ const u8 *mac;
- int err;
-
- bgmac = bgmac_alloc(&core->dev);
-@@ -128,11 +128,10 @@ static int bgmac_probe(struct bcma_devic
-
- bcma_set_drvdata(core, bgmac);
-
-- if (bgmac->dev->of_node)
-- mac = of_get_mac_address(bgmac->dev->of_node);
-+ err = of_get_mac_address(bgmac->dev->of_node, bgmac->net_dev->dev_addr);
-
- /* If no MAC address assigned via device tree, check SPROM */
-- if (IS_ERR_OR_NULL(mac)) {
-+ if (err) {
- switch (core->core_unit) {
- case 0:
- mac = sprom->et0mac;
-@@ -149,10 +148,9 @@ static int bgmac_probe(struct bcma_devic
- err = -ENOTSUPP;
- goto err;
- }
-+ ether_addr_copy(bgmac->net_dev->dev_addr, mac);
- }
-
-- ether_addr_copy(bgmac->net_dev->dev_addr, mac);
--
- /* On BCM4706 we need common core to access PHY */
- if (core->id.id == BCMA_CORE_4706_MAC_GBIT &&
- !core->bus->drv_gmac_cmn.core) {
---- a/drivers/net/ethernet/broadcom/bgmac-platform.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-platform.c
-@@ -173,7 +173,7 @@ static int bgmac_probe(struct platform_d
- struct device_node *np = pdev->dev.of_node;
- struct bgmac *bgmac;
- struct resource *regs;
-- const u8 *mac_addr;
-+ int ret;
-
- bgmac = bgmac_alloc(&pdev->dev);
- if (!bgmac)
-@@ -192,11 +192,10 @@ static int bgmac_probe(struct platform_d
- bgmac->dev = &pdev->dev;
- bgmac->dma_dev = &pdev->dev;
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(bgmac->net_dev->dev_addr, mac_addr);
-- else
-- dev_warn(&pdev->dev, "MAC address not present in device tree\n");
-+ ret = of_get_mac_address(np, bgmac->net_dev->dev_addr);
-+ if (ret)
-+ dev_warn(&pdev->dev,
-+ "MAC address not present in device tree\n");
-
- bgmac->irq = platform_get_irq(pdev, 0);
- if (bgmac->irq < 0)
---- a/drivers/net/ethernet/cadence/macb_main.c
-+++ b/drivers/net/ethernet/cadence/macb_main.c
-@@ -4206,7 +4206,6 @@ static int macb_probe(struct platform_de
- struct net_device *dev;
- struct resource *regs;
- void __iomem *mem;
-- const char *mac;
- struct macb *bp;
- int err, val;
-
-@@ -4319,15 +4318,11 @@ static int macb_probe(struct platform_de
- if (bp->caps & MACB_CAPS_NEEDS_RSTONUBR)
- bp->rx_intr_mask |= MACB_BIT(RXUBR);
-
-- mac = of_get_mac_address(np);
-- if (PTR_ERR(mac) == -EPROBE_DEFER) {
-- err = -EPROBE_DEFER;
-+ err = of_get_mac_address(np, bp->dev->dev_addr);
-+ if (err == -EPROBE_DEFER)
- goto err_out_free_netdev;
-- } else if (!IS_ERR_OR_NULL(mac)) {
-- ether_addr_copy(bp->dev->dev_addr, mac);
-- } else {
-+ else if (err)
- macb_get_hwaddr(bp);
-- }
-
- err = of_get_phy_mode(np);
- if (err < 0)
---- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
-+++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
-@@ -1391,7 +1391,6 @@ static int octeon_mgmt_probe(struct plat
- struct net_device *netdev;
- struct octeon_mgmt *p;
- const __be32 *data;
-- const u8 *mac;
- struct resource *res_mix;
- struct resource *res_agl;
- struct resource *res_agl_prt_ctl;
-@@ -1508,11 +1507,8 @@ static int octeon_mgmt_probe(struct plat
- netdev->min_mtu = 64 - OCTEON_MGMT_RX_HEADROOM;
- netdev->max_mtu = 16383 - OCTEON_MGMT_RX_HEADROOM - VLAN_HLEN;
-
-- mac = of_get_mac_address(pdev->dev.of_node);
--
-- if (!IS_ERR(mac))
-- ether_addr_copy(netdev->dev_addr, mac);
-- else
-+ result = of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
-+ if (result)
- eth_hw_addr_random(netdev);
-
- p->phy_np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0);
---- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
-+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
-@@ -1474,7 +1474,6 @@ static int bgx_init_of_phy(struct bgx *b
- device_for_each_child_node(&bgx->pdev->dev, fwn) {
- struct phy_device *pd;
- struct device_node *phy_np;
-- const char *mac;
-
- /* Should always be an OF node. But if it is not, we
- * cannot handle it, so exit the loop.
-@@ -1483,9 +1482,7 @@ static int bgx_init_of_phy(struct bgx *b
- if (!node)
- break;
-
-- mac = of_get_mac_address(node);
-- if (!IS_ERR(mac))
-- ether_addr_copy(bgx->lmac[lmac].mac, mac);
-+ of_get_mac_address(node, bgx->lmac[lmac].mac);
-
- SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev);
- bgx->lmac[lmac].lmacid = lmac;
---- a/drivers/net/ethernet/davicom/dm9000.c
-+++ b/drivers/net/ethernet/davicom/dm9000.c
-@@ -1390,7 +1390,7 @@ static struct dm9000_plat_data *dm9000_p
- {
- struct dm9000_plat_data *pdata;
- struct device_node *np = dev->of_node;
-- const void *mac_addr;
-+ int ret;
-
- if (!IS_ENABLED(CONFIG_OF) || !np)
- return ERR_PTR(-ENXIO);
-@@ -1404,11 +1404,9 @@ static struct dm9000_plat_data *dm9000_p
- if (of_find_property(np, "davicom,no-eeprom", NULL))
- pdata->flags |= DM9000_PLATF_NO_EEPROM;
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(pdata->dev_addr, mac_addr);
-- else if (PTR_ERR(mac_addr) == -EPROBE_DEFER)
-- return ERR_CAST(mac_addr);
-+ ret = of_get_mac_address(np, pdata->dev_addr);
-+ if (ret == -EPROBE_DEFER)
-+ return ERR_PTR(ret);
-
- return pdata;
- }
---- a/drivers/net/ethernet/ethoc.c
-+++ b/drivers/net/ethernet/ethoc.c
-@@ -1147,11 +1147,7 @@ static int ethoc_probe(struct platform_d
- ether_addr_copy(netdev->dev_addr, pdata->hwaddr);
- priv->phy_id = pdata->phy_id;
- } else {
-- const void *mac;
--
-- mac = of_get_mac_address(pdev->dev.of_node);
-- if (!IS_ERR(mac))
-- ether_addr_copy(netdev->dev_addr, mac);
-+ of_get_mac_address(pdev->dev.of_node, netdev->dev_addr);
- priv->phy_id = -1;
- }
-
---- a/drivers/net/ethernet/ezchip/nps_enet.c
-+++ b/drivers/net/ethernet/ezchip/nps_enet.c
-@@ -575,7 +575,6 @@ static s32 nps_enet_probe(struct platfor
- struct net_device *ndev;
- struct nps_enet_priv *priv;
- s32 err = 0;
-- const char *mac_addr;
-
- if (!dev->of_node)
- return -ENODEV;
-@@ -602,10 +601,8 @@ static s32 nps_enet_probe(struct platfor
- dev_dbg(dev, "Registers base address is 0x%p\n", priv->regs_base);
-
- /* set kernel MAC address to dev */
-- mac_addr = of_get_mac_address(dev->of_node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- else
-+ err = of_get_mac_address(dev->of_node, ndev->dev_addr);
-+ if (err)
- eth_hw_addr_random(ndev);
-
- /* Get IRQ number */
---- a/drivers/net/ethernet/freescale/fec_main.c
-+++ b/drivers/net/ethernet/freescale/fec_main.c
-@@ -1695,6 +1695,7 @@ static void fec_get_mac(struct net_devic
- struct fec_enet_private *fep = netdev_priv(ndev);
- struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev);
- unsigned char *iap, tmpaddr[ETH_ALEN];
-+ int ret;
-
- /*
- * try to get mac address in following order:
-@@ -1710,9 +1711,9 @@ static void fec_get_mac(struct net_devic
- if (!is_valid_ether_addr(iap)) {
- struct device_node *np = fep->pdev->dev.of_node;
- if (np) {
-- const char *mac = of_get_mac_address(np);
-- if (!IS_ERR(mac))
-- iap = (unsigned char *) mac;
-+ ret = of_get_mac_address(np, tmpaddr);
-+ if (!ret)
-+ iap = tmpaddr;
- }
- }
-
---- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
-+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
-@@ -823,7 +823,6 @@ static int mpc52xx_fec_probe(struct plat
- const u32 *prop;
- int prop_size;
- struct device_node *np = op->dev.of_node;
-- const char *mac_addr;
-
- phys_addr_t rx_fifo;
- phys_addr_t tx_fifo;
-@@ -901,10 +900,8 @@ static int mpc52xx_fec_probe(struct plat
- *
- * First try to read MAC address from DT
- */
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr)) {
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- } else {
-+ rv = of_get_mac_address(np, ndev->dev_addr);
-+ if (rv) {
- struct mpc52xx_fec __iomem *fec = priv->fec;
-
- /*
---- a/drivers/net/ethernet/freescale/fman/mac.c
-+++ b/drivers/net/ethernet/freescale/fman/mac.c
-@@ -616,7 +616,6 @@ static int mac_probe(struct platform_dev
- struct platform_device *of_dev;
- struct resource res;
- struct mac_priv_s *priv;
-- const u8 *mac_addr;
- u32 val;
- u8 fman_id;
- int phy_if;
-@@ -734,13 +733,12 @@ static int mac_probe(struct platform_dev
- priv->cell_index = (u8)val;
-
- /* Get the MAC address */
-- mac_addr = of_get_mac_address(mac_node);
-- if (IS_ERR(mac_addr)) {
-+ err = of_get_mac_address(mac_node, mac_dev->addr);
-+ if (err) {
- dev_err(dev, "of_get_mac_address(%pOF) failed\n", mac_node);
- err = -EINVAL;
- goto _return_of_get_parent;
- }
-- ether_addr_copy(mac_dev->addr, mac_addr);
-
- /* Get the port handles */
- nph = of_count_phandle_with_args(mac_node, "fsl,fman-ports", NULL);
---- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
-+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
-@@ -925,7 +925,6 @@ static int fs_enet_probe(struct platform
- const u32 *data;
- struct clk *clk;
- int err;
-- const u8 *mac_addr;
- const char *phy_connection_type;
- int privsize, len, ret = -ENODEV;
-
-@@ -1013,9 +1012,7 @@ static int fs_enet_probe(struct platform
- spin_lock_init(&fep->lock);
- spin_lock_init(&fep->tx_lock);
-
-- mac_addr = of_get_mac_address(ofdev->dev.of_node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-+ of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
-
- ret = fep->ops->allocate_bd(ndev);
- if (ret)
---- a/drivers/net/ethernet/freescale/gianfar.c
-+++ b/drivers/net/ethernet/freescale/gianfar.c
-@@ -643,7 +643,6 @@ static phy_interface_t gfar_get_interfac
- static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
- {
- const char *model;
-- const void *mac_addr;
- int err = 0, i;
- struct net_device *dev = NULL;
- struct gfar_private *priv = NULL;
-@@ -784,10 +783,7 @@ static int gfar_of_init(struct platform_
- if (stash_len || stash_idx)
- priv->device_flags |= FSL_GIANFAR_DEV_HAS_BUF_STASHING;
-
-- mac_addr = of_get_mac_address(np);
--
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(dev->dev_addr, mac_addr);
-+ err = of_get_mac_address(np, dev->dev_addr);
-
- if (model && !strcasecmp(model, "TSEC"))
- priv->device_flags |= FSL_GIANFAR_DEV_HAS_GIGABIT |
---- a/drivers/net/ethernet/freescale/ucc_geth.c
-+++ b/drivers/net/ethernet/freescale/ucc_geth.c
-@@ -3697,7 +3697,6 @@ static int ucc_geth_probe(struct platfor
- int err, ucc_num, max_speed = 0;
- const unsigned int *prop;
- const char *sprop;
-- const void *mac_addr;
- phy_interface_t phy_interface;
- static const int enet_to_speed[] = {
- SPEED_10, SPEED_10, SPEED_10,
-@@ -3907,9 +3906,7 @@ static int ucc_geth_probe(struct platfor
- goto err_free_netdev;
- }
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(dev->dev_addr, mac_addr);
-+ of_get_mac_address(np, dev->dev_addr);
-
- ugeth->ug_info = ug_info;
- ugeth->dev = device;
---- a/drivers/net/ethernet/hisilicon/hisi_femac.c
-+++ b/drivers/net/ethernet/hisilicon/hisi_femac.c
-@@ -784,7 +784,6 @@ static int hisi_femac_drv_probe(struct p
- struct net_device *ndev;
- struct hisi_femac_priv *priv;
- struct phy_device *phy;
-- const char *mac_addr;
- int ret;
-
- ndev = alloc_etherdev(sizeof(*priv));
-@@ -854,10 +853,8 @@ static int hisi_femac_drv_probe(struct p
- (unsigned long)phy->phy_id,
- phy_modes(phy->interface));
-
-- mac_addr = of_get_mac_address(node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- if (!is_valid_ether_addr(ndev->dev_addr)) {
-+ ret = of_get_mac_address(node, ndev->dev_addr);
-+ if (ret) {
- eth_hw_addr_random(ndev);
- dev_warn(dev, "using random MAC address %pM\n",
- ndev->dev_addr);
---- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
-+++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
-@@ -1098,7 +1098,6 @@ static int hix5hd2_dev_probe(struct plat
- struct net_device *ndev;
- struct hix5hd2_priv *priv;
- struct mii_bus *bus;
-- const char *mac_addr;
- int ret;
-
- ndev = alloc_etherdev(sizeof(struct hix5hd2_priv));
-@@ -1221,10 +1220,8 @@ static int hix5hd2_dev_probe(struct plat
- goto out_phy_node;
- }
-
-- mac_addr = of_get_mac_address(node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- if (!is_valid_ether_addr(ndev->dev_addr)) {
-+ ret = of_get_mac_address(node, ndev->dev_addr);
-+ if (ret) {
- eth_hw_addr_random(ndev);
- netdev_warn(ndev, "using random MAC address %pM\n",
- ndev->dev_addr);
---- a/drivers/net/ethernet/lantiq_xrx200.c
-+++ b/drivers/net/ethernet/lantiq_xrx200.c
-@@ -439,7 +439,6 @@ static int xrx200_probe(struct platform_
- struct resource *res;
- struct xrx200_priv *priv;
- struct net_device *net_dev;
-- const u8 *mac;
- int err;
-
- /* alloc the network device */
-@@ -483,10 +482,8 @@ static int xrx200_probe(struct platform_
- return PTR_ERR(priv->clk);
- }
-
-- mac = of_get_mac_address(np);
-- if (!IS_ERR(mac))
-- ether_addr_copy(net_dev->dev_addr, mac);
-- else
-+ err = of_get_mac_address(np, net_dev->dev_addr);
-+ if (err)
- eth_hw_addr_random(net_dev);
-
- /* bring up the dma engine and IP core */
---- a/drivers/net/ethernet/marvell/mv643xx_eth.c
-+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
-@@ -2705,7 +2705,6 @@ static int mv643xx_eth_shared_of_add_por
- struct platform_device *ppdev;
- struct mv643xx_eth_platform_data ppd;
- struct resource res;
-- const char *mac_addr;
- int ret;
- int dev_num = 0;
-
-@@ -2736,9 +2735,7 @@ static int mv643xx_eth_shared_of_add_por
- return -EINVAL;
- }
-
-- mac_addr = of_get_mac_address(pnp);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ppd.mac_addr, mac_addr);
-+ of_get_mac_address(pnp, ppd.mac_addr);
-
- mv643xx_eth_property(pnp, "tx-queue-size", ppd.tx_queue_size);
- mv643xx_eth_property(pnp, "tx-sram-addr", ppd.tx_sram_addr);
---- a/drivers/net/ethernet/marvell/mvneta.c
-+++ b/drivers/net/ethernet/marvell/mvneta.c
-@@ -4526,7 +4526,6 @@ static int mvneta_probe(struct platform_
- struct net_device *dev;
- struct phylink *phylink;
- struct phy *comphy;
-- const char *dt_mac_addr;
- char hw_mac_addr[ETH_ALEN];
- const char *mac_from;
- int tx_csum_limit;
-@@ -4623,10 +4622,9 @@ static int mvneta_probe(struct platform_
- goto err_free_ports;
- }
-
-- dt_mac_addr = of_get_mac_address(dn);
-- if (!IS_ERR(dt_mac_addr)) {
-+ err = of_get_mac_address(dn, dev->dev_addr);
-+ if (!err) {
- mac_from = "device tree";
-- ether_addr_copy(dev->dev_addr, dt_mac_addr);
- } else {
- mvneta_get_mac_addr(pp, hw_mac_addr);
- if (is_valid_ether_addr(hw_mac_addr)) {
---- a/drivers/net/ethernet/marvell/pxa168_eth.c
-+++ b/drivers/net/ethernet/marvell/pxa168_eth.c
-@@ -1402,7 +1402,6 @@ static int pxa168_eth_probe(struct platf
- struct resource *res;
- struct clk *clk;
- struct device_node *np;
-- const unsigned char *mac_addr = NULL;
- int err;
-
- printk(KERN_NOTICE "PXA168 10/100 Ethernet Driver\n");
-@@ -1445,12 +1444,8 @@ static int pxa168_eth_probe(struct platf
-
- INIT_WORK(&pep->tx_timeout_task, pxa168_eth_tx_timeout_task);
-
-- if (pdev->dev.of_node)
-- mac_addr = of_get_mac_address(pdev->dev.of_node);
--
-- if (!IS_ERR_OR_NULL(mac_addr)) {
-- ether_addr_copy(dev->dev_addr, mac_addr);
-- } else {
-+ err = of_get_mac_address(pdev->dev.of_node, dev->dev_addr);
-+ if (err) {
- /* try reading the mac address, if set by the bootloader */
- pxa168_eth_get_mac_address(dev, dev->dev_addr);
- if (!is_valid_ether_addr(dev->dev_addr)) {
---- a/drivers/net/ethernet/marvell/sky2.c
-+++ b/drivers/net/ethernet/marvell/sky2.c
-@@ -4721,7 +4721,7 @@ static struct net_device *sky2_init_netd
- {
- struct sky2_port *sky2;
- struct net_device *dev = alloc_etherdev(sizeof(*sky2));
-- const void *iap;
-+ int ret;
-
- if (!dev)
- return NULL;
-@@ -4791,10 +4791,8 @@ static struct net_device *sky2_init_netd
- * 1) from device tree data
- * 2) from internal registers set by bootloader
- */
-- iap = of_get_mac_address(hw->pdev->dev.of_node);
-- if (!IS_ERR(iap))
-- ether_addr_copy(dev->dev_addr, iap);
-- else
-+ ret = of_get_mac_address(hw->pdev->dev.of_node, dev->dev_addr);
-+ if (ret)
- memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8,
- ETH_ALEN);
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2490,14 +2490,11 @@ static int __init mtk_init(struct net_de
- {
- struct mtk_mac *mac = netdev_priv(dev);
- struct mtk_eth *eth = mac->hw;
-- const char *mac_addr;
-+ int ret;
-
-- mac_addr = of_get_mac_address(mac->of_node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(dev->dev_addr, mac_addr);
--
-- /* If the mac address is invalid, use random mac address */
-- if (!is_valid_ether_addr(dev->dev_addr)) {
-+ ret = of_get_mac_address(mac->of_node, dev->dev_addr);
-+ if (ret) {
-+ /* If the mac address is invalid, use random mac address */
- eth_hw_addr_random(dev);
- dev_err(eth->dev, "generated random MAC address %pM\n",
- dev->dev_addr);
---- a/drivers/net/ethernet/micrel/ks8851.c
-+++ b/drivers/net/ethernet/micrel/ks8851.c
-@@ -419,11 +419,10 @@ static void ks8851_read_mac_addr(struct
- static void ks8851_init_mac(struct ks8851_net *ks)
- {
- struct net_device *dev = ks->netdev;
-- const u8 *mac_addr;
-+ int ret;
-
-- mac_addr = of_get_mac_address(ks->spidev->dev.of_node);
-- if (!IS_ERR(mac_addr)) {
-- ether_addr_copy(dev->dev_addr, mac_addr);
-+ ret = of_get_mac_address(ks->spidev->dev.of_node, dev->dev_addr);
-+ if (!ret) {
- ks8851_write_mac_addr(dev);
- return;
- }
---- a/drivers/net/ethernet/micrel/ks8851_mll.c
-+++ b/drivers/net/ethernet/micrel/ks8851_mll.c
-@@ -1239,7 +1239,6 @@ static int ks8851_probe(struct platform_
- struct net_device *netdev;
- struct ks_net *ks;
- u16 id, data;
-- const char *mac;
-
- netdev = alloc_etherdev(sizeof(struct ks_net));
- if (!netdev)
-@@ -1326,9 +1325,7 @@ static int ks8851_probe(struct platform_
-
- /* overwriting the default MAC address */
- if (pdev->dev.of_node) {
-- mac = of_get_mac_address(pdev->dev.of_node);
-- if (!IS_ERR(mac))
-- ether_addr_copy(ks->mac_addr, mac);
-+ of_get_mac_address(pdev->dev.of_node, ks->mac_addr);
- } else {
- struct ks8851_mll_platform_data *pdata;
-
---- a/drivers/net/ethernet/nxp/lpc_eth.c
-+++ b/drivers/net/ethernet/nxp/lpc_eth.c
-@@ -1349,9 +1349,7 @@ static int lpc_eth_drv_probe(struct plat
- __lpc_get_mac(pldat, ndev->dev_addr);
-
- if (!is_valid_ether_addr(ndev->dev_addr)) {
-- const char *macaddr = of_get_mac_address(np);
-- if (!IS_ERR(macaddr))
-- ether_addr_copy(ndev->dev_addr, macaddr);
-+ of_get_mac_address(np, ndev->dev_addr);
- }
- if (!is_valid_ether_addr(ndev->dev_addr))
- eth_hw_addr_random(ndev);
---- a/drivers/net/ethernet/qualcomm/qca_spi.c
-+++ b/drivers/net/ethernet/qualcomm/qca_spi.c
-@@ -885,7 +885,7 @@ qca_spi_probe(struct spi_device *spi)
- struct net_device *qcaspi_devs = NULL;
- u8 legacy_mode = 0;
- u16 signature;
-- const char *mac;
-+ int ret;
-
- if (!spi->dev.of_node) {
- dev_err(&spi->dev, "Missing device tree\n");
-@@ -962,12 +962,8 @@ qca_spi_probe(struct spi_device *spi)
-
- spi_set_drvdata(spi, qcaspi_devs);
-
-- mac = of_get_mac_address(spi->dev.of_node);
--
-- if (!IS_ERR(mac))
-- ether_addr_copy(qca->net_dev->dev_addr, mac);
--
-- if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
-+ ret = of_get_mac_address(spi->dev.of_node, qca->net_dev->dev_addr);
-+ if (ret) {
- eth_hw_addr_random(qca->net_dev);
- dev_info(&spi->dev, "Using random MAC address: %pM\n",
- qca->net_dev->dev_addr);
---- a/drivers/net/ethernet/qualcomm/qca_uart.c
-+++ b/drivers/net/ethernet/qualcomm/qca_uart.c
-@@ -323,7 +323,6 @@ static int qca_uart_probe(struct serdev_
- {
- struct net_device *qcauart_dev = alloc_etherdev(sizeof(struct qcauart));
- struct qcauart *qca;
-- const char *mac;
- u32 speed = 115200;
- int ret;
-
-@@ -348,12 +347,8 @@ static int qca_uart_probe(struct serdev_
-
- of_property_read_u32(serdev->dev.of_node, "current-speed", &speed);
-
-- mac = of_get_mac_address(serdev->dev.of_node);
--
-- if (!IS_ERR(mac))
-- ether_addr_copy(qca->net_dev->dev_addr, mac);
--
-- if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {
-+ ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr);
-+ if (ret) {
- eth_hw_addr_random(qca->net_dev);
- dev_info(&serdev->dev, "Using random MAC address: %pM\n",
- qca->net_dev->dev_addr);
---- a/drivers/net/ethernet/renesas/ravb_main.c
-+++ b/drivers/net/ethernet/renesas/ravb_main.c
-@@ -109,11 +109,13 @@ static void ravb_set_buffer_align(struct
- * Ethernet AVB device doesn't have ROM for MAC address.
- * This function gets the MAC address that was used by a bootloader.
- */
--static void ravb_read_mac_address(struct net_device *ndev, const u8 *mac)
-+static void ravb_read_mac_address(struct device_node *np,
-+ struct net_device *ndev)
- {
-- if (!IS_ERR(mac)) {
-- ether_addr_copy(ndev->dev_addr, mac);
-- } else {
-+ int ret;
-+
-+ ret = of_get_mac_address(np, ndev->dev_addr);
-+ if (ret) {
- u32 mahr = ravb_read(ndev, MAHR);
- u32 malr = ravb_read(ndev, MALR);
-
-@@ -2152,7 +2154,7 @@ static int ravb_probe(struct platform_de
- priv->msg_enable = RAVB_DEF_MSG_ENABLE;
-
- /* Read and set MAC address */
-- ravb_read_mac_address(ndev, of_get_mac_address(np));
-+ ravb_read_mac_address(np, ndev);
- if (!is_valid_ether_addr(ndev->dev_addr)) {
- dev_warn(&pdev->dev,
- "no valid MAC address supplied, using a random one\n");
---- a/drivers/net/ethernet/renesas/sh_eth.c
-+++ b/drivers/net/ethernet/renesas/sh_eth.c
-@@ -3195,7 +3195,6 @@ static struct sh_eth_plat_data *sh_eth_p
- {
- struct device_node *np = dev->of_node;
- struct sh_eth_plat_data *pdata;
-- const char *mac_addr;
- int ret;
-
- pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
-@@ -3207,9 +3206,7 @@ static struct sh_eth_plat_data *sh_eth_p
- return NULL;
- pdata->phy_interface = ret;
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(pdata->mac_addr, mac_addr);
-+ of_get_mac_address(np, pdata->mac_addr);
-
- pdata->no_ether_link =
- of_property_read_bool(np, "renesas,no-ether-link");
---- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
-+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c
-@@ -25,8 +25,7 @@
-
- #ifdef CONFIG_OF
- static int sxgbe_probe_config_dt(struct platform_device *pdev,
-- struct sxgbe_plat_data *plat,
-- const char **mac)
-+ struct sxgbe_plat_data *plat)
- {
- struct device_node *np = pdev->dev.of_node;
- struct sxgbe_dma_cfg *dma_cfg;
-@@ -34,7 +33,6 @@ static int sxgbe_probe_config_dt(struct
- if (!np)
- return -ENODEV;
-
-- *mac = of_get_mac_address(np);
- plat->interface = of_get_phy_mode(np);
-
- plat->bus_id = of_alias_get_id(np, "ethernet");
-@@ -60,8 +58,7 @@ static int sxgbe_probe_config_dt(struct
- }
- #else
- static int sxgbe_probe_config_dt(struct platform_device *pdev,
-- struct sxgbe_plat_data *plat,
-- const char **mac)
-+ struct sxgbe_plat_data *plat)
- {
- return -ENOSYS;
- }
-@@ -82,7 +79,6 @@ static int sxgbe_platform_probe(struct p
- void __iomem *addr;
- struct sxgbe_priv_data *priv = NULL;
- struct sxgbe_plat_data *plat_dat = NULL;
-- const char *mac = NULL;
- struct net_device *ndev = platform_get_drvdata(pdev);
- struct device_node *node = dev->of_node;
-
-@@ -98,7 +94,7 @@ static int sxgbe_platform_probe(struct p
- if (!plat_dat)
- return -ENOMEM;
-
-- ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
-+ ret = sxgbe_probe_config_dt(pdev, plat_dat);
- if (ret) {
- pr_err("%s: main dt probe failed\n", __func__);
- return ret;
-@@ -119,8 +115,7 @@ static int sxgbe_platform_probe(struct p
- }
-
- /* Get MAC address if available (DT) */
-- if (!IS_ERR_OR_NULL(mac))
-- ether_addr_copy(priv->dev->dev_addr, mac);
-+ of_get_mac_address(node, priv->dev->dev_addr);
-
- /* Get the TX/RX IRQ numbers */
- for (i = 0, chan = 1; i < SXGBE_TX_QUEUES; i++) {
---- a/drivers/net/ethernet/socionext/sni_ave.c
-+++ b/drivers/net/ethernet/socionext/sni_ave.c
-@@ -1559,7 +1559,6 @@ static int ave_probe(struct platform_dev
- struct ave_private *priv;
- struct net_device *ndev;
- struct device_node *np;
-- const void *mac_addr;
- void __iomem *base;
- const char *name;
- int i, irq, ret;
-@@ -1600,12 +1599,9 @@ static int ave_probe(struct platform_dev
-
- ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
-
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
--
-- /* if the mac address is invalid, use random mac address */
-- if (!is_valid_ether_addr(ndev->dev_addr)) {
-+ ret = of_get_mac_address(np, ndev->dev_addr);
-+ if (ret) {
-+ /* if the mac address is invalid, use random mac address */
- eth_hw_addr_random(ndev);
- dev_warn(dev, "Using random MAC address: %pM\n",
- ndev->dev_addr);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-anarion.c
-@@ -110,7 +110,7 @@ static int anarion_dwmac_probe(struct pl
- if (IS_ERR(gmac))
- return PTR_ERR(gmac);
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-dwc-qos-eth.c
-@@ -438,7 +438,7 @@ static int dwc_eth_dwmac_probe(struct pl
- if (IS_ERR(stmmac_res.addr))
- return PTR_ERR(stmmac_res.addr);
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
-@@ -27,7 +27,7 @@ static int dwmac_generic_probe(struct pl
- return ret;
-
- if (pdev->dev.of_node) {
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat)) {
- dev_err(&pdev->dev, "dt configuration failed\n");
- return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
-@@ -254,7 +254,7 @@ static int ipq806x_gmac_probe(struct pla
- if (val)
- return val;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
-@@ -37,7 +37,7 @@ static int lpc18xx_dwmac_probe(struct pl
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
-@@ -348,7 +348,7 @@ static int mediatek_dwmac_probe(struct p
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
-@@ -52,7 +52,7 @@ static int meson6_dwmac_probe(struct pla
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
-@@ -324,7 +324,7 @@ static int meson8b_dwmac_probe(struct pl
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-oxnas.c
-@@ -118,7 +118,7 @@ static int oxnas_dwmac_probe(struct plat
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
-@@ -461,7 +461,7 @@ static int qcom_ethqos_probe(struct plat
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat)) {
- dev_err(&pdev->dev, "dt configuration failed\n");
- return PTR_ERR(plat_dat);
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
-@@ -1396,7 +1396,7 @@ static int rk_gmac_probe(struct platform
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
-@@ -398,7 +398,7 @@ static int socfpga_dwmac_probe(struct pl
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
-@@ -320,7 +320,7 @@ static int sti_dwmac_probe(struct platfo
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
-@@ -364,7 +364,7 @@ static int stm32_dwmac_probe(struct plat
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
-@@ -1127,7 +1127,7 @@ static int sun8i_dwmac_probe(struct plat
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
-@@ -108,7 +108,7 @@ static int sun7i_gmac_probe(struct platf
- if (ret)
- return ret;
-
-- plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
-+ plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
- if (IS_ERR(plat_dat))
- return PTR_ERR(plat_dat);
-
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
-@@ -25,7 +25,7 @@
-
- struct stmmac_resources {
- void __iomem *addr;
-- const char *mac;
-+ u8 mac[ETH_ALEN];
- int wol_irq;
- int lpi_irq;
- int irq;
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
-@@ -4471,7 +4471,7 @@ int stmmac_dvr_probe(struct device *devi
- priv->wol_irq = res->wol_irq;
- priv->lpi_irq = res->lpi_irq;
-
-- if (!IS_ERR_OR_NULL(res->mac))
-+ if (!is_zero_ether_addr(res->mac))
- memcpy(priv->dev->dev_addr, res->mac, ETH_ALEN);
-
- dev_set_drvdata(device, priv->dev);
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
-@@ -393,7 +393,7 @@ static int stmmac_of_get_mac_mode(struct
- * set some private fields that will be used by the main at runtime.
- */
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
- {
- struct device_node *np = pdev->dev.of_node;
- struct plat_stmmacenet_data *plat;
-@@ -404,12 +404,12 @@ stmmac_probe_config_dt(struct platform_d
- if (!plat)
- return ERR_PTR(-ENOMEM);
-
-- *mac = of_get_mac_address(np);
-- if (IS_ERR(*mac)) {
-- if (PTR_ERR(*mac) == -EPROBE_DEFER)
-- return ERR_CAST(*mac);
-+ rc = of_get_mac_address(np, mac);
-+ if (rc) {
-+ if (rc == -EPROBE_DEFER)
-+ return ERR_PTR(rc);
-
-- *mac = NULL;
-+ eth_zero_addr(mac);
- }
-
- plat->phy_interface = of_get_phy_mode(np);
-@@ -639,7 +639,7 @@ void stmmac_remove_config_dt(struct plat
- }
- #else
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
- {
- return ERR_PTR(-EINVAL);
- }
---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
-+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
-@@ -12,7 +12,7 @@
- #include "stmmac.h"
-
- struct plat_stmmacenet_data *
--stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
-+stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac);
- void stmmac_remove_config_dt(struct platform_device *pdev,
- struct plat_stmmacenet_data *plat);
-
---- a/drivers/net/ethernet/ti/cpsw.c
-+++ b/drivers/net/ethernet/ti/cpsw.c
-@@ -2555,7 +2555,6 @@ static int cpsw_probe_dt(struct cpsw_pla
-
- for_each_available_child_of_node(node, slave_node) {
- struct cpsw_slave_data *slave_data = data->slave_data + i;
-- const void *mac_addr = NULL;
- int lenp;
- const __be32 *parp;
-
-@@ -2628,10 +2627,8 @@ static int cpsw_probe_dt(struct cpsw_pla
- }
-
- no_phy_slave:
-- mac_addr = of_get_mac_address(slave_node);
-- if (!IS_ERR(mac_addr)) {
-- ether_addr_copy(slave_data->mac_addr, mac_addr);
-- } else {
-+ ret = of_get_mac_address(slave_node, slave_data->mac_addr);
-+ if (ret) {
- ret = ti_cm_get_macid(&pdev->dev, i,
- slave_data->mac_addr);
- if (ret)
---- a/drivers/net/ethernet/ti/davinci_emac.c
-+++ b/drivers/net/ethernet/ti/davinci_emac.c
-@@ -1697,7 +1697,6 @@ davinci_emac_of_get_pdata(struct platfor
- const struct of_device_id *match;
- const struct emac_platform_data *auxdata;
- struct emac_platform_data *pdata = NULL;
-- const u8 *mac_addr;
-
- if (!IS_ENABLED(CONFIG_OF) || !pdev->dev.of_node)
- return dev_get_platdata(&pdev->dev);
-@@ -1709,11 +1708,8 @@ davinci_emac_of_get_pdata(struct platfor
- np = pdev->dev.of_node;
- pdata->version = EMAC_VERSION_2;
-
-- if (!is_valid_ether_addr(pdata->mac_addr)) {
-- mac_addr = of_get_mac_address(np);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(pdata->mac_addr, mac_addr);
-- }
-+ if (!is_valid_ether_addr(pdata->mac_addr))
-+ of_get_mac_address(np, pdata->mac_addr);
-
- of_property_read_u32(np, "ti,davinci-ctrl-reg-offset",
- &pdata->ctrl_reg_offset);
---- a/drivers/net/ethernet/ti/netcp_core.c
-+++ b/drivers/net/ethernet/ti/netcp_core.c
-@@ -1966,7 +1966,6 @@ static int netcp_create_interface(struct
- struct resource res;
- void __iomem *efuse = NULL;
- u32 efuse_mac = 0;
-- const void *mac_addr;
- u8 efuse_mac_addr[6];
- u32 temp[2];
- int ret = 0;
-@@ -2036,10 +2035,8 @@ static int netcp_create_interface(struct
- devm_iounmap(dev, efuse);
- devm_release_mem_region(dev, res.start, size);
- } else {
-- mac_addr = of_get_mac_address(node_interface);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(ndev->dev_addr, mac_addr);
-- else
-+ ret = of_get_mac_address(node_interface, ndev->dev_addr);
-+ if (ret)
- eth_random_addr(ndev->dev_addr);
- }
-
---- a/drivers/net/ethernet/wiznet/w5100-spi.c
-+++ b/drivers/net/ethernet/wiznet/w5100-spi.c
-@@ -423,8 +423,14 @@ static int w5100_spi_probe(struct spi_de
- const struct of_device_id *of_id;
- const struct w5100_ops *ops;
- kernel_ulong_t driver_data;
-+ const void *mac = NULL;
-+ u8 tmpmac[ETH_ALEN];
- int priv_size;
-- const void *mac = of_get_mac_address(spi->dev.of_node);
-+ int ret;
-+
-+ ret = of_get_mac_address(spi->dev.of_node, tmpmac);
-+ if (!ret)
-+ mac = tmpmac;
-
- if (spi->dev.of_node) {
- of_id = of_match_device(w5100_of_match, &spi->dev);
---- a/drivers/net/ethernet/wiznet/w5100.c
-+++ b/drivers/net/ethernet/wiznet/w5100.c
-@@ -1159,7 +1159,7 @@ int w5100_probe(struct device *dev, cons
- INIT_WORK(&priv->setrx_work, w5100_setrx_work);
- INIT_WORK(&priv->restart_work, w5100_restart_work);
-
-- if (!IS_ERR_OR_NULL(mac_addr))
-+ if (mac_addr)
- memcpy(ndev->dev_addr, mac_addr, ETH_ALEN);
- else
- eth_hw_addr_random(ndev);
---- a/drivers/net/ethernet/xilinx/ll_temac_main.c
-+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
-@@ -434,7 +434,7 @@ static void temac_do_set_mac_address(str
-
- static int temac_init_mac_address(struct net_device *ndev, const void *address)
- {
-- ether_addr_copy(ndev->dev_addr, address);
-+ memcpy(ndev->dev_addr, address, ETH_ALEN);
- if (!is_valid_ether_addr(ndev->dev_addr))
- eth_hw_addr_random(ndev);
- temac_do_set_mac_address(ndev);
-@@ -1296,7 +1296,7 @@ static int temac_probe(struct platform_d
- struct temac_local *lp;
- struct net_device *ndev;
- struct resource *res;
-- const void *addr;
-+ u8 addr[ETH_ALEN];
- __be32 *p;
- bool little_endian;
- int rc = 0;
-@@ -1492,8 +1492,8 @@ static int temac_probe(struct platform_d
-
- if (temac_np) {
- /* Retrieve the MAC address */
-- addr = of_get_mac_address(temac_np);
-- if (IS_ERR(addr)) {
-+ rc = of_get_mac_address(temac_np, addr);
-+ if (rc) {
- dev_err(&pdev->dev, "could not find MAC address\n");
- return -ENODEV;
- }
---- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
-+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
-@@ -1665,7 +1665,7 @@ static int axienet_probe(struct platform
- struct device_node *np;
- struct axienet_local *lp;
- struct net_device *ndev;
-- const void *mac_addr;
-+ u8 mac_addr[ETH_ALEN];
- struct resource *ethres;
- u32 value;
-
-@@ -1837,13 +1837,14 @@ static int axienet_probe(struct platform
- dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
-
- /* Retrieve the MAC address */
-- mac_addr = of_get_mac_address(pdev->dev.of_node);
-- if (IS_ERR(mac_addr)) {
-- dev_warn(&pdev->dev, "could not find MAC address property: %ld\n",
-- PTR_ERR(mac_addr));
-- mac_addr = NULL;
-+ ret = of_get_mac_address(pdev->dev.of_node, mac_addr);
-+ if (!ret) {
-+ axienet_set_mac_address(ndev, mac_addr);
-+ } else {
-+ dev_warn(&pdev->dev, "could not find MAC address property: %d\n",
-+ ret);
-+ axienet_set_mac_address(ndev, NULL);
- }
-- axienet_set_mac_address(ndev, mac_addr);
-
- lp->coalesce_count_rx = XAXIDMA_DFT_RX_THRESHOLD;
- lp->coalesce_count_tx = XAXIDMA_DFT_TX_THRESHOLD;
---- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
-+++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
-@@ -1113,7 +1113,6 @@ static int xemaclite_of_probe(struct pla
- struct net_device *ndev = NULL;
- struct net_local *lp = NULL;
- struct device *dev = &ofdev->dev;
-- const void *mac_address;
-
- int rc = 0;
-
-@@ -1155,12 +1154,9 @@ static int xemaclite_of_probe(struct pla
- lp->next_rx_buf_to_use = 0x0;
- lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
- lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
-- mac_address = of_get_mac_address(ofdev->dev.of_node);
-
-- if (!IS_ERR(mac_address)) {
-- /* Set the MAC address. */
-- ether_addr_copy(ndev->dev_addr, mac_address);
-- } else {
-+ rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
-+ if (rc) {
- dev_warn(dev, "No MAC address found, using random\n");
- eth_hw_addr_random(ndev);
- }
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -618,7 +618,6 @@ static int ath9k_of_init(struct ath_soft
- struct ath_hw *ah = sc->sc_ah;
- struct ath_common *common = ath9k_hw_common(ah);
- enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
-- const char *mac;
- char eeprom_name[100];
- int ret;
-
-@@ -641,9 +640,7 @@ static int ath9k_of_init(struct ath_soft
- ah->ah_flags |= AH_NO_EEP_SWAP;
- }
-
-- mac = of_get_mac_address(np);
-- if (!IS_ERR(mac))
-- ether_addr_copy(common->macaddr, mac);
-+ of_get_mac_address(np, common->macaddr);
-
- return 0;
- }
---- a/drivers/net/wireless/mediatek/mt76/eeprom.c
-+++ b/drivers/net/wireless/mediatek/mt76/eeprom.c
-@@ -75,17 +75,9 @@ out_put_node:
- void
- mt76_eeprom_override(struct mt76_dev *dev)
- {
--#ifdef CONFIG_OF
- struct device_node *np = dev->dev->of_node;
-- const u8 *mac;
-
-- if (!np)
-- return;
--
-- mac = of_get_mac_address(np);
-- if (!IS_ERR(mac))
-- ether_addr_copy(dev->macaddr, mac);
--#endif
-+ of_get_mac_address(np, dev->macaddr);
-
- if (!is_valid_ether_addr(dev->macaddr)) {
- eth_random_addr(dev->macaddr);
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
-@@ -990,11 +990,7 @@ static void rt2x00lib_rate(struct ieee80
-
- void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
- {
-- const char *mac_addr;
--
-- mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
-- if (!IS_ERR(mac_addr))
-- ether_addr_copy(eeprom_mac_addr, mac_addr);
-+ of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr);
-
- if (!is_valid_ether_addr(eeprom_mac_addr)) {
- eth_random_addr(eeprom_mac_addr);
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -39,37 +39,29 @@ int of_get_phy_mode(struct device_node *
- }
- EXPORT_SYMBOL_GPL(of_get_phy_mode);
-
--static const void *of_get_mac_addr(struct device_node *np, const char *name)
-+static int of_get_mac_addr(struct device_node *np, const char *name, u8 *addr)
- {
- struct property *pp = of_find_property(np, name, NULL);
-
-- if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value))
-- return pp->value;
-- return NULL;
-+ if (pp && pp->length == ETH_ALEN && is_valid_ether_addr(pp->value)) {
-+ memcpy(addr, pp->value, ETH_ALEN);
-+ return 0;
-+ }
-+ return -ENODEV;
- }
-
--static const void *of_get_mac_addr_nvmem(struct device_node *np)
-+static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
- {
-- int ret;
-- const void *mac;
-- u8 nvmem_mac[ETH_ALEN];
- struct platform_device *pdev = of_find_device_by_node(np);
-+ int ret;
-
- if (!pdev)
-- return ERR_PTR(-ENODEV);
-+ return -ENODEV;
-
-- ret = nvmem_get_mac_address(&pdev->dev, &nvmem_mac);
-- if (ret) {
-- put_device(&pdev->dev);
-- return ERR_PTR(ret);
-- }
--
-- mac = devm_kmemdup(&pdev->dev, nvmem_mac, ETH_ALEN, GFP_KERNEL);
-+ ret = nvmem_get_mac_address(&pdev->dev, addr);
- put_device(&pdev->dev);
-- if (!mac)
-- return ERR_PTR(-ENOMEM);
-
-- return mac;
-+ return ret;
- }
-
- /**
-@@ -92,24 +84,27 @@ static const void *of_get_mac_addr_nvmem
- * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
- * but is all zeros.
- *
-- * Return: Will be a valid pointer on success and ERR_PTR in case of error.
-+ * Return: 0 on success and errno in case of error.
- */
--const void *of_get_mac_address(struct device_node *np)
-+int of_get_mac_address(struct device_node *np, u8 *addr)
- {
-- const void *addr;
--
-- addr = of_get_mac_addr(np, "mac-address");
-- if (addr)
-- return addr;
-+ int ret;
-
-- addr = of_get_mac_addr(np, "local-mac-address");
-- if (addr)
-- return addr;
-+ if (!np)
-+ return -ENODEV;
-
-- addr = of_get_mac_addr(np, "address");
-- if (addr)
-- return addr;
-+ ret = of_get_mac_addr(np, "mac-address", addr);
-+ if (!ret)
-+ return 0;
-+
-+ ret = of_get_mac_addr(np, "local-mac-address", addr);
-+ if (!ret)
-+ return 0;
-+
-+ ret = of_get_mac_addr(np, "address", addr);
-+ if (!ret)
-+ return 0;
-
-- return of_get_mac_addr_nvmem(np);
-+ return of_get_mac_addr_nvmem(np, addr);
- }
- EXPORT_SYMBOL(of_get_mac_address);
---- a/drivers/staging/octeon/ethernet.c
-+++ b/drivers/staging/octeon/ethernet.c
-@@ -407,14 +407,10 @@ static int cvm_oct_common_set_mac_addres
- int cvm_oct_common_init(struct net_device *dev)
- {
- struct octeon_ethernet *priv = netdev_priv(dev);
-- const u8 *mac = NULL;
-+ int ret;
-
-- if (priv->of_node)
-- mac = of_get_mac_address(priv->of_node);
--
-- if (!IS_ERR_OR_NULL(mac))
-- ether_addr_copy(dev->dev_addr, mac);
-- else
-+ ret = of_get_mac_address(priv->of_node, dev->dev_addr);
-+ if (ret)
- eth_hw_addr_random(dev);
-
- /*
---- a/include/linux/of_net.h
-+++ b/include/linux/of_net.h
-@@ -11,7 +11,7 @@
-
- struct net_device;
- extern int of_get_phy_mode(struct device_node *np);
--extern const void *of_get_mac_address(struct device_node *np);
-+extern int of_get_mac_address(struct device_node *np, u8 *mac);
- extern struct net_device *of_find_net_device_by_node(struct device_node *np);
- #else
- static inline int of_get_phy_mode(struct device_node *np)
-@@ -19,9 +19,9 @@ static inline int of_get_phy_mode(struct
- return -ENODEV;
- }
-
--static inline const void *of_get_mac_address(struct device_node *np)
-+static inline int of_get_mac_address(struct device_node *np, u8 *mac)
- {
-- return ERR_PTR(-ENODEV);
-+ return -ENODEV;
- }
-
- static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
---- a/include/net/dsa.h
-+++ b/include/net/dsa.h
-@@ -186,7 +186,7 @@ struct dsa_port {
- unsigned int index;
- const char *name;
- struct dsa_port *cpu_dp;
-- const char *mac;
-+ u8 mac[ETH_ALEN];
- struct device_node *dn;
- unsigned int ageing_time;
- bool vlan_filtering;
---- a/net/dsa/dsa2.c
-+++ b/net/dsa/dsa2.c
-@@ -318,7 +318,7 @@ static int dsa_port_setup(struct dsa_por
- break;
- devlink_port_registered = true;
-
-- dp->mac = of_get_mac_address(dp->dn);
-+ of_get_mac_address(dp->dn, dp->mac);
- err = dsa_slave_create(dp);
- if (err)
- break;
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1414,7 +1414,7 @@ int dsa_slave_create(struct dsa_port *po
- slave_dev->hw_features |= NETIF_F_HW_TC;
- slave_dev->features |= NETIF_F_LLTX;
- slave_dev->ethtool_ops = &dsa_slave_ethtool_ops;
-- if (!IS_ERR_OR_NULL(port->mac))
-+ if (!is_zero_ether_addr(port->mac))
- ether_addr_copy(slave_dev->dev_addr, port->mac);
- else
- eth_hw_addr_inherit(slave_dev, master);
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
-@@ -550,13 +550,14 @@ unsigned char * __weak arch_get_platform
-
- int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr)
- {
-- const unsigned char *addr = NULL;
-+ unsigned char *addr;
-+ int ret;
-
-- if (dev->of_node)
-- addr = of_get_mac_address(dev->of_node);
-- if (IS_ERR_OR_NULL(addr))
-- addr = arch_get_platform_mac_address();
-+ ret = of_get_mac_address(dev->of_node, mac_addr);
-+ if (!ret)
-+ return 0;
-
-+ addr = arch_get_platform_mac_address();
- if (!addr)
- return -ENODEV;
-
---- a/drivers/net/usb/smsc75xx.c
-+++ b/drivers/net/usb/smsc75xx.c
-@@ -757,11 +757,12 @@ static int smsc75xx_ioctl(struct net_dev
-
- static void smsc75xx_init_mac_address(struct usbnet *dev)
- {
-- const u8 *mac_addr;
-+ u8 mac_addr[ETH_ALEN];
-+ int ret;
-
- /* maybe the boot loader passed the MAC address in devicetree */
-- mac_addr = of_get_mac_address(dev->udev->dev.of_node);
-- if (!IS_ERR(mac_addr)) {
-+ ret = of_get_mac_address(dev->udev->dev.of_node, mac_addr);
-+ if (!ret) {
- ether_addr_copy(dev->net->dev_addr, mac_addr);
- return;
- }
---- a/drivers/net/usb/smsc95xx.c
-+++ b/drivers/net/usb/smsc95xx.c
-@@ -901,11 +901,12 @@ static int smsc95xx_ioctl(struct net_dev
-
- static void smsc95xx_init_mac_address(struct usbnet *dev)
- {
-- const u8 *mac_addr;
-+ u8 mac_addr[ETH_ALEN];
-+ int ret;
-
- /* maybe the boot loader passed the MAC address in devicetree */
-- mac_addr = of_get_mac_address(dev->udev->dev.of_node);
-- if (!IS_ERR(mac_addr)) {
-+ ret = of_get_mac_address(dev->udev->dev.of_node, mac_addr);
-+ if (!ret) {
- ether_addr_copy(dev->net->dev_addr, mac_addr);
- return;
- }
---- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
-@@ -3444,10 +3444,11 @@ static int bcmgenet_probe(struct platfor
- const struct of_device_id *of_id = NULL;
- struct bcmgenet_priv *priv;
- struct net_device *dev;
-- const void *macaddr;
-+ u8 macaddr[ETH_ALEN];
- unsigned int i;
- int err = -EIO;
- const char *phy_mode_str;
-+ int ret;
-
- /* Up to GENET_MAX_MQ_CNT + 1 TX queues and RX queues */
- dev = alloc_etherdev_mqs(sizeof(*priv), GENET_MAX_MQ_CNT + 1,
-@@ -3474,14 +3475,15 @@ static int bcmgenet_probe(struct platfor
- }
-
- if (dn) {
-- macaddr = of_get_mac_address(dn);
-- if (IS_ERR(macaddr)) {
-+ ret = of_get_mac_address(dn, macaddr);
-+ if (ret) {
- dev_err(&pdev->dev, "can't find MAC address\n");
- err = -EINVAL;
- goto err;
- }
-+ ether_addr_copy(dev->dev_addr, macaddr);
- } else {
-- macaddr = pd->mac_address;
-+ ether_addr_copy(dev->dev_addr, pd->mac_address);
- }
-
- priv->base = devm_platform_ioremap_resource(pdev, 0);
-@@ -3494,7 +3496,6 @@ static int bcmgenet_probe(struct platfor
-
- SET_NETDEV_DEV(dev, &pdev->dev);
- dev_set_drvdata(&pdev->dev, dev);
-- ether_addr_copy(dev->dev_addr, macaddr);
- dev->watchdog_timeo = 2 * HZ;
- dev->ethtool_ops = &bcmgenet_ethtool_ops;
- dev->netdev_ops = &bcmgenet_netdev_ops;
diff --git a/target/linux/generic/backport-5.4/782-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch b/target/linux/generic/backport-5.4/782-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch
deleted file mode 100644
index c365ac0bb2..0000000000
--- a/target/linux/generic/backport-5.4/782-net-next-2-of-net-fix-of_get_mac_addr_nvmem-for-non-platform-devices.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From f10843e04a075202dbb39dfcee047e3a2fdf5a8d Mon Sep 17 00:00:00 2001
-From: Michael Walle <michael@walle.cc>
-Date: Mon, 12 Apr 2021 19:47:18 +0200
-Subject: of: net: fix of_get_mac_addr_nvmem() for non-platform devices
-
-of_get_mac_address() already supports fetching the MAC address by an
-nvmem provider. But until now, it was just working for platform devices.
-Esp. it was not working for DSA ports and PCI devices. It gets more
-common that PCI devices have a device tree binding since SoCs contain
-integrated root complexes.
-
-Use the nvmem of_* binding to fetch the nvmem cells by a struct
-device_node. We still have to try to read the cell by device first
-because there might be a nvmem_cell_lookup associated with that device.
-
-Signed-off-by: Michael Walle <michael@walle.cc>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/of/of_net.c | 35 ++++++++++++++++++++++++++++++-----
- 1 file changed, 30 insertions(+), 5 deletions(-)
-
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -11,6 +11,7 @@
- #include <linux/phy.h>
- #include <linux/export.h>
- #include <linux/device.h>
-+#include <linux/nvmem-consumer.h>
-
- /**
- * of_get_phy_mode - Get phy mode for given device_node
-@@ -53,15 +54,39 @@ static int of_get_mac_addr(struct device
- static int of_get_mac_addr_nvmem(struct device_node *np, u8 *addr)
- {
- struct platform_device *pdev = of_find_device_by_node(np);
-+ struct nvmem_cell *cell;
-+ const void *mac;
-+ size_t len;
- int ret;
-
-- if (!pdev)
-- return -ENODEV;
-+ /* Try lookup by device first, there might be a nvmem_cell_lookup
-+ * associated with a given device.
-+ */
-+ if (pdev) {
-+ ret = nvmem_get_mac_address(&pdev->dev, addr);
-+ put_device(&pdev->dev);
-+ return ret;
-+ }
-+
-+ cell = of_nvmem_cell_get(np, "mac-address");
-+ if (IS_ERR(cell))
-+ return PTR_ERR(cell);
-+
-+ mac = nvmem_cell_read(cell, &len);
-+ nvmem_cell_put(cell);
-+
-+ if (IS_ERR(mac))
-+ return PTR_ERR(mac);
-+
-+ if (len != ETH_ALEN || !is_valid_ether_addr(mac)) {
-+ kfree(mac);
-+ return -EINVAL;
-+ }
-
-- ret = nvmem_get_mac_address(&pdev->dev, addr);
-- put_device(&pdev->dev);
-+ memcpy(addr, mac, ETH_ALEN);
-+ kfree(mac);
-
-- return ret;
-+ return 0;
- }
-
- /**
diff --git a/target/linux/generic/backport-5.4/790-net-phy-at803x-select-correct-page-on-config-init.patch b/target/linux/generic/backport-5.4/790-net-phy-at803x-select-correct-page-on-config-init.patch
deleted file mode 100644
index b7e3201fb7..0000000000
--- a/target/linux/generic/backport-5.4/790-net-phy-at803x-select-correct-page-on-config-init.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From c329e5afb42ff0a88285eb4d8a391a18793e4777 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Thu, 15 Apr 2021 03:26:50 +0200
-Subject: [PATCH] net: phy: at803x: select correct page on config init
-
-The Atheros AR8031 and AR8033 expose different registers for SGMII/Fiber
-as well as the copper side of the PHY depending on the BT_BX_REG_SEL bit
-in the chip configure register.
-
-The driver assumes the copper side is selected on probe, but this might
-not be the case depending which page was last selected by the
-bootloader. Notably, Ubiquiti UniFi bootloaders show this behavior.
-
-Select the copper page when probing to circumvent this.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/at803x.c | 50 +++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 49 insertions(+), 1 deletion(-)
-
---- a/drivers/net/phy/at803x.c
-+++ b/drivers/net/phy/at803x.c
-@@ -67,6 +67,9 @@
- #define ATH8035_PHY_ID 0x004dd072
- #define AT803X_PHY_ID_MASK 0xffffffef
-
-+#define AT803X_PAGE_FIBER 0
-+#define AT803X_PAGE_COPPER 1
-+
- MODULE_DESCRIPTION("Atheros 803x PHY driver");
- MODULE_AUTHOR("Matus Ujhelyi");
- MODULE_LICENSE("GPL");
-@@ -112,6 +115,35 @@ static int at803x_debug_reg_mask(struct
- return phy_write(phydev, AT803X_DEBUG_DATA, val);
- }
-
-+static int at803x_write_page(struct phy_device *phydev, int page)
-+{
-+ int mask;
-+ int set;
-+
-+ if (page == AT803X_PAGE_COPPER) {
-+ set = AT803X_BT_BX_REG_SEL;
-+ mask = 0;
-+ } else {
-+ set = 0;
-+ mask = AT803X_BT_BX_REG_SEL;
-+ }
-+
-+ return __phy_modify(phydev, AT803X_REG_CHIP_CONFIG, mask, set);
-+}
-+
-+static int at803x_read_page(struct phy_device *phydev)
-+{
-+ int ccr = __phy_read(phydev, AT803X_REG_CHIP_CONFIG);
-+
-+ if (ccr < 0)
-+ return ccr;
-+
-+ if (ccr & AT803X_BT_BX_REG_SEL)
-+ return AT803X_PAGE_COPPER;
-+
-+ return AT803X_PAGE_FIBER;
-+}
-+
- static int at803x_enable_rx_delay(struct phy_device *phydev)
- {
- return at803x_debug_reg_mask(phydev, AT803X_DEBUG_REG_0, 0,
-@@ -244,6 +276,7 @@ static int at803x_probe(struct phy_devic
- {
- struct device *dev = &phydev->mdio.dev;
- struct at803x_priv *priv;
-+ int ret = 0;
-
- priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
-@@ -251,7 +284,16 @@ static int at803x_probe(struct phy_devic
-
- phydev->priv = priv;
-
-- return 0;
-+ /* Some bootloaders leave the fiber page selected.
-+ * Switch to the copper page, as otherwise we read
-+ * the PHY capabilities from the fiber side.
-+ */
-+ if ((phydev->phy_id & phydev->drv->phy_id_mask) == (ATH8031_PHY_ID & phydev->drv->phy_id_mask)) {
-+ ret = phy_select_page(phydev, AT803X_PAGE_COPPER);
-+ ret = phy_restore_page(phydev, AT803X_PAGE_COPPER, ret);
-+ }
-+
-+ return ret;
- }
-
- static int at803x_config_init(struct phy_device *phydev)
-@@ -466,6 +508,8 @@ static struct phy_driver at803x_driver[]
- .get_wol = at803x_get_wol,
- .suspend = at803x_suspend,
- .resume = at803x_resume,
-+ .read_page = at803x_read_page,
-+ .write_page = at803x_write_page,
- /* PHY_GBIT_FEATURES */
- .read_status = at803x_read_status,
- .aneg_done = at803x_aneg_done,
diff --git a/target/linux/generic/backport-5.4/791-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch b/target/linux/generic/backport-5.4/791-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch
deleted file mode 100644
index ac9583a89e..0000000000
--- a/target/linux/generic/backport-5.4/791-net-phy-at803x-fix-probe-error-if-copper-page-is-sel.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 8f7e876273e294b732b42af2e5e6bba91d798954 Mon Sep 17 00:00:00 2001
-From: Michael Walle <michael@walle.cc>
-Date: Tue, 20 Apr 2021 12:29:29 +0200
-Subject: [PATCH] net: phy: at803x: fix probe error if copper page is selected
-
-The commit c329e5afb42f ("net: phy: at803x: select correct page on
-config init") selects the copper page during probe. This fails if the
-copper page was already selected. In this case, the value of the copper
-page (which is 1) is propagated through phy_restore_page() and is
-finally returned for at803x_probe(). Fix it, by just using the
-at803x_page_write() directly.
-
-Also in case of an error, the regulator is not disabled and leads to a
-WARN_ON() when the probe fails. This couldn't happen before, because
-at803x_parse_dt() was the last call in at803x_probe(). It is hard to
-see, that the parse_dt() actually enables the regulator. Thus move the
-regulator_enable() to the probe function and undo it in case of an
-error.
-
-Fixes: c329e5afb42f ("net: phy: at803x: select correct page on config init")
-Signed-off-by: Michael Walle <michael@walle.cc>
-Reviewed-by: David Bauer <mail@david-bauer.net>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/at803x.c | 23 +++++++++++++++++------
- 1 file changed, 17 insertions(+), 6 deletions(-)
-
---- a/drivers/net/phy/at803x.c
-+++ b/drivers/net/phy/at803x.c
-@@ -289,8 +289,9 @@ static int at803x_probe(struct phy_devic
- * the PHY capabilities from the fiber side.
- */
- if ((phydev->phy_id & phydev->drv->phy_id_mask) == (ATH8031_PHY_ID & phydev->drv->phy_id_mask)) {
-- ret = phy_select_page(phydev, AT803X_PAGE_COPPER);
-- ret = phy_restore_page(phydev, AT803X_PAGE_COPPER, ret);
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = at803x_write_page(phydev, AT803X_PAGE_COPPER);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
- }
-
- return ret;
diff --git a/target/linux/generic/backport-5.4/800-v5.5-iio-imu-Add-support-for-the-FXOS8700-IMU.patch b/target/linux/generic/backport-5.4/800-v5.5-iio-imu-Add-support-for-the-FXOS8700-IMU.patch
deleted file mode 100644
index b9cd276327..0000000000
--- a/target/linux/generic/backport-5.4/800-v5.5-iio-imu-Add-support-for-the-FXOS8700-IMU.patch
+++ /dev/null
@@ -1,893 +0,0 @@
-From 84e5ddd5c46ea3bf0cad670da32028994cad5936 Mon Sep 17 00:00:00 2001
-From: Robert Jones <rjones@gateworks.com>
-Date: Mon, 14 Oct 2019 11:49:21 -0700
-Subject: [PATCH] iio: imu: Add support for the FXOS8700 IMU
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-FXOS8700CQ is a small, low-power, 3-axis linear accelerometer and 3-axis
-magnetometer combined into a single package. The device features a
-selectable I2C or point-to-point SPI serial interface with 14-bit
-accelerometer and 16-bit magnetometer ADC resolution along with
-smart-embedded functions.
-
-FXOS8700CQ has dynamically selectable accelerationfull-scale ranges of
-±2 g/±4 g/±8 g and a fixed magnetic measurement range of ±1200 μT.
-Output data rates (ODR) from 1.563 Hz to 800 Hz are selectable by the user
-for each sensor. Interleaved magnetic and acceleration data is available
-at ODR rates of up to 400 Hz. FXOS8700CQ is available in a plastic QFN
-package and it is guaranteed to operate over the extended temperature
-range of –40 °C to +85 °C.
-
-TODO: Trigger and IRQ configuration support
-
-Datasheet:
- http://cache.freescale.com/files/sensors/doc/data_sheet/FXOS8700CQ.pdf
-
-Signed-off-by: Robert Jones <rjones@gateworks.com>
-Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
----
- drivers/iio/imu/Kconfig | 27 ++
- drivers/iio/imu/Makefile | 5 +
- drivers/iio/imu/fxos8700.h | 10 +
- drivers/iio/imu/fxos8700_core.c | 649 ++++++++++++++++++++++++++++++++++++++++
- drivers/iio/imu/fxos8700_i2c.c | 71 +++++
- drivers/iio/imu/fxos8700_spi.c | 59 ++++
- 6 files changed, 821 insertions(+)
- create mode 100644 drivers/iio/imu/fxos8700.h
- create mode 100644 drivers/iio/imu/fxos8700_core.c
- create mode 100644 drivers/iio/imu/fxos8700_i2c.c
- create mode 100644 drivers/iio/imu/fxos8700_spi.c
-
---- a/drivers/iio/imu/Kconfig
-+++ b/drivers/iio/imu/Kconfig
-@@ -40,6 +40,33 @@ config ADIS16480
-
- source "drivers/iio/imu/bmi160/Kconfig"
-
-+config FXOS8700
-+ tristate
-+
-+config FXOS8700_I2C
-+ tristate "NXP FXOS8700 I2C driver"
-+ depends on I2C
-+ select FXOS8700
-+ select REGMAP_I2C
-+ help
-+ Say yes here to build support for the NXP FXOS8700 m+g combo
-+ sensor on I2C.
-+
-+ This driver can also be built as a module. If so, the module will be
-+ called fxos8700_i2c.
-+
-+config FXOS8700_SPI
-+ tristate "NXP FXOS8700 SPI driver"
-+ depends on SPI
-+ select FXOS8700
-+ select REGMAP_SPI
-+ help
-+ Say yes here to build support for the NXP FXOS8700 m+g combo
-+ sensor on SPI.
-+
-+ This driver can also be built as a module. If so, the module will be
-+ called fxos8700_spi.
-+
- config KMX61
- tristate "Kionix KMX61 6-axis accelerometer and magnetometer"
- depends on I2C
---- a/drivers/iio/imu/Makefile
-+++ b/drivers/iio/imu/Makefile
-@@ -14,6 +14,11 @@ adis_lib-$(CONFIG_IIO_ADIS_LIB_BUFFER) +
- obj-$(CONFIG_IIO_ADIS_LIB) += adis_lib.o
-
- obj-y += bmi160/
-+
-+obj-$(CONFIG_FXOS8700) += fxos8700_core.o
-+obj-$(CONFIG_FXOS8700_I2C) += fxos8700_i2c.o
-+obj-$(CONFIG_FXOS8700_SPI) += fxos8700_spi.o
-+
- obj-y += inv_mpu6050/
-
- obj-$(CONFIG_KMX61) += kmx61.o
---- /dev/null
-+++ b/drivers/iio/imu/fxos8700.h
-@@ -0,0 +1,10 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+#ifndef FXOS8700_H_
-+#define FXOS8700_H_
-+
-+extern const struct regmap_config fxos8700_regmap_config;
-+
-+int fxos8700_core_probe(struct device *dev, struct regmap *regmap,
-+ const char *name, bool use_spi);
-+
-+#endif /* FXOS8700_H_ */
---- /dev/null
-+++ b/drivers/iio/imu/fxos8700_core.c
-@@ -0,0 +1,649 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * FXOS8700 - NXP IMU (accelerometer plus magnetometer)
-+ *
-+ * IIO core driver for FXOS8700, with support for I2C/SPI busses
-+ *
-+ * TODO: Buffer, trigger, and IRQ support
-+ */
-+#include <linux/module.h>
-+#include <linux/regmap.h>
-+#include <linux/acpi.h>
-+#include <linux/bitops.h>
-+
-+#include <linux/iio/iio.h>
-+#include <linux/iio/sysfs.h>
-+
-+#include "fxos8700.h"
-+
-+/* Register Definitions */
-+#define FXOS8700_STATUS 0x00
-+#define FXOS8700_OUT_X_MSB 0x01
-+#define FXOS8700_OUT_X_LSB 0x02
-+#define FXOS8700_OUT_Y_MSB 0x03
-+#define FXOS8700_OUT_Y_LSB 0x04
-+#define FXOS8700_OUT_Z_MSB 0x05
-+#define FXOS8700_OUT_Z_LSB 0x06
-+#define FXOS8700_F_SETUP 0x09
-+#define FXOS8700_TRIG_CFG 0x0a
-+#define FXOS8700_SYSMOD 0x0b
-+#define FXOS8700_INT_SOURCE 0x0c
-+#define FXOS8700_WHO_AM_I 0x0d
-+#define FXOS8700_XYZ_DATA_CFG 0x0e
-+#define FXOS8700_HP_FILTER_CUTOFF 0x0f
-+#define FXOS8700_PL_STATUS 0x10
-+#define FXOS8700_PL_CFG 0x11
-+#define FXOS8700_PL_COUNT 0x12
-+#define FXOS8700_PL_BF_ZCOMP 0x13
-+#define FXOS8700_PL_THS_REG 0x14
-+#define FXOS8700_A_FFMT_CFG 0x15
-+#define FXOS8700_A_FFMT_SRC 0x16
-+#define FXOS8700_A_FFMT_THS 0x17
-+#define FXOS8700_A_FFMT_COUNT 0x18
-+#define FXOS8700_TRANSIENT_CFG 0x1d
-+#define FXOS8700_TRANSIENT_SRC 0x1e
-+#define FXOS8700_TRANSIENT_THS 0x1f
-+#define FXOS8700_TRANSIENT_COUNT 0x20
-+#define FXOS8700_PULSE_CFG 0x21
-+#define FXOS8700_PULSE_SRC 0x22
-+#define FXOS8700_PULSE_THSX 0x23
-+#define FXOS8700_PULSE_THSY 0x24
-+#define FXOS8700_PULSE_THSZ 0x25
-+#define FXOS8700_PULSE_TMLT 0x26
-+#define FXOS8700_PULSE_LTCY 0x27
-+#define FXOS8700_PULSE_WIND 0x28
-+#define FXOS8700_ASLP_COUNT 0x29
-+#define FXOS8700_CTRL_REG1 0x2a
-+#define FXOS8700_CTRL_REG2 0x2b
-+#define FXOS8700_CTRL_REG3 0x2c
-+#define FXOS8700_CTRL_REG4 0x2d
-+#define FXOS8700_CTRL_REG5 0x2e
-+#define FXOS8700_OFF_X 0x2f
-+#define FXOS8700_OFF_Y 0x30
-+#define FXOS8700_OFF_Z 0x31
-+#define FXOS8700_M_DR_STATUS 0x32
-+#define FXOS8700_M_OUT_X_MSB 0x33
-+#define FXOS8700_M_OUT_X_LSB 0x34
-+#define FXOS8700_M_OUT_Y_MSB 0x35
-+#define FXOS8700_M_OUT_Y_LSB 0x36
-+#define FXOS8700_M_OUT_Z_MSB 0x37
-+#define FXOS8700_M_OUT_Z_LSB 0x38
-+#define FXOS8700_CMP_X_MSB 0x39
-+#define FXOS8700_CMP_X_LSB 0x3a
-+#define FXOS8700_CMP_Y_MSB 0x3b
-+#define FXOS8700_CMP_Y_LSB 0x3c
-+#define FXOS8700_CMP_Z_MSB 0x3d
-+#define FXOS8700_CMP_Z_LSB 0x3e
-+#define FXOS8700_M_OFF_X_MSB 0x3f
-+#define FXOS8700_M_OFF_X_LSB 0x40
-+#define FXOS8700_M_OFF_Y_MSB 0x41
-+#define FXOS8700_M_OFF_Y_LSB 0x42
-+#define FXOS8700_M_OFF_Z_MSB 0x43
-+#define FXOS8700_M_OFF_Z_LSB 0x44
-+#define FXOS8700_MAX_X_MSB 0x45
-+#define FXOS8700_MAX_X_LSB 0x46
-+#define FXOS8700_MAX_Y_MSB 0x47
-+#define FXOS8700_MAX_Y_LSB 0x48
-+#define FXOS8700_MAX_Z_MSB 0x49
-+#define FXOS8700_MAX_Z_LSB 0x4a
-+#define FXOS8700_MIN_X_MSB 0x4b
-+#define FXOS8700_MIN_X_LSB 0x4c
-+#define FXOS8700_MIN_Y_MSB 0x4d
-+#define FXOS8700_MIN_Y_LSB 0x4e
-+#define FXOS8700_MIN_Z_MSB 0x4f
-+#define FXOS8700_MIN_Z_LSB 0x50
-+#define FXOS8700_TEMP 0x51
-+#define FXOS8700_M_THS_CFG 0x52
-+#define FXOS8700_M_THS_SRC 0x53
-+#define FXOS8700_M_THS_X_MSB 0x54
-+#define FXOS8700_M_THS_X_LSB 0x55
-+#define FXOS8700_M_THS_Y_MSB 0x56
-+#define FXOS8700_M_THS_Y_LSB 0x57
-+#define FXOS8700_M_THS_Z_MSB 0x58
-+#define FXOS8700_M_THS_Z_LSB 0x59
-+#define FXOS8700_M_THS_COUNT 0x5a
-+#define FXOS8700_M_CTRL_REG1 0x5b
-+#define FXOS8700_M_CTRL_REG2 0x5c
-+#define FXOS8700_M_CTRL_REG3 0x5d
-+#define FXOS8700_M_INT_SRC 0x5e
-+#define FXOS8700_A_VECM_CFG 0x5f
-+#define FXOS8700_A_VECM_THS_MSB 0x60
-+#define FXOS8700_A_VECM_THS_LSB 0x61
-+#define FXOS8700_A_VECM_CNT 0x62
-+#define FXOS8700_A_VECM_INITX_MSB 0x63
-+#define FXOS8700_A_VECM_INITX_LSB 0x64
-+#define FXOS8700_A_VECM_INITY_MSB 0x65
-+#define FXOS8700_A_VECM_INITY_LSB 0x66
-+#define FXOS8700_A_VECM_INITZ_MSB 0x67
-+#define FXOS8700_A_VECM_INITZ_LSB 0x68
-+#define FXOS8700_M_VECM_CFG 0x69
-+#define FXOS8700_M_VECM_THS_MSB 0x6a
-+#define FXOS8700_M_VECM_THS_LSB 0x6b
-+#define FXOS8700_M_VECM_CNT 0x6c
-+#define FXOS8700_M_VECM_INITX_MSB 0x6d
-+#define FXOS8700_M_VECM_INITX_LSB 0x6e
-+#define FXOS8700_M_VECM_INITY_MSB 0x6f
-+#define FXOS8700_M_VECM_INITY_LSB 0x70
-+#define FXOS8700_M_VECM_INITZ_MSB 0x71
-+#define FXOS8700_M_VECM_INITZ_LSB 0x72
-+#define FXOS8700_A_FFMT_THS_X_MSB 0x73
-+#define FXOS8700_A_FFMT_THS_X_LSB 0x74
-+#define FXOS8700_A_FFMT_THS_Y_MSB 0x75
-+#define FXOS8700_A_FFMT_THS_Y_LSB 0x76
-+#define FXOS8700_A_FFMT_THS_Z_MSB 0x77
-+#define FXOS8700_A_FFMT_THS_Z_LSB 0x78
-+#define FXOS8700_A_TRAN_INIT_MSB 0x79
-+#define FXOS8700_A_TRAN_INIT_LSB_X 0x7a
-+#define FXOS8700_A_TRAN_INIT_LSB_Y 0x7b
-+#define FXOS8700_A_TRAN_INIT_LSB_Z 0x7d
-+#define FXOS8700_TM_NVM_LOCK 0x7e
-+#define FXOS8700_NVM_DATA0_35 0x80
-+#define FXOS8700_NVM_DATA_BNK3 0xa4
-+#define FXOS8700_NVM_DATA_BNK2 0xa5
-+#define FXOS8700_NVM_DATA_BNK1 0xa6
-+#define FXOS8700_NVM_DATA_BNK0 0xa7
-+
-+/* Bit definitions for FXOS8700_CTRL_REG1 */
-+#define FXOS8700_CTRL_ODR_MSK 0x38
-+#define FXOS8700_CTRL_ODR_MAX 0x00
-+#define FXOS8700_CTRL_ODR_MIN GENMASK(4, 3)
-+
-+/* Bit definitions for FXOS8700_M_CTRL_REG1 */
-+#define FXOS8700_HMS_MASK GENMASK(1, 0)
-+#define FXOS8700_OS_MASK GENMASK(4, 2)
-+
-+/* Bit definitions for FXOS8700_M_CTRL_REG2 */
-+#define FXOS8700_MAXMIN_RST BIT(2)
-+#define FXOS8700_MAXMIN_DIS_THS BIT(3)
-+#define FXOS8700_MAXMIN_DIS BIT(4)
-+
-+#define FXOS8700_ACTIVE 0x01
-+#define FXOS8700_ACTIVE_MIN_USLEEP 4000 /* from table 6 in datasheet */
-+
-+#define FXOS8700_DEVICE_ID 0xC7
-+#define FXOS8700_PRE_DEVICE_ID 0xC4
-+#define FXOS8700_DATA_BUF_SIZE 3
-+
-+struct fxos8700_data {
-+ struct regmap *regmap;
-+ struct iio_trigger *trig;
-+ __be16 buf[FXOS8700_DATA_BUF_SIZE] ____cacheline_aligned;
-+};
-+
-+/* Regmap info */
-+static const struct regmap_range read_range[] = {
-+ {
-+ .range_min = FXOS8700_STATUS,
-+ .range_max = FXOS8700_A_FFMT_COUNT,
-+ }, {
-+ .range_min = FXOS8700_TRANSIENT_CFG,
-+ .range_max = FXOS8700_A_FFMT_THS_Z_LSB,
-+ },
-+};
-+
-+static const struct regmap_range write_range[] = {
-+ {
-+ .range_min = FXOS8700_F_SETUP,
-+ .range_max = FXOS8700_TRIG_CFG,
-+ }, {
-+ .range_min = FXOS8700_XYZ_DATA_CFG,
-+ .range_max = FXOS8700_HP_FILTER_CUTOFF,
-+ }, {
-+ .range_min = FXOS8700_PL_CFG,
-+ .range_max = FXOS8700_A_FFMT_CFG,
-+ }, {
-+ .range_min = FXOS8700_A_FFMT_THS,
-+ .range_max = FXOS8700_TRANSIENT_CFG,
-+ }, {
-+ .range_min = FXOS8700_TRANSIENT_THS,
-+ .range_max = FXOS8700_PULSE_CFG,
-+ }, {
-+ .range_min = FXOS8700_PULSE_THSX,
-+ .range_max = FXOS8700_OFF_Z,
-+ }, {
-+ .range_min = FXOS8700_M_OFF_X_MSB,
-+ .range_max = FXOS8700_M_OFF_Z_LSB,
-+ }, {
-+ .range_min = FXOS8700_M_THS_CFG,
-+ .range_max = FXOS8700_M_THS_CFG,
-+ }, {
-+ .range_min = FXOS8700_M_THS_X_MSB,
-+ .range_max = FXOS8700_M_CTRL_REG3,
-+ }, {
-+ .range_min = FXOS8700_A_VECM_CFG,
-+ .range_max = FXOS8700_A_FFMT_THS_Z_LSB,
-+ },
-+};
-+
-+static const struct regmap_access_table driver_read_table = {
-+ .yes_ranges = read_range,
-+ .n_yes_ranges = ARRAY_SIZE(read_range),
-+};
-+
-+static const struct regmap_access_table driver_write_table = {
-+ .yes_ranges = write_range,
-+ .n_yes_ranges = ARRAY_SIZE(write_range),
-+};
-+
-+const struct regmap_config fxos8700_regmap_config = {
-+ .reg_bits = 8,
-+ .val_bits = 8,
-+ .max_register = FXOS8700_NVM_DATA_BNK0,
-+ .rd_table = &driver_read_table,
-+ .wr_table = &driver_write_table,
-+};
-+EXPORT_SYMBOL(fxos8700_regmap_config);
-+
-+#define FXOS8700_CHANNEL(_type, _axis) { \
-+ .type = _type, \
-+ .modified = 1, \
-+ .channel2 = IIO_MOD_##_axis, \
-+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
-+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
-+ BIT(IIO_CHAN_INFO_SAMP_FREQ), \
-+}
-+
-+enum fxos8700_accel_scale_bits {
-+ MODE_2G = 0,
-+ MODE_4G,
-+ MODE_8G,
-+};
-+
-+/* scan indexes follow DATA register order */
-+enum fxos8700_scan_axis {
-+ FXOS8700_SCAN_ACCEL_X = 0,
-+ FXOS8700_SCAN_ACCEL_Y,
-+ FXOS8700_SCAN_ACCEL_Z,
-+ FXOS8700_SCAN_MAGN_X,
-+ FXOS8700_SCAN_MAGN_Y,
-+ FXOS8700_SCAN_MAGN_Z,
-+ FXOS8700_SCAN_RHALL,
-+ FXOS8700_SCAN_TIMESTAMP,
-+};
-+
-+enum fxos8700_sensor {
-+ FXOS8700_ACCEL = 0,
-+ FXOS8700_MAGN,
-+ FXOS8700_NUM_SENSORS /* must be last */
-+};
-+
-+enum fxos8700_int_pin {
-+ FXOS8700_PIN_INT1,
-+ FXOS8700_PIN_INT2
-+};
-+
-+struct fxos8700_scale {
-+ u8 bits;
-+ int uscale;
-+};
-+
-+struct fxos8700_odr {
-+ u8 bits;
-+ int odr;
-+ int uodr;
-+};
-+
-+static const struct fxos8700_scale fxos8700_accel_scale[] = {
-+ { MODE_2G, 244},
-+ { MODE_4G, 488},
-+ { MODE_8G, 976},
-+};
-+
-+/*
-+ * Accellerometer and magnetometer have the same ODR options, set in the
-+ * CTRL_REG1 register. ODR is halved when using both sensors at once in
-+ * hybrid mode.
-+ */
-+static const struct fxos8700_odr fxos8700_odr[] = {
-+ {0x00, 800, 0},
-+ {0x01, 400, 0},
-+ {0x02, 200, 0},
-+ {0x03, 100, 0},
-+ {0x04, 50, 0},
-+ {0x05, 12, 500000},
-+ {0x06, 6, 250000},
-+ {0x07, 1, 562500},
-+};
-+
-+static const struct iio_chan_spec fxos8700_channels[] = {
-+ FXOS8700_CHANNEL(IIO_ACCEL, X),
-+ FXOS8700_CHANNEL(IIO_ACCEL, Y),
-+ FXOS8700_CHANNEL(IIO_ACCEL, Z),
-+ FXOS8700_CHANNEL(IIO_MAGN, X),
-+ FXOS8700_CHANNEL(IIO_MAGN, Y),
-+ FXOS8700_CHANNEL(IIO_MAGN, Z),
-+ IIO_CHAN_SOFT_TIMESTAMP(FXOS8700_SCAN_TIMESTAMP),
-+};
-+
-+static enum fxos8700_sensor fxos8700_to_sensor(enum iio_chan_type iio_type)
-+{
-+ switch (iio_type) {
-+ case IIO_ACCEL:
-+ return FXOS8700_ACCEL;
-+ case IIO_ANGL_VEL:
-+ return FXOS8700_MAGN;
-+ default:
-+ return -EINVAL;
-+ }
-+}
-+
-+static int fxos8700_set_active_mode(struct fxos8700_data *data,
-+ enum fxos8700_sensor t, bool mode)
-+{
-+ int ret;
-+
-+ ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1, mode);
-+ if (ret)
-+ return ret;
-+
-+ usleep_range(FXOS8700_ACTIVE_MIN_USLEEP,
-+ FXOS8700_ACTIVE_MIN_USLEEP + 1000);
-+
-+ return 0;
-+}
-+
-+static int fxos8700_set_scale(struct fxos8700_data *data,
-+ enum fxos8700_sensor t, int uscale)
-+{
-+ int i;
-+ static const int scale_num = ARRAY_SIZE(fxos8700_accel_scale);
-+ struct device *dev = regmap_get_device(data->regmap);
-+
-+ if (t == FXOS8700_MAGN) {
-+ dev_err(dev, "Magnetometer scale is locked at 1200uT\n");
-+ return -EINVAL;
-+ }
-+
-+ for (i = 0; i < scale_num; i++)
-+ if (fxos8700_accel_scale[i].uscale == uscale)
-+ break;
-+
-+ if (i == scale_num)
-+ return -EINVAL;
-+
-+ return regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG,
-+ fxos8700_accel_scale[i].bits);
-+}
-+
-+static int fxos8700_get_scale(struct fxos8700_data *data,
-+ enum fxos8700_sensor t, int *uscale)
-+{
-+ int i, ret, val;
-+ static const int scale_num = ARRAY_SIZE(fxos8700_accel_scale);
-+
-+ if (t == FXOS8700_MAGN) {
-+ *uscale = 1200; /* Magnetometer is locked at 1200uT */
-+ return 0;
-+ }
-+
-+ ret = regmap_read(data->regmap, FXOS8700_XYZ_DATA_CFG, &val);
-+ if (ret)
-+ return ret;
-+
-+ for (i = 0; i < scale_num; i++) {
-+ if (fxos8700_accel_scale[i].bits == (val & 0x3)) {
-+ *uscale = fxos8700_accel_scale[i].uscale;
-+ return 0;
-+ }
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static int fxos8700_get_data(struct fxos8700_data *data, int chan_type,
-+ int axis, int *val)
-+{
-+ u8 base, reg;
-+ int ret;
-+ enum fxos8700_sensor type = fxos8700_to_sensor(chan_type);
-+
-+ base = type ? FXOS8700_OUT_X_MSB : FXOS8700_M_OUT_X_MSB;
-+
-+ /* Block read 6 bytes of device output registers to avoid data loss */
-+ ret = regmap_bulk_read(data->regmap, base, data->buf,
-+ FXOS8700_DATA_BUF_SIZE);
-+ if (ret)
-+ return ret;
-+
-+ /* Convert axis to buffer index */
-+ reg = axis - IIO_MOD_X;
-+
-+ /* Convert to native endianness */
-+ *val = sign_extend32(be16_to_cpu(data->buf[reg]), 15);
-+
-+ return 0;
-+}
-+
-+static int fxos8700_set_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
-+ int odr, int uodr)
-+{
-+ int i, ret, val;
-+ bool active_mode;
-+ static const int odr_num = ARRAY_SIZE(fxos8700_odr);
-+
-+ ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, &val);
-+ if (ret)
-+ return ret;
-+
-+ active_mode = val & FXOS8700_ACTIVE;
-+
-+ if (active_mode) {
-+ /*
-+ * The device must be in standby mode to change any of the
-+ * other fields within CTRL_REG1
-+ */
-+ ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1,
-+ val & ~FXOS8700_ACTIVE);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ for (i = 0; i < odr_num; i++)
-+ if (fxos8700_odr[i].odr == odr && fxos8700_odr[i].uodr == uodr)
-+ break;
-+
-+ if (i >= odr_num)
-+ return -EINVAL;
-+
-+ return regmap_update_bits(data->regmap,
-+ FXOS8700_CTRL_REG1,
-+ FXOS8700_CTRL_ODR_MSK + FXOS8700_ACTIVE,
-+ fxos8700_odr[i].bits << 3 | active_mode);
-+}
-+
-+static int fxos8700_get_odr(struct fxos8700_data *data, enum fxos8700_sensor t,
-+ int *odr, int *uodr)
-+{
-+ int i, val, ret;
-+ static const int odr_num = ARRAY_SIZE(fxos8700_odr);
-+
-+ ret = regmap_read(data->regmap, FXOS8700_CTRL_REG1, &val);
-+ if (ret)
-+ return ret;
-+
-+ val &= FXOS8700_CTRL_ODR_MSK;
-+
-+ for (i = 0; i < odr_num; i++)
-+ if (val == fxos8700_odr[i].bits)
-+ break;
-+
-+ if (i >= odr_num)
-+ return -EINVAL;
-+
-+ *odr = fxos8700_odr[i].odr;
-+ *uodr = fxos8700_odr[i].uodr;
-+
-+ return 0;
-+}
-+
-+static int fxos8700_read_raw(struct iio_dev *indio_dev,
-+ struct iio_chan_spec const *chan,
-+ int *val, int *val2, long mask)
-+{
-+ int ret;
-+ struct fxos8700_data *data = iio_priv(indio_dev);
-+
-+ switch (mask) {
-+ case IIO_CHAN_INFO_RAW:
-+ ret = fxos8700_get_data(data, chan->type, chan->channel2, val);
-+ if (ret)
-+ return ret;
-+ return IIO_VAL_INT;
-+ case IIO_CHAN_INFO_SCALE:
-+ *val = 0;
-+ ret = fxos8700_get_scale(data, fxos8700_to_sensor(chan->type),
-+ val2);
-+ return ret ? ret : IIO_VAL_INT_PLUS_MICRO;
-+ case IIO_CHAN_INFO_SAMP_FREQ:
-+ ret = fxos8700_get_odr(data, fxos8700_to_sensor(chan->type),
-+ val, val2);
-+ return ret ? ret : IIO_VAL_INT_PLUS_MICRO;
-+ default:
-+ return -EINVAL;
-+ }
-+}
-+
-+static int fxos8700_write_raw(struct iio_dev *indio_dev,
-+ struct iio_chan_spec const *chan,
-+ int val, int val2, long mask)
-+{
-+ struct fxos8700_data *data = iio_priv(indio_dev);
-+
-+ switch (mask) {
-+ case IIO_CHAN_INFO_SCALE:
-+ return fxos8700_set_scale(data, fxos8700_to_sensor(chan->type),
-+ val2);
-+ case IIO_CHAN_INFO_SAMP_FREQ:
-+ return fxos8700_set_odr(data, fxos8700_to_sensor(chan->type),
-+ val, val2);
-+ default:
-+ return -EINVAL;
-+ }
-+}
-+
-+static IIO_CONST_ATTR(in_accel_sampling_frequency_available,
-+ "1.5625 6.25 12.5 50 100 200 400 800");
-+static IIO_CONST_ATTR(in_magn_sampling_frequency_available,
-+ "1.5625 6.25 12.5 50 100 200 400 800");
-+static IIO_CONST_ATTR(in_accel_scale_available, "0.000244 0.000488 0.000976");
-+static IIO_CONST_ATTR(in_magn_scale_available, "0.000001200");
-+
-+static struct attribute *fxos8700_attrs[] = {
-+ &iio_const_attr_in_accel_sampling_frequency_available.dev_attr.attr,
-+ &iio_const_attr_in_magn_sampling_frequency_available.dev_attr.attr,
-+ &iio_const_attr_in_accel_scale_available.dev_attr.attr,
-+ &iio_const_attr_in_magn_scale_available.dev_attr.attr,
-+ NULL,
-+};
-+
-+static const struct attribute_group fxos8700_attrs_group = {
-+ .attrs = fxos8700_attrs,
-+};
-+
-+static const struct iio_info fxos8700_info = {
-+ .read_raw = fxos8700_read_raw,
-+ .write_raw = fxos8700_write_raw,
-+ .attrs = &fxos8700_attrs_group,
-+};
-+
-+static int fxos8700_chip_init(struct fxos8700_data *data, bool use_spi)
-+{
-+ int ret;
-+ unsigned int val;
-+ struct device *dev = regmap_get_device(data->regmap);
-+
-+ ret = regmap_read(data->regmap, FXOS8700_WHO_AM_I, &val);
-+ if (ret) {
-+ dev_err(dev, "Error reading chip id\n");
-+ return ret;
-+ }
-+ if (val != FXOS8700_DEVICE_ID && val != FXOS8700_PRE_DEVICE_ID) {
-+ dev_err(dev, "Wrong chip id, got %x expected %x or %x\n",
-+ val, FXOS8700_DEVICE_ID, FXOS8700_PRE_DEVICE_ID);
-+ return -ENODEV;
-+ }
-+
-+ ret = fxos8700_set_active_mode(data, FXOS8700_ACCEL, true);
-+ if (ret)
-+ return ret;
-+
-+ ret = fxos8700_set_active_mode(data, FXOS8700_MAGN, true);
-+ if (ret)
-+ return ret;
-+
-+ /*
-+ * The device must be in standby mode to change any of the other fields
-+ * within CTRL_REG1
-+ */
-+ ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1, 0x00);
-+ if (ret)
-+ return ret;
-+
-+ /* Set max oversample ratio (OSR) and both devices active */
-+ ret = regmap_write(data->regmap, FXOS8700_M_CTRL_REG1,
-+ FXOS8700_HMS_MASK | FXOS8700_OS_MASK);
-+ if (ret)
-+ return ret;
-+
-+ /* Disable and rst min/max measurements & threshold */
-+ ret = regmap_write(data->regmap, FXOS8700_M_CTRL_REG2,
-+ FXOS8700_MAXMIN_RST | FXOS8700_MAXMIN_DIS_THS |
-+ FXOS8700_MAXMIN_DIS);
-+ if (ret)
-+ return ret;
-+
-+ /* Max ODR (800Hz individual or 400Hz hybrid), active mode */
-+ ret = regmap_write(data->regmap, FXOS8700_CTRL_REG1,
-+ FXOS8700_CTRL_ODR_MAX | FXOS8700_ACTIVE);
-+ if (ret)
-+ return ret;
-+
-+ /* Set for max full-scale range (+/-8G) */
-+ return regmap_write(data->regmap, FXOS8700_XYZ_DATA_CFG, MODE_8G);
-+}
-+
-+static void fxos8700_chip_uninit(void *data)
-+{
-+ struct fxos8700_data *fxos8700_data = data;
-+
-+ fxos8700_set_active_mode(fxos8700_data, FXOS8700_ACCEL, false);
-+ fxos8700_set_active_mode(fxos8700_data, FXOS8700_MAGN, false);
-+}
-+
-+int fxos8700_core_probe(struct device *dev, struct regmap *regmap,
-+ const char *name, bool use_spi)
-+{
-+ struct iio_dev *indio_dev;
-+ struct fxos8700_data *data;
-+ int ret;
-+
-+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
-+ if (!indio_dev)
-+ return -ENOMEM;
-+
-+ data = iio_priv(indio_dev);
-+ dev_set_drvdata(dev, indio_dev);
-+ data->regmap = regmap;
-+
-+ ret = fxos8700_chip_init(data, use_spi);
-+ if (ret)
-+ return ret;
-+
-+ ret = devm_add_action_or_reset(dev, fxos8700_chip_uninit, data);
-+ if (ret)
-+ return ret;
-+
-+ indio_dev->dev.parent = dev;
-+ indio_dev->channels = fxos8700_channels;
-+ indio_dev->num_channels = ARRAY_SIZE(fxos8700_channels);
-+ indio_dev->name = name ? name : "fxos8700";
-+ indio_dev->modes = INDIO_DIRECT_MODE;
-+ indio_dev->info = &fxos8700_info;
-+
-+ return devm_iio_device_register(dev, indio_dev);
-+}
-+EXPORT_SYMBOL_GPL(fxos8700_core_probe);
-+
-+MODULE_AUTHOR("Robert Jones <rjones@gateworks.com>");
-+MODULE_DESCRIPTION("FXOS8700 6-Axis Acc and Mag Combo Sensor driver");
-+MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/drivers/iio/imu/fxos8700_i2c.c
-@@ -0,0 +1,71 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * FXOS8700 - NXP IMU, I2C bits
-+ *
-+ * 7-bit I2C slave address determined by SA1 and SA0 logic level
-+ * inputs represented in the following table:
-+ * SA1 | SA0 | Slave Address
-+ * 0 | 0 | 0x1E
-+ * 0 | 1 | 0x1D
-+ * 1 | 0 | 0x1C
-+ * 1 | 1 | 0x1F
-+ */
-+#include <linux/acpi.h>
-+#include <linux/i2c.h>
-+#include <linux/module.h>
-+#include <linux/mod_devicetable.h>
-+#include <linux/regmap.h>
-+
-+#include "fxos8700.h"
-+
-+static int fxos8700_i2c_probe(struct i2c_client *client,
-+ const struct i2c_device_id *id)
-+{
-+ struct regmap *regmap;
-+ const char *name = NULL;
-+
-+ regmap = devm_regmap_init_i2c(client, &fxos8700_regmap_config);
-+ if (IS_ERR(regmap)) {
-+ dev_err(&client->dev, "Failed to register i2c regmap %d\n",
-+ (int)PTR_ERR(regmap));
-+ return PTR_ERR(regmap);
-+ }
-+
-+ if (id)
-+ name = id->name;
-+
-+ return fxos8700_core_probe(&client->dev, regmap, name, false);
-+}
-+
-+static const struct i2c_device_id fxos8700_i2c_id[] = {
-+ {"fxos8700", 0},
-+ { }
-+};
-+MODULE_DEVICE_TABLE(i2c, fxos8700_i2c_id);
-+
-+static const struct acpi_device_id fxos8700_acpi_match[] = {
-+ {"FXOS8700", 0},
-+ { }
-+};
-+MODULE_DEVICE_TABLE(acpi, fxos8700_acpi_match);
-+
-+static const struct of_device_id fxos8700_of_match[] = {
-+ { .compatible = "nxp,fxos8700" },
-+ { }
-+};
-+MODULE_DEVICE_TABLE(of, fxos8700_of_match);
-+
-+static struct i2c_driver fxos8700_i2c_driver = {
-+ .driver = {
-+ .name = "fxos8700_i2c",
-+ .acpi_match_table = ACPI_PTR(fxos8700_acpi_match),
-+ .of_match_table = fxos8700_of_match,
-+ },
-+ .probe = fxos8700_i2c_probe,
-+ .id_table = fxos8700_i2c_id,
-+};
-+module_i2c_driver(fxos8700_i2c_driver);
-+
-+MODULE_AUTHOR("Robert Jones <rjones@gateworks.com>");
-+MODULE_DESCRIPTION("FXOS8700 I2C driver");
-+MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/drivers/iio/imu/fxos8700_spi.c
-@@ -0,0 +1,59 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * FXOS8700 - NXP IMU, SPI bits
-+ */
-+#include <linux/acpi.h>
-+#include <linux/module.h>
-+#include <linux/mod_devicetable.h>
-+#include <linux/regmap.h>
-+#include <linux/spi/spi.h>
-+
-+#include "fxos8700.h"
-+
-+static int fxos8700_spi_probe(struct spi_device *spi)
-+{
-+ struct regmap *regmap;
-+ const struct spi_device_id *id = spi_get_device_id(spi);
-+
-+ regmap = devm_regmap_init_spi(spi, &fxos8700_regmap_config);
-+ if (IS_ERR(regmap)) {
-+ dev_err(&spi->dev, "Failed to register spi regmap %d\n",
-+ (int)PTR_ERR(regmap));
-+ return PTR_ERR(regmap);
-+ }
-+
-+ return fxos8700_core_probe(&spi->dev, regmap, id->name, true);
-+}
-+
-+static const struct spi_device_id fxos8700_spi_id[] = {
-+ {"fxos8700", 0},
-+ { }
-+};
-+MODULE_DEVICE_TABLE(spi, fxos8700_spi_id);
-+
-+static const struct acpi_device_id fxos8700_acpi_match[] = {
-+ {"FXOS8700", 0},
-+ { }
-+};
-+MODULE_DEVICE_TABLE(acpi, fxos8700_acpi_match);
-+
-+static const struct of_device_id fxos8700_of_match[] = {
-+ { .compatible = "nxp,fxos8700" },
-+ { }
-+};
-+MODULE_DEVICE_TABLE(of, fxos8700_of_match);
-+
-+static struct spi_driver fxos8700_spi_driver = {
-+ .probe = fxos8700_spi_probe,
-+ .id_table = fxos8700_spi_id,
-+ .driver = {
-+ .acpi_match_table = ACPI_PTR(fxos8700_acpi_match),
-+ .of_match_table = fxos8700_of_match,
-+ .name = "fxos8700_spi",
-+ },
-+};
-+module_spi_driver(fxos8700_spi_driver);
-+
-+MODULE_AUTHOR("Robert Jones <rjones@gateworks.com>");
-+MODULE_DESCRIPTION("FXOS8700 SPI driver");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/generic/backport-5.4/800-v5.5-scsi-core-Add-sysfs-attributes-for-VPD-pages-0h-and-.patch b/target/linux/generic/backport-5.4/800-v5.5-scsi-core-Add-sysfs-attributes-for-VPD-pages-0h-and-.patch
deleted file mode 100644
index 2133280e88..0000000000
--- a/target/linux/generic/backport-5.4/800-v5.5-scsi-core-Add-sysfs-attributes-for-VPD-pages-0h-and-.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From d188b0675b21d5a6ca27b3e741381813983f4719 Mon Sep 17 00:00:00 2001
-From: Ryan Attard <ryanattard@ryanattard.info>
-Date: Thu, 26 Sep 2019 11:22:17 -0500
-Subject: [PATCH] scsi: core: Add sysfs attributes for VPD pages 0h and 89h
-
-Add sysfs attributes for the ATA information page and Supported VPD Pages
-page.
-
-Link: https://lore.kernel.org/r/20190926162216.56591-1-ryanattard@ryanattard.info
-Signed-off-by: Ryan Attard <ryanattard@ryanattard.info>
-Reviewed-by: Bart Van Assche <bvanassche@acm.org>
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
----
- drivers/scsi/scsi.c | 4 ++++
- drivers/scsi/scsi_sysfs.c | 19 +++++++++++++++++++
- include/scsi/scsi_device.h | 2 ++
- 3 files changed, 25 insertions(+)
-
---- a/drivers/scsi/scsi.c
-+++ b/drivers/scsi/scsi.c
-@@ -465,10 +465,14 @@ void scsi_attach_vpd(struct scsi_device
- return;
-
- for (i = 4; i < vpd_buf->len; i++) {
-+ if (vpd_buf->data[i] == 0x0)
-+ scsi_update_vpd_page(sdev, 0x0, &sdev->vpd_pg0);
- if (vpd_buf->data[i] == 0x80)
- scsi_update_vpd_page(sdev, 0x80, &sdev->vpd_pg80);
- if (vpd_buf->data[i] == 0x83)
- scsi_update_vpd_page(sdev, 0x83, &sdev->vpd_pg83);
-+ if (vpd_buf->data[i] == 0x89)
-+ scsi_update_vpd_page(sdev, 0x89, &sdev->vpd_pg89);
- }
- kfree(vpd_buf);
- }
---- a/drivers/scsi/scsi_sysfs.c
-+++ b/drivers/scsi/scsi_sysfs.c
-@@ -437,6 +437,7 @@ static void scsi_device_dev_release_user
- struct device *parent;
- struct list_head *this, *tmp;
- struct scsi_vpd *vpd_pg80 = NULL, *vpd_pg83 = NULL;
-+ struct scsi_vpd *vpd_pg0 = NULL, *vpd_pg89 = NULL;
- unsigned long flags;
- struct module *mod;
-
-@@ -469,16 +470,24 @@ static void scsi_device_dev_release_user
- sdev->request_queue = NULL;
-
- mutex_lock(&sdev->inquiry_mutex);
-+ rcu_swap_protected(sdev->vpd_pg0, vpd_pg0,
-+ lockdep_is_held(&sdev->inquiry_mutex));
- rcu_swap_protected(sdev->vpd_pg80, vpd_pg80,
- lockdep_is_held(&sdev->inquiry_mutex));
- rcu_swap_protected(sdev->vpd_pg83, vpd_pg83,
- lockdep_is_held(&sdev->inquiry_mutex));
-+ rcu_swap_protected(sdev->vpd_pg89, vpd_pg89,
-+ lockdep_is_held(&sdev->inquiry_mutex));
- mutex_unlock(&sdev->inquiry_mutex);
-
-+ if (vpd_pg0)
-+ kfree_rcu(vpd_pg0, rcu);
- if (vpd_pg83)
- kfree_rcu(vpd_pg83, rcu);
- if (vpd_pg80)
- kfree_rcu(vpd_pg80, rcu);
-+ if (vpd_pg89)
-+ kfree_rcu(vpd_pg89, rcu);
- kfree(sdev->inquiry);
- kfree(sdev);
-
-@@ -891,6 +900,8 @@ static struct bin_attribute dev_attr_vpd
-
- sdev_vpd_pg_attr(pg83);
- sdev_vpd_pg_attr(pg80);
-+sdev_vpd_pg_attr(pg89);
-+sdev_vpd_pg_attr(pg0);
-
- static ssize_t show_inquiry(struct file *filep, struct kobject *kobj,
- struct bin_attribute *bin_attr,
-@@ -1223,12 +1234,18 @@ static umode_t scsi_sdev_bin_attr_is_vis
- struct scsi_device *sdev = to_scsi_device(dev);
-
-
-+ if (attr == &dev_attr_vpd_pg0 && !sdev->vpd_pg0)
-+ return 0;
-+
- if (attr == &dev_attr_vpd_pg80 && !sdev->vpd_pg80)
- return 0;
-
- if (attr == &dev_attr_vpd_pg83 && !sdev->vpd_pg83)
- return 0;
-
-+ if (attr == &dev_attr_vpd_pg89 && !sdev->vpd_pg89)
-+ return 0;
-+
- return S_IRUGO;
- }
-
-@@ -1271,8 +1288,10 @@ static struct attribute *scsi_sdev_attrs
- };
-
- static struct bin_attribute *scsi_sdev_bin_attrs[] = {
-+ &dev_attr_vpd_pg0,
- &dev_attr_vpd_pg83,
- &dev_attr_vpd_pg80,
-+ &dev_attr_vpd_pg89,
- &dev_attr_inquiry,
- NULL
- };
---- a/include/scsi/scsi_device.h
-+++ b/include/scsi/scsi_device.h
-@@ -140,8 +140,10 @@ struct scsi_device {
- const char * rev; /* ... "nullnullnullnull" before scan */
-
- #define SCSI_VPD_PG_LEN 255
-+ struct scsi_vpd __rcu *vpd_pg0;
- struct scsi_vpd __rcu *vpd_pg83;
- struct scsi_vpd __rcu *vpd_pg80;
-+ struct scsi_vpd __rcu *vpd_pg89;
- unsigned char current_tag; /* current tag */
- struct scsi_target *sdev_target; /* used only for single_lun */
-
diff --git a/target/linux/generic/backport-5.4/801-v5.5-hwmon-Driver-for-disk-and-solid-state-drives-with-te.patch b/target/linux/generic/backport-5.4/801-v5.5-hwmon-Driver-for-disk-and-solid-state-drives-with-te.patch
deleted file mode 100644
index 32a629772f..0000000000
--- a/target/linux/generic/backport-5.4/801-v5.5-hwmon-Driver-for-disk-and-solid-state-drives-with-te.patch
+++ /dev/null
@@ -1,737 +0,0 @@
-From 5b46903d8bf372e563bf2150d46b87fff197a109 Mon Sep 17 00:00:00 2001
-From: Guenter Roeck <linux@roeck-us.net>
-Date: Thu, 28 Nov 2019 21:34:40 -0800
-Subject: [PATCH] hwmon: Driver for disk and solid state drives with
- temperature sensors
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Reading the temperature of ATA drives has been supported for years
-by userspace tools such as smarttools or hddtemp. The downside of
-such tools is that they need to run with super-user privilege, that
-the temperatures are not reported by standard tools such as 'sensors'
-or 'libsensors', and that drive temperatures are not available for use
-in the kernel's thermal subsystem.
-
-This driver solves this problem by adding support for reading the
-temperature of ATA drives from the kernel using the hwmon API and
-by adding a temperature zone for each drive.
-
-With this driver, the hard disk temperature can be read using the
-unprivileged 'sensors' application:
-
-$ sensors drivetemp-scsi-1-0
-drivetemp-scsi-1-0
-Adapter: SCSI adapter
-temp1: +23.0°C
-
-or directly from sysfs:
-
-$ grep . /sys/class/hwmon/hwmon9/{name,temp1_input}
-/sys/class/hwmon/hwmon9/name:drivetemp
-/sys/class/hwmon/hwmon9/temp1_input:23000
-
-If the drive supports SCT transport and reports temperature limits,
-those are reported as well.
-
-drivetemp-scsi-0-0
-Adapter: SCSI adapter
-temp1: +27.0°C (low = +0.0°C, high = +60.0°C)
- (crit low = -41.0°C, crit = +85.0°C)
- (lowest = +23.0°C, highest = +34.0°C)
-
-The driver attempts to use SCT Command Transport to read the drive
-temperature. If the SCT Command Transport feature set is not available,
-or if it does not report the drive temperature, drive temperatures may
-be readable through SMART attributes. Since SMART attributes are not well
-defined, this method is only used as fallback mechanism.
-
-Cc: Chris Healy <cphealy@gmail.com>
-Cc: Linus Walleij <linus.walleij@linaro.org>
-Cc: Martin K. Petersen <martin.petersen@oracle.com>
-Cc: Bart Van Assche <bvanassche@acm.org>
-Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
-Tested-by: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: Guenter Roeck <linux@roeck-us.net>
----
- Documentation/hwmon/drivetemp.rst | 52 +++
- Documentation/hwmon/index.rst | 1 +
- drivers/hwmon/Kconfig | 10 +
- drivers/hwmon/Makefile | 1 +
- drivers/hwmon/drivetemp.c | 574 ++++++++++++++++++++++++++++++
- 5 files changed, 638 insertions(+)
- create mode 100644 Documentation/hwmon/drivetemp.rst
- create mode 100644 drivers/hwmon/drivetemp.c
-
---- /dev/null
-+++ b/Documentation/hwmon/drivetemp.rst
-@@ -0,0 +1,52 @@
-+.. SPDX-License-Identifier: GPL-2.0
-+
-+Kernel driver drivetemp
-+=======================
-+
-+
-+References
-+----------
-+
-+ANS T13/1699-D
-+Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
-+
-+ANS Project T10/BSR INCITS 513
-+Information technology - SCSI Primary Commands - 4 (SPC-4)
-+
-+ANS Project INCITS 557
-+Information technology - SCSI / ATA Translation - 5 (SAT-5)
-+
-+
-+Description
-+-----------
-+
-+This driver supports reporting the temperature of disk and solid state
-+drives with temperature sensors.
-+
-+If supported, it uses the ATA SCT Command Transport feature to read
-+the current drive temperature and, if available, temperature limits
-+as well as historic minimum and maximum temperatures. If SCT Command
-+Transport is not supported, the driver uses SMART attributes to read
-+the drive temperature.
-+
-+
-+Sysfs entries
-+-------------
-+
-+Only the temp1_input attribute is always available. Other attributes are
-+available only if reported by the drive. All temperatures are reported in
-+milli-degrees Celsius.
-+
-+======================= =====================================================
-+temp1_input Current drive temperature
-+temp1_lcrit Minimum temperature limit. Operating the device below
-+ this temperature may cause physical damage to the
-+ device.
-+temp1_min Minimum recommended continuous operating limit
-+temp1_max Maximum recommended continuous operating temperature
-+temp1_crit Maximum temperature limit. Operating the device above
-+ this temperature may cause physical damage to the
-+ device.
-+temp1_lowest Minimum temperature seen this power cycle
-+temp1_highest Maximum temperature seen this power cycle
-+======================= =====================================================
---- a/Documentation/hwmon/index.rst
-+++ b/Documentation/hwmon/index.rst
-@@ -45,6 +45,7 @@ Hardware Monitoring Kernel Drivers
- da9052
- da9055
- dme1737
-+ drivetemp
- ds1621
- ds620
- emc1403
---- a/drivers/hwmon/Kconfig
-+++ b/drivers/hwmon/Kconfig
-@@ -385,6 +385,16 @@ config SENSORS_ATXP1
- This driver can also be built as a module. If so, the module
- will be called atxp1.
-
-+config SENSORS_DRIVETEMP
-+ tristate "Hard disk drives with temperature sensors"
-+ depends on SCSI && ATA
-+ help
-+ If you say yes you get support for the temperature sensor on
-+ hard disk drives.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called satatemp.
-+
- config SENSORS_DS620
- tristate "Dallas Semiconductor DS620"
- depends on I2C
---- a/drivers/hwmon/Makefile
-+++ b/drivers/hwmon/Makefile
-@@ -56,6 +56,7 @@ obj-$(CONFIG_SENSORS_DA9052_ADC)+= da905
- obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
- obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o
- obj-$(CONFIG_SENSORS_DME1737) += dme1737.o
-+obj-$(CONFIG_SENSORS_DRIVETEMP) += drivetemp.o
- obj-$(CONFIG_SENSORS_DS620) += ds620.o
- obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
- obj-$(CONFIG_SENSORS_EMC1403) += emc1403.o
---- /dev/null
-+++ b/drivers/hwmon/drivetemp.c
-@@ -0,0 +1,574 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Hwmon client for disk and solid state drives with temperature sensors
-+ * Copyright (C) 2019 Zodiac Inflight Innovations
-+ *
-+ * With input from:
-+ * Hwmon client for S.M.A.R.T. hard disk drives with temperature sensors.
-+ * (C) 2018 Linus Walleij
-+ *
-+ * hwmon: Driver for SCSI/ATA temperature sensors
-+ * by Constantin Baranov <const@mimas.ru>, submitted September 2009
-+ *
-+ * This drive supports reporting the temperatire of SATA drives. It can be
-+ * easily extended to report the temperature of SCSI drives.
-+ *
-+ * The primary means to read drive temperatures and temperature limits
-+ * for ATA drives is the SCT Command Transport feature set as specified in
-+ * ATA8-ACS.
-+ * It can be used to read the current drive temperature, temperature limits,
-+ * and historic minimum and maximum temperatures. The SCT Command Transport
-+ * feature set is documented in "AT Attachment 8 - ATA/ATAPI Command Set
-+ * (ATA8-ACS)".
-+ *
-+ * If the SCT Command Transport feature set is not available, drive temperatures
-+ * may be readable through SMART attributes. Since SMART attributes are not well
-+ * defined, this method is only used as fallback mechanism.
-+ *
-+ * There are three SMART attributes which may report drive temperatures.
-+ * Those are defined as follows (from
-+ * http://www.cropel.com/library/smart-attribute-list.aspx).
-+ *
-+ * 190 Temperature Temperature, monitored by a sensor somewhere inside
-+ * the drive. Raw value typicaly holds the actual
-+ * temperature (hexadecimal) in its rightmost two digits.
-+ *
-+ * 194 Temperature Temperature, monitored by a sensor somewhere inside
-+ * the drive. Raw value typicaly holds the actual
-+ * temperature (hexadecimal) in its rightmost two digits.
-+ *
-+ * 231 Temperature Temperature, monitored by a sensor somewhere inside
-+ * the drive. Raw value typicaly holds the actual
-+ * temperature (hexadecimal) in its rightmost two digits.
-+ *
-+ * Wikipedia defines attributes a bit differently.
-+ *
-+ * 190 Temperature Value is equal to (100-temp. °C), allowing manufacturer
-+ * Difference or to set a minimum threshold which corresponds to a
-+ * Airflow maximum temperature. This also follows the convention of
-+ * Temperature 100 being a best-case value and lower values being
-+ * undesirable. However, some older drives may instead
-+ * report raw Temperature (identical to 0xC2) or
-+ * Temperature minus 50 here.
-+ * 194 Temperature or Indicates the device temperature, if the appropriate
-+ * Temperature sensor is fitted. Lowest byte of the raw value contains
-+ * Celsius the exact temperature value (Celsius degrees).
-+ * 231 Life Left Indicates the approximate SSD life left, in terms of
-+ * (SSDs) or program/erase cycles or available reserved blocks.
-+ * Temperature A normalized value of 100 represents a new drive, with
-+ * a threshold value at 10 indicating a need for
-+ * replacement. A value of 0 may mean that the drive is
-+ * operating in read-only mode to allow data recovery.
-+ * Previously (pre-2010) occasionally used for Drive
-+ * Temperature (more typically reported at 0xC2).
-+ *
-+ * Common denominator is that the first raw byte reports the temperature
-+ * in degrees C on almost all drives. Some drives may report a fractional
-+ * temperature in the second raw byte.
-+ *
-+ * Known exceptions (from libatasmart):
-+ * - SAMSUNG SV0412H and SAMSUNG SV1204H) report the temperature in 10th
-+ * degrees C in the first two raw bytes.
-+ * - A few Maxtor drives report an unknown or bad value in attribute 194.
-+ * - Certain Apple SSD drives report an unknown value in attribute 190.
-+ * Only certain firmware versions are affected.
-+ *
-+ * Those exceptions affect older ATA drives and are currently ignored.
-+ * Also, the second raw byte (possibly reporting the fractional temperature)
-+ * is currently ignored.
-+ *
-+ * Many drives also report temperature limits in additional SMART data raw
-+ * bytes. The format of those is not well defined and varies widely.
-+ * The driver does not currently attempt to report those limits.
-+ *
-+ * According to data in smartmontools, attribute 231 is rarely used to report
-+ * drive temperatures. At the same time, several drives report SSD life left
-+ * in attribute 231, but do not support temperature sensors. For this reason,
-+ * attribute 231 is currently ignored.
-+ *
-+ * Following above definitions, temperatures are reported as follows.
-+ * If SCT Command Transport is supported, it is used to read the
-+ * temperature and, if available, temperature limits.
-+ * - Otherwise, if SMART attribute 194 is supported, it is used to read
-+ * the temperature.
-+ * - Otherwise, if SMART attribute 190 is supported, it is used to read
-+ * the temperature.
-+ */
-+
-+#include <linux/ata.h>
-+#include <linux/bits.h>
-+#include <linux/device.h>
-+#include <linux/hwmon.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/module.h>
-+#include <linux/mutex.h>
-+#include <scsi/scsi_cmnd.h>
-+#include <scsi/scsi_device.h>
-+#include <scsi/scsi_driver.h>
-+#include <scsi/scsi_proto.h>
-+
-+struct drivetemp_data {
-+ struct list_head list; /* list of instantiated devices */
-+ struct mutex lock; /* protect data buffer accesses */
-+ struct scsi_device *sdev; /* SCSI device */
-+ struct device *dev; /* instantiating device */
-+ struct device *hwdev; /* hardware monitoring device */
-+ u8 smartdata[ATA_SECT_SIZE]; /* local buffer */
-+ int (*get_temp)(struct drivetemp_data *st, u32 attr, long *val);
-+ bool have_temp_lowest; /* lowest temp in SCT status */
-+ bool have_temp_highest; /* highest temp in SCT status */
-+ bool have_temp_min; /* have min temp */
-+ bool have_temp_max; /* have max temp */
-+ bool have_temp_lcrit; /* have lower critical limit */
-+ bool have_temp_crit; /* have critical limit */
-+ int temp_min; /* min temp */
-+ int temp_max; /* max temp */
-+ int temp_lcrit; /* lower critical limit */
-+ int temp_crit; /* critical limit */
-+};
-+
-+static LIST_HEAD(drivetemp_devlist);
-+
-+#define ATA_MAX_SMART_ATTRS 30
-+#define SMART_TEMP_PROP_190 190
-+#define SMART_TEMP_PROP_194 194
-+
-+#define SCT_STATUS_REQ_ADDR 0xe0
-+#define SCT_STATUS_VERSION_LOW 0 /* log byte offsets */
-+#define SCT_STATUS_VERSION_HIGH 1
-+#define SCT_STATUS_TEMP 200
-+#define SCT_STATUS_TEMP_LOWEST 201
-+#define SCT_STATUS_TEMP_HIGHEST 202
-+#define SCT_READ_LOG_ADDR 0xe1
-+#define SMART_READ_LOG 0xd5
-+#define SMART_WRITE_LOG 0xd6
-+
-+#define INVALID_TEMP 0x80
-+
-+#define temp_is_valid(temp) ((temp) != INVALID_TEMP)
-+#define temp_from_sct(temp) (((s8)(temp)) * 1000)
-+
-+static inline bool ata_id_smart_supported(u16 *id)
-+{
-+ return id[ATA_ID_COMMAND_SET_1] & BIT(0);
-+}
-+
-+static inline bool ata_id_smart_enabled(u16 *id)
-+{
-+ return id[ATA_ID_CFS_ENABLE_1] & BIT(0);
-+}
-+
-+static int drivetemp_scsi_command(struct drivetemp_data *st,
-+ u8 ata_command, u8 feature,
-+ u8 lba_low, u8 lba_mid, u8 lba_high)
-+{
-+ u8 scsi_cmd[MAX_COMMAND_SIZE];
-+ int data_dir;
-+
-+ memset(scsi_cmd, 0, sizeof(scsi_cmd));
-+ scsi_cmd[0] = ATA_16;
-+ if (ata_command == ATA_CMD_SMART && feature == SMART_WRITE_LOG) {
-+ scsi_cmd[1] = (5 << 1); /* PIO Data-out */
-+ /*
-+ * No off.line or cc, write to dev, block count in sector count
-+ * field.
-+ */
-+ scsi_cmd[2] = 0x06;
-+ data_dir = DMA_TO_DEVICE;
-+ } else {
-+ scsi_cmd[1] = (4 << 1); /* PIO Data-in */
-+ /*
-+ * No off.line or cc, read from dev, block count in sector count
-+ * field.
-+ */
-+ scsi_cmd[2] = 0x0e;
-+ data_dir = DMA_FROM_DEVICE;
-+ }
-+ scsi_cmd[4] = feature;
-+ scsi_cmd[6] = 1; /* 1 sector */
-+ scsi_cmd[8] = lba_low;
-+ scsi_cmd[10] = lba_mid;
-+ scsi_cmd[12] = lba_high;
-+ scsi_cmd[14] = ata_command;
-+
-+ return scsi_execute_req(st->sdev, scsi_cmd, data_dir,
-+ st->smartdata, ATA_SECT_SIZE, NULL, HZ, 5,
-+ NULL);
-+}
-+
-+static int drivetemp_ata_command(struct drivetemp_data *st, u8 feature,
-+ u8 select)
-+{
-+ return drivetemp_scsi_command(st, ATA_CMD_SMART, feature, select,
-+ ATA_SMART_LBAM_PASS, ATA_SMART_LBAH_PASS);
-+}
-+
-+static int drivetemp_get_smarttemp(struct drivetemp_data *st, u32 attr,
-+ long *temp)
-+{
-+ u8 *buf = st->smartdata;
-+ bool have_temp = false;
-+ u8 temp_raw;
-+ u8 csum;
-+ int err;
-+ int i;
-+
-+ err = drivetemp_ata_command(st, ATA_SMART_READ_VALUES, 0);
-+ if (err)
-+ return err;
-+
-+ /* Checksum the read value table */
-+ csum = 0;
-+ for (i = 0; i < ATA_SECT_SIZE; i++)
-+ csum += buf[i];
-+ if (csum) {
-+ dev_dbg(&st->sdev->sdev_gendev,
-+ "checksum error reading SMART values\n");
-+ return -EIO;
-+ }
-+
-+ for (i = 0; i < ATA_MAX_SMART_ATTRS; i++) {
-+ u8 *attr = buf + i * 12;
-+ int id = attr[2];
-+
-+ if (!id)
-+ continue;
-+
-+ if (id == SMART_TEMP_PROP_190) {
-+ temp_raw = attr[7];
-+ have_temp = true;
-+ }
-+ if (id == SMART_TEMP_PROP_194) {
-+ temp_raw = attr[7];
-+ have_temp = true;
-+ break;
-+ }
-+ }
-+
-+ if (have_temp) {
-+ *temp = temp_raw * 1000;
-+ return 0;
-+ }
-+
-+ return -ENXIO;
-+}
-+
-+static int drivetemp_get_scttemp(struct drivetemp_data *st, u32 attr, long *val)
-+{
-+ u8 *buf = st->smartdata;
-+ int err;
-+
-+ err = drivetemp_ata_command(st, SMART_READ_LOG, SCT_STATUS_REQ_ADDR);
-+ if (err)
-+ return err;
-+ switch (attr) {
-+ case hwmon_temp_input:
-+ *val = temp_from_sct(buf[SCT_STATUS_TEMP]);
-+ break;
-+ case hwmon_temp_lowest:
-+ *val = temp_from_sct(buf[SCT_STATUS_TEMP_LOWEST]);
-+ break;
-+ case hwmon_temp_highest:
-+ *val = temp_from_sct(buf[SCT_STATUS_TEMP_HIGHEST]);
-+ break;
-+ default:
-+ err = -EINVAL;
-+ break;
-+ }
-+ return err;
-+}
-+
-+static int drivetemp_identify_sata(struct drivetemp_data *st)
-+{
-+ struct scsi_device *sdev = st->sdev;
-+ u8 *buf = st->smartdata;
-+ struct scsi_vpd *vpd;
-+ bool is_ata, is_sata;
-+ bool have_sct_data_table;
-+ bool have_sct_temp;
-+ bool have_smart;
-+ bool have_sct;
-+ u16 *ata_id;
-+ u16 version;
-+ long temp;
-+ int err;
-+
-+ /* SCSI-ATA Translation present? */
-+ rcu_read_lock();
-+ vpd = rcu_dereference(sdev->vpd_pg89);
-+
-+ /*
-+ * Verify that ATA IDENTIFY DEVICE data is included in ATA Information
-+ * VPD and that the drive implements the SATA protocol.
-+ */
-+ if (!vpd || vpd->len < 572 || vpd->data[56] != ATA_CMD_ID_ATA ||
-+ vpd->data[36] != 0x34) {
-+ rcu_read_unlock();
-+ return -ENODEV;
-+ }
-+ ata_id = (u16 *)&vpd->data[60];
-+ is_ata = ata_id_is_ata(ata_id);
-+ is_sata = ata_id_is_sata(ata_id);
-+ have_sct = ata_id_sct_supported(ata_id);
-+ have_sct_data_table = ata_id_sct_data_tables(ata_id);
-+ have_smart = ata_id_smart_supported(ata_id) &&
-+ ata_id_smart_enabled(ata_id);
-+
-+ rcu_read_unlock();
-+
-+ /* bail out if this is not a SATA device */
-+ if (!is_ata || !is_sata)
-+ return -ENODEV;
-+ if (!have_sct)
-+ goto skip_sct;
-+
-+ err = drivetemp_ata_command(st, SMART_READ_LOG, SCT_STATUS_REQ_ADDR);
-+ if (err)
-+ goto skip_sct;
-+
-+ version = (buf[SCT_STATUS_VERSION_HIGH] << 8) |
-+ buf[SCT_STATUS_VERSION_LOW];
-+ if (version != 2 && version != 3)
-+ goto skip_sct;
-+
-+ have_sct_temp = temp_is_valid(buf[SCT_STATUS_TEMP]);
-+ if (!have_sct_temp)
-+ goto skip_sct;
-+
-+ st->have_temp_lowest = temp_is_valid(buf[SCT_STATUS_TEMP_LOWEST]);
-+ st->have_temp_highest = temp_is_valid(buf[SCT_STATUS_TEMP_HIGHEST]);
-+
-+ if (!have_sct_data_table)
-+ goto skip_sct;
-+
-+ /* Request and read temperature history table */
-+ memset(buf, '\0', sizeof(st->smartdata));
-+ buf[0] = 5; /* data table command */
-+ buf[2] = 1; /* read table */
-+ buf[4] = 2; /* temperature history table */
-+
-+ err = drivetemp_ata_command(st, SMART_WRITE_LOG, SCT_STATUS_REQ_ADDR);
-+ if (err)
-+ goto skip_sct_data;
-+
-+ err = drivetemp_ata_command(st, SMART_READ_LOG, SCT_READ_LOG_ADDR);
-+ if (err)
-+ goto skip_sct_data;
-+
-+ /*
-+ * Temperature limits per AT Attachment 8 -
-+ * ATA/ATAPI Command Set (ATA8-ACS)
-+ */
-+ st->have_temp_max = temp_is_valid(buf[6]);
-+ st->have_temp_crit = temp_is_valid(buf[7]);
-+ st->have_temp_min = temp_is_valid(buf[8]);
-+ st->have_temp_lcrit = temp_is_valid(buf[9]);
-+
-+ st->temp_max = temp_from_sct(buf[6]);
-+ st->temp_crit = temp_from_sct(buf[7]);
-+ st->temp_min = temp_from_sct(buf[8]);
-+ st->temp_lcrit = temp_from_sct(buf[9]);
-+
-+skip_sct_data:
-+ if (have_sct_temp) {
-+ st->get_temp = drivetemp_get_scttemp;
-+ return 0;
-+ }
-+skip_sct:
-+ if (!have_smart)
-+ return -ENODEV;
-+ st->get_temp = drivetemp_get_smarttemp;
-+ return drivetemp_get_smarttemp(st, hwmon_temp_input, &temp);
-+}
-+
-+static int drivetemp_identify(struct drivetemp_data *st)
-+{
-+ struct scsi_device *sdev = st->sdev;
-+
-+ /* Bail out immediately if there is no inquiry data */
-+ if (!sdev->inquiry || sdev->inquiry_len < 16)
-+ return -ENODEV;
-+
-+ /* Disk device? */
-+ if (sdev->type != TYPE_DISK && sdev->type != TYPE_ZBC)
-+ return -ENODEV;
-+
-+ return drivetemp_identify_sata(st);
-+}
-+
-+static int drivetemp_read(struct device *dev, enum hwmon_sensor_types type,
-+ u32 attr, int channel, long *val)
-+{
-+ struct drivetemp_data *st = dev_get_drvdata(dev);
-+ int err = 0;
-+
-+ if (type != hwmon_temp)
-+ return -EINVAL;
-+
-+ switch (attr) {
-+ case hwmon_temp_input:
-+ case hwmon_temp_lowest:
-+ case hwmon_temp_highest:
-+ mutex_lock(&st->lock);
-+ err = st->get_temp(st, attr, val);
-+ mutex_unlock(&st->lock);
-+ break;
-+ case hwmon_temp_lcrit:
-+ *val = st->temp_lcrit;
-+ break;
-+ case hwmon_temp_min:
-+ *val = st->temp_min;
-+ break;
-+ case hwmon_temp_max:
-+ *val = st->temp_max;
-+ break;
-+ case hwmon_temp_crit:
-+ *val = st->temp_crit;
-+ break;
-+ default:
-+ err = -EINVAL;
-+ break;
-+ }
-+ return err;
-+}
-+
-+static umode_t drivetemp_is_visible(const void *data,
-+ enum hwmon_sensor_types type,
-+ u32 attr, int channel)
-+{
-+ const struct drivetemp_data *st = data;
-+
-+ switch (type) {
-+ case hwmon_temp:
-+ switch (attr) {
-+ case hwmon_temp_input:
-+ return 0444;
-+ case hwmon_temp_lowest:
-+ if (st->have_temp_lowest)
-+ return 0444;
-+ break;
-+ case hwmon_temp_highest:
-+ if (st->have_temp_highest)
-+ return 0444;
-+ break;
-+ case hwmon_temp_min:
-+ if (st->have_temp_min)
-+ return 0444;
-+ break;
-+ case hwmon_temp_max:
-+ if (st->have_temp_max)
-+ return 0444;
-+ break;
-+ case hwmon_temp_lcrit:
-+ if (st->have_temp_lcrit)
-+ return 0444;
-+ break;
-+ case hwmon_temp_crit:
-+ if (st->have_temp_crit)
-+ return 0444;
-+ break;
-+ default:
-+ break;
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+ return 0;
-+}
-+
-+static const struct hwmon_channel_info *drivetemp_info[] = {
-+ HWMON_CHANNEL_INFO(chip,
-+ HWMON_C_REGISTER_TZ),
-+ HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT |
-+ HWMON_T_LOWEST | HWMON_T_HIGHEST |
-+ HWMON_T_MIN | HWMON_T_MAX |
-+ HWMON_T_LCRIT | HWMON_T_CRIT),
-+ NULL
-+};
-+
-+static const struct hwmon_ops drivetemp_ops = {
-+ .is_visible = drivetemp_is_visible,
-+ .read = drivetemp_read,
-+};
-+
-+static const struct hwmon_chip_info drivetemp_chip_info = {
-+ .ops = &drivetemp_ops,
-+ .info = drivetemp_info,
-+};
-+
-+/*
-+ * The device argument points to sdev->sdev_dev. Its parent is
-+ * sdev->sdev_gendev, which we can use to get the scsi_device pointer.
-+ */
-+static int drivetemp_add(struct device *dev, struct class_interface *intf)
-+{
-+ struct scsi_device *sdev = to_scsi_device(dev->parent);
-+ struct drivetemp_data *st;
-+ int err;
-+
-+ st = kzalloc(sizeof(*st), GFP_KERNEL);
-+ if (!st)
-+ return -ENOMEM;
-+
-+ st->sdev = sdev;
-+ st->dev = dev;
-+ mutex_init(&st->lock);
-+
-+ if (drivetemp_identify(st)) {
-+ err = -ENODEV;
-+ goto abort;
-+ }
-+
-+ st->hwdev = hwmon_device_register_with_info(dev->parent, "drivetemp",
-+ st, &drivetemp_chip_info,
-+ NULL);
-+ if (IS_ERR(st->hwdev)) {
-+ err = PTR_ERR(st->hwdev);
-+ goto abort;
-+ }
-+
-+ list_add(&st->list, &drivetemp_devlist);
-+ return 0;
-+
-+abort:
-+ kfree(st);
-+ return err;
-+}
-+
-+static void drivetemp_remove(struct device *dev, struct class_interface *intf)
-+{
-+ struct drivetemp_data *st, *tmp;
-+
-+ list_for_each_entry_safe(st, tmp, &drivetemp_devlist, list) {
-+ if (st->dev == dev) {
-+ list_del(&st->list);
-+ hwmon_device_unregister(st->hwdev);
-+ kfree(st);
-+ break;
-+ }
-+ }
-+}
-+
-+static struct class_interface drivetemp_interface = {
-+ .add_dev = drivetemp_add,
-+ .remove_dev = drivetemp_remove,
-+};
-+
-+static int __init drivetemp_init(void)
-+{
-+ return scsi_register_interface(&drivetemp_interface);
-+}
-+
-+static void __exit drivetemp_exit(void)
-+{
-+ scsi_unregister_interface(&drivetemp_interface);
-+}
-+
-+module_init(drivetemp_init);
-+module_exit(drivetemp_exit);
-+
-+MODULE_AUTHOR("Guenter Roeck <linus@roeck-us.net>");
-+MODULE_DESCRIPTION("Hard drive temperature monitor");
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/backport-5.4/801-v5.6-leds-populate-the-device-s-of_node.patch b/target/linux/generic/backport-5.4/801-v5.6-leds-populate-the-device-s-of_node.patch
deleted file mode 100644
index 5c3b58c436..0000000000
--- a/target/linux/generic/backport-5.4/801-v5.6-leds-populate-the-device-s-of_node.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 7a349e8c535d7327bf80710323c725df47149b8d Mon Sep 17 00:00:00 2001
-From: Jean-Jacques Hiblot <jjhiblot@ti.com>
-Date: Sun, 5 Jan 2020 23:31:14 +0100
-Subject: [PATCH] leds: populate the device's of_node
-
-If initialization data is available and its fwnode is actually a
-of_node, store this information in the led device's structure. This
-will allow the device to use or provide OF-based API such (devm_xxx).
-
-Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
-Signed-off-by: Pavel Machek <pavel@ucw.cz>
-[backport to 5.4]
----
-
---- a/drivers/leds/led-class.c
-+++ b/drivers/leds/led-class.c
-@@ -19,6 +19,7 @@
- #include <linux/spinlock.h>
- #include <linux/timer.h>
- #include <uapi/linux/uleds.h>
-+#include <linux/of.h>
- #include "leds.h"
-
- static struct class *leds_class;
-@@ -277,8 +278,10 @@ int led_classdev_register_ext(struct dev
- mutex_unlock(&led_cdev->led_access);
- return PTR_ERR(led_cdev->dev);
- }
-- if (init_data && init_data->fwnode)
-+ if (init_data && init_data->fwnode) {
- led_cdev->dev->fwnode = init_data->fwnode;
-+ led_cdev->dev->of_node = to_of_node(init_data->fwnode);
-+ }
-
- if (ret)
- dev_warn(parent, "Led %s renamed to %s due to name collision",
diff --git a/target/linux/generic/backport-5.4/803-v5.8-i2c-pxa-use-official-address-byte-helper.patch b/target/linux/generic/backport-5.4/803-v5.8-i2c-pxa-use-official-address-byte-helper.patch
deleted file mode 100644
index a937b52d9d..0000000000
--- a/target/linux/generic/backport-5.4/803-v5.8-i2c-pxa-use-official-address-byte-helper.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 01/17] i2c: pxa: use official address byte helper
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-i2c-pxa was created before i2c_8bit_addr_from_msg() was implemented,
-and used its own i2c_pxa_addr_byte() which is functionally the same.
-Sadly, it was never updated to use this new helper. Switch it over.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 21 +++++++--------------
- 1 file changed, 7 insertions(+), 14 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -674,16 +674,6 @@ static void i2c_pxa_slave_stop(struct px
- * PXA I2C Master mode
- */
-
--static inline unsigned int i2c_pxa_addr_byte(struct i2c_msg *msg)
--{
-- unsigned int addr = (msg->addr & 0x7f) << 1;
--
-- if (msg->flags & I2C_M_RD)
-- addr |= 1;
--
-- return addr;
--}
--
- static inline void i2c_pxa_start_message(struct pxa_i2c *i2c)
- {
- u32 icr;
-@@ -691,8 +681,8 @@ static inline void i2c_pxa_start_message
- /*
- * Step 1: target slave address into IDBR
- */
-- writel(i2c_pxa_addr_byte(i2c->msg), _IDBR(i2c));
-- i2c->req_slave_addr = i2c_pxa_addr_byte(i2c->msg);
-+ i2c->req_slave_addr = i2c_8bit_addr_from_msg(i2c->msg);
-+ writel(i2c->req_slave_addr, _IDBR(i2c));
-
- /*
- * Step 2: initiate the write.
-@@ -1003,8 +993,8 @@ static void i2c_pxa_irq_txempty(struct p
- /*
- * Write the next address.
- */
-- writel(i2c_pxa_addr_byte(i2c->msg), _IDBR(i2c));
-- i2c->req_slave_addr = i2c_pxa_addr_byte(i2c->msg);
-+ i2c->req_slave_addr = i2c_8bit_addr_from_msg(i2c->msg);
-+ writel(i2c->req_slave_addr, _IDBR(i2c));
-
- /*
- * And trigger a repeated start, and send the byte.
diff --git a/target/linux/generic/backport-5.4/804-v5.8-i2c-pxa-remove-unneeded-includes.patch b/target/linux/generic/backport-5.4/804-v5.8-i2c-pxa-remove-unneeded-includes.patch
deleted file mode 100644
index 6a911325dd..0000000000
--- a/target/linux/generic/backport-5.4/804-v5.8-i2c-pxa-remove-unneeded-includes.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 02/17] i2c: pxa: remove unneeded includes
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-i2c-pxa does not need linux/sched.h nor linux/time.h includes, so
-remove these.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 4 ----
- 1 file changed, 4 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -20,8 +20,6 @@
- #include <linux/module.h>
- #include <linux/i2c.h>
- #include <linux/init.h>
--#include <linux/time.h>
--#include <linux/sched.h>
- #include <linux/delay.h>
- #include <linux/errno.h>
- #include <linux/interrupt.h>
-@@ -35,8 +33,6 @@
- #include <linux/io.h>
- #include <linux/platform_data/i2c-pxa.h>
-
--#include <asm/irq.h>
--
- struct pxa_reg_layout {
- u32 ibmr;
- u32 idbr;
diff --git a/target/linux/generic/backport-5.4/805-v5.8-i2c-pxa-re-arrange-includes-to-be-in-alphabetical-or.patch b/target/linux/generic/backport-5.4/805-v5.8-i2c-pxa-re-arrange-includes-to-be-in-alphabetical-or.patch
deleted file mode 100644
index 4d6dc7f071..0000000000
--- a/target/linux/generic/backport-5.4/805-v5.8-i2c-pxa-re-arrange-includes-to-be-in-alphabetical-or.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 03/17] i2c: pxa: re-arrange includes to be in alphabetical
- order
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Arrange the includes to be in alphabetical order to help avoid
-duplicated includes.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -16,22 +16,22 @@
- * Dec 2004: Added support for PXA27x and slave device probing [Liam Girdwood]
- * Feb 2005: Rework slave mode handling [RMK]
- */
--#include <linux/kernel.h>
--#include <linux/module.h>
--#include <linux/i2c.h>
--#include <linux/init.h>
-+#include <linux/clk.h>
- #include <linux/delay.h>
-+#include <linux/err.h>
- #include <linux/errno.h>
--#include <linux/interrupt.h>
-+#include <linux/i2c.h>
- #include <linux/i2c-pxa.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
- #include <linux/of.h>
- #include <linux/of_device.h>
- #include <linux/platform_device.h>
--#include <linux/err.h>
--#include <linux/clk.h>
--#include <linux/slab.h>
--#include <linux/io.h>
- #include <linux/platform_data/i2c-pxa.h>
-+#include <linux/slab.h>
-
- struct pxa_reg_layout {
- u32 ibmr;
diff --git a/target/linux/generic/backport-5.4/806-v5.8-i2c-pxa-re-arrange-functions-to-flow-better.patch b/target/linux/generic/backport-5.4/806-v5.8-i2c-pxa-re-arrange-functions-to-flow-better.patch
deleted file mode 100644
index 9f09f9dacb..0000000000
--- a/target/linux/generic/backport-5.4/806-v5.8-i2c-pxa-re-arrange-functions-to-flow-better.patch
+++ /dev/null
@@ -1,380 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 04/17] i2c: pxa: re-arrange functions to flow better
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Re-arrange the PXA I2C code to avoid forward declarations, and keep
-similar functionality (e.g. the non-IRQ mode support) together. This
-improves code readability.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 325 +++++++++++++++++------------------
- 1 file changed, 162 insertions(+), 163 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -326,7 +326,6 @@ static void i2c_pxa_scream_blue_murder(s
- #endif /* ifdef DEBUG / else */
-
- static void i2c_pxa_master_complete(struct pxa_i2c *i2c, int ret);
--static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id);
-
- static inline int i2c_pxa_is_slavemode(struct pxa_i2c *i2c)
- {
-@@ -697,34 +696,6 @@ static inline void i2c_pxa_stop_message(
- writel(icr, _ICR(i2c));
- }
-
--static int i2c_pxa_pio_set_master(struct pxa_i2c *i2c)
--{
-- /* make timeout the same as for interrupt based functions */
-- long timeout = 2 * DEF_TIMEOUT;
--
-- /*
-- * Wait for the bus to become free.
-- */
-- while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
-- udelay(1000);
-- show_state(i2c);
-- }
--
-- if (timeout < 0) {
-- show_state(i2c);
-- dev_err(&i2c->adap.dev,
-- "i2c_pxa: timeout waiting for bus free\n");
-- return I2C_RETRY;
-- }
--
-- /*
-- * Set master mode.
-- */
-- writel(readl(_ICR(i2c)) | ICR_SCLE, _ICR(i2c));
--
-- return 0;
--}
--
- /*
- * PXA I2C send master code
- * 1. Load master code to IDBR and send it.
-@@ -753,140 +724,6 @@ static int i2c_pxa_send_mastercode(struc
- return (timeout == 0) ? I2C_RETRY : 0;
- }
-
--static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
-- struct i2c_msg *msg, int num)
--{
-- unsigned long timeout = 500000; /* 5 seconds */
-- int ret = 0;
--
-- ret = i2c_pxa_pio_set_master(i2c);
-- if (ret)
-- goto out;
--
-- i2c->msg = msg;
-- i2c->msg_num = num;
-- i2c->msg_idx = 0;
-- i2c->msg_ptr = 0;
-- i2c->irqlogidx = 0;
--
-- i2c_pxa_start_message(i2c);
--
-- while (i2c->msg_num > 0 && --timeout) {
-- i2c_pxa_handler(0, i2c);
-- udelay(10);
-- }
--
-- i2c_pxa_stop_message(i2c);
--
-- /*
-- * We place the return code in i2c->msg_idx.
-- */
-- ret = i2c->msg_idx;
--
--out:
-- if (timeout == 0) {
-- i2c_pxa_scream_blue_murder(i2c, "timeout");
-- ret = I2C_RETRY;
-- }
--
-- return ret;
--}
--
--/*
-- * We are protected by the adapter bus mutex.
-- */
--static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num)
--{
-- long timeout;
-- int ret;
--
-- /*
-- * Wait for the bus to become free.
-- */
-- ret = i2c_pxa_wait_bus_not_busy(i2c);
-- if (ret) {
-- dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n");
-- goto out;
-- }
--
-- /*
-- * Set master mode.
-- */
-- ret = i2c_pxa_set_master(i2c);
-- if (ret) {
-- dev_err(&i2c->adap.dev, "i2c_pxa_set_master: error %d\n", ret);
-- goto out;
-- }
--
-- if (i2c->high_mode) {
-- ret = i2c_pxa_send_mastercode(i2c);
-- if (ret) {
-- dev_err(&i2c->adap.dev, "i2c_pxa_send_mastercode timeout\n");
-- goto out;
-- }
-- }
--
-- spin_lock_irq(&i2c->lock);
--
-- i2c->msg = msg;
-- i2c->msg_num = num;
-- i2c->msg_idx = 0;
-- i2c->msg_ptr = 0;
-- i2c->irqlogidx = 0;
--
-- i2c_pxa_start_message(i2c);
--
-- spin_unlock_irq(&i2c->lock);
--
-- /*
-- * The rest of the processing occurs in the interrupt handler.
-- */
-- timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);
-- i2c_pxa_stop_message(i2c);
--
-- /*
-- * We place the return code in i2c->msg_idx.
-- */
-- ret = i2c->msg_idx;
--
-- if (!timeout && i2c->msg_num) {
-- i2c_pxa_scream_blue_murder(i2c, "timeout");
-- ret = I2C_RETRY;
-- }
--
-- out:
-- return ret;
--}
--
--static int i2c_pxa_pio_xfer(struct i2c_adapter *adap,
-- struct i2c_msg msgs[], int num)
--{
-- struct pxa_i2c *i2c = adap->algo_data;
-- int ret, i;
--
-- /* If the I2C controller is disabled we need to reset it
-- (probably due to a suspend/resume destroying state). We do
-- this here as we can then avoid worrying about resuming the
-- controller before its users. */
-- if (!(readl(_ICR(i2c)) & ICR_IUE))
-- i2c_pxa_reset(i2c);
--
-- for (i = adap->retries; i >= 0; i--) {
-- ret = i2c_pxa_do_pio_xfer(i2c, msgs, num);
-- if (ret != I2C_RETRY)
-- goto out;
--
-- if (i2c_debug)
-- dev_dbg(&adap->dev, "Retrying transmission\n");
-- udelay(100);
-- }
-- i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
-- ret = -EREMOTEIO;
-- out:
-- i2c_pxa_set_slave(i2c, ret);
-- return ret;
--}
--
- /*
- * i2c_pxa_master_complete - complete the message and wake up.
- */
-@@ -1093,6 +930,71 @@ static irqreturn_t i2c_pxa_handler(int t
- return IRQ_HANDLED;
- }
-
-+/*
-+ * We are protected by the adapter bus mutex.
-+ */
-+static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num)
-+{
-+ long timeout;
-+ int ret;
-+
-+ /*
-+ * Wait for the bus to become free.
-+ */
-+ ret = i2c_pxa_wait_bus_not_busy(i2c);
-+ if (ret) {
-+ dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n");
-+ goto out;
-+ }
-+
-+ /*
-+ * Set master mode.
-+ */
-+ ret = i2c_pxa_set_master(i2c);
-+ if (ret) {
-+ dev_err(&i2c->adap.dev, "i2c_pxa_set_master: error %d\n", ret);
-+ goto out;
-+ }
-+
-+ if (i2c->high_mode) {
-+ ret = i2c_pxa_send_mastercode(i2c);
-+ if (ret) {
-+ dev_err(&i2c->adap.dev, "i2c_pxa_send_mastercode timeout\n");
-+ goto out;
-+ }
-+ }
-+
-+ spin_lock_irq(&i2c->lock);
-+
-+ i2c->msg = msg;
-+ i2c->msg_num = num;
-+ i2c->msg_idx = 0;
-+ i2c->msg_ptr = 0;
-+ i2c->irqlogidx = 0;
-+
-+ i2c_pxa_start_message(i2c);
-+
-+ spin_unlock_irq(&i2c->lock);
-+
-+ /*
-+ * The rest of the processing occurs in the interrupt handler.
-+ */
-+ timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);
-+ i2c_pxa_stop_message(i2c);
-+
-+ /*
-+ * We place the return code in i2c->msg_idx.
-+ */
-+ ret = i2c->msg_idx;
-+
-+ if (!timeout && i2c->msg_num) {
-+ i2c_pxa_scream_blue_murder(i2c, "timeout");
-+ ret = I2C_RETRY;
-+ }
-+
-+ out:
-+ return ret;
-+}
-
- static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
- {
-@@ -1126,6 +1028,103 @@ static const struct i2c_algorithm i2c_px
- .functionality = i2c_pxa_functionality,
- };
-
-+/* Non-interrupt mode support */
-+static int i2c_pxa_pio_set_master(struct pxa_i2c *i2c)
-+{
-+ /* make timeout the same as for interrupt based functions */
-+ long timeout = 2 * DEF_TIMEOUT;
-+
-+ /*
-+ * Wait for the bus to become free.
-+ */
-+ while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
-+ udelay(1000);
-+ show_state(i2c);
-+ }
-+
-+ if (timeout < 0) {
-+ show_state(i2c);
-+ dev_err(&i2c->adap.dev,
-+ "i2c_pxa: timeout waiting for bus free\n");
-+ return I2C_RETRY;
-+ }
-+
-+ /*
-+ * Set master mode.
-+ */
-+ writel(readl(_ICR(i2c)) | ICR_SCLE, _ICR(i2c));
-+
-+ return 0;
-+}
-+
-+static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
-+ struct i2c_msg *msg, int num)
-+{
-+ unsigned long timeout = 500000; /* 5 seconds */
-+ int ret = 0;
-+
-+ ret = i2c_pxa_pio_set_master(i2c);
-+ if (ret)
-+ goto out;
-+
-+ i2c->msg = msg;
-+ i2c->msg_num = num;
-+ i2c->msg_idx = 0;
-+ i2c->msg_ptr = 0;
-+ i2c->irqlogidx = 0;
-+
-+ i2c_pxa_start_message(i2c);
-+
-+ while (i2c->msg_num > 0 && --timeout) {
-+ i2c_pxa_handler(0, i2c);
-+ udelay(10);
-+ }
-+
-+ i2c_pxa_stop_message(i2c);
-+
-+ /*
-+ * We place the return code in i2c->msg_idx.
-+ */
-+ ret = i2c->msg_idx;
-+
-+out:
-+ if (timeout == 0) {
-+ i2c_pxa_scream_blue_murder(i2c, "timeout");
-+ ret = I2C_RETRY;
-+ }
-+
-+ return ret;
-+}
-+
-+static int i2c_pxa_pio_xfer(struct i2c_adapter *adap,
-+ struct i2c_msg msgs[], int num)
-+{
-+ struct pxa_i2c *i2c = adap->algo_data;
-+ int ret, i;
-+
-+ /* If the I2C controller is disabled we need to reset it
-+ (probably due to a suspend/resume destroying state). We do
-+ this here as we can then avoid worrying about resuming the
-+ controller before its users. */
-+ if (!(readl(_ICR(i2c)) & ICR_IUE))
-+ i2c_pxa_reset(i2c);
-+
-+ for (i = adap->retries; i >= 0; i--) {
-+ ret = i2c_pxa_do_pio_xfer(i2c, msgs, num);
-+ if (ret != I2C_RETRY)
-+ goto out;
-+
-+ if (i2c_debug)
-+ dev_dbg(&adap->dev, "Retrying transmission\n");
-+ udelay(100);
-+ }
-+ i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
-+ ret = -EREMOTEIO;
-+ out:
-+ i2c_pxa_set_slave(i2c, ret);
-+ return ret;
-+}
-+
- static const struct i2c_algorithm i2c_pxa_pio_algorithm = {
- .master_xfer = i2c_pxa_pio_xfer,
- .functionality = i2c_pxa_functionality,
diff --git a/target/linux/generic/backport-5.4/807-v5.8-i2c-pxa-re-arrange-register-field-definitions.patch b/target/linux/generic/backport-5.4/807-v5.8-i2c-pxa-re-arrange-register-field-definitions.patch
deleted file mode 100644
index afade04877..0000000000
--- a/target/linux/generic/backport-5.4/807-v5.8-i2c-pxa-re-arrange-register-field-definitions.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 05/17] i2c: pxa: re-arrange register field definitions
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Arrange the register field definitions to be grouped together, rather
-than the Armada-3700 definitions being separated from the rest of the
-definitions.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 113 ++++++++++++++++-------------------
- 1 file changed, 53 insertions(+), 60 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -33,6 +33,56 @@
- #include <linux/platform_data/i2c-pxa.h>
- #include <linux/slab.h>
-
-+/* I2C register field definitions */
-+#define ICR_START (1 << 0) /* start bit */
-+#define ICR_STOP (1 << 1) /* stop bit */
-+#define ICR_ACKNAK (1 << 2) /* send ACK(0) or NAK(1) */
-+#define ICR_TB (1 << 3) /* transfer byte bit */
-+#define ICR_MA (1 << 4) /* master abort */
-+#define ICR_SCLE (1 << 5) /* master clock enable */
-+#define ICR_IUE (1 << 6) /* unit enable */
-+#define ICR_GCD (1 << 7) /* general call disable */
-+#define ICR_ITEIE (1 << 8) /* enable tx interrupts */
-+#define ICR_IRFIE (1 << 9) /* enable rx interrupts */
-+#define ICR_BEIE (1 << 10) /* enable bus error ints */
-+#define ICR_SSDIE (1 << 11) /* slave STOP detected int enable */
-+#define ICR_ALDIE (1 << 12) /* enable arbitration interrupt */
-+#define ICR_SADIE (1 << 13) /* slave address detected int enable */
-+#define ICR_UR (1 << 14) /* unit reset */
-+#define ICR_FM (1 << 15) /* fast mode */
-+#define ICR_HS (1 << 16) /* High Speed mode */
-+#define ICR_A3700_FM (1 << 16) /* fast mode for armada-3700 */
-+#define ICR_A3700_HS (1 << 17) /* high speed mode for armada-3700 */
-+#define ICR_GPIOEN (1 << 19) /* enable GPIO mode for SCL in HS */
-+
-+#define ISR_RWM (1 << 0) /* read/write mode */
-+#define ISR_ACKNAK (1 << 1) /* ack/nak status */
-+#define ISR_UB (1 << 2) /* unit busy */
-+#define ISR_IBB (1 << 3) /* bus busy */
-+#define ISR_SSD (1 << 4) /* slave stop detected */
-+#define ISR_ALD (1 << 5) /* arbitration loss detected */
-+#define ISR_ITE (1 << 6) /* tx buffer empty */
-+#define ISR_IRF (1 << 7) /* rx buffer full */
-+#define ISR_GCAD (1 << 8) /* general call address detected */
-+#define ISR_SAD (1 << 9) /* slave address detected */
-+#define ISR_BED (1 << 10) /* bus error no ACK/NAK */
-+
-+#define ILCR_SLV_SHIFT 0
-+#define ILCR_SLV_MASK (0x1FF << ILCR_SLV_SHIFT)
-+#define ILCR_FLV_SHIFT 9
-+#define ILCR_FLV_MASK (0x1FF << ILCR_FLV_SHIFT)
-+#define ILCR_HLVL_SHIFT 18
-+#define ILCR_HLVL_MASK (0x1FF << ILCR_HLVL_SHIFT)
-+#define ILCR_HLVH_SHIFT 27
-+#define ILCR_HLVH_MASK (0x1F << ILCR_HLVH_SHIFT)
-+
-+#define IWCR_CNT_SHIFT 0
-+#define IWCR_CNT_MASK (0x1F << IWCR_CNT_SHIFT)
-+#define IWCR_HS_CNT1_SHIFT 5
-+#define IWCR_HS_CNT1_MASK (0x1F << IWCR_HS_CNT1_SHIFT)
-+#define IWCR_HS_CNT2_SHIFT 10
-+#define IWCR_HS_CNT2_MASK (0x1F << IWCR_HS_CNT2_SHIFT)
-+
- struct pxa_reg_layout {
- u32 ibmr;
- u32 idbr;
-@@ -53,12 +103,7 @@ enum pxa_i2c_types {
- REGS_A3700,
- };
-
--#define ICR_BUSMODE_FM (1 << 16) /* shifted fast mode for armada-3700 */
--#define ICR_BUSMODE_HS (1 << 17) /* shifted high speed mode for armada-3700 */
--
--/*
-- * I2C registers definitions
-- */
-+/* I2C register layout definitions */
- static struct pxa_reg_layout pxa_reg_layout[] = {
- [REGS_PXA2XX] = {
- .ibmr = 0x00,
-@@ -96,8 +141,8 @@ static struct pxa_reg_layout pxa_reg_lay
- .icr = 0x08,
- .isr = 0x0c,
- .isar = 0x10,
-- .fm = ICR_BUSMODE_FM,
-- .hs = ICR_BUSMODE_HS,
-+ .fm = ICR_A3700_FM,
-+ .hs = ICR_A3700_HS,
- },
- };
-
-@@ -111,58 +156,6 @@ static const struct platform_device_id i
- };
- MODULE_DEVICE_TABLE(platform, i2c_pxa_id_table);
-
--/*
-- * I2C bit definitions
-- */
--
--#define ICR_START (1 << 0) /* start bit */
--#define ICR_STOP (1 << 1) /* stop bit */
--#define ICR_ACKNAK (1 << 2) /* send ACK(0) or NAK(1) */
--#define ICR_TB (1 << 3) /* transfer byte bit */
--#define ICR_MA (1 << 4) /* master abort */
--#define ICR_SCLE (1 << 5) /* master clock enable */
--#define ICR_IUE (1 << 6) /* unit enable */
--#define ICR_GCD (1 << 7) /* general call disable */
--#define ICR_ITEIE (1 << 8) /* enable tx interrupts */
--#define ICR_IRFIE (1 << 9) /* enable rx interrupts */
--#define ICR_BEIE (1 << 10) /* enable bus error ints */
--#define ICR_SSDIE (1 << 11) /* slave STOP detected int enable */
--#define ICR_ALDIE (1 << 12) /* enable arbitration interrupt */
--#define ICR_SADIE (1 << 13) /* slave address detected int enable */
--#define ICR_UR (1 << 14) /* unit reset */
--#define ICR_FM (1 << 15) /* fast mode */
--#define ICR_HS (1 << 16) /* High Speed mode */
--#define ICR_GPIOEN (1 << 19) /* enable GPIO mode for SCL in HS */
--
--#define ISR_RWM (1 << 0) /* read/write mode */
--#define ISR_ACKNAK (1 << 1) /* ack/nak status */
--#define ISR_UB (1 << 2) /* unit busy */
--#define ISR_IBB (1 << 3) /* bus busy */
--#define ISR_SSD (1 << 4) /* slave stop detected */
--#define ISR_ALD (1 << 5) /* arbitration loss detected */
--#define ISR_ITE (1 << 6) /* tx buffer empty */
--#define ISR_IRF (1 << 7) /* rx buffer full */
--#define ISR_GCAD (1 << 8) /* general call address detected */
--#define ISR_SAD (1 << 9) /* slave address detected */
--#define ISR_BED (1 << 10) /* bus error no ACK/NAK */
--
--/* bit field shift & mask */
--#define ILCR_SLV_SHIFT 0
--#define ILCR_SLV_MASK (0x1FF << ILCR_SLV_SHIFT)
--#define ILCR_FLV_SHIFT 9
--#define ILCR_FLV_MASK (0x1FF << ILCR_FLV_SHIFT)
--#define ILCR_HLVL_SHIFT 18
--#define ILCR_HLVL_MASK (0x1FF << ILCR_HLVL_SHIFT)
--#define ILCR_HLVH_SHIFT 27
--#define ILCR_HLVH_MASK (0x1F << ILCR_HLVH_SHIFT)
--
--#define IWCR_CNT_SHIFT 0
--#define IWCR_CNT_MASK (0x1F << IWCR_CNT_SHIFT)
--#define IWCR_HS_CNT1_SHIFT 5
--#define IWCR_HS_CNT1_MASK (0x1F << IWCR_HS_CNT1_SHIFT)
--#define IWCR_HS_CNT2_SHIFT 10
--#define IWCR_HS_CNT2_MASK (0x1F << IWCR_HS_CNT2_SHIFT)
--
- struct pxa_i2c {
- spinlock_t lock;
- wait_queue_head_t wait;
diff --git a/target/linux/generic/backport-5.4/808-v5.8-i2c-pxa-add-and-use-definitions-for-IBMR-register.patch b/target/linux/generic/backport-5.4/808-v5.8-i2c-pxa-add-and-use-definitions-for-IBMR-register.patch
deleted file mode 100644
index f197808d23..0000000000
--- a/target/linux/generic/backport-5.4/808-v5.8-i2c-pxa-add-and-use-definitions-for-IBMR-register.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 06/17] i2c: pxa: add and use definitions for IBMR register
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Add definitions for the bits in the IBMR register, and use them in the
-code. This improves readability.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -34,6 +34,9 @@
- #include <linux/slab.h>
-
- /* I2C register field definitions */
-+#define IBMR_SDAS (1 << 0)
-+#define IBMR_SCLS (1 << 1)
-+
- #define ICR_START (1 << 0) /* start bit */
- #define ICR_STOP (1 << 1) /* stop bit */
- #define ICR_ACKNAK (1 << 2) /* send ACK(0) or NAK(1) */
-@@ -334,7 +337,7 @@ static void i2c_pxa_abort(struct pxa_i2c
- return;
- }
-
-- while ((i > 0) && (readl(_IBMR(i2c)) & 0x1) == 0) {
-+ while ((i > 0) && (readl(_IBMR(i2c)) & IBMR_SDAS) == 0) {
- unsigned long icr = readl(_ICR(i2c));
-
- icr &= ~ICR_START;
-@@ -389,7 +392,8 @@ static int i2c_pxa_wait_master(struct px
- * quick check of the i2c lines themselves to ensure they've
- * gone high...
- */
-- if ((readl(_ISR(i2c)) & (ISR_UB | ISR_IBB)) == 0 && readl(_IBMR(i2c)) == 3) {
-+ if ((readl(_ISR(i2c)) & (ISR_UB | ISR_IBB)) == 0 &&
-+ readl(_IBMR(i2c)) == (IBMR_SCLS | IBMR_SDAS)) {
- if (i2c_debug > 0)
- dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
- return 1;
-@@ -574,7 +578,7 @@ static void i2c_pxa_slave_start(struct p
- timeout = 0x10000;
-
- while (1) {
-- if ((readl(_IBMR(i2c)) & 2) == 2)
-+ if ((readl(_IBMR(i2c)) & IBMR_SCLS) == IBMR_SCLS)
- break;
-
- timeout--;
-@@ -637,7 +641,7 @@ static void i2c_pxa_slave_start(struct p
- timeout = 0x10000;
-
- while (1) {
-- if ((readl(_IBMR(i2c)) & 2) == 2)
-+ if ((readl(_IBMR(i2c)) & IBMR_SCLS) == IBMR_SCLS)
- break;
-
- timeout--;
diff --git a/target/linux/generic/backport-5.4/809-v5.8-i2c-pxa-always-set-fm-and-hs-members-for-each-type.patch b/target/linux/generic/backport-5.4/809-v5.8-i2c-pxa-always-set-fm-and-hs-members-for-each-type.patch
deleted file mode 100644
index 9b1dee62ce..0000000000
--- a/target/linux/generic/backport-5.4/809-v5.8-i2c-pxa-always-set-fm-and-hs-members-for-each-type.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 07/17] i2c: pxa: always set fm and hs members for each type
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Always set the fm and hs members of struct pxa_reg_layout. These
-members are already taking space, we don't need code as well.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -114,6 +114,8 @@ static struct pxa_reg_layout pxa_reg_lay
- .icr = 0x10,
- .isr = 0x18,
- .isar = 0x20,
-+ .fm = ICR_FM,
-+ .hs = ICR_HS,
- },
- [REGS_PXA3XX] = {
- .ibmr = 0x00,
-@@ -121,6 +123,8 @@ static struct pxa_reg_layout pxa_reg_lay
- .icr = 0x08,
- .isr = 0x0c,
- .isar = 0x10,
-+ .fm = ICR_FM,
-+ .hs = ICR_HS,
- },
- [REGS_CE4100] = {
- .ibmr = 0x14,
-@@ -128,6 +132,8 @@ static struct pxa_reg_layout pxa_reg_lay
- .icr = 0x00,
- .isr = 0x04,
- /* no isar register */
-+ .fm = ICR_FM,
-+ .hs = ICR_HS,
- },
- [REGS_PXA910] = {
- .ibmr = 0x00,
-@@ -137,6 +143,8 @@ static struct pxa_reg_layout pxa_reg_lay
- .isar = 0x20,
- .ilcr = 0x28,
- .iwcr = 0x30,
-+ .fm = ICR_FM,
-+ .hs = ICR_HS,
- },
- [REGS_A3700] = {
- .ibmr = 0x00,
-@@ -1229,8 +1237,8 @@ static int i2c_pxa_probe(struct platform
- i2c->reg_idbr = i2c->reg_base + pxa_reg_layout[i2c_type].idbr;
- i2c->reg_icr = i2c->reg_base + pxa_reg_layout[i2c_type].icr;
- i2c->reg_isr = i2c->reg_base + pxa_reg_layout[i2c_type].isr;
-- i2c->fm_mask = pxa_reg_layout[i2c_type].fm ? : ICR_FM;
-- i2c->hs_mask = pxa_reg_layout[i2c_type].hs ? : ICR_HS;
-+ i2c->fm_mask = pxa_reg_layout[i2c_type].fm;
-+ i2c->hs_mask = pxa_reg_layout[i2c_type].hs;
-
- if (i2c_type != REGS_CE4100)
- i2c->reg_isar = i2c->reg_base + pxa_reg_layout[i2c_type].isar;
diff --git a/target/linux/generic/backport-5.4/810-v5.8-i2c-pxa-move-private-definitions-to-i2c-pxa.c.patch b/target/linux/generic/backport-5.4/810-v5.8-i2c-pxa-move-private-definitions-to-i2c-pxa.c.patch
deleted file mode 100644
index dda463052f..0000000000
--- a/target/linux/generic/backport-5.4/810-v5.8-i2c-pxa-move-private-definitions-to-i2c-pxa.c.patch
+++ /dev/null
@@ -1,128 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 08/17] i2c: pxa: move private definitions to i2c-pxa.c
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Move driver-private definitions out of the i2c-pxa.h platform data
-header file into the driver itself. Nothing outside of the driver
-makes use of these constants.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 43 ++++++++++++++++++++++++
- include/linux/platform_data/i2c-pxa.h | 48 ---------------------------
- 2 files changed, 43 insertions(+), 48 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -86,6 +86,49 @@
- #define IWCR_HS_CNT2_SHIFT 10
- #define IWCR_HS_CNT2_MASK (0x1F << IWCR_HS_CNT2_SHIFT)
-
-+/* need a longer timeout if we're dealing with the fact we may well be
-+ * looking at a multi-master environment
-+ */
-+#define DEF_TIMEOUT 32
-+
-+#define BUS_ERROR (-EREMOTEIO)
-+#define XFER_NAKED (-ECONNREFUSED)
-+#define I2C_RETRY (-2000) /* an error has occurred retry transmit */
-+
-+/* ICR initialize bit values
-+ *
-+ * 15 FM 0 (100 kHz operation)
-+ * 14 UR 0 (No unit reset)
-+ * 13 SADIE 0 (Disables the unit from interrupting on slave addresses
-+ * matching its slave address)
-+ * 12 ALDIE 0 (Disables the unit from interrupt when it loses arbitration
-+ * in master mode)
-+ * 11 SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode)
-+ * 10 BEIE 1 (Enable interrupts from detected bus errors, no ACK sent)
-+ * 9 IRFIE 1 (Enable interrupts from full buffer received)
-+ * 8 ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty)
-+ * 7 GCD 1 (Disables i2c unit response to general call messages as a slave)
-+ * 6 IUE 0 (Disable unit until we change settings)
-+ * 5 SCLE 1 (Enables the i2c clock output for master mode (drives SCL)
-+ * 4 MA 0 (Only send stop with the ICR stop bit)
-+ * 3 TB 0 (We are not transmitting a byte initially)
-+ * 2 ACKNAK 0 (Send an ACK after the unit receives a byte)
-+ * 1 STOP 0 (Do not send a STOP)
-+ * 0 START 0 (Do not send a START)
-+ */
-+#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE)
-+
-+/* I2C status register init values
-+ *
-+ * 10 BED 1 (Clear bus error detected)
-+ * 9 SAD 1 (Clear slave address detected)
-+ * 7 IRF 1 (Clear IDBR Receive Full)
-+ * 6 ITE 1 (Clear IDBR Transmit Empty)
-+ * 5 ALD 1 (Clear Arbitration Loss Detected)
-+ * 4 SSD 1 (Clear Slave Stop Detected)
-+ */
-+#define I2C_ISR_INIT 0x7FF /* status register init */
-+
- struct pxa_reg_layout {
- u32 ibmr;
- u32 idbr;
---- a/include/linux/platform_data/i2c-pxa.h
-+++ b/include/linux/platform_data/i2c-pxa.h
-@@ -7,54 +7,6 @@
- #ifndef _I2C_PXA_H_
- #define _I2C_PXA_H_
-
--#if 0
--#define DEF_TIMEOUT 3
--#else
--/* need a longer timeout if we're dealing with the fact we may well be
-- * looking at a multi-master environment
--*/
--#define DEF_TIMEOUT 32
--#endif
--
--#define BUS_ERROR (-EREMOTEIO)
--#define XFER_NAKED (-ECONNREFUSED)
--#define I2C_RETRY (-2000) /* an error has occurred retry transmit */
--
--/* ICR initialize bit values
--*
--* 15. FM 0 (100 Khz operation)
--* 14. UR 0 (No unit reset)
--* 13. SADIE 0 (Disables the unit from interrupting on slave addresses
--* matching its slave address)
--* 12. ALDIE 0 (Disables the unit from interrupt when it loses arbitration
--* in master mode)
--* 11. SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode)
--* 10. BEIE 1 (Enable interrupts from detected bus errors, no ACK sent)
--* 9. IRFIE 1 (Enable interrupts from full buffer received)
--* 8. ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty)
--* 7. GCD 1 (Disables i2c unit response to general call messages as a slave)
--* 6. IUE 0 (Disable unit until we change settings)
--* 5. SCLE 1 (Enables the i2c clock output for master mode (drives SCL)
--* 4. MA 0 (Only send stop with the ICR stop bit)
--* 3. TB 0 (We are not transmitting a byte initially)
--* 2. ACKNAK 0 (Send an ACK after the unit receives a byte)
--* 1. STOP 0 (Do not send a STOP)
--* 0. START 0 (Do not send a START)
--*
--*/
--#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE)
--
--/* I2C status register init values
-- *
-- * 10. BED 1 (Clear bus error detected)
-- * 9. SAD 1 (Clear slave address detected)
-- * 7. IRF 1 (Clear IDBR Receive Full)
-- * 6. ITE 1 (Clear IDBR Transmit Empty)
-- * 5. ALD 1 (Clear Arbitration Loss Detected)
-- * 4. SSD 1 (Clear Slave Stop Detected)
-- */
--#define I2C_ISR_INIT 0x7FF /* status register init */
--
- struct i2c_slave_client;
-
- struct i2c_pxa_platform_data {
diff --git a/target/linux/generic/backport-5.4/811-v5.8-i2c-pxa-move-DT-IDs-along-side-platform-IDs.patch b/target/linux/generic/backport-5.4/811-v5.8-i2c-pxa-move-DT-IDs-along-side-platform-IDs.patch
deleted file mode 100644
index 02565229d8..0000000000
--- a/target/linux/generic/backport-5.4/811-v5.8-i2c-pxa-move-DT-IDs-along-side-platform-IDs.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 09/17] i2c: pxa: move DT IDs along side platform IDs
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Move the ID tables into one place, near the device dependent data.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -200,6 +200,15 @@ static struct pxa_reg_layout pxa_reg_lay
- },
- };
-
-+static const struct of_device_id i2c_pxa_dt_ids[] = {
-+ { .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX },
-+ { .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX },
-+ { .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA910 },
-+ { .compatible = "marvell,armada-3700-i2c", .data = (void *)REGS_A3700 },
-+ {}
-+};
-+MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);
-+
- static const struct platform_device_id i2c_pxa_id_table[] = {
- { "pxa2xx-i2c", REGS_PXA2XX },
- { "pxa3xx-pwri2c", REGS_PXA3XX },
-@@ -1178,15 +1187,6 @@ static const struct i2c_algorithm i2c_px
- .functionality = i2c_pxa_functionality,
- };
-
--static const struct of_device_id i2c_pxa_dt_ids[] = {
-- { .compatible = "mrvl,pxa-i2c", .data = (void *)REGS_PXA2XX },
-- { .compatible = "mrvl,pwri2c", .data = (void *)REGS_PXA3XX },
-- { .compatible = "mrvl,mmp-twsi", .data = (void *)REGS_PXA910 },
-- { .compatible = "marvell,armada-3700-i2c", .data = (void *)REGS_A3700 },
-- {}
--};
--MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);
--
- static int i2c_pxa_probe_dt(struct platform_device *pdev, struct pxa_i2c *i2c,
- enum pxa_i2c_types *i2c_types)
- {
diff --git a/target/linux/generic/backport-5.4/813-v5.8-i2c-pxa-clean-up-decode_bits.patch b/target/linux/generic/backport-5.4/813-v5.8-i2c-pxa-clean-up-decode_bits.patch
deleted file mode 100644
index adcf969ef6..0000000000
--- a/target/linux/generic/backport-5.4/813-v5.8-i2c-pxa-clean-up-decode_bits.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 11/17] i2c: pxa: clean up decode_bits()
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Clean up decode_bits() to use pr_cont(), and move the newline into the
-function rather than at its two callsites. Avoid printing an
-unnecessary space before the newline.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 7 +++----
- 1 file changed, 3 insertions(+), 4 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -287,13 +287,14 @@ struct bits {
- static inline void
- decode_bits(const char *prefix, const struct bits *bits, int num, u32 val)
- {
-- printk("%s %08x: ", prefix, val);
-+ printk("%s %08x:", prefix, val);
- while (num--) {
- const char *str = val & bits->mask ? bits->set : bits->unset;
- if (str)
-- printk("%s ", str);
-+ pr_cont(" %s", str);
- bits++;
- }
-+ pr_cont("\n");
- }
-
- static const struct bits isr_bits[] = {
-@@ -313,7 +314,6 @@ static const struct bits isr_bits[] = {
- static void decode_ISR(unsigned int val)
- {
- decode_bits(KERN_DEBUG "ISR", isr_bits, ARRAY_SIZE(isr_bits), val);
-- printk("\n");
- }
-
- static const struct bits icr_bits[] = {
-@@ -338,7 +338,6 @@ static const struct bits icr_bits[] = {
- static void decode_ICR(unsigned int val)
- {
- decode_bits(KERN_DEBUG "ICR", icr_bits, ARRAY_SIZE(icr_bits), val);
-- printk("\n");
- }
- #endif
-
diff --git a/target/linux/generic/backport-5.4/814-v5.8-i2c-pxa-fix-i2c_pxa_wait_bus_not_busy-boundary-condi.patch b/target/linux/generic/backport-5.4/814-v5.8-i2c-pxa-fix-i2c_pxa_wait_bus_not_busy-boundary-condi.patch
deleted file mode 100644
index 2aadecc357..0000000000
--- a/target/linux/generic/backport-5.4/814-v5.8-i2c-pxa-fix-i2c_pxa_wait_bus_not_busy-boundary-condi.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Cc: linux-i2c@vger.kernel.org
-Subject: [PATCH 12/17] i2c: pxa: fix i2c_pxa_wait_bus_not_busy() boundary
- condition
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Fix i2c_pxa_wait_bus_not_busy()'s boundary conditions, so that a
-coincidental success and timeout results in the function returning
-success.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 17 ++++++++++++-----
- 1 file changed, 12 insertions(+), 5 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -417,19 +417,26 @@ static void i2c_pxa_abort(struct pxa_i2c
- static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2c)
- {
- int timeout = DEF_TIMEOUT;
-+ u32 isr;
-
-- while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
-- if ((readl(_ISR(i2c)) & ISR_SAD) != 0)
-+ while (1) {
-+ isr = readl(_ISR(i2c));
-+ if (!(isr & (ISR_IBB | ISR_UB)))
-+ return 0;
-+
-+ if (isr & ISR_SAD)
- timeout += 4;
-
-+ if (!timeout--)
-+ break;
-+
- msleep(2);
- show_state(i2c);
- }
-
-- if (timeout < 0)
-- show_state(i2c);
-+ show_state(i2c);
-
-- return timeout < 0 ? I2C_RETRY : 0;
-+ return I2C_RETRY;
- }
-
- static int i2c_pxa_wait_master(struct pxa_i2c *i2c)
diff --git a/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch b/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch
deleted file mode 100644
index 2debd4c86b..0000000000
--- a/target/linux/generic/backport-5.4/815-v5.8-i2c-pxa-consolidate-i2c_pxa_-xfer-implementations.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 1/7] i2c: pxa: consolidate i2c_pxa_*xfer() implementations
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Most of i2c_pxa_pio_xfer() and i2c_pxa_xfer() are identical; the only
-differences are that i2c_pxa_pio_xfer() may reset the bus, and they
-use different underlying transfer functions. The retry loop is the
-same. Consolidate these two functions.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 36 ++++++++++++++++--------------------
- 1 file changed, 16 insertions(+), 20 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -1059,18 +1059,20 @@ static int i2c_pxa_do_xfer(struct pxa_i2
- return ret;
- }
-
--static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
-+static int i2c_pxa_internal_xfer(struct pxa_i2c *i2c,
-+ struct i2c_msg *msgs, int num,
-+ int (*xfer)(struct pxa_i2c *,
-+ struct i2c_msg *, int num))
- {
-- struct pxa_i2c *i2c = adap->algo_data;
- int ret, i;
-
-- for (i = adap->retries; i >= 0; i--) {
-- ret = i2c_pxa_do_xfer(i2c, msgs, num);
-+ for (i = i2c->adap.retries; i >= 0; i--) {
-+ ret = xfer(i2c, msgs, num);
- if (ret != I2C_RETRY)
- goto out;
-
- if (i2c_debug)
-- dev_dbg(&adap->dev, "Retrying transmission\n");
-+ dev_dbg(&i2c->adap.dev, "Retrying transmission\n");
- udelay(100);
- }
- i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
-@@ -1080,6 +1082,14 @@ static int i2c_pxa_xfer(struct i2c_adapt
- return ret;
- }
-
-+static int i2c_pxa_xfer(struct i2c_adapter *adap,
-+ struct i2c_msg msgs[], int num)
-+{
-+ struct pxa_i2c *i2c = adap->algo_data;
-+
-+ return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_xfer);
-+}
-+
- static u32 i2c_pxa_functionality(struct i2c_adapter *adap)
- {
- return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
-@@ -1163,7 +1173,6 @@ static int i2c_pxa_pio_xfer(struct i2c_a
- struct i2c_msg msgs[], int num)
- {
- struct pxa_i2c *i2c = adap->algo_data;
-- int ret, i;
-
- /* If the I2C controller is disabled we need to reset it
- (probably due to a suspend/resume destroying state). We do
-@@ -1172,20 +1181,7 @@ static int i2c_pxa_pio_xfer(struct i2c_a
- if (!(readl(_ICR(i2c)) & ICR_IUE))
- i2c_pxa_reset(i2c);
-
-- for (i = adap->retries; i >= 0; i--) {
-- ret = i2c_pxa_do_pio_xfer(i2c, msgs, num);
-- if (ret != I2C_RETRY)
-- goto out;
--
-- if (i2c_debug)
-- dev_dbg(&adap->dev, "Retrying transmission\n");
-- udelay(100);
-- }
-- i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
-- ret = -EREMOTEIO;
-- out:
-- i2c_pxa_set_slave(i2c, ret);
-- return ret;
-+ return i2c_pxa_internal_xfer(i2c, msgs, num, i2c_pxa_do_pio_xfer);
- }
-
- static const struct i2c_algorithm i2c_pxa_pio_algorithm = {
diff --git a/target/linux/generic/backport-5.4/816-v5.8-i2c-pxa-avoid-complaints-with-non-responsive-slaves.patch b/target/linux/generic/backport-5.4/816-v5.8-i2c-pxa-avoid-complaints-with-non-responsive-slaves.patch
deleted file mode 100644
index 63e6db80ad..0000000000
--- a/target/linux/generic/backport-5.4/816-v5.8-i2c-pxa-avoid-complaints-with-non-responsive-slaves.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 2/7] i2c: pxa: avoid complaints with non-responsive slaves
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Running i2cdetect on a PXA I2C adapter is very noisy; it complains
-whenever a slave fails to respond to the address cycle. Since it is
-normal to probe for slaves in this way, we should not fill the kernel
-log. This is especially true with SFP modules that take a while to
-respond on the I2C bus, and probing via the I2C bus is the only way to
-detect that they are ready.
-
-Fix this by changing the internal transfer return code from I2C_RETRY
-to a new NO_SLAVE code (mapped to -ENXIO, as per the I2C documentation
-for this condition, but we still return -EREMOTEIO to the I2C stack to
-maintain long established driver behaviour.)
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -91,6 +91,7 @@
- */
- #define DEF_TIMEOUT 32
-
-+#define NO_SLAVE (-ENXIO)
- #define BUS_ERROR (-EREMOTEIO)
- #define XFER_NAKED (-ECONNREFUSED)
- #define I2C_RETRY (-2000) /* an error has occurred retry transmit */
-@@ -838,7 +839,7 @@ static void i2c_pxa_irq_txempty(struct p
- */
- if (isr & ISR_ACKNAK) {
- if (i2c->msg_ptr == 0 && i2c->msg_idx == 0)
-- ret = I2C_RETRY;
-+ ret = NO_SLAVE;
- else
- ret = XFER_NAKED;
- }
-@@ -1066,16 +1067,19 @@ static int i2c_pxa_internal_xfer(struct
- {
- int ret, i;
-
-- for (i = i2c->adap.retries; i >= 0; i--) {
-+ for (i = 0; ; ) {
- ret = xfer(i2c, msgs, num);
-- if (ret != I2C_RETRY)
-+ if (ret != I2C_RETRY && ret != NO_SLAVE)
- goto out;
-+ if (++i >= i2c->adap.retries)
-+ break;
-
- if (i2c_debug)
- dev_dbg(&i2c->adap.dev, "Retrying transmission\n");
- udelay(100);
- }
-- i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
-+ if (ret != NO_SLAVE)
-+ i2c_pxa_scream_blue_murder(i2c, "exhausted retries");
- ret = -EREMOTEIO;
- out:
- i2c_pxa_set_slave(i2c, ret);
diff --git a/target/linux/generic/backport-5.4/817-v5.8-i2c-pxa-ensure-timeout-messages-are-unique.patch b/target/linux/generic/backport-5.4/817-v5.8-i2c-pxa-ensure-timeout-messages-are-unique.patch
deleted file mode 100644
index 37a77b6c5c..0000000000
--- a/target/linux/generic/backport-5.4/817-v5.8-i2c-pxa-ensure-timeout-messages-are-unique.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 3/7] i2c: pxa: ensure timeout messages are unique
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Ensure that the various timeout messages can identify where in the code
-they were produced from to aid debugging.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -1052,7 +1052,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2
- ret = i2c->msg_idx;
-
- if (!timeout && i2c->msg_num) {
-- i2c_pxa_scream_blue_murder(i2c, "timeout");
-+ i2c_pxa_scream_blue_murder(i2c, "timeout with active message");
- ret = I2C_RETRY;
- }
-
-@@ -1122,7 +1122,7 @@ static int i2c_pxa_pio_set_master(struct
- if (timeout < 0) {
- show_state(i2c);
- dev_err(&i2c->adap.dev,
-- "i2c_pxa: timeout waiting for bus free\n");
-+ "i2c_pxa: timeout waiting for bus free (set_master)\n");
- return I2C_RETRY;
- }
-
-@@ -1166,7 +1166,7 @@ static int i2c_pxa_do_pio_xfer(struct px
-
- out:
- if (timeout == 0) {
-- i2c_pxa_scream_blue_murder(i2c, "timeout");
-+ i2c_pxa_scream_blue_murder(i2c, "timeout (do_pio_xfer)");
- ret = I2C_RETRY;
- }
-
diff --git a/target/linux/generic/backport-5.4/818-v5.8-i2c-pxa-remove-some-unnecessary-debug.patch b/target/linux/generic/backport-5.4/818-v5.8-i2c-pxa-remove-some-unnecessary-debug.patch
deleted file mode 100644
index 5438588ded..0000000000
--- a/target/linux/generic/backport-5.4/818-v5.8-i2c-pxa-remove-some-unnecessary-debug.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 4/7] i2c: pxa: remove some unnecessary debug
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Remove unnecessary show_state() in the loop inside
-i2c_pxa_pio_set_master(), which can be unnecessarily verbose.
-
-Remove the i2c_pxa_scream_blue_murder() in i2c_pxa_pio_xfer(), which
-will trigger if we are probing the I2C bus and a slave does not
-respond; this is a normal event, and not something to report.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -1114,10 +1114,8 @@ static int i2c_pxa_pio_set_master(struct
- /*
- * Wait for the bus to become free.
- */
-- while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
-+ while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB))
- udelay(1000);
-- show_state(i2c);
-- }
-
- if (timeout < 0) {
- show_state(i2c);
diff --git a/target/linux/generic/backport-5.4/820-v5.8-i2c-pxa-use-master-abort-for-device-probes.patch b/target/linux/generic/backport-5.4/820-v5.8-i2c-pxa-use-master-abort-for-device-probes.patch
deleted file mode 100644
index cde9e3fe33..0000000000
--- a/target/linux/generic/backport-5.4/820-v5.8-i2c-pxa-use-master-abort-for-device-probes.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 6/7] i2c: pxa: use master-abort for device probes
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Use master-abort to send the stop condition after an address cycle
-rather than resetting the controller.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 10 ++--------
- 1 file changed, 2 insertions(+), 8 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -899,14 +899,8 @@ static void i2c_pxa_irq_txempty(struct p
- icr &= ~ICR_ALDIE;
- icr |= ICR_START | ICR_TB;
- } else {
-- if (i2c->msg->len == 0) {
-- /*
-- * Device probes have a message length of zero
-- * and need the bus to be reset before it can
-- * be used again.
-- */
-- i2c_pxa_reset(i2c);
-- }
-+ if (i2c->msg->len == 0)
-+ icr |= ICR_MA;
- i2c_pxa_master_complete(i2c, 0);
- }
-
diff --git a/target/linux/generic/backport-5.4/821-v5.8-i2c-pxa-implement-generic-i2c-bus-recovery.patch b/target/linux/generic/backport-5.4/821-v5.8-i2c-pxa-implement-generic-i2c-bus-recovery.patch
deleted file mode 100644
index 592b763b6a..0000000000
--- a/target/linux/generic/backport-5.4/821-v5.8-i2c-pxa-implement-generic-i2c-bus-recovery.patch
+++ /dev/null
@@ -1,285 +0,0 @@
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Bcc: linux@mail.armlinux.org.uk
-Subject: [PATCH 7/7] i2c: pxa: implement generic i2c bus recovery
-MIME-Version: 1.0
-Content-Disposition: inline
-Content-Transfer-Encoding: 8bit
-Content-Type: text/plain; charset="utf-8"
-
-Implement generic GPIO-based I2C bus recovery for the PXA I2C driver.
-
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/i2c/busses/i2c-pxa.c | 176 +++++++++++++++++++++++++++++++----
- 1 file changed, 159 insertions(+), 17 deletions(-)
-
---- a/drivers/i2c/busses/i2c-pxa.c
-+++ b/drivers/i2c/busses/i2c-pxa.c
-@@ -20,6 +20,7 @@
- #include <linux/delay.h>
- #include <linux/err.h>
- #include <linux/errno.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/i2c.h>
- #include <linux/i2c-pxa.h>
- #include <linux/init.h>
-@@ -29,6 +30,7 @@
- #include <linux/module.h>
- #include <linux/of.h>
- #include <linux/of_device.h>
-+#include <linux/pinctrl/consumer.h>
- #include <linux/platform_device.h>
- #include <linux/platform_data/i2c-pxa.h>
- #include <linux/slab.h>
-@@ -261,6 +263,11 @@ struct pxa_i2c {
- bool highmode_enter;
- u32 fm_mask;
- u32 hs_mask;
-+
-+ struct i2c_bus_recovery_info recovery;
-+ struct pinctrl *pinctrl;
-+ struct pinctrl_state *pinctrl_default;
-+ struct pinctrl_state *pinctrl_recovery;
- };
-
- #define _IBMR(i2c) ((i2c)->reg_ibmr)
-@@ -560,13 +567,8 @@ static void i2c_pxa_set_slave(struct pxa
- #define i2c_pxa_set_slave(i2c, err) do { } while (0)
- #endif
-
--static void i2c_pxa_reset(struct pxa_i2c *i2c)
-+static void i2c_pxa_do_reset(struct pxa_i2c *i2c)
- {
-- pr_debug("Resetting I2C Controller Unit\n");
--
-- /* abort any transfer currently under way */
-- i2c_pxa_abort(i2c);
--
- /* reset according to 9.8 */
- writel(ICR_UR, _ICR(i2c));
- writel(I2C_ISR_INIT, _ISR(i2c));
-@@ -585,12 +587,25 @@ static void i2c_pxa_reset(struct pxa_i2c
- #endif
-
- i2c_pxa_set_slave(i2c, 0);
-+}
-
-+static void i2c_pxa_enable(struct pxa_i2c *i2c)
-+{
- /* enable unit */
- writel(readl(_ICR(i2c)) | ICR_IUE, _ICR(i2c));
- udelay(100);
- }
-
-+static void i2c_pxa_reset(struct pxa_i2c *i2c)
-+{
-+ pr_debug("Resetting I2C Controller Unit\n");
-+
-+ /* abort any transfer currently under way */
-+ i2c_pxa_abort(i2c);
-+ i2c_pxa_do_reset(i2c);
-+ i2c_pxa_enable(i2c);
-+}
-+
-
- #ifdef CONFIG_I2C_PXA_SLAVE
- /*
-@@ -1002,6 +1017,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2
- ret = i2c_pxa_wait_bus_not_busy(i2c);
- if (ret) {
- dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n");
-+ i2c_recover_bus(&i2c->adap);
- goto out;
- }
-
-@@ -1047,6 +1063,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2
-
- if (!timeout && i2c->msg_num) {
- i2c_pxa_scream_blue_murder(i2c, "timeout with active message");
-+ i2c_recover_bus(&i2c->adap);
- ret = I2C_RETRY;
- }
-
-@@ -1228,6 +1245,129 @@ static int i2c_pxa_probe_pdata(struct pl
- return 0;
- }
-
-+static void i2c_pxa_prepare_recovery(struct i2c_adapter *adap)
-+{
-+ struct pxa_i2c *i2c = adap->algo_data;
-+ u32 ibmr = readl(_IBMR(i2c));
-+
-+ /*
-+ * Program the GPIOs to reflect the current I2C bus state while
-+ * we transition to recovery; this avoids glitching the bus.
-+ */
-+ gpiod_set_value(i2c->recovery.scl_gpiod, ibmr & IBMR_SCLS);
-+ gpiod_set_value(i2c->recovery.sda_gpiod, ibmr & IBMR_SDAS);
-+
-+ WARN_ON(pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_recovery));
-+}
-+
-+static void i2c_pxa_unprepare_recovery(struct i2c_adapter *adap)
-+{
-+ struct pxa_i2c *i2c = adap->algo_data;
-+ u32 isr;
-+
-+ /*
-+ * The bus should now be free. Clear up the I2C controller before
-+ * handing control of the bus back to avoid the bus changing state.
-+ */
-+ isr = readl(_ISR(i2c));
-+ if (isr & (ISR_UB | ISR_IBB)) {
-+ dev_dbg(&i2c->adap.dev,
-+ "recovery: resetting controller, ISR=0x%08x\n", isr);
-+ i2c_pxa_do_reset(i2c);
-+ }
-+
-+ WARN_ON(pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_default));
-+
-+ dev_dbg(&i2c->adap.dev, "recovery: IBMR 0x%08x ISR 0x%08x\n",
-+ readl(_IBMR(i2c)), readl(_ISR(i2c)));
-+
-+ i2c_pxa_enable(i2c);
-+}
-+
-+static int i2c_pxa_init_recovery(struct pxa_i2c *i2c)
-+{
-+ struct i2c_bus_recovery_info *bri = &i2c->recovery;
-+ struct device *dev = i2c->adap.dev.parent;
-+
-+ /*
-+ * When slave mode is enabled, we are not the only master on the bus.
-+ * Bus recovery can only be performed when we are the master, which
-+ * we can't be certain of. Therefore, when slave mode is enabled, do
-+ * not configure bus recovery.
-+ */
-+ if (IS_ENABLED(CONFIG_I2C_PXA_SLAVE))
-+ return 0;
-+
-+ i2c->pinctrl = devm_pinctrl_get(dev);
-+ if (IS_ERR(i2c->pinctrl))
-+ return PTR_ERR(i2c->pinctrl);
-+
-+ if (!i2c->pinctrl)
-+ return 0;
-+
-+ i2c->pinctrl_default = pinctrl_lookup_state(i2c->pinctrl,
-+ PINCTRL_STATE_DEFAULT);
-+ i2c->pinctrl_recovery = pinctrl_lookup_state(i2c->pinctrl, "recovery");
-+
-+ if (IS_ERR(i2c->pinctrl_default) || IS_ERR(i2c->pinctrl_recovery)) {
-+ dev_info(dev, "missing pinmux recovery information: %ld %ld\n",
-+ PTR_ERR(i2c->pinctrl_default),
-+ PTR_ERR(i2c->pinctrl_recovery));
-+ return 0;
-+ }
-+
-+ /*
-+ * Claiming GPIOs can influence the pinmux state, and may glitch the
-+ * I2C bus. Do this carefully.
-+ */
-+ bri->scl_gpiod = devm_gpiod_get(dev, "scl", GPIOD_OUT_HIGH_OPEN_DRAIN);
-+ if (bri->scl_gpiod == ERR_PTR(-EPROBE_DEFER))
-+ return -EPROBE_DEFER;
-+ if (IS_ERR(bri->scl_gpiod)) {
-+ dev_info(dev, "missing scl gpio recovery information: %pe\n",
-+ bri->scl_gpiod);
-+ return 0;
-+ }
-+
-+ /*
-+ * We have SCL. Pull SCL low and wait a bit so that SDA glitches
-+ * have no effect.
-+ */
-+ gpiod_direction_output(bri->scl_gpiod, 0);
-+ udelay(10);
-+ bri->sda_gpiod = devm_gpiod_get(dev, "sda", GPIOD_OUT_HIGH_OPEN_DRAIN);
-+
-+ /* Wait a bit in case of a SDA glitch, and then release SCL. */
-+ udelay(10);
-+ gpiod_direction_output(bri->scl_gpiod, 1);
-+
-+ if (bri->sda_gpiod == ERR_PTR(-EPROBE_DEFER))
-+ return -EPROBE_DEFER;
-+
-+ if (IS_ERR(bri->sda_gpiod)) {
-+ dev_info(dev, "missing sda gpio recovery information: %pe\n",
-+ bri->sda_gpiod);
-+ return 0;
-+ }
-+
-+ bri->prepare_recovery = i2c_pxa_prepare_recovery;
-+ bri->unprepare_recovery = i2c_pxa_unprepare_recovery;
-+ bri->recover_bus = i2c_generic_scl_recovery;
-+
-+ i2c->adap.bus_recovery_info = bri;
-+
-+ /*
-+ * Claiming GPIOs can change the pinmux state, which confuses the
-+ * pinctrl since pinctrl's idea of the current setting is unaffected
-+ * by the pinmux change caused by claiming the GPIO. Work around that
-+ * by switching pinctrl to the GPIO state here. We do it this way to
-+ * avoid glitching the I2C bus.
-+ */
-+ pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_recovery);
-+
-+ return pinctrl_select_state(i2c->pinctrl, i2c->pinctrl_default);
-+}
-+
- static int i2c_pxa_probe(struct platform_device *dev)
- {
- struct i2c_pxa_platform_data *plat = dev_get_platdata(&dev->dev);
-@@ -1240,6 +1380,16 @@ static int i2c_pxa_probe(struct platform
- if (!i2c)
- return -ENOMEM;
-
-+ /* Default adapter num to device id; i2c_pxa_probe_dt can override. */
-+ i2c->adap.nr = dev->id;
-+ i2c->adap.owner = THIS_MODULE;
-+ i2c->adap.retries = 5;
-+ i2c->adap.algo_data = i2c;
-+ i2c->adap.dev.parent = &dev->dev;
-+#ifdef CONFIG_OF
-+ i2c->adap.dev.of_node = dev->dev.of_node;
-+#endif
-+
- res = platform_get_resource(dev, IORESOURCE_MEM, 0);
- i2c->reg_base = devm_ioremap_resource(&dev->dev, res);
- if (IS_ERR(i2c->reg_base))
-@@ -1251,8 +1401,9 @@ static int i2c_pxa_probe(struct platform
- return irq;
- }
-
-- /* Default adapter num to device id; i2c_pxa_probe_dt can override. */
-- i2c->adap.nr = dev->id;
-+ ret = i2c_pxa_init_recovery(i2c);
-+ if (ret)
-+ return ret;
-
- ret = i2c_pxa_probe_dt(dev, i2c, &i2c_type);
- if (ret > 0)
-@@ -1260,9 +1411,6 @@ static int i2c_pxa_probe(struct platform
- if (ret < 0)
- return ret;
-
-- i2c->adap.owner = THIS_MODULE;
-- i2c->adap.retries = 5;
--
- spin_lock_init(&i2c->lock);
- init_waitqueue_head(&i2c->wait);
-
-@@ -1332,12 +1480,6 @@ static int i2c_pxa_probe(struct platform
-
- i2c_pxa_reset(i2c);
-
-- i2c->adap.algo_data = i2c;
-- i2c->adap.dev.parent = &dev->dev;
--#ifdef CONFIG_OF
-- i2c->adap.dev.of_node = dev->dev.of_node;
--#endif
--
- ret = i2c_add_numbered_adapter(&i2c->adap);
- if (ret < 0)
- goto ereqirq;
diff --git a/target/linux/generic/backport-5.4/825-v5.8-spi-rb4xx-null-pointer-bug-fix.patch b/target/linux/generic/backport-5.4/825-v5.8-spi-rb4xx-null-pointer-bug-fix.patch
deleted file mode 100644
index 71e26d50da..0000000000
--- a/target/linux/generic/backport-5.4/825-v5.8-spi-rb4xx-null-pointer-bug-fix.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Christopher Hill <ch6574@gmail.com>
-To: Mark Brown <broonie@kernel.org>
-Cc: Christopher Hill <ch6574@gmail.com>, linux-spi@vger.kernel.org,
- linux-kernel@vger.kernel.org
-Subject: [PATCH 1/3] spi: rb4xx: null pointer bug fix
-Date: Thu, 21 May 2020 14:36:29 -0400
-Message-Id: <20200521183631.37806-1-ch6574@gmail.com>
-X-Mailer: git-send-email 2.25.1
-MIME-Version: 1.0
-Sender: linux-spi-owner@vger.kernel.org
-Precedence: bulk
-List-ID: <linux-spi.vger.kernel.org>
-X-Mailing-List: linux-spi@vger.kernel.org
-
-This patch fixes a null pointer bug in the spi driver spi-rb4xx.c by
-moving the private data initialization to earlier in probe
-
-Signed-off-by: Christopher Hill <ch6574@gmail.com>
----
- drivers/spi/spi-rb4xx.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/spi/spi-rb4xx.c
-+++ b/drivers/spi/spi-rb4xx.c
-@@ -158,6 +158,11 @@ static int rb4xx_spi_probe(struct platfo
- master->transfer_one = rb4xx_transfer_one;
- master->set_cs = rb4xx_set_cs;
-
-+ rbspi = spi_master_get_devdata(master);
-+ rbspi->base = spi_base;
-+ rbspi->clk = ahb_clk;
-+ platform_set_drvdata(pdev, rbspi);
-+
- err = devm_spi_register_master(&pdev->dev, master);
- if (err) {
- dev_err(&pdev->dev, "failed to register SPI master\n");
-@@ -168,11 +173,6 @@ static int rb4xx_spi_probe(struct platfo
- if (err)
- return err;
-
-- rbspi = spi_master_get_devdata(master);
-- rbspi->base = spi_base;
-- rbspi->clk = ahb_clk;
-- platform_set_drvdata(pdev, rbspi);
--
- /* Enable SPI */
- rb4xx_write(rbspi, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO);
-
diff --git a/target/linux/generic/backport-5.4/826-v5.8-spi-rb4xx-update-driver-to-be-device-tree-aware.patch b/target/linux/generic/backport-5.4/826-v5.8-spi-rb4xx-update-driver-to-be-device-tree-aware.patch
deleted file mode 100644
index 0ce4f2bb35..0000000000
--- a/target/linux/generic/backport-5.4/826-v5.8-spi-rb4xx-update-driver-to-be-device-tree-aware.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Christopher Hill <ch6574@gmail.com>
-To: Mark Brown <broonie@kernel.org>
-Cc: Christopher Hill <ch6574@gmail.com>, linux-spi@vger.kernel.org,
- linux-kernel@vger.kernel.org
-Subject: [PATCH 2/3] spi: rb4xx: update driver to be device tree aware
-Date: Thu, 21 May 2020 14:36:30 -0400
-Message-Id: <20200521183631.37806-2-ch6574@gmail.com>
-X-Mailer: git-send-email 2.25.1
-In-Reply-To: <20200521183631.37806-1-ch6574@gmail.com>
-References: <20200521183631.37806-1-ch6574@gmail.com>
-MIME-Version: 1.0
-Sender: linux-spi-owner@vger.kernel.org
-Precedence: bulk
-List-ID: <linux-spi.vger.kernel.org>
-X-Mailing-List: linux-spi@vger.kernel.org
-
-This patch updates the spi driver spi-rb4xx.c to be device tree aware
-
-Signed-off-by: Christopher Hill <ch6574@gmail.com>
----
- drivers/spi/spi-rb4xx.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
---- a/drivers/spi/spi-rb4xx.c
-+++ b/drivers/spi/spi-rb4xx.c
-@@ -14,6 +14,7 @@
- #include <linux/platform_device.h>
- #include <linux/clk.h>
- #include <linux/spi/spi.h>
-+#include <linux/of.h>
-
- #include <asm/mach-ath79/ar71xx_regs.h>
-
-@@ -150,6 +151,7 @@ static int rb4xx_spi_probe(struct platfo
- if (IS_ERR(ahb_clk))
- return PTR_ERR(ahb_clk);
-
-+ master->dev.of_node = pdev->dev.of_node;
- master->bus_num = 0;
- master->num_chipselect = 3;
- master->mode_bits = SPI_TX_DUAL;
-@@ -188,11 +190,18 @@ static int rb4xx_spi_remove(struct platf
- return 0;
- }
-
-+static const struct of_device_id rb4xx_spi_dt_match[] = {
-+ { .compatible = "mikrotik,rb4xx-spi" },
-+ { },
-+};
-+MODULE_DEVICE_TABLE(of, rb4xx_spi_dt_match);
-+
- static struct platform_driver rb4xx_spi_drv = {
- .probe = rb4xx_spi_probe,
- .remove = rb4xx_spi_remove,
- .driver = {
- .name = "rb4xx-spi",
-+ .of_match_table = of_match_ptr(rb4xx_spi_dt_match),
- },
- };
-
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch b/target/linux/generic/backport-5.4/831-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch
deleted file mode 100644
index 19938704b7..0000000000
--- a/target/linux/generic/backport-5.4/831-v5.13-0001-firmware-bcm47xx_nvram-rename-finding-function-and-i.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From fb009cbdd0693bd633f11e99526617b3d392cfad Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 8 Mar 2021 10:03:16 +0100
-Subject: [PATCH] firmware: bcm47xx_nvram: rename finding function and its
- variables
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-1. Use "bcm47xx_" function name prefix for consistency
-2. It takes flash start as argument so s/iobase/flash_start/
-3. "off" was used for finding flash end so just call it "flash_size"
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- drivers/firmware/broadcom/bcm47xx_nvram.c | 24 ++++++++++++-----------
- 1 file changed, 13 insertions(+), 11 deletions(-)
-
---- a/drivers/firmware/broadcom/bcm47xx_nvram.c
-+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
-@@ -48,11 +48,13 @@ static u32 find_nvram_size(void __iomem
- return 0;
- }
-
--/* Probe for NVRAM header */
--static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
-+/**
-+ * bcm47xx_nvram_find_and_copy - find NVRAM on flash mapping & copy it
-+ */
-+static int bcm47xx_nvram_find_and_copy(void __iomem *flash_start, size_t res_size)
- {
- struct nvram_header __iomem *header;
-- u32 off;
-+ size_t flash_size;
- u32 size;
-
- if (nvram_len) {
-@@ -61,25 +63,25 @@ static int nvram_find_and_copy(void __io
- }
-
- /* TODO: when nvram is on nand flash check for bad blocks first. */
-- off = FLASH_MIN;
-- while (off <= lim) {
-+ flash_size = FLASH_MIN;
-+ while (flash_size <= res_size) {
- /* Windowed flash access */
-- size = find_nvram_size(iobase + off);
-+ size = find_nvram_size(flash_start + flash_size);
- if (size) {
-- header = (struct nvram_header *)(iobase + off - size);
-+ header = (struct nvram_header *)(flash_start + flash_size - size);
- goto found;
- }
-- off <<= 1;
-+ flash_size <<= 1;
- }
-
- /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
-- header = (struct nvram_header *)(iobase + 4096);
-+ header = (struct nvram_header *)(flash_start + 4096);
- if (header->magic == NVRAM_MAGIC) {
- size = NVRAM_SPACE;
- goto found;
- }
-
-- header = (struct nvram_header *)(iobase + 1024);
-+ header = (struct nvram_header *)(flash_start + 1024);
- if (header->magic == NVRAM_MAGIC) {
- size = NVRAM_SPACE;
- goto found;
-@@ -124,7 +126,7 @@ int bcm47xx_nvram_init_from_mem(u32 base
- if (!iobase)
- return -ENOMEM;
-
-- err = nvram_find_and_copy(iobase, lim);
-+ err = bcm47xx_nvram_find_and_copy(iobase, lim);
-
- iounmap(iobase);
-
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch b/target/linux/generic/backport-5.4/831-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch
deleted file mode 100644
index 6ab072883d..0000000000
--- a/target/linux/generic/backport-5.4/831-v5.13-0002-firmware-bcm47xx_nvram-add-helper-checking-for-NVRAM.patch
+++ /dev/null
@@ -1,90 +0,0 @@
-From 0a24b51a3264a3f942a75025ea5ff6133c8989b0 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 8 Mar 2021 10:03:17 +0100
-Subject: [PATCH] firmware: bcm47xx_nvram: add helper checking for NVRAM
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This avoids duplicating code doing casting and checking for NVRAM magic.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- drivers/firmware/broadcom/bcm47xx_nvram.c | 30 ++++++++++++++---------
- 1 file changed, 18 insertions(+), 12 deletions(-)
-
---- a/drivers/firmware/broadcom/bcm47xx_nvram.c
-+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
-@@ -34,14 +34,20 @@ static char nvram_buf[NVRAM_SPACE];
- static size_t nvram_len;
- static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000};
-
-+/**
-+ * bcm47xx_nvram_is_valid - check for a valid NVRAM at specified memory
-+ */
-+static bool bcm47xx_nvram_is_valid(void __iomem *nvram)
-+{
-+ return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC;
-+}
-+
- static u32 find_nvram_size(void __iomem *end)
- {
-- struct nvram_header __iomem *header;
- int i;
-
- for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
-- header = (struct nvram_header *)(end - nvram_sizes[i]);
-- if (header->magic == NVRAM_MAGIC)
-+ if (bcm47xx_nvram_is_valid(end - nvram_sizes[i]))
- return nvram_sizes[i];
- }
-
-@@ -55,6 +61,7 @@ static int bcm47xx_nvram_find_and_copy(v
- {
- struct nvram_header __iomem *header;
- size_t flash_size;
-+ size_t offset;
- u32 size;
-
- if (nvram_len) {
-@@ -68,31 +75,30 @@ static int bcm47xx_nvram_find_and_copy(v
- /* Windowed flash access */
- size = find_nvram_size(flash_start + flash_size);
- if (size) {
-- header = (struct nvram_header *)(flash_start + flash_size - size);
-+ offset = flash_size - size;
- goto found;
- }
- flash_size <<= 1;
- }
-
- /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
-- header = (struct nvram_header *)(flash_start + 4096);
-- if (header->magic == NVRAM_MAGIC) {
-- size = NVRAM_SPACE;
-+
-+ offset = 4096;
-+ if (bcm47xx_nvram_is_valid(flash_start + offset))
- goto found;
-- }
-
-- header = (struct nvram_header *)(flash_start + 1024);
-- if (header->magic == NVRAM_MAGIC) {
-- size = NVRAM_SPACE;
-+ offset = 1024;
-+ if (bcm47xx_nvram_is_valid(flash_start + offset))
- goto found;
-- }
-
- pr_err("no nvram found\n");
- return -ENXIO;
-
- found:
-+ header = (struct nvram_header *)(flash_start + offset);
- __ioread32_copy(nvram_buf, header, sizeof(*header) / 4);
- nvram_len = ((struct nvram_header *)(nvram_buf))->len;
-+ size = res_size - offset;
- if (nvram_len > size) {
- pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
- nvram_len = size;
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch b/target/linux/generic/backport-5.4/831-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch
deleted file mode 100644
index a1351f1197..0000000000
--- a/target/linux/generic/backport-5.4/831-v5.13-0003-firmware-bcm47xx_nvram-extract-code-copying-NVRAM.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 298923cf999cecd2ef06df126f85a3d68da8c4d8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 8 Mar 2021 10:03:18 +0100
-Subject: [PATCH] firmware: bcm47xx_nvram: extract code copying NVRAM
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This simplifies function finding NVRAM. It doesn't directly deal with
-NVRAM structure anymore and is a bit smaller.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- drivers/firmware/broadcom/bcm47xx_nvram.c | 43 +++++++++++++----------
- 1 file changed, 25 insertions(+), 18 deletions(-)
-
---- a/drivers/firmware/broadcom/bcm47xx_nvram.c
-+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
-@@ -55,11 +55,34 @@ static u32 find_nvram_size(void __iomem
- }
-
- /**
-+ * bcm47xx_nvram_copy - copy NVRAM to internal buffer
-+ */
-+static void bcm47xx_nvram_copy(void __iomem *nvram_start, size_t res_size)
-+{
-+ struct nvram_header __iomem *header = nvram_start;
-+ size_t copy_size;
-+
-+ copy_size = header->len;
-+ if (copy_size > res_size) {
-+ pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
-+ copy_size = res_size;
-+ }
-+ if (copy_size >= NVRAM_SPACE) {
-+ pr_err("nvram on flash (%zu bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
-+ copy_size, NVRAM_SPACE - 1);
-+ copy_size = NVRAM_SPACE - 1;
-+ }
-+
-+ __ioread32_copy(nvram_buf, nvram_start, DIV_ROUND_UP(copy_size, 4));
-+ nvram_buf[NVRAM_SPACE - 1] = '\0';
-+ nvram_len = copy_size;
-+}
-+
-+/**
- * bcm47xx_nvram_find_and_copy - find NVRAM on flash mapping & copy it
- */
- static int bcm47xx_nvram_find_and_copy(void __iomem *flash_start, size_t res_size)
- {
-- struct nvram_header __iomem *header;
- size_t flash_size;
- size_t offset;
- u32 size;
-@@ -95,23 +118,7 @@ static int bcm47xx_nvram_find_and_copy(v
- return -ENXIO;
-
- found:
-- header = (struct nvram_header *)(flash_start + offset);
-- __ioread32_copy(nvram_buf, header, sizeof(*header) / 4);
-- nvram_len = ((struct nvram_header *)(nvram_buf))->len;
-- size = res_size - offset;
-- if (nvram_len > size) {
-- pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
-- nvram_len = size;
-- }
-- if (nvram_len >= NVRAM_SPACE) {
-- pr_err("nvram on flash (%zu bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
-- nvram_len, NVRAM_SPACE - 1);
-- nvram_len = NVRAM_SPACE - 1;
-- }
-- /* proceed reading data after header */
-- __ioread32_copy(nvram_buf + sizeof(*header), header + 1,
-- DIV_ROUND_UP(nvram_len, 4));
-- nvram_buf[NVRAM_SPACE - 1] = '\0';
-+ bcm47xx_nvram_copy(flash_start + offset, res_size - offset);
-
- return 0;
- }
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch b/target/linux/generic/backport-5.4/831-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch
deleted file mode 100644
index 059a13220b..0000000000
--- a/target/linux/generic/backport-5.4/831-v5.13-0004-firmware-bcm47xx_nvram-look-for-NVRAM-with-for-inste.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 98b68324f67236e8c9152976535dc1f27fb67ba8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 8 Mar 2021 10:03:19 +0100
-Subject: [PATCH] firmware: bcm47xx_nvram: look for NVRAM with for instead of
- while
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This loop requires variable initialization, stop condition and post
-iteration increment. It's pretty much a for loop definition.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- drivers/firmware/broadcom/bcm47xx_nvram.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
---- a/drivers/firmware/broadcom/bcm47xx_nvram.c
-+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
-@@ -93,15 +93,13 @@ static int bcm47xx_nvram_find_and_copy(v
- }
-
- /* TODO: when nvram is on nand flash check for bad blocks first. */
-- flash_size = FLASH_MIN;
-- while (flash_size <= res_size) {
-+ for (flash_size = FLASH_MIN; flash_size <= res_size; flash_size <<= 1) {
- /* Windowed flash access */
- size = find_nvram_size(flash_start + flash_size);
- if (size) {
- offset = flash_size - size;
- goto found;
- }
-- flash_size <<= 1;
- }
-
- /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
diff --git a/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch b/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch
deleted file mode 100644
index 21d250049e..0000000000
--- a/target/linux/generic/backport-5.4/831-v5.13-0005-firmware-bcm47xx_nvram-inline-code-checking-NVRAM-si.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From f52da4ccfec9192e17f5c16260dfdd6d3ea76f65 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 8 Mar 2021 10:03:20 +0100
-Subject: [PATCH] firmware: bcm47xx_nvram: inline code checking NVRAM size
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Separated function was not improving code quality much (or at all).
-Moreover it expected possible flash end address as argument and it was
-returning NVRAM size.
-
-The new code always operates on offsets which means less logic and less
-calculations.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
----
- drivers/firmware/broadcom/bcm47xx_nvram.c | 25 +++++++----------------
- 1 file changed, 7 insertions(+), 18 deletions(-)
-
---- a/drivers/firmware/broadcom/bcm47xx_nvram.c
-+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
-@@ -42,18 +42,6 @@ static bool bcm47xx_nvram_is_valid(void
- return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC;
- }
-
--static u32 find_nvram_size(void __iomem *end)
--{
-- int i;
--
-- for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
-- if (bcm47xx_nvram_is_valid(end - nvram_sizes[i]))
-- return nvram_sizes[i];
-- }
--
-- return 0;
--}
--
- /**
- * bcm47xx_nvram_copy - copy NVRAM to internal buffer
- */
-@@ -85,7 +73,7 @@ static int bcm47xx_nvram_find_and_copy(v
- {
- size_t flash_size;
- size_t offset;
-- u32 size;
-+ int i;
-
- if (nvram_len) {
- pr_warn("nvram already initialized\n");
-@@ -93,12 +81,13 @@ static int bcm47xx_nvram_find_and_copy(v
- }
-
- /* TODO: when nvram is on nand flash check for bad blocks first. */
-+
-+ /* Try every possible flash size and check for NVRAM at its end */
- for (flash_size = FLASH_MIN; flash_size <= res_size; flash_size <<= 1) {
-- /* Windowed flash access */
-- size = find_nvram_size(flash_start + flash_size);
-- if (size) {
-- offset = flash_size - size;
-- goto found;
-+ for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
-+ offset = flash_size - nvram_sizes[i];
-+ if (bcm47xx_nvram_is_valid(flash_start + offset))
-+ goto found;
- }
- }
-
diff --git a/target/linux/generic/backport-5.4/850-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch b/target/linux/generic/backport-5.4/850-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch
deleted file mode 100644
index 494c88a496..0000000000
--- a/target/linux/generic/backport-5.4/850-v5.13-usb-ehci-add-spurious-flag-to-disable-overcurrent-ch.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 2d5ba37461013253d2ff0a3641b727fd32ea97a9 Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <florian@openwrt.org>
-Date: Tue, 23 Feb 2021 18:44:53 +0100
-Subject: [PATCH 1/3] usb: ehci: add spurious flag to disable overcurrent
- checking
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds an ignore_oc flag which can be set by EHCI controller
-not supporting or wanting to disable overcurrent checking. The EHCI
-platform data in include/linux/usb/ehci_pdriver.h is also augmented to
-take advantage of this new flag.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
-Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-Link: https://lore.kernel.org/r/20210223174455.1378-2-noltari@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/host/ehci-hcd.c | 2 +-
- drivers/usb/host/ehci-hub.c | 4 ++--
- drivers/usb/host/ehci-platform.c | 2 ++
- drivers/usb/host/ehci.h | 1 +
- include/linux/usb/ehci_pdriver.h | 1 +
- 5 files changed, 7 insertions(+), 3 deletions(-)
-
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -660,7 +660,7 @@ static int ehci_run (struct usb_hcd *hcd
- "USB %x.%x started, EHCI %x.%02x%s\n",
- ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
- temp >> 8, temp & 0xff,
-- ignore_oc ? ", overcurrent ignored" : "");
-+ (ignore_oc || ehci->spurious_oc) ? ", overcurrent ignored" : "");
-
- ehci_writel(ehci, INTR_MASK,
- &ehci->regs->intr_enable); /* Turn On Interrupts */
---- a/drivers/usb/host/ehci-hub.c
-+++ b/drivers/usb/host/ehci-hub.c
-@@ -643,7 +643,7 @@ ehci_hub_status_data (struct usb_hcd *hc
- * always set, seem to clear PORT_OCC and PORT_CSC when writing to
- * PORT_POWER; that's surprising, but maybe within-spec.
- */
-- if (!ignore_oc)
-+ if (!ignore_oc && !ehci->spurious_oc)
- mask = PORT_CSC | PORT_PEC | PORT_OCC;
- else
- mask = PORT_CSC | PORT_PEC;
-@@ -1013,7 +1013,7 @@ int ehci_hub_control(
- if (temp & PORT_PEC)
- status |= USB_PORT_STAT_C_ENABLE << 16;
-
-- if ((temp & PORT_OCC) && !ignore_oc){
-+ if ((temp & PORT_OCC) && (!ignore_oc && !ehci->spurious_oc)){
- status |= USB_PORT_STAT_C_OVERCURRENT << 16;
-
- /*
---- a/drivers/usb/host/ehci-platform.c
-+++ b/drivers/usb/host/ehci-platform.c
-@@ -325,6 +325,8 @@ static int ehci_platform_probe(struct pl
- hcd->has_tt = 1;
- if (pdata->reset_on_resume)
- priv->reset_on_resume = true;
-+ if (pdata->spurious_oc)
-+ ehci->spurious_oc = 1;
-
- #ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
- if (ehci->big_endian_mmio) {
---- a/drivers/usb/host/ehci.h
-+++ b/drivers/usb/host/ehci.h
-@@ -219,6 +219,7 @@ struct ehci_hcd { /* one per controlle
- unsigned need_oc_pp_cycle:1; /* MPC834X port power */
- unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
- unsigned is_aspeed:1;
-+ unsigned spurious_oc:1;
-
- /* required for usb32 quirk */
- #define OHCI_CTRL_HCFS (3 << 6)
---- a/include/linux/usb/ehci_pdriver.h
-+++ b/include/linux/usb/ehci_pdriver.h
-@@ -50,6 +50,7 @@ struct usb_ehci_pdata {
- unsigned no_io_watchdog:1;
- unsigned reset_on_resume:1;
- unsigned dma_mask_64:1;
-+ unsigned spurious_oc:1;
-
- /* Turn on all power and clocks */
- int (*power_on)(struct platform_device *pdev);
diff --git a/target/linux/generic/backport-5.4/851-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch b/target/linux/generic/backport-5.4/851-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch
deleted file mode 100644
index 6faefeb79c..0000000000
--- a/target/linux/generic/backport-5.4/851-v5.13-usb-host-ehci-platform-add-spurious_oc-DT-support.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 4da57dbbffdfa7fe4e2b70b047fc5ff95ff25a3d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
-Date: Tue, 23 Feb 2021 18:44:55 +0100
-Subject: [PATCH 3/3] usb: host: ehci-platform: add spurious_oc DT support
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Over-current reporting isn't supported on some platforms such as bcm63xx.
-These devices will incorrectly report over-current if this flag isn't properly
-activated.
-
-Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-Link: https://lore.kernel.org/r/20210223174455.1378-4-noltari@gmail.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/host/ehci-platform.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/usb/host/ehci-platform.c
-+++ b/drivers/usb/host/ehci-platform.c
-@@ -278,6 +278,9 @@ static int ehci_platform_probe(struct pl
- if (of_property_read_bool(dev->dev.of_node, "big-endian"))
- ehci->big_endian_mmio = ehci->big_endian_desc = 1;
-
-+ if (of_property_read_bool(dev->dev.of_node, "spurious-oc"))
-+ ehci->spurious_oc = 1;
-+
- if (of_property_read_bool(dev->dev.of_node,
- "needs-reset-on-resume"))
- priv->reset_on_resume = true;
diff --git a/target/linux/generic/backport-5.4/852-v5.10-0001-net-sfp-VSOL-V2801F-CarlitoxxPro-CPGOS03-0490-v2.0-w.patch b/target/linux/generic/backport-5.4/852-v5.10-0001-net-sfp-VSOL-V2801F-CarlitoxxPro-CPGOS03-0490-v2.0-w.patch
deleted file mode 100644
index 1901054a10..0000000000
--- a/target/linux/generic/backport-5.4/852-v5.10-0001-net-sfp-VSOL-V2801F-CarlitoxxPro-CPGOS03-0490-v2.0-w.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From 0d035bed2a4a6c4878518749348be61bf082d12a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Wed, 9 Dec 2020 11:22:49 +0000
-Subject: [PATCH] net: sfp: VSOL V2801F / CarlitoxxPro CPGOS03-0490 v2.0
- workaround
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a workaround for the detection of VSOL V2801F / CarlitoxxPro
-CPGOS03-0490 v2.0 GPON module which CarlitoxxPro states needs single
-byte I2C reads to the EEPROM.
-
-Pali Rohár reports that he also has a CarlitoxxPro-based V2801F module,
-which reports a manufacturer of "OEM". This manufacturer can't be
-matched as it appears in many different modules, so also match the part
-number too.
-
-Reported-by: Thomas Schreiber <tschreibe@gmail.com>
-Reported-by: Pali Rohár <pali@kernel.org>
-Tested-by: Pali Rohár <pali@kernel.org>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/sfp.c | 63 +++++++++++++++++++++++++++++++++++++++----
- 1 file changed, 58 insertions(+), 5 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -191,6 +191,7 @@ struct sfp {
- struct sfp_bus *sfp_bus;
- struct phy_device *mod_phy;
- const struct sff_data *type;
-+ size_t i2c_block_size;
- u32 max_power_mW;
-
- unsigned int (*get_state)(struct sfp *);
-@@ -305,10 +306,19 @@ static int sfp_i2c_read(struct sfp *sfp,
- size_t len)
- {
- struct i2c_msg msgs[2];
-- u8 bus_addr = a2 ? 0x51 : 0x50;
-+ size_t block_size;
- size_t this_len;
-+ u8 bus_addr;
- int ret;
-
-+ if (a2) {
-+ block_size = 16;
-+ bus_addr = 0x51;
-+ } else {
-+ block_size = sfp->i2c_block_size;
-+ bus_addr = 0x50;
-+ }
-+
- msgs[0].addr = bus_addr;
- msgs[0].flags = 0;
- msgs[0].len = 1;
-@@ -320,8 +330,8 @@ static int sfp_i2c_read(struct sfp *sfp,
-
- while (len) {
- this_len = len;
-- if (this_len > 16)
-- this_len = 16;
-+ if (this_len > block_size)
-+ this_len = block_size;
-
- msgs[1].len = this_len;
-
-@@ -1569,6 +1579,28 @@ static int sfp_sm_mod_hpower(struct sfp
- return 0;
- }
-
-+/* Some modules (Nokia 3FE46541AA) lock up if byte 0x51 is read as a
-+ * single read. Switch back to reading 16 byte blocks unless we have
-+ * a CarlitoxxPro module (rebranded VSOL V2801F). Even more annoyingly,
-+ * some VSOL V2801F have the vendor name changed to OEM.
-+ */
-+static int sfp_quirk_i2c_block_size(const struct sfp_eeprom_base *base)
-+{
-+ if (!memcmp(base->vendor_name, "VSOL ", 16))
-+ return 1;
-+ if (!memcmp(base->vendor_name, "OEM ", 16) &&
-+ !memcmp(base->vendor_pn, "V2801F ", 16))
-+ return 1;
-+
-+ /* Some modules can't cope with long reads */
-+ return 16;
-+}
-+
-+static void sfp_quirks_base(struct sfp *sfp, const struct sfp_eeprom_base *base)
-+{
-+ sfp->i2c_block_size = sfp_quirk_i2c_block_size(base);
-+}
-+
- static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
- {
- /* SFP module inserted - read I2C data */
-@@ -1577,14 +1609,20 @@ static int sfp_sm_mod_probe(struct sfp *
- u8 check;
- int ret;
-
-- ret = sfp_read(sfp, false, 0, &id, sizeof(id));
-+ /* Some modules (CarlitoxxPro CPGOS03-0490) do not support multibyte
-+ * reads from the EEPROM, so start by reading the base identifying
-+ * information one byte at a time.
-+ */
-+ sfp->i2c_block_size = 1;
-+
-+ ret = sfp_read(sfp, false, 0, &id.base, sizeof(id.base));
- if (ret < 0) {
- if (report)
- dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret);
- return -EAGAIN;
- }
-
-- if (ret != sizeof(id)) {
-+ if (ret != sizeof(id.base)) {
- dev_err(sfp->dev, "EEPROM short read: %d\n", ret);
- return -EAGAIN;
- }
-@@ -1612,6 +1650,21 @@ static int sfp_sm_mod_probe(struct sfp *
- }
- }
-
-+ /* Apply any early module-specific quirks */
-+ sfp_quirks_base(sfp, &id.base);
-+
-+ ret = sfp_read(sfp, false, SFP_CC_BASE + 1, &id.ext, sizeof(id.ext));
-+ if (ret < 0) {
-+ if (report)
-+ dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret);
-+ return -EAGAIN;
-+ }
-+
-+ if (ret != sizeof(id.ext)) {
-+ dev_err(sfp->dev, "EEPROM short read: %d\n", ret);
-+ return -EAGAIN;
-+ }
-+
- check = sfp_check(&id.ext, sizeof(id.ext) - 1);
- if (check != id.ext.cc_ext) {
- if (cotsworks) {
diff --git a/target/linux/generic/backport-5.4/852-v5.10-0002-net-sfp-add-workaround-for-Realtek-RTL8672-and-RTL96.patch b/target/linux/generic/backport-5.4/852-v5.10-0002-net-sfp-add-workaround-for-Realtek-RTL8672-and-RTL96.patch
deleted file mode 100644
index 27ae97cee7..0000000000
--- a/target/linux/generic/backport-5.4/852-v5.10-0002-net-sfp-add-workaround-for-Realtek-RTL8672-and-RTL96.patch
+++ /dev/null
@@ -1,211 +0,0 @@
-From 426c6cbc409cbda9ab1a9dbf15d3c2ef947eb8c1 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
-Date: Mon, 25 Jan 2021 16:02:27 +0100
-Subject: [PATCH] net: sfp: add workaround for Realtek RTL8672 and RTL9601C
- chips
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The workaround for VSOL V2801F brand based GPON SFP modules added in commit
-0d035bed2a4a ("net: sfp: VSOL V2801F / CarlitoxxPro CPGOS03-0490 v2.0
-workaround") works only for IDs added explicitly to the list. Since there
-are rebranded modules where OEM vendors put different strings into the
-vendor name field, we cannot base workaround on IDs only.
-
-Moreover the issue which the above mentioned commit tried to work around is
-generic not only to VSOL based modules, but rather to all GPON modules
-based on Realtek RTL8672 and RTL9601C chips.
-
-These include at least the following GPON modules:
-* V-SOL V2801F
-* C-Data FD511GX-RM0
-* OPTON GP801R
-* BAUDCOM BD-1234-SFM
-* CPGOS03-0490 v2.0
-* Ubiquiti U-Fiber Instant
-* EXOT EGS1
-
-These Realtek chips have broken EEPROM emulator which for N-byte read
-operation returns just the first byte of EEPROM data, followed by N-1
-zeros.
-
-Introduce a new function, sfp_id_needs_byte_io(), which detects SFP modules
-with broken EEPROM emulator based on N-1 zeros and switch to 1 byte EEPROM
-reading operation.
-
-Function sfp_i2c_read() now always uses single byte reading when it is
-required and when function sfp_hwmon_probe() detects single byte access,
-it disables registration of hwmon device, because in this case we cannot
-reliably and atomically read 2 bytes as is required by the standard for
-retrieving values from diagnostic area.
-
-(These Realtek chips are broken in a way that violates SFP standards for
-diagnostic interface. Kernel in this case simply cannot do anything less
-of skipping registration of the hwmon interface.)
-
-This patch fixes reading of EEPROM content from SFP modules based on
-Realtek RTL8672 and RTL9601C chips. Diagnostic interface of EEPROM stays
-broken and cannot be fixed.
-
-Fixes: 0d035bed2a4a ("net: sfp: VSOL V2801F / CarlitoxxPro CPGOS03-0490 v2.0 workaround")
-Co-developed-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: Pali Rohár <pali@kernel.org>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- drivers/net/phy/sfp.c | 100 ++++++++++++++++++++++++++++--------------
- 1 file changed, 67 insertions(+), 33 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -306,19 +306,11 @@ static int sfp_i2c_read(struct sfp *sfp,
- size_t len)
- {
- struct i2c_msg msgs[2];
-- size_t block_size;
-+ u8 bus_addr = a2 ? 0x51 : 0x50;
-+ size_t block_size = sfp->i2c_block_size;
- size_t this_len;
-- u8 bus_addr;
- int ret;
-
-- if (a2) {
-- block_size = 16;
-- bus_addr = 0x51;
-- } else {
-- block_size = sfp->i2c_block_size;
-- bus_addr = 0x50;
-- }
--
- msgs[0].addr = bus_addr;
- msgs[0].flags = 0;
- msgs[0].len = 1;
-@@ -1245,6 +1237,20 @@ static void sfp_hwmon_probe(struct work_
- struct sfp *sfp = container_of(work, struct sfp, hwmon_probe.work);
- int err, i;
-
-+ /* hwmon interface needs to access 16bit registers in atomic way to
-+ * guarantee coherency of the diagnostic monitoring data. If it is not
-+ * possible to guarantee coherency because EEPROM is broken in such way
-+ * that does not support atomic 16bit read operation then we have to
-+ * skip registration of hwmon device.
-+ */
-+ if (sfp->i2c_block_size < 2) {
-+ dev_info(sfp->dev,
-+ "skipping hwmon device registration due to broken EEPROM\n");
-+ dev_info(sfp->dev,
-+ "diagnostic EEPROM area cannot be read atomically to guarantee data coherency\n");
-+ return;
-+ }
-+
- err = sfp_read(sfp, true, 0, &sfp->diag, sizeof(sfp->diag));
- if (err < 0) {
- if (sfp->hwmon_tries--) {
-@@ -1579,26 +1585,30 @@ static int sfp_sm_mod_hpower(struct sfp
- return 0;
- }
-
--/* Some modules (Nokia 3FE46541AA) lock up if byte 0x51 is read as a
-- * single read. Switch back to reading 16 byte blocks unless we have
-- * a CarlitoxxPro module (rebranded VSOL V2801F). Even more annoyingly,
-- * some VSOL V2801F have the vendor name changed to OEM.
-+/* GPON modules based on Realtek RTL8672 and RTL9601C chips (e.g. V-SOL
-+ * V2801F, CarlitoxxPro CPGOS03-0490, Ubiquiti U-Fiber Instant, ...) do
-+ * not support multibyte reads from the EEPROM. Each multi-byte read
-+ * operation returns just one byte of EEPROM followed by zeros. There is
-+ * no way to identify which modules are using Realtek RTL8672 and RTL9601C
-+ * chips. Moreover every OEM of V-SOL V2801F module puts its own vendor
-+ * name and vendor id into EEPROM, so there is even no way to detect if
-+ * module is V-SOL V2801F. Therefore check for those zeros in the read
-+ * data and then based on check switch to reading EEPROM to one byte
-+ * at a time.
- */
--static int sfp_quirk_i2c_block_size(const struct sfp_eeprom_base *base)
-+static bool sfp_id_needs_byte_io(struct sfp *sfp, void *buf, size_t len)
- {
-- if (!memcmp(base->vendor_name, "VSOL ", 16))
-- return 1;
-- if (!memcmp(base->vendor_name, "OEM ", 16) &&
-- !memcmp(base->vendor_pn, "V2801F ", 16))
-- return 1;
-+ size_t i, block_size = sfp->i2c_block_size;
-
-- /* Some modules can't cope with long reads */
-- return 16;
--}
-+ /* Already using byte IO */
-+ if (block_size == 1)
-+ return false;
-
--static void sfp_quirks_base(struct sfp *sfp, const struct sfp_eeprom_base *base)
--{
-- sfp->i2c_block_size = sfp_quirk_i2c_block_size(base);
-+ for (i = 1; i < len; i += block_size) {
-+ if (memchr_inv(buf + i, '\0', min(block_size - 1, len - i)))
-+ return false;
-+ }
-+ return true;
- }
-
- static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
-@@ -1609,11 +1619,11 @@ static int sfp_sm_mod_probe(struct sfp *
- u8 check;
- int ret;
-
-- /* Some modules (CarlitoxxPro CPGOS03-0490) do not support multibyte
-- * reads from the EEPROM, so start by reading the base identifying
-- * information one byte at a time.
-+ /* Some SFP modules and also some Linux I2C drivers do not like reads
-+ * longer than 16 bytes, so read the EEPROM in chunks of 16 bytes at
-+ * a time.
- */
-- sfp->i2c_block_size = 1;
-+ sfp->i2c_block_size = 16;
-
- ret = sfp_read(sfp, false, 0, &id.base, sizeof(id.base));
- if (ret < 0) {
-@@ -1627,6 +1637,33 @@ static int sfp_sm_mod_probe(struct sfp *
- return -EAGAIN;
- }
-
-+ /* Some SFP modules (e.g. Nokia 3FE46541AA) lock up if read from
-+ * address 0x51 is just one byte at a time. Also SFF-8472 requires
-+ * that EEPROM supports atomic 16bit read operation for diagnostic
-+ * fields, so do not switch to one byte reading at a time unless it
-+ * is really required and we have no other option.
-+ */
-+ if (sfp_id_needs_byte_io(sfp, &id.base, sizeof(id.base))) {
-+ dev_info(sfp->dev,
-+ "Detected broken RTL8672/RTL9601C emulated EEPROM\n");
-+ dev_info(sfp->dev,
-+ "Switching to reading EEPROM to one byte at a time\n");
-+ sfp->i2c_block_size = 1;
-+
-+ ret = sfp_read(sfp, false, 0, &id.base, sizeof(id.base));
-+ if (ret < 0) {
-+ if (report)
-+ dev_err(sfp->dev, "failed to read EEPROM: %d\n",
-+ ret);
-+ return -EAGAIN;
-+ }
-+
-+ if (ret != sizeof(id.base)) {
-+ dev_err(sfp->dev, "EEPROM short read: %d\n", ret);
-+ return -EAGAIN;
-+ }
-+ }
-+
- /* Cotsworks do not seem to update the checksums when they
- * do the final programming with the final module part number,
- * serial number and date code.
-@@ -1650,9 +1687,6 @@ static int sfp_sm_mod_probe(struct sfp *
- }
- }
-
-- /* Apply any early module-specific quirks */
-- sfp_quirks_base(sfp, &id.base);
--
- ret = sfp_read(sfp, false, SFP_CC_BASE + 1, &id.ext, sizeof(id.ext));
- if (ret < 0) {
- if (report)
diff --git a/target/linux/generic/backport-5.4/900-v5.9-0001-dt-bindings-Add-multicolor-class-dt-bindings-documen.patch b/target/linux/generic/backport-5.4/900-v5.9-0001-dt-bindings-Add-multicolor-class-dt-bindings-documen.patch
deleted file mode 100644
index acc32b69fb..0000000000
--- a/target/linux/generic/backport-5.4/900-v5.9-0001-dt-bindings-Add-multicolor-class-dt-bindings-documen.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From 5c7f8ffe741daae7f8d811a2037b2693f02c90c5 Mon Sep 17 00:00:00 2001
-From: Dan Murphy <dmurphy@ti.com>
-Date: Mon, 13 Jul 2020 10:45:31 -0500
-Subject: [PATCH] dt: bindings: Add multicolor class dt bindings documention
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add DT bindings for the LEDs multicolor class framework.
-Add multicolor ID to the color ID list for device tree bindings.
-
-CC: Rob Herring <robh@kernel.org>
-Reviewed-by: Rob Herring <robh@kernel.org>
-Acked-by: Pavel Machek <pavel@ucw.cz>
-Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
-Signed-off-by: Dan Murphy <dmurphy@ti.com>
-Reviewed-by: Marek Behún <marek.behun@nic.cz>
-Signed-off-by: Pavel Machek <pavel@ucw.cz>
----
- .../bindings/leds/leds-class-multicolor.yaml | 37 +++++++++++++++++++
- include/dt-bindings/leds/common.h | 3 +-
- 2 files changed, 39 insertions(+), 1 deletion(-)
- create mode 100644 Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/leds/leds-class-multicolor.yaml
-@@ -0,0 +1,37 @@
-+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/leds/leds-class-multicolor.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Common properties for the multicolor LED class.
-+
-+maintainers:
-+ - Dan Murphy <dmurphy@ti.com>
-+
-+description: |
-+ Bindings for multi color LEDs show how to describe current outputs of
-+ either integrated multi-color LED elements (like RGB, RGBW, RGBWA-UV
-+ etc.) or standalone LEDs, to achieve logically grouped multi-color LED
-+ modules. This is achieved by adding multi-led nodes layer to the
-+ monochrome LED bindings.
-+ The nodes and properties defined in this document are unique to the multicolor
-+ LED class. Common LED nodes and properties are inherited from the common.txt
-+ within this documentation directory.
-+
-+patternProperties:
-+ "^multi-led@([0-9a-f])$":
-+ type: object
-+ description: Represents the LEDs that are to be grouped.
-+ properties:
-+ color:
-+ const: 8 # LED_COLOR_ID_MULTI
-+ description: |
-+ For multicolor LED support this property should be defined as
-+ LED_COLOR_ID_MULTI which can be found in include/linux/leds/common.h.
-+
-+ $ref: "common.yaml#"
-+
-+ required:
-+ - color
-+...
---- a/include/dt-bindings/leds/common.h
-+++ b/include/dt-bindings/leds/common.h
-@@ -29,7 +29,8 @@
- #define LED_COLOR_ID_VIOLET 5
- #define LED_COLOR_ID_YELLOW 6
- #define LED_COLOR_ID_IR 7
--#define LED_COLOR_ID_MAX 8
-+#define LED_COLOR_ID_MULTI 8
-+#define LED_COLOR_ID_MAX 9
-
- /* Standard LED functions */
- #define LED_FUNCTION_ACTIVITY "activity"
diff --git a/target/linux/generic/backport-5.4/900-v5.9-0002-leds-Add-multicolor-ID-to-the-color-ID-list.patch b/target/linux/generic/backport-5.4/900-v5.9-0002-leds-Add-multicolor-ID-to-the-color-ID-list.patch
deleted file mode 100644
index 5de5dbda04..0000000000
--- a/target/linux/generic/backport-5.4/900-v5.9-0002-leds-Add-multicolor-ID-to-the-color-ID-list.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 10d3e0d815879129e916cd83e1034438e06efdaa Mon Sep 17 00:00:00 2001
-From: Dan Murphy <dmurphy@ti.com>
-Date: Mon, 13 Jul 2020 10:45:32 -0500
-Subject: [PATCH] leds: Add multicolor ID to the color ID list
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add a new color ID that is declared as MULTICOLOR as with the
-multicolor framework declaring a definitive color is not accurate
-as the node can contain multiple colors.
-
-Signed-off-by: Dan Murphy <dmurphy@ti.com>
-Reviewed-by: Marek Behún <marek.behun@nic.cz>
-Signed-off-by: Pavel Machek <pavel@ucw.cz>
----
- drivers/leds/led-core.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/leds/led-core.c
-+++ b/drivers/leds/led-core.c
-@@ -34,6 +34,7 @@ const char * const led_colors[LED_COLOR_
- [LED_COLOR_ID_VIOLET] = "violet",
- [LED_COLOR_ID_YELLOW] = "yellow",
- [LED_COLOR_ID_IR] = "ir",
-+ [LED_COLOR_ID_MULTI] = "multicolor",
- };
- EXPORT_SYMBOL_GPL(led_colors);
-
diff --git a/target/linux/generic/backport-5.4/900-v5.9-0003-leds-add-RGB-color-option-as-that-is-different-from-.patch b/target/linux/generic/backport-5.4/900-v5.9-0003-leds-add-RGB-color-option-as-that-is-different-from-.patch
deleted file mode 100644
index 17c28149f6..0000000000
--- a/target/linux/generic/backport-5.4/900-v5.9-0003-leds-add-RGB-color-option-as-that-is-different-from-.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 54212f5a1ba3123281877e54c1e5f672bf7563d8 Mon Sep 17 00:00:00 2001
-From: Pavel Machek <pavel@ucw.cz>
-Date: Mon, 3 Aug 2020 13:20:06 +0200
-Subject: [PATCH] leds: add RGB color option, as that is different from
- multicolor.
-
-Multicolor is a bit too abstract. Yes, we can have
-Green-Magenta-Ultraviolet LED, but so far all the LEDs we support are
-RGB, and not even RGB-White or RGB-Yellow variants emerged.
-
-Multicolor is not a good fit for RGB LED. It does not really know
-about LED color. In particular, there's no way to make LED "white".
-
-Userspace is interested in knowing "this LED can produce arbitrary
-color", which not all multicolor LEDs can.
-
-Signed-off-by: Pavel Machek <pavel@ucw.cz>
----
- drivers/leds/led-core.c | 1 +
- drivers/leds/leds-lp55xx-common.c | 2 +-
- include/dt-bindings/leds/common.h | 6 ++++--
- 3 files changed, 6 insertions(+), 3 deletions(-)
-
---- a/drivers/leds/led-core.c
-+++ b/drivers/leds/led-core.c
-@@ -35,6 +35,7 @@ const char * const led_colors[LED_COLOR_
- [LED_COLOR_ID_YELLOW] = "yellow",
- [LED_COLOR_ID_IR] = "ir",
- [LED_COLOR_ID_MULTI] = "multicolor",
-+ [LED_COLOR_ID_RGB] = "rgb",
- };
- EXPORT_SYMBOL_GPL(led_colors);
-
---- a/include/dt-bindings/leds/common.h
-+++ b/include/dt-bindings/leds/common.h
-@@ -29,8 +29,10 @@
- #define LED_COLOR_ID_VIOLET 5
- #define LED_COLOR_ID_YELLOW 6
- #define LED_COLOR_ID_IR 7
--#define LED_COLOR_ID_MULTI 8
--#define LED_COLOR_ID_MAX 9
-+#define LED_COLOR_ID_MULTI 8 /* For multicolor LEDs */
-+#define LED_COLOR_ID_RGB 9 /* For multicolor LEDs that can do arbitrary color,
-+ so this would include RGBW and similar */
-+#define LED_COLOR_ID_MAX 10
-
- /* Standard LED functions */
- #define LED_FUNCTION_ACTIVITY "activity"
diff --git a/target/linux/generic/config-5.4 b/target/linux/generic/config-5.4
deleted file mode 100644
index 151f0ec1f3..0000000000
--- a/target/linux/generic/config-5.4
+++ /dev/null
@@ -1,6603 +0,0 @@
-# CONFIG_104_QUAD_8 is not set
-CONFIG_32BIT=y
-CONFIG_64BIT_TIME=y
-# CONFIG_6LOWPAN is not set
-# CONFIG_6LOWPAN_DEBUGFS is not set
-# CONFIG_6PACK is not set
-# CONFIG_8139CP is not set
-# CONFIG_8139TOO is not set
-# CONFIG_9P_FS is not set
-# CONFIG_AB3100_CORE is not set
-# CONFIG_AB8500_CORE is not set
-# CONFIG_ABP060MG is not set
-# CONFIG_ABX500_CORE is not set
-# CONFIG_ACCESSIBILITY is not set
-# CONFIG_ACENIC is not set
-# CONFIG_ACERHDF is not set
-# CONFIG_ACER_WIRELESS is not set
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_ACPI_ALS is not set
-# CONFIG_ACPI_APEI is not set
-# CONFIG_ACPI_BUTTON is not set
-# CONFIG_ACPI_CONFIGFS is not set
-# CONFIG_ACPI_CUSTOM_METHOD is not set
-# CONFIG_ACPI_EXTLOG is not set
-# CONFIG_ACPI_HED is not set
-# CONFIG_ACPI_NFIT is not set
-# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
-# CONFIG_ACPI_TABLE_UPGRADE is not set
-# CONFIG_ACPI_VIDEO is not set
-# CONFIG_AD2S1200 is not set
-# CONFIG_AD2S1210 is not set
-# CONFIG_AD2S90 is not set
-# CONFIG_AD5064 is not set
-# CONFIG_AD525X_DPOT is not set
-# CONFIG_AD5272 is not set
-# CONFIG_AD5360 is not set
-# CONFIG_AD5380 is not set
-# CONFIG_AD5421 is not set
-# CONFIG_AD5446 is not set
-# CONFIG_AD5449 is not set
-# CONFIG_AD5504 is not set
-# CONFIG_AD5592R is not set
-# CONFIG_AD5593R is not set
-# CONFIG_AD5624R_SPI is not set
-# CONFIG_AD5686 is not set
-# CONFIG_AD5686_SPI is not set
-# CONFIG_AD5696_I2C is not set
-# CONFIG_AD5755 is not set
-# CONFIG_AD5758 is not set
-# CONFIG_AD5761 is not set
-# CONFIG_AD5764 is not set
-# CONFIG_AD5791 is not set
-# CONFIG_AD5933 is not set
-# CONFIG_AD7124 is not set
-# CONFIG_AD7150 is not set
-# CONFIG_AD7152 is not set
-# CONFIG_AD7192 is not set
-# CONFIG_AD7266 is not set
-# CONFIG_AD7280 is not set
-# CONFIG_AD7291 is not set
-# CONFIG_AD7298 is not set
-# CONFIG_AD7303 is not set
-# CONFIG_AD7476 is not set
-# CONFIG_AD7606 is not set
-# CONFIG_AD7606_IFACE_PARALLEL is not set
-# CONFIG_AD7606_IFACE_SPI is not set
-# CONFIG_AD7746 is not set
-# CONFIG_AD7766 is not set
-# CONFIG_AD7768_1 is not set
-# CONFIG_AD7780 is not set
-# CONFIG_AD7791 is not set
-# CONFIG_AD7793 is not set
-# CONFIG_AD7816 is not set
-# CONFIG_AD7887 is not set
-# CONFIG_AD7923 is not set
-# CONFIG_AD7949 is not set
-# CONFIG_AD799X is not set
-# CONFIG_AD8366 is not set
-# CONFIG_AD8801 is not set
-# CONFIG_AD9523 is not set
-# CONFIG_AD9832 is not set
-# CONFIG_AD9834 is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_ADE7854 is not set
-# CONFIG_ADF4350 is not set
-# CONFIG_ADF4371 is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADIN_PHY is not set
-# CONFIG_ADIS16080 is not set
-# CONFIG_ADIS16130 is not set
-# CONFIG_ADIS16136 is not set
-# CONFIG_ADIS16201 is not set
-# CONFIG_ADIS16203 is not set
-# CONFIG_ADIS16209 is not set
-# CONFIG_ADIS16240 is not set
-# CONFIG_ADIS16260 is not set
-# CONFIG_ADIS16400 is not set
-# CONFIG_ADIS16460 is not set
-# CONFIG_ADIS16480 is not set
-# CONFIG_ADJD_S311 is not set
-# CONFIG_ADM6996_PHY is not set
-# CONFIG_ADM8211 is not set
-# CONFIG_ADT7316 is not set
-CONFIG_ADVISE_SYSCALLS=y
-# CONFIG_ADXL345_I2C is not set
-# CONFIG_ADXL345_SPI is not set
-# CONFIG_ADXL372_I2C is not set
-# CONFIG_ADXL372_SPI is not set
-# CONFIG_ADXRS450 is not set
-CONFIG_AEABI=y
-# CONFIG_AFE4403 is not set
-# CONFIG_AFE4404 is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_AFS_DEBUG_CURSOR is not set
-# CONFIG_AFS_FS is not set
-# CONFIG_AF_KCM is not set
-# CONFIG_AF_RXRPC is not set
-# CONFIG_AF_RXRPC_INJECT_LOSS is not set
-# CONFIG_AF_RXRPC_IPV6 is not set
-# CONFIG_AGP is not set
-# CONFIG_AHCI_CEVA is not set
-# CONFIG_AHCI_IMX is not set
-# CONFIG_AHCI_MVEBU is not set
-# CONFIG_AHCI_QORIQ is not set
-# CONFIG_AHCI_XGENE is not set
-CONFIG_AIO=y
-# CONFIG_AIRO is not set
-# CONFIG_AIRO_CS is not set
-# CONFIG_AIX_PARTITION is not set
-# CONFIG_AK09911 is not set
-# CONFIG_AK8974 is not set
-# CONFIG_AK8975 is not set
-# CONFIG_AL3320A is not set
-# CONFIG_ALIM7101_WDT is not set
-CONFIG_ALLOW_DEV_COREDUMP=y
-# CONFIG_ALTERA_MBOX is not set
-# CONFIG_ALTERA_MSGDMA is not set
-# CONFIG_ALTERA_STAPL is not set
-# CONFIG_ALTERA_TSE is not set
-# CONFIG_ALX is not set
-# CONFIG_AL_FIC is not set
-# CONFIG_AM2315 is not set
-# CONFIG_AM335X_PHY_USB is not set
-# CONFIG_AMBA_PL08X is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_AMD_MEM_ENCRYPT is not set
-# CONFIG_AMD_PHY is not set
-# CONFIG_AMD_XGBE is not set
-# CONFIG_AMD_XGBE_HAVE_ECC is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_AMILO_RFKILL is not set
-# CONFIG_ANDROID is not set
-CONFIG_ANON_INODES=y
-# CONFIG_APDS9300 is not set
-# CONFIG_APDS9802ALS is not set
-# CONFIG_APDS9960 is not set
-# CONFIG_APM8018X is not set
-# CONFIG_APM_EMULATION is not set
-# CONFIG_APPLE_GMUX is not set
-# CONFIG_APPLE_PROPERTIES is not set
-# CONFIG_APPLICOM is not set
-# CONFIG_AQTION is not set
-# CONFIG_AQUANTIA_PHY is not set
-# CONFIG_AR5523 is not set
-# CONFIG_AR7 is not set
-# CONFIG_AR8216_PHY is not set
-# CONFIG_AR8216_PHY_LEDS is not set
-# CONFIG_ARCH_ACTIONS is not set
-# CONFIG_ARCH_AGILEX is not set
-# CONFIG_ARCH_ALPINE is not set
-# CONFIG_ARCH_ARTPEC is not set
-# CONFIG_ARCH_ASPEED is not set
-# CONFIG_ARCH_AT91 is not set
-# CONFIG_ARCH_AXXIA is not set
-# CONFIG_ARCH_BCM is not set
-# CONFIG_ARCH_BCM2835 is not set
-# CONFIG_ARCH_BCM_21664 is not set
-# CONFIG_ARCH_BCM_23550 is not set
-# CONFIG_ARCH_BCM_281XX is not set
-# CONFIG_ARCH_BCM_5301X is not set
-# CONFIG_ARCH_BCM_53573 is not set
-# CONFIG_ARCH_BCM_63XX is not set
-# CONFIG_ARCH_BCM_CYGNUS is not set
-# CONFIG_ARCH_BCM_IPROC is not set
-# CONFIG_ARCH_BCM_NSP is not set
-# CONFIG_ARCH_BERLIN is not set
-# CONFIG_ARCH_BITMAIN is not set
-# CONFIG_ARCH_BRCMSTB is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CNS3XXX is not set
-# CONFIG_ARCH_DAVINCI is not set
-# CONFIG_ARCH_DIGICOLOR is not set
-# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
-# CONFIG_ARCH_DOVE is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_EP93XX is not set
-# CONFIG_ARCH_EXYNOS is not set
-CONFIG_ARCH_FLATMEM_ENABLE=y
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_GEMINI is not set
-CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
-# CONFIG_ARCH_HI3xxx is not set
-# CONFIG_ARCH_HIGHBANK is not set
-# CONFIG_ARCH_HISI is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP13XX is not set
-# CONFIG_ARCH_IOP32X is not set
-# CONFIG_ARCH_IOP33X is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_K3 is not set
-# CONFIG_ARCH_KEYSTONE is not set
-# CONFIG_ARCH_KS8695 is not set
-# CONFIG_ARCH_LAYERSCAPE is not set
-# CONFIG_ARCH_LG1K is not set
-# CONFIG_ARCH_LPC32XX is not set
-# CONFIG_ARCH_MEDIATEK is not set
-# CONFIG_ARCH_MESON is not set
-# CONFIG_ARCH_MILBEAUT is not set
-CONFIG_ARCH_MMAP_RND_BITS=8
-CONFIG_ARCH_MMAP_RND_BITS_MAX=16
-CONFIG_ARCH_MMAP_RND_BITS_MIN=8
-CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
-CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
-# CONFIG_ARCH_MMP is not set
-# CONFIG_ARCH_MULTIPLATFORM is not set
-# CONFIG_ARCH_MULTI_V6 is not set
-# CONFIG_ARCH_MULTI_V7 is not set
-# CONFIG_ARCH_MV78XX0 is not set
-# CONFIG_ARCH_MVEBU is not set
-# CONFIG_ARCH_MXC is not set
-# CONFIG_ARCH_MXS is not set
-# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
-# CONFIG_ARCH_NETX is not set
-# CONFIG_ARCH_NOMADIK is not set
-# CONFIG_ARCH_NPCM is not set
-# CONFIG_ARCH_NSPIRE is not set
-# CONFIG_ARCH_OMAP is not set
-# CONFIG_ARCH_OMAP1 is not set
-# CONFIG_ARCH_OMAP2 is not set
-# CONFIG_ARCH_OMAP2PLUS is not set
-# CONFIG_ARCH_OMAP3 is not set
-# CONFIG_ARCH_OMAP4 is not set
-# CONFIG_ARCH_ORION5X is not set
-# CONFIG_ARCH_OXNAS is not set
-# CONFIG_ARCH_PICOXCELL is not set
-# CONFIG_ARCH_PRIMA2 is not set
-# CONFIG_ARCH_PXA is not set
-# CONFIG_ARCH_QCOM is not set
-# CONFIG_ARCH_RDA is not set
-# CONFIG_ARCH_REALTEK is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_RENESAS is not set
-# CONFIG_ARCH_ROCKCHIP is not set
-# CONFIG_ARCH_RPC is not set
-# CONFIG_ARCH_S3C24XX is not set
-# CONFIG_ARCH_S3C64XX is not set
-# CONFIG_ARCH_S5PV210 is not set
-# CONFIG_ARCH_SA1100 is not set
-# CONFIG_ARCH_SEATTLE is not set
-# CONFIG_ARCH_SHMOBILE is not set
-# CONFIG_ARCH_SIRF is not set
-# CONFIG_ARCH_SOCFPGA is not set
-# CONFIG_ARCH_SPRD is not set
-# CONFIG_ARCH_STI is not set
-# CONFIG_ARCH_STM32 is not set
-# CONFIG_ARCH_STRATIX10 is not set
-# CONFIG_ARCH_SUNXI is not set
-# CONFIG_ARCH_SYNQUACER is not set
-# CONFIG_ARCH_TANGO is not set
-# CONFIG_ARCH_TEGRA is not set
-# CONFIG_ARCH_THUNDER is not set
-# CONFIG_ARCH_THUNDER2 is not set
-# CONFIG_ARCH_U300 is not set
-# CONFIG_ARCH_U8500 is not set
-# CONFIG_ARCH_UNIPHIER is not set
-# CONFIG_ARCH_VERSATILE is not set
-# CONFIG_ARCH_VEXPRESS is not set
-# CONFIG_ARCH_VIRT is not set
-# CONFIG_ARCH_VT8500 is not set
-# CONFIG_ARCH_VULCAN is not set
-# CONFIG_ARCH_W90X900 is not set
-# CONFIG_ARCH_WANTS_THP_SWAP is not set
-# CONFIG_ARCH_WM8505 is not set
-# CONFIG_ARCH_WM8750 is not set
-# CONFIG_ARCH_WM8850 is not set
-# CONFIG_ARCH_XGENE is not set
-# CONFIG_ARCH_ZX is not set
-# CONFIG_ARCH_ZYNQ is not set
-# CONFIG_ARCH_ZYNQMP is not set
-# CONFIG_ARCNET is not set
-# CONFIG_ARC_EMAC is not set
-# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set
-# CONFIG_ARM64_16K_PAGES is not set
-# CONFIG_ARM64_64K_PAGES is not set
-# CONFIG_ARM64_CRYPTO is not set
-# CONFIG_ARM64_ERRATUM_1024718 is not set
-# CONFIG_ARM64_ERRATUM_1165522 is not set
-# CONFIG_ARM64_ERRATUM_1286807 is not set
-# CONFIG_ARM64_ERRATUM_1418040 is not set
-# CONFIG_ARM64_ERRATUM_1463225 is not set
-# CONFIG_ARM64_ERRATUM_1542419 is not set
-# CONFIG_ARM64_ERRATUM_819472 is not set
-# CONFIG_ARM64_ERRATUM_824069 is not set
-# CONFIG_ARM64_ERRATUM_826319 is not set
-# CONFIG_ARM64_ERRATUM_827319 is not set
-# CONFIG_ARM64_ERRATUM_832075 is not set
-# CONFIG_ARM64_ERRATUM_834220 is not set
-# CONFIG_ARM64_ERRATUM_843419 is not set
-# CONFIG_ARM64_ERRATUM_845719 is not set
-# CONFIG_ARM64_ERRATUM_858921 is not set
-# CONFIG_ARM64_HW_AFDBM is not set
-# CONFIG_ARM64_LSE_ATOMICS is not set
-# CONFIG_ARM64_MODULE_PLTS is not set
-# CONFIG_ARM64_PAN is not set
-# CONFIG_ARM64_PMEM is not set
-# CONFIG_ARM64_PSEUDO_NMI is not set
-# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
-# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
-# CONFIG_ARM64_RAS_EXTN is not set
-# CONFIG_ARM64_RELOC_TEST is not set
-CONFIG_ARM64_SW_TTBR0_PAN=y
-# CONFIG_ARM64_UAO is not set
-# CONFIG_ARM64_VA_BITS_48 is not set
-# CONFIG_ARM64_VHE is not set
-# CONFIG_ARM_APPENDED_DTB is not set
-# CONFIG_ARM_ARCH_TIMER is not set
-# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set
-# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
-# CONFIG_ARM_CCI is not set
-# CONFIG_ARM_CCI400_PMU is not set
-# CONFIG_ARM_CCI5xx_PMU is not set
-# CONFIG_ARM_CCI_PMU is not set
-# CONFIG_ARM_CCN is not set
-# CONFIG_ARM_CPUIDLE is not set
-CONFIG_ARM_CPU_TOPOLOGY=y
-# CONFIG_ARM_CRYPTO is not set
-CONFIG_ARM_DMA_MEM_BUFFERABLE=y
-# CONFIG_ARM_DSU_PMU is not set
-# CONFIG_ARM_ERRATA_326103 is not set
-# CONFIG_ARM_ERRATA_364296 is not set
-# CONFIG_ARM_ERRATA_411920 is not set
-# CONFIG_ARM_ERRATA_430973 is not set
-# CONFIG_ARM_ERRATA_458693 is not set
-# CONFIG_ARM_ERRATA_460075 is not set
-# CONFIG_ARM_ERRATA_643719 is not set
-# CONFIG_ARM_ERRATA_720789 is not set
-# CONFIG_ARM_ERRATA_742230 is not set
-# CONFIG_ARM_ERRATA_742231 is not set
-# CONFIG_ARM_ERRATA_743622 is not set
-# CONFIG_ARM_ERRATA_751472 is not set
-# CONFIG_ARM_ERRATA_754322 is not set
-# CONFIG_ARM_ERRATA_754327 is not set
-# CONFIG_ARM_ERRATA_764369 is not set
-# CONFIG_ARM_ERRATA_773022 is not set
-# CONFIG_ARM_ERRATA_775420 is not set
-# CONFIG_ARM_ERRATA_798181 is not set
-# CONFIG_ARM_ERRATA_814220 is not set
-# CONFIG_ARM_ERRATA_818325_852422 is not set
-# CONFIG_ARM_ERRATA_821420 is not set
-# CONFIG_ARM_ERRATA_825619 is not set
-# CONFIG_ARM_ERRATA_852421 is not set
-# CONFIG_ARM_ERRATA_852423 is not set
-# CONFIG_ARM_ERRATA_857271 is not set
-# CONFIG_ARM_ERRATA_857272 is not set
-CONFIG_ARM_GIC_MAX_NR=1
-# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set
-# CONFIG_ARM_KPROBES_TEST is not set
-# CONFIG_ARM_LPAE is not set
-# CONFIG_ARM_MHU is not set
-# CONFIG_ARM_MODULE_PLTS is not set
-# CONFIG_ARM_PATCH_PHYS_VIRT is not set
-# CONFIG_ARM_PSCI is not set
-# CONFIG_ARM_PSCI_CHECKER is not set
-# CONFIG_ARM_PSCI_CPUIDLE is not set
-# CONFIG_ARM_PTDUMP_DEBUGFS is not set
-# CONFIG_ARM_SBSA_WATCHDOG is not set
-# CONFIG_ARM_SCPI_PROTOCOL is not set
-# CONFIG_ARM_SDE_INTERFACE is not set
-# CONFIG_ARM_SP805_WATCHDOG is not set
-# CONFIG_ARM_SPE_PMU is not set
-# CONFIG_ARM_THUMBEE is not set
-# CONFIG_ARM_TIMER_SP804 is not set
-# CONFIG_ARM_UNWIND is not set
-# CONFIG_ARM_VIRT_EXT is not set
-# CONFIG_AS3935 is not set
-# CONFIG_ASM9260_TIMER is not set
-# CONFIG_ASUS_LAPTOP is not set
-# CONFIG_ASUS_WIRELESS is not set
-# CONFIG_ASYMMETRIC_KEY_TYPE is not set
-# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set
-# CONFIG_ASYNC_RAID6_TEST is not set
-# CONFIG_ASYNC_TX_DMA is not set
-# CONFIG_AT76C50X_USB is not set
-# CONFIG_AT803X_PHY is not set
-# CONFIG_AT91_SAMA5D2_ADC is not set
-# CONFIG_ATA is not set
-# CONFIG_ATAGS is not set
-CONFIG_ATAGS_PROC=y
-# CONFIG_ATALK is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_ATA_ACPI is not set
-CONFIG_ATA_BMDMA=y
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_ATA_LEDS is not set
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_ATA_OVER_ETH is not set
-# CONFIG_ATA_PIIX is not set
-CONFIG_ATA_SFF=y
-# CONFIG_ATA_VERBOSE_ERROR is not set
-# CONFIG_ATH10K is not set
-# CONFIG_ATH25 is not set
-# CONFIG_ATH5K is not set
-# CONFIG_ATH6KL is not set
-# CONFIG_ATH79 is not set
-# CONFIG_ATH9K is not set
-# CONFIG_ATH9K_HTC is not set
-# CONFIG_ATH_DEBUG is not set
-# CONFIG_ATL1 is not set
-# CONFIG_ATL1C is not set
-# CONFIG_ATL1E is not set
-# CONFIG_ATL2 is not set
-# CONFIG_ATLAS_PH_SENSOR is not set
-# CONFIG_ATM is not set
-# CONFIG_ATMEL is not set
-# CONFIG_ATMEL_PIT is not set
-# CONFIG_ATMEL_SSC is not set
-# CONFIG_ATM_AMBASSADOR is not set
-# CONFIG_ATM_BR2684 is not set
-CONFIG_ATM_BR2684_IPFILTER=y
-# CONFIG_ATM_CLIP is not set
-CONFIG_ATM_CLIP_NO_ICMP=y
-# CONFIG_ATM_DRIVERS is not set
-# CONFIG_ATM_DUMMY is not set
-# CONFIG_ATM_ENI is not set
-# CONFIG_ATM_FIRESTREAM is not set
-# CONFIG_ATM_FORE200E is not set
-# CONFIG_ATM_HE is not set
-# CONFIG_ATM_HORIZON is not set
-# CONFIG_ATM_IA is not set
-# CONFIG_ATM_IDT77252 is not set
-# CONFIG_ATM_LANAI is not set
-# CONFIG_ATM_LANE is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_NICSTAR is not set
-# CONFIG_ATM_SOLOS is not set
-# CONFIG_ATM_TCP is not set
-# CONFIG_ATM_ZATM is not set
-# CONFIG_ATOMIC64_SELFTEST is not set
-# CONFIG_ATP is not set
-# CONFIG_AUDIT is not set
-# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
-# CONFIG_AURORA_NB8800 is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTO_ZRELADDR is not set
-# CONFIG_AUXDISPLAY is not set
-# CONFIG_AX25 is not set
-# CONFIG_AX25_DAMA_SLAVE is not set
-# CONFIG_AX88796 is not set
-# CONFIG_AX88796B_PHY is not set
-# CONFIG_AXP20X_ADC is not set
-# CONFIG_AXP20X_POWER is not set
-# CONFIG_AXP288_ADC is not set
-# CONFIG_AXP288_FUEL_GAUGE is not set
-# CONFIG_B43 is not set
-# CONFIG_B43LEGACY is not set
-# CONFIG_B44 is not set
-# CONFIG_B53 is not set
-# CONFIG_B53_MDIO_DRIVER is not set
-# CONFIG_B53_MMAP_DRIVER is not set
-# CONFIG_B53_SERDES is not set
-# CONFIG_B53_SPI_DRIVER is not set
-# CONFIG_B53_SRAB_DRIVER is not set
-# CONFIG_BACKLIGHT_ADP8860 is not set
-# CONFIG_BACKLIGHT_ADP8870 is not set
-# CONFIG_BACKLIGHT_APPLE is not set
-# CONFIG_BACKLIGHT_ARCXCNN is not set
-# CONFIG_BACKLIGHT_BD6107 is not set
-# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
-# CONFIG_BACKLIGHT_GENERIC is not set
-# CONFIG_BACKLIGHT_GPIO is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-# CONFIG_BACKLIGHT_LM3630A is not set
-# CONFIG_BACKLIGHT_LM3639 is not set
-# CONFIG_BACKLIGHT_LP855X is not set
-# CONFIG_BACKLIGHT_LV5207LP is not set
-# CONFIG_BACKLIGHT_PANDORA is not set
-# CONFIG_BACKLIGHT_PM8941_WLED is not set
-# CONFIG_BACKLIGHT_PWM is not set
-# CONFIG_BACKLIGHT_RPI is not set
-# CONFIG_BACKLIGHT_SAHARA is not set
-# CONFIG_BACKTRACE_SELF_TEST is not set
-CONFIG_BASE_FULL=y
-CONFIG_BASE_SMALL=0
-# CONFIG_BATMAN_ADV is not set
-# CONFIG_BATTERY_BQ27XXX is not set
-# CONFIG_BATTERY_BQ27XXX_HDQ is not set
-# CONFIG_BATTERY_DS2760 is not set
-# CONFIG_BATTERY_DS2780 is not set
-# CONFIG_BATTERY_DS2781 is not set
-# CONFIG_BATTERY_DS2782 is not set
-# CONFIG_BATTERY_GAUGE_LTC2941 is not set
-# CONFIG_BATTERY_GOLDFISH is not set
-# CONFIG_BATTERY_LEGO_EV3 is not set
-# CONFIG_BATTERY_MAX17040 is not set
-# CONFIG_BATTERY_MAX17042 is not set
-# CONFIG_BATTERY_MAX1721X is not set
-# CONFIG_BATTERY_RT5033 is not set
-# CONFIG_BATTERY_SBS is not set
-# CONFIG_BAYCOM_EPP is not set
-# CONFIG_BAYCOM_PAR is not set
-# CONFIG_BAYCOM_SER_FDX is not set
-# CONFIG_BAYCOM_SER_HDX is not set
-# CONFIG_BCACHE is not set
-# CONFIG_BCM47XX is not set
-# CONFIG_BCM63XX is not set
-# CONFIG_BCM63XX_PHY is not set
-# CONFIG_BCM7038_WDT is not set
-# CONFIG_BCM7XXX_PHY is not set
-# CONFIG_BCM84881_PHY is not set
-# CONFIG_BCM87XX_PHY is not set
-# CONFIG_BCMA is not set
-# CONFIG_BCMA_DRIVER_GPIO is not set
-CONFIG_BCMA_POSSIBLE=y
-# CONFIG_BCMGENET is not set
-# CONFIG_BCM_IPROC_ADC is not set
-# CONFIG_BCM_KONA_USB2_PHY is not set
-# CONFIG_BCM_SBA_RAID is not set
-# CONFIG_BDI_SWITCH is not set
-# CONFIG_BE2ISCSI is not set
-# CONFIG_BE2NET is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_BGMAC is not set
-# CONFIG_BH1750 is not set
-# CONFIG_BH1780 is not set
-# CONFIG_BIG_KEYS is not set
-# CONFIG_BIG_LITTLE is not set
-# CONFIG_BINARY_PRINTF is not set
-# CONFIG_BINFMT_AOUT is not set
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_ELF_FDPIC is not set
-# CONFIG_BINFMT_FLAT is not set
-# CONFIG_BINFMT_MISC is not set
-CONFIG_BINFMT_SCRIPT=y
-CONFIG_BITREVERSE=y
-# CONFIG_BLK_CGROUP_IOCOST is not set
-# CONFIG_BLK_CGROUP_IOLATENCY is not set
-# CONFIG_BLK_CMDLINE_PARSER is not set
-# CONFIG_BLK_DEBUG_FS is not set
-CONFIG_BLK_DEV=y
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_BLK_DEV_4DRIVES is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI14XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP is not set
-# CONFIG_BLK_DEV_BSG is not set
-# CONFIG_BLK_DEV_BSGLIB is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD64X is not set
-# CONFIG_BLK_DEV_COW_COMMON is not set
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_CS5520 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_CS5535 is not set
-# CONFIG_BLK_DEV_CS5536 is not set
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_DELKIN is not set
-# CONFIG_BLK_DEV_DRBD is not set
-# CONFIG_BLK_DEV_DTC2278 is not set
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_GENERIC is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_HT6560B is not set
-# CONFIG_BLK_DEV_IDEACPI is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDECS is not set
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDE_AU1XXX is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_DEV_INTEGRITY is not set
-# CONFIG_BLK_DEV_IO_TRACE is not set
-# CONFIG_BLK_DEV_IT8172 is not set
-# CONFIG_BLK_DEV_IT8213 is not set
-# CONFIG_BLK_DEV_IT821X is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_LOOP is not set
-CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_NULL_BLK is not set
-# CONFIG_BLK_DEV_NVME is not set
-# CONFIG_BLK_DEV_OFFBOARD is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-# CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_PLATFORM is not set
-# CONFIG_BLK_DEV_PMEM is not set
-# CONFIG_BLK_DEV_QD65XX is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_RBD is not set
-# CONFIG_BLK_DEV_RSXX is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-# CONFIG_BLK_DEV_SD is not set
-# CONFIG_BLK_DEV_SIIMAGE is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_SKD is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_BLK_DEV_SLC90E66 is not set
-# CONFIG_BLK_DEV_SR is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SX8 is not set
-# CONFIG_BLK_DEV_TC86C001 is not set
-# CONFIG_BLK_DEV_THROTTLING is not set
-# CONFIG_BLK_DEV_TRIFLEX is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_UMC8672 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_ZONED is not set
-# CONFIG_BLK_SED_OPAL is not set
-# CONFIG_BLK_WBT is not set
-CONFIG_BLOCK=y
-# CONFIG_BMA180 is not set
-# CONFIG_BMA220 is not set
-# CONFIG_BMC150_ACCEL is not set
-# CONFIG_BMC150_MAGN is not set
-# CONFIG_BMC150_MAGN_I2C is not set
-# CONFIG_BMC150_MAGN_SPI is not set
-# CONFIG_BME680 is not set
-# CONFIG_BMG160 is not set
-# CONFIG_BMI160_I2C is not set
-# CONFIG_BMI160_SPI is not set
-# CONFIG_BMIPS_GENERIC is not set
-# CONFIG_BMP280 is not set
-# CONFIG_BNA is not set
-# CONFIG_BNX2 is not set
-# CONFIG_BNX2X is not set
-# CONFIG_BNX2X_SRIOV is not set
-# CONFIG_BNXT is not set
-# CONFIG_BONDING is not set
-# CONFIG_BOOKE_WDT is not set
-CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3
-# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-# CONFIG_BOOT_PRINTK_DELAY is not set
-CONFIG_BOOT_RAW=y
-CONFIG_BPF=y
-# CONFIG_BPFILTER is not set
-CONFIG_BPF_JIT=y
-# CONFIG_BPF_JIT_ALWAYS_ON is not set
-# CONFIG_BPF_STREAM_PARSER is not set
-CONFIG_BPF_SYSCALL=y
-# CONFIG_BPQETHER is not set
-CONFIG_BQL=y
-CONFIG_BRANCH_PROFILE_NONE=y
-# CONFIG_BRCMFMAC is not set
-# CONFIG_BRCMSMAC is not set
-# CONFIG_BRCMSTB_GISB_ARB is not set
-CONFIG_BRIDGE=y
-# CONFIG_BRIDGE_EBT_802_3 is not set
-# CONFIG_BRIDGE_EBT_AMONG is not set
-# CONFIG_BRIDGE_EBT_ARP is not set
-# CONFIG_BRIDGE_EBT_ARPREPLY is not set
-# CONFIG_BRIDGE_EBT_BROUTE is not set
-# CONFIG_BRIDGE_EBT_DNAT is not set
-# CONFIG_BRIDGE_EBT_IP is not set
-# CONFIG_BRIDGE_EBT_IP6 is not set
-# CONFIG_BRIDGE_EBT_LIMIT is not set
-# CONFIG_BRIDGE_EBT_LOG is not set
-# CONFIG_BRIDGE_EBT_MARK is not set
-# CONFIG_BRIDGE_EBT_MARK_T is not set
-# CONFIG_BRIDGE_EBT_NFLOG is not set
-# CONFIG_BRIDGE_EBT_PKTTYPE is not set
-# CONFIG_BRIDGE_EBT_REDIRECT is not set
-# CONFIG_BRIDGE_EBT_SNAT is not set
-# CONFIG_BRIDGE_EBT_STP is not set
-# CONFIG_BRIDGE_EBT_T_FILTER is not set
-# CONFIG_BRIDGE_EBT_T_NAT is not set
-# CONFIG_BRIDGE_EBT_VLAN is not set
-CONFIG_BRIDGE_IGMP_SNOOPING=y
-# CONFIG_BRIDGE_NETFILTER is not set
-# CONFIG_BRIDGE_NF_EBTABLES is not set
-CONFIG_BRIDGE_VLAN_FILTERING=y
-# CONFIG_BROADCOM_PHY is not set
-CONFIG_BROKEN_ON_SMP=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_BSD_PROCESS_ACCT is not set
-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-# CONFIG_BT is not set
-# CONFIG_BTRFS_ASSERT is not set
-# CONFIG_BTRFS_DEBUG is not set
-# CONFIG_BTRFS_FS is not set
-# CONFIG_BTRFS_FS_POSIX_ACL is not set
-# CONFIG_BTRFS_FS_REF_VERIFY is not set
-# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
-# CONFIG_BT_ATH3K is not set
-# CONFIG_BT_BNEP is not set
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-# CONFIG_BT_BREDR is not set
-# CONFIG_BT_CMTP is not set
-# CONFIG_BT_HCIBCM203X is not set
-# CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBPA10X is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBTSDIO is not set
-# CONFIG_BT_HCIBTUSB is not set
-# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set
-# CONFIG_BT_HCIBTUSB_MTK is not set
-# CONFIG_BT_HCIBTUSB_RTL is not set
-# CONFIG_BT_HCIDTL1 is not set
-# CONFIG_BT_HCIUART is not set
-# CONFIG_BT_HCIUART_3WIRE is not set
-# CONFIG_BT_HCIUART_AG6XX is not set
-# CONFIG_BT_HCIUART_ATH3K is not set
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_H4=y
-# CONFIG_BT_HCIUART_LL is not set
-# CONFIG_BT_HCIUART_MRVL is not set
-# CONFIG_BT_HCIUART_QCA is not set
-# CONFIG_BT_HCIVHCI is not set
-# CONFIG_BT_HIDP is not set
-# CONFIG_BT_HS is not set
-# CONFIG_BT_LE is not set
-# CONFIG_BT_LEDS is not set
-# CONFIG_BT_MRVL is not set
-# CONFIG_BT_MTKSDIO is not set
-# CONFIG_BT_MTKUART is not set
-# CONFIG_BT_RFCOMM is not set
-CONFIG_BT_RFCOMM_TTY=y
-# CONFIG_BT_SELFTEST is not set
-CONFIG_BUG=y
-# CONFIG_BUG_ON_DATA_CORRUPTION is not set
-CONFIG_BUILDTIME_EXTABLE_SORT=y
-# CONFIG_BUILD_BIN2C is not set
-CONFIG_BUILD_SALT=""
-# CONFIG_C2PORT is not set
-CONFIG_CACHE_L2X0_PMU=y
-# CONFIG_CADENCE_WATCHDOG is not set
-# CONFIG_CAIF is not set
-# CONFIG_CAN is not set
-# CONFIG_CAN_BCM is not set
-# CONFIG_CAN_DEBUG_DEVICES is not set
-# CONFIG_CAN_DEV is not set
-# CONFIG_CAN_GS_USB is not set
-# CONFIG_CAN_GW is not set
-# CONFIG_CAN_HI311X is not set
-# CONFIG_CAN_IFI_CANFD is not set
-# CONFIG_CAN_J1939 is not set
-# CONFIG_CAN_KVASER_PCIEFD is not set
-# CONFIG_CAN_MCBA_USB is not set
-# CONFIG_CAN_M_CAN is not set
-# CONFIG_CAN_PEAK_PCIEFD is not set
-# CONFIG_CAN_RAW is not set
-# CONFIG_CAN_RCAR is not set
-# CONFIG_CAN_RCAR_CANFD is not set
-# CONFIG_CAN_SLCAN is not set
-# CONFIG_CAN_SUN4I is not set
-# CONFIG_CAN_UCAN is not set
-# CONFIG_CAN_VCAN is not set
-# CONFIG_CAN_VXCAN is not set
-# CONFIG_CAPI_AVM is not set
-# CONFIG_CAPI_EICON is not set
-# CONFIG_CAPI_TRACE is not set
-CONFIG_CARDBUS=y
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_CARL9170 is not set
-# CONFIG_CASSINI is not set
-# CONFIG_CAVIUM_CPT is not set
-# CONFIG_CAVIUM_ERRATUM_22375 is not set
-# CONFIG_CAVIUM_ERRATUM_23144 is not set
-# CONFIG_CAVIUM_ERRATUM_23154 is not set
-# CONFIG_CAVIUM_ERRATUM_27456 is not set
-# CONFIG_CAVIUM_ERRATUM_30115 is not set
-# CONFIG_CAVIUM_OCTEON_SOC is not set
-# CONFIG_CAVIUM_PTP is not set
-# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set
-# CONFIG_CB710_CORE is not set
-# CONFIG_CC10001_ADC is not set
-# CONFIG_CCS811 is not set
-CONFIG_CC_CAN_LINK=y
-CONFIG_CC_HAS_ASM_INLINE=y
-CONFIG_CC_HAS_SANCOV_TRACE_PC=y
-CONFIG_CC_HAS_STACKPROTECTOR_NONE=y
-CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
-CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_CEPH_FS is not set
-# CONFIG_CEPH_LIB is not set
-# CONFIG_CFG80211 is not set
-# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
-# CONFIG_CGROUPS is not set
-# CONFIG_CHARGER_ADP5061 is not set
-# CONFIG_CHARGER_BQ2415X is not set
-# CONFIG_CHARGER_BQ24190 is not set
-# CONFIG_CHARGER_BQ24257 is not set
-# CONFIG_CHARGER_BQ24735 is not set
-# CONFIG_CHARGER_BQ25890 is not set
-# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
-# CONFIG_CHARGER_GPIO is not set
-# CONFIG_CHARGER_ISP1704 is not set
-# CONFIG_CHARGER_LP8727 is not set
-# CONFIG_CHARGER_LT3651 is not set
-# CONFIG_CHARGER_LTC3651 is not set
-# CONFIG_CHARGER_MANAGER is not set
-# CONFIG_CHARGER_MAX8903 is not set
-# CONFIG_CHARGER_RT9455 is not set
-# CONFIG_CHARGER_SBS is not set
-# CONFIG_CHARGER_SMB347 is not set
-# CONFIG_CHARGER_TWL4030 is not set
-# CONFIG_CHARGER_UCS1002 is not set
-# CONFIG_CHASH_SELFTEST is not set
-# CONFIG_CHASH_STATS is not set
-# CONFIG_CHECKPOINT_RESTORE is not set
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_CHELSIO_T4 is not set
-# CONFIG_CHELSIO_T4VF is not set
-# CONFIG_CHROME_PLATFORMS is not set
-# CONFIG_CHR_DEV_OSST is not set
-# CONFIG_CHR_DEV_SCH is not set
-# CONFIG_CHR_DEV_SG is not set
-# CONFIG_CHR_DEV_ST is not set
-# CONFIG_CICADA_PHY is not set
-# CONFIG_CIFS is not set
-# CONFIG_CIFS_ACL is not set
-CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
-# CONFIG_CIFS_DEBUG is not set
-# CONFIG_CIFS_DEBUG2 is not set
-# CONFIG_CIFS_FSCACHE is not set
-# CONFIG_CIFS_NFSD_EXPORT is not set
-CONFIG_CIFS_POSIX=y
-# CONFIG_CIFS_SMB2 is not set
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_STATS2 is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-CONFIG_CIFS_XATTR=y
-# CONFIG_CIO_DAC is not set
-# CONFIG_CLEANCACHE is not set
-# CONFIG_CLKSRC_VERSATILE is not set
-# CONFIG_CLK_HSDK is not set
-# CONFIG_CLK_QORIQ is not set
-# CONFIG_CLOCK_THERMAL is not set
-CONFIG_CLS_U32_MARK=y
-# CONFIG_CLS_U32_PERF is not set
-# CONFIG_CM32181 is not set
-# CONFIG_CM3232 is not set
-# CONFIG_CM3323 is not set
-# CONFIG_CM3605 is not set
-# CONFIG_CM36651 is not set
-# CONFIG_CMA is not set
-CONFIG_CMDLINE=""
-# CONFIG_CMDLINE_BOOL is not set
-# CONFIG_CMDLINE_EXTEND is not set
-# CONFIG_CMDLINE_FORCE is not set
-# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
-# CONFIG_CMDLINE_PARTITION is not set
-# CONFIG_CNIC is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_CODE_PATCHING_SELFTEST is not set
-# CONFIG_COMEDI is not set
-# CONFIG_COMMON_CLK_CDCE706 is not set
-# CONFIG_COMMON_CLK_CDCE925 is not set
-# CONFIG_COMMON_CLK_CS2000_CP is not set
-# CONFIG_COMMON_CLK_FIXED_MMIO is not set
-# CONFIG_COMMON_CLK_IPROC is not set
-# CONFIG_COMMON_CLK_MAX9485 is not set
-# CONFIG_COMMON_CLK_NXP is not set
-# CONFIG_COMMON_CLK_PIC32 is not set
-# CONFIG_COMMON_CLK_PWM is not set
-# CONFIG_COMMON_CLK_PXA is not set
-# CONFIG_COMMON_CLK_QCOM is not set
-# CONFIG_COMMON_CLK_SI514 is not set
-# CONFIG_COMMON_CLK_SI5341 is not set
-# CONFIG_COMMON_CLK_SI5351 is not set
-# CONFIG_COMMON_CLK_SI544 is not set
-# CONFIG_COMMON_CLK_SI570 is not set
-# CONFIG_COMMON_CLK_VC5 is not set
-# CONFIG_COMMON_CLK_VERSATILE is not set
-# CONFIG_COMMON_CLK_XGENE is not set
-# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set
-CONFIG_COMPACTION=y
-# CONFIG_COMPAL_LAPTOP is not set
-# CONFIG_COMPAT is not set
-# CONFIG_COMPAT_BRK is not set
-# CONFIG_COMPILE_TEST is not set
-# CONFIG_CONFIGFS_FS is not set
-# CONFIG_CONNECTOR is not set
-CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
-CONFIG_CONSOLE_LOGLEVEL_QUIET=4
-CONFIG_CONSTRUCTORS=y
-# CONFIG_CONTEXT_SWITCH_TRACER is not set
-# CONFIG_COPS is not set
-# CONFIG_CORDIC is not set
-# CONFIG_COREDUMP is not set
-# CONFIG_CORESIGHT is not set
-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-# CONFIG_CORTINA_PHY is not set
-# CONFIG_COUNTER is not set
-# CONFIG_CPA_DEBUG is not set
-# CONFIG_CPU_BIG_ENDIAN is not set
-# CONFIG_CPU_BPREDICT_DISABLE is not set
-# CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_FREQ is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
-# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
-# CONFIG_CPU_ICACHE_DISABLE is not set
-# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set
-# CONFIG_CPU_IDLE is not set
-# CONFIG_CPU_IDLE_GOV_LADDER is not set
-# CONFIG_CPU_IDLE_GOV_MENU is not set
-# CONFIG_CPU_IDLE_GOV_TEO is not set
-# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
-# CONFIG_CPU_ISOLATION is not set
-# CONFIG_CPU_NO_EFFICIENT_FFS is not set
-CONFIG_CPU_SW_DOMAIN_PAN=y
-# CONFIG_CRAMFS is not set
-CONFIG_CRAMFS_BLOCKDEV=y
-# CONFIG_CRAMFS_MTD is not set
-# CONFIG_CRASH_DUMP is not set
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-# CONFIG_CRC32_BIT is not set
-CONFIG_CRC32_SARWATE=y
-# CONFIG_CRC32_SELFTEST is not set
-# CONFIG_CRC32_SLICEBY4 is not set
-# CONFIG_CRC32_SLICEBY8 is not set
-# CONFIG_CRC4 is not set
-# CONFIG_CRC64 is not set
-# CONFIG_CRC7 is not set
-# CONFIG_CRC8 is not set
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC_ITU_T is not set
-# CONFIG_CRC_T10DIF is not set
-CONFIG_CROSS_COMPILE=""
-# CONFIG_CROSS_MEMORY_ATTACH is not set
-CONFIG_CRYPTO=y
-# CONFIG_CRYPTO_842 is not set
-# CONFIG_CRYPTO_ADIANTUM is not set
-# CONFIG_CRYPTO_AEAD is not set
-# CONFIG_CRYPTO_AEGIS128 is not set
-# CONFIG_CRYPTO_AEGIS128L is not set
-# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set
-# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set
-# CONFIG_CRYPTO_AEGIS256 is not set
-# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set
-CONFIG_CRYPTO_AES=y
-# CONFIG_CRYPTO_AES_586 is not set
-# CONFIG_CRYPTO_AES_ARM is not set
-# CONFIG_CRYPTO_AES_ARM64 is not set
-# CONFIG_CRYPTO_AES_ARM64_BS is not set
-# CONFIG_CRYPTO_AES_ARM64_CE is not set
-# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set
-# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set
-# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
-# CONFIG_CRYPTO_AES_ARM_BS is not set
-# CONFIG_CRYPTO_AES_ARM_CE is not set
-# CONFIG_CRYPTO_AES_NI_INTEL is not set
-# CONFIG_CRYPTO_AES_TI is not set
-CONFIG_CRYPTO_ALGAPI=y
-CONFIG_CRYPTO_ALGAPI2=y
-# CONFIG_CRYPTO_ANSI_CPRNG is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
-# CONFIG_CRYPTO_AUTHENC is not set
-# CONFIG_CRYPTO_BLAKE2S is not set
-# CONFIG_CRYPTO_BLAKE2S_X86 is not set
-CONFIG_CRYPTO_BLKCIPHER=y
-CONFIG_CRYPTO_BLKCIPHER2=y
-# CONFIG_CRYPTO_BLOWFISH is not set
-# CONFIG_CRYPTO_CAMELLIA is not set
-# CONFIG_CRYPTO_CAST5 is not set
-# CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_CBC is not set
-# CONFIG_CRYPTO_CCM is not set
-# CONFIG_CRYPTO_CFB is not set
-# CONFIG_CRYPTO_CHACHA20 is not set
-# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
-# CONFIG_CRYPTO_CHACHA20_NEON is not set
-# CONFIG_CRYPTO_CHACHA_MIPS is not set
-# CONFIG_CRYPTO_CMAC is not set
-# CONFIG_CRYPTO_CRC32 is not set
-# CONFIG_CRYPTO_CRC32C is not set
-# CONFIG_CRYPTO_CRC32C_INTEL is not set
-# CONFIG_CRYPTO_CRC32_ARM_CE is not set
-# CONFIG_CRYPTO_CRCT10DIF is not set
-# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set
-# CONFIG_CRYPTO_CRCT10DIF_ARM_CE is not set
-# CONFIG_CRYPTO_CRYPTD is not set
-# CONFIG_CRYPTO_CTR is not set
-# CONFIG_CRYPTO_CTS is not set
-# CONFIG_CRYPTO_CURVE25519 is not set
-# CONFIG_CRYPTO_CURVE25519_NEON is not set
-# CONFIG_CRYPTO_CURVE25519_X86 is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_DES is not set
-# CONFIG_CRYPTO_DEV_ATMEL_AES is not set
-# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set
-# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
-# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set
-# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
-# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set
-# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
-# CONFIG_CRYPTO_DEV_CCP is not set
-# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set
-# CONFIG_CRYPTO_DEV_CCREE is not set
-# CONFIG_CRYPTO_DEV_FSL_CAAM is not set
-# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set
-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-# CONFIG_CRYPTO_DEV_HISI_SEC is not set
-# CONFIG_CRYPTO_DEV_HISI_ZIP is not set
-# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set
-# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set
-# CONFIG_CRYPTO_DEV_MV_CESA is not set
-# CONFIG_CRYPTO_DEV_MXC_SCC is not set
-# CONFIG_CRYPTO_DEV_MXS_DCP is not set
-# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
-# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set
-# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
-# CONFIG_CRYPTO_DEV_QAT_C62X is not set
-# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
-# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set
-# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
-# CONFIG_CRYPTO_DEV_QCE is not set
-# CONFIG_CRYPTO_DEV_S5P is not set
-# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
-# CONFIG_CRYPTO_DEV_SAHARA is not set
-# CONFIG_CRYPTO_DEV_SP_PSP is not set
-# CONFIG_CRYPTO_DEV_TALITOS is not set
-# CONFIG_CRYPTO_DEV_VIRTIO is not set
-# CONFIG_CRYPTO_DH is not set
-# CONFIG_CRYPTO_DRBG_CTR is not set
-# CONFIG_CRYPTO_DRBG_HASH is not set
-# CONFIG_CRYPTO_DRBG_MENU is not set
-# CONFIG_CRYPTO_ECB is not set
-# CONFIG_CRYPTO_ECDH is not set
-# CONFIG_CRYPTO_ECHAINIV is not set
-# CONFIG_CRYPTO_ECRDSA is not set
-# CONFIG_CRYPTO_ESSIV is not set
-# CONFIG_CRYPTO_FCRYPT is not set
-# CONFIG_CRYPTO_FIPS is not set
-# CONFIG_CRYPTO_GCM is not set
-# CONFIG_CRYPTO_GF128MUL is not set
-# CONFIG_CRYPTO_GHASH is not set
-# CONFIG_CRYPTO_GHASH_ARM64_CE is not set
-# CONFIG_CRYPTO_GHASH_ARM_CE is not set
-# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
-# CONFIG_CRYPTO_HASH is not set
-# CONFIG_CRYPTO_HMAC is not set
-# CONFIG_CRYPTO_HW is not set
-# CONFIG_CRYPTO_JITTERENTROPY is not set
-# CONFIG_CRYPTO_KEYWRAP is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-CONFIG_CRYPTO_LIB_AES=y
-CONFIG_CRYPTO_LIB_ARC4=y
-# CONFIG_CRYPTO_LIB_BLAKE2S is not set
-# CONFIG_CRYPTO_LIB_CHACHA is not set
-# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set
-# CONFIG_CRYPTO_LIB_CURVE25519 is not set
-# CONFIG_CRYPTO_LIB_POLY1305 is not set
-CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9
-# CONFIG_CRYPTO_LRW is not set
-# CONFIG_CRYPTO_LZ4 is not set
-# CONFIG_CRYPTO_LZ4HC is not set
-# CONFIG_CRYPTO_LZO is not set
-# CONFIG_CRYPTO_MANAGER is not set
-# CONFIG_CRYPTO_MANAGER2 is not set
-CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
-# CONFIG_CRYPTO_MCRYPTD is not set
-# CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-# CONFIG_CRYPTO_MORUS1280 is not set
-# CONFIG_CRYPTO_MORUS1280_AVX2 is not set
-# CONFIG_CRYPTO_MORUS1280_SSE2 is not set
-# CONFIG_CRYPTO_MORUS640 is not set
-# CONFIG_CRYPTO_MORUS640_SSE2 is not set
-# CONFIG_CRYPTO_NHPOLY1305_NEON is not set
-# CONFIG_CRYPTO_NULL is not set
-# CONFIG_CRYPTO_OFB is not set
-# CONFIG_CRYPTO_PCBC is not set
-# CONFIG_CRYPTO_PCOMP is not set
-# CONFIG_CRYPTO_PCOMP2 is not set
-CONFIG_CRYPTO_PCRYPT=y
-# CONFIG_CRYPTO_POLY1305 is not set
-# CONFIG_CRYPTO_POLY1305_ARM is not set
-# CONFIG_CRYPTO_POLY1305_MIPS is not set
-# CONFIG_CRYPTO_POLY1305_NEON is not set
-# CONFIG_CRYPTO_RMD128 is not set
-# CONFIG_CRYPTO_RMD160 is not set
-# CONFIG_CRYPTO_RMD256 is not set
-# CONFIG_CRYPTO_RMD320 is not set
-# CONFIG_CRYPTO_RNG is not set
-# CONFIG_CRYPTO_RSA is not set
-# CONFIG_CRYPTO_SALSA20 is not set
-# CONFIG_CRYPTO_SALSA20_586 is not set
-# CONFIG_CRYPTO_SEED is not set
-# CONFIG_CRYPTO_SEQIV is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_SHA1 is not set
-# CONFIG_CRYPTO_SHA1_ARM is not set
-# CONFIG_CRYPTO_SHA1_ARM64_CE is not set
-# CONFIG_CRYPTO_SHA1_ARM_CE is not set
-# CONFIG_CRYPTO_SHA1_ARM_NEON is not set
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA256_ARM is not set
-# CONFIG_CRYPTO_SHA256_ARM64 is not set
-# CONFIG_CRYPTO_SHA2_ARM64_CE is not set
-# CONFIG_CRYPTO_SHA2_ARM_CE is not set
-# CONFIG_CRYPTO_SHA3 is not set
-# CONFIG_CRYPTO_SHA3_ARM64 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_SHA512_ARM is not set
-# CONFIG_CRYPTO_SHA512_ARM64 is not set
-# CONFIG_CRYPTO_SHA512_ARM64_CE is not set
-# CONFIG_CRYPTO_SIMD is not set
-# CONFIG_CRYPTO_SM3 is not set
-# CONFIG_CRYPTO_SM3_ARM64_CE is not set
-# CONFIG_CRYPTO_SM4 is not set
-# CONFIG_CRYPTO_SM4_ARM64_CE is not set
-# CONFIG_CRYPTO_SPECK is not set
-# CONFIG_CRYPTO_STATS is not set
-# CONFIG_CRYPTO_STREEBOG is not set
-# CONFIG_CRYPTO_TEA is not set
-# CONFIG_CRYPTO_TEST is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_TWOFISH is not set
-# CONFIG_CRYPTO_TWOFISH_586 is not set
-# CONFIG_CRYPTO_TWOFISH_COMMON is not set
-# CONFIG_CRYPTO_USER is not set
-# CONFIG_CRYPTO_USER_API_AEAD is not set
-# CONFIG_CRYPTO_USER_API_HASH is not set
-# CONFIG_CRYPTO_USER_API_RNG is not set
-# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
-# CONFIG_CRYPTO_VMAC is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_XCBC is not set
-# CONFIG_CRYPTO_XTS is not set
-# CONFIG_CRYPTO_XXHASH is not set
-# CONFIG_CRYPTO_ZLIB is not set
-# CONFIG_CRYPTO_ZSTD is not set
-# CONFIG_CS5535_MFGPT is not set
-# CONFIG_CS89x0 is not set
-# CONFIG_CUSE is not set
-# CONFIG_CW1200 is not set
-# CONFIG_CXL_AFU_DRIVER_OPS is not set
-# CONFIG_CXL_BASE is not set
-# CONFIG_CXL_EEH is not set
-# CONFIG_CXL_KERNEL_API is not set
-# CONFIG_CXL_LIB is not set
-# CONFIG_CYPRESS_FIRMWARE is not set
-# CONFIG_DA280 is not set
-# CONFIG_DA311 is not set
-# CONFIG_DAVICOM_PHY is not set
-# CONFIG_DAX is not set
-# CONFIG_DCB is not set
-# CONFIG_DDR is not set
-# CONFIG_DEBUG_ALIGN_RODATA is not set
-# CONFIG_DEBUG_ATOMIC_SLEEP is not set
-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_CREDENTIALS is not set
-# CONFIG_DEBUG_DEVRES is not set
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_DEBUG_EFI is not set
-# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
-CONFIG_DEBUG_FS=y
-# CONFIG_DEBUG_GPIO is not set
-# CONFIG_DEBUG_HIGHMEM is not set
-# CONFIG_DEBUG_ICEDCC is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_INFO_BTF is not set
-# CONFIG_DEBUG_INFO_DWARF4 is not set
-CONFIG_DEBUG_INFO_REDUCED=y
-# CONFIG_DEBUG_INFO_SPLIT is not set
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_KMEMLEAK is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_KOBJECT_RELEASE is not set
-# CONFIG_DEBUG_LIST is not set
-# CONFIG_DEBUG_LL is not set
-# CONFIG_DEBUG_LL_UART_8250 is not set
-# CONFIG_DEBUG_LL_UART_PL01X is not set
-# CONFIG_DEBUG_LOCKDEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_DEBUG_MEMORY_INIT is not set
-# CONFIG_DEBUG_MISC is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_NOTIFIERS is not set
-# CONFIG_DEBUG_NX_TEST is not set
-# CONFIG_DEBUG_OBJECTS is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
-# CONFIG_DEBUG_PAGE_REF is not set
-# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
-# CONFIG_DEBUG_PER_CPU_MAPS is not set
-# CONFIG_DEBUG_PINCTRL is not set
-# CONFIG_DEBUG_PI_LIST is not set
-# CONFIG_DEBUG_PLIST is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RODATA_TEST is not set
-# CONFIG_DEBUG_RSEQ is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SECTION_MISMATCH is not set
-# CONFIG_DEBUG_SEMIHOSTING is not set
-# CONFIG_DEBUG_SG is not set
-# CONFIG_DEBUG_SHIRQ is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
-# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
-# CONFIG_DEBUG_TIMEKEEPING is not set
-# CONFIG_DEBUG_UART_8250_PALMCHIP is not set
-# CONFIG_DEBUG_UART_BCM63XX is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_VIRTUAL is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
-# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
-# CONFIG_DEBUG_WX is not set
-# CONFIG_DEBUG_ZBOOT is not set
-# CONFIG_DECNET is not set
-CONFIG_DEFAULT_CUBIC=y
-CONFIG_DEFAULT_DEADLINE=y
-CONFIG_DEFAULT_HOSTNAME="(none)"
-CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
-CONFIG_DEFAULT_IOSCHED="deadline"
-CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-# CONFIG_DEFAULT_NOOP is not set
-# CONFIG_DEFAULT_RENO is not set
-CONFIG_DEFAULT_SECURITY=""
-CONFIG_DEFAULT_SECURITY_DAC=y
-# CONFIG_DEFAULT_SECURITY_SELINUX is not set
-CONFIG_DEFAULT_TCP_CONG="cubic"
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
-# CONFIG_DELL_LAPTOP is not set
-# CONFIG_DELL_RBTN is not set
-# CONFIG_DELL_SMBIOS is not set
-# CONFIG_DELL_SMO8800 is not set
-# CONFIG_DEPRECATED_PARAM_STRUCT is not set
-# CONFIG_DETECT_HUNG_TASK is not set
-# CONFIG_DEVKMEM is not set
-# CONFIG_DEVMEM is not set
-CONFIG_DEVPORT=y
-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-# CONFIG_DEVTMPFS is not set
-# CONFIG_DEVTMPFS_MOUNT is not set
-# CONFIG_DEV_DAX is not set
-# CONFIG_DGAP is not set
-# CONFIG_DGNC is not set
-# CONFIG_DHT11 is not set
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set
-# CONFIG_DISPLAY_CONNECTOR_DVI is not set
-# CONFIG_DISPLAY_CONNECTOR_HDMI is not set
-# CONFIG_DISPLAY_ENCODER_TFP410 is not set
-# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set
-# CONFIG_DISPLAY_PANEL_DPI is not set
-# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set
-# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set
-# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set
-# CONFIG_DL2K is not set
-# CONFIG_DLM is not set
-# CONFIG_DM9000 is not set
-# CONFIG_DMABUF_SELFTESTS is not set
-# CONFIG_DMADEVICES is not set
-# CONFIG_DMADEVICES_DEBUG is not set
-# CONFIG_DMARD06 is not set
-# CONFIG_DMARD09 is not set
-# CONFIG_DMARD10 is not set
-# CONFIG_DMASCC is not set
-# CONFIG_DMATEST is not set
-# CONFIG_DMA_API_DEBUG is not set
-CONFIG_DMA_DECLARE_COHERENT=y
-# CONFIG_DMA_ENGINE is not set
-# CONFIG_DMA_FENCE_TRACE is not set
-# CONFIG_DMA_JZ4780 is not set
-# CONFIG_DMA_NOOP_OPS is not set
-# CONFIG_DMA_SHARED_BUFFER is not set
-# CONFIG_DMA_VIRT_OPS is not set
-# CONFIG_DM_CACHE is not set
-# CONFIG_DM_CLONE is not set
-# CONFIG_DM_DEBUG is not set
-# CONFIG_DM_DELAY is not set
-# CONFIG_DM_DUST is not set
-# CONFIG_DM_ERA is not set
-# CONFIG_DM_FLAKEY is not set
-# CONFIG_DM_INTEGRITY is not set
-# CONFIG_DM_LOG_USERSPACE is not set
-# CONFIG_DM_LOG_WRITES is not set
-# CONFIG_DM_MQ_DEFAULT is not set
-# CONFIG_DM_MULTIPATH is not set
-# CONFIG_DM_RAID is not set
-# CONFIG_DM_SWITCH is not set
-# CONFIG_DM_THIN_PROVISIONING is not set
-# CONFIG_DM_UEVENT is not set
-# CONFIG_DM_UNSTRIPED is not set
-# CONFIG_DM_VERITY is not set
-# CONFIG_DM_WRITECACHE is not set
-# CONFIG_DM_ZERO is not set
-# CONFIG_DNET is not set
-# CONFIG_DNOTIFY is not set
-# CONFIG_DNS_RESOLVER is not set
-CONFIG_DOUBLEFAULT=y
-# CONFIG_DP83822_PHY is not set
-# CONFIG_DP83848_PHY is not set
-# CONFIG_DP83867_PHY is not set
-# CONFIG_DP83TC811_PHY is not set
-# CONFIG_DPOT_DAC is not set
-# CONFIG_DPS310 is not set
-CONFIG_DQL=y
-# CONFIG_DRAGONRISE_FF is not set
-# CONFIG_DRM is not set
-# CONFIG_DRM_AMDGPU is not set
-# CONFIG_DRM_AMDGPU_CIK is not set
-# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set
-# CONFIG_DRM_AMDGPU_SI is not set
-# CONFIG_DRM_AMDGPU_USERPTR is not set
-# CONFIG_DRM_AMD_ACP is not set
-# CONFIG_DRM_AMD_DC_DCN2_0 is not set
-# CONFIG_DRM_ANALOGIX_ANX78XX is not set
-# CONFIG_DRM_ARCPGU is not set
-# CONFIG_DRM_ARMADA is not set
-# CONFIG_DRM_AST is not set
-# CONFIG_DRM_BOCHS is not set
-# CONFIG_DRM_CDNS_DSI is not set
-# CONFIG_DRM_CIRRUS_QEMU is not set
-# CONFIG_DRM_DEBUG_MM is not set
-# CONFIG_DRM_DEBUG_SELFTEST is not set
-# CONFIG_DRM_DP_AUX_CHARDEV is not set
-# CONFIG_DRM_DP_CEC is not set
-# CONFIG_DRM_DUMB_VGA_DAC is not set
-# CONFIG_DRM_DW_HDMI_CEC is not set
-# CONFIG_DRM_ETNAVIV is not set
-# CONFIG_DRM_EXYNOS is not set
-# CONFIG_DRM_FBDEV_EMULATION is not set
-# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
-# CONFIG_DRM_FSL_DCU is not set
-# CONFIG_DRM_GM12U320 is not set
-# CONFIG_DRM_GMA500 is not set
-# CONFIG_DRM_HDLCD is not set
-# CONFIG_DRM_HISI_HIBMC is not set
-# CONFIG_DRM_HISI_KIRIN is not set
-# CONFIG_DRM_I2C_ADV7511 is not set
-# CONFIG_DRM_I2C_CH7006 is not set
-# CONFIG_DRM_I2C_NXP_TDA9950 is not set
-# CONFIG_DRM_I2C_NXP_TDA998X is not set
-# CONFIG_DRM_I2C_SIL164 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_DRM_KOMEDA is not set
-# CONFIG_DRM_LEGACY is not set
-# CONFIG_DRM_LIB_RANDOM is not set
-# CONFIG_DRM_LIMA is not set
-# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
-# CONFIG_DRM_LVDS_ENCODER is not set
-# CONFIG_DRM_MALI_DISPLAY is not set
-# CONFIG_DRM_MCDE is not set
-# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
-# CONFIG_DRM_MGAG200 is not set
-# CONFIG_DRM_MXSFB is not set
-# CONFIG_DRM_NOUVEAU is not set
-# CONFIG_DRM_NXP_PTN3460 is not set
-# CONFIG_DRM_OMAP is not set
-# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
-# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set
-# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
-# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set
-# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
-# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
-# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
-# CONFIG_DRM_PANEL_LG_LB035Q02 is not set
-# CONFIG_DRM_PANEL_LG_LG4573 is not set
-# CONFIG_DRM_PANEL_LVDS is not set
-# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set
-# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set
-# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set
-# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set
-# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set
-# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set
-# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set
-# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set
-# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set
-# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set
-# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set
-# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set
-# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set
-# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set
-# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set
-# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
-# CONFIG_DRM_PANEL_SIMPLE is not set
-# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set
-# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
-# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
-# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
-# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
-# CONFIG_DRM_PANEL_TPO_TPG110 is not set
-# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set
-# CONFIG_DRM_PANFROST is not set
-# CONFIG_DRM_PARADE_PS8622 is not set
-# CONFIG_DRM_PL111 is not set
-# CONFIG_DRM_QXL is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_RADEON_USERPTR is not set
-# CONFIG_DRM_RCAR_DW_HDMI is not set
-# CONFIG_DRM_RCAR_LVDS is not set
-# CONFIG_DRM_SII902X is not set
-# CONFIG_DRM_SII9234 is not set
-# CONFIG_DRM_SIL_SII8620 is not set
-# CONFIG_DRM_STI is not set
-# CONFIG_DRM_STM is not set
-# CONFIG_DRM_SUN4I is not set
-# CONFIG_DRM_THINE_THC63LVD1024 is not set
-# CONFIG_DRM_TILCDC is not set
-# CONFIG_DRM_TINYDRM is not set
-# CONFIG_DRM_TI_SN65DSI86 is not set
-# CONFIG_DRM_TI_TFP410 is not set
-# CONFIG_DRM_TOSHIBA_TC358764 is not set
-# CONFIG_DRM_TOSHIBA_TC358767 is not set
-# CONFIG_DRM_TVE200 is not set
-# CONFIG_DRM_UDL is not set
-# CONFIG_DRM_VBOXVIDEO is not set
-# CONFIG_DRM_VC4_HDMI_CEC is not set
-# CONFIG_DRM_VGEM is not set
-# CONFIG_DRM_VIRTIO_GPU is not set
-# CONFIG_DRM_VKMS is not set
-# CONFIG_DRM_VMWGFX is not set
-# CONFIG_DRM_XEN is not set
-# CONFIG_DS1682 is not set
-# CONFIG_DS1803 is not set
-# CONFIG_DS4424 is not set
-# CONFIG_DST_CACHE is not set
-# CONFIG_DTLK is not set
-# CONFIG_DUMMY is not set
-CONFIG_DUMMY_CONSOLE_COLUMNS=80
-CONFIG_DUMMY_CONSOLE_ROWS=25
-# CONFIG_DUMMY_IRQ is not set
-# CONFIG_DVB_AU8522_V4L is not set
-# CONFIG_DVB_CORE is not set
-# CONFIG_DVB_DUMMY_FE is not set
-# CONFIG_DVB_TUNER_DIB0070 is not set
-# CONFIG_DVB_TUNER_DIB0090 is not set
-# CONFIG_DWC_XLGMAC is not set
-# CONFIG_DWMAC_DWC_QOS_ETH is not set
-# CONFIG_DWMAC_IPQ806X is not set
-# CONFIG_DWMAC_LPC18XX is not set
-# CONFIG_DWMAC_MESON is not set
-# CONFIG_DWMAC_ROCKCHIP is not set
-# CONFIG_DWMAC_SOCFPGA is not set
-# CONFIG_DWMAC_STI is not set
-# CONFIG_DW_AXI_DMAC is not set
-# CONFIG_DW_DMAC is not set
-# CONFIG_DW_DMAC_PCI is not set
-# CONFIG_DW_EDMA is not set
-# CONFIG_DW_EDMA_PCIE is not set
-# CONFIG_DW_WATCHDOG is not set
-# CONFIG_DYNAMIC_DEBUG is not set
-# CONFIG_E100 is not set
-# CONFIG_E1000 is not set
-# CONFIG_E1000E is not set
-# CONFIG_E1000E_HWTS is not set
-# CONFIG_EARLY_PRINTK_8250 is not set
-# CONFIG_EARLY_PRINTK_USB_XDBC is not set
-# CONFIG_EBC_C384_WDT is not set
-# CONFIG_ECHO is not set
-# CONFIG_ECRYPT_FS is not set
-# CONFIG_EDAC is not set
-# CONFIG_EEEPC_LAPTOP is not set
-# CONFIG_EEPROM_93CX6 is not set
-# CONFIG_EEPROM_93XX46 is not set
-# CONFIG_EEPROM_AT24 is not set
-# CONFIG_EEPROM_AT25 is not set
-# CONFIG_EEPROM_DIGSY_MTC_CFG is not set
-# CONFIG_EEPROM_EE1004 is not set
-# CONFIG_EEPROM_IDT_89HPESX is not set
-# CONFIG_EEPROM_LEGACY is not set
-# CONFIG_EEPROM_MAX6875 is not set
-# CONFIG_EFI is not set
-CONFIG_EFI_PARTITION=y
-# CONFIG_EFI_VARS_PSTORE is not set
-# CONFIG_EFS_FS is not set
-CONFIG_ELFCORE=y
-# CONFIG_ELF_CORE is not set
-# CONFIG_EMAC_ROCKCHIP is not set
-CONFIG_EMBEDDED=y
-# CONFIG_EM_TIMER_STI is not set
-# CONFIG_ENABLE_MUST_CHECK is not set
-CONFIG_ENABLE_WARN_DEPRECATED=y
-# CONFIG_ENA_ETHERNET is not set
-# CONFIG_ENC28J60 is not set
-# CONFIG_ENCLOSURE_SERVICES is not set
-# CONFIG_ENCRYPTED_KEYS is not set
-# CONFIG_ENCX24J600 is not set
-# CONFIG_ENERGY_MODEL is not set
-# CONFIG_ENIC is not set
-# CONFIG_ENVELOPE_DETECTOR is not set
-# CONFIG_EPAPR_PARAVIRT is not set
-# CONFIG_EPIC100 is not set
-CONFIG_EPOLL=y
-# CONFIG_EQUALIZER is not set
-# CONFIG_EROFS_FS is not set
-# CONFIG_ET131X is not set
-CONFIG_ETHERNET=y
-# CONFIG_ETHOC is not set
-CONFIG_EVENTFD=y
-# CONFIG_EVM is not set
-# CONFIG_EXFAT_DEBUG_MSG is not set
-CONFIG_EXFAT_DEFAULT_CODEPAGE=437
-# CONFIG_EXFAT_DELAYED_SYNC is not set
-CONFIG_EXFAT_DISCARD=y
-CONFIG_EXFAT_DONT_MOUNT_VFAT=y
-# CONFIG_EXFAT_FS is not set
-# CONFIG_EXFAT_KERNEL_DEBUG is not set
-CONFIG_EXPERT=y
-CONFIG_EXPORTFS=y
-# CONFIG_EXPORTFS_BLOCK_OPS is not set
-# CONFIG_EXT2_FS is not set
-CONFIG_EXT2_FS_XATTR=y
-# CONFIG_EXT3_FS is not set
-# CONFIG_EXT4_DEBUG is not set
-# CONFIG_EXT4_ENCRYPTION is not set
-# CONFIG_EXT4_FS is not set
-# CONFIG_EXT4_FS_POSIX_ACL is not set
-# CONFIG_EXT4_FS_SECURITY is not set
-CONFIG_EXT4_USE_FOR_EXT2=y
-# CONFIG_EXTCON is not set
-# CONFIG_EXTCON_ADC_JACK is not set
-# CONFIG_EXTCON_ARIZONA is not set
-# CONFIG_EXTCON_AXP288 is not set
-# CONFIG_EXTCON_FSA9480 is not set
-# CONFIG_EXTCON_GPIO is not set
-# CONFIG_EXTCON_INTEL_INT3496 is not set
-# CONFIG_EXTCON_MAX3355 is not set
-# CONFIG_EXTCON_PTN5150 is not set
-# CONFIG_EXTCON_QCOM_SPMI_MISC is not set
-# CONFIG_EXTCON_RT8973A is not set
-# CONFIG_EXTCON_SM5502 is not set
-# CONFIG_EXTCON_USB_GPIO is not set
-CONFIG_EXTRA_FIRMWARE=""
-CONFIG_EXTRA_TARGETS=""
-# CONFIG_EXYNOS_ADC is not set
-# CONFIG_EXYNOS_VIDEO is not set
-# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set
-# CONFIG_EZX_PCAP is not set
-# CONFIG_F2FS_CHECK_FS is not set
-# CONFIG_F2FS_FAULT_INJECTION is not set
-# CONFIG_F2FS_FS is not set
-# CONFIG_F2FS_FS_ENCRYPTION is not set
-# CONFIG_F2FS_FS_POSIX_ACL is not set
-# CONFIG_F2FS_FS_SECURITY is not set
-CONFIG_F2FS_FS_XATTR=y
-# CONFIG_F2FS_IO_TRACE is not set
-CONFIG_F2FS_STAT_FS=y
-# CONFIG_FAILOVER is not set
-# CONFIG_FAIR_GROUP_SCHED is not set
-# CONFIG_FANOTIFY is not set
-# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_FAT_DEFAULT_UTF8 is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_FAULT_INJECTION is not set
-# CONFIG_FB is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_ARMCLCD is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_AUO_K190X is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_BIG_ENDIAN is not set
-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-# CONFIG_FB_BOTH_ENDIAN is not set
-# CONFIG_FB_BROADSHEET is not set
-# CONFIG_FB_CARMINE is not set
-# CONFIG_FB_CFB_COPYAREA is not set
-# CONFIG_FB_CFB_FILLRECT is not set
-# CONFIG_FB_CFB_IMAGEBLIT is not set
-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_DA8XX is not set
-# CONFIG_FB_DDC is not set
-# CONFIG_FB_FLEX is not set
-# CONFIG_FB_FOREIGN_ENDIAN is not set
-# CONFIG_FB_GEODE is not set
-# CONFIG_FB_GOLDFISH is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_I740 is not set
-# CONFIG_FB_IBM_GXT4500 is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_IMX is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_LE80578 is not set
-# CONFIG_FB_LITTLE_ENDIAN is not set
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_MB862XX is not set
-# CONFIG_FB_METRONOME is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_MXS is not set
-# CONFIG_FB_N411 is not set
-# CONFIG_FB_NEOMAGIC is not set
-CONFIG_FB_NOTIFY=y
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_OF is not set
-# CONFIG_FB_OMAP2 is not set
-# CONFIG_FB_OPENCORES is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_PS3 is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIMPLE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_SM712 is not set
-# CONFIG_FB_SM750 is not set
-# CONFIG_FB_SMSCUFX is not set
-# CONFIG_FB_SSD1307 is not set
-# CONFIG_FB_SVGALIB is not set
-# CONFIG_FB_SYS_COPYAREA is not set
-# CONFIG_FB_SYS_FILLRECT is not set
-# CONFIG_FB_SYS_FOPS is not set
-# CONFIG_FB_SYS_IMAGEBLIT is not set
-# CONFIG_FB_TFT is not set
-# CONFIG_FB_TFT_AGM1264K_FL is not set
-# CONFIG_FB_TFT_BD663474 is not set
-# CONFIG_FB_TFT_FBTFT_DEVICE is not set
-# CONFIG_FB_TFT_HX8340BN is not set
-# CONFIG_FB_TFT_HX8347D is not set
-# CONFIG_FB_TFT_HX8353D is not set
-# CONFIG_FB_TFT_HX8357D is not set
-# CONFIG_FB_TFT_ILI9163 is not set
-# CONFIG_FB_TFT_ILI9320 is not set
-# CONFIG_FB_TFT_ILI9325 is not set
-# CONFIG_FB_TFT_ILI9340 is not set
-# CONFIG_FB_TFT_ILI9341 is not set
-# CONFIG_FB_TFT_ILI9481 is not set
-# CONFIG_FB_TFT_ILI9486 is not set
-# CONFIG_FB_TFT_PCD8544 is not set
-# CONFIG_FB_TFT_RA8875 is not set
-# CONFIG_FB_TFT_S6D02A1 is not set
-# CONFIG_FB_TFT_S6D1121 is not set
-# CONFIG_FB_TFT_SH1106 is not set
-# CONFIG_FB_TFT_SSD1289 is not set
-# CONFIG_FB_TFT_SSD1305 is not set
-# CONFIG_FB_TFT_SSD1306 is not set
-# CONFIG_FB_TFT_SSD1325 is not set
-# CONFIG_FB_TFT_SSD1331 is not set
-# CONFIG_FB_TFT_SSD1351 is not set
-# CONFIG_FB_TFT_ST7735R is not set
-# CONFIG_FB_TFT_ST7789V is not set
-# CONFIG_FB_TFT_TINYLCD is not set
-# CONFIG_FB_TFT_TLS8204 is not set
-# CONFIG_FB_TFT_UC1611 is not set
-# CONFIG_FB_TFT_UC1701 is not set
-# CONFIG_FB_TFT_UPD161704 is not set
-# CONFIG_FB_TFT_WATTEROTT is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_TMIO is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_UDL is not set
-# CONFIG_FB_UVESA is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_VIA is not set
-# CONFIG_FB_VIRTUAL is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FB_XGI is not set
-# CONFIG_FCOE is not set
-# CONFIG_FCOE_FNIC is not set
-# CONFIG_FDDI is not set
-# CONFIG_FEALNX is not set
-# CONFIG_FENCE_TRACE is not set
-# CONFIG_FHANDLE is not set
-CONFIG_FIB_RULES=y
-# CONFIG_FIELDBUS_DEV is not set
-CONFIG_FILE_LOCKING=y
-# CONFIG_FIND_BIT_BENCHMARK is not set
-# CONFIG_FIREWIRE is not set
-# CONFIG_FIREWIRE_NOSY is not set
-# CONFIG_FIREWIRE_SERIAL is not set
-# CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FIRMWARE_IN_KERNEL is not set
-# CONFIG_FIRMWARE_MEMMAP is not set
-# CONFIG_FIT_PARTITION is not set
-# CONFIG_FIXED_PHY is not set
-CONFIG_FLATMEM=y
-CONFIG_FLATMEM_MANUAL=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_FM10K is not set
-# CONFIG_FMC is not set
-# CONFIG_FONTS is not set
-# CONFIG_FONT_TER16x32 is not set
-# CONFIG_FORCEDETH is not set
-CONFIG_FORCE_MAX_ZONEORDER=11
-CONFIG_FORTIFY_SOURCE=y
-# CONFIG_FPGA is not set
-# CONFIG_FRAMEBUFFER_CONSOLE is not set
-# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
-# CONFIG_FRAME_POINTER is not set
-CONFIG_FRAME_WARN=1024
-# CONFIG_FREEZER is not set
-# CONFIG_FRONTSWAP is not set
-# CONFIG_FSCACHE is not set
-# CONFIG_FSI is not set
-# CONFIG_FSL_EDMA is not set
-# CONFIG_FSL_ERRATUM_A008585 is not set
-# CONFIG_FSL_MC_BUS is not set
-# CONFIG_FSL_PQ_MDIO is not set
-# CONFIG_FSL_QDMA is not set
-# CONFIG_FSL_XGMAC_MDIO is not set
-CONFIG_FSNOTIFY=y
-# CONFIG_FS_DAX is not set
-# CONFIG_FS_ENCRYPTION is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_FS_VERITY is not set
-# CONFIG_FTGMAC100 is not set
-# CONFIG_FTL is not set
-# CONFIG_FTMAC100 is not set
-# CONFIG_FTRACE is not set
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_FTR_FIXUP_SELFTEST is not set
-# CONFIG_FTWDT010_WATCHDOG is not set
-# CONFIG_FUJITSU_ERRATUM_010001 is not set
-# CONFIG_FUJITSU_ES is not set
-# CONFIG_FUJITSU_LAPTOP is not set
-# CONFIG_FUJITSU_TABLET is not set
-# CONFIG_FUNCTION_TRACER is not set
-# CONFIG_FUSE_FS is not set
-# CONFIG_FUSION is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
-# CONFIG_FUSION_SPI is not set
-CONFIG_FUTEX=y
-CONFIG_FUTEX_PI=y
-# CONFIG_FW_CFG_SYSFS is not set
-CONFIG_FW_LOADER=y
-# CONFIG_FW_LOADER_COMPRESS is not set
-CONFIG_FW_LOADER_USER_HELPER=y
-CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
-# CONFIG_FXAS21002C is not set
-# CONFIG_FXOS8700_I2C is not set
-# CONFIG_FXOS8700_SPI is not set
-CONFIG_GACT_PROB=y
-# CONFIG_GADGET_UAC1 is not set
-# CONFIG_GAMEPORT is not set
-# CONFIG_GATEWORKS_GW16083 is not set
-# CONFIG_GCC_PLUGINS is not set
-# CONFIG_GCOV is not set
-# CONFIG_GCOV_KERNEL is not set
-# CONFIG_GDB_SCRIPTS is not set
-# CONFIG_GEMINI_ETHERNET is not set
-# CONFIG_GENERIC_ADC_BATTERY is not set
-# CONFIG_GENERIC_ADC_THERMAL is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-# CONFIG_GENERIC_CPU_DEVICES is not set
-CONFIG_GENERIC_HWEIGHT=y
-# CONFIG_GENERIC_IRQ_DEBUGFS is not set
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_NET_UTILS=y
-# CONFIG_GENERIC_PHY is not set
-# CONFIG_GENEVE is not set
-# CONFIG_GENWQE is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_GIGASET_CAPI is not set
-# CONFIG_GIGASET_DEBUG is not set
-# CONFIG_GIGASET_DUMMYLL is not set
-# CONFIG_GLOB_SELFTEST is not set
-# CONFIG_GNSS is not set
-# CONFIG_GOLDFISH is not set
-# CONFIG_GOOGLE_FIRMWARE is not set
-# CONFIG_GP2AP020A00F is not set
-# CONFIG_GPD_POCKET_FAN is not set
-# CONFIG_GPIOLIB is not set
-CONFIG_GPIOLIB_FASTPATH_LIMIT=512
-# CONFIG_GPIO_104_DIO_48E is not set
-# CONFIG_GPIO_104_IDIO_16 is not set
-# CONFIG_GPIO_104_IDI_48 is not set
-# CONFIG_GPIO_74X164 is not set
-# CONFIG_GPIO_74XX_MMIO is not set
-# CONFIG_GPIO_ADNP is not set
-# CONFIG_GPIO_ADP5588 is not set
-# CONFIG_GPIO_ALTERA is not set
-# CONFIG_GPIO_AMD8111 is not set
-# CONFIG_GPIO_AMDPT is not set
-# CONFIG_GPIO_AMD_FCH is not set
-# CONFIG_GPIO_BCM_KONA is not set
-# CONFIG_GPIO_BT8XX is not set
-# CONFIG_GPIO_CADENCE is not set
-# CONFIG_GPIO_CS5535 is not set
-# CONFIG_GPIO_DWAPB is not set
-# CONFIG_GPIO_EM is not set
-# CONFIG_GPIO_EXAR is not set
-# CONFIG_GPIO_F7188X is not set
-# CONFIG_GPIO_FTGPIO010 is not set
-# CONFIG_GPIO_GENERIC_PLATFORM is not set
-# CONFIG_GPIO_GPIO_MM is not set
-# CONFIG_GPIO_GRGPIO is not set
-# CONFIG_GPIO_GW_PLD is not set
-# CONFIG_GPIO_HLWD is not set
-# CONFIG_GPIO_ICH is not set
-# CONFIG_GPIO_IT87 is not set
-# CONFIG_GPIO_LYNXPOINT is not set
-# CONFIG_GPIO_MAX3191X is not set
-# CONFIG_GPIO_MAX7300 is not set
-# CONFIG_GPIO_MAX7301 is not set
-# CONFIG_GPIO_MAX732X is not set
-# CONFIG_GPIO_MB86S7X is not set
-# CONFIG_GPIO_MC33880 is not set
-# CONFIG_GPIO_MCP23S08 is not set
-# CONFIG_GPIO_ML_IOH is not set
-# CONFIG_GPIO_MOCKUP is not set
-# CONFIG_GPIO_MPC8XXX is not set
-# CONFIG_GPIO_PCA953X is not set
-# CONFIG_GPIO_PCF857X is not set
-# CONFIG_GPIO_PCH is not set
-# CONFIG_GPIO_PCIE_IDIO_24 is not set
-# CONFIG_GPIO_PCI_IDIO_16 is not set
-# CONFIG_GPIO_PISOSR is not set
-# CONFIG_GPIO_PL061 is not set
-# CONFIG_GPIO_RCAR is not set
-# CONFIG_GPIO_RDC321X is not set
-# CONFIG_GPIO_SAMA5D2_PIOBU is not set
-# CONFIG_GPIO_SCH is not set
-# CONFIG_GPIO_SCH311X is not set
-# CONFIG_GPIO_SX150X is not set
-# CONFIG_GPIO_SYSCON is not set
-CONFIG_GPIO_SYSFS=y
-# CONFIG_GPIO_TPIC2810 is not set
-# CONFIG_GPIO_TS4900 is not set
-# CONFIG_GPIO_TS5500 is not set
-# CONFIG_GPIO_VX855 is not set
-# CONFIG_GPIO_WATCHDOG is not set
-# CONFIG_GPIO_WINBOND is not set
-# CONFIG_GPIO_WS16C48 is not set
-# CONFIG_GPIO_XGENE is not set
-# CONFIG_GPIO_XILINX is not set
-# CONFIG_GPIO_XRA1403 is not set
-# CONFIG_GPIO_ZEVIO is not set
-# CONFIG_GPIO_ZX is not set
-# CONFIG_GREENASIA_FF is not set
-# CONFIG_GREYBUS is not set
-# CONFIG_GS_FPGABOOT is not set
-# CONFIG_GTP is not set
-# CONFIG_GUP_BENCHMARK is not set
-# CONFIG_GVE is not set
-# CONFIG_HABANA_AI is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_HAPPYMEAL is not set
-CONFIG_HARDENED_USERCOPY=y
-# CONFIG_HARDENED_USERCOPY_FALLBACK is not set
-# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set
-CONFIG_HARDEN_EL2_VECTORS=y
-# CONFIG_HARDLOCKUP_DETECTOR is not set
-# CONFIG_HAVE_AOUT is not set
-CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y
-# CONFIG_HAVE_ARCH_HASH is not set
-CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
-# CONFIG_HAVE_ARCH_VMAP_STACK is not set
-CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
-# CONFIG_HAVE_ARM_ARCH_TIMER is not set
-CONFIG_HAVE_EXIT_THREAD=y
-CONFIG_HAVE_GCC_PLUGINS=y
-CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
-CONFIG_HAVE_KERNEL_BZIP2=y
-CONFIG_HAVE_KERNEL_CAT=y
-CONFIG_HAVE_KERNEL_GZIP=y
-CONFIG_HAVE_KERNEL_LZ4=y
-CONFIG_HAVE_KERNEL_LZMA=y
-CONFIG_HAVE_KERNEL_LZO=y
-CONFIG_HAVE_KERNEL_XZ=y
-CONFIG_HAVE_KPROBES=y
-CONFIG_HAVE_KRETPROBES=y
-CONFIG_HAVE_NMI=y
-CONFIG_HAVE_STACKPROTECTOR=y
-# CONFIG_HCALL_STATS is not set
-# CONFIG_HDC100X is not set
-# CONFIG_HDLC is not set
-# CONFIG_HDLC_CISCO is not set
-# CONFIG_HDLC_FR is not set
-# CONFIG_HDLC_PPP is not set
-# CONFIG_HDLC_RAW is not set
-# CONFIG_HDLC_RAW_ETH is not set
-# CONFIG_HDMI_LPE_AUDIO is not set
-# CONFIG_HDQ_MASTER_OMAP is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_HEADERS_INSTALL is not set
-# CONFIG_HEADER_TEST is not set
-# CONFIG_HERMES is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFS_FS_POSIX_ACL is not set
-# CONFIG_HI8435 is not set
-# CONFIG_HIBERNATION is not set
-# CONFIG_HID is not set
-# CONFIG_HIDRAW is not set
-# CONFIG_HID_A4TECH is not set
-# CONFIG_HID_ACCUTOUCH is not set
-# CONFIG_HID_ACRUX is not set
-# CONFIG_HID_ACRUX_FF is not set
-# CONFIG_HID_ALPS is not set
-# CONFIG_HID_APPLE is not set
-# CONFIG_HID_APPLEIR is not set
-# CONFIG_HID_ASUS is not set
-# CONFIG_HID_AUREAL is not set
-# CONFIG_HID_BATTERY_STRENGTH is not set
-# CONFIG_HID_BELKIN is not set
-# CONFIG_HID_BETOP_FF is not set
-# CONFIG_HID_BIGBEN_FF is not set
-# CONFIG_HID_CHERRY is not set
-# CONFIG_HID_CHICONY is not set
-# CONFIG_HID_CMEDIA is not set
-# CONFIG_HID_CORSAIR is not set
-# CONFIG_HID_COUGAR is not set
-# CONFIG_HID_CP2112 is not set
-# CONFIG_HID_CREATIVE_SB0540 is not set
-# CONFIG_HID_CYPRESS is not set
-# CONFIG_HID_DRAGONRISE is not set
-# CONFIG_HID_ELAN is not set
-# CONFIG_HID_ELECOM is not set
-# CONFIG_HID_ELO is not set
-# CONFIG_HID_EMS_FF is not set
-# CONFIG_HID_EZKEY is not set
-# CONFIG_HID_GEMBIRD is not set
-# CONFIG_HID_GENERIC is not set
-# CONFIG_HID_GFRM is not set
-# CONFIG_HID_GOOGLE_HAMMER is not set
-# CONFIG_HID_GREENASIA is not set
-# CONFIG_HID_GT683R is not set
-# CONFIG_HID_GYRATION is not set
-# CONFIG_HID_HOLTEK is not set
-# CONFIG_HID_ICADE is not set
-# CONFIG_HID_ITE is not set
-# CONFIG_HID_JABRA is not set
-# CONFIG_HID_KENSINGTON is not set
-# CONFIG_HID_KEYTOUCH is not set
-# CONFIG_HID_KYE is not set
-# CONFIG_HID_LCPOWER is not set
-# CONFIG_HID_LED is not set
-# CONFIG_HID_LENOVO is not set
-# CONFIG_HID_LOGITECH is not set
-# CONFIG_HID_LOGITECH_DJ is not set
-# CONFIG_HID_LOGITECH_HIDPP is not set
-# CONFIG_HID_MACALLY is not set
-# CONFIG_HID_MAGICMOUSE is not set
-# CONFIG_HID_MALTRON is not set
-# CONFIG_HID_MAYFLASH is not set
-# CONFIG_HID_MICROSOFT is not set
-# CONFIG_HID_MONTEREY is not set
-# CONFIG_HID_MULTITOUCH is not set
-# CONFIG_HID_NTI is not set
-# CONFIG_HID_NTRIG is not set
-# CONFIG_HID_ORTEK is not set
-# CONFIG_HID_PANTHERLORD is not set
-# CONFIG_HID_PENMOUNT is not set
-# CONFIG_HID_PETALYNX is not set
-# CONFIG_HID_PICOLCD is not set
-# CONFIG_HID_PID is not set
-# CONFIG_HID_PLANTRONICS is not set
-# CONFIG_HID_PRIMAX is not set
-# CONFIG_HID_PRODIKEYS is not set
-# CONFIG_HID_REDRAGON is not set
-# CONFIG_HID_RETRODE is not set
-# CONFIG_HID_RMI is not set
-# CONFIG_HID_ROCCAT is not set
-# CONFIG_HID_SAITEK is not set
-# CONFIG_HID_SAMSUNG is not set
-# CONFIG_HID_SENSOR_HUB is not set
-# CONFIG_HID_SMARTJOYPLUS is not set
-# CONFIG_HID_SONY is not set
-# CONFIG_HID_SPEEDLINK is not set
-# CONFIG_HID_STEAM is not set
-# CONFIG_HID_STEELSERIES is not set
-# CONFIG_HID_SUNPLUS is not set
-# CONFIG_HID_THINGM is not set
-# CONFIG_HID_THRUSTMASTER is not set
-# CONFIG_HID_TIVO is not set
-# CONFIG_HID_TOPSEED is not set
-# CONFIG_HID_TWINHAN is not set
-# CONFIG_HID_U2FZERO is not set
-# CONFIG_HID_UCLOGIC is not set
-# CONFIG_HID_UDRAW_PS3 is not set
-# CONFIG_HID_VIEWSONIC is not set
-# CONFIG_HID_WACOM is not set
-# CONFIG_HID_WALTOP is not set
-# CONFIG_HID_WIIMOTE is not set
-# CONFIG_HID_XINMO is not set
-# CONFIG_HID_ZEROPLUS is not set
-# CONFIG_HID_ZYDACRON is not set
-# CONFIG_HIGHMEM is not set
-CONFIG_HIGH_RES_TIMERS=y
-# CONFIG_HINIC is not set
-# CONFIG_HIP04_ETH is not set
-# CONFIG_HIPPI is not set
-# CONFIG_HISILICON_ERRATUM_161010101 is not set
-# CONFIG_HISILICON_ERRATUM_161600802 is not set
-# CONFIG_HISI_FEMAC is not set
-# CONFIG_HIX5HD2_GMAC is not set
-# CONFIG_HMC6352 is not set
-# CONFIG_HNS is not set
-# CONFIG_HNS3 is not set
-# CONFIG_HNS_DSAF is not set
-# CONFIG_HNS_ENET is not set
-# CONFIG_HOSTAP is not set
-# CONFIG_HOSTAP_CS is not set
-# CONFIG_HOSTAP_PCI is not set
-# CONFIG_HOSTAP_PLX is not set
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_HOTPLUG_PCI is not set
-# CONFIG_HP03 is not set
-# CONFIG_HP100 is not set
-# CONFIG_HP206C is not set
-CONFIG_HPET_MMAP_DEFAULT=y
-# CONFIG_HPFS_FS is not set
-# CONFIG_HP_ILO is not set
-# CONFIG_HP_WIRELESS is not set
-# CONFIG_HSA_AMD is not set
-# CONFIG_HSI is not set
-# CONFIG_HSR is not set
-# CONFIG_HTC_EGPIO is not set
-# CONFIG_HTC_I2CPLD is not set
-# CONFIG_HTC_PASIC3 is not set
-# CONFIG_HTS221 is not set
-# CONFIG_HTU21 is not set
-# CONFIG_HUGETLBFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-# CONFIG_HVC_DCC is not set
-# CONFIG_HVC_UDBG is not set
-# CONFIG_HWLAT_TRACER is not set
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-# CONFIG_HWMON_VID is not set
-# CONFIG_HWSPINLOCK is not set
-# CONFIG_HWSPINLOCK_OMAP is not set
-CONFIG_HW_PERF_EVENTS=y
-# CONFIG_HW_RANDOM is not set
-# CONFIG_HW_RANDOM_AMD is not set
-# CONFIG_HW_RANDOM_ATMEL is not set
-# CONFIG_HW_RANDOM_CAVIUM is not set
-# CONFIG_HW_RANDOM_EXYNOS is not set
-# CONFIG_HW_RANDOM_GEODE is not set
-# CONFIG_HW_RANDOM_INTEL is not set
-# CONFIG_HW_RANDOM_IPROC_RNG200 is not set
-# CONFIG_HW_RANDOM_OMAP is not set
-# CONFIG_HW_RANDOM_OMAP3_ROM is not set
-# CONFIG_HW_RANDOM_PPC4XX is not set
-# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-CONFIG_HW_RANDOM_TPM=y
-# CONFIG_HW_RANDOM_VIA is not set
-# CONFIG_HW_RANDOM_VIRTIO is not set
-# CONFIG_HX711 is not set
-# CONFIG_HYPERV is not set
-# CONFIG_HYPERV_TSCPAGE is not set
-# CONFIG_HYSDN is not set
-CONFIG_HZ=100
-CONFIG_HZ_100=y
-# CONFIG_HZ_1000 is not set
-# CONFIG_HZ_1024 is not set
-# CONFIG_HZ_128 is not set
-# CONFIG_HZ_200 is not set
-# CONFIG_HZ_24 is not set
-# CONFIG_HZ_250 is not set
-# CONFIG_HZ_256 is not set
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_48 is not set
-# CONFIG_HZ_500 is not set
-# CONFIG_HZ_PERIODIC is not set
-# CONFIG_I2C is not set
-# CONFIG_I2C_ALGOBIT is not set
-# CONFIG_I2C_ALGOPCA is not set
-# CONFIG_I2C_ALGOPCF is not set
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
-# CONFIG_I2C_AU1550 is not set
-# CONFIG_I2C_BCM2835 is not set
-# CONFIG_I2C_BCM_IPROC is not set
-# CONFIG_I2C_CADENCE is not set
-# CONFIG_I2C_CBUS_GPIO is not set
-# CONFIG_I2C_CHARDEV is not set
-# CONFIG_I2C_COMPAT is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEMUX_PINCTRL is not set
-# CONFIG_I2C_DESIGNWARE_PCI is not set
-# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
-# CONFIG_I2C_DESIGNWARE_SLAVE is not set
-# CONFIG_I2C_DIOLAN_U2C is not set
-# CONFIG_I2C_EG20T is not set
-# CONFIG_I2C_ELEKTOR is not set
-# CONFIG_I2C_EMEV2 is not set
-# CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set
-# CONFIG_I2C_HELPER_AUTO is not set
-# CONFIG_I2C_HID is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_IBM_IIC is not set
-# CONFIG_I2C_IMG is not set
-# CONFIG_I2C_ISCH is not set
-# CONFIG_I2C_ISMT is not set
-# CONFIG_I2C_JZ4780 is not set
-# CONFIG_I2C_MLXCPLD is not set
-# CONFIG_I2C_MPC is not set
-# CONFIG_I2C_MUX is not set
-# CONFIG_I2C_MUX_GPIO is not set
-# CONFIG_I2C_MUX_GPMUX is not set
-# CONFIG_I2C_MUX_LTC4306 is not set
-# CONFIG_I2C_MUX_MLXCPLD is not set
-# CONFIG_I2C_MUX_PCA9541 is not set
-# CONFIG_I2C_MUX_PCA954x is not set
-# CONFIG_I2C_MUX_PINCTRL is not set
-# CONFIG_I2C_MUX_REG is not set
-# CONFIG_I2C_MV64XXX is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_NOMADIK is not set
-# CONFIG_I2C_NVIDIA_GPU is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_OCTEON is not set
-# CONFIG_I2C_PARPORT is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PCA_ISA is not set
-# CONFIG_I2C_PCA_PLATFORM is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_PXA_PCI is not set
-# CONFIG_I2C_PXA_SLAVE is not set
-# CONFIG_I2C_RCAR is not set
-# CONFIG_I2C_RK3X is not set
-# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
-# CONFIG_I2C_S3C2410 is not set
-# CONFIG_I2C_SCMI is not set
-# CONFIG_I2C_SH_MOBILE is not set
-# CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_SLAVE is not set
-# CONFIG_I2C_SLAVE_EEPROM is not set
-# CONFIG_I2C_SMBUS is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_THUNDERX is not set
-# CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VERSATILE is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_XILINX is not set
-# CONFIG_I3C is not set
-# CONFIG_I40E is not set
-# CONFIG_I40EVF is not set
-# CONFIG_I6300ESB_WDT is not set
-# CONFIG_I82092 is not set
-# CONFIG_I82365 is not set
-# CONFIG_IAQCORE is not set
-# CONFIG_IBM_ASM is not set
-# CONFIG_IBM_EMAC_DEBUG is not set
-# CONFIG_IBM_EMAC_EMAC4 is not set
-# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set
-# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set
-# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set
-# CONFIG_IBM_EMAC_RGMII is not set
-# CONFIG_IBM_EMAC_TAH is not set
-# CONFIG_IBM_EMAC_ZMII is not set
-# CONFIG_ICE is not set
-# CONFIG_ICPLUS_PHY is not set
-# CONFIG_ICS932S401 is not set
-# CONFIG_IDE is not set
-# CONFIG_IDEAPAD_LAPTOP is not set
-# CONFIG_IDE_GD is not set
-# CONFIG_IDE_PROC_FS is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-# CONFIG_IDLE_PAGE_TRACKING is not set
-# CONFIG_IEEE802154 is not set
-# CONFIG_IEEE802154_ADF7242 is not set
-# CONFIG_IEEE802154_ATUSB is not set
-# CONFIG_IEEE802154_CA8210 is not set
-# CONFIG_IEEE802154_HWSIM is not set
-# CONFIG_IEEE802154_MCR20A is not set
-# CONFIG_IFB is not set
-# CONFIG_IGB is not set
-# CONFIG_IGBVF is not set
-# CONFIG_IGC is not set
-# CONFIG_IIO is not set
-# CONFIG_IIO_BUFFER is not set
-# CONFIG_IIO_BUFFER_CB is not set
-# CONFIG_IIO_BUFFER_HW_CONSUMER is not set
-# CONFIG_IIO_CONFIGFS is not set
-CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
-# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set
-# CONFIG_IIO_INTERRUPT_TRIGGER is not set
-# CONFIG_IIO_MUX is not set
-# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set
-# CONFIG_IIO_RESCALE is not set
-# CONFIG_IIO_SIMPLE_DUMMY is not set
-# CONFIG_IIO_SSP_SENSORHUB is not set
-# CONFIG_IIO_ST_ACCEL_3AXIS is not set
-# CONFIG_IIO_ST_GYRO_3AXIS is not set
-# CONFIG_IIO_ST_LSM6DSX is not set
-# CONFIG_IIO_ST_MAGN_3AXIS is not set
-# CONFIG_IIO_ST_PRESS is not set
-# CONFIG_IIO_SW_DEVICE is not set
-# CONFIG_IIO_SW_TRIGGER is not set
-# CONFIG_IIO_SYSFS_TRIGGER is not set
-# CONFIG_IIO_TRIGGER is not set
-# CONFIG_IKCONFIG is not set
-# CONFIG_IKCONFIG_PROC is not set
-# CONFIG_IKHEADERS is not set
-# CONFIG_IMA is not set
-# CONFIG_IMAGE_CMDLINE_HACK is not set
-# CONFIG_IMGPDC_WDT is not set
-# CONFIG_IMG_MDC_DMA is not set
-# CONFIG_IMX7D_ADC is not set
-# CONFIG_IMX_IPUV3_CORE is not set
-# CONFIG_IMX_THERMAL is not set
-# CONFIG_INA2XX_ADC is not set
-# CONFIG_INDIRECT_PIO is not set
-CONFIG_INET=y
-# CONFIG_INET6_AH is not set
-# CONFIG_INET6_ESP is not set
-# CONFIG_INET6_IPCOMP is not set
-# CONFIG_INET6_TUNNEL is not set
-# CONFIG_INET6_XFRM_MODE_BEET is not set
-# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_DIAG is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_INET_LRO is not set
-# CONFIG_INET_TCP_DIAG is not set
-# CONFIG_INET_TUNNEL is not set
-# CONFIG_INET_UDP_DIAG is not set
-# CONFIG_INET_XFRM_MODE_BEET is not set
-# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-# CONFIG_INET_XFRM_TUNNEL is not set
-# CONFIG_INFINIBAND is not set
-# CONFIG_INFTL is not set
-# CONFIG_INGENIC_ADC is not set
-# CONFIG_INGENIC_CGU_JZ4725B is not set
-# CONFIG_INGENIC_CGU_JZ4740 is not set
-# CONFIG_INGENIC_CGU_JZ4770 is not set
-# CONFIG_INGENIC_CGU_JZ4780 is not set
-# CONFIG_INGENIC_TCU_CLK is not set
-# CONFIG_INGENIC_TCU_IRQ is not set
-# CONFIG_INGENIC_TIMER is not set
-CONFIG_INIT_ENV_ARG_LIMIT=32
-# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
-# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
-CONFIG_INIT_STACK_NONE=y
-# CONFIG_INLINE_READ_LOCK is not set
-# CONFIG_INLINE_READ_LOCK_BH is not set
-# CONFIG_INLINE_READ_LOCK_IRQ is not set
-# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_READ_TRYLOCK is not set
-CONFIG_INLINE_READ_UNLOCK=y
-# CONFIG_INLINE_READ_UNLOCK_BH is not set
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_SPIN_LOCK is not set
-# CONFIG_INLINE_SPIN_LOCK_BH is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
-# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_SPIN_TRYLOCK is not set
-# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
-# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
-# CONFIG_INLINE_WRITE_LOCK is not set
-# CONFIG_INLINE_WRITE_LOCK_BH is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
-# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
-# CONFIG_INLINE_WRITE_TRYLOCK is not set
-CONFIG_INLINE_WRITE_UNLOCK=y
-# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
-# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
-CONFIG_INOTIFY_USER=y
-# CONFIG_INPUT is not set
-# CONFIG_INPUT_AD714X is not set
-# CONFIG_INPUT_ADXL34X is not set
-# CONFIG_INPUT_APANEL is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_ATLAS_BTNS is not set
-# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
-# CONFIG_INPUT_AXP20X_PEK is not set
-# CONFIG_INPUT_BMA150 is not set
-# CONFIG_INPUT_CM109 is not set
-# CONFIG_INPUT_CMA3000 is not set
-# CONFIG_INPUT_DRV260X_HAPTICS is not set
-# CONFIG_INPUT_DRV2665_HAPTICS is not set
-# CONFIG_INPUT_DRV2667_HAPTICS is not set
-# CONFIG_INPUT_E3X0_BUTTON is not set
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_GP2A is not set
-# CONFIG_INPUT_GPIO_BEEPER is not set
-# CONFIG_INPUT_GPIO_DECODER is not set
-# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
-# CONFIG_INPUT_GPIO_TILT_POLLED is not set
-# CONFIG_INPUT_GPIO_VIBRA is not set
-# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set
-# CONFIG_INPUT_IMS_PCU is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_KXTJ9 is not set
-# CONFIG_INPUT_LEDS is not set
-# CONFIG_INPUT_MATRIXKMAP is not set
-# CONFIG_INPUT_MAX8997_HAPTIC is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_MMA8450 is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_MPU3050 is not set
-# CONFIG_INPUT_MSM_VIBRATOR is not set
-# CONFIG_INPUT_PALMAS_PWRBUTTON is not set
-# CONFIG_INPUT_PCF8574 is not set
-# CONFIG_INPUT_PCSPKR is not set
-# CONFIG_INPUT_POLLDEV is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_PWM_BEEPER is not set
-# CONFIG_INPUT_PWM_VIBRA is not set
-# CONFIG_INPUT_REGULATOR_HAPTIC is not set
-# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set
-# CONFIG_INPUT_SPARSEKMAP is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_TPS65218_PWRBUTTON is not set
-# CONFIG_INPUT_TWL4030_PWRBUTTON is not set
-# CONFIG_INPUT_TWL4030_VIBRA is not set
-# CONFIG_INPUT_TWL6040_VIBRA is not set
-# CONFIG_INPUT_UINPUT is not set
-# CONFIG_INPUT_WISTRON_BTNS is not set
-# CONFIG_INPUT_YEALINK is not set
-# CONFIG_INT340X_THERMAL is not set
-# CONFIG_INTEGRITY is not set
-# CONFIG_INTEGRITY_AUDIT is not set
-# CONFIG_INTEGRITY_SIGNATURE is not set
-# CONFIG_INTEL_ATOMISP2_PM is not set
-# CONFIG_INTEL_CHT_INT33FE is not set
-# CONFIG_INTEL_HID_EVENT is not set
-# CONFIG_INTEL_IDLE is not set
-# CONFIG_INTEL_IDMA64 is not set
-# CONFIG_INTEL_IOATDMA is not set
-# CONFIG_INTEL_ISH_HID is not set
-# CONFIG_INTEL_MEI is not set
-# CONFIG_INTEL_MEI_ME is not set
-# CONFIG_INTEL_MEI_TXE is not set
-# CONFIG_INTEL_MIC_CARD is not set
-# CONFIG_INTEL_MIC_HOST is not set
-# CONFIG_INTEL_MID_PTI is not set
-# CONFIG_INTEL_OAKTRAIL is not set
-# CONFIG_INTEL_PMC_CORE is not set
-# CONFIG_INTEL_PUNIT_IPC is not set
-# CONFIG_INTEL_RST is not set
-# CONFIG_INTEL_SMARTCONNECT is not set
-# CONFIG_INTEL_SOC_PMIC is not set
-# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set
-# CONFIG_INTEL_SOC_PMIC_CHTWC is not set
-# CONFIG_INTEL_TH is not set
-# CONFIG_INTEL_VBTN is not set
-# CONFIG_INTEL_XWAY_PHY is not set
-# CONFIG_INTERCONNECT is not set
-# CONFIG_INTERVAL_TREE_TEST is not set
-# CONFIG_INV_MPU6050_I2C is not set
-# CONFIG_INV_MPU6050_IIO is not set
-# CONFIG_INV_MPU6050_SPI is not set
-# CONFIG_IOMMU_SUPPORT is not set
-# CONFIG_IONIC is not set
-# CONFIG_IOSCHED_BFQ is not set
-# CONFIG_IOSCHED_CFQ is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IO_STRICT_DEVMEM=y
-# CONFIG_IO_URING is not set
-# CONFIG_IP17XX_PHY is not set
-# CONFIG_IP6_NF_FILTER is not set
-# CONFIG_IP6_NF_IPTABLES is not set
-# CONFIG_IP6_NF_MANGLE is not set
-# CONFIG_IP6_NF_MATCH_AH is not set
-# CONFIG_IP6_NF_MATCH_EUI64 is not set
-# CONFIG_IP6_NF_MATCH_FRAG is not set
-# CONFIG_IP6_NF_MATCH_HL is not set
-# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
-# CONFIG_IP6_NF_MATCH_MH is not set
-# CONFIG_IP6_NF_MATCH_OPTS is not set
-# CONFIG_IP6_NF_MATCH_RPFILTER is not set
-# CONFIG_IP6_NF_MATCH_RT is not set
-# CONFIG_IP6_NF_MATCH_SRH is not set
-# CONFIG_IP6_NF_NAT is not set
-# CONFIG_IP6_NF_RAW is not set
-# CONFIG_IP6_NF_SECURITY is not set
-# CONFIG_IP6_NF_TARGET_HL is not set
-# CONFIG_IP6_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP6_NF_TARGET_REJECT is not set
-# CONFIG_IP6_NF_TARGET_SYNPROXY is not set
-# CONFIG_IPACK_BUS is not set
-# CONFIG_IPC_NS is not set
-# CONFIG_IPMB_DEVICE_INTERFACE is not set
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_IPV6 is not set
-# CONFIG_IPV6_FOU is not set
-# CONFIG_IPV6_FOU_TUNNEL is not set
-# CONFIG_IPV6_ILA is not set
-# CONFIG_IPV6_MIP6 is not set
-# CONFIG_IPV6_MROUTE is not set
-# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set
-# CONFIG_IPV6_MULTIPLE_TABLES is not set
-CONFIG_IPV6_NDISC_NODETYPE=y
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_ROUTE_INFO is not set
-# CONFIG_IPV6_SEG6_HMAC is not set
-# CONFIG_IPV6_SIT is not set
-# CONFIG_IPV6_SIT_6RD is not set
-# CONFIG_IPV6_TUNNEL is not set
-# CONFIG_IPV6_VTI is not set
-# CONFIG_IPVLAN is not set
-# CONFIG_IPVTAP is not set
-# CONFIG_IPW2100 is not set
-# CONFIG_IPW2100_DEBUG is not set
-CONFIG_IPW2100_MONITOR=y
-# CONFIG_IPW2200 is not set
-# CONFIG_IPW2200_DEBUG is not set
-CONFIG_IPW2200_MONITOR=y
-# CONFIG_IPW2200_PROMISCUOUS is not set
-# CONFIG_IPW2200_QOS is not set
-# CONFIG_IPW2200_RADIOTAP is not set
-# CONFIG_IPWIRELESS is not set
-# CONFIG_IPX is not set
-CONFIG_IP_ADVANCED_ROUTER=y
-# CONFIG_IP_DCCP is not set
-# CONFIG_IP_FIB_TRIE_STATS is not set
-# CONFIG_IP_MROUTE is not set
-CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_MULTIPLE_TABLES=y
-# CONFIG_IP_NF_ARPFILTER is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-# CONFIG_IP_NF_ARP_MANGLE is not set
-# CONFIG_IP_NF_FILTER is not set
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_MANGLE is not set
-# CONFIG_IP_NF_MATCH_AH is not set
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_RPFILTER is not set
-# CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_RAW is not set
-# CONFIG_IP_NF_SECURITY is not set
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
-# CONFIG_IP_NF_TARGET_ECN is not set
-# CONFIG_IP_NF_TARGET_MASQUERADE is not set
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_SYNPROXY is not set
-# CONFIG_IP_NF_TARGET_TTL is not set
-# CONFIG_IP_PIMSM_V1 is not set
-# CONFIG_IP_PIMSM_V2 is not set
-# CONFIG_IP_PNP is not set
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-# CONFIG_IP_SCTP is not set
-# CONFIG_IP_SET is not set
-# CONFIG_IP_SET_HASH_IPMAC is not set
-# CONFIG_IP_VS is not set
-# CONFIG_IP_VS_MH is not set
-CONFIG_IP_VS_MH_TAB_INDEX=10
-# CONFIG_IRDA is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_IRQ_ALL_CPUS is not set
-# CONFIG_IRQ_DOMAIN_DEBUG is not set
-# CONFIG_IRQ_POLL is not set
-# CONFIG_IRQ_TIME_ACCOUNTING is not set
-# CONFIG_IR_GPIO_CIR is not set
-# CONFIG_IR_HIX5HD2 is not set
-# CONFIG_IR_IGORPLUGUSB is not set
-# CONFIG_IR_IGUANA is not set
-# CONFIG_IR_IMG is not set
-# CONFIG_IR_IMON is not set
-# CONFIG_IR_JVC_DECODER is not set
-# CONFIG_IR_LIRC_CODEC is not set
-# CONFIG_IR_MCEUSB is not set
-# CONFIG_IR_NEC_DECODER is not set
-# CONFIG_IR_RC5_DECODER is not set
-# CONFIG_IR_RC6_DECODER is not set
-# CONFIG_IR_REDRAT3 is not set
-# CONFIG_IR_SONY_DECODER is not set
-# CONFIG_IR_STREAMZAP is not set
-# CONFIG_IR_TTUSBIR is not set
-# CONFIG_ISA_BUS is not set
-# CONFIG_ISA_BUS_API is not set
-# CONFIG_ISCSI_BOOT_SYSFS is not set
-# CONFIG_ISCSI_TCP is not set
-CONFIG_ISDN=y
-# CONFIG_ISDN_AUDIO is not set
-# CONFIG_ISDN_CAPI is not set
-# CONFIG_ISDN_CAPI_CAPIDRV is not set
-# CONFIG_ISDN_DIVERSION is not set
-# CONFIG_ISDN_DRV_ACT2000 is not set
-# CONFIG_ISDN_DRV_GIGASET is not set
-# CONFIG_ISDN_DRV_HISAX is not set
-# CONFIG_ISDN_DRV_ICN is not set
-# CONFIG_ISDN_DRV_LOOP is not set
-# CONFIG_ISDN_DRV_PCBIT is not set
-# CONFIG_ISDN_DRV_SC is not set
-# CONFIG_ISDN_I4L is not set
-# CONFIG_ISL29003 is not set
-# CONFIG_ISL29020 is not set
-# CONFIG_ISL29125 is not set
-# CONFIG_ISL29501 is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_ISS4xx is not set
-# CONFIG_ITG3200 is not set
-# CONFIG_IWL3945 is not set
-# CONFIG_IWLWIFI is not set
-# CONFIG_IXGB is not set
-# CONFIG_IXGBE is not set
-# CONFIG_IXGBEVF is not set
-# CONFIG_JAILHOUSE_GUEST is not set
-# CONFIG_JBD2_DEBUG is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_POSIX_ACL is not set
-# CONFIG_JFFS2_FS_SECURITY is not set
-# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_FS_XATTR=y
-CONFIG_JFFS2_LZMA=y
-# CONFIG_JFFS2_LZO is not set
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_ZLIB is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_POSIX_ACL is not set
-# CONFIG_JFS_SECURITY is not set
-# CONFIG_JFS_STATISTICS is not set
-# CONFIG_JME is not set
-CONFIG_JOLIET=y
-# CONFIG_JSA1212 is not set
-# CONFIG_JUMP_LABEL is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set
-# CONFIG_KALLSYMS_ALL is not set
-CONFIG_KALLSYMS_BASE_RELATIVE=y
-# CONFIG_KALLSYMS_UNCOMPRESSED is not set
-# CONFIG_KARMA_PARTITION is not set
-# CONFIG_KASAN is not set
-CONFIG_KASAN_STACK=1
-# CONFIG_KCOV is not set
-# CONFIG_KERNEL_BZIP2 is not set
-# CONFIG_KERNEL_CAT is not set
-# CONFIG_KERNEL_GZIP is not set
-# CONFIG_KERNEL_LZ4 is not set
-# CONFIG_KERNEL_LZMA is not set
-# CONFIG_KERNEL_LZO is not set
-CONFIG_KERNEL_MODE_NEON=y
-CONFIG_KERNEL_XZ=y
-CONFIG_KERNFS=y
-# CONFIG_KEXEC is not set
-# CONFIG_KEXEC_FILE is not set
-# CONFIG_KEXEC_SIG is not set
-# CONFIG_KEYBOARD_ADC is not set
-# CONFIG_KEYBOARD_ADP5588 is not set
-# CONFIG_KEYBOARD_ADP5589 is not set
-# CONFIG_KEYBOARD_APPLESPI is not set
-# CONFIG_KEYBOARD_ATKBD is not set
-# CONFIG_KEYBOARD_BCM is not set
-# CONFIG_KEYBOARD_CAP11XX is not set
-# CONFIG_KEYBOARD_DLINK_DIR685 is not set
-# CONFIG_KEYBOARD_GPIO is not set
-# CONFIG_KEYBOARD_GPIO_POLLED is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_LM8323 is not set
-# CONFIG_KEYBOARD_LM8333 is not set
-# CONFIG_KEYBOARD_MATRIX is not set
-# CONFIG_KEYBOARD_MAX7359 is not set
-# CONFIG_KEYBOARD_MCS is not set
-# CONFIG_KEYBOARD_MPR121 is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_OMAP4 is not set
-# CONFIG_KEYBOARD_OPENCORES is not set
-# CONFIG_KEYBOARD_PXA27x is not set
-# CONFIG_KEYBOARD_QT1050 is not set
-# CONFIG_KEYBOARD_QT1070 is not set
-# CONFIG_KEYBOARD_QT2160 is not set
-# CONFIG_KEYBOARD_SAMSUNG is not set
-# CONFIG_KEYBOARD_SH_KEYSC is not set
-# CONFIG_KEYBOARD_SNVS_PWRKEY is not set
-# CONFIG_KEYBOARD_STMPE is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_TCA6416 is not set
-# CONFIG_KEYBOARD_TCA8418 is not set
-# CONFIG_KEYBOARD_TEGRA is not set
-# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set
-# CONFIG_KEYBOARD_TWL4030 is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYS is not set
-# CONFIG_KEYS_REQUEST_CACHE is not set
-# CONFIG_KEY_DH_OPERATIONS is not set
-# CONFIG_KGDB is not set
-# CONFIG_KMEMCHECK is not set
-# CONFIG_KMX61 is not set
-# CONFIG_KPC2000 is not set
-# CONFIG_KPROBES is not set
-# CONFIG_KPROBES_SANITY_TEST is not set
-# CONFIG_KS7010 is not set
-# CONFIG_KS8842 is not set
-# CONFIG_KS8851 is not set
-# CONFIG_KS8851_MLL is not set
-# CONFIG_KSM is not set
-# CONFIG_KSZ884X_PCI is not set
-CONFIG_KUSER_HELPERS=y
-# CONFIG_KVM_AMD is not set
-# CONFIG_KVM_AMD_SEV is not set
-# CONFIG_KVM_GUEST is not set
-# CONFIG_KVM_INTEL is not set
-# CONFIG_KXCJK1013 is not set
-# CONFIG_KXSD9 is not set
-# CONFIG_L2TP is not set
-# CONFIG_L2TP_ETH is not set
-# CONFIG_L2TP_IP is not set
-# CONFIG_L2TP_V3 is not set
-# CONFIG_LAN743X is not set
-# CONFIG_LANMEDIA is not set
-# CONFIG_LANTIQ is not set
-# CONFIG_LAPB is not set
-# CONFIG_LASAT is not set
-# CONFIG_LATENCYTOP is not set
-# CONFIG_LATTICE_ECP3_CONFIG is not set
-CONFIG_LBDAF=y
-# CONFIG_LCD_AMS369FG06 is not set
-# CONFIG_LCD_CLASS_DEVICE is not set
-# CONFIG_LCD_HX8357 is not set
-# CONFIG_LCD_ILI922X is not set
-# CONFIG_LCD_ILI9320 is not set
-# CONFIG_LCD_L4F00242T03 is not set
-# CONFIG_LCD_LD9040 is not set
-# CONFIG_LCD_LMS283GF05 is not set
-# CONFIG_LCD_LMS501KF03 is not set
-# CONFIG_LCD_LTV350QV is not set
-# CONFIG_LCD_OTM3225A is not set
-# CONFIG_LCD_S6E63M0 is not set
-# CONFIG_LCD_TDO24M is not set
-# CONFIG_LCD_VGG2432A4 is not set
-CONFIG_LDISC_AUTOLOAD=y
-# CONFIG_LDM_PARTITION is not set
-CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y
-# CONFIG_LEDS_AN30259A is not set
-# CONFIG_LEDS_APU is not set
-# CONFIG_LEDS_BCM6328 is not set
-# CONFIG_LEDS_BCM6358 is not set
-# CONFIG_LEDS_BD2802 is not set
-# CONFIG_LEDS_BLINKM is not set
-CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y
-CONFIG_LEDS_CLASS=y
-# CONFIG_LEDS_CLASS_FLASH is not set
-# CONFIG_LEDS_CR0014114 is not set
-# CONFIG_LEDS_DAC124S085 is not set
-# CONFIG_LEDS_GPIO is not set
-# CONFIG_LEDS_INTEL_SS4200 is not set
-# CONFIG_LEDS_IS31FL319X is not set
-# CONFIG_LEDS_IS31FL32XX is not set
-# CONFIG_LEDS_LM3530 is not set
-# CONFIG_LEDS_LM3532 is not set
-# CONFIG_LEDS_LM355x is not set
-# CONFIG_LEDS_LM3642 is not set
-# CONFIG_LEDS_LM3692X is not set
-# CONFIG_LEDS_LP3944 is not set
-# CONFIG_LEDS_LP3952 is not set
-# CONFIG_LEDS_LP5521 is not set
-# CONFIG_LEDS_LP5523 is not set
-# CONFIG_LEDS_LP5562 is not set
-# CONFIG_LEDS_LP8501 is not set
-# CONFIG_LEDS_LP8860 is not set
-# CONFIG_LEDS_LT3593 is not set
-# CONFIG_LEDS_MLXCPLD is not set
-# CONFIG_LEDS_MLXREG is not set
-# CONFIG_LEDS_NIC78BX is not set
-# CONFIG_LEDS_NS2 is not set
-# CONFIG_LEDS_OT200 is not set
-# CONFIG_LEDS_PCA9532 is not set
-# CONFIG_LEDS_PCA955X is not set
-# CONFIG_LEDS_PCA963X is not set
-# CONFIG_LEDS_PWM is not set
-# CONFIG_LEDS_REGULATOR is not set
-# CONFIG_LEDS_SPI_BYTE is not set
-# CONFIG_LEDS_SYSCON is not set
-# CONFIG_LEDS_TCA6507 is not set
-# CONFIG_LEDS_TI_LMU_COMMON is not set
-# CONFIG_LEDS_TLC591XX is not set
-CONFIG_LEDS_TRIGGERS=y
-# CONFIG_LEDS_TRIGGER_ACTIVITY is not set
-# CONFIG_LEDS_TRIGGER_AUDIO is not set
-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-# CONFIG_LEDS_TRIGGER_CAMERA is not set
-# CONFIG_LEDS_TRIGGER_CPU is not set
-CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
-# CONFIG_LEDS_TRIGGER_DISK is not set
-# CONFIG_LEDS_TRIGGER_GPIO is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
-# CONFIG_LEDS_TRIGGER_MTD is not set
-CONFIG_LEDS_TRIGGER_NETDEV=y
-# CONFIG_LEDS_TRIGGER_ONESHOT is not set
-# CONFIG_LEDS_TRIGGER_PANIC is not set
-# CONFIG_LEDS_TRIGGER_PATTERN is not set
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEDS_TRIGGER_TRANSIENT is not set
-# CONFIG_LEDS_USER is not set
-# CONFIG_LED_TRIGGER_PHY is not set
-# CONFIG_LEGACY_PTYS is not set
-# CONFIG_LGUEST is not set
-# CONFIG_LIB80211 is not set
-# CONFIG_LIB80211_CRYPT_CCMP is not set
-# CONFIG_LIB80211_CRYPT_TKIP is not set
-# CONFIG_LIB80211_CRYPT_WEP is not set
-# CONFIG_LIB80211_DEBUG is not set
-# CONFIG_LIBCRC32C is not set
-# CONFIG_LIBERTAS is not set
-# CONFIG_LIBERTAS_THINFIRM is not set
-# CONFIG_LIBERTAS_USB is not set
-# CONFIG_LIBFC is not set
-# CONFIG_LIBFCOE is not set
-# CONFIG_LIBIPW_DEBUG is not set
-# CONFIG_LIBNVDIMM is not set
-# CONFIG_LIDAR_LITE_V2 is not set
-# CONFIG_LIQUIDIO is not set
-# CONFIG_LIQUIDIO_VF is not set
-# CONFIG_LIS3L02DQ is not set
-# CONFIG_LKDTM is not set
-CONFIG_LLC=y
-# CONFIG_LLC2 is not set
-# CONFIG_LMP91000 is not set
-# CONFIG_LNET is not set
-CONFIG_LOCALVERSION=""
-# CONFIG_LOCALVERSION_AUTO is not set
-# CONFIG_LOCKD is not set
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_LOCKD_V4=y
-# CONFIG_LOCKUP_DETECTOR is not set
-# CONFIG_LOCK_EVENT_COUNTS is not set
-# CONFIG_LOCK_STAT is not set
-# CONFIG_LOCK_TORTURE_TEST is not set
-# CONFIG_LOGFS is not set
-# CONFIG_LOGIG940_FF is not set
-# CONFIG_LOGIRUMBLEPAD2_FF is not set
-# CONFIG_LOGITECH_FF is not set
-# CONFIG_LOGIWHEELS_FF is not set
-# CONFIG_LOGO is not set
-CONFIG_LOG_BUF_SHIFT=17
-CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
-# CONFIG_LOONGSON_MC146818 is not set
-# CONFIG_LPC_ICH is not set
-# CONFIG_LPC_SCH is not set
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_LSI_ET1011C_PHY is not set
-CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
-CONFIG_LSM_MMAP_MIN_ADDR=65536
-# CONFIG_LTC1660 is not set
-# CONFIG_LTC2471 is not set
-# CONFIG_LTC2485 is not set
-# CONFIG_LTC2497 is not set
-# CONFIG_LTC2632 is not set
-# CONFIG_LTE_GDM724X is not set
-# CONFIG_LTPC is not set
-# CONFIG_LTR501 is not set
-# CONFIG_LUSTRE_FS is not set
-# CONFIG_LV0104CS is not set
-# CONFIG_LWTUNNEL is not set
-# CONFIG_LXT_PHY is not set
-# CONFIG_LZ4HC_COMPRESS is not set
-# CONFIG_LZ4_COMPRESS is not set
-# CONFIG_LZ4_DECOMPRESS is not set
-CONFIG_LZMA_COMPRESS=y
-CONFIG_LZMA_DECOMPRESS=y
-# CONFIG_LZO_COMPRESS is not set
-# CONFIG_LZO_DECOMPRESS is not set
-# CONFIG_M62332 is not set
-# CONFIG_MAC80211 is not set
-# CONFIG_MAC80211_MESSAGE_TRACING is not set
-CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
-# CONFIG_MACB is not set
-# CONFIG_MACB_USE_HWSTAMP is not set
-# CONFIG_MACH_ASM9260 is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MACH_INGENIC is not set
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_JZ4740 is not set
-# CONFIG_MACH_LOONGSON32 is not set
-# CONFIG_MACH_LOONGSON64 is not set
-# CONFIG_MACH_PIC32 is not set
-# CONFIG_MACH_PISTACHIO is not set
-# CONFIG_MACH_TX39XX is not set
-# CONFIG_MACH_TX49XX is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_MACH_XILFPGA is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-# CONFIG_MACSEC is not set
-# CONFIG_MACVLAN is not set
-# CONFIG_MACVTAP is not set
-# CONFIG_MAC_EMUMOUSEBTN is not set
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MAG3110 is not set
-# CONFIG_MAGIC_SYSRQ is not set
-CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
-# CONFIG_MAGIC_SYSRQ_SERIAL is not set
-# CONFIG_MAILBOX is not set
-# CONFIG_MANAGER_SBS is not set
-# CONFIG_MANDATORY_FILE_LOCKING is not set
-# CONFIG_MANGLE_BOOTARGS is not set
-# CONFIG_MARVELL_10G_PHY is not set
-# CONFIG_MARVELL_PHY is not set
-# CONFIG_MAX1027 is not set
-# CONFIG_MAX11100 is not set
-# CONFIG_MAX1118 is not set
-# CONFIG_MAX1363 is not set
-# CONFIG_MAX30100 is not set
-# CONFIG_MAX30102 is not set
-# CONFIG_MAX31856 is not set
-# CONFIG_MAX44000 is not set
-# CONFIG_MAX44009 is not set
-# CONFIG_MAX517 is not set
-# CONFIG_MAX5432 is not set
-# CONFIG_MAX5481 is not set
-# CONFIG_MAX5487 is not set
-# CONFIG_MAX5821 is not set
-# CONFIG_MAX63XX_WATCHDOG is not set
-# CONFIG_MAX9611 is not set
-# CONFIG_MAXIM_THERMOCOUPLE is not set
-CONFIG_MAY_USE_DEVLINK=y
-# CONFIG_MB1232 is not set
-# CONFIG_MC3230 is not set
-# CONFIG_MCB is not set
-# CONFIG_MCP320X is not set
-# CONFIG_MCP3422 is not set
-# CONFIG_MCP3911 is not set
-# CONFIG_MCP4018 is not set
-# CONFIG_MCP41010 is not set
-# CONFIG_MCP4131 is not set
-# CONFIG_MCP4531 is not set
-# CONFIG_MCP4725 is not set
-# CONFIG_MCP4922 is not set
-# CONFIG_MCPM is not set
-# CONFIG_MD is not set
-# CONFIG_MDIO_BCM_UNIMAC is not set
-# CONFIG_MDIO_BITBANG is not set
-# CONFIG_MDIO_BUS_MUX_GPIO is not set
-# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
-# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
-# CONFIG_MDIO_DEVICE is not set
-# CONFIG_MDIO_HISI_FEMAC is not set
-# CONFIG_MDIO_MSCC_MIIM is not set
-# CONFIG_MDIO_OCTEON is not set
-# CONFIG_MDIO_THUNDER is not set
-# CONFIG_MD_FAULTY is not set
-# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
-# CONFIG_MEDIA_ATTACH is not set
-# CONFIG_MEDIA_CAMERA_SUPPORT is not set
-# CONFIG_MEDIA_CEC_SUPPORT is not set
-# CONFIG_MEDIA_CONTROLLER is not set
-# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
-# CONFIG_MEDIA_PCI_SUPPORT is not set
-# CONFIG_MEDIA_RADIO_SUPPORT is not set
-# CONFIG_MEDIA_RC_SUPPORT is not set
-# CONFIG_MEDIA_SDR_SUPPORT is not set
-# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
-# CONFIG_MEDIA_SUPPORT is not set
-# CONFIG_MEDIA_USB_SUPPORT is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_MELLANOX_PLATFORM is not set
-CONFIG_MEMBARRIER=y
-# CONFIG_MEMORY is not set
-# CONFIG_MEMORY_FAILURE is not set
-# CONFIG_MEMORY_HOTPLUG is not set
-# CONFIG_MEMSTICK is not set
-# CONFIG_MEMTEST is not set
-# CONFIG_MEN_A21_WDT is not set
-# CONFIG_MESON_SM is not set
-CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
-# CONFIG_MFD_88PM800 is not set
-# CONFIG_MFD_88PM805 is not set
-# CONFIG_MFD_88PM860X is not set
-# CONFIG_MFD_AAT2870_CORE is not set
-# CONFIG_MFD_AC100 is not set
-# CONFIG_MFD_ACT8945A is not set
-# CONFIG_MFD_ARIZONA_I2C is not set
-# CONFIG_MFD_ARIZONA_SPI is not set
-# CONFIG_MFD_AS3711 is not set
-# CONFIG_MFD_AS3722 is not set
-# CONFIG_MFD_ASIC3 is not set
-# CONFIG_MFD_ATMEL_FLEXCOM is not set
-# CONFIG_MFD_ATMEL_HLCDC is not set
-# CONFIG_MFD_AXP20X is not set
-# CONFIG_MFD_AXP20X_I2C is not set
-# CONFIG_MFD_BCM590XX is not set
-# CONFIG_MFD_BD9571MWV is not set
-# CONFIG_MFD_CORE is not set
-# CONFIG_MFD_CPCAP is not set
-# CONFIG_MFD_CROS_EC is not set
-# CONFIG_MFD_CS5535 is not set
-# CONFIG_MFD_DA9052_I2C is not set
-# CONFIG_MFD_DA9052_SPI is not set
-# CONFIG_MFD_DA9055 is not set
-# CONFIG_MFD_DA9062 is not set
-# CONFIG_MFD_DA9063 is not set
-# CONFIG_MFD_DA9150 is not set
-# CONFIG_MFD_DLN2 is not set
-# CONFIG_MFD_EXYNOS_LPASS is not set
-# CONFIG_MFD_HI6421_PMIC is not set
-# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
-# CONFIG_MFD_JANZ_CMODIO is not set
-# CONFIG_MFD_KEMPLD is not set
-# CONFIG_MFD_LM3533 is not set
-# CONFIG_MFD_LOCHNAGAR is not set
-# CONFIG_MFD_LP3943 is not set
-# CONFIG_MFD_LP8788 is not set
-# CONFIG_MFD_MADERA is not set
-# CONFIG_MFD_MAX14577 is not set
-# CONFIG_MFD_MAX77620 is not set
-# CONFIG_MFD_MAX77650 is not set
-# CONFIG_MFD_MAX77686 is not set
-# CONFIG_MFD_MAX77693 is not set
-# CONFIG_MFD_MAX77843 is not set
-# CONFIG_MFD_MAX8907 is not set
-# CONFIG_MFD_MAX8925 is not set
-# CONFIG_MFD_MAX8997 is not set
-# CONFIG_MFD_MAX8998 is not set
-# CONFIG_MFD_MC13XXX is not set
-# CONFIG_MFD_MC13XXX_I2C is not set
-# CONFIG_MFD_MC13XXX_SPI is not set
-# CONFIG_MFD_MENF21BMC is not set
-# CONFIG_MFD_MT6397 is not set
-# CONFIG_MFD_OMAP_USB_HOST is not set
-# CONFIG_MFD_PALMAS is not set
-# CONFIG_MFD_PCF50633 is not set
-# CONFIG_MFD_PM8921_CORE is not set
-# CONFIG_MFD_PM8XXX is not set
-# CONFIG_MFD_RC5T583 is not set
-# CONFIG_MFD_RDC321X is not set
-# CONFIG_MFD_RETU is not set
-# CONFIG_MFD_RK808 is not set
-# CONFIG_MFD_RN5T618 is not set
-# CONFIG_MFD_ROHM_BD70528 is not set
-# CONFIG_MFD_ROHM_BD718XX is not set
-# CONFIG_MFD_RT5033 is not set
-# CONFIG_MFD_RTSX_PCI is not set
-# CONFIG_MFD_RTSX_USB is not set
-# CONFIG_MFD_SEC_CORE is not set
-# CONFIG_MFD_SI476X_CORE is not set
-# CONFIG_MFD_SKY81452 is not set
-# CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_SMSC is not set
-# CONFIG_MFD_STMFX is not set
-# CONFIG_MFD_STMPE is not set
-# CONFIG_MFD_STPMIC1 is not set
-# CONFIG_MFD_SYSCON is not set
-# CONFIG_MFD_T7L66XB is not set
-# CONFIG_MFD_TC3589X is not set
-# CONFIG_MFD_TC6387XB is not set
-# CONFIG_MFD_TC6393XB is not set
-# CONFIG_MFD_TIMBERDALE is not set
-# CONFIG_MFD_TI_AM335X_TSCADC is not set
-# CONFIG_MFD_TI_LMU is not set
-# CONFIG_MFD_TI_LP873X is not set
-# CONFIG_MFD_TI_LP87565 is not set
-# CONFIG_MFD_TMIO is not set
-# CONFIG_MFD_TPS65086 is not set
-# CONFIG_MFD_TPS65090 is not set
-# CONFIG_MFD_TPS65217 is not set
-# CONFIG_MFD_TPS65218 is not set
-# CONFIG_MFD_TPS6586X is not set
-# CONFIG_MFD_TPS65910 is not set
-# CONFIG_MFD_TPS65912 is not set
-# CONFIG_MFD_TPS65912_I2C is not set
-# CONFIG_MFD_TPS65912_SPI is not set
-# CONFIG_MFD_TPS68470 is not set
-# CONFIG_MFD_TPS80031 is not set
-# CONFIG_MFD_TQMX86 is not set
-# CONFIG_MFD_VIPERBOARD is not set
-# CONFIG_MFD_VX855 is not set
-# CONFIG_MFD_WL1273_CORE is not set
-# CONFIG_MFD_WM831X is not set
-# CONFIG_MFD_WM831X_I2C is not set
-# CONFIG_MFD_WM831X_SPI is not set
-# CONFIG_MFD_WM8350_I2C is not set
-# CONFIG_MFD_WM8400 is not set
-# CONFIG_MFD_WM8994 is not set
-# CONFIG_MG_DISK is not set
-# CONFIG_MICREL_KS8995MA is not set
-# CONFIG_MICREL_PHY is not set
-# CONFIG_MICROCHIP_KSZ is not set
-# CONFIG_MICROCHIP_PHY is not set
-# CONFIG_MICROCHIP_T1_PHY is not set
-# CONFIG_MICROSEMI_PHY is not set
-# CONFIG_MIGRATION is not set
-CONFIG_MII=y
-# CONFIG_MIKROTIK is not set
-# CONFIG_MIKROTIK_RB532 is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_MIPS_ALCHEMY is not set
-# CONFIG_MIPS_CDMM is not set
-# CONFIG_MIPS_COBALT is not set
-# CONFIG_MIPS_FPU_EMULATOR is not set
-# CONFIG_MIPS_FP_SUPPORT is not set
-# CONFIG_MIPS_GENERIC is not set
-# CONFIG_MIPS_MALTA is not set
-# CONFIG_MIPS_O32_FP64_SUPPORT is not set
-# CONFIG_MIPS_PARAVIRT is not set
-# CONFIG_MIPS_PLATFORM_DEVICES is not set
-# CONFIG_MIPS_SEAD3 is not set
-# CONFIG_MISC_ALCOR_PCI is not set
-CONFIG_MISC_FILESYSTEMS=y
-# CONFIG_MISC_RTSX_PCI is not set
-# CONFIG_MISC_RTSX_USB is not set
-# CONFIG_MISDN is not set
-# CONFIG_MISDN_AVMFRITZ is not set
-# CONFIG_MISDN_HFCPCI is not set
-# CONFIG_MISDN_HFCUSB is not set
-# CONFIG_MISDN_INFINEON is not set
-# CONFIG_MISDN_NETJET is not set
-# CONFIG_MISDN_SPEEDFAX is not set
-# CONFIG_MISDN_W6692 is not set
-# CONFIG_MKISS is not set
-# CONFIG_MLX4_CORE is not set
-# CONFIG_MLX4_EN is not set
-# CONFIG_MLX5_CORE is not set
-# CONFIG_MLX90614 is not set
-# CONFIG_MLX90632 is not set
-# CONFIG_MLXFW is not set
-# CONFIG_MLXSW_CORE is not set
-# CONFIG_MLX_CPLD_PLATFORM is not set
-# CONFIG_MLX_PLATFORM is not set
-# CONFIG_MMA7455_I2C is not set
-# CONFIG_MMA7455_SPI is not set
-# CONFIG_MMA7660 is not set
-# CONFIG_MMA8452 is not set
-# CONFIG_MMA9551 is not set
-# CONFIG_MMA9553 is not set
-# CONFIG_MMC is not set
-# CONFIG_MMC35240 is not set
-# CONFIG_MMC_ARMMMCI is not set
-# CONFIG_MMC_AU1X is not set
-# CONFIG_MMC_BLOCK is not set
-CONFIG_MMC_BLOCK_BOUNCE=y
-CONFIG_MMC_BLOCK_MINORS=8
-# CONFIG_MMC_CAVIUM_THUNDERX is not set
-# CONFIG_MMC_CB710 is not set
-# CONFIG_MMC_CQHCI is not set
-# CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC_DW is not set
-# CONFIG_MMC_JZ4740 is not set
-# CONFIG_MMC_MTK is not set
-# CONFIG_MMC_MVSDIO is not set
-# CONFIG_MMC_S3C is not set
-# CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_SDHCI_ACPI is not set
-# CONFIG_MMC_SDHCI_AM654 is not set
-# CONFIG_MMC_SDHCI_BCM_KONA is not set
-# CONFIG_MMC_SDHCI_CADENCE is not set
-# CONFIG_MMC_SDHCI_F_SDH30 is not set
-# CONFIG_MMC_SDHCI_IPROC is not set
-# CONFIG_MMC_SDHCI_MSM is not set
-# CONFIG_MMC_SDHCI_OF_ARASAN is not set
-# CONFIG_MMC_SDHCI_OF_ASPEED is not set
-# CONFIG_MMC_SDHCI_OF_AT91 is not set
-# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
-# CONFIG_MMC_SDHCI_OF_ESDHC is not set
-# CONFIG_MMC_SDHCI_OF_HLWD is not set
-# CONFIG_MMC_SDHCI_OMAP is not set
-# CONFIG_MMC_SDHCI_PXAV2 is not set
-# CONFIG_MMC_SDHCI_PXAV3 is not set
-# CONFIG_MMC_SDHCI_S3C is not set
-# CONFIG_MMC_SDHCI_XENON is not set
-# CONFIG_MMC_SDRICOH_CS is not set
-# CONFIG_MMC_SPI is not set
-# CONFIG_MMC_STM32_SDMMC is not set
-# CONFIG_MMC_TEST is not set
-# CONFIG_MMC_TIFM_SD is not set
-# CONFIG_MMC_TOSHIBA_PCI is not set
-# CONFIG_MMC_USDHI6ROL0 is not set
-# CONFIG_MMC_USHC is not set
-# CONFIG_MMC_VIA_SDMMC is not set
-# CONFIG_MMC_VUB300 is not set
-# CONFIG_MMIOTRACE is not set
-CONFIG_MMU=y
-CONFIG_MODULES=y
-# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
-# CONFIG_MODULE_COMPRESS is not set
-# CONFIG_MODULE_FORCE_LOAD is not set
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODULE_SIG is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_MODULE_STRIPPED=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MOST is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_ELAN_I2C is not set
-# CONFIG_MOUSE_GPIO is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_PS2_FOCALTECH is not set
-# CONFIG_MOUSE_PS2_SENTELIC is not set
-# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-# CONFIG_MOUSE_SYNAPTICS_USB is not set
-# CONFIG_MOXTET is not set
-# CONFIG_MPL115 is not set
-# CONFIG_MPL115_I2C is not set
-# CONFIG_MPL115_SPI is not set
-# CONFIG_MPL3115 is not set
-# CONFIG_MPLS is not set
-# CONFIG_MPU3050_I2C is not set
-# CONFIG_MQ_IOSCHED_DEADLINE is not set
-# CONFIG_MQ_IOSCHED_KYBER is not set
-# CONFIG_MS5611 is not set
-# CONFIG_MS5637 is not set
-# CONFIG_MSCC_OCELOT_SWITCH is not set
-# CONFIG_MSDOS_FS is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_MSI_BITMAP_SELFTEST is not set
-# CONFIG_MSI_LAPTOP is not set
-CONFIG_MTD=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_AFS_PARTS is not set
-# CONFIG_MTD_AR7_PARTS is not set
-CONFIG_MTD_BLKDEVS=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_MTD_BLOCK2MTD is not set
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
-CONFIG_MTD_CFI_INTELEXT=y
-# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_STAA is not set
-CONFIG_MTD_CFI_UTIL=y
-# CONFIG_MTD_CMDLINE_PARTS is not set
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_DATAFLASH is not set
-# CONFIG_MTD_DOCG3 is not set
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_GPIO_ADDR is not set
-# CONFIG_MTD_HYPERBUS is not set
-# CONFIG_MTD_IMPA7 is not set
-# CONFIG_MTD_INTEL_VR_NOR is not set
-# CONFIG_MTD_JEDECPROBE is not set
-# CONFIG_MTD_LATCH_ADDR is not set
-# CONFIG_MTD_LPDDR is not set
-# CONFIG_MTD_LPDDR2_NVM is not set
-# CONFIG_MTD_M25P80 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MCHP23K256 is not set
-# CONFIG_MTD_MT81xx_NOR is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_MYLOADER_PARTS is not set
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_NAND_AMS_DELTA is not set
-# CONFIG_MTD_NAND_AR934X is not set
-# CONFIG_MTD_NAND_AR934X_HW_ECC is not set
-# CONFIG_MTD_NAND_ATMEL is not set
-# CONFIG_MTD_NAND_AU1550 is not set
-# CONFIG_MTD_NAND_BCH is not set
-# CONFIG_MTD_NAND_BF5XX is not set
-# CONFIG_MTD_NAND_BRCMNAND is not set
-# CONFIG_MTD_NAND_CAFE is not set
-# CONFIG_MTD_NAND_CM_X270 is not set
-# CONFIG_MTD_NAND_CS553X is not set
-# CONFIG_MTD_NAND_DAVINCI is not set
-# CONFIG_MTD_NAND_DENALI is not set
-# CONFIG_MTD_NAND_DENALI_DT is not set
-# CONFIG_MTD_NAND_DENALI_PCI is not set
-CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_MTD_NAND_DOCG4 is not set
-# CONFIG_MTD_NAND_ECC is not set
-# CONFIG_MTD_NAND_ECC_BCH is not set
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_ECC_SW_BCH is not set
-# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set
-# CONFIG_MTD_NAND_FSL_ELBC is not set
-# CONFIG_MTD_NAND_FSL_IFC is not set
-# CONFIG_MTD_NAND_FSL_UPM is not set
-# CONFIG_MTD_NAND_FSMC is not set
-# CONFIG_MTD_NAND_GPIO is not set
-# CONFIG_MTD_NAND_GPMI_NAND is not set
-# CONFIG_MTD_NAND_HISI504 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_JZ4740 is not set
-# CONFIG_MTD_NAND_MPC5121_NFC is not set
-# CONFIG_MTD_NAND_MTK is not set
-# CONFIG_MTD_NAND_MXC is not set
-# CONFIG_MTD_NAND_MXIC is not set
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_NDFC is not set
-# CONFIG_MTD_NAND_NUC900 is not set
-# CONFIG_MTD_NAND_OMAP2 is not set
-# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set
-# CONFIG_MTD_NAND_ORION is not set
-# CONFIG_MTD_NAND_PASEMI is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_NAND_PXA3xx is not set
-# CONFIG_MTD_NAND_RB4XX is not set
-# CONFIG_MTD_NAND_RB750 is not set
-# CONFIG_MTD_NAND_RICOH is not set
-# CONFIG_MTD_NAND_S3C2410 is not set
-# CONFIG_MTD_NAND_SHARPSL is not set
-# CONFIG_MTD_NAND_SH_FLCTL is not set
-# CONFIG_MTD_NAND_SOCRATES is not set
-# CONFIG_MTD_NAND_TMIO is not set
-# CONFIG_MTD_NAND_TXX9NDFMC is not set
-CONFIG_MTD_OF_PARTS=y
-# CONFIG_MTD_ONENAND is not set
-# CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_OTP is not set
-# CONFIG_MTD_PARTITIONED_MASTER is not set
-# CONFIG_MTD_PCI is not set
-# CONFIG_MTD_PCMCIA is not set
-# CONFIG_MTD_PHRAM is not set
-# CONFIG_MTD_PHYSMAP is not set
-# CONFIG_MTD_PHYSMAP_COMPAT is not set
-# CONFIG_MTD_PHYSMAP_GEMINI is not set
-# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set
-CONFIG_MTD_PHYSMAP_OF=y
-# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set
-# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set
-# CONFIG_MTD_PHYSMAP_VERSATILE is not set
-# CONFIG_MTD_PLATRAM is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_RAM is not set
-# CONFIG_MTD_RAW_NAND is not set
-CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
-# CONFIG_MTD_REDBOOT_PARTS is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_ROM is not set
-CONFIG_MTD_ROOTFS_ROOT_DEV=y
-# CONFIG_MTD_ROUTERBOOT_PARTS is not set
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SM_COMMON is not set
-# CONFIG_MTD_SPINAND_MT29F is not set
-# CONFIG_MTD_SPI_NAND is not set
-# CONFIG_MTD_SPI_NOR is not set
-# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
-CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096
-CONFIG_MTD_SPLIT=y
-# CONFIG_MTD_SPLIT_BCM63XX_FW is not set
-# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set
-# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set
-# CONFIG_MTD_SPLIT_ELF_FW is not set
-# CONFIG_MTD_SPLIT_EVA_FW is not set
-# CONFIG_MTD_SPLIT_FIRMWARE is not set
-CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
-# CONFIG_MTD_SPLIT_FIT_FW is not set
-# CONFIG_MTD_SPLIT_JIMAGE_FW is not set
-# CONFIG_MTD_SPLIT_LZMA_FW is not set
-# CONFIG_MTD_SPLIT_MINOR_FW is not set
-# CONFIG_MTD_SPLIT_SEAMA_FW is not set
-CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y
-CONFIG_MTD_SPLIT_SUPPORT=y
-# CONFIG_MTD_SPLIT_TPLINK_FW is not set
-# CONFIG_MTD_SPLIT_TRX_FW is not set
-# CONFIG_MTD_SPLIT_UIMAGE_FW is not set
-# CONFIG_MTD_SPLIT_WRGG_FW is not set
-# CONFIG_MTD_SST25L is not set
-# CONFIG_MTD_SWAP is not set
-# CONFIG_MTD_TESTS is not set
-# CONFIG_MTD_UBI is not set
-# CONFIG_MTD_UBI_FASTMAP is not set
-# CONFIG_MTD_UBI_GLUEBI is not set
-# CONFIG_MTD_UIMAGE_SPLIT is not set
-# CONFIG_MTD_VIRT_CONCAT is not set
-# CONFIG_MTK_MMC is not set
-CONFIG_MULTIUSER=y
-# CONFIG_MUTEX_SPIN_ON_OWNER is not set
-# CONFIG_MV643XX_ETH is not set
-# CONFIG_MVMDIO is not set
-# CONFIG_MVNETA_BM is not set
-# CONFIG_MV_XOR_V2 is not set
-# CONFIG_MWAVE is not set
-# CONFIG_MWL8K is not set
-# CONFIG_MXC4005 is not set
-# CONFIG_MXC6255 is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NAMESPACES is not set
-# CONFIG_NATIONAL_PHY is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NAU7802 is not set
-# CONFIG_NBPFAXI_DMA is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NE2000 is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_NEC_MARKEINS is not set
-CONFIG_NET=y
-# CONFIG_NETCONSOLE is not set
-CONFIG_NETDEVICES=y
-# CONFIG_NETDEVSIM is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_NETFILTER_ADVANCED is not set
-# CONFIG_NETFILTER_DEBUG is not set
-# CONFIG_NETFILTER_INGRESS is not set
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_NETLINK_ACCT is not set
-# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
-# CONFIG_NETFILTER_NETLINK_LOG is not set
-# CONFIG_NETFILTER_NETLINK_OSF is not set
-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
-# CONFIG_NETFILTER_XTABLES is not set
-# CONFIG_NETFILTER_XT_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_BPF is not set
-# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
-# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
-# CONFIG_NETFILTER_XT_MATCH_CPU is not set
-# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
-# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
-# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-# CONFIG_NETFILTER_XT_MATCH_ECN is not set
-# CONFIG_NETFILTER_XT_MATCH_ESP is not set
-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
-# CONFIG_NETFILTER_XT_MATCH_HL is not set
-# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
-# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
-# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_MAC is not set
-# CONFIG_NETFILTER_XT_MATCH_MARK is not set
-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
-# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
-# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
-# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
-# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-# CONFIG_NETFILTER_XT_MATCH_REALM is not set
-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
-# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
-# CONFIG_NETFILTER_XT_MATCH_STRING is not set
-# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
-# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set
-# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
-# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_CT is not set
-# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-# CONFIG_NETFILTER_XT_TARGET_HL is not set
-# CONFIG_NETFILTER_XT_TARGET_HMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
-# CONFIG_NETFILTER_XT_TARGET_LED is not set
-# CONFIG_NETFILTER_XT_TARGET_LOG is not set
-# CONFIG_NETFILTER_XT_TARGET_MARK is not set
-# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
-# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-# CONFIG_NETFILTER_XT_TARGET_TEE is not set
-# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set
-# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-# CONFIG_NETLABEL is not set
-# CONFIG_NETLINK_DIAG is not set
-# CONFIG_NETLINK_MMAP is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NETROM is not set
-CONFIG_NETWORK_FILESYSTEMS=y
-# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
-# CONFIG_NETWORK_SECMARK is not set
-# CONFIG_NETXEN_NIC is not set
-# CONFIG_NET_9P is not set
-# CONFIG_NET_ACT_BPF is not set
-# CONFIG_NET_ACT_CSUM is not set
-# CONFIG_NET_ACT_CT is not set
-# CONFIG_NET_ACT_GACT is not set
-# CONFIG_NET_ACT_IFE is not set
-# CONFIG_NET_ACT_IPT is not set
-# CONFIG_NET_ACT_MIRRED is not set
-# CONFIG_NET_ACT_MPLS is not set
-# CONFIG_NET_ACT_NAT is not set
-# CONFIG_NET_ACT_PEDIT is not set
-# CONFIG_NET_ACT_POLICE is not set
-# CONFIG_NET_ACT_SAMPLE is not set
-# CONFIG_NET_ACT_SIMP is not set
-# CONFIG_NET_ACT_SKBEDIT is not set
-# CONFIG_NET_ACT_SKBMOD is not set
-# CONFIG_NET_ACT_TUNNEL_KEY is not set
-# CONFIG_NET_ACT_VLAN is not set
-CONFIG_NET_CADENCE=y
-# CONFIG_NET_CALXEDA_XGMAC is not set
-CONFIG_NET_CLS=y
-# CONFIG_NET_CLS_ACT is not set
-# CONFIG_NET_CLS_BASIC is not set
-# CONFIG_NET_CLS_BPF is not set
-# CONFIG_NET_CLS_FLOW is not set
-# CONFIG_NET_CLS_FLOWER is not set
-# CONFIG_NET_CLS_FW is not set
-CONFIG_NET_CLS_IND=y
-# CONFIG_NET_CLS_MATCHALL is not set
-# CONFIG_NET_CLS_ROUTE4 is not set
-# CONFIG_NET_CLS_RSVP is not set
-# CONFIG_NET_CLS_RSVP6 is not set
-# CONFIG_NET_CLS_TCINDEX is not set
-# CONFIG_NET_CLS_U32 is not set
-CONFIG_NET_CORE=y
-# CONFIG_NET_DEVLINK is not set
-# CONFIG_NET_DROP_MONITOR is not set
-# CONFIG_NET_DSA is not set
-# CONFIG_NET_DSA_BCM_SF2 is not set
-# CONFIG_NET_DSA_LANTIQ_GSWIP is not set
-# CONFIG_NET_DSA_LEGACY is not set
-# CONFIG_NET_DSA_LOOP is not set
-# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set
-# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set
-# CONFIG_NET_DSA_MT7530 is not set
-# CONFIG_NET_DSA_MV88E6060 is not set
-# CONFIG_NET_DSA_MV88E6123_61_65 is not set
-# CONFIG_NET_DSA_MV88E6131 is not set
-# CONFIG_NET_DSA_MV88E6171 is not set
-# CONFIG_NET_DSA_MV88E6352 is not set
-# CONFIG_NET_DSA_MV88E6XXX is not set
-# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
-# CONFIG_NET_DSA_MV88E6XXX_PTP is not set
-# CONFIG_NET_DSA_QCA8K is not set
-# CONFIG_NET_DSA_REALTEK_SMI is not set
-# CONFIG_NET_DSA_SJA1105 is not set
-# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set
-# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set
-# CONFIG_NET_DSA_TAG_8021Q is not set
-# CONFIG_NET_DSA_TAG_BRCM is not set
-# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set
-# CONFIG_NET_DSA_TAG_DSA is not set
-# CONFIG_NET_DSA_TAG_EDSA is not set
-# CONFIG_NET_DSA_TAG_GSWIP is not set
-# CONFIG_NET_DSA_TAG_KSZ is not set
-# CONFIG_NET_DSA_TAG_LAN9303 is not set
-# CONFIG_NET_DSA_TAG_MTK is not set
-# CONFIG_NET_DSA_TAG_QCA is not set
-# CONFIG_NET_DSA_TAG_RTL4_A is not set
-# CONFIG_NET_DSA_TAG_SJA1105 is not set
-# CONFIG_NET_DSA_TAG_TRAILER is not set
-# CONFIG_NET_DSA_VITESSE_VSC73XX is not set
-# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set
-# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set
-# CONFIG_NET_EMATCH is not set
-# CONFIG_NET_EMATCH_CANID is not set
-# CONFIG_NET_EMATCH_CMP is not set
-# CONFIG_NET_EMATCH_IPT is not set
-# CONFIG_NET_EMATCH_META is not set
-# CONFIG_NET_EMATCH_NBYTE is not set
-CONFIG_NET_EMATCH_STACK=32
-# CONFIG_NET_EMATCH_TEXT is not set
-# CONFIG_NET_EMATCH_U32 is not set
-# CONFIG_NET_FAILOVER is not set
-# CONFIG_NET_FC is not set
-# CONFIG_NET_FOU is not set
-# CONFIG_NET_FOU_IP_TUNNELS is not set
-# CONFIG_NET_IFE is not set
-# CONFIG_NET_IPGRE is not set
-CONFIG_NET_IPGRE_BROADCAST=y
-# CONFIG_NET_IPGRE_DEMUX is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPVTI is not set
-# CONFIG_NET_IP_TUNNEL is not set
-# CONFIG_NET_KEY is not set
-# CONFIG_NET_KEY_MIGRATE is not set
-# CONFIG_NET_L3_MASTER_DEV is not set
-# CONFIG_NET_MPLS_GSO is not set
-# CONFIG_NET_NCSI is not set
-# CONFIG_NET_NSH is not set
-# CONFIG_NET_PACKET_ENGINE is not set
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_NET_PTP_CLASSIFY is not set
-CONFIG_NET_RX_BUSY_POLL=y
-# CONFIG_NET_SB1000 is not set
-CONFIG_NET_SCHED=y
-# CONFIG_NET_SCH_ATM is not set
-# CONFIG_NET_SCH_CAKE is not set
-# CONFIG_NET_SCH_CBQ is not set
-# CONFIG_NET_SCH_CBS is not set
-# CONFIG_NET_SCH_CHOKE is not set
-# CONFIG_NET_SCH_CODEL is not set
-# CONFIG_NET_SCH_DEFAULT is not set
-# CONFIG_NET_SCH_DRR is not set
-# CONFIG_NET_SCH_DSMARK is not set
-# CONFIG_NET_SCH_ETF is not set
-CONFIG_NET_SCH_FIFO=y
-# CONFIG_NET_SCH_FQ is not set
-CONFIG_NET_SCH_FQ_CODEL=y
-# CONFIG_NET_SCH_GRED is not set
-# CONFIG_NET_SCH_HFSC is not set
-# CONFIG_NET_SCH_HHF is not set
-# CONFIG_NET_SCH_HTB is not set
-# CONFIG_NET_SCH_INGRESS is not set
-# CONFIG_NET_SCH_MQPRIO is not set
-# CONFIG_NET_SCH_MULTIQ is not set
-# CONFIG_NET_SCH_NETEM is not set
-# CONFIG_NET_SCH_PIE is not set
-# CONFIG_NET_SCH_PLUG is not set
-# CONFIG_NET_SCH_PRIO is not set
-# CONFIG_NET_SCH_QFQ is not set
-# CONFIG_NET_SCH_RED is not set
-# CONFIG_NET_SCH_SFB is not set
-# CONFIG_NET_SCH_SFQ is not set
-# CONFIG_NET_SCH_SKBPRIO is not set
-# CONFIG_NET_SCH_TAPRIO is not set
-# CONFIG_NET_SCH_TBF is not set
-# CONFIG_NET_SCH_TEQL is not set
-# CONFIG_NET_SCTPPROBE is not set
-# CONFIG_NET_SWITCHDEV is not set
-# CONFIG_NET_TCPPROBE is not set
-# CONFIG_NET_TC_SKB_EXT is not set
-# CONFIG_NET_TEAM is not set
-# CONFIG_NET_TULIP is not set
-# CONFIG_NET_UDP_TUNNEL is not set
-CONFIG_NET_VENDOR_3COM=y
-CONFIG_NET_VENDOR_8390=y
-CONFIG_NET_VENDOR_ADAPTEC=y
-CONFIG_NET_VENDOR_AGERE=y
-CONFIG_NET_VENDOR_ALACRITECH=y
-CONFIG_NET_VENDOR_ALTEON=y
-CONFIG_NET_VENDOR_AMAZON=y
-CONFIG_NET_VENDOR_AMD=y
-CONFIG_NET_VENDOR_AQUANTIA=y
-CONFIG_NET_VENDOR_ARC=y
-CONFIG_NET_VENDOR_ATHEROS=y
-CONFIG_NET_VENDOR_AURORA=y
-CONFIG_NET_VENDOR_BROADCOM=y
-CONFIG_NET_VENDOR_BROCADE=y
-CONFIG_NET_VENDOR_CADENCE=y
-CONFIG_NET_VENDOR_CAVIUM=y
-CONFIG_NET_VENDOR_CHELSIO=y
-CONFIG_NET_VENDOR_CIRRUS=y
-CONFIG_NET_VENDOR_CISCO=y
-CONFIG_NET_VENDOR_CORTINA=y
-CONFIG_NET_VENDOR_DEC=y
-CONFIG_NET_VENDOR_DLINK=y
-CONFIG_NET_VENDOR_EMULEX=y
-CONFIG_NET_VENDOR_EXAR=y
-CONFIG_NET_VENDOR_EZCHIP=y
-CONFIG_NET_VENDOR_FARADAY=y
-CONFIG_NET_VENDOR_FREESCALE=y
-CONFIG_NET_VENDOR_FUJITSU=y
-CONFIG_NET_VENDOR_GOOGLE=y
-CONFIG_NET_VENDOR_HISILICON=y
-CONFIG_NET_VENDOR_HP=y
-CONFIG_NET_VENDOR_HUAWEI=y
-CONFIG_NET_VENDOR_I825XX=y
-CONFIG_NET_VENDOR_IBM=y
-CONFIG_NET_VENDOR_INTEL=y
-CONFIG_NET_VENDOR_MARVELL=y
-CONFIG_NET_VENDOR_MELLANOX=y
-CONFIG_NET_VENDOR_MICREL=y
-CONFIG_NET_VENDOR_MICROCHIP=y
-CONFIG_NET_VENDOR_MICROSEMI=y
-CONFIG_NET_VENDOR_MYRI=y
-CONFIG_NET_VENDOR_NATSEMI=y
-CONFIG_NET_VENDOR_NETERION=y
-CONFIG_NET_VENDOR_NETRONOME=y
-CONFIG_NET_VENDOR_NI=y
-CONFIG_NET_VENDOR_NVIDIA=y
-CONFIG_NET_VENDOR_OKI=y
-CONFIG_NET_VENDOR_PACKET_ENGINES=y
-CONFIG_NET_VENDOR_PENSANDO=y
-CONFIG_NET_VENDOR_QLOGIC=y
-CONFIG_NET_VENDOR_QUALCOMM=y
-CONFIG_NET_VENDOR_RDC=y
-CONFIG_NET_VENDOR_REALTEK=y
-CONFIG_NET_VENDOR_RENESAS=y
-CONFIG_NET_VENDOR_ROCKER=y
-CONFIG_NET_VENDOR_SAMSUNG=y
-CONFIG_NET_VENDOR_SEEQ=y
-CONFIG_NET_VENDOR_SILAN=y
-CONFIG_NET_VENDOR_SIS=y
-CONFIG_NET_VENDOR_SMSC=y
-CONFIG_NET_VENDOR_SOCIONEXT=y
-CONFIG_NET_VENDOR_SOLARFLARE=y
-CONFIG_NET_VENDOR_STMICRO=y
-CONFIG_NET_VENDOR_SUN=y
-CONFIG_NET_VENDOR_SYNOPSYS=y
-CONFIG_NET_VENDOR_TEHUTI=y
-CONFIG_NET_VENDOR_TI=y
-CONFIG_NET_VENDOR_TOSHIBA=y
-CONFIG_NET_VENDOR_VIA=y
-CONFIG_NET_VENDOR_WIZNET=y
-CONFIG_NET_VENDOR_XILINX=y
-CONFIG_NET_VENDOR_XIRCOM=y
-# CONFIG_NET_VRF is not set
-# CONFIG_NET_XGENE is not set
-CONFIG_NEW_LEDS=y
-# CONFIG_NFC is not set
-# CONFIG_NFP is not set
-# CONFIG_NFSD is not set
-# CONFIG_NFSD_V2_ACL is not set
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFS_ACL_SUPPORT is not set
-CONFIG_NFS_COMMON=y
-# CONFIG_NFS_FS is not set
-# CONFIG_NFS_FSCACHE is not set
-# CONFIG_NFS_SWAP is not set
-# CONFIG_NFS_V2 is not set
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_V4_1 is not set
-# CONFIG_NFTL is not set
-# CONFIG_NFT_BRIDGE_META is not set
-# CONFIG_NFT_BRIDGE_REJECT is not set
-# CONFIG_NFT_CONNLIMIT is not set
-# CONFIG_NFT_DUP_IPV4 is not set
-# CONFIG_NFT_DUP_IPV6 is not set
-# CONFIG_NFT_FIB_IPV4 is not set
-# CONFIG_NFT_FIB_IPV6 is not set
-# CONFIG_NFT_FIB_NETDEV is not set
-# CONFIG_NFT_FLOW_OFFLOAD is not set
-# CONFIG_NFT_OBJREF is not set
-# CONFIG_NFT_OSF is not set
-# CONFIG_NFT_RT is not set
-# CONFIG_NFT_SET_BITMAP is not set
-# CONFIG_NFT_SOCKET is not set
-# CONFIG_NFT_SYNPROXY is not set
-# CONFIG_NFT_TPROXY is not set
-# CONFIG_NFT_TUNNEL is not set
-# CONFIG_NFT_XFRM is not set
-# CONFIG_NF_CONNTRACK is not set
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-# CONFIG_NF_CONNTRACK_BRIDGE is not set
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK_LABELS is not set
-# CONFIG_NF_CONNTRACK_MARK is not set
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-CONFIG_NF_CONNTRACK_PROCFS=y
-# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SECMARK is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-# CONFIG_NF_CONNTRACK_SNMP is not set
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CONNTRACK_TIMEOUT is not set
-# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
-# CONFIG_NF_CONNTRACK_ZONES is not set
-# CONFIG_NF_CT_NETLINK is not set
-# CONFIG_NF_CT_NETLINK_HELPER is not set
-# CONFIG_NF_CT_NETLINK_TIMEOUT is not set
-# CONFIG_NF_CT_PROTO_DCCP is not set
-# CONFIG_NF_CT_PROTO_GRE is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CT_PROTO_UDPLITE is not set
-# CONFIG_NF_DEFRAG_IPV4 is not set
-# CONFIG_NF_DUP_IPV4 is not set
-# CONFIG_NF_DUP_IPV6 is not set
-# CONFIG_NF_FLOW_TABLE is not set
-# CONFIG_NF_LOG_ARP is not set
-# CONFIG_NF_LOG_BRIDGE is not set
-# CONFIG_NF_LOG_IPV4 is not set
-# CONFIG_NF_LOG_NETDEV is not set
-# CONFIG_NF_NAT is not set
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_FTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_IRC is not set
-# CONFIG_NF_NAT_MASQUERADE is not set
-# CONFIG_NF_NAT_NEEDED is not set
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_PROTO_GRE is not set
-# CONFIG_NF_NAT_SIP is not set
-# CONFIG_NF_NAT_SNMP_BASIC is not set
-# CONFIG_NF_NAT_TFTP is not set
-# CONFIG_NF_REJECT_IPV4 is not set
-# CONFIG_NF_REJECT_IPV6 is not set
-# CONFIG_NF_SOCKET_IPV4 is not set
-# CONFIG_NF_SOCKET_IPV6 is not set
-# CONFIG_NF_TABLES is not set
-CONFIG_NF_TABLES_ARP=y
-CONFIG_NF_TABLES_BRIDGE=y
-CONFIG_NF_TABLES_INET=y
-CONFIG_NF_TABLES_IPV4=y
-CONFIG_NF_TABLES_IPV6=y
-CONFIG_NF_TABLES_NETDEV=y
-# CONFIG_NF_TABLES_SET is not set
-# CONFIG_NF_TPROXY_IPV4 is not set
-# CONFIG_NF_TPROXY_IPV6 is not set
-# CONFIG_NI65 is not set
-# CONFIG_NI903X_WDT is not set
-# CONFIG_NIC7018_WDT is not set
-# CONFIG_NILFS2_FS is not set
-# CONFIG_NIU is not set
-# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
-CONFIG_NLATTR=y
-# CONFIG_NLMON is not set
-# CONFIG_NLM_XLP_BOARD is not set
-# CONFIG_NLM_XLR_BOARD is not set
-# CONFIG_NLS is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_MAC_CELTIC is not set
-# CONFIG_NLS_MAC_CENTEURO is not set
-# CONFIG_NLS_MAC_CROATIAN is not set
-# CONFIG_NLS_MAC_CYRILLIC is not set
-# CONFIG_NLS_MAC_GAELIC is not set
-# CONFIG_NLS_MAC_GREEK is not set
-# CONFIG_NLS_MAC_ICELAND is not set
-# CONFIG_NLS_MAC_INUIT is not set
-# CONFIG_NLS_MAC_ROMAN is not set
-# CONFIG_NLS_MAC_ROMANIAN is not set
-# CONFIG_NLS_MAC_TURKISH is not set
-# CONFIG_NLS_UTF8 is not set
-CONFIG_NMI_LOG_BUF_SHIFT=13
-# CONFIG_NOA1305 is not set
-# CONFIG_NOP_USB_XCEIV is not set
-# CONFIG_NORTEL_HERMES is not set
-# CONFIG_NOTIFIER_ERROR_INJECTION is not set
-# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set
-# CONFIG_NOZOMI is not set
-# CONFIG_NO_BOOTMEM is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_NO_HZ_FULL is not set
-# CONFIG_NO_HZ_IDLE is not set
-# CONFIG_NS83820 is not set
-# CONFIG_NTB is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_NTP_PPS is not set
-# CONFIG_NULL_TTY is not set
-# CONFIG_NUMA is not set
-# CONFIG_NVM is not set
-# CONFIG_NVMEM is not set
-# CONFIG_NVMEM_BCM_OCOTP is not set
-# CONFIG_NVMEM_IMX_OCOTP is not set
-# CONFIG_NVMEM_REBOOT_MODE is not set
-# CONFIG_NVMEM_SYSFS is not set
-# CONFIG_NVME_FC is not set
-# CONFIG_NVME_TARGET is not set
-# CONFIG_NVME_TCP is not set
-# CONFIG_NVRAM is not set
-# CONFIG_NV_TCO is not set
-# CONFIG_NXP_STB220 is not set
-# CONFIG_NXP_STB225 is not set
-# CONFIG_NXP_TJA11XX_PHY is not set
-# CONFIG_N_GSM is not set
-# CONFIG_OABI_COMPAT is not set
-# CONFIG_OBS600 is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_OCTEONTX2_AF is not set
-# CONFIG_OF_OVERLAY is not set
-CONFIG_OF_RESERVED_MEM=y
-# CONFIG_OF_UNITTEST is not set
-# CONFIG_OMAP2_DSS_DEBUG is not set
-# CONFIG_OMAP2_DSS_DEBUGFS is not set
-# CONFIG_OMAP2_DSS_SDI is not set
-# CONFIG_OMAP_OCP2SCP is not set
-# CONFIG_OMAP_USB2 is not set
-# CONFIG_OMFS_FS is not set
-# CONFIG_OPENVSWITCH is not set
-# CONFIG_OPROFILE is not set
-# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
-# CONFIG_OPT3001 is not set
-CONFIG_OPTIMIZE_INLINING=y
-# CONFIG_ORANGEFS_FS is not set
-# CONFIG_ORION_WATCHDOG is not set
-# CONFIG_OSF_PARTITION is not set
-CONFIG_OVERLAY_FS=y
-# CONFIG_OVERLAY_FS_INDEX is not set
-# CONFIG_OVERLAY_FS_METACOPY is not set
-CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
-# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
-CONFIG_OVERLAY_FS_XINO_AUTO=y
-# CONFIG_OWL_LOADER is not set
-# CONFIG_P54_COMMON is not set
-# CONFIG_PA12203001 is not set
-CONFIG_PACKET=y
-# CONFIG_PACKET_DIAG is not set
-# CONFIG_PACKING is not set
-# CONFIG_PAGE_EXTENSION is not set
-# CONFIG_PAGE_OWNER is not set
-# CONFIG_PAGE_POISONING is not set
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_32KB is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_PAGE_SIZE_8KB is not set
-# CONFIG_PALMAS_GPADC is not set
-# CONFIG_PANASONIC_LAPTOP is not set
-# CONFIG_PANEL is not set
-CONFIG_PANIC_ON_OOPS=y
-CONFIG_PANIC_ON_OOPS_VALUE=1
-CONFIG_PANIC_TIMEOUT=1
-# CONFIG_PANTHERLORD_FF is not set
-# CONFIG_PARAVIRT is not set
-# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
-# CONFIG_PARPORT is not set
-# CONFIG_PARPORT_1284 is not set
-# CONFIG_PARPORT_AX88796 is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARASAN_CF is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_ATP867X is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CS5535 is not set
-# CONFIG_PATA_CS5536 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_IMX is not set
-# CONFIG_PATA_ISAPNP is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_LEGACY is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OCTEON_CF is not set
-# CONFIG_PATA_OF_PLATFORM is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_OPTIDMA is not set
-# CONFIG_PATA_PCMCIA is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_PLATFORM is not set
-# CONFIG_PATA_QDI is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RDC is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SCH is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_TOSHIBA is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_WINBOND_VLB is not set
-# CONFIG_PC104 is not set
-# CONFIG_PC300TOO is not set
-# CONFIG_PCCARD is not set
-# CONFIG_PCH_DMA is not set
-# CONFIG_PCH_GBE is not set
-# CONFIG_PCH_PHUB is not set
-# CONFIG_PCI is not set
-# CONFIG_PCI200SYN is not set
-# CONFIG_PCIEAER is not set
-# CONFIG_PCIEAER_INJECT is not set
-# CONFIG_PCIEASPM is not set
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCIE_AL is not set
-# CONFIG_PCIE_ALTERA is not set
-# CONFIG_PCIE_ARMADA_8K is not set
-# CONFIG_PCIE_BW is not set
-# CONFIG_PCIE_CADENCE_HOST is not set
-# CONFIG_PCIE_DPC is not set
-# CONFIG_PCIE_DW_PLAT is not set
-# CONFIG_PCIE_DW_PLAT_HOST is not set
-# CONFIG_PCIE_ECRC is not set
-# CONFIG_PCIE_IPROC is not set
-# CONFIG_PCIE_KIRIN is not set
-# CONFIG_PCIE_PTM is not set
-# CONFIG_PCIE_XILINX is not set
-# CONFIG_PCIPCWATCHDOG is not set
-# CONFIG_PCI_ATMEL is not set
-# CONFIG_PCI_CNB20LE_QUIRK is not set
-# CONFIG_PCI_DEBUG is not set
-# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set
-# CONFIG_PCI_ENDPOINT is not set
-# CONFIG_PCI_ENDPOINT_TEST is not set
-# CONFIG_PCI_FTPCI100 is not set
-# CONFIG_PCI_HERMES is not set
-# CONFIG_PCI_HISI is not set
-# CONFIG_PCI_HOST_GENERIC is not set
-# CONFIG_PCI_HOST_THUNDER_ECAM is not set
-# CONFIG_PCI_HOST_THUNDER_PEM is not set
-# CONFIG_PCI_IOV is not set
-# CONFIG_PCI_LAYERSCAPE is not set
-# CONFIG_PCI_MESON is not set
-# CONFIG_PCI_MSI is not set
-# CONFIG_PCI_PASID is not set
-# CONFIG_PCI_PF_STUB is not set
-# CONFIG_PCI_PRI is not set
-CONFIG_PCI_QUIRKS=y
-# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
-# CONFIG_PCI_STUB is not set
-# CONFIG_PCI_SW_SWITCHTEC is not set
-CONFIG_PCI_SYSCALL=y
-# CONFIG_PCI_V3_SEMI is not set
-# CONFIG_PCI_XGENE is not set
-# CONFIG_PCMCIA is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_ATMEL is not set
-# CONFIG_PCMCIA_AXNET is not set
-# CONFIG_PCMCIA_DEBUG is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-# CONFIG_PCMCIA_HERMES is not set
-# CONFIG_PCMCIA_LOAD_CIS is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_PCNET is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_SPECTRUM is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_XIRCOM is not set
-# CONFIG_PCNET32 is not set
-# CONFIG_PCSPKR_PLATFORM is not set
-# CONFIG_PD6729 is not set
-# CONFIG_PDA_POWER is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_PERCPU_STATS is not set
-# CONFIG_PERCPU_TEST is not set
-# CONFIG_PERF_EVENTS is not set
-# CONFIG_PERF_EVENTS_AMD_POWER is not set
-# CONFIG_PERSISTENT_KEYRINGS is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_PHONET is not set
-# CONFIG_PHYLIB is not set
-# CONFIG_PHYS_ADDR_T_64BIT is not set
-# CONFIG_PHY_CADENCE_DP is not set
-# CONFIG_PHY_CADENCE_DPHY is not set
-# CONFIG_PHY_CADENCE_SIERRA is not set
-# CONFIG_PHY_CPCAP_USB is not set
-# CONFIG_PHY_EXYNOS_DP_VIDEO is not set
-# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set
-# CONFIG_PHY_FSL_IMX8MQ_USB is not set
-# CONFIG_PHY_MAPPHONE_MDM6600 is not set
-# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
-# CONFIG_PHY_OCELOT_SERDES is not set
-# CONFIG_PHY_PXA_28NM_HSIC is not set
-# CONFIG_PHY_PXA_28NM_USB2 is not set
-# CONFIG_PHY_QCOM_DWC3 is not set
-# CONFIG_PHY_QCOM_USB_HS is not set
-# CONFIG_PHY_QCOM_USB_HSIC is not set
-# CONFIG_PHY_SAMSUNG_USB2 is not set
-# CONFIG_PHY_TUSB1210 is not set
-# CONFIG_PHY_XGENE is not set
-# CONFIG_PI433 is not set
-# CONFIG_PID_IN_CONTEXTIDR is not set
-# CONFIG_PID_NS is not set
-CONFIG_PINCONF=y
-# CONFIG_PINCTRL is not set
-# CONFIG_PINCTRL_AMD is not set
-# CONFIG_PINCTRL_AXP209 is not set
-# CONFIG_PINCTRL_CEDARFORK is not set
-# CONFIG_PINCTRL_EXYNOS is not set
-# CONFIG_PINCTRL_EXYNOS5440 is not set
-# CONFIG_PINCTRL_ICELAKE is not set
-# CONFIG_PINCTRL_INGENIC is not set
-# CONFIG_PINCTRL_MCP23S08 is not set
-# CONFIG_PINCTRL_MSM8X74 is not set
-# CONFIG_PINCTRL_OCELOT is not set
-CONFIG_PINCTRL_SINGLE=y
-# CONFIG_PINCTRL_STMFX is not set
-# CONFIG_PINCTRL_SX150X is not set
-CONFIG_PINMUX=y
-# CONFIG_PKCS7_MESSAGE_PARSER is not set
-# CONFIG_PL310_ERRATA_588369 is not set
-# CONFIG_PL310_ERRATA_727915 is not set
-# CONFIG_PL310_ERRATA_753970 is not set
-# CONFIG_PL310_ERRATA_769419 is not set
-# CONFIG_PL320_MBOX is not set
-# CONFIG_PL330_DMA is not set
-# CONFIG_PLATFORM_MHU is not set
-# CONFIG_PLAT_SPEAR is not set
-# CONFIG_PLIP is not set
-# CONFIG_PLX_HERMES is not set
-# CONFIG_PM is not set
-# CONFIG_PMBUS is not set
-# CONFIG_PMC_MSP is not set
-# CONFIG_PMIC_ADP5520 is not set
-# CONFIG_PMIC_DA903X is not set
-# CONFIG_PMS7003 is not set
-# CONFIG_PM_AUTOSLEEP is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_DEVFREQ is not set
-# CONFIG_PM_WAKELOCKS is not set
-# CONFIG_POSIX_MQUEUE is not set
-CONFIG_POSIX_TIMERS=y
-# CONFIG_POWERCAP is not set
-# CONFIG_POWER_AVS is not set
-# CONFIG_POWER_RESET is not set
-# CONFIG_POWER_RESET_BRCMKONA is not set
-# CONFIG_POWER_RESET_BRCMSTB is not set
-# CONFIG_POWER_RESET_GPIO is not set
-# CONFIG_POWER_RESET_GPIO_RESTART is not set
-# CONFIG_POWER_RESET_LINKSTATION is not set
-# CONFIG_POWER_RESET_LTC2952 is not set
-# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set
-# CONFIG_POWER_RESET_QNAP is not set
-# CONFIG_POWER_RESET_RESTART is not set
-# CONFIG_POWER_RESET_SYSCON is not set
-# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
-# CONFIG_POWER_RESET_VERSATILE is not set
-# CONFIG_POWER_RESET_XGENE is not set
-# CONFIG_POWER_SUPPLY is not set
-# CONFIG_POWER_SUPPLY_DEBUG is not set
-# CONFIG_POWER_SUPPLY_HWMON is not set
-# CONFIG_PPC4xx_GPIO is not set
-# CONFIG_PPC_16K_PAGES is not set
-# CONFIG_PPC_256K_PAGES is not set
-CONFIG_PPC_4K_PAGES=y
-# CONFIG_PPC_64K_PAGES is not set
-# CONFIG_PPC_DISABLE_WERROR is not set
-# CONFIG_PPC_EMULATED_STATS is not set
-# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set
-# CONFIG_PPP is not set
-# CONFIG_PPPOATM is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_PPP_DEFLATE is not set
-CONFIG_PPP_FILTER=y
-# CONFIG_PPP_MPPE is not set
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPS is not set
-# CONFIG_PPS_CLIENT_GPIO is not set
-# CONFIG_PPS_CLIENT_KTIMER is not set
-# CONFIG_PPS_CLIENT_LDISC is not set
-# CONFIG_PPS_CLIENT_PARPORT is not set
-# CONFIG_PPS_DEBUG is not set
-# CONFIG_PPTP is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
-# CONFIG_PREEMPTIRQ_EVENTS is not set
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_TRACER is not set
-# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_PRINTK=y
-# CONFIG_PRINTK_CALLER is not set
-CONFIG_PRINTK_NMI=y
-CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
-# CONFIG_PRINTK_TIME is not set
-CONFIG_PRINT_STACK_DEPTH=64
-# CONFIG_PRISM2_USB is not set
-# CONFIG_PRISM54 is not set
-# CONFIG_PROC_CHILDREN is not set
-CONFIG_PROC_FS=y
-# CONFIG_PROC_KCORE is not set
-# CONFIG_PROC_PAGE_MONITOR is not set
-# CONFIG_PROC_STRIPPED is not set
-CONFIG_PROC_SYSCTL=y
-# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set
-# CONFIG_PROFILE_ALL_BRANCHES is not set
-# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
-# CONFIG_PROFILING is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_PROVE_RCU is not set
-# CONFIG_PROVE_RCU_LIST is not set
-# CONFIG_PROVE_RCU_REPEATEDLY is not set
-# CONFIG_PSAMPLE is not set
-# CONFIG_PSB6970_PHY is not set
-# CONFIG_PSI is not set
-# CONFIG_PSTORE is not set
-# CONFIG_PSTORE_842_COMPRESS is not set
-# CONFIG_PSTORE_COMPRESS is not set
-# CONFIG_PSTORE_CONSOLE is not set
-# CONFIG_PSTORE_DEFLATE_COMPRESS is not set
-# CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT is not set
-# CONFIG_PSTORE_LZ4HC_COMPRESS is not set
-# CONFIG_PSTORE_LZ4_COMPRESS is not set
-# CONFIG_PSTORE_LZO_COMPRESS is not set
-# CONFIG_PSTORE_PMSG is not set
-# CONFIG_PSTORE_RAM is not set
-# CONFIG_PSTORE_ZSTD_COMPRESS is not set
-# CONFIG_PTP_1588_CLOCK is not set
-# CONFIG_PTP_1588_CLOCK_IXP46X is not set
-# CONFIG_PTP_1588_CLOCK_KVM is not set
-# CONFIG_PTP_1588_CLOCK_PCH is not set
-# CONFIG_PUBLIC_KEY_ALGO_RSA is not set
-# CONFIG_PVPANIC is not set
-# CONFIG_PWM is not set
-# CONFIG_PWM_FSL_FTM is not set
-# CONFIG_PWM_PCA9685 is not set
-CONFIG_PWRSEQ_EMMC=y
-# CONFIG_PWRSEQ_SD8787 is not set
-CONFIG_PWRSEQ_SIMPLE=y
-# CONFIG_QCA7000 is not set
-# CONFIG_QCA7000_SPI is not set
-# CONFIG_QCA7000_UART is not set
-# CONFIG_QCOM_EMAC is not set
-# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set
-# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set
-# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set
-# CONFIG_QCOM_HIDMA is not set
-# CONFIG_QCOM_HIDMA_MGMT is not set
-# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set
-# CONFIG_QCOM_SPMI_ADC5 is not set
-# CONFIG_QCOM_SPMI_IADC is not set
-# CONFIG_QCOM_SPMI_TEMP_ALARM is not set
-# CONFIG_QCOM_SPMI_VADC is not set
-# CONFIG_QED is not set
-# CONFIG_QLA3XXX is not set
-# CONFIG_QLCNIC is not set
-# CONFIG_QLGE is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX6FS_FS is not set
-# CONFIG_QORIQ_CPUFREQ is not set
-# CONFIG_QORIQ_THERMAL is not set
-# CONFIG_QSEMI_PHY is not set
-# CONFIG_QUEUED_LOCK_STAT is not set
-# CONFIG_QUOTA is not set
-# CONFIG_QUOTACTL is not set
-# CONFIG_QUOTA_DEBUG is not set
-# CONFIG_R3964 is not set
-# CONFIG_R6040 is not set
-# CONFIG_R8169 is not set
-# CONFIG_R8188EU is not set
-# CONFIG_R8712U is not set
-# CONFIG_R8723AU is not set
-# CONFIG_RADIO_ADAPTERS is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_RAID6_PQ_BENCHMARK is not set
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_RALINK is not set
-# CONFIG_RANDOM32_SELFTEST is not set
-# CONFIG_RANDOMIZE_BASE is not set
-# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
-# CONFIG_RANDOM_TRUST_CPU is not set
-# CONFIG_RAPIDIO is not set
-# CONFIG_RAS is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_RBTREE_TEST is not set
-# CONFIG_RCU_BOOST is not set
-CONFIG_RCU_CPU_STALL_TIMEOUT=21
-# CONFIG_RCU_EQS_DEBUG is not set
-# CONFIG_RCU_EXPEDITE_BOOT is not set
-# CONFIG_RCU_EXPERT is not set
-CONFIG_RCU_KTHREAD_PRIO=0
-CONFIG_RCU_NEED_SEGCBLIST=y
-# CONFIG_RCU_PERF_TEST is not set
-CONFIG_RCU_STALL_COMMON=y
-# CONFIG_RCU_TORTURE_TEST is not set
-CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3
-# CONFIG_RCU_TRACE is not set
-# CONFIG_RC_ATI_REMOTE is not set
-# CONFIG_RC_CORE is not set
-# CONFIG_RC_DECODERS is not set
-# CONFIG_RC_LOOPBACK is not set
-# CONFIG_RC_MAP is not set
-# CONFIG_RDS is not set
-# CONFIG_RD_BZIP2 is not set
-# CONFIG_RD_GZIP is not set
-# CONFIG_RD_LZ4 is not set
-# CONFIG_RD_LZMA is not set
-# CONFIG_RD_LZO is not set
-# CONFIG_RD_XZ is not set
-# CONFIG_READABLE_ASM is not set
-# CONFIG_READ_ONLY_THP_FOR_FS is not set
-# CONFIG_REALTEK_PHY is not set
-# CONFIG_REDWOOD is not set
-# CONFIG_REED_SOLOMON is not set
-# CONFIG_REED_SOLOMON_DEC8 is not set
-# CONFIG_REED_SOLOMON_ENC8 is not set
-# CONFIG_REED_SOLOMON_TEST is not set
-# CONFIG_REFCOUNT_FULL is not set
-# CONFIG_REGMAP is not set
-# CONFIG_REGMAP_I2C is not set
-# CONFIG_REGMAP_MMIO is not set
-# CONFIG_REGMAP_SPI is not set
-# CONFIG_REGULATOR is not set
-# CONFIG_REGULATOR_88PG86X is not set
-# CONFIG_REGULATOR_ACT8865 is not set
-# CONFIG_REGULATOR_AD5398 is not set
-# CONFIG_REGULATOR_ANATOP is not set
-# CONFIG_REGULATOR_DA9210 is not set
-# CONFIG_REGULATOR_DA9211 is not set
-# CONFIG_REGULATOR_DEBUG is not set
-# CONFIG_REGULATOR_FAN53555 is not set
-# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
-# CONFIG_REGULATOR_GPIO is not set
-# CONFIG_REGULATOR_ISL6271A is not set
-# CONFIG_REGULATOR_ISL9305 is not set
-# CONFIG_REGULATOR_LP3971 is not set
-# CONFIG_REGULATOR_LP3972 is not set
-# CONFIG_REGULATOR_LP872X is not set
-# CONFIG_REGULATOR_LP8755 is not set
-# CONFIG_REGULATOR_LTC3589 is not set
-# CONFIG_REGULATOR_LTC3676 is not set
-# CONFIG_REGULATOR_MAX1586 is not set
-# CONFIG_REGULATOR_MAX77620 is not set
-# CONFIG_REGULATOR_MAX8649 is not set
-# CONFIG_REGULATOR_MAX8660 is not set
-# CONFIG_REGULATOR_MAX8952 is not set
-# CONFIG_REGULATOR_MAX8973 is not set
-# CONFIG_REGULATOR_MCP16502 is not set
-# CONFIG_REGULATOR_MT6311 is not set
-# CONFIG_REGULATOR_PFUZE100 is not set
-# CONFIG_REGULATOR_PV88060 is not set
-# CONFIG_REGULATOR_PV88080 is not set
-# CONFIG_REGULATOR_PV88090 is not set
-# CONFIG_REGULATOR_PWM is not set
-# CONFIG_REGULATOR_SLG51000 is not set
-# CONFIG_REGULATOR_SY8106A is not set
-# CONFIG_REGULATOR_SY8824X is not set
-# CONFIG_REGULATOR_TI_ABB is not set
-# CONFIG_REGULATOR_TPS51632 is not set
-# CONFIG_REGULATOR_TPS62360 is not set
-# CONFIG_REGULATOR_TPS65023 is not set
-# CONFIG_REGULATOR_TPS6507X is not set
-# CONFIG_REGULATOR_TPS65132 is not set
-# CONFIG_REGULATOR_TPS6524X is not set
-# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
-# CONFIG_REGULATOR_VCTRL is not set
-# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_FS_POSIX_ACL is not set
-# CONFIG_REISERFS_FS_SECURITY is not set
-CONFIG_REISERFS_FS_XATTR=y
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_RELAY is not set
-# CONFIG_RELOCATABLE is not set
-# CONFIG_REMOTEPROC is not set
-# CONFIG_RENESAS_PHY is not set
-# CONFIG_RESET_ATH79 is not set
-# CONFIG_RESET_BERLIN is not set
-# CONFIG_RESET_CONTROLLER is not set
-# CONFIG_RESET_IMX7 is not set
-# CONFIG_RESET_LANTIQ is not set
-# CONFIG_RESET_LPC18XX is not set
-# CONFIG_RESET_MESON is not set
-# CONFIG_RESET_PISTACHIO is not set
-# CONFIG_RESET_SOCFPGA is not set
-# CONFIG_RESET_STM32 is not set
-# CONFIG_RESET_SUNXI is not set
-# CONFIG_RESET_TEGRA_BPMP is not set
-# CONFIG_RESET_TI_SYSCON is not set
-# CONFIG_RESET_ZYNQ is not set
-# CONFIG_RFD77402 is not set
-# CONFIG_RFD_FTL is not set
-CONFIG_RFKILL=y
-# CONFIG_RFKILL_FULL is not set
-# CONFIG_RFKILL_GPIO is not set
-# CONFIG_RFKILL_INPUT is not set
-# CONFIG_RFKILL_LEDS is not set
-# CONFIG_RFKILL_REGULATOR is not set
-# CONFIG_RING_BUFFER_BENCHMARK is not set
-# CONFIG_RING_BUFFER_STARTUP_TEST is not set
-# CONFIG_RMI4_CORE is not set
-# CONFIG_RMNET is not set
-# CONFIG_ROCKCHIP_PHY is not set
-# CONFIG_ROCKER is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_ROSE is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPMSG_QCOM_GLINK_RPM is not set
-# CONFIG_RPMSG_VIRTIO is not set
-# CONFIG_RPR0521 is not set
-# CONFIG_RSEQ is not set
-# CONFIG_RT2X00 is not set
-# CONFIG_RTC_CLASS is not set
-# CONFIG_RTC_DEBUG is not set
-# CONFIG_RTC_DRV_ABB5ZES3 is not set
-# CONFIG_RTC_DRV_ABEOZ9 is not set
-# CONFIG_RTC_DRV_ABX80X is not set
-# CONFIG_RTC_DRV_ARMADA38X is not set
-# CONFIG_RTC_DRV_AU1XXX is not set
-# CONFIG_RTC_DRV_BQ32K is not set
-# CONFIG_RTC_DRV_BQ4802 is not set
-# CONFIG_RTC_DRV_CADENCE is not set
-CONFIG_RTC_DRV_CMOS=y
-# CONFIG_RTC_DRV_DS1286 is not set
-# CONFIG_RTC_DRV_DS1302 is not set
-# CONFIG_RTC_DRV_DS1305 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1307_CENTURY is not set
-# CONFIG_RTC_DRV_DS1307_HWMON is not set
-# CONFIG_RTC_DRV_DS1343 is not set
-# CONFIG_RTC_DRV_DS1347 is not set
-# CONFIG_RTC_DRV_DS1374 is not set
-# CONFIG_RTC_DRV_DS1390 is not set
-# CONFIG_RTC_DRV_DS1511 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1685_FAMILY is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_DS2404 is not set
-# CONFIG_RTC_DRV_DS3232 is not set
-# CONFIG_RTC_DRV_DS3234 is not set
-# CONFIG_RTC_DRV_EM3027 is not set
-# CONFIG_RTC_DRV_EP93XX is not set
-# CONFIG_RTC_DRV_FM3130 is not set
-# CONFIG_RTC_DRV_FTRTC010 is not set
-# CONFIG_RTC_DRV_GENERIC is not set
-# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
-# CONFIG_RTC_DRV_HYM8563 is not set
-# CONFIG_RTC_DRV_ISL12022 is not set
-# CONFIG_RTC_DRV_ISL12026 is not set
-# CONFIG_RTC_DRV_ISL12057 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_JZ4740 is not set
-# CONFIG_RTC_DRV_M41T80 is not set
-# CONFIG_RTC_DRV_M41T93 is not set
-# CONFIG_RTC_DRV_M41T94 is not set
-# CONFIG_RTC_DRV_M48T35 is not set
-# CONFIG_RTC_DRV_M48T59 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-# CONFIG_RTC_DRV_MAX6900 is not set
-# CONFIG_RTC_DRV_MAX6902 is not set
-# CONFIG_RTC_DRV_MAX6916 is not set
-# CONFIG_RTC_DRV_MCP795 is not set
-# CONFIG_RTC_DRV_MOXART is not set
-# CONFIG_RTC_DRV_MPC5121 is not set
-# CONFIG_RTC_DRV_MSM6242 is not set
-# CONFIG_RTC_DRV_OMAP is not set
-# CONFIG_RTC_DRV_PCF2123 is not set
-# CONFIG_RTC_DRV_PCF2127 is not set
-# CONFIG_RTC_DRV_PCF85063 is not set
-# CONFIG_RTC_DRV_PCF8523 is not set
-# CONFIG_RTC_DRV_PCF85363 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_PL030 is not set
-# CONFIG_RTC_DRV_PL031 is not set
-# CONFIG_RTC_DRV_PS3 is not set
-# CONFIG_RTC_DRV_PT7C4338 is not set
-# CONFIG_RTC_DRV_R7301 is not set
-# CONFIG_RTC_DRV_R9701 is not set
-# CONFIG_RTC_DRV_RP5C01 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_RTC7301 is not set
-# CONFIG_RTC_DRV_RV3028 is not set
-# CONFIG_RTC_DRV_RV3029C2 is not set
-# CONFIG_RTC_DRV_RV8803 is not set
-# CONFIG_RTC_DRV_RX4581 is not set
-# CONFIG_RTC_DRV_RX6110 is not set
-# CONFIG_RTC_DRV_RX8010 is not set
-# CONFIG_RTC_DRV_RX8025 is not set
-# CONFIG_RTC_DRV_RX8581 is not set
-# CONFIG_RTC_DRV_S35390A is not set
-# CONFIG_RTC_DRV_SD3078 is not set
-# CONFIG_RTC_DRV_SNVS is not set
-# CONFIG_RTC_DRV_STK17TA8 is not set
-# CONFIG_RTC_DRV_SUN6I is not set
-# CONFIG_RTC_DRV_TEST is not set
-# CONFIG_RTC_DRV_V3020 is not set
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_XGENE is not set
-# CONFIG_RTC_DRV_ZYNQMP is not set
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_LIB=y
-# CONFIG_RTC_NVMEM is not set
-CONFIG_RTC_SYSTOHC=y
-CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
-# CONFIG_RTL8180 is not set
-# CONFIG_RTL8187 is not set
-# CONFIG_RTL8192E is not set
-# CONFIG_RTL8192U is not set
-# CONFIG_RTL8306_PHY is not set
-# CONFIG_RTL8366RB_PHY is not set
-# CONFIG_RTL8366S_PHY is not set
-# CONFIG_RTL8366_SMI is not set
-# CONFIG_RTL8366_SMI_DEBUG_FS is not set
-# CONFIG_RTL8367B_PHY is not set
-# CONFIG_RTL8367_PHY is not set
-# CONFIG_RTLLIB is not set
-# CONFIG_RTL_CARDS is not set
-# CONFIG_RTS5208 is not set
-CONFIG_RT_MUTEXES=y
-# CONFIG_RUNTIME_DEBUG is not set
-CONFIG_RUNTIME_TESTING_MENU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_RXKAD=y
-# CONFIG_S2IO is not set
-# CONFIG_SAMPLES is not set
-# CONFIG_SAMSUNG_LAPTOP is not set
-# CONFIG_SATA_ACARD_AHCI is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_AHCI_PLATFORM is not set
-# CONFIG_SATA_DWC is not set
-# CONFIG_SATA_FSL is not set
-# CONFIG_SATA_HIGHBANK is not set
-# CONFIG_SATA_INIC162X is not set
-CONFIG_SATA_MOBILE_LPM_POLICY=0
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_SATA_PMP is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_RCAR is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIL24 is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_SVW is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SBC_FITPC2_WATCHDOG is not set
-CONFIG_SBITMAP=y
-# CONFIG_SC92031 is not set
-# CONFIG_SCA3000 is not set
-# CONFIG_SCACHE_DEBUGFS is not set
-# CONFIG_SCC is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_SCHED_AUTOGROUP is not set
-# CONFIG_SCHED_DEBUG is not set
-CONFIG_SCHED_HRTICK=y
-# CONFIG_SCHED_MC is not set
-CONFIG_SCHED_OMIT_FRAME_POINTER=y
-# CONFIG_SCHED_SMT is not set
-# CONFIG_SCHED_STACK_END_CHECK is not set
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_SCR24X is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_3W_SAS is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_AM53C974 is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_SCSI_BFA_FC is not set
-# CONFIG_SCSI_BNX2X_FCOE is not set
-# CONFIG_SCSI_BNX2_ISCSI is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CHELSIO_FCOE is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_CXGB3_ISCSI is not set
-# CONFIG_SCSI_CXGB4_ISCSI is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DH is not set
-CONFIG_SCSI_DMA=y
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_ESAS2R is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_FDOMAIN_PCI is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_HISI_SAS is not set
-# CONFIG_SCSI_HPSA is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_ISCI is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_LOGGING is not set
-CONFIG_SCSI_LOWLEVEL=y
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-# CONFIG_SCSI_LPFC is not set
-CONFIG_SCSI_MOD=y
-# CONFIG_SCSI_MPT2SAS is not set
-# CONFIG_SCSI_MPT3SAS is not set
-# CONFIG_SCSI_MQ_DEFAULT is not set
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_MVSAS_DEBUG is not set
-# CONFIG_SCSI_MVUMI is not set
-# CONFIG_SCSI_MYRB is not set
-# CONFIG_SCSI_MYRS is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_NETLINK is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_OSD_INITIATOR is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PM8001 is not set
-# CONFIG_SCSI_PMCRAID is not set
-CONFIG_SCSI_PROC_FS=y
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-# CONFIG_SCSI_SMARTPQI is not set
-# CONFIG_SCSI_SNIC is not set
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_SRP_ATTRS is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_UFSHCD is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_VIRTIO is not set
-# CONFIG_SCSI_WD719X is not set
-# CONFIG_SCx200_ACB is not set
-# CONFIG_SDIO_UART is not set
-# CONFIG_SD_ADC_MODULATOR is not set
-# CONFIG_SECCOMP is not set
-CONFIG_SECTION_MISMATCH_WARN_ONLY=y
-# CONFIG_SECURITY is not set
-# CONFIG_SECURITYFS is not set
-# CONFIG_SECURITY_APPARMOR is not set
-CONFIG_SECURITY_DMESG_RESTRICT=y
-# CONFIG_SECURITY_LOADPIN is not set
-# CONFIG_SECURITY_LOCKDOWN_LSM is not set
-# CONFIG_SECURITY_NETWORK_XFRM is not set
-# CONFIG_SECURITY_PATH is not set
-# CONFIG_SECURITY_SAFESETID is not set
-# CONFIG_SECURITY_SELINUX_AVC_STATS is not set
-# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
-CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0
-# CONFIG_SECURITY_SELINUX_DEVELOP is not set
-# CONFIG_SECURITY_SELINUX_DISABLE is not set
-# CONFIG_SECURITY_SMACK is not set
-# CONFIG_SECURITY_TOMOYO is not set
-# CONFIG_SECURITY_YAMA is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-# CONFIG_SENSIRION_SGP30 is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_ACPI_POWER is not set
-# CONFIG_SENSORS_AD7314 is not set
-# CONFIG_SENSORS_AD7414 is not set
-# CONFIG_SENSORS_AD7418 is not set
-# CONFIG_SENSORS_ADC128D818 is not set
-# CONFIG_SENSORS_ADCXX is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1029 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM1275 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ADS1015 is not set
-# CONFIG_SENSORS_ADS7828 is not set
-# CONFIG_SENSORS_ADS7871 is not set
-# CONFIG_SENSORS_ADT7310 is not set
-# CONFIG_SENSORS_ADT7410 is not set
-# CONFIG_SENSORS_ADT7411 is not set
-# CONFIG_SENSORS_ADT7462 is not set
-# CONFIG_SENSORS_ADT7470 is not set
-# CONFIG_SENSORS_ADT7475 is not set
-# CONFIG_SENSORS_AMC6821 is not set
-# CONFIG_SENSORS_APDS990X is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_SENSORS_AS370 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ASC7621 is not set
-# CONFIG_SENSORS_ASPEED is not set
-# CONFIG_SENSORS_ATK0110 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_BH1770 is not set
-# CONFIG_SENSORS_BH1780 is not set
-# CONFIG_SENSORS_CORETEMP is not set
-# CONFIG_SENSORS_DELL_SMM is not set
-# CONFIG_SENSORS_DME1737 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_DS620 is not set
-# CONFIG_SENSORS_EMC1403 is not set
-# CONFIG_SENSORS_EMC2103 is not set
-# CONFIG_SENSORS_EMC6W201 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_F71882FG is not set
-# CONFIG_SENSORS_F75375S is not set
-# CONFIG_SENSORS_FAM15H_POWER is not set
-# CONFIG_SENSORS_FSCHMD is not set
-# CONFIG_SENSORS_FTSTEUTATES is not set
-# CONFIG_SENSORS_G760A is not set
-# CONFIG_SENSORS_G762 is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_GPIO_FAN is not set
-# CONFIG_SENSORS_GSC is not set
-# CONFIG_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_HIH6130 is not set
-# CONFIG_SENSORS_HMC5843 is not set
-# CONFIG_SENSORS_HMC5843_I2C is not set
-# CONFIG_SENSORS_HMC5843_SPI is not set
-# CONFIG_SENSORS_HTU21 is not set
-# CONFIG_SENSORS_I5500 is not set
-# CONFIG_SENSORS_I5K_AMB is not set
-# CONFIG_SENSORS_IBM_CFFPS is not set
-# CONFIG_SENSORS_IIO_HWMON is not set
-# CONFIG_SENSORS_INA209 is not set
-# CONFIG_SENSORS_INA2XX is not set
-# CONFIG_SENSORS_INA3221 is not set
-# CONFIG_SENSORS_INSPUR_IPSPS is not set
-# CONFIG_SENSORS_IR35221 is not set
-# CONFIG_SENSORS_IR38064 is not set
-# CONFIG_SENSORS_IRPS5401 is not set
-# CONFIG_SENSORS_ISL29018 is not set
-# CONFIG_SENSORS_ISL29028 is not set
-# CONFIG_SENSORS_ISL68137 is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_JC42 is not set
-# CONFIG_SENSORS_K10TEMP is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_LINEAGE is not set
-# CONFIG_SENSORS_LIS3LV02D is not set
-# CONFIG_SENSORS_LIS3_I2C is not set
-# CONFIG_SENSORS_LIS3_SPI is not set
-# CONFIG_SENSORS_LM25066 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM73 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_LM93 is not set
-# CONFIG_SENSORS_LM95234 is not set
-# CONFIG_SENSORS_LM95241 is not set
-# CONFIG_SENSORS_LM95245 is not set
-# CONFIG_SENSORS_LTC2945 is not set
-# CONFIG_SENSORS_LTC2978 is not set
-# CONFIG_SENSORS_LTC2990 is not set
-# CONFIG_SENSORS_LTC3815 is not set
-# CONFIG_SENSORS_LTC4151 is not set
-# CONFIG_SENSORS_LTC4215 is not set
-# CONFIG_SENSORS_LTC4222 is not set
-# CONFIG_SENSORS_LTC4245 is not set
-# CONFIG_SENSORS_LTC4260 is not set
-# CONFIG_SENSORS_LTC4261 is not set
-# CONFIG_SENSORS_LTQ_CPUTEMP is not set
-# CONFIG_SENSORS_MAX1111 is not set
-# CONFIG_SENSORS_MAX16064 is not set
-# CONFIG_SENSORS_MAX16065 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_MAX1668 is not set
-# CONFIG_SENSORS_MAX197 is not set
-# CONFIG_SENSORS_MAX20751 is not set
-# CONFIG_SENSORS_MAX31722 is not set
-# CONFIG_SENSORS_MAX31785 is not set
-# CONFIG_SENSORS_MAX31790 is not set
-# CONFIG_SENSORS_MAX34440 is not set
-# CONFIG_SENSORS_MAX6621 is not set
-# CONFIG_SENSORS_MAX6639 is not set
-# CONFIG_SENSORS_MAX6642 is not set
-# CONFIG_SENSORS_MAX6650 is not set
-# CONFIG_SENSORS_MAX6697 is not set
-# CONFIG_SENSORS_MAX8688 is not set
-# CONFIG_SENSORS_MCP3021 is not set
-# CONFIG_SENSORS_NCT6683 is not set
-# CONFIG_SENSORS_NCT6775 is not set
-# CONFIG_SENSORS_NCT7802 is not set
-# CONFIG_SENSORS_NCT7904 is not set
-# CONFIG_SENSORS_NPCM7XX is not set
-# CONFIG_SENSORS_NSA320 is not set
-# CONFIG_SENSORS_NTC_THERMISTOR is not set
-# CONFIG_SENSORS_OCC_P8_I2C is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_PCF8591 is not set
-# CONFIG_SENSORS_PMBUS is not set
-# CONFIG_SENSORS_POWR1220 is not set
-# CONFIG_SENSORS_PWM_FAN is not set
-# CONFIG_SENSORS_PXE1610 is not set
-# CONFIG_SENSORS_RM3100_I2C is not set
-# CONFIG_SENSORS_RM3100_SPI is not set
-# CONFIG_SENSORS_SCH5627 is not set
-# CONFIG_SENSORS_SCH5636 is not set
-# CONFIG_SENSORS_SCH56XX_COMMON is not set
-# CONFIG_SENSORS_SHT15 is not set
-# CONFIG_SENSORS_SHT21 is not set
-# CONFIG_SENSORS_SHT3x is not set
-# CONFIG_SENSORS_SHTC1 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMM665 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_STTS751 is not set
-# CONFIG_SENSORS_TC654 is not set
-# CONFIG_SENSORS_TC74 is not set
-# CONFIG_SENSORS_THMC50 is not set
-# CONFIG_SENSORS_TMP102 is not set
-# CONFIG_SENSORS_TMP103 is not set
-# CONFIG_SENSORS_TMP108 is not set
-# CONFIG_SENSORS_TMP401 is not set
-# CONFIG_SENSORS_TMP421 is not set
-# CONFIG_SENSORS_TPS40422 is not set
-# CONFIG_SENSORS_TPS53679 is not set
-# CONFIG_SENSORS_TSL2550 is not set
-# CONFIG_SENSORS_TSL2563 is not set
-# CONFIG_SENSORS_UCD9000 is not set
-# CONFIG_SENSORS_UCD9200 is not set
-# CONFIG_SENSORS_VEXPRESS is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VIA_CPUTEMP is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83773G is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83795 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83L786NG is not set
-# CONFIG_SENSORS_XGENE is not set
-# CONFIG_SENSORS_ZL6100 is not set
-CONFIG_SERIAL_8250=y
-# CONFIG_SERIAL_8250_ACCENT is not set
-# CONFIG_SERIAL_8250_ASPEED_VUART is not set
-# CONFIG_SERIAL_8250_BOCA is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-# CONFIG_SERIAL_8250_CS is not set
-# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-CONFIG_SERIAL_8250_DMA=y
-# CONFIG_SERIAL_8250_DW is not set
-# CONFIG_SERIAL_8250_EM is not set
-# CONFIG_SERIAL_8250_EXAR is not set
-# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
-# CONFIG_SERIAL_8250_EXTENDED is not set
-# CONFIG_SERIAL_8250_FINTEK is not set
-# CONFIG_SERIAL_8250_FOURPORT is not set
-# CONFIG_SERIAL_8250_HUB6 is not set
-# CONFIG_SERIAL_8250_INGENIC is not set
-# CONFIG_SERIAL_8250_LPSS is not set
-# CONFIG_SERIAL_8250_MANY_PORTS is not set
-# CONFIG_SERIAL_8250_MID is not set
-# CONFIG_SERIAL_8250_MOXA is not set
-CONFIG_SERIAL_8250_NR_UARTS=2
-# CONFIG_SERIAL_8250_PCI is not set
-# CONFIG_SERIAL_8250_RSA is not set
-# CONFIG_SERIAL_8250_RT288X is not set
-CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-# CONFIG_SERIAL_ALTERA_JTAGUART is not set
-# CONFIG_SERIAL_ALTERA_UART is not set
-# CONFIG_SERIAL_AMBA_PL010 is not set
-# CONFIG_SERIAL_AMBA_PL011 is not set
-# CONFIG_SERIAL_ARC is not set
-# CONFIG_SERIAL_BCM63XX is not set
-# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_DEV_BUS is not set
-CONFIG_SERIAL_EARLYCON=y
-# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
-# CONFIG_SERIAL_FSL_LINFLEXUART is not set
-# CONFIG_SERIAL_FSL_LPUART is not set
-# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
-# CONFIG_SERIAL_IFX6X60 is not set
-# CONFIG_SERIAL_JSM is not set
-# CONFIG_SERIAL_MAX3100 is not set
-# CONFIG_SERIAL_MAX310X is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_SERIAL_OF_PLATFORM is not set
-# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
-# CONFIG_SERIAL_PCH_UART is not set
-# CONFIG_SERIAL_RP2 is not set
-# CONFIG_SERIAL_SC16IS7XX is not set
-# CONFIG_SERIAL_SCCNXP is not set
-# CONFIG_SERIAL_SH_SCI is not set
-# CONFIG_SERIAL_SIFIVE is not set
-# CONFIG_SERIAL_STM32 is not set
-# CONFIG_SERIAL_ST_ASC is not set
-# CONFIG_SERIAL_TIMBERDALE is not set
-# CONFIG_SERIAL_UARTLITE is not set
-# CONFIG_SERIAL_XILINX_PS_UART is not set
-# CONFIG_SERIO is not set
-# CONFIG_SERIO_ALTERA_PS2 is not set
-# CONFIG_SERIO_AMBAKMI is not set
-# CONFIG_SERIO_APBPS2 is not set
-# CONFIG_SERIO_ARC_PS2 is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_GPIO_PS2 is not set
-# CONFIG_SERIO_I8042 is not set
-# CONFIG_SERIO_LIBPS2 is not set
-# CONFIG_SERIO_PARKBD is not set
-# CONFIG_SERIO_PCIPS2 is not set
-# CONFIG_SERIO_PS2MULT is not set
-# CONFIG_SERIO_RAW is not set
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_SUN4I_PS2 is not set
-# CONFIG_SFC is not set
-# CONFIG_SFC_FALCON is not set
-# CONFIG_SFI is not set
-# CONFIG_SFP is not set
-# CONFIG_SGETMASK_SYSCALL is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP27 is not set
-# CONFIG_SGI_IP28 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_SG_POOL is not set
-# CONFIG_SG_SPLIT is not set
-CONFIG_SHMEM=y
-# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
-# CONFIG_SH_ETH is not set
-# CONFIG_SH_TIMER_CMT is not set
-# CONFIG_SH_TIMER_MTU2 is not set
-# CONFIG_SH_TIMER_TMU is not set
-# CONFIG_SI1133 is not set
-# CONFIG_SI1145 is not set
-# CONFIG_SI7005 is not set
-# CONFIG_SI7020 is not set
-# CONFIG_SIBYTE_BIGSUR is not set
-# CONFIG_SIBYTE_CARMEL is not set
-# CONFIG_SIBYTE_CRHINE is not set
-# CONFIG_SIBYTE_CRHONE is not set
-# CONFIG_SIBYTE_LITTLESUR is not set
-# CONFIG_SIBYTE_RHONE is not set
-# CONFIG_SIBYTE_SENTOSA is not set
-# CONFIG_SIBYTE_SWARM is not set
-CONFIG_SIGNALFD=y
-# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
-# CONFIG_SIMPLE_GPIO is not set
-# CONFIG_SIMPLE_PM_BUS is not set
-# CONFIG_SIOX is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SKY2_DEBUG is not set
-# CONFIG_SLAB is not set
-CONFIG_SLABINFO=y
-# CONFIG_SLAB_FREELIST_HARDENED is not set
-# CONFIG_SLAB_FREELIST_RANDOM is not set
-CONFIG_SLAB_MERGE_DEFAULT=y
-# CONFIG_SLHC is not set
-# CONFIG_SLICOSS is not set
-# CONFIG_SLIMBUS is not set
-# CONFIG_SLIP is not set
-# CONFIG_SLOB is not set
-CONFIG_SLUB=y
-CONFIG_SLUB_CPU_PARTIAL=y
-# CONFIG_SLUB_DEBUG is not set
-# CONFIG_SLUB_DEBUG_ON is not set
-# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
-# CONFIG_SLUB_STATS is not set
-# CONFIG_SMARTJOYPLUS_FF is not set
-# CONFIG_SMC911X is not set
-# CONFIG_SMC9194 is not set
-# CONFIG_SMC91X is not set
-# CONFIG_SMP is not set
-# CONFIG_SMSC911X is not set
-# CONFIG_SMSC9420 is not set
-# CONFIG_SMSC_PHY is not set
-# CONFIG_SM_FTL is not set
-# CONFIG_SND is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ALOOP is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ARM is not set
-# CONFIG_SND_ASIHPI is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_ATMEL_AC97C is not set
-# CONFIG_SND_ATMEL_SOC is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AUDIO_GRAPH_CARD is not set
-# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set
-# CONFIG_SND_AW2 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BCD2000 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5530 is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_CTXFI is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_DEBUG is not set
-# CONFIG_SND_DESIGNWARE_I2S is not set
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_EDMA_SOC is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_EMU10K1_SEQ is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FIREWIRE is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set
-CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
-CONFIG_SND_HDA_PREALLOC_SIZE=64
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HRTIMER is not set
-# CONFIG_SND_HWDEP is not set
-# CONFIG_SND_I2S_HI6210_I2S is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_INDIGODJX is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGOIOX is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_ISA is not set
-# CONFIG_SND_JZ4740_SOC_I2S is not set
-# CONFIG_SND_KIRKWOOD_SOC is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_LOLA is not set
-# CONFIG_SND_LX6464ES is not set
-# CONFIG_SND_MAESTRO3 is not set
-CONFIG_SND_MAX_CARDS=16
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_MIPS is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_MIXER_OSS is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MPC52xx_SOC_EFIKA is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_MTS64 is not set
-# CONFIG_SND_MXS_SOC is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPL3_LIB_SEQ is not set
-# CONFIG_SND_OPL4_LIB_SEQ is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_OXYGEN is not set
-CONFIG_SND_PCI=y
-# CONFIG_SND_PCM is not set
-# CONFIG_SND_PCMCIA is not set
-# CONFIG_SND_PCM_OSS is not set
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_PCM_TIMER is not set
-# CONFIG_SND_PCM_XRUN_DEBUG is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_PDAUDIOCF is not set
-# CONFIG_SND_PORTMAN2X4 is not set
-# CONFIG_SND_POWERPC_SOC is not set
-# CONFIG_SND_PPC is not set
-CONFIG_SND_PROC_FS=y
-# CONFIG_SND_RAWMIDI is not set
-# CONFIG_SND_RAWMIDI_SEQ is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_RTCTIMER is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SBAWE_SEQ is not set
-# CONFIG_SND_SE6X is not set
-# CONFIG_SND_SEQUENCER is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_SIMPLE_CARD is not set
-# CONFIG_SND_SIMPLE_SCU_CARD is not set
-# CONFIG_SND_SIS7019 is not set
-# CONFIG_SND_SOC is not set
-# CONFIG_SND_SOC_AC97_CODEC is not set
-# CONFIG_SND_SOC_ADAU1701 is not set
-# CONFIG_SND_SOC_ADAU1761_I2C is not set
-# CONFIG_SND_SOC_ADAU1761_SPI is not set
-# CONFIG_SND_SOC_ADAU7002 is not set
-# CONFIG_SND_SOC_AK4104 is not set
-# CONFIG_SND_SOC_AK4118 is not set
-# CONFIG_SND_SOC_AK4458 is not set
-# CONFIG_SND_SOC_AK4554 is not set
-# CONFIG_SND_SOC_AK4613 is not set
-# CONFIG_SND_SOC_AK4642 is not set
-# CONFIG_SND_SOC_AK5386 is not set
-# CONFIG_SND_SOC_AK5558 is not set
-# CONFIG_SND_SOC_ALC5623 is not set
-# CONFIG_SND_SOC_AMD_ACP is not set
-# CONFIG_SND_SOC_AMD_ACP3x is not set
-# CONFIG_SND_SOC_AU1XAUDIO is not set
-# CONFIG_SND_SOC_AU1XPSC is not set
-# CONFIG_SND_SOC_BD28623 is not set
-# CONFIG_SND_SOC_BT_SCO is not set
-# CONFIG_SND_SOC_CS35L32 is not set
-# CONFIG_SND_SOC_CS35L33 is not set
-# CONFIG_SND_SOC_CS35L34 is not set
-# CONFIG_SND_SOC_CS35L35 is not set
-# CONFIG_SND_SOC_CS35L36 is not set
-# CONFIG_SND_SOC_CS4265 is not set
-# CONFIG_SND_SOC_CS4270 is not set
-# CONFIG_SND_SOC_CS4271 is not set
-# CONFIG_SND_SOC_CS4271_I2C is not set
-# CONFIG_SND_SOC_CS4271_SPI is not set
-# CONFIG_SND_SOC_CS42L42 is not set
-# CONFIG_SND_SOC_CS42L51_I2C is not set
-# CONFIG_SND_SOC_CS42L52 is not set
-# CONFIG_SND_SOC_CS42L56 is not set
-# CONFIG_SND_SOC_CS42L73 is not set
-# CONFIG_SND_SOC_CS42XX8_I2C is not set
-# CONFIG_SND_SOC_CS43130 is not set
-# CONFIG_SND_SOC_CS4341 is not set
-# CONFIG_SND_SOC_CS4349 is not set
-# CONFIG_SND_SOC_CS53L30 is not set
-# CONFIG_SND_SOC_CX2072X is not set
-# CONFIG_SND_SOC_DIO2125 is not set
-# CONFIG_SND_SOC_DMIC is not set
-# CONFIG_SND_SOC_ES7134 is not set
-# CONFIG_SND_SOC_ES7241 is not set
-# CONFIG_SND_SOC_ES8316 is not set
-# CONFIG_SND_SOC_ES8328 is not set
-# CONFIG_SND_SOC_ES8328_I2C is not set
-# CONFIG_SND_SOC_ES8328_SPI is not set
-# CONFIG_SND_SOC_EUKREA_TLV320 is not set
-# CONFIG_SND_SOC_FSL_ASOC_CARD is not set
-# CONFIG_SND_SOC_FSL_ASRC is not set
-# CONFIG_SND_SOC_FSL_AUDMIX is not set
-# CONFIG_SND_SOC_FSL_ESAI is not set
-# CONFIG_SND_SOC_FSL_MICFIL is not set
-# CONFIG_SND_SOC_FSL_SAI is not set
-# CONFIG_SND_SOC_FSL_SPDIF is not set
-# CONFIG_SND_SOC_FSL_SSI is not set
-# CONFIG_SND_SOC_GTM601 is not set
-# CONFIG_SND_SOC_ICS43432 is not set
-# CONFIG_SND_SOC_IMG is not set
-# CONFIG_SND_SOC_IMX_AUDMIX is not set
-# CONFIG_SND_SOC_IMX_AUDMUX is not set
-# CONFIG_SND_SOC_IMX_ES8328 is not set
-# CONFIG_SND_SOC_IMX_SPDIF is not set
-# CONFIG_SND_SOC_IMX_WM8962 is not set
-# CONFIG_SND_SOC_INNO_RK3036 is not set
-# CONFIG_SND_SOC_INTEL_APL is not set
-# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set
-# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set
-# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set
-# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set
-# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set
-# CONFIG_SND_SOC_INTEL_CFL is not set
-# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set
-# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set
-# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set
-# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set
-# CONFIG_SND_SOC_INTEL_CML_H is not set
-# CONFIG_SND_SOC_INTEL_CML_LP is not set
-# CONFIG_SND_SOC_INTEL_CNL is not set
-# CONFIG_SND_SOC_INTEL_GLK is not set
-# CONFIG_SND_SOC_INTEL_HASWELL is not set
-# CONFIG_SND_SOC_INTEL_KBL is not set
-# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set
-# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set
-# CONFIG_SND_SOC_INTEL_SKL is not set
-# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set
-# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set
-# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set
-# CONFIG_SND_SOC_INTEL_SKYLAKE is not set
-# CONFIG_SND_SOC_INTEL_SST is not set
-CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
-# CONFIG_SND_SOC_JZ4725B_CODEC is not set
-# CONFIG_SND_SOC_JZ4740_CODEC is not set
-# CONFIG_SND_SOC_MA120X0P is not set
-# CONFIG_SND_SOC_MAX9759 is not set
-# CONFIG_SND_SOC_MAX98088 is not set
-# CONFIG_SND_SOC_MAX98357A is not set
-# CONFIG_SND_SOC_MAX98373 is not set
-# CONFIG_SND_SOC_MAX98504 is not set
-# CONFIG_SND_SOC_MAX9860 is not set
-# CONFIG_SND_SOC_MAX9867 is not set
-# CONFIG_SND_SOC_MAX98927 is not set
-# CONFIG_SND_SOC_MEDIATEK is not set
-# CONFIG_SND_SOC_MPC5200_AC97 is not set
-# CONFIG_SND_SOC_MPC5200_I2S is not set
-# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set
-# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set
-# CONFIG_SND_SOC_MT2701 is not set
-# CONFIG_SND_SOC_MT6351 is not set
-# CONFIG_SND_SOC_MT6358 is not set
-# CONFIG_SND_SOC_MT8173 is not set
-# CONFIG_SND_SOC_MTK_BTCVSD is not set
-# CONFIG_SND_SOC_NAU8540 is not set
-# CONFIG_SND_SOC_NAU8810 is not set
-# CONFIG_SND_SOC_NAU8822 is not set
-# CONFIG_SND_SOC_NAU8824 is not set
-# CONFIG_SND_SOC_PCM1681 is not set
-# CONFIG_SND_SOC_PCM1789_I2C is not set
-# CONFIG_SND_SOC_PCM1792A is not set
-# CONFIG_SND_SOC_PCM179X_I2C is not set
-# CONFIG_SND_SOC_PCM179X_SPI is not set
-# CONFIG_SND_SOC_PCM186X_I2C is not set
-# CONFIG_SND_SOC_PCM186X_SPI is not set
-# CONFIG_SND_SOC_PCM3060_I2C is not set
-# CONFIG_SND_SOC_PCM3060_SPI is not set
-# CONFIG_SND_SOC_PCM3168A_I2C is not set
-# CONFIG_SND_SOC_PCM3168A_SPI is not set
-# CONFIG_SND_SOC_PCM512x_I2C is not set
-# CONFIG_SND_SOC_PCM512x_SPI is not set
-# CONFIG_SND_SOC_QCOM is not set
-# CONFIG_SND_SOC_RK3328 is not set
-# CONFIG_SND_SOC_RT5616 is not set
-# CONFIG_SND_SOC_RT5631 is not set
-# CONFIG_SND_SOC_RT5677_SPI is not set
-# CONFIG_SND_SOC_SGTL5000 is not set
-# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set
-# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
-# CONFIG_SND_SOC_SOF_TOPLEVEL is not set
-# CONFIG_SND_SOC_SPDIF is not set
-# CONFIG_SND_SOC_SSM2305 is not set
-# CONFIG_SND_SOC_SSM2602_I2C is not set
-# CONFIG_SND_SOC_SSM2602_SPI is not set
-# CONFIG_SND_SOC_SSM4567 is not set
-# CONFIG_SND_SOC_STA32X is not set
-# CONFIG_SND_SOC_STA350 is not set
-# CONFIG_SND_SOC_STI_SAS is not set
-# CONFIG_SND_SOC_TAS2552 is not set
-# CONFIG_SND_SOC_TAS5086 is not set
-# CONFIG_SND_SOC_TAS571X is not set
-# CONFIG_SND_SOC_TAS5720 is not set
-# CONFIG_SND_SOC_TAS6424 is not set
-# CONFIG_SND_SOC_TDA7419 is not set
-# CONFIG_SND_SOC_TFA9879 is not set
-# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
-# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
-# CONFIG_SND_SOC_TLV320AIC31XX is not set
-# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set
-# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set
-# CONFIG_SND_SOC_TLV320AIC3X is not set
-# CONFIG_SND_SOC_TPA6130A2 is not set
-# CONFIG_SND_SOC_TS3A227E is not set
-# CONFIG_SND_SOC_TSCS42XX is not set
-# CONFIG_SND_SOC_TSCS454 is not set
-# CONFIG_SND_SOC_UDA1334 is not set
-# CONFIG_SND_SOC_WM8510 is not set
-# CONFIG_SND_SOC_WM8523 is not set
-# CONFIG_SND_SOC_WM8524 is not set
-# CONFIG_SND_SOC_WM8580 is not set
-# CONFIG_SND_SOC_WM8711 is not set
-# CONFIG_SND_SOC_WM8728 is not set
-# CONFIG_SND_SOC_WM8731 is not set
-# CONFIG_SND_SOC_WM8737 is not set
-# CONFIG_SND_SOC_WM8741 is not set
-# CONFIG_SND_SOC_WM8750 is not set
-# CONFIG_SND_SOC_WM8753 is not set
-# CONFIG_SND_SOC_WM8770 is not set
-# CONFIG_SND_SOC_WM8776 is not set
-# CONFIG_SND_SOC_WM8782 is not set
-# CONFIG_SND_SOC_WM8804_I2C is not set
-# CONFIG_SND_SOC_WM8804_SPI is not set
-# CONFIG_SND_SOC_WM8903 is not set
-# CONFIG_SND_SOC_WM8904 is not set
-# CONFIG_SND_SOC_WM8960 is not set
-# CONFIG_SND_SOC_WM8962 is not set
-# CONFIG_SND_SOC_WM8974 is not set
-# CONFIG_SND_SOC_WM8978 is not set
-# CONFIG_SND_SOC_WM8985 is not set
-# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set
-# CONFIG_SND_SOC_XILINX_I2S is not set
-# CONFIG_SND_SOC_XILINX_SPDIF is not set
-# CONFIG_SND_SOC_XTFPGA_I2S is not set
-# CONFIG_SND_SOC_ZX_AUD96P22 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_SPI is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set
-# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set
-# CONFIG_SND_SUN4I_CODEC is not set
-# CONFIG_SND_SUPPORT_OLD_API is not set
-# CONFIG_SND_TIMER is not set
-# CONFIG_SND_TRIDENT is not set
-CONFIG_SND_USB=y
-# CONFIG_SND_USB_6FIRE is not set
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_CAIAQ is not set
-# CONFIG_SND_USB_HIFACE is not set
-# CONFIG_SND_USB_POD is not set
-# CONFIG_SND_USB_PODHD is not set
-# CONFIG_SND_USB_TONEPORT is not set
-# CONFIG_SND_USB_UA101 is not set
-# CONFIG_SND_USB_US122L is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_USB_VARIAX is not set
-# CONFIG_SND_VERBOSE_PRINTK is not set
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_WAVEFRONT is not set
-CONFIG_SND_X86=y
-# CONFIG_SND_XEN_FRONTEND is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SNI_RM is not set
-# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set
-# CONFIG_SOCK_CGROUP_DATA is not set
-# CONFIG_SOC_AM33XX is not set
-# CONFIG_SOC_AM43XX is not set
-# CONFIG_SOC_BRCMSTB is not set
-# CONFIG_SOC_CAMERA is not set
-# CONFIG_SOC_DRA7XX is not set
-# CONFIG_SOC_HAS_OMAP2_SDRC is not set
-# CONFIG_SOC_OMAP5 is not set
-# CONFIG_SOC_TI is not set
-# CONFIG_SOFTLOCKUP_DETECTOR is not set
-# CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_SONYPI is not set
-# CONFIG_SONY_LAPTOP is not set
-# CONFIG_SOUND is not set
-# CONFIG_SOUNDWIRE is not set
-# CONFIG_SOUND_OSS_CORE is not set
-# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
-# CONFIG_SOUND_PRIME is not set
-# CONFIG_SP5100_TCO is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_STATIC is not set
-# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-# CONFIG_SPARSE_IRQ is not set
-# CONFIG_SPARSE_RCU_POINTER is not set
-# CONFIG_SPEAKUP is not set
-# CONFIG_SPI is not set
-# CONFIG_SPINLOCK_TEST is not set
-# CONFIG_SPI_ALTERA is not set
-# CONFIG_SPI_AU1550 is not set
-# CONFIG_SPI_AXI_SPI_ENGINE is not set
-# CONFIG_SPI_BCM2835 is not set
-# CONFIG_SPI_BCM_QSPI is not set
-# CONFIG_SPI_BITBANG is not set
-# CONFIG_SPI_BUTTERFLY is not set
-# CONFIG_SPI_CADENCE is not set
-# CONFIG_SPI_CADENCE_QUADSPI is not set
-# CONFIG_SPI_DEBUG is not set
-# CONFIG_SPI_DESIGNWARE is not set
-# CONFIG_SPI_FSL_DSPI is not set
-# CONFIG_SPI_FSL_ESPI is not set
-# CONFIG_SPI_FSL_SPI is not set
-# CONFIG_SPI_GPIO is not set
-# CONFIG_SPI_GPIO_OLD is not set
-# CONFIG_SPI_IMG_SPFI is not set
-# CONFIG_SPI_LM70_LLP is not set
-# CONFIG_SPI_LOOPBACK_TEST is not set
-# CONFIG_SPI_MASTER is not set
-# CONFIG_SPI_MEM is not set
-# CONFIG_SPI_MPC52xx is not set
-# CONFIG_SPI_MPC52xx_PSC is not set
-# CONFIG_SPI_MTK_QUADSPI is not set
-# CONFIG_SPI_MXIC is not set
-# CONFIG_SPI_NXP_FLEXSPI is not set
-# CONFIG_SPI_OCTEON is not set
-# CONFIG_SPI_OC_TINY is not set
-# CONFIG_SPI_ORION is not set
-# CONFIG_SPI_PL022 is not set
-# CONFIG_SPI_PPC4xx is not set
-# CONFIG_SPI_PXA2XX is not set
-# CONFIG_SPI_PXA2XX_PCI is not set
-# CONFIG_SPI_QCOM_QSPI is not set
-# CONFIG_SPI_ROCKCHIP is not set
-# CONFIG_SPI_S3C64XX is not set
-# CONFIG_SPI_SC18IS602 is not set
-# CONFIG_SPI_SIFIVE is not set
-# CONFIG_SPI_SLAVE is not set
-# CONFIG_SPI_SPIDEV is not set
-# CONFIG_SPI_THUNDERX is not set
-# CONFIG_SPI_TI_QSPI is not set
-# CONFIG_SPI_TLE62X0 is not set
-# CONFIG_SPI_TOPCLIFF_PCH is not set
-# CONFIG_SPI_XCOMM is not set
-# CONFIG_SPI_XILINX is not set
-# CONFIG_SPI_XWAY is not set
-# CONFIG_SPI_ZYNQMP_GQSPI is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_SPMI is not set
-# CONFIG_SPS30 is not set
-CONFIG_SQUASHFS=y
-# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
-# CONFIG_SQUASHFS_DECOMP_MULTI is not set
-CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
-# CONFIG_SQUASHFS_DECOMP_SINGLE is not set
-CONFIG_SQUASHFS_EMBEDDED=y
-# CONFIG_SQUASHFS_FILE_CACHE is not set
-CONFIG_SQUASHFS_FILE_DIRECT=y
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_LZ4 is not set
-# CONFIG_SQUASHFS_LZO is not set
-# CONFIG_SQUASHFS_XATTR is not set
-CONFIG_SQUASHFS_XZ=y
-# CONFIG_SQUASHFS_ZLIB is not set
-# CONFIG_SQUASHFS_ZSTD is not set
-# CONFIG_SRAM is not set
-# CONFIG_SRF04 is not set
-# CONFIG_SRF08 is not set
-# CONFIG_SSB is not set
-# CONFIG_SSB_DEBUG is not set
-# CONFIG_SSB_DRIVER_GPIO is not set
-# CONFIG_SSB_HOST_SOC is not set
-# CONFIG_SSB_PCMCIAHOST is not set
-CONFIG_SSB_POSSIBLE=y
-# CONFIG_SSB_SDIOHOST is not set
-# CONFIG_SSB_SILENT is not set
-# CONFIG_SSFDC is not set
-# CONFIG_STACKPROTECTOR is not set
-# CONFIG_STACKPROTECTOR_STRONG is not set
-# CONFIG_STACKTRACE is not set
-CONFIG_STACKTRACE_SUPPORT=y
-# CONFIG_STACK_TRACER is not set
-# CONFIG_STACK_VALIDATION is not set
-CONFIG_STAGING=y
-# CONFIG_STAGING_BOARD is not set
-# CONFIG_STAGING_GASKET_FRAMEWORK is not set
-# CONFIG_STAGING_MEDIA is not set
-CONFIG_STANDALONE=y
-# CONFIG_STATIC_KEYS_SELFTEST is not set
-# CONFIG_STATIC_USERMODEHELPER is not set
-CONFIG_STDBINUTILS=y
-# CONFIG_STE10XP is not set
-# CONFIG_STE_MODEM_RPROC is not set
-# CONFIG_STK3310 is not set
-# CONFIG_STK8312 is not set
-# CONFIG_STK8BA50 is not set
-# CONFIG_STM is not set
-# CONFIG_STMMAC_ETH is not set
-# CONFIG_STMMAC_PCI is not set
-# CONFIG_STMMAC_PLATFORM is not set
-# CONFIG_STM_DUMMY is not set
-# CONFIG_STM_SOURCE_CONSOLE is not set
-CONFIG_STP=y
-# CONFIG_STREAM_PARSER is not set
-# CONFIG_STRICT_DEVMEM is not set
-CONFIG_STRICT_KERNEL_RWX=y
-CONFIG_STRICT_MODULE_RWX=y
-# CONFIG_STRING_SELFTEST is not set
-CONFIG_STRIP_ASM_SYMS=y
-# CONFIG_STX104 is not set
-# CONFIG_ST_UVIS25 is not set
-# CONFIG_SUN4I_GPADC is not set
-# CONFIG_SUN50I_DE2_BUS is not set
-# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_SUNRPC is not set
-# CONFIG_SUNRPC_DEBUG is not set
-CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SUNXI_SRAM is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_SURFACE_3_BUTTON is not set
-# CONFIG_SUSPEND is not set
-# CONFIG_SUSPEND_SKIP_SYNC is not set
-CONFIG_SWAP=y
-# CONFIG_SWCONFIG is not set
-# CONFIG_SWCONFIG_B53 is not set
-# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set
-# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set
-# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set
-# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set
-# CONFIG_SWCONFIG_LEDS is not set
-# CONFIG_SW_SYNC is not set
-# CONFIG_SX9500 is not set
-# CONFIG_SXGBE_ETH is not set
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_SYNC_FILE is not set
-# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set
-CONFIG_SYN_COOKIES=y
-# CONFIG_SYSCON_REBOOT_MODE is not set
-CONFIG_SYSCTL=y
-# CONFIG_SYSCTL_SYSCALL is not set
-CONFIG_SYSFS=y
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_SYSFS_DEPRECATED_V2 is not set
-# CONFIG_SYSFS_SYSCALL is not set
-# CONFIG_SYSTEMPORT is not set
-# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
-# CONFIG_SYSTEM_DATA_VERIFICATION is not set
-# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
-CONFIG_SYSTEM_TRUSTED_KEYS=""
-# CONFIG_SYSV68_PARTITION is not set
-CONFIG_SYSVIPC=y
-CONFIG_SYSVIPC_SYSCTL=y
-# CONFIG_SYSV_FS is not set
-# CONFIG_SYS_HYPERVISOR is not set
-# CONFIG_T5403 is not set
-# CONFIG_TARGET_CORE is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_TASKS_RCU is not set
-# CONFIG_TASK_XACCT is not set
-# CONFIG_TC35815 is not set
-# CONFIG_TCG_ATMEL is not set
-# CONFIG_TCG_CRB is not set
-# CONFIG_TCG_FTPM_TEE is not set
-# CONFIG_TCG_INFINEON is not set
-# CONFIG_TCG_NSC is not set
-# CONFIG_TCG_ST33_I2C is not set
-# CONFIG_TCG_TIS is not set
-# CONFIG_TCG_TIS_I2C_ATMEL is not set
-# CONFIG_TCG_TIS_I2C_INFINEON is not set
-# CONFIG_TCG_TIS_I2C_NUVOTON is not set
-# CONFIG_TCG_TIS_SPI is not set
-# CONFIG_TCG_TIS_ST33ZP24_I2C is not set
-# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
-# CONFIG_TCG_TPM is not set
-# CONFIG_TCG_VTPM_PROXY is not set
-# CONFIG_TCG_XEN is not set
-# CONFIG_TCIC is not set
-CONFIG_TCP_CONG_ADVANCED=y
-# CONFIG_TCP_CONG_BBR is not set
-# CONFIG_TCP_CONG_BIC is not set
-# CONFIG_TCP_CONG_CDG is not set
-CONFIG_TCP_CONG_CUBIC=y
-# CONFIG_TCP_CONG_DCTCP is not set
-# CONFIG_TCP_CONG_HSTCP is not set
-# CONFIG_TCP_CONG_HTCP is not set
-# CONFIG_TCP_CONG_HYBLA is not set
-# CONFIG_TCP_CONG_ILLINOIS is not set
-# CONFIG_TCP_CONG_LP is not set
-# CONFIG_TCP_CONG_NV is not set
-# CONFIG_TCP_CONG_SCALABLE is not set
-# CONFIG_TCP_CONG_VEGAS is not set
-# CONFIG_TCP_CONG_VENO is not set
-# CONFIG_TCP_CONG_WESTWOOD is not set
-# CONFIG_TCP_CONG_YEAH is not set
-# CONFIG_TCP_MD5SIG is not set
-# CONFIG_TCS3414 is not set
-# CONFIG_TCS3472 is not set
-# CONFIG_TEE is not set
-# CONFIG_TEGRA_AHB is not set
-# CONFIG_TEGRA_HOST1X is not set
-# CONFIG_TEHUTI is not set
-# CONFIG_TERANETICS_PHY is not set
-# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
-# CONFIG_TEST_BITFIELD is not set
-# CONFIG_TEST_BITMAP is not set
-# CONFIG_TEST_BLACKHOLE_DEV is not set
-# CONFIG_TEST_BPF is not set
-# CONFIG_TEST_FIRMWARE is not set
-# CONFIG_TEST_HASH is not set
-# CONFIG_TEST_HEXDUMP is not set
-# CONFIG_TEST_IDA is not set
-# CONFIG_TEST_KMOD is not set
-# CONFIG_TEST_KSTRTOX is not set
-# CONFIG_TEST_LIST_SORT is not set
-# CONFIG_TEST_LKM is not set
-# CONFIG_TEST_MEMCAT_P is not set
-# CONFIG_TEST_MEMINIT is not set
-# CONFIG_TEST_OVERFLOW is not set
-# CONFIG_TEST_POWER is not set
-# CONFIG_TEST_PRINTF is not set
-# CONFIG_TEST_RHASHTABLE is not set
-# CONFIG_TEST_SORT is not set
-# CONFIG_TEST_STACKINIT is not set
-# CONFIG_TEST_STATIC_KEYS is not set
-# CONFIG_TEST_STRING_HELPERS is not set
-# CONFIG_TEST_STRSCPY is not set
-# CONFIG_TEST_SYSCTL is not set
-# CONFIG_TEST_UBSAN is not set
-# CONFIG_TEST_UDELAY is not set
-# CONFIG_TEST_USER_COPY is not set
-# CONFIG_TEST_UUID is not set
-# CONFIG_TEST_VMALLOC is not set
-# CONFIG_TEST_XARRAY is not set
-CONFIG_TEXTSEARCH=y
-# CONFIG_TEXTSEARCH_BM is not set
-# CONFIG_TEXTSEARCH_FSM is not set
-# CONFIG_TEXTSEARCH_KMP is not set
-# CONFIG_THERMAL is not set
-# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
-# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set
-# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
-# CONFIG_THERMAL_EMULATION is not set
-# CONFIG_THERMAL_GOV_BANG_BANG is not set
-# CONFIG_THERMAL_GOV_FAIR_SHARE is not set
-# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
-# CONFIG_THERMAL_GOV_USER_SPACE is not set
-# CONFIG_THERMAL_HWMON is not set
-# CONFIG_THERMAL_MMIO is not set
-# CONFIG_THERMAL_STATISTICS is not set
-# CONFIG_THERMAL_WRITABLE_TRIPS is not set
-# CONFIG_THINKPAD_ACPI is not set
-CONFIG_THIN_ARCHIVES=y
-# CONFIG_THRUSTMASTER_FF is not set
-# CONFIG_THUMB2_KERNEL is not set
-# CONFIG_THUNDERBOLT is not set
-# CONFIG_THUNDER_NIC_BGX is not set
-# CONFIG_THUNDER_NIC_PF is not set
-# CONFIG_THUNDER_NIC_RGX is not set
-# CONFIG_THUNDER_NIC_VF is not set
-# CONFIG_TICK_CPU_ACCOUNTING is not set
-CONFIG_TICK_ONESHOT=y
-# CONFIG_TIFM_CORE is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_TIMB_DMA is not set
-CONFIG_TIMERFD=y
-# CONFIG_TIMER_STATS is not set
-# CONFIG_TINYDRM_HX8357D is not set
-# CONFIG_TINYDRM_ILI9225 is not set
-# CONFIG_TINYDRM_ILI9341 is not set
-# CONFIG_TINYDRM_MI0283QT is not set
-# CONFIG_TINYDRM_REPAPER is not set
-# CONFIG_TINYDRM_ST7586 is not set
-# CONFIG_TINYDRM_ST7735R is not set
-CONFIG_TINY_RCU=y
-# CONFIG_TIPC is not set
-# CONFIG_TI_ADC081C is not set
-# CONFIG_TI_ADC0832 is not set
-# CONFIG_TI_ADC084S021 is not set
-# CONFIG_TI_ADC108S102 is not set
-# CONFIG_TI_ADC12138 is not set
-# CONFIG_TI_ADC128S052 is not set
-# CONFIG_TI_ADC161S626 is not set
-# CONFIG_TI_ADS1015 is not set
-# CONFIG_TI_ADS124S08 is not set
-# CONFIG_TI_ADS7950 is not set
-# CONFIG_TI_ADS8344 is not set
-# CONFIG_TI_ADS8688 is not set
-# CONFIG_TI_AM335X_ADC is not set
-# CONFIG_TI_CPSW is not set
-# CONFIG_TI_CPSW_ALE is not set
-# CONFIG_TI_CPSW_PHY_SEL is not set
-# CONFIG_TI_CPTS is not set
-# CONFIG_TI_DAC082S085 is not set
-# CONFIG_TI_DAC5571 is not set
-# CONFIG_TI_DAC7311 is not set
-# CONFIG_TI_DAC7512 is not set
-# CONFIG_TI_DAC7612 is not set
-# CONFIG_TI_DAVINCI_CPDMA is not set
-# CONFIG_TI_DAVINCI_MDIO is not set
-# CONFIG_TI_ST is not set
-# CONFIG_TI_SYSCON_RESET is not set
-# CONFIG_TI_TLC4541 is not set
-# CONFIG_TLAN is not set
-# CONFIG_TLS is not set
-# CONFIG_TMD_HERMES is not set
-# CONFIG_TMP006 is not set
-# CONFIG_TMP007 is not set
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-CONFIG_TMPFS_XATTR=y
-# CONFIG_TOPSTAR_LAPTOP is not set
-# CONFIG_TORTURE_TEST is not set
-# CONFIG_TOSHIBA_HAPS is not set
-# CONFIG_TOUCHSCREEN_88PM860X is not set
-# CONFIG_TOUCHSCREEN_AD7877 is not set
-# CONFIG_TOUCHSCREEN_AD7879 is not set
-# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
-# CONFIG_TOUCHSCREEN_ADC is not set
-# CONFIG_TOUCHSCREEN_ADS7846 is not set
-# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
-# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
-# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set
-# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
-# CONFIG_TOUCHSCREEN_BU21013 is not set
-# CONFIG_TOUCHSCREEN_BU21029 is not set
-# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
-# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set
-# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set
-# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
-# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
-# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set
-# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set
-# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
-# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set
-# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set
-# CONFIG_TOUCHSCREEN_DA9034 is not set
-# CONFIG_TOUCHSCREEN_DA9052 is not set
-# CONFIG_TOUCHSCREEN_DYNAPRO is not set
-# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
-# CONFIG_TOUCHSCREEN_EETI is not set
-# CONFIG_TOUCHSCREEN_EGALAX is not set
-# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
-# CONFIG_TOUCHSCREEN_EKTF2127 is not set
-# CONFIG_TOUCHSCREEN_ELAN is not set
-# CONFIG_TOUCHSCREEN_ELO is not set
-# CONFIG_TOUCHSCREEN_EXC3000 is not set
-# CONFIG_TOUCHSCREEN_FUJITSU is not set
-# CONFIG_TOUCHSCREEN_GOODIX is not set
-# CONFIG_TOUCHSCREEN_GUNZE is not set
-# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
-# CONFIG_TOUCHSCREEN_HIDEEP is not set
-# CONFIG_TOUCHSCREEN_HP600 is not set
-# CONFIG_TOUCHSCREEN_HP7XX is not set
-# CONFIG_TOUCHSCREEN_HTCPEN is not set
-# CONFIG_TOUCHSCREEN_ILI210X is not set
-# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
-# CONFIG_TOUCHSCREEN_INEXIO is not set
-# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set
-# CONFIG_TOUCHSCREEN_IPROC is not set
-# CONFIG_TOUCHSCREEN_IQS5XX is not set
-# CONFIG_TOUCHSCREEN_LPC32XX is not set
-# CONFIG_TOUCHSCREEN_MAX11801 is not set
-# CONFIG_TOUCHSCREEN_MC13783 is not set
-# CONFIG_TOUCHSCREEN_MCS5000 is not set
-# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
-# CONFIG_TOUCHSCREEN_MIGOR is not set
-# CONFIG_TOUCHSCREEN_MK712 is not set
-# CONFIG_TOUCHSCREEN_MMS114 is not set
-# CONFIG_TOUCHSCREEN_MTOUCH is not set
-# CONFIG_TOUCHSCREEN_MX25 is not set
-# CONFIG_TOUCHSCREEN_MXS_LRADC is not set
-# CONFIG_TOUCHSCREEN_PCAP is not set
-# CONFIG_TOUCHSCREEN_PENMOUNT is not set
-# CONFIG_TOUCHSCREEN_PIXCIR is not set
-# CONFIG_TOUCHSCREEN_PROPERTIES is not set
-# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set
-# CONFIG_TOUCHSCREEN_RM_TS is not set
-# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
-# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set
-# CONFIG_TOUCHSCREEN_S3C2410 is not set
-# CONFIG_TOUCHSCREEN_S6SY761 is not set
-# CONFIG_TOUCHSCREEN_SILEAD is not set
-# CONFIG_TOUCHSCREEN_SIS_I2C is not set
-# CONFIG_TOUCHSCREEN_ST1232 is not set
-# CONFIG_TOUCHSCREEN_STMFTS is not set
-# CONFIG_TOUCHSCREEN_STMPE is not set
-# CONFIG_TOUCHSCREEN_SUN4I is not set
-# CONFIG_TOUCHSCREEN_SUR40 is not set
-# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
-# CONFIG_TOUCHSCREEN_SX8654 is not set
-# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set
-# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
-# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
-# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-# CONFIG_TOUCHSCREEN_TPS6507X is not set
-# CONFIG_TOUCHSCREEN_TS4800 is not set
-# CONFIG_TOUCHSCREEN_TSC2004 is not set
-# CONFIG_TOUCHSCREEN_TSC2005 is not set
-# CONFIG_TOUCHSCREEN_TSC2007 is not set
-# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set
-# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set
-# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
-# CONFIG_TOUCHSCREEN_UCB1400 is not set
-# CONFIG_TOUCHSCREEN_USB_3M is not set
-# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
-# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set
-# CONFIG_TOUCHSCREEN_USB_E2I is not set
-# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set
-# CONFIG_TOUCHSCREEN_USB_EGALAX is not set
-# CONFIG_TOUCHSCREEN_USB_ELO is not set
-# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set
-# CONFIG_TOUCHSCREEN_USB_ETURBO is not set
-# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set
-# CONFIG_TOUCHSCREEN_USB_GOTOP is not set
-# CONFIG_TOUCHSCREEN_USB_GUNZE is not set
-# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set
-# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set
-# CONFIG_TOUCHSCREEN_USB_ITM is not set
-# CONFIG_TOUCHSCREEN_USB_JASTEC is not set
-# CONFIG_TOUCHSCREEN_USB_NEXIO is not set
-# CONFIG_TOUCHSCREEN_USB_PANJIT is not set
-# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set
-# CONFIG_TOUCHSCREEN_W90X900 is not set
-# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
-# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
-# CONFIG_TOUCHSCREEN_WM831X is not set
-# CONFIG_TOUCHSCREEN_WM9705 is not set
-# CONFIG_TOUCHSCREEN_WM9712 is not set
-# CONFIG_TOUCHSCREEN_WM9713 is not set
-# CONFIG_TOUCHSCREEN_WM97XX is not set
-# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set
-# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set
-# CONFIG_TOUCHSCREEN_ZET6223 is not set
-# CONFIG_TOUCHSCREEN_ZFORCE is not set
-# CONFIG_TPL0102 is not set
-# CONFIG_TPS6105X is not set
-# CONFIG_TPS65010 is not set
-# CONFIG_TPS6507X is not set
-# CONFIG_TRACEPOINT_BENCHMARK is not set
-# CONFIG_TRACER_SNAPSHOT is not set
-# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
-# CONFIG_TRACE_BRANCH_PROFILING is not set
-# CONFIG_TRACE_EVAL_MAP_FILE is not set
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_TRACE_SINK is not set
-# CONFIG_TRACING_EVENTS_GPIO is not set
-CONFIG_TRACING_SUPPORT=y
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_TRANSPARENT_HUGEPAGE is not set
-# CONFIG_TREE_RCU is not set
-# CONFIG_TREE_RCU_TRACE is not set
-# CONFIG_TRIM_UNUSED_KSYMS is not set
-# CONFIG_TRUSTED_FOUNDATIONS is not set
-# CONFIG_TRUSTED_KEYS is not set
-# CONFIG_TSL2583 is not set
-# CONFIG_TSL2772 is not set
-# CONFIG_TSL2x7x is not set
-# CONFIG_TSL4531 is not set
-# CONFIG_TSYS01 is not set
-# CONFIG_TSYS02D is not set
-# CONFIG_TTPCI_EEPROM is not set
-CONFIG_TTY=y
-# CONFIG_TTY_PRINTK is not set
-# CONFIG_TUN is not set
-# CONFIG_TUN_VNET_CROSS_LE is not set
-# CONFIG_TWL4030_CORE is not set
-# CONFIG_TWL4030_MADC is not set
-# CONFIG_TWL6030_GPADC is not set
-# CONFIG_TWL6040_CORE is not set
-# CONFIG_TYPEC is not set
-# CONFIG_TYPEC_TCPM is not set
-# CONFIG_TYPEC_UCSI is not set
-# CONFIG_TYPHOON is not set
-# CONFIG_UACCESS_WITH_MEMCPY is not set
-# CONFIG_UBIFS_ATIME_SUPPORT is not set
-# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-# CONFIG_UBIFS_FS_AUTHENTICATION is not set
-# CONFIG_UBIFS_FS_ENCRYPTION is not set
-CONFIG_UBIFS_FS_LZO=y
-# CONFIG_UBIFS_FS_SECURITY is not set
-CONFIG_UBIFS_FS_XATTR=y
-CONFIG_UBIFS_FS_ZLIB=y
-CONFIG_UBIFS_FS_ZSTD=y
-# CONFIG_UBSAN is not set
-CONFIG_UBSAN_ALIGNMENT=y
-# CONFIG_UCB1400_CORE is not set
-# CONFIG_UCSI is not set
-# CONFIG_UDF_FS is not set
-# CONFIG_UDMABUF is not set
-CONFIG_UEVENT_HELPER=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-# CONFIG_UFS_FS is not set
-# CONFIG_UHID is not set
-CONFIG_UID16=y
-# CONFIG_UIO is not set
-# CONFIG_ULTRA is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_UNICODE is not set
-# CONFIG_UNISYSSPAR is not set
-# CONFIG_UNISYS_VISORBUS is not set
-CONFIG_UNIX=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_UNIX_DIAG is not set
-CONFIG_UNIX_SCM=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_UNWINDER_FRAME_POINTER is not set
-# CONFIG_UPROBES is not set
-# CONFIG_UPROBE_EVENTS is not set
-# CONFIG_US5182D is not set
-# CONFIG_USB is not set
-# CONFIG_USBIP_CORE is not set
-CONFIG_USBIP_VHCI_HC_PORTS=8
-CONFIG_USBIP_VHCI_NR_HCS=1
-# CONFIG_USBIP_VUDC is not set
-# CONFIG_USBPCWATCHDOG is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_ALI_M5632=y
-# CONFIG_USB_AMD5536UDC is not set
-CONFIG_USB_AN2720=y
-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_ATM is not set
-CONFIG_USB_AUTOSUSPEND_DELAY=2
-# CONFIG_USB_BDC_UDC is not set
-CONFIG_USB_BELKIN=y
-# CONFIG_USB_C67X00_HCD is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CDC_COMPOSITE is not set
-# CONFIG_USB_CDNS3 is not set
-# CONFIG_USB_CHAOSKEY is not set
-# CONFIG_USB_CHIPIDEA is not set
-# CONFIG_USB_CONFIGFS is not set
-# CONFIG_USB_CONN_GPIO is not set
-# CONFIG_USB_CXACRU is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-CONFIG_USB_DEFAULT_PERSIST=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_DUMMY_HCD is not set
-# CONFIG_USB_DWC2 is not set
-# CONFIG_USB_DWC2_DEBUG is not set
-# CONFIG_USB_DWC2_DUAL_ROLE is not set
-# CONFIG_USB_DWC2_HOST is not set
-# CONFIG_USB_DWC2_PERIPHERAL is not set
-# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
-# CONFIG_USB_DWC3 is not set
-# CONFIG_USB_DWC3_EXYNOS is not set
-# CONFIG_USB_DWC3_HAPS is not set
-# CONFIG_USB_DWC3_KEYSTONE is not set
-# CONFIG_USB_DWC3_OF_SIMPLE is not set
-# CONFIG_USB_DWC3_PCI is not set
-# CONFIG_USB_DWC3_QCOM is not set
-# CONFIG_USB_DWC3_ULPI is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_EG20T is not set
-# CONFIG_USB_EHCI_ATH79 is not set
-# CONFIG_USB_EHCI_FSL is not set
-# CONFIG_USB_EHCI_HCD is not set
-# CONFIG_USB_EHCI_HCD_AT91 is not set
-# CONFIG_USB_EHCI_HCD_OMAP is not set
-# CONFIG_USB_EHCI_HCD_PPC_OF is not set
-# CONFIG_USB_EHCI_MSM is not set
-# CONFIG_USB_EHCI_MV is not set
-CONFIG_USB_EHCI_ROOT_HUB_TT=y
-CONFIG_USB_EHCI_TT_NEWSCHED=y
-# CONFIG_USB_EHSET_TEST_FIXTURE is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EPSON2888 is not set
-# CONFIG_USB_EZUSB_FX2 is not set
-# CONFIG_USB_FOTG210_HCD is not set
-# CONFIG_USB_FOTG210_UDC is not set
-# CONFIG_USB_FSL_USB2 is not set
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_FUNCTIONFS is not set
-# CONFIG_USB_FUSB300 is not set
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GADGETFS is not set
-# CONFIG_USB_GADGET_DEBUG is not set
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-# CONFIG_USB_GADGET_DEBUG_FS is not set
-CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
-CONFIG_USB_GADGET_VBUS_DRAW=2
-# CONFIG_USB_GADGET_XILINX is not set
-# CONFIG_USB_GL860 is not set
-# CONFIG_USB_GOKU is not set
-# CONFIG_USB_GPIO_VBUS is not set
-# CONFIG_USB_GR_UDC is not set
-# CONFIG_USB_GSPCA is not set
-# CONFIG_USB_GSPCA_BENQ is not set
-# CONFIG_USB_GSPCA_CONEX is not set
-# CONFIG_USB_GSPCA_CPIA1 is not set
-# CONFIG_USB_GSPCA_DTCS033 is not set
-# CONFIG_USB_GSPCA_ETOMS is not set
-# CONFIG_USB_GSPCA_FINEPIX is not set
-# CONFIG_USB_GSPCA_JEILINJ is not set
-# CONFIG_USB_GSPCA_JL2005BCD is not set
-# CONFIG_USB_GSPCA_KINECT is not set
-# CONFIG_USB_GSPCA_KONICA is not set
-# CONFIG_USB_GSPCA_MARS is not set
-# CONFIG_USB_GSPCA_MR97310A is not set
-# CONFIG_USB_GSPCA_NW80X is not set
-# CONFIG_USB_GSPCA_OV519 is not set
-# CONFIG_USB_GSPCA_OV534 is not set
-# CONFIG_USB_GSPCA_OV534_9 is not set
-# CONFIG_USB_GSPCA_PAC207 is not set
-# CONFIG_USB_GSPCA_PAC7302 is not set
-# CONFIG_USB_GSPCA_PAC7311 is not set
-# CONFIG_USB_GSPCA_SE401 is not set
-# CONFIG_USB_GSPCA_SN9C2028 is not set
-# CONFIG_USB_GSPCA_SN9C20X is not set
-# CONFIG_USB_GSPCA_SONIXB is not set
-# CONFIG_USB_GSPCA_SONIXJ is not set
-# CONFIG_USB_GSPCA_SPCA1528 is not set
-# CONFIG_USB_GSPCA_SPCA500 is not set
-# CONFIG_USB_GSPCA_SPCA501 is not set
-# CONFIG_USB_GSPCA_SPCA505 is not set
-# CONFIG_USB_GSPCA_SPCA506 is not set
-# CONFIG_USB_GSPCA_SPCA508 is not set
-# CONFIG_USB_GSPCA_SPCA561 is not set
-# CONFIG_USB_GSPCA_SQ905 is not set
-# CONFIG_USB_GSPCA_SQ905C is not set
-# CONFIG_USB_GSPCA_SQ930X is not set
-# CONFIG_USB_GSPCA_STK014 is not set
-# CONFIG_USB_GSPCA_STK1135 is not set
-# CONFIG_USB_GSPCA_STV0680 is not set
-# CONFIG_USB_GSPCA_SUNPLUS is not set
-# CONFIG_USB_GSPCA_T613 is not set
-# CONFIG_USB_GSPCA_TOPRO is not set
-# CONFIG_USB_GSPCA_TOUPTEK is not set
-# CONFIG_USB_GSPCA_TV8532 is not set
-# CONFIG_USB_GSPCA_VC032X is not set
-# CONFIG_USB_GSPCA_VICAM is not set
-# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
-# CONFIG_USB_GSPCA_ZC3XX is not set
-# CONFIG_USB_G_ACM_MS is not set
-# CONFIG_USB_G_DBGP is not set
-# CONFIG_USB_G_HID is not set
-# CONFIG_USB_G_MULTI is not set
-# CONFIG_USB_G_NCM is not set
-# CONFIG_USB_G_NOKIA is not set
-# CONFIG_USB_G_PRINTER is not set
-# CONFIG_USB_G_SERIAL is not set
-# CONFIG_USB_G_WEBCAM is not set
-# CONFIG_USB_HCD_TEST_MODE is not set
-# CONFIG_USB_HID is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_HSIC_USB3503 is not set
-# CONFIG_USB_HSIC_USB4604 is not set
-# CONFIG_USB_HSO is not set
-# CONFIG_USB_HUB_USB251XB is not set
-# CONFIG_USB_HWA_HCD is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_IMX21_HCD is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_IPHETH is not set
-# CONFIG_USB_ISIGHTFW is not set
-# CONFIG_USB_ISP116X_HCD is not set
-# CONFIG_USB_ISP1301 is not set
-# CONFIG_USB_ISP1362_HCD is not set
-# CONFIG_USB_ISP1760 is not set
-# CONFIG_USB_ISP1760_HCD is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_KC2190 is not set
-# CONFIG_USB_LAN78XX is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set
-# CONFIG_USB_LED_TRIG is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LINK_LAYER_TEST is not set
-# CONFIG_USB_M5602 is not set
-# CONFIG_USB_M66592 is not set
-# CONFIG_USB_MASS_STORAGE is not set
-# CONFIG_USB_MAX3421_HCD is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_MIDI_GADGET is not set
-# CONFIG_USB_MON is not set
-# CONFIG_USB_MOUSE is not set
-# CONFIG_USB_MSM_OTG is not set
-# CONFIG_USB_MTU3 is not set
-# CONFIG_USB_MUSB_HDRC is not set
-# CONFIG_USB_MV_U3D is not set
-# CONFIG_USB_MV_UDC is not set
-# CONFIG_USB_MXS_PHY is not set
-# CONFIG_USB_NET2272 is not set
-# CONFIG_USB_NET2280 is not set
-# CONFIG_USB_NET_AQC111 is not set
-# CONFIG_USB_NET_AX88179_178A is not set
-# CONFIG_USB_NET_AX8817X is not set
-# CONFIG_USB_NET_CDCETHER is not set
-# CONFIG_USB_NET_CDC_EEM is not set
-# CONFIG_USB_NET_CDC_MBIM is not set
-# CONFIG_USB_NET_CDC_NCM is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_CH9200 is not set
-# CONFIG_USB_NET_CX82310_ETH is not set
-# CONFIG_USB_NET_DM9601 is not set
-# CONFIG_USB_NET_DRIVERS is not set
-# CONFIG_USB_NET_GL620A is not set
-# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
-# CONFIG_USB_NET_INT51X1 is not set
-# CONFIG_USB_NET_KALMIA is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_NET1080 is not set
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_QMI_WWAN is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_USB_NET_SMSC75XX is not set
-# CONFIG_USB_NET_SMSC95XX is not set
-# CONFIG_USB_NET_SR9700 is not set
-# CONFIG_USB_NET_SR9800 is not set
-# CONFIG_USB_NET_ZAURUS is not set
-# CONFIG_USB_OHCI_HCD is not set
-# CONFIG_USB_OHCI_HCD_PCI is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set
-# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-# CONFIG_USB_OHCI_HCD_SSB is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-# CONFIG_USB_OTG_FSM is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OXU210HP_HCD is not set
-# CONFIG_USB_PCI is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_PHY is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_PWC_INPUT_EVDEV is not set
-# CONFIG_USB_PXA27X is not set
-# CONFIG_USB_R8A66597 is not set
-# CONFIG_USB_R8A66597_HCD is not set
-# CONFIG_USB_RCAR_PHY is not set
-# CONFIG_USB_RENESAS_USBHS is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_ROLES_INTEL_XHCI is not set
-# CONFIG_USB_ROLE_SWITCH is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_RTL8152 is not set
-# CONFIG_USB_S2255 is not set
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_AIRCABLE is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_CH341 is not set
-# CONFIG_USB_SERIAL_CP210X is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_F81232 is not set
-# CONFIG_USB_SERIAL_F8153X is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_GARMIN is not set
-CONFIG_USB_SERIAL_GENERIC=y
-# CONFIG_USB_SERIAL_IPAQ is not set
-# CONFIG_USB_SERIAL_IPW is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL_IUU is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-CONFIG_USB_SERIAL_KEYSPAN_MPR=y
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
-CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
-CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
-# CONFIG_USB_SERIAL_KLSI is not set
-# CONFIG_USB_SERIAL_KOBIL_SCT is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_METRO is not set
-# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_MXUPORT is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_OPTICON is not set
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OTI6858 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_QCAUX is not set
-# CONFIG_USB_SERIAL_QT2 is not set
-# CONFIG_USB_SERIAL_QUALCOMM is not set
-# CONFIG_USB_SERIAL_SAFE is not set
-CONFIG_USB_SERIAL_SAFE_PADDED=y
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-# CONFIG_USB_SERIAL_SIMPLE is not set
-# CONFIG_USB_SERIAL_SPCP8X5 is not set
-# CONFIG_USB_SERIAL_SSU100 is not set
-# CONFIG_USB_SERIAL_SYMBOL is not set
-# CONFIG_USB_SERIAL_TI is not set
-# CONFIG_USB_SERIAL_UPD78F0730 is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_WISHBONE is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SERIAL_XSENS_MT is not set
-# CONFIG_USB_SEVSEG is not set
-# CONFIG_USB_SIERRA_NET is not set
-# CONFIG_USB_SISUSBVGA is not set
-# CONFIG_USB_SL811_HCD is not set
-# CONFIG_USB_SNP_UDC_PLAT is not set
-# CONFIG_USB_SPEEDTOUCH is not set
-# CONFIG_USB_STKWEBCAM is not set
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_ENE_UB6250 is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_STORAGE_ONETOUCH is not set
-# CONFIG_USB_STORAGE_REALTEK is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STV06XX is not set
-# CONFIG_USB_SUPPORT is not set
-# CONFIG_USB_SWITCH_FSA9480 is not set
-# CONFIG_USB_TEST is not set
-# CONFIG_USB_TMC is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_UAS is not set
-# CONFIG_USB_UEAGLEATM is not set
-# CONFIG_USB_ULPI is not set
-# CONFIG_USB_ULPI_BUS is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USS720 is not set
-# CONFIG_USB_VIDEO_CLASS is not set
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-# CONFIG_USB_VL600 is not set
-# CONFIG_USB_WDM is not set
-# CONFIG_USB_WHCI_HCD is not set
-# CONFIG_USB_WUSB is not set
-# CONFIG_USB_WUSB_CBAF is not set
-# CONFIG_USB_XHCI_DBGCAP is not set
-# CONFIG_USB_XHCI_HCD is not set
-# CONFIG_USB_XHCI_MVEBU is not set
-# CONFIG_USB_XUSBATM is not set
-# CONFIG_USB_YUREX is not set
-# CONFIG_USB_ZD1201 is not set
-# CONFIG_USB_ZERO is not set
-# CONFIG_USB_ZR364XX is not set
-# CONFIG_USELIB is not set
-# CONFIG_USERFAULTFD is not set
-# CONFIG_USERIO is not set
-# CONFIG_USE_OF is not set
-# CONFIG_UTS_NS is not set
-# CONFIG_UWB is not set
-# CONFIG_U_SERIAL_CONSOLE is not set
-# CONFIG_V4L_MEM2MEM_DRIVERS is not set
-# CONFIG_V4L_TEST_DRIVERS is not set
-# CONFIG_VALIDATE_FS_PARSER is not set
-# CONFIG_VBOXGUEST is not set
-# CONFIG_VCNL4000 is not set
-# CONFIG_VCNL4035 is not set
-CONFIG_VDSO=y
-# CONFIG_VEML6070 is not set
-# CONFIG_VETH is not set
-# CONFIG_VEXPRESS_CONFIG is not set
-# CONFIG_VF610_ADC is not set
-# CONFIG_VF610_DAC is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_VFIO is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VGA_ARB is not set
-# CONFIG_VGA_SWITCHEROO is not set
-# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
-# CONFIG_VHOST_NET is not set
-# CONFIG_VHOST_VSOCK is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_VIDEO_ADV7170 is not set
-# CONFIG_VIDEO_ADV7175 is not set
-# CONFIG_VIDEO_ADV7180 is not set
-# CONFIG_VIDEO_ADV7183 is not set
-# CONFIG_VIDEO_ADV7343 is not set
-# CONFIG_VIDEO_ADV7393 is not set
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# CONFIG_VIDEO_AK881X is not set
-# CONFIG_VIDEO_ASPEED is not set
-# CONFIG_VIDEO_ATMEL_ISC is not set
-# CONFIG_VIDEO_ATMEL_ISI is not set
-# CONFIG_VIDEO_BT819 is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_BT856 is not set
-# CONFIG_VIDEO_BT866 is not set
-# CONFIG_VIDEO_CADENCE is not set
-# CONFIG_VIDEO_CAFE_CCIC is not set
-# CONFIG_VIDEO_CS3308 is not set
-# CONFIG_VIDEO_CS5345 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_CX231XX is not set
-# CONFIG_VIDEO_CX2341X is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_VIDEO_DM6446_CCDC is not set
-# CONFIG_VIDEO_DT3155 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-# CONFIG_VIDEO_GO7007 is not set
-# CONFIG_VIDEO_HDPVR is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_I2C is not set
-# CONFIG_VIDEO_IR_I2C is not set
-# CONFIG_VIDEO_IVTV is not set
-# CONFIG_VIDEO_KS0127 is not set
-# CONFIG_VIDEO_M52790 is not set
-# CONFIG_VIDEO_ML86V7667 is not set
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_MT9M111 is not set
-# CONFIG_VIDEO_MT9T112 is not set
-# CONFIG_VIDEO_MT9V011 is not set
-# CONFIG_VIDEO_MT9V111 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_NOON010PC30 is not set
-# CONFIG_VIDEO_OMAP2_VOUT is not set
-# CONFIG_VIDEO_OV2640 is not set
-# CONFIG_VIDEO_OV2659 is not set
-# CONFIG_VIDEO_OV5695 is not set
-# CONFIG_VIDEO_OV6650 is not set
-# CONFIG_VIDEO_OV7640 is not set
-# CONFIG_VIDEO_OV7670 is not set
-# CONFIG_VIDEO_OV772X is not set
-# CONFIG_VIDEO_OV7740 is not set
-# CONFIG_VIDEO_OV9640 is not set
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_RJ54N1 is not set
-# CONFIG_VIDEO_SAA6588 is not set
-# CONFIG_VIDEO_SAA6752HS is not set
-# CONFIG_VIDEO_SAA7110 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_SAA717X is not set
-# CONFIG_VIDEO_SAA7185 is not set
-# CONFIG_VIDEO_SH_MOBILE_CEU is not set
-# CONFIG_VIDEO_SONY_BTF_MPX is not set
-# CONFIG_VIDEO_SR030PC30 is not set
-# CONFIG_VIDEO_TDA7432 is not set
-# CONFIG_VIDEO_TDA9840 is not set
-# CONFIG_VIDEO_TEA6415C is not set
-# CONFIG_VIDEO_TEA6420 is not set
-# CONFIG_VIDEO_THS7303 is not set
-# CONFIG_VIDEO_THS8200 is not set
-# CONFIG_VIDEO_TIMBERDALE is not set
-# CONFIG_VIDEO_TLV320AIC23B is not set
-# CONFIG_VIDEO_TM6000 is not set
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TVP514X is not set
-# CONFIG_VIDEO_TVP5150 is not set
-# CONFIG_VIDEO_TVP7002 is not set
-# CONFIG_VIDEO_TW2804 is not set
-# CONFIG_VIDEO_TW9903 is not set
-# CONFIG_VIDEO_TW9906 is not set
-# CONFIG_VIDEO_TW9910 is not set
-# CONFIG_VIDEO_UDA1342 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-# CONFIG_VIDEO_USBTV is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_VIDEO_V4L2 is not set
-# CONFIG_VIDEO_VP27SMPX is not set
-# CONFIG_VIDEO_VPX3220 is not set
-# CONFIG_VIDEO_VS6624 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIRTIO_BALLOON is not set
-# CONFIG_VIRTIO_BLK_SCSI is not set
-# CONFIG_VIRTIO_FS is not set
-# CONFIG_VIRTIO_INPUT is not set
-CONFIG_VIRTIO_MENU=y
-# CONFIG_VIRTIO_MMIO is not set
-# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
-# CONFIG_VIRTIO_PCI is not set
-# CONFIG_VIRTUALIZATION is not set
-# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
-# CONFIG_VIRT_DRIVERS is not set
-CONFIG_VIRT_TO_BUS=y
-# CONFIG_VITESSE_PHY is not set
-# CONFIG_VL53L0X_I2C is not set
-# CONFIG_VL6180 is not set
-CONFIG_VLAN_8021Q=y
-# CONFIG_VLAN_8021Q_GVRP is not set
-# CONFIG_VLAN_8021Q_MVRP is not set
-# CONFIG_VME_BUS is not set
-# CONFIG_VMSPLIT_1G is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_2G_OPT is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_3G_OPT is not set
-# CONFIG_VMWARE_PVSCSI is not set
-# CONFIG_VMXNET3 is not set
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_VOP_BUS is not set
-# CONFIG_VORTEX is not set
-# CONFIG_VSOCKETS is not set
-# CONFIG_VSOCKETS_DIAG is not set
-# CONFIG_VT is not set
-# CONFIG_VT6655 is not set
-# CONFIG_VT6656 is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_VXGE is not set
-# CONFIG_VXLAN is not set
-# CONFIG_VZ89X is not set
-# CONFIG_W1 is not set
-# CONFIG_W1_CON is not set
-# CONFIG_W1_MASTER_DS1WM is not set
-# CONFIG_W1_MASTER_DS2482 is not set
-# CONFIG_W1_MASTER_DS2490 is not set
-# CONFIG_W1_MASTER_GPIO is not set
-# CONFIG_W1_MASTER_MATROX is not set
-# CONFIG_W1_MASTER_SGI is not set
-# CONFIG_W1_SLAVE_DS2405 is not set
-# CONFIG_W1_SLAVE_DS2406 is not set
-# CONFIG_W1_SLAVE_DS2408 is not set
-# CONFIG_W1_SLAVE_DS2413 is not set
-# CONFIG_W1_SLAVE_DS2423 is not set
-# CONFIG_W1_SLAVE_DS2431 is not set
-# CONFIG_W1_SLAVE_DS2433 is not set
-# CONFIG_W1_SLAVE_DS2438 is not set
-# CONFIG_W1_SLAVE_DS250X is not set
-# CONFIG_W1_SLAVE_DS2780 is not set
-# CONFIG_W1_SLAVE_DS2781 is not set
-# CONFIG_W1_SLAVE_DS2805 is not set
-# CONFIG_W1_SLAVE_DS28E04 is not set
-# CONFIG_W1_SLAVE_DS28E17 is not set
-# CONFIG_W1_SLAVE_SMEM is not set
-# CONFIG_W1_SLAVE_THERM is not set
-# CONFIG_W83627HF_WDT is not set
-# CONFIG_W83877F_WDT is not set
-# CONFIG_W83977F_WDT is not set
-# CONFIG_WAN is not set
-# CONFIG_WANXL is not set
-# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_CORE is not set
-CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_WATCHDOG_OPEN_TIMEOUT=0
-# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
-# CONFIG_WATCHDOG_SYSFS is not set
-# CONFIG_WD80x3 is not set
-# CONFIG_WDAT_WDT is not set
-# CONFIG_WDTPCI is not set
-CONFIG_WEXT_CORE=y
-CONFIG_WEXT_PRIV=y
-CONFIG_WEXT_PROC=y
-CONFIG_WEXT_SPY=y
-CONFIG_WILINK_PLATFORM_DATA=y
-# CONFIG_WIMAX is not set
-# CONFIG_WIREGUARD is not set
-CONFIG_WIRELESS=y
-CONFIG_WIRELESS_EXT=y
-# CONFIG_WIRELESS_WDS is not set
-# CONFIG_WIZNET_W5100 is not set
-# CONFIG_WIZNET_W5300 is not set
-# CONFIG_WL1251 is not set
-# CONFIG_WL12XX is not set
-# CONFIG_WL18XX is not set
-CONFIG_WLAN=y
-# CONFIG_WLAN_VENDOR_ADMTEK is not set
-# CONFIG_WLAN_VENDOR_ATH is not set
-# CONFIG_WLAN_VENDOR_ATMEL is not set
-# CONFIG_WLAN_VENDOR_BROADCOM is not set
-# CONFIG_WLAN_VENDOR_CISCO is not set
-# CONFIG_WLAN_VENDOR_INTEL is not set
-# CONFIG_WLAN_VENDOR_INTERSIL is not set
-# CONFIG_WLAN_VENDOR_MARVELL is not set
-# CONFIG_WLAN_VENDOR_MEDIATEK is not set
-# CONFIG_WLAN_VENDOR_QUANTENNA is not set
-# CONFIG_WLAN_VENDOR_RALINK is not set
-# CONFIG_WLAN_VENDOR_REALTEK is not set
-# CONFIG_WLAN_VENDOR_RSI is not set
-# CONFIG_WLAN_VENDOR_ST is not set
-# CONFIG_WLAN_VENDOR_TI is not set
-# CONFIG_WLAN_VENDOR_ZYDAS is not set
-# CONFIG_WLCORE is not set
-CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
-# CONFIG_WQ_WATCHDOG is not set
-# CONFIG_WW_MUTEX_SELFTEST is not set
-# CONFIG_X25 is not set
-# CONFIG_X509_CERTIFICATE_PARSER is not set
-# CONFIG_X86_PKG_TEMP_THERMAL is not set
-CONFIG_X86_SYSFB=y
-# CONFIG_XDP_SOCKETS is not set
-# CONFIG_XEN is not set
-# CONFIG_XEN_GRANT_DMA_ALLOC is not set
-# CONFIG_XEN_PVCALLS_FRONTEND is not set
-CONFIG_XEN_SCRUB_PAGES_DEFAULT=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_INTERFACE is not set
-# CONFIG_XFRM_IPCOMP is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_USER is not set
-# CONFIG_XFS_DEBUG is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_XFS_ONLINE_SCRUB is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_RT is not set
-# CONFIG_XFS_WARN is not set
-# CONFIG_XILINX_AXI_EMAC is not set
-# CONFIG_XILINX_DMA is not set
-# CONFIG_XILINX_EMACLITE is not set
-# CONFIG_XILINX_GMII2RGMII is not set
-# CONFIG_XILINX_LL_TEMAC is not set
-# CONFIG_XILINX_SDFEC is not set
-# CONFIG_XILINX_VCU is not set
-# CONFIG_XILINX_WATCHDOG is not set
-# CONFIG_XILINX_XADC is not set
-# CONFIG_XILINX_ZYNQMP_DMA is not set
-# CONFIG_XILLYBUS is not set
-# CONFIG_XIL_AXIS_FIFO is not set
-# CONFIG_XIP_KERNEL is not set
-# CONFIG_XMON is not set
-CONFIG_XZ_DEC=y
-# CONFIG_XZ_DEC_ARM is not set
-# CONFIG_XZ_DEC_ARMTHUMB is not set
-# CONFIG_XZ_DEC_BCJ is not set
-# CONFIG_XZ_DEC_IA64 is not set
-# CONFIG_XZ_DEC_POWERPC is not set
-# CONFIG_XZ_DEC_SPARC is not set
-# CONFIG_XZ_DEC_TEST is not set
-# CONFIG_XZ_DEC_X86 is not set
-# CONFIG_YAM is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_YENTA is not set
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-# CONFIG_YENTA_TI is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_ZBUD is not set
-# CONFIG_ZD1211RW is not set
-# CONFIG_ZD1211RW_DEBUG is not set
-# CONFIG_ZEROPLUS_FF is not set
-# CONFIG_ZIIRAVE_WATCHDOG is not set
-# CONFIG_ZISOFS is not set
-# CONFIG_ZLIB_DEFLATE is not set
-# CONFIG_ZLIB_INFLATE is not set
-CONFIG_ZONE_DMA=y
-# CONFIG_ZOPT2201 is not set
-# CONFIG_ZPA2326 is not set
-# CONFIG_ZPOOL is not set
-# CONFIG_ZRAM is not set
-# CONFIG_ZRAM_MEMORY_TRACKING is not set
-# CONFIG_ZSMALLOC is not set
-# CONFIG_ZX_TDM is not set
diff --git a/target/linux/generic/hack-5.4/204-module_strip.patch b/target/linux/generic/hack-5.4/204-module_strip.patch
deleted file mode 100644
index d6e25f319b..0000000000
--- a/target/linux/generic/hack-5.4/204-module_strip.patch
+++ /dev/null
@@ -1,220 +0,0 @@
-From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 16:56:48 +0200
-Subject: build: add a hack for removing non-essential module info
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/module.h | 13 ++++++++-----
- include/linux/moduleparam.h | 15 ++++++++++++---
- init/Kconfig | 7 +++++++
- kernel/module.c | 5 ++++-
- scripts/mod/modpost.c | 12 ++++++++++++
- 5 files changed, 43 insertions(+), 9 deletions(-)
-
---- a/include/linux/module.h
-+++ b/include/linux/module.h
-@@ -157,6 +157,7 @@ extern void cleanup_module(void);
-
- /* Generic info of form tag = "info" */
- #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
-+#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info)
-
- /* For userspace: you can also call me... */
- #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
-@@ -216,12 +217,12 @@ extern void cleanup_module(void);
- * Author(s), use "Name <email>" or just "Name", for multiple
- * authors use multiple MODULE_AUTHOR() statements/lines.
- */
--#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
-+#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author)
-
- /* What your module does. */
--#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
-+#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description)
-
--#ifdef MODULE
-+#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED)
- /* Creates an alias so file2alias.c can find device table. */
- #define MODULE_DEVICE_TABLE(type, name) \
- extern typeof(name) __mod_##type##__##name##_device_table \
-@@ -248,7 +249,9 @@ extern typeof(name) __mod_##type##__##na
- */
-
- #if defined(MODULE) || !defined(CONFIG_SYSFS)
--#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
-+#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version)
-+#elif defined(CONFIG_MODULE_STRIPPED)
-+#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)
- #else
- #define MODULE_VERSION(_version) \
- MODULE_INFO(version, _version); \
-@@ -271,7 +274,7 @@ extern typeof(name) __mod_##type##__##na
- /* Optional firmware file (or files) needed by the module
- * format is simply firmware file name. Multiple firmware
- * files require multiple MODULE_FIRMWARE() specifiers */
--#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
-+#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)
-
- #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, #ns)
-
---- a/include/linux/moduleparam.h
-+++ b/include/linux/moduleparam.h
-@@ -20,10 +20,24 @@
- /* Chosen so that structs with an unsigned long line up. */
- #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
-
-+/* This struct is here for syntactic coherency, it is not used */
-+#define __MODULE_INFO_DISABLED(name) \
-+ struct __UNIQUE_ID(name) {}
-+
-+#ifdef CONFIG_MODULE_STRIPPED
-+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name)
-+#else
-+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)
-+#endif
-+
-+#ifdef MODULE
- #define __MODULE_INFO(tag, name, info) \
- static const char __UNIQUE_ID(name)[] \
- __used __attribute__((section(".modinfo"), unused, aligned(1))) \
- = __MODULE_INFO_PREFIX __stringify(tag) "=" info
-+#else
-+#define __MODULE_INFO(tag, name, info) __MODULE_INFO_DISABLED(name)
-+#endif
-
- #define __MODULE_PARM_TYPE(name, _type) \
- __MODULE_INFO(parmtype, name##type, #name ":" _type)
-@@ -31,7 +45,7 @@ static const char __UNIQUE_ID(name)[]
- /* One for each parameter, describing how to use it. Some files do
- multiple of these per line, so can't just use MODULE_INFO. */
- #define MODULE_PARM_DESC(_parm, desc) \
-- __MODULE_INFO(parm, _parm, #_parm ":" desc)
-+ __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc)
-
- struct kernel_param;
-
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -2198,6 +2198,13 @@ config TRIM_UNUSED_KSYMS
-
- If unsure, or if you need to build out-of-tree modules, say N.
-
-+config MODULE_STRIPPED
-+ bool "Reduce module size"
-+ depends on MODULES
-+ help
-+ Remove module parameter descriptions, author info, version, aliases,
-+ device tables, etc.
-+
- endif # MODULES
-
- config MODULES_TREE_LOOKUP
---- a/kernel/module.c
-+++ b/kernel/module.c
-@@ -1281,6 +1281,7 @@ static struct module_attribute *modinfo_
-
- static const char vermagic[] = VERMAGIC_STRING;
-
-+#if defined(CONFIG_MODVERSIONS) || !defined(CONFIG_MODULE_STRIPPED)
- static int try_to_force_load(struct module *mod, const char *reason)
- {
- #ifdef CONFIG_MODULE_FORCE_LOAD
-@@ -1292,6 +1293,7 @@ static int try_to_force_load(struct modu
- return -ENOEXEC;
- #endif
- }
-+#endif
-
- #ifdef CONFIG_MODVERSIONS
-
-@@ -3256,9 +3258,11 @@ static int setup_load_info(struct load_i
-
- static int check_modinfo(struct module *mod, struct load_info *info, int flags)
- {
-- const char *modmagic = get_modinfo(info, "vermagic");
- int err;
-
-+#ifndef CONFIG_MODULE_STRIPPED
-+ const char *modmagic = get_modinfo(info, "vermagic");
-+
- if (flags & MODULE_INIT_IGNORE_VERMAGIC)
- modmagic = NULL;
-
-@@ -3279,6 +3283,7 @@ static int check_modinfo(struct module *
- mod->name);
- add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
- }
-+#endif
-
- check_modinfo_retpoline(mod, info);
-
---- a/scripts/mod/modpost.c
-+++ b/scripts/mod/modpost.c
-@@ -2056,7 +2056,9 @@ static void read_symbols(const char *mod
- symname = remove_dot(info.strtab + sym->st_name);
-
- handle_modversions(mod, &info, sym, symname);
-+#ifndef CONFIG_MODULE_STRIPPED
- handle_moddevtable(mod, &info, sym, symname);
-+#endif
- }
-
- /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */
-@@ -2270,8 +2272,10 @@ static void add_header(struct buffer *b,
- buf_printf(b, "\n");
- buf_printf(b, "BUILD_SALT;\n");
- buf_printf(b, "\n");
-+#ifndef CONFIG_MODULE_STRIPPED
- buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
- buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
-+#endif
- buf_printf(b, "\n");
- buf_printf(b, "__visible struct module __this_module\n");
- buf_printf(b, "__section(.gnu.linkonce.this_module) = {\n");
-@@ -2288,8 +2292,10 @@ static void add_header(struct buffer *b,
-
- static void add_intree_flag(struct buffer *b, int is_intree)
- {
-+#ifndef CONFIG_MODULE_STRIPPED
- if (is_intree)
- buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
-+#endif
- }
-
- /* Cannot check for assembler */
-@@ -2302,8 +2308,10 @@ static void add_retpoline(struct buffer
-
- static void add_staging_flag(struct buffer *b, const char *name)
- {
-+#ifndef CONFIG_MODULE_STRIPPED
- if (strstarts(name, "drivers/staging"))
- buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
-+#endif
- }
-
- /**
-@@ -2387,11 +2395,13 @@ static void add_depends(struct buffer *b
-
- static void add_srcversion(struct buffer *b, struct module *mod)
- {
-+#ifndef CONFIG_MODULE_STRIPPED
- if (mod->srcversion[0]) {
- buf_printf(b, "\n");
- buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
- mod->srcversion);
- }
-+#endif
- }
-
- static void write_if_changed(struct buffer *b, const char *fname)
-@@ -2661,7 +2671,9 @@ int main(int argc, char **argv)
- add_staging_flag(&buf, mod->name);
- err |= add_versions(&buf, mod);
- add_depends(&buf, mod);
-+#ifndef CONFIG_MODULE_STRIPPED
- add_moddevtable(&buf, mod);
-+#endif
- add_srcversion(&buf, mod);
-
- sprintf(fname, "%s.mod.c", mod->name);
diff --git a/target/linux/generic/hack-5.4/205-kconfig-exit.patch b/target/linux/generic/hack-5.4/205-kconfig-exit.patch
deleted file mode 100644
index 8931ad3270..0000000000
--- a/target/linux/generic/hack-5.4/205-kconfig-exit.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/scripts/kconfig/conf.c
-+++ b/scripts/kconfig/conf.c
-@@ -212,6 +212,8 @@ static int conf_sym(struct menu *menu)
- break;
- continue;
- case 0:
-+ if (!sym_has_value(sym) && !tty_stdio && getenv("FAIL_ON_UNCONFIGURED"))
-+ exit(1);
- newval = oldval;
- break;
- case '?':
diff --git a/target/linux/generic/hack-5.4/210-darwin_scripts_include.patch b/target/linux/generic/hack-5.4/210-darwin_scripts_include.patch
deleted file mode 100644
index be6adc0d11..0000000000
--- a/target/linux/generic/hack-5.4/210-darwin_scripts_include.patch
+++ /dev/null
@@ -1,3053 +0,0 @@
-From db7c30dcd9a0391bf13b62c9f91e144d762ef43a Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Fri, 7 Jul 2017 17:00:49 +0200
-Subject: Add an OSX specific patch to make the kernel be compiled
-
-lede-commit: 3fc2a24f0422b2f55f9ed43f116db3111f700526
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
----
- scripts/kconfig/Makefile | 3 +
- scripts/mod/elf.h | 3007 ++++++++++++++++++++++++++++++++++++++++++++
- scripts/mod/mk_elfconfig.c | 4 +
- scripts/mod/modpost.h | 4 +
- 4 files changed, 3018 insertions(+)
- create mode 100644 scripts/mod/elf.h
-
---- /dev/null
-+++ b/scripts/mod/elf.h
-@@ -0,0 +1,3007 @@
-+/* This file defines standard ELF types, structures, and macros.
-+ Copyright (C) 1995-2012 Free Software Foundation, Inc.
-+ This file is part of the GNU C Library.
-+
-+ The GNU C Library is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU Lesser General Public
-+ License as published by the Free Software Foundation; either
-+ version 2.1 of the License, or (at your option) any later version.
-+
-+ The GNU C Library is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ Lesser General Public License for more details.
-+
-+ You should have received a copy of the GNU Lesser General Public
-+ License along with the GNU C Library; if not, see
-+ <http://www.gnu.org/licenses/>. */
-+
-+#ifndef _ELF_H
-+#define _ELF_H 1
-+
-+/* Standard ELF types. */
-+
-+#include <stdint.h>
-+
-+/* Type for a 16-bit quantity. */
-+typedef uint16_t Elf32_Half;
-+typedef uint16_t Elf64_Half;
-+
-+/* Types for signed and unsigned 32-bit quantities. */
-+typedef uint32_t Elf32_Word;
-+typedef int32_t Elf32_Sword;
-+typedef uint32_t Elf64_Word;
-+typedef int32_t Elf64_Sword;
-+
-+/* Types for signed and unsigned 64-bit quantities. */
-+typedef uint64_t Elf32_Xword;
-+typedef int64_t Elf32_Sxword;
-+typedef uint64_t Elf64_Xword;
-+typedef int64_t Elf64_Sxword;
-+
-+/* Type of addresses. */
-+typedef uint32_t Elf32_Addr;
-+typedef uint64_t Elf64_Addr;
-+
-+/* Type of file offsets. */
-+typedef uint32_t Elf32_Off;
-+typedef uint64_t Elf64_Off;
-+
-+/* Type for section indices, which are 16-bit quantities. */
-+typedef uint16_t Elf32_Section;
-+typedef uint16_t Elf64_Section;
-+
-+/* Type for version symbol information. */
-+typedef Elf32_Half Elf32_Versym;
-+typedef Elf64_Half Elf64_Versym;
-+
-+
-+/* The ELF file header. This appears at the start of every ELF file. */
-+
-+#define EI_NIDENT (16)
-+
-+typedef struct
-+{
-+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
-+ Elf32_Half e_type; /* Object file type */
-+ Elf32_Half e_machine; /* Architecture */
-+ Elf32_Word e_version; /* Object file version */
-+ Elf32_Addr e_entry; /* Entry point virtual address */
-+ Elf32_Off e_phoff; /* Program header table file offset */
-+ Elf32_Off e_shoff; /* Section header table file offset */
-+ Elf32_Word e_flags; /* Processor-specific flags */
-+ Elf32_Half e_ehsize; /* ELF header size in bytes */
-+ Elf32_Half e_phentsize; /* Program header table entry size */
-+ Elf32_Half e_phnum; /* Program header table entry count */
-+ Elf32_Half e_shentsize; /* Section header table entry size */
-+ Elf32_Half e_shnum; /* Section header table entry count */
-+ Elf32_Half e_shstrndx; /* Section header string table index */
-+} Elf32_Ehdr;
-+
-+typedef struct
-+{
-+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */
-+ Elf64_Half e_type; /* Object file type */
-+ Elf64_Half e_machine; /* Architecture */
-+ Elf64_Word e_version; /* Object file version */
-+ Elf64_Addr e_entry; /* Entry point virtual address */
-+ Elf64_Off e_phoff; /* Program header table file offset */
-+ Elf64_Off e_shoff; /* Section header table file offset */
-+ Elf64_Word e_flags; /* Processor-specific flags */
-+ Elf64_Half e_ehsize; /* ELF header size in bytes */
-+ Elf64_Half e_phentsize; /* Program header table entry size */
-+ Elf64_Half e_phnum; /* Program header table entry count */
-+ Elf64_Half e_shentsize; /* Section header table entry size */
-+ Elf64_Half e_shnum; /* Section header table entry count */
-+ Elf64_Half e_shstrndx; /* Section header string table index */
-+} Elf64_Ehdr;
-+
-+/* Fields in the e_ident array. The EI_* macros are indices into the
-+ array. The macros under each EI_* macro are the values the byte
-+ may have. */
-+
-+#define EI_MAG0 0 /* File identification byte 0 index */
-+#define ELFMAG0 0x7f /* Magic number byte 0 */
-+
-+#define EI_MAG1 1 /* File identification byte 1 index */
-+#define ELFMAG1 'E' /* Magic number byte 1 */
-+
-+#define EI_MAG2 2 /* File identification byte 2 index */
-+#define ELFMAG2 'L' /* Magic number byte 2 */
-+
-+#define EI_MAG3 3 /* File identification byte 3 index */
-+#define ELFMAG3 'F' /* Magic number byte 3 */
-+
-+/* Conglomeration of the identification bytes, for easy testing as a word. */
-+#define ELFMAG "\177ELF"
-+#define SELFMAG 4
-+
-+#define EI_CLASS 4 /* File class byte index */
-+#define ELFCLASSNONE 0 /* Invalid class */
-+#define ELFCLASS32 1 /* 32-bit objects */
-+#define ELFCLASS64 2 /* 64-bit objects */
-+#define ELFCLASSNUM 3
-+
-+#define EI_DATA 5 /* Data encoding byte index */
-+#define ELFDATANONE 0 /* Invalid data encoding */
-+#define ELFDATA2LSB 1 /* 2's complement, little endian */
-+#define ELFDATA2MSB 2 /* 2's complement, big endian */
-+#define ELFDATANUM 3
-+
-+#define EI_VERSION 6 /* File version byte index */
-+ /* Value must be EV_CURRENT */
-+
-+#define EI_OSABI 7 /* OS ABI identification */
-+#define ELFOSABI_NONE 0 /* UNIX System V ABI */
-+#define ELFOSABI_SYSV 0 /* Alias. */
-+#define ELFOSABI_HPUX 1 /* HP-UX */
-+#define ELFOSABI_NETBSD 2 /* NetBSD. */
-+#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */
-+#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */
-+#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */
-+#define ELFOSABI_AIX 7 /* IBM AIX. */
-+#define ELFOSABI_IRIX 8 /* SGI Irix. */
-+#define ELFOSABI_FREEBSD 9 /* FreeBSD. */
-+#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */
-+#define ELFOSABI_MODESTO 11 /* Novell Modesto. */
-+#define ELFOSABI_OPENBSD 12 /* OpenBSD. */
-+#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */
-+#define ELFOSABI_ARM 97 /* ARM */
-+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
-+
-+#define EI_ABIVERSION 8 /* ABI version */
-+
-+#define EI_PAD 9 /* Byte index of padding bytes */
-+
-+/* Legal values for e_type (object file type). */
-+
-+#define ET_NONE 0 /* No file type */
-+#define ET_REL 1 /* Relocatable file */
-+#define ET_EXEC 2 /* Executable file */
-+#define ET_DYN 3 /* Shared object file */
-+#define ET_CORE 4 /* Core file */
-+#define ET_NUM 5 /* Number of defined types */
-+#define ET_LOOS 0xfe00 /* OS-specific range start */
-+#define ET_HIOS 0xfeff /* OS-specific range end */
-+#define ET_LOPROC 0xff00 /* Processor-specific range start */
-+#define ET_HIPROC 0xffff /* Processor-specific range end */
-+
-+/* Legal values for e_machine (architecture). */
-+
-+#define EM_NONE 0 /* No machine */
-+#define EM_M32 1 /* AT&T WE 32100 */
-+#define EM_SPARC 2 /* SUN SPARC */
-+#define EM_386 3 /* Intel 80386 */
-+#define EM_68K 4 /* Motorola m68k family */
-+#define EM_88K 5 /* Motorola m88k family */
-+#define EM_860 7 /* Intel 80860 */
-+#define EM_MIPS 8 /* MIPS R3000 big-endian */
-+#define EM_S370 9 /* IBM System/370 */
-+#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */
-+
-+#define EM_PARISC 15 /* HPPA */
-+#define EM_VPP500 17 /* Fujitsu VPP500 */
-+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
-+#define EM_960 19 /* Intel 80960 */
-+#define EM_PPC 20 /* PowerPC */
-+#define EM_PPC64 21 /* PowerPC 64-bit */
-+#define EM_S390 22 /* IBM S390 */
-+
-+#define EM_V800 36 /* NEC V800 series */
-+#define EM_FR20 37 /* Fujitsu FR20 */
-+#define EM_RH32 38 /* TRW RH-32 */
-+#define EM_RCE 39 /* Motorola RCE */
-+#define EM_ARM 40 /* ARM */
-+#define EM_FAKE_ALPHA 41 /* Digital Alpha */
-+#define EM_SH 42 /* Hitachi SH */
-+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
-+#define EM_TRICORE 44 /* Siemens Tricore */
-+#define EM_ARC 45 /* Argonaut RISC Core */
-+#define EM_H8_300 46 /* Hitachi H8/300 */
-+#define EM_H8_300H 47 /* Hitachi H8/300H */
-+#define EM_H8S 48 /* Hitachi H8S */
-+#define EM_H8_500 49 /* Hitachi H8/500 */
-+#define EM_IA_64 50 /* Intel Merced */
-+#define EM_MIPS_X 51 /* Stanford MIPS-X */
-+#define EM_COLDFIRE 52 /* Motorola Coldfire */
-+#define EM_68HC12 53 /* Motorola M68HC12 */
-+#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/
-+#define EM_PCP 55 /* Siemens PCP */
-+#define EM_NCPU 56 /* Sony nCPU embeeded RISC */
-+#define EM_NDR1 57 /* Denso NDR1 microprocessor */
-+#define EM_STARCORE 58 /* Motorola Start*Core processor */
-+#define EM_ME16 59 /* Toyota ME16 processor */
-+#define EM_ST100 60 /* STMicroelectronic ST100 processor */
-+#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/
-+#define EM_X86_64 62 /* AMD x86-64 architecture */
-+#define EM_PDSP 63 /* Sony DSP Processor */
-+
-+#define EM_FX66 66 /* Siemens FX66 microcontroller */
-+#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */
-+#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */
-+#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */
-+#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */
-+#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */
-+#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */
-+#define EM_SVX 73 /* Silicon Graphics SVx */
-+#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */
-+#define EM_VAX 75 /* Digital VAX */
-+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
-+#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */
-+#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */
-+#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */
-+#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */
-+#define EM_HUANY 81 /* Harvard University machine-independent object files */
-+#define EM_PRISM 82 /* SiTera Prism */
-+#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */
-+#define EM_FR30 84 /* Fujitsu FR30 */
-+#define EM_D10V 85 /* Mitsubishi D10V */
-+#define EM_D30V 86 /* Mitsubishi D30V */
-+#define EM_V850 87 /* NEC v850 */
-+#define EM_M32R 88 /* Mitsubishi M32R */
-+#define EM_MN10300 89 /* Matsushita MN10300 */
-+#define EM_MN10200 90 /* Matsushita MN10200 */
-+#define EM_PJ 91 /* picoJava */
-+#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
-+#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
-+#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
-+#define EM_TILEPRO 188 /* Tilera TILEPro */
-+#define EM_TILEGX 191 /* Tilera TILE-Gx */
-+#define EM_NUM 192
-+
-+/* If it is necessary to assign new unofficial EM_* values, please
-+ pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
-+ chances of collision with official or non-GNU unofficial values. */
-+
-+#define EM_ALPHA 0x9026
-+
-+/* Legal values for e_version (version). */
-+
-+#define EV_NONE 0 /* Invalid ELF version */
-+#define EV_CURRENT 1 /* Current version */
-+#define EV_NUM 2
-+
-+/* Section header. */
-+
-+typedef struct
-+{
-+ Elf32_Word sh_name; /* Section name (string tbl index) */
-+ Elf32_Word sh_type; /* Section type */
-+ Elf32_Word sh_flags; /* Section flags */
-+ Elf32_Addr sh_addr; /* Section virtual addr at execution */
-+ Elf32_Off sh_offset; /* Section file offset */
-+ Elf32_Word sh_size; /* Section size in bytes */
-+ Elf32_Word sh_link; /* Link to another section */
-+ Elf32_Word sh_info; /* Additional section information */
-+ Elf32_Word sh_addralign; /* Section alignment */
-+ Elf32_Word sh_entsize; /* Entry size if section holds table */
-+} Elf32_Shdr;
-+
-+typedef struct
-+{
-+ Elf64_Word sh_name; /* Section name (string tbl index) */
-+ Elf64_Word sh_type; /* Section type */
-+ Elf64_Xword sh_flags; /* Section flags */
-+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
-+ Elf64_Off sh_offset; /* Section file offset */
-+ Elf64_Xword sh_size; /* Section size in bytes */
-+ Elf64_Word sh_link; /* Link to another section */
-+ Elf64_Word sh_info; /* Additional section information */
-+ Elf64_Xword sh_addralign; /* Section alignment */
-+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
-+} Elf64_Shdr;
-+
-+/* Special section indices. */
-+
-+#define SHN_UNDEF 0 /* Undefined section */
-+#define SHN_LORESERVE 0xff00 /* Start of reserved indices */
-+#define SHN_LOPROC 0xff00 /* Start of processor-specific */
-+#define SHN_BEFORE 0xff00 /* Order section before all others
-+ (Solaris). */
-+#define SHN_AFTER 0xff01 /* Order section after all others
-+ (Solaris). */
-+#define SHN_HIPROC 0xff1f /* End of processor-specific */
-+#define SHN_LOOS 0xff20 /* Start of OS-specific */
-+#define SHN_HIOS 0xff3f /* End of OS-specific */
-+#define SHN_ABS 0xfff1 /* Associated symbol is absolute */
-+#define SHN_COMMON 0xfff2 /* Associated symbol is common */
-+#define SHN_XINDEX 0xffff /* Index is in extra table. */
-+#define SHN_HIRESERVE 0xffff /* End of reserved indices */
-+
-+/* Legal values for sh_type (section type). */
-+
-+#define SHT_NULL 0 /* Section header table entry unused */
-+#define SHT_PROGBITS 1 /* Program data */
-+#define SHT_SYMTAB 2 /* Symbol table */
-+#define SHT_STRTAB 3 /* String table */
-+#define SHT_RELA 4 /* Relocation entries with addends */
-+#define SHT_HASH 5 /* Symbol hash table */
-+#define SHT_DYNAMIC 6 /* Dynamic linking information */
-+#define SHT_NOTE 7 /* Notes */
-+#define SHT_NOBITS 8 /* Program space with no data (bss) */
-+#define SHT_REL 9 /* Relocation entries, no addends */
-+#define SHT_SHLIB 10 /* Reserved */
-+#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
-+#define SHT_INIT_ARRAY 14 /* Array of constructors */
-+#define SHT_FINI_ARRAY 15 /* Array of destructors */
-+#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
-+#define SHT_GROUP 17 /* Section group */
-+#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
-+#define SHT_NUM 19 /* Number of defined types. */
-+#define SHT_LOOS 0x60000000 /* Start OS-specific. */
-+#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
-+#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
-+#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
-+#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */
-+#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
-+#define SHT_SUNW_move 0x6ffffffa
-+#define SHT_SUNW_COMDAT 0x6ffffffb
-+#define SHT_SUNW_syminfo 0x6ffffffc
-+#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
-+#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
-+#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
-+#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
-+#define SHT_HIOS 0x6fffffff /* End OS-specific type */
-+#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
-+#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
-+#define SHT_LOUSER 0x80000000 /* Start of application-specific */
-+#define SHT_HIUSER 0x8fffffff /* End of application-specific */
-+
-+/* Legal values for sh_flags (section flags). */
-+
-+#define SHF_WRITE (1 << 0) /* Writable */
-+#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */
-+#define SHF_EXECINSTR (1 << 2) /* Executable */
-+#define SHF_MERGE (1 << 4) /* Might be merged */
-+#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */
-+#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */
-+#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */
-+#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling
-+ required */
-+#define SHF_GROUP (1 << 9) /* Section is member of a group. */
-+#define SHF_TLS (1 << 10) /* Section hold thread-local data. */
-+#define SHF_MASKOS 0x0ff00000 /* OS-specific. */
-+#define SHF_MASKPROC 0xf0000000 /* Processor-specific */
-+#define SHF_ORDERED (1 << 30) /* Special ordering requirement
-+ (Solaris). */
-+#define SHF_EXCLUDE (1 << 31) /* Section is excluded unless
-+ referenced or allocated (Solaris).*/
-+
-+/* Section group handling. */
-+#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */
-+
-+/* Symbol table entry. */
-+
-+typedef struct
-+{
-+ Elf32_Word st_name; /* Symbol name (string tbl index) */
-+ Elf32_Addr st_value; /* Symbol value */
-+ Elf32_Word st_size; /* Symbol size */
-+ unsigned char st_info; /* Symbol type and binding */
-+ unsigned char st_other; /* Symbol visibility */
-+ Elf32_Section st_shndx; /* Section index */
-+} Elf32_Sym;
-+
-+typedef struct
-+{
-+ Elf64_Word st_name; /* Symbol name (string tbl index) */
-+ unsigned char st_info; /* Symbol type and binding */
-+ unsigned char st_other; /* Symbol visibility */
-+ Elf64_Section st_shndx; /* Section index */
-+ Elf64_Addr st_value; /* Symbol value */
-+ Elf64_Xword st_size; /* Symbol size */
-+} Elf64_Sym;
-+
-+/* The syminfo section if available contains additional information about
-+ every dynamic symbol. */
-+
-+typedef struct
-+{
-+ Elf32_Half si_boundto; /* Direct bindings, symbol bound to */
-+ Elf32_Half si_flags; /* Per symbol flags */
-+} Elf32_Syminfo;
-+
-+typedef struct
-+{
-+ Elf64_Half si_boundto; /* Direct bindings, symbol bound to */
-+ Elf64_Half si_flags; /* Per symbol flags */
-+} Elf64_Syminfo;
-+
-+/* Possible values for si_boundto. */
-+#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */
-+#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */
-+#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */
-+
-+/* Possible bitmasks for si_flags. */
-+#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */
-+#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */
-+#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */
-+#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy
-+ loaded */
-+/* Syminfo version values. */
-+#define SYMINFO_NONE 0
-+#define SYMINFO_CURRENT 1
-+#define SYMINFO_NUM 2
-+
-+
-+/* How to extract and insert information held in the st_info field. */
-+
-+#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4)
-+#define ELF32_ST_TYPE(val) ((val) & 0xf)
-+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
-+
-+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */
-+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val)
-+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val)
-+#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type))
-+
-+/* Legal values for ST_BIND subfield of st_info (symbol binding). */
-+
-+#define STB_LOCAL 0 /* Local symbol */
-+#define STB_GLOBAL 1 /* Global symbol */
-+#define STB_WEAK 2 /* Weak symbol */
-+#define STB_NUM 3 /* Number of defined types. */
-+#define STB_LOOS 10 /* Start of OS-specific */
-+#define STB_GNU_UNIQUE 10 /* Unique symbol. */
-+#define STB_HIOS 12 /* End of OS-specific */
-+#define STB_LOPROC 13 /* Start of processor-specific */
-+#define STB_HIPROC 15 /* End of processor-specific */
-+
-+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-+
-+#define STT_NOTYPE 0 /* Symbol type is unspecified */
-+#define STT_OBJECT 1 /* Symbol is a data object */
-+#define STT_FUNC 2 /* Symbol is a code object */
-+#define STT_SECTION 3 /* Symbol associated with a section */
-+#define STT_FILE 4 /* Symbol's name is file name */
-+#define STT_COMMON 5 /* Symbol is a common data object */
-+#define STT_TLS 6 /* Symbol is thread-local data object*/
-+#define STT_NUM 7 /* Number of defined types. */
-+#define STT_LOOS 10 /* Start of OS-specific */
-+#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */
-+#define STT_HIOS 12 /* End of OS-specific */
-+#define STT_LOPROC 13 /* Start of processor-specific */
-+#define STT_HIPROC 15 /* End of processor-specific */
-+
-+
-+/* Symbol table indices are found in the hash buckets and chain table
-+ of a symbol hash table section. This special index value indicates
-+ the end of a chain, meaning no further symbols are found in that bucket. */
-+
-+#define STN_UNDEF 0 /* End of a chain. */
-+
-+
-+/* How to extract and insert information held in the st_other field. */
-+
-+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03)
-+
-+/* For ELF64 the definitions are the same. */
-+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o)
-+
-+/* Symbol visibility specification encoded in the st_other field. */
-+#define STV_DEFAULT 0 /* Default symbol visibility rules */
-+#define STV_INTERNAL 1 /* Processor specific hidden class */
-+#define STV_HIDDEN 2 /* Sym unavailable in other modules */
-+#define STV_PROTECTED 3 /* Not preemptible, not exported */
-+
-+
-+/* Relocation table entry without addend (in section of type SHT_REL). */
-+
-+typedef struct
-+{
-+ Elf32_Addr r_offset; /* Address */
-+ Elf32_Word r_info; /* Relocation type and symbol index */
-+} Elf32_Rel;
-+
-+/* I have seen two different definitions of the Elf64_Rel and
-+ Elf64_Rela structures, so we'll leave them out until Novell (or
-+ whoever) gets their act together. */
-+/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */
-+
-+typedef struct
-+{
-+ Elf64_Addr r_offset; /* Address */
-+ Elf64_Xword r_info; /* Relocation type and symbol index */
-+} Elf64_Rel;
-+
-+/* Relocation table entry with addend (in section of type SHT_RELA). */
-+
-+typedef struct
-+{
-+ Elf32_Addr r_offset; /* Address */
-+ Elf32_Word r_info; /* Relocation type and symbol index */
-+ Elf32_Sword r_addend; /* Addend */
-+} Elf32_Rela;
-+
-+typedef struct
-+{
-+ Elf64_Addr r_offset; /* Address */
-+ Elf64_Xword r_info; /* Relocation type and symbol index */
-+ Elf64_Sxword r_addend; /* Addend */
-+} Elf64_Rela;
-+
-+/* How to extract and insert information held in the r_info field. */
-+
-+#define ELF32_R_SYM(val) ((val) >> 8)
-+#define ELF32_R_TYPE(val) ((val) & 0xff)
-+#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff))
-+
-+#define ELF64_R_SYM(i) ((i) >> 32)
-+#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
-+#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type))
-+
-+/* Program segment header. */
-+
-+typedef struct
-+{
-+ Elf32_Word p_type; /* Segment type */
-+ Elf32_Off p_offset; /* Segment file offset */
-+ Elf32_Addr p_vaddr; /* Segment virtual address */
-+ Elf32_Addr p_paddr; /* Segment physical address */
-+ Elf32_Word p_filesz; /* Segment size in file */
-+ Elf32_Word p_memsz; /* Segment size in memory */
-+ Elf32_Word p_flags; /* Segment flags */
-+ Elf32_Word p_align; /* Segment alignment */
-+} Elf32_Phdr;
-+
-+typedef struct
-+{
-+ Elf64_Word p_type; /* Segment type */
-+ Elf64_Word p_flags; /* Segment flags */
-+ Elf64_Off p_offset; /* Segment file offset */
-+ Elf64_Addr p_vaddr; /* Segment virtual address */
-+ Elf64_Addr p_paddr; /* Segment physical address */
-+ Elf64_Xword p_filesz; /* Segment size in file */
-+ Elf64_Xword p_memsz; /* Segment size in memory */
-+ Elf64_Xword p_align; /* Segment alignment */
-+} Elf64_Phdr;
-+
-+/* Special value for e_phnum. This indicates that the real number of
-+ program headers is too large to fit into e_phnum. Instead the real
-+ value is in the field sh_info of section 0. */
-+
-+#define PN_XNUM 0xffff
-+
-+/* Legal values for p_type (segment type). */
-+
-+#define PT_NULL 0 /* Program header table entry unused */
-+#define PT_LOAD 1 /* Loadable program segment */
-+#define PT_DYNAMIC 2 /* Dynamic linking information */
-+#define PT_INTERP 3 /* Program interpreter */
-+#define PT_NOTE 4 /* Auxiliary information */
-+#define PT_SHLIB 5 /* Reserved */
-+#define PT_PHDR 6 /* Entry for header table itself */
-+#define PT_TLS 7 /* Thread-local storage segment */
-+#define PT_NUM 8 /* Number of defined types */
-+#define PT_LOOS 0x60000000 /* Start of OS-specific */
-+#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */
-+#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */
-+#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */
-+#define PT_LOSUNW 0x6ffffffa
-+#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */
-+#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */
-+#define PT_HISUNW 0x6fffffff
-+#define PT_HIOS 0x6fffffff /* End of OS-specific */
-+#define PT_LOPROC 0x70000000 /* Start of processor-specific */
-+#define PT_HIPROC 0x7fffffff /* End of processor-specific */
-+
-+/* Legal values for p_flags (segment flags). */
-+
-+#define PF_X (1 << 0) /* Segment is executable */
-+#define PF_W (1 << 1) /* Segment is writable */
-+#define PF_R (1 << 2) /* Segment is readable */
-+#define PF_MASKOS 0x0ff00000 /* OS-specific */
-+#define PF_MASKPROC 0xf0000000 /* Processor-specific */
-+
-+/* Legal values for note segment descriptor types for core files. */
-+
-+#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */
-+#define NT_FPREGSET 2 /* Contains copy of fpregset struct */
-+#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */
-+#define NT_PRXREG 4 /* Contains copy of prxregset struct */
-+#define NT_TASKSTRUCT 4 /* Contains copy of task structure */
-+#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */
-+#define NT_AUXV 6 /* Contains copy of auxv array */
-+#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */
-+#define NT_ASRS 8 /* Contains copy of asrset struct */
-+#define NT_PSTATUS 10 /* Contains copy of pstatus struct */
-+#define NT_PSINFO 13 /* Contains copy of psinfo struct */
-+#define NT_PRCRED 14 /* Contains copy of prcred struct */
-+#define NT_UTSNAME 15 /* Contains copy of utsname struct */
-+#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */
-+#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */
-+#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */
-+#define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */
-+#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */
-+#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */
-+#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
-+#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */
-+#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */
-+#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */
-+
-+/* Legal values for the note segment descriptor types for object files. */
-+
-+#define NT_VERSION 1 /* Contains a version string. */
-+
-+
-+/* Dynamic section entry. */
-+
-+typedef struct
-+{
-+ Elf32_Sword d_tag; /* Dynamic entry type */
-+ union
-+ {
-+ Elf32_Word d_val; /* Integer value */
-+ Elf32_Addr d_ptr; /* Address value */
-+ } d_un;
-+} Elf32_Dyn;
-+
-+typedef struct
-+{
-+ Elf64_Sxword d_tag; /* Dynamic entry type */
-+ union
-+ {
-+ Elf64_Xword d_val; /* Integer value */
-+ Elf64_Addr d_ptr; /* Address value */
-+ } d_un;
-+} Elf64_Dyn;
-+
-+/* Legal values for d_tag (dynamic entry type). */
-+
-+#define DT_NULL 0 /* Marks end of dynamic section */
-+#define DT_NEEDED 1 /* Name of needed library */
-+#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
-+#define DT_PLTGOT 3 /* Processor defined value */
-+#define DT_HASH 4 /* Address of symbol hash table */
-+#define DT_STRTAB 5 /* Address of string table */
-+#define DT_SYMTAB 6 /* Address of symbol table */
-+#define DT_RELA 7 /* Address of Rela relocs */
-+#define DT_RELASZ 8 /* Total size of Rela relocs */
-+#define DT_RELAENT 9 /* Size of one Rela reloc */
-+#define DT_STRSZ 10 /* Size of string table */
-+#define DT_SYMENT 11 /* Size of one symbol table entry */
-+#define DT_INIT 12 /* Address of init function */
-+#define DT_FINI 13 /* Address of termination function */
-+#define DT_SONAME 14 /* Name of shared object */
-+#define DT_RPATH 15 /* Library search path (deprecated) */
-+#define DT_SYMBOLIC 16 /* Start symbol search here */
-+#define DT_REL 17 /* Address of Rel relocs */
-+#define DT_RELSZ 18 /* Total size of Rel relocs */
-+#define DT_RELENT 19 /* Size of one Rel reloc */
-+#define DT_PLTREL 20 /* Type of reloc in PLT */
-+#define DT_DEBUG 21 /* For debugging; unspecified */
-+#define DT_TEXTREL 22 /* Reloc might modify .text */
-+#define DT_JMPREL 23 /* Address of PLT relocs */
-+#define DT_BIND_NOW 24 /* Process relocations of object */
-+#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
-+#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
-+#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
-+#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
-+#define DT_RUNPATH 29 /* Library search path */
-+#define DT_FLAGS 30 /* Flags for the object being loaded */
-+#define DT_ENCODING 32 /* Start of encoded range */
-+#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
-+#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
-+#define DT_NUM 34 /* Number used */
-+#define DT_LOOS 0x6000000d /* Start of OS-specific */
-+#define DT_HIOS 0x6ffff000 /* End of OS-specific */
-+#define DT_LOPROC 0x70000000 /* Start of processor-specific */
-+#define DT_HIPROC 0x7fffffff /* End of processor-specific */
-+#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */
-+
-+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
-+ Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's
-+ approach. */
-+#define DT_VALRNGLO 0x6ffffd00
-+#define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */
-+#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */
-+#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */
-+#define DT_CHECKSUM 0x6ffffdf8
-+#define DT_PLTPADSZ 0x6ffffdf9
-+#define DT_MOVEENT 0x6ffffdfa
-+#define DT_MOVESZ 0x6ffffdfb
-+#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */
-+#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting
-+ the following DT_* entry. */
-+#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */
-+#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */
-+#define DT_VALRNGHI 0x6ffffdff
-+#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */
-+#define DT_VALNUM 12
-+
-+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
-+ Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
-+
-+ If any adjustment is made to the ELF object after it has been
-+ built these entries will need to be adjusted. */
-+#define DT_ADDRRNGLO 0x6ffffe00
-+#define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table. */
-+#define DT_TLSDESC_PLT 0x6ffffef6
-+#define DT_TLSDESC_GOT 0x6ffffef7
-+#define DT_GNU_CONFLICT 0x6ffffef8 /* Start of conflict section */
-+#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list */
-+#define DT_CONFIG 0x6ffffefa /* Configuration information. */
-+#define DT_DEPAUDIT 0x6ffffefb /* Dependency auditing. */
-+#define DT_AUDIT 0x6ffffefc /* Object auditing. */
-+#define DT_PLTPAD 0x6ffffefd /* PLT padding. */
-+#define DT_MOVETAB 0x6ffffefe /* Move table. */
-+#define DT_SYMINFO 0x6ffffeff /* Syminfo table. */
-+#define DT_ADDRRNGHI 0x6ffffeff
-+#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) /* Reverse order! */
-+#define DT_ADDRNUM 11
-+
-+/* The versioning entry types. The next are defined as part of the
-+ GNU extension. */
-+#define DT_VERSYM 0x6ffffff0
-+
-+#define DT_RELACOUNT 0x6ffffff9
-+#define DT_RELCOUNT 0x6ffffffa
-+
-+/* These were chosen by Sun. */
-+#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */
-+#define DT_VERDEF 0x6ffffffc /* Address of version definition
-+ table */
-+#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */
-+#define DT_VERNEED 0x6ffffffe /* Address of table with needed
-+ versions */
-+#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */
-+#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
-+#define DT_VERSIONTAGNUM 16
-+
-+/* Sun added these machine-independent extensions in the "processor-specific"
-+ range. Be compatible. */
-+#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */
-+#define DT_FILTER 0x7fffffff /* Shared object to get values from */
-+#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
-+#define DT_EXTRANUM 3
-+
-+/* Values of `d_un.d_val' in the DT_FLAGS entry. */
-+#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */
-+#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */
-+#define DF_TEXTREL 0x00000004 /* Object contains text relocations */
-+#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */
-+#define DF_STATIC_TLS 0x00000010 /* Module uses the static TLS model */
-+
-+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
-+ entry in the dynamic section. */
-+#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
-+#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
-+#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */
-+#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
-+#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/
-+#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/
-+#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */
-+#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */
-+#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */
-+#define DF_1_TRANS 0x00000200
-+#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */
-+#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */
-+#define DF_1_NODUMP 0x00001000 /* Object can't be dldump'ed. */
-+#define DF_1_CONFALT 0x00002000 /* Configuration alternative created.*/
-+#define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */
-+#define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */
-+#define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */
-+
-+/* Flags for the feature selection in DT_FEATURE_1. */
-+#define DTF_1_PARINIT 0x00000001
-+#define DTF_1_CONFEXP 0x00000002
-+
-+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */
-+#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */
-+#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not
-+ generally available. */
-+
-+/* Version definition sections. */
-+
-+typedef struct
-+{
-+ Elf32_Half vd_version; /* Version revision */
-+ Elf32_Half vd_flags; /* Version information */
-+ Elf32_Half vd_ndx; /* Version Index */
-+ Elf32_Half vd_cnt; /* Number of associated aux entries */
-+ Elf32_Word vd_hash; /* Version name hash value */
-+ Elf32_Word vd_aux; /* Offset in bytes to verdaux array */
-+ Elf32_Word vd_next; /* Offset in bytes to next verdef
-+ entry */
-+} Elf32_Verdef;
-+
-+typedef struct
-+{
-+ Elf64_Half vd_version; /* Version revision */
-+ Elf64_Half vd_flags; /* Version information */
-+ Elf64_Half vd_ndx; /* Version Index */
-+ Elf64_Half vd_cnt; /* Number of associated aux entries */
-+ Elf64_Word vd_hash; /* Version name hash value */
-+ Elf64_Word vd_aux; /* Offset in bytes to verdaux array */
-+ Elf64_Word vd_next; /* Offset in bytes to next verdef
-+ entry */
-+} Elf64_Verdef;
-+
-+
-+/* Legal values for vd_version (version revision). */
-+#define VER_DEF_NONE 0 /* No version */
-+#define VER_DEF_CURRENT 1 /* Current version */
-+#define VER_DEF_NUM 2 /* Given version number */
-+
-+/* Legal values for vd_flags (version information flags). */
-+#define VER_FLG_BASE 0x1 /* Version definition of file itself */
-+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
-+
-+/* Versym symbol index values. */
-+#define VER_NDX_LOCAL 0 /* Symbol is local. */
-+#define VER_NDX_GLOBAL 1 /* Symbol is global. */
-+#define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */
-+#define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */
-+
-+/* Auxialiary version information. */
-+
-+typedef struct
-+{
-+ Elf32_Word vda_name; /* Version or dependency names */
-+ Elf32_Word vda_next; /* Offset in bytes to next verdaux
-+ entry */
-+} Elf32_Verdaux;
-+
-+typedef struct
-+{
-+ Elf64_Word vda_name; /* Version or dependency names */
-+ Elf64_Word vda_next; /* Offset in bytes to next verdaux
-+ entry */
-+} Elf64_Verdaux;
-+
-+
-+/* Version dependency section. */
-+
-+typedef struct
-+{
-+ Elf32_Half vn_version; /* Version of structure */
-+ Elf32_Half vn_cnt; /* Number of associated aux entries */
-+ Elf32_Word vn_file; /* Offset of filename for this
-+ dependency */
-+ Elf32_Word vn_aux; /* Offset in bytes to vernaux array */
-+ Elf32_Word vn_next; /* Offset in bytes to next verneed
-+ entry */
-+} Elf32_Verneed;
-+
-+typedef struct
-+{
-+ Elf64_Half vn_version; /* Version of structure */
-+ Elf64_Half vn_cnt; /* Number of associated aux entries */
-+ Elf64_Word vn_file; /* Offset of filename for this
-+ dependency */
-+ Elf64_Word vn_aux; /* Offset in bytes to vernaux array */
-+ Elf64_Word vn_next; /* Offset in bytes to next verneed
-+ entry */
-+} Elf64_Verneed;
-+
-+
-+/* Legal values for vn_version (version revision). */
-+#define VER_NEED_NONE 0 /* No version */
-+#define VER_NEED_CURRENT 1 /* Current version */
-+#define VER_NEED_NUM 2 /* Given version number */
-+
-+/* Auxiliary needed version information. */
-+
-+typedef struct
-+{
-+ Elf32_Word vna_hash; /* Hash value of dependency name */
-+ Elf32_Half vna_flags; /* Dependency specific information */
-+ Elf32_Half vna_other; /* Unused */
-+ Elf32_Word vna_name; /* Dependency name string offset */
-+ Elf32_Word vna_next; /* Offset in bytes to next vernaux
-+ entry */
-+} Elf32_Vernaux;
-+
-+typedef struct
-+{
-+ Elf64_Word vna_hash; /* Hash value of dependency name */
-+ Elf64_Half vna_flags; /* Dependency specific information */
-+ Elf64_Half vna_other; /* Unused */
-+ Elf64_Word vna_name; /* Dependency name string offset */
-+ Elf64_Word vna_next; /* Offset in bytes to next vernaux
-+ entry */
-+} Elf64_Vernaux;
-+
-+
-+/* Legal values for vna_flags. */
-+#define VER_FLG_WEAK 0x2 /* Weak version identifier */
-+
-+
-+/* Auxiliary vector. */
-+
-+/* This vector is normally only used by the program interpreter. The
-+ usual definition in an ABI supplement uses the name auxv_t. The
-+ vector is not usually defined in a standard <elf.h> file, but it
-+ can't hurt. We rename it to avoid conflicts. The sizes of these
-+ types are an arrangement between the exec server and the program
-+ interpreter, so we don't fully specify them here. */
-+
-+typedef struct
-+{
-+ uint32_t a_type; /* Entry type */
-+ union
-+ {
-+ uint32_t a_val; /* Integer value */
-+ /* We use to have pointer elements added here. We cannot do that,
-+ though, since it does not work when using 32-bit definitions
-+ on 64-bit platforms and vice versa. */
-+ } a_un;
-+} Elf32_auxv_t;
-+
-+typedef struct
-+{
-+ uint64_t a_type; /* Entry type */
-+ union
-+ {
-+ uint64_t a_val; /* Integer value */
-+ /* We use to have pointer elements added here. We cannot do that,
-+ though, since it does not work when using 32-bit definitions
-+ on 64-bit platforms and vice versa. */
-+ } a_un;
-+} Elf64_auxv_t;
-+
-+/* Legal values for a_type (entry type). */
-+
-+#define AT_NULL 0 /* End of vector */
-+#define AT_IGNORE 1 /* Entry should be ignored */
-+#define AT_EXECFD 2 /* File descriptor of program */
-+#define AT_PHDR 3 /* Program headers for program */
-+#define AT_PHENT 4 /* Size of program header entry */
-+#define AT_PHNUM 5 /* Number of program headers */
-+#define AT_PAGESZ 6 /* System page size */
-+#define AT_BASE 7 /* Base address of interpreter */
-+#define AT_FLAGS 8 /* Flags */
-+#define AT_ENTRY 9 /* Entry point of program */
-+#define AT_NOTELF 10 /* Program is not ELF */
-+#define AT_UID 11 /* Real uid */
-+#define AT_EUID 12 /* Effective uid */
-+#define AT_GID 13 /* Real gid */
-+#define AT_EGID 14 /* Effective gid */
-+#define AT_CLKTCK 17 /* Frequency of times() */
-+
-+/* Some more special a_type values describing the hardware. */
-+#define AT_PLATFORM 15 /* String identifying platform. */
-+#define AT_HWCAP 16 /* Machine dependent hints about
-+ processor capabilities. */
-+
-+/* This entry gives some information about the FPU initialization
-+ performed by the kernel. */
-+#define AT_FPUCW 18 /* Used FPU control word. */
-+
-+/* Cache block sizes. */
-+#define AT_DCACHEBSIZE 19 /* Data cache block size. */
-+#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */
-+#define AT_UCACHEBSIZE 21 /* Unified cache block size. */
-+
-+/* A special ignored value for PPC, used by the kernel to control the
-+ interpretation of the AUXV. Must be > 16. */
-+#define AT_IGNOREPPC 22 /* Entry should be ignored. */
-+
-+#define AT_SECURE 23 /* Boolean, was exec setuid-like? */
-+
-+#define AT_BASE_PLATFORM 24 /* String identifying real platforms.*/
-+
-+#define AT_RANDOM 25 /* Address of 16 random bytes. */
-+
-+#define AT_EXECFN 31 /* Filename of executable. */
-+
-+/* Pointer to the global system page used for system calls and other
-+ nice things. */
-+#define AT_SYSINFO 32
-+#define AT_SYSINFO_EHDR 33
-+
-+/* Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains
-+ log2 of line size; mask those to get cache size. */
-+#define AT_L1I_CACHESHAPE 34
-+#define AT_L1D_CACHESHAPE 35
-+#define AT_L2_CACHESHAPE 36
-+#define AT_L3_CACHESHAPE 37
-+
-+/* Note section contents. Each entry in the note section begins with
-+ a header of a fixed form. */
-+
-+typedef struct
-+{
-+ Elf32_Word n_namesz; /* Length of the note's name. */
-+ Elf32_Word n_descsz; /* Length of the note's descriptor. */
-+ Elf32_Word n_type; /* Type of the note. */
-+} Elf32_Nhdr;
-+
-+typedef struct
-+{
-+ Elf64_Word n_namesz; /* Length of the note's name. */
-+ Elf64_Word n_descsz; /* Length of the note's descriptor. */
-+ Elf64_Word n_type; /* Type of the note. */
-+} Elf64_Nhdr;
-+
-+/* Known names of notes. */
-+
-+/* Solaris entries in the note section have this name. */
-+#define ELF_NOTE_SOLARIS "SUNW Solaris"
-+
-+/* Note entries for GNU systems have this name. */
-+#define ELF_NOTE_GNU "GNU"
-+
-+
-+/* Defined types of notes for Solaris. */
-+
-+/* Value of descriptor (one word) is desired pagesize for the binary. */
-+#define ELF_NOTE_PAGESIZE_HINT 1
-+
-+
-+/* Defined note types for GNU systems. */
-+
-+/* ABI information. The descriptor consists of words:
-+ word 0: OS descriptor
-+ word 1: major version of the ABI
-+ word 2: minor version of the ABI
-+ word 3: subminor version of the ABI
-+*/
-+#define NT_GNU_ABI_TAG 1
-+#define ELF_NOTE_ABI NT_GNU_ABI_TAG /* Old name. */
-+
-+/* Known OSes. These values can appear in word 0 of an
-+ NT_GNU_ABI_TAG note section entry. */
-+#define ELF_NOTE_OS_LINUX 0
-+#define ELF_NOTE_OS_GNU 1
-+#define ELF_NOTE_OS_SOLARIS2 2
-+#define ELF_NOTE_OS_FREEBSD 3
-+
-+/* Synthetic hwcap information. The descriptor begins with two words:
-+ word 0: number of entries
-+ word 1: bitmask of enabled entries
-+ Then follow variable-length entries, one byte followed by a
-+ '\0'-terminated hwcap name string. The byte gives the bit
-+ number to test if enabled, (1U << bit) & bitmask. */
-+#define NT_GNU_HWCAP 2
-+
-+/* Build ID bits as generated by ld --build-id.
-+ The descriptor consists of any nonzero number of bytes. */
-+#define NT_GNU_BUILD_ID 3
-+
-+/* Version note generated by GNU gold containing a version string. */
-+#define NT_GNU_GOLD_VERSION 4
-+
-+
-+/* Move records. */
-+typedef struct
-+{
-+ Elf32_Xword m_value; /* Symbol value. */
-+ Elf32_Word m_info; /* Size and index. */
-+ Elf32_Word m_poffset; /* Symbol offset. */
-+ Elf32_Half m_repeat; /* Repeat count. */
-+ Elf32_Half m_stride; /* Stride info. */
-+} Elf32_Move;
-+
-+typedef struct
-+{
-+ Elf64_Xword m_value; /* Symbol value. */
-+ Elf64_Xword m_info; /* Size and index. */
-+ Elf64_Xword m_poffset; /* Symbol offset. */
-+ Elf64_Half m_repeat; /* Repeat count. */
-+ Elf64_Half m_stride; /* Stride info. */
-+} Elf64_Move;
-+
-+/* Macro to construct move records. */
-+#define ELF32_M_SYM(info) ((info) >> 8)
-+#define ELF32_M_SIZE(info) ((unsigned char) (info))
-+#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size))
-+
-+#define ELF64_M_SYM(info) ELF32_M_SYM (info)
-+#define ELF64_M_SIZE(info) ELF32_M_SIZE (info)
-+#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size)
-+
-+
-+/* Motorola 68k specific definitions. */
-+
-+/* Values for Elf32_Ehdr.e_flags. */
-+#define EF_CPU32 0x00810000
-+
-+/* m68k relocs. */
-+
-+#define R_68K_NONE 0 /* No reloc */
-+#define R_68K_32 1 /* Direct 32 bit */
-+#define R_68K_16 2 /* Direct 16 bit */
-+#define R_68K_8 3 /* Direct 8 bit */
-+#define R_68K_PC32 4 /* PC relative 32 bit */
-+#define R_68K_PC16 5 /* PC relative 16 bit */
-+#define R_68K_PC8 6 /* PC relative 8 bit */
-+#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */
-+#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */
-+#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */
-+#define R_68K_GOT32O 10 /* 32 bit GOT offset */
-+#define R_68K_GOT16O 11 /* 16 bit GOT offset */
-+#define R_68K_GOT8O 12 /* 8 bit GOT offset */
-+#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */
-+#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */
-+#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */
-+#define R_68K_PLT32O 16 /* 32 bit PLT offset */
-+#define R_68K_PLT16O 17 /* 16 bit PLT offset */
-+#define R_68K_PLT8O 18 /* 8 bit PLT offset */
-+#define R_68K_COPY 19 /* Copy symbol at runtime */
-+#define R_68K_GLOB_DAT 20 /* Create GOT entry */
-+#define R_68K_JMP_SLOT 21 /* Create PLT entry */
-+#define R_68K_RELATIVE 22 /* Adjust by program base */
-+#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */
-+#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */
-+#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */
-+#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */
-+#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */
-+#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */
-+#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */
-+#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */
-+#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */
-+#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */
-+#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */
-+#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */
-+#define R_68K_TLS_LE32 37 /* 32 bit offset relative to
-+ static TLS block */
-+#define R_68K_TLS_LE16 38 /* 16 bit offset relative to
-+ static TLS block */
-+#define R_68K_TLS_LE8 39 /* 8 bit offset relative to
-+ static TLS block */
-+#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */
-+#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */
-+#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */
-+/* Keep this the last entry. */
-+#define R_68K_NUM 43
-+
-+/* Intel 80386 specific definitions. */
-+
-+/* i386 relocs. */
-+
-+#define R_386_NONE 0 /* No reloc */
-+#define R_386_32 1 /* Direct 32 bit */
-+#define R_386_PC32 2 /* PC relative 32 bit */
-+#define R_386_GOT32 3 /* 32 bit GOT entry */
-+#define R_386_PLT32 4 /* 32 bit PLT address */
-+#define R_386_COPY 5 /* Copy symbol at runtime */
-+#define R_386_GLOB_DAT 6 /* Create GOT entry */
-+#define R_386_JMP_SLOT 7 /* Create PLT entry */
-+#define R_386_RELATIVE 8 /* Adjust by program base */
-+#define R_386_GOTOFF 9 /* 32 bit offset to GOT */
-+#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */
-+#define R_386_32PLT 11
-+#define R_386_TLS_TPOFF 14 /* Offset in static TLS block */
-+#define R_386_TLS_IE 15 /* Address of GOT entry for static TLS
-+ block offset */
-+#define R_386_TLS_GOTIE 16 /* GOT entry for static TLS block
-+ offset */
-+#define R_386_TLS_LE 17 /* Offset relative to static TLS
-+ block */
-+#define R_386_TLS_GD 18 /* Direct 32 bit for GNU version of
-+ general dynamic thread local data */
-+#define R_386_TLS_LDM 19 /* Direct 32 bit for GNU version of
-+ local dynamic thread local data
-+ in LE code */
-+#define R_386_16 20
-+#define R_386_PC16 21
-+#define R_386_8 22
-+#define R_386_PC8 23
-+#define R_386_TLS_GD_32 24 /* Direct 32 bit for general dynamic
-+ thread local data */
-+#define R_386_TLS_GD_PUSH 25 /* Tag for pushl in GD TLS code */
-+#define R_386_TLS_GD_CALL 26 /* Relocation for call to
-+ __tls_get_addr() */
-+#define R_386_TLS_GD_POP 27 /* Tag for popl in GD TLS code */
-+#define R_386_TLS_LDM_32 28 /* Direct 32 bit for local dynamic
-+ thread local data in LE code */
-+#define R_386_TLS_LDM_PUSH 29 /* Tag for pushl in LDM TLS code */
-+#define R_386_TLS_LDM_CALL 30 /* Relocation for call to
-+ __tls_get_addr() in LDM code */
-+#define R_386_TLS_LDM_POP 31 /* Tag for popl in LDM TLS code */
-+#define R_386_TLS_LDO_32 32 /* Offset relative to TLS block */
-+#define R_386_TLS_IE_32 33 /* GOT entry for negated static TLS
-+ block offset */
-+#define R_386_TLS_LE_32 34 /* Negated offset relative to static
-+ TLS block */
-+#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */
-+#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */
-+#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */
-+/* 38? */
-+#define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */
-+#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS
-+ descriptor for
-+ relaxation. */
-+#define R_386_TLS_DESC 41 /* TLS descriptor containing
-+ pointer to code and to
-+ argument, returning the TLS
-+ offset for the symbol. */
-+#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */
-+/* Keep this the last entry. */
-+#define R_386_NUM 43
-+
-+/* SUN SPARC specific definitions. */
-+
-+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-+
-+#define STT_SPARC_REGISTER 13 /* Global register reserved to app. */
-+
-+/* Values for Elf64_Ehdr.e_flags. */
-+
-+#define EF_SPARCV9_MM 3
-+#define EF_SPARCV9_TSO 0
-+#define EF_SPARCV9_PSO 1
-+#define EF_SPARCV9_RMO 2
-+#define EF_SPARC_LEDATA 0x800000 /* little endian data */
-+#define EF_SPARC_EXT_MASK 0xFFFF00
-+#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */
-+#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */
-+#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */
-+#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */
-+
-+/* SPARC relocs. */
-+
-+#define R_SPARC_NONE 0 /* No reloc */
-+#define R_SPARC_8 1 /* Direct 8 bit */
-+#define R_SPARC_16 2 /* Direct 16 bit */
-+#define R_SPARC_32 3 /* Direct 32 bit */
-+#define R_SPARC_DISP8 4 /* PC relative 8 bit */
-+#define R_SPARC_DISP16 5 /* PC relative 16 bit */
-+#define R_SPARC_DISP32 6 /* PC relative 32 bit */
-+#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */
-+#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */
-+#define R_SPARC_HI22 9 /* High 22 bit */
-+#define R_SPARC_22 10 /* Direct 22 bit */
-+#define R_SPARC_13 11 /* Direct 13 bit */
-+#define R_SPARC_LO10 12 /* Truncated 10 bit */
-+#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */
-+#define R_SPARC_GOT13 14 /* 13 bit GOT entry */
-+#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */
-+#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */
-+#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */
-+#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */
-+#define R_SPARC_COPY 19 /* Copy symbol at runtime */
-+#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */
-+#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */
-+#define R_SPARC_RELATIVE 22 /* Adjust by program base */
-+#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */
-+
-+/* Additional Sparc64 relocs. */
-+
-+#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */
-+#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */
-+#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */
-+#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */
-+#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */
-+#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */
-+#define R_SPARC_10 30 /* Direct 10 bit */
-+#define R_SPARC_11 31 /* Direct 11 bit */
-+#define R_SPARC_64 32 /* Direct 64 bit */
-+#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */
-+#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */
-+#define R_SPARC_HM10 35 /* High middle 10 bits of ... */
-+#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */
-+#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */
-+#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */
-+#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */
-+#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */
-+#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */
-+#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */
-+#define R_SPARC_7 43 /* Direct 7 bit */
-+#define R_SPARC_5 44 /* Direct 5 bit */
-+#define R_SPARC_6 45 /* Direct 6 bit */
-+#define R_SPARC_DISP64 46 /* PC relative 64 bit */
-+#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */
-+#define R_SPARC_HIX22 48 /* High 22 bit complemented */
-+#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */
-+#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */
-+#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */
-+#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */
-+#define R_SPARC_REGISTER 53 /* Global register usage */
-+#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */
-+#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */
-+#define R_SPARC_TLS_GD_HI22 56
-+#define R_SPARC_TLS_GD_LO10 57
-+#define R_SPARC_TLS_GD_ADD 58
-+#define R_SPARC_TLS_GD_CALL 59
-+#define R_SPARC_TLS_LDM_HI22 60
-+#define R_SPARC_TLS_LDM_LO10 61
-+#define R_SPARC_TLS_LDM_ADD 62
-+#define R_SPARC_TLS_LDM_CALL 63
-+#define R_SPARC_TLS_LDO_HIX22 64
-+#define R_SPARC_TLS_LDO_LOX10 65
-+#define R_SPARC_TLS_LDO_ADD 66
-+#define R_SPARC_TLS_IE_HI22 67
-+#define R_SPARC_TLS_IE_LO10 68
-+#define R_SPARC_TLS_IE_LD 69
-+#define R_SPARC_TLS_IE_LDX 70
-+#define R_SPARC_TLS_IE_ADD 71
-+#define R_SPARC_TLS_LE_HIX22 72
-+#define R_SPARC_TLS_LE_LOX10 73
-+#define R_SPARC_TLS_DTPMOD32 74
-+#define R_SPARC_TLS_DTPMOD64 75
-+#define R_SPARC_TLS_DTPOFF32 76
-+#define R_SPARC_TLS_DTPOFF64 77
-+#define R_SPARC_TLS_TPOFF32 78
-+#define R_SPARC_TLS_TPOFF64 79
-+#define R_SPARC_GOTDATA_HIX22 80
-+#define R_SPARC_GOTDATA_LOX10 81
-+#define R_SPARC_GOTDATA_OP_HIX22 82
-+#define R_SPARC_GOTDATA_OP_LOX10 83
-+#define R_SPARC_GOTDATA_OP 84
-+#define R_SPARC_H34 85
-+#define R_SPARC_SIZE32 86
-+#define R_SPARC_SIZE64 87
-+#define R_SPARC_WDISP10 88
-+#define R_SPARC_JMP_IREL 248
-+#define R_SPARC_IRELATIVE 249
-+#define R_SPARC_GNU_VTINHERIT 250
-+#define R_SPARC_GNU_VTENTRY 251
-+#define R_SPARC_REV32 252
-+/* Keep this the last entry. */
-+#define R_SPARC_NUM 253
-+
-+/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
-+
-+#define DT_SPARC_REGISTER 0x70000001
-+#define DT_SPARC_NUM 2
-+
-+/* MIPS R3000 specific definitions. */
-+
-+/* Legal values for e_flags field of Elf32_Ehdr. */
-+
-+#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */
-+#define EF_MIPS_PIC 2 /* Contains PIC code */
-+#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */
-+#define EF_MIPS_XGOT 8
-+#define EF_MIPS_64BIT_WHIRL 16
-+#define EF_MIPS_ABI2 32
-+#define EF_MIPS_ABI_ON32 64
-+#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */
-+
-+/* Legal values for MIPS architecture level. */
-+
-+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
-+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
-+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
-+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
-+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
-+#define EF_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */
-+#define EF_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */
-+
-+/* The following are non-official names and should not be used. */
-+
-+#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
-+#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
-+#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
-+#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
-+#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
-+#define E_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */
-+#define E_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */
-+
-+/* Special section indices. */
-+
-+#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */
-+#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */
-+#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */
-+#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */
-+#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */
-+
-+/* Legal values for sh_type field of Elf32_Shdr. */
-+
-+#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */
-+#define SHT_MIPS_MSYM 0x70000001
-+#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */
-+#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */
-+#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */
-+#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/
-+#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */
-+#define SHT_MIPS_PACKAGE 0x70000007
-+#define SHT_MIPS_PACKSYM 0x70000008
-+#define SHT_MIPS_RELD 0x70000009
-+#define SHT_MIPS_IFACE 0x7000000b
-+#define SHT_MIPS_CONTENT 0x7000000c
-+#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */
-+#define SHT_MIPS_SHDR 0x70000010
-+#define SHT_MIPS_FDESC 0x70000011
-+#define SHT_MIPS_EXTSYM 0x70000012
-+#define SHT_MIPS_DENSE 0x70000013
-+#define SHT_MIPS_PDESC 0x70000014
-+#define SHT_MIPS_LOCSYM 0x70000015
-+#define SHT_MIPS_AUXSYM 0x70000016
-+#define SHT_MIPS_OPTSYM 0x70000017
-+#define SHT_MIPS_LOCSTR 0x70000018
-+#define SHT_MIPS_LINE 0x70000019
-+#define SHT_MIPS_RFDESC 0x7000001a
-+#define SHT_MIPS_DELTASYM 0x7000001b
-+#define SHT_MIPS_DELTAINST 0x7000001c
-+#define SHT_MIPS_DELTACLASS 0x7000001d
-+#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */
-+#define SHT_MIPS_DELTADECL 0x7000001f
-+#define SHT_MIPS_SYMBOL_LIB 0x70000020
-+#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */
-+#define SHT_MIPS_TRANSLATE 0x70000022
-+#define SHT_MIPS_PIXIE 0x70000023
-+#define SHT_MIPS_XLATE 0x70000024
-+#define SHT_MIPS_XLATE_DEBUG 0x70000025
-+#define SHT_MIPS_WHIRL 0x70000026
-+#define SHT_MIPS_EH_REGION 0x70000027
-+#define SHT_MIPS_XLATE_OLD 0x70000028
-+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
-+
-+/* Legal values for sh_flags field of Elf32_Shdr. */
-+
-+#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */
-+#define SHF_MIPS_MERGE 0x20000000
-+#define SHF_MIPS_ADDR 0x40000000
-+#define SHF_MIPS_STRINGS 0x80000000
-+#define SHF_MIPS_NOSTRIP 0x08000000
-+#define SHF_MIPS_LOCAL 0x04000000
-+#define SHF_MIPS_NAMES 0x02000000
-+#define SHF_MIPS_NODUPE 0x01000000
-+
-+
-+/* Symbol tables. */
-+
-+/* MIPS specific values for `st_other'. */
-+#define STO_MIPS_DEFAULT 0x0
-+#define STO_MIPS_INTERNAL 0x1
-+#define STO_MIPS_HIDDEN 0x2
-+#define STO_MIPS_PROTECTED 0x3
-+#define STO_MIPS_PLT 0x8
-+#define STO_MIPS_SC_ALIGN_UNUSED 0xff
-+
-+/* MIPS specific values for `st_info'. */
-+#define STB_MIPS_SPLIT_COMMON 13
-+
-+/* Entries found in sections of type SHT_MIPS_GPTAB. */
-+
-+typedef union
-+{
-+ struct
-+ {
-+ Elf32_Word gt_current_g_value; /* -G value used for compilation */
-+ Elf32_Word gt_unused; /* Not used */
-+ } gt_header; /* First entry in section */
-+ struct
-+ {
-+ Elf32_Word gt_g_value; /* If this value were used for -G */
-+ Elf32_Word gt_bytes; /* This many bytes would be used */
-+ } gt_entry; /* Subsequent entries in section */
-+} Elf32_gptab;
-+
-+/* Entry found in sections of type SHT_MIPS_REGINFO. */
-+
-+typedef struct
-+{
-+ Elf32_Word ri_gprmask; /* General registers used */
-+ Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */
-+ Elf32_Sword ri_gp_value; /* $gp register value */
-+} Elf32_RegInfo;
-+
-+/* Entries found in sections of type SHT_MIPS_OPTIONS. */
-+
-+typedef struct
-+{
-+ unsigned char kind; /* Determines interpretation of the
-+ variable part of descriptor. */
-+ unsigned char size; /* Size of descriptor, including header. */
-+ Elf32_Section section; /* Section header index of section affected,
-+ 0 for global options. */
-+ Elf32_Word info; /* Kind-specific information. */
-+} Elf_Options;
-+
-+/* Values for `kind' field in Elf_Options. */
-+
-+#define ODK_NULL 0 /* Undefined. */
-+#define ODK_REGINFO 1 /* Register usage information. */
-+#define ODK_EXCEPTIONS 2 /* Exception processing options. */
-+#define ODK_PAD 3 /* Section padding options. */
-+#define ODK_HWPATCH 4 /* Hardware workarounds performed */
-+#define ODK_FILL 5 /* record the fill value used by the linker. */
-+#define ODK_TAGS 6 /* reserve space for desktop tools to write. */
-+#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */
-+#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */
-+
-+/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */
-+
-+#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */
-+#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */
-+#define OEX_PAGE0 0x10000 /* page zero must be mapped. */
-+#define OEX_SMM 0x20000 /* Force sequential memory mode? */
-+#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */
-+#define OEX_PRECISEFP OEX_FPDBUG
-+#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */
-+
-+#define OEX_FPU_INVAL 0x10
-+#define OEX_FPU_DIV0 0x08
-+#define OEX_FPU_OFLO 0x04
-+#define OEX_FPU_UFLO 0x02
-+#define OEX_FPU_INEX 0x01
-+
-+/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */
-+
-+#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */
-+#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */
-+#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */
-+#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */
-+
-+#define OPAD_PREFIX 0x1
-+#define OPAD_POSTFIX 0x2
-+#define OPAD_SYMBOL 0x4
-+
-+/* Entry found in `.options' section. */
-+
-+typedef struct
-+{
-+ Elf32_Word hwp_flags1; /* Extra flags. */
-+ Elf32_Word hwp_flags2; /* Extra flags. */
-+} Elf_Options_Hw;
-+
-+/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */
-+
-+#define OHWA0_R4KEOP_CHECKED 0x00000001
-+#define OHWA1_R4KEOP_CLEAN 0x00000002
-+
-+/* MIPS relocs. */
-+
-+#define R_MIPS_NONE 0 /* No reloc */
-+#define R_MIPS_16 1 /* Direct 16 bit */
-+#define R_MIPS_32 2 /* Direct 32 bit */
-+#define R_MIPS_REL32 3 /* PC relative 32 bit */
-+#define R_MIPS_26 4 /* Direct 26 bit shifted */
-+#define R_MIPS_HI16 5 /* High 16 bit */
-+#define R_MIPS_LO16 6 /* Low 16 bit */
-+#define R_MIPS_GPREL16 7 /* GP relative 16 bit */
-+#define R_MIPS_LITERAL 8 /* 16 bit literal entry */
-+#define R_MIPS_GOT16 9 /* 16 bit GOT entry */
-+#define R_MIPS_PC16 10 /* PC relative 16 bit */
-+#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */
-+#define R_MIPS_GPREL32 12 /* GP relative 32 bit */
-+
-+#define R_MIPS_SHIFT5 16
-+#define R_MIPS_SHIFT6 17
-+#define R_MIPS_64 18
-+#define R_MIPS_GOT_DISP 19
-+#define R_MIPS_GOT_PAGE 20
-+#define R_MIPS_GOT_OFST 21
-+#define R_MIPS_GOT_HI16 22
-+#define R_MIPS_GOT_LO16 23
-+#define R_MIPS_SUB 24
-+#define R_MIPS_INSERT_A 25
-+#define R_MIPS_INSERT_B 26
-+#define R_MIPS_DELETE 27
-+#define R_MIPS_HIGHER 28
-+#define R_MIPS_HIGHEST 29
-+#define R_MIPS_CALL_HI16 30
-+#define R_MIPS_CALL_LO16 31
-+#define R_MIPS_SCN_DISP 32
-+#define R_MIPS_REL16 33
-+#define R_MIPS_ADD_IMMEDIATE 34
-+#define R_MIPS_PJUMP 35
-+#define R_MIPS_RELGOT 36
-+#define R_MIPS_JALR 37
-+#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */
-+#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */
-+#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */
-+#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */
-+#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */
-+#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */
-+#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */
-+#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */
-+#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */
-+#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */
-+#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */
-+#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
-+#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
-+#define R_MIPS_GLOB_DAT 51
-+#define R_MIPS_COPY 126
-+#define R_MIPS_JUMP_SLOT 127
-+/* Keep this the last entry. */
-+#define R_MIPS_NUM 128
-+
-+/* Legal values for p_type field of Elf32_Phdr. */
-+
-+#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
-+#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
-+#define PT_MIPS_OPTIONS 0x70000002
-+
-+/* Special program header types. */
-+
-+#define PF_MIPS_LOCAL 0x10000000
-+
-+/* Legal values for d_tag field of Elf32_Dyn. */
-+
-+#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */
-+#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */
-+#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */
-+#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */
-+#define DT_MIPS_FLAGS 0x70000005 /* Flags */
-+#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */
-+#define DT_MIPS_MSYM 0x70000007
-+#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */
-+#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */
-+#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */
-+#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */
-+#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */
-+#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */
-+#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */
-+#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */
-+#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */
-+#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */
-+#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */
-+#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in
-+ DT_MIPS_DELTA_CLASS. */
-+#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */
-+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
-+ DT_MIPS_DELTA_INSTANCE. */
-+#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */
-+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
-+ DT_MIPS_DELTA_RELOC. */
-+#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta
-+ relocations refer to. */
-+#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
-+ DT_MIPS_DELTA_SYM. */
-+#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
-+ class declaration. */
-+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
-+ DT_MIPS_DELTA_CLASSSYM. */
-+#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */
-+#define DT_MIPS_PIXIE_INIT 0x70000023
-+#define DT_MIPS_SYMBOL_LIB 0x70000024
-+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
-+#define DT_MIPS_LOCAL_GOTIDX 0x70000026
-+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
-+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
-+#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */
-+#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */
-+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
-+#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
-+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
-+ function stored in GOT. */
-+#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added
-+ by rld on dlopen() calls. */
-+#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
-+#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */
-+#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */
-+/* The address of .got.plt in an executable using the new non-PIC ABI. */
-+#define DT_MIPS_PLTGOT 0x70000032
-+/* The base of the PLT in an executable using the new non-PIC ABI if that
-+ PLT is writable. For a non-writable PLT, this is omitted or has a zero
-+ value. */
-+#define DT_MIPS_RWPLT 0x70000034
-+#define DT_MIPS_NUM 0x35
-+
-+/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
-+
-+#define RHF_NONE 0 /* No flags */
-+#define RHF_QUICKSTART (1 << 0) /* Use quickstart */
-+#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */
-+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */
-+#define RHF_NO_MOVE (1 << 3)
-+#define RHF_SGI_ONLY (1 << 4)
-+#define RHF_GUARANTEE_INIT (1 << 5)
-+#define RHF_DELTA_C_PLUS_PLUS (1 << 6)
-+#define RHF_GUARANTEE_START_INIT (1 << 7)
-+#define RHF_PIXIE (1 << 8)
-+#define RHF_DEFAULT_DELAY_LOAD (1 << 9)
-+#define RHF_REQUICKSTART (1 << 10)
-+#define RHF_REQUICKSTARTED (1 << 11)
-+#define RHF_CORD (1 << 12)
-+#define RHF_NO_UNRES_UNDEF (1 << 13)
-+#define RHF_RLD_ORDER_SAFE (1 << 14)
-+
-+/* Entries found in sections of type SHT_MIPS_LIBLIST. */
-+
-+typedef struct
-+{
-+ Elf32_Word l_name; /* Name (string table index) */
-+ Elf32_Word l_time_stamp; /* Timestamp */
-+ Elf32_Word l_checksum; /* Checksum */
-+ Elf32_Word l_version; /* Interface version */
-+ Elf32_Word l_flags; /* Flags */
-+} Elf32_Lib;
-+
-+typedef struct
-+{
-+ Elf64_Word l_name; /* Name (string table index) */
-+ Elf64_Word l_time_stamp; /* Timestamp */
-+ Elf64_Word l_checksum; /* Checksum */
-+ Elf64_Word l_version; /* Interface version */
-+ Elf64_Word l_flags; /* Flags */
-+} Elf64_Lib;
-+
-+
-+/* Legal values for l_flags. */
-+
-+#define LL_NONE 0
-+#define LL_EXACT_MATCH (1 << 0) /* Require exact match */
-+#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */
-+#define LL_REQUIRE_MINOR (1 << 2)
-+#define LL_EXPORTS (1 << 3)
-+#define LL_DELAY_LOAD (1 << 4)
-+#define LL_DELTA (1 << 5)
-+
-+/* Entries found in sections of type SHT_MIPS_CONFLICT. */
-+
-+typedef Elf32_Addr Elf32_Conflict;
-+
-+
-+/* HPPA specific definitions. */
-+
-+/* Legal values for e_flags field of Elf32_Ehdr. */
-+
-+#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
-+#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
-+#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
-+#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
-+#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
-+ prediction. */
-+#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
-+#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
-+
-+/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
-+
-+#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
-+#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
-+#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
-+
-+/* Additional section indeces. */
-+
-+#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
-+ symbols in ANSI C. */
-+#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
-+
-+/* Legal values for sh_type field of Elf32_Shdr. */
-+
-+#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
-+#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
-+#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
-+
-+/* Legal values for sh_flags field of Elf32_Shdr. */
-+
-+#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
-+#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
-+#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
-+
-+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
-+
-+#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
-+
-+#define STT_HP_OPAQUE (STT_LOOS + 0x1)
-+#define STT_HP_STUB (STT_LOOS + 0x2)
-+
-+/* HPPA relocs. */
-+
-+#define R_PARISC_NONE 0 /* No reloc. */
-+#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
-+#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
-+#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
-+#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
-+#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
-+#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
-+#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
-+#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
-+#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
-+#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
-+#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
-+#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
-+#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
-+#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
-+#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
-+#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
-+#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
-+#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
-+#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
-+#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
-+#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
-+#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
-+#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
-+#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
-+#define R_PARISC_FPTR64 64 /* 64 bits function address. */
-+#define R_PARISC_PLABEL32 65 /* 32 bits function address. */
-+#define R_PARISC_PLABEL21L 66 /* Left 21 bits of fdesc address. */
-+#define R_PARISC_PLABEL14R 70 /* Right 14 bits of fdesc address. */
-+#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
-+#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
-+#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
-+#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
-+#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
-+#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
-+#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
-+#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
-+#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
-+#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
-+#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
-+#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
-+#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
-+#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
-+#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
-+#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
-+#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
-+#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
-+#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
-+#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
-+#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
-+#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
-+#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
-+#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
-+#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
-+#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
-+#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
-+#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
-+#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
-+#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
-+#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
-+#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
-+#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
-+#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
-+#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
-+#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
-+#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
-+#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
-+#define R_PARISC_LORESERVE 128
-+#define R_PARISC_COPY 128 /* Copy relocation. */
-+#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
-+#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
-+#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
-+#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
-+#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
-+#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
-+#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
-+#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
-+#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
-+#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
-+#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
-+#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
-+#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
-+#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
-+#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
-+#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
-+#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
-+#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
-+#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
-+#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
-+#define R_PARISC_GNU_VTENTRY 232
-+#define R_PARISC_GNU_VTINHERIT 233
-+#define R_PARISC_TLS_GD21L 234 /* GD 21-bit left. */
-+#define R_PARISC_TLS_GD14R 235 /* GD 14-bit right. */
-+#define R_PARISC_TLS_GDCALL 236 /* GD call to __t_g_a. */
-+#define R_PARISC_TLS_LDM21L 237 /* LD module 21-bit left. */
-+#define R_PARISC_TLS_LDM14R 238 /* LD module 14-bit right. */
-+#define R_PARISC_TLS_LDMCALL 239 /* LD module call to __t_g_a. */
-+#define R_PARISC_TLS_LDO21L 240 /* LD offset 21-bit left. */
-+#define R_PARISC_TLS_LDO14R 241 /* LD offset 14-bit right. */
-+#define R_PARISC_TLS_DTPMOD32 242 /* DTP module 32-bit. */
-+#define R_PARISC_TLS_DTPMOD64 243 /* DTP module 64-bit. */
-+#define R_PARISC_TLS_DTPOFF32 244 /* DTP offset 32-bit. */
-+#define R_PARISC_TLS_DTPOFF64 245 /* DTP offset 32-bit. */
-+#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L
-+#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R
-+#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L
-+#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R
-+#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32
-+#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64
-+#define R_PARISC_HIRESERVE 255
-+
-+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
-+
-+#define PT_HP_TLS (PT_LOOS + 0x0)
-+#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
-+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
-+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
-+#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
-+#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
-+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
-+#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
-+#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
-+#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
-+#define PT_HP_PARALLEL (PT_LOOS + 0x10)
-+#define PT_HP_FASTBIND (PT_LOOS + 0x11)
-+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
-+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
-+#define PT_HP_STACK (PT_LOOS + 0x14)
-+
-+#define PT_PARISC_ARCHEXT 0x70000000
-+#define PT_PARISC_UNWIND 0x70000001
-+
-+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
-+
-+#define PF_PARISC_SBP 0x08000000
-+
-+#define PF_HP_PAGE_SIZE 0x00100000
-+#define PF_HP_FAR_SHARED 0x00200000
-+#define PF_HP_NEAR_SHARED 0x00400000
-+#define PF_HP_CODE 0x01000000
-+#define PF_HP_MODIFY 0x02000000
-+#define PF_HP_LAZYSWAP 0x04000000
-+#define PF_HP_SBP 0x08000000
-+
-+
-+/* Alpha specific definitions. */
-+
-+/* Legal values for e_flags field of Elf64_Ehdr. */
-+
-+#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */
-+#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */
-+
-+/* Legal values for sh_type field of Elf64_Shdr. */
-+
-+/* These two are primerily concerned with ECOFF debugging info. */
-+#define SHT_ALPHA_DEBUG 0x70000001
-+#define SHT_ALPHA_REGINFO 0x70000002
-+
-+/* Legal values for sh_flags field of Elf64_Shdr. */
-+
-+#define SHF_ALPHA_GPREL 0x10000000
-+
-+/* Legal values for st_other field of Elf64_Sym. */
-+#define STO_ALPHA_NOPV 0x80 /* No PV required. */
-+#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */
-+
-+/* Alpha relocs. */
-+
-+#define R_ALPHA_NONE 0 /* No reloc */
-+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */
-+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
-+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
-+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
-+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
-+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */
-+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
-+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
-+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */
-+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */
-+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */
-+#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */
-+#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */
-+#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */
-+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */
-+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
-+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
-+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */
-+#define R_ALPHA_TLS_GD_HI 28
-+#define R_ALPHA_TLSGD 29
-+#define R_ALPHA_TLS_LDM 30
-+#define R_ALPHA_DTPMOD64 31
-+#define R_ALPHA_GOTDTPREL 32
-+#define R_ALPHA_DTPREL64 33
-+#define R_ALPHA_DTPRELHI 34
-+#define R_ALPHA_DTPRELLO 35
-+#define R_ALPHA_DTPREL16 36
-+#define R_ALPHA_GOTTPREL 37
-+#define R_ALPHA_TPREL64 38
-+#define R_ALPHA_TPRELHI 39
-+#define R_ALPHA_TPRELLO 40
-+#define R_ALPHA_TPREL16 41
-+/* Keep this the last entry. */
-+#define R_ALPHA_NUM 46
-+
-+/* Magic values of the LITUSE relocation addend. */
-+#define LITUSE_ALPHA_ADDR 0
-+#define LITUSE_ALPHA_BASE 1
-+#define LITUSE_ALPHA_BYTOFF 2
-+#define LITUSE_ALPHA_JSR 3
-+#define LITUSE_ALPHA_TLS_GD 4
-+#define LITUSE_ALPHA_TLS_LDM 5
-+
-+/* Legal values for d_tag of Elf64_Dyn. */
-+#define DT_ALPHA_PLTRO (DT_LOPROC + 0)
-+#define DT_ALPHA_NUM 1
-+
-+/* PowerPC specific declarations */
-+
-+/* Values for Elf32/64_Ehdr.e_flags. */
-+#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */
-+
-+/* Cygnus local bits below */
-+#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/
-+#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib
-+ flag */
-+
-+/* PowerPC relocations defined by the ABIs */
-+#define R_PPC_NONE 0
-+#define R_PPC_ADDR32 1 /* 32bit absolute address */
-+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
-+#define R_PPC_ADDR16 3 /* 16bit absolute address */
-+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
-+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
-+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
-+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
-+#define R_PPC_ADDR14_BRTAKEN 8
-+#define R_PPC_ADDR14_BRNTAKEN 9
-+#define R_PPC_REL24 10 /* PC relative 26 bit */
-+#define R_PPC_REL14 11 /* PC relative 16 bit */
-+#define R_PPC_REL14_BRTAKEN 12
-+#define R_PPC_REL14_BRNTAKEN 13
-+#define R_PPC_GOT16 14
-+#define R_PPC_GOT16_LO 15
-+#define R_PPC_GOT16_HI 16
-+#define R_PPC_GOT16_HA 17
-+#define R_PPC_PLTREL24 18
-+#define R_PPC_COPY 19
-+#define R_PPC_GLOB_DAT 20
-+#define R_PPC_JMP_SLOT 21
-+#define R_PPC_RELATIVE 22
-+#define R_PPC_LOCAL24PC 23
-+#define R_PPC_UADDR32 24
-+#define R_PPC_UADDR16 25
-+#define R_PPC_REL32 26
-+#define R_PPC_PLT32 27
-+#define R_PPC_PLTREL32 28
-+#define R_PPC_PLT16_LO 29
-+#define R_PPC_PLT16_HI 30
-+#define R_PPC_PLT16_HA 31
-+#define R_PPC_SDAREL16 32
-+#define R_PPC_SECTOFF 33
-+#define R_PPC_SECTOFF_LO 34
-+#define R_PPC_SECTOFF_HI 35
-+#define R_PPC_SECTOFF_HA 36
-+
-+/* PowerPC relocations defined for the TLS access ABI. */
-+#define R_PPC_TLS 67 /* none (sym+add)@tls */
-+#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */
-+#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */
-+#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */
-+#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */
-+#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */
-+#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */
-+#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */
-+#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */
-+#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */
-+#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */
-+#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */
-+#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */
-+#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */
-+#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */
-+#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */
-+#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */
-+#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */
-+#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */
-+#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */
-+#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */
-+#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */
-+#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */
-+#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */
-+#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */
-+#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */
-+#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */
-+#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */
-+
-+/* The remaining relocs are from the Embedded ELF ABI, and are not
-+ in the SVR4 ELF ABI. */
-+#define R_PPC_EMB_NADDR32 101
-+#define R_PPC_EMB_NADDR16 102
-+#define R_PPC_EMB_NADDR16_LO 103
-+#define R_PPC_EMB_NADDR16_HI 104
-+#define R_PPC_EMB_NADDR16_HA 105
-+#define R_PPC_EMB_SDAI16 106
-+#define R_PPC_EMB_SDA2I16 107
-+#define R_PPC_EMB_SDA2REL 108
-+#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */
-+#define R_PPC_EMB_MRKREF 110
-+#define R_PPC_EMB_RELSEC16 111
-+#define R_PPC_EMB_RELST_LO 112
-+#define R_PPC_EMB_RELST_HI 113
-+#define R_PPC_EMB_RELST_HA 114
-+#define R_PPC_EMB_BIT_FLD 115
-+#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */
-+
-+/* Diab tool relocations. */
-+#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */
-+#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */
-+#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */
-+#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */
-+#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
-+#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
-+
-+/* GNU extension to support local ifunc. */
-+#define R_PPC_IRELATIVE 248
-+
-+/* GNU relocs used in PIC code sequences. */
-+#define R_PPC_REL16 249 /* half16 (sym+add-.) */
-+#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */
-+#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */
-+#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */
-+
-+/* This is a phony reloc to handle any old fashioned TOC16 references
-+ that may still be in object files. */
-+#define R_PPC_TOC16 255
-+
-+/* PowerPC specific values for the Dyn d_tag field. */
-+#define DT_PPC_GOT (DT_LOPROC + 0)
-+#define DT_PPC_NUM 1
-+
-+/* PowerPC64 relocations defined by the ABIs */
-+#define R_PPC64_NONE R_PPC_NONE
-+#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */
-+#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */
-+#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */
-+#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */
-+#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */
-+#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */
-+#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */
-+#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN
-+#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN
-+#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
-+#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */
-+#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN
-+#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN
-+#define R_PPC64_GOT16 R_PPC_GOT16
-+#define R_PPC64_GOT16_LO R_PPC_GOT16_LO
-+#define R_PPC64_GOT16_HI R_PPC_GOT16_HI
-+#define R_PPC64_GOT16_HA R_PPC_GOT16_HA
-+
-+#define R_PPC64_COPY R_PPC_COPY
-+#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT
-+#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT
-+#define R_PPC64_RELATIVE R_PPC_RELATIVE
-+
-+#define R_PPC64_UADDR32 R_PPC_UADDR32
-+#define R_PPC64_UADDR16 R_PPC_UADDR16
-+#define R_PPC64_REL32 R_PPC_REL32
-+#define R_PPC64_PLT32 R_PPC_PLT32
-+#define R_PPC64_PLTREL32 R_PPC_PLTREL32
-+#define R_PPC64_PLT16_LO R_PPC_PLT16_LO
-+#define R_PPC64_PLT16_HI R_PPC_PLT16_HI
-+#define R_PPC64_PLT16_HA R_PPC_PLT16_HA
-+
-+#define R_PPC64_SECTOFF R_PPC_SECTOFF
-+#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO
-+#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI
-+#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA
-+#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */
-+#define R_PPC64_ADDR64 38 /* doubleword64 S + A */
-+#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */
-+#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */
-+#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */
-+#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */
-+#define R_PPC64_UADDR64 43 /* doubleword64 S + A */
-+#define R_PPC64_REL64 44 /* doubleword64 S + A - P */
-+#define R_PPC64_PLT64 45 /* doubleword64 L + A */
-+#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */
-+#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */
-+#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */
-+#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */
-+#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */
-+#define R_PPC64_TOC 51 /* doubleword64 .TOC */
-+#define R_PPC64_PLTGOT16 52 /* half16* M + A */
-+#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */
-+#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */
-+#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */
-+
-+#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */
-+#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */
-+#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */
-+#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */
-+#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */
-+#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */
-+#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */
-+#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */
-+#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */
-+#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */
-+#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */
-+
-+/* PowerPC64 relocations defined for the TLS access ABI. */
-+#define R_PPC64_TLS 67 /* none (sym+add)@tls */
-+#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */
-+#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */
-+#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */
-+#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */
-+#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */
-+#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */
-+#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */
-+#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */
-+#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */
-+#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */
-+#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */
-+#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */
-+#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */
-+#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */
-+#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */
-+#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */
-+#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */
-+#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */
-+#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */
-+#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */
-+#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
-+#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */
-+#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */
-+#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */
-+#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
-+#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */
-+#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */
-+#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */
-+#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */
-+#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */
-+#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */
-+#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */
-+#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */
-+#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */
-+#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */
-+#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */
-+#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */
-+#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
-+#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */
-+
-+/* GNU extension to support local ifunc. */
-+#define R_PPC64_JMP_IREL 247
-+#define R_PPC64_IRELATIVE 248
-+#define R_PPC64_REL16 249 /* half16 (sym+add-.) */
-+#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */
-+#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */
-+#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */
-+
-+/* PowerPC64 specific values for the Dyn d_tag field. */
-+#define DT_PPC64_GLINK (DT_LOPROC + 0)
-+#define DT_PPC64_OPD (DT_LOPROC + 1)
-+#define DT_PPC64_OPDSZ (DT_LOPROC + 2)
-+#define DT_PPC64_NUM 3
-+
-+
-+/* ARM specific declarations */
-+
-+/* Processor specific flags for the ELF header e_flags field. */
-+#define EF_ARM_RELEXEC 0x01
-+#define EF_ARM_HASENTRY 0x02
-+#define EF_ARM_INTERWORK 0x04
-+#define EF_ARM_APCS_26 0x08
-+#define EF_ARM_APCS_FLOAT 0x10
-+#define EF_ARM_PIC 0x20
-+#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */
-+#define EF_ARM_NEW_ABI 0x80
-+#define EF_ARM_OLD_ABI 0x100
-+#define EF_ARM_SOFT_FLOAT 0x200
-+#define EF_ARM_VFP_FLOAT 0x400
-+#define EF_ARM_MAVERICK_FLOAT 0x800
-+
-+
-+/* Other constants defined in the ARM ELF spec. version B-01. */
-+/* NB. These conflict with values defined above. */
-+#define EF_ARM_SYMSARESORTED 0x04
-+#define EF_ARM_DYNSYMSUSESEGIDX 0x08
-+#define EF_ARM_MAPSYMSFIRST 0x10
-+#define EF_ARM_EABIMASK 0XFF000000
-+
-+/* Constants defined in AAELF. */
-+#define EF_ARM_BE8 0x00800000
-+#define EF_ARM_LE8 0x00400000
-+
-+#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
-+#define EF_ARM_EABI_UNKNOWN 0x00000000
-+#define EF_ARM_EABI_VER1 0x01000000
-+#define EF_ARM_EABI_VER2 0x02000000
-+#define EF_ARM_EABI_VER3 0x03000000
-+#define EF_ARM_EABI_VER4 0x04000000
-+#define EF_ARM_EABI_VER5 0x05000000
-+
-+/* Additional symbol types for Thumb. */
-+#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
-+#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
-+
-+/* ARM-specific values for sh_flags */
-+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
-+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
-+ in the input to a link step. */
-+
-+/* ARM-specific program header flags */
-+#define PF_ARM_SB 0x10000000 /* Segment contains the location
-+ addressed by the static base. */
-+#define PF_ARM_PI 0x20000000 /* Position-independent segment. */
-+#define PF_ARM_ABS 0x40000000 /* Absolute segment. */
-+
-+/* Processor specific values for the Phdr p_type field. */
-+#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */
-+
-+/* Processor specific values for the Shdr sh_type field. */
-+#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */
-+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */
-+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */
-+
-+
-+/* ARM relocs. */
-+
-+#define R_ARM_NONE 0 /* No reloc */
-+#define R_ARM_PC24 1 /* PC relative 26 bit branch */
-+#define R_ARM_ABS32 2 /* Direct 32 bit */
-+#define R_ARM_REL32 3 /* PC relative 32 bit */
-+#define R_ARM_PC13 4
-+#define R_ARM_ABS16 5 /* Direct 16 bit */
-+#define R_ARM_ABS12 6 /* Direct 12 bit */
-+#define R_ARM_THM_ABS5 7
-+#define R_ARM_ABS8 8 /* Direct 8 bit */
-+#define R_ARM_SBREL32 9
-+#define R_ARM_THM_PC22 10
-+#define R_ARM_THM_PC8 11
-+#define R_ARM_AMP_VCALL9 12
-+#define R_ARM_SWI24 13 /* Obsolete static relocation. */
-+#define R_ARM_TLS_DESC 13 /* Dynamic relocation. */
-+#define R_ARM_THM_SWI8 14
-+#define R_ARM_XPC25 15
-+#define R_ARM_THM_XPC22 16
-+#define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */
-+#define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */
-+#define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */
-+#define R_ARM_COPY 20 /* Copy symbol at runtime */
-+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
-+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
-+#define R_ARM_RELATIVE 23 /* Adjust by program base */
-+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
-+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
-+#define R_ARM_GOT32 26 /* 32 bit GOT entry */
-+#define R_ARM_PLT32 27 /* 32 bit PLT address */
-+#define R_ARM_ALU_PCREL_7_0 32
-+#define R_ARM_ALU_PCREL_15_8 33
-+#define R_ARM_ALU_PCREL_23_15 34
-+#define R_ARM_LDR_SBREL_11_0 35
-+#define R_ARM_ALU_SBREL_19_12 36
-+#define R_ARM_ALU_SBREL_27_20 37
-+#define R_ARM_TLS_GOTDESC 90
-+#define R_ARM_TLS_CALL 91
-+#define R_ARM_TLS_DESCSEQ 92
-+#define R_ARM_THM_TLS_CALL 93
-+#define R_ARM_GNU_VTENTRY 100
-+#define R_ARM_GNU_VTINHERIT 101
-+#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
-+#define R_ARM_THM_PC9 103 /* thumb conditional branch */
-+#define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic
-+ thread local data */
-+#define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic
-+ thread local data */
-+#define R_ARM_TLS_LDO32 106 /* 32 bit offset relative to TLS
-+ block */
-+#define R_ARM_TLS_IE32 107 /* PC-rel 32 bit for GOT entry of
-+ static TLS block offset */
-+#define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static
-+ TLS block */
-+#define R_ARM_THM_TLS_DESCSEQ 129
-+#define R_ARM_IRELATIVE 160
-+#define R_ARM_RXPC25 249
-+#define R_ARM_RSBREL32 250
-+#define R_ARM_THM_RPC22 251
-+#define R_ARM_RREL32 252
-+#define R_ARM_RABS22 253
-+#define R_ARM_RPC24 254
-+#define R_ARM_RBASE 255
-+/* Keep this the last entry. */
-+#define R_ARM_NUM 256
-+
-+/* IA-64 specific declarations. */
-+
-+/* Processor specific flags for the Ehdr e_flags field. */
-+#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
-+#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
-+#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
-+
-+/* Processor specific values for the Phdr p_type field. */
-+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
-+#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
-+#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12)
-+#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13)
-+#define PT_IA_64_HP_STACK (PT_LOOS + 0x14)
-+
-+/* Processor specific flags for the Phdr p_flags field. */
-+#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
-+
-+/* Processor specific values for the Shdr sh_type field. */
-+#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
-+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
-+
-+/* Processor specific flags for the Shdr sh_flags field. */
-+#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
-+#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
-+
-+/* Processor specific values for the Dyn d_tag field. */
-+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
-+#define DT_IA_64_NUM 1
-+
-+/* IA-64 relocations. */
-+#define R_IA64_NONE 0x00 /* none */
-+#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
-+#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
-+#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
-+#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
-+#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
-+#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
-+#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
-+#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
-+#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
-+#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
-+#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
-+#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
-+#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
-+#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
-+#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
-+#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
-+#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
-+#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
-+#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
-+#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
-+#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
-+#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
-+#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
-+#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
-+#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
-+#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
-+#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
-+#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
-+#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
-+#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
-+#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
-+#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
-+#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
-+#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
-+#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
-+#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
-+#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
-+#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
-+#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
-+#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
-+#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
-+#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
-+#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
-+#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
-+#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
-+#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
-+#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
-+#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
-+#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
-+#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
-+#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
-+#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
-+#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
-+#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
-+#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
-+#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
-+#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
-+#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
-+#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
-+#define R_IA64_COPY 0x84 /* copy relocation */
-+#define R_IA64_SUB 0x85 /* Addend and symbol difference */
-+#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
-+#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
-+#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
-+#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
-+#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
-+#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
-+#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
-+#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
-+#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
-+#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
-+#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
-+#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
-+#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
-+#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
-+#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
-+#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
-+#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
-+#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
-+#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
-+
-+/* SH specific declarations */
-+
-+/* Processor specific flags for the ELF header e_flags field. */
-+#define EF_SH_MACH_MASK 0x1f
-+#define EF_SH_UNKNOWN 0x0
-+#define EF_SH1 0x1
-+#define EF_SH2 0x2
-+#define EF_SH3 0x3
-+#define EF_SH_DSP 0x4
-+#define EF_SH3_DSP 0x5
-+#define EF_SH4AL_DSP 0x6
-+#define EF_SH3E 0x8
-+#define EF_SH4 0x9
-+#define EF_SH2E 0xb
-+#define EF_SH4A 0xc
-+#define EF_SH2A 0xd
-+#define EF_SH4_NOFPU 0x10
-+#define EF_SH4A_NOFPU 0x11
-+#define EF_SH4_NOMMU_NOFPU 0x12
-+#define EF_SH2A_NOFPU 0x13
-+#define EF_SH3_NOMMU 0x14
-+#define EF_SH2A_SH4_NOFPU 0x15
-+#define EF_SH2A_SH3_NOFPU 0x16
-+#define EF_SH2A_SH4 0x17
-+#define EF_SH2A_SH3E 0x18
-+
-+/* SH relocs. */
-+#define R_SH_NONE 0
-+#define R_SH_DIR32 1
-+#define R_SH_REL32 2
-+#define R_SH_DIR8WPN 3
-+#define R_SH_IND12W 4
-+#define R_SH_DIR8WPL 5
-+#define R_SH_DIR8WPZ 6
-+#define R_SH_DIR8BP 7
-+#define R_SH_DIR8W 8
-+#define R_SH_DIR8L 9
-+#define R_SH_SWITCH16 25
-+#define R_SH_SWITCH32 26
-+#define R_SH_USES 27
-+#define R_SH_COUNT 28
-+#define R_SH_ALIGN 29
-+#define R_SH_CODE 30
-+#define R_SH_DATA 31
-+#define R_SH_LABEL 32
-+#define R_SH_SWITCH8 33
-+#define R_SH_GNU_VTINHERIT 34
-+#define R_SH_GNU_VTENTRY 35
-+#define R_SH_TLS_GD_32 144
-+#define R_SH_TLS_LD_32 145
-+#define R_SH_TLS_LDO_32 146
-+#define R_SH_TLS_IE_32 147
-+#define R_SH_TLS_LE_32 148
-+#define R_SH_TLS_DTPMOD32 149
-+#define R_SH_TLS_DTPOFF32 150
-+#define R_SH_TLS_TPOFF32 151
-+#define R_SH_GOT32 160
-+#define R_SH_PLT32 161
-+#define R_SH_COPY 162
-+#define R_SH_GLOB_DAT 163
-+#define R_SH_JMP_SLOT 164
-+#define R_SH_RELATIVE 165
-+#define R_SH_GOTOFF 166
-+#define R_SH_GOTPC 167
-+/* Keep this the last entry. */
-+#define R_SH_NUM 256
-+
-+/* S/390 specific definitions. */
-+
-+/* Valid values for the e_flags field. */
-+
-+#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */
-+
-+/* Additional s390 relocs */
-+
-+#define R_390_NONE 0 /* No reloc. */
-+#define R_390_8 1 /* Direct 8 bit. */
-+#define R_390_12 2 /* Direct 12 bit. */
-+#define R_390_16 3 /* Direct 16 bit. */
-+#define R_390_32 4 /* Direct 32 bit. */
-+#define R_390_PC32 5 /* PC relative 32 bit. */
-+#define R_390_GOT12 6 /* 12 bit GOT offset. */
-+#define R_390_GOT32 7 /* 32 bit GOT offset. */
-+#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
-+#define R_390_COPY 9 /* Copy symbol at runtime. */
-+#define R_390_GLOB_DAT 10 /* Create GOT entry. */
-+#define R_390_JMP_SLOT 11 /* Create PLT entry. */
-+#define R_390_RELATIVE 12 /* Adjust by program base. */
-+#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */
-+#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */
-+#define R_390_GOT16 15 /* 16 bit GOT offset. */
-+#define R_390_PC16 16 /* PC relative 16 bit. */
-+#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
-+#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */
-+#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */
-+#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */
-+#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */
-+#define R_390_64 22 /* Direct 64 bit. */
-+#define R_390_PC64 23 /* PC relative 64 bit. */
-+#define R_390_GOT64 24 /* 64 bit GOT offset. */
-+#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */
-+#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */
-+#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */
-+#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */
-+#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */
-+#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */
-+#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */
-+#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */
-+#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */
-+#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */
-+#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */
-+#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */
-+#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */
-+#define R_390_TLS_GDCALL 38 /* Tag for function call in general
-+ dynamic TLS code. */
-+#define R_390_TLS_LDCALL 39 /* Tag for function call in local
-+ dynamic TLS code. */
-+#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic
-+ thread local data. */
-+#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic
-+ thread local data. */
-+#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS
-+ block offset. */
-+#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS
-+ block offset. */
-+#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS
-+ block offset. */
-+#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic
-+ thread local data in LE code. */
-+#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic
-+ thread local data in LE code. */
-+#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for
-+ negated static TLS block offset. */
-+#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for
-+ negated static TLS block offset. */
-+#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for
-+ negated static TLS block offset. */
-+#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to
-+ static TLS block. */
-+#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to
-+ static TLS block. */
-+#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS
-+ block. */
-+#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS
-+ block. */
-+#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */
-+#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */
-+#define R_390_TLS_TPOFF 56 /* Negated offset in static TLS
-+ block. */
-+#define R_390_20 57 /* Direct 20 bit. */
-+#define R_390_GOT20 58 /* 20 bit GOT offset. */
-+#define R_390_GOTPLT20 59 /* 20 bit offset to jump slot. */
-+#define R_390_TLS_GOTIE20 60 /* 20 bit GOT offset for static TLS
-+ block offset. */
-+#define R_390_IRELATIVE 61 /* STT_GNU_IFUNC relocation. */
-+/* Keep this the last entry. */
-+#define R_390_NUM 62
-+
-+
-+/* CRIS relocations. */
-+#define R_CRIS_NONE 0
-+#define R_CRIS_8 1
-+#define R_CRIS_16 2
-+#define R_CRIS_32 3
-+#define R_CRIS_8_PCREL 4
-+#define R_CRIS_16_PCREL 5
-+#define R_CRIS_32_PCREL 6
-+#define R_CRIS_GNU_VTINHERIT 7
-+#define R_CRIS_GNU_VTENTRY 8
-+#define R_CRIS_COPY 9
-+#define R_CRIS_GLOB_DAT 10
-+#define R_CRIS_JUMP_SLOT 11
-+#define R_CRIS_RELATIVE 12
-+#define R_CRIS_16_GOT 13
-+#define R_CRIS_32_GOT 14
-+#define R_CRIS_16_GOTPLT 15
-+#define R_CRIS_32_GOTPLT 16
-+#define R_CRIS_32_GOTREL 17
-+#define R_CRIS_32_PLT_GOTREL 18
-+#define R_CRIS_32_PLT_PCREL 19
-+
-+#define R_CRIS_NUM 20
-+
-+
-+/* AMD x86-64 relocations. */
-+#define R_X86_64_NONE 0 /* No reloc */
-+#define R_X86_64_64 1 /* Direct 64 bit */
-+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */
-+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */
-+#define R_X86_64_PLT32 4 /* 32 bit PLT address */
-+#define R_X86_64_COPY 5 /* Copy symbol at runtime */
-+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
-+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
-+#define R_X86_64_RELATIVE 8 /* Adjust by program base */
-+#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative
-+ offset to GOT */
-+#define R_X86_64_32 10 /* Direct 32 bit zero extended */
-+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */
-+#define R_X86_64_16 12 /* Direct 16 bit zero extended */
-+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
-+#define R_X86_64_8 14 /* Direct 8 bit sign extended */
-+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
-+#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */
-+#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */
-+#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */
-+#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset
-+ to two GOT entries for GD symbol */
-+#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset
-+ to two GOT entries for LD symbol */
-+#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */
-+#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset
-+ to GOT entry for IE symbol */
-+#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */
-+#define R_X86_64_PC64 24 /* PC relative 64 bit */
-+#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */
-+#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative
-+ offset to GOT */
-+#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */
-+#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset
-+ to GOT entry */
-+#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */
-+#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */
-+#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset
-+ to PLT entry */
-+#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */
-+#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */
-+#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */
-+#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS
-+ descriptor. */
-+#define R_X86_64_TLSDESC 36 /* TLS descriptor. */
-+#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
-+#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */
-+
-+#define R_X86_64_NUM 39
-+
-+
-+/* AM33 relocations. */
-+#define R_MN10300_NONE 0 /* No reloc. */
-+#define R_MN10300_32 1 /* Direct 32 bit. */
-+#define R_MN10300_16 2 /* Direct 16 bit. */
-+#define R_MN10300_8 3 /* Direct 8 bit. */
-+#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */
-+#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */
-+#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */
-+#define R_MN10300_GNU_VTINHERIT 7 /* Ancient C++ vtable garbage... */
-+#define R_MN10300_GNU_VTENTRY 8 /* ... collection annotation. */
-+#define R_MN10300_24 9 /* Direct 24 bit. */
-+#define R_MN10300_GOTPC32 10 /* 32-bit PCrel offset to GOT. */
-+#define R_MN10300_GOTPC16 11 /* 16-bit PCrel offset to GOT. */
-+#define R_MN10300_GOTOFF32 12 /* 32-bit offset from GOT. */
-+#define R_MN10300_GOTOFF24 13 /* 24-bit offset from GOT. */
-+#define R_MN10300_GOTOFF16 14 /* 16-bit offset from GOT. */
-+#define R_MN10300_PLT32 15 /* 32-bit PCrel to PLT entry. */
-+#define R_MN10300_PLT16 16 /* 16-bit PCrel to PLT entry. */
-+#define R_MN10300_GOT32 17 /* 32-bit offset to GOT entry. */
-+#define R_MN10300_GOT24 18 /* 24-bit offset to GOT entry. */
-+#define R_MN10300_GOT16 19 /* 16-bit offset to GOT entry. */
-+#define R_MN10300_COPY 20 /* Copy symbol at runtime. */
-+#define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */
-+#define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */
-+#define R_MN10300_RELATIVE 23 /* Adjust by program base. */
-+
-+#define R_MN10300_NUM 24
-+
-+
-+/* M32R relocs. */
-+#define R_M32R_NONE 0 /* No reloc. */
-+#define R_M32R_16 1 /* Direct 16 bit. */
-+#define R_M32R_32 2 /* Direct 32 bit. */
-+#define R_M32R_24 3 /* Direct 24 bit. */
-+#define R_M32R_10_PCREL 4 /* PC relative 10 bit shifted. */
-+#define R_M32R_18_PCREL 5 /* PC relative 18 bit shifted. */
-+#define R_M32R_26_PCREL 6 /* PC relative 26 bit shifted. */
-+#define R_M32R_HI16_ULO 7 /* High 16 bit with unsigned low. */
-+#define R_M32R_HI16_SLO 8 /* High 16 bit with signed low. */
-+#define R_M32R_LO16 9 /* Low 16 bit. */
-+#define R_M32R_SDA16 10 /* 16 bit offset in SDA. */
-+#define R_M32R_GNU_VTINHERIT 11
-+#define R_M32R_GNU_VTENTRY 12
-+/* M32R relocs use SHT_RELA. */
-+#define R_M32R_16_RELA 33 /* Direct 16 bit. */
-+#define R_M32R_32_RELA 34 /* Direct 32 bit. */
-+#define R_M32R_24_RELA 35 /* Direct 24 bit. */
-+#define R_M32R_10_PCREL_RELA 36 /* PC relative 10 bit shifted. */
-+#define R_M32R_18_PCREL_RELA 37 /* PC relative 18 bit shifted. */
-+#define R_M32R_26_PCREL_RELA 38 /* PC relative 26 bit shifted. */
-+#define R_M32R_HI16_ULO_RELA 39 /* High 16 bit with unsigned low */
-+#define R_M32R_HI16_SLO_RELA 40 /* High 16 bit with signed low */
-+#define R_M32R_LO16_RELA 41 /* Low 16 bit */
-+#define R_M32R_SDA16_RELA 42 /* 16 bit offset in SDA */
-+#define R_M32R_RELA_GNU_VTINHERIT 43
-+#define R_M32R_RELA_GNU_VTENTRY 44
-+#define R_M32R_REL32 45 /* PC relative 32 bit. */
-+
-+#define R_M32R_GOT24 48 /* 24 bit GOT entry */
-+#define R_M32R_26_PLTREL 49 /* 26 bit PC relative to PLT shifted */
-+#define R_M32R_COPY 50 /* Copy symbol at runtime */
-+#define R_M32R_GLOB_DAT 51 /* Create GOT entry */
-+#define R_M32R_JMP_SLOT 52 /* Create PLT entry */
-+#define R_M32R_RELATIVE 53 /* Adjust by program base */
-+#define R_M32R_GOTOFF 54 /* 24 bit offset to GOT */
-+#define R_M32R_GOTPC24 55 /* 24 bit PC relative offset to GOT */
-+#define R_M32R_GOT16_HI_ULO 56 /* High 16 bit GOT entry with unsigned
-+ low */
-+#define R_M32R_GOT16_HI_SLO 57 /* High 16 bit GOT entry with signed
-+ low */
-+#define R_M32R_GOT16_LO 58 /* Low 16 bit GOT entry */
-+#define R_M32R_GOTPC_HI_ULO 59 /* High 16 bit PC relative offset to
-+ GOT with unsigned low */
-+#define R_M32R_GOTPC_HI_SLO 60 /* High 16 bit PC relative offset to
-+ GOT with signed low */
-+#define R_M32R_GOTPC_LO 61 /* Low 16 bit PC relative offset to
-+ GOT */
-+#define R_M32R_GOTOFF_HI_ULO 62 /* High 16 bit offset to GOT
-+ with unsigned low */
-+#define R_M32R_GOTOFF_HI_SLO 63 /* High 16 bit offset to GOT
-+ with signed low */
-+#define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */
-+#define R_M32R_NUM 256 /* Keep this the last entry. */
-+
-+
-+/* TILEPro relocations. */
-+#define R_TILEPRO_NONE 0 /* No reloc */
-+#define R_TILEPRO_32 1 /* Direct 32 bit */
-+#define R_TILEPRO_16 2 /* Direct 16 bit */
-+#define R_TILEPRO_8 3 /* Direct 8 bit */
-+#define R_TILEPRO_32_PCREL 4 /* PC relative 32 bit */
-+#define R_TILEPRO_16_PCREL 5 /* PC relative 16 bit */
-+#define R_TILEPRO_8_PCREL 6 /* PC relative 8 bit */
-+#define R_TILEPRO_LO16 7 /* Low 16 bit */
-+#define R_TILEPRO_HI16 8 /* High 16 bit */
-+#define R_TILEPRO_HA16 9 /* High 16 bit, adjusted */
-+#define R_TILEPRO_COPY 10 /* Copy relocation */
-+#define R_TILEPRO_GLOB_DAT 11 /* Create GOT entry */
-+#define R_TILEPRO_JMP_SLOT 12 /* Create PLT entry */
-+#define R_TILEPRO_RELATIVE 13 /* Adjust by program base */
-+#define R_TILEPRO_BROFF_X1 14 /* X1 pipe branch offset */
-+#define R_TILEPRO_JOFFLONG_X1 15 /* X1 pipe jump offset */
-+#define R_TILEPRO_JOFFLONG_X1_PLT 16 /* X1 pipe jump offset to PLT */
-+#define R_TILEPRO_IMM8_X0 17 /* X0 pipe 8-bit */
-+#define R_TILEPRO_IMM8_Y0 18 /* Y0 pipe 8-bit */
-+#define R_TILEPRO_IMM8_X1 19 /* X1 pipe 8-bit */
-+#define R_TILEPRO_IMM8_Y1 20 /* Y1 pipe 8-bit */
-+#define R_TILEPRO_MT_IMM15_X1 21 /* X1 pipe mtspr */
-+#define R_TILEPRO_MF_IMM15_X1 22 /* X1 pipe mfspr */
-+#define R_TILEPRO_IMM16_X0 23 /* X0 pipe 16-bit */
-+#define R_TILEPRO_IMM16_X1 24 /* X1 pipe 16-bit */
-+#define R_TILEPRO_IMM16_X0_LO 25 /* X0 pipe low 16-bit */
-+#define R_TILEPRO_IMM16_X1_LO 26 /* X1 pipe low 16-bit */
-+#define R_TILEPRO_IMM16_X0_HI 27 /* X0 pipe high 16-bit */
-+#define R_TILEPRO_IMM16_X1_HI 28 /* X1 pipe high 16-bit */
-+#define R_TILEPRO_IMM16_X0_HA 29 /* X0 pipe high 16-bit, adjusted */
-+#define R_TILEPRO_IMM16_X1_HA 30 /* X1 pipe high 16-bit, adjusted */
-+#define R_TILEPRO_IMM16_X0_PCREL 31 /* X0 pipe PC relative 16 bit */
-+#define R_TILEPRO_IMM16_X1_PCREL 32 /* X1 pipe PC relative 16 bit */
-+#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */
-+#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */
-+#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */
-+#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */
-+#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */
-+#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */
-+#define R_TILEPRO_IMM16_X0_GOT 39 /* X0 pipe 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X1_GOT 40 /* X1 pipe 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X0_GOT_LO 41 /* X0 pipe low 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X1_GOT_LO 42 /* X1 pipe low 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X0_GOT_HI 43 /* X0 pipe high 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X1_GOT_HI 44 /* X1 pipe high 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X0_GOT_HA 45 /* X0 pipe ha() 16-bit GOT offset */
-+#define R_TILEPRO_IMM16_X1_GOT_HA 46 /* X1 pipe ha() 16-bit GOT offset */
-+#define R_TILEPRO_MMSTART_X0 47 /* X0 pipe mm "start" */
-+#define R_TILEPRO_MMEND_X0 48 /* X0 pipe mm "end" */
-+#define R_TILEPRO_MMSTART_X1 49 /* X1 pipe mm "start" */
-+#define R_TILEPRO_MMEND_X1 50 /* X1 pipe mm "end" */
-+#define R_TILEPRO_SHAMT_X0 51 /* X0 pipe shift amount */
-+#define R_TILEPRO_SHAMT_X1 52 /* X1 pipe shift amount */
-+#define R_TILEPRO_SHAMT_Y0 53 /* Y0 pipe shift amount */
-+#define R_TILEPRO_SHAMT_Y1 54 /* Y1 pipe shift amount */
-+#define R_TILEPRO_DEST_IMM8_X1 55 /* X1 pipe destination 8-bit */
-+/* Relocs 56-59 are currently not defined. */
-+#define R_TILEPRO_TLS_GD_CALL 60 /* "jal" for TLS GD */
-+#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61 /* X0 pipe "addi" for TLS GD */
-+#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62 /* X1 pipe "addi" for TLS GD */
-+#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63 /* Y0 pipe "addi" for TLS GD */
-+#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64 /* Y1 pipe "addi" for TLS GD */
-+#define R_TILEPRO_TLS_IE_LOAD 65 /* "lw_tls" for TLS IE */
-+#define R_TILEPRO_IMM16_X0_TLS_GD 66 /* X0 pipe 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X1_TLS_GD 67 /* X1 pipe 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68 /* X0 pipe low 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69 /* X1 pipe low 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70 /* X0 pipe high 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71 /* X1 pipe high 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72 /* X0 pipe ha() 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73 /* X1 pipe ha() 16-bit TLS GD offset */
-+#define R_TILEPRO_IMM16_X0_TLS_IE 74 /* X0 pipe 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_IE 75 /* X1 pipe 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76 /* X0 pipe low 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77 /* X1 pipe low 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78 /* X0 pipe high 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79 /* X1 pipe high 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80 /* X0 pipe ha() 16-bit TLS IE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81 /* X1 pipe ha() 16-bit TLS IE offset */
-+#define R_TILEPRO_TLS_DTPMOD32 82 /* ID of module containing symbol */
-+#define R_TILEPRO_TLS_DTPOFF32 83 /* Offset in TLS block */
-+#define R_TILEPRO_TLS_TPOFF32 84 /* Offset in static TLS block */
-+#define R_TILEPRO_IMM16_X0_TLS_LE 85 /* X0 pipe 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_LE 86 /* X1 pipe 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87 /* X0 pipe low 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88 /* X1 pipe low 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89 /* X0 pipe high 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90 /* X1 pipe high 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91 /* X0 pipe ha() 16-bit TLS LE offset */
-+#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92 /* X1 pipe ha() 16-bit TLS LE offset */
-+
-+#define R_TILEPRO_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */
-+#define R_TILEPRO_GNU_VTENTRY 129 /* GNU C++ vtable member usage */
-+
-+#define R_TILEPRO_NUM 130
-+
-+
-+/* TILE-Gx relocations. */
-+#define R_TILEGX_NONE 0 /* No reloc */
-+#define R_TILEGX_64 1 /* Direct 64 bit */
-+#define R_TILEGX_32 2 /* Direct 32 bit */
-+#define R_TILEGX_16 3 /* Direct 16 bit */
-+#define R_TILEGX_8 4 /* Direct 8 bit */
-+#define R_TILEGX_64_PCREL 5 /* PC relative 64 bit */
-+#define R_TILEGX_32_PCREL 6 /* PC relative 32 bit */
-+#define R_TILEGX_16_PCREL 7 /* PC relative 16 bit */
-+#define R_TILEGX_8_PCREL 8 /* PC relative 8 bit */
-+#define R_TILEGX_HW0 9 /* hword 0 16-bit */
-+#define R_TILEGX_HW1 10 /* hword 1 16-bit */
-+#define R_TILEGX_HW2 11 /* hword 2 16-bit */
-+#define R_TILEGX_HW3 12 /* hword 3 16-bit */
-+#define R_TILEGX_HW0_LAST 13 /* last hword 0 16-bit */
-+#define R_TILEGX_HW1_LAST 14 /* last hword 1 16-bit */
-+#define R_TILEGX_HW2_LAST 15 /* last hword 2 16-bit */
-+#define R_TILEGX_COPY 16 /* Copy relocation */
-+#define R_TILEGX_GLOB_DAT 17 /* Create GOT entry */
-+#define R_TILEGX_JMP_SLOT 18 /* Create PLT entry */
-+#define R_TILEGX_RELATIVE 19 /* Adjust by program base */
-+#define R_TILEGX_BROFF_X1 20 /* X1 pipe branch offset */
-+#define R_TILEGX_JUMPOFF_X1 21 /* X1 pipe jump offset */
-+#define R_TILEGX_JUMPOFF_X1_PLT 22 /* X1 pipe jump offset to PLT */
-+#define R_TILEGX_IMM8_X0 23 /* X0 pipe 8-bit */
-+#define R_TILEGX_IMM8_Y0 24 /* Y0 pipe 8-bit */
-+#define R_TILEGX_IMM8_X1 25 /* X1 pipe 8-bit */
-+#define R_TILEGX_IMM8_Y1 26 /* Y1 pipe 8-bit */
-+#define R_TILEGX_DEST_IMM8_X1 27 /* X1 pipe destination 8-bit */
-+#define R_TILEGX_MT_IMM14_X1 28 /* X1 pipe mtspr */
-+#define R_TILEGX_MF_IMM14_X1 29 /* X1 pipe mfspr */
-+#define R_TILEGX_MMSTART_X0 30 /* X0 pipe mm "start" */
-+#define R_TILEGX_MMEND_X0 31 /* X0 pipe mm "end" */
-+#define R_TILEGX_SHAMT_X0 32 /* X0 pipe shift amount */
-+#define R_TILEGX_SHAMT_X1 33 /* X1 pipe shift amount */
-+#define R_TILEGX_SHAMT_Y0 34 /* Y0 pipe shift amount */
-+#define R_TILEGX_SHAMT_Y1 35 /* Y1 pipe shift amount */
-+#define R_TILEGX_IMM16_X0_HW0 36 /* X0 pipe hword 0 */
-+#define R_TILEGX_IMM16_X1_HW0 37 /* X1 pipe hword 0 */
-+#define R_TILEGX_IMM16_X0_HW1 38 /* X0 pipe hword 1 */
-+#define R_TILEGX_IMM16_X1_HW1 39 /* X1 pipe hword 1 */
-+#define R_TILEGX_IMM16_X0_HW2 40 /* X0 pipe hword 2 */
-+#define R_TILEGX_IMM16_X1_HW2 41 /* X1 pipe hword 2 */
-+#define R_TILEGX_IMM16_X0_HW3 42 /* X0 pipe hword 3 */
-+#define R_TILEGX_IMM16_X1_HW3 43 /* X1 pipe hword 3 */
-+#define R_TILEGX_IMM16_X0_HW0_LAST 44 /* X0 pipe last hword 0 */
-+#define R_TILEGX_IMM16_X1_HW0_LAST 45 /* X1 pipe last hword 0 */
-+#define R_TILEGX_IMM16_X0_HW1_LAST 46 /* X0 pipe last hword 1 */
-+#define R_TILEGX_IMM16_X1_HW1_LAST 47 /* X1 pipe last hword 1 */
-+#define R_TILEGX_IMM16_X0_HW2_LAST 48 /* X0 pipe last hword 2 */
-+#define R_TILEGX_IMM16_X1_HW2_LAST 49 /* X1 pipe last hword 2 */
-+#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */
-+#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */
-+#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */
-+#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */
-+#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */
-+#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */
-+#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */
-+#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */
-+#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
-+#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
-+#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
-+#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
-+#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
-+#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
-+#define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */
-+#define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */
-+/* Relocs 66-71 are currently not defined. */
-+#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
-+#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
-+#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
-+#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
-+/* Relocs 76-77 are currently not defined. */
-+#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */
-+#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */
-+#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */
-+#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81 /* X1 pipe hword 0 TLS LE offset */
-+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
-+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
-+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
-+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
-+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
-+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
-+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
-+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
-+/* Relocs 90-91 are currently not defined. */
-+#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */
-+#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */
-+/* Relocs 94-99 are currently not defined. */
-+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
-+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
-+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
-+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
-+/* Relocs 104-105 are currently not defined. */
-+#define R_TILEGX_TLS_DTPMOD64 106 /* 64-bit ID of symbol's module */
-+#define R_TILEGX_TLS_DTPOFF64 107 /* 64-bit offset in TLS block */
-+#define R_TILEGX_TLS_TPOFF64 108 /* 64-bit offset in static TLS block */
-+#define R_TILEGX_TLS_DTPMOD32 109 /* 32-bit ID of symbol's module */
-+#define R_TILEGX_TLS_DTPOFF32 110 /* 32-bit offset in TLS block */
-+#define R_TILEGX_TLS_TPOFF32 111 /* 32-bit offset in static TLS block */
-+#define R_TILEGX_TLS_GD_CALL 112 /* "jal" for TLS GD */
-+#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113 /* X0 pipe "addi" for TLS GD */
-+#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114 /* X1 pipe "addi" for TLS GD */
-+#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115 /* Y0 pipe "addi" for TLS GD */
-+#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116 /* Y1 pipe "addi" for TLS GD */
-+#define R_TILEGX_TLS_IE_LOAD 117 /* "ld_tls" for TLS IE */
-+#define R_TILEGX_IMM8_X0_TLS_ADD 118 /* X0 pipe "addi" for TLS GD/IE */
-+#define R_TILEGX_IMM8_X1_TLS_ADD 119 /* X1 pipe "addi" for TLS GD/IE */
-+#define R_TILEGX_IMM8_Y0_TLS_ADD 120 /* Y0 pipe "addi" for TLS GD/IE */
-+#define R_TILEGX_IMM8_Y1_TLS_ADD 121 /* Y1 pipe "addi" for TLS GD/IE */
-+
-+#define R_TILEGX_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */
-+#define R_TILEGX_GNU_VTENTRY 129 /* GNU C++ vtable member usage */
-+
-+#define R_TILEGX_NUM 130
-+
-+#endif /* elf.h */
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -2,7 +2,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -8,7 +8,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "elf.h"
-+#endif
-
- #include "elfconfig.h"
-
diff --git a/target/linux/generic/hack-5.4/211-darwin-uuid-typedef-clash.patch b/target/linux/generic/hack-5.4/211-darwin-uuid-typedef-clash.patch
deleted file mode 100644
index 50a6227148..0000000000
--- a/target/linux/generic/hack-5.4/211-darwin-uuid-typedef-clash.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From e44fc2af1ddc452b6659d08c16973d65c73b7d0a Mon Sep 17 00:00:00 2001
-From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Date: Wed, 5 Feb 2020 18:36:43 +0000
-Subject: [PATCH] file2alias: build on macos
-
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
----
- scripts/mod/file2alias.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/scripts/mod/file2alias.c
-+++ b/scripts/mod/file2alias.c
-@@ -38,6 +38,9 @@ typedef struct {
- __u8 b[16];
- } guid_t;
-
-+#ifdef __APPLE__
-+#define uuid_t compat_uuid_t
-+#endif
- /* backwards compatibility, don't use in new code */
- typedef struct {
- __u8 b[16];
diff --git a/target/linux/generic/hack-5.4/212-tools_portability.patch b/target/linux/generic/hack-5.4/212-tools_portability.patch
deleted file mode 100644
index 0d8eb6fb9d..0000000000
--- a/target/linux/generic/hack-5.4/212-tools_portability.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:03:16 +0200
-Subject: fix portability of some includes files in tools/ used on the host
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- tools/include/tools/be_byteshift.h | 4 ++++
- tools/include/tools/le_byteshift.h | 4 ++++
- tools/include/tools/linux_types.h | 22 ++++++++++++++++++++++
- 3 files changed, 30 insertions(+)
- create mode 100644 tools/include/tools/linux_types.h
-
---- a/tools/include/tools/be_byteshift.h
-+++ b/tools/include/tools/be_byteshift.h
-@@ -2,6 +2,10 @@
- #ifndef _TOOLS_BE_BYTESHIFT_H
- #define _TOOLS_BE_BYTESHIFT_H
-
-+#ifndef __linux__
-+#include "linux_types.h"
-+#endif
-+
- #include <stdint.h>
-
- static inline uint16_t __get_unaligned_be16(const uint8_t *p)
---- a/tools/include/tools/le_byteshift.h
-+++ b/tools/include/tools/le_byteshift.h
-@@ -2,6 +2,10 @@
- #ifndef _TOOLS_LE_BYTESHIFT_H
- #define _TOOLS_LE_BYTESHIFT_H
-
-+#ifndef __linux__
-+#include "linux_types.h"
-+#endif
-+
- #include <stdint.h>
-
- static inline uint16_t __get_unaligned_le16(const uint8_t *p)
---- /dev/null
-+++ b/tools/include/tools/linux_types.h
-@@ -0,0 +1,26 @@
-+#ifndef __LINUX_TYPES_H
-+#define __LINUX_TYPES_H
-+
-+#include <stdint.h>
-+
-+typedef int8_t __s8;
-+typedef uint8_t __u8;
-+typedef uint8_t __be8;
-+typedef uint8_t __le8;
-+
-+typedef int16_t __s16;
-+typedef uint16_t __u16;
-+typedef uint16_t __be16;
-+typedef uint16_t __le16;
-+
-+typedef int32_t __s32;
-+typedef uint32_t __u32;
-+typedef uint32_t __be32;
-+typedef uint32_t __le32;
-+
-+typedef int64_t __s64;
-+typedef uint64_t __u64;
-+typedef uint64_t __be64;
-+typedef uint64_t __le64;
-+
-+#endif
---- a/tools/include/linux/types.h
-+++ b/tools/include/linux/types.h
-@@ -7,8 +7,12 @@
- #include <stdint.h>
-
- #define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */
-+#ifndef __linux__
-+#include <tools/linux_types.h>
-+#else
- #include <asm/types.h>
- #include <asm/posix_types.h>
-+#endif
-
- struct page;
- struct kmem_cache;
---- a/tools/perf/pmu-events/jevents.c
-+++ b/tools/perf/pmu-events/jevents.c
-@@ -1,4 +1,6 @@
-+#ifdef __linux__
- #define _XOPEN_SOURCE 500 /* needed for nftw() */
-+#endif
- #define _GNU_SOURCE /* needed for asprintf() */
-
- /* Parse event JSON files */
-@@ -35,6 +37,7 @@
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
-+#include <strings.h>
- #include <ctype.h>
- #include <unistd.h>
- #include <stdarg.h>
---- a/tools/perf/pmu-events/json.c
-+++ b/tools/perf/pmu-events/json.c
-@@ -38,7 +38,6 @@
- #include <unistd.h>
- #include "jsmn.h"
- #include "json.h"
--#include <linux/kernel.h>
-
-
- static char *mapfile(const char *fn, size_t *size)
diff --git a/target/linux/generic/hack-5.4/214-spidev_h_portability.patch b/target/linux/generic/hack-5.4/214-spidev_h_portability.patch
deleted file mode 100644
index 415e9a423c..0000000000
--- a/target/linux/generic/hack-5.4/214-spidev_h_portability.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:04:08 +0200
-Subject: kernel: fix linux/spi/spidev.h portability issues with musl
-
-Felix will try to get this define included into musl
-
-lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/spi/spidev.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/include/uapi/linux/spi/spidev.h
-+++ b/include/uapi/linux/spi/spidev.h
-@@ -117,7 +117,7 @@ struct spi_ioc_transfer {
-
- /* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */
- #define SPI_MSGSIZE(N) \
-- ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \
-+ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \
- ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0)
- #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)])
-
diff --git a/target/linux/generic/hack-5.4/220-arm-gc_sections.patch b/target/linux/generic/hack-5.4/220-arm-gc_sections.patch
deleted file mode 100644
index 14e2461797..0000000000
--- a/target/linux/generic/hack-5.4/220-arm-gc_sections.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 15 Jul 2017 23:42:36 +0200
-Subject: use -ffunction-sections, -fdata-sections and --gc-sections
-
-In combination with kernel symbol export stripping this significantly reduces
-the kernel image size. Used on both ARM and MIPS architectures.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- Makefile | 10 +++----
- arch/arm/Kconfig | 1 +
- arch/arm/boot/compressed/Makefile | 1 +
- arch/arm/kernel/vmlinux.lds.S | 26 ++++++++--------
- arch/mips/Kconfig | 1 +
- arch/mips/kernel/vmlinux.lds.S | 4 +--
- include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++-------------------
- 7 files changed, 55 insertions(+), 51 deletions(-)
-
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -112,6 +112,7 @@ config ARM
- select HAVE_UID16
- select HAVE_VIRT_CPU_ACCOUNTING_GEN
- select IRQ_FORCED_THREADING
-+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
- select MODULES_USE_ELF_REL
- select NEED_DMA_MAP_STATE
- select OF_EARLY_FLATTREE if OF
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -108,6 +108,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
- KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
- endif
-+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
-
- # -fstack-protector-strong triggers protection checks in this code,
- # but it is being used too early to link to meaningful stack_chk logic.
---- a/arch/arm/kernel/vmlinux.lds.S
-+++ b/arch/arm/kernel/vmlinux.lds.S
-@@ -73,7 +73,7 @@ SECTIONS
- . = ALIGN(4);
- __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
- __start___ex_table = .;
-- ARM_MMU_KEEP(*(__ex_table))
-+ KEEP(*(__ex_table))
- __stop___ex_table = .;
- }
-
-@@ -100,24 +100,24 @@ SECTIONS
- }
- .init.arch.info : {
- __arch_info_begin = .;
-- *(.arch.info.init)
-+ KEEP(*(.arch.info.init))
- __arch_info_end = .;
- }
- .init.tagtable : {
- __tagtable_begin = .;
-- *(.taglist.init)
-+ KEEP(*(.taglist.init))
- __tagtable_end = .;
- }
- #ifdef CONFIG_SMP_ON_UP
- .init.smpalt : {
- __smpalt_begin = .;
-- *(.alt.smp.init)
-+ KEEP(*(.alt.smp.init))
- __smpalt_end = .;
- }
- #endif
- .init.pv_table : {
- __pv_table_begin = .;
-- *(.pv_table)
-+ KEEP(*(.pv_table))
- __pv_table_end = .;
- }
-
---- a/arch/arm/kernel/vmlinux.lds.h
-+++ b/arch/arm/kernel/vmlinux.lds.h
-@@ -28,7 +28,7 @@
- #define PROC_INFO \
- . = ALIGN(4); \
- __proc_info_begin = .; \
-- *(.proc.info.init) \
-+ KEEP(*(.proc.info.init)) \
- __proc_info_end = .;
-
- #define HYPERVISOR_TEXT \
-@@ -39,11 +39,11 @@
- #define IDMAP_TEXT \
- ALIGN_FUNCTION(); \
- __idmap_text_start = .; \
-- *(.idmap.text) \
-+ KEEP(*(.idmap.text)) \
- __idmap_text_end = .; \
- . = ALIGN(PAGE_SIZE); \
- __hyp_idmap_text_start = .; \
-- *(.hyp.idmap.text) \
-+ KEEP(*(.hyp.idmap.text)) \
- __hyp_idmap_text_end = .;
-
- #define ARM_DISCARD \
-@@ -86,12 +86,12 @@
- . = ALIGN(8); \
- .ARM.unwind_idx : { \
- __start_unwind_idx = .; \
-- *(.ARM.exidx*) \
-+ KEEP(*(.ARM.exidx*)) \
- __stop_unwind_idx = .; \
- } \
- .ARM.unwind_tab : { \
- __start_unwind_tab = .; \
-- *(.ARM.extab*) \
-+ KEEP(*(.ARM.extab*)) \
- __stop_unwind_tab = .; \
- }
-
-@@ -102,14 +102,14 @@
- #define ARM_VECTORS \
- __vectors_start = .; \
- .vectors 0xffff0000 : AT(__vectors_start) { \
-- *(.vectors) \
-+ KEEP(*(.vectors)) \
- } \
- . = __vectors_start + SIZEOF(.vectors); \
- __vectors_end = .; \
- \
- __stubs_start = .; \
- .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) { \
-- *(.stubs) \
-+ KEEP(*(.stubs)) \
- } \
- . = __stubs_start + SIZEOF(.stubs); \
- __stubs_end = .; \
diff --git a/target/linux/generic/hack-5.4/221-module_exports.patch b/target/linux/generic/hack-5.4/221-module_exports.patch
deleted file mode 100644
index 47f40ac5e1..0000000000
--- a/target/linux/generic/hack-5.4/221-module_exports.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:05:53 +0200
-Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image
-
-lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++---
- include/linux/export.h | 9 ++++++++-
- scripts/Makefile.build | 2 +-
- 3 files changed, 24 insertions(+), 5 deletions(-)
-
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -54,6 +54,16 @@
- #define LOAD_OFFSET 0
- #endif
-
-+#ifndef SYMTAB_KEEP
-+#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*)))
-+#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*)))
-+#endif
-+
-+#ifndef SYMTAB_DISCARD
-+#define SYMTAB_DISCARD
-+#define SYMTAB_DISCARD_GPL
-+#endif
-+
- /* Align . to a 8 byte boundary equals to maximum function alignment. */
- #define ALIGN_FUNCTION() . = ALIGN(8)
-
-@@ -407,14 +417,14 @@
- /* Kernel symbol table: Normal symbols */ \
- __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
- __start___ksymtab = .; \
-- KEEP(*(SORT(___ksymtab+*))) \
-+ SYMTAB_KEEP \
- __stop___ksymtab = .; \
- } \
- \
- /* Kernel symbol table: GPL-only symbols */ \
- __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \
- __start___ksymtab_gpl = .; \
-- KEEP(*(SORT(___ksymtab_gpl+*))) \
-+ SYMTAB_KEEP_GPL \
- __stop___ksymtab_gpl = .; \
- } \
- \
-@@ -476,7 +486,7 @@
- \
- /* Kernel symbol table: strings */ \
- __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
-- *(__ksymtab_strings) \
-+ *(__ksymtab_strings+*) \
- } \
- \
- /* __*init sections */ \
-@@ -905,6 +915,8 @@
- EXIT_TEXT \
- EXIT_DATA \
- EXIT_CALL \
-+ SYMTAB_DISCARD \
-+ SYMTAB_DISCARD_GPL \
- *(.discard) \
- *(.discard.*) \
- *(.modinfo) \
---- a/include/linux/export.h
-+++ b/include/linux/export.h
-@@ -98,18 +98,26 @@ struct kernel_symbol {
-
- #else
-
-+#ifdef MODULE
-+#define __EXPORT_SUFFIX(sym)
-+#else
-+#define __EXPORT_SUFFIX(sym) "+" #sym
-+#endif
-+
- #define ___export_symbol_common(sym, sec) \
- extern typeof(sym) sym; \
- __CRC_SYMBOL(sym, sec); \
- static const char __kstrtab_##sym[] \
-- __attribute__((section("__ksymtab_strings"), used, aligned(1))) \
-+ __attribute__((section("__ksymtab_strings" \
-+ __EXPORT_SUFFIX(sym)), used, aligned(1))) \
- = #sym \
-
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define ___EXPORT_SYMBOL_NS(sym, sec, ns) \
- ___export_symbol_common(sym, sec); \
- static const char __kstrtabns_##sym[] \
-- __attribute__((section("__ksymtab_strings"), used, aligned(1))) \
-+ __attribute__((section("__ksymtab_strings" \
-+ __EXPORT_SUFFIX(sym)), used, aligned(1))) \
- = #ns; \
- __KSYMTAB_ENTRY_NS(sym, sec)
-
---- a/scripts/Makefile.build
-+++ b/scripts/Makefile.build
-@@ -350,7 +350,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
- # Linker scripts preprocessor (.lds.S -> .lds)
- # ---------------------------------------------------------------------------
- quiet_cmd_cpp_lds_S = LDS $@
-- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
-+ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \
- -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
-
- $(obj)/%.lds: $(src)/%.lds.S FORCE
diff --git a/target/linux/generic/hack-5.4/230-openwrt_lzma_options.patch b/target/linux/generic/hack-5.4/230-openwrt_lzma_options.patch
deleted file mode 100644
index 809ccbc1e5..0000000000
--- a/target/linux/generic/hack-5.4/230-openwrt_lzma_options.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001
-From: Imre Kaloz <kaloz@openwrt.org>
-Date: Fri, 7 Jul 2017 17:06:55 +0200
-Subject: use the openwrt lzma options for now
-
-lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c
-Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
----
- lib/decompress.c | 1 +
- scripts/Makefile.lib | 2 +-
- usr/gen_initramfs_list.sh | 10 +++++-----
- 3 files changed, 7 insertions(+), 6 deletions(-)
-
---- a/lib/decompress.c
-+++ b/lib/decompress.c
-@@ -49,6 +49,7 @@ static const struct compress_format comp
- { {0x1f, 0x9e}, "gzip", gunzip },
- { {0x42, 0x5a}, "bzip2", bunzip2 },
- { {0x5d, 0x00}, "lzma", unlzma },
-+ { {0x6d, 0x00}, "lzma-openwrt", unlzma },
- { {0xfd, 0x37}, "xz", unxz },
- { {0x89, 0x4c}, "lzo", unlzo },
- { {0x02, 0x21}, "lz4", unlz4 },
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -328,7 +328,7 @@ quiet_cmd_bzip2 = BZIP2 $@
- # ---------------------------------------------------------------------------
-
- quiet_cmd_lzma = LZMA $@
-- cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
-+ cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@
-
- quiet_cmd_lzo = LZO $@
- cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@
---- a/usr/gen_initramfs_list.sh
-+++ b/usr/gen_initramfs_list.sh
-@@ -229,7 +229,7 @@ cpio_list=
- output="/dev/stdout"
- output_file=""
- is_cpio_compressed=
--compr="gzip -n -9 -f"
-+compr="gzip -n -9 -f -"
-
- arg="$1"
- case "$arg" in
-@@ -245,13 +245,13 @@ case "$arg" in
- output=${cpio_list}
- echo "$output_file" | grep -q "\.gz$" \
- && [ -x "`which gzip 2> /dev/null`" ] \
-- && compr="gzip -n -9 -f"
-+ && compr="gzip -n -9 -f -"
- echo "$output_file" | grep -q "\.bz2$" \
- && [ -x "`which bzip2 2> /dev/null`" ] \
-- && compr="bzip2 -9 -f"
-+ && compr="bzip2 -9 -f -"
- echo "$output_file" | grep -q "\.lzma$" \
- && [ -x "`which lzma 2> /dev/null`" ] \
-- && compr="lzma -9 -f"
-+ && compr="lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so"
- echo "$output_file" | grep -q "\.xz$" \
- && [ -x "`which xz 2> /dev/null`" ] \
- && compr="xz --check=crc32 --lzma2=dict=1MiB"
-@@ -320,7 +320,7 @@ if [ ! -z ${output_file} ]; then
- if [ "${is_cpio_compressed}" = "compressed" ]; then
- cat ${cpio_tfile} > ${output_file}
- else
-- (cat ${cpio_tfile} | ${compr} - > ${output_file}) \
-+ (cat ${cpio_tfile} | ${compr} > ${output_file}) \
- || (rm -f ${output_file} ; false)
- fi
- [ -z ${cpio_file} ] && rm ${cpio_tfile}
diff --git a/target/linux/generic/hack-5.4/249-udp-tunnel-selection.patch b/target/linux/generic/hack-5.4/249-udp-tunnel-selection.patch
deleted file mode 100644
index 2c74298dfe..0000000000
--- a/target/linux/generic/hack-5.4/249-udp-tunnel-selection.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/ipv4/Kconfig
-+++ b/net/ipv4/Kconfig
-@@ -315,7 +315,7 @@ config NET_IPVTI
- on top.
-
- config NET_UDP_TUNNEL
-- tristate
-+ tristate "IP: UDP tunneling support"
- select NET_IP_TUNNEL
- default n
-
diff --git a/target/linux/generic/hack-5.4/250-netfilter_depends.patch b/target/linux/generic/hack-5.4/250-netfilter_depends.patch
deleted file mode 100644
index d03cb53180..0000000000
--- a/target/linux/generic/hack-5.4/250-netfilter_depends.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: hack: net: remove bogus netfilter dependencies
-
-lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/netfilter/Kconfig | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -228,7 +228,6 @@ config NF_CONNTRACK_FTP
-
- config NF_CONNTRACK_H323
- tristate "H.323 protocol support"
-- depends on IPV6 || IPV6=n
- depends on NETFILTER_ADVANCED
- help
- H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -1088,7 +1087,6 @@ config NETFILTER_XT_TARGET_SECMARK
-
- config NETFILTER_XT_TARGET_TCPMSS
- tristate '"TCPMSS" target support'
-- depends on IPV6 || IPV6=n
- default m if NETFILTER_ADVANCED=n
- ---help---
- This option adds a `TCPMSS' target, which allows you to alter the
diff --git a/target/linux/generic/hack-5.4/251-sound_kconfig.patch b/target/linux/generic/hack-5.4/251-sound_kconfig.patch
deleted file mode 100644
index f593417c9d..0000000000
--- a/target/linux/generic/hack-5.4/251-sound_kconfig.patch
+++ /dev/null
@@ -1,199 +0,0 @@
-From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001
-From: John Crispin <john@phrozen.org>
-Date: Fri, 7 Jul 2017 17:09:21 +0200
-Subject: kconfig: owrt specifc dependencies
-
-Signed-off-by: John Crispin <john@phrozen.org>
----
- crypto/Kconfig | 10 +++++-----
- drivers/bcma/Kconfig | 1 +
- drivers/ssb/Kconfig | 3 ++-
- lib/Kconfig | 8 ++++----
- net/netfilter/Kconfig | 2 +-
- net/wireless/Kconfig | 17 ++++++++++-------
- sound/core/Kconfig | 4 ++--
- 7 files changed, 25 insertions(+), 20 deletions(-)
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -33,7 +33,7 @@ config CRYPTO_FIPS
- this is.
-
- config CRYPTO_ALGAPI
-- tristate
-+ tristate "ALGAPI"
- select CRYPTO_ALGAPI2
- help
- This option provides the API for cryptographic algorithms.
-@@ -42,7 +42,7 @@ config CRYPTO_ALGAPI2
- tristate
-
- config CRYPTO_AEAD
-- tristate
-+ tristate "AEAD"
- select CRYPTO_AEAD2
- select CRYPTO_ALGAPI
-
-@@ -53,7 +53,7 @@ config CRYPTO_AEAD2
- select CRYPTO_RNG2
-
- config CRYPTO_BLKCIPHER
-- tristate
-+ tristate "BLKCIPHER"
- select CRYPTO_BLKCIPHER2
- select CRYPTO_ALGAPI
-
-@@ -63,7 +63,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_RNG2
-
- config CRYPTO_HASH
-- tristate
-+ tristate "HASH"
- select CRYPTO_HASH2
- select CRYPTO_ALGAPI
-
-@@ -72,7 +72,7 @@ config CRYPTO_HASH2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_RNG
-- tristate
-+ tristate "RNG"
- select CRYPTO_RNG2
- select CRYPTO_ALGAPI
-
---- a/drivers/bcma/Kconfig
-+++ b/drivers/bcma/Kconfig
-@@ -16,6 +16,7 @@ if BCMA
- # Support for Block-I/O. SELECT this from the driver that needs it.
- config BCMA_BLOCKIO
- bool
-+ default y
-
- config BCMA_HOST_PCI_POSSIBLE
- bool
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -29,6 +29,7 @@ config SSB_SPROM
- config SSB_BLOCKIO
- bool
- depends on SSB
-+ default y
-
- config SSB_PCIHOST_POSSIBLE
- bool
-@@ -49,7 +50,7 @@ config SSB_PCIHOST
- config SSB_B43_PCI_BRIDGE
- bool
- depends on SSB_PCIHOST
-- default n
-+ default y
-
- config SSB_PCMCIAHOST_POSSIBLE
- bool
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -402,16 +402,16 @@ config BCH_CONST_T
- # Textsearch support is select'ed if needed
- #
- config TEXTSEARCH
-- bool
-+ bool "Textsearch support"
-
- config TEXTSEARCH_KMP
-- tristate
-+ tristate "Textsearch KMP"
-
- config TEXTSEARCH_BM
-- tristate
-+ tristate "Textsearch BM"
-
- config TEXTSEARCH_FSM
-- tristate
-+ tristate "Textsearch FSM"
-
- config BTREE
- bool
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -11,7 +11,7 @@ config NETFILTER_INGRESS
- infrastructure.
-
- config NETFILTER_NETLINK
-- tristate
-+ tristate "Netfilter NFNETLINK interface"
-
- config NETFILTER_FAMILY_BRIDGE
- bool
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -1,6 +1,6 @@
- # SPDX-License-Identifier: GPL-2.0-only
- config WIRELESS_EXT
-- bool
-+ bool "Wireless extensions"
-
- config WEXT_CORE
- def_bool y
-@@ -12,10 +12,10 @@ config WEXT_PROC
- depends on WEXT_CORE
-
- config WEXT_SPY
-- bool
-+ bool "WEXT_SPY"
-
- config WEXT_PRIV
-- bool
-+ bool "WEXT_PRIV"
-
- config CFG80211
- tristate "cfg80211 - wireless configuration API"
-@@ -203,7 +203,7 @@ config CFG80211_WEXT_EXPORT
- endif # CFG80211
-
- config LIB80211
-- tristate
-+ tristate "LIB80211"
- default n
- help
- This options enables a library of common routines used
-@@ -212,17 +212,17 @@ config LIB80211
- Drivers should select this themselves if needed.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "LIB80211_CRYPT_WEP"
- select CRYPTO_LIB_ARC4
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "LIB80211_CRYPT_CCMP"
- select CRYPTO
- select CRYPTO_AES
- select CRYPTO_CCM
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "LIB80211_CRYPT_TKIP"
- select CRYPTO_LIB_ARC4
-
- config LIB80211_DEBUG
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM
- tristate
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
-
- config SND_SEQ_DEVICE
- tristate
-@@ -27,7 +27,7 @@ config SND_RAWMIDI
- select SND_SEQ_DEVICE if SND_SEQUENCER != n
-
- config SND_COMPRESS_OFFLOAD
-- tristate
-+ tristate "Compression offloading support"
-
- config SND_JACK
- bool
diff --git a/target/linux/generic/hack-5.4/259-regmap_dynamic.patch b/target/linux/generic/hack-5.4/259-regmap_dynamic.patch
deleted file mode 100644
index 812e182467..0000000000
--- a/target/linux/generic/hack-5.4/259-regmap_dynamic.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 15 Jul 2017 21:12:38 +0200
-Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules
-
-lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/base/regmap/Kconfig | 15 ++++++++++-----
- drivers/base/regmap/Makefile | 12 ++++++++----
- drivers/base/regmap/regmap.c | 3 +++
- include/linux/regmap.h | 2 +-
- 4 files changed, 22 insertions(+), 10 deletions(-)
-
---- a/drivers/base/regmap/Kconfig
-+++ b/drivers/base/regmap/Kconfig
-@@ -4,9 +4,8 @@
- # subsystems should select the appropriate symbols.
-
- config REGMAP
-- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SCCB || REGMAP_I3C)
- select IRQ_DOMAIN if REGMAP_IRQ
-- bool
-+ tristate
-
- config REGCACHE_COMPRESSED
- select LZO_COMPRESS
-@@ -18,38 +17,49 @@ config REGMAP_AC97
-
- config REGMAP_I2C
- tristate
-+ select REGMAP
- depends on I2C
-
- config REGMAP_SLIMBUS
- tristate
-+ select REGMAP
- depends on SLIMBUS
-
- config REGMAP_SPI
- tristate
-+ select REGMAP
-+ depends on SPI_MASTER
- depends on SPI
-
- config REGMAP_SPMI
- tristate
-+ select REGMAP
- depends on SPMI
-
- config REGMAP_W1
- tristate
-+ select REGMAP
- depends on W1
-
- config REGMAP_MMIO
- tristate
-+ select REGMAP
-
- config REGMAP_IRQ
- bool
-+ select REGMAP
-
- config REGMAP_SOUNDWIRE
- tristate
-+ select REGMAP
- depends on SOUNDWIRE
-
- config REGMAP_SCCB
- tristate
-+ select REGMAP
- depends on I2C
-
- config REGMAP_I3C
- tristate
-+ select REGMAP
- depends on I3C
---- a/drivers/base/regmap/Makefile
-+++ b/drivers/base/regmap/Makefile
-@@ -2,10 +2,14 @@
- # For include/trace/define_trace.h to include trace.h
- CFLAGS_regmap.o := -I$(src)
-
--obj-$(CONFIG_REGMAP) += regmap.o regcache.o
--obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o
--obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o
--obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o
-+regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-flat.o
-+ifdef CONFIG_DEBUG_FS
-+regmap-core-objs += regmap-debugfs.o
-+endif
-+ifdef CONFIG_REGCACHE_COMPRESSED
-+regmap-core-objs += regcache-lzo.o
-+endif
-+obj-$(CONFIG_REGMAP) += regmap-core.o
- obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o
- obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
- obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o
---- a/drivers/base/regmap/regmap.c
-+++ b/drivers/base/regmap/regmap.c
-@@ -9,6 +9,7 @@
- #include <linux/device.h>
- #include <linux/slab.h>
- #include <linux/export.h>
-+#include <linux/module.h>
- #include <linux/mutex.h>
- #include <linux/err.h>
- #include <linux/of.h>
-@@ -3118,3 +3119,5 @@ static int __init regmap_initcall(void)
- return 0;
- }
- postcore_initcall(regmap_initcall);
-+
-+MODULE_LICENSE("GPL");
---- a/include/linux/regmap.h
-+++ b/include/linux/regmap.h
-@@ -185,7 +185,7 @@ struct reg_sequence {
- pollret ?: ((cond) ? 0 : -ETIMEDOUT); \
- })
-
--#ifdef CONFIG_REGMAP
-+#if IS_REACHABLE(CONFIG_REGMAP)
-
- enum regmap_endian {
- /* Unspecified -> 0 -> Backwards compatible default */
diff --git a/target/linux/generic/hack-5.4/260-crypto_test_dependencies.patch b/target/linux/generic/hack-5.4/260-crypto_test_dependencies.patch
deleted file mode 100644
index c1b0b8551e..0000000000
--- a/target/linux/generic/hack-5.4/260-crypto_test_dependencies.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:12:51 +0200
-Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run
-
-Reduces kernel size after LZMA by about 5k on MIPS
-
-lede-commit: 044c316167e076479a344c59905e5b435b84a77f
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- crypto/Kconfig | 13 ++++++-------
- crypto/algboss.c | 4 ++++
- 2 files changed, 10 insertions(+), 7 deletions(-)
-
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -120,13 +120,13 @@ config CRYPTO_MANAGER
- cbc(aes).
-
- config CRYPTO_MANAGER2
-- def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y)
-- select CRYPTO_AEAD2
-- select CRYPTO_HASH2
-- select CRYPTO_BLKCIPHER2
-- select CRYPTO_AKCIPHER2
-- select CRYPTO_KPP2
-- select CRYPTO_ACOMP2
-+ def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS)
-+ select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS
-+ select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS
-+ select CRYPTO_BLKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS
-+ select CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS
-+ select CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS
-+ select CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS
-
- config CRYPTO_USER
- tristate "Userspace cryptographic algorithm configuration"
---- a/crypto/algboss.c
-+++ b/crypto/algboss.c
-@@ -240,8 +240,12 @@ static int cryptomgr_schedule_test(struc
- type = alg->cra_flags;
-
- /* Do not test internal algorithms. */
-+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
-+ type |= CRYPTO_ALG_TESTED;
-+#else
- if (type & CRYPTO_ALG_INTERNAL)
- type |= CRYPTO_ALG_TESTED;
-+#endif
-
- param->type = type;
-
diff --git a/target/linux/generic/hack-5.4/260-lib-arc4-unhide.patch b/target/linux/generic/hack-5.4/260-lib-arc4-unhide.patch
deleted file mode 100644
index a7668acfad..0000000000
--- a/target/linux/generic/hack-5.4/260-lib-arc4-unhide.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We
-need this to be able to compile this into the kernel and make use of it
-from backports.
-
---- a/lib/crypto/Kconfig
-+++ b/lib/crypto/Kconfig
-@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES
- tristate
-
- config CRYPTO_LIB_ARC4
-- tristate
-+ tristate "ARC4 cipher library"
-
- config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
- tristate
diff --git a/target/linux/generic/hack-5.4/280-rfkill-stubs.patch b/target/linux/generic/hack-5.4/280-rfkill-stubs.patch
deleted file mode 100644
index 2e48aea1cf..0000000000
--- a/target/linux/generic/hack-5.4/280-rfkill-stubs.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001
-From: John Crispin <john@phrozen.org>
-Date: Fri, 7 Jul 2017 17:13:44 +0200
-Subject: rfkill: add fake rfkill support
-
-allow building of modules depending on RFKILL even if RFKILL is not enabled.
-
-Signed-off-by: John Crispin <john@phrozen.org>
----
- include/linux/rfkill.h | 2 +-
- net/Makefile | 2 +-
- net/rfkill/Kconfig | 14 +++++++++-----
- net/rfkill/Makefile | 2 +-
- 4 files changed, 12 insertions(+), 8 deletions(-)
-
---- a/include/linux/rfkill.h
-+++ b/include/linux/rfkill.h
-@@ -64,7 +64,7 @@ struct rfkill_ops {
- int (*set_block)(void *data, bool blocked);
- };
-
--#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-+#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE)
- /**
- * rfkill_alloc - Allocate rfkill structure
- * @name: name of the struct -- the string is not copied internally
---- a/net/Makefile
-+++ b/net/Makefile
-@@ -53,7 +53,7 @@ obj-$(CONFIG_TIPC) += tipc/
- obj-$(CONFIG_NETLABEL) += netlabel/
- obj-$(CONFIG_IUCV) += iucv/
- obj-$(CONFIG_SMC) += smc/
--obj-$(CONFIG_RFKILL) += rfkill/
-+obj-$(CONFIG_RFKILL_FULL) += rfkill/
- obj-$(CONFIG_NET_9P) += 9p/
- obj-$(CONFIG_CAIF) += caif/
- ifneq ($(CONFIG_DCB),)
---- a/net/rfkill/Kconfig
-+++ b/net/rfkill/Kconfig
-@@ -2,7 +2,11 @@
- #
- # RF switch subsystem configuration
- #
--menuconfig RFKILL
-+config RFKILL
-+ bool
-+ default y
-+
-+menuconfig RFKILL_FULL
- tristate "RF switch subsystem support"
- help
- Say Y here if you want to have control over RF switches
-@@ -14,19 +18,19 @@ menuconfig RFKILL
- # LED trigger support
- config RFKILL_LEDS
- bool
-- depends on RFKILL
-+ depends on RFKILL_FULL
- depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS
- default y
-
- config RFKILL_INPUT
- bool "RF switch input support" if EXPERT
-- depends on RFKILL
-+ depends on RFKILL_FULL
- depends on INPUT = y || RFKILL = INPUT
- default y if !EXPERT
-
- config RFKILL_GPIO
- tristate "GPIO RFKILL driver"
-- depends on RFKILL
-+ depends on RFKILL_FULL
- depends on GPIOLIB || COMPILE_TEST
- default n
- help
---- a/net/rfkill/Makefile
-+++ b/net/rfkill/Makefile
-@@ -5,5 +5,5 @@
-
- rfkill-y += core.o
- rfkill-$(CONFIG_RFKILL_INPUT) += input.o
--obj-$(CONFIG_RFKILL) += rfkill.o
-+obj-$(CONFIG_RFKILL_FULL) += rfkill.o
- obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o
diff --git a/target/linux/generic/hack-5.4/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-5.4/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch
deleted file mode 100644
index aed08a5ec9..0000000000
--- a/target/linux/generic/hack-5.4/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From: Ben Menchaca <ben.menchaca@qca.qualcomm.com>
-Date: Fri, 7 Jun 2013 18:35:22 -0500
-Subject: MIPS: r4k_cache: use more efficient cache blast
-
-Optimize the compiler output for larger cache blast cases that are
-common for DMA-based networking.
-
-Signed-off-by: Ben Menchaca <ben.menchaca@qca.qualcomm.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
---- a/arch/mips/include/asm/r4kcache.h
-+++ b/arch/mips/include/asm/r4kcache.h
-@@ -617,14 +617,46 @@ static inline void prot##extra##blast_##
- unsigned long end) \
- { \
- unsigned long lsize = cpu_##desc##_line_size(); \
-+ unsigned long lsize_2 = lsize * 2; \
-+ unsigned long lsize_3 = lsize * 3; \
-+ unsigned long lsize_4 = lsize * 4; \
-+ unsigned long lsize_5 = lsize * 5; \
-+ unsigned long lsize_6 = lsize * 6; \
-+ unsigned long lsize_7 = lsize * 7; \
-+ unsigned long lsize_8 = lsize * 8; \
- unsigned long addr = start & ~(lsize - 1); \
-- unsigned long aend = (end - 1) & ~(lsize - 1); \
-+ unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \
-+ int lines = (aend - addr) / lsize; \
- \
-- while (1) { \
-+ while (lines >= 8) { \
-+ prot##cache_op(hitop, addr); \
-+ prot##cache_op(hitop, addr + lsize); \
-+ prot##cache_op(hitop, addr + lsize_2); \
-+ prot##cache_op(hitop, addr + lsize_3); \
-+ prot##cache_op(hitop, addr + lsize_4); \
-+ prot##cache_op(hitop, addr + lsize_5); \
-+ prot##cache_op(hitop, addr + lsize_6); \
-+ prot##cache_op(hitop, addr + lsize_7); \
-+ addr += lsize_8; \
-+ lines -= 8; \
-+ } \
-+ \
-+ if (lines & 0x4) { \
-+ prot##cache_op(hitop, addr); \
-+ prot##cache_op(hitop, addr + lsize); \
-+ prot##cache_op(hitop, addr + lsize_2); \
-+ prot##cache_op(hitop, addr + lsize_3); \
-+ addr += lsize_4; \
-+ } \
-+ \
-+ if (lines & 0x2) { \
-+ prot##cache_op(hitop, addr); \
-+ prot##cache_op(hitop, addr + lsize); \
-+ addr += lsize_2; \
-+ } \
-+ \
-+ if (lines & 0x1) { \
- prot##cache_op(hitop, addr); \
-- if (addr == aend) \
-- break; \
-- addr += lsize; \
- } \
- }
-
diff --git a/target/linux/generic/hack-5.4/301-mips_image_cmdline_hack.patch b/target/linux/generic/hack-5.4/301-mips_image_cmdline_hack.patch
deleted file mode 100644
index ddae75f614..0000000000
--- a/target/linux/generic/hack-5.4/301-mips_image_cmdline_hack.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: John Crispin <john@phrozen.org>
-Subject: hack: kernel: add generic image_cmdline hack to MIPS targets
-
-lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- arch/mips/Kconfig | 4 ++++
- arch/mips/kernel/head.S | 6 ++++++
- 2 files changed, 10 insertions(+)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1164,6 +1164,10 @@ config SYNC_R4K
- config MIPS_MACHINE
- def_bool n
-
-+config IMAGE_CMDLINE_HACK
-+ bool "OpenWrt specific image command line hack"
-+ default n
-+
- config NO_IOPORT_MAP
- def_bool n
-
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)
- j kernel_entry
- #endif /* CONFIG_BOOT_RAW */
-
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+ .ascii "CMDLINE:"
-+EXPORT(__image_cmdline)
-+ .fill 0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
- __REF
-
- NESTED(kernel_entry, 16, sp) # kernel entry point
diff --git a/target/linux/generic/hack-5.4/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-5.4/321-powerpc_crtsavres_prereq.patch
deleted file mode 100644
index 8591705eae..0000000000
--- a/target/linux/generic/hack-5.4/321-powerpc_crtsavres_prereq.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001
-From: "Alexandros C. Couloumbis" <alex@ozo.com>
-Date: Fri, 7 Jul 2017 17:14:51 +0200
-Subject: hack: arch: powerpc: drop register save/restore library from modules
-
-Upstream GCC uses a libgcc function for saving/restoring registers. This
-makes the code bigger, and upstream kernels need to carry that function
-for every single kernel module. Our GCC is patched to avoid those
-references, so we can drop the extra bloat for modules.
-
-lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec
-Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
----
- arch/powerpc/Makefile | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -61,20 +61,6 @@ machine-$(CONFIG_PPC64) += 64
- machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le
- UTS_MACHINE := $(subst $(space),,$(machine-y))
-
--# XXX This needs to be before we override LD below
--ifdef CONFIG_PPC32
--KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
--else
--KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
--ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
--# Have the linker provide sfpr if possible.
--# There is a corresponding test in arch/powerpc/lib/Makefile
--KBUILD_LDFLAGS_MODULE += --save-restore-funcs
--else
--KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
--endif
--endif
--
- ifdef CONFIG_CPU_LITTLE_ENDIAN
- KBUILD_CFLAGS += -mlittle-endian
- KBUILD_LDFLAGS += -EL
diff --git a/target/linux/generic/hack-5.4/400-block-fit-partition-parser.patch b/target/linux/generic/hack-5.4/400-block-fit-partition-parser.patch
deleted file mode 100644
index 6b3267ef80..0000000000
--- a/target/linux/generic/hack-5.4/400-block-fit-partition-parser.patch
+++ /dev/null
@@ -1,176 +0,0 @@
---- a/block/partitions/Kconfig
-+++ b/block/partitions/Kconfig
-@@ -101,6 +101,13 @@ config ATARI_PARTITION
- Say Y here if you would like to use hard disks under Linux which
- were partitioned under the Atari OS.
-
-+config FIT_PARTITION
-+ bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED
-+ default n
-+ help
-+ Say Y here if your system needs to mount the filesystem part of
-+ a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot.
-+
- config IBM_PARTITION
- bool "IBM disk label and partition support"
- depends on PARTITION_ADVANCED && S390
---- a/block/partitions/Makefile
-+++ b/block/partitions/Makefile
-@@ -9,6 +9,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o
- obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
- obj-$(CONFIG_ATARI_PARTITION) += atari.o
- obj-$(CONFIG_AIX_PARTITION) += aix.o
-+obj-$(CONFIG_FIT_PARTITION) += fit.o
- obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o
- obj-$(CONFIG_MAC_PARTITION) += mac.o
- obj-$(CONFIG_LDM_PARTITION) += ldm.o
---- a/drivers/mtd/ubi/block.c
-+++ b/drivers/mtd/ubi/block.c
-@@ -396,7 +396,7 @@ int ubiblock_create(struct ubi_volume_in
- dev->leb_size = vi->usable_leb_size;
-
- /* Initialize the gendisk of this ubiblock device */
-- gd = alloc_disk(1);
-+ gd = alloc_disk(0);
- if (!gd) {
- pr_err("UBI: block: alloc_disk failed\n");
- ret = -ENODEV;
-@@ -413,6 +413,7 @@ int ubiblock_create(struct ubi_volume_in
- goto out_put_disk;
- }
- gd->private_data = dev;
-+ gd->flags |= GENHD_FL_EXT_DEVT;
- sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
- set_capacity(gd, disk_capacity);
- dev->gd = gd;
---- a/block/partition-generic.c
-+++ b/block/partition-generic.c
-@@ -18,6 +18,10 @@
- #include <linux/ctype.h>
- #include <linux/genhd.h>
- #include <linux/blktrace_api.h>
-+#ifdef CONFIG_FIT_PARTITION
-+#include <linux/root_dev.h>
-+#endif
-+
-
- #include "partitions/check.h"
-
-@@ -180,6 +184,18 @@ ssize_t part_fail_store(struct device *d
- }
- #endif
-
-+static ssize_t part_name_show(struct device *dev,
-+ struct device_attribute *attr, char *buf)
-+{
-+ struct hd_struct *p = dev_to_part(dev);
-+
-+ if (p->info && p->info->volname)
-+ return sprintf(buf, "%s\n", p->info->volname);
-+
-+ buf[0] = '\0';
-+ return 0;
-+}
-+
- static DEVICE_ATTR(partition, 0444, part_partition_show, NULL);
- static DEVICE_ATTR(start, 0444, part_start_show, NULL);
- static DEVICE_ATTR(size, 0444, part_size_show, NULL);
-@@ -188,6 +204,7 @@ static DEVICE_ATTR(alignment_offset, 044
- static DEVICE_ATTR(discard_alignment, 0444, part_discard_alignment_show, NULL);
- static DEVICE_ATTR(stat, 0444, part_stat_show, NULL);
- static DEVICE_ATTR(inflight, 0444, part_inflight_show, NULL);
-+static DEVICE_ATTR(name, 0444, part_name_show, NULL);
- #ifdef CONFIG_FAIL_MAKE_REQUEST
- static struct device_attribute dev_attr_fail =
- __ATTR(make-it-fail, 0644, part_fail_show, part_fail_store);
-@@ -202,6 +219,7 @@ static struct attribute *part_attrs[] =
- &dev_attr_discard_alignment.attr,
- &dev_attr_stat.attr,
- &dev_attr_inflight.attr,
-+ &dev_attr_name.attr,
- #ifdef CONFIG_FAIL_MAKE_REQUEST
- &dev_attr_fail.attr,
- #endif
-@@ -634,6 +652,10 @@ rescan:
- if (state->parts[p].flags & ADDPART_FLAG_RAID)
- md_autodetect_dev(part_to_dev(part)->devt);
- #endif
-+#ifdef CONFIG_FIT_PARTITION
-+ if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0)
-+ ROOT_DEV = part_to_dev(part)->devt;
-+#endif
- }
- free_partitions(state);
- return 0;
---- a/block/partitions/check.c
-+++ b/block/partitions/check.c
-@@ -33,6 +33,7 @@
- #include "ibm.h"
- #include "ultrix.h"
- #include "efi.h"
-+#include "fit.h"
- #include "karma.h"
- #include "sysv68.h"
- #include "cmdline.h"
-@@ -73,6 +74,9 @@ static int (*check_part[])(struct parsed
- #ifdef CONFIG_EFI_PARTITION
- efi_partition, /* this must come before msdos */
- #endif
-+#ifdef CONFIG_FIT_PARTITION
-+ fit_partition,
-+#endif
- #ifdef CONFIG_SGI_PARTITION
- sgi_partition,
- #endif
---- a/include/linux/genhd.h
-+++ b/include/linux/genhd.h
-@@ -614,6 +614,7 @@ struct unixware_disklabel {
- #define ADDPART_FLAG_NONE 0
- #define ADDPART_FLAG_RAID 1
- #define ADDPART_FLAG_WHOLEDISK 2
-+#define ADDPART_FLAG_ROOTDEV 4
-
- extern int blk_alloc_devt(struct hd_struct *part, dev_t *devt);
- extern void blk_free_devt(dev_t devt);
---- /dev/null
-+++ b/block/partitions/fit.h
-@@ -0,0 +1,3 @@
-+/* SPDX-License-Identifier: GPL-2.0-only */
-+int fit_partition(struct parsed_partitions *);
-+int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain);
---- a/block/partitions/efi.c
-+++ b/block/partitions/efi.c
-@@ -681,6 +681,9 @@ int efi_partition(struct parsed_partitio
- gpt_entry *ptes = NULL;
- u32 i;
- unsigned ssz = bdev_logical_block_size(state->bdev) / 512;
-+#ifdef CONFIG_FIT_PARTITION
-+ u32 extra_slot = 64;
-+#endif
-
- if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) {
- kfree(gpt);
-@@ -722,6 +725,11 @@ int efi_partition(struct parsed_partitio
- label_count++;
- }
- state->parts[i + 1].has_info = true;
-+#ifdef CONFIG_FIT_PARTITION
-+ /* If this is a U-Boot FIT volume it may have subpartitions */
-+ if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID))
-+ (void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1);
-+#endif
- }
- kfree(ptes);
- kfree(gpt);
---- a/block/partitions/efi.h
-+++ b/block/partitions/efi.h
-@@ -52,6 +52,9 @@
- #define PARTITION_LINUX_LVM_GUID \
- EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \
- 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
-+#define PARTITION_LINUX_FIT_GUID \
-+ EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \
-+ 0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93)
-
- typedef struct _gpt_header {
- __le64 signature;
diff --git a/target/linux/generic/hack-5.4/400-unlock_mx25l6406e_with_4bit_block_protect.patch b/target/linux/generic/hack-5.4/400-unlock_mx25l6406e_with_4bit_block_protect.patch
deleted file mode 100644
index 8112fa7e13..0000000000
--- a/target/linux/generic/hack-5.4/400-unlock_mx25l6406e_with_4bit_block_protect.patch
+++ /dev/null
@@ -1,69 +0,0 @@
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -196,7 +196,7 @@ struct flash_info {
- u16 page_size;
- u16 addr_width;
-
-- u16 flags;
-+ u32 flags;
- #define SECT_4K BIT(0) /* SPINOR_OP_BE_4K works uniformly */
- #define SPI_NOR_NO_ERASE BIT(1) /* No erase command needed */
- #define SST_WRITE BIT(2) /* use SST byte programming */
-@@ -233,6 +233,10 @@ struct flash_info {
- #define SPI_NOR_SKIP_SFDP BIT(13) /* Skip parsing of SFDP tables */
- #define USE_CLSR BIT(14) /* use CLSR command */
- #define SPI_NOR_OCTAL_READ BIT(15) /* Flash supports Octal Read */
-+#define SPI_NOR_4BIT_BP BIT(17) /*
-+ * Flash SR has 4 bit fields (BP0-3)
-+ * for block protection.
-+ */
-
- /* Part specific fixup hooks. */
- const struct spi_nor_fixups *fixups;
-@@ -1985,6 +1989,9 @@ static int spi_nor_clear_sr_bp(struct sp
- int ret;
- u8 mask = SR_BP2 | SR_BP1 | SR_BP0;
-
-+ if (nor->flags & SNOR_F_HAS_4BIT_BP)
-+ mask |= SR_BP3;
-+
- ret = read_sr(nor);
- if (ret < 0) {
- dev_err(nor->dev, "error while reading status register\n");
-@@ -2338,7 +2345,7 @@ static const struct flash_info spi_nor_i
- { "mx25l1606e", INFO(0xc22015, 0, 64 * 1024, 32, SECT_4K) },
- { "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, SECT_4K) },
- { "mx25l3255e", INFO(0xc29e16, 0, 64 * 1024, 64, SECT_4K) },
-- { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K) },
-+ { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_4BIT_BP) },
- { "mx25u2033e", INFO(0xc22532, 0, 64 * 1024, 4, SECT_4K) },
- { "mx25u3235f", INFO(0xc22536, 0, 64 * 1024, 64,
- SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-@@ -5026,6 +5033,9 @@ int spi_nor_scan(struct spi_nor *nor, co
- if (info->flags & USE_CLSR)
- nor->flags |= SNOR_F_USE_CLSR;
-
-+ if (info->flags & SPI_NOR_4BIT_BP)
-+ nor->flags |= SNOR_F_HAS_4BIT_BP;
-+
- if (info->flags & SPI_NOR_NO_ERASE)
- mtd->flags |= MTD_NO_ERASE;
-
---- a/include/linux/mtd/spi-nor.h
-+++ b/include/linux/mtd/spi-nor.h
-@@ -127,6 +127,7 @@
- #define SR_BP0 BIT(2) /* Block protect 0 */
- #define SR_BP1 BIT(3) /* Block protect 1 */
- #define SR_BP2 BIT(4) /* Block protect 2 */
-+#define SR_BP3 BIT(5) /* Block protect 3 */
- #define SR_TB BIT(5) /* Top/Bottom protect */
- #define SR_SRWD BIT(7) /* SR write protect */
- /* Spansion/Cypress specific status bits */
-@@ -243,6 +244,7 @@ enum spi_nor_option_flags {
- SNOR_F_4B_OPCODES = BIT(6),
- SNOR_F_HAS_4BAIT = BIT(7),
- SNOR_F_HAS_LOCK = BIT(8),
-+ SNOR_F_HAS_4BIT_BP = BIT(12),
- };
-
- /**
diff --git a/target/linux/generic/hack-5.4/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-5.4/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
deleted file mode 100644
index 26a1796d9a..0000000000
--- a/target/linux/generic/hack-5.4/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Mon, 11 Oct 2021 00:53:14 +0200
-Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart
-
-Assuming cmdlinepart is only one level deep partition scheme and that
-static partition are also defined in DTS, we can assign an of_node for
-partition declared from bootargs. cmdlinepart have priority than
-fiexed-partition parser so in this specific case the parser doesn't
-assign an of_node. Fix this by searching a defined of_node using a
-similar fixed_partition parser and if a partition is found with the same
-label, check that it has the same offset and size and return the DT
-of_node to correctly use NVMEM cells.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
----
- drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++
- 1 file changed, 71 insertions(+)
-
---- a/drivers/mtd/parsers/cmdlinepart.c
-+++ b/drivers/mtd/parsers/cmdlinepart.c
-@@ -43,6 +43,7 @@
- #include <linux/mtd/partitions.h>
- #include <linux/module.h>
- #include <linux/err.h>
-+#include <linux/of.h>
-
- /* debug macro */
- #if 0
-@@ -315,6 +316,68 @@ static int mtdpart_setup_real(char *s)
- return 0;
- }
-
-+static int search_fixed_partition(struct mtd_info *master,
-+ struct mtd_partition *target_part,
-+ struct mtd_partition *fixed_part)
-+{
-+ struct device_node *mtd_node;
-+ struct device_node *ofpart_node;
-+ struct device_node *pp;
-+ struct mtd_partition part;
-+ const char *partname;
-+
-+ mtd_node = mtd_get_of_node(master);
-+ if (!mtd_node)
-+ return -EINVAL;
-+
-+ ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-+
-+ for_each_child_of_node(ofpart_node, pp) {
-+ const __be32 *reg;
-+ int len;
-+ int a_cells, s_cells;
-+
-+ reg = of_get_property(pp, "reg", &len);
-+ if (!reg) {
-+ pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
-+ master->name, pp,
-+ mtd_node);
-+ continue;
-+ }
-+
-+ a_cells = of_n_addr_cells(pp);
-+ s_cells = of_n_size_cells(pp);
-+ if (len / 4 != a_cells + s_cells) {
-+ pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
-+ master->name, pp,
-+ mtd_node);
-+ continue;
-+ }
-+
-+ part.offset = of_read_number(reg, a_cells);
-+ part.size = of_read_number(reg + a_cells, s_cells);
-+ part.of_node = pp;
-+
-+ partname = of_get_property(pp, "label", &len);
-+ if (!partname)
-+ partname = of_get_property(pp, "name", &len);
-+ part.name = partname;
-+
-+ if (!strncmp(target_part->name, part.name, len)) {
-+ if (part.offset != target_part->offset)
-+ return -EINVAL;
-+
-+ if (part.size != target_part->size)
-+ return -EINVAL;
-+
-+ memcpy(fixed_part, &part, sizeof(struct mtd_partition));
-+ return 0;
-+ }
-+ }
-+
-+ return -EINVAL;
-+}
-+
- /*
- * Main function to be called from the MTD mapping driver/device to
- * obtain the partitioning information. At this point the command line
-@@ -330,6 +393,7 @@ static int parse_cmdline_partitions(stru
- int i, err;
- struct cmdline_mtd_partition *part;
- const char *mtd_id = master->name;
-+ struct mtd_partition fixed_part;
-
- /* parse command line */
- if (!cmdline_parsed) {
-@@ -374,6 +438,13 @@ static int parse_cmdline_partitions(stru
- sizeof(*part->parts) * (part->num_parts - i));
- i--;
- }
-+
-+ err = search_fixed_partition(master, &part->parts[i], &fixed_part);
-+ if (!err) {
-+ part->parts[i].of_node = fixed_part.of_node;
-+ pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.",
-+ part->parts[i].name);
-+ }
- }
-
- *pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts,
diff --git a/target/linux/generic/hack-5.4/531-debloat_lzma.patch b/target/linux/generic/hack-5.4/531-debloat_lzma.patch
deleted file mode 100644
index 2f70eee3e9..0000000000
--- a/target/linux/generic/hack-5.4/531-debloat_lzma.patch
+++ /dev/null
@@ -1,1040 +0,0 @@
-From 3fd297761ac246c54d7723c57fca95c112b99465 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 15 Jul 2017 21:15:44 +0200
-Subject: lzma: de-bloat the lzma library used by jffs2
-
-lede-commit: 3fd1dd08fbcbb78b34efefd32c3032e5c99108d6
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/lzma/LzFind.h | 17 ---
- include/linux/lzma/LzmaDec.h | 101 ---------------
- include/linux/lzma/LzmaEnc.h | 20 ---
- lib/lzma/LzFind.c | 287 ++++---------------------------------------
- lib/lzma/LzmaDec.c | 86 +------------
- lib/lzma/LzmaEnc.c | 172 ++------------------------
- 6 files changed, 42 insertions(+), 641 deletions(-)
-
---- a/include/linux/lzma/LzFind.h
-+++ b/include/linux/lzma/LzFind.h
-@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
-
- #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-
--int MatchFinder_NeedMove(CMatchFinder *p);
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
--void MatchFinder_MoveBlock(CMatchFinder *p);
--void MatchFinder_ReadIfRequired(CMatchFinder *p);
--
- void MatchFinder_Construct(CMatchFinder *p);
-
- /* Conditions:
-@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,
- UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
- ISzAlloc *alloc);
- void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
--
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
-- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
-- UInt32 *distances, UInt32 maxLen);
-
- /*
- Conditions:
-@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
-
- void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
-
--void MatchFinder_Init(CMatchFinder *p);
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
--
- #ifdef __cplusplus
- }
- #endif
---- a/include/linux/lzma/LzmaDec.h
-+++ b/include/linux/lzma/LzmaDec.h
-@@ -31,14 +31,6 @@ typedef struct _CLzmaProps
- UInt32 dicSize;
- } CLzmaProps;
-
--/* LzmaProps_Decode - decodes properties
--Returns:
-- SZ_OK
-- SZ_ERROR_UNSUPPORTED - Unsupported properties
--*/
--
--SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
--
-
- /* ---------- LZMA Decoder state ---------- */
-
-@@ -70,8 +62,6 @@ typedef struct
-
- #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
-
--void LzmaDec_Init(CLzmaDec *p);
--
- /* There are two types of LZMA streams:
- 0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
- 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-@@ -108,97 +98,6 @@ typedef enum
-
- /* ELzmaStatus is used only as output value for function call */
-
--
--/* ---------- Interfaces ---------- */
--
--/* There are 3 levels of interfaces:
-- 1) Dictionary Interface
-- 2) Buffer Interface
-- 3) One Call Interface
-- You can select any of these interfaces, but don't mix functions from different
-- groups for same object. */
--
--
--/* There are two variants to allocate state for Dictionary Interface:
-- 1) LzmaDec_Allocate / LzmaDec_Free
-- 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
-- You can use variant 2, if you set dictionary buffer manually.
-- For Buffer Interface you must always use variant 1.
--
--LzmaDec_Allocate* can return:
-- SZ_OK
-- SZ_ERROR_MEM - Memory allocation error
-- SZ_ERROR_UNSUPPORTED - Unsupported properties
--*/
--
--SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
--void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
--
--SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
--void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
--
--/* ---------- Dictionary Interface ---------- */
--
--/* You can use it, if you want to eliminate the overhead for data copying from
-- dictionary to some other external buffer.
-- You must work with CLzmaDec variables directly in this interface.
--
-- STEPS:
-- LzmaDec_Constr()
-- LzmaDec_Allocate()
-- for (each new stream)
-- {
-- LzmaDec_Init()
-- while (it needs more decompression)
-- {
-- LzmaDec_DecodeToDic()
-- use data from CLzmaDec::dic and update CLzmaDec::dicPos
-- }
-- }
-- LzmaDec_Free()
--*/
--
--/* LzmaDec_DecodeToDic
--
-- The decoding to internal dictionary buffer (CLzmaDec::dic).
-- You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
--
--finishMode:
-- It has meaning only if the decoding reaches output limit (dicLimit).
-- LZMA_FINISH_ANY - Decode just dicLimit bytes.
-- LZMA_FINISH_END - Stream must be finished after dicLimit.
--
--Returns:
-- SZ_OK
-- status:
-- LZMA_STATUS_FINISHED_WITH_MARK
-- LZMA_STATUS_NOT_FINISHED
-- LZMA_STATUS_NEEDS_MORE_INPUT
-- LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
-- SZ_ERROR_DATA - Data error
--*/
--
--SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
-- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
--
--
--/* ---------- Buffer Interface ---------- */
--
--/* It's zlib-like interface.
-- See LzmaDec_DecodeToDic description for information about STEPS and return results,
-- but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
-- to work with CLzmaDec variables manually.
--
--finishMode:
-- It has meaning only if the decoding reaches output limit (*destLen).
-- LZMA_FINISH_ANY - Decode just destLen bytes.
-- LZMA_FINISH_END - Stream must be finished after (*destLen).
--*/
--
--SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
-- const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
--
--
- /* ---------- One Call Interface ---------- */
-
- /* LzmaDecode
---- a/include/linux/lzma/LzmaEnc.h
-+++ b/include/linux/lzma/LzmaEnc.h
-@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps
- } CLzmaEncProps;
-
- void LzmaEncProps_Init(CLzmaEncProps *p);
--void LzmaEncProps_Normalize(CLzmaEncProps *p);
--UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
--
-
- /* ---------- CLzmaEncHandle Interface ---------- */
-
-@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
- void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
- SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
- SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
--SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
-- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
- SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
- int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-
--/* ---------- One Call Interface ---------- */
--
--/* LzmaEncode
--Return code:
-- SZ_OK - OK
-- SZ_ERROR_MEM - Memory allocation error
-- SZ_ERROR_PARAM - Incorrect paramater
-- SZ_ERROR_OUTPUT_EOF - output buffer overflow
-- SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
--*/
--
--SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
--
- #ifdef __cplusplus
- }
- #endif
---- a/lib/lzma/LzFind.c
-+++ b/lib/lzma/LzFind.c
-@@ -14,9 +14,15 @@
-
- #define kStartMaxLen 3
-
-+#if 0
-+#define DIRECT_INPUT p->directInput
-+#else
-+#define DIRECT_INPUT 1
-+#endif
-+
- static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
- {
-- if (!p->directInput)
-+ if (!DIRECT_INPUT)
- {
- alloc->Free(alloc, p->bufferBase);
- p->bufferBase = 0;
-@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder
- static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
- {
- UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- {
- p->blockSize = blockSize;
- return 1;
-@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinde
- return (p->bufferBase != 0);
- }
-
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
--Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-
--UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
- {
- p->posLimit -= subValue;
- p->pos -= subValue;
-@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatch
- {
- if (p->streamEndWasReached || p->result != SZ_OK)
- return;
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- {
- UInt32 curSize = 0xFFFFFFFF - p->streamPos;
- if (curSize > p->directInputRem)
-@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatch
- }
- }
-
--void MatchFinder_MoveBlock(CMatchFinder *p)
-+static void MatchFinder_MoveBlock(CMatchFinder *p)
- {
- memmove(p->bufferBase,
- p->buffer - p->keepSizeBefore,
-@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder
- p->buffer = p->bufferBase + p->keepSizeBefore;
- }
-
--int MatchFinder_NeedMove(CMatchFinder *p)
-+static int MatchFinder_NeedMove(CMatchFinder *p)
- {
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- return 0;
- /* if (p->streamEndWasReached) return 0; */
- return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
- }
-
--void MatchFinder_ReadIfRequired(CMatchFinder *p)
--{
-- if (p->streamEndWasReached)
-- return;
-- if (p->keepSizeAfter >= p->streamPos - p->pos)
-- MatchFinder_ReadBlock(p);
--}
--
- static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
- {
- if (MatchFinder_NeedMove(p))
-@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatch
- p->posLimit = p->pos + limit;
- }
-
--void MatchFinder_Init(CMatchFinder *p)
-+static void MatchFinder_Init(CMatchFinder *p)
- {
- UInt32 i;
- for (i = 0; i < p->hashSizeSum; i++)
-@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CM
- return (p->pos - p->historySize - 1) & kNormalizeMask;
- }
-
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
- {
- UInt32 i;
- for (i = 0; i < numItems; i++)
-@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMat
- MatchFinder_SetLimits(p);
- }
-
--static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-- UInt32 *distances, UInt32 maxLen)
--{
-- son[_cyclicBufferPos] = curMatch;
-- for (;;)
-- {
-- UInt32 delta = pos - curMatch;
-- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-- return distances;
-- {
-- const Byte *pb = cur - delta;
-- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
-- if (pb[maxLen] == cur[maxLen] && *pb == *cur)
-- {
-- UInt32 len = 0;
-- while (++len != lenLimit)
-- if (pb[len] != cur[len])
-- break;
-- if (maxLen < len)
-- {
-- *distances++ = maxLen = len;
-- *distances++ = delta - 1;
-- if (len == lenLimit)
-- return distances;
-- }
-- }
-- }
-- }
--}
--
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
- UInt32 *distances, UInt32 maxLen)
- {
-@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLi
- p->buffer++; \
- if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-
--#define MOVE_POS_RET MOVE_POS return offset;
--
- static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
-
-+#define MOVE_POS_RET MatchFinder_MovePos(p); return offset;
-+
- #define GET_MATCHES_HEADER2(minLen, ret_op) \
- UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
- lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
-@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFi
- distances + offset, maxLen) - distances); MOVE_POS_RET;
-
- #define SKIP_FOOTER \
-- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
--
--static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 offset;
-- GET_MATCHES_HEADER(2)
-- HASH2_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = 0;
-- GET_MATCHES_FOOTER(offset, 1)
--}
--
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 offset;
-- GET_MATCHES_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = 0;
-- GET_MATCHES_FOOTER(offset, 2)
--}
--
--static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 hash2Value, delta2, maxLen, offset;
-- GET_MATCHES_HEADER(3)
--
-- HASH3_CALC;
--
-- delta2 = p->pos - p->hash[hash2Value];
-- curMatch = p->hash[kFix3HashSize + hashValue];
--
-- p->hash[hash2Value] =
-- p->hash[kFix3HashSize + hashValue] = p->pos;
--
--
-- maxLen = 2;
-- offset = 0;
-- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-- {
-- for (; maxLen != lenLimit; maxLen++)
-- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-- break;
-- distances[0] = maxLen;
-- distances[1] = delta2 - 1;
-- offset = 2;
-- if (maxLen == lenLimit)
-- {
-- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-- MOVE_POS_RET;
-- }
-- }
-- GET_MATCHES_FOOTER(offset, maxLen)
--}
-+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p);
-
- static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
- {
-@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches
- GET_MATCHES_FOOTER(offset, maxLen)
- }
-
--static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-- GET_MATCHES_HEADER(4)
--
-- HASH4_CALC;
--
-- delta2 = p->pos - p->hash[ hash2Value];
-- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-- curMatch = p->hash[kFix4HashSize + hashValue];
--
-- p->hash[ hash2Value] =
-- p->hash[kFix3HashSize + hash3Value] =
-- p->hash[kFix4HashSize + hashValue] = p->pos;
--
-- maxLen = 1;
-- offset = 0;
-- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-- {
-- distances[0] = maxLen = 2;
-- distances[1] = delta2 - 1;
-- offset = 2;
-- }
-- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-- {
-- maxLen = 3;
-- distances[offset + 1] = delta3 - 1;
-- offset += 2;
-- delta2 = delta3;
-- }
-- if (offset != 0)
-- {
-- for (; maxLen != lenLimit; maxLen++)
-- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-- break;
-- distances[offset - 2] = maxLen;
-- if (maxLen == lenLimit)
-- {
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS_RET;
-- }
-- }
-- if (maxLen < 3)
-- maxLen = 3;
-- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-- distances + offset, maxLen) - (distances));
-- MOVE_POS_RET
--}
--
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 offset;
-- GET_MATCHES_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-- distances, 2) - (distances));
-- MOVE_POS_RET
--}
--
--static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
--{
-- do
-- {
-- SKIP_HEADER(2)
-- HASH2_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
--}
--
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
--{
-- do
-- {
-- SKIP_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
--}
--
--static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
--{
-- do
-- {
-- UInt32 hash2Value;
-- SKIP_HEADER(3)
-- HASH3_CALC;
-- curMatch = p->hash[kFix3HashSize + hashValue];
-- p->hash[hash2Value] =
-- p->hash[kFix3HashSize + hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
--}
--
- static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
- {
- do
-@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchF
- while (--num != 0);
- }
-
--static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
--{
-- do
-- {
-- UInt32 hash2Value, hash3Value;
-- SKIP_HEADER(4)
-- HASH4_CALC;
-- curMatch = p->hash[kFix4HashSize + hashValue];
-- p->hash[ hash2Value] =
-- p->hash[kFix3HashSize + hash3Value] =
-- p->hash[kFix4HashSize + hashValue] = p->pos;
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS
-- }
-- while (--num != 0);
--}
--
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
--{
-- do
-- {
-- SKIP_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS
-- }
-- while (--num != 0);
--}
--
- void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
- {
- vTable->Init = (Mf_Init_Func)MatchFinder_Init;
- vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
- vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
- vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
-- if (!p->btMode)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
-- }
-- else if (p->numHashBytes == 2)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
-- }
-- else if (p->numHashBytes == 3)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
-- }
-- else
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
-- }
-+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
- }
---- a/lib/lzma/LzmaDec.c
-+++ b/lib/lzma/LzmaDec.c
-@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,
- p->needFlush = 0;
- }
-
--void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
- {
- p->needFlush = 1;
- p->remainLen = 0;
-@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p
- p->needInitState = 1;
- }
-
--void LzmaDec_Init(CLzmaDec *p)
-+static void LzmaDec_Init(CLzmaDec *p)
- {
- p->dicPos = 0;
- LzmaDec_InitDicAndState(p, True, True);
-@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD
- p->needInitState = 0;
- }
-
--SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
- ELzmaFinishMode finishMode, ELzmaStatus *status)
- {
- SizeT inSize = *srcLen;
-@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si
- return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
- }
-
--SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
--{
-- SizeT outSize = *destLen;
-- SizeT inSize = *srcLen;
-- *srcLen = *destLen = 0;
-- for (;;)
-- {
-- SizeT inSizeCur = inSize, outSizeCur, dicPos;
-- ELzmaFinishMode curFinishMode;
-- SRes res;
-- if (p->dicPos == p->dicBufSize)
-- p->dicPos = 0;
-- dicPos = p->dicPos;
-- if (outSize > p->dicBufSize - dicPos)
-- {
-- outSizeCur = p->dicBufSize;
-- curFinishMode = LZMA_FINISH_ANY;
-- }
-- else
-- {
-- outSizeCur = dicPos + outSize;
-- curFinishMode = finishMode;
-- }
--
-- res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
-- src += inSizeCur;
-- inSize -= inSizeCur;
-- *srcLen += inSizeCur;
-- outSizeCur = p->dicPos - dicPos;
-- memcpy(dest, p->dic + dicPos, outSizeCur);
-- dest += outSizeCur;
-- outSize -= outSizeCur;
-- *destLen += outSizeCur;
-- if (res != 0)
-- return res;
-- if (outSizeCur == 0 || outSize == 0)
-- return SZ_OK;
-- }
--}
--
--void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
- {
- alloc->Free(alloc, p->probs);
- p->probs = 0;
- }
-
--static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
--{
-- alloc->Free(alloc, p->dic);
-- p->dic = 0;
--}
--
--void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
--{
-- LzmaDec_FreeProbs(p, alloc);
-- LzmaDec_FreeDict(p, alloc);
--}
--
--SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
- {
- UInt32 dicSize;
- Byte d;
-@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma
- return SZ_OK;
- }
-
--SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
- {
- CLzmaProps propNew;
- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,
- p->prop = propNew;
- return SZ_OK;
- }
--
--SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
--{
-- CLzmaProps propNew;
-- SizeT dicBufSize;
-- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-- dicBufSize = propNew.dicSize;
-- if (p->dic == 0 || dicBufSize != p->dicBufSize)
-- {
-- LzmaDec_FreeDict(p, alloc);
-- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
-- if (p->dic == 0)
-- {
-- LzmaDec_FreeProbs(p, alloc);
-- return SZ_ERROR_MEM;
-- }
-- }
-- p->dicBufSize = dicBufSize;
-- p->prop = propNew;
-- return SZ_OK;
--}
-
- SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
---- a/lib/lzma/LzmaEnc.c
-+++ b/lib/lzma/LzmaEnc.c
-@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
- p->writeEndMark = 0;
- }
-
--void LzmaEncProps_Normalize(CLzmaEncProps *p)
-+static void LzmaEncProps_Normalize(CLzmaEncProps *p)
- {
- int level = p->level;
- if (level < 0) level = 5;
-@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp
- #endif
- }
-
--UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
- {
- CLzmaEncProps props = *props2;
- LzmaEncProps_Normalize(&props);
-@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL
-
- #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
-
--UInt32 GetPosSlot1(UInt32 pos)
-+static UInt32 GetPosSlot1(UInt32 pos)
- {
- UInt32 res;
- BSR2_RET(pos, res);
-@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
- #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
- #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
-
--void LzmaEnc_FastPosInit(Byte *g_FastPos)
-+static void LzmaEnc_FastPosInit(Byte *g_FastPos)
- {
- int c = 2, slotFast;
- g_FastPos[0] = 0;
-@@ -339,58 +339,6 @@ typedef struct
- CSaveState saveState;
- } CLzmaEnc;
-
--void LzmaEnc_SaveState(CLzmaEncHandle pp)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- CSaveState *dest = &p->saveState;
-- int i;
-- dest->lenEnc = p->lenEnc;
-- dest->repLenEnc = p->repLenEnc;
-- dest->state = p->state;
--
-- for (i = 0; i < kNumStates; i++)
-- {
-- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-- }
-- for (i = 0; i < kNumLenToPosStates; i++)
-- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-- memcpy(dest->reps, p->reps, sizeof(p->reps));
-- memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
--}
--
--void LzmaEnc_RestoreState(CLzmaEncHandle pp)
--{
-- CLzmaEnc *dest = (CLzmaEnc *)pp;
-- const CSaveState *p = &dest->saveState;
-- int i;
-- dest->lenEnc = p->lenEnc;
-- dest->repLenEnc = p->repLenEnc;
-- dest->state = p->state;
--
-- for (i = 0; i < kNumStates; i++)
-- {
-- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-- }
-- for (i = 0; i < kNumLenToPosStates; i++)
-- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-- memcpy(dest->reps, p->reps, sizeof(p->reps));
-- memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
--}
--
- SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
- {
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeE
- while (symbol < 0x10000);
- }
-
--void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
- {
- UInt32 i;
- for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
-@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc
- p->matchPriceCount = 0;
- }
-
--void LzmaEnc_Construct(CLzmaEnc *p)
-+static void LzmaEnc_Construct(CLzmaEnc *p)
- {
- RangeEnc_Construct(&p->rc);
- MatchFinder_Construct(&p->matchFinderBase);
-@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
- return p;
- }
-
--void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
- {
- alloc->Free(alloc, p->litProbs);
- alloc->Free(alloc, p->saveState.litProbs);
-@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAl
- p->saveState.litProbs = 0;
- }
-
--void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
- {
- #ifndef _7ZIP_ST
- MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
-@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, U
- return SZ_OK;
- }
-
--void LzmaEnc_Init(CLzmaEnc *p)
-+static void LzmaEnc_Init(CLzmaEnc *p)
- {
- UInt32 i;
- p->state = 0;
-@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p)
- p->lpMask = (1 << p->lp) - 1;
- }
-
--void LzmaEnc_InitPrices(CLzmaEnc *p)
-+static void LzmaEnc_InitPrices(CLzmaEnc *p)
- {
- if (!p->fastMode)
- {
-@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEn
- return SZ_OK;
- }
-
--static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- p->matchFinderBase.stream = inStream;
-- p->needInit = 1;
-- p->rc.outStream = outStream;
-- return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
--}
--
--SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
-- ISeqInStream *inStream, UInt32 keepWindowSize,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- p->matchFinderBase.stream = inStream;
-- p->needInit = 1;
-- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
--}
--
- static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
- {
- p->matchFinderBase.directInput = 1;
-@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc
- p->matchFinderBase.directInputRem = srcLen;
- }
-
--SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
-+static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
- UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
- {
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p
- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
- }
-
--void LzmaEnc_Finish(CLzmaEncHandle pp)
-+static void LzmaEnc_Finish(CLzmaEncHandle pp)
- {
- #ifndef _7ZIP_ST
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const vo
- return size;
- }
-
--
--UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
--{
-- const CLzmaEnc *p = (CLzmaEnc *)pp;
-- return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
--}
--
--const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
--{
-- const CLzmaEnc *p = (CLzmaEnc *)pp;
-- return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
--}
--
--SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- UInt64 nowPos64;
-- SRes res;
-- CSeqOutStreamBuf outStream;
--
-- outStream.funcTable.Write = MyWrite;
-- outStream.data = dest;
-- outStream.rem = *destLen;
-- outStream.overflow = False;
--
-- p->writeEndMark = False;
-- p->finished = False;
-- p->result = SZ_OK;
--
-- if (reInit)
-- LzmaEnc_Init(p);
-- LzmaEnc_InitPrices(p);
-- nowPos64 = p->nowPos64;
-- RangeEnc_Init(&p->rc);
-- p->rc.outStream = &outStream.funcTable;
--
-- res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
--
-- *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
-- *destLen -= outStream.rem;
-- if (outStream.overflow)
-- return SZ_ERROR_OUTPUT_EOF;
--
-- return res;
--}
--
- static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
- {
- SRes res = SZ_OK;
-@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p,
- return res;
- }
-
--SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
-- return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
--}
--
- SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
- {
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp
- return SZ_ERROR_OUTPUT_EOF;
- return res;
- }
--
--SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
-- SRes res;
-- if (p == 0)
-- return SZ_ERROR_MEM;
--
-- res = LzmaEnc_SetProps(p, props);
-- if (res == SZ_OK)
-- {
-- res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
-- if (res == SZ_OK)
-- res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
-- writeEndMark, progress, alloc, allocBig);
-- }
--
-- LzmaEnc_Destroy(p, alloc, allocBig);
-- return res;
--}
diff --git a/target/linux/generic/hack-5.4/550-loop-Report-EOPNOTSUPP-properly.patch b/target/linux/generic/hack-5.4/550-loop-Report-EOPNOTSUPP-properly.patch
deleted file mode 100644
index 0e5447d454..0000000000
--- a/target/linux/generic/hack-5.4/550-loop-Report-EOPNOTSUPP-properly.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 2e864386e62e702a343be2507062ee08d5dfc810 Mon Sep 17 00:00:00 2001
-From: Evan Green <evgreen@chromium.org>
-Date: Thu, 14 Nov 2019 15:50:07 -0800
-Subject: loop: Report EOPNOTSUPP properly
-
-Properly plumb out EOPNOTSUPP from loop driver operations, which may
-get returned when for instance a discard operation is attempted but not
-supported by the underlying block device. Before this change, everything
-was reported in the log as an I/O error, which is scary and not
-helpful in debugging.
-
-Signed-off-by: Evan Green <evgreen@chromium.org>
-Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
-Reviewed-by: Bart Van Assche <bvanassche@acm.org>
----
- drivers/block/loop.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
---- a/drivers/block/loop.c
-+++ b/drivers/block/loop.c
-@@ -462,7 +462,7 @@ static void lo_complete_rq(struct reques
- if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
- req_op(rq) != REQ_OP_READ) {
- if (cmd->ret < 0)
-- ret = BLK_STS_IOERR;
-+ ret = errno_to_blk_status(cmd->ret);
- goto end_io;
- }
-
-@@ -1973,7 +1973,10 @@ static void loop_handle_cmd(struct loop_
- failed:
- /* complete non-aio request */
- if (!cmd->use_aio || ret) {
-- cmd->ret = ret ? -EIO : 0;
-+ if (ret == -EOPNOTSUPP)
-+ cmd->ret = ret;
-+ else
-+ cmd->ret = ret ? -EIO : 0;
- blk_mq_complete_request(rq);
- }
- }
diff --git a/target/linux/generic/hack-5.4/645-netfilter-connmark-introduce-set-dscpmark.patch b/target/linux/generic/hack-5.4/645-netfilter-connmark-introduce-set-dscpmark.patch
deleted file mode 100644
index 2d3fe01a75..0000000000
--- a/target/linux/generic/hack-5.4/645-netfilter-connmark-introduce-set-dscpmark.patch
+++ /dev/null
@@ -1,212 +0,0 @@
-From eda40b8c8c82e0f2789d6bc8bf63846dce2e8f32 Mon Sep 17 00:00:00 2001
-From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Date: Sat, 23 Mar 2019 09:29:49 +0000
-Subject: [PATCH] netfilter: connmark: introduce set-dscpmark
-
-set-dscpmark is a method of storing the DSCP of an ip packet into
-conntrack mark. In combination with a suitable tc filter action
-(act_ctinfo) DSCP values are able to be stored in the mark on egress and
-restored on ingress across links that otherwise alter or bleach DSCP.
-
-This is useful for qdiscs such as CAKE which are able to shape according
-to policies based on DSCP.
-
-Ingress classification is traditionally a challenging task since
-iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT
-lookups, hence are unable to see internal IPv4 addresses as used on the
-typical home masquerading gateway.
-
-x_tables CONNMARK set-dscpmark target solves the problem of storing the
-DSCP to the conntrack mark in a way suitable for the new act_ctinfo tc
-action to restore.
-
-The set-dscpmark option accepts 2 parameters, a 32bit 'dscpmask' and a
-32bit 'statemask'. The dscp mask must be 6 contiguous bits and
-represents the area where the DSCP will be stored in the connmark. The
-state mask is a minimum 1 bit length mask that must not overlap with the
-dscpmask. It represents a flag which is set when the DSCP has been
-stored in the conntrack mark. This is useful to implement a 'one shot'
-iptables based classification where the 'complicated' iptables rules are
-only run once to classify the connection on initial (egress) packet and
-subsequent packets are all marked/restored with the same DSCP. A state
-mask of zero disables the setting of a status bit/s.
-
-example syntax with a suitably modified iptables user space application:
-
-iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000
-
-Would store the DSCP in the top 6 bits of the 32bit mark field, and use
-the LSB of the top byte as the 'DSCP has been stored' marker.
-
-|----0xFC----conntrack mark----000000---|
-| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|
-| DSCP | unused | flag |unused |
-|-----------------------0x01---000000---|
- ^ ^
- | |
- ---| Conditional flag
- | set this when dscp
-|-ip diffserv-| stored in mark
-| 6 bits |
-|-------------|
-
-an identically configured tc action to restore looks like:
-
-tc filter show dev eth0 ingress
-filter parent ffff: protocol all pref 10 u32 chain 0
-filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1
-filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1: not_in_hw
- match 00000000/00000000 at 0
- action order 1: ctinfo zone 0 pipe
- index 2 ref 1 bind 1 dscp 0xfc000000/0x1000000
-
- action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
- index 1 ref 1 bind 1
-
-|----0xFC----conntrack mark----000000---|
-| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|
-| DSCP | unused | flag |unused |
-|-----------------------0x01---000000---|
- | |
- | |
- ---| Conditional flag
- v only restore if set
-|-ip diffserv-|
-| 6 bits |
-|-------------|
-
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
----
- include/uapi/linux/netfilter/xt_connmark.h | 10 ++++
- net/netfilter/xt_connmark.c | 55 ++++++++++++++++++----
- 2 files changed, 57 insertions(+), 8 deletions(-)
-
---- a/include/uapi/linux/netfilter/xt_connmark.h
-+++ b/include/uapi/linux/netfilter/xt_connmark.h
-@@ -20,6 +20,11 @@ enum {
- };
-
- enum {
-+ XT_CONNMARK_VALUE = (1 << 0),
-+ XT_CONNMARK_DSCP = (1 << 1)
-+};
-+
-+enum {
- D_SHIFT_LEFT = 0,
- D_SHIFT_RIGHT,
- };
-@@ -34,6 +39,11 @@ struct xt_connmark_tginfo2 {
- __u8 shift_dir, shift_bits, mode;
- };
-
-+struct xt_connmark_tginfo3 {
-+ __u32 ctmark, ctmask, nfmask;
-+ __u8 shift_dir, shift_bits, mode, func;
-+};
-+
- struct xt_connmark_mtinfo1 {
- __u32 mark, mask;
- __u8 invert;
---- a/net/netfilter/xt_connmark.c
-+++ b/net/netfilter/xt_connmark.c
-@@ -24,12 +24,13 @@ MODULE_ALIAS("ipt_connmark");
- MODULE_ALIAS("ip6t_connmark");
-
- static unsigned int
--connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo2 *info)
-+connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo3 *info)
- {
- enum ip_conntrack_info ctinfo;
- u_int32_t new_targetmark;
- struct nf_conn *ct;
- u_int32_t newmark;
-+ u_int8_t dscp;
-
- ct = nf_ct_get(skb, &ctinfo);
- if (ct == NULL)
-@@ -37,12 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c
-
- switch (info->mode) {
- case XT_CONNMARK_SET:
-- newmark = (ct->mark & ~info->ctmask) ^ info->ctmark;
-- if (info->shift_dir == D_SHIFT_RIGHT)
-- newmark >>= info->shift_bits;
-- else
-- newmark <<= info->shift_bits;
-+ newmark = ct->mark;
-+ if (info->func & XT_CONNMARK_VALUE) {
-+ newmark = (newmark & ~info->ctmask) ^ info->ctmark;
-+ if (info->shift_dir == D_SHIFT_RIGHT)
-+ newmark >>= info->shift_bits;
-+ else
-+ newmark <<= info->shift_bits;
-+ } else if (info->func & XT_CONNMARK_DSCP) {
-+ if (skb->protocol == htons(ETH_P_IP))
-+ dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2;
-+ else if (skb->protocol == htons(ETH_P_IPV6))
-+ dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2;
-+ else /* protocol doesn't have diffserv */
-+ break;
-
-+ newmark = (newmark & ~info->ctmark) |
-+ (info->ctmask | (dscp << info->shift_bits));
-+ }
- if (ct->mark != newmark) {
- ct->mark = newmark;
- nf_conntrack_event_cache(IPCT_MARK, ct);
-@@ -81,20 +94,36 @@ static unsigned int
- connmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
- {
- const struct xt_connmark_tginfo1 *info = par->targinfo;
-- const struct xt_connmark_tginfo2 info2 = {
-+ const struct xt_connmark_tginfo3 info3 = {
- .ctmark = info->ctmark,
- .ctmask = info->ctmask,
- .nfmask = info->nfmask,
- .mode = info->mode,
-+ .func = XT_CONNMARK_VALUE
- };
-
-- return connmark_tg_shift(skb, &info2);
-+ return connmark_tg_shift(skb, &info3);
- }
-
- static unsigned int
- connmark_tg_v2(struct sk_buff *skb, const struct xt_action_param *par)
- {
- const struct xt_connmark_tginfo2 *info = par->targinfo;
-+ const struct xt_connmark_tginfo3 info3 = {
-+ .ctmark = info->ctmark,
-+ .ctmask = info->ctmask,
-+ .nfmask = info->nfmask,
-+ .mode = info->mode,
-+ .func = XT_CONNMARK_VALUE
-+ };
-+
-+ return connmark_tg_shift(skb, &info3);
-+}
-+
-+static unsigned int
-+connmark_tg_v3(struct sk_buff *skb, const struct xt_action_param *par)
-+{
-+ const struct xt_connmark_tginfo3 *info = par->targinfo;
-
- return connmark_tg_shift(skb, info);
- }
-@@ -165,6 +194,16 @@ static struct xt_target connmark_tg_reg[
- .targetsize = sizeof(struct xt_connmark_tginfo2),
- .destroy = connmark_tg_destroy,
- .me = THIS_MODULE,
-+ },
-+ {
-+ .name = "CONNMARK",
-+ .revision = 3,
-+ .family = NFPROTO_UNSPEC,
-+ .checkentry = connmark_tg_check,
-+ .target = connmark_tg_v3,
-+ .targetsize = sizeof(struct xt_connmark_tginfo3),
-+ .destroy = connmark_tg_destroy,
-+ .me = THIS_MODULE,
- }
- };
-
diff --git a/target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch b/target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch
deleted file mode 100644
index f9480d59d1..0000000000
--- a/target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch
+++ /dev/null
@@ -1,70 +0,0 @@
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -160,6 +160,8 @@ struct nf_flow_table_hw {
- int nf_flow_table_hw_register(const struct nf_flow_table_hw *offload);
- void nf_flow_table_hw_unregister(const struct nf_flow_table_hw *offload);
-
-+void nf_flow_table_acct(struct flow_offload *flow, struct sk_buff *skb, int dir);
-+
- extern struct work_struct nf_flow_offload_hw_work;
-
- #define MODULE_ALIAS_NF_FLOWTABLE(family) \
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -13,6 +13,7 @@
- #include <net/netfilter/nf_conntrack_core.h>
- #include <net/netfilter/nf_conntrack_l4proto.h>
- #include <net/netfilter/nf_conntrack_tuple.h>
-+#include <net/netfilter/nf_conntrack_acct.h>
-
- struct flow_offload_entry {
- struct flow_offload flow;
-@@ -164,6 +165,22 @@ void flow_offload_free(struct flow_offlo
- }
- EXPORT_SYMBOL_GPL(flow_offload_free);
-
-+void nf_flow_table_acct(struct flow_offload *flow, struct sk_buff *skb, int dir)
-+{
-+ struct flow_offload_entry *entry;
-+ struct nf_conn_acct *acct;
-+
-+ entry = container_of(flow, struct flow_offload_entry, flow);
-+ acct = nf_conn_acct_find(entry->ct);
-+ if (acct) {
-+ struct nf_conn_counter *counter = acct->counter;
-+
-+ atomic64_inc(&counter[dir].packets);
-+ atomic64_add(skb->len, &counter[dir].bytes);
-+ }
-+}
-+EXPORT_SYMBOL_GPL(nf_flow_table_acct);
-+
- static u32 flow_offload_hash(const void *data, u32 len, u32 seed)
- {
- const struct flow_offload_tuple *tuple = data;
---- a/net/netfilter/nf_flow_table_ip.c
-+++ b/net/netfilter/nf_flow_table_ip.c
-@@ -12,6 +12,7 @@
- #include <net/ip6_route.h>
- #include <net/neighbour.h>
- #include <net/netfilter/nf_flow_table.h>
-+
- /* For layer 4 checksum field offset. */
- #include <linux/tcp.h>
- #include <linux/udp.h>
-@@ -296,6 +297,7 @@ nf_flow_offload_ip_hook(void *priv, stru
- skb->dev = outdev;
- nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr);
- skb_dst_set_noref(skb, &rt->dst);
-+ nf_flow_table_acct(flow, skb, dir);
- neigh_xmit(NEIGH_ARP_TABLE, outdev, &nexthop, skb);
-
- return NF_STOLEN;
-@@ -526,6 +528,7 @@ nf_flow_offload_ipv6_hook(void *priv, st
- skb->dev = outdev;
- nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6);
- skb_dst_set_noref(skb, &rt->dst);
-+ nf_flow_table_acct(flow, skb, dir);
- neigh_xmit(NEIGH_ND_TABLE, outdev, nexthop, skb);
-
- return NF_STOLEN;
diff --git a/target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch b/target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch
deleted file mode 100644
index d584cb5c6c..0000000000
--- a/target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch
+++ /dev/null
@@ -1,589 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Tue, 20 Feb 2018 15:56:02 +0100
-Subject: [PATCH] netfilter: add xt_OFFLOAD target
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- create mode 100644 net/netfilter/xt_OFFLOAD.c
-
---- a/net/ipv4/netfilter/Kconfig
-+++ b/net/ipv4/netfilter/Kconfig
-@@ -56,8 +56,6 @@ config NF_TABLES_ARP
- help
- This option enables the ARP support for nf_tables.
-
--endif # NF_TABLES
--
- config NF_FLOW_TABLE_IPV4
- tristate "Netfilter flow table IPv4 module"
- depends on NF_FLOW_TABLE
-@@ -66,6 +64,8 @@ config NF_FLOW_TABLE_IPV4
-
- To compile it as a module, choose M here.
-
-+endif # NF_TABLES
-+
- config NF_DUP_IPV4
- tristate "Netfilter IPv4 packet duplication to alternate destination"
- depends on !NF_CONNTRACK || NF_CONNTRACK
---- a/net/ipv6/netfilter/Kconfig
-+++ b/net/ipv6/netfilter/Kconfig
-@@ -45,7 +45,6 @@ config NFT_FIB_IPV6
- multicast or blackhole.
-
- endif # NF_TABLES_IPV6
--endif # NF_TABLES
-
- config NF_FLOW_TABLE_IPV6
- tristate "Netfilter flow table IPv6 module"
-@@ -55,6 +54,8 @@ config NF_FLOW_TABLE_IPV6
-
- To compile it as a module, choose M here.
-
-+endif # NF_TABLES
-+
- config NF_DUP_IPV6
- tristate "Netfilter IPv6 packet duplication to alternate destination"
- depends on !NF_CONNTRACK || NF_CONNTRACK
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -690,8 +690,6 @@ config NFT_FIB_NETDEV
-
- endif # NF_TABLES_NETDEV
-
--endif # NF_TABLES
--
- config NF_FLOW_TABLE_INET
- tristate "Netfilter flow table mixed IPv4/IPv6 module"
- depends on NF_FLOW_TABLE
-@@ -700,11 +698,12 @@ config NF_FLOW_TABLE_INET
-
- To compile it as a module, choose M here.
-
-+endif # NF_TABLES
-+
- config NF_FLOW_TABLE
- tristate "Netfilter flow table module"
- depends on NETFILTER_INGRESS
- depends on NF_CONNTRACK
-- depends on NF_TABLES
- help
- This option adds the flow table core infrastructure.
-
-@@ -993,6 +992,15 @@ config NETFILTER_XT_TARGET_NOTRACK
- depends on NETFILTER_ADVANCED
- select NETFILTER_XT_TARGET_CT
-
-+config NETFILTER_XT_TARGET_FLOWOFFLOAD
-+ tristate '"FLOWOFFLOAD" target support'
-+ depends on NF_FLOW_TABLE
-+ depends on NETFILTER_INGRESS
-+ help
-+ This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload
-+ module to speed up processing of packets by bypassing the usual
-+ netfilter chains
-+
- config NETFILTER_XT_TARGET_RATEEST
- tristate '"RATEEST" target support'
- depends on NETFILTER_ADVANCED
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -141,6 +141,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF
- obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
-+obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o
- obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
---- /dev/null
-+++ b/net/netfilter/xt_FLOWOFFLOAD.c
-@@ -0,0 +1,427 @@
-+/*
-+ * Copyright (C) 2018 Felix Fietkau <nbd@nbd.name>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter/xt_FLOWOFFLOAD.h>
-+#include <net/ip.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_helper.h>
-+#include <net/netfilter/nf_flow_table.h>
-+
-+static struct nf_flowtable nf_flowtable;
-+static HLIST_HEAD(hooks);
-+static DEFINE_SPINLOCK(hooks_lock);
-+static struct delayed_work hook_work;
-+
-+struct xt_flowoffload_hook {
-+ struct hlist_node list;
-+ struct nf_hook_ops ops;
-+ struct net *net;
-+ bool registered;
-+ bool used;
-+};
-+
-+static unsigned int
-+xt_flowoffload_net_hook(void *priv, struct sk_buff *skb,
-+ const struct nf_hook_state *state)
-+{
-+ switch (skb->protocol) {
-+ case htons(ETH_P_IP):
-+ return nf_flow_offload_ip_hook(priv, skb, state);
-+ case htons(ETH_P_IPV6):
-+ return nf_flow_offload_ipv6_hook(priv, skb, state);
-+ }
-+
-+ return NF_ACCEPT;
-+}
-+
-+int nf_flow_table_iterate(struct nf_flowtable *flow_table,
-+ void (*iter)(struct flow_offload *flow, void *data),
-+ void *data);
-+
-+static int
-+xt_flowoffload_create_hook(struct net_device *dev)
-+{
-+ struct xt_flowoffload_hook *hook;
-+ struct nf_hook_ops *ops;
-+
-+ hook = kzalloc(sizeof(*hook), GFP_ATOMIC);
-+ if (!hook)
-+ return -ENOMEM;
-+
-+ ops = &hook->ops;
-+ ops->pf = NFPROTO_NETDEV;
-+ ops->hooknum = NF_NETDEV_INGRESS;
-+ ops->priority = 10;
-+ ops->priv = &nf_flowtable;
-+ ops->hook = xt_flowoffload_net_hook;
-+ ops->dev = dev;
-+
-+ hlist_add_head(&hook->list, &hooks);
-+ mod_delayed_work(system_power_efficient_wq, &hook_work, 0);
-+
-+ return 0;
-+}
-+
-+static struct xt_flowoffload_hook *
-+flow_offload_lookup_hook(struct net_device *dev)
-+{
-+ struct xt_flowoffload_hook *hook;
-+
-+ hlist_for_each_entry(hook, &hooks, list) {
-+ if (hook->ops.dev == dev)
-+ return hook;
-+ }
-+
-+ return NULL;
-+}
-+
-+static void
-+xt_flowoffload_check_device(struct net_device *dev)
-+{
-+ struct xt_flowoffload_hook *hook;
-+
-+ spin_lock_bh(&hooks_lock);
-+ hook = flow_offload_lookup_hook(dev);
-+ if (hook)
-+ hook->used = true;
-+ else
-+ xt_flowoffload_create_hook(dev);
-+ spin_unlock_bh(&hooks_lock);
-+}
-+
-+static void
-+xt_flowoffload_register_hooks(void)
-+{
-+ struct xt_flowoffload_hook *hook;
-+
-+restart:
-+ hlist_for_each_entry(hook, &hooks, list) {
-+ if (hook->registered)
-+ continue;
-+
-+ hook->registered = true;
-+ hook->net = dev_net(hook->ops.dev);
-+ spin_unlock_bh(&hooks_lock);
-+ nf_register_net_hook(hook->net, &hook->ops);
-+ spin_lock_bh(&hooks_lock);
-+ goto restart;
-+ }
-+
-+}
-+
-+static void
-+xt_flowoffload_cleanup_hooks(void)
-+{
-+ struct xt_flowoffload_hook *hook;
-+
-+restart:
-+ hlist_for_each_entry(hook, &hooks, list) {
-+ if (hook->used || !hook->registered)
-+ continue;
-+
-+ hlist_del(&hook->list);
-+ spin_unlock_bh(&hooks_lock);
-+ nf_unregister_net_hook(hook->net, &hook->ops);
-+ kfree(hook);
-+ spin_lock_bh(&hooks_lock);
-+ goto restart;
-+ }
-+
-+}
-+
-+static void
-+xt_flowoffload_check_hook(struct flow_offload *flow, void *data)
-+{
-+ struct flow_offload_tuple *tuple = &flow->tuplehash[0].tuple;
-+ struct xt_flowoffload_hook *hook;
-+ bool *found = data;
-+ struct rtable *rt = (struct rtable *)tuple->dst_cache;
-+
-+ spin_lock_bh(&hooks_lock);
-+ hlist_for_each_entry(hook, &hooks, list) {
-+ if (hook->ops.dev->ifindex != tuple->iifidx &&
-+ hook->ops.dev->ifindex != rt->dst.dev->ifindex)
-+ continue;
-+
-+ hook->used = true;
-+ *found = true;
-+ }
-+ spin_unlock_bh(&hooks_lock);
-+}
-+
-+static void
-+xt_flowoffload_hook_work(struct work_struct *work)
-+{
-+ struct xt_flowoffload_hook *hook;
-+ bool found = false;
-+ int err;
-+
-+ spin_lock_bh(&hooks_lock);
-+ xt_flowoffload_register_hooks();
-+ hlist_for_each_entry(hook, &hooks, list)
-+ hook->used = false;
-+ spin_unlock_bh(&hooks_lock);
-+
-+ err = nf_flow_table_iterate(&nf_flowtable, xt_flowoffload_check_hook,
-+ &found);
-+ if (err && err != -EAGAIN)
-+ goto out;
-+
-+ spin_lock_bh(&hooks_lock);
-+ xt_flowoffload_cleanup_hooks();
-+ spin_unlock_bh(&hooks_lock);
-+
-+out:
-+ if (found)
-+ queue_delayed_work(system_power_efficient_wq, &hook_work, HZ);
-+}
-+
-+static bool
-+xt_flowoffload_skip(struct sk_buff *skb, int family)
-+{
-+ if (skb_sec_path(skb))
-+ return true;
-+
-+ if (family == NFPROTO_IPV4) {
-+ const struct ip_options *opt = &(IPCB(skb)->opt);
-+
-+ if (unlikely(opt->optlen))
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+static struct dst_entry *
-+xt_flowoffload_dst(const struct nf_conn *ct, enum ip_conntrack_dir dir,
-+ const struct xt_action_param *par, int ifindex)
-+{
-+ struct dst_entry *dst = NULL;
-+ struct flowi fl;
-+
-+ memset(&fl, 0, sizeof(fl));
-+ switch (xt_family(par)) {
-+ case NFPROTO_IPV4:
-+ fl.u.ip4.daddr = ct->tuplehash[dir].tuple.src.u3.ip;
-+ fl.u.ip4.flowi4_oif = ifindex;
-+ break;
-+ case NFPROTO_IPV6:
-+ fl.u.ip6.saddr = ct->tuplehash[dir].tuple.dst.u3.in6;
-+ fl.u.ip6.daddr = ct->tuplehash[dir].tuple.src.u3.in6;
-+ fl.u.ip6.flowi6_oif = ifindex;
-+ break;
-+ }
-+
-+ nf_route(xt_net(par), &dst, &fl, false, xt_family(par));
-+
-+ return dst;
-+}
-+
-+static int
-+xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct,
-+ const struct xt_action_param *par,
-+ struct nf_flow_route *route, enum ip_conntrack_dir dir)
-+{
-+ struct dst_entry *this_dst, *other_dst;
-+
-+ this_dst = xt_flowoffload_dst(ct, !dir, par, xt_out(par)->ifindex);
-+ other_dst = xt_flowoffload_dst(ct, dir, par, xt_in(par)->ifindex);
-+
-+ route->tuple[dir].dst = this_dst;
-+ route->tuple[!dir].dst = other_dst;
-+
-+ if (!this_dst || !other_dst)
-+ return -ENOENT;
-+
-+ if (dst_xfrm(this_dst) || dst_xfrm(other_dst))
-+ return -EINVAL;
-+
-+ return 0;
-+}
-+
-+static unsigned int
-+flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par)
-+{
-+ const struct xt_flowoffload_target_info *info = par->targinfo;
-+ struct tcphdr _tcph, *tcph = NULL;
-+ enum ip_conntrack_info ctinfo;
-+ enum ip_conntrack_dir dir;
-+ struct nf_flow_route route;
-+ struct flow_offload *flow = NULL;
-+ struct nf_conn *ct;
-+ struct net *net;
-+
-+ if (xt_flowoffload_skip(skb, xt_family(par)))
-+ return XT_CONTINUE;
-+
-+ ct = nf_ct_get(skb, &ctinfo);
-+ if (ct == NULL)
-+ return XT_CONTINUE;
-+
-+ switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) {
-+ case IPPROTO_TCP:
-+ if (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED)
-+ return XT_CONTINUE;
-+
-+ tcph = skb_header_pointer(skb, par->thoff,
-+ sizeof(_tcph), &_tcph);
-+ if (unlikely(!tcph || tcph->fin || tcph->rst))
-+ return XT_CONTINUE;
-+ break;
-+ case IPPROTO_UDP:
-+ break;
-+ default:
-+ return XT_CONTINUE;
-+ }
-+
-+ if (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) ||
-+ ct->status & IPS_SEQ_ADJUST)
-+ return XT_CONTINUE;
-+
-+ if (!nf_ct_is_confirmed(ct))
-+ return XT_CONTINUE;
-+
-+ if (!xt_in(par) || !xt_out(par))
-+ return XT_CONTINUE;
-+
-+ if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status))
-+ return XT_CONTINUE;
-+
-+ dir = CTINFO2DIR(ctinfo);
-+
-+ if (xt_flowoffload_route(skb, ct, par, &route, dir) == 0)
-+ flow = flow_offload_alloc(ct, &route);
-+
-+ dst_release(route.tuple[dir].dst);
-+ dst_release(route.tuple[!dir].dst);
-+
-+ if (!flow)
-+ goto err_flow_route;
-+
-+ if (tcph) {
-+ ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
-+ ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
-+ }
-+
-+ if (flow_offload_add(&nf_flowtable, flow) < 0)
-+ goto err_flow_add;
-+
-+ xt_flowoffload_check_device(xt_in(par));
-+ xt_flowoffload_check_device(xt_out(par));
-+
-+ net = read_pnet(&nf_flowtable.ft_net);
-+ if (!net)
-+ write_pnet(&nf_flowtable.ft_net, xt_net(par));
-+
-+ if (info->flags & XT_FLOWOFFLOAD_HW)
-+ nf_flow_offload_hw_add(xt_net(par), flow, ct);
-+
-+ return XT_CONTINUE;
-+
-+err_flow_add:
-+ flow_offload_free(flow);
-+err_flow_route:
-+ clear_bit(IPS_OFFLOAD_BIT, &ct->status);
-+ return XT_CONTINUE;
-+}
-+
-+
-+static int flowoffload_chk(const struct xt_tgchk_param *par)
-+{
-+ struct xt_flowoffload_target_info *info = par->targinfo;
-+
-+ if (info->flags & ~XT_FLOWOFFLOAD_MASK)
-+ return -EINVAL;
-+
-+ return 0;
-+}
-+
-+static struct xt_target offload_tg_reg __read_mostly = {
-+ .family = NFPROTO_UNSPEC,
-+ .name = "FLOWOFFLOAD",
-+ .revision = 0,
-+ .targetsize = sizeof(struct xt_flowoffload_target_info),
-+ .usersize = sizeof(struct xt_flowoffload_target_info),
-+ .checkentry = flowoffload_chk,
-+ .target = flowoffload_tg,
-+ .me = THIS_MODULE,
-+};
-+
-+static int xt_flowoffload_table_init(struct nf_flowtable *table)
-+{
-+ table->flags = NF_FLOWTABLE_F_HW;
-+ nf_flow_table_init(table);
-+ return 0;
-+}
-+
-+static void xt_flowoffload_table_cleanup(struct nf_flowtable *table)
-+{
-+ nf_flow_table_free(table);
-+}
-+
-+static int flow_offload_netdev_event(struct notifier_block *this,
-+ unsigned long event, void *ptr)
-+{
-+ struct xt_flowoffload_hook *hook = NULL;
-+ struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-+
-+ if (event != NETDEV_UNREGISTER)
-+ return NOTIFY_DONE;
-+
-+ spin_lock_bh(&hooks_lock);
-+ hook = flow_offload_lookup_hook(dev);
-+ if (hook) {
-+ hlist_del(&hook->list);
-+ }
-+ spin_unlock_bh(&hooks_lock);
-+ if (hook) {
-+ nf_unregister_net_hook(hook->net, &hook->ops);
-+ kfree(hook);
-+ }
-+
-+ nf_flow_table_cleanup(dev);
-+
-+ return NOTIFY_DONE;
-+}
-+
-+static struct notifier_block flow_offload_netdev_notifier = {
-+ .notifier_call = flow_offload_netdev_event,
-+};
-+
-+static int __init xt_flowoffload_tg_init(void)
-+{
-+ int ret;
-+
-+ register_netdevice_notifier(&flow_offload_netdev_notifier);
-+
-+ INIT_DELAYED_WORK(&hook_work, xt_flowoffload_hook_work);
-+
-+ ret = xt_flowoffload_table_init(&nf_flowtable);
-+ if (ret)
-+ return ret;
-+
-+ ret = xt_register_target(&offload_tg_reg);
-+ if (ret)
-+ xt_flowoffload_table_cleanup(&nf_flowtable);
-+
-+ return ret;
-+}
-+
-+static void __exit xt_flowoffload_tg_exit(void)
-+{
-+ xt_unregister_target(&offload_tg_reg);
-+ xt_flowoffload_table_cleanup(&nf_flowtable);
-+ unregister_netdevice_notifier(&flow_offload_netdev_notifier);
-+}
-+
-+MODULE_LICENSE("GPL");
-+module_init(xt_flowoffload_tg_init);
-+module_exit(xt_flowoffload_tg_exit);
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -7,7 +7,6 @@
- #include <linux/netdevice.h>
- #include <net/ip.h>
- #include <net/ip6_route.h>
--#include <net/netfilter/nf_tables.h>
- #include <net/netfilter/nf_flow_table.h>
- #include <net/netfilter/nf_conntrack.h>
- #include <net/netfilter/nf_conntrack_core.h>
-@@ -338,8 +337,7 @@ flow_offload_lookup(struct nf_flowtable
- }
- EXPORT_SYMBOL_GPL(flow_offload_lookup);
-
--static int
--nf_flow_table_iterate(struct nf_flowtable *flow_table,
-+int nf_flow_table_iterate(struct nf_flowtable *flow_table,
- void (*iter)(struct flow_offload *flow, void *data),
- void *data)
- {
-@@ -372,6 +370,7 @@ nf_flow_table_iterate(struct nf_flowtabl
-
- return err;
- }
-+EXPORT_SYMBOL_GPL(nf_flow_table_iterate);
-
- static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data)
- {
---- /dev/null
-+++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h
-@@ -0,0 +1,17 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+#ifndef _XT_FLOWOFFLOAD_H
-+#define _XT_FLOWOFFLOAD_H
-+
-+#include <linux/types.h>
-+
-+enum {
-+ XT_FLOWOFFLOAD_HW = 1 << 0,
-+
-+ XT_FLOWOFFLOAD_MASK = XT_FLOWOFFLOAD_HW
-+};
-+
-+struct xt_flowoffload_target_info {
-+ __u32 flags;
-+};
-+
-+#endif /* _XT_FLOWOFFLOAD_H */
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -130,6 +130,10 @@ static inline void flow_offload_dead(str
- flow->flags |= FLOW_OFFLOAD_DYING;
- }
-
-+int nf_flow_table_iterate(struct nf_flowtable *flow_table,
-+ void (*iter)(struct flow_offload *flow, void *data),
-+ void *data);
-+
- int nf_flow_snat_port(const struct flow_offload *flow,
- struct sk_buff *skb, unsigned int thoff,
- u8 protocol, enum flow_offload_tuple_dir dir);
diff --git a/target/linux/generic/hack-5.4/651-wireless_mesh_header.patch b/target/linux/generic/hack-5.4/651-wireless_mesh_header.patch
deleted file mode 100644
index f545d8ebbc..0000000000
--- a/target/linux/generic/hack-5.4/651-wireless_mesh_header.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001
-From: Imre Kaloz <kaloz@openwrt.org>
-Date: Fri, 7 Jul 2017 17:21:05 +0200
-Subject: mac80211: increase wireless mesh header size
-
-lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1
-Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
----
- include/linux/netdevice.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -138,8 +138,8 @@ static inline bool dev_xmit_complete(int
-
- #if defined(CONFIG_HYPERV_NET)
- # define LL_MAX_HEADER 128
--#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
--# if defined(CONFIG_MAC80211_MESH)
-+#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1
-+# if defined(CONFIG_MAC80211_MESH) || 1
- # define LL_MAX_HEADER 128
- # else
- # define LL_MAX_HEADER 96
diff --git a/target/linux/generic/hack-5.4/660-fq_codel_defaults.patch b/target/linux/generic/hack-5.4/660-fq_codel_defaults.patch
deleted file mode 100644
index 46bf0e3b0b..0000000000
--- a/target/linux/generic/hack-5.4/660-fq_codel_defaults.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From a6ccb238939b25851474a279b20367fd24a0e816 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:21:53 +0200
-Subject: hack: net: fq_codel: tune defaults for small devices
-
-Assume that x86_64 devices always have a big memory and do not need this
-optimization compared to devices with only 32 MB or 64 MB RAM.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/sched/sch_fq_codel.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/net/sched/sch_fq_codel.c
-+++ b/net/sched/sch_fq_codel.c
-@@ -470,7 +470,11 @@ static int fq_codel_init(struct Qdisc *s
-
- sch->limit = 10*1024;
- q->flows_cnt = 1024;
-+#ifdef CONFIG_X86_64
- q->memory_limit = 32 << 20; /* 32 MBytes */
-+#else
-+ q->memory_limit = 4 << 20; /* 4 MBytes */
-+#endif
- q->drop_batch_size = 64;
- q->quantum = psched_mtu(qdisc_dev(sch));
- INIT_LIST_HEAD(&q->new_flows);
diff --git a/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch
deleted file mode 100644
index 11f1a25bce..0000000000
--- a/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From 1d418f7e88035ed7a94073f6354246c66e9193e9 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:22:58 +0200
-Subject: fq_codel: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/net/sch_generic.h | 3 ++-
- net/sched/Kconfig | 3 ++-
- net/sched/sch_api.c | 2 +-
- net/sched/sch_fq_codel.c | 3 ++-
- net/sched/sch_generic.c | 4 ++--
- 5 files changed, 9 insertions(+), 6 deletions(-)
-
---- a/include/net/sch_generic.h
-+++ b/include/net/sch_generic.h
-@@ -617,12 +617,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
- extern struct Qdisc_ops pfifo_fast_ops;
- extern struct Qdisc_ops mq_qdisc_ops;
- extern struct Qdisc_ops noqueue_qdisc_ops;
-+extern struct Qdisc_ops fq_codel_qdisc_ops;
- extern const struct Qdisc_ops *default_qdisc_ops;
- static inline const struct Qdisc_ops *
- get_default_qdisc_ops(const struct net_device *dev, int ntx)
- {
- return ntx < dev->real_num_tx_queues ?
-- default_qdisc_ops : &pfifo_fast_ops;
-+ default_qdisc_ops : &fq_codel_qdisc_ops;
- }
-
- struct Qdisc_class_common {
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -4,8 +4,9 @@
- #
-
- menuconfig NET_SCHED
-- bool "QoS and/or fair queueing"
-+ def_bool y
- select NET_SCH_FIFO
-+ select NET_SCH_FQ_CODEL
- ---help---
- When the kernel has several packets to send out over a network
- device, it has to decide which ones to send first, which ones to
---- a/net/sched/sch_api.c
-+++ b/net/sched/sch_api.c
-@@ -2278,7 +2278,7 @@ static int __init pktsched_init(void)
- return err;
- }
-
-- register_qdisc(&pfifo_fast_ops);
-+ register_qdisc(&fq_codel_qdisc_ops);
- register_qdisc(&pfifo_qdisc_ops);
- register_qdisc(&bfifo_qdisc_ops);
- register_qdisc(&pfifo_head_drop_qdisc_ops);
---- a/net/sched/sch_fq_codel.c
-+++ b/net/sched/sch_fq_codel.c
-@@ -710,7 +710,7 @@ static const struct Qdisc_class_ops fq_c
- .walk = fq_codel_walk,
- };
-
--static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
-+struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
- .cl_ops = &fq_codel_class_ops,
- .id = "fq_codel",
- .priv_size = sizeof(struct fq_codel_sched_data),
-@@ -725,6 +725,7 @@ static struct Qdisc_ops fq_codel_qdisc_o
- .dump_stats = fq_codel_dump_stats,
- .owner = THIS_MODULE,
- };
-+EXPORT_SYMBOL(fq_codel_qdisc_ops);
-
- static int __init fq_codel_module_init(void)
- {
---- a/net/sched/sch_generic.c
-+++ b/net/sched/sch_generic.c
-@@ -32,7 +32,7 @@
- #include <net/xfrm.h>
-
- /* Qdisc to use by default */
--const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops;
-+const struct Qdisc_ops *default_qdisc_ops = &fq_codel_qdisc_ops;
- EXPORT_SYMBOL(default_qdisc_ops);
-
- static void qdisc_maybe_clear_missed(struct Qdisc *q,
-@@ -1079,12 +1079,12 @@ static void attach_one_default_qdisc(str
- void *_unused)
- {
- struct Qdisc *qdisc;
-- const struct Qdisc_ops *ops = default_qdisc_ops;
-+ const struct Qdisc_ops *ops = &fq_codel_qdisc_ops;
-
- if (dev->priv_flags & IFF_NO_QUEUE)
- ops = &noqueue_qdisc_ops;
- else if(dev->type == ARPHRD_CAN)
-- ops = &pfifo_fast_ops;
-+ ops = &fq_codel_qdisc_ops;
-
- qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL);
- if (!qdisc) {
diff --git a/target/linux/generic/hack-5.4/662-remove_pfifo_fast.patch b/target/linux/generic/hack-5.4/662-remove_pfifo_fast.patch
deleted file mode 100644
index 9df3a8258d..0000000000
--- a/target/linux/generic/hack-5.4/662-remove_pfifo_fast.patch
+++ /dev/null
@@ -1,243 +0,0 @@
-From b531d492d5ef1cf9dba0f4888eb5fd8624a6d762 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:23:42 +0200
-Subject: net: sched: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/sched/sch_generic.c | 140 ------------------------------------------------
- 1 file changed, 140 deletions(-)
-
---- a/net/sched/sch_generic.c
-+++ b/net/sched/sch_generic.c
-@@ -620,230 +620,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
- .owner = THIS_MODULE,
- };
-
--static const u8 prio2band[TC_PRIO_MAX + 1] = {
-- 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
--};
--
--/* 3-band FIFO queue: old style, but should be a bit faster than
-- generic prio+fifo combination.
-- */
--
--#define PFIFO_FAST_BANDS 3
--
--/*
-- * Private data for a pfifo_fast scheduler containing:
-- * - rings for priority bands
-- */
--struct pfifo_fast_priv {
-- struct skb_array q[PFIFO_FAST_BANDS];
--};
--
--static inline struct skb_array *band2list(struct pfifo_fast_priv *priv,
-- int band)
--{
-- return &priv->q[band];
--}
--
--static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc,
-- struct sk_buff **to_free)
--{
-- int band = prio2band[skb->priority & TC_PRIO_MAX];
-- struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
-- struct skb_array *q = band2list(priv, band);
-- unsigned int pkt_len = qdisc_pkt_len(skb);
-- int err;
--
-- err = skb_array_produce(q, skb);
--
-- if (unlikely(err)) {
-- if (qdisc_is_percpu_stats(qdisc))
-- return qdisc_drop_cpu(skb, qdisc, to_free);
-- else
-- return qdisc_drop(skb, qdisc, to_free);
-- }
--
-- qdisc_update_stats_at_enqueue(qdisc, pkt_len);
-- return NET_XMIT_SUCCESS;
--}
--
--static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc)
--{
-- struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
-- struct sk_buff *skb = NULL;
-- bool need_retry = true;
-- int band;
--
--retry:
-- for (band = 0; band < PFIFO_FAST_BANDS && !skb; band++) {
-- struct skb_array *q = band2list(priv, band);
--
-- if (__skb_array_empty(q))
-- continue;
--
-- skb = __skb_array_consume(q);
-- }
-- if (likely(skb)) {
-- qdisc_update_stats_at_dequeue(qdisc, skb);
-- } else if (need_retry &&
-- test_bit(__QDISC_STATE_MISSED, &qdisc->state)) {
-- /* Delay clearing the STATE_MISSED here to reduce
-- * the overhead of the second spin_trylock() in
-- * qdisc_run_begin() and __netif_schedule() calling
-- * in qdisc_run_end().
-- */
-- clear_bit(__QDISC_STATE_MISSED, &qdisc->state);
--
-- /* Make sure dequeuing happens after clearing
-- * STATE_MISSED.
-- */
-- smp_mb__after_atomic();
--
-- need_retry = false;
--
-- goto retry;
-- } else {
-- WRITE_ONCE(qdisc->empty, true);
-- }
--
-- return skb;
--}
--
--static struct sk_buff *pfifo_fast_peek(struct Qdisc *qdisc)
--{
-- struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
-- struct sk_buff *skb = NULL;
-- int band;
--
-- for (band = 0; band < PFIFO_FAST_BANDS && !skb; band++) {
-- struct skb_array *q = band2list(priv, band);
--
-- skb = __skb_array_peek(q);
-- }
--
-- return skb;
--}
--
--static void pfifo_fast_reset(struct Qdisc *qdisc)
--{
-- int i, band;
-- struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
--
-- for (band = 0; band < PFIFO_FAST_BANDS; band++) {
-- struct skb_array *q = band2list(priv, band);
-- struct sk_buff *skb;
--
-- /* NULL ring is possible if destroy path is due to a failed
-- * skb_array_init() in pfifo_fast_init() case.
-- */
-- if (!q->ring.queue)
-- continue;
--
-- while ((skb = __skb_array_consume(q)) != NULL)
-- kfree_skb(skb);
-- }
--
-- if (qdisc_is_percpu_stats(qdisc)) {
-- for_each_possible_cpu(i) {
-- struct gnet_stats_queue *q;
--
-- q = per_cpu_ptr(qdisc->cpu_qstats, i);
-- q->backlog = 0;
-- q->qlen = 0;
-- }
-- }
--}
--
--static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb)
--{
-- struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS };
--
-- memcpy(&opt.priomap, prio2band, TC_PRIO_MAX + 1);
-- if (nla_put(skb, TCA_OPTIONS, sizeof(opt), &opt))
-- goto nla_put_failure;
-- return skb->len;
--
--nla_put_failure:
-- return -1;
--}
--
--static int pfifo_fast_init(struct Qdisc *qdisc, struct nlattr *opt,
-- struct netlink_ext_ack *extack)
--{
-- unsigned int qlen = qdisc_dev(qdisc)->tx_queue_len;
-- struct pfifo_fast_priv *priv = qdisc_priv(qdisc);
-- int prio;
--
-- /* guard against zero length rings */
-- if (!qlen)
-- return -EINVAL;
--
-- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
-- struct skb_array *q = band2list(priv, prio);
-- int err;
--
-- err = skb_array_init(q, qlen, GFP_KERNEL);
-- if (err)
-- return -ENOMEM;
-- }
--
-- /* Can by-pass the queue discipline */
-- qdisc->flags |= TCQ_F_CAN_BYPASS;
-- return 0;
--}
--
--static void pfifo_fast_destroy(struct Qdisc *sch)
--{
-- struct pfifo_fast_priv *priv = qdisc_priv(sch);
-- int prio;
--
-- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
-- struct skb_array *q = band2list(priv, prio);
--
-- /* NULL ring is possible if destroy path is due to a failed
-- * skb_array_init() in pfifo_fast_init() case.
-- */
-- if (!q->ring.queue)
-- continue;
-- /* Destroy ring but no need to kfree_skb because a call to
-- * pfifo_fast_reset() has already done that work.
-- */
-- ptr_ring_cleanup(&q->ring, NULL);
-- }
--}
--
--static int pfifo_fast_change_tx_queue_len(struct Qdisc *sch,
-- unsigned int new_len)
--{
-- struct pfifo_fast_priv *priv = qdisc_priv(sch);
-- struct skb_array *bands[PFIFO_FAST_BANDS];
-- int prio;
--
-- for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) {
-- struct skb_array *q = band2list(priv, prio);
--
-- bands[prio] = q;
-- }
--
-- return skb_array_resize_multiple(bands, PFIFO_FAST_BANDS, new_len,
-- GFP_KERNEL);
--}
--
--struct Qdisc_ops pfifo_fast_ops __read_mostly = {
-- .id = "pfifo_fast",
-- .priv_size = sizeof(struct pfifo_fast_priv),
-- .enqueue = pfifo_fast_enqueue,
-- .dequeue = pfifo_fast_dequeue,
-- .peek = pfifo_fast_peek,
-- .init = pfifo_fast_init,
-- .destroy = pfifo_fast_destroy,
-- .reset = pfifo_fast_reset,
-- .dump = pfifo_fast_dump,
-- .change_tx_queue_len = pfifo_fast_change_tx_queue_len,
-- .owner = THIS_MODULE,
-- .static_flags = TCQ_F_NOLOCK | TCQ_F_CPUSTATS,
--};
--EXPORT_SYMBOL(pfifo_fast_ops);
--
- struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
- const struct Qdisc_ops *ops,
- struct netlink_ext_ack *extack)
diff --git a/target/linux/generic/hack-5.4/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-5.4/700-swconfig_switch_drivers.patch
deleted file mode 100644
index b954bbb63e..0000000000
--- a/target/linux/generic/hack-5.4/700-swconfig_switch_drivers.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:24:23 +0200
-Subject: net: swconfig: adds openwrt switch layer
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/net/phy/Kconfig | 83 +++++++++++++++++++++++++++++++++++++++++++++++
- drivers/net/phy/Makefile | 15 +++++++++
- include/uapi/linux/Kbuild | 1 +
- 3 files changed, 99 insertions(+)
-
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -250,6 +250,81 @@ config LED_TRIGGER_PHY
- for any speed known to the PHY.
-
-
-+comment "Switch configuration API + drivers"
-+
-+config SWCONFIG
-+ tristate "Switch configuration API"
-+ ---help---
-+ Switch configuration API using netlink. This allows
-+ you to configure the VLAN features of certain switches.
-+
-+config SWCONFIG_LEDS
-+ bool "Switch LED trigger support"
-+ depends on (SWCONFIG && LEDS_TRIGGERS)
-+
-+config ADM6996_PHY
-+ tristate "Driver for ADM6996 switches"
-+ select SWCONFIG
-+ ---help---
-+ Currently supports the ADM6996FC and ADM6996M switches.
-+ Support for FC is very limited.
-+
-+config AR8216_PHY
-+ tristate "Driver for Atheros AR8216 switches"
-+ select ETHERNET_PACKET_MANGLE
-+ select SWCONFIG
-+
-+config AR8216_PHY_LEDS
-+ bool "Atheros AR8216 switch LED support"
-+ depends on (AR8216_PHY && LEDS_CLASS)
-+
-+source "drivers/net/phy/b53/Kconfig"
-+
-+config IP17XX_PHY
-+ tristate "Driver for IC+ IP17xx switches"
-+ select SWCONFIG
-+
-+config PSB6970_PHY
-+ tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch"
-+ select SWCONFIG
-+ select ETHERNET_PACKET_MANGLE
-+
-+config RTL8306_PHY
-+ tristate "Driver for Realtek RTL8306S switches"
-+ select SWCONFIG
-+
-+config RTL8366_SMI
-+ tristate "Driver for the RTL8366 SMI interface"
-+ depends on GPIOLIB
-+ ---help---
-+ This module implements the SMI interface protocol which is used
-+ by some RTL8366 ethernet switch devices via the generic GPIO API.
-+
-+if RTL8366_SMI
-+
-+config RTL8366_SMI_DEBUG_FS
-+ bool "RTL8366 SMI interface debugfs support"
-+ depends on DEBUG_FS
-+ default n
-+
-+config RTL8366S_PHY
-+ tristate "Driver for the Realtek RTL8366S switch"
-+ select SWCONFIG
-+
-+config RTL8366RB_PHY
-+ tristate "Driver for the Realtek RTL8366RB switch"
-+ select SWCONFIG
-+
-+config RTL8367_PHY
-+ tristate "Driver for the Realtek RTL8367R/M switches"
-+ select SWCONFIG
-+
-+config RTL8367B_PHY
-+ tristate "Driver fot the Realtek RTL8367R-VB switch"
-+ select SWCONFIG
-+
-+endif # RTL8366_SMI
-+
- comment "MII PHY device drivers"
-
- config SFP
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -22,6 +22,19 @@ libphy-$(CONFIG_LED_TRIGGER_PHY) += phy_
- obj-$(CONFIG_PHYLINK) += phylink.o
- obj-$(CONFIG_PHYLIB) += libphy.o
-
-+obj-$(CONFIG_SWCONFIG) += swconfig.o
-+obj-$(CONFIG_ADM6996_PHY) += adm6996.o
-+obj-$(CONFIG_AR8216_PHY) += ar8216.o ar8327.o
-+obj-$(CONFIG_SWCONFIG_B53) += b53/
-+obj-$(CONFIG_IP17XX_PHY) += ip17xx.o
-+obj-$(CONFIG_PSB6970_PHY) += psb6970.o
-+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
-+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o
-+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
-+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
-+obj-$(CONFIG_RTL8367_PHY) += rtl8367.o
-+obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o
-+
- obj-$(CONFIG_MDIO_ASPEED) += mdio-aspeed.o
- obj-$(CONFIG_MDIO_BCM_IPROC) += mdio-bcm-iproc.o
- obj-$(CONFIG_MDIO_BCM_UNIMAC) += mdio-bcm-unimac.o
---- a/include/linux/platform_data/b53.h
-+++ b/include/linux/platform_data/b53.h
-@@ -29,6 +29,9 @@ struct b53_platform_data {
- u32 chip_id;
- u16 enabled_ports;
-
-+ /* allow to specify an ethX alias */
-+ const char *alias;
-+
- /* only used by MMAP'd driver */
- unsigned big_endian:1;
- void __iomem *regs;
diff --git a/target/linux/generic/hack-5.4/703-add_vsc8504_support.patch b/target/linux/generic/hack-5.4/703-add_vsc8504_support.patch
deleted file mode 100644
index afb6ca6cf3..0000000000
--- a/target/linux/generic/hack-5.4/703-add_vsc8504_support.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From: Roman Kuzmitskii <damex.pp@icloud.com>
-Date: Thu, 05 Nov 2020 02:00:00 +0000
-Subject: [PATCH] net: phy: vitesse: add vsc8504 support
-
-This patch adds support for vsc8504 phy.
-That phy is changed owner:
- vitesse -> microsemi -> microchip
-So is its driver in kernel was changed and rewritten.
-
-there is no need to upstream this patch.
-this vsc8504 is supported by newer kernels out of box.
-support could be enabled by CONFIG_MICROSEMI_PHY.
-
-Tested-by: Johannes Kimmel <fff@bareminimum.eu>
-Signed-off-by: Roman Kuzmitskii <damex.pp@icloud.com>
---- a/drivers/net/phy/vitesse.c
-+++ b/drivers/net/phy/vitesse.c
-@@ -61,6 +61,7 @@
-
- #define PHY_ID_VSC8234 0x000fc620
- #define PHY_ID_VSC8244 0x000fc6c0
-+#define PHY_ID_VSC8504 0x000704c2
- #define PHY_ID_VSC8572 0x000704d0
- #define PHY_ID_VSC8601 0x00070420
- #define PHY_ID_VSC7385 0x00070450
-@@ -292,6 +293,7 @@ static int vsc82xx_config_intr(struct ph
- err = phy_write(phydev, MII_VSC8244_IMASK,
- (phydev->drv->phy_id == PHY_ID_VSC8234 ||
- phydev->drv->phy_id == PHY_ID_VSC8244 ||
-+ phydev->drv->phy_id == PHY_ID_VSC8504 ||
- phydev->drv->phy_id == PHY_ID_VSC8572 ||
- phydev->drv->phy_id == PHY_ID_VSC8601) ?
- MII_VSC8244_IMASK_MASK :
-@@ -402,6 +404,15 @@ static struct phy_driver vsc82xx_driver[
- .ack_interrupt = &vsc824x_ack_interrupt,
- .config_intr = &vsc82xx_config_intr,
- }, {
-+ .phy_id = PHY_ID_VSC8504,
-+ .name = "Vitesse VSC8504",
-+ .phy_id_mask = 0x000ffff0,
-+ /* PHY_GBIT_FEATURES */
-+ .config_init = &vsc824x_config_init,
-+ .config_aneg = &vsc82x4_config_aneg,
-+ .ack_interrupt = &vsc824x_ack_interrupt,
-+ .config_intr = &vsc82xx_config_intr,
-+}, {
- .phy_id = PHY_ID_VSC8572,
- .name = "Vitesse VSC8572",
- .phy_id_mask = 0x000ffff0,
-@@ -488,6 +499,7 @@ module_phy_driver(vsc82xx_driver);
- static struct mdio_device_id __maybe_unused vitesse_tbl[] = {
- { PHY_ID_VSC8234, 0x000ffff0 },
- { PHY_ID_VSC8244, 0x000fffc0 },
-+ { PHY_ID_VSC8504, 0x000ffff0 },
- { PHY_ID_VSC8572, 0x000ffff0 },
- { PHY_ID_VSC7385, 0x000ffff0 },
- { PHY_ID_VSC7388, 0x000ffff0 },
diff --git a/target/linux/generic/hack-5.4/710-net-dsa-mv88e6xxx-default-VID-1.patch b/target/linux/generic/hack-5.4/710-net-dsa-mv88e6xxx-default-VID-1.patch
deleted file mode 100644
index 5dc5ac6825..0000000000
--- a/target/linux/generic/hack-5.4/710-net-dsa-mv88e6xxx-default-VID-1.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -1930,6 +1930,7 @@ static int mv88e6xxx_port_fdb_add(struct
- struct mv88e6xxx_chip *chip = ds->priv;
- int err;
-
-+ vid = vid ? : 1;
- mv88e6xxx_reg_lock(chip);
- err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid,
- MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC);
-@@ -1944,6 +1945,7 @@ static int mv88e6xxx_port_fdb_del(struct
- struct mv88e6xxx_chip *chip = ds->priv;
- int err;
-
-+ vid = vid ? : 1;
- mv88e6xxx_reg_lock(chip);
- err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, 0);
- mv88e6xxx_reg_unlock(chip);
diff --git a/target/linux/generic/hack-5.4/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch b/target/linux/generic/hack-5.4/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch
deleted file mode 100644
index 1da388c862..0000000000
--- a/target/linux/generic/hack-5.4/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -2492,6 +2492,9 @@ static int mv88e6xxx_setup_port(struct m
- if (dsa_is_cpu_port(ds, port))
- reg = 0;
-
-+ /* Disable ATU member violation interrupt */
-+ reg |= MV88E6XXX_PORT_ASSOC_VECTOR_IGNORE_WRONG;
-+
- err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ASSOC_VECTOR,
- reg);
- if (err)
diff --git a/target/linux/generic/hack-5.4/721-phy_packets.patch b/target/linux/generic/hack-5.4/721-phy_packets.patch
deleted file mode 100644
index 89ff8ea41a..0000000000
--- a/target/linux/generic/hack-5.4/721-phy_packets.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-From ffe387740bbe88dd88bbe04d6375902708003d6e Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 17:25:00 +0200
-Subject: net: add packet mangeling patch
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/netdevice.h | 11 +++++++++++
- include/linux/skbuff.h | 14 ++++----------
- net/Kconfig | 6 ++++++
- net/core/dev.c | 18 ++++++++++++++----
- net/core/skbuff.c | 17 +++++++++++++++++
- net/ethernet/eth.c | 6 ++++++
- 6 files changed, 58 insertions(+), 14 deletions(-)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1540,6 +1540,7 @@ enum netdev_priv_flags {
- IFF_FAILOVER_SLAVE = 1<<28,
- IFF_L3MDEV_RX_HANDLER = 1<<29,
- IFF_LIVE_RENAME_OK = 1<<30,
-+ IFF_NO_IP_ALIGN = 1<<31,
- };
-
- #define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
-@@ -1572,6 +1573,7 @@ enum netdev_priv_flags {
- #define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE
- #define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER
- #define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK
-+#define IFF_NO_IP_ALIGN IFF_NO_IP_ALIGN
-
- /* Specifies the type of the struct net_device::ml_priv pointer */
- enum netdev_ml_priv_type {
-@@ -1882,6 +1884,11 @@ struct net_device {
- const struct tlsdev_ops *tlsdev_ops;
- #endif
-
-+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-+ void (*eth_mangle_rx)(struct net_device *dev, struct sk_buff *skb);
-+ struct sk_buff *(*eth_mangle_tx)(struct net_device *dev, struct sk_buff *skb);
-+#endif
-+
- const struct header_ops *header_ops;
-
- unsigned int flags;
-@@ -1964,6 +1971,10 @@ struct net_device {
- struct mpls_dev __rcu *mpls_ptr;
- #endif
-
-+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-+ void *phy_ptr; /* PHY device specific data */
-+#endif
-+
- /*
- * Cache lines mostly used on receive path (including eth_type_trans())
- */
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -2684,6 +2684,10 @@ static inline int pskb_trim(struct sk_bu
- return (len < skb->len) ? __pskb_trim(skb, len) : 0;
- }
-
-+extern struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev,
-+ unsigned int length, gfp_t gfp);
-+
-+
- /**
- * pskb_trim_unique - remove end from a paged unique (not cloned) buffer
- * @skb: buffer to alter
-@@ -2815,16 +2819,6 @@ static inline struct sk_buff *dev_alloc_
- }
-
-
--static inline struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev,
-- unsigned int length, gfp_t gfp)
--{
-- struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp);
--
-- if (NET_IP_ALIGN && skb)
-- skb_reserve(skb, NET_IP_ALIGN);
-- return skb;
--}
--
- static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
- unsigned int length)
- {
---- a/net/Kconfig
-+++ b/net/Kconfig
-@@ -26,6 +26,12 @@ menuconfig NET
-
- if NET
-
-+config ETHERNET_PACKET_MANGLE
-+ bool
-+ help
-+ This option can be selected by phy drivers that need to mangle
-+ packets going in or out of an ethernet device.
-+
- config WANT_COMPAT_NETLINK_MESSAGES
- bool
- help
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -3221,10 +3221,20 @@ static int xmit_one(struct sk_buff *skb,
- if (dev_nit_active(dev))
- dev_queue_xmit_nit(skb, dev);
-
-- len = skb->len;
-- trace_net_dev_start_xmit(skb, dev);
-- rc = netdev_start_xmit(skb, dev, txq, more);
-- trace_net_dev_xmit(skb, rc, dev, len);
-+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-+ if (!dev->eth_mangle_tx ||
-+ (skb = dev->eth_mangle_tx(dev, skb)) != NULL)
-+#else
-+ if (1)
-+#endif
-+ {
-+ len = skb->len;
-+ trace_net_dev_start_xmit(skb, dev);
-+ rc = netdev_start_xmit(skb, dev, txq, more);
-+ trace_net_dev_xmit(skb, rc, dev, len);
-+ } else {
-+ rc = NETDEV_TX_OK;
-+ }
-
- return rc;
- }
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
-@@ -60,6 +60,7 @@
- #include <linux/prefetch.h>
- #include <linux/if_vlan.h>
- #include <linux/mpls.h>
-+#include <linux/if.h>
-
- #include <net/protocol.h>
- #include <net/dst.h>
-@@ -549,6 +550,22 @@ skb_fail:
- }
- EXPORT_SYMBOL(__napi_alloc_skb);
-
-+struct sk_buff *__netdev_alloc_skb_ip_align(struct net_device *dev,
-+ unsigned int length, gfp_t gfp)
-+{
-+ struct sk_buff *skb = __netdev_alloc_skb(dev, length + NET_IP_ALIGN, gfp);
-+
-+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-+ if (dev && (dev->priv_flags & IFF_NO_IP_ALIGN))
-+ return skb;
-+#endif
-+
-+ if (NET_IP_ALIGN && skb)
-+ skb_reserve(skb, NET_IP_ALIGN);
-+ return skb;
-+}
-+EXPORT_SYMBOL(__netdev_alloc_skb_ip_align);
-+
- void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
- int size, unsigned int truesize)
- {
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
-@@ -171,6 +171,12 @@ __be16 eth_type_trans(struct sk_buff *sk
- const struct ethhdr *eth;
-
- skb->dev = dev;
-+
-+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
-+ if (dev->eth_mangle_rx)
-+ dev->eth_mangle_rx(dev, skb);
-+#endif
-+
- skb_reset_mac_header(skb);
-
- eth = (struct ethhdr *)skb->data;
diff --git a/target/linux/generic/hack-5.4/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-5.4/760-net-usb-r8152-add-LED-configuration-from-OF.patch
deleted file mode 100644
index a96661c968..0000000000
--- a/target/linux/generic/hack-5.4/760-net-usb-r8152-add-LED-configuration-from-OF.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Sun, 26 Jul 2020 02:38:31 +0200
-Subject: [PATCH] net: usb: r8152: add LED configuration from OF
-
-This adds the ability to configure the LED configuration register using
-OF. This way, the correct value for board specific LED configuration can
-be determined.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++
- 1 file changed, 23 insertions(+)
-
---- a/drivers/net/usb/r8152.c
-+++ b/drivers/net/usb/r8152.c
-@@ -11,6 +11,7 @@
- #include <linux/mii.h>
- #include <linux/ethtool.h>
- #include <linux/usb.h>
-+#include <linux/of.h>
- #include <linux/crc32.h>
- #include <linux/if_vlan.h>
- #include <linux/uaccess.h>
-@@ -4336,6 +4337,22 @@ static void rtl_tally_reset(struct r8152
- ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
- }
-
-+static int r8152_led_configuration(struct r8152 *tp)
-+{
-+ u32 led_data;
-+ int ret;
-+
-+ ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data",
-+ &led_data);
-+
-+ if (ret)
-+ return ret;
-+
-+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data);
-+
-+ return 0;
-+}
-+
- static void r8152b_init(struct r8152 *tp)
- {
- u32 ocp_data;
-@@ -4377,6 +4394,8 @@ static void r8152b_init(struct r8152 *tp
- ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
- ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
- ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
-+
-+ r8152_led_configuration(tp);
- }
-
- static void r8153_init(struct r8152 *tp)
-@@ -4511,6 +4530,8 @@ static void r8153_init(struct r8152 *tp)
- tp->coalesce = COALESCE_SLOW;
- break;
- }
-+
-+ r8152_led_configuration(tp);
- }
-
- static void r8153b_init(struct r8152 *tp)
-@@ -4587,6 +4608,8 @@ static void r8153b_init(struct r8152 *tp
- rtl_tally_reset(tp);
-
- tp->coalesce = 15000; /* 15 us */
-+
-+ r8152_led_configuration(tp);
- }
-
- static int rtl8152_pre_reset(struct usb_interface *intf)
diff --git a/target/linux/generic/hack-5.4/761-dt-bindings-net-add-RTL8152-binding-documentation.patch b/target/linux/generic/hack-5.4/761-dt-bindings-net-add-RTL8152-binding-documentation.patch
deleted file mode 100644
index be262b993c..0000000000
--- a/target/linux/generic/hack-5.4/761-dt-bindings-net-add-RTL8152-binding-documentation.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 3ee05f4aa64fc86af3be5bc176ba5808de9260a7 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Sun, 26 Jul 2020 15:30:33 +0200
-Subject: [PATCH] dt-bindings: net: add RTL8152 binding documentation
-
-Add binding documentation for the Realtek RTL8152 / RTL8153 USB ethernet
-adapters.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- .../bindings/net/realtek,rtl8152.yaml | 36 +++++++++++++++++++
- 1 file changed, 36 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/net/realtek,rtl8152.yaml
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/net/realtek,rtl8152.yaml
-@@ -0,0 +1,36 @@
-+# SPDX-License-Identifier: GPL-2.0
-+%YAML 1.2
-+---
-+$id: http://devicetree.org/schemas/net/realtek,rtl8152.yaml#
-+$schema: http://devicetree.org/meta-schemas/core.yaml#
-+
-+title: Realtek RTL8152/RTL8153 series USB ethernet
-+
-+maintainers:
-+ - David Bauer <mail@david-bauer.net>
-+
-+properties:
-+ compatible:
-+ oneOf:
-+ - items:
-+ - enum:
-+ - realtek,rtl8152
-+ - realtek,rtl8153
-+
-+ reg:
-+ description: The device number on the USB bus
-+
-+ realtek,led-data:
-+ description: Value to be written to the LED configuration register.
-+
-+required:
-+ - compatible
-+ - reg
-+
-+examples:
-+ - |
-+ usb-eth@2 {
-+ compatible = "realtek,rtl8153";
-+ reg = <2>;
-+ realtek,led-data = <0x87>;
-+ };
-\ No newline at end of file
diff --git a/target/linux/generic/hack-5.4/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-5.4/773-bgmac-add-srab-switch.patch
deleted file mode 100644
index 88109ac8b0..0000000000
--- a/target/linux/generic/hack-5.4/773-bgmac-add-srab-switch.patch
+++ /dev/null
@@ -1,98 +0,0 @@
-From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Fri, 7 Jul 2017 17:26:01 +0200
-Subject: bcm53xx: bgmac: use srab switch driver
-
-use the srab switch driver on these SoCs.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/net/ethernet/broadcom/bgmac-bcma.c | 1 +
- drivers/net/ethernet/broadcom/bgmac.c | 24 ++++++++++++++++++++++++
- drivers/net/ethernet/broadcom/bgmac.h | 4 ++++
- 3 files changed, 29 insertions(+)
-
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -266,6 +266,7 @@ static int bgmac_probe(struct bcma_devic
- bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
- bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
-+ bgmac->feature_flags |= BGMAC_FEAT_SRAB;
- break;
- default:
- bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
---- a/drivers/net/ethernet/broadcom/bgmac.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
-@@ -12,6 +12,7 @@
- #include <linux/bcma/bcma.h>
- #include <linux/etherdevice.h>
- #include <linux/interrupt.h>
-+#include <linux/platform_data/b53.h>
- #include <linux/bcm47xx_nvram.h>
- #include <linux/phy.h>
- #include <linux/phy_fixed.h>
-@@ -1407,6 +1408,17 @@ static const struct ethtool_ops bgmac_et
- .set_link_ksettings = phy_ethtool_set_link_ksettings,
- };
-
-+static struct b53_platform_data bgmac_b53_pdata = {
-+};
-+
-+static struct platform_device bgmac_b53_dev = {
-+ .name = "b53-srab-switch",
-+ .id = -1,
-+ .dev = {
-+ .platform_data = &bgmac_b53_pdata,
-+ },
-+};
-+
- /**************************************************
- * MII
- **************************************************/
-@@ -1538,6 +1550,14 @@ int bgmac_enet_probe(struct bgmac *bgmac
- net_dev->hw_features = net_dev->features;
- net_dev->vlan_features = net_dev->features;
-
-+ if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) {
-+ bgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000);
-+
-+ err = platform_device_register(&bgmac_b53_dev);
-+ if (!err)
-+ bgmac->b53_device = &bgmac_b53_dev;
-+ }
-+
- err = register_netdev(bgmac->net_dev);
- if (err) {
- dev_err(bgmac->dev, "Cannot register net device\n");
-@@ -1560,6 +1580,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
-
- void bgmac_enet_remove(struct bgmac *bgmac)
- {
-+ if (bgmac->b53_device)
-+ platform_device_unregister(&bgmac_b53_dev);
-+ bgmac->b53_device = NULL;
-+
- unregister_netdev(bgmac->net_dev);
- phy_disconnect(bgmac->net_dev->phydev);
- netif_napi_del(&bgmac->napi);
---- a/drivers/net/ethernet/broadcom/bgmac.h
-+++ b/drivers/net/ethernet/broadcom/bgmac.h
-@@ -427,6 +427,7 @@
- #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18)
- #define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19)
- #define BGMAC_FEAT_IDM_MASK BIT(20)
-+#define BGMAC_FEAT_SRAB BIT(21)
-
- struct bgmac_slot_info {
- union {
-@@ -532,6 +533,9 @@ struct bgmac {
- void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
- u32 set);
- int (*phy_connect)(struct bgmac *bgmac);
-+
-+ /* platform device for associated switch */
-+ struct platform_device *b53_device;
- };
-
- struct bgmac *bgmac_alloc(struct device *dev);
diff --git a/target/linux/generic/hack-5.4/901-debloat_sock_diag.patch b/target/linux/generic/hack-5.4/901-debloat_sock_diag.patch
deleted file mode 100644
index 0abb672639..0000000000
--- a/target/linux/generic/hack-5.4/901-debloat_sock_diag.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From 3b6115d6b57a263bdc8c9b1df273bd4a7955eead Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 8 Jul 2017 08:16:31 +0200
-Subject: debloat: add some debloat patches, strip down procfs and make O_DIRECT support optional, saves ~15K after lzma on MIPS
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/Kconfig | 3 +++
- net/core/Makefile | 3 ++-
- net/core/sock.c | 2 ++
- net/ipv4/Kconfig | 1 +
- net/netlink/Kconfig | 1 +
- net/packet/Kconfig | 1 +
- net/unix/Kconfig | 1 +
- 7 files changed, 11 insertions(+), 1 deletion(-)
-
---- a/net/Kconfig
-+++ b/net/Kconfig
-@@ -103,6 +103,9 @@ source "net/netlabel/Kconfig"
-
- endif # if INET
-
-+config SOCK_DIAG
-+ bool
-+
- config NETWORK_SECMARK
- bool "Security Marking"
- help
---- a/net/core/Makefile
-+++ b/net/core/Makefile
-@@ -10,9 +10,10 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.
-
- obj-y += dev.o ethtool.o dev_addr_lists.o dst.o netevent.o \
- neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
-- sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
-+ dev_ioctl.o tso.o sock_reuseport.o \
- fib_notifier.o xdp.o flow_offload.o
-
-+obj-$(CONFIG_SOCK_DIAG) += sock_diag.o
- obj-y += net-sysfs.o
- obj-$(CONFIG_PAGE_POOL) += page_pool.o
- obj-$(CONFIG_PROC_FS) += net-procfs.o
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -140,6 +140,7 @@
-
- static DEFINE_MUTEX(proto_list_mutex);
- static LIST_HEAD(proto_list);
-+static atomic64_t cookie_gen;
-
- static void sock_inuse_add(struct net *net, int val);
-
-@@ -539,6 +540,18 @@ discard_and_relse:
- }
- EXPORT_SYMBOL(__sk_receive_skb);
-
-+u64 sock_gen_cookie(struct sock *sk)
-+{
-+ while (1) {
-+ u64 res = atomic64_read(&sk->sk_cookie);
-+
-+ if (res)
-+ return res;
-+ res = atomic64_inc_return(&cookie_gen);
-+ atomic64_cmpxchg(&sk->sk_cookie, 0, res);
-+ }
-+}
-+
- struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie)
- {
- struct dst_entry *dst = __sk_dst_get(sk);
-@@ -1760,9 +1773,11 @@ static void __sk_free(struct sock *sk)
- if (likely(sk->sk_net_refcnt))
- sock_inuse_add(sock_net(sk), -1);
-
-+#ifdef CONFIG_SOCK_DIAG
- if (unlikely(sk->sk_net_refcnt && sock_diag_has_destroy_listeners(sk)))
- sock_diag_broadcast_destroy(sk);
- else
-+#endif
- sk_destruct(sk);
- }
-
---- a/net/core/sock_diag.c
-+++ b/net/core/sock_diag.c
-@@ -19,19 +19,6 @@ static const struct sock_diag_handler *s
- static int (*inet_rcv_compat)(struct sk_buff *skb, struct nlmsghdr *nlh);
- static DEFINE_MUTEX(sock_diag_table_mutex);
- static struct workqueue_struct *broadcast_wq;
--static atomic64_t cookie_gen;
--
--u64 sock_gen_cookie(struct sock *sk)
--{
-- while (1) {
-- u64 res = atomic64_read(&sk->sk_cookie);
--
-- if (res)
-- return res;
-- res = atomic64_inc_return(&cookie_gen);
-- atomic64_cmpxchg(&sk->sk_cookie, 0, res);
-- }
--}
-
- int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie)
- {
---- a/net/ipv4/Kconfig
-+++ b/net/ipv4/Kconfig
-@@ -400,6 +400,7 @@ config INET_TUNNEL
-
- config INET_DIAG
- tristate "INET: socket monitoring interface"
-+ select SOCK_DIAG
- default y
- ---help---
- Support for INET (TCP, DCCP, etc) socket monitoring interface used by
---- a/net/netlink/Kconfig
-+++ b/net/netlink/Kconfig
-@@ -5,6 +5,7 @@
-
- config NETLINK_DIAG
- tristate "NETLINK: socket monitoring interface"
-+ select SOCK_DIAG
- default n
- ---help---
- Support for NETLINK socket monitoring interface used by the ss tool.
---- a/net/packet/Kconfig
-+++ b/net/packet/Kconfig
-@@ -19,6 +19,7 @@ config PACKET
- config PACKET_DIAG
- tristate "Packet: sockets monitoring interface"
- depends on PACKET
-+ select SOCK_DIAG
- default n
- ---help---
- Support for PF_PACKET sockets monitoring interface used by the ss tool.
---- a/net/unix/Kconfig
-+++ b/net/unix/Kconfig
-@@ -28,6 +28,7 @@ config UNIX_SCM
- config UNIX_DIAG
- tristate "UNIX: socket monitoring interface"
- depends on UNIX
-+ select SOCK_DIAG
- default n
- ---help---
- Support for UNIX socket monitoring interface used by the ss tool.
diff --git a/target/linux/generic/hack-5.4/902-debloat_proc.patch b/target/linux/generic/hack-5.4/902-debloat_proc.patch
deleted file mode 100644
index 198b03768b..0000000000
--- a/target/linux/generic/hack-5.4/902-debloat_proc.patch
+++ /dev/null
@@ -1,408 +0,0 @@
-From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 8 Jul 2017 08:20:09 +0200
-Subject: debloat: procfs
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- fs/locks.c | 2 ++
- fs/proc/Kconfig | 5 +++++
- fs/proc/consoles.c | 3 +++
- fs/proc/proc_tty.c | 11 ++++++++++-
- include/net/snmp.h | 18 +++++++++++++++++-
- ipc/msg.c | 3 +++
- ipc/sem.c | 2 ++
- ipc/shm.c | 2 ++
- ipc/util.c | 3 +++
- kernel/exec_domain.c | 2 ++
- kernel/irq/proc.c | 9 +++++++++
- kernel/time/timer_list.c | 2 ++
- mm/vmalloc.c | 2 ++
- mm/vmstat.c | 8 +++++---
- net/8021q/vlanproc.c | 6 ++++++
- net/core/net-procfs.c | 18 ++++++++++++------
- net/core/sock.c | 2 ++
- net/ipv4/fib_trie.c | 18 ++++++++++++------
- net/ipv4/proc.c | 3 +++
- net/ipv4/route.c | 3 +++
- 20 files changed, 105 insertions(+), 17 deletions(-)
-
---- a/fs/locks.c
-+++ b/fs/locks.c
-@@ -2989,6 +2989,8 @@ static const struct seq_operations locks
-
- static int __init proc_locks_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
- proc_create_seq_private("locks", 0, NULL, &locks_seq_operations,
- sizeof(struct locks_iterator), NULL);
- return 0;
---- a/fs/proc/Kconfig
-+++ b/fs/proc/Kconfig
-@@ -100,6 +100,11 @@ config PROC_CHILDREN
- Say Y if you are running any user-space software which takes benefit from
- this interface. For example, rkt is such a piece of software.
-
-+config PROC_STRIPPED
-+ default n
-+ depends on EXPERT
-+ bool "Strip non-essential /proc functionality to reduce code size"
-+
- config PROC_PID_ARCH_STATUS
- def_bool n
- depends on PROC_FS
---- a/fs/proc/consoles.c
-+++ b/fs/proc/consoles.c
-@@ -92,6 +92,9 @@ static const struct seq_operations conso
-
- static int __init proc_consoles_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
-+
- proc_create_seq("consoles", 0, NULL, &consoles_op);
- return 0;
- }
---- a/fs/proc/proc_tty.c
-+++ b/fs/proc/proc_tty.c
-@@ -133,7 +133,10 @@ static const struct seq_operations tty_d
- void proc_tty_register_driver(struct tty_driver *driver)
- {
- struct proc_dir_entry *ent;
--
-+
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- if (!driver->driver_name || driver->proc_entry ||
- !driver->ops->proc_show)
- return;
-@@ -150,6 +153,9 @@ void proc_tty_unregister_driver(struct t
- {
- struct proc_dir_entry *ent;
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- ent = driver->proc_entry;
- if (!ent)
- return;
-@@ -164,6 +170,9 @@ void proc_tty_unregister_driver(struct t
- */
- void __init proc_tty_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- if (!proc_mkdir("tty", NULL))
- return;
- proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */
---- a/include/net/snmp.h
-+++ b/include/net/snmp.h
-@@ -118,6 +118,21 @@ struct linux_xfrm_mib {
- #define DECLARE_SNMP_STAT(type, name) \
- extern __typeof__(type) __percpu *name
-
-+#ifdef CONFIG_PROC_STRIPPED
-+#define __SNMP_STATS_DUMMY(mib) \
-+ do { (void) mib->mibs[0]; } while(0)
-+
-+#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
-+#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib)
-+#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
-+#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
-+#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
-+#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
-+#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
-+#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
-+
-+#else
-+
- #define __SNMP_INC_STATS(mib, field) \
- __this_cpu_inc(mib->mibs[field])
-
-@@ -148,8 +163,9 @@ struct linux_xfrm_mib {
- __this_cpu_add(ptr[basefield##OCTETS], addend); \
- } while (0)
-
-+#endif
-
--#if BITS_PER_LONG==32
-+#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED)
-
- #define __SNMP_ADD_STATS64(mib, field, addend) \
- do { \
---- a/ipc/msg.c
-+++ b/ipc/msg.c
-@@ -1317,6 +1317,9 @@ void __init msg_init(void)
- {
- msg_init_ns(&init_ipc_ns);
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- ipc_init_proc_interface("sysvipc/msg",
- " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n",
- IPC_MSG_IDS, sysvipc_msg_proc_show);
---- a/ipc/sem.c
-+++ b/ipc/sem.c
-@@ -243,6 +243,8 @@ void sem_exit_ns(struct ipc_namespace *n
- void __init sem_init(void)
- {
- sem_init_ns(&init_ipc_ns);
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
- ipc_init_proc_interface("sysvipc/sem",
- " key semid perms nsems uid gid cuid cgid otime ctime\n",
- IPC_SEM_IDS, sysvipc_sem_proc_show);
---- a/ipc/shm.c
-+++ b/ipc/shm.c
-@@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init);
-
- void __init shm_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
- ipc_init_proc_interface("sysvipc/shm",
- #if BITS_PER_LONG <= 32
- " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n",
---- a/ipc/util.c
-+++ b/ipc/util.c
-@@ -140,6 +140,9 @@ void __init ipc_init_proc_interface(cons
- struct proc_dir_entry *pde;
- struct ipc_proc_iface *iface;
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- iface = kmalloc(sizeof(*iface), GFP_KERNEL);
- if (!iface)
- return;
---- a/kernel/exec_domain.c
-+++ b/kernel/exec_domain.c
-@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct
-
- static int __init proc_execdomains_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
- proc_create_single("execdomains", 0, NULL, execdomains_proc_show);
- return 0;
- }
---- a/kernel/irq/proc.c
-+++ b/kernel/irq/proc.c
-@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq,
- void __maybe_unused *irqp = (void *)(unsigned long) irq;
- char name [MAX_NAMELEN];
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
-+ return;
-+
- if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))
- return;
-
-@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir
- {
- char name [MAX_NAMELEN];
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
-+ return;
-+
- if (!root_irq_dir || !desc->dir)
- return;
- #ifdef CONFIG_SMP
-@@ -432,6 +438,9 @@ void init_irq_proc(void)
- unsigned int irq;
- struct irq_desc *desc;
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
-+ return;
-+
- /* create /proc/irq */
- root_irq_dir = proc_mkdir("irq", NULL);
- if (!root_irq_dir)
---- a/kernel/time/timer_list.c
-+++ b/kernel/time/timer_list.c
-@@ -370,6 +370,8 @@ static int __init init_timer_list_procfs
- {
- struct proc_dir_entry *pe;
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
- pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops,
- sizeof(struct timer_list_iter), NULL);
- if (!pe)
---- a/mm/vmalloc.c
-+++ b/mm/vmalloc.c
-@@ -3564,6 +3564,8 @@ static const struct seq_operations vmall
-
- static int __init proc_vmalloc_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
- if (IS_ENABLED(CONFIG_NUMA))
- proc_create_seq_private("vmallocinfo", 0400, NULL,
- &vmalloc_op,
---- a/mm/vmstat.c
-+++ b/mm/vmstat.c
-@@ -1988,10 +1988,12 @@ void __init init_mm_internals(void)
- start_shepherd_timer();
- #endif
- #ifdef CONFIG_PROC_FS
-- proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
-- proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
-+ proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
-+ proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
-+ proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
-+ }
- proc_create_seq("vmstat", 0444, NULL, &vmstat_op);
-- proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
- #endif
- }
-
---- a/net/8021q/vlanproc.c
-+++ b/net/8021q/vlanproc.c
-@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net)
- {
- struct vlan_net *vn = net_generic(net, vlan_net_id);
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return;
-+
- if (vn->proc_vlan_conf)
- remove_proc_entry(name_conf, vn->proc_vlan_dir);
-
-@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net
- {
- struct vlan_net *vn = net_generic(net, vlan_net_id);
-
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
-+
- vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net);
- if (!vn->proc_vlan_dir)
- goto err;
---- a/net/core/net-procfs.c
-+++ b/net/core/net-procfs.c
-@@ -279,10 +279,12 @@ static int __net_init dev_proc_net_init(
- if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops,
- sizeof(struct seq_net_private)))
- goto out;
-- if (!proc_create_seq("softnet_stat", 0444, net->proc_net,
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create_seq("softnet_stat", 0444, net->proc_net,
- &softnet_seq_ops))
- goto out_dev;
-- if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
- sizeof(struct seq_net_private)))
- goto out_softnet;
-
-@@ -292,9 +294,11 @@ static int __net_init dev_proc_net_init(
- out:
- return rc;
- out_ptype:
-- remove_proc_entry("ptype", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ remove_proc_entry("ptype", net->proc_net);
- out_softnet:
-- remove_proc_entry("softnet_stat", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ remove_proc_entry("softnet_stat", net->proc_net);
- out_dev:
- remove_proc_entry("dev", net->proc_net);
- goto out;
-@@ -304,8 +308,10 @@ static void __net_exit dev_proc_net_exit
- {
- wext_proc_exit(net);
-
-- remove_proc_entry("ptype", net->proc_net);
-- remove_proc_entry("softnet_stat", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
-+ remove_proc_entry("ptype", net->proc_net);
-+ remove_proc_entry("softnet_stat", net->proc_net);
-+ }
- remove_proc_entry("dev", net->proc_net);
- }
-
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -3643,6 +3643,8 @@ static __net_initdata struct pernet_oper
-
- static int __init proto_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
- return register_pernet_subsys(&proto_net_ops);
- }
-
---- a/net/ipv4/fib_trie.c
-+++ b/net/ipv4/fib_trie.c
-@@ -2848,11 +2848,13 @@ static const struct seq_operations fib_r
-
- int __net_init fib_proc_init(struct net *net)
- {
-- if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
- sizeof(struct fib_trie_iter)))
- goto out1;
-
-- if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create_net_single("fib_triestat", 0444, net->proc_net,
- fib_triestat_seq_show, NULL))
- goto out2;
-
-@@ -2863,17 +2865,21 @@ int __net_init fib_proc_init(struct net
- return 0;
-
- out3:
-- remove_proc_entry("fib_triestat", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ remove_proc_entry("fib_triestat", net->proc_net);
- out2:
-- remove_proc_entry("fib_trie", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ remove_proc_entry("fib_trie", net->proc_net);
- out1:
- return -ENOMEM;
- }
-
- void __net_exit fib_proc_exit(struct net *net)
- {
-- remove_proc_entry("fib_trie", net->proc_net);
-- remove_proc_entry("fib_triestat", net->proc_net);
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
-+ remove_proc_entry("fib_trie", net->proc_net);
-+ remove_proc_entry("fib_triestat", net->proc_net);
-+ }
- remove_proc_entry("route", net->proc_net);
- }
-
---- a/net/ipv4/proc.c
-+++ b/net/ipv4/proc.c
-@@ -522,5 +522,8 @@ static __net_initdata struct pernet_oper
-
- int __init ip_misc_proc_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
-+
- return register_pernet_subsys(&ip_proc_ops);
- }
---- a/net/ipv4/route.c
-+++ b/net/ipv4/route.c
-@@ -410,6 +410,9 @@ static struct pernet_operations ip_rt_pr
-
- static int __init ip_rt_proc_init(void)
- {
-+ if (IS_ENABLED(CONFIG_PROC_STRIPPED))
-+ return 0;
-+
- return register_pernet_subsys(&ip_rt_proc_ops);
- }
-
diff --git a/target/linux/generic/hack-5.4/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.4/904-debloat_dma_buf.patch
deleted file mode 100644
index 76032d9b82..0000000000
--- a/target/linux/generic/hack-5.4/904-debloat_dma_buf.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 8 Jul 2017 08:20:43 +0200
-Subject: debloat: dmabuf
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/base/Kconfig | 2 +-
- drivers/dma-buf/Makefile | 10 +++++++---
- drivers/dma-buf/dma-buf.c | 4 +++-
- kernel/sched/core.c | 1 +
- 4 files changed, 12 insertions(+), 5 deletions(-)
-
---- a/drivers/base/Kconfig
-+++ b/drivers/base/Kconfig
-@@ -179,7 +179,7 @@ config SOC_BUS
- source "drivers/base/regmap/Kconfig"
-
- config DMA_SHARED_BUFFER
-- bool
-+ tristate
- default n
- select IRQ_WORK
- help
---- a/drivers/dma-buf/Makefile
-+++ b/drivers/dma-buf/Makefile
-@@ -1,9 +1,13 @@
- # SPDX-License-Identifier: GPL-2.0-only
--obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
-- dma-resv.o seqno-fence.o
--obj-$(CONFIG_SYNC_FILE) += sync_file.o
--obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
--obj-$(CONFIG_UDMABUF) += udmabuf.o
-+obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o
-+
-+dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
-+ dma-resv.o seqno-fence.o
-+dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o
-+dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
-+dma-buf-objs-$(CONFIG_UDMABUF) += udmabuf.o
-+
-+dma-shared-buffer-objs := $(dma-buf-objs-y)
-
- dmabuf_selftests-y := \
- selftest.o \
---- a/drivers/dma-buf/dma-buf.c
-+++ b/drivers/dma-buf/dma-buf.c
-@@ -1314,4 +1314,5 @@ static void __exit dma_buf_deinit(void)
- dma_buf_uninit_debugfs();
- kern_unmount(dma_buf_mnt);
- }
--__exitcall(dma_buf_deinit);
-+module_exit(dma_buf_deinit);
-+MODULE_LICENSE("GPL");
---- a/kernel/sched/core.c
-+++ b/kernel/sched/core.c
-@@ -2770,6 +2770,7 @@ int wake_up_state(struct task_struct *p,
- {
- return try_to_wake_up(p, state, 0);
- }
-+EXPORT_SYMBOL_GPL(wake_up_state);
-
- /*
- * Perform scheduler related setup for a newly forked process p.
---- a/fs/d_path.c
-+++ b/fs/d_path.c
-@@ -311,6 +311,7 @@ char *dynamic_dname(struct dentry *dentr
- buffer += buflen - sz;
- return memcpy(buffer, temp, sz);
- }
-+EXPORT_SYMBOL_GPL(dynamic_dname);
-
- char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
- {
diff --git a/target/linux/generic/hack-5.4/910-kobject_uevent.patch b/target/linux/generic/hack-5.4/910-kobject_uevent.patch
deleted file mode 100644
index c4c41ca400..0000000000
--- a/target/linux/generic/hack-5.4/910-kobject_uevent.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 16 Jul 2017 16:56:10 +0200
-Subject: lib: add uevent_next_seqnum()
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/kobject.h | 5 +++++
- lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++
- 2 files changed, 42 insertions(+)
-
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -179,6 +179,18 @@ out:
- return r;
- }
-
-+u64 uevent_next_seqnum(void)
-+{
-+ u64 seq;
-+
-+ mutex_lock(&uevent_sock_mutex);
-+ seq = ++uevent_seqnum;
-+ mutex_unlock(&uevent_sock_mutex);
-+
-+ return seq;
-+}
-+EXPORT_SYMBOL_GPL(uevent_next_seqnum);
-+
- /**
- * kobject_synth_uevent - send synthetic uevent with arguments
- *
diff --git a/target/linux/generic/hack-5.4/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-5.4/911-kobject_add_broadcast_uevent.patch
deleted file mode 100644
index 6f5e50d091..0000000000
--- a/target/linux/generic/hack-5.4/911-kobject_add_broadcast_uevent.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 16 Jul 2017 16:56:10 +0200
-Subject: lib: add uevent_next_seqnum()
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/kobject.h | 5 +++++
- lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++
- 2 files changed, 42 insertions(+)
-
---- a/include/linux/kobject.h
-+++ b/include/linux/kobject.h
-@@ -32,6 +32,8 @@
- #define UEVENT_NUM_ENVP 32 /* number of env pointers */
- #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */
-
-+struct sk_buff;
-+
- #ifdef CONFIG_UEVENT_HELPER
- /* path to the userspace helper executed on an event */
- extern char uevent_helper[];
-@@ -245,4 +247,7 @@ int kobject_synth_uevent(struct kobject
- __printf(2, 3)
- int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
-
-+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
-+ gfp_t allocation);
-+
- #endif /* _KOBJECT_H_ */
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en
- EXPORT_SYMBOL_GPL(add_uevent_var);
-
- #if defined(CONFIG_NET)
-+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
-+ gfp_t allocation)
-+{
-+ struct uevent_sock *ue_sk;
-+ int err = 0;
-+
-+ /* send netlink message */
-+ mutex_lock(&uevent_sock_mutex);
-+ list_for_each_entry(ue_sk, &uevent_sock_list, list) {
-+ struct sock *uevent_sock = ue_sk->sk;
-+ struct sk_buff *skb2;
-+
-+ skb2 = skb_clone(skb, allocation);
-+ if (!skb2)
-+ break;
-+
-+ err = netlink_broadcast(uevent_sock, skb2, pid, group,
-+ allocation);
-+ if (err)
-+ break;
-+ }
-+ mutex_unlock(&uevent_sock_mutex);
-+
-+ kfree_skb(skb);
-+ return err;
-+}
-+#else
-+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
-+ gfp_t allocation)
-+{
-+ kfree_skb(skb);
-+ return 0;
-+}
-+#endif
-+EXPORT_SYMBOL_GPL(broadcast_uevent);
-+
-+#if defined(CONFIG_NET)
- static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb,
- struct netlink_ext_ack *extack)
- {
diff --git a/target/linux/generic/hack-5.4/920-device_tree_cmdline.patch b/target/linux/generic/hack-5.4/920-device_tree_cmdline.patch
deleted file mode 100644
index 3cc032fdd2..0000000000
--- a/target/linux/generic/hack-5.4/920-device_tree_cmdline.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/drivers/of/fdt.c
-+++ b/drivers/of/fdt.c
-@@ -1059,6 +1059,9 @@ int __init early_init_dt_scan_chosen(uns
- p = of_get_flat_dt_prop(node, "bootargs", &l);
- if (p != NULL && l > 0)
- strlcpy(data, p, min(l, COMMAND_LINE_SIZE));
-+ p = of_get_flat_dt_prop(node, "bootargs-append", &l);
-+ if (p != NULL && l > 0)
-+ strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE));
-
- /*
- * CONFIG_CMDLINE is meant to be a default in case nothing else
diff --git a/target/linux/generic/hack-5.4/921-always-create-console-node-in-initramfs.patch b/target/linux/generic/hack-5.4/921-always-create-console-node-in-initramfs.patch
deleted file mode 100644
index e437579050..0000000000
--- a/target/linux/generic/hack-5.4/921-always-create-console-node-in-initramfs.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 5d301596fdc72f6cb672f72eb3c66e7cddefb103 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 8 Jul 2017 08:26:02 +0200
-Subject: initramfs: always create console node
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- usr/gen_initramfs_list.sh | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
---- a/usr/gen_initramfs_list.sh
-+++ b/usr/gen_initramfs_list.sh
-@@ -59,6 +59,18 @@ default_initramfs() {
- EOF
- }
-
-+list_openwrt_initramfs() {
-+ :
-+}
-+
-+openwrt_initramfs() {
-+ # make sure that /dev/console exists
-+ cat <<-EOF >> ${output}
-+ dir /dev 0755 0 0
-+ nod /dev/console 0600 0 0 c 5 1
-+ EOF
-+}
-+
- filetype() {
- local argv1="$1"
-
-@@ -180,6 +192,8 @@ dir_filelist() {
- if [ "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
- ${dep_list}print_mtime "$1"
-
-+ ${dep_list}openwrt_initramfs
-+
- echo "${dirlist}" | \
- while read x; do
- ${dep_list}parse ${x}
diff --git a/target/linux/generic/pending-5.4/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch b/target/linux/generic/pending-5.4/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch
deleted file mode 100644
index 33eb34c913..0000000000
--- a/target/linux/generic/pending-5.4/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From d9c8bc8c1408f3e8529db6e4e04017b4c579c342 Mon Sep 17 00:00:00 2001
-From: Pawel Dembicki <paweldembicki@gmail.com>
-Date: Sun, 18 Feb 2018 17:08:04 +0100
-Subject: [PATCH] w1: gpio: fix problem with platfom data in w1-gpio
-
-In devices, where fdt is used, is impossible to apply platform data
-without proper fdt node.
-
-This patch allow to use platform data in devices with fdt.
-
-Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
----
- drivers/w1/masters/w1-gpio.c | 7 +++----
- 1 file changed, 3 insertions(+), 4 deletions(-)
-
---- a/drivers/w1/masters/w1-gpio.c
-+++ b/drivers/w1/masters/w1-gpio.c
-@@ -76,7 +76,7 @@ static int w1_gpio_probe(struct platform
- enum gpiod_flags gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
- int err;
-
-- if (of_have_populated_dt()) {
-+ if (of_have_populated_dt() && !dev_get_platdata(&pdev->dev)) {
- pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
- if (!pdata)
- return -ENOMEM;
diff --git a/target/linux/generic/pending-5.4/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-5.4/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch
deleted file mode 100644
index 45319415f1..0000000000
--- a/target/linux/generic/pending-5.4/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 18 Apr 2018 10:50:05 +0200
-Subject: [PATCH] MIPS: only process negative stack offsets on stack traces
-
-Fixes endless back traces in cases where the compiler emits a stack
-pointer increase in a branch delay slot (probably for some form of
-function return).
-
-[ 3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low!
-[ 3.480070] turning off the locking correctness validator.
-[ 3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0
-[ 3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000
-[ 3.499764] 87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f
-[ 3.508059] 00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000
-[ 3.516353] 00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000
-[ 3.524648] 806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000
-[ 3.532942] ...
-[ 3.535362] Call Trace:
-[ 3.537818] [<80010a48>] show_stack+0x58/0x100
-[ 3.542207] [<804c2f78>] dump_stack+0xe8/0x170
-[ 3.546613] [<80079f90>] save_trace+0xf0/0x110
-[ 3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c
-[ 3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08
-[ 3.560337] [<8007de60>] lock_acquire+0x64/0x8c
-[ 3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78
-[ 3.570186] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.579257] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.588329] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.597401] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.606473] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.615545] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.624619] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.633691] [<801b618c>] kernfs_notify+0x94/0xac
-[ 3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0
-[ 3.642763] [<801b618c>] kernfs_notify+0x94/0xac
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/arch/mips/kernel/process.c
-+++ b/arch/mips/kernel/process.c
-@@ -365,6 +365,8 @@ static inline int is_sp_move_ins(union m
-
- if (ip->i_format.opcode == addiu_op ||
- ip->i_format.opcode == daddiu_op) {
-+ if (ip->i_format.simmediate > 0)
-+ return 0;
- *frame_size = -ip->i_format.simmediate;
- return 1;
- }
diff --git a/target/linux/generic/pending-5.4/103-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch b/target/linux/generic/pending-5.4/103-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch
deleted file mode 100644
index 85cd223053..0000000000
--- a/target/linux/generic/pending-5.4/103-MIPS-select-CPU_MIPS64-for-remaining-MIPS64-CPUs.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 31ca877744d95713e4925de542e1c686ab08a542 Mon Sep 17 00:00:00 2001
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Sat, 27 Feb 2021 13:20:24 +0100
-Subject: [PATCH] MIPS: select CPU_MIPS64 for remaining MIPS64 CPUs
-
-The CPU_MIPS64 and CPU_MIPS32 variables are supposed to be able to
-distinguish broadly between 64-bit and 32-bit MIPS CPUs. However, they
-weren't selected by the specialty CPUs, Octeon and Loongson, which meant
-it was possible to hit a weird state of:
-
- MIPS=y, CONFIG_64BIT=y, CPU_MIPS64=n
-
-This commit rectifies the issue by having CPU_MIPS64 be selected when
-the missing Octeon or Loongson models are selected.
-
-Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
-Cc: Ralf Baechle <ralf@linux-mips.org>
-Cc: George Cherian <gcherian@marvell.com>
-Cc: Huacai Chen <chenhuacai@kernel.org>
-Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- arch/mips/Kconfig | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -2043,7 +2043,8 @@ config CPU_MIPS32
-
- config CPU_MIPS64
- bool
-- default y if CPU_MIPS64_R1 || CPU_MIPS64_R2 || CPU_MIPS64_R6
-+ default y if CPU_MIPS64_R1 || CPU_MIPS64_R2 || CPU_MIPS64_R6 || \
-+ CPU_LOONGSON64 || CPU_CAVIUM_OCTEON
-
- #
- # These indicate the revision of the architecture
diff --git a/target/linux/generic/pending-5.4/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.4/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch
deleted file mode 100644
index 09e8267034..0000000000
--- a/target/linux/generic/pending-5.4/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From: Tobias Wolf <dev-NTEO@vplace.de>
-Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation
-
-An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any
-kernel beyond version 4.3 resulting in:
-
-BUG: Bad page state in process swapper pfn:086ac
-
-bisect resulted in:
-
-a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit
-commit a1c34a3bf00af2cede839879502e12dc68491ad5
-Author: Laura Abbott <laura@labbott.name>
-Date: Thu Nov 5 18:48:46 2015 -0800
-
- mm: Don't offset memmap for flatmem
-
- Srinivas Kandagatla reported bad page messages when trying to remove the
- bottom 2MB on an ARM based IFC6410 board
-
- BUG: Bad page state in process swapper pfn:fffa8
- page:ef7fb500 count:0 mapcount:0 mapping: (null) index:0x0
- flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked)
- page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set
- bad because of flags:
- flags: 0x200041(locked|active|mlocked)
- Modules linked in:
- CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty
-#816
- Hardware name: Qualcomm (Flattened Device Tree)
- unwind_backtrace
- show_stack
- dump_stack
- bad_page
- free_pages_prepare
- free_hot_cold_page
- __free_pages
- free_highmem_page
- mem_init
- start_kernel
- Disabling lock debugging due to kernel taint
- [...]
-:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4
-0a8156f848733dfa21e16c196dfb6c0a76290709 M mm
-
-This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by
-page_to_pfn anymore.
-
-The following output was generated with two hacked in printk statements:
-
-printk("before %p vs. %p or %p\n", mem_map, mem_map - offset, mem_map -
-(pgdat->node_start_pfn - ARCH_PFN_OFFSET));
- if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
- mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);
-printk("after %p\n", mem_map);
-
-Output:
-
-[ 0.000000] before 8861b280 vs. 8861b280 or 8851b280
-[ 0.000000] after 8851b280
-
-As seen in the first line mem_map with subtraction of offset does not equal the
-mem_map after subtraction of ARCH_PFN_OFFSET.
-
-After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the
-previously calculated offset is zero for the named platform it is able to boot
-4.4 and 4.9-rc7 again.
-
-Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de>
----
-
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -6886,7 +6886,7 @@ static void __ref alloc_node_mem_map(str
- mem_map = NODE_DATA(0)->node_mem_map;
- #if defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) || defined(CONFIG_FLATMEM)
- if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
-- mem_map -= offset;
-+ mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);
- #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
- }
- #endif
diff --git a/target/linux/generic/pending-5.4/130-add-linux-spidev-compatible-si3210.patch b/target/linux/generic/pending-5.4/130-add-linux-spidev-compatible-si3210.patch
deleted file mode 100644
index eedb2bb28d..0000000000
--- a/target/linux/generic/pending-5.4/130-add-linux-spidev-compatible-si3210.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From: Giuseppe Lippolis <giu.lippolis@gmail.com>
-Subject: Add the linux,spidev compatible in spidev Several device in ramips have this binding in the dts
-
-Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>
----
- drivers/spi/spidev.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/spi/spidev.c
-+++ b/drivers/spi/spidev.c
-@@ -678,6 +678,7 @@ static const struct of_device_id spidev_
- { .compatible = "lwn,bk4" },
- { .compatible = "dh,dhcom-board" },
- { .compatible = "menlo,m53cpld" },
-+ { .compatible = "siliconlabs,si3210" },
- {},
- };
- MODULE_DEVICE_TABLE(of, spidev_dt_ids);
diff --git a/target/linux/generic/pending-5.4/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch b/target/linux/generic/pending-5.4/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch
deleted file mode 100644
index b9bb3f71f1..0000000000
--- a/target/linux/generic/pending-5.4/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support
-
-It is required for renames on overlayfs
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/fs/jffs2/dir.c
-+++ b/fs/jffs2/dir.c
-@@ -756,6 +756,24 @@ static int jffs2_mknod (struct inode *di
- return ret;
- }
-
-+static int jffs2_whiteout (struct inode *old_dir, struct dentry *old_dentry)
-+{
-+ struct dentry *wh;
-+ int err;
-+
-+ wh = d_alloc(old_dentry->d_parent, &old_dentry->d_name);
-+ if (!wh)
-+ return -ENOMEM;
-+
-+ err = jffs2_mknod(old_dir, wh, S_IFCHR | WHITEOUT_MODE,
-+ WHITEOUT_DEV);
-+ if (err)
-+ return err;
-+
-+ d_rehash(wh);
-+ return 0;
-+}
-+
- static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
- struct inode *new_dir_i, struct dentry *new_dentry,
- unsigned int flags)
-@@ -766,7 +784,7 @@ static int jffs2_rename (struct inode *o
- uint8_t type;
- uint32_t now;
-
-- if (flags & ~RENAME_NOREPLACE)
-+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT))
- return -EINVAL;
-
- /* The VFS will check for us and prevent trying to rename a
-@@ -832,9 +850,14 @@ static int jffs2_rename (struct inode *o
- if (d_is_dir(old_dentry) && !victim_f)
- inc_nlink(new_dir_i);
-
-- /* Unlink the original */
-- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
-- old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
-+ if (flags & RENAME_WHITEOUT)
-+ /* Replace with whiteout */
-+ ret = jffs2_whiteout(old_dir_i, old_dentry);
-+ else
-+ /* Unlink the original */
-+ ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
-+ old_dentry->d_name.name,
-+ old_dentry->d_name.len, NULL, now);
-
- /* We don't touch inode->i_nlink */
-
diff --git a/target/linux/generic/pending-5.4/141-jffs2-add-RENAME_EXCHANGE-support.patch b/target/linux/generic/pending-5.4/141-jffs2-add-RENAME_EXCHANGE-support.patch
deleted file mode 100644
index 4b30bc7cd0..0000000000
--- a/target/linux/generic/pending-5.4/141-jffs2-add-RENAME_EXCHANGE-support.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: jffs2: add RENAME_EXCHANGE support
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/fs/jffs2/dir.c
-+++ b/fs/jffs2/dir.c
-@@ -781,18 +781,31 @@ static int jffs2_rename (struct inode *o
- int ret;
- struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
- struct jffs2_inode_info *victim_f = NULL;
-+ struct inode *fst_inode = d_inode(old_dentry);
-+ struct inode *snd_inode = d_inode(new_dentry);
- uint8_t type;
- uint32_t now;
-
-- if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT))
-+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT|RENAME_EXCHANGE))
- return -EINVAL;
-
-+ if ((flags & RENAME_EXCHANGE) && (old_dir_i != new_dir_i)) {
-+ if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) {
-+ inc_nlink(new_dir_i);
-+ drop_nlink(old_dir_i);
-+ }
-+ else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) {
-+ drop_nlink(new_dir_i);
-+ inc_nlink(old_dir_i);
-+ }
-+ }
-+
- /* The VFS will check for us and prevent trying to rename a
- * file over a directory and vice versa, but if it's a directory,
- * the VFS can't check whether the victim is empty. The filesystem
- * needs to do that for itself.
- */
-- if (d_really_is_positive(new_dentry)) {
-+ if (d_really_is_positive(new_dentry) && !(flags & RENAME_EXCHANGE)) {
- victim_f = JFFS2_INODE_INFO(d_inode(new_dentry));
- if (d_is_dir(new_dentry)) {
- struct jffs2_full_dirent *fd;
-@@ -827,7 +840,7 @@ static int jffs2_rename (struct inode *o
- if (ret)
- return ret;
-
-- if (victim_f) {
-+ if (victim_f && !(flags & RENAME_EXCHANGE)) {
- /* There was a victim. Kill it off nicely */
- if (d_is_dir(new_dentry))
- clear_nlink(d_inode(new_dentry));
-@@ -853,6 +866,12 @@ static int jffs2_rename (struct inode *o
- if (flags & RENAME_WHITEOUT)
- /* Replace with whiteout */
- ret = jffs2_whiteout(old_dir_i, old_dentry);
-+ else if (flags & RENAME_EXCHANGE)
-+ /* Replace the original */
-+ ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i),
-+ d_inode(new_dentry)->i_ino, type,
-+ old_dentry->d_name.name, old_dentry->d_name.len,
-+ now);
- else
- /* Unlink the original */
- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
-@@ -884,7 +903,7 @@ static int jffs2_rename (struct inode *o
- return ret;
- }
-
-- if (d_is_dir(old_dentry))
-+ if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE))
- drop_nlink(old_dir_i);
-
- new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
diff --git a/target/linux/generic/pending-5.4/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-5.4/150-bridge_allow_receiption_on_disabled_port.patch
deleted file mode 100644
index c63268ece9..0000000000
--- a/target/linux/generic/pending-5.4/150-bridge_allow_receiption_on_disabled_port.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From: Stephen Hemminger <stephen@networkplumber.org>
-Subject: bridge: allow receiption on disabled port
-
-When an ethernet device is enslaved to a bridge, and the bridge STP
-detects loss of carrier (or operational state down), then normally
-packet receiption is blocked.
-
-This breaks control applications like WPA which maybe expecting to
-receive packets to negotiate to bring link up. The bridge needs to
-block forwarding packets from these disabled ports, but there is no
-hard requirement to not allow local packet delivery.
-
-Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-
---- a/net/bridge/br_input.c
-+++ b/net/bridge/br_input.c
-@@ -190,6 +190,9 @@ static void __br_handle_local_finish(str
- /* note: already called with rcu_read_lock */
- static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
- {
-+ struct net_bridge_port *p = br_port_get_rcu(skb->dev);
-+
-+ if (p->state != BR_STATE_DISABLED)
- __br_handle_local_finish(skb);
-
- /* return 1 to signal the okfn() was called so it's ok to use the skb */
-@@ -340,6 +343,17 @@ rx_handler_result_t br_handle_frame(stru
-
- forward:
- switch (p->state) {
-+ case BR_STATE_DISABLED:
-+ if (ether_addr_equal(p->br->dev->dev_addr, dest))
-+ skb->pkt_type = PACKET_HOST;
-+
-+ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING,
-+ dev_net(skb->dev), NULL, skb, skb->dev, NULL,
-+ br_handle_local_finish) == 1) {
-+ return RX_HANDLER_PASS;
-+ }
-+ break;
-+
- case BR_STATE_FORWARDING:
- case BR_STATE_LEARNING:
- if (ether_addr_equal(p->br->dev->dev_addr, dest))
diff --git a/target/linux/generic/pending-5.4/180-net-phy-at803x-add-support-for-AT8032.patch b/target/linux/generic/pending-5.4/180-net-phy-at803x-add-support-for-AT8032.patch
deleted file mode 100644
index 3fe25c2b2b..0000000000
--- a/target/linux/generic/pending-5.4/180-net-phy-at803x-add-support-for-AT8032.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: net: phy: at803x: add support for AT8032
-
-Like AT8030, this PHY needs the GPIO reset workaround
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/phy/at803x.c
-+++ b/drivers/net/phy/at803x.c
-@@ -64,8 +64,10 @@
-
- #define ATH8030_PHY_ID 0x004dd076
- #define ATH8031_PHY_ID 0x004dd074
-+#define ATH8032_PHY_ID 0x004dd023
- #define ATH8035_PHY_ID 0x004dd072
- #define AT803X_PHY_ID_MASK 0xffffffef
-+#define AT8032_PHY_ID_MASK 0xffffffff
-
- #define AT803X_PAGE_FIBER 0
- #define AT803X_PAGE_COPPER 1
-@@ -357,7 +359,7 @@ static int at803x_config_intr(struct phy
- static void at803x_link_change_notify(struct phy_device *phydev)
- {
- /*
-- * Conduct a hardware reset for AT8030 every time a link loss is
-+ * Conduct a hardware reset for AT8030/2 every time a link loss is
- * signalled. This is necessary to circumvent a hardware bug that
- * occurs when the cable is unplugged while TX packets are pending
- * in the FIFO. In such cases, the FIFO enters an error mode it
-@@ -516,6 +518,24 @@ static struct phy_driver at803x_driver[]
- .aneg_done = at803x_aneg_done,
- .ack_interrupt = &at803x_ack_interrupt,
- .config_intr = &at803x_config_intr,
-+}, {
-+ /* ATHEROS 8032 */
-+ .phy_id = ATH8032_PHY_ID,
-+ .name = "Atheros 8032 ethernet",
-+ .phy_id_mask = AT8032_PHY_ID_MASK,
-+ .probe = at803x_probe,
-+ .config_init = at803x_config_init,
-+ .link_change_notify = at803x_link_change_notify,
-+ .set_wol = at803x_set_wol,
-+ .get_wol = at803x_get_wol,
-+ .suspend = at803x_suspend,
-+ .resume = at803x_resume,
-+ /* PHY_BASIC_FEATURES */
-+ .read_status = at803x_read_status,
-+ .config_aneg = genphy_config_aneg,
-+ .read_status = genphy_read_status,
-+ .ack_interrupt = at803x_ack_interrupt,
-+ .config_intr = at803x_config_intr,
- } };
-
- module_phy_driver(at803x_driver);
-@@ -523,6 +543,7 @@ module_phy_driver(at803x_driver);
- static struct mdio_device_id __maybe_unused atheros_tbl[] = {
- { ATH8030_PHY_ID, AT803X_PHY_ID_MASK },
- { ATH8031_PHY_ID, AT803X_PHY_ID_MASK },
-+ { ATH8032_PHY_ID, AT8032_PHY_ID_MASK },
- { ATH8035_PHY_ID, AT803X_PHY_ID_MASK },
- { }
- };
diff --git a/target/linux/generic/pending-5.4/190-rtc-rs5c372-support_alarms_up_to_1_week.patch b/target/linux/generic/pending-5.4/190-rtc-rs5c372-support_alarms_up_to_1_week.patch
deleted file mode 100644
index 13b79b5c09..0000000000
--- a/target/linux/generic/pending-5.4/190-rtc-rs5c372-support_alarms_up_to_1_week.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From: Daniel González Cabanelas <dgcbueu@gmail.com>
-Subject: [PATCH 1/2] rtc: rs5c372: support alarms up to 1 week
-
-The Ricoh R2221x, R2223x, RS5C372, RV5C387A chips can handle 1 week
-alarms.
-
-Read the "wday" alarm register and convert it to a date to support up 1
-week in our driver.
-
-Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
----
- drivers/rtc/rtc-rs5c372.c | 48 ++++++++++++++++++++++++++++++++++-----
- 1 file changed, 42 insertions(+), 6 deletions(-)
-
---- a/drivers/rtc/rtc-rs5c372.c
-+++ b/drivers/rtc/rtc-rs5c372.c
-@@ -393,7 +393,9 @@ static int rs5c_read_alarm(struct device
- {
- struct i2c_client *client = to_i2c_client(dev);
- struct rs5c372 *rs5c = i2c_get_clientdata(client);
-- int status;
-+ int status, wday_offs;
-+ struct rtc_time rtc;
-+ unsigned long alarm_secs;
-
- status = rs5c_get_regs(rs5c);
- if (status < 0)
-@@ -403,6 +405,30 @@ static int rs5c_read_alarm(struct device
- t->time.tm_sec = 0;
- t->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);
- t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);
-+ t->time.tm_wday = ffs(rs5c->regs[RS5C_REG_ALARM_A_WDAY] & 0x7f) - 1;
-+
-+ /* determine the day, month and year based on alarm wday, taking as a
-+ * reference the current time from the rtc
-+ */
-+ status = rs5c372_rtc_read_time(dev, &rtc);
-+ if (status < 0)
-+ return status;
-+
-+ wday_offs = t->time.tm_wday - rtc.tm_wday;
-+ alarm_secs = mktime64(rtc.tm_year + 1900,
-+ rtc.tm_mon + 1,
-+ rtc.tm_mday + wday_offs,
-+ t->time.tm_hour,
-+ t->time.tm_min,
-+ t->time.tm_sec);
-+
-+ if (wday_offs < 0 || (wday_offs == 0 &&
-+ (t->time.tm_hour < rtc.tm_hour ||
-+ (t->time.tm_hour == rtc.tm_hour &&
-+ t->time.tm_min <= rtc.tm_min))))
-+ alarm_secs += 7 * 86400;
-+
-+ rtc_time64_to_tm(alarm_secs, &t->time);
-
- /* ... and status */
- t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
-@@ -417,12 +443,20 @@ static int rs5c_set_alarm(struct device
- struct rs5c372 *rs5c = i2c_get_clientdata(client);
- int status, addr, i;
- unsigned char buf[3];
-+ struct rtc_time rtc_tm;
-+ unsigned long rtc_secs, alarm_secs;
-
-- /* only handle up to 24 hours in the future, like RTC_ALM_SET */
-- if (t->time.tm_mday != -1
-- || t->time.tm_mon != -1
-- || t->time.tm_year != -1)
-+ /* chip only can handle alarms up to one week in the future*/
-+ status = rs5c372_rtc_read_time(dev, &rtc_tm);
-+ if (status)
-+ return status;
-+ rtc_secs = rtc_tm_to_time64(&rtc_tm);
-+ alarm_secs = rtc_tm_to_time64(&t->time);
-+ if (alarm_secs >= rtc_secs + 7 * 86400) {
-+ dev_err(dev, "%s: alarm maximum is one week in the future (%d)\n",
-+ __func__, status);
- return -EINVAL;
-+ }
-
- /* REVISIT: round up tm_sec */
-
-@@ -443,7 +477,9 @@ static int rs5c_set_alarm(struct device
- /* set alarm */
- buf[0] = bin2bcd(t->time.tm_min);
- buf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour);
-- buf[2] = 0x7f; /* any/all days */
-+ /* each bit is the day of the week, 0x7f means all days */
-+ buf[2] = (t->time.tm_wday >= 0 && t->time.tm_wday < 7) ?
-+ BIT(t->time.tm_wday) : 0x7f;
-
- for (i = 0; i < sizeof(buf); i++) {
- addr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i);
diff --git a/target/linux/generic/pending-5.4/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch b/target/linux/generic/pending-5.4/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch
deleted file mode 100644
index 7e9d0e66c0..0000000000
--- a/target/linux/generic/pending-5.4/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From: Daniel González Cabanelas <dgcbueu@gmail.com>
-Subject: [PATCH 2/2] rtc: rs5c372: let the alarm to be used as wakeup source
-
-Currently there is no use for the interrupts on the rs5c372 RTC and the
-wakealarm isn't enabled. There are some devices like NASes which use this
-RTC to wake up from the power off state when the INTR pin is activated by
-the alarm clock.
-
-Enable the alarm and let to be used as a wakeup source.
-
-Tested on a Buffalo LS421DE NAS.
-
-Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
----
- drivers/rtc/rtc-rs5c372.c | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
---- a/drivers/rtc/rtc-rs5c372.c
-+++ b/drivers/rtc/rtc-rs5c372.c
-@@ -654,6 +654,7 @@ static int rs5c372_probe(struct i2c_clie
- int err = 0;
- int smbus_mode = 0;
- struct rs5c372 *rs5c372;
-+ bool rs5c372_can_wakeup_device = false;
-
- dev_dbg(&client->dev, "%s\n", __func__);
-
-@@ -689,6 +690,12 @@ static int rs5c372_probe(struct i2c_clie
- else
- rs5c372->type = id->driver_data;
-
-+#ifdef CONFIG_OF
-+ if(of_property_read_bool(client->dev.of_node,
-+ "wakeup-source"))
-+ rs5c372_can_wakeup_device = true;
-+#endif
-+
- /* we read registers 0x0f then 0x00-0x0f; skip the first one */
- rs5c372->regs = &rs5c372->buf[1];
- rs5c372->smbus = smbus_mode;
-@@ -722,6 +729,8 @@ static int rs5c372_probe(struct i2c_clie
- goto exit;
- }
-
-+ rs5c372->has_irq = 1;
-+
- /* if the oscillator lost power and no other software (like
- * the bootloader) set it up, do it here.
- *
-@@ -748,6 +757,10 @@ static int rs5c372_probe(struct i2c_clie
- );
-
- /* REVISIT use client->irq to register alarm irq ... */
-+ if (rs5c372_can_wakeup_device) {
-+ device_init_wakeup(&client->dev, true);
-+ }
-+
- rs5c372->rtc = devm_rtc_device_register(&client->dev,
- rs5c372_driver.driver.name,
- &rs5c372_rtc_ops, THIS_MODULE);
-@@ -761,6 +774,9 @@ static int rs5c372_probe(struct i2c_clie
- if (err)
- goto exit;
-
-+ /* the rs5c372 alarm only supports a minute accuracy */
-+ rs5c372->rtc->uie_unsupported = 1;
-+
- return 0;
-
- exit:
diff --git a/target/linux/generic/pending-5.4/201-extra_optimization.patch b/target/linux/generic/pending-5.4/201-extra_optimization.patch
deleted file mode 100644
index c606487992..0000000000
--- a/target/linux/generic/pending-5.4/201-extra_optimization.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: Upgrade to Linux 2.6.19
-
-- Includes large parts of the patch from #1021 by dpalffy
-- Includes RB532 NAND driver changes by n0-1
-
-[john@phrozen.org: feix will add this to his upstream queue]
-
-lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- Makefile | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -719,11 +719,11 @@ KBUILD_CFLAGS += $(call cc-disable-warni
- KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
-
- ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 $(EXTRA_OPTIMIZATION)
- else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
--KBUILD_CFLAGS += -O3
-+KBUILD_CFLAGS += -O3 $(EXTRA_OPTIMIZATION)
- else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--KBUILD_CFLAGS += -Os
-+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
- endif
-
- # Tell gcc to never replace conditional load with a non-conditional one
diff --git a/target/linux/generic/pending-5.4/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-5.4/203-kallsyms_uncompressed.patch
deleted file mode 100644
index 68a2d4d88f..0000000000
--- a/target/linux/generic/pending-5.4/203-kallsyms_uncompressed.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx
-
-[john@phrozen.org: added to my upstream queue 30.12.2016]
-lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- init/Kconfig | 11 +++++++++++
- kernel/kallsyms.c | 8 ++++++++
- scripts/kallsyms.c | 12 ++++++++++++
- scripts/link-vmlinux.sh | 4 ++++
- 4 files changed, 35 insertions(+)
-
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1280,6 +1280,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
- the unaligned access emulation.
- see arch/parisc/kernel/unaligned.c for reference
-
-+config KALLSYMS_UNCOMPRESSED
-+ bool "Keep kallsyms uncompressed"
-+ depends on KALLSYMS
-+ help
-+ Normally kallsyms contains compressed symbols (using a token table),
-+ reducing the uncompressed kernel image size. Keeping the symbol table
-+ uncompressed significantly improves the size of this part in compressed
-+ kernel images.
-+
-+ Say N unless you need compressed kernel images to be small.
-+
- config HAVE_PCSPKR_PLATFORM
- bool
-
---- a/kernel/kallsyms.c
-+++ b/kernel/kallsyms.c
-@@ -75,6 +75,11 @@ static unsigned int kallsyms_expand_symb
- * For every byte on the compressed symbol data, copy the table
- * entry for that byte.
- */
-+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
-+ memcpy(result, data + 1, len - 1);
-+ result += len - 1;
-+ len = 0;
-+#endif
- while (len) {
- tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
- data++;
-@@ -107,6 +112,9 @@ tail:
- */
- static char kallsyms_get_symbol_type(unsigned int off)
- {
-+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
-+ return kallsyms_names[off + 1];
-+#endif
- /*
- * Get just the first code, look it up in the token table,
- * and return the first char from this token.
---- a/scripts/kallsyms.c
-+++ b/scripts/kallsyms.c
-@@ -59,6 +59,7 @@ static struct addr_range percpu_range =
- static struct sym_entry *table;
- static unsigned int table_size, table_cnt;
- static int all_symbols = 0;
-+static int uncompressed = 0;
- static int absolute_percpu = 0;
- static int base_relative = 0;
-
-@@ -440,6 +441,9 @@ static void write_src(void)
-
- free(markers);
-
-+ if (uncompressed)
-+ return;
-+
- output_label("kallsyms_token_table");
- off = 0;
- for (i = 0; i < 256; i++) {
-@@ -500,6 +504,9 @@ static void *find_token(unsigned char *s
- {
- int i;
-
-+ if (uncompressed)
-+ return NULL;
-+
- for (i = 0; i < len - 1; i++) {
- if (str[i] == token[0] && str[i+1] == token[1])
- return &str[i];
-@@ -572,6 +579,9 @@ static void optimize_result(void)
- {
- int i, best;
-
-+ if (uncompressed)
-+ return;
-+
- /* using the '\0' symbol last allows compress_symbols to use standard
- * fast string functions */
- for (i = 255; i >= 0; i--) {
-@@ -751,6 +761,8 @@ int main(int argc, char **argv)
- absolute_percpu = 1;
- else if (strcmp(argv[i], "--base-relative") == 0)
- base_relative = 1;
-+ else if (strcmp(argv[i], "--uncompressed") == 0)
-+ uncompressed = 1;
- else
- usage();
- }
---- a/scripts/link-vmlinux.sh
-+++ b/scripts/link-vmlinux.sh
-@@ -160,6 +160,10 @@ kallsyms()
- kallsymopt="${kallsymopt} --base-relative"
- fi
-
-+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then
-+ kallsymopt="${kallsymopt} --uncompressed"
-+ fi
-+
- local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
- ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
-
diff --git a/target/linux/generic/pending-5.4/205-backtrace_module_info.patch b/target/linux/generic/pending-5.4/205-backtrace_module_info.patch
deleted file mode 100644
index 6048c25957..0000000000
--- a/target/linux/generic/pending-5.4/205-backtrace_module_info.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries
-
-[john@phrozen.org: felix will add this to his upstream queue]
-
-lede-commit 53827cdc824556cda910b23ce5030c363b8f1461
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- lib/vsprintf.c | 15 +++++++++++----
- 1 file changed, 11 insertions(+), 4 deletions(-)
-
---- a/lib/vsprintf.c
-+++ b/lib/vsprintf.c
-@@ -940,8 +940,10 @@ char *symbol_string(char *buf, char *end
- struct printf_spec spec, const char *fmt)
- {
- unsigned long value;
--#ifdef CONFIG_KALLSYMS
- char sym[KSYM_SYMBOL_LEN];
-+#ifndef CONFIG_KALLSYMS
-+ struct module *mod;
-+ int len;
- #endif
-
- if (fmt[1] == 'R')
-@@ -958,8 +960,14 @@ char *symbol_string(char *buf, char *end
-
- return string_nocheck(buf, end, sym, spec);
- #else
-- return special_hex_number(buf, end, value, sizeof(void *));
-+ len = snprintf(sym, sizeof(sym), "0x%lx", value);
-+ mod = __module_address(value);
-+ if (mod)
-+ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]",
-+ mod->name, mod->core_layout.base,
-+ mod->core_layout.size);
- #endif
-+ return string(buf, end, sym, spec);
- }
-
- static const struct printf_spec default_str_spec = {
diff --git a/target/linux/generic/pending-5.4/240-remove-unsane-filenames-from-deps_initramfs-list.patch b/target/linux/generic/pending-5.4/240-remove-unsane-filenames-from-deps_initramfs-list.patch
deleted file mode 100644
index 7d890d3e8b..0000000000
--- a/target/linux/generic/pending-5.4/240-remove-unsane-filenames-from-deps_initramfs-list.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: usr: sanitize deps_initramfs list
-
-If any filename in the intramfs dependency
-list contains a colon, that causes a kernel
-build error like this:
-
-/devel/openwrt/build_dir/linux-ar71xx_generic/linux-3.6.6/usr/Makefile:58: *** multiple target patterns. Stop.
-make[5]: *** [usr] Error 2
-
-Fix it by removing such filenames from the
-deps_initramfs list.
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- usr/Makefile | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
-
---- a/usr/Makefile
-+++ b/usr/Makefile
-@@ -42,21 +42,23 @@ ifneq ($(wildcard $(obj)/$(datafile_d_y)
- include $(obj)/$(datafile_d_y)
- endif
-
-+deps_initramfs_sane := $(foreach v,$(deps_initramfs),$(if $(findstring :,$(v)),,$(v)))
-+
- quiet_cmd_initfs = GEN $@
- cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
-
- targets := $(datafile_y)
-
- # do not try to update files included in initramfs
--$(deps_initramfs): ;
-+$(deps_initramfs_sane): ;
-
--$(deps_initramfs): klibcdirs
-+$(deps_initramfs_sane): klibcdirs
- # We rebuild initramfs_data.cpio if:
- # 1) Any included file is newer than initramfs_data.cpio
- # 2) There are changes in which files are included (added or deleted)
- # 3) If gen_init_cpio are newer than initramfs_data.cpio
- # 4) Arguments to gen_initramfs.sh changes
--$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
-+$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs_sane) klibcdirs
- $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y)
- $(call if_changed,initfs)
-
diff --git a/target/linux/generic/pending-5.4/261-enable_wilink_platform_without_drivers.patch b/target/linux/generic/pending-5.4/261-enable_wilink_platform_without_drivers.patch
deleted file mode 100644
index c4cf2cceb7..0000000000
--- a/target/linux/generic/pending-5.4/261-enable_wilink_platform_without_drivers.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From: Imre Kaloz <kaloz@openwrt.org>
-Subject: [PATCH] hack: net: wireless: make the wl12xx glue code available with
- compat-wireless, too
-
-Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
----
- drivers/net/wireless/ti/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/net/wireless/ti/Kconfig
-+++ b/drivers/net/wireless/ti/Kconfig
-@@ -20,7 +20,7 @@ source "drivers/net/wireless/ti/wlcore/K
-
- config WILINK_PLATFORM_DATA
- bool "TI WiLink platform data"
-- depends on WLCORE_SDIO || WL1251_SDIO
-+ depends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS
- default y
- ---help---
- Small platform data bit needed to pass data to the sdio modules.
diff --git a/target/linux/generic/pending-5.4/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-5.4/270-platform-mikrotik-build-bits.patch
deleted file mode 100644
index df738ef97b..0000000000
--- a/target/linux/generic/pending-5.4/270-platform-mikrotik-build-bits.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>
-Date: Sat, 28 Mar 2020 12:11:50 +0100
-Subject: [PATCH] generic: platform/mikrotik build bits (5.4)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds platform/mikrotik kernel build bits
-
-Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
----
- drivers/platform/Kconfig | 2 ++
- drivers/platform/Makefile | 1 +
- 2 files changed, 3 insertions(+)
-
---- a/drivers/platform/Kconfig
-+++ b/drivers/platform/Kconfig
-@@ -13,3 +13,5 @@ source "drivers/platform/chrome/Kconfig"
- source "drivers/platform/mellanox/Kconfig"
-
- source "drivers/platform/olpc/Kconfig"
-+
-+source "drivers/platform/mikrotik/Kconfig"
---- a/drivers/platform/Makefile
-+++ b/drivers/platform/Makefile
-@@ -9,3 +9,4 @@ obj-$(CONFIG_MIPS) += mips/
- obj-$(CONFIG_OLPC_EC) += olpc/
- obj-$(CONFIG_GOLDFISH) += goldfish/
- obj-$(CONFIG_CHROME_PLATFORMS) += chrome/
-+obj-$(CONFIG_MIKROTIK) += mikrotik/
diff --git a/target/linux/generic/pending-5.4/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-5.4/300-mips_expose_boot_raw.patch
deleted file mode 100644
index e16e34f1f9..0000000000
--- a/target/linux/generic/pending-5.4/300-mips_expose_boot_raw.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Mark Miller <mark@mirell.org>
-Subject: mips: expose CONFIG_BOOT_RAW
-
-This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on
-certain Broadcom chipsets running CFE in order to load the kernel.
-
-Signed-off-by: Mark Miller <mark@mirell.org>
-Acked-by: Rob Landley <rob@landley.net>
----
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1074,9 +1074,6 @@ config FW_ARC
- config ARCH_MAY_HAVE_PC_FDC
- bool
-
--config BOOT_RAW
-- bool
--
- config CEVT_BCM1480
- bool
-
-@@ -3050,6 +3047,18 @@ choice
- bool "Extend builtin kernel arguments with bootloader arguments"
- endchoice
-
-+config BOOT_RAW
-+ bool "Enable the kernel to be executed from the load address"
-+ default n
-+ help
-+ Allow the kernel to be executed from the load address for
-+ bootloaders which cannot read the ELF format. This places
-+ a jump to start_kernel at the load address.
-+
-+ If unsure, say N.
-+
-+
-+
- endmenu
-
- config LOCKDEP_SUPPORT
diff --git a/target/linux/generic/pending-5.4/302-mips_no_branch_likely.patch b/target/linux/generic/pending-5.4/302-mips_no_branch_likely.patch
deleted file mode 100644
index bf1b489111..0000000000
--- a/target/linux/generic/pending-5.4/302-mips_no_branch_likely.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: mips: use -mno-branch-likely for kernel and userspace
-
-saves ~11k kernel size after lzma and ~12k squashfs size in the
-
-lede-commit: 41a039f46450ffae9483d6216422098669da2900
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- arch/mips/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -92,7 +92,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- # machines may also. Since BFD is incredibly buggy with respect to
- # crossformat linking we rely on the elf2ecoff tool for format conversion.
- #
--cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
-+cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
- KBUILD_AFLAGS_MODULE += -mlong-calls
diff --git a/target/linux/generic/pending-5.4/305-mips_module_reloc.patch b/target/linux/generic/pending-5.4/305-mips_module_reloc.patch
deleted file mode 100644
index 40a219f5d2..0000000000
--- a/target/linux/generic/pending-5.4/305-mips_module_reloc.patch
+++ /dev/null
@@ -1,371 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to
-
-lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- arch/mips/Makefile | 5 +
- arch/mips/include/asm/module.h | 5 +
- arch/mips/kernel/module.c | 279 ++++++++++++++++++++++++++++++++++++++++-
- 3 files changed, 284 insertions(+), 5 deletions(-)
-
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -95,8 +95,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
-+ifdef CONFIG_64BIT
- KBUILD_AFLAGS_MODULE += -mlong-calls
- KBUILD_CFLAGS_MODULE += -mlong-calls
-+else
-+ ifdef CONFIG_DYNAMIC_FTRACE
-+ KBUILD_AFLAGS_MODULE += -mlong-calls
-+ KBUILD_CFLAGS_MODULE += -mlong-calls
-+ else
-+ KBUILD_AFLAGS_MODULE += -mno-long-calls
-+ KBUILD_CFLAGS_MODULE += -mno-long-calls
-+ endif
-+endif
-
- ifeq ($(CONFIG_RELOCATABLE),y)
- LDFLAGS_vmlinux += --emit-relocs
---- a/arch/mips/include/asm/module.h
-+++ b/arch/mips/include/asm/module.h
-@@ -12,6 +12,11 @@ struct mod_arch_specific {
- const struct exception_table_entry *dbe_start;
- const struct exception_table_entry *dbe_end;
- struct mips_hi16 *r_mips_hi16_list;
-+
-+ void *phys_plt_tbl;
-+ void *virt_plt_tbl;
-+ unsigned int phys_plt_offset;
-+ unsigned int virt_plt_offset;
- };
-
- typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -32,14 +32,221 @@ struct mips_hi16 {
- static LIST_HEAD(dbe_list);
- static DEFINE_SPINLOCK(dbe_lock);
-
--#ifdef MODULE_START
-+/*
-+ * Get the potential max trampolines size required of the init and
-+ * non-init sections. Only used if we cannot find enough contiguous
-+ * physically mapped memory to put the module into.
-+ */
-+static unsigned int
-+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-+ const char *secstrings, unsigned int symindex, bool is_init)
-+{
-+ unsigned long ret = 0;
-+ unsigned int i, j;
-+ Elf_Sym *syms;
-+
-+ /* Everything marked ALLOC (this includes the exported symbols) */
-+ for (i = 1; i < hdr->e_shnum; ++i) {
-+ unsigned int info = sechdrs[i].sh_info;
-+
-+ if (sechdrs[i].sh_type != SHT_REL
-+ && sechdrs[i].sh_type != SHT_RELA)
-+ continue;
-+
-+ /* Not a valid relocation section? */
-+ if (info >= hdr->e_shnum)
-+ continue;
-+
-+ /* Don't bother with non-allocated sections */
-+ if (!(sechdrs[info].sh_flags & SHF_ALLOC))
-+ continue;
-+
-+ /* If it's called *.init*, and we're not init, we're
-+ not interested */
-+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
-+ != is_init)
-+ continue;
-+
-+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
-+ if (sechdrs[i].sh_type == SHT_REL) {
-+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rel[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ } else {
-+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
-+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
-+
-+ for (j = 0; j < size; ++j) {
-+ Elf_Sym *sym;
-+
-+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
-+ continue;
-+
-+ sym = syms + ELF_MIPS_R_SYM(rela[j]);
-+ if (!is_init && sym->st_shndx != SHN_UNDEF)
-+ continue;
-+
-+ ret += 4 * sizeof(int);
-+ }
-+ }
-+ }
-+
-+ return ret;
-+}
-+
-+#ifndef MODULE_START
-+static void *alloc_phys(unsigned long size)
-+{
-+ unsigned order;
-+ struct page *page;
-+ struct page *p;
-+
-+ size = PAGE_ALIGN(size);
-+ order = get_order(size);
-+
-+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
-+ __GFP_THISNODE, order);
-+ if (!page)
-+ return NULL;
-+
-+ split_page(page, order);
-+
-+ /* mark all pages except for the last one */
-+ for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p)
-+ set_bit(PG_owner_priv_1, &p->flags);
-+
-+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
-+ __free_page(p);
-+
-+ return page_address(page);
-+}
-+#endif
-+
-+static void free_phys(void *ptr)
-+{
-+ struct page *page;
-+ bool free;
-+
-+ page = virt_to_page(ptr);
-+ do {
-+ free = test_and_clear_bit(PG_owner_priv_1, &page->flags);
-+ __free_page(page);
-+ page++;
-+ } while (free);
-+}
-+
-+
- void *module_alloc(unsigned long size)
- {
-+#ifdef MODULE_START
- return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END,
- GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,
- __builtin_return_address(0));
-+#else
-+ void *ptr;
-+
-+ if (size == 0)
-+ return NULL;
-+
-+ ptr = alloc_phys(size);
-+
-+ /* If we failed to allocate physically contiguous memory,
-+ * fall back to regular vmalloc. The module loader code will
-+ * create jump tables to handle long jumps */
-+ if (!ptr)
-+ return vmalloc(size);
-+
-+ return ptr;
-+#endif
- }
-+
-+static inline bool is_phys_addr(void *ptr)
-+{
-+#ifdef CONFIG_64BIT
-+ return (KSEGX((unsigned long)ptr) == CKSEG0);
-+#else
-+ return (KSEGX(ptr) == KSEG0);
- #endif
-+}
-+
-+/* Free memory returned from module_alloc */
-+void module_memfree(void *module_region)
-+{
-+ if (is_phys_addr(module_region))
-+ free_phys(module_region);
-+ else
-+ vfree(module_region);
-+}
-+
-+static void *__module_alloc(int size, bool phys)
-+{
-+ void *ptr;
-+
-+ if (phys)
-+ ptr = kmalloc(size, GFP_KERNEL);
-+ else
-+ ptr = vmalloc(size);
-+ return ptr;
-+}
-+
-+static void __module_free(void *ptr)
-+{
-+ if (is_phys_addr(ptr))
-+ kfree(ptr);
-+ else
-+ vfree(ptr);
-+}
-+
-+int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
-+ char *secstrings, struct module *mod)
-+{
-+ unsigned int symindex = 0;
-+ unsigned int core_size, init_size;
-+ int i;
-+
-+ mod->arch.phys_plt_offset = 0;
-+ mod->arch.virt_plt_offset = 0;
-+ mod->arch.phys_plt_tbl = NULL;
-+ mod->arch.virt_plt_tbl = NULL;
-+
-+ if (IS_ENABLED(CONFIG_64BIT))
-+ return 0;
-+
-+ for (i = 1; i < hdr->e_shnum; i++)
-+ if (sechdrs[i].sh_type == SHT_SYMTAB)
-+ symindex = i;
-+
-+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
-+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
-+
-+ if ((core_size + init_size) == 0)
-+ return 0;
-+
-+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
-+ if (!mod->arch.phys_plt_tbl)
-+ return -ENOMEM;
-+
-+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
-+ if (!mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ return -ENOMEM;
-+ }
-+
-+ return 0;
-+}
-
- static int apply_r_mips_none(struct module *me, u32 *location,
- u32 base, Elf_Addr v, bool rela)
-@@ -55,9 +262,40 @@ static int apply_r_mips_32(struct module
- return 0;
- }
-
-+static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
-+ void *start, Elf_Addr v)
-+{
-+ unsigned *tramp = start + *plt_offset;
-+ *plt_offset += 4 * sizeof(int);
-+
-+ /* adjust carry for addiu */
-+ if (v & 0x00008000)
-+ v += 0x10000;
-+
-+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */
-+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */
-+ tramp[2] = 0x03200008; /* jr t9 */
-+ tramp[3] = 0x00000000; /* nop */
-+
-+ return (Elf_Addr) tramp;
-+}
-+
-+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
-+{
-+ if (is_phys_addr(location))
-+ return add_plt_entry_to(&me->arch.phys_plt_offset,
-+ me->arch.phys_plt_tbl, v);
-+ else
-+ return add_plt_entry_to(&me->arch.virt_plt_offset,
-+ me->arch.virt_plt_tbl, v);
-+
-+}
-+
- static int apply_r_mips_26(struct module *me, u32 *location,
- u32 base, Elf_Addr v, bool rela)
- {
-+ u32 ofs = base & 0x03ffffff;
-+
- if (v % 4) {
- pr_err("module %s: dangerous R_MIPS_26 relocation\n",
- me->name);
-@@ -65,13 +303,17 @@ static int apply_r_mips_26(struct module
- }
-
- if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
-- pr_err("module %s: relocation overflow\n",
-- me->name);
-- return -ENOEXEC;
-+ v = add_plt_entry(me, location, v + (ofs << 2));
-+ if (!v) {
-+ pr_err("module %s: relocation overflow\n",
-+ me->name);
-+ return -ENOEXEC;
-+ }
-+ ofs = 0;
- }
-
- *location = (*location & ~0x03ffffff) |
-- ((base + (v >> 2)) & 0x03ffffff);
-+ ((ofs + (v >> 2)) & 0x03ffffff);
-
- return 0;
- }
-@@ -447,9 +689,36 @@ int module_finalize(const Elf_Ehdr *hdr,
- list_add(&me->arch.dbe_list, &dbe_list);
- spin_unlock_irq(&dbe_lock);
- }
-+
-+ /* Get rid of the fixup trampoline if we're running the module
-+ * from physically mapped address space */
-+ if (me->arch.phys_plt_offset == 0) {
-+ __module_free(me->arch.phys_plt_tbl);
-+ me->arch.phys_plt_tbl = NULL;
-+ }
-+ if (me->arch.virt_plt_offset == 0) {
-+ __module_free(me->arch.virt_plt_tbl);
-+ me->arch.virt_plt_tbl = NULL;
-+ }
-+
- return 0;
- }
-
-+void module_arch_freeing_init(struct module *mod)
-+{
-+ if (mod->state == MODULE_STATE_LIVE)
-+ return;
-+
-+ if (mod->arch.phys_plt_tbl) {
-+ __module_free(mod->arch.phys_plt_tbl);
-+ mod->arch.phys_plt_tbl = NULL;
-+ }
-+ if (mod->arch.virt_plt_tbl) {
-+ __module_free(mod->arch.virt_plt_tbl);
-+ mod->arch.virt_plt_tbl = NULL;
-+ }
-+}
-+
- void module_arch_cleanup(struct module *mod)
- {
- spin_lock_irq(&dbe_lock);
diff --git a/target/linux/generic/pending-5.4/307-mips_highmem_offset.patch b/target/linux/generic/pending-5.4/307-mips_highmem_offset.patch
deleted file mode 100644
index 9dd2fa9863..0000000000
--- a/target/linux/generic/pending-5.4/307-mips_highmem_offset.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- arch/mips/include/asm/mach-generic/spaces.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/mips/include/asm/mach-generic/spaces.h
-+++ b/arch/mips/include/asm/mach-generic/spaces.h
-@@ -50,7 +50,7 @@
- * Memory above this physical address will be considered highmem.
- */
- #ifndef HIGHMEM_START
--#define HIGHMEM_START _AC(0x20000000, UL)
-+#define HIGHMEM_START _AC(0x10000000, UL)
- #endif
-
- #endif /* CONFIG_32BIT */
diff --git a/target/linux/generic/pending-5.4/308-mips32r2_tune.patch b/target/linux/generic/pending-5.4/308-mips32r2_tune.patch
deleted file mode 100644
index 8636511464..0000000000
--- a/target/linux/generic/pending-5.4/308-mips32r2_tune.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2
-
-This provides a good tradeoff across at least 24Kc-74Kc, while also
-producing smaller code.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- arch/mips/Makefile | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -177,7 +177,7 @@ cflags-$(CONFIG_CPU_VR41XX) += -march=r4
- cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap
- cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap
- cflags-$(CONFIG_CPU_MIPS32_R1) += -march=mips32 -Wa,--trap
--cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -Wa,--trap
-+cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -mtune=34kc -Wa,--trap
- cflags-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,--trap -modd-spreg
- cflags-$(CONFIG_CPU_MIPS64_R1) += -march=mips64 -Wa,--trap
- cflags-$(CONFIG_CPU_MIPS64_R2) += -march=mips64r2 -Wa,--trap
diff --git a/target/linux/generic/pending-5.4/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch b/target/linux/generic/pending-5.4/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch
deleted file mode 100644
index e4075a24bd..0000000000
--- a/target/linux/generic/pending-5.4/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From 87ec87c2ad615c1a177cd08ef5fa29fc739f6e50 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sun, 23 Dec 2018 18:06:53 +0100
-Subject: [PATCH] MIPS: Add CPU option reporting to /proc/cpuinfo
-
-Many MIPS CPUs have optional CPU features which are not activates for
-all CPU cores. Print the CPU options which are implemented in the core
-in /proc/cpuinfo. This makes it possible to see what features are
-supported and which are not supported. This should cover all standard
-MIPS extensions, before it only printed information about the main MIPS
-ASEs.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- arch/mips/kernel/proc.c | 116 ++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 116 insertions(+)
-
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -134,6 +134,122 @@ static int show_cpuinfo(struct seq_file
- seq_printf(m, "micromips kernel\t: %s\n",
- (read_c0_config3() & MIPS_CONF3_ISA_OE) ? "yes" : "no");
- }
-+
-+ seq_printf(m, "Options implemented\t:");
-+ if (cpu_has_tlb)
-+ seq_printf(m, "%s", " tlb");
-+ if (cpu_has_ftlb)
-+ seq_printf(m, "%s", " ftlb");
-+ if (cpu_has_tlbinv)
-+ seq_printf(m, "%s", " tlbinv");
-+ if (cpu_has_segments)
-+ seq_printf(m, "%s", " segments");
-+ if (cpu_has_rixiex)
-+ seq_printf(m, "%s", " rixiex");
-+ if (cpu_has_ldpte)
-+ seq_printf(m, "%s", " ldpte");
-+ if (cpu_has_maar)
-+ seq_printf(m, "%s", " maar");
-+ if (cpu_has_rw_llb)
-+ seq_printf(m, "%s", " rw_llb");
-+ if (cpu_has_4kex)
-+ seq_printf(m, "%s", " 4kex");
-+ if (cpu_has_3k_cache)
-+ seq_printf(m, "%s", " 3k_cache");
-+ if (cpu_has_4k_cache)
-+ seq_printf(m, "%s", " 4k_cache");
-+ if (cpu_has_6k_cache)
-+ seq_printf(m, "%s", " 6k_cache");
-+ if (cpu_has_8k_cache)
-+ seq_printf(m, "%s", " 8k_cache");
-+ if (cpu_has_tx39_cache)
-+ seq_printf(m, "%s", " tx39_cache");
-+ if (cpu_has_octeon_cache)
-+ seq_printf(m, "%s", " octeon_cache");
-+ if (cpu_has_fpu)
-+ seq_printf(m, "%s", " fpu");
-+ if (cpu_has_32fpr)
-+ seq_printf(m, "%s", " 32fpr");
-+ if (cpu_has_cache_cdex_p)
-+ seq_printf(m, "%s", " cache_cdex_p");
-+ if (cpu_has_cache_cdex_s)
-+ seq_printf(m, "%s", " cache_cdex_s");
-+ if (cpu_has_prefetch)
-+ seq_printf(m, "%s", " prefetch");
-+ if (cpu_has_mcheck)
-+ seq_printf(m, "%s", " mcheck");
-+ if (cpu_has_ejtag)
-+ seq_printf(m, "%s", " ejtag");
-+ if (cpu_has_llsc)
-+ seq_printf(m, "%s", " llsc");
-+ if (cpu_has_bp_ghist)
-+ seq_printf(m, "%s", " bp_ghist");
-+ if (cpu_has_guestctl0ext)
-+ seq_printf(m, "%s", " guestctl0ext");
-+ if (cpu_has_guestctl1)
-+ seq_printf(m, "%s", " guestctl1");
-+ if (cpu_has_guestctl2)
-+ seq_printf(m, "%s", " guestctl2");
-+ if (cpu_has_guestid)
-+ seq_printf(m, "%s", " guestid");
-+ if (cpu_has_drg)
-+ seq_printf(m, "%s", " drg");
-+ if (cpu_has_rixi)
-+ seq_printf(m, "%s", " rixi");
-+ if (cpu_has_lpa)
-+ seq_printf(m, "%s", " lpa");
-+ if (cpu_has_mvh)
-+ seq_printf(m, "%s", " mvh");
-+ if (cpu_has_vtag_icache)
-+ seq_printf(m, "%s", " vtag_icache");
-+ if (cpu_has_dc_aliases)
-+ seq_printf(m, "%s", " dc_aliases");
-+ if (cpu_has_ic_fills_f_dc)
-+ seq_printf(m, "%s", " ic_fills_f_dc");
-+ if (cpu_has_pindexed_dcache)
-+ seq_printf(m, "%s", " pindexed_dcache");
-+ if (cpu_has_userlocal)
-+ seq_printf(m, "%s", " userlocal");
-+ if (cpu_has_nofpuex)
-+ seq_printf(m, "%s", " nofpuex");
-+ if (cpu_has_vint)
-+ seq_printf(m, "%s", " vint");
-+ if (cpu_has_veic)
-+ seq_printf(m, "%s", " veic");
-+ if (cpu_has_inclusive_pcaches)
-+ seq_printf(m, "%s", " inclusive_pcaches");
-+ if (cpu_has_perf_cntr_intr_bit)
-+ seq_printf(m, "%s", " perf_cntr_intr_bit");
-+ if (cpu_has_ufr)
-+ seq_printf(m, "%s", " ufr");
-+ if (cpu_has_fre)
-+ seq_printf(m, "%s", " fre");
-+ if (cpu_has_cdmm)
-+ seq_printf(m, "%s", " cdmm");
-+ if (cpu_has_small_pages)
-+ seq_printf(m, "%s", " small_pages");
-+ if (cpu_has_nan_legacy)
-+ seq_printf(m, "%s", " nan_legacy");
-+ if (cpu_has_nan_2008)
-+ seq_printf(m, "%s", " nan_2008");
-+ if (cpu_has_ebase_wg)
-+ seq_printf(m, "%s", " ebase_wg");
-+ if (cpu_has_badinstr)
-+ seq_printf(m, "%s", " badinstr");
-+ if (cpu_has_badinstrp)
-+ seq_printf(m, "%s", " badinstrp");
-+ if (cpu_has_contextconfig)
-+ seq_printf(m, "%s", " contextconfig");
-+ if (cpu_has_perf)
-+ seq_printf(m, "%s", " perf");
-+ if (cpu_has_shared_ftlb_ram)
-+ seq_printf(m, "%s", " shared_ftlb_ram");
-+ if (cpu_has_shared_ftlb_entries)
-+ seq_printf(m, "%s", " shared_ftlb_entries");
-+ if (cpu_has_mipsmt_pertccounters)
-+ seq_printf(m, "%s", " mipsmt_pertccounters");
-+ seq_printf(m, "\n");
-+
- seq_printf(m, "shadow register sets\t: %d\n",
- cpu_data[n].srsets);
- seq_printf(m, "kscratch registers\t: %d\n",
diff --git a/target/linux/generic/pending-5.4/310-arm_module_unresolved_weak_sym.patch b/target/linux/generic/pending-5.4/310-arm_module_unresolved_weak_sym.patch
deleted file mode 100644
index 24807f78d3..0000000000
--- a/target/linux/generic/pending-5.4/310-arm_module_unresolved_weak_sym.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: fix errors in unresolved weak symbols on arm
-
-lede-commit: 570699d4838a907c3ef9f2819bf19eb72997b32f
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- arch/arm/kernel/module.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -99,6 +99,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
- return -ENOEXEC;
- }
-
-+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+ ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+ continue;
-+
- loc = dstsec->sh_addr + rel->r_offset;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
diff --git a/target/linux/generic/pending-5.4/311-MIPS-zboot-put-appended-dtb-into-a-section.patch b/target/linux/generic/pending-5.4/311-MIPS-zboot-put-appended-dtb-into-a-section.patch
deleted file mode 100644
index 3f8808f702..0000000000
--- a/target/linux/generic/pending-5.4/311-MIPS-zboot-put-appended-dtb-into-a-section.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 7d1531c81c0fb4c93bea8dc316043ad0e4d0c270 Mon Sep 17 00:00:00 2001
-From: Chuanhong Guo <gch981213@gmail.com>
-Date: Sun, 25 Oct 2020 23:19:40 +0800
-Subject: [PATCH] MIPS: zboot: put appended dtb into a section
-
-This will make a separated section for dtb appear in ELF, and we can
-then use objcopy to patch a dtb into vmlinuz when RAW_APPENDED_DTB
-is set in kernel config.
-
-command to patch a dtb:
-objcopy --set-section-flags=.appended_dtb=alloc,contents \
- --update-section=.appended_dtb=<target>.dtb vmlinuz vmlinuz-dtb
-
-Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
----
- arch/mips/boot/compressed/ld.script | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
---- a/arch/mips/boot/compressed/ld.script
-+++ b/arch/mips/boot/compressed/ld.script
-@@ -31,9 +31,12 @@ SECTIONS
- CONSTRUCTORS
- . = ALIGN(16);
- }
-- __appended_dtb = .;
-- /* leave space for appended DTB */
-- . += 0x100000;
-+
-+ .appended_dtb : {
-+ __appended_dtb = .;
-+ /* leave space for appended DTB */
-+ . += 0x100000;
-+ }
-
- _edata = .;
- /* End of data section */
diff --git a/target/linux/generic/pending-5.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch
deleted file mode 100644
index 2808c95322..0000000000
--- a/target/linux/generic/pending-5.4/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch
+++ /dev/null
@@ -1,281 +0,0 @@
-From: Yousong Zhou <yszhou4tech@gmail.com>
-Subject: MIPS: kexec: Accept command line parameters from userspace.
-
-Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
----
- arch/mips/kernel/machine_kexec.c | 153 +++++++++++++++++++++++++++++++-----
- arch/mips/kernel/machine_kexec.h | 20 +++++
- arch/mips/kernel/relocate_kernel.S | 21 +++--
- 3 files changed, 167 insertions(+), 27 deletions(-)
- create mode 100644 arch/mips/kernel/machine_kexec.h
-
---- a/arch/mips/kernel/machine_kexec.c
-+++ b/arch/mips/kernel/machine_kexec.c
-@@ -9,14 +9,11 @@
- #include <linux/delay.h>
- #include <linux/libfdt.h>
-
-+#include <asm/bootinfo.h>
- #include <asm/cacheflush.h>
- #include <asm/page.h>
--
--extern const unsigned char relocate_new_kernel[];
--extern const size_t relocate_new_kernel_size;
--
--extern unsigned long kexec_start_address;
--extern unsigned long kexec_indirection_page;
-+#include <linux/uaccess.h>
-+#include "machine_kexec.h"
-
- static unsigned long reboot_code_buffer;
-
-@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL
- void (*_machine_kexec_shutdown)(void) = NULL;
- void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL;
-
-+static void machine_kexec_print_args(void)
-+{
-+ unsigned long argc = (int)kexec_args[0];
-+ int i;
-+
-+ pr_info("kexec_args[0] (argc): %lu\n", argc);
-+ pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]);
-+ pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]);
-+ pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]);
-+
-+ for (i = 0; i < argc; i++) {
-+ pr_info("kexec_argv[%d] = %p, %s\n",
-+ i, kexec_argv[i], kexec_argv[i]);
-+ }
-+}
-+
-+static void machine_kexec_init_argv(struct kimage *image)
-+{
-+ void __user *buf = NULL;
-+ size_t bufsz;
-+ size_t size;
-+ int i;
-+
-+ bufsz = 0;
-+ for (i = 0; i < image->nr_segments; i++) {
-+ struct kexec_segment *seg;
-+
-+ seg = &image->segment[i];
-+ if (seg->bufsz < 6)
-+ continue;
-+
-+ if (strncmp((char *) seg->buf, "kexec ", 6))
-+ continue;
-+
-+ buf = seg->buf;
-+ bufsz = seg->bufsz;
-+ break;
-+ }
-+
-+ if (!buf)
-+ return;
-+
-+ size = KEXEC_COMMAND_LINE_SIZE;
-+ size = min(size, bufsz);
-+ if (size < bufsz)
-+ pr_warn("kexec command line truncated to %zd bytes\n", size);
-+
-+ /* Copy to kernel space */
-+ if (copy_from_user(kexec_argv_buf, buf, size))
-+ pr_warn("kexec command line copy to kernel space failed\n");
-+
-+ kexec_argv_buf[size - 1] = 0;
-+}
-+
-+static void machine_kexec_parse_argv(struct kimage *image)
-+{
-+ char *reboot_code_buffer;
-+ int reloc_delta;
-+ char *ptr;
-+ int argc;
-+ int i;
-+
-+ ptr = kexec_argv_buf;
-+ argc = 0;
-+
-+ /*
-+ * convert command line string to array of parameters
-+ * (as bootloader does).
-+ */
-+ while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) {
-+ if (*ptr == ' ') {
-+ *ptr++ = '\0';
-+ continue;
-+ }
-+
-+ kexec_argv[argc++] = ptr;
-+ ptr = strchr(ptr, ' ');
-+ }
-+
-+ if (!argc)
-+ return;
-+
-+ kexec_args[0] = argc;
-+ kexec_args[1] = (unsigned long)kexec_argv;
-+ kexec_args[2] = 0;
-+ kexec_args[3] = 0;
-+
-+ reboot_code_buffer = page_address(image->control_code_page);
-+ reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel;
-+
-+ kexec_args[1] += reloc_delta;
-+ for (i = 0; i < argc; i++)
-+ kexec_argv[i] += reloc_delta;
-+}
-+
- static void kexec_image_info(const struct kimage *kimage)
- {
- unsigned long i;
-@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim
- #endif
-
- kexec_image_info(kimage);
-+ /*
-+ * Whenever arguments passed from kexec-tools, Init the arguments as
-+ * the original ones to try avoiding booting failure.
-+ */
-+
-+ kexec_args[0] = fw_arg0;
-+ kexec_args[1] = fw_arg1;
-+ kexec_args[2] = fw_arg2;
-+ kexec_args[3] = fw_arg3;
-+
-+ machine_kexec_init_argv(kimage);
-+ machine_kexec_parse_argv(kimage);
-
- if (_machine_kexec_prepare)
- return _machine_kexec_prepare(kimage);
-@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r
- void kexec_nonboot_cpu_jump(void)
- {
- local_flush_icache_range((unsigned long)relocated_kexec_smp_wait,
-- reboot_code_buffer + relocate_new_kernel_size);
-+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);
-
- relocated_kexec_smp_wait(NULL);
- }
-@@ -199,7 +303,7 @@ void kexec_reboot(void)
- * machine_kexec() CPU.
- */
- local_flush_icache_range(reboot_code_buffer,
-- reboot_code_buffer + relocate_new_kernel_size);
-+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);
-
- do_kexec = (void *)reboot_code_buffer;
- do_kexec();
-@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image)
- unsigned long *ptr;
-
- reboot_code_buffer =
-- (unsigned long)page_address(image->control_code_page);
-+ (unsigned long)page_address(image->control_code_page);
-+ pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer);
-
- kexec_start_address =
- (unsigned long) phys_to_virt(image->start);
-+ pr_info("kexec_start_address = %p\n", (void *)kexec_start_address);
-
- if (image->type == KEXEC_TYPE_DEFAULT) {
- kexec_indirection_page =
-@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image)
- } else {
- kexec_indirection_page = (unsigned long)&image->head;
- }
-+ pr_info("kexec_indirection_page = %p\n", (void *)kexec_indirection_page);
-
-- memcpy((void*)reboot_code_buffer, relocate_new_kernel,
-- relocate_new_kernel_size);
-+ pr_info("Where is memcpy: %p\n", memcpy);
-+ pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\n",
-+ (void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end);
-+ pr_info("Copy %lu bytes from %p to %p\n", KEXEC_RELOCATE_NEW_KERNEL_SIZE,
-+ (void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer);
-+ memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel,
-+ KEXEC_RELOCATE_NEW_KERNEL_SIZE);
-+
-+ pr_info("Before _print_args().\n");
-+ machine_kexec_print_args();
-+ pr_info("Before eval loop.\n");
-
- /*
- * The generic kexec code builds a page list with physical
-@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image)
- #ifdef CONFIG_SMP
- /* All secondary cpus now may jump to kexec_wait cycle */
- relocated_kexec_smp_wait = reboot_code_buffer +
-- (void *)(kexec_smp_wait - relocate_new_kernel);
-+ (void *)(kexec_smp_wait - kexec_relocate_new_kernel);
- smp_wmb();
- atomic_set(&kexec_ready_to_reboot, 1);
- #endif
---- /dev/null
-+++ b/arch/mips/kernel/machine_kexec.h
-@@ -0,0 +1,20 @@
-+#ifndef _MACHINE_KEXEC_H
-+#define _MACHINE_KEXEC_H
-+
-+#ifndef __ASSEMBLY__
-+extern const unsigned char kexec_relocate_new_kernel[];
-+extern unsigned long kexec_relocate_new_kernel_end;
-+extern unsigned long kexec_start_address;
-+extern unsigned long kexec_indirection_page;
-+
-+extern char kexec_argv_buf[];
-+extern char *kexec_argv[];
-+
-+#define KEXEC_RELOCATE_NEW_KERNEL_SIZE ((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel)
-+#endif /* !__ASSEMBLY__ */
-+
-+#define KEXEC_COMMAND_LINE_SIZE 256
-+#define KEXEC_ARGV_SIZE (KEXEC_COMMAND_LINE_SIZE / 16)
-+#define KEXEC_MAX_ARGC (KEXEC_ARGV_SIZE / sizeof(long))
-+
-+#endif
---- a/arch/mips/kernel/relocate_kernel.S
-+++ b/arch/mips/kernel/relocate_kernel.S
-@@ -10,8 +10,9 @@
- #include <asm/mipsregs.h>
- #include <asm/stackframe.h>
- #include <asm/addrspace.h>
-+#include "machine_kexec.h"
-
--LEAF(relocate_new_kernel)
-+LEAF(kexec_relocate_new_kernel)
- PTR_L a0, arg0
- PTR_L a1, arg1
- PTR_L a2, arg2
-@@ -96,7 +97,7 @@ done:
- #endif
- /* jump to kexec_start_address */
- j s1
-- END(relocate_new_kernel)
-+ END(kexec_relocate_new_kernel)
-
- #ifdef CONFIG_SMP
- /*
-@@ -182,9 +183,15 @@ kexec_indirection_page:
- PTR 0
- .size kexec_indirection_page, PTRSIZE
-
--relocate_new_kernel_end:
-+kexec_argv_buf:
-+ EXPORT(kexec_argv_buf)
-+ .skip KEXEC_COMMAND_LINE_SIZE
-+ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE
-+
-+kexec_argv:
-+ EXPORT(kexec_argv)
-+ .skip KEXEC_ARGV_SIZE
-+ .size kexec_argv, KEXEC_ARGV_SIZE
-
--relocate_new_kernel_size:
-- EXPORT(relocate_new_kernel_size)
-- PTR relocate_new_kernel_end - relocate_new_kernel
-- .size relocate_new_kernel_size, PTRSIZE
-+kexec_relocate_new_kernel_end:
-+ EXPORT(kexec_relocate_new_kernel_end)
diff --git a/target/linux/generic/pending-5.4/332-arc-add-OWRTDTB-section.patch b/target/linux/generic/pending-5.4/332-arc-add-OWRTDTB-section.patch
deleted file mode 100644
index 4b0534eff7..0000000000
--- a/target/linux/generic/pending-5.4/332-arc-add-OWRTDTB-section.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From bb0c3b0175240bf152fd7c644821a0cf9f77c37c Mon Sep 17 00:00:00 2001
-From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
-Date: Fri, 15 Mar 2019 18:53:38 +0300
-Subject: [PATCH] arc add OWRTDTB section
-
-This change allows OpenWRT to patch resulting kernel binary with
-external .dtb.
-
-That allows us to re-use exactky the same vmlinux on different boards
-given its ARC core configurations match (at least cache line sizes etc).
-
-""patch-dtb" searches for ASCII "OWRTDTB:" strign and copies external
-.dtb right after it, keeping the string in place.
-
-Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
-Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
-Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
----
- arch/arc/kernel/head.S | 10 ++++++++++
- arch/arc/kernel/setup.c | 4 +++-
- arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++
- 3 files changed, 26 insertions(+), 1 deletion(-)
-
---- a/arch/arc/kernel/head.S
-+++ b/arch/arc/kernel/head.S
-@@ -61,6 +61,16 @@
- #endif
- .endm
-
-+ ; Here "patch-dtb" will embed external .dtb
-+ ; Note "patch-dtb" searches for ASCII "OWRTDTB:" string
-+ ; and pastes .dtb right after it, hense the string precedes
-+ ; __image_dtb symbol.
-+ .section .owrt, "aw",@progbits
-+ .ascii "OWRTDTB:"
-+ENTRY(__image_dtb)
-+ .fill 0x4000
-+END(__image_dtb)
-+
- .section .init.text, "ax",@progbits
-
- ;----------------------------------------------------------------
---- a/arch/arc/kernel/setup.c
-+++ b/arch/arc/kernel/setup.c
-@@ -492,6 +492,8 @@ static inline bool uboot_arg_invalid(uns
- /* We always pass 0 as magic from U-boot */
- #define UBOOT_MAGIC_VALUE 0
-
-+extern struct boot_param_header __image_dtb;
-+
- void __init handle_uboot_args(void)
- {
- bool use_embedded_dtb = true;
-@@ -530,7 +532,7 @@ void __init handle_uboot_args(void)
- ignore_uboot_args:
-
- if (use_embedded_dtb) {
-- machine_desc = setup_machine_fdt(__dtb_start);
-+ machine_desc = setup_machine_fdt(&__image_dtb);
- if (!machine_desc)
- panic("Embedded DT invalid\n");
- }
---- a/arch/arc/kernel/vmlinux.lds.S
-+++ b/arch/arc/kernel/vmlinux.lds.S
-@@ -27,6 +27,19 @@ SECTIONS
-
- . = CONFIG_LINUX_LINK_BASE;
-
-+ /*
-+ * In OpenWRT we want to patch built binary embedding .dtb of choice.
-+ * This is implemented with "patch-dtb" utility which searches for
-+ * "OWRTDTB:" string in first 16k of image and if it is found
-+ * copies .dtb right after mentioned string.
-+ *
-+ * Note: "OWRTDTB:" won't be overwritten with .dtb, .dtb will follow it.
-+ */
-+ .owrt : {
-+ *(.owrt)
-+ . = ALIGN(PAGE_SIZE);
-+ }
-+
- _int_vec_base_lds = .;
- .vector : {
- *(.vector)
diff --git a/target/linux/generic/pending-5.4/333-arc-enable-unaligned-access-in-kernel-mode.patch b/target/linux/generic/pending-5.4/333-arc-enable-unaligned-access-in-kernel-mode.patch
deleted file mode 100644
index 1848a84cc4..0000000000
--- a/target/linux/generic/pending-5.4/333-arc-enable-unaligned-access-in-kernel-mode.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Alexey Brodkin <abrodkin@synopsys.com>
-Subject: arc: enable unaligned access in kernel mode
-
-This enables misaligned access handling even in kernel mode.
-Some wireless drivers (ath9k-htc and mt7601u) use misaligned accesses
-here and there and to cope with that without fixing stuff in the drivers
-we're just gracefully handling it on ARC.
-
-Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
----
- arch/arc/kernel/unaligned.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/arc/kernel/unaligned.c
-+++ b/arch/arc/kernel/unaligned.c
-@@ -202,7 +202,7 @@ int misaligned_fixup(unsigned long addre
- char buf[TASK_COMM_LEN];
-
- /* handle user mode only and only if enabled by sysadmin */
-- if (!user_mode(regs) || !unaligned_enabled)
-+ if (!unaligned_enabled)
- return 1;
-
- if (no_unaligned_warning) {
diff --git a/target/linux/generic/pending-5.4/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-5.4/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch
deleted file mode 100644
index 8d4c74219f..0000000000
--- a/target/linux/generic/pending-5.4/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001
-From: Pawel Dembicki <paweldembicki@gmail.com>
-Date: Fri, 24 May 2019 17:56:19 +0200
-Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx
-
-Enable kernel XZ compression option on PPC_85xx. Tested with
-simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor).
-
-Suggested-by: Christian Lamparter <chunkeey@gmail.com>
-Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
----
- arch/powerpc/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/powerpc/Kconfig
-+++ b/arch/powerpc/Kconfig
-@@ -205,7 +205,7 @@ config PPC
- select HAVE_KERNEL_GZIP
- select HAVE_KERNEL_LZMA if DEFAULT_UIMAGE
- select HAVE_KERNEL_LZO if DEFAULT_UIMAGE
-- select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x
-+ select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x || PPC_85xx
- select HAVE_KPROBES
- select HAVE_KPROBES_ON_FTRACE
- select HAVE_KRETPROBES
diff --git a/target/linux/generic/pending-5.4/400-mtd-add-rootfs-split-support.patch b/target/linux/generic/pending-5.4/400-mtd-add-rootfs-split-support.patch
deleted file mode 100644
index 83a4ed39a3..0000000000
--- a/target/linux/generic/pending-5.4/400-mtd-add-rootfs-split-support.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: make rootfs split/detection more generic - patch can be moved to generic-2.6 after testing on other platforms
-
-lede-commit: 328e660b31f0937d52c5ae3d6e7029409918a9df
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/mtd/Kconfig | 17 +++++++++++++++++
- drivers/mtd/mtdpart.c | 35 +++++++++++++++++++++++++++++++++++
- include/linux/mtd/partitions.h | 2 ++
- 3 files changed, 54 insertions(+)
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -12,6 +12,23 @@ menuconfig MTD
-
- if MTD
-
-+menu "OpenWrt specific MTD options"
-+
-+config MTD_ROOTFS_ROOT_DEV
-+ bool "Automatically set 'rootfs' partition to be root filesystem"
-+ default y
-+
-+config MTD_SPLIT_FIRMWARE
-+ bool "Automatically split firmware partition for kernel+rootfs"
-+ default y
-+
-+config MTD_SPLIT_FIRMWARE_NAME
-+ string "Firmware partition name"
-+ depends on MTD_SPLIT_FIRMWARE
-+ default "firmware"
-+
-+endmenu
-+
- config MTD_TESTS
- tristate "MTD tests support (DANGEROUS)"
- depends on m
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -15,10 +15,12 @@
- #include <linux/kmod.h>
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
-+#include <linux/magic.h>
- #include <linux/err.h>
- #include <linux/of.h>
-
- #include "mtdcore.h"
-+#include "mtdsplit/mtdsplit.h"
-
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
-@@ -38,6 +40,8 @@ struct mtd_part {
- struct list_head list;
- };
-
-+static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part);
-+
- /*
- * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
- * the pointer to that structure.
-@@ -612,6 +616,7 @@ int mtd_add_partition(struct mtd_info *p
- if (ret)
- goto err_remove_part;
-
-+ mtd_partition_split(parent, new);
- mtd_add_partition_attrs(new);
-
- return 0;
-@@ -698,6 +703,29 @@ int mtd_del_partition(struct mtd_info *m
- }
- EXPORT_SYMBOL_GPL(mtd_del_partition);
-
-+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
-+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
-+#else
-+#define SPLIT_FIRMWARE_NAME "unused"
-+#endif
-+
-+static void split_firmware(struct mtd_info *master, struct mtd_part *part)
-+{
-+}
-+
-+static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
-+{
-+ static int rootfs_found = 0;
-+
-+ if (rootfs_found)
-+ return;
-+
-+ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
-+ !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
-+ !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
-+ split_firmware(master, part);
-+}
-+
- /*
- * This function, given a master MTD object and a partition table, creates
- * and registers slave MTD objects which are bound to the master according to
-@@ -738,6 +766,7 @@ int add_mtd_partitions(struct mtd_info *
- goto err_del_partitions;
- }
-
-+ mtd_partition_split(master, slave);
- mtd_add_partition_attrs(slave);
- /* Look for subpartitions */
- parse_mtd_partitions(&slave->mtd, parts[i].types, NULL);
diff --git a/target/linux/generic/pending-5.4/401-mtd-add-support-for-different-partition-parser-types.patch b/target/linux/generic/pending-5.4/401-mtd-add-support-for-different-partition-parser-types.patch
deleted file mode 100644
index f471c62376..0000000000
--- a/target/linux/generic/pending-5.4/401-mtd-add-support-for-different-partition-parser-types.patch
+++ /dev/null
@@ -1,142 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: mtd: add support for different partition parser types
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/mtdpart.c | 56 ++++++++++++++++++++++++++++++++++++++++
- include/linux/mtd/partitions.h | 11 ++++++++
- 2 files changed, 67 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -41,6 +41,10 @@ struct mtd_part {
- };
-
- static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part);
-+static int parse_mtd_partitions_by_type(struct mtd_info *master,
-+ enum mtd_parser_type type,
-+ const struct mtd_partition **pparts,
-+ struct mtd_part_parser_data *data);
-
- /*
- * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
-@@ -703,6 +707,36 @@ int mtd_del_partition(struct mtd_info *m
- }
- EXPORT_SYMBOL_GPL(mtd_del_partition);
-
-+static int
-+run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type)
-+{
-+ struct mtd_partition *parts;
-+ int nr_parts;
-+ int i;
-+
-+ nr_parts = parse_mtd_partitions_by_type(&slave->mtd, type, (const struct mtd_partition **)&parts,
-+ NULL);
-+ if (nr_parts <= 0)
-+ return nr_parts;
-+
-+ if (WARN_ON(!parts))
-+ return 0;
-+
-+ for (i = 0; i < nr_parts; i++) {
-+ /* adjust partition offsets */
-+ parts[i].offset += slave->offset;
-+
-+ mtd_add_partition(slave->parent,
-+ parts[i].name,
-+ parts[i].offset,
-+ parts[i].size);
-+ }
-+
-+ kfree(parts);
-+
-+ return nr_parts;
-+}
-+
- #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
- #define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
- #else
-@@ -1052,6 +1086,61 @@ void mtd_part_parser_cleanup(struct mtd_
- }
- }
-
-+static struct mtd_part_parser *
-+get_partition_parser_by_type(enum mtd_parser_type type,
-+ struct mtd_part_parser *start)
-+{
-+ struct mtd_part_parser *p, *ret = NULL;
-+
-+ spin_lock(&part_parser_lock);
-+
-+ p = list_prepare_entry(start, &part_parsers, list);
-+ if (start)
-+ mtd_part_parser_put(start);
-+
-+ list_for_each_entry_continue(p, &part_parsers, list) {
-+ if (p->type == type && try_module_get(p->owner)) {
-+ ret = p;
-+ break;
-+ }
-+ }
-+
-+ spin_unlock(&part_parser_lock);
-+
-+ return ret;
-+}
-+
-+static int parse_mtd_partitions_by_type(struct mtd_info *master,
-+ enum mtd_parser_type type,
-+ const struct mtd_partition **pparts,
-+ struct mtd_part_parser_data *data)
-+{
-+ struct mtd_part_parser *prev = NULL;
-+ int ret = 0;
-+
-+ while (1) {
-+ struct mtd_part_parser *parser;
-+
-+ parser = get_partition_parser_by_type(type, prev);
-+ if (!parser)
-+ break;
-+
-+ ret = (*parser->parse_fn)(master, pparts, data);
-+
-+ if (ret > 0) {
-+ mtd_part_parser_put(parser);
-+ printk(KERN_NOTICE
-+ "%d %s partitions found on MTD device %s\n",
-+ ret, parser->name, master->name);
-+ break;
-+ }
-+
-+ prev = parser;
-+ }
-+
-+ return ret;
-+}
-+
- int mtd_is_partition(const struct mtd_info *mtd)
- {
- struct mtd_part *part;
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -73,6 +73,10 @@ struct mtd_part_parser_data {
- * Functions dealing with the various ways of partitioning the space
- */
-
-+enum mtd_parser_type {
-+ MTD_PARSER_TYPE_DEVICE = 0,
-+};
-+
- struct mtd_part_parser {
- struct list_head list;
- struct module *owner;
-@@ -81,6 +85,7 @@ struct mtd_part_parser {
- int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
- struct mtd_part_parser_data *);
- void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
-+ enum mtd_parser_type type;
- };
-
- /* Container for passing around a set of parsed partitions */
diff --git a/target/linux/generic/pending-5.4/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch b/target/linux/generic/pending-5.4/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
deleted file mode 100644
index afe3ec7756..0000000000
--- a/target/linux/generic/pending-5.4/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: kernel/3.10: allow to use partition parsers for rootfs and firmware split
-
-lede-commit: 3b71cd94bc9517bc25267dccb393b07d4b54564e
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/mtdpart.c | 37 +++++++++++++++++++++++++++++++++++++
- include/linux/mtd/partitions.h | 2 ++
- 2 files changed, 39 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -745,6 +745,7 @@ run_parsers_by_type(struct mtd_part *sla
-
- static void split_firmware(struct mtd_info *master, struct mtd_part *part)
- {
-+ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
- }
-
- static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
-@@ -754,6 +755,12 @@ static void mtd_partition_split(struct m
- if (rootfs_found)
- return;
-
-+ if (!strcmp(part->mtd.name, "rootfs")) {
-+ run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
-+
-+ rootfs_found = 1;
-+ }
-+
- if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
- !strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
- !of_find_property(mtd_get_of_node(&part->mtd), "compatible", NULL))
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -75,6 +75,8 @@ struct mtd_part_parser_data {
-
- enum mtd_parser_type {
- MTD_PARSER_TYPE_DEVICE = 0,
-+ MTD_PARSER_TYPE_ROOTFS,
-+ MTD_PARSER_TYPE_FIRMWARE,
- };
-
- struct mtd_part_parser {
diff --git a/target/linux/generic/pending-5.4/403-mtd-hook-mtdsplit-to-Kbuild.patch b/target/linux/generic/pending-5.4/403-mtd-hook-mtdsplit-to-Kbuild.patch
deleted file mode 100644
index 5d868fffa8..0000000000
--- a/target/linux/generic/pending-5.4/403-mtd-hook-mtdsplit-to-Kbuild.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: [PATCH] kernel/3.10: move squashfs check from rootfs split code into a separate file
-
-lede-commit: d89bea92b31b4e157a0fa438e75370f089f73427
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/Kconfig | 2 ++
- drivers/mtd/Makefile | 2 ++
- 2 files changed, 4 insertions(+)
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
- depends on MTD_SPLIT_FIRMWARE
- default "firmware"
-
-+source "drivers/mtd/mtdsplit/Kconfig"
-+
- endmenu
-
- config MTD_TESTS
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -9,6 +9,8 @@ mtd-y := mtdcore.o mtdsuper.o mtdconc
-
- obj-y += parsers/
-
-+obj-$(CONFIG_MTD_SPLIT) += mtdsplit/
-+
- # 'Users' - code which presents functionality to userspace.
- obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o
- obj-$(CONFIG_MTD_BLOCK) += mtdblock.o
diff --git a/target/linux/generic/pending-5.4/404-mtd-add-more-helper-functions.patch b/target/linux/generic/pending-5.4/404-mtd-add-more-helper-functions.patch
deleted file mode 100644
index 059a440f0a..0000000000
--- a/target/linux/generic/pending-5.4/404-mtd-add-more-helper-functions.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: kernel/3.10: add separate rootfs partition parser
-
-lede-commit: daec7ad7688415156e2730e401503d09bd3acf91
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/mtdpart.c | 29 +++++++++++++++++++++++++++++
- include/linux/mtd/mtd.h | 18 ++++++++++++++++++
- include/linux/mtd/partitions.h | 2 ++
- 3 files changed, 49 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -1165,6 +1165,24 @@ int mtd_is_partition(const struct mtd_in
- }
- EXPORT_SYMBOL_GPL(mtd_is_partition);
-
-+struct mtd_info *mtd_get_master(const struct mtd_info *mtd)
-+{
-+ if (!mtd_is_partition(mtd))
-+ return (struct mtd_info *)mtd;
-+
-+ return mtd_to_part(mtd)->parent;
-+}
-+EXPORT_SYMBOL_GPL(mtd_get_master);
-+
-+uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
-+{
-+ if (!mtd_is_partition(mtd))
-+ return 0;
-+
-+ return mtd_to_part(mtd)->offset;
-+}
-+EXPORT_SYMBOL_GPL(mtdpart_get_offset);
-+
- /* Returns the size of the entire flash chip */
- uint64_t mtd_get_device_size(const struct mtd_info *mtd)
- {
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -504,6 +504,24 @@ static inline void mtd_align_erase_req(s
- req->len += mtd->erasesize - mod;
- }
-
-+static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)
-+{
-+ if (mtd_mod_by_eb(sz, mtd) == 0)
-+ return sz;
-+
-+ /* Round up to next erase block */
-+ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;
-+}
-+
-+static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)
-+{
-+ if (mtd_mod_by_eb(sz, mtd) == 0)
-+ return sz;
-+
-+ /* Round down to the start of the current erase block */
-+ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;
-+}
-+
- static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
- {
- if (mtd->writesize_shift)
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -116,6 +116,8 @@ int mtd_is_partition(const struct mtd_in
- int mtd_add_partition(struct mtd_info *master, const char *name,
- long long offset, long long length);
- int mtd_del_partition(struct mtd_info *master, int partno);
-+struct mtd_info *mtd_get_master(const struct mtd_info *mtd);
-+uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
- uint64_t mtd_get_device_size(const struct mtd_info *mtd);
-
- #endif
diff --git a/target/linux/generic/pending-5.4/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch b/target/linux/generic/pending-5.4/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch
deleted file mode 100644
index d0fc1d50e2..0000000000
--- a/target/linux/generic/pending-5.4/410-mtd-parsers-ofpart-fix-parsing-subpartitions.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 6 May 2021 12:33:58 +0200
-Subject: [PATCH] mtd: parsers: ofpart: fix parsing subpartitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-ofpart was recently patched to not scan random partition nodes as
-subpartitions. That change unfortunately broke scanning valid
-subpartitions like:
-
-partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- compatible = "fixed-partitions";
- label = "bootloader";
- reg = <0x0 0x100000>;
-
- partition@0 {
- label = "config";
- reg = <0x80000 0x80000>;
- };
- };
-};
-
-Fix that regression by adding 1 more code path. We actually need 3
-conditional blocks to support 3 possible cases. This change also makes
-code easier to understand & follow.
-
-Reported-by: David Bauer <mail@david-bauer.net>
-Fixes: 2d751203aacf ("mtd: parsers: ofpart: limit parsing of deprecated DT syntax
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
----
- drivers/mtd/parsers/ofpart_core.c | 26 ++++++++++++++------------
- 1 file changed, 14 insertions(+), 12 deletions(-)
-
---- a/drivers/mtd/parsers/ofpart_core.c
-+++ b/drivers/mtd/parsers/ofpart_core.c
-@@ -57,20 +57,22 @@ static int parse_fixed_partitions(struct
- if (!mtd_node)
- return 0;
-
-- ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-- if (!ofpart_node && !mtd_is_partition(master)) {
-- /*
-- * We might get here even when ofpart isn't used at all (e.g.,
-- * when using another parser), so don't be louder than
-- * KERN_DEBUG
-- */
-- pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n",
-- master->name, mtd_node);
-+ if (!mtd_is_partition(master)) { /* Master */
-+ ofpart_node = of_get_child_by_name(mtd_node, "partitions");
-+ if (!ofpart_node) {
-+ /*
-+ * We might get here even when ofpart isn't used at all (e.g.,
-+ * when using another parser), so don't be louder than
-+ * KERN_DEBUG
-+ */
-+ pr_debug("%s: 'partitions' subnode not found on %pOF. Trying to parse direct subnodes as partitions.\n",
-+ master->name, mtd_node);
-+ ofpart_node = mtd_node;
-+ dedicated = false;
-+ }
-+ } else { /* Partition */
- ofpart_node = mtd_node;
-- dedicated = false;
- }
-- if (!ofpart_node)
-- return 0;
-
- of_id = of_match_node(parse_ofpart_match_table, ofpart_node);
- if (dedicated && !of_id) {
diff --git a/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch b/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch
deleted file mode 100644
index c48a144d3d..0000000000
--- a/target/linux/generic/pending-5.4/411-mtd-partial_eraseblock_write.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: mtd: implement write support for partitions covering only a part of an eraseblock (buffer data that would otherwise be erased)
-
-lede-commit: 87a8e8ac1067f58ba831c4aae443f3655c31cd80
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/mtd/mtdpart.c | 90 ++++++++++++++++++++++++++++++++++++++++++++-----
- include/linux/mtd/mtd.h | 4 +++
- 2 files changed, 85 insertions(+), 9 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -22,6 +22,8 @@
- #include "mtdcore.h"
- #include "mtdsplit/mtdsplit.h"
-
-+#define MTD_ERASE_PARTIAL 0x8000 /* partition only covers parts of an erase block */
-+
- /* Our partition linked list */
- static LIST_HEAD(mtd_partitions);
- static DEFINE_MUTEX(mtd_partitions_mutex);
-@@ -206,11 +208,77 @@ static int part_erase(struct mtd_info *m
- {
- struct mtd_part *part = mtd_to_part(mtd);
- int ret;
-+ size_t wrlen = 0;
-+ u8 *erase_buf = NULL;
-+ u32 erase_buf_ofs = 0;
-+ bool partial_start = false;
-+
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ size_t readlen = 0;
-+ u64 mtd_ofs;
-+
-+ erase_buf = kmalloc(part->parent->erasesize, GFP_ATOMIC);
-+ if (!erase_buf)
-+ return -ENOMEM;
-+
-+ mtd_ofs = part->offset + instr->addr;
-+ erase_buf_ofs = do_div(mtd_ofs, part->parent->erasesize);
-+
-+ if (erase_buf_ofs > 0) {
-+ instr->addr -= erase_buf_ofs;
-+ ret = mtd_read(part->parent,
-+ instr->addr + part->offset,
-+ part->parent->erasesize,
-+ &readlen, erase_buf);
-+
-+ instr->len += erase_buf_ofs;
-+ partial_start = true;
-+ } else {
-+ mtd_ofs = part->offset + part->mtd.size;
-+ erase_buf_ofs = part->parent->erasesize -
-+ do_div(mtd_ofs, part->parent->erasesize);
-+
-+ if (erase_buf_ofs > 0) {
-+ instr->len += erase_buf_ofs;
-+ ret = mtd_read(part->parent,
-+ part->offset + instr->addr +
-+ instr->len - part->parent->erasesize,
-+ part->parent->erasesize, &readlen,
-+ erase_buf);
-+ } else {
-+ ret = 0;
-+ }
-+ }
-+ if (ret < 0) {
-+ kfree(erase_buf);
-+ return ret;
-+ }
-+
-+ }
-
- instr->addr += part->offset;
- ret = part->parent->_erase(part->parent, instr);
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
-+
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ if (partial_start) {
-+ part->parent->_write(part->parent,
-+ instr->addr, erase_buf_ofs,
-+ &wrlen, erase_buf);
-+ instr->addr += erase_buf_ofs;
-+ } else {
-+ instr->len -= erase_buf_ofs;
-+ part->parent->_write(part->parent,
-+ instr->addr + instr->len,
-+ erase_buf_ofs, &wrlen,
-+ erase_buf +
-+ part->parent->erasesize -
-+ erase_buf_ofs);
-+ }
-+ kfree(erase_buf);
-+ }
-+
- instr->addr -= part->offset;
-
- return ret;
-@@ -525,19 +593,22 @@ static struct mtd_part *allocate_partiti
- remainder = do_div(tmp, wr_alignment);
- if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
- /* Doesn't start on a boundary of major erase size */
-- /* FIXME: Let it be writable if it is on a boundary of
-- * _minor_ erase size though */
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
-- part->name);
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+ if (((u32)slave->mtd.size) > parent->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
- }
-
- tmp = part_absolute_offset(parent) + slave->offset + slave->mtd.size;
- remainder = do_div(tmp, wr_alignment);
- if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
-- slave->mtd.flags &= ~MTD_WRITEABLE;
-- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
-- part->name);
-+ slave->mtd.flags |= MTD_ERASE_PARTIAL;
-+
-+ if ((u32)slave->mtd.size > parent->erasesize)
-+ slave->mtd.flags &= ~MTD_WRITEABLE;
-+ else
-+ slave->mtd.erasesize = slave->mtd.size;
- }
-
- mtd_set_ooblayout(&slave->mtd, &part_ooblayout_ops);
diff --git a/target/linux/generic/pending-5.4/412-mtd-partial_eraseblock_unlock.patch b/target/linux/generic/pending-5.4/412-mtd-partial_eraseblock_unlock.patch
deleted file mode 100644
index b23bc1b201..0000000000
--- a/target/linux/generic/pending-5.4/412-mtd-partial_eraseblock_unlock.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Tim Harvey <tharvey@gateworks.com>
-Subject: mtd: allow partial block unlock
-
-This allows sysupgrade for devices such as the Gateworks Avila/Cambria
-product families based on the ixp4xx using the redboot bootloader with
-combined FIS directory and RedBoot config partitions on larger FLASH
-devices with larger eraseblocks.
-
-This second iteration of this patch addresses previous issues:
-- whitespace breakage fixed
-- unlock in all scenarios
-- simplification and fix logic bug
-
-[john@phrozen.org: this should be moved to the ixp4xx folder]
-
-Signed-off-by: Tim Harvey <tharvey@gateworks.com>
----
- drivers/mtd/mtdpart.c | 11 ++++++++++-
- 1 file changed, 10 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -293,7 +293,16 @@ static int part_lock(struct mtd_info *mt
- static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
- struct mtd_part *part = mtd_to_part(mtd);
-- return part->parent->_unlock(part->parent, ofs + part->offset, len);
-+
-+ ofs += part->offset;
-+
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ /* round up len to next erasesize and round down offset to prev block */
-+ len = (mtd_div_by_eb(len, part->parent) + 1) * part->parent->erasesize;
-+ ofs &= ~(part->parent->erasesize - 1);
-+ }
-+
-+ return part->parent->_unlock(part->parent, ofs, len);
- }
-
- static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
diff --git a/target/linux/generic/pending-5.4/419-mtd-redboot-add-of_match_table-with-DT-binding.patch b/target/linux/generic/pending-5.4/419-mtd-redboot-add-of_match_table-with-DT-binding.patch
deleted file mode 100644
index 7692f484ae..0000000000
--- a/target/linux/generic/pending-5.4/419-mtd-redboot-add-of_match_table-with-DT-binding.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Subject: [PATCH] mtd: redboot: add of_match_table with DT binding
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This allows parsing RedBoot compatible partitions for properly described
-flash device in DT.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
----
-
---- a/drivers/mtd/parsers/redboot.c
-+++ b/drivers/mtd/parsers/redboot.c
-@@ -305,6 +305,7 @@ static int parse_redboot_partitions(stru
-
- static const struct of_device_id mtd_parser_redboot_of_match_table[] = {
- { .compatible = "redboot-fis" },
-+ { .compatible = "ecoscentric,redboot-fis-partitions" },
- {},
- };
- MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table);
diff --git a/target/linux/generic/pending-5.4/420-mtd-redboot_space.patch b/target/linux/generic/pending-5.4/420-mtd-redboot_space.patch
deleted file mode 100644
index a3cd4ecf1f..0000000000
--- a/target/linux/generic/pending-5.4/420-mtd-redboot_space.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable)
-
-[john@phrozen.org: used by ixp and others]
-
-lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/mtd/redboot.c | 19 +++++++++++++------
- 1 file changed, 13 insertions(+), 6 deletions(-)
-
---- a/drivers/mtd/parsers/redboot.c
-+++ b/drivers/mtd/parsers/redboot.c
-@@ -279,14 +279,21 @@ static int parse_redboot_partitions(stru
- #endif
- names += strlen(names)+1;
-
--#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
-- i++;
-- parts[i].offset = parts[i-1].size + parts[i-1].offset;
-- parts[i].size = fl->next->img->flash_base - parts[i].offset;
-- parts[i].name = nullname;
-- }
-+ if (!strcmp(parts[i].name, "rootfs")) {
-+ parts[i].size = fl->next->img->flash_base;
-+ parts[i].size &= ~(master->erasesize - 1);
-+ parts[i].size -= parts[i].offset;
-+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
-+ nrparts--;
-+ } else {
-+ i++;
-+ parts[i].offset = parts[i-1].size + parts[i-1].offset;
-+ parts[i].size = fl->next->img->flash_base - parts[i].offset;
-+ parts[i].name = nullname;
- #endif
-+ }
-+ }
- tmp_fl = fl;
- fl = fl->next;
- kfree(tmp_fl);
diff --git a/target/linux/generic/pending-5.4/430-mtd-add-myloader-partition-parser.patch b/target/linux/generic/pending-5.4/430-mtd-add-myloader-partition-parser.patch
deleted file mode 100644
index 3319ed94c2..0000000000
--- a/target/linux/generic/pending-5.4/430-mtd-add-myloader-partition-parser.patch
+++ /dev/null
@@ -1,229 +0,0 @@
-From: Florian Fainelli <f.fainelli@gmail.com>
-Subject: Add myloader partition table parser
-
-[john@phozen.org: shoud be upstreamable]
-
-lede-commit: d8bf22859b51faa09d22c056fe221a45d2f7a3b8
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-[adjust for kernel 5.4, add myloader.c to patch]
-Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
-
---- a/drivers/mtd/parsers/Kconfig
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -57,6 +57,22 @@ config MTD_CMDLINE_PARTS
-
- If unsure, say 'N'.
-
-+config MTD_MYLOADER_PARTS
-+ tristate "MyLoader partition parsing"
-+ depends on ADM5120 || ATH25 || ATH79
-+ ---help---
-+ MyLoader is a bootloader which allows the user to define partitions
-+ in flash devices, by putting a table in the second erase block
-+ on the device, similar to a partition table. This table gives the
-+ offsets and lengths of the user defined partitions.
-+
-+ If you need code which can detect and parse these tables, and
-+ register MTD 'partitions' corresponding to each image detected,
-+ enable this option.
-+
-+ You will still need the parsing functions to be called by the driver
-+ for your particular device. It won't happen automatically.
-+
- config MTD_OF_PARTS
- tristate "OpenFirmware (device tree) partitioning parser"
- default y
---- a/drivers/mtd/parsers/Makefile
-+++ b/drivers/mtd/parsers/Makefile
-@@ -3,6 +3,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.
- obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
- obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
- obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
-+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
- ofpart-y += ofpart_core.o
- ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o
---- /dev/null
-+++ b/drivers/mtd/parsers/myloader.c
-@@ -0,0 +1,181 @@
-+/*
-+ * Parse MyLoader-style flash partition tables and produce a Linux partition
-+ * array to match.
-+ *
-+ * Copyright (C) 2007-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ * This file was based on drivers/mtd/redboot.c
-+ * Author: Red Hat, Inc. - David Woodhouse <dwmw2@cambridge.redhat.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/vmalloc.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/byteorder/generic.h>
-+#include <linux/myloader.h>
-+
-+#define BLOCK_LEN_MIN 0x10000
-+#define PART_NAME_LEN 32
-+
-+struct part_data {
-+ struct mylo_partition_table tab;
-+ char names[MYLO_MAX_PARTITIONS][PART_NAME_LEN];
-+};
-+
-+static int myloader_parse_partitions(struct mtd_info *master,
-+ const struct mtd_partition **pparts,
-+ struct mtd_part_parser_data *data)
-+{
-+ struct part_data *buf;
-+ struct mylo_partition_table *tab;
-+ struct mylo_partition *part;
-+ struct mtd_partition *mtd_parts;
-+ struct mtd_partition *mtd_part;
-+ int num_parts;
-+ int ret, i;
-+ size_t retlen;
-+ char *names;
-+ unsigned long offset;
-+ unsigned long blocklen;
-+
-+ buf = vmalloc(sizeof(*buf));
-+ if (!buf) {
-+ return -ENOMEM;
-+ goto out;
-+ }
-+ tab = &buf->tab;
-+
-+ blocklen = master->erasesize;
-+ if (blocklen < BLOCK_LEN_MIN)
-+ blocklen = BLOCK_LEN_MIN;
-+
-+ offset = blocklen;
-+
-+ /* Find the partition table */
-+ for (i = 0; i < 4; i++, offset += blocklen) {
-+ printk(KERN_DEBUG "%s: searching for MyLoader partition table"
-+ " at offset 0x%lx\n", master->name, offset);
-+
-+ ret = mtd_read(master, offset, sizeof(*buf), &retlen,
-+ (void *)buf);
-+ if (ret)
-+ goto out_free_buf;
-+
-+ if (retlen != sizeof(*buf)) {
-+ ret = -EIO;
-+ goto out_free_buf;
-+ }
-+
-+ /* Check for Partition Table magic number */
-+ if (tab->magic == le32_to_cpu(MYLO_MAGIC_PARTITIONS))
-+ break;
-+
-+ }
-+
-+ if (tab->magic != le32_to_cpu(MYLO_MAGIC_PARTITIONS)) {
-+ printk(KERN_DEBUG "%s: no MyLoader partition table found\n",
-+ master->name);
-+ ret = 0;
-+ goto out_free_buf;
-+ }
-+
-+ /* The MyLoader and the Partition Table is always present */
-+ num_parts = 2;
-+
-+ /* Detect number of used partitions */
-+ for (i = 0; i < MYLO_MAX_PARTITIONS; i++) {
-+ part = &tab->partitions[i];
-+
-+ if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)
-+ continue;
-+
-+ num_parts++;
-+ }
-+
-+ mtd_parts = kzalloc((num_parts * sizeof(*mtd_part) +
-+ num_parts * PART_NAME_LEN), GFP_KERNEL);
-+
-+ if (!mtd_parts) {
-+ ret = -ENOMEM;
-+ goto out_free_buf;
-+ }
-+
-+ mtd_part = mtd_parts;
-+ names = (char *)&mtd_parts[num_parts];
-+
-+ strncpy(names, "myloader", PART_NAME_LEN);
-+ mtd_part->name = names;
-+ mtd_part->offset = 0;
-+ mtd_part->size = offset;
-+ mtd_part->mask_flags = MTD_WRITEABLE;
-+ mtd_part++;
-+ names += PART_NAME_LEN;
-+
-+ strncpy(names, "partition_table", PART_NAME_LEN);
-+ mtd_part->name = names;
-+ mtd_part->offset = offset;
-+ mtd_part->size = blocklen;
-+ mtd_part->mask_flags = MTD_WRITEABLE;
-+ mtd_part++;
-+ names += PART_NAME_LEN;
-+
-+ for (i = 0; i < MYLO_MAX_PARTITIONS; i++) {
-+ part = &tab->partitions[i];
-+
-+ if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)
-+ continue;
-+
-+ if ((buf->names[i][0]) && (buf->names[i][0] != '\xff'))
-+ strncpy(names, buf->names[i], PART_NAME_LEN);
-+ else
-+ snprintf(names, PART_NAME_LEN, "partition%d", i);
-+
-+ mtd_part->offset = le32_to_cpu(part->addr);
-+ mtd_part->size = le32_to_cpu(part->size);
-+ mtd_part->name = names;
-+ mtd_part++;
-+ names += PART_NAME_LEN;
-+ }
-+
-+ *pparts = mtd_parts;
-+ ret = num_parts;
-+
-+ out_free_buf:
-+ vfree(buf);
-+ out:
-+ return ret;
-+}
-+
-+static struct mtd_part_parser myloader_mtd_parser = {
-+ .owner = THIS_MODULE,
-+ .parse_fn = myloader_parse_partitions,
-+ .name = "MyLoader",
-+};
-+
-+static int __init myloader_mtd_parser_init(void)
-+{
-+ register_mtd_parser(&myloader_mtd_parser);
-+
-+ return 0;
-+}
-+
-+static void __exit myloader_mtd_parser_exit(void)
-+{
-+ deregister_mtd_parser(&myloader_mtd_parser);
-+}
-+
-+module_init(myloader_mtd_parser_init);
-+module_exit(myloader_mtd_parser_exit);
-+
-+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
-+MODULE_DESCRIPTION("Parsing code for MyLoader partition tables");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/generic/pending-5.4/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/pending-5.4/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
deleted file mode 100644
index 2ea59cd872..0000000000
--- a/target/linux/generic/pending-5.4/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating offsets
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
-
---- a/drivers/mtd/parsers/parser_trx.c
-+++ b/drivers/mtd/parsers/parser_trx.c
-@@ -25,6 +25,33 @@ struct trx_header {
- uint32_t offset[3];
- } __packed;
-
-+/*
-+ * Calculate real end offset (address) for a given amount of data. It checks
-+ * all blocks skipping bad ones.
-+ */
-+static size_t parser_trx_real_offset(struct mtd_info *mtd, size_t bytes)
-+{
-+ size_t real_offset = 0;
-+
-+ if (mtd_block_isbad(mtd, real_offset))
-+ pr_warn("Base offset shouldn't be at bad block");
-+
-+ while (bytes >= mtd->erasesize) {
-+ bytes -= mtd->erasesize;
-+ real_offset += mtd->erasesize;
-+ while (mtd_block_isbad(mtd, real_offset)) {
-+ real_offset += mtd->erasesize;
-+
-+ if (real_offset >= mtd->size)
-+ return real_offset - mtd->erasesize;
-+ }
-+ }
-+
-+ real_offset += bytes;
-+
-+ return real_offset;
-+}
-+
- static const char *parser_trx_data_part_name(struct mtd_info *master,
- size_t offset)
- {
-@@ -79,21 +106,21 @@ static int parser_trx_parse(struct mtd_i
- if (trx.offset[2]) {
- part = &parts[curr_part++];
- part->name = "loader";
-- part->offset = trx.offset[i];
-+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
- i++;
- }
-
- if (trx.offset[i]) {
- part = &parts[curr_part++];
- part->name = "linux";
-- part->offset = trx.offset[i];
-+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
- i++;
- }
-
- if (trx.offset[i]) {
- part = &parts[curr_part++];
-- part->name = parser_trx_data_part_name(mtd, trx.offset[i]);
-- part->offset = trx.offset[i];
-+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
-+ part->name = parser_trx_data_part_name(mtd, part->offset);
- i++;
- }
-
diff --git a/target/linux/generic/pending-5.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/pending-5.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
deleted file mode 100644
index 852654d924..0000000000
--- a/target/linux/generic/pending-5.4/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Subject: mtd: bcm47xxpart: detect T_Meter partition
-
-It can be found on many Netgear devices. It consists of many 0x30 blocks
-starting with 4D 54.
-
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/mtd/parsers/bcm47xxpart.c
-+++ b/drivers/mtd/parsers/bcm47xxpart.c
-@@ -35,6 +35,7 @@
- #define NVRAM_HEADER 0x48534C46 /* FLSH */
- #define POT_MAGIC1 0x54544f50 /* POTT */
- #define POT_MAGIC2 0x504f /* OP */
-+#define T_METER_MAGIC 0x4D540000 /* MT */
- #define ML_MAGIC1 0x39685a42
- #define ML_MAGIC2 0x26594131
- #define TRX_MAGIC 0x30524448
-@@ -178,6 +179,15 @@ static int bcm47xxpart_parse(struct mtd_
- MTD_WRITEABLE);
- continue;
- }
-+
-+ /* T_Meter */
-+ if ((le32_to_cpu(buf[0x000 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&
-+ (le32_to_cpu(buf[0x030 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&
-+ (le32_to_cpu(buf[0x060 / 4]) & 0xFFFF0000) == T_METER_MAGIC) {
-+ bcm47xxpart_add_part(&parts[curr_part++], "T_Meter", offset,
-+ MTD_WRITEABLE);
-+ continue;
-+ }
-
- /* TRX */
- if (buf[0x000 / 4] == TRX_MAGIC) {
diff --git a/target/linux/generic/pending-5.4/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-5.4/435-mtd-add-routerbootpart-parser-config.patch
deleted file mode 100644
index ab1e09a5f1..0000000000
--- a/target/linux/generic/pending-5.4/435-mtd-add-routerbootpart-parser-config.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>
-Date: Tue, 24 Mar 2020 11:45:07 +0100
-Subject: [PATCH] generic: routerboot partition build bits (5.4)
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds routerbootpart kernel build bits
-
-Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
----
- drivers/mtd/parsers/Kconfig | 9 +++++++++
- drivers/mtd/parsers/Makefile | 1 +
- 2 files changed, 10 insertions(+)
-
---- a/drivers/mtd/parsers/Kconfig
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -195,3 +195,12 @@ config MTD_REDBOOT_PARTS_READONLY
- 'FIS directory' images, enable this option.
-
- endif # MTD_REDBOOT_PARTS
-+
-+config MTD_ROUTERBOOT_PARTS
-+ tristate "RouterBoot flash partition parser"
-+ depends on MTD && OF
-+ help
-+ MikroTik RouterBoot is implemented as a multi segment system on the
-+ flash, some of which are fixed and some of which are located at
-+ variable offsets. This parser handles both cases via properly
-+ formatted DTS.
---- a/drivers/mtd/parsers/Makefile
-+++ b/drivers/mtd/parsers/Makefile
-@@ -13,3 +13,4 @@ obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
- obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o
- obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
-+obj-$(CONFIG_MTD_ROUTERBOOT_PARTS) += routerbootpart.o
diff --git a/target/linux/generic/pending-5.4/447-mtd-spinand-gigadevice-Add-support-for-GD5F4GQ4xC.patch b/target/linux/generic/pending-5.4/447-mtd-spinand-gigadevice-Add-support-for-GD5F4GQ4xC.patch
deleted file mode 100644
index e1fcb15d5a..0000000000
--- a/target/linux/generic/pending-5.4/447-mtd-spinand-gigadevice-Add-support-for-GD5F4GQ4xC.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From 30521ccfb4597f91b9e5c7967acef9c7c85e58a8 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Wed, 12 Aug 2020 22:50:26 +0200
-Subject: [PATCH v2 447/447] mtd: spinand: gigadevice: Add support for
- GD5F4GQ4xC
-
-This adds support for the following 4GiB chips:
-GD5F4GQ4RCYIG 1.8V
-GD5F4GQ4UCYIG 3.3V
-
-The datasheet can be found here:
-https://www.novitronic.ch/sixcms/media.php/2/DS-00173-GD5F4GQ4xCxIG-Rev1.574695.pdf
-
-The GD5F4GQ4UCYIGT (3.3V) version is used on the Imagination
-Technologies Creator Ci40 (Marduk), the 1.8V version was not tested.
-
-This device only works in single SPI mode and not in dual or quad mode
-for me on this board.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/mtd/nand/spi/gigadevice.c | 49 +++++++++++++++++++++++++++++++
- 1 file changed, 49 insertions(+)
-
---- a/drivers/mtd/nand/spi/gigadevice.c
-+++ b/drivers/mtd/nand/spi/gigadevice.c
-@@ -132,6 +132,35 @@ static const struct mtd_ooblayout_ops gd
- .free = gd5fxgq4_variant2_ooblayout_free,
- };
-
-+static int gd5fxgq4xc_ooblayout_256_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *oobregion)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ oobregion->offset = 128;
-+ oobregion->length = 128;
-+
-+ return 0;
-+}
-+
-+static int gd5fxgq4xc_ooblayout_256_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *oobregion)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ oobregion->offset = 1;
-+ oobregion->length = 127;
-+
-+ return 0;
-+}
-+
-+static const struct mtd_ooblayout_ops gd5fxgq4xc_oob_256_ops = {
-+ .ecc = gd5fxgq4xc_ooblayout_256_ecc,
-+ .free = gd5fxgq4xc_ooblayout_256_free,
-+};
-+
- static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
- u8 status)
- {
-@@ -222,6 +251,24 @@ static const struct spinand_info gigadev
- SPINAND_HAS_QE_BIT,
- SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
- gd5fxgq4xa_ecc_get_status)),
-+ SPINAND_INFO("GD5F4GQ4RC", 0xa468,
-+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops,
-+ gd5fxgq4ufxxg_ecc_get_status)),
-+ SPINAND_INFO("GD5F4GQ4UC", 0xb468,
-+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops,
-+ gd5fxgq4ufxxg_ecc_get_status)),
- SPINAND_INFO("GD5F1GQ4UExxG", 0xd1,
- NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
- NAND_ECCREQ(8, 512),
diff --git a/target/linux/generic/pending-5.4/450-mtd-spi-nor-allow-NOR-driver-to-write-fewer-bytes-th.patch b/target/linux/generic/pending-5.4/450-mtd-spi-nor-allow-NOR-driver-to-write-fewer-bytes-th.patch
deleted file mode 100644
index fe2d7a6b23..0000000000
--- a/target/linux/generic/pending-5.4/450-mtd-spi-nor-allow-NOR-driver-to-write-fewer-bytes-th.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 22 Feb 2018 11:11:57 +0100
-Subject: [PATCH] mtd: spi-nor: allow NOR driver to write fewer bytes than
- requested
-
-The write size can be constrained by the maximum message/transfer size
-of the SPI controller. Only check for ret = 0 to avoid an infinite loop.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2706,7 +2706,7 @@ static int spi_nor_write(struct mtd_info
-
- write_enable(nor);
- ret = spi_nor_write_data(nor, addr, page_remain, buf + i);
-- if (ret < 0)
-+ if (ret <= 0)
- goto write_err;
- written = ret;
-
diff --git a/target/linux/generic/pending-5.4/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-5.4/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch
deleted file mode 100644
index 9983971af5..0000000000
--- a/target/linux/generic/pending-5.4/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: disable cfi cmdset 0002 erase suspend
-
-on some platforms, erase suspend leads to data corruption and lockups when write
-ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh.
-rather than play whack-a-mole with a hard to reproduce issue on a variety of devices,
-simply disable erase suspend, as it will usually not produce any useful gain on
-the small filesystems used on embedded hardware.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/mtd/chips/cfi_cmdset_0002.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -913,7 +913,7 @@ static int get_chip(struct map_info *map
- return 0;
-
- case FL_ERASING:
-- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
-+ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
- !(mode == FL_READY || mode == FL_POINT ||
- (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
- goto sleep;
diff --git a/target/linux/generic/pending-5.4/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-5.4/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch
deleted file mode 100644
index bedd53ccba..0000000000
--- a/target/linux/generic/pending-5.4/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-From: George Kashperko <george@znau.edu.ua>
-Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data.
-
-Signed-off-by: George Kashperko <george@znau.edu.ua>
----
- drivers/mtd/chips/cfi_cmdset_0002.c | 1 +
- 1 file changed, 1 insertion(+)
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -2058,6 +2058,7 @@ static int __xipram do_write_buffer(stru
-
- /* Write Buffer Load */
- map_write(map, CMD(0x25), cmd_adr);
-+ (void) map_read(map, cmd_adr);
-
- chip->state = FL_WRITING_TO_BUFFER;
-
diff --git a/target/linux/generic/pending-5.4/465-m25p80-mx-disable-software-protection.patch b/target/linux/generic/pending-5.4/465-m25p80-mx-disable-software-protection.patch
deleted file mode 100644
index 24d2d4567d..0000000000
--- a/target/linux/generic/pending-5.4/465-m25p80-mx-disable-software-protection.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: Disable software protection bits for Macronix flashes.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/mtd/spi-nor/spi-nor.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -4884,6 +4884,7 @@ int spi_nor_scan(struct spi_nor *nor, co
- */
- if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
- JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
-+ JEDEC_MFR(nor->info) == SNOR_MFR_MACRONIX ||
- JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
- nor->info->flags & SPI_NOR_HAS_LOCK)
- nor->clear_sr_bp = spi_nor_clear_sr_bp;
diff --git a/target/linux/generic/pending-5.4/466-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch b/target/linux/generic/pending-5.4/466-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch
deleted file mode 100644
index 70f1e9f059..0000000000
--- a/target/linux/generic/pending-5.4/466-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Matthias Schiffer <mschiffer@universe-factory.net>
-Date: Tue, 9 Jan 2018 20:41:48 +0100
-Subject: [PATCH] Revert "mtd: spi-nor: fix Spansion regressions (aliased with
- Winbond)"
-
-This reverts commit 67b9bcd36906e12a15ffec19463afbbd6a41660e.
-
-The underlying issue breaking Spansion flash has been fixed with "mtd: spi-nor:
-wait until lock/unlock operations are ready" and "mtd: spi-nor: wait for SR_WIP
-to clear on initial unlock", so we can support unlocking for Winbond flash
-again.
-
-Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
----
- drivers/mtd/spi-nor/spi-nor.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -4398,6 +4398,7 @@ static void st_micron_set_default_init(s
-
- static void winbond_set_default_init(struct spi_nor *nor)
- {
-+ nor->flags |= SNOR_F_HAS_LOCK;
- nor->params.set_4byte = winbond_set_4byte;
- }
-
-@@ -4886,6 +4887,7 @@ int spi_nor_scan(struct spi_nor *nor, co
- JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
- JEDEC_MFR(nor->info) == SNOR_MFR_MACRONIX ||
- JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
-+ JEDEC_MFR(nor->info) == SNOR_MFR_WINBOND ||
- nor->info->flags & SPI_NOR_HAS_LOCK)
- nor->clear_sr_bp = spi_nor_clear_sr_bp;
-
diff --git a/target/linux/generic/pending-5.4/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch b/target/linux/generic/pending-5.4/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch
deleted file mode 100644
index d3e587ff97..0000000000
--- a/target/linux/generic/pending-5.4/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 4 Nov 2017 07:40:23 +0100
-Subject: [PATCH] mtd: spi-nor: support limiting 4K sectors support based on
- flash size
-
-Some devices need 4K sectors to be able to deal with small flash chips.
-For instance, w25x05 is 64 KiB in size, and without 4K sectors, the
-entire chip is just one erase block.
-On bigger flash chip sizes, using 4K sectors can significantly slow down
-many operations, including using a writable filesystem. There are several
-platforms where it makes sense to use a single kernel on both kinds of
-devices.
-
-To support this properly, allow configuring an upper flash chip size
-limit for 4K sectors support.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/mtd/spi-nor/Kconfig
-+++ b/drivers/mtd/spi-nor/Kconfig
-@@ -34,6 +34,17 @@ config SPI_ASPEED_SMC
- and support for the SPI flash memory controller (SPI) for
- the host firmware. The implementation only supports SPI NOR.
-
-+config MTD_SPI_NOR_USE_4K_SECTORS_LIMIT
-+ int "Maximum flash chip size to use 4K sectors on (in KiB)"
-+ depends on MTD_SPI_NOR_USE_4K_SECTORS
-+ default "4096"
-+ help
-+ There are many flash chips that support 4K sectors, but are so large
-+ that using them significantly slows down writing large amounts of
-+ data or using a writable filesystem.
-+ Any flash chip larger than the size specified in this option will
-+ not use 4K sectors.
-+
- config SPI_CADENCE_QUADSPI
- tristate "Cadence Quad SPI controller"
- depends on OF && (ARM || ARM64 || COMPILE_TEST)
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -4464,6 +4464,7 @@ static void spi_nor_info_init_params(str
- struct spi_nor_erase_map *map = &params->erase_map;
- const struct flash_info *info = nor->info;
- struct device_node *np = spi_nor_get_flash_node(nor);
-+ struct mtd_info *mtd = &nor->mtd;
- u8 i, erase_mask;
-
- /* Initialize legacy flash parameters and settings. */
-@@ -4527,6 +4528,21 @@ static void spi_nor_info_init_params(str
- */
- erase_mask = 0;
- i = 0;
-+#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
-+ if ((info->flags & SECT_4K_PMC) && (mtd->size <=
-+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
-+ erase_mask |= BIT(i);
-+ spi_nor_set_erase_type(&map->erase_type[i], 4096u,
-+ SPINOR_OP_BE_4K_PMC);
-+ i++;
-+ } else if ((info->flags & SECT_4K) && (mtd->size <=
-+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
-+ erase_mask |= BIT(i);
-+ spi_nor_set_erase_type(&map->erase_type[i], 4096u,
-+ SPINOR_OP_BE_4K);
-+ i++;
-+ }
-+#else
- if (info->flags & SECT_4K_PMC) {
- erase_mask |= BIT(i);
- spi_nor_set_erase_type(&map->erase_type[i], 4096u,
-@@ -4538,6 +4554,7 @@ static void spi_nor_info_init_params(str
- SPINOR_OP_BE_4K);
- i++;
- }
-+#endif
- erase_mask |= BIT(i);
- spi_nor_set_erase_type(&map->erase_type[i], info->sector_size,
- SPINOR_OP_SE);
diff --git a/target/linux/generic/pending-5.4/476-mtd-spi-nor-add-eon-en25q128.patch b/target/linux/generic/pending-5.4/476-mtd-spi-nor-add-eon-en25q128.patch
deleted file mode 100644
index b62dae536b..0000000000
--- a/target/linux/generic/pending-5.4/476-mtd-spi-nor-add-eon-en25q128.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From: Piotr Dymacz <pepe2k@gmail.com>
-Subject: kernel/mtd: add support for EON EN25Q128
-
-Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2179,6 +2179,7 @@ static const struct flash_info spi_nor_i
- { "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) },
- { "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
- { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
-+ { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) },
- { "en25q80a", INFO(0x1c3014, 0, 64 * 1024, 16,
- SECT_4K | SPI_NOR_DUAL_READ) },
- { "en25qh32", INFO(0x1c7016, 0, 64 * 1024, 64, 0) },
diff --git a/target/linux/generic/pending-5.4/479-mtd-spi-nor-add-xtx-xt25f128b.patch b/target/linux/generic/pending-5.4/479-mtd-spi-nor-add-xtx-xt25f128b.patch
deleted file mode 100644
index 39e02604fe..0000000000
--- a/target/linux/generic/pending-5.4/479-mtd-spi-nor-add-xtx-xt25f128b.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From patchwork Thu Feb 6 17:19:41 2020
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
-X-Patchwork-Id: 1234465
-Date: Thu, 6 Feb 2020 19:19:41 +0200
-From: Daniel Golle <daniel@makrotopia.org>
-To: linux-mtd@lists.infradead.org
-Subject: [PATCH v2] mtd: spi-nor: Add support for xt25f128b chip
-Message-ID: <20200206171941.GA2398@makrotopia.org>
-MIME-Version: 1.0
-Content-Disposition: inline
-List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-mtd>,
- <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>
-Cc: Eitan Cohen <eitan@neot-semadar.com>, Piotr Dymacz <pepe2k@gmail.com>,
- Tudor Ambarus <tudor.ambarus@microchip.com>
-Sender: "linux-mtd" <linux-mtd-bounces@lists.infradead.org>
-Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org
-
-Add XT25F128B made by XTX Technology (Shenzhen) Limited.
-This chip supports dual and quad read and uniform 4K-byte erase.
-Verified on Teltonika RUT955 which comes with XT25F128B in recent
-versions of the device.
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- drivers/mtd/spi-nor/spi-nor.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2506,6 +2506,9 @@ static const struct flash_info spi_nor_i
- /* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */
- { "XM25QH64A", INFO(0x207017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-+
-+ /* XTX Technology (Shenzhen) Limited */
-+ { "xt25f128b", INFO(0x0B4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { },
- };
-
diff --git a/target/linux/generic/pending-5.4/480-mtd-set-rootfs-to-be-root-dev.patch b/target/linux/generic/pending-5.4/480-mtd-set-rootfs-to-be-root-dev.patch
deleted file mode 100644
index 95863d6edb..0000000000
--- a/target/linux/generic/pending-5.4/480-mtd-set-rootfs-to-be-root-dev.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: kernel/3.1[02]: move MTD root device setup code to mtdcore
-
-The current code only allows to automatically set
-root device on MTD partitions. Move the code to MTD
-core to allow to use it with all MTD devices.
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/mtdcore.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -27,6 +27,7 @@
- #include <linux/reboot.h>
- #include <linux/leds.h>
- #include <linux/debugfs.h>
-+#include <linux/root_dev.h>
- #include <linux/nvmem-provider.h>
-
- #include <linux/mtd/mtd.h>
-@@ -699,6 +700,15 @@ int add_mtd_device(struct mtd_info *mtd)
- of this try_ nonsense, and no bitching about it
- either. :) */
- __module_get(THIS_MODULE);
-+
-+ if (!strcmp(mtd->name, "rootfs") &&
-+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
-+ ROOT_DEV == 0) {
-+ pr_notice("mtd: device %d (%s) set to be root filesystem\n",
-+ mtd->index, mtd->name);
-+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
-+ }
-+
- return 0;
-
- fail_nvmem_add:
diff --git a/target/linux/generic/pending-5.4/481-mtd-spi-nor-rework-broken-flash-reset-support.patch b/target/linux/generic/pending-5.4/481-mtd-spi-nor-rework-broken-flash-reset-support.patch
deleted file mode 100644
index 81b4f190d4..0000000000
--- a/target/linux/generic/pending-5.4/481-mtd-spi-nor-rework-broken-flash-reset-support.patch
+++ /dev/null
@@ -1,167 +0,0 @@
-From ea92cbb50a78404e29de2cc3999a240615ffb1c8 Mon Sep 17 00:00:00 2001
-From: Chuanhong Guo <gch981213@gmail.com>
-Date: Mon, 6 Apr 2020 17:58:48 +0800
-Subject: [PATCH] mtd: spi-nor: rework broken-flash-reset support
-
-Instead of resetting flash to 3B address on remove hook, this
-implementation only enters 4B mode when needed, which prevents
-more unexpected reboot stuck. This implementation makes it only
-break when a kernel panic happens during flash operation on 16M+
-areas.
-*OpenWrt only*: silent broken-flash-reset warning. We are not dealing
-with vendors and it's unpleasant for users to se that unnecessary
-and long WARN_ON print.
-
-Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 52 +++++++++++++++++++++++++++++++++--
- 1 file changed, 49 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -616,6 +616,22 @@ static void spi_nor_set_4byte_opcodes(st
- }
- }
-
-+static int spi_nor_check_set_addr_width(struct spi_nor *nor, loff_t addr)
-+{
-+ u8 addr_width;
-+
-+ if ((nor->flags & (SNOR_F_4B_OPCODES | SNOR_F_BROKEN_RESET)) !=
-+ SNOR_F_BROKEN_RESET)
-+ return 0;
-+
-+ addr_width = addr & 0xff000000 ? 4 : 3;
-+ if (nor->addr_width == addr_width)
-+ return 0;
-+
-+ nor->addr_width = addr_width;
-+ return nor->params.set_4byte(nor, addr_width == 4);
-+}
-+
- static int macronix_set_4byte(struct spi_nor *nor, bool enable)
- {
- if (nor->spimem) {
-@@ -1261,6 +1277,10 @@ static int spi_nor_erase(struct mtd_info
- if (ret)
- return ret;
-
-+ ret = spi_nor_check_set_addr_width(nor, instr->addr + instr->len);
-+ if (ret < 0)
-+ return ret;
-+
- /* whole-chip erase? */
- if (len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) {
- unsigned long timeout;
-@@ -1317,6 +1337,7 @@ static int spi_nor_erase(struct mtd_info
- write_disable(nor);
-
- erase_err:
-+ spi_nor_check_set_addr_width(nor, 0);
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE);
-
- return ret;
-@@ -1623,7 +1644,9 @@ static int spi_nor_lock(struct mtd_info
- if (ret)
- return ret;
-
-+ spi_nor_check_set_addr_width(nor, ofs + len);
- ret = nor->params.locking_ops->lock(nor, ofs, len);
-+ spi_nor_check_set_addr_width(nor, 0);
-
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_UNLOCK);
- return ret;
-@@ -1638,7 +1661,9 @@ static int spi_nor_unlock(struct mtd_inf
- if (ret)
- return ret;
-
-+ spi_nor_check_set_addr_width(nor, ofs + len);
- ret = nor->params.locking_ops->unlock(nor, ofs, len);
-+ spi_nor_check_set_addr_width(nor, 0);
-
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK);
- return ret;
-@@ -1653,7 +1678,9 @@ static int spi_nor_is_locked(struct mtd_
- if (ret)
- return ret;
-
-+ spi_nor_check_set_addr_width(nor, ofs + len);
- ret = nor->params.locking_ops->is_locked(nor, ofs, len);
-+ spi_nor_check_set_addr_width(nor, 0);
-
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK);
- return ret;
-@@ -2559,6 +2586,10 @@ static int spi_nor_read(struct mtd_info
- if (ret)
- return ret;
-
-+ ret = spi_nor_check_set_addr_width(nor, from + len);
-+ if (ret < 0)
-+ return ret;
-+
- while (len) {
- loff_t addr = from;
-
-@@ -2582,6 +2613,7 @@ static int spi_nor_read(struct mtd_info
- ret = 0;
-
- read_err:
-+ spi_nor_check_set_addr_width(nor, 0);
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
- return ret;
- }
-@@ -2599,6 +2631,10 @@ static int sst_write(struct mtd_info *mt
- if (ret)
- return ret;
-
-+ ret = spi_nor_check_set_addr_width(nor, to + len);
-+ if (ret < 0)
-+ return ret;
-+
- write_enable(nor);
-
- nor->sst_write_second = false;
-@@ -2661,6 +2697,7 @@ static int sst_write(struct mtd_info *mt
- }
- sst_write_err:
- *retlen += actual;
-+ spi_nor_check_set_addr_width(nor, 0);
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE);
- return ret;
- }
-@@ -2683,6 +2720,10 @@ static int spi_nor_write(struct mtd_info
- if (ret)
- return ret;
-
-+ ret = spi_nor_check_set_addr_width(nor, to + len);
-+ if (ret < 0)
-+ return ret;
-+
- for (i = 0; i < len; ) {
- ssize_t written;
- loff_t addr = to + i;
-@@ -2722,6 +2763,7 @@ static int spi_nor_write(struct mtd_info
- }
-
- write_err:
-+ spi_nor_check_set_addr_width(nor, 0);
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE);
- return ret;
- }
-@@ -4726,9 +4768,13 @@ static int spi_nor_init(struct spi_nor *
- * reboots (e.g., crashes). Warn the user (or hopefully, system
- * designer) that this is bad.
- */
-- WARN_ONCE(nor->flags & SNOR_F_BROKEN_RESET,
-- "enabling reset hack; may not recover from unexpected reboots\n");
-- nor->params.set_4byte(nor, true);
-+ if (nor->flags & SNOR_F_BROKEN_RESET) {
-+ dev_warn(nor->dev,
-+ "enabling reset hack; may not recover from unexpected reboots\n");
-+ nor->addr_width = 3;
-+ } else {
-+ nor->params.set_4byte(nor, true);
-+ }
- }
-
- return 0;
diff --git a/target/linux/generic/pending-5.4/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch b/target/linux/generic/pending-5.4/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch
deleted file mode 100644
index 3a22133230..0000000000
--- a/target/linux/generic/pending-5.4/482-mtd-spi-nor-add-support-for-Gigadevice-GD25D05.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From d68b4aa22e8c625685bfad642dd7337948dc0ad1 Mon Sep 17 00:00:00 2001
-From: Koen Vandeputte <koen.vandeputte@ncentric.com>
-Date: Mon, 6 Jan 2020 13:07:56 +0100
-Subject: [PATCH] mtd: spi-nor: add support for Gigadevice GD25D05
-
-Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2232,6 +2232,11 @@ static const struct flash_info spi_nor_i
-
- /* GigaDevice */
- {
-+ "gd25d05", INFO(0xc84010, 0, 64 * 1024, 1,
-+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+ },
-+ {
- "gd25q16", INFO(0xc84015, 0, 64 * 1024, 32,
- SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
- SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
diff --git a/target/linux/generic/pending-5.4/482-mtd-spi-nor-fix-4-byte-opcode-support-for-w25q256.patch b/target/linux/generic/pending-5.4/482-mtd-spi-nor-fix-4-byte-opcode-support-for-w25q256.patch
deleted file mode 100644
index 63366e6032..0000000000
--- a/target/linux/generic/pending-5.4/482-mtd-spi-nor-fix-4-byte-opcode-support-for-w25q256.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Mantas Pucka <mantas@8devices.com>
-To: linux-mtd@lists.infradead.org
-Subject: [PATCH] mtd: spi-nor: fix 4-byte opcode support for w25q256
-Date: Wed, 15 Apr 2020 16:48:30 +0300
-Message-ID: <1586958510-24012-1-git-send-email-mantas@8devices.com>
-
-There are 2 different chips (w25q256fv and w25q256jv) that share
-the same JEDEC ID. Only w25q256jv fully supports 4-byte opcodes.
-Use SFDP header version to differentiate between them.
-
-for OpenWRT only: rebased to linux-v5.4
-
-Signed-off-by: Mantas Pucka <mantas@8devices.com>
----
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2172,6 +2172,32 @@ static struct spi_nor_fixups gd25q256_fi
- .default_init = gd25q256_default_init,
- };
-
-+static int
-+w25q256_post_bfpt_fixups(struct spi_nor *nor,
-+ const struct sfdp_parameter_header *bfpt_header,
-+ const struct sfdp_bfpt *bfpt,
-+ struct spi_nor_flash_parameter *params)
-+{
-+ /*
-+ * W25Q256JV supports 4B opcodes but W25Q256FV does not.
-+ * Unfortunately, Winbond has re-used the same JEDEC ID for both
-+ * variants which prevents us from defining a new entry in the parts
-+ * table.
-+ * To differentiate between W25Q256JV and W25Q256FV check SFDP header
-+ * version: only JV has JESD216A compliant structure (version 5)
-+ */
-+
-+ if (bfpt_header->major == SFDP_JESD216_MAJOR &&
-+ bfpt_header->minor == SFDP_JESD216A_MINOR)
-+ nor->flags |= SNOR_F_4B_OPCODES;
-+
-+ return 0;
-+}
-+
-+static struct spi_nor_fixups w25q256_fixups = {
-+ .post_bfpt = w25q256_post_bfpt_fixups,
-+};
-+
- /* NOTE: double check command sets and memory organization when you add
- * more nor chips. This current list focusses on newer chips, which
- * have been converging on command sets which including JEDEC ID.
-@@ -2515,7 +2541,8 @@ static const struct flash_info spi_nor_i
- { "w25q80", INFO(0xef5014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25q80bl", INFO(0xef4014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
-- { "w25q256", INFO(0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-+ { "w25q256", INFO(0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
-+ .fixups = &w25q256_fixups },
- { "w25q256jvm", INFO(0xef7019, 0, 64 * 1024, 512,
- SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "w25m512jv", INFO(0xef7119, 0, 64 * 1024, 1024,
diff --git a/target/linux/generic/pending-5.4/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch b/target/linux/generic/pending-5.4/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch
deleted file mode 100644
index 56cfc93c46..0000000000
--- a/target/linux/generic/pending-5.4/483-mtd-spinand-add-support-for-xtx-xt26g0xa.patch
+++ /dev/null
@@ -1,195 +0,0 @@
-From 8ffe91b6b429277bd7bd79267ba836edf951dce2 Mon Sep 17 00:00:00 2001
-From: Felix Matouschek <felix@matouschek.org>
-Date: Fri, 2 Jul 2021 20:31:23 +0200
-Subject: [PATCH] mtd: spinand: Add support for XTX XT26G0xA
-
-Add support for XTX Technology XT26G01AXXXXX, XTX26G02AXXXXX and
-XTX26G04AXXXXX SPI NAND.
-
-These are 3V, 1G/2G/4Gbit serial SLC NAND flash devices with on-die ECC
-(8bit strength per 512bytes).
-
-Tested on Teltonika RUTX10 flashed with OpenWrt.
-
-Datasheets available at
-http://www.xtxtech.com/download/?AId=225
-https://datasheet.lcsc.com/szlcsc/2005251034_XTX-XT26G01AWSEGA_C558841.pdf
-
-Signed-off-by: Felix Matouschek <felix@matouschek.org>
----
- drivers/mtd/nand/spi/Makefile | 2 +-
- drivers/mtd/nand/spi/core.c | 1 +
- drivers/mtd/nand/spi/xtx.c | 139 ++++++++++++++++++++++++++++++++++
- include/linux/mtd/spinand.h | 1 +
- 4 files changed, 142 insertions(+), 1 deletion(-)
- create mode 100644 drivers/mtd/nand/spi/xtx.c
-
---- a/drivers/mtd/nand/spi/Makefile
-+++ b/drivers/mtd/nand/spi/Makefile
-@@ -1,3 +1,3 @@
- # SPDX-License-Identifier: GPL-2.0
--spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o
-+spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o
- obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
---- a/drivers/mtd/nand/spi/core.c
-+++ b/drivers/mtd/nand/spi/core.c
-@@ -758,6 +758,7 @@ static const struct spinand_manufacturer
- &paragon_spinand_manufacturer,
- &toshiba_spinand_manufacturer,
- &winbond_spinand_manufacturer,
-+ &xtx_spinand_manufacturer,
- };
-
- static int spinand_manufacturer_detect(struct spinand_device *spinand)
---- /dev/null
-+++ b/drivers/mtd/nand/spi/xtx.c
-@@ -0,0 +1,139 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Author:
-+ * Felix Matouschek <felix@matouschek.org>
-+ */
-+
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/mtd/spinand.h>
-+
-+#define SPINAND_MFR_XTX 0x0B
-+
-+#define XT26G0XA_STATUS_ECC_MASK GENMASK(5, 2)
-+#define XT26G0XA_STATUS_ECC_NO_DETECTED (0 << 2)
-+#define XT26G0XA_STATUS_ECC_8_CORRECTED (3 << 4)
-+#define XT26G0XA_STATUS_ECC_UNCOR_ERROR (2 << 4)
-+
-+static SPINAND_OP_VARIANTS(read_cache_variants,
-+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(write_cache_variants,
-+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(update_cache_variants,
-+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
-+
-+static int xt26g0xa_ooblayout_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ region->offset = 8;
-+ region->length = 40;
-+
-+ return 0;
-+}
-+
-+static int xt26g0xa_ooblayout_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ region->offset = 1;
-+ region->length = 7;
-+
-+ return 0;
-+}
-+
-+static const struct mtd_ooblayout_ops xt26g0xa_ooblayout = {
-+ .ecc = xt26g0xa_ooblayout_ecc,
-+ .free = xt26g0xa_ooblayout_free,
-+};
-+
-+static int xt26g0xa_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ switch (status & XT26G0XA_STATUS_ECC_MASK) {
-+ case XT26G0XA_STATUS_ECC_NO_DETECTED:
-+ return 0;
-+ case XT26G0XA_STATUS_ECC_8_CORRECTED:
-+ return 8;
-+ case XT26G0XA_STATUS_ECC_UNCOR_ERROR:
-+ return -EBADMSG;
-+ default: /* (1 << 2) through (7 << 2) are 1-7 corrected errors */
-+ return (status & XT26G0XA_STATUS_ECC_MASK) >> 2;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static const struct spinand_info xtx_spinand_table[] = {
-+ SPINAND_INFO("XT26G01A", 0xE1,
-+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&xt26g0xa_ooblayout,
-+ xt26g0xa_ecc_get_status)),
-+ SPINAND_INFO("XT26G02A", 0xE2,
-+ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&xt26g0xa_ooblayout,
-+ xt26g0xa_ecc_get_status)),
-+ SPINAND_INFO("XT26G04A", 0xE3,
-+ NAND_MEMORG(1, 2048, 64, 128, 2048, 40, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&xt26g0xa_ooblayout,
-+ xt26g0xa_ecc_get_status)),
-+};
-+
-+static int xtx_spinand_detect(struct spinand_device *spinand)
-+{
-+ u8 *id = spinand->id.data;
-+ int ret;
-+
-+ /*
-+ * XTX SPI NAND read ID needs a dummy byte, so the first byte in
-+ * raw_id is garbage.
-+ */
-+ if (id[1] != SPINAND_MFR_XTX)
-+ return 0;
-+
-+ ret = spinand_match_and_init(spinand, xtx_spinand_table,
-+ ARRAY_SIZE(xtx_spinand_table),
-+ id[2]);
-+ if (ret)
-+ return ret;
-+
-+ return 1;
-+}
-+
-+static const struct spinand_manufacturer_ops xtx_spinand_manuf_ops = {
-+ .detect = xtx_spinand_detect,
-+};
-+
-+const struct spinand_manufacturer xtx_spinand_manufacturer = {
-+ .id = SPINAND_MFR_XTX,
-+ .name = "XTX",
-+ .ops = &xtx_spinand_manuf_ops,
-+};
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -230,6 +230,7 @@ extern const struct spinand_manufacturer
- extern const struct spinand_manufacturer paragon_spinand_manufacturer;
- extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
- extern const struct spinand_manufacturer winbond_spinand_manufacturer;
-+extern const struct spinand_manufacturer xtx_spinand_manufacturer;
-
- /**
- * struct spinand_op_variants - SPI NAND operation variants
diff --git a/target/linux/generic/pending-5.4/484-mtd-spi-nor-add-esmt-f25l16pa.patch b/target/linux/generic/pending-5.4/484-mtd-spi-nor-add-esmt-f25l16pa.patch
deleted file mode 100644
index 0a7d4f86d5..0000000000
--- a/target/linux/generic/pending-5.4/484-mtd-spi-nor-add-esmt-f25l16pa.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2243,6 +2243,7 @@ static const struct flash_info spi_nor_i
- { "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
-
- /* ESMT */
-+ { "f25l16pa-2s", INFO(0x8c2115, 0, 64 * 1024, 32, SECT_4K | SPI_NOR_HAS_LOCK) },
- { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) },
- { "f25l32qa", INFO(0x8c4116, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) },
- { "f25l64qa", INFO(0x8c4117, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_HAS_LOCK) },
diff --git a/target/linux/generic/pending-5.4/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-5.4/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
deleted file mode 100644
index b21daea4f0..0000000000
--- a/target/linux/generic/pending-5.4/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From: Daniel Golle <daniel@makrotopia.org>
-Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++
- 1 file changed, 36 insertions(+)
-
---- a/drivers/mtd/ubi/build.c
-+++ b/drivers/mtd/ubi/build.c
-@@ -1168,6 +1168,73 @@ static struct mtd_info * __init open_mtd
- return mtd;
- }
-
-+/*
-+ * This function tries attaching mtd partitions named either "ubi" or "data"
-+ * during boot.
-+ */
-+static void __init ubi_auto_attach(void)
-+{
-+ int err;
-+ struct mtd_info *mtd;
-+ loff_t offset = 0;
-+ size_t len;
-+ char magic[4];
-+
-+ /* try attaching mtd device named "ubi" or "data" */
-+ mtd = open_mtd_device("ubi");
-+ if (IS_ERR(mtd))
-+ mtd = open_mtd_device("data");
-+
-+ if (IS_ERR(mtd))
-+ return;
-+
-+ /* get the first not bad block */
-+ if (mtd_can_have_bb(mtd))
-+ while (mtd_block_isbad(mtd, offset)) {
-+ offset += mtd->erasesize;
-+
-+ if (offset > mtd->size) {
-+ pr_err("UBI error: Failed to find a non-bad "
-+ "block on mtd%d\n", mtd->index);
-+ goto cleanup;
-+ }
-+ }
-+
-+ /* check if the read from flash was successful */
-+ err = mtd_read(mtd, offset, 4, &len, (void *) magic);
-+ if ((err && !mtd_is_bitflip(err)) || len != 4) {
-+ pr_err("UBI error: unable to read from mtd%d\n", mtd->index);
-+ goto cleanup;
-+ }
-+
-+ /* check for a valid ubi magic */
-+ if (strncmp(magic, "UBI#", 4)) {
-+ pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
-+ goto cleanup;
-+ }
-+
-+ /* don't auto-add media types where UBI doesn't makes sense */
-+ if (mtd->type != MTD_NANDFLASH &&
-+ mtd->type != MTD_NORFLASH &&
-+ mtd->type != MTD_DATAFLASH &&
-+ mtd->type != MTD_MLCNANDFLASH)
-+ goto cleanup;
-+
-+ mutex_lock(&ubi_devices_mutex);
-+ pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
-+ err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
-+ mutex_unlock(&ubi_devices_mutex);
-+ if (err < 0) {
-+ pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
-+ goto cleanup;
-+ }
-+
-+ return;
-+
-+cleanup:
-+ put_mtd_device(mtd);
-+}
-+
- static int __init ubi_init(void)
- {
- int err, i, k;
-@@ -1251,6 +1318,12 @@ static int __init ubi_init(void)
- }
- }
-
-+ /* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd
-+ * parameter was given */
-+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
-+ !ubi_is_module() && !mtd_devs)
-+ ubi_auto_attach();
-+
- err = ubiblock_init();
- if (err) {
- pr_err("UBI error: block: cannot initialize, error %d\n", err);
diff --git a/target/linux/generic/pending-5.4/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-5.4/491-ubi-auto-create-ubiblock-device-for-rootfs.patch
deleted file mode 100644
index a2b48fd4fc..0000000000
--- a/target/linux/generic/pending-5.4/491-ubi-auto-create-ubiblock-device-for-rootfs.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Daniel Golle <daniel@makrotopia.org>
-Subject: ubi: auto-create ubiblock device for rootfs
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 42 insertions(+)
-
---- a/drivers/mtd/ubi/block.c
-+++ b/drivers/mtd/ubi/block.c
-@@ -652,6 +652,47 @@ static void __init ubiblock_create_from_
- }
- }
-
-+#define UBIFS_NODE_MAGIC 0x06101831
-+static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc)
-+{
-+ int ret;
-+ uint32_t magic_of, magic;
-+ ret = ubi_read(desc, 0, (char *)&magic_of, 0, 4);
-+ if (ret)
-+ return 0;
-+ magic = le32_to_cpu(magic_of);
-+ return magic == UBIFS_NODE_MAGIC;
-+}
-+
-+static void __init ubiblock_create_auto_rootfs(void)
-+{
-+ int ubi_num, ret, is_ubifs;
-+ struct ubi_volume_desc *desc;
-+ struct ubi_volume_info vi;
-+
-+ for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) {
-+ desc = ubi_open_volume_nm(ubi_num, "rootfs", UBI_READONLY);
-+ if (IS_ERR(desc))
-+ desc = ubi_open_volume_nm(ubi_num, "fit", UBI_READONLY);;
-+
-+ if (IS_ERR(desc))
-+ continue;
-+
-+ ubi_get_volume_info(desc, &vi);
-+ is_ubifs = ubi_vol_is_ubifs(desc);
-+ ubi_close_volume(desc);
-+ if (is_ubifs)
-+ break;
-+
-+ ret = ubiblock_create(&vi);
-+ if (ret)
-+ pr_err("UBI error: block: can't add '%s' volume, err=%d\n",
-+ vi.name, ret);
-+ /* always break if we get here */
-+ break;
-+ }
-+}
-+
- static void ubiblock_remove_all(void)
- {
- struct ubiblock *next;
-@@ -684,6 +725,10 @@ int __init ubiblock_init(void)
- */
- ubiblock_create_from_param();
-
-+ /* auto-attach "rootfs" volume if existing and non-ubifs */
-+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV))
-+ ubiblock_create_auto_rootfs();
-+
- /*
- * Block devices are only created upon user requests, so we ignore
- * existing volumes.
diff --git a/target/linux/generic/pending-5.4/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-5.4/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch
deleted file mode 100644
index e207c0d00d..0000000000
--- a/target/linux/generic/pending-5.4/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Daniel Golle <daniel@makrotopia.org>
-Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- init/do_mounts.c | 26 +++++++++++++++++++++++++-
- 1 file changed, 25 insertions(+), 1 deletion(-)
-
---- a/init/do_mounts.c
-+++ b/init/do_mounts.c
-@@ -460,7 +460,30 @@ retry:
- out:
- put_page(page);
- }
--
-+
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+static int __init mount_ubi_rootfs(void)
-+{
-+ int flags = MS_SILENT;
-+ int err, tried = 0;
-+
-+ while (tried < 2) {
-+ err = do_mount_root("ubi0:rootfs", "ubifs", flags, \
-+ root_mount_data);
-+ switch (err) {
-+ case -EACCES:
-+ flags |= MS_RDONLY;
-+ tried++;
-+ break;
-+ default:
-+ return err;
-+ }
-+ }
-+
-+ return -EINVAL;
-+}
-+#endif
-+
- #ifdef CONFIG_ROOT_NFS
-
- #define NFSROOT_TIMEOUT_MIN 5
-@@ -554,6 +577,10 @@ void __init mount_root(void)
- change_floppy("root floppy");
- }
- #endif
-+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
-+ if (!mount_ubi_rootfs())
-+ return;
-+#endif
- #ifdef CONFIG_BLOCK
- {
- int err = create_dev("/dev/root", ROOT_DEV);
diff --git a/target/linux/generic/pending-5.4/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-5.4/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch
deleted file mode 100644
index 2dff46807e..0000000000
--- a/target/linux/generic/pending-5.4/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From: Daniel Golle <daniel@makrotopia.org>
-Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- drivers/mtd/ubi/block.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/mtd/ubi/block.c
-+++ b/drivers/mtd/ubi/block.c
-@@ -42,6 +42,7 @@
- #include <linux/scatterlist.h>
- #include <linux/idr.h>
- #include <asm/div64.h>
-+#include <linux/root_dev.h>
-
- #include "ubi-media.h"
- #include "ubi.h"
-@@ -458,6 +459,15 @@ int ubiblock_create(struct ubi_volume_in
- dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)",
- dev->ubi_num, dev->vol_id, vi->name);
- mutex_unlock(&devices_mutex);
-+
-+ if (!strcmp(vi->name, "rootfs") &&
-+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
-+ ROOT_DEV == 0) {
-+ pr_notice("ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\n",
-+ dev->ubi_num, dev->vol_id, vi->name);
-+ ROOT_DEV = MKDEV(gd->major, gd->first_minor);
-+ }
-+
- return 0;
-
- out_free_queue:
diff --git a/target/linux/generic/pending-5.4/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-5.4/494-mtd-ubi-add-EOF-marker-support.patch
deleted file mode 100644
index fc48146221..0000000000
--- a/target/linux/generic/pending-5.4/494-mtd-ubi-add-EOF-marker-support.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: mtd: add EOF marker support to the UBI layer
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++---
- drivers/mtd/ubi/ubi.h | 1 +
- 2 files changed, 23 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/ubi/attach.c
-+++ b/drivers/mtd/ubi/attach.c
-@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id)
- #endif
- }
-
-+static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech)
-+{
-+ return ech->padding1[0] == 'E' &&
-+ ech->padding1[1] == 'O' &&
-+ ech->padding1[2] == 'F';
-+}
-+
- /**
- * scan_peb - scan and process UBI headers of a PEB.
- * @ubi: UBI device description object
-@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u
- return 0;
- }
-
-- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
-- if (err < 0)
-- return err;
-+ if (!ai->eof_found) {
-+ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
-+ if (err < 0)
-+ return err;
-+
-+ if (ec_hdr_has_eof(ech)) {
-+ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n",
-+ pnum);
-+ ai->eof_found = true;
-+ }
-+ }
-+
-+ if (ai->eof_found)
-+ err = UBI_IO_FF_BITFLIPS;
-+
- switch (err) {
- case 0:
- break;
---- a/drivers/mtd/ubi/ubi.h
-+++ b/drivers/mtd/ubi/ubi.h
-@@ -780,6 +780,7 @@ struct ubi_attach_info {
- int mean_ec;
- uint64_t ec_sum;
- int ec_count;
-+ bool eof_found;
- struct kmem_cache *aeb_slab_cache;
- struct ubi_ec_hdr *ech;
- struct ubi_vid_io_buf *vidb;
diff --git a/target/linux/generic/pending-5.4/495-mtd-core-add-get_mtd_device_by_node.patch b/target/linux/generic/pending-5.4/495-mtd-core-add-get_mtd_device_by_node.patch
deleted file mode 100644
index a173381820..0000000000
--- a/target/linux/generic/pending-5.4/495-mtd-core-add-get_mtd_device_by_node.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 1bd1b740f208d1cf4071932cc51860d37266c402 Mon Sep 17 00:00:00 2001
-From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
-Date: Sat, 1 Sep 2018 00:30:11 +0200
-Subject: [PATCH 495/497] mtd: core: add get_mtd_device_by_node
-
-Add function to retrieve a mtd device by its OF node. Since drivers can
-assign arbitrary names to mtd devices in the absence of a label
-property, there is no other reliable way to retrieve a mtd device for a
-given OF node.
-
-Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
-Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/mtdcore.c | 38 ++++++++++++++++++++++++++++++++++++++
- include/linux/mtd/mtd.h | 2 ++
- 2 files changed, 40 insertions(+)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -1053,6 +1053,44 @@ out_unlock:
- }
- EXPORT_SYMBOL_GPL(get_mtd_device_nm);
-
-+/**
-+ * get_mtd_device_by_node - obtain a validated handle for an MTD device
-+ * by of_node
-+ * @of_node: OF node of MTD device to open
-+ *
-+ * This function returns MTD device description structure in case of
-+ * success and an error code in case of failure.
-+ */
-+struct mtd_info *get_mtd_device_by_node(const struct device_node *of_node)
-+{
-+ int err = -ENODEV;
-+ struct mtd_info *mtd = NULL, *other;
-+
-+ mutex_lock(&mtd_table_mutex);
-+
-+ mtd_for_each_device(other) {
-+ if (of_node == other->dev.of_node) {
-+ mtd = other;
-+ break;
-+ }
-+ }
-+
-+ if (!mtd)
-+ goto out_unlock;
-+
-+ err = __get_mtd_device(mtd);
-+ if (err)
-+ goto out_unlock;
-+
-+ mutex_unlock(&mtd_table_mutex);
-+ return mtd;
-+
-+out_unlock:
-+ mutex_unlock(&mtd_table_mutex);
-+ return ERR_PTR(err);
-+}
-+EXPORT_SYMBOL_GPL(get_mtd_device_by_node);
-+
- void put_mtd_device(struct mtd_info *mtd)
- {
- mutex_lock(&mtd_table_mutex);
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -586,6 +586,8 @@ extern struct mtd_info *get_mtd_device(s
- extern int __get_mtd_device(struct mtd_info *mtd);
- extern void __put_mtd_device(struct mtd_info *mtd);
- extern struct mtd_info *get_mtd_device_nm(const char *name);
-+extern struct mtd_info *get_mtd_device_by_node(
-+ const struct device_node *of_node);
- extern void put_mtd_device(struct mtd_info *mtd);
-
-
diff --git a/target/linux/generic/pending-5.4/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch b/target/linux/generic/pending-5.4/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch
deleted file mode 100644
index 01f3b9ec2d..0000000000
--- a/target/linux/generic/pending-5.4/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 5734c6669fba7ddb5ef491ccff7159d15dba0b59 Mon Sep 17 00:00:00 2001
-From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
-Date: Wed, 5 Sep 2018 01:32:51 +0200
-Subject: [PATCH 496/497] dt-bindings: add bindings for mtd-concat devices
-
-Document virtual mtd-concat device bindings.
-
-Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
----
- .../devicetree/bindings/mtd/mtd-concat.txt | 36 +++++++++++++++++++
- 1 file changed, 36 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/mtd/mtd-concat.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/mtd/mtd-concat.txt
-@@ -0,0 +1,36 @@
-+Virtual MTD concat device
-+
-+Requires properties:
-+- devices: list of phandles to mtd nodes that should be concatenated
-+
-+Example:
-+
-+&spi {
-+ flash0: flash@0 {
-+ ...
-+ };
-+ flash1: flash@1 {
-+ ...
-+ };
-+};
-+
-+flash {
-+ compatible = "mtd-concat";
-+
-+ devices = <&flash0 &flash1>;
-+
-+ partitions {
-+ compatible = "fixed-partitions";
-+
-+ partition@0 {
-+ label = "boot";
-+ reg = <0x0000000 0x0040000>;
-+ read-only;
-+ };
-+
-+ partition@40000 {
-+ label = "firmware";
-+ reg = <0x0040000 0x1fc0000>;
-+ };
-+ }
-+}
diff --git a/target/linux/generic/pending-5.4/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-5.4/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch
deleted file mode 100644
index 1c42ed7bff..0000000000
--- a/target/linux/generic/pending-5.4/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch
+++ /dev/null
@@ -1,216 +0,0 @@
-From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001
-From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
-Date: Sat, 25 Aug 2018 12:35:22 +0200
-Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices
-
-Some mtd drivers like physmap variants have support for concatenating
-multiple mtd devices, but there is no generic way to define such a
-concat device from within the device tree.
-
-This is useful for some SoC boards that use multiple flash chips as
-memory banks of a single mtd device, with partitions spanning chip
-borders.
-
-This commit adds a driver for creating virtual mtd-concat devices. They
-must have a compatible = "mtd-concat" line, and define a list of devices
-to concat in the 'devices' property, for example:
-
-flash {
- compatible = "mtd-concat";
-
- devices = <&flash0 &flash1>;
-
- partitions {
- ...
- };
-};
-
-The driver is added to the very end of the mtd Makefile to increase the
-likelyhood of all child devices already being loaded at the time of
-probing, preventing unnecessary deferred probes.
-
-Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
----
- drivers/mtd/Kconfig | 2 +
- drivers/mtd/Makefile | 3 +
- drivers/mtd/composite/Kconfig | 12 +++
- drivers/mtd/composite/Makefile | 6 ++
- drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++
- 5 files changed, 151 insertions(+)
- create mode 100644 drivers/mtd/composite/Kconfig
- create mode 100644 drivers/mtd/composite/Makefile
- create mode 100644 drivers/mtd/composite/virt_concat.c
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -228,4 +228,6 @@ source "drivers/mtd/ubi/Kconfig"
-
- source "drivers/mtd/hyperbus/Kconfig"
-
-+source "drivers/mtd/composite/Kconfig"
-+
- endif # MTD
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -32,3 +32,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n
- obj-$(CONFIG_MTD_SPI_NOR) += spi-nor/
- obj-$(CONFIG_MTD_UBI) += ubi/
- obj-$(CONFIG_MTD_HYPERBUS) += hyperbus/
-+
-+# Composite drivers must be loaded last
-+obj-y += composite/
---- /dev/null
-+++ b/drivers/mtd/composite/Kconfig
-@@ -0,0 +1,12 @@
-+menu "Composite MTD device drivers"
-+ depends on MTD!=n
-+
-+config MTD_VIRT_CONCAT
-+ tristate "Virtual concat MTD device"
-+ help
-+ This driver allows creation of a virtual MTD concat device, which
-+ concatenates multiple underlying MTD devices to a single device.
-+ This is required by some SoC boards where multiple memory banks are
-+ used as one device with partitions spanning across device boundaries.
-+
-+endmenu
---- /dev/null
-+++ b/drivers/mtd/composite/Makefile
-@@ -0,0 +1,6 @@
-+# SPDX-License-Identifier: GPL-2.0
-+#
-+# linux/drivers/mtd/composite/Makefile
-+#
-+
-+obj-$(CONFIG_MTD_VIRT_CONCAT) += virt_concat.o
---- /dev/null
-+++ b/drivers/mtd/composite/virt_concat.c
-@@ -0,0 +1,128 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/*
-+ * Virtual concat MTD device driver
-+ *
-+ * Copyright (C) 2018 Bernhard Frauendienst
-+ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/mtd/concat.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
-+#include <linux/slab.h>
-+
-+/*
-+ * struct of_virt_concat - platform device driver data.
-+ * @cmtd the final mtd_concat device
-+ * @num_devices the number of devices in @devices
-+ * @devices points to an array of devices already loaded
-+ */
-+struct of_virt_concat {
-+ struct mtd_info *cmtd;
-+ int num_devices;
-+ struct mtd_info **devices;
-+};
-+
-+static int virt_concat_remove(struct platform_device *pdev)
-+{
-+ struct of_virt_concat *info;
-+ int i;
-+
-+ info = platform_get_drvdata(pdev);
-+ if (!info)
-+ return 0;
-+
-+ // unset data for when this is called after a probe error
-+ platform_set_drvdata(pdev, NULL);
-+
-+ if (info->cmtd) {
-+ mtd_device_unregister(info->cmtd);
-+ mtd_concat_destroy(info->cmtd);
-+ }
-+
-+ if (info->devices) {
-+ for (i = 0; i < info->num_devices; i++)
-+ put_mtd_device(info->devices[i]);
-+ }
-+
-+ return 0;
-+}
-+
-+static int virt_concat_probe(struct platform_device *pdev)
-+{
-+ struct device_node *node = pdev->dev.of_node;
-+ struct of_phandle_iterator it;
-+ struct of_virt_concat *info;
-+ struct mtd_info *mtd;
-+ int err = 0, count;
-+
-+ count = of_count_phandle_with_args(node, "devices", NULL);
-+ if (count <= 0)
-+ return -EINVAL;
-+
-+ info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
-+ if (!info)
-+ return -ENOMEM;
-+ info->devices = devm_kcalloc(&pdev->dev, count,
-+ sizeof(*(info->devices)), GFP_KERNEL);
-+ if (!info->devices) {
-+ err = -ENOMEM;
-+ goto err_remove;
-+ }
-+
-+ platform_set_drvdata(pdev, info);
-+
-+ of_for_each_phandle(&it, err, node, "devices", NULL, 0) {
-+ mtd = get_mtd_device_by_node(it.node);
-+ if (IS_ERR(mtd)) {
-+ of_node_put(it.node);
-+ err = -EPROBE_DEFER;
-+ goto err_remove;
-+ }
-+
-+ info->devices[info->num_devices++] = mtd;
-+ }
-+
-+ info->cmtd = mtd_concat_create(info->devices, info->num_devices,
-+ dev_name(&pdev->dev));
-+ if (!info->cmtd) {
-+ err = -ENXIO;
-+ goto err_remove;
-+ }
-+
-+ info->cmtd->dev.parent = &pdev->dev;
-+ mtd_set_of_node(info->cmtd, node);
-+ mtd_device_register(info->cmtd, NULL, 0);
-+
-+ return 0;
-+
-+err_remove:
-+ virt_concat_remove(pdev);
-+
-+ return err;
-+}
-+
-+static const struct of_device_id virt_concat_of_match[] = {
-+ { .compatible = "mtd-concat", },
-+ { /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, virt_concat_of_match);
-+
-+static struct platform_driver virt_concat_driver = {
-+ .probe = virt_concat_probe,
-+ .remove = virt_concat_remove,
-+ .driver = {
-+ .name = "virt-mtdconcat",
-+ .of_match_table = virt_concat_of_match,
-+ },
-+};
-+
-+module_platform_driver(virt_concat_driver);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_AUTHOR("Bernhard Frauendienst <kernel@nospam.obeliks.de>");
-+MODULE_DESCRIPTION("Virtual concat MTD device driver");
diff --git a/target/linux/generic/pending-5.4/498-mtd-mtdconcat-select-readwrite-function.patch b/target/linux/generic/pending-5.4/498-mtd-mtdconcat-select-readwrite-function.patch
deleted file mode 100644
index 129bbffd0f..0000000000
--- a/target/linux/generic/pending-5.4/498-mtd-mtdconcat-select-readwrite-function.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/drivers/mtd/mtdconcat.c
-+++ b/drivers/mtd/mtdconcat.c
-@@ -642,8 +642,12 @@ struct mtd_info *mtd_concat_create(struc
- concat->mtd._writev = concat_writev;
- if (subdev[0]->_read_oob)
- concat->mtd._read_oob = concat_read_oob;
-+ else
-+ concat->mtd._read = concat_read;
- if (subdev[0]->_write_oob)
- concat->mtd._write_oob = concat_write_oob;
-+ else
-+ concat->mtd._write = concat_write;
- if (subdev[0]->_block_isbad)
- concat->mtd._block_isbad = concat_block_isbad;
- if (subdev[0]->_block_markbad)
-@@ -701,8 +705,6 @@ struct mtd_info *mtd_concat_create(struc
- concat->mtd.name = name;
-
- concat->mtd._erase = concat_erase;
-- concat->mtd._read = concat_read;
-- concat->mtd._write = concat_write;
- concat->mtd._sync = concat_sync;
- concat->mtd._lock = concat_lock;
- concat->mtd._unlock = concat_unlock;
diff --git a/target/linux/generic/pending-5.4/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-5.4/530-jffs2_make_lzma_available.patch
deleted file mode 100644
index 8bd31d2e7e..0000000000
--- a/target/linux/generic/pending-5.4/530-jffs2_make_lzma_available.patch
+++ /dev/null
@@ -1,5180 +0,0 @@
-From: Alexandros C. Couloumbis <alex@ozo.com>
-Subject: fs: add jffs2/lzma support (not activated by default yet)
-
-lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2
-Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
----
- fs/jffs2/Kconfig | 9 +
- fs/jffs2/Makefile | 3 +
- fs/jffs2/compr.c | 6 +
- fs/jffs2/compr.h | 10 +-
- fs/jffs2/compr_lzma.c | 128 +++
- fs/jffs2/super.c | 33 +-
- include/linux/lzma.h | 62 ++
- include/linux/lzma/LzFind.h | 115 +++
- include/linux/lzma/LzHash.h | 54 +
- include/linux/lzma/LzmaDec.h | 231 +++++
- include/linux/lzma/LzmaEnc.h | 80 ++
- include/linux/lzma/Types.h | 226 +++++
- include/uapi/linux/jffs2.h | 1 +
- lib/Kconfig | 6 +
- lib/Makefile | 12 +
- lib/lzma/LzFind.c | 761 ++++++++++++++
- lib/lzma/LzmaDec.c | 999 +++++++++++++++++++
- lib/lzma/LzmaEnc.c | 2271 ++++++++++++++++++++++++++++++++++++++++++
- lib/lzma/Makefile | 7 +
- 19 files changed, 5008 insertions(+), 6 deletions(-)
- create mode 100644 fs/jffs2/compr_lzma.c
- create mode 100644 include/linux/lzma.h
- create mode 100644 include/linux/lzma/LzFind.h
- create mode 100644 include/linux/lzma/LzHash.h
- create mode 100644 include/linux/lzma/LzmaDec.h
- create mode 100644 include/linux/lzma/LzmaEnc.h
- create mode 100644 include/linux/lzma/Types.h
- create mode 100644 lib/lzma/LzFind.c
- create mode 100644 lib/lzma/LzmaDec.c
- create mode 100644 lib/lzma/LzmaEnc.c
- create mode 100644 lib/lzma/Makefile
-
---- a/fs/jffs2/Kconfig
-+++ b/fs/jffs2/Kconfig
-@@ -136,6 +136,15 @@ config JFFS2_LZO
- This feature was added in July, 2007. Say 'N' if you need
- compatibility with older bootloaders or kernels.
-
-+config JFFS2_LZMA
-+ bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS
-+ select LZMA_COMPRESS
-+ select LZMA_DECOMPRESS
-+ depends on JFFS2_FS
-+ default n
-+ help
-+ JFFS2 wrapper to the LZMA C SDK
-+
- config JFFS2_RTIME
- bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
- depends on JFFS2_FS
---- a/fs/jffs2/Makefile
-+++ b/fs/jffs2/Makefile
-@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rub
- jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o
- jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o
- jffs2-$(CONFIG_JFFS2_LZO) += compr_lzo.o
-+jffs2-$(CONFIG_JFFS2_LZMA) += compr_lzma.o
- jffs2-$(CONFIG_JFFS2_SUMMARY) += summary.o
-+
-+CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma
---- a/fs/jffs2/compr.c
-+++ b/fs/jffs2/compr.c
-@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void)
- #ifdef CONFIG_JFFS2_LZO
- jffs2_lzo_init();
- #endif
-+#ifdef CONFIG_JFFS2_LZMA
-+ jffs2_lzma_init();
-+#endif
- /* Setting default compression mode */
- #ifdef CONFIG_JFFS2_CMODE_NONE
- jffs2_compression_mode = JFFS2_COMPR_MODE_NONE;
-@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void)
- int jffs2_compressors_exit(void)
- {
- /* Unregistering compressors */
-+#ifdef CONFIG_JFFS2_LZMA
-+ jffs2_lzma_exit();
-+#endif
- #ifdef CONFIG_JFFS2_LZO
- jffs2_lzo_exit();
- #endif
---- a/fs/jffs2/compr.h
-+++ b/fs/jffs2/compr.h
-@@ -29,9 +29,9 @@
- #define JFFS2_DYNRUBIN_PRIORITY 20
- #define JFFS2_LZARI_PRIORITY 30
- #define JFFS2_RTIME_PRIORITY 50
--#define JFFS2_ZLIB_PRIORITY 60
--#define JFFS2_LZO_PRIORITY 80
--
-+#define JFFS2_LZMA_PRIORITY 70
-+#define JFFS2_ZLIB_PRIORITY 80
-+#define JFFS2_LZO_PRIORITY 90
-
- #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */
- #define JFFS2_DYNRUBIN_DISABLED /* for decompression */
-@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void);
- int jffs2_lzo_init(void);
- void jffs2_lzo_exit(void);
- #endif
-+#ifdef CONFIG_JFFS2_LZMA
-+int jffs2_lzma_init(void);
-+void jffs2_lzma_exit(void);
-+#endif
-
- #endif /* __JFFS2_COMPR_H__ */
---- /dev/null
-+++ b/fs/jffs2/compr_lzma.c
-@@ -0,0 +1,128 @@
-+/*
-+ * JFFS2 -- Journalling Flash File System, Version 2.
-+ *
-+ * For licensing information, see the file 'LICENCE' in this directory.
-+ *
-+ * JFFS2 wrapper to the LZMA C SDK
-+ *
-+ */
-+
-+#include <linux/lzma.h>
-+#include "compr.h"
-+
-+#ifdef __KERNEL__
-+ static DEFINE_MUTEX(deflate_mutex);
-+#endif
-+
-+CLzmaEncHandle *p;
-+Byte propsEncoded[LZMA_PROPS_SIZE];
-+SizeT propsSize = sizeof(propsEncoded);
-+
-+STATIC void lzma_free_workspace(void)
-+{
-+ LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc);
-+}
-+
-+STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props)
-+{
-+ if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL)
-+ {
-+ PRINT_ERROR("Failed to allocate lzma deflate workspace\n");
-+ return -ENOMEM;
-+ }
-+
-+ if (LzmaEnc_SetProps(p, props) != SZ_OK)
-+ {
-+ lzma_free_workspace();
-+ return -1;
-+ }
-+
-+ if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK)
-+ {
-+ lzma_free_workspace();
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out,
-+ uint32_t *sourcelen, uint32_t *dstlen)
-+{
-+ SizeT compress_size = (SizeT)(*dstlen);
-+ int ret;
-+
-+ #ifdef __KERNEL__
-+ mutex_lock(&deflate_mutex);
-+ #endif
-+
-+ ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen,
-+ 0, NULL, &lzma_alloc, &lzma_alloc);
-+
-+ #ifdef __KERNEL__
-+ mutex_unlock(&deflate_mutex);
-+ #endif
-+
-+ if (ret != SZ_OK)
-+ return -1;
-+
-+ *dstlen = (uint32_t)compress_size;
-+
-+ return 0;
-+}
-+
-+STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out,
-+ uint32_t srclen, uint32_t destlen)
-+{
-+ int ret;
-+ SizeT dl = (SizeT)destlen;
-+ SizeT sl = (SizeT)srclen;
-+ ELzmaStatus status;
-+
-+ ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded,
-+ propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc);
-+
-+ if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen)
-+ return -1;
-+
-+ return 0;
-+}
-+
-+static struct jffs2_compressor jffs2_lzma_comp = {
-+ .priority = JFFS2_LZMA_PRIORITY,
-+ .name = "lzma",
-+ .compr = JFFS2_COMPR_LZMA,
-+ .compress = &jffs2_lzma_compress,
-+ .decompress = &jffs2_lzma_decompress,
-+ .disabled = 0,
-+};
-+
-+int INIT jffs2_lzma_init(void)
-+{
-+ int ret;
-+ CLzmaEncProps props;
-+ LzmaEncProps_Init(&props);
-+
-+ props.dictSize = LZMA_BEST_DICT(0x2000);
-+ props.level = LZMA_BEST_LEVEL;
-+ props.lc = LZMA_BEST_LC;
-+ props.lp = LZMA_BEST_LP;
-+ props.pb = LZMA_BEST_PB;
-+ props.fb = LZMA_BEST_FB;
-+
-+ ret = lzma_alloc_workspace(&props);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = jffs2_register_compressor(&jffs2_lzma_comp);
-+ if (ret)
-+ lzma_free_workspace();
-+
-+ return ret;
-+}
-+
-+void jffs2_lzma_exit(void)
-+{
-+ jffs2_unregister_compressor(&jffs2_lzma_comp);
-+ lzma_free_workspace();
-+}
---- a/fs/jffs2/super.c
-+++ b/fs/jffs2/super.c
-@@ -380,14 +380,41 @@ static int __init init_jffs2_fs(void)
- BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68);
- BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32);
-
-- pr_info("version 2.2."
-+ pr_info("version 2.2"
- #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
- " (NAND)"
- #endif
- #ifdef CONFIG_JFFS2_SUMMARY
-- " (SUMMARY) "
-+ " (SUMMARY)"
- #endif
-- " © 2001-2006 Red Hat, Inc.\n");
-+#ifdef CONFIG_JFFS2_ZLIB
-+ " (ZLIB)"
-+#endif
-+#ifdef CONFIG_JFFS2_LZO
-+ " (LZO)"
-+#endif
-+#ifdef CONFIG_JFFS2_LZMA
-+ " (LZMA)"
-+#endif
-+#ifdef CONFIG_JFFS2_RTIME
-+ " (RTIME)"
-+#endif
-+#ifdef CONFIG_JFFS2_RUBIN
-+ " (RUBIN)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_NONE
-+ " (CMODE_NONE)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_PRIORITY
-+ " (CMODE_PRIORITY)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_SIZE
-+ " (CMODE_SIZE)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO
-+ " (CMODE_FAVOURLZO)"
-+#endif
-+ " (c) 2001-2006 Red Hat, Inc.\n");
-
- jffs2_inode_cachep = kmem_cache_create("jffs2_i",
- sizeof(struct jffs2_inode_info),
---- /dev/null
-+++ b/include/linux/lzma.h
-@@ -0,0 +1,62 @@
-+#ifndef __LZMA_H__
-+#define __LZMA_H__
-+
-+#ifdef __KERNEL__
-+ #include <linux/kernel.h>
-+ #include <linux/sched.h>
-+ #include <linux/slab.h>
-+ #include <linux/vmalloc.h>
-+ #include <linux/init.h>
-+ #define LZMA_MALLOC vmalloc
-+ #define LZMA_FREE vfree
-+ #define PRINT_ERROR(msg) printk(KERN_WARNING #msg)
-+ #define INIT __init
-+ #define STATIC static
-+#else
-+ #include <stdint.h>
-+ #include <stdlib.h>
-+ #include <stdio.h>
-+ #include <unistd.h>
-+ #include <string.h>
-+ #include <asm/types.h>
-+ #include <errno.h>
-+ #include <linux/jffs2.h>
-+ #ifndef PAGE_SIZE
-+ extern int page_size;
-+ #define PAGE_SIZE page_size
-+ #endif
-+ #define LZMA_MALLOC malloc
-+ #define LZMA_FREE free
-+ #define PRINT_ERROR(msg) fprintf(stderr, msg)
-+ #define INIT
-+ #define STATIC
-+#endif
-+
-+#include "lzma/LzmaDec.h"
-+#include "lzma/LzmaEnc.h"
-+
-+#define LZMA_BEST_LEVEL (9)
-+#define LZMA_BEST_LC (0)
-+#define LZMA_BEST_LP (0)
-+#define LZMA_BEST_PB (0)
-+#define LZMA_BEST_FB (273)
-+
-+#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2)
-+
-+static void *p_lzma_malloc(void *p, size_t size)
-+{
-+ if (size == 0)
-+ return NULL;
-+
-+ return LZMA_MALLOC(size);
-+}
-+
-+static void p_lzma_free(void *p, void *address)
-+{
-+ if (address != NULL)
-+ LZMA_FREE(address);
-+}
-+
-+static ISzAlloc lzma_alloc = { .Alloc = p_lzma_malloc, .Free = p_lzma_free };
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzFind.h
-@@ -0,0 +1,115 @@
-+/* LzFind.h -- Match finder for LZ algorithms
-+2009-04-22 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZ_FIND_H
-+#define __LZ_FIND_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef UInt32 CLzRef;
-+
-+typedef struct _CMatchFinder
-+{
-+ Byte *buffer;
-+ UInt32 pos;
-+ UInt32 posLimit;
-+ UInt32 streamPos;
-+ UInt32 lenLimit;
-+
-+ UInt32 cyclicBufferPos;
-+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
-+
-+ UInt32 matchMaxLen;
-+ CLzRef *hash;
-+ CLzRef *son;
-+ UInt32 hashMask;
-+ UInt32 cutValue;
-+
-+ Byte *bufferBase;
-+ ISeqInStream *stream;
-+ int streamEndWasReached;
-+
-+ UInt32 blockSize;
-+ UInt32 keepSizeBefore;
-+ UInt32 keepSizeAfter;
-+
-+ UInt32 numHashBytes;
-+ int directInput;
-+ size_t directInputRem;
-+ int btMode;
-+ int bigHash;
-+ UInt32 historySize;
-+ UInt32 fixedHashSize;
-+ UInt32 hashSizeSum;
-+ UInt32 numSons;
-+ SRes result;
-+ UInt32 crc[256];
-+} CMatchFinder;
-+
-+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
-+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])
-+
-+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-+
-+int MatchFinder_NeedMove(CMatchFinder *p);
-+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
-+void MatchFinder_MoveBlock(CMatchFinder *p);
-+void MatchFinder_ReadIfRequired(CMatchFinder *p);
-+
-+void MatchFinder_Construct(CMatchFinder *p);
-+
-+/* Conditions:
-+ historySize <= 3 GB
-+ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
-+*/
-+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
-+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
-+ ISzAlloc *alloc);
-+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
-+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
-+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
-+
-+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
-+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
-+ UInt32 *distances, UInt32 maxLen);
-+
-+/*
-+Conditions:
-+ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
-+ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
-+*/
-+
-+typedef void (*Mf_Init_Func)(void *object);
-+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);
-+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
-+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
-+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
-+typedef void (*Mf_Skip_Func)(void *object, UInt32);
-+
-+typedef struct _IMatchFinder
-+{
-+ Mf_Init_Func Init;
-+ Mf_GetIndexByte_Func GetIndexByte;
-+ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
-+ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
-+ Mf_GetMatches_Func GetMatches;
-+ Mf_Skip_Func Skip;
-+} IMatchFinder;
-+
-+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
-+
-+void MatchFinder_Init(CMatchFinder *p);
-+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzHash.h
-@@ -0,0 +1,54 @@
-+/* LzHash.h -- HASH functions for LZ algorithms
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZ_HASH_H
-+#define __LZ_HASH_H
-+
-+#define kHash2Size (1 << 10)
-+#define kHash3Size (1 << 16)
-+#define kHash4Size (1 << 20)
-+
-+#define kFix3HashSize (kHash2Size)
-+#define kFix4HashSize (kHash2Size + kHash3Size)
-+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
-+
-+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);
-+
-+#define HASH3_CALC { \
-+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+ hash2Value = temp & (kHash2Size - 1); \
-+ hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
-+
-+#define HASH4_CALC { \
-+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+ hash2Value = temp & (kHash2Size - 1); \
-+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+ hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
-+
-+#define HASH5_CALC { \
-+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+ hash2Value = temp & (kHash2Size - 1); \
-+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \
-+ hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \
-+ hash4Value &= (kHash4Size - 1); }
-+
-+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
-+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
-+
-+
-+#define MT_HASH2_CALC \
-+ hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
-+
-+#define MT_HASH3_CALC { \
-+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+ hash2Value = temp & (kHash2Size - 1); \
-+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
-+
-+#define MT_HASH4_CALC { \
-+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+ hash2Value = temp & (kHash2Size - 1); \
-+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzmaDec.h
-@@ -0,0 +1,231 @@
-+/* LzmaDec.h -- LZMA Decoder
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZMA_DEC_H
-+#define __LZMA_DEC_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/* #define _LZMA_PROB32 */
-+/* _LZMA_PROB32 can increase the speed on some CPUs,
-+ but memory usage for CLzmaDec::probs will be doubled in that case */
-+
-+#ifdef _LZMA_PROB32
-+#define CLzmaProb UInt32
-+#else
-+#define CLzmaProb UInt16
-+#endif
-+
-+
-+/* ---------- LZMA Properties ---------- */
-+
-+#define LZMA_PROPS_SIZE 5
-+
-+typedef struct _CLzmaProps
-+{
-+ unsigned lc, lp, pb;
-+ UInt32 dicSize;
-+} CLzmaProps;
-+
-+/* LzmaProps_Decode - decodes properties
-+Returns:
-+ SZ_OK
-+ SZ_ERROR_UNSUPPORTED - Unsupported properties
-+*/
-+
-+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
-+
-+
-+/* ---------- LZMA Decoder state ---------- */
-+
-+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
-+ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
-+
-+#define LZMA_REQUIRED_INPUT_MAX 20
-+
-+typedef struct
-+{
-+ CLzmaProps prop;
-+ CLzmaProb *probs;
-+ Byte *dic;
-+ const Byte *buf;
-+ UInt32 range, code;
-+ SizeT dicPos;
-+ SizeT dicBufSize;
-+ UInt32 processedPos;
-+ UInt32 checkDicSize;
-+ unsigned state;
-+ UInt32 reps[4];
-+ unsigned remainLen;
-+ int needFlush;
-+ int needInitState;
-+ UInt32 numProbs;
-+ unsigned tempBufSize;
-+ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
-+} CLzmaDec;
-+
-+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
-+
-+void LzmaDec_Init(CLzmaDec *p);
-+
-+/* There are two types of LZMA streams:
-+ 0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
-+ 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-+
-+typedef enum
-+{
-+ LZMA_FINISH_ANY, /* finish at any point */
-+ LZMA_FINISH_END /* block must be finished at the end */
-+} ELzmaFinishMode;
-+
-+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
-+
-+ You must use LZMA_FINISH_END, when you know that current output buffer
-+ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
-+
-+ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
-+ and output value of destLen will be less than output buffer size limit.
-+ You can check status result also.
-+
-+ You can use multiple checks to test data integrity after full decompression:
-+ 1) Check Result and "status" variable.
-+ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
-+ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
-+ You must use correct finish mode in that case. */
-+
-+typedef enum
-+{
-+ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */
-+ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */
-+ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */
-+ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */
-+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */
-+} ELzmaStatus;
-+
-+/* ELzmaStatus is used only as output value for function call */
-+
-+
-+/* ---------- Interfaces ---------- */
-+
-+/* There are 3 levels of interfaces:
-+ 1) Dictionary Interface
-+ 2) Buffer Interface
-+ 3) One Call Interface
-+ You can select any of these interfaces, but don't mix functions from different
-+ groups for same object. */
-+
-+
-+/* There are two variants to allocate state for Dictionary Interface:
-+ 1) LzmaDec_Allocate / LzmaDec_Free
-+ 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
-+ You can use variant 2, if you set dictionary buffer manually.
-+ For Buffer Interface you must always use variant 1.
-+
-+LzmaDec_Allocate* can return:
-+ SZ_OK
-+ SZ_ERROR_MEM - Memory allocation error
-+ SZ_ERROR_UNSUPPORTED - Unsupported properties
-+*/
-+
-+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
-+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
-+
-+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
-+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
-+
-+/* ---------- Dictionary Interface ---------- */
-+
-+/* You can use it, if you want to eliminate the overhead for data copying from
-+ dictionary to some other external buffer.
-+ You must work with CLzmaDec variables directly in this interface.
-+
-+ STEPS:
-+ LzmaDec_Constr()
-+ LzmaDec_Allocate()
-+ for (each new stream)
-+ {
-+ LzmaDec_Init()
-+ while (it needs more decompression)
-+ {
-+ LzmaDec_DecodeToDic()
-+ use data from CLzmaDec::dic and update CLzmaDec::dicPos
-+ }
-+ }
-+ LzmaDec_Free()
-+*/
-+
-+/* LzmaDec_DecodeToDic
-+
-+ The decoding to internal dictionary buffer (CLzmaDec::dic).
-+ You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
-+
-+finishMode:
-+ It has meaning only if the decoding reaches output limit (dicLimit).
-+ LZMA_FINISH_ANY - Decode just dicLimit bytes.
-+ LZMA_FINISH_END - Stream must be finished after dicLimit.
-+
-+Returns:
-+ SZ_OK
-+ status:
-+ LZMA_STATUS_FINISHED_WITH_MARK
-+ LZMA_STATUS_NOT_FINISHED
-+ LZMA_STATUS_NEEDS_MORE_INPUT
-+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
-+ SZ_ERROR_DATA - Data error
-+*/
-+
-+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
-+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-+
-+
-+/* ---------- Buffer Interface ---------- */
-+
-+/* It's zlib-like interface.
-+ See LzmaDec_DecodeToDic description for information about STEPS and return results,
-+ but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
-+ to work with CLzmaDec variables manually.
-+
-+finishMode:
-+ It has meaning only if the decoding reaches output limit (*destLen).
-+ LZMA_FINISH_ANY - Decode just destLen bytes.
-+ LZMA_FINISH_END - Stream must be finished after (*destLen).
-+*/
-+
-+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
-+ const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-+
-+
-+/* ---------- One Call Interface ---------- */
-+
-+/* LzmaDecode
-+
-+finishMode:
-+ It has meaning only if the decoding reaches output limit (*destLen).
-+ LZMA_FINISH_ANY - Decode just destLen bytes.
-+ LZMA_FINISH_END - Stream must be finished after (*destLen).
-+
-+Returns:
-+ SZ_OK
-+ status:
-+ LZMA_STATUS_FINISHED_WITH_MARK
-+ LZMA_STATUS_NOT_FINISHED
-+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
-+ SZ_ERROR_DATA - Data error
-+ SZ_ERROR_MEM - Memory allocation error
-+ SZ_ERROR_UNSUPPORTED - Unsupported properties
-+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-+*/
-+
-+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
-+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
-+ ELzmaStatus *status, ISzAlloc *alloc);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzmaEnc.h
-@@ -0,0 +1,80 @@
-+/* LzmaEnc.h -- LZMA Encoder
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZMA_ENC_H
-+#define __LZMA_ENC_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define LZMA_PROPS_SIZE 5
-+
-+typedef struct _CLzmaEncProps
-+{
-+ int level; /* 0 <= level <= 9 */
-+ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
-+ (1 << 12) <= dictSize <= (1 << 30) for 64-bit version
-+ default = (1 << 24) */
-+ int lc; /* 0 <= lc <= 8, default = 3 */
-+ int lp; /* 0 <= lp <= 4, default = 0 */
-+ int pb; /* 0 <= pb <= 4, default = 2 */
-+ int algo; /* 0 - fast, 1 - normal, default = 1 */
-+ int fb; /* 5 <= fb <= 273, default = 32 */
-+ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
-+ int numHashBytes; /* 2, 3 or 4, default = 4 */
-+ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */
-+ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
-+ int numThreads; /* 1 or 2, default = 2 */
-+} CLzmaEncProps;
-+
-+void LzmaEncProps_Init(CLzmaEncProps *p);
-+void LzmaEncProps_Normalize(CLzmaEncProps *p);
-+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
-+
-+
-+/* ---------- CLzmaEncHandle Interface ---------- */
-+
-+/* LzmaEnc_* functions can return the following exit codes:
-+Returns:
-+ SZ_OK - OK
-+ SZ_ERROR_MEM - Memory allocation error
-+ SZ_ERROR_PARAM - Incorrect paramater in props
-+ SZ_ERROR_WRITE - Write callback error.
-+ SZ_ERROR_PROGRESS - some break from progress callback
-+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-+*/
-+
-+typedef void * CLzmaEncHandle;
-+
-+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
-+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
-+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
-+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
-+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
-+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+
-+/* ---------- One Call Interface ---------- */
-+
-+/* LzmaEncode
-+Return code:
-+ SZ_OK - OK
-+ SZ_ERROR_MEM - Memory allocation error
-+ SZ_ERROR_PARAM - Incorrect paramater
-+ SZ_ERROR_OUTPUT_EOF - output buffer overflow
-+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-+*/
-+
-+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/Types.h
-@@ -0,0 +1,226 @@
-+/* Types.h -- Basic types
-+2009-11-23 : Igor Pavlov : Public domain */
-+
-+#ifndef __7Z_TYPES_H
-+#define __7Z_TYPES_H
-+
-+#include <stddef.h>
-+
-+#ifdef _WIN32
-+#include <windows.h>
-+#endif
-+
-+#ifndef EXTERN_C_BEGIN
-+#ifdef __cplusplus
-+#define EXTERN_C_BEGIN extern "C" {
-+#define EXTERN_C_END }
-+#else
-+#define EXTERN_C_BEGIN
-+#define EXTERN_C_END
-+#endif
-+#endif
-+
-+EXTERN_C_BEGIN
-+
-+#define SZ_OK 0
-+
-+#define SZ_ERROR_DATA 1
-+#define SZ_ERROR_MEM 2
-+#define SZ_ERROR_CRC 3
-+#define SZ_ERROR_UNSUPPORTED 4
-+#define SZ_ERROR_PARAM 5
-+#define SZ_ERROR_INPUT_EOF 6
-+#define SZ_ERROR_OUTPUT_EOF 7
-+#define SZ_ERROR_READ 8
-+#define SZ_ERROR_WRITE 9
-+#define SZ_ERROR_PROGRESS 10
-+#define SZ_ERROR_FAIL 11
-+#define SZ_ERROR_THREAD 12
-+
-+#define SZ_ERROR_ARCHIVE 16
-+#define SZ_ERROR_NO_ARCHIVE 17
-+
-+typedef int SRes;
-+
-+#ifdef _WIN32
-+typedef DWORD WRes;
-+#else
-+typedef int WRes;
-+#endif
-+
-+#ifndef RINOK
-+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
-+#endif
-+
-+typedef unsigned char Byte;
-+typedef short Int16;
-+typedef unsigned short UInt16;
-+
-+#ifdef _LZMA_UINT32_IS_ULONG
-+typedef long Int32;
-+typedef unsigned long UInt32;
-+#else
-+typedef int Int32;
-+typedef unsigned int UInt32;
-+#endif
-+
-+#ifdef _SZ_NO_INT_64
-+
-+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
-+ NOTES: Some code will work incorrectly in that case! */
-+
-+typedef long Int64;
-+typedef unsigned long UInt64;
-+
-+#else
-+
-+#if defined(_MSC_VER) || defined(__BORLANDC__)
-+typedef __int64 Int64;
-+typedef unsigned __int64 UInt64;
-+#else
-+typedef long long int Int64;
-+typedef unsigned long long int UInt64;
-+#endif
-+
-+#endif
-+
-+#ifdef _LZMA_NO_SYSTEM_SIZE_T
-+typedef UInt32 SizeT;
-+#else
-+typedef size_t SizeT;
-+#endif
-+
-+typedef int Bool;
-+#define True 1
-+#define False 0
-+
-+
-+#ifdef _WIN32
-+#define MY_STD_CALL __stdcall
-+#else
-+#define MY_STD_CALL
-+#endif
-+
-+#ifdef _MSC_VER
-+
-+#if _MSC_VER >= 1300
-+#define MY_NO_INLINE __declspec(noinline)
-+#else
-+#define MY_NO_INLINE
-+#endif
-+
-+#define MY_CDECL __cdecl
-+#define MY_FAST_CALL __fastcall
-+
-+#else
-+
-+#define MY_CDECL
-+#define MY_FAST_CALL
-+
-+#endif
-+
-+
-+/* The following interfaces use first parameter as pointer to structure */
-+
-+typedef struct
-+{
-+ SRes (*Read)(void *p, void *buf, size_t *size);
-+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
-+ (output(*size) < input(*size)) is allowed */
-+} ISeqInStream;
-+
-+/* it can return SZ_ERROR_INPUT_EOF */
-+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
-+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
-+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
-+
-+typedef struct
-+{
-+ size_t (*Write)(void *p, const void *buf, size_t size);
-+ /* Returns: result - the number of actually written bytes.
-+ (result < size) means error */
-+} ISeqOutStream;
-+
-+typedef enum
-+{
-+ SZ_SEEK_SET = 0,
-+ SZ_SEEK_CUR = 1,
-+ SZ_SEEK_END = 2
-+} ESzSeek;
-+
-+typedef struct
-+{
-+ SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */
-+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-+} ISeekInStream;
-+
-+typedef struct
-+{
-+ SRes (*Look)(void *p, void **buf, size_t *size);
-+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
-+ (output(*size) > input(*size)) is not allowed
-+ (output(*size) < input(*size)) is allowed */
-+ SRes (*Skip)(void *p, size_t offset);
-+ /* offset must be <= output(*size) of Look */
-+
-+ SRes (*Read)(void *p, void *buf, size_t *size);
-+ /* reads directly (without buffer). It's same as ISeqInStream::Read */
-+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-+} ILookInStream;
-+
-+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
-+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
-+
-+/* reads via ILookInStream::Read */
-+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
-+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
-+
-+#define LookToRead_BUF_SIZE (1 << 14)
-+
-+typedef struct
-+{
-+ ILookInStream s;
-+ ISeekInStream *realStream;
-+ size_t pos;
-+ size_t size;
-+ Byte buf[LookToRead_BUF_SIZE];
-+} CLookToRead;
-+
-+void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
-+void LookToRead_Init(CLookToRead *p);
-+
-+typedef struct
-+{
-+ ISeqInStream s;
-+ ILookInStream *realStream;
-+} CSecToLook;
-+
-+void SecToLook_CreateVTable(CSecToLook *p);
-+
-+typedef struct
-+{
-+ ISeqInStream s;
-+ ILookInStream *realStream;
-+} CSecToRead;
-+
-+void SecToRead_CreateVTable(CSecToRead *p);
-+
-+typedef struct
-+{
-+ SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
-+ /* Returns: result. (result != SZ_OK) means break.
-+ Value (UInt64)(Int64)-1 for size means unknown value. */
-+} ICompressProgress;
-+
-+typedef struct
-+{
-+ void *(*Alloc)(void *p, size_t size);
-+ void (*Free)(void *p, void *address); /* address can be 0 */
-+} ISzAlloc;
-+
-+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
-+#define IAlloc_Free(p, a) (p)->Free((p), a)
-+
-+EXTERN_C_END
-+
-+#endif
---- a/include/uapi/linux/jffs2.h
-+++ b/include/uapi/linux/jffs2.h
-@@ -46,6 +46,7 @@
- #define JFFS2_COMPR_DYNRUBIN 0x05
- #define JFFS2_COMPR_ZLIB 0x06
- #define JFFS2_COMPR_LZO 0x07
-+#define JFFS2_COMPR_LZMA 0x08
- /* Compatibility flags. */
- #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */
- #define JFFS2_NODE_ACCURATE 0x2000
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -303,6 +303,12 @@ config ZSTD_DECOMPRESS
-
- source "lib/xz/Kconfig"
-
-+config LZMA_COMPRESS
-+ tristate
-+
-+config LZMA_DECOMPRESS
-+ tristate
-+
- #
- # These all provide a common interface (hence the apparent duplication with
- # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -3,6 +3,16 @@
- # Makefile for some libs needed in the kernel.
- #
-
-+ifdef CONFIG_JFFS2_ZLIB
-+ CONFIG_ZLIB_INFLATE:=y
-+ CONFIG_ZLIB_DEFLATE:=y
-+endif
-+
-+ifdef CONFIG_JFFS2_LZMA
-+ CONFIG_LZMA_DECOMPRESS:=y
-+ CONFIG_LZMA_COMPRESS:=y
-+endif
-+
- ifdef CONFIG_FUNCTION_TRACER
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
- KBUILD_CFLAGS = $(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS))
-@@ -149,6 +159,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/
- obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/
- obj-$(CONFIG_XZ_DEC) += xz/
- obj-$(CONFIG_RAID6_PQ) += raid6/
-+obj-$(CONFIG_LZMA_COMPRESS) += lzma/
-+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/
-
- lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
- lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
---- /dev/null
-+++ b/lib/lzma/LzFind.c
-@@ -0,0 +1,761 @@
-+/* LzFind.c -- Match finder for LZ algorithms
-+2009-04-22 : Igor Pavlov : Public domain */
-+
-+#include <string.h>
-+
-+#include "LzFind.h"
-+#include "LzHash.h"
-+
-+#define kEmptyHashValue 0
-+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
-+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
-+#define kNormalizeMask (~(kNormalizeStepMin - 1))
-+#define kMaxHistorySize ((UInt32)3 << 30)
-+
-+#define kStartMaxLen 3
-+
-+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+ if (!p->directInput)
-+ {
-+ alloc->Free(alloc, p->bufferBase);
-+ p->bufferBase = 0;
-+ }
-+}
-+
-+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
-+
-+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
-+{
-+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
-+ if (p->directInput)
-+ {
-+ p->blockSize = blockSize;
-+ return 1;
-+ }
-+ if (p->bufferBase == 0 || p->blockSize != blockSize)
-+ {
-+ LzInWindow_Free(p, alloc);
-+ p->blockSize = blockSize;
-+ p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
-+ }
-+ return (p->bufferBase != 0);
-+}
-+
-+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-+Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-+
-+UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-+
-+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-+{
-+ p->posLimit -= subValue;
-+ p->pos -= subValue;
-+ p->streamPos -= subValue;
-+}
-+
-+static void MatchFinder_ReadBlock(CMatchFinder *p)
-+{
-+ if (p->streamEndWasReached || p->result != SZ_OK)
-+ return;
-+ if (p->directInput)
-+ {
-+ UInt32 curSize = 0xFFFFFFFF - p->streamPos;
-+ if (curSize > p->directInputRem)
-+ curSize = (UInt32)p->directInputRem;
-+ p->directInputRem -= curSize;
-+ p->streamPos += curSize;
-+ if (p->directInputRem == 0)
-+ p->streamEndWasReached = 1;
-+ return;
-+ }
-+ for (;;)
-+ {
-+ Byte *dest = p->buffer + (p->streamPos - p->pos);
-+ size_t size = (p->bufferBase + p->blockSize - dest);
-+ if (size == 0)
-+ return;
-+ p->result = p->stream->Read(p->stream, dest, &size);
-+ if (p->result != SZ_OK)
-+ return;
-+ if (size == 0)
-+ {
-+ p->streamEndWasReached = 1;
-+ return;
-+ }
-+ p->streamPos += (UInt32)size;
-+ if (p->streamPos - p->pos > p->keepSizeAfter)
-+ return;
-+ }
-+}
-+
-+void MatchFinder_MoveBlock(CMatchFinder *p)
-+{
-+ memmove(p->bufferBase,
-+ p->buffer - p->keepSizeBefore,
-+ (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
-+ p->buffer = p->bufferBase + p->keepSizeBefore;
-+}
-+
-+int MatchFinder_NeedMove(CMatchFinder *p)
-+{
-+ if (p->directInput)
-+ return 0;
-+ /* if (p->streamEndWasReached) return 0; */
-+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
-+}
-+
-+void MatchFinder_ReadIfRequired(CMatchFinder *p)
-+{
-+ if (p->streamEndWasReached)
-+ return;
-+ if (p->keepSizeAfter >= p->streamPos - p->pos)
-+ MatchFinder_ReadBlock(p);
-+}
-+
-+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
-+{
-+ if (MatchFinder_NeedMove(p))
-+ MatchFinder_MoveBlock(p);
-+ MatchFinder_ReadBlock(p);
-+}
-+
-+static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
-+{
-+ p->cutValue = 32;
-+ p->btMode = 1;
-+ p->numHashBytes = 4;
-+ p->bigHash = 0;
-+}
-+
-+#define kCrcPoly 0xEDB88320
-+
-+void MatchFinder_Construct(CMatchFinder *p)
-+{
-+ UInt32 i;
-+ p->bufferBase = 0;
-+ p->directInput = 0;
-+ p->hash = 0;
-+ MatchFinder_SetDefaultSettings(p);
-+
-+ for (i = 0; i < 256; i++)
-+ {
-+ UInt32 r = i;
-+ int j;
-+ for (j = 0; j < 8; j++)
-+ r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
-+ p->crc[i] = r;
-+ }
-+}
-+
-+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+ alloc->Free(alloc, p->hash);
-+ p->hash = 0;
-+}
-+
-+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+ MatchFinder_FreeThisClassMemory(p, alloc);
-+ LzInWindow_Free(p, alloc);
-+}
-+
-+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
-+{
-+ size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
-+ if (sizeInBytes / sizeof(CLzRef) != num)
-+ return 0;
-+ return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
-+}
-+
-+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
-+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
-+ ISzAlloc *alloc)
-+{
-+ UInt32 sizeReserv;
-+ if (historySize > kMaxHistorySize)
-+ {
-+ MatchFinder_Free(p, alloc);
-+ return 0;
-+ }
-+ sizeReserv = historySize >> 1;
-+ if (historySize > ((UInt32)2 << 30))
-+ sizeReserv = historySize >> 2;
-+ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
-+
-+ p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
-+ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
-+ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
-+ if (LzInWindow_Create(p, sizeReserv, alloc))
-+ {
-+ UInt32 newCyclicBufferSize = historySize + 1;
-+ UInt32 hs;
-+ p->matchMaxLen = matchMaxLen;
-+ {
-+ p->fixedHashSize = 0;
-+ if (p->numHashBytes == 2)
-+ hs = (1 << 16) - 1;
-+ else
-+ {
-+ hs = historySize - 1;
-+ hs |= (hs >> 1);
-+ hs |= (hs >> 2);
-+ hs |= (hs >> 4);
-+ hs |= (hs >> 8);
-+ hs >>= 1;
-+ hs |= 0xFFFF; /* don't change it! It's required for Deflate */
-+ if (hs > (1 << 24))
-+ {
-+ if (p->numHashBytes == 3)
-+ hs = (1 << 24) - 1;
-+ else
-+ hs >>= 1;
-+ }
-+ }
-+ p->hashMask = hs;
-+ hs++;
-+ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
-+ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
-+ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
-+ hs += p->fixedHashSize;
-+ }
-+
-+ {
-+ UInt32 prevSize = p->hashSizeSum + p->numSons;
-+ UInt32 newSize;
-+ p->historySize = historySize;
-+ p->hashSizeSum = hs;
-+ p->cyclicBufferSize = newCyclicBufferSize;
-+ p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
-+ newSize = p->hashSizeSum + p->numSons;
-+ if (p->hash != 0 && prevSize == newSize)
-+ return 1;
-+ MatchFinder_FreeThisClassMemory(p, alloc);
-+ p->hash = AllocRefs(newSize, alloc);
-+ if (p->hash != 0)
-+ {
-+ p->son = p->hash + p->hashSizeSum;
-+ return 1;
-+ }
-+ }
-+ }
-+ MatchFinder_Free(p, alloc);
-+ return 0;
-+}
-+
-+static void MatchFinder_SetLimits(CMatchFinder *p)
-+{
-+ UInt32 limit = kMaxValForNormalize - p->pos;
-+ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
-+ if (limit2 < limit)
-+ limit = limit2;
-+ limit2 = p->streamPos - p->pos;
-+ if (limit2 <= p->keepSizeAfter)
-+ {
-+ if (limit2 > 0)
-+ limit2 = 1;
-+ }
-+ else
-+ limit2 -= p->keepSizeAfter;
-+ if (limit2 < limit)
-+ limit = limit2;
-+ {
-+ UInt32 lenLimit = p->streamPos - p->pos;
-+ if (lenLimit > p->matchMaxLen)
-+ lenLimit = p->matchMaxLen;
-+ p->lenLimit = lenLimit;
-+ }
-+ p->posLimit = p->pos + limit;
-+}
-+
-+void MatchFinder_Init(CMatchFinder *p)
-+{
-+ UInt32 i;
-+ for (i = 0; i < p->hashSizeSum; i++)
-+ p->hash[i] = kEmptyHashValue;
-+ p->cyclicBufferPos = 0;
-+ p->buffer = p->bufferBase;
-+ p->pos = p->streamPos = p->cyclicBufferSize;
-+ p->result = SZ_OK;
-+ p->streamEndWasReached = 0;
-+ MatchFinder_ReadBlock(p);
-+ MatchFinder_SetLimits(p);
-+}
-+
-+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
-+{
-+ return (p->pos - p->historySize - 1) & kNormalizeMask;
-+}
-+
-+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-+{
-+ UInt32 i;
-+ for (i = 0; i < numItems; i++)
-+ {
-+ UInt32 value = items[i];
-+ if (value <= subValue)
-+ value = kEmptyHashValue;
-+ else
-+ value -= subValue;
-+ items[i] = value;
-+ }
-+}
-+
-+static void MatchFinder_Normalize(CMatchFinder *p)
-+{
-+ UInt32 subValue = MatchFinder_GetSubValue(p);
-+ MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
-+ MatchFinder_ReduceOffsets(p, subValue);
-+}
-+
-+static void MatchFinder_CheckLimits(CMatchFinder *p)
-+{
-+ if (p->pos == kMaxValForNormalize)
-+ MatchFinder_Normalize(p);
-+ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
-+ MatchFinder_CheckAndMoveAndRead(p);
-+ if (p->cyclicBufferPos == p->cyclicBufferSize)
-+ p->cyclicBufferPos = 0;
-+ MatchFinder_SetLimits(p);
-+}
-+
-+static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-+ UInt32 *distances, UInt32 maxLen)
-+{
-+ son[_cyclicBufferPos] = curMatch;
-+ for (;;)
-+ {
-+ UInt32 delta = pos - curMatch;
-+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+ return distances;
-+ {
-+ const Byte *pb = cur - delta;
-+ curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
-+ if (pb[maxLen] == cur[maxLen] && *pb == *cur)
-+ {
-+ UInt32 len = 0;
-+ while (++len != lenLimit)
-+ if (pb[len] != cur[len])
-+ break;
-+ if (maxLen < len)
-+ {
-+ *distances++ = maxLen = len;
-+ *distances++ = delta - 1;
-+ if (len == lenLimit)
-+ return distances;
-+ }
-+ }
-+ }
-+ }
-+}
-+
-+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-+ UInt32 *distances, UInt32 maxLen)
-+{
-+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
-+ UInt32 len0 = 0, len1 = 0;
-+ for (;;)
-+ {
-+ UInt32 delta = pos - curMatch;
-+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+ {
-+ *ptr0 = *ptr1 = kEmptyHashValue;
-+ return distances;
-+ }
-+ {
-+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
-+ const Byte *pb = cur - delta;
-+ UInt32 len = (len0 < len1 ? len0 : len1);
-+ if (pb[len] == cur[len])
-+ {
-+ if (++len != lenLimit && pb[len] == cur[len])
-+ while (++len != lenLimit)
-+ if (pb[len] != cur[len])
-+ break;
-+ if (maxLen < len)
-+ {
-+ *distances++ = maxLen = len;
-+ *distances++ = delta - 1;
-+ if (len == lenLimit)
-+ {
-+ *ptr1 = pair[0];
-+ *ptr0 = pair[1];
-+ return distances;
-+ }
-+ }
-+ }
-+ if (pb[len] < cur[len])
-+ {
-+ *ptr1 = curMatch;
-+ ptr1 = pair + 1;
-+ curMatch = *ptr1;
-+ len1 = len;
-+ }
-+ else
-+ {
-+ *ptr0 = curMatch;
-+ ptr0 = pair;
-+ curMatch = *ptr0;
-+ len0 = len;
-+ }
-+ }
-+ }
-+}
-+
-+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
-+{
-+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
-+ UInt32 len0 = 0, len1 = 0;
-+ for (;;)
-+ {
-+ UInt32 delta = pos - curMatch;
-+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+ {
-+ *ptr0 = *ptr1 = kEmptyHashValue;
-+ return;
-+ }
-+ {
-+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
-+ const Byte *pb = cur - delta;
-+ UInt32 len = (len0 < len1 ? len0 : len1);
-+ if (pb[len] == cur[len])
-+ {
-+ while (++len != lenLimit)
-+ if (pb[len] != cur[len])
-+ break;
-+ {
-+ if (len == lenLimit)
-+ {
-+ *ptr1 = pair[0];
-+ *ptr0 = pair[1];
-+ return;
-+ }
-+ }
-+ }
-+ if (pb[len] < cur[len])
-+ {
-+ *ptr1 = curMatch;
-+ ptr1 = pair + 1;
-+ curMatch = *ptr1;
-+ len1 = len;
-+ }
-+ else
-+ {
-+ *ptr0 = curMatch;
-+ ptr0 = pair;
-+ curMatch = *ptr0;
-+ len0 = len;
-+ }
-+ }
-+ }
-+}
-+
-+#define MOVE_POS \
-+ ++p->cyclicBufferPos; \
-+ p->buffer++; \
-+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-+
-+#define MOVE_POS_RET MOVE_POS return offset;
-+
-+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
-+
-+#define GET_MATCHES_HEADER2(minLen, ret_op) \
-+ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
-+ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
-+ cur = p->buffer;
-+
-+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
-+#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue)
-+
-+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
-+
-+#define GET_MATCHES_FOOTER(offset, maxLen) \
-+ offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \
-+ distances + offset, maxLen) - distances); MOVE_POS_RET;
-+
-+#define SKIP_FOOTER \
-+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
-+
-+static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 offset;
-+ GET_MATCHES_HEADER(2)
-+ HASH2_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ offset = 0;
-+ GET_MATCHES_FOOTER(offset, 1)
-+}
-+
-+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 offset;
-+ GET_MATCHES_HEADER(3)
-+ HASH_ZIP_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ offset = 0;
-+ GET_MATCHES_FOOTER(offset, 2)
-+}
-+
-+static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 hash2Value, delta2, maxLen, offset;
-+ GET_MATCHES_HEADER(3)
-+
-+ HASH3_CALC;
-+
-+ delta2 = p->pos - p->hash[hash2Value];
-+ curMatch = p->hash[kFix3HashSize + hashValue];
-+
-+ p->hash[hash2Value] =
-+ p->hash[kFix3HashSize + hashValue] = p->pos;
-+
-+
-+ maxLen = 2;
-+ offset = 0;
-+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+ {
-+ for (; maxLen != lenLimit; maxLen++)
-+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+ break;
-+ distances[0] = maxLen;
-+ distances[1] = delta2 - 1;
-+ offset = 2;
-+ if (maxLen == lenLimit)
-+ {
-+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-+ MOVE_POS_RET;
-+ }
-+ }
-+ GET_MATCHES_FOOTER(offset, maxLen)
-+}
-+
-+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-+ GET_MATCHES_HEADER(4)
-+
-+ HASH4_CALC;
-+
-+ delta2 = p->pos - p->hash[ hash2Value];
-+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-+ curMatch = p->hash[kFix4HashSize + hashValue];
-+
-+ p->hash[ hash2Value] =
-+ p->hash[kFix3HashSize + hash3Value] =
-+ p->hash[kFix4HashSize + hashValue] = p->pos;
-+
-+ maxLen = 1;
-+ offset = 0;
-+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+ {
-+ distances[0] = maxLen = 2;
-+ distances[1] = delta2 - 1;
-+ offset = 2;
-+ }
-+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-+ {
-+ maxLen = 3;
-+ distances[offset + 1] = delta3 - 1;
-+ offset += 2;
-+ delta2 = delta3;
-+ }
-+ if (offset != 0)
-+ {
-+ for (; maxLen != lenLimit; maxLen++)
-+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+ break;
-+ distances[offset - 2] = maxLen;
-+ if (maxLen == lenLimit)
-+ {
-+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-+ MOVE_POS_RET;
-+ }
-+ }
-+ if (maxLen < 3)
-+ maxLen = 3;
-+ GET_MATCHES_FOOTER(offset, maxLen)
-+}
-+
-+static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-+ GET_MATCHES_HEADER(4)
-+
-+ HASH4_CALC;
-+
-+ delta2 = p->pos - p->hash[ hash2Value];
-+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-+ curMatch = p->hash[kFix4HashSize + hashValue];
-+
-+ p->hash[ hash2Value] =
-+ p->hash[kFix3HashSize + hash3Value] =
-+ p->hash[kFix4HashSize + hashValue] = p->pos;
-+
-+ maxLen = 1;
-+ offset = 0;
-+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+ {
-+ distances[0] = maxLen = 2;
-+ distances[1] = delta2 - 1;
-+ offset = 2;
-+ }
-+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-+ {
-+ maxLen = 3;
-+ distances[offset + 1] = delta3 - 1;
-+ offset += 2;
-+ delta2 = delta3;
-+ }
-+ if (offset != 0)
-+ {
-+ for (; maxLen != lenLimit; maxLen++)
-+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+ break;
-+ distances[offset - 2] = maxLen;
-+ if (maxLen == lenLimit)
-+ {
-+ p->son[p->cyclicBufferPos] = curMatch;
-+ MOVE_POS_RET;
-+ }
-+ }
-+ if (maxLen < 3)
-+ maxLen = 3;
-+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-+ distances + offset, maxLen) - (distances));
-+ MOVE_POS_RET
-+}
-+
-+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+ UInt32 offset;
-+ GET_MATCHES_HEADER(3)
-+ HASH_ZIP_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-+ distances, 2) - (distances));
-+ MOVE_POS_RET
-+}
-+
-+static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ SKIP_HEADER(2)
-+ HASH2_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ SKIP_FOOTER
-+ }
-+ while (--num != 0);
-+}
-+
-+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ SKIP_HEADER(3)
-+ HASH_ZIP_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ SKIP_FOOTER
-+ }
-+ while (--num != 0);
-+}
-+
-+static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ UInt32 hash2Value;
-+ SKIP_HEADER(3)
-+ HASH3_CALC;
-+ curMatch = p->hash[kFix3HashSize + hashValue];
-+ p->hash[hash2Value] =
-+ p->hash[kFix3HashSize + hashValue] = p->pos;
-+ SKIP_FOOTER
-+ }
-+ while (--num != 0);
-+}
-+
-+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ UInt32 hash2Value, hash3Value;
-+ SKIP_HEADER(4)
-+ HASH4_CALC;
-+ curMatch = p->hash[kFix4HashSize + hashValue];
-+ p->hash[ hash2Value] =
-+ p->hash[kFix3HashSize + hash3Value] = p->pos;
-+ p->hash[kFix4HashSize + hashValue] = p->pos;
-+ SKIP_FOOTER
-+ }
-+ while (--num != 0);
-+}
-+
-+static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ UInt32 hash2Value, hash3Value;
-+ SKIP_HEADER(4)
-+ HASH4_CALC;
-+ curMatch = p->hash[kFix4HashSize + hashValue];
-+ p->hash[ hash2Value] =
-+ p->hash[kFix3HashSize + hash3Value] =
-+ p->hash[kFix4HashSize + hashValue] = p->pos;
-+ p->son[p->cyclicBufferPos] = curMatch;
-+ MOVE_POS
-+ }
-+ while (--num != 0);
-+}
-+
-+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+ do
-+ {
-+ SKIP_HEADER(3)
-+ HASH_ZIP_CALC;
-+ curMatch = p->hash[hashValue];
-+ p->hash[hashValue] = p->pos;
-+ p->son[p->cyclicBufferPos] = curMatch;
-+ MOVE_POS
-+ }
-+ while (--num != 0);
-+}
-+
-+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
-+{
-+ vTable->Init = (Mf_Init_Func)MatchFinder_Init;
-+ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
-+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
-+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
-+ if (!p->btMode)
-+ {
-+ vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
-+ }
-+ else if (p->numHashBytes == 2)
-+ {
-+ vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
-+ }
-+ else if (p->numHashBytes == 3)
-+ {
-+ vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
-+ }
-+ else
-+ {
-+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
-+ }
-+}
---- /dev/null
-+++ b/lib/lzma/LzmaDec.c
-@@ -0,0 +1,999 @@
-+/* LzmaDec.c -- LZMA Decoder
-+2009-09-20 : Igor Pavlov : Public domain */
-+
-+#include "LzmaDec.h"
-+
-+#include <string.h>
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+
-+#define RC_INIT_SIZE 5
-+
-+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
-+
-+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
-+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
-+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
-+ { UPDATE_0(p); i = (i + i); A0; } else \
-+ { UPDATE_1(p); i = (i + i) + 1; A1; }
-+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
-+
-+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
-+#define TREE_DECODE(probs, limit, i) \
-+ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
-+
-+/* #define _LZMA_SIZE_OPT */
-+
-+#ifdef _LZMA_SIZE_OPT
-+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
-+#else
-+#define TREE_6_DECODE(probs, i) \
-+ { i = 1; \
-+ TREE_GET_BIT(probs, i); \
-+ TREE_GET_BIT(probs, i); \
-+ TREE_GET_BIT(probs, i); \
-+ TREE_GET_BIT(probs, i); \
-+ TREE_GET_BIT(probs, i); \
-+ TREE_GET_BIT(probs, i); \
-+ i -= 0x40; }
-+#endif
-+
-+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
-+
-+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-+#define UPDATE_0_CHECK range = bound;
-+#define UPDATE_1_CHECK range -= bound; code -= bound;
-+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
-+ { UPDATE_0_CHECK; i = (i + i); A0; } else \
-+ { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
-+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
-+#define TREE_DECODE_CHECK(probs, limit, i) \
-+ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
-+
-+
-+#define kNumPosBitsMax 4
-+#define kNumPosStatesMax (1 << kNumPosBitsMax)
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define LenChoice 0
-+#define LenChoice2 (LenChoice + 1)
-+#define LenLow (LenChoice2 + 1)
-+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-+
-+
-+#define kNumStates 12
-+#define kNumLitStates 7
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#define kNumPosSlotBits 6
-+#define kNumLenToPosStates 4
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+
-+#define kMatchMinLen 2
-+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-+
-+#define IsMatch 0
-+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-+#define IsRepG0 (IsRep + kNumStates)
-+#define IsRepG1 (IsRepG0 + kNumStates)
-+#define IsRepG2 (IsRepG1 + kNumStates)
-+#define IsRep0Long (IsRepG2 + kNumStates)
-+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-+#define LenCoder (Align + kAlignTableSize)
-+#define RepLenCoder (LenCoder + kNumLenProbs)
-+#define Literal (RepLenCoder + kNumLenProbs)
-+
-+#define LZMA_BASE_SIZE 1846
-+#define LZMA_LIT_SIZE 768
-+
-+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
-+
-+#if Literal != LZMA_BASE_SIZE
-+StopCompilingDueBUG
-+#endif
-+
-+#define LZMA_DIC_MIN (1 << 12)
-+
-+/* First LZMA-symbol is always decoded.
-+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
-+Out:
-+ Result:
-+ SZ_OK - OK
-+ SZ_ERROR_DATA - Error
-+ p->remainLen:
-+ < kMatchSpecLenStart : normal remain
-+ = kMatchSpecLenStart : finished
-+ = kMatchSpecLenStart + 1 : Flush marker
-+ = kMatchSpecLenStart + 2 : State Init Marker
-+*/
-+
-+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-+{
-+ CLzmaProb *probs = p->probs;
-+
-+ unsigned state = p->state;
-+ UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
-+ unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
-+ unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
-+ unsigned lc = p->prop.lc;
-+
-+ Byte *dic = p->dic;
-+ SizeT dicBufSize = p->dicBufSize;
-+ SizeT dicPos = p->dicPos;
-+
-+ UInt32 processedPos = p->processedPos;
-+ UInt32 checkDicSize = p->checkDicSize;
-+ unsigned len = 0;
-+
-+ const Byte *buf = p->buf;
-+ UInt32 range = p->range;
-+ UInt32 code = p->code;
-+
-+ do
-+ {
-+ CLzmaProb *prob;
-+ UInt32 bound;
-+ unsigned ttt;
-+ unsigned posState = processedPos & pbMask;
-+
-+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
-+ IF_BIT_0(prob)
-+ {
-+ unsigned symbol;
-+ UPDATE_0(prob);
-+ prob = probs + Literal;
-+ if (checkDicSize != 0 || processedPos != 0)
-+ prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
-+ (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
-+
-+ if (state < kNumLitStates)
-+ {
-+ state -= (state < 4) ? state : 3;
-+ symbol = 1;
-+ do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
-+ }
-+ else
-+ {
-+ unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+ unsigned offs = 0x100;
-+ state -= (state < 10) ? 3 : 6;
-+ symbol = 1;
-+ do
-+ {
-+ unsigned bit;
-+ CLzmaProb *probLit;
-+ matchByte <<= 1;
-+ bit = (matchByte & offs);
-+ probLit = prob + offs + bit + symbol;
-+ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
-+ }
-+ while (symbol < 0x100);
-+ }
-+ dic[dicPos++] = (Byte)symbol;
-+ processedPos++;
-+ continue;
-+ }
-+ else
-+ {
-+ UPDATE_1(prob);
-+ prob = probs + IsRep + state;
-+ IF_BIT_0(prob)
-+ {
-+ UPDATE_0(prob);
-+ state += kNumStates;
-+ prob = probs + LenCoder;
-+ }
-+ else
-+ {
-+ UPDATE_1(prob);
-+ if (checkDicSize == 0 && processedPos == 0)
-+ return SZ_ERROR_DATA;
-+ prob = probs + IsRepG0 + state;
-+ IF_BIT_0(prob)
-+ {
-+ UPDATE_0(prob);
-+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
-+ IF_BIT_0(prob)
-+ {
-+ UPDATE_0(prob);
-+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+ dicPos++;
-+ processedPos++;
-+ state = state < kNumLitStates ? 9 : 11;
-+ continue;
-+ }
-+ UPDATE_1(prob);
-+ }
-+ else
-+ {
-+ UInt32 distance;
-+ UPDATE_1(prob);
-+ prob = probs + IsRepG1 + state;
-+ IF_BIT_0(prob)
-+ {
-+ UPDATE_0(prob);
-+ distance = rep1;
-+ }
-+ else
-+ {
-+ UPDATE_1(prob);
-+ prob = probs + IsRepG2 + state;
-+ IF_BIT_0(prob)
-+ {
-+ UPDATE_0(prob);
-+ distance = rep2;
-+ }
-+ else
-+ {
-+ UPDATE_1(prob);
-+ distance = rep3;
-+ rep3 = rep2;
-+ }
-+ rep2 = rep1;
-+ }
-+ rep1 = rep0;
-+ rep0 = distance;
-+ }
-+ state = state < kNumLitStates ? 8 : 11;
-+ prob = probs + RepLenCoder;
-+ }
-+ {
-+ unsigned limit, offset;
-+ CLzmaProb *probLen = prob + LenChoice;
-+ IF_BIT_0(probLen)
-+ {
-+ UPDATE_0(probLen);
-+ probLen = prob + LenLow + (posState << kLenNumLowBits);
-+ offset = 0;
-+ limit = (1 << kLenNumLowBits);
-+ }
-+ else
-+ {
-+ UPDATE_1(probLen);
-+ probLen = prob + LenChoice2;
-+ IF_BIT_0(probLen)
-+ {
-+ UPDATE_0(probLen);
-+ probLen = prob + LenMid + (posState << kLenNumMidBits);
-+ offset = kLenNumLowSymbols;
-+ limit = (1 << kLenNumMidBits);
-+ }
-+ else
-+ {
-+ UPDATE_1(probLen);
-+ probLen = prob + LenHigh;
-+ offset = kLenNumLowSymbols + kLenNumMidSymbols;
-+ limit = (1 << kLenNumHighBits);
-+ }
-+ }
-+ TREE_DECODE(probLen, limit, len);
-+ len += offset;
-+ }
-+
-+ if (state >= kNumStates)
-+ {
-+ UInt32 distance;
-+ prob = probs + PosSlot +
-+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
-+ TREE_6_DECODE(prob, distance);
-+ if (distance >= kStartPosModelIndex)
-+ {
-+ unsigned posSlot = (unsigned)distance;
-+ int numDirectBits = (int)(((distance >> 1) - 1));
-+ distance = (2 | (distance & 1));
-+ if (posSlot < kEndPosModelIndex)
-+ {
-+ distance <<= numDirectBits;
-+ prob = probs + SpecPos + distance - posSlot - 1;
-+ {
-+ UInt32 mask = 1;
-+ unsigned i = 1;
-+ do
-+ {
-+ GET_BIT2(prob + i, i, ; , distance |= mask);
-+ mask <<= 1;
-+ }
-+ while (--numDirectBits != 0);
-+ }
-+ }
-+ else
-+ {
-+ numDirectBits -= kNumAlignBits;
-+ do
-+ {
-+ NORMALIZE
-+ range >>= 1;
-+
-+ {
-+ UInt32 t;
-+ code -= range;
-+ t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
-+ distance = (distance << 1) + (t + 1);
-+ code += range & t;
-+ }
-+ /*
-+ distance <<= 1;
-+ if (code >= range)
-+ {
-+ code -= range;
-+ distance |= 1;
-+ }
-+ */
-+ }
-+ while (--numDirectBits != 0);
-+ prob = probs + Align;
-+ distance <<= kNumAlignBits;
-+ {
-+ unsigned i = 1;
-+ GET_BIT2(prob + i, i, ; , distance |= 1);
-+ GET_BIT2(prob + i, i, ; , distance |= 2);
-+ GET_BIT2(prob + i, i, ; , distance |= 4);
-+ GET_BIT2(prob + i, i, ; , distance |= 8);
-+ }
-+ if (distance == (UInt32)0xFFFFFFFF)
-+ {
-+ len += kMatchSpecLenStart;
-+ state -= kNumStates;
-+ break;
-+ }
-+ }
-+ }
-+ rep3 = rep2;
-+ rep2 = rep1;
-+ rep1 = rep0;
-+ rep0 = distance + 1;
-+ if (checkDicSize == 0)
-+ {
-+ if (distance >= processedPos)
-+ return SZ_ERROR_DATA;
-+ }
-+ else if (distance >= checkDicSize)
-+ return SZ_ERROR_DATA;
-+ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
-+ }
-+
-+ len += kMatchMinLen;
-+
-+ if (limit == dicPos)
-+ return SZ_ERROR_DATA;
-+ {
-+ SizeT rem = limit - dicPos;
-+ unsigned curLen = ((rem < len) ? (unsigned)rem : len);
-+ SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
-+
-+ processedPos += curLen;
-+
-+ len -= curLen;
-+ if (pos + curLen <= dicBufSize)
-+ {
-+ Byte *dest = dic + dicPos;
-+ ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
-+ const Byte *lim = dest + curLen;
-+ dicPos += curLen;
-+ do
-+ *(dest) = (Byte)*(dest + src);
-+ while (++dest != lim);
-+ }
-+ else
-+ {
-+ do
-+ {
-+ dic[dicPos++] = dic[pos];
-+ if (++pos == dicBufSize)
-+ pos = 0;
-+ }
-+ while (--curLen != 0);
-+ }
-+ }
-+ }
-+ }
-+ while (dicPos < limit && buf < bufLimit);
-+ NORMALIZE;
-+ p->buf = buf;
-+ p->range = range;
-+ p->code = code;
-+ p->remainLen = len;
-+ p->dicPos = dicPos;
-+ p->processedPos = processedPos;
-+ p->reps[0] = rep0;
-+ p->reps[1] = rep1;
-+ p->reps[2] = rep2;
-+ p->reps[3] = rep3;
-+ p->state = state;
-+
-+ return SZ_OK;
-+}
-+
-+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
-+{
-+ if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
-+ {
-+ Byte *dic = p->dic;
-+ SizeT dicPos = p->dicPos;
-+ SizeT dicBufSize = p->dicBufSize;
-+ unsigned len = p->remainLen;
-+ UInt32 rep0 = p->reps[0];
-+ if (limit - dicPos < len)
-+ len = (unsigned)(limit - dicPos);
-+
-+ if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
-+ p->checkDicSize = p->prop.dicSize;
-+
-+ p->processedPos += len;
-+ p->remainLen -= len;
-+ while (len-- != 0)
-+ {
-+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+ dicPos++;
-+ }
-+ p->dicPos = dicPos;
-+ }
-+}
-+
-+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-+{
-+ do
-+ {
-+ SizeT limit2 = limit;
-+ if (p->checkDicSize == 0)
-+ {
-+ UInt32 rem = p->prop.dicSize - p->processedPos;
-+ if (limit - p->dicPos > rem)
-+ limit2 = p->dicPos + rem;
-+ }
-+ RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
-+ if (p->processedPos >= p->prop.dicSize)
-+ p->checkDicSize = p->prop.dicSize;
-+ LzmaDec_WriteRem(p, limit);
-+ }
-+ while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
-+
-+ if (p->remainLen > kMatchSpecLenStart)
-+ {
-+ p->remainLen = kMatchSpecLenStart;
-+ }
-+ return 0;
-+}
-+
-+typedef enum
-+{
-+ DUMMY_ERROR, /* unexpected end of input stream */
-+ DUMMY_LIT,
-+ DUMMY_MATCH,
-+ DUMMY_REP
-+} ELzmaDummy;
-+
-+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
-+{
-+ UInt32 range = p->range;
-+ UInt32 code = p->code;
-+ const Byte *bufLimit = buf + inSize;
-+ CLzmaProb *probs = p->probs;
-+ unsigned state = p->state;
-+ ELzmaDummy res;
-+
-+ {
-+ CLzmaProb *prob;
-+ UInt32 bound;
-+ unsigned ttt;
-+ unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
-+
-+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK
-+
-+ /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
-+
-+ prob = probs + Literal;
-+ if (p->checkDicSize != 0 || p->processedPos != 0)
-+ prob += (LZMA_LIT_SIZE *
-+ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
-+ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
-+
-+ if (state < kNumLitStates)
-+ {
-+ unsigned symbol = 1;
-+ do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
-+ }
-+ else
-+ {
-+ unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
-+ ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
-+ unsigned offs = 0x100;
-+ unsigned symbol = 1;
-+ do
-+ {
-+ unsigned bit;
-+ CLzmaProb *probLit;
-+ matchByte <<= 1;
-+ bit = (matchByte & offs);
-+ probLit = prob + offs + bit + symbol;
-+ GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
-+ }
-+ while (symbol < 0x100);
-+ }
-+ res = DUMMY_LIT;
-+ }
-+ else
-+ {
-+ unsigned len;
-+ UPDATE_1_CHECK;
-+
-+ prob = probs + IsRep + state;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK;
-+ state = 0;
-+ prob = probs + LenCoder;
-+ res = DUMMY_MATCH;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ res = DUMMY_REP;
-+ prob = probs + IsRepG0 + state;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK;
-+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK;
-+ NORMALIZE_CHECK;
-+ return DUMMY_REP;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ }
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ prob = probs + IsRepG1 + state;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ prob = probs + IsRepG2 + state;
-+ IF_BIT_0_CHECK(prob)
-+ {
-+ UPDATE_0_CHECK;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ }
-+ }
-+ }
-+ state = kNumStates;
-+ prob = probs + RepLenCoder;
-+ }
-+ {
-+ unsigned limit, offset;
-+ CLzmaProb *probLen = prob + LenChoice;
-+ IF_BIT_0_CHECK(probLen)
-+ {
-+ UPDATE_0_CHECK;
-+ probLen = prob + LenLow + (posState << kLenNumLowBits);
-+ offset = 0;
-+ limit = 1 << kLenNumLowBits;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ probLen = prob + LenChoice2;
-+ IF_BIT_0_CHECK(probLen)
-+ {
-+ UPDATE_0_CHECK;
-+ probLen = prob + LenMid + (posState << kLenNumMidBits);
-+ offset = kLenNumLowSymbols;
-+ limit = 1 << kLenNumMidBits;
-+ }
-+ else
-+ {
-+ UPDATE_1_CHECK;
-+ probLen = prob + LenHigh;
-+ offset = kLenNumLowSymbols + kLenNumMidSymbols;
-+ limit = 1 << kLenNumHighBits;
-+ }
-+ }
-+ TREE_DECODE_CHECK(probLen, limit, len);
-+ len += offset;
-+ }
-+
-+ if (state < 4)
-+ {
-+ unsigned posSlot;
-+ prob = probs + PosSlot +
-+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-+ kNumPosSlotBits);
-+ TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
-+ if (posSlot >= kStartPosModelIndex)
-+ {
-+ int numDirectBits = ((posSlot >> 1) - 1);
-+
-+ /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
-+
-+ if (posSlot < kEndPosModelIndex)
-+ {
-+ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
-+ }
-+ else
-+ {
-+ numDirectBits -= kNumAlignBits;
-+ do
-+ {
-+ NORMALIZE_CHECK
-+ range >>= 1;
-+ code -= range & (((code - range) >> 31) - 1);
-+ /* if (code >= range) code -= range; */
-+ }
-+ while (--numDirectBits != 0);
-+ prob = probs + Align;
-+ numDirectBits = kNumAlignBits;
-+ }
-+ {
-+ unsigned i = 1;
-+ do
-+ {
-+ GET_BIT_CHECK(prob + i, i);
-+ }
-+ while (--numDirectBits != 0);
-+ }
-+ }
-+ }
-+ }
-+ }
-+ NORMALIZE_CHECK;
-+ return res;
-+}
-+
-+
-+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
-+{
-+ p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
-+ p->range = 0xFFFFFFFF;
-+ p->needFlush = 0;
-+}
-+
-+void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-+{
-+ p->needFlush = 1;
-+ p->remainLen = 0;
-+ p->tempBufSize = 0;
-+
-+ if (initDic)
-+ {
-+ p->processedPos = 0;
-+ p->checkDicSize = 0;
-+ p->needInitState = 1;
-+ }
-+ if (initState)
-+ p->needInitState = 1;
-+}
-+
-+void LzmaDec_Init(CLzmaDec *p)
-+{
-+ p->dicPos = 0;
-+ LzmaDec_InitDicAndState(p, True, True);
-+}
-+
-+static void LzmaDec_InitStateReal(CLzmaDec *p)
-+{
-+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
-+ UInt32 i;
-+ CLzmaProb *probs = p->probs;
-+ for (i = 0; i < numProbs; i++)
-+ probs[i] = kBitModelTotal >> 1;
-+ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
-+ p->state = 0;
-+ p->needInitState = 0;
-+}
-+
-+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-+ ELzmaFinishMode finishMode, ELzmaStatus *status)
-+{
-+ SizeT inSize = *srcLen;
-+ (*srcLen) = 0;
-+ LzmaDec_WriteRem(p, dicLimit);
-+
-+ *status = LZMA_STATUS_NOT_SPECIFIED;
-+
-+ while (p->remainLen != kMatchSpecLenStart)
-+ {
-+ int checkEndMarkNow;
-+
-+ if (p->needFlush != 0)
-+ {
-+ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
-+ p->tempBuf[p->tempBufSize++] = *src++;
-+ if (p->tempBufSize < RC_INIT_SIZE)
-+ {
-+ *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+ return SZ_OK;
-+ }
-+ if (p->tempBuf[0] != 0)
-+ return SZ_ERROR_DATA;
-+
-+ LzmaDec_InitRc(p, p->tempBuf);
-+ p->tempBufSize = 0;
-+ }
-+
-+ checkEndMarkNow = 0;
-+ if (p->dicPos >= dicLimit)
-+ {
-+ if (p->remainLen == 0 && p->code == 0)
-+ {
-+ *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
-+ return SZ_OK;
-+ }
-+ if (finishMode == LZMA_FINISH_ANY)
-+ {
-+ *status = LZMA_STATUS_NOT_FINISHED;
-+ return SZ_OK;
-+ }
-+ if (p->remainLen != 0)
-+ {
-+ *status = LZMA_STATUS_NOT_FINISHED;
-+ return SZ_ERROR_DATA;
-+ }
-+ checkEndMarkNow = 1;
-+ }
-+
-+ if (p->needInitState)
-+ LzmaDec_InitStateReal(p);
-+
-+ if (p->tempBufSize == 0)
-+ {
-+ SizeT processed;
-+ const Byte *bufLimit;
-+ if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
-+ {
-+ int dummyRes = LzmaDec_TryDummy(p, src, inSize);
-+ if (dummyRes == DUMMY_ERROR)
-+ {
-+ memcpy(p->tempBuf, src, inSize);
-+ p->tempBufSize = (unsigned)inSize;
-+ (*srcLen) += inSize;
-+ *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+ return SZ_OK;
-+ }
-+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
-+ {
-+ *status = LZMA_STATUS_NOT_FINISHED;
-+ return SZ_ERROR_DATA;
-+ }
-+ bufLimit = src;
-+ }
-+ else
-+ bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
-+ p->buf = src;
-+ if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
-+ return SZ_ERROR_DATA;
-+ processed = (SizeT)(p->buf - src);
-+ (*srcLen) += processed;
-+ src += processed;
-+ inSize -= processed;
-+ }
-+ else
-+ {
-+ unsigned rem = p->tempBufSize, lookAhead = 0;
-+ while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
-+ p->tempBuf[rem++] = src[lookAhead++];
-+ p->tempBufSize = rem;
-+ if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
-+ {
-+ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
-+ if (dummyRes == DUMMY_ERROR)
-+ {
-+ (*srcLen) += lookAhead;
-+ *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+ return SZ_OK;
-+ }
-+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
-+ {
-+ *status = LZMA_STATUS_NOT_FINISHED;
-+ return SZ_ERROR_DATA;
-+ }
-+ }
-+ p->buf = p->tempBuf;
-+ if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
-+ return SZ_ERROR_DATA;
-+ lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
-+ (*srcLen) += lookAhead;
-+ src += lookAhead;
-+ inSize -= lookAhead;
-+ p->tempBufSize = 0;
-+ }
-+ }
-+ if (p->code == 0)
-+ *status = LZMA_STATUS_FINISHED_WITH_MARK;
-+ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
-+}
-+
-+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-+{
-+ SizeT outSize = *destLen;
-+ SizeT inSize = *srcLen;
-+ *srcLen = *destLen = 0;
-+ for (;;)
-+ {
-+ SizeT inSizeCur = inSize, outSizeCur, dicPos;
-+ ELzmaFinishMode curFinishMode;
-+ SRes res;
-+ if (p->dicPos == p->dicBufSize)
-+ p->dicPos = 0;
-+ dicPos = p->dicPos;
-+ if (outSize > p->dicBufSize - dicPos)
-+ {
-+ outSizeCur = p->dicBufSize;
-+ curFinishMode = LZMA_FINISH_ANY;
-+ }
-+ else
-+ {
-+ outSizeCur = dicPos + outSize;
-+ curFinishMode = finishMode;
-+ }
-+
-+ res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
-+ src += inSizeCur;
-+ inSize -= inSizeCur;
-+ *srcLen += inSizeCur;
-+ outSizeCur = p->dicPos - dicPos;
-+ memcpy(dest, p->dic + dicPos, outSizeCur);
-+ dest += outSizeCur;
-+ outSize -= outSizeCur;
-+ *destLen += outSizeCur;
-+ if (res != 0)
-+ return res;
-+ if (outSizeCur == 0 || outSize == 0)
-+ return SZ_OK;
-+ }
-+}
-+
-+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+ alloc->Free(alloc, p->probs);
-+ p->probs = 0;
-+}
-+
-+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+ alloc->Free(alloc, p->dic);
-+ p->dic = 0;
-+}
-+
-+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+ LzmaDec_FreeProbs(p, alloc);
-+ LzmaDec_FreeDict(p, alloc);
-+}
-+
-+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-+{
-+ UInt32 dicSize;
-+ Byte d;
-+
-+ if (size < LZMA_PROPS_SIZE)
-+ return SZ_ERROR_UNSUPPORTED;
-+ else
-+ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
-+
-+ if (dicSize < LZMA_DIC_MIN)
-+ dicSize = LZMA_DIC_MIN;
-+ p->dicSize = dicSize;
-+
-+ d = data[0];
-+ if (d >= (9 * 5 * 5))
-+ return SZ_ERROR_UNSUPPORTED;
-+
-+ p->lc = d % 9;
-+ d /= 9;
-+ p->pb = d / 5;
-+ p->lp = d % 5;
-+
-+ return SZ_OK;
-+}
-+
-+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
-+{
-+ UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
-+ if (p->probs == 0 || numProbs != p->numProbs)
-+ {
-+ LzmaDec_FreeProbs(p, alloc);
-+ p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
-+ p->numProbs = numProbs;
-+ if (p->probs == 0)
-+ return SZ_ERROR_MEM;
-+ }
-+ return SZ_OK;
-+}
-+
-+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+{
-+ CLzmaProps propNew;
-+ RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-+ p->prop = propNew;
-+ return SZ_OK;
-+}
-+
-+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+{
-+ CLzmaProps propNew;
-+ SizeT dicBufSize;
-+ RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-+ dicBufSize = propNew.dicSize;
-+ if (p->dic == 0 || dicBufSize != p->dicBufSize)
-+ {
-+ LzmaDec_FreeDict(p, alloc);
-+ p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
-+ if (p->dic == 0)
-+ {
-+ LzmaDec_FreeProbs(p, alloc);
-+ return SZ_ERROR_MEM;
-+ }
-+ }
-+ p->dicBufSize = dicBufSize;
-+ p->prop = propNew;
-+ return SZ_OK;
-+}
-+
-+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
-+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
-+ ELzmaStatus *status, ISzAlloc *alloc)
-+{
-+ CLzmaDec p;
-+ SRes res;
-+ SizeT inSize = *srcLen;
-+ SizeT outSize = *destLen;
-+ *srcLen = *destLen = 0;
-+ if (inSize < RC_INIT_SIZE)
-+ return SZ_ERROR_INPUT_EOF;
-+
-+ LzmaDec_Construct(&p);
-+ res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
-+ if (res != 0)
-+ return res;
-+ p.dic = dest;
-+ p.dicBufSize = outSize;
-+
-+ LzmaDec_Init(&p);
-+
-+ *srcLen = inSize;
-+ res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
-+
-+ if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
-+ res = SZ_ERROR_INPUT_EOF;
-+
-+ (*destLen) = p.dicPos;
-+ LzmaDec_FreeProbs(&p, alloc);
-+ return res;
-+}
---- /dev/null
-+++ b/lib/lzma/LzmaEnc.c
-@@ -0,0 +1,2271 @@
-+/* LzmaEnc.c -- LZMA Encoder
-+2009-11-24 : Igor Pavlov : Public domain */
-+
-+#include <string.h>
-+
-+/* #define SHOW_STAT */
-+/* #define SHOW_STAT2 */
-+
-+#if defined(SHOW_STAT) || defined(SHOW_STAT2)
-+#include <stdio.h>
-+#endif
-+
-+#include "LzmaEnc.h"
-+
-+/* disable MT */
-+#define _7ZIP_ST
-+
-+#include "LzFind.h"
-+#ifndef _7ZIP_ST
-+#include "LzFindMt.h"
-+#endif
-+
-+#ifdef SHOW_STAT
-+static int ttt = 0;
-+#endif
-+
-+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)
-+
-+#define kBlockSize (9 << 10)
-+#define kUnpackBlockSize (1 << 18)
-+#define kMatchArraySize (1 << 21)
-+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)
-+
-+#define kNumMaxDirectBits (31)
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+#define kProbInitValue (kBitModelTotal >> 1)
-+
-+#define kNumMoveReducingBits 4
-+#define kNumBitPriceShiftBits 4
-+#define kBitPrice (1 << kNumBitPriceShiftBits)
-+
-+void LzmaEncProps_Init(CLzmaEncProps *p)
-+{
-+ p->level = 5;
-+ p->dictSize = p->mc = 0;
-+ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
-+ p->writeEndMark = 0;
-+}
-+
-+void LzmaEncProps_Normalize(CLzmaEncProps *p)
-+{
-+ int level = p->level;
-+ if (level < 0) level = 5;
-+ p->level = level;
-+ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));
-+ if (p->lc < 0) p->lc = 3;
-+ if (p->lp < 0) p->lp = 0;
-+ if (p->pb < 0) p->pb = 2;
-+ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
-+ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
-+ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
-+ if (p->numHashBytes < 0) p->numHashBytes = 4;
-+ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
-+ if (p->numThreads < 0)
-+ p->numThreads =
-+ #ifndef _7ZIP_ST
-+ ((p->btMode && p->algo) ? 2 : 1);
-+ #else
-+ 1;
-+ #endif
-+}
-+
-+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-+{
-+ CLzmaEncProps props = *props2;
-+ LzmaEncProps_Normalize(&props);
-+ return props.dictSize;
-+}
-+
-+/* #define LZMA_LOG_BSR */
-+/* Define it for Intel's CPU */
-+
-+
-+#ifdef LZMA_LOG_BSR
-+
-+#define kDicLogSizeMaxCompress 30
-+
-+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
-+
-+UInt32 GetPosSlot1(UInt32 pos)
-+{
-+ UInt32 res;
-+ BSR2_RET(pos, res);
-+ return res;
-+}
-+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
-+
-+#else
-+
-+#define kNumLogBits (9 + (int)sizeof(size_t) / 2)
-+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
-+
-+void LzmaEnc_FastPosInit(Byte *g_FastPos)
-+{
-+ int c = 2, slotFast;
-+ g_FastPos[0] = 0;
-+ g_FastPos[1] = 1;
-+
-+ for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)
-+ {
-+ UInt32 k = (1 << ((slotFast >> 1) - 1));
-+ UInt32 j;
-+ for (j = 0; j < k; j++, c++)
-+ g_FastPos[c] = (Byte)slotFast;
-+ }
-+}
-+
-+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \
-+ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
-+ res = p->g_FastPos[pos >> i] + (i * 2); }
-+/*
-+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
-+ p->g_FastPos[pos >> 6] + 12 : \
-+ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
-+*/
-+
-+#define GetPosSlot1(pos) p->g_FastPos[pos]
-+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }
-+
-+#endif
-+
-+
-+#define LZMA_NUM_REPS 4
-+
-+typedef unsigned CState;
-+
-+typedef struct
-+{
-+ UInt32 price;
-+
-+ CState state;
-+ int prev1IsChar;
-+ int prev2;
-+
-+ UInt32 posPrev2;
-+ UInt32 backPrev2;
-+
-+ UInt32 posPrev;
-+ UInt32 backPrev;
-+ UInt32 backs[LZMA_NUM_REPS];
-+} COptimal;
-+
-+#define kNumOpts (1 << 12)
-+
-+#define kNumLenToPosStates 4
-+#define kNumPosSlotBits 6
-+#define kDicLogSizeMin 0
-+#define kDicLogSizeMax 32
-+#define kDistTableSizeMax (kDicLogSizeMax * 2)
-+
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+#define kAlignMask (kAlignTableSize - 1)
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)
-+
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#ifdef _LZMA_PROB32
-+#define CLzmaProb UInt32
-+#else
-+#define CLzmaProb UInt16
-+#endif
-+
-+#define LZMA_PB_MAX 4
-+#define LZMA_LC_MAX 8
-+#define LZMA_LP_MAX 4
-+
-+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
-+
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-+
-+#define LZMA_MATCH_LEN_MIN 2
-+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
-+
-+#define kNumStates 12
-+
-+typedef struct
-+{
-+ CLzmaProb choice;
-+ CLzmaProb choice2;
-+ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];
-+ CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];
-+ CLzmaProb high[kLenNumHighSymbols];
-+} CLenEnc;
-+
-+typedef struct
-+{
-+ CLenEnc p;
-+ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
-+ UInt32 tableSize;
-+ UInt32 counters[LZMA_NUM_PB_STATES_MAX];
-+} CLenPriceEnc;
-+
-+typedef struct
-+{
-+ UInt32 range;
-+ Byte cache;
-+ UInt64 low;
-+ UInt64 cacheSize;
-+ Byte *buf;
-+ Byte *bufLim;
-+ Byte *bufBase;
-+ ISeqOutStream *outStream;
-+ UInt64 processed;
-+ SRes res;
-+} CRangeEnc;
-+
-+typedef struct
-+{
-+ CLzmaProb *litProbs;
-+
-+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+ CLzmaProb isRep[kNumStates];
-+ CLzmaProb isRepG0[kNumStates];
-+ CLzmaProb isRepG1[kNumStates];
-+ CLzmaProb isRepG2[kNumStates];
-+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+
-+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
-+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
-+ CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-+
-+ CLenPriceEnc lenEnc;
-+ CLenPriceEnc repLenEnc;
-+
-+ UInt32 reps[LZMA_NUM_REPS];
-+ UInt32 state;
-+} CSaveState;
-+
-+typedef struct
-+{
-+ IMatchFinder matchFinder;
-+ void *matchFinderObj;
-+
-+ #ifndef _7ZIP_ST
-+ Bool mtMode;
-+ CMatchFinderMt matchFinderMt;
-+ #endif
-+
-+ CMatchFinder matchFinderBase;
-+
-+ #ifndef _7ZIP_ST
-+ Byte pad[128];
-+ #endif
-+
-+ UInt32 optimumEndIndex;
-+ UInt32 optimumCurrentIndex;
-+
-+ UInt32 longestMatchLength;
-+ UInt32 numPairs;
-+ UInt32 numAvail;
-+ COptimal opt[kNumOpts];
-+
-+ #ifndef LZMA_LOG_BSR
-+ Byte g_FastPos[1 << kNumLogBits];
-+ #endif
-+
-+ UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
-+ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
-+ UInt32 numFastBytes;
-+ UInt32 additionalOffset;
-+ UInt32 reps[LZMA_NUM_REPS];
-+ UInt32 state;
-+
-+ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
-+ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
-+ UInt32 alignPrices[kAlignTableSize];
-+ UInt32 alignPriceCount;
-+
-+ UInt32 distTableSize;
-+
-+ unsigned lc, lp, pb;
-+ unsigned lpMask, pbMask;
-+
-+ CLzmaProb *litProbs;
-+
-+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+ CLzmaProb isRep[kNumStates];
-+ CLzmaProb isRepG0[kNumStates];
-+ CLzmaProb isRepG1[kNumStates];
-+ CLzmaProb isRepG2[kNumStates];
-+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+
-+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
-+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
-+ CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-+
-+ CLenPriceEnc lenEnc;
-+ CLenPriceEnc repLenEnc;
-+
-+ unsigned lclp;
-+
-+ Bool fastMode;
-+
-+ CRangeEnc rc;
-+
-+ Bool writeEndMark;
-+ UInt64 nowPos64;
-+ UInt32 matchPriceCount;
-+ Bool finished;
-+ Bool multiThread;
-+
-+ SRes result;
-+ UInt32 dictSize;
-+ UInt32 matchFinderCycles;
-+
-+ int needInit;
-+
-+ CSaveState saveState;
-+} CLzmaEnc;
-+
-+void LzmaEnc_SaveState(CLzmaEncHandle pp)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ CSaveState *dest = &p->saveState;
-+ int i;
-+ dest->lenEnc = p->lenEnc;
-+ dest->repLenEnc = p->repLenEnc;
-+ dest->state = p->state;
-+
-+ for (i = 0; i < kNumStates; i++)
-+ {
-+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-+ }
-+ for (i = 0; i < kNumLenToPosStates; i++)
-+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-+ memcpy(dest->reps, p->reps, sizeof(p->reps));
-+ memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
-+}
-+
-+void LzmaEnc_RestoreState(CLzmaEncHandle pp)
-+{
-+ CLzmaEnc *dest = (CLzmaEnc *)pp;
-+ const CSaveState *p = &dest->saveState;
-+ int i;
-+ dest->lenEnc = p->lenEnc;
-+ dest->repLenEnc = p->repLenEnc;
-+ dest->state = p->state;
-+
-+ for (i = 0; i < kNumStates; i++)
-+ {
-+ memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-+ memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-+ }
-+ for (i = 0; i < kNumLenToPosStates; i++)
-+ memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-+ memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-+ memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-+ memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-+ memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-+ memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-+ memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-+ memcpy(dest->reps, p->reps, sizeof(p->reps));
-+ memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
-+}
-+
-+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ CLzmaEncProps props = *props2;
-+ LzmaEncProps_Normalize(&props);
-+
-+ if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||
-+ props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))
-+ return SZ_ERROR_PARAM;
-+ p->dictSize = props.dictSize;
-+ p->matchFinderCycles = props.mc;
-+ {
-+ unsigned fb = props.fb;
-+ if (fb < 5)
-+ fb = 5;
-+ if (fb > LZMA_MATCH_LEN_MAX)
-+ fb = LZMA_MATCH_LEN_MAX;
-+ p->numFastBytes = fb;
-+ }
-+ p->lc = props.lc;
-+ p->lp = props.lp;
-+ p->pb = props.pb;
-+ p->fastMode = (props.algo == 0);
-+ p->matchFinderBase.btMode = props.btMode;
-+ {
-+ UInt32 numHashBytes = 4;
-+ if (props.btMode)
-+ {
-+ if (props.numHashBytes < 2)
-+ numHashBytes = 2;
-+ else if (props.numHashBytes < 4)
-+ numHashBytes = props.numHashBytes;
-+ }
-+ p->matchFinderBase.numHashBytes = numHashBytes;
-+ }
-+
-+ p->matchFinderBase.cutValue = props.mc;
-+
-+ p->writeEndMark = props.writeEndMark;
-+
-+ #ifndef _7ZIP_ST
-+ /*
-+ if (newMultiThread != _multiThread)
-+ {
-+ ReleaseMatchFinder();
-+ _multiThread = newMultiThread;
-+ }
-+ */
-+ p->multiThread = (props.numThreads > 1);
-+ #endif
-+
-+ return SZ_OK;
-+}
-+
-+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5};
-+static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
-+static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
-+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
-+
-+#define IsCharState(s) ((s) < 7)
-+
-+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
-+
-+#define kInfinityPrice (1 << 30)
-+
-+static void RangeEnc_Construct(CRangeEnc *p)
-+{
-+ p->outStream = 0;
-+ p->bufBase = 0;
-+}
-+
-+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
-+
-+#define RC_BUF_SIZE (1 << 16)
-+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)
-+{
-+ if (p->bufBase == 0)
-+ {
-+ p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);
-+ if (p->bufBase == 0)
-+ return 0;
-+ p->bufLim = p->bufBase + RC_BUF_SIZE;
-+ }
-+ return 1;
-+}
-+
-+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)
-+{
-+ alloc->Free(alloc, p->bufBase);
-+ p->bufBase = 0;
-+}
-+
-+static void RangeEnc_Init(CRangeEnc *p)
-+{
-+ /* Stream.Init(); */
-+ p->low = 0;
-+ p->range = 0xFFFFFFFF;
-+ p->cacheSize = 1;
-+ p->cache = 0;
-+
-+ p->buf = p->bufBase;
-+
-+ p->processed = 0;
-+ p->res = SZ_OK;
-+}
-+
-+static void RangeEnc_FlushStream(CRangeEnc *p)
-+{
-+ size_t num;
-+ if (p->res != SZ_OK)
-+ return;
-+ num = p->buf - p->bufBase;
-+ if (num != p->outStream->Write(p->outStream, p->bufBase, num))
-+ p->res = SZ_ERROR_WRITE;
-+ p->processed += num;
-+ p->buf = p->bufBase;
-+}
-+
-+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
-+{
-+ if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)
-+ {
-+ Byte temp = p->cache;
-+ do
-+ {
-+ Byte *buf = p->buf;
-+ *buf++ = (Byte)(temp + (Byte)(p->low >> 32));
-+ p->buf = buf;
-+ if (buf == p->bufLim)
-+ RangeEnc_FlushStream(p);
-+ temp = 0xFF;
-+ }
-+ while (--p->cacheSize != 0);
-+ p->cache = (Byte)((UInt32)p->low >> 24);
-+ }
-+ p->cacheSize++;
-+ p->low = (UInt32)p->low << 8;
-+}
-+
-+static void RangeEnc_FlushData(CRangeEnc *p)
-+{
-+ int i;
-+ for (i = 0; i < 5; i++)
-+ RangeEnc_ShiftLow(p);
-+}
-+
-+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)
-+{
-+ do
-+ {
-+ p->range >>= 1;
-+ p->low += p->range & (0 - ((value >> --numBits) & 1));
-+ if (p->range < kTopValue)
-+ {
-+ p->range <<= 8;
-+ RangeEnc_ShiftLow(p);
-+ }
-+ }
-+ while (numBits != 0);
-+}
-+
-+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)
-+{
-+ UInt32 ttt = *prob;
-+ UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;
-+ if (symbol == 0)
-+ {
-+ p->range = newBound;
-+ ttt += (kBitModelTotal - ttt) >> kNumMoveBits;
-+ }
-+ else
-+ {
-+ p->low += newBound;
-+ p->range -= newBound;
-+ ttt -= ttt >> kNumMoveBits;
-+ }
-+ *prob = (CLzmaProb)ttt;
-+ if (p->range < kTopValue)
-+ {
-+ p->range <<= 8;
-+ RangeEnc_ShiftLow(p);
-+ }
-+}
-+
-+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)
-+{
-+ symbol |= 0x100;
-+ do
-+ {
-+ RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);
-+ symbol <<= 1;
-+ }
-+ while (symbol < 0x10000);
-+}
-+
-+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)
-+{
-+ UInt32 offs = 0x100;
-+ symbol |= 0x100;
-+ do
-+ {
-+ matchByte <<= 1;
-+ RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);
-+ symbol <<= 1;
-+ offs &= ~(matchByte ^ symbol);
-+ }
-+ while (symbol < 0x10000);
-+}
-+
-+void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-+{
-+ UInt32 i;
-+ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
-+ {
-+ const int kCyclesBits = kNumBitPriceShiftBits;
-+ UInt32 w = i;
-+ UInt32 bitCount = 0;
-+ int j;
-+ for (j = 0; j < kCyclesBits; j++)
-+ {
-+ w = w * w;
-+ bitCount <<= 1;
-+ while (w >= ((UInt32)1 << 16))
-+ {
-+ w >>= 1;
-+ bitCount++;
-+ }
-+ }
-+ ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
-+ }
-+}
-+
-+
-+#define GET_PRICE(prob, symbol) \
-+ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-+
-+#define GET_PRICEa(prob, symbol) \
-+ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-+
-+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
-+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-+
-+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
-+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-+
-+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+ UInt32 price = 0;
-+ symbol |= 0x100;
-+ do
-+ {
-+ price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);
-+ symbol <<= 1;
-+ }
-+ while (symbol < 0x10000);
-+ return price;
-+}
-+
-+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)
-+{
-+ UInt32 price = 0;
-+ UInt32 offs = 0x100;
-+ symbol |= 0x100;
-+ do
-+ {
-+ matchByte <<= 1;
-+ price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);
-+ symbol <<= 1;
-+ offs &= ~(matchByte ^ symbol);
-+ }
-+ while (symbol < 0x10000);
-+ return price;
-+}
-+
-+
-+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-+{
-+ UInt32 m = 1;
-+ int i;
-+ for (i = numBitLevels; i != 0;)
-+ {
-+ UInt32 bit;
-+ i--;
-+ bit = (symbol >> i) & 1;
-+ RangeEnc_EncodeBit(rc, probs + m, bit);
-+ m = (m << 1) | bit;
-+ }
-+}
-+
-+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-+{
-+ UInt32 m = 1;
-+ int i;
-+ for (i = 0; i < numBitLevels; i++)
-+ {
-+ UInt32 bit = symbol & 1;
-+ RangeEnc_EncodeBit(rc, probs + m, bit);
-+ m = (m << 1) | bit;
-+ symbol >>= 1;
-+ }
-+}
-+
-+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+ UInt32 price = 0;
-+ symbol |= (1 << numBitLevels);
-+ while (symbol != 1)
-+ {
-+ price += GET_PRICEa(probs[symbol >> 1], symbol & 1);
-+ symbol >>= 1;
-+ }
-+ return price;
-+}
-+
-+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+ UInt32 price = 0;
-+ UInt32 m = 1;
-+ int i;
-+ for (i = numBitLevels; i != 0; i--)
-+ {
-+ UInt32 bit = symbol & 1;
-+ symbol >>= 1;
-+ price += GET_PRICEa(probs[m], bit);
-+ m = (m << 1) | bit;
-+ }
-+ return price;
-+}
-+
-+
-+static void LenEnc_Init(CLenEnc *p)
-+{
-+ unsigned i;
-+ p->choice = p->choice2 = kProbInitValue;
-+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)
-+ p->low[i] = kProbInitValue;
-+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)
-+ p->mid[i] = kProbInitValue;
-+ for (i = 0; i < kLenNumHighSymbols; i++)
-+ p->high[i] = kProbInitValue;
-+}
-+
-+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)
-+{
-+ if (symbol < kLenNumLowSymbols)
-+ {
-+ RangeEnc_EncodeBit(rc, &p->choice, 0);
-+ RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);
-+ }
-+ else
-+ {
-+ RangeEnc_EncodeBit(rc, &p->choice, 1);
-+ if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)
-+ {
-+ RangeEnc_EncodeBit(rc, &p->choice2, 0);
-+ RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);
-+ }
-+ else
-+ {
-+ RangeEnc_EncodeBit(rc, &p->choice2, 1);
-+ RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);
-+ }
-+ }
-+}
-+
-+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)
-+{
-+ UInt32 a0 = GET_PRICE_0a(p->choice);
-+ UInt32 a1 = GET_PRICE_1a(p->choice);
-+ UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);
-+ UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);
-+ UInt32 i = 0;
-+ for (i = 0; i < kLenNumLowSymbols; i++)
-+ {
-+ if (i >= numSymbols)
-+ return;
-+ prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);
-+ }
-+ for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)
-+ {
-+ if (i >= numSymbols)
-+ return;
-+ prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);
-+ }
-+ for (; i < numSymbols; i++)
-+ prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);
-+}
-+
-+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)
-+{
-+ LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);
-+ p->counters[posState] = p->tableSize;
-+}
-+
-+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)
-+{
-+ UInt32 posState;
-+ for (posState = 0; posState < numPosStates; posState++)
-+ LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-+}
-+
-+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)
-+{
-+ LenEnc_Encode(&p->p, rc, symbol, posState);
-+ if (updatePrice)
-+ if (--p->counters[posState] == 0)
-+ LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-+}
-+
-+
-+
-+
-+static void MovePos(CLzmaEnc *p, UInt32 num)
-+{
-+ #ifdef SHOW_STAT
-+ ttt += num;
-+ printf("\n MovePos %d", num);
-+ #endif
-+ if (num != 0)
-+ {
-+ p->additionalOffset += num;
-+ p->matchFinder.Skip(p->matchFinderObj, num);
-+ }
-+}
-+
-+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)
-+{
-+ UInt32 lenRes = 0, numPairs;
-+ p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-+ numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);
-+ #ifdef SHOW_STAT
-+ printf("\n i = %d numPairs = %d ", ttt, numPairs / 2);
-+ ttt++;
-+ {
-+ UInt32 i;
-+ for (i = 0; i < numPairs; i += 2)
-+ printf("%2d %6d | ", p->matches[i], p->matches[i + 1]);
-+ }
-+ #endif
-+ if (numPairs > 0)
-+ {
-+ lenRes = p->matches[numPairs - 2];
-+ if (lenRes == p->numFastBytes)
-+ {
-+ const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+ UInt32 distance = p->matches[numPairs - 1] + 1;
-+ UInt32 numAvail = p->numAvail;
-+ if (numAvail > LZMA_MATCH_LEN_MAX)
-+ numAvail = LZMA_MATCH_LEN_MAX;
-+ {
-+ const Byte *pby2 = pby - distance;
-+ for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);
-+ }
-+ }
-+ }
-+ p->additionalOffset++;
-+ *numDistancePairsRes = numPairs;
-+ return lenRes;
-+}
-+
-+
-+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;
-+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;
-+#define IsShortRep(p) ((p)->backPrev == 0)
-+
-+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)
-+{
-+ return
-+ GET_PRICE_0(p->isRepG0[state]) +
-+ GET_PRICE_0(p->isRep0Long[state][posState]);
-+}
-+
-+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)
-+{
-+ UInt32 price;
-+ if (repIndex == 0)
-+ {
-+ price = GET_PRICE_0(p->isRepG0[state]);
-+ price += GET_PRICE_1(p->isRep0Long[state][posState]);
-+ }
-+ else
-+ {
-+ price = GET_PRICE_1(p->isRepG0[state]);
-+ if (repIndex == 1)
-+ price += GET_PRICE_0(p->isRepG1[state]);
-+ else
-+ {
-+ price += GET_PRICE_1(p->isRepG1[state]);
-+ price += GET_PRICE(p->isRepG2[state], repIndex - 2);
-+ }
-+ }
-+ return price;
-+}
-+
-+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)
-+{
-+ return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +
-+ GetPureRepPrice(p, repIndex, state, posState);
-+}
-+
-+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)
-+{
-+ UInt32 posMem = p->opt[cur].posPrev;
-+ UInt32 backMem = p->opt[cur].backPrev;
-+ p->optimumEndIndex = cur;
-+ do
-+ {
-+ if (p->opt[cur].prev1IsChar)
-+ {
-+ MakeAsChar(&p->opt[posMem])
-+ p->opt[posMem].posPrev = posMem - 1;
-+ if (p->opt[cur].prev2)
-+ {
-+ p->opt[posMem - 1].prev1IsChar = False;
-+ p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;
-+ p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;
-+ }
-+ }
-+ {
-+ UInt32 posPrev = posMem;
-+ UInt32 backCur = backMem;
-+
-+ backMem = p->opt[posPrev].backPrev;
-+ posMem = p->opt[posPrev].posPrev;
-+
-+ p->opt[posPrev].backPrev = backCur;
-+ p->opt[posPrev].posPrev = cur;
-+ cur = posPrev;
-+ }
-+ }
-+ while (cur != 0);
-+ *backRes = p->opt[0].backPrev;
-+ p->optimumCurrentIndex = p->opt[0].posPrev;
-+ return p->optimumCurrentIndex;
-+}
-+
-+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)
-+
-+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)
-+{
-+ UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;
-+ UInt32 matchPrice, repMatchPrice, normalMatchPrice;
-+ UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];
-+ UInt32 *matches;
-+ const Byte *data;
-+ Byte curByte, matchByte;
-+ if (p->optimumEndIndex != p->optimumCurrentIndex)
-+ {
-+ const COptimal *opt = &p->opt[p->optimumCurrentIndex];
-+ UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;
-+ *backRes = opt->backPrev;
-+ p->optimumCurrentIndex = opt->posPrev;
-+ return lenRes;
-+ }
-+ p->optimumCurrentIndex = p->optimumEndIndex = 0;
-+
-+ if (p->additionalOffset == 0)
-+ mainLen = ReadMatchDistances(p, &numPairs);
-+ else
-+ {
-+ mainLen = p->longestMatchLength;
-+ numPairs = p->numPairs;
-+ }
-+
-+ numAvail = p->numAvail;
-+ if (numAvail < 2)
-+ {
-+ *backRes = (UInt32)(-1);
-+ return 1;
-+ }
-+ if (numAvail > LZMA_MATCH_LEN_MAX)
-+ numAvail = LZMA_MATCH_LEN_MAX;
-+
-+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+ repMaxIndex = 0;
-+ for (i = 0; i < LZMA_NUM_REPS; i++)
-+ {
-+ UInt32 lenTest;
-+ const Byte *data2;
-+ reps[i] = p->reps[i];
-+ data2 = data - (reps[i] + 1);
-+ if (data[0] != data2[0] || data[1] != data2[1])
-+ {
-+ repLens[i] = 0;
-+ continue;
-+ }
-+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
-+ repLens[i] = lenTest;
-+ if (lenTest > repLens[repMaxIndex])
-+ repMaxIndex = i;
-+ }
-+ if (repLens[repMaxIndex] >= p->numFastBytes)
-+ {
-+ UInt32 lenRes;
-+ *backRes = repMaxIndex;
-+ lenRes = repLens[repMaxIndex];
-+ MovePos(p, lenRes - 1);
-+ return lenRes;
-+ }
-+
-+ matches = p->matches;
-+ if (mainLen >= p->numFastBytes)
-+ {
-+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
-+ MovePos(p, mainLen - 1);
-+ return mainLen;
-+ }
-+ curByte = *data;
-+ matchByte = *(data - (reps[0] + 1));
-+
-+ if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)
-+ {
-+ *backRes = (UInt32)-1;
-+ return 1;
-+ }
-+
-+ p->opt[0].state = (CState)p->state;
-+
-+ posState = (position & p->pbMask);
-+
-+ {
-+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
-+ p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +
-+ (!IsCharState(p->state) ?
-+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
-+ LitEnc_GetPrice(probs, curByte, p->ProbPrices));
-+ }
-+
-+ MakeAsChar(&p->opt[1]);
-+
-+ matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);
-+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);
-+
-+ if (matchByte == curByte)
-+ {
-+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);
-+ if (shortRepPrice < p->opt[1].price)
-+ {
-+ p->opt[1].price = shortRepPrice;
-+ MakeAsShortRep(&p->opt[1]);
-+ }
-+ }
-+ lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);
-+
-+ if (lenEnd < 2)
-+ {
-+ *backRes = p->opt[1].backPrev;
-+ return 1;
-+ }
-+
-+ p->opt[1].posPrev = 0;
-+ for (i = 0; i < LZMA_NUM_REPS; i++)
-+ p->opt[0].backs[i] = reps[i];
-+
-+ len = lenEnd;
-+ do
-+ p->opt[len--].price = kInfinityPrice;
-+ while (len >= 2);
-+
-+ for (i = 0; i < LZMA_NUM_REPS; i++)
-+ {
-+ UInt32 repLen = repLens[i];
-+ UInt32 price;
-+ if (repLen < 2)
-+ continue;
-+ price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);
-+ do
-+ {
-+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];
-+ COptimal *opt = &p->opt[repLen];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = 0;
-+ opt->backPrev = i;
-+ opt->prev1IsChar = False;
-+ }
-+ }
-+ while (--repLen >= 2);
-+ }
-+
-+ normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);
-+
-+ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
-+ if (len <= mainLen)
-+ {
-+ UInt32 offs = 0;
-+ while (len > matches[offs])
-+ offs += 2;
-+ for (; ; len++)
-+ {
-+ COptimal *opt;
-+ UInt32 distance = matches[offs + 1];
-+
-+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];
-+ UInt32 lenToPosState = GetLenToPosState(len);
-+ if (distance < kNumFullDistances)
-+ curAndLenPrice += p->distancesPrices[lenToPosState][distance];
-+ else
-+ {
-+ UInt32 slot;
-+ GetPosSlot2(distance, slot);
-+ curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];
-+ }
-+ opt = &p->opt[len];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = 0;
-+ opt->backPrev = distance + LZMA_NUM_REPS;
-+ opt->prev1IsChar = False;
-+ }
-+ if (len == matches[offs])
-+ {
-+ offs += 2;
-+ if (offs == numPairs)
-+ break;
-+ }
-+ }
-+ }
-+
-+ cur = 0;
-+
-+ #ifdef SHOW_STAT2
-+ if (position >= 0)
-+ {
-+ unsigned i;
-+ printf("\n pos = %4X", position);
-+ for (i = cur; i <= lenEnd; i++)
-+ printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price);
-+ }
-+ #endif
-+
-+ for (;;)
-+ {
-+ UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;
-+ UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;
-+ Bool nextIsChar;
-+ Byte curByte, matchByte;
-+ const Byte *data;
-+ COptimal *curOpt;
-+ COptimal *nextOpt;
-+
-+ cur++;
-+ if (cur == lenEnd)
-+ return Backward(p, backRes, cur);
-+
-+ newLen = ReadMatchDistances(p, &numPairs);
-+ if (newLen >= p->numFastBytes)
-+ {
-+ p->numPairs = numPairs;
-+ p->longestMatchLength = newLen;
-+ return Backward(p, backRes, cur);
-+ }
-+ position++;
-+ curOpt = &p->opt[cur];
-+ posPrev = curOpt->posPrev;
-+ if (curOpt->prev1IsChar)
-+ {
-+ posPrev--;
-+ if (curOpt->prev2)
-+ {
-+ state = p->opt[curOpt->posPrev2].state;
-+ if (curOpt->backPrev2 < LZMA_NUM_REPS)
-+ state = kRepNextStates[state];
-+ else
-+ state = kMatchNextStates[state];
-+ }
-+ else
-+ state = p->opt[posPrev].state;
-+ state = kLiteralNextStates[state];
-+ }
-+ else
-+ state = p->opt[posPrev].state;
-+ if (posPrev == cur - 1)
-+ {
-+ if (IsShortRep(curOpt))
-+ state = kShortRepNextStates[state];
-+ else
-+ state = kLiteralNextStates[state];
-+ }
-+ else
-+ {
-+ UInt32 pos;
-+ const COptimal *prevOpt;
-+ if (curOpt->prev1IsChar && curOpt->prev2)
-+ {
-+ posPrev = curOpt->posPrev2;
-+ pos = curOpt->backPrev2;
-+ state = kRepNextStates[state];
-+ }
-+ else
-+ {
-+ pos = curOpt->backPrev;
-+ if (pos < LZMA_NUM_REPS)
-+ state = kRepNextStates[state];
-+ else
-+ state = kMatchNextStates[state];
-+ }
-+ prevOpt = &p->opt[posPrev];
-+ if (pos < LZMA_NUM_REPS)
-+ {
-+ UInt32 i;
-+ reps[0] = prevOpt->backs[pos];
-+ for (i = 1; i <= pos; i++)
-+ reps[i] = prevOpt->backs[i - 1];
-+ for (; i < LZMA_NUM_REPS; i++)
-+ reps[i] = prevOpt->backs[i];
-+ }
-+ else
-+ {
-+ UInt32 i;
-+ reps[0] = (pos - LZMA_NUM_REPS);
-+ for (i = 1; i < LZMA_NUM_REPS; i++)
-+ reps[i] = prevOpt->backs[i - 1];
-+ }
-+ }
-+ curOpt->state = (CState)state;
-+
-+ curOpt->backs[0] = reps[0];
-+ curOpt->backs[1] = reps[1];
-+ curOpt->backs[2] = reps[2];
-+ curOpt->backs[3] = reps[3];
-+
-+ curPrice = curOpt->price;
-+ nextIsChar = False;
-+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+ curByte = *data;
-+ matchByte = *(data - (reps[0] + 1));
-+
-+ posState = (position & p->pbMask);
-+
-+ curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);
-+ {
-+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
-+ curAnd1Price +=
-+ (!IsCharState(state) ?
-+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
-+ LitEnc_GetPrice(probs, curByte, p->ProbPrices));
-+ }
-+
-+ nextOpt = &p->opt[cur + 1];
-+
-+ if (curAnd1Price < nextOpt->price)
-+ {
-+ nextOpt->price = curAnd1Price;
-+ nextOpt->posPrev = cur;
-+ MakeAsChar(nextOpt);
-+ nextIsChar = True;
-+ }
-+
-+ matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);
-+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);
-+
-+ if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))
-+ {
-+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);
-+ if (shortRepPrice <= nextOpt->price)
-+ {
-+ nextOpt->price = shortRepPrice;
-+ nextOpt->posPrev = cur;
-+ MakeAsShortRep(nextOpt);
-+ nextIsChar = True;
-+ }
-+ }
-+ numAvailFull = p->numAvail;
-+ {
-+ UInt32 temp = kNumOpts - 1 - cur;
-+ if (temp < numAvailFull)
-+ numAvailFull = temp;
-+ }
-+
-+ if (numAvailFull < 2)
-+ continue;
-+ numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);
-+
-+ if (!nextIsChar && matchByte != curByte) /* speed optimization */
-+ {
-+ /* try Literal + rep0 */
-+ UInt32 temp;
-+ UInt32 lenTest2;
-+ const Byte *data2 = data - (reps[0] + 1);
-+ UInt32 limit = p->numFastBytes + 1;
-+ if (limit > numAvailFull)
-+ limit = numAvailFull;
-+
-+ for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);
-+ lenTest2 = temp - 1;
-+ if (lenTest2 >= 2)
-+ {
-+ UInt32 state2 = kLiteralNextStates[state];
-+ UInt32 posStateNext = (position + 1) & p->pbMask;
-+ UInt32 nextRepMatchPrice = curAnd1Price +
-+ GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+ GET_PRICE_1(p->isRep[state2]);
-+ /* for (; lenTest2 >= 2; lenTest2--) */
-+ {
-+ UInt32 curAndLenPrice;
-+ COptimal *opt;
-+ UInt32 offset = cur + 1 + lenTest2;
-+ while (lenEnd < offset)
-+ p->opt[++lenEnd].price = kInfinityPrice;
-+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+ opt = &p->opt[offset];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = cur + 1;
-+ opt->backPrev = 0;
-+ opt->prev1IsChar = True;
-+ opt->prev2 = False;
-+ }
-+ }
-+ }
-+ }
-+
-+ startLen = 2; /* speed optimization */
-+ {
-+ UInt32 repIndex;
-+ for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)
-+ {
-+ UInt32 lenTest;
-+ UInt32 lenTestTemp;
-+ UInt32 price;
-+ const Byte *data2 = data - (reps[repIndex] + 1);
-+ if (data[0] != data2[0] || data[1] != data2[1])
-+ continue;
-+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
-+ while (lenEnd < cur + lenTest)
-+ p->opt[++lenEnd].price = kInfinityPrice;
-+ lenTestTemp = lenTest;
-+ price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);
-+ do
-+ {
-+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];
-+ COptimal *opt = &p->opt[cur + lenTest];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = cur;
-+ opt->backPrev = repIndex;
-+ opt->prev1IsChar = False;
-+ }
-+ }
-+ while (--lenTest >= 2);
-+ lenTest = lenTestTemp;
-+
-+ if (repIndex == 0)
-+ startLen = lenTest + 1;
-+
-+ /* if (_maxMode) */
-+ {
-+ UInt32 lenTest2 = lenTest + 1;
-+ UInt32 limit = lenTest2 + p->numFastBytes;
-+ UInt32 nextRepMatchPrice;
-+ if (limit > numAvailFull)
-+ limit = numAvailFull;
-+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
-+ lenTest2 -= lenTest + 1;
-+ if (lenTest2 >= 2)
-+ {
-+ UInt32 state2 = kRepNextStates[state];
-+ UInt32 posStateNext = (position + lenTest) & p->pbMask;
-+ UInt32 curAndLenCharPrice =
-+ price + p->repLenEnc.prices[posState][lenTest - 2] +
-+ GET_PRICE_0(p->isMatch[state2][posStateNext]) +
-+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
-+ data[lenTest], data2[lenTest], p->ProbPrices);
-+ state2 = kLiteralNextStates[state2];
-+ posStateNext = (position + lenTest + 1) & p->pbMask;
-+ nextRepMatchPrice = curAndLenCharPrice +
-+ GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+ GET_PRICE_1(p->isRep[state2]);
-+
-+ /* for (; lenTest2 >= 2; lenTest2--) */
-+ {
-+ UInt32 curAndLenPrice;
-+ COptimal *opt;
-+ UInt32 offset = cur + lenTest + 1 + lenTest2;
-+ while (lenEnd < offset)
-+ p->opt[++lenEnd].price = kInfinityPrice;
-+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+ opt = &p->opt[offset];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = cur + lenTest + 1;
-+ opt->backPrev = 0;
-+ opt->prev1IsChar = True;
-+ opt->prev2 = True;
-+ opt->posPrev2 = cur;
-+ opt->backPrev2 = repIndex;
-+ }
-+ }
-+ }
-+ }
-+ }
-+ }
-+ /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */
-+ if (newLen > numAvail)
-+ {
-+ newLen = numAvail;
-+ for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);
-+ matches[numPairs] = newLen;
-+ numPairs += 2;
-+ }
-+ if (newLen >= startLen)
-+ {
-+ UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);
-+ UInt32 offs, curBack, posSlot;
-+ UInt32 lenTest;
-+ while (lenEnd < cur + newLen)
-+ p->opt[++lenEnd].price = kInfinityPrice;
-+
-+ offs = 0;
-+ while (startLen > matches[offs])
-+ offs += 2;
-+ curBack = matches[offs + 1];
-+ GetPosSlot2(curBack, posSlot);
-+ for (lenTest = /*2*/ startLen; ; lenTest++)
-+ {
-+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];
-+ UInt32 lenToPosState = GetLenToPosState(lenTest);
-+ COptimal *opt;
-+ if (curBack < kNumFullDistances)
-+ curAndLenPrice += p->distancesPrices[lenToPosState][curBack];
-+ else
-+ curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];
-+
-+ opt = &p->opt[cur + lenTest];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = cur;
-+ opt->backPrev = curBack + LZMA_NUM_REPS;
-+ opt->prev1IsChar = False;
-+ }
-+
-+ if (/*_maxMode && */lenTest == matches[offs])
-+ {
-+ /* Try Match + Literal + Rep0 */
-+ const Byte *data2 = data - (curBack + 1);
-+ UInt32 lenTest2 = lenTest + 1;
-+ UInt32 limit = lenTest2 + p->numFastBytes;
-+ UInt32 nextRepMatchPrice;
-+ if (limit > numAvailFull)
-+ limit = numAvailFull;
-+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
-+ lenTest2 -= lenTest + 1;
-+ if (lenTest2 >= 2)
-+ {
-+ UInt32 state2 = kMatchNextStates[state];
-+ UInt32 posStateNext = (position + lenTest) & p->pbMask;
-+ UInt32 curAndLenCharPrice = curAndLenPrice +
-+ GET_PRICE_0(p->isMatch[state2][posStateNext]) +
-+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
-+ data[lenTest], data2[lenTest], p->ProbPrices);
-+ state2 = kLiteralNextStates[state2];
-+ posStateNext = (posStateNext + 1) & p->pbMask;
-+ nextRepMatchPrice = curAndLenCharPrice +
-+ GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+ GET_PRICE_1(p->isRep[state2]);
-+
-+ /* for (; lenTest2 >= 2; lenTest2--) */
-+ {
-+ UInt32 offset = cur + lenTest + 1 + lenTest2;
-+ UInt32 curAndLenPrice;
-+ COptimal *opt;
-+ while (lenEnd < offset)
-+ p->opt[++lenEnd].price = kInfinityPrice;
-+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+ opt = &p->opt[offset];
-+ if (curAndLenPrice < opt->price)
-+ {
-+ opt->price = curAndLenPrice;
-+ opt->posPrev = cur + lenTest + 1;
-+ opt->backPrev = 0;
-+ opt->prev1IsChar = True;
-+ opt->prev2 = True;
-+ opt->posPrev2 = cur;
-+ opt->backPrev2 = curBack + LZMA_NUM_REPS;
-+ }
-+ }
-+ }
-+ offs += 2;
-+ if (offs == numPairs)
-+ break;
-+ curBack = matches[offs + 1];
-+ if (curBack >= kNumFullDistances)
-+ GetPosSlot2(curBack, posSlot);
-+ }
-+ }
-+ }
-+ }
-+}
-+
-+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))
-+
-+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)
-+{
-+ UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;
-+ const Byte *data;
-+ const UInt32 *matches;
-+
-+ if (p->additionalOffset == 0)
-+ mainLen = ReadMatchDistances(p, &numPairs);
-+ else
-+ {
-+ mainLen = p->longestMatchLength;
-+ numPairs = p->numPairs;
-+ }
-+
-+ numAvail = p->numAvail;
-+ *backRes = (UInt32)-1;
-+ if (numAvail < 2)
-+ return 1;
-+ if (numAvail > LZMA_MATCH_LEN_MAX)
-+ numAvail = LZMA_MATCH_LEN_MAX;
-+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+
-+ repLen = repIndex = 0;
-+ for (i = 0; i < LZMA_NUM_REPS; i++)
-+ {
-+ UInt32 len;
-+ const Byte *data2 = data - (p->reps[i] + 1);
-+ if (data[0] != data2[0] || data[1] != data2[1])
-+ continue;
-+ for (len = 2; len < numAvail && data[len] == data2[len]; len++);
-+ if (len >= p->numFastBytes)
-+ {
-+ *backRes = i;
-+ MovePos(p, len - 1);
-+ return len;
-+ }
-+ if (len > repLen)
-+ {
-+ repIndex = i;
-+ repLen = len;
-+ }
-+ }
-+
-+ matches = p->matches;
-+ if (mainLen >= p->numFastBytes)
-+ {
-+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
-+ MovePos(p, mainLen - 1);
-+ return mainLen;
-+ }
-+
-+ mainDist = 0; /* for GCC */
-+ if (mainLen >= 2)
-+ {
-+ mainDist = matches[numPairs - 1];
-+ while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)
-+ {
-+ if (!ChangePair(matches[numPairs - 3], mainDist))
-+ break;
-+ numPairs -= 2;
-+ mainLen = matches[numPairs - 2];
-+ mainDist = matches[numPairs - 1];
-+ }
-+ if (mainLen == 2 && mainDist >= 0x80)
-+ mainLen = 1;
-+ }
-+
-+ if (repLen >= 2 && (
-+ (repLen + 1 >= mainLen) ||
-+ (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||
-+ (repLen + 3 >= mainLen && mainDist >= (1 << 15))))
-+ {
-+ *backRes = repIndex;
-+ MovePos(p, repLen - 1);
-+ return repLen;
-+ }
-+
-+ if (mainLen < 2 || numAvail <= 2)
-+ return 1;
-+
-+ p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);
-+ if (p->longestMatchLength >= 2)
-+ {
-+ UInt32 newDistance = matches[p->numPairs - 1];
-+ if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||
-+ (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||
-+ (p->longestMatchLength > mainLen + 1) ||
-+ (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))
-+ return 1;
-+ }
-+
-+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+ for (i = 0; i < LZMA_NUM_REPS; i++)
-+ {
-+ UInt32 len, limit;
-+ const Byte *data2 = data - (p->reps[i] + 1);
-+ if (data[0] != data2[0] || data[1] != data2[1])
-+ continue;
-+ limit = mainLen - 1;
-+ for (len = 2; len < limit && data[len] == data2[len]; len++);
-+ if (len >= limit)
-+ return 1;
-+ }
-+ *backRes = mainDist + LZMA_NUM_REPS;
-+ MovePos(p, mainLen - 2);
-+ return mainLen;
-+}
-+
-+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)
-+{
-+ UInt32 len;
-+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
-+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
-+ p->state = kMatchNextStates[p->state];
-+ len = LZMA_MATCH_LEN_MIN;
-+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);
-+ RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);
-+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);
-+}
-+
-+static SRes CheckErrors(CLzmaEnc *p)
-+{
-+ if (p->result != SZ_OK)
-+ return p->result;
-+ if (p->rc.res != SZ_OK)
-+ p->result = SZ_ERROR_WRITE;
-+ if (p->matchFinderBase.result != SZ_OK)
-+ p->result = SZ_ERROR_READ;
-+ if (p->result != SZ_OK)
-+ p->finished = True;
-+ return p->result;
-+}
-+
-+static SRes Flush(CLzmaEnc *p, UInt32 nowPos)
-+{
-+ /* ReleaseMFStream(); */
-+ p->finished = True;
-+ if (p->writeEndMark)
-+ WriteEndMarker(p, nowPos & p->pbMask);
-+ RangeEnc_FlushData(&p->rc);
-+ RangeEnc_FlushStream(&p->rc);
-+ return CheckErrors(p);
-+}
-+
-+static void FillAlignPrices(CLzmaEnc *p)
-+{
-+ UInt32 i;
-+ for (i = 0; i < kAlignTableSize; i++)
-+ p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
-+ p->alignPriceCount = 0;
-+}
-+
-+static void FillDistancesPrices(CLzmaEnc *p)
-+{
-+ UInt32 tempPrices[kNumFullDistances];
-+ UInt32 i, lenToPosState;
-+ for (i = kStartPosModelIndex; i < kNumFullDistances; i++)
-+ {
-+ UInt32 posSlot = GetPosSlot1(i);
-+ UInt32 footerBits = ((posSlot >> 1) - 1);
-+ UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-+ tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);
-+ }
-+
-+ for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
-+ {
-+ UInt32 posSlot;
-+ const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];
-+ UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];
-+ for (posSlot = 0; posSlot < p->distTableSize; posSlot++)
-+ posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);
-+ for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)
-+ posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
-+
-+ {
-+ UInt32 *distancesPrices = p->distancesPrices[lenToPosState];
-+ UInt32 i;
-+ for (i = 0; i < kStartPosModelIndex; i++)
-+ distancesPrices[i] = posSlotPrices[i];
-+ for (; i < kNumFullDistances; i++)
-+ distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];
-+ }
-+ }
-+ p->matchPriceCount = 0;
-+}
-+
-+void LzmaEnc_Construct(CLzmaEnc *p)
-+{
-+ RangeEnc_Construct(&p->rc);
-+ MatchFinder_Construct(&p->matchFinderBase);
-+ #ifndef _7ZIP_ST
-+ MatchFinderMt_Construct(&p->matchFinderMt);
-+ p->matchFinderMt.MatchFinder = &p->matchFinderBase;
-+ #endif
-+
-+ {
-+ CLzmaEncProps props;
-+ LzmaEncProps_Init(&props);
-+ LzmaEnc_SetProps(p, &props);
-+ }
-+
-+ #ifndef LZMA_LOG_BSR
-+ LzmaEnc_FastPosInit(p->g_FastPos);
-+ #endif
-+
-+ LzmaEnc_InitPriceTables(p->ProbPrices);
-+ p->litProbs = 0;
-+ p->saveState.litProbs = 0;
-+}
-+
-+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
-+{
-+ void *p;
-+ p = alloc->Alloc(alloc, sizeof(CLzmaEnc));
-+ if (p != 0)
-+ LzmaEnc_Construct((CLzmaEnc *)p);
-+ return p;
-+}
-+
-+void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-+{
-+ alloc->Free(alloc, p->litProbs);
-+ alloc->Free(alloc, p->saveState.litProbs);
-+ p->litProbs = 0;
-+ p->saveState.litProbs = 0;
-+}
-+
-+void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ #ifndef _7ZIP_ST
-+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
-+ #endif
-+ MatchFinder_Free(&p->matchFinderBase, allocBig);
-+ LzmaEnc_FreeLits(p, alloc);
-+ RangeEnc_Free(&p->rc, alloc);
-+}
-+
-+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
-+ alloc->Free(alloc, p);
-+}
-+
-+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)
-+{
-+ UInt32 nowPos32, startPos32;
-+ if (p->needInit)
-+ {
-+ p->matchFinder.Init(p->matchFinderObj);
-+ p->needInit = 0;
-+ }
-+
-+ if (p->finished)
-+ return p->result;
-+ RINOK(CheckErrors(p));
-+
-+ nowPos32 = (UInt32)p->nowPos64;
-+ startPos32 = nowPos32;
-+
-+ if (p->nowPos64 == 0)
-+ {
-+ UInt32 numPairs;
-+ Byte curByte;
-+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
-+ return Flush(p, nowPos32);
-+ ReadMatchDistances(p, &numPairs);
-+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);
-+ p->state = kLiteralNextStates[p->state];
-+ curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);
-+ LitEnc_Encode(&p->rc, p->litProbs, curByte);
-+ p->additionalOffset--;
-+ nowPos32++;
-+ }
-+
-+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)
-+ for (;;)
-+ {
-+ UInt32 pos, len, posState;
-+
-+ if (p->fastMode)
-+ len = GetOptimumFast(p, &pos);
-+ else
-+ len = GetOptimum(p, nowPos32, &pos);
-+
-+ #ifdef SHOW_STAT2
-+ printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos);
-+ #endif
-+
-+ posState = nowPos32 & p->pbMask;
-+ if (len == 1 && pos == (UInt32)-1)
-+ {
-+ Byte curByte;
-+ CLzmaProb *probs;
-+ const Byte *data;
-+
-+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);
-+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-+ curByte = *data;
-+ probs = LIT_PROBS(nowPos32, *(data - 1));
-+ if (IsCharState(p->state))
-+ LitEnc_Encode(&p->rc, probs, curByte);
-+ else
-+ LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));
-+ p->state = kLiteralNextStates[p->state];
-+ }
-+ else
-+ {
-+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
-+ if (pos < LZMA_NUM_REPS)
-+ {
-+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);
-+ if (pos == 0)
-+ {
-+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);
-+ RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));
-+ }
-+ else
-+ {
-+ UInt32 distance = p->reps[pos];
-+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);
-+ if (pos == 1)
-+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);
-+ else
-+ {
-+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);
-+ RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);
-+ if (pos == 3)
-+ p->reps[3] = p->reps[2];
-+ p->reps[2] = p->reps[1];
-+ }
-+ p->reps[1] = p->reps[0];
-+ p->reps[0] = distance;
-+ }
-+ if (len == 1)
-+ p->state = kShortRepNextStates[p->state];
-+ else
-+ {
-+ LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+ p->state = kRepNextStates[p->state];
-+ }
-+ }
-+ else
-+ {
-+ UInt32 posSlot;
-+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
-+ p->state = kMatchNextStates[p->state];
-+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+ pos -= LZMA_NUM_REPS;
-+ GetPosSlot(pos, posSlot);
-+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);
-+
-+ if (posSlot >= kStartPosModelIndex)
-+ {
-+ UInt32 footerBits = ((posSlot >> 1) - 1);
-+ UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-+ UInt32 posReduced = pos - base;
-+
-+ if (posSlot < kEndPosModelIndex)
-+ RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);
-+ else
-+ {
-+ RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
-+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);
-+ p->alignPriceCount++;
-+ }
-+ }
-+ p->reps[3] = p->reps[2];
-+ p->reps[2] = p->reps[1];
-+ p->reps[1] = p->reps[0];
-+ p->reps[0] = pos;
-+ p->matchPriceCount++;
-+ }
-+ }
-+ p->additionalOffset -= len;
-+ nowPos32 += len;
-+ if (p->additionalOffset == 0)
-+ {
-+ UInt32 processed;
-+ if (!p->fastMode)
-+ {
-+ if (p->matchPriceCount >= (1 << 7))
-+ FillDistancesPrices(p);
-+ if (p->alignPriceCount >= kAlignTableSize)
-+ FillAlignPrices(p);
-+ }
-+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
-+ break;
-+ processed = nowPos32 - startPos32;
-+ if (useLimits)
-+ {
-+ if (processed + kNumOpts + 300 >= maxUnpackSize ||
-+ RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)
-+ break;
-+ }
-+ else if (processed >= (1 << 15))
-+ {
-+ p->nowPos64 += nowPos32 - startPos32;
-+ return CheckErrors(p);
-+ }
-+ }
-+ }
-+ p->nowPos64 += nowPos32 - startPos32;
-+ return Flush(p, nowPos32);
-+}
-+
-+#define kBigHashDicLimit ((UInt32)1 << 24)
-+
-+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ UInt32 beforeSize = kNumOpts;
-+ Bool btMode;
-+ if (!RangeEnc_Alloc(&p->rc, alloc))
-+ return SZ_ERROR_MEM;
-+ btMode = (p->matchFinderBase.btMode != 0);
-+ #ifndef _7ZIP_ST
-+ p->mtMode = (p->multiThread && !p->fastMode && btMode);
-+ #endif
-+
-+ {
-+ unsigned lclp = p->lc + p->lp;
-+ if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)
-+ {
-+ LzmaEnc_FreeLits(p, alloc);
-+ p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
-+ p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
-+ if (p->litProbs == 0 || p->saveState.litProbs == 0)
-+ {
-+ LzmaEnc_FreeLits(p, alloc);
-+ return SZ_ERROR_MEM;
-+ }
-+ p->lclp = lclp;
-+ }
-+ }
-+
-+ p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);
-+
-+ if (beforeSize + p->dictSize < keepWindowSize)
-+ beforeSize = keepWindowSize - p->dictSize;
-+
-+ #ifndef _7ZIP_ST
-+ if (p->mtMode)
-+ {
-+ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));
-+ p->matchFinderObj = &p->matchFinderMt;
-+ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
-+ }
-+ else
-+ #endif
-+ {
-+ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
-+ return SZ_ERROR_MEM;
-+ p->matchFinderObj = &p->matchFinderBase;
-+ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
-+ }
-+ return SZ_OK;
-+}
-+
-+void LzmaEnc_Init(CLzmaEnc *p)
-+{
-+ UInt32 i;
-+ p->state = 0;
-+ for (i = 0 ; i < LZMA_NUM_REPS; i++)
-+ p->reps[i] = 0;
-+
-+ RangeEnc_Init(&p->rc);
-+
-+
-+ for (i = 0; i < kNumStates; i++)
-+ {
-+ UInt32 j;
-+ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
-+ {
-+ p->isMatch[i][j] = kProbInitValue;
-+ p->isRep0Long[i][j] = kProbInitValue;
-+ }
-+ p->isRep[i] = kProbInitValue;
-+ p->isRepG0[i] = kProbInitValue;
-+ p->isRepG1[i] = kProbInitValue;
-+ p->isRepG2[i] = kProbInitValue;
-+ }
-+
-+ {
-+ UInt32 num = 0x300 << (p->lp + p->lc);
-+ for (i = 0; i < num; i++)
-+ p->litProbs[i] = kProbInitValue;
-+ }
-+
-+ {
-+ for (i = 0; i < kNumLenToPosStates; i++)
-+ {
-+ CLzmaProb *probs = p->posSlotEncoder[i];
-+ UInt32 j;
-+ for (j = 0; j < (1 << kNumPosSlotBits); j++)
-+ probs[j] = kProbInitValue;
-+ }
-+ }
-+ {
-+ for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
-+ p->posEncoders[i] = kProbInitValue;
-+ }
-+
-+ LenEnc_Init(&p->lenEnc.p);
-+ LenEnc_Init(&p->repLenEnc.p);
-+
-+ for (i = 0; i < (1 << kNumAlignBits); i++)
-+ p->posAlignEncoder[i] = kProbInitValue;
-+
-+ p->optimumEndIndex = 0;
-+ p->optimumCurrentIndex = 0;
-+ p->additionalOffset = 0;
-+
-+ p->pbMask = (1 << p->pb) - 1;
-+ p->lpMask = (1 << p->lp) - 1;
-+}
-+
-+void LzmaEnc_InitPrices(CLzmaEnc *p)
-+{
-+ if (!p->fastMode)
-+ {
-+ FillDistancesPrices(p);
-+ FillAlignPrices(p);
-+ }
-+
-+ p->lenEnc.tableSize =
-+ p->repLenEnc.tableSize =
-+ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
-+ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);
-+ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);
-+}
-+
-+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ UInt32 i;
-+ for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)
-+ if (p->dictSize <= ((UInt32)1 << i))
-+ break;
-+ p->distTableSize = i * 2;
-+
-+ p->finished = False;
-+ p->result = SZ_OK;
-+ RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));
-+ LzmaEnc_Init(p);
-+ LzmaEnc_InitPrices(p);
-+ p->nowPos64 = 0;
-+ return SZ_OK;
-+}
-+
-+static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
-+ ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ p->matchFinderBase.stream = inStream;
-+ p->needInit = 1;
-+ p->rc.outStream = outStream;
-+ return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
-+}
-+
-+SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
-+ ISeqInStream *inStream, UInt32 keepWindowSize,
-+ ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ p->matchFinderBase.stream = inStream;
-+ p->needInit = 1;
-+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-+}
-+
-+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
-+{
-+ p->matchFinderBase.directInput = 1;
-+ p->matchFinderBase.bufferBase = (Byte *)src;
-+ p->matchFinderBase.directInputRem = srcLen;
-+}
-+
-+SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
-+ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ LzmaEnc_SetInputBuf(p, src, srcLen);
-+ p->needInit = 1;
-+
-+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-+}
-+
-+void LzmaEnc_Finish(CLzmaEncHandle pp)
-+{
-+ #ifndef _7ZIP_ST
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ if (p->mtMode)
-+ MatchFinderMt_ReleaseStream(&p->matchFinderMt);
-+ #else
-+ pp = pp;
-+ #endif
-+}
-+
-+typedef struct
-+{
-+ ISeqOutStream funcTable;
-+ Byte *data;
-+ SizeT rem;
-+ Bool overflow;
-+} CSeqOutStreamBuf;
-+
-+static size_t MyWrite(void *pp, const void *data, size_t size)
-+{
-+ CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;
-+ if (p->rem < size)
-+ {
-+ size = p->rem;
-+ p->overflow = True;
-+ }
-+ memcpy(p->data, data, size);
-+ p->rem -= size;
-+ p->data += size;
-+ return size;
-+}
-+
-+
-+UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
-+{
-+ const CLzmaEnc *p = (CLzmaEnc *)pp;
-+ return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-+}
-+
-+const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
-+{
-+ const CLzmaEnc *p = (CLzmaEnc *)pp;
-+ return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-+}
-+
-+SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-+ Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ UInt64 nowPos64;
-+ SRes res;
-+ CSeqOutStreamBuf outStream;
-+
-+ outStream.funcTable.Write = MyWrite;
-+ outStream.data = dest;
-+ outStream.rem = *destLen;
-+ outStream.overflow = False;
-+
-+ p->writeEndMark = False;
-+ p->finished = False;
-+ p->result = SZ_OK;
-+
-+ if (reInit)
-+ LzmaEnc_Init(p);
-+ LzmaEnc_InitPrices(p);
-+ nowPos64 = p->nowPos64;
-+ RangeEnc_Init(&p->rc);
-+ p->rc.outStream = &outStream.funcTable;
-+
-+ res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
-+
-+ *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
-+ *destLen -= outStream.rem;
-+ if (outStream.overflow)
-+ return SZ_ERROR_OUTPUT_EOF;
-+
-+ return res;
-+}
-+
-+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
-+{
-+ SRes res = SZ_OK;
-+
-+ #ifndef _7ZIP_ST
-+ Byte allocaDummy[0x300];
-+ int i = 0;
-+ for (i = 0; i < 16; i++)
-+ allocaDummy[i] = (Byte)i;
-+ #endif
-+
-+ for (;;)
-+ {
-+ res = LzmaEnc_CodeOneBlock(p, False, 0, 0);
-+ if (res != SZ_OK || p->finished != 0)
-+ break;
-+ if (progress != 0)
-+ {
-+ res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));
-+ if (res != SZ_OK)
-+ {
-+ res = SZ_ERROR_PROGRESS;
-+ break;
-+ }
-+ }
-+ }
-+ LzmaEnc_Finish(p);
-+ return res;
-+}
-+
-+SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
-+ ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
-+ return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
-+}
-+
-+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+ int i;
-+ UInt32 dictSize = p->dictSize;
-+ if (*size < LZMA_PROPS_SIZE)
-+ return SZ_ERROR_PARAM;
-+ *size = LZMA_PROPS_SIZE;
-+ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
-+
-+ for (i = 11; i <= 30; i++)
-+ {
-+ if (dictSize <= ((UInt32)2 << i))
-+ {
-+ dictSize = (2 << i);
-+ break;
-+ }
-+ if (dictSize <= ((UInt32)3 << i))
-+ {
-+ dictSize = (3 << i);
-+ break;
-+ }
-+ }
-+
-+ for (i = 0; i < 4; i++)
-+ props[1 + i] = (Byte)(dictSize >> (8 * i));
-+ return SZ_OK;
-+}
-+
-+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ SRes res;
-+ CLzmaEnc *p = (CLzmaEnc *)pp;
-+
-+ CSeqOutStreamBuf outStream;
-+
-+ LzmaEnc_SetInputBuf(p, src, srcLen);
-+
-+ outStream.funcTable.Write = MyWrite;
-+ outStream.data = dest;
-+ outStream.rem = *destLen;
-+ outStream.overflow = False;
-+
-+ p->writeEndMark = writeEndMark;
-+
-+ p->rc.outStream = &outStream.funcTable;
-+ res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);
-+ if (res == SZ_OK)
-+ res = LzmaEnc_Encode2(p, progress);
-+
-+ *destLen -= outStream.rem;
-+ if (outStream.overflow)
-+ return SZ_ERROR_OUTPUT_EOF;
-+ return res;
-+}
-+
-+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+ const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-+ ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+ CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
-+ SRes res;
-+ if (p == 0)
-+ return SZ_ERROR_MEM;
-+
-+ res = LzmaEnc_SetProps(p, props);
-+ if (res == SZ_OK)
-+ {
-+ res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
-+ if (res == SZ_OK)
-+ res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
-+ writeEndMark, progress, alloc, allocBig);
-+ }
-+
-+ LzmaEnc_Destroy(p, alloc, allocBig);
-+ return res;
-+}
---- /dev/null
-+++ b/lib/lzma/Makefile
-@@ -0,0 +1,7 @@
-+lzma_compress-objs := LzFind.o LzmaEnc.o
-+lzma_decompress-objs := LzmaDec.o
-+
-+obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o
-+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o
-+
-+EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h
diff --git a/target/linux/generic/pending-5.4/532-jffs2_eofdetect.patch b/target/linux/generic/pending-5.4/532-jffs2_eofdetect.patch
deleted file mode 100644
index df4ab9b754..0000000000
--- a/target/linux/generic/pending-5.4/532-jffs2_eofdetect.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: fs: jffs2: EOF marker
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- fs/jffs2/build.c | 10 ++++++++++
- fs/jffs2/scan.c | 21 +++++++++++++++++++--
- 2 files changed, 29 insertions(+), 2 deletions(-)
-
---- a/fs/jffs2/build.c
-+++ b/fs/jffs2/build.c
-@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct
- dbg_fsbuild("scanned flash completely\n");
- jffs2_dbg_dump_block_lists_nolock(c);
-
-+ if (c->flags & (1 << 7)) {
-+ printk("%s(): unlocking the mtd device... ", __func__);
-+ mtd_unlock(c->mtd, 0, c->mtd->size);
-+ printk("done.\n");
-+
-+ printk("%s(): erasing all blocks after the end marker... ", __func__);
-+ jffs2_erase_pending_blocks(c, -1);
-+ printk("done.\n");
-+ }
-+
- dbg_fsbuild("pass 1 starting\n");
- c->flags |= JFFS2_SB_FLAG_BUILDING;
- /* Now scan the directory tree, increasing nlink according to every dirent found. */
---- a/fs/jffs2/scan.c
-+++ b/fs/jffs2/scan.c
-@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_in
- /* reset summary info for next eraseblock scan */
- jffs2_sum_reset_collected(s);
-
-- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-- buf_size, s);
-+ if (c->flags & (1 << 7)) {
-+ if (mtd_block_isbad(c->mtd, jeb->offset))
-+ ret = BLK_STATE_BADBLOCK;
-+ else
-+ ret = BLK_STATE_ALLFF;
-+ } else
-+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
-+ buf_size, s);
-
- if (ret < 0)
- goto out;
-@@ -564,6 +570,17 @@ full_scan:
- return err;
- }
-
-+ if ((buf[0] == 0xde) &&
-+ (buf[1] == 0xad) &&
-+ (buf[2] == 0xc0) &&
-+ (buf[3] == 0xde)) {
-+ /* end of filesystem. erase everything after this point */
-+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
-+ c->flags |= (1 << 7);
-+
-+ return BLK_STATE_ALLFF;
-+ }
-+
- /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
- ofs = 0;
- max_ofs = EMPTY_SCAN_SIZE(c->sector_size);
diff --git a/target/linux/generic/pending-5.4/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-5.4/600-netfilter_conntrack_flush.patch
deleted file mode 100644
index eaf8c78052..0000000000
--- a/target/linux/generic/pending-5.4/600-netfilter_conntrack_flush.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: add support for flushing conntrack via /proc
-
-lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++-
- 1 file changed, 58 insertions(+), 1 deletion(-)
-
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -9,6 +9,7 @@
- #include <linux/percpu.h>
- #include <linux/netdevice.h>
- #include <linux/security.h>
-+#include <linux/inet.h>
- #include <net/net_namespace.h>
- #ifdef CONFIG_SYSCTL
- #include <linux/sysctl.h>
-@@ -455,6 +456,56 @@ static int ct_cpu_seq_show(struct seq_fi
- return 0;
- }
-
-+struct kill_request {
-+ u16 family;
-+ union nf_inet_addr addr;
-+};
-+
-+static int kill_matching(struct nf_conn *i, void *data)
-+{
-+ struct kill_request *kr = data;
-+ struct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
-+ struct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple;
-+
-+ if (!kr->family)
-+ return 1;
-+
-+ if (t1->src.l3num != kr->family)
-+ return 0;
-+
-+ return (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) ||
-+ nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) ||
-+ nf_inet_addr_cmp(&kr->addr, &t2->src.u3) ||
-+ nf_inet_addr_cmp(&kr->addr, &t2->dst.u3));
-+}
-+
-+static int ct_file_write(struct file *file, char *buf, size_t count)
-+{
-+ struct seq_file *seq = file->private_data;
-+ struct net *net = seq_file_net(seq);
-+ struct kill_request kr = { };
-+
-+ if (count == 0)
-+ return 0;
-+
-+ if (count >= INET6_ADDRSTRLEN)
-+ count = INET6_ADDRSTRLEN - 1;
-+
-+ if (strnchr(buf, count, ':')) {
-+ kr.family = AF_INET6;
-+ if (!in6_pton(buf, count, (void *)&kr.addr, '\n', NULL))
-+ return -EINVAL;
-+ } else if (strnchr(buf, count, '.')) {
-+ kr.family = AF_INET;
-+ if (!in4_pton(buf, count, (void *)&kr.addr, '\n', NULL))
-+ return -EINVAL;
-+ }
-+
-+ nf_ct_iterate_cleanup_net(net, kill_matching, &kr, 0, 0);
-+
-+ return 0;
-+}
-+
- static const struct seq_operations ct_cpu_seq_ops = {
- .start = ct_cpu_seq_start,
- .next = ct_cpu_seq_next,
-@@ -468,8 +519,9 @@ static int nf_conntrack_standalone_init_
- kuid_t root_uid;
- kgid_t root_gid;
-
-- pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops,
-- sizeof(struct ct_iter_state));
-+ pde = proc_create_net_data_write("nf_conntrack", 0440, net->proc_net,
-+ &ct_seq_ops, &ct_file_write,
-+ sizeof(struct ct_iter_state), NULL);
- if (!pde)
- goto out_nf_conntrack;
-
diff --git a/target/linux/generic/pending-5.4/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-5.4/610-netfilter_match_bypass_default_checks.patch
deleted file mode 100644
index 703ac8215e..0000000000
--- a/target/linux/generic/pending-5.4/610-netfilter_match_bypass_default_checks.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/netfilter_ipv4/ip_tables.h | 1 +
- net/ipv4/netfilter/ip_tables.c | 37 +++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+)
-
---- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
-@@ -89,6 +89,7 @@ struct ipt_ip {
- #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */
- #define IPT_F_GOTO 0x02 /* Set if jump is a goto */
- #define IPT_F_MASK 0x03 /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH 0x80 /* Internal: no default match rules present */
-
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -50,6 +50,9 @@ ip_packet_match(const struct iphdr *ip,
- {
- unsigned long ret;
-
-+ if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+ return true;
-+
- if (NF_INVF(ipinfo, IPT_INV_SRCIP,
- (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
- NF_INVF(ipinfo, IPT_INV_DSTIP,
-@@ -80,6 +83,29 @@ ip_packet_match(const struct iphdr *ip,
- return true;
- }
-
-+static void
-+ip_checkdefault(struct ipt_ip *ip)
-+{
-+ static const char iface_mask[IFNAMSIZ] = {};
-+
-+ if (ip->invflags || ip->flags & IPT_F_FRAG)
-+ return;
-+
-+ if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)
-+ return;
-+
-+ if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)
-+ return;
-+
-+ if (ip->smsk.s_addr || ip->dmsk.s_addr)
-+ return;
-+
-+ if (ip->proto)
-+ return;
-+
-+ ip->flags |= IPT_F_NO_DEF_MATCH;
-+}
-+
- static bool
- ip_checkentry(const struct ipt_ip *ip)
- {
-@@ -524,6 +550,8 @@ find_check_entry(struct ipt_entry *e, st
- struct xt_mtchk_param mtpar;
- struct xt_entry_match *ematch;
-
-+ ip_checkdefault(&e->ip);
-+
- if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
- return -ENOMEM;
-
-@@ -818,6 +846,7 @@ copy_entries_to_user(unsigned int total_
- const struct xt_table_info *private = table->private;
- int ret = 0;
- const void *loc_cpu_entry;
-+ u8 flags;
-
- counters = alloc_counters(table);
- if (IS_ERR(counters))
-@@ -845,6 +874,14 @@ copy_entries_to_user(unsigned int total_
- goto free_counters;
- }
-
-+ flags = e->ip.flags & IPT_F_MASK;
-+ if (copy_to_user(userptr + off
-+ + offsetof(struct ipt_entry, ip.flags),
-+ &flags, sizeof(flags)) != 0) {
-+ ret = -EFAULT;
-+ goto free_counters;
-+ }
-+
- for (i = sizeof(struct ipt_entry);
- i < e->target_offset;
- i += m->u.match_size) {
-@@ -1225,12 +1262,15 @@ compat_copy_entry_to_user(struct ipt_ent
- compat_uint_t origsize;
- const struct xt_entry_match *ematch;
- int ret = 0;
-+ u8 flags = e->ip.flags & IPT_F_MASK;
-
- origsize = *size;
- ce = *dstptr;
- if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||
- copy_to_user(&ce->counters, &counters[i],
-- sizeof(counters[i])) != 0)
-+ sizeof(counters[i])) != 0 ||
-+ copy_to_user(&ce->ip.flags, &flags,
-+ sizeof(flags)) != 0)
- return -EFAULT;
-
- *dstptr += sizeof(struct compat_ipt_entry);
diff --git a/target/linux/generic/pending-5.4/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-5.4/611-netfilter_match_bypass_default_table.patch
deleted file mode 100644
index baf738a8d2..0000000000
--- a/target/linux/generic/pending-5.4/611-netfilter_match_bypass_default_table.patch
+++ /dev/null
@@ -1,106 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: match bypass default table
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------
- 1 file changed, 58 insertions(+), 21 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -246,6 +246,33 @@ struct ipt_entry *ipt_next_entry(const s
- return (void *)entry + entry->next_offset;
- }
-
-+static bool
-+ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)
-+{
-+ struct xt_entry_target *t;
-+ struct xt_standard_target *st;
-+
-+ if (e->target_offset != sizeof(struct ipt_entry))
-+ return false;
-+
-+ if (!(e->ip.flags & IPT_F_NO_DEF_MATCH))
-+ return false;
-+
-+ t = ipt_get_target(e);
-+ if (t->u.kernel.target->target)
-+ return false;
-+
-+ st = (struct xt_standard_target *) t;
-+ if (st->verdict == XT_RETURN)
-+ return false;
-+
-+ if (st->verdict >= 0)
-+ return false;
-+
-+ *verdict = (unsigned)(-st->verdict) - 1;
-+ return true;
-+}
-+
- /* Returns one of the generic firewall policies, like NF_ACCEPT. */
- unsigned int
- ipt_do_table(struct sk_buff *skb,
-@@ -266,27 +293,28 @@ ipt_do_table(struct sk_buff *skb,
- unsigned int addend;
-
- /* Initialization */
-+ WARN_ON(!(table->valid_hooks & (1 << hook)));
-+ local_bh_disable();
-+ private = READ_ONCE(table->private); /* Address dependency. */
-+ cpu = smp_processor_id();
-+ table_base = private->entries;
-+
-+ e = get_entry(table_base, private->hook_entry[hook]);
-+ if (ipt_handle_default_rule(e, &verdict)) {
-+ struct xt_counters *counter;
-+
-+ counter = xt_get_this_cpu_counter(&e->counters);
-+ ADD_COUNTER(*counter, skb->len, 1);
-+ local_bh_enable();
-+ return verdict;
-+ }
-+
- stackidx = 0;
- ip = ip_hdr(skb);
- indev = state->in ? state->in->name : nulldevname;
- outdev = state->out ? state->out->name : nulldevname;
-- /* We handle fragments by dealing with the first fragment as
-- * if it was a normal packet. All other fragments are treated
-- * normally, except that they will NEVER match rules that ask
-- * things we don't know, ie. tcp syn flag or ports). If the
-- * rule is also a fragment-specific rule, non-fragments won't
-- * match it. */
-- acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
-- acpar.thoff = ip_hdrlen(skb);
-- acpar.hotdrop = false;
-- acpar.state = state;
-
-- WARN_ON(!(table->valid_hooks & (1 << hook)));
-- local_bh_disable();
- addend = xt_write_recseq_begin();
-- private = READ_ONCE(table->private); /* Address dependency. */
-- cpu = smp_processor_id();
-- table_base = private->entries;
- jumpstack = (struct ipt_entry **)private->jumpstack[cpu];
-
- /* Switch to alternate jumpstack if we're being invoked via TEE.
-@@ -299,7 +327,16 @@ ipt_do_table(struct sk_buff *skb,
- if (static_key_false(&xt_tee_enabled))
- jumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated);
-
-- e = get_entry(table_base, private->hook_entry[hook]);
-+ /* We handle fragments by dealing with the first fragment as
-+ * if it was a normal packet. All other fragments are treated
-+ * normally, except that they will NEVER match rules that ask
-+ * things we don't know, ie. tcp syn flag or ports). If the
-+ * rule is also a fragment-specific rule, non-fragments won't
-+ * match it. */
-+ acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
-+ acpar.thoff = ip_hdrlen(skb);
-+ acpar.hotdrop = false;
-+ acpar.state = state;
-
- do {
- const struct xt_entry_target *t;
diff --git a/target/linux/generic/pending-5.4/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-5.4/612-netfilter_match_reduce_memory_access.patch
deleted file mode 100644
index 79da6778b6..0000000000
--- a/target/linux/generic/pending-5.4/612-netfilter_match_reduce_memory_access.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: reduce match memory access
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -53,9 +53,9 @@ ip_packet_match(const struct iphdr *ip,
- if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
- return true;
-
-- if (NF_INVF(ipinfo, IPT_INV_SRCIP,
-+ if (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr &&
- (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
-- NF_INVF(ipinfo, IPT_INV_DSTIP,
-+ NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr &&
- (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))
- return false;
-
diff --git a/target/linux/generic/pending-5.4/613-netfilter_optional_tcp_window_check.patch b/target/linux/generic/pending-5.4/613-netfilter_optional_tcp_window_check.patch
deleted file mode 100644
index 0735f8d20d..0000000000
--- a/target/linux/generic/pending-5.4/613-netfilter_optional_tcp_window_check.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: optional tcp window check
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
---- a/net/netfilter/nf_conntrack_proto_tcp.c
-+++ b/net/netfilter/nf_conntrack_proto_tcp.c
-@@ -31,6 +31,9 @@
- #include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
- #include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
-
-+/* Do not check the TCP window for incoming packets */
-+static int nf_ct_tcp_no_window_check __read_mostly = 1;
-+
- /* "Be conservative in what you do,
- be liberal in what you accept from others."
- If it's non-zero, we mark only out of window RST segments as INVALID. */
-@@ -476,6 +479,9 @@ static bool tcp_in_window(const struct n
- s32 receiver_offset;
- bool res, in_recv_win;
-
-+ if (nf_ct_tcp_no_window_check)
-+ return true;
-+
- /*
- * Get the required data from the packet.
- */
-@@ -1130,7 +1136,7 @@ int nf_conntrack_tcp_packet(struct nf_co
- IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED &&
- timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK])
- timeout = timeouts[TCP_CONNTRACK_UNACK];
-- else if (ct->proto.tcp.last_win == 0 &&
-+ else if (!nf_ct_tcp_no_window_check && ct->proto.tcp.last_win == 0 &&
- timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS])
- timeout = timeouts[TCP_CONNTRACK_RETRANS];
- else
---- a/net/netfilter/nf_conntrack_standalone.c
-+++ b/net/netfilter/nf_conntrack_standalone.c
-@@ -25,6 +25,9 @@
- #include <net/netfilter/nf_conntrack_timestamp.h>
- #include <linux/rculist_nulls.h>
-
-+/* Do not check the TCP window for incoming packets */
-+static int nf_ct_tcp_no_window_check __read_mostly = 1;
-+
- static bool enable_hooks __read_mostly;
- MODULE_PARM_DESC(enable_hooks, "Always enable conntrack hooks");
- module_param(enable_hooks, bool, 0000);
-@@ -650,6 +653,7 @@ enum nf_ct_sysctl_index {
- NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,
- #endif
-
-+ NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK,
- __NF_SYSCTL_CT_LAST_SYSCTL,
- };
-
-@@ -976,6 +980,13 @@ static struct ctl_table nf_ct_sysctl_tab
- .proc_handler = proc_dointvec_jiffies,
- },
- #endif
-+ [NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = {
-+ .procname = "nf_conntrack_tcp_no_window_check",
-+ .data = &nf_ct_tcp_no_window_check,
-+ .maxlen = sizeof(unsigned int),
-+ .mode = 0644,
-+ .proc_handler = proc_dointvec,
-+ },
- {}
- };
-
diff --git a/target/linux/generic/pending-5.4/620-net_sched-codel-do-not-defer-queue-length-update.patch b/target/linux/generic/pending-5.4/620-net_sched-codel-do-not-defer-queue-length-update.patch
deleted file mode 100644
index ca85b8a98c..0000000000
--- a/target/linux/generic/pending-5.4/620-net_sched-codel-do-not-defer-queue-length-update.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
-Date: Mon, 21 Aug 2017 11:14:14 +0300
-Subject: [PATCH] net_sched/codel: do not defer queue length update
-
-When codel wants to drop last packet in ->dequeue() it cannot call
-qdisc_tree_reduce_backlog() right away - it will notify parent qdisc
-about zero qlen and HTB/HFSC will deactivate class. The same class will
-be deactivated second time by caller of ->dequeue(). Currently codel and
-fq_codel defer update. This triggers warning in HFSC when it's qlen != 0
-but there is no active classes.
-
-This patch update parent queue length immediately: just temporary increase
-qlen around qdisc_tree_reduce_backlog() to prevent first class deactivation
-if we have skb to return.
-
-This might open another problem in HFSC - now operation peek could fail and
-deactivate parent class.
-
-Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
-Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
----
-
---- a/net/sched/sch_codel.c
-+++ b/net/sched/sch_codel.c
-@@ -95,11 +95,17 @@ static struct sk_buff *codel_qdisc_deque
- &q->stats, qdisc_pkt_len, codel_get_enqueue_time,
- drop_func, dequeue_func);
-
-- /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,
-- * or HTB crashes. Defer it for next round.
-+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
-+ * parent class, dequeue in parent qdisc will do the same if we
-+ * return skb. Temporary increment qlen if we have skb.
- */
-- if (q->stats.drop_count && sch->q.qlen) {
-- qdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len);
-+ if (q->stats.drop_count) {
-+ if (skb)
-+ sch->q.qlen++;
-+ qdisc_tree_reduce_backlog(sch, q->stats.drop_count,
-+ q->stats.drop_len);
-+ if (skb)
-+ sch->q.qlen--;
- q->stats.drop_count = 0;
- q->stats.drop_len = 0;
- }
---- a/net/sched/sch_fq_codel.c
-+++ b/net/sched/sch_fq_codel.c
-@@ -305,6 +305,21 @@ begin:
- &flow->cvars, &q->cstats, qdisc_pkt_len,
- codel_get_enqueue_time, drop_func, dequeue_func);
-
-+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
-+ * parent class, dequeue in parent qdisc will do the same if we
-+ * return skb. Temporary increment qlen if we have skb.
-+ */
-+ if (q->cstats.drop_count) {
-+ if (skb)
-+ sch->q.qlen++;
-+ qdisc_tree_reduce_backlog(sch, q->cstats.drop_count,
-+ q->cstats.drop_len);
-+ if (skb)
-+ sch->q.qlen--;
-+ q->cstats.drop_count = 0;
-+ q->cstats.drop_len = 0;
-+ }
-+
- if (!skb) {
- /* force a pass through old_flows to prevent starvation */
- if ((head == &q->new_flows) && !list_empty(&q->old_flows))
-@@ -315,15 +330,6 @@ begin:
- }
- qdisc_bstats_update(sch, skb);
- flow->deficit -= qdisc_pkt_len(skb);
-- /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,
-- * or HTB crashes. Defer it for next round.
-- */
-- if (q->cstats.drop_count && sch->q.qlen) {
-- qdisc_tree_reduce_backlog(sch, q->cstats.drop_count,
-- q->cstats.drop_len);
-- q->cstats.drop_count = 0;
-- q->cstats.drop_len = 0;
-- }
- return skb;
- }
-
diff --git a/target/linux/generic/pending-5.4/630-packet_socket_type.patch b/target/linux/generic/pending-5.4/630-packet_socket_type.patch
deleted file mode 100644
index d9bfda1303..0000000000
--- a/target/linux/generic/pending-5.4/630-packet_socket_type.patch
+++ /dev/null
@@ -1,138 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: net: add an optimization for dealing with raw sockets
-
-lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/if_packet.h | 3 +++
- net/packet/af_packet.c | 34 +++++++++++++++++++++++++++-------
- net/packet/internal.h | 1 +
- 3 files changed, 31 insertions(+), 7 deletions(-)
-
---- a/include/uapi/linux/if_packet.h
-+++ b/include/uapi/linux/if_packet.h
-@@ -32,6 +32,8 @@ struct sockaddr_ll {
- #define PACKET_KERNEL 7 /* To kernel space */
- /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */
- #define PACKET_FASTROUTE 6 /* Fastrouted frame */
-+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */
-+
-
- /* Packet socket options */
-
-@@ -58,6 +60,7 @@ struct sockaddr_ll {
- #define PACKET_ROLLOVER_STATS 21
- #define PACKET_FANOUT_DATA 22
- #define PACKET_IGNORE_OUTGOING 23
-+#define PACKET_RECV_TYPE 24
-
- #define PACKET_FANOUT_HASH 0
- #define PACKET_FANOUT_LB 1
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -1797,6 +1797,7 @@ static int packet_rcv_spkt(struct sk_buf
- {
- struct sock *sk;
- struct sockaddr_pkt *spkt;
-+ struct packet_sock *po;
-
- /*
- * When we registered the protocol we saved the socket in the data
-@@ -1804,6 +1805,7 @@ static int packet_rcv_spkt(struct sk_buf
- */
-
- sk = pt->af_packet_priv;
-+ po = pkt_sk(sk);
-
- /*
- * Yank back the headers [hope the device set this
-@@ -1816,7 +1818,7 @@ static int packet_rcv_spkt(struct sk_buf
- * so that this procedure is noop.
- */
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
- goto out;
-
- if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -2054,12 +2056,12 @@ static int packet_rcv(struct sk_buff *sk
- unsigned int snaplen, res;
- bool is_drop_n_account = false;
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -2185,12 +2187,12 @@ static int tpacket_rcv(struct sk_buff *s
- BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
- BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
-
-- if (skb->pkt_type == PACKET_LOOPBACK)
-- goto drop;
--
- sk = pt->af_packet_priv;
- po = pkt_sk(sk);
-
-+ if (!(po->pkt_type & (1 << skb->pkt_type)))
-+ goto drop;
-+
- if (!net_eq(dev_net(dev), sock_net(sk)))
- goto drop;
-
-@@ -3289,6 +3291,7 @@ static int packet_create(struct net *net
- mutex_init(&po->pg_vec_lock);
- po->rollover = NULL;
- po->prot_hook.func = packet_rcv;
-+ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
-
- if (sock->type == SOCK_PACKET)
- po->prot_hook.func = packet_rcv_spkt;
-@@ -3924,6 +3927,16 @@ packet_setsockopt(struct socket *sock, i
- po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
- return 0;
- }
-+ case PACKET_RECV_TYPE:
-+ {
-+ unsigned int val;
-+ if (optlen != sizeof(val))
-+ return -EINVAL;
-+ if (copy_from_user(&val, optval, sizeof(val)))
-+ return -EFAULT;
-+ po->pkt_type = val & ~BIT(PACKET_LOOPBACK);
-+ return 0;
-+ }
- default:
- return -ENOPROTOOPT;
- }
-@@ -3980,6 +3993,13 @@ static int packet_getsockopt(struct sock
- case PACKET_VNET_HDR:
- val = po->has_vnet_hdr;
- break;
-+ case PACKET_RECV_TYPE:
-+ if (len > sizeof(unsigned int))
-+ len = sizeof(unsigned int);
-+ val = po->pkt_type;
-+
-+ data = &val;
-+ break;
- case PACKET_VERSION:
- val = po->tp_version;
- break;
---- a/net/packet/internal.h
-+++ b/net/packet/internal.h
-@@ -136,6 +136,7 @@ struct packet_sock {
- int (*xmit)(struct sk_buff *skb);
- struct packet_type prot_hook ____cacheline_aligned_in_smp;
- atomic_t tp_drops ____cacheline_aligned_in_smp;
-+ unsigned int pkt_type;
- };
-
- static struct packet_sock *pkt_sk(struct sock *sk)
diff --git a/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch b/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch
deleted file mode 100644
index f5d9dcde99..0000000000
--- a/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch
+++ /dev/null
@@ -1,564 +0,0 @@
-From: Pablo Neira Ayuso <pablo@netfilter.org>
-Date: Thu, 11 Jan 2018 16:32:00 +0100
-Subject: [PATCH] netfilter: nf_flow_table: add hardware offload support
-
-This patch adds the infrastructure to offload flows to hardware, in case
-the nic/switch comes with built-in flow tables capabilities.
-
-If the hardware comes with no hardware flow tables or they have
-limitations in terms of features, the existing infrastructure falls back
-to the software flow table implementation.
-
-The software flow table garbage collector skips entries that resides in
-the hardware, so the hardware will be responsible for releasing this
-flow table entry too via flow_offload_dead().
-
-Hardware configuration, either to add or to delete entries, is done from
-the hardware offload workqueue, to ensure this is done from user context
-given that we may sleep when grabbing the mdio mutex.
-
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
----
- create mode 100644 net/netfilter/nf_flow_table_hw.c
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -922,6 +922,13 @@ struct devlink;
- struct tlsdev_ops;
-
-
-+struct flow_offload;
-+
-+enum flow_offload_type {
-+ FLOW_OFFLOAD_ADD = 0,
-+ FLOW_OFFLOAD_DEL,
-+};
-+
- /*
- * This structure defines the management hooks for network devices.
- * The following hooks can be defined; unless noted otherwise, they are
-@@ -1154,6 +1161,10 @@ struct tlsdev_ops;
- * int (*ndo_bridge_dellink)(struct net_device *dev, struct nlmsghdr *nlh,
- * u16 flags);
- *
-+ * int (*ndo_flow_offload)(enum flow_offload_type type,
-+ * struct flow_offload *flow);
-+ * Adds/deletes flow entry to/from net device flowtable.
-+ *
- * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
- * Called to change device carrier. Soft-devices (like dummy, team, etc)
- * which do not represent real hardware may define this to allow their
-@@ -1401,6 +1412,8 @@ struct net_device_ops {
- int (*ndo_bridge_dellink)(struct net_device *dev,
- struct nlmsghdr *nlh,
- u16 flags);
-+ int (*ndo_flow_offload)(enum flow_offload_type type,
-+ struct flow_offload *flow);
- int (*ndo_change_carrier)(struct net_device *dev,
- bool new_carrier);
- int (*ndo_get_phys_port_id)(struct net_device *dev,
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -21,11 +21,17 @@ struct nf_flowtable_type {
- struct module *owner;
- };
-
-+enum nf_flowtable_flags {
-+ NF_FLOWTABLE_F_HW = 0x1,
-+};
-+
- struct nf_flowtable {
- struct list_head list;
- struct rhashtable rhashtable;
- const struct nf_flowtable_type *type;
-+ u32 flags;
- struct delayed_work gc_work;
-+ possible_net_t ft_net;
- };
-
- enum flow_offload_tuple_dir {
-@@ -68,6 +74,7 @@ struct flow_offload_tuple_rhash {
- #define FLOW_OFFLOAD_DNAT 0x2
- #define FLOW_OFFLOAD_DYING 0x4
- #define FLOW_OFFLOAD_TEARDOWN 0x8
-+#define FLOW_OFFLOAD_HW 0x10
-
- struct flow_offload {
- struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
-@@ -120,6 +127,22 @@ unsigned int nf_flow_offload_ip_hook(voi
- unsigned int nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
- const struct nf_hook_state *state);
-
-+void nf_flow_offload_hw_add(struct net *net, struct flow_offload *flow,
-+ struct nf_conn *ct);
-+void nf_flow_offload_hw_del(struct net *net, struct flow_offload *flow);
-+
-+struct nf_flow_table_hw {
-+ struct module *owner;
-+ void (*add)(struct net *net, struct flow_offload *flow,
-+ struct nf_conn *ct);
-+ void (*del)(struct net *net, struct flow_offload *flow);
-+};
-+
-+int nf_flow_table_hw_register(const struct nf_flow_table_hw *offload);
-+void nf_flow_table_hw_unregister(const struct nf_flow_table_hw *offload);
-+
-+extern struct work_struct nf_flow_offload_hw_work;
-+
- #define MODULE_ALIAS_NF_FLOWTABLE(family) \
- MODULE_ALIAS("nf-flowtable-" __stringify(family))
-
---- a/include/uapi/linux/netfilter/nf_tables.h
-+++ b/include/uapi/linux/netfilter/nf_tables.h
-@@ -1516,6 +1516,7 @@ enum nft_object_attributes {
- * @NFTA_FLOWTABLE_HOOK: netfilter hook configuration(NLA_U32)
- * @NFTA_FLOWTABLE_USE: number of references to this flow table (NLA_U32)
- * @NFTA_FLOWTABLE_HANDLE: object handle (NLA_U64)
-+ * @NFTA_FLOWTABLE_FLAGS: flags (NLA_U32)
- */
- enum nft_flowtable_attributes {
- NFTA_FLOWTABLE_UNSPEC,
-@@ -1525,6 +1526,7 @@ enum nft_flowtable_attributes {
- NFTA_FLOWTABLE_USE,
- NFTA_FLOWTABLE_HANDLE,
- NFTA_FLOWTABLE_PAD,
-+ NFTA_FLOWTABLE_FLAGS,
- __NFTA_FLOWTABLE_MAX
- };
- #define NFTA_FLOWTABLE_MAX (__NFTA_FLOWTABLE_MAX - 1)
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -711,6 +711,15 @@ config NF_FLOW_TABLE
-
- To compile it as a module, choose M here.
-
-+config NF_FLOW_TABLE_HW
-+ tristate "Netfilter flow table hardware offload module"
-+ depends on NF_FLOW_TABLE
-+ help
-+ This option adds hardware offload support for the flow table core
-+ infrastructure.
-+
-+ To compile it as a module, choose M here.
-+
- config NETFILTER_XTABLES
- tristate "Netfilter Xtables support (required for ip_tables)"
- default m if NETFILTER_ADVANCED=n
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -123,6 +123,7 @@ obj-$(CONFIG_NF_FLOW_TABLE) += nf_flow_t
- nf_flow_table-objs := nf_flow_table_core.o nf_flow_table_ip.o
-
- obj-$(CONFIG_NF_FLOW_TABLE_INET) += nf_flow_table_inet.o
-+obj-$(CONFIG_NF_FLOW_TABLE_HW) += nf_flow_table_hw.o
-
- # generic X tables
- obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -248,10 +248,16 @@ static inline bool nf_flow_has_expired(c
- return nf_flow_timeout_delta(flow->timeout) <= 0;
- }
-
-+static inline bool nf_flow_in_hw(const struct flow_offload *flow)
-+{
-+ return flow->flags & FLOW_OFFLOAD_HW;
-+}
-+
- static void flow_offload_del(struct nf_flowtable *flow_table,
- struct flow_offload *flow)
- {
- struct flow_offload_entry *e;
-+ struct net *net = read_pnet(&flow_table->ft_net);
-
- rhashtable_remove_fast(&flow_table->rhashtable,
- &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].node,
-@@ -271,6 +277,9 @@ static void flow_offload_del(struct nf_f
- if (!(flow->flags & FLOW_OFFLOAD_TEARDOWN))
- flow_offload_fixup_ct_state(e->ct);
-
-+ if (nf_flow_in_hw(flow))
-+ nf_flow_offload_hw_del(net, flow);
-+
- flow_offload_free(flow);
- }
-
-@@ -361,6 +370,9 @@ static void nf_flow_offload_gc_step(stru
- if (!teardown)
- nf_ct_offload_timeout(flow);
-
-+ if (nf_flow_in_hw(flow) && !teardown)
-+ return;
-+
- if (nf_flow_has_expired(flow) || teardown)
- flow_offload_del(flow_table, flow);
- }
-@@ -490,10 +502,43 @@ int nf_flow_dnat_port(const struct flow_
- }
- EXPORT_SYMBOL_GPL(nf_flow_dnat_port);
-
-+static const struct nf_flow_table_hw __rcu *nf_flow_table_hw_hook __read_mostly;
-+
-+static int nf_flow_offload_hw_init(struct nf_flowtable *flow_table)
-+{
-+ const struct nf_flow_table_hw *offload;
-+
-+ if (!rcu_access_pointer(nf_flow_table_hw_hook))
-+ request_module("nf-flow-table-hw");
-+
-+ rcu_read_lock();
-+ offload = rcu_dereference(nf_flow_table_hw_hook);
-+ if (!offload)
-+ goto err_no_hw_offload;
-+
-+ if (!try_module_get(offload->owner))
-+ goto err_no_hw_offload;
-+
-+ rcu_read_unlock();
-+
-+ return 0;
-+
-+err_no_hw_offload:
-+ rcu_read_unlock();
-+
-+ return -EOPNOTSUPP;
-+}
-+
- int nf_flow_table_init(struct nf_flowtable *flowtable)
- {
- int err;
-
-+ if (flowtable->flags & NF_FLOWTABLE_F_HW) {
-+ err = nf_flow_offload_hw_init(flowtable);
-+ if (err)
-+ return err;
-+ }
-+
- INIT_DEFERRABLE_WORK(&flowtable->gc_work, nf_flow_offload_work_gc);
-
- err = rhashtable_init(&flowtable->rhashtable,
-@@ -534,6 +579,8 @@ static void nf_flow_table_iterate_cleanu
- {
- nf_flow_table_iterate(flowtable, nf_flow_table_do_cleanup, dev);
- flush_delayed_work(&flowtable->gc_work);
-+ if (flowtable->flags & NF_FLOWTABLE_F_HW)
-+ flush_work(&nf_flow_offload_hw_work);
- }
-
- void nf_flow_table_cleanup(struct net_device *dev)
-@@ -547,6 +594,26 @@ void nf_flow_table_cleanup(struct net_de
- }
- EXPORT_SYMBOL_GPL(nf_flow_table_cleanup);
-
-+struct work_struct nf_flow_offload_hw_work;
-+EXPORT_SYMBOL_GPL(nf_flow_offload_hw_work);
-+
-+/* Give the hardware workqueue the chance to remove entries from hardware.*/
-+static void nf_flow_offload_hw_free(struct nf_flowtable *flowtable)
-+{
-+ const struct nf_flow_table_hw *offload;
-+
-+ flush_work(&nf_flow_offload_hw_work);
-+
-+ rcu_read_lock();
-+ offload = rcu_dereference(nf_flow_table_hw_hook);
-+ if (!offload) {
-+ rcu_read_unlock();
-+ return;
-+ }
-+ module_put(offload->owner);
-+ rcu_read_unlock();
-+}
-+
- void nf_flow_table_free(struct nf_flowtable *flow_table)
- {
- mutex_lock(&flowtable_lock);
-@@ -556,9 +623,58 @@ void nf_flow_table_free(struct nf_flowta
- nf_flow_table_iterate(flow_table, nf_flow_table_do_cleanup, NULL);
- nf_flow_table_iterate(flow_table, nf_flow_offload_gc_step, flow_table);
- rhashtable_destroy(&flow_table->rhashtable);
-+ if (flow_table->flags & NF_FLOWTABLE_F_HW)
-+ nf_flow_offload_hw_free(flow_table);
- }
- EXPORT_SYMBOL_GPL(nf_flow_table_free);
-
-+/* Must be called from user context. */
-+void nf_flow_offload_hw_add(struct net *net, struct flow_offload *flow,
-+ struct nf_conn *ct)
-+{
-+ const struct nf_flow_table_hw *offload;
-+
-+ rcu_read_lock();
-+ offload = rcu_dereference(nf_flow_table_hw_hook);
-+ if (offload)
-+ offload->add(net, flow, ct);
-+ rcu_read_unlock();
-+}
-+EXPORT_SYMBOL_GPL(nf_flow_offload_hw_add);
-+
-+/* Must be called from user context. */
-+void nf_flow_offload_hw_del(struct net *net, struct flow_offload *flow)
-+{
-+ const struct nf_flow_table_hw *offload;
-+
-+ rcu_read_lock();
-+ offload = rcu_dereference(nf_flow_table_hw_hook);
-+ if (offload)
-+ offload->del(net, flow);
-+ rcu_read_unlock();
-+}
-+EXPORT_SYMBOL_GPL(nf_flow_offload_hw_del);
-+
-+int nf_flow_table_hw_register(const struct nf_flow_table_hw *offload)
-+{
-+ if (rcu_access_pointer(nf_flow_table_hw_hook))
-+ return -EBUSY;
-+
-+ rcu_assign_pointer(nf_flow_table_hw_hook, offload);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(nf_flow_table_hw_register);
-+
-+void nf_flow_table_hw_unregister(const struct nf_flow_table_hw *offload)
-+{
-+ WARN_ON(rcu_access_pointer(nf_flow_table_hw_hook) != offload);
-+ rcu_assign_pointer(nf_flow_table_hw_hook, NULL);
-+
-+ synchronize_rcu();
-+}
-+EXPORT_SYMBOL_GPL(nf_flow_table_hw_unregister);
-+
- static int nf_flow_table_netdev_event(struct notifier_block *this,
- unsigned long event, void *ptr)
- {
---- /dev/null
-+++ b/net/netfilter/nf_flow_table_hw.c
-@@ -0,0 +1,169 @@
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/netfilter.h>
-+#include <linux/rhashtable.h>
-+#include <linux/netdevice.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#include <net/netfilter/nf_conntrack_tuple.h>
-+
-+static DEFINE_SPINLOCK(flow_offload_hw_pending_list_lock);
-+static LIST_HEAD(flow_offload_hw_pending_list);
-+
-+static DEFINE_MUTEX(nf_flow_offload_hw_mutex);
-+
-+struct flow_offload_hw {
-+ struct list_head list;
-+ enum flow_offload_type type;
-+ struct flow_offload *flow;
-+ struct nf_conn *ct;
-+ possible_net_t flow_hw_net;
-+};
-+
-+static int do_flow_offload_hw(struct net *net, struct flow_offload *flow,
-+ int type)
-+{
-+ struct net_device *indev;
-+ int ret, ifindex;
-+
-+ ifindex = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.iifidx;
-+ indev = dev_get_by_index(net, ifindex);
-+ if (WARN_ON(!indev))
-+ return 0;
-+
-+ mutex_lock(&nf_flow_offload_hw_mutex);
-+ ret = indev->netdev_ops->ndo_flow_offload(type, flow);
-+ mutex_unlock(&nf_flow_offload_hw_mutex);
-+
-+ dev_put(indev);
-+
-+ return ret;
-+}
-+
-+static void flow_offload_hw_work_add(struct flow_offload_hw *offload)
-+{
-+ struct net *net;
-+ int ret;
-+
-+ if (nf_ct_is_dying(offload->ct))
-+ return;
-+
-+ net = read_pnet(&offload->flow_hw_net);
-+ ret = do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_ADD);
-+ if (ret >= 0)
-+ offload->flow->flags |= FLOW_OFFLOAD_HW;
-+}
-+
-+static void flow_offload_hw_work_del(struct flow_offload_hw *offload)
-+{
-+ struct net *net = read_pnet(&offload->flow_hw_net);
-+
-+ do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_DEL);
-+}
-+
-+static void flow_offload_hw_work(struct work_struct *work)
-+{
-+ struct flow_offload_hw *offload, *next;
-+ LIST_HEAD(hw_offload_pending);
-+
-+ spin_lock_bh(&flow_offload_hw_pending_list_lock);
-+ list_replace_init(&flow_offload_hw_pending_list, &hw_offload_pending);
-+ spin_unlock_bh(&flow_offload_hw_pending_list_lock);
-+
-+ list_for_each_entry_safe(offload, next, &hw_offload_pending, list) {
-+ switch (offload->type) {
-+ case FLOW_OFFLOAD_ADD:
-+ flow_offload_hw_work_add(offload);
-+ break;
-+ case FLOW_OFFLOAD_DEL:
-+ flow_offload_hw_work_del(offload);
-+ break;
-+ }
-+ if (offload->ct)
-+ nf_conntrack_put(&offload->ct->ct_general);
-+ list_del(&offload->list);
-+ kfree(offload);
-+ }
-+}
-+
-+static void flow_offload_queue_work(struct flow_offload_hw *offload)
-+{
-+ spin_lock_bh(&flow_offload_hw_pending_list_lock);
-+ list_add_tail(&offload->list, &flow_offload_hw_pending_list);
-+ spin_unlock_bh(&flow_offload_hw_pending_list_lock);
-+
-+ schedule_work(&nf_flow_offload_hw_work);
-+}
-+
-+static void flow_offload_hw_add(struct net *net, struct flow_offload *flow,
-+ struct nf_conn *ct)
-+{
-+ struct flow_offload_hw *offload;
-+
-+ offload = kmalloc(sizeof(struct flow_offload_hw), GFP_ATOMIC);
-+ if (!offload)
-+ return;
-+
-+ nf_conntrack_get(&ct->ct_general);
-+ offload->type = FLOW_OFFLOAD_ADD;
-+ offload->ct = ct;
-+ offload->flow = flow;
-+ write_pnet(&offload->flow_hw_net, net);
-+
-+ flow_offload_queue_work(offload);
-+}
-+
-+static void flow_offload_hw_del(struct net *net, struct flow_offload *flow)
-+{
-+ struct flow_offload_hw *offload;
-+
-+ offload = kmalloc(sizeof(struct flow_offload_hw), GFP_ATOMIC);
-+ if (!offload)
-+ return;
-+
-+ offload->type = FLOW_OFFLOAD_DEL;
-+ offload->ct = NULL;
-+ offload->flow = flow;
-+ write_pnet(&offload->flow_hw_net, net);
-+
-+ flow_offload_queue_work(offload);
-+}
-+
-+static const struct nf_flow_table_hw flow_offload_hw = {
-+ .add = flow_offload_hw_add,
-+ .del = flow_offload_hw_del,
-+ .owner = THIS_MODULE,
-+};
-+
-+static int __init nf_flow_table_hw_module_init(void)
-+{
-+ INIT_WORK(&nf_flow_offload_hw_work, flow_offload_hw_work);
-+ nf_flow_table_hw_register(&flow_offload_hw);
-+
-+ return 0;
-+}
-+
-+static void __exit nf_flow_table_hw_module_exit(void)
-+{
-+ struct flow_offload_hw *offload, *next;
-+ LIST_HEAD(hw_offload_pending);
-+
-+ nf_flow_table_hw_unregister(&flow_offload_hw);
-+ cancel_work_sync(&nf_flow_offload_hw_work);
-+
-+ list_for_each_entry_safe(offload, next, &hw_offload_pending, list) {
-+ if (offload->ct)
-+ nf_conntrack_put(&offload->ct->ct_general);
-+ list_del(&offload->list);
-+ kfree(offload);
-+ }
-+}
-+
-+module_init(nf_flow_table_hw_module_init);
-+module_exit(nf_flow_table_hw_module_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Pablo Neira Ayuso <pablo@netfilter.org>");
-+MODULE_ALIAS("nf-flow-table-hw");
---- a/net/netfilter/nf_tables_api.c
-+++ b/net/netfilter/nf_tables_api.c
-@@ -5743,6 +5743,13 @@ static int nf_tables_flowtable_parse_hoo
- if (err < 0)
- return err;
-
-+ for (i = 0; i < n; i++) {
-+ if (flowtable->data.flags & NF_FLOWTABLE_F_HW &&
-+ !dev_array[i]->netdev_ops->ndo_flow_offload) {
-+ return -EOPNOTSUPP;
-+ }
-+ }
-+
- ops = kcalloc(n, sizeof(struct nf_hook_ops), GFP_KERNEL);
- if (!ops)
- return -ENOMEM;
-@@ -5873,10 +5880,19 @@ static int nf_tables_newflowtable(struct
- }
-
- flowtable->data.type = type;
-+ write_pnet(&flowtable->data.ft_net, net);
-+
- err = type->init(&flowtable->data);
- if (err < 0)
- goto err3;
-
-+ if (nla[NFTA_FLOWTABLE_FLAGS]) {
-+ flowtable->data.flags =
-+ ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
-+ if (flowtable->data.flags & ~NF_FLOWTABLE_F_HW)
-+ goto err4;
-+ }
-+
- err = nf_tables_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK],
- flowtable);
- if (err < 0)
-@@ -6002,7 +6018,8 @@ static int nf_tables_fill_flowtable_info
- nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
- nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
- nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),
-- NFTA_FLOWTABLE_PAD))
-+ NFTA_FLOWTABLE_PAD) ||
-+ nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags)))
- goto nla_put_failure;
-
- nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK);
---- a/net/netfilter/nft_flow_offload.c
-+++ b/net/netfilter/nft_flow_offload.c
-@@ -128,6 +128,9 @@ static void nft_flow_offload_eval(const
- if (ret < 0)
- goto err_flow_add;
-
-+ if (flowtable->flags & NF_FLOWTABLE_F_HW)
-+ nf_flow_offload_hw_add(nft_net(pkt), flow, ct);
-+
- dst_release(route.tuple[!dir].dst);
- return;
-
diff --git a/target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch b/target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
deleted file mode 100644
index b808c0257d..0000000000
--- a/target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
+++ /dev/null
@@ -1,306 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 15 Mar 2018 20:46:31 +0100
-Subject: [PATCH] netfilter: nf_flow_table: support hw offload through
- virtual interfaces
-
-There are hardware offload devices that support offloading VLANs and
-PPPoE devices. Additionally, it is useful to be able to offload packets
-routed through bridge interfaces as well.
-Add support for finding the path to the offload device through these
-virtual interfaces, while collecting useful parameters for the offload
-device, like VLAN ID/protocol, PPPoE session and Ethernet MAC address.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -923,6 +923,7 @@ struct tlsdev_ops;
-
-
- struct flow_offload;
-+struct flow_offload_hw_path;
-
- enum flow_offload_type {
- FLOW_OFFLOAD_ADD = 0,
-@@ -1161,8 +1162,15 @@ enum flow_offload_type {
- * int (*ndo_bridge_dellink)(struct net_device *dev, struct nlmsghdr *nlh,
- * u16 flags);
- *
-+ * int (*ndo_flow_offload_check)(struct flow_offload_hw_path *path);
-+ * For virtual devices like bridges, vlan, and pppoe, fill in the
-+ * underlying network device that can be used for offloading connections.
-+ * Return an error if offloading is not supported.
-+ *
- * int (*ndo_flow_offload)(enum flow_offload_type type,
-- * struct flow_offload *flow);
-+ * struct flow_offload *flow,
-+ * struct flow_offload_hw_path *src,
-+ * struct flow_offload_hw_path *dest);
- * Adds/deletes flow entry to/from net device flowtable.
- *
- * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
-@@ -1412,8 +1420,11 @@ struct net_device_ops {
- int (*ndo_bridge_dellink)(struct net_device *dev,
- struct nlmsghdr *nlh,
- u16 flags);
-+ int (*ndo_flow_offload_check)(struct flow_offload_hw_path *path);
- int (*ndo_flow_offload)(enum flow_offload_type type,
-- struct flow_offload *flow);
-+ struct flow_offload *flow,
-+ struct flow_offload_hw_path *src,
-+ struct flow_offload_hw_path *dest);
- int (*ndo_change_carrier)(struct net_device *dev,
- bool new_carrier);
- int (*ndo_get_phys_port_id)(struct net_device *dev,
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -85,6 +85,21 @@ struct flow_offload {
- };
- };
-
-+#define FLOW_OFFLOAD_PATH_ETHERNET BIT(0)
-+#define FLOW_OFFLOAD_PATH_VLAN BIT(1)
-+#define FLOW_OFFLOAD_PATH_PPPOE BIT(2)
-+
-+struct flow_offload_hw_path {
-+ struct net_device *dev;
-+ u32 flags;
-+
-+ u8 eth_src[ETH_ALEN];
-+ u8 eth_dest[ETH_ALEN];
-+ u16 vlan_proto;
-+ u16 vlan_id;
-+ u16 pppoe_sid;
-+};
-+
- #define NF_FLOW_TIMEOUT (30 * HZ)
-
- struct nf_flow_route {
---- a/net/netfilter/nf_flow_table_hw.c
-+++ b/net/netfilter/nf_flow_table_hw.c
-@@ -19,48 +19,77 @@ struct flow_offload_hw {
- enum flow_offload_type type;
- struct flow_offload *flow;
- struct nf_conn *ct;
-- possible_net_t flow_hw_net;
-+
-+ struct flow_offload_hw_path src;
-+ struct flow_offload_hw_path dest;
- };
-
--static int do_flow_offload_hw(struct net *net, struct flow_offload *flow,
-- int type)
-+static void flow_offload_check_ethernet(struct flow_offload_tuple *tuple,
-+ struct dst_entry *dst,
-+ struct flow_offload_hw_path *path)
- {
-- struct net_device *indev;
-- int ret, ifindex;
-+ struct net_device *dev = path->dev;
-+ struct neighbour *n;
-
-- ifindex = flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple.iifidx;
-- indev = dev_get_by_index(net, ifindex);
-- if (WARN_ON(!indev))
-- return 0;
--
-- mutex_lock(&nf_flow_offload_hw_mutex);
-- ret = indev->netdev_ops->ndo_flow_offload(type, flow);
-- mutex_unlock(&nf_flow_offload_hw_mutex);
-+ if (dev->type != ARPHRD_ETHER)
-+ return;
-
-- dev_put(indev);
-+ memcpy(path->eth_src, path->dev->dev_addr, ETH_ALEN);
-+ n = dst_neigh_lookup(dst, &tuple->src_v4);
-+ if (!n)
-+ return;
-
-- return ret;
-+ memcpy(path->eth_dest, n->ha, ETH_ALEN);
-+ path->flags |= FLOW_OFFLOAD_PATH_ETHERNET;
-+ neigh_release(n);
- }
-
--static void flow_offload_hw_work_add(struct flow_offload_hw *offload)
-+static int flow_offload_check_path(struct net *net,
-+ struct flow_offload_tuple *tuple,
-+ struct dst_entry *dst,
-+ struct flow_offload_hw_path *path)
- {
-- struct net *net;
-- int ret;
-+ struct net_device *dev;
-
-- if (nf_ct_is_dying(offload->ct))
-- return;
-+ dev = dev_get_by_index_rcu(net, tuple->iifidx);
-+ if (!dev)
-+ return -ENOENT;
-+
-+ path->dev = dev;
-+ flow_offload_check_ethernet(tuple, dst, path);
-
-- net = read_pnet(&offload->flow_hw_net);
-- ret = do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_ADD);
-- if (ret >= 0)
-- offload->flow->flags |= FLOW_OFFLOAD_HW;
-+ if (dev->netdev_ops->ndo_flow_offload_check)
-+ return dev->netdev_ops->ndo_flow_offload_check(path);
-+
-+ return 0;
- }
-
--static void flow_offload_hw_work_del(struct flow_offload_hw *offload)
-+static int do_flow_offload_hw(struct flow_offload_hw *offload)
- {
-- struct net *net = read_pnet(&offload->flow_hw_net);
-+ struct net_device *src_dev = offload->src.dev;
-+ struct net_device *dest_dev = offload->dest.dev;
-+ int ret;
-+
-+ ret = src_dev->netdev_ops->ndo_flow_offload(offload->type,
-+ offload->flow,
-+ &offload->src,
-+ &offload->dest);
-+
-+ /* restore devices in case the driver mangled them */
-+ offload->src.dev = src_dev;
-+ offload->dest.dev = dest_dev;
-
-- do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_DEL);
-+ return ret;
-+}
-+
-+static void flow_offload_hw_free(struct flow_offload_hw *offload)
-+{
-+ dev_put(offload->src.dev);
-+ dev_put(offload->dest.dev);
-+ if (offload->ct)
-+ nf_conntrack_put(&offload->ct->ct_general);
-+ list_del(&offload->list);
-+ kfree(offload);
- }
-
- static void flow_offload_hw_work(struct work_struct *work)
-@@ -73,18 +102,22 @@ static void flow_offload_hw_work(struct
- spin_unlock_bh(&flow_offload_hw_pending_list_lock);
-
- list_for_each_entry_safe(offload, next, &hw_offload_pending, list) {
-+ mutex_lock(&nf_flow_offload_hw_mutex);
- switch (offload->type) {
- case FLOW_OFFLOAD_ADD:
-- flow_offload_hw_work_add(offload);
-+ if (nf_ct_is_dying(offload->ct))
-+ break;
-+
-+ if (do_flow_offload_hw(offload) >= 0)
-+ offload->flow->flags |= FLOW_OFFLOAD_HW;
- break;
- case FLOW_OFFLOAD_DEL:
-- flow_offload_hw_work_del(offload);
-+ do_flow_offload_hw(offload);
- break;
- }
-- if (offload->ct)
-- nf_conntrack_put(&offload->ct->ct_general);
-- list_del(&offload->list);
-- kfree(offload);
-+ mutex_unlock(&nf_flow_offload_hw_mutex);
-+
-+ flow_offload_hw_free(offload);
- }
- }
-
-@@ -97,20 +130,56 @@ static void flow_offload_queue_work(stru
- schedule_work(&nf_flow_offload_hw_work);
- }
-
-+static struct flow_offload_hw *
-+flow_offload_hw_prepare(struct net *net, struct flow_offload *flow)
-+{
-+ struct flow_offload_hw_path src = {};
-+ struct flow_offload_hw_path dest = {};
-+ struct flow_offload_tuple *tuple_s, *tuple_d;
-+ struct flow_offload_hw *offload = NULL;
-+
-+ rcu_read_lock_bh();
-+
-+ tuple_s = &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple;
-+ tuple_d = &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple;
-+
-+ if (flow_offload_check_path(net, tuple_s, tuple_d->dst_cache, &src))
-+ goto out;
-+
-+ if (flow_offload_check_path(net, tuple_d, tuple_s->dst_cache, &dest))
-+ goto out;
-+
-+ if (!src.dev->netdev_ops->ndo_flow_offload)
-+ goto out;
-+
-+ offload = kzalloc(sizeof(struct flow_offload_hw), GFP_ATOMIC);
-+ if (!offload)
-+ goto out;
-+
-+ dev_hold(src.dev);
-+ dev_hold(dest.dev);
-+ offload->src = src;
-+ offload->dest = dest;
-+ offload->flow = flow;
-+
-+out:
-+ rcu_read_unlock_bh();
-+
-+ return offload;
-+}
-+
- static void flow_offload_hw_add(struct net *net, struct flow_offload *flow,
- struct nf_conn *ct)
- {
- struct flow_offload_hw *offload;
-
-- offload = kmalloc(sizeof(struct flow_offload_hw), GFP_ATOMIC);
-+ offload = flow_offload_hw_prepare(net, flow);
- if (!offload)
- return;
-
- nf_conntrack_get(&ct->ct_general);
- offload->type = FLOW_OFFLOAD_ADD;
- offload->ct = ct;
-- offload->flow = flow;
-- write_pnet(&offload->flow_hw_net, net);
-
- flow_offload_queue_work(offload);
- }
-@@ -119,14 +188,11 @@ static void flow_offload_hw_del(struct n
- {
- struct flow_offload_hw *offload;
-
-- offload = kmalloc(sizeof(struct flow_offload_hw), GFP_ATOMIC);
-+ offload = flow_offload_hw_prepare(net, flow);
- if (!offload)
- return;
-
- offload->type = FLOW_OFFLOAD_DEL;
-- offload->ct = NULL;
-- offload->flow = flow;
-- write_pnet(&offload->flow_hw_net, net);
-
- flow_offload_queue_work(offload);
- }
-@@ -153,12 +219,8 @@ static void __exit nf_flow_table_hw_modu
- nf_flow_table_hw_unregister(&flow_offload_hw);
- cancel_work_sync(&nf_flow_offload_hw_work);
-
-- list_for_each_entry_safe(offload, next, &hw_offload_pending, list) {
-- if (offload->ct)
-- nf_conntrack_put(&offload->ct->ct_general);
-- list_del(&offload->list);
-- kfree(offload);
-- }
-+ list_for_each_entry_safe(offload, next, &hw_offload_pending, list)
-+ flow_offload_hw_free(offload);
- }
-
- module_init(nf_flow_table_hw_module_init);
diff --git a/target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch b/target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch
deleted file mode 100644
index cfcc28af3e..0000000000
--- a/target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 15 Mar 2018 20:49:58 +0100
-Subject: [PATCH] net: 8021q: support hardware flow table offload
-
-Add the VLAN ID and protocol information
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/8021q/vlan_dev.c
-+++ b/net/8021q/vlan_dev.c
-@@ -27,6 +27,11 @@
- #include <linux/phy.h>
- #include <net/arp.h>
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#endif
-+
- #include "vlan.h"
- #include "vlanproc.h"
- #include <linux/if_vlan.h>
-@@ -747,6 +752,27 @@ static int vlan_dev_get_iflink(const str
- return real_dev->ifindex;
- }
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+static int vlan_dev_flow_offload_check(struct flow_offload_hw_path *path)
-+{
-+ struct net_device *dev = path->dev;
-+ struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
-+
-+ if (path->flags & FLOW_OFFLOAD_PATH_VLAN)
-+ return -EEXIST;
-+
-+ path->flags |= FLOW_OFFLOAD_PATH_VLAN;
-+ path->vlan_proto = vlan->vlan_proto;
-+ path->vlan_id = vlan->vlan_id;
-+ path->dev = vlan->real_dev;
-+
-+ if (vlan->real_dev->netdev_ops->ndo_flow_offload_check)
-+ return vlan->real_dev->netdev_ops->ndo_flow_offload_check(path);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_NF_FLOW_TABLE */
-+
- static const struct ethtool_ops vlan_ethtool_ops = {
- .get_link_ksettings = vlan_ethtool_get_link_ksettings,
- .get_drvinfo = vlan_ethtool_get_drvinfo,
-@@ -785,6 +811,9 @@ static const struct net_device_ops vlan_
- #endif
- .ndo_fix_features = vlan_dev_fix_features,
- .ndo_get_iflink = vlan_dev_get_iflink,
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ .ndo_flow_offload_check = vlan_dev_flow_offload_check,
-+#endif
- };
-
- static void vlan_dev_free(struct net_device *dev)
diff --git a/target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch b/target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch
deleted file mode 100644
index fcfac748cb..0000000000
--- a/target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 15 Mar 2018 20:50:37 +0100
-Subject: [PATCH] net: bridge: support hardware flow table offload
-
-Look up the real device and pass it on
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/bridge/br_device.c
-+++ b/net/bridge/br_device.c
-@@ -14,6 +14,10 @@
- #include <linux/ethtool.h>
- #include <linux/list.h>
- #include <linux/netfilter_bridge.h>
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#endif
-
- #include <linux/uaccess.h>
- #include "br_private.h"
-@@ -384,6 +388,28 @@ static const struct ethtool_ops br_ethto
- .get_link = ethtool_op_get_link,
- };
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+static int br_flow_offload_check(struct flow_offload_hw_path *path)
-+{
-+ struct net_device *dev = path->dev;
-+ struct net_bridge *br = netdev_priv(dev);
-+ struct net_bridge_fdb_entry *dst;
-+
-+ if (!(path->flags & FLOW_OFFLOAD_PATH_ETHERNET))
-+ return -EINVAL;
-+
-+ dst = br_fdb_find_rcu(br, path->eth_dest, path->vlan_id);
-+ if (!dst || !dst->dst)
-+ return -ENOENT;
-+
-+ path->dev = dst->dst->dev;
-+ if (path->dev->netdev_ops->ndo_flow_offload_check)
-+ return path->dev->netdev_ops->ndo_flow_offload_check(path);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_NF_FLOW_TABLE */
-+
- static const struct net_device_ops br_netdev_ops = {
- .ndo_open = br_dev_open,
- .ndo_stop = br_dev_stop,
-@@ -412,6 +438,9 @@ static const struct net_device_ops br_ne
- .ndo_bridge_setlink = br_setlink,
- .ndo_bridge_dellink = br_dellink,
- .ndo_features_check = passthru_features_check,
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ .ndo_flow_offload_check = br_flow_offload_check,
-+#endif
- };
-
- static struct device_type br_type = {
diff --git a/target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch b/target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch
deleted file mode 100644
index b09b3bc5e8..0000000000
--- a/target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 15 Mar 2018 21:15:00 +0100
-Subject: [PATCH] net: pppoe: support hardware flow table offload
-
-Pass on the PPPoE session ID and the remote MAC address
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ppp/ppp_generic.c
-+++ b/drivers/net/ppp/ppp_generic.c
-@@ -53,6 +53,11 @@
- #include <net/net_namespace.h>
- #include <net/netns/generic.h>
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#endif
-+
- #define PPP_VERSION "2.4.2"
-
- /*
-@@ -1378,12 +1383,37 @@ static void ppp_dev_priv_destructor(stru
- ppp_destroy_interface(ppp);
- }
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+static int ppp_flow_offload_check(struct flow_offload_hw_path *path)
-+{
-+ struct ppp *ppp = netdev_priv(path->dev);
-+ struct ppp_channel *chan;
-+ struct channel *pch;
-+
-+ if (ppp->flags & SC_MULTILINK)
-+ return -EOPNOTSUPP;
-+
-+ if (list_empty(&ppp->channels))
-+ return -ENODEV;
-+
-+ pch = list_first_entry(&ppp->channels, struct channel, clist);
-+ chan = pch->chan;
-+ if (!chan->ops->flow_offload_check)
-+ return -EOPNOTSUPP;
-+
-+ return chan->ops->flow_offload_check(chan, path);
-+}
-+#endif /* CONFIG_NF_FLOW_TABLE */
-+
- static const struct net_device_ops ppp_netdev_ops = {
- .ndo_init = ppp_dev_init,
- .ndo_uninit = ppp_dev_uninit,
- .ndo_start_xmit = ppp_start_xmit,
- .ndo_do_ioctl = ppp_net_ioctl,
- .ndo_get_stats64 = ppp_get_stats64,
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ .ndo_flow_offload_check = ppp_flow_offload_check,
-+#endif
- };
-
- static struct device_type ppp_type = {
---- a/drivers/net/ppp/pppoe.c
-+++ b/drivers/net/ppp/pppoe.c
-@@ -73,6 +73,11 @@
- #include <linux/proc_fs.h>
- #include <linux/seq_file.h>
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#endif
-+
- #include <linux/nsproxy.h>
- #include <net/net_namespace.h>
- #include <net/netns/generic.h>
-@@ -974,8 +979,36 @@ static int pppoe_xmit(struct ppp_channel
- return __pppoe_xmit(sk, skb);
- }
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+static int pppoe_flow_offload_check(struct ppp_channel *chan,
-+ struct flow_offload_hw_path *path)
-+{
-+ struct sock *sk = (struct sock *)chan->private;
-+ struct pppox_sock *po = pppox_sk(sk);
-+ struct net_device *dev = po->pppoe_dev;
-+
-+ if (sock_flag(sk, SOCK_DEAD) ||
-+ !(sk->sk_state & PPPOX_CONNECTED) || !dev)
-+ return -ENODEV;
-+
-+ path->dev = po->pppoe_dev;
-+ path->flags |= FLOW_OFFLOAD_PATH_PPPOE;
-+ memcpy(path->eth_src, po->pppoe_dev->dev_addr, ETH_ALEN);
-+ memcpy(path->eth_dest, po->pppoe_pa.remote, ETH_ALEN);
-+ path->pppoe_sid = be16_to_cpu(po->num);
-+
-+ if (path->dev->netdev_ops->ndo_flow_offload_check)
-+ return path->dev->netdev_ops->ndo_flow_offload_check(path);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_NF_FLOW_TABLE */
-+
- static const struct ppp_channel_ops pppoe_chan_ops = {
- .start_xmit = pppoe_xmit,
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ .flow_offload_check = pppoe_flow_offload_check,
-+#endif
- };
-
- static int pppoe_recvmsg(struct socket *sock, struct msghdr *m,
---- a/include/linux/ppp_channel.h
-+++ b/include/linux/ppp_channel.h
-@@ -28,6 +28,10 @@ struct ppp_channel_ops {
- int (*start_xmit)(struct ppp_channel *, struct sk_buff *);
- /* Handle an ioctl call that has come in via /dev/ppp. */
- int (*ioctl)(struct ppp_channel *, unsigned int, unsigned long);
-+
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ int (*flow_offload_check)(struct ppp_channel *, struct flow_offload_hw_path *);
-+#endif
- };
-
- struct ppp_channel {
diff --git a/target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch b/target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch
deleted file mode 100644
index 3c44c29273..0000000000
--- a/target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 25 Mar 2018 21:10:55 +0200
-Subject: [PATCH] netfilter: nf_flow_table: rework hardware offload timeout
- handling
-
-Some offload implementations send keepalive packets + explicit
-notifications of TCP FIN/RST packets. In this case it is more convenient
-to simply let the driver update flow->timeout handling and use the
-regular flow offload gc step.
-
-For drivers that manage their own lifetime, a separate flag can be set
-to avoid gc timeouts.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -75,6 +75,7 @@ struct flow_offload_tuple_rhash {
- #define FLOW_OFFLOAD_DYING 0x4
- #define FLOW_OFFLOAD_TEARDOWN 0x8
- #define FLOW_OFFLOAD_HW 0x10
-+#define FLOW_OFFLOAD_KEEP 0x20
-
- struct flow_offload {
- struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
---- a/net/netfilter/nf_flow_table_core.c
-+++ b/net/netfilter/nf_flow_table_core.c
-@@ -370,7 +370,7 @@ static void nf_flow_offload_gc_step(stru
- if (!teardown)
- nf_ct_offload_timeout(flow);
-
-- if (nf_flow_in_hw(flow) && !teardown)
-+ if ((flow->flags & FLOW_OFFLOAD_KEEP) && !teardown)
- return;
-
- if (nf_flow_has_expired(flow) || teardown)
diff --git a/target/linux/generic/pending-5.4/646-netfilter-nf_flow_table-rework-private-driver-data.patch b/target/linux/generic/pending-5.4/646-netfilter-nf_flow_table-rework-private-driver-data.patch
deleted file mode 100644
index 159ad8a0aa..0000000000
--- a/target/linux/generic/pending-5.4/646-netfilter-nf_flow_table-rework-private-driver-data.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 27 Apr 2018 14:42:14 +0200
-Subject: [PATCH] netfilter: nf_flow_table: rework private driver data
-
-Move the timeout out of the union, since it can be shared between the
-driver and the stack. Add a private pointer that the driver can use to
-point to its own data structures
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -80,9 +80,10 @@ struct flow_offload_tuple_rhash {
- struct flow_offload {
- struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
- u32 flags;
-+ u32 timeout;
- union {
- /* Your private driver data here. */
-- u32 timeout;
-+ void *priv;
- };
- };
-
diff --git a/target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch b/target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch
deleted file mode 100644
index 91aae5b65c..0000000000
--- a/target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 17 Sep 2020 18:41:23 +0200
-Subject: [PATCH] net: dsa: support hardware flow table offload
-
-Look up the master device and the port id
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/net/netfilter/nf_flow_table.h
-+++ b/include/net/netfilter/nf_flow_table.h
-@@ -90,6 +90,7 @@ struct flow_offload {
- #define FLOW_OFFLOAD_PATH_ETHERNET BIT(0)
- #define FLOW_OFFLOAD_PATH_VLAN BIT(1)
- #define FLOW_OFFLOAD_PATH_PPPOE BIT(2)
-+#define FLOW_OFFLOAD_PATH_DSA BIT(3)
-
- struct flow_offload_hw_path {
- struct net_device *dev;
-@@ -100,6 +101,7 @@ struct flow_offload_hw_path {
- u16 vlan_proto;
- u16 vlan_id;
- u16 pppoe_sid;
-+ u16 dsa_port;
- };
-
- #define NF_FLOW_TIMEOUT (30 * HZ)
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -19,6 +19,10 @@
- #include <linux/if_bridge.h>
- #include <linux/netpoll.h>
- #include <linux/ptp_classify.h>
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
-+#endif
-
- #include "dsa_priv.h"
-
-@@ -1226,6 +1230,27 @@ static struct devlink_port *dsa_slave_ge
- return dp->ds->devlink ? &dp->devlink_port : NULL;
- }
-
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+static int dsa_flow_offload_check(struct flow_offload_hw_path *path)
-+{
-+ struct net_device *dev = path->dev;
-+ struct dsa_port *dp;
-+
-+ if (!(path->flags & FLOW_OFFLOAD_PATH_ETHERNET))
-+ return -EINVAL;
-+
-+ dp = dsa_slave_to_port(dev);
-+ path->dsa_port = dp->index;
-+ path->dev = dsa_slave_to_master(dev);
-+ path->flags |= FLOW_OFFLOAD_PATH_DSA;
-+
-+ if (path->dev->netdev_ops->ndo_flow_offload_check)
-+ return path->dev->netdev_ops->ndo_flow_offload_check(path);
-+
-+ return 0;
-+}
-+#endif /* CONFIG_NF_FLOW_TABLE */
-+
- static const struct net_device_ops dsa_slave_netdev_ops = {
- .ndo_open = dsa_slave_open,
- .ndo_stop = dsa_slave_close,
-@@ -1250,6 +1275,9 @@ static const struct net_device_ops dsa_s
- .ndo_vlan_rx_add_vid = dsa_slave_vlan_rx_add_vid,
- .ndo_vlan_rx_kill_vid = dsa_slave_vlan_rx_kill_vid,
- .ndo_get_devlink_port = dsa_slave_get_devlink_port,
-+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
-+ .ndo_flow_offload_check = dsa_flow_offload_check,
-+#endif
- };
-
- static struct device_type dsa_type = {
diff --git a/target/linux/generic/pending-5.4/655-increase_skb_pad.patch b/target/linux/generic/pending-5.4/655-increase_skb_pad.patch
deleted file mode 100644
index e325301d3c..0000000000
--- a/target/linux/generic/pending-5.4/655-increase_skb_pad.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance
-
-lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/skbuff.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -2650,7 +2650,7 @@ static inline int pskb_network_may_pull(
- * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
- */
- #ifndef NET_SKB_PAD
--#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD max(64, L1_CACHE_BYTES)
- #endif
-
- int ___pskb_trim(struct sk_buff *skb, unsigned int len);
diff --git a/target/linux/generic/pending-5.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-5.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
deleted file mode 100644
index 39f7af29d9..0000000000
--- a/target/linux/generic/pending-5.4/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
+++ /dev/null
@@ -1,501 +0,0 @@
-From: Steven Barth <steven@midlink.org>
-Subject: Add support for MAP-E FMRs (mesh mode)
-
-MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication
-between MAP CEs (mesh mode) without the need to forward such data to a
-border relay. This is similar to how 6rd works but for IPv4 over IPv6.
-
-Signed-off-by: Steven Barth <cyrus@openwrt.org>
----
- include/net/ip6_tunnel.h | 13 ++
- include/uapi/linux/if_tunnel.h | 13 ++
- net/ipv6/ip6_tunnel.c | 276 +++++++++++++++++++++++++++++++++++++++--
- 3 files changed, 291 insertions(+), 11 deletions(-)
-
---- a/include/net/ip6_tunnel.h
-+++ b/include/net/ip6_tunnel.h
-@@ -18,6 +18,18 @@
- /* determine capability on a per-packet basis */
- #define IP6_TNL_F_CAP_PER_PACKET 0x40000
-
-+/* IPv6 tunnel FMR */
-+struct __ip6_tnl_fmr {
-+ struct __ip6_tnl_fmr *next; /* next fmr in list */
-+ struct in6_addr ip6_prefix;
-+ struct in_addr ip4_prefix;
-+
-+ __u8 ip6_prefix_len;
-+ __u8 ip4_prefix_len;
-+ __u8 ea_len;
-+ __u8 offset;
-+};
-+
- struct __ip6_tnl_parm {
- char name[IFNAMSIZ]; /* name of tunnel device */
- int link; /* ifindex of underlying L2 interface */
-@@ -29,6 +41,7 @@ struct __ip6_tnl_parm {
- __u32 flags; /* tunnel flags */
- struct in6_addr laddr; /* local tunnel end-point address */
- struct in6_addr raddr; /* remote tunnel end-point address */
-+ struct __ip6_tnl_fmr *fmrs; /* FMRs */
-
- __be16 i_flags;
- __be16 o_flags;
---- a/include/uapi/linux/if_tunnel.h
-+++ b/include/uapi/linux/if_tunnel.h
-@@ -77,10 +77,23 @@ enum {
- IFLA_IPTUN_ENCAP_DPORT,
- IFLA_IPTUN_COLLECT_METADATA,
- IFLA_IPTUN_FWMARK,
-+ IFLA_IPTUN_FMRS,
- __IFLA_IPTUN_MAX,
- };
- #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
-
-+enum {
-+ IFLA_IPTUN_FMR_UNSPEC,
-+ IFLA_IPTUN_FMR_IP6_PREFIX,
-+ IFLA_IPTUN_FMR_IP4_PREFIX,
-+ IFLA_IPTUN_FMR_IP6_PREFIX_LEN,
-+ IFLA_IPTUN_FMR_IP4_PREFIX_LEN,
-+ IFLA_IPTUN_FMR_EA_LEN,
-+ IFLA_IPTUN_FMR_OFFSET,
-+ __IFLA_IPTUN_FMR_MAX,
-+};
-+#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1)
-+
- enum tunnel_encap_types {
- TUNNEL_ENCAP_NONE,
- TUNNEL_ENCAP_FOU,
---- a/net/ipv6/ip6_tunnel.c
-+++ b/net/ipv6/ip6_tunnel.c
-@@ -11,6 +11,9 @@
- * linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c
- *
- * RFC 2473
-+ *
-+ * Changes:
-+ * Steven Barth <cyrus@openwrt.org>: MAP-E FMR support
- */
-
- #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-@@ -67,9 +70,9 @@ static bool log_ecn_error = true;
- module_param(log_ecn_error, bool, 0644);
- MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
-
--static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2)
-+static u32 HASH(const struct in6_addr *addr)
- {
-- u32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2);
-+ u32 hash = ipv6_addr_hash(addr);
-
- return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT);
- }
-@@ -136,20 +139,29 @@ static struct net_device_stats *ip6_get_
- static struct ip6_tnl *
- ip6_tnl_lookup(struct net *net, const struct in6_addr *remote, const struct in6_addr *local)
- {
-- unsigned int hash = HASH(remote, local);
-+ unsigned int hash = HASH(local);
- struct ip6_tnl *t;
- struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
- struct in6_addr any;
-+ struct __ip6_tnl_fmr *fmr;
-
- for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
-- if (ipv6_addr_equal(local, &t->parms.laddr) &&
-- ipv6_addr_equal(remote, &t->parms.raddr) &&
-- (t->dev->flags & IFF_UP))
-+ if (!ipv6_addr_equal(local, &t->parms.laddr) ||
-+ !(t->dev->flags & IFF_UP))
-+ continue;
-+
-+ if (ipv6_addr_equal(remote, &t->parms.raddr))
- return t;
-+
-+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
-+ if (ipv6_prefix_equal(remote, &fmr->ip6_prefix,
-+ fmr->ip6_prefix_len))
-+ return t;
-+ }
- }
-
- memset(&any, 0, sizeof(any));
-- hash = HASH(&any, local);
-+ hash = HASH(local);
- for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
- if (ipv6_addr_equal(local, &t->parms.laddr) &&
- ipv6_addr_any(&t->parms.raddr) &&
-@@ -157,7 +169,7 @@ ip6_tnl_lookup(struct net *net, const st
- return t;
- }
-
-- hash = HASH(remote, &any);
-+ hash = HASH(&any);
- for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
- if (ipv6_addr_equal(remote, &t->parms.raddr) &&
- ipv6_addr_any(&t->parms.laddr) &&
-@@ -197,7 +209,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
-
- if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {
- prio = 1;
-- h = HASH(remote, local);
-+ h = HASH(local);
- }
- return &ip6n->tnls[prio][h];
- }
-@@ -377,6 +389,12 @@ ip6_tnl_dev_uninit(struct net_device *de
- struct net *net = t->net;
- struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
-
-+ while (t->parms.fmrs) {
-+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next;
-+ kfree(t->parms.fmrs);
-+ t->parms.fmrs = next;
-+ }
-+
- if (dev == ip6n->fb_tnl_dev)
- RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL);
- else
-@@ -766,6 +784,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
- }
- EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);
-
-+/**
-+ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR
-+ * @dest: destination IPv6 address buffer
-+ * @skb: received socket buffer
-+ * @fmr: MAP FMR
-+ * @xmit: Calculate for xmit or rcv
-+ **/
-+static void ip4ip6_fmr_calc(struct in6_addr *dest,
-+ const struct iphdr *iph, const uint8_t *end,
-+ const struct __ip6_tnl_fmr *fmr, bool xmit)
-+{
-+ int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len);
-+ u8 *portp = NULL;
-+ bool use_dest_addr;
-+ const struct iphdr *dsth = iph;
-+
-+ if ((u8*)dsth >= end)
-+ return;
-+
-+ /* find significant IP header */
-+ if (iph->protocol == IPPROTO_ICMP) {
-+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);
-+ if (ih && ((u8*)&ih[1]) <= end && (
-+ ih->type == ICMP_DEST_UNREACH ||
-+ ih->type == ICMP_SOURCE_QUENCH ||
-+ ih->type == ICMP_TIME_EXCEEDED ||
-+ ih->type == ICMP_PARAMETERPROB ||
-+ ih->type == ICMP_REDIRECT))
-+ dsth = (const struct iphdr*)&ih[1];
-+ }
-+
-+ /* in xmit-path use dest port by default and source port only if
-+ this is an ICMP reply to something else; vice versa in rcv-path */
-+ use_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph);
-+
-+ /* get dst port */
-+ if (((u8*)&dsth[1]) <= end && (
-+ dsth->protocol == IPPROTO_UDP ||
-+ dsth->protocol == IPPROTO_TCP ||
-+ dsth->protocol == IPPROTO_SCTP ||
-+ dsth->protocol == IPPROTO_DCCP)) {
-+ /* for UDP, TCP, SCTP and DCCP source and dest port
-+ follow IPv4 header directly */
-+ portp = ((u8*)dsth) + dsth->ihl * 4;
-+
-+ if (use_dest_addr)
-+ portp += sizeof(u16);
-+ } else if (iph->protocol == IPPROTO_ICMP) {
-+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);
-+
-+ /* use icmp identifier as port */
-+ if (((u8*)&ih) <= end && (
-+ (use_dest_addr && (
-+ ih->type == ICMP_ECHOREPLY ||
-+ ih->type == ICMP_TIMESTAMPREPLY ||
-+ ih->type == ICMP_INFO_REPLY ||
-+ ih->type == ICMP_ADDRESSREPLY)) ||
-+ (!use_dest_addr && (
-+ ih->type == ICMP_ECHO ||
-+ ih->type == ICMP_TIMESTAMP ||
-+ ih->type == ICMP_INFO_REQUEST ||
-+ ih->type == ICMP_ADDRESS)
-+ )))
-+ portp = (u8*)&ih->un.echo.id;
-+ }
-+
-+ if ((portp && &portp[2] <= end) || psidlen == 0) {
-+ int frombyte = fmr->ip6_prefix_len / 8;
-+ int fromrem = fmr->ip6_prefix_len % 8;
-+ int bytes = sizeof(struct in6_addr) - frombyte;
-+ const u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr;
-+ u64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len);
-+ u64 t = 0;
-+
-+ /* extract PSID from port and add it to eabits */
-+ u16 psidbits = 0;
-+ if (psidlen > 0) {
-+ psidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]);
-+ psidbits >>= 16 - psidlen - fmr->offset;
-+ psidbits = (u16)(psidbits << (16 - psidlen));
-+ eabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen));
-+ }
-+
-+ /* rewrite destination address */
-+ *dest = fmr->ip6_prefix;
-+ memcpy(&dest->s6_addr[10], addr, sizeof(*addr));
-+ dest->s6_addr16[7] = htons(psidbits >> (16 - psidlen));
-+
-+ if (bytes > sizeof(u64))
-+ bytes = sizeof(u64);
-+
-+ /* insert eabits */
-+ memcpy(&t, &dest->s6_addr[frombyte], bytes);
-+ t = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1)
-+ << (64 - fmr->ea_len - fromrem));
-+ t = cpu_to_be64(t | (eabits >> fromrem));
-+ memcpy(&dest->s6_addr[frombyte], &t, bytes);
-+ }
-+}
-+
-+
- static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
- const struct tnl_ptk_info *tpi,
- struct metadata_dst *tun_dst,
-@@ -818,6 +937,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl
- skb_reset_network_header(skb);
- memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
-
-+ if (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs &&
-+ !ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) {
-+ /* Packet didn't come from BR, so lookup FMR */
-+ struct __ip6_tnl_fmr *fmr;
-+ struct in6_addr expected = tunnel->parms.raddr;
-+ for (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next)
-+ if (ipv6_prefix_equal(&ipv6h->saddr,
-+ &fmr->ip6_prefix, fmr->ip6_prefix_len))
-+ break;
-+
-+ /* Check that IPv6 matches IPv4 source to prevent spoofing */
-+ if (fmr)
-+ ip4ip6_fmr_calc(&expected, ip_hdr(skb),
-+ skb_tail_pointer(skb), fmr, false);
-+
-+ if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) {
-+ rcu_read_unlock();
-+ goto drop;
-+ }
-+ }
-+
- __skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
-
- err = dscp_ecn_decapsulate(tunnel, ipv6h, skb);
-@@ -958,6 +1098,7 @@ static void init_tel_txopt(struct ipv6_t
- opt->ops.opt_nflen = 8;
- }
-
-+
- /**
- * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
- * @t: the outgoing tunnel device
-@@ -1310,6 +1451,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
- {
- struct ip6_tnl *t = netdev_priv(dev);
- struct ipv6hdr *ipv6h;
-+ struct __ip6_tnl_fmr *fmr;
- int encap_limit = -1;
- __u16 offset;
- struct flowi6 fl6;
-@@ -1375,6 +1517,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
- fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
- dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h));
-
-+ /* try to find matching FMR */
-+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
-+ unsigned mshift = 32 - fmr->ip4_prefix_len;
-+ if (ntohl(fmr->ip4_prefix.s_addr) >> mshift ==
-+ ntohl(ip_hdr(skb)->daddr) >> mshift)
-+ break;
-+ }
-+
-+ /* change dstaddr according to FMR */
-+ if (fmr)
-+ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);
-+
- if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
- return -1;
-
-@@ -1504,6 +1658,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
- t->parms.link = p->link;
- t->parms.proto = p->proto;
- t->parms.fwmark = p->fwmark;
-+
-+ while (t->parms.fmrs) {
-+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next;
-+ kfree(t->parms.fmrs);
-+ t->parms.fmrs = next;
-+ }
-+ t->parms.fmrs = p->fmrs;
-+
- dst_cache_reset(&t->dst_cache);
- ip6_tnl_link_config(t);
- return 0;
-@@ -1542,6 +1704,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
- p->flowinfo = u->flowinfo;
- p->link = u->link;
- p->proto = u->proto;
-+ p->fmrs = NULL;
- memcpy(p->name, u->name, sizeof(u->name));
- }
-
-@@ -1926,6 +2089,15 @@ static int ip6_tnl_validate(struct nlatt
- return 0;
- }
-
-+static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = {
-+ [IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) },
-+ [IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) },
-+ [IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 },
-+ [IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 },
-+ [IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 },
-+ [IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 }
-+};
-+
- static void ip6_tnl_netlink_parms(struct nlattr *data[],
- struct __ip6_tnl_parm *parms)
- {
-@@ -1963,6 +2135,46 @@ static void ip6_tnl_netlink_parms(struct
-
- if (data[IFLA_IPTUN_FWMARK])
- parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
-+
-+ if (data[IFLA_IPTUN_FMRS]) {
-+ unsigned rem;
-+ struct nlattr *fmr;
-+ nla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) {
-+ struct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c;
-+ struct __ip6_tnl_fmr *nfmr;
-+
-+ nla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX,
-+ fmr, ip6_tnl_fmr_policy, NULL);
-+
-+ if (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL)))
-+ continue;
-+
-+ nfmr->offset = 6;
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX]))
-+ nla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX],
-+ sizeof(nfmr->ip6_prefix));
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX]))
-+ nla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX],
-+ sizeof(nfmr->ip4_prefix));
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN]))
-+ nfmr->ip6_prefix_len = nla_get_u8(c);
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN]))
-+ nfmr->ip4_prefix_len = nla_get_u8(c);
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN]))
-+ nfmr->ea_len = nla_get_u8(c);
-+
-+ if ((c = fmrd[IFLA_IPTUN_FMR_OFFSET]))
-+ nfmr->offset = nla_get_u8(c);
-+
-+ nfmr->next = parms->fmrs;
-+ parms->fmrs = nfmr;
-+ }
-+ }
- }
-
- static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
-@@ -2078,6 +2290,12 @@ static void ip6_tnl_dellink(struct net_d
-
- static size_t ip6_tnl_get_size(const struct net_device *dev)
- {
-+ const struct ip6_tnl *t = netdev_priv(dev);
-+ struct __ip6_tnl_fmr *c;
-+ int fmrs = 0;
-+ for (c = t->parms.fmrs; c; c = c->next)
-+ ++fmrs;
-+
- return
- /* IFLA_IPTUN_LINK */
- nla_total_size(4) +
-@@ -2107,6 +2325,24 @@ static size_t ip6_tnl_get_size(const str
- nla_total_size(0) +
- /* IFLA_IPTUN_FWMARK */
- nla_total_size(4) +
-+ /* IFLA_IPTUN_FMRS */
-+ nla_total_size(0) +
-+ (
-+ /* nest */
-+ nla_total_size(0) +
-+ /* IFLA_IPTUN_FMR_IP6_PREFIX */
-+ nla_total_size(sizeof(struct in6_addr)) +
-+ /* IFLA_IPTUN_FMR_IP4_PREFIX */
-+ nla_total_size(sizeof(struct in_addr)) +
-+ /* IFLA_IPTUN_FMR_EA_LEN */
-+ nla_total_size(1) +
-+ /* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */
-+ nla_total_size(1) +
-+ /* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */
-+ nla_total_size(1) +
-+ /* IFLA_IPTUN_FMR_OFFSET */
-+ nla_total_size(1)
-+ ) * fmrs +
- 0;
- }
-
-@@ -2114,6 +2350,9 @@ static int ip6_tnl_fill_info(struct sk_b
- {
- struct ip6_tnl *tunnel = netdev_priv(dev);
- struct __ip6_tnl_parm *parm = &tunnel->parms;
-+ struct __ip6_tnl_fmr *c;
-+ int fmrcnt = 0;
-+ struct nlattr *fmrs;
-
- if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
- nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
-@@ -2123,9 +2362,27 @@ static int ip6_tnl_fill_info(struct sk_b
- nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
- nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
- nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) ||
-- nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark))
-+ nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) ||
-+ !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS)))
- goto nla_put_failure;
-
-+ for (c = parm->fmrs; c; c = c->next) {
-+ struct nlattr *fmr = nla_nest_start(skb, ++fmrcnt);
-+ if (!fmr ||
-+ nla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX,
-+ sizeof(c->ip6_prefix), &c->ip6_prefix) ||
-+ nla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX,
-+ sizeof(c->ip4_prefix), &c->ip4_prefix) ||
-+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) ||
-+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) ||
-+ nla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) ||
-+ nla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset))
-+ goto nla_put_failure;
-+
-+ nla_nest_end(skb, fmr);
-+ }
-+ nla_nest_end(skb, fmrs);
-+
- if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||
- nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||
- nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
-@@ -2165,6 +2422,7 @@ static const struct nla_policy ip6_tnl_p
- [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
- [IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG },
- [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 },
-+ [IFLA_IPTUN_FMRS] = { .type = NLA_NESTED },
- };
-
- static struct rtnl_link_ops ip6_link_ops __read_mostly = {
diff --git a/target/linux/generic/pending-5.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
deleted file mode 100644
index 82c1e26831..0000000000
--- a/target/linux/generic/pending-5.4/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
+++ /dev/null
@@ -1,263 +0,0 @@
-From: Jonas Gorski <jogo@openwrt.org>
-Subject: ipv6: allow rejecting with "source address failed policy"
-
-RFC6204 L-14 requires rejecting traffic from invalid addresses with
-ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/
-egress policy) on the LAN side, so add an appropriate rule for that.
-
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/net/netns/ipv6.h | 1 +
- include/uapi/linux/fib_rules.h | 4 +++
- include/uapi/linux/rtnetlink.h | 1 +
- net/ipv4/fib_semantics.c | 4 +++
- net/ipv4/fib_trie.c | 1 +
- net/ipv4/ipmr.c | 1 +
- net/ipv6/fib6_rules.c | 4 +++
- net/ipv6/ip6mr.c | 2 ++
- net/ipv6/route.c | 58 +++++++++++++++++++++++++++++++++++++++++-
- 9 files changed, 75 insertions(+), 1 deletion(-)
-
---- a/include/net/netns/ipv6.h
-+++ b/include/net/netns/ipv6.h
-@@ -84,6 +84,7 @@ struct netns_ipv6 {
- unsigned int fib6_rules_require_fldissect;
- bool fib6_has_custom_rules;
- struct rt6_info *ip6_prohibit_entry;
-+ struct rt6_info *ip6_policy_failed_entry;
- struct rt6_info *ip6_blk_hole_entry;
- struct fib6_table *fib6_local_tbl;
- struct fib_rules_ops *fib6_rules_ops;
---- a/include/uapi/linux/fib_rules.h
-+++ b/include/uapi/linux/fib_rules.h
-@@ -82,6 +82,10 @@ enum {
- FR_ACT_BLACKHOLE, /* Drop without notification */
- FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */
- FR_ACT_PROHIBIT, /* Drop with EACCES */
-+ FR_ACT_RES9,
-+ FR_ACT_RES10,
-+ FR_ACT_RES11,
-+ FR_ACT_POLICY_FAILED, /* Drop with EACCES */
- __FR_ACT_MAX,
- };
-
---- a/include/uapi/linux/rtnetlink.h
-+++ b/include/uapi/linux/rtnetlink.h
-@@ -235,6 +235,7 @@ enum {
- RTN_THROW, /* Not in this table */
- RTN_NAT, /* Translate this address */
- RTN_XRESOLVE, /* Use external resolver */
-+ RTN_POLICY_FAILED, /* Failed ingress/egress policy */
- __RTN_MAX
- };
-
---- a/net/ipv4/fib_semantics.c
-+++ b/net/ipv4/fib_semantics.c
-@@ -142,6 +142,10 @@ const struct fib_prop fib_props[RTN_MAX
- .error = -EINVAL,
- .scope = RT_SCOPE_NOWHERE,
- },
-+ [RTN_POLICY_FAILED] = {
-+ .error = -EACCES,
-+ .scope = RT_SCOPE_UNIVERSE,
-+ },
- };
-
- static void rt_fibinfo_free(struct rtable __rcu **rtp)
---- a/net/ipv4/fib_trie.c
-+++ b/net/ipv4/fib_trie.c
-@@ -2596,6 +2596,7 @@ static const char *const rtn_type_names[
- [RTN_THROW] = "THROW",
- [RTN_NAT] = "NAT",
- [RTN_XRESOLVE] = "XRESOLVE",
-+ [RTN_POLICY_FAILED] = "POLICY_FAILED",
- };
-
- static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
---- a/net/ipv4/ipmr.c
-+++ b/net/ipv4/ipmr.c
-@@ -173,6 +173,7 @@ static int ipmr_rule_action(struct fib_r
- case FR_ACT_UNREACHABLE:
- return -ENETUNREACH;
- case FR_ACT_PROHIBIT:
-+ case FR_ACT_POLICY_FAILED:
- return -EACCES;
- case FR_ACT_BLACKHOLE:
- default:
---- a/net/ipv6/fib6_rules.c
-+++ b/net/ipv6/fib6_rules.c
-@@ -216,6 +216,10 @@ static int __fib6_rule_action(struct fib
- err = -EACCES;
- rt = net->ipv6.ip6_prohibit_entry;
- goto discard_pkt;
-+ case FR_ACT_POLICY_FAILED:
-+ err = -EACCES;
-+ rt = net->ipv6.ip6_policy_failed_entry;
-+ goto discard_pkt;
- }
-
- tb_id = fib_rule_get_table(rule, arg);
---- a/net/ipv6/ip6mr.c
-+++ b/net/ipv6/ip6mr.c
-@@ -161,6 +161,8 @@ static int ip6mr_rule_action(struct fib_
- return -ENETUNREACH;
- case FR_ACT_PROHIBIT:
- return -EACCES;
-+ case FR_ACT_POLICY_FAILED:
-+ return -EACCES;
- case FR_ACT_BLACKHOLE:
- default:
- return -EINVAL;
---- a/net/ipv6/route.c
-+++ b/net/ipv6/route.c
-@@ -94,6 +94,8 @@ static int ip6_pkt_discard(struct sk_bu
- static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
- static int ip6_pkt_prohibit(struct sk_buff *skb);
- static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
-+static int ip6_pkt_policy_failed(struct sk_buff *skb);
-+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb);
- static void ip6_link_failure(struct sk_buff *skb);
- static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
- struct sk_buff *skb, u32 mtu,
-@@ -327,6 +329,18 @@ static const struct rt6_info ip6_prohibi
- .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
- };
-
-+static const struct rt6_info ip6_policy_failed_entry_template = {
-+ .dst = {
-+ .__refcnt = ATOMIC_INIT(1),
-+ .__use = 1,
-+ .obsolete = DST_OBSOLETE_FORCE_CHK,
-+ .error = -EACCES,
-+ .input = ip6_pkt_policy_failed,
-+ .output = ip6_pkt_policy_failed_out,
-+ },
-+ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
-+};
-+
- static const struct rt6_info ip6_blk_hole_entry_template = {
- .dst = {
- .__refcnt = ATOMIC_INIT(1),
-@@ -1048,6 +1062,7 @@ static const int fib6_prop[RTN_MAX + 1]
- [RTN_BLACKHOLE] = -EINVAL,
- [RTN_UNREACHABLE] = -EHOSTUNREACH,
- [RTN_PROHIBIT] = -EACCES,
-+ [RTN_POLICY_FAILED] = -EACCES,
- [RTN_THROW] = -EAGAIN,
- [RTN_NAT] = -EINVAL,
- [RTN_XRESOLVE] = -EINVAL,
-@@ -1085,6 +1100,10 @@ static void ip6_rt_init_dst_reject(struc
- rt->dst.output = ip6_pkt_prohibit_out;
- rt->dst.input = ip6_pkt_prohibit;
- break;
-+ case RTN_POLICY_FAILED:
-+ rt->dst.output = ip6_pkt_policy_failed_out;
-+ rt->dst.input = ip6_pkt_policy_failed;
-+ break;
- case RTN_THROW:
- case RTN_UNREACHABLE:
- default:
-@@ -4453,6 +4472,17 @@ static int ip6_pkt_prohibit_out(struct n
- return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
- }
-
-+static int ip6_pkt_policy_failed(struct sk_buff *skb)
-+{
-+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);
-+}
-+
-+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb)
-+{
-+ skb->dev = skb_dst(skb)->dev;
-+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);
-+}
-+
- /*
- * Allocate a dst for local (unicast / anycast) address.
- */
-@@ -4933,7 +4963,8 @@ static int rtm_to_fib6_config(struct sk_
- if (rtm->rtm_type == RTN_UNREACHABLE ||
- rtm->rtm_type == RTN_BLACKHOLE ||
- rtm->rtm_type == RTN_PROHIBIT ||
-- rtm->rtm_type == RTN_THROW)
-+ rtm->rtm_type == RTN_THROW ||
-+ rtm->rtm_type == RTN_POLICY_FAILED)
- cfg->fc_flags |= RTF_REJECT;
-
- if (rtm->rtm_type == RTN_LOCAL)
-@@ -6084,6 +6115,8 @@ static int ip6_route_dev_notify(struct n
- #ifdef CONFIG_IPV6_MULTIPLE_TABLES
- net->ipv6.ip6_prohibit_entry->dst.dev = dev;
- net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
-+ net->ipv6.ip6_policy_failed_entry->dst.dev = dev;
-+ net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev);
- net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
- net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
- #endif
-@@ -6095,6 +6128,7 @@ static int ip6_route_dev_notify(struct n
- in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
- #ifdef CONFIG_IPV6_MULTIPLE_TABLES
- in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
-+ in6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev);
- in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
- #endif
- }
-@@ -6287,6 +6321,8 @@ static int __net_init ip6_route_net_init
-
- #ifdef CONFIG_IPV6_MULTIPLE_TABLES
- net->ipv6.fib6_has_custom_rules = false;
-+
-+
- net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
- sizeof(*net->ipv6.ip6_prohibit_entry),
- GFP_KERNEL);
-@@ -6297,11 +6333,21 @@ static int __net_init ip6_route_net_init
- ip6_template_metrics, true);
- INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
-
-+ net->ipv6.ip6_policy_failed_entry =
-+ kmemdup(&ip6_policy_failed_entry_template,
-+ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);
-+ if (!net->ipv6.ip6_policy_failed_entry)
-+ goto out_ip6_prohibit_entry;
-+ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops;
-+ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst,
-+ ip6_template_metrics, true);
-+ INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached);
-+
- net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
- sizeof(*net->ipv6.ip6_blk_hole_entry),
- GFP_KERNEL);
- if (!net->ipv6.ip6_blk_hole_entry)
-- goto out_ip6_prohibit_entry;
-+ goto out_ip6_policy_failed_entry;
- net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
- dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
- ip6_template_metrics, true);
-@@ -6325,6 +6371,8 @@ out:
- return ret;
-
- #ifdef CONFIG_IPV6_MULTIPLE_TABLES
-+out_ip6_policy_failed_entry:
-+ kfree(net->ipv6.ip6_policy_failed_entry);
- out_ip6_prohibit_entry:
- kfree(net->ipv6.ip6_prohibit_entry);
- out_ip6_null_entry:
-@@ -6344,6 +6392,7 @@ static void __net_exit ip6_route_net_exi
- kfree(net->ipv6.ip6_null_entry);
- #ifdef CONFIG_IPV6_MULTIPLE_TABLES
- kfree(net->ipv6.ip6_prohibit_entry);
-+ kfree(net->ipv6.ip6_policy_failed_entry);
- kfree(net->ipv6.ip6_blk_hole_entry);
- #endif
- dst_entries_destroy(&net->ipv6.ip6_dst_ops);
-@@ -6421,6 +6470,9 @@ void __init ip6_route_init_special_entri
- init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
- init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
- init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
-+ init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev;
-+ init_net.ipv6.ip6_policy_failed_entry->rt6i_idev =
-+ in6_dev_get(init_net.loopback_dev);
- #endif
- }
-
diff --git a/target/linux/generic/pending-5.4/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-5.4/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch
deleted file mode 100644
index a92d8ec4c1..0000000000
--- a/target/linux/generic/pending-5.4/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Jonas Gorski <jogo@openwrt.org>
-Subject: net: provide defines for _POLICY_FAILED until all code is updated
-
-Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination
-unreachable, conflicting with our name.
-
-Add appropriate defines to allow our code to build with the new
-name until we have updated our local patches for older kernels
-and userspace packages.
-
-Signed-off-by: Jonas Gorski <jogo@openwrt.org>
----
- include/uapi/linux/fib_rules.h | 2 ++
- include/uapi/linux/icmpv6.h | 2 ++
- include/uapi/linux/rtnetlink.h | 2 ++
- 3 files changed, 6 insertions(+)
-
---- a/include/uapi/linux/fib_rules.h
-+++ b/include/uapi/linux/fib_rules.h
-@@ -89,6 +89,8 @@ enum {
- __FR_ACT_MAX,
- };
-
-+#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED
-+
- #define FR_ACT_MAX (__FR_ACT_MAX - 1)
-
- #endif
---- a/include/uapi/linux/icmpv6.h
-+++ b/include/uapi/linux/icmpv6.h
-@@ -125,6 +125,8 @@ struct icmp6hdr {
- #define ICMPV6_POLICY_FAIL 5
- #define ICMPV6_REJECT_ROUTE 6
-
-+#define ICMPV6_FAILED_POLICY ICMPV6_POLICY_FAIL
-+
- /*
- * Codes for Time Exceeded
- */
---- a/include/uapi/linux/rtnetlink.h
-+++ b/include/uapi/linux/rtnetlink.h
-@@ -239,6 +239,8 @@ enum {
- __RTN_MAX
- };
-
-+#define RTN_FAILED_POLICY RTN_POLICY_FAILED
-+
- #define RTN_MAX (__RTN_MAX - 1)
-
-
diff --git a/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
deleted file mode 100644
index 9795a99bb5..0000000000
--- a/target/linux/generic/pending-5.4/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/netdevice.h | 2 ++
- include/linux/skbuff.h | 3 ++-
- net/core/dev.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
- net/ethernet/eth.c | 18 +++++++++++++++++-
- 4 files changed, 69 insertions(+), 2 deletions(-)
-
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1927,6 +1927,8 @@ struct net_device {
- struct netdev_hw_addr_list mc;
- struct netdev_hw_addr_list dev_addrs;
-
-+ unsigned char local_addr_mask[MAX_ADDR_LEN];
-+
- #ifdef CONFIG_SYSFS
- struct kset *queues_kset;
- #endif
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -824,6 +824,7 @@ struct sk_buff {
- #ifdef CONFIG_TLS_DEVICE
- __u8 decrypted:1;
- #endif
-+ __u8 gro_skip:1;
-
- #ifdef CONFIG_NET_SCHED
- __u16 tc_index; /* traffic control index */
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -5541,6 +5541,9 @@ static enum gro_result dev_gro_receive(s
- int same_flow;
- int grow;
-
-+ if (skb->gro_skip)
-+ goto normal;
-+
- if (netif_elide_gro(skb->dev))
- goto normal;
-
-@@ -7484,6 +7487,48 @@ static void __netdev_adjacent_dev_unlink
- &upper_dev->adj_list.lower);
- }
-
-+static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr,
-+ struct net_device *dev)
-+{
-+ int i;
-+
-+ for (i = 0; i < dev->addr_len; i++)
-+ mask[i] |= addr[i] ^ dev->dev_addr[i];
-+}
-+
-+static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev,
-+ struct net_device *lower)
-+{
-+ struct net_device *cur;
-+ struct list_head *iter;
-+
-+ netdev_for_each_upper_dev_rcu(dev, cur, iter) {
-+ __netdev_addr_mask(mask, cur->dev_addr, lower);
-+ __netdev_upper_mask(mask, cur, lower);
-+ }
-+}
-+
-+static void __netdev_update_addr_mask(struct net_device *dev)
-+{
-+ unsigned char mask[MAX_ADDR_LEN];
-+ struct net_device *cur;
-+ struct list_head *iter;
-+
-+ memset(mask, 0, sizeof(mask));
-+ __netdev_upper_mask(mask, dev, dev);
-+ memcpy(dev->local_addr_mask, mask, dev->addr_len);
-+
-+ netdev_for_each_lower_dev(dev, cur, iter)
-+ __netdev_update_addr_mask(cur);
-+}
-+
-+static void netdev_update_addr_mask(struct net_device *dev)
-+{
-+ rcu_read_lock();
-+ __netdev_update_addr_mask(dev);
-+ rcu_read_unlock();
-+}
-+
- static int __netdev_upper_dev_link(struct net_device *dev,
- struct net_device *upper_dev, bool master,
- void *upper_priv, void *upper_info,
-@@ -7534,6 +7579,7 @@ static int __netdev_upper_dev_link(struc
- if (ret)
- return ret;
-
-+ netdev_update_addr_mask(dev);
- ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
- &changeupper_info.info);
- ret = notifier_to_errno(ret);
-@@ -7627,6 +7673,7 @@ void netdev_upper_dev_unlink(struct net_
-
- __netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
-
-+ netdev_update_addr_mask(dev);
- call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
- &changeupper_info.info);
-
-@@ -8357,6 +8404,7 @@ int dev_set_mac_address(struct net_devic
- if (err)
- return err;
- dev->addr_assign_type = NET_ADDR_SET;
-+ netdev_update_addr_mask(dev);
- call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
- add_device_randomness(dev->dev_addr, dev->addr_len);
- return 0;
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
-@@ -143,6 +143,18 @@ u32 eth_get_headlen(const struct net_dev
- }
- EXPORT_SYMBOL(eth_get_headlen);
-
-+static inline bool
-+eth_check_local_mask(const void *addr1, const void *addr2, const void *mask)
-+{
-+ const u16 *a1 = addr1;
-+ const u16 *a2 = addr2;
-+ const u16 *m = mask;
-+
-+ return (((a1[0] ^ a2[0]) & ~m[0]) |
-+ ((a1[1] ^ a2[1]) & ~m[1]) |
-+ ((a1[2] ^ a2[2]) & ~m[2]));
-+}
-+
- /**
- * eth_type_trans - determine the packet's protocol ID.
- * @skb: received socket data
-@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk
- } else {
- skb->pkt_type = PACKET_OTHERHOST;
- }
-+
-+ if (eth_check_local_mask(eth->h_dest, dev->dev_addr,
-+ dev->local_addr_mask))
-+ skb->gro_skip = 1;
- }
-
- /*
diff --git a/target/linux/generic/pending-5.4/682-of_net-add-mac-address-increment-support.patch b/target/linux/generic/pending-5.4/682-of_net-add-mac-address-increment-support.patch
deleted file mode 100644
index 464fc7e1d5..0000000000
--- a/target/linux/generic/pending-5.4/682-of_net-add-mac-address-increment-support.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-From 844c273286f328acf0dab5fbd5d864366b4904dc Mon Sep 17 00:00:00 2001
-From: Ansuel Smith <ansuelsmth@gmail.com>
-Date: Tue, 30 Mar 2021 18:21:14 +0200
-Subject: [PATCH] of_net: add mac-address-increment support
-
-Lots of embedded devices use the mac-address of other interface
-extracted from nvmem cells and increments it by one or two. Add two
-bindings to integrate this and directly use the right mac-address for
-the interface. Some example are some routers that use the gmac
-mac-address stored in the art partition and increments it by one for the
-wifi. mac-address-increment-byte bindings is used to tell what byte of
-the mac-address has to be increased (if not defined the last byte is
-increased) and mac-address-increment tells how much the byte decided
-early has to be increased.
-
-Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
----
- drivers/of/of_net.c | 43 +++++++++++++++++++++++++++++++++++++++----
- 1 file changed, 39 insertions(+), 4 deletions(-)
-
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -109,27 +109,62 @@ static int of_get_mac_addr_nvmem(struct
- * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
- * but is all zeros.
- *
-+ * DT can tell the system to increment the mac-address after is extracted by
-+ * using:
-+ * - mac-address-increment-byte to decide what byte to increase
-+ * (if not defined is increased the last byte)
-+ * - mac-address-increment to decide how much to increase. The value WILL
-+ * overflow to other bytes if the increment is over 255 or the total
-+ * increment will exceed 255 of the current byte.
-+ * (example 00:01:02:03:04:ff + 1 == 00:01:02:03:05:00)
-+ * (example 00:01:02:03:04:fe + 5 == 00:01:02:03:05:03)
-+ *
- * Return: 0 on success and errno in case of error.
- */
- int of_get_mac_address(struct device_node *np, u8 *addr)
- {
-+ u32 inc_idx, mac_inc, mac_val;
- int ret;
-
-+ /* Check first if the increment byte is present and valid.
-+ * If not set assume to increment the last byte if found.
-+ */
-+ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx))
-+ inc_idx = 5;
-+ if (inc_idx < 3 || inc_idx > 5)
-+ return -EINVAL;
-+
- if (!np)
- return -ENODEV;
-
- ret = of_get_mac_addr(np, "mac-address", addr);
- if (!ret)
-- return 0;
-+ goto found;
-
- ret = of_get_mac_addr(np, "local-mac-address", addr);
- if (!ret)
-- return 0;
-+ goto found;
-
- ret = of_get_mac_addr(np, "address", addr);
- if (!ret)
-- return 0;
-+ goto found;
-+
-+ ret = of_get_mac_addr_nvmem(np, addr);
-+ if (ret)
-+ return ret;
-+
-+found:
-+ if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) {
-+ /* Convert to a contiguous value */
-+ mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5];
-+ mac_val += mac_inc << 8 * (5-inc_idx);
-+
-+ /* Apply the incremented value handling overflow case */
-+ addr[3] = (mac_val >> 16) & 0xff;
-+ addr[4] = (mac_val >> 8) & 0xff;
-+ addr[5] = (mac_val >> 0) & 0xff;
-+ }
-
-- return of_get_mac_addr_nvmem(np, addr);
-+ return ret;
- }
- EXPORT_SYMBOL(of_get_mac_address);
diff --git a/target/linux/generic/pending-5.4/683-of_net-add-mac-address-to-of-tree.patch b/target/linux/generic/pending-5.4/683-of_net-add-mac-address-to-of-tree.patch
deleted file mode 100644
index 448084b821..0000000000
--- a/target/linux/generic/pending-5.4/683-of_net-add-mac-address-to-of-tree.patch
+++ /dev/null
@@ -1,38 +0,0 @@
---- a/drivers/of/of_net.c
-+++ b/drivers/of/of_net.c
-@@ -89,6 +89,27 @@ static int of_get_mac_addr_nvmem(struct
- return 0;
- }
-
-+static int of_add_mac_address(struct device_node *np, u8* addr)
-+{
-+ struct property *prop;
-+
-+ prop = kzalloc(sizeof(*prop), GFP_KERNEL);
-+ if (!prop)
-+ return -ENOMEM;
-+
-+ prop->name = "mac-address";
-+ prop->length = ETH_ALEN;
-+ prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL);
-+ if (!prop->value || of_update_property(np, prop))
-+ goto free;
-+
-+ return 0;
-+free:
-+ kfree(prop->value);
-+ kfree(prop);
-+ return -ENOMEM;
-+}
-+
- /**
- * Search the device tree for the best MAC address to use. 'mac-address' is
- * checked first, because that is supposed to contain to "most recent" MAC
-@@ -165,6 +186,7 @@ found:
- addr[5] = (mac_val >> 0) & 0xff;
- }
-
-+ of_add_mac_address(np, addr);
- return ret;
- }
- EXPORT_SYMBOL(of_get_mac_address);
diff --git a/target/linux/generic/pending-5.4/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.4/703-phy-add-detach-callback-to-struct-phy_driver.patch
deleted file mode 100644
index e95cb6a4c5..0000000000
--- a/target/linux/generic/pending-5.4/703-phy-add-detach-callback-to-struct-phy_driver.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: generic: add detach callback to struct phy_driver
-
-lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/net/phy/phy_device.c | 3 +++
- include/linux/phy.h | 6 ++++++
- 2 files changed, 9 insertions(+)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1465,6 +1465,9 @@ void phy_detach(struct phy_device *phyde
- struct module *ndev_owner = NULL;
- struct mii_bus *bus;
-
-+ if (phydev->drv && phydev->drv->detach)
-+ phydev->drv->detach(phydev);
-+
- if (phydev->sysfs_links) {
- if (dev)
- sysfs_remove_link(&dev->dev.kobj, "phydev");
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -541,6 +541,12 @@ struct phy_driver {
- /* Override default interrupt handling */
- int (*handle_interrupt)(struct phy_device *phydev);
-
-+ /*
-+ * Called before an ethernet device is detached
-+ * from the PHY.
-+ */
-+ void (*detach)(struct phy_device *phydev);
-+
- /* Clears up any memory if needed */
- void (*remove)(struct phy_device *phydev);
-
diff --git a/target/linux/generic/pending-5.4/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch b/target/linux/generic/pending-5.4/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch
deleted file mode 100644
index 90e0d0de83..0000000000
--- a/target/linux/generic/pending-5.4/710-bridge-add-knob-for-filtering-rx-tx-BPDU-pack.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 27 Aug 2021 12:22:32 +0200
-Subject: [PATCH] bridge: add knob for filtering rx/tx BPDU packets on a port
-
-Some devices (e.g. wireless APs) can't have devices behind them be part of
-a bridge topology with redundant links, due to address limitations.
-Additionally, broadcast traffic on these devices is somewhat expensive, due to
-the low data rate and wakeups of clients in powersave mode.
-This knob can be used to ensure that BPDU packets are never sentor forwarded
-to/from these devices
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/include/linux/if_bridge.h
-+++ b/include/linux/if_bridge.h
-@@ -47,6 +47,7 @@ struct br_ip_list {
- #define BR_BCAST_FLOOD BIT(14)
- #define BR_NEIGH_SUPPRESS BIT(15)
- #define BR_ISOLATED BIT(16)
-+#define BR_BPDU_FILTER BIT(17)
-
- #define BR_DEFAULT_AGEING_TIME (300 * HZ)
-
---- a/net/bridge/br_forward.c
-+++ b/net/bridge/br_forward.c
-@@ -191,6 +191,7 @@ out:
- void br_flood(struct net_bridge *br, struct sk_buff *skb,
- enum br_pkt_type pkt_type, bool local_rcv, bool local_orig)
- {
-+ const unsigned char *dest = eth_hdr(skb)->h_dest;
- struct net_bridge_port *prev = NULL;
- struct net_bridge_port *p;
-
-@@ -206,6 +207,10 @@ void br_flood(struct net_bridge *br, str
- case BR_PKT_MULTICAST:
- if (!(p->flags & BR_MCAST_FLOOD) && skb->dev != br->dev)
- continue;
-+ if ((p->flags & BR_BPDU_FILTER) &&
-+ unlikely(is_link_local_ether_addr(dest) &&
-+ dest[5] == 0))
-+ continue;
- break;
- case BR_PKT_BROADCAST:
- if (!(p->flags & BR_BCAST_FLOOD) && skb->dev != br->dev)
---- a/net/bridge/br_input.c
-+++ b/net/bridge/br_input.c
-@@ -300,6 +300,8 @@ rx_handler_result_t br_handle_frame(stru
- fwd_mask |= p->group_fwd_mask;
- switch (dest[5]) {
- case 0x00: /* Bridge Group Address */
-+ if (p->flags & BR_BPDU_FILTER)
-+ goto drop;
- /* If STP is turned off,
- then must forward to keep loop detection */
- if (p->br->stp_enabled == BR_NO_STP ||
---- a/net/bridge/br_sysfs_if.c
-+++ b/net/bridge/br_sysfs_if.c
-@@ -233,6 +233,7 @@ BRPORT_ATTR_FLAG(multicast_flood, BR_MCA
- BRPORT_ATTR_FLAG(broadcast_flood, BR_BCAST_FLOOD);
- BRPORT_ATTR_FLAG(neigh_suppress, BR_NEIGH_SUPPRESS);
- BRPORT_ATTR_FLAG(isolated, BR_ISOLATED);
-+BRPORT_ATTR_FLAG(bpdu_filter, BR_BPDU_FILTER);
-
- #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
- static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
-@@ -285,6 +286,7 @@ static const struct brport_attribute *br
- &brport_attr_group_fwd_mask,
- &brport_attr_neigh_suppress,
- &brport_attr_isolated,
-+ &brport_attr_bpdu_filter,
- &brport_attr_backup_port,
- NULL
- };
---- a/net/bridge/br_stp_bpdu.c
-+++ b/net/bridge/br_stp_bpdu.c
-@@ -80,7 +80,8 @@ void br_send_config_bpdu(struct net_brid
- {
- unsigned char buf[35];
-
-- if (p->br->stp_enabled != BR_KERNEL_STP)
-+ if (p->br->stp_enabled != BR_KERNEL_STP ||
-+ (p->flags & BR_BPDU_FILTER))
- return;
-
- buf[0] = 0;
-@@ -125,7 +126,8 @@ void br_send_tcn_bpdu(struct net_bridge_
- {
- unsigned char buf[4];
-
-- if (p->br->stp_enabled != BR_KERNEL_STP)
-+ if (p->br->stp_enabled != BR_KERNEL_STP ||
-+ (p->flags & BR_BPDU_FILTER))
- return;
-
- buf[0] = 0;
-@@ -168,6 +170,9 @@ void br_stp_rcv(const struct stp_proto *
- if (!(br->dev->flags & IFF_UP))
- goto out;
-
-+ if (p->flags & BR_BPDU_FILTER)
-+ goto out;
-+
- if (p->state == BR_STATE_DISABLED)
- goto out;
-
---- a/include/uapi/linux/if_link.h
-+++ b/include/uapi/linux/if_link.h
-@@ -340,6 +340,7 @@ enum {
- IFLA_BRPORT_NEIGH_SUPPRESS,
- IFLA_BRPORT_ISOLATED,
- IFLA_BRPORT_BACKUP_PORT,
-+ IFLA_BRPORT_BPDU_FILTER,
- __IFLA_BRPORT_MAX
- };
- #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
---- a/net/bridge/br_netlink.c
-+++ b/net/bridge/br_netlink.c
-@@ -137,6 +137,7 @@ static inline size_t br_port_info_size(v
- + nla_total_size(1) /* IFLA_BRPORT_VLAN_TUNNEL */
- + nla_total_size(1) /* IFLA_BRPORT_NEIGH_SUPPRESS */
- + nla_total_size(1) /* IFLA_BRPORT_ISOLATED */
-+ + nla_total_size(1) /* IFLA_BRPORT_BPDU_FILTER */
- + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */
- + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_BRIDGE_ID */
- + nla_total_size(sizeof(u16)) /* IFLA_BRPORT_DESIGNATED_PORT */
-@@ -214,7 +215,8 @@ static int br_port_fill_attrs(struct sk_
- nla_put_u16(skb, IFLA_BRPORT_GROUP_FWD_MASK, p->group_fwd_mask) ||
- nla_put_u8(skb, IFLA_BRPORT_NEIGH_SUPPRESS,
- !!(p->flags & BR_NEIGH_SUPPRESS)) ||
-- nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED)))
-+ nla_put_u8(skb, IFLA_BRPORT_ISOLATED, !!(p->flags & BR_ISOLATED)) ||
-+ nla_put_u8(skb, IFLA_BRPORT_BPDU_FILTER, !!(p->flags & BR_BPDU_FILTER)))
- return -EMSGSIZE;
-
- timerval = br_timer_value(&p->message_age_timer);
-@@ -676,6 +678,7 @@ static const struct nla_policy br_port_p
- [IFLA_BRPORT_NEIGH_SUPPRESS] = { .type = NLA_U8 },
- [IFLA_BRPORT_ISOLATED] = { .type = NLA_U8 },
- [IFLA_BRPORT_BACKUP_PORT] = { .type = NLA_U32 },
-+ [IFLA_BRPORT_BPDU_FILTER] = { .type = NLA_U8 },
- };
-
- /* Change the state of the port and notify spanning tree */
-@@ -774,6 +777,10 @@ static int br_setport(struct net_bridge_
- if (err)
- return err;
-
-+ err = br_set_port_flag(p, tb, IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER);
-+ if (err)
-+ return err;
-+
- br_vlan_tunnel_old = (p->flags & BR_VLAN_TUNNEL) ? true : false;
- err = br_set_port_flag(p, tb, IFLA_BRPORT_VLAN_TUNNEL, BR_VLAN_TUNNEL);
- if (err)
---- a/net/core/rtnetlink.c
-+++ b/net/core/rtnetlink.c
-@@ -55,7 +55,7 @@
- #include <net/net_namespace.h>
-
- #define RTNL_MAX_TYPE 50
--#define RTNL_SLAVE_MAX_TYPE 36
-+#define RTNL_SLAVE_MAX_TYPE 37
-
- struct rtnl_link {
- rtnl_doit_func doit;
-@@ -4373,7 +4373,9 @@ int ndo_dflt_bridge_getlink(struct sk_bu
- brport_nla_put_flag(skb, flags, mask,
- IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD) ||
- brport_nla_put_flag(skb, flags, mask,
-- IFLA_BRPORT_PROXYARP, BR_PROXYARP)) {
-+ IFLA_BRPORT_PROXYARP, BR_PROXYARP) ||
-+ brport_nla_put_flag(skb, flags, mask,
-+ IFLA_BRPORT_BPDU_FILTER, BR_BPDU_FILTER)) {
- nla_nest_cancel(skb, protinfo);
- goto nla_put_failure;
- }
diff --git a/target/linux/generic/pending-5.4/730-net-phy-at803x-fix-feature-detection.patch b/target/linux/generic/pending-5.4/730-net-phy-at803x-fix-feature-detection.patch
deleted file mode 100644
index f25952a2cc..0000000000
--- a/target/linux/generic/pending-5.4/730-net-phy-at803x-fix-feature-detection.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From 97ca310aa18a93329ef5cd68c20de89761962f45 Mon Sep 17 00:00:00 2001
-From: David Bauer <mail@david-bauer.net>
-Date: Sun, 13 Jun 2021 12:19:36 +0200
-Subject: [PATCH] net: phy: at803x: fix feature detection
-
-AR8031/AR8033 have different status registers for copper
-and fiber operation. However, the extended status register
-is the same for both operation modes.
-
-As a result of that, ESTATUS_1000_XFULL is set to 1 even when
-operating in copper TP mode.
-
-Remove this mode from the supported link modes, as this driver
-currently only supports copper operation.
-
-Signed-off-by: David Bauer <mail@david-bauer.net>
----
- drivers/net/phy/at803x.c | 30 +++++++++++++++++++++++++++++-
- 1 file changed, 29 insertions(+), 1 deletion(-)
-
---- a/drivers/net/phy/at803x.c
-+++ b/drivers/net/phy/at803x.c
-@@ -411,6 +411,34 @@ static int at803x_aneg_done(struct phy_d
- return aneg_done;
- }
-
-+static int at803x_get_features(struct phy_device *phydev)
-+{
-+ int err;
-+
-+ err = genphy_read_abilities(phydev);
-+ if (err)
-+ return err;
-+
-+ if (!(phydev->phy_id & phydev->drv->phy_id_mask) == (ATH8031_PHY_ID & phydev->drv->phy_id_mask))
-+ return 0;
-+
-+ /* AR8031/AR8033 have different status registers
-+ * for copper and fiber operation. However, the
-+ * extended status register is the same for both
-+ * operation modes.
-+ *
-+ * As a result of that, ESTATUS_1000_XFULL is set
-+ * to 1 even when operating in copper TP mode.
-+ *
-+ * Remove this mode from the supported link modes,
-+ * as this driver currently only supports copper
-+ * operation.
-+ */
-+ linkmode_clear_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
-+ phydev->supported);
-+ return 0;
-+}
-+
- static int at803x_read_status(struct phy_device *phydev)
- {
- int ss, err, old_link = phydev->link;
-@@ -513,7 +541,7 @@ static struct phy_driver at803x_driver[]
- .resume = at803x_resume,
- .read_page = at803x_read_page,
- .write_page = at803x_write_page,
-- /* PHY_GBIT_FEATURES */
-+ .get_features = at803x_get_features,
- .read_status = at803x_read_status,
- .aneg_done = at803x_aneg_done,
- .ack_interrupt = &at803x_ack_interrupt,
diff --git a/target/linux/generic/pending-5.4/739-net-avoid-tx-fault-with-Nokia-GPON-module.patch b/target/linux/generic/pending-5.4/739-net-avoid-tx-fault-with-Nokia-GPON-module.patch
deleted file mode 100644
index 6648d10c81..0000000000
--- a/target/linux/generic/pending-5.4/739-net-avoid-tx-fault-with-Nokia-GPON-module.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-From 283b211aa01bdae94dffb3121655dbb20bf237f4 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 3 Dec 2019 15:22:05 +0000
-Subject: net: sfp: avoid tx-fault with Nokia GPON module
-
-The Nokia GPON module can hold tx-fault active while it is initialising
-which can take up to 60s. Avoid this causing the module to be declared
-faulty after the SFP MSA defined non-cooled module timeout.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 42 ++++++++++++++++++++++++++++++------------
- 1 file changed, 30 insertions(+), 12 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -155,10 +155,20 @@ static const enum gpiod_flags gpio_flags
- GPIOD_ASIS,
- };
-
--#define T_WAIT msecs_to_jiffies(50)
--#define T_INIT_JIFFIES msecs_to_jiffies(300)
--#define T_RESET_US 10
--#define T_FAULT_RECOVER msecs_to_jiffies(1000)
-+/* t_start_up (SFF-8431) or t_init (SFF-8472) is the time required for a
-+ * non-cooled module to initialise its laser safety circuitry. We wait
-+ * an initial T_WAIT period before we check the tx fault to give any PHY
-+ * on board (for a copper SFP) time to initialise.
-+ */
-+#define T_WAIT msecs_to_jiffies(50)
-+#define T_START_UP msecs_to_jiffies(300)
-+#define T_START_UP_BAD_GPON msecs_to_jiffies(60000)
-+
-+/* t_reset is the time required to assert the TX_DISABLE signal to reset
-+ * an indicated TX_FAULT.
-+ */
-+#define T_RESET_US 10
-+#define T_FAULT_RECOVER msecs_to_jiffies(1000)
-
- /* SFP module presence detection is poor: the three MOD DEF signals are
- * the same length on the PCB, which means it's possible for MOD DEF 0 to
-@@ -219,6 +229,7 @@ struct sfp {
-
- struct sfp_eeprom_id id;
- unsigned int module_power_mW;
-+ unsigned int module_t_start_up;
-
- #if IS_ENABLED(CONFIG_HWMON)
- struct sfp_diag diag;
-@@ -1742,6 +1753,12 @@ static int sfp_sm_mod_probe(struct sfp *
- if (ret < 0)
- return ret;
-
-+ if (!memcmp(id.base.vendor_name, "ALCATELLUCENT ", 16) &&
-+ !memcmp(id.base.vendor_pn, "3FE46541AA ", 16))
-+ sfp->module_t_start_up = T_START_UP_BAD_GPON;
-+ else
-+ sfp->module_t_start_up = T_START_UP;
-+
- return 0;
- }
-
-@@ -1947,11 +1964,12 @@ static void sfp_sm_main(struct sfp *sfp,
- break;
-
- if (sfp->state & SFP_F_TX_FAULT) {
-- /* Wait t_init before indicating that the link is up,
-- * provided the current state indicates no TX_FAULT. If
-- * TX_FAULT clears before this time, that's fine too.
-+ /* Wait up to t_init (SFF-8472) or t_start_up (SFF-8431)
-+ * from the TX_DISABLE deassertion for the module to
-+ * initialise, which is indicated by TX_FAULT
-+ * deasserting.
- */
-- timeout = T_INIT_JIFFIES;
-+ timeout = sfp->module_t_start_up;
- if (timeout > T_WAIT)
- timeout -= T_WAIT;
- else
-@@ -1968,8 +1986,8 @@ static void sfp_sm_main(struct sfp *sfp,
-
- case SFP_S_INIT:
- if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
-- /* TX_FAULT is still asserted after t_init, so assume
-- * there is a fault.
-+ /* TX_FAULT is still asserted after t_init or
-+ * or t_start_up, so assume there is a fault.
- */
- sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
- sfp->sm_retries == 5);
-@@ -1988,7 +2006,7 @@ static void sfp_sm_main(struct sfp *sfp,
- case SFP_S_INIT_TX_FAULT:
- if (event == SFP_E_TIMEOUT) {
- sfp_module_tx_fault_reset(sfp);
-- sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES);
-+ sfp_sm_next(sfp, SFP_S_INIT, sfp->module_t_start_up);
- }
- break;
-
-@@ -2012,7 +2030,7 @@ static void sfp_sm_main(struct sfp *sfp,
- case SFP_S_TX_FAULT:
- if (event == SFP_E_TIMEOUT) {
- sfp_module_tx_fault_reset(sfp);
-- sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES);
-+ sfp_sm_next(sfp, SFP_S_REINIT, sfp->module_t_start_up);
- }
- break;
-
diff --git a/target/linux/generic/pending-5.4/740-net-sfp-remove-incomplete-100BASE-FX-and-100BASE-LX-.patch b/target/linux/generic/pending-5.4/740-net-sfp-remove-incomplete-100BASE-FX-and-100BASE-LX-.patch
deleted file mode 100644
index 1abc34e94b..0000000000
--- a/target/linux/generic/pending-5.4/740-net-sfp-remove-incomplete-100BASE-FX-and-100BASE-LX-.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 29cd215aaf6c2050c43e4de03aee436c16f90b96 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 21 Nov 2019 17:27:14 +0000
-Subject: [PATCH 643/660] net: sfp: remove incomplete 100BASE-FX and 100BASE-LX
- support
-
-The 100BASE-FX and 100BASE-LX support assumes a PHY is present; this
-is probably an incorrect assumption. In any case, sfp_parse_support()
-will fail such a module. Let's stop pretending we support these
-modules.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp-bus.c | 4 +---
- drivers/net/phy/sfp.c | 13 +------------
- 2 files changed, 2 insertions(+), 15 deletions(-)
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -342,9 +342,7 @@ phy_interface_t sfp_select_interface(str
- if (phylink_test(link_modes, 2500baseX_Full))
- return PHY_INTERFACE_MODE_2500BASEX;
-
-- if (id->base.e1000_base_t ||
-- id->base.e100_base_lx ||
-- id->base.e100_base_fx)
-+ if (id->base.e1000_base_t)
- return PHY_INTERFACE_MODE_SGMII;
-
- if (phylink_test(link_modes, 1000baseX_Full))
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1505,18 +1505,7 @@ static void sfp_sm_fault(struct sfp *sfp
-
- static void sfp_sm_probe_for_phy(struct sfp *sfp)
- {
-- /* Setting the serdes link mode is guesswork: there's no
-- * field in the EEPROM which indicates what mode should
-- * be used.
-- *
-- * If it's a gigabit-only fiber module, it probably does
-- * not have a PHY, so switch to 802.3z negotiation mode.
-- * Otherwise, switch to SGMII mode (which is required to
-- * support non-gigabit speeds) and probe for a PHY.
-- */
-- if (sfp->id.base.e1000_base_t ||
-- sfp->id.base.e100_base_lx ||
-- sfp->id.base.e100_base_fx)
-+ if (sfp->id.base.e1000_base_t)
- sfp_sm_probe_phy(sfp);
- }
-
diff --git a/target/linux/generic/pending-5.4/741-net-sfp-derive-interface-mode-from-ethtool-link-mode.patch b/target/linux/generic/pending-5.4/741-net-sfp-derive-interface-mode-from-ethtool-link-mode.patch
deleted file mode 100644
index 8158c78b0e..0000000000
--- a/target/linux/generic/pending-5.4/741-net-sfp-derive-interface-mode-from-ethtool-link-mode.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-From dc45d9e04572b5cd6d32f51cdf9f62b18022e6dd Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 21 Nov 2019 17:32:59 +0000
-Subject: [PATCH 644/660] net: sfp: derive interface mode from ethtool link
- modes
-
-We don't need the EEPROM ID to derive the phy interface mode as we can
-derive it merely from the ethtool link modes. Remove the EEPROM ID
-argument to sfp_select_interface().
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/marvell10g.c | 2 +-
- drivers/net/phy/phylink.c | 2 +-
- drivers/net/phy/sfp-bus.c | 11 ++++-------
- include/linux/sfp.h | 2 --
- 4 files changed, 6 insertions(+), 11 deletions(-)
-
---- a/drivers/net/phy/marvell10g.c
-+++ b/drivers/net/phy/marvell10g.c
-@@ -214,7 +214,7 @@ static int mv3310_sfp_insert(void *upstr
- phy_interface_t iface;
-
- sfp_parse_support(phydev->sfp_bus, id, support);
-- iface = sfp_select_interface(phydev->sfp_bus, id, support);
-+ iface = sfp_select_interface(phydev->sfp_bus, support);
-
- if (iface != PHY_INTERFACE_MODE_10GKR) {
- dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1718,7 +1718,7 @@ static int phylink_sfp_module_insert(voi
-
- linkmode_copy(support1, support);
-
-- iface = sfp_select_interface(pl->sfp_bus, id, config.advertising);
-+ iface = sfp_select_interface(pl->sfp_bus, config.advertising);
- if (iface == PHY_INTERFACE_MODE_NA) {
- phylink_err(pl,
- "selection of interface failed, advertisement %*pb\n",
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -320,16 +320,12 @@ EXPORT_SYMBOL_GPL(sfp_parse_support);
- /**
- * sfp_select_interface() - Select appropriate phy_interface_t mode
- * @bus: a pointer to the &struct sfp_bus structure for the sfp module
-- * @id: a pointer to the module's &struct sfp_eeprom_id
- * @link_modes: ethtool link modes mask
- *
-- * Derive the phy_interface_t mode for the information found in the
-- * module's identifying EEPROM and the link modes mask. There is no
-- * standard or defined way to derive this information, so we decide
-- * based upon the link mode mask.
-+ * Derive the phy_interface_t mode for the SFP module from the link
-+ * modes mask.
- */
- phy_interface_t sfp_select_interface(struct sfp_bus *bus,
-- const struct sfp_eeprom_id *id,
- unsigned long *link_modes)
- {
- if (phylink_test(link_modes, 10000baseCR_Full) ||
-@@ -342,7 +338,8 @@ phy_interface_t sfp_select_interface(str
- if (phylink_test(link_modes, 2500baseX_Full))
- return PHY_INTERFACE_MODE_2500BASEX;
-
-- if (id->base.e1000_base_t)
-+ if (phylink_test(link_modes, 1000baseT_Half) ||
-+ phylink_test(link_modes, 1000baseT_Full))
- return PHY_INTERFACE_MODE_SGMII;
-
- if (phylink_test(link_modes, 1000baseX_Full))
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -504,7 +504,6 @@ int sfp_parse_port(struct sfp_bus *bus,
- void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
- unsigned long *support);
- phy_interface_t sfp_select_interface(struct sfp_bus *bus,
-- const struct sfp_eeprom_id *id,
- unsigned long *link_modes);
-
- int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo);
-@@ -532,7 +531,6 @@ static inline void sfp_parse_support(str
- }
-
- static inline phy_interface_t sfp_select_interface(struct sfp_bus *bus,
-- const struct sfp_eeprom_id *id,
- unsigned long *link_modes)
- {
- return PHY_INTERFACE_MODE_NA;
diff --git a/target/linux/generic/pending-5.4/742-net-sfp-add-more-extended-compliance-codes.patch b/target/linux/generic/pending-5.4/742-net-sfp-add-more-extended-compliance-codes.patch
deleted file mode 100644
index 868e14520b..0000000000
--- a/target/linux/generic/pending-5.4/742-net-sfp-add-more-extended-compliance-codes.patch
+++ /dev/null
@@ -1,251 +0,0 @@
-From c66a4e76c8554c84e64b9315314576ac403c6641 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 26 Sep 2019 15:14:18 +0100
-Subject: [PATCH 645/660] net: sfp: add more extended compliance codes
-
-SFF-8024 is used to define various constants re-used in several SFF
-SFP-related specifications. Split these constants from the enum, and
-rename them to indicate that they're defined by SFF-8024.
-
-Add and use updated SFF-8024 extended compliance code definitions for
-10GBASE-T, 5GBASE-T and 2.5GBASE-T modules.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp-bus.c | 60 ++++++++++++++++------------
- drivers/net/phy/sfp.c | 4 +-
- include/linux/sfp.h | 82 ++++++++++++++++++++++++++-------------
- 3 files changed, 93 insertions(+), 53 deletions(-)
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -124,35 +124,35 @@ int sfp_parse_port(struct sfp_bus *bus,
-
- /* port is the physical connector, set this from the connector field. */
- switch (id->base.connector) {
-- case SFP_CONNECTOR_SC:
-- case SFP_CONNECTOR_FIBERJACK:
-- case SFP_CONNECTOR_LC:
-- case SFP_CONNECTOR_MT_RJ:
-- case SFP_CONNECTOR_MU:
-- case SFP_CONNECTOR_OPTICAL_PIGTAIL:
-+ case SFF8024_CONNECTOR_SC:
-+ case SFF8024_CONNECTOR_FIBERJACK:
-+ case SFF8024_CONNECTOR_LC:
-+ case SFF8024_CONNECTOR_MT_RJ:
-+ case SFF8024_CONNECTOR_MU:
-+ case SFF8024_CONNECTOR_OPTICAL_PIGTAIL:
-+ case SFF8024_CONNECTOR_MPO_1X12:
-+ case SFF8024_CONNECTOR_MPO_2X16:
- port = PORT_FIBRE;
- break;
-
-- case SFP_CONNECTOR_RJ45:
-+ case SFF8024_CONNECTOR_RJ45:
- port = PORT_TP;
- break;
-
-- case SFP_CONNECTOR_COPPER_PIGTAIL:
-+ case SFF8024_CONNECTOR_COPPER_PIGTAIL:
- port = PORT_DA;
- break;
-
-- case SFP_CONNECTOR_UNSPEC:
-+ case SFF8024_CONNECTOR_UNSPEC:
- if (id->base.e1000_base_t) {
- port = PORT_TP;
- break;
- }
- /* fallthrough */
-- case SFP_CONNECTOR_SG: /* guess */
-- case SFP_CONNECTOR_MPO_1X12:
-- case SFP_CONNECTOR_MPO_2X16:
-- case SFP_CONNECTOR_HSSDC_II:
-- case SFP_CONNECTOR_NOSEPARATE:
-- case SFP_CONNECTOR_MXC_2X16:
-+ case SFF8024_CONNECTOR_SG: /* guess */
-+ case SFF8024_CONNECTOR_HSSDC_II:
-+ case SFF8024_CONNECTOR_NOSEPARATE:
-+ case SFF8024_CONNECTOR_MXC_2X16:
- port = PORT_OTHER;
- break;
- default:
-@@ -261,22 +261,33 @@ void sfp_parse_support(struct sfp_bus *b
- }
-
- switch (id->base.extended_cc) {
-- case 0x00: /* Unspecified */
-+ case SFF8024_ECC_UNSPEC:
- break;
-- case 0x02: /* 100Gbase-SR4 or 25Gbase-SR */
-+ case SFF8024_ECC_100GBASE_SR4_25GBASE_SR:
- phylink_set(modes, 100000baseSR4_Full);
- phylink_set(modes, 25000baseSR_Full);
- break;
-- case 0x03: /* 100Gbase-LR4 or 25Gbase-LR */
-- case 0x04: /* 100Gbase-ER4 or 25Gbase-ER */
-+ case SFF8024_ECC_100GBASE_LR4_25GBASE_LR:
-+ case SFF8024_ECC_100GBASE_ER4_25GBASE_ER:
- phylink_set(modes, 100000baseLR4_ER4_Full);
- break;
-- case 0x0b: /* 100Gbase-CR4 or 25Gbase-CR CA-L */
-- case 0x0c: /* 25Gbase-CR CA-S */
-- case 0x0d: /* 25Gbase-CR CA-N */
-+ case SFF8024_ECC_100GBASE_CR4:
- phylink_set(modes, 100000baseCR4_Full);
-+ /* fallthrough */
-+ case SFF8024_ECC_25GBASE_CR_S:
-+ case SFF8024_ECC_25GBASE_CR_N:
- phylink_set(modes, 25000baseCR_Full);
- break;
-+ case SFF8024_ECC_10GBASE_T_SFI:
-+ case SFF8024_ECC_10GBASE_T_SR:
-+ phylink_set(modes, 10000baseT_Full);
-+ break;
-+ case SFF8024_ECC_5GBASE_T:
-+ phylink_set(modes, 5000baseT_Full);
-+ break;
-+ case SFF8024_ECC_2_5GBASE_T:
-+ phylink_set(modes, 2500baseT_Full);
-+ break;
- default:
- dev_warn(bus->sfp_dev,
- "Unknown/unsupported extended compliance code: 0x%02x\n",
-@@ -301,7 +312,7 @@ void sfp_parse_support(struct sfp_bus *b
- */
- if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS)) {
- /* If the encoding and bit rate allows 1000baseX */
-- if (id->base.encoding == SFP_ENCODING_8B10B && br_nom &&
-+ if (id->base.encoding == SFF8024_ENCODING_8B10B && br_nom &&
- br_min <= 1300 && br_max >= 1200)
- phylink_set(modes, 1000baseX_Full);
- }
-@@ -332,7 +343,8 @@ phy_interface_t sfp_select_interface(str
- phylink_test(link_modes, 10000baseSR_Full) ||
- phylink_test(link_modes, 10000baseLR_Full) ||
- phylink_test(link_modes, 10000baseLRM_Full) ||
-- phylink_test(link_modes, 10000baseER_Full))
-+ phylink_test(link_modes, 10000baseER_Full) ||
-+ phylink_test(link_modes, 10000baseT_Full))
- return PHY_INTERFACE_MODE_10GKR;
-
- if (phylink_test(link_modes, 2500baseX_Full))
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -243,7 +243,7 @@ struct sfp {
-
- static bool sff_module_supported(const struct sfp_eeprom_id *id)
- {
-- return id->base.phys_id == SFP_PHYS_ID_SFF &&
-+ return id->base.phys_id == SFF8024_ID_SFF_8472 &&
- id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP;
- }
-
-@@ -254,7 +254,7 @@ static const struct sff_data sff_data =
-
- static bool sfp_module_supported(const struct sfp_eeprom_id *id)
- {
-- return id->base.phys_id == SFP_PHYS_ID_SFP &&
-+ return id->base.phys_id == SFF8024_ID_SFP &&
- id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP;
- }
-
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -275,6 +275,61 @@ struct sfp_diag {
- __be16 cal_v_offset;
- } __packed;
-
-+/* SFF8024 defined constants */
-+enum {
-+ SFF8024_ID_UNK = 0x00,
-+ SFF8024_ID_SFF_8472 = 0x02,
-+ SFF8024_ID_SFP = 0x03,
-+ SFF8024_ID_DWDM_SFP = 0x0b,
-+ SFF8024_ID_QSFP_8438 = 0x0c,
-+ SFF8024_ID_QSFP_8436_8636 = 0x0d,
-+ SFF8024_ID_QSFP28_8636 = 0x11,
-+
-+ SFF8024_ENCODING_UNSPEC = 0x00,
-+ SFF8024_ENCODING_8B10B = 0x01,
-+ SFF8024_ENCODING_4B5B = 0x02,
-+ SFF8024_ENCODING_NRZ = 0x03,
-+ SFF8024_ENCODING_8472_MANCHESTER= 0x04,
-+ SFF8024_ENCODING_8472_SONET = 0x05,
-+ SFF8024_ENCODING_8472_64B66B = 0x06,
-+ SFF8024_ENCODING_8436_MANCHESTER= 0x06,
-+ SFF8024_ENCODING_8436_SONET = 0x04,
-+ SFF8024_ENCODING_8436_64B66B = 0x05,
-+ SFF8024_ENCODING_256B257B = 0x07,
-+ SFF8024_ENCODING_PAM4 = 0x08,
-+
-+ SFF8024_CONNECTOR_UNSPEC = 0x00,
-+ /* codes 01-05 not supportable on SFP, but some modules have single SC */
-+ SFF8024_CONNECTOR_SC = 0x01,
-+ SFF8024_CONNECTOR_FIBERJACK = 0x06,
-+ SFF8024_CONNECTOR_LC = 0x07,
-+ SFF8024_CONNECTOR_MT_RJ = 0x08,
-+ SFF8024_CONNECTOR_MU = 0x09,
-+ SFF8024_CONNECTOR_SG = 0x0a,
-+ SFF8024_CONNECTOR_OPTICAL_PIGTAIL= 0x0b,
-+ SFF8024_CONNECTOR_MPO_1X12 = 0x0c,
-+ SFF8024_CONNECTOR_MPO_2X16 = 0x0d,
-+ SFF8024_CONNECTOR_HSSDC_II = 0x20,
-+ SFF8024_CONNECTOR_COPPER_PIGTAIL= 0x21,
-+ SFF8024_CONNECTOR_RJ45 = 0x22,
-+ SFF8024_CONNECTOR_NOSEPARATE = 0x23,
-+ SFF8024_CONNECTOR_MXC_2X16 = 0x24,
-+
-+ SFF8024_ECC_UNSPEC = 0x00,
-+ SFF8024_ECC_100G_25GAUI_C2M_AOC = 0x01,
-+ SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 0x02,
-+ SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 0x03,
-+ SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 0x04,
-+ SFF8024_ECC_100GBASE_SR10 = 0x05,
-+ SFF8024_ECC_100GBASE_CR4 = 0x0b,
-+ SFF8024_ECC_25GBASE_CR_S = 0x0c,
-+ SFF8024_ECC_25GBASE_CR_N = 0x0d,
-+ SFF8024_ECC_10GBASE_T_SFI = 0x16,
-+ SFF8024_ECC_10GBASE_T_SR = 0x1c,
-+ SFF8024_ECC_5GBASE_T = 0x1d,
-+ SFF8024_ECC_2_5GBASE_T = 0x1e,
-+};
-+
- /* SFP EEPROM registers */
- enum {
- SFP_PHYS_ID = 0x00,
-@@ -309,34 +364,7 @@ enum {
- SFP_SFF8472_COMPLIANCE = 0x5e,
- SFP_CC_EXT = 0x5f,
-
-- SFP_PHYS_ID_SFF = 0x02,
-- SFP_PHYS_ID_SFP = 0x03,
- SFP_PHYS_EXT_ID_SFP = 0x04,
-- SFP_CONNECTOR_UNSPEC = 0x00,
-- /* codes 01-05 not supportable on SFP, but some modules have single SC */
-- SFP_CONNECTOR_SC = 0x01,
-- SFP_CONNECTOR_FIBERJACK = 0x06,
-- SFP_CONNECTOR_LC = 0x07,
-- SFP_CONNECTOR_MT_RJ = 0x08,
-- SFP_CONNECTOR_MU = 0x09,
-- SFP_CONNECTOR_SG = 0x0a,
-- SFP_CONNECTOR_OPTICAL_PIGTAIL = 0x0b,
-- SFP_CONNECTOR_MPO_1X12 = 0x0c,
-- SFP_CONNECTOR_MPO_2X16 = 0x0d,
-- SFP_CONNECTOR_HSSDC_II = 0x20,
-- SFP_CONNECTOR_COPPER_PIGTAIL = 0x21,
-- SFP_CONNECTOR_RJ45 = 0x22,
-- SFP_CONNECTOR_NOSEPARATE = 0x23,
-- SFP_CONNECTOR_MXC_2X16 = 0x24,
-- SFP_ENCODING_UNSPEC = 0x00,
-- SFP_ENCODING_8B10B = 0x01,
-- SFP_ENCODING_4B5B = 0x02,
-- SFP_ENCODING_NRZ = 0x03,
-- SFP_ENCODING_8472_MANCHESTER = 0x04,
-- SFP_ENCODING_8472_SONET = 0x05,
-- SFP_ENCODING_8472_64B66B = 0x06,
-- SFP_ENCODING_256B257B = 0x07,
-- SFP_ENCODING_PAM4 = 0x08,
- SFP_OPTIONS_HIGH_POWER_LEVEL = BIT(13),
- SFP_OPTIONS_PAGING_A2 = BIT(12),
- SFP_OPTIONS_RETIMER = BIT(11),
diff --git a/target/linux/generic/pending-5.4/743-net-sfp-add-module-start-stop-upstream-notifications.patch b/target/linux/generic/pending-5.4/743-net-sfp-add-module-start-stop-upstream-notifications.patch
deleted file mode 100644
index 3dc8f60020..0000000000
--- a/target/linux/generic/pending-5.4/743-net-sfp-add-module-start-stop-upstream-notifications.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-From f9a5a54b59cb904b37bf7409a43635ab195d0214 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 19 Nov 2019 10:13:25 +0000
-Subject: [PATCH 646/660] net: sfp: add module start/stop upstream
- notifications
-
-When dealing with some copper modules, we can't positively know the
-module capabilities are until we have probed the PHY. Without the full
-capabilities, we may end up failing a module that we could otherwise
-drive with a restricted set of capabilities.
-
-An example of this would be a module with a NBASE-T PHY plugged into
-a host that supports phy interface modes 2500BASE-X and SGMII. The
-PHY supports 10GBASE-R, 5000BASE-X, 2500BASE-X, SGMII interface modes,
-which means a subset of the capabilities are compatible with the host.
-
-However, reading the module EEPROM leads us to believe that the module
-only supports ethtool link mode 10GBASE-T, which is incompatible with
-the host - and thus results in the module being rejected.
-
-This patch adds an extra notification which are triggered after the
-SFP module's PHY probe, and a corresponding notification just before
-the PHY is removed.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp-bus.c | 21 +++++++++++++++++++++
- drivers/net/phy/sfp.c | 8 ++++++++
- drivers/net/phy/sfp.h | 2 ++
- include/linux/sfp.h | 4 ++++
- 4 files changed, 35 insertions(+)
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -712,6 +712,27 @@ void sfp_module_remove(struct sfp_bus *b
- }
- EXPORT_SYMBOL_GPL(sfp_module_remove);
-
-+int sfp_module_start(struct sfp_bus *bus)
-+{
-+ const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
-+ int ret = 0;
-+
-+ if (ops && ops->module_start)
-+ ret = ops->module_start(bus->upstream);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(sfp_module_start);
-+
-+void sfp_module_stop(struct sfp_bus *bus)
-+{
-+ const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
-+
-+ if (ops && ops->module_stop)
-+ ops->module_stop(bus->upstream);
-+}
-+EXPORT_SYMBOL_GPL(sfp_module_stop);
-+
- static void sfp_socket_clear(struct sfp_bus *bus)
- {
- bus->sfp_dev = NULL;
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -59,6 +59,7 @@ enum {
- SFP_DEV_UP,
-
- SFP_S_DOWN = 0,
-+ SFP_S_FAIL,
- SFP_S_WAIT,
- SFP_S_INIT,
- SFP_S_INIT_TX_FAULT,
-@@ -122,6 +123,7 @@ static const char *event_to_str(unsigned
-
- static const char * const sm_state_strings[] = {
- [SFP_S_DOWN] = "down",
-+ [SFP_S_FAIL] = "fail",
- [SFP_S_WAIT] = "wait",
- [SFP_S_INIT] = "init",
- [SFP_S_INIT_TX_FAULT] = "init_tx_fault",
-@@ -1918,6 +1920,8 @@ static void sfp_sm_main(struct sfp *sfp,
- if (sfp->sm_state == SFP_S_LINK_UP &&
- sfp->sm_dev_state == SFP_DEV_UP)
- sfp_sm_link_down(sfp);
-+ if (sfp->sm_state > SFP_S_INIT)
-+ sfp_module_stop(sfp->sfp_bus);
- if (sfp->mod_phy)
- sfp_sm_phy_detach(sfp);
- sfp_module_tx_disable(sfp);
-@@ -1985,6 +1989,10 @@ static void sfp_sm_main(struct sfp *sfp,
- * clear. Probe for the PHY and check the LOS state.
- */
- sfp_sm_probe_for_phy(sfp);
-+ if (sfp_module_start(sfp->sfp_bus)) {
-+ sfp_sm_next(sfp, SFP_S_FAIL, 0);
-+ break;
-+ }
- sfp_sm_link_check_los(sfp);
-
- /* Reset the fault retry count */
---- a/drivers/net/phy/sfp.h
-+++ b/drivers/net/phy/sfp.h
-@@ -22,6 +22,8 @@ void sfp_link_up(struct sfp_bus *bus);
- void sfp_link_down(struct sfp_bus *bus);
- int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id);
- void sfp_module_remove(struct sfp_bus *bus);
-+int sfp_module_start(struct sfp_bus *bus);
-+void sfp_module_stop(struct sfp_bus *bus);
- int sfp_link_configure(struct sfp_bus *bus, const struct sfp_eeprom_id *id);
- struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
- const struct sfp_socket_ops *ops);
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -507,6 +507,8 @@ struct sfp_bus;
- * @module_insert: called after a module has been detected to determine
- * whether the module is supported for the upstream device.
- * @module_remove: called after the module has been removed.
-+ * @module_start: called after the PHY probe step
-+ * @module_stop: called before the PHY is removed
- * @link_down: called when the link is non-operational for whatever
- * reason.
- * @link_up: called when the link is operational.
-@@ -520,6 +522,8 @@ struct sfp_upstream_ops {
- void (*detach)(void *priv, struct sfp_bus *bus);
- int (*module_insert)(void *priv, const struct sfp_eeprom_id *id);
- void (*module_remove)(void *priv);
-+ int (*module_start)(void *priv);
-+ void (*module_stop)(void *priv);
- void (*link_down)(void *priv);
- void (*link_up)(void *priv);
- int (*connect_phy)(void *priv, struct phy_device *);
diff --git a/target/linux/generic/pending-5.4/744-net-sfp-move-phy_start-phy_stop-to-phylink.patch b/target/linux/generic/pending-5.4/744-net-sfp-move-phy_start-phy_stop-to-phylink.patch
deleted file mode 100644
index 98987d5a49..0000000000
--- a/target/linux/generic/pending-5.4/744-net-sfp-move-phy_start-phy_stop-to-phylink.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From e2dc261b872a92a055eb2e86ac136baf9b20f2f2 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 21 Nov 2019 17:21:33 +0000
-Subject: [PATCH 647/660] net: sfp: move phy_start()/phy_stop() to phylink
-
-Move phy_start() and phy_stop() into the module_start and module_stop
-notifications in phylink, rather than having them in the SFP code.
-This gives phylink responsibility for controlling the PHY, rather
-than having SFP start and stop the PHY state machine.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 22 ++++++++++++++++++++++
- drivers/net/phy/sfp.c | 2 --
- 2 files changed, 22 insertions(+), 2 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1772,6 +1772,26 @@ static int phylink_sfp_module_insert(voi
- return ret;
- }
-
-+static int phylink_sfp_module_start(void *upstream)
-+{
-+ struct phylink *pl = upstream;
-+
-+ /* If this SFP module has a PHY, start the PHY now. */
-+ if (pl->phydev)
-+ phy_start(pl->phydev);
-+
-+ return 0;
-+}
-+
-+static void phylink_sfp_module_stop(void *upstream)
-+{
-+ struct phylink *pl = upstream;
-+
-+ /* If this SFP module has a PHY, stop it. */
-+ if (pl->phydev)
-+ phy_stop(pl->phydev);
-+}
-+
- static void phylink_sfp_link_down(void *upstream)
- {
- struct phylink *pl = upstream;
-@@ -1807,6 +1827,8 @@ static const struct sfp_upstream_ops sfp
- .attach = phylink_sfp_attach,
- .detach = phylink_sfp_detach,
- .module_insert = phylink_sfp_module_insert,
-+ .module_start = phylink_sfp_module_start,
-+ .module_stop = phylink_sfp_module_stop,
- .link_up = phylink_sfp_link_up,
- .link_down = phylink_sfp_link_down,
- .connect_phy = phylink_sfp_connect_phy,
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1412,7 +1412,6 @@ static void sfp_sm_mod_next(struct sfp *
-
- static void sfp_sm_phy_detach(struct sfp *sfp)
- {
-- phy_stop(sfp->mod_phy);
- sfp_remove_phy(sfp->sfp_bus);
- phy_device_remove(sfp->mod_phy);
- phy_device_free(sfp->mod_phy);
-@@ -1443,7 +1442,6 @@ static void sfp_sm_probe_phy(struct sfp
- }
-
- sfp->mod_phy = phy;
-- phy_start(phy);
- }
-
- static void sfp_sm_link_up(struct sfp *sfp)
diff --git a/target/linux/generic/pending-5.4/745-net-mdio-i2c-add-support-for-Clause-45-accesses.patch b/target/linux/generic/pending-5.4/745-net-mdio-i2c-add-support-for-Clause-45-accesses.patch
deleted file mode 100644
index 761a94b3d4..0000000000
--- a/target/linux/generic/pending-5.4/745-net-mdio-i2c-add-support-for-Clause-45-accesses.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From c9de73988a35c6c85810a992954ac568cca503e5 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Wed, 2 Oct 2019 10:31:10 +0100
-Subject: [PATCH 648/660] net: mdio-i2c: add support for Clause 45 accesses
-
-Some SFP+ modules have PHYs on them just like SFP modules do, except
-they are Clause 45 PHYs. The I2C protocol used to access them is
-modified slightly in order to send the device address and 16-bit
-register index.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/mdio-i2c.c | 28 ++++++++++++++++++++--------
- 1 file changed, 20 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/mdio-i2c.c
-+++ b/drivers/net/phy/mdio-i2c.c
-@@ -33,17 +33,24 @@ static int i2c_mii_read(struct mii_bus *
- {
- struct i2c_adapter *i2c = bus->priv;
- struct i2c_msg msgs[2];
-- u8 data[2], dev_addr = reg;
-+ u8 addr[3], data[2], *p;
- int bus_addr, ret;
-
- if (!i2c_mii_valid_phy_id(phy_id))
- return 0xffff;
-
-+ p = addr;
-+ if (reg & MII_ADDR_C45) {
-+ *p++ = 0x20 | ((reg >> 16) & 31);
-+ *p++ = reg >> 8;
-+ }
-+ *p++ = reg;
-+
- bus_addr = i2c_mii_phy_addr(phy_id);
- msgs[0].addr = bus_addr;
- msgs[0].flags = 0;
-- msgs[0].len = 1;
-- msgs[0].buf = &dev_addr;
-+ msgs[0].len = p - addr;
-+ msgs[0].buf = addr;
- msgs[1].addr = bus_addr;
- msgs[1].flags = I2C_M_RD;
- msgs[1].len = sizeof(data);
-@@ -61,18 +68,23 @@ static int i2c_mii_write(struct mii_bus
- struct i2c_adapter *i2c = bus->priv;
- struct i2c_msg msg;
- int ret;
-- u8 data[3];
-+ u8 data[5], *p;
-
- if (!i2c_mii_valid_phy_id(phy_id))
- return 0;
-
-- data[0] = reg;
-- data[1] = val >> 8;
-- data[2] = val;
-+ p = data;
-+ if (reg & MII_ADDR_C45) {
-+ *p++ = (reg >> 16) & 31;
-+ *p++ = reg >> 8;
-+ }
-+ *p++ = reg;
-+ *p++ = val >> 8;
-+ *p++ = val;
-
- msg.addr = i2c_mii_phy_addr(phy_id);
- msg.flags = 0;
-- msg.len = 3;
-+ msg.len = p - data;
- msg.buf = data;
-
- ret = i2c_transfer(i2c, &msg, 1);
diff --git a/target/linux/generic/pending-5.4/746-net-phylink-re-split-__phylink_connect_phy.patch b/target/linux/generic/pending-5.4/746-net-phylink-re-split-__phylink_connect_phy.patch
deleted file mode 100644
index d547a18d6e..0000000000
--- a/target/linux/generic/pending-5.4/746-net-phylink-re-split-__phylink_connect_phy.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 0db7fba746b5608c30d4e2ba1c99a2a309e2d288 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 8 Nov 2019 15:22:48 +0000
-Subject: [PATCH 649/660] net: phylink: re-split __phylink_connect_phy()
-
-In order to support Clause 45 PHYs on SFP+ modules, which have an
-indeterminant phy interface mode, we need to be able to call
-phylink_bringup_phy() with a different interface mode to that used when
-binding the PHY. Reduce __phylink_connect_phy() to an attach operation,
-and move the call to phylink_bringup_phy() to its call sites.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 39 ++++++++++++++++++++++++---------------
- 1 file changed, 24 insertions(+), 15 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -765,11 +765,9 @@ static int phylink_bringup_phy(struct ph
- return 0;
- }
-
--static int __phylink_connect_phy(struct phylink *pl, struct phy_device *phy,
-- phy_interface_t interface)
-+static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy,
-+ phy_interface_t interface)
- {
-- int ret;
--
- if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED ||
- (pl->link_an_mode == MLO_AN_INBAND &&
- phy_interface_mode_is_8023z(interface))))
-@@ -778,15 +776,7 @@ static int __phylink_connect_phy(struct
- if (pl->phydev)
- return -EBUSY;
-
-- ret = phy_attach_direct(pl->netdev, phy, 0, interface);
-- if (ret)
-- return ret;
--
-- ret = phylink_bringup_phy(pl, phy);
-- if (ret)
-- phy_detach(phy);
--
-- return ret;
-+ return phy_attach_direct(pl->netdev, phy, 0, interface);
- }
-
- /**
-@@ -806,13 +796,23 @@ static int __phylink_connect_phy(struct
- */
- int phylink_connect_phy(struct phylink *pl, struct phy_device *phy)
- {
-+ int ret;
-+
- /* Use PHY device/driver interface */
- if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
- pl->link_interface = phy->interface;
- pl->link_config.interface = pl->link_interface;
- }
-
-- return __phylink_connect_phy(pl, phy, pl->link_interface);
-+ ret = phylink_attach_phy(pl, phy, pl->link_interface);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = phylink_bringup_phy(pl, phy);
-+ if (ret)
-+ phy_detach(phy);
-+
-+ return ret;
- }
- EXPORT_SYMBOL_GPL(phylink_connect_phy);
-
-@@ -1814,8 +1814,17 @@ static void phylink_sfp_link_up(void *up
- static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
- {
- struct phylink *pl = upstream;
-+ int ret;
-
-- return __phylink_connect_phy(upstream, phy, pl->link_config.interface);
-+ ret = phylink_attach_phy(pl, phy, pl->link_config.interface);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = phylink_bringup_phy(pl, phy);
-+ if (ret)
-+ phy_detach(phy);
-+
-+ return ret;
- }
-
- static void phylink_sfp_disconnect_phy(void *upstream)
diff --git a/target/linux/generic/pending-5.4/747-net-phylink-support-Clause-45-PHYs-on-SFP-modules.patch b/target/linux/generic/pending-5.4/747-net-phylink-support-Clause-45-PHYs-on-SFP-modules.patch
deleted file mode 100644
index 673de1005a..0000000000
--- a/target/linux/generic/pending-5.4/747-net-phylink-support-Clause-45-PHYs-on-SFP-modules.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-From caf32f96f13df7d3ae6cb8bf8001c88ae22025ca Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 8 Nov 2019 15:28:22 +0000
-Subject: [PATCH 650/660] net: phylink: support Clause 45 PHYs on SFP+ modules
-
-Some SFP+ modules have Clause 45 PHYs embedded on them, which need a
-little more handling in order to ensure that they are correctly setup,
-as they switch the PHY link mode according to the negotiated speed.
-
-With Clause 22 PHYs, we assumed that they would operate in SGMII mode,
-but this assumption is now false. Adapt phylink to support Clause 45
-PHYs on SFP+ modules.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 21 ++++++++++++++++-----
- 1 file changed, 16 insertions(+), 5 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -712,7 +712,8 @@ static void phylink_phy_change(struct ph
- phy_duplex_to_str(phydev->duplex));
- }
-
--static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy)
-+static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
-+ phy_interface_t interface)
- {
- struct phylink_link_state config;
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
-@@ -730,7 +731,7 @@ static int phylink_bringup_phy(struct ph
- memset(&config, 0, sizeof(config));
- linkmode_copy(supported, phy->supported);
- linkmode_copy(config.advertising, phy->advertising);
-- config.interface = pl->link_config.interface;
-+ config.interface = interface;
-
- ret = phylink_validate(pl, supported, &config);
- if (ret)
-@@ -746,6 +747,7 @@ static int phylink_bringup_phy(struct ph
- mutex_lock(&phy->lock);
- mutex_lock(&pl->state_mutex);
- pl->phydev = phy;
-+ pl->phy_state.interface = interface;
- linkmode_copy(pl->supported, supported);
- linkmode_copy(pl->link_config.advertising, config.advertising);
-
-@@ -808,7 +810,7 @@ int phylink_connect_phy(struct phylink *
- if (ret < 0)
- return ret;
-
-- ret = phylink_bringup_phy(pl, phy);
-+ ret = phylink_bringup_phy(pl, phy, pl->link_config.interface);
- if (ret)
- phy_detach(phy);
-
-@@ -861,7 +863,7 @@ int phylink_of_phy_connect(struct phylin
- if (!phy_dev)
- return -ENODEV;
-
-- ret = phylink_bringup_phy(pl, phy_dev);
-+ ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface);
- if (ret)
- phy_detach(phy_dev);
-
-@@ -1814,13 +1816,22 @@ static void phylink_sfp_link_up(void *up
- static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
- {
- struct phylink *pl = upstream;
-+ phy_interface_t interface = pl->link_config.interface;
- int ret;
-
- ret = phylink_attach_phy(pl, phy, pl->link_config.interface);
- if (ret < 0)
- return ret;
-
-- ret = phylink_bringup_phy(pl, phy);
-+ /* Clause 45 PHYs switch their Serdes lane between several different
-+ * modes, normally 10GBASE-R, SGMII. Some use 2500BASE-X for 2.5G
-+ * speeds. We really need to know which interface modes the PHY and
-+ * MAC supports to properly work out which linkmodes can be supported.
-+ */
-+ if (phy->is_c45)
-+ interface = PHY_INTERFACE_MODE_NA;
-+
-+ ret = phylink_bringup_phy(pl, phy, interface);
- if (ret)
- phy_detach(phy);
-
diff --git a/target/linux/generic/pending-5.4/748-net-phylink-split-link_an_mode-configured-and-curren.patch b/target/linux/generic/pending-5.4/748-net-phylink-split-link_an_mode-configured-and-curren.patch
deleted file mode 100644
index eaf21dbc87..0000000000
--- a/target/linux/generic/pending-5.4/748-net-phylink-split-link_an_mode-configured-and-curren.patch
+++ /dev/null
@@ -1,257 +0,0 @@
-From d1339d6956f0255b6ce2412328a98945be8cc3ca Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sat, 16 Nov 2019 11:30:18 +0000
-Subject: [PATCH 651/660] net: phylink: split link_an_mode configured and
- current settings
-
-Split link_an_mode between the configured setting and the current
-operating setting. This is an important distinction to make when we
-need to configure PHY mode for a plugged SFP+ module that does not
-use in-band signalling.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 59 ++++++++++++++++++++-------------------
- 1 file changed, 31 insertions(+), 28 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -48,7 +48,8 @@ struct phylink {
- unsigned long phylink_disable_state; /* bitmask of disables */
- struct phy_device *phydev;
- phy_interface_t link_interface; /* PHY_INTERFACE_xxx */
-- u8 link_an_mode; /* MLO_AN_xxx */
-+ u8 cfg_link_an_mode; /* MLO_AN_xxx */
-+ u8 cur_link_an_mode;
- u8 link_port; /* The current non-phy ethtool port */
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
-
-@@ -258,12 +259,12 @@ static int phylink_parse_mode(struct phy
-
- dn = fwnode_get_named_child_node(fwnode, "fixed-link");
- if (dn || fwnode_property_present(fwnode, "fixed-link"))
-- pl->link_an_mode = MLO_AN_FIXED;
-+ pl->cfg_link_an_mode = MLO_AN_FIXED;
- fwnode_handle_put(dn);
-
- if (fwnode_property_read_string(fwnode, "managed", &managed) == 0 &&
- strcmp(managed, "in-band-status") == 0) {
-- if (pl->link_an_mode == MLO_AN_FIXED) {
-+ if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
- phylink_err(pl,
- "can't use both fixed-link and in-band-status\n");
- return -EINVAL;
-@@ -275,7 +276,7 @@ static int phylink_parse_mode(struct phy
- phylink_set(pl->supported, Asym_Pause);
- phylink_set(pl->supported, Pause);
- pl->link_config.an_enabled = true;
-- pl->link_an_mode = MLO_AN_INBAND;
-+ pl->cfg_link_an_mode = MLO_AN_INBAND;
-
- switch (pl->link_config.interface) {
- case PHY_INTERFACE_MODE_SGMII:
-@@ -335,14 +336,14 @@ static void phylink_mac_config(struct ph
- {
- phylink_dbg(pl,
- "%s: mode=%s/%s/%s/%s adv=%*pb pause=%02x link=%u an=%u\n",
-- __func__, phylink_an_mode_str(pl->link_an_mode),
-+ __func__, phylink_an_mode_str(pl->cur_link_an_mode),
- phy_modes(state->interface),
- phy_speed_to_str(state->speed),
- phy_duplex_to_str(state->duplex),
- __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising,
- state->pause, state->link, state->an_enabled);
-
-- pl->ops->mac_config(pl->config, pl->link_an_mode, state);
-+ pl->ops->mac_config(pl->config, pl->cur_link_an_mode, state);
- }
-
- static void phylink_mac_config_up(struct phylink *pl,
-@@ -443,7 +444,7 @@ static void phylink_mac_link_up(struct p
- struct net_device *ndev = pl->netdev;
-
- pl->cur_interface = link_state.interface;
-- pl->ops->mac_link_up(pl->config, pl->link_an_mode,
-+ pl->ops->mac_link_up(pl->config, pl->cur_link_an_mode,
- pl->cur_interface, pl->phydev);
-
- if (ndev)
-@@ -462,7 +463,7 @@ static void phylink_mac_link_down(struct
-
- if (ndev)
- netif_carrier_off(ndev);
-- pl->ops->mac_link_down(pl->config, pl->link_an_mode,
-+ pl->ops->mac_link_down(pl->config, pl->cur_link_an_mode,
- pl->cur_interface);
- phylink_info(pl, "Link is Down\n");
- }
-@@ -481,7 +482,7 @@ static void phylink_resolve(struct work_
- } else if (pl->mac_link_dropped) {
- link_state.link = false;
- } else {
-- switch (pl->link_an_mode) {
-+ switch (pl->cur_link_an_mode) {
- case MLO_AN_PHY:
- link_state = pl->phy_state;
- phylink_resolve_flow(pl, &link_state);
-@@ -649,7 +650,7 @@ struct phylink *phylink_create(struct ph
- return ERR_PTR(ret);
- }
-
-- if (pl->link_an_mode == MLO_AN_FIXED) {
-+ if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
- ret = phylink_parse_fixedlink(pl, fwnode);
- if (ret < 0) {
- kfree(pl);
-@@ -657,6 +658,8 @@ struct phylink *phylink_create(struct ph
- }
- }
-
-+ pl->cur_link_an_mode = pl->cfg_link_an_mode;
-+
- ret = phylink_register_sfp(pl, fwnode);
- if (ret < 0) {
- kfree(pl);
-@@ -770,8 +773,8 @@ static int phylink_bringup_phy(struct ph
- static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy,
- phy_interface_t interface)
- {
-- if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED ||
-- (pl->link_an_mode == MLO_AN_INBAND &&
-+ if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED ||
-+ (pl->cfg_link_an_mode == MLO_AN_INBAND &&
- phy_interface_mode_is_8023z(interface))))
- return -EINVAL;
-
-@@ -838,8 +841,8 @@ int phylink_of_phy_connect(struct phylin
- int ret;
-
- /* Fixed links and 802.3z are handled without needing a PHY */
-- if (pl->link_an_mode == MLO_AN_FIXED ||
-- (pl->link_an_mode == MLO_AN_INBAND &&
-+ if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
-+ (pl->cfg_link_an_mode == MLO_AN_INBAND &&
- phy_interface_mode_is_8023z(pl->link_interface)))
- return 0;
-
-@@ -850,7 +853,7 @@ int phylink_of_phy_connect(struct phylin
- phy_node = of_parse_phandle(dn, "phy-device", 0);
-
- if (!phy_node) {
-- if (pl->link_an_mode == MLO_AN_PHY)
-+ if (pl->cfg_link_an_mode == MLO_AN_PHY)
- return -ENODEV;
- return 0;
- }
-@@ -913,7 +916,7 @@ int phylink_fixed_state_cb(struct phylin
- /* It does not make sense to let the link be overriden unless we use
- * MLO_AN_FIXED
- */
-- if (pl->link_an_mode != MLO_AN_FIXED)
-+ if (pl->cfg_link_an_mode != MLO_AN_FIXED)
- return -EINVAL;
-
- mutex_lock(&pl->state_mutex);
-@@ -963,7 +966,7 @@ void phylink_start(struct phylink *pl)
- ASSERT_RTNL();
-
- phylink_info(pl, "configuring for %s/%s link mode\n",
-- phylink_an_mode_str(pl->link_an_mode),
-+ phylink_an_mode_str(pl->cur_link_an_mode),
- phy_modes(pl->link_config.interface));
-
- /* Always set the carrier off */
-@@ -986,7 +989,7 @@ void phylink_start(struct phylink *pl)
- clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
- phylink_run_resolve(pl);
-
-- if (pl->link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
-+ if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
- int irq = gpiod_to_irq(pl->link_gpio);
-
- if (irq > 0) {
-@@ -1001,7 +1004,7 @@ void phylink_start(struct phylink *pl)
- if (irq <= 0)
- mod_timer(&pl->link_poll, jiffies + HZ);
- }
-- if (pl->link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
-+ if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
- mod_timer(&pl->link_poll, jiffies + HZ);
- if (pl->phydev)
- phy_start(pl->phydev);
-@@ -1128,7 +1131,7 @@ int phylink_ethtool_ksettings_get(struct
-
- linkmode_copy(kset->link_modes.supported, pl->supported);
-
-- switch (pl->link_an_mode) {
-+ switch (pl->cur_link_an_mode) {
- case MLO_AN_FIXED:
- /* We are using fixed settings. Report these as the
- * current link settings - and note that these also
-@@ -1200,7 +1203,7 @@ int phylink_ethtool_ksettings_set(struct
- /* If we have a fixed link (as specified by firmware), refuse
- * to change link parameters.
- */
-- if (pl->link_an_mode == MLO_AN_FIXED &&
-+ if (pl->cur_link_an_mode == MLO_AN_FIXED &&
- (s->speed != pl->link_config.speed ||
- s->duplex != pl->link_config.duplex))
- return -EINVAL;
-@@ -1212,7 +1215,7 @@ int phylink_ethtool_ksettings_set(struct
- __clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising);
- } else {
- /* If we have a fixed link, refuse to enable autonegotiation */
-- if (pl->link_an_mode == MLO_AN_FIXED)
-+ if (pl->cur_link_an_mode == MLO_AN_FIXED)
- return -EINVAL;
-
- config.speed = SPEED_UNKNOWN;
-@@ -1254,7 +1257,7 @@ int phylink_ethtool_ksettings_set(struct
- * configuration. For a fixed link, this isn't able to change any
- * parameters, which just leaves inband mode.
- */
-- if (pl->link_an_mode == MLO_AN_INBAND &&
-+ if (pl->cur_link_an_mode == MLO_AN_INBAND &&
- !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) {
- phylink_mac_config(pl, &pl->link_config);
- phylink_mac_an_restart(pl);
-@@ -1344,7 +1347,7 @@ int phylink_ethtool_set_pauseparam(struc
- pause->tx_pause);
- } else if (!test_bit(PHYLINK_DISABLE_STOPPED,
- &pl->phylink_disable_state)) {
-- switch (pl->link_an_mode) {
-+ switch (pl->cur_link_an_mode) {
- case MLO_AN_FIXED:
- /* Should we allow fixed links to change against the config? */
- phylink_resolve_flow(pl, config);
-@@ -1551,7 +1554,7 @@ static int phylink_mii_read(struct phyli
- struct phylink_link_state state;
- int val = 0xffff;
-
-- switch (pl->link_an_mode) {
-+ switch (pl->cur_link_an_mode) {
- case MLO_AN_FIXED:
- if (phy_id == 0) {
- phylink_get_fixed_state(pl, &state);
-@@ -1579,7 +1582,7 @@ static int phylink_mii_read(struct phyli
- static int phylink_mii_write(struct phylink *pl, unsigned int phy_id,
- unsigned int reg, unsigned int val)
- {
-- switch (pl->link_an_mode) {
-+ switch (pl->cur_link_an_mode) {
- case MLO_AN_FIXED:
- break;
-
-@@ -1753,10 +1756,10 @@ static int phylink_sfp_module_insert(voi
- linkmode_copy(pl->link_config.advertising, config.advertising);
- }
-
-- if (pl->link_an_mode != MLO_AN_INBAND ||
-+ if (pl->cur_link_an_mode != MLO_AN_INBAND ||
- pl->link_config.interface != config.interface) {
- pl->link_config.interface = config.interface;
-- pl->link_an_mode = MLO_AN_INBAND;
-+ pl->cur_link_an_mode = MLO_AN_INBAND;
-
- changed = true;
-
diff --git a/target/linux/generic/pending-5.4/749-net-phylink-split-phylink_sfp_module_insert.patch b/target/linux/generic/pending-5.4/749-net-phylink-split-phylink_sfp_module_insert.patch
deleted file mode 100644
index b840d71c43..0000000000
--- a/target/linux/generic/pending-5.4/749-net-phylink-split-phylink_sfp_module_insert.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 36569971241ae6b81376da4937d2c8760122d10b Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 21 Nov 2019 17:58:58 +0000
-Subject: [PATCH 652/660] net: phylink: split phylink_sfp_module_insert()
-
-Split out the configuration step from phylink_sfp_module_insert() so
-we can re-use this later.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 47 +++++++++++++++++++++++----------------
- 1 file changed, 28 insertions(+), 19 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1688,25 +1688,21 @@ static void phylink_sfp_detach(void *ups
- pl->netdev->sfp_bus = NULL;
- }
-
--static int phylink_sfp_module_insert(void *upstream,
-- const struct sfp_eeprom_id *id)
-+static int phylink_sfp_config(struct phylink *pl, u8 mode, u8 port,
-+ const unsigned long *supported,
-+ const unsigned long *advertising)
- {
-- struct phylink *pl = upstream;
-- __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
- __ETHTOOL_DECLARE_LINK_MODE_MASK(support1);
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support);
- struct phylink_link_state config;
- phy_interface_t iface;
-- int ret = 0;
- bool changed;
-- u8 port;
-+ int ret;
-
-- ASSERT_RTNL();
--
-- sfp_parse_support(pl->sfp_bus, id, support);
-- port = sfp_parse_port(pl->sfp_bus, id, support);
-+ linkmode_copy(support, supported);
-
- memset(&config, 0, sizeof(config));
-- linkmode_copy(config.advertising, support);
-+ linkmode_copy(config.advertising, advertising);
- config.interface = PHY_INTERFACE_MODE_NA;
- config.speed = SPEED_UNKNOWN;
- config.duplex = DUPLEX_UNKNOWN;
-@@ -1721,8 +1717,6 @@ static int phylink_sfp_module_insert(voi
- return ret;
- }
-
-- linkmode_copy(support1, support);
--
- iface = sfp_select_interface(pl->sfp_bus, config.advertising);
- if (iface == PHY_INTERFACE_MODE_NA) {
- phylink_err(pl,
-@@ -1732,18 +1726,18 @@ static int phylink_sfp_module_insert(voi
- }
-
- config.interface = iface;
-+ linkmode_copy(support1, support);
- ret = phylink_validate(pl, support1, &config);
- if (ret) {
- phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-+ phylink_an_mode_str(mode),
- phy_modes(config.interface),
- __ETHTOOL_LINK_MODE_MASK_NBITS, support, ret);
- return ret;
- }
-
- phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-- phy_modes(config.interface),
-+ phylink_an_mode_str(mode), phy_modes(config.interface),
- __ETHTOOL_LINK_MODE_MASK_NBITS, support);
-
- if (phy_interface_mode_is_8023z(iface) && pl->phydev)
-@@ -1756,15 +1750,15 @@ static int phylink_sfp_module_insert(voi
- linkmode_copy(pl->link_config.advertising, config.advertising);
- }
-
-- if (pl->cur_link_an_mode != MLO_AN_INBAND ||
-+ if (pl->cur_link_an_mode != mode ||
- pl->link_config.interface != config.interface) {
- pl->link_config.interface = config.interface;
-- pl->cur_link_an_mode = MLO_AN_INBAND;
-+ pl->cur_link_an_mode = mode;
-
- changed = true;
-
- phylink_info(pl, "switched to %s/%s link mode\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-+ phylink_an_mode_str(mode),
- phy_modes(config.interface));
- }
-
-@@ -1777,6 +1771,21 @@ static int phylink_sfp_module_insert(voi
- return ret;
- }
-
-+static int phylink_sfp_module_insert(void *upstream,
-+ const struct sfp_eeprom_id *id)
-+{
-+ struct phylink *pl = upstream;
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
-+ u8 port;
-+
-+ ASSERT_RTNL();
-+
-+ sfp_parse_support(pl->sfp_bus, id, support);
-+ port = sfp_parse_port(pl->sfp_bus, id, support);
-+
-+ return phylink_sfp_config(pl, MLO_AN_INBAND, port, support, support);
-+}
-+
- static int phylink_sfp_module_start(void *upstream)
- {
- struct phylink *pl = upstream;
diff --git a/target/linux/generic/pending-5.4/750-net-phylink-delay-MAC-configuration-for-copper-SFP-m.patch b/target/linux/generic/pending-5.4/750-net-phylink-delay-MAC-configuration-for-copper-SFP-m.patch
deleted file mode 100644
index 667170a398..0000000000
--- a/target/linux/generic/pending-5.4/750-net-phylink-delay-MAC-configuration-for-copper-SFP-m.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-From 52c956003a9d5bcae1f445f9dfd42b624adb6e87 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Wed, 11 Dec 2019 10:56:45 +0000
-Subject: [PATCH] net: phylink: delay MAC configuration for copper SFP modules
-
-Knowing whether we need to delay the MAC configuration because a module
-may have a PHY is useful to phylink to allow NBASE-T modules to work on
-systems supporting no more than 2.5G speeds.
-
-This commit allows us to delay such configuration until after the PHY
-has been probed by recording the parsed capabilities, and if the module
-may have a PHY, doing no more until the module_start() notification is
-called. At that point, we either have a PHY, or we don't.
-
-We move the PHY-based setup a little later, and use the PHYs support
-capabilities rather than the EEPROM parsed capabilities to determine
-whether we can support the PHY.
-
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phylink.c | 53 +++++++++++++++++++++++++++++++--------
- drivers/net/phy/sfp-bus.c | 28 +++++++++++++++++++++
- include/linux/sfp.h | 7 ++++++
- 3 files changed, 78 insertions(+), 10 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -72,6 +72,9 @@ struct phylink {
- bool mac_link_dropped;
-
- struct sfp_bus *sfp_bus;
-+ bool sfp_may_have_phy;
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support);
-+ u8 sfp_port;
- };
-
- #define phylink_printk(level, pl, fmt, ...) \
-@@ -1688,7 +1691,7 @@ static void phylink_sfp_detach(void *ups
- pl->netdev->sfp_bus = NULL;
- }
-
--static int phylink_sfp_config(struct phylink *pl, u8 mode, u8 port,
-+static int phylink_sfp_config(struct phylink *pl, u8 mode,
- const unsigned long *supported,
- const unsigned long *advertising)
- {
-@@ -1762,7 +1765,7 @@ static int phylink_sfp_config(struct phy
- phy_modes(config.interface));
- }
-
-- pl->link_port = port;
-+ pl->link_port = pl->sfp_port;
-
- if (changed && !test_bit(PHYLINK_DISABLE_STOPPED,
- &pl->phylink_disable_state))
-@@ -1775,15 +1778,20 @@ static int phylink_sfp_module_insert(voi
- const struct sfp_eeprom_id *id)
- {
- struct phylink *pl = upstream;
-- __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
-- u8 port;
-+ unsigned long *support = pl->sfp_support;
-
- ASSERT_RTNL();
-
-+ linkmode_zero(support);
- sfp_parse_support(pl->sfp_bus, id, support);
-- port = sfp_parse_port(pl->sfp_bus, id, support);
-+ pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, support);
-
-- return phylink_sfp_config(pl, MLO_AN_INBAND, port, support, support);
-+ /* If this module may have a PHY connecting later, defer until later */
-+ pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id);
-+ if (pl->sfp_may_have_phy)
-+ return 0;
-+
-+ return phylink_sfp_config(pl, MLO_AN_INBAND, support, support);
- }
-
- static int phylink_sfp_module_start(void *upstream)
-@@ -1791,10 +1799,19 @@ static int phylink_sfp_module_start(void
- struct phylink *pl = upstream;
-
- /* If this SFP module has a PHY, start the PHY now. */
-- if (pl->phydev)
-+ if (pl->phydev) {
- phy_start(pl->phydev);
--
-- return 0;
-+ return 0;
-+ }
-+
-+ /* If the module may have a PHY but we didn't detect one we
-+ * need to configure the MAC here.
-+ */
-+ if (!pl->sfp_may_have_phy)
-+ return 0;
-+
-+ return phylink_sfp_config(pl, MLO_AN_INBAND,
-+ pl->sfp_support, pl->sfp_support);
- }
-
- static void phylink_sfp_module_stop(void *upstream)
-@@ -1828,10 +1845,26 @@ static void phylink_sfp_link_up(void *up
- static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
- {
- struct phylink *pl = upstream;
-- phy_interface_t interface = pl->link_config.interface;
-+ phy_interface_t interface;
- int ret;
-
-- ret = phylink_attach_phy(pl, phy, pl->link_config.interface);
-+ /*
-+ * This is the new way of dealing with flow control for PHYs,
-+ * as described by Timur Tabi in commit 529ed1275263 ("net: phy:
-+ * phy drivers should not set SUPPORTED_[Asym_]Pause") except
-+ * using our validate call to the MAC, we rely upon the MAC
-+ * clearing the bits from both supported and advertising fields.
-+ */
-+ phy_support_asym_pause(phy);
-+
-+ /* Do the initial configuration */
-+ ret = phylink_sfp_config(pl, MLO_AN_INBAND, phy->supported,
-+ phy->advertising);
-+ if (ret < 0)
-+ return ret;
-+
-+ interface = pl->link_config.interface;
-+ ret = phylink_attach_phy(pl, phy, interface);
- if (ret < 0)
- return ret;
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -103,6 +103,7 @@ static const struct sfp_quirk *sfp_looku
-
- return NULL;
- }
-+
- /**
- * sfp_parse_port() - Parse the EEPROM base ID, setting the port type
- * @bus: a pointer to the &struct sfp_bus structure for the sfp module
-@@ -179,6 +180,33 @@ int sfp_parse_port(struct sfp_bus *bus,
- EXPORT_SYMBOL_GPL(sfp_parse_port);
-
- /**
-+ * sfp_may_have_phy() - indicate whether the module may have a PHY
-+ * @bus: a pointer to the &struct sfp_bus structure for the sfp module
-+ * @id: a pointer to the module's &struct sfp_eeprom_id
-+ *
-+ * Parse the EEPROM identification given in @id, and return whether
-+ * this module may have a PHY.
-+ */
-+bool sfp_may_have_phy(struct sfp_bus *bus, const struct sfp_eeprom_id *id)
-+{
-+ if (id->base.e1000_base_t)
-+ return true;
-+
-+ if (id->base.phys_id != SFF8024_ID_DWDM_SFP) {
-+ switch (id->base.extended_cc) {
-+ case SFF8024_ECC_10GBASE_T_SFI:
-+ case SFF8024_ECC_10GBASE_T_SR:
-+ case SFF8024_ECC_5GBASE_T:
-+ case SFF8024_ECC_2_5GBASE_T:
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+}
-+EXPORT_SYMBOL_GPL(sfp_may_have_phy);
-+
-+/**
- * sfp_parse_support() - Parse the eeprom id for supported link modes
- * @bus: a pointer to the &struct sfp_bus structure for the sfp module
- * @id: a pointer to the module's &struct sfp_eeprom_id
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -533,6 +533,7 @@ struct sfp_upstream_ops {
- #if IS_ENABLED(CONFIG_SFP)
- int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
- unsigned long *support);
-+bool sfp_may_have_phy(struct sfp_bus *bus, const struct sfp_eeprom_id *id);
- void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
- unsigned long *support);
- phy_interface_t sfp_select_interface(struct sfp_bus *bus,
-@@ -556,6 +557,12 @@ static inline int sfp_parse_port(struct
- return PORT_OTHER;
- }
-
-+static inline bool sfp_may_have_phy(struct sfp_bus *bus,
-+ const struct sfp_eeprom_id *id)
-+{
-+ return false;
-+}
-+
- static inline void sfp_parse_support(struct sfp_bus *bus,
- const struct sfp_eeprom_id *id,
- unsigned long *support)
diff --git a/target/linux/generic/pending-5.4/751-net-phylink-make-Broadcom-BCM84881-based-SFPs-work.patch b/target/linux/generic/pending-5.4/751-net-phylink-make-Broadcom-BCM84881-based-SFPs-work.patch
deleted file mode 100644
index d58304410a..0000000000
--- a/target/linux/generic/pending-5.4/751-net-phylink-make-Broadcom-BCM84881-based-SFPs-work.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From 7adb5b2126bc013f0964ddaefad6ad1b132e86c3 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Wed, 11 Dec 2019 10:56:50 +0000
-Subject: [PATCH] net: phylink: make Broadcom BCM84881 based SFPs work
-
-The Broadcom BCM84881 does not appear to send the SGMII control word
-when operating in SGMII mode, which causes network adapters to fail
-to link with the PHY, or decide to operate at fixed 1G speed, even if
-the PHY negotiated 100M.
-
-Work around this by detecting the Broadcom BCM84881 and switch to phy
-mode rather than inband mode.
-
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phylink.c | 18 ++++++++++++++++--
- 1 file changed, 16 insertions(+), 2 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1842,10 +1842,20 @@ static void phylink_sfp_link_up(void *up
- phylink_run_resolve(pl);
- }
-
-+/* The Broadcom BCM84881 in the Methode DM7052 is unable to provide a SGMII
-+ * or 802.3z control word, so inband will not work.
-+ */
-+static bool phylink_phy_no_inband(struct phy_device *phy)
-+{
-+ return phy->is_c45 &&
-+ (phy->c45_ids.device_ids[1] & 0xfffffff0) == 0xae025150;
-+}
-+
- static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
- {
- struct phylink *pl = upstream;
- phy_interface_t interface;
-+ u8 mode;
- int ret;
-
- /*
-@@ -1857,9 +1867,13 @@ static int phylink_sfp_connect_phy(void
- */
- phy_support_asym_pause(phy);
-
-+ if (phylink_phy_no_inband(phy))
-+ mode = MLO_AN_PHY;
-+ else
-+ mode = MLO_AN_INBAND;
-+
- /* Do the initial configuration */
-- ret = phylink_sfp_config(pl, MLO_AN_INBAND, phy->supported,
-- phy->advertising);
-+ ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising);
- if (ret < 0)
- return ret;
-
diff --git a/target/linux/generic/pending-5.4/752-net-phy-add-Broadcom-BCM84881-PHY-driver.patch b/target/linux/generic/pending-5.4/752-net-phy-add-Broadcom-BCM84881-PHY-driver.patch
deleted file mode 100644
index 783dec0479..0000000000
--- a/target/linux/generic/pending-5.4/752-net-phy-add-Broadcom-BCM84881-PHY-driver.patch
+++ /dev/null
@@ -1,315 +0,0 @@
-From 75f4d8d10e016f7428c268424483a927ee7a78bb Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Wed, 11 Dec 2019 10:56:56 +0000
-Subject: [PATCH] net: phy: add Broadcom BCM84881 PHY driver
-
-Add a rudimentary Clause 45 driver for the BCM84881 PHY, found on
-Methode DM7052 SFPs.
-
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/Kconfig | 6 +
- drivers/net/phy/Makefile | 1 +
- drivers/net/phy/bcm84881.c | 269 +++++++++++++++++++++++++++++++++++++
- 3 files changed, 276 insertions(+)
- create mode 100644 drivers/net/phy/bcm84881.c
-
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -330,6 +330,12 @@ config BROADCOM_PHY
- Currently supports the BCM5411, BCM5421, BCM5461, BCM54616S, BCM5464,
- BCM5481, BCM54810 and BCM5482 PHYs.
-
-+config BCM84881_PHY
-+ tristate "Broadcom BCM84881 PHY"
-+ depends on PHYLIB
-+ ---help---
-+ Support the Broadcom BCM84881 PHY.
-+
- config CICADA_PHY
- tristate "Cicada PHYs"
- ---help---
---- a/drivers/net/phy/Makefile
-+++ b/drivers/net/phy/Makefile
-@@ -62,6 +62,7 @@ obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
- obj-$(CONFIG_BCM_CYGNUS_PHY) += bcm-cygnus.o
- obj-$(CONFIG_BCM_NET_PHYLIB) += bcm-phy-lib.o
- obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
-+obj-$(CONFIG_BCM84881_PHY) += bcm84881.o
- obj-$(CONFIG_CICADA_PHY) += cicada.o
- obj-$(CONFIG_CORTINA_PHY) += cortina.o
- obj-$(CONFIG_DAVICOM_PHY) += davicom.o
---- /dev/null
-+++ b/drivers/net/phy/bcm84881.c
-@@ -0,0 +1,269 @@
-+// SPDX-License-Identifier: GPL-2.0
-+// Broadcom BCM84881 NBASE-T PHY driver, as found on a SFP+ module.
-+// Copyright (C) 2019 Russell King, Deep Blue Solutions Ltd.
-+//
-+// Like the Marvell 88x3310, the Broadcom 84881 changes its host-side
-+// interface according to the operating speed between 10GBASE-R,
-+// 2500BASE-X and SGMII (but unlike the 88x3310, without the control
-+// word).
-+//
-+// This driver only supports those aspects of the PHY that I'm able to
-+// observe and test with the SFP+ module, which is an incomplete subset
-+// of what this PHY is able to support. For example, I only assume it
-+// supports a single lane Serdes connection, but it may be that the PHY
-+// is able to support more than that.
-+#include <linux/delay.h>
-+#include <linux/module.h>
-+#include <linux/phy.h>
-+
-+enum {
-+ MDIO_AN_C22 = 0xffe0,
-+};
-+
-+static int bcm84881_wait_init(struct phy_device *phydev)
-+{
-+ unsigned int tries = 20;
-+ int ret, val;
-+
-+ do {
-+ val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
-+ if (val < 0) {
-+ ret = val;
-+ break;
-+ }
-+ if (!(val & MDIO_CTRL1_RESET)) {
-+ ret = 0;
-+ break;
-+ }
-+ if (!--tries) {
-+ ret = -ETIMEDOUT;
-+ break;
-+ }
-+ msleep(100);
-+ } while (1);
-+
-+ if (ret)
-+ phydev_err(phydev, "%s failed: %d\n", __func__, ret);
-+
-+ return ret;
-+}
-+
-+static int bcm84881_config_init(struct phy_device *phydev)
-+{
-+ switch (phydev->interface) {
-+ case PHY_INTERFACE_MODE_SGMII:
-+ case PHY_INTERFACE_MODE_2500BASEX:
-+ case PHY_INTERFACE_MODE_10GKR:
-+ break;
-+ default:
-+ return -ENODEV;
-+ }
-+ return 0;
-+}
-+
-+static int bcm84881_probe(struct phy_device *phydev)
-+{
-+ /* This driver requires PMAPMD and AN blocks */
-+ const u32 mmd_mask = MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
-+
-+ if (!phydev->is_c45 ||
-+ (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
-+ return -ENODEV;
-+
-+ return 0;
-+}
-+
-+static int bcm84881_get_features(struct phy_device *phydev)
-+{
-+ int ret;
-+
-+ ret = genphy_c45_pma_read_abilities(phydev);
-+ if (ret)
-+ return ret;
-+
-+ /* Although the PHY sets bit 1.11.8, it does not support 10M modes */
-+ linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
-+ phydev->supported);
-+ linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
-+ phydev->supported);
-+
-+ return 0;
-+}
-+
-+static int bcm84881_config_aneg(struct phy_device *phydev)
-+{
-+ bool changed = false;
-+ u32 adv;
-+ int ret;
-+
-+ /* Wait for the PHY to finish initialising, otherwise our
-+ * advertisement may be overwritten.
-+ */
-+ ret = bcm84881_wait_init(phydev);
-+ if (ret)
-+ return ret;
-+
-+ /* We don't support manual MDI control */
-+ phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
-+
-+ /* disabled autoneg doesn't seem to work with this PHY */
-+ if (phydev->autoneg == AUTONEG_DISABLE)
-+ return -EINVAL;
-+
-+ ret = genphy_c45_an_config_aneg(phydev);
-+ if (ret < 0)
-+ return ret;
-+ if (ret > 0)
-+ changed = true;
-+
-+ adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
-+ ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
-+ MDIO_AN_C22 + MII_CTRL1000,
-+ ADVERTISE_1000FULL | ADVERTISE_1000HALF,
-+ adv);
-+ if (ret < 0)
-+ return ret;
-+ if (ret > 0)
-+ changed = true;
-+
-+ return genphy_c45_check_and_restart_aneg(phydev, changed);
-+}
-+
-+static int bcm84881_aneg_done(struct phy_device *phydev)
-+{
-+ int bmsr, val;
-+
-+ val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
-+ if (val < 0)
-+ return val;
-+
-+ bmsr = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_C22 + MII_BMSR);
-+ if (bmsr < 0)
-+ return val;
-+
-+ return !!(val & MDIO_AN_STAT1_COMPLETE) &&
-+ !!(bmsr & BMSR_ANEGCOMPLETE);
-+}
-+
-+static int bcm84881_read_status(struct phy_device *phydev)
-+{
-+ unsigned int mode;
-+ int bmsr, val;
-+
-+ val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
-+ if (val < 0)
-+ return val;
-+
-+ if (val & MDIO_AN_CTRL1_RESTART) {
-+ phydev->link = 0;
-+ return 0;
-+ }
-+
-+ val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
-+ if (val < 0)
-+ return val;
-+
-+ bmsr = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_C22 + MII_BMSR);
-+ if (bmsr < 0)
-+ return val;
-+
-+ phydev->autoneg_complete = !!(val & MDIO_AN_STAT1_COMPLETE) &&
-+ !!(bmsr & BMSR_ANEGCOMPLETE);
-+ phydev->link = !!(val & MDIO_STAT1_LSTATUS) &&
-+ !!(bmsr & BMSR_LSTATUS);
-+ if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete)
-+ phydev->link = false;
-+
-+ if (!phydev->link)
-+ return 0;
-+
-+ linkmode_zero(phydev->lp_advertising);
-+ phydev->speed = SPEED_UNKNOWN;
-+ phydev->duplex = DUPLEX_UNKNOWN;
-+ phydev->pause = 0;
-+ phydev->asym_pause = 0;
-+ phydev->mdix = 0;
-+
-+ if (phydev->autoneg_complete) {
-+ val = genphy_c45_read_lpa(phydev);
-+ if (val < 0)
-+ return val;
-+
-+ val = phy_read_mmd(phydev, MDIO_MMD_AN,
-+ MDIO_AN_C22 + MII_STAT1000);
-+ if (val < 0)
-+ return val;
-+
-+ mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
-+
-+ if (phydev->autoneg == AUTONEG_ENABLE)
-+ phy_resolve_aneg_linkmode(phydev);
-+ }
-+
-+ if (phydev->autoneg == AUTONEG_DISABLE) {
-+ /* disabled autoneg doesn't seem to work, so force the link
-+ * down.
-+ */
-+ phydev->link = 0;
-+ return 0;
-+ }
-+
-+ /* Set the host link mode - we set the phy interface mode and
-+ * the speed according to this register so that downshift works.
-+ * We leave the duplex setting as per the resolution from the
-+ * above.
-+ */
-+ val = phy_read_mmd(phydev, MDIO_MMD_VEND1, 0x4011);
-+ mode = (val & 0x1e) >> 1;
-+ if (mode == 1 || mode == 2)
-+ phydev->interface = PHY_INTERFACE_MODE_SGMII;
-+ else if (mode == 3)
-+ phydev->interface = PHY_INTERFACE_MODE_10GKR;
-+ else if (mode == 4)
-+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
-+ switch (mode & 7) {
-+ case 1:
-+ phydev->speed = SPEED_100;
-+ break;
-+ case 2:
-+ phydev->speed = SPEED_1000;
-+ break;
-+ case 3:
-+ phydev->speed = SPEED_10000;
-+ break;
-+ case 4:
-+ phydev->speed = SPEED_2500;
-+ break;
-+ case 5:
-+ phydev->speed = SPEED_5000;
-+ break;
-+ }
-+
-+ return genphy_c45_read_mdix(phydev);
-+}
-+
-+static struct phy_driver bcm84881_drivers[] = {
-+ {
-+ .phy_id = 0xae025150,
-+ .phy_id_mask = 0xfffffff0,
-+ .name = "Broadcom BCM84881",
-+ .config_init = bcm84881_config_init,
-+ .probe = bcm84881_probe,
-+ .get_features = bcm84881_get_features,
-+ .config_aneg = bcm84881_config_aneg,
-+ .aneg_done = bcm84881_aneg_done,
-+ .read_status = bcm84881_read_status,
-+ },
-+};
-+
-+module_phy_driver(bcm84881_drivers);
-+
-+/* FIXME: module auto-loading for Clause 45 PHYs seems non-functional */
-+static struct mdio_device_id __maybe_unused bcm84881_tbl[] = {
-+ { 0xae025150, 0xfffffff0 },
-+ { },
-+};
-+MODULE_AUTHOR("Russell King");
-+MODULE_DESCRIPTION("Broadcom BCM84881 PHY driver");
-+MODULE_DEVICE_TABLE(mdio, bcm84881_tbl);
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/pending-5.4/753-net-sfp-add-support-for-Clause-45-PHYs.patch b/target/linux/generic/pending-5.4/753-net-sfp-add-support-for-Clause-45-PHYs.patch
deleted file mode 100644
index dcd1ba7ef3..0000000000
--- a/target/linux/generic/pending-5.4/753-net-sfp-add-support-for-Clause-45-PHYs.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From 6df6709dc3d00e0bc948d45dfa8d8f18ba379c48 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 11:56:18 +0000
-Subject: [PATCH 656/660] net: sfp: add support for Clause 45 PHYs
-
-Some SFP+ modules have a Clause 45 PHY onboard, which is accessible via
-the normal I2C address. Detect 10G BASE-T PHYs which may have an
-accessible PHY and probe for it.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 44 +++++++++++++++++++++++++++++++++++++++----
- 1 file changed, 40 insertions(+), 4 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1418,12 +1418,12 @@ static void sfp_sm_phy_detach(struct sfp
- sfp->mod_phy = NULL;
- }
-
--static void sfp_sm_probe_phy(struct sfp *sfp)
-+static void sfp_sm_probe_phy(struct sfp *sfp, bool is_c45)
- {
- struct phy_device *phy;
- int err;
-
-- phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR);
-+ phy = get_phy_device(sfp->i2c_mii, SFP_PHY_ADDR, is_c45);
- if (phy == ERR_PTR(-ENODEV)) {
- dev_info(sfp->dev, "no PHY detected\n");
- return;
-@@ -1433,6 +1433,13 @@ static void sfp_sm_probe_phy(struct sfp
- return;
- }
-
-+ err = phy_device_register(phy);
-+ if (err) {
-+ phy_device_free(phy);
-+ dev_err(sfp->dev, "phy_device_register failed: %d\n", err);
-+ return;
-+ }
-+
- err = sfp_add_phy(sfp->sfp_bus, phy);
- if (err) {
- phy_device_remove(phy);
-@@ -1503,10 +1510,32 @@ static void sfp_sm_fault(struct sfp *sfp
- }
- }
-
-+/* Probe a SFP for a PHY device if the module supports copper - the PHY
-+ * normally sits at I2C bus address 0x56, and may either be a clause 22
-+ * or clause 45 PHY.
-+ *
-+ * Clause 22 copper SFP modules normally operate in Cisco SGMII mode with
-+ * negotiation enabled, but some may be in 1000base-X - which is for the
-+ * PHY driver to determine.
-+ *
-+ * Clause 45 copper SFP+ modules (10G) appear to switch their interface
-+ * mode according to the negotiated line speed.
-+ */
- static void sfp_sm_probe_for_phy(struct sfp *sfp)
- {
-- if (sfp->id.base.e1000_base_t)
-- sfp_sm_probe_phy(sfp);
-+ switch (sfp->id.base.extended_cc) {
-+ case SFF8024_ECC_10GBASE_T_SFI:
-+ case SFF8024_ECC_10GBASE_T_SR:
-+ case SFF8024_ECC_5GBASE_T:
-+ case SFF8024_ECC_2_5GBASE_T:
-+ sfp_sm_probe_phy(sfp, true);
-+ break;
-+
-+ default:
-+ if (sfp->id.base.e1000_base_t)
-+ sfp_sm_probe_phy(sfp, false);
-+ break;
-+ }
- }
-
- static int sfp_module_parse_power(struct sfp *sfp)
-@@ -1566,6 +1595,13 @@ static int sfp_sm_mod_hpower(struct sfp
- return -EAGAIN;
- }
-
-+ /* DM7052 reports as a high power module, responds to reads (with
-+ * all bytes 0xff) at 0x51 but does not accept writes. In any case,
-+ * if the bit is already set, we're already in high power mode.
-+ */
-+ if (!!(val & BIT(0)) == enable)
-+ return 0;
-+
- if (enable)
- val |= BIT(0);
- else
diff --git a/target/linux/generic/pending-5.4/754-net-sfp-fix-unbind.patch b/target/linux/generic/pending-5.4/754-net-sfp-fix-unbind.patch
deleted file mode 100644
index c31922e021..0000000000
--- a/target/linux/generic/pending-5.4/754-net-sfp-fix-unbind.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 729fd05aac22cdf1e502fbf1bf80e5ebba0d9fbc Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 3 Dec 2019 17:48:28 +0000
-Subject: [PATCH] net: sfp: fix unbind
-
-When unbinding, we don't correctly tear down the module state, leaving
-(for example) the hwmon registration behind. Ensure everything is
-properly removed by sending a remove event at unbind.
-
-Fixes: 6b0da5c9c1a3 ("net: sfp: track upstream's attachment state in state machine")
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -2431,6 +2431,10 @@ static int sfp_remove(struct platform_de
-
- sfp_unregister_socket(sfp->sfp_bus);
-
-+ rtnl_lock();
-+ sfp_sm_event(sfp, SFP_E_REMOVE);
-+ rtnl_unlock();
-+
- return 0;
- }
-
diff --git a/target/linux/generic/pending-5.4/755-net-sfp-fix-hwmon.patch b/target/linux/generic/pending-5.4/755-net-sfp-fix-hwmon.patch
deleted file mode 100644
index a18e4801a2..0000000000
--- a/target/linux/generic/pending-5.4/755-net-sfp-fix-hwmon.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 5eb0df5023c6ae8a71a7848fd5e1f788d86e51ae Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 3 Dec 2019 18:46:04 +0000
-Subject: [PATCH] net: sfp: fix hwmon
-
-The referenced commit below allowed more than one hwmon device to be
-created per SFP, which is definitely not what we want. Avoid this by
-only creating the hwmon device just as we transition to WAITDEV state.
-
-Fixes: 139d3a212a1f ("net: sfp: allow modules with slow diagnostics to probe")
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 13 ++++---------
- 1 file changed, 4 insertions(+), 9 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1883,6 +1883,10 @@ static void sfp_sm_module(struct sfp *sf
- break;
- }
-
-+ err = sfp_hwmon_insert(sfp);
-+ if (err)
-+ dev_warn(sfp->dev, "hwmon probe failed: %d\n", err);
-+
- sfp_sm_mod_next(sfp, SFP_MOD_WAITDEV, 0);
- /* fall through */
- case SFP_MOD_WAITDEV:
-@@ -1932,15 +1936,6 @@ static void sfp_sm_module(struct sfp *sf
- case SFP_MOD_ERROR:
- break;
- }
--
--#if IS_ENABLED(CONFIG_HWMON)
-- if (sfp->sm_mod_state >= SFP_MOD_WAITDEV &&
-- IS_ERR_OR_NULL(sfp->hwmon_dev)) {
-- err = sfp_hwmon_insert(sfp);
-- if (err)
-- dev_warn(sfp->dev, "hwmon probe failed: %d\n", err);
-- }
--#endif
- }
-
- static void sfp_sm_main(struct sfp *sfp, unsigned int event)
diff --git a/target/linux/generic/pending-5.4/756-net-sfp-use-a-definition-for-the-fault-recovery-atte.patch b/target/linux/generic/pending-5.4/756-net-sfp-use-a-definition-for-the-fault-recovery-atte.patch
deleted file mode 100644
index ba4f8c40c4..0000000000
--- a/target/linux/generic/pending-5.4/756-net-sfp-use-a-definition-for-the-fault-recovery-atte.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From 4d6bfb6fbb00af38402db4d1ce464e22def9fd9e Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 28 Nov 2019 14:24:40 +0000
-Subject: [PATCH 1/4] net: sfp: use a definition for the fault recovery
- attempts
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -172,6 +172,14 @@ static const enum gpiod_flags gpio_flags
- #define T_RESET_US 10
- #define T_FAULT_RECOVER msecs_to_jiffies(1000)
-
-+/* N_FAULT_INIT is the number of recovery attempts at module initialisation
-+ * time. If the TX_FAULT signal is not deasserted after this number of
-+ * attempts at clearing it, we decide that the module is faulty.
-+ * N_FAULT is the same but after the module has initialised.
-+ */
-+#define N_FAULT_INIT 5
-+#define N_FAULT 5
-+
- /* SFP module presence detection is poor: the three MOD DEF signals are
- * the same length on the PCB, which means it's possible for MOD DEF 0 to
- * connect before the I2C bus on MOD DEF 1/2.
-@@ -1972,7 +1980,7 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_module_tx_enable(sfp);
-
- /* Initialise the fault clearance retries */
-- sfp->sm_retries = 5;
-+ sfp->sm_retries = N_FAULT_INIT;
-
- /* We need to check the TX_FAULT state, which is not defined
- * while TX_DISABLE is asserted. The earliest we want to do
-@@ -2012,7 +2020,7 @@ static void sfp_sm_main(struct sfp *sfp,
- * or t_start_up, so assume there is a fault.
- */
- sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
-- sfp->sm_retries == 5);
-+ sfp->sm_retries == N_FAULT_INIT);
- } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
- init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
- * clear. Probe for the PHY and check the LOS state.
-@@ -2025,7 +2033,7 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_sm_link_check_los(sfp);
-
- /* Reset the fault retry count */
-- sfp->sm_retries = 5;
-+ sfp->sm_retries = N_FAULT;
- }
- break;
-
diff --git a/target/linux/generic/pending-5.4/757-net-sfp-rename-sm_retries.patch b/target/linux/generic/pending-5.4/757-net-sfp-rename-sm_retries.patch
deleted file mode 100644
index 13f3b6ccff..0000000000
--- a/target/linux/generic/pending-5.4/757-net-sfp-rename-sm_retries.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From bfa3cbb01c7ea34d7369c9bd2ec1b2dc67082b04 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Mon, 2 Dec 2019 18:06:44 +0000
-Subject: [PATCH 2/4] net: sfp: rename sm_retries
-
-Rename sm_retries as sm_fault_retries, as this is what this member is
-tracking.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -235,7 +235,7 @@ struct sfp {
- unsigned char sm_mod_tries;
- unsigned char sm_dev_state;
- unsigned short sm_state;
-- unsigned int sm_retries;
-+ unsigned char sm_fault_retries;
-
- struct sfp_eeprom_id id;
- unsigned int module_power_mW;
-@@ -1506,7 +1506,7 @@ static bool sfp_los_event_inactive(struc
-
- static void sfp_sm_fault(struct sfp *sfp, unsigned int next_state, bool warn)
- {
-- if (sfp->sm_retries && !--sfp->sm_retries) {
-+ if (sfp->sm_fault_retries && !--sfp->sm_fault_retries) {
- dev_err(sfp->dev,
- "module persistently indicates fault, disabling\n");
- sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0);
-@@ -1980,7 +1980,7 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_module_tx_enable(sfp);
-
- /* Initialise the fault clearance retries */
-- sfp->sm_retries = N_FAULT_INIT;
-+ sfp->sm_fault_retries = N_FAULT_INIT;
-
- /* We need to check the TX_FAULT state, which is not defined
- * while TX_DISABLE is asserted. The earliest we want to do
-@@ -2020,7 +2020,7 @@ static void sfp_sm_main(struct sfp *sfp,
- * or t_start_up, so assume there is a fault.
- */
- sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
-- sfp->sm_retries == N_FAULT_INIT);
-+ sfp->sm_fault_retries == N_FAULT_INIT);
- } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
- init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
- * clear. Probe for the PHY and check the LOS state.
-@@ -2033,7 +2033,7 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_sm_link_check_los(sfp);
-
- /* Reset the fault retry count */
-- sfp->sm_retries = N_FAULT;
-+ sfp->sm_fault_retries = N_FAULT;
- }
- break;
-
diff --git a/target/linux/generic/pending-5.4/758-net-sfp-error-handling-for-phy-probe.patch b/target/linux/generic/pending-5.4/758-net-sfp-error-handling-for-phy-probe.patch
deleted file mode 100644
index dfa772dc72..0000000000
--- a/target/linux/generic/pending-5.4/758-net-sfp-error-handling-for-phy-probe.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 1fba543dc8edf4a43bff3276306648bb27c1e207 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 29 Nov 2019 00:30:08 +0000
-Subject: [PATCH 3/4] net: sfp: error handling for phy probe
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 26 +++++++++++++++++---------
- 1 file changed, 17 insertions(+), 9 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -1426,7 +1426,7 @@ static void sfp_sm_phy_detach(struct sfp
- sfp->mod_phy = NULL;
- }
-
--static void sfp_sm_probe_phy(struct sfp *sfp, bool is_c45)
-+static int sfp_sm_probe_phy(struct sfp *sfp, bool is_c45)
- {
- struct phy_device *phy;
- int err;
-@@ -1434,18 +1434,18 @@ static void sfp_sm_probe_phy(struct sfp
- phy = get_phy_device(sfp->i2c_mii, SFP_PHY_ADDR, is_c45);
- if (phy == ERR_PTR(-ENODEV)) {
- dev_info(sfp->dev, "no PHY detected\n");
-- return;
-+ return 0;
- }
- if (IS_ERR(phy)) {
- dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy));
-- return;
-+ return PTR_ERR(phy);
- }
-
- err = phy_device_register(phy);
- if (err) {
- phy_device_free(phy);
- dev_err(sfp->dev, "phy_device_register failed: %d\n", err);
-- return;
-+ return err;
- }
-
- err = sfp_add_phy(sfp->sfp_bus, phy);
-@@ -1453,10 +1453,12 @@ static void sfp_sm_probe_phy(struct sfp
- phy_device_remove(phy);
- phy_device_free(phy);
- dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err);
-- return;
-+ return err;
- }
-
- sfp->mod_phy = phy;
-+
-+ return 0;
- }
-
- static void sfp_sm_link_up(struct sfp *sfp)
-@@ -1529,21 +1531,24 @@ static void sfp_sm_fault(struct sfp *sfp
- * Clause 45 copper SFP+ modules (10G) appear to switch their interface
- * mode according to the negotiated line speed.
- */
--static void sfp_sm_probe_for_phy(struct sfp *sfp)
-+static int sfp_sm_probe_for_phy(struct sfp *sfp)
- {
-+ int err = 0;
-+
- switch (sfp->id.base.extended_cc) {
- case SFF8024_ECC_10GBASE_T_SFI:
- case SFF8024_ECC_10GBASE_T_SR:
- case SFF8024_ECC_5GBASE_T:
- case SFF8024_ECC_2_5GBASE_T:
-- sfp_sm_probe_phy(sfp, true);
-+ err = sfp_sm_probe_phy(sfp, true);
- break;
-
- default:
- if (sfp->id.base.e1000_base_t)
-- sfp_sm_probe_phy(sfp, false);
-+ err = sfp_sm_probe_phy(sfp, false);
- break;
- }
-+ return err;
- }
-
- static int sfp_module_parse_power(struct sfp *sfp)
-@@ -2025,7 +2030,10 @@ static void sfp_sm_main(struct sfp *sfp,
- init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
- * clear. Probe for the PHY and check the LOS state.
- */
-- sfp_sm_probe_for_phy(sfp);
-+ if (sfp_sm_probe_for_phy(sfp)) {
-+ sfp_sm_next(sfp, SFP_S_FAIL, 0);
-+ break;
-+ }
- if (sfp_module_start(sfp->sfp_bus)) {
- sfp_sm_next(sfp, SFP_S_FAIL, 0);
- break;
diff --git a/target/linux/generic/pending-5.4/759-net-sfp-re-attempt-probing-for-phy.patch b/target/linux/generic/pending-5.4/759-net-sfp-re-attempt-probing-for-phy.patch
deleted file mode 100644
index aebb6b0398..0000000000
--- a/target/linux/generic/pending-5.4/759-net-sfp-re-attempt-probing-for-phy.patch
+++ /dev/null
@@ -1,132 +0,0 @@
-From 6c4efe83a0acf6f06c89ae17b885fa5739eb5be7 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Mon, 2 Dec 2019 18:20:22 +0000
-Subject: [PATCH 4/4] net: sfp: re-attempt probing for phy
-
-Some 1000BASE-T PHY modules take a while for the PHY to wake up.
-Retry the probe a number of times before deciding that the module has
-no PHY.
-
-Tested with:
- Sourcephotonics SPGBTXCNFC - PHY takes less than 50ms to respond.
- Champion One 1000SFPT - PHY takes about 200ms to respond.
- Mikrotik S-RJ01 - no PHY
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/sfp.c | 59 ++++++++++++++++++++++++++++++++++++---------------
- 1 file changed, 42 insertions(+), 17 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -62,6 +62,7 @@ enum {
- SFP_S_FAIL,
- SFP_S_WAIT,
- SFP_S_INIT,
-+ SFP_S_INIT_PHY,
- SFP_S_INIT_TX_FAULT,
- SFP_S_WAIT_LOS,
- SFP_S_LINK_UP,
-@@ -126,6 +127,7 @@ static const char * const sm_state_strin
- [SFP_S_FAIL] = "fail",
- [SFP_S_WAIT] = "wait",
- [SFP_S_INIT] = "init",
-+ [SFP_S_INIT_PHY] = "init_phy",
- [SFP_S_INIT_TX_FAULT] = "init_tx_fault",
- [SFP_S_WAIT_LOS] = "wait_los",
- [SFP_S_LINK_UP] = "link_up",
-@@ -180,6 +182,12 @@ static const enum gpiod_flags gpio_flags
- #define N_FAULT_INIT 5
- #define N_FAULT 5
-
-+/* T_PHY_RETRY is the time interval between attempts to probe the PHY.
-+ * R_PHY_RETRY is the number of attempts.
-+ */
-+#define T_PHY_RETRY msecs_to_jiffies(50)
-+#define R_PHY_RETRY 12
-+
- /* SFP module presence detection is poor: the three MOD DEF signals are
- * the same length on the PCB, which means it's possible for MOD DEF 0 to
- * connect before the I2C bus on MOD DEF 1/2.
-@@ -236,6 +244,7 @@ struct sfp {
- unsigned char sm_dev_state;
- unsigned short sm_state;
- unsigned char sm_fault_retries;
-+ unsigned char sm_phy_retries;
-
- struct sfp_eeprom_id id;
- unsigned int module_power_mW;
-@@ -1432,10 +1441,8 @@ static int sfp_sm_probe_phy(struct sfp *
- int err;
-
- phy = get_phy_device(sfp->i2c_mii, SFP_PHY_ADDR, is_c45);
-- if (phy == ERR_PTR(-ENODEV)) {
-- dev_info(sfp->dev, "no PHY detected\n");
-- return 0;
-- }
-+ if (phy == ERR_PTR(-ENODEV))
-+ return PTR_ERR(phy);
- if (IS_ERR(phy)) {
- dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy));
- return PTR_ERR(phy);
-@@ -1954,6 +1961,7 @@ static void sfp_sm_module(struct sfp *sf
- static void sfp_sm_main(struct sfp *sfp, unsigned int event)
- {
- unsigned long timeout;
-+ int ret;
-
- /* Some events are global */
- if (sfp->sm_state != SFP_S_DOWN &&
-@@ -2027,22 +2035,39 @@ static void sfp_sm_main(struct sfp *sfp,
- sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
- sfp->sm_fault_retries == N_FAULT_INIT);
- } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
-- init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
-- * clear. Probe for the PHY and check the LOS state.
-- */
-- if (sfp_sm_probe_for_phy(sfp)) {
-- sfp_sm_next(sfp, SFP_S_FAIL, 0);
-- break;
-- }
-- if (sfp_module_start(sfp->sfp_bus)) {
-- sfp_sm_next(sfp, SFP_S_FAIL, 0);
-+ init_done:
-+ sfp->sm_phy_retries = R_PHY_RETRY;
-+ goto phy_probe;
-+ }
-+ break;
-+
-+ case SFP_S_INIT_PHY:
-+ if (event != SFP_E_TIMEOUT)
-+ break;
-+ phy_probe:
-+ /* TX_FAULT deasserted or we timed out with TX_FAULT
-+ * clear. Probe for the PHY and check the LOS state.
-+ */
-+ ret = sfp_sm_probe_for_phy(sfp);
-+ if (ret == -ENODEV) {
-+ if (--sfp->sm_phy_retries) {
-+ sfp_sm_next(sfp, SFP_S_INIT_PHY, T_PHY_RETRY);
- break;
-+ } else {
-+ dev_info(sfp->dev, "no PHY detected\n");
- }
-- sfp_sm_link_check_los(sfp);
--
-- /* Reset the fault retry count */
-- sfp->sm_fault_retries = N_FAULT;
-+ } else if (ret) {
-+ sfp_sm_next(sfp, SFP_S_FAIL, 0);
-+ break;
- }
-+ if (sfp_module_start(sfp->sfp_bus)) {
-+ sfp_sm_next(sfp, SFP_S_FAIL, 0);
-+ break;
-+ }
-+ sfp_sm_link_check_los(sfp);
-+
-+ /* Reset the fault retry count */
-+ sfp->sm_fault_retries = N_FAULT;
- break;
-
- case SFP_S_INIT_TX_FAULT:
diff --git a/target/linux/generic/pending-5.4/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch b/target/linux/generic/pending-5.4/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch
deleted file mode 100644
index a49b48f744..0000000000
--- a/target/linux/generic/pending-5.4/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From a1b291f3f6c80a6c5ccad7283fc472d77a2a4763 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sun, 22 Dec 2019 12:40:11 +0000
-Subject: [PATCH] net: dsa: mv88e6xxx: fix vlan setup
-
-Provide an option that drivers can set to indicate they want to receive
-vlan configuration even when vlan filtering is disabled. This is safe
-for Marvell DSA bridges, which do not look up ingress traffic in the
-VTU if the port is in 8021Q disabled state. Whether this change is
-suitable for all DSA bridges is not known.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: DENG Qingfang <dqfext@gmail.com>
----
- drivers/net/dsa/mv88e6xxx/chip.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -2663,6 +2663,7 @@ static int mv88e6xxx_setup(struct dsa_sw
-
- chip->ds = ds;
- ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip);
-+ ds->configure_vlan_while_not_filtering = true;
-
- mv88e6xxx_reg_lock(chip);
-
diff --git a/target/linux/generic/pending-5.4/761-net-dsa-mt7530-Support-EEE-features.patch b/target/linux/generic/pending-5.4/761-net-dsa-mt7530-Support-EEE-features.patch
deleted file mode 100644
index c2dc35d134..0000000000
--- a/target/linux/generic/pending-5.4/761-net-dsa-mt7530-Support-EEE-features.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-From 9cfb2d426c38272f245e9e6f62b3552d1ed5852b Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>
-Date: Tue, 21 Apr 2020 00:18:08 +0200
-Subject: [PATCH] net: dsa: mt7530: Support EEE features
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: René van Dorst <opensource@vdorst.com>
---- a/drivers/net/dsa/mt7530.c
-+++ b/drivers/net/dsa/mt7530.c
-@@ -1407,9 +1407,13 @@ static void mt7530_phylink_mac_config(st
- switch (state->speed) {
- case SPEED_1000:
- mcr_new |= PMCR_FORCE_SPEED_1000;
-+ if (priv->eee_enable & BIT(port))
-+ mcr_new |= PMCR_FORCE_EEE1G;
- break;
- case SPEED_100:
- mcr_new |= PMCR_FORCE_SPEED_100;
-+ if (priv->eee_enable & BIT(port))
-+ mcr_new |= PMCR_FORCE_EEE100;
- break;
- }
- if (state->duplex == DUPLEX_FULL) {
-@@ -1545,6 +1549,54 @@ mt7530_phylink_mac_link_state(struct dsa
- return 1;
- }
-
-+static int mt7530_get_mac_eee(struct dsa_switch *ds, int port,
-+ struct ethtool_eee *e)
-+{
-+ struct mt7530_priv *priv = ds->priv;
-+ u32 eeecr, pmsr;
-+
-+ e->eee_enabled = !!(priv->eee_enable & BIT(port));
-+
-+ if (e->eee_enabled) {
-+ eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
-+ e->tx_lpi_enabled = !(eeecr & LPI_MODE_EN);
-+ e->tx_lpi_timer = (eeecr >> 4) & 0xFFF;
-+ pmsr = mt7530_read(priv, MT7530_PMSR_P(port));
-+ e->eee_active = e->eee_enabled && !!(pmsr & PMSR_EEE1G);
-+ } else {
-+ e->tx_lpi_enabled = 0;
-+ e->tx_lpi_timer = 0;
-+ e->eee_active = 0;
-+ }
-+
-+ return 0;
-+}
-+
-+static int mt7530_set_mac_eee(struct dsa_switch *ds, int port,
-+ struct ethtool_eee *e)
-+{
-+ struct mt7530_priv *priv = ds->priv;
-+ u32 eeecr;
-+
-+ if (e->tx_lpi_enabled && e->tx_lpi_timer > 0xFFF)
-+ return -EINVAL;
-+
-+ if (e->eee_enabled) {
-+ priv->eee_enable |= BIT(port);
-+ //MT7530_PMEEECR_P
-+ eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
-+ eeecr &= 0xFFFF0000;
-+ if (!e->tx_lpi_enabled)
-+ eeecr |= LPI_MODE_EN;
-+ eeecr |= LPI_THRESH(e->tx_lpi_timer);
-+ mt7530_write(priv, MT7530_PMEEECR_P(port), eeecr);
-+ } else {
-+ priv->eee_enable &= ~(BIT(port));
-+ }
-+
-+ return 0;
-+}
-+
- static const struct dsa_switch_ops mt7530_switch_ops = {
- .get_tag_protocol = mtk_get_tag_protocol,
- .setup = mt7530_setup,
-@@ -1572,6 +1624,8 @@ static const struct dsa_switch_ops mt753
- .phylink_mac_config = mt7530_phylink_mac_config,
- .phylink_mac_link_down = mt7530_phylink_mac_link_down,
- .phylink_mac_link_up = mt7530_phylink_mac_link_up,
-+ .get_mac_eee = mt7530_get_mac_eee,
-+ .set_mac_eee = mt7530_set_mac_eee,
- };
-
- static const struct of_device_id mt7530_of_match[] = {
---- a/drivers/net/dsa/mt7530.h
-+++ b/drivers/net/dsa/mt7530.h
-@@ -212,6 +212,8 @@ enum mt7530_vlan_port_attr {
- #define PMCR_RX_EN BIT(13)
- #define PMCR_BACKOFF_EN BIT(9)
- #define PMCR_BACKPR_EN BIT(8)
-+#define PMCR_FORCE_EEE1G BIT(7)
-+#define PMCR_FORCE_EEE100 BIT(6)
- #define PMCR_TX_FC_EN BIT(5)
- #define PMCR_RX_FC_EN BIT(4)
- #define PMCR_FORCE_SPEED_1000 BIT(3)
-@@ -233,6 +235,12 @@ enum mt7530_vlan_port_attr {
- #define PMSR_DPX BIT(1)
- #define PMSR_LINK BIT(0)
-
-+#define MT7530_PMEEECR_P(x) (0x3004 + (x) * 0x100)
-+#define WAKEUP_TIME_1000(x) ((x & 0xFF) << 24)
-+#define WAKEUP_TIME_100(x) ((x & 0xFF) << 16)
-+#define LPI_THRESH(x) ((x & 0xFFF) << 4)
-+#define LPI_MODE_EN BIT(0)
-+
- /* Register for MIB */
- #define MT7530_PORT_MIB_COUNTER(x) (0x4000 + (x) * 0x100)
- #define MT7530_MIB_CCR 0x4fe0
-@@ -471,6 +479,7 @@ struct mt7530_priv {
- unsigned int p5_intf_sel;
- u8 mirror_rx;
- u8 mirror_tx;
-+ u8 eee_enable;
-
- struct mt7530_port ports[MT7530_NUM_PORTS];
- /* protect among processes for registers access*/
diff --git a/target/linux/generic/pending-5.4/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch b/target/linux/generic/pending-5.4/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch
deleted file mode 100644
index bfa2d375e1..0000000000
--- a/target/linux/generic/pending-5.4/762-net-bridge-switchdev-Refactor-br_switchdev_fdb_notif.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 46fe6cecb296d850c1ee2b333e57093ac4b733f3 Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:09 +0100
-Subject: [PATCH] net: bridge: switchdev: Refactor br_switchdev_fdb_notify
-
-Instead of having to add more and more arguments to
-br_switchdev_fdb_call_notifiers, get rid of it and build the info
-struct directly in br_switchdev_fdb_notify.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
-Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
----
- net/bridge/br_switchdev.c | 37 +++++++++++--------------------------
- 1 file changed, 11 insertions(+), 26 deletions(-)
-
---- a/net/bridge/br_switchdev.c
-+++ b/net/bridge/br_switchdev.c
-@@ -102,42 +102,27 @@ int br_switchdev_set_port_flag(struct ne
- return 0;
- }
-
--static void
--br_switchdev_fdb_call_notifiers(bool adding, const unsigned char *mac,
-- u16 vid, struct net_device *dev,
-- bool added_by_user, bool offloaded)
--{
-- struct switchdev_notifier_fdb_info info;
-- unsigned long notifier_type;
--
-- info.addr = mac;
-- info.vid = vid;
-- info.added_by_user = added_by_user;
-- info.offloaded = offloaded;
-- notifier_type = adding ? SWITCHDEV_FDB_ADD_TO_DEVICE : SWITCHDEV_FDB_DEL_TO_DEVICE;
-- call_switchdev_notifiers(notifier_type, dev, &info.info, NULL);
--}
--
- void
- br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
- {
-+ struct switchdev_notifier_fdb_info info = {
-+ .addr = fdb->key.addr.addr,
-+ .vid = fdb->key.vlan_id,
-+ .added_by_user = fdb->added_by_user,
-+ .offloaded = fdb->offloaded,
-+ };
-+
- if (!fdb->dst)
- return;
-
- switch (type) {
- case RTM_DELNEIGH:
-- br_switchdev_fdb_call_notifiers(false, fdb->key.addr.addr,
-- fdb->key.vlan_id,
-- fdb->dst->dev,
-- fdb->added_by_user,
-- fdb->offloaded);
-+ call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_DEVICE,
-+ fdb->dst->dev, &info.info, NULL);
- break;
- case RTM_NEWNEIGH:
-- br_switchdev_fdb_call_notifiers(true, fdb->key.addr.addr,
-- fdb->key.vlan_id,
-- fdb->dst->dev,
-- fdb->added_by_user,
-- fdb->offloaded);
-+ call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_DEVICE,
-+ fdb->dst->dev, &info.info, NULL);
- break;
- }
- }
diff --git a/target/linux/generic/pending-5.4/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch b/target/linux/generic/pending-5.4/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch
deleted file mode 100644
index 49d6f079ba..0000000000
--- a/target/linux/generic/pending-5.4/763-net-bridge-switchdev-Include-local-flag-in-FDB-notif.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From ec5be4f79026282925ae383caa431a8d41e3456a Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:10 +0100
-Subject: [PATCH] net: bridge: switchdev: Include local flag in FDB
- notifications
-
-Some switchdev drivers, notably DSA, ignore all dynamically learned
-address notifications (!added_by_user) as these are autonomously added
-by the switch. Previously, such a notification was indistinguishable
-from a local address notification. Include a local bit in the
-notification so that the two classes can be discriminated.
-
-This allows DSA-like devices to add local addresses to the hardware
-FDB (with the CPU as the destination), thereby avoiding flows towards
-the CPU being flooded by the switch as unknown unicast.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- include/net/switchdev.h | 1 +
- net/bridge/br_switchdev.c | 1 +
- 2 files changed, 2 insertions(+)
-
---- a/include/net/switchdev.h
-+++ b/include/net/switchdev.h
-@@ -124,6 +124,7 @@ struct switchdev_notifier_fdb_info {
- const unsigned char *addr;
- u16 vid;
- u8 added_by_user:1,
-+ local:1,
- offloaded:1;
- };
-
---- a/net/bridge/br_switchdev.c
-+++ b/net/bridge/br_switchdev.c
-@@ -109,6 +109,7 @@ br_switchdev_fdb_notify(const struct net
- .addr = fdb->key.addr.addr,
- .vid = fdb->key.vlan_id,
- .added_by_user = fdb->added_by_user,
-+ .local = fdb->is_local,
- .offloaded = fdb->offloaded,
- };
-
diff --git a/target/linux/generic/pending-5.4/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch b/target/linux/generic/pending-5.4/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch
deleted file mode 100644
index 8b869dd8f3..0000000000
--- a/target/linux/generic/pending-5.4/764-net-bridge-switchdev-Send-FDB-notifications-for-host.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From 2e50fd9322047253c327550b4485cf8761035a8c Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:11 +0100
-Subject: [PATCH] net: bridge: switchdev: Send FDB notifications for host
- addresses
-
-Treat addresses added to the bridge itself in the same way as regular
-ports and send out a notification so that drivers may sync it down to
-the hardware FDB.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- net/bridge/br_fdb.c | 4 ++--
- net/bridge/br_private.h | 7 ++++---
- net/bridge/br_switchdev.c | 11 +++++------
- 3 files changed, 11 insertions(+), 11 deletions(-)
-
---- a/net/bridge/br_fdb.c
-+++ b/net/bridge/br_fdb.c
-@@ -581,7 +581,7 @@ void br_fdb_update(struct net_bridge *br
-
- /* fastpath: update of existing entry */
- if (unlikely(source != fdb->dst && !fdb->is_sticky)) {
-- br_switchdev_fdb_notify(fdb, RTM_DELNEIGH);
-+ br_switchdev_fdb_notify(br, fdb, RTM_DELNEIGH);
- fdb->dst = source;
- fdb_modified = true;
- /* Take over HW learned entry */
-@@ -697,7 +697,7 @@ static void fdb_notify(struct net_bridge
- int err = -ENOBUFS;
-
- if (swdev_notify)
-- br_switchdev_fdb_notify(fdb, type);
-+ br_switchdev_fdb_notify(br, fdb, type);
-
- skb = nlmsg_new(fdb_nlmsg_size(), GFP_ATOMIC);
- if (skb == NULL)
---- a/net/bridge/br_private.h
-+++ b/net/bridge/br_private.h
-@@ -1203,8 +1203,8 @@ bool nbp_switchdev_allowed_egress(const
- int br_switchdev_set_port_flag(struct net_bridge_port *p,
- unsigned long flags,
- unsigned long mask);
--void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
-- int type);
-+void br_switchdev_fdb_notify(struct net_bridge *br,
-+ const struct net_bridge_fdb_entry *fdb, int type);
- int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
- struct netlink_ext_ack *extack);
- int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
-@@ -1250,7 +1250,8 @@ static inline int br_switchdev_port_vlan
- }
-
- static inline void
--br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
-+br_switchdev_fdb_notify(struct net_bridge *br,
-+ const struct net_bridge_fdb_entry *fdb, int type)
- {
- }
-
---- a/net/bridge/br_switchdev.c
-+++ b/net/bridge/br_switchdev.c
-@@ -103,7 +103,8 @@ int br_switchdev_set_port_flag(struct ne
- }
-
- void
--br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
-+br_switchdev_fdb_notify(struct net_bridge *br,
-+ const struct net_bridge_fdb_entry *fdb, int type)
- {
- struct switchdev_notifier_fdb_info info = {
- .addr = fdb->key.addr.addr,
-@@ -112,18 +113,16 @@ br_switchdev_fdb_notify(const struct net
- .local = fdb->is_local,
- .offloaded = fdb->offloaded,
- };
--
-- if (!fdb->dst)
-- return;
-+ struct net_device *dev = fdb->dst ? fdb->dst->dev : br->dev;
-
- switch (type) {
- case RTM_DELNEIGH:
- call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_DEVICE,
-- fdb->dst->dev, &info.info, NULL);
-+ dev, &info.info, NULL);
- break;
- case RTM_NEWNEIGH:
- call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_DEVICE,
-- fdb->dst->dev, &info.info, NULL);
-+ dev, &info.info, NULL);
- break;
- }
- }
diff --git a/target/linux/generic/pending-5.4/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch b/target/linux/generic/pending-5.4/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch
deleted file mode 100644
index d951246260..0000000000
--- a/target/linux/generic/pending-5.4/765-net-dsa-Include-local-addresses-in-assisted-CPU-port.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From dd082716b43a3684b2f473ae5d1e76d1c076d86d Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:12 +0100
-Subject: [PATCH] net: dsa: Include local addresses in assisted CPU port
- learning
-
-Add local addresses (i.e. the ports' MAC addresses) to the hardware
-FDB when assisted CPU port learning is enabled.
-
-NOTE: The bridge's own MAC address is also "local". If that address is
-not shared with any port, the bridge's MAC is not be added by this
-functionality - but the following commit takes care of that case.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- net/dsa/slave.c | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1698,10 +1698,12 @@ static int dsa_slave_switchdev_event(str
- fdb_info = ptr;
-
- if (dsa_slave_dev_check(dev)) {
-- if (!fdb_info->added_by_user)
-- return NOTIFY_OK;
--
- dp = dsa_slave_to_port(dev);
-+
-+ if (fdb_info->local && dp->ds->assisted_learning_on_cpu_port)
-+ dp = dp->cpu_dp;
-+ else if (!fdb_info->added_by_user)
-+ return NOTIFY_OK;
- } else {
- /* Snoop addresses learnt on foreign interfaces
- * bridged with us, for switches that don't
diff --git a/target/linux/generic/pending-5.4/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch b/target/linux/generic/pending-5.4/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch
deleted file mode 100644
index 46504aeeff..0000000000
--- a/target/linux/generic/pending-5.4/766-net-dsa-Include-bridge-addresses-in-assisted-CPU-por.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 0663ebde114a6fb2c28c622ba5212b302d4d2581 Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:13 +0100
-Subject: [PATCH] net: dsa: Include bridge addresses in assisted CPU port
- learning
-
-Now that notifications are sent out for addresses added to the bridge
-itself, extend DSA to include those addresses in the hardware FDB when
-assisted CPU port learning is enabled.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- net/dsa/slave.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1712,7 +1712,11 @@ static int dsa_slave_switchdev_event(str
- struct net_device *br_dev;
- struct dsa_slave_priv *p;
-
-- br_dev = netdev_master_upper_dev_get_rcu(dev);
-+ if (netif_is_bridge_master(dev))
-+ br_dev = dev;
-+ else
-+ br_dev = netdev_master_upper_dev_get_rcu(dev);
-+
- if (!br_dev)
- return NOTIFY_DONE;
-
diff --git a/target/linux/generic/pending-5.4/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch b/target/linux/generic/pending-5.4/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch
deleted file mode 100644
index e626086bc1..0000000000
--- a/target/linux/generic/pending-5.4/767-net-dsa-Sync-static-FDB-entries-on-foreign-interface.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 81e39fd78db82fb51b05fff309b9c521f1a0bc5a Mon Sep 17 00:00:00 2001
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Date: Sat, 16 Jan 2021 02:25:14 +0100
-Subject: [PATCH] net: dsa: Sync static FDB entries on foreign interfaces to
- hardware
-
-Reuse the "assisted_learning_on_cpu_port" functionality to always add
-entries for user-configured entries on foreign interfaces, even if
-assisted_learning_on_cpu_port is not enabled. E.g. in this situation:
-
- br0
- / \
-swp0 dummy0
-
-$ bridge fdb add 02:00:de:ad:00:01 dev dummy0 vlan 1 master
-
-Results in DSA adding an entry in the hardware FDB, pointing this
-address towards the CPU port.
-
-The same is true for entries added to the bridge itself, e.g:
-
-$ bridge fdb add 02:00:de:ad:00:01 dev br0 vlan 1 self
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- net/dsa/slave.c | 12 ++++++++----
- 1 file changed, 8 insertions(+), 4 deletions(-)
-
---- a/net/dsa/slave.c
-+++ b/net/dsa/slave.c
-@@ -1705,9 +1705,12 @@ static int dsa_slave_switchdev_event(str
- else if (!fdb_info->added_by_user)
- return NOTIFY_OK;
- } else {
-- /* Snoop addresses learnt on foreign interfaces
-- * bridged with us, for switches that don't
-- * automatically learn SA from CPU-injected traffic
-+ /* Snoop addresses added to foreign interfaces
-+ * bridged with us, or the bridge
-+ * itself. Dynamically learned addresses can
-+ * also be added for switches that don't
-+ * automatically learn SA from CPU-injected
-+ * traffic.
- */
- struct net_device *br_dev;
- struct dsa_slave_priv *p;
-@@ -1729,7 +1732,8 @@ static int dsa_slave_switchdev_event(str
-
- dp = p->dp->cpu_dp;
-
-- if (!dp->ds->assisted_learning_on_cpu_port)
-+ if (!fdb_info->added_by_user &&
-+ !dp->ds->assisted_learning_on_cpu_port)
- return NOTIFY_DONE;
- }
-
diff --git a/target/linux/generic/pending-5.4/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-5.4/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch
deleted file mode 100644
index cb421f164b..0000000000
--- a/target/linux/generic/pending-5.4/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Tobias Waldekranz <tobias@waldekranz.com>
-Subject: [RFC net-next 7/7] net: dsa: mv88e6xxx: Request assisted learning on CPU port
-Date: Sat, 16 Jan 2021 02:25:15 +0100
-Archived-At: <https://lore.kernel.org/netdev/20210116012515.3152-8-tobias@waldekranz.com/>
-
-While the hardware is capable of performing learning on the CPU port,
-it requires alot of additions to the bridge's forwarding path in order
-to handle multi-destination traffic correctly.
-
-Until that is in place, opt for the next best thing and let DSA sync
-the relevant addresses down to the hardware FDB.
-
-Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
----
- drivers/net/dsa/mv88e6xxx/chip.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/net/dsa/mv88e6xxx/chip.c
-+++ b/drivers/net/dsa/mv88e6xxx/chip.c
-@@ -5080,6 +5080,7 @@ static int mv88e6xxx_register_switch(str
- ds->ops = &mv88e6xxx_switch_ops;
- ds->ageing_time_min = chip->info->age_time_coeff;
- ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX;
-+ ds->assisted_learning_on_cpu_port = true;
-
- dev_set_drvdata(dev, ds);
-
diff --git a/target/linux/generic/pending-5.4/770-00-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch b/target/linux/generic/pending-5.4/770-00-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch
deleted file mode 100644
index 2f0c7934f5..0000000000
--- a/target/linux/generic/pending-5.4/770-00-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 8 Jun 2020 17:01:12 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: use napi_consume_skb
-
-Should improve performance, since it can use bulk free
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -874,7 +874,8 @@ static int txd_to_idx(struct mtk_tx_ring
- return ((void *)dma - (void *)ring->dma) / sizeof(*dma);
- }
-
--static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf)
-+static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf,
-+ bool napi)
- {
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
- if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) {
-@@ -906,8 +907,12 @@ static void mtk_tx_unmap(struct mtk_eth
-
- tx_buf->flags = 0;
- if (tx_buf->skb &&
-- (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC))
-- dev_kfree_skb_any(tx_buf->skb);
-+ (tx_buf->skb != (struct sk_buff *)MTK_DMA_DUMMY_DESC)) {
-+ if (napi)
-+ napi_consume_skb(tx_buf->skb, napi);
-+ else
-+ dev_kfree_skb_any(tx_buf->skb);
-+ }
- tx_buf->skb = NULL;
- }
-
-@@ -1085,7 +1090,7 @@ err_dma:
- tx_buf = mtk_desc_to_tx_buf(ring, itxd);
-
- /* unmap dma */
-- mtk_tx_unmap(eth, tx_buf);
-+ mtk_tx_unmap(eth, tx_buf, false);
-
- itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU;
- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
-@@ -1403,7 +1408,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
- done[mac]++;
- budget--;
- }
-- mtk_tx_unmap(eth, tx_buf);
-+ mtk_tx_unmap(eth, tx_buf, true);
-
- ring->last_free = desc;
- atomic_inc(&ring->free_count);
-@@ -1440,7 +1445,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
- budget--;
- }
-
-- mtk_tx_unmap(eth, tx_buf);
-+ mtk_tx_unmap(eth, tx_buf, true);
-
- desc = &ring->dma[cpu];
- ring->last_free = desc;
-@@ -1642,7 +1647,7 @@ static void mtk_tx_clean(struct mtk_eth
-
- if (ring->buf) {
- for (i = 0; i < MTK_DMA_SIZE; i++)
-- mtk_tx_unmap(eth, &ring->buf[i]);
-+ mtk_tx_unmap(eth, &ring->buf[i], false);
- kfree(ring->buf);
- ring->buf = NULL;
- }
diff --git a/target/linux/generic/pending-5.4/770-01-net-ethernet-mtk_eth_soc-significantly-reduce-mdio-b.patch b/target/linux/generic/pending-5.4/770-01-net-ethernet-mtk_eth_soc-significantly-reduce-mdio-b.patch
deleted file mode 100644
index 922c35a3e4..0000000000
--- a/target/linux/generic/pending-5.4/770-01-net-ethernet-mtk_eth_soc-significantly-reduce-mdio-b.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 8 Jun 2020 17:02:39 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: significantly reduce mdio bus
- access latency
-
-usleep_range often ends up sleeping much longer than the 10-20us provided
-as a range here. This causes significant latency in mdio bus acceses,
-which easily adds multiple seconds to the boot time on MT7621 when polling
-DSA slave ports.
-Use cond_resched instead of usleep_range, since the MDIO access does not
-take much time
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -85,7 +85,7 @@ static int mtk_mdio_busy_wait(struct mtk
- return 0;
- if (time_after(jiffies, t_start + PHY_IAC_TIMEOUT))
- break;
-- usleep_range(10, 20);
-+ cond_resched();
- }
-
- dev_err(eth->dev, "mdio: MDIO timeout\n");
diff --git a/target/linux/generic/pending-5.4/770-03-net-ethernet-mtk_eth_soc-fix-unnecessary-tx-queue-st.patch b/target/linux/generic/pending-5.4/770-03-net-ethernet-mtk_eth_soc-fix-unnecessary-tx-queue-st.patch
deleted file mode 100644
index 6eeae6985f..0000000000
--- a/target/linux/generic/pending-5.4/770-03-net-ethernet-mtk_eth_soc-fix-unnecessary-tx-queue-st.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 26 Aug 2020 16:55:54 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: fix unnecessary tx queue
- stops
-
-When running short on descriptors, only stop the queue for the netdev that tx
-was attempted for. By the time the something tries to send on the other netdev,
-the ring might have some more room already
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1147,17 +1147,6 @@ static void mtk_wake_queue(struct mtk_et
- }
- }
-
--static void mtk_stop_queue(struct mtk_eth *eth)
--{
-- int i;
--
-- for (i = 0; i < MTK_MAC_COUNT; i++) {
-- if (!eth->netdev[i])
-- continue;
-- netif_stop_queue(eth->netdev[i]);
-- }
--}
--
- static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- struct mtk_mac *mac = netdev_priv(dev);
-@@ -1178,7 +1167,7 @@ static int mtk_start_xmit(struct sk_buff
-
- tx_num = mtk_cal_txd_req(skb);
- if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
-- mtk_stop_queue(eth);
-+ netif_stop_queue(dev);
- netif_err(eth, tx_queued, dev,
- "Tx Ring full when queue awake!\n");
- spin_unlock(&eth->page_lock);
-@@ -1204,7 +1193,7 @@ static int mtk_start_xmit(struct sk_buff
- goto drop;
-
- if (unlikely(atomic_read(&ring->free_count) <= ring->thresh))
-- mtk_stop_queue(eth);
-+ netif_stop_queue(dev);
-
- spin_unlock(&eth->page_lock);
-
diff --git a/target/linux/generic/pending-5.4/770-04-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-q.patch b/target/linux/generic/pending-5.4/770-04-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-q.patch
deleted file mode 100644
index cd042ce409..0000000000
--- a/target/linux/generic/pending-5.4/770-04-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-q.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 26 Aug 2020 16:58:55 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: use larger burst size for
- qdma tx
-
-Improves tx performance
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2208,7 +2208,7 @@ static int mtk_start_dma(struct mtk_eth
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
- mtk_w32(eth,
- MTK_TX_WB_DDONE | MTK_TX_DMA_EN |
-- MTK_DMA_SIZE_16DWORDS | MTK_NDP_CO_PRO |
-+ MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO |
- MTK_RX_DMA_EN | MTK_RX_2B_OFFSET |
- MTK_RX_BT_32DWORDS,
- MTK_QDMA_GLO_CFG);
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -197,7 +197,7 @@
- #define MTK_RX_BT_32DWORDS (3 << 11)
- #define MTK_NDP_CO_PRO BIT(10)
- #define MTK_TX_WB_DDONE BIT(6)
--#define MTK_DMA_SIZE_16DWORDS (2 << 4)
-+#define MTK_TX_BT_32DWORDS (3 << 4)
- #define MTK_RX_DMA_BUSY BIT(3)
- #define MTK_TX_DMA_BUSY BIT(1)
- #define MTK_RX_DMA_EN BIT(2)
diff --git a/target/linux/generic/pending-5.4/770-05-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch b/target/linux/generic/pending-5.4/770-05-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch
deleted file mode 100644
index f68cbc333c..0000000000
--- a/target/linux/generic/pending-5.4/770-05-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 26 Aug 2020 16:59:41 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: increase DMA ring sizes
-
-256 descriptors is not enough for multi-gigabit traffic under load on MT7622.
-Bump it to 512 to improve performance
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -19,7 +19,7 @@
- #define MTK_QDMA_PAGE_SIZE 2048
- #define MTK_MAX_RX_LENGTH 1536
- #define MTK_TX_DMA_BUF_LEN 0x3fff
--#define MTK_DMA_SIZE 256
-+#define MTK_DMA_SIZE 512
- #define MTK_NAPI_WEIGHT 64
- #define MTK_MAC_COUNT 2
- #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)
diff --git a/target/linux/generic/pending-5.4/770-06-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch b/target/linux/generic/pending-5.4/770-06-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch
deleted file mode 100644
index 58128445b2..0000000000
--- a/target/linux/generic/pending-5.4/770-06-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch
+++ /dev/null
@@ -1,281 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 26 Aug 2020 17:02:30 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: implement dynamic interrupt
- moderation
-
-Reduces the number of interrupts under load
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/Kconfig
-+++ b/drivers/net/ethernet/mediatek/Kconfig
-@@ -10,6 +10,7 @@ if NET_VENDOR_MEDIATEK
- config NET_MEDIATEK_SOC
- tristate "MediaTek SoC Gigabit Ethernet support"
- select PHYLINK
-+ select DIMLIB
- ---help---
- This driver supports the gigabit ethernet MACs in the
- MediaTek SoC family.
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1249,12 +1249,13 @@ static void mtk_update_rx_cpu_idx(struct
- static int mtk_poll_rx(struct napi_struct *napi, int budget,
- struct mtk_eth *eth)
- {
-+ struct dim_sample dim_sample = {};
- struct mtk_rx_ring *ring;
- int idx;
- struct sk_buff *skb;
- u8 *data, *new_data;
- struct mtk_rx_dma *rxd, trxd;
-- int done = 0;
-+ int done = 0, bytes = 0;
-
- while (done < budget) {
- struct net_device *netdev;
-@@ -1328,6 +1329,7 @@ static int mtk_poll_rx(struct napi_struc
- else
- skb_checksum_none_assert(skb);
- skb->protocol = eth_type_trans(skb, netdev);
-+ bytes += pktlen;
-
- if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
- (trxd.rxd2 & RX_DMA_VTAG))
-@@ -1359,6 +1361,12 @@ rx_done:
- mtk_update_rx_cpu_idx(eth);
- }
-
-+ eth->rx_packets += done;
-+ eth->rx_bytes += bytes;
-+ dim_update_sample(eth->rx_events, eth->rx_packets, eth->rx_bytes,
-+ &dim_sample);
-+ net_dim(&eth->rx_dim, dim_sample);
-+
- return done;
- }
-
-@@ -1451,6 +1459,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
- static int mtk_poll_tx(struct mtk_eth *eth, int budget)
- {
- struct mtk_tx_ring *ring = &eth->tx_ring;
-+ struct dim_sample dim_sample = {};
- unsigned int done[MTK_MAX_DEVS];
- unsigned int bytes[MTK_MAX_DEVS];
- int total = 0, i;
-@@ -1468,8 +1477,14 @@ static int mtk_poll_tx(struct mtk_eth *e
- continue;
- netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
- total += done[i];
-+ eth->tx_packets += done[i];
-+ eth->tx_bytes += bytes[i];
- }
-
-+ dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes,
-+ &dim_sample);
-+ net_dim(&eth->tx_dim, dim_sample);
-+
- if (mtk_queue_stopped(eth) &&
- (atomic_read(&ring->free_count) > ring->thresh))
- mtk_wake_queue(eth);
-@@ -2144,6 +2159,7 @@ static irqreturn_t mtk_handle_irq_rx(int
- {
- struct mtk_eth *eth = _eth;
-
-+ eth->rx_events++;
- if (likely(napi_schedule_prep(&eth->rx_napi))) {
- __napi_schedule(&eth->rx_napi);
- mtk_rx_irq_disable(eth, MTK_RX_DONE_INT);
-@@ -2156,6 +2172,7 @@ static irqreturn_t mtk_handle_irq_tx(int
- {
- struct mtk_eth *eth = _eth;
-
-+ eth->tx_events++;
- if (likely(napi_schedule_prep(&eth->tx_napi))) {
- __napi_schedule(&eth->tx_napi);
- mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
-@@ -2332,6 +2349,9 @@ static int mtk_stop(struct net_device *d
- napi_disable(&eth->tx_napi);
- napi_disable(&eth->rx_napi);
-
-+ cancel_work_sync(&eth->rx_dim.work);
-+ cancel_work_sync(&eth->tx_dim.work);
-+
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
- mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
- mtk_stop_dma(eth, MTK_PDMA_GLO_CFG);
-@@ -2381,6 +2401,64 @@ err_disable_clks:
- return ret;
- }
-
-+static void mtk_dim_rx(struct work_struct *work)
-+{
-+ struct dim *dim = container_of(work, struct dim, work);
-+ struct mtk_eth *eth = container_of(dim, struct mtk_eth, rx_dim);
-+ struct dim_cq_moder cur_profile;
-+ u32 val, cur;
-+
-+ cur_profile = net_dim_get_rx_moderation(eth->rx_dim.mode,
-+ dim->profile_ix);
-+ spin_lock_bh(&eth->dim_lock);
-+
-+ val = mtk_r32(eth, MTK_PDMA_DELAY_INT);
-+ val &= MTK_PDMA_DELAY_TX_MASK;
-+ val |= MTK_PDMA_DELAY_RX_EN;
-+
-+ cur = min_t(u32, DIV_ROUND_UP(cur_profile.usec, 20), MTK_PDMA_DELAY_PTIME_MASK);
-+ val |= cur << MTK_PDMA_DELAY_RX_PTIME_SHIFT;
-+
-+ cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK);
-+ val |= cur << MTK_PDMA_DELAY_RX_PINT_SHIFT;
-+
-+ mtk_w32(eth, val, MTK_PDMA_DELAY_INT);
-+ mtk_w32(eth, val, MTK_QDMA_DELAY_INT);
-+
-+ spin_unlock_bh(&eth->dim_lock);
-+
-+ dim->state = DIM_START_MEASURE;
-+}
-+
-+static void mtk_dim_tx(struct work_struct *work)
-+{
-+ struct dim *dim = container_of(work, struct dim, work);
-+ struct mtk_eth *eth = container_of(dim, struct mtk_eth, tx_dim);
-+ struct dim_cq_moder cur_profile;
-+ u32 val, cur;
-+
-+ cur_profile = net_dim_get_tx_moderation(eth->tx_dim.mode,
-+ dim->profile_ix);
-+ spin_lock_bh(&eth->dim_lock);
-+
-+ val = mtk_r32(eth, MTK_PDMA_DELAY_INT);
-+ val &= MTK_PDMA_DELAY_RX_MASK;
-+ val |= MTK_PDMA_DELAY_TX_EN;
-+
-+ cur = min_t(u32, DIV_ROUND_UP(cur_profile.usec, 20), MTK_PDMA_DELAY_PTIME_MASK);
-+ val |= cur << MTK_PDMA_DELAY_TX_PTIME_SHIFT;
-+
-+ cur = min_t(u32, cur_profile.pkts, MTK_PDMA_DELAY_PINT_MASK);
-+ val |= cur << MTK_PDMA_DELAY_TX_PINT_SHIFT;
-+
-+ mtk_w32(eth, val, MTK_PDMA_DELAY_INT);
-+ mtk_w32(eth, val, MTK_QDMA_DELAY_INT);
-+
-+ spin_unlock_bh(&eth->dim_lock);
-+
-+ dim->state = DIM_START_MEASURE;
-+}
-+
- static int mtk_hw_init(struct mtk_eth *eth)
- {
- int i, val, ret;
-@@ -2402,9 +2480,6 @@ static int mtk_hw_init(struct mtk_eth *e
- goto err_disable_pm;
- }
-
-- /* enable interrupt delay for RX */
-- mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT);
--
- /* disable delay and normal interrupt */
- mtk_tx_irq_disable(eth, ~0);
- mtk_rx_irq_disable(eth, ~0);
-@@ -2443,11 +2518,10 @@ static int mtk_hw_init(struct mtk_eth *e
- /* Enable RX VLan Offloading */
- mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
-
-- /* enable interrupt delay for RX */
-- mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT);
-+ mtk_dim_rx(&eth->rx_dim.work);
-+ mtk_dim_tx(&eth->tx_dim.work);
-
- /* disable delay and normal interrupt */
-- mtk_w32(eth, 0, MTK_QDMA_DELAY_INT);
- mtk_tx_irq_disable(eth, ~0);
- mtk_rx_irq_disable(eth, ~0);
-
-@@ -2948,6 +3022,13 @@ static int mtk_probe(struct platform_dev
- spin_lock_init(&eth->page_lock);
- spin_lock_init(&eth->tx_irq_lock);
- spin_lock_init(&eth->rx_irq_lock);
-+ spin_lock_init(&eth->dim_lock);
-+
-+ eth->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
-+ INIT_WORK(&eth->rx_dim.work, mtk_dim_rx);
-+
-+ eth->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
-+ INIT_WORK(&eth->tx_dim.work, mtk_dim_tx);
-
- if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
- eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -15,6 +15,7 @@
- #include <linux/u64_stats_sync.h>
- #include <linux/refcount.h>
- #include <linux/phylink.h>
-+#include <linux/dim.h>
-
- #define MTK_QDMA_PAGE_SIZE 2048
- #define MTK_MAX_RX_LENGTH 1536
-@@ -131,13 +132,18 @@
-
- /* PDMA Delay Interrupt Register */
- #define MTK_PDMA_DELAY_INT 0xa0c
-+#define MTK_PDMA_DELAY_RX_MASK GENMASK(15, 0)
- #define MTK_PDMA_DELAY_RX_EN BIT(15)
--#define MTK_PDMA_DELAY_RX_PINT 4
- #define MTK_PDMA_DELAY_RX_PINT_SHIFT 8
--#define MTK_PDMA_DELAY_RX_PTIME 4
--#define MTK_PDMA_DELAY_RX_DELAY \
-- (MTK_PDMA_DELAY_RX_EN | MTK_PDMA_DELAY_RX_PTIME | \
-- (MTK_PDMA_DELAY_RX_PINT << MTK_PDMA_DELAY_RX_PINT_SHIFT))
-+#define MTK_PDMA_DELAY_RX_PTIME_SHIFT 0
-+
-+#define MTK_PDMA_DELAY_TX_MASK GENMASK(31, 16)
-+#define MTK_PDMA_DELAY_TX_EN BIT(31)
-+#define MTK_PDMA_DELAY_TX_PINT_SHIFT 24
-+#define MTK_PDMA_DELAY_TX_PTIME_SHIFT 16
-+
-+#define MTK_PDMA_DELAY_PINT_MASK 0x7f
-+#define MTK_PDMA_DELAY_PTIME_MASK 0xff
-
- /* PDMA Interrupt Status Register */
- #define MTK_PDMA_INT_STATUS 0xa20
-@@ -219,6 +225,7 @@
- /* QDMA Interrupt Status Register */
- #define MTK_QDMA_INT_STATUS 0x1A18
- #define MTK_RX_DONE_DLY BIT(30)
-+#define MTK_TX_DONE_DLY BIT(28)
- #define MTK_RX_DONE_INT3 BIT(19)
- #define MTK_RX_DONE_INT2 BIT(18)
- #define MTK_RX_DONE_INT1 BIT(17)
-@@ -228,8 +235,7 @@
- #define MTK_TX_DONE_INT1 BIT(1)
- #define MTK_TX_DONE_INT0 BIT(0)
- #define MTK_RX_DONE_INT MTK_RX_DONE_DLY
--#define MTK_TX_DONE_INT (MTK_TX_DONE_INT0 | MTK_TX_DONE_INT1 | \
-- MTK_TX_DONE_INT2 | MTK_TX_DONE_INT3)
-+#define MTK_TX_DONE_INT MTK_TX_DONE_DLY
-
- /* QDMA Interrupt grouping registers */
- #define MTK_QDMA_INT_GRP1 0x1a20
-@@ -912,6 +918,18 @@ struct mtk_eth {
-
- const struct mtk_soc_data *soc;
-
-+ spinlock_t dim_lock;
-+
-+ u32 rx_events;
-+ u32 rx_packets;
-+ u32 rx_bytes;
-+ struct dim rx_dim;
-+
-+ u32 tx_events;
-+ u32 tx_packets;
-+ u32 tx_bytes;
-+ struct dim tx_dim;
-+
- u32 tx_int_mask_reg;
- u32 tx_int_status_reg;
- u32 rx_dma_l4_valid;
diff --git a/target/linux/generic/pending-5.4/770-08-net-ethernet-mtk_eth_soc-cache-hardware-pointer-of-l.patch b/target/linux/generic/pending-5.4/770-08-net-ethernet-mtk_eth_soc-cache-hardware-pointer-of-l.patch
deleted file mode 100644
index b280b6cf4b..0000000000
--- a/target/linux/generic/pending-5.4/770-08-net-ethernet-mtk_eth_soc-cache-hardware-pointer-of-l.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 27 Aug 2020 06:32:03 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: cache hardware pointer of last
- freed tx descriptor
-
-The value is only updated by the CPU, so it is cheaper to access from the ring
-data structure than from a hardware register
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1379,7 +1379,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
- struct mtk_tx_buf *tx_buf;
- u32 cpu, dma;
-
-- cpu = mtk_r32(eth, MTK_QTX_CRX_PTR);
-+ cpu = ring->last_free_ptr;
- dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
-
- desc = mtk_qdma_phys_to_virt(ring, cpu);
-@@ -1413,6 +1413,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
- cpu = next_cpu;
- }
-
-+ ring->last_free_ptr = cpu;
- mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
-
- return budget;
-@@ -1613,6 +1614,7 @@ static int mtk_tx_alloc(struct mtk_eth *
- atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
- ring->next_free = &ring->dma[0];
- ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
-+ ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz));
- ring->thresh = MAX_SKB_FRAGS;
-
- /* make sure that all changes to the dma ring are flushed before we
-@@ -1626,9 +1628,7 @@ static int mtk_tx_alloc(struct mtk_eth *
- mtk_w32(eth,
- ring->phys + ((MTK_DMA_SIZE - 1) * sz),
- MTK_QTX_CRX_PTR);
-- mtk_w32(eth,
-- ring->phys + ((MTK_DMA_SIZE - 1) * sz),
-- MTK_QTX_DRX_PTR);
-+ mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR);
- mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES,
- MTK_QTX_CFG(0));
- } else {
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -644,6 +644,7 @@ struct mtk_tx_buf {
- * @phys: The physical addr of tx_buf
- * @next_free: Pointer to the next free descriptor
- * @last_free: Pointer to the last free descriptor
-+ * @last_free_ptr: Hardware pointer value of the last free descriptor
- * @thresh: The threshold of minimum amount of free descriptors
- * @free_count: QDMA uses a linked list. Track how many free descriptors
- * are present
-@@ -654,6 +655,7 @@ struct mtk_tx_ring {
- dma_addr_t phys;
- struct mtk_tx_dma *next_free;
- struct mtk_tx_dma *last_free;
-+ u32 last_free_ptr;
- u16 thresh;
- atomic_t free_count;
- int dma_size;
diff --git a/target/linux/generic/pending-5.4/770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch b/target/linux/generic/pending-5.4/770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch
deleted file mode 100644
index c2f5013e26..0000000000
--- a/target/linux/generic/pending-5.4/770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 27 Aug 2020 09:24:25 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full rx
- descriptor if DMA is done
-
-Uncached memory access is expensive, and there is no need to access all
-descriptor words if we can't process them anyway
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -793,13 +793,18 @@ static inline int mtk_max_buf_size(int f
- return buf_size;
- }
-
--static inline void mtk_rx_get_desc(struct mtk_rx_dma *rxd,
-+static inline bool mtk_rx_get_desc(struct mtk_rx_dma *rxd,
- struct mtk_rx_dma *dma_rxd)
- {
-- rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
- rxd->rxd2 = READ_ONCE(dma_rxd->rxd2);
-+ if (!(rxd->rxd2 & RX_DMA_DONE))
-+ return false;
-+
-+ rxd->rxd1 = READ_ONCE(dma_rxd->rxd1);
- rxd->rxd3 = READ_ONCE(dma_rxd->rxd3);
- rxd->rxd4 = READ_ONCE(dma_rxd->rxd4);
-+
-+ return true;
- }
-
- /* the qdma core needs scratch memory to be setup */
-@@ -1271,8 +1276,7 @@ static int mtk_poll_rx(struct napi_struc
- rxd = &ring->dma[idx];
- data = ring->data[idx];
-
-- mtk_rx_get_desc(&trxd, rxd);
-- if (!(trxd.rxd2 & RX_DMA_DONE))
-+ if (!mtk_rx_get_desc(&trxd, rxd))
- break;
-
- /* find out which mac the packet come from. values start at 1 */
diff --git a/target/linux/generic/pending-5.4/770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch b/target/linux/generic/pending-5.4/770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch
deleted file mode 100644
index 285fcf8971..0000000000
--- a/target/linux/generic/pending-5.4/770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 27 Aug 2020 09:44:43 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: unmap rx data before calling
- build_skb
-
-Since build_skb accesses the data area (for initializing shinfo), dma unmap
-needs to happen before that call
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1314,17 +1314,18 @@ static int mtk_poll_rx(struct napi_struc
- goto release_desc;
- }
-
-+ dma_unmap_single(eth->dev, trxd.rxd1,
-+ ring->buf_size, DMA_FROM_DEVICE);
-+
- /* receive data */
- skb = build_skb(data, ring->frag_size);
- if (unlikely(!skb)) {
-- skb_free_frag(new_data);
-+ skb_free_frag(data);
- netdev->stats.rx_dropped++;
-- goto release_desc;
-+ goto skip_rx;
- }
- skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
-
-- dma_unmap_single(eth->dev, trxd.rxd1,
-- ring->buf_size, DMA_FROM_DEVICE);
- pktlen = RX_DMA_GET_PLEN0(trxd.rxd2);
- skb->dev = netdev;
- skb_put(skb, pktlen);
-@@ -1342,6 +1343,7 @@ static int mtk_poll_rx(struct napi_struc
- skb_record_rx_queue(skb, 0);
- napi_gro_receive(napi, skb);
-
-+skip_rx:
- ring->data[idx] = new_data;
- rxd->rxd1 = (unsigned int)dma_addr;
-
diff --git a/target/linux/generic/pending-5.4/770-11-net-ethernet-mtk_eth_soc-avoid-rearming-interrupt-if.patch b/target/linux/generic/pending-5.4/770-11-net-ethernet-mtk_eth_soc-avoid-rearming-interrupt-if.patch
deleted file mode 100644
index 4036e32354..0000000000
--- a/target/linux/generic/pending-5.4/770-11-net-ethernet-mtk_eth_soc-avoid-rearming-interrupt-if.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 4 Sep 2020 18:14:05 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid rearming interrupt if
- napi_complete returns false
-
-Reduces unnecessary interrupts
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1536,8 +1536,8 @@ static int mtk_napi_tx(struct napi_struc
- if (status & MTK_TX_DONE_INT)
- return budget;
-
-- napi_complete(napi);
-- mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
-+ if (napi_complete(napi))
-+ mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
-
- return tx_done;
- }
-@@ -1570,8 +1570,9 @@ poll_again:
- remain_budget -= rx_done;
- goto poll_again;
- }
-- napi_complete(napi);
-- mtk_rx_irq_enable(eth, MTK_RX_DONE_INT);
-+
-+ if (napi_complete(napi))
-+ mtk_rx_irq_enable(eth, MTK_RX_DONE_INT);
-
- return rx_done + budget - remain_budget;
- }
diff --git a/target/linux/generic/pending-5.4/770-13-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch b/target/linux/generic/pending-5.4/770-13-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch
deleted file mode 100644
index b1bde7bbff..0000000000
--- a/target/linux/generic/pending-5.4/770-13-net-ethernet-mtk_eth_soc-fix-parsing-packets-in-GDM.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 13 Sep 2020 08:17:02 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: fix parsing packets in GDM
-
-When using DSA, set the special tag in GDM ingress control to allow the MAC
-to parse packets properly earlier. This affects rx DMA source port reporting.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -19,6 +19,7 @@
- #include <linux/interrupt.h>
- #include <linux/pinctrl/devinfo.h>
- #include <linux/phylink.h>
-+#include <net/dsa.h>
-
- #include "mtk_eth_soc.h"
-
-@@ -1280,13 +1281,12 @@ static int mtk_poll_rx(struct napi_struc
- break;
-
- /* find out which mac the packet come from. values start at 1 */
-- if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
-+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) ||
-+ (trxd.rxd4 & RX_DMA_SPECIAL_TAG))
- mac = 0;
-- } else {
-- mac = (trxd.rxd4 >> RX_DMA_FPORT_SHIFT) &
-- RX_DMA_FPORT_MASK;
-- mac--;
-- }
-+ else
-+ mac = ((trxd.rxd4 >> RX_DMA_FPORT_SHIFT) &
-+ RX_DMA_FPORT_MASK) - 1;
-
- if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT ||
- !eth->netdev[mac]))
-@@ -2268,6 +2268,9 @@ static void mtk_gdm_config(struct mtk_et
-
- val |= config;
-
-+ if (!i && eth->netdev[0] && netdev_uses_dsa(eth->netdev[0]))
-+ val |= MTK_GDMA_SPECIAL_TAG;
-+
- mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
- }
- /* Reset and enable PSE */
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -82,6 +82,7 @@
-
- /* GDM Exgress Control Register */
- #define MTK_GDMA_FWD_CFG(x) (0x500 + (x * 0x1000))
-+#define MTK_GDMA_SPECIAL_TAG BIT(24)
- #define MTK_GDMA_ICS_EN BIT(22)
- #define MTK_GDMA_TCS_EN BIT(21)
- #define MTK_GDMA_UCS_EN BIT(20)
-@@ -324,6 +325,7 @@
- #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */
- #define RX_DMA_FPORT_SHIFT 19
- #define RX_DMA_FPORT_MASK 0x7
-+#define RX_DMA_SPECIAL_TAG BIT(22)
-
- /* PHY Indirect Access Control registers */
- #define MTK_PHY_IAC 0x10004
diff --git a/target/linux/generic/pending-5.4/770-14-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch b/target/linux/generic/pending-5.4/770-14-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch
deleted file mode 100644
index 4ab3d84163..0000000000
--- a/target/linux/generic/pending-5.4/770-14-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 13 Sep 2020 08:27:24 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: set PPE flow hash as skb hash
- if present
-
-This improves GRO performance
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -19,6 +19,7 @@
- #include <linux/interrupt.h>
- #include <linux/pinctrl/devinfo.h>
- #include <linux/phylink.h>
-+#include <linux/jhash.h>
- #include <net/dsa.h>
-
- #include "mtk_eth_soc.h"
-@@ -1267,6 +1268,7 @@ static int mtk_poll_rx(struct napi_struc
- struct net_device *netdev;
- unsigned int pktlen;
- dma_addr_t dma_addr;
-+ u32 hash;
- int mac;
-
- ring = mtk_get_rx_ring(eth);
-@@ -1336,6 +1338,12 @@ static int mtk_poll_rx(struct napi_struc
- skb->protocol = eth_type_trans(skb, netdev);
- bytes += pktlen;
-
-+ hash = trxd.rxd4 & GENMASK(13, 0);
-+ if (hash != GENMASK(13, 0)) {
-+ hash = jhash_1word(hash, 0);
-+ skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
-+ }
-+
- if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
- (trxd.rxd2 & RX_DMA_VTAG))
- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
diff --git a/target/linux/generic/pending-5.4/770-15-net-ethernet-mediatek-mtk_eth_soc-add-support-for-in.patch b/target/linux/generic/pending-5.4/770-15-net-ethernet-mediatek-mtk_eth_soc-add-support-for-in.patch
deleted file mode 100644
index 8847870fb7..0000000000
--- a/target/linux/generic/pending-5.4/770-15-net-ethernet-mediatek-mtk_eth_soc-add-support-for-in.patch
+++ /dev/null
@@ -1,1058 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 11 Oct 2020 22:23:08 +0200
-Subject: [PATCH] ethernet: mediatek: mtk_eth_soc: add support for
- initializing the PPE
-
-The PPE (packet processing engine) is used to offload NAT/routed or even
-bridged flows. This patch brings up the PPE and uses it to get a packet
-hash. It also contains some functionality that will be used to bring up
-flow offloading later
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe.c
- create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe.h
- create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe_regs.h
-
---- a/drivers/net/ethernet/mediatek/Makefile
-+++ b/drivers/net/ethernet/mediatek/Makefile
-@@ -4,4 +4,4 @@
- #
-
- obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o
--mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o
-+mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2301,12 +2301,17 @@ static int mtk_open(struct net_device *d
-
- /* we run 2 netdevs on the same dma ring so we only bring it up once */
- if (!refcount_read(&eth->dma_refcnt)) {
-- int err = mtk_start_dma(eth);
-+ u32 gdm_config = MTK_GDMA_TO_PDMA;
-+ int err;
-
-+ err = mtk_start_dma(eth);
- if (err)
- return err;
-
-- mtk_gdm_config(eth, MTK_GDMA_TO_PDMA);
-+ if (eth->soc->offload_version && mtk_ppe_start(&eth->ppe) == 0)
-+ gdm_config = MTK_GDMA_TO_PPE;
-+
-+ mtk_gdm_config(eth, gdm_config);
-
- napi_enable(&eth->tx_napi);
- napi_enable(&eth->rx_napi);
-@@ -2376,6 +2381,9 @@ static int mtk_stop(struct net_device *d
-
- mtk_dma_free(eth);
-
-+ if (eth->soc->offload_version)
-+ mtk_ppe_stop(&eth->ppe);
-+
- return 0;
- }
-
-@@ -3162,6 +3170,13 @@ static int mtk_probe(struct platform_dev
- goto err_free_dev;
- }
-
-+ if (eth->soc->offload_version) {
-+ err = mtk_ppe_init(&eth->ppe, eth->dev,
-+ eth->base + MTK_ETH_PPE_BASE, 2);
-+ if (err)
-+ goto err_free_dev;
-+ }
-+
- for (i = 0; i < MTK_MAX_DEVS; i++) {
- if (!eth->netdev[i])
- continue;
-@@ -3236,6 +3251,7 @@ static const struct mtk_soc_data mt7621_
- .hw_features = MTK_HW_FEATURES,
- .required_clks = MT7621_CLKS_BITMAP,
- .required_pctl = false,
-+ .offload_version = 2,
- };
-
- static const struct mtk_soc_data mt7622_data = {
-@@ -3244,6 +3260,7 @@ static const struct mtk_soc_data mt7622_
- .hw_features = MTK_HW_FEATURES,
- .required_clks = MT7622_CLKS_BITMAP,
- .required_pctl = false,
-+ .offload_version = 2,
- };
-
- static const struct mtk_soc_data mt7623_data = {
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -16,6 +16,7 @@
- #include <linux/refcount.h>
- #include <linux/phylink.h>
- #include <linux/dim.h>
-+#include "mtk_ppe.h"
-
- #define MTK_QDMA_PAGE_SIZE 2048
- #define MTK_MAX_RX_LENGTH 1536
-@@ -87,6 +88,7 @@
- #define MTK_GDMA_TCS_EN BIT(21)
- #define MTK_GDMA_UCS_EN BIT(20)
- #define MTK_GDMA_TO_PDMA 0x0
-+#define MTK_GDMA_TO_PPE 0x4444
- #define MTK_GDMA_DROP_ALL 0x7777
-
- /* Unicast Filter MAC Address Register - Low */
-@@ -321,6 +323,12 @@
- #define RX_DMA_VID(_x) ((_x) & 0xfff)
-
- /* QDMA descriptor rxd4 */
-+#define MTK_RXD4_FOE_ENTRY GENMASK(13, 0)
-+#define MTK_RXD4_PPE_CPU_REASON GENMASK(18, 14)
-+#define MTK_RXD4_SRC_PORT GENMASK(21, 19)
-+#define MTK_RXD4_ALG GENMASK(31, 22)
-+
-+/* QDMA descriptor rxd4 */
- #define RX_DMA_L4_VALID BIT(24)
- #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */
- #define RX_DMA_FPORT_SHIFT 19
-@@ -827,6 +835,7 @@ struct mtk_soc_data {
- u32 caps;
- u32 required_clks;
- bool required_pctl;
-+ u8 offload_version;
- netdev_features_t hw_features;
- };
-
-@@ -938,6 +947,8 @@ struct mtk_eth {
- u32 tx_int_status_reg;
- u32 rx_dma_l4_valid;
- int ip_align;
-+
-+ struct mtk_ppe ppe;
- };
-
- /* struct mtk_mac - the structure that holds the info about the MACs of the
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
-@@ -0,0 +1,497 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
-+
-+#include <linux/kernel.h>
-+#include <linux/jiffies.h>
-+#include <linux/delay.h>
-+#include <linux/io.h>
-+#include <linux/etherdevice.h>
-+#include <linux/platform_device.h>
-+#include "mtk_ppe.h"
-+#include "mtk_ppe_regs.h"
-+
-+static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val)
-+{
-+ writel(val, ppe->base + reg);
-+}
-+
-+static u32 ppe_r32(struct mtk_ppe *ppe, u32 reg)
-+{
-+ return readl(ppe->base + reg);
-+}
-+
-+static u32 ppe_m32(struct mtk_ppe *ppe, u32 reg, u32 mask, u32 set)
-+{
-+ u32 val;
-+
-+ val = ppe_r32(ppe, reg);
-+ val &= ~mask;
-+ val |= set;
-+ ppe_w32(ppe, reg, val);
-+
-+ return val;
-+}
-+
-+static u32 ppe_set(struct mtk_ppe *ppe, u32 reg, u32 val)
-+{
-+ return ppe_m32(ppe, reg, 0, val);
-+}
-+
-+static u32 ppe_clear(struct mtk_ppe *ppe, u32 reg, u32 val)
-+{
-+ return ppe_m32(ppe, reg, val, 0);
-+}
-+
-+static int mtk_ppe_wait_busy(struct mtk_ppe *ppe)
-+{
-+ unsigned long timeout = jiffies + HZ;
-+
-+ while (time_is_after_jiffies(timeout)) {
-+ if (!(ppe_r32(ppe, MTK_PPE_GLO_CFG) & MTK_PPE_GLO_CFG_BUSY))
-+ return 0;
-+
-+ usleep_range(10, 20);
-+ }
-+
-+ dev_err(ppe->dev, "PPE table busy");
-+
-+ return -ETIMEDOUT;
-+}
-+
-+static void mtk_ppe_cache_clear(struct mtk_ppe *ppe)
-+{
-+ ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
-+ ppe_clear(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
-+}
-+
-+static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable)
-+{
-+ mtk_ppe_cache_clear(ppe);
-+
-+ ppe_m32(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_EN,
-+ enable * MTK_PPE_CACHE_CTL_EN);
-+}
-+
-+static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e)
-+{
-+ u32 hv1, hv2, hv3;
-+ u32 hash;
-+
-+ switch (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, e->ib1)) {
-+ case MTK_PPE_PKT_TYPE_BRIDGE:
-+ hv1 = e->bridge.src_mac_lo;
-+ hv1 ^= ((e->bridge.src_mac_hi & 0xffff) << 16);
-+ hv2 = e->bridge.src_mac_hi >> 16;
-+ hv2 ^= e->bridge.dest_mac_lo;
-+ hv3 = e->bridge.dest_mac_hi;
-+ break;
-+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
-+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
-+ hv1 = e->ipv4.orig.ports;
-+ hv2 = e->ipv4.orig.dest_ip;
-+ hv3 = e->ipv4.orig.src_ip;
-+ break;
-+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
-+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
-+ hv1 = e->ipv6.src_ip[3] ^ e->ipv6.dest_ip[3];
-+ hv1 ^= e->ipv6.ports;
-+
-+ hv2 = e->ipv6.src_ip[2] ^ e->ipv6.dest_ip[2];
-+ hv2 ^= e->ipv6.dest_ip[0];
-+
-+ hv3 = e->ipv6.src_ip[1] ^ e->ipv6.dest_ip[1];
-+ hv3 ^= e->ipv6.src_ip[0];
-+ break;
-+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
-+ case MTK_PPE_PKT_TYPE_IPV6_6RD:
-+ default:
-+ WARN_ON_ONCE(1);
-+ return MTK_PPE_HASH_MASK;
-+ }
-+
-+ hash = (hv1 & hv2) | ((~hv1) & hv3);
-+ hash = (hash >> 24) | ((hash & 0xffffff) << 8);
-+ hash ^= hv1 ^ hv2 ^ hv3;
-+ hash ^= hash >> 16;
-+ hash <<= 1;
-+ hash &= MTK_PPE_ENTRIES - 1;
-+
-+ return hash;
-+}
-+
-+static inline struct mtk_foe_mac_info *
-+mtk_foe_entry_l2(struct mtk_foe_entry *entry)
-+{
-+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
-+
-+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
-+ return &entry->ipv6.l2;
-+
-+ return &entry->ipv4.l2;
-+}
-+
-+static inline u32 *
-+mtk_foe_entry_ib2(struct mtk_foe_entry *entry)
-+{
-+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
-+
-+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
-+ return &entry->ipv6.ib2;
-+
-+ return &entry->ipv4.ib2;
-+}
-+
-+int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
-+ u8 pse_port, u8 *src_mac, u8 *dest_mac)
-+{
-+ struct mtk_foe_mac_info *l2;
-+ u32 ports_pad, val;
-+
-+ memset(entry, 0, sizeof(*entry));
-+
-+ val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) |
-+ FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) |
-+ FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) |
-+ MTK_FOE_IB1_BIND_TTL |
-+ MTK_FOE_IB1_BIND_CACHE |
-+ MTK_FOE_IB1_BIND_KEEPALIVE;
-+ entry->ib1 = val;
-+
-+ val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
-+ FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
-+ FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port);
-+
-+ if (is_multicast_ether_addr(dest_mac))
-+ val |= MTK_FOE_IB2_MULTICAST;
-+
-+ ports_pad = 0xa5a5a500 | (l4proto & 0xff);
-+ if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
-+ entry->ipv4.orig.ports = ports_pad;
-+ if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
-+ entry->ipv6.ports = ports_pad;
-+
-+ if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) {
-+ entry->ipv6.ib2 = val;
-+ l2 = &entry->ipv6.l2;
-+ } else {
-+ entry->ipv4.ib2 = val;
-+ l2 = &entry->ipv4.l2;
-+ }
-+
-+ l2->dest_mac_hi = get_unaligned_be32(dest_mac);
-+ l2->dest_mac_lo = get_unaligned_be16(dest_mac + 4);
-+ l2->src_mac_hi = get_unaligned_be32(src_mac);
-+ l2->src_mac_lo = get_unaligned_be16(src_mac + 4);
-+
-+ if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
-+ l2->etype = ETH_P_IPV6;
-+ else
-+ l2->etype = ETH_P_IP;
-+
-+ return 0;
-+}
-+
-+int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool egress,
-+ __be32 src_addr, __be16 src_port,
-+ __be32 dest_addr, __be16 dest_port)
-+{
-+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
-+ struct mtk_ipv4_tuple *t;
-+
-+ switch (type) {
-+ case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
-+ if (egress) {
-+ t = &entry->ipv4.new;
-+ break;
-+ }
-+ fallthrough;
-+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
-+ case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
-+ t = &entry->ipv4.orig;
-+ break;
-+ case MTK_PPE_PKT_TYPE_IPV6_6RD:
-+ entry->ipv6_6rd.tunnel_src_ip = be32_to_cpu(src_addr);
-+ entry->ipv6_6rd.tunnel_dest_ip = be32_to_cpu(dest_addr);
-+ return 0;
-+ default:
-+ WARN_ON_ONCE(1);
-+ return -EINVAL;
-+ }
-+
-+ t->src_ip = be32_to_cpu(src_addr);
-+ t->dest_ip = be32_to_cpu(dest_addr);
-+
-+ if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
-+ return 0;
-+
-+ t->src_port = be16_to_cpu(src_port);
-+ t->dest_port = be16_to_cpu(dest_port);
-+
-+ return 0;
-+}
-+
-+int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
-+ __be32 *src_addr, __be16 src_port,
-+ __be32 *dest_addr, __be16 dest_port)
-+{
-+ int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
-+ u32 *src, *dest;
-+ int i;
-+
-+ switch (type) {
-+ case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
-+ src = entry->dslite.tunnel_src_ip;
-+ dest = entry->dslite.tunnel_dest_ip;
-+ break;
-+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
-+ case MTK_PPE_PKT_TYPE_IPV6_6RD:
-+ entry->ipv6.src_port = be16_to_cpu(src_port);
-+ entry->ipv6.dest_port = be16_to_cpu(dest_port);
-+ fallthrough;
-+ case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
-+ src = entry->ipv6.src_ip;
-+ dest = entry->ipv6.dest_ip;
-+ break;
-+ default:
-+ WARN_ON_ONCE(1);
-+ return -EINVAL;
-+ };
-+
-+ for (i = 0; i < 4; i++)
-+ src[i] = be32_to_cpu(src_addr[i]);
-+ for (i = 0; i < 4; i++)
-+ dest[i] = be32_to_cpu(dest_addr[i]);
-+
-+ return 0;
-+}
-+
-+int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port)
-+{
-+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
-+
-+ l2->etype = BIT(port);
-+
-+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER))
-+ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
-+ else
-+ l2->etype |= BIT(8);
-+
-+ entry->ib1 &= ~MTK_FOE_IB1_BIND_VLAN_TAG;
-+
-+ return 0;
-+}
-+
-+int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid)
-+{
-+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
-+
-+ switch (FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1)) {
-+ case 0:
-+ entry->ib1 |= MTK_FOE_IB1_BIND_VLAN_TAG |
-+ FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
-+ l2->vlan1 = vid;
-+ return 0;
-+ case 1:
-+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) {
-+ l2->vlan1 = vid;
-+ l2->etype |= BIT(8);
-+ } else {
-+ l2->vlan2 = vid;
-+ entry->ib1 += FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
-+ }
-+ return 0;
-+ default:
-+ return -ENOSPC;
-+ }
-+}
-+
-+int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid)
-+{
-+ struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
-+
-+ if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER) ||
-+ (entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG))
-+ l2->etype = ETH_P_PPP_SES;
-+
-+ entry->ib1 |= MTK_FOE_IB1_BIND_PPPOE;
-+ l2->pppoe_id = sid;
-+
-+ return 0;
-+}
-+
-+static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry)
-+{
-+ return !(entry->ib1 & MTK_FOE_IB1_STATIC) &&
-+ FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND;
-+}
-+
-+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
-+ u16 timestamp)
-+{
-+ struct mtk_foe_entry *hwe;
-+ u32 hash;
-+
-+ timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP;
-+ entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP;
-+ entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp);
-+
-+ hash = mtk_ppe_hash_entry(entry);
-+ hwe = &ppe->foe_table[hash];
-+ if (!mtk_foe_entry_usable(hwe)) {
-+ hwe++;
-+ hash++;
-+
-+ if (!mtk_foe_entry_usable(hwe))
-+ return -ENOSPC;
-+ }
-+
-+ memcpy(&hwe->data, &entry->data, sizeof(hwe->data));
-+ wmb();
-+ hwe->ib1 = entry->ib1;
-+
-+ dma_wmb();
-+
-+ mtk_ppe_cache_clear(ppe);
-+
-+ return hash;
-+}
-+
-+int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base,
-+ int version)
-+{
-+ struct mtk_foe_entry *foe;
-+
-+ /* need to allocate a separate device, since it PPE DMA access is
-+ * not coherent.
-+ */
-+ ppe->base = base;
-+ ppe->dev = dev;
-+ ppe->version = version;
-+
-+ foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
-+ &ppe->foe_phys, GFP_KERNEL);
-+ if (!foe)
-+ return -ENOMEM;
-+
-+ ppe->foe_table = foe;
-+
-+ return 0;
-+}
-+
-+static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe)
-+{
-+ static const u8 skip[] = { 12, 25, 38, 51, 76, 89, 102 };
-+ int i, k;
-+
-+ memset(ppe->foe_table, 0, MTK_PPE_ENTRIES * sizeof(ppe->foe_table));
-+
-+ if (!IS_ENABLED(CONFIG_SOC_MT7621))
-+ return;
-+
-+ /* skip all entries that cross the 1024 byte boundary */
-+ for (i = 0; i < MTK_PPE_ENTRIES; i += 128)
-+ for (k = 0; k < ARRAY_SIZE(skip); k++)
-+ ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC;
-+}
-+
-+int mtk_ppe_start(struct mtk_ppe *ppe)
-+{
-+ u32 val;
-+
-+ mtk_ppe_init_foe_table(ppe);
-+ ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys);
-+
-+ val = MTK_PPE_TB_CFG_ENTRY_80B |
-+ MTK_PPE_TB_CFG_AGE_NON_L4 |
-+ MTK_PPE_TB_CFG_AGE_UNBIND |
-+ MTK_PPE_TB_CFG_AGE_TCP |
-+ MTK_PPE_TB_CFG_AGE_UDP |
-+ MTK_PPE_TB_CFG_AGE_TCP_FIN |
-+ FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS,
-+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) |
-+ FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE,
-+ MTK_PPE_KEEPALIVE_DUP_CPU) |
-+ FIELD_PREP(MTK_PPE_TB_CFG_HASH_MODE, 1) |
-+ FIELD_PREP(MTK_PPE_TB_CFG_SCAN_MODE,
-+ MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) |
-+ FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM,
-+ MTK_PPE_ENTRIES_SHIFT);
-+ ppe_w32(ppe, MTK_PPE_TB_CFG, val);
-+
-+ ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK,
-+ MTK_PPE_IP_PROTO_CHK_IPV4 | MTK_PPE_IP_PROTO_CHK_IPV6);
-+
-+ mtk_ppe_cache_enable(ppe, true);
-+
-+ val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG |
-+ MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
-+ MTK_PPE_FLOW_CFG_IP6_3T_ROUTE |
-+ MTK_PPE_FLOW_CFG_IP6_5T_ROUTE |
-+ MTK_PPE_FLOW_CFG_IP6_6RD |
-+ MTK_PPE_FLOW_CFG_IP4_NAT |
-+ MTK_PPE_FLOW_CFG_IP4_NAPT |
-+ MTK_PPE_FLOW_CFG_IP4_DSLITE |
-+ MTK_PPE_FLOW_CFG_L2_BRIDGE |
-+ MTK_PPE_FLOW_CFG_IP4_NAT_FRAG;
-+ ppe_w32(ppe, MTK_PPE_FLOW_CFG, val);
-+
-+ val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) |
-+ FIELD_PREP(MTK_PPE_UNBIND_AGE_DELTA, 3);
-+ ppe_w32(ppe, MTK_PPE_UNBIND_AGE, val);
-+
-+ val = FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_UDP, 12) |
-+ FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_NON_L4, 1);
-+ ppe_w32(ppe, MTK_PPE_BIND_AGE0, val);
-+
-+ val = FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP_FIN, 1) |
-+ FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP, 7);
-+ ppe_w32(ppe, MTK_PPE_BIND_AGE1, val);
-+
-+ val = MTK_PPE_BIND_LIMIT0_QUARTER | MTK_PPE_BIND_LIMIT0_HALF;
-+ ppe_w32(ppe, MTK_PPE_BIND_LIMIT0, val);
-+
-+ val = MTK_PPE_BIND_LIMIT1_FULL |
-+ FIELD_PREP(MTK_PPE_BIND_LIMIT1_NON_L4, 1);
-+ ppe_w32(ppe, MTK_PPE_BIND_LIMIT1, val);
-+
-+ val = FIELD_PREP(MTK_PPE_BIND_RATE_BIND, 30) |
-+ FIELD_PREP(MTK_PPE_BIND_RATE_PREBIND, 1);
-+ ppe_w32(ppe, MTK_PPE_BIND_RATE, val);
-+
-+ /* enable PPE */
-+ val = MTK_PPE_GLO_CFG_EN |
-+ MTK_PPE_GLO_CFG_IP4_L4_CS_DROP |
-+ MTK_PPE_GLO_CFG_IP4_CS_DROP |
-+ MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE;
-+ ppe_w32(ppe, MTK_PPE_GLO_CFG, val);
-+
-+ ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
-+
-+ return 0;
-+}
-+
-+int mtk_ppe_stop(struct mtk_ppe *ppe)
-+{
-+ u32 val;
-+ int i;
-+
-+ for (i = 0; i < MTK_PPE_ENTRIES; i++)
-+ ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE,
-+ MTK_FOE_STATE_INVALID);
-+
-+ mtk_ppe_cache_enable(ppe, false);
-+
-+ /* disable offload engine */
-+ ppe_clear(ppe, MTK_PPE_GLO_CFG, MTK_PPE_GLO_CFG_EN);
-+ ppe_w32(ppe, MTK_PPE_FLOW_CFG, 0);
-+
-+ /* disable aging */
-+ val = MTK_PPE_TB_CFG_AGE_NON_L4 |
-+ MTK_PPE_TB_CFG_AGE_UNBIND |
-+ MTK_PPE_TB_CFG_AGE_TCP |
-+ MTK_PPE_TB_CFG_AGE_UDP |
-+ MTK_PPE_TB_CFG_AGE_TCP_FIN;
-+ ppe_clear(ppe, MTK_PPE_TB_CFG, val);
-+
-+ return mtk_ppe_wait_busy(ppe);
-+}
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -0,0 +1,274 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
-+
-+#ifndef __MTK_PPE_H
-+#define __MTK_PPE_H
-+
-+#include <linux/kernel.h>
-+#include <linux/bitfield.h>
-+
-+#define MTK_ETH_PPE_BASE 0xc00
-+
-+#define MTK_PPE_ENTRIES_SHIFT 3
-+#define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT)
-+#define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1)
-+
-+#define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)
-+#define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)
-+#define MTK_FOE_IB1_UNBIND_PREBIND BIT(24)
-+
-+#define MTK_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0)
-+#define MTK_FOE_IB1_BIND_KEEPALIVE BIT(15)
-+#define MTK_FOE_IB1_BIND_VLAN_LAYER GENMASK(18, 16)
-+#define MTK_FOE_IB1_BIND_PPPOE BIT(19)
-+#define MTK_FOE_IB1_BIND_VLAN_TAG BIT(20)
-+#define MTK_FOE_IB1_BIND_PKT_SAMPLE BIT(21)
-+#define MTK_FOE_IB1_BIND_CACHE BIT(22)
-+#define MTK_FOE_IB1_BIND_TUNNEL_DECAP BIT(23)
-+#define MTK_FOE_IB1_BIND_TTL BIT(24)
-+
-+#define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 25)
-+#define MTK_FOE_IB1_STATE GENMASK(29, 28)
-+#define MTK_FOE_IB1_UDP BIT(30)
-+#define MTK_FOE_IB1_STATIC BIT(31)
-+
-+enum {
-+ MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0,
-+ MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1,
-+ MTK_PPE_PKT_TYPE_BRIDGE = 2,
-+ MTK_PPE_PKT_TYPE_IPV4_DSLITE = 3,
-+ MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
-+ MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
-+ MTK_PPE_PKT_TYPE_IPV6_6RD = 7,
-+};
-+
-+#define MTK_FOE_IB2_QID GENMASK(3, 0)
-+#define MTK_FOE_IB2_PSE_QOS BIT(4)
-+#define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5)
-+#define MTK_FOE_IB2_MULTICAST BIT(8)
-+
-+#define MTK_FOE_IB2_WHNAT_QID2 GENMASK(13, 12)
-+#define MTK_FOE_IB2_WHNAT_DEVIDX BIT(16)
-+#define MTK_FOE_IB2_WHNAT_NAT BIT(17)
-+
-+#define MTK_FOE_IB2_PORT_MG GENMASK(17, 12)
-+
-+#define MTK_FOE_IB2_PORT_AG GENMASK(23, 18)
-+
-+#define MTK_FOE_IB2_DSCP GENMASK(31, 24)
-+
-+#define MTK_FOE_VLAN2_WHNAT_BSS GEMMASK(5, 0)
-+#define MTK_FOE_VLAN2_WHNAT_WCID GENMASK(13, 6)
-+#define MTK_FOE_VLAN2_WHNAT_RING GENMASK(15, 14)
-+
-+enum {
-+ MTK_FOE_STATE_INVALID,
-+ MTK_FOE_STATE_UNBIND,
-+ MTK_FOE_STATE_BIND,
-+ MTK_FOE_STATE_FIN
-+};
-+
-+struct mtk_foe_mac_info {
-+ u16 vlan1;
-+ u16 etype;
-+
-+ u32 dest_mac_hi;
-+
-+ u16 vlan2;
-+ u16 dest_mac_lo;
-+
-+ u32 src_mac_hi;
-+
-+ u16 pppoe_id;
-+ u16 src_mac_lo;
-+};
-+
-+struct mtk_foe_bridge {
-+ u32 dest_mac_hi;
-+
-+ u16 src_mac_lo;
-+ u16 dest_mac_lo;
-+
-+ u32 src_mac_hi;
-+
-+ u32 ib2;
-+
-+ u32 _rsv[5];
-+
-+ u32 udf_tsid;
-+ struct mtk_foe_mac_info l2;
-+};
-+
-+struct mtk_ipv4_tuple {
-+ u32 src_ip;
-+ u32 dest_ip;
-+ union {
-+ struct {
-+ u16 dest_port;
-+ u16 src_port;
-+ };
-+ struct {
-+ u8 protocol;
-+ u8 _pad[3]; /* fill with 0xa5a5a5 */
-+ };
-+ u32 ports;
-+ };
-+};
-+
-+struct mtk_foe_ipv4 {
-+ struct mtk_ipv4_tuple orig;
-+
-+ u32 ib2;
-+
-+ struct mtk_ipv4_tuple new;
-+
-+ u16 timestamp;
-+ u16 _rsv0[3];
-+
-+ u32 udf_tsid;
-+
-+ struct mtk_foe_mac_info l2;
-+};
-+
-+struct mtk_foe_ipv4_dslite {
-+ struct mtk_ipv4_tuple ip4;
-+
-+ u32 tunnel_src_ip[4];
-+ u32 tunnel_dest_ip[4];
-+
-+ u8 flow_label[3];
-+ u8 priority;
-+
-+ u32 udf_tsid;
-+
-+ u32 ib2;
-+
-+ struct mtk_foe_mac_info l2;
-+};
-+
-+struct mtk_foe_ipv6 {
-+ u32 src_ip[4];
-+ u32 dest_ip[4];
-+
-+ union {
-+ struct {
-+ u8 protocol;
-+ u8 _pad[3]; /* fill with 0xa5a5a5 */
-+ }; /* 3-tuple */
-+ struct {
-+ u16 dest_port;
-+ u16 src_port;
-+ }; /* 5-tuple */
-+ u32 ports;
-+ };
-+
-+ u32 _rsv[3];
-+
-+ u32 udf;
-+
-+ u32 ib2;
-+ struct mtk_foe_mac_info l2;
-+};
-+
-+struct mtk_foe_ipv6_6rd {
-+ u32 src_ip[4];
-+ u32 dest_ip[4];
-+ u16 dest_port;
-+ u16 src_port;
-+
-+ u32 tunnel_src_ip;
-+ u32 tunnel_dest_ip;
-+
-+ u16 hdr_csum;
-+ u8 dscp;
-+ u8 ttl;
-+
-+ u8 flag;
-+ u8 pad;
-+ u8 per_flow_6rd_id;
-+ u8 pad2;
-+
-+ u32 ib2;
-+ struct mtk_foe_mac_info l2;
-+};
-+
-+struct mtk_foe_entry {
-+ u32 ib1;
-+
-+ union {
-+ struct mtk_foe_bridge bridge;
-+ struct mtk_foe_ipv4 ipv4;
-+ struct mtk_foe_ipv4_dslite dslite;
-+ struct mtk_foe_ipv6 ipv6;
-+ struct mtk_foe_ipv6_6rd ipv6_6rd;
-+ u32 data[19];
-+ };
-+};
-+
-+enum {
-+ MTK_PPE_CPU_REASON_TTL_EXCEEDED = 0x02,
-+ MTK_PPE_CPU_REASON_OPTION_HEADER = 0x03,
-+ MTK_PPE_CPU_REASON_NO_FLOW = 0x07,
-+ MTK_PPE_CPU_REASON_IPV4_FRAG = 0x08,
-+ MTK_PPE_CPU_REASON_IPV4_DSLITE_FRAG = 0x09,
-+ MTK_PPE_CPU_REASON_IPV4_DSLITE_NO_TCP_UDP = 0x0a,
-+ MTK_PPE_CPU_REASON_IPV6_6RD_NO_TCP_UDP = 0x0b,
-+ MTK_PPE_CPU_REASON_TCP_FIN_SYN_RST = 0x0c,
-+ MTK_PPE_CPU_REASON_UN_HIT = 0x0d,
-+ MTK_PPE_CPU_REASON_HIT_UNBIND = 0x0e,
-+ MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
-+ MTK_PPE_CPU_REASON_HIT_BIND_TCP_FIN = 0x10,
-+ MTK_PPE_CPU_REASON_HIT_TTL_1 = 0x11,
-+ MTK_PPE_CPU_REASON_HIT_BIND_VLAN_VIOLATION = 0x12,
-+ MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR = 0x13,
-+ MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR = 0x14,
-+ MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR = 0x15,
-+ MTK_PPE_CPU_REASON_HIT_BIND_FORCE_CPU = 0x16,
-+ MTK_PPE_CPU_REASON_TUNNEL_OPTION_HEADER = 0x17,
-+ MTK_PPE_CPU_REASON_MULTICAST_TO_CPU = 0x18,
-+ MTK_PPE_CPU_REASON_MULTICAST_TO_GMAC1_CPU = 0x19,
-+ MTK_PPE_CPU_REASON_HIT_PRE_BIND = 0x1a,
-+ MTK_PPE_CPU_REASON_PACKET_SAMPLING = 0x1b,
-+ MTK_PPE_CPU_REASON_EXCEED_MTU = 0x1c,
-+ MTK_PPE_CPU_REASON_PPE_BYPASS = 0x1e,
-+ MTK_PPE_CPU_REASON_INVALID = 0x1f,
-+};
-+
-+struct mtk_ppe {
-+ struct device *dev;
-+ void __iomem *base;
-+ int version;
-+
-+ struct mtk_foe_entry *foe_table;
-+ dma_addr_t foe_phys;
-+
-+ void *acct_table;
-+};
-+
-+int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base,
-+ int version);
-+int mtk_ppe_start(struct mtk_ppe *ppe);
-+int mtk_ppe_stop(struct mtk_ppe *ppe);
-+
-+static inline void
-+mtk_foe_entry_clear(struct mtk_ppe *ppe, u16 hash)
-+{
-+ ppe->foe_table[hash].ib1 = 0;
-+ dma_wmb();
-+}
-+
-+int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
-+ u8 pse_port, u8 *src_mac, u8 *dest_mac);
-+int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool orig,
-+ __be32 src_addr, __be16 src_port,
-+ __be32 dest_addr, __be16 dest_port);
-+int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
-+ __be32 *src_addr, __be16 src_port,
-+ __be32 *dest_addr, __be16 dest_port);
-+int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port);
-+int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
-+int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
-+int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
-+ u16 timestamp);
-+
-+#endif
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
-@@ -0,0 +1,144 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
-+
-+#ifndef __MTK_PPE_REGS_H
-+#define __MTK_PPE_REGS_H
-+
-+#define MTK_PPE_GLO_CFG 0x200
-+#define MTK_PPE_GLO_CFG_EN BIT(0)
-+#define MTK_PPE_GLO_CFG_TSID_EN BIT(1)
-+#define MTK_PPE_GLO_CFG_IP4_L4_CS_DROP BIT(2)
-+#define MTK_PPE_GLO_CFG_IP4_CS_DROP BIT(3)
-+#define MTK_PPE_GLO_CFG_TTL0_DROP BIT(4)
-+#define MTK_PPE_GLO_CFG_PPE_BSWAP BIT(5)
-+#define MTK_PPE_GLO_CFG_PSE_HASH_OFS BIT(6)
-+#define MTK_PPE_GLO_CFG_MCAST_TB_EN BIT(7)
-+#define MTK_PPE_GLO_CFG_FLOW_DROP_KA BIT(8)
-+#define MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE BIT(9)
-+#define MTK_PPE_GLO_CFG_UDP_LITE_EN BIT(10)
-+#define MTK_PPE_GLO_CFG_UDP_LEN_DROP BIT(11)
-+#define MTK_PPE_GLO_CFG_MCAST_ENTRIES GNEMASK(13, 12)
-+#define MTK_PPE_GLO_CFG_BUSY BIT(31)
-+
-+#define MTK_PPE_FLOW_CFG 0x204
-+#define MTK_PPE_FLOW_CFG_IP4_TCP_FRAG BIT(6)
-+#define MTK_PPE_FLOW_CFG_IP4_UDP_FRAG BIT(7)
-+#define MTK_PPE_FLOW_CFG_IP6_3T_ROUTE BIT(8)
-+#define MTK_PPE_FLOW_CFG_IP6_5T_ROUTE BIT(9)
-+#define MTK_PPE_FLOW_CFG_IP6_6RD BIT(10)
-+#define MTK_PPE_FLOW_CFG_IP4_NAT BIT(12)
-+#define MTK_PPE_FLOW_CFG_IP4_NAPT BIT(13)
-+#define MTK_PPE_FLOW_CFG_IP4_DSLITE BIT(14)
-+#define MTK_PPE_FLOW_CFG_L2_BRIDGE BIT(15)
-+#define MTK_PPE_FLOW_CFG_IP_PROTO_BLACKLIST BIT(16)
-+#define MTK_PPE_FLOW_CFG_IP4_NAT_FRAG BIT(17)
-+#define MTK_PPE_FLOW_CFG_IP4_HASH_FLOW_LABEL BIT(18)
-+#define MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY BIT(19)
-+#define MTK_PPE_FLOW_CFG_IP6_HASH_GRE_KEY BIT(20)
-+
-+#define MTK_PPE_IP_PROTO_CHK 0x208
-+#define MTK_PPE_IP_PROTO_CHK_IPV4 GENMASK(15, 0)
-+#define MTK_PPE_IP_PROTO_CHK_IPV6 GENMASK(31, 16)
-+
-+#define MTK_PPE_TB_CFG 0x21c
-+#define MTK_PPE_TB_CFG_ENTRY_NUM GENMASK(2, 0)
-+#define MTK_PPE_TB_CFG_ENTRY_80B BIT(3)
-+#define MTK_PPE_TB_CFG_SEARCH_MISS GENMASK(5, 4)
-+#define MTK_PPE_TB_CFG_AGE_PREBIND BIT(6)
-+#define MTK_PPE_TB_CFG_AGE_NON_L4 BIT(7)
-+#define MTK_PPE_TB_CFG_AGE_UNBIND BIT(8)
-+#define MTK_PPE_TB_CFG_AGE_TCP BIT(9)
-+#define MTK_PPE_TB_CFG_AGE_UDP BIT(10)
-+#define MTK_PPE_TB_CFG_AGE_TCP_FIN BIT(11)
-+#define MTK_PPE_TB_CFG_KEEPALIVE GENMASK(13, 12)
-+#define MTK_PPE_TB_CFG_HASH_MODE GENMASK(15, 14)
-+#define MTK_PPE_TB_CFG_SCAN_MODE GENMASK(17, 16)
-+#define MTK_PPE_TB_CFG_HASH_DEBUG GENMASK(19, 18)
-+
-+enum {
-+ MTK_PPE_SCAN_MODE_DISABLED,
-+ MTK_PPE_SCAN_MODE_CHECK_AGE,
-+ MTK_PPE_SCAN_MODE_KEEPALIVE_AGE,
-+};
-+
-+enum {
-+ MTK_PPE_KEEPALIVE_DISABLE,
-+ MTK_PPE_KEEPALIVE_UNICAST_CPU,
-+ MTK_PPE_KEEPALIVE_DUP_CPU = 3,
-+};
-+
-+enum {
-+ MTK_PPE_SEARCH_MISS_ACTION_DROP,
-+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD = 2,
-+ MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD = 3,
-+};
-+
-+#define MTK_PPE_TB_BASE 0x220
-+
-+#define MTK_PPE_TB_USED 0x224
-+#define MTK_PPE_TB_USED_NUM GENMASK(13, 0)
-+
-+#define MTK_PPE_BIND_RATE 0x228
-+#define MTK_PPE_BIND_RATE_BIND GENMASK(15, 0)
-+#define MTK_PPE_BIND_RATE_PREBIND GENMASK(31, 16)
-+
-+#define MTK_PPE_BIND_LIMIT0 0x22c
-+#define MTK_PPE_BIND_LIMIT0_QUARTER GENMASK(13, 0)
-+#define MTK_PPE_BIND_LIMIT0_HALF GENMASK(29, 16)
-+
-+#define MTK_PPE_BIND_LIMIT1 0x230
-+#define MTK_PPE_BIND_LIMIT1_FULL GENMASK(13, 0)
-+#define MTK_PPE_BIND_LIMIT1_NON_L4 GENMASK(23, 16)
-+
-+#define MTK_PPE_KEEPALIVE 0x234
-+#define MTK_PPE_KEEPALIVE_TIME GENMASK(15, 0)
-+#define MTK_PPE_KEEPALIVE_TIME_TCP GENMASK(23, 16)
-+#define MTK_PPE_KEEPALIVE_TIME_UDP GENMASK(31, 24)
-+
-+#define MTK_PPE_UNBIND_AGE 0x238
-+#define MTK_PPE_UNBIND_AGE_MIN_PACKETS GENMASK(31, 16)
-+#define MTK_PPE_UNBIND_AGE_DELTA GENMASK(7, 0)
-+
-+#define MTK_PPE_BIND_AGE0 0x23c
-+#define MTK_PPE_BIND_AGE0_DELTA_NON_L4 GENMASK(30, 16)
-+#define MTK_PPE_BIND_AGE0_DELTA_UDP GENMASK(14, 0)
-+
-+#define MTK_PPE_BIND_AGE1 0x240
-+#define MTK_PPE_BIND_AGE1_DELTA_TCP_FIN GENMASK(30, 16)
-+#define MTK_PPE_BIND_AGE1_DELTA_TCP GENMASK(14, 0)
-+
-+#define MTK_PPE_HASH_SEED 0x244
-+
-+#define MTK_PPE_DEFAULT_CPU_PORT 0x248
-+#define MTK_PPE_DEFAULT_CPU_PORT_MASK(_n) (GENMASK(2, 0) << ((_n) * 4))
-+
-+#define MTK_PPE_MTU_DROP 0x308
-+
-+#define MTK_PPE_VLAN_MTU0 0x30c
-+#define MTK_PPE_VLAN_MTU0_NONE GENMASK(13, 0)
-+#define MTK_PPE_VLAN_MTU0_1TAG GENMASK(29, 16)
-+
-+#define MTK_PPE_VLAN_MTU1 0x310
-+#define MTK_PPE_VLAN_MTU1_2TAG GENMASK(13, 0)
-+#define MTK_PPE_VLAN_MTU1_3TAG GENMASK(29, 16)
-+
-+#define MTK_PPE_VPM_TPID 0x318
-+
-+#define MTK_PPE_CACHE_CTL 0x320
-+#define MTK_PPE_CACHE_CTL_EN BIT(0)
-+#define MTK_PPE_CACHE_CTL_LOCK_CLR BIT(4)
-+#define MTK_PPE_CACHE_CTL_REQ BIT(8)
-+#define MTK_PPE_CACHE_CTL_CLEAR BIT(9)
-+#define MTK_PPE_CACHE_CTL_CMD GENMASK(13, 12)
-+
-+#define MTK_PPE_MIB_CFG 0x334
-+#define MTK_PPE_MIB_CFG_EN BIT(0)
-+#define MTK_PPE_MIB_CFG_RD_CLR BIT(1)
-+
-+#define MTK_PPE_MIB_TB_BASE 0x338
-+
-+#define MTK_PPE_MIB_CACHE_CTL 0x350
-+#define MTK_PPE_MIB_CACHE_CTL_EN BIT(0)
-+#define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2)
-+
-+#endif
diff --git a/target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch b/target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch
deleted file mode 100644
index de337026d3..0000000000
--- a/target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch
+++ /dev/null
@@ -1,401 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 11 Oct 2020 22:28:32 +0200
-Subject: [PATCH] net: ethernet: mediatek: mtk_eth_soc: add flow offloading
- support
-
-Only supports IPv4 for now
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- create mode 100644 drivers/net/ethernet/mediatek/mtk_offload.c
- create mode 100644 drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
-
---- a/drivers/net/ethernet/mediatek/Makefile
-+++ b/drivers/net/ethernet/mediatek/Makefile
-@@ -4,4 +4,4 @@
- #
-
- obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o
--mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o
-+mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_offload.o
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -20,6 +20,8 @@
- #include <linux/pinctrl/devinfo.h>
- #include <linux/phylink.h>
- #include <linux/jhash.h>
-+#include <linux/netfilter.h>
-+#include <net/netfilter/nf_flow_table.h>
- #include <net/dsa.h>
-
- #include "mtk_eth_soc.h"
-@@ -1348,8 +1350,12 @@ static int mtk_poll_rx(struct napi_struc
- (trxd.rxd2 & RX_DMA_VTAG))
- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
- RX_DMA_VID(trxd.rxd3));
-- skb_record_rx_queue(skb, 0);
-- napi_gro_receive(napi, skb);
-+ if (mtk_offload_check_rx(eth, skb, trxd.rxd4) == 0) {
-+ skb_record_rx_queue(skb, 0);
-+ napi_gro_receive(napi, skb);
-+ } else {
-+ dev_kfree_skb(skb);
-+ }
-
- skip_rx:
- ring->data[idx] = new_data;
-@@ -2879,6 +2885,25 @@ static int mtk_set_rxnfc(struct net_devi
- return ret;
- }
-
-+static int
-+mtk_flow_offload(enum flow_offload_type type, struct flow_offload *flow,
-+ struct flow_offload_hw_path *src,
-+ struct flow_offload_hw_path *dest)
-+{
-+ struct mtk_mac *mac = netdev_priv(src->dev);
-+ struct mtk_eth *eth = mac->hw;
-+
-+ if (!eth->soc->offload_version)
-+ return -EINVAL;
-+
-+ if (src->dev->base_addr != dest->dev->base_addr)
-+ return -EINVAL;
-+
-+ mac = netdev_priv(src->dev);
-+
-+ return mtk_flow_offload_add(eth, type, flow, src, dest);
-+}
-+
- static const struct ethtool_ops mtk_ethtool_ops = {
- .get_link_ksettings = mtk_get_link_ksettings,
- .set_link_ksettings = mtk_set_link_ksettings,
-@@ -2910,6 +2935,7 @@ static const struct net_device_ops mtk_n
- #ifdef CONFIG_NET_POLL_CONTROLLER
- .ndo_poll_controller = mtk_poll_controller,
- #endif
-+ .ndo_flow_offload = mtk_flow_offload,
- };
-
- static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
-@@ -3175,6 +3201,10 @@ static int mtk_probe(struct platform_dev
- eth->base + MTK_ETH_PPE_BASE, 2);
- if (err)
- goto err_free_dev;
-+
-+ err = mtk_flow_offload_init(eth);
-+ if (err)
-+ goto err_free_dev;
- }
-
- for (i = 0; i < MTK_MAX_DEVS; i++) {
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -949,6 +949,7 @@ struct mtk_eth {
- int ip_align;
-
- struct mtk_ppe ppe;
-+ struct flow_offload __rcu **foe_flow_table;
- };
-
- /* struct mtk_mac - the structure that holds the info about the MACs of the
-@@ -993,4 +994,12 @@ int mtk_gmac_sgmii_path_setup(struct mtk
- int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id);
- int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id);
-
-+int mtk_flow_offload_init(struct mtk_eth *eth);
-+int mtk_flow_offload_add(struct mtk_eth *eth,
-+ enum flow_offload_type type,
-+ struct flow_offload *flow,
-+ struct flow_offload_hw_path *src,
-+ struct flow_offload_hw_path *dest);
-+int mtk_offload_check_rx(struct mtk_eth *eth, struct sk_buff *skb, u32 rxd4);
-+
- #endif /* MTK_ETH_H */
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_offload.c
-@@ -0,0 +1,146 @@
-+/* This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; version 2 of the License
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Copyright (C) 2018 John Crispin <john@phrozen.org>
-+ */
-+
-+#include <net/netfilter/nf_flow_table.h>
-+#include "mtk_eth_soc.h"
-+
-+static int
-+mtk_offload_prepare_v4(struct mtk_eth *eth, struct mtk_foe_entry *entry,
-+ struct flow_offload_tuple *s_tuple,
-+ struct flow_offload_tuple *d_tuple,
-+ struct flow_offload_hw_path *src,
-+ struct flow_offload_hw_path *dest)
-+{
-+ int dest_port = 1;
-+
-+ if (dest->dev == eth->netdev[1])
-+ dest_port = 2;
-+
-+ mtk_foe_entry_prepare(entry, MTK_PPE_PKT_TYPE_IPV4_HNAPT, s_tuple->l4proto,
-+ dest_port, dest->eth_src, dest->eth_dest);
-+ mtk_foe_entry_set_ipv4_tuple(entry, false,
-+ s_tuple->src_v4.s_addr, s_tuple->src_port,
-+ s_tuple->dst_v4.s_addr, s_tuple->dst_port);
-+ mtk_foe_entry_set_ipv4_tuple(entry, true,
-+ d_tuple->dst_v4.s_addr, d_tuple->dst_port,
-+ d_tuple->src_v4.s_addr, d_tuple->src_port);
-+
-+ if (dest->flags & FLOW_OFFLOAD_PATH_PPPOE)
-+ mtk_foe_entry_set_pppoe(entry, dest->pppoe_sid);
-+
-+ if (dest->flags & FLOW_OFFLOAD_PATH_VLAN)
-+ mtk_foe_entry_set_vlan(entry, dest->vlan_id);
-+
-+ if (dest->flags & FLOW_OFFLOAD_PATH_DSA)
-+ mtk_foe_entry_set_dsa(entry, dest->dsa_port);
-+
-+ return 0;
-+}
-+
-+int mtk_flow_offload_add(struct mtk_eth *eth,
-+ enum flow_offload_type type,
-+ struct flow_offload *flow,
-+ struct flow_offload_hw_path *src,
-+ struct flow_offload_hw_path *dest)
-+{
-+ struct flow_offload_tuple *otuple = &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple;
-+ struct flow_offload_tuple *rtuple = &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple;
-+ struct mtk_foe_entry orig, reply;
-+ u32 ohash, rhash, timestamp;
-+
-+ if (otuple->l4proto != IPPROTO_TCP && otuple->l4proto != IPPROTO_UDP)
-+ return -EINVAL;
-+
-+ if (type == FLOW_OFFLOAD_DEL) {
-+ ohash = (unsigned long)flow->priv;
-+ rhash = ohash >> 16;
-+ ohash &= 0xffff;
-+ mtk_foe_entry_clear(&eth->ppe, ohash);
-+ mtk_foe_entry_clear(&eth->ppe, rhash);
-+ rcu_assign_pointer(eth->foe_flow_table[ohash], NULL);
-+ rcu_assign_pointer(eth->foe_flow_table[rhash], NULL);
-+ synchronize_rcu();
-+
-+ return 0;
-+ }
-+
-+ switch (otuple->l3proto) {
-+ case AF_INET:
-+ if (mtk_offload_prepare_v4(eth, &orig, otuple, rtuple, src, dest) ||
-+ mtk_offload_prepare_v4(eth, &reply, rtuple, otuple, dest, src))
-+ return -EINVAL;
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ timestamp = mtk_r32(eth, 0x0010);
-+
-+ ohash = mtk_foe_entry_commit(&eth->ppe, &orig, timestamp);
-+ if (ohash < 0)
-+ return -EINVAL;
-+
-+ rhash = mtk_foe_entry_commit(&eth->ppe, &reply, timestamp);
-+ if (rhash < 0) {
-+ mtk_foe_entry_clear(&eth->ppe, ohash);
-+ return -EINVAL;
-+ }
-+
-+ rcu_assign_pointer(eth->foe_flow_table[ohash], flow);
-+ rcu_assign_pointer(eth->foe_flow_table[rhash], flow);
-+
-+ ohash |= rhash << 16;
-+ flow->priv = (void *)(unsigned long)ohash;
-+
-+ return 0;
-+}
-+
-+static void mtk_offload_keepalive(struct mtk_eth *eth, unsigned int hash)
-+{
-+ struct flow_offload *flow;
-+
-+ rcu_read_lock();
-+ flow = rcu_dereference(eth->foe_flow_table[hash]);
-+ if (flow)
-+ flow->timeout = jiffies + 30 * HZ;
-+ rcu_read_unlock();
-+}
-+
-+int mtk_offload_check_rx(struct mtk_eth *eth, struct sk_buff *skb, u32 rxd4)
-+{
-+ unsigned int hash;
-+
-+ switch (FIELD_GET(MTK_RXD4_PPE_CPU_REASON, rxd4)) {
-+ case MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR:
-+ case MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR:
-+ case MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR:
-+ hash = FIELD_GET(MTK_RXD4_FOE_ENTRY, rxd4);
-+ mtk_offload_keepalive(eth, hash);
-+ return -1;
-+ case MTK_PPE_CPU_REASON_PACKET_SAMPLING:
-+ return -1;
-+ default:
-+ return 0;
-+ }
-+}
-+
-+int mtk_flow_offload_init(struct mtk_eth *eth)
-+{
-+ eth->foe_flow_table = devm_kcalloc(eth->dev, MTK_PPE_ENTRIES,
-+ sizeof(*eth->foe_flow_table),
-+ GFP_KERNEL);
-+
-+ if (!eth->foe_flow_table)
-+ return -ENOMEM;
-+
-+ return 0;
-+}
---- a/drivers/net/ethernet/mediatek/mtk_ppe.c
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
-@@ -375,6 +375,8 @@ int mtk_ppe_init(struct mtk_ppe *ppe, st
-
- ppe->foe_table = foe;
-
-+ mtk_ppe_debugfs_init(ppe);
-+
- return 0;
- }
-
---- a/drivers/net/ethernet/mediatek/mtk_ppe.h
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
-@@ -271,4 +271,7 @@ int mtk_foe_entry_set_pppoe(struct mtk_f
- int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
- u16 timestamp);
-
-+/* internal */
-+int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
-+
- #endif
---- /dev/null
-+++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
-@@ -0,0 +1,114 @@
-+/* This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; version 2 of the License
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * Copyright (C) 2014-2016 Sean Wang <sean.wang@mediatek.com>
-+ * Copyright (C) 2016-2017 John Crispin <blogic@openwrt.org>
-+ * Copyright (C) 2020 Felix Fietkau <nbd@nbd.name>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/debugfs.h>
-+#include "mtk_eth_soc.h"
-+
-+static const char *mtk_foe_entry_state_str[] = {
-+ "INVALID",
-+ "UNBIND",
-+ "BIND",
-+ "FIN"
-+};
-+
-+static const char *mtk_foe_packet_type_str[] = {
-+ "IPV4_HNAPT",
-+ "IPV4_HNAT",
-+ "IPV6_1T_ROUTE",
-+ "IPV4_DSLITE",
-+ "IPV6_3T_ROUTE",
-+ "IPV6_5T_ROUTE",
-+ "IPV6_6RD",
-+};
-+
-+#define es(entry) (mtk_foe_entry_state_str[FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1)])
-+//#define ei(entry, end) (MTK_PPE_TBL_SZ - (int)(end - entry))
-+#define pt(entry) (mtk_foe_packet_type_str[FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1)])
-+
-+static int mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private)
-+{
-+ struct mtk_ppe *ppe = m->private;
-+ int i, count;
-+
-+ for (i = 0, count = 0; i < MTK_PPE_ENTRIES; i++) {
-+ struct mtk_foe_entry *entry = &ppe->foe_table[i];
-+
-+ if (!FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1))
-+ continue;
-+
-+ if (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1) ==
-+ MTK_PPE_PKT_TYPE_IPV4_HNAPT) {
-+ struct mtk_foe_ipv4 *ip4 = &entry->ipv4;
-+ struct mtk_foe_mac_info *l2 = &ip4->l2;
-+
-+ __be32 saddr = htonl(ip4->orig.src_ip);
-+ __be32 daddr = htonl(ip4->orig.dest_ip);
-+ __be32 nsaddr = htonl(ip4->new.src_ip);
-+ __be32 ndaddr = htonl(ip4->new.dest_ip);
-+ unsigned char h_dest[ETH_ALEN];
-+ unsigned char h_source[ETH_ALEN];
-+
-+ *((__be32 *) h_source) = htonl(l2->src_mac_hi);
-+ *((__be16*) &h_source[4]) = htons(l2->src_mac_lo);
-+ *((__be32*) h_dest) = htonl(l2->dest_mac_hi);
-+ *((__be16*) &h_dest[4]) = htons(l2->dest_mac_lo);
-+ seq_printf(m,
-+ "(%x)0x%05x|state=%s|type=%s|"
-+ "%pI4:%d->%pI4:%d=>%pI4:%d->%pI4:%d|%pM=>%pM|"
-+ "etype=0x%04x|info1=0x%x|info2=0x%x|"
-+ "vlan1=%d|vlan2=%d\n",
-+ count, i, es(entry), pt(entry),
-+ &saddr, ip4->orig.src_port,
-+ &daddr, ip4->orig.dest_port,
-+ &nsaddr, ip4->new.src_port,
-+ &ndaddr, ip4->new.dest_port,
-+ h_source, h_dest,
-+ ntohs(l2->etype),
-+ entry->ib1,
-+ ip4->ib2,
-+ l2->vlan1,
-+ l2->vlan2);
-+ count++;
-+ } else
-+ seq_printf(m, "0x%05x state=%s\n", count, es(entry));
-+ }
-+
-+ return 0;
-+}
-+
-+static int mtk_ppe_debugfs_foe_open(struct inode *inode, struct file *file)
-+{
-+ return single_open(file, mtk_ppe_debugfs_foe_show, inode->i_private);
-+}
-+
-+static const struct file_operations mtk_ppe_debugfs_foe_fops = {
-+ .open = mtk_ppe_debugfs_foe_open,
-+ .read = seq_read,
-+ .llseek = seq_lseek,
-+ .release = single_release,
-+};
-+
-+int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
-+{
-+ struct dentry *root;
-+
-+ root = debugfs_create_dir("mtk_ppe", NULL);
-+ if (!root)
-+ return -ENOMEM;
-+
-+ debugfs_create_file("entries", S_IRUGO, root, ppe, &mtk_ppe_debugfs_foe_fops);
-+
-+ return 0;
-+}
diff --git a/target/linux/generic/pending-5.4/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch b/target/linux/generic/pending-5.4/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch
deleted file mode 100644
index fcf7892c04..0000000000
--- a/target/linux/generic/pending-5.4/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From patchwork Thu Aug 5 22:23:30 2021
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
-X-Patchwork-Id: 12422209
-Date: Thu, 5 Aug 2021 23:23:30 +0100
-From: Daniel Golle <daniel@makrotopia.org>
-To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
- linux-kernel@vger.kernel.org
-Cc: "David S. Miller" <davem@davemloft.net>, Andrew Lunn <andrew@lunn.ch>,
- Michael Walle <michael@walle.cc>
-Subject: [PATCH] ARM: kirkwood: add missing <linux/if_ether.h> for ETH_ALEN
-Message-ID: <YQxk4jrbm31NM1US@makrotopia.org>
-MIME-Version: 1.0
-Content-Disposition: inline
-X-BeenThere: linux-arm-kernel@lists.infradead.org
-X-Mailman-Version: 2.1.34
-Precedence: list
-List-Id: <linux-arm-kernel.lists.infradead.org>
-List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
-Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
-
-After commit 83216e3988cd1 ("of: net: pass the dst buffer to
-of_get_mac_address()") build fails for kirkwood as ETH_ALEN is not
-defined.
-
-arch/arm/mach-mvebu/kirkwood.c: In function 'kirkwood_dt_eth_fixup':
-arch/arm/mach-mvebu/kirkwood.c:87:13: error: 'ETH_ALEN' undeclared (first use in this function); did you mean 'ESTALE'?
- u8 tmpmac[ETH_ALEN];
- ^~~~~~~~
- ESTALE
-arch/arm/mach-mvebu/kirkwood.c:87:13: note: each undeclared identifier is reported only once for each function it appears in
-arch/arm/mach-mvebu/kirkwood.c:87:6: warning: unused variable 'tmpmac' [-Wunused-variable]
- u8 tmpmac[ETH_ALEN];
- ^~~~~~
-make[5]: *** [scripts/Makefile.build:262: arch/arm/mach-mvebu/kirkwood.o] Error 1
-make[5]: *** Waiting for unfinished jobs....
-
-Add missing #include <linux/if_ether.h> to fix this.
-
-Cc: David S. Miller <davem@davemloft.net>
-Cc: Andrew Lunn <andrew@lunn.ch>
-Cc: Michael Walle <michael@walle.cc>
-Reported-by: https://buildbot.openwrt.org/master/images/#/builders/56/builds/220/steps/44/logs/stdio
-Fixes: 83216e3988cd1 ("of: net: pass the dst buffer to of_get_mac_address()")
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- arch/arm/mach-mvebu/kirkwood.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/mach-mvebu/kirkwood.c
-+++ b/arch/arm/mach-mvebu/kirkwood.c
-@@ -14,6 +14,7 @@
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/mbus.h>
-+#include <linux/if_ether.h>
- #include <linux/of.h>
- #include <linux/of_address.h>
- #include <linux/of_net.h>
diff --git a/target/linux/generic/pending-5.4/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-5.4/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch
deleted file mode 100644
index 511a9f7555..0000000000
--- a/target/linux/generic/pending-5.4/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the
- subdevices
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-For bus devices to be fully usable it's required to set their DMA
-parameters.
-
-For years it has been missing and remained unnoticed because of
-mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask.
-Kernel 4.19 came with a lot of DMA changes and caused a regression on
-the bcm47xx. Starting with the commit f8c55dc6e828 ("MIPS: use generic
-dma noncoherent ops for simple noncoherent platforms") DMA coherent
-allocations just fail. Example:
-[ 1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed
-[ 1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA
-[ 1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12
-[ 1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded
-
-This change fixes above regression in addition to the MIPS bcm47xx
-commit 321c46b91550 ("MIPS: BCM47XX: Setup struct device for the SoC").
-
-It also fixes another *old* GPIO regression caused by a parent pointing
-to the NULL:
-[ 0.157054] missing gpiochip .dev parent pointer
-[ 0.157287] bcma: bus0: Error registering GPIO driver: -22
-introduced by the commit 74f4e0cc6108 ("bcma: switch GPIO portions to
-use GPIOLIB_IRQCHIP").
-
-Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms")
-Fixes: 74f4e0cc6108 ("bcma: switch GPIO portions to use GPIOLIB_IRQCHIP")
-Cc: linux-mips@linux-mips.org
-Cc: Christoph Hellwig <hch@lst.de>
-Cc: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
----
-
---- a/drivers/bcma/host_soc.c
-+++ b/drivers/bcma/host_soc.c
-@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm
- struct bcma_bus *bus = &soc->bus;
- int err;
-
-+ bus->dev = soc->dev;
-+
- /* Scan bus and initialize it */
- err = bcma_bus_early_register(bus);
- if (err)
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -241,8 +241,10 @@ void bcma_prepare_core(struct bcma_bus *
- core->dev.bus = &bcma_bus_type;
- dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
- core->dev.parent = bus->dev;
-- if (bus->dev)
-+ if (bus->dev) {
- bcma_of_fill_device(bus->dev, core);
-+ dma_coerce_mask_and_coherent(&core->dev, bus->dev->coherent_dma_mask);
-+ }
-
- switch (bus->hosttype) {
- case BCMA_HOSTTYPE_PCI:
diff --git a/target/linux/generic/pending-5.4/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-5.4/810-pci_disable_common_quirks.patch
deleted file mode 100644
index 5aea055b72..0000000000
--- a/target/linux/generic/pending-5.4/810-pci_disable_common_quirks.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From: Gabor Juhos <juhosg@openwrt.org>
-Subject: debloat: add kernel config option to disabling common PCI quirks
-
-Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
----
- drivers/pci/Kconfig | 6 ++++++
- drivers/pci/quirks.c | 6 ++++++
- 2 files changed, 12 insertions(+)
-
---- a/drivers/pci/Kconfig
-+++ b/drivers/pci/Kconfig
-@@ -115,6 +115,13 @@ config XEN_PCIDEV_FRONTEND
- The PCI device frontend driver allows the kernel to import arbitrary
- PCI devices from a PCI backend to support PCI driver domains.
-
-+config PCI_DISABLE_COMMON_QUIRKS
-+ bool "PCI disable common quirks"
-+ depends on PCI
-+ help
-+ If you don't know what to do here, say N.
-+
-+
- config PCI_ATS
- bool
-
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -206,6 +206,7 @@ static void quirk_mmio_always_on(struct
- DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /*
- * The Mellanox Tavor device gives false positive parity errors. Mark this
- * device with a broken_parity_status to allow PCI scanning code to "skip"
-@@ -3323,6 +3324,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
-
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-+
- /*
- * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.
- * To work around this, query the size it should be configured to by the
-@@ -3348,6 +3351,8 @@ static void quirk_intel_ntb(struct pci_d
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb);
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
-+
- /*
- * Some BIOS implementations leave the Intel GPU interrupts enabled, even
- * though no one is handling them (e.g., if the i915 driver is never
-@@ -3386,6 +3391,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
- DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
- DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
-
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-+
- /*
- * PCI devices which are on Intel chips can skip the 10ms delay
- * before entering D3 mode.
diff --git a/target/linux/generic/pending-5.4/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-5.4/811-pci_disable_usb_common_quirks.patch
deleted file mode 100644
index 6e4584c8a1..0000000000
--- a/target/linux/generic/pending-5.4/811-pci_disable_usb_common_quirks.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: debloat: disable common USB quirks
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++
- drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++-
- include/linux/usb/hcd.h | 7 +++++++
- 3 files changed, 40 insertions(+), 1 deletion(-)
-
---- a/drivers/usb/host/pci-quirks.c
-+++ b/drivers/usb/host/pci-quirks.c
-@@ -125,6 +125,8 @@ struct amd_chipset_type {
- u8 rev;
- };
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
-+
- static struct amd_chipset_info {
- struct pci_dev *nb_dev;
- struct pci_dev *smbus_dev;
-@@ -630,6 +632,10 @@ bool usb_amd_pt_check_port(struct device
- }
- EXPORT_SYMBOL_GPL(usb_amd_pt_check_port);
-
-+#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-+
-+#if IS_ENABLED(CONFIG_USB_UHCI_HCD)
-+
- /*
- * Make sure the controller is completely inactive, unable to
- * generate interrupts or do DMA.
-@@ -709,8 +715,17 @@ reset_needed:
- uhci_reset_hc(pdev, base);
- return 1;
- }
-+#else
-+int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base)
-+{
-+ return 0;
-+}
-+
-+#endif
- EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
-+
- static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask)
- {
- u16 cmd;
-@@ -1271,3 +1286,4 @@ static void quirk_usb_early_handoff(stru
- }
- DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
- PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff);
-+#endif
---- a/drivers/usb/host/pci-quirks.h
-+++ b/drivers/usb/host/pci-quirks.h
-@@ -5,6 +5,9 @@
- #ifdef CONFIG_USB_PCI
- void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
- int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
-+#endif /* CONFIG_USB_PCI */
-+
-+#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS)
- int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
- bool usb_amd_hang_symptom_quirk(void);
- bool usb_amd_prefetch_quirk(void);
-@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev,
- bool usb_amd_pt_check_port(struct device *device, int port);
- #else
- struct pci_dev;
-+static inline int usb_amd_quirk_pll_check(void)
-+{
-+ return 0;
-+}
-+static inline bool usb_amd_hang_symptom_quirk(void)
-+{
-+ return false;
-+}
-+static inline bool usb_amd_prefetch_quirk(void)
-+{
-+ return false;
-+}
- static inline void usb_amd_quirk_pll_disable(void) {}
- static inline void usb_amd_quirk_pll_enable(void) {}
- static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
-@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port
- {
- return false;
- }
-+static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {}
-+static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev)
-+{
-+ return false;
-+}
- #endif /* CONFIG_USB_PCI */
-
- #endif /* __LINUX_USB_PCI_QUIRKS_H */
---- a/include/linux/usb/hcd.h
-+++ b/include/linux/usb/hcd.h
-@@ -483,7 +483,14 @@ extern int usb_hcd_pci_probe(struct pci_
- extern void usb_hcd_pci_remove(struct pci_dev *dev);
- extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
-
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev);
-+#else
-+static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev)
-+{
-+ return 0;
-+}
-+#endif
-
- #ifdef CONFIG_PM
- extern const struct dev_pm_ops usb_hcd_pci_pm_ops;
diff --git a/target/linux/generic/pending-5.4/820-libata-Assign-OF-node-to-the-SCSI-device.patch b/target/linux/generic/pending-5.4/820-libata-Assign-OF-node-to-the-SCSI-device.patch
deleted file mode 100644
index c4cbaaa777..0000000000
--- a/target/linux/generic/pending-5.4/820-libata-Assign-OF-node-to-the-SCSI-device.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From 43a93893eb33e996836b99fb3e1f7300c0132a51 Mon Sep 17 00:00:00 2001
-From: Linus Walleij <linus.walleij@linaro.org>
-Date: Tue, 31 Dec 2019 18:15:33 +0100
-Subject: [PATCH 5/7] libata: Assign OF node to the SCSI device
-
-When we spawn a SCSI device from an ATA device in libata-scsi
-the SCSI device had no relation to the device tree.
-
-The DT binding allows us to define port nodes under a
-PATA (IDE) or SATA host controller, so we can have proper device
-nodes for these devices.
-
-If OF is enabled, walk the children of the host controller node
-to see if there is a valid device tree node to assign. The reg
-is used to match to ID 0 for the master device and ID 1 for the
-slave device.
-
-The corresponding device tree bindings have been accepted by
-the device tree maintainers.
-
-Cc: Chris Healy <cphealy@gmail.com>
-Cc: Martin K. Petersen <martin.petersen@oracle.com>
-Cc: Bart Van Assche <bvanassche@acm.org>
-Cc: Guenter Roeck <linux@roeck-us.net>
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
----
-ChangeLog v1->v2:
-- Use dev_dbg() for the debug print
-- return immediately after finding a matching OF node
----
- drivers/ata/libata-scsi.c | 30 ++++++++++++++++++++++++++++++
- 1 file changed, 30 insertions(+)
-
---- a/drivers/ata/libata-scsi.c
-+++ b/drivers/ata/libata-scsi.c
-@@ -35,6 +35,7 @@
- #include <linux/suspend.h>
- #include <asm/unaligned.h>
- #include <linux/ioprio.h>
-+#include <linux/of.h>
-
- #include "libata.h"
- #include "libata-transport.h"
-@@ -4590,6 +4591,34 @@ int ata_scsi_add_hosts(struct ata_host *
- return rc;
- }
-
-+#ifdef CONFIG_OF
-+static void ata_scsi_assign_ofnode(struct ata_device *dev, struct ata_port *ap)
-+{
-+ struct scsi_device *sdev = dev->sdev;
-+ struct device *d = ap->host->dev;
-+ struct device_node *np = d->of_node;
-+ struct device_node *child;
-+
-+ for_each_available_child_of_node(np, child) {
-+ int ret;
-+ u32 val;
-+
-+ ret = of_property_read_u32(child, "reg", &val);
-+ if (ret)
-+ continue;
-+ if (val == dev->devno) {
-+ dev_dbg(d, "found matching device node\n");
-+ sdev->sdev_gendev.of_node = child;
-+ return;
-+ }
-+ }
-+}
-+#else
-+static void ata_scsi_assign_ofnode(struct ata_device *dev, struct ata_port *ap)
-+{
-+}
-+#endif
-+
- void ata_scsi_scan_host(struct ata_port *ap, int sync)
- {
- int tries = 5;
-@@ -4615,6 +4644,7 @@ void ata_scsi_scan_host(struct ata_port
- NULL);
- if (!IS_ERR(sdev)) {
- dev->sdev = sdev;
-+ ata_scsi_assign_ofnode(dev, ap);
- scsi_device_put(sdev);
- } else {
- dev->sdev = NULL;
diff --git a/target/linux/generic/pending-5.4/834-ledtrig-libata.patch b/target/linux/generic/pending-5.4/834-ledtrig-libata.patch
deleted file mode 100644
index 2c876ae55e..0000000000
--- a/target/linux/generic/pending-5.4/834-ledtrig-libata.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From: Daniel Golle <daniel@makrotopia.org>
-Subject: libata: add ledtrig support
-
-This adds a LED trigger for each ATA port indicating disk activity.
-
-As this is needed only on specific platforms (NAS SoCs and such),
-these platforms should define ARCH_WANTS_LIBATA_LEDS if there
-are boards with LED(s) intended to indicate ATA disk activity and
-need the OS to take care of that.
-In that way, if not selected, LED trigger support not will be
-included in libata-core and both, codepaths and structures remain
-untouched.
-
-Signed-off-by: Daniel Golle <daniel@makrotopia.org>
----
- drivers/ata/Kconfig | 16 ++++++++++++++++
- drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++
- include/linux/libata.h | 9 +++++++++
- 3 files changed, 66 insertions(+)
-
---- a/drivers/ata/Kconfig
-+++ b/drivers/ata/Kconfig
-@@ -45,6 +45,22 @@ config ATA_VERBOSE_ERROR
-
- If unsure, say Y.
-
-+config ARCH_WANT_LIBATA_LEDS
-+ bool
-+
-+config ATA_LEDS
-+ bool "support ATA port LED triggers"
-+ depends on ARCH_WANT_LIBATA_LEDS
-+ select NEW_LEDS
-+ select LEDS_CLASS
-+ select LEDS_TRIGGERS
-+ default y
-+ help
-+ This option adds a LED trigger for each registered ATA port.
-+ It is used to drive disk activity leds connected via GPIO.
-+
-+ If unsure, say N.
-+
- config ATA_ACPI
- bool "ATA ACPI Support"
- depends on ACPI
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -714,6 +714,19 @@ u64 ata_tf_read_block(const struct ata_t
- return block;
- }
-
-+#ifdef CONFIG_ATA_LEDS
-+#define LIBATA_BLINK_DELAY 20 /* ms */
-+static inline void ata_led_act(struct ata_port *ap)
-+{
-+ unsigned long led_delay = LIBATA_BLINK_DELAY;
-+
-+ if (unlikely(!ap->ledtrig))
-+ return;
-+
-+ led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0);
-+}
-+#endif
-+
- /**
- * ata_build_rw_tf - Build ATA taskfile for given read/write request
- * @tf: Target ATA taskfile
-@@ -5151,6 +5164,9 @@ struct ata_queued_cmd *ata_qc_new_init(s
- if (tag < 0)
- return NULL;
- }
-+#ifdef CONFIG_ATA_LEDS
-+ ata_led_act(ap);
-+#endif
-
- qc = __ata_qc_from_tag(ap, tag);
- qc->tag = qc->hw_tag = tag;
-@@ -6087,6 +6103,9 @@ struct ata_port *ata_port_alloc(struct a
- ap->stats.unhandled_irq = 1;
- ap->stats.idle_irq = 1;
- #endif
-+#ifdef CONFIG_ATA_LEDS
-+ ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
-+#endif
- ata_sff_port_init(ap);
-
- return ap;
-@@ -6122,6 +6141,12 @@ static void ata_host_release(struct kref
-
- kfree(ap->pmp_link);
- kfree(ap->slave_link);
-+#ifdef CONFIG_ATA_LEDS
-+ if (ap->ledtrig) {
-+ led_trigger_unregister(ap->ledtrig);
-+ kfree(ap->ledtrig);
-+ };
-+#endif
- kfree(ap);
- host->ports[i] = NULL;
- }
-@@ -6585,7 +6610,23 @@ int ata_host_register(struct ata_host *h
- host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
- host->ports[i]->local_port_no = i + 1;
- }
-+#ifdef CONFIG_ATA_LEDS
-+ for (i = 0; i < host->n_ports; i++) {
-+ if (unlikely(!host->ports[i]->ledtrig))
-+ continue;
-
-+ snprintf(host->ports[i]->ledtrig_name,
-+ sizeof(host->ports[i]->ledtrig_name), "ata%u",
-+ host->ports[i]->print_id);
-+
-+ host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name;
-+
-+ if (led_trigger_register(host->ports[i]->ledtrig)) {
-+ kfree(host->ports[i]->ledtrig);
-+ host->ports[i]->ledtrig = NULL;
-+ }
-+ }
-+#endif
- /* Create associated sysfs transport objects */
- for (i = 0; i < host->n_ports; i++) {
- rc = ata_tport_add(host->dev,host->ports[i]);
---- a/include/linux/libata.h
-+++ b/include/linux/libata.h
-@@ -23,6 +23,9 @@
- #include <linux/cdrom.h>
- #include <linux/sched.h>
- #include <linux/async.h>
-+#ifdef CONFIG_ATA_LEDS
-+#include <linux/leds.h>
-+#endif
-
- /*
- * Define if arch has non-standard setup. This is a _PCI_ standard
-@@ -882,6 +885,12 @@ struct ata_port {
- #ifdef CONFIG_ATA_ACPI
- struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
- #endif
-+
-+#ifdef CONFIG_ATA_LEDS
-+ struct led_trigger *ledtrig;
-+ char ledtrig_name[8];
-+#endif
-+
- /* owned by EH */
- u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
- };
diff --git a/target/linux/generic/pending-5.4/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-5.4/840-hwrng-bcm2835-set-quality-to-1000.patch
deleted file mode 100644
index 247c6d8364..0000000000
--- a/target/linux/generic/pending-5.4/840-hwrng-bcm2835-set-quality-to-1000.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
-Date: Sat, 20 Feb 2021 18:36:38 +0100
-Subject: [PATCH] hwrng: bcm2835: set quality to 1000
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This allows devices without a high precission timer to reduce boot from >100s
-to <30s.
-
-Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
----
- drivers/char/hw_random/bcm2835-rng.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/char/hw_random/bcm2835-rng.c
-+++ b/drivers/char/hw_random/bcm2835-rng.c
-@@ -167,6 +167,7 @@ static int bcm2835_rng_probe(struct plat
- priv->rng.init = bcm2835_rng_init;
- priv->rng.read = bcm2835_rng_read;
- priv->rng.cleanup = bcm2835_rng_cleanup;
-+ priv->rng.quality = 1000;
-
- if (dev_of_node(dev)) {
- rng_id = of_match_node(bcm2835_rng_of_match, np);
diff --git a/target/linux/generic/pending-5.4/920-mangle_bootargs.patch b/target/linux/generic/pending-5.4/920-mangle_bootargs.patch
deleted file mode 100644
index 83db92609b..0000000000
--- a/target/linux/generic/pending-5.4/920-mangle_bootargs.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From: Imre Kaloz <kaloz@openwrt.org>
-Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default
-
-Enabling this option renames the bootloader supplied root=
-and rootfstype= variables, which might have to be know but
-would break the automatisms OpenWrt uses.
-
-Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
----
- init/Kconfig | 9 +++++++++
- init/main.c | 24 ++++++++++++++++++++++++
- 2 files changed, 33 insertions(+)
-
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1665,6 +1665,15 @@ config EMBEDDED
- an embedded system so certain expert options are available
- for configuration.
-
-+config MANGLE_BOOTARGS
-+ bool "Rename offending bootargs"
-+ depends on EXPERT
-+ help
-+ Sometimes the bootloader passed bogus root= and rootfstype=
-+ parameters to the kernel, and while you want to ignore them,
-+ you need to know the values f.e. to support dual firmware
-+ layouts on the flash.
-+
- config HAVE_PERF_EVENTS
- bool
- help
---- a/init/main.c
-+++ b/init/main.c
-@@ -367,6 +367,29 @@ static inline void setup_nr_cpu_ids(void
- static inline void smp_prepare_cpus(unsigned int maxcpus) { }
- #endif
-
-+#ifdef CONFIG_MANGLE_BOOTARGS
-+static void __init mangle_bootargs(char *command_line)
-+{
-+ char *rootdev;
-+ char *rootfs;
-+
-+ rootdev = strstr(command_line, "root=/dev/mtdblock");
-+
-+ if (rootdev)
-+ strncpy(rootdev, "mangled_rootblock=", 18);
-+
-+ rootfs = strstr(command_line, "rootfstype");
-+
-+ if (rootfs)
-+ strncpy(rootfs, "mangled_fs", 10);
-+
-+}
-+#else
-+static void __init mangle_bootargs(char *command_line)
-+{
-+}
-+#endif
-+
- /*
- * We need to store the untouched command line for future reference.
- * We also need to store the touched command line since the parameter
-@@ -597,6 +620,7 @@ asmlinkage __visible void __init start_k
- pr_notice("%s", linux_banner);
- early_security_init();
- setup_arch(&command_line);
-+ mangle_bootargs(command_line);
- setup_command_line(command_line);
- setup_nr_cpu_ids();
- setup_per_cpu_areas();