From 5826f05bad8770df235f13f6d9390b8d410ed960 Mon Sep 17 00:00:00 2001 From: jiangheng Date: Tue, 9 Jan 2024 16:40:57 +0800 Subject: [PATCH] upgrade to dpdk-23.11 --- 0001-add-igb-uio.patch | 927 -- 0001-add-igb_uio.patch | 1039 ++ ...ecure-compile-option-and-fPIC-option.patch | 81 - ...-bugfix-the-deadlock-in-rte_eal_init.patch | 70 - ...ore-donot-set-affinity-in-libstorage.patch | 27 - ...change-the-log-level-in-prepare_numa.patch | 25 - 0006-dpdk-fix-dpdk-coredump-problem.patch | 34 - ...g-error-in-Intel-R-Xeon-R-CPU-E5-262.patch | 28 - 0008-dpdk-add-support-for-gazelle.patch | 2113 ---- ...aring-secondary-process-memseg-lists.patch | 43 - ...y-process-attach-without-shared-file.patch | 61 - ...y-memseg-destory-error-during-detach.patch | 27 - ...l-sec-detach-coredump-count-rollover.patch | 42 - ...ix-rte-eal-memory-init-double-unlock.patch | 29 - ...ix-last-argv-pointer-change-to-first.patch | 25 - ...cfg-and-fbarray-attach-mememory-leak.patch | 55 - ...secondary-attach-fails-due-to-detach.patch | 24 - 0017-fix-master-thread-not-set-affinity.patch | 25 - ...bonding-fix-offloading-configuration.patch | 71 - 0018-secure-complilation-options-rpath.patch | 38 - ...Tx-when-fast-path-operation-introduc.patch | 114 - 0019-reinit-support-return-ok.patch | 40 - ...x-mailbox-wait-time-uninitialization.patch | 47 - ...coredump-caused-by-incorrect-pkt_len.patch | 32 - 0021-gro-fix-gro-with-tcp-push-flag.patch | 85 - ...ns3-fix-vector-burst-when-PTP-enable.patch | 237 - ...garch-support-LoongArch-architecture.patch | 1630 --- ...t-hns3-remove-unnecessary-assignment.patch | 28 - ...sking-wrong-warning-array-subscript-.patch | 46 - 0023-net-hns3-fix-using-enum-as-boolean.patch | 34 - ...-common-function-to-initialize-MAC-a.patch | 205 - ...ke-control-plane-function-non-inline.patch | 30 - ...-hns3-remove-unnecessary-blank-lines.patch | 49 - ...t-reset-failure-handling-to-function.patch | 95 - 0028-net-hns3-remove-unused-variables.patch | 77 - ...getting-number-of-queue-descriptors-.patch | 107 - ...hns3-remove-logging-memory-addresses.patch | 79 - ...-common-function-to-obtain-revision-.patch | 145 - ...t-hns3-replace-single-line-functions.patch | 114 - ...-remove-non-re-entrant-strerror-call.patch | 30 - 0034-net-hns3-rename-function.patch | 39 - ...-functions-to-create-RSS-and-FDIR-fl.patch | 225 - ...support-indirect-counter-flow-action.patch | 367 - ...3-fix-max-packet-size-rollback-in-PF.patch | 63 - 0038-net-hns3-fix-RSS-key-with-null.patch | 57 - ...insecure-way-to-query-MAC-statistics.patch | 271 - ...-double-decrement-of-secondary-count.patch | 33 - ...rating-queue-when-TCAM-table-is-inva.patch | 57 - ...-net-hns3-delete-duplicated-RSS-type.patch | 35 - ...x-promiscuous-and-allmulticast-state.patch | 130 - ...bonding-fix-reference-count-on-mbufs.patch | 36 - 0045-app-testpmd-fix-bonding-mode-set.patch | 70 - 0046-ethdev-introduce-dump-API.patch | 129 - ...rocinfo-add-device-private-info-dump.patch | 90 - 0048-net-hns3-dump-device-basic-info.patch | 174 - ...-hns3-dump-device-feature-capability.patch | 63 - 0050-net-hns3-dump-device-MAC-info.patch | 63 - 0051-net-hns3-dump-queue-info.patch | 254 - ...et-hns3-dump-VLAN-configuration-info.patch | 180 - ...t-hns3-dump-flow-director-basic-info.patch | 119 - ...-net-hns3-dump-TM-configuration-info.patch | 188 - 0055-net-hns3-dump-flow-control-info.patch | 165 - 0056-net-hns3-change-dump-file-name.patch | 35 - 0057-net-hns3-fix-code-check-for-dump.patch | 680 -- 0058-ethdev-fix-ethdev-version-map.patch | 31 - 0059-net-hns3-delete-simple-bd-cap.patch | 28 - 0060-net-hns3-fix-TM-info-dump.patch | 29 - 0061-dma-hisilicon-support-Kunpeng-930.patch | 182 - ...pport-error-handling-with-Kunpeng-93.patch | 35 - ...pport-registers-dump-for-Kunpeng-930.patch | 112 - ...-hisilicon-add-queue-full-statistics.patch | 78 - ...silicon-use-common-PCI-device-naming.patch | 79 - ...heck-starting-port-is-not-in-bonding.patch | 38 - ...ost-remove-DMA-type-option-help-info.patch | 32 - ...-fix-freeing-order-in-device-release.patch | 169 - ...s3-remove-duplicate-macro-definition.patch | 31 - 0070-net-hns3-fix-RSS-TC-mode-entry.patch | 35 - 0071-net-hns3-fix-VF-RSS-TC-mode-entry.patch | 103 - ...e-time-waiting-for-PF-reset-completi.patch | 51 - ...nding-fix-stopping-non-active-slaves.patch | 56 - ...-slave-stop-and-remove-on-port-close.patch | 37 - ...er-of-clearing-imissed-register-in-P.patch | 186 - ...AC-and-queues-HW-statistics-overflow.patch | 432 - ...3-fix-pseudo-sharing-between-threads.patch | 45 - ...ns3-fix-mbuf-free-on-Tx-done-cleanup.patch | 50 - 0079-net-hns3-fix-RSS-disable.patch | 214 - ...hns3-fix-rollback-on-RSS-hash-update.patch | 75 - ...ns3-remove-redundant-RSS-tuple-field.patch | 136 - ...-fix-RSS-update-when-RSS-is-disabled.patch | 70 - ...t-hns3-remove-unnecessary-RSS-switch.patch | 103 - ...eck-statistics-query-before-printing.patch | 96 - 0085-app-testpmd-fix-MTU-verification.patch | 110 - ...-port-status-of-bonding-slave-device.patch | 152 - ...ify-null-location-case-in-xstats-get.patch | 79 - ...v-simplify-xstats-get-implementation.patch | 50 - ...-xstats-get-return-if-xstats-is-null.patch | 58 - ...-xstats-get-return-if-xstats-is-null.patch | 43 - ...-xstats-get-return-if-xstats-is-null.patch | 61 - ...-xstats-get-return-if-xstats-is-null.patch | 56 - ...-fix-memory-leak-in-xstats-telemetry.patch | 35 - ...dev-fix-possible-null-pointer-access.patch | 37 - ...ssible-null-dereference-in-telemetry.patch | 37 - ...net-bonding-fix-mbuf-fast-free-usage.patch | 57 - 0097-ethdev-fix-port-state-when-stop.patch | 36 - ...-fix-port-close-in-secondary-process.patch | 40 - 0099-examples-dma-fix-MTU-configuration.patch | 95 - ...-examples-dma-fix-Tx-drop-statistics.patch | 79 - ...dd-force-minimal-copy-size-parameter.patch | 127 - ...x-index-returned-when-no-DMA-complet.patch | 54 - ...ma-check-index-when-no-DMA-completed.patch | 51 - ...hisilicon-enhance-CQ-scan-robustness.patch | 54 - 0105-net-failsafe-fix-device-freeing.patch | 37 - 0106-net-tap-fix-device-freeing.patch | 38 - ...RSS-inconsistent-between-bonded-and-.patch | 43 - ...ix-bonding-RSS-test-when-disable-RSS.patch | 129 - ...ck-for-deferred-start-queue-when-rol.patch | 32 - ...et-hns3-remove-redundant-parentheses.patch | 38 - ...just-the-data-type-of-some-variables.patch | 227 - ...-net-hns3-fix-an-unreasonable-memset.patch | 30 - ...net-hns3-remove-duplicate-definition.patch | 71 - 0114-net-hns3-fix-code-check-warning.patch | 31 - ...x-return-value-for-unsupported-tuple.patch | 32 - 0116-net-hns3-modify-a-function-name.patch | 74 - 0117-net-hns3-unify-the-code-wrap-style.patch | 516 - ...ix-a-segfault-from-secondary-process.patch | 39 - ...ix-TM-capability-incorrectly-defined.patch | 33 - ...-add-help-messages-for-multi-process.patch | 38 - ...use-of-indirect-action-after-port-cl.patch | 94 - ...x-bonding-slave-devices-not-released.patch | 122 - ...link-status-capability-query-from-VF.patch | 52 - ...et-hns3-support-backplane-media-type.patch | 131 - ...cancel-heartbeat-alarm-when-VF-reset.patch | 46 - 0128-net-hns3-fix-PTP-interrupt-logging.patch | 35 - 0129-net-hns3-fix-statistics-locking.patch | 132 - ...-hns3-fix-descriptors-check-with-SVE.patch | 34 - 0131-net-hns3-clean-some-functions.patch | 50 - 0132-net-hns3-delete-unused-code.patch | 88 - ...port-dequeue-when-no-packet-received.patch | 62 - ...p-of-VF-VLAN-filter-modify-capabilit.patch | 31 - 0135-net-hns3-fix-Rx-with-PTP.patch | 89 - 0136-net-hns3-fix-crash-in-SVE-Tx.patch | 44 - ...3-fix-next-to-use-overflow-in-SVE-Tx.patch | 46 - ...ix-next-to-use-overflow-in-simple-Tx.patch | 46 - ...net-hns3-optimize-SVE-Tx-performance.patch | 56 - ...ash-when-secondary-process-access-FW.patch | 75 - 0141-net-hns3-delete-unused-markup.patch | 81 - ...fix-clearing-hardware-MAC-statistics.patch | 44 - ...3-revert-Tx-performance-optimization.patch | 185 - 0144-net-hns3-fix-RSS-rule-restore.patch | 71 - 0145-net-hns3-fix-RSS-filter-restore.patch | 65 - ...fix-lock-protection-of-RSS-flow-rule.patch | 74 - 0147-net-hns3-fix-RSS-flow-rule-restore.patch | 159 - ...s3-move-flow-direction-rule-recovery.patch | 71 - ...s3-fix-restore-filter-function-input.patch | 195 - 0150-net-hns3-fix-build-with-gcov.patch | 37 - ...-net-hns3-fix-packet-type-for-GENEVE.patch | 44 - ...remove-magic-numbers-for-MAC-address.patch | 40 - 0153-net-hns3-fix-code-check-warnings.patch | 379 - 0154-net-hns3-fix-header-files-includes.patch | 285 - 0155-net-hns3-remove-unused-structures.patch | 67 - 0156-net-hns3-rename-header-guards.patch | 410 - 0157-net-hns3-fix-IPv4-and-IPv6-RSS.patch | 87 - ...t-hns3-fix-types-in-IPv6-SCTP-fields.patch | 57 - 0159-net-hns3-fix-IPv4-RSS.patch | 380 - ...et-hns3-add-check-for-L3-and-L4-type.patch | 77 - ...rt-fix-mailbox-communication-with-HW.patch | 58 - ...hns3-fix-VF-mailbox-message-handling.patch | 48 - ...net-hns3-fix-minimum-Tx-frame-length.patch | 123 - ...-introduce-Rx-Tx-descriptor-dump-API.patch | 238 - ...t-hns3-support-Rx-Tx-descriptor-dump.patch | 164 - 0166-remove-unnecessary-null-checks.patch | 50 - ...-generic-dummy-packet-burst-function.patch | 175 - ...fix-spelling-in-comments-and-strings.patch | 9689 ----------------- ...3-add-VLAN-filter-query-in-dump-file.patch | 158 - ...nding-fix-array-overflow-in-Rx-burst.patch | 39 - ...g-fix-double-slave-link-status-query.patch | 60 - ...md-fix-supported-RSS-offload-display.patch | 121 - ...pmd-unify-name-of-L2-payload-offload.patch | 71 - ...tpmd-refactor-config-all-RSS-command.patch | 251 - ...-app-testpmd-unify-RSS-types-display.patch | 76 - ...app-testpmd-compact-RSS-types-output.patch | 165 - 0177-app-testpmd-reorder-RSS-type-table.patch | 99 - 0178-app-testpmd-fix-RSS-types-display.patch | 61 - ...thdev-support-telemetry-private-dump.patch | 91 - 0180-dmadev-add-telemetry.patch | 224 - ...dmadev-support-telemetry-dump-dmadev.patch | 78 - 0182-telemetry-add-missing-C-guards.patch | 45 - ...characters-allowed-in-dictionary-nam.patch | 146 - ...-escaping-of-invalid-json-characters.patch | 122 - ...ry-add-escaping-of-strings-in-arrays.patch | 97 - ...try-add-escaping-of-strings-in-dicts.patch | 55 - 0187-telemetry-limit-command-characters.patch | 55 - ...inate-duplicate-code-for-json-output.patch | 103 - ...metry-make-help-command-more-helpful.patch | 52 - 0190-net-bonding-fix-Tx-hash-for-TCP.patch | 42 - ...onding-add-link-speeds-configuration.patch | 112 - ...ding-call-Tx-prepare-before-Tx-burst.patch | 211 - 0193-net-bonding-fix-MTU-set-for-slaves.patch | 62 - ...md-remove-jumbo-offload-related-code.patch | 121 - ...rt-MAC-update-in-checksum-forwarding.patch | 42 - ...ing-fix-bond4-drop-valid-MAC-packets.patch | 86 - ...slave-device-Rx-Tx-offload-configura.patch | 54 - ...ix-MAC-header-in-csum-forward-engine.patch | 154 - ...te-bond-port-configurations-when-add.patch | 110 - ...-fix-GENEVE-parsing-in-checksum-mode.patch | 83 - ...dd-UDP-TCP-checksum-in-mbuf-segments.patch | 239 - ...add-SW-L4-checksum-in-multi-segments.patch | 137 - ...md-fix-L4-checksum-in-multi-segments.patch | 59 - ...-bonding-fix-mbuf-fast-free-handling.patch | 73 - ...x-application-name-in-procinfo-guide.patch | 71 - ...cument-device-dump-in-procinfo-guide.patch | 44 - ...app-procinfo-remove-doxygen-comments.patch | 108 - 0208-app-procinfo-dump-DPDK-version.patch | 118 - 0209-app-procinfo-dump-firmware-version.patch | 134 - 0210-app-procinfo-dump-RSS-RETA.patch | 156 - ...app-procinfo-dump-module-EEPROM-info.patch | 152 - ...o-add-burst-mode-to-Rx-Tx-queue-info.patch | 76 - ...p-detailed-info-for-Rx-Tx-descriptor.patch | 223 - ...hisilicon-support-vchan-status-query.patch | 95 - 0215-kni-fix-build-with-Linux-5.18.patch | 53 - ...d-function-to-set-random-MAC-address.patch | 49 - ...edicated-function-to-set-MAC-address.patch | 89 - ...io-fix-build-for-switch-fall-through.patch | 78 - ...x-igb_uio-fix-build-with-kernel-5.18.patch | 49 - ...hns3-fix-inaccurate-RTC-time-to-read.patch | 53 - ...fix-log-about-indirection-table-size.patch | 53 - ...ract-common-function-to-query-device.patch | 291 - ...r-set-RSS-hash-algorithm-and-key-int.patch | 149 - ...-hns3-fix-RSS-key-size-compatibility.patch | 209 - ...-hns3-fix-clearing-RSS-configuration.patch | 42 - ...-filter-list-to-check-duplicated-rul.patch | 89 - ...useless-code-when-destroy-valid-RSS-.patch | 91 - ...fix-warning-on-flush-or-destroy-rule.patch | 66 - ...ix-config-struct-used-for-conversion.patch | 133 - ...et-hns3-fix-duplicate-RSS-rule-check.patch | 108 - ...burst-mode-query-with-dummy-function.patch | 82 - ...-debug-info-for-Rx-Tx-dummy-function.patch | 41 - ...emove-debug-condition-for-Tx-prepare.patch | 46 - ...e-Tx-prepare-from-getting-Tx-functio.patch | 130 - ...hns3-make-getting-Tx-function-static.patch | 49 - ...xtract-common-functions-to-set-Rx-Tx.patch | 196 - ...declare-flow-rule-keeping-capability.patch | 45 - ...estpmd-add-disable-flow-flush-option.patch | 106 - ...sible-truncation-of-hash-key-when-co.patch | 37 - ...sible-truncation-of-redirection-tabl.patch | 59 - ...e-hardware-config-to-report-hash-key.patch | 114 - ...hardware-config-to-report-hash-types.patch | 490 - ...dware-config-to-report-redirection-t.patch | 133 - ...hns3-separate-setting-hash-algorithm.patch | 186 - 0245-net-hns3-separate-setting-hash-key.patch | 49 - ...3-separate-setting-redirection-table.patch | 98 - ...-net-hns3-separate-setting-RSS-types.patch | 131 - ...parate-setting-and-clearing-RSS-rule.patch | 126 - ...e-new-RSS-rule-to-configure-hardware.patch | 121 - ...ve-hash-algo-to-RSS-filter-list-node.patch | 96 - ...w-adding-queue-buffer-size-hash-rule.patch | 37 - ...parate-flow-RSS-config-from-RSS-conf.patch | 169 - ...-hns3-reimplement-hash-flow-function.patch | 1697 --- ...t-hns3-add-verification-of-RSS-types.patch | 199 - 0255-test-mbuf-fix-mbuf-reset-test.patch | 35 - ...les-l3fwd-power-support-CPPC-cpufreq.patch | 53 - ...c-free-mbuf-use-rte_pktmbuf_free_seg.patch | 107 - ...nding-support-private-dump-operation.patch | 150 - 0259-net-bonding-add-LACP-info-dump.patch | 187 - 0260-net-virtio-support-private-dump.patch | 56 - 0261-net-vhost-support-private-dump.patch | 55 - ...stpmd-show-private-info-in-port-info.patch | 37 - ...md-display-RSS-hash-key-of-flow-rule.patch | 48 - ...eue-telemetry-memory-leak-on-failure.patch | 39 - ...MAC-address-in-telemetry-device-info.patch | 53 - ...-eth_rx-fix-telemetry-Rx-stats-reset.patch | 44 - ...ry_data-refactor-for-maintainability.patch | 369 - ...ata-add-test-cases-for-character-esc.patch | 74 - ...ools-telemetry-add-JSON-pretty-print.patch | 87 - 0270-telemetry-move-include-after-guard.patch | 52 - ...ethdev-fix-telemetry-data-truncation.patch | 59 - ...empool-fix-telemetry-data-truncation.patch | 70 - ...ptodev-fix-telemetry-data-truncation.patch | 39 - 0274-mem-fix-telemetry-data-truncation.patch | 65 - ...upport-adding-integer-as-hexadecimal.patch | 426 - ...ilities-from-telemetry-in-hexadecima.patch | 62 - 0277-mem-fix-hugepage-info-mapping.patch | 51 - ...pga-base-fix-init-with-multi-process.patch | 44 - ...ompressdev-fix-empty-devargs-parsing.patch | 52 - ...-cryptodev-fix-empty-devargs-parsing.patch | 55 - 0281-net-hns3-fix-empty-devargs-parsing.patch | 62 - ...net-virtio-fix-empty-devargs-parsing.patch | 57 - ...a-skeleton-fix-empty-devargs-parsing.patch | 46 - ...w-skeleton-fix-empty-devargs-parsing.patch | 38 - ...implify-hardware-checksum-offloading.patch | 224 - 0286-net-hns3-support-dump-media-type.patch | 66 - ...ddress-occupies-two-entries-in-MAC-a.patch | 111 - ...-hns3-fix-never-set-MAC-flow-control.patch | 47 - ...-flow-control-autoneg-for-fiber-port.patch | 303 - ...-net-hns3-fix-variable-type-mismatch.patch | 52 - ...x-multiple-firmware-reset-interrupts.patch | 67 - 0292-net-hns3-add-Tx-Rx-descriptor-logs.patch | 132 - ...net-hns3-fix-FEC-mode-for-200G-ports.patch | 36 - 0294-net-hns3-fix-FEC-mode-check-error.patch | 108 - ...-net-hns3-fix-missing-FEC-capability.patch | 222 - ...-ethdev-introduce-low-latency-RS-FEC.patch | 33 - ...setting-and-querying-of-LLRS-FEC-mod.patch | 72 - ...LLRS-FEC-mode-support-for-200G-ports.patch | 111 - ...current-FEC-capability-from-firmware.patch | 122 - ...-hns3-fix-RTC-time-on-initialization.patch | 80 - 0301-net-hns3-fix-RTC-time-after-reset.patch | 51 - 0302-net-hns3-uninitialize-PTP.patch | 82 - ...3-extract-PTP-to-its-own-header-file.patch | 168 - ...f-leakage-when-RxQ-started-during-re.patch | 96 - ...f-leakage-when-RxQ-started-after-res.patch | 59 - ...t-hns3-fix-device-start-return-value.patch | 38 - ...-net-hns3-fix-uninitialized-variable.patch | 38 - 0308-net-hns3-refactor-code.patch | 82 - 0309-net-hns3-fix-inaccurate-log.patch | 44 - ...hns3-fix-redundant-line-break-in-log.patch | 71 - ...v-add-API-to-check-if-queue-is-valid.patch | 117 - ...-segment-fault-with-invalid-queue-ID.patch | 82 - 0313-net-hns3-fix-IMP-reset-trigger.patch | 66 - ...gbe-add-proper-memory-barriers-in-Rx.patch | 136 - 0315-net-cnxk-fix-build-with-GCC-12.patch | 108 - ...net-cnxk-fix-build-with-optimization.patch | 44 - ...rypto-ipsec_mb-fix-build-with-GCC-12.patch | 73 - 0318-net-ena-fix-build-with-GCC-12.patch | 65 - 0319-net-enetfec-fix-build-with-GCC-12.patch | 71 - 0320-net-ice-fix-build-with-GCC-12.patch | 56 - 0321-vdpa-ifc-fix-build-with-GCC-12.patch | 49 - ...-app-flow-perf-fix-build-with-GCC-12.patch | 134 - 0323-common-cpt-fix-build-with-GCC-12.patch | 113 - 0324-crypto-cnxk-fix-build-with-GCC-12.patch | 90 - 0325-test-ipsec-fix-build-with-GCC-12.patch | 152 - 0326-vhost-crypto-fix-build-with-GCC-12.patch | 221 - ...ost-crypto-fix-descriptor-processing.patch | 40 - 0328-net-ice-base-fix-build-with-GCC-12.patch | 82 - 0329-net-qede-fix-build-with-GCC-12.patch | 155 - ...ormance-thread-fix-build-with-GCC-12.patch | 62 - 0331-net-mvneta-fix-build-with-GCC-12.patch | 41 - 0332-test-ipsec-fix-build-with-GCC-12.patch | 58 - 0333-ipsec-fix-build-with-GCC-12.patch | 75 - 0334-crypto-qat-fix-build-with-GCC-12.patch | 70 - 0335-vhost-fix-build-with-GCC-12.patch | 100 - ...net-i40e-fix-build-with-MinGW-GCC-12.patch | 50 - ...de-base-fix-32-bit-build-with-GCC-12.patch | 53 - ...FNI-implementation-build-with-GCC-12.patch | 104 - ...amples-cmdline-fix-build-with-GCC-12.patch | 53 - ...-mlx5-fix-build-with-GCC-12-and-ASan.patch | 70 - 0341-pdump-fix-build-with-GCC-12.patch | 84 - ...ngling-pointer-by-mailbox-access-rew.patch | 329 - 0343-kni-fix-build-with-Linux-6.3.patch | 52 - 0344-kni-fix-build-with-Linux-6.5.patch | 53 - ...sections-of-networking-drivers-guide.patch | 96 - ...s3-delete-duplicate-macro-definition.patch | 39 - ...-FDIR-VLAN-match-mode-runtime-config.patch | 201 - ...-fix-kernel-patch-link-in-hns3-guide.patch | 38 - 0349-doc-fix-syntax-in-hns3-guide.patch | 49 - ...mber-of-leading-spaces-in-hns3-guide.patch | 83 - 0351-config-arm-add-HiSilicon-HIP10.patch | 93 - ...-fix-non-zero-weight-for-disabled-TC.patch | 56 - ...ix-index-to-look-up-table-in-NEON-Rx.patch | 40 - ...default-MAC-modified-when-set-failed.patch | 35 - ...ix-error-code-for-multicast-resource.patch | 35 - ...3-fix-flushing-multicast-MAC-address.patch | 51 - ...fix-traffic-management-thread-safety.patch | 273 - ...affic-management-dump-text-alignment.patch | 107 - 0359-net-hns3-fix-order-in-NEON-Rx.patch | 155 - ...t-hns3-optimize-free-mbuf-for-SVE-Tx.patch | 89 - ...-hns3-optimize-rearm-mbuf-for-SVE-Rx.patch | 223 - ...net-hns3-optimize-SVE-Rx-performance.patch | 242 - ...tpmd-fix-multicast-address-pool-leak.patch | 97 - 0364-app-testpmd-fix-help-string.patch | 40 - ...command-to-flush-multicast-MAC-addre.patch | 152 - 0366-maintainers-update-for-hns3-driver.patch | 33 - ...isplay-when-callback-don-t-init-dict.patch | 38 - 0368-net-hns3-fix-build-warning.patch | 50 - 0369-net-hns3-fix-typo-in-function-name.patch | 44 - ...hns3-fix-unchecked-Rx-free-threshold.patch | 44 - ...-net-hns3-fix-crash-for-NEON-and-SVE.patch | 64 - ...ouble-stats-for-IMP-and-global-reset.patch | 61 - ...t-hns3-remove-reset-log-in-secondary.patch | 74 - ...hns3-fix-multiple-reset-detected-log.patch | 165 - 0375-net-hns3-fix-IMP-or-global-reset.patch | 229 - ...-hns3-refactor-interrupt-state-query.patch | 165 - ...estpmd-ease-configuring-all-offloads.patch | 348 - ...-net-hns3-fix-setting-DCB-capability.patch | 95 - 0379-net-hns3-fix-LRO-offload-to-report.patch | 206 - 0380-net-hns3-fix-some-return-values.patch | 100 - 0381-net-hns3-fix-some-error-logs.patch | 47 - ...eep-set-get-algo-key-functions-local.patch | 61 - ...s3-fix-uninitialized-hash-algo-value.patch | 43 - ...dev-clarify-RSS-related-fields-usage.patch | 159 - ...dev-set-and-query-RSS-hash-algorithm.patch | 207 - ...eport-RSS-hash-algorithms-capability.patch | 36 - ...tting-and-querying-RSS-hash-function.patch | 102 - 0388-app-procinfo-fix-RSS-info.patch | 76 - ...p-procinfo-adjust-format-of-RSS-info.patch | 59 - 0390-ethdev-get-RSS-algorithm-names.patch | 284 - ...app-procinfo-show-RSS-hash-algorithm.patch | 36 - 0392-ethdev-add-maximum-Rx-buffer-size.patch | 102 - ...-net-hns3-report-maximum-buffer-size.patch | 30 - 0394-net-hns3-fix-mailbox-sync.patch | 250 - 0395-net-hns3-fix-ignored-reset-event.patch | 42 - 0396-net-hns3-fix-reset-event-status.patch | 48 - ...s3-fix-VF-reset-handler-interruption.patch | 118 - ...-remove-useless-check-in-TSO-command.patch | 49 - ...tpmd-fix-tunnel-TSO-capability-check.patch | 95 - ...md-add-explicit-check-for-tunnel-TSO.patch | 120 - ...testpmd-fix-tunnel-TSO-configuration.patch | 71 - ...d-allow-offload-config-for-all-ports.patch | 359 - 0403-app-testpmd-fix-Tx-offload-command.patch | 37 - ...-check-port-and-queue-Rx-Tx-offloads.patch | 72 - ...-build-option-about-max-queue-number.patch | 38 - 0406-doc-update-features-in-hns3-guide.patch | 69 - ...x-RSS-flow-description-in-hns3-guide.patch | 93 - ...-doc-fix-description-of-RSS-features.patch | 70 - ...PI-to-get-RSS-hash-algorithm-by-name.patch | 93 - ...stpmd-support-set-RSS-hash-algorithm.patch | 151 - ...3-refactor-VF-mailbox-message-struct.patch | 279 - ...3-refactor-PF-mailbox-message-struct.patch | 195 - ...-hns3-refactor-send-mailbox-function.patch | 526 - ...ns3-refactor-handle-mailbox-function.patch | 188 - ...3-fix-VF-multiple-count-on-one-reset.patch | 114 - ...s3-fix-disable-command-with-firmware.patch | 48 - ...-net-hns3-fix-reset-level-comparison.patch | 78 - ...ns3-don-t-support-QinQ-insert-for-VF.patch | 45 - ...-sw_64-support-not-upstream-modified.patch | 250 - 1001-add-sw_64-support-not-upstream-new.patch | 1015 -- CVE-2021-3839.patch | 39 - CVE-2022-0669.patch | 44 - backport-0001-CVE-2022-2132.patch | 104 - backport-0002-CVE-2022-2132.patch | 79 - backport-CVE-2022-28199.patch | 138 - ...-gro-check-payload-length-after-trim.patch | 82 - ...-chain-index-for-more-than-2-packets.patch | 31 - backport-gro-trim-tail-padding-bytes.patch | 68 - dpdk-21.11.tar.xz => dpdk-23.11.tar.xz | Bin 15102516 -> 16289148 bytes dpdk.spec | 698 +- 435 files changed, 1178 insertions(+), 60304 deletions(-) delete mode 100644 0001-add-igb-uio.patch create mode 100644 0001-add-igb_uio.patch delete mode 100644 0002-dpdk-add-secure-compile-option-and-fPIC-option.patch delete mode 100644 0003-dpdk-bugfix-the-deadlock-in-rte_eal_init.patch delete mode 100644 0004-dpdk-master-core-donot-set-affinity-in-libstorage.patch delete mode 100644 0005-dpdk-change-the-log-level-in-prepare_numa.patch delete mode 100644 0006-dpdk-fix-dpdk-coredump-problem.patch delete mode 100644 0007-dpdk-fix-cpu-flag-error-in-Intel-R-Xeon-R-CPU-E5-262.patch delete mode 100644 0008-dpdk-add-support-for-gazelle.patch delete mode 100644 0009-dpdk-fix-error-in-clearing-secondary-process-memseg-lists.patch delete mode 100644 0010-dpdk-fix-coredump-when-primary-process-attach-without-shared-file.patch delete mode 100644 0011-dpdk-fix-fbarray-memseg-destory-error-during-detach.patch delete mode 100644 0012-fix-rte-eal-sec-detach-coredump-count-rollover.patch delete mode 100644 0013-fix-rte-eal-memory-init-double-unlock.patch delete mode 100644 0014-fix-last-argv-pointer-change-to-first.patch delete mode 100644 0015-fix-internal-cfg-and-fbarray-attach-mememory-leak.patch delete mode 100644 0016-fix-error-that-the-secondary-attach-fails-due-to-detach.patch delete mode 100644 0017-fix-master-thread-not-set-affinity.patch delete mode 100644 0018-net-bonding-fix-offloading-configuration.patch delete mode 100644 0018-secure-complilation-options-rpath.patch delete mode 100644 0019-net-hns3-fix-Rx-Tx-when-fast-path-operation-introduc.patch delete mode 100644 0019-reinit-support-return-ok.patch delete mode 100644 0020-net-hns3-fix-mailbox-wait-time-uninitialization.patch delete mode 100644 0020-pdump-fix-pcap_dump-coredump-caused-by-incorrect-pkt_len.patch delete mode 100644 0021-gro-fix-gro-with-tcp-push-flag.patch delete mode 100644 0021-net-hns3-fix-vector-burst-when-PTP-enable.patch delete mode 100644 0022-eal-loongarch-support-LoongArch-architecture.patch delete mode 100644 0022-net-hns3-remove-unnecessary-assignment.patch delete mode 100644 0023-example-l3fwd-masking-wrong-warning-array-subscript-.patch delete mode 100644 0023-net-hns3-fix-using-enum-as-boolean.patch delete mode 100644 0024-net-hns3-extract-common-function-to-initialize-MAC-a.patch delete mode 100644 0025-net-hns3-make-control-plane-function-non-inline.patch delete mode 100644 0026-net-hns3-remove-unnecessary-blank-lines.patch delete mode 100644 0027-net-hns3-extract-reset-failure-handling-to-function.patch delete mode 100644 0028-net-hns3-remove-unused-variables.patch delete mode 100644 0029-net-hns3-remove-getting-number-of-queue-descriptors-.patch delete mode 100644 0030-net-hns3-remove-logging-memory-addresses.patch delete mode 100644 0031-net-hns3-extract-common-function-to-obtain-revision-.patch delete mode 100644 0032-net-hns3-replace-single-line-functions.patch delete mode 100644 0033-net-hns3-remove-non-re-entrant-strerror-call.patch delete mode 100644 0034-net-hns3-rename-function.patch delete mode 100644 0035-net-hns3-extract-functions-to-create-RSS-and-FDIR-fl.patch delete mode 100644 0036-net-hns3-support-indirect-counter-flow-action.patch delete mode 100644 0037-net-hns3-fix-max-packet-size-rollback-in-PF.patch delete mode 100644 0038-net-hns3-fix-RSS-key-with-null.patch delete mode 100644 0039-net-hns3-fix-insecure-way-to-query-MAC-statistics.patch delete mode 100644 0040-net-hns3-fix-double-decrement-of-secondary-count.patch delete mode 100644 0041-net-hns3-fix-operating-queue-when-TCAM-table-is-inva.patch delete mode 100644 0042-net-hns3-delete-duplicated-RSS-type.patch delete mode 100644 0043-net-bonding-fix-promiscuous-and-allmulticast-state.patch delete mode 100644 0044-net-bonding-fix-reference-count-on-mbufs.patch delete mode 100644 0045-app-testpmd-fix-bonding-mode-set.patch delete mode 100644 0046-ethdev-introduce-dump-API.patch delete mode 100644 0047-app-procinfo-add-device-private-info-dump.patch delete mode 100644 0048-net-hns3-dump-device-basic-info.patch delete mode 100644 0049-net-hns3-dump-device-feature-capability.patch delete mode 100644 0050-net-hns3-dump-device-MAC-info.patch delete mode 100644 0051-net-hns3-dump-queue-info.patch delete mode 100644 0052-net-hns3-dump-VLAN-configuration-info.patch delete mode 100644 0053-net-hns3-dump-flow-director-basic-info.patch delete mode 100644 0054-net-hns3-dump-TM-configuration-info.patch delete mode 100644 0055-net-hns3-dump-flow-control-info.patch delete mode 100644 0056-net-hns3-change-dump-file-name.patch delete mode 100644 0057-net-hns3-fix-code-check-for-dump.patch delete mode 100644 0058-ethdev-fix-ethdev-version-map.patch delete mode 100644 0059-net-hns3-delete-simple-bd-cap.patch delete mode 100644 0060-net-hns3-fix-TM-info-dump.patch delete mode 100644 0061-dma-hisilicon-support-Kunpeng-930.patch delete mode 100644 0062-dma-hisilicon-support-error-handling-with-Kunpeng-93.patch delete mode 100644 0063-dma-hisilicon-support-registers-dump-for-Kunpeng-930.patch delete mode 100644 0064-dma-hisilicon-add-queue-full-statistics.patch delete mode 100644 0065-dma-hisilicon-use-common-PCI-device-naming.patch delete mode 100644 0066-app-testpmd-check-starting-port-is-not-in-bonding.patch delete mode 100644 0067-examples-vhost-remove-DMA-type-option-help-info.patch delete mode 100644 0068-kni-fix-freeing-order-in-device-release.patch delete mode 100644 0069-net-hns3-remove-duplicate-macro-definition.patch delete mode 100644 0070-net-hns3-fix-RSS-TC-mode-entry.patch delete mode 100644 0071-net-hns3-fix-VF-RSS-TC-mode-entry.patch delete mode 100644 0072-net-hns3-increase-time-waiting-for-PF-reset-completi.patch delete mode 100644 0073-net-bonding-fix-stopping-non-active-slaves.patch delete mode 100644 0074-net-bonding-fix-slave-stop-and-remove-on-port-close.patch delete mode 100644 0075-net-hns3-fix-order-of-clearing-imissed-register-in-P.patch delete mode 100644 0076-net-hns3-fix-MAC-and-queues-HW-statistics-overflow.patch delete mode 100644 0077-net-hns3-fix-pseudo-sharing-between-threads.patch delete mode 100644 0078-net-hns3-fix-mbuf-free-on-Tx-done-cleanup.patch delete mode 100644 0079-net-hns3-fix-RSS-disable.patch delete mode 100644 0080-net-hns3-fix-rollback-on-RSS-hash-update.patch delete mode 100644 0081-net-hns3-remove-redundant-RSS-tuple-field.patch delete mode 100644 0082-ethdev-fix-RSS-update-when-RSS-is-disabled.patch delete mode 100644 0083-net-hns3-remove-unnecessary-RSS-switch.patch delete mode 100644 0084-app-testpmd-check-statistics-query-before-printing.patch delete mode 100644 0085-app-testpmd-fix-MTU-verification.patch delete mode 100644 0086-app-testpmd-fix-port-status-of-bonding-slave-device.patch delete mode 100644 0087-ethdev-clarify-null-location-case-in-xstats-get.patch delete mode 100644 0088-ethdev-simplify-xstats-get-implementation.patch delete mode 100644 0089-net-hns3-fix-xstats-get-return-if-xstats-is-null.patch delete mode 100644 0090-net-ipn3ke-fix-xstats-get-return-if-xstats-is-null.patch delete mode 100644 0091-net-mvpp2-fix-xstats-get-return-if-xstats-is-null.patch delete mode 100644 0092-net-axgbe-fix-xstats-get-return-if-xstats-is-null.patch delete mode 100644 0093-ethdev-fix-memory-leak-in-xstats-telemetry.patch delete mode 100644 0094-ethdev-fix-possible-null-pointer-access.patch delete mode 100644 0095-net-cnxk-fix-possible-null-dereference-in-telemetry.patch delete mode 100644 0096-net-bonding-fix-mbuf-fast-free-usage.patch delete mode 100644 0097-ethdev-fix-port-state-when-stop.patch delete mode 100644 0098-ethdev-fix-port-close-in-secondary-process.patch delete mode 100644 0099-examples-dma-fix-MTU-configuration.patch delete mode 100644 0100-examples-dma-fix-Tx-drop-statistics.patch delete mode 100644 0101-examples-dma-add-force-minimal-copy-size-parameter.patch delete mode 100644 0102-dma-hisilicon-fix-index-returned-when-no-DMA-complet.patch delete mode 100644 0103-test-dma-check-index-when-no-DMA-completed.patch delete mode 100644 0104-dma-hisilicon-enhance-CQ-scan-robustness.patch delete mode 100644 0105-net-failsafe-fix-device-freeing.patch delete mode 100644 0106-net-tap-fix-device-freeing.patch delete mode 100644 0107-net-bonding-fix-RSS-inconsistent-between-bonded-and-.patch delete mode 100644 0108-app-test-fix-bonding-RSS-test-when-disable-RSS.patch delete mode 100644 0109-net-hns3-add-check-for-deferred-start-queue-when-rol.patch delete mode 100644 0110-net-hns3-remove-redundant-parentheses.patch delete mode 100644 0111-net-hns3-adjust-the-data-type-of-some-variables.patch delete mode 100644 0112-net-hns3-fix-an-unreasonable-memset.patch delete mode 100644 0113-net-hns3-remove-duplicate-definition.patch delete mode 100644 0114-net-hns3-fix-code-check-warning.patch delete mode 100644 0115-net-hns3-fix-return-value-for-unsupported-tuple.patch delete mode 100644 0116-net-hns3-modify-a-function-name.patch delete mode 100644 0117-net-hns3-unify-the-code-wrap-style.patch delete mode 100644 0118-net-hns3-fix-a-segfault-from-secondary-process.patch delete mode 100644 0119-net-hns3-fix-TM-capability-incorrectly-defined.patch delete mode 100644 0120-app-testpmd-add-help-messages-for-multi-process.patch delete mode 100644 0121-app-testpmd-fix-use-of-indirect-action-after-port-cl.patch delete mode 100644 0122-app-testpmd-fix-bonding-slave-devices-not-released.patch delete mode 100644 0125-net-hns3-fix-link-status-capability-query-from-VF.patch delete mode 100644 0126-net-hns3-support-backplane-media-type.patch delete mode 100644 0127-net-hns3-cancel-heartbeat-alarm-when-VF-reset.patch delete mode 100644 0128-net-hns3-fix-PTP-interrupt-logging.patch delete mode 100644 0129-net-hns3-fix-statistics-locking.patch delete mode 100644 0130-net-hns3-fix-descriptors-check-with-SVE.patch delete mode 100644 0131-net-hns3-clean-some-functions.patch delete mode 100644 0132-net-hns3-delete-unused-code.patch delete mode 100644 0133-examples-dma-support-dequeue-when-no-packet-received.patch delete mode 100644 0134-net-hns3-add-dump-of-VF-VLAN-filter-modify-capabilit.patch delete mode 100644 0135-net-hns3-fix-Rx-with-PTP.patch delete mode 100644 0136-net-hns3-fix-crash-in-SVE-Tx.patch delete mode 100644 0137-net-hns3-fix-next-to-use-overflow-in-SVE-Tx.patch delete mode 100644 0138-net-hns3-fix-next-to-use-overflow-in-simple-Tx.patch delete mode 100644 0139-net-hns3-optimize-SVE-Tx-performance.patch delete mode 100644 0140-net-hns3-fix-crash-when-secondary-process-access-FW.patch delete mode 100644 0141-net-hns3-delete-unused-markup.patch delete mode 100644 0142-net-hns3-fix-clearing-hardware-MAC-statistics.patch delete mode 100644 0143-net-hns3-revert-Tx-performance-optimization.patch delete mode 100644 0144-net-hns3-fix-RSS-rule-restore.patch delete mode 100644 0145-net-hns3-fix-RSS-filter-restore.patch delete mode 100644 0146-net-hns3-fix-lock-protection-of-RSS-flow-rule.patch delete mode 100644 0147-net-hns3-fix-RSS-flow-rule-restore.patch delete mode 100644 0148-net-hns3-move-flow-direction-rule-recovery.patch delete mode 100644 0149-net-hns3-fix-restore-filter-function-input.patch delete mode 100644 0150-net-hns3-fix-build-with-gcov.patch delete mode 100644 0151-net-hns3-fix-packet-type-for-GENEVE.patch delete mode 100644 0152-net-hns3-remove-magic-numbers-for-MAC-address.patch delete mode 100644 0153-net-hns3-fix-code-check-warnings.patch delete mode 100644 0154-net-hns3-fix-header-files-includes.patch delete mode 100644 0155-net-hns3-remove-unused-structures.patch delete mode 100644 0156-net-hns3-rename-header-guards.patch delete mode 100644 0157-net-hns3-fix-IPv4-and-IPv6-RSS.patch delete mode 100644 0158-net-hns3-fix-types-in-IPv6-SCTP-fields.patch delete mode 100644 0159-net-hns3-fix-IPv4-RSS.patch delete mode 100644 0160-net-hns3-add-check-for-L3-and-L4-type.patch delete mode 100644 0161-net-hns3-revert-fix-mailbox-communication-with-HW.patch delete mode 100644 0162-net-hns3-fix-VF-mailbox-message-handling.patch delete mode 100644 0163-net-hns3-fix-minimum-Tx-frame-length.patch delete mode 100644 0164-ethdev-introduce-Rx-Tx-descriptor-dump-API.patch delete mode 100644 0165-net-hns3-support-Rx-Tx-descriptor-dump.patch delete mode 100644 0166-remove-unnecessary-null-checks.patch delete mode 100644 0167-ethdev-introduce-generic-dummy-packet-burst-function.patch delete mode 100644 0168-fix-spelling-in-comments-and-strings.patch delete mode 100644 0169-net-hns3-add-VLAN-filter-query-in-dump-file.patch delete mode 100644 0170-net-bonding-fix-array-overflow-in-Rx-burst.patch delete mode 100644 0171-net-bonding-fix-double-slave-link-status-query.patch delete mode 100644 0172-app-testpmd-fix-supported-RSS-offload-display.patch delete mode 100644 0173-app-testpmd-unify-name-of-L2-payload-offload.patch delete mode 100644 0174-app-testpmd-refactor-config-all-RSS-command.patch delete mode 100644 0175-app-testpmd-unify-RSS-types-display.patch delete mode 100644 0176-app-testpmd-compact-RSS-types-output.patch delete mode 100644 0177-app-testpmd-reorder-RSS-type-table.patch delete mode 100644 0178-app-testpmd-fix-RSS-types-display.patch delete mode 100644 0179-ethdev-support-telemetry-private-dump.patch delete mode 100644 0180-dmadev-add-telemetry.patch delete mode 100644 0181-dmadev-support-telemetry-dump-dmadev.patch delete mode 100644 0182-telemetry-add-missing-C-guards.patch delete mode 100644 0183-telemetry-limit-characters-allowed-in-dictionary-nam.patch delete mode 100644 0184-telemetry-fix-escaping-of-invalid-json-characters.patch delete mode 100644 0185-telemetry-add-escaping-of-strings-in-arrays.patch delete mode 100644 0186-telemetry-add-escaping-of-strings-in-dicts.patch delete mode 100644 0187-telemetry-limit-command-characters.patch delete mode 100644 0188-telemetry-eliminate-duplicate-code-for-json-output.patch delete mode 100644 0189-telemetry-make-help-command-more-helpful.patch delete mode 100644 0190-net-bonding-fix-Tx-hash-for-TCP.patch delete mode 100644 0191-net-bonding-add-link-speeds-configuration.patch delete mode 100644 0192-net-bonding-call-Tx-prepare-before-Tx-burst.patch delete mode 100644 0193-net-bonding-fix-MTU-set-for-slaves.patch delete mode 100644 0194-app-testpmd-remove-jumbo-offload-related-code.patch delete mode 100644 0195-app-testpmd-revert-MAC-update-in-checksum-forwarding.patch delete mode 100644 0196-net-bonding-fix-bond4-drop-valid-MAC-packets.patch delete mode 100644 0197-net-bonding-fix-slave-device-Rx-Tx-offload-configura.patch delete mode 100644 0198-app-testpmd-fix-MAC-header-in-csum-forward-engine.patch delete mode 100644 0199-app-testpmd-update-bond-port-configurations-when-add.patch delete mode 100644 0200-app-testpmd-fix-GENEVE-parsing-in-checksum-mode.patch delete mode 100644 0201-net-add-UDP-TCP-checksum-in-mbuf-segments.patch delete mode 100644 0202-app-testpmd-add-SW-L4-checksum-in-multi-segments.patch delete mode 100644 0203-app-testpmd-fix-L4-checksum-in-multi-segments.patch delete mode 100644 0204-net-bonding-fix-mbuf-fast-free-handling.patch delete mode 100644 0205-doc-fix-application-name-in-procinfo-guide.patch delete mode 100644 0206-doc-document-device-dump-in-procinfo-guide.patch delete mode 100644 0207-app-procinfo-remove-doxygen-comments.patch delete mode 100644 0208-app-procinfo-dump-DPDK-version.patch delete mode 100644 0209-app-procinfo-dump-firmware-version.patch delete mode 100644 0210-app-procinfo-dump-RSS-RETA.patch delete mode 100644 0211-app-procinfo-dump-module-EEPROM-info.patch delete mode 100644 0212-app-procinfo-add-burst-mode-to-Rx-Tx-queue-info.patch delete mode 100644 0213-app-procinfo-dump-detailed-info-for-Rx-Tx-descriptor.patch delete mode 100644 0214-dma-hisilicon-support-vchan-status-query.patch delete mode 100644 0215-kni-fix-build-with-Linux-5.18.patch delete mode 100644 0216-kni-use-dedicated-function-to-set-random-MAC-address.patch delete mode 100644 0217-kni-use-dedicated-function-to-set-MAC-address.patch delete mode 100644 0218-linux-igb_uio-fix-build-for-switch-fall-through.patch delete mode 100644 0219-linux-igb_uio-fix-build-with-kernel-5.18.patch delete mode 100644 0220-net-hns3-fix-inaccurate-RTC-time-to-read.patch delete mode 100644 0221-net-hns3-fix-log-about-indirection-table-size.patch delete mode 100644 0222-net-hns3-extract-common-function-to-query-device.patch delete mode 100644 0223-net-hns3-refactor-set-RSS-hash-algorithm-and-key-int.patch delete mode 100644 0224-net-hns3-fix-RSS-key-size-compatibility.patch delete mode 100644 0225-net-hns3-fix-clearing-RSS-configuration.patch delete mode 100644 0226-net-hns3-use-RSS-filter-list-to-check-duplicated-rul.patch delete mode 100644 0227-net-hns3-remove-useless-code-when-destroy-valid-RSS-.patch delete mode 100644 0228-net-hns3-fix-warning-on-flush-or-destroy-rule.patch delete mode 100644 0229-net-hns3-fix-config-struct-used-for-conversion.patch delete mode 100644 0230-net-hns3-fix-duplicate-RSS-rule-check.patch delete mode 100644 0231-net-hns3-fix-burst-mode-query-with-dummy-function.patch delete mode 100644 0232-net-hns3-add-debug-info-for-Rx-Tx-dummy-function.patch delete mode 100644 0233-net-hns3-remove-debug-condition-for-Tx-prepare.patch delete mode 100644 0234-net-hns3-separate-Tx-prepare-from-getting-Tx-functio.patch delete mode 100644 0235-net-hns3-make-getting-Tx-function-static.patch delete mode 100644 0236-net-hns3-extract-common-functions-to-set-Rx-Tx.patch delete mode 100644 0237-net-hns3-declare-flow-rule-keeping-capability.patch delete mode 100644 0238-app-testpmd-add-disable-flow-flush-option.patch delete mode 100644 0239-net-hns3-fix-possible-truncation-of-hash-key-when-co.patch delete mode 100644 0240-net-hns3-fix-possible-truncation-of-redirection-tabl.patch delete mode 100644 0241-net-hns3-use-hardware-config-to-report-hash-key.patch delete mode 100644 0242-net-hns3-use-hardware-config-to-report-hash-types.patch delete mode 100644 0243-net-hns3-use-hardware-config-to-report-redirection-t.patch delete mode 100644 0244-net-hns3-separate-setting-hash-algorithm.patch delete mode 100644 0245-net-hns3-separate-setting-hash-key.patch delete mode 100644 0246-net-hns3-separate-setting-redirection-table.patch delete mode 100644 0247-net-hns3-separate-setting-RSS-types.patch delete mode 100644 0248-net-hns3-separate-setting-and-clearing-RSS-rule.patch delete mode 100644 0249-net-hns3-use-new-RSS-rule-to-configure-hardware.patch delete mode 100644 0250-net-hns3-save-hash-algo-to-RSS-filter-list-node.patch delete mode 100644 0251-net-hns3-allow-adding-queue-buffer-size-hash-rule.patch delete mode 100644 0252-net-hns3-separate-flow-RSS-config-from-RSS-conf.patch delete mode 100644 0253-net-hns3-reimplement-hash-flow-function.patch delete mode 100644 0254-net-hns3-add-verification-of-RSS-types.patch delete mode 100644 0255-test-mbuf-fix-mbuf-reset-test.patch delete mode 100644 0256-examples-l3fwd-power-support-CPPC-cpufreq.patch delete mode 100644 0257-hinic-free-mbuf-use-rte_pktmbuf_free_seg.patch delete mode 100644 0258-net-bonding-support-private-dump-operation.patch delete mode 100644 0259-net-bonding-add-LACP-info-dump.patch delete mode 100644 0260-net-virtio-support-private-dump.patch delete mode 100644 0261-net-vhost-support-private-dump.patch delete mode 100644 0262-app-testpmd-show-private-info-in-port-info.patch delete mode 100644 0263-app-testpmd-display-RSS-hash-key-of-flow-rule.patch delete mode 100644 0264-ethdev-fix-Rx-queue-telemetry-memory-leak-on-failure.patch delete mode 100644 0265-ethdev-fix-MAC-address-in-telemetry-device-info.patch delete mode 100644 0266-eventdev-eth_rx-fix-telemetry-Rx-stats-reset.patch delete mode 100644 0267-test-telemetry_data-refactor-for-maintainability.patch delete mode 100644 0268-test-telemetry_data-add-test-cases-for-character-esc.patch delete mode 100644 0269-usertools-telemetry-add-JSON-pretty-print.patch delete mode 100644 0270-telemetry-move-include-after-guard.patch delete mode 100644 0271-ethdev-fix-telemetry-data-truncation.patch delete mode 100644 0272-mempool-fix-telemetry-data-truncation.patch delete mode 100644 0273-cryptodev-fix-telemetry-data-truncation.patch delete mode 100644 0274-mem-fix-telemetry-data-truncation.patch delete mode 100644 0275-telemetry-support-adding-integer-as-hexadecimal.patch delete mode 100644 0276-ethdev-get-capabilities-from-telemetry-in-hexadecima.patch delete mode 100644 0277-mem-fix-hugepage-info-mapping.patch delete mode 100644 0278-raw-ifpga-base-fix-init-with-multi-process.patch delete mode 100644 0279-compressdev-fix-empty-devargs-parsing.patch delete mode 100644 0280-cryptodev-fix-empty-devargs-parsing.patch delete mode 100644 0281-net-hns3-fix-empty-devargs-parsing.patch delete mode 100644 0282-net-virtio-fix-empty-devargs-parsing.patch delete mode 100644 0283-dma-skeleton-fix-empty-devargs-parsing.patch delete mode 100644 0284-raw-skeleton-fix-empty-devargs-parsing.patch delete mode 100644 0285-net-hns3-simplify-hardware-checksum-offloading.patch delete mode 100644 0286-net-hns3-support-dump-media-type.patch delete mode 100644 0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch delete mode 100644 0288-net-hns3-fix-never-set-MAC-flow-control.patch delete mode 100644 0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch delete mode 100644 0290-net-hns3-fix-variable-type-mismatch.patch delete mode 100644 0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch delete mode 100644 0292-net-hns3-add-Tx-Rx-descriptor-logs.patch delete mode 100644 0293-net-hns3-fix-FEC-mode-for-200G-ports.patch delete mode 100644 0294-net-hns3-fix-FEC-mode-check-error.patch delete mode 100644 0295-net-hns3-fix-missing-FEC-capability.patch delete mode 100644 0296-ethdev-introduce-low-latency-RS-FEC.patch delete mode 100644 0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch delete mode 100644 0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch delete mode 100644 0299-net-hns3-get-current-FEC-capability-from-firmware.patch delete mode 100644 0300-net-hns3-fix-RTC-time-on-initialization.patch delete mode 100644 0301-net-hns3-fix-RTC-time-after-reset.patch delete mode 100644 0302-net-hns3-uninitialize-PTP.patch delete mode 100644 0303-net-hns3-extract-PTP-to-its-own-header-file.patch delete mode 100644 0304-net-hns3-fix-mbuf-leakage-when-RxQ-started-during-re.patch delete mode 100644 0305-net-hns3-fix-mbuf-leakage-when-RxQ-started-after-res.patch delete mode 100644 0306-net-hns3-fix-device-start-return-value.patch delete mode 100644 0307-net-hns3-fix-uninitialized-variable.patch delete mode 100644 0308-net-hns3-refactor-code.patch delete mode 100644 0309-net-hns3-fix-inaccurate-log.patch delete mode 100644 0310-net-hns3-fix-redundant-line-break-in-log.patch delete mode 100644 0311-ethdev-add-API-to-check-if-queue-is-valid.patch delete mode 100644 0312-app-testpmd-fix-segment-fault-with-invalid-queue-ID.patch delete mode 100644 0313-net-hns3-fix-IMP-reset-trigger.patch delete mode 100644 0314-net-ixgbe-add-proper-memory-barriers-in-Rx.patch delete mode 100644 0315-net-cnxk-fix-build-with-GCC-12.patch delete mode 100644 0316-net-cnxk-fix-build-with-optimization.patch delete mode 100644 0317-crypto-ipsec_mb-fix-build-with-GCC-12.patch delete mode 100644 0318-net-ena-fix-build-with-GCC-12.patch delete mode 100644 0319-net-enetfec-fix-build-with-GCC-12.patch delete mode 100644 0320-net-ice-fix-build-with-GCC-12.patch delete mode 100644 0321-vdpa-ifc-fix-build-with-GCC-12.patch delete mode 100644 0322-app-flow-perf-fix-build-with-GCC-12.patch delete mode 100644 0323-common-cpt-fix-build-with-GCC-12.patch delete mode 100644 0324-crypto-cnxk-fix-build-with-GCC-12.patch delete mode 100644 0325-test-ipsec-fix-build-with-GCC-12.patch delete mode 100644 0326-vhost-crypto-fix-build-with-GCC-12.patch delete mode 100644 0327-vhost-crypto-fix-descriptor-processing.patch delete mode 100644 0328-net-ice-base-fix-build-with-GCC-12.patch delete mode 100644 0329-net-qede-fix-build-with-GCC-12.patch delete mode 100644 0330-examples-performance-thread-fix-build-with-GCC-12.patch delete mode 100644 0331-net-mvneta-fix-build-with-GCC-12.patch delete mode 100644 0332-test-ipsec-fix-build-with-GCC-12.patch delete mode 100644 0333-ipsec-fix-build-with-GCC-12.patch delete mode 100644 0334-crypto-qat-fix-build-with-GCC-12.patch delete mode 100644 0335-vhost-fix-build-with-GCC-12.patch delete mode 100644 0336-net-i40e-fix-build-with-MinGW-GCC-12.patch delete mode 100644 0337-net-qede-base-fix-32-bit-build-with-GCC-12.patch delete mode 100644 0338-hash-fix-GFNI-implementation-build-with-GCC-12.patch delete mode 100644 0339-examples-cmdline-fix-build-with-GCC-12.patch delete mode 100644 0340-net-mlx5-fix-build-with-GCC-12-and-ASan.patch delete mode 100644 0341-pdump-fix-build-with-GCC-12.patch delete mode 100644 0342-net-cxgbe-fix-dangling-pointer-by-mailbox-access-rew.patch delete mode 100644 0343-kni-fix-build-with-Linux-6.3.patch delete mode 100644 0344-kni-fix-build-with-Linux-6.5.patch delete mode 100644 0345-doc-unify-sections-of-networking-drivers-guide.patch delete mode 100644 0346-net-hns3-delete-duplicate-macro-definition.patch delete mode 100644 0347-net-hns3-add-FDIR-VLAN-match-mode-runtime-config.patch delete mode 100644 0348-doc-fix-kernel-patch-link-in-hns3-guide.patch delete mode 100644 0349-doc-fix-syntax-in-hns3-guide.patch delete mode 100644 0350-doc-fix-number-of-leading-spaces-in-hns3-guide.patch delete mode 100644 0351-config-arm-add-HiSilicon-HIP10.patch delete mode 100644 0352-net-hns3-fix-non-zero-weight-for-disabled-TC.patch delete mode 100644 0353-net-hns3-fix-index-to-look-up-table-in-NEON-Rx.patch delete mode 100644 0354-net-hns3-fix-VF-default-MAC-modified-when-set-failed.patch delete mode 100644 0355-net-hns3-fix-error-code-for-multicast-resource.patch delete mode 100644 0356-net-hns3-fix-flushing-multicast-MAC-address.patch delete mode 100644 0357-net-hns3-fix-traffic-management-thread-safety.patch delete mode 100644 0358-net-hns3-fix-traffic-management-dump-text-alignment.patch delete mode 100644 0359-net-hns3-fix-order-in-NEON-Rx.patch delete mode 100644 0360-net-hns3-optimize-free-mbuf-for-SVE-Tx.patch delete mode 100644 0361-net-hns3-optimize-rearm-mbuf-for-SVE-Rx.patch delete mode 100644 0362-net-hns3-optimize-SVE-Rx-performance.patch delete mode 100644 0363-app-testpmd-fix-multicast-address-pool-leak.patch delete mode 100644 0364-app-testpmd-fix-help-string.patch delete mode 100644 0365-app-testpmd-add-command-to-flush-multicast-MAC-addre.patch delete mode 100644 0366-maintainers-update-for-hns3-driver.patch delete mode 100644 0367-telemetry-fix-repeat-display-when-callback-don-t-init-dict.patch delete mode 100644 0368-net-hns3-fix-build-warning.patch delete mode 100644 0369-net-hns3-fix-typo-in-function-name.patch delete mode 100644 0370-net-hns3-fix-unchecked-Rx-free-threshold.patch delete mode 100644 0371-net-hns3-fix-crash-for-NEON-and-SVE.patch delete mode 100644 0372-net-hns3-fix-double-stats-for-IMP-and-global-reset.patch delete mode 100644 0373-net-hns3-remove-reset-log-in-secondary.patch delete mode 100644 0374-net-hns3-fix-multiple-reset-detected-log.patch delete mode 100644 0375-net-hns3-fix-IMP-or-global-reset.patch delete mode 100644 0376-net-hns3-refactor-interrupt-state-query.patch delete mode 100644 0377-app-testpmd-ease-configuring-all-offloads.patch delete mode 100644 0378-net-hns3-fix-setting-DCB-capability.patch delete mode 100644 0379-net-hns3-fix-LRO-offload-to-report.patch delete mode 100644 0380-net-hns3-fix-some-return-values.patch delete mode 100644 0381-net-hns3-fix-some-error-logs.patch delete mode 100644 0382-net-hns3-keep-set-get-algo-key-functions-local.patch delete mode 100644 0383-net-hns3-fix-uninitialized-hash-algo-value.patch delete mode 100644 0384-ethdev-clarify-RSS-related-fields-usage.patch delete mode 100644 0385-ethdev-set-and-query-RSS-hash-algorithm.patch delete mode 100644 0386-net-hns3-report-RSS-hash-algorithms-capability.patch delete mode 100644 0387-net-hns3-support-setting-and-querying-RSS-hash-function.patch delete mode 100644 0388-app-procinfo-fix-RSS-info.patch delete mode 100644 0389-app-procinfo-adjust-format-of-RSS-info.patch delete mode 100644 0390-ethdev-get-RSS-algorithm-names.patch delete mode 100644 0391-app-procinfo-show-RSS-hash-algorithm.patch delete mode 100644 0392-ethdev-add-maximum-Rx-buffer-size.patch delete mode 100644 0393-net-hns3-report-maximum-buffer-size.patch delete mode 100644 0394-net-hns3-fix-mailbox-sync.patch delete mode 100644 0395-net-hns3-fix-ignored-reset-event.patch delete mode 100644 0396-net-hns3-fix-reset-event-status.patch delete mode 100644 0397-net-hns3-fix-VF-reset-handler-interruption.patch delete mode 100644 0398-app-testpmd-remove-useless-check-in-TSO-command.patch delete mode 100644 0399-app-testpmd-fix-tunnel-TSO-capability-check.patch delete mode 100644 0400-app-testpmd-add-explicit-check-for-tunnel-TSO.patch delete mode 100644 0401-app-testpmd-fix-tunnel-TSO-configuration.patch delete mode 100644 0402-app-testpmd-allow-offload-config-for-all-ports.patch delete mode 100644 0403-app-testpmd-fix-Tx-offload-command.patch delete mode 100644 0404-app-testpmd-check-port-and-queue-Rx-Tx-offloads.patch delete mode 100644 0405-doc-fix-hns3-build-option-about-max-queue-number.patch delete mode 100644 0406-doc-update-features-in-hns3-guide.patch delete mode 100644 0407-doc-fix-RSS-flow-description-in-hns3-guide.patch delete mode 100644 0408-doc-fix-description-of-RSS-features.patch delete mode 100644 0409-ethdev-add-new-API-to-get-RSS-hash-algorithm-by-name.patch delete mode 100644 0410-app-testpmd-support-set-RSS-hash-algorithm.patch delete mode 100644 0411-net-hns3-refactor-VF-mailbox-message-struct.patch delete mode 100644 0412-net-hns3-refactor-PF-mailbox-message-struct.patch delete mode 100644 0413-net-hns3-refactor-send-mailbox-function.patch delete mode 100644 0414-net-hns3-refactor-handle-mailbox-function.patch delete mode 100644 0415-net-hns3-fix-VF-multiple-count-on-one-reset.patch delete mode 100644 0416-net-hns3-fix-disable-command-with-firmware.patch delete mode 100644 0417-net-hns3-fix-reset-level-comparison.patch delete mode 100644 0418-net-hns3-don-t-support-QinQ-insert-for-VF.patch delete mode 100644 1000-add-sw_64-support-not-upstream-modified.patch delete mode 100644 1001-add-sw_64-support-not-upstream-new.patch delete mode 100644 CVE-2021-3839.patch delete mode 100644 CVE-2022-0669.patch delete mode 100644 backport-0001-CVE-2022-2132.patch delete mode 100644 backport-0002-CVE-2022-2132.patch delete mode 100644 backport-CVE-2022-28199.patch delete mode 100644 backport-gro-check-payload-length-after-trim.patch delete mode 100644 backport-gro-fix-chain-index-for-more-than-2-packets.patch delete mode 100644 backport-gro-trim-tail-padding-bytes.patch rename dpdk-21.11.tar.xz => dpdk-23.11.tar.xz (63%) diff --git a/0001-add-igb-uio.patch b/0001-add-igb-uio.patch deleted file mode 100644 index 3e31860..0000000 --- a/0001-add-igb-uio.patch +++ /dev/null @@ -1,927 +0,0 @@ -From b46793510b200c4120f03963252f7f54d23f6f8b Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 19:07:58 +0800 -Subject: [PATCH] add igb_uio - ---- - kernel/linux/igb_uio/Kbuild | 2 + - kernel/linux/igb_uio/compat.h | 154 +++++++ - kernel/linux/igb_uio/igb_uio.c | 674 +++++++++++++++++++++++++++++++ - kernel/linux/igb_uio/meson.build | 27 ++ - kernel/linux/meson.build | 2 +- - meson_options.txt | 2 +- - 6 files changed, 859 insertions(+), 2 deletions(-) - create mode 100644 kernel/linux/igb_uio/Kbuild - create mode 100644 kernel/linux/igb_uio/compat.h - create mode 100644 kernel/linux/igb_uio/igb_uio.c - create mode 100644 kernel/linux/igb_uio/meson.build - -diff --git a/kernel/linux/igb_uio/Kbuild b/kernel/linux/igb_uio/Kbuild -new file mode 100644 -index 0000000000..3ab85c4116 ---- /dev/null -+++ b/kernel/linux/igb_uio/Kbuild -@@ -0,0 +1,2 @@ -+ccflags-y := $(MODULE_CFLAGS) -+obj-m := igb_uio.o -diff --git a/kernel/linux/igb_uio/compat.h b/kernel/linux/igb_uio/compat.h -new file mode 100644 -index 0000000000..8dbb896ae1 ---- /dev/null -+++ b/kernel/linux/igb_uio/compat.h -@@ -0,0 +1,154 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Minimal wrappers to allow compiling igb_uio on older kernels. -+ */ -+ -+#ifndef RHEL_RELEASE_VERSION -+#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b)) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) -+#define pci_cfg_access_lock pci_block_user_cfg_access -+#define pci_cfg_access_unlock pci_unblock_user_cfg_access -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0) -+#define HAVE_PTE_MASK_PAGE_IOMAP -+#endif -+ -+#ifndef PCI_MSIX_ENTRY_SIZE -+#define PCI_MSIX_ENTRY_SIZE 16 -+#define PCI_MSIX_ENTRY_VECTOR_CTRL 12 -+#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 -+#endif -+ -+/* -+ * for kernels < 2.6.38 and backported patch that moves MSI-X entry definition -+ * to pci_regs.h Those kernels has PCI_MSIX_ENTRY_SIZE defined but not -+ * PCI_MSIX_ENTRY_CTRL_MASKBIT -+ */ -+#ifndef PCI_MSIX_ENTRY_CTRL_MASKBIT -+#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) && \ -+ (!(defined(RHEL_RELEASE_CODE) && \ -+ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5, 9))) -+ -+static int pci_num_vf(struct pci_dev *dev) -+{ -+ struct iov { -+ int pos; -+ int nres; -+ u32 cap; -+ u16 ctrl; -+ u16 total; -+ u16 initial; -+ u16 nr_virtfn; -+ } *iov = (struct iov *)dev->sriov; -+ -+ if (!dev->is_physfn) -+ return 0; -+ -+ return iov->nr_virtfn; -+} -+ -+#endif /* < 2.6.34 */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \ -+ (!(defined(RHEL_RELEASE_CODE) && \ -+ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4))) -+ -+#define kstrtoul strict_strtoul -+ -+#endif /* < 2.6.39 */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) && \ -+ (!(defined(RHEL_RELEASE_CODE) && \ -+ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 3))) -+ -+/* Check if INTX works to control irq's. -+ * Set's INTX_DISABLE flag and reads it back -+ */ -+static bool pci_intx_mask_supported(struct pci_dev *pdev) -+{ -+ bool mask_supported = false; -+ uint16_t orig, new; -+ -+ pci_block_user_cfg_access(pdev); -+ pci_read_config_word(pdev, PCI_COMMAND, &orig); -+ pci_write_config_word(pdev, PCI_COMMAND, -+ orig ^ PCI_COMMAND_INTX_DISABLE); -+ pci_read_config_word(pdev, PCI_COMMAND, &new); -+ -+ if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) { -+ dev_err(&pdev->dev, "Command register changed from " -+ "0x%x to 0x%x: driver or hardware bug?\n", orig, new); -+ } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) { -+ mask_supported = true; -+ pci_write_config_word(pdev, PCI_COMMAND, orig); -+ } -+ pci_unblock_user_cfg_access(pdev); -+ -+ return mask_supported; -+} -+ -+static bool pci_check_and_mask_intx(struct pci_dev *pdev) -+{ -+ bool pending; -+ uint32_t status; -+ -+ pci_block_user_cfg_access(pdev); -+ pci_read_config_dword(pdev, PCI_COMMAND, &status); -+ -+ /* interrupt is not ours, goes to out */ -+ pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0); -+ if (pending) { -+ uint16_t old, new; -+ -+ old = status; -+ if (status != 0) -+ new = old & (~PCI_COMMAND_INTX_DISABLE); -+ else -+ new = old | PCI_COMMAND_INTX_DISABLE; -+ -+ if (old != new) -+ pci_write_config_word(pdev, PCI_COMMAND, new); -+ } -+ pci_unblock_user_cfg_access(pdev); -+ -+ return pending; -+} -+ -+#endif /* < 3.3.0 */ -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) -+#define HAVE_PCI_IS_BRIDGE_API 1 -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) -+#define HAVE_MSI_LIST_IN_GENERIC_DEVICE 1 -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) -+#define HAVE_PCI_MSI_MASK_IRQ 1 -+#endif -+ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) -+#define HAVE_ALLOC_IRQ_VECTORS 1 -+#endif -+ -+static inline bool igbuio_kernel_is_locked_down(void) -+{ -+#ifdef CONFIG_LOCK_DOWN_KERNEL -+#ifdef CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT -+ return kernel_is_locked_down(NULL); -+#elif defined(CONFIG_EFI_SECURE_BOOT_LOCK_DOWN) -+ return kernel_is_locked_down(); -+#else -+ return false; -+#endif -+#else -+ return false; -+#endif -+} -diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c -new file mode 100644 -index 0000000000..ea439d131d ---- /dev/null -+++ b/kernel/linux/igb_uio/igb_uio.c -@@ -0,0 +1,674 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/*- -+ * Copyright(c) 2010-2017 Intel Corporation. All rights reserved. -+ */ -+ -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/** -+ * These enum and macro definitions are copied from the -+ * file rte_pci_dev_features.h -+ */ -+enum rte_intr_mode { -+ RTE_INTR_MODE_NONE = 0, -+ RTE_INTR_MODE_LEGACY, -+ RTE_INTR_MODE_MSI, -+ RTE_INTR_MODE_MSIX -+}; -+#define RTE_INTR_MODE_NONE_NAME "none" -+#define RTE_INTR_MODE_LEGACY_NAME "legacy" -+#define RTE_INTR_MODE_MSI_NAME "msi" -+#define RTE_INTR_MODE_MSIX_NAME "msix" -+ -+ -+#include "compat.h" -+ -+/** -+ * A structure describing the private information for a uio device. -+ */ -+struct rte_uio_pci_dev { -+ struct uio_info info; -+ struct pci_dev *pdev; -+ enum rte_intr_mode mode; -+ atomic_t refcnt; -+}; -+ -+static int wc_activate; -+static char *intr_mode; -+static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; -+/* sriov sysfs */ -+static ssize_t -+show_max_vfs(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ return snprintf(buf, 10, "%u\n", dev_num_vf(dev)); -+} -+ -+static ssize_t -+store_max_vfs(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ int err = 0; -+ unsigned long max_vfs; -+ struct pci_dev *pdev = to_pci_dev(dev); -+ -+ if (0 != kstrtoul(buf, 0, &max_vfs)) -+ return -EINVAL; -+ -+ if (0 == max_vfs) -+ pci_disable_sriov(pdev); -+ else if (0 == pci_num_vf(pdev)) -+ err = pci_enable_sriov(pdev, max_vfs); -+ else /* do nothing if change max_vfs number */ -+ err = -EINVAL; -+ -+ return err ? err : count; -+} -+ -+static DEVICE_ATTR(max_vfs, S_IRUGO | S_IWUSR, show_max_vfs, store_max_vfs); -+ -+static struct attribute *dev_attrs[] = { -+ &dev_attr_max_vfs.attr, -+ NULL, -+}; -+ -+static const struct attribute_group dev_attr_grp = { -+ .attrs = dev_attrs, -+}; -+ -+#ifndef HAVE_PCI_MSI_MASK_IRQ -+/* -+ * It masks the msix on/off of generating MSI-X messages. -+ */ -+static void -+igbuio_msix_mask_irq(struct msi_desc *desc, s32 state) -+{ -+ u32 mask_bits = desc->masked; -+ unsigned int offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + -+ PCI_MSIX_ENTRY_VECTOR_CTRL; -+ -+ if (state != 0) -+ mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; -+ else -+ mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; -+ -+ if (mask_bits != desc->masked) { -+ writel(mask_bits, desc->mask_base + offset); -+ readl(desc->mask_base); -+ desc->masked = mask_bits; -+ } -+} -+ -+/* -+ * It masks the msi on/off of generating MSI messages. -+ */ -+static void -+igbuio_msi_mask_irq(struct pci_dev *pdev, struct msi_desc *desc, int32_t state) -+{ -+ u32 mask_bits = desc->masked; -+ u32 offset = desc->irq - pdev->irq; -+ u32 mask = 1 << offset; -+ -+ if (!desc->msi_attrib.maskbit) -+ return; -+ -+ if (state != 0) -+ mask_bits &= ~mask; -+ else -+ mask_bits |= mask; -+ -+ if (mask_bits != desc->masked) { -+ pci_write_config_dword(pdev, desc->mask_pos, mask_bits); -+ desc->masked = mask_bits; -+ } -+} -+ -+static void -+igbuio_mask_irq(struct pci_dev *pdev, enum rte_intr_mode mode, s32 irq_state) -+{ -+ struct msi_desc *desc; -+ struct list_head *msi_list; -+ -+#ifdef HAVE_MSI_LIST_IN_GENERIC_DEVICE -+ msi_list = &pdev->dev.msi_list; -+#else -+ msi_list = &pdev->msi_list; -+#endif -+ -+ if (mode == RTE_INTR_MODE_MSIX) { -+ list_for_each_entry(desc, msi_list, list) -+ igbuio_msix_mask_irq(desc, irq_state); -+ } else if (mode == RTE_INTR_MODE_MSI) { -+ list_for_each_entry(desc, msi_list, list) -+ igbuio_msi_mask_irq(pdev, desc, irq_state); -+ } -+} -+#endif -+ -+/** -+ * This is the irqcontrol callback to be registered to uio_info. -+ * It can be used to disable/enable interrupt from user space processes. -+ * -+ * @param info -+ * pointer to uio_info. -+ * @param irq_state -+ * state value. 1 to enable interrupt, 0 to disable interrupt. -+ * -+ * @return -+ * - On success, 0. -+ * - On failure, a negative value. -+ */ -+static int -+igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state) -+{ -+ struct rte_uio_pci_dev *udev = info->priv; -+ struct pci_dev *pdev = udev->pdev; -+ -+#ifdef HAVE_PCI_MSI_MASK_IRQ -+ struct irq_data *irq = irq_get_irq_data(udev->info.irq); -+#endif -+ -+ pci_cfg_access_lock(pdev); -+ -+ if (udev->mode == RTE_INTR_MODE_MSIX || udev->mode == RTE_INTR_MODE_MSI) { -+#ifdef HAVE_PCI_MSI_MASK_IRQ -+ if (irq_state == 1) -+ pci_msi_unmask_irq(irq); -+ else -+ pci_msi_mask_irq(irq); -+#else -+ igbuio_mask_irq(pdev, udev->mode, irq_state); -+#endif -+ } -+ -+ if (udev->mode == RTE_INTR_MODE_LEGACY) -+ pci_intx(pdev, !!irq_state); -+ -+ pci_cfg_access_unlock(pdev); -+ -+ return 0; -+} -+ -+/** -+ * This is interrupt handler which will check if the interrupt is for the right device. -+ * If yes, disable it here and will be enable later. -+ */ -+static irqreturn_t -+igbuio_pci_irqhandler(int irq, void *dev_id) -+{ -+ struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id; -+ struct uio_info *info = &udev->info; -+ -+ /* Legacy mode need to mask in hardware */ -+ if (udev->mode == RTE_INTR_MODE_LEGACY && -+ !pci_check_and_mask_intx(udev->pdev)) -+ return IRQ_NONE; -+ -+ uio_event_notify(info); -+ -+ /* Message signal mode, no share IRQ and automasked */ -+ return IRQ_HANDLED; -+} -+ -+static int -+igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) -+{ -+ int err = 0; -+#ifndef HAVE_ALLOC_IRQ_VECTORS -+ struct msix_entry msix_entry; -+#endif -+ -+ switch (igbuio_intr_mode_preferred) { -+ case RTE_INTR_MODE_MSIX: -+ /* Only 1 msi-x vector needed */ -+#ifndef HAVE_ALLOC_IRQ_VECTORS -+ msix_entry.entry = 0; -+ if (pci_enable_msix(udev->pdev, &msix_entry, 1) == 0) { -+ dev_dbg(&udev->pdev->dev, "using MSI-X"); -+ udev->info.irq_flags = IRQF_NO_THREAD; -+ udev->info.irq = msix_entry.vector; -+ udev->mode = RTE_INTR_MODE_MSIX; -+ break; -+ } -+#else -+ if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSIX) == 1) { -+ dev_dbg(&udev->pdev->dev, "using MSI-X"); -+ udev->info.irq_flags = IRQF_NO_THREAD; -+ udev->info.irq = pci_irq_vector(udev->pdev, 0); -+ udev->mode = RTE_INTR_MODE_MSIX; -+ break; -+ } -+#endif -+ -+ /* falls through - to MSI */ -+ case RTE_INTR_MODE_MSI: -+#ifndef HAVE_ALLOC_IRQ_VECTORS -+ if (pci_enable_msi(udev->pdev) == 0) { -+ dev_dbg(&udev->pdev->dev, "using MSI"); -+ udev->info.irq_flags = IRQF_NO_THREAD; -+ udev->info.irq = udev->pdev->irq; -+ udev->mode = RTE_INTR_MODE_MSI; -+ break; -+ } -+#else -+ if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSI) == 1) { -+ dev_dbg(&udev->pdev->dev, "using MSI"); -+ udev->info.irq_flags = IRQF_NO_THREAD; -+ udev->info.irq = pci_irq_vector(udev->pdev, 0); -+ udev->mode = RTE_INTR_MODE_MSI; -+ break; -+ } -+#endif -+ /* falls through - to INTX */ -+ case RTE_INTR_MODE_LEGACY: -+ if (pci_intx_mask_supported(udev->pdev)) { -+ dev_dbg(&udev->pdev->dev, "using INTX"); -+ udev->info.irq_flags = IRQF_SHARED | IRQF_NO_THREAD; -+ udev->info.irq = udev->pdev->irq; -+ udev->mode = RTE_INTR_MODE_LEGACY; -+ break; -+ } -+ dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n"); -+ /* falls through - to no IRQ */ -+ case RTE_INTR_MODE_NONE: -+ udev->mode = RTE_INTR_MODE_NONE; -+ udev->info.irq = UIO_IRQ_NONE; -+ break; -+ -+ default: -+ dev_err(&udev->pdev->dev, "invalid IRQ mode %u", -+ igbuio_intr_mode_preferred); -+ udev->info.irq = UIO_IRQ_NONE; -+ err = -EINVAL; -+ } -+ -+ if (udev->info.irq != UIO_IRQ_NONE) -+ err = request_irq(udev->info.irq, igbuio_pci_irqhandler, -+ udev->info.irq_flags, udev->info.name, -+ udev); -+ dev_info(&udev->pdev->dev, "uio device registered with irq %ld\n", -+ udev->info.irq); -+ -+ return err; -+} -+ -+static void -+igbuio_pci_disable_interrupts(struct rte_uio_pci_dev *udev) -+{ -+ if (udev->info.irq) { -+ free_irq(udev->info.irq, udev); -+ udev->info.irq = 0; -+ } -+ -+#ifndef HAVE_ALLOC_IRQ_VECTORS -+ if (udev->mode == RTE_INTR_MODE_MSIX) -+ pci_disable_msix(udev->pdev); -+ if (udev->mode == RTE_INTR_MODE_MSI) -+ pci_disable_msi(udev->pdev); -+#else -+ if (udev->mode == RTE_INTR_MODE_MSIX || -+ udev->mode == RTE_INTR_MODE_MSI) -+ pci_free_irq_vectors(udev->pdev); -+#endif -+} -+ -+ -+/** -+ * This gets called while opening uio device file. -+ */ -+static int -+igbuio_pci_open(struct uio_info *info, struct inode *inode) -+{ -+ struct rte_uio_pci_dev *udev = info->priv; -+ struct pci_dev *dev = udev->pdev; -+ int err; -+ -+ if (atomic_inc_return(&udev->refcnt) != 1) -+ return 0; -+ -+ /* set bus master, which was cleared by the reset function */ -+ pci_set_master(dev); -+ -+ /* enable interrupts */ -+ err = igbuio_pci_enable_interrupts(udev); -+ if (err) { -+ atomic_dec(&udev->refcnt); -+ dev_err(&dev->dev, "Enable interrupt fails\n"); -+ } -+ return err; -+} -+ -+static int -+igbuio_pci_release(struct uio_info *info, struct inode *inode) -+{ -+ struct rte_uio_pci_dev *udev = info->priv; -+ struct pci_dev *dev = udev->pdev; -+ -+ if (atomic_dec_and_test(&udev->refcnt)) { -+ /* disable interrupts */ -+ igbuio_pci_disable_interrupts(udev); -+ -+ /* stop the device from further DMA */ -+ pci_clear_master(dev); -+ } -+ -+ return 0; -+} -+ -+/* Remap pci resources described by bar #pci_bar in uio resource n. */ -+static int -+igbuio_pci_setup_iomem(struct pci_dev *dev, struct uio_info *info, -+ int n, int pci_bar, const char *name) -+{ -+ unsigned long addr, len; -+ void *internal_addr; -+ -+ if (n >= ARRAY_SIZE(info->mem)) -+ return -EINVAL; -+ -+ addr = pci_resource_start(dev, pci_bar); -+ len = pci_resource_len(dev, pci_bar); -+ if (addr == 0 || len == 0) -+ return -1; -+ if (wc_activate == 0) { -+ internal_addr = ioremap(addr, len); -+ if (internal_addr == NULL) -+ return -1; -+ } else { -+ internal_addr = NULL; -+ } -+ info->mem[n].name = name; -+ info->mem[n].addr = addr; -+ info->mem[n].internal_addr = internal_addr; -+ info->mem[n].size = len; -+ info->mem[n].memtype = UIO_MEM_PHYS; -+ return 0; -+} -+ -+/* Get pci port io resources described by bar #pci_bar in uio resource n. */ -+static int -+igbuio_pci_setup_ioport(struct pci_dev *dev, struct uio_info *info, -+ int n, int pci_bar, const char *name) -+{ -+ unsigned long addr, len; -+ -+ if (n >= ARRAY_SIZE(info->port)) -+ return -EINVAL; -+ -+ addr = pci_resource_start(dev, pci_bar); -+ len = pci_resource_len(dev, pci_bar); -+ if (addr == 0 || len == 0) -+ return -EINVAL; -+ -+ info->port[n].name = name; -+ info->port[n].start = addr; -+ info->port[n].size = len; -+ info->port[n].porttype = UIO_PORT_X86; -+ -+ return 0; -+} -+ -+/* Unmap previously ioremap'd resources */ -+static void -+igbuio_pci_release_iomem(struct uio_info *info) -+{ -+ int i; -+ -+ for (i = 0; i < MAX_UIO_MAPS; i++) { -+ if (info->mem[i].internal_addr) -+ iounmap(info->mem[i].internal_addr); -+ } -+} -+ -+static int -+igbuio_setup_bars(struct pci_dev *dev, struct uio_info *info) -+{ -+ int i, iom, iop, ret; -+ unsigned long flags; -+ static const char *bar_names[PCI_STD_RESOURCE_END + 1] = { -+ "BAR0", -+ "BAR1", -+ "BAR2", -+ "BAR3", -+ "BAR4", -+ "BAR5", -+ }; -+ -+ iom = 0; -+ iop = 0; -+ -+ for (i = 0; i < ARRAY_SIZE(bar_names); i++) { -+ if (pci_resource_len(dev, i) != 0 && -+ pci_resource_start(dev, i) != 0) { -+ flags = pci_resource_flags(dev, i); -+ if (flags & IORESOURCE_MEM) { -+ ret = igbuio_pci_setup_iomem(dev, info, iom, -+ i, bar_names[i]); -+ if (ret != 0) -+ return ret; -+ iom++; -+ } else if (flags & IORESOURCE_IO) { -+ ret = igbuio_pci_setup_ioport(dev, info, iop, -+ i, bar_names[i]); -+ if (ret != 0) -+ return ret; -+ iop++; -+ } -+ } -+ } -+ -+ return (iom != 0 || iop != 0) ? ret : -ENOENT; -+} -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -+static int __devinit -+#else -+static int -+#endif -+igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) -+{ -+ struct rte_uio_pci_dev *udev; -+ dma_addr_t map_dma_addr; -+ void *map_addr; -+ int err; -+ -+#ifdef HAVE_PCI_IS_BRIDGE_API -+ if (pci_is_bridge(dev)) { -+ dev_warn(&dev->dev, "Ignoring PCI bridge device\n"); -+ return -ENODEV; -+ } -+#endif -+ -+ udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL); -+ if (!udev) -+ return -ENOMEM; -+ -+ /* -+ * enable device: ask low-level code to enable I/O and -+ * memory -+ */ -+ err = pci_enable_device(dev); -+ if (err != 0) { -+ dev_err(&dev->dev, "Cannot enable PCI device\n"); -+ goto fail_free; -+ } -+ -+ /* enable bus mastering on the device */ -+ pci_set_master(dev); -+ -+ /* remap IO memory */ -+ err = igbuio_setup_bars(dev, &udev->info); -+ if (err != 0) -+ goto fail_release_iomem; -+ -+ /* set 64-bit DMA mask */ -+ err = pci_set_dma_mask(dev, DMA_BIT_MASK(64)); -+ if (err != 0) { -+ dev_err(&dev->dev, "Cannot set DMA mask\n"); -+ goto fail_release_iomem; -+ } -+ -+ err = pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64)); -+ if (err != 0) { -+ dev_err(&dev->dev, "Cannot set consistent DMA mask\n"); -+ goto fail_release_iomem; -+ } -+ -+ /* fill uio infos */ -+ udev->info.name = "igb_uio"; -+ udev->info.version = "0.1"; -+ udev->info.irqcontrol = igbuio_pci_irqcontrol; -+ udev->info.open = igbuio_pci_open; -+ udev->info.release = igbuio_pci_release; -+ udev->info.priv = udev; -+ udev->pdev = dev; -+ atomic_set(&udev->refcnt, 0); -+ -+ err = sysfs_create_group(&dev->dev.kobj, &dev_attr_grp); -+ if (err != 0) -+ goto fail_release_iomem; -+ -+ /* register uio driver */ -+ err = uio_register_device(&dev->dev, &udev->info); -+ if (err != 0) -+ goto fail_remove_group; -+ -+ pci_set_drvdata(dev, udev); -+ -+ /* -+ * Doing a harmless dma mapping for attaching the device to -+ * the iommu identity mapping if kernel boots with iommu=pt. -+ * Note this is not a problem if no IOMMU at all. -+ */ -+ map_addr = dma_alloc_coherent(&dev->dev, 1024, &map_dma_addr, -+ GFP_KERNEL); -+ if (map_addr) -+ memset(map_addr, 0, 1024); -+ -+ if (!map_addr) -+ dev_info(&dev->dev, "dma mapping failed\n"); -+ else { -+ dev_info(&dev->dev, "mapping 1K dma=%#llx host=%p\n", -+ (unsigned long long)map_dma_addr, map_addr); -+ -+ dma_free_coherent(&dev->dev, 1024, map_addr, map_dma_addr); -+ dev_info(&dev->dev, "unmapping 1K dma=%#llx host=%p\n", -+ (unsigned long long)map_dma_addr, map_addr); -+ } -+ -+ return 0; -+ -+fail_remove_group: -+ sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp); -+fail_release_iomem: -+ igbuio_pci_release_iomem(&udev->info); -+ pci_disable_device(dev); -+fail_free: -+ kfree(udev); -+ -+ return err; -+} -+ -+static void -+igbuio_pci_remove(struct pci_dev *dev) -+{ -+ struct rte_uio_pci_dev *udev = pci_get_drvdata(dev); -+ -+ igbuio_pci_release(&udev->info, NULL); -+ -+ sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp); -+ uio_unregister_device(&udev->info); -+ igbuio_pci_release_iomem(&udev->info); -+ pci_disable_device(dev); -+ pci_set_drvdata(dev, NULL); -+ kfree(udev); -+} -+ -+static int -+igbuio_config_intr_mode(char *intr_str) -+{ -+ if (!intr_str) { -+ pr_info("Use MSIX interrupt by default\n"); -+ return 0; -+ } -+ -+ if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) { -+ igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; -+ pr_info("Use MSIX interrupt\n"); -+ } else if (!strcmp(intr_str, RTE_INTR_MODE_MSI_NAME)) { -+ igbuio_intr_mode_preferred = RTE_INTR_MODE_MSI; -+ pr_info("Use MSI interrupt\n"); -+ } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) { -+ igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY; -+ pr_info("Use legacy interrupt\n"); -+ } else { -+ pr_info("Error: bad parameter - %s\n", intr_str); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static struct pci_driver igbuio_pci_driver = { -+ .name = "igb_uio", -+ .id_table = NULL, -+ .probe = igbuio_pci_probe, -+ .remove = igbuio_pci_remove, -+}; -+ -+static int __init -+igbuio_pci_init_module(void) -+{ -+ int ret; -+ -+ if (igbuio_kernel_is_locked_down()) { -+ pr_err("Not able to use module, kernel lock down is enabled\n"); -+ return -EINVAL; -+ } -+ -+ if (wc_activate != 0) -+ pr_info("wc_activate is set\n"); -+ -+ ret = igbuio_config_intr_mode(intr_mode); -+ if (ret < 0) -+ return ret; -+ -+ return pci_register_driver(&igbuio_pci_driver); -+} -+ -+static void __exit -+igbuio_pci_exit_module(void) -+{ -+ pci_unregister_driver(&igbuio_pci_driver); -+} -+ -+module_init(igbuio_pci_init_module); -+module_exit(igbuio_pci_exit_module); -+ -+module_param(intr_mode, charp, S_IRUGO); -+MODULE_PARM_DESC(intr_mode, -+"igb_uio interrupt mode (default=msix):\n" -+" " RTE_INTR_MODE_MSIX_NAME " Use MSIX interrupt\n" -+" " RTE_INTR_MODE_MSI_NAME " Use MSI interrupt\n" -+" " RTE_INTR_MODE_LEGACY_NAME " Use Legacy interrupt\n" -+"\n"); -+ -+module_param(wc_activate, int, 0); -+MODULE_PARM_DESC(wc_activate, -+"Activate support for write combining (WC) (default=0)\n" -+" 0 - disable\n" -+" other - enable\n"); -+ -+MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards"); -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Intel Corporation"); -diff --git a/kernel/linux/igb_uio/meson.build b/kernel/linux/igb_uio/meson.build -new file mode 100644 -index 0000000000..ff8f97ca23 ---- /dev/null -+++ b/kernel/linux/igb_uio/meson.build -@@ -0,0 +1,27 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2018 Luca Boccassi -+ -+# For SUSE build check function arguments of ndo_tx_timeout API -+# Ref: https://jira.devtools.intel.com/browse/DPDK-29263 -+kmod_cflags = '' -+ -+igb_uio_mkfile = custom_target('igb_uio_makefile', -+ output: 'Makefile', -+ command: ['touch', '@OUTPUT@']) -+ -+igb_uio_sources = files( -+ 'igb_uio.c', -+ 'Kbuild', -+) -+ -+custom_target('igb_uio', -+ input: igb_uio_sources, -+ output: 'igb_uio.ko', -+ command: ['make', '-j4', '-C', kernel_build_dir, -+ 'M=' + meson.current_build_dir(), -+ 'src=' + meson.current_source_dir(), -+ 'modules'] + cross_args, -+ depends: igb_uio_mkfile, -+ install: install, -+ install_dir: kernel_install_dir, -+ build_by_default: get_option('enable_kmods')) -diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build -index 0637452e95..3230368f14 100644 ---- a/kernel/linux/meson.build -+++ b/kernel/linux/meson.build -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: BSD-3-Clause - # Copyright(c) 2018 Intel Corporation - --subdirs = ['kni'] -+subdirs = ['kni', 'igb_uio'] - - kernel_build_dir = get_option('kernel_dir') - kernel_source_dir = get_option('kernel_dir') -diff --git a/meson_options.txt b/meson_options.txt -index 7c220ad68d..d2e172facd 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -18,7 +18,7 @@ option('enable_drivers', type: 'string', value: '', description: - 'Comma-separated list of drivers to build. If unspecified, build all drivers.') - option('enable_driver_sdk', type: 'boolean', value: false, description: - 'Install headers to build drivers.') --option('enable_kmods', type: 'boolean', value: false, description: -+option('enable_kmods', type: 'boolean', value: true, description: - 'build kernel modules') - option('examples', type: 'string', value: '', description: - 'Comma-separated list of examples to build by default') --- -2.27.0 diff --git a/0001-add-igb_uio.patch b/0001-add-igb_uio.patch new file mode 100644 index 0000000..73543f2 --- /dev/null +++ b/0001-add-igb_uio.patch @@ -0,0 +1,1039 @@ +From a239b771c8f052b5925c5eff6b41733f374984d1 Mon Sep 17 00:00:00 2001 +From: jiangheng +Date: Tue, 9 Jan 2024 15:12:34 +0800 +Subject: [PATCH] add igb_uio + +--- + kernel/linux/igb_uio/Kbuild | 2 + + kernel/linux/igb_uio/Makefile | 7 + + kernel/linux/igb_uio/compat.h | 168 ++++++++ + kernel/linux/igb_uio/igb_uio.c | 668 +++++++++++++++++++++++++++++++ + kernel/linux/igb_uio/meson.build | 27 ++ + kernel/linux/meson.build | 96 +++++ + kernel/meson.build | 4 +- + 7 files changed, 969 insertions(+), 3 deletions(-) + create mode 100644 kernel/linux/igb_uio/Kbuild + create mode 100644 kernel/linux/igb_uio/Makefile + create mode 100644 kernel/linux/igb_uio/compat.h + create mode 100644 kernel/linux/igb_uio/igb_uio.c + create mode 100644 kernel/linux/igb_uio/meson.build + create mode 100644 kernel/linux/meson.build + +diff --git a/kernel/linux/igb_uio/Kbuild b/kernel/linux/igb_uio/Kbuild +new file mode 100644 +index 0000000000..3ab85c4116 +--- /dev/null ++++ b/kernel/linux/igb_uio/Kbuild +@@ -0,0 +1,2 @@ ++ccflags-y := $(MODULE_CFLAGS) ++obj-m := igb_uio.o +diff --git a/kernel/linux/igb_uio/Makefile b/kernel/linux/igb_uio/Makefile +new file mode 100644 +index 0000000000..bd2e356c0c +--- /dev/null ++++ b/kernel/linux/igb_uio/Makefile +@@ -0,0 +1,7 @@ ++KSRC ?= /lib/modules/$(shell uname -r)/build ++ ++all: ++ make -C $(KSRC)/ M=$(CURDIR) ++ ++%: ++ make -C $(KSRC)/ M=$(CURDIR) $@ +diff --git a/kernel/linux/igb_uio/compat.h b/kernel/linux/igb_uio/compat.h +new file mode 100644 +index 0000000000..71172f40cf +--- /dev/null ++++ b/kernel/linux/igb_uio/compat.h +@@ -0,0 +1,168 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Minimal wrappers to allow compiling igb_uio on older kernels. ++ */ ++ ++#ifndef RHEL_RELEASE_VERSION ++#define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b)) ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) ++#define pci_cfg_access_lock pci_block_user_cfg_access ++#define pci_cfg_access_unlock pci_unblock_user_cfg_access ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0) ++#define HAVE_PTE_MASK_PAGE_IOMAP ++#endif ++ ++#ifndef PCI_MSIX_ENTRY_SIZE ++#define PCI_MSIX_ENTRY_SIZE 16 ++#define PCI_MSIX_ENTRY_VECTOR_CTRL 12 ++#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 ++#endif ++ ++/* ++ * for kernels < 2.6.38 and backported patch that moves MSI-X entry definition ++ * to pci_regs.h Those kernels has PCI_MSIX_ENTRY_SIZE defined but not ++ * PCI_MSIX_ENTRY_CTRL_MASKBIT ++ */ ++#ifndef PCI_MSIX_ENTRY_CTRL_MASKBIT ++#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1 ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34) && \ ++ (!(defined(RHEL_RELEASE_CODE) && \ ++ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(5, 9))) ++ ++static int pci_num_vf(struct pci_dev *dev) ++{ ++ struct iov { ++ int pos; ++ int nres; ++ u32 cap; ++ u16 ctrl; ++ u16 total; ++ u16 initial; ++ u16 nr_virtfn; ++ } *iov = (struct iov *)dev->sriov; ++ ++ if (!dev->is_physfn) ++ return 0; ++ ++ return iov->nr_virtfn; ++} ++ ++#endif /* < 2.6.34 */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \ ++ (!(defined(RHEL_RELEASE_CODE) && \ ++ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4))) ++ ++#define kstrtoul strict_strtoul ++ ++#endif /* < 2.6.39 */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0) && \ ++ (!(defined(RHEL_RELEASE_CODE) && \ ++ RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 3))) ++ ++/* Check if INTX works to control irq's. ++ * Set's INTX_DISABLE flag and reads it back ++ */ ++static bool pci_intx_mask_supported(struct pci_dev *pdev) ++{ ++ bool mask_supported = false; ++ uint16_t orig, new; ++ ++ pci_block_user_cfg_access(pdev); ++ pci_read_config_word(pdev, PCI_COMMAND, &orig); ++ pci_write_config_word(pdev, PCI_COMMAND, ++ orig ^ PCI_COMMAND_INTX_DISABLE); ++ pci_read_config_word(pdev, PCI_COMMAND, &new); ++ ++ if ((new ^ orig) & ~PCI_COMMAND_INTX_DISABLE) { ++ dev_err(&pdev->dev, "Command register changed from " ++ "0x%x to 0x%x: driver or hardware bug?\n", orig, new); ++ } else if ((new ^ orig) & PCI_COMMAND_INTX_DISABLE) { ++ mask_supported = true; ++ pci_write_config_word(pdev, PCI_COMMAND, orig); ++ } ++ pci_unblock_user_cfg_access(pdev); ++ ++ return mask_supported; ++} ++ ++static bool pci_check_and_mask_intx(struct pci_dev *pdev) ++{ ++ bool pending; ++ uint32_t status; ++ ++ pci_block_user_cfg_access(pdev); ++ pci_read_config_dword(pdev, PCI_COMMAND, &status); ++ ++ /* interrupt is not ours, goes to out */ ++ pending = (((status >> 16) & PCI_STATUS_INTERRUPT) != 0); ++ if (pending) { ++ uint16_t old, new; ++ ++ old = status; ++ if (status != 0) ++ new = old & (~PCI_COMMAND_INTX_DISABLE); ++ else ++ new = old | PCI_COMMAND_INTX_DISABLE; ++ ++ if (old != new) ++ pci_write_config_word(pdev, PCI_COMMAND, new); ++ } ++ pci_unblock_user_cfg_access(pdev); ++ ++ return pending; ++} ++ ++#endif /* < 3.3.0 */ ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0) ++#define HAVE_PCI_IS_BRIDGE_API 1 ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) ++#define HAVE_MSI_LIST_IN_GENERIC_DEVICE 1 ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0) ++#define HAVE_PCI_MSI_MASK_IRQ 1 ++#endif ++ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) ++#define HAVE_ALLOC_IRQ_VECTORS 1 ++#endif ++ ++static inline bool igbuio_kernel_is_locked_down(void) ++{ ++#ifdef CONFIG_LOCK_DOWN_KERNEL ++#ifdef CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT ++ return kernel_is_locked_down(NULL); ++#elif defined(CONFIG_EFI_SECURE_BOOT_LOCK_DOWN) ++ return kernel_is_locked_down(); ++#else ++ return false; ++#endif ++#else ++ return false; ++#endif ++} ++ ++#ifndef fallthrough ++ ++#ifndef __has_attribute ++#define __has_attribute(x) 0 ++#endif ++ ++#if __has_attribute(__fallthrough__) ++#define fallthrough __attribute__((__fallthrough__)) ++#else ++#define fallthrough do {} while (0) /* fallthrough */ ++#endif ++ ++#endif +diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c +new file mode 100644 +index 0000000000..aea67dac46 +--- /dev/null ++++ b/kernel/linux/igb_uio/igb_uio.c +@@ -0,0 +1,668 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/*- ++ * Copyright(c) 2010-2017 Intel Corporation. All rights reserved. ++ */ ++ ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/** ++ * These enum and macro definitions are copied from the ++ * file rte_pci_dev_features.h ++ */ ++enum rte_intr_mode { ++ RTE_INTR_MODE_NONE = 0, ++ RTE_INTR_MODE_LEGACY, ++ RTE_INTR_MODE_MSI, ++ RTE_INTR_MODE_MSIX ++}; ++#define RTE_INTR_MODE_NONE_NAME "none" ++#define RTE_INTR_MODE_LEGACY_NAME "legacy" ++#define RTE_INTR_MODE_MSI_NAME "msi" ++#define RTE_INTR_MODE_MSIX_NAME "msix" ++ ++ ++#include "compat.h" ++ ++/** ++ * A structure describing the private information for a uio device. ++ */ ++struct rte_uio_pci_dev { ++ struct uio_info info; ++ struct pci_dev *pdev; ++ enum rte_intr_mode mode; ++ atomic_t refcnt; ++}; ++ ++static int wc_activate; ++static char *intr_mode; ++static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; ++/* sriov sysfs */ ++static ssize_t ++show_max_vfs(struct device *dev, struct device_attribute *attr, ++ char *buf) ++{ ++ return snprintf(buf, 10, "%u\n", dev_num_vf(dev)); ++} ++ ++static ssize_t ++store_max_vfs(struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ int err = 0; ++ unsigned long max_vfs; ++ struct pci_dev *pdev = to_pci_dev(dev); ++ ++ if (0 != kstrtoul(buf, 0, &max_vfs)) ++ return -EINVAL; ++ ++ if (0 == max_vfs) ++ pci_disable_sriov(pdev); ++ else if (0 == pci_num_vf(pdev)) ++ err = pci_enable_sriov(pdev, max_vfs); ++ else /* do nothing if change max_vfs number */ ++ err = -EINVAL; ++ ++ return err ? err : count; ++} ++ ++static DEVICE_ATTR(max_vfs, S_IRUGO | S_IWUSR, show_max_vfs, store_max_vfs); ++ ++static struct attribute *dev_attrs[] = { ++ &dev_attr_max_vfs.attr, ++ NULL, ++}; ++ ++static const struct attribute_group dev_attr_grp = { ++ .attrs = dev_attrs, ++}; ++ ++#ifndef HAVE_PCI_MSI_MASK_IRQ ++/* ++ * It masks the msix on/off of generating MSI-X messages. ++ */ ++static void ++igbuio_msix_mask_irq(struct msi_desc *desc, s32 state) ++{ ++ u32 mask_bits = desc->masked; ++ unsigned int offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + ++ PCI_MSIX_ENTRY_VECTOR_CTRL; ++ ++ if (state != 0) ++ mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; ++ else ++ mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; ++ ++ if (mask_bits != desc->masked) { ++ writel(mask_bits, desc->mask_base + offset); ++ readl(desc->mask_base); ++ desc->masked = mask_bits; ++ } ++} ++ ++/* ++ * It masks the msi on/off of generating MSI messages. ++ */ ++static void ++igbuio_msi_mask_irq(struct pci_dev *pdev, struct msi_desc *desc, int32_t state) ++{ ++ u32 mask_bits = desc->masked; ++ u32 offset = desc->irq - pdev->irq; ++ u32 mask = 1 << offset; ++ ++ if (!desc->msi_attrib.maskbit) ++ return; ++ ++ if (state != 0) ++ mask_bits &= ~mask; ++ else ++ mask_bits |= mask; ++ ++ if (mask_bits != desc->masked) { ++ pci_write_config_dword(pdev, desc->mask_pos, mask_bits); ++ desc->masked = mask_bits; ++ } ++} ++ ++static void ++igbuio_mask_irq(struct pci_dev *pdev, enum rte_intr_mode mode, s32 irq_state) ++{ ++ struct msi_desc *desc; ++ struct list_head *msi_list; ++ ++#ifdef HAVE_MSI_LIST_IN_GENERIC_DEVICE ++ msi_list = &pdev->dev.msi_list; ++#else ++ msi_list = &pdev->msi_list; ++#endif ++ ++ if (mode == RTE_INTR_MODE_MSIX) { ++ list_for_each_entry(desc, msi_list, list) ++ igbuio_msix_mask_irq(desc, irq_state); ++ } else if (mode == RTE_INTR_MODE_MSI) { ++ list_for_each_entry(desc, msi_list, list) ++ igbuio_msi_mask_irq(pdev, desc, irq_state); ++ } ++} ++#endif ++ ++/** ++ * This is the irqcontrol callback to be registered to uio_info. ++ * It can be used to disable/enable interrupt from user space processes. ++ * ++ * @param info ++ * pointer to uio_info. ++ * @param irq_state ++ * state value. 1 to enable interrupt, 0 to disable interrupt. ++ * ++ * @return ++ * - On success, 0. ++ * - On failure, a negative value. ++ */ ++static int ++igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state) ++{ ++ struct rte_uio_pci_dev *udev = info->priv; ++ struct pci_dev *pdev = udev->pdev; ++ ++#ifdef HAVE_PCI_MSI_MASK_IRQ ++ struct irq_data *irq = irq_get_irq_data(udev->info.irq); ++#endif ++ ++ pci_cfg_access_lock(pdev); ++ ++ if (udev->mode == RTE_INTR_MODE_MSIX || udev->mode == RTE_INTR_MODE_MSI) { ++#ifdef HAVE_PCI_MSI_MASK_IRQ ++ if (irq_state == 1) ++ pci_msi_unmask_irq(irq); ++ else ++ pci_msi_mask_irq(irq); ++#else ++ igbuio_mask_irq(pdev, udev->mode, irq_state); ++#endif ++ } ++ ++ if (udev->mode == RTE_INTR_MODE_LEGACY) ++ pci_intx(pdev, !!irq_state); ++ ++ pci_cfg_access_unlock(pdev); ++ ++ return 0; ++} ++ ++/** ++ * This is interrupt handler which will check if the interrupt is for the right device. ++ * If yes, disable it here and will be enable later. ++ */ ++static irqreturn_t ++igbuio_pci_irqhandler(int irq, void *dev_id) ++{ ++ struct rte_uio_pci_dev *udev = (struct rte_uio_pci_dev *)dev_id; ++ struct uio_info *info = &udev->info; ++ ++ /* Legacy mode need to mask in hardware */ ++ if (udev->mode == RTE_INTR_MODE_LEGACY && ++ !pci_check_and_mask_intx(udev->pdev)) ++ return IRQ_NONE; ++ ++ uio_event_notify(info); ++ ++ /* Message signal mode, no share IRQ and automasked */ ++ return IRQ_HANDLED; ++} ++ ++static int ++igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) ++{ ++ int err = 0; ++#ifndef HAVE_ALLOC_IRQ_VECTORS ++ struct msix_entry msix_entry; ++#endif ++ ++ switch (igbuio_intr_mode_preferred) { ++ case RTE_INTR_MODE_MSIX: ++ /* Only 1 msi-x vector needed */ ++#ifndef HAVE_ALLOC_IRQ_VECTORS ++ msix_entry.entry = 0; ++ if (pci_enable_msix(udev->pdev, &msix_entry, 1) == 0) { ++ dev_dbg(&udev->pdev->dev, "using MSI-X"); ++ udev->info.irq_flags = IRQF_NO_THREAD; ++ udev->info.irq = msix_entry.vector; ++ udev->mode = RTE_INTR_MODE_MSIX; ++ break; ++ } ++#else ++ if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSIX) == 1) { ++ dev_dbg(&udev->pdev->dev, "using MSI-X"); ++ udev->info.irq_flags = IRQF_NO_THREAD; ++ udev->info.irq = pci_irq_vector(udev->pdev, 0); ++ udev->mode = RTE_INTR_MODE_MSIX; ++ break; ++ } ++#endif ++ ++ fallthrough; ++ case RTE_INTR_MODE_MSI: ++#ifndef HAVE_ALLOC_IRQ_VECTORS ++ if (pci_enable_msi(udev->pdev) == 0) { ++ dev_dbg(&udev->pdev->dev, "using MSI"); ++ udev->info.irq_flags = IRQF_NO_THREAD; ++ udev->info.irq = udev->pdev->irq; ++ udev->mode = RTE_INTR_MODE_MSI; ++ break; ++ } ++#else ++ if (pci_alloc_irq_vectors(udev->pdev, 1, 1, PCI_IRQ_MSI) == 1) { ++ dev_dbg(&udev->pdev->dev, "using MSI"); ++ udev->info.irq_flags = IRQF_NO_THREAD; ++ udev->info.irq = pci_irq_vector(udev->pdev, 0); ++ udev->mode = RTE_INTR_MODE_MSI; ++ break; ++ } ++#endif ++ fallthrough; ++ case RTE_INTR_MODE_LEGACY: ++ if (pci_intx_mask_supported(udev->pdev)) { ++ dev_dbg(&udev->pdev->dev, "using INTX"); ++ udev->info.irq_flags = IRQF_SHARED | IRQF_NO_THREAD; ++ udev->info.irq = udev->pdev->irq; ++ udev->mode = RTE_INTR_MODE_LEGACY; ++ break; ++ } ++ dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n"); ++ fallthrough; ++ case RTE_INTR_MODE_NONE: ++ udev->mode = RTE_INTR_MODE_NONE; ++ udev->info.irq = UIO_IRQ_NONE; ++ break; ++ ++ default: ++ dev_err(&udev->pdev->dev, "invalid IRQ mode %u", ++ igbuio_intr_mode_preferred); ++ udev->info.irq = UIO_IRQ_NONE; ++ err = -EINVAL; ++ } ++ ++ if (udev->info.irq != UIO_IRQ_NONE) ++ err = request_irq(udev->info.irq, igbuio_pci_irqhandler, ++ udev->info.irq_flags, udev->info.name, ++ udev); ++ dev_info(&udev->pdev->dev, "uio device registered with irq %ld\n", ++ udev->info.irq); ++ ++ return err; ++} ++ ++static void ++igbuio_pci_disable_interrupts(struct rte_uio_pci_dev *udev) ++{ ++ if (udev->info.irq) { ++ free_irq(udev->info.irq, udev); ++ udev->info.irq = 0; ++ } ++ ++#ifndef HAVE_ALLOC_IRQ_VECTORS ++ if (udev->mode == RTE_INTR_MODE_MSIX) ++ pci_disable_msix(udev->pdev); ++ if (udev->mode == RTE_INTR_MODE_MSI) ++ pci_disable_msi(udev->pdev); ++#else ++ if (udev->mode == RTE_INTR_MODE_MSIX || ++ udev->mode == RTE_INTR_MODE_MSI) ++ pci_free_irq_vectors(udev->pdev); ++#endif ++} ++ ++ ++/** ++ * This gets called while opening uio device file. ++ */ ++static int ++igbuio_pci_open(struct uio_info *info, struct inode *inode) ++{ ++ struct rte_uio_pci_dev *udev = info->priv; ++ struct pci_dev *dev = udev->pdev; ++ int err; ++ ++ if (atomic_inc_return(&udev->refcnt) != 1) ++ return 0; ++ ++ /* set bus master, which was cleared by the reset function */ ++ pci_set_master(dev); ++ ++ /* enable interrupts */ ++ err = igbuio_pci_enable_interrupts(udev); ++ if (err) { ++ atomic_dec(&udev->refcnt); ++ dev_err(&dev->dev, "Enable interrupt fails\n"); ++ } ++ return err; ++} ++ ++static int ++igbuio_pci_release(struct uio_info *info, struct inode *inode) ++{ ++ struct rte_uio_pci_dev *udev = info->priv; ++ struct pci_dev *dev = udev->pdev; ++ ++ if (atomic_dec_and_test(&udev->refcnt)) { ++ /* disable interrupts */ ++ igbuio_pci_disable_interrupts(udev); ++ ++ /* stop the device from further DMA */ ++ pci_clear_master(dev); ++ } ++ ++ return 0; ++} ++ ++/* Remap pci resources described by bar #pci_bar in uio resource n. */ ++static int ++igbuio_pci_setup_iomem(struct pci_dev *dev, struct uio_info *info, ++ int n, int pci_bar, const char *name) ++{ ++ unsigned long addr, len; ++ void *internal_addr; ++ ++ if (n >= ARRAY_SIZE(info->mem)) ++ return -EINVAL; ++ ++ addr = pci_resource_start(dev, pci_bar); ++ len = pci_resource_len(dev, pci_bar); ++ if (addr == 0 || len == 0) ++ return -1; ++ if (wc_activate == 0) { ++ internal_addr = ioremap(addr, len); ++ if (internal_addr == NULL) ++ return -1; ++ } else { ++ internal_addr = NULL; ++ } ++ info->mem[n].name = name; ++ info->mem[n].addr = addr; ++ info->mem[n].internal_addr = internal_addr; ++ info->mem[n].size = len; ++ info->mem[n].memtype = UIO_MEM_PHYS; ++ return 0; ++} ++ ++/* Get pci port io resources described by bar #pci_bar in uio resource n. */ ++static int ++igbuio_pci_setup_ioport(struct pci_dev *dev, struct uio_info *info, ++ int n, int pci_bar, const char *name) ++{ ++ unsigned long addr, len; ++ ++ if (n >= ARRAY_SIZE(info->port)) ++ return -EINVAL; ++ ++ addr = pci_resource_start(dev, pci_bar); ++ len = pci_resource_len(dev, pci_bar); ++ if (addr == 0 || len == 0) ++ return -EINVAL; ++ ++ info->port[n].name = name; ++ info->port[n].start = addr; ++ info->port[n].size = len; ++ info->port[n].porttype = UIO_PORT_X86; ++ ++ return 0; ++} ++ ++/* Unmap previously ioremap'd resources */ ++static void ++igbuio_pci_release_iomem(struct uio_info *info) ++{ ++ int i; ++ ++ for (i = 0; i < MAX_UIO_MAPS; i++) { ++ if (info->mem[i].internal_addr) ++ iounmap(info->mem[i].internal_addr); ++ } ++} ++ ++static int ++igbuio_setup_bars(struct pci_dev *dev, struct uio_info *info) ++{ ++ int i, iom, iop, ret; ++ unsigned long flags; ++ static const char *bar_names[PCI_STD_RESOURCE_END + 1] = { ++ "BAR0", ++ "BAR1", ++ "BAR2", ++ "BAR3", ++ "BAR4", ++ "BAR5", ++ }; ++ ++ iom = 0; ++ iop = 0; ++ ++ for (i = 0; i < ARRAY_SIZE(bar_names); i++) { ++ if (pci_resource_len(dev, i) != 0 && ++ pci_resource_start(dev, i) != 0) { ++ flags = pci_resource_flags(dev, i); ++ if (flags & IORESOURCE_MEM) { ++ ret = igbuio_pci_setup_iomem(dev, info, iom, ++ i, bar_names[i]); ++ if (ret != 0) ++ return ret; ++ iom++; ++ } else if (flags & IORESOURCE_IO) { ++ ret = igbuio_pci_setup_ioport(dev, info, iop, ++ i, bar_names[i]); ++ if (ret != 0) ++ return ret; ++ iop++; ++ } ++ } ++ } ++ ++ return (iom != 0 || iop != 0) ? ret : -ENOENT; ++} ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) ++static int __devinit ++#else ++static int ++#endif ++igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) ++{ ++ struct rte_uio_pci_dev *udev; ++ dma_addr_t map_dma_addr; ++ void *map_addr; ++ int err; ++ ++#ifdef HAVE_PCI_IS_BRIDGE_API ++ if (pci_is_bridge(dev)) { ++ dev_warn(&dev->dev, "Ignoring PCI bridge device\n"); ++ return -ENODEV; ++ } ++#endif ++ ++ udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL); ++ if (!udev) ++ return -ENOMEM; ++ ++ /* ++ * enable device: ask low-level code to enable I/O and ++ * memory ++ */ ++ err = pci_enable_device(dev); ++ if (err != 0) { ++ dev_err(&dev->dev, "Cannot enable PCI device\n"); ++ goto fail_free; ++ } ++ ++ /* enable bus mastering on the device */ ++ pci_set_master(dev); ++ ++ /* remap IO memory */ ++ err = igbuio_setup_bars(dev, &udev->info); ++ if (err != 0) ++ goto fail_release_iomem; ++ ++ /* set 64-bit DMA mask */ ++ err = dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(64)); ++ if (err != 0) { ++ dev_err(&dev->dev, "Cannot set DMA mask\n"); ++ goto fail_release_iomem; ++ } ++ ++ /* fill uio infos */ ++ udev->info.name = "igb_uio"; ++ udev->info.version = "0.1"; ++ udev->info.irqcontrol = igbuio_pci_irqcontrol; ++ udev->info.open = igbuio_pci_open; ++ udev->info.release = igbuio_pci_release; ++ udev->info.priv = udev; ++ udev->pdev = dev; ++ atomic_set(&udev->refcnt, 0); ++ ++ err = sysfs_create_group(&dev->dev.kobj, &dev_attr_grp); ++ if (err != 0) ++ goto fail_release_iomem; ++ ++ /* register uio driver */ ++ err = uio_register_device(&dev->dev, &udev->info); ++ if (err != 0) ++ goto fail_remove_group; ++ ++ pci_set_drvdata(dev, udev); ++ ++ /* ++ * Doing a harmless dma mapping for attaching the device to ++ * the iommu identity mapping if kernel boots with iommu=pt. ++ * Note this is not a problem if no IOMMU at all. ++ */ ++ map_addr = dma_alloc_coherent(&dev->dev, 1024, &map_dma_addr, ++ GFP_KERNEL); ++ if (map_addr) ++ memset(map_addr, 0, 1024); ++ ++ if (!map_addr) ++ dev_info(&dev->dev, "dma mapping failed\n"); ++ else { ++ dev_info(&dev->dev, "mapping 1K dma=%#llx host=%p\n", ++ (unsigned long long)map_dma_addr, map_addr); ++ ++ dma_free_coherent(&dev->dev, 1024, map_addr, map_dma_addr); ++ dev_info(&dev->dev, "unmapping 1K dma=%#llx host=%p\n", ++ (unsigned long long)map_dma_addr, map_addr); ++ } ++ ++ return 0; ++ ++fail_remove_group: ++ sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp); ++fail_release_iomem: ++ igbuio_pci_release_iomem(&udev->info); ++ pci_disable_device(dev); ++fail_free: ++ kfree(udev); ++ ++ return err; ++} ++ ++static void ++igbuio_pci_remove(struct pci_dev *dev) ++{ ++ struct rte_uio_pci_dev *udev = pci_get_drvdata(dev); ++ ++ igbuio_pci_release(&udev->info, NULL); ++ ++ sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp); ++ uio_unregister_device(&udev->info); ++ igbuio_pci_release_iomem(&udev->info); ++ pci_disable_device(dev); ++ pci_set_drvdata(dev, NULL); ++ kfree(udev); ++} ++ ++static int ++igbuio_config_intr_mode(char *intr_str) ++{ ++ if (!intr_str) { ++ pr_info("Use MSIX interrupt by default\n"); ++ return 0; ++ } ++ ++ if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) { ++ igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; ++ pr_info("Use MSIX interrupt\n"); ++ } else if (!strcmp(intr_str, RTE_INTR_MODE_MSI_NAME)) { ++ igbuio_intr_mode_preferred = RTE_INTR_MODE_MSI; ++ pr_info("Use MSI interrupt\n"); ++ } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) { ++ igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY; ++ pr_info("Use legacy interrupt\n"); ++ } else { ++ pr_info("Error: bad parameter - %s\n", intr_str); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static struct pci_driver igbuio_pci_driver = { ++ .name = "igb_uio", ++ .id_table = NULL, ++ .probe = igbuio_pci_probe, ++ .remove = igbuio_pci_remove, ++}; ++ ++static int __init ++igbuio_pci_init_module(void) ++{ ++ int ret; ++ ++ if (igbuio_kernel_is_locked_down()) { ++ pr_err("Not able to use module, kernel lock down is enabled\n"); ++ return -EINVAL; ++ } ++ ++ if (wc_activate != 0) ++ pr_info("wc_activate is set\n"); ++ ++ ret = igbuio_config_intr_mode(intr_mode); ++ if (ret < 0) ++ return ret; ++ ++ return pci_register_driver(&igbuio_pci_driver); ++} ++ ++static void __exit ++igbuio_pci_exit_module(void) ++{ ++ pci_unregister_driver(&igbuio_pci_driver); ++} ++ ++module_init(igbuio_pci_init_module); ++module_exit(igbuio_pci_exit_module); ++ ++module_param(intr_mode, charp, S_IRUGO); ++MODULE_PARM_DESC(intr_mode, ++"igb_uio interrupt mode (default=msix):\n" ++" " RTE_INTR_MODE_MSIX_NAME " Use MSIX interrupt\n" ++" " RTE_INTR_MODE_MSI_NAME " Use MSI interrupt\n" ++" " RTE_INTR_MODE_LEGACY_NAME " Use Legacy interrupt\n" ++"\n"); ++ ++module_param(wc_activate, int, 0); ++MODULE_PARM_DESC(wc_activate, ++"Activate support for write combining (WC) (default=0)\n" ++" 0 - disable\n" ++" other - enable\n"); ++ ++MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards"); ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Intel Corporation"); +diff --git a/kernel/linux/igb_uio/meson.build b/kernel/linux/igb_uio/meson.build +new file mode 100644 +index 0000000000..ff8f97ca23 +--- /dev/null ++++ b/kernel/linux/igb_uio/meson.build +@@ -0,0 +1,27 @@ ++# SPDX-License-Identifier: BSD-3-Clause ++# Copyright(c) 2018 Luca Boccassi ++ ++# For SUSE build check function arguments of ndo_tx_timeout API ++# Ref: https://jira.devtools.intel.com/browse/DPDK-29263 ++kmod_cflags = '' ++ ++igb_uio_mkfile = custom_target('igb_uio_makefile', ++ output: 'Makefile', ++ command: ['touch', '@OUTPUT@']) ++ ++igb_uio_sources = files( ++ 'igb_uio.c', ++ 'Kbuild', ++) ++ ++custom_target('igb_uio', ++ input: igb_uio_sources, ++ output: 'igb_uio.ko', ++ command: ['make', '-j4', '-C', kernel_build_dir, ++ 'M=' + meson.current_build_dir(), ++ 'src=' + meson.current_source_dir(), ++ 'modules'] + cross_args, ++ depends: igb_uio_mkfile, ++ install: install, ++ install_dir: kernel_install_dir, ++ build_by_default: get_option('enable_kmods')) +diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build +new file mode 100644 +index 0000000000..5edf1b5b2d +--- /dev/null ++++ b/kernel/linux/meson.build +@@ -0,0 +1,96 @@ ++# SPDX-License-Identifier: BSD-3-Clause ++# Copyright(c) 2018 Intel Corporation ++ ++subdirs = ['igb_uio'] ++ ++kernel_build_dir = get_option('kernel_dir') ++kernel_source_dir = get_option('kernel_dir') ++kernel_install_dir = '' ++install = not meson.is_cross_build() ++cross_args = [] ++ ++if not meson.is_cross_build() ++ # native build ++ kernel_version = run_command('uname', '-r').stdout().strip() ++ kernel_install_dir = '/lib/modules/' + kernel_version + '/extra/dpdk' ++ if kernel_build_dir == '' ++ # use default path for native builds ++ kernel_build_dir = '/lib/modules/' + kernel_version + '/build' ++ endif ++ if kernel_source_dir == '' ++ # use default path for native builds ++ kernel_source_dir = '/lib/modules/' + kernel_version + '/source' ++ endif ++ ++ # test running make in kernel directory, using "make kernelversion" ++ make_returncode = run_command('make', '-sC', kernel_build_dir, ++ 'kernelversion').returncode() ++ if make_returncode != 0 ++ # backward compatibility: ++ # the headers could still be in the 'build' subdir ++ if not kernel_build_dir.endswith('build') and not kernel_build_dir.endswith('build/') ++ kernel_build_dir = join_paths(kernel_build_dir, 'build') ++ make_returncode = run_command('make', '-sC', kernel_build_dir, ++ 'kernelversion').returncode() ++ endif ++ endif ++ ++ if make_returncode != 0 ++ error('Cannot compile kernel modules as requested - are kernel headers installed?') ++ endif ++ ++ # DO ACTUAL MODULE BUILDING ++ foreach d:subdirs ++ subdir(d) ++ endforeach ++ ++ subdir_done() ++endif ++ ++# cross build ++# if we are cross-compiling we need kernel_build_dir specified ++if kernel_build_dir == '' ++ error('Need "kernel_dir" option for kmod compilation when cross-compiling') ++endif ++cross_compiler = find_program('c').path() ++if cross_compiler.endswith('gcc') ++ cross_prefix = run_command([py3, '-c', 'print("' + cross_compiler + '"[:-3])']).stdout().strip() ++elif cross_compiler.endswith('clang') ++ cross_prefix = '' ++ found_target = false ++ # search for '-target' and use the arg that follows ++ # (i.e. the value of '-target') as cross_prefix ++ foreach cross_c_arg : meson.get_cross_property('c_args') ++ if found_target and cross_prefix == '' ++ cross_prefix = cross_c_arg ++ endif ++ if cross_c_arg == '-target' ++ found_target = true ++ endif ++ endforeach ++ if cross_prefix == '' ++ error('Did not find -target and its value in c_args in input cross-file.') ++ endif ++ linker = 'lld' ++ foreach cross_c_link_arg : meson.get_cross_property('c_link_args') ++ if cross_c_link_arg.startswith('-fuse-ld') ++ linker = cross_c_link_arg.split('=')[1] ++ endif ++ endforeach ++ cross_args += ['CC=@0@'.format(cross_compiler), 'LD=ld.@0@'.format(linker)] ++else ++ error('Unsupported cross compiler: @0@'.format(cross_compiler)) ++endif ++ ++cross_arch = host_machine.cpu_family() ++if host_machine.cpu_family() == 'aarch64' ++ cross_arch = 'arm64' ++endif ++ ++cross_args += ['ARCH=@0@'.format(cross_arch), ++ 'CROSS_COMPILE=@0@'.format(cross_prefix)] ++ ++# DO ACTUAL MODULE BUILDING ++foreach d:subdirs ++ subdir(d) ++endforeach +diff --git a/kernel/meson.build b/kernel/meson.build +index 417735b010..b247e2df42 100644 +--- a/kernel/meson.build ++++ b/kernel/meson.build +@@ -1,6 +1,4 @@ + # SPDX-License-Identifier: BSD-3-Clause + # Copyright(c) 2017 Intel Corporation + +-if is_freebsd +- subdir(exec_env) +-endif ++subdir(exec_env) +-- +2.33.0 diff --git a/0002-dpdk-add-secure-compile-option-and-fPIC-option.patch b/0002-dpdk-add-secure-compile-option-and-fPIC-option.patch deleted file mode 100644 index 4afcad1..0000000 --- a/0002-dpdk-add-secure-compile-option-and-fPIC-option.patch +++ /dev/null @@ -1,81 +0,0 @@ -From a655c865fce412d7e661d866bde0df30607fb6a4 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Thu, 16 Dec 2021 20:35:09 +0800 -Subject: [PATCH] huawei-0001-dpdk-add-secure-compile-option-and-fPIC - ---- - app/meson.build | 2 ++ - buildtools/chkincs/meson.build | 2 ++ - drivers/meson.build | 2 ++ - examples/meson.build | 2 ++ - lib/meson.build | 2 ++ - 5 files changed, 10 insertions(+) - -diff --git a/app/meson.build b/app/meson.build -index 93d8c15032..68be53c92d 100644 ---- a/app/meson.build -+++ b/app/meson.build -@@ -21,6 +21,8 @@ apps = [ - ] - - default_cflags = machine_args + ['-DALLOW_EXPERIMENTAL_API'] -+default_cflags += ['-fPIE', '-pie', '-fPIC', '-fstack-protector-strong', '-D_FORTIFY_SOURCE=2', '-O2', '-Wall', '-Werror'] -+default_cflags += ['-Wl,-z,relro,-z,now,-z,noexecstack', '-Wtrampolines'] - default_ldflags = [] - if get_option('default_library') == 'static' and not is_windows - default_ldflags += ['-Wl,--export-dynamic'] -diff --git a/buildtools/chkincs/meson.build b/buildtools/chkincs/meson.build -index 5ffca89761..e3d13a691c 100644 ---- a/buildtools/chkincs/meson.build -+++ b/buildtools/chkincs/meson.build -@@ -13,6 +13,8 @@ gen_c_files = generator(gen_c_file_for_header, - - cflags = machine_args - cflags += '-DALLOW_EXPERIMENTAL_API' -+cflags += ['-fPIE', '-pie', '-fPIC', '-fstack-protector-strong', '-D_FORTIFY_SOURCE=2', '-O2', '-Wall', '-Werror'] -+cflags += ['-Wl,-z,relro,-z,now,-z,noexecstack', '-Wtrampolines'] - - sources = files('main.c') - sources += gen_c_files.process(dpdk_chkinc_headers) -diff --git a/drivers/meson.build b/drivers/meson.build -index d5f4e1c1f2..9e71057afb 100644 ---- a/drivers/meson.build -+++ b/drivers/meson.build -@@ -45,6 +45,8 @@ enable_drivers += always_enable - default_cflags = machine_args - default_cflags += ['-DALLOW_EXPERIMENTAL_API'] - default_cflags += ['-DALLOW_INTERNAL_API'] -+default_cflags += ['-fPIE', '-pie', '-fPIC', '-fstack-protector-strong', '-D_FORTIFY_SOURCE=2', '-O2', '-Wall', '-Werror'] -+default_cflags += ['-Wl,-z,relro,-z,now,-z,noexecstack', '-Wtrampolines'] - - if cc.has_argument('-Wno-format-truncation') - default_cflags += '-Wno-format-truncation' -diff --git a/examples/meson.build b/examples/meson.build -index bac9b76007..db8603542f 100644 ---- a/examples/meson.build -+++ b/examples/meson.build -@@ -90,6 +90,8 @@ default_ldflags = dpdk_extra_ldflags - if get_option('default_library') == 'static' and not is_windows - default_ldflags += ['-Wl,--export-dynamic'] - endif -+default_cflags += ['-fPIE', '-pie', '-fPIC', '-fstack-protector-strong', '-D_FORTIFY_SOURCE=2', '-O2', '-Wall', '-Werror'] -+default_cflags += ['-Wl,-z,relro,-z,now,-z,noexecstack', '-Wtrampolines'] - - foreach example: examples - name = example.split('/')[-1] -diff --git a/lib/meson.build b/lib/meson.build -index 018976df17..668050dcc7 100644 ---- a/lib/meson.build -+++ b/lib/meson.build -@@ -94,6 +94,8 @@ endforeach - default_cflags = machine_args - default_cflags += ['-DALLOW_EXPERIMENTAL_API'] - default_cflags += ['-DALLOW_INTERNAL_API'] -+default_cflags += ['-fPIE', '-pie', '-fPIC', '-fstack-protector-strong', '-D_FORTIFY_SOURCE=2', '-O2', '-Wall', '-Werror'] -+default_cflags += ['-Wl,-z,relro,-z,now,-z,noexecstack', '-Wtrampolines'] - - if cc.has_argument('-Wno-format-truncation') - default_cflags += '-Wno-format-truncation' --- -2.27.0 - diff --git a/0003-dpdk-bugfix-the-deadlock-in-rte_eal_init.patch b/0003-dpdk-bugfix-the-deadlock-in-rte_eal_init.patch deleted file mode 100644 index a1e831e..0000000 --- a/0003-dpdk-bugfix-the-deadlock-in-rte_eal_init.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 5134068ace9870203f3e25d9f7b48281582fafbd Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Fri, 12 Nov 2021 16:17:36 +0800 -Subject: [PATCH] huawei-0003-dpdk-bugfix-the-deadlock-in-rte_eal_init - ---- - lib/eal/linux/eal.c | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 60b4924838..127b7f7b53 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -1145,7 +1145,7 @@ rte_eal_init(int argc, char **argv) - rte_eal_init_alert("Cannot get hugepage information."); - rte_errno = EACCES; - __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); -- return -1; -+ goto out; - } - } - -@@ -1169,7 +1169,7 @@ rte_eal_init(int argc, char **argv) - rte_eal_init_alert("Cannot init logging."); - rte_errno = ENOMEM; - __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); -- return -1; -+ goto out; - } - - #ifdef VFIO_PRESENT -@@ -1177,7 +1177,7 @@ rte_eal_init(int argc, char **argv) - rte_eal_init_alert("Cannot init VFIO"); - rte_errno = EAGAIN; - __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED); -- return -1; -+ goto out; - } - #endif - /* in secondary processes, memory init may allocate additional fbarrays -@@ -1187,13 +1187,13 @@ rte_eal_init(int argc, char **argv) - if (rte_eal_memzone_init() < 0) { - rte_eal_init_alert("Cannot init memzone"); - rte_errno = ENODEV; -- return -1; -+ goto out; - } - - if (rte_eal_memory_init() < 0) { - rte_eal_init_alert("Cannot init memory"); - rte_errno = ENOMEM; -- return -1; -+ goto out; - } - - /* the directories are locked during eal_hugepage_info_init */ -@@ -1332,6 +1332,10 @@ rte_eal_init(int argc, char **argv) - eal_mcfg_complete(); - - return fctret; -+ -+out: -+ eal_hugedirs_unlock(); -+ return -1; - } - - static int --- -2.27.0 - diff --git a/0004-dpdk-master-core-donot-set-affinity-in-libstorage.patch b/0004-dpdk-master-core-donot-set-affinity-in-libstorage.patch deleted file mode 100644 index 07b72e0..0000000 --- a/0004-dpdk-master-core-donot-set-affinity-in-libstorage.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 1d18079dea84bd368605f851738f8f14b917c98d Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Thu, 16 Dec 2021 15:33:11 +0800 -Subject: [PATCH] huawei-0004-dpdk-master-core-donot-set-affinity-in-libstorage - ---- - lib/eal/linux/eal.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 127b7f7b53..47c2186bee 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -1219,7 +1219,9 @@ rte_eal_init(int argc, char **argv) - - eal_check_mem_on_local_socket(); - -- if (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t), -+ /* Master thread don't set affinity in LibStorage application */ -+ if (strstr(logid, "LibStorage") != NULL && -+ pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t), - &lcore_config[config->main_lcore].cpuset) != 0) { - rte_eal_init_alert("Cannot set affinity"); - rte_errno = EINVAL; --- -2.27.0 - diff --git a/0005-dpdk-change-the-log-level-in-prepare_numa.patch b/0005-dpdk-change-the-log-level-in-prepare_numa.patch deleted file mode 100644 index 0e26e8a..0000000 --- a/0005-dpdk-change-the-log-level-in-prepare_numa.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e6009977b9ecb1136489b483e312a5e3e09a5497 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Fri, 12 Nov 2021 17:04:22 +0800 -Subject: [PATCH] huawei-0005-dpdk-change-the-log-level-in-prepare_numa - ---- - lib/eal/linux/eal_memalloc.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c -index 337f2bc739..fc354f4a17 100644 ---- a/lib/eal/linux/eal_memalloc.c -+++ b/lib/eal/linux/eal_memalloc.c -@@ -167,7 +167,7 @@ prepare_numa(int *oldpolicy, struct bitmask *oldmask, int socket_id) - RTE_LOG(DEBUG, EAL, "Trying to obtain current memory policy.\n"); - if (get_mempolicy(oldpolicy, oldmask->maskp, - oldmask->size + 1, 0, 0) < 0) { -- RTE_LOG(ERR, EAL, -+ RTE_LOG(DEBUG, EAL, - "Failed to get current mempolicy: %s. " - "Assuming MPOL_DEFAULT.\n", strerror(errno)); - *oldpolicy = MPOL_DEFAULT; --- -2.27.0 - diff --git a/0006-dpdk-fix-dpdk-coredump-problem.patch b/0006-dpdk-fix-dpdk-coredump-problem.patch deleted file mode 100644 index 6f81b85..0000000 --- a/0006-dpdk-fix-dpdk-coredump-problem.patch +++ /dev/null @@ -1,34 +0,0 @@ -From a76d953f02beecc057c96159e32e292b847b2d63 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Fri, 12 Nov 2021 17:18:23 +0800 -Subject: [PATCH] huawei-0006-dpdk-fix-dpdk-coredump-problem - ---- - lib/eal/linux/eal_interrupts.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c -index 6e3925efd4..621e43626e 100644 ---- a/lib/eal/linux/eal_interrupts.c -+++ b/lib/eal/linux/eal_interrupts.c -@@ -1137,7 +1137,7 @@ eal_intr_thread_main(__rte_unused void *arg) - */ - if (epoll_ctl(pfd, EPOLL_CTL_ADD, intr_pipe.readfd, - &pipe_event) < 0) { -- rte_panic("Error adding fd to %d epoll_ctl, %s\n", -+ RTE_LOG(ERR, EAL, "Error adding fd to %d epoll_ctl, %s\n", - intr_pipe.readfd, strerror(errno)); - } - numfds++; -@@ -1159,7 +1159,7 @@ eal_intr_thread_main(__rte_unused void *arg) - */ - if (epoll_ctl(pfd, EPOLL_CTL_ADD, - rte_intr_fd_get(src->intr_handle), &ev) < 0) { -- rte_panic("Error adding fd %d epoll_ctl, %s\n", -+ RTE_LOG(ERR, EAL, "Error adding fd %d epoll_ctl, %s\n", - rte_intr_fd_get(src->intr_handle), - strerror(errno)); - } --- -2.27.0 - diff --git a/0007-dpdk-fix-cpu-flag-error-in-Intel-R-Xeon-R-CPU-E5-262.patch b/0007-dpdk-fix-cpu-flag-error-in-Intel-R-Xeon-R-CPU-E5-262.patch deleted file mode 100644 index 41c4f59..0000000 --- a/0007-dpdk-fix-cpu-flag-error-in-Intel-R-Xeon-R-CPU-E5-262.patch +++ /dev/null @@ -1,28 +0,0 @@ -From d0f302751a57cea1ee64261c749f59c4026f7af7 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Thu, 16 Dec 2021 11:46:58 +0800 -Subject: [PATCH] - huawei-0008-dpdk-fix-cpu-flag-error-in-Intel-R-Xeon-R-CPU-E5-262 - ---- - config/meson.build | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/config/meson.build b/config/meson.build -index 17b5bec406..293703a90d 100644 ---- a/config/meson.build -+++ b/config/meson.build -@@ -121,6 +121,10 @@ if cpu_instruction_set == 'generic' - elif host_machine.cpu_family().startswith('ppc') - cpu_instruction_set = 'power8' - endif -+elif host_machine.cpu_family().startswith('x86') -+ if cc.get_define('__SSE4_2__', args:'-march=native') == '' -+ cpu_instruction_set = 'corei7' -+ endif - endif - - dpdk_conf.set('RTE_MACHINE', cpu_instruction_set) --- -2.27.0 - diff --git a/0008-dpdk-add-support-for-gazelle.patch b/0008-dpdk-add-support-for-gazelle.patch deleted file mode 100644 index 287b79e..0000000 --- a/0008-dpdk-add-support-for-gazelle.patch +++ /dev/null @@ -1,2113 +0,0 @@ -From 359d54d7a384c12e0b4d0514939d082138163905 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Sat, 25 Dec 2021 15:54:12 +0800 -Subject: [PATCH] 7 - ---- - config/rte_config.h | 3 +- - lib/eal/common/eal_common_config.c | 43 +++++- - lib/eal/common/eal_common_dynmem.c | 67 +++++++- - lib/eal/common/eal_common_fbarray.c | 106 +++++++++++-- - lib/eal/common/eal_common_memory.c | 90 +++++++++-- - lib/eal/common/eal_common_options.c | 179 +++++++++++++--------- - lib/eal/common/eal_filesystem.h | 58 ++++++- - lib/eal/common/eal_internal_cfg.h | 4 +- - lib/eal/common/eal_memalloc.h | 7 + - lib/eal/common/eal_options.h | 11 +- - lib/eal/common/eal_private.h | 27 +++- - lib/eal/include/rte_eal.h | 10 +- - lib/eal/include/rte_fbarray.h | 6 + - lib/eal/include/rte_memory.h | 20 ++- - lib/eal/linux/eal.c | 230 +++++++++++++++++++++++++--- - lib/eal/linux/eal_hugepage_info.c | 2 +- - lib/eal/linux/eal_memalloc.c | 128 +++++++++++++--- - lib/eal/linux/eal_memory.c | 104 ++++++++++--- - lib/ring/rte_ring.h | 75 +++++++++ - 19 files changed, 978 insertions(+), 192 deletions(-) - -diff --git a/config/rte_config.h b/config/rte_config.h -index cab4390a97..d2f192ee9b 100644 ---- a/config/rte_config.h -+++ b/config/rte_config.h -@@ -34,7 +34,8 @@ - #define RTE_MAX_MEM_MB_PER_LIST 32768 - #define RTE_MAX_MEMSEG_PER_TYPE 32768 - #define RTE_MAX_MEM_MB_PER_TYPE 65536 --#define RTE_MAX_MEMZONE 2560 -+#define RTE_MAX_MEMZONE 65535 -+#define RTE_MAX_SECONDARY 256 - #define RTE_MAX_TAILQ 32 - #define RTE_LOG_DP_LEVEL RTE_LOG_INFO - #define RTE_BACKTRACE 1 -diff --git a/lib/eal/common/eal_common_config.c b/lib/eal/common/eal_common_config.c -index 1c4c4dd585..fe3db184b7 100644 ---- a/lib/eal/common/eal_common_config.c -+++ b/lib/eal/common/eal_common_config.c -@@ -22,18 +22,29 @@ static char runtime_dir[PATH_MAX]; - /* internal configuration */ - static struct internal_config internal_config; - --const char * -+/****** APIs for libnet ******/ -+static char sec_runtime_dir[RTE_MAX_SECONDARY][PATH_MAX]; -+static struct rte_config sec_rte_config[RTE_MAX_SECONDARY]; -+static struct internal_config sec_internal_config[RTE_MAX_SECONDARY]; -+ -+char * - rte_eal_get_runtime_dir(void) - { - return runtime_dir; - } - --int --eal_set_runtime_dir(char *run_dir, size_t size) -+char * -+rte_eal_sec_get_runtime_dir(const int sec_idx) -+{ -+ return sec_runtime_dir[sec_idx]; -+} -+ -+static int -+set_runtime_dir(char *dst_dir, char *src_dir, size_t size) - { - size_t str_size; - -- str_size = strlcpy(runtime_dir, run_dir, size); -+ str_size = strlcpy(dst_dir, src_dir, size); - if (str_size >= size) { - RTE_LOG(ERR, EAL, "Runtime directory string too long\n"); - return -1; -@@ -42,6 +53,18 @@ eal_set_runtime_dir(char *run_dir, size_t size) - return 0; - } - -+int -+eal_sec_set_runtime_dir(char *run_dir, size_t size, const int sec_idx) -+{ -+ return set_runtime_dir(sec_runtime_dir[sec_idx], run_dir, size); -+} -+ -+int -+eal_set_runtime_dir(char *run_dir, size_t size) -+{ -+ return set_runtime_dir(runtime_dir, run_dir, size); -+} -+ - /* Return a pointer to the configuration structure */ - struct rte_config * - rte_eal_get_configuration(void) -@@ -49,6 +72,18 @@ rte_eal_get_configuration(void) - return &rte_config; - } - -+struct rte_config * -+rte_eal_sec_get_configuration(const int sec_idx) -+{ -+ return &sec_rte_config[sec_idx]; -+} -+ -+struct internal_config * -+rte_eal_sec_get_internal_config(const int sec_idx) -+{ -+ return &sec_internal_config[sec_idx]; -+} -+ - /* Return a pointer to the internal configuration structure */ - struct internal_config * - eal_get_internal_configuration(void) -diff --git a/lib/eal/common/eal_common_dynmem.c b/lib/eal/common/eal_common_dynmem.c -index 7c5437ddfa..eff78c14d9 100644 ---- a/lib/eal/common/eal_common_dynmem.c -+++ b/lib/eal/common/eal_common_dynmem.c -@@ -16,6 +16,50 @@ - - /** @file Functions common to EALs that support dynamic memory allocation. */ - -+static int -+eal_sec_set_num_pages(struct internal_config *internal_conf, -+ struct hugepage_info *used_hp) -+{ -+ int ret; -+ int hp_sz_idx; -+ uint64_t memory[RTE_MAX_NUMA_NODES]; -+ -+ if (!internal_conf || !used_hp) { -+ return -1; -+ } -+ -+ for (hp_sz_idx = 0; -+ hp_sz_idx < (int) internal_conf->num_hugepage_sizes; -+ hp_sz_idx++) { -+ struct hugepage_info *hpi; -+ hpi = &internal_conf->hugepage_info[hp_sz_idx]; -+ used_hp[hp_sz_idx].hugepage_sz = hpi->hugepage_sz; -+ } -+ -+ for (hp_sz_idx = 0; hp_sz_idx < RTE_MAX_NUMA_NODES; hp_sz_idx++) -+ memory[hp_sz_idx] = internal_conf->socket_mem[hp_sz_idx]; -+ -+ ret = eal_dynmem_calc_num_pages_per_socket(memory, -+ internal_conf->hugepage_info, used_hp, -+ internal_conf->num_hugepage_sizes); -+ -+ return ret; -+} -+ -+static int -+eal_sec_get_num_pages(const struct hugepage_info *used_hp, -+ uint64_t hugepage_sz, int socket) -+{ -+ int hp_sz_idx; -+ -+ for (hp_sz_idx = 0; hp_sz_idx < MAX_HUGEPAGE_SIZES; hp_sz_idx++) { -+ if (used_hp[hp_sz_idx].hugepage_sz == hugepage_sz) -+ return used_hp[hp_sz_idx].num_pages[socket]; -+ } -+ -+ return 0; -+} -+ - int - eal_dynmem_memseg_lists_init(void) - { -@@ -29,6 +73,7 @@ eal_dynmem_memseg_lists_init(void) - uint64_t max_mem, max_mem_per_type; - unsigned int max_seglists_per_type; - unsigned int n_memtypes, cur_type; -+ struct hugepage_info used_hp[MAX_HUGEPAGE_SIZES]; - struct internal_config *internal_conf = - eal_get_internal_configuration(); - -@@ -36,6 +81,14 @@ eal_dynmem_memseg_lists_init(void) - if (internal_conf->no_hugetlbfs) - return 0; - -+ if (internal_conf->map_perfect) { -+ memset(used_hp, 0, sizeof(used_hp)); -+ ret = eal_sec_set_num_pages(internal_conf, used_hp); -+ if (ret == -1) { -+ RTE_LOG(ERR, EAL, "Cannot get num pages\n"); -+ } -+ } -+ - /* - * figuring out amount of memory we're going to have is a long and very - * involved process. the basic element we're operating with is a memory -@@ -132,6 +185,7 @@ eal_dynmem_memseg_lists_init(void) - struct memtype *type = &memtypes[cur_type]; - uint64_t max_mem_per_list, pagesz; - int socket_id; -+ unsigned int need_n_segs, cur_n_segs; - - pagesz = type->page_sz; - socket_id = type->socket_id; -@@ -175,8 +229,17 @@ eal_dynmem_memseg_lists_init(void) - "n_segs:%i socket_id:%i hugepage_sz:%" PRIu64 "\n", - n_seglists, n_segs, socket_id, pagesz); - -+ if (internal_conf->map_perfect) -+ need_n_segs = eal_sec_get_num_pages(used_hp, pagesz, socket_id); -+ else -+ need_n_segs = n_segs; -+ - /* create all segment lists */ -- for (cur_seglist = 0; cur_seglist < n_seglists; cur_seglist++) { -+ for (cur_seglist = 0; cur_seglist < n_seglists && need_n_segs > 0; cur_seglist++) { -+ cur_n_segs = RTE_MIN(need_n_segs, n_segs); -+ if (internal_conf->map_perfect) -+ need_n_segs -= cur_n_segs; -+ - if (msl_idx >= RTE_MAX_MEMSEG_LISTS) { - RTE_LOG(ERR, EAL, - "No more space in memseg lists, please increase %s\n", -@@ -185,7 +248,7 @@ eal_dynmem_memseg_lists_init(void) - } - msl = &mcfg->memsegs[msl_idx++]; - -- if (eal_memseg_list_init(msl, pagesz, n_segs, -+ if (eal_memseg_list_init(msl, pagesz, cur_n_segs, - socket_id, cur_seglist, true)) - goto out; - -diff --git a/lib/eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c -index 3a28a53247..9c125c104c 100644 ---- a/lib/eal/common/eal_common_fbarray.c -+++ b/lib/eal/common/eal_common_fbarray.c -@@ -9,6 +9,8 @@ - #include - #include - #include -+#include -+#include - - #include - #include -@@ -830,8 +832,9 @@ rte_fbarray_init(struct rte_fbarray *arr, const char *name, unsigned int len, - return -1; - } - --int --rte_fbarray_attach(struct rte_fbarray *arr) -+static int -+__rte_fbarray_attach(struct rte_fbarray *arr, const char *runtime_dir, -+ const struct internal_config *internal_conf) - { - struct mem_area *ma = NULL, *tmp = NULL; - size_t page_sz, mmap_len; -@@ -867,13 +870,15 @@ rte_fbarray_attach(struct rte_fbarray *arr) - - mmap_len = calc_data_size(page_sz, arr->elt_sz, arr->len); - -- /* check the tailq - maybe user has already mapped this address space */ -- rte_spinlock_lock(&mem_area_lock); -+ if (!internal_conf->pri_and_sec) { -+ /* check the tailq - maybe user has already mapped this address space */ -+ rte_spinlock_lock(&mem_area_lock); - -- TAILQ_FOREACH(tmp, &mem_area_tailq, next) { -- if (overlap(tmp, arr->data, mmap_len)) { -- rte_errno = EEXIST; -- goto fail; -+ TAILQ_FOREACH(tmp, &mem_area_tailq, next) { -+ if (overlap(tmp, arr->data, mmap_len)) { -+ rte_errno = EEXIST; -+ goto fail; -+ } - } - } - -@@ -883,7 +888,7 @@ rte_fbarray_attach(struct rte_fbarray *arr) - if (data == NULL) - goto fail; - -- eal_get_fbarray_path(path, sizeof(path), arr->name); -+ eal_sec_get_fbarray_path(path, sizeof(path), arr->name, runtime_dir); - - fd = eal_file_open(path, EAL_OPEN_READWRITE); - if (fd < 0) { -@@ -897,16 +902,27 @@ rte_fbarray_attach(struct rte_fbarray *arr) - if (resize_and_map(fd, path, data, mmap_len)) - goto fail; - -+ if (internal_conf->pri_and_sec) { -+ if (flock(fd, LOCK_UN)) { -+ rte_errno = errno; -+ goto fail; -+ } -+ close(fd); -+ fd = -1; -+ } -+ - /* store our new memory area */ - ma->addr = data; - ma->fd = fd; /* keep fd until detach/destroy */ - ma->len = mmap_len; - -- TAILQ_INSERT_TAIL(&mem_area_tailq, ma, next); -+ if (!internal_conf->pri_and_sec) { -+ TAILQ_INSERT_TAIL(&mem_area_tailq, ma, next); - -- /* we're done */ -+ /* we're done */ - -- rte_spinlock_unlock(&mem_area_lock); -+ rte_spinlock_unlock(&mem_area_lock); -+ } - return 0; - fail: - if (data) -@@ -918,6 +934,31 @@ rte_fbarray_attach(struct rte_fbarray *arr) - return -1; - } - -+int -+rte_fbarray_attach(struct rte_fbarray *arr) -+{ -+ const struct internal_config *internal_conf = eal_get_internal_configuration(); -+ return __rte_fbarray_attach(arr, rte_eal_get_runtime_dir(), internal_conf); -+} -+ -+int -+rte_sec_fbarray_attach(struct rte_fbarray *arr, -+ const int switch_pri_and_sec, const int sec_idx) -+{ -+ struct internal_config *internal_conf = NULL; -+ char *runtime_dir = NULL; -+ -+ if (!switch_pri_and_sec) { -+ runtime_dir = rte_eal_get_runtime_dir(); -+ internal_conf = eal_get_internal_configuration(); -+ } else { -+ runtime_dir = rte_eal_sec_get_runtime_dir(sec_idx); -+ internal_conf = rte_eal_sec_get_internal_config(sec_idx); -+ } -+ -+ return __rte_fbarray_attach(arr, runtime_dir, internal_conf); -+} -+ - int - rte_fbarray_detach(struct rte_fbarray *arr) - { -@@ -1057,6 +1098,47 @@ rte_fbarray_destroy(struct rte_fbarray *arr) - return ret; - } - -+int -+rte_sec_fbarray_destroy(struct rte_fbarray *arr, -+ const int sec_idx) -+{ -+ int fd, ret; -+ char path[PATH_MAX]; -+ -+ if (arr == NULL) { -+ rte_errno = EINVAL; -+ return -1; -+ } -+ -+ size_t page_sz = rte_mem_page_size(); -+ if (page_sz == (size_t)-1) -+ return -1; -+ -+ size_t mmap_len = calc_data_size(page_sz, arr->elt_sz, arr->len); -+ rte_mem_unmap(arr->data, mmap_len); -+ -+ /* try deleting the file */ -+ eal_sec_get_fbarray_path(path, sizeof(path), arr->name, rte_eal_sec_get_runtime_dir(sec_idx)); -+ -+ fd = open(path, O_RDONLY); -+ if (fd < 0) { -+ RTE_LOG(ERR, EAL, "Could not open fbarray file: %s\n", strerror(errno)); -+ return -1; -+ } -+ if (flock(fd, LOCK_EX | LOCK_NB)) { -+ RTE_LOG(DEBUG, EAL, "Cannot destroy fbarray - another process is using it\n"); -+ rte_errno = EBUSY; -+ ret = -1; -+ } else { -+ ret = 0; -+ unlink(path); -+ memset(arr, 0, sizeof(*arr)); -+ } -+ close(fd); -+ -+ return ret; -+} -+ - void * - rte_fbarray_get(const struct rte_fbarray *arr, unsigned int idx) - { -diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c -index 616db5ce31..884996faf2 100644 ---- a/lib/eal/common/eal_common_memory.c -+++ b/lib/eal/common/eal_common_memory.c -@@ -307,9 +307,9 @@ virt2memseg(const void *addr, const struct rte_memseg_list *msl) - } - - static struct rte_memseg_list * --virt2memseg_list(const void *addr) -+virt2memseg_list(const void *addr, const struct rte_config *rte_cfg) - { -- struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; -+ struct rte_mem_config *mcfg = rte_cfg->mem_config; - struct rte_memseg_list *msl; - int msl_idx; - -@@ -331,7 +331,13 @@ virt2memseg_list(const void *addr) - struct rte_memseg_list * - rte_mem_virt2memseg_list(const void *addr) - { -- return virt2memseg_list(addr); -+ return virt2memseg_list(addr, rte_eal_get_configuration()); -+} -+ -+struct rte_memseg_list * -+rte_sec_mem_virt2memseg_list(const void *addr, const struct rte_config *rte_cfg) -+{ -+ return virt2memseg_list(addr, rte_cfg); - } - - struct virtiova { -@@ -386,11 +392,25 @@ rte_mem_iova2virt(rte_iova_t iova) - return vi.virt; - } - -+static struct rte_memseg * -+__rte_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl, -+ const struct rte_config *rte_cfg) -+{ -+ return virt2memseg(addr, msl != NULL ? msl : -+ rte_sec_mem_virt2memseg_list(addr, rte_cfg)); -+} -+ - struct rte_memseg * - rte_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl) - { -- return virt2memseg(addr, msl != NULL ? msl : -- rte_mem_virt2memseg_list(addr)); -+ return __rte_mem_virt2memseg(addr, msl, rte_eal_get_configuration()); -+} -+ -+struct rte_memseg * -+rte_sec_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl, -+ const struct rte_config *rte_cfg) -+{ -+ return __rte_mem_virt2memseg(addr, msl, rte_cfg); - } - - static int -@@ -1069,12 +1089,14 @@ rte_eal_memory_detach(void) - } - - /* init memory subsystem */ --int --rte_eal_memory_init(void) -+static int -+__rte_eal_memory_init(__attribute__((__unused__)) const char *runtime_dir, -+ const struct internal_config *internal_conf, -+ struct rte_config *rte_cfg, -+ const int switch_pri_and_sec, -+ const int sec_idx) - { -- struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; -- const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -+ struct rte_mem_config *mcfg = rte_cfg->mem_config; - - int retval; - RTE_LOG(DEBUG, EAL, "Setting up physically contiguous memory...\n"); -@@ -1083,17 +1105,18 @@ rte_eal_memory_init(void) - return -1; - - /* lock mem hotplug here, to prevent races while we init */ -- rte_mcfg_mem_read_lock(); -+ rte_rwlock_read_lock(&mcfg->memory_hotplug_lock); - -- if (rte_eal_memseg_init() < 0) -+ if (rte_eal_memseg_init(switch_pri_and_sec, sec_idx) < 0) - goto fail; - -- if (eal_memalloc_init() < 0) -- goto fail; -+ if (!internal_conf->pri_and_sec) -+ if (eal_memalloc_init() < 0) -+ goto fail; - -- retval = rte_eal_process_type() == RTE_PROC_PRIMARY ? -+ retval = rte_cfg->process_type == RTE_PROC_PRIMARY ? - rte_eal_hugepage_init() : -- rte_eal_hugepage_attach(); -+ rte_eal_hugepage_attach(switch_pri_and_sec, sec_idx); - if (retval < 0) - goto fail; - -@@ -1102,10 +1125,43 @@ rte_eal_memory_init(void) - - return 0; - fail: -- rte_mcfg_mem_read_unlock(); -+ rte_rwlock_read_unlock(&mcfg->memory_hotplug_lock); - return -1; - } - -+int -+rte_eal_memory_init(void) -+{ -+ const int unused_idx = -1; -+ const struct internal_config *internal_conf = -+ eal_get_internal_configuration(); -+ -+ return __rte_eal_memory_init(rte_eal_get_runtime_dir(), -+ internal_conf, rte_eal_get_configuration(), -+ false, unused_idx); -+} -+ -+int -+rte_eal_sec_memory_init(const int sec_idx) -+{ -+ int ret; -+ struct rte_config *rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ -+ ret = __rte_eal_memory_init(rte_eal_sec_get_runtime_dir(sec_idx), -+ rte_eal_sec_get_internal_config(sec_idx), rte_cfg, -+ true, sec_idx); -+ -+ rte_rwlock_read_unlock(&rte_cfg->mem_config->memory_hotplug_lock); -+ -+ return ret; -+} -+ -+int -+rte_eal_sec_memory_cleanup(const int sec_idx) -+{ -+ return eal_sec_memalloc_destroy(sec_idx); -+} -+ - #ifndef RTE_EXEC_ENV_WINDOWS - #define EAL_MEMZONE_LIST_REQ "/eal/memzone_list" - #define EAL_MEMZONE_INFO_REQ "/eal/memzone_info" -diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c -index 1cfdd75f3b..ba3b19ee6e 100644 ---- a/lib/eal/common/eal_common_options.c -+++ b/lib/eal/common/eal_common_options.c -@@ -105,6 +105,7 @@ eal_long_options[] = { - {OPT_TELEMETRY, 0, NULL, OPT_TELEMETRY_NUM }, - {OPT_NO_TELEMETRY, 0, NULL, OPT_NO_TELEMETRY_NUM }, - {OPT_FORCE_MAX_SIMD_BITWIDTH, 1, NULL, OPT_FORCE_MAX_SIMD_BITWIDTH_NUM}, -+ {OPT_MAP_PERFECT, 0, NULL, OPT_MAP_PERFECT_NUM }, - - {0, 0, NULL, 0 } - }; -@@ -301,54 +302,66 @@ eal_get_hugefile_prefix(void) - return HUGEFILE_PREFIX_DEFAULT; - } - -+const char * -+eal_sec_get_hugefile_prefix(const int sec_idx) -+{ -+ struct internal_config *internal_conf = -+ rte_eal_sec_get_internal_config(sec_idx); -+ -+ if (internal_conf->hugefile_prefix != NULL) -+ return internal_conf->hugefile_prefix; -+ return HUGEFILE_PREFIX_DEFAULT; -+} -+ - void --eal_reset_internal_config(struct internal_config *internal_cfg) -+eal_reset_internal_config(struct internal_config *internal_conf) - { - int i; - -- internal_cfg->memory = 0; -- internal_cfg->force_nrank = 0; -- internal_cfg->force_nchannel = 0; -- internal_cfg->hugefile_prefix = NULL; -- internal_cfg->hugepage_dir = NULL; -- internal_cfg->force_sockets = 0; -+ internal_conf->memory = 0; -+ internal_conf->force_nrank = 0; -+ internal_conf->force_nchannel = 0; -+ internal_conf->hugefile_prefix = NULL; -+ internal_conf->hugepage_dir = NULL; -+ internal_conf->force_sockets = 0; - /* zero out the NUMA config */ - for (i = 0; i < RTE_MAX_NUMA_NODES; i++) -- internal_cfg->socket_mem[i] = 0; -- internal_cfg->force_socket_limits = 0; -+ internal_conf->socket_mem[i] = 0; -+ internal_conf->force_socket_limits = 0; - /* zero out the NUMA limits config */ - for (i = 0; i < RTE_MAX_NUMA_NODES; i++) -- internal_cfg->socket_limit[i] = 0; -+ internal_conf->socket_limit[i] = 0; - /* zero out hugedir descriptors */ - for (i = 0; i < MAX_HUGEPAGE_SIZES; i++) { -- memset(&internal_cfg->hugepage_info[i], 0, -- sizeof(internal_cfg->hugepage_info[0])); -- internal_cfg->hugepage_info[i].lock_descriptor = -1; -+ memset(&internal_conf->hugepage_info[i], 0, -+ sizeof(internal_conf->hugepage_info[0])); -+ internal_conf->hugepage_info[i].lock_descriptor = -1; - } -- internal_cfg->base_virtaddr = 0; -+ internal_conf->base_virtaddr = 0; - - #ifdef LOG_DAEMON -- internal_cfg->syslog_facility = LOG_DAEMON; -+ internal_conf->syslog_facility = LOG_DAEMON; - #endif - - /* if set to NONE, interrupt mode is determined automatically */ -- internal_cfg->vfio_intr_mode = RTE_INTR_MODE_NONE; -- memset(internal_cfg->vfio_vf_token, 0, -- sizeof(internal_cfg->vfio_vf_token)); -+ internal_conf->vfio_intr_mode = RTE_INTR_MODE_NONE; -+ memset(internal_conf->vfio_vf_token, 0, -+ sizeof(internal_conf->vfio_vf_token)); - - #ifdef RTE_LIBEAL_USE_HPET -- internal_cfg->no_hpet = 0; -+ internal_conf->no_hpet = 0; - #else -- internal_cfg->no_hpet = 1; -+ internal_conf->no_hpet = 1; - #endif -- internal_cfg->vmware_tsc_map = 0; -- internal_cfg->create_uio_dev = 0; -- internal_cfg->iova_mode = RTE_IOVA_DC; -- internal_cfg->user_mbuf_pool_ops_name = NULL; -- CPU_ZERO(&internal_cfg->ctrl_cpuset); -- internal_cfg->init_complete = 0; -- internal_cfg->max_simd_bitwidth.bitwidth = RTE_VECT_DEFAULT_SIMD_BITWIDTH; -- internal_cfg->max_simd_bitwidth.forced = 0; -+ internal_conf->vmware_tsc_map = 0; -+ internal_conf->create_uio_dev = 0; -+ internal_conf->iova_mode = RTE_IOVA_DC; -+ internal_conf->user_mbuf_pool_ops_name = NULL; -+ CPU_ZERO(&internal_conf->ctrl_cpuset); -+ internal_conf->init_complete = 0; -+ internal_conf->map_perfect = 0; -+ internal_conf->max_simd_bitwidth.bitwidth = RTE_VECT_DEFAULT_SIMD_BITWIDTH; -+ internal_conf->max_simd_bitwidth.forced = 0; - } - - static int -@@ -1496,12 +1509,10 @@ eal_parse_simd_bitwidth(const char *arg) - } - - static int --eal_parse_base_virtaddr(const char *arg) -+eal_parse_base_virtaddr(const char *arg, struct internal_config *conf) - { - char *end; - uint64_t addr; -- struct internal_config *internal_conf = -- eal_get_internal_configuration(); - - errno = 0; - addr = strtoull(arg, &end, 16); -@@ -1521,7 +1532,7 @@ eal_parse_base_virtaddr(const char *arg) - * it can align to 2MB for x86. So this alignment can also be used - * on x86 and other architectures. - */ -- internal_conf->base_virtaddr = -+ conf->base_virtaddr = - RTE_PTR_ALIGN_CEIL((uintptr_t)addr, (size_t)RTE_PGSIZE_16M); - - return 0; -@@ -1877,7 +1888,7 @@ eal_parse_common_option(int opt, const char *optarg, - } - break; - case OPT_BASE_VIRTADDR_NUM: -- if (eal_parse_base_virtaddr(optarg) < 0) { -+ if (eal_parse_base_virtaddr(optarg, conf) < 0) { - RTE_LOG(ERR, EAL, "invalid parameter for --" - OPT_BASE_VIRTADDR "\n"); - return -1; -@@ -1933,9 +1944,9 @@ eal_auto_detect_cores(struct rte_config *cfg) - } - - static void --compute_ctrl_threads_cpuset(struct internal_config *internal_cfg) -+compute_ctrl_threads_cpuset(struct internal_config *internal_conf) - { -- rte_cpuset_t *cpuset = &internal_cfg->ctrl_cpuset; -+ rte_cpuset_t *cpuset = &internal_conf->ctrl_cpuset; - rte_cpuset_t default_set; - unsigned int lcore_id; - -@@ -1960,25 +1971,23 @@ compute_ctrl_threads_cpuset(struct internal_config *internal_cfg) - } - - int --eal_cleanup_config(struct internal_config *internal_cfg) -+eal_cleanup_config(struct internal_config *internal_conf) - { -- if (internal_cfg->hugefile_prefix != NULL) -- free(internal_cfg->hugefile_prefix); -- if (internal_cfg->hugepage_dir != NULL) -- free(internal_cfg->hugepage_dir); -- if (internal_cfg->user_mbuf_pool_ops_name != NULL) -- free(internal_cfg->user_mbuf_pool_ops_name); -+ if (internal_conf->hugefile_prefix != NULL) -+ free(internal_conf->hugefile_prefix); -+ if (internal_conf->hugepage_dir != NULL) -+ free(internal_conf->hugepage_dir); -+ if (internal_conf->user_mbuf_pool_ops_name != NULL) -+ free(internal_conf->user_mbuf_pool_ops_name); - - return 0; - } - - int --eal_adjust_config(struct internal_config *internal_cfg) -+eal_adjust_config(struct internal_config *internal_conf) - { - int i; - struct rte_config *cfg = rte_eal_get_configuration(); -- struct internal_config *internal_conf = -- eal_get_internal_configuration(); - - if (!core_parsed) - eal_auto_detect_cores(cfg); -@@ -1994,44 +2003,64 @@ eal_adjust_config(struct internal_config *internal_cfg) - lcore_config[cfg->main_lcore].core_role = ROLE_RTE; - } - -- compute_ctrl_threads_cpuset(internal_cfg); -+ compute_ctrl_threads_cpuset(internal_conf); - - /* if no memory amounts were requested, this will result in 0 and - * will be overridden later, right after eal_hugepage_info_init() */ - for (i = 0; i < RTE_MAX_NUMA_NODES; i++) -- internal_cfg->memory += internal_cfg->socket_mem[i]; -+ internal_conf->memory += internal_conf->socket_mem[i]; - - return 0; - } - - int --eal_check_common_options(struct internal_config *internal_cfg) -+eal_sec_adjust_config(struct internal_config *internal_conf) - { -- struct rte_config *cfg = rte_eal_get_configuration(); -- const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -+ struct internal_config *internal_conf_head; -+ internal_conf->process_type = RTE_PROC_SECONDARY; -+ -+ internal_conf_head = rte_eal_sec_get_internal_config(0); -+ for (int i = 0; i < RTE_MAX_SECONDARY; ++i) { -+ if (!internal_conf_head[i].pri_and_sec) -+ continue; -+ if (internal_conf == &internal_conf_head[i]) -+ continue; -+ if (!strcmp(internal_conf_head[i].hugefile_prefix, internal_conf->hugefile_prefix)) -+ return -EALREADY; -+ } -+ -+ for (int i = 0; i < RTE_MAX_NUMA_NODES; i++) -+ internal_conf->memory += internal_conf->socket_mem[i]; - -- if (cfg->lcore_role[cfg->main_lcore] != ROLE_RTE) { -+ return 0; -+} -+ -+int -+eal_check_common_options(struct internal_config *internal_conf, -+ struct rte_config *cfg) -+{ -+ if (!internal_conf->pri_and_sec && -+ cfg->lcore_role[cfg->main_lcore] != ROLE_RTE) { - RTE_LOG(ERR, EAL, "Main lcore is not enabled for DPDK\n"); - return -1; - } - -- if (internal_cfg->process_type == RTE_PROC_INVALID) { -+ if (internal_conf->process_type == RTE_PROC_INVALID) { - RTE_LOG(ERR, EAL, "Invalid process type specified\n"); - return -1; - } -- if (internal_cfg->hugefile_prefix != NULL && -- strlen(internal_cfg->hugefile_prefix) < 1) { -+ if (internal_conf->hugefile_prefix != NULL && -+ strlen(internal_conf->hugefile_prefix) < 1) { - RTE_LOG(ERR, EAL, "Invalid length of --" OPT_FILE_PREFIX " option\n"); - return -1; - } -- if (internal_cfg->hugepage_dir != NULL && -- strlen(internal_cfg->hugepage_dir) < 1) { -+ if (internal_conf->hugepage_dir != NULL && -+ strlen(internal_conf->hugepage_dir) < 1) { - RTE_LOG(ERR, EAL, "Invalid length of --" OPT_HUGE_DIR" option\n"); - return -1; - } -- if (internal_cfg->user_mbuf_pool_ops_name != NULL && -- strlen(internal_cfg->user_mbuf_pool_ops_name) < 1) { -+ if (internal_conf->user_mbuf_pool_ops_name != NULL && -+ strlen(internal_conf->user_mbuf_pool_ops_name) < 1) { - RTE_LOG(ERR, EAL, "Invalid length of --" OPT_MBUF_POOL_OPS_NAME" option\n"); - return -1; - } -@@ -2040,18 +2069,18 @@ eal_check_common_options(struct internal_config *internal_cfg) - "option\n"); - return -1; - } -- if (mem_parsed && internal_cfg->force_sockets == 1) { -+ if (mem_parsed && internal_conf->force_sockets == 1) { - RTE_LOG(ERR, EAL, "Options -m and --"OPT_SOCKET_MEM" cannot " - "be specified at the same time\n"); - return -1; - } -- if (internal_cfg->no_hugetlbfs && internal_cfg->force_sockets == 1) { -+ if (internal_conf->no_hugetlbfs && internal_conf->force_sockets == 1) { - RTE_LOG(ERR, EAL, "Option --"OPT_SOCKET_MEM" cannot " - "be specified together with --"OPT_NO_HUGE"\n"); - return -1; - } -- if (internal_cfg->no_hugetlbfs && internal_cfg->hugepage_unlink && -- !internal_cfg->in_memory) { -+ if (internal_conf->no_hugetlbfs && internal_conf->hugepage_unlink && -+ !internal_conf->in_memory) { - RTE_LOG(ERR, EAL, "Option --"OPT_HUGE_UNLINK" cannot " - "be specified together with --"OPT_NO_HUGE"\n"); - return -1; -@@ -2060,35 +2089,43 @@ eal_check_common_options(struct internal_config *internal_cfg) - RTE_LOG(ERR, EAL, "Option --"OPT_SOCKET_LIMIT - " is only supported in non-legacy memory mode\n"); - } -- if (internal_cfg->single_file_segments && -- internal_cfg->hugepage_unlink && -- !internal_cfg->in_memory) { -+ if (internal_conf->single_file_segments && -+ internal_conf->hugepage_unlink && -+ !internal_conf->in_memory) { - RTE_LOG(ERR, EAL, "Option --"OPT_SINGLE_FILE_SEGMENTS" is " - "not compatible with --"OPT_HUGE_UNLINK"\n"); - return -1; - } -- if (internal_cfg->legacy_mem && -- internal_cfg->in_memory) { -+ if (internal_conf->legacy_mem && -+ internal_conf->in_memory) { - RTE_LOG(ERR, EAL, "Option --"OPT_LEGACY_MEM" is not compatible " - "with --"OPT_IN_MEMORY"\n"); - return -1; - } -- if (internal_cfg->legacy_mem && internal_cfg->match_allocations) { -+ if (internal_conf->legacy_mem && internal_conf->match_allocations) { - RTE_LOG(ERR, EAL, "Option --"OPT_LEGACY_MEM" is not compatible " - "with --"OPT_MATCH_ALLOCATIONS"\n"); - return -1; - } -- if (internal_cfg->no_hugetlbfs && internal_cfg->match_allocations) { -+ if (internal_conf->no_hugetlbfs && internal_conf->match_allocations) { - RTE_LOG(ERR, EAL, "Option --"OPT_NO_HUGE" is not compatible " - "with --"OPT_MATCH_ALLOCATIONS"\n"); - return -1; - } -- if (internal_cfg->legacy_mem && internal_cfg->memory == 0) { -+ if (internal_conf->legacy_mem && internal_conf->memory == 0) { - RTE_LOG(NOTICE, EAL, "Static memory layout is selected, " - "amount of reserved memory can be adjusted with " - "-m or --"OPT_SOCKET_MEM"\n"); - } - -+ if (internal_conf->map_perfect || internal_conf->pri_and_sec) { -+ if (!internal_conf->legacy_mem || internal_conf->in_memory || internal_conf->no_hugetlbfs) { -+ RTE_LOG(ERR, EAL, "Option --"OPT_LEGACY_MEM" or "OPT_IN_MEMORY" or "OPT_NO_HUGE" " -+ "is not compatible with --"OPT_MAP_PERFECT" and "OPT_PRI_AND_SEC"\n"); -+ return -1; -+ } -+ } -+ - return 0; - } - -diff --git a/lib/eal/common/eal_filesystem.h b/lib/eal/common/eal_filesystem.h -index 5d21f07c20..719678772f 100644 ---- a/lib/eal/common/eal_filesystem.h -+++ b/lib/eal/common/eal_filesystem.h -@@ -23,7 +23,7 @@ - - /* sets up platform-specific runtime data dir */ - int --eal_create_runtime_dir(void); -+eal_create_runtime_dir(const int sec_idx); - - int - eal_clean_runtime_dir(void); -@@ -32,17 +32,32 @@ eal_clean_runtime_dir(void); - const char * - eal_get_hugefile_prefix(void); - -+const char * -+eal_sec_get_hugefile_prefix(const int sec_idx); -+ - #define RUNTIME_CONFIG_FNAME "config" - static inline const char * --eal_runtime_config_path(void) -+__eal_runtime_config_path(const char *runtime_dir) - { - static char buffer[PATH_MAX]; /* static so auto-zeroed */ - -- snprintf(buffer, sizeof(buffer), "%s/%s", rte_eal_get_runtime_dir(), -+ snprintf(buffer, sizeof(buffer), "%s/%s", runtime_dir, - RUNTIME_CONFIG_FNAME); - return buffer; - } - -+static inline const char * -+eal_runtime_config_path(void) -+{ -+ return __eal_runtime_config_path(rte_eal_get_runtime_dir()); -+} -+ -+static inline const char * -+eal_sec_runtime_config_path(const char *runtime_dir) -+{ -+ return __eal_runtime_config_path(runtime_dir); -+} -+ - /** Path of primary/secondary communication unix socket file. */ - #define MP_SOCKET_FNAME "mp_socket" - static inline const char * -@@ -57,12 +72,29 @@ eal_mp_socket_path(void) - - #define FBARRAY_NAME_FMT "%s/fbarray_%s" - static inline const char * --eal_get_fbarray_path(char *buffer, size_t buflen, const char *name) { -- snprintf(buffer, buflen, FBARRAY_NAME_FMT, rte_eal_get_runtime_dir(), -+__eal_get_fbarray_path(char *buffer, size_t buflen, const char *name, -+ const char *runtime_dir) -+{ -+ snprintf(buffer, buflen, FBARRAY_NAME_FMT, runtime_dir, - name); - return buffer; - } - -+static inline const char * -+eal_get_fbarray_path(char *buffer, size_t buflen, const char *name) -+{ -+ return __eal_get_fbarray_path(buffer, buflen, name, -+ rte_eal_get_runtime_dir()); -+} -+ -+static inline const char * -+eal_sec_get_fbarray_path(char *buffer, size_t buflen, -+ const char *name, const char *runtime_dir) -+{ -+ return __eal_get_fbarray_path(buffer, buflen, name, -+ runtime_dir); -+} -+ - /** Path of hugepage info file. */ - #define HUGEPAGE_INFO_FNAME "hugepage_info" - static inline const char * -@@ -78,15 +110,27 @@ eal_hugepage_info_path(void) - /** Path of hugepage data file. */ - #define HUGEPAGE_DATA_FNAME "hugepage_data" - static inline const char * --eal_hugepage_data_path(void) -+__eal_hugepage_data_path(const char *runtime_dir) - { - static char buffer[PATH_MAX]; /* static so auto-zeroed */ - -- snprintf(buffer, sizeof(buffer), "%s/%s", rte_eal_get_runtime_dir(), -+ snprintf(buffer, sizeof(buffer), "%s/%s", runtime_dir, - HUGEPAGE_DATA_FNAME); - return buffer; - } - -+static inline const char * -+eal_hugepage_data_path(void) -+{ -+ return __eal_hugepage_data_path(rte_eal_get_runtime_dir()); -+} -+ -+static inline const char * -+eal_sec_hugepage_data_path(const char *runtime_dir) -+{ -+ return __eal_hugepage_data_path(runtime_dir); -+} -+ - /** String format for hugepage map files. */ - #define HUGEFILE_FMT "%s/%smap_%d" - static inline const char * -diff --git a/lib/eal/common/eal_internal_cfg.h b/lib/eal/common/eal_internal_cfg.h -index d6c0470eb8..8c326f2f87 100644 ---- a/lib/eal/common/eal_internal_cfg.h -+++ b/lib/eal/common/eal_internal_cfg.h -@@ -94,8 +94,10 @@ struct internal_config { - unsigned int no_telemetry; /**< true to disable Telemetry */ - struct simd_bitwidth max_simd_bitwidth; - /**< max simd bitwidth path to use */ -+ volatile unsigned pri_and_sec; -+ volatile unsigned map_perfect; - }; - --void eal_reset_internal_config(struct internal_config *internal_cfg); -+void eal_reset_internal_config(struct internal_config *internal_conf); - - #endif /* EAL_INTERNAL_CFG_H */ -diff --git a/lib/eal/common/eal_memalloc.h b/lib/eal/common/eal_memalloc.h -index ebc3a6f6c1..19ccee7891 100644 ---- a/lib/eal/common/eal_memalloc.h -+++ b/lib/eal/common/eal_memalloc.h -@@ -83,6 +83,10 @@ eal_memalloc_get_seg_fd(int list_idx, int seg_idx); - int - eal_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd); - -+int -+eal_sec_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd, -+ const int switch_pri_and_sec, const int sec_idx); -+ - /* returns 0 or -errno */ - int - eal_memalloc_set_seg_list_fd(int list_idx, int fd); -@@ -96,4 +100,7 @@ eal_memalloc_init(void); - int - eal_memalloc_cleanup(void); - -+int -+eal_sec_memalloc_destroy(const int sec_idx); -+ - #endif /* EAL_MEMALLOC_H */ -diff --git a/lib/eal/common/eal_options.h b/lib/eal/common/eal_options.h -index 8e4f7202a2..95625c4002 100644 ---- a/lib/eal/common/eal_options.h -+++ b/lib/eal/common/eal_options.h -@@ -87,6 +87,10 @@ enum { - OPT_NO_TELEMETRY_NUM, - #define OPT_FORCE_MAX_SIMD_BITWIDTH "force-max-simd-bitwidth" - OPT_FORCE_MAX_SIMD_BITWIDTH_NUM, -+#define OPT_PRI_AND_SEC "pri-and-sec" -+ OPT_PRI_AND_SEC_NUM, -+#define OPT_MAP_PERFECT "map-perfect" -+ OPT_MAP_PERFECT_NUM, - - OPT_LONG_MAX_NUM - }; -@@ -97,9 +101,10 @@ extern const struct option eal_long_options[]; - int eal_parse_common_option(int opt, const char *argv, - struct internal_config *conf); - int eal_option_device_parse(void); --int eal_adjust_config(struct internal_config *internal_cfg); --int eal_cleanup_config(struct internal_config *internal_cfg); --int eal_check_common_options(struct internal_config *internal_cfg); -+int eal_adjust_config(struct internal_config *internal_conf); -+int eal_sec_adjust_config(struct internal_config *internal_conf); -+int eal_cleanup_config(struct internal_config *internal_conf); -+int eal_check_common_options(struct internal_config *internal_conf, struct rte_config *cfg); - void eal_common_usage(void); - enum rte_proc_type_t eal_proc_type_detect(void); - int eal_plugins_init(void); -diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h -index 36bcc0b5a4..ac8af18773 100644 ---- a/lib/eal/common/eal_private.h -+++ b/lib/eal/common/eal_private.h -@@ -103,7 +103,8 @@ int rte_eal_cpu_init(void); - * @return - * 0 on success, negative on error - */ --int rte_eal_memseg_init(void); -+//int rte_eal_memseg_init(void); -+int rte_eal_memseg_init(const int switch_pri_and_sec, const int sec_idx); - - /** - * Map memory -@@ -117,6 +118,9 @@ int rte_eal_memseg_init(void); - */ - int rte_eal_memory_init(void); - -+int rte_eal_sec_memory_init(const int sec_idx); -+int rte_eal_sec_memory_cleanup(const int sec_idx); -+ - /** - * Configure timers - * -@@ -413,7 +417,8 @@ int rte_eal_hugepage_init(void); - * - * This function is private to the EAL. - */ --int rte_eal_hugepage_attach(void); -+//int rte_eal_hugepage_attach(void); -+int rte_eal_hugepage_attach(const int switch_pri_and_sec, const int sec_idx); - - /** - * Detaches all memory mappings from a process. -@@ -689,6 +694,9 @@ eal_mem_set_dump(void *virt, size_t size, bool dump); - int - eal_set_runtime_dir(char *run_dir, size_t size); - -+int -+eal_sec_set_runtime_dir(char *run_dir, size_t size, const int sec_idx); -+ - /** - * Get the internal configuration structure. - * -@@ -738,4 +746,19 @@ int eal_asprintf(char **buffer, const char *format, ...); - eal_asprintf(buffer, format, ##__VA_ARGS__) - #endif - -+ -+/****** APIs for libnet ******/ -+#include -+ -+struct rte_memseg * -+rte_sec_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl, -+ const struct rte_config *rte_cfg); -+ -+struct rte_memseg_list * -+rte_sec_mem_virt2memseg_list(const void *addr, const struct rte_config *rte_cfg); -+ -+int -+rte_sec_memseg_list_walk_thread_unsafe(rte_memseg_list_walk_t func, void *arg, -+ struct rte_config *rte_cfg); -+ - #endif /* _EAL_PRIVATE_H_ */ -diff --git a/lib/eal/include/rte_eal.h b/lib/eal/include/rte_eal.h -index 5a34a6acd9..c3259a4af3 100644 ---- a/lib/eal/include/rte_eal.h -+++ b/lib/eal/include/rte_eal.h -@@ -472,9 +472,17 @@ rte_eal_mbuf_user_pool_ops(void); - * @return - * The runtime directory path of DPDK - */ --const char * -+char * - rte_eal_get_runtime_dir(void); - -+/****** APIs for libnet ******/ -+char *rte_eal_sec_get_runtime_dir(const int sec_idx); -+struct rte_config *rte_eal_sec_get_configuration(const int sec_idx); -+struct internal_config *rte_eal_sec_get_internal_config(const int sec_idx); -+ -+int rte_eal_sec_attach(int argc, char **argv); -+int rte_eal_sec_detach(const char *file_prefix, int length); -+ - #ifdef __cplusplus - } - #endif -diff --git a/lib/eal/include/rte_fbarray.h b/lib/eal/include/rte_fbarray.h -index c64868711e..e35a0cc0b4 100644 ---- a/lib/eal/include/rte_fbarray.h -+++ b/lib/eal/include/rte_fbarray.h -@@ -99,6 +99,10 @@ rte_fbarray_init(struct rte_fbarray *arr, const char *name, unsigned int len, - int - rte_fbarray_attach(struct rte_fbarray *arr); - -+int -+rte_sec_fbarray_attach(struct rte_fbarray *arr, -+ const int switch_pri_and_sec, const int sec_idx); -+ - - /** - * Deallocate resources for an already allocated and correctly set up -@@ -120,6 +124,8 @@ rte_fbarray_attach(struct rte_fbarray *arr); - int - rte_fbarray_destroy(struct rte_fbarray *arr); - -+int -+rte_sec_fbarray_destroy(struct rte_fbarray *arr, const int sec_idx); - - /** - * Deallocate resources for an already allocated and correctly set up -diff --git a/lib/eal/include/rte_memory.h b/lib/eal/include/rte_memory.h -index 6d018629ae..bf4c6098e3 100644 ---- a/lib/eal/include/rte_memory.h -+++ b/lib/eal/include/rte_memory.h -@@ -143,7 +143,12 @@ rte_mem_iova2virt(rte_iova_t iova); - */ - struct rte_memseg * - rte_mem_virt2memseg(const void *virt, const struct rte_memseg_list *msl); -- -+/* -+__rte_experimental -+struct rte_memseg * -+rte_sec_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl, -+ const struct rte_config *rte_cfg); -+*/ - /** - * Get memseg list corresponding to virtual memory address. - * -@@ -154,7 +159,11 @@ rte_mem_virt2memseg(const void *virt, const struct rte_memseg_list *msl); - */ - struct rte_memseg_list * - rte_mem_virt2memseg_list(const void *virt); -- -+/* -+__rte_experimental -+struct rte_memseg_list * -+rte_sec_mem_virt2memseg_list(const void *addr, const struct rte_config *rte_cfg); -+*/ - /** - * Memseg walk function prototype. - * -@@ -268,7 +277,12 @@ rte_memseg_list_walk(rte_memseg_list_walk_t func, void *arg); - */ - int - rte_memseg_walk_thread_unsafe(rte_memseg_walk_t func, void *arg); -- -+/* -+__rte_experimental -+int -+rte_sec_memseg_list_walk_thread_unsafe(rte_memseg_list_walk_t func, void *arg, -+ struct rte_config *rte_cfg); -+*/ - /** - * Walk each VA-contiguous area without performing any locking. - * -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 47c2186bee..a3afa80d99 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -88,8 +88,10 @@ int rte_cycles_vmware_tsc_map; - - static const char *default_runtime_dir = "/var/run"; - -+static unsigned int sec_count = 0; -+ - int --eal_create_runtime_dir(void) -+eal_create_runtime_dir(const int sec_idx) - { - const char *directory = default_runtime_dir; - const char *xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"); -@@ -113,8 +115,9 @@ eal_create_runtime_dir(void) - } - - /* create prefix-specific subdirectory under DPDK runtime dir */ -- ret = snprintf(run_dir, sizeof(run_dir), "%s/%s", -- tmp, eal_get_hugefile_prefix()); -+ const char *prefix = (sec_idx < 0) ? eal_get_hugefile_prefix() : -+ eal_sec_get_hugefile_prefix(sec_idx); -+ ret = snprintf(run_dir, sizeof(run_dir), "%s/%s", tmp, prefix); - if (ret < 0 || ret == sizeof(run_dir)) { - RTE_LOG(ERR, EAL, "Error creating prefix-specific runtime path name\n"); - return -1; -@@ -137,7 +140,9 @@ eal_create_runtime_dir(void) - return -1; - } - -- if (eal_set_runtime_dir(run_dir, sizeof(run_dir))) -+ ret = (sec_idx < 0) ? eal_set_runtime_dir(run_dir, sizeof(run_dir)) : -+ eal_sec_set_runtime_dir(run_dir, sizeof(run_dir), sec_idx); -+ if (ret) - return -1; - - return 0; -@@ -355,21 +360,22 @@ rte_eal_config_create(void) - - /* attach to an existing shared memory config */ - static int --rte_eal_config_attach(void) -+__rte_eal_config_attach(const int mmap_flags, int *mem_cfg_fd, -+ const char *runtime_dir, -+ const struct internal_config *internal_conf, -+ struct rte_config *rte_cfg) - { -- struct rte_config *config = rte_eal_get_configuration(); - struct rte_mem_config *mem_config; -- const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -+ int mcfg_fd = *mem_cfg_fd; - -- const char *pathname = eal_runtime_config_path(); -+ const char *pathname = eal_sec_runtime_config_path(runtime_dir); - - if (internal_conf->no_shconf) - return 0; - -- if (mem_cfg_fd < 0){ -- mem_cfg_fd = open(pathname, O_RDWR); -- if (mem_cfg_fd < 0) { -+ if (mcfg_fd < 0){ -+ mcfg_fd = open(pathname, O_RDWR); -+ if (mcfg_fd < 0) { - RTE_LOG(ERR, EAL, "Cannot open '%s' for rte_mem_config\n", - pathname); - return -1; -@@ -378,20 +384,32 @@ rte_eal_config_attach(void) - - /* map it as read-only first */ - mem_config = (struct rte_mem_config *) mmap(NULL, sizeof(*mem_config), -- PROT_READ, MAP_SHARED, mem_cfg_fd, 0); -+ mmap_flags, MAP_SHARED, mcfg_fd, 0); - if (mem_config == MAP_FAILED) { -- close(mem_cfg_fd); -- mem_cfg_fd = -1; -+ close(mcfg_fd); -+ mcfg_fd = -1; - RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config! error %i (%s)\n", - errno, strerror(errno)); - return -1; - } - -- config->mem_config = mem_config; -+ rte_cfg->mem_config = mem_config; -+ *mem_cfg_fd = mcfg_fd; - - return 0; - } - -+static int -+rte_eal_config_attach(void) -+{ -+ const struct internal_config *internal_conf = eal_get_internal_configuration(); -+ -+ return __rte_eal_config_attach(PROT_READ, &mem_cfg_fd, -+ rte_eal_get_runtime_dir(), internal_conf, -+ rte_eal_get_configuration()); -+} -+ -+ - /* reattach the shared config at exact memory location primary process has it */ - static int - rte_eal_config_reattach(void) -@@ -508,6 +526,45 @@ rte_config_init(void) - return 0; - } - -+static void -+rte_sec_config_init(const int sec_idx) -+{ -+ int mem_cfg_fd = -1; -+ int mmap_flags = PROT_READ | PROT_WRITE; -+ -+ struct rte_config *rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ struct internal_config *internal_conf = rte_eal_sec_get_internal_config(sec_idx); -+ -+ rte_cfg->process_type = internal_conf->process_type; -+ -+ __rte_eal_config_attach(mmap_flags, &mem_cfg_fd, -+ rte_eal_sec_get_runtime_dir(sec_idx), -+ internal_conf, rte_cfg); -+ -+ close(mem_cfg_fd); -+} -+ -+static int -+eal_sec_config_cleanup(const int sec_idx) -+{ -+ int ret; -+ struct rte_config *lc_rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ struct internal_config *lc_internal_cfg = rte_eal_sec_get_internal_config(sec_idx); -+ char *lc_runtime_dir = rte_eal_sec_get_runtime_dir(sec_idx); -+ -+ ret = munmap(lc_rte_cfg->mem_config, sizeof(*lc_rte_cfg->mem_config)); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Failed to unmap config memory!\n"); -+ return -1; -+ } -+ -+ memset(lc_rte_cfg, 0, sizeof(*lc_rte_cfg)); -+ memset(lc_internal_cfg, 0, sizeof(*lc_internal_cfg)); -+ memset(lc_runtime_dir, 0, PATH_MAX); -+ -+ return 0; -+} -+ - /* Unlocks hugepage directories that were locked by eal_hugepage_info_init */ - static void - eal_hugedirs_unlock(void) -@@ -548,6 +605,7 @@ eal_usage(const char *prgname) - " --"OPT_LEGACY_MEM" Legacy memory mode (no dynamic allocation, contiguous segments)\n" - " --"OPT_SINGLE_FILE_SEGMENTS" Put all hugepage memory in single files\n" - " --"OPT_MATCH_ALLOCATIONS" Free hugepages exactly as allocated\n" -+ " --"OPT_MAP_PERFECT" Map virtual addresses according to configured hugepage size\n" - "\n"); - /* Allow the application to print its usage message too if hook is set */ - if (hook) { -@@ -678,7 +736,9 @@ eal_log_level_parse(int argc, char **argv) - - /* Parse the argument given in the command line of the application */ - static int --eal_parse_args(int argc, char **argv) -+__eal_parse_args(int argc, char **argv, const int sec_idx, -+ struct internal_config *internal_conf, -+ struct rte_config *rte_cfg) - { - int opt, ret; - char **argvopt; -@@ -687,8 +747,6 @@ eal_parse_args(int argc, char **argv) - const int old_optind = optind; - const int old_optopt = optopt; - char * const old_optarg = optarg; -- struct internal_config *internal_conf = -- eal_get_internal_configuration(); - - argvopt = argv; - optind = 1; -@@ -816,6 +874,9 @@ eal_parse_args(int argc, char **argv) - case OPT_MATCH_ALLOCATIONS_NUM: - internal_conf->match_allocations = 1; - break; -+ case OPT_MAP_PERFECT_NUM: -+ internal_conf->map_perfect = 1; -+ break; - - default: - if (opt < OPT_LONG_MIN_NUM && isprint(opt)) { -@@ -837,7 +898,7 @@ eal_parse_args(int argc, char **argv) - } - - /* create runtime data directory. In no_shconf mode, skip any errors */ -- if (eal_create_runtime_dir() < 0) { -+ if (eal_create_runtime_dir(sec_idx) < 0) { - if (internal_conf->no_shconf == 0) { - RTE_LOG(ERR, EAL, "Cannot create runtime directory\n"); - ret = -1; -@@ -846,13 +907,18 @@ eal_parse_args(int argc, char **argv) - RTE_LOG(WARNING, EAL, "No DPDK runtime directory created\n"); - } - -- if (eal_adjust_config(internal_conf) != 0) { -- ret = -1; -- goto out; -+ if (!internal_conf->pri_and_sec) { -+ ret = eal_adjust_config(internal_conf); -+ if (ret != 0) -+ goto out; -+ } else { -+ ret = eal_sec_adjust_config(internal_conf); -+ if (ret != 0) -+ goto out; - } - - /* sanity checks */ -- if (eal_check_common_options(internal_conf) != 0) { -+ if (eal_check_common_options(internal_conf, rte_cfg) != 0) { - eal_usage(prgname); - ret = -1; - goto out; -@@ -871,6 +937,24 @@ eal_parse_args(int argc, char **argv) - return ret; - } - -+static int -+eal_parse_args(int argc, char **argv) -+{ -+ struct internal_config *internal_conf = eal_get_internal_configuration(); -+ -+ return __eal_parse_args(argc, argv, -1, -+ internal_conf, -+ rte_eal_get_configuration()); -+} -+ -+static int -+eal_sec_parse_args(int argc, char **argv, const int sec_idx) -+{ -+ return __eal_parse_args(argc, argv, sec_idx, -+ rte_eal_sec_get_internal_config(sec_idx), -+ rte_eal_sec_get_configuration(sec_idx)); -+} -+ - static int - check_socket(const struct rte_memseg_list *msl, void *arg) - { -@@ -1437,3 +1521,101 @@ rte_eal_check_module(const char *module_name) - /* Module has been found */ - return 1; - } -+ -+ -+/****** APIs for libnet ******/ -+int -+rte_eal_sec_attach(int argc, char **argv) -+{ -+ int ret; -+ int sec_idx = -1; -+ struct internal_config *lc_internal_conf = NULL; -+ -+ if (sec_count >= RTE_MAX_SECONDARY) { -+ RTE_LOG(ERR, EAL, "Too many secondary processes: %d.\n", sec_count); -+ rte_errno = EINVAL; -+ return -1; -+ } -+ -+ for (int i = 0; i < RTE_MAX_SECONDARY; ++i) { -+ lc_internal_conf = rte_eal_sec_get_internal_config(i); -+ if (lc_internal_conf->pri_and_sec == 0) { -+ lc_internal_conf->pri_and_sec = 1; -+ sec_idx = i; -+ break; -+ } -+ } -+ -+ eal_reset_internal_config(lc_internal_conf); -+ -+ ret = eal_sec_parse_args(argc, argv, sec_idx); -+ if (ret < 0) { -+ if (ret == -EALREADY) { -+ RTE_LOG(ERR, EAL, "file_refix %s already called initialization.\n", -+ lc_internal_conf->hugefile_prefix); -+ rte_errno = EALREADY; -+ } else { -+ RTE_LOG(ERR, EAL, "Invalid 'command line' arguments.\n"); -+ rte_errno = EINVAL; -+ } -+ return -1; -+ } -+ -+ rte_sec_config_init(sec_idx); -+ -+ ret = rte_eal_sec_memory_init(sec_idx); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Cannot init memory\n"); -+ rte_errno = ENOMEM; -+ return -1; -+ } -+ -+ sec_count++; -+ return 0; -+} -+ -+int -+rte_eal_sec_detach(const char *file_prefix, int length) -+{ -+ int ret; -+ int sec_idx = -1; -+ struct internal_config *lc_internal_conf = NULL; -+ -+ if (!file_prefix || length <= 0) { -+ RTE_LOG(ERR, EAL, "Invalid 'file_prefix or length' arguments.\n"); -+ rte_errno = EINVAL; -+ return -1; -+ } -+ -+ for (int i = 0; i < RTE_MAX_SECONDARY; ++i) { -+ lc_internal_conf = rte_eal_sec_get_internal_config(i); -+ if (lc_internal_conf->pri_and_sec == 0) -+ continue; -+ if (!strncmp(lc_internal_conf->hugefile_prefix, file_prefix, length)) { -+ sec_idx = i; -+ break; -+ } -+ } -+ if (sec_idx == -1) { -+ RTE_LOG(ERR, EAL, "Cannot find file_prefix %s.\n", file_prefix); -+ rte_errno = EINVAL; -+ return -1; -+ } -+ -+ ret = rte_eal_sec_memory_cleanup(sec_idx); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Cannot cleanup memory\n"); -+ rte_errno = ENOMEM; -+ return -1; -+ } -+ -+ ret = eal_sec_config_cleanup(sec_idx); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Cannot cleanup hugepage sharefile.\n"); -+ rte_errno = EACCES; -+ return -1; -+ } -+ -+ sec_count--; -+ return 0; -+} -diff --git a/lib/eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c -index 9fb0e968db..41acf180ee 100644 ---- a/lib/eal/linux/eal_hugepage_info.c -+++ b/lib/eal/linux/eal_hugepage_info.c -@@ -389,7 +389,7 @@ calc_num_pages(struct hugepage_info *hpi, struct dirent *dirent) - */ - total_pages = 0; - /* we also don't want to do this for legacy init */ -- if (!internal_conf->legacy_mem) -+ if (!internal_conf->legacy_mem || internal_conf->map_perfect) - for (i = 0; i < rte_socket_count(); i++) { - int socket = rte_socket_id_by_idx(i); - unsigned int num_pages = -diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c -index fc354f4a17..dac9098c8c 100644 ---- a/lib/eal/linux/eal_memalloc.c -+++ b/lib/eal/linux/eal_memalloc.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - - #include "eal_filesystem.h" - #include "eal_internal_cfg.h" -@@ -95,12 +96,14 @@ static int fallocate_supported = -1; /* unknown */ - * they will be initialized at startup, and filled as we allocate/deallocate - * segments. - */ --static struct { -+struct fd_list{ - int *fds; /**< dynamically allocated array of segment lock fd's */ - int memseg_list_fd; /**< memseg list fd */ - int len; /**< total length of the array */ - int count; /**< entries used in an array */ --} fd_list[RTE_MAX_MEMSEG_LISTS]; -+}; -+static struct fd_list fd_list[RTE_MAX_MEMSEG_LISTS]; -+static struct fd_list sec_fd_list[RTE_MAX_SECONDARY][RTE_MAX_MEMSEG_LISTS]; - - /** local copy of a memory map, used to synchronize memory hotplug in MP */ - static struct rte_memseg_list local_memsegs[RTE_MAX_MEMSEG_LISTS]; -@@ -1462,7 +1465,7 @@ secondary_msl_destroy_walk(const struct rte_memseg_list *msl, - } - - static int --alloc_list(int list_idx, int len) -+__alloc_list(int list_idx, int len, struct fd_list *fd_ls) - { - int *data; - int i; -@@ -1470,7 +1473,7 @@ alloc_list(int list_idx, int len) - eal_get_internal_configuration(); - - /* single-file segments mode does not need fd list */ -- if (!internal_conf->single_file_segments) { -+ if (!internal_conf->single_file_segments) { // sec todo - /* ensure we have space to store fd per each possible segment */ - data = malloc(sizeof(int) * len); - if (data == NULL) { -@@ -1480,24 +1483,36 @@ alloc_list(int list_idx, int len) - /* set all fd's as invalid */ - for (i = 0; i < len; i++) - data[i] = -1; -- fd_list[list_idx].fds = data; -- fd_list[list_idx].len = len; -+ fd_ls[list_idx].fds = data; -+ fd_ls[list_idx].len = len; - } else { -- fd_list[list_idx].fds = NULL; -- fd_list[list_idx].len = 0; -+ fd_ls[list_idx].fds = NULL; -+ fd_ls[list_idx].len = 0; - } - -- fd_list[list_idx].count = 0; -- fd_list[list_idx].memseg_list_fd = -1; -+ fd_ls[list_idx].count = 0; -+ fd_ls[list_idx].memseg_list_fd = -1; - - return 0; - } - -+static int -+alloc_list(int list_idx, int len) -+{ -+ return __alloc_list(list_idx, len, fd_list); -+} -+ -+static int -+sec_alloc_list(int list_idx, int len, struct fd_list *fd_ls) -+{ -+ return __alloc_list(list_idx, len, fd_ls); -+} -+ - static int - destroy_list(int list_idx) - { - const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -+ eal_get_internal_configuration(); - - /* single-file segments mode does not need fd list */ - if (!internal_conf->single_file_segments) { -@@ -1552,29 +1567,54 @@ fd_list_destroy_walk(const struct rte_memseg_list *msl, void *arg __rte_unused) - return destroy_list(msl_idx); - } - --int --eal_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd) -+static int -+__eal_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd, -+ const struct rte_config *rte_cfg, struct fd_list *fd_ls) - { -- struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; -- const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -- -+ struct rte_mem_config *mcfg = rte_cfg->mem_config; -+ const struct internal_config *internal_conf = eal_get_internal_configuration(); -+ - /* single file segments mode doesn't support individual segment fd's */ -- if (internal_conf->single_file_segments) -+ if (internal_conf->single_file_segments) // sec todo - return -ENOTSUP; - - /* if list is not allocated, allocate it */ -- if (fd_list[list_idx].len == 0) { -+ if (fd_ls[list_idx].len == 0) { - int len = mcfg->memsegs[list_idx].memseg_arr.len; - -- if (alloc_list(list_idx, len) < 0) -+ if (sec_alloc_list(list_idx, len, fd_ls) < 0) - return -ENOMEM; - } -- fd_list[list_idx].fds[seg_idx] = fd; -+ fd_ls[list_idx].fds[seg_idx] = fd; - - return 0; - } - -+int -+eal_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd) -+{ -+ return __eal_memalloc_set_seg_fd(list_idx, seg_idx, fd, -+ rte_eal_get_configuration(), fd_list); -+} -+ -+int -+eal_sec_memalloc_set_seg_fd(int list_idx, int seg_idx, int fd, -+ const int switch_pri_and_sec, const int sec_idx) -+{ -+ struct rte_config *rte_cfg = NULL; -+ struct fd_list *fd_ls = NULL; -+ -+ if (!switch_pri_and_sec) { -+ rte_cfg = rte_eal_get_configuration(); -+ fd_ls = &fd_list[0]; -+ } else { -+ rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ fd_ls = &sec_fd_list[sec_idx][0]; -+ } -+ -+ return __eal_memalloc_set_seg_fd(list_idx, seg_idx, fd, rte_cfg, fd_ls); -+} -+ - int - eal_memalloc_set_seg_list_fd(int list_idx, int fd) - { -@@ -1749,3 +1789,49 @@ eal_memalloc_init(void) - return -1; - return 0; - } -+ -+static int -+fd_sec_list_destroy_walk(const struct rte_memseg_list *msl, const int sec_idx) -+{ -+ struct rte_mem_config *mcfg = rte_eal_sec_get_configuration(sec_idx)->mem_config; -+ struct fd_list *fd_ls = sec_fd_list[sec_idx]; -+ int list_idx; -+ -+ list_idx = msl - mcfg->memsegs; -+ if (fd_ls[list_idx].len != 0) { -+ free(fd_ls[list_idx].fds); -+ /* We have closed fd, seeing in function of eal_legacy_hugepage_attach. */ -+ //close(fd_ls[list_idx].fds[seg_idx]); -+ } -+ memset(&fd_ls[list_idx], 0, sizeof(fd_ls[list_idx])); -+ -+ return 0; -+} -+ -+int -+eal_sec_memalloc_destroy(const int sec_idx) -+{ -+ struct rte_mem_config *mcfg = rte_eal_sec_get_configuration(sec_idx)->mem_config; -+ int i, ret = 0; -+ -+ for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) { -+ struct rte_memseg_list *msl = &mcfg->memsegs[i]; -+ -+ if (msl->base_va == NULL) -+ continue; -+ -+ if (fd_sec_list_destroy_walk(msl, sec_idx)) { -+ RTE_LOG(ERR, EAL, "Failed to clear secondary fd_list.\n"); -+ return -1; -+ } -+ -+ ret = rte_sec_fbarray_destroy(&msl->memseg_arr, sec_idx); -+ if (ret) -+ return ret; -+ -+ rte_mem_unmap(msl->base_va, msl->len); -+ memset(msl, 0, sizeof(*msl)); -+ } -+ -+ return 0; -+} -diff --git a/lib/eal/linux/eal_memory.c b/lib/eal/linux/eal_memory.c -index 03a4f2dd2d..4d78a47e0a 100644 ---- a/lib/eal/linux/eal_memory.c -+++ b/lib/eal/linux/eal_memory.c -@@ -992,6 +992,7 @@ static int - remap_needed_hugepages(struct hugepage_file *hugepages, int n_pages) - { - int cur_page, seg_start_page, new_memseg, ret; -+ const struct internal_config *internal_conf = eal_get_internal_configuration(); - - seg_start_page = 0; - for (cur_page = 0; cur_page < n_pages; cur_page++) { -@@ -1017,10 +1018,10 @@ remap_needed_hugepages(struct hugepage_file *hugepages, int n_pages) - * address to lower address. Here, physical addresses are in - * descending order. - */ -- else if ((prev->physaddr - cur->physaddr) != cur->size) -+ else if (!internal_conf->map_perfect && (prev->physaddr - cur->physaddr) != cur->size) - new_memseg = 1; - #else -- else if ((cur->physaddr - prev->physaddr) != cur->size) -+ else if (!internal_conf->map_perfect && (cur->physaddr - prev->physaddr) != cur->size) - new_memseg = 1; - #endif - -@@ -1235,6 +1236,24 @@ eal_legacy_hugepage_init(void) - for (i = 0; i < (int) internal_conf->num_hugepage_sizes; i++) { - /* meanwhile, also initialize used_hp hugepage sizes in used_hp */ - used_hp[i].hugepage_sz = internal_conf->hugepage_info[i].hugepage_sz; -+ -+ if (internal_conf->map_perfect) { -+ int sys_num_pages = 0; -+ int need_num_pages = 0; -+ struct rte_memseg_list *msl; -+ -+ for (j = 0; j < RTE_MAX_NUMA_NODES; j++) { -+ sys_num_pages += internal_conf->hugepage_info[i].num_pages[j]; -+ } -+ -+ for (j = 0; j < RTE_MAX_MEMSEG_LISTS; j++) { -+ msl = &mcfg->memsegs[j]; -+ if (internal_conf->hugepage_info[i].hugepage_sz == msl->page_sz) -+ need_num_pages += msl->memseg_arr.len; -+ } -+ -+ internal_conf->hugepage_info[i].num_pages[0] = RTE_MIN(sys_num_pages, need_num_pages); -+ } - - nr_hugepages += internal_conf->hugepage_info[i].num_pages[0]; - } -@@ -1316,8 +1335,13 @@ eal_legacy_hugepage_init(void) - goto fail; - } - -- qsort(&tmp_hp[hp_offset], hpi->num_pages[0], -- sizeof(struct hugepage_file), cmp_physaddr); -+ /* continuous physical memory does not bring performance improvements, -+ * so no sorting is performed for quick startup. -+ */ -+ if (!internal_conf->map_perfect) { -+ qsort(&tmp_hp[hp_offset], hpi->num_pages[0], -+ sizeof(struct hugepage_file), cmp_physaddr); -+ } - - /* we have processed a num of hugepages of this size, so inc offset */ - hp_offset += hpi->num_pages[0]; -@@ -1502,9 +1526,9 @@ getFileSize(int fd) - * in order to form a contiguous block in the virtual memory space - */ - static int --eal_legacy_hugepage_attach(void) -+eal_legacy_hugepage_attach(const int switch_pri_and_sec, const int sec_idx) - { -- struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; -+ struct rte_mem_config *mcfg = NULL; - struct hugepage_file *hp = NULL; - unsigned int num_hp = 0; - unsigned int i = 0; -@@ -1512,6 +1536,22 @@ eal_legacy_hugepage_attach(void) - off_t size = 0; - int fd, fd_hugepage = -1; - -+ struct rte_config *rte_cfg = NULL; -+ struct internal_config *internal_conf = NULL; -+ char *runtime_dir = NULL; -+ -+ if (!switch_pri_and_sec) { -+ runtime_dir = rte_eal_get_runtime_dir(); -+ rte_cfg = rte_eal_get_configuration(); -+ internal_conf = eal_get_internal_configuration(); -+ } else { -+ runtime_dir = rte_eal_sec_get_runtime_dir(sec_idx); -+ rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ internal_conf = rte_eal_sec_get_internal_config(sec_idx); -+ } -+ -+ mcfg = rte_cfg->mem_config; -+ - if (aslr_enabled() > 0) { - RTE_LOG(WARNING, EAL, "WARNING: Address Space Layout Randomization " - "(ASLR) is enabled in the kernel.\n"); -@@ -1519,10 +1559,10 @@ eal_legacy_hugepage_attach(void) - "into secondary processes\n"); - } - -- fd_hugepage = open(eal_hugepage_data_path(), O_RDONLY); -+ fd_hugepage = open(eal_sec_hugepage_data_path(runtime_dir), O_RDONLY); - if (fd_hugepage < 0) { - RTE_LOG(ERR, EAL, "Could not open %s\n", -- eal_hugepage_data_path()); -+ eal_sec_hugepage_data_path(runtime_dir)); - goto error; - } - -@@ -1530,7 +1570,7 @@ eal_legacy_hugepage_attach(void) - hp = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd_hugepage, 0); - if (hp == MAP_FAILED) { - RTE_LOG(ERR, EAL, "Could not mmap %s\n", -- eal_hugepage_data_path()); -+ eal_sec_hugepage_data_path(runtime_dir)); - goto error; - } - -@@ -1577,13 +1617,13 @@ eal_legacy_hugepage_attach(void) - } - - /* find segment data */ -- msl = rte_mem_virt2memseg_list(map_addr); -+ msl = rte_sec_mem_virt2memseg_list(map_addr, rte_cfg); - if (msl == NULL) { - RTE_LOG(DEBUG, EAL, "%s(): Cannot find memseg list\n", - __func__); - goto mmap_error; - } -- ms = rte_mem_virt2memseg(map_addr, msl); -+ ms = rte_sec_mem_virt2memseg(map_addr, msl, rte_cfg); - if (ms == NULL) { - RTE_LOG(DEBUG, EAL, "%s(): Cannot find memseg\n", - __func__); -@@ -1598,8 +1638,16 @@ eal_legacy_hugepage_attach(void) - goto mmap_error; - } - -+ /* No hugefile lock is required in PRI_AND_SEC mode, close it -+ * to avoid opening too much fd. -+ */ -+ if (internal_conf->pri_and_sec) { -+ close(fd); -+ fd = -1; -+ } -+ - /* store segment fd internally */ -- if (eal_memalloc_set_seg_fd(msl_idx, ms_idx, fd) < 0) -+ if (eal_sec_memalloc_set_seg_fd(msl_idx, ms_idx, fd, switch_pri_and_sec, sec_idx) < 0) - RTE_LOG(ERR, EAL, "Could not store segment fd: %s\n", - rte_strerror(rte_errno)); - } -@@ -1648,13 +1696,17 @@ rte_eal_hugepage_init(void) - } - - int --rte_eal_hugepage_attach(void) -+rte_eal_hugepage_attach(const int switch_pri_and_sec, const int sec_idx) - { -- const struct internal_config *internal_conf = -- eal_get_internal_configuration(); -+ struct internal_config *internal_conf; -+ -+ if (!switch_pri_and_sec) -+ internal_conf = eal_get_internal_configuration(); -+ else -+ internal_conf = rte_eal_sec_get_internal_config(sec_idx); - - return internal_conf->legacy_mem ? -- eal_legacy_hugepage_attach() : -+ eal_legacy_hugepage_attach(switch_pri_and_sec, sec_idx) : - eal_hugepage_attach(); - } - -@@ -1873,9 +1925,10 @@ memseg_primary_init(void) - } - - static int --memseg_secondary_init(void) -+memseg_secondary_init(struct rte_config *rte_cfg, -+ const int switch_pri_and_sec, const int sec_idx) - { -- struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; -+ struct rte_mem_config *mcfg = rte_cfg->mem_config; - int msl_idx = 0; - struct rte_memseg_list *msl; - -@@ -1887,7 +1940,7 @@ memseg_secondary_init(void) - if (msl->memseg_arr.len == 0) - continue; - -- if (rte_fbarray_attach(&msl->memseg_arr)) { -+ if (rte_sec_fbarray_attach(&msl->memseg_arr, switch_pri_and_sec, sec_idx)) { - RTE_LOG(ERR, EAL, "Cannot attach to primary process memseg lists\n"); - return -1; - } -@@ -1903,11 +1956,18 @@ memseg_secondary_init(void) - } - - int --rte_eal_memseg_init(void) -+rte_eal_memseg_init(const int switch_pri_and_sec, const int sec_idx) - { - /* increase rlimit to maximum */ - struct rlimit lim; - -+ struct rte_config *rte_cfg = NULL; -+ if (!switch_pri_and_sec) { -+ rte_cfg = rte_eal_get_configuration(); -+ } else { -+ rte_cfg = rte_eal_sec_get_configuration(sec_idx); -+ } -+ - #ifndef RTE_EAL_NUMA_AWARE_HUGEPAGES - const struct internal_config *internal_conf = - eal_get_internal_configuration(); -@@ -1935,11 +1995,11 @@ rte_eal_memseg_init(void) - } - #endif - -- return rte_eal_process_type() == RTE_PROC_PRIMARY ? -+ return rte_cfg->process_type == RTE_PROC_PRIMARY ? - #ifndef RTE_ARCH_64 - memseg_primary_init_32() : - #else - memseg_primary_init() : - #endif -- memseg_secondary_init(); -+ memseg_secondary_init(rte_cfg, switch_pri_and_sec, sec_idx); - } -diff --git a/lib/ring/rte_ring.h b/lib/ring/rte_ring.h -index da17ed6d7c..ef18a2b39b 100644 ---- a/lib/ring/rte_ring.h -+++ b/lib/ring/rte_ring.h -@@ -802,6 +802,81 @@ rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, - n, available); - } - -+/****** APIs for libnet ******/ -+static __rte_always_inline unsigned -+rte_ring_cn_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n) -+{ -+ const uint32_t old_head = r->prod.tail; -+ rte_smp_rmb(); -+ -+ const uint32_t entries = r->cons.head - old_head; -+ if (n > entries) { -+ n = entries; -+ } -+ if (unlikely(n == 0)) { -+ return 0; -+ } -+ -+ r->prod.head = old_head + n; -+ rte_smp_rmb(); -+ -+ __rte_ring_dequeue_elems(r, old_head, obj_table, sizeof(void *), n); -+ return n; -+} -+ -+static __rte_always_inline void -+rte_ring_cn_enqueue(struct rte_ring *r) -+{ -+ rte_smp_wmb(); -+ r->prod.tail = r->prod.head; -+} -+ -+static __rte_always_inline unsigned -+rte_ring_en_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n) -+{ -+ const uint32_t old_tail = r->cons.tail; -+ rte_smp_rmb(); -+ -+ const uint32_t entries = r->prod.tail - old_tail; -+ if (n > entries) { -+ n = entries; -+ } -+ if (unlikely(n == 0)) { -+ return 0; -+ } -+ -+ const uint32_t new_tail = old_tail + n; -+ rte_smp_rmb(); -+ -+ __rte_ring_dequeue_elems(r, old_tail, obj_table, sizeof(void *), n); -+ rte_smp_rmb(); -+ -+ r->cons.tail = new_tail; -+ return n; -+} -+ -+static __rte_always_inline unsigned -+rte_ring_en_enqueue_bulk(struct rte_ring *r, void **obj_table, unsigned int n) -+{ -+ const uint32_t capacity = r->capacity; -+ const uint32_t old_head = r->cons.head; -+ rte_smp_rmb(); -+ -+ const uint32_t entries = capacity + r->cons.tail - old_head; -+ if (n > entries) { -+ return 0; -+ } -+ -+ const uint32_t new_head = old_head + n; -+ rte_smp_rmb(); -+ -+ __rte_ring_enqueue_elems(r, old_head, obj_table, sizeof(void *), n); -+ rte_smp_wmb(); -+ -+ r->cons.head = new_head; -+ return n; -+} -+ - #ifdef __cplusplus - } - #endif --- -2.27.0 - diff --git a/0009-dpdk-fix-error-in-clearing-secondary-process-memseg-lists.patch b/0009-dpdk-fix-error-in-clearing-secondary-process-memseg-lists.patch deleted file mode 100644 index 59f5295..0000000 --- a/0009-dpdk-fix-error-in-clearing-secondary-process-memseg-lists.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 9a4c67c47896fb9aa0fd8935813f2016b543a9df Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 16:45:51 +0800 -Subject: [PATCH] - huawei-0008-dpdk-fix-error-in-clearing-secondary-process-memseg-lists - ---- - lib/eal/common/eal_common_fbarray.c | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/lib/eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c -index 9c125c104c..d4a4cea7c1 100644 ---- a/lib/eal/common/eal_common_fbarray.c -+++ b/lib/eal/common/eal_common_fbarray.c -@@ -1102,7 +1102,7 @@ int - rte_sec_fbarray_destroy(struct rte_fbarray *arr, - const int sec_idx) - { -- int fd, ret; -+ int fd; - char path[PATH_MAX]; - - if (arr == NULL) { -@@ -1128,15 +1128,13 @@ rte_sec_fbarray_destroy(struct rte_fbarray *arr, - if (flock(fd, LOCK_EX | LOCK_NB)) { - RTE_LOG(DEBUG, EAL, "Cannot destroy fbarray - another process is using it\n"); - rte_errno = EBUSY; -- ret = -1; - } else { -- ret = 0; - unlink(path); - memset(arr, 0, sizeof(*arr)); - } - close(fd); - -- return ret; -+ return 0; - } - - void * --- -2.27.0 - diff --git a/0010-dpdk-fix-coredump-when-primary-process-attach-without-shared-file.patch b/0010-dpdk-fix-coredump-when-primary-process-attach-without-shared-file.patch deleted file mode 100644 index 665e213..0000000 --- a/0010-dpdk-fix-coredump-when-primary-process-attach-without-shared-file.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 097d8acb68c7d7dbfd7800c7f69eaf171ce9da4b Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 16:49:16 +0800 -Subject: [PATCH] 0009 - ---- - lib/eal/linux/eal.c | 17 ++++++++++++++--- - 1 file changed, 14 insertions(+), 3 deletions(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index f269e67fae..2555043155 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -524,22 +524,29 @@ rte_config_init(void) - return 0; - } - --static void -+static int - rte_sec_config_init(const int sec_idx) - { - int mem_cfg_fd = -1; - int mmap_flags = PROT_READ | PROT_WRITE; -+ int ret = -1; - - struct rte_config *rte_cfg = rte_eal_sec_get_configuration(sec_idx); - struct internal_config *internal_conf = rte_eal_sec_get_internal_config(sec_idx); - - rte_cfg->process_type = internal_conf->process_type; - -- __rte_eal_config_attach(mmap_flags, &mem_cfg_fd, -+ ret = __rte_eal_config_attach(mmap_flags, &mem_cfg_fd, - rte_eal_sec_get_runtime_dir(sec_idx), - internal_conf, rte_cfg); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Cannot attach shared memory\n"); -+ return -1; -+ } -+ - - close(mem_cfg_fd); -+ return 0; - } - - static int -@@ -1561,7 +1568,11 @@ rte_eal_sec_attach(int argc, char **argv) - return -1; - } - -- rte_sec_config_init(sec_idx); -+ ret = rte_sec_config_init(sec_idx); -+ if (ret < 0) { -+ RTE_LOG(ERR, EAL, "Cannot init sec config\n"); -+ return -1; -+ } - - ret = rte_eal_sec_memory_init(sec_idx); - if (ret < 0) { --- -2.27.0 - diff --git a/0011-dpdk-fix-fbarray-memseg-destory-error-during-detach.patch b/0011-dpdk-fix-fbarray-memseg-destory-error-during-detach.patch deleted file mode 100644 index abd1d2d..0000000 --- a/0011-dpdk-fix-fbarray-memseg-destory-error-during-detach.patch +++ /dev/null @@ -1,27 +0,0 @@ -From dad8149d187448f85be497ce3bb6c34bf1ffde5e Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 16:54:03 +0800 -Subject: [PATCH] 0010 - ---- - lib/eal/common/eal_common_fbarray.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c -index d4a4cea7c1..fa726cd2f5 100644 ---- a/lib/eal/common/eal_common_fbarray.c -+++ b/lib/eal/common/eal_common_fbarray.c -@@ -1122,8 +1122,8 @@ rte_sec_fbarray_destroy(struct rte_fbarray *arr, - - fd = open(path, O_RDONLY); - if (fd < 0) { -- RTE_LOG(ERR, EAL, "Could not open fbarray file: %s\n", strerror(errno)); -- return -1; -+ RTE_LOG(WARNING, EAL, "Could not open %s: %s, and just skip it\n", path, strerror(errno)); -+ return 0; - } - if (flock(fd, LOCK_EX | LOCK_NB)) { - RTE_LOG(DEBUG, EAL, "Cannot destroy fbarray - another process is using it\n"); --- -2.27.0 - diff --git a/0012-fix-rte-eal-sec-detach-coredump-count-rollover.patch b/0012-fix-rte-eal-sec-detach-coredump-count-rollover.patch deleted file mode 100644 index b10f190..0000000 --- a/0012-fix-rte-eal-sec-detach-coredump-count-rollover.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 8ca5f1cfbea80f7524eb2f2dfa67760be80666c3 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 16:57:31 +0800 -Subject: [PATCH] 0011 - ---- - lib/eal/linux/eal.c | 4 +++- - lib/eal/linux/eal_memalloc.c | 4 ++++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 2555043155..c833b46c36 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -1627,6 +1627,8 @@ rte_eal_sec_detach(const char *file_prefix, int length) - return -1; - } - -- sec_count--; -+ if (sec_count) { -+ sec_count--; -+ } - return 0; - } -diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c -index dac9098c8c..38543bf8c4 100644 ---- a/lib/eal/linux/eal_memalloc.c -+++ b/lib/eal/linux/eal_memalloc.c -@@ -1814,6 +1814,10 @@ eal_sec_memalloc_destroy(const int sec_idx) - struct rte_mem_config *mcfg = rte_eal_sec_get_configuration(sec_idx)->mem_config; - int i, ret = 0; - -+ if (mcfg == NULL) { -+ return 0; -+ } -+ - for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) { - struct rte_memseg_list *msl = &mcfg->memsegs[i]; - --- -2.27.0 - diff --git a/0013-fix-rte-eal-memory-init-double-unlock.patch b/0013-fix-rte-eal-memory-init-double-unlock.patch deleted file mode 100644 index 3dcc04a..0000000 --- a/0013-fix-rte-eal-memory-init-double-unlock.patch +++ /dev/null @@ -1,29 +0,0 @@ -From d9e578c64144bf35e3141d2a3f3ada2763534cb2 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Thu, 16 Dec 2021 19:26:51 +0800 -Subject: [PATCH] huawei-0015-fix-rte-eal-memory-init-double-unlock - ---- - lib/eal/common/eal_common_memory.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c -index 15ce4341b0..d983e37cc8 100644 ---- a/lib/eal/common/eal_common_memory.c -+++ b/lib/eal/common/eal_common_memory.c -@@ -1150,8 +1150,10 @@ rte_eal_sec_memory_init(const int sec_idx) - ret = __rte_eal_memory_init(rte_eal_sec_get_runtime_dir(sec_idx), - rte_eal_sec_get_internal_config(sec_idx), rte_cfg, - true, sec_idx); -- -- rte_rwlock_read_unlock(&rte_cfg->mem_config->memory_hotplug_lock); -+ if (ret == 0) { -+ /* when ret != 0 unlock in __rte_eal_memory_init */ -+ rte_rwlock_read_unlock(&rte_cfg->mem_config->memory_hotplug_lock); -+ } - - return ret; - } --- -2.27.0 - diff --git a/0014-fix-last-argv-pointer-change-to-first.patch b/0014-fix-last-argv-pointer-change-to-first.patch deleted file mode 100644 index e30a4bb..0000000 --- a/0014-fix-last-argv-pointer-change-to-first.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 23113e9f48414f534358274a732921cd3f5345cf Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Thu, 16 Dec 2021 20:12:42 +0800 -Subject: [PATCH] huawei-0016-fix-last-argv-pointer-change-to-first - ---- - lib/eal/linux/eal.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 16bb2b60cc..78c61a1979 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -935,8 +935,6 @@ __eal_parse_args(int argc, char **argv, char *runtime_dir, const int buflen, - goto out; - } - -- if (optind >= 0) -- argv[optind-1] = prgname; - ret = optind-1; - - out: --- -2.27.0 - diff --git a/0015-fix-internal-cfg-and-fbarray-attach-mememory-leak.patch b/0015-fix-internal-cfg-and-fbarray-attach-mememory-leak.patch deleted file mode 100644 index 0354da9..0000000 --- a/0015-fix-internal-cfg-and-fbarray-attach-mememory-leak.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 847cbe34e8e45a0c0613cf5cd96f06ee31ada0f9 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 17:02:16 +0800 -Subject: [PATCH] 0014 - ---- - lib/eal/common/eal_common_fbarray.c | 13 ++++++++----- - lib/eal/linux/eal.c | 1 + - 2 files changed, 9 insertions(+), 5 deletions(-) - -diff --git a/lib/eal/common/eal_common_fbarray.c b/lib/eal/common/eal_common_fbarray.c -index fa726cd2f5..b809d3c669 100644 ---- a/lib/eal/common/eal_common_fbarray.c -+++ b/lib/eal/common/eal_common_fbarray.c -@@ -911,17 +911,20 @@ __rte_fbarray_attach(struct rte_fbarray *arr, const char *runtime_dir, - fd = -1; - } - -- /* store our new memory area */ -- ma->addr = data; -- ma->fd = fd; /* keep fd until detach/destroy */ -- ma->len = mmap_len; -- - if (!internal_conf->pri_and_sec) { -+ /* store our new memory area */ -+ ma->addr = data; -+ ma->fd = fd; /* keep fd until detach/destroy */ -+ ma->len = mmap_len; -+ - TAILQ_INSERT_TAIL(&mem_area_tailq, ma, next); - - /* we're done */ - - rte_spinlock_unlock(&mem_area_lock); -+ } else { -+ /* pri_and_sec don't use mem_area_tailq */ -+ free(ma); - } - return 0; - fail: -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index f70c4d55fa..2dee945be4 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -564,6 +564,7 @@ eal_sec_config_cleanup(const int sec_idx) - } - - memset(lc_rte_cfg, 0, sizeof(*lc_rte_cfg)); -+ eal_cleanup_config(lc_internal_cfg); - memset(lc_internal_cfg, 0, sizeof(*lc_internal_cfg)); - memset(lc_runtime_dir, 0, PATH_MAX); - --- -2.27.0 - diff --git a/0016-fix-error-that-the-secondary-attach-fails-due-to-detach.patch b/0016-fix-error-that-the-secondary-attach-fails-due-to-detach.patch deleted file mode 100644 index ccba129..0000000 --- a/0016-fix-error-that-the-secondary-attach-fails-due-to-detach.patch +++ /dev/null @@ -1,24 +0,0 @@ -From e8466bb5c02192727a140688df0c8882ed35ca59 Mon Sep 17 00:00:00 2001 -From: Changsheng Wu -Date: Sat, 18 Dec 2021 17:09:27 +0800 -Subject: [PATCH] 15 - ---- - lib/eal/linux/eal_memalloc.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c -index d5fe856dd8..38543bf8c4 100644 ---- a/lib/eal/linux/eal_memalloc.c -+++ b/lib/eal/linux/eal_memalloc.c -@@ -1830,7 +1830,6 @@ eal_sec_memalloc_destroy(const int sec_idx) - return ret; - - rte_mem_unmap(msl->base_va, msl->len); -- memset(msl, 0, sizeof(*msl)); - } - - return 0; --- -2.27.0 - diff --git a/0017-fix-master-thread-not-set-affinity.patch b/0017-fix-master-thread-not-set-affinity.patch deleted file mode 100644 index 1a5588e..0000000 --- a/0017-fix-master-thread-not-set-affinity.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 269be3f974c22f62892554dbb51fe859047058d7 Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Fri, 14 Jan 2022 11:11:08 +0800 -Subject: [PATCH] fix master thread not set affinity - ---- - lib/eal/linux/eal.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 123a8e8..7ca8bb2 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -1310,7 +1310,7 @@ rte_eal_init(int argc, char **argv) - eal_check_mem_on_local_socket(); - - /* Master thread don't set affinity in LibStorage application */ -- if (strstr(logid, "LibStorage") != NULL && -+ if (strstr(logid, "LibStorage") == NULL && - pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t), - &lcore_config[config->main_lcore].cpuset) != 0) { - rte_eal_init_alert("Cannot set affinity"); --- -2.30.0 - diff --git a/0018-net-bonding-fix-offloading-configuration.patch b/0018-net-bonding-fix-offloading-configuration.patch deleted file mode 100644 index 5a61ab3..0000000 --- a/0018-net-bonding-fix-offloading-configuration.patch +++ /dev/null @@ -1,71 +0,0 @@ -From ef72dacdec6c5dca8773854906159f7bc75eeb5c Mon Sep 17 00:00:00 2001 -From: Chengchang Tang -Date: Tue, 9 Nov 2021 15:57:26 +0800 -Subject: [PATCH] net/bonding: fix offloading configuration - -Currently, part offloadings of the bonding device will not take effect -by using dev_configure(). Because the related configuration will not be -delivered to the slave devices in this way. - -The offloading capability of the bonding device is the intersection of -the capability of all slave devices. Based on this, the following -functions are added to the bonding driver: -1. If a Tx offloading is within the capability of the bonding device - (i.e, all the slave devices support this Tx offloading), the enabling - status of the offloading of all slave devices depends on the - configuration of the bonding device. - -2. For the Tx offloading that is not within the Tx offloading capability - of the bonding device, the enabling status of the offloading on the - slave devices is irrelevant to the bonding device configuration. And - it depends on the original configuration of the slave devices. - -Fixes: e8b3e1a9b1bb ("net/bonding: switch to new offloading API") -Cc: stable@dpdk.org - -Signed-off-by: Chengchang Tang -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 23 +++++++++++++++-------- - 1 file changed, 15 insertions(+), 8 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 84f4900ee5..0f11a2f5a8 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1713,17 +1713,24 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - bonded_eth_dev->data->dev_conf.rxmode.mq_mode; - } - -- if (bonded_eth_dev->data->dev_conf.rxmode.offloads & -- RTE_ETH_RX_OFFLOAD_VLAN_FILTER) -- slave_eth_dev->data->dev_conf.rxmode.offloads |= -- RTE_ETH_RX_OFFLOAD_VLAN_FILTER; -- else -- slave_eth_dev->data->dev_conf.rxmode.offloads &= -- ~RTE_ETH_RX_OFFLOAD_VLAN_FILTER; -- - slave_eth_dev->data->dev_conf.rxmode.mtu = - bonded_eth_dev->data->dev_conf.rxmode.mtu; - -+ slave_eth_dev->data->dev_conf.txmode.offloads |= -+ bonded_eth_dev->data->dev_conf.txmode.offloads; -+ -+ slave_eth_dev->data->dev_conf.txmode.offloads &= -+ (bonded_eth_dev->data->dev_conf.txmode.offloads | -+ ~internals->tx_offload_capa); -+ -+ slave_eth_dev->data->dev_conf.rxmode.offloads |= -+ bonded_eth_dev->data->dev_conf.rxmode.offloads; -+ -+ slave_eth_dev->data->dev_conf.rxmode.offloads &= -+ (bonded_eth_dev->data->dev_conf.rxmode.offloads | -+ ~internals->rx_offload_capa); -+ -+ - nb_rx_queues = bonded_eth_dev->data->nb_rx_queues; - nb_tx_queues = bonded_eth_dev->data->nb_tx_queues; - --- -2.33.0 - diff --git a/0018-secure-complilation-options-rpath.patch b/0018-secure-complilation-options-rpath.patch deleted file mode 100644 index f3aae0b..0000000 --- a/0018-secure-complilation-options-rpath.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 620b54f7d1c4bbf99d894ac3c8ddf3e73c29071f Mon Sep 17 00:00:00 2001 -From: wu-changsheng -Date: Tue, 13 Sep 2022 22:33:48 +0800 -Subject: [PATCH] delete rpath - ---- - app/meson.build | 1 - - app/test/meson.build | 2 -- - 2 files changed, 3 deletions(-) - -diff --git a/app/meson.build b/app/meson.build -index 885dfe3..d1c6b25 100644 ---- a/app/meson.build -+++ b/app/meson.build -@@ -74,7 +74,6 @@ foreach app:apps - link_whole: link_libs, - dependencies: ext_deps + dep_objs, - include_directories: includes, -- install_rpath: join_paths(get_option('prefix'), driver_install_path), - install: true) - endforeach - -diff --git a/app/test/meson.build b/app/test/meson.build -index 2b480ad..51d09ec 100644 ---- a/app/test/meson.build -+++ b/app/test/meson.build -@@ -488,8 +488,6 @@ dpdk_test = executable('dpdk-test', - link_whole: link_libs, - dependencies: test_dep_objs + ext_deps, - c_args: cflags, -- install_rpath: join_paths(get_option('prefix'), -- driver_install_path), - install: true) - - has_hugepage = run_command('has-hugepage.sh').stdout().strip() != '0' --- -2.23.0 - diff --git a/0019-net-hns3-fix-Rx-Tx-when-fast-path-operation-introduc.patch b/0019-net-hns3-fix-Rx-Tx-when-fast-path-operation-introduc.patch deleted file mode 100644 index 71adecf..0000000 --- a/0019-net-hns3-fix-Rx-Tx-when-fast-path-operation-introduc.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 7ae766e2863868698a26a17f40995bd5ba02356d Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Mon, 17 Jan 2022 10:43:00 +0800 -Subject: [PATCH] net/hns3: fix Rx/Tx when fast path operation introduced - -When fast path operation is introduced, the Rx/Tx function is done by -object 'rte_eth_fp_ops'. So 'rte_eth_fp_ops' should be updated if -'fast-path functions' need to be changed, such as PMD receive function, -prepare function and so on. - -This patch fixed receiving packets bug when fast path operation is -introduced. - -Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations") -Fixes: 168b7d79dada ("net/hns3: support set link up/down for PF") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_mp.c | 7 ++----- - drivers/net/hns3/hns3_rxtx.c | 28 +++++++++++++++++++++++++++- - 2 files changed, 29 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c -index 999b407f7d..e74ddea195 100644 ---- a/drivers/net/hns3/hns3_mp.c -+++ b/drivers/net/hns3/hns3_mp.c -@@ -74,7 +74,6 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) - struct hns3_mp_param *res = (struct hns3_mp_param *)mp_res.param; - const struct hns3_mp_param *param = - (const struct hns3_mp_param *)mp_msg->param; -- eth_tx_prep_t prep = NULL; - struct rte_eth_dev *dev; - int ret; - -@@ -98,14 +97,12 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) - case HNS3_MP_REQ_START_TX: - PMD_INIT_LOG(INFO, "port %u starting Tx datapath", - dev->data->port_id); -- dev->tx_pkt_burst = hns3_get_tx_function(dev, &prep); -- dev->tx_pkt_prepare = prep; -+ hns3_start_tx_datapath(dev); - break; - case HNS3_MP_REQ_STOP_TX: - PMD_INIT_LOG(INFO, "port %u stopping Tx datapath", - dev->data->port_id); -- dev->tx_pkt_burst = hns3_dummy_rxtx_burst; -- dev->tx_pkt_prepare = NULL; -+ hns3_stop_tx_datapath(dev); - break; - default: - rte_errno = EINVAL; -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index d240e36e6a..c86aeb2366 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4408,7 +4408,21 @@ hns3_trace_rxtx_function(struct rte_eth_dev *dev) - rx_mode.info, tx_mode.info); - } - --void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) -+static void -+hns3_eth_dev_fp_ops_config(const struct rte_eth_dev *dev) -+{ -+ struct rte_eth_fp_ops *fpo = rte_eth_fp_ops; -+ uint16_t port_id = dev->data->port_id; -+ -+ fpo[port_id].rx_pkt_burst = dev->rx_pkt_burst; -+ fpo[port_id].tx_pkt_burst = dev->tx_pkt_burst; -+ fpo[port_id].tx_pkt_prepare = dev->tx_pkt_prepare; -+ fpo[port_id].rx_descriptor_status = dev->rx_descriptor_status; -+ fpo[port_id].tx_descriptor_status = dev->tx_descriptor_status; -+} -+ -+void -+hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); - struct hns3_adapter *hns = eth_dev->data->dev_private; -@@ -4429,6 +4443,8 @@ void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - eth_dev->tx_pkt_burst = hns3_dummy_rxtx_burst; - eth_dev->tx_pkt_prepare = NULL; - } -+ -+ hns3_eth_dev_fp_ops_config(eth_dev); - } - - void -@@ -4729,6 +4745,11 @@ hns3_stop_tx_datapath(struct rte_eth_dev *dev) - { - dev->tx_pkt_burst = hns3_dummy_rxtx_burst; - dev->tx_pkt_prepare = NULL; -+ hns3_eth_dev_fp_ops_config(dev); -+ -+ if (rte_eal_process_type() == RTE_PROC_SECONDARY) -+ return; -+ - rte_wmb(); - /* Disable tx datapath on secondary process. */ - hns3_mp_req_stop_tx(dev); -@@ -4743,5 +4764,10 @@ hns3_start_tx_datapath(struct rte_eth_dev *dev) - - dev->tx_pkt_burst = hns3_get_tx_function(dev, &prep); - dev->tx_pkt_prepare = prep; -+ hns3_eth_dev_fp_ops_config(dev); -+ -+ if (rte_eal_process_type() == RTE_PROC_SECONDARY) -+ return; -+ - hns3_mp_req_start_tx(dev); - } --- -2.33.0 - diff --git a/0019-reinit-support-return-ok.patch b/0019-reinit-support-return-ok.patch deleted file mode 100644 index 5105741..0000000 --- a/0019-reinit-support-return-ok.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 12a22b874a4852996dcec56ae30c7a17551bfeeb Mon Sep 17 00:00:00 2001 -From: wuchangsheng -Date: Thu, 6 Oct 2022 16:35:16 +0800 -Subject: [PATCH] reinit support return ok - ---- - lib/eal/linux/eal.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c -index 7ca8bb2..fc2a7fd 100644 ---- a/lib/eal/linux/eal.c -+++ b/lib/eal/linux/eal.c -@@ -1055,6 +1055,7 @@ rte_eal_init(int argc, char **argv) - int i, fctret, ret; - pthread_t thread_id; - static uint32_t run_once; -+ static uint32_t reinit_ok = 0; - uint32_t has_run = 0; - const char *p; - static char logid[PATH_MAX]; -@@ -1072,8 +1073,15 @@ rte_eal_init(int argc, char **argv) - return -1; - } - -+ if (argc > 1 && !strncmp(argv[1], "reinit-ok", strlen("reinit-ok"))) { -+ reinit_ok = 1; -+ } -+ - if (!__atomic_compare_exchange_n(&run_once, &has_run, 1, 0, - __ATOMIC_RELAXED, __ATOMIC_RELAXED)) { -+ if (reinit_ok) { -+ return 0; -+ } - rte_eal_init_alert("already called initialization."); - rte_errno = EALREADY; - return -1; --- -2.27.0 - diff --git a/0020-net-hns3-fix-mailbox-wait-time-uninitialization.patch b/0020-net-hns3-fix-mailbox-wait-time-uninitialization.patch deleted file mode 100644 index 7cc0ba9..0000000 --- a/0020-net-hns3-fix-mailbox-wait-time-uninitialization.patch +++ /dev/null @@ -1,47 +0,0 @@ -From b274c48fc01ed8fe854c285b02f1ac108bbf2721 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 17 Jan 2022 10:43:01 +0800 -Subject: [PATCH] net/hns3: fix mailbox wait time uninitialization - -The mailbox wait time can be specified at runtime. But the variable that -controls this time are not initialized when the variable isn't designated -or is specified as an invalid value, which will fail to initialize device -in the case where no device is bound to initialize the device. - -Fixes: 2fc3e696a7f1 ("net/hns3: add runtime config for mailbox limit time") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li ---- - drivers/net/hns3/hns3_common.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 0bb552ea3e..78158401f2 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -216,7 +216,7 @@ hns3_parse_mbx_time_limit(const char *key, const char *value, void *extra_args) - - /* - * 500ms is empirical value in process of mailbox communication. If -- * the delay value is set to one lower thanthe empirical value, mailbox -+ * the delay value is set to one lower than the empirical value, mailbox - * communication may fail. - */ - if (val > HNS3_MBX_DEF_TIME_LIMIT_MS && val <= UINT16_MAX) -@@ -236,6 +236,12 @@ hns3_parse_devargs(struct rte_eth_dev *dev) - uint64_t dev_caps_mask = 0; - struct rte_kvargs *kvlist; - -+ /* Set default value of runtime config parameters. */ -+ hns->rx_func_hint = HNS3_IO_FUNC_HINT_NONE; -+ hns->tx_func_hint = HNS3_IO_FUNC_HINT_NONE; -+ hns->dev_caps_mask = 0; -+ hns->mbx_time_limit_ms = HNS3_MBX_DEF_TIME_LIMIT_MS; -+ - if (dev->device->devargs == NULL) - return; - --- -2.33.0 - diff --git a/0020-pdump-fix-pcap_dump-coredump-caused-by-incorrect-pkt_len.patch b/0020-pdump-fix-pcap_dump-coredump-caused-by-incorrect-pkt_len.patch deleted file mode 100644 index 72ec829..0000000 --- a/0020-pdump-fix-pcap_dump-coredump-caused-by-incorrect-pkt_len.patch +++ /dev/null @@ -1,32 +0,0 @@ -From c02e48b92050856389403518be8bb70a4fdda551 Mon Sep 17 00:00:00 2001 -From: jiangheng12 -Date: Thu, 8 Jun 2023 20:59:15 +0800 -Subject: [PATCH] pdump: fix pcap_dump coredump caused by incorrect pkt_len - ---- - drivers/net/pcap/pcap_ethdev.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c -index ec29fd6..40ad166 100644 ---- a/drivers/net/pcap/pcap_ethdev.c -+++ b/drivers/net/pcap/pcap_ethdev.c -@@ -408,8 +408,13 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - * in the mbuf (when the mbuf is contiguous) or, otherwise, - * a pointer to temp_data after copying into it. - */ -- pcap_dump((u_char *)dumper, &header, -- rte_pktmbuf_read(mbuf, 0, caplen, temp_data)); -+ const void *sp = rte_pktmbuf_read(mbuf, 0, caplen, temp_data); -+ if (sp == NULL) { -+ rte_pktmbuf_free(mbuf); -+ continue; -+ } else { -+ pcap_dump((u_char *)dumper, &header, sp); -+ } - - num_tx++; - tx_bytes += caplen; --- -2.23.0 - diff --git a/0021-gro-fix-gro-with-tcp-push-flag.patch b/0021-gro-fix-gro-with-tcp-push-flag.patch deleted file mode 100644 index ec67eaf..0000000 --- a/0021-gro-fix-gro-with-tcp-push-flag.patch +++ /dev/null @@ -1,85 +0,0 @@ -From f541da70a5fdb553dc0cb71b3de54065dd245c2d Mon Sep 17 00:00:00 2001 -From: jiangheng -Date: Mon, 19 Jun 2023 00:56:38 +0800 -Subject: [PATCH] gro:fix gro with tcp push flag - -TCP data packets sometimes carry a PUSH flag. Currently, -only the packets that do not have PUSH flag can be GROed. -The packets that have a PUSH flag cannot be GROed, the packets -that cannot be processed by GRO are placed last. -In this case, the received packets may be out of order. -For example, there are two packets mbuf1 and mbuf2. mbuf1 -contains PUSH flag, mbuf2 does not contain PUSH flag. -After GRO processing, mbuf2 is sent for processing before mbuf1. -This out-of-order will affect TCP processing performance and -lead to unnecessary dup-ACK. - -Referring to the Linux kernel implementation, packets with PUSH -flag can also perform GRO. And if one of the packets containing -PUSH flag, the packets after GRO will carry PUSH flag. - -Reference: https://mails.dpdk.org/archives/stable/2022-July/039759.html ---- - lib/gro/gro_tcp4.c | 3 ++- - lib/gro/gro_tcp4.h | 16 +++++++++++++--- - 2 files changed, 15 insertions(+), 4 deletions(-) - -diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c -index d92e5dd..69b1b17 100644 ---- a/lib/gro/gro_tcp4.c -+++ b/lib/gro/gro_tcp4.c -@@ -221,10 +221,11 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - hdr_len = pkt->l2_len + pkt->l3_len + pkt->l4_len; - - /* -- * Don't process the packet which has FIN, SYN, RST, PSH, URG, ECE -+ * Don't process the packet which has FIN, SYN, RST, URG, ECE - * or CWR set. - */ - if (tcp_hdr->tcp_flags != RTE_TCP_ACK_FLAG) -+ if (tcp_hdr->tcp_flags & (~(RTE_TCP_ACK_FLAG | RTE_TCP_PSH_FLAG))) - return -1; - - /* trim the tail padding bytes */ -diff --git a/lib/gro/gro_tcp4.h b/lib/gro/gro_tcp4.h -index bb875a5..3e08222 100644 ---- a/lib/gro/gro_tcp4.h -+++ b/lib/gro/gro_tcp4.h -@@ -212,7 +212,8 @@ merge_two_tcp4_packets(struct gro_tcp4_item *item, - uint16_t l2_offset) - { - struct rte_mbuf *pkt_head, *pkt_tail, *lastseg; -- uint16_t hdr_len, l2_len; -+ struct rte_tcp_hdr *head_tcp_hdr, *tail_tcp_hdr; -+ uint16_t hdr_len, l2_len, l3_offset; - - if (cmp > 0) { - pkt_head = item->firstseg; -@@ -223,13 +224,22 @@ merge_two_tcp4_packets(struct gro_tcp4_item *item, - } - - /* check if the IPv4 packet length is greater than the max value */ -- hdr_len = l2_offset + pkt_head->l2_len + pkt_head->l3_len + -- pkt_head->l4_len; -+ l3_offset = l2_offset + pkt_head->l2_len + pkt_head->l3_len; -+ hdr_len = l3_offset + pkt_head->l4_len; - l2_len = l2_offset > 0 ? pkt_head->outer_l2_len : pkt_head->l2_len; - if (unlikely(pkt_head->pkt_len - l2_len + pkt_tail->pkt_len - - hdr_len > MAX_IPV4_PKT_LENGTH)) - return 0; - -+ /* merge push flag to pkt_head */ -+ tail_tcp_hdr = rte_pktmbuf_mtod_offset(pkt_tail, -+ struct rte_tcp_hdr *, l3_offset); -+ if (tail_tcp_hdr->tcp_flags & RTE_TCP_PSH_FLAG) { -+ head_tcp_hdr = rte_pktmbuf_mtod_offset(pkt_head, -+ struct rte_tcp_hdr *, l3_offset); -+ head_tcp_hdr->tcp_flags |= RTE_TCP_PSH_FLAG; -+ } -+ - /* remove the packet header for the tail packet */ - rte_pktmbuf_adj(pkt_tail, hdr_len); - --- -2.27.0 - diff --git a/0021-net-hns3-fix-vector-burst-when-PTP-enable.patch b/0021-net-hns3-fix-vector-burst-when-PTP-enable.patch deleted file mode 100644 index 032609b..0000000 --- a/0021-net-hns3-fix-vector-burst-when-PTP-enable.patch +++ /dev/null @@ -1,237 +0,0 @@ -From 17efba586961886bd96033965f3ce4d5dcb3367a Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Mon, 17 Jan 2022 10:43:02 +0800 -Subject: [PATCH] net/hns3: fix vector burst when PTP enable - -If hardware supports IEEE 1588 PTP, PTP capability will be set. -Currently, vec and sve burst is unsupported when PTP capability is set. - -For sake of Rx/Tx performance, IEEE 1588 PTP is not supported in sve or -vec burst mode. When enabling IEEE 1588 PTP, Rx/Tx burst mode should be -simple or common. Rx/Tx burst mode could be set like this, for example: --a 0000:35:00.0,rx_func_hint=common,tx_func_hint=common - -This patch supports vec and sve burst when PTP is disabled. And only -support simple or common burst When PTP is enabled. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - doc/guides/nics/hns3.rst | 5 +++++ - drivers/net/hns3/hns3_ethdev.c | 8 +------- - drivers/net/hns3/hns3_ptp.c | 1 + - drivers/net/hns3/hns3_rxtx.c | 29 +++++++++++++++++------------ - drivers/net/hns3/hns3_rxtx_vec.c | 20 ++++++++++++-------- - 5 files changed, 36 insertions(+), 27 deletions(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 5f68a10ecf..791c9cc2ed 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -290,5 +290,10 @@ Currently, we only support VF device driven by DPDK driver when PF is driven - by kernel mode hns3 ethdev driver. VF is not supported when PF is driven by - DPDK driver. - -+For sake of Rx/Tx performance, IEEE 1588 is not supported when using vec or -+sve burst function. When enabling IEEE 1588, Rx/Tx burst mode should be -+simple or common. It is recommended that enable IEEE 1588 before ethdev -+start. In this way, the correct Rx/Tx burst function can be selected. -+ - Build with ICC is not supported yet. - X86-32, Power8, ARMv7 and BSD are not supported yet. -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 3b897492d3..ef13d31d19 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -227,17 +227,11 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - return ret; - } - --static bool --hns3_is_1588_event_type(uint32_t event_type) --{ -- return (event_type == HNS3_VECTOR0_EVENT_PTP); --} -- - static void - hns3_clear_event_cause(struct hns3_hw *hw, uint32_t event_type, uint32_t regclr) - { - if (event_type == HNS3_VECTOR0_EVENT_RST || -- hns3_is_1588_event_type(event_type)) -+ event_type == HNS3_VECTOR0_EVENT_PTP) - hns3_write_dev(hw, HNS3_MISC_RESET_STS_REG, regclr); - else if (event_type == HNS3_VECTOR0_EVENT_MBX) - hns3_write_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG, regclr); -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 9a829d7011..1442241a4e 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -125,6 +125,7 @@ hns3_timesync_enable(struct rte_eth_dev *dev) - - if (pf->ptp_enable) - return 0; -+ hns3_warn(hw, "note: please ensure Rx/Tx burst mode is simple or common when enabling PTP!"); - - rte_spinlock_lock(&hw->lock); - ret = hns3_timesync_configure(hns, true); -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index c86aeb2366..c43131cac6 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -2388,14 +2388,14 @@ hns3_rx_alloc_buffer(struct hns3_rx_queue *rxq) - return rte_mbuf_raw_alloc(rxq->mb_pool); - } - --static inline void -+static void - hns3_rx_ptp_timestamp_handle(struct hns3_rx_queue *rxq, struct rte_mbuf *mbuf, -- volatile struct hns3_desc *rxd) -+ uint64_t timestamp) - { - struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(rxq->hns); -- uint64_t timestamp = rte_le_to_cpu_64(rxd->timestamp); - -- mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP | RTE_MBUF_F_RX_IEEE1588_TMST; -+ mbuf->ol_flags |= RTE_MBUF_F_RX_IEEE1588_PTP | -+ RTE_MBUF_F_RX_IEEE1588_TMST; - if (hns3_timestamp_rx_dynflag > 0) { - *RTE_MBUF_DYNFIELD(mbuf, hns3_timestamp_dynfield_offset, - rte_mbuf_timestamp_t *) = timestamp; -@@ -2469,7 +2469,8 @@ hns3_recv_pkts_simple(void *rx_queue, - rxe->mbuf = nmb; - - if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B))) -- hns3_rx_ptp_timestamp_handle(rxq, rxm, rxdp); -+ hns3_rx_ptp_timestamp_handle(rxq, rxm, -+ rte_le_to_cpu_64(rxdp->timestamp)); - - dma_addr = rte_mbuf_data_iova_default(nmb); - rxdp->addr = rte_cpu_to_le_64(dma_addr); -@@ -2540,6 +2541,7 @@ hns3_recv_scattered_pkts(void *rx_queue, - struct rte_mbuf *rxm; - struct rte_eth_dev *dev; - uint32_t bd_base_info; -+ uint64_t timestamp; - uint32_t l234_info; - uint32_t gro_size; - uint32_t ol_info; -@@ -2649,6 +2651,9 @@ hns3_recv_scattered_pkts(void *rx_queue, - rxm = rxe->mbuf; - rxe->mbuf = nmb; - -+ if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B))) -+ timestamp = rte_le_to_cpu_64(rxdp->timestamp); -+ - dma_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb)); - rxdp->rx.bd_base_info = 0; - rxdp->addr = dma_addr; -@@ -2671,7 +2676,7 @@ hns3_recv_scattered_pkts(void *rx_queue, - } - - if (unlikely(bd_base_info & BIT(HNS3_RXD_TS_VLD_B))) -- hns3_rx_ptp_timestamp_handle(rxq, first_seg, rxdp); -+ hns3_rx_ptp_timestamp_handle(rxq, first_seg, timestamp); - - /* - * The last buffer of the received packet. packet len from -@@ -4044,7 +4049,7 @@ static inline void - hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts) - { - #define PER_LOOP_NUM 4 -- const uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B); -+ uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B); - uint64_t dma_addr; - uint32_t i; - -@@ -4055,6 +4060,8 @@ hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts) - txdp->tx.paylen_fd_dop_ol4cs = 0; - txdp->tx.type_cs_vlan_tso_len = 0; - txdp->tx.ol_type_vlan_len_msec = 0; -+ if (unlikely((*pkts)->ol_flags & RTE_MBUF_F_TX_IEEE1588_TMST)) -+ bd_flag |= BIT(HNS3_TXD_TSYN_B); - txdp->tx.tp_fe_sc_vld_ra_ri = rte_cpu_to_le_16(bd_flag); - } - } -@@ -4062,7 +4069,7 @@ hns3_tx_setup_4bd(struct hns3_desc *txdp, struct rte_mbuf **pkts) - static inline void - hns3_tx_setup_1bd(struct hns3_desc *txdp, struct rte_mbuf **pkts) - { -- const uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B); -+ uint16_t bd_flag = BIT(HNS3_TXD_VLD_B) | BIT(HNS3_TXD_FE_B); - uint64_t dma_addr; - - dma_addr = rte_mbuf_data_iova(*pkts); -@@ -4071,6 +4078,8 @@ hns3_tx_setup_1bd(struct hns3_desc *txdp, struct rte_mbuf **pkts) - txdp->tx.paylen_fd_dop_ol4cs = 0; - txdp->tx.type_cs_vlan_tso_len = 0; - txdp->tx.ol_type_vlan_len_msec = 0; -+ if (unlikely((*pkts)->ol_flags & RTE_MBUF_F_TX_IEEE1588_TMST)) -+ bd_flag |= BIT(HNS3_TXD_TSYN_B); - txdp->tx.tp_fe_sc_vld_ra_ri = rte_cpu_to_le_16(bd_flag); - } - -@@ -4312,10 +4321,6 @@ hns3_tx_check_simple_support(struct rte_eth_dev *dev) - { - uint64_t offloads = dev->data->dev_conf.txmode.offloads; - -- struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- if (hns3_dev_get_support(hw, PTP)) -- return false; -- - return (offloads == (offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)); - } - -diff --git a/drivers/net/hns3/hns3_rxtx_vec.c b/drivers/net/hns3/hns3_rxtx_vec.c -index 455110361a..73f0ab6bc8 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.c -+++ b/drivers/net/hns3/hns3_rxtx_vec.c -@@ -17,15 +17,17 @@ int - hns3_tx_check_vec_support(struct rte_eth_dev *dev) - { - struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode; -- -- struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- if (hns3_dev_get_support(hw, PTP)) -- return -ENOTSUP; -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_pf *pf = &hns->pf; - - /* Only support RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE */ - if (txmode->offloads != RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) - return -ENOTSUP; - -+ /* Vec is not supported when PTP enabled */ -+ if (pf->ptp_enable) -+ return -ENOTSUP; -+ - return 0; - } - -@@ -232,10 +234,8 @@ hns3_rx_check_vec_support(struct rte_eth_dev *dev) - struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; - uint64_t offloads_mask = RTE_ETH_RX_OFFLOAD_TCP_LRO | - RTE_ETH_RX_OFFLOAD_VLAN; -- -- struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- if (hns3_dev_get_support(hw, PTP)) -- return -ENOTSUP; -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_pf *pf = &hns->pf; - - if (dev->data->scattered_rx) - return -ENOTSUP; -@@ -249,5 +249,9 @@ hns3_rx_check_vec_support(struct rte_eth_dev *dev) - if (hns3_rxq_iterate(dev, hns3_rxq_vec_check, NULL) != 0) - return -ENOTSUP; - -+ /* Vec is not supported when PTP enabled */ -+ if (pf->ptp_enable) -+ return -ENOTSUP; -+ - return 0; - } --- -2.33.0 - diff --git a/0022-eal-loongarch-support-LoongArch-architecture.patch b/0022-eal-loongarch-support-LoongArch-architecture.patch deleted file mode 100644 index 87738d1..0000000 --- a/0022-eal-loongarch-support-LoongArch-architecture.patch +++ /dev/null @@ -1,1630 +0,0 @@ -From 4dae75f4278caf8477ddf0e3140f86153f51a2e5 Mon Sep 17 00:00:00 2001 -From: Min Zhou -Date: Thu, 29 Jun 2023 20:35:55 +0800 -Subject: [PATCH 1/1] eal/loongarch: support LoongArch architecture - -Add all necessary elements for DPDK to compile and run EAL on -LoongArch64 Soc. - -This includes: - -- EAL library implementation for LoongArch ISA. -- meson build structure for 'loongarch' architecture. - RTE_ARCH_LOONGARCH define is added for architecture identification. -- xmm_t structure operation stubs as there is no vector support in -the current version for LoongArch. - -Compilation was tested on Debian and CentOS using loongarch64 -cross-compile toolchain from x86 build hosts. Functions were tested -on Loongnix and Kylin which are two Linux distributions supported -LoongArch host based on Linux 4.19 maintained by Loongson -Corporation. - -We also tested DPDK on LoongArch with some external applications, -including: Pktgen-DPDK, OVS, VPP. - -The platform is currently marked as linux-only because there is no -other OS than Linux support LoongArch host currently. - -The i40e PMD driver is disabled on LoongArch because of the absence -of vector support in the current version. - -Signed-off-by: Min Zhou ---- - app/test/test_cpuflags.c | 41 ++++ - app/test/test_xmmt_ops.h | 12 + - .../loongarch/loongarch_loongarch64_linux_gcc | 16 ++ - config/loongarch/meson.build | 43 ++++ - drivers/net/i40e/meson.build | 6 + - drivers/net/ixgbe/ixgbe_rxtx.c | 4 +- - drivers/net/memif/rte_eth_memif.h | 2 + - drivers/net/tap/tap_bpf.h | 2 + - examples/l3fwd/l3fwd_em.c | 8 + - examples/l3fwd/l3fwd_fib.c | 2 + - examples/l3fwd/l3fwd_lpm.c | 5 +- - examples/l3fwd/l3fwd_lpm_lsx.h | 30 +++ - lib/eal/linux/eal_memory.c | 4 + - lib/eal/loongarch/include/meson.build | 21 ++ - lib/eal/loongarch/include/rte_atomic.h | 47 ++++ - lib/eal/loongarch/include/rte_byteorder.h | 40 ++++ - lib/eal/loongarch/include/rte_cpuflags.h | 39 ++++ - lib/eal/loongarch/include/rte_cycles.h | 47 ++++ - lib/eal/loongarch/include/rte_io.h | 18 ++ - lib/eal/loongarch/include/rte_mcslock.h | 18 ++ - lib/eal/loongarch/include/rte_memcpy.h | 61 +++++ - lib/eal/loongarch/include/rte_pause.h | 24 ++ - lib/eal/loongarch/include/rte_pflock.h | 18 ++ - .../loongarch/include/rte_power_intrinsics.h | 20 ++ - lib/eal/loongarch/include/rte_prefetch.h | 48 ++++ - lib/eal/loongarch/include/rte_rwlock.h | 42 ++++ - lib/eal/loongarch/include/rte_spinlock.h | 64 ++++++ - lib/eal/loongarch/include/rte_ticketlock.h | 214 ++++++++++++++++++ - lib/eal/loongarch/include/rte_vect.h | 65 ++++++ - lib/eal/loongarch/meson.build | 11 + - lib/eal/loongarch/rte_cpuflags.c | 93 ++++++++ - lib/eal/loongarch/rte_cycles.c | 45 ++++ - lib/eal/loongarch/rte_hypervisor.c | 11 + - lib/eal/loongarch/rte_power_intrinsics.c | 53 +++++ - lib/lpm/meson.build | 1 + - lib/lpm/rte_lpm.h | 6 +- - lib/lpm/rte_lpm_scalar.h | 38 ++++ - meson.build | 2 + - 38 files changed, 1216 insertions(+), 5 deletions(-) - create mode 100644 config/loongarch/loongarch_loongarch64_linux_gcc - create mode 100644 config/loongarch/meson.build - create mode 100644 examples/l3fwd/l3fwd_lpm_lsx.h - create mode 100644 lib/eal/loongarch/include/meson.build - create mode 100644 lib/eal/loongarch/include/rte_atomic.h - create mode 100644 lib/eal/loongarch/include/rte_byteorder.h - create mode 100644 lib/eal/loongarch/include/rte_cpuflags.h - create mode 100644 lib/eal/loongarch/include/rte_cycles.h - create mode 100644 lib/eal/loongarch/include/rte_io.h - create mode 100644 lib/eal/loongarch/include/rte_mcslock.h - create mode 100644 lib/eal/loongarch/include/rte_memcpy.h - create mode 100644 lib/eal/loongarch/include/rte_pause.h - create mode 100644 lib/eal/loongarch/include/rte_pflock.h - create mode 100644 lib/eal/loongarch/include/rte_power_intrinsics.h - create mode 100644 lib/eal/loongarch/include/rte_prefetch.h - create mode 100644 lib/eal/loongarch/include/rte_rwlock.h - create mode 100644 lib/eal/loongarch/include/rte_spinlock.h - create mode 100644 lib/eal/loongarch/include/rte_ticketlock.h - create mode 100644 lib/eal/loongarch/include/rte_vect.h - create mode 100644 lib/eal/loongarch/meson.build - create mode 100644 lib/eal/loongarch/rte_cpuflags.c - create mode 100644 lib/eal/loongarch/rte_cycles.c - create mode 100644 lib/eal/loongarch/rte_hypervisor.c - create mode 100644 lib/eal/loongarch/rte_power_intrinsics.c - create mode 100644 lib/lpm/rte_lpm_scalar.h - -diff --git a/app/test/test_cpuflags.c b/app/test/test_cpuflags.c -index 40f6ac7..17c9986 100644 ---- a/app/test/test_cpuflags.c -+++ b/app/test/test_cpuflags.c -@@ -200,6 +200,47 @@ test_cpuflags(void) - CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC); - #endif - -+#if defined(RTE_ARCH_LOONGARCH) -+ printf("Check for CPUCFG:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_CPUCFG); -+ -+ printf("Check for LAM:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LAM); -+ -+ printf("Check for UAL:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_UAL); -+ -+ printf("Check for FPU:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_FPU); -+ -+ printf("Check for LSX:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LSX); -+ -+ printf("Check for LASX:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LASX); -+ -+ printf("Check for CRC32:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_CRC32); -+ -+ printf("Check for COMPLEX:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_COMPLEX); -+ -+ printf("Check for CRYPTO:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_CRYPTO); -+ -+ printf("Check for LVZ:\t\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LVZ); -+ -+ printf("Check for LBT_X86:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_X86); -+ -+ printf("Check for LBT_ARM:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_ARM); -+ -+ printf("Check for LBT_MIPS:\t"); -+ CHECK_FOR_FLAG(RTE_CPUFLAG_LBT_MIPS); -+#endif -+ - /* - * Check if invalid data is handled properly - */ -diff --git a/app/test/test_xmmt_ops.h b/app/test/test_xmmt_ops.h -index 3a82d5e..21490e7 100644 ---- a/app/test/test_xmmt_ops.h -+++ b/app/test/test_xmmt_ops.h -@@ -49,6 +49,18 @@ vect_set_epi32(int i3, int i2, int i1, int i0) - return data; - } - -+#elif defined(RTE_ARCH_LOONGARCH) -+ -+#define vect_loadu_sil128(p) vect_load_128(p) -+ -+/* sets the 4 signed 32-bit integer values and returns the xmm_t variable */ -+static __rte_always_inline xmm_t -+vect_set_epi32(int i3, int i2, int i1, int i0) -+{ -+ xmm_t data = (xmm_t){.u32 = {i0, i1, i2, i3}}; -+ -+ return data; -+} - #endif - - #endif /* _TEST_XMMT_OPS_H_ */ -diff --git a/config/loongarch/loongarch_loongarch64_linux_gcc b/config/loongarch/loongarch_loongarch64_linux_gcc -new file mode 100644 -index 0000000..c933022 ---- /dev/null -+++ b/config/loongarch/loongarch_loongarch64_linux_gcc -@@ -0,0 +1,16 @@ -+[binaries] -+c = ['ccache', 'loongarch64-unknown-linux-gnu-gcc'] -+cpp = ['ccache', 'loongarch64-unknown-linux-gnu-g++'] -+ar = 'loongarch64-unknown-linux-gnu-gcc-ar' -+strip = 'loongarch64-unknown-linux-gnu-strip' -+pcap-config = '' -+ -+[host_machine] -+system = 'linux' -+cpu_family = 'loongarch64' -+cpu = '3a5000' -+endian = 'little' -+ -+[properties] -+implementor_id = 'generic' -+implementor_pn = 'default' -diff --git a/config/loongarch/meson.build b/config/loongarch/meson.build -new file mode 100644 -index 0000000..99dabef ---- /dev/null -+++ b/config/loongarch/meson.build -@@ -0,0 +1,43 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2022 Loongson Technology Corporation Limited -+ -+if not dpdk_conf.get('RTE_ARCH_64') -+ error('Only 64-bit compiles are supported for this platform type') -+endif -+dpdk_conf.set('RTE_ARCH', 'loongarch') -+dpdk_conf.set('RTE_ARCH_LOONGARCH', 1) -+dpdk_conf.set('RTE_FORCE_INTRINSICS', 1) -+ -+machine_args_generic = [ -+ ['default', ['-march=loongarch64']], -+] -+ -+flags_generic = [ -+ ['RTE_MACHINE', '"loongarch64"'], -+ ['RTE_MAX_LCORE', 64], -+ ['RTE_MAX_NUMA_NODES', 16], -+ ['RTE_CACHE_LINE_SIZE', 64]] -+ -+impl_generic = ['Generic loongarch', flags_generic, machine_args_generic] -+ -+machine = [] -+machine_args = [] -+ -+machine = impl_generic -+impl_pn = 'default' -+ -+message('Implementer : ' + machine[0]) -+foreach flag: machine[1] -+ if flag.length() > 0 -+ dpdk_conf.set(flag[0], flag[1]) -+ endif -+endforeach -+ -+foreach marg: machine[2] -+ if marg[0] == impl_pn -+ foreach f: marg[1] -+ machine_args += f -+ endforeach -+ endif -+endforeach -+message(machine_args) -diff --git a/drivers/net/i40e/meson.build b/drivers/net/i40e/meson.build -index efc5f93..19ddd50 100644 ---- a/drivers/net/i40e/meson.build -+++ b/drivers/net/i40e/meson.build -@@ -1,6 +1,12 @@ - # SPDX-License-Identifier: BSD-3-Clause - # Copyright(c) 2017 Intel Corporation - -+if arch_subdir == 'loongarch' -+ build = false -+ reason = 'not supported on LoongArch' -+ subdir_done() -+endif -+ - cflags += ['-DPF_DRIVER', - '-DVF_DRIVER', - '-DINTEGRATED_VF', -diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c -index d7c80d4..e19e832 100644 ---- a/drivers/net/ixgbe/ixgbe_rxtx.c -+++ b/drivers/net/ixgbe/ixgbe_rxtx.c -@@ -5958,8 +5958,8 @@ ixgbe_config_rss_filter(struct rte_eth_dev *dev, - return 0; - } - --/* Stubs needed for linkage when RTE_ARCH_PPC_64 is set */ --#if defined(RTE_ARCH_PPC_64) -+/* Stubs needed for linkage when RTE_ARCH_PPC_64 or RTE_ARCH_LOONGARCH is set */ -+#if defined(RTE_ARCH_PPC_64) || defined(RTE_ARCH_LOONGARCH) - int - ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev) - { -diff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h -index a5ee23d..864a498 100644 ---- a/drivers/net/memif/rte_eth_memif.h -+++ b/drivers/net/memif/rte_eth_memif.h -@@ -180,6 +180,8 @@ const char *memif_version(void); - #define __NR_memfd_create 360 - #elif defined __i386__ - #define __NR_memfd_create 356 -+#elif defined __loongarch__ -+#define __NR_memfd_create 279 - #else - #error "__NR_memfd_create unknown for this architecture" - #endif -diff --git a/drivers/net/tap/tap_bpf.h b/drivers/net/tap/tap_bpf.h -index f0b9fc7..de7ab91 100644 ---- a/drivers/net/tap/tap_bpf.h -+++ b/drivers/net/tap/tap_bpf.h -@@ -101,6 +101,8 @@ union bpf_attr { - # define __NR_bpf 351 - # elif defined(__powerpc__) - # define __NR_bpf 361 -+# elif defined(__loongarch__) -+# define __NR_bpf 280 - # else - # error __NR_bpf not defined - # endif -diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c -index 5cc4a4d..67e042f 100644 ---- a/examples/l3fwd/l3fwd_em.c -+++ b/examples/l3fwd/l3fwd_em.c -@@ -270,6 +270,14 @@ em_mask_key(void *key, xmm_t mask) - - return vec_and(data, mask); - } -+#elif defined(RTE_ARCH_LOONGARCH) -+static inline xmm_t -+em_mask_key(void *key, xmm_t mask) -+{ -+ xmm_t data = vect_load_128(key); -+ -+ return vect_and(data, mask); -+} - #else - #error No vector engine (SSE, NEON, ALTIVEC) available, check your toolchain - #endif -diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c -index 2110459..4aa2fa5 100644 ---- a/examples/l3fwd/l3fwd_fib.c -+++ b/examples/l3fwd/l3fwd_fib.c -@@ -18,6 +18,8 @@ - #include "l3fwd_neon.h" - #elif defined RTE_ARCH_PPC_64 - #include "l3fwd_altivec.h" -+#else -+#include "l3fwd_common.h" - #endif - #include "l3fwd_event.h" - #include "l3fwd_route.h" -diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c -index a5b476c..160a7c6 100644 ---- a/examples/l3fwd/l3fwd_lpm.c -+++ b/examples/l3fwd/l3fwd_lpm.c -@@ -135,6 +135,9 @@ lpm_get_dst_port_with_ipv4(const struct lcore_conf *qconf, struct rte_mbuf *pkt, - #include "l3fwd_lpm_neon.h" - #elif defined(RTE_ARCH_PPC_64) - #include "l3fwd_lpm_altivec.h" -+#elif defined(RTE_ARCH_LOONGARCH) -+#include "l3fwd_lpm_lsx.h" -+#include "l3fwd_lpm.h" - #else - #include "l3fwd_lpm.h" - #endif -@@ -231,7 +234,7 @@ lpm_process_event_pkt(const struct lcore_conf *lconf, struct rte_mbuf *mbuf) - mbuf->port = lpm_get_dst_port(lconf, mbuf, mbuf->port); - - #if defined RTE_ARCH_X86 || defined __ARM_NEON \ -- || defined RTE_ARCH_PPC_64 -+ || defined RTE_ARCH_PPC_64 || defined RTE_ARCH_LOONGARCH - process_packet(mbuf, &mbuf->port); - #else - -diff --git a/examples/l3fwd/l3fwd_lpm_lsx.h b/examples/l3fwd/l3fwd_lpm_lsx.h -new file mode 100644 -index 0000000..a4d7449 ---- /dev/null -+++ b/examples/l3fwd/l3fwd_lpm_lsx.h -@@ -0,0 +1,30 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef __L3FWD_LPM_LSX_H__ -+#define __L3FWD_LPM_LSX_H__ -+ -+#include "l3fwd_common.h" -+ -+static inline void -+process_packet(struct rte_mbuf *pkt, uint16_t *hop) -+{ -+ struct rte_ether_hdr *eth_hdr; -+ -+ /* Run rfc1812 if packet is ipv4 and checks enabled. */ -+#if defined DO_RFC_1812_CHECKS -+ rfc1812_process( -+ (struct rte_ipv4_hdr *)(rte_pktmbuf_mtod( -+ pkt, struct rte_ether_hdr *) + -+ 1), -+ hop, pkt->packet_type); -+#endif -+ -+ /* Set MAC addresses. */ -+ eth_hdr = rte_pktmbuf_mtod(pkt, struct rte_ether_hdr *); -+ *(uint64_t *)ð_hdr->dst_addr = dest_eth_addr[*hop]; -+ rte_ether_addr_copy(&ports_eth_addr[*hop], ð_hdr->src_addr); -+} -+ -+#endif /* __L3FWD_LPM_LSX_H__ */ -diff --git a/lib/eal/linux/eal_memory.c b/lib/eal/linux/eal_memory.c -index 03a4f2d..d97f1e4 100644 ---- a/lib/eal/linux/eal_memory.c -+++ b/lib/eal/linux/eal_memory.c -@@ -86,7 +86,11 @@ uint64_t eal_get_baseaddr(void) - * rte_mem_check_dma_mask for ensuring all memory is within supported - * range. - */ -+#if defined(RTE_ARCH_LOONGARCH) -+ return 0x7000000000ULL; -+#else - return 0x100000000ULL; -+#endif - } - - /* -diff --git a/lib/eal/loongarch/include/meson.build b/lib/eal/loongarch/include/meson.build -new file mode 100644 -index 0000000..1fa96e4 ---- /dev/null -+++ b/lib/eal/loongarch/include/meson.build -@@ -0,0 +1,21 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2022 Loongson Technology Corporation Limited -+ -+arch_headers = files( -+ 'rte_atomic.h', -+ 'rte_byteorder.h', -+ 'rte_cpuflags.h', -+ 'rte_cycles.h', -+ 'rte_io.h', -+ 'rte_mcslock.h', -+ 'rte_memcpy.h', -+ 'rte_pause.h', -+ 'rte_pflock.h', -+ 'rte_power_intrinsics.h', -+ 'rte_prefetch.h', -+ 'rte_rwlock.h', -+ 'rte_spinlock.h', -+ 'rte_ticketlock.h', -+ 'rte_vect.h', -+) -+install_headers(arch_headers, subdir: get_option('include_subdir_arch')) -diff --git a/lib/eal/loongarch/include/rte_atomic.h b/lib/eal/loongarch/include/rte_atomic.h -new file mode 100644 -index 0000000..3c82845 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_atomic.h -@@ -0,0 +1,47 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_ATOMIC_LOONGARCH_H -+#define RTE_ATOMIC_LOONGARCH_H -+ -+#ifndef RTE_FORCE_INTRINSICS -+# error Platform must be built with RTE_FORCE_INTRINSICS -+#endif -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include "generic/rte_atomic.h" -+ -+#define rte_mb() do { asm volatile("dbar 0":::"memory"); } while (0) -+ -+#define rte_wmb() rte_mb() -+ -+#define rte_rmb() rte_mb() -+ -+#define rte_smp_mb() rte_mb() -+ -+#define rte_smp_wmb() rte_mb() -+ -+#define rte_smp_rmb() rte_mb() -+ -+#define rte_io_mb() rte_mb() -+ -+#define rte_io_wmb() rte_mb() -+ -+#define rte_io_rmb() rte_mb() -+ -+static __rte_always_inline void -+rte_atomic_thread_fence(int memorder) -+{ -+ __atomic_thread_fence(memorder); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_ATOMIC_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_byteorder.h b/lib/eal/loongarch/include/rte_byteorder.h -new file mode 100644 -index 0000000..0da6097 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_byteorder.h -@@ -0,0 +1,40 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_BYTEORDER_LOONGARCH_H -+#define RTE_BYTEORDER_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_byteorder.h" -+ -+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN -+ -+#define rte_cpu_to_le_16(x) (x) -+#define rte_cpu_to_le_32(x) (x) -+#define rte_cpu_to_le_64(x) (x) -+ -+#define rte_cpu_to_be_16(x) rte_bswap16(x) -+#define rte_cpu_to_be_32(x) rte_bswap32(x) -+#define rte_cpu_to_be_64(x) rte_bswap64(x) -+ -+#define rte_le_to_cpu_16(x) (x) -+#define rte_le_to_cpu_32(x) (x) -+#define rte_le_to_cpu_64(x) (x) -+ -+#define rte_be_to_cpu_16(x) rte_bswap16(x) -+#define rte_be_to_cpu_32(x) rte_bswap32(x) -+#define rte_be_to_cpu_64(x) rte_bswap64(x) -+ -+#else /* RTE_BIG_ENDIAN */ -+#error "LoongArch not support big endian!" -+#endif -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_BYTEORDER_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_cpuflags.h b/lib/eal/loongarch/include/rte_cpuflags.h -new file mode 100644 -index 0000000..1c80779 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_cpuflags.h -@@ -0,0 +1,39 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_CPUFLAGS_LOONGARCH_H -+#define RTE_CPUFLAGS_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/** -+ * Enumeration of all CPU features supported -+ */ -+enum rte_cpu_flag_t { -+ RTE_CPUFLAG_CPUCFG = 0, -+ RTE_CPUFLAG_LAM, -+ RTE_CPUFLAG_UAL, -+ RTE_CPUFLAG_FPU, -+ RTE_CPUFLAG_LSX, -+ RTE_CPUFLAG_LASX, -+ RTE_CPUFLAG_CRC32, -+ RTE_CPUFLAG_COMPLEX, -+ RTE_CPUFLAG_CRYPTO, -+ RTE_CPUFLAG_LVZ, -+ RTE_CPUFLAG_LBT_X86, -+ RTE_CPUFLAG_LBT_ARM, -+ RTE_CPUFLAG_LBT_MIPS, -+ /* The last item */ -+ RTE_CPUFLAG_NUMFLAGS /**< This should always be the last! */ -+}; -+ -+#include "generic/rte_cpuflags.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_CPUFLAGS_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_cycles.h b/lib/eal/loongarch/include/rte_cycles.h -new file mode 100644 -index 0000000..f612d1a ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_cycles.h -@@ -0,0 +1,47 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_CYCLES_LOONGARCH_H -+#define RTE_CYCLES_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_cycles.h" -+ -+/** -+ * Read the time base register. -+ * -+ * @return -+ * The time base for this lcore. -+ */ -+static inline uint64_t -+rte_rdtsc(void) -+{ -+ uint64_t count; -+ -+ __asm__ __volatile__ ( -+ "rdtime.d %[cycles], $zero\n" -+ : [cycles] "=r" (count) -+ :: -+ ); -+ return count; -+} -+ -+static inline uint64_t -+rte_rdtsc_precise(void) -+{ -+ rte_mb(); -+ return rte_rdtsc(); -+} -+ -+static inline uint64_t -+rte_get_tsc_cycles(void) { return rte_rdtsc(); } -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_CYCLES_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_io.h b/lib/eal/loongarch/include/rte_io.h -new file mode 100644 -index 0000000..40e40ef ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_io.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_IO_LOONGARCH_H -+#define RTE_IO_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_io.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_IO_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_mcslock.h b/lib/eal/loongarch/include/rte_mcslock.h -new file mode 100644 -index 0000000..c4484b6 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_mcslock.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef _RTE_MCSLOCK_LOONGARCH_H_ -+#define _RTE_MCSLOCK_LOONGARCH_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_mcslock.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_MCSLOCK_LOONGARCH_H_ */ -diff --git a/lib/eal/loongarch/include/rte_memcpy.h b/lib/eal/loongarch/include/rte_memcpy.h -new file mode 100644 -index 0000000..22578d4 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_memcpy.h -@@ -0,0 +1,61 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_MEMCPY_LOONGARCH_H -+#define RTE_MEMCPY_LOONGARCH_H -+ -+#include -+#include -+ -+#include "rte_common.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_memcpy.h" -+ -+static inline void -+rte_mov16(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 16); -+} -+ -+static inline void -+rte_mov32(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 32); -+} -+ -+static inline void -+rte_mov48(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 48); -+} -+ -+static inline void -+rte_mov64(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 64); -+} -+ -+static inline void -+rte_mov128(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 128); -+} -+ -+static inline void -+rte_mov256(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 256); -+} -+ -+#define rte_memcpy(d, s, n) memcpy((d), (s), (n)) -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_MEMCPY_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_pause.h b/lib/eal/loongarch/include/rte_pause.h -new file mode 100644 -index 0000000..4302e1b ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_pause.h -@@ -0,0 +1,24 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_PAUSE_LOONGARCH_H -+#define RTE_PAUSE_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "rte_atomic.h" -+ -+#include "generic/rte_pause.h" -+ -+static inline void rte_pause(void) -+{ -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_PAUSE_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_pflock.h b/lib/eal/loongarch/include/rte_pflock.h -new file mode 100644 -index 0000000..d3e5824 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_pflock.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2021 Microsoft Corporation -+ */ -+ -+#ifndef _RTE_PFLOCK_LOONGARCH_H_ -+#define _RTE_PFLOCK_LOONGARCH_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_pflock.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_PFLOCK_LOONGARCH_H_ */ -diff --git a/lib/eal/loongarch/include/rte_power_intrinsics.h b/lib/eal/loongarch/include/rte_power_intrinsics.h -new file mode 100644 -index 0000000..d5dbd94 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_power_intrinsics.h -@@ -0,0 +1,20 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_POWER_INTRINSIC_LOONGARCH_H -+#define RTE_POWER_INTRINSIC_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+ -+#include "generic/rte_power_intrinsics.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_POWER_INTRINSIC_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_prefetch.h b/lib/eal/loongarch/include/rte_prefetch.h -new file mode 100644 -index 0000000..64b1fd2 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_prefetch.h -@@ -0,0 +1,48 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_PREFETCH_LOONGARCH_H -+#define RTE_PREFETCH_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include -+#include "generic/rte_prefetch.h" -+ -+static inline void rte_prefetch0(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 3); -+} -+ -+static inline void rte_prefetch1(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 2); -+} -+ -+static inline void rte_prefetch2(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 1); -+} -+ -+static inline void rte_prefetch_non_temporal(const volatile void *p) -+{ -+ /* non-temporal version not available, fallback to rte_prefetch0 */ -+ rte_prefetch0(p); -+} -+ -+__rte_experimental -+static inline void -+rte_cldemote(const volatile void *p) -+{ -+ RTE_SET_USED(p); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_PREFETCH_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_rwlock.h b/lib/eal/loongarch/include/rte_rwlock.h -new file mode 100644 -index 0000000..aedc6f3 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_rwlock.h -@@ -0,0 +1,42 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_RWLOCK_LOONGARCH_H -+#define RTE_RWLOCK_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_rwlock.h" -+ -+static inline void -+rte_rwlock_read_lock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_read_lock(rwl); -+} -+ -+static inline void -+rte_rwlock_read_unlock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_read_unlock(rwl); -+} -+ -+static inline void -+rte_rwlock_write_lock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_write_lock(rwl); -+} -+ -+static inline void -+rte_rwlock_write_unlock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_write_unlock(rwl); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_RWLOCK_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_spinlock.h b/lib/eal/loongarch/include/rte_spinlock.h -new file mode 100644 -index 0000000..e8d34e9 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_spinlock.h -@@ -0,0 +1,64 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_SPINLOCK_LOONGARCH_H -+#define RTE_SPINLOCK_LOONGARCH_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include "generic/rte_spinlock.h" -+ -+#ifndef RTE_FORCE_INTRINSICS -+# error Platform must be built with RTE_FORCE_INTRINSICS -+#endif -+ -+static inline int rte_tm_supported(void) -+{ -+ return 0; -+} -+ -+static inline void -+rte_spinlock_lock_tm(rte_spinlock_t *sl) -+{ -+ rte_spinlock_lock(sl); /* fall-back */ -+} -+ -+static inline int -+rte_spinlock_trylock_tm(rte_spinlock_t *sl) -+{ -+ return rte_spinlock_trylock(sl); -+} -+ -+static inline void -+rte_spinlock_unlock_tm(rte_spinlock_t *sl) -+{ -+ rte_spinlock_unlock(sl); -+} -+ -+static inline void -+rte_spinlock_recursive_lock_tm(rte_spinlock_recursive_t *slr) -+{ -+ rte_spinlock_recursive_lock(slr); /* fall-back */ -+} -+ -+static inline void -+rte_spinlock_recursive_unlock_tm(rte_spinlock_recursive_t *slr) -+{ -+ rte_spinlock_recursive_unlock(slr); -+} -+ -+static inline int -+rte_spinlock_recursive_trylock_tm(rte_spinlock_recursive_t *slr) -+{ -+ return rte_spinlock_recursive_trylock(slr); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_SPINLOCK_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/include/rte_ticketlock.h b/lib/eal/loongarch/include/rte_ticketlock.h -new file mode 100644 -index 0000000..48494cb ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_ticketlock.h -@@ -0,0 +1,214 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef _RTE_TICKETLOCK_H_ -+#define _RTE_TICKETLOCK_H_ -+ -+/** -+ * @file -+ * -+ * RTE ticket locks -+ * -+ * This file defines an API for ticket locks, which give each waiting -+ * thread a ticket and take the lock one by one, first come, first -+ * serviced. -+ * -+ * All locks must be initialised before use, and only initialised once. -+ * -+ */ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include -+#include -+ -+/** -+ * The rte_ticketlock_t type. -+ */ -+typedef union { -+ uint32_t tickets; -+ struct { -+ uint16_t current; -+ uint16_t next; -+ } s; -+} rte_ticketlock_t; -+ -+/** -+ * A static ticketlock initializer. -+ */ -+#define RTE_TICKETLOCK_INITIALIZER { 0 } -+ -+/** -+ * Initialize the ticketlock to an unlocked state. -+ * -+ * @param tl -+ * A pointer to the ticketlock. -+ */ -+static inline void -+rte_ticketlock_init(rte_ticketlock_t *tl) -+{ -+ __atomic_store_n(&tl->tickets, 0, __ATOMIC_RELAXED); -+} -+ -+/** -+ * Take the ticketlock. -+ * -+ * @param tl -+ * A pointer to the ticketlock. -+ */ -+static inline void -+rte_ticketlock_lock(rte_ticketlock_t *tl) -+{ -+ uint16_t me = __atomic_fetch_add(&tl->s.next, 1, __ATOMIC_RELAXED); -+ rte_wait_until_equal_16(&tl->s.current, me, __ATOMIC_ACQUIRE); -+} -+ -+/** -+ * Release the ticketlock. -+ * -+ * @param tl -+ * A pointer to the ticketlock. -+ */ -+static inline void -+rte_ticketlock_unlock(rte_ticketlock_t *tl) -+{ -+ uint16_t i = __atomic_load_n(&tl->s.current, __ATOMIC_RELAXED); -+ __atomic_store_n(&tl->s.current, i + 1, __ATOMIC_RELEASE); -+} -+ -+/** -+ * Try to take the lock. -+ * -+ * @param tl -+ * A pointer to the ticketlock. -+ * @return -+ * 1 if the lock is successfully taken; 0 otherwise. -+ */ -+static inline int -+rte_ticketlock_trylock(rte_ticketlock_t *tl) -+{ -+ rte_ticketlock_t old, new; -+ old.tickets = __atomic_load_n(&tl->tickets, __ATOMIC_RELAXED); -+ new.tickets = old.tickets; -+ new.s.next++; -+ if (old.s.next == old.s.current) { -+ if (__atomic_compare_exchange_n(&tl->tickets, &old.tickets, -+ new.tickets, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+/** -+ * Test if the lock is taken. -+ * -+ * @param tl -+ * A pointer to the ticketlock. -+ * @return -+ * 1 if the lock is currently taken; 0 otherwise. -+ */ -+static inline int -+rte_ticketlock_is_locked(rte_ticketlock_t *tl) -+{ -+ rte_ticketlock_t tic; -+ tic.tickets = __atomic_load_n(&tl->tickets, __ATOMIC_ACQUIRE); -+ return (tic.s.current != tic.s.next); -+} -+ -+/** -+ * The rte_ticketlock_recursive_t type. -+ */ -+#define TICKET_LOCK_INVALID_ID -1 -+ -+typedef struct { -+ rte_ticketlock_t tl; /**< the actual ticketlock */ -+ int user; /**< core id using lock, TICKET_LOCK_INVALID_ID for unused */ -+ unsigned int count; /**< count of time this lock has been called */ -+} rte_ticketlock_recursive_t; -+ -+/** -+ * A static recursive ticketlock initializer. -+ */ -+#define RTE_TICKETLOCK_RECURSIVE_INITIALIZER {RTE_TICKETLOCK_INITIALIZER, \ -+ TICKET_LOCK_INVALID_ID, 0} -+ -+/** -+ * Initialize the recursive ticketlock to an unlocked state. -+ * -+ * @param tlr -+ * A pointer to the recursive ticketlock. -+ */ -+static inline void -+rte_ticketlock_recursive_init(rte_ticketlock_recursive_t *tlr) -+{ -+ rte_ticketlock_init(&tlr->tl); -+ __atomic_store_n(&tlr->user, TICKET_LOCK_INVALID_ID, __ATOMIC_RELAXED); -+ tlr->count = 0; -+} -+ -+/** -+ * Take the recursive ticketlock. -+ * -+ * @param tlr -+ * A pointer to the recursive ticketlock. -+ */ -+static inline void -+rte_ticketlock_recursive_lock(rte_ticketlock_recursive_t *tlr) -+{ -+ int id = rte_gettid(); -+ -+ if (__atomic_load_n(&tlr->user, __ATOMIC_RELAXED) != id) { -+ rte_ticketlock_lock(&tlr->tl); -+ __atomic_store_n(&tlr->user, id, __ATOMIC_RELAXED); -+ } -+ tlr->count++; -+} -+ -+/** -+ * Release the recursive ticketlock. -+ * -+ * @param tlr -+ * A pointer to the recursive ticketlock. -+ */ -+static inline void -+rte_ticketlock_recursive_unlock(rte_ticketlock_recursive_t *tlr) -+{ -+ if (--(tlr->count) == 0) { -+ __atomic_store_n(&tlr->user, TICKET_LOCK_INVALID_ID, -+ __ATOMIC_RELAXED); -+ rte_ticketlock_unlock(&tlr->tl); -+ } -+} -+ -+/** -+ * Try to take the recursive lock. -+ * -+ * @param tlr -+ * A pointer to the recursive ticketlock. -+ * @return -+ * 1 if the lock is successfully taken; 0 otherwise. -+ */ -+static inline int -+rte_ticketlock_recursive_trylock(rte_ticketlock_recursive_t *tlr) -+{ -+ int id = rte_gettid(); -+ -+ if (__atomic_load_n(&tlr->user, __ATOMIC_RELAXED) != id) { -+ if (rte_ticketlock_trylock(&tlr->tl) == 0) -+ return 0; -+ __atomic_store_n(&tlr->user, id, __ATOMIC_RELAXED); -+ } -+ tlr->count++; -+ return 1; -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_TICKETLOCK_H_ */ -diff --git a/lib/eal/loongarch/include/rte_vect.h b/lib/eal/loongarch/include/rte_vect.h -new file mode 100644 -index 0000000..1546515 ---- /dev/null -+++ b/lib/eal/loongarch/include/rte_vect.h -@@ -0,0 +1,65 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#ifndef RTE_VECT_LOONGARCH_H -+#define RTE_VECT_LOONGARCH_H -+ -+#include -+#include "generic/rte_vect.h" -+#include "rte_common.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define RTE_VECT_DEFAULT_SIMD_BITWIDTH RTE_VECT_SIMD_DISABLED -+ -+typedef union xmm { -+ int8_t i8[16]; -+ int16_t i16[8]; -+ int32_t i32[4]; -+ int64_t i64[2]; -+ uint8_t u8[16]; -+ uint16_t u16[8]; -+ uint32_t u32[4]; -+ uint64_t u64[2]; -+ double pd[2]; -+} __rte_aligned(16) xmm_t; -+ -+#define XMM_SIZE (sizeof(xmm_t)) -+#define XMM_MASK (XMM_SIZE - 1) -+ -+typedef union rte_xmm { -+ xmm_t x; -+ uint8_t u8[XMM_SIZE / sizeof(uint8_t)]; -+ uint16_t u16[XMM_SIZE / sizeof(uint16_t)]; -+ uint32_t u32[XMM_SIZE / sizeof(uint32_t)]; -+ uint64_t u64[XMM_SIZE / sizeof(uint64_t)]; -+ double pd[XMM_SIZE / sizeof(double)]; -+} __rte_aligned(16) rte_xmm_t; -+ -+static inline xmm_t -+vect_load_128(void *p) -+{ -+ xmm_t ret = *((xmm_t *)p); -+ -+ return ret; -+} -+ -+static inline xmm_t -+vect_and(xmm_t data, xmm_t mask) -+{ -+ rte_xmm_t ret = {.x = data }; -+ rte_xmm_t m = {.x = mask }; -+ ret.u64[0] &= m.u64[0]; -+ ret.u64[1] &= m.u64[1]; -+ -+ return ret.x; -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* RTE_VECT_LOONGARCH_H */ -diff --git a/lib/eal/loongarch/meson.build b/lib/eal/loongarch/meson.build -new file mode 100644 -index 0000000..4dcc27b ---- /dev/null -+++ b/lib/eal/loongarch/meson.build -@@ -0,0 +1,11 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2022 Loongson Technology Corporation Limited -+ -+subdir('include') -+ -+sources += files( -+ 'rte_cpuflags.c', -+ 'rte_cycles.c', -+ 'rte_hypervisor.c', -+ 'rte_power_intrinsics.c', -+) -diff --git a/lib/eal/loongarch/rte_cpuflags.c b/lib/eal/loongarch/rte_cpuflags.c -new file mode 100644 -index 0000000..0a75ca5 ---- /dev/null -+++ b/lib/eal/loongarch/rte_cpuflags.c -@@ -0,0 +1,93 @@ -+/* -+ * SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#include "rte_cpuflags.h" -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* Symbolic values for the entries in the auxiliary table */ -+#define AT_HWCAP 16 -+ -+/* software based registers */ -+enum cpu_register_t { -+ REG_NONE = 0, -+ REG_HWCAP, -+ REG_MAX -+}; -+ -+typedef uint32_t hwcap_registers_t[REG_MAX]; -+ -+struct feature_entry { -+ uint32_t reg; -+ uint32_t bit; -+#define CPU_FLAG_NAME_MAX_LEN 64 -+ char name[CPU_FLAG_NAME_MAX_LEN]; -+}; -+ -+#define FEAT_DEF(name, reg, bit) \ -+ [RTE_CPUFLAG_##name] = {reg, bit, #name}, -+ -+const struct feature_entry rte_cpu_feature_table[] = { -+ FEAT_DEF(CPUCFG, REG_HWCAP, 0) -+ FEAT_DEF(LAM, REG_HWCAP, 1) -+ FEAT_DEF(UAL, REG_HWCAP, 2) -+ FEAT_DEF(FPU, REG_HWCAP, 3) -+ FEAT_DEF(LSX, REG_HWCAP, 4) -+ FEAT_DEF(LASX, REG_HWCAP, 5) -+ FEAT_DEF(CRC32, REG_HWCAP, 6) -+ FEAT_DEF(COMPLEX, REG_HWCAP, 7) -+ FEAT_DEF(CRYPTO, REG_HWCAP, 8) -+ FEAT_DEF(LVZ, REG_HWCAP, 9) -+ FEAT_DEF(LBT_X86, REG_HWCAP, 10) -+ FEAT_DEF(LBT_ARM, REG_HWCAP, 11) -+ FEAT_DEF(LBT_MIPS, REG_HWCAP, 12) -+}; -+ -+/* -+ * Read AUXV software register and get cpu features for LoongArch -+ */ -+static void -+rte_cpu_get_features(hwcap_registers_t out) -+{ -+ out[REG_HWCAP] = rte_cpu_getauxval(AT_HWCAP); -+} -+ -+/* -+ * Checks if a particular flag is available on current machine. -+ */ -+int -+rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature) -+{ -+ const struct feature_entry *feat; -+ hwcap_registers_t regs = {0}; -+ -+ if (feature >= RTE_CPUFLAG_NUMFLAGS) -+ return -ENOENT; -+ -+ feat = &rte_cpu_feature_table[feature]; -+ if (feat->reg == REG_NONE) -+ return -EFAULT; -+ -+ rte_cpu_get_features(regs); -+ return (regs[feat->reg] >> feat->bit) & 1; -+} -+ -+const char * -+rte_cpu_get_flag_name(enum rte_cpu_flag_t feature) -+{ -+ if (feature >= RTE_CPUFLAG_NUMFLAGS) -+ return NULL; -+ return rte_cpu_feature_table[feature].name; -+} -+ -+void -+rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics) -+{ -+ memset(intrinsics, 0, sizeof(*intrinsics)); -+} -diff --git a/lib/eal/loongarch/rte_cycles.c b/lib/eal/loongarch/rte_cycles.c -new file mode 100644 -index 0000000..582601d ---- /dev/null -+++ b/lib/eal/loongarch/rte_cycles.c -@@ -0,0 +1,45 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#include "eal_private.h" -+ -+#define LOONGARCH_CPUCFG4 0x4 -+#define CPUCFG4_CCFREQ_MASK 0xFFFFFFFF -+#define CPUCFG4_CCFREQ_SHIFT 0 -+ -+#define LOONGARCH_CPUCFG5 0x5 -+#define CPUCFG5_CCMUL_MASK 0xFFFF -+#define CPUCFG5_CCMUL_SHIFT 0 -+ -+#define CPUCFG5_CCDIV_MASK 0xFFFF0000 -+#define CPUCFG5_CCDIV_SHIFT 16 -+ -+static __rte_noinline uint32_t -+read_cpucfg(int arg) -+{ -+ int ret = 0; -+ -+ __asm__ __volatile__ ( -+ "cpucfg %[var], %[index]\n" -+ : [var]"=r"(ret) -+ : [index]"r"(arg) -+ : -+ ); -+ -+ return ret; -+} -+ -+uint64_t -+get_tsc_freq_arch(void) -+{ -+ uint32_t base_freq, mul_factor, div_factor; -+ -+ base_freq = read_cpucfg(LOONGARCH_CPUCFG4); -+ mul_factor = (read_cpucfg(LOONGARCH_CPUCFG5) & CPUCFG5_CCMUL_MASK) >> -+ CPUCFG5_CCMUL_SHIFT; -+ div_factor = (read_cpucfg(LOONGARCH_CPUCFG5) & CPUCFG5_CCDIV_MASK) >> -+ CPUCFG5_CCDIV_SHIFT; -+ -+ return base_freq * mul_factor / div_factor; -+} -diff --git a/lib/eal/loongarch/rte_hypervisor.c b/lib/eal/loongarch/rte_hypervisor.c -new file mode 100644 -index 0000000..d044906 ---- /dev/null -+++ b/lib/eal/loongarch/rte_hypervisor.c -@@ -0,0 +1,11 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#include "rte_hypervisor.h" -+ -+enum rte_hypervisor -+rte_hypervisor_get(void) -+{ -+ return RTE_HYPERVISOR_UNKNOWN; -+} -diff --git a/lib/eal/loongarch/rte_power_intrinsics.c b/lib/eal/loongarch/rte_power_intrinsics.c -new file mode 100644 -index 0000000..a8969c2 ---- /dev/null -+++ b/lib/eal/loongarch/rte_power_intrinsics.c -@@ -0,0 +1,53 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Loongson Technology Corporation Limited -+ */ -+ -+#include -+ -+#include "rte_power_intrinsics.h" -+ -+/** -+ * This function is not supported on LOONGARCH. -+ */ -+int -+rte_power_monitor(const struct rte_power_monitor_cond *pmc, -+ const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(pmc); -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -+ -+/** -+ * This function is not supported on LOONGARCH. -+ */ -+int -+rte_power_pause(const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -+ -+/** -+ * This function is not supported on LOONGARCH. -+ */ -+int -+rte_power_monitor_wakeup(const unsigned int lcore_id) -+{ -+ RTE_SET_USED(lcore_id); -+ -+ return -ENOTSUP; -+} -+ -+int -+rte_power_monitor_multi(const struct rte_power_monitor_cond pmc[], -+ const uint32_t num, const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(pmc); -+ RTE_SET_USED(num); -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -diff --git a/lib/lpm/meson.build b/lib/lpm/meson.build -index 78d91d3..6b47361 100644 ---- a/lib/lpm/meson.build -+++ b/lib/lpm/meson.build -@@ -14,6 +14,7 @@ headers = files('rte_lpm.h', 'rte_lpm6.h') - indirect_headers += files( - 'rte_lpm_altivec.h', - 'rte_lpm_neon.h', -+ 'rte_lpm_scalar.h', - 'rte_lpm_sse.h', - 'rte_lpm_sve.h', - ) -diff --git a/lib/lpm/rte_lpm.h b/lib/lpm/rte_lpm.h -index 5eb14c1..49cfa5b 100644 ---- a/lib/lpm/rte_lpm.h -+++ b/lib/lpm/rte_lpm.h -@@ -283,7 +283,7 @@ rte_lpm_delete_all(struct rte_lpm *lpm); - * -EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit - */ - static inline int --rte_lpm_lookup(struct rte_lpm *lpm, uint32_t ip, uint32_t *next_hop) -+rte_lpm_lookup(const struct rte_lpm *lpm, uint32_t ip, uint32_t *next_hop) - { - unsigned tbl24_index = (ip >> 8); - uint32_t tbl_entry; -@@ -409,8 +409,10 @@ rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], - #endif - #elif defined(RTE_ARCH_PPC_64) - #include "rte_lpm_altivec.h" --#else -+#elif defined(RTE_ARCH_X86) - #include "rte_lpm_sse.h" -+#else -+#include "rte_lpm_scalar.h" - #endif - - #ifdef __cplusplus -diff --git a/lib/lpm/rte_lpm_scalar.h b/lib/lpm/rte_lpm_scalar.h -new file mode 100644 -index 0000000..df4f83f ---- /dev/null -+++ b/lib/lpm/rte_lpm_scalar.h -@@ -0,0 +1,38 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 StarFive -+ * Copyright(c) 2022 SiFive -+ * Copyright(c) 2022 Semihalf -+ */ -+ -+#ifndef _RTE_LPM_SCALAR_H_ -+#define _RTE_LPM_SCALAR_H_ -+ -+#include -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+static inline void -+rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], -+ uint32_t defv) -+{ -+ rte_xmm_t xip = { .x = ip }; -+ uint32_t nh; -+ int ret; -+ -+ ret = rte_lpm_lookup(lpm, xip.u32[0], &nh); -+ hop[0] = (ret == 0) ? nh : defv; -+ ret = rte_lpm_lookup(lpm, xip.u32[1], &nh); -+ hop[1] = (ret == 0) ? nh : defv; -+ ret = rte_lpm_lookup(lpm, xip.u32[2], &nh); -+ hop[2] = (ret == 0) ? nh : defv; -+ ret = rte_lpm_lookup(lpm, xip.u32[3], &nh); -+ hop[3] = (ret == 0) ? nh : defv; -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_LPM_SCALAR_H_ */ -diff --git a/meson.build b/meson.build -index 12cb6e0..1052fba 100644 ---- a/meson.build -+++ b/meson.build -@@ -42,6 +42,8 @@ if host_machine.cpu_family().startswith('x86') - arch_subdir = 'x86' - elif host_machine.cpu_family().startswith('arm') or host_machine.cpu_family().startswith('aarch') - arch_subdir = 'arm' -+elif host_machine.cpu_family().startswith('loongarch') -+ arch_subdir = 'loongarch' - elif host_machine.cpu_family().startswith('ppc') - arch_subdir = 'ppc' - endif --- -2.33.0 diff --git a/0022-net-hns3-remove-unnecessary-assignment.patch b/0022-net-hns3-remove-unnecessary-assignment.patch deleted file mode 100644 index dd75097..0000000 --- a/0022-net-hns3-remove-unnecessary-assignment.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b70e96833a753239454c660b71cbab6e0dcbbeae Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:28 +0800 -Subject: [PATCH] net/hns3: remove unnecessary assignment - -Remove unnecessary assignment. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 0dbc3f6502..5f2b279546 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1890,7 +1890,6 @@ hns3_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, - } - } - rte_free(flow); -- flow = NULL; - - return 0; - } --- -2.33.0 - diff --git a/0023-example-l3fwd-masking-wrong-warning-array-subscript-.patch b/0023-example-l3fwd-masking-wrong-warning-array-subscript-.patch deleted file mode 100644 index 11d404e..0000000 --- a/0023-example-l3fwd-masking-wrong-warning-array-subscript-.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 2889419e10a68fad89df35350a1ea5e41e4cbf35 Mon Sep 17 00:00:00 2001 -From: j00660176 -Date: Wed, 12 Jul 2023 16:39:56 +0800 -Subject: [PATCH] example/l3fwd: masking wrong warning array subscript [0] is - partly outside array bounds - -GCC 12 raises the following warning: -In file included from ../examples/l3fwd/l3fwd_lpm_neon.h:11, - from ../examples/l3fwd/l3fwd_lpm.c:135: -../examples/l3fwd/l3fwd_neon.h: In function 'port_groupx4': -../examples/l3fwd/l3fwd_neon.h:95:21: error: array subscript 'union [0]' is partly outside array bounds of 'uint16_t[5]' {aka 'short unsigned int[5]'} [-Werror=array-bounds] - 95 | pnum->u64 = gptbl[v].pnum; - | ^~ -../examples/l3fwd/l3fwd_neon.h:74:23: note: object 'pn' of size [0, 10] - 74 | port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, uint16x8_t dp1, - | ~~~~~~~~~^~~~~~~~~~~~~~~ -../examples/l3fwd/l3fwd_neon.h:96:21: error: array subscript 'union [0]' is partly outside array bounds of 'uint16_t[5]' {aka 'short unsigned int[5]'} [-Werror=array-bounds] - 96 | pnum->u16[FWDSTEP] = 1; - | ^~ -../examples/l3fwd/l3fwd_neon.h:74:23: note: object 'pn' of size [0, 10] - 74 | port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, uint16x8_t dp1, - | ~~~~~~~~~^~~~~~~~~~~~~~~ -cc1: all warnings being treated as errors - -according to the code review, this is a wrong warning: -pnum's size is uint16_t * 5 = 10, FWDSTEP is 4, line 96 access pnum->[4]; lin95 access accesses a 64-bit value, taking up the first four elements of a number. -due to patch 0002-dpdk-add-secure-compile-option-and-fPIC-option.patch, it treats warnings as errors. so the l3fwd compilation fails. ---- - examples/l3fwd/meson.build | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build -index 0830b3e..827206e 100644 ---- a/examples/l3fwd/meson.build -+++ b/examples/l3fwd/meson.build -@@ -7,6 +7,8 @@ - # DPDK instance, use 'make' - - allow_experimental_apis = true -+cflags += ['-Wno-array-bounds'] -+ - deps += ['hash', 'lpm', 'fib', 'eventdev'] - sources = files( - 'l3fwd_em.c', --- -2.33.0 diff --git a/0023-net-hns3-fix-using-enum-as-boolean.patch b/0023-net-hns3-fix-using-enum-as-boolean.patch deleted file mode 100644 index 80ee21d..0000000 --- a/0023-net-hns3-fix-using-enum-as-boolean.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 67d0b17947d6936147f4cbfff6ff938884f14776 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:29 +0800 -Subject: [PATCH] net/hns3: fix using enum as boolean - -The enum type variables cannot be used as bool variables. This patch -fixes for "with->func" in hns3_action_rss_same(). - -Fixes: eb158fc756a5 ("net/hns3: fix config when creating RSS rule after flush") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 5f2b279546..00084872ad 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1251,7 +1251,8 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - if (comp->func == RTE_ETH_HASH_FUNCTION_MAX) - func_is_same = false; - else -- func_is_same = with->func ? (comp->func == with->func) : true; -+ func_is_same = (with->func != RTE_ETH_HASH_FUNCTION_DEFAULT) ? -+ (comp->func == with->func) : true; - - return (func_is_same && - comp->types == (with->types & HNS3_ETH_RSS_SUPPORT) && --- -2.33.0 - diff --git a/0024-net-hns3-extract-common-function-to-initialize-MAC-a.patch b/0024-net-hns3-extract-common-function-to-initialize-MAC-a.patch deleted file mode 100644 index af05128..0000000 --- a/0024-net-hns3-extract-common-function-to-initialize-MAC-a.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 2665a92054019bdb73cd2c43e5a581d081772915 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:30 +0800 -Subject: [PATCH] net/hns3: extract common function to initialize MAC address - -The code logic to initialize "data->mac_addrs" for PF and VF is similar. -This patch extracts a common API to initialize it to improve code -maintainability. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_common.c | 54 +++++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_common.h | 1 + - drivers/net/hns3/hns3_ethdev.c | 31 +++--------------- - drivers/net/hns3/hns3_ethdev_vf.c | 33 +++---------------- - 4 files changed, 63 insertions(+), 56 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 78158401f2..0f39d51a87 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -587,6 +587,60 @@ hns3_remove_mac_addr(struct rte_eth_dev *dev, uint32_t idx) - } - } - -+int -+hns3_init_mac_addrs(struct rte_eth_dev *dev) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ const char *memory_name = hns->is_vf ? "hns3vf-mac" : "hns3-mac"; -+ uint16_t mac_addrs_capa = hns->is_vf ? HNS3_VF_UC_MACADDR_NUM : -+ HNS3_UC_MACADDR_NUM; -+ char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct rte_ether_addr *eth_addr; -+ -+ /* Allocate memory for storing MAC addresses */ -+ dev->data->mac_addrs = rte_zmalloc(memory_name, -+ sizeof(struct rte_ether_addr) * mac_addrs_capa, -+ 0); -+ if (dev->data->mac_addrs == NULL) { -+ hns3_err(hw, "failed to allocate %zx bytes needed to store MAC addresses", -+ sizeof(struct rte_ether_addr) * mac_addrs_capa); -+ return -ENOMEM; -+ } -+ -+ eth_addr = (struct rte_ether_addr *)hw->mac.mac_addr; -+ if (!hns->is_vf) { -+ if (!rte_is_valid_assigned_ether_addr(eth_addr)) { -+ rte_eth_random_addr(hw->mac.mac_addr); -+ hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -+ (struct rte_ether_addr *)hw->mac.mac_addr); -+ hns3_warn(hw, "default mac_addr from firmware is an invalid " -+ "unicast address, using random MAC address %s", -+ mac_str); -+ } -+ } else { -+ /* -+ * The hns3 PF ethdev driver in kernel support setting VF MAC -+ * address on the host by "ip link set ..." command. To avoid -+ * some incorrect scenes, for example, hns3 VF PMD driver fails -+ * to receive and send packets after user configure the MAC -+ * address by using the "ip link set ..." command, hns3 VF PMD -+ * driver keep the same MAC address strategy as the hns3 kernel -+ * ethdev driver in the initialization. If user configure a MAC -+ * address by the ip command for VF device, then hns3 VF PMD -+ * driver will start with it, otherwise start with a random MAC -+ * address in the initialization. -+ */ -+ if (rte_is_zero_ether_addr(eth_addr)) -+ rte_eth_random_addr(hw->mac.mac_addr); -+ } -+ -+ rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.mac_addr, -+ &dev->data->mac_addrs[0]); -+ -+ return 0; -+} -+ - int - hns3_init_ring_with_vector(struct hns3_hw *hw) - { -diff --git a/drivers/net/hns3/hns3_common.h b/drivers/net/hns3/hns3_common.h -index 0dbb1c0413..a9e8a9cccf 100644 ---- a/drivers/net/hns3/hns3_common.h -+++ b/drivers/net/hns3/hns3_common.h -@@ -52,6 +52,7 @@ int hns3_set_mc_mac_addr_list(struct rte_eth_dev *dev, - uint32_t nb_mc_addr); - void hns3_ether_format_addr(char *buf, uint16_t size, - const struct rte_ether_addr *ether_addr); -+int hns3_init_mac_addrs(struct rte_eth_dev *dev); - - int hns3_init_ring_with_vector(struct hns3_hw *hw); - int hns3_map_rx_interrupt(struct rte_eth_dev *dev); -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index ef13d31d19..722660d0cc 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6617,8 +6617,6 @@ static int - hns3_dev_init(struct rte_eth_dev *eth_dev) - { - struct hns3_adapter *hns = eth_dev->data->dev_private; -- char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -- struct rte_ether_addr *eth_addr; - struct hns3_hw *hw = &hns->hw; - int ret; - -@@ -6661,30 +6659,9 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) - goto err_init_pf; - } - -- /* Allocate memory for storing MAC addresses */ -- eth_dev->data->mac_addrs = rte_zmalloc("hns3-mac", -- sizeof(struct rte_ether_addr) * -- HNS3_UC_MACADDR_NUM, 0); -- if (eth_dev->data->mac_addrs == NULL) { -- PMD_INIT_LOG(ERR, "Failed to allocate %zx bytes needed " -- "to store MAC addresses", -- sizeof(struct rte_ether_addr) * -- HNS3_UC_MACADDR_NUM); -- ret = -ENOMEM; -- goto err_rte_zmalloc; -- } -- -- eth_addr = (struct rte_ether_addr *)hw->mac.mac_addr; -- if (!rte_is_valid_assigned_ether_addr(eth_addr)) { -- rte_eth_random_addr(hw->mac.mac_addr); -- hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- (struct rte_ether_addr *)hw->mac.mac_addr); -- hns3_warn(hw, "default mac_addr from firmware is an invalid " -- "unicast address, using random MAC address %s", -- mac_str); -- } -- rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.mac_addr, -- ð_dev->data->mac_addrs[0]); -+ ret = hns3_init_mac_addrs(eth_dev); -+ if (ret != 0) -+ goto err_init_mac_addrs; - - hw->adapter_state = HNS3_NIC_INITIALIZED; - -@@ -6700,7 +6677,7 @@ hns3_dev_init(struct rte_eth_dev *eth_dev) - hns3_info(hw, "hns3 dev initialization successful!"); - return 0; - --err_rte_zmalloc: -+err_init_mac_addrs: - hns3_uninit_pf(eth_dev); - - err_init_pf: -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 5015fe0d5f..5a1286e17b 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -2400,34 +2400,9 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) - goto err_init_vf; - } - -- /* Allocate memory for storing MAC addresses */ -- eth_dev->data->mac_addrs = rte_zmalloc("hns3vf-mac", -- sizeof(struct rte_ether_addr) * -- HNS3_VF_UC_MACADDR_NUM, 0); -- if (eth_dev->data->mac_addrs == NULL) { -- PMD_INIT_LOG(ERR, "Failed to allocate %zx bytes needed " -- "to store MAC addresses", -- sizeof(struct rte_ether_addr) * -- HNS3_VF_UC_MACADDR_NUM); -- ret = -ENOMEM; -- goto err_rte_zmalloc; -- } -- -- /* -- * The hns3 PF ethdev driver in kernel support setting VF MAC address -- * on the host by "ip link set ..." command. To avoid some incorrect -- * scenes, for example, hns3 VF PMD fails to receive and send -- * packets after user configure the MAC address by using the -- * "ip link set ..." command, hns3 VF PMD keep the same MAC -- * address strategy as the hns3 kernel ethdev driver in the -- * initialization. If user configure a MAC address by the ip command -- * for VF device, then hns3 VF PMD will start with it, otherwise -- * start with a random MAC address in the initialization. -- */ -- if (rte_is_zero_ether_addr((struct rte_ether_addr *)hw->mac.mac_addr)) -- rte_eth_random_addr(hw->mac.mac_addr); -- rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.mac_addr, -- ð_dev->data->mac_addrs[0]); -+ ret = hns3_init_mac_addrs(eth_dev); -+ if (ret != 0) -+ goto err_init_mac_addrs; - - hw->adapter_state = HNS3_NIC_INITIALIZED; - -@@ -2443,7 +2418,7 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev) - eth_dev); - return 0; - --err_rte_zmalloc: -+err_init_mac_addrs: - hns3vf_uninit_vf(eth_dev); - - err_init_vf: --- -2.33.0 - diff --git a/0025-net-hns3-make-control-plane-function-non-inline.patch b/0025-net-hns3-make-control-plane-function-non-inline.patch deleted file mode 100644 index 4f658d1..0000000 --- a/0025-net-hns3-make-control-plane-function-non-inline.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 7be11baa6e5fd2143f5574403c44e45fc9c5e393 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 22 Jan 2022 09:51:31 +0800 -Subject: [PATCH] net/hns3: make control plane function non-inline - -This function is a control-plane interface and does -not need to use inline. - -Signed-off-by: Jie Hai -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 722660d0cc..f92832a4aa 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4853,7 +4853,7 @@ hns3_check_port_speed(struct hns3_hw *hw, uint32_t link_speeds) - return 0; - } - --static inline uint32_t -+static uint32_t - hns3_get_link_speed(uint32_t link_speeds) - { - uint32_t speed = RTE_ETH_SPEED_NUM_NONE; --- -2.33.0 - diff --git a/0026-net-hns3-remove-unnecessary-blank-lines.patch b/0026-net-hns3-remove-unnecessary-blank-lines.patch deleted file mode 100644 index 4cdecd0..0000000 --- a/0026-net-hns3-remove-unnecessary-blank-lines.patch +++ /dev/null @@ -1,49 +0,0 @@ -From fbbcf80a9dc6d2f2d553b1c0b8762b5a35f4afc0 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:32 +0800 -Subject: [PATCH] net/hns3: remove unnecessary blank lines - -Remove unnecessary blank lines. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 1 - - drivers/net/hns3/hns3_rxtx.h | 2 -- - 2 files changed, 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index f92832a4aa..0f6d238f6f 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6295,7 +6295,6 @@ hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode) - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); - struct hns3_pf *pf = &hns->pf; -- - struct rte_eth_fec_capa fec_capa[FEC_CAPA_NUM]; - uint32_t cur_capa; - uint32_t num = FEC_CAPA_NUM; -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index e202eb9c30..094b65b7de 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -344,7 +344,6 @@ struct hns3_rx_queue { - - struct rte_mbuf fake_mbuf; /* fake mbuf used with vector rx */ - -- - /* - * The following fields are not accessed in the I/O path, so they are - * placed at the end. -@@ -518,7 +517,6 @@ struct hns3_tx_queue { - struct hns3_tx_basic_stats basic_stats; - struct hns3_tx_dfx_stats dfx_stats; - -- - /* - * The following fields are not accessed in the I/O path, so they are - * placed at the end. --- -2.33.0 - diff --git a/0027-net-hns3-extract-reset-failure-handling-to-function.patch b/0027-net-hns3-extract-reset-failure-handling-to-function.patch deleted file mode 100644 index 0b685f5..0000000 --- a/0027-net-hns3-extract-reset-failure-handling-to-function.patch +++ /dev/null @@ -1,95 +0,0 @@ -From f13c07a570fabe362b55d2e3643b5ff96513597f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:33 +0800 -Subject: [PATCH] net/hns3: extract reset failure handling to function - -Extract a function to handle reset fail for clearer code logic. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_intr.c | 54 +++++++++++++++++++++--------------- - 1 file changed, 32 insertions(+), 22 deletions(-) - -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 66dc509086..3ca2e1e338 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -2770,6 +2770,37 @@ hns3_reset_post(struct hns3_adapter *hns) - return -EIO; - } - -+static void -+hns3_reset_fail_handle(struct hns3_adapter *hns) -+{ -+ struct hns3_hw *hw = &hns->hw; -+ struct timeval tv_delta; -+ struct timeval tv; -+ -+ hns3_clear_reset_level(hw, &hw->reset.pending); -+ if (hns3_reset_err_handle(hns)) { -+ hw->reset.stage = RESET_STAGE_PREWAIT; -+ hns3_schedule_reset(hns); -+ return; -+ } -+ -+ rte_spinlock_lock(&hw->lock); -+ if (hw->reset.mbuf_deferred_free) { -+ hns3_dev_release_mbufs(hns); -+ hw->reset.mbuf_deferred_free = false; -+ } -+ rte_spinlock_unlock(&hw->lock); -+ __atomic_store_n(&hns->hw.reset.resetting, 0, __ATOMIC_RELAXED); -+ hw->reset.stage = RESET_STAGE_NONE; -+ hns3_clock_gettime(&tv); -+ timersub(&tv, &hw->reset.start_time, &tv_delta); -+ hns3_warn(hw, "%s reset fail delta %" PRIu64 " ms time=%ld.%.6ld", -+ reset_string[hw->reset.level], -+ hns3_clock_calctime_ms(&tv_delta), -+ tv.tv_sec, tv.tv_usec); -+ hw->reset.level = HNS3_NONE_RESET; -+} -+ - /* - * There are three scenarios as follows: - * When the reset is not in progress, the reset process starts. -@@ -2784,7 +2815,6 @@ int - hns3_reset_process(struct hns3_adapter *hns, enum hns3_reset_level new_level) - { - struct hns3_hw *hw = &hns->hw; -- struct timeval tv_delta; - struct timeval tv; - int ret; - -@@ -2843,27 +2873,7 @@ hns3_reset_process(struct hns3_adapter *hns, enum hns3_reset_level new_level) - if (ret == -EAGAIN) - return ret; - err: -- hns3_clear_reset_level(hw, &hw->reset.pending); -- if (hns3_reset_err_handle(hns)) { -- hw->reset.stage = RESET_STAGE_PREWAIT; -- hns3_schedule_reset(hns); -- } else { -- rte_spinlock_lock(&hw->lock); -- if (hw->reset.mbuf_deferred_free) { -- hns3_dev_release_mbufs(hns); -- hw->reset.mbuf_deferred_free = false; -- } -- rte_spinlock_unlock(&hw->lock); -- __atomic_store_n(&hns->hw.reset.resetting, 0, __ATOMIC_RELAXED); -- hw->reset.stage = RESET_STAGE_NONE; -- hns3_clock_gettime(&tv); -- timersub(&tv, &hw->reset.start_time, &tv_delta); -- hns3_warn(hw, "%s reset fail delta %" PRIu64 " ms time=%ld.%.6ld", -- reset_string[hw->reset.level], -- hns3_clock_calctime_ms(&tv_delta), -- tv.tv_sec, tv.tv_usec); -- hw->reset.level = HNS3_NONE_RESET; -- } -+ hns3_reset_fail_handle(hns); - - return -EIO; - } --- -2.33.0 - diff --git a/0028-net-hns3-remove-unused-variables.patch b/0028-net-hns3-remove-unused-variables.patch deleted file mode 100644 index b913c60..0000000 --- a/0028-net-hns3-remove-unused-variables.patch +++ /dev/null @@ -1,77 +0,0 @@ -From a65941e9c461bfc050778ed318a90e621d903163 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:34 +0800 -Subject: [PATCH] net/hns3: remove unused variables - -Remove unused variables. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_dcb.c | 12 +----------- - drivers/net/hns3/hns3_ethdev.c | 3 --- - drivers/net/hns3/hns3_ethdev.h | 2 -- - 3 files changed, 1 insertion(+), 16 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index e4417e87fd..73693786d1 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -750,19 +750,9 @@ static int - hns3_dcb_update_tc_queue_mapping(struct hns3_hw *hw, uint16_t nb_rx_q, - uint16_t nb_tx_q) - { -- struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -- struct hns3_pf *pf = &hns->pf; -- int ret; -- - hw->num_tc = hw->dcb_info.num_tc; -- ret = hns3_queue_to_tc_mapping(hw, nb_rx_q, nb_tx_q); -- if (ret) -- return ret; - -- if (!hns->is_vf) -- memcpy(pf->prio_tc, hw->dcb_info.prio_tc, HNS3_MAX_USER_PRIO); -- -- return 0; -+ return hns3_queue_to_tc_mapping(hw, nb_rx_q, nb_tx_q); - } - - int -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 0f6d238f6f..90eb6340a9 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2546,9 +2546,6 @@ hns3_parse_cfg(struct hns3_cfg *cfg, struct hns3_cmd_desc *desc) - cfg->media_type = hns3_get_field(rte_le_to_cpu_32(req->param[1]), - HNS3_CFG_MEDIA_TP_M, - HNS3_CFG_MEDIA_TP_S); -- cfg->rx_buf_len = hns3_get_field(rte_le_to_cpu_32(req->param[1]), -- HNS3_CFG_RX_BUF_LEN_M, -- HNS3_CFG_RX_BUF_LEN_S); - /* get mac address */ - mac_addr_tmp = rte_le_to_cpu_32(req->param[2]); - mac_addr_tmp_high = hns3_get_field(rte_le_to_cpu_32(req->param[3]), -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 153e67337f..1dd388625b 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -156,7 +156,6 @@ struct hns3_tc_queue_info { - struct hns3_cfg { - uint8_t tc_num; - uint16_t tqp_desc_num; -- uint16_t rx_buf_len; - uint16_t rss_size_max; - uint8_t phy_addr; - uint8_t media_type; -@@ -804,7 +803,6 @@ struct hns3_pf { - uint8_t tc_max; /* max number of tc driver supported */ - uint8_t local_max_tc; /* max number of local tc */ - uint8_t pfc_max; -- uint8_t prio_tc[HNS3_MAX_USER_PRIO]; /* TC indexed by prio */ - uint16_t pause_time; - bool support_fc_autoneg; /* support FC autonegotiate */ - bool support_multi_tc_pause; --- -2.33.0 - diff --git a/0029-net-hns3-remove-getting-number-of-queue-descriptors-.patch b/0029-net-hns3-remove-getting-number-of-queue-descriptors-.patch deleted file mode 100644 index ddb9a47..0000000 --- a/0029-net-hns3-remove-getting-number-of-queue-descriptors-.patch +++ /dev/null @@ -1,107 +0,0 @@ -From af1f62b3d1e6bf12830facbb0161981bdce6685d Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:35 +0800 -Subject: [PATCH] net/hns3: remove getting number of queue descriptors from FW - -Application can specify the number of Rx/Tx queue descriptors in DPDK. -So driver does not obtain the default value from firmware and PF. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 5 ----- - drivers/net/hns3/hns3_ethdev.h | 3 --- - drivers/net/hns3/hns3_ethdev_vf.c | 26 -------------------------- - 3 files changed, 34 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 90eb6340a9..aa9301c561 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2536,9 +2536,6 @@ hns3_parse_cfg(struct hns3_cfg *cfg, struct hns3_cmd_desc *desc) - /* get the configuration */ - cfg->tc_num = hns3_get_field(rte_le_to_cpu_32(req->param[0]), - HNS3_CFG_TC_NUM_M, HNS3_CFG_TC_NUM_S); -- cfg->tqp_desc_num = hns3_get_field(rte_le_to_cpu_32(req->param[0]), -- HNS3_CFG_TQP_DESC_N_M, -- HNS3_CFG_TQP_DESC_N_S); - - cfg->phy_addr = hns3_get_field(rte_le_to_cpu_32(req->param[1]), - HNS3_CFG_PHY_ADDR_M, -@@ -2849,8 +2846,6 @@ hns3_get_board_configuration(struct hns3_hw *hw) - hw->rss_dis_flag = false; - memcpy(hw->mac.mac_addr, cfg.mac_addr, RTE_ETHER_ADDR_LEN); - hw->mac.phy_addr = cfg.phy_addr; -- hw->num_tx_desc = cfg.tqp_desc_num; -- hw->num_rx_desc = cfg.tqp_desc_num; - hw->dcb_info.num_pg = 1; - hw->dcb_info.hw_pfc_map = 0; - -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 1dd388625b..cf6380ebb2 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -155,7 +155,6 @@ struct hns3_tc_queue_info { - - struct hns3_cfg { - uint8_t tc_num; -- uint16_t tqp_desc_num; - uint16_t rss_size_max; - uint8_t phy_addr; - uint8_t media_type; -@@ -512,8 +511,6 @@ struct hns3_hw { - uint16_t intr_tqps_num; /* num queue pairs mapping interrupt */ - uint16_t rss_size_max; /* HW defined max RSS task queue */ - uint16_t rx_buf_len; /* hold min hardware rx buf len */ -- uint16_t num_tx_desc; /* desc num of per tx queue */ -- uint16_t num_rx_desc; /* desc num of per rx queue */ - uint32_t mng_entry_num; /* number of manager table entry */ - uint32_t mac_entry_num; /* number of mac-vlan table entry */ - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 5a1286e17b..36d860d08a 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -941,27 +941,6 @@ hns3vf_get_queue_info(struct hns3_hw *hw) - return hns3vf_check_tqp_info(hw); - } - --static int --hns3vf_get_queue_depth(struct hns3_hw *hw) --{ --#define HNS3VF_TQPS_DEPTH_INFO_LEN 4 -- uint8_t resp_msg[HNS3VF_TQPS_DEPTH_INFO_LEN]; -- int ret; -- -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_GET_QDEPTH, 0, NULL, 0, true, -- resp_msg, HNS3VF_TQPS_DEPTH_INFO_LEN); -- if (ret) { -- PMD_INIT_LOG(ERR, "Failed to get tqp depth info from PF: %d", -- ret); -- return ret; -- } -- -- memcpy(&hw->num_tx_desc, &resp_msg[0], sizeof(uint16_t)); -- memcpy(&hw->num_rx_desc, &resp_msg[2], sizeof(uint16_t)); -- -- return 0; --} -- - static void - hns3vf_update_caps(struct hns3_hw *hw, uint32_t caps) - { -@@ -1052,11 +1031,6 @@ hns3vf_get_configuration(struct hns3_hw *hw) - if (ret) - return ret; - -- /* Get queue depth info from PF */ -- ret = hns3vf_get_queue_depth(hw); -- if (ret) -- return ret; -- - /* Get user defined VF MAC addr from PF */ - ret = hns3vf_get_host_mac_addr(hw); - if (ret) --- -2.33.0 - diff --git a/0030-net-hns3-remove-logging-memory-addresses.patch b/0030-net-hns3-remove-logging-memory-addresses.patch deleted file mode 100644 index 533ba28..0000000 --- a/0030-net-hns3-remove-logging-memory-addresses.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 5608b54756d91505e66e58c2562601b3f7e2fe80 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:36 +0800 -Subject: [PATCH] net/hns3: remove logging memory addresses - -Remove the printing of memory addresses. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_cmd.c | 12 ++++-------- - drivers/net/hns3/hns3_rxtx.c | 6 ------ - 2 files changed, 4 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index 5b42d38aa5..5dc874fd7a 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -60,18 +60,14 @@ hns3_allocate_dma_mem(struct hns3_hw *hw, struct hns3_cmq_ring *ring, - ring->desc = mz->addr; - ring->desc_dma_addr = mz->iova; - ring->zone = (const void *)mz; -- hns3_dbg(hw, "memzone %s allocated with physical address: %" PRIu64, -- mz->name, ring->desc_dma_addr); -+ hns3_dbg(hw, "cmd ring memzone name: %s", mz->name); - - return 0; - } - - static void --hns3_free_dma_mem(struct hns3_hw *hw, struct hns3_cmq_ring *ring) -+hns3_free_dma_mem(struct hns3_cmq_ring *ring) - { -- hns3_dbg(hw, "memzone %s to be freed with physical address: %" PRIu64, -- ((const struct rte_memzone *)ring->zone)->name, -- ring->desc_dma_addr); - rte_memzone_free((const struct rte_memzone *)ring->zone); - ring->buf_size = 0; - ring->desc = NULL; -@@ -93,10 +89,10 @@ hns3_alloc_cmd_desc(struct hns3_hw *hw, struct hns3_cmq_ring *ring) - } - - static void --hns3_free_cmd_desc(struct hns3_hw *hw, struct hns3_cmq_ring *ring) -+hns3_free_cmd_desc(__rte_unused struct hns3_hw *hw, struct hns3_cmq_ring *ring) - { - if (ring->desc) -- hns3_free_dma_mem(hw, ring); -+ hns3_free_dma_mem(ring); - } - - static int -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index c43131cac6..3b72c2375a 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1382,9 +1382,6 @@ hns3_alloc_rxq_and_dma_zone(struct rte_eth_dev *dev, - rxq->rx_ring = (struct hns3_desc *)rx_mz->addr; - rxq->rx_ring_phys_addr = rx_mz->iova; - -- hns3_dbg(hw, "No.%u rx descriptors iova 0x%" PRIx64, q_info->idx, -- rxq->rx_ring_phys_addr); -- - return rxq; - } - -@@ -1469,9 +1466,6 @@ hns3_alloc_txq_and_dma_zone(struct rte_eth_dev *dev, - txq->tx_ring = (struct hns3_desc *)tx_mz->addr; - txq->tx_ring_phys_addr = tx_mz->iova; - -- hns3_dbg(hw, "No.%u tx descriptors iova 0x%" PRIx64, q_info->idx, -- txq->tx_ring_phys_addr); -- - /* Clear tx bd */ - desc = txq->tx_ring; - for (i = 0; i < txq->nb_tx_desc; i++) { --- -2.33.0 - diff --git a/0031-net-hns3-extract-common-function-to-obtain-revision-.patch b/0031-net-hns3-extract-common-function-to-obtain-revision-.patch deleted file mode 100644 index a6d6adc..0000000 --- a/0031-net-hns3-extract-common-function-to-obtain-revision-.patch +++ /dev/null @@ -1,145 +0,0 @@ -From f5ed7d99cf45d550a69c1430b7c4a5623a9c774a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:37 +0800 -Subject: [PATCH] net/hns3: extract common function to obtain revision ID - -The code logic of obtaining the revision ID of PCI device is the same -for PF and VF driver. This patch extracts a common interface to do it. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_common.c | 22 ++++++++++++++++++++++ - drivers/net/hns3/hns3_common.h | 2 ++ - drivers/net/hns3/hns3_ethdev.c | 16 ++++------------ - drivers/net/hns3/hns3_ethdev_vf.c | 21 ++++----------------- - 4 files changed, 32 insertions(+), 29 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 0f39d51a87..dcdc609654 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -821,3 +821,25 @@ hns3_restore_rx_interrupt(struct hns3_hw *hw) - - return 0; - } -+ -+int -+hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id) -+{ -+ struct rte_pci_device *pci_dev; -+ struct rte_eth_dev *eth_dev; -+ uint8_t revision; -+ int ret; -+ -+ eth_dev = &rte_eth_devices[hw->data->port_id]; -+ pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); -+ ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN, -+ HNS3_PCI_REVISION_ID); -+ if (ret != HNS3_PCI_REVISION_ID_LEN) { -+ hns3_err(hw, "failed to read pci revision id, ret = %d", ret); -+ return -EIO; -+ } -+ -+ *revision_id = revision; -+ -+ return 0; -+} -diff --git a/drivers/net/hns3/hns3_common.h b/drivers/net/hns3/hns3_common.h -index a9e8a9cccf..2994e4a269 100644 ---- a/drivers/net/hns3/hns3_common.h -+++ b/drivers/net/hns3/hns3_common.h -@@ -59,4 +59,6 @@ int hns3_map_rx_interrupt(struct rte_eth_dev *dev); - void hns3_unmap_rx_interrupt(struct rte_eth_dev *dev); - int hns3_restore_rx_interrupt(struct hns3_hw *hw); - -+int hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id); -+ - #endif /* _HNS3_COMMON_H_ */ -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index aa9301c561..b417d55e10 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5,7 +5,6 @@ - #include - #include - #include --#include - - #include "hns3_ethdev.h" - #include "hns3_common.h" -@@ -2732,7 +2731,6 @@ hns3_get_capability(struct hns3_hw *hw) - struct hns3_pf *pf = &hns->pf; - struct rte_eth_dev *eth_dev; - uint16_t device_id; -- uint8_t revision; - int ret; - - eth_dev = &rte_eth_devices[hw->data->port_id]; -@@ -2745,17 +2743,11 @@ hns3_get_capability(struct hns3_hw *hw) - device_id == HNS3_DEV_ID_200G_RDMA) - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_DCB_B, 1); - -- /* Get PCI revision id */ -- ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN, -- HNS3_PCI_REVISION_ID); -- if (ret != HNS3_PCI_REVISION_ID_LEN) { -- PMD_INIT_LOG(ERR, "failed to read pci revision id, ret = %d", -- ret); -- return -EIO; -- } -- hw->revision = revision; -+ ret = hns3_get_pci_revision_id(hw, &hw->revision); -+ if (ret) -+ return ret; - -- if (revision < PCI_REVISION_ID_HIP09_A) { -+ if (hw->revision < PCI_REVISION_ID_HIP09_A) { - hns3_set_default_dev_specifications(hw); - hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE; - hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US; -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 36d860d08a..a9e129288b 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -6,7 +6,6 @@ - #include - #include - #include --#include - #include - - #include "hns3_ethdev.h" -@@ -810,25 +809,13 @@ hns3vf_get_push_lsc_cap(struct hns3_hw *hw) - static int - hns3vf_get_capability(struct hns3_hw *hw) - { -- struct rte_pci_device *pci_dev; -- struct rte_eth_dev *eth_dev; -- uint8_t revision; - int ret; - -- eth_dev = &rte_eth_devices[hw->data->port_id]; -- pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); -- -- /* Get PCI revision id */ -- ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN, -- HNS3_PCI_REVISION_ID); -- if (ret != HNS3_PCI_REVISION_ID_LEN) { -- PMD_INIT_LOG(ERR, "failed to read pci revision id, ret = %d", -- ret); -- return -EIO; -- } -- hw->revision = revision; -+ ret = hns3_get_pci_revision_id(hw, &hw->revision); -+ if (ret) -+ return ret; - -- if (revision < PCI_REVISION_ID_HIP09_A) { -+ if (hw->revision < PCI_REVISION_ID_HIP09_A) { - hns3vf_set_default_dev_specifications(hw); - hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE; - hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US; --- -2.33.0 - diff --git a/0032-net-hns3-replace-single-line-functions.patch b/0032-net-hns3-replace-single-line-functions.patch deleted file mode 100644 index d6d89ff..0000000 --- a/0032-net-hns3-replace-single-line-functions.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 3340aa9f50da68f20d2cdb6382a9ab6891e7363c Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 22 Jan 2022 09:51:38 +0800 -Subject: [PATCH] net/hns3: replace single line functions - -This patch removes single functions with actual calls. - -Signed-off-by: Chengwen Feng -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 27 ++++++++------------------- - drivers/net/hns3/hns3_ethdev_vf.c | 13 ++----------- - 2 files changed, 10 insertions(+), 30 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index b417d55e10..a5114662d2 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -587,22 +587,6 @@ hns3_set_vlan_rx_offload_cfg(struct hns3_adapter *hns, - return ret; - } - --static void --hns3_update_rx_offload_cfg(struct hns3_adapter *hns, -- struct hns3_rx_vtag_cfg *vcfg) --{ -- struct hns3_pf *pf = &hns->pf; -- memcpy(&pf->vtag_config.rx_vcfg, vcfg, sizeof(pf->vtag_config.rx_vcfg)); --} -- --static void --hns3_update_tx_offload_cfg(struct hns3_adapter *hns, -- struct hns3_tx_vtag_cfg *vcfg) --{ -- struct hns3_pf *pf = &hns->pf; -- memcpy(&pf->vtag_config.tx_vcfg, vcfg, sizeof(pf->vtag_config.tx_vcfg)); --} -- - static int - hns3_en_hw_strip_rxvtag(struct hns3_adapter *hns, bool enable) - { -@@ -632,7 +616,8 @@ hns3_en_hw_strip_rxvtag(struct hns3_adapter *hns, bool enable) - return ret; - } - -- hns3_update_rx_offload_cfg(hns, &rxvlan_cfg); -+ memcpy(&hns->pf.vtag_config.rx_vcfg, &rxvlan_cfg, -+ sizeof(struct hns3_rx_vtag_cfg)); - - return ret; - } -@@ -830,7 +815,9 @@ hns3_vlan_txvlan_cfg(struct hns3_adapter *hns, uint16_t port_base_vlan_state, - return ret; - } - -- hns3_update_tx_offload_cfg(hns, &txvlan_cfg); -+ memcpy(&hns->pf.vtag_config.tx_vcfg, &txvlan_cfg, -+ sizeof(struct hns3_tx_vtag_cfg)); -+ - return ret; - } - -@@ -956,7 +943,9 @@ hns3_en_pvid_strip(struct hns3_adapter *hns, int on) - if (ret) - return ret; - -- hns3_update_rx_offload_cfg(hns, &rx_vlan_cfg); -+ memcpy(&hns->pf.vtag_config.rx_vcfg, &rx_vlan_cfg, -+ sizeof(struct hns3_rx_vtag_cfg)); -+ - return ret; - } - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index a9e129288b..1af2e07e81 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1026,15 +1026,6 @@ hns3vf_get_configuration(struct hns3_hw *hw) - return hns3vf_get_port_base_vlan_filter_state(hw); - } - --static int --hns3vf_set_tc_queue_mapping(struct hns3_adapter *hns, uint16_t nb_rx_q, -- uint16_t nb_tx_q) --{ -- struct hns3_hw *hw = &hns->hw; -- -- return hns3_queue_to_tc_mapping(hw, nb_rx_q, nb_tx_q); --} -- - static void - hns3vf_request_link_info(struct hns3_hw *hw) - { -@@ -1530,7 +1521,7 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev) - goto err_set_tc_queue; - } - -- ret = hns3vf_set_tc_queue_mapping(hns, hw->tqps_num, hw->tqps_num); -+ ret = hns3_queue_to_tc_mapping(hw, hw->tqps_num, hw->tqps_num); - if (ret) { - PMD_INIT_LOG(ERR, "failed to set tc info, ret = %d.", ret); - goto err_set_tc_queue; -@@ -1739,7 +1730,7 @@ hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - uint16_t nb_tx_q = hw->data->nb_tx_queues; - int ret; - -- ret = hns3vf_set_tc_queue_mapping(hns, nb_rx_q, nb_tx_q); -+ ret = hns3_queue_to_tc_mapping(hw, nb_rx_q, nb_tx_q); - if (ret) - return ret; - --- -2.33.0 - diff --git a/0033-net-hns3-remove-non-re-entrant-strerror-call.patch b/0033-net-hns3-remove-non-re-entrant-strerror-call.patch deleted file mode 100644 index 2d45217..0000000 --- a/0033-net-hns3-remove-non-re-entrant-strerror-call.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 2a1e7c4782ee21823eb37acbb073bcf9f73b173f Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 22 Jan 2022 09:51:39 +0800 -Subject: [PATCH] net/hns3: remove non re-entrant strerror call - -This patch delete strerror invoke which was non re-entrant. - -Signed-off-by: Chengwen Feng -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_fdir.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index d043f5786d..2a7978ac07 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -919,8 +919,7 @@ static int hns3_insert_fdir_filter(struct hns3_hw *hw, - sig = rte_hash_crc(key, sizeof(*key), 0); - ret = rte_hash_add_key_with_hash(fdir_info->hash_handle, key, sig); - if (ret < 0) { -- hns3_err(hw, "Hash table full? err:%d(%s)!", ret, -- strerror(-ret)); -+ hns3_err(hw, "Hash table full? err:%d!", ret); - return ret; - } - --- -2.33.0 - diff --git a/0034-net-hns3-rename-function.patch b/0034-net-hns3-rename-function.patch deleted file mode 100644 index 6f2e90e..0000000 --- a/0034-net-hns3-rename-function.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 092ffe854dafe98f3e8e4c412211b80f6932315e Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 22 Jan 2022 09:51:40 +0800 -Subject: [PATCH] net/hns3: rename function - -This patch rename hns3_parse_rss_key with hns3_adjust_rss_key to -improve readability. - -Signed-off-by: Chengwen Feng -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 00084872ad..72986abaff 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1405,7 +1405,7 @@ hns3_disable_rss(struct hns3_hw *hw) - } - - static void --hns3_parse_rss_key(struct hns3_hw *hw, struct rte_flow_action_rss *rss_conf) -+hns3_adjust_rss_key(struct hns3_hw *hw, struct rte_flow_action_rss *rss_conf) - { - if (rss_conf->key == NULL || rss_conf->key_len < HNS3_RSS_KEY_SIZE) { - hns3_warn(hw, "Default RSS hash key to be set"); -@@ -1449,7 +1449,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - struct hns3_rss_tuple_cfg *tuple; - int ret; - -- hns3_parse_rss_key(hw, rss_config); -+ hns3_adjust_rss_key(hw, rss_config); - - ret = hns3_parse_rss_algorithm(hw, &rss_config->func, - &hw->rss_info.hash_algo); --- -2.33.0 - diff --git a/0035-net-hns3-extract-functions-to-create-RSS-and-FDIR-fl.patch b/0035-net-hns3-extract-functions-to-create-RSS-and-FDIR-fl.patch deleted file mode 100644 index 6c65621..0000000 --- a/0035-net-hns3-extract-functions-to-create-RSS-and-FDIR-fl.patch +++ /dev/null @@ -1,225 +0,0 @@ -From c48499171f5df62a71697dce517b9fa22bc30985 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 22 Jan 2022 09:51:41 +0800 -Subject: [PATCH] net/hns3: extract functions to create RSS and FDIR flow rule - -Extract two functions to create the RSS and FDIR flow rule for clearer -code logic. - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 173 +++++++++++++++++++++-------------- - 1 file changed, 106 insertions(+), 67 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 72986abaff..4f271a32dd 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1706,6 +1706,105 @@ hns3_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - return hns3_parse_fdir_filter(dev, pattern, actions, &fdir_rule, error); - } - -+static int -+hns3_flow_create_rss_rule(struct rte_eth_dev *dev, -+ const struct rte_flow_action *act, -+ struct rte_flow *flow) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_rss_conf_ele *rss_filter_ptr; -+ const struct hns3_rss_conf *rss_conf; -+ int ret; -+ -+ rss_filter_ptr = rte_zmalloc("hns3 rss filter", -+ sizeof(struct hns3_rss_conf_ele), 0); -+ if (rss_filter_ptr == NULL) { -+ hns3_err(hw, "failed to allocate hns3_rss_filter memory"); -+ return -ENOMEM; -+ } -+ -+ /* -+ * After all the preceding tasks are successfully configured, configure -+ * rules to the hardware to simplify the rollback of rules in the -+ * hardware. -+ */ -+ rss_conf = (const struct hns3_rss_conf *)act->conf; -+ ret = hns3_flow_parse_rss(dev, rss_conf, true); -+ if (ret != 0) { -+ rte_free(rss_filter_ptr); -+ return ret; -+ } -+ -+ hns3_rss_conf_copy(&rss_filter_ptr->filter_info, &rss_conf->conf); -+ rss_filter_ptr->filter_info.valid = true; -+ TAILQ_INSERT_TAIL(&hw->flow_rss_list, rss_filter_ptr, entries); -+ flow->rule = rss_filter_ptr; -+ flow->filter_type = RTE_ETH_FILTER_HASH; -+ -+ return 0; -+} -+ -+static int -+hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, -+ const struct rte_flow_item pattern[], -+ const struct rte_flow_action actions[], -+ struct rte_flow_error *error, -+ struct rte_flow *flow) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ struct hns3_fdir_rule_ele *fdir_rule_ptr; -+ struct hns3_fdir_rule fdir_rule; -+ int ret; -+ -+ memset(&fdir_rule, 0, sizeof(struct hns3_fdir_rule)); -+ ret = hns3_parse_fdir_filter(dev, pattern, actions, &fdir_rule, error); -+ if (ret != 0) -+ return ret; -+ -+ if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) { -+ ret = hns3_counter_new(dev, 0, -+ fdir_rule.act_cnt.id, error); -+ if (ret != 0) -+ return ret; -+ -+ flow->counter_id = fdir_rule.act_cnt.id; -+ } -+ -+ fdir_rule_ptr = rte_zmalloc("hns3 fdir rule", -+ sizeof(struct hns3_fdir_rule_ele), 0); -+ if (fdir_rule_ptr == NULL) { -+ hns3_err(hw, "failed to allocate fdir_rule memory."); -+ ret = -ENOMEM; -+ goto err_malloc; -+ } -+ -+ /* -+ * After all the preceding tasks are successfully configured, configure -+ * rules to the hardware to simplify the rollback of rules in the -+ * hardware. -+ */ -+ ret = hns3_fdir_filter_program(hns, &fdir_rule, false); -+ if (ret != 0) -+ goto err_fdir_filter; -+ -+ memcpy(&fdir_rule_ptr->fdir_conf, &fdir_rule, -+ sizeof(struct hns3_fdir_rule)); -+ TAILQ_INSERT_TAIL(&hw->flow_fdir_list, fdir_rule_ptr, entries); -+ flow->rule = fdir_rule_ptr; -+ flow->filter_type = RTE_ETH_FILTER_FDIR; -+ -+ return 0; -+ -+err_fdir_filter: -+ rte_free(fdir_rule_ptr); -+err_malloc: -+ if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) -+ hns3_counter_release(dev, fdir_rule.act_cnt.id); -+ -+ return ret; -+} -+ - /* - * Create or destroy a flow rule. - * Theorically one rule can match more than one filters. -@@ -1720,13 +1819,9 @@ hns3_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- const struct hns3_rss_conf *rss_conf; -- struct hns3_fdir_rule_ele *fdir_rule_ptr; -- struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_flow_mem *flow_node; - const struct rte_flow_action *act; - struct rte_flow *flow; -- struct hns3_fdir_rule fdir_rule; - int ret; - - ret = hns3_flow_validate(dev, attr, pattern, actions, error); -@@ -1752,76 +1847,20 @@ hns3_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - TAILQ_INSERT_TAIL(&hw->flow_list, flow_node, entries); - - act = hns3_find_rss_general_action(pattern, actions); -- if (act) { -- rss_conf = act->conf; -- -- ret = hns3_flow_parse_rss(dev, rss_conf, true); -- if (ret) -- goto err; -- -- rss_filter_ptr = rte_zmalloc("hns3 rss filter", -- sizeof(struct hns3_rss_conf_ele), -- 0); -- if (rss_filter_ptr == NULL) { -- hns3_err(hw, -- "Failed to allocate hns3_rss_filter memory"); -- ret = -ENOMEM; -- goto err; -- } -- hns3_rss_conf_copy(&rss_filter_ptr->filter_info, -- &rss_conf->conf); -- rss_filter_ptr->filter_info.valid = true; -- TAILQ_INSERT_TAIL(&hw->flow_rss_list, rss_filter_ptr, entries); -- -- flow->rule = rss_filter_ptr; -- flow->filter_type = RTE_ETH_FILTER_HASH; -- return flow; -- } -- -- memset(&fdir_rule, 0, sizeof(struct hns3_fdir_rule)); -- ret = hns3_parse_fdir_filter(dev, pattern, actions, &fdir_rule, error); -- if (ret) -- goto out; -- -- if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) { -- ret = hns3_counter_new(dev, 0, fdir_rule.act_cnt.id, error); -- if (ret) -- goto out; -- -- flow->counter_id = fdir_rule.act_cnt.id; -- } -- -- fdir_rule_ptr = rte_zmalloc("hns3 fdir rule", -- sizeof(struct hns3_fdir_rule_ele), -- 0); -- if (fdir_rule_ptr == NULL) { -- hns3_err(hw, "failed to allocate fdir_rule memory."); -- ret = -ENOMEM; -- goto err_fdir; -- } -- -- ret = hns3_fdir_filter_program(hns, &fdir_rule, false); -- if (!ret) { -- memcpy(&fdir_rule_ptr->fdir_conf, &fdir_rule, -- sizeof(struct hns3_fdir_rule)); -- TAILQ_INSERT_TAIL(&hw->flow_fdir_list, fdir_rule_ptr, entries); -- flow->rule = fdir_rule_ptr; -- flow->filter_type = RTE_ETH_FILTER_FDIR; -- -+ if (act) -+ ret = hns3_flow_create_rss_rule(dev, act, flow); -+ else -+ ret = hns3_flow_create_fdir_rule(dev, pattern, actions, -+ error, flow); -+ if (ret == 0) - return flow; -- } - -- rte_free(fdir_rule_ptr); --err_fdir: -- if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) -- hns3_counter_release(dev, fdir_rule.act_cnt.id); --err: - rte_flow_error_set(error, -ret, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Failed to create flow"); --out: - TAILQ_REMOVE(&hw->flow_list, flow_node, entries); - rte_free(flow_node); - rte_free(flow); -+ - return NULL; - } - --- -2.33.0 - diff --git a/0036-net-hns3-support-indirect-counter-flow-action.patch b/0036-net-hns3-support-indirect-counter-flow-action.patch deleted file mode 100644 index 7251d4d..0000000 --- a/0036-net-hns3-support-indirect-counter-flow-action.patch +++ /dev/null @@ -1,367 +0,0 @@ -From fdfcb94d8fb32364a999108baf1e4b835cd807fc Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 22 Jan 2022 09:51:42 +0800 -Subject: [PATCH] net/hns3: support indirect counter flow action - -This patch support indirect counter action because the shared counter -attribute has been deprecated in DPDK 21.11. - -Signed-off-by: Chengwen Feng -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_fdir.h | 1 + - drivers/net/hns3/hns3_flow.c | 222 +++++++++++++++++++++++++++++++++-- - drivers/net/hns3/hns3_flow.h | 11 +- - 3 files changed, 224 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index 07b393393d..8d588ffef3 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -125,6 +125,7 @@ struct hns3_fd_ad_data { - #define HNS3_RULE_FLAG_FDID 0x1 - #define HNS3_RULE_FLAG_VF_ID 0x2 - #define HNS3_RULE_FLAG_COUNTER 0x4 -+#define HNS3_RULE_FLAG_COUNTER_INDIR 0x8 - - struct hns3_fdir_key_conf { - struct hns3_fd_rule_tuples spec; -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 4f271a32dd..56ef6f57b2 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -154,7 +154,7 @@ hns3_counter_lookup(struct rte_eth_dev *dev, uint32_t id) - } - - static int --hns3_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id, -+hns3_counter_new(struct rte_eth_dev *dev, uint32_t indirect, uint32_t id, - struct rte_flow_error *error) - { - struct hns3_adapter *hns = dev->data->dev_private; -@@ -166,11 +166,14 @@ hns3_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id, - - cnt = hns3_counter_lookup(dev, id); - if (cnt) { -- if (!cnt->shared || cnt->shared != shared) -+ if (!cnt->indirect || cnt->indirect != indirect) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, - cnt, -- "Counter id is used, shared flag not match"); -+ "Counter id is used, indirect flag not match"); -+ /* Clear the indirect counter on first use. */ -+ if (cnt->indirect && cnt->ref_cnt == 1) -+ (void)hns3_get_count(hw, id, &value); - cnt->ref_cnt++; - return 0; - } -@@ -188,7 +191,7 @@ hns3_counter_new(struct rte_eth_dev *dev, uint32_t shared, uint32_t id, - RTE_FLOW_ERROR_TYPE_HANDLE, cnt, - "Alloc mem for counter failed"); - cnt->id = id; -- cnt->shared = shared; -+ cnt->indirect = indirect; - cnt->ref_cnt = 1; - cnt->hits = 0; - LIST_INSERT_HEAD(&pf->flow_counters, cnt, next); -@@ -253,16 +256,30 @@ hns3_counter_release(struct rte_eth_dev *dev, uint32_t id) - static void - hns3_counter_flush(struct rte_eth_dev *dev) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_pf *pf = &hns->pf; -+ struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(dev->data->dev_private); -+ LIST_HEAD(counters, hns3_flow_counter) indir_counters; - struct hns3_flow_counter *cnt_ptr; - -+ LIST_INIT(&indir_counters); - cnt_ptr = LIST_FIRST(&pf->flow_counters); - while (cnt_ptr) { - LIST_REMOVE(cnt_ptr, next); -- rte_free(cnt_ptr); -+ if (cnt_ptr->indirect) -+ LIST_INSERT_HEAD(&indir_counters, cnt_ptr, next); -+ else -+ rte_free(cnt_ptr); - cnt_ptr = LIST_FIRST(&pf->flow_counters); - } -+ -+ /* Reset the indirect action and add to pf->flow_counters list. */ -+ cnt_ptr = LIST_FIRST(&indir_counters); -+ while (cnt_ptr) { -+ LIST_REMOVE(cnt_ptr, next); -+ cnt_ptr->ref_cnt = 1; -+ cnt_ptr->hits = 0; -+ LIST_INSERT_HEAD(&pf->flow_counters, cnt_ptr, next); -+ cnt_ptr = LIST_FIRST(&indir_counters); -+ } - } - - static int -@@ -332,6 +349,30 @@ hns3_handle_action_queue_region(struct rte_eth_dev *dev, - return 0; - } - -+static int -+hns3_handle_action_indirect(struct rte_eth_dev *dev, -+ const struct rte_flow_action *action, -+ struct hns3_fdir_rule *rule, -+ struct rte_flow_error *error) -+{ -+ const struct rte_flow_action_handle *indir = action->conf; -+ -+ if (indir->indirect_type != HNS3_INDIRECT_ACTION_TYPE_COUNT) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ action, "Invalid indirect type"); -+ -+ if (hns3_counter_lookup(dev, indir->counter_id) == NULL) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ action, "Counter id not exist"); -+ -+ rule->act_cnt.id = indir->counter_id; -+ rule->flags |= (HNS3_RULE_FLAG_COUNTER | HNS3_RULE_FLAG_COUNTER_INDIR); -+ -+ return 0; -+} -+ - /* - * Parse actions structure from the provided pattern. - * The pattern is validated as the items are copied. -@@ -403,6 +444,13 @@ hns3_handle_actions(struct rte_eth_dev *dev, - "Invalid counter id"); - rule->act_cnt = *act_count; - rule->flags |= HNS3_RULE_FLAG_COUNTER; -+ rule->flags &= ~HNS3_RULE_FLAG_COUNTER_INDIR; -+ break; -+ case RTE_FLOW_ACTION_TYPE_INDIRECT: -+ ret = hns3_handle_action_indirect(dev, actions, rule, -+ error); -+ if (ret) -+ return ret; - break; - case RTE_FLOW_ACTION_TYPE_VOID: - break; -@@ -1755,6 +1803,7 @@ hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct hns3_fdir_rule_ele *fdir_rule_ptr; - struct hns3_fdir_rule fdir_rule; -+ bool indir; - int ret; - - memset(&fdir_rule, 0, sizeof(struct hns3_fdir_rule)); -@@ -1762,9 +1811,10 @@ hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, - if (ret != 0) - return ret; - -+ indir = !!(fdir_rule.flags & HNS3_RULE_FLAG_COUNTER_INDIR); - if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) { -- ret = hns3_counter_new(dev, 0, -- fdir_rule.act_cnt.id, error); -+ ret = hns3_counter_new(dev, indir, fdir_rule.act_cnt.id, -+ error); - if (ret != 0) - return ret; - -@@ -2086,6 +2136,157 @@ hns3_flow_query_wrap(struct rte_eth_dev *dev, struct rte_flow *flow, - return ret; - } - -+static int -+hns3_check_indir_action(const struct rte_flow_indir_action_conf *conf, -+ const struct rte_flow_action *action, -+ struct rte_flow_error *error) -+{ -+ if (!conf->ingress) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION, -+ NULL, "Indir action ingress can't be zero"); -+ -+ if (conf->egress) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION, -+ NULL, "Indir action not support egress"); -+ -+ if (conf->transfer) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION, -+ NULL, "Indir action not support transfer"); -+ -+ if (action->type != RTE_FLOW_ACTION_TYPE_COUNT) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION, -+ NULL, "Indir action only support count"); -+ -+ return 0; -+} -+ -+static struct rte_flow_action_handle * -+hns3_flow_action_create(struct rte_eth_dev *dev, -+ const struct rte_flow_indir_action_conf *conf, -+ const struct rte_flow_action *action, -+ struct rte_flow_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(dev->data->dev_private); -+ const struct rte_flow_action_count *act_count; -+ struct rte_flow_action_handle *handle = NULL; -+ struct hns3_flow_counter *counter; -+ -+ if (hns3_check_indir_action(conf, action, error)) -+ return NULL; -+ -+ handle = rte_zmalloc("hns3 action handle", -+ sizeof(struct rte_flow_action_handle), 0); -+ if (handle == NULL) { -+ rte_flow_error_set(error, ENOMEM, RTE_FLOW_ERROR_TYPE_HANDLE, -+ NULL, "Failed to allocate action memory"); -+ return NULL; -+ } -+ -+ pthread_mutex_lock(&hw->flows_lock); -+ -+ act_count = (const struct rte_flow_action_count *)action->conf; -+ if (act_count->id >= pf->fdir.fd_cfg.cnt_num[HNS3_FD_STAGE_1]) { -+ rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ action, "Invalid counter id"); -+ goto err_exit; -+ } -+ -+ if (hns3_counter_new(dev, false, act_count->id, error)) -+ goto err_exit; -+ -+ counter = hns3_counter_lookup(dev, act_count->id); -+ if (counter == NULL) { -+ rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ action, "Counter id not found"); -+ goto err_exit; -+ } -+ -+ counter->indirect = true; -+ handle->indirect_type = HNS3_INDIRECT_ACTION_TYPE_COUNT; -+ handle->counter_id = counter->id; -+ -+ pthread_mutex_unlock(&hw->flows_lock); -+ return handle; -+ -+err_exit: -+ pthread_mutex_unlock(&hw->flows_lock); -+ rte_free(handle); -+ return NULL; -+} -+ -+static int -+hns3_flow_action_destroy(struct rte_eth_dev *dev, -+ struct rte_flow_action_handle *handle, -+ struct rte_flow_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_flow_counter *counter; -+ -+ pthread_mutex_lock(&hw->flows_lock); -+ -+ if (handle->indirect_type != HNS3_INDIRECT_ACTION_TYPE_COUNT) { -+ pthread_mutex_unlock(&hw->flows_lock); -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ handle, "Invalid indirect type"); -+ } -+ -+ counter = hns3_counter_lookup(dev, handle->counter_id); -+ if (counter == NULL) { -+ pthread_mutex_unlock(&hw->flows_lock); -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ handle, "Counter id not exist"); -+ } -+ -+ if (counter->ref_cnt > 1) { -+ pthread_mutex_unlock(&hw->flows_lock); -+ return rte_flow_error_set(error, EBUSY, -+ RTE_FLOW_ERROR_TYPE_HANDLE, -+ handle, "Counter id in use"); -+ } -+ -+ (void)hns3_counter_release(dev, handle->counter_id); -+ rte_free(handle); -+ -+ pthread_mutex_unlock(&hw->flows_lock); -+ return 0; -+} -+ -+static int -+hns3_flow_action_query(struct rte_eth_dev *dev, -+ const struct rte_flow_action_handle *handle, -+ void *data, -+ struct rte_flow_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct rte_flow flow; -+ int ret; -+ -+ pthread_mutex_lock(&hw->flows_lock); -+ -+ if (handle->indirect_type != HNS3_INDIRECT_ACTION_TYPE_COUNT) { -+ pthread_mutex_unlock(&hw->flows_lock); -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ handle, "Invalid indirect type"); -+ } -+ -+ memset(&flow, 0, sizeof(flow)); -+ flow.counter_id = handle->counter_id; -+ ret = hns3_counter_query(dev, &flow, -+ (struct rte_flow_query_count *)data, error); -+ pthread_mutex_unlock(&hw->flows_lock); -+ return ret; -+} -+ - static const struct rte_flow_ops hns3_flow_ops = { - .validate = hns3_flow_validate_wrap, - .create = hns3_flow_create_wrap, -@@ -2093,6 +2294,9 @@ static const struct rte_flow_ops hns3_flow_ops = { - .flush = hns3_flow_flush_wrap, - .query = hns3_flow_query_wrap, - .isolate = NULL, -+ .action_handle_create = hns3_flow_action_create, -+ .action_handle_destroy = hns3_flow_action_destroy, -+ .action_handle_query = hns3_flow_action_query, - }; - - int -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index 2eb451b720..1ab3f9f5c6 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -9,7 +9,7 @@ - - struct hns3_flow_counter { - LIST_ENTRY(hns3_flow_counter) next; /* Pointer to the next counter. */ -- uint32_t shared:1; /* Share counter ID with other flow rules. */ -+ uint32_t indirect:1; /* Indirect counter flag */ - uint32_t ref_cnt:31; /* Reference counter. */ - uint16_t id; /* Counter ID. */ - uint64_t hits; /* Number of packets matched by the rule. */ -@@ -33,6 +33,15 @@ struct hns3_flow_mem { - struct rte_flow *flow; - }; - -+enum { -+ HNS3_INDIRECT_ACTION_TYPE_COUNT = 1, -+}; -+ -+struct rte_flow_action_handle { -+ int indirect_type; -+ uint32_t counter_id; -+}; -+ - TAILQ_HEAD(hns3_rss_filter_list, hns3_rss_conf_ele); - TAILQ_HEAD(hns3_flow_mem_list, hns3_flow_mem); - --- -2.33.0 - diff --git a/0037-net-hns3-fix-max-packet-size-rollback-in-PF.patch b/0037-net-hns3-fix-max-packet-size-rollback-in-PF.patch deleted file mode 100644 index c825a46..0000000 --- a/0037-net-hns3-fix-max-packet-size-rollback-in-PF.patch +++ /dev/null @@ -1,63 +0,0 @@ -From dc55ce9c6253664160b881a1b83b2b4f1e90a587 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 28 Jan 2022 10:07:03 +0800 -Subject: [PATCH] net/hns3: fix max packet size rollback in PF - -HNS3 PF driver use the hns->pf.mps to restore the MTU when a reset -occurs. -If user fails to configure the MTU, the MPS of PF may not be restored to -the original value. - -Fixes: 25fb790f7868 ("net/hns3: fix HW buffer size on MTU update") -Fixes: 1f5ca0b460cd ("net/hns3: support some device operations") -Fixes: d51867db65c1 ("net/hns3: add initialization") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 11 ++++------- - 1 file changed, 4 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index a5114662d2..73bf209717 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2075,7 +2075,6 @@ static int - hns3_config_mtu(struct hns3_hw *hw, uint16_t mps) - { - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -- uint16_t original_mps = hns->pf.mps; - int err; - int ret; - -@@ -2085,22 +2084,20 @@ hns3_config_mtu(struct hns3_hw *hw, uint16_t mps) - return ret; - } - -- hns->pf.mps = mps; - ret = hns3_buffer_alloc(hw); - if (ret) { - hns3_err(hw, "failed to allocate buffer, ret = %d", ret); - goto rollback; - } - -+ hns->pf.mps = mps; -+ - return 0; - - rollback: -- err = hns3_set_mac_mtu(hw, original_mps); -- if (err) { -+ err = hns3_set_mac_mtu(hw, hns->pf.mps); -+ if (err) - hns3_err(hw, "fail to rollback MTU, err = %d", err); -- return ret; -- } -- hns->pf.mps = original_mps; - - return ret; - } --- -2.33.0 - diff --git a/0038-net-hns3-fix-RSS-key-with-null.patch b/0038-net-hns3-fix-RSS-key-with-null.patch deleted file mode 100644 index e96ce28..0000000 --- a/0038-net-hns3-fix-RSS-key-with-null.patch +++ /dev/null @@ -1,57 +0,0 @@ -From ca937bfe5f48de028c25312bcdb30ec1a6a4cd8e Mon Sep 17 00:00:00 2001 -From: Lijun Ou -Date: Fri, 28 Jan 2022 10:07:04 +0800 -Subject: [PATCH] net/hns3: fix RSS key with null - -Since the patch '1848b117' has initialized the variable 'key' in -'struct rte_flow_action_rss' with 'NULL', the PMD will use the -default RSS key when create the first RSS rule with NULL RSS key. -Then, if create a repeated RSS rule with the above, it will not -identify duplicate rules and return an error message. - -To solve the preceding problem, determine whether the current RSS keys -are the same based on whether the length of key_len of rss is 0. - -Fixes: 1848b117cca1 ("app/testpmd: fix RSS key for flow API RSS rule") -Cc: stable@dpdk.org - -Signed-off-by: Lijun Ou ---- - drivers/net/hns3/hns3_flow.c | 12 +++++++++--- - 1 file changed, 9 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 56ef6f57b2..aba07aaa6f 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1286,6 +1286,7 @@ static bool - hns3_action_rss_same(const struct rte_flow_action_rss *comp, - const struct rte_flow_action_rss *with) - { -+ bool rss_key_is_same; - bool func_is_same; - - /* -@@ -1302,11 +1303,16 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - func_is_same = (with->func != RTE_ETH_HASH_FUNCTION_DEFAULT) ? - (comp->func == with->func) : true; - -- return (func_is_same && -+ if (with->key_len == 0 || with->key == NULL) -+ rss_key_is_same = 1; -+ else -+ rss_key_is_same = comp->key_len == with->key_len && -+ !memcmp(comp->key, with->key, with->key_len); -+ -+ return (func_is_same && rss_key_is_same && - comp->types == (with->types & HNS3_ETH_RSS_SUPPORT) && -- comp->level == with->level && comp->key_len == with->key_len && -+ comp->level == with->level && - comp->queue_num == with->queue_num && -- !memcmp(comp->key, with->key, with->key_len) && - !memcmp(comp->queue, with->queue, - sizeof(*with->queue) * with->queue_num)); - } --- -2.33.0 - diff --git a/0039-net-hns3-fix-insecure-way-to-query-MAC-statistics.patch b/0039-net-hns3-fix-insecure-way-to-query-MAC-statistics.patch deleted file mode 100644 index da6c6f5..0000000 --- a/0039-net-hns3-fix-insecure-way-to-query-MAC-statistics.patch +++ /dev/null @@ -1,271 +0,0 @@ -From a29f3b66f858a7e2fabcb6b557aea7bde17d41fb Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 28 Jan 2022 10:07:05 +0800 -Subject: [PATCH] net/hns3: fix insecure way to query MAC statistics - -The query way of MAC statistics in HNS3 PF driver is as following: -1) get MAC statistics register number and calculate descriptor number. -2) use above descriptor number to send command to firmware to query all - MAC statistics and copy to hns3_mac_stats struct in driver. - -The preceding way does not verify the validity of the number of obtained -register, which may cause memory out-of-bounds. - -Fixes: 8839c5e202f3 ("net/hns3: support device stats") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 4 ++ - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_stats.c | 116 ++++++++++++++++----------------- - drivers/net/hns3/hns3_stats.h | 11 ++-- - 4 files changed, 65 insertions(+), 67 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 73bf209717..57f1572340 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2733,6 +2733,10 @@ hns3_get_capability(struct hns3_hw *hw) - if (ret) - return ret; - -+ ret = hns3_query_mac_stats_reg_num(hw); -+ if (ret) -+ return ret; -+ - if (hw->revision < PCI_REVISION_ID_HIP09_A) { - hns3_set_default_dev_specifications(hw); - hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE; -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index cf6380ebb2..ef028a7b2c 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -500,6 +500,7 @@ struct hns3_hw { - struct hns3_tqp_stats tqp_stats; - /* Include Mac stats | Rx stats | Tx stats */ - struct hns3_mac_stats mac_stats; -+ uint32_t mac_stats_reg_num; - struct hns3_rx_missed_stats imissed_stats; - uint64_t oerror_stats; - uint32_t fw_version; -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index 606b72509a..806720faff 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -307,24 +307,21 @@ static const struct hns3_xstats_name_offset hns3_imissed_stats_strings[] = { - - static void hns3_tqp_stats_clear(struct hns3_hw *hw); - --/* -- * Query all the MAC statistics data of Network ICL command ,opcode id: 0x0034. -- * This command is used before send 'query_mac_stat command', the descriptor -- * number of 'query_mac_stat command' must match with reg_num in this command. -- * @praram hw -- * Pointer to structure hns3_hw. -- * @return -- * 0 on success. -- */ - static int --hns3_update_mac_stats(struct hns3_hw *hw, const uint32_t desc_num) -+hns3_update_mac_stats(struct hns3_hw *hw) - { -+#define HNS3_MAC_STATS_REG_NUM_PER_DESC 4 -+ - uint64_t *data = (uint64_t *)(&hw->mac_stats); - struct hns3_cmd_desc *desc; -+ uint32_t stats_iterms; - uint64_t *desc_data; -- uint16_t i, k, n; -+ uint32_t desc_num; -+ uint16_t i; - int ret; - -+ /* The first desc has a 64-bit header, so need to consider it. */ -+ desc_num = hw->mac_stats_reg_num / HNS3_MAC_STATS_REG_NUM_PER_DESC + 1; - desc = rte_malloc("hns3_mac_desc", - desc_num * sizeof(struct hns3_cmd_desc), 0); - if (desc == NULL) { -@@ -340,65 +337,71 @@ hns3_update_mac_stats(struct hns3_hw *hw, const uint32_t desc_num) - return ret; - } - -- for (i = 0; i < desc_num; i++) { -- /* For special opcode 0034, only the first desc has the head */ -- if (i == 0) { -- desc_data = (uint64_t *)(&desc[i].data[0]); -- n = HNS3_RD_FIRST_STATS_NUM; -- } else { -- desc_data = (uint64_t *)(&desc[i]); -- n = HNS3_RD_OTHER_STATS_NUM; -- } -- -- for (k = 0; k < n; k++) { -- *data += rte_le_to_cpu_64(*desc_data); -- data++; -- desc_data++; -- } -+ stats_iterms = RTE_MIN(sizeof(hw->mac_stats) / sizeof(uint64_t), -+ hw->mac_stats_reg_num); -+ desc_data = (uint64_t *)(&desc[0].data[0]); -+ for (i = 0; i < stats_iterms; i++) { -+ /* -+ * Data memory is continuous and only the first descriptor has a -+ * header in this command. -+ */ -+ *data += rte_le_to_cpu_64(*desc_data); -+ data++; -+ desc_data++; - } - rte_free(desc); - - return 0; - } - --/* -- * Query Mac stat reg num command ,opcode id: 0x0033. -- * This command is used before send 'query_mac_stat command', the descriptor -- * number of 'query_mac_stat command' must match with reg_num in this command. -- * @praram rte_stats -- * Pointer to structure rte_eth_stats. -- * @return -- * 0 on success. -- */ - static int --hns3_mac_query_reg_num(struct rte_eth_dev *dev, uint32_t *desc_num) -+hns3_mac_query_reg_num(struct hns3_hw *hw, uint32_t *reg_num) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -+#define HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B 3 - struct hns3_cmd_desc desc; -- uint32_t *desc_data; -- uint32_t reg_num; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_MAC_REG_NUM, true); - ret = hns3_cmd_send(hw, &desc, 1); -- if (ret) -+ if (ret) { -+ hns3_err(hw, "failed to query MAC statistic reg number, ret = %d", -+ ret); - return ret; -+ } - -- /* -- * The num of MAC statistics registers that are provided by IMP in this -- * version. -- */ -- desc_data = (uint32_t *)(&desc.data[0]); -- reg_num = rte_le_to_cpu_32(*desc_data); -+ /* The number of MAC statistics registers are provided by firmware. */ -+ *reg_num = rte_le_to_cpu_32(desc.data[0]); -+ if (*reg_num == 0) { -+ hns3_err(hw, "MAC statistic reg number is invalid!"); -+ return -ENODATA; -+ } - - /* -- * The descriptor number of 'query_additional_mac_stat command' is -- * '1 + (reg_num-3)/4 + ((reg_num-3)%4 !=0)'; -- * This value is 83 in this version -+ * If driver doesn't request the firmware to report more MAC statistics -+ * iterms and the total number of MAC statistics registers by using new -+ * method, firmware will only reports the number of valid statistics -+ * registers. However, structure hns3_mac_stats in driver contains valid -+ * and reserved statistics iterms. In this case, the total register -+ * number must be added to three reserved statistics registers. - */ -- *desc_num = 1 + ((reg_num - 3) >> 2) + -- (uint32_t)(((reg_num - 3) & 0x3) ? 1 : 0); -+ *reg_num += HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B; -+ -+ return 0; -+} -+ -+int -+hns3_query_mac_stats_reg_num(struct hns3_hw *hw) -+{ -+ uint32_t mac_stats_reg_num = 0; -+ int ret; -+ -+ ret = hns3_mac_query_reg_num(hw, &mac_stats_reg_num); -+ if (ret) -+ return ret; -+ -+ hw->mac_stats_reg_num = mac_stats_reg_num; -+ if (hw->mac_stats_reg_num > sizeof(hw->mac_stats) / sizeof(uint64_t)) -+ hns3_warn(hw, "MAC stats reg number from firmware is greater than stats iterms in driver."); - - return 0; - } -@@ -408,15 +411,8 @@ hns3_query_update_mac_stats(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- uint32_t desc_num; -- int ret; - -- ret = hns3_mac_query_reg_num(dev, &desc_num); -- if (ret == 0) -- ret = hns3_update_mac_stats(hw, desc_num); -- else -- hns3_err(hw, "Query mac reg num fail : %d", ret); -- return ret; -+ return hns3_update_mac_stats(hw); - } - - static int -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index d1230f94cb..c81d351082 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -5,11 +5,6 @@ - #ifndef _HNS3_STATS_H_ - #define _HNS3_STATS_H_ - --/* stats macro */ --#define HNS3_MAC_CMD_NUM 21 --#define HNS3_RD_FIRST_STATS_NUM 2 --#define HNS3_RD_OTHER_STATS_NUM 4 -- - /* TQP stats */ - struct hns3_tqp_stats { - uint64_t rcb_tx_ring_pktnum_rcd; /* Total num of transmitted packets */ -@@ -22,6 +17,7 @@ struct hns3_tqp_stats { - struct hns3_mac_stats { - uint64_t mac_tx_mac_pause_num; - uint64_t mac_rx_mac_pause_num; -+ uint64_t rsv0; - uint64_t mac_tx_pfc_pri0_pkt_num; - uint64_t mac_tx_pfc_pri1_pkt_num; - uint64_t mac_tx_pfc_pri2_pkt_num; -@@ -58,7 +54,7 @@ struct hns3_mac_stats { - uint64_t mac_tx_1519_2047_oct_pkt_num; - uint64_t mac_tx_2048_4095_oct_pkt_num; - uint64_t mac_tx_4096_8191_oct_pkt_num; -- uint64_t rsv0; -+ uint64_t rsv1; - uint64_t mac_tx_8192_9216_oct_pkt_num; - uint64_t mac_tx_9217_12287_oct_pkt_num; - uint64_t mac_tx_12288_16383_oct_pkt_num; -@@ -85,7 +81,7 @@ struct hns3_mac_stats { - uint64_t mac_rx_1519_2047_oct_pkt_num; - uint64_t mac_rx_2048_4095_oct_pkt_num; - uint64_t mac_rx_4096_8191_oct_pkt_num; -- uint64_t rsv1; -+ uint64_t rsv2; - uint64_t mac_rx_8192_9216_oct_pkt_num; - uint64_t mac_rx_9217_12287_oct_pkt_num; - uint64_t mac_rx_12288_16383_oct_pkt_num; -@@ -168,5 +164,6 @@ int hns3_stats_reset(struct rte_eth_dev *dev); - int hns3_tqp_stats_init(struct hns3_hw *hw); - void hns3_tqp_stats_uninit(struct hns3_hw *hw); - int hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear); -+int hns3_query_mac_stats_reg_num(struct hns3_hw *hw); - - #endif /* _HNS3_STATS_H_ */ --- -2.33.0 - diff --git a/0040-net-hns3-fix-double-decrement-of-secondary-count.patch b/0040-net-hns3-fix-double-decrement-of-secondary-count.patch deleted file mode 100644 index e612190..0000000 --- a/0040-net-hns3-fix-double-decrement-of-secondary-count.patch +++ /dev/null @@ -1,33 +0,0 @@ -From eb0bbc8fbec6bb10dfcfdca470dc413038e8608c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 28 Jan 2022 10:07:06 +0800 -Subject: [PATCH] net/hns3: fix double decrement of secondary count - -The "secondary_cnt" indicates the number of secondary processes on an -Ethernet device. But the variable is double subtracted when detach the -device in secondary processes. - -Fixes: ff6dc76e40b8 ("net/hns3: refactor multi-process initialization") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_vf.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 1af2e07e81..dab1130dad 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -2399,7 +2399,6 @@ hns3vf_dev_uninit(struct rte_eth_dev *eth_dev) - PMD_INIT_FUNC_TRACE(); - - if (rte_eal_process_type() != RTE_PROC_PRIMARY) { -- __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); - hns3_mp_uninit(eth_dev); - return 0; - } --- -2.33.0 - diff --git a/0041-net-hns3-fix-operating-queue-when-TCAM-table-is-inva.patch b/0041-net-hns3-fix-operating-queue-when-TCAM-table-is-inva.patch deleted file mode 100644 index 95b77f7..0000000 --- a/0041-net-hns3-fix-operating-queue-when-TCAM-table-is-inva.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 1c73c33c5ff07ac2a369f0d796e5892ed504e0d3 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 28 Jan 2022 10:07:07 +0800 -Subject: [PATCH] net/hns3: fix operating queue when TCAM table is invalid - -Reset queues will query the TCAM table. The table is cleared after global -or imp reset. Currently, PF driver first resets Rx/Tx queues and then -restore the table during the reset recovery process, which will fail to -query the table and trigger a RAS error. - -Fixes: fa29fe45a7b4 ("net/hns3: support queue start and stop") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 57f1572340..2641b6f79b 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4378,6 +4378,10 @@ hns3_init_hardware(struct hns3_adapter *hns) - struct hns3_hw *hw = &hns->hw; - int ret; - -+ /* -+ * All queue-related HW operations must be performed after the TCAM -+ * table is configured. -+ */ - ret = hns3_map_tqp(hw); - if (ret) { - PMD_INIT_LOG(ERR, "Failed to map tqp: %d", ret); -@@ -5547,15 +5551,15 @@ hns3_reinit_dev(struct hns3_adapter *hns) - return ret; - } - -- ret = hns3_reset_all_tqps(hns); -+ ret = hns3_init_hardware(hns); - if (ret) { -- hns3_err(hw, "Failed to reset all queues: %d", ret); -+ hns3_err(hw, "Failed to init hardware: %d", ret); - return ret; - } - -- ret = hns3_init_hardware(hns); -+ ret = hns3_reset_all_tqps(hns); - if (ret) { -- hns3_err(hw, "Failed to init hardware: %d", ret); -+ hns3_err(hw, "Failed to reset all queues: %d", ret); - return ret; - } - --- -2.33.0 - diff --git a/0042-net-hns3-delete-duplicated-RSS-type.patch b/0042-net-hns3-delete-duplicated-RSS-type.patch deleted file mode 100644 index 3adec93..0000000 --- a/0042-net-hns3-delete-duplicated-RSS-type.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 6c3c017f980084daef4ddafd111e9ed9aa9619c3 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 28 Jan 2022 10:07:08 +0800 -Subject: [PATCH] net/hns3: delete duplicated RSS type - -The hns3_set_rss_types hold two IPV4_TCP items, this patch deletes -duplicate item. - -Fixes: 806f1d5ab0e3 ("net/hns3: set RSS hash type input configuration") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rss.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 3a4b699ae2..1782d63883 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -152,10 +152,6 @@ static const struct { - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_TCP, BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP, BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) | --- -2.33.0 - diff --git a/0043-net-bonding-fix-promiscuous-and-allmulticast-state.patch b/0043-net-bonding-fix-promiscuous-and-allmulticast-state.patch deleted file mode 100644 index 94183f7..0000000 --- a/0043-net-bonding-fix-promiscuous-and-allmulticast-state.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 905b76987bd194e1356e6fe79949b5119c30f842 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 28 Jan 2022 10:25:32 +0800 -Subject: [PATCH] net/bonding: fix promiscuous and allmulticast state - -Currently, promiscuous or allmulticast state of bonding port will not be -passed to the new primary slave when active/standby switch-over. It -causes bugs in some scenario. - -For example, promiscuous state of bonding port is off now, primary slave -(called A) is off but secondary slave(called B) is on. -Then active/standby switch-over, promiscuous state of the bonding port -is off, but the new primary slave turns to be B and its promiscuous -state is still on. -It is not consistent with bonding port. And this patch will fix it. - -Fixes: 2efb58cbab6e ("bond: new link bonding library") -Fixes: 68218b87c184 ("net/bonding: prefer allmulti to promiscuous for LACP") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 70 ++++++++++++++++++++++++++ - 1 file changed, 70 insertions(+) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index e5abe90e07..d2fcfad676 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -2691,6 +2691,39 @@ bond_ethdev_promiscuous_disable(struct rte_eth_dev *dev) - return ret; - } - -+static int -+bond_ethdev_promiscuous_update(struct rte_eth_dev *dev) -+{ -+ struct bond_dev_private *internals = dev->data->dev_private; -+ uint16_t port_id = internals->current_primary_port; -+ -+ switch (internals->mode) { -+ case BONDING_MODE_ROUND_ROBIN: -+ case BONDING_MODE_BALANCE: -+ case BONDING_MODE_BROADCAST: -+ case BONDING_MODE_8023AD: -+ /* As promiscuous mode is propagated to all slaves for these -+ * mode, no need to update for bonding device. -+ */ -+ break; -+ case BONDING_MODE_ACTIVE_BACKUP: -+ case BONDING_MODE_TLB: -+ case BONDING_MODE_ALB: -+ default: -+ /* As promiscuous mode is propagated only to primary slave -+ * for these mode. When active/standby switchover, promiscuous -+ * mode should be set to new primary slave according to bonding -+ * device. -+ */ -+ if (rte_eth_promiscuous_get(internals->port_id) == 1) -+ rte_eth_promiscuous_enable(port_id); -+ else -+ rte_eth_promiscuous_disable(port_id); -+ } -+ -+ return 0; -+} -+ - static int - bond_ethdev_allmulticast_enable(struct rte_eth_dev *eth_dev) - { -@@ -2804,6 +2837,39 @@ bond_ethdev_allmulticast_disable(struct rte_eth_dev *eth_dev) - return ret; - } - -+static int -+bond_ethdev_allmulticast_update(struct rte_eth_dev *dev) -+{ -+ struct bond_dev_private *internals = dev->data->dev_private; -+ uint16_t port_id = internals->current_primary_port; -+ -+ switch (internals->mode) { -+ case BONDING_MODE_ROUND_ROBIN: -+ case BONDING_MODE_BALANCE: -+ case BONDING_MODE_BROADCAST: -+ case BONDING_MODE_8023AD: -+ /* As allmulticast mode is propagated to all slaves for these -+ * mode, no need to update for bonding device. -+ */ -+ break; -+ case BONDING_MODE_ACTIVE_BACKUP: -+ case BONDING_MODE_TLB: -+ case BONDING_MODE_ALB: -+ default: -+ /* As allmulticast mode is propagated only to primary slave -+ * for these mode. When active/standby switchover, allmulticast -+ * mode should be set to new primary slave according to bonding -+ * device. -+ */ -+ if (rte_eth_allmulticast_get(internals->port_id) == 1) -+ rte_eth_allmulticast_enable(port_id); -+ else -+ rte_eth_allmulticast_disable(port_id); -+ } -+ -+ return 0; -+} -+ - static void - bond_ethdev_delayed_lsc_propagation(void *arg) - { -@@ -2893,6 +2959,8 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type, - lsc_flag = 1; - - mac_address_slaves_update(bonded_eth_dev); -+ bond_ethdev_promiscuous_update(bonded_eth_dev); -+ bond_ethdev_allmulticast_update(bonded_eth_dev); - } - - activate_slave(bonded_eth_dev, port_id); -@@ -2922,6 +2990,8 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type, - else - internals->current_primary_port = internals->primary_port; - mac_address_slaves_update(bonded_eth_dev); -+ bond_ethdev_promiscuous_update(bonded_eth_dev); -+ bond_ethdev_allmulticast_update(bonded_eth_dev); - } - } - --- -2.33.0 - diff --git a/0044-net-bonding-fix-reference-count-on-mbufs.patch b/0044-net-bonding-fix-reference-count-on-mbufs.patch deleted file mode 100644 index 5085cc6..0000000 --- a/0044-net-bonding-fix-reference-count-on-mbufs.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 2c1857b46ec66643f127301b9466a3b93fa2d42b Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 28 Jan 2022 10:25:33 +0800 -Subject: [PATCH] net/bonding: fix reference count on mbufs - -In bonding Tx broadcast mode, Packets should be sent by every slave, -but only one mbuf exits. The solution is to increment reference count -on mbufs, but it ignores multi segments. - -This patch fixed it by adding reference for every segment in multi -segments Tx scenario. - -Fixes: 2efb58cbab6e ("bond: new link bonding library") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index d2fcfad676..bfa931098e 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1318,7 +1318,7 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs, - - /* Increment reference count on mbufs */ - for (i = 0; i < nb_pkts; i++) -- rte_mbuf_refcnt_update(bufs[i], num_of_slaves - 1); -+ rte_pktmbuf_refcnt_update(bufs[i], num_of_slaves - 1); - - /* Transmit burst on each active slave */ - for (i = 0; i < num_of_slaves; i++) { --- -2.33.0 - diff --git a/0045-app-testpmd-fix-bonding-mode-set.patch b/0045-app-testpmd-fix-bonding-mode-set.patch deleted file mode 100644 index 572f666..0000000 --- a/0045-app-testpmd-fix-bonding-mode-set.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 32d1817dbff6499dd1d126c466d0f7cb1c114713 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 28 Jan 2022 10:35:19 +0800 -Subject: [PATCH] app/testpmd: fix bonding mode set - -when start testpmd, and type command like this, it will lead to -Segmentation fault, like: - -testpmd> create bonded device 4 0 -testpmd> add bonding slave 0 2 -testpmd> add bonding slave 1 2 -testpmd> port start 2 -testpmd> set bonding mode 0 2 -testpmd> quit -Stopping port 0... -Stopping ports... -... -Bye... -Segmentation fault - -The reason to the bug is that rte timer do not be cancelled when quit. -That is, in 'bond_ethdev_start', resources are allocated according to -different bonding mode. In 'bond_ethdev_stop', resources are free by -the corresponding mode. - -For example, 'bond_ethdev_start' start bond_mode_8023ad_ext_periodic_cb -timer for bonding mode 4. and 'bond_ethdev_stop' cancel the timer only -when the current bonding mode is 4. If the bonding mode is changed, -and directly quit the process, the timer will still on, and freed memory -will be accessed, then segmentation fault. - -'bonding mode' changed means resources changed, reallocate resources for -different mode should be done, that is, device should be restarted. - -Fixes: 2950a769315e ("bond: testpmd support") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) -Tested-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index e626b1c7d9..16ad4be005 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -5915,6 +5915,19 @@ static void cmd_set_bonding_mode_parsed(void *parsed_result, - { - struct cmd_set_bonding_mode_result *res = parsed_result; - portid_t port_id = res->port_id; -+ struct rte_port *port = &ports[port_id]; -+ -+ /* -+ * Bonding mode changed means resources of device changed, like whether -+ * started rte timer or not. Device should be restarted when resources -+ * of device changed. -+ */ -+ if (port->port_status != RTE_PORT_STOPPED) { -+ fprintf(stderr, -+ "\t Error: Can't set bonding mode when port %d is not stopped\n", -+ port_id); -+ return; -+ } - - /* Set the bonding mode for the relevant port. */ - if (0 != rte_eth_bond_mode_set(port_id, res->value)) --- -2.33.0 - diff --git a/0046-ethdev-introduce-dump-API.patch b/0046-ethdev-introduce-dump-API.patch deleted file mode 100644 index 1fd481b..0000000 --- a/0046-ethdev-introduce-dump-API.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 42a26d7136b259ee7ff1b39325e19ef5ef9fe0e3 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 12:49:22 +0800 -Subject: [PATCH 01/13] ethdev: introduce dump API -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Added the ethdev dump API which provides querying private info from device. -There exists many private properties in different PMD drivers, such as -adapter state, Rx/Tx func algorithm in hns3 PMD. The information of these -properties is important for debug. As the information is private, the new -API is introduced. - -Signed-off-by: Min Hu (Connor) -Acked-by: Morten Brørup -Acked-by: Ray Kinsella -Acked-by: Ajit Khaparde -Acked-by: Ferruh Yigit ---- - lib/ethdev/ethdev_driver.h | 23 +++++++++++++++++++++++ - lib/ethdev/rte_ethdev.c | 17 +++++++++++++++++ - lib/ethdev/rte_ethdev.h | 21 +++++++++++++++++++++ - 3 files changed, 61 insertions(+) - -diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h -index d95605a355..e24ff7064c 100644 ---- a/lib/ethdev/ethdev_driver.h -+++ b/lib/ethdev/ethdev_driver.h -@@ -990,6 +990,26 @@ typedef int (*eth_representor_info_get_t)(struct rte_eth_dev *dev, - typedef int (*eth_rx_metadata_negotiate_t)(struct rte_eth_dev *dev, - uint64_t *features); - -+/** -+ -+ * @internal -+ * Dump private info from device to a file. -+ * -+ * @param dev -+ * Port (ethdev) handle. -+ * @param file -+ * A pointer to a file for output. -+ * -+ * @return -+ * Negative value on error, 0 on success. -+ * -+ * @retval 0 -+ * Success -+ * @retval -EINVAL -+ * Invalid file -+ */ -+typedef int (*eth_dev_priv_dump_t)(struct rte_eth_dev *dev, FILE *file); -+ - /** - * @internal A structure containing the functions exported by an Ethernet driver. - */ -@@ -1186,6 +1206,9 @@ struct eth_dev_ops { - * kinds of metadata to the PMD - */ - eth_rx_metadata_negotiate_t rx_metadata_negotiate; -+ -+ /** Dump private info from device */ -+ eth_dev_priv_dump_t eth_dev_priv_dump; - }; - - /** -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index a1d475a292..b9a452107f 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6472,6 +6472,23 @@ rte_eth_rx_metadata_negotiate(uint16_t port_id, uint64_t *features) - (*dev->dev_ops->rx_metadata_negotiate)(dev, features)); - } - -+int -+rte_eth_dev_priv_dump(uint16_t port_id, FILE *file) -+{ -+ struct rte_eth_dev *dev; -+ -+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ dev = &rte_eth_devices[port_id]; -+ -+ if (file == NULL) { -+ RTE_ETHDEV_LOG(ERR, "Invalid file (NULL)\n"); -+ return -EINVAL; -+ } -+ -+ RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->eth_dev_priv_dump, -ENOTSUP); -+ return eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev, file)); -+} -+ - RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO); - - RTE_INIT(ethdev_init_telemetry) -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index fa299c8ad7..b8f135ba3f 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -5188,6 +5188,27 @@ int rte_eth_representor_info_get(uint16_t port_id, - __rte_experimental - int rte_eth_rx_metadata_negotiate(uint16_t port_id, uint64_t *features); - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice -+ * -+ * Dump private info from device to a file. Provided data and the order depends -+ * on the PMD. -+ * -+ * @param port_id -+ * The port identifier of the Ethernet device. -+ * @param file -+ * A pointer to a file for output. -+ * @return -+ * - (0) on success. -+ * - (-ENODEV) if *port_id* is invalid. -+ * - (-EINVAL) if null file. -+ * - (-ENOTSUP) if the device does not support this function. -+ * - (-EIO) if device is removed. -+ */ -+__rte_experimental -+int rte_eth_dev_priv_dump(uint16_t port_id, FILE *file); -+ - #include - - /** --- -2.30.0 - diff --git a/0047-app-procinfo-add-device-private-info-dump.patch b/0047-app-procinfo-add-device-private-info-dump.patch deleted file mode 100644 index 7df98b8..0000000 --- a/0047-app-procinfo-add-device-private-info-dump.patch +++ /dev/null @@ -1,90 +0,0 @@ -From a91c0f253dd9b31cbe30bf5470a818aa0a909e26 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Sat, 19 Feb 2022 09:37:46 +0800 -Subject: [PATCH 02/13] app/procinfo: add device private info dump - -This patch adds support for dump the device private info from a running -application. It can help developers locate the problem. - -Signed-off-by: Min Hu (Connor) ---- - app/proc-info/main.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index ce140aaf84..fbc1715ce9 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -84,6 +84,8 @@ static char bdr_str[MAX_STRING_LEN]; - - /**< Enable show port. */ - static uint32_t enable_shw_port; -+/**< Enable show port private info. */ -+static uint32_t enable_shw_port_priv; - /**< Enable show tm. */ - static uint32_t enable_shw_tm; - /**< Enable show crypto. */ -@@ -123,6 +125,7 @@ proc_info_usage(const char *prgname) - " --collectd-format: to print statistics to STDOUT in expected by collectd format\n" - " --host-id STRING: host id used to identify the system process is running on\n" - " --show-port: to display ports information\n" -+ " --show-port-private: to display ports private information\n" - " --show-tm: to display traffic manager information for ports\n" - " --show-crypto: to display crypto information\n" - " --show-ring[=name]: to display ring information\n" -@@ -232,6 +235,7 @@ proc_info_parse_args(int argc, char **argv) - {"xstats-ids", 1, NULL, 1}, - {"host-id", 0, NULL, 0}, - {"show-port", 0, NULL, 0}, -+ {"show-port-private", 0, NULL, 0}, - {"show-tm", 0, NULL, 0}, - {"show-crypto", 0, NULL, 0}, - {"show-ring", optional_argument, NULL, 0}, -@@ -284,6 +288,9 @@ proc_info_parse_args(int argc, char **argv) - else if (!strncmp(long_option[option_index].name, - "show-port", MAX_LONG_OPT_SZ)) - enable_shw_port = 1; -+ else if (!strncmp(long_option[option_index].name, -+ "show-port-private", MAX_LONG_OPT_SZ)) -+ enable_shw_port_priv = 1; - else if (!strncmp(long_option[option_index].name, - "show-tm", MAX_LONG_OPT_SZ)) - enable_shw_tm = 1; -@@ -887,6 +894,25 @@ show_port(void) - } - } - -+static void -+show_port_private_info(void) -+{ -+ int i; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " show - Port PMD Private "); -+ STATS_BDR_STR(10, bdr_str); -+ -+ RTE_ETH_FOREACH_DEV(i) { -+ /* Skip if port is not in mask */ -+ if ((enabled_port_mask & (1ul << i)) == 0) -+ continue; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", i); -+ STATS_BDR_STR(5, bdr_str); -+ rte_eth_dev_priv_dump(i, stdout); -+ } -+} -+ - static void - display_nodecap_info(int is_leaf, struct rte_tm_node_capabilities *cap) - { -@@ -1549,6 +1575,8 @@ main(int argc, char **argv) - /* show information for PMD */ - if (enable_shw_port) - show_port(); -+ if (enable_shw_port_priv) -+ show_port_private_info(); - if (enable_shw_tm) - show_tm(); - if (enable_shw_crypto) --- -2.30.0 - diff --git a/0048-net-hns3-dump-device-basic-info.patch b/0048-net-hns3-dump-device-basic-info.patch deleted file mode 100644 index bad71a6..0000000 --- a/0048-net-hns3-dump-device-basic-info.patch +++ /dev/null @@ -1,174 +0,0 @@ -From c79d78f63ba993a7fb45b7c842cfcfefb38ba5b6 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 10:42:46 +0800 -Subject: [PATCH 03/13] net/hns3: dump device basic info - -This patch dumps device basic info such as device name, adapter state -for debug. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 1 + - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_ethdev_dump.c | 99 +++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_ethdev_vf.c | 1 + - drivers/net/hns3/meson.build | 1 + - 5 files changed, 103 insertions(+) - create mode 100644 drivers/net/hns3/hns3_ethdev_dump.c - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 13ebcde002..a9394eeeff 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6568,6 +6568,7 @@ static const struct eth_dev_ops hns3_eth_dev_ops = { - .timesync_adjust_time = hns3_timesync_adjust_time, - .timesync_read_time = hns3_timesync_read_time, - .timesync_write_time = hns3_timesync_write_time, -+ .eth_dev_priv_dump = hns3_eth_dev_priv_dump, - }; - - static const struct hns3_reset_ops hns3_reset_ops = { -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index d62884cd9b..412626c053 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1055,6 +1055,7 @@ int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts); - int hns3_timesync_write_time(struct rte_eth_dev *dev, - const struct timespec *ts); - int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); -+int hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file); - - static inline bool - is_reset_pending(struct hns3_adapter *hns) -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -new file mode 100644 -index 0000000000..bd95184b02 ---- /dev/null -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -0,0 +1,99 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(C) 2022 HiSilicon Limited -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "hns3_common.h" -+#include "hns3_logs.h" -+#include "hns3_regs.h" -+#include "hns3_rxtx.h" -+ -+static const char * -+hns3_get_adapter_state_name(uint32_t state) -+{ -+ static const char * const state_name[] = { -+ "UNINITIALIZED", -+ "INITIALIZED", -+ "CONFIGURING", -+ "CONFIGURED", -+ "STARTING", -+ "STARTED", -+ "STOPPING", -+ "CLOSING", -+ "CLOSED", -+ "REMOVED", -+ "NSTATES" -+ }; -+ -+ if (state < RTE_DIM(state_name)) -+ return state_name[state]; -+ else -+ return "unknown"; -+} -+ -+static const char * -+hns3_get_io_func_hint_name(uint32_t hint) -+{ -+ switch (hint) { -+ case HNS3_IO_FUNC_HINT_NONE: -+ return "none"; -+ case HNS3_IO_FUNC_HINT_VEC: -+ return "vec"; -+ case HNS3_IO_FUNC_HINT_SVE: -+ return "sve"; -+ case HNS3_IO_FUNC_HINT_SIMPLE: -+ return "simple"; -+ case HNS3_IO_FUNC_HINT_COMMON: -+ return "common"; -+ default: -+ return "unknown"; -+ } -+} -+ -+static void -+hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ -+ fprintf(file, -+ " - Device Base Info:\n" -+ "\t -- name: %s\n" -+ "\t -- adapter_state=%s\n" -+ "\t -- nb_rx_queues=%u nb_tx_queues=%u\n" -+ "\t -- total_tqps_num=%u tqps_num=%u intr_tqps_num=%u\n" -+ "\t -- rss_size_max=%u alloc_rss_size=%u tx_qnum_per_tc=%u\n" -+ "\t -- min_tx_pkt_len=%u intr_mapping_mode=%u vlan_mode=%u\n" -+ "\t -- tso_mode=%u max_non_tso_bd_num=%u\n" -+ "\t -- max_tm_rate=%u Mbps\n" -+ "\t -- set link down: %s\n" -+ "\t -- rx_func_hint=%s tx_func_hint=%s\n" -+ "\t -- dev_flags: lsc=%d\n" -+ "\t -- intr_conf: lsc=%u rxq=%u\n", -+ dev->data->name, -+ hns3_get_adapter_state_name(hw->adapter_state), -+ dev->data->nb_rx_queues, dev->data->nb_tx_queues, -+ hw->total_tqps_num, hw->tqps_num, hw->intr_tqps_num, -+ hw->rss_size_max, hw->alloc_rss_size, hw->tx_qnum_per_tc, -+ hw->min_tx_pkt_len, hw->intr.mapping_mode, hw->vlan_mode, -+ hw->tso_mode, hw->max_non_tso_bd_num, -+ hw->max_tm_rate, -+ hw->set_link_down ? "Yes" : "No", -+ hns3_get_io_func_hint_name(hns->rx_func_hint), -+ hns3_get_io_func_hint_name(hns->tx_func_hint), -+ !!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC), -+ dev->data->dev_conf.intr_conf.lsc, -+ dev->data->dev_conf.intr_conf.rxq); -+} -+ -+int -+hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) -+{ -+ hns3_get_device_basic_info(file, dev); -+ -+ return 0; -+} -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 5f905c515c..aee0c36360 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -2290,6 +2290,7 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = { - .get_reg = hns3_get_regs, - .dev_supported_ptypes_get = hns3_dev_supported_ptypes_get, - .tx_done_cleanup = hns3_tx_done_cleanup, -+ .eth_dev_priv_dump = hns3_eth_dev_priv_dump, - }; - - static const struct hns3_reset_ops hns3vf_reset_ops = { -diff --git a/drivers/net/hns3/meson.build b/drivers/net/hns3/meson.build -index 8a4c7cc100..665b2afedf 100644 ---- a/drivers/net/hns3/meson.build -+++ b/drivers/net/hns3/meson.build -@@ -30,6 +30,7 @@ sources = files( - 'hns3_tm.c', - 'hns3_ptp.c', - 'hns3_common.c', -+ 'hns3_ethdev_dump.c', - ) - - deps += ['hash'] --- -2.30.0 - diff --git a/0049-net-hns3-dump-device-feature-capability.patch b/0049-net-hns3-dump-device-feature-capability.patch deleted file mode 100644 index 60a66c1..0000000 --- a/0049-net-hns3-dump-device-feature-capability.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 9bbea26d3c903f5741447a1b1a943d02b275af56 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 10:52:06 +0800 -Subject: [PATCH 04/13] net/hns3: dump device feature capability - -Kunpeng 920 and Kunpeng 930 support different feature capability. -This patch dumps feature capability Current device supports. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index bd95184b02..a0fa0a3584 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -55,6 +55,30 @@ hns3_get_io_func_hint_name(uint32_t hint) - } - - static void -+hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) -+{ -+ const char * const caps_name[] = { -+ "DCB", -+ "COPPER", -+ "FD QUEUE REGION", -+ "PTP", -+ "TX PUSH", -+ "INDEP TXRX", -+ "STASH", -+ "SIMPLE BD", -+ "RXD Advanced Layout", -+ "OUTER UDP CKSUM", -+ "RAS IMP", -+ "TM", -+ }; -+ uint32_t i; -+ -+ fprintf(file, " - Dev Capability:\n"); -+ for (i = 0; i < RTE_DIM(caps_name); i++) -+ fprintf(file, "\t -- support %s: %s\n", caps_name[i], -+ hw->capability & BIT(i) ? "yes" : "no"); -+} -+ - hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -@@ -93,7 +117,11 @@ hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) - int - hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - { -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ - hns3_get_device_basic_info(file, dev); -+ hns3_get_dev_feature_capability(file, hw); - - return 0; - } --- -2.30.0 - diff --git a/0050-net-hns3-dump-device-MAC-info.patch b/0050-net-hns3-dump-device-MAC-info.patch deleted file mode 100644 index e644a1c..0000000 --- a/0050-net-hns3-dump-device-MAC-info.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 7041258cda77065d991d6ee8913edf110bd12531 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 10:56:54 +0800 -Subject: [PATCH 05/13] net/hns3: dump device MAC info - -This patch dumps device MAC info which hns3 PMD private info offers. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 31 +++++++++++++++++++++++++++++ - 1 file changed, 31 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index a0fa0a3584..83601d9bda 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -54,6 +54,28 @@ hns3_get_io_func_hint_name(uint32_t hint) - } - } - -+static void -+hns3_get_dev_mac_info(FILE *file, struct hns3_adapter *hns) -+{ -+ struct hns3_hw *hw = &hns->hw; -+ struct hns3_pf *pf = &hns->pf; -+ -+ fprintf(file, " - MAC Info:\n"); -+ fprintf(file, -+ "\t -- query_type=%u\n" -+ "\t -- supported_speed=0x%x\n" -+ "\t -- advertising=0x%x\n" -+ "\t -- lp_advertising=0x%x\n" -+ "\t -- support_autoneg=%s\n" -+ "\t -- support_fc_autoneg=%s\n", -+ hw->mac.query_type, -+ hw->mac.supported_speed, -+ hw->mac.advertising, -+ hw->mac.lp_advertising, -+ hw->mac.support_autoneg != 0 ? "Yes" : "No", -+ pf->support_fc_autoneg ? "Yes" : "No"); -+} -+ - static void - hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - { -@@ -123,5 +145,14 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - hns3_get_device_basic_info(file, dev); - hns3_get_dev_feature_capability(file, hw); - -+ /* -+ * VF only supports dumping basic info, feaure capability and queue -+ * info. -+ */ -+ if (hns->is_vf) -+ return 0; -+ -+ hns3_get_dev_mac_info(file, hns); -+ - return 0; - } --- -2.30.0 - diff --git a/0051-net-hns3-dump-queue-info.patch b/0051-net-hns3-dump-queue-info.patch deleted file mode 100644 index 58bcfb5..0000000 --- a/0051-net-hns3-dump-queue-info.patch +++ /dev/null @@ -1,254 +0,0 @@ -From 698e42cb7ca963e34b2f8c7e1f9be98a7793bed3 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 11:03:05 +0800 -Subject: [PATCH 06/13] net/hns3: dump queue info - -This patch dumps Rx/Tx queue info, such as queue numbers, queue enable -state for debug. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 220 ++++++++++++++++++++++++++++ - 1 file changed, 220 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index 83601d9bda..face41e4a7 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -136,6 +136,225 @@ hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) - dev->data->dev_conf.intr_conf.rxq); - } - -+/* -+ * Note: caller must make sure queue_id < nb_queues -+ * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues, -+ * eth_dev->data->nb_tx_queues) -+ */ -+static struct hns3_rx_queue * -+hns3_get_rx_queue(struct rte_eth_dev *dev, uint32_t queue_id) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ uint32_t offset; -+ void **rx_queues; -+ -+ if (queue_id < dev->data->nb_rx_queues) { -+ rx_queues = dev->data->rx_queues; -+ offset = queue_id; -+ } else { -+ /* -+ * For kunpeng930, fake queue is not exist. But since the queues -+ * are usually accessd in pairs, this branch may still exist. -+ */ -+ if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ return NULL; -+ -+ rx_queues = hw->fkq_data.rx_queues; -+ offset = queue_id - dev->data->nb_rx_queues; -+ } -+ -+ if (rx_queues != NULL && rx_queues[offset] != NULL) -+ return rx_queues[offset]; -+ -+ hns3_err(hw, "Detect rx_queues is NULL!\n"); -+ return NULL; -+} -+ -+/* -+ * Note: caller must make sure queue_id < nb_queues -+ * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues, -+ * eth_dev->data->nb_tx_queues) -+ */ -+static struct hns3_tx_queue * -+hns3_get_tx_queue(struct rte_eth_dev *dev, uint32_t queue_id) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ uint32_t offset; -+ void **tx_queues; -+ -+ if (queue_id < dev->data->nb_tx_queues) { -+ tx_queues = dev->data->tx_queues; -+ offset = queue_id; -+ } else { -+ /* -+ * For kunpeng930, fake queue is not exist. But since the queues -+ * are usually accessd in pairs, this branch may still exist. -+ */ -+ if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ return NULL; -+ tx_queues = hw->fkq_data.tx_queues; -+ offset = queue_id - dev->data->nb_tx_queues; -+ } -+ -+ if (tx_queues != NULL && tx_queues[offset] != NULL) -+ return tx_queues[offset]; -+ -+ hns3_err(hw, "Detect tx_queues is NULL!\n"); -+ return NULL; -+} -+ -+static void -+hns3_get_rxtx_fake_queue_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); -+ struct hns3_rx_queue *rxq; -+ struct hns3_tx_queue *txq; -+ uint32_t queue_id; -+ -+ if (dev->data->nb_rx_queues != dev->data->nb_tx_queues && -+ !hns3_dev_get_support(hw, INDEP_TXRX)) { -+ queue_id = RTE_MIN(dev->data->nb_rx_queues, -+ dev->data->nb_tx_queues); -+ rxq = hns3_get_rx_queue(dev, queue_id); -+ if (rxq == NULL) -+ return; -+ txq = hns3_get_tx_queue(dev, queue_id); -+ if (txq == NULL) -+ return; -+ fprintf(file, -+ "\t -- first fake_queue rxtx info:\n" -+ "\t Rx: port=%u nb_desc=%u free_thresh=%u\n" -+ "\t Tx: port=%u nb_desc=%u\n", -+ rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh, -+ txq->port_id, txq->nb_tx_desc); -+ } -+} -+ -+static void -+hns3_get_queue_enable_state(struct hns3_hw *hw, uint32_t *queue_state, -+ uint32_t nb_queues, bool is_rxq) -+{ -+#define STATE_SIZE (sizeof(*queue_state) * CHAR_BIT) -+ uint32_t queue_en_reg; -+ uint32_t reg_offset; -+ uint32_t state; -+ uint32_t i; -+ -+ queue_en_reg = is_rxq ? HNS3_RING_RX_EN_REG : HNS3_RING_TX_EN_REG; -+ for (i = 0; i < nb_queues; i++) { -+ reg_offset = hns3_get_tqp_reg_offset(i); -+ state = hns3_read_dev(hw, reg_offset + HNS3_RING_EN_REG); -+ if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ state = state && hns3_read_dev(hw, reg_offset + -+ queue_en_reg); -+ hns3_set_bit(queue_state[i / STATE_SIZE], -+ i % STATE_SIZE, state); -+ } -+} -+ -+static void -+hns3_print_queue_state_perline(FILE *file, const uint32_t *queue_state, -+ uint32_t nb_queues, uint32_t line_num) -+{ -+#define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT) -+ uint32_t qid = line_num * NUM_QUEUE_PER_LINE; -+ uint32_t j; -+ -+ for (j = 0; j < NUM_QUEUE_PER_LINE; j++) { -+ fprintf(file, "%1lx", hns3_get_bit(queue_state[line_num], j)); -+ -+ if (qid % CHAR_BIT == CHAR_BIT - 1) { -+ fprintf(file, "%s", -+ j == NUM_QUEUE_PER_LINE - 1 ? "\n" : ":"); -+ } -+ qid++; -+ if (qid >= nb_queues) { -+ fprintf(file, "\n"); -+ break; -+ } -+ } -+} -+ -+static void -+hns3_display_queue_enable_state(FILE *file, const uint32_t *queue_state, -+ uint32_t nb_queues, bool is_rxq) -+{ -+#define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT) -+ uint32_t i; -+ -+ if (nb_queues == 0) { -+ fprintf(file, "\t %s queue number is 0\n", -+ is_rxq ? "Rx" : "Tx"); -+ return; -+ } -+ -+ fprintf(file, "\t %s queue id | enable state bitMap\n", -+ is_rxq ? "Rx" : "Tx"); -+ -+ for (i = 0; i < (nb_queues - 1) / NUM_QUEUE_PER_LINE + 1; i++) { -+ uint32_t line_end = (i + 1) * NUM_QUEUE_PER_LINE - 1; -+ uint32_t line_start = i * NUM_QUEUE_PER_LINE; -+ fprintf(file, "\t %04u - %04u | ", line_start, -+ nb_queues - 1 > line_end ? line_end : nb_queues - 1); -+ -+ hns3_print_queue_state_perline(file, queue_state, nb_queues, i); -+ } -+} -+ -+static void -+hns3_get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev) -+{ -+#define MAX_TQP_NUM 1280 -+#define QUEUE_BITMAP_SIZE (MAX_TQP_NUM / 32) -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ uint32_t rx_queue_state[QUEUE_BITMAP_SIZE] = {0}; -+ uint32_t tx_queue_state[QUEUE_BITMAP_SIZE] = {0}; -+ uint32_t nb_rx_queues; -+ uint32_t nb_tx_queues; -+ -+ nb_rx_queues = dev->data->nb_rx_queues; -+ nb_tx_queues = dev->data->nb_tx_queues; -+ -+ fprintf(file, "\t -- enable state:\n"); -+ hns3_get_queue_enable_state(hw, rx_queue_state, nb_rx_queues, true); -+ hns3_display_queue_enable_state(file, rx_queue_state, nb_rx_queues, -+ true); -+ -+ hns3_get_queue_enable_state(hw, tx_queue_state, nb_tx_queues, false); -+ hns3_display_queue_enable_state(file, tx_queue_state, nb_tx_queues, -+ false); -+} -+ -+static void -+hns3_get_rxtx_queue_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_rx_queue *rxq; -+ struct hns3_tx_queue *txq; -+ uint32_t queue_id = 0; -+ -+ rxq = hns3_get_rx_queue(dev, queue_id); -+ if (rxq == NULL) -+ return; -+ txq = hns3_get_tx_queue(dev, queue_id); -+ if (txq == NULL) -+ return; -+ fprintf(file, " - Rx/Tx Queue Info:\n"); -+ fprintf(file, -+ "\t -- first queue rxtx info:\n" -+ "\t Rx: port=%u nb_desc=%u free_thresh=%u\n" -+ "\t Tx: port=%u nb_desc=%u\n" -+ "\t -- tx push: %s\n", -+ rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh, -+ txq->port_id, txq->nb_tx_desc, -+ txq->tx_push_enable ? "enabled" : "disabled"); -+ -+ hns3_get_rxtx_fake_queue_info(file, dev); -+ hns3_get_rxtx_queue_enable_state(file, dev); -+} -+ - int - hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - { -@@ -144,6 +363,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - - hns3_get_device_basic_info(file, dev); - hns3_get_dev_feature_capability(file, hw); -+ hns3_get_rxtx_queue_info(file, dev); - - /* - * VF only supports dumping basic info, feaure capability and queue --- -2.30.0 - diff --git a/0052-net-hns3-dump-VLAN-configuration-info.patch b/0052-net-hns3-dump-VLAN-configuration-info.patch deleted file mode 100644 index 03f3bf8..0000000 --- a/0052-net-hns3-dump-VLAN-configuration-info.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 05e415e929a404187f6b595a0b0f1ea958c1ca12 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 11:06:55 +0800 -Subject: [PATCH 07/13] net/hns3: dump VLAN configuration info - -This patch dump VLAN filter, strip related info and Pvid info for debug. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 147 ++++++++++++++++++++++++++++ - 1 file changed, 147 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index face41e4a7..d017e66e69 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -355,6 +355,152 @@ hns3_get_rxtx_queue_info(FILE *file, struct rte_eth_dev *dev) - hns3_get_rxtx_queue_enable_state(file, dev); - } - -+static int -+hns3_get_vlan_rx_offload_cfg(FILE *file, struct hns3_hw *hw) -+{ -+ struct hns3_vport_vtag_rx_cfg_cmd *req; -+ struct hns3_cmd_desc desc; -+ uint16_t vport_id; -+ uint8_t bitmap; -+ int ret; -+ -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_PORT_RX_CFG, true); -+ req = (struct hns3_vport_vtag_rx_cfg_cmd *)desc.data; -+ vport_id = HNS3_PF_FUNC_ID; -+ req->vf_offset = vport_id / HNS3_VF_NUM_PER_CMD; -+ bitmap = 1 << (vport_id % HNS3_VF_NUM_PER_BYTE); -+ req->vf_bitmap[req->vf_offset] = bitmap; -+ -+ /* -+ * current version VF is not supported when PF is driven by DPDK driver, -+ * just need to configure rx parameters for PF vport. -+ */ -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret != 0) { -+ hns3_err(hw, -+ "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!", -+ ret, 1, rte_le_to_cpu_16(desc.opcode)); -+ return ret; -+ } -+ -+ fprintf(file, -+ "\t -- RX VLAN configuration\n" -+ "\t vlan1_strip_en :%s\n" -+ "\t vlan2_strip_en :%s\n" -+ "\t vlan1_vlan_prionly :%s\n" -+ "\t vlan2_vlan_prionly :%s\n" -+ "\t vlan1_strip_discard :%s\n" -+ "\t vlan2_strip_discard :%s\n", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_REM_TAG1_EN_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_REM_TAG2_EN_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_SHOW_TAG1_EN_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_SHOW_TAG2_EN_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_DISCARD_TAG1_EN_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_DISCARD_TAG2_EN_B) ? "Enable" : "Disable"); -+ -+ return 0; -+} -+ -+static void -+hns3_parse_tx_vlan_cfg(FILE *file, struct hns3_vport_vtag_tx_cfg_cmd *req) -+{ -+#define VLAN_VID_MASK 0x0fff -+#define VLAN_PRIO_SHIFT 13 -+ -+ fprintf(file, -+ "\t -- TX VLAN configuration\n" -+ "\t accept_tag1 :%s\n" -+ "\t accept_untag1 :%s\n" -+ "\t insert_tag1_en :%s\n" -+ "\t default_vlan_tag1 = %d, qos = %d\n" -+ "\t accept_tag2 :%s\n" -+ "\t accept_untag2 :%s\n" -+ "\t insert_tag2_en :%s\n" -+ "\t default_vlan_tag2 = %d, qos = %d\n" -+ "\t vlan_shift_mode :%s\n", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_ACCEPT_TAG1_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_ACCEPT_UNTAG1_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_PORT_INS_TAG1_EN_B) ? "Enable" : "Disable", -+ req->def_vlan_tag1 & VLAN_VID_MASK, -+ req->def_vlan_tag1 >> VLAN_PRIO_SHIFT, -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_ACCEPT_TAG2_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_ACCEPT_UNTAG2_B) ? "Enable" : "Disable", -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_PORT_INS_TAG2_EN_B) ? "Enable" : "Disable", -+ req->def_vlan_tag2 & VLAN_VID_MASK, -+ req->def_vlan_tag2 >> VLAN_PRIO_SHIFT, -+ hns3_get_bit(req->vport_vlan_cfg, -+ HNS3_TAG_SHIFT_MODE_EN_B) ? "Enable" : -+ "Disable"); -+} -+ -+static int -+hns3_get_vlan_tx_offload_cfg(FILE *file, struct hns3_hw *hw) -+{ -+ struct hns3_vport_vtag_tx_cfg_cmd *req; -+ struct hns3_cmd_desc desc; -+ uint16_t vport_id; -+ uint8_t bitmap; -+ int ret; -+ -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_PORT_TX_CFG, true); -+ req = (struct hns3_vport_vtag_tx_cfg_cmd *)desc.data; -+ vport_id = HNS3_PF_FUNC_ID; -+ req->vf_offset = vport_id / HNS3_VF_NUM_PER_CMD; -+ bitmap = 1 << (vport_id % HNS3_VF_NUM_PER_BYTE); -+ req->vf_bitmap[req->vf_offset] = bitmap; -+ /* -+ * current version VF is not supported when PF is driven by DPDK driver, -+ * just need to configure tx parameters for PF vport. -+ */ -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret != 0) { -+ hns3_err(hw, -+ "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!", -+ ret, 1, rte_le_to_cpu_16(desc.opcode)); -+ return ret; -+ } -+ -+ hns3_parse_tx_vlan_cfg(file, req); -+ -+ return 0; -+} -+ -+static void -+hns3_get_port_pvid_info(FILE *file, struct hns3_hw *hw) -+{ -+ fprintf(file, "\t -- pvid status: %s\n", -+ hw->port_base_vlan_cfg.state ? "on" : "off"); -+} -+ -+static void -+hns3_get_vlan_config_info(FILE *file, struct hns3_hw *hw) -+{ -+ int ret; -+ -+ fprintf(file, " - VLAN Config Info:\n"); -+ ret = hns3_get_vlan_rx_offload_cfg(file, hw); -+ if (ret < 0) -+ return; -+ -+ ret = hns3_get_vlan_tx_offload_cfg(file, hw); -+ if (ret < 0) -+ return; -+ -+ hns3_get_port_pvid_info(file, hw); -+} -+ - int - hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - { -@@ -373,6 +519,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - return 0; - - hns3_get_dev_mac_info(file, hns); -+ hns3_get_vlan_config_info(file, hw); - - return 0; - } --- -2.30.0 - diff --git a/0053-net-hns3-dump-flow-director-basic-info.patch b/0053-net-hns3-dump-flow-director-basic-info.patch deleted file mode 100644 index 186d8fb..0000000 --- a/0053-net-hns3-dump-flow-director-basic-info.patch +++ /dev/null @@ -1,119 +0,0 @@ -From ca1080fde102a1b9de5781e0919a5342b6151bd3 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 11:10:28 +0800 -Subject: [PATCH 08/13] net/hns3: dump flow director basic info - -This patch dumps flow director basic info such rule numbers, hit counts -for debug. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 85 +++++++++++++++++++++++++++++ - 1 file changed, 85 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index d017e66e69..792ef99b81 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -101,6 +101,90 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - hw->capability & BIT(i) ? "yes" : "no"); - } - -+static const char * -+hns3_get_fdir_tuple_name(uint32_t index) -+{ -+ static const char * const tuple_name[] = { -+ "outer_dst_mac", -+ "outer_src_mac", -+ "outer_vlan_1st_tag", -+ "outer_vlan_2nd_tag", -+ "outer_eth_type", -+ "outer_l2_rsv", -+ "outer_ip_tos", -+ "outer_ip_proto", -+ "outer_src_ip", -+ "outer_dst_ip", -+ "outer_l3_rsv", -+ "outer_src_port", -+ "outer_dst_port", -+ "outer_l4_rsv", -+ "outer_tun_vni", -+ "outer_tun_flow_id", -+ "inner_dst_mac", -+ "inner_src_mac", -+ "inner_vlan_tag1", -+ "inner_vlan_tag2", -+ "inner_eth_type", -+ "inner_l2_rsv", -+ "inner_ip_tos", -+ "inner_ip_proto", -+ "inner_src_ip", -+ "inner_dst_ip", -+ "inner_l3_rsv", -+ "inner_src_port", -+ "inner_dst_port", -+ "inner_sctp_tag", -+ }; -+ if (index < RTE_DIM(tuple_name)) -+ return tuple_name[index]; -+ else -+ return "unknown"; -+} -+ -+static void -+hns3_get_fdir_basic_info(FILE *file, struct hns3_pf *pf) -+{ -+#define TMPBUF_SIZE 2048 -+#define PERLINE_TUPLE_NAMES 4 -+ struct hns3_fd_cfg *fdcfg = &pf->fdir.fd_cfg; -+ char tmpbuf[TMPBUF_SIZE] = {0}; -+ uint32_t i, count = 0; -+ -+ fprintf(file, " - Fdir Info:\n"); -+ fprintf(file, -+ "\t -- mode=%u max_key_len=%u rule_num:%u cnt_num:%u\n" -+ "\t -- key_sel=%u tuple_active=0x%x meta_data_active=0x%x\n" -+ "\t -- ipv6_word_en: in_s=%u in_d=%u out_s=%u out_d=%u\n" -+ "\t -- active_tuples:\n", -+ fdcfg->fd_mode, fdcfg->max_key_length, -+ fdcfg->rule_num[HNS3_FD_STAGE_1], -+ fdcfg->cnt_num[HNS3_FD_STAGE_1], -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].key_sel, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].tuple_active, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].meta_data_active, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].inner_sipv6_word_en, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].inner_dipv6_word_en, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].outer_sipv6_word_en, -+ fdcfg->key_cfg[HNS3_FD_STAGE_1].outer_dipv6_word_en); -+ -+ for (i = 0; i < MAX_TUPLE; i++) { -+ if (!(fdcfg->key_cfg[HNS3_FD_STAGE_1].tuple_active & BIT(i))) -+ continue; -+ if (count % PERLINE_TUPLE_NAMES == 0) -+ fprintf(file, "\t "); -+ fprintf(file, " %s", hns3_get_fdir_tuple_name(i)); -+ count++; -+ if (count % PERLINE_TUPLE_NAMES == 0) -+ fprintf(file, "\n"); -+ } -+ if (count % PERLINE_TUPLE_NAMES) -+ fprintf(file, "\n"); -+ -+ fprintf(file, "%s", tmpbuf); -+} -+ -+static void - hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -@@ -520,6 +604,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - - hns3_get_dev_mac_info(file, hns); - hns3_get_vlan_config_info(file, hw); -+ hns3_get_fdir_basic_info(file, &hns->pf); - - return 0; - } --- -2.30.0 - diff --git a/0054-net-hns3-dump-TM-configuration-info.patch b/0054-net-hns3-dump-TM-configuration-info.patch deleted file mode 100644 index 9100422..0000000 --- a/0054-net-hns3-dump-TM-configuration-info.patch +++ /dev/null @@ -1,188 +0,0 @@ -From f612c76b724c499f870026ec3deda07f0de13543 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 11:22:23 +0800 -Subject: [PATCH 09/13] net/hns3: dump TM configuration info - -This patch dumps TM configuration info about shaper, port node, TC node, -queue node related info. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_dump.c | 154 ++++++++++++++++++++++++++++ - 1 file changed, 154 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index 792ef99b81..c0fc55b290 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -585,6 +585,159 @@ hns3_get_vlan_config_info(FILE *file, struct hns3_hw *hw) - hns3_get_port_pvid_info(file, hw); - } - -+static void -+hns3_get_tm_conf_shaper_info(FILE *file, struct hns3_tm_conf *conf) -+{ -+ struct hns3_shaper_profile_list *shaper_profile_list = -+ &conf->shaper_profile_list; -+ struct hns3_tm_shaper_profile *shaper_profile; -+ -+ if (!conf->nb_shaper_profile) -+ return; -+ -+ fprintf(file, " shaper_profile:\n"); -+ TAILQ_FOREACH(shaper_profile, shaper_profile_list, node) { -+ fprintf(file, -+ " id=%u reference_count=%u peak_rate=%" PRIu64 "Bps\n", -+ shaper_profile->shaper_profile_id, -+ shaper_profile->reference_count, -+ shaper_profile->profile.peak.rate); -+ } -+} -+ -+static void -+hns3_get_tm_conf_port_node_info(FILE *file, struct hns3_tm_conf *conf) -+{ -+ if (!conf->root) -+ return; -+ -+ fprintf(file, -+ " port_node: \n" -+ " node_id=%u reference_count=%u shaper_profile_id=%d\n", -+ conf->root->id, conf->root->reference_count, -+ conf->root->shaper_profile ? -+ (int)conf->root->shaper_profile->shaper_profile_id : -1); -+} -+ -+static void -+hns3_get_tm_conf_tc_node_info(FILE *file, struct hns3_tm_conf *conf) -+{ -+ struct hns3_tm_node_list *tc_list = &conf->tc_list; -+ struct hns3_tm_node *tc_node[HNS3_MAX_TC_NUM]; -+ struct hns3_tm_node *tm_node; -+ uint32_t tidx; -+ -+ if (!conf->nb_tc_node) -+ return; -+ -+ fprintf(file, " tc_node: \n"); -+ memset(tc_node, 0, sizeof(tc_node)); -+ TAILQ_FOREACH(tm_node, tc_list, node) { -+ tidx = hns3_tm_calc_node_tc_no(conf, tm_node->id); -+ if (tidx < HNS3_MAX_TC_NUM) -+ tc_node[tidx] = tm_node; -+ } -+ -+ for (tidx = 0; tidx < HNS3_MAX_TC_NUM; tidx++) { -+ tm_node = tc_node[tidx]; -+ if (tm_node == NULL) -+ continue; -+ fprintf(file, -+ " id=%u TC%u reference_count=%u parent_id=%d " -+ "shaper_profile_id=%d\n", -+ tm_node->id, hns3_tm_calc_node_tc_no(conf, tm_node->id), -+ tm_node->reference_count, -+ tm_node->parent ? (int)tm_node->parent->id : -1, -+ tm_node->shaper_profile ? -+ (int)tm_node->shaper_profile->shaper_profile_id : -1); -+ } -+} -+ -+static void -+hns3_get_tm_conf_queue_format_info(FILE *file, struct hns3_tm_node **queue_node, -+ uint32_t *queue_node_tc, -+ uint32_t nb_tx_queues) -+{ -+#define PERLINE_QUEUES 32 -+#define PERLINE_STRIDE 8 -+#define LINE_BUF_SIZE 1024 -+ uint32_t i, j, line_num, start_queue, end_queue; -+ char tmpbuf[LINE_BUF_SIZE] = {0}; -+ -+ line_num = (nb_tx_queues + PERLINE_QUEUES - 1) / PERLINE_QUEUES; -+ for (i = 0; i < line_num; i++) { -+ start_queue = i * PERLINE_QUEUES; -+ end_queue = (i + 1) * PERLINE_QUEUES - 1; -+ if (end_queue > nb_tx_queues - 1) -+ end_queue = nb_tx_queues - 1; -+ fprintf(file, " %04u - %04u | ", start_queue, end_queue); -+ for (j = start_queue; j < nb_tx_queues; j++) { -+ if (j >= end_queue + 1) -+ break; -+ if (j > start_queue && j % PERLINE_STRIDE == 0) -+ fprintf(file, ":"); -+ fprintf(file, "%u", -+ queue_node[j] ? queue_node_tc[j] : -+ HNS3_MAX_TC_NUM); -+ } -+ fprintf(file, "%s\n", tmpbuf); -+ } -+} -+ -+static void -+hns3_get_tm_conf_queue_node_info(FILE *file, struct hns3_tm_conf *conf, -+ uint32_t nb_tx_queues) -+{ -+ struct hns3_tm_node_list *queue_list = &conf->queue_list; -+ uint32_t nb_queue_node = conf->nb_leaf_nodes_max + 1; -+ struct hns3_tm_node *queue_node[nb_queue_node]; -+ uint32_t queue_node_tc[nb_queue_node]; -+ struct hns3_tm_node *tm_node; -+ -+ if (!conf->nb_queue_node) -+ return; -+ -+ fprintf(file, -+ " queue_node: \n" -+ " tx queue id | mapped tc (8 mean node not exist)\n"); -+ -+ memset(queue_node, 0, sizeof(queue_node)); -+ memset(queue_node_tc, 0, sizeof(queue_node_tc)); -+ nb_tx_queues = RTE_MIN(nb_tx_queues, nb_queue_node); -+ TAILQ_FOREACH(tm_node, queue_list, node) { -+ if (tm_node->id >= nb_queue_node) -+ continue; -+ queue_node[tm_node->id] = tm_node; -+ queue_node_tc[tm_node->id] = tm_node->parent ? -+ hns3_tm_calc_node_tc_no(conf, tm_node->parent->id) : 0; -+ nb_tx_queues = RTE_MAX(nb_tx_queues, tm_node->id + 1); -+ } -+ -+ hns3_get_tm_conf_queue_format_info(file, queue_node, queue_node_tc, -+ nb_tx_queues); -+} -+ -+static void -+hns3_get_tm_conf_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(dev->data->dev_private); -+ struct hns3_tm_conf *conf = &pf->tm_conf; -+ -+ fprintf(file, " - TM config info:\n"); -+ fprintf(file, -+ "\t -- nb_leaf_nodes_max=%u nb_nodes_max=%u\n" -+ "\t -- nb_shaper_profile=%u nb_tc_node=%u nb_queue_node=%u\n" -+ "\t -- committed=%u\n", -+ conf->nb_leaf_nodes_max, conf->nb_nodes_max, -+ conf->nb_shaper_profile, conf->nb_tc_node, conf->nb_queue_node, -+ conf->committed); -+ -+ hns3_get_tm_conf_shaper_info(file, conf); -+ hns3_get_tm_conf_port_node_info(file, conf); -+ hns3_get_tm_conf_tc_node_info(file, conf); -+ hns3_get_tm_conf_queue_node_info(file, conf, dev->data->nb_tx_queues); -+} -+ - int - hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - { -@@ -605,6 +758,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - hns3_get_dev_mac_info(file, hns); - hns3_get_vlan_config_info(file, hw); - hns3_get_fdir_basic_info(file, &hns->pf); -+ hns3_get_tm_conf_info(file, dev); - - return 0; - } --- -2.30.0 - diff --git a/0055-net-hns3-dump-flow-control-info.patch b/0055-net-hns3-dump-flow-control-info.patch deleted file mode 100644 index 0d67770..0000000 --- a/0055-net-hns3-dump-flow-control-info.patch +++ /dev/null @@ -1,165 +0,0 @@ -From e5e64a038775d3c7bd8f412fe9d814c8dfe795eb Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 11 Feb 2022 11:27:04 +0800 -Subject: [PATCH 10/13] net/hns3: dump flow control info - -This patch dumps flow control info such as flow control mode -for debug. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_ethdev.h | 2 + - drivers/net/hns3/hns3_ethdev_dump.c | 103 ++++++++++++++++++++++++++++ - 3 files changed, 106 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index a9394eeeff..cac6dd7755 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5350,7 +5350,7 @@ hns3_get_current_fc_mode(struct rte_eth_dev *dev) - return hns3_get_autoneg_fc_mode(hw); - } - --static int -+int - hns3_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 412626c053..fd83bb7109 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1030,6 +1030,8 @@ hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr) - return __atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED) & mask; - } - -+int -+hns3_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf); - uint32_t hns3_get_speed_capa(struct hns3_hw *hw); - - int hns3_buffer_alloc(struct hns3_hw *hw); -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_ethdev_dump.c -index c0fc55b290..d9c1879f74 100644 ---- a/drivers/net/hns3/hns3_ethdev_dump.c -+++ b/drivers/net/hns3/hns3_ethdev_dump.c -@@ -738,6 +738,108 @@ hns3_get_tm_conf_info(FILE *file, struct rte_eth_dev *dev) - hns3_get_tm_conf_queue_node_info(file, conf, dev->data->nb_tx_queues); - } - -+static void -+hns3_fc_mode_to_rxtx_pause(enum hns3_fc_mode fc_mode, bool *rx_pause, -+ bool *tx_pause) -+{ -+ switch (fc_mode) { -+ case HNS3_FC_NONE: -+ *tx_pause = false; -+ *rx_pause = false; -+ break; -+ case HNS3_FC_RX_PAUSE: -+ *rx_pause = true; -+ *tx_pause = false; -+ break; -+ case HNS3_FC_TX_PAUSE: -+ *rx_pause = false; -+ *tx_pause = true; -+ break; -+ case HNS3_FC_FULL: -+ *rx_pause = true; -+ *tx_pause = true; -+ break; -+ default: -+ *rx_pause = false; -+ *tx_pause = false; -+ break; -+ } -+} -+ -+static bool -+hns3_is_link_fc_mode(struct hns3_adapter *hns) -+{ -+ struct hns3_hw *hw = &hns->hw; -+ struct hns3_pf *pf = &hns->pf; -+ -+ if (hw->current_fc_status == HNS3_FC_STATUS_PFC) -+ return false; -+ -+ if (hw->num_tc > 1 && !pf->support_multi_tc_pause) -+ return false; -+ -+ return true; -+} -+ -+static void -+hns3_get_link_fc_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ struct rte_eth_fc_conf cur_fc_conf; -+ bool rx_pause1; -+ bool tx_pause1; -+ bool rx_pause2; -+ bool tx_pause2; -+ int ret; -+ -+ if (!hns3_is_link_fc_mode(hns)) -+ return; -+ -+ ret = hns3_flow_ctrl_get(dev, &cur_fc_conf); -+ if (ret) { -+ fprintf(file, "get device flow control info fail!\n"); -+ return; -+ } -+ -+ hns3_fc_mode_to_rxtx_pause(hw->requested_fc_mode, -+ &rx_pause1, &tx_pause1); -+ hns3_fc_mode_to_rxtx_pause((enum hns3_fc_mode)cur_fc_conf.mode, -+ &rx_pause2, &tx_pause2); -+ -+ fprintf(file, -+ "\t -- link_fc_info:\n" -+ "\t Requested fc:\n" -+ "\t Rx: %s\n" -+ "\t Tx: %s\n" -+ "\t Current fc:\n" -+ "\t Rx: %s\n" -+ "\t Tx: %s\n" -+ "\t Autonegotiate: %s\n" -+ "\t Pause time: 0x%x\n", -+ rx_pause1 ? "On" : "Off", tx_pause1 ? "On" : "Off", -+ rx_pause2 ? "On" : "Off", tx_pause2 ? "On" : "Off", -+ cur_fc_conf.autoneg == RTE_ETH_LINK_AUTONEG ? "On" : "Off", -+ cur_fc_conf.pause_time); -+} -+ -+static void -+hns3_get_flow_ctrl_info(FILE *file, struct rte_eth_dev *dev) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; -+ -+ fprintf(file, " - Flow Ctrl Info:\n"); -+ fprintf(file, -+ "\t -- fc_common_info:\n" -+ "\t current_fc_status=%u\n" -+ "\t requested_fc_mode=%u\n", -+ hw->current_fc_status, -+ hw->requested_fc_mode); -+ -+ hns3_get_link_fc_info(file, dev); -+} -+ - int - hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - { -@@ -759,6 +861,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - hns3_get_vlan_config_info(file, hw); - hns3_get_fdir_basic_info(file, &hns->pf); - hns3_get_tm_conf_info(file, dev); -+ hns3_get_flow_ctrl_info(file, dev); - - return 0; - } --- -2.30.0 - diff --git a/0056-net-hns3-change-dump-file-name.patch b/0056-net-hns3-change-dump-file-name.patch deleted file mode 100644 index bfead0a..0000000 --- a/0056-net-hns3-change-dump-file-name.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 297a29aa8a27e93b2fa1fdc40a4964f0fbbaa4ec Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Thu, 31 Mar 2022 14:20:42 +0800 -Subject: [PATCH 11/13] net/hns3: change dump file name - -change dump file name 'hns3_ethdev_dump.c' to 'hns3_dump.c', as it -is more simple. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/{hns3_ethdev_dump.c => hns3_dump.c} | 0 - drivers/net/hns3/meson.build | 2 +- - 2 files changed, 1 insertion(+), 1 deletion(-) - rename drivers/net/hns3/{hns3_ethdev_dump.c => hns3_dump.c} (100%) - -diff --git a/drivers/net/hns3/hns3_ethdev_dump.c b/drivers/net/hns3/hns3_dump.c -similarity index 100% -rename from drivers/net/hns3/hns3_ethdev_dump.c -rename to drivers/net/hns3/hns3_dump.c -diff --git a/drivers/net/hns3/meson.build b/drivers/net/hns3/meson.build -index 665b2afedf..9f30f6b7af 100644 ---- a/drivers/net/hns3/meson.build -+++ b/drivers/net/hns3/meson.build -@@ -30,7 +30,7 @@ sources = files( - 'hns3_tm.c', - 'hns3_ptp.c', - 'hns3_common.c', -- 'hns3_ethdev_dump.c', -+ 'hns3_dump.c', - ) - - deps += ['hash'] --- -2.30.0 - diff --git a/0057-net-hns3-fix-code-check-for-dump.patch b/0057-net-hns3-fix-code-check-for-dump.patch deleted file mode 100644 index cf4687d..0000000 --- a/0057-net-hns3-fix-code-check-for-dump.patch +++ /dev/null @@ -1,680 +0,0 @@ -From d2c737bb909c52de76246d9c74944d96c5e7792f Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Thu, 31 Mar 2022 15:59:51 +0800 -Subject: [PATCH 12/13] net/hns3: fix code check for dump - -This patch fix code check for dump, making it more readable. - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_dump.c | 341 +++++++++++++++--------------- - drivers/net/hns3/hns3_dump.h | 10 + - drivers/net/hns3/hns3_ethdev.c | 1 + - drivers/net/hns3/hns3_ethdev.h | 3 +- - drivers/net/hns3/hns3_ethdev_vf.c | 1 + - 5 files changed, 187 insertions(+), 169 deletions(-) - create mode 100644 drivers/net/hns3/hns3_dump.h - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index d9c1879f74..3a30a585c5 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -2,37 +2,41 @@ - * Copyright(C) 2022 HiSilicon Limited - */ - --#include --#include --#include --#include -+#include - -+#include "hns3_ethdev.h" - #include "hns3_common.h" --#include "hns3_logs.h" --#include "hns3_regs.h" - #include "hns3_rxtx.h" -+#include "hns3_regs.h" -+#include "hns3_logs.h" -+#include "hns3_dump.h" - - static const char * --hns3_get_adapter_state_name(uint32_t state) -+hns3_get_adapter_state_name(enum hns3_adapter_state state) - { -- static const char * const state_name[] = { -- "UNINITIALIZED", -- "INITIALIZED", -- "CONFIGURING", -- "CONFIGURED", -- "STARTING", -- "STARTED", -- "STOPPING", -- "CLOSING", -- "CLOSED", -- "REMOVED", -- "NSTATES" -+ const struct { -+ enum hns3_adapter_state state; -+ const char *name; -+ } adapter_state_name[] = { -+ {HNS3_NIC_UNINITIALIZED, "UNINITIALIZED"}, -+ {HNS3_NIC_INITIALIZED, "INITIALIZED"}, -+ {HNS3_NIC_CONFIGURING, "CONFIGURING"}, -+ {HNS3_NIC_CONFIGURED, "CONFIGURED"}, -+ {HNS3_NIC_STARTING, "STARTING"}, -+ {HNS3_NIC_STARTED, "STARTED"}, -+ {HNS3_NIC_STOPPING, "STOPPING"}, -+ {HNS3_NIC_CLOSING, "CLOSING"}, -+ {HNS3_NIC_CLOSED, "CLOSED"}, -+ {HNS3_NIC_REMOVED, "REMOVED"}, -+ {HNS3_NIC_NSTATES, "NSTATES"}, - }; -+ uint32_t i; - -- if (state < RTE_DIM(state_name)) -- return state_name[state]; -- else -- return "unknown"; -+ for (i = 0; i < RTE_DIM(adapter_state_name); i++) -+ if (state == adapter_state_name[i].state) -+ return adapter_state_name[i].name; -+ -+ return "Unknown"; - } - - static const char * -@@ -79,32 +83,36 @@ hns3_get_dev_mac_info(FILE *file, struct hns3_adapter *hns) - static void - hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - { -- const char * const caps_name[] = { -- "DCB", -- "COPPER", -- "FD QUEUE REGION", -- "PTP", -- "TX PUSH", -- "INDEP TXRX", -- "STASH", -- "SIMPLE BD", -- "RXD Advanced Layout", -- "OUTER UDP CKSUM", -- "RAS IMP", -- "TM", -+ const struct { -+ enum hns3_dev_cap cap; -+ const char *name; -+ } caps_name[] = { -+ {HNS3_DEV_SUPPORT_DCB_B, "DCB"}, -+ {HNS3_DEV_SUPPORT_COPPER_B, "COPPER"}, -+ {HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B, "FD QUEUE REGION"}, -+ {HNS3_DEV_SUPPORT_PTP_B, "PTP"}, -+ {HNS3_DEV_SUPPORT_TX_PUSH_B, "TX PUSH"}, -+ {HNS3_DEV_SUPPORT_INDEP_TXRX_B, "INDEP TXRX"}, -+ {HNS3_DEV_SUPPORT_STASH_B, "STASH"}, -+ {HNS3_DEV_SUPPORT_SIMPLE_BD_B, "SIMPLE BD"}, -+ {HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, "RXD Advanced Layout"}, -+ {HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, "OUTER UDP CKSUM"}, -+ {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, -+ {HNS3_DEV_SUPPORT_TM_B, "TM"}, - }; - uint32_t i; - - fprintf(file, " - Dev Capability:\n"); - for (i = 0; i < RTE_DIM(caps_name); i++) -- fprintf(file, "\t -- support %s: %s\n", caps_name[i], -- hw->capability & BIT(i) ? "yes" : "no"); -+ fprintf(file, "\t -- support %s: %s\n", caps_name[i].name, -+ hns3_get_bit(hw->capability, caps_name[i].cap) ? "Yes" : -+ "No"); - } - - static const char * - hns3_get_fdir_tuple_name(uint32_t index) - { -- static const char * const tuple_name[] = { -+ const char * const tuple_name[] = { - "outer_dst_mac", - "outer_src_mac", - "outer_vlan_1st_tag", -@@ -145,10 +153,8 @@ hns3_get_fdir_tuple_name(uint32_t index) - static void - hns3_get_fdir_basic_info(FILE *file, struct hns3_pf *pf) - { --#define TMPBUF_SIZE 2048 --#define PERLINE_TUPLE_NAMES 4 -+#define HNS3_PERLINE_TUPLE_NAME_LEN 4 - struct hns3_fd_cfg *fdcfg = &pf->fdir.fd_cfg; -- char tmpbuf[TMPBUF_SIZE] = {0}; - uint32_t i, count = 0; - - fprintf(file, " - Fdir Info:\n"); -@@ -171,17 +177,15 @@ hns3_get_fdir_basic_info(FILE *file, struct hns3_pf *pf) - for (i = 0; i < MAX_TUPLE; i++) { - if (!(fdcfg->key_cfg[HNS3_FD_STAGE_1].tuple_active & BIT(i))) - continue; -- if (count % PERLINE_TUPLE_NAMES == 0) -+ if (count % HNS3_PERLINE_TUPLE_NAME_LEN == 0) - fprintf(file, "\t "); - fprintf(file, " %s", hns3_get_fdir_tuple_name(i)); - count++; -- if (count % PERLINE_TUPLE_NAMES == 0) -+ if (count % HNS3_PERLINE_TUPLE_NAME_LEN == 0) - fprintf(file, "\n"); - } -- if (count % PERLINE_TUPLE_NAMES) -+ if (count % HNS3_PERLINE_TUPLE_NAME_LEN) - fprintf(file, "\n"); -- -- fprintf(file, "%s", tmpbuf); - } - - static void -@@ -220,99 +224,94 @@ hns3_get_device_basic_info(FILE *file, struct rte_eth_dev *dev) - dev->data->dev_conf.intr_conf.rxq); - } - --/* -- * Note: caller must make sure queue_id < nb_queues -- * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues, -- * eth_dev->data->nb_tx_queues) -- */ - static struct hns3_rx_queue * --hns3_get_rx_queue(struct rte_eth_dev *dev, uint32_t queue_id) -+hns3_get_rx_queue(struct rte_eth_dev *dev) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -- uint32_t offset; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_rx_queue *rxq; -+ uint32_t queue_id; - void **rx_queues; - -- if (queue_id < dev->data->nb_rx_queues) { -+ for (queue_id = 0; queue_id < dev->data->nb_rx_queues; queue_id++) { - rx_queues = dev->data->rx_queues; -- offset = queue_id; -- } else { -- /* -- * For kunpeng930, fake queue is not exist. But since the queues -- * are usually accessd in pairs, this branch may still exist. -- */ -- if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ if (rx_queues == NULL || rx_queues[queue_id] == NULL) { -+ hns3_err(hw, "detect rx_queues is NULL!\n"); - return NULL; -+ } - -- rx_queues = hw->fkq_data.rx_queues; -- offset = queue_id - dev->data->nb_rx_queues; -- } -+ rxq = (struct hns3_rx_queue *)rx_queues[queue_id]; -+ if (rxq->rx_deferred_start) -+ continue; - -- if (rx_queues != NULL && rx_queues[offset] != NULL) -- return rx_queues[offset]; -+ return rx_queues[queue_id]; -+ } - -- hns3_err(hw, "Detect rx_queues is NULL!\n"); - return NULL; - } - --/* -- * Note: caller must make sure queue_id < nb_queues -- * nb_queues = RTE_MAX(eth_dev->data->nb_rx_queues, -- * eth_dev->data->nb_tx_queues) -- */ - static struct hns3_tx_queue * --hns3_get_tx_queue(struct rte_eth_dev *dev, uint32_t queue_id) -+hns3_get_tx_queue(struct rte_eth_dev *dev) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -- uint32_t offset; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_tx_queue *txq; -+ uint32_t queue_id; - void **tx_queues; - -- if (queue_id < dev->data->nb_tx_queues) { -+ for (queue_id = 0; queue_id < dev->data->nb_tx_queues; queue_id++) { - tx_queues = dev->data->tx_queues; -- offset = queue_id; -- } else { -- /* -- * For kunpeng930, fake queue is not exist. But since the queues -- * are usually accessd in pairs, this branch may still exist. -- */ -- if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ if (tx_queues == NULL || tx_queues[queue_id] == NULL) { -+ hns3_err(hw, "detect tx_queues is NULL!\n"); - return NULL; -- tx_queues = hw->fkq_data.tx_queues; -- offset = queue_id - dev->data->nb_tx_queues; -- } -+ } - -- if (tx_queues != NULL && tx_queues[offset] != NULL) -- return tx_queues[offset]; -+ txq = (struct hns3_tx_queue *)tx_queues[queue_id]; -+ if (txq->tx_deferred_start) -+ continue; -+ -+ return tx_queues[queue_id]; -+ } - -- hns3_err(hw, "Detect tx_queues is NULL!\n"); - return NULL; - } - - static void - hns3_get_rxtx_fake_queue_info(FILE *file, struct rte_eth_dev *dev) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_rx_queue *rxq; - struct hns3_tx_queue *txq; -- uint32_t queue_id; -+ uint32_t queue_id = 0; -+ void **rx_queues; -+ void **tx_queues; - -- if (dev->data->nb_rx_queues != dev->data->nb_tx_queues && -- !hns3_dev_get_support(hw, INDEP_TXRX)) { -- queue_id = RTE_MIN(dev->data->nb_rx_queues, -- dev->data->nb_tx_queues); -- rxq = hns3_get_rx_queue(dev, queue_id); -- if (rxq == NULL) -+ if (hns3_dev_get_support(hw, INDEP_TXRX)) -+ return; -+ -+ if (dev->data->nb_rx_queues < dev->data->nb_tx_queues) { -+ rx_queues = hw->fkq_data.rx_queues; -+ if (rx_queues == NULL || rx_queues[queue_id] == NULL) { -+ hns3_err(hw, "detect rx_queues is NULL!\n"); - return; -- txq = hns3_get_tx_queue(dev, queue_id); -- if (txq == NULL) -+ } -+ rxq = (struct hns3_rx_queue *)rx_queues[queue_id]; -+ -+ fprintf(file, -+ "\t -- first fake_queue info:\n" -+ "\t Rx: port=%u nb_desc=%u free_thresh=%u\n", -+ rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh); -+ } else if (dev->data->nb_rx_queues > dev->data->nb_tx_queues) { -+ tx_queues = hw->fkq_data.tx_queues; -+ queue_id = 0; -+ -+ if (tx_queues == NULL || tx_queues[queue_id] == NULL) { -+ hns3_err(hw, "detect tx_queues is NULL!\n"); - return; -+ } -+ txq = (struct hns3_tx_queue *)tx_queues[queue_id]; -+ - fprintf(file, -- "\t -- first fake_queue rxtx info:\n" -- "\t Rx: port=%u nb_desc=%u free_thresh=%u\n" -- "\t Tx: port=%u nb_desc=%u\n", -- rxq->port_id, rxq->nb_rx_desc, rxq->rx_free_thresh, -+ "\t -- first fake_queue info:\n" -+ "\t Tx: port=%u nb_desc=%u\n", - txq->port_id, txq->nb_tx_desc); - } - } -@@ -321,7 +320,7 @@ static void - hns3_get_queue_enable_state(struct hns3_hw *hw, uint32_t *queue_state, - uint32_t nb_queues, bool is_rxq) - { --#define STATE_SIZE (sizeof(*queue_state) * CHAR_BIT) -+#define HNS3_QUEUE_NUM_PER_STATS (sizeof(*queue_state) * HNS3_UINT8_BIT) - uint32_t queue_en_reg; - uint32_t reg_offset; - uint32_t state; -@@ -334,28 +333,28 @@ hns3_get_queue_enable_state(struct hns3_hw *hw, uint32_t *queue_state, - if (hns3_dev_get_support(hw, INDEP_TXRX)) - state = state && hns3_read_dev(hw, reg_offset + - queue_en_reg); -- hns3_set_bit(queue_state[i / STATE_SIZE], -- i % STATE_SIZE, state); -+ hns3_set_bit(queue_state[i / HNS3_QUEUE_NUM_PER_STATS], -+ i % HNS3_QUEUE_NUM_PER_STATS, state); - } - } - - static void - hns3_print_queue_state_perline(FILE *file, const uint32_t *queue_state, -- uint32_t nb_queues, uint32_t line_num) -+ uint32_t nb_queues, uint32_t line_num) - { --#define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT) -- uint32_t qid = line_num * NUM_QUEUE_PER_LINE; -- uint32_t j; -+#define HNS3_NUM_QUEUE_PER_LINE (sizeof(*queue_state) * HNS3_UINT8_BIT) -+ uint32_t id = line_num * HNS3_NUM_QUEUE_PER_LINE; -+ uint32_t i; - -- for (j = 0; j < NUM_QUEUE_PER_LINE; j++) { -- fprintf(file, "%1lx", hns3_get_bit(queue_state[line_num], j)); -+ for (i = 0; i < HNS3_NUM_QUEUE_PER_LINE; i++) { -+ fprintf(file, "%1lx", hns3_get_bit(queue_state[line_num], i)); - -- if (qid % CHAR_BIT == CHAR_BIT - 1) { -+ if (id % HNS3_UINT8_BIT == HNS3_UINT8_BIT - 1) { - fprintf(file, "%s", -- j == NUM_QUEUE_PER_LINE - 1 ? "\n" : ":"); -+ i == HNS3_NUM_QUEUE_PER_LINE - 1 ? "\n" : ":"); - } -- qid++; -- if (qid >= nb_queues) { -+ id++; -+ if (id >= nb_queues) { - fprintf(file, "\n"); - break; - } -@@ -364,23 +363,17 @@ hns3_print_queue_state_perline(FILE *file, const uint32_t *queue_state, - - static void - hns3_display_queue_enable_state(FILE *file, const uint32_t *queue_state, -- uint32_t nb_queues, bool is_rxq) -+ uint32_t nb_queues, bool is_rxq) - { --#define NUM_QUEUE_PER_LINE (sizeof(*queue_state) * CHAR_BIT) -+#define HNS3_NUM_QUEUE_PER_LINE (sizeof(*queue_state) * HNS3_UINT8_BIT) - uint32_t i; - -- if (nb_queues == 0) { -- fprintf(file, "\t %s queue number is 0\n", -- is_rxq ? "Rx" : "Tx"); -- return; -- } -- - fprintf(file, "\t %s queue id | enable state bitMap\n", - is_rxq ? "Rx" : "Tx"); - -- for (i = 0; i < (nb_queues - 1) / NUM_QUEUE_PER_LINE + 1; i++) { -- uint32_t line_end = (i + 1) * NUM_QUEUE_PER_LINE - 1; -- uint32_t line_start = i * NUM_QUEUE_PER_LINE; -+ for (i = 0; i < (nb_queues - 1) / HNS3_NUM_QUEUE_PER_LINE + 1; i++) { -+ uint32_t line_end = (i + 1) * HNS3_NUM_QUEUE_PER_LINE - 1; -+ uint32_t line_start = i * HNS3_NUM_QUEUE_PER_LINE; - fprintf(file, "\t %04u - %04u | ", line_start, - nb_queues - 1 > line_end ? line_end : nb_queues - 1); - -@@ -391,16 +384,28 @@ hns3_display_queue_enable_state(FILE *file, const uint32_t *queue_state, - static void - hns3_get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev) - { --#define MAX_TQP_NUM 1280 --#define QUEUE_BITMAP_SIZE (MAX_TQP_NUM / 32) - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- uint32_t rx_queue_state[QUEUE_BITMAP_SIZE] = {0}; -- uint32_t tx_queue_state[QUEUE_BITMAP_SIZE] = {0}; -+ uint32_t *rx_queue_state; -+ uint32_t *tx_queue_state; - uint32_t nb_rx_queues; - uint32_t nb_tx_queues; -+ uint32_t bitmap_size; -+ -+ bitmap_size = (hw->tqps_num * sizeof(uint32_t) + HNS3_UINT32_BIT) / -+ HNS3_UINT32_BIT; -+ rx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); -+ tx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); - - nb_rx_queues = dev->data->nb_rx_queues; - nb_tx_queues = dev->data->nb_tx_queues; -+ if (nb_rx_queues == 0) { -+ fprintf(file, "\t -- Rx queue number is 0\n"); -+ return; -+ } -+ if (nb_tx_queues == 0) { -+ fprintf(file, "\t -- Tx queue number is 0\n"); -+ return; -+ } - - fprintf(file, "\t -- enable state:\n"); - hns3_get_queue_enable_state(hw, rx_queue_state, nb_rx_queues, true); -@@ -410,6 +415,8 @@ hns3_get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev) - hns3_get_queue_enable_state(hw, tx_queue_state, nb_tx_queues, false); - hns3_display_queue_enable_state(file, tx_queue_state, nb_tx_queues, - false); -+ rte_free(rx_queue_state); -+ rte_free(tx_queue_state); - } - - static void -@@ -417,12 +424,11 @@ hns3_get_rxtx_queue_info(FILE *file, struct rte_eth_dev *dev) - { - struct hns3_rx_queue *rxq; - struct hns3_tx_queue *txq; -- uint32_t queue_id = 0; - -- rxq = hns3_get_rx_queue(dev, queue_id); -+ rxq = hns3_get_rx_queue(dev); - if (rxq == NULL) - return; -- txq = hns3_get_tx_queue(dev, queue_id); -+ txq = hns3_get_tx_queue(dev); - if (txq == NULL) - return; - fprintf(file, " - Rx/Tx Queue Info:\n"); -@@ -462,8 +468,8 @@ hns3_get_vlan_rx_offload_cfg(FILE *file, struct hns3_hw *hw) - ret = hns3_cmd_send(hw, &desc, 1); - if (ret != 0) { - hns3_err(hw, -- "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!", -- ret, 1, rte_le_to_cpu_16(desc.opcode)); -+ "NIC firmware exec ret=%d optcode=0x%x!", ret, -+ rte_le_to_cpu_16(desc.opcode)); - return ret; - } - -@@ -551,7 +557,7 @@ hns3_get_vlan_tx_offload_cfg(FILE *file, struct hns3_hw *hw) - ret = hns3_cmd_send(hw, &desc, 1); - if (ret != 0) { - hns3_err(hw, -- "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!", -+ "NIC firmware exec ret=%d desc_num=%d optcode=0x%x!", - ret, 1, rte_le_to_cpu_16(desc.opcode)); - return ret; - } -@@ -564,8 +570,8 @@ hns3_get_vlan_tx_offload_cfg(FILE *file, struct hns3_hw *hw) - static void - hns3_get_port_pvid_info(FILE *file, struct hns3_hw *hw) - { -- fprintf(file, "\t -- pvid status: %s\n", -- hw->port_base_vlan_cfg.state ? "on" : "off"); -+ fprintf(file, " - pvid status: %s\n", -+ hw->port_base_vlan_cfg.state ? "On" : "Off"); - } - - static void -@@ -581,8 +587,6 @@ hns3_get_vlan_config_info(FILE *file, struct hns3_hw *hw) - ret = hns3_get_vlan_tx_offload_cfg(file, hw); - if (ret < 0) - return; -- -- hns3_get_port_pvid_info(file, hw); - } - - static void -@@ -592,7 +596,7 @@ hns3_get_tm_conf_shaper_info(FILE *file, struct hns3_tm_conf *conf) - &conf->shaper_profile_list; - struct hns3_tm_shaper_profile *shaper_profile; - -- if (!conf->nb_shaper_profile) -+ if (conf->nb_shaper_profile == 0) - return; - - fprintf(file, " shaper_profile:\n"); -@@ -608,7 +612,7 @@ hns3_get_tm_conf_shaper_info(FILE *file, struct hns3_tm_conf *conf) - static void - hns3_get_tm_conf_port_node_info(FILE *file, struct hns3_tm_conf *conf) - { -- if (!conf->root) -+ if (conf->root == NULL) - return; - - fprintf(file, -@@ -627,7 +631,7 @@ hns3_get_tm_conf_tc_node_info(FILE *file, struct hns3_tm_conf *conf) - struct hns3_tm_node *tm_node; - uint32_t tidx; - -- if (!conf->nb_tc_node) -+ if (conf->nb_tc_node == 0) - return; - - fprintf(file, " tc_node: \n"); -@@ -658,29 +662,28 @@ hns3_get_tm_conf_queue_format_info(FILE *file, struct hns3_tm_node **queue_node, - uint32_t *queue_node_tc, - uint32_t nb_tx_queues) - { --#define PERLINE_QUEUES 32 --#define PERLINE_STRIDE 8 --#define LINE_BUF_SIZE 1024 -- uint32_t i, j, line_num, start_queue, end_queue; -- char tmpbuf[LINE_BUF_SIZE] = {0}; -+#define HNS3_PERLINE_QUEUES 32 -+#define HNS3_PERLINE_STRIDE 8 -+ uint32_t i, j, line_num, start_queue_id, end_queue_id; - -- line_num = (nb_tx_queues + PERLINE_QUEUES - 1) / PERLINE_QUEUES; -+ line_num = (nb_tx_queues + HNS3_PERLINE_QUEUES - 1) / -+ HNS3_PERLINE_QUEUES; - for (i = 0; i < line_num; i++) { -- start_queue = i * PERLINE_QUEUES; -- end_queue = (i + 1) * PERLINE_QUEUES - 1; -- if (end_queue > nb_tx_queues - 1) -- end_queue = nb_tx_queues - 1; -- fprintf(file, " %04u - %04u | ", start_queue, end_queue); -- for (j = start_queue; j < nb_tx_queues; j++) { -- if (j >= end_queue + 1) -+ start_queue_id = i * HNS3_PERLINE_QUEUES; -+ end_queue_id = (i + 1) * HNS3_PERLINE_QUEUES - 1; -+ if (end_queue_id > nb_tx_queues - 1) -+ end_queue_id = nb_tx_queues - 1; -+ fprintf(file, " %04u - %04u | ", start_queue_id, -+ end_queue_id); -+ for (j = start_queue_id; j < nb_tx_queues; j++) { -+ if (j >= end_queue_id + 1) - break; -- if (j > start_queue && j % PERLINE_STRIDE == 0) -+ if (j > start_queue_id && j % HNS3_PERLINE_STRIDE == 0) - fprintf(file, ":"); - fprintf(file, "%u", - queue_node[j] ? queue_node_tc[j] : - HNS3_MAX_TC_NUM); - } -- fprintf(file, "%s\n", tmpbuf); - } - } - -@@ -694,7 +697,7 @@ hns3_get_tm_conf_queue_node_info(FILE *file, struct hns3_tm_conf *conf, - uint32_t queue_node_tc[nb_queue_node]; - struct hns3_tm_node *tm_node; - -- if (!conf->nb_queue_node) -+ if (conf->nb_queue_node == 0) - return; - - fprintf(file, -@@ -720,9 +723,13 @@ hns3_get_tm_conf_queue_node_info(FILE *file, struct hns3_tm_conf *conf, - static void - hns3_get_tm_conf_info(FILE *file, struct rte_eth_dev *dev) - { -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_pf *pf = HNS3_DEV_PRIVATE_TO_PF(dev->data->dev_private); - struct hns3_tm_conf *conf = &pf->tm_conf; - -+ if (!hns3_dev_get_support(hw, TM)) -+ return; -+ - fprintf(file, " - TM config info:\n"); - fprintf(file, - "\t -- nb_leaf_nodes_max=%u nb_nodes_max=%u\n" -@@ -826,8 +833,7 @@ hns3_get_link_fc_info(FILE *file, struct rte_eth_dev *dev) - static void - hns3_get_flow_ctrl_info(FILE *file, struct rte_eth_dev *dev) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - - fprintf(file, " - Flow Ctrl Info:\n"); - fprintf(file, -@@ -849,6 +855,7 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - hns3_get_device_basic_info(file, dev); - hns3_get_dev_feature_capability(file, hw); - hns3_get_rxtx_queue_info(file, dev); -+ hns3_get_port_pvid_info(file, hw); - - /* - * VF only supports dumping basic info, feaure capability and queue -diff --git a/drivers/net/hns3/hns3_dump.h b/drivers/net/hns3/hns3_dump.h -new file mode 100644 -index 0000000000..8ba7ee866a ---- /dev/null -+++ b/drivers/net/hns3/hns3_dump.h -@@ -0,0 +1,10 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(C) 2022 HiSilicon Limited -+ */ -+ -+#ifndef _HNS3_DUMP_H_ -+#define _HNS3_DUMP_H_ -+ -+int hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file); -+ -+#endif /* _HNS3_DUMP_H_ */ -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index cac6dd7755..dfc41d2a05 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -8,6 +8,7 @@ - - #include "hns3_ethdev.h" - #include "hns3_common.h" -+#include "hns3_dump.h" - #include "hns3_logs.h" - #include "hns3_rxtx.h" - #include "hns3_intr.h" -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index fd83bb7109..d6d82c55f9 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -874,7 +874,7 @@ struct hns3_adapter { - - #define HNS3_DEVARG_MBX_TIME_LIMIT_MS "mbx_time_limit_ms" - --enum { -+enum hns3_dev_cap { - HNS3_DEV_SUPPORT_DCB_B, - HNS3_DEV_SUPPORT_COPPER_B, - HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B, -@@ -1057,7 +1057,6 @@ int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts); - int hns3_timesync_write_time(struct rte_eth_dev *dev, - const struct timespec *ts); - int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); --int hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file); - - static inline bool - is_reset_pending(struct hns3_adapter *hns) -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index aee0c36360..92fbdb90cd 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -10,6 +10,7 @@ - - #include "hns3_ethdev.h" - #include "hns3_common.h" -+#include "hns3_dump.h" - #include "hns3_logs.h" - #include "hns3_rxtx.h" - #include "hns3_regs.h" --- -2.30.0 - diff --git a/0058-ethdev-fix-ethdev-version-map.patch b/0058-ethdev-fix-ethdev-version-map.patch deleted file mode 100644 index 05f1f9e..0000000 --- a/0058-ethdev-fix-ethdev-version-map.patch +++ /dev/null @@ -1,31 +0,0 @@ -From fe0c1c3ea1023ecece4bf5f5ef99a014fcb182b8 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Wed, 6 Apr 2022 09:29:30 +0800 -Subject: [PATCH 13/13] ethdev: fix ethdev version map - -This patch fix ethdev version map as new API introduced. - -Fixes: 2d2aea5495d1 ("ethdev: introduce dump API") - -Signed-off-by: Min Hu (Connor) ---- - lib/ethdev/version.map | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index c2fb0669a4..f29c60eda4 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -256,6 +256,9 @@ EXPERIMENTAL { - rte_flow_flex_item_create; - rte_flow_flex_item_release; - rte_flow_pick_transfer_proxy; -+ -+ # added in 22.03 -+ rte_eth_dev_priv_dump; - }; - - INTERNAL { --- -2.30.0 - diff --git a/0059-net-hns3-delete-simple-bd-cap.patch b/0059-net-hns3-delete-simple-bd-cap.patch deleted file mode 100644 index db030f3..0000000 --- a/0059-net-hns3-delete-simple-bd-cap.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b757a6bf3bef31517f3799fa5a0426e38da04a71 Mon Sep 17 00:00:00 2001 -From: Min Hu -Date: Wed, 6 Apr 2022 11:56:06 +0800 -Subject: [PATCH] net/hns3: delete simple bd cap - -This patch delete simple bd cap for dump as it has not been merged -in community. - -Signed-off-by: Min Hu ---- - drivers/net/hns3/hns3_dump.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 3a30a585c5..4b18bb647c 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -94,7 +94,6 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - {HNS3_DEV_SUPPORT_TX_PUSH_B, "TX PUSH"}, - {HNS3_DEV_SUPPORT_INDEP_TXRX_B, "INDEP TXRX"}, - {HNS3_DEV_SUPPORT_STASH_B, "STASH"}, -- {HNS3_DEV_SUPPORT_SIMPLE_BD_B, "SIMPLE BD"}, - {HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, "RXD Advanced Layout"}, - {HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, "OUTER UDP CKSUM"}, - {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, --- -2.30.0 - diff --git a/0060-net-hns3-fix-TM-info-dump.patch b/0060-net-hns3-fix-TM-info-dump.patch deleted file mode 100644 index 6ed0381..0000000 --- a/0060-net-hns3-fix-TM-info-dump.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 288da934034f84ab87b9e0d087db7e1e3c88bc8a Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 8 Apr 2022 11:27:04 +0800 -Subject: [PATCH] net/hns3: fix TM info dump - -This patch add newline characterat the end of TM info dump. - -Fixes: 761dfa44be2f ("net/hns3: dump TM configuration info") - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_dump.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 3a30a585c5..6ec3125b10 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -684,6 +684,7 @@ hns3_get_tm_conf_queue_format_info(FILE *file, struct hns3_tm_node **queue_node, - queue_node[j] ? queue_node_tc[j] : - HNS3_MAX_TC_NUM); - } -+ fprintf(file, "\n"); - } - } - --- -2.33.0 - diff --git a/0061-dma-hisilicon-support-Kunpeng-930.patch b/0061-dma-hisilicon-support-Kunpeng-930.patch deleted file mode 100644 index 4427fa9..0000000 --- a/0061-dma-hisilicon-support-Kunpeng-930.patch +++ /dev/null @@ -1,182 +0,0 @@ -From 0ac9cae2d0e1763cf884f0b5d735e4b57b6acb27 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 10:59:07 +0800 -Subject: [PATCH 01/25] dma/hisilicon: support Kunpeng 930 - -The Kunpeng930 DMA devices have the same PCI device id with Kunpeng920, -but with different PCI revision and register layout. This patch -introduces the basic initialization for Kunpeng930 DMA devices. - -Signed-off-by: Chengwen Feng ---- - doc/guides/dmadevs/hisilicon.rst | 1 + - drivers/dma/hisilicon/hisi_dmadev.c | 34 ++++++++++++++++++++++++++--- - drivers/dma/hisilicon/hisi_dmadev.h | 28 +++++++++++++++++++----- - 3 files changed, 54 insertions(+), 9 deletions(-) - -diff --git a/doc/guides/dmadevs/hisilicon.rst b/doc/guides/dmadevs/hisilicon.rst -index 191e56f2f7..81bf090311 100644 ---- a/doc/guides/dmadevs/hisilicon.rst -+++ b/doc/guides/dmadevs/hisilicon.rst -@@ -13,6 +13,7 @@ Supported Kunpeng SoCs - ---------------------- - - * Kunpeng 920 -+* Kunpeng 930 - - - Device Setup -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index 05066b4d0e..d4e08994a8 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -39,6 +39,8 @@ hisi_dma_queue_base(struct hisi_dma_dev *hw) - { - if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP08) - return HISI_DMA_HIP08_QUEUE_BASE; -+ else if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP09) -+ return HISI_DMA_HIP09_QUEUE_BASE; - else - return 0; - } -@@ -174,7 +176,7 @@ hisi_dma_reset_hw(struct hisi_dma_dev *hw) - } - - static void --hisi_dma_init_hw(struct hisi_dma_dev *hw) -+hisi_dma_init_common(struct hisi_dma_dev *hw) - { - hisi_dma_write_queue(hw, HISI_DMA_QUEUE_SQ_BASE_L_REG, - lower_32_bits(hw->sqe_iova)); -@@ -192,6 +194,12 @@ hisi_dma_init_hw(struct hisi_dma_dev *hw) - hisi_dma_write_queue(hw, HISI_DMA_QUEUE_ERR_INT_NUM0_REG, 0); - hisi_dma_write_queue(hw, HISI_DMA_QUEUE_ERR_INT_NUM1_REG, 0); - hisi_dma_write_queue(hw, HISI_DMA_QUEUE_ERR_INT_NUM2_REG, 0); -+} -+ -+static void -+hisi_dma_init_hw(struct hisi_dma_dev *hw) -+{ -+ hisi_dma_init_common(hw); - - if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP08) { - hisi_dma_write_queue(hw, HISI_DMA_HIP08_QUEUE_ERR_INT_NUM3_REG, -@@ -206,9 +214,27 @@ hisi_dma_init_hw(struct hisi_dma_dev *hw) - HISI_DMA_HIP08_QUEUE_CTRL0_ERR_ABORT_B, false); - hisi_dma_update_queue_mbit(hw, HISI_DMA_QUEUE_INT_STATUS_REG, - HISI_DMA_HIP08_QUEUE_INT_MASK_M, true); -- hisi_dma_update_queue_mbit(hw, -- HISI_DMA_HIP08_QUEUE_INT_MASK_REG, -+ hisi_dma_update_queue_mbit(hw, HISI_DMA_QUEUE_INT_MASK_REG, - HISI_DMA_HIP08_QUEUE_INT_MASK_M, true); -+ } else if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP09) { -+ hisi_dma_update_queue_mbit(hw, HISI_DMA_QUEUE_CTRL0_REG, -+ HISI_DMA_HIP09_QUEUE_CTRL0_ERR_ABORT_M, false); -+ hisi_dma_update_queue_mbit(hw, HISI_DMA_QUEUE_INT_STATUS_REG, -+ HISI_DMA_HIP09_QUEUE_INT_MASK_M, true); -+ hisi_dma_update_queue_mbit(hw, HISI_DMA_QUEUE_INT_MASK_REG, -+ HISI_DMA_HIP09_QUEUE_INT_MASK_M, true); -+ hisi_dma_update_queue_mbit(hw, -+ HISI_DMA_HIP09_QUEUE_ERR_INT_STATUS_REG, -+ HISI_DMA_HIP09_QUEUE_ERR_INT_MASK_M, true); -+ hisi_dma_update_queue_mbit(hw, -+ HISI_DMA_HIP09_QUEUE_ERR_INT_MASK_REG, -+ HISI_DMA_HIP09_QUEUE_ERR_INT_MASK_M, true); -+ hisi_dma_update_queue_bit(hw, HISI_DMA_QUEUE_CTRL1_REG, -+ HISI_DMA_HIP09_QUEUE_CTRL1_VA_ENABLE_B, true); -+ hisi_dma_update_bit(hw, -+ HISI_DMA_HIP09_QUEUE_CFG_REG(hw->queue_id), -+ HISI_DMA_HIP09_QUEUE_CFG_LINK_DOWN_MASK_B, -+ true); - } - } - -@@ -230,6 +256,8 @@ hisi_dma_reg_layout(uint8_t revision) - { - if (revision == HISI_DMA_REVISION_HIP08B) - return HISI_DMA_REG_LAYOUT_HIP08; -+ else if (revision >= HISI_DMA_REVISION_HIP09A) -+ return HISI_DMA_REG_LAYOUT_HIP09; - else - return HISI_DMA_REG_LAYOUT_INVALID; - } -diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h -index 12e209c86e..591aec0b32 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.h -+++ b/drivers/dma/hisilicon/hisi_dmadev.h -@@ -23,20 +23,22 @@ - #define HISI_DMA_DEVICE_ID 0xA122 - #define HISI_DMA_PCI_REVISION_ID_REG 0x08 - #define HISI_DMA_REVISION_HIP08B 0x21 -+#define HISI_DMA_REVISION_HIP09A 0x30 - - #define HISI_DMA_MAX_HW_QUEUES 4 - #define HISI_DMA_MAX_DESC_NUM 8192 - #define HISI_DMA_MIN_DESC_NUM 32 - - /** -- * The HIP08B(HiSilicon IP08) and later Chip(e.g. HiSilicon IP09) are DMA iEPs, -- * they have the same pci device id but with different pci revision. -- * Unfortunately, they have different register layouts, so the layout -+ * The HIP08B(HiSilicon IP08) and HIP09B(HiSilicon IP09) are DMA iEPs, they -+ * have the same pci device id but different pci revision. -+ * Unfortunately, they have different register layouts, so two layout - * enumerations are defined. - */ - enum { - HISI_DMA_REG_LAYOUT_INVALID = 0, -- HISI_DMA_REG_LAYOUT_HIP08 -+ HISI_DMA_REG_LAYOUT_HIP08, -+ HISI_DMA_REG_LAYOUT_HIP09 - }; - - /** -@@ -66,7 +68,7 @@ enum { - * calculated by: - * offset = queue-base + (queue-id * queue-region) + reg-offset-in-region. - * -- * The first part of queue region is basically the same for HIP08 and later chip -+ * The first part of queue region is basically the same for HIP08 and HIP09 - * register layouts, therefore, HISI_QUEUE_* registers are defined for it. - */ - #define HISI_DMA_QUEUE_SQ_BASE_L_REG 0x0 -@@ -85,6 +87,7 @@ enum { - #define HISI_DMA_QUEUE_FSM_REG 0x30 - #define HISI_DMA_QUEUE_FSM_STS_M GENMASK(3, 0) - #define HISI_DMA_QUEUE_INT_STATUS_REG 0x40 -+#define HISI_DMA_QUEUE_INT_MASK_REG 0x44 - #define HISI_DMA_QUEUE_ERR_INT_NUM0_REG 0x84 - #define HISI_DMA_QUEUE_ERR_INT_NUM1_REG 0x88 - #define HISI_DMA_QUEUE_ERR_INT_NUM2_REG 0x8C -@@ -95,7 +98,6 @@ enum { - */ - #define HISI_DMA_HIP08_QUEUE_BASE 0x0 - #define HISI_DMA_HIP08_QUEUE_CTRL0_ERR_ABORT_B 2 --#define HISI_DMA_HIP08_QUEUE_INT_MASK_REG 0x44 - #define HISI_DMA_HIP08_QUEUE_INT_MASK_M GENMASK(14, 0) - #define HISI_DMA_HIP08_QUEUE_ERR_INT_NUM3_REG 0x90 - #define HISI_DMA_HIP08_QUEUE_ERR_INT_NUM4_REG 0x94 -@@ -106,6 +108,20 @@ enum { - #define HISI_DMA_HIP08_DUMP_START_REG 0x2000 - #define HISI_DMA_HIP08_DUMP_END_REG 0x2280 - -+/** -+ * HiSilicon IP09 DMA register and field define: -+ */ -+#define HISI_DMA_HIP09_QUEUE_BASE 0x2000 -+#define HISI_DMA_HIP09_QUEUE_CTRL0_ERR_ABORT_M GENMASK(31, 28) -+#define HISI_DMA_HIP09_QUEUE_CTRL1_VA_ENABLE_B 2 -+#define HISI_DMA_HIP09_QUEUE_INT_MASK_M 0x1 -+#define HISI_DMA_HIP09_QUEUE_ERR_INT_STATUS_REG 0x48 -+#define HISI_DMA_HIP09_QUEUE_ERR_INT_MASK_REG 0x4C -+#define HISI_DMA_HIP09_QUEUE_ERR_INT_MASK_M GENMASK(18, 1) -+#define HISI_DMA_HIP09_QUEUE_CFG_REG(queue_id) (0x800 + \ -+ (queue_id) * 0x20) -+#define HISI_DMA_HIP09_QUEUE_CFG_LINK_DOWN_MASK_B 16 -+ - /** - * In fact, there are multiple states, but it need to pay attention to - * the following two states for the driver: --- -2.30.0 - diff --git a/0062-dma-hisilicon-support-error-handling-with-Kunpeng-93.patch b/0062-dma-hisilicon-support-error-handling-with-Kunpeng-93.patch deleted file mode 100644 index 3eefdcb..0000000 --- a/0062-dma-hisilicon-support-error-handling-with-Kunpeng-93.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 2265601837805a2fc70dd5935ffe3f2ccaec17d1 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 10:59:08 +0800 -Subject: [PATCH] dma/hisilicon: support error handling with Kunpeng 930 - -The Kunpeng930 DMA supports the capability of handles errors. - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index d4e08994a8..b99a9bce6c 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -328,11 +328,14 @@ hisi_dma_info_get(const struct rte_dma_dev *dev, - struct rte_dma_info *dev_info, - uint32_t info_sz) - { -- RTE_SET_USED(dev); -+ struct hisi_dma_dev *hw = dev->data->dev_private; - RTE_SET_USED(info_sz); - - dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | - RTE_DMA_CAPA_OPS_COPY; -+ if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP09) -+ dev_info->dev_capa |= RTE_DMA_CAPA_HANDLES_ERRORS; -+ - dev_info->max_vchans = 1; - dev_info->max_desc = HISI_DMA_MAX_DESC_NUM; - dev_info->min_desc = HISI_DMA_MIN_DESC_NUM; --- -2.33.0 - diff --git a/0063-dma-hisilicon-support-registers-dump-for-Kunpeng-930.patch b/0063-dma-hisilicon-support-registers-dump-for-Kunpeng-930.patch deleted file mode 100644 index 6ff5fea..0000000 --- a/0063-dma-hisilicon-support-registers-dump-for-Kunpeng-930.patch +++ /dev/null @@ -1,112 +0,0 @@ -From dd69081182fae0a65606e8d8b509aa46795b7cfa Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 10:59:09 +0800 -Subject: [PATCH] dma/hisilicon: support registers dump for Kunpeng 930 - -This patch supports dump Kunpeng930 DMA registers. - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 54 +++++++++++++++++++---------- - drivers/dma/hisilicon/hisi_dmadev.h | 8 +++++ - 2 files changed, 44 insertions(+), 18 deletions(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index b99a9bce6c..3917db38b7 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -460,29 +460,13 @@ hisi_dma_stats_reset(struct rte_dma_dev *dev, uint16_t vchan) - } - - static void --hisi_dma_get_dump_range(struct hisi_dma_dev *hw, uint32_t *start, uint32_t *end) --{ -- if (hw->reg_layout == HISI_DMA_REG_LAYOUT_HIP08) { -- *start = HISI_DMA_HIP08_DUMP_START_REG; -- *end = HISI_DMA_HIP08_DUMP_END_REG; -- } else { -- *start = 0; -- *end = 0; -- } --} -- --static void --hisi_dma_dump_common(struct hisi_dma_dev *hw, FILE *f) -+hisi_dma_dump_range(struct hisi_dma_dev *hw, FILE *f, uint32_t start, -+ uint32_t end) - { - #define DUMP_REGNUM_PER_LINE 4 - -- uint32_t start, end; - uint32_t cnt, i; - -- hisi_dma_get_dump_range(hw, &start, &end); -- -- (void)fprintf(f, " common-register:\n"); -- - cnt = 0; - for (i = start; i <= end; i += sizeof(uint32_t)) { - if (cnt % DUMP_REGNUM_PER_LINE == 0) -@@ -496,6 +480,40 @@ hisi_dma_dump_common(struct hisi_dma_dev *hw, FILE *f) - (void)fprintf(f, "\n"); - } - -+static void -+hisi_dma_dump_common(struct hisi_dma_dev *hw, FILE *f) -+{ -+ struct { -+ uint8_t reg_layout; -+ uint32_t start; -+ uint32_t end; -+ } reg_info[] = { -+ { HISI_DMA_REG_LAYOUT_HIP08, -+ HISI_DMA_HIP08_DUMP_START_REG, -+ HISI_DMA_HIP08_DUMP_END_REG }, -+ { HISI_DMA_REG_LAYOUT_HIP09, -+ HISI_DMA_HIP09_DUMP_REGION_A_START_REG, -+ HISI_DMA_HIP09_DUMP_REGION_A_END_REG }, -+ { HISI_DMA_REG_LAYOUT_HIP09, -+ HISI_DMA_HIP09_DUMP_REGION_B_START_REG, -+ HISI_DMA_HIP09_DUMP_REGION_B_END_REG }, -+ { HISI_DMA_REG_LAYOUT_HIP09, -+ HISI_DMA_HIP09_DUMP_REGION_C_START_REG, -+ HISI_DMA_HIP09_DUMP_REGION_C_END_REG }, -+ { HISI_DMA_REG_LAYOUT_HIP09, -+ HISI_DMA_HIP09_DUMP_REGION_D_START_REG, -+ HISI_DMA_HIP09_DUMP_REGION_D_END_REG }, -+ }; -+ uint32_t i; -+ -+ (void)fprintf(f, " common-register:\n"); -+ for (i = 0; i < RTE_DIM(reg_info); i++) { -+ if (hw->reg_layout != reg_info[i].reg_layout) -+ continue; -+ hisi_dma_dump_range(hw, f, reg_info[i].start, reg_info[i].end); -+ } -+} -+ - static void - hisi_dma_dump_read_queue(struct hisi_dma_dev *hw, uint32_t qoff, - char *buffer, int max_sz) -diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h -index 591aec0b32..1eaa822db1 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.h -+++ b/drivers/dma/hisilicon/hisi_dmadev.h -@@ -121,6 +121,14 @@ enum { - #define HISI_DMA_HIP09_QUEUE_CFG_REG(queue_id) (0x800 + \ - (queue_id) * 0x20) - #define HISI_DMA_HIP09_QUEUE_CFG_LINK_DOWN_MASK_B 16 -+#define HISI_DMA_HIP09_DUMP_REGION_A_START_REG 0x0 -+#define HISI_DMA_HIP09_DUMP_REGION_A_END_REG 0x368 -+#define HISI_DMA_HIP09_DUMP_REGION_B_START_REG 0x800 -+#define HISI_DMA_HIP09_DUMP_REGION_B_END_REG 0xA08 -+#define HISI_DMA_HIP09_DUMP_REGION_C_START_REG 0x1800 -+#define HISI_DMA_HIP09_DUMP_REGION_C_END_REG 0x1A4C -+#define HISI_DMA_HIP09_DUMP_REGION_D_START_REG 0x1C00 -+#define HISI_DMA_HIP09_DUMP_REGION_D_END_REG 0x1CC4 - - /** - * In fact, there are multiple states, but it need to pay attention to --- -2.33.0 - diff --git a/0064-dma-hisilicon-add-queue-full-statistics.patch b/0064-dma-hisilicon-add-queue-full-statistics.patch deleted file mode 100644 index 8ef63af..0000000 --- a/0064-dma-hisilicon-add-queue-full-statistics.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 410c9bc8354b4cccc3ae56608ca5f89f03e53cb3 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 10:59:10 +0800 -Subject: [PATCH] dma/hisilicon: add queue full statistics - -This patch adds queue full statistics for HiSilicon DMA PMD. - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 12 ++++++++---- - drivers/dma/hisilicon/hisi_dmadev.h | 1 + - 2 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index 3917db38b7..c36acf01be 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -407,6 +407,7 @@ hisi_dma_start(struct rte_dma_dev *dev) - hw->submitted = 0; - hw->completed = 0; - hw->errors = 0; -+ hw->qfulls = 0; - - hisi_dma_update_queue_bit(hw, HISI_DMA_QUEUE_CTRL0_REG, - HISI_DMA_QUEUE_CTRL0_EN_B, true); -@@ -455,6 +456,7 @@ hisi_dma_stats_reset(struct rte_dma_dev *dev, uint16_t vchan) - hw->submitted = 0; - hw->completed = 0; - hw->errors = 0; -+ hw->qfulls = 0; - - return 0; - } -@@ -566,14 +568,14 @@ hisi_dma_dump(const struct rte_dma_dev *dev, FILE *f) - " ridx: %u cridx: %u\n" - " sq_head: %u sq_tail: %u cq_sq_head: %u\n" - " cq_head: %u cqs_completed: %u cqe_vld: %u\n" -- " submitted: %" PRIu64 " completed: %" PRIu64 " errors %" -- PRIu64"\n", -+ " submitted: %" PRIu64 " completed: %" PRIu64 " errors: %" -+ PRIu64 " qfulls: %" PRIu64 "\n", - hw->revision, hw->queue_id, - hw->sq_depth_mask > 0 ? hw->sq_depth_mask + 1 : 0, - hw->ridx, hw->cridx, - hw->sq_head, hw->sq_tail, hw->cq_sq_head, - hw->cq_head, hw->cqs_completed, hw->cqe_vld, -- hw->submitted, hw->completed, hw->errors); -+ hw->submitted, hw->completed, hw->errors, hw->qfulls); - hisi_dma_dump_queue(hw, f); - hisi_dma_dump_common(hw, f); - -@@ -590,8 +592,10 @@ hisi_dma_copy(void *dev_private, uint16_t vchan, - - RTE_SET_USED(vchan); - -- if (((hw->sq_tail + 1) & hw->sq_depth_mask) == hw->sq_head) -+ if (((hw->sq_tail + 1) & hw->sq_depth_mask) == hw->sq_head) { -+ hw->qfulls++; - return -ENOSPC; -+ } - - sqe->dw0 = rte_cpu_to_le_32(SQE_OPCODE_M2M); - sqe->dw1 = 0; -diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h -index 1eaa822db1..90b85322ca 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.h -+++ b/drivers/dma/hisilicon/hisi_dmadev.h -@@ -241,6 +241,7 @@ struct hisi_dma_dev { - uint64_t submitted; - uint64_t completed; - uint64_t errors; -+ uint64_t qfulls; - - /** - * The following fields are not accessed in the I/O path, so they are --- -2.33.0 - diff --git a/0065-dma-hisilicon-use-common-PCI-device-naming.patch b/0065-dma-hisilicon-use-common-PCI-device-naming.patch deleted file mode 100644 index 7dffe6f..0000000 --- a/0065-dma-hisilicon-use-common-PCI-device-naming.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 033904450b1d52fd3d09e2bb53e529e3ba0ecf77 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 10:59:11 +0800 -Subject: [PATCH] dma/hisilicon: use common PCI device naming - -For DMA device 0000:7d:0.0, the original generated dmadev name starts -with the "7d:0.0", which is not expected. -This patch uses rte_pci_device_name API to generates the dmadev name. - -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - doc/guides/dmadevs/hisilicon.rst | 4 ++-- - drivers/dma/hisilicon/hisi_dmadev.c | 23 +++++++---------------- - 2 files changed, 9 insertions(+), 18 deletions(-) - -diff --git a/doc/guides/dmadevs/hisilicon.rst b/doc/guides/dmadevs/hisilicon.rst -index 81bf090311..8c1f0f8886 100644 ---- a/doc/guides/dmadevs/hisilicon.rst -+++ b/doc/guides/dmadevs/hisilicon.rst -@@ -30,8 +30,8 @@ which can be accessed using API from the ``rte_dmadev`` library. - - The name of the ``dmadev`` created is like "B:D.F-chX", e.g. DMA 0000:7b:00.0 - will create four ``dmadev``, --the 1st ``dmadev`` name is "7b:00.0-ch0", --and the 2nd ``dmadev`` name is "7b:00.0-ch1". -+the 1st ``dmadev`` name is "0000:7b:00.0-ch0", -+and the 2nd ``dmadev`` name is "0000:7b:00.0-ch1". - - Device Configuration - ~~~~~~~~~~~~~~~~~~~~~ -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index c36acf01be..9cef2cbfbe 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -784,24 +784,15 @@ hisi_dma_burst_capacity(const void *dev_private, uint16_t vchan) - sq_head - 1 - sq_tail; - } - --static void --hisi_dma_gen_pci_device_name(const struct rte_pci_device *pci_dev, -- char *name, size_t size) --{ -- memset(name, 0, size); -- (void)snprintf(name, size, "%x:%x.%x", -- pci_dev->addr.bus, pci_dev->addr.devid, -- pci_dev->addr.function); --} -- - static void - hisi_dma_gen_dev_name(const struct rte_pci_device *pci_dev, -- uint8_t queue_id, char *name, size_t size) -+ uint8_t queue_id, char *dev_name, size_t size) - { -- memset(name, 0, size); -- (void)snprintf(name, size, "%x:%x.%x-ch%u", -- pci_dev->addr.bus, pci_dev->addr.devid, -- pci_dev->addr.function, queue_id); -+ char name[RTE_DEV_NAME_MAX_LEN] = { 0 }; -+ -+ memset(dev_name, 0, size); -+ rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); -+ (void)snprintf(dev_name, size, "%s-ch%u", name, queue_id); - } - - /** -@@ -917,7 +908,7 @@ hisi_dma_probe(struct rte_pci_driver *pci_drv __rte_unused, - uint8_t i; - int ret; - -- hisi_dma_gen_pci_device_name(pci_dev, name, sizeof(name)); -+ rte_pci_device_name(&pci_dev->addr, name, sizeof(name)); - - if (pci_dev->mem_resource[2].addr == NULL) { - HISI_DMA_LOG(ERR, "%s BAR2 is NULL!\n", name); --- -2.33.0 - diff --git a/0066-app-testpmd-check-starting-port-is-not-in-bonding.patch b/0066-app-testpmd-check-starting-port-is-not-in-bonding.patch deleted file mode 100644 index a9f5f53..0000000 --- a/0066-app-testpmd-check-starting-port-is-not-in-bonding.patch +++ /dev/null @@ -1,38 +0,0 @@ -From d8c079a572f3b76ca22fbfe665fb2e5e578ba881 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Thu, 17 Feb 2022 19:36:55 +0800 -Subject: [PATCH] app/testpmd: check starting port is not in bonding - -In bond, start or stop slave port should be operated by bonding port. -This patch add port_is_bonding_slave in start_port function. - -Fixes: 0e545d3047fe ("app/testpmd: check stopping port is not in bonding") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/testpmd.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index 6d2e52c790..fe2ce19f99 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -2726,6 +2726,13 @@ start_port(portid_t pid) - if (pid != pi && pid != (portid_t)RTE_PORT_ALL) - continue; - -+ if (port_is_bonding_slave(pi)) { -+ fprintf(stderr, -+ "Please remove port %d from bonded device.\n", -+ pi); -+ continue; -+ } -+ - need_check_link_status = 0; - port = &ports[pi]; - if (port->port_status == RTE_PORT_STOPPED) --- -2.33.0 - diff --git a/0067-examples-vhost-remove-DMA-type-option-help-info.patch b/0067-examples-vhost-remove-DMA-type-option-help-info.patch deleted file mode 100644 index 42606cc..0000000 --- a/0067-examples-vhost-remove-DMA-type-option-help-info.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 73d16d660b866aa209dcdc44a698427dac5f2eb7 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 17 Feb 2022 11:24:51 +0800 -Subject: [PATCH] examples/vhost: remove DMA type option help info - -The dma-type parameter was not supported when dmadev was -integrated in vhost, but the help info still exists. This -patch deletes it. - -Fixes: 53d3f4778c1d ("vhost: integrate dmadev in asynchronous data-path") - -Signed-off-by: Chengwen Feng -Reviewed-by: Chenbo Xia ---- - examples/vhost/main.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/examples/vhost/main.c b/examples/vhost/main.c -index 3e784f5c6f..68afd398bb 100644 ---- a/examples/vhost/main.c -+++ b/examples/vhost/main.c -@@ -608,7 +608,6 @@ us_vhost_usage(const char *prgname) - " --tx-csum [0|1] disable/enable TX checksum offload.\n" - " --tso [0|1] disable/enable TCP segment offload.\n" - " --client register a vhost-user socket as client mode.\n" -- " --dma-type register dma type for your vhost async driver. For example \"ioat\" for now.\n" - " --dmas register dma channel for specific vhost device.\n", - prgname); - } --- -2.33.0 - diff --git a/0068-kni-fix-freeing-order-in-device-release.patch b/0068-kni-fix-freeing-order-in-device-release.patch deleted file mode 100644 index c237f65..0000000 --- a/0068-kni-fix-freeing-order-in-device-release.patch +++ /dev/null @@ -1,169 +0,0 @@ -From d57f2899e29a74fffeb876863e1f570084d6437b Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 9 Feb 2022 15:35:25 +0800 -Subject: [PATCH] kni: fix freeing order in device release - -The "kni_dev" is the private data of the "net_device" in kni, and allocated -with the "net_device" by calling "alloc_netdev()". The "net_device" is -freed by calling "free_netdev()" when kni release. The freed memory -includes the "kni_dev". So after "kni_dev" should not be accessed after -"net_device" is released. - -Fixes: e77fec694936 ("kni: fix possible mbuf leaks and speed up port release") -Cc: stable@dpdk.org - -KASAN trace: - -[ 85.263717] ========================================================== -[ 85.264418] BUG: KASAN: use-after-free in kni_net_release_fifo_phy+ - 0x30/0x84 [rte_kni] -[ 85.265139] Read of size 8 at addr ffff000260668d60 by task kni/341 -[ 85.265703] -[ 85.265857] CPU: 0 PID: 341 Comm: kni Tainted: G U O - 5.15.0-rc4+ #1 -[ 85.266525] Hardware name: linux,dummy-virt (DT) -[ 85.266968] Call trace: -[ 85.267220] dump_backtrace+0x0/0x2d0 -[ 85.267591] show_stack+0x24/0x30 -[ 85.267924] dump_stack_lvl+0x8c/0xb8 -[ 85.268294] print_address_description.constprop.0+0x74/0x2b8 -[ 85.268855] kasan_report+0x1e4/0x200 -[ 85.269224] __asan_load8+0x98/0xd4 -[ 85.269577] kni_net_release_fifo_phy+0x30/0x84 [rte_kni] -[ 85.270116] kni_dev_remove.isra.0+0x50/0x64 [rte_kni] -[ 85.270630] kni_ioctl_release+0x254/0x320 [rte_kni] -[ 85.271136] kni_ioctl+0x64/0xb0 [rte_kni] -[ 85.271553] __arm64_sys_ioctl+0xdc/0x120 -[ 85.271955] invoke_syscall+0x68/0x1a0 -[ 85.272332] el0_svc_common.constprop.0+0x90/0x200 -[ 85.272807] do_el0_svc+0x94/0xa4 -[ 85.273144] el0_svc+0x78/0x240 -[ 85.273463] el0t_64_sync_handler+0x1a8/0x1b0 -[ 85.273895] el0t_64_sync+0x1a0/0x1a4 -[ 85.274264] -[ 85.274427] Allocated by task 341: -[ 85.274767] kasan_save_stack+0x2c/0x60 -[ 85.275157] __kasan_kmalloc+0x90/0xb4 -[ 85.275533] __kmalloc_node+0x230/0x594 -[ 85.275917] kvmalloc_node+0x8c/0x190 -[ 85.276286] alloc_netdev_mqs+0x70/0x6b0 -[ 85.276678] kni_ioctl_create+0x224/0xf40 [rte_kni] -[ 85.277166] kni_ioctl+0x9c/0xb0 [rte_kni] -[ 85.277581] __arm64_sys_ioctl+0xdc/0x120 -[ 85.277980] invoke_syscall+0x68/0x1a0 -[ 85.278357] el0_svc_common.constprop.0+0x90/0x200 -[ 85.278830] do_el0_svc+0x94/0xa4 -[ 85.279172] el0_svc+0x78/0x240 -[ 85.279491] el0t_64_sync_handler+0x1a8/0x1b0 -[ 85.279925] el0t_64_sync+0x1a0/0x1a4 -[ 85.280292] -[ 85.280454] Freed by task 341: -[ 85.280763] kasan_save_stack+0x2c/0x60 -[ 85.281147] kasan_set_track+0x2c/0x40 -[ 85.281522] kasan_set_free_info+0x2c/0x50 -[ 85.281930] __kasan_slab_free+0xdc/0x140 -[ 85.282331] slab_free_freelist_hook+0x90/0x250 -[ 85.282782] kfree+0x128/0x580 -[ 85.283099] kvfree+0x48/0x60 -[ 85.283402] netdev_freemem+0x34/0x44 -[ 85.283770] netdev_release+0x50/0x64 -[ 85.284138] device_release+0xa0/0x120 -[ 85.284516] kobject_put+0xf8/0x160 -[ 85.284867] put_device+0x20/0x30 -[ 85.285204] free_netdev+0x22c/0x310 -[ 85.285562] kni_dev_remove.isra.0+0x48/0x64 [rte_kni] -[ 85.286076] kni_ioctl_release+0x254/0x320 [rte_kni] -[ 85.286573] kni_ioctl+0x64/0xb0 [rte_kni] -[ 85.286992] __arm64_sys_ioctl+0xdc/0x120 -[ 85.287392] invoke_syscall+0x68/0x1a0 -[ 85.287769] el0_svc_common.constprop.0+0x90/0x200 -[ 85.288243] do_el0_svc+0x94/0xa4 -[ 85.288579] el0_svc+0x78/0x240 -[ 85.288899] el0t_64_sync_handler+0x1a8/0x1b0 -[ 85.289332] el0t_64_sync+0x1a0/0x1a4 -[ 85.289699] -[ 85.289862] The buggy address belongs to the object at ffff000260668000 -[ 85.289862] which belongs to the cache kmalloc-cg-8k of size 8192 -[ 85.291079] The buggy address is located 3424 bytes inside of -[ 85.291079] 8192-byte region [ffff000260668000, ffff00026066a000) -[ 85.292213] The buggy address belongs to the page: -[ 85.292684] page:(____ptrval____) refcount:1 mapcount:0 mapping: - 0000000000000000 index:0x0 pfn:0x2a0668 -[ 85.293585] head:(____ptrval____) order:3 compound_mapcount:0 - compound_pincount:0 -[ 85.294305] flags: 0xbfff80000010200(slab|head|node=0|zone=2| - lastcpupid=0x7fff) -[ 85.295020] raw: 0bfff80000010200 0000000000000000 dead000000000122 - ffff0000c000d680 -[ 85.295767] raw: 0000000000000000 0000000080020002 00000001ffffffff - 0000000000000000 -[ 85.296512] page dumped because: kasan: bad access detected -[ 85.297054] -[ 85.297217] Memory state around the buggy address: -[ 85.297688] ffff000260668c00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb - fb fb -[ 85.298384] ffff000260668c80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb - fb fb -[ 85.299088] >ffff000260668d00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb - fb fb -[ 85.299781] ^ -[ 85.300396] ffff000260668d80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb - fb fb -[ 85.301092] ffff000260668e00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb - fb fb -[ 85.301787] =========================================================== - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Acked-by: Ferruh Yigit ---- - kernel/linux/kni/kni_misc.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c -index ec70190042..780187d8bf 100644 ---- a/kernel/linux/kni/kni_misc.c -+++ b/kernel/linux/kni/kni_misc.c -@@ -182,13 +182,17 @@ kni_dev_remove(struct kni_dev *dev) - if (!dev) - return -ENODEV; - -+ /* -+ * The memory of kni device is allocated and released together -+ * with net device. Release mbuf before freeing net device. -+ */ -+ kni_net_release_fifo_phy(dev); -+ - if (dev->net_dev) { - unregister_netdev(dev->net_dev); - free_netdev(dev->net_dev); - } - -- kni_net_release_fifo_phy(dev); -- - return 0; - } - -@@ -218,8 +222,8 @@ kni_release(struct inode *inode, struct file *file) - dev->pthread = NULL; - } - -- kni_dev_remove(dev); - list_del(&dev->list); -+ kni_dev_remove(dev); - } - up_write(&knet->kni_list_lock); - -@@ -468,8 +472,8 @@ kni_ioctl_release(struct net *net, uint32_t ioctl_num, - dev->pthread = NULL; - } - -- kni_dev_remove(dev); - list_del(&dev->list); -+ kni_dev_remove(dev); - ret = 0; - break; - } --- -2.33.0 - diff --git a/0069-net-hns3-remove-duplicate-macro-definition.patch b/0069-net-hns3-remove-duplicate-macro-definition.patch deleted file mode 100644 index 96dcbb8..0000000 --- a/0069-net-hns3-remove-duplicate-macro-definition.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 0983cdc1870f52a360eadb40eab84b34c20b464d Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Mon, 28 Feb 2022 11:21:41 +0800 -Subject: [PATCH] net/hns3: remove duplicate macro definition - -This patch fixes duplicate macro definition of HNS3_RSS_CFG_TBL_SIZE. - -Fixes: 737f30e1c3ab ("net/hns3: support command interface with firmware") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_cmd.h | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 81bc9e9d98..f9addc6069 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -603,7 +603,6 @@ struct hns3_cfg_gro_status_cmd { - - #define HNS3_RSS_HASH_KEY_OFFSET_B 4 - --#define HNS3_RSS_CFG_TBL_SIZE 16 - #define HNS3_RSS_HASH_KEY_NUM 16 - /* Configure the algorithm mode and Hash Key, opcode:0x0D01 */ - struct hns3_rss_generic_config_cmd { --- -2.33.0 - diff --git a/0070-net-hns3-fix-RSS-TC-mode-entry.patch b/0070-net-hns3-fix-RSS-TC-mode-entry.patch deleted file mode 100644 index bf53c80..0000000 --- a/0070-net-hns3-fix-RSS-TC-mode-entry.patch +++ /dev/null @@ -1,35 +0,0 @@ -From cdb9a7ae5f8f3b59b6de9dc2b52387636245e3a5 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 28 Feb 2022 11:21:45 +0800 -Subject: [PATCH] net/hns3: fix RSS TC mode entry - -The driver allocates queues only to valid TCs. But the driver also -configure queues for invalid TCs, which is unreasonable. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rss.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 1782d63883..ebf3c60f07 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -601,8 +601,8 @@ hns3_set_rss_tc_mode(struct hns3_hw *hw) - - for (i = 0; i < HNS3_MAX_TC_NUM; i++) { - tc_valid[i] = !!(hw->hw_tc_map & BIT(i)); -- tc_size[i] = roundup_size; -- tc_offset[i] = rss_size * i; -+ tc_size[i] = tc_valid[i] ? roundup_size : 0; -+ tc_offset[i] = tc_valid[i] ? rss_size * i : 0; - } - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_TC_MODE, false); --- -2.33.0 - diff --git a/0071-net-hns3-fix-VF-RSS-TC-mode-entry.patch b/0071-net-hns3-fix-VF-RSS-TC-mode-entry.patch deleted file mode 100644 index cb318b5..0000000 --- a/0071-net-hns3-fix-VF-RSS-TC-mode-entry.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 87f9628e2c786dff500139baf59720693e46b0bc Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 28 Feb 2022 11:21:46 +0800 -Subject: [PATCH] net/hns3: fix VF RSS TC mode entry - -For packets with VLAN priorities destined for the VF, hardware still -assign Rx queue based on the Up-to-TC mapping PF configured. But VF has -only one TC. If other TC don't enable, it causes that the priority -packets that aren't destined for TC0 aren't received by RSS hash but is -destined for queue 0. So driver has to enable the unused TC by using TC0 -queue mapping configuration. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rss.c | 56 +++++++++++++++++++++++++++---------- - 1 file changed, 41 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index ebf3c60f07..1493b10f96 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -578,33 +578,59 @@ hns3_dev_rss_reta_query(struct rte_eth_dev *dev, - return 0; - } - --/* -- * Used to configure the tc_size and tc_offset. -- */ -+static void -+hns3_set_rss_tc_mode_entry(struct hns3_hw *hw, uint8_t *tc_valid, -+ uint16_t *tc_size, uint16_t *tc_offset, -+ uint8_t tc_num) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ uint16_t rss_size = hw->alloc_rss_size; -+ uint16_t roundup_size; -+ uint16_t i; -+ -+ roundup_size = roundup_pow_of_two(rss_size); -+ roundup_size = ilog2(roundup_size); -+ -+ for (i = 0; i < tc_num; i++) { -+ if (hns->is_vf) { -+ /* -+ * For packets with VLAN priorities destined for the VF, -+ * hardware still assign Rx queue based on the Up-to-TC -+ * mapping PF configured. But VF has only one TC. If -+ * other TC don't enable, it causes that the priority -+ * packets that aren't destined for TC0 aren't received -+ * by RSS hash but is destined for queue 0. So driver -+ * has to enable the unused TC by using TC0 queue -+ * mapping configuration. -+ */ -+ tc_valid[i] = (hw->hw_tc_map & BIT(i)) ? -+ !!(hw->hw_tc_map & BIT(i)) : 1; -+ tc_size[i] = roundup_size; -+ tc_offset[i] = (hw->hw_tc_map & BIT(i)) ? -+ rss_size * i : 0; -+ } else { -+ tc_valid[i] = !!(hw->hw_tc_map & BIT(i)); -+ tc_size[i] = tc_valid[i] ? roundup_size : 0; -+ tc_offset[i] = tc_valid[i] ? rss_size * i : 0; -+ } -+ } -+} -+ - static int - hns3_set_rss_tc_mode(struct hns3_hw *hw) - { -- uint16_t rss_size = hw->alloc_rss_size; - struct hns3_rss_tc_mode_cmd *req; - uint16_t tc_offset[HNS3_MAX_TC_NUM]; - uint8_t tc_valid[HNS3_MAX_TC_NUM]; - uint16_t tc_size[HNS3_MAX_TC_NUM]; - struct hns3_cmd_desc desc; -- uint16_t roundup_size; - uint16_t i; - int ret; - -- req = (struct hns3_rss_tc_mode_cmd *)desc.data; -- -- roundup_size = roundup_pow_of_two(rss_size); -- roundup_size = ilog2(roundup_size); -- -- for (i = 0; i < HNS3_MAX_TC_NUM; i++) { -- tc_valid[i] = !!(hw->hw_tc_map & BIT(i)); -- tc_size[i] = tc_valid[i] ? roundup_size : 0; -- tc_offset[i] = tc_valid[i] ? rss_size * i : 0; -- } -+ hns3_set_rss_tc_mode_entry(hw, tc_valid, tc_size, -+ tc_offset, HNS3_MAX_TC_NUM); - -+ req = (struct hns3_rss_tc_mode_cmd *)desc.data; - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_TC_MODE, false); - for (i = 0; i < HNS3_MAX_TC_NUM; i++) { - uint16_t mode = 0; --- -2.33.0 - diff --git a/0072-net-hns3-increase-time-waiting-for-PF-reset-completi.patch b/0072-net-hns3-increase-time-waiting-for-PF-reset-completi.patch deleted file mode 100644 index 462c7fd..0000000 --- a/0072-net-hns3-increase-time-waiting-for-PF-reset-completi.patch +++ /dev/null @@ -1,51 +0,0 @@ -From d6a9f8fb26b8d6adaac20d6a303faa5c5ba4d5bc Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 2 Mar 2022 08:35:01 +0800 -Subject: [PATCH] net/hns3: increase time waiting for PF reset completion - -On the case that PF and VF need to be reset, after the hardware reset is -complete, VF needs wait for 1 second to restore the configuration so -that VF does not fail to recover because PF reset isn't complete. But -the estimated time is not sufficient. This patch fixes it to 5 seconds. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev_vf.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 06ddf64184..9091706fe5 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1877,6 +1877,7 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns) - static int - hns3vf_wait_hardware_ready(struct hns3_adapter *hns) - { -+#define HNS3_WAIT_PF_RESET_READY_TIME 5 - struct hns3_hw *hw = &hns->hw; - struct hns3_wait_data *wait_data = hw->reset.wait_data; - struct timeval tv; -@@ -1897,12 +1898,14 @@ hns3vf_wait_hardware_ready(struct hns3_adapter *hns) - return 0; - - wait_data->check_completion = NULL; -- wait_data->interval = 1 * MSEC_PER_SEC * USEC_PER_MSEC; -+ wait_data->interval = HNS3_WAIT_PF_RESET_READY_TIME * -+ MSEC_PER_SEC * USEC_PER_MSEC; - wait_data->count = 1; - wait_data->result = HNS3_WAIT_REQUEST; - rte_eal_alarm_set(wait_data->interval, hns3_wait_callback, - wait_data); -- hns3_warn(hw, "hardware is ready, delay 1 sec for PF reset complete"); -+ hns3_warn(hw, "hardware is ready, delay %d sec for PF reset complete", -+ HNS3_WAIT_PF_RESET_READY_TIME); - return -EAGAIN; - } else if (wait_data->result == HNS3_WAIT_TIMEOUT) { - hns3_clock_gettime(&tv); --- -2.33.0 - diff --git a/0073-net-bonding-fix-stopping-non-active-slaves.patch b/0073-net-bonding-fix-stopping-non-active-slaves.patch deleted file mode 100644 index f29bb40..0000000 --- a/0073-net-bonding-fix-stopping-non-active-slaves.patch +++ /dev/null @@ -1,56 +0,0 @@ -From f5e72e8e8d57b331baf1a86d15eb7fae921f57fb Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 3 May 2022 18:02:13 +0800 -Subject: [PATCH] net/bonding: fix stopping non-active slaves - -When stopping a bonded port, all slaves should be stopped. But only -active slaves are stopped. -So fix by stopping all slave ports and later do "deactivate_slave()" for -active slaves. - -Fixes: 0911d4ec0183 ("net/bonding: fix crash when stopping mode 4 port") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 20 +++++++++++--------- - 1 file changed, 11 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 5cbe89031b..605fc2ffb5 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -2118,18 +2118,20 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev) - internals->link_status_polling_enabled = 0; - for (i = 0; i < internals->slave_count; i++) { - uint16_t slave_id = internals->slaves[i].port_id; -+ -+ internals->slaves[i].last_link_status = 0; -+ ret = rte_eth_dev_stop(slave_id); -+ if (ret != 0) { -+ RTE_BOND_LOG(ERR, "Failed to stop device on port %u", -+ slave_id); -+ return ret; -+ } -+ -+ /* active slaves need to be deactivated. */ - if (find_slave_by_id(internals->active_slaves, - internals->active_slave_count, slave_id) != -- internals->active_slave_count) { -- internals->slaves[i].last_link_status = 0; -- ret = rte_eth_dev_stop(slave_id); -- if (ret != 0) { -- RTE_BOND_LOG(ERR, "Failed to stop device on port %u", -- slave_id); -- return ret; -- } -+ internals->active_slave_count) - deactivate_slave(eth_dev, slave_id); -- } - } - - return 0; --- -2.33.0 - diff --git a/0074-net-bonding-fix-slave-stop-and-remove-on-port-close.patch b/0074-net-bonding-fix-slave-stop-and-remove-on-port-close.patch deleted file mode 100644 index 8e20027..0000000 --- a/0074-net-bonding-fix-slave-stop-and-remove-on-port-close.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 1c5c6cd85f8cab2af92d265b6c7671df0b82e6fb Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 3 May 2022 18:02:14 +0800 -Subject: [PATCH] net/bonding: fix slave stop and remove on port close - -All slaves will be stopped and removed when closing a bonded port. -But the while loop can not end if both rte_eth_dev_stop and -rte_eth_bond_slave_remove fails, runs infinitely. -This is because the skipped slave port counted in both function failures -but it should be counted only one. - -Fixing by not continue to process in the loop after first failure. - -Fixes: fb0379bc5db3 ("net/bonding: check stop call status") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 605fc2ffb5..f0668a636f 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -2156,6 +2156,7 @@ bond_ethdev_close(struct rte_eth_dev *dev) - RTE_BOND_LOG(ERR, "Failed to stop device on port %u", - port_id); - skipped++; -+ continue; - } - - if (rte_eth_bond_slave_remove(bond_port_id, port_id) != 0) { --- -2.33.0 - diff --git a/0075-net-hns3-fix-order-of-clearing-imissed-register-in-P.patch b/0075-net-hns3-fix-order-of-clearing-imissed-register-in-P.patch deleted file mode 100644 index d22e487..0000000 --- a/0075-net-hns3-fix-order-of-clearing-imissed-register-in-P.patch +++ /dev/null @@ -1,186 +0,0 @@ -From 1a1de9879f58b4fd202ecd481c56ae9777207fe9 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:01 +0800 -Subject: [PATCH] net/hns3: fix order of clearing imissed register in PF - -Clearing imissed registers in PF hardware depends on the -'drop_stats_mode' in struct hns3_hw. The variable is initialized after -the "hns3_get_configuration". But, in current code, the clearing -operation runs before the function. -So this patch fixes this order. In addition, this patch extracts a -public function to initialize and uninitialize statistics to improve the -maintainability of these codes. - -Fixes: 3e9f3042d7c8 ("net/hns3: add imissed packet stats") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 13 +++---------- - drivers/net/hns3/hns3_ethdev_vf.c | 13 +++---------- - drivers/net/hns3/hns3_stats.c | 27 ++++++++++++++++++++++++--- - drivers/net/hns3/hns3_stats.h | 5 ++--- - 4 files changed, 32 insertions(+), 26 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 4e089e682f..5aed7046d8 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4622,13 +4622,6 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - goto err_cmd_init; - } - -- /* Hardware statistics of imissed registers cleared. */ -- ret = hns3_update_imissed_stats(hw, true); -- if (ret) { -- hns3_err(hw, "clear imissed stats failed, ret = %d", ret); -- goto err_cmd_init; -- } -- - hns3_config_all_msix_error(hw, true); - - ret = rte_intr_callback_register(pci_dev->intr_handle, -@@ -4654,7 +4647,7 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - goto err_get_config; - } - -- ret = hns3_tqp_stats_init(hw); -+ ret = hns3_stats_init(hw); - if (ret) - goto err_get_config; - -@@ -4700,7 +4693,7 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - err_fdir: - hns3_uninit_umv_space(hw); - err_init_hw: -- hns3_tqp_stats_uninit(hw); -+ hns3_stats_uninit(hw); - err_get_config: - hns3_pf_disable_irq0(hw); - rte_intr_disable(pci_dev->intr_handle); -@@ -4734,7 +4727,7 @@ hns3_uninit_pf(struct rte_eth_dev *eth_dev) - hns3_flow_uninit(eth_dev); - hns3_fdir_filter_uninit(hns); - hns3_uninit_umv_space(hw); -- hns3_tqp_stats_uninit(hw); -+ hns3_stats_uninit(hw); - hns3_config_mac_tnl_int(hw, false); - hns3_pf_disable_irq0(hw); - rte_intr_disable(pci_dev->intr_handle); -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 9091706fe5..9e9fdc4144 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1510,17 +1510,10 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev) - goto err_get_config; - } - -- ret = hns3_tqp_stats_init(hw); -+ ret = hns3_stats_init(hw); - if (ret) - goto err_get_config; - -- /* Hardware statistics of imissed registers cleared. */ -- ret = hns3_update_imissed_stats(hw, true); -- if (ret) { -- hns3_err(hw, "clear imissed stats failed, ret = %d", ret); -- goto err_set_tc_queue; -- } -- - ret = hns3_queue_to_tc_mapping(hw, hw->tqps_num, hw->tqps_num); - if (ret) { - PMD_INIT_LOG(ERR, "failed to set tc info, ret = %d.", ret); -@@ -1548,7 +1541,7 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev) - return 0; - - err_set_tc_queue: -- hns3_tqp_stats_uninit(hw); -+ hns3_stats_uninit(hw); - - err_get_config: - hns3vf_disable_irq0(hw); -@@ -1579,7 +1572,7 @@ hns3vf_uninit_vf(struct rte_eth_dev *eth_dev) - (void)hns3vf_set_alive(hw, false); - (void)hns3vf_set_promisc_mode(hw, false, false, false); - hns3_flow_uninit(eth_dev); -- hns3_tqp_stats_uninit(hw); -+ hns3_stats_uninit(hw); - hns3vf_disable_irq0(hw); - rte_intr_disable(pci_dev->intr_handle); - hns3_intr_unregister(pci_dev->intr_handle, hns3vf_interrupt_handler, -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index 806720faff..e4a5dcf2f8 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -540,7 +540,7 @@ hns3_update_port_tx_ssu_drop_stats(struct hns3_hw *hw) - return 0; - } - --int -+static int - hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear) - { - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -@@ -1476,7 +1476,7 @@ hns3_dev_xstats_reset(struct rte_eth_dev *dev) - return 0; - } - --int -+static int - hns3_tqp_stats_init(struct hns3_hw *hw) - { - struct hns3_tqp_stats *tqp_stats = &hw->tqp_stats; -@@ -1500,7 +1500,7 @@ hns3_tqp_stats_init(struct hns3_hw *hw) - return 0; - } - --void -+static void - hns3_tqp_stats_uninit(struct hns3_hw *hw) - { - struct hns3_tqp_stats *tqp_stats = &hw->tqp_stats; -@@ -1521,3 +1521,24 @@ hns3_tqp_stats_clear(struct hns3_hw *hw) - memset(stats->rcb_rx_ring_pktnum, 0, sizeof(uint64_t) * hw->tqps_num); - memset(stats->rcb_tx_ring_pktnum, 0, sizeof(uint64_t) * hw->tqps_num); - } -+ -+int -+hns3_stats_init(struct hns3_hw *hw) -+{ -+ int ret; -+ -+ /* Hardware statistics of imissed registers cleared. */ -+ ret = hns3_update_imissed_stats(hw, true); -+ if (ret) { -+ hns3_err(hw, "clear imissed stats failed, ret = %d", ret); -+ return ret; -+ } -+ -+ return hns3_tqp_stats_init(hw); -+} -+ -+void -+hns3_stats_uninit(struct hns3_hw *hw) -+{ -+ hns3_tqp_stats_uninit(hw); -+} -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index c81d351082..e89dc97632 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -161,9 +161,8 @@ int hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, - struct rte_eth_xstat_name *xstats_names, - uint32_t size); - int hns3_stats_reset(struct rte_eth_dev *dev); --int hns3_tqp_stats_init(struct hns3_hw *hw); --void hns3_tqp_stats_uninit(struct hns3_hw *hw); --int hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear); -+int hns3_stats_init(struct hns3_hw *hw); -+void hns3_stats_uninit(struct hns3_hw *hw); - int hns3_query_mac_stats_reg_num(struct hns3_hw *hw); - - #endif /* _HNS3_STATS_H_ */ --- -2.33.0 - diff --git a/0076-net-hns3-fix-MAC-and-queues-HW-statistics-overflow.patch b/0076-net-hns3-fix-MAC-and-queues-HW-statistics-overflow.patch deleted file mode 100644 index 2326d59..0000000 --- a/0076-net-hns3-fix-MAC-and-queues-HW-statistics-overflow.patch +++ /dev/null @@ -1,432 +0,0 @@ -From dd4cf775f6c2f7dc18c6845983bc84c6351326c4 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:02 +0800 -Subject: [PATCH 16/25] net/hns3: fix MAC and queues HW statistics overflow - -The MAC and queues statistics are 32-bit registers in hardware. If -hardware statistics are not obtained for a long time, these statistics -will be overflow. -So PF and VF driver have to periodically obtain and save these -statistics. Since the periodical task and the stats API are in different -threads, we introduce a statistics lock to protect the statistics. - -Fixes: 8839c5e202f3 ("net/hns3: support device stats") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 6 +- - drivers/net/hns3/hns3_ethdev.h | 6 ++ - drivers/net/hns3/hns3_ethdev_vf.c | 6 +- - drivers/net/hns3/hns3_stats.c | 144 +++++++++++++++++++++--------- - drivers/net/hns3/hns3_stats.h | 1 + - 5 files changed, 116 insertions(+), 47 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index dc37914aea..af317a8c47 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4365,10 +4365,12 @@ hns3_service_handler(void *param) - struct hns3_adapter *hns = eth_dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - -- if (!hns3_is_reset_pending(hns)) -+ if (!hns3_is_reset_pending(hns)) { - hns3_update_linkstatus_and_event(hw, true); -- else -+ hns3_update_hw_stats(hw); -+ } else { - hns3_warn(hw, "Cancel the query when reset is pending"); -+ } - - rte_eal_alarm_set(HNS3_SERVICE_INTERVAL, hns3_service_handler, eth_dev); - } -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index d6d82c55f9..889220237c 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -503,6 +503,12 @@ struct hns3_hw { - uint32_t mac_stats_reg_num; - struct hns3_rx_missed_stats imissed_stats; - uint64_t oerror_stats; -+ /* -+ * The lock is used to protect statistics update in stats APIs and -+ * periodic task. -+ */ -+ rte_spinlock_t stats_lock; -+ - uint32_t fw_version; - uint16_t pf_vf_if_version; /* version of communication interface */ - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index b66047c09f..70b773cfe9 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1338,10 +1338,12 @@ hns3vf_service_handler(void *param) - * Before querying the link status, check whether there is a reset - * pending, and if so, abandon the query. - */ -- if (!hns3vf_is_reset_pending(hns)) -+ if (!hns3vf_is_reset_pending(hns)) { - hns3vf_request_link_info(hw); -- else -+ hns3_update_hw_stats(hw); -+ } else { - hns3_warn(hw, "Cancel the query when reset is pending"); -+ } - - rte_eal_alarm_set(HNS3VF_SERVICE_INTERVAL, hns3vf_service_handler, - eth_dev); -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index 03719cd014..9b7ad067aa 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -584,6 +584,28 @@ hns3_update_oerror_stats(struct hns3_hw *hw, bool is_clear) - return 0; - } - -+static void -+hns3_rcb_rx_ring_stats_get(struct hns3_rx_queue *rxq, -+ struct hns3_tqp_stats *stats) -+{ -+ uint32_t cnt; -+ -+ cnt = hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG); -+ stats->rcb_rx_ring_pktnum_rcd += cnt; -+ stats->rcb_rx_ring_pktnum[rxq->queue_id] += cnt; -+} -+ -+static void -+hns3_rcb_tx_ring_stats_get(struct hns3_tx_queue *txq, -+ struct hns3_tqp_stats *stats) -+{ -+ uint32_t cnt; -+ -+ cnt = hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG); -+ stats->rcb_tx_ring_pktnum_rcd += cnt; -+ stats->rcb_tx_ring_pktnum[txq->queue_id] += cnt; -+} -+ - /* - * Query tqp tx queue statistics ,opcode id: 0x0B03. - * Query tqp rx queue statistics ,opcode id: 0x0B13. -@@ -604,16 +626,14 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - struct hns3_tqp_stats *stats = &hw->tqp_stats; - struct hns3_rx_queue *rxq; - struct hns3_tx_queue *txq; -- uint64_t cnt; - uint16_t i; - int ret; - - /* Update imissed stats */ - ret = hns3_update_imissed_stats(hw, false); - if (ret) { -- hns3_err(hw, "update imissed stats failed, ret = %d", -- ret); -- return ret; -+ hns3_err(hw, "update imissed stats failed, ret = %d", ret); -+ goto out; - } - rte_stats->imissed = imissed_stats->rpu_rx_drop_cnt + - imissed_stats->ssu_rx_drop_cnt; -@@ -624,15 +644,12 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - if (rxq == NULL) - continue; - -- cnt = hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG); -- /* -- * Read hardware and software in adjacent positions to minumize -- * the timing variance. -- */ -+ rte_spinlock_lock(&hw->stats_lock); -+ hns3_rcb_rx_ring_stats_get(rxq, stats); -+ rte_spinlock_unlock(&hw->stats_lock); -+ - rte_stats->ierrors += rxq->err_stats.l2_errors + - rxq->err_stats.pkt_len_errors; -- stats->rcb_rx_ring_pktnum_rcd += cnt; -- stats->rcb_rx_ring_pktnum[i] += cnt; - rte_stats->ibytes += rxq->basic_stats.bytes; - } - -@@ -642,17 +659,16 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - if (txq == NULL) - continue; - -- cnt = hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG); -- stats->rcb_tx_ring_pktnum_rcd += cnt; -- stats->rcb_tx_ring_pktnum[i] += cnt; -+ rte_spinlock_lock(&hw->stats_lock); -+ hns3_rcb_tx_ring_stats_get(txq, stats); -+ rte_spinlock_unlock(&hw->stats_lock); - rte_stats->obytes += txq->basic_stats.bytes; - } - - ret = hns3_update_oerror_stats(hw, false); - if (ret) { -- hns3_err(hw, "update oerror stats failed, ret = %d", -- ret); -- return ret; -+ hns3_err(hw, "update oerror stats failed, ret = %d", ret); -+ goto out; - } - rte_stats->oerrors = hw->oerror_stats; - -@@ -667,8 +683,8 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - rte_stats->opackets = stats->rcb_tx_ring_pktnum_rcd - - rte_stats->oerrors; - rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed; -- -- return 0; -+out: -+ return ret; - } - - int -@@ -688,7 +704,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - ret = hns3_update_imissed_stats(hw, true); - if (ret) { - hns3_err(hw, "clear imissed stats failed, ret = %d", ret); -- return ret; -+ goto out; - } - - /* -@@ -697,9 +713,8 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - */ - ret = hns3_update_oerror_stats(hw, true); - if (ret) { -- hns3_err(hw, "clear oerror stats failed, ret = %d", -- ret); -- return ret; -+ hns3_err(hw, "clear oerror stats failed, ret = %d", ret); -+ goto out; - } - - for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { -@@ -717,6 +732,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - if (rxq == NULL) - continue; - -+ rte_spinlock_lock(&hw->stats_lock); - memset(&rxq->basic_stats, 0, - sizeof(struct hns3_rx_basic_stats)); - -@@ -724,6 +740,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - (void)hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG); - rxq->err_stats.pkt_len_errors = 0; - rxq->err_stats.l2_errors = 0; -+ rte_spinlock_unlock(&hw->stats_lock); - } - - /* Clear all the stats of a txq in a loop to keep them synchronized */ -@@ -732,16 +749,20 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - if (txq == NULL) - continue; - -+ rte_spinlock_lock(&hw->stats_lock); - memset(&txq->basic_stats, 0, - sizeof(struct hns3_tx_basic_stats)); - - /* This register is read-clear */ - (void)hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG); -+ rte_spinlock_unlock(&hw->stats_lock); - } - -+ rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_stats_clear(hw); -- -- return 0; -+ rte_spinlock_unlock(&hw->stats_lock); -+out: -+ return ret; - } - - static int -@@ -908,7 +929,6 @@ hns3_rxq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - struct hns3_rx_basic_stats *rxq_stats; - struct hns3_rx_queue *rxq; - uint16_t i, j; -- uint32_t cnt; - char *val; - - for (i = 0; i < dev->data->nb_rx_queues; i++) { -@@ -916,16 +936,10 @@ hns3_rxq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - if (rxq == NULL) - continue; - -- cnt = hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG); -- /* -- * Read hardware and software in adjacent positions to minimize -- * the time difference. -- */ -+ hns3_rcb_rx_ring_stats_get(rxq, stats); - rxq_stats = &rxq->basic_stats; - rxq_stats->errors = rxq->err_stats.l2_errors + - rxq->err_stats.pkt_len_errors; -- stats->rcb_rx_ring_pktnum_rcd += cnt; -- stats->rcb_rx_ring_pktnum[i] += cnt; - - /* - * If HW statistics are reset by stats_reset, but a lot of -@@ -955,7 +969,6 @@ hns3_txq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - struct hns3_tx_basic_stats *txq_stats; - struct hns3_tx_queue *txq; - uint16_t i, j; -- uint32_t cnt; - char *val; - - for (i = 0; i < dev->data->nb_tx_queues; i++) { -@@ -963,9 +976,7 @@ hns3_txq_basic_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - if (txq == NULL) - continue; - -- cnt = hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG); -- stats->rcb_tx_ring_pktnum_rcd += cnt; -- stats->rcb_tx_ring_pktnum[i] += cnt; -+ hns3_rcb_tx_ring_stats_get(txq, stats); - - txq_stats = &txq->basic_stats; - txq_stats->packets = stats->rcb_tx_ring_pktnum[i]; -@@ -1050,6 +1061,7 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - - count = 0; - -+ rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_basic_stats_get(dev, xstats, &count); - - if (!hns->is_vf) { -@@ -1057,6 +1069,7 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - ret = hns3_query_update_mac_stats(dev); - if (ret < 0) { - hns3_err(hw, "Update Mac stats fail : %d", ret); -+ rte_spinlock_unlock(&hw->stats_lock); - return ret; - } - -@@ -1068,11 +1081,11 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - count++; - } - } -+ rte_spinlock_unlock(&hw->stats_lock); - - ret = hns3_update_imissed_stats(hw, false); - if (ret) { -- hns3_err(hw, "update imissed stats failed, ret = %d", -- ret); -+ hns3_err(hw, "update imissed stats failed, ret = %d", ret); - return ret; - } - -@@ -1101,8 +1114,10 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - } - } - -+ rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_dfx_stats_get(dev, xstats, &count); - hns3_queue_stats_get(dev, xstats, &count); -+ rte_spinlock_unlock(&hw->stats_lock); - - return count; - } -@@ -1453,6 +1468,7 @@ int - hns3_dev_xstats_reset(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; - int ret; - - /* Clear tqp stats */ -@@ -1460,20 +1476,22 @@ hns3_dev_xstats_reset(struct rte_eth_dev *dev) - if (ret) - return ret; - -+ rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_dfx_stats_clear(dev); - - /* Clear reset stats */ - memset(&hns->hw.reset.stats, 0, sizeof(struct hns3_reset_stats)); - - if (hns->is_vf) -- return 0; -+ goto out; - - /* HW registers are cleared on read */ - ret = hns3_mac_stats_reset(dev); -- if (ret) -- return ret; - -- return 0; -+out: -+ rte_spinlock_unlock(&hw->stats_lock); -+ -+ return ret; - } - - static int -@@ -1527,6 +1545,7 @@ hns3_stats_init(struct hns3_hw *hw) - { - int ret; - -+ rte_spinlock_init(&hw->stats_lock); - /* Hardware statistics of imissed registers cleared. */ - ret = hns3_update_imissed_stats(hw, true); - if (ret) { -@@ -1542,3 +1561,42 @@ hns3_stats_uninit(struct hns3_hw *hw) - { - hns3_tqp_stats_uninit(hw); - } -+ -+static void -+hns3_update_queues_stats(struct hns3_hw *hw) -+{ -+ struct rte_eth_dev_data *data = hw->data; -+ struct hns3_rx_queue *rxq; -+ struct hns3_tx_queue *txq; -+ uint16_t i; -+ -+ for (i = 0; i < data->nb_rx_queues; i++) { -+ rxq = data->rx_queues[i]; -+ if (rxq != NULL) -+ hns3_rcb_rx_ring_stats_get(rxq, &hw->tqp_stats); -+ } -+ -+ for (i = 0; i < data->nb_tx_queues; i++) { -+ txq = data->tx_queues[i]; -+ if (txq != NULL) -+ hns3_rcb_tx_ring_stats_get(txq, &hw->tqp_stats); -+ } -+} -+ -+/* -+ * Some hardware statistics registers are not 64-bit. If hardware statistics are -+ * not obtained for a long time, these statistics may be reversed. This function -+ * is used to update these hardware statistics in periodic task. -+ */ -+void -+hns3_update_hw_stats(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ -+ rte_spinlock_lock(&hw->stats_lock); -+ if (!hns->is_vf) -+ hns3_update_mac_stats(hw); -+ -+ hns3_update_queues_stats(hw); -+ rte_spinlock_unlock(&hw->stats_lock); -+} -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index e89dc97632..b5cd6188b4 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -164,5 +164,6 @@ int hns3_stats_reset(struct rte_eth_dev *dev); - int hns3_stats_init(struct hns3_hw *hw); - void hns3_stats_uninit(struct hns3_hw *hw); - int hns3_query_mac_stats_reg_num(struct hns3_hw *hw); -+void hns3_update_hw_stats(struct hns3_hw *hw); - - #endif /* _HNS3_STATS_H_ */ --- -2.30.0 - diff --git a/0077-net-hns3-fix-pseudo-sharing-between-threads.patch b/0077-net-hns3-fix-pseudo-sharing-between-threads.patch deleted file mode 100644 index b191828..0000000 --- a/0077-net-hns3-fix-pseudo-sharing-between-threads.patch +++ /dev/null @@ -1,45 +0,0 @@ -From ec0147b5690e6cae2cc4555f78b87defee59c946 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:03 +0800 -Subject: [PATCH] net/hns3: fix pseudo-sharing between threads - -Some fields in the end of 'struct hns3_rx_queue' and -'struct hns3_tx_queue' are not accessed in the I/O path. -But these fields may be accessed in other threads, which may lead to the -problem of cache pseudo-sharing of IO threads. This patch add a -cacheline alignment to avoid it. - -Fixes: 9261fd3caf1f ("net/hns3: improve IO path data cache usage") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index a000318357..62efc854e4 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -348,7 +348,7 @@ struct hns3_rx_queue { - * The following fields are not accessed in the I/O path, so they are - * placed at the end. - */ -- void *io_base; -+ void *io_base __rte_cache_aligned; - struct hns3_adapter *hns; - uint64_t rx_ring_phys_addr; /* RX ring DMA address */ - const struct rte_memzone *mz; -@@ -521,7 +521,7 @@ struct hns3_tx_queue { - * The following fields are not accessed in the I/O path, so they are - * placed at the end. - */ -- void *io_base; -+ void *io_base __rte_cache_aligned; - struct hns3_adapter *hns; - uint64_t tx_ring_phys_addr; /* TX ring DMA address */ - const struct rte_memzone *mz; --- -2.33.0 - diff --git a/0078-net-hns3-fix-mbuf-free-on-Tx-done-cleanup.patch b/0078-net-hns3-fix-mbuf-free-on-Tx-done-cleanup.patch deleted file mode 100644 index 46b2c9b..0000000 --- a/0078-net-hns3-fix-mbuf-free-on-Tx-done-cleanup.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 2d287ea3c2301219c201617df15efa161deabf76 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 5 May 2022 20:27:04 +0800 -Subject: [PATCH] net/hns3: fix mbuf free on Tx done cleanup - -Currently, the hns3 PMD may free more mbufs than free_cnt parameter, -this is an incorrect implementation. This patch fixes it. - -Fixes: 0b77e8f3d364 ("net/hns3: optimize Tx performance") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index a28de06dfd..0c91e4721e 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4595,7 +4595,7 @@ hns3_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id) - static int - hns3_tx_done_cleanup_full(struct hns3_tx_queue *txq, uint32_t free_cnt) - { -- uint16_t round_free_cnt; -+ uint16_t round_cnt; - uint32_t idx; - - if (free_cnt == 0 || free_cnt > txq->nb_tx_desc) -@@ -4604,13 +4604,13 @@ hns3_tx_done_cleanup_full(struct hns3_tx_queue *txq, uint32_t free_cnt) - if (txq->tx_rs_thresh == 0) - return 0; - -- round_free_cnt = roundup(free_cnt, txq->tx_rs_thresh); -- for (idx = 0; idx < round_free_cnt; idx += txq->tx_rs_thresh) { -+ round_cnt = rounddown(free_cnt, txq->tx_rs_thresh); -+ for (idx = 0; idx < round_cnt; idx += txq->tx_rs_thresh) { - if (hns3_tx_free_useless_buffer(txq) != 0) - break; - } - -- return RTE_MIN(idx, free_cnt); -+ return idx; - } - - int --- -2.33.0 - diff --git a/0079-net-hns3-fix-RSS-disable.patch b/0079-net-hns3-fix-RSS-disable.patch deleted file mode 100644 index ebb61a1..0000000 --- a/0079-net-hns3-fix-RSS-disable.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 75ccc3f3d7fa06901d5b768448be4dc9f31f550a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:05 +0800 -Subject: [PATCH] net/hns3: fix RSS disable - -Currently, hns3 PMD disable RSS by resetting redirection table when user -set rss_hf to 0 so as to all packets go to queue 0. The implementation -may cause following problems: -1) the same type packet may go to different queue on the case of - disabling all tuples and partial tuples. The problem is determined by - hardware design. -2) affect the configuration of redirection table and user experience. - -For hns3 hardware, the packets with RSS disabled are always go to the -queue corresponding to first entry of the redirection table. Generally, -disable RSS should be implemented by disabling all tuples, This patch -fix the implementation. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 1 - - drivers/net/hns3/hns3_flow.c | 6 +-- - drivers/net/hns3/hns3_rss.c | 93 +++++++--------------------------- - 3 files changed, 18 insertions(+), 82 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 1d9b19d83e..4d5a595aab 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2015,7 +2015,6 @@ hns3_dev_configure(struct rte_eth_dev *dev) - goto cfg_err; - } - -- /* When RSS is not configured, redirect the packet queue 0 */ - if ((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) { - conf->rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; - rss_conf = conf->rx_adv_conf.rss_conf; -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index aba07aaa6f..feabac9f41 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1446,13 +1446,9 @@ hns3_disable_rss(struct hns3_hw *hw) - { - int ret; - -- /* Redirected the redirection table to queue 0 */ -- ret = hns3_rss_reset_indir_table(hw); -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, &hw->rss_info.rss_tuple_sets, 0); - if (ret) - return ret; -- -- /* Disable RSS */ -- hw->rss_info.conf.types = 0; - hw->rss_dis_flag = true; - - return 0; -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 1493b10f96..1c703952b9 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -237,31 +237,6 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key) - return 0; - } - --/* -- * Used to configure the tuple selection for RSS hash input. -- */ --static int --hns3_rss_set_input_tuple(struct hns3_hw *hw) --{ -- struct hns3_rss_conf *rss_config = &hw->rss_info; -- struct hns3_rss_input_tuple_cmd *req; -- struct hns3_cmd_desc desc_tuple; -- int ret; -- -- hns3_cmd_setup_basic_desc(&desc_tuple, HNS3_OPC_RSS_INPUT_TUPLE, false); -- -- req = (struct hns3_rss_input_tuple_cmd *)desc_tuple.data; -- -- req->tuple_field = -- rte_cpu_to_le_64(rss_config->rss_tuple_sets.rss_tuple_fields); -- -- ret = hns3_cmd_send(hw, &desc_tuple, 1); -- if (ret) -- hns3_err(hw, "Configure RSS input tuple mode failed %d", ret); -- -- return ret; --} -- - /* - * rss_indirection_table command function, opcode:0x0D07. - * Used to configure the indirection table of rss. -@@ -382,6 +357,8 @@ hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, - } - - tuple->rss_tuple_fields = rte_le_to_cpu_64(req->tuple_field); -+ /* Update supported flow types when set tuple success */ -+ hw->rss_info.conf.types = rss_hf; - - return 0; - } -@@ -402,7 +379,6 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - struct hns3_rss_tuple_cfg *tuple = &hw->rss_info.rss_tuple_sets; -- struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint8_t key_len = rss_conf->rss_key_len; - uint64_t rss_hf = rss_conf->rss_hf; - uint8_t *key = rss_conf->rss_key; -@@ -416,22 +392,6 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - if (ret) - goto conf_err; - -- if (rss_cfg->conf.types && rss_hf == 0) { -- /* Disable RSS, reset indirection table by local variable */ -- ret = hns3_rss_reset_indir_table(hw); -- if (ret) -- goto conf_err; -- } else if (rss_hf && rss_cfg->conf.types == 0) { -- /* Enable RSS, restore indirection table by hw's config */ -- ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, -- hw->rss_ind_tbl_size); -- if (ret) -- goto conf_err; -- } -- -- /* Update supported flow types when set tuple success */ -- rss_cfg->conf.types = rss_hf; -- - if (key) { - if (key_len != HNS3_RSS_KEY_SIZE) { - hns3_err(hw, "The hash key len(%u) is invalid", -@@ -697,7 +657,8 @@ hns3_config_rss(struct hns3_adapter *hns) - struct hns3_hw *hw = &hns->hw; - struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint8_t *hash_key = rss_cfg->key; -- int ret, ret1; -+ uint64_t rss_hf; -+ int ret; - - enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode; - -@@ -713,51 +674,31 @@ hns3_config_rss(struct hns3_adapter *hns) - break; - } - -- /* When RSS is off, redirect the packet queue 0 */ -- if (((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) == 0) -- hns3_rss_uninit(hns); -- - /* Configure RSS hash algorithm and hash key offset */ - ret = hns3_rss_set_algo_key(hw, hash_key); - if (ret) - return ret; - -- /* Configure the tuple selection for RSS hash input */ -- ret = hns3_rss_set_input_tuple(hw); -+ ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, -+ hw->rss_ind_tbl_size); - if (ret) - return ret; - -- /* -- * When RSS is off, it doesn't need to configure rss redirection table -- * to hardware. -- */ -- if (((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)) { -- ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, -- hw->rss_ind_tbl_size); -- if (ret) -- goto rss_tuple_uninit; -- } -- - ret = hns3_set_rss_tc_mode(hw); - if (ret) -- goto rss_indir_table_uninit; -- -- return ret; -- --rss_indir_table_uninit: -- if (((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)) { -- ret1 = hns3_rss_reset_indir_table(hw); -- if (ret1 != 0) -- return ret; -- } -- --rss_tuple_uninit: -- hns3_rss_tuple_uninit(hw); -+ return ret; - -- /* Disable RSS */ -- hw->rss_info.conf.types = 0; -+ /* -+ * When muli-queue RSS mode flag is not set or unsupported tuples are -+ * set, disable all tuples. -+ */ -+ rss_hf = hw->rss_info.conf.types; -+ if (!((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) || -+ !(rss_hf & HNS3_ETH_RSS_SUPPORT)) -+ rss_hf = 0; - -- return ret; -+ return hns3_set_rss_tuple_by_rss_hf(hw, &hw->rss_info.rss_tuple_sets, -+ rss_hf); - } - - /* --- -2.33.0 - diff --git a/0080-net-hns3-fix-rollback-on-RSS-hash-update.patch b/0080-net-hns3-fix-rollback-on-RSS-hash-update.patch deleted file mode 100644 index 7e3e8b4..0000000 --- a/0080-net-hns3-fix-rollback-on-RSS-hash-update.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 07f64b5f576a779c8c3df4ba45ad70c306dcb562 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:06 +0800 -Subject: [PATCH] net/hns3: fix rollback on RSS hash update - -The RSS tuple isn't restored when RSS key length is invalid or setting -algo key failed. This patch fixes it. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rss.c | 24 +++++++++++++----------- - 1 file changed, 13 insertions(+), 11 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 1c703952b9..4b2c24ace4 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -376,9 +376,9 @@ int - hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - struct rte_eth_rss_conf *rss_conf) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_rss_tuple_cfg *tuple = &hw->rss_info.rss_tuple_sets; -+ uint64_t rss_hf_bk = hw->rss_info.conf.types; - uint8_t key_len = rss_conf->rss_key_len; - uint64_t rss_hf = rss_conf->rss_hf; - uint8_t *key = rss_conf->rss_key; -@@ -387,27 +387,29 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - if (hw->rss_dis_flag) - return -EINVAL; - -+ if (key && key_len != HNS3_RSS_KEY_SIZE) { -+ hns3_err(hw, "the hash key len(%u) is invalid, must be %u", -+ key_len, HNS3_RSS_KEY_SIZE); -+ return -EINVAL; -+ } -+ - rte_spinlock_lock(&hw->lock); - ret = hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_hf); - if (ret) -- goto conf_err; -+ goto set_tuple_fail; - - if (key) { -- if (key_len != HNS3_RSS_KEY_SIZE) { -- hns3_err(hw, "The hash key len(%u) is invalid", -- key_len); -- ret = -EINVAL; -- goto conf_err; -- } - ret = hns3_rss_set_algo_key(hw, key); - if (ret) -- goto conf_err; -+ goto set_algo_key_fail; - } - rte_spinlock_unlock(&hw->lock); - - return 0; - --conf_err: -+set_algo_key_fail: -+ (void)hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_hf_bk); -+set_tuple_fail: - rte_spinlock_unlock(&hw->lock); - return ret; - } --- -2.33.0 - diff --git a/0081-net-hns3-remove-redundant-RSS-tuple-field.patch b/0081-net-hns3-remove-redundant-RSS-tuple-field.patch deleted file mode 100644 index 462d198..0000000 --- a/0081-net-hns3-remove-redundant-RSS-tuple-field.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 7a036b213b972e2c90e349f1eb90a30b98a740b4 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 5 May 2022 20:27:07 +0800 -Subject: [PATCH 21/25] net/hns3: remove redundant RSS tuple field - -The 'rss_tuple_fields' in struct struct hns3_rss_conf::rss_tuple_sets is -redundant. Because the enabled RSS tuple in PMD is already managed by -the 'types' in struct hns3_rss_conf::conf. This patch removes this -redundant variable. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 6 ++---- - drivers/net/hns3/hns3_rss.c | 12 ++++-------- - drivers/net/hns3/hns3_rss.h | 5 +---- - 3 files changed, 7 insertions(+), 16 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index a74b140563..65f8ee3ae1 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1446,7 +1446,7 @@ hns3_disable_rss(struct hns3_hw *hw) - { - int ret; - -- ret = hns3_set_rss_tuple_by_rss_hf(hw, &hw->rss_info.rss_tuple_sets, 0); -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, 0); - if (ret) - return ret; - hw->rss_dis_flag = true; -@@ -1496,7 +1496,6 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function *func, - static int - hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - { -- struct hns3_rss_tuple_cfg *tuple; - int ret; - - hns3_adjust_rss_key(hw, rss_config); -@@ -1512,8 +1511,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - - hw->rss_info.conf.func = rss_config->func; - -- tuple = &hw->rss_info.rss_tuple_sets; -- ret = hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_config->types); -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_config->types); - if (ret) - hns3_err(hw, "Update RSS tuples by rss hf failed %d", ret); - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 4b2c24ace4..e149c16bfe 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -310,8 +310,7 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw) - } - - int --hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, -- struct hns3_rss_tuple_cfg *tuple, uint64_t rss_hf) -+hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) - { - struct hns3_rss_input_tuple_cmd *req; - struct hns3_cmd_desc desc; -@@ -356,7 +355,6 @@ hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, - return ret; - } - -- tuple->rss_tuple_fields = rte_le_to_cpu_64(req->tuple_field); - /* Update supported flow types when set tuple success */ - hw->rss_info.conf.types = rss_hf; - -@@ -377,7 +375,6 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - struct rte_eth_rss_conf *rss_conf) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- struct hns3_rss_tuple_cfg *tuple = &hw->rss_info.rss_tuple_sets; - uint64_t rss_hf_bk = hw->rss_info.conf.types; - uint8_t key_len = rss_conf->rss_key_len; - uint64_t rss_hf = rss_conf->rss_hf; -@@ -394,7 +391,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - } - - rte_spinlock_lock(&hw->lock); -- ret = hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_hf); -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); - if (ret) - goto set_tuple_fail; - -@@ -408,7 +405,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - return 0; - - set_algo_key_fail: -- (void)hns3_set_rss_tuple_by_rss_hf(hw, tuple, rss_hf_bk); -+ (void)hns3_set_rss_tuple_by_rss_hf(hw, rss_hf_bk); - set_tuple_fail: - rte_spinlock_unlock(&hw->lock); - return ret; -@@ -699,8 +696,7 @@ hns3_config_rss(struct hns3_adapter *hns) - !(rss_hf & HNS3_ETH_RSS_SUPPORT)) - rss_hf = 0; - -- return hns3_set_rss_tuple_by_rss_hf(hw, &hw->rss_info.rss_tuple_sets, -- rss_hf); -+ return hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); - } - - /* -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 6f153a1b7b..7789f02a08 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -43,7 +43,6 @@ struct hns3_rss_conf { - struct rte_flow_action_rss conf; - uint8_t hash_algo; /* hash function type definited by hardware */ - uint8_t key[HNS3_RSS_KEY_SIZE]; /* Hash key */ -- struct hns3_rss_tuple_cfg rss_tuple_sets; - uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; - uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ - bool valid; /* check if RSS rule is valid */ -@@ -107,9 +106,7 @@ int hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, - int hns3_rss_reset_indir_table(struct hns3_hw *hw); - int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); --int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, -- struct hns3_rss_tuple_cfg *tuple, -- uint64_t rss_hf); -+int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key); - int hns3_restore_rss_filter(struct rte_eth_dev *dev); - --- -2.30.0 - diff --git a/0082-ethdev-fix-RSS-update-when-RSS-is-disabled.patch b/0082-ethdev-fix-RSS-update-when-RSS-is-disabled.patch deleted file mode 100644 index 0ff17c4..0000000 --- a/0082-ethdev-fix-RSS-update-when-RSS-is-disabled.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 93e1ea6dfa99dea359b8d66123576a395c2c0acd Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 6 Apr 2022 14:57:00 +0800 -Subject: [PATCH] ethdev: fix RSS update when RSS is disabled - -The RTE_ETH_MQ_RX_RSS_FLAG flag is a switch to enable RSS. If the flag -is not set in dev_configure, RSS will be not configured and enabled. -However, RSS hash and reta can still be configured by ethdev ops to -enable RSS if the flag isn't set. The behavior is inconsistent. - -Fixes: 99a2dd955fba ("lib: remove librte_ prefix from directory names") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 29a3d80466..8520aec561 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -3867,6 +3867,7 @@ rte_eth_dev_rss_reta_update(uint16_t port_id, - struct rte_eth_rss_reta_entry64 *reta_conf, - uint16_t reta_size) - { -+ enum rte_eth_rx_mq_mode mq_mode; - struct rte_eth_dev *dev; - int ret; - -@@ -3898,6 +3899,12 @@ rte_eth_dev_rss_reta_update(uint16_t port_id, - if (ret < 0) - return ret; - -+ mq_mode = dev->data->dev_conf.rxmode.mq_mode; -+ if (!(mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)) { -+ RTE_ETHDEV_LOG(ERR, "Multi-queue RSS mode isn't enabled.\n"); -+ return -ENOTSUP; -+ } -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_update, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->reta_update)(dev, reta_conf, - reta_size)); -@@ -3937,6 +3944,7 @@ rte_eth_dev_rss_hash_update(uint16_t port_id, - { - struct rte_eth_dev *dev; - struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, }; -+ enum rte_eth_rx_mq_mode mq_mode; - int ret; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -@@ -3962,6 +3970,13 @@ rte_eth_dev_rss_hash_update(uint16_t port_id, - dev_info.flow_type_rss_offloads); - return -EINVAL; - } -+ -+ mq_mode = dev->data->dev_conf.rxmode.mq_mode; -+ if (!(mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)) { -+ RTE_ETHDEV_LOG(ERR, "Multi-queue RSS mode isn't enabled.\n"); -+ return -ENOTSUP; -+ } -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev, - rss_conf)); --- -2.33.0 - diff --git a/0083-net-hns3-remove-unnecessary-RSS-switch.patch b/0083-net-hns3-remove-unnecessary-RSS-switch.patch deleted file mode 100644 index 18f7e26..0000000 --- a/0083-net-hns3-remove-unnecessary-RSS-switch.patch +++ /dev/null @@ -1,103 +0,0 @@ -From ec1691494273ef4f9cb60ed24099196de1ce0cc4 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 6 Apr 2022 14:57:01 +0800 -Subject: [PATCH] net/hns3: remove unnecessary RSS switch - -Whether the RSS is enabled depends on RTE_ETH_MQ_RX_RSS_FLAG and packet -tuple are enabled. So the RSS switch is unnecessary. - -Fixes: 5e782bc2570c ("net/hns3: fix configuring RSS hash when rules are flushed") -Fixes: fd8196838763 ("net/hns3: fix configuring device with RSS enabled") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ethdev.c | 2 -- - drivers/net/hns3/hns3_ethdev.h | 1 - - drivers/net/hns3/hns3_ethdev_vf.c | 2 -- - drivers/net/hns3/hns3_flow.c | 1 - - drivers/net/hns3/hns3_rss.c | 3 --- - 5 files changed, 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 4d5a595aab..0b565a5614 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2018,7 +2018,6 @@ hns3_dev_configure(struct rte_eth_dev *dev) - if ((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) { - conf->rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; - rss_conf = conf->rx_adv_conf.rss_conf; -- hw->rss_dis_flag = false; - ret = hns3_dev_rss_hash_update(dev, &rss_conf); - if (ret) - goto cfg_err; -@@ -2824,7 +2823,6 @@ hns3_get_board_configuration(struct hns3_hw *hw) - - hw->mac.media_type = cfg.media_type; - hw->rss_size_max = cfg.rss_size_max; -- hw->rss_dis_flag = false; - memcpy(hw->mac.mac_addr, cfg.mac_addr, RTE_ETHER_ADDR_LEN); - hw->mac.phy_addr = cfg.phy_addr; - hw->dcb_info.num_pg = 1; -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index bb6ddd97ba..5e8a746514 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -526,7 +526,6 @@ struct hns3_hw { - - /* The configuration info of RSS */ - struct hns3_rss_conf rss_info; -- bool rss_dis_flag; /* disable rss flag. true: disable, false: enable */ - uint16_t rss_ind_tbl_size; - uint16_t rss_key_size; - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index f641e0dc36..589de0ab3a 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -495,7 +495,6 @@ hns3vf_dev_configure(struct rte_eth_dev *dev) - /* When RSS is not configured, redirect the packet queue 0 */ - if ((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) { - conf->rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; -- hw->rss_dis_flag = false; - rss_conf = conf->rx_adv_conf.rss_conf; - ret = hns3_dev_rss_hash_update(dev, &rss_conf); - if (ret) -@@ -997,7 +996,6 @@ hns3vf_get_configuration(struct hns3_hw *hw) - int ret; - - hw->mac.media_type = HNS3_MEDIA_TYPE_NONE; -- hw->rss_dis_flag = false; - - /* Get device capability */ - ret = hns3vf_get_capability(hw); -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 317f91fc71..86ebbf69b6 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1449,7 +1449,6 @@ hns3_disable_rss(struct hns3_hw *hw) - ret = hns3_set_rss_tuple_by_rss_hf(hw, 0); - if (ret) - return ret; -- hw->rss_dis_flag = true; - - return 0; - } -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index e149c16bfe..d376486a1d 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -381,9 +381,6 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - uint8_t *key = rss_conf->rss_key; - int ret; - -- if (hw->rss_dis_flag) -- return -EINVAL; -- - if (key && key_len != HNS3_RSS_KEY_SIZE) { - hns3_err(hw, "the hash key len(%u) is invalid, must be %u", - key_len, HNS3_RSS_KEY_SIZE); --- -2.33.0 - diff --git a/0084-app-testpmd-check-statistics-query-before-printing.patch b/0084-app-testpmd-check-statistics-query-before-printing.patch deleted file mode 100644 index 871ecc8..0000000 --- a/0084-app-testpmd-check-statistics-query-before-printing.patch +++ /dev/null @@ -1,96 +0,0 @@ -From baef6bbfad1b9596c7051f5c1fcc308310296342 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Wed, 6 Apr 2022 16:45:36 +0800 -Subject: [PATCH] app/testpmd: check statistics query before printing - -In function 'fwd_stats_display', if function 'rte_eth_stats_get' fails, -'stats' is uncertainty value. The display result will be abnormal. - -This patch check the return value of 'rte_eth_stats_get' to avoid -display abnormal stats. - -Fixes: 53324971a14e ("app/testpmd: display/clear forwarding stats on demand") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) -Acked-by: Aman Singh ---- - app/test-pmd/config.c | 10 ++++++++-- - app/test-pmd/testpmd.c | 16 ++++++++++++++-- - 2 files changed, 22 insertions(+), 4 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index cc8e7aa138..bd689f9f86 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -249,14 +249,20 @@ nic_stats_display(portid_t port_id) - diff_ns; - uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx; - struct rte_eth_stats stats; -- - static const char *nic_stats_border = "########################"; -+ int ret; - - if (port_id_is_invalid(port_id, ENABLED_WARN)) { - print_valid_ports(); - return; - } -- rte_eth_stats_get(port_id, &stats); -+ ret = rte_eth_stats_get(port_id, &stats); -+ if (ret != 0) { -+ fprintf(stderr, -+ "%s: Error: failed to get stats (port %u): %d", -+ __func__, port_id, ret); -+ return; -+ } - printf("\n %s NIC statistics for port %-2d %s\n", - nic_stats_border, port_id, nic_stats_border); - -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index fe2ce19f99..79bb23264b 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -1982,6 +1982,7 @@ fwd_stats_display(void) - struct rte_port *port; - streamid_t sm_id; - portid_t pt_id; -+ int ret; - int i; - - memset(ports_stats, 0, sizeof(ports_stats)); -@@ -2013,7 +2014,13 @@ fwd_stats_display(void) - pt_id = fwd_ports_ids[i]; - port = &ports[pt_id]; - -- rte_eth_stats_get(pt_id, &stats); -+ ret = rte_eth_stats_get(pt_id, &stats); -+ if (ret != 0) { -+ fprintf(stderr, -+ "%s: Error: failed to get stats (port %u): %d", -+ __func__, pt_id, ret); -+ continue; -+ } - stats.ipackets -= port->stats.ipackets; - stats.opackets -= port->stats.opackets; - stats.ibytes -= port->stats.ibytes; -@@ -2108,11 +2115,16 @@ fwd_stats_reset(void) - { - streamid_t sm_id; - portid_t pt_id; -+ int ret; - int i; - - for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) { - pt_id = fwd_ports_ids[i]; -- rte_eth_stats_get(pt_id, &ports[pt_id].stats); -+ ret = rte_eth_stats_get(pt_id, &ports[pt_id].stats); -+ if (ret != 0) -+ fprintf(stderr, -+ "%s: Error: failed to clear stats (port %u):%d", -+ __func__, pt_id, ret); - } - for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) { - struct fwd_stream *fs = fwd_streams[sm_id]; --- -2.33.0 - diff --git a/0085-app-testpmd-fix-MTU-verification.patch b/0085-app-testpmd-fix-MTU-verification.patch deleted file mode 100644 index 4a04ea8..0000000 --- a/0085-app-testpmd-fix-MTU-verification.patch +++ /dev/null @@ -1,110 +0,0 @@ -From f0b3966a5072bd0a6c7f7e8652aef793afa4f4d0 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 6 Apr 2022 16:45:37 +0800 -Subject: [PATCH] app/testpmd: fix MTU verification - -The macro RTE_ETHER_MIN_LEN isn't the minimum value of MTU. But testpmd -used it when execute 'port config mtu 0 xx' cmd. This patch fixes it. - -Fixes: 1bb4a528c41f ("ethdev: fix max Rx packet length") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 4 --- - app/test-pmd/config.c | 55 ++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 55 insertions(+), 4 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 6ffea8e21a..91e4090582 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -2050,10 +2050,6 @@ cmd_config_mtu_parsed(void *parsed_result, - { - struct cmd_config_mtu_result *res = parsed_result; - -- if (res->value < RTE_ETHER_MIN_LEN) { -- fprintf(stderr, "mtu cannot be less than %d\n", RTE_ETHER_MIN_LEN); -- return; -- } - port_mtu_set(res->port_id, res->value); - } - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index bd689f9f86..1b1e738f83 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -1254,6 +1254,57 @@ port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t reg_v) - display_port_reg_value(port_id, reg_off, reg_v); - } - -+static uint32_t -+eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu) -+{ -+ uint32_t overhead_len; -+ -+ if (max_mtu != UINT16_MAX && max_rx_pktlen > max_mtu) -+ overhead_len = max_rx_pktlen - max_mtu; -+ else -+ overhead_len = RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; -+ -+ return overhead_len; -+} -+ -+static int -+eth_dev_validate_mtu(uint16_t port_id, uint16_t mtu) -+{ -+ struct rte_eth_dev_info dev_info; -+ uint32_t overhead_len; -+ uint32_t frame_size; -+ int ret; -+ -+ ret = rte_eth_dev_info_get(port_id, &dev_info); -+ if (ret != 0) -+ return ret; -+ -+ if (mtu < dev_info.min_mtu) { -+ fprintf(stderr, -+ "MTU (%u) < device min MTU (%u) for port_id %u\n", -+ mtu, dev_info.min_mtu, port_id); -+ return -EINVAL; -+ } -+ if (mtu > dev_info.max_mtu) { -+ fprintf(stderr, -+ "MTU (%u) > device max MTU (%u) for port_id %u\n", -+ mtu, dev_info.max_mtu, port_id); -+ return -EINVAL; -+ } -+ -+ overhead_len = eth_dev_get_overhead_len(dev_info.max_rx_pktlen, -+ dev_info.max_mtu); -+ frame_size = mtu + overhead_len; -+ if (frame_size > dev_info.max_rx_pktlen) { -+ fprintf(stderr, -+ "Frame size (%u) > device max frame size (%u) for port_id %u\n", -+ frame_size, dev_info.max_rx_pktlen, port_id); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ - void - port_mtu_set(portid_t port_id, uint16_t mtu) - { -@@ -1263,6 +1314,10 @@ port_mtu_set(portid_t port_id, uint16_t mtu) - if (port_id_is_invalid(port_id, ENABLED_WARN)) - return; - -+ diag = eth_dev_validate_mtu(port_id, mtu); -+ if (diag != 0) -+ return; -+ - if (port->need_reconfig == 0) { - diag = rte_eth_dev_set_mtu(port_id, mtu); - if (diag != 0) { --- -2.33.0 - diff --git a/0086-app-testpmd-fix-port-status-of-bonding-slave-device.patch b/0086-app-testpmd-fix-port-status-of-bonding-slave-device.patch deleted file mode 100644 index 170317a..0000000 --- a/0086-app-testpmd-fix-port-status-of-bonding-slave-device.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 82a85bc3c90744e171e0a16330685c4fd8c86a4a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 11 May 2022 10:14:34 +0800 -Subject: [PATCH 086/122] app/testpmd: fix port status of bonding slave device - -Starting or stopping a bonded port also starts or stops all active slaves -under the bonded port. If this port is a bonded device, we need to modify -the port status of all slaves. - -Fixes: 0e545d3047fe ("app/testpmd: check stopping port is not in bonding") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Acked-by: Aman Singh -Acked-by: Konstantin Ananyev ---- - app/test-pmd/cmdline.c | 1 + - app/test-pmd/testpmd.c | 73 +++++++++++++++++++++++++++++++++++++++--- - app/test-pmd/testpmd.h | 3 +- - 3 files changed, 72 insertions(+), 5 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 969a333c93..1991ee3446 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -6660,6 +6660,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result, - "Failed to enable promiscuous mode for port %u: %s - ignore\n", - port_id, rte_strerror(-ret)); - -+ ports[port_id].bond_flag = 1; - ports[port_id].need_setup = 0; - ports[port_id].port_status = RTE_PORT_STOPPED; - } -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index f9c025f97e..c4be9abe73 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -66,6 +66,9 @@ - #ifdef RTE_EXEC_ENV_WINDOWS - #include - #endif -+#ifdef RTE_NET_BOND -+#include -+#endif - - #include "testpmd.h" - -@@ -591,11 +594,58 @@ eth_dev_configure_mp(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, - return 0; - } - -+static int -+change_bonding_slave_port_status(portid_t bond_pid, bool is_stop) -+{ -+#ifdef RTE_NET_BOND -+ -+ portid_t slave_pids[RTE_MAX_ETHPORTS]; -+ struct rte_port *port; -+ int num_slaves; -+ portid_t slave_pid; -+ int i; -+ -+ num_slaves = rte_eth_bond_slaves_get(bond_pid, slave_pids, -+ RTE_MAX_ETHPORTS); -+ if (num_slaves < 0) { -+ fprintf(stderr, "Failed to get slave list for port = %u\n", -+ bond_pid); -+ return num_slaves; -+ } -+ -+ for (i = 0; i < num_slaves; i++) { -+ slave_pid = slave_pids[i]; -+ port = &ports[slave_pid]; -+ port->port_status = -+ is_stop ? RTE_PORT_STOPPED : RTE_PORT_STARTED; -+ } -+#else -+ RTE_SET_USED(bond_pid); -+ RTE_SET_USED(is_stop); -+#endif -+ return 0; -+} -+ - static int - eth_dev_start_mp(uint16_t port_id) - { -- if (is_proc_primary()) -- return rte_eth_dev_start(port_id); -+ int ret; -+ -+ if (is_proc_primary()) { -+ ret = rte_eth_dev_start(port_id); -+ if (ret != 0) -+ return ret; -+ -+ struct rte_port *port = &ports[port_id]; -+ -+ /* -+ * Starting a bonded port also starts all slaves under the bonded -+ * device. So if this port is bond device, we need to modify the -+ * port status of these slaves. -+ */ -+ if (port->bond_flag == 1) -+ return change_bonding_slave_port_status(port_id, false); -+ } - - return 0; - } -@@ -603,8 +653,23 @@ eth_dev_start_mp(uint16_t port_id) - static int - eth_dev_stop_mp(uint16_t port_id) - { -- if (is_proc_primary()) -- return rte_eth_dev_stop(port_id); -+ int ret; -+ -+ if (is_proc_primary()) { -+ ret = rte_eth_dev_stop(port_id); -+ if (ret != 0) -+ return ret; -+ -+ struct rte_port *port = &ports[port_id]; -+ -+ /* -+ * Stopping a bonded port also stops all slaves under the bonded -+ * device. So if this port is bond device, we need to modify the -+ * port status of these slaves. -+ */ -+ if (port->bond_flag == 1) -+ return change_bonding_slave_port_status(port_id, true); -+ } - - return 0; - } -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 2149ecd93a..9c24cb07e0 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -242,7 +242,8 @@ struct rte_port { - struct rte_eth_txconf tx_conf[RTE_MAX_QUEUES_PER_PORT+1]; /**< per queue tx configuration */ - struct rte_ether_addr *mc_addr_pool; /**< pool of multicast addrs */ - uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ -- uint8_t slave_flag; /**< bonding slave port */ -+ uint8_t slave_flag : 1, /**< bonding slave port */ -+ bond_flag : 1; /**< port is bond device */ - struct port_flow *flow_list; /**< Associated flows. */ - struct port_indirect_action *actions_list; - /**< Associated indirect actions. */ --- -2.22.0 - diff --git a/0087-ethdev-clarify-null-location-case-in-xstats-get.patch b/0087-ethdev-clarify-null-location-case-in-xstats-get.patch deleted file mode 100644 index e2b5f97..0000000 --- a/0087-ethdev-clarify-null-location-case-in-xstats-get.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 21658b863d246055c225286d9bce8a0a884fc9d9 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:49 +0800 -Subject: [PATCH 087/122] ethdev: clarify null location case in xstats get -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When xstats location is null in rte_eth_xstats_get() the return value -is not clearly specified. Some PMDs (eg. hns3/ipn3ke/mvpp2/axgbe) return -zero while others return the required number of elements. - -In this patch, special parameter combinations are restricted: - 1. highlight that xstats location may be null if and only if n is 0. - 2. amend n parameter description to specify that if n is lower than - the required number of elements, the function returns the required - number of elements. - 3. specify that if n is zero, the xstats must be NULL, the function - returns the required number of elements (a duplicate which should - help to not very attentive readers). - -Add sanity check for null xstats and non-zero n case on API level to -make it unnecessary to care about it in drivers. - -Fixes: ce757f5c9a4d ("ethdev: new method to retrieve extended statistics") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - lib/ethdev/rte_ethdev.c | 4 +++- - lib/ethdev/rte_ethdev.h | 6 +++++- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index cea2f0b498..b4a331b671 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -3319,6 +3319,8 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats, - int ret; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ if (xstats == NULL && n > 0) -+ return -EINVAL; - dev = &rte_eth_devices[port_id]; - - nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS); -@@ -3335,7 +3337,7 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats, - * xstats struct. - */ - xcount = (*dev->dev_ops->xstats_get)(dev, -- xstats ? xstats + count : NULL, -+ (n > count) ? xstats + count : NULL, - (n > count) ? n - count : 0); - - if (xcount < 0) -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index b8f135ba3f..082166ed42 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -3105,9 +3105,13 @@ int rte_eth_xstats_get_names(uint16_t port_id, - * @param xstats - * A pointer to a table of structure of type *rte_eth_xstat* - * to be filled with device statistics ids and values. -- * This parameter can be set to NULL if n is 0. -+ * This parameter can be set to NULL if and only if n is 0. - * @param n - * The size of the xstats array (number of elements). -+ * If lower than the required number of elements, the function returns -+ * the required number of elements. -+ * If equal to zero, the xstats must be NULL, the function returns the -+ * required number of elements. - * @return - * - A positive value lower or equal to n: success. The return value - * is the number of entries filled in the stats table. --- -2.22.0 - diff --git a/0088-ethdev-simplify-xstats-get-implementation.patch b/0088-ethdev-simplify-xstats-get-implementation.patch deleted file mode 100644 index aa8c197..0000000 --- a/0088-ethdev-simplify-xstats-get-implementation.patch +++ /dev/null @@ -1,50 +0,0 @@ -From a6cce2fd3fb2eda175989fd4a6dbfdd470a08189 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:50 +0800 -Subject: [PATCH 088/122] ethdev: simplify xstats get implementation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use eth_dev_get_xstats_basic_count() to retrieve generic statistics count. - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - lib/ethdev/rte_ethdev.c | 11 ++--------- - 1 file changed, 2 insertions(+), 9 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index b4a331b671..6110cd1893 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -3313,9 +3313,8 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats, - unsigned int n) - { - struct rte_eth_dev *dev; -- unsigned int count = 0, i; -+ unsigned int count, i; - signed int xcount = 0; -- uint16_t nb_rxqs, nb_txqs; - int ret; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -@@ -3323,13 +3322,7 @@ rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats, - return -EINVAL; - dev = &rte_eth_devices[port_id]; - -- nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS); -- nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS); -- -- /* Return generic statistics */ -- count = RTE_NB_STATS; -- if (dev->data->dev_flags & RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS) -- count += (nb_rxqs * RTE_NB_RXQ_STATS) + (nb_txqs * RTE_NB_TXQ_STATS); -+ count = eth_dev_get_xstats_basic_count(dev); - - /* implemented by the driver */ - if (dev->dev_ops->xstats_get != NULL) { --- -2.22.0 - diff --git a/0089-net-hns3-fix-xstats-get-return-if-xstats-is-null.patch b/0089-net-hns3-fix-xstats-get-return-if-xstats-is-null.patch deleted file mode 100644 index 4060a22..0000000 --- a/0089-net-hns3-fix-xstats-get-return-if-xstats-is-null.patch +++ /dev/null @@ -1,58 +0,0 @@ -From ae08d50d862073a8c53ed7ab4159f3125595667b Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:51 +0800 -Subject: [PATCH 089/122] net/hns3: fix xstats get return if xstats is null -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Many user (e.g. telemetry) invokes rte_eth_xstats_get(port_id, NULL, 0) -to retrieve the required number of elements, but currently hns3 PMD -returns zero when xstats is null. - -Dedicated check for xstats vs null is not required, since ethdev layer -guarantees that it may be null only if number of entries n is 0 (which -is definitely smaller than total xstats count). - -Fixes: 8839c5e202f3 ("net/hns3: support device stats") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - drivers/net/hns3/hns3_stats.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index 9b7ad067aa..e69761c8b3 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -1031,9 +1031,13 @@ hns3_imissed_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - * @praram xstats - * A pointer to a table of structure of type *rte_eth_xstat* - * to be filled with device statistics ids and values. -- * This parameter can be set to NULL if n is 0. -+ * This parameter can be set to NULL if and only if n is 0. - * @param n - * The size of the xstats array (number of elements). -+ * If lower than the required number of elements, the function returns the -+ * required number of elements. -+ * If equal to zero, the xstats parameter must be NULL, the function returns -+ * the required number of elements. - * @return - * 0 on fail, count(The size of the statistics elements) on success. - */ -@@ -1052,9 +1056,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - int count; - int ret; - -- if (xstats == NULL) -- return 0; -- - count = hns3_xstats_calc_num(dev); - if ((int)n < count) - return count; --- -2.22.0 - diff --git a/0090-net-ipn3ke-fix-xstats-get-return-if-xstats-is-null.patch b/0090-net-ipn3ke-fix-xstats-get-return-if-xstats-is-null.patch deleted file mode 100644 index c2c40e8..0000000 --- a/0090-net-ipn3ke-fix-xstats-get-return-if-xstats-is-null.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 15b2772cfbdc62631556222a1c15491125b14e2f Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:52 +0800 -Subject: [PATCH 090/122] net/ipn3ke: fix xstats get return if xstats is null -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Many user (e.g. telemetry) invokes rte_eth_xstats_get(port_id, NULL, 0) -to retrieve the required number of elements, but currently ipn3ke PMD -returns zero when xstats is null. - -Dedicated check for xstats vs null is not required, since ethdev layer -guarantees that it may be null only if number of entries n is 0 (which -is definitely smaller than total xstats count). - -Fixes: 5a6d883878db ("net/ipn3ke: implement statistics") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - drivers/net/ipn3ke/ipn3ke_representor.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c -index de325c7d29..8139e13a23 100644 ---- a/drivers/net/ipn3ke/ipn3ke_representor.c -+++ b/drivers/net/ipn3ke/ipn3ke_representor.c -@@ -2218,9 +2218,6 @@ ipn3ke_rpst_xstats_get - struct ipn3ke_rpst_hw_port_stats hw_stats; - struct rte_eth_stats stats; - -- if (!xstats) -- return 0; -- - if (!ethdev) { - IPN3KE_AFU_PMD_ERR("ethernet device to get statistics is NULL"); - return -EINVAL; --- -2.22.0 - diff --git a/0091-net-mvpp2-fix-xstats-get-return-if-xstats-is-null.patch b/0091-net-mvpp2-fix-xstats-get-return-if-xstats-is-null.patch deleted file mode 100644 index 43011cf..0000000 --- a/0091-net-mvpp2-fix-xstats-get-return-if-xstats-is-null.patch +++ /dev/null @@ -1,61 +0,0 @@ -From ae30c4a7b550e0ac12857279c0a337d80f73261c Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:53 +0800 -Subject: [PATCH 091/122] net/mvpp2: fix xstats get return if xstats is null -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Many user (e.g. telemetry) invokes rte_eth_xstats_get(port_id, NULL, 0) -to retrieve the required number of elements, but currently mvpp2 PMD -returns zero when xstats is null. - -Remove the logic of "return zero when xstats is NULL", and add the logic -of "return the required number of entries when n is lower than the -required number of entries". - -Fixes: a77b5378cd41 ("net/mrvl: add extended statistics") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - drivers/net/mvpp2/mrvl_ethdev.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c -index 9c7fe13f7f..2a8fb6cbce 100644 ---- a/drivers/net/mvpp2/mrvl_ethdev.c -+++ b/drivers/net/mvpp2/mrvl_ethdev.c -@@ -1626,13 +1626,14 @@ mrvl_xstats_get(struct rte_eth_dev *dev, - { - struct mrvl_priv *priv = dev->data->dev_private; - struct pp2_ppio_statistics ppio_stats; -- unsigned int i; -+ unsigned int i, count; - -- if (!stats) -- return 0; -+ count = RTE_DIM(mrvl_xstats_tbl); -+ if (n < count) -+ return count; - - pp2_ppio_get_statistics(priv->ppio, &ppio_stats, 0); -- for (i = 0; i < n && i < RTE_DIM(mrvl_xstats_tbl); i++) { -+ for (i = 0; i < count; i++) { - uint64_t val; - - if (mrvl_xstats_tbl[i].size == sizeof(uint32_t)) -@@ -1648,7 +1649,7 @@ mrvl_xstats_get(struct rte_eth_dev *dev, - stats[i].value = val; - } - -- return n; -+ return count; - } - - /** --- -2.22.0 - diff --git a/0092-net-axgbe-fix-xstats-get-return-if-xstats-is-null.patch b/0092-net-axgbe-fix-xstats-get-return-if-xstats-is-null.patch deleted file mode 100644 index 1b10848..0000000 --- a/0092-net-axgbe-fix-xstats-get-return-if-xstats-is-null.patch +++ /dev/null @@ -1,56 +0,0 @@ -From fc8702a84b7e794ab95aac021aa2cc3b4c92c5cd Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:54 +0800 -Subject: [PATCH 092/122] net/axgbe: fix xstats get return if xstats is null -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Many user (e.g. telemetry) invokes rte_eth_xstats_get(port_id, NULL, 0) -to retrieve the required number of elements, but currently axgbe PMD -returns zero when xstats is null. - -Remove the logic of "return zero when xstats is NULL", and add the logic -of "return the required number of entries when n is lower than the -required number of entries". - -Fixes: 9d1ef6b2e731 ("net/axgbe: add xstats") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - drivers/net/axgbe/axgbe_ethdev.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c -index 7d40c18a86..b209ab67cf 100644 ---- a/drivers/net/axgbe/axgbe_ethdev.c -+++ b/drivers/net/axgbe/axgbe_ethdev.c -@@ -1009,18 +1009,18 @@ axgbe_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, - struct axgbe_port *pdata = dev->data->dev_private; - unsigned int i; - -- if (!stats) -- return 0; -+ if (n < AXGBE_XSTATS_COUNT) -+ return AXGBE_XSTATS_COUNT; - - axgbe_read_mmc_stats(pdata); - -- for (i = 0; i < n && i < AXGBE_XSTATS_COUNT; i++) { -+ for (i = 0; i < AXGBE_XSTATS_COUNT; i++) { - stats[i].id = i; - stats[i].value = *(u64 *)((uint8_t *)&pdata->mmc_stats + - axgbe_xstats_strings[i].offset); - } - -- return i; -+ return AXGBE_XSTATS_COUNT; - } - - static int --- -2.22.0 - diff --git a/0093-ethdev-fix-memory-leak-in-xstats-telemetry.patch b/0093-ethdev-fix-memory-leak-in-xstats-telemetry.patch deleted file mode 100644 index 0cff404..0000000 --- a/0093-ethdev-fix-memory-leak-in-xstats-telemetry.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 30aa792dda9b9e361f1d00012304ee78472c80f6 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:55 +0800 -Subject: [PATCH 093/122] ethdev: fix memory leak in xstats telemetry -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The 'eth_xstats' should be freed after telemetry dictionary setup. - -Fixes: c190daedb9b1 ("ethdev: add telemetry callbacks") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - lib/ethdev/rte_ethdev.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 6110cd1893..1db59d3a0e 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6259,6 +6259,7 @@ eth_dev_handle_port_xstats(const char *cmd __rte_unused, - for (i = 0; i < num_xstats; i++) - rte_tel_data_add_dict_u64(d, xstat_names[i].name, - eth_xstats[i].value); -+ free(eth_xstats); - return 0; - } - --- -2.22.0 - diff --git a/0094-ethdev-fix-possible-null-pointer-access.patch b/0094-ethdev-fix-possible-null-pointer-access.patch deleted file mode 100644 index 977060c..0000000 --- a/0094-ethdev-fix-possible-null-pointer-access.patch +++ /dev/null @@ -1,37 +0,0 @@ -From bfe03dd331bcfda1ab9fcbe32305eb515b5d7e32 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:56 +0800 -Subject: [PATCH 094/122] ethdev: fix possible null pointer access -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The rte_tel_data_alloc() may return NULL, so the caller should add -judgement for it. - -Fixes: 083b0b310b19 ("ethdev: add common stats for telemetry") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - lib/ethdev/rte_ethdev.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 1db59d3a0e..e55d11937e 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6166,6 +6166,8 @@ eth_dev_add_port_queue_stats(struct rte_tel_data *d, uint64_t *q_stats, - { - int q; - struct rte_tel_data *q_data = rte_tel_data_alloc(); -+ if (q_data == NULL) -+ return; - rte_tel_data_start_array(q_data, RTE_TEL_U64_VAL); - for (q = 0; q < RTE_ETHDEV_QUEUE_STAT_CNTRS; q++) - rte_tel_data_add_array_u64(q_data, q_stats[q]); --- -2.22.0 - diff --git a/0095-net-cnxk-fix-possible-null-dereference-in-telemetry.patch b/0095-net-cnxk-fix-possible-null-dereference-in-telemetry.patch deleted file mode 100644 index 6147c58..0000000 --- a/0095-net-cnxk-fix-possible-null-dereference-in-telemetry.patch +++ /dev/null @@ -1,37 +0,0 @@ -From d3078f7a0fe21d94fa8d6027f2541311a990585a Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 13 May 2022 10:53:57 +0800 -Subject: [PATCH 095/122] net/cnxk: fix possible null dereference in telemetry -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The return value of rte_tel_data_alloc() may be null pointer. -Add missing check vs null. - -Fixes: 5ea354a1f2cc ("net/cnxk: support telemetry") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup -Reviewed-by: Andrew Rybchenko ---- - drivers/net/cnxk/cnxk_ethdev_telemetry.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/net/cnxk/cnxk_ethdev_telemetry.c b/drivers/net/cnxk/cnxk_ethdev_telemetry.c -index 83bc65848c..4fd9048643 100644 ---- a/drivers/net/cnxk/cnxk_ethdev_telemetry.c -+++ b/drivers/net/cnxk/cnxk_ethdev_telemetry.c -@@ -49,6 +49,8 @@ ethdev_tel_handle_info(const char *cmd __rte_unused, - rte_tel_data_add_dict_int(d, "n_ports", n_ports); - - i_data = rte_tel_data_alloc(); -+ if (i_data == NULL) -+ return -ENOMEM; - rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL); - - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { --- -2.22.0 - diff --git a/0096-net-bonding-fix-mbuf-fast-free-usage.patch b/0096-net-bonding-fix-mbuf-fast-free-usage.patch deleted file mode 100644 index 5c76dd7..0000000 --- a/0096-net-bonding-fix-mbuf-fast-free-usage.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 77eaa2e2b5ae1651abdaa0fb885bc3971e9e0587 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Wed, 25 May 2022 09:08:28 +0800 -Subject: [PATCH 096/122] net/bonding: fix mbuf fast free usage - -Usage of 'RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE' offload has two -constraints: per-queue all mbufs comes from the same mempool and -has refcnt = 1. - -Bonding mode Broadcast, Tx mbuf has more than one refcnt. -Bonding mode 8023AD, It contains two mempools separately for LACP -packets and other packets. In Tx or Rx, Fast mbuf free will operate -mbuf from different mempool. - -This patch will prevent 'RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE' offload -when in bonding mode Broadcast and mode 8023AD. - -Fixes: 78aecefed955 ("bond: move param parsing in configure step") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index c929b55768..0d6f0a30d1 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -3563,6 +3563,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - const char *name = dev->device->name; - struct bond_dev_private *internals = dev->data->dev_private; - struct rte_kvargs *kvlist = internals->kvlist; -+ uint64_t offloads; - int arg_count; - uint16_t port_id = dev - rte_eth_devices; - uint8_t agg_mode; -@@ -3613,6 +3614,16 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - } - } - -+ offloads = dev->data->dev_conf.txmode.offloads; -+ if ((offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) && -+ (internals->mode == BONDING_MODE_8023AD || -+ internals->mode == BONDING_MODE_BROADCAST)) { -+ RTE_BOND_LOG(WARNING, -+ "bond mode broadcast & 8023AD don't support MBUF_FAST_FREE offload, force disable it."); -+ offloads &= ~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; -+ dev->data->dev_conf.txmode.offloads = offloads; -+ } -+ - /* set the max_rx_pktlen */ - internals->max_rx_pktlen = internals->candidate_max_rx_pktlen; - --- -2.22.0 - diff --git a/0097-ethdev-fix-port-state-when-stop.patch b/0097-ethdev-fix-port-state-when-stop.patch deleted file mode 100644 index 6e952a7..0000000 --- a/0097-ethdev-fix-port-state-when-stop.patch +++ /dev/null @@ -1,36 +0,0 @@ -From df393a512efe98bffa9b872844ea999507e51fba Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Tue, 3 May 2022 18:02:17 +0800 -Subject: [PATCH 097/122] ethdev: fix port state when stop - -Currently, 'dev_started' is always set to be 0 when dev stop, whether -it succeeded or failed. This is unreasonable and this patch fixed it. - -Fixes: 62024eb82756 ("ethdev: change stop operation callback to return int") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) -Acked-by: Thomas Monjalon -Acked-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index e55d11937e..2671f47738 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -1879,8 +1879,9 @@ rte_eth_dev_stop(uint16_t port_id) - /* point fast-path functions to dummy ones */ - eth_dev_fp_ops_reset(rte_eth_fp_ops + port_id); - -- dev->data->dev_started = 0; - ret = (*dev->dev_ops->dev_stop)(dev); -+ if (ret == 0) -+ dev->data->dev_started = 0; - rte_ethdev_trace_stop(port_id, ret); - - return ret; --- -2.22.0 - diff --git a/0098-ethdev-fix-port-close-in-secondary-process.patch b/0098-ethdev-fix-port-close-in-secondary-process.patch deleted file mode 100644 index 9dcc92e..0000000 --- a/0098-ethdev-fix-port-close-in-secondary-process.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 8c0618338ca0b8a540980b4a475322f2cf48d9a6 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Wed, 1 Jun 2022 11:15:13 +0800 -Subject: [PATCH 098/122] ethdev: fix port close in secondary process - -Secondary process needs to close device to release process private -resources. But secondary process should not be obliged to wait for -device stop before closing ethdev. - -Fixes: febc855b358e ("ethdev: forbid closing started device") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) -Reviewed-by: Andrew Rybchenko ---- - lib/ethdev/rte_ethdev.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 2671f47738..25c9f0c123 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -1921,7 +1921,13 @@ rte_eth_dev_close(uint16_t port_id) - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); - dev = &rte_eth_devices[port_id]; - -- if (dev->data->dev_started) { -+ /* -+ * Secondary process needs to close device to release process private -+ * resources. But secondary process should not be obliged to wait -+ * for device stop before closing ethdev. -+ */ -+ if (rte_eal_process_type() == RTE_PROC_PRIMARY && -+ dev->data->dev_started) { - RTE_ETHDEV_LOG(ERR, "Cannot close started device (port %u)\n", - port_id); - return -EINVAL; --- -2.22.0 - diff --git a/0099-examples-dma-fix-MTU-configuration.patch b/0099-examples-dma-fix-MTU-configuration.patch deleted file mode 100644 index 6b6ecf3..0000000 --- a/0099-examples-dma-fix-MTU-configuration.patch +++ /dev/null @@ -1,95 +0,0 @@ -From f5e60c8f1d74d2a01f91fad546003eef876d71f1 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sun, 24 Apr 2022 14:07:39 +0800 -Subject: [PATCH 099/122] examples/dma: fix MTU configuration - -The MTU in dma App can be configured by 'max_frame_size' parameters which -have a default value(1518). It's not reasonable to use it directly as MTU. -This patch fix it. - -Fixes: 1bb4a528c41f ("ethdev: fix max Rx packet length") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li ---- - examples/dma/dmafwd.c | 43 +++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 39 insertions(+), 4 deletions(-) - -diff --git a/examples/dma/dmafwd.c b/examples/dma/dmafwd.c -index d074acc905..cfd978ec6c 100644 ---- a/examples/dma/dmafwd.c -+++ b/examples/dma/dmafwd.c -@@ -117,7 +117,7 @@ static uint16_t nb_txd = TX_DEFAULT_RINGSIZE; - static volatile bool force_quit; - - static uint32_t dma_batch_sz = MAX_PKT_BURST; --static uint32_t max_frame_size = RTE_ETHER_MAX_LEN; -+static uint32_t max_frame_size; - - /* ethernet addresses of ports */ - static struct rte_ether_addr dma_ports_eth_addr[RTE_MAX_ETHPORTS]; -@@ -851,6 +851,38 @@ assign_rings(void) - } - /* >8 End of assigning ring structures for packet exchanging. */ - -+static uint32_t -+eth_dev_get_overhead_len(uint32_t max_rx_pktlen, uint16_t max_mtu) -+{ -+ uint32_t overhead_len; -+ -+ if (max_mtu != UINT16_MAX && max_rx_pktlen > max_mtu) -+ overhead_len = max_rx_pktlen - max_mtu; -+ else -+ overhead_len = RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; -+ -+ return overhead_len; -+} -+ -+static int -+config_port_max_pkt_len(struct rte_eth_conf *conf, -+ struct rte_eth_dev_info *dev_info) -+{ -+ uint32_t overhead_len; -+ -+ if (max_frame_size == 0) -+ return 0; -+ -+ if (max_frame_size < RTE_ETHER_MIN_LEN) -+ return -1; -+ -+ overhead_len = eth_dev_get_overhead_len(dev_info->max_rx_pktlen, -+ dev_info->max_mtu); -+ conf->rxmode.mtu = max_frame_size - overhead_len; -+ -+ return 0; -+} -+ - /* - * Initializes a given port using global settings and with the RX buffers - * coming from the mbuf_pool passed as a parameter. -@@ -878,9 +910,6 @@ port_init(uint16_t portid, struct rte_mempool *mbuf_pool, uint16_t nb_queues) - struct rte_eth_dev_info dev_info; - int ret, i; - -- if (max_frame_size > local_port_conf.rxmode.mtu) -- local_port_conf.rxmode.mtu = max_frame_size; -- - /* Skip ports that are not enabled */ - if ((dma_enabled_port_mask & (1 << portid)) == 0) { - printf("Skipping disabled port %u\n", portid); -@@ -895,6 +924,12 @@ port_init(uint16_t portid, struct rte_mempool *mbuf_pool, uint16_t nb_queues) - rte_exit(EXIT_FAILURE, "Cannot get device info: %s, port=%u\n", - rte_strerror(-ret), portid); - -+ ret = config_port_max_pkt_len(&local_port_conf, &dev_info); -+ if (ret != 0) -+ rte_exit(EXIT_FAILURE, -+ "Invalid max frame size: %u (port %u)\n", -+ max_frame_size, portid); -+ - local_port_conf.rx_adv_conf.rss_conf.rss_hf &= - dev_info.flow_type_rss_offloads; - ret = rte_eth_dev_configure(portid, nb_queues, 1, &local_port_conf); --- -2.22.0 - diff --git a/0100-examples-dma-fix-Tx-drop-statistics.patch b/0100-examples-dma-fix-Tx-drop-statistics.patch deleted file mode 100644 index b82c3d4..0000000 --- a/0100-examples-dma-fix-Tx-drop-statistics.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 5059d5fd27626e1d34b6dcaa2e74c7a5f1c7ee1f Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sun, 24 Apr 2022 14:07:40 +0800 -Subject: [PATCH 100/122] examples/dma: fix Tx drop statistics - -The Tx drop statistic was designed to be collected by -rte_eth_dev_tx_buffer mechanism, but the application uses -rte_eth_tx_burst to send packets and this lead the Tx drop statistic -was not collected. - -This patch removes rte_eth_dev_tx_buffer mechanism to fix the problem. - -Fixes: 632bcd9b5d4f ("examples/ioat: print statistics") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Bruce Richardson -Acked-by: Kevin Laatz ---- - examples/dma/dmafwd.c | 27 +++++---------------------- - 1 file changed, 5 insertions(+), 22 deletions(-) - -diff --git a/examples/dma/dmafwd.c b/examples/dma/dmafwd.c -index cfd978ec6c..d7d39b6a14 100644 ---- a/examples/dma/dmafwd.c -+++ b/examples/dma/dmafwd.c -@@ -122,7 +122,6 @@ static uint32_t max_frame_size; - /* ethernet addresses of ports */ - static struct rte_ether_addr dma_ports_eth_addr[RTE_MAX_ETHPORTS]; - --static struct rte_eth_dev_tx_buffer *tx_buffer[RTE_MAX_ETHPORTS]; - struct rte_mempool *dma_pktmbuf_pool; - - /* Print out statistics for one port. */ -@@ -484,10 +483,13 @@ dma_tx_port(struct rxtx_port_config *tx_config) - - port_statistics.tx[tx_config->rxtx_port] += nb_tx; - -- /* Free any unsent packets. */ -- if (unlikely(nb_tx < nb_dq)) -+ if (unlikely(nb_tx < nb_dq)) { -+ port_statistics.tx_dropped[tx_config->rxtx_port] += -+ (nb_dq - nb_tx); -+ /* Free any unsent packets. */ - rte_mempool_put_bulk(dma_pktmbuf_pool, - (void *)&mbufs[nb_tx], nb_dq - nb_tx); -+ } - } - } - /* >8 End of transmitting packets from dmadev. */ -@@ -970,25 +972,6 @@ port_init(uint16_t portid, struct rte_mempool *mbuf_pool, uint16_t nb_queues) - "rte_eth_tx_queue_setup:err=%d,port=%u\n", - ret, portid); - -- /* Initialize TX buffers */ -- tx_buffer[portid] = rte_zmalloc_socket("tx_buffer", -- RTE_ETH_TX_BUFFER_SIZE(MAX_PKT_BURST), 0, -- rte_eth_dev_socket_id(portid)); -- if (tx_buffer[portid] == NULL) -- rte_exit(EXIT_FAILURE, -- "Cannot allocate buffer for tx on port %u\n", -- portid); -- -- rte_eth_tx_buffer_init(tx_buffer[portid], MAX_PKT_BURST); -- -- ret = rte_eth_tx_buffer_set_err_callback(tx_buffer[portid], -- rte_eth_tx_buffer_count_callback, -- &port_statistics.tx_dropped[portid]); -- if (ret < 0) -- rte_exit(EXIT_FAILURE, -- "Cannot set error callback for tx buffer on port %u\n", -- portid); -- - /* Start device. 8< */ - ret = rte_eth_dev_start(portid); - if (ret < 0) --- -2.22.0 - diff --git a/0101-examples-dma-add-force-minimal-copy-size-parameter.patch b/0101-examples-dma-add-force-minimal-copy-size-parameter.patch deleted file mode 100644 index b0c08c9..0000000 --- a/0101-examples-dma-add-force-minimal-copy-size-parameter.patch +++ /dev/null @@ -1,127 +0,0 @@ -From abc65cadf4b5ef0f898cb4851a100af26fbc55a6 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sun, 24 Apr 2022 14:07:41 +0800 -Subject: [PATCH 101/122] examples/dma: add force minimal copy size parameter - -This patch adds force minimal copy size parameter -(-m/--force-min-copy-size), so when do copy by CPU or DMA, the real copy -size will be the maximum of mbuf's data_len and this parameter. - -This parameter was designed to compare the performance between CPU copy -and DMA copy. User could send small packets with a high rate to drive -the performance test. - -Signed-off-by: Chengwen Feng -Acked-by: Bruce Richardson -Acked-by: Kevin Laatz ---- - examples/dma/dmafwd.c | 30 +++++++++++++++++++++++++++--- - 1 file changed, 27 insertions(+), 3 deletions(-) - -diff --git a/examples/dma/dmafwd.c b/examples/dma/dmafwd.c -index d7d39b6a14..9b17b40dbf 100644 ---- a/examples/dma/dmafwd.c -+++ b/examples/dma/dmafwd.c -@@ -25,6 +25,7 @@ - #define CMD_LINE_OPT_RING_SIZE "ring-size" - #define CMD_LINE_OPT_BATCH_SIZE "dma-batch-size" - #define CMD_LINE_OPT_FRAME_SIZE "max-frame-size" -+#define CMD_LINE_OPT_FORCE_COPY_SIZE "force-min-copy-size" - #define CMD_LINE_OPT_STATS_INTERVAL "stats-interval" - - /* configurable number of RX/TX ring descriptors */ -@@ -118,6 +119,7 @@ static volatile bool force_quit; - - static uint32_t dma_batch_sz = MAX_PKT_BURST; - static uint32_t max_frame_size; -+static uint32_t force_min_copy_size; - - /* ethernet addresses of ports */ - static struct rte_ether_addr dma_ports_eth_addr[RTE_MAX_ETHPORTS]; -@@ -205,7 +207,13 @@ print_stats(char *prgname) - "Rx Queues = %d, ", nb_queues); - status_strlen += snprintf(status_string + status_strlen, - sizeof(status_string) - status_strlen, -- "Ring Size = %d", ring_size); -+ "Ring Size = %d\n", ring_size); -+ status_strlen += snprintf(status_string + status_strlen, -+ sizeof(status_string) - status_strlen, -+ "Force Min Copy Size = %u Packet Data Room Size = %u", -+ force_min_copy_size, -+ rte_pktmbuf_data_room_size(dma_pktmbuf_pool) - -+ RTE_PKTMBUF_HEADROOM); - - memset(&ts, 0, sizeof(struct total_statistics)); - -@@ -303,7 +311,8 @@ static inline void - pktmbuf_sw_copy(struct rte_mbuf *src, struct rte_mbuf *dst) - { - rte_memcpy(rte_pktmbuf_mtod(dst, char *), -- rte_pktmbuf_mtod(src, char *), src->data_len); -+ rte_pktmbuf_mtod(src, char *), -+ RTE_MAX(src->data_len, force_min_copy_size)); - } - /* >8 End of perform packet copy there is a user-defined function. */ - -@@ -320,7 +329,9 @@ dma_enqueue_packets(struct rte_mbuf *pkts[], struct rte_mbuf *pkts_copy[], - ret = rte_dma_copy(dev_id, 0, - rte_pktmbuf_iova(pkts[i]), - rte_pktmbuf_iova(pkts_copy[i]), -- rte_pktmbuf_data_len(pkts[i]), 0); -+ RTE_MAX(rte_pktmbuf_data_len(pkts[i]), -+ force_min_copy_size), -+ 0); - - if (ret < 0) - break; -@@ -572,6 +583,7 @@ dma_usage(const char *prgname) - printf("%s [EAL options] -- -p PORTMASK [-q NQ]\n" - " -b --dma-batch-size: number of requests per DMA batch\n" - " -f --max-frame-size: max frame size\n" -+ " -m --force-min-copy-size: force a minimum copy length, even for smaller packets\n" - " -p --portmask: hexadecimal bitmask of ports to configure\n" - " -q NQ: number of RX queues per port (default is 1)\n" - " --[no-]mac-updating: Enable or disable MAC addresses updating (enabled by default)\n" -@@ -617,6 +629,7 @@ dma_parse_args(int argc, char **argv, unsigned int nb_ports) - "b:" /* dma batch size */ - "c:" /* copy type (sw|hw) */ - "f:" /* max frame size */ -+ "m:" /* force min copy size */ - "p:" /* portmask */ - "q:" /* number of RX queues per port */ - "s:" /* ring size */ -@@ -632,6 +645,7 @@ dma_parse_args(int argc, char **argv, unsigned int nb_ports) - {CMD_LINE_OPT_RING_SIZE, required_argument, NULL, 's'}, - {CMD_LINE_OPT_BATCH_SIZE, required_argument, NULL, 'b'}, - {CMD_LINE_OPT_FRAME_SIZE, required_argument, NULL, 'f'}, -+ {CMD_LINE_OPT_FORCE_COPY_SIZE, required_argument, NULL, 'm'}, - {CMD_LINE_OPT_STATS_INTERVAL, required_argument, NULL, 'i'}, - {NULL, 0, 0, 0} - }; -@@ -666,6 +680,10 @@ dma_parse_args(int argc, char **argv, unsigned int nb_ports) - } - break; - -+ case 'm': -+ force_min_copy_size = atoi(optarg); -+ break; -+ - /* portmask */ - case 'p': - dma_enabled_port_mask = dma_parse_portmask(optarg); -@@ -1064,6 +1082,12 @@ main(int argc, char **argv) - rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n"); - /* >8 End of allocates mempool to hold the mbufs. */ - -+ if (force_min_copy_size > -+ (uint32_t)(rte_pktmbuf_data_room_size(dma_pktmbuf_pool) - -+ RTE_PKTMBUF_HEADROOM)) -+ rte_exit(EXIT_FAILURE, -+ "Force min copy size > packet mbuf size\n"); -+ - /* Initialize each port. 8< */ - cfg.nb_ports = 0; - RTE_ETH_FOREACH_DEV(portid) --- -2.22.0 - diff --git a/0102-dma-hisilicon-fix-index-returned-when-no-DMA-complet.patch b/0102-dma-hisilicon-fix-index-returned-when-no-DMA-complet.patch deleted file mode 100644 index 0924a01..0000000 --- a/0102-dma-hisilicon-fix-index-returned-when-no-DMA-complet.patch +++ /dev/null @@ -1,54 +0,0 @@ -From efe4049f48dd09ea069354f7e515bf7d81aa0f92 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 27 May 2022 11:40:52 +0800 -Subject: [PATCH 102/122] dma/hisilicon: fix index returned when no DMA - completed - -If no DMA request is completed, the ring_idx of the last completed -operation need returned by last_idx parameter. This patch fixes it. - -Fixes: 2db4f0b82360 ("dma/hisilicon: add data path") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index 9cef2cbfbe..f5c3cd914d 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -702,12 +702,12 @@ hisi_dma_completed(void *dev_private, - } - sq_head = (sq_head + 1) & hw->sq_depth_mask; - } -+ *last_idx = hw->cridx + i - 1; - if (i > 0) { - hw->cridx += i; -- *last_idx = hw->cridx - 1; - hw->sq_head = sq_head; -+ hw->completed += i; - } -- hw->completed += i; - - return i; - } -@@ -761,12 +761,12 @@ hisi_dma_completed_status(void *dev_private, - hw->status[sq_head] = HISI_DMA_STATUS_SUCCESS; - sq_head = (sq_head + 1) & hw->sq_depth_mask; - } -+ *last_idx = hw->cridx + cpl_num - 1; - if (likely(cpl_num > 0)) { - hw->cridx += cpl_num; -- *last_idx = hw->cridx - 1; - hw->sq_head = sq_head; -+ hw->completed += cpl_num; - } -- hw->completed += cpl_num; - - return cpl_num; - } --- -2.22.0 - diff --git a/0103-test-dma-check-index-when-no-DMA-completed.patch b/0103-test-dma-check-index-when-no-DMA-completed.patch deleted file mode 100644 index 35b0e1f..0000000 --- a/0103-test-dma-check-index-when-no-DMA-completed.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 33e515de3d5d00094f934e10b2d15af8e52511b5 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 27 May 2022 11:40:53 +0800 -Subject: [PATCH 103/122] test/dma: check index when no DMA completed - -If no DMA request is completed, the ring_idx of the last completed -operation need returned by last_idx parameter. This patch adds -testcase for it. - -Signed-off-by: Chengwen Feng -Tested-by: Kevin Laatz ---- - app/test/test_dmadev.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c -index b206db27ae..d9e8f6d8c3 100644 ---- a/app/test/test_dmadev.c -+++ b/app/test/test_dmadev.c -@@ -177,6 +177,7 @@ do_multi_copies(int16_t dev_id, uint16_t vchan, - static int - test_enqueue_copies(int16_t dev_id, uint16_t vchan) - { -+ enum rte_dma_status_code status; - unsigned int i; - uint16_t id; - -@@ -215,6 +216,20 @@ test_enqueue_copies(int16_t dev_id, uint16_t vchan) - ERR_RETURN("Error:incorrect job id received, %u [expected %u]\n", - id, id_count); - -+ /* check for completed and id when no job done */ -+ if (rte_dma_completed(dev_id, vchan, 1, &id, NULL) != 0) -+ ERR_RETURN("Error with rte_dma_completed when no job done\n"); -+ if (id != id_count) -+ ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n", -+ id, id_count); -+ -+ /* check for completed_status and id when no job done */ -+ if (rte_dma_completed_status(dev_id, vchan, 1, &id, &status) != 0) -+ ERR_RETURN("Error with rte_dma_completed_status when no job done\n"); -+ if (id != id_count) -+ ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n", -+ id, id_count); -+ - rte_pktmbuf_free(src); - rte_pktmbuf_free(dst); - --- -2.22.0 - diff --git a/0104-dma-hisilicon-enhance-CQ-scan-robustness.patch b/0104-dma-hisilicon-enhance-CQ-scan-robustness.patch deleted file mode 100644 index d4da26d..0000000 --- a/0104-dma-hisilicon-enhance-CQ-scan-robustness.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 5b84cc2a652f2646d2d4b4cdc1e6b00c13f4d790 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 27 May 2022 11:40:54 +0800 -Subject: [PATCH 104/122] dma/hisilicon: enhance CQ scan robustness - -The CQ (completion queue) descriptors were updated by hardware, and then -scanned by driver to retrieve hardware completion status. - -This patch enhances robustness by following: -1. replace while (true) with a finite loop to avoid potential dead loop. -2. check the csq_head field in CQ descriptor to avoid status array -overflows. - -Fixes: 2db4f0b82360 ("dma/hisilicon: add data path") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index f5c3cd914d..fbe09284ed 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -634,7 +634,7 @@ hisi_dma_scan_cq(struct hisi_dma_dev *hw) - uint16_t count = 0; - uint64_t misc; - -- while (true) { -+ while (count < hw->cq_depth) { - cqe = &hw->cqe[cq_head]; - misc = cqe->misc; - misc = rte_le_to_cpu_64(misc); -@@ -642,6 +642,16 @@ hisi_dma_scan_cq(struct hisi_dma_dev *hw) - break; - - csq_head = FIELD_GET(CQE_SQ_HEAD_MASK, misc); -+ if (unlikely(csq_head > hw->sq_depth_mask)) { -+ /** -+ * Defensive programming to prevent overflow of the -+ * status array indexed by csq_head. Only error logs -+ * are used for prompting. -+ */ -+ HISI_DMA_ERR(hw, "invalid csq_head:%u!\n", csq_head); -+ count = 0; -+ break; -+ } - if (unlikely(misc & CQE_STATUS_MASK)) - hw->status[csq_head] = FIELD_GET(CQE_STATUS_MASK, - misc); --- -2.22.0 - diff --git a/0105-net-failsafe-fix-device-freeing.patch b/0105-net-failsafe-fix-device-freeing.patch deleted file mode 100644 index 8579b7c..0000000 --- a/0105-net-failsafe-fix-device-freeing.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f74659ac42dca5d47b03de3b22010a0f45434137 Mon Sep 17 00:00:00 2001 -From: Yunjian Wang -Date: Tue, 7 Jun 2022 14:50:49 +0800 -Subject: [PATCH 105/122] net/failsafe: fix device freeing - -The PMD destroy function was calling the release function, which frees -dev->data->dev_private, and then tries to free PRIV(dev)->intr_handle, -which causes the heap use after free issue. - -The free can be moved to before the release function is called. - -Fixes: d61138d4f0e ("drivers: remove direct access to interrupt handle") -Cc: stable@dpdk.org - -Signed-off-by: Yunjian Wang -Reviewed-by: Andrew Rybchenko ---- - drivers/net/failsafe/failsafe.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c -index 3c754a5f66..05cf533896 100644 ---- a/drivers/net/failsafe/failsafe.c -+++ b/drivers/net/failsafe/failsafe.c -@@ -308,8 +308,8 @@ fs_rte_eth_free(const char *name) - if (dev == NULL) - return 0; /* port already released */ - ret = failsafe_eth_dev_close(dev); -- rte_eth_dev_release_port(dev); - rte_intr_instance_free(PRIV(dev)->intr_handle); -+ rte_eth_dev_release_port(dev); - return ret; - } - --- -2.22.0 - diff --git a/0106-net-tap-fix-device-freeing.patch b/0106-net-tap-fix-device-freeing.patch deleted file mode 100644 index 1468924..0000000 --- a/0106-net-tap-fix-device-freeing.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 601f63e2f591a0b191c0ab0d4b39e826b15a0226 Mon Sep 17 00:00:00 2001 -From: Yunjian Wang -Date: Tue, 7 Jun 2022 14:50:57 +0800 -Subject: [PATCH 106/122] net/tap: fix device freeing - -The error path was calling rte_eth_dev_release_port() function, -which frees eth_dev->data->dev_private, and then tries to free -pmd->intr_handle, which causes the use after free issue. - -The free can be moved to before the release function is called. - -Fixes: d61138d4f0e ("drivers: remove direct access to interrupt handle") -Cc: stable@dpdk.org - -Signed-off-by: Xiangjun Meng -Signed-off-by: Yunjian Wang -Reviewed-by: Andrew Rybchenko ---- - drivers/net/tap/rte_eth_tap.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c -index f1b48cae82..ddca630574 100644 ---- a/drivers/net/tap/rte_eth_tap.c -+++ b/drivers/net/tap/rte_eth_tap.c -@@ -2099,8 +2099,8 @@ eth_dev_tap_create(struct rte_vdev_device *vdev, const char *tap_name, - close(pmd->ioctl_sock); - /* mac_addrs must not be freed alone because part of dev_private */ - dev->data->mac_addrs = NULL; -- rte_eth_dev_release_port(dev); - rte_intr_instance_free(pmd->intr_handle); -+ rte_eth_dev_release_port(dev); - - error_exit_nodev: - TAP_LOG(ERR, "%s Unable to initialize %s", --- -2.22.0 - diff --git a/0107-net-bonding-fix-RSS-inconsistent-between-bonded-and-.patch b/0107-net-bonding-fix-RSS-inconsistent-between-bonded-and-.patch deleted file mode 100644 index 08130df..0000000 --- a/0107-net-bonding-fix-RSS-inconsistent-between-bonded-and-.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 440f7e8f67673b8482d1b8e779ea93603f37c21f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 8 Jun 2022 19:45:47 +0800 -Subject: [PATCH 107/122] net/bonding: fix RSS inconsistent between bonded and - slaves - -Currently, RSS configuration of slave is set only when RSS is enabled for -bonded port. If RSS is enabled for the slaves port before adding to the -bonded port with disabling RSS, it will run into that the RSS enabled state -of bonded and slaves port is inconsistent after starting bonded port. -So the RSS configuration of slave should also be set when RSS is disabled -for bonded port. - -Fixes: 734ce47f71e0 ("bonding: support RSS dynamic configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu -Reviewed-by: Andrew Rybchenko ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 0d6f0a30d1..09636321cd 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1711,6 +1711,12 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - bonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf; - slave_eth_dev->data->dev_conf.rxmode.mq_mode = - bonded_eth_dev->data->dev_conf.rxmode.mq_mode; -+ } else { -+ slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len = 0; -+ slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL; -+ slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0; -+ slave_eth_dev->data->dev_conf.rxmode.mq_mode = -+ bonded_eth_dev->data->dev_conf.rxmode.mq_mode; - } - - slave_eth_dev->data->dev_conf.rxmode.mtu = --- -2.22.0 - diff --git a/0108-app-test-fix-bonding-RSS-test-when-disable-RSS.patch b/0108-app-test-fix-bonding-RSS-test-when-disable-RSS.patch deleted file mode 100644 index 435cc18..0000000 --- a/0108-app-test-fix-bonding-RSS-test-when-disable-RSS.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 36c97bb881ddd7caaf8d9e3885a747880024c3fd Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 8 Jun 2022 19:45:48 +0800 -Subject: [PATCH 108/122] app/test: fix bonding RSS test when disable RSS - -The "test_rss_lazy" test is used for testing bonding RSS functions -when bonded port disable RSS. Currently, this test case can update -RSS functions of bonded and slave port if bonded port turns off RSS. -It is unreasonable and has been adjusted to be non-updateable in -following patch: -"93e1ea6dfa99 ethdev: fix RSS update when RSS is disabled" - -So this patch fixes this test code. - -Fixes: 43b630244e7e ("app/test: add dynamic bonding RSS configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - app/test/test_link_bonding_rssconf.c | 78 ++++++++++++++++++++++++++-- - 1 file changed, 73 insertions(+), 5 deletions(-) - -diff --git a/app/test/test_link_bonding_rssconf.c b/app/test/test_link_bonding_rssconf.c -index f9eae93973..a5aba6b2b9 100644 ---- a/app/test/test_link_bonding_rssconf.c -+++ b/app/test/test_link_bonding_rssconf.c -@@ -464,15 +464,85 @@ test_rss(void) - - TEST_ASSERT_SUCCESS(test_propagate(), "Propagation test failed"); - -- TEST_ASSERT(slave_remove_and_add() == 1, "New slave should be synced"); -+ TEST_ASSERT(slave_remove_and_add() == 1, "remove and add slaves success."); - - remove_slaves_and_stop_bonded_device(); - - return TEST_SUCCESS; - } - -+ -+/** -+ * Test RSS configuration over bonded and slaves. -+ */ -+static int -+test_rss_config_lazy(void) -+{ -+ struct rte_eth_rss_conf bond_rss_conf = {0}; -+ struct slave_conf *port; -+ uint8_t rss_key[40]; -+ uint64_t rss_hf; -+ int retval; -+ uint16_t i; -+ uint8_t n; -+ -+ retval = rte_eth_dev_info_get(test_params.bond_port_id, -+ &test_params.bond_dev_info); -+ TEST_ASSERT((retval == 0), "Error during getting device (port %u) info: %s\n", -+ test_params.bond_port_id, strerror(-retval)); -+ -+ rss_hf = test_params.bond_dev_info.flow_type_rss_offloads; -+ if (rss_hf != 0) { -+ bond_rss_conf.rss_key = NULL; -+ bond_rss_conf.rss_hf = rss_hf; -+ retval = rte_eth_dev_rss_hash_update(test_params.bond_port_id, -+ &bond_rss_conf); -+ TEST_ASSERT(retval != 0, "Succeeded in setting bonded port hash function"); -+ } -+ -+ /* Set all keys to zero for all slaves */ -+ FOR_EACH_PORT(n, port) { -+ port = &test_params.slave_ports[n]; -+ retval = rte_eth_dev_rss_hash_conf_get(port->port_id, -+ &port->rss_conf); -+ TEST_ASSERT_SUCCESS(retval, "Cannot get slaves RSS configuration"); -+ memset(port->rss_key, 0, sizeof(port->rss_key)); -+ port->rss_conf.rss_key = port->rss_key; -+ port->rss_conf.rss_key_len = sizeof(port->rss_key); -+ retval = rte_eth_dev_rss_hash_update(port->port_id, -+ &port->rss_conf); -+ TEST_ASSERT(retval != 0, "Succeeded in setting slaves RSS keys"); -+ } -+ -+ /* Set RSS keys for bonded port */ -+ memset(rss_key, 1, sizeof(rss_key)); -+ bond_rss_conf.rss_hf = rss_hf; -+ bond_rss_conf.rss_key = rss_key; -+ bond_rss_conf.rss_key_len = sizeof(rss_key); -+ -+ retval = rte_eth_dev_rss_hash_update(test_params.bond_port_id, -+ &bond_rss_conf); -+ TEST_ASSERT(retval != 0, "Succeeded in setting bonded port RSS keys"); -+ -+ /* Test RETA propagation */ -+ for (i = 0; i < RXTX_QUEUE_COUNT; i++) { -+ FOR_EACH_PORT(n, port) { -+ port = &test_params.slave_ports[n]; -+ retval = reta_set(port->port_id, (i + 1) % RXTX_QUEUE_COUNT, -+ port->dev_info.reta_size); -+ TEST_ASSERT(retval != 0, "Succeeded in setting slaves RETA"); -+ } -+ -+ retval = reta_set(test_params.bond_port_id, i % RXTX_QUEUE_COUNT, -+ test_params.bond_dev_info.reta_size); -+ TEST_ASSERT(retval != 0, "Succeeded in setting bonded port RETA"); -+ } -+ -+ return TEST_SUCCESS; -+} -+ - /** -- * Test propagation logic, when RX_RSS mq_mode is turned off for bonding port -+ * Test RSS function logic, when RX_RSS mq_mode is turned off for bonding port - */ - static int - test_rss_lazy(void) -@@ -493,9 +563,7 @@ test_rss_lazy(void) - TEST_ASSERT_SUCCESS(rte_eth_dev_start(test_params.bond_port_id), - "Failed to start bonding port (%d).", test_params.bond_port_id); - -- TEST_ASSERT_SUCCESS(test_propagate(), "Propagation test failed"); -- -- TEST_ASSERT(slave_remove_and_add() == 0, "New slave shouldn't be synced"); -+ TEST_ASSERT_SUCCESS(test_rss_config_lazy(), "Succeeded in setting RSS hash when RX_RSS mq_mode is turned off"); - - remove_slaves_and_stop_bonded_device(); - --- -2.22.0 - diff --git a/0109-net-hns3-add-check-for-deferred-start-queue-when-rol.patch b/0109-net-hns3-add-check-for-deferred-start-queue-when-rol.patch deleted file mode 100644 index bf17159..0000000 --- a/0109-net-hns3-add-check-for-deferred-start-queue-when-rol.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 256f7ae943d4c15cca9cdf11ce84d4c8b536ad20 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:41 +0800 -Subject: [PATCH 109/122] net/hns3: add check for deferred start queue when - rollback - -Driver doesn't allocate mbufs for the deferred start queues, so no need to -free it when rollback. - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index d3fa4889d2..a9b997d32e 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1202,6 +1202,9 @@ hns3_init_rx_queues(struct hns3_adapter *hns) - out: - for (j = 0; j < i; j++) { - rxq = (struct hns3_rx_queue *)hw->data->rx_queues[j]; -+ if (rxq->rx_deferred_start) -+ continue; -+ - hns3_rx_queue_release_mbufs(rxq); - } - --- -2.22.0 - diff --git a/0110-net-hns3-remove-redundant-parentheses.patch b/0110-net-hns3-remove-redundant-parentheses.patch deleted file mode 100644 index dd641e0..0000000 --- a/0110-net-hns3-remove-redundant-parentheses.patch +++ /dev/null @@ -1,38 +0,0 @@ -From e4fd147156e0b915ff6787824889bb552965ebfd Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:42 +0800 -Subject: [PATCH 110/122] net/hns3: remove redundant parentheses - -Remove redundant parentheses. - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index a9b997d32e..ee0aaaf7fc 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -170,7 +170,7 @@ hns3_fake_rx_queue_release(struct hns3_rx_queue *queue) - } - - /* free fake rx queue arrays */ -- if (idx == (hw->fkq_data.nb_fake_rx_queues - 1)) { -+ if (idx == hw->fkq_data.nb_fake_rx_queues - 1) { - hw->fkq_data.nb_fake_rx_queues = 0; - rte_free(hw->fkq_data.rx_queues); - hw->fkq_data.rx_queues = NULL; -@@ -197,7 +197,7 @@ hns3_fake_tx_queue_release(struct hns3_tx_queue *queue) - } - - /* free fake tx queue arrays */ -- if (idx == (hw->fkq_data.nb_fake_tx_queues - 1)) { -+ if (idx == hw->fkq_data.nb_fake_tx_queues - 1) { - hw->fkq_data.nb_fake_tx_queues = 0; - rte_free(hw->fkq_data.tx_queues); - hw->fkq_data.tx_queues = NULL; --- -2.22.0 - diff --git a/0111-net-hns3-adjust-the-data-type-of-some-variables.patch b/0111-net-hns3-adjust-the-data-type-of-some-variables.patch deleted file mode 100644 index 061bda5..0000000 --- a/0111-net-hns3-adjust-the-data-type-of-some-variables.patch +++ /dev/null @@ -1,227 +0,0 @@ -From ca3ada1984f4c159ae2c7e94c82f38d0f239ba84 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:43 +0800 -Subject: [PATCH 111/122] net/hns3: adjust the data type of some variables - -Using the 'int' type and 'uint16_t' type to compare is insecure. -Make them consistent. - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_common.c | 4 ++-- - drivers/net/hns3/hns3_dcb.c | 2 +- - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_regs.c | 2 +- - drivers/net/hns3/hns3_rss.c | 2 +- - drivers/net/hns3/hns3_rxtx.c | 23 ++++++++++++----------- - drivers/net/hns3/hns3_rxtx_vec.h | 4 ++-- - 7 files changed, 20 insertions(+), 19 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 9c86c00a04..edd16d8076 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -475,7 +475,7 @@ hns3_configure_all_mac_addr(struct hns3_adapter *hns, bool del) - struct rte_ether_addr *addr; - uint16_t mac_addrs_capa; - int ret = 0; -- int i; -+ uint16_t i; - - mac_addrs_capa = - hns->is_vf ? HNS3_VF_UC_MACADDR_NUM : HNS3_UC_MACADDR_NUM; -@@ -645,8 +645,8 @@ int - hns3_init_ring_with_vector(struct hns3_hw *hw) - { - uint16_t vec; -+ uint16_t i; - int ret; -- int i; - - /* - * In hns3 network engine, vector 0 is always the misc interrupt of this -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index 136ada626b..d88757611c 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -628,7 +628,7 @@ hns3_set_rss_size(struct hns3_hw *hw, uint16_t nb_rx_q) - struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint16_t rx_qnum_per_tc; - uint16_t used_rx_queues; -- int i; -+ uint16_t i; - - rx_qnum_per_tc = nb_rx_q / hw->num_tc; - if (rx_qnum_per_tc > hw->rss_size_max) { -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 29c9f96c05..97cf27d2a1 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2929,8 +2929,8 @@ hns3_map_tqps_to_func(struct hns3_hw *hw, uint16_t func_id, uint16_t tqp_pid, - static int - hns3_map_tqp(struct hns3_hw *hw) - { -+ uint16_t i; - int ret; -- int i; - - /* - * In current version, VF is not supported when PF is driven by DPDK -diff --git a/drivers/net/hns3/hns3_regs.c b/drivers/net/hns3/hns3_regs.c -index 86a4cf74d5..6778e4cfc2 100644 ---- a/drivers/net/hns3/hns3_regs.c -+++ b/drivers/net/hns3/hns3_regs.c -@@ -294,8 +294,8 @@ hns3_direct_access_regs(struct hns3_hw *hw, uint32_t *data) - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - uint32_t *origin_data_ptr = data; - uint32_t reg_offset; -+ uint16_t i, j; - int reg_num; -- int i, j; - - /* fetching per-PF registers values from PF PCIe register space */ - reg_num = sizeof(cmdq_reg_addrs) / sizeof(uint32_t); -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index d376486a1d..4c546c9363 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -631,7 +631,7 @@ hns3_rss_set_default_args(struct hns3_hw *hw) - { - struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint16_t queue_num = hw->alloc_rss_size; -- int i; -+ uint16_t i; - - /* Default hash algorithm */ - rss_cfg->conf.func = RTE_ETH_HASH_FUNCTION_TOEPLITZ; -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index ee0aaaf7fc..510802be05 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -390,7 +390,7 @@ hns3_enable_all_queues(struct hns3_hw *hw, bool en) - struct hns3_tx_queue *txq; - uint32_t rcb_reg; - void *tqp_base; -- int i; -+ uint16_t i; - - for (i = 0; i < hw->cfg_max_queues; i++) { - if (hns3_dev_get_support(hw, INDEP_TXRX)) { -@@ -736,8 +736,8 @@ hns3pf_reset_all_tqps(struct hns3_hw *hw) - #define HNS3_RESET_RCB_NOT_SUPPORT 0U - #define HNS3_RESET_ALL_TQP_SUCCESS 1U - uint8_t reset_status; -+ uint16_t i; - int ret; -- int i; - - ret = hns3_reset_rcb_cmd(hw, &reset_status); - if (ret) -@@ -774,7 +774,7 @@ hns3vf_reset_all_tqps(struct hns3_hw *hw) - uint8_t reset_status; - uint8_t msg_data[2]; - int ret; -- int i; -+ uint16_t i; - - memset(msg_data, 0, sizeof(uint16_t)); - ret = hns3_send_mbx_msg(hw, HNS3_MBX_QUEUE_RESET, 0, msg_data, -@@ -806,7 +806,8 @@ int - hns3_reset_all_tqps(struct hns3_adapter *hns) - { - struct hns3_hw *hw = &hns->hw; -- int ret, i; -+ uint16_t i; -+ int ret; - - /* Disable all queues before reset all queues */ - for (i = 0; i < hw->cfg_max_queues; i++) { -@@ -1037,7 +1038,7 @@ hns3_dev_all_rx_queue_intr_enable(struct hns3_hw *hw, bool en) - { - struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; - uint16_t nb_rx_q = hw->data->nb_rx_queues; -- int i; -+ uint16_t i; - - if (dev->data->dev_conf.intr_conf.rxq == 0) - return; -@@ -1121,7 +1122,7 @@ static void - hns3_init_txq(struct hns3_tx_queue *txq) - { - struct hns3_desc *desc; -- int i; -+ uint16_t i; - - /* Clear tx bd */ - desc = txq->tx_ring; -@@ -1145,7 +1146,7 @@ hns3_init_tx_ring_tc(struct hns3_adapter *hns) - - for (i = 0; i < HNS3_MAX_TC_NUM; i++) { - struct hns3_tc_queue_info *tc_queue = &hw->tc_queue[i]; -- int j; -+ uint16_t j; - - if (!tc_queue->enable) - continue; -@@ -1442,7 +1443,7 @@ hns3_alloc_txq_and_dma_zone(struct rte_eth_dev *dev, - struct hns3_tx_queue *txq; - struct hns3_desc *desc; - unsigned int tx_desc; -- int i; -+ uint16_t i; - - txq = rte_zmalloc_socket(q_info->type, sizeof(struct hns3_tx_queue), - RTE_CACHE_LINE_SIZE, q_info->socket_id); -@@ -1679,7 +1680,7 @@ hns3_dev_release_mbufs(struct hns3_adapter *hns) - struct rte_eth_dev_data *dev_data = hns->hw.data; - struct hns3_rx_queue *rxq; - struct hns3_tx_queue *txq; -- int i; -+ uint16_t i; - - if (dev_data->rx_queues) - for (i = 0; i < dev_data->nb_rx_queues; i++) { -@@ -3086,7 +3087,7 @@ hns3_tx_free_useless_buffer(struct hns3_tx_queue *txq) - uint16_t tx_next_use = txq->next_to_use; - struct hns3_entry *tx_entry = &txq->sw_ring[tx_next_clean]; - struct hns3_desc *desc = &txq->tx_ring[tx_next_clean]; -- int i; -+ uint16_t i; - - if (tx_next_use >= tx_next_clean && - tx_next_use < tx_next_clean + txq->tx_rs_thresh) -@@ -3984,7 +3985,7 @@ hns3_tx_free_buffer_simple(struct hns3_tx_queue *txq) - struct hns3_entry *tx_entry; - struct hns3_desc *desc; - uint16_t tx_next_clean; -- int i; -+ uint16_t i; - - while (1) { - if (HNS3_GET_TX_QUEUE_PEND_BD_NUM(txq) < txq->tx_rs_thresh) -diff --git a/drivers/net/hns3/hns3_rxtx_vec.h b/drivers/net/hns3/hns3_rxtx_vec.h -index 4985a7cae8..d13f18627d 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.h -+++ b/drivers/net/hns3/hns3_rxtx_vec.h -@@ -15,7 +15,7 @@ hns3_tx_bulk_free_buffers(struct hns3_tx_queue *txq) - struct hns3_entry *tx_entry; - struct rte_mbuf *m; - int nb_free = 0; -- int i; -+ uint16_t i; - - tx_entry = &txq->sw_ring[txq->next_to_clean]; - if (txq->mbuf_fast_free_en) { -@@ -56,7 +56,7 @@ static inline void - hns3_tx_free_buffers(struct hns3_tx_queue *txq) - { - struct hns3_desc *tx_desc; -- int i; -+ uint16_t i; - - /* - * All mbufs can be released only when the VLD bits of all --- -2.22.0 - diff --git a/0112-net-hns3-fix-an-unreasonable-memset.patch b/0112-net-hns3-fix-an-unreasonable-memset.patch deleted file mode 100644 index 4f93c18..0000000 --- a/0112-net-hns3-fix-an-unreasonable-memset.patch +++ /dev/null @@ -1,30 +0,0 @@ -From d3b39f5bca72e2ecd16527d3c63e1b2e620830bc Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:44 +0800 -Subject: [PATCH 112/122] net/hns3: fix an unreasonable memset - -Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 510802be05..5a2cfe5a54 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -776,7 +776,7 @@ hns3vf_reset_all_tqps(struct hns3_hw *hw) - int ret; - uint16_t i; - -- memset(msg_data, 0, sizeof(uint16_t)); -+ memset(msg_data, 0, sizeof(msg_data)); - ret = hns3_send_mbx_msg(hw, HNS3_MBX_QUEUE_RESET, 0, msg_data, - sizeof(msg_data), true, &reset_status, - sizeof(reset_status)); --- -2.22.0 - diff --git a/0113-net-hns3-remove-duplicate-definition.patch b/0113-net-hns3-remove-duplicate-definition.patch deleted file mode 100644 index 68289f1..0000000 --- a/0113-net-hns3-remove-duplicate-definition.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 1650e90eef5c7be334b29d276479c8f4d997ba02 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:45 +0800 -Subject: [PATCH 113/122] net/hns3: remove duplicate definition - -The default hash key array is defined twice. Remove the extra one. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_flow.c | 9 --------- - drivers/net/hns3/hns3_rss.c | 6 ++---- - drivers/net/hns3/hns3_rss.h | 2 ++ - 3 files changed, 4 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 12afc24910..e994cac314 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -10,15 +10,6 @@ - #include "hns3_logs.h" - #include "hns3_flow.h" - --/* Default default keys */ --static uint8_t hns3_hash_key[] = { -- 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, -- 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0, -- 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4, -- 0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C, -- 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA --}; -- - static const uint8_t full_mask[VNI_OR_TNI_LEN] = { 0xFF, 0xFF, 0xFF }; - static const uint8_t zero_mask[VNI_OR_TNI_LEN] = { 0x00, 0x00, 0x00 }; - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 4c546c9363..1003daf03e 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -9,10 +9,8 @@ - #include "hns3_ethdev.h" - #include "hns3_logs.h" - --/* -- * The hash key used for rss initialization. -- */ --static const uint8_t hns3_hash_key[] = { -+/* Default hash keys */ -+const uint8_t hns3_hash_key[] = { - 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, - 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0, - 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4, -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 7789f02a08..5b90d3a628 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -88,6 +88,8 @@ static inline uint32_t roundup_pow_of_two(uint32_t x) - return 1UL << fls(x - 1); - } - -+extern const uint8_t hns3_hash_key[]; -+ - struct hns3_adapter; - - int hns3_dev_rss_hash_update(struct rte_eth_dev *dev, --- -2.22.0 - diff --git a/0114-net-hns3-fix-code-check-warning.patch b/0114-net-hns3-fix-code-check-warning.patch deleted file mode 100644 index 2ea529d..0000000 --- a/0114-net-hns3-fix-code-check-warning.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 1c88a050b04c9dc12458d4127052f542a0919739 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Wed, 1 Jun 2022 11:52:46 +0800 -Subject: [PATCH 114/122] net/hns3: fix code check warning - -In bitwise operation, "val" should be an unsigned type. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_ptp.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 1442241a4e..0b0061bba5 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -81,7 +81,7 @@ hns3_timesync_configure(struct hns3_adapter *hns, bool en) - struct hns3_hw *hw = &hns->hw; - struct hns3_pf *pf = &hns->pf; - struct hns3_cmd_desc desc; -- int val; -+ uint32_t val; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_CFG_PTP_MODE, false); --- -2.22.0 - diff --git a/0115-net-hns3-fix-return-value-for-unsupported-tuple.patch b/0115-net-hns3-fix-return-value-for-unsupported-tuple.patch deleted file mode 100644 index 3cef721..0000000 --- a/0115-net-hns3-fix-return-value-for-unsupported-tuple.patch +++ /dev/null @@ -1,32 +0,0 @@ -From a0077b01d8ba2b5310ca6fdee7c61e40ae6eeca3 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:47 +0800 -Subject: [PATCH 115/122] net/hns3: fix return value for unsupported tuple - -Driver should return false for unsupported tuple. - -Fixes: 18a4b4c3fa80 ("net/hns3: add default to switch when parsing fd tuple") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_fdir.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index 2a7978ac07..a0d6598e57 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -631,7 +631,7 @@ static bool hns3_fd_convert_tuple(struct hns3_hw *hw, - break; - default: - hns3_warn(hw, "not support tuple of (%u)", tuple); -- break; -+ return false; - } - return true; - } --- -2.22.0 - diff --git a/0116-net-hns3-modify-a-function-name.patch b/0116-net-hns3-modify-a-function-name.patch deleted file mode 100644 index 464012a..0000000 --- a/0116-net-hns3-modify-a-function-name.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 25cd4e3af8f0c5e86bff599ea31a0e4024cf03d2 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:48 +0800 -Subject: [PATCH 116/122] net/hns3: modify a function name - -The meaning of the "hns3_get_count" function is not precise enough. -Change from "hns3_get_count" to "hns3_fd_get_count". - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_fdir.c | 2 +- - drivers/net/hns3/hns3_fdir.h | 2 +- - drivers/net/hns3/hns3_flow.c | 6 +++--- - 3 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index a0d6598e57..762b89a51e 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -1099,7 +1099,7 @@ int hns3_restore_all_fdir_filter(struct hns3_adapter *hns) - return 0; - } - --int hns3_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value) -+int hns3_fd_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value) - { - struct hns3_fd_get_cnt_cmd *req; - struct hns3_cmd_desc desc; -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index 3376c40c8e..4d18759160 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -184,7 +184,7 @@ void hns3_fdir_filter_uninit(struct hns3_adapter *hns); - int hns3_fdir_filter_program(struct hns3_adapter *hns, - struct hns3_fdir_rule *rule, bool del); - int hns3_clear_all_fdir_filter(struct hns3_adapter *hns); --int hns3_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value); -+int hns3_fd_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value); - int hns3_restore_all_fdir_filter(struct hns3_adapter *hns); - - #endif /* _HNS3_FDIR_H_ */ -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index e994cac314..b60ad596dc 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -164,13 +164,13 @@ hns3_counter_new(struct rte_eth_dev *dev, uint32_t indirect, uint32_t id, - "Counter id is used, indirect flag not match"); - /* Clear the indirect counter on first use. */ - if (cnt->indirect && cnt->ref_cnt == 1) -- (void)hns3_get_count(hw, id, &value); -+ (void)hns3_fd_get_count(hw, id, &value); - cnt->ref_cnt++; - return 0; - } - - /* Clear the counter by read ops because the counter is read-clear */ -- ret = hns3_get_count(hw, id, &value); -+ ret = hns3_fd_get_count(hw, id, &value); - if (ret) - return rte_flow_error_set(error, EIO, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, -@@ -210,7 +210,7 @@ hns3_counter_query(struct rte_eth_dev *dev, struct rte_flow *flow, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Can't find counter id"); - -- ret = hns3_get_count(&hns->hw, flow->counter_id, &value); -+ ret = hns3_fd_get_count(&hns->hw, flow->counter_id, &value); - if (ret) { - rte_flow_error_set(error, -ret, RTE_FLOW_ERROR_TYPE_HANDLE, - NULL, "Read counter fail."); --- -2.22.0 - diff --git a/0117-net-hns3-unify-the-code-wrap-style.patch b/0117-net-hns3-unify-the-code-wrap-style.patch deleted file mode 100644 index 3a0dbd4..0000000 --- a/0117-net-hns3-unify-the-code-wrap-style.patch +++ /dev/null @@ -1,516 +0,0 @@ -From 9a1166d20bc7b1b07207ec2f8c1964f59053570b Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:49 +0800 -Subject: [PATCH 117/122] net/hns3: unify the code wrap style - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_cmd.c | 2 +- - drivers/net/hns3/hns3_common.c | 10 +++++----- - drivers/net/hns3/hns3_dcb.c | 5 ++--- - drivers/net/hns3/hns3_ethdev.c | 18 ++++++++---------- - drivers/net/hns3/hns3_ethdev_vf.c | 23 +++++++++++------------ - drivers/net/hns3/hns3_fdir.c | 26 +++++++++++++------------- - drivers/net/hns3/hns3_flow.c | 10 ++++------ - drivers/net/hns3/hns3_rxtx.c | 28 +++++++++++++--------------- - drivers/net/hns3/hns3_stats.c | 28 ++++++++++++++-------------- - 9 files changed, 71 insertions(+), 79 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index 96f8f38cbb..e3d096d9cb 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -108,7 +108,7 @@ hns3_alloc_cmd_queue(struct hns3_hw *hw, int ring_type) - ret = hns3_alloc_cmd_desc(hw, ring); - if (ret) - hns3_err(hw, "descriptor %s alloc error %d", -- (ring_type == HNS3_TYPE_CSQ) ? "CSQ" : "CRQ", ret); -+ (ring_type == HNS3_TYPE_CSQ) ? "CSQ" : "CRQ", ret); - - return ret; - } -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index edd16d8076..7a65db907e 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -604,7 +604,7 @@ hns3_init_mac_addrs(struct rte_eth_dev *dev) - 0); - if (dev->data->mac_addrs == NULL) { - hns3_err(hw, "failed to allocate %zx bytes needed to store MAC addresses", -- sizeof(struct rte_ether_addr) * mac_addrs_capa); -+ sizeof(struct rte_ether_addr) * mac_addrs_capa); - return -ENOMEM; - } - -@@ -680,16 +680,16 @@ hns3_init_ring_with_vector(struct hns3_hw *hw) - ret = hw->ops.bind_ring_with_vector(hw, vec, false, - HNS3_RING_TYPE_TX, i); - if (ret) { -- PMD_INIT_LOG(ERR, "fail to unbind TX ring(%d) with " -- "vector: %u, ret=%d", i, vec, ret); -+ PMD_INIT_LOG(ERR, "fail to unbind TX ring(%d) with vector: %u, ret=%d", -+ i, vec, ret); - return ret; - } - - ret = hw->ops.bind_ring_with_vector(hw, vec, false, - HNS3_RING_TYPE_RX, i); - if (ret) { -- PMD_INIT_LOG(ERR, "fail to unbind RX ring(%d) with " -- "vector: %u, ret=%d", i, vec, ret); -+ PMD_INIT_LOG(ERR, "fail to unbind RX ring(%d) with vector: %u, ret=%d", -+ i, vec, ret); - return ret; - } - } -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index d88757611c..b22f618e0a 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -876,9 +876,8 @@ hns3_dcb_pri_tc_base_dwrr_cfg(struct hns3_hw *hw) - - ret = hns3_dcb_pri_weight_cfg(hw, i, dwrr); - if (ret) { -- hns3_err(hw, -- "fail to send priority weight cmd: %d, ret = %d", -- i, ret); -+ hns3_err(hw, "fail to send priority weight cmd: %d, ret = %d", -+ i, ret); - return ret; - } - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 97cf27d2a1..8a8f3f1950 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -1627,7 +1627,7 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev, - ret = hw->ops.del_uc_mac_addr(hw, oaddr); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- oaddr); -+ oaddr); - hns3_warn(hw, "Remove old uc mac address(%s) fail: %d", - mac_str, ret); - -@@ -1659,7 +1659,7 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev, - ret_val = hw->ops.del_uc_mac_addr(hw, mac_addr); - if (ret_val) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- mac_addr); -+ mac_addr); - hns3_warn(hw, - "Failed to roll back to del setted mac addr(%s): %d", - mac_str, ret_val); -@@ -1670,7 +1670,7 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev, - if (ret_val) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, oaddr); - hns3_warn(hw, "Failed to restore old uc mac addr(%s): %d", -- mac_str, ret_val); -+ mac_str, ret_val); - } - rte_spinlock_unlock(&hw->lock); - -@@ -1747,7 +1747,7 @@ hns3_add_mc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - if (ret == -ENOSPC) - hns3_err(hw, "mc mac vlan table is full"); - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- mac_addr); -+ mac_addr); - hns3_err(hw, "failed to add mc mac addr(%s): %d", mac_str, ret); - } - -@@ -2676,9 +2676,8 @@ hns3_check_dev_specifications(struct hns3_hw *hw) - { - if (hw->rss_ind_tbl_size == 0 || - hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_err(hw, "the size of hash lookup table configured (%u)" -- " exceeds the maximum(%u)", hw->rss_ind_tbl_size, -- HNS3_RSS_IND_TBL_SIZE_MAX); -+ hns3_err(hw, "the size of hash lookup table configured (%u) exceeds the maximum(%u)", -+ hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); - return -EINVAL; - } - -@@ -3916,7 +3915,7 @@ hns3_dev_promiscuous_enable(struct rte_eth_dev *dev) - ret = hns3_enable_vlan_filter(hns, false); - if (ret) { - hns3_err(hw, "failed to enable promiscuous mode due to " -- "failure to disable vlan filter, ret = %d", -+ "failure to disable vlan filter, ret = %d", - ret); - err = hns3_set_promisc_mode(hw, false, allmulti); - if (err) -@@ -5993,8 +5992,7 @@ hns3_reset_service(void *param) - timersub(&tv, &tv_start, &tv_delta); - msec = hns3_clock_calctime_ms(&tv_delta); - if (msec > HNS3_RESET_PROCESS_MS) -- hns3_err(hw, "%d handle long time delta %" PRIu64 -- " ms time=%ld.%.6ld", -+ hns3_err(hw, "%d handle long time delta %" PRIu64 " ms time=%ld.%.6ld", - hw->reset.level, msec, - tv.tv_sec, tv.tv_usec); - if (ret == -EAGAIN) -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 0c170797f4..7323e47f15 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -142,7 +142,7 @@ hns3vf_enable_msix(const struct rte_pci_device *device, bool op) - pos = hns3vf_find_pci_capability(device, PCI_CAP_ID_MSIX); - if (pos) { - ret = rte_pci_read_config(device, &control, sizeof(control), -- (pos + PCI_MSIX_FLAGS)); -+ (pos + PCI_MSIX_FLAGS)); - if (ret < 0) { - PMD_INIT_LOG(ERR, "Failed to read PCI offset 0x%x", - (pos + PCI_MSIX_FLAGS)); -@@ -154,10 +154,10 @@ hns3vf_enable_msix(const struct rte_pci_device *device, bool op) - else - control &= ~PCI_MSIX_FLAGS_ENABLE; - ret = rte_pci_write_config(device, &control, sizeof(control), -- (pos + PCI_MSIX_FLAGS)); -+ (pos + PCI_MSIX_FLAGS)); - if (ret < 0) { - PMD_INIT_LOG(ERR, "failed to write PCI offset 0x%x", -- (pos + PCI_MSIX_FLAGS)); -+ (pos + PCI_MSIX_FLAGS)); - return -ENXIO; - } - -@@ -199,7 +199,7 @@ hns3vf_remove_uc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - false, NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- mac_addr); -+ mac_addr); - hns3_err(hw, "failed to add uc mac addr(%s), ret = %d", - mac_str, ret); - } -@@ -242,11 +242,11 @@ hns3vf_set_default_mac_addr(struct rte_eth_dev *dev, - if (ret == -EPERM) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - old_addr); -- hns3_warn(hw, "Has permanet mac addr(%s) for vf", -+ hns3_warn(hw, "Has permanent mac addr(%s) for vf", - mac_str); - } else { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- mac_addr); -+ mac_addr); - hns3_err(hw, "Failed to set mac addr(%s) for vf: %d", - mac_str, ret); - } -@@ -293,7 +293,7 @@ hns3vf_remove_mc_mac_addr(struct hns3_hw *hw, - NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, -- mac_addr); -+ mac_addr); - hns3_err(hw, "Failed to remove mc mac addr(%s) for vf: %d", - mac_str, ret); - } -@@ -715,9 +715,8 @@ hns3vf_check_dev_specifications(struct hns3_hw *hw) - { - if (hw->rss_ind_tbl_size == 0 || - hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_warn(hw, "the size of hash lookup table configured (%u)" -- " exceeds the maximum(%u)", hw->rss_ind_tbl_size, -- HNS3_RSS_IND_TBL_SIZE_MAX); -+ hns3_warn(hw, "the size of hash lookup table configured (%u) exceeds the maximum(%u)", -+ hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); - return -EINVAL; - } - -@@ -1168,8 +1167,8 @@ hns3vf_vlan_offload_set(struct rte_eth_dev *dev, int mask) - int ret = 0; - - if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED)) { -- hns3_err(hw, "vf set vlan offload failed during resetting, " -- "mask = 0x%x", mask); -+ hns3_err(hw, "vf set vlan offload failed during resetting, mask = 0x%x", -+ mask); - return -EIO; - } - -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index 762b89a51e..30e5e66772 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -321,7 +321,7 @@ int hns3_init_fd_config(struct hns3_adapter *hns) - break; - default: - hns3_err(hw, "Unsupported flow director mode %u", -- pf->fdir.fd_cfg.fd_mode); -+ pf->fdir.fd_cfg.fd_mode); - return -EOPNOTSUPP; - } - -@@ -337,7 +337,7 @@ int hns3_init_fd_config(struct hns3_adapter *hns) - BIT(INNER_SRC_IP) | BIT(INNER_DST_IP) | - BIT(INNER_SRC_PORT) | BIT(INNER_DST_PORT); - hns3_dbg(hw, "fdir tuple: inner"); -+ "ip_proto ip_tos l4_src_port l4_dst_port>"); - - /* If use max 400bit key, we can support tuples for ether type */ - if (pf->fdir.fd_cfg.max_key_length == MAX_KEY_LENGTH) { -@@ -348,8 +348,8 @@ int hns3_init_fd_config(struct hns3_adapter *hns) - BIT(OUTER_TUN_VNI) | BIT(OUTER_TUN_FLOW_ID) | - BIT(OUTER_ETH_TYPE) | BIT(OUTER_IP_PROTO); - hns3_dbg(hw, "fdir tuple more: inner outer"); -+ "vlan_tag2 sctp_tag> outer"); - } - - /* roce_type is used to filter roce frames -@@ -367,12 +367,11 @@ int hns3_init_fd_config(struct hns3_adapter *hns) - if (ret) - return ret; - -- hns3_dbg(hw, "fdir: stage1 stage2", -- pf->fdir.fd_cfg.rule_num[HNS3_FD_STAGE_1], -- pf->fdir.fd_cfg.cnt_num[HNS3_FD_STAGE_1], -- pf->fdir.fd_cfg.rule_num[HNS3_FD_STAGE_2], -- pf->fdir.fd_cfg.cnt_num[HNS3_FD_STAGE_2]); -+ hns3_dbg(hw, "fdir: stage1 stage2", -+ pf->fdir.fd_cfg.rule_num[HNS3_FD_STAGE_1], -+ pf->fdir.fd_cfg.cnt_num[HNS3_FD_STAGE_1], -+ pf->fdir.fd_cfg.rule_num[HNS3_FD_STAGE_2], -+ pf->fdir.fd_cfg.cnt_num[HNS3_FD_STAGE_2]); - - return hns3_set_fd_key_config(hns); - } -@@ -420,7 +419,7 @@ static int hns3_fd_tcam_config(struct hns3_hw *hw, bool sel_x, int loc, - ret = hns3_cmd_send(hw, desc, FD_TCAM_CMD_NUM); - if (ret) - hns3_err(hw, "Config tcam key fail, ret=%d loc=%d add=%d", -- ret, loc, is_add); -+ ret, loc, is_add); - return ret; - } - -@@ -673,6 +672,7 @@ static void hns3_fd_convert_meta_data(struct hns3_fd_key_cfg *cfg, - } else if (i == VLAN_NUMBER) { - uint32_t vlan_tag; - uint8_t vlan_num; -+ - if (rule->key_conf.spec.tunnel_type == 0) - vlan_num = rule->key_conf.vlan_num; - else -@@ -758,14 +758,14 @@ static int hns3_config_key(struct hns3_adapter *hns, - ret = hns3_fd_tcam_config(hw, false, rule->location, key_y, true); - if (ret) { - hns3_err(hw, "Config fd key_y fail, loc=%u, ret=%d", -- rule->queue_id, ret); -+ rule->queue_id, ret); - return ret; - } - - ret = hns3_fd_tcam_config(hw, true, rule->location, key_x, true); - if (ret) - hns3_err(hw, "Config fd key_x fail, loc=%u, ret=%d", -- rule->queue_id, ret); -+ rule->queue_id, ret); - return ret; - } - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index b60ad596dc..5e0a9bc93f 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -285,9 +285,8 @@ hns3_handle_action_queue(struct rte_eth_dev *dev, - - queue = (const struct rte_flow_action_queue *)action->conf; - if (queue->index >= hw->data->nb_rx_queues) { -- hns3_err(hw, "queue ID(%u) is greater than number of " -- "available queue (%u) in driver.", -- queue->index, hw->data->nb_rx_queues); -+ hns3_err(hw, "queue ID(%u) is greater than number of available queue (%u) in driver.", -+ queue->index, hw->data->nb_rx_queues); - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, - action, "Invalid queue ID in PF"); -@@ -1656,9 +1655,8 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - } - - if (rss_rule_fail_cnt) { -- hns3_err(hw, "fail to delete all RSS filters, success num = %d " -- "fail num = %d", rss_rule_succ_cnt, -- rss_rule_fail_cnt); -+ hns3_err(hw, "fail to delete all RSS filters, success num = %d fail num = %d", -+ rss_rule_succ_cnt, rss_rule_fail_cnt); - ret = -EIO; - } - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 5a2cfe5a54..3f576fbf4b 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -606,8 +606,8 @@ hns3_send_reset_tqp_cmd(struct hns3_hw *hw, uint16_t queue_id, bool enable) - hns3_set_bit(req->reset_req, HNS3_TQP_RESET_B, enable ? 1 : 0); - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) -- hns3_err(hw, "send tqp reset cmd error, queue_id = %u, " -- "ret = %d", queue_id, ret); -+ hns3_err(hw, "send tqp reset cmd error, queue_id = %u, ret = %d", -+ queue_id, ret); - - return ret; - } -@@ -627,8 +627,8 @@ hns3_get_tqp_reset_status(struct hns3_hw *hw, uint16_t queue_id, - - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { -- hns3_err(hw, "get tqp reset status error, queue_id = %u, " -- "ret = %d.", queue_id, ret); -+ hns3_err(hw, "get tqp reset status error, queue_id = %u, ret = %d.", -+ queue_id, ret); - return ret; - } - *reset_status = hns3_get_bit(req->ready_to_reset, HNS3_TQP_RESET_B); -@@ -669,7 +669,7 @@ hns3pf_reset_tqp(struct hns3_hw *hw, uint16_t queue_id) - if (!reset_status) { - ret = -ETIMEDOUT; - hns3_err(hw, "reset tqp timeout, queue_id = %u, ret = %d", -- queue_id, ret); -+ queue_id, ret); - goto tqp_reset_fail; - } - -@@ -752,15 +752,14 @@ hns3pf_reset_all_tqps(struct hns3_hw *hw) - for (i = 0; i < hw->cfg_max_queues; i++) { - ret = hns3pf_reset_tqp(hw, i); - if (ret) { -- hns3_err(hw, -- "fail to reset tqp, queue_id = %d, ret = %d.", -- i, ret); -+ hns3_err(hw, "fail to reset tqp, queue_id = %d, ret = %d.", -+ i, ret); - return ret; - } - } - } else if (reset_status != HNS3_RESET_ALL_TQP_SUCCESS) { - hns3_err(hw, "fail to reset all tqps, reset_status = %u.", -- reset_status); -+ reset_status); - return -EIO; - } - -@@ -813,9 +812,8 @@ hns3_reset_all_tqps(struct hns3_adapter *hns) - for (i = 0; i < hw->cfg_max_queues; i++) { - ret = hns3_tqp_enable(hw, i, false); - if (ret) { -- hns3_err(hw, -- "fail to disable tqps before tqps reset, ret = %d.", -- ret); -+ hns3_err(hw, "fail to disable tqps before tqps reset, ret = %d.", -+ ret); - return ret; - } - } -@@ -922,9 +920,9 @@ hns3_reset_queue(struct hns3_hw *hw, uint16_t queue_id, - } - - if (!reset_status) { -- hns3_err(hw, "reset queue timeout, queue_id = %u, " -- "queue_type = %s", queue_id, -- queue_type == HNS3_RING_TYPE_TX ? "Tx" : "Rx"); -+ hns3_err(hw, "reset queue timeout, queue_id = %u, queue_type = %s", -+ queue_id, -+ queue_type == HNS3_RING_TYPE_TX ? "Tx" : "Rx"); - ret = -ETIMEDOUT; - goto queue_reset_fail; - } -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index e69761c8b3..bf8af4531f 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -507,8 +507,8 @@ hns3_update_port_rx_ssu_drop_stats(struct hns3_hw *hw) - - req = (struct hns3_query_ssu_cmd *)desc[0].data; - cnt = rte_le_to_cpu_32(req->oq_drop_cnt) + -- rte_le_to_cpu_32(req->full_drop_cnt) + -- rte_le_to_cpu_32(req->part_drop_cnt); -+ rte_le_to_cpu_32(req->full_drop_cnt) + -+ rte_le_to_cpu_32(req->part_drop_cnt); - - stats->ssu_rx_drop_cnt += cnt; - -@@ -532,8 +532,8 @@ hns3_update_port_tx_ssu_drop_stats(struct hns3_hw *hw) - - req = (struct hns3_query_ssu_cmd *)desc[0].data; - cnt = rte_le_to_cpu_32(req->oq_drop_cnt) + -- rte_le_to_cpu_32(req->full_drop_cnt) + -- rte_le_to_cpu_32(req->part_drop_cnt); -+ rte_le_to_cpu_32(req->full_drop_cnt) + -+ rte_le_to_cpu_32(req->part_drop_cnt); - - hw->oerror_stats += cnt; - -@@ -1337,8 +1337,8 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, - len = cnt_stats * sizeof(struct rte_eth_xstat); - values_copy = rte_zmalloc("hns3_xstats_values", len, 0); - if (values_copy == NULL) { -- hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed " -- "to store statistics values", len); -+ hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed to store statistics values", -+ len); - return -ENOMEM; - } - -@@ -1359,8 +1359,8 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, - - for (i = 0; i < size; i++) { - if (ids[i] >= cnt_stats) { -- hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, " -- "should < %u", i, ids[i], cnt_stats); -+ hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, should < %u", -+ i, ids[i], cnt_stats); - rte_free(values_copy); - return -EINVAL; - } -@@ -1419,8 +1419,8 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, - len = cnt_stats * sizeof(struct rte_eth_xstat_name); - names_copy = rte_zmalloc("hns3_xstats_names", len, 0); - if (names_copy == NULL) { -- hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed " -- "to store statistics names", len); -+ hns3_err(hw, "Failed to allocate 0x%" PRIx64 " bytes needed to store statistics names", -+ len); - return -ENOMEM; - } - -@@ -1428,8 +1428,8 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, - - for (i = 0; i < size; i++) { - if (ids[i] >= cnt_stats) { -- hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, " -- "should < %u", i, ids[i], cnt_stats); -+ hns3_err(hw, "ids[%u] (%" PRIu64 ") is invalid, should < %u", -+ i, ids[i], cnt_stats); - rte_free(names_copy); - return -EINVAL; - } -@@ -1501,14 +1501,14 @@ hns3_tqp_stats_init(struct hns3_hw *hw) - struct hns3_tqp_stats *tqp_stats = &hw->tqp_stats; - - tqp_stats->rcb_rx_ring_pktnum = rte_zmalloc("hns3_rx_ring_pkt_num", -- sizeof(uint64_t) * hw->tqps_num, 0); -+ sizeof(uint64_t) * hw->tqps_num, 0); - if (tqp_stats->rcb_rx_ring_pktnum == NULL) { - hns3_err(hw, "failed to allocate rx_ring pkt_num."); - return -ENOMEM; - } - - tqp_stats->rcb_tx_ring_pktnum = rte_zmalloc("hns3_tx_ring_pkt_num", -- sizeof(uint64_t) * hw->tqps_num, 0); -+ sizeof(uint64_t) * hw->tqps_num, 0); - if (tqp_stats->rcb_tx_ring_pktnum == NULL) { - hns3_err(hw, "failed to allocate tx_ring pkt_num."); - rte_free(tqp_stats->rcb_rx_ring_pktnum); --- -2.22.0 - diff --git a/0118-net-hns3-fix-a-segfault-from-secondary-process.patch b/0118-net-hns3-fix-a-segfault-from-secondary-process.patch deleted file mode 100644 index 89bcf9d..0000000 --- a/0118-net-hns3-fix-a-segfault-from-secondary-process.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0526fc076a0e45de04597722128d4a2b87a44255 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 1 Jun 2022 11:52:50 +0800 -Subject: [PATCH 118/122] net/hns3: fix a segfault from secondary process - -If a hns3 device in the secondary process is attached to do probing -operation, 'rx_queues' and 'tx_queues' in dev->data are null in -eth_dev_fp_ops_setup when calling rte_eth_dev_probing_finish. The primary -process calls dev_start to re-setup their fp_ops. But the secondary process -can't call dev_start and has no chance to do it. If the application sends -and receives packets at this time, a segfault will occur. So this patch -uses the MP communication of the PMD to update the fp_ops of the device in -the secondary process. - -Fixes: 96c33cfb06cf ("net/hns3: fix Rx/Tx functions update") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_rxtx.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 3f576fbf4b..0dc1d8cb60 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4420,6 +4420,8 @@ hns3_eth_dev_fp_ops_config(const struct rte_eth_dev *dev) - fpo[port_id].tx_pkt_prepare = dev->tx_pkt_prepare; - fpo[port_id].rx_descriptor_status = dev->rx_descriptor_status; - fpo[port_id].tx_descriptor_status = dev->tx_descriptor_status; -+ fpo[port_id].rxq.data = dev->data->rx_queues; -+ fpo[port_id].txq.data = dev->data->tx_queues; - } - - void --- -2.22.0 - diff --git a/0119-net-hns3-fix-TM-capability-incorrectly-defined.patch b/0119-net-hns3-fix-TM-capability-incorrectly-defined.patch deleted file mode 100644 index 6796c87..0000000 --- a/0119-net-hns3-fix-TM-capability-incorrectly-defined.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 40df3e3ffa8c645ce7e5c0ff6e698c5bd7cf1ff8 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Wed, 1 Jun 2022 11:52:51 +0800 -Subject: [PATCH 119/122] net/hns3: fix TM capability incorrectly defined - -The TM capability should be bit-19 according to the user manual of -firmware. - -Fixes: fc18d1b4b85f ("net/hns3: fix traffic management") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_cmd.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index f9addc6069..82c999061d 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -323,7 +323,7 @@ enum HNS3_CAPS_BITS { - HNS3_CAPS_UDP_TUNNEL_CSUM_B, - HNS3_CAPS_RAS_IMP_B, - HNS3_CAPS_RXD_ADV_LAYOUT_B = 15, -- HNS3_CAPS_TM_B = 17, -+ HNS3_CAPS_TM_B = 19, - }; - - /* Capabilities of VF dependent on the PF */ --- -2.22.0 - diff --git a/0120-app-testpmd-add-help-messages-for-multi-process.patch b/0120-app-testpmd-add-help-messages-for-multi-process.patch deleted file mode 100644 index 6c87ec4..0000000 --- a/0120-app-testpmd-add-help-messages-for-multi-process.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 519b373d853909d953ff0c0fc6b15199be516fdd Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 9 Jun 2022 16:52:34 +0800 -Subject: [PATCH 120/122] app/testpmd: add help messages for multi-process - -This patch adds help messages for multi-process. ---num-procs=N: set the total number of multi-process instances. ---proc-id=id: set the id of the current process from multi-process -instances(0 <= id < num-procs). - -Fixes: a550baf24af9 ("app/testpmd: support multi-process") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Ferruh Yigit ---- - app/test-pmd/parameters.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c -index f9185065af..24e03e769c 100644 ---- a/app/test-pmd/parameters.c -+++ b/app/test-pmd/parameters.c -@@ -61,6 +61,9 @@ usage(char* progname) - "extended statistics to show. Used with --stats-period " - "specified or interactive commands that show Rx/Tx statistics " - "(i.e. 'show port stats').\n"); -+ printf(" --num-procs=N: set the total number of multi-process instances.\n"); -+ printf(" --proc-id=id: set the id of the current process from " -+ "multi-process instances (0 <= id < num-procs).\n"); - printf(" --nb-cores=N: set the number of forwarding cores " - "(1 <= N <= %d).\n", nb_lcores); - printf(" --nb-ports=N: set the number of forwarding ports " --- -2.22.0 - diff --git a/0121-app-testpmd-fix-use-of-indirect-action-after-port-cl.patch b/0121-app-testpmd-fix-use-of-indirect-action-after-port-cl.patch deleted file mode 100644 index d080e93..0000000 --- a/0121-app-testpmd-fix-use-of-indirect-action-after-port-cl.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 83d21ff84152f5912ce3e53ecb577216243fb4e4 Mon Sep 17 00:00:00 2001 -From: Dmitry Kozlyuk -Date: Mon, 7 Mar 2022 18:48:21 +0200 -Subject: [PATCH 121/122] app/testpmd: fix use of indirect action after port - close - -When a port was closed, indirect actions could remain -with their handles no longer valid. -If a newly attached device was assigned the same ID as the closed port, -those indirect actions became accessible again. -Any attempt to use them resulted in an undefined behavior. -Automatically flush indirect actions when a port is closed. - -Fixes: 4b61b8774be9 ("ethdev: introduce indirect flow action") -Cc: stable@dpdk.org - -Signed-off-by: Dmitry Kozlyuk -Acked-by: Matan Azrad -Acked-by: Aman Singh ---- - app/test-pmd/config.c | 31 +++++++++++++++++++++++++++++++ - app/test-pmd/testpmd.c | 1 + - app/test-pmd/testpmd.h | 1 + - 3 files changed, 33 insertions(+) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 496e787edd..a7fffc3d1d 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -1743,6 +1743,37 @@ port_action_handle_destroy(portid_t port_id, - return ret; - } - -+int -+port_action_handle_flush(portid_t port_id) -+{ -+ struct rte_port *port; -+ struct port_indirect_action **tmp; -+ int ret = 0; -+ -+ if (port_id_is_invalid(port_id, ENABLED_WARN) || -+ port_id == (portid_t)RTE_PORT_ALL) -+ return -EINVAL; -+ port = &ports[port_id]; -+ tmp = &port->actions_list; -+ while (*tmp != NULL) { -+ struct rte_flow_error error; -+ struct port_indirect_action *pia = *tmp; -+ -+ /* Poisoning to make sure PMDs update it in case of error. */ -+ memset(&error, 0x44, sizeof(error)); -+ if (pia->handle != NULL && -+ rte_flow_action_handle_destroy -+ (port_id, pia->handle, &error) != 0) { -+ printf("Indirect action #%u not destroyed\n", pia->id); -+ ret = port_flow_complain(&error); -+ tmp = &pia->next; -+ } else { -+ *tmp = pia->next; -+ free(pia); -+ } -+ } -+ return ret; -+} - - /** Get indirect action by port + id */ - struct rte_flow_action_handle * -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index c4be9abe73..ac090bde06 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -3212,6 +3212,7 @@ close_port(portid_t pid) - if (is_proc_primary()) { - port_flow_flush(pi); - port_flex_item_flush(pi); -+ port_action_handle_flush(pi); - rte_eth_dev_close(pi); - } - -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 9c24cb07e0..042802b205 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -881,6 +881,7 @@ int port_action_handle_create(portid_t port_id, uint32_t id, - const struct rte_flow_action *action); - int port_action_handle_destroy(portid_t port_id, - uint32_t n, const uint32_t *action); -+int port_action_handle_flush(portid_t port_id); - struct rte_flow_action_handle *port_action_handle_get_by_id(portid_t port_id, - uint32_t id); - int port_action_handle_update(portid_t port_id, uint32_t id, --- -2.22.0 - diff --git a/0122-app-testpmd-fix-bonding-slave-devices-not-released.patch b/0122-app-testpmd-fix-bonding-slave-devices-not-released.patch deleted file mode 100644 index 4d1c23e..0000000 --- a/0122-app-testpmd-fix-bonding-slave-devices-not-released.patch +++ /dev/null @@ -1,122 +0,0 @@ -From f53f8218cfe85b78779cee5d499e7b32f26c4769 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 9 Jun 2022 19:49:21 +0800 -Subject: [PATCH 122/122] app/testpmd: fix bonding slave devices not released - -Currently, some eth devices are added to bond device, these devices are -not released when the quit command is executed in testpmd. This patch -adds the release operation for all active slaves under a bond device. - -Fixes: 0e545d3047fe ("app/testpmd: check stopping port is not in bonding") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 1 + - app/test-pmd/testpmd.c | 41 +++++++++++++++++++++++++++++++++++++++++ - app/test-pmd/testpmd.h | 2 ++ - 3 files changed, 44 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 1991ee3446..1f9fd61394 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -8764,6 +8764,7 @@ static void cmd_quit_parsed(__rte_unused void *parsed_result, - __rte_unused void *data) - { - cmdline_quit(cl); -+ cl_quit = 1; - } - - cmdline_parse_token_string_t cmd_quit_quit = -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index ac090bde06..66d5167f57 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -223,6 +223,7 @@ unsigned int xstats_display_num; /**< Size of extended statistics to show */ - * option. Set flag to exit stats period loop after received SIGINT/SIGTERM. - */ - uint8_t f_quit; -+uint8_t cl_quit; /* Quit testpmd from cmdline. */ - - /* - * Max Rx frame size, set by '--max-pkt-len' parameter. -@@ -3174,11 +3175,39 @@ remove_invalid_ports(void) - nb_cfg_ports = nb_fwd_ports; - } - -+static void -+clear_bonding_slave_device(portid_t *slave_pids, uint16_t num_slaves) -+{ -+ struct rte_port *port; -+ portid_t slave_pid; -+ uint16_t i; -+ -+ for (i = 0; i < num_slaves; i++) { -+ slave_pid = slave_pids[i]; -+ if (port_is_started(slave_pid) == 1) { -+ if (rte_eth_dev_stop(slave_pid) != 0) -+ fprintf(stderr, "rte_eth_dev_stop failed for port %u\n", -+ slave_pid); -+ -+ port = &ports[slave_pid]; -+ port->port_status = RTE_PORT_STOPPED; -+ } -+ -+ clear_port_slave_flag(slave_pid); -+ -+ /* Close slave device when testpmd quit or is killed. */ -+ if (cl_quit == 1 || f_quit == 1) -+ rte_eth_dev_close(slave_pid); -+ } -+} -+ - void - close_port(portid_t pid) - { - portid_t pi; - struct rte_port *port; -+ portid_t slave_pids[RTE_MAX_ETHPORTS]; -+ int num_slaves = 0; - - if (port_id_is_invalid(pid, ENABLED_WARN)) - return; -@@ -3213,7 +3242,19 @@ close_port(portid_t pid) - port_flow_flush(pi); - port_flex_item_flush(pi); - port_action_handle_flush(pi); -+#ifdef RTE_NET_BOND -+ if (port->bond_flag == 1) -+ num_slaves = rte_eth_bond_slaves_get(pi, -+ slave_pids, RTE_MAX_ETHPORTS); -+#endif - rte_eth_dev_close(pi); -+ /* -+ * If this port is bonded device, all slaves under the -+ * device need to be removed or closed. -+ */ -+ if (port->bond_flag == 1 && num_slaves > 0) -+ clear_bonding_slave_device(slave_pids, -+ num_slaves); - } - - free_xstats_display_info(pi); -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 042802b205..569b4300cf 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -32,6 +32,8 @@ - #define RTE_PORT_CLOSED (uint16_t)2 - #define RTE_PORT_HANDLING (uint16_t)3 - -+extern uint8_t cl_quit; -+ - /* - * It is used to allocate the memory for hash key. - * The hash key size is NIC dependent. --- -2.22.0 - diff --git a/0125-net-hns3-fix-link-status-capability-query-from-VF.patch b/0125-net-hns3-fix-link-status-capability-query-from-VF.patch deleted file mode 100644 index 8ce11a5..0000000 --- a/0125-net-hns3-fix-link-status-capability-query-from-VF.patch +++ /dev/null @@ -1,52 +0,0 @@ -From fe5e02e38e96e0b6ac33fd56a0f0b8cbad30b66f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:01 +0800 -Subject: [PATCH 125/189] net/hns3: fix link status capability query from VF - -Currently, the VF LSC capability is obtained from PF driver in -the interrupt mailbox interrupt thread, it is asynchronous. -The VF driver waits for 500ms to get this capability in probe -process. - -The primary process will receive a message and do probe in the -interrupt thread context when attach a device in the secondary -process. At this case, VF driver never obtains this capability -from PF. - -The root cause is that 'vf->pf_push_lsc_cap' is not updated by -the handling mailbox thread until finishing probe. The reason -this update wouldn't be done is that the handling mailbox interrupt -thread and the probe alarm thread are both in epool thread, and -the probe alarm thread is before the mailbox interrupt thread. - -Fixes: 9bc2289fe5ea ("net/hns3: refactor VF LSC event report") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev_vf.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 7323e47f15..b85f68cb1d 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -778,6 +778,14 @@ hns3vf_get_push_lsc_cap(struct hns3_hw *hw) - - while (remain_ms > 0) { - rte_delay_ms(HNS3_POLL_RESPONE_MS); -+ /* -+ * The probe process may perform in interrupt thread context. -+ * For example, users attach a device in the secondary process. -+ * At the moment, the handling mailbox task will be blocked. So -+ * driver has to actively handle the HNS3_MBX_LINK_STAT_CHANGE -+ * mailbox from PF driver to get this capability. -+ */ -+ hns3_dev_handle_mbx_msg(hw); - if (__atomic_load_n(&vf->pf_push_lsc_cap, __ATOMIC_ACQUIRE) != - HNS3_PF_PUSH_LSC_CAP_UNKNOWN) - break; --- -2.23.0 - diff --git a/0126-net-hns3-support-backplane-media-type.patch b/0126-net-hns3-support-backplane-media-type.patch deleted file mode 100644 index 1b9564c..0000000 --- a/0126-net-hns3-support-backplane-media-type.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 0e4f6eceec1c0cd0cae67504b90eb6a4f0451307 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:02 +0800 -Subject: [PATCH 126/189] net/hns3: support backplane media type - -The 802.11 physical PMA sub-layer defines three media: copper, fiber and -backplane. For PMD, the backplane is similar to the fiber, the main -differences are that backplane doesn't have optical module. - -Because the interface of firmware fiber is also applicable to the -backplane, this patch supports the backplane only through simple -extension. - -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 54 +++++++++++++++++++--------------- - 1 file changed, 30 insertions(+), 24 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 8a8f3f1950..5632b82078 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2788,11 +2788,8 @@ hns3_check_media_type(struct hns3_hw *hw, uint8_t media_type) - } - break; - case HNS3_MEDIA_TYPE_FIBER: -- ret = 0; -- break; - case HNS3_MEDIA_TYPE_BACKPLANE: -- PMD_INIT_LOG(ERR, "Media type is Backplane, not supported."); -- ret = -EOPNOTSUPP; -+ ret = 0; - break; - default: - PMD_INIT_LOG(ERR, "Unknown media type = %u!", media_type); -@@ -4245,14 +4242,11 @@ hns3_update_link_info(struct rte_eth_dev *eth_dev) - { - struct hns3_adapter *hns = eth_dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- int ret = 0; - - if (hw->mac.media_type == HNS3_MEDIA_TYPE_COPPER) -- ret = hns3_update_copper_link_info(hw); -- else if (hw->mac.media_type == HNS3_MEDIA_TYPE_FIBER) -- ret = hns3_update_fiber_link_info(hw); -+ return hns3_update_copper_link_info(hw); - -- return ret; -+ return hns3_update_fiber_link_info(hw); - } - - static int -@@ -4545,11 +4539,13 @@ hns3_get_port_supported_speed(struct rte_eth_dev *eth_dev) - if (ret) - return ret; - -- if (mac->media_type == HNS3_MEDIA_TYPE_FIBER) { -+ if (mac->media_type == HNS3_MEDIA_TYPE_FIBER || -+ mac->media_type == HNS3_MEDIA_TYPE_BACKPLANE) { - /* - * Some firmware does not support the report of supported_speed, -- * and only report the effective speed of SFP. In this case, it -- * is necessary to use the SFP's speed as the supported_speed. -+ * and only report the effective speed of SFP/backplane. In this -+ * case, it is necessary to use the SFP/backplane's speed as the -+ * supported_speed. - */ - if (mac->supported_speed == 0) - mac->supported_speed = -@@ -4811,7 +4807,7 @@ hns3_check_port_speed(struct hns3_hw *hw, uint32_t link_speeds) - - if (mac->media_type == HNS3_MEDIA_TYPE_COPPER) - speed_bit = hns3_convert_link_speeds2bitmap_copper(link_speeds); -- else if (mac->media_type == HNS3_MEDIA_TYPE_FIBER) -+ else - speed_bit = hns3_convert_link_speeds2bitmap_fiber(link_speeds); - - if (!(speed_bit & supported_speed)) { -@@ -4955,6 +4951,19 @@ hns3_set_fiber_port_link_speed(struct hns3_hw *hw, - return hns3_cfg_mac_speed_dup(hw, cfg->speed, cfg->duplex); - } - -+static const char * -+hns3_get_media_type_name(uint8_t media_type) -+{ -+ if (media_type == HNS3_MEDIA_TYPE_FIBER) -+ return "fiber"; -+ else if (media_type == HNS3_MEDIA_TYPE_COPPER) -+ return "copper"; -+ else if (media_type == HNS3_MEDIA_TYPE_BACKPLANE) -+ return "backplane"; -+ else -+ return "unknown"; -+} -+ - static int - hns3_set_port_link_speed(struct hns3_hw *hw, - struct hns3_set_link_speed_cfg *cfg) -@@ -4969,18 +4978,15 @@ hns3_set_port_link_speed(struct hns3_hw *hw, - #endif - - ret = hns3_set_copper_port_link_speed(hw, cfg); -- if (ret) { -- hns3_err(hw, "failed to set copper port link speed," -- "ret = %d.", ret); -- return ret; -- } -- } else if (hw->mac.media_type == HNS3_MEDIA_TYPE_FIBER) { -+ } else { - ret = hns3_set_fiber_port_link_speed(hw, cfg); -- if (ret) { -- hns3_err(hw, "failed to set fiber port link speed," -- "ret = %d.", ret); -- return ret; -- } -+ } -+ -+ if (ret) { -+ hns3_err(hw, "failed to set %s port link speed, ret = %d.", -+ hns3_get_media_type_name(hw->mac.media_type), -+ ret); -+ return ret; - } - - return 0; --- -2.23.0 - diff --git a/0127-net-hns3-cancel-heartbeat-alarm-when-VF-reset.patch b/0127-net-hns3-cancel-heartbeat-alarm-when-VF-reset.patch deleted file mode 100644 index 80022d0..0000000 --- a/0127-net-hns3-cancel-heartbeat-alarm-when-VF-reset.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 9a640a6c9cfbf7b5dea307209dc6f20cbfc871c0 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:03 +0800 -Subject: [PATCH 127/189] net/hns3: cancel heartbeat alarm when VF reset - -The purpose of the heartbeat alarm is to keep alive for VF. The mailbox -channel is disabled when VF is reset, and the heartbeat mailbox message -will fail to send. If the reset is not complete, the error information -about the heartbeat sending failure will be printed continuously. -In fact, VF does set alive when VF restore its configuration. So the -heartbeat alarm can be canceled to prepare to start reset and start the -alarm when start service. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev_vf.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index b85f68cb1d..0dea63e8be 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1977,6 +1977,8 @@ hns3vf_stop_service(struct hns3_adapter *hns) - } else - hw->reset.mbuf_deferred_free = false; - -+ rte_eal_alarm_cancel(hns3vf_keep_alive_handler, eth_dev); -+ - /* - * It is cumbersome for hardware to pick-and-choose entries for deletion - * from table space. Hence, for function reset software intervention is -@@ -1998,6 +2000,10 @@ hns3vf_start_service(struct hns3_adapter *hns) - eth_dev = &rte_eth_devices[hw->data->port_id]; - hns3_set_rxtx_function(eth_dev); - hns3_mp_req_start_rxtx(eth_dev); -+ -+ rte_eal_alarm_set(HNS3VF_KEEP_ALIVE_INTERVAL, hns3vf_keep_alive_handler, -+ eth_dev); -+ - if (hw->adapter_state == HNS3_NIC_STARTED) { - hns3vf_start_poll_job(eth_dev); - --- -2.23.0 - diff --git a/0128-net-hns3-fix-PTP-interrupt-logging.patch b/0128-net-hns3-fix-PTP-interrupt-logging.patch deleted file mode 100644 index fd02fb7..0000000 --- a/0128-net-hns3-fix-PTP-interrupt-logging.patch +++ /dev/null @@ -1,35 +0,0 @@ -From f4039f8c809b290e1031023c6dc680af7e8dbe11 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:04 +0800 -Subject: [PATCH 128/189] net/hns3: fix PTP interrupt logging - -PMD driver will receive a PTP interrupt when receive a PTP packet. -But driver doesn't distinguish it. As a result, many unknown events -are printed when many PTP packets are received on the link. The PTP -interrupt is normal, so this patch doesn't log and ignores it. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 5632b82078..7c9938b96e 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -318,7 +318,7 @@ hns3_interrupt_handler(void *param) - hns3_schedule_reset(hns); - } else if (event_cause == HNS3_VECTOR0_EVENT_MBX) { - hns3_dev_handle_mbx_msg(hw); -- } else { -+ } else if (event_cause != HNS3_VECTOR0_EVENT_PTP) { - hns3_warn(hw, "received unknown event: vector0_int_stat:0x%x " - "ras_int_stat:0x%x cmdq_int_stat:0x%x", - vector0_int, ras_int, cmdq_int); --- -2.23.0 - diff --git a/0129-net-hns3-fix-statistics-locking.patch b/0129-net-hns3-fix-statistics-locking.patch deleted file mode 100644 index 4c1349f..0000000 --- a/0129-net-hns3-fix-statistics-locking.patch +++ /dev/null @@ -1,132 +0,0 @@ -From 8626a054e516796e942019ce4a1e22d6d8fcd3ee Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:05 +0800 -Subject: [PATCH 129/189] net/hns3: fix statistics locking - -The stats_lock is used to protect statistics update in stats APIs and -periodic task, but current code only protect queue related statistics. - -Fixes: a65342d9d5d2 ("net/hns3: fix MAC and queues HW statistics overflow") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_stats.c | 22 +++++++++------------- - 1 file changed, 9 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index bf8af4531f..d56d3ec174 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -629,6 +629,7 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - uint16_t i; - int ret; - -+ rte_spinlock_lock(&hw->stats_lock); - /* Update imissed stats */ - ret = hns3_update_imissed_stats(hw, false); - if (ret) { -@@ -644,10 +645,7 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - if (rxq == NULL) - continue; - -- rte_spinlock_lock(&hw->stats_lock); - hns3_rcb_rx_ring_stats_get(rxq, stats); -- rte_spinlock_unlock(&hw->stats_lock); -- - rte_stats->ierrors += rxq->err_stats.l2_errors + - rxq->err_stats.pkt_len_errors; - rte_stats->ibytes += rxq->basic_stats.bytes; -@@ -659,9 +657,7 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - if (txq == NULL) - continue; - -- rte_spinlock_lock(&hw->stats_lock); - hns3_rcb_tx_ring_stats_get(txq, stats); -- rte_spinlock_unlock(&hw->stats_lock); - rte_stats->obytes += txq->basic_stats.bytes; - } - -@@ -683,7 +679,10 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats) - rte_stats->opackets = stats->rcb_tx_ring_pktnum_rcd - - rte_stats->oerrors; - rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed; -+ - out: -+ rte_spinlock_unlock(&hw->stats_lock); -+ - return ret; - } - -@@ -697,6 +696,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - uint16_t i; - int ret; - -+ rte_spinlock_lock(&hw->stats_lock); - /* - * Note: Reading hardware statistics of imissed registers will - * clear them. -@@ -732,7 +732,6 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - if (rxq == NULL) - continue; - -- rte_spinlock_lock(&hw->stats_lock); - memset(&rxq->basic_stats, 0, - sizeof(struct hns3_rx_basic_stats)); - -@@ -740,7 +739,6 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - (void)hns3_read_dev(rxq, HNS3_RING_RX_PKTNUM_RECORD_REG); - rxq->err_stats.pkt_len_errors = 0; - rxq->err_stats.l2_errors = 0; -- rte_spinlock_unlock(&hw->stats_lock); - } - - /* Clear all the stats of a txq in a loop to keep them synchronized */ -@@ -749,19 +747,18 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - if (txq == NULL) - continue; - -- rte_spinlock_lock(&hw->stats_lock); - memset(&txq->basic_stats, 0, - sizeof(struct hns3_tx_basic_stats)); - - /* This register is read-clear */ - (void)hns3_read_dev(txq, HNS3_RING_TX_PKTNUM_RECORD_REG); -- rte_spinlock_unlock(&hw->stats_lock); - } - -- rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_stats_clear(hw); -- rte_spinlock_unlock(&hw->stats_lock); -+ - out: -+ rte_spinlock_unlock(&hw->stats_lock); -+ - return ret; - } - -@@ -1082,11 +1079,11 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - count++; - } - } -- rte_spinlock_unlock(&hw->stats_lock); - - ret = hns3_update_imissed_stats(hw, false); - if (ret) { - hns3_err(hw, "update imissed stats failed, ret = %d", ret); -+ rte_spinlock_unlock(&hw->stats_lock); - return ret; - } - -@@ -1115,7 +1112,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - } - } - -- rte_spinlock_lock(&hw->stats_lock); - hns3_tqp_dfx_stats_get(dev, xstats, &count); - hns3_queue_stats_get(dev, xstats, &count); - rte_spinlock_unlock(&hw->stats_lock); --- -2.23.0 - diff --git a/0130-net-hns3-fix-descriptors-check-with-SVE.patch b/0130-net-hns3-fix-descriptors-check-with-SVE.patch deleted file mode 100644 index e41221a..0000000 --- a/0130-net-hns3-fix-descriptors-check-with-SVE.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 07210d18c368b27539218d9c3a907f30447c2a1e Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:06 +0800 -Subject: [PATCH 130/189] net/hns3: fix descriptors check with SVE - -The SVE algorithm and NEON algorithm have the same requirements for -nb-desc, but the nb-desc is verified only when using NEON. - -Fixes: fa29fe45a7b4 ("net/hns3: support queue start and stop") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 0dc1d8cb60..b7fe2352a1 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1759,7 +1759,8 @@ hns3_rxq_conf_runtime_check(struct hns3_hw *hw, uint16_t buf_size, - return -EINVAL; - } - -- if (pkt_burst == hns3_recv_pkts_vec) { -+ if (pkt_burst == hns3_recv_pkts_vec || -+ pkt_burst == hns3_recv_pkts_vec_sve) { - min_vec_bds = HNS3_DEFAULT_RXQ_REARM_THRESH + - HNS3_DEFAULT_RX_BURST; - if (nb_desc < min_vec_bds || --- -2.23.0 - diff --git a/0131-net-hns3-clean-some-functions.patch b/0131-net-hns3-clean-some-functions.patch deleted file mode 100644 index 412cc7d..0000000 --- a/0131-net-hns3-clean-some-functions.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 3a1871f1dfbba831c9c6a65081d22e6021d78ffe Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 21 Oct 2022 15:36:07 +0800 -Subject: [PATCH 131/189] net/hns3: clean some functions - -Delete unnecessary code and adjust code to make code more clean. - -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 10 +++------- - 1 file changed, 3 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index b7fe2352a1..840ca384ce 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1909,8 +1909,6 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, - rxq->pvid_sw_discard_en = false; - rxq->ptype_en = hns3_dev_get_support(hw, RXD_ADV_LAYOUT) ? true : false; - rxq->configured = true; -- rxq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET + -- idx * HNS3_TQP_REG_SIZE); - rxq->io_base = (void *)((char *)hw->io_base + - hns3_get_tqp_reg_offset(idx)); - rxq->io_head_reg = (volatile void *)((char *)rxq->io_base + -@@ -2442,10 +2440,8 @@ hns3_recv_pkts_simple(void *rx_queue, - - nmb = hns3_rx_alloc_buffer(rxq); - if (unlikely(nmb == NULL)) { -- uint16_t port_id; -- -- port_id = rxq->port_id; -- rte_eth_devices[port_id].data->rx_mbuf_alloc_failed++; -+ rte_eth_devices[rxq->port_id].data-> -+ rx_mbuf_alloc_failed++; - break; - } - -@@ -3870,7 +3866,7 @@ hns3_prep_pkt_proc(struct hns3_tx_queue *tx_queue, struct rte_mbuf *m) - #endif - if (hns3_pkt_is_tso(m)) { - if (hns3_pkt_need_linearized(m, m->nb_segs, -- tx_queue->max_non_tso_bd_num) || -+ tx_queue->max_non_tso_bd_num) || - hns3_check_tso_pkt_valid(m)) { - rte_errno = EINVAL; - return -EINVAL; --- -2.23.0 - diff --git a/0132-net-hns3-delete-unused-code.patch b/0132-net-hns3-delete-unused-code.patch deleted file mode 100644 index d944971..0000000 --- a/0132-net-hns3-delete-unused-code.patch +++ /dev/null @@ -1,88 +0,0 @@ -From a8c847f28e885f7ef07b3fd3fc415e2ce4113ee8 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 21 Oct 2022 15:36:08 +0800 -Subject: [PATCH 132/189] net/hns3: delete unused code - -The RTE_HNS3_ONLY_1630_FPGA macro is not in use, so delete the code. - -Fixes: 2192c428f9a6 ("net/hns3: fix firmware compatibility configuration") -Fixes: bdaf190f8235 ("net/hns3: support link speed autoneg for PF") -Cc: stable@dpdk.org - -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.c | 33 --------------------------------- - drivers/net/hns3/hns3_ethdev.c | 11 ++--------- - 2 files changed, 2 insertions(+), 42 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index e3d096d9cb..50cb3eabb1 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -631,39 +631,6 @@ hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init) - struct hns3_cmd_desc desc; - uint32_t compat = 0; - --#if defined(RTE_HNS3_ONLY_1630_FPGA) -- /* If resv reg enabled phy driver of imp is not configured, driver -- * will use temporary phy driver. -- */ -- struct rte_pci_device *pci_dev; -- struct rte_eth_dev *eth_dev; -- uint8_t revision; -- int ret; -- -- eth_dev = &rte_eth_devices[hw->data->port_id]; -- pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); -- /* Get PCI revision id */ -- ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN, -- HNS3_PCI_REVISION_ID); -- if (ret != HNS3_PCI_REVISION_ID_LEN) { -- PMD_INIT_LOG(ERR, "failed to read pci revision id, ret = %d", -- ret); -- return -EIO; -- } -- if (revision == PCI_REVISION_ID_HIP09_A) { -- struct hns3_pf *pf = HNS3_DEV_HW_TO_PF(hw); -- if (hns3_dev_get_support(hw, COPPER) == 0 || pf->is_tmp_phy) { -- PMD_INIT_LOG(ERR, "***use temp phy driver in dpdk***"); -- pf->is_tmp_phy = true; -- hns3_set_bit(hw->capability, -- HNS3_DEV_SUPPORT_COPPER_B, 1); -- return 0; -- } -- -- PMD_INIT_LOG(ERR, "***use phy driver in imp***"); -- } --#endif -- - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_FIRMWARE_COMPAT_CFG, false); - req = (struct hns3_firmware_compat_cmd *)desc.data; - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 7c9938b96e..401736f5a6 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4970,17 +4970,10 @@ hns3_set_port_link_speed(struct hns3_hw *hw, - { - int ret; - -- if (hw->mac.media_type == HNS3_MEDIA_TYPE_COPPER) { --#if defined(RTE_HNS3_ONLY_1630_FPGA) -- struct hns3_pf *pf = HNS3_DEV_HW_TO_PF(hw); -- if (pf->is_tmp_phy) -- return 0; --#endif -- -+ if (hw->mac.media_type == HNS3_MEDIA_TYPE_COPPER) - ret = hns3_set_copper_port_link_speed(hw, cfg); -- } else { -+ else - ret = hns3_set_fiber_port_link_speed(hw, cfg); -- } - - if (ret) { - hns3_err(hw, "failed to set %s port link speed, ret = %d.", --- -2.23.0 - diff --git a/0133-examples-dma-support-dequeue-when-no-packet-received.patch b/0133-examples-dma-support-dequeue-when-no-packet-received.patch deleted file mode 100644 index 4cf6fab..0000000 --- a/0133-examples-dma-support-dequeue-when-no-packet-received.patch +++ /dev/null @@ -1,62 +0,0 @@ -From ab50c70fe965fb931156eddfbde0ead68323849a Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:09 +0800 -Subject: [PATCH 133/189] examples/dma: support dequeue when no packet received - -Currently the example using DMA in asynchronous mode, which are: - nb_rx = rte_eth_rx_burst(); - if (nb_rx == 0) - continue; - ... - dma_enqueue(); // enqueue the received packets copy request - nb_cpl = dma_dequeue(); // get copy completed packets - ... - -There are no waiting inside dma_dequeue(), and this is why it's called -asynchronus. If there are no packet received, it won't call -dma_dequeue(), but some packets may still in the DMA queue which -enqueued in last cycle. As a result, when the traffic is stopped, the -sent packets and received packets are unbalanced from the perspective -of the traffic generator. - -The patch supports DMA dequeue when no packet received, it helps to -judge the test result by comparing the sent packets with the received -packets on traffic generator sides. - -Signed-off-by: Chengwen Feng -Acked-by: Bruce Richardson -Acked-by: Kevin Laatz ---- - examples/dma/dmafwd.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/examples/dma/dmafwd.c b/examples/dma/dmafwd.c -index 9b17b40dbf..b06042e5fe 100644 ---- a/examples/dma/dmafwd.c -+++ b/examples/dma/dmafwd.c -@@ -408,8 +408,13 @@ dma_rx_port(struct rxtx_port_config *rx_config) - nb_rx = rte_eth_rx_burst(rx_config->rxtx_port, i, - pkts_burst, MAX_PKT_BURST); - -- if (nb_rx == 0) -+ if (nb_rx == 0) { -+ if (copy_mode == COPY_MODE_DMA_NUM && -+ (nb_rx = dma_dequeue(pkts_burst, pkts_burst_copy, -+ MAX_PKT_BURST, rx_config->dmadev_ids[i])) > 0) -+ goto handle_tx; - continue; -+ } - - port_statistics.rx[rx_config->rxtx_port] += nb_rx; - -@@ -450,6 +455,7 @@ dma_rx_port(struct rxtx_port_config *rx_config) - pkts_burst_copy[j]); - } - -+handle_tx: - rte_mempool_put_bulk(dma_pktmbuf_pool, - (void *)pkts_burst, nb_rx); - --- -2.23.0 - diff --git a/0134-net-hns3-add-dump-of-VF-VLAN-filter-modify-capabilit.patch b/0134-net-hns3-add-dump-of-VF-VLAN-filter-modify-capabilit.patch deleted file mode 100644 index b5d1ac4..0000000 --- a/0134-net-hns3-add-dump-of-VF-VLAN-filter-modify-capabilit.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 29cb11b1bfafa7a4cefaffbbd5b05afab32957ba Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 21 Oct 2022 15:36:10 +0800 -Subject: [PATCH 134/189] net/hns3: add dump of VF VLAN filter modify - capability - -Show whether support modifying VF VLAN filter or not. -Sample output changes: -+ -- support VF VLAN FILTER MOD: Yes - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_dump.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index ef3e5c0fb4..646e93d8e6 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -98,6 +98,7 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - {HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, "OUTER UDP CKSUM"}, - {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, - {HNS3_DEV_SUPPORT_TM_B, "TM"}, -+ {HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"}, - }; - uint32_t i; - --- -2.23.0 - diff --git a/0135-net-hns3-fix-Rx-with-PTP.patch b/0135-net-hns3-fix-Rx-with-PTP.patch deleted file mode 100644 index 4afa8cb..0000000 --- a/0135-net-hns3-fix-Rx-with-PTP.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 9fd76879f458693e1cf368aeeb08238c579c8ff3 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:11 +0800 -Subject: [PATCH 135/189] net/hns3: fix Rx with PTP - -The Rx and Tx vector algorithm of hns3 PMD don't support PTP -function. Currently, hns3 driver uses 'pf->ptp_enable' to check -whether PTP is enabled so as to not select Rx and Tx vector -algorithm. And the variable is set when call rte_eth_timesync_enable(). -Namely, it may not be set before selecting Rx/Tx function, let's say -the case: set PTP offload in dev_configure(), do dev_start() and then -call rte_eth_timesync_enable(). In this case, all PTP packets can not -be received to application. So this patch fixes the check based on the -RTE_ETH_RX_OFFLOAD_TIMESTAMP flag. - -Fixes: 3ca3dcd65101 ("net/hns3: fix vector Rx/Tx when PTP enabled") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ptp.c | 1 - - drivers/net/hns3/hns3_rxtx_vec.c | 20 +++++++++----------- - 2 files changed, 9 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 0b0061bba5..6bbd85ba23 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -125,7 +125,6 @@ hns3_timesync_enable(struct rte_eth_dev *dev) - - if (pf->ptp_enable) - return 0; -- hns3_warn(hw, "note: please ensure Rx/Tx burst mode is simple or common when enabling PTP!"); - - rte_spinlock_lock(&hw->lock); - ret = hns3_timesync_configure(hns, true); -diff --git a/drivers/net/hns3/hns3_rxtx_vec.c b/drivers/net/hns3/hns3_rxtx_vec.c -index 73f0ab6bc8..153866cf03 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.c -+++ b/drivers/net/hns3/hns3_rxtx_vec.c -@@ -17,15 +17,18 @@ int - hns3_tx_check_vec_support(struct rte_eth_dev *dev) - { - struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode; -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_pf *pf = &hns->pf; -+ struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; - - /* Only support RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE */ - if (txmode->offloads != RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) - return -ENOTSUP; - -- /* Vec is not supported when PTP enabled */ -- if (pf->ptp_enable) -+ /* -+ * PTP function requires the cooperation of Rx and Tx. -+ * Tx vector isn't supported if RTE_ETH_RX_OFFLOAD_TIMESTAMP is set -+ * in Rx offloads. -+ */ -+ if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) - return -ENOTSUP; - - return 0; -@@ -233,9 +236,8 @@ hns3_rx_check_vec_support(struct rte_eth_dev *dev) - struct rte_eth_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf; - struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; - uint64_t offloads_mask = RTE_ETH_RX_OFFLOAD_TCP_LRO | -- RTE_ETH_RX_OFFLOAD_VLAN; -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_pf *pf = &hns->pf; -+ RTE_ETH_RX_OFFLOAD_VLAN | -+ RTE_ETH_RX_OFFLOAD_TIMESTAMP; - - if (dev->data->scattered_rx) - return -ENOTSUP; -@@ -249,9 +251,5 @@ hns3_rx_check_vec_support(struct rte_eth_dev *dev) - if (hns3_rxq_iterate(dev, hns3_rxq_vec_check, NULL) != 0) - return -ENOTSUP; - -- /* Vec is not supported when PTP enabled */ -- if (pf->ptp_enable) -- return -ENOTSUP; -- - return 0; - } --- -2.23.0 - diff --git a/0136-net-hns3-fix-crash-in-SVE-Tx.patch b/0136-net-hns3-fix-crash-in-SVE-Tx.patch deleted file mode 100644 index c08d282..0000000 --- a/0136-net-hns3-fix-crash-in-SVE-Tx.patch +++ /dev/null @@ -1,44 +0,0 @@ -From eaab0561c2effa2f60f27c10d27c099d819fdd1f Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:12 +0800 -Subject: [PATCH 136/189] net/hns3: fix crash in SVE Tx - -Currently, the number of Tx send bytes is obtained by accumulating the -length of the batch 'mbuf' packets of the current loop cycle. -Unfortunately, it uses svcntd (which means all lane, regardless of -whether the corresponding lane is valid) which may lead to overflow, -and thus refers to an invalid mbuf. - -Because the SVE xmit algorithm applies only to a single mbuf, the -mbuf's data_len is equal pkt_len, so this patch fixes it by using -svaddv_u64(svbool_t pg, svuint64_t data_len) which only adds valid -lanes. - -Fixes: fdcd6a3e0246 ("net/hns3: add bytes stats") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_sve.c | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index be1fdbcdf0..b0dfb052bb 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -435,9 +435,8 @@ hns3_tx_fill_hw_ring_sve(struct hns3_tx_queue *txq, - offsets, svdup_n_u64(valid_bit)); - - /* Increment bytes counter */ -- uint32_t idx; -- for (idx = 0; idx < svcntd(); idx++) -- txq->basic_stats.bytes += pkts[idx]->pkt_len; -+ txq->basic_stats.bytes += -+ (svaddv_u64(pg, data_len) >> HNS3_UINT16_BIT); - - /* update index for next loop */ - i += svcntd(); --- -2.23.0 - diff --git a/0137-net-hns3-fix-next-to-use-overflow-in-SVE-Tx.patch b/0137-net-hns3-fix-next-to-use-overflow-in-SVE-Tx.patch deleted file mode 100644 index cf96059..0000000 --- a/0137-net-hns3-fix-next-to-use-overflow-in-SVE-Tx.patch +++ /dev/null @@ -1,46 +0,0 @@ -From e95f25b7cda1108b4e0579dd70f1bf90516b7e2c Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:13 +0800 -Subject: [PATCH 137/189] net/hns3: fix next-to-use overflow in SVE Tx - -If txq's next-to-use plus nb_pkts equal txq's nb_tx_desc when using -SVE xmit algorithm, the txq's next-to-use will equal nb_tx_desc after -the xmit, this does not cause Tx exceptions, but may affect other ops -that depend on this field, such as tx_descriptor_status. - -Fixes: f0c243a6cb6f ("net/hns3: support SVE Tx") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_sve.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index b0dfb052bb..f09a81dbd5 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -464,14 +464,16 @@ hns3_xmit_fixed_burst_vec_sve(void *__restrict tx_queue, - return 0; - } - -- if (txq->next_to_use + nb_pkts > txq->nb_tx_desc) { -+ if (txq->next_to_use + nb_pkts >= txq->nb_tx_desc) { - nb_tx = txq->nb_tx_desc - txq->next_to_use; - hns3_tx_fill_hw_ring_sve(txq, tx_pkts, nb_tx); - txq->next_to_use = 0; - } - -- hns3_tx_fill_hw_ring_sve(txq, tx_pkts + nb_tx, nb_pkts - nb_tx); -- txq->next_to_use += nb_pkts - nb_tx; -+ if (nb_pkts > nb_tx) { -+ hns3_tx_fill_hw_ring_sve(txq, tx_pkts + nb_tx, nb_pkts - nb_tx); -+ txq->next_to_use += nb_pkts - nb_tx; -+ } - - txq->tx_bd_ready -= nb_pkts; - hns3_write_txq_tail_reg(txq, nb_pkts); --- -2.23.0 - diff --git a/0138-net-hns3-fix-next-to-use-overflow-in-simple-Tx.patch b/0138-net-hns3-fix-next-to-use-overflow-in-simple-Tx.patch deleted file mode 100644 index 8310dfa..0000000 --- a/0138-net-hns3-fix-next-to-use-overflow-in-simple-Tx.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 982c9eabe68c6d5a0e8328df8dc11c5f315eddf0 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:14 +0800 -Subject: [PATCH 138/189] net/hns3: fix next-to-use overflow in simple Tx - -If txq's next-to-use plus nb_pkts equal txq's nb_tx_desc when using -simple xmit algorithm, the txq's next-to-use will equal nb_tx_desc -fter the xmit, this does not cause Tx exceptions, but may affect other -ops that depend on this field, such as tx_descriptor_status. - -Fixes: 7ef933908f04 ("net/hns3: add simple Tx path") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 840ca384ce..93cc70477d 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4129,14 +4129,16 @@ hns3_xmit_pkts_simple(void *tx_queue, - } - - txq->tx_bd_ready -= nb_pkts; -- if (txq->next_to_use + nb_pkts > txq->nb_tx_desc) { -+ if (txq->next_to_use + nb_pkts >= txq->nb_tx_desc) { - nb_tx = txq->nb_tx_desc - txq->next_to_use; - hns3_tx_fill_hw_ring(txq, tx_pkts, nb_tx); - txq->next_to_use = 0; - } - -- hns3_tx_fill_hw_ring(txq, tx_pkts + nb_tx, nb_pkts - nb_tx); -- txq->next_to_use += nb_pkts - nb_tx; -+ if (nb_pkts > nb_tx) { -+ hns3_tx_fill_hw_ring(txq, tx_pkts + nb_tx, nb_pkts - nb_tx); -+ txq->next_to_use += nb_pkts - nb_tx; -+ } - - hns3_write_txq_tail_reg(txq, nb_pkts); - --- -2.23.0 - diff --git a/0139-net-hns3-optimize-SVE-Tx-performance.patch b/0139-net-hns3-optimize-SVE-Tx-performance.patch deleted file mode 100644 index df5df6e..0000000 --- a/0139-net-hns3-optimize-SVE-Tx-performance.patch +++ /dev/null @@ -1,56 +0,0 @@ -From c4f3e4cf9404434d8062c523c8b6bc55df136140 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:15 +0800 -Subject: [PATCH 139/189] net/hns3: optimize SVE Tx performance - -Optimize SVE xmit algorithm performance, will get about 1%+ -performance gain under 64B macfwd. - -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/net/hns3/hns3_rxtx_vec_sve.c | 19 ++++++++++--------- - 1 file changed, 10 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index f09a81dbd5..6f23ba674d 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -389,10 +389,12 @@ hns3_tx_fill_hw_ring_sve(struct hns3_tx_queue *txq, - HNS3_UINT32_BIT; - svuint64_t base_addr, buf_iova, data_off, data_len, addr; - svuint64_t offsets = svindex_u64(0, BD_SIZE); -- uint32_t i = 0; -- svbool_t pg = svwhilelt_b64_u32(i, nb_pkts); -+ uint32_t cnt = svcntd(); -+ svbool_t pg; -+ uint32_t i; - -- do { -+ for (i = 0; i < nb_pkts; /* i is updated in the inner loop */) { -+ pg = svwhilelt_b64_u32(i, nb_pkts); - base_addr = svld1_u64(pg, (uint64_t *)pkts); - /* calc mbuf's field buf_iova address */ - buf_iova = svadd_n_u64_z(pg, base_addr, -@@ -439,12 +441,11 @@ hns3_tx_fill_hw_ring_sve(struct hns3_tx_queue *txq, - (svaddv_u64(pg, data_len) >> HNS3_UINT16_BIT); - - /* update index for next loop */ -- i += svcntd(); -- pkts += svcntd(); -- txdp += svcntd(); -- tx_entry += svcntd(); -- pg = svwhilelt_b64_u32(i, nb_pkts); -- } while (svptest_any(svptrue_b64(), pg)); -+ i += cnt; -+ pkts += cnt; -+ txdp += cnt; -+ tx_entry += cnt; -+ } - } - - static uint16_t --- -2.23.0 - diff --git a/0140-net-hns3-fix-crash-when-secondary-process-access-FW.patch b/0140-net-hns3-fix-crash-when-secondary-process-access-FW.patch deleted file mode 100644 index 5159982..0000000 --- a/0140-net-hns3-fix-crash-when-secondary-process-access-FW.patch +++ /dev/null @@ -1,75 +0,0 @@ -From aa31e13f290fb82b43dac134f6b2b0332b3ffd45 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:16 +0800 -Subject: [PATCH 140/189] net/hns3: fix crash when secondary process access FW - -Currently, to prevent missing reporting of reset interrupts and quickly -identify reset interrupts, the following logic is designed in the -FW (firmware) command interface hns3_cmd_send: if an unprocessed -interrupt exist (by checking reset registers), related reset task is -scheduled. - -The secondary process may invoke the hns3_cmd_send interface (e.g. using -proc-info query some stats). Unfortunately, the secondary process -does not support reset processing, and a segment fault may occur if it -schedules reset task. - -Fix it by limit the checking and scheduling of reset under only primary -process. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 10 +++++++++- - drivers/net/hns3/hns3_ethdev_vf.c | 11 +++++++++-- - 2 files changed, 18 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 401736f5a6..24ee9df332 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5602,7 +5602,15 @@ hns3_is_reset_pending(struct hns3_adapter *hns) - struct hns3_hw *hw = &hns->hw; - enum hns3_reset_level reset; - -- hns3_check_event_cause(hns, NULL); -+ /* -+ * Check the registers to confirm whether there is reset pending. -+ * Note: This check may lead to schedule reset task, but only primary -+ * process can process the reset event. Therefore, limit the -+ * checking under only primary process. -+ */ -+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) -+ hns3_check_event_cause(hns, NULL); -+ - reset = hns3_get_reset_level(hns, &hw->reset.pending); - if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && - hw->reset.level < reset) { -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 0dea63e8be..db2f15abe2 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1864,8 +1864,15 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns) - if (hw->reset.level == HNS3_VF_FULL_RESET) - return false; - -- /* Check the registers to confirm whether there is reset pending */ -- hns3vf_check_event_cause(hns, NULL); -+ /* -+ * Check the registers to confirm whether there is reset pending. -+ * Note: This check may lead to schedule reset task, but only primary -+ * process can process the reset event. Therefore, limit the -+ * checking under only primary process. -+ */ -+ if (rte_eal_process_type() == RTE_PROC_PRIMARY) -+ hns3vf_check_event_cause(hns, NULL); -+ - reset = hns3vf_get_reset_level(hw, &hw->reset.pending); - if (hw->reset.level != HNS3_NONE_RESET && reset != HNS3_NONE_RESET && - hw->reset.level < reset) { --- -2.23.0 - diff --git a/0141-net-hns3-delete-unused-markup.patch b/0141-net-hns3-delete-unused-markup.patch deleted file mode 100644 index ac54d7e..0000000 --- a/0141-net-hns3-delete-unused-markup.patch +++ /dev/null @@ -1,81 +0,0 @@ -From a3cc39e81492da62dc98146c33f8f5dbb632e746 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:17 +0800 -Subject: [PATCH 141/189] net/hns3: delete unused markup - -The '__rte_unused' tag in the input parameter of 'hns3_mac_stats_reset' -is redundant. This patch remove this tag. In addition, this function is -aimed to clear MAC statics. So using 'struct hns3_hw' as input parameter -is better than 'struct rte_eth_dev', and it also facilitates the call of -this function. - -Fixes: 8839c5e202f3 ("net/hns3: support device stats") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_stats.c | 22 +++++----------------- - 1 file changed, 5 insertions(+), 17 deletions(-) - -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index d56d3ec174..c2af3bd231 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -406,15 +406,6 @@ hns3_query_mac_stats_reg_num(struct hns3_hw *hw) - return 0; - } - --static int --hns3_query_update_mac_stats(struct rte_eth_dev *dev) --{ -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -- -- return hns3_update_mac_stats(hw); --} -- - static int - hns3_update_port_rpu_drop_stats(struct hns3_hw *hw) - { -@@ -763,14 +754,13 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev) - } - - static int --hns3_mac_stats_reset(__rte_unused struct rte_eth_dev *dev) -+hns3_mac_stats_reset(struct hns3_hw *hw) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; - struct hns3_mac_stats *mac_stats = &hw->mac_stats; - int ret; - -- ret = hns3_query_update_mac_stats(dev); -+ /* Clear hardware MAC statistics by reading it. */ -+ ret = hns3_update_mac_stats(hw); - if (ret) { - hns3_err(hw, "Clear Mac stats fail : %d", ret); - return ret; -@@ -1063,8 +1053,7 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - hns3_tqp_basic_stats_get(dev, xstats, &count); - - if (!hns->is_vf) { -- /* Update Mac stats */ -- ret = hns3_query_update_mac_stats(dev); -+ ret = hns3_update_mac_stats(hw); - if (ret < 0) { - hns3_err(hw, "Update Mac stats fail : %d", ret); - rte_spinlock_unlock(&hw->stats_lock); -@@ -1482,8 +1471,7 @@ hns3_dev_xstats_reset(struct rte_eth_dev *dev) - if (hns->is_vf) - goto out; - -- /* HW registers are cleared on read */ -- ret = hns3_mac_stats_reset(dev); -+ ret = hns3_mac_stats_reset(hw); - - out: - rte_spinlock_unlock(&hw->stats_lock); --- -2.23.0 - diff --git a/0142-net-hns3-fix-clearing-hardware-MAC-statistics.patch b/0142-net-hns3-fix-clearing-hardware-MAC-statistics.patch deleted file mode 100644 index 9b7706b..0000000 --- a/0142-net-hns3-fix-clearing-hardware-MAC-statistics.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 70cecb90da490a7f0d484ab9cd8bd481c17f20a3 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:18 +0800 -Subject: [PATCH 142/189] net/hns3: fix clearing hardware MAC statistics - -In the situation that the driver hns3 exits abnormally during packets -sending and receiving, the hardware statistics are not cleared when the -driver hns3 is reloaded. It need to be cleared during driver hns3 -initialization that hardware MAC statistics. - -Fixes: 8839c5e202f3 ("net/hns3: support device stats") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_stats.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index c2af3bd231..552ae9d30c 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -1528,6 +1528,7 @@ hns3_tqp_stats_clear(struct hns3_hw *hw) - int - hns3_stats_init(struct hns3_hw *hw) - { -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - int ret; - - rte_spinlock_init(&hw->stats_lock); -@@ -1538,6 +1539,9 @@ hns3_stats_init(struct hns3_hw *hw) - return ret; - } - -+ if (!hns->is_vf) -+ hns3_mac_stats_reset(hw); -+ - return hns3_tqp_stats_init(hw); - } - --- -2.23.0 - diff --git a/0143-net-hns3-revert-Tx-performance-optimization.patch b/0143-net-hns3-revert-Tx-performance-optimization.patch deleted file mode 100644 index 41fb7b0..0000000 --- a/0143-net-hns3-revert-Tx-performance-optimization.patch +++ /dev/null @@ -1,185 +0,0 @@ -From 39caf6f8ce22bb3d8af12ab16b1182fe1679698d Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:19 +0800 -Subject: [PATCH 143/189] net/hns3: revert Tx performance optimization - -The Tx performance deteriorates in the case of larger packets size and -larger burst. It may take a long time to optimize in these scenarios, -so this commit reverts -commit 0b77e8f3d364 ("net/hns3: optimize Tx performance") - -Fixes: 0b77e8f3d364 ("net/hns3: optimize Tx performance") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 115 ++++++++++++++++++----------------- - 1 file changed, 60 insertions(+), 55 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 93cc70477d..21c3ef72b1 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -3075,51 +3075,40 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, - return 0; - } - --static int -+static void - hns3_tx_free_useless_buffer(struct hns3_tx_queue *txq) - { - uint16_t tx_next_clean = txq->next_to_clean; -- uint16_t tx_next_use = txq->next_to_use; -- struct hns3_entry *tx_entry = &txq->sw_ring[tx_next_clean]; -+ uint16_t tx_next_use = txq->next_to_use; -+ uint16_t tx_bd_ready = txq->tx_bd_ready; -+ uint16_t tx_bd_max = txq->nb_tx_desc; -+ struct hns3_entry *tx_bak_pkt = &txq->sw_ring[tx_next_clean]; - struct hns3_desc *desc = &txq->tx_ring[tx_next_clean]; -- uint16_t i; -- -- if (tx_next_use >= tx_next_clean && -- tx_next_use < tx_next_clean + txq->tx_rs_thresh) -- return -1; -+ struct rte_mbuf *mbuf; - -- /* -- * All mbufs can be released only when the VLD bits of all -- * descriptors in a batch are cleared. -- */ -- for (i = 0; i < txq->tx_rs_thresh; i++) { -- if (desc[i].tx.tp_fe_sc_vld_ra_ri & -- rte_le_to_cpu_16(BIT(HNS3_TXD_VLD_B))) -- return -1; -- } -+ while ((!(desc->tx.tp_fe_sc_vld_ra_ri & -+ rte_cpu_to_le_16(BIT(HNS3_TXD_VLD_B)))) && -+ tx_next_use != tx_next_clean) { -+ mbuf = tx_bak_pkt->mbuf; -+ if (mbuf) { -+ rte_pktmbuf_free_seg(mbuf); -+ tx_bak_pkt->mbuf = NULL; -+ } - -- for (i = 0; i < txq->tx_rs_thresh; i++) { -- rte_pktmbuf_free_seg(tx_entry[i].mbuf); -- tx_entry[i].mbuf = NULL; -+ desc++; -+ tx_bak_pkt++; -+ tx_next_clean++; -+ tx_bd_ready++; -+ -+ if (tx_next_clean >= tx_bd_max) { -+ tx_next_clean = 0; -+ desc = txq->tx_ring; -+ tx_bak_pkt = txq->sw_ring; -+ } - } - -- /* Update numbers of available descriptor due to buffer freed */ -- txq->tx_bd_ready += txq->tx_rs_thresh; -- txq->next_to_clean += txq->tx_rs_thresh; -- if (txq->next_to_clean >= txq->nb_tx_desc) -- txq->next_to_clean = 0; -- -- return 0; --} -- --static inline int --hns3_tx_free_required_buffer(struct hns3_tx_queue *txq, uint16_t required_bds) --{ -- while (required_bds > txq->tx_bd_ready) { -- if (hns3_tx_free_useless_buffer(txq) != 0) -- return -1; -- } -- return 0; -+ txq->next_to_clean = tx_next_clean; -+ txq->tx_bd_ready = tx_bd_ready; - } - - int -@@ -4162,8 +4151,7 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - uint16_t nb_tx; - uint16_t i; - -- if (txq->tx_bd_ready < txq->tx_free_thresh) -- (void)hns3_tx_free_useless_buffer(txq); -+ hns3_tx_free_useless_buffer(txq); - - tx_next_use = txq->next_to_use; - tx_bd_max = txq->nb_tx_desc; -@@ -4178,14 +4166,10 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - nb_buf = tx_pkt->nb_segs; - - if (nb_buf > txq->tx_bd_ready) { -- /* Try to release the required MBUF, but avoid releasing -- * all MBUFs, otherwise, the MBUFs will be released for -- * a long time and may cause jitter. -- */ -- if (hns3_tx_free_required_buffer(txq, nb_buf) != 0) { -- txq->dfx_stats.queue_full_cnt++; -- goto end_of_tx; -- } -+ txq->dfx_stats.queue_full_cnt++; -+ if (nb_tx == 0) -+ return 0; -+ goto end_of_tx; - } - - /* -@@ -4609,22 +4593,43 @@ hns3_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id) - static int - hns3_tx_done_cleanup_full(struct hns3_tx_queue *txq, uint32_t free_cnt) - { -- uint16_t round_cnt; -+ uint16_t next_to_clean = txq->next_to_clean; -+ uint16_t next_to_use = txq->next_to_use; -+ uint16_t tx_bd_ready = txq->tx_bd_ready; -+ struct hns3_entry *tx_pkt = &txq->sw_ring[next_to_clean]; -+ struct hns3_desc *desc = &txq->tx_ring[next_to_clean]; - uint32_t idx; - - if (free_cnt == 0 || free_cnt > txq->nb_tx_desc) - free_cnt = txq->nb_tx_desc; - -- if (txq->tx_rs_thresh == 0) -- return 0; -- -- round_cnt = rounddown(free_cnt, txq->tx_rs_thresh); -- for (idx = 0; idx < round_cnt; idx += txq->tx_rs_thresh) { -- if (hns3_tx_free_useless_buffer(txq) != 0) -+ for (idx = 0; idx < free_cnt; idx++) { -+ if (next_to_clean == next_to_use) -+ break; -+ if (desc->tx.tp_fe_sc_vld_ra_ri & -+ rte_cpu_to_le_16(BIT(HNS3_TXD_VLD_B))) - break; -+ if (tx_pkt->mbuf != NULL) { -+ rte_pktmbuf_free_seg(tx_pkt->mbuf); -+ tx_pkt->mbuf = NULL; -+ } -+ next_to_clean++; -+ tx_bd_ready++; -+ tx_pkt++; -+ desc++; -+ if (next_to_clean == txq->nb_tx_desc) { -+ tx_pkt = txq->sw_ring; -+ desc = txq->tx_ring; -+ next_to_clean = 0; -+ } -+ } -+ -+ if (idx > 0) { -+ txq->next_to_clean = next_to_clean; -+ txq->tx_bd_ready = tx_bd_ready; - } - -- return idx; -+ return (int)idx; - } - - int --- -2.23.0 - diff --git a/0144-net-hns3-fix-RSS-rule-restore.patch b/0144-net-hns3-fix-RSS-rule-restore.patch deleted file mode 100644 index 2eca942..0000000 --- a/0144-net-hns3-fix-RSS-rule-restore.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 85b5d5a0807856f276bb382af7a443e030975cce Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:20 +0800 -Subject: [PATCH 144/189] net/hns3: fix RSS rule restore - -The 'hns3_restore_rss_filter' function is used to restore RSS rule. -But this function calls the 'hns3_config_rss_filter' which sets the -last to invalid in flow RSS list. This causes the flow RSS list has -no valid rule. - -Fixes: ec674cb742e5 ("net/hns3: fix flushing RSS rule") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 17 +++++++++-------- - 1 file changed, 9 insertions(+), 8 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 5e0a9bc93f..8b9bfe4880 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1539,7 +1539,6 @@ hns3_config_rss_filter(struct rte_eth_dev *dev, - const struct hns3_rss_conf *conf, bool add) - { - struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_hw *hw = &hns->hw; - struct hns3_rss_conf *rss_info; - uint64_t flow_types; -@@ -1618,13 +1617,6 @@ hns3_config_rss_filter(struct rte_eth_dev *dev, - goto rss_config_err; - } - -- /* -- * When create a new RSS rule, the old rule will be overlaid and set -- * invalid. -- */ -- TAILQ_FOREACH(rss_filter_ptr, &hw->flow_rss_list, entries) -- rss_filter_ptr->filter_info.valid = false; -- - rss_config_err: - rte_spinlock_unlock(&hw->lock); - -@@ -1749,6 +1741,7 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_rss_conf_ele *rss_filter_ptr; -+ struct hns3_rss_conf_ele *filter_ptr; - const struct hns3_rss_conf *rss_conf; - int ret; - -@@ -1773,6 +1766,14 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - - hns3_rss_conf_copy(&rss_filter_ptr->filter_info, &rss_conf->conf); - rss_filter_ptr->filter_info.valid = true; -+ -+ /* -+ * When create a new RSS rule, the old rule will be overlaid and set -+ * invalid. -+ */ -+ TAILQ_FOREACH(filter_ptr, &hw->flow_rss_list, entries) -+ filter_ptr->filter_info.valid = false; -+ - TAILQ_INSERT_TAIL(&hw->flow_rss_list, rss_filter_ptr, entries); - flow->rule = rss_filter_ptr; - flow->filter_type = RTE_ETH_FILTER_HASH; --- -2.23.0 - diff --git a/0145-net-hns3-fix-RSS-filter-restore.patch b/0145-net-hns3-fix-RSS-filter-restore.patch deleted file mode 100644 index 6860ca5..0000000 --- a/0145-net-hns3-fix-RSS-filter-restore.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 2e78798fe932e9064677c6f2d1ea14542c503202 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:21 +0800 -Subject: [PATCH 145/189] net/hns3: fix RSS filter restore - -Currently, driver sets RSS function to 'RTE_ETH_HASH_FUNCTION_MAX' -when user flush all rules in order to judge whether driver needs -to restore RSS rules. In fact, all rules are saved in flow RSS list. -So there is no need to modify RSS function to this macro. And this -list can be used to restore. The modification of RSS function may -introduce new problem. - -Fixes: eb158fc756a5 ("net/hns3: fix config when creating RSS rule after flush") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 20 ++++++++++++++------ - 1 file changed, 14 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 8b9bfe4880..82ead96854 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1587,8 +1587,6 @@ hns3_config_rss_filter(struct rte_eth_dev *dev, - rss_info->conf.queue_num = 0; - } - -- /* set RSS func invalid after flushed */ -- rss_info->conf.func = RTE_ETH_HASH_FUNCTION_MAX; - return 0; - } - -@@ -1659,13 +1657,23 @@ int - hns3_restore_rss_filter(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_rss_conf_ele *filter; - struct hns3_hw *hw = &hns->hw; -+ int ret = 0; - -- /* When user flush all rules, it doesn't need to restore RSS rule */ -- if (hw->rss_info.conf.func == RTE_ETH_HASH_FUNCTION_MAX) -- return 0; -+ TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { -+ if (!filter->filter_info.valid) -+ continue; - -- return hns3_config_rss_filter(dev, &hw->rss_info, true); -+ ret = hns3_config_rss_filter(dev, &filter->filter_info, true); -+ if (ret != 0) { -+ hns3_err(hw, "restore RSS filter failed, ret=%d", ret); -+ goto out; -+ } -+ } -+ -+out: -+ return ret; - } - - static int --- -2.23.0 - diff --git a/0146-net-hns3-fix-lock-protection-of-RSS-flow-rule.patch b/0146-net-hns3-fix-lock-protection-of-RSS-flow-rule.patch deleted file mode 100644 index e2b0e4b..0000000 --- a/0146-net-hns3-fix-lock-protection-of-RSS-flow-rule.patch +++ /dev/null @@ -1,74 +0,0 @@ -From baa250c283ba4180f3ac55b42c74f98d85860598 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:22 +0800 -Subject: [PATCH 146/189] net/hns3: fix lock protection of RSS flow rule - -RSS flow rules are saved in RSS filter linked list. The linked -list is modified by rte_flow API and is used to restore RSS rules -during reset process. So this patch uses 'hw->flows_lock' to protect -the configuration and recovery of RSS rule. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 16 ++++++---------- - 1 file changed, 6 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 82ead96854..301a4a56b3 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1596,27 +1596,20 @@ hns3_config_rss_filter(struct rte_eth_dev *dev, - hns3_warn(hw, "Config queue numbers %u are beyond the scope of truncated", - rss_flow_conf.queue_num); - hns3_info(hw, "Max of contiguous %u PF queues are configured", num); -- -- rte_spinlock_lock(&hw->lock); - if (num) { - ret = hns3_update_indir_table(dev, &rss_flow_conf, num); - if (ret) -- goto rss_config_err; -+ return ret; - } - - /* Set hash algorithm and flow types by the user's config */ - ret = hns3_hw_rss_hash_set(hw, &rss_flow_conf); - if (ret) -- goto rss_config_err; -+ return ret; - - ret = hns3_rss_conf_copy(rss_info, &rss_flow_conf); -- if (ret) { -+ if (ret) - hns3_err(hw, "RSS config init fail(%d)", ret); -- goto rss_config_err; -- } -- --rss_config_err: -- rte_spinlock_unlock(&hw->lock); - - return ret; - } -@@ -1661,6 +1654,7 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - struct hns3_hw *hw = &hns->hw; - int ret = 0; - -+ pthread_mutex_lock(&hw->flows_lock); - TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { - if (!filter->filter_info.valid) - continue; -@@ -1673,6 +1667,8 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - } - - out: -+ pthread_mutex_unlock(&hw->flows_lock); -+ - return ret; - } - --- -2.23.0 - diff --git a/0147-net-hns3-fix-RSS-flow-rule-restore.patch b/0147-net-hns3-fix-RSS-flow-rule-restore.patch deleted file mode 100644 index da815ee..0000000 --- a/0147-net-hns3-fix-RSS-flow-rule-restore.patch +++ /dev/null @@ -1,159 +0,0 @@ -From c05520ce0dfe94fd8a676a4d69502f6abc67df08 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:23 +0800 -Subject: [PATCH 147/189] net/hns3: fix RSS flow rule restore - -After reset process, types of RSS flow rule cannot be restored when -load driver without RTE_ETH_MQ_RX_RSS_FLAG flag. This is because the -restoration for RSS flow rule is done in the 'hns3_config_rss()'. But -this function is also used to configure and restore RSS configuration -from ethdev ops, and doesn't configure RSS types if 'rxmode.mq_mode' -has not the flag. As a result, RSS types configured by rte flow API -can't be restored in this case when encounter reset. Actually, all -RSS rules are saved to a global link list. - -Use the linked list to restore RSS flow rule. - -Fixes: 920be799dbc3 ("net/hns3: fix RSS indirection table configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 11 ++--------- - drivers/net/hns3/hns3_ethdev_vf.c | 11 ++--------- - drivers/net/hns3/hns3_flow.c | 8 +++++++- - drivers/net/hns3/hns3_flow.h | 1 + - drivers/net/hns3/hns3_rss.h | 1 - - 5 files changed, 12 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 24ee9df332..fc3fc76a40 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5006,6 +5006,7 @@ static int - hns3_do_start(struct hns3_adapter *hns, bool reset_queue) - { - struct hns3_hw *hw = &hns->hw; -+ struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; - bool link_en; - int ret; - -@@ -5042,7 +5043,7 @@ hns3_do_start(struct hns3_adapter *hns, bool reset_queue) - if (ret) - goto err_set_link_speed; - -- return 0; -+ return hns3_restore_filter(dev); - - err_set_link_speed: - (void)hns3_cfg_mac_mode(hw, false); -@@ -5059,12 +5060,6 @@ hns3_do_start(struct hns3_adapter *hns, bool reset_queue) - return ret; - } - --static void --hns3_restore_filter(struct rte_eth_dev *dev) --{ -- hns3_restore_rss_filter(dev); --} -- - static int - hns3_dev_start(struct rte_eth_dev *dev) - { -@@ -5121,8 +5116,6 @@ hns3_dev_start(struct rte_eth_dev *dev) - hns3_set_rxtx_function(dev); - hns3_mp_req_start_rxtx(dev); - -- hns3_restore_filter(dev); -- - /* Enable interrupt of all rx queues before enabling queues */ - hns3_dev_all_rx_queue_intr_enable(hw, true); - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index db2f15abe2..13f1cba0e6 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1727,6 +1727,7 @@ static int - hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - { - struct hns3_hw *hw = &hns->hw; -+ struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; - uint16_t nb_rx_q = hw->data->nb_rx_queues; - uint16_t nb_tx_q = hw->data->nb_tx_queues; - int ret; -@@ -1741,13 +1742,7 @@ hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - if (ret) - hns3_err(hw, "failed to init queues, ret = %d.", ret); - -- return ret; --} -- --static void --hns3vf_restore_filter(struct rte_eth_dev *dev) --{ -- hns3_restore_rss_filter(dev); -+ return hns3_restore_filter(dev); - } - - static int -@@ -1799,8 +1794,6 @@ hns3vf_dev_start(struct rte_eth_dev *dev) - hns3_set_rxtx_function(dev); - hns3_mp_req_start_rxtx(dev); - -- hns3vf_restore_filter(dev); -- - /* Enable interrupt of all rx queues before enabling queues */ - hns3_dev_all_rx_queue_intr_enable(hw, true); - hns3_start_tqps(hw); -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 301a4a56b3..7bd2f0bf7a 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1646,7 +1646,7 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - return ret; - } - --int -+static int - hns3_restore_rss_filter(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -@@ -1672,6 +1672,12 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - return ret; - } - -+int -+hns3_restore_filter(struct rte_eth_dev *dev) -+{ -+ return hns3_restore_rss_filter(dev); -+} -+ - static int - hns3_flow_parse_rss(struct rte_eth_dev *dev, - const struct hns3_rss_conf *conf, bool add) -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index 1ab3f9f5c6..0f5de129a3 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -49,5 +49,6 @@ int hns3_dev_flow_ops_get(struct rte_eth_dev *dev, - const struct rte_flow_ops **ops); - void hns3_flow_init(struct rte_eth_dev *dev); - void hns3_flow_uninit(struct rte_eth_dev *dev); -+int hns3_restore_filter(struct rte_eth_dev *dev); - - #endif /* _HNS3_FLOW_H_ */ -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 5b90d3a628..78c9eff827 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -110,6 +110,5 @@ int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key); --int hns3_restore_rss_filter(struct rte_eth_dev *dev); - - #endif /* _HNS3_RSS_H_ */ --- -2.23.0 - diff --git a/0148-net-hns3-move-flow-direction-rule-recovery.patch b/0148-net-hns3-move-flow-direction-rule-recovery.patch deleted file mode 100644 index 1428150..0000000 --- a/0148-net-hns3-move-flow-direction-rule-recovery.patch +++ /dev/null @@ -1,71 +0,0 @@ -From d982e1518b7fc217dbf14816b0b929079d742137 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:24 +0800 -Subject: [PATCH 148/189] net/hns3: move flow direction rule recovery - -The 'hns3_restore_filter' is used to restore flow rules from -rte_flow API during the reset process. This patch moves the -recovery of flow direction rule to this function to improve -code maintainability. - -Fixes: fcba820d9b9e ("net/hns3: support flow director") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 4 ---- - drivers/net/hns3/hns3_fdir.c | 3 +++ - drivers/net/hns3/hns3_flow.c | 7 +++++++ - 3 files changed, 10 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index fc3fc76a40..01c13f8d70 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5907,10 +5907,6 @@ hns3_restore_conf(struct hns3_adapter *hns) - if (ret) - goto err_promisc; - -- ret = hns3_restore_all_fdir_filter(hns); -- if (ret) -- goto err_promisc; -- - ret = hns3_restore_ptp(hns); - if (ret) - goto err_promisc; -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index 30e5e66772..48a91fb517 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -1068,6 +1068,9 @@ int hns3_restore_all_fdir_filter(struct hns3_adapter *hns) - bool err = false; - int ret; - -+ if (hns->is_vf) -+ return 0; -+ - /* - * This API is called in the reset recovery process, the parent function - * must hold hw->lock. -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 7bd2f0bf7a..17c4274123 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1675,6 +1675,13 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - int - hns3_restore_filter(struct rte_eth_dev *dev) - { -+ struct hns3_adapter *hns = dev->data->dev_private; -+ int ret; -+ -+ ret = hns3_restore_all_fdir_filter(hns); -+ if (ret != 0) -+ return ret; -+ - return hns3_restore_rss_filter(dev); - } - --- -2.23.0 - diff --git a/0149-net-hns3-fix-restore-filter-function-input.patch b/0149-net-hns3-fix-restore-filter-function-input.patch deleted file mode 100644 index 2d68011..0000000 --- a/0149-net-hns3-fix-restore-filter-function-input.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 470e1b242046d7968ce039428201cc6c9595e114 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:25 +0800 -Subject: [PATCH 149/189] net/hns3: fix restore filter function input - -This 'hns3_restore_filter' is an internal interface of driver. -Currently, it uses 'struct rte_eth_dev *dev' as input parameter, -This is inconvenient for the function to call in driver because -caller has to obtain its device address by global variable -'rte_eth_devices[]'. Fix the input of this function. - -Fixes: 920be799dbc3 ("net/hns3: fix RSS indirection table configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 3 +-- - drivers/net/hns3/hns3_ethdev_vf.c | 3 +-- - drivers/net/hns3/hns3_flow.c | 30 ++++++++++++------------------ - drivers/net/hns3/hns3_flow.h | 2 +- - 4 files changed, 15 insertions(+), 23 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 01c13f8d70..c59543ef5b 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5006,7 +5006,6 @@ static int - hns3_do_start(struct hns3_adapter *hns, bool reset_queue) - { - struct hns3_hw *hw = &hns->hw; -- struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; - bool link_en; - int ret; - -@@ -5043,7 +5042,7 @@ hns3_do_start(struct hns3_adapter *hns, bool reset_queue) - if (ret) - goto err_set_link_speed; - -- return hns3_restore_filter(dev); -+ return hns3_restore_filter(hns); - - err_set_link_speed: - (void)hns3_cfg_mac_mode(hw, false); -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 13f1cba0e6..72d60191ab 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1727,7 +1727,6 @@ static int - hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - { - struct hns3_hw *hw = &hns->hw; -- struct rte_eth_dev *dev = &rte_eth_devices[hw->data->port_id]; - uint16_t nb_rx_q = hw->data->nb_rx_queues; - uint16_t nb_tx_q = hw->data->nb_tx_queues; - int ret; -@@ -1742,7 +1741,7 @@ hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - if (ret) - hns3_err(hw, "failed to init queues, ret = %d.", ret); - -- return hns3_restore_filter(dev); -+ return hns3_restore_filter(hns); - } - - static int -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 17c4274123..2b4286d46d 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1508,11 +1508,9 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - } - - static int --hns3_update_indir_table(struct rte_eth_dev *dev, -+hns3_update_indir_table(struct hns3_hw *hw, - const struct rte_flow_action_rss *conf, uint16_t num) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; - uint16_t indir_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; - uint16_t j; - uint32_t i; -@@ -1535,11 +1533,9 @@ hns3_update_indir_table(struct rte_eth_dev *dev, - } - - static int --hns3_config_rss_filter(struct rte_eth_dev *dev, -+hns3_config_rss_filter(struct hns3_hw *hw, - const struct hns3_rss_conf *conf, bool add) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; - struct hns3_rss_conf *rss_info; - uint64_t flow_types; - uint16_t num; -@@ -1591,13 +1587,13 @@ hns3_config_rss_filter(struct rte_eth_dev *dev, - } - - /* Set rx queues to use */ -- num = RTE_MIN(dev->data->nb_rx_queues, rss_flow_conf.queue_num); -+ num = RTE_MIN(hw->data->nb_rx_queues, rss_flow_conf.queue_num); - if (rss_flow_conf.queue_num > num) - hns3_warn(hw, "Config queue numbers %u are beyond the scope of truncated", - rss_flow_conf.queue_num); - hns3_info(hw, "Max of contiguous %u PF queues are configured", num); - if (num) { -- ret = hns3_update_indir_table(dev, &rss_flow_conf, num); -+ ret = hns3_update_indir_table(hw, &rss_flow_conf, num); - if (ret) - return ret; - } -@@ -1627,7 +1623,7 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); - while (rss_filter_ptr) { - TAILQ_REMOVE(&hw->flow_rss_list, rss_filter_ptr, entries); -- ret = hns3_config_rss_filter(dev, &rss_filter_ptr->filter_info, -+ ret = hns3_config_rss_filter(hw, &rss_filter_ptr->filter_info, - false); - if (ret) - rss_rule_fail_cnt++; -@@ -1647,11 +1643,9 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - } - - static int --hns3_restore_rss_filter(struct rte_eth_dev *dev) -+hns3_restore_rss_filter(struct hns3_hw *hw) - { -- struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_rss_conf_ele *filter; -- struct hns3_hw *hw = &hns->hw; - int ret = 0; - - pthread_mutex_lock(&hw->flows_lock); -@@ -1659,7 +1653,7 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - if (!filter->filter_info.valid) - continue; - -- ret = hns3_config_rss_filter(dev, &filter->filter_info, true); -+ ret = hns3_config_rss_filter(hw, &filter->filter_info, true); - if (ret != 0) { - hns3_err(hw, "restore RSS filter failed, ret=%d", ret); - goto out; -@@ -1673,16 +1667,16 @@ hns3_restore_rss_filter(struct rte_eth_dev *dev) - } - - int --hns3_restore_filter(struct rte_eth_dev *dev) -+hns3_restore_filter(struct hns3_adapter *hns) - { -- struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = &hns->hw; - int ret; - - ret = hns3_restore_all_fdir_filter(hns); - if (ret != 0) - return ret; - -- return hns3_restore_rss_filter(dev); -+ return hns3_restore_rss_filter(hw); - } - - static int -@@ -1699,7 +1693,7 @@ hns3_flow_parse_rss(struct rte_eth_dev *dev, - return -EINVAL; - } - -- return hns3_config_rss_filter(dev, conf, add); -+ return hns3_config_rss_filter(hw, conf, add); - } - - static int -@@ -1960,7 +1954,7 @@ hns3_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, - break; - case RTE_ETH_FILTER_HASH: - rss_filter_ptr = (struct hns3_rss_conf_ele *)flow->rule; -- ret = hns3_config_rss_filter(dev, &rss_filter_ptr->filter_info, -+ ret = hns3_config_rss_filter(hw, &rss_filter_ptr->filter_info, - false); - if (ret) - return rte_flow_error_set(error, EIO, -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index 0f5de129a3..854fbb7ff0 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -49,6 +49,6 @@ int hns3_dev_flow_ops_get(struct rte_eth_dev *dev, - const struct rte_flow_ops **ops); - void hns3_flow_init(struct rte_eth_dev *dev); - void hns3_flow_uninit(struct rte_eth_dev *dev); --int hns3_restore_filter(struct rte_eth_dev *dev); -+int hns3_restore_filter(struct hns3_adapter *hns); - - #endif /* _HNS3_FLOW_H_ */ --- -2.23.0 - diff --git a/0150-net-hns3-fix-build-with-gcov.patch b/0150-net-hns3-fix-build-with-gcov.patch deleted file mode 100644 index 0218795..0000000 --- a/0150-net-hns3-fix-build-with-gcov.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0acb77e818a7a0e71126667f0624c19c2706f59c Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 21 Oct 2022 15:36:26 +0800 -Subject: [PATCH 150/189] net/hns3: fix build with gcov -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -meson build -Db_coverage=true -ninja -C build - -../drivers/net/hns3/hns3_ethdev.c:2856:22: warning: ‘cfg.umv_space’ may be -used uninitialized in this function [-Wmaybe-uninitialized] - 2856 | pf->wanted_umv_size = cfg.umv_space; - -Fix compiling warnings using gcc 10.3.1. - -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index c59543ef5b..45b5d699b4 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2808,6 +2808,7 @@ hns3_get_board_configuration(struct hns3_hw *hw) - struct hns3_cfg cfg; - int ret; - -+ memset(&cfg, 0, sizeof(cfg)); - ret = hns3_get_board_cfg(hw, &cfg); - if (ret) { - PMD_INIT_LOG(ERR, "get board config failed %d", ret); --- -2.23.0 - diff --git a/0151-net-hns3-fix-packet-type-for-GENEVE.patch b/0151-net-hns3-fix-packet-type-for-GENEVE.patch deleted file mode 100644 index c86ef9b..0000000 --- a/0151-net-hns3-fix-packet-type-for-GENEVE.patch +++ /dev/null @@ -1,44 +0,0 @@ -From c2fd801565933c744bc6342f9dad56de644d68a3 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:27 +0800 -Subject: [PATCH 151/189] net/hns3: fix packet type for GENEVE - -Currently, hns3 reports VXLAN tunnel packet type for GENEVE, -which is misleading to user. In fact, hns3 hardware cannot -distinguish between VXLAN and GENEVE packet. So this patch -uses RTE_PTYPE_TUNNEL_GRENAT packet type to report. - -Fixes: 7d6df32cf742 ("net/hns3: fix missing outer L4 UDP flag for VXLAN") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 21c3ef72b1..089caccd7f 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1995,7 +1995,7 @@ hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev) - RTE_PTYPE_INNER_L4_TCP, - RTE_PTYPE_INNER_L4_SCTP, - RTE_PTYPE_INNER_L4_ICMP, -- RTE_PTYPE_TUNNEL_VXLAN, -+ RTE_PTYPE_TUNNEL_GRENAT, - RTE_PTYPE_TUNNEL_NVGRE, - RTE_PTYPE_UNKNOWN - }; -@@ -2092,7 +2092,7 @@ hns3_init_tunnel_ptype_tbl(struct hns3_ptype_table *tbl) - tbl->ol3table[5] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT; - - tbl->ol4table[0] = RTE_PTYPE_UNKNOWN; -- tbl->ol4table[1] = RTE_PTYPE_L4_UDP | RTE_PTYPE_TUNNEL_VXLAN; -+ tbl->ol4table[1] = RTE_PTYPE_L4_UDP | RTE_PTYPE_TUNNEL_GRENAT; - tbl->ol4table[2] = RTE_PTYPE_TUNNEL_NVGRE; - } - --- -2.23.0 - diff --git a/0152-net-hns3-remove-magic-numbers-for-MAC-address.patch b/0152-net-hns3-remove-magic-numbers-for-MAC-address.patch deleted file mode 100644 index 68fd0c9..0000000 --- a/0152-net-hns3-remove-magic-numbers-for-MAC-address.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 36416b8c0fd1918ed0f89cca83b8c21e22a529c7 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 21 Oct 2022 15:36:28 +0800 -Subject: [PATCH 152/189] net/hns3: remove magic numbers for MAC address - -Removing magic numbers with macros. - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 45b5d699b4..adc47d815d 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -1713,6 +1713,7 @@ hns3_add_mc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; - uint8_t vf_id; - int ret; -+ int idx; - - /* Check if mac addr is valid */ - if (!rte_is_multicast_ether_addr(mac_addr)) { -@@ -1730,9 +1731,8 @@ hns3_add_mc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - HNS3_MC_MAC_VLAN_OPS_DESC_NUM); - if (ret) { - /* This mac addr do not exist, add new entry for it */ -- memset(desc[0].data, 0, sizeof(desc[0].data)); -- memset(desc[1].data, 0, sizeof(desc[0].data)); -- memset(desc[2].data, 0, sizeof(desc[0].data)); -+ for (idx = 0; idx < HNS3_MC_MAC_VLAN_OPS_DESC_NUM; idx++) -+ memset(desc[idx].data, 0, sizeof(desc[idx].data)); - } - - /* --- -2.23.0 - diff --git a/0153-net-hns3-fix-code-check-warnings.patch b/0153-net-hns3-fix-code-check-warnings.patch deleted file mode 100644 index 564a862..0000000 --- a/0153-net-hns3-fix-code-check-warnings.patch +++ /dev/null @@ -1,379 +0,0 @@ -From 308a29f8342797bedb8005b7061a9b10be36cc6c Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 21 Oct 2022 15:36:29 +0800 -Subject: [PATCH 153/189] net/hns3: fix code check warnings - -Fix code check warnings according to: - - function should have same name with previous declaration; - - local variable should no be referenced in macro referenced; - - macro argument 'adapter' should be enclosed in parentheses. - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 4 ++-- - drivers/net/hns3/hns3_dump.c | 4 ++-- - drivers/net/hns3/hns3_ethdev.h | 14 +++++++------- - drivers/net/hns3/hns3_flow.c | 4 ++-- - drivers/net/hns3/hns3_intr.c | 27 ++++++++++++--------------- - drivers/net/hns3/hns3_intr.h | 4 ++-- - drivers/net/hns3/hns3_regs.c | 4 ++-- - drivers/net/hns3/hns3_rss.c | 2 +- - drivers/net/hns3/hns3_rss.h | 2 +- - drivers/net/hns3/hns3_rxtx.c | 4 ++-- - drivers/net/hns3/hns3_rxtx.h | 14 +++++++++----- - drivers/net/hns3/hns3_stats.h | 5 +++-- - 12 files changed, 45 insertions(+), 43 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 7a65db907e..1a1a016aa6 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -493,7 +493,7 @@ hns3_configure_all_mac_addr(struct hns3_adapter *hns, bool del) - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - addr); -- hns3_err(hw, "failed to %s mac addr(%s) index:%d ret = %d.", -+ hns3_err(hw, "failed to %s mac addr(%s) index:%u ret = %d.", - del ? "remove" : "restore", mac_str, i, ret); - } - } -@@ -680,7 +680,7 @@ hns3_init_ring_with_vector(struct hns3_hw *hw) - ret = hw->ops.bind_ring_with_vector(hw, vec, false, - HNS3_RING_TYPE_TX, i); - if (ret) { -- PMD_INIT_LOG(ERR, "fail to unbind TX ring(%d) with vector: %u, ret=%d", -+ PMD_INIT_LOG(ERR, "fail to unbind TX ring(%u) with vector: %u, ret=%d", - i, vec, ret); - return ret; - } -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 646e93d8e6..cf5b500be1 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -342,7 +342,7 @@ static void - hns3_print_queue_state_perline(FILE *file, const uint32_t *queue_state, - uint32_t nb_queues, uint32_t line_num) - { --#define HNS3_NUM_QUEUE_PER_LINE (sizeof(*queue_state) * HNS3_UINT8_BIT) -+#define HNS3_NUM_QUEUE_PER_LINE (sizeof(uint32_t) * HNS3_UINT8_BIT) - uint32_t id = line_num * HNS3_NUM_QUEUE_PER_LINE; - uint32_t i; - -@@ -365,7 +365,7 @@ static void - hns3_display_queue_enable_state(FILE *file, const uint32_t *queue_state, - uint32_t nb_queues, bool is_rxq) - { --#define HNS3_NUM_QUEUE_PER_LINE (sizeof(*queue_state) * HNS3_UINT8_BIT) -+#define HNS3_NUM_QUEUE_PER_LINE (sizeof(uint32_t) * HNS3_UINT8_BIT) - uint32_t i; - - fprintf(file, "\t %s queue id | enable state bitMap\n", -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index eb8ca1e60f..aad779e949 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -898,11 +898,11 @@ enum hns3_dev_cap { - hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_##_name##_B) - - #define HNS3_DEV_PRIVATE_TO_HW(adapter) \ -- (&((struct hns3_adapter *)adapter)->hw) -+ (&((struct hns3_adapter *)(adapter))->hw) - #define HNS3_DEV_PRIVATE_TO_PF(adapter) \ -- (&((struct hns3_adapter *)adapter)->pf) -+ (&((struct hns3_adapter *)(adapter))->pf) - #define HNS3_DEV_PRIVATE_TO_VF(adapter) \ -- (&((struct hns3_adapter *)adapter)->vf) -+ (&((struct hns3_adapter *)(adapter))->vf) - #define HNS3_DEV_HW_TO_ADAPTER(hw) \ - container_of(hw, struct hns3_adapter, hw) - -@@ -999,10 +999,10 @@ static inline uint32_t hns3_read_reg(void *base, uint32_t reg) - - #define NEXT_ITEM_OF_ACTION(act, actions, index) \ - do { \ -- act = (actions) + (index); \ -- while (act->type == RTE_FLOW_ACTION_TYPE_VOID) { \ -+ (act) = (actions) + (index); \ -+ while ((act)->type == RTE_FLOW_ACTION_TYPE_VOID) { \ - (index)++; \ -- act = actions + index; \ -+ (act) = (actions) + (index); \ - } \ - } while (0) - -@@ -1027,7 +1027,7 @@ hns3_atomic_clear_bit(unsigned int nr, volatile uint64_t *addr) - __atomic_fetch_and(addr, ~(1UL << nr), __ATOMIC_RELAXED); - } - --static inline int64_t -+static inline uint64_t - hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr) - { - uint64_t mask = (1UL << nr); -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 2b4286d46d..1aee965e4a 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -66,7 +66,7 @@ static enum rte_flow_item_type tunnel_next_items[] = { - - struct items_step_mngr { - enum rte_flow_item_type *items; -- int count; -+ size_t count; - }; - - static inline void -@@ -1141,7 +1141,7 @@ hns3_validate_item(const struct rte_flow_item *item, - struct items_step_mngr step_mngr, - struct rte_flow_error *error) - { -- int i; -+ uint32_t i; - - if (item->last) - return rte_flow_error_set(error, ENOTSUP, -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 3ca2e1e338..4bdcd6070b 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -16,12 +16,6 @@ - - #define SWITCH_CONTEXT_US 10 - --#define HNS3_CHECK_MERGE_CNT(val) \ -- do { \ -- if (val) \ -- hw->reset.stats.merge_cnt++; \ -- } while (0) -- - static const char *reset_string[HNS3_MAX_RESET] = { - "flr", "vf_func", "vf_pf_func", "vf_full", "vf_global", - "pf_func", "global", "IMP", "none", -@@ -2525,20 +2519,20 @@ static void - hns3_clear_reset_level(struct hns3_hw *hw, uint64_t *levels) - { - uint64_t merge_cnt = hw->reset.stats.merge_cnt; -- int64_t tmp; -+ uint64_t tmp; - - switch (hw->reset.level) { - case HNS3_IMP_RESET: - hns3_atomic_clear_bit(HNS3_IMP_RESET, levels); - tmp = hns3_test_and_clear_bit(HNS3_GLOBAL_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - break; - case HNS3_GLOBAL_RESET: - hns3_atomic_clear_bit(HNS3_GLOBAL_RESET, levels); - tmp = hns3_test_and_clear_bit(HNS3_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - break; - case HNS3_FUNC_RESET: - hns3_atomic_clear_bit(HNS3_FUNC_RESET, levels); -@@ -2546,19 +2540,19 @@ hns3_clear_reset_level(struct hns3_hw *hw, uint64_t *levels) - case HNS3_VF_RESET: - hns3_atomic_clear_bit(HNS3_VF_RESET, levels); - tmp = hns3_test_and_clear_bit(HNS3_VF_PF_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - break; - case HNS3_VF_FULL_RESET: - hns3_atomic_clear_bit(HNS3_VF_FULL_RESET, levels); - tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - break; - case HNS3_VF_PF_FUNC_RESET: - hns3_atomic_clear_bit(HNS3_VF_PF_FUNC_RESET, levels); - tmp = hns3_test_and_clear_bit(HNS3_VF_FUNC_RESET, levels); -- HNS3_CHECK_MERGE_CNT(tmp); -+ merge_cnt = tmp > 0 ? merge_cnt + 1 : merge_cnt; - break; - case HNS3_VF_FUNC_RESET: - hns3_atomic_clear_bit(HNS3_VF_FUNC_RESET, levels); -@@ -2570,13 +2564,16 @@ hns3_clear_reset_level(struct hns3_hw *hw, uint64_t *levels) - default: - return; - }; -- if (merge_cnt != hw->reset.stats.merge_cnt) -+ -+ if (merge_cnt != hw->reset.stats.merge_cnt) { - hns3_warn(hw, - "No need to do low-level reset after %s reset. " - "merge cnt: %" PRIu64 " total merge cnt: %" PRIu64, - reset_string[hw->reset.level], - hw->reset.stats.merge_cnt - merge_cnt, - hw->reset.stats.merge_cnt); -+ hw->reset.stats.merge_cnt = merge_cnt; -+ } - } - - static bool -diff --git a/drivers/net/hns3/hns3_intr.h b/drivers/net/hns3/hns3_intr.h -index 1a0f196614..1490a5e387 100644 ---- a/drivers/net/hns3/hns3_intr.h -+++ b/drivers/net/hns3/hns3_intr.h -@@ -170,7 +170,7 @@ struct hns3_hw_error_desc { - const struct hns3_hw_error *hw_err; - }; - --int hns3_enable_hw_error_intr(struct hns3_adapter *hns, bool state); -+int hns3_enable_hw_error_intr(struct hns3_adapter *hns, bool en); - void hns3_handle_msix_error(struct hns3_adapter *hns, uint64_t *levels); - void hns3_handle_ras_error(struct hns3_adapter *hns, uint64_t *levels); - void hns3_config_mac_tnl_int(struct hns3_hw *hw, bool en); -@@ -185,7 +185,7 @@ void hns3_schedule_reset(struct hns3_adapter *hns); - void hns3_schedule_delayed_reset(struct hns3_adapter *hns); - int hns3_reset_req_hw_reset(struct hns3_adapter *hns); - int hns3_reset_process(struct hns3_adapter *hns, -- enum hns3_reset_level reset_level); -+ enum hns3_reset_level new_level); - void hns3_reset_abort(struct hns3_adapter *hns); - void hns3_start_report_lse(struct rte_eth_dev *dev); - void hns3_stop_report_lse(struct rte_eth_dev *dev); -diff --git a/drivers/net/hns3/hns3_regs.c b/drivers/net/hns3/hns3_regs.c -index 6778e4cfc2..33392fd1f0 100644 ---- a/drivers/net/hns3/hns3_regs.c -+++ b/drivers/net/hns3/hns3_regs.c -@@ -15,7 +15,7 @@ - #define REG_NUM_PER_LINE 4 - #define REG_LEN_PER_LINE (REG_NUM_PER_LINE * sizeof(uint32_t)) - --static int hns3_get_dfx_reg_line(struct hns3_hw *hw, uint32_t *length); -+static int hns3_get_dfx_reg_line(struct hns3_hw *hw, uint32_t *lines); - - static const uint32_t cmdq_reg_addrs[] = {HNS3_CMDQ_TX_ADDR_L_REG, - HNS3_CMDQ_TX_ADDR_H_REG, -@@ -295,7 +295,7 @@ hns3_direct_access_regs(struct hns3_hw *hw, uint32_t *data) - uint32_t *origin_data_ptr = data; - uint32_t reg_offset; - uint16_t i, j; -- int reg_num; -+ size_t reg_num; - - /* fetching per-PF registers values from PF PCIe register space */ - reg_num = sizeof(cmdq_reg_addrs) / sizeof(uint32_t); -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 1003daf03e..fc912ed2e8 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -10,7 +10,7 @@ - #include "hns3_logs.h" - - /* Default hash keys */ --const uint8_t hns3_hash_key[] = { -+const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE] = { - 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, - 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0, - 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4, -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 78c9eff827..a12f8b7034 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -88,7 +88,7 @@ static inline uint32_t roundup_pow_of_two(uint32_t x) - return 1UL << fls(x - 1); - } - --extern const uint8_t hns3_hash_key[]; -+extern const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE]; - - struct hns3_adapter; - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 089caccd7f..f7641b1309 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -2762,7 +2762,7 @@ hns3_rx_check_vec_support(__rte_unused struct rte_eth_dev *dev) - } - - uint16_t __rte_weak --hns3_recv_pkts_vec(__rte_unused void *tx_queue, -+hns3_recv_pkts_vec(__rte_unused void *rx_queue, - __rte_unused struct rte_mbuf **rx_pkts, - __rte_unused uint16_t nb_pkts) - { -@@ -2770,7 +2770,7 @@ hns3_recv_pkts_vec(__rte_unused void *tx_queue, - } - - uint16_t __rte_weak --hns3_recv_pkts_vec_sve(__rte_unused void *tx_queue, -+hns3_recv_pkts_vec_sve(__rte_unused void *rx_queue, - __rte_unused struct rte_mbuf **rx_pkts, - __rte_unused uint16_t nb_pkts) - { -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index 803e805a5b..87c7c115a1 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -691,10 +691,12 @@ int hns3_rxq_iterate(struct rte_eth_dev *dev, - int (*callback)(struct hns3_rx_queue *, void *), void *arg); - void hns3_dev_release_mbufs(struct hns3_adapter *hns); - int hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, -- unsigned int socket, const struct rte_eth_rxconf *conf, -+ unsigned int socket_id, -+ const struct rte_eth_rxconf *conf, - struct rte_mempool *mp); - int hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, -- unsigned int socket, const struct rte_eth_txconf *conf); -+ unsigned int socket_id, -+ const struct rte_eth_txconf *conf); - uint32_t hns3_rx_queue_count(void *rx_queue); - int hns3_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id); - int hns3_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id); -@@ -704,9 +706,11 @@ uint16_t hns3_recv_pkts_simple(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); - uint16_t hns3_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - uint16_t nb_pkts); --uint16_t hns3_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, -+uint16_t hns3_recv_pkts_vec(void *__restrict rx_queue, -+ struct rte_mbuf **__restrict rx_pkts, - uint16_t nb_pkts); --uint16_t hns3_recv_pkts_vec_sve(void *rx_queue, struct rte_mbuf **rx_pkts, -+uint16_t hns3_recv_pkts_vec_sve(void *__restrict rx_queue, -+ struct rte_mbuf **__restrict rx_pkts, - uint16_t nb_pkts); - int hns3_rx_burst_mode_get(struct rte_eth_dev *dev, - __rte_unused uint16_t queue_id, -@@ -754,7 +758,7 @@ void hns3_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id, - struct rte_eth_rxq_info *qinfo); - void hns3_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id, - struct rte_eth_txq_info *qinfo); --uint32_t hns3_get_tqp_reg_offset(uint16_t idx); -+uint32_t hns3_get_tqp_reg_offset(uint16_t queue_id); - int hns3_start_all_txqs(struct rte_eth_dev *dev); - int hns3_start_all_rxqs(struct rte_eth_dev *dev); - void hns3_stop_all_txqs(struct rte_eth_dev *dev); -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index b5cd6188b4..9d84072205 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -145,7 +145,8 @@ struct hns3_reset_stats; - #define HNS3_IMISSED_STATS_FIELD_OFFSET(f) \ - (offsetof(struct hns3_rx_missed_stats, f)) - --int hns3_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *rte_stats); -+int hns3_stats_get(struct rte_eth_dev *eth_dev, -+ struct rte_eth_stats *rte_stats); - int hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - unsigned int n); - int hns3_dev_xstats_reset(struct rte_eth_dev *dev); -@@ -160,7 +161,7 @@ int hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, - const uint64_t *ids, - struct rte_eth_xstat_name *xstats_names, - uint32_t size); --int hns3_stats_reset(struct rte_eth_dev *dev); -+int hns3_stats_reset(struct rte_eth_dev *eth_dev); - int hns3_stats_init(struct hns3_hw *hw); - void hns3_stats_uninit(struct hns3_hw *hw); - int hns3_query_mac_stats_reg_num(struct hns3_hw *hw); --- -2.23.0 - diff --git a/0154-net-hns3-fix-header-files-includes.patch b/0154-net-hns3-fix-header-files-includes.patch deleted file mode 100644 index 938a6dd..0000000 --- a/0154-net-hns3-fix-header-files-includes.patch +++ /dev/null @@ -1,285 +0,0 @@ -From 0dcac22b697cc9585a91793d4b632cff11391ec3 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:30 +0800 -Subject: [PATCH 154/189] net/hns3: fix header files includes - -Header files should be self contained and should not be cyclically -dependent. - -Signed-off-by: Chengwen Feng -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 3 +++ - drivers/net/hns3/hns3_common.c | 2 +- - drivers/net/hns3/hns3_dcb.h | 4 ++++ - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_fdir.h | 5 +++++ - drivers/net/hns3/hns3_flow.h | 3 +++ - drivers/net/hns3/hns3_intr.c | 2 +- - drivers/net/hns3/hns3_mbx.h | 4 ++++ - drivers/net/hns3/hns3_mp.h | 2 ++ - drivers/net/hns3/hns3_regs.h | 3 +++ - drivers/net/hns3/hns3_rss.h | 2 ++ - drivers/net/hns3/hns3_rxtx.c | 2 +- - drivers/net/hns3/hns3_rxtx.h | 9 +++++++++ - drivers/net/hns3/hns3_stats.h | 5 +++++ - drivers/net/hns3/hns3_tm.h | 2 ++ - 15 files changed, 46 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 82c999061d..bee96c1e46 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -7,6 +7,9 @@ - - #include - -+#include -+#include -+ - #define HNS3_CMDQ_TX_TIMEOUT 30000 - #define HNS3_CMDQ_CLEAR_WAIT_TIME 200 - #define HNS3_CMDQ_RX_INVLD_B 0 -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 1a1a016aa6..716cebbcec 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -7,10 +7,10 @@ - #include - #include - --#include "hns3_common.h" - #include "hns3_logs.h" - #include "hns3_regs.h" - #include "hns3_rxtx.h" -+#include "hns3_common.h" - - int - hns3_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version, -diff --git a/drivers/net/hns3/hns3_dcb.h b/drivers/net/hns3/hns3_dcb.h -index e06ec177c8..9d9e7684c1 100644 ---- a/drivers/net/hns3/hns3_dcb.h -+++ b/drivers/net/hns3/hns3_dcb.h -@@ -7,7 +7,11 @@ - - #include - -+#include -+#include -+ - #include "hns3_cmd.h" -+#include "hns3_ethdev.h" - - #define HNS3_ETHER_MAX_RATE 100000 - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index adc47d815d..7b0e8fc77d 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6,7 +6,6 @@ - #include - #include - --#include "hns3_ethdev.h" - #include "hns3_common.h" - #include "hns3_dump.h" - #include "hns3_logs.h" -@@ -16,6 +15,7 @@ - #include "hns3_dcb.h" - #include "hns3_mp.h" - #include "hns3_flow.h" -+#include "hns3_ethdev.h" - - #define HNS3_SERVICE_INTERVAL 1000000 /* us */ - #define HNS3_SERVICE_QUICK_INTERVAL 10 -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index 4d18759160..7be1c0a248 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -5,6 +5,10 @@ - #ifndef _HNS3_FDIR_H_ - #define _HNS3_FDIR_H_ - -+#include -+ -+#include -+ - struct hns3_fd_key_cfg { - uint8_t key_sel; - uint8_t inner_sipv6_word_en; -@@ -177,6 +181,7 @@ struct hns3_fdir_info { - }; - - struct hns3_adapter; -+struct hns3_hw; - - int hns3_init_fd_config(struct hns3_adapter *hns); - int hns3_fdir_filter_init(struct hns3_adapter *hns); -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index 854fbb7ff0..ec94510152 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -6,6 +6,9 @@ - #define _HNS3_FLOW_H_ - - #include -+#include -+ -+#include "hns3_rss.h" - - struct hns3_flow_counter { - LIST_ENTRY(hns3_flow_counter) next; /* Pointer to the next counter. */ -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 4bdcd6070b..57679254ee 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -10,9 +10,9 @@ - - #include "hns3_common.h" - #include "hns3_logs.h" --#include "hns3_intr.h" - #include "hns3_regs.h" - #include "hns3_rxtx.h" -+#include "hns3_intr.h" - - #define SWITCH_CONTEXT_US 10 - -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index d637bd2b23..b6ccd9ff8c 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -5,6 +5,10 @@ - #ifndef _HNS3_MBX_H_ - #define _HNS3_MBX_H_ - -+#include -+ -+#include -+ - enum HNS3_MBX_OPCODE { - HNS3_MBX_RESET = 0x01, /* (VF -> PF) assert reset */ - HNS3_MBX_ASSERTING_RESET, /* (PF -> VF) PF is asserting reset */ -diff --git a/drivers/net/hns3/hns3_mp.h b/drivers/net/hns3/hns3_mp.h -index a74221d086..230230bbfe 100644 ---- a/drivers/net/hns3/hns3_mp.h -+++ b/drivers/net/hns3/hns3_mp.h -@@ -5,6 +5,8 @@ - #ifndef _HNS3_MP_H_ - #define _HNS3_MP_H_ - -+#include -+ - /* Local data for primary or secondary process. */ - struct hns3_process_local_data { - bool init_done; /* Process action register completed flag. */ -diff --git a/drivers/net/hns3/hns3_regs.h b/drivers/net/hns3/hns3_regs.h -index 5812eb39db..2636429844 100644 ---- a/drivers/net/hns3/hns3_regs.h -+++ b/drivers/net/hns3/hns3_regs.h -@@ -5,6 +5,9 @@ - #ifndef _HNS3_REGS_H_ - #define _HNS3_REGS_H_ - -+#include -+#include -+ - /* bar registers for cmdq */ - #define HNS3_CMDQ_TX_ADDR_L_REG 0x27000 - #define HNS3_CMDQ_TX_ADDR_H_REG 0x27004 -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index a12f8b7034..ebb51b4c66 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -4,6 +4,7 @@ - - #ifndef _HNS3_RSS_H_ - #define _HNS3_RSS_H_ -+ - #include - #include - -@@ -91,6 +92,7 @@ static inline uint32_t roundup_pow_of_two(uint32_t x) - extern const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE]; - - struct hns3_adapter; -+struct hns3_hw; - - int hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - struct rte_eth_rss_conf *rss_conf); -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index f7641b1309..8ad40a49c7 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -17,10 +17,10 @@ - #endif - - #include "hns3_common.h" --#include "hns3_rxtx.h" - #include "hns3_regs.h" - #include "hns3_logs.h" - #include "hns3_mp.h" -+#include "hns3_rxtx.h" - - #define HNS3_CFG_DESC_NUM(num) ((num) / 8 - 1) - #define HNS3_RX_RING_PREFETCTH_MASK 3 -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index 87c7c115a1..f619d6d466 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -6,7 +6,16 @@ - #define _HNS3_RXTX_H_ - - #include -+ -+#include - #include -+#include -+#include -+#include -+#include -+#include -+ -+#include "hns3_ethdev.h" - - #define HNS3_MIN_RING_DESC 64 - #define HNS3_MAX_RING_DESC 32768 -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index 9d84072205..9a360f8870 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -5,6 +5,9 @@ - #ifndef _HNS3_STATS_H_ - #define _HNS3_STATS_H_ - -+#include -+#include -+ - /* TQP stats */ - struct hns3_tqp_stats { - uint64_t rcb_tx_ring_pktnum_rcd; /* Total num of transmitted packets */ -@@ -145,6 +148,8 @@ struct hns3_reset_stats; - #define HNS3_IMISSED_STATS_FIELD_OFFSET(f) \ - (offsetof(struct hns3_rx_missed_stats, f)) - -+struct hns3_hw; -+ - int hns3_stats_get(struct rte_eth_dev *eth_dev, - struct rte_eth_stats *rte_stats); - int hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, -diff --git a/drivers/net/hns3/hns3_tm.h b/drivers/net/hns3/hns3_tm.h -index 83e9cc8ba9..47345eeed1 100644 ---- a/drivers/net/hns3/hns3_tm.h -+++ b/drivers/net/hns3/hns3_tm.h -@@ -105,6 +105,8 @@ hns3_tm_calc_node_tc_no(struct hns3_tm_conf *conf, uint32_t node_id) - return 0; - } - -+struct hns3_hw; -+ - void hns3_tm_conf_init(struct rte_eth_dev *dev); - void hns3_tm_conf_uninit(struct rte_eth_dev *dev); - int hns3_tm_ops_get(struct rte_eth_dev *dev __rte_unused, void *arg); --- -2.23.0 - diff --git a/0155-net-hns3-remove-unused-structures.patch b/0155-net-hns3-remove-unused-structures.patch deleted file mode 100644 index 17a1646..0000000 --- a/0155-net-hns3-remove-unused-structures.patch +++ /dev/null @@ -1,67 +0,0 @@ -From b099debb4a0b3d33ef2c8f5defbaba29c775657b Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:31 +0800 -Subject: [PATCH 155/189] net/hns3: remove unused structures - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 19 ------------------- - drivers/net/hns3/hns3_rss.h | 4 ---- - 2 files changed, 23 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index bee96c1e46..902638ba99 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -59,11 +59,6 @@ enum hns3_cmd_return_status { - HNS3_CMD_ROH_CHECK_FAIL = 12 - }; - --struct hns3_misc_vector { -- uint8_t *addr; -- int vector_irq; --}; -- - struct hns3_cmq { - struct hns3_cmq_ring csq; - struct hns3_cmq_ring crq; -@@ -397,20 +392,6 @@ struct hns3_pkt_buf_alloc { - struct hns3_shared_buf s_buf; - }; - --#define HNS3_RX_COM_WL_EN_B 15 --struct hns3_rx_com_wl_buf_cmd { -- uint16_t high_wl; -- uint16_t low_wl; -- uint8_t rsv[20]; --}; -- --#define HNS3_RX_PKT_EN_B 15 --struct hns3_rx_pkt_buf_cmd { -- uint16_t high_pkt; -- uint16_t low_pkt; -- uint8_t rsv[20]; --}; -- - #define HNS3_PF_STATE_DONE_B 0 - #define HNS3_PF_STATE_MAIN_B 1 - #define HNS3_PF_STATE_BOND_B 2 -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index ebb51b4c66..0d24436cbe 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -34,10 +34,6 @@ - #define HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP 2 - #define HNS3_RSS_HASH_ALGO_MASK 0xf - --struct hns3_rss_tuple_cfg { -- uint64_t rss_tuple_fields; --}; -- - #define HNS3_RSS_QUEUES_BUFFER_NUM 64 /* Same as the Max rx/tx queue num */ - struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ --- -2.23.0 - diff --git a/0156-net-hns3-rename-header-guards.patch b/0156-net-hns3-rename-header-guards.patch deleted file mode 100644 index 28e0a6c..0000000 --- a/0156-net-hns3-rename-header-guards.patch +++ /dev/null @@ -1,410 +0,0 @@ -From 73da6c3b6da30cc03c4a36f0d71d4ffd220f4026 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:32 +0800 -Subject: [PATCH 156/189] net/hns3: rename header guards - -Currently, the hns3 driver uses _HNS3_XXX conditional compilation -macros to prevent duplicate header files. But in the C11 standard, all -identifiers starting with an underscore plus an uppercase letter are -always reserved. So this patch fixes it. - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 6 +++--- - drivers/net/hns3/hns3_common.h | 6 +++--- - drivers/net/hns3/hns3_dcb.h | 6 +++--- - drivers/net/hns3/hns3_dump.h | 6 +++--- - drivers/net/hns3/hns3_ethdev.h | 6 +++--- - drivers/net/hns3/hns3_fdir.h | 6 +++--- - drivers/net/hns3/hns3_flow.h | 6 +++--- - drivers/net/hns3/hns3_intr.h | 6 +++--- - drivers/net/hns3/hns3_logs.h | 6 +++--- - drivers/net/hns3/hns3_mbx.h | 6 +++--- - drivers/net/hns3/hns3_mp.h | 6 +++--- - drivers/net/hns3/hns3_regs.h | 6 +++--- - drivers/net/hns3/hns3_rss.h | 6 +++--- - drivers/net/hns3/hns3_rxtx.h | 6 +++--- - drivers/net/hns3/hns3_rxtx_vec.h | 6 +++--- - drivers/net/hns3/hns3_rxtx_vec_neon.h | 6 +++--- - drivers/net/hns3/hns3_stats.h | 6 +++--- - drivers/net/hns3/hns3_tm.h | 6 +++--- - 18 files changed, 54 insertions(+), 54 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 902638ba99..8ac8b45819 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_CMD_H_ --#define _HNS3_CMD_H_ -+#ifndef HNS3_CMD_H -+#define HNS3_CMD_H - - #include - -@@ -1038,4 +1038,4 @@ int hns3_cmd_init(struct hns3_hw *hw); - void hns3_cmd_destroy_queue(struct hns3_hw *hw); - void hns3_cmd_uninit(struct hns3_hw *hw); - --#endif /* _HNS3_CMD_H_ */ -+#endif /* HNS3_CMD_H */ -diff --git a/drivers/net/hns3/hns3_common.h b/drivers/net/hns3/hns3_common.h -index 2994e4a269..5aa001f0cc 100644 ---- a/drivers/net/hns3/hns3_common.h -+++ b/drivers/net/hns3/hns3_common.h -@@ -2,8 +2,8 @@ - * Copyright(C) 2021 HiSilicon Limited - */ - --#ifndef _HNS3_COMMON_H_ --#define _HNS3_COMMON_H_ -+#ifndef HNS3_COMMON_H -+#define HNS3_COMMON_H - - #include - -@@ -61,4 +61,4 @@ int hns3_restore_rx_interrupt(struct hns3_hw *hw); - - int hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id); - --#endif /* _HNS3_COMMON_H_ */ -+#endif /* HNS3_COMMON_H */ -diff --git a/drivers/net/hns3/hns3_dcb.h b/drivers/net/hns3/hns3_dcb.h -index 9d9e7684c1..d5bb5edf4d 100644 ---- a/drivers/net/hns3/hns3_dcb.h -+++ b/drivers/net/hns3/hns3_dcb.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_DCB_H_ --#define _HNS3_DCB_H_ -+#ifndef HNS3_DCB_H -+#define HNS3_DCB_H - - #include - -@@ -215,4 +215,4 @@ int hns3_update_queue_map_configure(struct hns3_adapter *hns); - int hns3_port_shaper_update(struct hns3_hw *hw, uint32_t speed); - uint8_t hns3_txq_mapped_tc_get(struct hns3_hw *hw, uint16_t txq_no); - --#endif /* _HNS3_DCB_H_ */ -+#endif /* HNS3_DCB_H */ -diff --git a/drivers/net/hns3/hns3_dump.h b/drivers/net/hns3/hns3_dump.h -index 8ba7ee866a..616cb70d6e 100644 ---- a/drivers/net/hns3/hns3_dump.h -+++ b/drivers/net/hns3/hns3_dump.h -@@ -2,9 +2,9 @@ - * Copyright(C) 2022 HiSilicon Limited - */ - --#ifndef _HNS3_DUMP_H_ --#define _HNS3_DUMP_H_ -+#ifndef HNS3_DUMP_H -+#define HNS3_DUMP_H - - int hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file); - --#endif /* _HNS3_DUMP_H_ */ -+#endif /* HNS3_DUMP_H */ -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index aad779e949..40476bf882 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_ETHDEV_H_ --#define _HNS3_ETHDEV_H_ -+#ifndef HNS3_ETHDEV_H -+#define HNS3_ETHDEV_H - - #include - #include -@@ -1074,4 +1074,4 @@ is_reset_pending(struct hns3_adapter *hns) - return ret; - } - --#endif /* _HNS3_ETHDEV_H_ */ -+#endif /* HNS3_ETHDEV_H */ -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index 7be1c0a248..de2422e12f 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_FDIR_H_ --#define _HNS3_FDIR_H_ -+#ifndef HNS3_FDIR_H -+#define HNS3_FDIR_H - - #include - -@@ -192,4 +192,4 @@ int hns3_clear_all_fdir_filter(struct hns3_adapter *hns); - int hns3_fd_get_count(struct hns3_hw *hw, uint32_t id, uint64_t *value); - int hns3_restore_all_fdir_filter(struct hns3_adapter *hns); - --#endif /* _HNS3_FDIR_H_ */ -+#endif /* HNS3_FDIR_H */ -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index ec94510152..e4b2fdf2e6 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -2,8 +2,8 @@ - * Copyright(C) 2021 HiSilicon Limited - */ - --#ifndef _HNS3_FLOW_H_ --#define _HNS3_FLOW_H_ -+#ifndef HNS3_FLOW_H -+#define HNS3_FLOW_H - - #include - #include -@@ -54,4 +54,4 @@ void hns3_flow_init(struct rte_eth_dev *dev); - void hns3_flow_uninit(struct rte_eth_dev *dev); - int hns3_restore_filter(struct hns3_adapter *hns); - --#endif /* _HNS3_FLOW_H_ */ -+#endif /* HNS3_FLOW_H */ -diff --git a/drivers/net/hns3/hns3_intr.h b/drivers/net/hns3/hns3_intr.h -index 1490a5e387..aca1c0722c 100644 ---- a/drivers/net/hns3/hns3_intr.h -+++ b/drivers/net/hns3/hns3_intr.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_INTR_H_ --#define _HNS3_INTR_H_ -+#ifndef HNS3_INTR_H -+#define HNS3_INTR_H - - #include - -@@ -190,4 +190,4 @@ void hns3_reset_abort(struct hns3_adapter *hns); - void hns3_start_report_lse(struct rte_eth_dev *dev); - void hns3_stop_report_lse(struct rte_eth_dev *dev); - --#endif /* _HNS3_INTR_H_ */ -+#endif /* HNS3_INTR_H */ -diff --git a/drivers/net/hns3/hns3_logs.h b/drivers/net/hns3/hns3_logs.h -index 072a53bd69..c880f752ab 100644 ---- a/drivers/net/hns3/hns3_logs.h -+++ b/drivers/net/hns3/hns3_logs.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_LOGS_H_ --#define _HNS3_LOGS_H_ -+#ifndef HNS3_LOGS_H -+#define HNS3_LOGS_H - - extern int hns3_logtype_init; - #define PMD_INIT_LOG(level, fmt, args...) \ -@@ -31,4 +31,4 @@ extern int hns3_logtype_driver; - #define hns3_dbg(hw, fmt, args...) \ - PMD_DRV_LOG_RAW(hw, RTE_LOG_DEBUG, fmt "\n", ## args) - --#endif /* _HNS3_LOGS_H_ */ -+#endif /* HNS3_LOGS_H */ -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index b6ccd9ff8c..c71f43238c 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_MBX_H_ --#define _HNS3_MBX_H_ -+#ifndef HNS3_MBX_H -+#define HNS3_MBX_H - - #include - -@@ -172,4 +172,4 @@ void hns3_dev_handle_mbx_msg(struct hns3_hw *hw); - int hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - const uint8_t *msg_data, uint8_t msg_len, bool need_resp, - uint8_t *resp_data, uint16_t resp_len); --#endif /* _HNS3_MBX_H_ */ -+#endif /* HNS3_MBX_H */ -diff --git a/drivers/net/hns3/hns3_mp.h b/drivers/net/hns3/hns3_mp.h -index 230230bbfe..5dc32a41d4 100644 ---- a/drivers/net/hns3/hns3_mp.h -+++ b/drivers/net/hns3/hns3_mp.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_MP_H_ --#define _HNS3_MP_H_ -+#ifndef HNS3_MP_H -+#define HNS3_MP_H - - #include - -@@ -21,4 +21,4 @@ void hns3_mp_req_stop_tx(struct rte_eth_dev *dev); - int hns3_mp_init(struct rte_eth_dev *dev); - void hns3_mp_uninit(struct rte_eth_dev *dev); - --#endif /* _HNS3_MP_H_ */ -+#endif /* HNS3_MP_H */ -diff --git a/drivers/net/hns3/hns3_regs.h b/drivers/net/hns3/hns3_regs.h -index 2636429844..459bbaf773 100644 ---- a/drivers/net/hns3/hns3_regs.h -+++ b/drivers/net/hns3/hns3_regs.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_REGS_H_ --#define _HNS3_REGS_H_ -+#ifndef HNS3_REGS_H -+#define HNS3_REGS_H - - #include - #include -@@ -153,4 +153,4 @@ - #define HNS3_RL_USEC_TO_REG(rl_usec) ((rl_usec) >> 2) - - int hns3_get_regs(struct rte_eth_dev *eth_dev, struct rte_dev_reg_info *regs); --#endif /* _HNS3_REGS_H_ */ -+#endif /* HNS3_REGS_H */ -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 0d24436cbe..5c288c8bb2 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_RSS_H_ --#define _HNS3_RSS_H_ -+#ifndef HNS3_RSS_H -+#define HNS3_RSS_H - - #include - #include -@@ -109,4 +109,4 @@ void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key); - --#endif /* _HNS3_RSS_H_ */ -+#endif /* HNS3_RSS_H */ -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index f619d6d466..ed40621b3a 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_RXTX_H_ --#define _HNS3_RXTX_H_ -+#ifndef HNS3_RXTX_H -+#define HNS3_RXTX_H - - #include - -@@ -780,4 +780,4 @@ void hns3_tx_push_init(struct rte_eth_dev *dev); - void hns3_stop_tx_datapath(struct rte_eth_dev *dev); - void hns3_start_tx_datapath(struct rte_eth_dev *dev); - --#endif /* _HNS3_RXTX_H_ */ -+#endif /* HNS3_RXTX_H */ -diff --git a/drivers/net/hns3/hns3_rxtx_vec.h b/drivers/net/hns3/hns3_rxtx_vec.h -index d13f18627d..2c8a91921e 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.h -+++ b/drivers/net/hns3/hns3_rxtx_vec.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2020-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_RXTX_VEC_H_ --#define _HNS3_RXTX_VEC_H_ -+#ifndef HNS3_RXTX_VEC_H -+#define HNS3_RXTX_VEC_H - - #include "hns3_rxtx.h" - #include "hns3_ethdev.h" -@@ -94,4 +94,4 @@ hns3_rx_reassemble_pkts(struct rte_mbuf **rx_pkts, - - return count; - } --#endif /* _HNS3_RXTX_VEC_H_ */ -+#endif /* HNS3_RXTX_VEC_H */ -diff --git a/drivers/net/hns3/hns3_rxtx_vec_neon.h b/drivers/net/hns3/hns3_rxtx_vec_neon.h -index 0edd4756f1..55d9bf817d 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_neon.h -+++ b/drivers/net/hns3/hns3_rxtx_vec_neon.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2020-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_RXTX_VEC_NEON_H_ --#define _HNS3_RXTX_VEC_NEON_H_ -+#ifndef HNS3_RXTX_VEC_NEON_H -+#define HNS3_RXTX_VEC_NEON_H - - #include - -@@ -299,4 +299,4 @@ hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, - - return nb_rx; - } --#endif /* _HNS3_RXTX_VEC_NEON_H_ */ -+#endif /* HNS3_RXTX_VEC_NEON_H */ -diff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h -index 9a360f8870..74bc4173cc 100644 ---- a/drivers/net/hns3/hns3_stats.h -+++ b/drivers/net/hns3/hns3_stats.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2018-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_STATS_H_ --#define _HNS3_STATS_H_ -+#ifndef HNS3_STATS_H -+#define HNS3_STATS_H - - #include - #include -@@ -172,4 +172,4 @@ void hns3_stats_uninit(struct hns3_hw *hw); - int hns3_query_mac_stats_reg_num(struct hns3_hw *hw); - void hns3_update_hw_stats(struct hns3_hw *hw); - --#endif /* _HNS3_STATS_H_ */ -+#endif /* HNS3_STATS_H */ -diff --git a/drivers/net/hns3/hns3_tm.h b/drivers/net/hns3/hns3_tm.h -index 47345eeed1..0cac1a5bb2 100644 ---- a/drivers/net/hns3/hns3_tm.h -+++ b/drivers/net/hns3/hns3_tm.h -@@ -2,8 +2,8 @@ - * Copyright(c) 2020-2021 HiSilicon Limited. - */ - --#ifndef _HNS3_TM_H_ --#define _HNS3_TM_H_ -+#ifndef HNS3_TM_H -+#define HNS3_TM_H - - #include - #include -@@ -114,4 +114,4 @@ void hns3_tm_dev_start_proc(struct hns3_hw *hw); - void hns3_tm_dev_stop_proc(struct hns3_hw *hw); - int hns3_tm_conf_update(struct hns3_hw *hw); - --#endif /* _HNS3_TM_H */ -+#endif /* HNS3_TM_H */ --- -2.23.0 - diff --git a/0157-net-hns3-fix-IPv4-and-IPv6-RSS.patch b/0157-net-hns3-fix-IPv4-and-IPv6-RSS.patch deleted file mode 100644 index ed89f25..0000000 --- a/0157-net-hns3-fix-IPv4-and-IPv6-RSS.patch +++ /dev/null @@ -1,87 +0,0 @@ -From e11bff8abbbe9cacc59fa64d3d2046b150c45a6d Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:33 +0800 -Subject: [PATCH 157/189] net/hns3: fix IPv4 and IPv6 RSS - -Currently, hns3 driver use 'ipv4-other' and 'ipv6-other' as the flag -of IP packets to judge if enable RSS tuple field. But user may use -'RTE_ETH_RSS_IPV4' or 'RTE_ETH_RSS_IPV6' as the flag. So this patch -adds the processing of these macros. - -Fixes: 806f1d5ab0e3 ("net/hns3: set RSS hash type input configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 14 ++++++++++++++ - drivers/net/hns3/hns3_rss.h | 2 ++ - 2 files changed, 16 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index fc912ed2e8..e7e114727f 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -102,6 +102,10 @@ static const struct { - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_DST_ONLY, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) }, -+ { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -@@ -134,6 +138,10 @@ static const struct { - BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY, - BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) }, -+ { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -@@ -159,6 +167,9 @@ static const struct { - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) }, -+ { RTE_ETH_RSS_IPV4, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -@@ -177,6 +188,9 @@ static const struct { - BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) | - BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, -+ { RTE_ETH_RSS_IPV6, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) } -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 5c288c8bb2..9471e7039d 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -9,11 +9,13 @@ - #include - - #define HNS3_ETH_RSS_SUPPORT ( \ -+ RTE_ETH_RSS_IPV4 | \ - RTE_ETH_RSS_FRAG_IPV4 | \ - RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ - RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ - RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \ - RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \ -+ RTE_ETH_RSS_IPV6 | \ - RTE_ETH_RSS_FRAG_IPV6 | \ - RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ - RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ --- -2.23.0 - diff --git a/0158-net-hns3-fix-types-in-IPv6-SCTP-fields.patch b/0158-net-hns3-fix-types-in-IPv6-SCTP-fields.patch deleted file mode 100644 index 7229a33..0000000 --- a/0158-net-hns3-fix-types-in-IPv6-SCTP-fields.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 3907f30765bd5ca0d973c0b828de210b3d87713a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:34 +0800 -Subject: [PATCH 158/189] net/hns3: fix types in IPv6 SCTP fields - -Fix spelling errors about IPV6-SCTP macro. - -Fixes: 1bc633c34008 ("net/hns3: enable RSS for IPv6-SCTP dst/src port fields") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index e7e114727f..6d71ee94a9 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -57,8 +57,8 @@ enum hns3_tuple_field { - HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S, - - /* IPV6_SCTP ENABLE FIELD */ -- HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D = 48, -- HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D = 48, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S, - HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D, - HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S, - HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER, -@@ -135,9 +135,9 @@ static const struct { - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_DST_ONLY, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, -- BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY, -- BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) }, - { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, - { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, -@@ -185,8 +185,8 @@ static const struct { - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) | -- BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, - { RTE_ETH_RSS_IPV6, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | --- -2.23.0 - diff --git a/0159-net-hns3-fix-IPv4-RSS.patch b/0159-net-hns3-fix-IPv4-RSS.patch deleted file mode 100644 index 4654d2d..0000000 --- a/0159-net-hns3-fix-IPv4-RSS.patch +++ /dev/null @@ -1,380 +0,0 @@ -From c300374b7ef19f05acaa6501093610fbe25bc187 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:35 +0800 -Subject: [PATCH 159/189] net/hns3: fix IPv4 RSS - -When user only use 'ipv4' to set 'rss_hf', hns3 will enable -all tuple fields for 'ipv4' flow. But if user use 'ipv4-tcp' -, 'ipv4' and 'l4-src-only' to set 'rss_hf', driver does not -enable all tuple fields for 'ipv4' flow. - -Fixes: 806f1d5ab0e3 ("net/hns3: set RSS hash type input configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 266 ++++++++++++++++++++++++------------ - 1 file changed, 176 insertions(+), 90 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 6d71ee94a9..ea745c791f 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -70,130 +70,209 @@ enum hns3_tuple_field { - HNS3_RSS_FIELD_IPV6_FRAG_IP_S - }; - -+enum hns3_rss_tuple_type { -+ HNS3_RSS_IP_TUPLE, -+ HNS3_RSS_IP_L4_TUPLE, -+}; -+ - static const struct { - uint64_t rss_types; -+ uint16_t tuple_type; - uint64_t rss_field; - } hns3_set_tuple_table[] = { -+ /* IPV4-FRAG */ - { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) }, - { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, -+ { RTE_ETH_RSS_FRAG_IPV4, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, -+ -+ /* IPV4 */ -+ { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ { RTE_ETH_RSS_IPV4, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ -+ /* IPV4-OTHER */ -+ { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV4_OTHER, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ -+ /* IPV4-TCP */ - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV4_TCP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -+ -+ /* IPV4-UDP */ - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV4_UDP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, -+ -+ /* IPV4-SCTP */ - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) }, -- { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -- { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV4_SCTP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) }, -+ -+ /* IPV6-FRAG */ - { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) }, - { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, -+ { RTE_ETH_RSS_FRAG_IPV6, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, -+ -+ /* IPV6 */ -+ { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ { RTE_ETH_RSS_IPV6, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ -+ /* IPV6-OTHER */ -+ { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -+ { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV6_OTHER, -+ HNS3_RSS_IP_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ -+ /* IPV6-TCP */ - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV6_TCP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, -+ -+ /* IPV6-UDP */ - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, -+ { RTE_ETH_RSS_NONFRAG_IPV6_UDP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, -+ -+ /* IPV6-SCTP */ - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY, -+ HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) }, -- { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -- { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, --}; -- --static const struct { -- uint64_t rss_types; -- uint64_t rss_field; --} hns3_set_rss_types[] = { -- { RTE_ETH_RSS_FRAG_IPV4, BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_TCP, BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_UDP, BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_SCTP, BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) }, -- { RTE_ETH_RSS_IPV4, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV4_OTHER, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -- { RTE_ETH_RSS_FRAG_IPV6, BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_TCP, BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_UDP, BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | -+ { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, -+ HNS3_RSS_IP_L4_TUPLE, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, -- { RTE_ETH_RSS_IPV6, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -- { RTE_ETH_RSS_NONFRAG_IPV6_OTHER, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) } - }; - - /* -@@ -321,46 +400,53 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw) - return ret; - } - -+static uint64_t -+hns3_rss_calc_tuple_filed(uint64_t rss_hf) -+{ -+ uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY | -+ RTE_ETH_RSS_L3_DST_ONLY; -+ uint64_t l4_only_mask = RTE_ETH_RSS_L4_SRC_ONLY | -+ RTE_ETH_RSS_L4_DST_ONLY; -+ uint64_t l3_l4_only_mask = l3_only_mask | l4_only_mask; -+ bool has_l3_l4_only = !!(rss_hf & l3_l4_only_mask); -+ bool has_l3_only = !!(rss_hf & l3_only_mask); -+ uint64_t tuple = 0; -+ uint32_t i; -+ -+ for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) { -+ if ((rss_hf & hns3_set_tuple_table[i].rss_types) != -+ hns3_set_tuple_table[i].rss_types) -+ continue; -+ -+ if (hns3_set_tuple_table[i].tuple_type == HNS3_RSS_IP_TUPLE) { -+ if (hns3_set_tuple_table[i].rss_types & l3_only_mask || -+ !has_l3_only) -+ tuple |= hns3_set_tuple_table[i].rss_field; -+ continue; -+ } -+ -+ /* For IP types with L4, we need check both L3 and L4 */ -+ if (hns3_set_tuple_table[i].rss_types & l3_l4_only_mask || -+ !has_l3_l4_only) -+ tuple |= hns3_set_tuple_table[i].rss_field; -+ } -+ -+ return tuple; -+} -+ - int - hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) - { - struct hns3_rss_input_tuple_cmd *req; - struct hns3_cmd_desc desc; -- uint32_t fields_count = 0; /* count times for setting tuple fields */ -- uint32_t i; -+ uint64_t tuple_field; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); -- - req = (struct hns3_rss_input_tuple_cmd *)desc.data; - -- for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) { -- if ((rss_hf & hns3_set_tuple_table[i].rss_types) == -- hns3_set_tuple_table[i].rss_types) { -- req->tuple_field |= -- rte_cpu_to_le_64(hns3_set_tuple_table[i].rss_field); -- fields_count++; -- } -- } -- -- /* -- * When user does not specify the following types or a combination of -- * the following types, it enables all fields for the supported RSS -- * types. the following types as: -- * - RTE_ETH_RSS_L3_SRC_ONLY -- * - RTE_ETH_RSS_L3_DST_ONLY -- * - RTE_ETH_RSS_L4_SRC_ONLY -- * - RTE_ETH_RSS_L4_DST_ONLY -- */ -- if (fields_count == 0) { -- for (i = 0; i < RTE_DIM(hns3_set_rss_types); i++) { -- if ((rss_hf & hns3_set_rss_types[i].rss_types) == -- hns3_set_rss_types[i].rss_types) -- req->tuple_field |= rte_cpu_to_le_64( -- hns3_set_rss_types[i].rss_field); -- } -- } -- -+ tuple_field = hns3_rss_calc_tuple_filed(rss_hf); -+ req->tuple_field = rte_cpu_to_le_64(tuple_field); - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { - hns3_err(hw, "Update RSS flow types tuples failed %d", ret); --- -2.23.0 - diff --git a/0160-net-hns3-add-check-for-L3-and-L4-type.patch b/0160-net-hns3-add-check-for-L3-and-L4-type.patch deleted file mode 100644 index 0c54982..0000000 --- a/0160-net-hns3-add-check-for-L3-and-L4-type.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 3406502c1af41be568561d74b39417dd2a3a771a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:36 +0800 -Subject: [PATCH 160/189] net/hns3: add check for L3 and L4 type - -When user set 'L3_SRC/DST_ONLY' or 'L4_SRC/DST_ONLY' to 'rss_hf' and -do not specify the packet type, these types will be not set to hardware. -So this patch adds a check for them. - -Fixes: 806f1d5ab0e3 ("net/hns3: set RSS hash type input configuration") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li ---- - drivers/net/hns3/hns3_rss.c | 31 +++++++++++++++++++++++++++++-- - 1 file changed, 29 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index ea745c791f..ca5a129234 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -400,8 +400,34 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw) - return ret; - } - -+static void -+hns3_rss_check_l3l4_types(struct hns3_hw *hw, uint64_t rss_hf) -+{ -+ uint64_t ip_mask = RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | -+ RTE_ETH_RSS_NONFRAG_IPV4_OTHER | -+ RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | -+ RTE_ETH_RSS_NONFRAG_IPV6_OTHER; -+ uint64_t l4_mask = RTE_ETH_RSS_NONFRAG_IPV4_TCP | -+ RTE_ETH_RSS_NONFRAG_IPV4_UDP | -+ RTE_ETH_RSS_NONFRAG_IPV4_SCTP | -+ RTE_ETH_RSS_NONFRAG_IPV6_TCP | -+ RTE_ETH_RSS_NONFRAG_IPV6_UDP | -+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP; -+ uint64_t l3_src_dst_mask = RTE_ETH_RSS_L3_SRC_ONLY | -+ RTE_ETH_RSS_L3_DST_ONLY; -+ uint64_t l4_src_dst_mask = RTE_ETH_RSS_L4_SRC_ONLY | -+ RTE_ETH_RSS_L4_DST_ONLY; -+ -+ if (rss_hf & l3_src_dst_mask && -+ !(rss_hf & ip_mask || rss_hf & l4_mask)) -+ hns3_warn(hw, "packet type isn't specified, L3_SRC/DST_ONLY is ignored."); -+ -+ if (rss_hf & l4_src_dst_mask && !(rss_hf & l4_mask)) -+ hns3_warn(hw, "packet type isn't specified, L4_SRC/DST_ONLY is ignored."); -+} -+ - static uint64_t --hns3_rss_calc_tuple_filed(uint64_t rss_hf) -+hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) - { - uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY | - RTE_ETH_RSS_L3_DST_ONLY; -@@ -430,6 +456,7 @@ hns3_rss_calc_tuple_filed(uint64_t rss_hf) - !has_l3_l4_only) - tuple |= hns3_set_tuple_table[i].rss_field; - } -+ hns3_rss_check_l3l4_types(hw, rss_hf); - - return tuple; - } -@@ -445,7 +472,7 @@ hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); - req = (struct hns3_rss_input_tuple_cmd *)desc.data; - -- tuple_field = hns3_rss_calc_tuple_filed(rss_hf); -+ tuple_field = hns3_rss_calc_tuple_filed(hw, rss_hf); - req->tuple_field = rte_cpu_to_le_64(tuple_field); - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { --- -2.23.0 - diff --git a/0161-net-hns3-revert-fix-mailbox-communication-with-HW.patch b/0161-net-hns3-revert-fix-mailbox-communication-with-HW.patch deleted file mode 100644 index a33b40c..0000000 --- a/0161-net-hns3-revert-fix-mailbox-communication-with-HW.patch +++ /dev/null @@ -1,58 +0,0 @@ -From e438ad9ab2897ec33b94ee5f31bd1b2fbfc4e36e Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:37 +0800 -Subject: [PATCH 161/189] net/hns3: revert fix mailbox communication with HW - -VF's command receive queue was mainly used to receive mailbox messages -from PF. There are two type mailbox messages: request response message -and message pushed by PF. - -There are two types of threads that can handle these messages: -1) the interrupt thread of the main process: it could handle both types -of messages. -2) other threads: it could only handle request response messages. - -The collaboration mechanism between the two type threads is that other -threads set the opcode of processed messages to zero so that the -interrupt thread of the main process does not process these messages -again. Because other threads can only process part of the messages, -after the processing is complete, the next-to-use pointer of the -command receive queue should not be updated. Otherwise, some messages -(e.g. messages pushed by PF) maybe discarded. - -Unfortunately, the patch to be reverted updates next-to-use pointer of -the command receive queue in other threads context, and this will lead -to discard some mailbox message. - -So this commit reverts -commit 599ef84add7e ("net/hns3: fix mailbox communication with HW") - -Fixes: 599ef84add7e ("net/hns3: fix mailbox communication with HW") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_mbx.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index b3563d4694..2de55a6417 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -436,8 +436,10 @@ hns3_handle_mbx_msg_out_intr(struct hns3_hw *hw) - next_to_use = (next_to_use + 1) % hw->cmq.crq.desc_num; - } - -- crq->next_to_use = next_to_use; -- hns3_write_dev(hw, HNS3_CMDQ_RX_HEAD_REG, crq->next_to_use); -+ /* -+ * Note: the crq->next_to_use field should not updated, otherwise, -+ * mailbox messages may be discarded. -+ */ - } - - void --- -2.23.0 - diff --git a/0162-net-hns3-fix-VF-mailbox-message-handling.patch b/0162-net-hns3-fix-VF-mailbox-message-handling.patch deleted file mode 100644 index b018883..0000000 --- a/0162-net-hns3-fix-VF-mailbox-message-handling.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 33814ad89cd618df8c596f7b138150cd4b71a8c3 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:38 +0800 -Subject: [PATCH 162/189] net/hns3: fix VF mailbox message handling - -VF's command receive queue was mainly used to receive mailbox messages -from PF. There are two type mailbox messages: request response message -and message pushed by PF. - -There are two types of threads that can handle these messages: -1) the interrupt thread of the main process: it could handle both types -of messages. -2) other threads: it could only handle request response messages. - -The collaboration mechanism between the two type threads is that other -threads set the opcode of processed messages to zero so that the -interrupt thread of the main process does not process these messages -again. - -Unfortunately, the other threads mark the message pointed to by the -crq->next-to-use variable which is fixed in the loop, not the message -pointed to by the next-to-use variable. - -Fixes: dbbbad23e380 ("net/hns3: fix VF handling LSC event in secondary process") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_mbx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index 2de55a6417..9a05f0d1ee 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -429,7 +429,7 @@ hns3_handle_mbx_msg_out_intr(struct hns3_hw *hw) - * Clear opcode to inform intr thread don't process - * again. - */ -- crq->desc[crq->next_to_use].opcode = 0; -+ crq->desc[next_to_use].opcode = 0; - } - - scan_next: --- -2.23.0 - diff --git a/0163-net-hns3-fix-minimum-Tx-frame-length.patch b/0163-net-hns3-fix-minimum-Tx-frame-length.patch deleted file mode 100644 index af4c901..0000000 --- a/0163-net-hns3-fix-minimum-Tx-frame-length.patch +++ /dev/null @@ -1,123 +0,0 @@ -From ac646ee28e8c9780d02ec685b7581486c13f6961 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 21 Oct 2022 15:36:39 +0800 -Subject: [PATCH 163/189] net/hns3: fix minimum Tx frame length - -When packet length in Tx is less than length hardware supported, -the minimum frame length in hns3 is used to do padding to avoid -hardware error. Currently, this length is fixed by macro, which -is very unfavorable for subsequent hardware evolution. So fix it -as firmware report. - -Fixes: 395b5e08ef8d ("net/hns3: add Tx short frame padding compatibility") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 6 ++++++ - drivers/net/hns3/hns3_ethdev.c | 4 +++- - drivers/net/hns3/hns3_ethdev.h | 3 +-- - drivers/net/hns3/hns3_ethdev_vf.c | 4 +++- - 4 files changed, 13 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 8ac8b45819..994dfc48cc 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -967,6 +967,12 @@ struct hns3_dev_specs_0_cmd { - uint32_t max_tm_rate; - }; - -+struct hns3_dev_specs_1_cmd { -+ uint8_t rsv0[12]; -+ uint8_t min_tx_pkt_len; -+ uint8_t rsv1[11]; -+}; -+ - struct hns3_query_rpu_cmd { - uint32_t tc_queue_num; - uint32_t rsv1[2]; -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 7b0e8fc77d..7330515535 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2661,14 +2661,17 @@ static void - hns3_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc) - { - struct hns3_dev_specs_0_cmd *req0; -+ struct hns3_dev_specs_1_cmd *req1; - - req0 = (struct hns3_dev_specs_0_cmd *)desc[0].data; -+ req1 = (struct hns3_dev_specs_1_cmd *)desc[1].data; - - hw->max_non_tso_bd_num = req0->max_non_tso_bd_num; - hw->rss_ind_tbl_size = rte_le_to_cpu_16(req0->rss_ind_tbl_size); - hw->rss_key_size = rte_le_to_cpu_16(req0->rss_key_size); - hw->max_tm_rate = rte_le_to_cpu_32(req0->max_tm_rate); - hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max); -+ hw->min_tx_pkt_len = req1->min_tx_pkt_len; - } - - static int -@@ -2763,7 +2766,6 @@ hns3_get_capability(struct hns3_hw *hw) - hw->tso_mode = HNS3_TSO_HW_CAL_PSEUDO_H_CSUM; - hw->vlan_mode = HNS3_HW_SHIFT_AND_DISCARD_MODE; - hw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE2; -- hw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN; - pf->tqp_config_mode = HNS3_FLEX_MAX_TQP_NUM_MODE; - hw->rss_info.ipv6_sctp_offload_supported = true; - hw->udp_cksum_mode = HNS3_SPECIAL_PORT_HW_CKSUM_MODE; -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 40476bf882..4406611fe9 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -75,7 +75,6 @@ - #define HNS3_DEFAULT_MTU 1500UL - #define HNS3_DEFAULT_FRAME_LEN (HNS3_DEFAULT_MTU + HNS3_ETH_OVERHEAD) - #define HNS3_HIP08_MIN_TX_PKT_LEN 33 --#define HNS3_HIP09_MIN_TX_PKT_LEN 9 - - #define HNS3_BITS_PER_BYTE 8 - -@@ -550,7 +549,7 @@ struct hns3_hw { - * The minimum length of the packet supported by hardware in the Tx - * direction. - */ -- uint32_t min_tx_pkt_len; -+ uint8_t min_tx_pkt_len; - - struct hns3_queue_intr intr; - /* -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 72d60191ab..6976a9f23d 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -701,13 +701,16 @@ static void - hns3vf_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc) - { - struct hns3_dev_specs_0_cmd *req0; -+ struct hns3_dev_specs_1_cmd *req1; - - req0 = (struct hns3_dev_specs_0_cmd *)desc[0].data; -+ req1 = (struct hns3_dev_specs_1_cmd *)desc[1].data; - - hw->max_non_tso_bd_num = req0->max_non_tso_bd_num; - hw->rss_ind_tbl_size = rte_le_to_cpu_16(req0->rss_ind_tbl_size); - hw->rss_key_size = rte_le_to_cpu_16(req0->rss_key_size); - hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max); -+ hw->min_tx_pkt_len = req1->min_tx_pkt_len; - } - - static int -@@ -846,7 +849,6 @@ hns3vf_get_capability(struct hns3_hw *hw) - hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_1US; - hw->tso_mode = HNS3_TSO_HW_CAL_PSEUDO_H_CSUM; - hw->drop_stats_mode = HNS3_PKTS_DROP_STATS_MODE2; -- hw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN; - hw->rss_info.ipv6_sctp_offload_supported = true; - hw->promisc_mode = HNS3_LIMIT_PROMISC_MODE; - --- -2.23.0 - diff --git a/0164-ethdev-introduce-Rx-Tx-descriptor-dump-API.patch b/0164-ethdev-introduce-Rx-Tx-descriptor-dump-API.patch deleted file mode 100644 index 82be665..0000000 --- a/0164-ethdev-introduce-Rx-Tx-descriptor-dump-API.patch +++ /dev/null @@ -1,238 +0,0 @@ -From e4f2f2e047f123e5aff0a9a5699bf2d4ece4ebb8 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 21 Oct 2022 15:36:40 +0800 -Subject: [PATCH 164/189] ethdev: introduce Rx/Tx descriptor dump API - -Added the ethdev Rx/Tx desc dump API which provides functions for query -descriptor from device. HW descriptor info differs in different NICs. -The information demonstrates I/O process which is important for debug. -As the information is different between NICs, the new API is introduced. - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/ethdev_driver.h | 53 ++++++++++++++++++++++++++++++++++++ - lib/ethdev/rte_ethdev.c | 52 +++++++++++++++++++++++++++++++++++ - lib/ethdev/rte_ethdev.h | 55 ++++++++++++++++++++++++++++++++++++++ - lib/ethdev/version.map | 4 +++ - 4 files changed, 164 insertions(+) - -diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h -index e24ff7064c..41f67f2740 100644 ---- a/lib/ethdev/ethdev_driver.h -+++ b/lib/ethdev/ethdev_driver.h -@@ -1010,6 +1010,54 @@ typedef int (*eth_rx_metadata_negotiate_t)(struct rte_eth_dev *dev, - */ - typedef int (*eth_dev_priv_dump_t)(struct rte_eth_dev *dev, FILE *file); - -+/** -+ * @internal -+ * Dump Rx descriptor info to a file. -+ * -+ * It is used for debugging, not a dataplane API. -+ * -+ * @param dev -+ * Port (ethdev) handle. -+ * @param queue_id -+ * A Rx queue identifier on this port. -+ * @param offset -+ * The offset of the descriptor starting from tail. (0 is the next -+ * packet to be received by the driver). -+ * @param num -+ * The number of the descriptors to dump. -+ * @param file -+ * A pointer to a file for output. -+ * @return -+ * Negative errno value on error, zero on success. -+ */ -+typedef int (*eth_rx_descriptor_dump_t)(const struct rte_eth_dev *dev, -+ uint16_t queue_id, uint16_t offset, -+ uint16_t num, FILE *file); -+ -+/** -+ * @internal -+ * Dump Tx descriptor info to a file. -+ * -+ * This API is used for debugging, not a dataplane API. -+ * -+ * @param dev -+ * Port (ethdev) handle. -+ * @param queue_id -+ * A Tx queue identifier on this port. -+ * @param offset -+ * The offset of the descriptor starting from tail. (0 is the place where -+ * the next packet will be send). -+ * @param num -+ * The number of the descriptors to dump. -+ * @param file -+ * A pointer to a file for output. -+ * @return -+ * Negative errno value on error, zero on success. -+ */ -+typedef int (*eth_tx_descriptor_dump_t)(const struct rte_eth_dev *dev, -+ uint16_t queue_id, uint16_t offset, -+ uint16_t num, FILE *file); -+ - /** - * @internal A structure containing the functions exported by an Ethernet driver. - */ -@@ -1209,6 +1257,11 @@ struct eth_dev_ops { - - /** Dump private info from device */ - eth_dev_priv_dump_t eth_dev_priv_dump; -+ -+ /** Dump Rx descriptor info */ -+ eth_rx_descriptor_dump_t eth_rx_descriptor_dump; -+ /** Dump Tx descriptor info */ -+ eth_tx_descriptor_dump_t eth_tx_descriptor_dump; - }; - - /** -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 25c9f0c123..b95f501b51 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6509,6 +6509,58 @@ rte_eth_dev_priv_dump(uint16_t port_id, FILE *file) - return eth_err(port_id, (*dev->dev_ops->eth_dev_priv_dump)(dev, file)); - } - -+int -+rte_eth_rx_descriptor_dump(uint16_t port_id, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file) -+{ -+ struct rte_eth_dev *dev; -+ -+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ dev = &rte_eth_devices[port_id]; -+ -+ if (queue_id >= dev->data->nb_rx_queues) { -+ RTE_ETHDEV_LOG(ERR, "Invalid Rx queue_id=%u\n", queue_id); -+ return -EINVAL; -+ } -+ -+ if (file == NULL) { -+ RTE_ETHDEV_LOG(ERR, "Invalid file (NULL)\n"); -+ return -EINVAL; -+ } -+ -+ if (*dev->dev_ops->eth_rx_descriptor_dump == NULL) -+ return -ENOTSUP; -+ -+ return eth_err(port_id, (*dev->dev_ops->eth_rx_descriptor_dump)(dev, -+ queue_id, offset, num, file)); -+} -+ -+int -+rte_eth_tx_descriptor_dump(uint16_t port_id, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file) -+{ -+ struct rte_eth_dev *dev; -+ -+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ dev = &rte_eth_devices[port_id]; -+ -+ if (queue_id >= dev->data->nb_tx_queues) { -+ RTE_ETHDEV_LOG(ERR, "Invalid Tx queue_id=%u\n", queue_id); -+ return -EINVAL; -+ } -+ -+ if (file == NULL) { -+ RTE_ETHDEV_LOG(ERR, "Invalid file (NULL)\n"); -+ return -EINVAL; -+ } -+ -+ if (*dev->dev_ops->eth_tx_descriptor_dump == NULL) -+ return -ENOTSUP; -+ -+ return eth_err(port_id, (*dev->dev_ops->eth_tx_descriptor_dump)(dev, -+ queue_id, offset, num, file)); -+} -+ - RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO); - - RTE_INIT(ethdev_init_telemetry) -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 082166ed42..8c894e090d 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -5213,6 +5213,61 @@ int rte_eth_rx_metadata_negotiate(uint16_t port_id, uint64_t *features); - __rte_experimental - int rte_eth_dev_priv_dump(uint16_t port_id, FILE *file); - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice -+ * -+ * Dump ethdev Rx descriptor info to a file. -+ * -+ * This API is used for debugging, not a dataplane API. -+ * -+ * @param port_id -+ * The port identifier of the Ethernet device. -+ * @param queue_id -+ * A Rx queue identifier on this port. -+ * @param offset -+ * The offset of the descriptor starting from tail. (0 is the next -+ * packet to be received by the driver). -+ * @param num -+ * The number of the descriptors to dump. -+ * @param file -+ * A pointer to a file for output. -+ * @return -+ * - On success, zero. -+ * - On failure, a negative value. -+ */ -+__rte_experimental -+int rte_eth_rx_descriptor_dump(uint16_t port_id, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file); -+ -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice -+ * -+ * Dump ethdev Tx descriptor info to a file. -+ * -+ * This API is used for debugging, not a dataplane API. -+ * -+ * @param port_id -+ * The port identifier of the Ethernet device. -+ * @param queue_id -+ * A Tx queue identifier on this port. -+ * @param offset -+ * The offset of the descriptor starting from tail. (0 is the place where -+ * the next packet will be send). -+ * @param num -+ * The number of the descriptors to dump. -+ * @param file -+ * A pointer to a file for output. -+ * @return -+ * - On success, zero. -+ * - On failure, a negative value. -+ */ -+__rte_experimental -+int rte_eth_tx_descriptor_dump(uint16_t port_id, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file); -+ -+ - #include - - /** -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index f29c60eda4..09dba86bee 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -259,6 +259,10 @@ EXPERIMENTAL { - - # added in 22.03 - rte_eth_dev_priv_dump; -+ -+ # added in 22.11 -+ rte_eth_rx_descriptor_dump; -+ rte_eth_tx_descriptor_dump; - }; - - INTERNAL { --- -2.23.0 - diff --git a/0165-net-hns3-support-Rx-Tx-descriptor-dump.patch b/0165-net-hns3-support-Rx-Tx-descriptor-dump.patch deleted file mode 100644 index a2fbe3b..0000000 --- a/0165-net-hns3-support-Rx-Tx-descriptor-dump.patch +++ /dev/null @@ -1,164 +0,0 @@ -From 450591abedaabee32a21d53a50cb5b65440ce971 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Fri, 21 Oct 2022 15:36:41 +0800 -Subject: [PATCH 165/189] net/hns3: support Rx/Tx descriptor dump - -This patch support query HW descriptor from hns3 device. HW descriptor -is also called BD (buffer description) which is shared memory between -software and hardware. - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Ferruh Yigit ---- - drivers/net/hns3/hns3_dump.c | 88 +++++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_dump.h | 4 ++ - drivers/net/hns3/hns3_ethdev.c | 2 + - drivers/net/hns3/hns3_ethdev_vf.c | 2 + - 4 files changed, 96 insertions(+) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index cf5b500be1..1007b09bd2 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -11,6 +11,9 @@ - #include "hns3_logs.h" - #include "hns3_dump.h" - -+#define HNS3_BD_DW_NUM 8 -+#define HNS3_BD_ADDRESS_LAST_DW 2 -+ - static const char * - hns3_get_adapter_state_name(enum hns3_adapter_state state) - { -@@ -873,3 +876,88 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - - return 0; - } -+ -+int -+hns3_rx_descriptor_dump(const struct rte_eth_dev *dev, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_rx_queue *rxq = dev->data->rx_queues[queue_id]; -+ uint32_t *bd_data; -+ uint16_t count = 0; -+ uint16_t desc_id; -+ int i; -+ -+ if (offset >= rxq->nb_rx_desc) -+ return -EINVAL; -+ -+ if (num > rxq->nb_rx_desc) { -+ hns3_err(hw, "Invalid BD num=%u\n", num); -+ return -EINVAL; -+ } -+ -+ while (count < num) { -+ desc_id = (rxq->next_to_use + offset + count) % rxq->nb_rx_desc; -+ bd_data = (uint32_t *)(&rxq->rx_ring[desc_id]); -+ fprintf(file, "Rx queue id:%u BD id:%u\n", queue_id, desc_id); -+ for (i = 0; i < HNS3_BD_DW_NUM; i++) { -+ /* -+ * For the sake of security, first 8 bytes of BD which -+ * stands for physical address of packet should not be -+ * shown. -+ */ -+ if (i < HNS3_BD_ADDRESS_LAST_DW) { -+ fprintf(file, "RX BD WORD[%d]:0x%08x\n", i, 0); -+ continue; -+ } -+ fprintf(file, "RX BD WORD[%d]:0x%08x\n", i, -+ *(bd_data + i)); -+ } -+ count++; -+ } -+ -+ return 0; -+} -+ -+int -+hns3_tx_descriptor_dump(const struct rte_eth_dev *dev, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_tx_queue *txq = dev->data->tx_queues[queue_id]; -+ uint32_t *bd_data; -+ uint16_t count = 0; -+ uint16_t desc_id; -+ int i; -+ -+ if (offset >= txq->nb_tx_desc) -+ return -EINVAL; -+ -+ if (num > txq->nb_tx_desc) { -+ hns3_err(hw, "Invalid BD num=%u\n", num); -+ return -EINVAL; -+ } -+ -+ while (count < num) { -+ desc_id = (txq->next_to_use + offset + count) % txq->nb_tx_desc; -+ bd_data = (uint32_t *)(&txq->tx_ring[desc_id]); -+ fprintf(file, "Tx queue id:%u BD id:%u\n", queue_id, desc_id); -+ for (i = 0; i < HNS3_BD_DW_NUM; i++) { -+ /* -+ * For the sake of security, first 8 bytes of BD which -+ * stands for physical address of packet should not be -+ * shown. -+ */ -+ if (i < HNS3_BD_ADDRESS_LAST_DW) { -+ fprintf(file, "TX BD WORD[%d]:0x%08x\n", i, 0); -+ continue; -+ } -+ -+ fprintf(file, "Tx BD WORD[%d]:0x%08x\n", i, -+ *(bd_data + i)); -+ } -+ count++; -+ } -+ -+ return 0; -+} -diff --git a/drivers/net/hns3/hns3_dump.h b/drivers/net/hns3/hns3_dump.h -index 616cb70d6e..021ce1bbdb 100644 ---- a/drivers/net/hns3/hns3_dump.h -+++ b/drivers/net/hns3/hns3_dump.h -@@ -7,4 +7,8 @@ - - int hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file); - -+int hns3_rx_descriptor_dump(const struct rte_eth_dev *dev, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file); -+int hns3_tx_descriptor_dump(const struct rte_eth_dev *dev, uint16_t queue_id, -+ uint16_t offset, uint16_t num, FILE *file); - #endif /* HNS3_DUMP_H */ -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 7330515535..f83cff4d98 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6558,6 +6558,8 @@ static const struct eth_dev_ops hns3_eth_dev_ops = { - .timesync_read_time = hns3_timesync_read_time, - .timesync_write_time = hns3_timesync_write_time, - .eth_dev_priv_dump = hns3_eth_dev_priv_dump, -+ .eth_rx_descriptor_dump = hns3_rx_descriptor_dump, -+ .eth_tx_descriptor_dump = hns3_tx_descriptor_dump, - }; - - static const struct hns3_reset_ops hns3_reset_ops = { -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 6976a9f23d..1022b02697 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -2302,6 +2302,8 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = { - .dev_supported_ptypes_get = hns3_dev_supported_ptypes_get, - .tx_done_cleanup = hns3_tx_done_cleanup, - .eth_dev_priv_dump = hns3_eth_dev_priv_dump, -+ .eth_rx_descriptor_dump = hns3_rx_descriptor_dump, -+ .eth_tx_descriptor_dump = hns3_tx_descriptor_dump, - }; - - static const struct hns3_reset_ops hns3vf_reset_ops = { --- -2.23.0 - diff --git a/0166-remove-unnecessary-null-checks.patch b/0166-remove-unnecessary-null-checks.patch deleted file mode 100644 index 9ffc903..0000000 --- a/0166-remove-unnecessary-null-checks.patch +++ /dev/null @@ -1,50 +0,0 @@ -From ea171dea8f8417fe0715620a3de77e0cf3054916 Mon Sep 17 00:00:00 2001 -From: Stephen Hemminger -Date: Fri, 21 Oct 2022 15:36:42 +0800 -Subject: [PATCH 166/189] remove unnecessary null checks - -Functions like free, rte_free, and rte_mempool_free -already handle NULL pointer so the checks here are not necessary. - -Remove redundant NULL pointer checks before free functions -found by nullfree.cocci - -Note: This patch only captures some hns3 modification from the -following patch: -Fixes: 06c047b68061 ("remove unnecessary null checks") - -Signed-off-by: Stephen Hemminger ---- - drivers/net/hns3/hns3_rxtx.c | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 8ad40a49c7..29caaeafbd 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -86,8 +86,7 @@ hns3_rx_queue_release(void *queue) - hns3_rx_queue_release_mbufs(rxq); - if (rxq->mz) - rte_memzone_free(rxq->mz); -- if (rxq->sw_ring) -- rte_free(rxq->sw_ring); -+ rte_free(rxq->sw_ring); - rte_free(rxq); - } - } -@@ -100,10 +99,8 @@ hns3_tx_queue_release(void *queue) - hns3_tx_queue_release_mbufs(txq); - if (txq->mz) - rte_memzone_free(txq->mz); -- if (txq->sw_ring) -- rte_free(txq->sw_ring); -- if (txq->free) -- rte_free(txq->free); -+ rte_free(txq->sw_ring); -+ rte_free(txq->free); - rte_free(txq); - } - } --- -2.23.0 - diff --git a/0167-ethdev-introduce-generic-dummy-packet-burst-function.patch b/0167-ethdev-introduce-generic-dummy-packet-burst-function.patch deleted file mode 100644 index ffcd0a7..0000000 --- a/0167-ethdev-introduce-generic-dummy-packet-burst-function.patch +++ /dev/null @@ -1,175 +0,0 @@ -From 93df9193174fc6190ec793a0fdfc7bf2ee105669 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Fri, 21 Oct 2022 15:36:43 +0800 -Subject: [PATCH 167/189] ethdev: introduce generic dummy packet burst function -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Multiple PMDs have dummy/noop Rx/Tx packet burst functions. -These dummy functions are very simple, introduce a common function in -the ethdev and update drivers to use it instead of each driver having -its own functions. - -Note: -Note: This patch only captures some hns3 modification from the -following patch: -Fixes: a41f593f1bce ("ethdev: introduce generic dummy packet burst function") - -Signed-off-by: Ferruh Yigit -Acked-by: Morten Brørup -Acked-by: Viacheslav Ovsiienko -Acked-by: Thomas Monjalon ---- - drivers/net/hns3/hns3_rxtx.c | 18 +++++------------- - drivers/net/hns3/hns3_rxtx.h | 3 --- - lib/ethdev/ethdev_driver.c | 13 +++++++++++++ - lib/ethdev/ethdev_driver.h | 17 +++++++++++++++++ - lib/ethdev/meson.build | 1 + - lib/ethdev/version.map | 1 + - 6 files changed, 37 insertions(+), 16 deletions(-) - create mode 100644 lib/ethdev/ethdev_driver.c - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 29caaeafbd..3c02fd54e1 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4365,14 +4365,6 @@ hns3_get_tx_function(struct rte_eth_dev *dev, eth_tx_prep_t *prep) - return hns3_xmit_pkts; - } - --uint16_t --hns3_dummy_rxtx_burst(void *dpdk_txq __rte_unused, -- struct rte_mbuf **pkts __rte_unused, -- uint16_t pkts_n __rte_unused) --{ -- return 0; --} -- - static void - hns3_trace_rxtx_function(struct rte_eth_dev *dev) - { -@@ -4416,14 +4408,14 @@ hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - eth_dev->rx_pkt_burst = hns3_get_rx_function(eth_dev); - eth_dev->rx_descriptor_status = hns3_dev_rx_descriptor_status; - eth_dev->tx_pkt_burst = hw->set_link_down ? -- hns3_dummy_rxtx_burst : -+ rte_eth_pkt_burst_dummy : - hns3_get_tx_function(eth_dev, &prep); - eth_dev->tx_pkt_prepare = prep; - eth_dev->tx_descriptor_status = hns3_dev_tx_descriptor_status; - hns3_trace_rxtx_function(eth_dev); - } else { -- eth_dev->rx_pkt_burst = hns3_dummy_rxtx_burst; -- eth_dev->tx_pkt_burst = hns3_dummy_rxtx_burst; -+ eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy; -+ eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy; - eth_dev->tx_pkt_prepare = NULL; - } - -@@ -4637,7 +4629,7 @@ hns3_tx_done_cleanup(void *txq, uint32_t free_cnt) - - if (dev->tx_pkt_burst == hns3_xmit_pkts) - return hns3_tx_done_cleanup_full(q, free_cnt); -- else if (dev->tx_pkt_burst == hns3_dummy_rxtx_burst) -+ else if (dev->tx_pkt_burst == rte_eth_pkt_burst_dummy) - return 0; - else - return -ENOTSUP; -@@ -4747,7 +4739,7 @@ hns3_enable_rxd_adv_layout(struct hns3_hw *hw) - void - hns3_stop_tx_datapath(struct rte_eth_dev *dev) - { -- dev->tx_pkt_burst = hns3_dummy_rxtx_burst; -+ dev->tx_pkt_burst = rte_eth_pkt_burst_dummy; - dev->tx_pkt_prepare = NULL; - hns3_eth_dev_fp_ops_config(dev); - -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index ed40621b3a..e633b336b1 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -742,9 +742,6 @@ void hns3_init_rx_ptype_tble(struct rte_eth_dev *dev); - void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev); - eth_tx_burst_t hns3_get_tx_function(struct rte_eth_dev *dev, - eth_tx_prep_t *prep); --uint16_t hns3_dummy_rxtx_burst(void *dpdk_txq __rte_unused, -- struct rte_mbuf **pkts __rte_unused, -- uint16_t pkts_n __rte_unused); - - uint32_t hns3_get_tqp_intr_reg_offset(uint16_t tqp_intr_id); - void hns3_set_queue_intr_gl(struct hns3_hw *hw, uint16_t queue_id, -diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c -new file mode 100644 -index 0000000000..fb7323f4d3 ---- /dev/null -+++ b/lib/ethdev/ethdev_driver.c -@@ -0,0 +1,13 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2022 Intel Corporation -+ */ -+ -+#include "ethdev_driver.h" -+ -+uint16_t -+rte_eth_pkt_burst_dummy(void *queue __rte_unused, -+ struct rte_mbuf **pkts __rte_unused, -+ uint16_t nb_pkts __rte_unused) -+{ -+ return 0; -+} -diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h -index 41f67f2740..d3de203d7a 100644 ---- a/lib/ethdev/ethdev_driver.h -+++ b/lib/ethdev/ethdev_driver.h -@@ -1497,6 +1497,23 @@ rte_eth_linkstatus_get(const struct rte_eth_dev *dev, - *dst = __atomic_load_n(src, __ATOMIC_SEQ_CST); - } - -+/** -+ * @internal -+ * Dummy DPDK callback for Rx/Tx packet burst. -+ * -+ * @param queue -+ * Pointer to Rx/Tx queue -+ * @param pkts -+ * Packet array -+ * @param nb_pkts -+ * Number of packets in packet array -+ */ -+__rte_internal -+uint16_t -+rte_eth_pkt_burst_dummy(void *queue __rte_unused, -+ struct rte_mbuf **pkts __rte_unused, -+ uint16_t nb_pkts __rte_unused); -+ - /** - * Allocate an unique switch domain identifier. - * -diff --git a/lib/ethdev/meson.build b/lib/ethdev/meson.build -index 0205c853df..a094585bf7 100644 ---- a/lib/ethdev/meson.build -+++ b/lib/ethdev/meson.build -@@ -2,6 +2,7 @@ - # Copyright(c) 2017 Intel Corporation - - sources = files( -+ 'ethdev_driver.c', - 'ethdev_private.c', - 'ethdev_profile.c', - 'ethdev_trace_points.c', -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index 09dba86bee..590aa5a0a6 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -286,6 +286,7 @@ INTERNAL { - rte_eth_hairpin_queue_peer_bind; - rte_eth_hairpin_queue_peer_unbind; - rte_eth_hairpin_queue_peer_update; -+ rte_eth_pkt_burst_dummy; - rte_eth_representor_id_get; - rte_eth_switch_domain_alloc; - rte_eth_switch_domain_free; --- -2.23.0 - diff --git a/0168-fix-spelling-in-comments-and-strings.patch b/0168-fix-spelling-in-comments-and-strings.patch deleted file mode 100644 index 96827ab..0000000 --- a/0168-fix-spelling-in-comments-and-strings.patch +++ /dev/null @@ -1,9689 +0,0 @@ -From bf14a018352f534ffdd3586745f362e4a2deb772 Mon Sep 17 00:00:00 2001 -From: Josh Soref -Date: Fri, 21 Oct 2022 15:36:44 +0800 -Subject: [PATCH 168/189] fix spelling in comments and strings - -The tool comes from https://github.com/jsoref - -Signed-off-by: Josh Soref -Signed-off-by: Thomas Monjalon ---- - app/proc-info/main.c | 6 +-- - app/test-acl/main.c | 6 +-- - .../comp_perf_test_cyclecount.c | 2 +- - .../comp_perf_test_throughput.c | 2 +- - .../comp_perf_test_verify.c | 2 +- - app/test-compress-perf/main.c | 2 +- - .../cperf_test_pmd_cyclecount.c | 2 +- - app/test-eventdev/evt_options.c | 2 +- - app/test-eventdev/test_order_common.c | 2 +- - app/test-fib/main.c | 4 +- - app/test-flow-perf/config.h | 2 +- - app/test-flow-perf/main.c | 2 +- - app/test-pmd/cmdline.c | 2 +- - app/test-pmd/cmdline_flow.c | 6 +-- - app/test-pmd/cmdline_tm.c | 4 +- - app/test-pmd/csumonly.c | 2 +- - app/test-pmd/parameters.c | 2 +- - app/test-pmd/testpmd.c | 2 +- - app/test-pmd/txonly.c | 4 +- - app/test/test_barrier.c | 2 +- - app/test/test_bpf.c | 4 +- - app/test/test_compressdev.c | 2 +- - app/test/test_cryptodev.c | 2 +- - app/test/test_fib_perf.c | 2 +- - app/test/test_kni.c | 4 +- - app/test/test_kvargs.c | 16 ++++---- - app/test/test_lpm6_data.h | 2 +- - app/test/test_member.c | 2 +- - app/test/test_mempool.c | 4 +- - app/test/test_memzone.c | 6 +-- - app/test/test_metrics.c | 2 +- - app/test/test_pcapng.c | 2 +- - app/test/test_power_cpufreq.c | 2 +- - app/test/test_rcu_qsbr.c | 4 +- - app/test/test_red.c | 8 ++-- - app/test/test_security.c | 2 +- - app/test/test_table_pipeline.c | 2 +- - app/test/test_thash.c | 2 +- - buildtools/binutils-avx512-check.py | 2 +- - devtools/check-symbol-change.sh | 6 +-- - .../virtio_user_for_container_networking.svg | 2 +- - doc/guides/nics/af_packet.rst | 2 +- - doc/guides/nics/mlx4.rst | 2 +- - doc/guides/nics/mlx5.rst | 6 +-- - doc/guides/prog_guide/cryptodev_lib.rst | 2 +- - .../prog_guide/env_abstraction_layer.rst | 4 +- - doc/guides/prog_guide/img/turbo_tb_decode.svg | 2 +- - doc/guides/prog_guide/img/turbo_tb_encode.svg | 2 +- - doc/guides/prog_guide/qos_framework.rst | 6 +-- - doc/guides/prog_guide/rte_flow.rst | 2 +- - doc/guides/rawdevs/cnxk_bphy.rst | 2 +- - doc/guides/regexdevs/features_overview.rst | 2 +- - doc/guides/rel_notes/release_16_07.rst | 2 +- - doc/guides/rel_notes/release_17_08.rst | 2 +- - doc/guides/rel_notes/release_2_1.rst | 2 +- - doc/guides/sample_app_ug/ip_reassembly.rst | 4 +- - doc/guides/sample_app_ug/l2_forward_cat.rst | 2 +- - doc/guides/sample_app_ug/server_node_efd.rst | 2 +- - doc/guides/sample_app_ug/skeleton.rst | 2 +- - .../sample_app_ug/vm_power_management.rst | 2 +- - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +- - drivers/baseband/fpga_lte_fec/fpga_lte_fec.c | 8 ++-- - drivers/baseband/null/bbdev_null.c | 2 +- - .../baseband/turbo_sw/bbdev_turbo_software.c | 2 +- - drivers/bus/dpaa/dpaa_bus.c | 2 +- - drivers/bus/dpaa/include/fsl_qman.h | 6 +-- - drivers/bus/dpaa/include/fsl_usd.h | 2 +- - drivers/bus/dpaa/include/process.h | 2 +- - drivers/bus/fslmc/fslmc_bus.c | 2 +- - drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 2 +- - drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 2 +- - .../fslmc/qbman/include/fsl_qbman_portal.h | 20 +++++----- - drivers/bus/pci/linux/pci_vfio.c | 2 +- - drivers/bus/vdev/rte_bus_vdev.h | 2 +- - drivers/bus/vmbus/vmbus_common.c | 2 +- - drivers/common/cnxk/roc_bphy_cgx.c | 2 +- - drivers/common/cnxk/roc_nix_bpf.c | 2 +- - drivers/common/cnxk/roc_nix_tm_ops.c | 2 +- - drivers/common/cnxk/roc_npc_mcam.c | 2 +- - drivers/common/cnxk/roc_npc_priv.h | 2 +- - drivers/common/cpt/cpt_ucode.h | 4 +- - drivers/common/cpt/cpt_ucode_asym.h | 2 +- - drivers/common/dpaax/caamflib/desc/algo.h | 2 +- - drivers/common/dpaax/caamflib/desc/sdap.h | 6 +-- - drivers/common/dpaax/dpaax_iova_table.c | 2 +- - drivers/common/iavf/iavf_type.h | 2 +- - drivers/common/iavf/virtchnl.h | 2 +- - drivers/common/mlx5/mlx5_common.c | 2 +- - drivers/common/mlx5/mlx5_common_mr.c | 2 +- - drivers/common/mlx5/mlx5_devx_cmds.c | 2 +- - drivers/common/mlx5/mlx5_malloc.c | 4 +- - drivers/common/mlx5/mlx5_malloc.h | 2 +- - drivers/common/mlx5/mlx5_prm.h | 2 +- - drivers/common/mlx5/windows/mlx5_common_os.c | 4 +- - drivers/common/mlx5/windows/mlx5_common_os.h | 2 +- - .../qat/qat_adf/adf_transport_access_macros.h | 2 +- - drivers/common/sfc_efx/efsys.h | 2 +- - drivers/compress/octeontx/include/zip_regs.h | 4 +- - drivers/compress/octeontx/otx_zip.h | 2 +- - drivers/compress/qat/qat_comp_pmd.c | 2 +- - drivers/crypto/bcmfs/bcmfs_device.h | 2 +- - drivers/crypto/bcmfs/bcmfs_qp.c | 2 +- - drivers/crypto/bcmfs/bcmfs_sym_defs.h | 6 +-- - drivers/crypto/bcmfs/bcmfs_sym_engine.h | 2 +- - drivers/crypto/bcmfs/hw/bcmfs5_rm.c | 2 +- - drivers/crypto/caam_jr/caam_jr_hw_specific.h | 4 +- - drivers/crypto/caam_jr/caam_jr_pvt.h | 4 +- - drivers/crypto/caam_jr/caam_jr_uio.c | 2 +- - drivers/crypto/ccp/ccp_crypto.c | 2 +- - drivers/crypto/ccp/ccp_crypto.h | 2 +- - drivers/crypto/ccp/ccp_dev.h | 2 +- - drivers/crypto/dpaa_sec/dpaa_sec.c | 2 +- - .../crypto/octeontx/otx_cryptodev_hw_access.c | 2 +- - drivers/crypto/octeontx/otx_cryptodev_mbox.h | 2 +- - drivers/crypto/octeontx/otx_cryptodev_ops.c | 2 +- - drivers/crypto/qat/qat_asym.c | 2 +- - drivers/crypto/qat/qat_sym.c | 2 +- - drivers/crypto/virtio/virtqueue.h | 2 +- - drivers/dma/skeleton/skeleton_dmadev.c | 2 +- - drivers/event/cnxk/cnxk_eventdev_selftest.c | 4 +- - drivers/event/dlb2/dlb2.c | 2 +- - drivers/event/dlb2/dlb2_priv.h | 2 +- - drivers/event/dlb2/dlb2_selftest.c | 2 +- - drivers/event/dlb2/rte_pmd_dlb2.h | 2 +- - drivers/event/dpaa2/dpaa2_eventdev_selftest.c | 2 +- - drivers/event/dsw/dsw_evdev.h | 4 +- - drivers/event/dsw/dsw_event.c | 4 +- - drivers/event/octeontx/ssovf_evdev.h | 2 +- - drivers/event/octeontx/ssovf_evdev_selftest.c | 2 +- - drivers/event/octeontx2/otx2_evdev_selftest.c | 2 +- - drivers/event/octeontx2/otx2_worker_dual.h | 2 +- - drivers/event/opdl/opdl_evdev.c | 2 +- - drivers/event/opdl/opdl_test.c | 2 +- - drivers/event/sw/sw_evdev.h | 2 +- - drivers/event/sw/sw_evdev_selftest.c | 2 +- - drivers/mempool/dpaa/dpaa_mempool.c | 2 +- - drivers/mempool/octeontx/octeontx_fpavf.c | 4 +- - drivers/net/ark/ark_global.h | 2 +- - drivers/net/atlantic/atl_ethdev.c | 2 +- - drivers/net/atlantic/atl_rxtx.c | 2 +- - drivers/net/atlantic/hw_atl/hw_atl_b0.c | 2 +- - drivers/net/axgbe/axgbe_dev.c | 2 +- - drivers/net/axgbe/axgbe_ethdev.c | 2 +- - drivers/net/axgbe/axgbe_ethdev.h | 2 +- - drivers/net/axgbe/axgbe_phy_impl.c | 4 +- - drivers/net/axgbe/axgbe_rxtx_vec_sse.c | 2 +- - drivers/net/bnx2x/bnx2x.c | 38 +++++++++---------- - drivers/net/bnx2x/bnx2x.h | 10 ++--- - drivers/net/bnx2x/bnx2x_stats.c | 2 +- - drivers/net/bnx2x/bnx2x_stats.h | 4 +- - drivers/net/bnx2x/bnx2x_vfpf.c | 2 +- - drivers/net/bnx2x/bnx2x_vfpf.h | 2 +- - drivers/net/bnx2x/ecore_fw_defs.h | 2 +- - drivers/net/bnx2x/ecore_hsi.h | 26 ++++++------- - drivers/net/bnx2x/ecore_init_ops.h | 6 +-- - drivers/net/bnx2x/ecore_reg.h | 28 +++++++------- - drivers/net/bnx2x/ecore_sp.c | 6 +-- - drivers/net/bnx2x/ecore_sp.h | 6 +-- - drivers/net/bnx2x/elink.c | 20 +++++----- - drivers/net/bnxt/bnxt_hwrm.c | 2 +- - drivers/net/bnxt/tf_core/tfp.c | 2 +- - drivers/net/bnxt/tf_core/tfp.h | 2 +- - drivers/net/bonding/eth_bond_8023ad_private.h | 2 +- - drivers/net/bonding/eth_bond_private.h | 2 +- - drivers/net/bonding/rte_eth_bond_8023ad.c | 20 +++++----- - drivers/net/bonding/rte_eth_bond_8023ad.h | 4 +- - drivers/net/bonding/rte_eth_bond_alb.h | 2 +- - drivers/net/bonding/rte_eth_bond_api.c | 4 +- - drivers/net/cnxk/cn10k_ethdev.h | 2 +- - drivers/net/cnxk/cn10k_tx.h | 6 +-- - drivers/net/cnxk/cn9k_tx.h | 6 +-- - drivers/net/cnxk/cnxk_ptp.c | 2 +- - drivers/net/cxgbe/cxgbe_flow.c | 2 +- - drivers/net/cxgbe/cxgbevf_main.c | 2 +- - drivers/net/cxgbe/sge.c | 8 ++-- - drivers/net/dpaa/dpaa_ethdev.c | 6 +-- - drivers/net/dpaa/dpaa_rxtx.c | 4 +- - drivers/net/dpaa/fmlib/fm_ext.h | 2 +- - drivers/net/dpaa/fmlib/fm_pcd_ext.h | 8 ++-- - drivers/net/dpaa/fmlib/fm_port_ext.h | 14 +++---- - drivers/net/dpaa2/dpaa2_ethdev.c | 14 +++---- - drivers/net/dpaa2/dpaa2_ethdev.h | 2 +- - drivers/net/dpaa2/dpaa2_flow.c | 8 ++-- - drivers/net/dpaa2/dpaa2_mux.c | 2 +- - drivers/net/dpaa2/dpaa2_rxtx.c | 6 +-- - drivers/net/dpaa2/mc/fsl_dpni.h | 10 ++--- - drivers/net/e1000/e1000_ethdev.h | 4 +- - drivers/net/e1000/em_ethdev.c | 10 ++--- - drivers/net/e1000/em_rxtx.c | 6 +-- - drivers/net/e1000/igb_ethdev.c | 18 ++++----- - drivers/net/e1000/igb_flow.c | 4 +- - drivers/net/e1000/igb_pf.c | 2 +- - drivers/net/e1000/igb_rxtx.c | 14 +++---- - drivers/net/ena/ena_ethdev.c | 2 +- - drivers/net/ena/ena_ethdev.h | 2 +- - drivers/net/enetfec/enet_regs.h | 2 +- - drivers/net/enic/enic_flow.c | 18 ++++----- - drivers/net/enic/enic_fm_flow.c | 10 ++--- - drivers/net/enic/enic_main.c | 2 +- - drivers/net/enic/enic_rxtx.c | 2 +- - drivers/net/fm10k/fm10k.h | 2 +- - drivers/net/fm10k/fm10k_ethdev.c | 12 +++--- - drivers/net/fm10k/fm10k_rxtx_vec.c | 10 ++--- - drivers/net/hinic/hinic_pmd_ethdev.c | 4 +- - drivers/net/hinic/hinic_pmd_ethdev.h | 2 +- - drivers/net/hinic/hinic_pmd_flow.c | 4 +- - drivers/net/hinic/hinic_pmd_tx.c | 2 +- - drivers/net/hns3/hns3_cmd.c | 4 +- - drivers/net/hns3/hns3_common.c | 2 +- - drivers/net/hns3/hns3_dcb.c | 10 ++--- - drivers/net/hns3/hns3_ethdev.c | 14 +++---- - drivers/net/hns3/hns3_ethdev.h | 8 ++-- - drivers/net/hns3/hns3_ethdev_vf.c | 4 +- - drivers/net/hns3/hns3_fdir.h | 2 +- - drivers/net/hns3/hns3_flow.c | 12 +++--- - drivers/net/hns3/hns3_mbx.c | 4 +- - drivers/net/hns3/hns3_mbx.h | 2 +- - drivers/net/hns3/hns3_rss.h | 2 +- - drivers/net/hns3/hns3_rxtx.c | 16 ++++---- - drivers/net/hns3/hns3_rxtx.h | 2 +- - drivers/net/hns3/hns3_stats.c | 2 +- - drivers/net/i40e/i40e_ethdev.c | 12 +++--- - drivers/net/i40e/i40e_ethdev.h | 10 ++--- - drivers/net/i40e/i40e_fdir.c | 10 ++--- - drivers/net/i40e/i40e_flow.c | 2 +- - drivers/net/i40e/i40e_pf.c | 4 +- - drivers/net/i40e/i40e_rxtx.c | 20 +++++----- - drivers/net/i40e/i40e_rxtx_vec_altivec.c | 2 +- - drivers/net/i40e/i40e_rxtx_vec_neon.c | 4 +- - drivers/net/i40e/i40e_rxtx_vec_sse.c | 6 +-- - drivers/net/i40e/rte_pmd_i40e.c | 2 +- - drivers/net/iavf/iavf_ethdev.c | 6 +-- - drivers/net/iavf/iavf_ipsec_crypto.c | 14 +++---- - drivers/net/iavf/iavf_ipsec_crypto.h | 2 +- - drivers/net/iavf/iavf_rxtx.c | 4 +- - drivers/net/iavf/iavf_rxtx_vec_sse.c | 4 +- - drivers/net/iavf/iavf_vchnl.c | 4 +- - drivers/net/ice/ice_dcf.c | 2 +- - drivers/net/ice/ice_dcf_ethdev.c | 2 +- - drivers/net/ice/ice_ethdev.c | 12 +++--- - drivers/net/ice/ice_rxtx.c | 10 ++--- - drivers/net/ice/ice_rxtx_vec_sse.c | 4 +- - drivers/net/igc/igc_filter.c | 2 +- - drivers/net/igc/igc_txrx.c | 4 +- - drivers/net/ionic/ionic_if.h | 6 +-- - drivers/net/ipn3ke/ipn3ke_ethdev.c | 2 +- - drivers/net/ipn3ke/ipn3ke_ethdev.h | 4 +- - drivers/net/ipn3ke/ipn3ke_flow.c | 2 +- - drivers/net/ipn3ke/ipn3ke_representor.c | 12 +++--- - drivers/net/ipn3ke/meson.build | 2 +- - drivers/net/ixgbe/ixgbe_bypass.c | 2 +- - drivers/net/ixgbe/ixgbe_bypass_api.h | 4 +- - drivers/net/ixgbe/ixgbe_ethdev.c | 18 ++++----- - drivers/net/ixgbe/ixgbe_ethdev.h | 2 +- - drivers/net/ixgbe/ixgbe_fdir.c | 2 +- - drivers/net/ixgbe/ixgbe_flow.c | 4 +- - drivers/net/ixgbe/ixgbe_ipsec.c | 2 +- - drivers/net/ixgbe/ixgbe_pf.c | 2 +- - drivers/net/ixgbe/ixgbe_rxtx.c | 10 ++--- - drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c | 2 +- - drivers/net/memif/memif_socket.c | 2 +- - drivers/net/memif/rte_eth_memif.c | 2 +- - drivers/net/mlx4/mlx4.h | 2 +- - drivers/net/mlx4/mlx4_ethdev.c | 2 +- - drivers/net/mlx5/linux/mlx5_os.c | 8 ++-- - drivers/net/mlx5/mlx5.c | 10 ++--- - drivers/net/mlx5/mlx5.h | 8 ++-- - drivers/net/mlx5/mlx5_flow.c | 20 +++++----- - drivers/net/mlx5/mlx5_flow.h | 6 +-- - drivers/net/mlx5/mlx5_flow_dv.c | 14 +++---- - drivers/net/mlx5/mlx5_flow_flex.c | 4 +- - drivers/net/mlx5/mlx5_flow_meter.c | 10 ++--- - drivers/net/mlx5/mlx5_rx.c | 2 +- - drivers/net/mlx5/mlx5_rxq.c | 4 +- - drivers/net/mlx5/mlx5_rxtx_vec_altivec.h | 2 +- - drivers/net/mlx5/mlx5_rxtx_vec_neon.h | 2 +- - drivers/net/mlx5/mlx5_rxtx_vec_sse.h | 2 +- - drivers/net/mlx5/mlx5_tx.c | 2 +- - drivers/net/mlx5/mlx5_utils.h | 2 +- - drivers/net/mlx5/windows/mlx5_flow_os.c | 2 +- - drivers/net/mlx5/windows/mlx5_os.c | 2 +- - drivers/net/mvneta/mvneta_ethdev.c | 2 +- - drivers/net/mvpp2/mrvl_ethdev.c | 2 +- - drivers/net/mvpp2/mrvl_qos.c | 4 +- - drivers/net/netvsc/hn_nvs.c | 2 +- - drivers/net/netvsc/hn_rxtx.c | 4 +- - drivers/net/netvsc/hn_vf.c | 2 +- - .../net/nfp/nfpcore/nfp-common/nfp_resid.h | 6 +-- - drivers/net/nfp/nfpcore/nfp_cppcore.c | 2 +- - drivers/net/nfp/nfpcore/nfp_nsp.h | 2 +- - drivers/net/nfp/nfpcore/nfp_resource.c | 2 +- - drivers/net/nfp/nfpcore/nfp_rtsym.c | 2 +- - drivers/net/ngbe/ngbe_ethdev.c | 6 +-- - drivers/net/ngbe/ngbe_pf.c | 2 +- - drivers/net/octeontx/octeontx_ethdev.c | 2 +- - drivers/net/octeontx2/otx2_ethdev_irq.c | 2 +- - drivers/net/octeontx2/otx2_ptp.c | 2 +- - drivers/net/octeontx2/otx2_tx.h | 4 +- - drivers/net/octeontx2/otx2_vlan.c | 2 +- - drivers/net/octeontx_ep/otx2_ep_vf.c | 2 +- - drivers/net/octeontx_ep/otx_ep_vf.c | 2 +- - drivers/net/pfe/pfe_ethdev.c | 2 +- - drivers/net/pfe/pfe_hal.c | 2 +- - drivers/net/pfe/pfe_hif.c | 4 +- - drivers/net/pfe/pfe_hif.h | 2 +- - drivers/net/pfe/pfe_hif_lib.c | 8 ++-- - drivers/net/qede/qede_debug.c | 4 +- - drivers/net/qede/qede_ethdev.c | 2 +- - drivers/net/qede/qede_rxtx.c | 12 +++--- - drivers/net/qede/qede_rxtx.h | 2 +- - drivers/net/sfc/sfc.c | 2 +- - drivers/net/sfc/sfc_dp.c | 2 +- - drivers/net/sfc/sfc_dp_rx.h | 4 +- - drivers/net/sfc/sfc_ef100.h | 2 +- - drivers/net/sfc/sfc_ef100_rx.c | 2 +- - drivers/net/sfc/sfc_ef10_essb_rx.c | 2 +- - drivers/net/sfc/sfc_ef10_rx_ev.h | 2 +- - drivers/net/sfc/sfc_intr.c | 2 +- - drivers/net/sfc/sfc_rx.c | 6 +-- - drivers/net/sfc/sfc_tx.c | 2 +- - drivers/net/softnic/rte_eth_softnic_flow.c | 2 +- - drivers/net/tap/rte_eth_tap.c | 2 +- - drivers/net/tap/tap_bpf_api.c | 4 +- - drivers/net/tap/tap_flow.c | 4 +- - drivers/net/thunderx/nicvf_svf.c | 2 +- - drivers/net/txgbe/txgbe_ethdev.c | 6 +-- - drivers/net/txgbe/txgbe_ethdev_vf.c | 6 +-- - drivers/net/txgbe/txgbe_ipsec.c | 2 +- - drivers/net/txgbe/txgbe_pf.c | 2 +- - drivers/net/virtio/virtio_ethdev.c | 4 +- - drivers/net/virtio/virtio_pci.c | 2 +- - drivers/net/virtio/virtio_rxtx.c | 2 +- - drivers/net/virtio/virtio_rxtx_packed_avx.h | 2 +- - drivers/net/virtio/virtqueue.c | 2 +- - drivers/net/virtio/virtqueue.h | 4 +- - drivers/raw/dpaa2_qdma/dpaa2_qdma.c | 2 +- - drivers/raw/dpaa2_qdma/dpaa2_qdma.h | 4 +- - drivers/raw/ifpga/ifpga_rawdev.c | 10 ++--- - drivers/raw/ntb/ntb.h | 2 +- - drivers/vdpa/mlx5/mlx5_vdpa_mem.c | 2 +- - drivers/vdpa/mlx5/mlx5_vdpa_virtq.c | 2 +- - examples/bbdev_app/main.c | 2 +- - examples/bond/main.c | 4 +- - examples/dma/dmafwd.c | 2 +- - examples/ethtool/lib/rte_ethtool.c | 2 +- - examples/ethtool/lib/rte_ethtool.h | 4 +- - examples/ip_reassembly/main.c | 8 ++-- - examples/ipsec-secgw/event_helper.c | 2 +- - examples/ipsec-secgw/ipsec-secgw.c | 14 +++---- - examples/ipsec-secgw/sa.c | 6 +-- - examples/ipsec-secgw/sp4.c | 2 +- - examples/ipsec-secgw/sp6.c | 2 +- - examples/ipsec-secgw/test/common_defs.sh | 4 +- - examples/kni/main.c | 2 +- - examples/l2fwd-cat/l2fwd-cat.c | 2 +- - examples/l2fwd-event/l2fwd_event_generic.c | 2 +- - .../l2fwd-event/l2fwd_event_internal_port.c | 2 +- - examples/l2fwd-jobstats/main.c | 2 +- - examples/l3fwd-acl/main.c | 6 +-- - examples/l3fwd-power/main.c | 4 +- - examples/l3fwd/l3fwd_common.h | 4 +- - examples/l3fwd/l3fwd_neon.h | 2 +- - examples/l3fwd/l3fwd_sse.h | 2 +- - examples/multi_process/hotplug_mp/commands.c | 2 +- - examples/multi_process/simple_mp/main.c | 2 +- - examples/multi_process/symmetric_mp/main.c | 2 +- - examples/ntb/ntb_fwd.c | 2 +- - examples/packet_ordering/main.c | 2 +- - examples/performance-thread/common/lthread.c | 6 +-- - .../performance-thread/common/lthread_diag.c | 2 +- - .../performance-thread/common/lthread_int.h | 2 +- - .../performance-thread/common/lthread_tls.c | 2 +- - .../performance-thread/l3fwd-thread/main.c | 12 +++--- - .../pthread_shim/pthread_shim.h | 2 +- - examples/pipeline/examples/registers.spec | 2 +- - examples/qos_sched/cmdline.c | 2 +- - examples/server_node_efd/node/node.c | 2 +- - examples/skeleton/basicfwd.c | 2 +- - examples/vhost/main.c | 10 ++--- - examples/vm_power_manager/channel_monitor.c | 2 +- - examples/vm_power_manager/power_manager.h | 2 +- - examples/vmdq/main.c | 2 +- - kernel/linux/kni/kni_fifo.h | 2 +- - lib/acl/acl_bld.c | 2 +- - lib/acl/acl_run_altivec.h | 2 +- - lib/acl/acl_run_avx512.c | 2 +- - lib/acl/acl_run_avx512x16.h | 14 +++---- - lib/acl/acl_run_avx512x8.h | 12 +++--- - lib/bpf/bpf_convert.c | 4 +- - lib/dmadev/rte_dmadev.h | 4 +- - lib/eal/arm/include/rte_cycles_32.h | 2 +- - lib/eal/freebsd/eal_interrupts.c | 4 +- - lib/eal/include/generic/rte_pflock.h | 2 +- - lib/eal/include/rte_malloc.h | 4 +- - lib/eal/linux/eal_interrupts.c | 4 +- - lib/eal/linux/eal_vfio.h | 2 +- - lib/eal/windows/eal_windows.h | 2 +- - lib/eal/windows/include/dirent.h | 4 +- - lib/eal/windows/include/fnmatch.h | 4 +- - lib/eal/x86/include/rte_atomic.h | 2 +- - lib/eventdev/rte_event_eth_rx_adapter.c | 6 +-- - lib/fib/rte_fib.c | 6 +-- - lib/fib/rte_fib.h | 4 +- - lib/fib/rte_fib6.c | 6 +-- - lib/fib/rte_fib6.h | 4 +- - lib/ipsec/ipsec_telemetry.c | 2 +- - lib/ipsec/rte_ipsec_sad.h | 2 +- - lib/ipsec/sa.c | 2 +- - lib/mbuf/rte_mbuf_core.h | 2 +- - lib/meson.build | 2 +- - lib/net/rte_l2tpv2.h | 4 +- - lib/pipeline/rte_swx_ctl.h | 4 +- - lib/pipeline/rte_swx_pipeline_internal.h | 4 +- - lib/pipeline/rte_swx_pipeline_spec.c | 2 +- - lib/power/power_cppc_cpufreq.c | 2 +- - lib/regexdev/rte_regexdev.h | 6 +-- - lib/ring/rte_ring_core.h | 2 +- - lib/sched/rte_pie.h | 6 +-- - lib/sched/rte_red.h | 4 +- - lib/sched/rte_sched.c | 2 +- - lib/sched/rte_sched.h | 2 +- - lib/table/rte_swx_table.h | 2 +- - lib/table/rte_swx_table_selector.h | 2 +- - lib/telemetry/telemetry.c | 2 +- - lib/telemetry/telemetry_json.h | 2 +- - lib/vhost/vhost_user.c | 4 +- - 426 files changed, 869 insertions(+), 869 deletions(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index fbc1715ce9..accb5e716d 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -637,7 +637,7 @@ metrics_display(int port_id) - - names = rte_malloc(NULL, sizeof(struct rte_metric_name) * len, 0); - if (names == NULL) { -- printf("Cannot allocate memory for metrcis names\n"); -+ printf("Cannot allocate memory for metrics names\n"); - rte_free(metrics); - return; - } -@@ -1135,7 +1135,7 @@ show_tm(void) - caplevel.n_nodes_max, - caplevel.n_nodes_nonleaf_max, - caplevel.n_nodes_leaf_max); -- printf("\t -- indetical: non leaf %u leaf %u\n", -+ printf("\t -- identical: non leaf %u leaf %u\n", - caplevel.non_leaf_nodes_identical, - caplevel.leaf_nodes_identical); - -@@ -1289,7 +1289,7 @@ show_ring(char *name) - printf(" - Name (%s) on socket (%d)\n" - " - flags:\n" - "\t -- Single Producer Enqueue (%u)\n" -- "\t -- Single Consmer Dequeue (%u)\n", -+ "\t -- Single Consumer Dequeue (%u)\n", - ptr->name, - ptr->memzone->socket_id, - ptr->flags & RING_F_SP_ENQ, -diff --git a/app/test-acl/main.c b/app/test-acl/main.c -index c2de18770d..06e3847ab9 100644 ---- a/app/test-acl/main.c -+++ b/app/test-acl/main.c -@@ -386,8 +386,8 @@ parse_cb_ipv4_trace(char *str, struct ipv4_5tuple *v) - } - - /* -- * Parses IPV6 address, exepcts the following format: -- * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X - is a hexedecimal digit). -+ * Parse IPv6 address, expects the following format: -+ * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X is a hexadecimal digit). - */ - static int - parse_ipv6_addr(const char *in, const char **end, uint32_t v[IPV6_ADDR_U32], -@@ -994,7 +994,7 @@ print_usage(const char *prgname) - "should be either 1 or multiple of %zu, " - "but not greater then %u]\n" - "[--" OPT_MAX_SIZE -- "= " -+ "= " - "leave 0 for default behaviour]\n" - "[--" OPT_ITER_NUM "=]\n" - "[--" OPT_VERBOSE "=]\n" -diff --git a/app/test-compress-perf/comp_perf_test_cyclecount.c b/app/test-compress-perf/comp_perf_test_cyclecount.c -index da55b02b74..1d8e5fe6c2 100644 ---- a/app/test-compress-perf/comp_perf_test_cyclecount.c -+++ b/app/test-compress-perf/comp_perf_test_cyclecount.c -@@ -180,7 +180,7 @@ main_loop(struct cperf_cyclecount_ctx *ctx, enum rte_comp_xform_type type) - - if (ops == NULL) { - RTE_LOG(ERR, USER1, -- "Can't allocate memory for ops strucures\n"); -+ "Can't allocate memory for ops structures\n"); - return -1; - } - -diff --git a/app/test-compress-perf/comp_perf_test_throughput.c b/app/test-compress-perf/comp_perf_test_throughput.c -index d3dff070b0..4569599eb9 100644 ---- a/app/test-compress-perf/comp_perf_test_throughput.c -+++ b/app/test-compress-perf/comp_perf_test_throughput.c -@@ -72,7 +72,7 @@ main_loop(struct cperf_benchmark_ctx *ctx, enum rte_comp_xform_type type) - - if (ops == NULL) { - RTE_LOG(ERR, USER1, -- "Can't allocate memory for ops strucures\n"); -+ "Can't allocate memory for ops structures\n"); - return -1; - } - -diff --git a/app/test-compress-perf/comp_perf_test_verify.c b/app/test-compress-perf/comp_perf_test_verify.c -index f6e21368e8..7d06029488 100644 ---- a/app/test-compress-perf/comp_perf_test_verify.c -+++ b/app/test-compress-perf/comp_perf_test_verify.c -@@ -75,7 +75,7 @@ main_loop(struct cperf_verify_ctx *ctx, enum rte_comp_xform_type type) - - if (ops == NULL) { - RTE_LOG(ERR, USER1, -- "Can't allocate memory for ops strucures\n"); -+ "Can't allocate memory for ops structures\n"); - return -1; - } - -diff --git a/app/test-compress-perf/main.c b/app/test-compress-perf/main.c -index cc9951a9b1..6ff6a2f04a 100644 ---- a/app/test-compress-perf/main.c -+++ b/app/test-compress-perf/main.c -@@ -67,7 +67,7 @@ comp_perf_check_capabilities(struct comp_test_data *test_data, uint8_t cdev_id) - - uint64_t comp_flags = cap->comp_feature_flags; - -- /* Huffman enconding */ -+ /* Huffman encoding */ - if (test_data->huffman_enc == RTE_COMP_HUFFMAN_FIXED && - (comp_flags & RTE_COMP_FF_HUFFMAN_FIXED) == 0) { - RTE_LOG(ERR, USER1, -diff --git a/app/test-crypto-perf/cperf_test_pmd_cyclecount.c b/app/test-crypto-perf/cperf_test_pmd_cyclecount.c -index ba1f104f72..5842f29d43 100644 ---- a/app/test-crypto-perf/cperf_test_pmd_cyclecount.c -+++ b/app/test-crypto-perf/cperf_test_pmd_cyclecount.c -@@ -334,7 +334,7 @@ pmd_cyclecount_bench_burst_sz( - * queue, so we never get any failed enqs unless the driver won't accept - * the exact number of descriptors we requested, or the driver won't - * wrap around the end of the TX ring. However, since we're only -- * dequeueing once we've filled up the queue, we have to benchmark it -+ * dequeuing once we've filled up the queue, we have to benchmark it - * piecemeal and then average out the results. - */ - cur_op = 0; -diff --git a/app/test-eventdev/evt_options.c b/app/test-eventdev/evt_options.c -index 753a7dbd7d..4ae44801da 100644 ---- a/app/test-eventdev/evt_options.c -+++ b/app/test-eventdev/evt_options.c -@@ -336,7 +336,7 @@ usage(char *program) - "\t--deq_tmo_nsec : global dequeue timeout\n" - "\t--prod_type_ethdev : use ethernet device as producer.\n" - "\t--prod_type_timerdev : use event timer device as producer.\n" -- "\t expity_nsec would be the timeout\n" -+ "\t expiry_nsec would be the timeout\n" - "\t in ns.\n" - "\t--prod_type_timerdev_burst : use timer device as producer\n" - "\t burst mode.\n" -diff --git a/app/test-eventdev/test_order_common.c b/app/test-eventdev/test_order_common.c -index ff7813f9c2..603e7c9178 100644 ---- a/app/test-eventdev/test_order_common.c -+++ b/app/test-eventdev/test_order_common.c -@@ -253,7 +253,7 @@ void - order_opt_dump(struct evt_options *opt) - { - evt_dump_producer_lcores(opt); -- evt_dump("nb_wrker_lcores", "%d", evt_nr_active_lcores(opt->wlcores)); -+ evt_dump("nb_worker_lcores", "%d", evt_nr_active_lcores(opt->wlcores)); - evt_dump_worker_lcores(opt); - evt_dump("nb_evdev_ports", "%d", order_nb_event_ports(opt)); - } -diff --git a/app/test-fib/main.c b/app/test-fib/main.c -index ecd420116a..622703dce8 100644 ---- a/app/test-fib/main.c -+++ b/app/test-fib/main.c -@@ -624,7 +624,7 @@ print_usage(void) - "(if -f is not specified)>]\n" - "[-r ]\n" -- "[-c ]\n" -+ "[-c ]\n" - "[-6 ]\n" - "[-s ]\n" - "[-a ]\n" - "[-w ]\n" - "[-u ]\n" -- "[-v ]\n", -diff --git a/app/test-flow-perf/config.h b/app/test-flow-perf/config.h -index 0db2254bd1..29b63298e0 100644 ---- a/app/test-flow-perf/config.h -+++ b/app/test-flow-perf/config.h -@@ -28,7 +28,7 @@ - #define PORT_ID_DST 1 - #define TEID_VALUE 1 - --/* Flow items/acctions max size */ -+/* Flow items/actions max size */ - #define MAX_ITEMS_NUM 32 - #define MAX_ACTIONS_NUM 32 - #define MAX_ATTRS_NUM 16 -diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c -index 11f1ee0e1e..56d43734e3 100644 ---- a/app/test-flow-perf/main.c -+++ b/app/test-flow-perf/main.c -@@ -1519,7 +1519,7 @@ dump_used_cpu_time(const char *item, - * threads time. - * - * Throughput: total count of rte rules divided -- * over the average of the time cosumed by all -+ * over the average of the time consumed by all - * threads time. - */ - double insertion_latency_time; -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 1f9fd61394..26d95e64e0 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -561,7 +561,7 @@ static void cmd_help_long_parsed(void *parsed_result, - " Set the option to enable display of RX and TX bursts.\n" - - "set port (port_id) vf (vf_id) rx|tx on|off\n" -- " Enable/Disable a VF receive/tranmit from a port\n\n" -+ " Enable/Disable a VF receive/transmit from a port\n\n" - - "set port (port_id) vf (vf_id) rxmode (AUPE|ROPE|BAM" - "|MPE) (on|off)\n" -diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c -index bbe3dc0115..5c2bba48ad 100644 ---- a/app/test-pmd/cmdline_flow.c -+++ b/app/test-pmd/cmdline_flow.c -@@ -2162,7 +2162,7 @@ static const struct token token_list[] = { - }, - [COMMON_POLICY_ID] = { - .name = "{policy_id}", -- .type = "POLCIY_ID", -+ .type = "POLICY_ID", - .help = "policy id", - .call = parse_int, - .comp = comp_none, -@@ -2370,7 +2370,7 @@ static const struct token token_list[] = { - }, - [TUNNEL_DESTROY] = { - .name = "destroy", -- .help = "destroy tunel", -+ .help = "destroy tunnel", - .next = NEXT(NEXT_ENTRY(TUNNEL_DESTROY_ID), - NEXT_ENTRY(COMMON_PORT_ID)), - .args = ARGS(ARGS_ENTRY(struct buffer, port)), -@@ -2378,7 +2378,7 @@ static const struct token token_list[] = { - }, - [TUNNEL_DESTROY_ID] = { - .name = "id", -- .help = "tunnel identifier to testroy", -+ .help = "tunnel identifier to destroy", - .next = NEXT(NEXT_ENTRY(COMMON_UNSIGNED)), - .args = ARGS(ARGS_ENTRY(struct tunnel_ops, id)), - .call = parse_tunnel, -diff --git a/app/test-pmd/cmdline_tm.c b/app/test-pmd/cmdline_tm.c -index bfbd43ca9b..c058b8946e 100644 ---- a/app/test-pmd/cmdline_tm.c -+++ b/app/test-pmd/cmdline_tm.c -@@ -69,7 +69,7 @@ print_err_msg(struct rte_tm_error *error) - [RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_SHAPERS] - = "num shared shapers field (node params)", - [RTE_TM_ERROR_TYPE_NODE_PARAMS_WFQ_WEIGHT_MODE] -- = "wfq weght mode field (node params)", -+ = "wfq weight mode field (node params)", - [RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SP_PRIORITIES] - = "num strict priorities field (node params)", - [RTE_TM_ERROR_TYPE_NODE_PARAMS_CMAN] -@@ -479,7 +479,7 @@ static void cmd_show_port_tm_level_cap_parsed(void *parsed_result, - cmdline_parse_inst_t cmd_show_port_tm_level_cap = { - .f = cmd_show_port_tm_level_cap_parsed, - .data = NULL, -- .help_str = "Show Port TM Hierarhical level Capabilities", -+ .help_str = "Show port TM hierarchical level capabilities", - .tokens = { - (void *)&cmd_show_port_tm_level_cap_show, - (void *)&cmd_show_port_tm_level_cap_port, -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index 2aeea243b6..0177284d9c 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -796,7 +796,7 @@ pkt_copy_split(const struct rte_mbuf *pkt) - * - * The testpmd command line for this forward engine sets the flags - * TESTPMD_TX_OFFLOAD_* in ports[tx_port].tx_ol_flags. They control -- * wether a checksum must be calculated in software or in hardware. The -+ * whether a checksum must be calculated in software or in hardware. The - * IP, UDP, TCP and SCTP flags always concern the inner layer. The - * OUTER_IP is only useful for tunnel packets. - */ -diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c -index 24e03e769c..435687fa6d 100644 ---- a/app/test-pmd/parameters.c -+++ b/app/test-pmd/parameters.c -@@ -113,7 +113,7 @@ usage(char* progname) - "If the drop-queue doesn't exist, the packet is dropped. " - "By default drop-queue=127.\n"); - #ifdef RTE_LIB_LATENCYSTATS -- printf(" --latencystats=N: enable latency and jitter statistcs " -+ printf(" --latencystats=N: enable latency and jitter statistics " - "monitoring on forwarding lcore id N.\n"); - #endif - printf(" --disable-crc-strip: disable CRC stripping by hardware.\n"); -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index 66d5167f57..2be92af9f8 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -453,7 +453,7 @@ uint32_t bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF; - uint8_t latencystats_enabled; - - /* -- * Lcore ID to serive latency statistics. -+ * Lcore ID to service latency statistics. - */ - lcoreid_t latencystats_lcore_id = -1; - -diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c -index b8497e733d..e8c0c7b926 100644 ---- a/app/test-pmd/txonly.c -+++ b/app/test-pmd/txonly.c -@@ -174,14 +174,14 @@ update_pkt_header(struct rte_mbuf *pkt, uint32_t total_pkt_len) - sizeof(struct rte_ether_hdr) + - sizeof(struct rte_ipv4_hdr) + - sizeof(struct rte_udp_hdr))); -- /* updata udp pkt length */ -+ /* update UDP packet length */ - udp_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_udp_hdr *, - sizeof(struct rte_ether_hdr) + - sizeof(struct rte_ipv4_hdr)); - pkt_len = (uint16_t) (pkt_data_len + sizeof(struct rte_udp_hdr)); - udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); - -- /* updata ip pkt length and csum */ -+ /* update IP packet length and checksum */ - ip_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv4_hdr *, - sizeof(struct rte_ether_hdr)); - ip_hdr->hdr_checksum = 0; -diff --git a/app/test/test_barrier.c b/app/test/test_barrier.c -index 6d6d48749c..ec69af25bf 100644 ---- a/app/test/test_barrier.c -+++ b/app/test/test_barrier.c -@@ -11,7 +11,7 @@ - * (https://en.wikipedia.org/wiki/Peterson%27s_algorithm) - * for two execution units to make sure that rte_smp_mb() prevents - * store-load reordering to happen. -- * Also when executed on a single lcore could be used as a approxiamate -+ * Also when executed on a single lcore could be used as a approximate - * estimation of number of cycles particular implementation of rte_smp_mb() - * will take. - */ -diff --git a/app/test/test_bpf.c b/app/test/test_bpf.c -index 46bcb51f86..2d755a872f 100644 ---- a/app/test/test_bpf.c -+++ b/app/test/test_bpf.c -@@ -23,7 +23,7 @@ - /* - * Basic functional tests for librte_bpf. - * The main procedure - load eBPF program, execute it and -- * compare restuls with expected values. -+ * compare results with expected values. - */ - - struct dummy_offset { -@@ -2707,7 +2707,7 @@ test_ld_mbuf1_check(uint64_t rc, const void *arg) - } - - /* -- * same as ld_mbuf1, but then trancate the mbuf by 1B, -+ * same as ld_mbuf1, but then truncate the mbuf by 1B, - * so load of last 4B fail. - */ - static void -diff --git a/app/test/test_compressdev.c b/app/test/test_compressdev.c -index c63b5b6737..57c566aa92 100644 ---- a/app/test/test_compressdev.c -+++ b/app/test/test_compressdev.c -@@ -1256,7 +1256,7 @@ test_deflate_comp_run(const struct interim_data_params *int_data, - /* - * Store original operation index in private data, - * since ordering does not have to be maintained, -- * when dequeueing from compressdev, so a comparison -+ * when dequeuing from compressdev, so a comparison - * at the end of the test can be done. - */ - priv_data = (struct priv_op_data *) (ops[i] + 1); -diff --git a/app/test/test_cryptodev.c b/app/test/test_cryptodev.c -index 10b48cdadb..6c949605b8 100644 ---- a/app/test/test_cryptodev.c -+++ b/app/test/test_cryptodev.c -@@ -6870,7 +6870,7 @@ test_snow3g_decryption_with_digest_test_case_1(void) - } - - /* -- * Function prepare data for hash veryfication test case. -+ * Function prepare data for hash verification test case. - * Digest is allocated in 4 last bytes in plaintext, pattern. - */ - snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); -diff --git a/app/test/test_fib_perf.c b/app/test/test_fib_perf.c -index 86b2f832b8..7a25fe8df7 100644 ---- a/app/test/test_fib_perf.c -+++ b/app/test/test_fib_perf.c -@@ -346,7 +346,7 @@ test_fib_perf(void) - fib = rte_fib_create(__func__, SOCKET_ID_ANY, &config); - TEST_FIB_ASSERT(fib != NULL); - -- /* Measue add. */ -+ /* Measure add. */ - begin = rte_rdtsc(); - - for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { -diff --git a/app/test/test_kni.c b/app/test/test_kni.c -index 40ab0d5c4c..2761de9b07 100644 ---- a/app/test/test_kni.c -+++ b/app/test/test_kni.c -@@ -326,7 +326,7 @@ test_kni_register_handler_mp(void) - - /* Check with the invalid parameters */ - if (rte_kni_register_handlers(kni, NULL) == 0) { -- printf("Unexpectedly register successuflly " -+ printf("Unexpectedly register successfully " - "with NULL ops pointer\n"); - exit(-1); - } -@@ -475,7 +475,7 @@ test_kni_processing(uint16_t port_id, struct rte_mempool *mp) - - /** - * Check multiple processes support on -- * registerring/unregisterring handlers. -+ * registering/unregistering handlers. - */ - if (test_kni_register_handler_mp() < 0) { - printf("fail to check multiple process support\n"); -diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c -index a91ea8dc47..b7b97a0dd9 100644 ---- a/app/test/test_kvargs.c -+++ b/app/test/test_kvargs.c -@@ -11,7 +11,7 @@ - - #include "test.h" - --/* incrementd in handler, to check it is properly called once per -+/* incremented in handler, to check it is properly called once per - * key/value association */ - static unsigned count; - -@@ -107,14 +107,14 @@ static int test_valid_kvargs(void) - goto fail; - } - count = 0; -- /* call check_handler() for all entries with key="unexistant_key" */ -- if (rte_kvargs_process(kvlist, "unexistant_key", check_handler, NULL) < 0) { -+ /* call check_handler() for all entries with key="nonexistent_key" */ -+ if (rte_kvargs_process(kvlist, "nonexistent_key", check_handler, NULL) < 0) { - printf("rte_kvargs_process() error\n"); - rte_kvargs_free(kvlist); - goto fail; - } - if (count != 0) { -- printf("invalid count value %d after rte_kvargs_process(unexistant_key)\n", -+ printf("invalid count value %d after rte_kvargs_process(nonexistent_key)\n", - count); - rte_kvargs_free(kvlist); - goto fail; -@@ -135,10 +135,10 @@ static int test_valid_kvargs(void) - rte_kvargs_free(kvlist); - goto fail; - } -- /* count all entries with key="unexistant_key" */ -- count = rte_kvargs_count(kvlist, "unexistant_key"); -+ /* count all entries with key="nonexistent_key" */ -+ count = rte_kvargs_count(kvlist, "nonexistent_key"); - if (count != 0) { -- printf("invalid count value %d after rte_kvargs_count(unexistant_key)\n", -+ printf("invalid count value %d after rte_kvargs_count(nonexistent_key)\n", - count); - rte_kvargs_free(kvlist); - goto fail; -@@ -156,7 +156,7 @@ static int test_valid_kvargs(void) - /* call check_handler() on all entries with key="check", it - * should fail as the value is not recognized by the handler */ - if (rte_kvargs_process(kvlist, "check", check_handler, NULL) == 0) { -- printf("rte_kvargs_process() is success bu should not\n"); -+ printf("rte_kvargs_process() is success but should not\n"); - rte_kvargs_free(kvlist); - goto fail; - } -diff --git a/app/test/test_lpm6_data.h b/app/test/test_lpm6_data.h -index c3894f730e..da9b161f20 100644 ---- a/app/test/test_lpm6_data.h -+++ b/app/test/test_lpm6_data.h -@@ -22,7 +22,7 @@ struct ips_tbl_entry { - * in previous test_lpm6_routes.h . Because this table has only 1000 - * lines, keeping it doesn't make LPM6 test case so large and also - * make the algorithm to generate rule table unnecessary and the -- * algorithm to genertate test input IPv6 and associated expected -+ * algorithm to generate test input IPv6 and associated expected - * next_hop much simple. - */ - -diff --git a/app/test/test_member.c b/app/test/test_member.c -index 40aa4c8627..af9d50915c 100644 ---- a/app/test/test_member.c -+++ b/app/test/test_member.c -@@ -459,7 +459,7 @@ static int test_member_multimatch(void) - MAX_MATCH, set_ids_cache); - /* - * For cache mode, keys overwrite when signature same. -- * the mutimatch should work like single match. -+ * the multimatch should work like single match. - */ - TEST_ASSERT(ret_ht == M_MATCH_CNT && ret_vbf == M_MATCH_CNT && - ret_cache == 1, -diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c -index f6c650d11f..8e493eda47 100644 ---- a/app/test/test_mempool.c -+++ b/app/test/test_mempool.c -@@ -304,7 +304,7 @@ static int test_mempool_single_consumer(void) - } - - /* -- * test function for mempool test based on singple consumer and single producer, -+ * test function for mempool test based on single consumer and single producer, - * can run on one lcore only - */ - static int -@@ -322,7 +322,7 @@ my_mp_init(struct rte_mempool *mp, __rte_unused void *arg) - } - - /* -- * it tests the mempool operations based on singple producer and single consumer -+ * it tests the mempool operations based on single producer and single consumer - */ - static int - test_mempool_sp_sc(void) -diff --git a/app/test/test_memzone.c b/app/test/test_memzone.c -index 6ddd0fbab5..c9255e5763 100644 ---- a/app/test/test_memzone.c -+++ b/app/test/test_memzone.c -@@ -543,7 +543,7 @@ test_memzone_reserve_max(void) - } - - if (mz->len != maxlen) { -- printf("Memzone reserve with 0 size did not return bigest block\n"); -+ printf("Memzone reserve with 0 size did not return biggest block\n"); - printf("Expected size = %zu, actual size = %zu\n", - maxlen, mz->len); - rte_dump_physmem_layout(stdout); -@@ -606,7 +606,7 @@ test_memzone_reserve_max_aligned(void) - - if (mz->len < minlen || mz->len > maxlen) { - printf("Memzone reserve with 0 size and alignment %u did not return" -- " bigest block\n", align); -+ " biggest block\n", align); - printf("Expected size = %zu-%zu, actual size = %zu\n", - minlen, maxlen, mz->len); - rte_dump_physmem_layout(stdout); -@@ -1054,7 +1054,7 @@ test_memzone_basic(void) - if (mz != memzone1) - return -1; - -- printf("test duplcate zone name\n"); -+ printf("test duplicate zone name\n"); - mz = rte_memzone_reserve(TEST_MEMZONE_NAME("testzone1"), 100, - SOCKET_ID_ANY, 0); - if (mz != NULL) -diff --git a/app/test/test_metrics.c b/app/test/test_metrics.c -index e736019ae4..11222133d0 100644 ---- a/app/test/test_metrics.c -+++ b/app/test/test_metrics.c -@@ -121,7 +121,7 @@ test_metrics_update_value(void) - err = rte_metrics_update_value(RTE_METRICS_GLOBAL, KEY, VALUE); - TEST_ASSERT(err >= 0, "%s, %d", __func__, __LINE__); - -- /* Successful Test: Valid port_id otherthan RTE_METRICS_GLOBAL, key -+ /* Successful Test: Valid port_id other than RTE_METRICS_GLOBAL, key - * and value - */ - err = rte_metrics_update_value(9, KEY, VALUE); -diff --git a/app/test/test_pcapng.c b/app/test/test_pcapng.c -index c2dbeaf603..34c5e12346 100644 ---- a/app/test/test_pcapng.c -+++ b/app/test/test_pcapng.c -@@ -109,7 +109,7 @@ test_setup(void) - return -1; - } - -- /* Make a pool for cloned packeets */ -+ /* Make a pool for cloned packets */ - mp = rte_pktmbuf_pool_create_by_ops("pcapng_test_pool", NUM_PACKETS, - 0, 0, - rte_pcapng_mbuf_size(pkt_len), -diff --git a/app/test/test_power_cpufreq.c b/app/test/test_power_cpufreq.c -index 1a9549527e..4d013cd7bb 100644 ---- a/app/test/test_power_cpufreq.c -+++ b/app/test/test_power_cpufreq.c -@@ -659,7 +659,7 @@ test_power_cpufreq(void) - /* test of exit power management for an invalid lcore */ - ret = rte_power_exit(TEST_POWER_LCORE_INVALID); - if (ret == 0) { -- printf("Unpectedly exit power management successfully for " -+ printf("Unexpectedly exit power management successfully for " - "lcore %u\n", TEST_POWER_LCORE_INVALID); - rte_power_unset_env(); - return -1; -diff --git a/app/test/test_rcu_qsbr.c b/app/test/test_rcu_qsbr.c -index ab37a068cd..70404e89e6 100644 ---- a/app/test/test_rcu_qsbr.c -+++ b/app/test/test_rcu_qsbr.c -@@ -408,7 +408,7 @@ test_rcu_qsbr_synchronize_reader(void *arg) - - /* - * rte_rcu_qsbr_synchronize: Wait till all the reader threads have entered -- * the queiscent state. -+ * the quiescent state. - */ - static int - test_rcu_qsbr_synchronize(void) -@@ -443,7 +443,7 @@ test_rcu_qsbr_synchronize(void) - rte_rcu_qsbr_synchronize(t[0], RTE_MAX_LCORE - 1); - rte_rcu_qsbr_thread_offline(t[0], RTE_MAX_LCORE - 1); - -- /* Test if the API returns after unregisterng all the threads */ -+ /* Test if the API returns after unregistering all the threads */ - for (i = 0; i < RTE_MAX_LCORE; i++) - rte_rcu_qsbr_thread_unregister(t[0], i); - rte_rcu_qsbr_synchronize(t[0], RTE_QSBR_THRID_INVALID); -diff --git a/app/test/test_red.c b/app/test/test_red.c -index 05936cfee8..33a9f4ebb7 100644 ---- a/app/test/test_red.c -+++ b/app/test/test_red.c -@@ -1566,10 +1566,10 @@ static void ovfl_check_avg(uint32_t avg) - } - - static struct test_config ovfl_test1_config = { -- .ifname = "queue avergage overflow test interface", -+ .ifname = "queue average overflow test interface", - .msg = "overflow test 1 : use one RED configuration,\n" - " increase average queue size to target level,\n" -- " check maximum number of bits requirte_red to represent avg_s\n\n", -+ " check maximum number of bits required to represent avg_s\n\n", - .htxt = "avg queue size " - "wq_log2 " - "fraction bits " -@@ -1757,12 +1757,12 @@ test_invalid_parameters(void) - printf("%i: rte_red_config_init should have failed!\n", __LINE__); - return -1; - } -- /* min_treshold == max_treshold */ -+ /* min_threshold == max_threshold */ - if (rte_red_config_init(&config, 0, 1, 1, 0) == 0) { - printf("%i: rte_red_config_init should have failed!\n", __LINE__); - return -1; - } -- /* min_treshold > max_treshold */ -+ /* min_threshold > max_threshold */ - if (rte_red_config_init(&config, 0, 2, 1, 0) == 0) { - printf("%i: rte_red_config_init should have failed!\n", __LINE__); - return -1; -diff --git a/app/test/test_security.c b/app/test/test_security.c -index 060cf1ffa8..059731b65d 100644 ---- a/app/test/test_security.c -+++ b/app/test/test_security.c -@@ -237,7 +237,7 @@ - * increases .called counter. Function returns value stored in .ret field - * of the structure. - * In case of some parameters in some functions the expected value is unknown -- * and cannot be detrmined prior to call. Such parameters are stored -+ * and cannot be determined prior to call. Such parameters are stored - * in structure and can be compared or analyzed later in test case code. - * - * Below structures and functions follow the rules just described. -diff --git a/app/test/test_table_pipeline.c b/app/test/test_table_pipeline.c -index aabf4375db..915c451fed 100644 ---- a/app/test/test_table_pipeline.c -+++ b/app/test/test_table_pipeline.c -@@ -364,7 +364,7 @@ setup_pipeline(int test_type) - .action = RTE_PIPELINE_ACTION_PORT, - {.port_id = port_out_id[i^1]}, - }; -- printf("Setting secont table to output to port\n"); -+ printf("Setting second table to output to port\n"); - - /* Add the default action for the table. */ - ret = rte_pipeline_table_default_entry_add(p, -diff --git a/app/test/test_thash.c b/app/test/test_thash.c -index a62530673f..62ba4a9528 100644 ---- a/app/test/test_thash.c -+++ b/app/test/test_thash.c -@@ -684,7 +684,7 @@ test_predictable_rss_multirange(void) - - /* - * calculate hashes, complements, then adjust keys with -- * complements and recalsulate hashes -+ * complements and recalculate hashes - */ - for (i = 0; i < RTE_DIM(rng_arr); i++) { - for (k = 0; k < 100; k++) { -diff --git a/buildtools/binutils-avx512-check.py b/buildtools/binutils-avx512-check.py -index a4e14f3593..57392ecdc8 100644 ---- a/buildtools/binutils-avx512-check.py -+++ b/buildtools/binutils-avx512-check.py -@@ -1,5 +1,5 @@ - #! /usr/bin/env python3 --# SPDX-License-Identitifer: BSD-3-Clause -+# SPDX-License-Identifier: BSD-3-Clause - # Copyright(c) 2020 Intel Corporation - - import subprocess -diff --git a/devtools/check-symbol-change.sh b/devtools/check-symbol-change.sh -index 8fcd0ce1a1..8992214ac8 100755 ---- a/devtools/check-symbol-change.sh -+++ b/devtools/check-symbol-change.sh -@@ -25,7 +25,7 @@ build_map_changes() - - # Triggering this rule, which starts a line and ends it - # with a { identifies a versioned section. The section name is -- # the rest of the line with the + and { symbols remvoed. -+ # the rest of the line with the + and { symbols removed. - # Triggering this rule sets in_sec to 1, which actives the - # symbol rule below - /^.*{/ { -@@ -35,7 +35,7 @@ build_map_changes() - } - } - -- # This rule idenfies the end of a section, and disables the -+ # This rule identifies the end of a section, and disables the - # symbol rule - /.*}/ {in_sec=0} - -@@ -100,7 +100,7 @@ check_for_rule_violations() - # Just inform the user of this occurrence, but - # don't flag it as an error - echo -n "INFO: symbol $symname is added but " -- echo -n "patch has insuficient context " -+ echo -n "patch has insufficient context " - echo -n "to determine the section name " - echo -n "please ensure the version is " - echo "EXPERIMENTAL" -diff --git a/doc/guides/howto/img/virtio_user_for_container_networking.svg b/doc/guides/howto/img/virtio_user_for_container_networking.svg -index de80806649..dc9b318e7e 100644 ---- a/doc/guides/howto/img/virtio_user_for_container_networking.svg -+++ b/doc/guides/howto/img/virtio_user_for_container_networking.svg -@@ -465,7 +465,7 @@ - v:mID="63" - id="shape63-63">Sheet.63Contanier/AppContainer/Appoffse offset offse offset = 4.5.** - -- The mmaping of the iomem range of the PCI device fails for kernels that -+ The mmapping of the iomem range of the PCI device fails for kernels that - enabled the ``CONFIG_IO_STRICT_DEVMEM`` option. The error seen by the - user is as similar to the following:: - -diff --git a/doc/guides/rel_notes/release_17_08.rst b/doc/guides/rel_notes/release_17_08.rst -index 25439dad45..1fd1755858 100644 ---- a/doc/guides/rel_notes/release_17_08.rst -+++ b/doc/guides/rel_notes/release_17_08.rst -@@ -232,7 +232,7 @@ API Changes - * The ``rte_cryptodev_configure()`` function does not create the session - mempool for the device anymore. - * The ``rte_cryptodev_queue_pair_attach_sym_session()`` and -- ``rte_cryptodev_queue_pair_dettach_sym_session()`` functions require -+ ``rte_cryptodev_queue_pair_detach_sym_session()`` functions require - the new parameter ``device id``. - * Parameters of ``rte_cryptodev_sym_session_create()`` were modified to - accept ``mempool``, instead of ``device id`` and ``rte_crypto_sym_xform``. -diff --git a/doc/guides/rel_notes/release_2_1.rst b/doc/guides/rel_notes/release_2_1.rst -index 35e6c88884..d0ad99ebce 100644 ---- a/doc/guides/rel_notes/release_2_1.rst -+++ b/doc/guides/rel_notes/release_2_1.rst -@@ -671,7 +671,7 @@ Resolved Issues - value 0. - - -- Fixes: 40b966a211ab ("ivshmem: library changes for mmaping using ivshmem") -+ Fixes: 40b966a211ab ("ivshmem: library changes for mmapping using ivshmem") - - - * **ixgbe/base: Fix SFP probing.** -diff --git a/doc/guides/sample_app_ug/ip_reassembly.rst b/doc/guides/sample_app_ug/ip_reassembly.rst -index 06289c2248..5280bf4ea0 100644 ---- a/doc/guides/sample_app_ug/ip_reassembly.rst -+++ b/doc/guides/sample_app_ug/ip_reassembly.rst -@@ -154,8 +154,8 @@ each RX queue uses its own mempool. - - .. literalinclude:: ../../../examples/ip_reassembly/main.c - :language: c -- :start-after: mbufs stored int the gragment table. 8< -- :end-before: >8 End of mbufs stored int the fragmentation table. -+ :start-after: mbufs stored in the fragment table. 8< -+ :end-before: >8 End of mbufs stored in the fragmentation table. - :dedent: 1 - - Packet Reassembly and Forwarding -diff --git a/doc/guides/sample_app_ug/l2_forward_cat.rst b/doc/guides/sample_app_ug/l2_forward_cat.rst -index 440642ef7c..3ada3575ba 100644 ---- a/doc/guides/sample_app_ug/l2_forward_cat.rst -+++ b/doc/guides/sample_app_ug/l2_forward_cat.rst -@@ -176,7 +176,7 @@ function. The value returned is the number of parsed arguments: - .. literalinclude:: ../../../examples/l2fwd-cat/l2fwd-cat.c - :language: c - :start-after: Initialize the Environment Abstraction Layer (EAL). 8< -- :end-before: >8 End of initializion the Environment Abstraction Layer (EAL). -+ :end-before: >8 End of initialization the Environment Abstraction Layer (EAL). - :dedent: 1 - - The next task is to initialize the PQoS library and configure CAT. The -diff --git a/doc/guides/sample_app_ug/server_node_efd.rst b/doc/guides/sample_app_ug/server_node_efd.rst -index 605eb09a61..c6cbc3def6 100644 ---- a/doc/guides/sample_app_ug/server_node_efd.rst -+++ b/doc/guides/sample_app_ug/server_node_efd.rst -@@ -191,7 +191,7 @@ flow is not handled by the node. - .. literalinclude:: ../../../examples/server_node_efd/node/node.c - :language: c - :start-after: Packets dequeued from the shared ring. 8< -- :end-before: >8 End of packets dequeueing. -+ :end-before: >8 End of packets dequeuing. - - Finally, note that both processes updates statistics, such as transmitted, received - and dropped packets, which are shown and refreshed by the server app. -diff --git a/doc/guides/sample_app_ug/skeleton.rst b/doc/guides/sample_app_ug/skeleton.rst -index 6d0de64401..08ddd7aa59 100644 ---- a/doc/guides/sample_app_ug/skeleton.rst -+++ b/doc/guides/sample_app_ug/skeleton.rst -@@ -54,7 +54,7 @@ function. The value returned is the number of parsed arguments: - .. literalinclude:: ../../../examples/skeleton/basicfwd.c - :language: c - :start-after: Initializion the Environment Abstraction Layer (EAL). 8< -- :end-before: >8 End of initializion the Environment Abstraction Layer (EAL). -+ :end-before: >8 End of initialization the Environment Abstraction Layer (EAL). - :dedent: 1 - - -diff --git a/doc/guides/sample_app_ug/vm_power_management.rst b/doc/guides/sample_app_ug/vm_power_management.rst -index 7160b6a63a..9ce87956c9 100644 ---- a/doc/guides/sample_app_ug/vm_power_management.rst -+++ b/doc/guides/sample_app_ug/vm_power_management.rst -@@ -681,7 +681,7 @@ The following is an example JSON string for a power management request. - "resource_id": 10 - }} - --To query the available frequences of an lcore, use the query_cpu_freq command. -+To query the available frequencies of an lcore, use the query_cpu_freq command. - Where {core_num} is the lcore to query. - Before using this command, please enable responses via the set_query command on the host. - -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index 44228cd7d2..94792d88cc 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -3510,7 +3510,7 @@ Tunnel offload - Indicate tunnel offload rule type - - - ``tunnel_set {tunnel_id}``: mark rule as tunnel offload decap_set type. --- ``tunnel_match {tunnel_id}``: mark rule as tunel offload match type. -+- ``tunnel_match {tunnel_id}``: mark rule as tunnel offload match type. - - Matching pattern - ^^^^^^^^^^^^^^^^ -diff --git a/drivers/baseband/fpga_lte_fec/fpga_lte_fec.c b/drivers/baseband/fpga_lte_fec/fpga_lte_fec.c -index 92decc3e05..21d35292a3 100644 ---- a/drivers/baseband/fpga_lte_fec/fpga_lte_fec.c -+++ b/drivers/baseband/fpga_lte_fec/fpga_lte_fec.c -@@ -2097,7 +2097,7 @@ dequeue_enc_one_op_cb(struct fpga_queue *q, struct rte_bbdev_enc_op **op, - rte_bbdev_log_debug("DMA response desc %p", desc); - - *op = desc->enc_req.op_addr; -- /* Check the decriptor error field, return 1 on error */ -+ /* Check the descriptor error field, return 1 on error */ - desc_error = check_desc_error(desc->enc_req.error); - (*op)->status = desc_error << RTE_BBDEV_DATA_ERROR; - -@@ -2139,7 +2139,7 @@ dequeue_enc_one_op_tb(struct fpga_queue *q, struct rte_bbdev_enc_op **op, - for (cb_idx = 0; cb_idx < cbs_in_op; ++cb_idx) { - desc = q->ring_addr + ((q->head_free_desc + desc_offset + - cb_idx) & q->sw_ring_wrap_mask); -- /* Check the decriptor error field, return 1 on error */ -+ /* Check the descriptor error field, return 1 on error */ - desc_error = check_desc_error(desc->enc_req.error); - status |= desc_error << RTE_BBDEV_DATA_ERROR; - rte_bbdev_log_debug("DMA response desc %p", desc); -@@ -2177,7 +2177,7 @@ dequeue_dec_one_op_cb(struct fpga_queue *q, struct rte_bbdev_dec_op **op, - (*op)->turbo_dec.iter_count = (desc->dec_req.iter + 2) >> 1; - /* crc_pass = 0 when decoder fails */ - (*op)->status = !(desc->dec_req.crc_pass) << RTE_BBDEV_CRC_ERROR; -- /* Check the decriptor error field, return 1 on error */ -+ /* Check the descriptor error field, return 1 on error */ - desc_error = check_desc_error(desc->enc_req.error); - (*op)->status |= desc_error << RTE_BBDEV_DATA_ERROR; - return 1; -@@ -2221,7 +2221,7 @@ dequeue_dec_one_op_tb(struct fpga_queue *q, struct rte_bbdev_dec_op **op, - iter_count = RTE_MAX(iter_count, (uint8_t) desc->dec_req.iter); - /* crc_pass = 0 when decoder fails, one fails all */ - status |= !(desc->dec_req.crc_pass) << RTE_BBDEV_CRC_ERROR; -- /* Check the decriptor error field, return 1 on error */ -+ /* Check the descriptor error field, return 1 on error */ - desc_error = check_desc_error(desc->enc_req.error); - status |= desc_error << RTE_BBDEV_DATA_ERROR; - rte_bbdev_log_debug("DMA response desc %p", desc); -diff --git a/drivers/baseband/null/bbdev_null.c b/drivers/baseband/null/bbdev_null.c -index 753d920e18..08cff582b9 100644 ---- a/drivers/baseband/null/bbdev_null.c -+++ b/drivers/baseband/null/bbdev_null.c -@@ -31,7 +31,7 @@ struct bbdev_null_params { - uint16_t queues_num; /*< Null BBDEV queues number */ - }; - --/* Accecptable params for null BBDEV devices */ -+/* Acceptable params for null BBDEV devices */ - #define BBDEV_NULL_MAX_NB_QUEUES_ARG "max_nb_queues" - #define BBDEV_NULL_SOCKET_ID_ARG "socket_id" - -diff --git a/drivers/baseband/turbo_sw/bbdev_turbo_software.c b/drivers/baseband/turbo_sw/bbdev_turbo_software.c -index b234bb751a..c6b1eb8679 100644 ---- a/drivers/baseband/turbo_sw/bbdev_turbo_software.c -+++ b/drivers/baseband/turbo_sw/bbdev_turbo_software.c -@@ -61,7 +61,7 @@ struct turbo_sw_params { - uint16_t queues_num; /*< Turbo SW device queues number */ - }; - --/* Accecptable params for Turbo SW devices */ -+/* Acceptable params for Turbo SW devices */ - #define TURBO_SW_MAX_NB_QUEUES_ARG "max_nb_queues" - #define TURBO_SW_SOCKET_ID_ARG "socket_id" - -diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c -index 737ac8d8c5..5546a9cb8d 100644 ---- a/drivers/bus/dpaa/dpaa_bus.c -+++ b/drivers/bus/dpaa/dpaa_bus.c -@@ -70,7 +70,7 @@ compare_dpaa_devices(struct rte_dpaa_device *dev1, - { - int comp = 0; - -- /* Segragating ETH from SEC devices */ -+ /* Segregating ETH from SEC devices */ - if (dev1->device_type > dev2->device_type) - comp = 1; - else if (dev1->device_type < dev2->device_type) -diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h -index 7ef2f3b2e3..9b63e559bc 100644 ---- a/drivers/bus/dpaa/include/fsl_qman.h -+++ b/drivers/bus/dpaa/include/fsl_qman.h -@@ -1353,7 +1353,7 @@ __rte_internal - int qman_irqsource_add(u32 bits); - - /** -- * qman_fq_portal_irqsource_add - samilar to qman_irqsource_add, but it -+ * qman_fq_portal_irqsource_add - similar to qman_irqsource_add, but it - * takes portal (fq specific) as input rather than using the thread affined - * portal. - */ -@@ -1416,7 +1416,7 @@ __rte_internal - struct qm_dqrr_entry *qman_dequeue(struct qman_fq *fq); - - /** -- * qman_dqrr_consume - Consume the DQRR entriy after volatile dequeue -+ * qman_dqrr_consume - Consume the DQRR entry after volatile dequeue - * @fq: Frame Queue on which the volatile dequeue command is issued - * @dq: DQRR entry to consume. This is the one which is provided by the - * 'qbman_dequeue' command. -@@ -2017,7 +2017,7 @@ int qman_create_cgr_to_dcp(struct qman_cgr *cgr, u32 flags, u16 dcp_portal, - * @cgr: the 'cgr' object to deregister - * - * "Unplugs" this CGR object from the portal affine to the cpu on which this API -- * is executed. This must be excuted on the same affine portal on which it was -+ * is executed. This must be executed on the same affine portal on which it was - * created. - */ - __rte_internal -diff --git a/drivers/bus/dpaa/include/fsl_usd.h b/drivers/bus/dpaa/include/fsl_usd.h -index dcf35e4adb..97279421ad 100644 ---- a/drivers/bus/dpaa/include/fsl_usd.h -+++ b/drivers/bus/dpaa/include/fsl_usd.h -@@ -40,7 +40,7 @@ struct dpaa_raw_portal { - /* Specifies the stash request queue this portal should use */ - uint8_t sdest; - -- /* Specifes a specific portal index to map or QBMAN_ANY_PORTAL_IDX -+ /* Specifies a specific portal index to map or QBMAN_ANY_PORTAL_IDX - * for don't care. The portal index will be populated by the - * driver when the ioctl() successfully completes. - */ -diff --git a/drivers/bus/dpaa/include/process.h b/drivers/bus/dpaa/include/process.h -index a922988607..48d6b5693f 100644 ---- a/drivers/bus/dpaa/include/process.h -+++ b/drivers/bus/dpaa/include/process.h -@@ -49,7 +49,7 @@ struct dpaa_portal_map { - struct dpaa_ioctl_portal_map { - /* Input parameter, is a qman or bman portal required. */ - enum dpaa_portal_type type; -- /* Specifes a specific portal index to map or 0xffffffff -+ /* Specifies a specific portal index to map or 0xffffffff - * for don't care. - */ - uint32_t index; -diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c -index a0ef24cdc8..53fd75539e 100644 ---- a/drivers/bus/fslmc/fslmc_bus.c -+++ b/drivers/bus/fslmc/fslmc_bus.c -@@ -539,7 +539,7 @@ rte_fslmc_driver_unregister(struct rte_dpaa2_driver *driver) - - fslmc_bus = driver->fslmc_bus; - -- /* Cleanup the PA->VA Translation table; From whereever this function -+ /* Cleanup the PA->VA Translation table; From wherever this function - * is called from. - */ - if (rte_eal_iova_mode() == RTE_IOVA_PA) -diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c -index 2210a0fa4a..52605ea2c3 100644 ---- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c -+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c -@@ -178,7 +178,7 @@ static int dpaa2_dpio_intr_init(struct dpaa2_dpio_dev *dpio_dev) - dpio_epoll_fd = epoll_create(1); - ret = rte_dpaa2_intr_enable(dpio_dev->intr_handle, 0); - if (ret) { -- DPAA2_BUS_ERR("Interrupt registeration failed"); -+ DPAA2_BUS_ERR("Interrupt registration failed"); - return -1; - } - -diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h -index b1bba1ac36..957fc62d4c 100644 ---- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h -+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h -@@ -156,7 +156,7 @@ struct dpaa2_queue { - struct rte_cryptodev_data *crypto_data; - }; - uint32_t fqid; /*!< Unique ID of this queue */ -- uint16_t flow_id; /*!< To be used by DPAA2 frmework */ -+ uint16_t flow_id; /*!< To be used by DPAA2 framework */ - uint8_t tc_index; /*!< traffic class identifier */ - uint8_t cgid; /*! < Congestion Group id for this queue */ - uint64_t rx_pkts; -diff --git a/drivers/bus/fslmc/qbman/include/fsl_qbman_portal.h b/drivers/bus/fslmc/qbman/include/fsl_qbman_portal.h -index eb68c9cab5..5375ea386d 100644 ---- a/drivers/bus/fslmc/qbman/include/fsl_qbman_portal.h -+++ b/drivers/bus/fslmc/qbman/include/fsl_qbman_portal.h -@@ -510,7 +510,7 @@ int qbman_result_has_new_result(struct qbman_swp *s, - struct qbman_result *dq); - - /** -- * qbman_check_command_complete() - Check if the previous issued dq commnd -+ * qbman_check_command_complete() - Check if the previous issued dq command - * is completed and results are available in memory. - * @s: the software portal object. - * @dq: the dequeue result read from the memory. -@@ -687,7 +687,7 @@ uint16_t qbman_result_DQ_seqnum(const struct qbman_result *dq); - - /** - * qbman_result_DQ_odpid() - Get the seqnum field in dequeue response -- * odpid is valid only if ODPVAILD flag is TRUE. -+ * odpid is valid only if ODPVALID flag is TRUE. - * @dq: the dequeue result. - * - * Return odpid. -@@ -743,7 +743,7 @@ const struct qbman_fd *qbman_result_DQ_fd(const struct qbman_result *dq); - * qbman_result_SCN_state() - Get the state field in State-change notification - * @scn: the state change notification. - * -- * Return the state in the notifiation. -+ * Return the state in the notification. - */ - __rte_internal - uint8_t qbman_result_SCN_state(const struct qbman_result *scn); -@@ -825,7 +825,7 @@ uint64_t qbman_result_bpscn_ctx(const struct qbman_result *scn); - - /* Parsing CGCU */ - /** -- * qbman_result_cgcu_cgid() - Check CGCU resouce id, i.e. cgid -+ * qbman_result_cgcu_cgid() - Check CGCU resource id, i.e. cgid - * @scn: the state change notification. - * - * Return the CGCU resource id. -@@ -903,14 +903,14 @@ void qbman_eq_desc_clear(struct qbman_eq_desc *d); - __rte_internal - void qbman_eq_desc_set_no_orp(struct qbman_eq_desc *d, int respond_success); - /** -- * qbman_eq_desc_set_orp() - Set order-resotration in the enqueue descriptor -+ * qbman_eq_desc_set_orp() - Set order-restoration in the enqueue descriptor - * @d: the enqueue descriptor. - * @response_success: 1 = enqueue with response always; 0 = enqueue with - * rejections returned on a FQ. - * @opr_id: the order point record id. - * @seqnum: the order restoration sequence number. -- * @incomplete: indiates whether this is the last fragments using the same -- * sequeue number. -+ * @incomplete: indicates whether this is the last fragments using the same -+ * sequence number. - */ - __rte_internal - void qbman_eq_desc_set_orp(struct qbman_eq_desc *d, int respond_success, -@@ -1052,10 +1052,10 @@ __rte_internal - uint8_t qbman_result_eqresp_rspid(struct qbman_result *eqresp); - - /** -- * qbman_result_eqresp_rc() - determines if enqueue command is sucessful. -+ * qbman_result_eqresp_rc() - determines if enqueue command is successful. - * @eqresp: enqueue response. - * -- * Return 0 when command is sucessful. -+ * Return 0 when command is successful. - */ - __rte_internal - uint8_t qbman_result_eqresp_rc(struct qbman_result *eqresp); -@@ -1250,7 +1250,7 @@ int qbman_swp_fq_force(struct qbman_swp *s, uint32_t fqid); - /** - * These functions change the FQ flow-control stuff between XON/XOFF. (The - * default is XON.) This setting doesn't affect enqueues to the FQ, just -- * dequeues. XOFF FQs will remain in the tenatively-scheduled state, even when -+ * dequeues. XOFF FQs will remain in the tentatively-scheduled state, even when - * non-empty, meaning they won't be selected for scheduled dequeuing. If a FQ is - * changed to XOFF after it had already become truly-scheduled to a channel, and - * a pull dequeue of that channel occurs that selects that FQ for dequeuing, -diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c -index 1a5e7c2d2a..cd0d0b1670 100644 ---- a/drivers/bus/pci/linux/pci_vfio.c -+++ b/drivers/bus/pci/linux/pci_vfio.c -@@ -815,7 +815,7 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) - continue; - } - -- /* skip non-mmapable BARs */ -+ /* skip non-mmappable BARs */ - if ((reg->flags & VFIO_REGION_INFO_FLAG_MMAP) == 0) { - free(reg); - continue; -diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h -index 2856799953..5af6be009f 100644 ---- a/drivers/bus/vdev/rte_bus_vdev.h -+++ b/drivers/bus/vdev/rte_bus_vdev.h -@@ -197,7 +197,7 @@ rte_vdev_remove_custom_scan(rte_vdev_scan_callback callback, void *user_arg); - int rte_vdev_init(const char *name, const char *args); - - /** -- * Uninitalize a driver specified by name. -+ * Uninitialize a driver specified by name. - * - * @param name - * The pointer to a driver name to be uninitialized. -diff --git a/drivers/bus/vmbus/vmbus_common.c b/drivers/bus/vmbus/vmbus_common.c -index 519ca9c6fe..367727367e 100644 ---- a/drivers/bus/vmbus/vmbus_common.c -+++ b/drivers/bus/vmbus/vmbus_common.c -@@ -134,7 +134,7 @@ vmbus_probe_one_driver(struct rte_vmbus_driver *dr, - - /* - * If device class GUID matches, call the probe function of -- * registere drivers for the vmbus device. -+ * register drivers for the vmbus device. - * Return -1 if initialization failed, - * and 1 if no driver found for this device. - */ -diff --git a/drivers/common/cnxk/roc_bphy_cgx.c b/drivers/common/cnxk/roc_bphy_cgx.c -index 7449cbe77a..c3be3c9041 100644 ---- a/drivers/common/cnxk/roc_bphy_cgx.c -+++ b/drivers/common/cnxk/roc_bphy_cgx.c -@@ -14,7 +14,7 @@ - #define CGX_CMRX_INT_OVERFLW BIT_ULL(1) - /* - * CN10K stores number of lmacs in 4 bit filed -- * in contraty to CN9K which uses only 3 bits. -+ * in contrary to CN9K which uses only 3 bits. - * - * In theory masks should differ yet on CN9K - * bits beyond specified range contain zeros. -diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c -index 6996a54be0..4941f62995 100644 ---- a/drivers/common/cnxk/roc_nix_bpf.c -+++ b/drivers/common/cnxk/roc_nix_bpf.c -@@ -138,7 +138,7 @@ nix_lf_bpf_dump(__io struct nix_band_prof_s *bpf) - { - plt_dump("W0: cir_mantissa \t\t\t%d\nW0: pebs_mantissa \t\t\t0x%03x", - bpf->cir_mantissa, bpf->pebs_mantissa); -- plt_dump("W0: peir_matissa \t\t\t\t%d\nW0: cbs_exponent \t\t\t%d", -+ plt_dump("W0: peir_mantissa \t\t\t\t%d\nW0: cbs_exponent \t\t\t%d", - bpf->peir_mantissa, bpf->cbs_exponent); - plt_dump("W0: cir_exponent \t\t\t%d\nW0: pebs_exponent \t\t\t%d", - bpf->cir_exponent, bpf->pebs_exponent); -diff --git a/drivers/common/cnxk/roc_nix_tm_ops.c b/drivers/common/cnxk/roc_nix_tm_ops.c -index 3257fa67c7..3d81247a12 100644 ---- a/drivers/common/cnxk/roc_nix_tm_ops.c -+++ b/drivers/common/cnxk/roc_nix_tm_ops.c -@@ -107,7 +107,7 @@ nix_tm_adjust_shaper_pps_rate(struct nix_tm_shaper_profile *profile) - if (profile->peak.rate && min_rate > profile->peak.rate) - min_rate = profile->peak.rate; - -- /* Each packet accomulate single count, whereas HW -+ /* Each packet accumulate single count, whereas HW - * considers each unit as Byte, so we need convert - * user pps to bps - */ -diff --git a/drivers/common/cnxk/roc_npc_mcam.c b/drivers/common/cnxk/roc_npc_mcam.c -index ba7f89b45b..82014a2ca0 100644 ---- a/drivers/common/cnxk/roc_npc_mcam.c -+++ b/drivers/common/cnxk/roc_npc_mcam.c -@@ -234,7 +234,7 @@ npc_get_kex_capability(struct npc *npc) - /* Ethtype: Offset 12B, len 2B */ - kex_cap.bit.ethtype_0 = npc_is_kex_enabled( - npc, NPC_LID_LA, NPC_LT_LA_ETHER, 12 * 8, 2 * 8); -- /* QINQ VLAN Ethtype: ofset 8B, len 2B */ -+ /* QINQ VLAN Ethtype: offset 8B, len 2B */ - kex_cap.bit.ethtype_x = npc_is_kex_enabled( - npc, NPC_LID_LB, NPC_LT_LB_STAG_QINQ, 8 * 8, 2 * 8); - /* VLAN ID0 : Outer VLAN: Offset 2B, len 2B */ -diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h -index 712302bc5c..74e0fb2ece 100644 ---- a/drivers/common/cnxk/roc_npc_priv.h -+++ b/drivers/common/cnxk/roc_npc_priv.h -@@ -363,7 +363,7 @@ struct npc { - uint32_t rss_grps; /* rss groups supported */ - uint16_t flow_prealloc_size; /* Pre allocated mcam size */ - uint16_t flow_max_priority; /* Max priority for flow */ -- uint16_t switch_header_type; /* Suppprted switch header type */ -+ uint16_t switch_header_type; /* Supported switch header type */ - uint32_t mark_actions; /* Number of mark actions */ - uint32_t vtag_strip_actions; /* vtag insert/strip actions */ - uint16_t pf_func; /* pf_func of device */ -diff --git a/drivers/common/cpt/cpt_ucode.h b/drivers/common/cpt/cpt_ucode.h -index e015cf66a1..e1f2f6005d 100644 ---- a/drivers/common/cpt/cpt_ucode.h -+++ b/drivers/common/cpt/cpt_ucode.h -@@ -246,7 +246,7 @@ cpt_fc_ciph_set_key(struct cpt_ctx *cpt_ctx, cipher_type_t type, - if (cpt_ctx->fc_type == FC_GEN) { - /* - * We need to always say IV is from DPTR as user can -- * sometimes iverride IV per operation. -+ * sometimes override IV per operation. - */ - fctx->enc.iv_source = CPT_FROM_DPTR; - -@@ -3035,7 +3035,7 @@ prepare_iov_from_pkt_inplace(struct rte_mbuf *pkt, - tailroom = rte_pktmbuf_tailroom(pkt); - if (likely((headroom >= 24) && - (tailroom >= 8))) { -- /* In 83XX this is prerequivisit for Direct mode */ -+ /* In 83XX this is prerequisite for Direct mode */ - *flags |= SINGLE_BUF_HEADTAILROOM; - } - param->bufs[0].vaddr = seg_data; -diff --git a/drivers/common/cpt/cpt_ucode_asym.h b/drivers/common/cpt/cpt_ucode_asym.h -index a67ded642a..f0b5dddd8c 100644 ---- a/drivers/common/cpt/cpt_ucode_asym.h -+++ b/drivers/common/cpt/cpt_ucode_asym.h -@@ -779,7 +779,7 @@ cpt_ecdsa_verify_prep(struct rte_crypto_ecdsa_op_param *ecdsa, - * Set dlen = sum(sizeof(fpm address), ROUNDUP8(message len), - * ROUNDUP8(sign len(r and s), public key len(x and y coordinates), - * prime len, order len)). -- * Please note sign, public key and order can not excede prime length -+ * Please note sign, public key and order can not exceed prime length - * i.e. 6 * p_align - */ - dlen = sizeof(fpm_table_iova) + m_align + (8 * p_align); -diff --git a/drivers/common/dpaax/caamflib/desc/algo.h b/drivers/common/dpaax/caamflib/desc/algo.h -index 6bb915054a..e0848f0940 100644 ---- a/drivers/common/dpaax/caamflib/desc/algo.h -+++ b/drivers/common/dpaax/caamflib/desc/algo.h -@@ -67,7 +67,7 @@ cnstr_shdsc_zuce(uint32_t *descbuf, bool ps, bool swap, - * @authlen: size of digest - * - * The IV prepended before hmac payload must be 8 bytes consisting -- * of COUNT||BEAERER||DIR. The COUNT is of 32-bits, bearer is of 5 bits and -+ * of COUNT||BEARER||DIR. The COUNT is of 32-bits, bearer is of 5 bits and - * direction is of 1 bit - totalling to 38 bits. - * - * Return: size of descriptor written in words or negative number on error -diff --git a/drivers/common/dpaax/caamflib/desc/sdap.h b/drivers/common/dpaax/caamflib/desc/sdap.h -index b2497a5424..07f55b5b40 100644 ---- a/drivers/common/dpaax/caamflib/desc/sdap.h -+++ b/drivers/common/dpaax/caamflib/desc/sdap.h -@@ -492,10 +492,10 @@ pdcp_sdap_insert_snoop_op(struct program *p, bool swap __maybe_unused, - - /* Set the variable size of data the register will write */ - if (dir == OP_TYPE_ENCAP_PROTOCOL) { -- /* We will add the interity data so add its length */ -+ /* We will add the integrity data so add its length */ - MATHI(p, SEQINSZ, ADD, PDCP_MAC_I_LEN, VSEQOUTSZ, 4, IMMED2); - } else { -- /* We will check the interity data so remove its length */ -+ /* We will check the integrity data so remove its length */ - MATHI(p, SEQINSZ, SUB, PDCP_MAC_I_LEN, VSEQOUTSZ, 4, IMMED2); - /* Do not take the ICV in the out-snooping configuration */ - MATHI(p, SEQINSZ, SUB, PDCP_MAC_I_LEN, VSEQINSZ, 4, IMMED2); -@@ -803,7 +803,7 @@ static inline int pdcp_sdap_insert_no_snoop_op( - CLRW_CLR_C1MODE, - CLRW, 0, 4, IMMED); - -- /* Load the key for authentcation */ -+ /* Load the key for authentication */ - KEY(p, KEY1, authdata->key_enc_flags, authdata->key, - authdata->keylen, INLINE_KEY(authdata)); - -diff --git a/drivers/common/dpaax/dpaax_iova_table.c b/drivers/common/dpaax/dpaax_iova_table.c -index 3d661102cc..9daac4bc03 100644 ---- a/drivers/common/dpaax/dpaax_iova_table.c -+++ b/drivers/common/dpaax/dpaax_iova_table.c -@@ -261,7 +261,7 @@ dpaax_iova_table_depopulate(void) - rte_free(dpaax_iova_table_p->entries); - dpaax_iova_table_p = NULL; - -- DPAAX_DEBUG("IOVA Table cleanedup"); -+ DPAAX_DEBUG("IOVA Table cleaned"); - } - - int -diff --git a/drivers/common/iavf/iavf_type.h b/drivers/common/iavf/iavf_type.h -index 51267ca3b3..1cd87587d6 100644 ---- a/drivers/common/iavf/iavf_type.h -+++ b/drivers/common/iavf/iavf_type.h -@@ -1006,7 +1006,7 @@ struct iavf_profile_tlv_section_record { - u8 data[12]; - }; - --/* Generic AQ section in proflie */ -+/* Generic AQ section in profile */ - struct iavf_profile_aq_section { - u16 opcode; - u16 flags; -diff --git a/drivers/common/iavf/virtchnl.h b/drivers/common/iavf/virtchnl.h -index 269578f7c0..80e754a1b2 100644 ---- a/drivers/common/iavf/virtchnl.h -+++ b/drivers/common/iavf/virtchnl.h -@@ -233,7 +233,7 @@ static inline const char *virtchnl_op_str(enum virtchnl_ops v_opcode) - case VIRTCHNL_OP_DCF_CMD_DESC: - return "VIRTCHNL_OP_DCF_CMD_DESC"; - case VIRTCHNL_OP_DCF_CMD_BUFF: -- return "VIRTCHHNL_OP_DCF_CMD_BUFF"; -+ return "VIRTCHNL_OP_DCF_CMD_BUFF"; - case VIRTCHNL_OP_DCF_DISABLE: - return "VIRTCHNL_OP_DCF_DISABLE"; - case VIRTCHNL_OP_DCF_GET_VSI_MAP: -diff --git a/drivers/common/mlx5/mlx5_common.c b/drivers/common/mlx5/mlx5_common.c -index f1650f94c6..cc13022150 100644 ---- a/drivers/common/mlx5/mlx5_common.c -+++ b/drivers/common/mlx5/mlx5_common.c -@@ -854,7 +854,7 @@ static void mlx5_common_driver_init(void) - static bool mlx5_common_initialized; - - /** -- * One time innitialization routine for run-time dependency on glue library -+ * One time initialization routine for run-time dependency on glue library - * for multiple PMDs. Each mlx5 PMD that depends on mlx5_common module, - * must invoke in its constructor. - */ -diff --git a/drivers/common/mlx5/mlx5_common_mr.c b/drivers/common/mlx5/mlx5_common_mr.c -index c694aaf28c..1537b5d428 100644 ---- a/drivers/common/mlx5/mlx5_common_mr.c -+++ b/drivers/common/mlx5/mlx5_common_mr.c -@@ -1541,7 +1541,7 @@ mlx5_mempool_reg_create(struct rte_mempool *mp, unsigned int mrs_n, - * Destroy a mempool registration object. - * - * @param standalone -- * Whether @p mpr owns its MRs excludively, i.e. they are not shared. -+ * Whether @p mpr owns its MRs exclusively, i.e. they are not shared. - */ - static void - mlx5_mempool_reg_destroy(struct mlx5_mr_share_cache *share_cache, -diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c b/drivers/common/mlx5/mlx5_devx_cmds.c -index e52b995ee3..7cd3d4fa98 100644 ---- a/drivers/common/mlx5/mlx5_devx_cmds.c -+++ b/drivers/common/mlx5/mlx5_devx_cmds.c -@@ -1822,7 +1822,7 @@ mlx5_devx_cmd_create_td(void *ctx) - * Pointer to file stream. - * - * @return -- * 0 on success, a nagative value otherwise. -+ * 0 on success, a negative value otherwise. - */ - int - mlx5_devx_cmd_flow_dump(void *fdb_domain __rte_unused, -diff --git a/drivers/common/mlx5/mlx5_malloc.c b/drivers/common/mlx5/mlx5_malloc.c -index b19501e1bc..cef3b88e11 100644 ---- a/drivers/common/mlx5/mlx5_malloc.c -+++ b/drivers/common/mlx5/mlx5_malloc.c -@@ -58,7 +58,7 @@ static struct mlx5_sys_mem mlx5_sys_mem = { - * Check if the address belongs to memory seg list. - * - * @param addr -- * Memory address to be ckeced. -+ * Memory address to be checked. - * @param msl - * Memory seg list. - * -@@ -109,7 +109,7 @@ mlx5_mem_update_msl(void *addr) - * Check if the address belongs to rte memory. - * - * @param addr -- * Memory address to be ckeced. -+ * Memory address to be checked. - * - * @return - * True if it belongs, false otherwise. -diff --git a/drivers/common/mlx5/mlx5_malloc.h b/drivers/common/mlx5/mlx5_malloc.h -index 74b7eeb26e..92149f7b92 100644 ---- a/drivers/common/mlx5/mlx5_malloc.h -+++ b/drivers/common/mlx5/mlx5_malloc.h -@@ -19,7 +19,7 @@ extern "C" { - - enum mlx5_mem_flags { - MLX5_MEM_ANY = 0, -- /* Memory will be allocated dpends on sys_mem_en. */ -+ /* Memory will be allocated depends on sys_mem_en. */ - MLX5_MEM_SYS = 1 << 0, - /* Memory should be allocated from system. */ - MLX5_MEM_RTE = 1 << 1, -diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h -index 2ded67e85e..982a53ffbe 100644 ---- a/drivers/common/mlx5/mlx5_prm.h -+++ b/drivers/common/mlx5/mlx5_prm.h -@@ -4172,7 +4172,7 @@ mlx5_flow_mark_get(uint32_t val) - * timestamp format supported by the queue. - * - * @return -- * Converted timstamp format settings. -+ * Converted timestamp format settings. - */ - static inline uint32_t - mlx5_ts_format_conv(uint32_t ts_format) -diff --git a/drivers/common/mlx5/windows/mlx5_common_os.c b/drivers/common/mlx5/windows/mlx5_common_os.c -index 162c7476cc..c3cfc315f2 100644 ---- a/drivers/common/mlx5/windows/mlx5_common_os.c -+++ b/drivers/common/mlx5/windows/mlx5_common_os.c -@@ -302,7 +302,7 @@ mlx5_os_umem_dereg(void *pumem) - } - - /** -- * Register mr. Given protection doamin pointer, pointer to addr and length -+ * Register mr. Given protection domain pointer, pointer to addr and length - * register the memory region. - * - * @param[in] pd -@@ -310,7 +310,7 @@ mlx5_os_umem_dereg(void *pumem) - * @param[in] addr - * Pointer to memory start address (type devx_device_ctx). - * @param[in] length -- * Lengtoh of the memory to register. -+ * Length of the memory to register. - * @param[out] pmd_mr - * pmd_mr struct set with lkey, address, length, pointer to mr object, mkey - * -diff --git a/drivers/common/mlx5/windows/mlx5_common_os.h b/drivers/common/mlx5/windows/mlx5_common_os.h -index 3afce56cd9..61fc8dd761 100644 ---- a/drivers/common/mlx5/windows/mlx5_common_os.h -+++ b/drivers/common/mlx5/windows/mlx5_common_os.h -@@ -21,7 +21,7 @@ - /** - * This API allocates aligned or non-aligned memory. The free can be on either - * aligned or nonaligned memory. To be protected - even though there may be no -- * alignment - in Windows this API will unconditioanlly call _aligned_malloc() -+ * alignment - in Windows this API will unconditionally call _aligned_malloc() - * with at least a minimal alignment size. - * - * @param[in] align -diff --git a/drivers/common/qat/qat_adf/adf_transport_access_macros.h b/drivers/common/qat/qat_adf/adf_transport_access_macros.h -index a6d403fac3..12a7258c60 100644 ---- a/drivers/common/qat/qat_adf/adf_transport_access_macros.h -+++ b/drivers/common/qat/qat_adf/adf_transport_access_macros.h -@@ -72,7 +72,7 @@ - #define ADF_SIZE_TO_RING_SIZE_IN_BYTES(SIZE) ((1 << (SIZE - 1)) << 7) - #define ADF_RING_SIZE_IN_BYTES_TO_SIZE(SIZE) ((1 << (SIZE - 1)) >> 7) - --/* Minimum ring bufer size for memory allocation */ -+/* Minimum ring buffer size for memory allocation */ - #define ADF_RING_SIZE_BYTES_MIN(SIZE) ((SIZE < ADF_RING_SIZE_4K) ? \ - ADF_RING_SIZE_4K : SIZE) - #define ADF_RING_SIZE_MODULO(SIZE) (SIZE + 0x6) -diff --git a/drivers/common/sfc_efx/efsys.h b/drivers/common/sfc_efx/efsys.h -index 3860c2835a..224254bee7 100644 ---- a/drivers/common/sfc_efx/efsys.h -+++ b/drivers/common/sfc_efx/efsys.h -@@ -616,7 +616,7 @@ typedef struct efsys_bar_s { - - #define EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size) ((void)0) - --/* Just avoid store and compiler (impliciltly) reordering */ -+/* Just avoid store and compiler (implicitly) reordering */ - #define EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size) rte_wmb() - - /* TIMESTAMP */ -diff --git a/drivers/compress/octeontx/include/zip_regs.h b/drivers/compress/octeontx/include/zip_regs.h -index 96e538bb75..94a48cde66 100644 ---- a/drivers/compress/octeontx/include/zip_regs.h -+++ b/drivers/compress/octeontx/include/zip_regs.h -@@ -195,7 +195,7 @@ union zip_inst_s { - uint64_t bf : 1; - /** Comp/decomp operation */ - uint64_t op : 2; -- /** Data sactter */ -+ /** Data scatter */ - uint64_t ds : 1; - /** Data gather */ - uint64_t dg : 1; -@@ -376,7 +376,7 @@ union zip_inst_s { - uint64_t bf : 1; - /** Comp/decomp operation */ - uint64_t op : 2; -- /** Data sactter */ -+ /** Data scatter */ - uint64_t ds : 1; - /** Data gather */ - uint64_t dg : 1; -diff --git a/drivers/compress/octeontx/otx_zip.h b/drivers/compress/octeontx/otx_zip.h -index e43f7f5c3e..118a95d738 100644 ---- a/drivers/compress/octeontx/otx_zip.h -+++ b/drivers/compress/octeontx/otx_zip.h -@@ -31,7 +31,7 @@ extern int octtx_zip_logtype_driver; - /**< PCI device id of ZIP VF */ - #define PCI_DEVICE_ID_OCTEONTX_ZIPVF 0xA037 - --/* maxmum number of zip vf devices */ -+/* maximum number of zip vf devices */ - #define ZIP_MAX_VFS 8 - - /* max size of one chunk */ -diff --git a/drivers/compress/qat/qat_comp_pmd.c b/drivers/compress/qat/qat_comp_pmd.c -index 9b24d46e97..da6404c017 100644 ---- a/drivers/compress/qat/qat_comp_pmd.c -+++ b/drivers/compress/qat/qat_comp_pmd.c -@@ -463,7 +463,7 @@ qat_comp_create_stream_pool(struct qat_comp_dev_private *comp_dev, - } else if (info.error) { - rte_mempool_obj_iter(mp, qat_comp_stream_destroy, NULL); - QAT_LOG(ERR, -- "Destoying mempool %s as at least one element failed initialisation", -+ "Destroying mempool %s as at least one element failed initialisation", - stream_pool_name); - rte_mempool_free(mp); - mp = NULL; -diff --git a/drivers/crypto/bcmfs/bcmfs_device.h b/drivers/crypto/bcmfs/bcmfs_device.h -index e5ca866977..4901a6cfd9 100644 ---- a/drivers/crypto/bcmfs/bcmfs_device.h -+++ b/drivers/crypto/bcmfs/bcmfs_device.h -@@ -32,7 +32,7 @@ enum bcmfs_device_type { - BCMFS_UNKNOWN - }; - --/* A table to store registered queue pair opertations */ -+/* A table to store registered queue pair operations */ - struct bcmfs_hw_queue_pair_ops_table { - rte_spinlock_t tl; - /* Number of used ops structs in the table. */ -diff --git a/drivers/crypto/bcmfs/bcmfs_qp.c b/drivers/crypto/bcmfs/bcmfs_qp.c -index cb5ff6c61b..61d457f4e0 100644 ---- a/drivers/crypto/bcmfs/bcmfs_qp.c -+++ b/drivers/crypto/bcmfs/bcmfs_qp.c -@@ -212,7 +212,7 @@ bcmfs_qp_setup(struct bcmfs_qp **qp_addr, - nb_descriptors = FS_RM_MAX_REQS; - - if (qp_conf->iobase == NULL) { -- BCMFS_LOG(ERR, "IO onfig space null"); -+ BCMFS_LOG(ERR, "IO config space null"); - return -EINVAL; - } - -diff --git a/drivers/crypto/bcmfs/bcmfs_sym_defs.h b/drivers/crypto/bcmfs/bcmfs_sym_defs.h -index eaefe97e26..9bb8a695a0 100644 ---- a/drivers/crypto/bcmfs/bcmfs_sym_defs.h -+++ b/drivers/crypto/bcmfs/bcmfs_sym_defs.h -@@ -20,11 +20,11 @@ struct bcmfs_sym_request; - - /** Crypto Request processing successful. */ - #define BCMFS_SYM_RESPONSE_SUCCESS (0) --/** Crypot Request processing protocol failure. */ -+/** Crypto Request processing protocol failure. */ - #define BCMFS_SYM_RESPONSE_PROTO_FAILURE (1) --/** Crypot Request processing completion failure. */ -+/** Crypto Request processing completion failure. */ - #define BCMFS_SYM_RESPONSE_COMPL_ERROR (2) --/** Crypot Request processing hash tag check error. */ -+/** Crypto Request processing hash tag check error. */ - #define BCMFS_SYM_RESPONSE_HASH_TAG_ERROR (3) - - /** Maximum threshold length to adjust AAD in continuation -diff --git a/drivers/crypto/bcmfs/bcmfs_sym_engine.h b/drivers/crypto/bcmfs/bcmfs_sym_engine.h -index d9594246b5..51ff9f75ed 100644 ---- a/drivers/crypto/bcmfs/bcmfs_sym_engine.h -+++ b/drivers/crypto/bcmfs/bcmfs_sym_engine.h -@@ -12,7 +12,7 @@ - #include "bcmfs_sym_defs.h" - #include "bcmfs_sym_req.h" - --/* structure to hold element's arrtibutes */ -+/* structure to hold element's attributes */ - struct fsattr { - void *va; - uint64_t pa; -diff --git a/drivers/crypto/bcmfs/hw/bcmfs5_rm.c b/drivers/crypto/bcmfs/hw/bcmfs5_rm.c -index 86e53051dd..c677c0cd9b 100644 ---- a/drivers/crypto/bcmfs/hw/bcmfs5_rm.c -+++ b/drivers/crypto/bcmfs/hw/bcmfs5_rm.c -@@ -441,7 +441,7 @@ static void bcmfs5_write_doorbell(struct bcmfs_qp *qp) - { - struct bcmfs_queue *txq = &qp->tx_q; - -- /* sync in bfeore ringing the door-bell */ -+ /* sync in before ringing the door-bell */ - rte_wmb(); - - FS_MMIO_WRITE32(txq->descs_inflight, -diff --git a/drivers/crypto/caam_jr/caam_jr_hw_specific.h b/drivers/crypto/caam_jr/caam_jr_hw_specific.h -index bbe8bc3f90..6ee7f7cef3 100644 ---- a/drivers/crypto/caam_jr/caam_jr_hw_specific.h -+++ b/drivers/crypto/caam_jr/caam_jr_hw_specific.h -@@ -376,7 +376,7 @@ struct sec_job_ring_t { - void *register_base_addr; /* Base address for SEC's - * register memory for this job ring. - */ -- uint8_t coalescing_en; /* notifies if coelescing is -+ uint8_t coalescing_en; /* notifies if coalescing is - * enabled for the job ring - */ - sec_job_ring_state_t jr_state; /* The state of this job ring */ -@@ -479,7 +479,7 @@ void hw_job_ring_error_print(struct sec_job_ring_t *job_ring, int code); - - /* @brief Set interrupt coalescing parameters on the Job Ring. - * @param [in] job_ring The job ring -- * @param [in] irq_coalesing_timer Interrupt coalescing timer threshold. -+ * @param [in] irq_coalescing_timer Interrupt coalescing timer threshold. - * This value determines the maximum - * amount of time after processing a - * descriptor before raising an interrupt. -diff --git a/drivers/crypto/caam_jr/caam_jr_pvt.h b/drivers/crypto/caam_jr/caam_jr_pvt.h -index 552d6b9b1b..52f872bcd0 100644 ---- a/drivers/crypto/caam_jr/caam_jr_pvt.h -+++ b/drivers/crypto/caam_jr/caam_jr_pvt.h -@@ -169,7 +169,7 @@ struct sec4_sg_entry { - - /* Structure encompassing a job descriptor which is to be processed - * by SEC. User should also initialise this structure with the callback -- * function pointer which will be called by driver after recieving proccessed -+ * function pointer which will be called by driver after receiving processed - * descriptor from SEC. User data is also passed in this data structure which - * will be sent as an argument to the user callback function. - */ -@@ -288,7 +288,7 @@ int caam_jr_enable_irqs(int uio_fd); - * value that indicates an IRQ disable action into UIO file descriptor - * of this job ring. - * -- * @param [in] uio_fd UIO File descripto -+ * @param [in] uio_fd UIO File descriptor - * @retval 0 for success - * @retval -1 value for error - * -diff --git a/drivers/crypto/caam_jr/caam_jr_uio.c b/drivers/crypto/caam_jr/caam_jr_uio.c -index e4ee102344..583ba3b523 100644 ---- a/drivers/crypto/caam_jr/caam_jr_uio.c -+++ b/drivers/crypto/caam_jr/caam_jr_uio.c -@@ -227,7 +227,7 @@ caam_jr_enable_irqs(int uio_fd) - * value that indicates an IRQ disable action into UIO file descriptor - * of this job ring. - * -- * @param [in] uio_fd UIO File descripto -+ * @param [in] uio_fd UIO File descriptor - * @retval 0 for success - * @retval -1 value for error - * -diff --git a/drivers/crypto/ccp/ccp_crypto.c b/drivers/crypto/ccp/ccp_crypto.c -index 70daed791e..4ed91a7436 100644 ---- a/drivers/crypto/ccp/ccp_crypto.c -+++ b/drivers/crypto/ccp/ccp_crypto.c -@@ -1299,7 +1299,7 @@ ccp_auth_slot(struct ccp_session *session) - case CCP_AUTH_ALGO_SHA512_HMAC: - /** - * 1. Load PHash1 = H(k ^ ipad); to LSB -- * 2. generate IHash = H(hash on meassage with PHash1 -+ * 2. generate IHash = H(hash on message with PHash1 - * as init values); - * 3. Retrieve IHash 2 slots for 384/512 - * 4. Load Phash2 = H(k ^ opad); to LSB -diff --git a/drivers/crypto/ccp/ccp_crypto.h b/drivers/crypto/ccp/ccp_crypto.h -index 8e6d03efc8..d307f73ee4 100644 ---- a/drivers/crypto/ccp/ccp_crypto.h -+++ b/drivers/crypto/ccp/ccp_crypto.h -@@ -70,7 +70,7 @@ - /* Maximum length for digest */ - #define DIGEST_LENGTH_MAX 64 - --/* SHA LSB intialiazation values */ -+/* SHA LSB initialization values */ - - #define SHA1_H0 0x67452301UL - #define SHA1_H1 0xefcdab89UL -diff --git a/drivers/crypto/ccp/ccp_dev.h b/drivers/crypto/ccp/ccp_dev.h -index 85c8fc47a2..2a205cd446 100644 ---- a/drivers/crypto/ccp/ccp_dev.h -+++ b/drivers/crypto/ccp/ccp_dev.h -@@ -19,7 +19,7 @@ - #include - #include - --/**< CCP sspecific */ -+/**< CCP specific */ - #define MAX_HW_QUEUES 5 - #define CCP_MAX_TRNG_RETRIES 10 - #define CCP_ALIGN(x, y) ((((x) + (y - 1)) / y) * y) -diff --git a/drivers/crypto/dpaa_sec/dpaa_sec.c b/drivers/crypto/dpaa_sec/dpaa_sec.c -index a552e64506..f20acdd123 100644 ---- a/drivers/crypto/dpaa_sec/dpaa_sec.c -+++ b/drivers/crypto/dpaa_sec/dpaa_sec.c -@@ -723,7 +723,7 @@ dpaa_sec_deq(struct dpaa_sec_qp *qp, struct rte_crypto_op **ops, int nb_ops) - } - ops[pkts++] = op; - -- /* report op status to sym->op and then free the ctx memeory */ -+ /* report op status to sym->op and then free the ctx memory */ - rte_mempool_put(ctx->ctx_pool, (void *)ctx); - - qman_dqrr_consume(fq, dq); -diff --git a/drivers/crypto/octeontx/otx_cryptodev_hw_access.c b/drivers/crypto/octeontx/otx_cryptodev_hw_access.c -index 20b288334a..27604459e4 100644 ---- a/drivers/crypto/octeontx/otx_cryptodev_hw_access.c -+++ b/drivers/crypto/octeontx/otx_cryptodev_hw_access.c -@@ -296,7 +296,7 @@ cpt_vq_init(struct cpt_vf *cptvf, uint8_t group) - /* CPT VF device initialization */ - otx_cpt_vfvq_init(cptvf); - -- /* Send msg to PF to assign currnet Q to required group */ -+ /* Send msg to PF to assign current Q to required group */ - cptvf->vfgrp = group; - err = otx_cpt_send_vf_grp_msg(cptvf, group); - if (err) { -diff --git a/drivers/crypto/octeontx/otx_cryptodev_mbox.h b/drivers/crypto/octeontx/otx_cryptodev_mbox.h -index 508f3afd47..c1eedc1b9e 100644 ---- a/drivers/crypto/octeontx/otx_cryptodev_mbox.h -+++ b/drivers/crypto/octeontx/otx_cryptodev_mbox.h -@@ -70,7 +70,7 @@ void - otx_cpt_handle_mbox_intr(struct cpt_vf *cptvf); - - /* -- * Checks if VF is able to comminicate with PF -+ * Checks if VF is able to communicate with PF - * and also gets the CPT number this VF is associated to. - */ - int -diff --git a/drivers/crypto/octeontx/otx_cryptodev_ops.c b/drivers/crypto/octeontx/otx_cryptodev_ops.c -index 9e8fd495cf..f7ca8a8a8e 100644 ---- a/drivers/crypto/octeontx/otx_cryptodev_ops.c -+++ b/drivers/crypto/octeontx/otx_cryptodev_ops.c -@@ -558,7 +558,7 @@ otx_cpt_enq_single_sym(struct cpt_instance *instance, - &mdata, (void **)&prep_req); - - if (unlikely(ret)) { -- CPT_LOG_DP_ERR("prep cryto req : op %p, cpt_op 0x%x " -+ CPT_LOG_DP_ERR("prep crypto req : op %p, cpt_op 0x%x " - "ret 0x%x", op, (unsigned int)cpt_op, ret); - return NULL; - } -diff --git a/drivers/crypto/qat/qat_asym.c b/drivers/crypto/qat/qat_asym.c -index f893508030..09d8761c5f 100644 ---- a/drivers/crypto/qat/qat_asym.c -+++ b/drivers/crypto/qat/qat_asym.c -@@ -109,7 +109,7 @@ static void qat_clear_arrays_by_alg(struct qat_asym_op_cookie *cookie, - static int qat_asym_check_nonzero(rte_crypto_param n) - { - if (n.length < 8) { -- /* Not a case for any cryptograpic function except for DH -+ /* Not a case for any cryptographic function except for DH - * generator which very often can be of one byte length - */ - size_t i; -diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c -index 93b257522b..00ec703754 100644 ---- a/drivers/crypto/qat/qat_sym.c -+++ b/drivers/crypto/qat/qat_sym.c -@@ -419,7 +419,7 @@ qat_sym_build_request(void *in_op, uint8_t *out_msg, - ICP_QAT_HW_AUTH_ALGO_AES_CBC_MAC) { - - /* In case of AES-CCM this may point to user selected -- * memory or iv offset in cypto_op -+ * memory or iv offset in crypto_op - */ - uint8_t *aad_data = op->sym->aead.aad.data; - /* This is true AAD length, it not includes 18 bytes of -diff --git a/drivers/crypto/virtio/virtqueue.h b/drivers/crypto/virtio/virtqueue.h -index bf10c6579b..c96ca62992 100644 ---- a/drivers/crypto/virtio/virtqueue.h -+++ b/drivers/crypto/virtio/virtqueue.h -@@ -145,7 +145,7 @@ virtqueue_notify(struct virtqueue *vq) - { - /* - * Ensure updated avail->idx is visible to host. -- * For virtio on IA, the notificaiton is through io port operation -+ * For virtio on IA, the notification is through io port operation - * which is a serialization instruction itself. - */ - VTPCI_OPS(vq->hw)->notify_queue(vq->hw, vq); -diff --git a/drivers/dma/skeleton/skeleton_dmadev.c b/drivers/dma/skeleton/skeleton_dmadev.c -index d9e4f731d7..81cbdd286e 100644 ---- a/drivers/dma/skeleton/skeleton_dmadev.c -+++ b/drivers/dma/skeleton/skeleton_dmadev.c -@@ -169,7 +169,7 @@ vchan_setup(struct skeldma_hw *hw, uint16_t nb_desc) - struct rte_ring *completed; - uint16_t i; - -- desc = rte_zmalloc_socket("dma_skelteon_desc", -+ desc = rte_zmalloc_socket("dma_skeleton_desc", - nb_desc * sizeof(struct skeldma_desc), - RTE_CACHE_LINE_SIZE, hw->socket_id); - if (desc == NULL) { -diff --git a/drivers/event/cnxk/cnxk_eventdev_selftest.c b/drivers/event/cnxk/cnxk_eventdev_selftest.c -index 69c15b1d0a..2fe6467f88 100644 ---- a/drivers/event/cnxk/cnxk_eventdev_selftest.c -+++ b/drivers/event/cnxk/cnxk_eventdev_selftest.c -@@ -140,7 +140,7 @@ _eventdev_setup(int mode) - struct rte_event_dev_info info; - int i, ret; - -- /* Create and destrory pool for each test case to make it standalone */ -+ /* Create and destroy pool for each test case to make it standalone */ - eventdev_test_mempool = rte_pktmbuf_pool_create( - pool_name, MAX_EVENTS, 0, 0, 512, rte_socket_id()); - if (!eventdev_test_mempool) { -@@ -1543,7 +1543,7 @@ cnxk_sso_selftest(const char *dev_name) - cn9k_sso_set_rsrc(dev); - if (cnxk_sso_testsuite_run(dev_name)) - return rc; -- /* Verift dual ws mode. */ -+ /* Verify dual ws mode. */ - printf("Verifying CN9K Dual workslot mode\n"); - dev->dual_ws = 1; - cn9k_sso_set_rsrc(dev); -diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c -index 16e9764dbf..d75f12e382 100644 ---- a/drivers/event/dlb2/dlb2.c -+++ b/drivers/event/dlb2/dlb2.c -@@ -2145,7 +2145,7 @@ dlb2_event_queue_detach_ldb(struct dlb2_eventdev *dlb2, - } - - /* This is expected with eventdev API! -- * It blindly attemmpts to unmap all queues. -+ * It blindly attempts to unmap all queues. - */ - if (i == DLB2_MAX_NUM_QIDS_PER_LDB_CQ) { - DLB2_LOG_DBG("dlb2: ignoring LB QID %d not mapped for qm_port %d.\n", -diff --git a/drivers/event/dlb2/dlb2_priv.h b/drivers/event/dlb2/dlb2_priv.h -index a5e2f8e46b..7837ae8733 100644 ---- a/drivers/event/dlb2/dlb2_priv.h -+++ b/drivers/event/dlb2/dlb2_priv.h -@@ -519,7 +519,7 @@ struct dlb2_eventdev_port { - bool setup_done; - /* enq_configured is set when the qm port is created */ - bool enq_configured; -- uint8_t implicit_release; /* release events before dequeueing */ -+ uint8_t implicit_release; /* release events before dequeuing */ - } __rte_cache_aligned; - - struct dlb2_queue { -diff --git a/drivers/event/dlb2/dlb2_selftest.c b/drivers/event/dlb2/dlb2_selftest.c -index 2113bc2c99..1863ffe049 100644 ---- a/drivers/event/dlb2/dlb2_selftest.c -+++ b/drivers/event/dlb2/dlb2_selftest.c -@@ -223,7 +223,7 @@ test_stop_flush(struct test *t) /* test to check we can properly flush events */ - 0, - RTE_EVENT_PORT_ATTR_DEQ_DEPTH, - &dequeue_depth)) { -- printf("%d: Error retrieveing dequeue depth\n", __LINE__); -+ printf("%d: Error retrieving dequeue depth\n", __LINE__); - goto err; - } - -diff --git a/drivers/event/dlb2/rte_pmd_dlb2.h b/drivers/event/dlb2/rte_pmd_dlb2.h -index 74399db018..1dbd885a16 100644 ---- a/drivers/event/dlb2/rte_pmd_dlb2.h -+++ b/drivers/event/dlb2/rte_pmd_dlb2.h -@@ -24,7 +24,7 @@ extern "C" { - * Selects the token pop mode for a DLB2 port. - */ - enum dlb2_token_pop_mode { -- /* Pop the CQ tokens immediately after dequeueing. */ -+ /* Pop the CQ tokens immediately after dequeuing. */ - AUTO_POP, - /* Pop CQ tokens after (dequeue_depth - 1) events are released. - * Supported on load-balanced ports only. -diff --git a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c -index bbbd20951f..b549bdfcbb 100644 ---- a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c -+++ b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c -@@ -118,7 +118,7 @@ _eventdev_setup(int mode) - struct rte_event_dev_info info; - const char *pool_name = "evdev_dpaa2_test_pool"; - -- /* Create and destrory pool for each test case to make it standalone */ -+ /* Create and destroy pool for each test case to make it standalone */ - eventdev_test_mempool = rte_pktmbuf_pool_create(pool_name, - MAX_EVENTS, - 0 /*MBUF_CACHE_SIZE*/, -diff --git a/drivers/event/dsw/dsw_evdev.h b/drivers/event/dsw/dsw_evdev.h -index e64ae26f6e..c907c00c78 100644 ---- a/drivers/event/dsw/dsw_evdev.h -+++ b/drivers/event/dsw/dsw_evdev.h -@@ -24,7 +24,7 @@ - /* Multiple 24-bit flow ids will map to the same DSW-level flow. The - * number of DSW flows should be high enough make it unlikely that - * flow ids of several large flows hash to the same DSW-level flow. -- * Such collisions will limit parallism and thus the number of cores -+ * Such collisions will limit parallelism and thus the number of cores - * that may be utilized. However, configuring a large number of DSW - * flows might potentially, depending on traffic and actual - * application flow id value range, result in each such DSW-level flow -@@ -104,7 +104,7 @@ - /* Only one outstanding migration per port is allowed */ - #define DSW_MAX_PAUSED_FLOWS (DSW_MAX_PORTS*DSW_MAX_FLOWS_PER_MIGRATION) - --/* Enough room for paus request/confirm and unpaus request/confirm for -+/* Enough room for pause request/confirm and unpaus request/confirm for - * all possible senders. - */ - #define DSW_CTL_IN_RING_SIZE ((DSW_MAX_PORTS-1)*4) -diff --git a/drivers/event/dsw/dsw_event.c b/drivers/event/dsw/dsw_event.c -index c6ed470286..e209cd5b00 100644 ---- a/drivers/event/dsw/dsw_event.c -+++ b/drivers/event/dsw/dsw_event.c -@@ -1096,7 +1096,7 @@ dsw_port_ctl_process(struct dsw_evdev *dsw, struct dsw_port *port) - static void - dsw_port_note_op(struct dsw_port *port, uint16_t num_events) - { -- /* To pull the control ring reasonbly often on busy ports, -+ /* To pull the control ring reasonably often on busy ports, - * each dequeued/enqueued event is considered an 'op' too. - */ - port->ops_since_bg_task += (num_events+1); -@@ -1180,7 +1180,7 @@ dsw_event_enqueue_burst_generic(struct dsw_port *source_port, - * addition, a port cannot be left "unattended" (e.g. unused) - * for long periods of time, since that would stall - * migration. Eventdev API extensions to provide a cleaner way -- * to archieve both of these functions should be -+ * to archive both of these functions should be - * considered. - */ - if (unlikely(events_len == 0)) { -diff --git a/drivers/event/octeontx/ssovf_evdev.h b/drivers/event/octeontx/ssovf_evdev.h -index bb1056a955..e46dc055eb 100644 ---- a/drivers/event/octeontx/ssovf_evdev.h -+++ b/drivers/event/octeontx/ssovf_evdev.h -@@ -88,7 +88,7 @@ - - /* - * In Cavium OCTEON TX SoC, all accesses to the device registers are -- * implictly strongly ordered. So, The relaxed version of IO operation is -+ * implicitly strongly ordered. So, The relaxed version of IO operation is - * safe to use with out any IO memory barriers. - */ - #define ssovf_read64 rte_read64_relaxed -diff --git a/drivers/event/octeontx/ssovf_evdev_selftest.c b/drivers/event/octeontx/ssovf_evdev_selftest.c -index d7b0d22111..b55523632a 100644 ---- a/drivers/event/octeontx/ssovf_evdev_selftest.c -+++ b/drivers/event/octeontx/ssovf_evdev_selftest.c -@@ -151,7 +151,7 @@ _eventdev_setup(int mode) - struct rte_event_dev_info info; - const char *pool_name = "evdev_octeontx_test_pool"; - -- /* Create and destrory pool for each test case to make it standalone */ -+ /* Create and destroy pool for each test case to make it standalone */ - eventdev_test_mempool = rte_pktmbuf_pool_create(pool_name, - MAX_EVENTS, - 0 /*MBUF_CACHE_SIZE*/, -diff --git a/drivers/event/octeontx2/otx2_evdev_selftest.c b/drivers/event/octeontx2/otx2_evdev_selftest.c -index 48bfaf893d..a89637d60f 100644 ---- a/drivers/event/octeontx2/otx2_evdev_selftest.c -+++ b/drivers/event/octeontx2/otx2_evdev_selftest.c -@@ -139,7 +139,7 @@ _eventdev_setup(int mode) - struct rte_event_dev_info info; - int i, ret; - -- /* Create and destrory pool for each test case to make it standalone */ -+ /* Create and destroy pool for each test case to make it standalone */ - eventdev_test_mempool = rte_pktmbuf_pool_create(pool_name, MAX_EVENTS, - 0, 0, 512, - rte_socket_id()); -diff --git a/drivers/event/octeontx2/otx2_worker_dual.h b/drivers/event/octeontx2/otx2_worker_dual.h -index 36ae4dd88f..ca06d51c8a 100644 ---- a/drivers/event/octeontx2/otx2_worker_dual.h -+++ b/drivers/event/octeontx2/otx2_worker_dual.h -@@ -74,7 +74,7 @@ otx2_ssogws_dual_get_work(struct otx2_ssogws_state *ws, - event.flow_id, flags, lookup_mem); - /* Extracting tstamp, if PTP enabled. CGX will prepend - * the timestamp at starting of packet data and it can -- * be derieved from WQE 9 dword which corresponds to SG -+ * be derived from WQE 9 dword which corresponds to SG - * iova. - * rte_pktmbuf_mtod_offset can be used for this purpose - * but it brings down the performance as it reads -diff --git a/drivers/event/opdl/opdl_evdev.c b/drivers/event/opdl/opdl_evdev.c -index 15c10240b0..8b6890b220 100644 ---- a/drivers/event/opdl/opdl_evdev.c -+++ b/drivers/event/opdl/opdl_evdev.c -@@ -703,7 +703,7 @@ opdl_probe(struct rte_vdev_device *vdev) - } - - PMD_DRV_LOG(INFO, "DEV_ID:[%02d] : " -- "Success - creating eventdev device %s, numa_node:[%d], do_valdation:[%s]" -+ "Success - creating eventdev device %s, numa_node:[%d], do_validation:[%s]" - " , self_test:[%s]\n", - dev->data->dev_id, - name, -diff --git a/drivers/event/opdl/opdl_test.c b/drivers/event/opdl/opdl_test.c -index e4fc70a440..24b92df476 100644 ---- a/drivers/event/opdl/opdl_test.c -+++ b/drivers/event/opdl/opdl_test.c -@@ -864,7 +864,7 @@ qid_basic(struct test *t) - } - - -- /* Start the devicea */ -+ /* Start the device */ - if (!err) { - if (rte_event_dev_start(evdev) < 0) { - PMD_DRV_LOG(ERR, "%s:%d: Error with start call\n", -diff --git a/drivers/event/sw/sw_evdev.h b/drivers/event/sw/sw_evdev.h -index 33645bd1df..4fd1054470 100644 ---- a/drivers/event/sw/sw_evdev.h -+++ b/drivers/event/sw/sw_evdev.h -@@ -180,7 +180,7 @@ struct sw_port { - uint16_t outstanding_releases __rte_cache_aligned; - uint16_t inflight_max; /* app requested max inflights for this port */ - uint16_t inflight_credits; /* num credits this port has right now */ -- uint8_t implicit_release; /* release events before dequeueing */ -+ uint8_t implicit_release; /* release events before dequeuing */ - - uint16_t last_dequeue_burst_sz; /* how big the burst was */ - uint64_t last_dequeue_ticks; /* used to track burst processing time */ -diff --git a/drivers/event/sw/sw_evdev_selftest.c b/drivers/event/sw/sw_evdev_selftest.c -index 9768d3a0c7..cb97a4d615 100644 ---- a/drivers/event/sw/sw_evdev_selftest.c -+++ b/drivers/event/sw/sw_evdev_selftest.c -@@ -1109,7 +1109,7 @@ xstats_tests(struct test *t) - NULL, - 0); - -- /* Verify that the resetable stats are reset, and others are not */ -+ /* Verify that the resettable stats are reset, and others are not */ - static const uint64_t queue_expected_zero[] = { - 0 /* rx */, - 0 /* tx */, -diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c -index f17aff9655..32639a3bfd 100644 ---- a/drivers/mempool/dpaa/dpaa_mempool.c -+++ b/drivers/mempool/dpaa/dpaa_mempool.c -@@ -258,7 +258,7 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool, - } - /* assigning mbuf from the acquired objects */ - for (i = 0; (i < ret) && bufs[i].addr; i++) { -- /* TODO-errata - objerved that bufs may be null -+ /* TODO-errata - observed that bufs may be null - * i.e. first buffer is valid, remaining 6 buffers - * may be null. - */ -diff --git a/drivers/mempool/octeontx/octeontx_fpavf.c b/drivers/mempool/octeontx/octeontx_fpavf.c -index 94dc5cd815..8fd9edced2 100644 ---- a/drivers/mempool/octeontx/octeontx_fpavf.c -+++ b/drivers/mempool/octeontx/octeontx_fpavf.c -@@ -669,7 +669,7 @@ octeontx_fpa_bufpool_destroy(uintptr_t handle, int node_id) - break; - } - -- /* Imsert it into an ordered linked list */ -+ /* Insert it into an ordered linked list */ - for (curr = &head; curr[0] != NULL; curr = curr[0]) { - if ((uintptr_t)node <= (uintptr_t)curr[0]) - break; -@@ -705,7 +705,7 @@ octeontx_fpa_bufpool_destroy(uintptr_t handle, int node_id) - - ret = octeontx_fpapf_aura_detach(gpool); - if (ret) { -- fpavf_log_err("Failed to dettach gaura %u. error code=%d\n", -+ fpavf_log_err("Failed to detach gaura %u. error code=%d\n", - gpool, ret); - } - -diff --git a/drivers/net/ark/ark_global.h b/drivers/net/ark/ark_global.h -index 6f9b3013d8..49193ac5b3 100644 ---- a/drivers/net/ark/ark_global.h -+++ b/drivers/net/ark/ark_global.h -@@ -67,7 +67,7 @@ - typedef void (*rx_user_meta_hook_fn)(struct rte_mbuf *mbuf, - const uint32_t *meta, - void *ext_user_data); --/* TX hook poplulate *meta, with up to 20 bytes. meta_cnt -+/* TX hook populate *meta, with up to 20 bytes. meta_cnt - * returns the number of uint32_t words populated, 0 to 5 - */ - typedef void (*tx_user_meta_hook_fn)(const struct rte_mbuf *mbuf, -diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c -index 1c03e8bfa1..3a028f4290 100644 ---- a/drivers/net/atlantic/atl_ethdev.c -+++ b/drivers/net/atlantic/atl_ethdev.c -@@ -1423,7 +1423,7 @@ atl_dev_interrupt_action(struct rte_eth_dev *dev, - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -diff --git a/drivers/net/atlantic/atl_rxtx.c b/drivers/net/atlantic/atl_rxtx.c -index e3f57ded73..aeb79bf5a2 100644 ---- a/drivers/net/atlantic/atl_rxtx.c -+++ b/drivers/net/atlantic/atl_rxtx.c -@@ -1094,7 +1094,7 @@ atl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t)(nb_hold + rxq->nb_rx_hold); -diff --git a/drivers/net/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/atlantic/hw_atl/hw_atl_b0.c -index 7d0e724019..d0eb4af928 100644 ---- a/drivers/net/atlantic/hw_atl/hw_atl_b0.c -+++ b/drivers/net/atlantic/hw_atl/hw_atl_b0.c -@@ -281,7 +281,7 @@ int hw_atl_b0_hw_init_rx_path(struct aq_hw_s *self) - hw_atl_rpf_vlan_outer_etht_set(self, 0x88A8U); - hw_atl_rpf_vlan_inner_etht_set(self, 0x8100U); - -- /* VLAN proimisc bu defauld */ -+ /* VLAN promisc by default */ - hw_atl_rpf_vlan_prom_mode_en_set(self, 1); - - /* Rx Interrupts */ -diff --git a/drivers/net/axgbe/axgbe_dev.c b/drivers/net/axgbe/axgbe_dev.c -index daeb3308f4..6a7fddffca 100644 ---- a/drivers/net/axgbe/axgbe_dev.c -+++ b/drivers/net/axgbe/axgbe_dev.c -@@ -1046,7 +1046,7 @@ static int axgbe_config_rx_threshold(struct axgbe_port *pdata, - return 0; - } - --/*Distrubting fifo size */ -+/* Distributing FIFO size */ - static void axgbe_config_rx_fifo_size(struct axgbe_port *pdata) - { - unsigned int fifo_size; -diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c -index b209ab67cf..f6c49bbbda 100644 ---- a/drivers/net/axgbe/axgbe_ethdev.c -+++ b/drivers/net/axgbe/axgbe_ethdev.c -@@ -284,7 +284,7 @@ static int axgbe_phy_reset(struct axgbe_port *pdata) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -diff --git a/drivers/net/axgbe/axgbe_ethdev.h b/drivers/net/axgbe/axgbe_ethdev.h -index a207f2ae1b..e06d40f9eb 100644 ---- a/drivers/net/axgbe/axgbe_ethdev.h -+++ b/drivers/net/axgbe/axgbe_ethdev.h -@@ -641,7 +641,7 @@ struct axgbe_port { - - unsigned int kr_redrv; - -- /* Auto-negotiation atate machine support */ -+ /* Auto-negotiation state machine support */ - unsigned int an_int; - unsigned int an_status; - enum axgbe_an an_result; -diff --git a/drivers/net/axgbe/axgbe_phy_impl.c b/drivers/net/axgbe/axgbe_phy_impl.c -index 02236ec192..72104f8a3f 100644 ---- a/drivers/net/axgbe/axgbe_phy_impl.c -+++ b/drivers/net/axgbe/axgbe_phy_impl.c -@@ -347,7 +347,7 @@ static int axgbe_phy_i2c_read(struct axgbe_port *pdata, unsigned int target, - - retry = 1; - again2: -- /* Read the specfied register */ -+ /* Read the specified register */ - i2c_op.cmd = AXGBE_I2C_CMD_READ; - i2c_op.target = target; - i2c_op.len = val_len; -@@ -1093,7 +1093,7 @@ static int axgbe_phy_an_config(struct axgbe_port *pdata __rte_unused) - { - return 0; - /* Dummy API since there is no case to support -- * external phy devices registred through kerenl apis -+ * external phy devices registered through kernel APIs - */ - } - -diff --git a/drivers/net/axgbe/axgbe_rxtx_vec_sse.c b/drivers/net/axgbe/axgbe_rxtx_vec_sse.c -index 816371cd79..d95a446bef 100644 ---- a/drivers/net/axgbe/axgbe_rxtx_vec_sse.c -+++ b/drivers/net/axgbe/axgbe_rxtx_vec_sse.c -@@ -11,7 +11,7 @@ - #include - #include - --/* Useful to avoid shifting for every descriptor prepration*/ -+/* Useful to avoid shifting for every descriptor preparation */ - #define TX_DESC_CTRL_FLAGS 0xb000000000000000 - #define TX_DESC_CTRL_FLAG_TMST 0x40000000 - #define TX_FREE_BULK 8 -diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c -index f67db015b5..74e3018eab 100644 ---- a/drivers/net/bnx2x/bnx2x.c -+++ b/drivers/net/bnx2x/bnx2x.c -@@ -926,7 +926,7 @@ storm_memset_eq_prod(struct bnx2x_softc *sc, uint16_t eq_prod, uint16_t pfid) - * block. - * - * RAMROD_CMD_ID_ETH_UPDATE -- * Used to update the state of the leading connection, usually to udpate -+ * Used to update the state of the leading connection, usually to update - * the RSS indirection table. Completes on the RCQ of the leading - * connection. (Not currently used under FreeBSD until OS support becomes - * available.) -@@ -941,7 +941,7 @@ storm_memset_eq_prod(struct bnx2x_softc *sc, uint16_t eq_prod, uint16_t pfid) - * the RCQ of the leading connection. - * - * RAMROD_CMD_ID_ETH_CFC_DEL -- * Used when tearing down a conneciton prior to driver unload. Completes -+ * Used when tearing down a connection prior to driver unload. Completes - * on the RCQ of the leading connection (since the current connection - * has been completely removed from controller memory). - * -@@ -1072,7 +1072,7 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi, - - /* - * It's ok if the actual decrement is issued towards the memory -- * somewhere between the lock and unlock. Thus no more explict -+ * somewhere between the lock and unlock. Thus no more explicit - * memory barrier is needed. - */ - if (common) { -@@ -1190,7 +1190,7 @@ bnx2x_sp_event(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp, - break; - - case (RAMROD_CMD_ID_ETH_TERMINATE): -- PMD_DRV_LOG(DEBUG, sc, "got MULTI[%d] teminate ramrod", cid); -+ PMD_DRV_LOG(DEBUG, sc, "got MULTI[%d] terminate ramrod", cid); - drv_cmd = ECORE_Q_CMD_TERMINATE; - break; - -@@ -1476,7 +1476,7 @@ bnx2x_fill_accept_flags(struct bnx2x_softc *sc, uint32_t rx_mode, - case BNX2X_RX_MODE_ALLMULTI_PROMISC: - case BNX2X_RX_MODE_PROMISC: - /* -- * According to deffinition of SI mode, iface in promisc mode -+ * According to definition of SI mode, iface in promisc mode - * should receive matched and unmatched (in resolution of port) - * unicast packets. - */ -@@ -1944,7 +1944,7 @@ static void bnx2x_disable_close_the_gate(struct bnx2x_softc *sc) - - /* - * Cleans the object that have internal lists without sending -- * ramrods. Should be run when interrutps are disabled. -+ * ramrods. Should be run when interrupts are disabled. - */ - static void bnx2x_squeeze_objects(struct bnx2x_softc *sc) - { -@@ -2043,7 +2043,7 @@ bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link - - /* - * Nothing to do during unload if previous bnx2x_nic_load() -- * did not completed successfully - all resourses are released. -+ * did not complete successfully - all resources are released. - */ - if ((sc->state == BNX2X_STATE_CLOSED) || (sc->state == BNX2X_STATE_ERROR)) { - return 0; -@@ -2084,7 +2084,7 @@ bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link - /* - * Prevent transactions to host from the functions on the - * engine that doesn't reset global blocks in case of global -- * attention once gloabl blocks are reset and gates are opened -+ * attention once global blocks are reset and gates are opened - * (the engine which leader will perform the recovery - * last). - */ -@@ -2101,7 +2101,7 @@ bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link - - /* - * At this stage no more interrupts will arrive so we may safely clean -- * the queue'able objects here in case they failed to get cleaned so far. -+ * the queueable objects here in case they failed to get cleaned so far. - */ - if (IS_PF(sc)) { - bnx2x_squeeze_objects(sc); -@@ -2151,7 +2151,7 @@ bnx2x_nic_unload(struct bnx2x_softc *sc, uint32_t unload_mode, uint8_t keep_link - } - - /* -- * Encapsulte an mbuf cluster into the tx bd chain and makes the memory -+ * Encapsulate an mbuf cluster into the Tx BD chain and makes the memory - * visible to the controller. - * - * If an mbuf is submitted to this routine and cannot be given to the -@@ -2719,7 +2719,7 @@ static uint8_t bnx2x_clear_pf_load(struct bnx2x_softc *sc) - return val1 != 0; - } - --/* send load requrest to mcp and analyze response */ -+/* send load request to MCP and analyze response */ - static int bnx2x_nic_load_request(struct bnx2x_softc *sc, uint32_t * load_code) - { - PMD_INIT_FUNC_TRACE(sc); -@@ -5325,7 +5325,7 @@ static void bnx2x_func_init(struct bnx2x_softc *sc, struct bnx2x_func_init_param - * sum of vn_min_rates. - * or - * 0 - if all the min_rates are 0. -- * In the later case fainess algorithm should be deactivated. -+ * In the later case fairness algorithm should be deactivated. - * If all min rates are not zero then those that are zeroes will be set to 1. - */ - static void bnx2x_calc_vn_min(struct bnx2x_softc *sc, struct cmng_init_input *input) -@@ -6564,7 +6564,7 @@ bnx2x_pf_tx_q_prep(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp, - txq_init->fw_sb_id = fp->fw_sb_id; - - /* -- * set the TSS leading client id for TX classfication to the -+ * set the TSS leading client id for Tx classification to the - * leading RSS client id - */ - txq_init->tss_leading_cl_id = BNX2X_FP(sc, 0, cl_id); -@@ -7634,8 +7634,8 @@ static uint8_t bnx2x_is_pcie_pending(struct bnx2x_softc *sc) - } - - /* --* Walk the PCI capabiites list for the device to find what features are --* supported. These capabilites may be enabled/disabled by firmware so it's -+* Walk the PCI capabilities list for the device to find what features are -+* supported. These capabilities may be enabled/disabled by firmware so it's - * best to walk the list rather than make assumptions. - */ - static void bnx2x_probe_pci_caps(struct bnx2x_softc *sc) -@@ -8425,7 +8425,7 @@ static int bnx2x_get_device_info(struct bnx2x_softc *sc) - } else { - sc->devinfo.int_block = INT_BLOCK_IGU; - --/* do not allow device reset during IGU info preocessing */ -+/* do not allow device reset during IGU info processing */ - bnx2x_acquire_hw_lock(sc, HW_LOCK_RESOURCE_RESET); - - val = REG_RD(sc, IGU_REG_BLOCK_CONFIGURATION); -@@ -9765,7 +9765,7 @@ int bnx2x_attach(struct bnx2x_softc *sc) - - sc->igu_base_addr = IS_VF(sc) ? PXP_VF_ADDR_IGU_START : BAR_IGU_INTMEM; - -- /* get PCI capabilites */ -+ /* get PCI capabilities */ - bnx2x_probe_pci_caps(sc); - - if (sc->devinfo.pcie_msix_cap_reg != 0) { -@@ -10284,7 +10284,7 @@ static int bnx2x_init_hw_common(struct bnx2x_softc *sc) - * stay set) - * f. If this is VNIC 3 of a port then also init - * first_timers_ilt_entry to zero and last_timers_ilt_entry -- * to the last enrty in the ILT. -+ * to the last entry in the ILT. - * - * Notes: - * Currently the PF error in the PGLC is non recoverable. -@@ -11090,7 +11090,7 @@ static void bnx2x_hw_enable_status(struct bnx2x_softc *sc) - /** - * bnx2x_pf_flr_clnup - * a. re-enable target read on the PF -- * b. poll cfc per function usgae counter -+ * b. poll cfc per function usage counter - * c. poll the qm perfunction usage counter - * d. poll the tm per function usage counter - * e. poll the tm per function scan-done indication -diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h -index 80d19cbfd6..d7e1729e68 100644 ---- a/drivers/net/bnx2x/bnx2x.h -+++ b/drivers/net/bnx2x/bnx2x.h -@@ -681,13 +681,13 @@ struct bnx2x_slowpath { - }; /* struct bnx2x_slowpath */ - - /* -- * Port specifc data structure. -+ * Port specific data structure. - */ - struct bnx2x_port { - /* - * Port Management Function (for 57711E only). - * When this field is set the driver instance is -- * responsible for managing port specifc -+ * responsible for managing port specific - * configurations such as handling link attentions. - */ - uint32_t pmf; -@@ -732,7 +732,7 @@ struct bnx2x_port { - - /* - * MCP scratchpad address for port specific statistics. -- * The device is responsible for writing statistcss -+ * The device is responsible for writing statistics - * back to the MCP for use with management firmware such - * as UMP/NC-SI. - */ -@@ -937,8 +937,8 @@ struct bnx2x_devinfo { - * already registered for this port (which means that the user wants storage - * services). - * 2. During cnic-related load, to know if offload mode is already configured -- * in the HW or needs to be configrued. Since the transition from nic-mode to -- * offload-mode in HW causes traffic coruption, nic-mode is configured only -+ * in the HW or needs to be configured. Since the transition from nic-mode to -+ * offload-mode in HW causes traffic corruption, nic-mode is configured only - * in ports on which storage services where never requested. - */ - #define CONFIGURE_NIC_MODE(sc) (!CHIP_IS_E1x(sc) && !CNIC_ENABLED(sc)) -diff --git a/drivers/net/bnx2x/bnx2x_stats.c b/drivers/net/bnx2x/bnx2x_stats.c -index 1cd972591a..c07b01510a 100644 ---- a/drivers/net/bnx2x/bnx2x_stats.c -+++ b/drivers/net/bnx2x/bnx2x_stats.c -@@ -1358,7 +1358,7 @@ bnx2x_prep_fw_stats_req(struct bnx2x_softc *sc) - - /* - * Prepare the first stats ramrod (will be completed with -- * the counters equal to zero) - init counters to somethig different. -+ * the counters equal to zero) - init counters to something different. - */ - memset(&sc->fw_stats_data->storm_counters, 0xff, - sizeof(struct stats_counter)); -diff --git a/drivers/net/bnx2x/bnx2x_stats.h b/drivers/net/bnx2x/bnx2x_stats.h -index 635412bdd3..11ddab5039 100644 ---- a/drivers/net/bnx2x/bnx2x_stats.h -+++ b/drivers/net/bnx2x/bnx2x_stats.h -@@ -314,7 +314,7 @@ struct bnx2x_eth_stats_old { - }; - - struct bnx2x_eth_q_stats_old { -- /* Fields to perserve over fw reset*/ -+ /* Fields to preserve over FW reset */ - uint32_t total_unicast_bytes_received_hi; - uint32_t total_unicast_bytes_received_lo; - uint32_t total_broadcast_bytes_received_hi; -@@ -328,7 +328,7 @@ struct bnx2x_eth_q_stats_old { - uint32_t total_multicast_bytes_transmitted_hi; - uint32_t total_multicast_bytes_transmitted_lo; - -- /* Fields to perserve last of */ -+ /* Fields to preserve last of */ - uint32_t total_bytes_received_hi; - uint32_t total_bytes_received_lo; - uint32_t total_bytes_transmitted_hi; -diff --git a/drivers/net/bnx2x/bnx2x_vfpf.c b/drivers/net/bnx2x/bnx2x_vfpf.c -index 945e3df84f..63953c2979 100644 ---- a/drivers/net/bnx2x/bnx2x_vfpf.c -+++ b/drivers/net/bnx2x/bnx2x_vfpf.c -@@ -73,7 +73,7 @@ bnx2x_add_tlv(__rte_unused struct bnx2x_softc *sc, void *tlvs_list, - tl->length = length; - } - --/* Initiliaze header of the first tlv and clear mailbox*/ -+/* Initialize header of the first TLV and clear mailbox */ - static void - bnx2x_vf_prep(struct bnx2x_softc *sc, struct vf_first_tlv *first_tlv, - uint16_t type, uint16_t length) -diff --git a/drivers/net/bnx2x/bnx2x_vfpf.h b/drivers/net/bnx2x/bnx2x_vfpf.h -index 9577341266..d71e81c005 100644 ---- a/drivers/net/bnx2x/bnx2x_vfpf.h -+++ b/drivers/net/bnx2x/bnx2x_vfpf.h -@@ -241,7 +241,7 @@ struct vf_close_tlv { - uint8_t pad[2]; - }; - --/* rlease the VF's acquired resources */ -+/* release the VF's acquired resources */ - struct vf_release_tlv { - struct vf_first_tlv first_tlv; - uint16_t vf_id; /* for debug */ -diff --git a/drivers/net/bnx2x/ecore_fw_defs.h b/drivers/net/bnx2x/ecore_fw_defs.h -index 93bca8ad33..6fc1fce7e2 100644 ---- a/drivers/net/bnx2x/ecore_fw_defs.h -+++ b/drivers/net/bnx2x/ecore_fw_defs.h -@@ -379,7 +379,7 @@ - /* temporarily used for RTT */ - #define XSEMI_CLK1_RESUL_CHIP (1e-3) - --/* used for Host Coallescing */ -+/* used for Host Coalescing */ - #define SDM_TIMER_TICK_RESUL_CHIP (4 * (1e-6)) - #define TSDM_TIMER_TICK_RESUL_CHIP (1 * (1e-6)) - -diff --git a/drivers/net/bnx2x/ecore_hsi.h b/drivers/net/bnx2x/ecore_hsi.h -index 5508c53639..eda79408e9 100644 ---- a/drivers/net/bnx2x/ecore_hsi.h -+++ b/drivers/net/bnx2x/ecore_hsi.h -@@ -1062,7 +1062,7 @@ struct port_feat_cfg { /* port 0: 0x454 port 1: 0x4c8 */ - #define PORT_FEATURE_MBA_LINK_SPEED_20G 0x20000000 - - /* Secondary MBA configuration, -- * see mba_config for the fileds defination. -+ * see mba_config for the fields definition. - */ - uint32_t mba_config2; - -@@ -1075,7 +1075,7 @@ struct port_feat_cfg { /* port 0: 0x454 port 1: 0x4c8 */ - #define PORT_FEATURE_BOFM_CFGD_VEN 0x00080000 - - /* Secondary MBA configuration, -- * see mba_vlan_cfg for the fileds defination. -+ * see mba_vlan_cfg for the fields definition. - */ - uint32_t mba_vlan_cfg2; - -@@ -1429,7 +1429,7 @@ struct extended_dev_info_shared_cfg { /* NVRAM OFFSET */ - #define EXTENDED_DEV_INFO_SHARED_CFG_DBG_GEN3_COMPLI_ENA 0x00080000 - - /* Override Rx signal detect threshold when enabled the threshold -- * will be set staticaly -+ * will be set statically - */ - #define EXTENDED_DEV_INFO_SHARED_CFG_OVERRIDE_RX_SIG_MASK 0x00100000 - #define EXTENDED_DEV_INFO_SHARED_CFG_OVERRIDE_RX_SIG_SHIFT 20 -@@ -2189,9 +2189,9 @@ struct eee_remote_vals { - * elements on a per byte or word boundary. - * - * example: an array with 8 entries each 4 bit wide. This array will fit into -- * a single dword. The diagrmas below show the array order of the nibbles. -+ * a single dword. The diagrams below show the array order of the nibbles. - * -- * SHMEM_ARRAY_BITPOS(i, 4, 4) defines the stadard ordering: -+ * SHMEM_ARRAY_BITPOS(i, 4, 4) defines the standard ordering: - * - * | | | | - * 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -@@ -2519,17 +2519,17 @@ struct shmem_lfa { - }; - - /* -- * Used to suppoert NSCI get OS driver version -+ * Used to support NSCI get OS driver version - * On driver load the version value will be set - * On driver unload driver value of 0x0 will be set - */ - struct os_drv_ver { - #define DRV_VER_NOT_LOADED 0 -- /*personalites orrder is importent */ -+ /* personalities order is important */ - #define DRV_PERS_ETHERNET 0 - #define DRV_PERS_ISCSI 1 - #define DRV_PERS_FCOE 2 -- /*shmem2 struct is constatnt can't add more personalites here*/ -+ /* shmem2 struct is constant can't add more personalities here */ - #define MAX_DRV_PERS 3 - uint32_t versions[MAX_DRV_PERS]; - }; -@@ -2821,7 +2821,7 @@ struct shmem2_region { - /* Flag to the driver that PF's drv_info_host_addr buffer was read */ - uint32_t mfw_drv_indication; /* Offset 0x19c */ - -- /* We use inidcation for each PF (0..3) */ -+ /* We use indication for each PF (0..3) */ - #define MFW_DRV_IND_READ_DONE_OFFSET(_pf_) (1 << (_pf_)) - - union { /* For various OEMs */ /* Offset 0x1a0 */ -@@ -6195,7 +6195,7 @@ struct hc_sb_data { - - - /* -- * Segment types for host coaslescing -+ * Segment types for host coalescing - */ - enum hc_segment { - HC_REGULAR_SEGMENT, -@@ -6242,7 +6242,7 @@ struct hc_status_block_data_e2 { - - - /* -- * IGU block operartion modes (in Everest2) -+ * IGU block operation modes (in Everest2) - */ - enum igu_mode { - HC_IGU_BC_MODE, -@@ -6508,7 +6508,7 @@ struct stats_query_header { - - - /* -- * Types of statistcis query entry -+ * Types of statistics query entry - */ - enum stats_query_type { - STATS_TYPE_QUEUE, -@@ -6542,7 +6542,7 @@ enum storm_id { - - - /* -- * Taffic types used in ETS and flow control algorithms -+ * Traffic types used in ETS and flow control algorithms - */ - enum traffic_type { - LLFC_TRAFFIC_TYPE_NW, -diff --git a/drivers/net/bnx2x/ecore_init_ops.h b/drivers/net/bnx2x/ecore_init_ops.h -index 0945e79993..4ed811fdd4 100644 ---- a/drivers/net/bnx2x/ecore_init_ops.h -+++ b/drivers/net/bnx2x/ecore_init_ops.h -@@ -534,7 +534,7 @@ static void ecore_init_pxp_arb(struct bnx2x_softc *sc, int r_order, - REG_WR(sc, PXP2_REG_WR_CDU_MPS, val); - } - -- /* Validate number of tags suppoted by device */ -+ /* Validate number of tags supported by device */ - #define PCIE_REG_PCIER_TL_HDR_FC_ST 0x2980 - val = REG_RD(sc, PCIE_REG_PCIER_TL_HDR_FC_ST); - val &= 0xFF; -@@ -714,7 +714,7 @@ static void ecore_ilt_client_init_op_ilt(struct bnx2x_softc *sc, - for (i = ilt_cli->start; i <= ilt_cli->end; i++) - ecore_ilt_line_init_op(sc, ilt, i, initop); - -- /* init/clear the ILT boundries */ -+ /* init/clear the ILT boundaries */ - ecore_ilt_boundary_init_op(sc, ilt_cli, ilt->start_line, initop); - } - -@@ -765,7 +765,7 @@ static void ecore_ilt_init_client_psz(struct bnx2x_softc *sc, int cli_num, - - /* - * called during init common stage, ilt clients should be initialized -- * prioir to calling this function -+ * prior to calling this function - */ - static void ecore_ilt_init_page_size(struct bnx2x_softc *sc, uint8_t initop) - { -diff --git a/drivers/net/bnx2x/ecore_reg.h b/drivers/net/bnx2x/ecore_reg.h -index bb92d131f8..6f7b0522f2 100644 ---- a/drivers/net/bnx2x/ecore_reg.h -+++ b/drivers/net/bnx2x/ecore_reg.h -@@ -19,7 +19,7 @@ - #define ATC_ATC_INT_STS_REG_ATC_RCPL_TO_EMPTY_CNT (0x1 << 3) - #define ATC_ATC_INT_STS_REG_ATC_TCPL_ERROR (0x1 << 4) - #define ATC_ATC_INT_STS_REG_ATC_TCPL_TO_NOT_PEND (0x1 << 1) --/* [R 1] ATC initalization done */ -+/* [R 1] ATC initialization done */ - #define ATC_REG_ATC_INIT_DONE 0x1100bc - /* [RW 6] Interrupt mask register #0 read/write */ - #define ATC_REG_ATC_INT_MASK 0x1101c8 -@@ -56,7 +56,7 @@ - #define BRB1_REG_PAUSE_HIGH_THRESHOLD_0 0x60078 - /* [RW 10] Write client 0: Assert pause threshold. Not Functional */ - #define BRB1_REG_PAUSE_LOW_THRESHOLD_0 0x60068 --/* [R 24] The number of full blocks occpied by port. */ -+/* [R 24] The number of full blocks occupied by port. */ - #define BRB1_REG_PORT_NUM_OCC_BLOCKS_0 0x60094 - /* [R 5] Used to read the value of the XX protection CAM occupancy counter. */ - #define CCM_REG_CAM_OCCUP 0xd0188 -@@ -456,7 +456,7 @@ - #define IGU_REG_PCI_PF_MSIX_FUNC_MASK 0x130148 - #define IGU_REG_PCI_PF_MSI_EN 0x130140 - /* [WB_R 32] Each bit represent the pending bits status for that SB. 0 = no -- * pending; 1 = pending. Pendings means interrupt was asserted; and write -+ * pending; 1 = pending. Pending means interrupt was asserted; and write - * done was not received. Data valid only in addresses 0-4. all the rest are - * zero. - */ -@@ -1059,14 +1059,14 @@ - /* [R 28] this field hold the last information that caused reserved - * attention. bits [19:0] - address; [22:20] function; [23] reserved; - * [27:24] the master that caused the attention - according to the following -- * encodeing:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = -+ * encoding:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = - * dbu; 8 = dmae - */ - #define MISC_REG_GRC_RSV_ATTN 0xa3c0 - /* [R 28] this field hold the last information that caused timeout - * attention. bits [19:0] - address; [22:20] function; [23] reserved; - * [27:24] the master that caused the attention - according to the following -- * encodeing:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = -+ * encoding:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = - * dbu; 8 = dmae - */ - #define MISC_REG_GRC_TIMEOUT_ATTN 0xa3c4 -@@ -1567,7 +1567,7 @@ - * MAC DA 2. The reset default is set to mask out all parameters. - */ - #define NIG_REG_P0_LLH_PTP_PARAM_MASK 0x187a0 --/* [RW 14] Mask regiser for the rules used in detecting PTP packets. Set -+/* [RW 14] Mask register for the rules used in detecting PTP packets. Set - * each bit to 1 to mask out that particular rule. 0-{IPv4 DA 0; UDP DP 0} . - * 1-{IPv4 DA 0; UDP DP 1} . 2-{IPv4 DA 1; UDP DP 0} . 3-{IPv4 DA 1; UDP DP - * 1} . 4-{IPv6 DA 0; UDP DP 0} . 5-{IPv6 DA 0; UDP DP 1} . 6-{IPv6 DA 1; -@@ -1672,7 +1672,7 @@ - * MAC DA 2. The reset default is set to mask out all parameters. - */ - #define NIG_REG_P0_TLLH_PTP_PARAM_MASK 0x187f0 --/* [RW 14] Mask regiser for the rules used in detecting PTP packets. Set -+/* [RW 14] Mask register for the rules used in detecting PTP packets. Set - * each bit to 1 to mask out that particular rule. 0-{IPv4 DA 0; UDP DP 0} . - * 1-{IPv4 DA 0; UDP DP 1} . 2-{IPv4 DA 1; UDP DP 0} . 3-{IPv4 DA 1; UDP DP - * 1} . 4-{IPv6 DA 0; UDP DP 0} . 5-{IPv6 DA 0; UDP DP 1} . 6-{IPv6 DA 1; -@@ -1839,7 +1839,7 @@ - * MAC DA 2. The reset default is set to mask out all parameters. - */ - #define NIG_REG_P1_LLH_PTP_PARAM_MASK 0x187c8 --/* [RW 14] Mask regiser for the rules used in detecting PTP packets. Set -+/* [RW 14] Mask register for the rules used in detecting PTP packets. Set - * each bit to 1 to mask out that particular rule. 0-{IPv4 DA 0; UDP DP 0} . - * 1-{IPv4 DA 0; UDP DP 1} . 2-{IPv4 DA 1; UDP DP 0} . 3-{IPv4 DA 1; UDP DP - * 1} . 4-{IPv6 DA 0; UDP DP 0} . 5-{IPv6 DA 0; UDP DP 1} . 6-{IPv6 DA 1; -@@ -1926,7 +1926,7 @@ - * MAC DA 2. The reset default is set to mask out all parameters. - */ - #define NIG_REG_P1_TLLH_PTP_PARAM_MASK 0x187f8 --/* [RW 14] Mask regiser for the rules used in detecting PTP packets. Set -+/* [RW 14] Mask register for the rules used in detecting PTP packets. Set - * each bit to 1 to mask out that particular rule. 0-{IPv4 DA 0; UDP DP 0} . - * 1-{IPv4 DA 0; UDP DP 1} . 2-{IPv4 DA 1; UDP DP 0} . 3-{IPv4 DA 1; UDP DP - * 1} . 4-{IPv6 DA 0; UDP DP 0} . 5-{IPv6 DA 0; UDP DP 1} . 6-{IPv6 DA 1; -@@ -2306,7 +2306,7 @@ - #define PBF_REG_HDRS_AFTER_BASIC 0x15c0a8 - /* [RW 6] Bit-map indicating which L2 hdrs may appear after L2 tag 0 */ - #define PBF_REG_HDRS_AFTER_TAG_0 0x15c0b8 --/* [R 1] Removed for E3 B0 - Indicates which COS is conncted to the highest -+/* [R 1] Removed for E3 B0 - Indicates which COS is connected to the highest - * priority in the command arbiter. - */ - #define PBF_REG_HIGH_PRIORITY_COS_NUM 0x15c04c -@@ -2366,7 +2366,7 @@ - */ - #define PBF_REG_NUM_STRICT_ARB_SLOTS 0x15c064 - /* [R 11] Removed for E3 B0 - Port 0 threshold used by arbiter in 16 byte -- * lines used when pause not suppoterd. -+ * lines used when pause not supported. - */ - #define PBF_REG_P0_ARB_THRSH 0x1400e4 - /* [R 11] Removed for E3 B0 - Current credit for port 0 in the tx port -@@ -3503,7 +3503,7 @@ - * queues. - */ - #define QM_REG_OVFERROR 0x16805c --/* [RC 6] the Q were the qverflow occurs */ -+/* [RC 6] the Q were the overflow occurs */ - #define QM_REG_OVFQNUM 0x168058 - /* [R 16] Pause state for physical queues 15-0 */ - #define QM_REG_PAUSESTATE0 0x168410 -@@ -4890,7 +4890,7 @@ - if set, generate pcie_err_attn output when this error is seen. WC \ - */ - #define PXPCS_TL_FUNC345_STAT_ERR_MASTER_ABRT2 \ -- (1 << 3) /* Receive UR Statusfor Function 2. If set, generate \ -+ (1 << 3) /* Receive UR Status for Function 2. If set, generate \ - pcie_err_attn output when this error is seen. WC */ - #define PXPCS_TL_FUNC345_STAT_ERR_CPL_TIMEOUT2 \ - (1 << 2) /* Completer Timeout Status Status for Function 2, if \ -@@ -4986,7 +4986,7 @@ - if set, generate pcie_err_attn output when this error is seen. WC \ - */ - #define PXPCS_TL_FUNC678_STAT_ERR_MASTER_ABRT5 \ -- (1 << 3) /* Receive UR Statusfor Function 5. If set, generate \ -+ (1 << 3) /* Receive UR Status for Function 5. If set, generate \ - pcie_err_attn output when this error is seen. WC */ - #define PXPCS_TL_FUNC678_STAT_ERR_CPL_TIMEOUT5 \ - (1 << 2) /* Completer Timeout Status Status for Function 5, if \ -diff --git a/drivers/net/bnx2x/ecore_sp.c b/drivers/net/bnx2x/ecore_sp.c -index 0075422eee..c6c3857778 100644 ---- a/drivers/net/bnx2x/ecore_sp.c -+++ b/drivers/net/bnx2x/ecore_sp.c -@@ -1338,7 +1338,7 @@ static int __ecore_vlan_mac_execute_step(struct bnx2x_softc *sc, - if (rc != ECORE_SUCCESS) { - __ecore_vlan_mac_h_pend(sc, o, *ramrod_flags); - -- /** Calling function should not diffrentiate between this case -+ /** Calling function should not differentiate between this case - * and the case in which there is already a pending ramrod - */ - rc = ECORE_PENDING; -@@ -2246,7 +2246,7 @@ struct ecore_pending_mcast_cmd { - union { - ecore_list_t macs_head; - uint32_t macs_num; /* Needed for DEL command */ -- int next_bin; /* Needed for RESTORE flow with aprox match */ -+ int next_bin; /* Needed for RESTORE flow with approx match */ - } data; - - int done; /* set to TRUE, when the command has been handled, -@@ -3424,7 +3424,7 @@ void ecore_init_mac_credit_pool(struct bnx2x_softc *sc, - } else { - - /* -- * CAM credit is equaly divided between all active functions -+ * CAM credit is equally divided between all active functions - * on the PATH. - */ - if (func_num > 0) { -diff --git a/drivers/net/bnx2x/ecore_sp.h b/drivers/net/bnx2x/ecore_sp.h -index d58072dac0..1f4d5a3ebe 100644 ---- a/drivers/net/bnx2x/ecore_sp.h -+++ b/drivers/net/bnx2x/ecore_sp.h -@@ -430,7 +430,7 @@ enum { - RAMROD_RESTORE, - /* Execute the next command now */ - RAMROD_EXEC, -- /* Don't add a new command and continue execution of posponed -+ /* Don't add a new command and continue execution of postponed - * commands. If not set a new command will be added to the - * pending commands list. - */ -@@ -1173,7 +1173,7 @@ struct ecore_rss_config_obj { - /* Last configured indirection table */ - uint8_t ind_table[T_ETH_INDIRECTION_TABLE_SIZE]; - -- /* flags for enabling 4-tupple hash on UDP */ -+ /* flags for enabling 4-tuple hash on UDP */ - uint8_t udp_rss_v4; - uint8_t udp_rss_v6; - -@@ -1285,7 +1285,7 @@ enum ecore_q_type { - #define ECORE_MULTI_TX_COS_E3B0 3 - #define ECORE_MULTI_TX_COS 3 /* Maximum possible */ - #define MAC_PAD (ECORE_ALIGN(ETH_ALEN, sizeof(uint32_t)) - ETH_ALEN) --/* DMAE channel to be used by FW for timesync workaroun. A driver that sends -+/* DMAE channel to be used by FW for timesync workaround. A driver that sends - * timesync-related ramrods must not use this DMAE command ID. - */ - #define FW_DMAE_CMD_ID 6 -diff --git a/drivers/net/bnx2x/elink.c b/drivers/net/bnx2x/elink.c -index 2093d8f373..43fbf04ece 100644 ---- a/drivers/net/bnx2x/elink.c -+++ b/drivers/net/bnx2x/elink.c -@@ -1460,7 +1460,7 @@ static void elink_ets_e3b0_pbf_disabled(const struct elink_params *params) - } - /****************************************************************************** - * Description: -- * E3B0 disable will return basicly the values to init values. -+ * E3B0 disable will return basically the values to init values. - *. - ******************************************************************************/ - static elink_status_t elink_ets_e3b0_disabled(const struct elink_params *params, -@@ -1483,7 +1483,7 @@ static elink_status_t elink_ets_e3b0_disabled(const struct elink_params *params, - - /****************************************************************************** - * Description: -- * Disable will return basicly the values to init values. -+ * Disable will return basically the values to init values. - * - ******************************************************************************/ - elink_status_t elink_ets_disabled(struct elink_params *params, -@@ -1506,7 +1506,7 @@ elink_status_t elink_ets_disabled(struct elink_params *params, - - /****************************************************************************** - * Description -- * Set the COS mappimg to SP and BW until this point all the COS are not -+ * Set the COS mapping to SP and BW until this point all the COS are not - * set as SP or BW. - ******************************************************************************/ - static elink_status_t elink_ets_e3b0_cli_map(const struct elink_params *params, -@@ -1652,7 +1652,7 @@ static elink_status_t elink_ets_e3b0_get_total_bw( - } - ELINK_DEBUG_P0(sc, - "elink_ets_E3B0_config total BW should be 100"); -- /* We can handle a case whre the BW isn't 100 this can happen -+ /* We can handle a case where the BW isn't 100 this can happen - * if the TC are joined. - */ - } -@@ -2608,7 +2608,7 @@ static elink_status_t elink_emac_enable(struct elink_params *params, - REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + port * 4, 1); - - #ifdef ELINK_INCLUDE_EMUL -- /* for paladium */ -+ /* for palladium */ - if (CHIP_REV_IS_EMUL(sc)) { - /* Use lane 1 (of lanes 0-3) */ - REG_WR(sc, NIG_REG_XGXS_LANE_SEL_P0 + port * 4, 1); -@@ -2850,7 +2850,7 @@ static void elink_update_pfc_bmac2(struct elink_params *params, - - /* Set Time (based unit is 512 bit time) between automatic - * re-sending of PP packets amd enable automatic re-send of -- * Per-Priroity Packet as long as pp_gen is asserted and -+ * Per-Priority Packet as long as pp_gen is asserted and - * pp_disable is low. - */ - val = 0x8000; -@@ -3369,7 +3369,7 @@ static elink_status_t elink_pbf_update(struct elink_params *params, - } - - /** -- * elink_get_emac_base - retrive emac base address -+ * elink_get_emac_base - retrieve emac base address - * - * @bp: driver handle - * @mdc_mdio_access: access type -@@ -4518,7 +4518,7 @@ static void elink_warpcore_enable_AN_KR2(struct elink_phy *phy, - elink_cl45_write(sc, phy, reg_set[i].devad, reg_set[i].reg, - reg_set[i].val); - -- /* Start KR2 work-around timer which handles BNX2X8073 link-parner */ -+ /* Start KR2 work-around timer which handles BNX2X8073 link-partner */ - params->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE; - elink_update_link_attr(params, params->link_attr_sync); - } -@@ -7824,7 +7824,7 @@ elink_status_t elink_link_update(struct elink_params *params, - * hence its link is expected to be down - * - SECOND_PHY means that first phy should not be able - * to link up by itself (using configuration) -- * - DEFAULT should be overridden during initialiazation -+ * - DEFAULT should be overridden during initialization - */ - ELINK_DEBUG_P1(sc, "Invalid link indication" - " mpc=0x%x. DISABLING LINK !!!", -@@ -10991,7 +10991,7 @@ static elink_status_t elink_84858_cmd_hdlr(struct elink_phy *phy, - ELINK_DEBUG_P0(sc, "FW cmd failed."); - return ELINK_STATUS_ERROR; - } -- /* Step5: Once the command has completed, read the specficied DATA -+ /* Step5: Once the command has completed, read the specified DATA - * registers for any saved results for the command, if applicable - */ - -diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c -index f53f8632fe..7bcf36c9cb 100644 ---- a/drivers/net/bnxt/bnxt_hwrm.c -+++ b/drivers/net/bnxt/bnxt_hwrm.c -@@ -3727,7 +3727,7 @@ int bnxt_hwrm_allocate_pf_only(struct bnxt *bp) - int rc; - - if (!BNXT_PF(bp)) { -- PMD_DRV_LOG(ERR, "Attempt to allcoate VFs on a VF!\n"); -+ PMD_DRV_LOG(ERR, "Attempt to allocate VFs on a VF!\n"); - return -EINVAL; - } - -diff --git a/drivers/net/bnxt/tf_core/tfp.c b/drivers/net/bnxt/tf_core/tfp.c -index a4b0934610..a967a9ccf2 100644 ---- a/drivers/net/bnxt/tf_core/tfp.c -+++ b/drivers/net/bnxt/tf_core/tfp.c -@@ -52,7 +52,7 @@ tfp_send_msg_direct(struct bnxt *bp, - } - - /** -- * Allocates zero'ed memory from the heap. -+ * Allocates zeroed memory from the heap. - * - * Returns success or failure code. - */ -diff --git a/drivers/net/bnxt/tf_core/tfp.h b/drivers/net/bnxt/tf_core/tfp.h -index dd0a347058..5a99c7a06e 100644 ---- a/drivers/net/bnxt/tf_core/tfp.h -+++ b/drivers/net/bnxt/tf_core/tfp.h -@@ -150,7 +150,7 @@ tfp_msg_hwrm_oem_cmd(struct tf *tfp, - uint32_t max_flows); - - /** -- * Allocates zero'ed memory from the heap. -+ * Allocates zeroed memory from the heap. - * - * NOTE: Also performs virt2phy address conversion by default thus is - * can be expensive to invoke. -diff --git a/drivers/net/bonding/eth_bond_8023ad_private.h b/drivers/net/bonding/eth_bond_8023ad_private.h -index 9b5738afee..a5e1fffea1 100644 ---- a/drivers/net/bonding/eth_bond_8023ad_private.h -+++ b/drivers/net/bonding/eth_bond_8023ad_private.h -@@ -20,7 +20,7 @@ - /** Maximum number of LACP packets from one slave queued in TX ring. */ - #define BOND_MODE_8023AX_SLAVE_TX_PKTS 1 - /** -- * Timeouts deffinitions (5.4.4 in 802.1AX documentation). -+ * Timeouts definitions (5.4.4 in 802.1AX documentation). - */ - #define BOND_8023AD_FAST_PERIODIC_MS 900 - #define BOND_8023AD_SLOW_PERIODIC_MS 29000 -diff --git a/drivers/net/bonding/eth_bond_private.h b/drivers/net/bonding/eth_bond_private.h -index 8b104b6391..9626b26d67 100644 ---- a/drivers/net/bonding/eth_bond_private.h -+++ b/drivers/net/bonding/eth_bond_private.h -@@ -139,7 +139,7 @@ struct bond_dev_private { - - uint16_t slave_count; /**< Number of bonded slaves */ - struct bond_slave_details slaves[RTE_MAX_ETHPORTS]; -- /**< Arary of bonded slaves details */ -+ /**< Array of bonded slaves details */ - - struct mode8023ad_private mode4; - uint16_t tlb_slaves_order[RTE_MAX_ETHPORTS]; -diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c -index ca50583d62..b3cddd8a20 100644 ---- a/drivers/net/bonding/rte_eth_bond_8023ad.c -+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c -@@ -243,7 +243,7 @@ record_default(struct port *port) - { - /* Record default parameters for partner. Partner admin parameters - * are not implemented so set them to arbitrary default (last known) and -- * mark actor that parner is in defaulted state. */ -+ * mark actor that partner is in defaulted state. */ - port->partner_state = STATE_LACP_ACTIVE; - ACTOR_STATE_SET(port, DEFAULTED); - } -@@ -300,7 +300,7 @@ rx_machine(struct bond_dev_private *internals, uint16_t slave_id, - MODE4_DEBUG("LACP -> CURRENT\n"); - BOND_PRINT_LACP(lacp); - /* Update selected flag. If partner parameters are defaulted assume they -- * are match. If not defaulted compare LACP actor with ports parner -+ * are match. If not defaulted compare LACP actor with ports partner - * params. */ - if (!ACTOR_STATE(port, DEFAULTED) && - (ACTOR_STATE(port, AGGREGATION) != PARTNER_STATE(port, AGGREGATION) -@@ -399,16 +399,16 @@ periodic_machine(struct bond_dev_private *internals, uint16_t slave_id) - PARTNER_STATE(port, LACP_ACTIVE); - - uint8_t is_partner_fast, was_partner_fast; -- /* No periodic is on BEGIN, LACP DISABLE or when both sides are pasive */ -+ /* No periodic is on BEGIN, LACP DISABLE or when both sides are passive */ - if (SM_FLAG(port, BEGIN) || !SM_FLAG(port, LACP_ENABLED) || !active) { - timer_cancel(&port->periodic_timer); - timer_force_expired(&port->tx_machine_timer); - SM_FLAG_CLR(port, PARTNER_SHORT_TIMEOUT); - - MODE4_DEBUG("-> NO_PERIODIC ( %s%s%s)\n", -- SM_FLAG(port, BEGIN) ? "begind " : "", -+ SM_FLAG(port, BEGIN) ? "begin " : "", - SM_FLAG(port, LACP_ENABLED) ? "" : "LACP disabled ", -- active ? "LACP active " : "LACP pasive "); -+ active ? "LACP active " : "LACP passive "); - return; - } - -@@ -495,10 +495,10 @@ mux_machine(struct bond_dev_private *internals, uint16_t slave_id) - if ((ACTOR_STATE(port, DISTRIBUTING) || ACTOR_STATE(port, COLLECTING)) && - !PARTNER_STATE(port, SYNCHRONIZATION)) { - /* If in COLLECTING or DISTRIBUTING state and partner becomes out of -- * sync transit to ATACHED state. */ -+ * sync transit to ATTACHED state. */ - ACTOR_STATE_CLR(port, DISTRIBUTING); - ACTOR_STATE_CLR(port, COLLECTING); -- /* Clear actor sync to activate transit ATACHED in condition bellow */ -+ /* Clear actor sync to activate transit ATTACHED in condition bellow */ - ACTOR_STATE_CLR(port, SYNCHRONIZATION); - MODE4_DEBUG("Out of sync -> ATTACHED\n"); - } -@@ -696,7 +696,7 @@ selection_logic(struct bond_dev_private *internals, uint16_t slave_id) - /* Search for aggregator suitable for this port */ - for (i = 0; i < slaves_count; ++i) { - agg = &bond_mode_8023ad_ports[slaves[i]]; -- /* Skip ports that are not aggreagators */ -+ /* Skip ports that are not aggregators */ - if (agg->aggregator_port_id != slaves[i]) - continue; - -@@ -921,7 +921,7 @@ bond_mode_8023ad_periodic_cb(void *arg) - - SM_FLAG_SET(port, BEGIN); - -- /* LACP is disabled on half duples or link is down */ -+ /* LACP is disabled on half duplex or link is down */ - if (SM_FLAG(port, LACP_ENABLED)) { - /* If port was enabled set it to BEGIN state */ - SM_FLAG_CLR(port, LACP_ENABLED); -@@ -1069,7 +1069,7 @@ bond_mode_8023ad_activate_slave(struct rte_eth_dev *bond_dev, - port->partner_state = STATE_LACP_ACTIVE | STATE_AGGREGATION; - port->sm_flags = SM_FLAGS_BEGIN; - -- /* use this port as agregator */ -+ /* use this port as aggregator */ - port->aggregator_port_id = slave_id; - - if (bond_mode_8023ad_register_lacp_mac(slave_id) < 0) { -diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h -index 11a71a55e5..7eb392f8c8 100644 ---- a/drivers/net/bonding/rte_eth_bond_8023ad.h -+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h -@@ -68,7 +68,7 @@ struct port_params { - struct rte_ether_addr system; - /**< System ID - Slave MAC address, same as bonding MAC address */ - uint16_t key; -- /**< Speed information (implementation dependednt) and duplex. */ -+ /**< Speed information (implementation dependent) and duplex. */ - uint16_t port_priority; - /**< Priority of this (unused in current implementation) */ - uint16_t port_number; -@@ -317,7 +317,7 @@ rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id); - * @param port_id Bonding device id - * - * @return -- * agregator mode on success, negative value otherwise -+ * aggregator mode on success, negative value otherwise - */ - int - rte_eth_bond_8023ad_agg_selection_get(uint16_t port_id); -diff --git a/drivers/net/bonding/rte_eth_bond_alb.h b/drivers/net/bonding/rte_eth_bond_alb.h -index 386e70c594..4e9aeda9bc 100644 ---- a/drivers/net/bonding/rte_eth_bond_alb.h -+++ b/drivers/net/bonding/rte_eth_bond_alb.h -@@ -96,7 +96,7 @@ bond_mode_alb_arp_xmit(struct rte_ether_hdr *eth_h, uint16_t offset, - * @param internals Bonding data. - * - * @return -- * Index of slawe on which packet should be sent. -+ * Index of slave on which packet should be sent. - */ - uint16_t - bond_mode_alb_arp_upd(struct client_data *client_info, -diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c -index 84943cffe2..2d5cac6c51 100644 ---- a/drivers/net/bonding/rte_eth_bond_api.c -+++ b/drivers/net/bonding/rte_eth_bond_api.c -@@ -375,7 +375,7 @@ eth_bond_slave_inherit_dev_info_rx_next(struct bond_dev_private *internals, - * value. Thus, the new internal value of default Rx queue offloads - * has to be masked by rx_queue_offload_capa to make sure that only - * commonly supported offloads are preserved from both the previous -- * value and the value being inhereted from the new slave device. -+ * value and the value being inherited from the new slave device. - */ - rxconf_i->offloads = (rxconf_i->offloads | rxconf->offloads) & - internals->rx_queue_offload_capa; -@@ -413,7 +413,7 @@ eth_bond_slave_inherit_dev_info_tx_next(struct bond_dev_private *internals, - * value. Thus, the new internal value of default Tx queue offloads - * has to be masked by tx_queue_offload_capa to make sure that only - * commonly supported offloads are preserved from both the previous -- * value and the value being inhereted from the new slave device. -+ * value and the value being inherited from the new slave device. - */ - txconf_i->offloads = (txconf_i->offloads | txconf->offloads) & - internals->tx_queue_offload_capa; -diff --git a/drivers/net/cnxk/cn10k_ethdev.h b/drivers/net/cnxk/cn10k_ethdev.h -index c2a46ad7ec..0982158c62 100644 ---- a/drivers/net/cnxk/cn10k_ethdev.h -+++ b/drivers/net/cnxk/cn10k_ethdev.h -@@ -53,7 +53,7 @@ struct cn10k_outb_priv_data { - void *userdata; - /* Rlen computation data */ - struct cnxk_ipsec_outb_rlens rlens; -- /* Back pinter to eth sec session */ -+ /* Back pointer to eth sec session */ - struct cnxk_eth_sec_sess *eth_sec; - /* SA index */ - uint32_t sa_idx; -diff --git a/drivers/net/cnxk/cn10k_tx.h b/drivers/net/cnxk/cn10k_tx.h -index 873e1871f9..f3a282f429 100644 ---- a/drivers/net/cnxk/cn10k_tx.h -+++ b/drivers/net/cnxk/cn10k_tx.h -@@ -736,7 +736,7 @@ cn10k_nix_xmit_prepare_tstamp(uintptr_t lmt_addr, const uint64_t *cmd, - /* Retrieving the default desc values */ - lmt[off] = cmd[2]; - -- /* Using compiler barier to avoid voilation of C -+ /* Using compiler barrier to avoid violation of C - * aliasing rules. - */ - rte_compiler_barrier(); -@@ -745,7 +745,7 @@ cn10k_nix_xmit_prepare_tstamp(uintptr_t lmt_addr, const uint64_t *cmd, - /* Packets for which RTE_MBUF_F_TX_IEEE1588_TMST is not set, tx tstamp - * should not be recorded, hence changing the alg type to - * NIX_SENDMEMALG_SET and also changing send mem addr field to -- * next 8 bytes as it corrpt the actual tx tstamp registered -+ * next 8 bytes as it corrupts the actual Tx tstamp registered - * address. - */ - send_mem->w0.subdc = NIX_SUBDC_MEM; -@@ -2254,7 +2254,7 @@ cn10k_nix_xmit_pkts_vector(void *tx_queue, struct rte_mbuf **tx_pkts, - } - - if (flags & NIX_TX_OFFLOAD_TSTAMP_F) { -- /* Tx ol_flag for timestam. */ -+ /* Tx ol_flag for timestamp. */ - const uint64x2_t olf = {RTE_MBUF_F_TX_IEEE1588_TMST, - RTE_MBUF_F_TX_IEEE1588_TMST}; - /* Set send mem alg to SUB. */ -diff --git a/drivers/net/cnxk/cn9k_tx.h b/drivers/net/cnxk/cn9k_tx.h -index 435dde1317..070a7d9439 100644 ---- a/drivers/net/cnxk/cn9k_tx.h -+++ b/drivers/net/cnxk/cn9k_tx.h -@@ -304,7 +304,7 @@ cn9k_nix_xmit_prepare_tstamp(uint64_t *cmd, const uint64_t *send_mem_desc, - /* Retrieving the default desc values */ - cmd[off] = send_mem_desc[6]; - -- /* Using compiler barier to avoid voilation of C -+ /* Using compiler barrier to avoid violation of C - * aliasing rules. - */ - rte_compiler_barrier(); -@@ -313,7 +313,7 @@ cn9k_nix_xmit_prepare_tstamp(uint64_t *cmd, const uint64_t *send_mem_desc, - /* Packets for which RTE_MBUF_F_TX_IEEE1588_TMST is not set, tx tstamp - * should not be recorded, hence changing the alg type to - * NIX_SENDMEMALG_SET and also changing send mem addr field to -- * next 8 bytes as it corrpt the actual tx tstamp registered -+ * next 8 bytes as it corrupts the actual Tx tstamp registered - * address. - */ - send_mem->w0.cn9k.alg = -@@ -1531,7 +1531,7 @@ cn9k_nix_xmit_pkts_vector(void *tx_queue, struct rte_mbuf **tx_pkts, - } - - if (flags & NIX_TX_OFFLOAD_TSTAMP_F) { -- /* Tx ol_flag for timestam. */ -+ /* Tx ol_flag for timestamp. */ - const uint64x2_t olf = {RTE_MBUF_F_TX_IEEE1588_TMST, - RTE_MBUF_F_TX_IEEE1588_TMST}; - /* Set send mem alg to SUB. */ -diff --git a/drivers/net/cnxk/cnxk_ptp.c b/drivers/net/cnxk/cnxk_ptp.c -index 139fea256c..359f9a30ae 100644 ---- a/drivers/net/cnxk/cnxk_ptp.c -+++ b/drivers/net/cnxk/cnxk_ptp.c -@@ -12,7 +12,7 @@ cnxk_nix_read_clock(struct rte_eth_dev *eth_dev, uint64_t *clock) - /* This API returns the raw PTP HI clock value. Since LFs do not - * have direct access to PTP registers and it requires mbox msg - * to AF for this value. In fastpath reading this value for every -- * packet (which involes mbox call) becomes very expensive, hence -+ * packet (which involves mbox call) becomes very expensive, hence - * we should be able to derive PTP HI clock value from tsc by - * using freq_mult and clk_delta calculated during configure stage. - */ -diff --git a/drivers/net/cxgbe/cxgbe_flow.c b/drivers/net/cxgbe/cxgbe_flow.c -index edcbba9d7c..6e460dfe2e 100644 ---- a/drivers/net/cxgbe/cxgbe_flow.c -+++ b/drivers/net/cxgbe/cxgbe_flow.c -@@ -1378,7 +1378,7 @@ cxgbe_flow_validate(struct rte_eth_dev *dev, - } - - /* -- * @ret : > 0 filter destroyed succsesfully -+ * @ret : > 0 filter destroyed successfully - * < 0 error destroying filter - * == 1 filter not active / not found - */ -diff --git a/drivers/net/cxgbe/cxgbevf_main.c b/drivers/net/cxgbe/cxgbevf_main.c -index f639612ae4..d0c93f8ac3 100644 ---- a/drivers/net/cxgbe/cxgbevf_main.c -+++ b/drivers/net/cxgbe/cxgbevf_main.c -@@ -44,7 +44,7 @@ static void size_nports_qsets(struct adapter *adapter) - */ - pmask_nports = hweight32(adapter->params.vfres.pmask); - if (pmask_nports < adapter->params.nports) { -- dev_warn(adapter->pdev_dev, "only using %d of %d provissioned" -+ dev_warn(adapter->pdev_dev, "only using %d of %d provisioned" - " virtual interfaces; limited by Port Access Rights" - " mask %#x\n", pmask_nports, adapter->params.nports, - adapter->params.vfres.pmask); -diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c -index f623f3e684..1c76b8e4d0 100644 ---- a/drivers/net/cxgbe/sge.c -+++ b/drivers/net/cxgbe/sge.c -@@ -211,7 +211,7 @@ static inline unsigned int fl_cap(const struct sge_fl *fl) - * @fl: the Free List - * - * Tests specified Free List to see whether the number of buffers -- * available to the hardware has falled below our "starvation" -+ * available to the hardware has fallen below our "starvation" - * threshold. - */ - static inline bool fl_starving(const struct adapter *adapter, -@@ -678,7 +678,7 @@ static void write_sgl(struct rte_mbuf *mbuf, struct sge_txq *q, - * @q: the Tx queue - * @n: number of new descriptors to give to HW - * -- * Ring the doorbel for a Tx queue. -+ * Ring the doorbell for a Tx queue. - */ - static inline void ring_tx_db(struct adapter *adap, struct sge_txq *q) - { -@@ -877,7 +877,7 @@ static inline void ship_tx_pkt_coalesce_wr(struct adapter *adap, - } - - /** -- * should_tx_packet_coalesce - decides wether to coalesce an mbuf or not -+ * should_tx_packet_coalesce - decides whether to coalesce an mbuf or not - * @txq: tx queue where the mbuf is sent - * @mbuf: mbuf to be sent - * @nflits: return value for number of flits needed -@@ -1846,7 +1846,7 @@ int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq, - * for its status page) along with the associated software - * descriptor ring. The free list size needs to be a multiple - * of the Egress Queue Unit and at least 2 Egress Units larger -- * than the SGE's Egress Congrestion Threshold -+ * than the SGE's Egress Congestion Threshold - * (fl_starve_thres - 1). - */ - if (fl->size < s->fl_starve_thres - 1 + 2 * 8) -diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c -index e49f765434..2c2c4e4ebb 100644 ---- a/drivers/net/dpaa/dpaa_ethdev.c -+++ b/drivers/net/dpaa/dpaa_ethdev.c -@@ -1030,7 +1030,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, - QM_FQCTRL_CTXASTASHING | - QM_FQCTRL_PREFERINCACHE; - opts.fqd.context_a.stashing.exclusive = 0; -- /* In muticore scenario stashing becomes a bottleneck on LS1046. -+ /* In multicore scenario stashing becomes a bottleneck on LS1046. - * So do not enable stashing in this case - */ - if (dpaa_svr_family != SVR_LS1046A_FAMILY) -@@ -1866,7 +1866,7 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev) - - dpaa_intf->name = dpaa_device->name; - -- /* save fman_if & cfg in the interface struture */ -+ /* save fman_if & cfg in the interface structure */ - eth_dev->process_private = fman_intf; - dpaa_intf->ifid = dev_id; - dpaa_intf->cfg = cfg; -@@ -2169,7 +2169,7 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv, - if (dpaa_svr_family == SVR_LS1043A_FAMILY) - dpaa_push_mode_max_queue = 0; - -- /* if push mode queues to be enabled. Currenly we are allowing -+ /* if push mode queues to be enabled. Currently we are allowing - * only one queue per thread. - */ - if (getenv("DPAA_PUSH_QUEUES_NUMBER")) { -diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c -index ffac6ce3e2..956fe946fa 100644 ---- a/drivers/net/dpaa/dpaa_rxtx.c -+++ b/drivers/net/dpaa/dpaa_rxtx.c -@@ -600,8 +600,8 @@ void dpaa_rx_cb_prepare(struct qm_dqrr_entry *dq, void **bufs) - void *ptr = rte_dpaa_mem_ptov(qm_fd_addr(&dq->fd)); - - /* In case of LS1046, annotation stashing is disabled due to L2 cache -- * being bottleneck in case of multicore scanario for this platform. -- * So we prefetch the annoation beforehand, so that it is available -+ * being bottleneck in case of multicore scenario for this platform. -+ * So we prefetch the annotation beforehand, so that it is available - * in cache when accessed. - */ - rte_prefetch0((void *)((uint8_t *)ptr + DEFAULT_RX_ICEOF)); -diff --git a/drivers/net/dpaa/fmlib/fm_ext.h b/drivers/net/dpaa/fmlib/fm_ext.h -index 27c9fb471e..8e7153bdaf 100644 ---- a/drivers/net/dpaa/fmlib/fm_ext.h -+++ b/drivers/net/dpaa/fmlib/fm_ext.h -@@ -176,7 +176,7 @@ typedef struct t_fm_prs_result { - #define FM_FD_ERR_PRS_HDR_ERR 0x00000020 - /**< Header error was identified during parsing */ - #define FM_FD_ERR_BLOCK_LIMIT_EXCEEDED 0x00000008 -- /**< Frame parsed beyind 256 first bytes */ -+ /**< Frame parsed beyond 256 first bytes */ - - #define FM_FD_TX_STATUS_ERR_MASK (FM_FD_ERR_UNSUPPORTED_FORMAT | \ - FM_FD_ERR_LENGTH | \ -diff --git a/drivers/net/dpaa/fmlib/fm_pcd_ext.h b/drivers/net/dpaa/fmlib/fm_pcd_ext.h -index 8be3885fbc..3802b42916 100644 ---- a/drivers/net/dpaa/fmlib/fm_pcd_ext.h -+++ b/drivers/net/dpaa/fmlib/fm_pcd_ext.h -@@ -276,7 +276,7 @@ typedef struct ioc_fm_pcd_counters_params_t { - } ioc_fm_pcd_counters_params_t; - - /* -- * @Description structure for FM exception definitios -+ * @Description structure for FM exception definitions - */ - typedef struct ioc_fm_pcd_exception_params_t { - ioc_fm_pcd_exceptions exception; /**< The requested exception */ -@@ -883,7 +883,7 @@ typedef enum ioc_fm_pcd_manip_hdr_rmv_specific_l2 { - e_IOC_FM_PCD_MANIP_HDR_RMV_ETHERNET, /**< Ethernet/802.3 MAC */ - e_IOC_FM_PCD_MANIP_HDR_RMV_STACKED_QTAGS, /**< stacked QTags */ - e_IOC_FM_PCD_MANIP_HDR_RMV_ETHERNET_AND_MPLS, -- /**< MPLS and Ethernet/802.3 MAC header unitl the header -+ /**< MPLS and Ethernet/802.3 MAC header until the header - * which follows the MPLS header - */ - e_IOC_FM_PCD_MANIP_HDR_RMV_MPLS -@@ -3293,7 +3293,7 @@ typedef struct ioc_fm_pcd_cc_tbl_get_stats_t { - /* - * @Function fm_pcd_net_env_characteristics_delete - * -- * @Description Deletes a set of Network Environment Charecteristics. -+ * @Description Deletes a set of Network Environment Characteristics. - * - * @Param[in] ioc_fm_obj_t The id of a Network Environment object. - * -@@ -3493,7 +3493,7 @@ typedef struct ioc_fm_pcd_cc_tbl_get_stats_t { - * @Return 0 on success; Error code otherwise. - * - * @Cautions Allowed only following fm_pcd_match_table_set() not only of -- * the relevnt node but also the node that points to this node. -+ * the relevant node but also the node that points to this node. - */ - #define FM_PCD_IOC_MATCH_TABLE_MODIFY_KEY_AND_NEXT_ENGINE \ - _IOW(FM_IOC_TYPE_BASE, FM_PCD_IOC_NUM(35), \ -diff --git a/drivers/net/dpaa/fmlib/fm_port_ext.h b/drivers/net/dpaa/fmlib/fm_port_ext.h -index 6f5479fbe1..bb2e00222e 100644 ---- a/drivers/net/dpaa/fmlib/fm_port_ext.h -+++ b/drivers/net/dpaa/fmlib/fm_port_ext.h -@@ -498,7 +498,7 @@ typedef struct ioc_fm_port_pcd_prs_params_t { - /**< Number of bytes from beginning of packet to start parsing - */ - ioc_net_header_type first_prs_hdr; -- /**< The type of the first header axpected at 'parsing_offset' -+ /**< The type of the first header expected at 'parsing_offset' - */ - bool include_in_prs_statistics; - /**< TRUE to include this port in the parser statistics */ -@@ -524,7 +524,7 @@ typedef struct ioc_fm_port_pcd_prs_params_t { - } ioc_fm_port_pcd_prs_params_t; - - /* -- * @Description A structure for defining coarse alassification parameters -+ * @Description A structure for defining coarse classification parameters - * (Must match t_fm_portPcdCcParams defined in fm_port_ext.h) - */ - typedef struct ioc_fm_port_pcd_cc_params_t { -@@ -602,7 +602,7 @@ typedef struct ioc_fm_pcd_prs_start_t { - /**< Number of bytes from beginning of packet to start parsing - */ - ioc_net_header_type first_prs_hdr; -- /**< The type of the first header axpected at 'parsing_offset' -+ /**< The type of the first header expected at 'parsing_offset' - */ - } ioc_fm_pcd_prs_start_t; - -@@ -1356,7 +1356,7 @@ typedef uint32_t fm_port_frame_err_select_t; - #define FM_PORT_FRM_ERR_PRS_HDR_ERR FM_FD_ERR_PRS_HDR_ERR - /**< Header error was identified during parsing */ - #define FM_PORT_FRM_ERR_BLOCK_LIMIT_EXCEEDED FM_FD_ERR_BLOCK_LIMIT_EXCEEDED -- /**< Frame parsed beyind 256 first bytes */ -+ /**< Frame parsed beyond 256 first bytes */ - #define FM_PORT_FRM_ERR_PROCESS_TIMEOUT 0x00000001 - /**< FPM Frame Processing Timeout Exceeded */ - /* @} */ -@@ -1390,7 +1390,7 @@ typedef void (t_fm_port_exception_callback) (t_handle h_app, - * @Param[in] length length of received data - * @Param[in] status receive status and errors - * @Param[in] position position of buffer in frame -- * @Param[in] h_buf_context A handle of the user acossiated with this buffer -+ * @Param[in] h_buf_context A handle of the user associated with this buffer - * - * @Retval e_RX_STORE_RESPONSE_CONTINUE - * order the driver to continue Rx operation for all ready data. -@@ -1414,7 +1414,7 @@ typedef e_rx_store_response(t_fm_port_im_rx_store_callback) (t_handle h_app, - * @Param[in] p_data A pointer to data received - * @Param[in] status transmit status and errors - * @Param[in] last_buffer is last buffer in frame -- * @Param[in] h_buf_context A handle of the user acossiated with this buffer -+ * @Param[in] h_buf_context A handle of the user associated with this buffer - */ - typedef void (t_fm_port_im_tx_conf_callback) (t_handle h_app, - uint8_t *p_data, -@@ -2585,7 +2585,7 @@ typedef struct t_fm_port_congestion_grps { - bool pfc_prio_enable[FM_NUM_CONG_GRPS][FM_MAX_PFC_PRIO]; - /**< a matrix that represents the map between the CG ids - * defined in 'congestion_grps_to_consider' to the -- * priorties mapping array. -+ * priorities mapping array. - */ - } t_fm_port_congestion_grps; - -diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c -index a3706439d5..2b04f14168 100644 ---- a/drivers/net/dpaa2/dpaa2_ethdev.c -+++ b/drivers/net/dpaa2/dpaa2_ethdev.c -@@ -143,7 +143,7 @@ dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask) - PMD_INIT_FUNC_TRACE(); - - if (mask & RTE_ETH_VLAN_FILTER_MASK) { -- /* VLAN Filter not avaialble */ -+ /* VLAN Filter not available */ - if (!priv->max_vlan_filters) { - DPAA2_PMD_INFO("VLAN filter not available"); - return -ENOTSUP; -@@ -916,7 +916,7 @@ dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev, - cong_notif_cfg.units = DPNI_CONGESTION_UNIT_FRAMES; - cong_notif_cfg.threshold_entry = nb_tx_desc; - /* Notify that the queue is not congested when the data in -- * the queue is below this thershold.(90% of value) -+ * the queue is below this threshold.(90% of value) - */ - cong_notif_cfg.threshold_exit = (nb_tx_desc * 9) / 10; - cong_notif_cfg.message_ctx = 0; -@@ -1058,7 +1058,7 @@ dpaa2_supported_ptypes_get(struct rte_eth_dev *dev) - * Dpaa2 link Interrupt handler - * - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -2236,7 +2236,7 @@ int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev, - ocfg.oa = 1; - /* Late arrival window size disabled */ - ocfg.olws = 0; -- /* ORL resource exhaustaion advance NESN disabled */ -+ /* ORL resource exhaustion advance NESN disabled */ - ocfg.oeane = 0; - /* Loose ordering enabled */ - ocfg.oloe = 1; -@@ -2720,13 +2720,13 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev) - } - eth_dev->tx_pkt_burst = dpaa2_dev_tx; - -- /*Init fields w.r.t. classficaition*/ -+ /* Init fields w.r.t. classification */ - memset(&priv->extract.qos_key_extract, 0, - sizeof(struct dpaa2_key_extract)); - priv->extract.qos_extract_param = (size_t)rte_malloc(NULL, 256, 64); - if (!priv->extract.qos_extract_param) { - DPAA2_PMD_ERR(" Error(%d) in allocation resources for flow " -- " classificaiton ", ret); -+ " classification ", ret); - goto init_err; - } - priv->extract.qos_key_extract.key_info.ipv4_src_offset = -@@ -2744,7 +2744,7 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev) - priv->extract.tc_extract_param[i] = - (size_t)rte_malloc(NULL, 256, 64); - if (!priv->extract.tc_extract_param[i]) { -- DPAA2_PMD_ERR(" Error(%d) in allocation resources for flow classificaiton", -+ DPAA2_PMD_ERR(" Error(%d) in allocation resources for flow classification", - ret); - goto init_err; - } -diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h -index c5e9267bf0..e27239e256 100644 ---- a/drivers/net/dpaa2/dpaa2_ethdev.h -+++ b/drivers/net/dpaa2/dpaa2_ethdev.h -@@ -117,7 +117,7 @@ extern int dpaa2_timestamp_dynfield_offset; - - #define DPAA2_FLOW_MAX_KEY_SIZE 16 - --/*Externaly defined*/ -+/* Externally defined */ - extern const struct rte_flow_ops dpaa2_flow_ops; - - extern const struct rte_tm_ops dpaa2_tm_ops; -diff --git a/drivers/net/dpaa2/dpaa2_flow.c b/drivers/net/dpaa2/dpaa2_flow.c -index 84fe37a7c0..bf55eb70a3 100644 ---- a/drivers/net/dpaa2/dpaa2_flow.c -+++ b/drivers/net/dpaa2/dpaa2_flow.c -@@ -1451,7 +1451,7 @@ dpaa2_configure_flow_generic_ip( - flow, pattern, &local_cfg, - device_configured, group); - if (ret) { -- DPAA2_PMD_ERR("IP discrimation failed!"); -+ DPAA2_PMD_ERR("IP discrimination failed!"); - return -1; - } - -@@ -3349,7 +3349,7 @@ dpaa2_flow_verify_action( - (actions[j].conf); - if (rss_conf->queue_num > priv->dist_queues) { - DPAA2_PMD_ERR( -- "RSS number exceeds the distrbution size"); -+ "RSS number exceeds the distribution size"); - return -ENOTSUP; - } - for (i = 0; i < (int)rss_conf->queue_num; i++) { -@@ -3596,7 +3596,7 @@ dpaa2_generic_flow_set(struct rte_flow *flow, - qos_cfg.keep_entries = true; - qos_cfg.key_cfg_iova = - (size_t)priv->extract.qos_extract_param; -- /* QoS table is effecitive for multiple TCs.*/ -+ /* QoS table is effective for multiple TCs. */ - if (priv->num_rx_tc > 1) { - ret = dpni_set_qos_table(dpni, CMD_PRI_LOW, - priv->token, &qos_cfg); -@@ -3655,7 +3655,7 @@ dpaa2_generic_flow_set(struct rte_flow *flow, - 0, 0); - if (ret < 0) { - DPAA2_PMD_ERR( -- "Error in addnig entry to QoS table(%d)", ret); -+ "Error in adding entry to QoS table(%d)", ret); - return ret; - } - } -diff --git a/drivers/net/dpaa2/dpaa2_mux.c b/drivers/net/dpaa2/dpaa2_mux.c -index d347f4df51..cd2f7b8aa5 100644 ---- a/drivers/net/dpaa2/dpaa2_mux.c -+++ b/drivers/net/dpaa2/dpaa2_mux.c -@@ -95,7 +95,7 @@ rte_pmd_dpaa2_mux_flow_create(uint32_t dpdmux_id, - mask_iova = (void *)((size_t)key_iova + DIST_PARAM_IOVA_SIZE); - - /* Currently taking only IP protocol as an extract type. -- * This can be exended to other fields using pattern->type. -+ * This can be extended to other fields using pattern->type. - */ - memset(&kg_cfg, 0, sizeof(struct dpkg_profile_cfg)); - -diff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c -index c65589a5f3..90b971b4bf 100644 ---- a/drivers/net/dpaa2/dpaa2_rxtx.c -+++ b/drivers/net/dpaa2/dpaa2_rxtx.c -@@ -714,7 +714,7 @@ dpaa2_dev_prefetch_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - rte_prefetch0((void *)(size_t)(dq_storage + 1)); - - /* Prepare next pull descriptor. This will give space for the -- * prefething done on DQRR entries -+ * prefetching done on DQRR entries - */ - q_storage->toggle ^= 1; - dq_storage1 = q_storage->dq_storage[q_storage->toggle]; -@@ -1510,7 +1510,7 @@ dpaa2_dev_tx_ordered(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - if (*dpaa2_seqn(*bufs)) { - /* Use only queue 0 for Tx in case of atomic/ - * ordered packets as packets can get unordered -- * when being tranmitted out from the interface -+ * when being transmitted out from the interface - */ - dpaa2_set_enqueue_descriptor(order_sendq, - (*bufs), -@@ -1738,7 +1738,7 @@ dpaa2_dev_loopback_rx(void *queue, - rte_prefetch0((void *)(size_t)(dq_storage + 1)); - - /* Prepare next pull descriptor. This will give space for the -- * prefething done on DQRR entries -+ * prefetching done on DQRR entries - */ - q_storage->toggle ^= 1; - dq_storage1 = q_storage->dq_storage[q_storage->toggle]; -diff --git a/drivers/net/dpaa2/mc/fsl_dpni.h b/drivers/net/dpaa2/mc/fsl_dpni.h -index 469ab9b3d4..3b9bffeed7 100644 ---- a/drivers/net/dpaa2/mc/fsl_dpni.h -+++ b/drivers/net/dpaa2/mc/fsl_dpni.h -@@ -93,7 +93,7 @@ struct fsl_mc_io; - */ - #define DPNI_OPT_OPR_PER_TC 0x000080 - /** -- * All Tx traffic classes will use a single sender (ignore num_queueus for tx) -+ * All Tx traffic classes will use a single sender (ignore num_queues for tx) - */ - #define DPNI_OPT_SINGLE_SENDER 0x000100 - /** -@@ -617,7 +617,7 @@ int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io, - * @page_3.ceetm_reject_bytes: Cumulative count of the number of bytes in all - * frames whose enqueue was rejected - * @page_3.ceetm_reject_frames: Cumulative count of all frame enqueues rejected -- * @page_4: congestion point drops for seleted TC -+ * @page_4: congestion point drops for selected TC - * @page_4.cgr_reject_frames: number of rejected frames due to congestion point - * @page_4.cgr_reject_bytes: number of rejected bytes due to congestion point - * @page_5: policer statistics per TC -@@ -1417,7 +1417,7 @@ int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io, - * dpkg_prepare_key_cfg() - * @discard_on_miss: Set to '1' to discard frames in case of no match (miss); - * '0' to use the 'default_tc' in such cases -- * @keep_entries: if set to one will not delele existing table entries. This -+ * @keep_entries: if set to one will not delete existing table entries. This - * option will work properly only for dpni objects created with - * DPNI_OPT_HAS_KEY_MASKING option. All previous QoS entries must - * be compatible with new key composition rule. -@@ -1516,7 +1516,7 @@ int dpni_clear_qos_table(struct fsl_mc_io *mc_io, - * @flow_id: Identifies the Rx queue used for matching traffic. Supported - * values are in range 0 to num_queue-1. - * @redirect_obj_token: token that identifies the object where frame is -- * redirected when this rule is hit. This paraneter is used only when one of the -+ * redirected when this rule is hit. This parameter is used only when one of the - * flags DPNI_FS_OPT_REDIRECT_TO_DPNI_RX or DPNI_FS_OPT_REDIRECT_TO_DPNI_TX is - * set. - * The token is obtained using dpni_open() API call. The object must stay -@@ -1797,7 +1797,7 @@ int dpni_load_sw_sequence(struct fsl_mc_io *mc_io, - struct dpni_load_ss_cfg *cfg); - - /** -- * dpni_eanble_sw_sequence() - Enables a software sequence in the parser -+ * dpni_enable_sw_sequence() - Enables a software sequence in the parser - * profile - * corresponding to the ingress or egress of the DPNI. - * @mc_io: Pointer to MC portal's I/O object -diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h -index a548ae2ccb..718a9746ed 100644 ---- a/drivers/net/e1000/e1000_ethdev.h -+++ b/drivers/net/e1000/e1000_ethdev.h -@@ -103,7 +103,7 @@ - * Maximum number of Ring Descriptors. - * - * Since RDLEN/TDLEN should be multiple of 128 bytes, the number of ring -- * desscriptors should meet the following condition: -+ * descriptors should meet the following condition: - * (num_ring_desc * sizeof(struct e1000_rx/tx_desc)) % 128 == 0 - */ - #define E1000_MIN_RING_DESC 32 -@@ -252,7 +252,7 @@ struct igb_rte_flow_rss_conf { - }; - - /* -- * Structure to store filters'info. -+ * Structure to store filters' info. - */ - struct e1000_filter_info { - uint8_t ethertype_mask; /* Bit mask for every used ethertype filter */ -diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c -index 31c4870086..794496abfc 100644 ---- a/drivers/net/e1000/em_ethdev.c -+++ b/drivers/net/e1000/em_ethdev.c -@@ -1058,8 +1058,8 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) - - /* - * Starting with 631xESB hw supports 2 TX/RX queues per port. -- * Unfortunatelly, all these nics have just one TX context. -- * So we have few choises for TX: -+ * Unfortunately, all these nics have just one TX context. -+ * So we have few choices for TX: - * - Use just one TX queue. - * - Allow cksum offload only for one TX queue. - * - Don't allow TX cksum offload at all. -@@ -1068,7 +1068,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) - * (Multiple Receive Queues are mutually exclusive with UDP - * fragmentation and are not supported when a legacy receive - * descriptor format is used). -- * Which means separate RX routinies - as legacy nics (82540, 82545) -+ * Which means separate RX routines - as legacy nics (82540, 82545) - * don't support extended RXD. - * To avoid it we support just one RX queue for now (no RSS). - */ -@@ -1558,7 +1558,7 @@ eth_em_interrupt_get_status(struct rte_eth_dev *dev) - } - - /* -- * It executes link_update after knowing an interrupt is prsent. -+ * It executes link_update after knowing an interrupt is present. - * - * @param dev - * Pointer to struct rte_eth_dev. -@@ -1616,7 +1616,7 @@ eth_em_interrupt_action(struct rte_eth_dev *dev, - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -diff --git a/drivers/net/e1000/em_rxtx.c b/drivers/net/e1000/em_rxtx.c -index 39262502bb..cea5b490ba 100644 ---- a/drivers/net/e1000/em_rxtx.c -+++ b/drivers/net/e1000/em_rxtx.c -@@ -141,7 +141,7 @@ union em_vlan_macip { - struct em_ctx_info { - uint64_t flags; /**< ol_flags related to context build. */ - uint32_t cmp_mask; /**< compare mask */ -- union em_vlan_macip hdrlen; /**< L2 and L3 header lenghts */ -+ union em_vlan_macip hdrlen; /**< L2 and L3 header lengths */ - }; - - /** -@@ -829,7 +829,7 @@ eth_em_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); -@@ -1074,7 +1074,7 @@ eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); -diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c -index 3ee16c15fe..a9c18b27e8 100644 ---- a/drivers/net/e1000/igb_ethdev.c -+++ b/drivers/net/e1000/igb_ethdev.c -@@ -1149,7 +1149,7 @@ eth_igb_configure(struct rte_eth_dev *dev) - if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) - dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; - -- /* multipe queue mode checking */ -+ /* multiple queue mode checking */ - ret = igb_check_mq_mode(dev); - if (ret != 0) { - PMD_DRV_LOG(ERR, "igb_check_mq_mode fails with %d.", -@@ -1265,7 +1265,7 @@ eth_igb_start(struct rte_eth_dev *dev) - } - } - -- /* confiugre msix for rx interrupt */ -+ /* configure MSI-X for Rx interrupt */ - eth_igb_configure_msix_intr(dev); - - /* Configure for OS presence */ -@@ -2819,7 +2819,7 @@ eth_igb_interrupt_get_status(struct rte_eth_dev *dev) - } - - /* -- * It executes link_update after knowing an interrupt is prsent. -+ * It executes link_update after knowing an interrupt is present. - * - * @param dev - * Pointer to struct rte_eth_dev. -@@ -2889,7 +2889,7 @@ eth_igb_interrupt_action(struct rte_eth_dev *dev, - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -3787,7 +3787,7 @@ igb_inject_2uple_filter(struct rte_eth_dev *dev, - * - * @param - * dev: Pointer to struct rte_eth_dev. -- * ntuple_filter: ponter to the filter that will be added. -+ * ntuple_filter: pointer to the filter that will be added. - * - * @return - * - On success, zero. -@@ -3868,7 +3868,7 @@ igb_delete_2tuple_filter(struct rte_eth_dev *dev, - * - * @param - * dev: Pointer to struct rte_eth_dev. -- * ntuple_filter: ponter to the filter that will be removed. -+ * ntuple_filter: pointer to the filter that will be removed. - * - * @return - * - On success, zero. -@@ -4226,7 +4226,7 @@ igb_inject_5tuple_filter_82576(struct rte_eth_dev *dev, - * - * @param - * dev: Pointer to struct rte_eth_dev. -- * ntuple_filter: ponter to the filter that will be added. -+ * ntuple_filter: pointer to the filter that will be added. - * - * @return - * - On success, zero. -@@ -4313,7 +4313,7 @@ igb_delete_5tuple_filter_82576(struct rte_eth_dev *dev, - * - * @param - * dev: Pointer to struct rte_eth_dev. -- * ntuple_filter: ponter to the filter that will be removed. -+ * ntuple_filter: pointer to the filter that will be removed. - * - * @return - * - On success, zero. -@@ -4831,7 +4831,7 @@ igb_timesync_disable(struct rte_eth_dev *dev) - /* Disable L2 filtering of IEEE1588/802.1AS Ethernet frame types. */ - E1000_WRITE_REG(hw, E1000_ETQF(E1000_ETQF_FILTER_1588), 0); - -- /* Stop incrementating the System Time registers. */ -+ /* Stop incrementing the System Time registers. */ - E1000_WRITE_REG(hw, E1000_TIMINCA, 0); - - return 0; -diff --git a/drivers/net/e1000/igb_flow.c b/drivers/net/e1000/igb_flow.c -index e72376f69c..e46697b6a1 100644 ---- a/drivers/net/e1000/igb_flow.c -+++ b/drivers/net/e1000/igb_flow.c -@@ -57,7 +57,7 @@ struct igb_flex_filter_list igb_filter_flex_list; - struct igb_rss_filter_list igb_filter_rss_list; - - /** -- * Please aware there's an asumption for all the parsers. -+ * Please be aware there's an assumption for all the parsers. - * rte_flow_item is using big endian, rte_flow_attr and - * rte_flow_action are using CPU order. - * Because the pattern is used to describe the packets, -@@ -1608,7 +1608,7 @@ igb_flow_create(struct rte_eth_dev *dev, - - /** - * Check if the flow rule is supported by igb. -- * It only checkes the format. Don't guarantee the rule can be programmed into -+ * It only checks the format. Don't guarantee the rule can be programmed into - * the HW. Because there can be no enough room for the rule. - */ - static int -diff --git a/drivers/net/e1000/igb_pf.c b/drivers/net/e1000/igb_pf.c -index fe355ef6b3..3f3fd0d61e 100644 ---- a/drivers/net/e1000/igb_pf.c -+++ b/drivers/net/e1000/igb_pf.c -@@ -155,7 +155,7 @@ int igb_pf_host_configure(struct rte_eth_dev *eth_dev) - else - E1000_WRITE_REG(hw, E1000_DTXSWC, E1000_DTXSWC_VMDQ_LOOPBACK_EN); - -- /* clear VMDq map to perment rar 0 */ -+ /* clear VMDq map to permanent rar 0 */ - rah = E1000_READ_REG(hw, E1000_RAH(0)); - rah &= ~ (0xFF << E1000_RAH_POOLSEL_SHIFT); - E1000_WRITE_REG(hw, E1000_RAH(0), rah); -diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c -index 4a311a7b18..f32dee46df 100644 ---- a/drivers/net/e1000/igb_rxtx.c -+++ b/drivers/net/e1000/igb_rxtx.c -@@ -150,7 +150,7 @@ union igb_tx_offload { - (TX_MACIP_LEN_CMP_MASK | TX_TCP_LEN_CMP_MASK | TX_TSO_MSS_CMP_MASK) - - /** -- * Strucutre to check if new context need be built -+ * Structure to check if new context need be built - */ - struct igb_advctx_info { - uint64_t flags; /**< ol_flags related to context build. */ -@@ -967,7 +967,7 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); -@@ -1229,7 +1229,7 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); -@@ -1252,7 +1252,7 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * Maximum number of Ring Descriptors. - * - * Since RDLEN/TDLEN should be multiple of 128bytes, the number of ring -- * desscriptors should meet the following condition: -+ * descriptors should meet the following condition: - * (num_ring_desc * sizeof(struct e1000_rx/tx_desc)) % 128 == 0 - */ - -@@ -1350,7 +1350,7 @@ igb_tx_done_cleanup(struct igb_tx_queue *txq, uint32_t free_cnt) - sw_ring[tx_id].last_id = tx_id; - } - -- /* Move to next segemnt. */ -+ /* Move to next segment. */ - tx_id = sw_ring[tx_id].next_id; - - } while (tx_id != tx_next); -@@ -1383,7 +1383,7 @@ igb_tx_done_cleanup(struct igb_tx_queue *txq, uint32_t free_cnt) - - /* Walk the list and find the next mbuf, if any. */ - do { -- /* Move to next segemnt. */ -+ /* Move to next segment. */ - tx_id = sw_ring[tx_id].next_id; - - if (sw_ring[tx_id].mbuf) -@@ -2146,7 +2146,7 @@ igb_vmdq_rx_hw_configure(struct rte_eth_dev *dev) - - igb_rss_disable(dev); - -- /* RCTL: eanble VLAN filter */ -+ /* RCTL: enable VLAN filter */ - rctl = E1000_READ_REG(hw, E1000_RCTL); - rctl |= E1000_RCTL_VFE; - E1000_WRITE_REG(hw, E1000_RCTL, rctl); -diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c -index 634c97acf6..dce26cfa48 100644 ---- a/drivers/net/ena/ena_ethdev.c -+++ b/drivers/net/ena/ena_ethdev.c -@@ -1408,7 +1408,7 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count) - ++rxq->rx_stats.refill_partial; - } - -- /* When we submitted free recources to device... */ -+ /* When we submitted free resources to device... */ - if (likely(i > 0)) { - /* ...let HW know that it can fill buffers with data. */ - ena_com_write_sq_doorbell(rxq->ena_com_io_sq); -diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h -index 865e1241e0..f99e4f3984 100644 ---- a/drivers/net/ena/ena_ethdev.h -+++ b/drivers/net/ena/ena_ethdev.h -@@ -42,7 +42,7 @@ - - /* While processing submitted and completed descriptors (rx and tx path - * respectively) in a loop it is desired to: -- * - perform batch submissions while populating sumbissmion queue -+ * - perform batch submissions while populating submission queue - * - avoid blocking transmission of other packets during cleanup phase - * Hence the utilization ratio of 1/8 of a queue size or max value if the size - * of the ring is very big - like 8k Rx rings. -diff --git a/drivers/net/enetfec/enet_regs.h b/drivers/net/enetfec/enet_regs.h -index a300c6f8bc..c9400957f8 100644 ---- a/drivers/net/enetfec/enet_regs.h -+++ b/drivers/net/enetfec/enet_regs.h -@@ -12,7 +12,7 @@ - #define RX_BD_CR ((ushort)0x0004) /* CRC or Frame error */ - #define RX_BD_SH ((ushort)0x0008) /* Reserved */ - #define RX_BD_NO ((ushort)0x0010) /* Rcvd non-octet aligned frame */ --#define RX_BD_LG ((ushort)0x0020) /* Rcvd frame length voilation */ -+#define RX_BD_LG ((ushort)0x0020) /* Rcvd frame length violation */ - #define RX_BD_FIRST ((ushort)0x0400) /* Reserved */ - #define RX_BD_LAST ((ushort)0x0800) /* last buffer in the frame */ - #define RX_BD_INT 0x00800000 -diff --git a/drivers/net/enic/enic_flow.c b/drivers/net/enic/enic_flow.c -index 33147169ba..cf51793cfe 100644 ---- a/drivers/net/enic/enic_flow.c -+++ b/drivers/net/enic/enic_flow.c -@@ -405,7 +405,7 @@ enic_copy_item_ipv4_v1(struct copy_item_args *arg) - return ENOTSUP; - } - -- /* check that the suppied mask exactly matches capabilty */ -+ /* check that the supplied mask exactly matches capability */ - if (!mask_exact_match((const uint8_t *)&supported_mask, - (const uint8_t *)item->mask, sizeof(*mask))) { - ENICPMD_LOG(ERR, "IPv4 exact match mask"); -@@ -443,7 +443,7 @@ enic_copy_item_udp_v1(struct copy_item_args *arg) - return ENOTSUP; - } - -- /* check that the suppied mask exactly matches capabilty */ -+ /* check that the supplied mask exactly matches capability */ - if (!mask_exact_match((const uint8_t *)&supported_mask, - (const uint8_t *)item->mask, sizeof(*mask))) { - ENICPMD_LOG(ERR, "UDP exact match mask"); -@@ -482,7 +482,7 @@ enic_copy_item_tcp_v1(struct copy_item_args *arg) - return ENOTSUP; - } - -- /* check that the suppied mask exactly matches capabilty */ -+ /* check that the supplied mask exactly matches capability */ - if (!mask_exact_match((const uint8_t *)&supported_mask, - (const uint8_t *)item->mask, sizeof(*mask))) { - ENICPMD_LOG(ERR, "TCP exact match mask"); -@@ -1044,14 +1044,14 @@ fixup_l5_layer(struct enic *enic, struct filter_generic_1 *gp, - } - - /** -- * Build the intenal enic filter structure from the provided pattern. The -+ * Build the internal enic filter structure from the provided pattern. The - * pattern is validated as the items are copied. - * - * @param pattern[in] - * @param items_info[in] - * Info about this NICs item support, like valid previous items. - * @param enic_filter[out] -- * NIC specfilc filters derived from the pattern. -+ * NIC specific filters derived from the pattern. - * @param error[out] - */ - static int -@@ -1123,12 +1123,12 @@ enic_copy_filter(const struct rte_flow_item pattern[], - } - - /** -- * Build the intenal version 1 NIC action structure from the provided pattern. -+ * Build the internal version 1 NIC action structure from the provided pattern. - * The pattern is validated as the items are copied. - * - * @param actions[in] - * @param enic_action[out] -- * NIC specfilc actions derived from the actions. -+ * NIC specific actions derived from the actions. - * @param error[out] - */ - static int -@@ -1170,12 +1170,12 @@ enic_copy_action_v1(__rte_unused struct enic *enic, - } - - /** -- * Build the intenal version 2 NIC action structure from the provided pattern. -+ * Build the internal version 2 NIC action structure from the provided pattern. - * The pattern is validated as the items are copied. - * - * @param actions[in] - * @param enic_action[out] -- * NIC specfilc actions derived from the actions. -+ * NIC specific actions derived from the actions. - * @param error[out] - */ - static int -diff --git a/drivers/net/enic/enic_fm_flow.c b/drivers/net/enic/enic_fm_flow.c -index ae43f36bc0..bef842d460 100644 ---- a/drivers/net/enic/enic_fm_flow.c -+++ b/drivers/net/enic/enic_fm_flow.c -@@ -721,7 +721,7 @@ enic_fm_copy_item_gtp(struct copy_item_args *arg) - } - - /* NIC does not support GTP tunnels. No Items are allowed after this. -- * This prevents the specificaiton of further items. -+ * This prevents the specification of further items. - */ - arg->header_level = 0; - -@@ -733,7 +733,7 @@ enic_fm_copy_item_gtp(struct copy_item_args *arg) - - /* - * Use the raw L4 buffer to match GTP as fm_header_set does not have -- * GTP header. UDP dst port must be specifiec. Using the raw buffer -+ * GTP header. UDP dst port must be specific. Using the raw buffer - * does not affect such UDP item, since we skip UDP in the raw buffer. - */ - fm_data->fk_header_select |= FKH_L4RAW; -@@ -1846,7 +1846,7 @@ enic_fm_dump_tcam_actions(const struct fm_action *fm_action) - /* Remove trailing comma */ - if (buf[0]) - *(bp - 1) = '\0'; -- ENICPMD_LOG(DEBUG, " Acions: %s", buf); -+ ENICPMD_LOG(DEBUG, " Actions: %s", buf); - } - - static int -@@ -2364,7 +2364,7 @@ enic_action_handle_get(struct enic_flowman *fm, struct fm_action *action_in, - if (ret < 0 && ret != -ENOENT) - return rte_flow_error_set(error, -ret, - RTE_FLOW_ERROR_TYPE_UNSPECIFIED, -- NULL, "enic: rte_hash_lookup(aciton)"); -+ NULL, "enic: rte_hash_lookup(action)"); - - if (ret == -ENOENT) { - /* Allocate a new action on the NIC. */ -@@ -2435,7 +2435,7 @@ __enic_fm_flow_add_entry(struct enic_flowman *fm, - - ENICPMD_FUNC_TRACE(); - -- /* Get or create an aciton handle. */ -+ /* Get or create an action handle. */ - ret = enic_action_handle_get(fm, action_in, error, &ah); - if (ret) - return ret; -diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c -index 7f84b5f935..97d97ea793 100644 ---- a/drivers/net/enic/enic_main.c -+++ b/drivers/net/enic/enic_main.c -@@ -1137,7 +1137,7 @@ int enic_disable(struct enic *enic) - } - - /* If we were using interrupts, set the interrupt vector to -1 -- * to disable interrupts. We are not disabling link notifcations, -+ * to disable interrupts. We are not disabling link notifications, - * though, as we want the polling of link status to continue working. - */ - if (enic->rte_dev->data->dev_conf.intr_conf.lsc) -diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c -index c44715bfd0..33e96b480e 100644 ---- a/drivers/net/enic/enic_rxtx.c -+++ b/drivers/net/enic/enic_rxtx.c -@@ -653,7 +653,7 @@ static void enqueue_simple_pkts(struct rte_mbuf **pkts, - * The app should not send oversized - * packets. tx_pkt_prepare includes a check as - * well. But some apps ignore the device max size and -- * tx_pkt_prepare. Oversized packets cause WQ errrors -+ * tx_pkt_prepare. Oversized packets cause WQ errors - * and the NIC ends up disabling the whole WQ. So - * truncate packets.. - */ -diff --git a/drivers/net/fm10k/fm10k.h b/drivers/net/fm10k/fm10k.h -index 7cfa29faa8..17a7056c45 100644 ---- a/drivers/net/fm10k/fm10k.h -+++ b/drivers/net/fm10k/fm10k.h -@@ -44,7 +44,7 @@ - #define FM10K_TX_MAX_MTU_SEG UINT8_MAX - - /* -- * byte aligment for HW RX data buffer -+ * byte alignment for HW RX data buffer - * Datasheet requires RX buffer addresses shall either be 512-byte aligned or - * be 8-byte aligned but without crossing host memory pages (4KB alignment - * boundaries). Satisfy first option. -diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c -index 43e1d13431..8bbd8b445d 100644 ---- a/drivers/net/fm10k/fm10k_ethdev.c -+++ b/drivers/net/fm10k/fm10k_ethdev.c -@@ -290,7 +290,7 @@ rx_queue_free(struct fm10k_rx_queue *q) - } - - /* -- * disable RX queue, wait unitl HW finished necessary flush operation -+ * disable RX queue, wait until HW finished necessary flush operation - */ - static inline int - rx_queue_disable(struct fm10k_hw *hw, uint16_t qnum) -@@ -379,7 +379,7 @@ tx_queue_free(struct fm10k_tx_queue *q) - } - - /* -- * disable TX queue, wait unitl HW finished necessary flush operation -+ * disable TX queue, wait until HW finished necessary flush operation - */ - static inline int - tx_queue_disable(struct fm10k_hw *hw, uint16_t qnum) -@@ -453,7 +453,7 @@ fm10k_dev_configure(struct rte_eth_dev *dev) - if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) - dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; - -- /* multipe queue mode checking */ -+ /* multiple queue mode checking */ - ret = fm10k_check_mq_mode(dev); - if (ret != 0) { - PMD_DRV_LOG(ERR, "fm10k_check_mq_mode fails with %d.", -@@ -2553,7 +2553,7 @@ fm10k_dev_handle_fault(struct fm10k_hw *hw, uint32_t eicr) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -2676,7 +2676,7 @@ fm10k_dev_interrupt_handler_pf(void *param) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -3034,7 +3034,7 @@ fm10k_params_init(struct rte_eth_dev *dev) - struct fm10k_dev_info *info = - FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private); - -- /* Inialize bus info. Normally we would call fm10k_get_bus_info(), but -+ /* Initialize bus info. Normally we would call fm10k_get_bus_info(), but - * there is no way to get link status without reading BAR4. Until this - * works, assume we have maximum bandwidth. - * @todo - fix bus info -diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c b/drivers/net/fm10k/fm10k_rxtx_vec.c -index 1269250e23..10ce5a7582 100644 ---- a/drivers/net/fm10k/fm10k_rxtx_vec.c -+++ b/drivers/net/fm10k/fm10k_rxtx_vec.c -@@ -212,7 +212,7 @@ fm10k_rx_vec_condition_check(struct rte_eth_dev *dev) - struct rte_eth_fdir_conf *fconf = &dev->data->dev_conf.fdir_conf; - - #ifndef RTE_FM10K_RX_OLFLAGS_ENABLE -- /* whithout rx ol_flags, no VP flag report */ -+ /* without rx ol_flags, no VP flag report */ - if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_EXTEND) - return -1; - #endif -@@ -239,7 +239,7 @@ fm10k_rxq_vec_setup(struct fm10k_rx_queue *rxq) - struct rte_mbuf mb_def = { .buf_addr = 0 }; /* zeroed mbuf */ - - mb_def.nb_segs = 1; -- /* data_off will be ajusted after new mbuf allocated for 512-byte -+ /* data_off will be adjusted after new mbuf allocated for 512-byte - * alignment. - */ - mb_def.data_off = RTE_PKTMBUF_HEADROOM; -@@ -410,7 +410,7 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, - if (!(rxdp->d.staterr & FM10K_RXD_STATUS_DD)) - return 0; - -- /* Vecotr RX will process 4 packets at a time, strip the unaligned -+ /* Vector RX will process 4 packets at a time, strip the unaligned - * tails in case it's not multiple of 4. - */ - nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, RTE_FM10K_DESCS_PER_LOOP); -@@ -481,7 +481,7 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, - _mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1); - - #if defined(RTE_ARCH_X86_64) -- /* B.1 load 2 64 bit mbuf poitns */ -+ /* B.1 load 2 64 bit mbuf points */ - mbp2 = _mm_loadu_si128((__m128i *)&mbufp[pos+2]); - #endif - -@@ -573,7 +573,7 @@ fm10k_recv_raw_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, - - fm10k_desc_to_pktype_v(descs0, &rx_pkts[pos]); - -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll(_mm_cvtsi128_si64(staterr)); - nb_pkts_recd += var; - if (likely(var != RTE_FM10K_DESCS_PER_LOOP)) -diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c -index 1853511c3b..e8d9aaba84 100644 ---- a/drivers/net/hinic/hinic_pmd_ethdev.c -+++ b/drivers/net/hinic/hinic_pmd_ethdev.c -@@ -255,7 +255,7 @@ static int hinic_vlan_offload_set(struct rte_eth_dev *dev, int mask); - * Interrupt handler triggered by NIC for handling - * specific event. - * -- * @param: The address of parameter (struct rte_eth_dev *) regsitered before. -+ * @param: The address of parameter (struct rte_eth_dev *) registered before. - */ - static void hinic_dev_interrupt_handler(void *param) - { -@@ -336,7 +336,7 @@ static int hinic_dev_configure(struct rte_eth_dev *dev) - return err; - } - -- /* init vlan offoad */ -+ /* init VLAN offload */ - err = hinic_vlan_offload_set(dev, - RTE_ETH_VLAN_STRIP_MASK | RTE_ETH_VLAN_FILTER_MASK); - if (err) { -diff --git a/drivers/net/hinic/hinic_pmd_ethdev.h b/drivers/net/hinic/hinic_pmd_ethdev.h -index 5eca8b10b9..8e6251f69f 100644 ---- a/drivers/net/hinic/hinic_pmd_ethdev.h -+++ b/drivers/net/hinic/hinic_pmd_ethdev.h -@@ -170,7 +170,7 @@ struct tag_tcam_key_mem { - /* - * tunnel packet, mask must be 0xff, spec value is 1; - * normal packet, mask must be 0, spec value is 0; -- * if tunnal packet, ucode use -+ * if tunnel packet, ucode use - * sip/dip/protocol/src_port/dst_dport from inner packet - */ - u32 tunnel_flag:8; -diff --git a/drivers/net/hinic/hinic_pmd_flow.c b/drivers/net/hinic/hinic_pmd_flow.c -index d71a42afbd..2cf24ebcf6 100644 ---- a/drivers/net/hinic/hinic_pmd_flow.c -+++ b/drivers/net/hinic/hinic_pmd_flow.c -@@ -734,7 +734,7 @@ static int hinic_check_ntuple_item_ele(const struct rte_flow_item *item, - * END - * other members in mask and spec should set to 0x00. - * item->last should be NULL. -- * Please aware there's an asumption for all the parsers. -+ * Please be aware there's an assumption for all the parsers. - * rte_flow_item is using big endian, rte_flow_attr and - * rte_flow_action are using CPU order. - * Because the pattern is used to describe the packets, -@@ -1630,7 +1630,7 @@ static int hinic_parse_fdir_filter(struct rte_eth_dev *dev, - - /** - * Check if the flow rule is supported by nic. -- * It only checkes the format. Don't guarantee the rule can be programmed into -+ * It only checks the format. Don't guarantee the rule can be programmed into - * the HW. Because there can be no enough room for the rule. - */ - static int hinic_flow_validate(struct rte_eth_dev *dev, -diff --git a/drivers/net/hinic/hinic_pmd_tx.c b/drivers/net/hinic/hinic_pmd_tx.c -index 2688817f37..f09b1a6e1e 100644 ---- a/drivers/net/hinic/hinic_pmd_tx.c -+++ b/drivers/net/hinic/hinic_pmd_tx.c -@@ -1144,7 +1144,7 @@ u16 hinic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, u16 nb_pkts) - mbuf_pkt = *tx_pkts++; - queue_info = 0; - -- /* 1. parse sge and tx offlod info from mbuf */ -+ /* 1. parse sge and tx offload info from mbuf */ - if (unlikely(!hinic_get_sge_txoff_info(mbuf_pkt, - &sqe_info, &off_info))) { - txq->txq_stats.off_errs++; -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index 50cb3eabb1..bdfc85f934 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -462,7 +462,7 @@ hns3_mask_capability(struct hns3_hw *hw, - for (i = 0; i < MAX_CAPS_BIT; i++) { - if (!(caps_masked & BIT_ULL(i))) - continue; -- hns3_info(hw, "mask capabiliy: id-%u, name-%s.", -+ hns3_info(hw, "mask capability: id-%u, name-%s.", - i, hns3_get_caps_name(i)); - } - } -@@ -699,7 +699,7 @@ hns3_cmd_init(struct hns3_hw *hw) - return 0; - - /* -- * Requiring firmware to enable some features, firber port can still -+ * Requiring firmware to enable some features, fiber port can still - * work without it, but copper port can't work because the firmware - * fails to take over the PHY. - */ -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 716cebbcec..2ebcf5695b 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -663,7 +663,7 @@ hns3_init_ring_with_vector(struct hns3_hw *hw) - hw->intr_tqps_num = RTE_MIN(vec, hw->tqps_num); - for (i = 0; i < hw->intr_tqps_num; i++) { - /* -- * Set gap limiter/rate limiter/quanity limiter algorithm -+ * Set gap limiter/rate limiter/quantity limiter algorithm - * configuration for interrupt coalesce of queue's interrupt. - */ - hns3_set_queue_intr_gl(hw, i, HNS3_RING_GL_RX, -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index b22f618e0a..af045b22f7 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -25,7 +25,7 @@ - * IR(Mbps) = ------------------------- * CLOCK(1000Mbps) - * Tick * (2 ^ IR_s) - * -- * @return: 0: calculate sucessful, negative: fail -+ * @return: 0: calculate successful, negative: fail - */ - static int - hns3_shaper_para_calc(struct hns3_hw *hw, uint32_t ir, uint8_t shaper_level, -@@ -36,8 +36,8 @@ hns3_shaper_para_calc(struct hns3_hw *hw, uint32_t ir, uint8_t shaper_level, - #define DIVISOR_IR_B_126 (126 * DIVISOR_CLK) - - const uint16_t tick_array[HNS3_SHAPER_LVL_CNT] = { -- 6 * 256, /* Prioriy level */ -- 6 * 32, /* Prioriy group level */ -+ 6 * 256, /* Priority level */ -+ 6 * 32, /* Priority group level */ - 6 * 8, /* Port level */ - 6 * 256 /* Qset level */ - }; -@@ -1521,7 +1521,7 @@ hns3_dcb_hw_configure(struct hns3_adapter *hns) - - ret = hns3_dcb_schd_setup_hw(hw); - if (ret) { -- hns3_err(hw, "dcb schdule configure failed! ret = %d", ret); -+ hns3_err(hw, "dcb schedule configure failed! ret = %d", ret); - return ret; - } - -@@ -1726,7 +1726,7 @@ hns3_get_fc_mode(struct hns3_hw *hw, enum rte_eth_fc_mode mode) - * hns3_dcb_pfc_enable - Enable priority flow control - * @dev: pointer to ethernet device - * -- * Configures the pfc settings for one porority. -+ * Configures the pfc settings for one priority. - */ - int - hns3_dcb_pfc_enable(struct rte_eth_dev *dev, struct rte_eth_pfc_conf *pfc_conf) -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index f83cff4d98..25f9c9fab1 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -568,7 +568,7 @@ hns3_set_vlan_rx_offload_cfg(struct hns3_adapter *hns, - hns3_set_bit(req->vport_vlan_cfg, HNS3_SHOW_TAG2_EN_B, - vcfg->vlan2_vlan_prionly ? 1 : 0); - -- /* firmwall will ignore this configuration for PCI_REVISION_ID_HIP08 */ -+ /* firmware will ignore this configuration for PCI_REVISION_ID_HIP08 */ - hns3_set_bit(req->vport_vlan_cfg, HNS3_DISCARD_TAG1_EN_B, - vcfg->strip_tag1_discard_en ? 1 : 0); - hns3_set_bit(req->vport_vlan_cfg, HNS3_DISCARD_TAG2_EN_B, -@@ -763,7 +763,7 @@ hns3_set_vlan_tx_offload_cfg(struct hns3_adapter *hns, - vcfg->insert_tag2_en ? 1 : 0); - hns3_set_bit(req->vport_vlan_cfg, HNS3_CFG_NIC_ROCE_SEL_B, 0); - -- /* firmwall will ignore this configuration for PCI_REVISION_ID_HIP08 */ -+ /* firmware will ignore this configuration for PCI_REVISION_ID_HIP08 */ - hns3_set_bit(req->vport_vlan_cfg, HNS3_TAG_SHIFT_MODE_EN_B, - vcfg->tag_shift_mode_en ? 1 : 0); - -@@ -3385,7 +3385,7 @@ hns3_only_alloc_priv_buff(struct hns3_hw *hw, - * hns3_rx_buffer_calc: calculate the rx private buffer size for all TCs - * @hw: pointer to struct hns3_hw - * @buf_alloc: pointer to buffer calculation data -- * @return: 0: calculate sucessful, negative: fail -+ * @return: 0: calculate successful, negative: fail - */ - static int - hns3_rx_buffer_calc(struct hns3_hw *hw, struct hns3_pkt_buf_alloc *buf_alloc) -@@ -4518,14 +4518,14 @@ hns3_set_firber_default_support_speed(struct hns3_hw *hw) - } - - /* -- * Validity of supported_speed for firber and copper media type can be -+ * Validity of supported_speed for fiber and copper media type can be - * guaranteed by the following policy: - * Copper: - * Although the initialization of the phy in the firmware may not be - * completed, the firmware can guarantees that the supported_speed is - * an valid value. - * Firber: -- * If the version of firmware supports the acitive query way of the -+ * If the version of firmware supports the active query way of the - * HNS3_OPC_GET_SFP_INFO opcode, the supported_speed can be obtained - * through it. If unsupported, use the SFP's speed as the value of the - * supported_speed. -@@ -5285,7 +5285,7 @@ hns3_get_autoneg_fc_mode(struct hns3_hw *hw) - - /* - * Flow control auto-negotiation is not supported for fiber and -- * backpalne media type. -+ * backplane media type. - */ - case HNS3_MEDIA_TYPE_FIBER: - case HNS3_MEDIA_TYPE_BACKPLANE: -@@ -6152,7 +6152,7 @@ hns3_fec_get_internal(struct hns3_hw *hw, uint32_t *fec_capa) - } - - /* -- * FEC mode order defined in hns3 hardware is inconsistend with -+ * FEC mode order defined in hns3 hardware is inconsistent with - * that defined in the ethdev library. So the sequence needs - * to be converted. - */ -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 4406611fe9..2457754b3d 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -125,7 +125,7 @@ struct hns3_tc_info { - uint8_t tc_sch_mode; /* 0: sp; 1: dwrr */ - uint8_t pgid; - uint32_t bw_limit; -- uint8_t up_to_tc_map; /* user priority maping on the TC */ -+ uint8_t up_to_tc_map; /* user priority mapping on the TC */ - }; - - struct hns3_dcb_info { -@@ -572,12 +572,12 @@ struct hns3_hw { - /* - * vlan mode. - * value range: -- * HNS3_SW_SHIFT_AND_DISCARD_MODE/HNS3_HW_SHFIT_AND_DISCARD_MODE -+ * HNS3_SW_SHIFT_AND_DISCARD_MODE/HNS3_HW_SHIFT_AND_DISCARD_MODE - * - * - HNS3_SW_SHIFT_AND_DISCARD_MODE - * For some versions of hardware network engine, because of the - * hardware limitation, PMD needs to detect the PVID status -- * to work with haredware to implement PVID-related functions. -+ * to work with hardware to implement PVID-related functions. - * For example, driver need discard the stripped PVID tag to ensure - * the PVID will not report to mbuf and shift the inserted VLAN tag - * to avoid port based VLAN covering it. -@@ -725,7 +725,7 @@ enum hns3_mp_req_type { - HNS3_MP_REQ_MAX - }; - --/* Pameters for IPC. */ -+/* Parameters for IPC. */ - struct hns3_mp_param { - enum hns3_mp_req_type type; - int port_id; -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 1022b02697..de44b07691 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -318,7 +318,7 @@ hns3vf_set_promisc_mode(struct hns3_hw *hw, bool en_bc_pmc, - * 1. The promiscuous/allmulticast mode can be configured successfully - * only based on the trusted VF device. If based on the non trusted - * VF device, configuring promiscuous/allmulticast mode will fail. -- * The hns3 VF device can be confiruged as trusted device by hns3 PF -+ * The hns3 VF device can be configured as trusted device by hns3 PF - * kernel ethdev driver on the host by the following command: - * "ip link set vf turst on" - * 2. After the promiscuous mode is configured successfully, hns3 VF PMD -@@ -330,7 +330,7 @@ hns3vf_set_promisc_mode(struct hns3_hw *hw, bool en_bc_pmc, - * filter is still effective even in promiscuous mode. If upper - * applications don't call rte_eth_dev_vlan_filter API function to - * set vlan based on VF device, hns3 VF PMD will can't receive -- * the packets with vlan tag in promiscuoue mode. -+ * the packets with vlan tag in promiscuous mode. - */ - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MBX_VF_TO_PF, false); - req->msg[0] = HNS3_MBX_SET_PROMISC_MODE; -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index de2422e12f..ce70a534dc 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -144,7 +144,7 @@ struct hns3_fdir_rule { - uint32_t flags; - uint32_t fd_id; /* APP marked unique value for this rule. */ - uint8_t action; -- /* VF id, avaiblable when flags with HNS3_RULE_FLAG_VF_ID. */ -+ /* VF id, available when flags with HNS3_RULE_FLAG_VF_ID. */ - uint8_t vf_id; - /* - * equal 0 when action is drop. -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 1aee965e4a..a2c1589c39 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -369,7 +369,7 @@ hns3_handle_action_indirect(struct rte_eth_dev *dev, - * - * @param actions[in] - * @param rule[out] -- * NIC specfilc actions derived from the actions. -+ * NIC specific actions derived from the actions. - * @param error[out] - */ - static int -@@ -400,7 +400,7 @@ hns3_handle_actions(struct rte_eth_dev *dev, - * Queue region is implemented by FDIR + RSS in hns3 hardware, - * the FDIR's action is one queue region (start_queue_id and - * queue_num), then RSS spread packets to the queue region by -- * RSS algorigthm. -+ * RSS algorithm. - */ - case RTE_FLOW_ACTION_TYPE_RSS: - ret = hns3_handle_action_queue_region(dev, actions, -@@ -978,7 +978,7 @@ hns3_parse_nvgre(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, - if (nvgre_mask->protocol || nvgre_mask->c_k_s_rsvd0_ver) - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM_MASK, item, -- "Ver/protocal is not supported in NVGRE"); -+ "Ver/protocol is not supported in NVGRE"); - - /* TNI must be totally masked or not. */ - if (memcmp(nvgre_mask->tni, full_mask, VNI_OR_TNI_LEN) && -@@ -1023,7 +1023,7 @@ hns3_parse_geneve(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, - if (geneve_mask->ver_opt_len_o_c_rsvd0 || geneve_mask->protocol) - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM_MASK, item, -- "Ver/protocal is not supported in GENEVE"); -+ "Ver/protocol is not supported in GENEVE"); - /* VNI must be totally masked or not. */ - if (memcmp(geneve_mask->vni, full_mask, VNI_OR_TNI_LEN) && - memcmp(geneve_mask->vni, zero_mask, VNI_OR_TNI_LEN)) -@@ -1354,7 +1354,7 @@ hns3_rss_input_tuple_supported(struct hns3_hw *hw, - } - - /* -- * This function is used to parse rss action validatation. -+ * This function is used to parse rss action validation. - */ - static int - hns3_parse_rss_filter(struct rte_eth_dev *dev, -@@ -1722,7 +1722,7 @@ hns3_flow_args_check(const struct rte_flow_attr *attr, - - /* - * Check if the flow rule is supported by hns3. -- * It only checkes the format. Don't guarantee the rule can be programmed into -+ * It only checks the format. Don't guarantee the rule can be programmed into - * the HW. Because there can be no enough room for the rule. - */ - static int -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index 9a05f0d1ee..8e0a58aa02 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -78,14 +78,14 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - mbx_time_limit = (uint32_t)hns->mbx_time_limit_ms * US_PER_MS; - while (wait_time < mbx_time_limit) { - if (__atomic_load_n(&hw->reset.disable_cmd, __ATOMIC_RELAXED)) { -- hns3_err(hw, "Don't wait for mbx respone because of " -+ hns3_err(hw, "Don't wait for mbx response because of " - "disable_cmd"); - return -EBUSY; - } - - if (is_reset_pending(hns)) { - hw->mbx_resp.req_msg_data = 0; -- hns3_err(hw, "Don't wait for mbx respone because of " -+ hns3_err(hw, "Don't wait for mbx response because of " - "reset pending"); - return -EIO; - } -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index c71f43238c..c378783c6c 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -26,7 +26,7 @@ enum HNS3_MBX_OPCODE { - HNS3_MBX_GET_RETA, /* (VF -> PF) get RETA */ - HNS3_MBX_GET_RSS_KEY, /* (VF -> PF) get RSS key */ - HNS3_MBX_GET_MAC_ADDR, /* (VF -> PF) get MAC addr */ -- HNS3_MBX_PF_VF_RESP, /* (PF -> VF) generate respone to VF */ -+ HNS3_MBX_PF_VF_RESP, /* (PF -> VF) generate response to VF */ - HNS3_MBX_GET_BDNUM, /* (VF -> PF) get BD num */ - HNS3_MBX_GET_BUFSIZE, /* (VF -> PF) get buffer size */ - HNS3_MBX_GET_STREAMID, /* (VF -> PF) get stream id */ -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 9471e7039d..8e8b056f4e 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -40,7 +40,7 @@ - struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ - struct rte_flow_action_rss conf; -- uint8_t hash_algo; /* hash function type definited by hardware */ -+ uint8_t hash_algo; /* hash function type defined by hardware */ - uint8_t key[HNS3_RSS_KEY_SIZE]; /* Hash key */ - uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; - uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 3c02fd54e1..9a597e032e 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1897,7 +1897,7 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, - * For hns3 VF device, whether it needs to process PVID depends - * on the configuration of PF kernel mode netdevice driver. And the - * related PF configuration is delivered through the mailbox and finally -- * reflectd in port_base_vlan_cfg. -+ * reflected in port_base_vlan_cfg. - */ - if (hns->is_vf || hw->vlan_mode == HNS3_SW_SHIFT_AND_DISCARD_MODE) - rxq->pvid_sw_discard_en = hw->port_base_vlan_cfg.state == -@@ -3038,7 +3038,7 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, - * For hns3 VF device, whether it needs to process PVID depends - * on the configuration of PF kernel mode netdev driver. And the - * related PF configuration is delivered through the mailbox and finally -- * reflectd in port_base_vlan_cfg. -+ * reflected in port_base_vlan_cfg. - */ - if (hns->is_vf || hw->vlan_mode == HNS3_SW_SHIFT_AND_DISCARD_MODE) - txq->pvid_sw_shift_en = hw->port_base_vlan_cfg.state == -@@ -3192,7 +3192,7 @@ hns3_fill_first_desc(struct hns3_tx_queue *txq, struct hns3_desc *desc, - * in Tx direction based on hns3 network engine. So when the number of - * VLANs in the packets represented by rxm plus the number of VLAN - * offload by hardware such as PVID etc, exceeds two, the packets will -- * be discarded or the original VLAN of the packets will be overwitted -+ * be discarded or the original VLAN of the packets will be overwritten - * by hardware. When the PF PVID is enabled by calling the API function - * named rte_eth_dev_set_vlan_pvid or the VF PVID is enabled by the hns3 - * PF kernel ether driver, the outer VLAN tag will always be the PVID. -@@ -3377,7 +3377,7 @@ hns3_parse_inner_params(struct rte_mbuf *m, uint32_t *ol_type_vlan_len_msec, - /* - * The inner l2 length of mbuf is the sum of outer l4 length, - * tunneling header length and inner l2 length for a tunnel -- * packect. But in hns3 tx descriptor, the tunneling header -+ * packet. But in hns3 tx descriptor, the tunneling header - * length is contained in the field of outer L4 length. - * Therefore, driver need to calculate the outer L4 length and - * inner L2 length. -@@ -3393,7 +3393,7 @@ hns3_parse_inner_params(struct rte_mbuf *m, uint32_t *ol_type_vlan_len_msec, - tmp_outer |= hns3_gen_field_val(HNS3_TXD_TUNTYPE_M, - HNS3_TXD_TUNTYPE_S, HNS3_TUN_NVGRE); - /* -- * For NVGRE tunnel packect, the outer L4 is empty. So only -+ * For NVGRE tunnel packet, the outer L4 is empty. So only - * fill the NVGRE header length to the outer L4 field. - */ - tmp_outer |= hns3_gen_field_val(HNS3_TXD_L4LEN_M, -@@ -3436,7 +3436,7 @@ hns3_parse_tunneling_params(struct hns3_tx_queue *txq, struct rte_mbuf *m, - * mbuf, but for hns3 descriptor, it is contained in the outer L4. So, - * there is a need that switching between them. To avoid multiple - * calculations, the length of the L2 header include the outer and -- * inner, will be filled during the parsing of tunnel packects. -+ * inner, will be filled during the parsing of tunnel packets. - */ - if (!(ol_flags & RTE_MBUF_F_TX_TUNNEL_MASK)) { - /* -@@ -3616,7 +3616,7 @@ hns3_outer_ipv4_cksum_prepared(struct rte_mbuf *m, uint64_t ol_flags, - if (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) { - struct rte_udp_hdr *udp_hdr; - /* -- * If OUTER_UDP_CKSUM is support, HW can caclulate the pseudo -+ * If OUTER_UDP_CKSUM is support, HW can calculate the pseudo - * header for TSO packets - */ - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) -@@ -3641,7 +3641,7 @@ hns3_outer_ipv6_cksum_prepared(struct rte_mbuf *m, uint64_t ol_flags, - if (ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) { - struct rte_udp_hdr *udp_hdr; - /* -- * If OUTER_UDP_CKSUM is support, HW can caclulate the pseudo -+ * If OUTER_UDP_CKSUM is support, HW can calculate the pseudo - * header for TSO packets - */ - if (ol_flags & RTE_MBUF_F_TX_TCP_SEG) -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index e633b336b1..ea1a805491 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -618,7 +618,7 @@ hns3_handle_bdinfo(struct hns3_rx_queue *rxq, struct rte_mbuf *rxm, - - /* - * If packet len bigger than mtu when recv with no-scattered algorithm, -- * the first n bd will without FE bit, we need process this sisution. -+ * the first n bd will without FE bit, we need process this situation. - * Note: we don't need add statistic counter because latest BD which - * with FE bit will mark HNS3_RXD_L2E_B bit. - */ -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index 552ae9d30c..bad65fcbed 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -1286,7 +1286,7 @@ hns3_dev_xstats_get_names(struct rte_eth_dev *dev, - * A pointer to an ids array passed by application. This tells which - * statistics values function should retrieve. This parameter - * can be set to NULL if size is 0. In this case function will retrieve -- * all avalible statistics. -+ * all available statistics. - * @param values - * A pointer to a table to be filled with device statistics values. - * @param size -diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c -index c0bfff43ee..1d417dbf8a 100644 ---- a/drivers/net/i40e/i40e_ethdev.c -+++ b/drivers/net/i40e/i40e_ethdev.c -@@ -2483,7 +2483,7 @@ i40e_dev_start(struct rte_eth_dev *dev) - if (ret != I40E_SUCCESS) - PMD_DRV_LOG(WARNING, "Fail to set phy mask"); - -- /* Call get_link_info aq commond to enable/disable LSE */ -+ /* Call get_link_info aq command to enable/disable LSE */ - i40e_dev_link_update(dev, 0); - } - -@@ -3555,7 +3555,7 @@ static int i40e_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev, - count++; - } - -- /* Get individiual stats from i40e_hw_port struct */ -+ /* Get individual stats from i40e_hw_port struct */ - for (i = 0; i < I40E_NB_HW_PORT_XSTATS; i++) { - strlcpy(xstats_names[count].name, - rte_i40e_hw_port_strings[i].name, -@@ -3613,7 +3613,7 @@ i40e_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - count++; - } - -- /* Get individiual stats from i40e_hw_port struct */ -+ /* Get individual stats from i40e_hw_port struct */ - for (i = 0; i < I40E_NB_HW_PORT_XSTATS; i++) { - xstats[count].value = *(uint64_t *)(((char *)hw_stats) + - rte_i40e_hw_port_strings[i].offset); -@@ -5544,7 +5544,7 @@ i40e_vsi_get_bw_config(struct i40e_vsi *vsi) - &ets_sla_config, NULL); - if (ret != I40E_SUCCESS) { - PMD_DRV_LOG(ERR, -- "VSI failed to get TC bandwdith configuration %u", -+ "VSI failed to get TC bandwidth configuration %u", - hw->aq.asq_last_status); - return ret; - } -@@ -6822,7 +6822,7 @@ i40e_handle_mdd_event(struct rte_eth_dev *dev) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -9719,7 +9719,7 @@ i40e_ethertype_filter_convert(const struct rte_eth_ethertype_filter *input, - return 0; - } - --/* Check if there exists the ehtertype filter */ -+/* Check if there exists the ethertype filter */ - struct i40e_ethertype_filter * - i40e_sw_ethertype_filter_lookup(struct i40e_ethertype_rule *ethertype_rule, - const struct i40e_ethertype_filter_input *input) -diff --git a/drivers/net/i40e/i40e_ethdev.h b/drivers/net/i40e/i40e_ethdev.h -index 2d182f8000..a1ebdc093c 100644 ---- a/drivers/net/i40e/i40e_ethdev.h -+++ b/drivers/net/i40e/i40e_ethdev.h -@@ -897,7 +897,7 @@ struct i40e_tunnel_filter { - TAILQ_ENTRY(i40e_tunnel_filter) rules; - struct i40e_tunnel_filter_input input; - uint8_t is_to_vf; /* 0 - to PF, 1 - to VF */ -- uint16_t vf_id; /* VF id, avaiblable when is_to_vf is 1. */ -+ uint16_t vf_id; /* VF id, available when is_to_vf is 1. */ - uint16_t queue; /* Queue assigned to when match */ - }; - -@@ -966,7 +966,7 @@ struct i40e_tunnel_filter_conf { - uint32_t tenant_id; /**< Tenant ID to match. VNI, GRE key... */ - uint16_t queue_id; /**< Queue assigned to if match. */ - uint8_t is_to_vf; /**< 0 - to PF, 1 - to VF */ -- uint16_t vf_id; /**< VF id, avaiblable when is_to_vf is 1. */ -+ uint16_t vf_id; /**< VF id, available when is_to_vf is 1. */ - }; - - TAILQ_HEAD(i40e_flow_list, rte_flow); -@@ -1100,7 +1100,7 @@ struct i40e_vf_msg_cfg { - /* - * If message statistics from a VF exceed the maximal limitation, - * the PF will ignore any new message from that VF for -- * 'ignor_second' time. -+ * 'ignore_second' time. - */ - uint32_t ignore_second; - }; -@@ -1257,7 +1257,7 @@ struct i40e_adapter { - }; - - /** -- * Strucute to store private data for each VF representor instance -+ * Structure to store private data for each VF representor instance - */ - struct i40e_vf_representor { - uint16_t switch_domain_id; -@@ -1265,7 +1265,7 @@ struct i40e_vf_representor { - uint16_t vf_id; - /**< Virtual Function ID */ - struct i40e_adapter *adapter; -- /**< Private data store of assocaiated physical function */ -+ /**< Private data store of associated physical function */ - struct i40e_eth_stats stats_offset; - /**< Zero-point of VF statistics*/ - }; -diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c -index df2a5aaecc..8caedea14e 100644 ---- a/drivers/net/i40e/i40e_fdir.c -+++ b/drivers/net/i40e/i40e_fdir.c -@@ -142,7 +142,7 @@ i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq) - I40E_QRX_TAIL(rxq->vsi->base_queue); - - rte_wmb(); -- /* Init the RX tail regieter. */ -+ /* Init the RX tail register. */ - I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1); - - return err; -@@ -430,7 +430,7 @@ i40e_check_fdir_flex_payload(const struct rte_eth_flex_payload_cfg *flex_cfg) - - for (i = 0; i < I40E_FDIR_MAX_FLEX_LEN; i++) { - if (flex_cfg->src_offset[i] >= I40E_MAX_FLX_SOURCE_OFF) { -- PMD_DRV_LOG(ERR, "exceeds maxmial payload limit."); -+ PMD_DRV_LOG(ERR, "exceeds maximal payload limit."); - return -EINVAL; - } - } -@@ -438,7 +438,7 @@ i40e_check_fdir_flex_payload(const struct rte_eth_flex_payload_cfg *flex_cfg) - memset(flex_pit, 0, sizeof(flex_pit)); - num = i40e_srcoff_to_flx_pit(flex_cfg->src_offset, flex_pit); - if (num > I40E_MAX_FLXPLD_FIED) { -- PMD_DRV_LOG(ERR, "exceeds maxmial number of flex fields."); -+ PMD_DRV_LOG(ERR, "exceeds maximal number of flex fields."); - return -EINVAL; - } - for (i = 0; i < num; i++) { -@@ -948,7 +948,7 @@ i40e_flow_fdir_construct_pkt(struct i40e_pf *pf, - uint8_t pctype = fdir_input->pctype; - struct i40e_customized_pctype *cus_pctype; - -- /* raw pcket template - just copy contents of the raw packet */ -+ /* raw packet template - just copy contents of the raw packet */ - if (fdir_input->flow_ext.pkt_template) { - memcpy(raw_pkt, fdir_input->flow.raw_flow.packet, - fdir_input->flow.raw_flow.length); -@@ -1831,7 +1831,7 @@ i40e_flow_add_del_fdir_filter(struct rte_eth_dev *dev, - &check_filter.fdir.input); - if (!node) { - PMD_DRV_LOG(ERR, -- "There's no corresponding flow firector filter!"); -+ "There's no corresponding flow director filter!"); - return -EINVAL; - } - -diff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c -index c9676caab5..e0cf996200 100644 ---- a/drivers/net/i40e/i40e_flow.c -+++ b/drivers/net/i40e/i40e_flow.c -@@ -3043,7 +3043,7 @@ i40e_flow_parse_fdir_pattern(struct rte_eth_dev *dev, - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM, - item, -- "Exceeds maxmial payload limit."); -+ "Exceeds maximal payload limit."); - return -rte_errno; - } - -diff --git a/drivers/net/i40e/i40e_pf.c b/drivers/net/i40e/i40e_pf.c -index ccb3924a5f..2435a8a070 100644 ---- a/drivers/net/i40e/i40e_pf.c -+++ b/drivers/net/i40e/i40e_pf.c -@@ -343,7 +343,7 @@ i40e_pf_host_process_cmd_get_vf_resource(struct i40e_pf_vf *vf, uint8_t *msg, - vf->request_caps = *(uint32_t *)msg; - - /* enable all RSS by default, -- * doesn't support hena setting by virtchnnl yet. -+ * doesn't support hena setting by virtchnl yet. - */ - if (vf->request_caps & VIRTCHNL_VF_OFFLOAD_RSS_PF) { - I40E_WRITE_REG(hw, I40E_VFQF_HENA1(0, vf->vf_idx), -@@ -725,7 +725,7 @@ i40e_pf_host_process_cmd_config_irq_map(struct i40e_pf_vf *vf, - if ((map->rxq_map < qbit_max) && (map->txq_map < qbit_max)) { - i40e_pf_config_irq_link_list(vf, map); - } else { -- /* configured queue size excceed limit */ -+ /* configured queue size exceed limit */ - ret = I40E_ERR_PARAM; - goto send_msg; - } -diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c -index e4cb33dc3c..9a00a9b71e 100644 ---- a/drivers/net/i40e/i40e_rxtx.c -+++ b/drivers/net/i40e/i40e_rxtx.c -@@ -609,7 +609,7 @@ i40e_rx_alloc_bufs(struct i40e_rx_queue *rxq) - rxdp[i].read.pkt_addr = dma_addr; - } - -- /* Update rx tail regsiter */ -+ /* Update rx tail register */ - I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->rx_free_trigger); - - rxq->rx_free_trigger = -@@ -995,7 +995,7 @@ i40e_recv_scattered_pkts(void *rx_queue, - * threshold of the queue, advance the Receive Descriptor Tail (RDT) - * register. Update the RDT with the value of the last processed RX - * descriptor minus 1, to guarantee that the RDT register is never -- * equal to the RDH register, which creates a "full" ring situtation -+ * equal to the RDH register, which creates a "full" ring situation - * from the hardware point of view. - */ - nb_hold = (uint16_t)(nb_hold + rxq->nb_rx_hold); -@@ -1467,7 +1467,7 @@ tx_xmit_pkts(struct i40e_tx_queue *txq, - i40e_tx_fill_hw_ring(txq, tx_pkts + n, (uint16_t)(nb_pkts - n)); - txq->tx_tail = (uint16_t)(txq->tx_tail + (nb_pkts - n)); - -- /* Determin if RS bit needs to be set */ -+ /* Determine if RS bit needs to be set */ - if (txq->tx_tail > txq->tx_next_rs) { - txr[txq->tx_next_rs].cmd_type_offset_bsz |= - rte_cpu_to_le_64(((uint64_t)I40E_TX_DESC_CMD_RS) << -@@ -1697,7 +1697,7 @@ i40e_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id) - } - - if (rxq->rx_deferred_start) -- PMD_DRV_LOG(WARNING, "RX queue %u is deferrd start", -+ PMD_DRV_LOG(WARNING, "RX queue %u is deferred start", - rx_queue_id); - - err = i40e_alloc_rx_queue_mbufs(rxq); -@@ -1706,7 +1706,7 @@ i40e_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id) - return err; - } - -- /* Init the RX tail regieter. */ -+ /* Init the RX tail register. */ - I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1); - - err = i40e_switch_rx_queue(hw, rxq->reg_idx, TRUE); -@@ -1771,7 +1771,7 @@ i40e_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id) - } - - if (txq->tx_deferred_start) -- PMD_DRV_LOG(WARNING, "TX queue %u is deferrd start", -+ PMD_DRV_LOG(WARNING, "TX queue %u is deferred start", - tx_queue_id); - - /* -@@ -1930,7 +1930,7 @@ i40e_dev_rx_queue_setup_runtime(struct rte_eth_dev *dev, - PMD_DRV_LOG(ERR, "Can't use default burst."); - return -EINVAL; - } -- /* check scatterred conflict */ -+ /* check scattered conflict */ - if (!dev->data->scattered_rx && use_scattered_rx) { - PMD_DRV_LOG(ERR, "Scattered rx is required."); - return -EINVAL; -@@ -2014,7 +2014,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev, - rxq->rx_deferred_start = rx_conf->rx_deferred_start; - rxq->offloads = offloads; - -- /* Allocate the maximun number of RX ring hardware descriptor. */ -+ /* Allocate the maximum number of RX ring hardware descriptor. */ - len = I40E_MAX_RING_DESC; - - /** -@@ -2322,7 +2322,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev, - */ - tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ? - tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH); -- /* force tx_rs_thresh to adapt an aggresive tx_free_thresh */ -+ /* force tx_rs_thresh to adapt an aggressive tx_free_thresh */ - tx_rs_thresh = (DEFAULT_TX_RS_THRESH + tx_free_thresh > nb_desc) ? - nb_desc - tx_free_thresh : DEFAULT_TX_RS_THRESH; - if (tx_conf->tx_rs_thresh > 0) -@@ -2991,7 +2991,7 @@ i40e_rx_queue_init(struct i40e_rx_queue *rxq) - if (rxq->max_pkt_len > buf_size) - dev_data->scattered_rx = 1; - -- /* Init the RX tail regieter. */ -+ /* Init the RX tail register. */ - I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1); - - return 0; -diff --git a/drivers/net/i40e/i40e_rxtx_vec_altivec.c b/drivers/net/i40e/i40e_rxtx_vec_altivec.c -index d0bf86dfba..f78ba994f7 100644 ---- a/drivers/net/i40e/i40e_rxtx_vec_altivec.c -+++ b/drivers/net/i40e/i40e_rxtx_vec_altivec.c -@@ -430,7 +430,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts, - desc_to_ptype_v(descs, &rx_pkts[pos], ptype_tbl); - desc_to_olflags_v(descs, &rx_pkts[pos]); - -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll((vec_ld(0, - (vector unsigned long *)&staterr)[0])); - nb_pkts_recd += var; -diff --git a/drivers/net/i40e/i40e_rxtx_vec_neon.c b/drivers/net/i40e/i40e_rxtx_vec_neon.c -index b951ea2dc3..507468531f 100644 ---- a/drivers/net/i40e/i40e_rxtx_vec_neon.c -+++ b/drivers/net/i40e/i40e_rxtx_vec_neon.c -@@ -151,7 +151,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, uint64x2_t descs[4], - vreinterpretq_u8_u32(l3_l4e))); - /* then we shift left 1 bit */ - l3_l4e = vshlq_n_u32(l3_l4e, 1); -- /* we need to mask out the reduntant bits */ -+ /* we need to mask out the redundant bits */ - l3_l4e = vandq_u32(l3_l4e, cksum_mask); - - vlan0 = vorrq_u32(vlan0, rss); -@@ -416,7 +416,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *__rte_restrict rxq, - I40E_UINT16_BIT - 1)); - stat = ~vgetq_lane_u64(vreinterpretq_u64_u16(staterr), 0); - -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - if (unlikely(stat == 0)) { - nb_pkts_recd += RTE_I40E_DESCS_PER_LOOP; - } else { -diff --git a/drivers/net/i40e/i40e_rxtx_vec_sse.c b/drivers/net/i40e/i40e_rxtx_vec_sse.c -index 497b2404c6..3782e8052f 100644 ---- a/drivers/net/i40e/i40e_rxtx_vec_sse.c -+++ b/drivers/net/i40e/i40e_rxtx_vec_sse.c -@@ -282,7 +282,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, volatile union i40e_rx_desc *rxdp, - l3_l4e = _mm_shuffle_epi8(l3_l4e_flags, l3_l4e); - /* then we shift left 1 bit */ - l3_l4e = _mm_slli_epi32(l3_l4e, 1); -- /* we need to mask out the reduntant bits */ -+ /* we need to mask out the redundant bits */ - l3_l4e = _mm_and_si128(l3_l4e, cksum_mask); - - vlan0 = _mm_or_si128(vlan0, rss); -@@ -297,7 +297,7 @@ desc_to_olflags_v(struct i40e_rx_queue *rxq, volatile union i40e_rx_desc *rxdp, - __m128i v_fdir_ol_flags = descs_to_fdir_16b(desc_fltstat, - descs, rx_pkts); - #endif -- /* OR in ol_flag bits after descriptor speicific extraction */ -+ /* OR in ol_flag bits after descriptor specific extraction */ - vlan0 = _mm_or_si128(vlan0, v_fdir_ol_flags); - } - -@@ -577,7 +577,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts, - _mm_storeu_si128((void *)&rx_pkts[pos]->rx_descriptor_fields1, - pkt_mb1); - desc_to_ptype_v(descs, &rx_pkts[pos], ptype_tbl); -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll(_mm_cvtsi128_si64(staterr)); - nb_pkts_recd += var; - if (likely(var != RTE_I40E_DESCS_PER_LOOP)) -diff --git a/drivers/net/i40e/rte_pmd_i40e.c b/drivers/net/i40e/rte_pmd_i40e.c -index a492959b75..35829a1eea 100644 ---- a/drivers/net/i40e/rte_pmd_i40e.c -+++ b/drivers/net/i40e/rte_pmd_i40e.c -@@ -1427,7 +1427,7 @@ rte_pmd_i40e_set_tc_strict_prio(uint16_t port, uint8_t tc_map) - /* Get all TCs' bandwidth. */ - for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) { - if (veb->enabled_tc & BIT_ULL(i)) { -- /* For rubust, if bandwidth is 0, use 1 instead. */ -+ /* For robust, if bandwidth is 0, use 1 instead. */ - if (veb->bw_info.bw_ets_share_credits[i]) - ets_data.tc_bw_share_credits[i] = - veb->bw_info.bw_ets_share_credits[i]; -diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c -index 377d7bc7a6..79397f15e5 100644 ---- a/drivers/net/iavf/iavf_ethdev.c -+++ b/drivers/net/iavf/iavf_ethdev.c -@@ -516,7 +516,7 @@ iavf_init_rss(struct iavf_adapter *adapter) - j = 0; - vf->rss_lut[i] = j; - } -- /* send virtchnnl ops to configure rss*/ -+ /* send virtchnl ops to configure RSS */ - ret = iavf_configure_rss_lut(adapter); - if (ret) - return ret; -@@ -831,7 +831,7 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev, - "vector %u are mapping to all Rx queues", - vf->msix_base); - } else { -- /* If Rx interrupt is reuquired, and we can use -+ /* If Rx interrupt is required, and we can use - * multi interrupts, then the vec is from 1 - */ - vf->nb_msix = -@@ -1420,7 +1420,7 @@ iavf_dev_rss_reta_update(struct rte_eth_dev *dev, - } - - rte_memcpy(vf->rss_lut, lut, reta_size); -- /* send virtchnnl ops to configure rss*/ -+ /* send virtchnl ops to configure RSS */ - ret = iavf_configure_rss_lut(adapter); - if (ret) /* revert back */ - rte_memcpy(vf->rss_lut, lut, reta_size); -diff --git a/drivers/net/iavf/iavf_ipsec_crypto.c b/drivers/net/iavf/iavf_ipsec_crypto.c -index 884169e061..adf101ab8a 100644 ---- a/drivers/net/iavf/iavf_ipsec_crypto.c -+++ b/drivers/net/iavf/iavf_ipsec_crypto.c -@@ -69,7 +69,7 @@ struct iavf_security_session { - * 16B - 3 - * - * but we also need the IV Length for TSO to correctly calculate the total -- * header length so placing it in the upper 6-bits here for easier reterival. -+ * header length so placing it in the upper 6-bits here for easier retrieval. - */ - static inline uint8_t - calc_ipsec_desc_iv_len_field(uint16_t iv_sz) -@@ -448,7 +448,7 @@ sa_add_set_auth_params(struct virtchnl_ipsec_crypto_cfg_item *cfg, - /** - * Send SA add virtual channel request to Inline IPsec driver. - * -- * Inline IPsec driver expects SPI and destination IP adderss to be in host -+ * Inline IPsec driver expects SPI and destination IP address to be in host - * order, but DPDK APIs are network order, therefore we need to do a htonl - * conversion of these parameters. - */ -@@ -726,7 +726,7 @@ iavf_ipsec_crypto_action_valid(struct rte_eth_dev *ethdev, - /** - * Send virtual channel security policy add request to IES driver. - * -- * IES driver expects SPI and destination IP adderss to be in host -+ * IES driver expects SPI and destination IP address to be in host - * order, but DPDK APIs are network order, therefore we need to do a htonl - * conversion of these parameters. - */ -@@ -994,7 +994,7 @@ iavf_ipsec_crypto_sa_del(struct iavf_adapter *adapter, - request->req_id = (uint16_t)0xDEADBEEF; - - /** -- * SA delete supports deletetion of 1-8 specified SA's or if the flag -+ * SA delete supports deletion of 1-8 specified SA's or if the flag - * field is zero, all SA's associated with VF will be deleted. - */ - if (sess) { -@@ -1147,7 +1147,7 @@ iavf_ipsec_crypto_pkt_metadata_set(void *device, - md = RTE_MBUF_DYNFIELD(m, iavf_sctx->pkt_md_offset, - struct iavf_ipsec_crypto_pkt_metadata *); - -- /* Set immutatable metadata values from session template */ -+ /* Set immutable metadata values from session template */ - memcpy(md, &iavf_sess->pkt_metadata_template, - sizeof(struct iavf_ipsec_crypto_pkt_metadata)); - -@@ -1355,7 +1355,7 @@ iavf_ipsec_crypto_set_security_capabililites(struct iavf_security_ctx - capabilities[number_of_capabilities].op = RTE_CRYPTO_OP_TYPE_UNDEFINED; - - /** -- * Iterate over each virtchl crypto capability by crypto type and -+ * Iterate over each virtchnl crypto capability by crypto type and - * algorithm. - */ - for (i = 0; i < VIRTCHNL_IPSEC_MAX_CRYPTO_CAP_NUM; i++) { -@@ -1454,7 +1454,7 @@ iavf_ipsec_crypto_capabilities_get(void *device) - /** - * Update the security capabilities struct with the runtime discovered - * crypto capabilities, except for last element of the array which is -- * the null terminatation -+ * the null termination - */ - for (i = 0; i < ((sizeof(iavf_security_capabilities) / - sizeof(iavf_security_capabilities[0])) - 1); i++) { -diff --git a/drivers/net/iavf/iavf_ipsec_crypto.h b/drivers/net/iavf/iavf_ipsec_crypto.h -index 4e4c8798ec..687541077a 100644 ---- a/drivers/net/iavf/iavf_ipsec_crypto.h -+++ b/drivers/net/iavf/iavf_ipsec_crypto.h -@@ -73,7 +73,7 @@ enum iavf_ipsec_iv_len { - }; - - --/* IPsec Crypto Packet Metaday offload flags */ -+/* IPsec Crypto Packet Metadata offload flags */ - #define IAVF_IPSEC_CRYPTO_OL_FLAGS_IS_TUN (0x1 << 0) - #define IAVF_IPSEC_CRYPTO_OL_FLAGS_ESN (0x1 << 1) - #define IAVF_IPSEC_CRYPTO_OL_FLAGS_IPV6_EXT_HDRS (0x1 << 2) -diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c -index 154472c50f..59623ac820 100644 ---- a/drivers/net/iavf/iavf_rxtx.c -+++ b/drivers/net/iavf/iavf_rxtx.c -@@ -648,8 +648,8 @@ iavf_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, - return -ENOMEM; - } - -- /* Allocate the maximun number of RX ring hardware descriptor with -- * a liitle more to support bulk allocate. -+ /* Allocate the maximum number of RX ring hardware descriptor with -+ * a little more to support bulk allocate. - */ - len = IAVF_MAX_RING_DESC + IAVF_RX_MAX_BURST; - ring_size = RTE_ALIGN(len * sizeof(union iavf_rx_desc), -diff --git a/drivers/net/iavf/iavf_rxtx_vec_sse.c b/drivers/net/iavf/iavf_rxtx_vec_sse.c -index 1bac59bf0e..d582a36326 100644 ---- a/drivers/net/iavf/iavf_rxtx_vec_sse.c -+++ b/drivers/net/iavf/iavf_rxtx_vec_sse.c -@@ -159,7 +159,7 @@ desc_to_olflags_v(struct iavf_rx_queue *rxq, __m128i descs[4], - l3_l4e = _mm_shuffle_epi8(l3_l4e_flags, l3_l4e); - /* then we shift left 1 bit */ - l3_l4e = _mm_slli_epi32(l3_l4e, 1); -- /* we need to mask out the reduntant bits */ -+ /* we need to mask out the redundant bits */ - l3_l4e = _mm_and_si128(l3_l4e, cksum_mask); - - vlan0 = _mm_or_si128(vlan0, rss); -@@ -613,7 +613,7 @@ _recv_raw_pkts_vec(struct iavf_rx_queue *rxq, struct rte_mbuf **rx_pkts, - _mm_storeu_si128((void *)&rx_pkts[pos]->rx_descriptor_fields1, - pkt_mb1); - desc_to_ptype_v(descs, &rx_pkts[pos], ptype_tbl); -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll(_mm_cvtsi128_si64(staterr)); - nb_pkts_recd += var; - if (likely(var != IAVF_VPMD_DESCS_PER_LOOP)) -diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c -index 145b059837..7602691649 100644 ---- a/drivers/net/iavf/iavf_vchnl.c -+++ b/drivers/net/iavf/iavf_vchnl.c -@@ -461,7 +461,7 @@ iavf_check_api_version(struct iavf_adapter *adapter) - (vf->virtchnl_version.major == VIRTCHNL_VERSION_MAJOR_START && - vf->virtchnl_version.minor < VIRTCHNL_VERSION_MINOR_START)) { - PMD_INIT_LOG(ERR, "VIRTCHNL API version should not be lower" -- " than (%u.%u) to support Adapative VF", -+ " than (%u.%u) to support Adaptive VF", - VIRTCHNL_VERSION_MAJOR_START, - VIRTCHNL_VERSION_MAJOR_START); - return -1; -@@ -1487,7 +1487,7 @@ iavf_fdir_check(struct iavf_adapter *adapter, - - err = iavf_execute_vf_cmd(adapter, &args, 0); - if (err) { -- PMD_DRV_LOG(ERR, "fail to check flow direcotor rule"); -+ PMD_DRV_LOG(ERR, "fail to check flow director rule"); - return err; - } - -diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c -index cca1d7bf46..7f0c074b01 100644 ---- a/drivers/net/ice/ice_dcf.c -+++ b/drivers/net/ice/ice_dcf.c -@@ -864,7 +864,7 @@ ice_dcf_init_rss(struct ice_dcf_hw *hw) - j = 0; - hw->rss_lut[i] = j; - } -- /* send virtchnnl ops to configure rss*/ -+ /* send virtchnl ops to configure RSS */ - ret = ice_dcf_configure_rss_lut(hw); - if (ret) - return ret; -diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c -index 28f7f7fb72..164d834a18 100644 ---- a/drivers/net/ice/ice_dcf_ethdev.c -+++ b/drivers/net/ice/ice_dcf_ethdev.c -@@ -203,7 +203,7 @@ ice_dcf_config_rx_queues_irqs(struct rte_eth_dev *dev, - "vector %u are mapping to all Rx queues", - hw->msix_base); - } else { -- /* If Rx interrupt is reuquired, and we can use -+ /* If Rx interrupt is required, and we can use - * multi interrupts, then the vec is from 1 - */ - hw->nb_msix = RTE_MIN(hw->vf_res->max_vectors, -diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c -index 13a7a9702a..c9fd3de2bd 100644 ---- a/drivers/net/ice/ice_ethdev.c -+++ b/drivers/net/ice/ice_ethdev.c -@@ -1264,7 +1264,7 @@ ice_handle_aq_msg(struct rte_eth_dev *dev) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -1627,7 +1627,7 @@ ice_setup_vsi(struct ice_pf *pf, enum ice_vsi_type type) - } - - /* At the beginning, only TC0. */ -- /* What we need here is the maximam number of the TX queues. -+ /* What we need here is the maximum number of the TX queues. - * Currently vsi->nb_qps means it. - * Correct it if any change. - */ -@@ -3576,7 +3576,7 @@ ice_dev_start(struct rte_eth_dev *dev) - goto rx_err; - } - -- /* enable Rx interrput and mapping Rx queue to interrupt vector */ -+ /* enable Rx interrupt and mapping Rx queue to interrupt vector */ - if (ice_rxq_intr_setup(dev)) - return -EIO; - -@@ -3603,7 +3603,7 @@ ice_dev_start(struct rte_eth_dev *dev) - - ice_dev_set_link_up(dev); - -- /* Call get_link_info aq commond to enable/disable LSE */ -+ /* Call get_link_info aq command to enable/disable LSE */ - ice_link_update(dev, 0); - - pf->adapter_stopped = false; -@@ -5395,7 +5395,7 @@ ice_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - count++; - } - -- /* Get individiual stats from ice_hw_port struct */ -+ /* Get individual stats from ice_hw_port struct */ - for (i = 0; i < ICE_NB_HW_PORT_XSTATS; i++) { - xstats[count].value = - *(uint64_t *)((char *)hw_stats + -@@ -5426,7 +5426,7 @@ static int ice_xstats_get_names(__rte_unused struct rte_eth_dev *dev, - count++; - } - -- /* Get individiual stats from ice_hw_port struct */ -+ /* Get individual stats from ice_hw_port struct */ - for (i = 0; i < ICE_NB_HW_PORT_XSTATS; i++) { - strlcpy(xstats_names[count].name, ice_hw_port_strings[i].name, - sizeof(xstats_names[count].name)); -diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c -index f6d8564ab8..c80d86915e 100644 ---- a/drivers/net/ice/ice_rxtx.c -+++ b/drivers/net/ice/ice_rxtx.c -@@ -1118,7 +1118,7 @@ ice_rx_queue_setup(struct rte_eth_dev *dev, - rxq->proto_xtr = pf->proto_xtr != NULL ? - pf->proto_xtr[queue_idx] : PROTO_XTR_NONE; - -- /* Allocate the maximun number of RX ring hardware descriptor. */ -+ /* Allocate the maximum number of RX ring hardware descriptor. */ - len = ICE_MAX_RING_DESC; - - /** -@@ -1248,7 +1248,7 @@ ice_tx_queue_setup(struct rte_eth_dev *dev, - tx_free_thresh = (uint16_t)(tx_conf->tx_free_thresh ? - tx_conf->tx_free_thresh : - ICE_DEFAULT_TX_FREE_THRESH); -- /* force tx_rs_thresh to adapt an aggresive tx_free_thresh */ -+ /* force tx_rs_thresh to adapt an aggressive tx_free_thresh */ - tx_rs_thresh = - (ICE_DEFAULT_TX_RSBIT_THRESH + tx_free_thresh > nb_desc) ? - nb_desc - tx_free_thresh : ICE_DEFAULT_TX_RSBIT_THRESH; -@@ -1714,7 +1714,7 @@ ice_rx_alloc_bufs(struct ice_rx_queue *rxq) - rxdp[i].read.pkt_addr = dma_addr; - } - -- /* Update rx tail regsiter */ -+ /* Update Rx tail register */ - ICE_PCI_REG_WRITE(rxq->qrx_tail, rxq->rx_free_trigger); - - rxq->rx_free_trigger = -@@ -1976,7 +1976,7 @@ ice_recv_scattered_pkts(void *rx_queue, - * threshold of the queue, advance the Receive Descriptor Tail (RDT) - * register. Update the RDT with the value of the last processed RX - * descriptor minus 1, to guarantee that the RDT register is never -- * equal to the RDH register, which creates a "full" ring situtation -+ * equal to the RDH register, which creates a "full" ring situation - * from the hardware point of view. - */ - nb_hold = (uint16_t)(nb_hold + rxq->nb_rx_hold); -@@ -3117,7 +3117,7 @@ tx_xmit_pkts(struct ice_tx_queue *txq, - ice_tx_fill_hw_ring(txq, tx_pkts + n, (uint16_t)(nb_pkts - n)); - txq->tx_tail = (uint16_t)(txq->tx_tail + (nb_pkts - n)); - -- /* Determin if RS bit needs to be set */ -+ /* Determine if RS bit needs to be set */ - if (txq->tx_tail > txq->tx_next_rs) { - txr[txq->tx_next_rs].cmd_type_offset_bsz |= - rte_cpu_to_le_64(((uint64_t)ICE_TX_DESC_CMD_RS) << -diff --git a/drivers/net/ice/ice_rxtx_vec_sse.c b/drivers/net/ice/ice_rxtx_vec_sse.c -index 6cd44c5847..fd94cedde3 100644 ---- a/drivers/net/ice/ice_rxtx_vec_sse.c -+++ b/drivers/net/ice/ice_rxtx_vec_sse.c -@@ -202,7 +202,7 @@ ice_rx_desc_to_olflags_v(struct ice_rx_queue *rxq, __m128i descs[4], - __m128i l3_l4_mask = _mm_set_epi32(~0x6, ~0x6, ~0x6, ~0x6); - __m128i l3_l4_flags = _mm_and_si128(flags, l3_l4_mask); - flags = _mm_or_si128(l3_l4_flags, l4_outer_flags); -- /* we need to mask out the reduntant bits introduced by RSS or -+ /* we need to mask out the redundant bits introduced by RSS or - * VLAN fields. - */ - flags = _mm_and_si128(flags, cksum_mask); -@@ -566,7 +566,7 @@ _ice_recv_raw_pkts_vec(struct ice_rx_queue *rxq, struct rte_mbuf **rx_pkts, - _mm_storeu_si128((void *)&rx_pkts[pos]->rx_descriptor_fields1, - pkt_mb0); - ice_rx_desc_to_ptype_v(descs, &rx_pkts[pos], ptype_tbl); -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll(_mm_cvtsi128_si64(staterr)); - nb_pkts_recd += var; - if (likely(var != ICE_DESCS_PER_LOOP)) -diff --git a/drivers/net/igc/igc_filter.c b/drivers/net/igc/igc_filter.c -index 51fcabfb59..bff98df200 100644 ---- a/drivers/net/igc/igc_filter.c -+++ b/drivers/net/igc/igc_filter.c -@@ -167,7 +167,7 @@ igc_tuple_filter_lookup(const struct igc_adapter *igc, - /* search the filter array */ - for (; i < IGC_MAX_NTUPLE_FILTERS; i++) { - if (igc->ntuple_filters[i].hash_val) { -- /* compare the hase value */ -+ /* compare the hash value */ - if (ntuple->hash_val == - igc->ntuple_filters[i].hash_val) - /* filter be found, return index */ -diff --git a/drivers/net/igc/igc_txrx.c b/drivers/net/igc/igc_txrx.c -index 339b0c9aa1..e48d5df11a 100644 ---- a/drivers/net/igc/igc_txrx.c -+++ b/drivers/net/igc/igc_txrx.c -@@ -2099,7 +2099,7 @@ eth_igc_tx_done_cleanup(void *txqueue, uint32_t free_cnt) - sw_ring[tx_id].mbuf = NULL; - sw_ring[tx_id].last_id = tx_id; - -- /* Move to next segemnt. */ -+ /* Move to next segment. */ - tx_id = sw_ring[tx_id].next_id; - } while (tx_id != tx_next); - -@@ -2133,7 +2133,7 @@ eth_igc_tx_done_cleanup(void *txqueue, uint32_t free_cnt) - * Walk the list and find the next mbuf, if any. - */ - do { -- /* Move to next segemnt. */ -+ /* Move to next segment. */ - tx_id = sw_ring[tx_id].next_id; - - if (sw_ring[tx_id].mbuf) -diff --git a/drivers/net/ionic/ionic_if.h b/drivers/net/ionic/ionic_if.h -index 693b44d764..45bad9b040 100644 ---- a/drivers/net/ionic/ionic_if.h -+++ b/drivers/net/ionic/ionic_if.h -@@ -2068,7 +2068,7 @@ typedef struct ionic_admin_comp ionic_fw_download_comp; - * enum ionic_fw_control_oper - FW control operations - * @IONIC_FW_RESET: Reset firmware - * @IONIC_FW_INSTALL: Install firmware -- * @IONIC_FW_ACTIVATE: Acticate firmware -+ * @IONIC_FW_ACTIVATE: Activate firmware - */ - enum ionic_fw_control_oper { - IONIC_FW_RESET = 0, -@@ -2091,7 +2091,7 @@ struct ionic_fw_control_cmd { - }; - - /** -- * struct ionic_fw_control_comp - Firmware control copletion -+ * struct ionic_fw_control_comp - Firmware control completion - * @status: Status of the command (enum ionic_status_code) - * @comp_index: Index in the descriptor ring for which this is the completion - * @slot: Slot where the firmware was installed -@@ -2878,7 +2878,7 @@ struct ionic_doorbell { - * and @identity->intr_coal_div to convert from - * usecs to device units: - * -- * coal_init = coal_usecs * coal_mutl / coal_div -+ * coal_init = coal_usecs * coal_mult / coal_div - * - * When an interrupt is sent the interrupt - * coalescing timer current value -diff --git a/drivers/net/ipn3ke/ipn3ke_ethdev.c b/drivers/net/ipn3ke/ipn3ke_ethdev.c -index 964506c6db..014e438dd5 100644 ---- a/drivers/net/ipn3ke/ipn3ke_ethdev.c -+++ b/drivers/net/ipn3ke/ipn3ke_ethdev.c -@@ -483,7 +483,7 @@ static int ipn3ke_vswitch_probe(struct rte_afu_device *afu_dev) - RTE_CACHE_LINE_SIZE, - afu_dev->device.numa_node); - if (!hw) { -- IPN3KE_AFU_PMD_ERR("failed to allocate hardwart data"); -+ IPN3KE_AFU_PMD_ERR("failed to allocate hardware data"); - retval = -ENOMEM; - return -ENOMEM; - } -diff --git a/drivers/net/ipn3ke/ipn3ke_ethdev.h b/drivers/net/ipn3ke/ipn3ke_ethdev.h -index 041f13d9c3..58fcc50c57 100644 ---- a/drivers/net/ipn3ke/ipn3ke_ethdev.h -+++ b/drivers/net/ipn3ke/ipn3ke_ethdev.h -@@ -223,7 +223,7 @@ struct ipn3ke_hw_cap { - }; - - /** -- * Strucute to store private data for each representor instance -+ * Structure to store private data for each representor instance - */ - struct ipn3ke_rpst { - TAILQ_ENTRY(ipn3ke_rpst) next; /**< Next in device list. */ -@@ -237,7 +237,7 @@ struct ipn3ke_rpst { - uint16_t i40e_pf_eth_port_id; - struct rte_eth_link ori_linfo; - struct ipn3ke_tm_internals tm; -- /**< Private data store of assocaiated physical function */ -+ /**< Private data store of associated physical function */ - struct rte_ether_addr mac_addr; - }; - -diff --git a/drivers/net/ipn3ke/ipn3ke_flow.c b/drivers/net/ipn3ke/ipn3ke_flow.c -index f5867ca055..66ae31a5a9 100644 ---- a/drivers/net/ipn3ke/ipn3ke_flow.c -+++ b/drivers/net/ipn3ke/ipn3ke_flow.c -@@ -1299,7 +1299,7 @@ int ipn3ke_flow_init(void *dev) - IPN3KE_AFU_PMD_DEBUG("IPN3KE_CLF_LKUP_ENABLE: %x\n", data); - - -- /* configure rx parse config, settings associatied with VxLAN */ -+ /* configure rx parse config, settings associated with VxLAN */ - IPN3KE_MASK_WRITE_REG(hw, - IPN3KE_CLF_RX_PARSE_CFG, - 0, -diff --git a/drivers/net/ipn3ke/ipn3ke_representor.c b/drivers/net/ipn3ke/ipn3ke_representor.c -index 8139e13a23..abbecfdf2e 100644 ---- a/drivers/net/ipn3ke/ipn3ke_representor.c -+++ b/drivers/net/ipn3ke/ipn3ke_representor.c -@@ -2279,7 +2279,7 @@ ipn3ke_rpst_xstats_get - count++; - } - -- /* Get individiual stats from ipn3ke_rpst_hw_port */ -+ /* Get individual stats from ipn3ke_rpst_hw_port */ - for (i = 0; i < IPN3KE_RPST_HW_PORT_XSTATS_CNT; i++) { - xstats[count].value = *(uint64_t *)(((char *)(&hw_stats)) + - ipn3ke_rpst_hw_port_strings[i].offset); -@@ -2287,7 +2287,7 @@ ipn3ke_rpst_xstats_get - count++; - } - -- /* Get individiual stats from ipn3ke_rpst_rxq_pri */ -+ /* Get individual stats from ipn3ke_rpst_rxq_pri */ - for (i = 0; i < IPN3KE_RPST_RXQ_PRIO_XSTATS_CNT; i++) { - for (prio = 0; prio < IPN3KE_RPST_PRIO_XSTATS_CNT; prio++) { - xstats[count].value = -@@ -2299,7 +2299,7 @@ ipn3ke_rpst_xstats_get - } - } - -- /* Get individiual stats from ipn3ke_rpst_txq_prio */ -+ /* Get individual stats from ipn3ke_rpst_txq_prio */ - for (i = 0; i < IPN3KE_RPST_TXQ_PRIO_XSTATS_CNT; i++) { - for (prio = 0; prio < IPN3KE_RPST_PRIO_XSTATS_CNT; prio++) { - xstats[count].value = -@@ -2337,7 +2337,7 @@ __rte_unused unsigned int limit) - count++; - } - -- /* Get individiual stats from ipn3ke_rpst_hw_port */ -+ /* Get individual stats from ipn3ke_rpst_hw_port */ - for (i = 0; i < IPN3KE_RPST_HW_PORT_XSTATS_CNT; i++) { - snprintf(xstats_names[count].name, - sizeof(xstats_names[count].name), -@@ -2346,7 +2346,7 @@ __rte_unused unsigned int limit) - count++; - } - -- /* Get individiual stats from ipn3ke_rpst_rxq_pri */ -+ /* Get individual stats from ipn3ke_rpst_rxq_pri */ - for (i = 0; i < IPN3KE_RPST_RXQ_PRIO_XSTATS_CNT; i++) { - for (prio = 0; prio < 8; prio++) { - snprintf(xstats_names[count].name, -@@ -2358,7 +2358,7 @@ __rte_unused unsigned int limit) - } - } - -- /* Get individiual stats from ipn3ke_rpst_txq_prio */ -+ /* Get individual stats from ipn3ke_rpst_txq_prio */ - for (i = 0; i < IPN3KE_RPST_TXQ_PRIO_XSTATS_CNT; i++) { - for (prio = 0; prio < 8; prio++) { - snprintf(xstats_names[count].name, -diff --git a/drivers/net/ipn3ke/meson.build b/drivers/net/ipn3ke/meson.build -index 4bf739809e..104d2f58e5 100644 ---- a/drivers/net/ipn3ke/meson.build -+++ b/drivers/net/ipn3ke/meson.build -@@ -8,7 +8,7 @@ if is_windows - endif - - # --# Add the experimenatal APIs called from this PMD -+# Add the experimental APIs called from this PMD - # rte_eth_switch_domain_alloc() - # rte_eth_dev_create() - # rte_eth_dev_destroy() -diff --git a/drivers/net/ixgbe/ixgbe_bypass.c b/drivers/net/ixgbe/ixgbe_bypass.c -index 67ced6c723..94f34a2996 100644 ---- a/drivers/net/ixgbe/ixgbe_bypass.c -+++ b/drivers/net/ixgbe/ixgbe_bypass.c -@@ -11,7 +11,7 @@ - - #define BYPASS_STATUS_OFF_MASK 3 - --/* Macros to check for invlaid function pointers. */ -+/* Macros to check for invalid function pointers. */ - #define FUNC_PTR_OR_ERR_RET(func, retval) do { \ - if ((func) == NULL) { \ - PMD_DRV_LOG(ERR, "%s:%d function not supported", \ -diff --git a/drivers/net/ixgbe/ixgbe_bypass_api.h b/drivers/net/ixgbe/ixgbe_bypass_api.h -index 8eb773391b..6ef965dbb6 100644 ---- a/drivers/net/ixgbe/ixgbe_bypass_api.h -+++ b/drivers/net/ixgbe/ixgbe_bypass_api.h -@@ -135,7 +135,7 @@ static s32 ixgbe_bypass_rw_generic(struct ixgbe_hw *hw, u32 cmd, u32 *status) - * ixgbe_bypass_valid_rd_generic - Verify valid return from bit-bang. - * - * If we send a write we can't be sure it took until we can read back -- * that same register. It can be a problem as some of the feilds may -+ * that same register. It can be a problem as some of the fields may - * for valid reasons change between the time wrote the register and - * we read it again to verify. So this function check everything we - * can check and then assumes it worked. -@@ -189,7 +189,7 @@ static bool ixgbe_bypass_valid_rd_generic(u32 in_reg, u32 out_reg) - } - - /** -- * ixgbe_bypass_set_generic - Set a bypass field in the FW CTRL Regiter. -+ * ixgbe_bypass_set_generic - Set a bypass field in the FW CTRL Register. - * - * @hw: pointer to hardware structure - * @cmd: The control word we are setting. -diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c -index fe61dba81d..c8f0460440 100644 ---- a/drivers/net/ixgbe/ixgbe_ethdev.c -+++ b/drivers/net/ixgbe/ixgbe_ethdev.c -@@ -2375,7 +2375,7 @@ ixgbe_dev_configure(struct rte_eth_dev *dev) - if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) - dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; - -- /* multipe queue mode checking */ -+ /* multiple queue mode checking */ - ret = ixgbe_check_mq_mode(dev); - if (ret != 0) { - PMD_DRV_LOG(ERR, "ixgbe_check_mq_mode fails with %d.", -@@ -2603,7 +2603,7 @@ ixgbe_dev_start(struct rte_eth_dev *dev) - } - } - -- /* confiugre msix for sleep until rx interrupt */ -+ /* configure MSI-X for sleep until Rx interrupt */ - ixgbe_configure_msix(dev); - - /* initialize transmission unit */ -@@ -2907,7 +2907,7 @@ ixgbe_dev_set_link_up(struct rte_eth_dev *dev) - if (hw->mac.type == ixgbe_mac_82599EB) { - #ifdef RTE_LIBRTE_IXGBE_BYPASS - if (hw->device_id == IXGBE_DEV_ID_82599_BYPASS) { -- /* Not suported in bypass mode */ -+ /* Not supported in bypass mode */ - PMD_INIT_LOG(ERR, "Set link up is not supported " - "by device id 0x%x", hw->device_id); - return -ENOTSUP; -@@ -2938,7 +2938,7 @@ ixgbe_dev_set_link_down(struct rte_eth_dev *dev) - if (hw->mac.type == ixgbe_mac_82599EB) { - #ifdef RTE_LIBRTE_IXGBE_BYPASS - if (hw->device_id == IXGBE_DEV_ID_82599_BYPASS) { -- /* Not suported in bypass mode */ -+ /* Not supported in bypass mode */ - PMD_INIT_LOG(ERR, "Set link down is not supported " - "by device id 0x%x", hw->device_id); - return -ENOTSUP; -@@ -4603,7 +4603,7 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -4659,7 +4659,7 @@ ixgbe_dev_interrupt_delayed_handler(void *param) - * @param handle - * Pointer to interrupt handle. - * @param param -- * The address of parameter (struct rte_eth_dev *) regsitered before. -+ * The address of parameter (struct rte_eth_dev *) registered before. - * - * @return - * void -@@ -5921,7 +5921,7 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev) - /* Configure all RX queues of VF */ - for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) { - /* Force all queue use vector 0, -- * as IXGBE_VF_MAXMSIVECOTR = 1 -+ * as IXGBE_VF_MAXMSIVECTOR = 1 - */ - ixgbevf_set_ivar_map(hw, 0, q_idx, vector_idx); - rte_intr_vec_list_index_set(intr_handle, q_idx, -@@ -6256,7 +6256,7 @@ ixgbe_inject_5tuple_filter(struct rte_eth_dev *dev, - * @param - * dev: Pointer to struct rte_eth_dev. - * index: the index the filter allocates. -- * filter: ponter to the filter that will be added. -+ * filter: pointer to the filter that will be added. - * rx_queue: the queue id the filter assigned to. - * - * @return -@@ -6872,7 +6872,7 @@ ixgbe_timesync_disable(struct rte_eth_dev *dev) - /* Disable L2 filtering of IEEE1588/802.1AS Ethernet frame types. */ - IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_1588), 0); - -- /* Stop incrementating the System Time registers. */ -+ /* Stop incrementing the System Time registers. */ - IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, 0); - - return 0; -diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h -index 83e8b5e56a..69e0e82a5b 100644 ---- a/drivers/net/ixgbe/ixgbe_ethdev.h -+++ b/drivers/net/ixgbe/ixgbe_ethdev.h -@@ -68,7 +68,7 @@ - #define IXGBE_LPBK_NONE 0x0 /* Default value. Loopback is disabled. */ - #define IXGBE_LPBK_TX_RX 0x1 /* Tx->Rx loopback operation is enabled. */ - /* X540-X550 specific loopback operations */ --#define IXGBE_MII_AUTONEG_ENABLE 0x1000 /* Auto-negociation enable (default = 1) */ -+#define IXGBE_MII_AUTONEG_ENABLE 0x1000 /* Auto-negotiation enable (default = 1) */ - - #define IXGBE_MAX_JUMBO_FRAME_SIZE 0x2600 /* Maximum Jumbo frame size. */ - -diff --git a/drivers/net/ixgbe/ixgbe_fdir.c b/drivers/net/ixgbe/ixgbe_fdir.c -index 7894047829..834c1b3f51 100644 ---- a/drivers/net/ixgbe/ixgbe_fdir.c -+++ b/drivers/net/ixgbe/ixgbe_fdir.c -@@ -390,7 +390,7 @@ fdir_set_input_mask_x550(struct rte_eth_dev *dev) - - switch (info->mask.tunnel_type_mask) { - case 0: -- /* Mask turnnel type */ -+ /* Mask tunnel type */ - fdiripv6m |= IXGBE_FDIRIP6M_TUNNEL_TYPE; - break; - case 1: -diff --git a/drivers/net/ixgbe/ixgbe_flow.c b/drivers/net/ixgbe/ixgbe_flow.c -index bdc9d4796c..368342872a 100644 ---- a/drivers/net/ixgbe/ixgbe_flow.c -+++ b/drivers/net/ixgbe/ixgbe_flow.c -@@ -135,7 +135,7 @@ const struct rte_flow_action *next_no_void_action( - } - - /** -- * Please aware there's an asumption for all the parsers. -+ * Please be aware there's an assumption for all the parsers. - * rte_flow_item is using big endian, rte_flow_attr and - * rte_flow_action are using CPU order. - * Because the pattern is used to describe the packets, -@@ -3261,7 +3261,7 @@ ixgbe_flow_create(struct rte_eth_dev *dev, - - /** - * Check if the flow rule is supported by ixgbe. -- * It only checkes the format. Don't guarantee the rule can be programmed into -+ * It only checks the format. Don't guarantee the rule can be programmed into - * the HW. Because there can be no enough room for the rule. - */ - static int -diff --git a/drivers/net/ixgbe/ixgbe_ipsec.c b/drivers/net/ixgbe/ixgbe_ipsec.c -index 944c9f2380..c353ae33b4 100644 ---- a/drivers/net/ixgbe/ixgbe_ipsec.c -+++ b/drivers/net/ixgbe/ixgbe_ipsec.c -@@ -310,7 +310,7 @@ ixgbe_crypto_remove_sa(struct rte_eth_dev *dev, - return -1; - } - -- /* Disable and clear Rx SPI and key table table entryes*/ -+ /* Disable and clear Rx SPI and key table table entries*/ - reg_val = IPSRXIDX_WRITE | IPSRXIDX_TABLE_SPI | (sa_index << 3); - IXGBE_WRITE_REG(hw, IXGBE_IPSRXSPI, 0); - IXGBE_WRITE_REG(hw, IXGBE_IPSRXIPIDX, 0); -diff --git a/drivers/net/ixgbe/ixgbe_pf.c b/drivers/net/ixgbe/ixgbe_pf.c -index 9f1bd0a62b..c73833b7ae 100644 ---- a/drivers/net/ixgbe/ixgbe_pf.c -+++ b/drivers/net/ixgbe/ixgbe_pf.c -@@ -242,7 +242,7 @@ int ixgbe_pf_host_configure(struct rte_eth_dev *eth_dev) - /* PFDMA Tx General Switch Control Enables VMDQ loopback */ - IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); - -- /* clear VMDq map to perment rar 0 */ -+ /* clear VMDq map to permanent rar 0 */ - hw->mac.ops.clear_vmdq(hw, 0, IXGBE_CLEAR_VMDQ_ALL); - - /* clear VMDq map to scan rar 127 */ -diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c -index d7c80d4242..99e928a2a9 100644 ---- a/drivers/net/ixgbe/ixgbe_rxtx.c -+++ b/drivers/net/ixgbe/ixgbe_rxtx.c -@@ -1954,7 +1954,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); -@@ -2303,7 +2303,7 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts, - * register. - * Update the RDT with the value of the last processed RX descriptor - * minus 1, to guarantee that the RDT register is never equal to the -- * RDH register, which creates a "full" ring situtation from the -+ * RDH register, which creates a "full" ring situation from the - * hardware point of view... - */ - if (!bulk_alloc && nb_hold > rxq->rx_free_thresh) { -@@ -2666,7 +2666,7 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev, - */ - tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ? - tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH); -- /* force tx_rs_thresh to adapt an aggresive tx_free_thresh */ -+ /* force tx_rs_thresh to adapt an aggressive tx_free_thresh */ - tx_rs_thresh = (DEFAULT_TX_RS_THRESH + tx_free_thresh > nb_desc) ? - nb_desc - tx_free_thresh : DEFAULT_TX_RS_THRESH; - if (tx_conf->tx_rs_thresh > 0) -@@ -4831,7 +4831,7 @@ ixgbe_set_rx_function(struct rte_eth_dev *dev) - dev->data->port_id); - dev->rx_pkt_burst = ixgbe_recv_pkts_lro_bulk_alloc; - } else { -- PMD_INIT_LOG(DEBUG, "Using Regualr (non-vector, " -+ PMD_INIT_LOG(DEBUG, "Using Regular (non-vector, " - "single allocation) " - "Scattered Rx callback " - "(port=%d).", -@@ -5170,7 +5170,7 @@ ixgbe_dev_rx_init(struct rte_eth_dev *dev) - /* - * Setup the Checksum Register. - * Disable Full-Packet Checksum which is mutually exclusive with RSS. -- * Enable IP/L4 checkum computation by hardware if requested to do so. -+ * Enable IP/L4 checksum computation by hardware if requested to do so. - */ - rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM); - rxcsum |= IXGBE_RXCSUM_PCSD; -diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c -index 1eed949495..c56f76b368 100644 ---- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c -+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c -@@ -562,7 +562,7 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts, - - desc_to_ptype_v(descs, rxq->pkt_type_mask, &rx_pkts[pos]); - -- /* C.4 calc avaialbe number of desc */ -+ /* C.4 calc available number of desc */ - var = __builtin_popcountll(_mm_cvtsi128_si64(staterr)); - nb_pkts_recd += var; - if (likely(var != RTE_IXGBE_DESCS_PER_LOOP)) -diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c -index 079cf01269..42f48a68a1 100644 ---- a/drivers/net/memif/memif_socket.c -+++ b/drivers/net/memif/memif_socket.c -@@ -726,7 +726,7 @@ memif_msg_receive(struct memif_control_channel *cc) - break; - case MEMIF_MSG_TYPE_INIT: - /* -- * This cc does not have an interface asociated with it. -+ * This cc does not have an interface associated with it. - * If suitable interface is found it will be assigned here. - */ - ret = memif_msg_receive_init(cc, &msg); -diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c -index e3d523af57..59cb5a82a2 100644 ---- a/drivers/net/memif/rte_eth_memif.c -+++ b/drivers/net/memif/rte_eth_memif.c -@@ -1026,7 +1026,7 @@ memif_regions_init(struct rte_eth_dev *dev) - if (ret < 0) - return ret; - } else { -- /* create one memory region contaning rings and buffers */ -+ /* create one memory region containing rings and buffers */ - ret = memif_region_init_shm(dev, /* has buffers */ 1); - if (ret < 0) - return ret; -diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h -index 2d0c512f79..4023a47602 100644 ---- a/drivers/net/mlx4/mlx4.h -+++ b/drivers/net/mlx4/mlx4.h -@@ -74,7 +74,7 @@ enum mlx4_mp_req_type { - MLX4_MP_REQ_STOP_RXTX, - }; - --/* Pameters for IPC. */ -+/* Parameters for IPC. */ - struct mlx4_mp_param { - enum mlx4_mp_req_type type; - int port_id; -diff --git a/drivers/net/mlx4/mlx4_ethdev.c b/drivers/net/mlx4/mlx4_ethdev.c -index d606ec8ca7..ce74c51ce2 100644 ---- a/drivers/net/mlx4/mlx4_ethdev.c -+++ b/drivers/net/mlx4/mlx4_ethdev.c -@@ -752,7 +752,7 @@ mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) - * Pointer to Ethernet device structure. - * - * @return -- * alwasy 0 on success -+ * always 0 on success - */ - int - mlx4_stats_reset(struct rte_eth_dev *dev) -diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c -index c29fe3d92b..36f0fbf04a 100644 ---- a/drivers/net/mlx5/linux/mlx5_os.c -+++ b/drivers/net/mlx5/linux/mlx5_os.c -@@ -112,7 +112,7 @@ static struct mlx5_indexed_pool_config icfg[] = { - * Pointer to RQ channel object, which includes the channel fd - * - * @param[out] fd -- * The file descriptor (representing the intetrrupt) used in this channel. -+ * The file descriptor (representing the interrupt) used in this channel. - * - * @return - * 0 on successfully setting the fd to non-blocking, non-zero otherwise. -@@ -1743,7 +1743,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, - priv->drop_queue.hrxq = mlx5_drop_action_create(eth_dev); - if (!priv->drop_queue.hrxq) - goto error; -- /* Port representor shares the same max prioirity with pf port. */ -+ /* Port representor shares the same max priority with pf port. */ - if (!priv->sh->flow_priority_check_flag) { - /* Supported Verbs flow priority number detection. */ - err = mlx5_flow_discover_priorities(eth_dev); -@@ -2300,7 +2300,7 @@ mlx5_os_pci_probe_pf(struct mlx5_common_device *cdev, - /* - * Force standalone bonding - * device for ROCE LAG -- * confgiurations. -+ * configurations. - */ - list[ns].info.master = 0; - list[ns].info.representor = 0; -@@ -2637,7 +2637,7 @@ mlx5_os_pci_probe(struct mlx5_common_device *cdev) - } - if (ret) { - DRV_LOG(ERR, "Probe of PCI device " PCI_PRI_FMT " " -- "aborted due to proding failure of PF %u", -+ "aborted due to prodding failure of PF %u", - pci_dev->addr.domain, pci_dev->addr.bus, - pci_dev->addr.devid, pci_dev->addr.function, - eth_da.ports[p]); -diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c -index aa5f313c1a..8b4387d6b4 100644 ---- a/drivers/net/mlx5/mlx5.c -+++ b/drivers/net/mlx5/mlx5.c -@@ -1642,7 +1642,7 @@ mlx5_dev_close(struct rte_eth_dev *dev) - /* - * Free the shared context in last turn, because the cleanup - * routines above may use some shared fields, like -- * mlx5_os_mac_addr_flush() uses ibdev_path for retrieveing -+ * mlx5_os_mac_addr_flush() uses ibdev_path for retrieving - * ifindex if Netlink fails. - */ - mlx5_free_shared_dev_ctx(priv->sh); -@@ -1962,7 +1962,7 @@ mlx5_args_check(const char *key, const char *val, void *opaque) - if (tmp != MLX5_RCM_NONE && - tmp != MLX5_RCM_LIGHT && - tmp != MLX5_RCM_AGGR) { -- DRV_LOG(ERR, "Unrecognize %s: \"%s\"", key, val); -+ DRV_LOG(ERR, "Unrecognized %s: \"%s\"", key, val); - rte_errno = EINVAL; - return -rte_errno; - } -@@ -2177,17 +2177,17 @@ mlx5_set_metadata_mask(struct rte_eth_dev *dev) - break; - } - if (sh->dv_mark_mask && sh->dv_mark_mask != mark) -- DRV_LOG(WARNING, "metadata MARK mask mismatche %08X:%08X", -+ DRV_LOG(WARNING, "metadata MARK mask mismatch %08X:%08X", - sh->dv_mark_mask, mark); - else - sh->dv_mark_mask = mark; - if (sh->dv_meta_mask && sh->dv_meta_mask != meta) -- DRV_LOG(WARNING, "metadata META mask mismatche %08X:%08X", -+ DRV_LOG(WARNING, "metadata META mask mismatch %08X:%08X", - sh->dv_meta_mask, meta); - else - sh->dv_meta_mask = meta; - if (sh->dv_regc0_mask && sh->dv_regc0_mask != reg_c0) -- DRV_LOG(WARNING, "metadata reg_c0 mask mismatche %08X:%08X", -+ DRV_LOG(WARNING, "metadata reg_c0 mask mismatch %08X:%08X", - sh->dv_meta_mask, reg_c0); - else - sh->dv_regc0_mask = reg_c0; -diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h -index 8466531060..b55f5816af 100644 ---- a/drivers/net/mlx5/mlx5.h -+++ b/drivers/net/mlx5/mlx5.h -@@ -977,7 +977,7 @@ struct mlx5_flow_id_pool { - uint32_t base_index; - /**< The next index that can be used without any free elements. */ - uint32_t *curr; /**< Pointer to the index to pop. */ -- uint32_t *last; /**< Pointer to the last element in the empty arrray. */ -+ uint32_t *last; /**< Pointer to the last element in the empty array. */ - uint32_t max_id; /**< Maximum id can be allocated from the pool. */ - }; - -@@ -1014,7 +1014,7 @@ struct mlx5_dev_txpp { - void *pp; /* Packet pacing context. */ - uint16_t pp_id; /* Packet pacing context index. */ - uint16_t ts_n; /* Number of captured timestamps. */ -- uint16_t ts_p; /* Pointer to statisticks timestamp. */ -+ uint16_t ts_p; /* Pointer to statistics timestamp. */ - struct mlx5_txpp_ts *tsa; /* Timestamps sliding window stats. */ - struct mlx5_txpp_ts ts; /* Cached completion id/timestamp. */ - uint32_t sync_lost:1; /* ci/timestamp synchronization lost. */ -@@ -1118,7 +1118,7 @@ struct mlx5_flex_parser_devx { - uint32_t sample_ids[MLX5_GRAPH_NODE_SAMPLE_NUM]; - }; - --/* Pattern field dscriptor - how to translate flex pattern into samples. */ -+/* Pattern field descriptor - how to translate flex pattern into samples. */ - __extension__ - struct mlx5_flex_pattern_field { - uint16_t width:6; -@@ -1169,7 +1169,7 @@ struct mlx5_dev_ctx_shared { - /* Shared DV/DR flow data section. */ - uint32_t dv_meta_mask; /* flow META metadata supported mask. */ - uint32_t dv_mark_mask; /* flow MARK metadata supported mask. */ -- uint32_t dv_regc0_mask; /* available bits of metatada reg_c[0]. */ -+ uint32_t dv_regc0_mask; /* available bits of metadata reg_c[0]. */ - void *fdb_domain; /* FDB Direct Rules name space handle. */ - void *rx_domain; /* RX Direct Rules name space handle. */ - void *tx_domain; /* TX Direct Rules name space handle. */ -diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c -index f34e4b88aa..b7cf4143d5 100644 ---- a/drivers/net/mlx5/mlx5_flow.c -+++ b/drivers/net/mlx5/mlx5_flow.c -@@ -1206,7 +1206,7 @@ flow_rxq_tunnel_ptype_update(struct mlx5_rxq_ctrl *rxq_ctrl) - } - - /** -- * Set the Rx queue flags (Mark/Flag and Tunnel Ptypes) according to the devive -+ * Set the Rx queue flags (Mark/Flag and Tunnel Ptypes) according to the device - * flow. - * - * @param[in] dev -@@ -3008,7 +3008,7 @@ mlx5_flow_validate_item_geneve_opt(const struct rte_flow_item *item, - if ((uint32_t)spec->option_len > MLX5_GENEVE_OPTLEN_MASK) - return rte_flow_error_set - (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, item, -- "Geneve TLV opt length exceeeds the limit (31)"); -+ "Geneve TLV opt length exceeds the limit (31)"); - /* Check if class type and length masks are full. */ - if (full_mask.option_class != mask->option_class || - full_mask.option_type != mask->option_type || -@@ -3957,7 +3957,7 @@ find_graph_root(uint32_t rss_level) - * subflow. - * - * @param[in] dev_flow -- * Pointer the created preifx subflow. -+ * Pointer the created prefix subflow. - * - * @return - * The layers get from prefix subflow. -@@ -4284,7 +4284,7 @@ flow_dv_mreg_create_cb(void *tool_ctx, void *cb_ctx) - [3] = { .type = RTE_FLOW_ACTION_TYPE_END, }, - }; - -- /* Fill the register fileds in the flow. */ -+ /* Fill the register fields in the flow. */ - ret = mlx5_flow_get_reg_id(dev, MLX5_FLOW_MARK, 0, error); - if (ret < 0) - return NULL; -@@ -4353,7 +4353,7 @@ flow_dv_mreg_create_cb(void *tool_ctx, void *cb_ctx) - /* - * The copy Flows are not included in any list. There - * ones are referenced from other Flows and can not -- * be applied, removed, deleted in ardbitrary order -+ * be applied, removed, deleted in arbitrary order - * by list traversing. - */ - mcp_res->rix_flow = flow_list_create(dev, MLX5_FLOW_TYPE_MCP, -@@ -4810,7 +4810,7 @@ flow_create_split_inner(struct rte_eth_dev *dev, - /* - * If dev_flow is as one of the suffix flow, some actions in suffix - * flow may need some user defined item layer flags, and pass the -- * Metadate rxq mark flag to suffix flow as well. -+ * Metadata rxq mark flag to suffix flow as well. - */ - if (flow_split_info->prefix_layers) - dev_flow->handle->layers = flow_split_info->prefix_layers; -@@ -5359,7 +5359,7 @@ flow_mreg_split_qrss_prep(struct rte_eth_dev *dev, - * @param[out] error - * Perform verbose error reporting if not NULL. - * @param[in] encap_idx -- * The encap action inndex. -+ * The encap action index. - * - * @return - * 0 on success, negative value otherwise -@@ -6884,7 +6884,7 @@ flow_list_destroy(struct rte_eth_dev *dev, enum mlx5_flow_type type, - * @param type - * Flow type to be flushed. - * @param active -- * If flushing is called avtively. -+ * If flushing is called actively. - */ - void - mlx5_flow_list_flush(struct rte_eth_dev *dev, enum mlx5_flow_type type, -@@ -8531,7 +8531,7 @@ mlx5_flow_dev_dump_sh_all(struct rte_eth_dev *dev, - * Perform verbose error reporting if not NULL. PMDs initialize this - * structure in case of error only. - * @return -- * 0 on success, a nagative value otherwise. -+ * 0 on success, a negative value otherwise. - */ - int - mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow_idx, -@@ -9009,7 +9009,7 @@ mlx5_get_tof(const struct rte_flow_item *item, - } - - /** -- * tunnel offload functionalilty is defined for DV environment only -+ * tunnel offload functionality is defined for DV environment only - */ - #ifdef HAVE_IBV_FLOW_DV_SUPPORT - __extension__ -diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h -index 1f54649c69..8c131d61ae 100644 ---- a/drivers/net/mlx5/mlx5_flow.h -+++ b/drivers/net/mlx5/mlx5_flow.h -@@ -598,7 +598,7 @@ struct mlx5_flow_tbl_data_entry { - const struct mlx5_flow_tunnel *tunnel; - uint32_t group_id; - uint32_t external:1; -- uint32_t tunnel_offload:1; /* Tunnel offlod table or not. */ -+ uint32_t tunnel_offload:1; /* Tunnel offload table or not. */ - uint32_t is_egress:1; /**< Egress table. */ - uint32_t is_transfer:1; /**< Transfer table. */ - uint32_t dummy:1; /**< DR table. */ -@@ -696,8 +696,8 @@ struct mlx5_flow_handle { - /**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */ - void *drv_flow; /**< pointer to driver flow object. */ - uint32_t split_flow_id:27; /**< Sub flow unique match flow id. */ -- uint32_t is_meter_flow_id:1; /**< Indate if flow_id is for meter. */ -- uint32_t mark:1; /**< Metadate rxq mark flag. */ -+ uint32_t is_meter_flow_id:1; /**< Indicate if flow_id is for meter. */ -+ uint32_t mark:1; /**< Metadata rxq mark flag. */ - uint32_t fate_action:3; /**< Fate action type. */ - uint32_t flex_item; /**< referenced Flex Item bitmask. */ - union { -diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c -index 3da122cbb9..8022d7d11f 100644 ---- a/drivers/net/mlx5/mlx5_flow_dv.c -+++ b/drivers/net/mlx5/mlx5_flow_dv.c -@@ -2032,7 +2032,7 @@ flow_dv_validate_item_meta(struct rte_eth_dev *dev __rte_unused, - if (reg == REG_NON) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ITEM, item, -- "unavalable extended metadata register"); -+ "unavailable extended metadata register"); - if (reg == REG_B) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ITEM, item, -@@ -3205,7 +3205,7 @@ flow_dv_validate_action_set_meta(struct rte_eth_dev *dev, - if (reg == REG_NON) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION, action, -- "unavalable extended metadata register"); -+ "unavailable extended metadata register"); - if (reg != REG_A && reg != REG_B) { - struct mlx5_priv *priv = dev->data->dev_private; - -@@ -5145,7 +5145,7 @@ flow_dv_modify_hdr_action_max(struct rte_eth_dev *dev __rte_unused, - * Pointer to error structure. - * - * @return -- * 0 on success, a negative errno value otherwise and rte_ernno is set. -+ * 0 on success, a negative errno value otherwise and rte_errno is set. - */ - static int - mlx5_flow_validate_action_meter(struct rte_eth_dev *dev, -@@ -7858,7 +7858,7 @@ flow_dv_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - * - Explicit decap action is prohibited by the tunnel offload API. - * - Drop action in tunnel steer rule is prohibited by the API. - * - Application cannot use MARK action because it's value can mask -- * tunnel default miss nitification. -+ * tunnel default miss notification. - * - JUMP in tunnel match rule has no support in current PMD - * implementation. - * - TAG & META are reserved for future uses. -@@ -9184,7 +9184,7 @@ flow_dev_geneve_tlv_option_resource_register(struct rte_eth_dev *dev, - geneve_opt_v->option_type && - geneve_opt_resource->length == - geneve_opt_v->option_len) { -- /* We already have GENVE TLV option obj allocated. */ -+ /* We already have GENEVE TLV option obj allocated. */ - __atomic_fetch_add(&geneve_opt_resource->refcnt, 1, - __ATOMIC_RELAXED); - } else { -@@ -10226,7 +10226,7 @@ __flow_dv_adjust_buf_size(size_t *size, uint8_t match_criteria) - * Check flow matching criteria first, subtract misc5/4 length if flow - * doesn't own misc5/4 parameters. In some old rdma-core releases, - * misc5/4 are not supported, and matcher creation failure is expected -- * w/o subtration. If misc5 is provided, misc4 must be counted in since -+ * w/o subtraction. If misc5 is provided, misc4 must be counted in since - * misc5 is right after misc4. - */ - if (!(match_criteria & (1 << MLX5_MATCH_CRITERIA_ENABLE_MISC5_BIT))) { -@@ -11425,7 +11425,7 @@ flow_dv_dest_array_create_cb(void *tool_ctx __rte_unused, void *cb_ctx) - goto error; - } - } -- /* create a dest array actioin */ -+ /* create a dest array action */ - ret = mlx5_os_flow_dr_create_flow_action_dest_array - (domain, - resource->num_of_dest, -diff --git a/drivers/net/mlx5/mlx5_flow_flex.c b/drivers/net/mlx5/mlx5_flow_flex.c -index 64867dc9e2..9413d4d817 100644 ---- a/drivers/net/mlx5/mlx5_flow_flex.c -+++ b/drivers/net/mlx5/mlx5_flow_flex.c -@@ -205,7 +205,7 @@ mlx5_flex_set_match_sample(void *misc4_m, void *misc4_v, - * @param dev - * Ethernet device to translate flex item on. - * @param[in, out] matcher -- * Flow matcher to confgiure -+ * Flow matcher to configure - * @param[in, out] key - * Flow matcher value. - * @param[in] item -@@ -457,7 +457,7 @@ mlx5_flex_translate_length(struct mlx5_hca_flex_attr *attr, - if (field->offset_shift > 15 || field->offset_shift < 0) - return rte_flow_error_set - (error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, NULL, -- "header length field shift exceeeds limit"); -+ "header length field shift exceeds limit"); - node->header_length_field_shift = field->offset_shift; - node->header_length_field_offset = field->offset_base; - } -diff --git a/drivers/net/mlx5/mlx5_flow_meter.c b/drivers/net/mlx5/mlx5_flow_meter.c -index f4a7b697e6..0e4e6ac3d5 100644 ---- a/drivers/net/mlx5/mlx5_flow_meter.c -+++ b/drivers/net/mlx5/mlx5_flow_meter.c -@@ -251,7 +251,7 @@ mlx5_flow_meter_xir_man_exp_calc(int64_t xir, uint8_t *man, uint8_t *exp) - uint8_t _exp = 0; - uint64_t m, e; - -- /* Special case xir == 0 ? both exp and matissa are 0. */ -+ /* Special case xir == 0 ? both exp and mantissa are 0. */ - if (xir == 0) { - *man = 0; - *exp = 0; -@@ -287,7 +287,7 @@ mlx5_flow_meter_xbs_man_exp_calc(uint64_t xbs, uint8_t *man, uint8_t *exp) - int _exp; - double _man; - -- /* Special case xbs == 0 ? both exp and matissa are 0. */ -+ /* Special case xbs == 0 ? both exp and mantissa are 0. */ - if (xbs == 0) { - *man = 0; - *exp = 0; -@@ -305,7 +305,7 @@ mlx5_flow_meter_xbs_man_exp_calc(uint64_t xbs, uint8_t *man, uint8_t *exp) - * Fill the prm meter parameter. - * - * @param[in,out] fmp -- * Pointer to meter profie to be converted. -+ * Pointer to meter profile to be converted. - * @param[out] error - * Pointer to the error structure. - * -@@ -1101,7 +1101,7 @@ mlx5_flow_meter_action_modify(struct mlx5_priv *priv, - if (ret) - return ret; - } -- /* Update succeedded modify meter parameters. */ -+ /* Update succeeded modify meter parameters. */ - if (modify_bits & MLX5_FLOW_METER_OBJ_MODIFY_FIELD_ACTIVE) - fm->active_state = !!active_state; - } -@@ -1615,7 +1615,7 @@ mlx5_flow_meter_profile_update(struct rte_eth_dev *dev, - return -rte_mtr_error_set(error, -ret, - RTE_MTR_ERROR_TYPE_MTR_PARAMS, - NULL, "Failed to update meter" -- " parmeters in hardware."); -+ " parameters in hardware."); - } - old_fmp->ref_cnt--; - fmp->ref_cnt++; -diff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c -index cc98cd1ea5..11214f6c41 100644 ---- a/drivers/net/mlx5/mlx5_rx.c -+++ b/drivers/net/mlx5/mlx5_rx.c -@@ -178,7 +178,7 @@ mlx5_rxq_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id, - * Pointer to the device structure. - * - * @param rx_queue_id -- * Rx queue identificatior. -+ * Rx queue identification. - * - * @param mode - * Pointer to the burts mode information. -diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c -index f77d42dedf..be5f4da1e5 100644 ---- a/drivers/net/mlx5/mlx5_rxq.c -+++ b/drivers/net/mlx5/mlx5_rxq.c -@@ -2152,7 +2152,7 @@ mlx5_rxq_get_hairpin_conf(struct rte_eth_dev *dev, uint16_t idx) - * Number of queues in the array. - * - * @return -- * 1 if all queues in indirection table match 0 othrwise. -+ * 1 if all queues in indirection table match 0 otherwise. - */ - static int - mlx5_ind_table_obj_match_queues(const struct mlx5_ind_table_obj *ind_tbl, -@@ -2586,7 +2586,7 @@ mlx5_hrxq_modify(struct rte_eth_dev *dev, uint32_t hrxq_idx, - if (hrxq->standalone) { - /* - * Replacement of indirection table unsupported for -- * stanalone hrxq objects (used by shared RSS). -+ * standalone hrxq objects (used by shared RSS). - */ - rte_errno = ENOTSUP; - return -rte_errno; -diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h -index 423e229508..f6e434c165 100644 ---- a/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h -+++ b/drivers/net/mlx5/mlx5_rxtx_vec_altivec.h -@@ -1230,7 +1230,7 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq, - uint32_t mask = rxq->flow_meta_port_mask; - uint32_t metadata; - -- /* This code is subject for futher optimization. */ -+ /* This code is subject for further optimization. */ - metadata = rte_be_to_cpu_32 - (cq[pos].flow_table_metadata) & mask; - *RTE_MBUF_DYNFIELD(pkts[pos], offs, uint32_t *) = -diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h -index b1d16baa61..f7bbde4e0e 100644 ---- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h -+++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h -@@ -839,7 +839,7 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq, - } - } - if (rxq->dynf_meta) { -- /* This code is subject for futher optimization. */ -+ /* This code is subject for further optimization. */ - int32_t offs = rxq->flow_meta_offset; - uint32_t mask = rxq->flow_meta_port_mask; - -diff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h -index f3d838389e..185d2695db 100644 ---- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h -+++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h -@@ -772,7 +772,7 @@ rxq_cq_process_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq, - } - } - if (rxq->dynf_meta) { -- /* This code is subject for futher optimization. */ -+ /* This code is subject for further optimization. */ - int32_t offs = rxq->flow_meta_offset; - uint32_t mask = rxq->flow_meta_port_mask; - -diff --git a/drivers/net/mlx5/mlx5_tx.c b/drivers/net/mlx5/mlx5_tx.c -index 5492d64cae..fd2cf20967 100644 ---- a/drivers/net/mlx5/mlx5_tx.c -+++ b/drivers/net/mlx5/mlx5_tx.c -@@ -728,7 +728,7 @@ mlx5_txq_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id, - * Pointer to the device structure. - * - * @param tx_queue_id -- * Tx queue identificatior. -+ * Tx queue identification. - * - * @param mode - * Pointer to the burts mode information. -diff --git a/drivers/net/mlx5/mlx5_utils.h b/drivers/net/mlx5/mlx5_utils.h -index cf3db89403..e2dcbafc0a 100644 ---- a/drivers/net/mlx5/mlx5_utils.h -+++ b/drivers/net/mlx5/mlx5_utils.h -@@ -55,7 +55,7 @@ extern int mlx5_logtype; - - /* - * For the case which data is linked with sequence increased index, the -- * array table will be more efficiect than hash table once need to serarch -+ * array table will be more efficient than hash table once need to search - * one data entry in large numbers of entries. Since the traditional hash - * tables has fixed table size, when huge numbers of data saved to the hash - * table, it also comes lots of hash conflict. -diff --git a/drivers/net/mlx5/windows/mlx5_flow_os.c b/drivers/net/mlx5/windows/mlx5_flow_os.c -index c4d5790726..7bb4c4590a 100644 ---- a/drivers/net/mlx5/windows/mlx5_flow_os.c -+++ b/drivers/net/mlx5/windows/mlx5_flow_os.c -@@ -400,7 +400,7 @@ mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data) - /* - * set_specific_workspace when current value is NULL - * can happen only once per thread, mark this thread in -- * linked list to be able to release reasorces later on. -+ * linked list to be able to release resources later on. - */ - err = mlx5_add_workspace_to_list(data); - if (err) { -diff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c -index dec4b923d0..f143724990 100644 ---- a/drivers/net/mlx5/windows/mlx5_os.c -+++ b/drivers/net/mlx5/windows/mlx5_os.c -@@ -226,7 +226,7 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv) - * Pointer to RQ channel object, which includes the channel fd - * - * @param[out] fd -- * The file descriptor (representing the intetrrupt) used in this channel. -+ * The file descriptor (representing the interrupt) used in this channel. - * - * @return - * 0 on successfully setting the fd to non-blocking, non-zero otherwise. -diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c -index 10fe6d828c..eef016aa0b 100644 ---- a/drivers/net/mvneta/mvneta_ethdev.c -+++ b/drivers/net/mvneta/mvneta_ethdev.c -@@ -247,7 +247,7 @@ mvneta_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) - (mru + MRVL_NETA_PKT_OFFS > mbuf_data_size)) { - mru = mbuf_data_size - MRVL_NETA_PKT_OFFS; - mtu = MRVL_NETA_MRU_TO_MTU(mru); -- MVNETA_LOG(WARNING, "MTU too big, max MTU possible limitted by" -+ MVNETA_LOG(WARNING, "MTU too big, max MTU possible limited by" - " current mbuf size: %u. Set MTU to %u, MRU to %u", - mbuf_data_size, mtu, mru); - } -diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c -index 2a8fb6cbce..735efb6cfc 100644 ---- a/drivers/net/mvpp2/mrvl_ethdev.c -+++ b/drivers/net/mvpp2/mrvl_ethdev.c -@@ -579,7 +579,7 @@ mrvl_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) - if (mru - RTE_ETHER_CRC_LEN + MRVL_PKT_OFFS > mbuf_data_size) { - mru = mbuf_data_size + RTE_ETHER_CRC_LEN - MRVL_PKT_OFFS; - mtu = MRVL_PP2_MRU_TO_MTU(mru); -- MRVL_LOG(WARNING, "MTU too big, max MTU possible limitted " -+ MRVL_LOG(WARNING, "MTU too big, max MTU possible limited " - "by current mbuf size: %u. Set MTU to %u, MRU to %u", - mbuf_data_size, mtu, mru); - } -diff --git a/drivers/net/mvpp2/mrvl_qos.c b/drivers/net/mvpp2/mrvl_qos.c -index dbfc3b5d20..99f0ee56d1 100644 ---- a/drivers/net/mvpp2/mrvl_qos.c -+++ b/drivers/net/mvpp2/mrvl_qos.c -@@ -301,7 +301,7 @@ get_entry_values(const char *entry, uint8_t *tab, - } - - /** -- * Parse Traffic Class'es mapping configuration. -+ * Parse Traffic Classes mapping configuration. - * - * @param file Config file handle. - * @param port Which port to look for. -@@ -736,7 +736,7 @@ mrvl_get_cfg(const char *key __rte_unused, const char *path, void *extra_args) - - /* MRVL_TOK_START_HDR replaces MRVL_TOK_DSA_MODE parameter. - * MRVL_TOK_DSA_MODE will be supported for backward -- * compatibillity. -+ * compatibility. - */ - entry = rte_cfgfile_get_entry(file, sec_name, - MRVL_TOK_START_HDR); -diff --git a/drivers/net/netvsc/hn_nvs.c b/drivers/net/netvsc/hn_nvs.c -index 89dbba6cd9..a29ac18ff4 100644 ---- a/drivers/net/netvsc/hn_nvs.c -+++ b/drivers/net/netvsc/hn_nvs.c -@@ -229,7 +229,7 @@ hn_nvs_conn_rxbuf(struct hn_data *hv) - hv->rxbuf_section_cnt = resp.nvs_sect[0].slotcnt; - - /* -- * Pimary queue's rxbuf_info is not allocated at creation time. -+ * Primary queue's rxbuf_info is not allocated at creation time. - * Now we can allocate it after we figure out the slotcnt. - */ - hv->primary->rxbuf_info = rte_calloc("HN_RXBUF_INFO", -diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c -index 028f176c7e..50ca1710ef 100644 ---- a/drivers/net/netvsc/hn_rxtx.c -+++ b/drivers/net/netvsc/hn_rxtx.c -@@ -578,7 +578,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, - rte_iova_t iova; - - /* -- * Build an external mbuf that points to recveive area. -+ * Build an external mbuf that points to receive area. - * Use refcount to handle multiple packets in same - * receive buffer section. - */ -@@ -1031,7 +1031,7 @@ hn_dev_rx_queue_count(void *rx_queue) - * returns: - * - -EINVAL - offset outside of ring - * - RTE_ETH_RX_DESC_AVAIL - no data available yet -- * - RTE_ETH_RX_DESC_DONE - data is waiting in stagin ring -+ * - RTE_ETH_RX_DESC_DONE - data is waiting in staging ring - */ - int hn_dev_rx_queue_status(void *arg, uint16_t offset) - { -diff --git a/drivers/net/netvsc/hn_vf.c b/drivers/net/netvsc/hn_vf.c -index fead8eba5d..ebb9c60147 100644 ---- a/drivers/net/netvsc/hn_vf.c -+++ b/drivers/net/netvsc/hn_vf.c -@@ -103,7 +103,7 @@ static void hn_remove_delayed(void *args) - struct rte_device *dev = rte_eth_devices[port_id].device; - int ret; - -- /* Tell VSP to switch data path to synthentic */ -+ /* Tell VSP to switch data path to synthetic */ - hn_vf_remove(hv); - - PMD_DRV_LOG(NOTICE, "Start to remove port %d", port_id); -diff --git a/drivers/net/nfp/nfpcore/nfp-common/nfp_resid.h b/drivers/net/nfp/nfpcore/nfp-common/nfp_resid.h -index 0e03948ec7..394a7628e0 100644 ---- a/drivers/net/nfp/nfpcore/nfp-common/nfp_resid.h -+++ b/drivers/net/nfp/nfpcore/nfp-common/nfp_resid.h -@@ -63,7 +63,7 @@ - * Wildcard indicating a CPP read or write action - * - * The action used will be either read or write depending on whether a read or -- * write instruction/call is performed on the NFP_CPP_ID. It is recomended that -+ * write instruction/call is performed on the NFP_CPP_ID. It is recommended that - * the RW action is used even if all actions to be performed on a NFP_CPP_ID are - * known to be only reads or writes. Doing so will in many cases save NFP CPP - * internal software resources. -@@ -405,7 +405,7 @@ int nfp_idstr2meid(int chip_family, const char *s, const char **endptr); - * @param chip_family Chip family ID - * @param s A string of format "iX.anything" or "iX" - * @param endptr If non-NULL, *endptr will point to the trailing -- * striong after the ME ID part of the string, which -+ * string after the ME ID part of the string, which - * is either an empty string or the first character - * after the separating period. - * @return The island ID on succes, -1 on error. -@@ -425,7 +425,7 @@ int nfp_idstr2island(int chip_family, const char *s, const char **endptr); - * @param chip_family Chip family ID - * @param s A string of format "meX.anything" or "meX" - * @param endptr If non-NULL, *endptr will point to the trailing -- * striong after the ME ID part of the string, which -+ * string after the ME ID part of the string, which - * is either an empty string or the first character - * after the separating period. - * @return The ME number on succes, -1 on error. -diff --git a/drivers/net/nfp/nfpcore/nfp_cppcore.c b/drivers/net/nfp/nfpcore/nfp_cppcore.c -index f91049383e..37799af558 100644 ---- a/drivers/net/nfp/nfpcore/nfp_cppcore.c -+++ b/drivers/net/nfp/nfpcore/nfp_cppcore.c -@@ -202,7 +202,7 @@ nfp_cpp_area_alloc(struct nfp_cpp *cpp, uint32_t dest, - * @address: start address on CPP target - * @size: size of area - * -- * Allocate and initilizae a CPP area structure, and lock it down so -+ * Allocate and initialize a CPP area structure, and lock it down so - * that it can be accessed directly. - * - * NOTE: @address and @size must be 32-bit aligned values. -diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h -index c9c7b0d0fb..e74cdeb191 100644 ---- a/drivers/net/nfp/nfpcore/nfp_nsp.h -+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h -@@ -272,7 +272,7 @@ int __nfp_eth_set_split(struct nfp_nsp *nsp, unsigned int lanes); - * @br_primary: branch id of primary bootloader - * @br_secondary: branch id of secondary bootloader - * @br_nsp: branch id of NSP -- * @primary: version of primarary bootloader -+ * @primary: version of primary bootloader - * @secondary: version id of secondary bootloader - * @nsp: version id of NSP - * @sensor_mask: mask of present sensors available on NIC -diff --git a/drivers/net/nfp/nfpcore/nfp_resource.c b/drivers/net/nfp/nfpcore/nfp_resource.c -index dd41fa4de4..7b5630fd86 100644 ---- a/drivers/net/nfp/nfpcore/nfp_resource.c -+++ b/drivers/net/nfp/nfpcore/nfp_resource.c -@@ -207,7 +207,7 @@ nfp_resource_acquire(struct nfp_cpp *cpp, const char *name) - * nfp_resource_release() - Release a NFP Resource handle - * @res: NFP Resource handle - * -- * NOTE: This function implictly unlocks the resource handle -+ * NOTE: This function implicitly unlocks the resource handle - */ - void - nfp_resource_release(struct nfp_resource *res) -diff --git a/drivers/net/nfp/nfpcore/nfp_rtsym.c b/drivers/net/nfp/nfpcore/nfp_rtsym.c -index cb7d83db51..2feca2ed81 100644 ---- a/drivers/net/nfp/nfpcore/nfp_rtsym.c -+++ b/drivers/net/nfp/nfpcore/nfp_rtsym.c -@@ -236,7 +236,7 @@ nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name) - * nfp_rtsym_read_le() - Read a simple unsigned scalar value from symbol - * @rtbl: NFP RTsym table - * @name: Symbol name -- * @error: Poniter to error code (optional) -+ * @error: Pointer to error code (optional) - * - * Lookup a symbol, map, read it and return it's value. Value of the symbol - * will be interpreted as a simple little-endian unsigned value. Symbol can -diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c -index 981592f7f4..0d66c32551 100644 ---- a/drivers/net/ngbe/ngbe_ethdev.c -+++ b/drivers/net/ngbe/ngbe_ethdev.c -@@ -983,7 +983,7 @@ ngbe_dev_start(struct rte_eth_dev *dev) - } - } - -- /* confiugre MSI-X for sleep until Rx interrupt */ -+ /* configure MSI-X for sleep until Rx interrupt */ - ngbe_configure_msix(dev); - - /* initialize transmission unit */ -@@ -2641,7 +2641,7 @@ ngbe_set_ivar_map(struct ngbe_hw *hw, int8_t direction, - wr32(hw, NGBE_IVARMISC, tmp); - } else { - /* rx or tx causes */ -- /* Workround for ICR lost */ -+ /* Workaround for ICR lost */ - idx = ((16 * (queue & 1)) + (8 * direction)); - tmp = rd32(hw, NGBE_IVAR(queue >> 1)); - tmp &= ~(0xFF << idx); -@@ -2893,7 +2893,7 @@ ngbe_timesync_disable(struct rte_eth_dev *dev) - /* Disable L2 filtering of IEEE1588/802.1AS Ethernet frame types. */ - wr32(hw, NGBE_ETFLT(NGBE_ETF_ID_1588), 0); - -- /* Stop incrementating the System Time registers. */ -+ /* Stop incrementing the System Time registers. */ - wr32(hw, NGBE_TSTIMEINC, 0); - - return 0; -diff --git a/drivers/net/ngbe/ngbe_pf.c b/drivers/net/ngbe/ngbe_pf.c -index 7f9c04fb0e..12a18de31d 100644 ---- a/drivers/net/ngbe/ngbe_pf.c -+++ b/drivers/net/ngbe/ngbe_pf.c -@@ -163,7 +163,7 @@ int ngbe_pf_host_configure(struct rte_eth_dev *eth_dev) - - wr32(hw, NGBE_PSRCTL, NGBE_PSRCTL_LBENA); - -- /* clear VMDq map to perment rar 0 */ -+ /* clear VMDq map to permanent rar 0 */ - hw->mac.clear_vmdq(hw, 0, BIT_MASK32); - - /* clear VMDq map to scan rar 31 */ -diff --git a/drivers/net/octeontx/octeontx_ethdev.c b/drivers/net/octeontx/octeontx_ethdev.c -index 4f1e368c61..b47472ebbd 100644 ---- a/drivers/net/octeontx/octeontx_ethdev.c -+++ b/drivers/net/octeontx/octeontx_ethdev.c -@@ -1090,7 +1090,7 @@ octeontx_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qidx, - - /* Verify queue index */ - if (qidx >= dev->data->nb_rx_queues) { -- octeontx_log_err("QID %d not supporteded (0 - %d available)\n", -+ octeontx_log_err("QID %d not supported (0 - %d available)\n", - qidx, (dev->data->nb_rx_queues - 1)); - return -ENOTSUP; - } -diff --git a/drivers/net/octeontx2/otx2_ethdev_irq.c b/drivers/net/octeontx2/otx2_ethdev_irq.c -index cc573bb2e8..f56d5b2a38 100644 ---- a/drivers/net/octeontx2/otx2_ethdev_irq.c -+++ b/drivers/net/octeontx2/otx2_ethdev_irq.c -@@ -369,7 +369,7 @@ oxt2_nix_register_cq_irqs(struct rte_eth_dev *eth_dev) - "rc=%d", rc); - return rc; - } -- /* VFIO vector zero is resereved for misc interrupt so -+ /* VFIO vector zero is reserved for misc interrupt so - * doing required adjustment. (b13bfab4cd) - */ - if (rte_intr_vec_list_index_set(handle, q, -diff --git a/drivers/net/octeontx2/otx2_ptp.c b/drivers/net/octeontx2/otx2_ptp.c -index abb2130587..974018f97e 100644 ---- a/drivers/net/octeontx2/otx2_ptp.c -+++ b/drivers/net/octeontx2/otx2_ptp.c -@@ -440,7 +440,7 @@ otx2_nix_read_clock(struct rte_eth_dev *eth_dev, uint64_t *clock) - /* This API returns the raw PTP HI clock value. Since LFs doesn't - * have direct access to PTP registers and it requires mbox msg - * to AF for this value. In fastpath reading this value for every -- * packet (which involes mbox call) becomes very expensive, hence -+ * packet (which involves mbox call) becomes very expensive, hence - * we should be able to derive PTP HI clock value from tsc by - * using freq_mult and clk_delta calculated during configure stage. - */ -diff --git a/drivers/net/octeontx2/otx2_tx.h b/drivers/net/octeontx2/otx2_tx.h -index 4bbd5a390f..a2fb7ce3cb 100644 ---- a/drivers/net/octeontx2/otx2_tx.h -+++ b/drivers/net/octeontx2/otx2_tx.h -@@ -61,7 +61,7 @@ otx2_nix_xmit_prepare_tstamp(uint64_t *cmd, const uint64_t *send_mem_desc, - /* Retrieving the default desc values */ - cmd[off] = send_mem_desc[6]; - -- /* Using compiler barier to avoid voilation of C -+ /* Using compiler barrier to avoid violation of C - * aliasing rules. - */ - rte_compiler_barrier(); -@@ -70,7 +70,7 @@ otx2_nix_xmit_prepare_tstamp(uint64_t *cmd, const uint64_t *send_mem_desc, - /* Packets for which RTE_MBUF_F_TX_IEEE1588_TMST is not set, tx tstamp - * should not be recorded, hence changing the alg type to - * NIX_SENDMEMALG_SET and also changing send mem addr field to -- * next 8 bytes as it corrpt the actual tx tstamp registered -+ * next 8 bytes as it corrupts the actual tx tstamp registered - * address. - */ - send_mem->alg = NIX_SENDMEMALG_SETTSTMP - (is_ol_tstamp); -diff --git a/drivers/net/octeontx2/otx2_vlan.c b/drivers/net/octeontx2/otx2_vlan.c -index cce643b7b5..359680de5c 100644 ---- a/drivers/net/octeontx2/otx2_vlan.c -+++ b/drivers/net/octeontx2/otx2_vlan.c -@@ -953,7 +953,7 @@ static void nix_vlan_reinstall_vlan_filters(struct rte_eth_dev *eth_dev) - struct vlan_entry *entry; - int rc; - -- /* VLAN filters can't be set without setting filtern on */ -+ /* VLAN filters can't be set without setting filters on */ - rc = nix_vlan_handle_default_rx_entry(eth_dev, false, true, true); - if (rc) { - otx2_err("Failed to reinstall vlan filters"); -diff --git a/drivers/net/octeontx_ep/otx2_ep_vf.c b/drivers/net/octeontx_ep/otx2_ep_vf.c -index 0716beb9b1..85e14a998f 100644 ---- a/drivers/net/octeontx_ep/otx2_ep_vf.c -+++ b/drivers/net/octeontx_ep/otx2_ep_vf.c -@@ -104,7 +104,7 @@ otx2_vf_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no) - iq->inst_cnt_reg = (uint8_t *)otx_ep->hw_addr + - SDP_VF_R_IN_CNTS(iq_no); - -- otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p instcnt_reg @ 0x%p", -+ otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p inst_cnt_reg @ 0x%p", - iq_no, iq->doorbell_reg, iq->inst_cnt_reg); - - do { -diff --git a/drivers/net/octeontx_ep/otx_ep_vf.c b/drivers/net/octeontx_ep/otx_ep_vf.c -index c9b91fef9e..96366b2a7f 100644 ---- a/drivers/net/octeontx_ep/otx_ep_vf.c -+++ b/drivers/net/octeontx_ep/otx_ep_vf.c -@@ -117,7 +117,7 @@ otx_ep_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no) - iq->inst_cnt_reg = (uint8_t *)otx_ep->hw_addr + - OTX_EP_R_IN_CNTS(iq_no); - -- otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p instcnt_reg @ 0x%p\n", -+ otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p inst_cnt_reg @ 0x%p\n", - iq_no, iq->doorbell_reg, iq->inst_cnt_reg); - - do { -diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c -index 047010e15e..ebb5d1ae0e 100644 ---- a/drivers/net/pfe/pfe_ethdev.c -+++ b/drivers/net/pfe/pfe_ethdev.c -@@ -769,7 +769,7 @@ pfe_eth_init(struct rte_vdev_device *vdev, struct pfe *pfe, int id) - if (eth_dev == NULL) - return -ENOMEM; - -- /* Extract pltform data */ -+ /* Extract platform data */ - pfe_info = (struct ls1012a_pfe_platform_data *)&pfe->platform_data; - if (!pfe_info) { - PFE_PMD_ERR("pfe missing additional platform data"); -diff --git a/drivers/net/pfe/pfe_hal.c b/drivers/net/pfe/pfe_hal.c -index 41d783dbff..6431dec47e 100644 ---- a/drivers/net/pfe/pfe_hal.c -+++ b/drivers/net/pfe/pfe_hal.c -@@ -187,7 +187,7 @@ gemac_set_mode(void *base, __rte_unused int mode) - { - u32 val = readl(base + EMAC_RCNTRL_REG); - -- /*Remove loopbank*/ -+ /* Remove loopback */ - val &= ~EMAC_RCNTRL_LOOP; - - /*Enable flow control and MII mode*/ -diff --git a/drivers/net/pfe/pfe_hif.c b/drivers/net/pfe/pfe_hif.c -index c4a7154ba7..69b1d0edde 100644 ---- a/drivers/net/pfe/pfe_hif.c -+++ b/drivers/net/pfe/pfe_hif.c -@@ -114,9 +114,9 @@ pfe_hif_init_buffers(struct pfe_hif *hif) - * results, eth id, queue id from PFE block along with data. - * so we have to provide additional memory for each packet to - * HIF rx rings so that PFE block can write its headers. -- * so, we are giving the data pointor to HIF rings whose -+ * so, we are giving the data pointer to HIF rings whose - * calculation is as below: -- * mbuf->data_pointor - Required_header_size -+ * mbuf->data_pointer - Required_header_size - * - * We are utilizing the HEADROOM area to receive the PFE - * block headers. On packet reception, HIF driver will use -diff --git a/drivers/net/pfe/pfe_hif.h b/drivers/net/pfe/pfe_hif.h -index 6aaf904bb1..e8d5ba10e1 100644 ---- a/drivers/net/pfe/pfe_hif.h -+++ b/drivers/net/pfe/pfe_hif.h -@@ -8,7 +8,7 @@ - #define HIF_CLIENT_QUEUES_MAX 16 - #define HIF_RX_PKT_MIN_SIZE RTE_CACHE_LINE_SIZE - /* -- * HIF_TX_DESC_NT value should be always greter than 4, -+ * HIF_TX_DESC_NT value should be always greater than 4, - * Otherwise HIF_TX_POLL_MARK will become zero. - */ - #define HIF_RX_DESC_NT 64 -diff --git a/drivers/net/pfe/pfe_hif_lib.c b/drivers/net/pfe/pfe_hif_lib.c -index 799050dce3..6fe6d33d23 100644 ---- a/drivers/net/pfe/pfe_hif_lib.c -+++ b/drivers/net/pfe/pfe_hif_lib.c -@@ -38,7 +38,7 @@ pfe_hif_shm_clean(struct hif_shm *hif_shm) - * This function should be called before initializing HIF driver. - * - * @param[in] hif_shm Shared memory address location in DDR -- * @rerurn 0 - on succes, <0 on fail to initialize -+ * @return 0 - on succes, <0 on fail to initialize - */ - int - pfe_hif_shm_init(struct hif_shm *hif_shm, struct rte_mempool *mb_pool) -@@ -109,9 +109,9 @@ hif_lib_client_release_rx_buffers(struct hif_client_s *client) - for (ii = 0; ii < client->rx_q[qno].size; ii++) { - buf = (void *)desc->data; - if (buf) { -- /* Data pointor to mbuf pointor calculation: -+ /* Data pointer to mbuf pointer calculation: - * "Data - User private data - headroom - mbufsize" -- * Actual data pointor given to HIF BDs was -+ * Actual data pointer given to HIF BDs was - * "mbuf->data_offset - PFE_PKT_HEADER_SZ" - */ - buf = buf + PFE_PKT_HEADER_SZ -@@ -477,7 +477,7 @@ hif_hdr_write(struct hif_hdr *pkt_hdr, unsigned int - client_id, unsigned int qno, - u32 client_ctrl) - { -- /* Optimize the write since the destinaton may be non-cacheable */ -+ /* Optimize the write since the destination may be non-cacheable */ - if (!((unsigned long)pkt_hdr & 0x3)) { - ((u32 *)pkt_hdr)[0] = (client_ctrl << 16) | (qno << 8) | - client_id; -diff --git a/drivers/net/qede/qede_debug.c b/drivers/net/qede/qede_debug.c -index 2297d245c4..af86bcc692 100644 ---- a/drivers/net/qede/qede_debug.c -+++ b/drivers/net/qede/qede_debug.c -@@ -5983,7 +5983,7 @@ static char *qed_get_buf_ptr(void *buf, u32 offset) - /* Reads a param from the specified buffer. Returns the number of dwords read. - * If the returned str_param is NULL, the param is numeric and its value is - * returned in num_param. -- * Otheriwise, the param is a string and its pointer is returned in str_param. -+ * Otherwise, the param is a string and its pointer is returned in str_param. - */ - static u32 qed_read_param(u32 *dump_buf, - const char **param_name, -@@ -7558,7 +7558,7 @@ static enum dbg_status format_feature(struct ecore_hwfn *p_hwfn, - text_buf[i] = '\n'; - - -- /* Free the old dump_buf and point the dump_buf to the newly allocagted -+ /* Free the old dump_buf and point the dump_buf to the newly allocated - * and formatted text buffer. - */ - OSAL_VFREE(p_hwfn, feature->dump_buf); -diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c -index 3e9aaeecd3..a1122a297e 100644 ---- a/drivers/net/qede/qede_ethdev.c -+++ b/drivers/net/qede/qede_ethdev.c -@@ -2338,7 +2338,7 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) - if (fp->rxq != NULL) { - bufsz = (uint16_t)rte_pktmbuf_data_room_size( - fp->rxq->mb_pool) - RTE_PKTMBUF_HEADROOM; -- /* cache align the mbuf size to simplfy rx_buf_size -+ /* cache align the mbuf size to simplify rx_buf_size - * calculation - */ - bufsz = QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz); -diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c -index c0eeea896e..7088c57b50 100644 ---- a/drivers/net/qede/qede_rxtx.c -+++ b/drivers/net/qede/qede_rxtx.c -@@ -90,7 +90,7 @@ static inline int qede_alloc_rx_bulk_mbufs(struct qede_rx_queue *rxq, int count) - * (MTU + Maximum L2 Header Size + 2) / ETH_RX_MAX_BUFF_PER_PKT - * 3) In regular mode - minimum rx_buf_size should be - * (MTU + Maximum L2 Header Size + 2) -- * In above cases +2 corrosponds to 2 bytes padding in front of L2 -+ * In above cases +2 corresponds to 2 bytes padding in front of L2 - * header. - * 4) rx_buf_size should be cacheline-size aligned. So considering - * criteria 1, we need to adjust the size to floor instead of ceil, -@@ -106,7 +106,7 @@ qede_calc_rx_buf_size(struct rte_eth_dev *dev, uint16_t mbufsz, - - if (dev->data->scattered_rx) { - /* per HW limitation, only ETH_RX_MAX_BUFF_PER_PKT number of -- * bufferes can be used for single packet. So need to make sure -+ * buffers can be used for single packet. So need to make sure - * mbuf size is sufficient enough for this. - */ - if ((mbufsz * ETH_RX_MAX_BUFF_PER_PKT) < -@@ -247,7 +247,7 @@ qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t qid, - - /* Fix up RX buffer size */ - bufsz = (uint16_t)rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM; -- /* cache align the mbuf size to simplfy rx_buf_size calculation */ -+ /* cache align the mbuf size to simplify rx_buf_size calculation */ - bufsz = QEDE_FLOOR_TO_CACHE_LINE_SIZE(bufsz); - if ((rxmode->offloads & RTE_ETH_RX_OFFLOAD_SCATTER) || - (max_rx_pktlen + QEDE_ETH_OVERHEAD) > bufsz) { -@@ -1745,7 +1745,7 @@ qede_recv_pkts_regular(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) - } - } - -- /* Request number of bufferes to be allocated in next loop */ -+ /* Request number of buffers to be allocated in next loop */ - rxq->rx_alloc_count = rx_alloc_count; - - rxq->rcv_pkts += rx_pkt; -@@ -2042,7 +2042,7 @@ qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) - } - } - -- /* Request number of bufferes to be allocated in next loop */ -+ /* Request number of buffers to be allocated in next loop */ - rxq->rx_alloc_count = rx_alloc_count; - - rxq->rcv_pkts += rx_pkt; -@@ -2506,7 +2506,7 @@ qede_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - /* Inner L2 header size in two byte words */ - inner_l2_hdr_size = (mbuf->l2_len - - MPLSINUDP_HDR_SIZE) / 2; -- /* Inner L4 header offset from the beggining -+ /* Inner L4 header offset from the beginning - * of inner packet in two byte words - */ - inner_l4_hdr_offset = (mbuf->l2_len - -diff --git a/drivers/net/qede/qede_rxtx.h b/drivers/net/qede/qede_rxtx.h -index 754efe793f..11ed1d9b9c 100644 ---- a/drivers/net/qede/qede_rxtx.h -+++ b/drivers/net/qede/qede_rxtx.h -@@ -225,7 +225,7 @@ struct qede_fastpath { - struct qede_tx_queue *txq; - }; - --/* This structure holds the inforation of fast path queues -+/* This structure holds the information of fast path queues - * belonging to individual engines in CMT mode. - */ - struct qede_fastpath_cmt { -diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c -index ed714fe02f..2cead4e045 100644 ---- a/drivers/net/sfc/sfc.c -+++ b/drivers/net/sfc/sfc.c -@@ -371,7 +371,7 @@ sfc_set_drv_limits(struct sfc_adapter *sa) - - /* - * Limits are strict since take into account initial estimation. -- * Resource allocation stategy is described in -+ * Resource allocation strategy is described in - * sfc_estimate_resource_limits(). - */ - lim.edl_min_evq_count = lim.edl_max_evq_count = -diff --git a/drivers/net/sfc/sfc_dp.c b/drivers/net/sfc/sfc_dp.c -index d4cd162541..da2d1603cf 100644 ---- a/drivers/net/sfc/sfc_dp.c -+++ b/drivers/net/sfc/sfc_dp.c -@@ -68,7 +68,7 @@ sfc_dp_register(struct sfc_dp_list *head, struct sfc_dp *entry) - { - if (sfc_dp_find_by_name(head, entry->type, entry->name) != NULL) { - SFC_GENERIC_LOG(ERR, -- "sfc %s dapapath '%s' already registered", -+ "sfc %s datapath '%s' already registered", - entry->type == SFC_DP_RX ? "Rx" : - entry->type == SFC_DP_TX ? "Tx" : - "unknown", -diff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h -index 760540ba22..246adbd87c 100644 ---- a/drivers/net/sfc/sfc_dp_rx.h -+++ b/drivers/net/sfc/sfc_dp_rx.h -@@ -158,7 +158,7 @@ typedef int (sfc_dp_rx_qcreate_t)(uint16_t port_id, uint16_t queue_id, - struct sfc_dp_rxq **dp_rxqp); - - /** -- * Free resources allocated for datapath recevie queue. -+ * Free resources allocated for datapath receive queue. - */ - typedef void (sfc_dp_rx_qdestroy_t)(struct sfc_dp_rxq *dp_rxq); - -@@ -191,7 +191,7 @@ typedef bool (sfc_dp_rx_qrx_ps_ev_t)(struct sfc_dp_rxq *dp_rxq, - /** - * Receive queue purge function called after queue flush. - * -- * Should be used to free unused recevie buffers. -+ * Should be used to free unused receive buffers. - */ - typedef void (sfc_dp_rx_qpurge_t)(struct sfc_dp_rxq *dp_rxq); - -diff --git a/drivers/net/sfc/sfc_ef100.h b/drivers/net/sfc/sfc_ef100.h -index 5e2052d142..e81847e75a 100644 ---- a/drivers/net/sfc/sfc_ef100.h -+++ b/drivers/net/sfc/sfc_ef100.h -@@ -19,7 +19,7 @@ extern "C" { - * - * @param evq_prime Global address of the prime register - * @param evq_hw_index Event queue index -- * @param evq_read_ptr Masked event qeueu read pointer -+ * @param evq_read_ptr Masked event queue read pointer - */ - static inline void - sfc_ef100_evq_prime(volatile void *evq_prime, unsigned int evq_hw_index, -diff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c -index 5d16bf281d..45253ed7dc 100644 ---- a/drivers/net/sfc/sfc_ef100_rx.c -+++ b/drivers/net/sfc/sfc_ef100_rx.c -@@ -851,7 +851,7 @@ sfc_ef100_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr, - unsup_rx_prefix_fields = - efx_rx_prefix_layout_check(pinfo, &sfc_ef100_rx_prefix_layout); - -- /* LENGTH and CLASS filds must always be present */ -+ /* LENGTH and CLASS fields must always be present */ - if ((unsup_rx_prefix_fields & - ((1U << EFX_RX_PREFIX_FIELD_LENGTH) | - (1U << EFX_RX_PREFIX_FIELD_CLASS))) != 0) -diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c -index 712c207617..78bd430363 100644 ---- a/drivers/net/sfc/sfc_ef10_essb_rx.c -+++ b/drivers/net/sfc/sfc_ef10_essb_rx.c -@@ -630,7 +630,7 @@ sfc_ef10_essb_rx_qcreate(uint16_t port_id, uint16_t queue_id, - rxq->block_size, rxq->buf_stride); - sfc_ef10_essb_rx_info(&rxq->dp.dpq, - "max fill level is %u descs (%u bufs), " -- "refill threashold %u descs (%u bufs)", -+ "refill threshold %u descs (%u bufs)", - rxq->max_fill_level, - rxq->max_fill_level * rxq->block_size, - rxq->refill_threshold, -diff --git a/drivers/net/sfc/sfc_ef10_rx_ev.h b/drivers/net/sfc/sfc_ef10_rx_ev.h -index 821e2227bb..412254e3d7 100644 ---- a/drivers/net/sfc/sfc_ef10_rx_ev.h -+++ b/drivers/net/sfc/sfc_ef10_rx_ev.h -@@ -40,7 +40,7 @@ sfc_ef10_rx_ev_to_offloads(const efx_qword_t rx_ev, struct rte_mbuf *m, - rte_cpu_to_le_64((1ull << ESF_DZ_RX_ECC_ERR_LBN) | - (1ull << ESF_DZ_RX_ECRC_ERR_LBN) | - (1ull << ESF_DZ_RX_PARSE_INCOMPLETE_LBN)))) { -- /* Zero packet type is used as a marker to dicard bad packets */ -+ /* Zero packet type is used as a marker to discard bad packets */ - goto done; - } - -diff --git a/drivers/net/sfc/sfc_intr.c b/drivers/net/sfc/sfc_intr.c -index ab67aa9237..ddddefad7b 100644 ---- a/drivers/net/sfc/sfc_intr.c -+++ b/drivers/net/sfc/sfc_intr.c -@@ -8,7 +8,7 @@ - */ - - /* -- * At the momemt of writing DPDK v16.07 has notion of two types of -+ * At the moment of writing DPDK v16.07 has notion of two types of - * interrupts: LSC (link status change) and RXQ (receive indication). - * It allows to register interrupt callback for entire device which is - * not intended to be used for receive indication (i.e. link status -diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c -index 7104284106..cd58d60a36 100644 ---- a/drivers/net/sfc/sfc_rx.c -+++ b/drivers/net/sfc/sfc_rx.c -@@ -1057,7 +1057,7 @@ sfc_rx_mb_pool_buf_size(struct sfc_adapter *sa, struct rte_mempool *mb_pool) - /* Make sure that end padding does not write beyond the buffer */ - if (buf_aligned < nic_align_end) { - /* -- * Estimate space which can be lost. If guarnteed buffer -+ * Estimate space which can be lost. If guaranteed buffer - * size is odd, lost space is (nic_align_end - 1). More - * accurate formula is below. - */ -@@ -1702,7 +1702,7 @@ sfc_rx_fini_queues(struct sfc_adapter *sa, unsigned int nb_rx_queues) - - /* - * Finalize only ethdev queues since other ones are finalized only -- * on device close and they may require additional deinitializaton. -+ * on device close and they may require additional deinitialization. - */ - ethdev_qid = sas->ethdev_rxq_count; - while (--ethdev_qid >= (int)nb_rx_queues) { -@@ -1775,7 +1775,7 @@ sfc_rx_configure(struct sfc_adapter *sa) - - reconfigure = true; - -- /* Do not ununitialize reserved queues */ -+ /* Do not uninitialize reserved queues */ - if (nb_rx_queues < sas->ethdev_rxq_count) - sfc_rx_fini_queues(sa, nb_rx_queues); - -diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c -index 0dccf21f7c..cd927cf2f7 100644 ---- a/drivers/net/sfc/sfc_tx.c -+++ b/drivers/net/sfc/sfc_tx.c -@@ -356,7 +356,7 @@ sfc_tx_fini_queues(struct sfc_adapter *sa, unsigned int nb_tx_queues) - - /* - * Finalize only ethdev queues since other ones are finalized only -- * on device close and they may require additional deinitializaton. -+ * on device close and they may require additional deinitialization. - */ - ethdev_qid = sas->ethdev_txq_count; - while (--ethdev_qid >= (int)nb_tx_queues) { -diff --git a/drivers/net/softnic/rte_eth_softnic_flow.c b/drivers/net/softnic/rte_eth_softnic_flow.c -index ca70eab678..ad96288e7e 100644 ---- a/drivers/net/softnic/rte_eth_softnic_flow.c -+++ b/drivers/net/softnic/rte_eth_softnic_flow.c -@@ -930,7 +930,7 @@ flow_rule_match_acl_get(struct pmd_internals *softnic __rte_unused, - * Both *tmask* and *fmask* are byte arrays of size *tsize* and *fsize* - * respectively. - * They are located within a larger buffer at offsets *toffset* and *foffset* -- * respectivelly. Both *tmask* and *fmask* represent bitmasks for the larger -+ * respectively. Both *tmask* and *fmask* represent bitmasks for the larger - * buffer. - * Question: are the two masks equivalent? - * -diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c -index ddca630574..6567e5891b 100644 ---- a/drivers/net/tap/rte_eth_tap.c -+++ b/drivers/net/tap/rte_eth_tap.c -@@ -525,7 +525,7 @@ tap_tx_l4_cksum(uint16_t *l4_cksum, uint16_t l4_phdr_cksum, - } - } - --/* Accumaulate L4 raw checksums */ -+/* Accumulate L4 raw checksums */ - static void - tap_tx_l4_add_rcksum(char *l4_data, unsigned int l4_len, uint16_t *l4_cksum, - uint32_t *l4_raw_cksum) -diff --git a/drivers/net/tap/tap_bpf_api.c b/drivers/net/tap/tap_bpf_api.c -index 98f6a76011..15283f8917 100644 ---- a/drivers/net/tap/tap_bpf_api.c -+++ b/drivers/net/tap/tap_bpf_api.c -@@ -96,7 +96,7 @@ static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, - * Load BPF instructions to kernel - * - * @param[in] type -- * BPF program type: classifieir or action -+ * BPF program type: classifier or action - * - * @param[in] insns - * Array of BPF instructions (equivalent to BPF instructions) -@@ -104,7 +104,7 @@ static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, - * @param[in] insns_cnt - * Number of BPF instructions (size of array) - * -- * @param[in] lincense -+ * @param[in] license - * License string that must be acknowledged by the kernel - * - * @return -diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c -index c4f60ce98e..7673823945 100644 ---- a/drivers/net/tap/tap_flow.c -+++ b/drivers/net/tap/tap_flow.c -@@ -961,7 +961,7 @@ add_action(struct rte_flow *flow, size_t *act_index, struct action_data *adata) - } - - /** -- * Helper function to send a serie of TC actions to the kernel -+ * Helper function to send a series of TC actions to the kernel - * - * @param[in] flow - * Pointer to rte flow containing the netlink message -@@ -2017,7 +2017,7 @@ static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx) - break; - - /* -- * Subtract offest to restore real key index -+ * Subtract offset to restore real key index - * If a non RSS flow is falsely trying to release map - * entry 0 - the offset subtraction will calculate the real - * map index as an out-of-range value and the release operation -diff --git a/drivers/net/thunderx/nicvf_svf.c b/drivers/net/thunderx/nicvf_svf.c -index bccf290599..1bcf73d9fc 100644 ---- a/drivers/net/thunderx/nicvf_svf.c -+++ b/drivers/net/thunderx/nicvf_svf.c -@@ -21,7 +21,7 @@ nicvf_svf_push(struct nicvf *vf) - - entry = rte_zmalloc("nicvf", sizeof(*entry), RTE_CACHE_LINE_SIZE); - if (entry == NULL) -- rte_panic("Cannoc allocate memory for svf_entry\n"); -+ rte_panic("Cannot allocate memory for svf_entry\n"); - - entry->vf = vf; - -diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c -index 47d0e6ea40..ac4d4e08f4 100644 ---- a/drivers/net/txgbe/txgbe_ethdev.c -+++ b/drivers/net/txgbe/txgbe_ethdev.c -@@ -1678,7 +1678,7 @@ txgbe_dev_start(struct rte_eth_dev *dev) - return -ENOMEM; - } - } -- /* confiugre msix for sleep until rx interrupt */ -+ /* configure msix for sleep until rx interrupt */ - txgbe_configure_msix(dev); - - /* initialize transmission unit */ -@@ -3682,7 +3682,7 @@ txgbe_set_ivar_map(struct txgbe_hw *hw, int8_t direction, - wr32(hw, TXGBE_IVARMISC, tmp); - } else { - /* rx or tx causes */ -- /* Workround for ICR lost */ -+ /* Workaround for ICR lost */ - idx = ((16 * (queue & 1)) + (8 * direction)); - tmp = rd32(hw, TXGBE_IVAR(queue >> 1)); - tmp &= ~(0xFF << idx); -@@ -4387,7 +4387,7 @@ txgbe_timesync_disable(struct rte_eth_dev *dev) - /* Disable L2 filtering of IEEE1588/802.1AS Ethernet frame types. */ - wr32(hw, TXGBE_ETFLT(TXGBE_ETF_ID_1588), 0); - -- /* Stop incrementating the System Time registers. */ -+ /* Stop incrementing the System Time registers. */ - wr32(hw, TXGBE_TSTIMEINC, 0); - - return 0; -diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c -index 84b960b8f9..f52cd8bc19 100644 ---- a/drivers/net/txgbe/txgbe_ethdev_vf.c -+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c -@@ -961,7 +961,7 @@ txgbevf_set_ivar_map(struct txgbe_hw *hw, int8_t direction, - wr32(hw, TXGBE_VFIVARMISC, tmp); - } else { - /* rx or tx cause */ -- /* Workround for ICR lost */ -+ /* Workaround for ICR lost */ - idx = ((16 * (queue & 1)) + (8 * direction)); - tmp = rd32(hw, TXGBE_VFIVAR(queue >> 1)); - tmp &= ~(0xFF << idx); -@@ -997,7 +997,7 @@ txgbevf_configure_msix(struct rte_eth_dev *dev) - /* Configure all RX queues of VF */ - for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) { - /* Force all queue use vector 0, -- * as TXGBE_VF_MAXMSIVECOTR = 1 -+ * as TXGBE_VF_MAXMSIVECTOR = 1 - */ - txgbevf_set_ivar_map(hw, 0, q_idx, vector_idx); - rte_intr_vec_list_index_set(intr_handle, q_idx, -@@ -1288,7 +1288,7 @@ txgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev) - - /* only one misc vector supported - mailbox */ - eicr &= TXGBE_VFICR_MASK; -- /* Workround for ICR lost */ -+ /* Workaround for ICR lost */ - intr->flags |= TXGBE_FLAG_MAILBOX; - - /* To avoid compiler warnings set eicr to used. */ -diff --git a/drivers/net/txgbe/txgbe_ipsec.c b/drivers/net/txgbe/txgbe_ipsec.c -index 445733f3ba..3ca3d85ed5 100644 ---- a/drivers/net/txgbe/txgbe_ipsec.c -+++ b/drivers/net/txgbe/txgbe_ipsec.c -@@ -288,7 +288,7 @@ txgbe_crypto_remove_sa(struct rte_eth_dev *dev, - return -1; - } - -- /* Disable and clear Rx SPI and key table entryes*/ -+ /* Disable and clear Rx SPI and key table entries */ - reg_val = TXGBE_IPSRXIDX_WRITE | - TXGBE_IPSRXIDX_TB_SPI | (sa_index << 3); - wr32(hw, TXGBE_IPSRXSPI, 0); -diff --git a/drivers/net/txgbe/txgbe_pf.c b/drivers/net/txgbe/txgbe_pf.c -index 30be287330..67d92bfa56 100644 ---- a/drivers/net/txgbe/txgbe_pf.c -+++ b/drivers/net/txgbe/txgbe_pf.c -@@ -236,7 +236,7 @@ int txgbe_pf_host_configure(struct rte_eth_dev *eth_dev) - - wr32(hw, TXGBE_PSRCTL, TXGBE_PSRCTL_LBENA); - -- /* clear VMDq map to perment rar 0 */ -+ /* clear VMDq map to permanent rar 0 */ - hw->mac.clear_vmdq(hw, 0, BIT_MASK32); - - /* clear VMDq map to scan rar 127 */ -diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c -index c2588369b2..b317649d7e 100644 ---- a/drivers/net/virtio/virtio_ethdev.c -+++ b/drivers/net/virtio/virtio_ethdev.c -@@ -2657,7 +2657,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) - hw->has_rx_offload = rx_offload_enabled(hw); - - if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) -- /* Enable vector (0) for Link State Intrerrupt */ -+ /* Enable vector (0) for Link State Interrupt */ - if (VIRTIO_OPS(hw)->set_config_irq(hw, 0) == - VIRTIO_MSI_NO_VECTOR) { - PMD_DRV_LOG(ERR, "failed to set config vector"); -@@ -2775,7 +2775,7 @@ virtio_dev_start(struct rte_eth_dev *dev) - } - } - -- /* Enable uio/vfio intr/eventfd mapping: althrough we already did that -+ /* Enable uio/vfio intr/eventfd mapping: although we already did that - * in device configure, but it could be unmapped when device is - * stopped. - */ -diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c -index 182cfc9eae..632451dcbe 100644 ---- a/drivers/net/virtio/virtio_pci.c -+++ b/drivers/net/virtio/virtio_pci.c -@@ -235,7 +235,7 @@ legacy_get_isr(struct virtio_hw *hw) - return dst; - } - --/* Enable one vector (0) for Link State Intrerrupt */ -+/* Enable one vector (0) for Link State Interrupt */ - static uint16_t - legacy_set_config_irq(struct virtio_hw *hw, uint16_t vec) - { -diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c -index 2e115ded02..b39dd92d1b 100644 ---- a/drivers/net/virtio/virtio_rxtx.c -+++ b/drivers/net/virtio/virtio_rxtx.c -@@ -962,7 +962,7 @@ virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr) - return -EINVAL; - } - -- /* Update mss lengthes in mbuf */ -+ /* Update mss lengths in mbuf */ - m->tso_segsz = hdr->gso_size; - switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { - case VIRTIO_NET_HDR_GSO_TCPV4: -diff --git a/drivers/net/virtio/virtio_rxtx_packed_avx.h b/drivers/net/virtio/virtio_rxtx_packed_avx.h -index 8cb71f3fe6..584ac72f95 100644 ---- a/drivers/net/virtio/virtio_rxtx_packed_avx.h -+++ b/drivers/net/virtio/virtio_rxtx_packed_avx.h -@@ -192,7 +192,7 @@ virtqueue_dequeue_batch_packed_vec(struct virtnet_rx *rxvq, - - /* - * load len from desc, store into mbuf pkt_len and data_len -- * len limiated by l6bit buf_len, pkt_len[16:31] can be ignored -+ * len limited by l6bit buf_len, pkt_len[16:31] can be ignored - */ - const __mmask16 mask = 0x6 | 0x6 << 4 | 0x6 << 8 | 0x6 << 12; - __m512i values = _mm512_maskz_shuffle_epi32(mask, v_desc, 0xAA); -diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c -index 65bf792eb0..c98d696e62 100644 ---- a/drivers/net/virtio/virtqueue.c -+++ b/drivers/net/virtio/virtqueue.c -@@ -13,7 +13,7 @@ - /* - * Two types of mbuf to be cleaned: - * 1) mbuf that has been consumed by backend but not used by virtio. -- * 2) mbuf that hasn't been consued by backend. -+ * 2) mbuf that hasn't been consumed by backend. - */ - struct rte_mbuf * - virtqueue_detach_unused(struct virtqueue *vq) -diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h -index 855f57a956..99c68cf622 100644 ---- a/drivers/net/virtio/virtqueue.h -+++ b/drivers/net/virtio/virtqueue.h -@@ -227,7 +227,7 @@ struct virtio_net_ctrl_rss { - * Control link announce acknowledgement - * - * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that -- * driver has recevied the notification; device would clear the -+ * driver has received the notification; device would clear the - * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives - * this command. - */ -@@ -312,7 +312,7 @@ struct virtqueue { - struct vq_desc_extra vq_descx[0]; - }; - --/* If multiqueue is provided by host, then we suppport it. */ -+/* If multiqueue is provided by host, then we support it. */ - #define VIRTIO_NET_CTRL_MQ 4 - - #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0 -diff --git a/drivers/raw/dpaa2_qdma/dpaa2_qdma.c b/drivers/raw/dpaa2_qdma/dpaa2_qdma.c -index de26d2aef3..ebc2cd5d0d 100644 ---- a/drivers/raw/dpaa2_qdma/dpaa2_qdma.c -+++ b/drivers/raw/dpaa2_qdma/dpaa2_qdma.c -@@ -653,7 +653,7 @@ dpdmai_dev_dequeue_multijob_prefetch( - rte_prefetch0((void *)(size_t)(dq_storage + 1)); - - /* Prepare next pull descriptor. This will give space for the -- * prefething done on DQRR entries -+ * prefetching done on DQRR entries - */ - q_storage->toggle ^= 1; - dq_storage1 = q_storage->dq_storage[q_storage->toggle]; -diff --git a/drivers/raw/dpaa2_qdma/dpaa2_qdma.h b/drivers/raw/dpaa2_qdma/dpaa2_qdma.h -index d6f6bb5522..1973d5d2b2 100644 ---- a/drivers/raw/dpaa2_qdma/dpaa2_qdma.h -+++ b/drivers/raw/dpaa2_qdma/dpaa2_qdma.h -@@ -82,7 +82,7 @@ struct qdma_device { - /** total number of hw queues. */ - uint16_t num_hw_queues; - /** -- * Maximum number of hw queues to be alocated per core. -+ * Maximum number of hw queues to be allocated per core. - * This is limited by MAX_HW_QUEUE_PER_CORE - */ - uint16_t max_hw_queues_per_core; -@@ -268,7 +268,7 @@ struct dpaa2_dpdmai_dev { - struct fsl_mc_io dpdmai; - /** HW ID for DPDMAI object */ - uint32_t dpdmai_id; -- /** Tocken of this device */ -+ /** Token of this device */ - uint16_t token; - /** Number of queue in this DPDMAI device */ - uint8_t num_queues; -diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c -index 8d9db585a4..0eae0c9477 100644 ---- a/drivers/raw/ifpga/ifpga_rawdev.c -+++ b/drivers/raw/ifpga/ifpga_rawdev.c -@@ -382,7 +382,7 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev, - - if (HIGH_WARN(sensor, value) || - LOW_WARN(sensor, value)) { -- IFPGA_RAWDEV_PMD_INFO("%s reach theshold %d\n", -+ IFPGA_RAWDEV_PMD_INFO("%s reach threshold %d\n", - sensor->name, value); - *gsd_start = true; - break; -@@ -393,7 +393,7 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev, - if (!strcmp(sensor->name, "12V AUX Voltage")) { - if (value < AUX_VOLTAGE_WARN) { - IFPGA_RAWDEV_PMD_INFO( -- "%s reach theshold %d mV\n", -+ "%s reach threshold %d mV\n", - sensor->name, value); - *gsd_start = true; - break; -@@ -441,12 +441,12 @@ static int set_surprise_link_check_aer( - pos = ifpga_pci_find_ext_capability(fd, RTE_PCI_EXT_CAP_ID_ERR); - if (!pos) - goto end; -- /* save previout ECAP_AER+0x08 */ -+ /* save previous ECAP_AER+0x08 */ - ret = pread(fd, &data, sizeof(data), pos+0x08); - if (ret == -1) - goto end; - ifpga_rdev->aer_old[0] = data; -- /* save previout ECAP_AER+0x14 */ -+ /* save previous ECAP_AER+0x14 */ - ret = pread(fd, &data, sizeof(data), pos+0x14); - if (ret == -1) - goto end; -@@ -531,7 +531,7 @@ ifpga_monitor_start_func(void) - ifpga_rawdev_gsd_handle, NULL); - if (ret != 0) { - IFPGA_RAWDEV_PMD_ERR( -- "Fail to create ifpga nonitor thread"); -+ "Fail to create ifpga monitor thread"); - return -1; - } - ifpga_monitor_start = 1; -diff --git a/drivers/raw/ntb/ntb.h b/drivers/raw/ntb/ntb.h -index cdf7667d5d..c9ff33aa59 100644 ---- a/drivers/raw/ntb/ntb.h -+++ b/drivers/raw/ntb/ntb.h -@@ -95,7 +95,7 @@ enum ntb_spad_idx { - * @spad_write: Write val to local/peer spad register. - * @db_read: Read doorbells status. - * @db_clear: Clear local doorbells. -- * @db_set_mask: Set bits in db mask, preventing db interrpts generated -+ * @db_set_mask: Set bits in db mask, preventing db interrupts generated - * for those db bits. - * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit. - * @vector_bind: Bind vector source [intr] to msix vector [msix]. -diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_mem.c b/drivers/vdpa/mlx5/mlx5_vdpa_mem.c -index b1b9053bff..130d201a85 100644 ---- a/drivers/vdpa/mlx5/mlx5_vdpa_mem.c -+++ b/drivers/vdpa/mlx5/mlx5_vdpa_mem.c -@@ -160,7 +160,7 @@ mlx5_vdpa_vhost_mem_regions_prepare(int vid, uint8_t *mode, uint64_t *mem_size, - * The target here is to group all the physical memory regions of the - * virtio device in one indirect mkey. - * For KLM Fixed Buffer Size mode (HW find the translation entry in one -- * read according to the guest phisical address): -+ * read according to the guest physical address): - * All the sub-direct mkeys of it must be in the same size, hence, each - * one of them should be in the GCD size of all the virtio memory - * regions and the holes between them. -diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c -index db971bad48..2f32aef67f 100644 ---- a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c -+++ b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c -@@ -403,7 +403,7 @@ mlx5_vdpa_features_validate(struct mlx5_vdpa_priv *priv) - if (priv->features & (1ULL << VIRTIO_F_RING_PACKED)) { - if (!(priv->caps.virtio_queue_type & (1 << - MLX5_VIRTQ_TYPE_PACKED))) { -- DRV_LOG(ERR, "Failed to configur PACKED mode for vdev " -+ DRV_LOG(ERR, "Failed to configure PACKED mode for vdev " - "%d - it was not reported by HW/driver" - " capability.", priv->vid); - return -ENOTSUP; -diff --git a/examples/bbdev_app/main.c b/examples/bbdev_app/main.c -index ecafc5e4f1..fc7e8b8174 100644 ---- a/examples/bbdev_app/main.c -+++ b/examples/bbdev_app/main.c -@@ -372,7 +372,7 @@ add_awgn(struct rte_mbuf **mbufs, uint16_t num_pkts) - /* Encoder output to Decoder input adapter. The Decoder accepts only soft input - * so each bit of the encoder output must be translated into one byte of LLR. If - * Sub-block Deinterleaver is bypassed, which is the case, the padding bytes -- * must additionally be insterted at the end of each sub-block. -+ * must additionally be inserted at the end of each sub-block. - */ - static inline void - transform_enc_out_dec_in(struct rte_mbuf **mbufs, uint8_t *temp_buf, -diff --git a/examples/bond/main.c b/examples/bond/main.c -index 1087b0dad1..335bde5c8d 100644 ---- a/examples/bond/main.c -+++ b/examples/bond/main.c -@@ -230,7 +230,7 @@ bond_port_init(struct rte_mempool *mbuf_pool) - 0 /*SOCKET_ID_ANY*/); - if (retval < 0) - rte_exit(EXIT_FAILURE, -- "Faled to create bond port\n"); -+ "Failed to create bond port\n"); - - BOND_PORT = retval; - -@@ -405,7 +405,7 @@ static int lcore_main(__rte_unused void *arg1) - struct rte_ether_hdr *); - ether_type = eth_hdr->ether_type; - if (ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN)) -- printf("VLAN taged frame, offset:"); -+ printf("VLAN tagged frame, offset:"); - offset = get_vlan_offset(eth_hdr, ðer_type); - if (offset > 0) - printf("%d\n", offset); -diff --git a/examples/dma/dmafwd.c b/examples/dma/dmafwd.c -index b06042e5fe..9fc46f5255 100644 ---- a/examples/dma/dmafwd.c -+++ b/examples/dma/dmafwd.c -@@ -88,7 +88,7 @@ static uint16_t nb_queues = 1; - /* MAC updating enabled by default. */ - static int mac_updating = 1; - --/* hardare copy mode enabled by default. */ -+/* hardware copy mode enabled by default. */ - static copy_mode_t copy_mode = COPY_MODE_DMA_NUM; - - /* size of descriptor ring for hardware copy mode or -diff --git a/examples/ethtool/lib/rte_ethtool.c b/examples/ethtool/lib/rte_ethtool.c -index 86286d38a6..ffaad96498 100644 ---- a/examples/ethtool/lib/rte_ethtool.c -+++ b/examples/ethtool/lib/rte_ethtool.c -@@ -402,7 +402,7 @@ rte_ethtool_net_set_rx_mode(uint16_t port_id) - #endif - } - -- /* Enable Rx vlan filter, VF unspport status is discard */ -+ /* Enable Rx vlan filter, VF unsupported status is discard */ - ret = rte_eth_dev_set_vlan_offload(port_id, RTE_ETH_VLAN_FILTER_MASK); - if (ret != 0) - return ret; -diff --git a/examples/ethtool/lib/rte_ethtool.h b/examples/ethtool/lib/rte_ethtool.h -index f177096636..d27e0102b1 100644 ---- a/examples/ethtool/lib/rte_ethtool.h -+++ b/examples/ethtool/lib/rte_ethtool.h -@@ -189,7 +189,7 @@ int rte_ethtool_get_module_eeprom(uint16_t port_id, - - /** - * Retrieve the Ethernet device pause frame configuration according to -- * parameter attributes desribed by ethtool data structure, -+ * parameter attributes described by ethtool data structure, - * ethtool_pauseparam. - * - * @param port_id -@@ -209,7 +209,7 @@ int rte_ethtool_get_pauseparam(uint16_t port_id, - - /** - * Setting the Ethernet device pause frame configuration according to -- * parameter attributes desribed by ethtool data structure, ethtool_pauseparam. -+ * parameter attributes described by ethtool data structure, ethtool_pauseparam. - * - * @param port_id - * The port identifier of the Ethernet device. -diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c -index fb3cac3bd0..6e4c11c3c7 100644 ---- a/examples/ip_reassembly/main.c -+++ b/examples/ip_reassembly/main.c -@@ -244,7 +244,7 @@ static struct rte_lpm6 *socket_lpm6[RTE_MAX_NUMA_NODES]; - #endif /* RTE_LIBRTE_IP_FRAG_TBL_STAT */ - - /* -- * If number of queued packets reached given threahold, then -+ * If number of queued packets reached given threshold, then - * send burst of packets on an output interface. - */ - static inline uint32_t -@@ -873,11 +873,11 @@ setup_queue_tbl(struct rx_queue *rxq, uint32_t lcore, uint32_t queue) - - /* - * At any given moment up to -- * mbufs could be stored int the fragment table. -+ * mbufs could be stored in the fragment table. - * Plus, each TX queue can hold up to packets. - */ - -- /* mbufs stored int the gragment table. 8< */ -+ /* mbufs stored in the fragment table. 8< */ - nb_mbuf = RTE_MAX(max_flow_num, 2UL * MAX_PKT_BURST) * MAX_FRAG_NUM; - nb_mbuf *= (port_conf.rxmode.mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN - + BUF_SIZE - 1) / BUF_SIZE; -@@ -895,7 +895,7 @@ setup_queue_tbl(struct rx_queue *rxq, uint32_t lcore, uint32_t queue) - "rte_pktmbuf_pool_create(%s) failed", buf); - return -1; - } -- /* >8 End of mbufs stored int the fragmentation table. */ -+ /* >8 End of mbufs stored in the fragmentation table. */ - - return 0; - } -diff --git a/examples/ipsec-secgw/event_helper.c b/examples/ipsec-secgw/event_helper.c -index e8600f5e90..24b210add4 100644 ---- a/examples/ipsec-secgw/event_helper.c -+++ b/examples/ipsec-secgw/event_helper.c -@@ -1353,7 +1353,7 @@ eh_display_rx_adapter_conf(struct eventmode_conf *em_conf) - for (i = 0; i < nb_rx_adapter; i++) { - adapter = &(em_conf->rx_adapter[i]); - sprintf(print_buf, -- "\tRx adaper ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d", -+ "\tRx adapter ID: %-2d\tConnections: %-2d\tEvent dev ID: %-2d", - adapter->adapter_id, - adapter->nb_connections, - adapter->eventdev_id); -diff --git a/examples/ipsec-secgw/ipsec-secgw.c b/examples/ipsec-secgw/ipsec-secgw.c -index bf3dbf6b5c..96916cd3c5 100644 ---- a/examples/ipsec-secgw/ipsec-secgw.c -+++ b/examples/ipsec-secgw/ipsec-secgw.c -@@ -265,7 +265,7 @@ struct socket_ctx socket_ctx[NB_SOCKETS]; - /* - * Determine is multi-segment support required: - * - either frame buffer size is smaller then mtu -- * - or reassmeble support is requested -+ * - or reassemble support is requested - */ - static int - multi_seg_required(void) -@@ -2050,7 +2050,7 @@ add_mapping(struct rte_hash *map, const char *str, uint16_t cdev_id, - - ret = rte_hash_add_key_data(map, &key, (void *)i); - if (ret < 0) { -- printf("Faled to insert cdev mapping for (lcore %u, " -+ printf("Failed to insert cdev mapping for (lcore %u, " - "cdev %u, qp %u), errno %d\n", - key.lcore_id, ipsec_ctx->tbl[i].id, - ipsec_ctx->tbl[i].qp, ret); -@@ -2083,7 +2083,7 @@ add_cdev_mapping(struct rte_cryptodev_info *dev_info, uint16_t cdev_id, - str = "Inbound"; - } - -- /* Required cryptodevs with operation chainning */ -+ /* Required cryptodevs with operation chaining */ - if (!(dev_info->feature_flags & - RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING)) - return ret; -@@ -2251,7 +2251,7 @@ port_init(uint16_t portid, uint64_t req_rx_offloads, uint64_t req_tx_offloads) - "Error during getting device (port %u) info: %s\n", - portid, strerror(-ret)); - -- /* limit allowed HW offloafs, as user requested */ -+ /* limit allowed HW offloads, as user requested */ - dev_info.rx_offload_capa &= dev_rx_offload; - dev_info.tx_offload_capa &= dev_tx_offload; - -@@ -2298,7 +2298,7 @@ port_init(uint16_t portid, uint64_t req_rx_offloads, uint64_t req_tx_offloads) - local_port_conf.rxmode.offloads) - rte_exit(EXIT_FAILURE, - "Error: port %u required RX offloads: 0x%" PRIx64 -- ", avaialbe RX offloads: 0x%" PRIx64 "\n", -+ ", available RX offloads: 0x%" PRIx64 "\n", - portid, local_port_conf.rxmode.offloads, - dev_info.rx_offload_capa); - -@@ -2306,7 +2306,7 @@ port_init(uint16_t portid, uint64_t req_rx_offloads, uint64_t req_tx_offloads) - local_port_conf.txmode.offloads) - rte_exit(EXIT_FAILURE, - "Error: port %u required TX offloads: 0x%" PRIx64 -- ", avaialbe TX offloads: 0x%" PRIx64 "\n", -+ ", available TX offloads: 0x%" PRIx64 "\n", - portid, local_port_conf.txmode.offloads, - dev_info.tx_offload_capa); - -@@ -2317,7 +2317,7 @@ port_init(uint16_t portid, uint64_t req_rx_offloads, uint64_t req_tx_offloads) - if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) - local_port_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM; - -- printf("port %u configurng rx_offloads=0x%" PRIx64 -+ printf("port %u configuring rx_offloads=0x%" PRIx64 - ", tx_offloads=0x%" PRIx64 "\n", - portid, local_port_conf.rxmode.offloads, - local_port_conf.txmode.offloads); -diff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c -index 30bc693e06..1839ac71af 100644 ---- a/examples/ipsec-secgw/sa.c -+++ b/examples/ipsec-secgw/sa.c -@@ -897,7 +897,7 @@ parse_sa_tokens(char **tokens, uint32_t n_tokens, - continue; - } - -- /* unrecognizeable input */ -+ /* unrecognizable input */ - APP_CHECK(0, status, "unrecognized input \"%s\"", - tokens[ti]); - return; -@@ -1145,7 +1145,7 @@ get_spi_proto(uint32_t spi, enum rte_security_ipsec_sa_direction dir, - if (rc4 >= 0) { - if (rc6 >= 0) { - RTE_LOG(ERR, IPSEC, -- "%s: SPI %u used simultaeously by " -+ "%s: SPI %u used simultaneously by " - "IPv4(%d) and IPv6 (%d) SP rules\n", - __func__, spi, rc4, rc6); - return -EINVAL; -@@ -1550,7 +1550,7 @@ ipsec_sa_init(struct ipsec_sa *lsa, struct rte_ipsec_sa *sa, uint32_t sa_size) - } - - /* -- * Allocate space and init rte_ipsec_sa strcutures, -+ * Allocate space and init rte_ipsec_sa structures, - * one per session. - */ - static int -diff --git a/examples/ipsec-secgw/sp4.c b/examples/ipsec-secgw/sp4.c -index beddd7bc1d..fc4101a4a2 100644 ---- a/examples/ipsec-secgw/sp4.c -+++ b/examples/ipsec-secgw/sp4.c -@@ -410,7 +410,7 @@ parse_sp4_tokens(char **tokens, uint32_t n_tokens, - continue; - } - -- /* unrecognizeable input */ -+ /* unrecognizable input */ - APP_CHECK(0, status, "unrecognized input \"%s\"", - tokens[ti]); - return; -diff --git a/examples/ipsec-secgw/sp6.c b/examples/ipsec-secgw/sp6.c -index 328e085288..cce4da7862 100644 ---- a/examples/ipsec-secgw/sp6.c -+++ b/examples/ipsec-secgw/sp6.c -@@ -515,7 +515,7 @@ parse_sp6_tokens(char **tokens, uint32_t n_tokens, - continue; - } - -- /* unrecognizeable input */ -+ /* unrecognizable input */ - APP_CHECK(0, status, "unrecognized input \"%s\"", - tokens[ti]); - return; -diff --git a/examples/ipsec-secgw/test/common_defs.sh b/examples/ipsec-secgw/test/common_defs.sh -index f22eb3ab12..3ef06bc761 100644 ---- a/examples/ipsec-secgw/test/common_defs.sh -+++ b/examples/ipsec-secgw/test/common_defs.sh -@@ -20,7 +20,7 @@ REMOTE_MAC=`ssh ${REMOTE_HOST} ip addr show dev ${REMOTE_IFACE}` - st=$? - REMOTE_MAC=`echo ${REMOTE_MAC} | sed -e 's/^.*ether //' -e 's/ brd.*$//'` - if [[ $st -ne 0 || -z "${REMOTE_MAC}" ]]; then -- echo "coouldn't retrieve ether addr from ${REMOTE_IFACE}" -+ echo "couldn't retrieve ether addr from ${REMOTE_IFACE}" - exit 127 - fi - -@@ -40,7 +40,7 @@ DPDK_VARS="" - - # by default ipsec-secgw can't deal with multi-segment packets - # make sure our local/remote host wouldn't generate fragmented packets --# if reassmebly option is not enabled -+# if reassembly option is not enabled - DEF_MTU_LEN=1400 - DEF_PING_LEN=1200 - -diff --git a/examples/kni/main.c b/examples/kni/main.c -index d324ee2241..f5b20a7b62 100644 ---- a/examples/kni/main.c -+++ b/examples/kni/main.c -@@ -1039,7 +1039,7 @@ main(int argc, char** argv) - pthread_t kni_link_tid; - int pid; - -- /* Associate signal_hanlder function with USR signals */ -+ /* Associate signal_handler function with USR signals */ - signal(SIGUSR1, signal_handler); - signal(SIGUSR2, signal_handler); - signal(SIGRTMIN, signal_handler); -diff --git a/examples/l2fwd-cat/l2fwd-cat.c b/examples/l2fwd-cat/l2fwd-cat.c -index d9cf00c9df..6e16705e99 100644 ---- a/examples/l2fwd-cat/l2fwd-cat.c -+++ b/examples/l2fwd-cat/l2fwd-cat.c -@@ -157,7 +157,7 @@ main(int argc, char *argv[]) - int ret = rte_eal_init(argc, argv); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); -- /* >8 End of initializion the Environment Abstraction Layer (EAL). */ -+ /* >8 End of initialization the Environment Abstraction Layer (EAL). */ - - argc -= ret; - argv += ret; -diff --git a/examples/l2fwd-event/l2fwd_event_generic.c b/examples/l2fwd-event/l2fwd_event_generic.c -index f31569a744..1977e23261 100644 ---- a/examples/l2fwd-event/l2fwd_event_generic.c -+++ b/examples/l2fwd-event/l2fwd_event_generic.c -@@ -42,7 +42,7 @@ l2fwd_event_device_setup_generic(struct l2fwd_resources *rsrc) - ethdev_count++; - } - -- /* Event device configurtion */ -+ /* Event device configuration */ - rte_event_dev_info_get(event_d_id, &dev_info); - - /* Enable implicit release */ -diff --git a/examples/l2fwd-event/l2fwd_event_internal_port.c b/examples/l2fwd-event/l2fwd_event_internal_port.c -index 86d772d817..717a7bceb8 100644 ---- a/examples/l2fwd-event/l2fwd_event_internal_port.c -+++ b/examples/l2fwd-event/l2fwd_event_internal_port.c -@@ -40,7 +40,7 @@ l2fwd_event_device_setup_internal_port(struct l2fwd_resources *rsrc) - ethdev_count++; - } - -- /* Event device configurtion */ -+ /* Event device configuration */ - rte_event_dev_info_get(event_d_id, &dev_info); - - /* Enable implicit release */ -diff --git a/examples/l2fwd-jobstats/main.c b/examples/l2fwd-jobstats/main.c -index d8eabe4c86..9e71ba2d4e 100644 ---- a/examples/l2fwd-jobstats/main.c -+++ b/examples/l2fwd-jobstats/main.c -@@ -468,7 +468,7 @@ l2fwd_flush_job(__rte_unused struct rte_timer *timer, __rte_unused void *arg) - qconf->next_flush_time[portid] = rte_get_timer_cycles() + drain_tsc; - } - -- /* Pass target to indicate that this job is happy of time interwal -+ /* Pass target to indicate that this job is happy of time interval - * in which it was called. */ - rte_jobstats_finish(&qconf->flush_job, qconf->flush_job.target); - } -diff --git a/examples/l3fwd-acl/main.c b/examples/l3fwd-acl/main.c -index 1fb1807235..2d2ecc7635 100644 ---- a/examples/l3fwd-acl/main.c -+++ b/examples/l3fwd-acl/main.c -@@ -801,8 +801,8 @@ send_packets(struct rte_mbuf **m, uint32_t *res, int num) - } - - /* -- * Parses IPV6 address, exepcts the following format: -- * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X - is a hexedecimal digit). -+ * Parse IPv6 address, expects the following format: -+ * XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX (where X is a hexadecimal digit). - */ - static int - parse_ipv6_addr(const char *in, const char **end, uint32_t v[IPV6_ADDR_U32], -@@ -1959,7 +1959,7 @@ check_all_ports_link_status(uint32_t port_mask) - } - - /* -- * build-up default vaues for dest MACs. -+ * build-up default values for dest MACs. - */ - static void - set_default_dest_mac(void) -diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c -index b8b3be2b8a..20e5b59af9 100644 ---- a/examples/l3fwd-power/main.c -+++ b/examples/l3fwd-power/main.c -@@ -433,7 +433,7 @@ signal_exit_now(int sigtype) - - } - --/* Freqency scale down timer callback */ -+/* Frequency scale down timer callback */ - static void - power_timer_cb(__rte_unused struct rte_timer *tim, - __rte_unused void *arg) -@@ -2358,7 +2358,7 @@ update_telemetry(__rte_unused struct rte_timer *tim, - ret = rte_metrics_update_values(RTE_METRICS_GLOBAL, telstats_index, - values, RTE_DIM(values)); - if (ret < 0) -- RTE_LOG(WARNING, POWER, "failed to update metrcis\n"); -+ RTE_LOG(WARNING, POWER, "failed to update metrics\n"); - } - - static int -diff --git a/examples/l3fwd/l3fwd_common.h b/examples/l3fwd/l3fwd_common.h -index 7d83ff641a..cbaab79f5b 100644 ---- a/examples/l3fwd/l3fwd_common.h -+++ b/examples/l3fwd/l3fwd_common.h -@@ -51,7 +51,7 @@ rfc1812_process(struct rte_ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t ptype) - #endif /* DO_RFC_1812_CHECKS */ - - /* -- * We group consecutive packets with the same destionation port into one burst. -+ * We group consecutive packets with the same destination port into one burst. - * To avoid extra latency this is done together with some other packet - * processing, but after we made a final decision about packet's destination. - * To do this we maintain: -@@ -76,7 +76,7 @@ rfc1812_process(struct rte_ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t ptype) - - static const struct { - uint64_t pnum; /* prebuild 4 values for pnum[]. */ -- int32_t idx; /* index for new last updated elemnet. */ -+ int32_t idx; /* index for new last updated element. */ - uint16_t lpv; /* add value to the last updated element. */ - } gptbl[GRPSZ] = { - { -diff --git a/examples/l3fwd/l3fwd_neon.h b/examples/l3fwd/l3fwd_neon.h -index 86ac5971d7..e3d33a5229 100644 ---- a/examples/l3fwd/l3fwd_neon.h -+++ b/examples/l3fwd/l3fwd_neon.h -@@ -64,7 +64,7 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP]) - - /* - * Group consecutive packets with the same destination port in bursts of 4. -- * Suppose we have array of destionation ports: -+ * Suppose we have array of destination ports: - * dst_port[] = {a, b, c, d,, e, ... } - * dp1 should contain: , dp2: . - * We doing 4 comparisons at once and the result is 4 bit mask. -diff --git a/examples/l3fwd/l3fwd_sse.h b/examples/l3fwd/l3fwd_sse.h -index bb565ed546..d5a717e18c 100644 ---- a/examples/l3fwd/l3fwd_sse.h -+++ b/examples/l3fwd/l3fwd_sse.h -@@ -64,7 +64,7 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP]) - - /* - * Group consecutive packets with the same destination port in bursts of 4. -- * Suppose we have array of destionation ports: -+ * Suppose we have array of destination ports: - * dst_port[] = {a, b, c, d,, e, ... } - * dp1 should contain: , dp2: . - * We doing 4 comparisons at once and the result is 4 bit mask. -diff --git a/examples/multi_process/hotplug_mp/commands.c b/examples/multi_process/hotplug_mp/commands.c -index 48fd329583..41ea265e45 100644 ---- a/examples/multi_process/hotplug_mp/commands.c -+++ b/examples/multi_process/hotplug_mp/commands.c -@@ -175,7 +175,7 @@ static void cmd_dev_detach_parsed(void *parsed_result, - cmdline_printf(cl, "detached device %s\n", - da.name); - else -- cmdline_printf(cl, "failed to dettach device %s\n", -+ cmdline_printf(cl, "failed to detach device %s\n", - da.name); - rte_devargs_reset(&da); - } -diff --git a/examples/multi_process/simple_mp/main.c b/examples/multi_process/simple_mp/main.c -index 5df2a39000..9d5f1088b0 100644 ---- a/examples/multi_process/simple_mp/main.c -+++ b/examples/multi_process/simple_mp/main.c -@@ -4,7 +4,7 @@ - - /* - * This sample application is a simple multi-process application which -- * demostrates sharing of queues and memory pools between processes, and -+ * demonstrates sharing of queues and memory pools between processes, and - * using those queues/pools for communication between the processes. - * - * Application is designed to run with two processes, a primary and a -diff --git a/examples/multi_process/symmetric_mp/main.c b/examples/multi_process/symmetric_mp/main.c -index b35886a77b..050337765f 100644 ---- a/examples/multi_process/symmetric_mp/main.c -+++ b/examples/multi_process/symmetric_mp/main.c -@@ -3,7 +3,7 @@ - */ - - /* -- * Sample application demostrating how to do packet I/O in a multi-process -+ * Sample application demonstrating how to do packet I/O in a multi-process - * environment. The same code can be run as a primary process and as a - * secondary process, just with a different proc-id parameter in each case - * (apart from the EAL flag to indicate a secondary process). -diff --git a/examples/ntb/ntb_fwd.c b/examples/ntb/ntb_fwd.c -index f110fc129f..81964d0308 100644 ---- a/examples/ntb/ntb_fwd.c -+++ b/examples/ntb/ntb_fwd.c -@@ -696,7 +696,7 @@ assign_stream_to_lcores(void) - break; - } - -- /* Print packet forwading config. */ -+ /* Print packet forwarding config. */ - RTE_LCORE_FOREACH_WORKER(lcore_id) { - conf = &fwd_lcore_conf[lcore_id]; - -diff --git a/examples/packet_ordering/main.c b/examples/packet_ordering/main.c -index b01ac60fd1..99e67ef67b 100644 ---- a/examples/packet_ordering/main.c -+++ b/examples/packet_ordering/main.c -@@ -686,7 +686,7 @@ main(int argc, char **argv) - if (ret < 0) - rte_exit(EXIT_FAILURE, "Invalid packet_ordering arguments\n"); - -- /* Check if we have enought cores */ -+ /* Check if we have enough cores */ - if (rte_lcore_count() < 3) - rte_exit(EXIT_FAILURE, "Error, This application needs at " - "least 3 logical cores to run:\n" -diff --git a/examples/performance-thread/common/lthread.c b/examples/performance-thread/common/lthread.c -index 009374a8c3..b02e0fc13a 100644 ---- a/examples/performance-thread/common/lthread.c -+++ b/examples/performance-thread/common/lthread.c -@@ -178,7 +178,7 @@ lthread_create(struct lthread **new_lt, int lcore_id, - bzero(lt, sizeof(struct lthread)); - lt->root_sched = THIS_SCHED; - -- /* set the function args and exit handlder */ -+ /* set the function args and exit handler */ - _lthread_init(lt, fun, arg, _lthread_exit_handler); - - /* put it in the ready queue */ -@@ -384,7 +384,7 @@ void lthread_exit(void *ptr) - } - - -- /* wait until the joinging thread has collected the exit value */ -+ /* wait until the joining thread has collected the exit value */ - while (lt->join != LT_JOIN_EXIT_VAL_READ) - _reschedule(); - -@@ -410,7 +410,7 @@ int lthread_join(struct lthread *lt, void **ptr) - /* invalid to join a detached thread, or a thread that is joined */ - if ((lt_state & BIT(ST_LT_DETACH)) || (lt->join == LT_JOIN_THREAD_SET)) - return POSIX_ERRNO(EINVAL); -- /* pointer to the joining thread and a poingter to return a value */ -+ /* pointer to the joining thread and a pointer to return a value */ - lt->lt_join = current; - current->lt_exit_ptr = ptr; - /* There is a race between lthread_join() and lthread_exit() -diff --git a/examples/performance-thread/common/lthread_diag.c b/examples/performance-thread/common/lthread_diag.c -index 57760a1e23..b1bdf7a30c 100644 ---- a/examples/performance-thread/common/lthread_diag.c -+++ b/examples/performance-thread/common/lthread_diag.c -@@ -232,7 +232,7 @@ lthread_sched_stats_display(void) - } - - /* -- * Defafult diagnostic callback -+ * Default diagnostic callback - */ - static uint64_t - _lthread_diag_default_cb(uint64_t time, struct lthread *lt, int diag_event, -diff --git a/examples/performance-thread/common/lthread_int.h b/examples/performance-thread/common/lthread_int.h -index d010126f16..ec018e34a1 100644 ---- a/examples/performance-thread/common/lthread_int.h -+++ b/examples/performance-thread/common/lthread_int.h -@@ -107,7 +107,7 @@ enum join_st { - LT_JOIN_EXIT_VAL_READ, /* joining thread has collected ret val */ - }; - --/* defnition of an lthread stack object */ -+/* definition of an lthread stack object */ - struct lthread_stack { - uint8_t stack[LTHREAD_MAX_STACK_SIZE]; - size_t stack_size; -diff --git a/examples/performance-thread/common/lthread_tls.c b/examples/performance-thread/common/lthread_tls.c -index 4ab2e3558b..bae45f2aa9 100644 ---- a/examples/performance-thread/common/lthread_tls.c -+++ b/examples/performance-thread/common/lthread_tls.c -@@ -215,7 +215,7 @@ void _lthread_tls_alloc(struct lthread *lt) - tls->root_sched = (THIS_SCHED); - lt->tls = tls; - -- /* allocate data for TLS varaiables using RTE_PER_LTHREAD macros */ -+ /* allocate data for TLS variables using RTE_PER_LTHREAD macros */ - if (sizeof(void *) < (uint64_t)RTE_PER_LTHREAD_SECTION_SIZE) { - lt->per_lthread_data = - _lthread_objcache_alloc((THIS_SCHED)->per_lthread_cache); -diff --git a/examples/performance-thread/l3fwd-thread/main.c b/examples/performance-thread/l3fwd-thread/main.c -index 8a35040597..1ddb2a9138 100644 ---- a/examples/performance-thread/l3fwd-thread/main.c -+++ b/examples/performance-thread/l3fwd-thread/main.c -@@ -125,7 +125,7 @@ cb_parse_ptype(__rte_unused uint16_t port, __rte_unused uint16_t queue, - } - - /* -- * When set to zero, simple forwaring path is eanbled. -+ * When set to zero, simple forwarding path is enabled. - * When set to one, optimized forwarding path is enabled. - * Note that LPM optimisation path uses SSE4.1 instructions. - */ -@@ -1529,7 +1529,7 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP]) - } - - /* -- * We group consecutive packets with the same destionation port into one burst. -+ * We group consecutive packets with the same destination port into one burst. - * To avoid extra latency this is done together with some other packet - * processing, but after we made a final decision about packet's destination. - * To do this we maintain: -@@ -1554,7 +1554,7 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP]) - - /* - * Group consecutive packets with the same destination port in bursts of 4. -- * Suppose we have array of destionation ports: -+ * Suppose we have array of destination ports: - * dst_port[] = {a, b, c, d,, e, ... } - * dp1 should contain: , dp2: . - * We doing 4 comparisons at once and the result is 4 bit mask. -@@ -1565,7 +1565,7 @@ port_groupx4(uint16_t pn[FWDSTEP + 1], uint16_t *lp, __m128i dp1, __m128i dp2) - { - static const struct { - uint64_t pnum; /* prebuild 4 values for pnum[]. */ -- int32_t idx; /* index for new last updated elemnet. */ -+ int32_t idx; /* index for new last updated element. */ - uint16_t lpv; /* add value to the last updated element. */ - } gptbl[GRPSZ] = { - { -@@ -1834,7 +1834,7 @@ process_burst(struct rte_mbuf *pkts_burst[MAX_PKT_BURST], int nb_rx, - - /* - * Send packets out, through destination port. -- * Consecuteve pacekts with the same destination port -+ * Consecutive packets with the same destination port - * are already grouped together. - * If destination port for the packet equals BAD_PORT, - * then free the packet without sending it out. -@@ -3514,7 +3514,7 @@ main(int argc, char **argv) - - ret = rte_timer_subsystem_init(); - if (ret < 0) -- rte_exit(EXIT_FAILURE, "Failed to initialize timer subystem\n"); -+ rte_exit(EXIT_FAILURE, "Failed to initialize timer subsystem\n"); - - /* pre-init dst MACs for all ports to 02:00:00:00:00:xx */ - for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) { -diff --git a/examples/performance-thread/pthread_shim/pthread_shim.h b/examples/performance-thread/pthread_shim/pthread_shim.h -index e90fb15fc1..ce51627a5b 100644 ---- a/examples/performance-thread/pthread_shim/pthread_shim.h -+++ b/examples/performance-thread/pthread_shim/pthread_shim.h -@@ -41,7 +41,7 @@ - * - * The decision whether to invoke the real library function or the lthread - * function is controlled by a per pthread flag that can be switched -- * on of off by the pthread_override_set() API described below. Typcially -+ * on of off by the pthread_override_set() API described below. Typically - * this should be done as the first action of the initial lthread. - * - * N.B In general it would be poor practice to revert to invoke a real -diff --git a/examples/pipeline/examples/registers.spec b/examples/pipeline/examples/registers.spec -index 74a014ad06..59998fef03 100644 ---- a/examples/pipeline/examples/registers.spec -+++ b/examples/pipeline/examples/registers.spec -@@ -4,7 +4,7 @@ - ; This program is setting up two register arrays called "pkt_counters" and "byte_counters". - ; On every input packet (Ethernet/IPv4), the "pkt_counters" register at location indexed by - ; the IPv4 header "Source Address" field is incremented, while the same location in the --; "byte_counters" array accummulates the value of the IPv4 header "Total Length" field. -+; "byte_counters" array accumulates the value of the IPv4 header "Total Length" field. - ; - ; The "regrd" and "regwr" CLI commands can be used to read and write the current value of - ; any register array location. -diff --git a/examples/qos_sched/cmdline.c b/examples/qos_sched/cmdline.c -index 257b87a7cf..6691b02d89 100644 ---- a/examples/qos_sched/cmdline.c -+++ b/examples/qos_sched/cmdline.c -@@ -41,7 +41,7 @@ static void cmd_help_parsed(__rte_unused void *parsed_result, - " qavg port X subport Y pipe Z : Show average queue size per pipe.\n" - " qavg port X subport Y pipe Z tc A : Show average queue size per pipe and TC.\n" - " qavg port X subport Y pipe Z tc A q B : Show average queue size of a specific queue.\n" -- " qavg [n|period] X : Set number of times and peiod (us).\n\n" -+ " qavg [n|period] X : Set number of times and period (us).\n\n" - ); - - } -diff --git a/examples/server_node_efd/node/node.c b/examples/server_node_efd/node/node.c -index ba1c7e5153..fc2aa5ffef 100644 ---- a/examples/server_node_efd/node/node.c -+++ b/examples/server_node_efd/node/node.c -@@ -296,7 +296,7 @@ handle_packets(struct rte_hash *h, struct rte_mbuf **bufs, uint16_t num_packets) - } - } - } --/* >8 End of packets dequeueing. */ -+/* >8 End of packets dequeuing. */ - - /* - * Application main function - loops through -diff --git a/examples/skeleton/basicfwd.c b/examples/skeleton/basicfwd.c -index 16435ee3cc..518cd72179 100644 ---- a/examples/skeleton/basicfwd.c -+++ b/examples/skeleton/basicfwd.c -@@ -179,7 +179,7 @@ main(int argc, char *argv[]) - int ret = rte_eal_init(argc, argv); - if (ret < 0) - rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); -- /* >8 End of initializion the Environment Abstraction Layer (EAL). */ -+ /* >8 End of initialization the Environment Abstraction Layer (EAL). */ - - argc -= ret; - argv += ret; -diff --git a/examples/vhost/main.c b/examples/vhost/main.c -index 5ebfff3ac4..d05a8f9193 100644 ---- a/examples/vhost/main.c -+++ b/examples/vhost/main.c -@@ -107,7 +107,7 @@ static uint32_t burst_rx_retry_num = BURST_RX_RETRIES; - static char *socket_files; - static int nb_sockets; - --/* empty vmdq configuration structure. Filled in programatically */ -+/* empty VMDq configuration structure. Filled in programmatically */ - static struct rte_eth_conf vmdq_conf_default = { - .rxmode = { - .mq_mode = RTE_ETH_MQ_RX_VMDQ_ONLY, -@@ -115,7 +115,7 @@ static struct rte_eth_conf vmdq_conf_default = { - /* - * VLAN strip is necessary for 1G NIC such as I350, - * this fixes bug of ipv4 forwarding in guest can't -- * forward pakets from one virtio dev to another virtio dev. -+ * forward packets from one virtio dev to another virtio dev. - */ - .offloads = RTE_ETH_RX_OFFLOAD_VLAN_STRIP, - }, -@@ -463,7 +463,7 @@ us_vhost_usage(const char *prgname) - " --nb-devices ND\n" - " -p PORTMASK: Set mask for ports to be used by application\n" - " --vm2vm [0|1|2]: disable/software(default)/hardware vm2vm comms\n" -- " --rx-retry [0|1]: disable/enable(default) retries on rx. Enable retry if destintation queue is full\n" -+ " --rx-retry [0|1]: disable/enable(default) retries on Rx. Enable retry if destination queue is full\n" - " --rx-retry-delay [0-N]: timeout(in usecond) between retries on RX. This makes effect only if retries on rx enabled\n" - " --rx-retry-num [0-N]: the number of retries on rx. This makes effect only if retries on rx enabled\n" - " --mergeable [0|1]: disable(default)/enable RX mergeable buffers\n" -@@ -1288,7 +1288,7 @@ switch_worker(void *arg __rte_unused) - struct vhost_dev *vdev; - struct mbuf_table *tx_q; - -- RTE_LOG(INFO, VHOST_DATA, "Procesing on Core %u started\n", lcore_id); -+ RTE_LOG(INFO, VHOST_DATA, "Processing on Core %u started\n", lcore_id); - - tx_q = &lcore_tx_queue[lcore_id]; - for (i = 0; i < rte_lcore_count(); i++) { -@@ -1332,7 +1332,7 @@ switch_worker(void *arg __rte_unused) - - /* - * Remove a device from the specific data core linked list and from the -- * main linked list. Synchonization occurs through the use of the -+ * main linked list. Synchronization occurs through the use of the - * lcore dev_removal_flag. Device is made volatile here to avoid re-ordering - * of dev->remove=1 which can cause an infinite loop in the rte_pause loop. - */ -diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c -index d767423a40..97b8def7ca 100644 ---- a/examples/vm_power_manager/channel_monitor.c -+++ b/examples/vm_power_manager/channel_monitor.c -@@ -404,7 +404,7 @@ get_pcpu_to_control(struct policy *pol) - - /* - * So now that we're handling virtual and physical cores, we need to -- * differenciate between them when adding them to the branch monitor. -+ * differentiate between them when adding them to the branch monitor. - * Virtual cores need to be converted to physical cores. - */ - if (pol->pkt.core_type == RTE_POWER_CORE_TYPE_VIRTUAL) { -diff --git a/examples/vm_power_manager/power_manager.h b/examples/vm_power_manager/power_manager.h -index d35f8cbe01..d51039e2c6 100644 ---- a/examples/vm_power_manager/power_manager.h -+++ b/examples/vm_power_manager/power_manager.h -@@ -224,7 +224,7 @@ int power_manager_enable_turbo_core(unsigned int core_num); - int power_manager_disable_turbo_core(unsigned int core_num); - - /** -- * Get the current freuency of the core specified by core_num -+ * Get the current frequency of the core specified by core_num - * - * @param core_num - * The core number to get the current frequency -diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c -index 2c00a942f1..10410b8783 100644 ---- a/examples/vmdq/main.c -+++ b/examples/vmdq/main.c -@@ -62,7 +62,7 @@ static uint8_t rss_enable; - - /* Default structure for VMDq. 8< */ - --/* empty vmdq configuration structure. Filled in programatically */ -+/* empty VMDq configuration structure. Filled in programmatically */ - static const struct rte_eth_conf vmdq_conf_default = { - .rxmode = { - .mq_mode = RTE_ETH_MQ_RX_VMDQ_ONLY, -diff --git a/kernel/linux/kni/kni_fifo.h b/kernel/linux/kni/kni_fifo.h -index 5c91b55379..1ba5172002 100644 ---- a/kernel/linux/kni/kni_fifo.h -+++ b/kernel/linux/kni/kni_fifo.h -@@ -41,7 +41,7 @@ kni_fifo_put(struct rte_kni_fifo *fifo, void **data, uint32_t num) - } - - /** -- * Get up to num elements from the fifo. Return the number actully read -+ * Get up to num elements from the FIFO. Return the number actually read - */ - static inline uint32_t - kni_fifo_get(struct rte_kni_fifo *fifo, void **data, uint32_t num) -diff --git a/lib/acl/acl_bld.c b/lib/acl/acl_bld.c -index f316d3e875..7ea30f4186 100644 ---- a/lib/acl/acl_bld.c -+++ b/lib/acl/acl_bld.c -@@ -885,7 +885,7 @@ acl_gen_range_trie(struct acl_build_context *context, - return root; - } - -- /* gather information about divirgent paths */ -+ /* gather information about divergent paths */ - lo_00 = 0; - hi_ff = UINT8_MAX; - for (k = n - 1; k >= 0; k--) { -diff --git a/lib/acl/acl_run_altivec.h b/lib/acl/acl_run_altivec.h -index 2de6f27b1f..24a41eec17 100644 ---- a/lib/acl/acl_run_altivec.h -+++ b/lib/acl/acl_run_altivec.h -@@ -146,7 +146,7 @@ transition4(xmm_t next_input, const uint64_t *trans, - - dfa_ofs = vec_sub(t, r); - -- /* QUAD/SINGLE caluclations. */ -+ /* QUAD/SINGLE calculations. */ - t = (xmm_t)vec_cmpgt((vector signed char)in, (vector signed char)tr_hi); - t = (xmm_t)vec_sel( - vec_sel( -diff --git a/lib/acl/acl_run_avx512.c b/lib/acl/acl_run_avx512.c -index 78fbe34f7c..3b8795561b 100644 ---- a/lib/acl/acl_run_avx512.c -+++ b/lib/acl/acl_run_avx512.c -@@ -64,7 +64,7 @@ update_flow_mask(const struct acl_flow_avx512 *flow, uint32_t *fmsk, - } - - /* -- * Resolve matches for multiple categories (LE 8, use 128b instuctions/regs) -+ * Resolve matches for multiple categories (LE 8, use 128b instructions/regs) - */ - static inline void - resolve_mcle8_avx512x1(uint32_t result[], -diff --git a/lib/acl/acl_run_avx512x16.h b/lib/acl/acl_run_avx512x16.h -index 48bb6fed85..f87293eeb7 100644 ---- a/lib/acl/acl_run_avx512x16.h -+++ b/lib/acl/acl_run_avx512x16.h -@@ -10,7 +10,7 @@ - */ - - /* -- * This implementation uses 512-bit registers(zmm) and instrincts. -+ * This implementation uses 512-bit registers(zmm) and intrinsics. - * So our main SIMD type is 512-bit width and each such variable can - * process sizeof(__m512i) / sizeof(uint32_t) == 16 entries in parallel. - */ -@@ -25,20 +25,20 @@ - #define _F_(x) x##_avx512x16 - - /* -- * Same instrincts have different syntaxis (depending on the bit-width), -+ * Same intrinsics have different syntaxes (depending on the bit-width), - * so to overcome that few macros need to be defined. - */ - --/* Naming convention for generic epi(packed integers) type instrincts. */ -+/* Naming convention for generic epi(packed integers) type intrinsics. */ - #define _M_I_(x) _mm512_##x - --/* Naming convention for si(whole simd integer) type instrincts. */ -+/* Naming convention for si(whole simd integer) type intrinsics. */ - #define _M_SI_(x) _mm512_##x##_si512 - --/* Naming convention for masked gather type instrincts. */ -+/* Naming convention for masked gather type intrinsics. */ - #define _M_MGI_(x) _mm512_##x - --/* Naming convention for gather type instrincts. */ -+/* Naming convention for gather type intrinsics. */ - #define _M_GI_(name, idx, base, scale) _mm512_##name(idx, base, scale) - - /* num/mask of transitions per SIMD regs */ -@@ -239,7 +239,7 @@ _F_(gather_bytes)(__m512i zero, const __m512i p[2], const uint32_t m[2], - } - - /* -- * Resolve matches for multiple categories (GT 8, use 512b instuctions/regs) -+ * Resolve matches for multiple categories (GT 8, use 512b instructions/regs) - */ - static inline void - resolve_mcgt8_avx512x1(uint32_t result[], -diff --git a/lib/acl/acl_run_avx512x8.h b/lib/acl/acl_run_avx512x8.h -index 61ac9d1b47..5da2bbfdeb 100644 ---- a/lib/acl/acl_run_avx512x8.h -+++ b/lib/acl/acl_run_avx512x8.h -@@ -10,7 +10,7 @@ - */ - - /* -- * This implementation uses 256-bit registers(ymm) and instrincts. -+ * This implementation uses 256-bit registers(ymm) and intrinsics. - * So our main SIMD type is 256-bit width and each such variable can - * process sizeof(__m256i) / sizeof(uint32_t) == 8 entries in parallel. - */ -@@ -25,20 +25,20 @@ - #define _F_(x) x##_avx512x8 - - /* -- * Same instrincts have different syntaxis (depending on the bit-width), -+ * Same intrinsics have different syntaxes (depending on the bit-width), - * so to overcome that few macros need to be defined. - */ - --/* Naming convention for generic epi(packed integers) type instrincts. */ -+/* Naming convention for generic epi(packed integers) type intrinsics. */ - #define _M_I_(x) _mm256_##x - --/* Naming convention for si(whole simd integer) type instrincts. */ -+/* Naming convention for si(whole simd integer) type intrinsics. */ - #define _M_SI_(x) _mm256_##x##_si256 - --/* Naming convention for masked gather type instrincts. */ -+/* Naming convention for masked gather type intrinsics. */ - #define _M_MGI_(x) _mm256_m##x - --/* Naming convention for gather type instrincts. */ -+/* Naming convention for gather type intrinsics. */ - #define _M_GI_(name, idx, base, scale) _mm256_##name(base, idx, scale) - - /* num/mask of transitions per SIMD regs */ -diff --git a/lib/bpf/bpf_convert.c b/lib/bpf/bpf_convert.c -index db84add7dc..9563274c9c 100644 ---- a/lib/bpf/bpf_convert.c -+++ b/lib/bpf/bpf_convert.c -@@ -412,7 +412,7 @@ static int bpf_convert_filter(const struct bpf_insn *prog, size_t len, - BPF_EMIT_JMP; - break; - -- /* ldxb 4 * ([14] & 0xf) is remaped into 6 insns. */ -+ /* ldxb 4 * ([14] & 0xf) is remapped into 6 insns. */ - case BPF_LDX | BPF_MSH | BPF_B: - /* tmp = A */ - *insn++ = BPF_MOV64_REG(BPF_REG_TMP, BPF_REG_A); -@@ -428,7 +428,7 @@ static int bpf_convert_filter(const struct bpf_insn *prog, size_t len, - *insn = BPF_MOV64_REG(BPF_REG_A, BPF_REG_TMP); - break; - -- /* RET_K is remaped into 2 insns. RET_A case doesn't need an -+ /* RET_K is remapped into 2 insns. RET_A case doesn't need an - * extra mov as EBPF_REG_0 is already mapped into BPF_REG_A. - */ - case BPF_RET | BPF_A: -diff --git a/lib/dmadev/rte_dmadev.h b/lib/dmadev/rte_dmadev.h -index 9942c6ec21..4abe79c536 100644 ---- a/lib/dmadev/rte_dmadev.h -+++ b/lib/dmadev/rte_dmadev.h -@@ -533,7 +533,7 @@ struct rte_dma_port_param { - * @note If some fields can not be supported by the - * hardware/driver, then the driver ignores those fields. - * Please check driver-specific documentation for limitations -- * and capablites. -+ * and capabilities. - */ - __extension__ - struct { -@@ -731,7 +731,7 @@ enum rte_dma_status_code { - /** The operation completed successfully. */ - RTE_DMA_STATUS_SUCCESSFUL, - /** The operation failed to complete due abort by user. -- * This is mainly used when processing dev_stop, user could modidy the -+ * This is mainly used when processing dev_stop, user could modify the - * descriptors (e.g. change one bit to tell hardware abort this job), - * it allows outstanding requests to be complete as much as possible, - * so reduce the time to stop the device. -diff --git a/lib/eal/arm/include/rte_cycles_32.h b/lib/eal/arm/include/rte_cycles_32.h -index f79718ce8c..cec4d69e7a 100644 ---- a/lib/eal/arm/include/rte_cycles_32.h -+++ b/lib/eal/arm/include/rte_cycles_32.h -@@ -30,7 +30,7 @@ extern "C" { - - /** - * This call is easily portable to any architecture, however, -- * it may require a system call and inprecise for some tasks. -+ * it may require a system call and imprecise for some tasks. - */ - static inline uint64_t - __rte_rdtsc_syscall(void) -diff --git a/lib/eal/freebsd/eal_interrupts.c b/lib/eal/freebsd/eal_interrupts.c -index 10aa91cc09..9f720bdc8f 100644 ---- a/lib/eal/freebsd/eal_interrupts.c -+++ b/lib/eal/freebsd/eal_interrupts.c -@@ -234,7 +234,7 @@ rte_intr_callback_unregister_pending(const struct rte_intr_handle *intr_handle, - - rte_spinlock_lock(&intr_lock); - -- /* check if the insterrupt source for the fd is existent */ -+ /* check if the interrupt source for the fd is existent */ - TAILQ_FOREACH(src, &intr_sources, next) - if (rte_intr_fd_get(src->intr_handle) == rte_intr_fd_get(intr_handle)) - break; -@@ -288,7 +288,7 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle, - - rte_spinlock_lock(&intr_lock); - -- /* check if the insterrupt source for the fd is existent */ -+ /* check if the interrupt source for the fd is existent */ - TAILQ_FOREACH(src, &intr_sources, next) - if (rte_intr_fd_get(src->intr_handle) == rte_intr_fd_get(intr_handle)) - break; -diff --git a/lib/eal/include/generic/rte_pflock.h b/lib/eal/include/generic/rte_pflock.h -index b9de063c89..e7bb29b3c5 100644 ---- a/lib/eal/include/generic/rte_pflock.h -+++ b/lib/eal/include/generic/rte_pflock.h -@@ -157,7 +157,7 @@ rte_pflock_write_lock(rte_pflock_t *pf) - uint16_t ticket, w; - - /* Acquire ownership of write-phase. -- * This is same as rte_tickelock_lock(). -+ * This is same as rte_ticketlock_lock(). - */ - ticket = __atomic_fetch_add(&pf->wr.in, 1, __ATOMIC_RELAXED); - rte_wait_until_equal_16(&pf->wr.out, ticket, __ATOMIC_ACQUIRE); -diff --git a/lib/eal/include/rte_malloc.h b/lib/eal/include/rte_malloc.h -index ed02e15119..3892519fab 100644 ---- a/lib/eal/include/rte_malloc.h -+++ b/lib/eal/include/rte_malloc.h -@@ -58,7 +58,7 @@ rte_malloc(const char *type, size_t size, unsigned align) - __rte_alloc_size(2); - - /** -- * Allocate zero'ed memory from the heap. -+ * Allocate zeroed memory from the heap. - * - * Equivalent to rte_malloc() except that the memory zone is - * initialised with zeros. In NUMA systems, the memory allocated resides on the -@@ -189,7 +189,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket) - __rte_alloc_size(2); - - /** -- * Allocate zero'ed memory from the heap. -+ * Allocate zeroed memory from the heap. - * - * Equivalent to rte_malloc() except that the memory zone is - * initialised with zeros. -diff --git a/lib/eal/linux/eal_interrupts.c b/lib/eal/linux/eal_interrupts.c -index 621e43626e..c3e9a08822 100644 ---- a/lib/eal/linux/eal_interrupts.c -+++ b/lib/eal/linux/eal_interrupts.c -@@ -589,7 +589,7 @@ rte_intr_callback_unregister_pending(const struct rte_intr_handle *intr_handle, - - rte_spinlock_lock(&intr_lock); - -- /* check if the insterrupt source for the fd is existent */ -+ /* check if the interrupt source for the fd is existent */ - TAILQ_FOREACH(src, &intr_sources, next) { - if (rte_intr_fd_get(src->intr_handle) == rte_intr_fd_get(intr_handle)) - break; -@@ -639,7 +639,7 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle, - - rte_spinlock_lock(&intr_lock); - -- /* check if the insterrupt source for the fd is existent */ -+ /* check if the interrupt source for the fd is existent */ - TAILQ_FOREACH(src, &intr_sources, next) - if (rte_intr_fd_get(src->intr_handle) == rte_intr_fd_get(intr_handle)) - break; -diff --git a/lib/eal/linux/eal_vfio.h b/lib/eal/linux/eal_vfio.h -index 6ebaca6a0c..c5d5f70548 100644 ---- a/lib/eal/linux/eal_vfio.h -+++ b/lib/eal/linux/eal_vfio.h -@@ -103,7 +103,7 @@ struct vfio_group { - typedef int (*vfio_dma_func_t)(int); - - /* Custom memory region DMA mapping function prototype. -- * Takes VFIO container fd, virtual address, phisical address, length and -+ * Takes VFIO container fd, virtual address, physical address, length and - * operation type (0 to unmap 1 for map) as a parameters. - * Returns 0 on success, -1 on error. - **/ -diff --git a/lib/eal/windows/eal_windows.h b/lib/eal/windows/eal_windows.h -index 23ead6d30c..245aa60344 100644 ---- a/lib/eal/windows/eal_windows.h -+++ b/lib/eal/windows/eal_windows.h -@@ -63,7 +63,7 @@ unsigned int eal_socket_numa_node(unsigned int socket_id); - * @param arg - * Argument to the called function. - * @return -- * 0 on success, netagive error code on failure. -+ * 0 on success, negative error code on failure. - */ - int eal_intr_thread_schedule(void (*func)(void *arg), void *arg); - -diff --git a/lib/eal/windows/include/dirent.h b/lib/eal/windows/include/dirent.h -index 869a598378..34eb077f8c 100644 ---- a/lib/eal/windows/include/dirent.h -+++ b/lib/eal/windows/include/dirent.h -@@ -440,7 +440,7 @@ opendir(const char *dirname) - * display correctly on console. The problem can be fixed in two ways: - * (1) change the character set of console to 1252 using chcp utility - * and use Lucida Console font, or (2) use _cprintf function when -- * writing to console. The _cprinf() will re-encode ANSI strings to the -+ * writing to console. The _cprintf() will re-encode ANSI strings to the - * console code page so many non-ASCII characters will display correctly. - */ - static struct dirent* -@@ -579,7 +579,7 @@ dirent_mbstowcs_s( - wcstr[n] = 0; - } - -- /* Length of resuting multi-byte string WITH zero -+ /* Length of resulting multi-byte string WITH zero - *terminator - */ - if (pReturnValue) -diff --git a/lib/eal/windows/include/fnmatch.h b/lib/eal/windows/include/fnmatch.h -index c272f65ccd..c6b226bd5d 100644 ---- a/lib/eal/windows/include/fnmatch.h -+++ b/lib/eal/windows/include/fnmatch.h -@@ -26,14 +26,14 @@ extern "C" { - #define FNM_PREFIX_DIRS 0x20 - - /** -- * This function is used for searhing a given string source -+ * This function is used for searching a given string source - * with the given regular expression pattern. - * - * @param pattern - * regular expression notation describing the pattern to match - * - * @param string -- * source string to searcg for the pattern -+ * source string to search for the pattern - * - * @param flag - * containing information about the pattern -diff --git a/lib/eal/x86/include/rte_atomic.h b/lib/eal/x86/include/rte_atomic.h -index 915afd9d27..f2ee1a9ce9 100644 ---- a/lib/eal/x86/include/rte_atomic.h -+++ b/lib/eal/x86/include/rte_atomic.h -@@ -60,7 +60,7 @@ extern "C" { - * Basic idea is to use lock prefixed add with some dummy memory location - * as the destination. From their experiments 128B(2 cache lines) below - * current stack pointer looks like a good candidate. -- * So below we use that techinque for rte_smp_mb() implementation. -+ * So below we use that technique for rte_smp_mb() implementation. - */ - - static __rte_always_inline void -diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c -index 809416d9b7..3182b52c23 100644 ---- a/lib/eventdev/rte_event_eth_rx_adapter.c -+++ b/lib/eventdev/rte_event_eth_rx_adapter.c -@@ -3334,7 +3334,7 @@ handle_rxa_get_queue_conf(const char *cmd __rte_unused, - token = strtok(NULL, "\0"); - if (token != NULL) - RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" -- " telemetry command, igrnoring"); -+ " telemetry command, ignoring"); - - if (rte_event_eth_rx_adapter_queue_conf_get(rx_adapter_id, eth_dev_id, - rx_queue_id, &queue_conf)) { -@@ -3398,7 +3398,7 @@ handle_rxa_get_queue_stats(const char *cmd __rte_unused, - token = strtok(NULL, "\0"); - if (token != NULL) - RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" -- " telemetry command, igrnoring"); -+ " telemetry command, ignoring"); - - if (rte_event_eth_rx_adapter_queue_stats_get(rx_adapter_id, eth_dev_id, - rx_queue_id, &q_stats)) { -@@ -3460,7 +3460,7 @@ handle_rxa_queue_stats_reset(const char *cmd __rte_unused, - token = strtok(NULL, "\0"); - if (token != NULL) - RTE_EDEV_LOG_ERR("Extra parameters passed to eventdev" -- " telemetry command, igrnoring"); -+ " telemetry command, ignoring"); - - if (rte_event_eth_rx_adapter_queue_stats_reset(rx_adapter_id, - eth_dev_id, -diff --git a/lib/fib/rte_fib.c b/lib/fib/rte_fib.c -index 6ca180d7e7..0cced97a77 100644 ---- a/lib/fib/rte_fib.c -+++ b/lib/fib/rte_fib.c -@@ -40,10 +40,10 @@ EAL_REGISTER_TAILQ(rte_fib_tailq) - struct rte_fib { - char name[RTE_FIB_NAMESIZE]; - enum rte_fib_type type; /**< Type of FIB struct */ -- struct rte_rib *rib; /**< RIB helper datastruct */ -+ struct rte_rib *rib; /**< RIB helper datastructure */ - void *dp; /**< pointer to the dataplane struct*/ -- rte_fib_lookup_fn_t lookup; /**< fib lookup function */ -- rte_fib_modify_fn_t modify; /**< modify fib datastruct */ -+ rte_fib_lookup_fn_t lookup; /**< FIB lookup function */ -+ rte_fib_modify_fn_t modify; /**< modify FIB datastructure */ - uint64_t def_nh; - }; - -diff --git a/lib/fib/rte_fib.h b/lib/fib/rte_fib.h -index b3c59dfaaa..e592d3251a 100644 ---- a/lib/fib/rte_fib.h -+++ b/lib/fib/rte_fib.h -@@ -189,7 +189,7 @@ rte_fib_lookup_bulk(struct rte_fib *fib, uint32_t *ips, - * FIB object handle - * @return - * Pointer on the dataplane struct on success -- * NULL othervise -+ * NULL otherwise - */ - void * - rte_fib_get_dp(struct rte_fib *fib); -@@ -201,7 +201,7 @@ rte_fib_get_dp(struct rte_fib *fib); - * FIB object handle - * @return - * Pointer on the RIB on success -- * NULL othervise -+ * NULL otherwise - */ - struct rte_rib * - rte_fib_get_rib(struct rte_fib *fib); -diff --git a/lib/fib/rte_fib6.c b/lib/fib/rte_fib6.c -index be79efe004..eebee297d6 100644 ---- a/lib/fib/rte_fib6.c -+++ b/lib/fib/rte_fib6.c -@@ -40,10 +40,10 @@ EAL_REGISTER_TAILQ(rte_fib6_tailq) - struct rte_fib6 { - char name[FIB6_NAMESIZE]; - enum rte_fib6_type type; /**< Type of FIB struct */ -- struct rte_rib6 *rib; /**< RIB helper datastruct */ -+ struct rte_rib6 *rib; /**< RIB helper datastructure */ - void *dp; /**< pointer to the dataplane struct*/ -- rte_fib6_lookup_fn_t lookup; /**< fib lookup function */ -- rte_fib6_modify_fn_t modify; /**< modify fib datastruct */ -+ rte_fib6_lookup_fn_t lookup; /**< FIB lookup function */ -+ rte_fib6_modify_fn_t modify; /**< modify FIB datastructure */ - uint64_t def_nh; - }; - -diff --git a/lib/fib/rte_fib6.h b/lib/fib/rte_fib6.h -index 95879af96d..cb133719e1 100644 ---- a/lib/fib/rte_fib6.h -+++ b/lib/fib/rte_fib6.h -@@ -184,7 +184,7 @@ rte_fib6_lookup_bulk(struct rte_fib6 *fib, - * FIB6 object handle - * @return - * Pointer on the dataplane struct on success -- * NULL othervise -+ * NULL otherwise - */ - void * - rte_fib6_get_dp(struct rte_fib6 *fib); -@@ -196,7 +196,7 @@ rte_fib6_get_dp(struct rte_fib6 *fib); - * FIB object handle - * @return - * Pointer on the RIB6 on success -- * NULL othervise -+ * NULL otherwise - */ - struct rte_rib6 * - rte_fib6_get_rib(struct rte_fib6 *fib); -diff --git a/lib/ipsec/ipsec_telemetry.c b/lib/ipsec/ipsec_telemetry.c -index b8b08404b6..9a91e47122 100644 ---- a/lib/ipsec/ipsec_telemetry.c -+++ b/lib/ipsec/ipsec_telemetry.c -@@ -236,7 +236,7 @@ RTE_INIT(rte_ipsec_telemetry_init) - "Return list of IPsec SAs with telemetry enabled."); - rte_telemetry_register_cmd("/ipsec/sa/stats", - handle_telemetry_cmd_ipsec_sa_stats, -- "Returns IPsec SA stastistics. Parameters: int sa_spi"); -+ "Returns IPsec SA statistics. Parameters: int sa_spi"); - rte_telemetry_register_cmd("/ipsec/sa/details", - handle_telemetry_cmd_ipsec_sa_details, - "Returns IPsec SA configuration. Parameters: int sa_spi"); -diff --git a/lib/ipsec/rte_ipsec_sad.h b/lib/ipsec/rte_ipsec_sad.h -index b65d295831..a3ae57df7e 100644 ---- a/lib/ipsec/rte_ipsec_sad.h -+++ b/lib/ipsec/rte_ipsec_sad.h -@@ -153,7 +153,7 @@ rte_ipsec_sad_destroy(struct rte_ipsec_sad *sad); - * @param keys - * Array of keys to be looked up in the SAD - * @param sa -- * Pointer assocoated with the keys. -+ * Pointer associated with the keys. - * If the lookup for the given key failed, then corresponding sa - * will be NULL - * @param n -diff --git a/lib/ipsec/sa.c b/lib/ipsec/sa.c -index 1e51482c92..cdb70af0cb 100644 ---- a/lib/ipsec/sa.c -+++ b/lib/ipsec/sa.c -@@ -362,7 +362,7 @@ esp_outb_tun_init(struct rte_ipsec_sa *sa, const struct rte_ipsec_sa_prm *prm) - - memcpy(sa->hdr, prm->tun.hdr, prm->tun.hdr_len); - -- /* insert UDP header if UDP encapsulation is inabled */ -+ /* insert UDP header if UDP encapsulation is enabled */ - if (sa->type & RTE_IPSEC_SATP_NATT_ENABLE) { - struct rte_udp_hdr *udph = (struct rte_udp_hdr *) - &sa->hdr[prm->tun.hdr_len]; -diff --git a/lib/mbuf/rte_mbuf_core.h b/lib/mbuf/rte_mbuf_core.h -index 321a419c71..3d6ddd6773 100644 ---- a/lib/mbuf/rte_mbuf_core.h -+++ b/lib/mbuf/rte_mbuf_core.h -@@ -8,7 +8,7 @@ - - /** - * @file -- * This file contains definion of RTE mbuf structure itself, -+ * This file contains definition of RTE mbuf structure itself, - * packet offload flags and some related macros. - * For majority of DPDK entities, it is not recommended to include - * this file directly, use include instead. -diff --git a/lib/meson.build b/lib/meson.build -index 5363f0d184..963287b174 100644 ---- a/lib/meson.build -+++ b/lib/meson.build -@@ -3,7 +3,7 @@ - - - # process all libraries equally, as far as possible --# "core" libs first, then others alphebetically as far as possible -+# "core" libs first, then others alphabetically as far as possible - # NOTE: for speed of meson runs, the dependencies in the subdirectories - # sometimes skip deps that would be implied by others, e.g. if mempool is - # given as a dep, no need to mention ring. This is especially true for the -diff --git a/lib/net/rte_l2tpv2.h b/lib/net/rte_l2tpv2.h -index b90e36cf12..938a993b48 100644 ---- a/lib/net/rte_l2tpv2.h -+++ b/lib/net/rte_l2tpv2.h -@@ -143,7 +143,7 @@ struct rte_l2tpv2_msg_without_length { - /** - * L2TPv2 message Header contains all options except ns_nr(length, - * offset size, offset padding). -- * Ns and Nr MUST be toghter. -+ * Ns and Nr MUST be together. - */ - struct rte_l2tpv2_msg_without_ns_nr { - rte_be16_t length; /**< length(16) */ -@@ -155,7 +155,7 @@ struct rte_l2tpv2_msg_without_ns_nr { - - /** - * L2TPv2 message Header contains all options except ns_nr(length, ns, nr). -- * offset size and offset padding MUST be toghter. -+ * offset size and offset padding MUST be together. - */ - struct rte_l2tpv2_msg_without_offset { - rte_be16_t length; /**< length(16) */ -diff --git a/lib/pipeline/rte_swx_ctl.h b/lib/pipeline/rte_swx_ctl.h -index 46d05823e1..82e62e70a7 100644 ---- a/lib/pipeline/rte_swx_ctl.h -+++ b/lib/pipeline/rte_swx_ctl.h -@@ -369,7 +369,7 @@ struct rte_swx_table_stats { - uint64_t n_pkts_miss; - - /** Number of packets (with either lookup hit or miss) per pipeline -- * action. Array of pipeline *n_actions* elements indedex by the -+ * action. Array of pipeline *n_actions* elements indexed by the - * pipeline-level *action_id*, therefore this array has the same size - * for all the tables within the same pipeline. - */ -@@ -629,7 +629,7 @@ struct rte_swx_learner_stats { - uint64_t n_pkts_forget; - - /** Number of packets (with either lookup hit or miss) per pipeline action. Array of -- * pipeline *n_actions* elements indedex by the pipeline-level *action_id*, therefore this -+ * pipeline *n_actions* elements indexed by the pipeline-level *action_id*, therefore this - * array has the same size for all the tables within the same pipeline. - */ - uint64_t *n_pkts_action; -diff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h -index 1921fdcd78..fa944c95f2 100644 ---- a/lib/pipeline/rte_swx_pipeline_internal.h -+++ b/lib/pipeline/rte_swx_pipeline_internal.h -@@ -309,7 +309,7 @@ enum instruction_type { - */ - INSTR_ALU_CKADD_FIELD, /* src = H */ - INSTR_ALU_CKADD_STRUCT20, /* src = h.header, with sizeof(header) = 20 */ -- INSTR_ALU_CKADD_STRUCT, /* src = h.hdeader, with any sizeof(header) */ -+ INSTR_ALU_CKADD_STRUCT, /* src = h.header, with any sizeof(header) */ - - /* cksub dst src - * dst = dst '- src -@@ -1562,7 +1562,7 @@ emit_handler(struct thread *t) - return; - } - -- /* Header encapsulation (optionally, with prior header decasulation). */ -+ /* Header encapsulation (optionally, with prior header decapsulation). */ - if ((t->n_headers_out == 2) && - (h1->ptr + h1->n_bytes == t->ptr) && - (h0->ptr == h0->ptr0)) { -diff --git a/lib/pipeline/rte_swx_pipeline_spec.c b/lib/pipeline/rte_swx_pipeline_spec.c -index 8e9aa44e30..07a7580ac8 100644 ---- a/lib/pipeline/rte_swx_pipeline_spec.c -+++ b/lib/pipeline/rte_swx_pipeline_spec.c -@@ -2011,7 +2011,7 @@ rte_swx_pipeline_build_from_spec(struct rte_swx_pipeline *p, - if (err_line) - *err_line = 0; - if (err_msg) -- *err_msg = "Null pipeline arument."; -+ *err_msg = "Null pipeline argument."; - status = -EINVAL; - goto error; - } -diff --git a/lib/power/power_cppc_cpufreq.c b/lib/power/power_cppc_cpufreq.c -index 6afd310e4e..25185a791c 100644 ---- a/lib/power/power_cppc_cpufreq.c -+++ b/lib/power/power_cppc_cpufreq.c -@@ -621,7 +621,7 @@ power_cppc_enable_turbo(unsigned int lcore_id) - return -1; - } - -- /* TODO: must set to max once enbling Turbo? Considering add condition: -+ /* TODO: must set to max once enabling Turbo? Considering add condition: - * if ((pi->turbo_available) && (pi->curr_idx <= 1)) - */ - /* Max may have changed, so call to max function */ -diff --git a/lib/regexdev/rte_regexdev.h b/lib/regexdev/rte_regexdev.h -index 86f0b231b0..0bac46cda9 100644 ---- a/lib/regexdev/rte_regexdev.h -+++ b/lib/regexdev/rte_regexdev.h -@@ -298,14 +298,14 @@ rte_regexdev_get_dev_id(const char *name); - * backtracking positions remembered by any tokens inside the group. - * Example RegEx is `a(?>bc|b)c` if the given patterns are `abc` and `abcc` then - * `a(bc|b)c` matches both where as `a(?>bc|b)c` matches only abcc because -- * atomic groups don't allow backtracing back to `b`. -+ * atomic groups don't allow backtracking back to `b`. - * - * @see struct rte_regexdev_info::regexdev_capa - */ - - #define RTE_REGEXDEV_SUPP_PCRE_BACKTRACKING_CTRL_F (1ULL << 3) - /**< RegEx device support PCRE backtracking control verbs. -- * Some examples of backtracing verbs are (*COMMIT), (*ACCEPT), (*FAIL), -+ * Some examples of backtracking verbs are (*COMMIT), (*ACCEPT), (*FAIL), - * (*SKIP), (*PRUNE). - * - * @see struct rte_regexdev_info::regexdev_capa -@@ -1015,7 +1015,7 @@ rte_regexdev_rule_db_update(uint8_t dev_id, - * @b EXPERIMENTAL: this API may change without prior notice. - * - * Compile local rule set and burn the complied result to the -- * RegEx deive. -+ * RegEx device. - * - * @param dev_id - * RegEx device identifier. -diff --git a/lib/ring/rte_ring_core.h b/lib/ring/rte_ring_core.h -index 46ad584f9c..1252ca9546 100644 ---- a/lib/ring/rte_ring_core.h -+++ b/lib/ring/rte_ring_core.h -@@ -12,7 +12,7 @@ - - /** - * @file -- * This file contains definion of RTE ring structure itself, -+ * This file contains definition of RTE ring structure itself, - * init flags and some related macros. - * For majority of DPDK entities, it is not recommended to include - * this file directly, use include or -diff --git a/lib/sched/rte_pie.h b/lib/sched/rte_pie.h -index dfdf572311..02a987f54a 100644 ---- a/lib/sched/rte_pie.h -+++ b/lib/sched/rte_pie.h -@@ -252,7 +252,7 @@ _rte_pie_drop(const struct rte_pie_config *pie_cfg, - } - - /** -- * @brief Decides if new packet should be enqeued or dropped for non-empty queue -+ * @brief Decides if new packet should be enqueued or dropped for non-empty queue - * - * @param pie_cfg [in] config pointer to a PIE configuration parameter structure - * @param pie [in,out] data pointer to PIE runtime data -@@ -319,7 +319,7 @@ rte_pie_enqueue_nonempty(const struct rte_pie_config *pie_cfg, - } - - /** -- * @brief Decides if new packet should be enqeued or dropped -+ * @brief Decides if new packet should be enqueued or dropped - * Updates run time data and gives verdict whether to enqueue or drop the packet. - * - * @param pie_cfg [in] config pointer to a PIE configuration parameter structure -@@ -330,7 +330,7 @@ rte_pie_enqueue_nonempty(const struct rte_pie_config *pie_cfg, - * - * @return Operation status - * @retval 0 enqueue the packet -- * @retval 1 drop the packet based on drop probility criteria -+ * @retval 1 drop the packet based on drop probability criteria - */ - static inline int - __rte_experimental -diff --git a/lib/sched/rte_red.h b/lib/sched/rte_red.h -index 36273cac64..f5843dab1b 100644 ---- a/lib/sched/rte_red.h -+++ b/lib/sched/rte_red.h -@@ -303,7 +303,7 @@ __rte_red_drop(const struct rte_red_config *red_cfg, struct rte_red *red) - } - - /** -- * @brief Decides if new packet should be enqeued or dropped in queue non-empty case -+ * @brief Decides if new packet should be enqueued or dropped in queue non-empty case - * - * @param red_cfg [in] config pointer to a RED configuration parameter structure - * @param red [in,out] data pointer to RED runtime data -@@ -361,7 +361,7 @@ rte_red_enqueue_nonempty(const struct rte_red_config *red_cfg, - } - - /** -- * @brief Decides if new packet should be enqeued or dropped -+ * @brief Decides if new packet should be enqueued or dropped - * Updates run time data based on new queue size value. - * Based on new queue average and RED configuration parameters - * gives verdict whether to enqueue or drop the packet. -diff --git a/lib/sched/rte_sched.c b/lib/sched/rte_sched.c -index ed44808f7b..62b3d2e315 100644 ---- a/lib/sched/rte_sched.c -+++ b/lib/sched/rte_sched.c -@@ -239,7 +239,7 @@ struct rte_sched_port { - int socket; - - /* Timing */ -- uint64_t time_cpu_cycles; /* Current CPU time measured in CPU cyles */ -+ uint64_t time_cpu_cycles; /* Current CPU time measured in CPU cycles */ - uint64_t time_cpu_bytes; /* Current CPU time measured in bytes */ - uint64_t time; /* Current NIC TX time measured in bytes */ - struct rte_reciprocal inv_cycles_per_byte; /* CPU cycles per byte */ -diff --git a/lib/sched/rte_sched.h b/lib/sched/rte_sched.h -index 484dbdcc3d..3c625ba169 100644 ---- a/lib/sched/rte_sched.h -+++ b/lib/sched/rte_sched.h -@@ -360,7 +360,7 @@ rte_sched_subport_pipe_profile_add(struct rte_sched_port *port, - * - * Hierarchical scheduler subport bandwidth profile add - * Note that this function is safe to use in runtime for adding new -- * subport bandwidth profile as it doesn't have any impact on hiearchical -+ * subport bandwidth profile as it doesn't have any impact on hierarchical - * structure of the scheduler. - * @param port - * Handle to port scheduler instance -diff --git a/lib/table/rte_swx_table.h b/lib/table/rte_swx_table.h -index f93e5f3f95..c1383c2e57 100644 ---- a/lib/table/rte_swx_table.h -+++ b/lib/table/rte_swx_table.h -@@ -216,7 +216,7 @@ typedef int - * operations into the same table. - * - * The typical reason an implementation may choose to split the table lookup -- * operation into multiple steps is to hide the latency of the inherrent memory -+ * operation into multiple steps is to hide the latency of the inherent memory - * read operations: before a read operation with the source data likely not in - * the CPU cache, the source data prefetch is issued and the table lookup - * operation is postponed in favor of some other unrelated work, which the CPU -diff --git a/lib/table/rte_swx_table_selector.h b/lib/table/rte_swx_table_selector.h -index 62988d2856..05863cc90b 100644 ---- a/lib/table/rte_swx_table_selector.h -+++ b/lib/table/rte_swx_table_selector.h -@@ -155,7 +155,7 @@ rte_swx_table_selector_group_set(void *table, - * mechanism allows for multiple concurrent select operations into the same table. - * - * The typical reason an implementation may choose to split the operation into multiple steps is to -- * hide the latency of the inherrent memory read operations: before a read operation with the -+ * hide the latency of the inherent memory read operations: before a read operation with the - * source data likely not in the CPU cache, the source data prefetch is issued and the operation is - * postponed in favor of some other unrelated work, which the CPU executes in parallel with the - * source data being fetched into the CPU cache; later on, the operation is resumed, this time with -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index a7483167d4..e5ccfe47f7 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -534,7 +534,7 @@ telemetry_legacy_init(void) - } - rc = pthread_create(&t_old, NULL, socket_listener, &v1_socket); - if (rc != 0) { -- TMTY_LOG(ERR, "Error with create legcay socket thread: %s\n", -+ TMTY_LOG(ERR, "Error with create legacy socket thread: %s\n", - strerror(rc)); - close(v1_socket.sock); - v1_socket.sock = -1; -diff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h -index f02a12f5b0..db70690274 100644 ---- a/lib/telemetry/telemetry_json.h -+++ b/lib/telemetry/telemetry_json.h -@@ -23,7 +23,7 @@ - /** - * @internal - * Copies a value into a buffer if the buffer has enough available space. -- * Nothing written to buffer if an overflow ocurs. -+ * Nothing written to buffer if an overflow occurs. - * This function is not for use for values larger than given buffer length. - */ - __rte_format_printf(3, 4) -diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c -index 550b0ee8b5..9b690dc81e 100644 ---- a/lib/vhost/vhost_user.c -+++ b/lib/vhost/vhost_user.c -@@ -1115,7 +1115,7 @@ vhost_user_postcopy_region_register(struct virtio_net *dev, - struct uffdio_register reg_struct; - - /* -- * Let's register all the mmap'ed area to ensure -+ * Let's register all the mmapped area to ensure - * alignment on page boundary. - */ - reg_struct.range.start = (uint64_t)(uintptr_t)reg->mmap_addr; -@@ -1177,7 +1177,7 @@ vhost_user_postcopy_register(struct virtio_net *dev, int main_fd, - msg->fd_num = 0; - send_vhost_reply(main_fd, msg); - -- /* Wait for qemu to acknolwedge it's got the addresses -+ /* Wait for qemu to acknowledge it got the addresses - * we've got to wait before we're allowed to generate faults. - */ - if (read_vhost_message(main_fd, &ack_msg) <= 0) { --- -2.23.0 - diff --git a/0169-net-hns3-add-VLAN-filter-query-in-dump-file.patch b/0169-net-hns3-add-VLAN-filter-query-in-dump-file.patch deleted file mode 100644 index ed99963..0000000 --- a/0169-net-hns3-add-VLAN-filter-query-in-dump-file.patch +++ /dev/null @@ -1,158 +0,0 @@ -From 11186d5e167f1b11c436f0ca550789e855d5292c Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 21 Oct 2022 15:36:45 +0800 -Subject: [PATCH 169/189] net/hns3: add VLAN filter query in dump file - -Add VLAN filter query in dump file. - -Signed-off-by: Dongdong Liu -Signed-off-by: Min Hu (Connor) ---- - drivers/net/hns3/hns3_dump.c | 80 +++++++++++++++++++++++++++++++----- - 1 file changed, 69 insertions(+), 11 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 1007b09bd2..8268506f6f 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -4,11 +4,10 @@ - - #include - --#include "hns3_ethdev.h" - #include "hns3_common.h" --#include "hns3_rxtx.h" --#include "hns3_regs.h" - #include "hns3_logs.h" -+#include "hns3_regs.h" -+#include "hns3_rxtx.h" - #include "hns3_dump.h" - - #define HNS3_BD_DW_NUM 8 -@@ -394,11 +393,6 @@ hns3_get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev) - uint32_t nb_tx_queues; - uint32_t bitmap_size; - -- bitmap_size = (hw->tqps_num * sizeof(uint32_t) + HNS3_UINT32_BIT) / -- HNS3_UINT32_BIT; -- rx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); -- tx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); -- - nb_rx_queues = dev->data->nb_rx_queues; - nb_tx_queues = dev->data->nb_tx_queues; - if (nb_rx_queues == 0) { -@@ -410,6 +404,21 @@ hns3_get_rxtx_queue_enable_state(FILE *file, struct rte_eth_dev *dev) - return; - } - -+ bitmap_size = (hw->tqps_num * sizeof(uint32_t) + HNS3_UINT32_BIT) / -+ HNS3_UINT32_BIT; -+ rx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); -+ if (rx_queue_state == NULL) { -+ hns3_err(hw, "Failed to allocate memory for rx queue state!"); -+ return; -+ } -+ -+ tx_queue_state = (uint32_t *)rte_zmalloc(NULL, bitmap_size, 0); -+ if (tx_queue_state == NULL) { -+ hns3_err(hw, "Failed to allocate memory for tx queue state!"); -+ rte_free(rx_queue_state); -+ return; -+ } -+ - fprintf(file, "\t -- enable state:\n"); - hns3_get_queue_enable_state(hw, rx_queue_state, nb_rx_queues, true); - hns3_display_queue_enable_state(file, rx_queue_state, nb_rx_queues, -@@ -448,6 +457,51 @@ hns3_get_rxtx_queue_info(FILE *file, struct rte_eth_dev *dev) - hns3_get_rxtx_queue_enable_state(file, dev); - } - -+static int -+hns3_get_vlan_filter_cfg(FILE *file, struct hns3_hw *hw) -+{ -+#define HNS3_FILTER_TYPE_VF 0 -+#define HNS3_FILTER_TYPE_PORT 1 -+#define HNS3_FILTER_FE_NIC_INGRESS_B BIT(0) -+#define HNS3_FILTER_FE_NIC_EGRESS_B BIT(1) -+ struct hns3_vlan_filter_ctrl_cmd *req; -+ struct hns3_cmd_desc desc; -+ uint8_t i; -+ int ret; -+ -+ static const uint32_t vlan_filter_type[] = { -+ HNS3_FILTER_TYPE_PORT, -+ HNS3_FILTER_TYPE_VF -+ }; -+ -+ for (i = 0; i < RTE_DIM(vlan_filter_type); i++) { -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_VLAN_FILTER_CTRL, -+ true); -+ req = (struct hns3_vlan_filter_ctrl_cmd *)desc.data; -+ req->vlan_type = vlan_filter_type[i]; -+ req->vf_id = HNS3_PF_FUNC_ID; -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret != 0) { -+ hns3_err(hw, -+ "NIC IMP exec ret=%d desc_num=%d optcode=0x%x!", -+ ret, 1, rte_le_to_cpu_16(desc.opcode)); -+ return ret; -+ } -+ fprintf(file, -+ "\t -- %s VLAN filter configuration\n" -+ "\t nic_ingress :%s\n" -+ "\t nic_egress :%s\n", -+ req->vlan_type == HNS3_FILTER_TYPE_PORT ? -+ "Port" : "VF", -+ req->vlan_fe & HNS3_FILTER_FE_NIC_INGRESS_B ? -+ "Enable" : "Disable", -+ req->vlan_fe & HNS3_FILTER_FE_NIC_EGRESS_B ? -+ "Enable" : "Disable"); -+ } -+ -+ return 0; -+} -+ - static int - hns3_get_vlan_rx_offload_cfg(FILE *file, struct hns3_hw *hw) - { -@@ -583,6 +637,10 @@ hns3_get_vlan_config_info(FILE *file, struct hns3_hw *hw) - int ret; - - fprintf(file, " - VLAN Config Info:\n"); -+ ret = hns3_get_vlan_filter_cfg(file, hw); -+ if (ret < 0) -+ return; -+ - ret = hns3_get_vlan_rx_offload_cfg(file, hw); - if (ret < 0) - return; -@@ -619,7 +677,7 @@ hns3_get_tm_conf_port_node_info(FILE *file, struct hns3_tm_conf *conf) - return; - - fprintf(file, -- " port_node: \n" -+ " port_node:\n" - " node_id=%u reference_count=%u shaper_profile_id=%d\n", - conf->root->id, conf->root->reference_count, - conf->root->shaper_profile ? -@@ -637,7 +695,7 @@ hns3_get_tm_conf_tc_node_info(FILE *file, struct hns3_tm_conf *conf) - if (conf->nb_tc_node == 0) - return; - -- fprintf(file, " tc_node: \n"); -+ fprintf(file, " tc_node:\n"); - memset(tc_node, 0, sizeof(tc_node)); - TAILQ_FOREACH(tm_node, tc_list, node) { - tidx = hns3_tm_calc_node_tc_no(conf, tm_node->id); -@@ -705,7 +763,7 @@ hns3_get_tm_conf_queue_node_info(FILE *file, struct hns3_tm_conf *conf, - return; - - fprintf(file, -- " queue_node: \n" -+ " queue_node:\n" - " tx queue id | mapped tc (8 mean node not exist)\n"); - - memset(queue_node, 0, sizeof(queue_node)); --- -2.23.0 - diff --git a/0170-net-bonding-fix-array-overflow-in-Rx-burst.patch b/0170-net-bonding-fix-array-overflow-in-Rx-burst.patch deleted file mode 100644 index fb901ba..0000000 --- a/0170-net-bonding-fix-array-overflow-in-Rx-burst.patch +++ /dev/null @@ -1,39 +0,0 @@ -From a087560ab1d0e5920f77859f5a06245cc5d7bafe Mon Sep 17 00:00:00 2001 -From: Yunjian Wang -Date: Fri, 21 Oct 2022 15:36:46 +0800 -Subject: [PATCH 170/189] net/bonding: fix array overflow in Rx burst - -In bond_ethdev_rx_burst() function, we check the validity of the -'active_slave' as this code: -if (++active_slave == slave_count) - active_slave = 0; -However, the value of 'active_slave' maybe equal to 'slave_count', -when a slave is down. This is wrong and it can cause buffer overflow. -This patch fixes the issue by using '>=' instead of '=='. - -Fixes: e1110e977648 ("net/bonding: fix Rx slave fairness") -Cc: stable@dpdk.org - -Signed-off-by: Lei Ji -Signed-off-by: Yunjian Wang -Acked-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 09636321cd..828fb5f96d 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -82,7 +82,7 @@ bond_ethdev_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - bufs + num_rx_total, nb_pkts); - num_rx_total += num_rx_slave; - nb_pkts -= num_rx_slave; -- if (++active_slave == slave_count) -+ if (++active_slave >= slave_count) - active_slave = 0; - } - --- -2.23.0 - diff --git a/0171-net-bonding-fix-double-slave-link-status-query.patch b/0171-net-bonding-fix-double-slave-link-status-query.patch deleted file mode 100644 index 4470d8d..0000000 --- a/0171-net-bonding-fix-double-slave-link-status-query.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 7ec0325f9c2bfe2ea961e66588f8ba9e22bb6483 Mon Sep 17 00:00:00 2001 -From: Yunjian Wang -Date: Fri, 21 Oct 2022 15:36:47 +0800 -Subject: [PATCH 171/189] net/bonding: fix double slave link status query - -When link status polling mode is used, the slave link status is -queried twice, which may be inconsistent. To fix this, we can keep -the latest queried link state. - -Fixes: a45b288ef21a ("bond: support link status polling") -Cc: stable@dpdk.org - -Signed-off-by: Yunjian Wang -Acked-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 828fb5f96d..3be2b08128 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -2400,9 +2400,6 @@ bond_ethdev_slave_link_status_change_monitor(void *cb_arg) - * event callback */ - if (slave_ethdev->data->dev_link.link_status != - internals->slaves[i].last_link_status) { -- internals->slaves[i].last_link_status = -- slave_ethdev->data->dev_link.link_status; -- - bond_ethdev_lsc_event_callback(internals->slaves[i].port_id, - RTE_ETH_EVENT_INTR_LSC, - &bonded_ethdev->data->port_id, -@@ -2901,7 +2898,7 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type, - - uint8_t lsc_flag = 0; - int valid_slave = 0; -- uint16_t active_pos; -+ uint16_t active_pos, slave_idx; - uint16_t i; - - if (type != RTE_ETH_EVENT_INTR_LSC || param == NULL) -@@ -2922,6 +2919,7 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type, - for (i = 0; i < internals->slave_count; i++) { - if (internals->slaves[i].port_id == port_id) { - valid_slave = 1; -+ slave_idx = i; - break; - } - } -@@ -3010,6 +3008,7 @@ bond_ethdev_lsc_event_callback(uint16_t port_id, enum rte_eth_event_type type, - * slaves - */ - bond_ethdev_link_update(bonded_eth_dev, 0); -+ internals->slaves[slave_idx].last_link_status = link.link_status; - - if (lsc_flag) { - /* Cancel any possible outstanding interrupts if delays are enabled */ --- -2.23.0 - diff --git a/0172-app-testpmd-fix-supported-RSS-offload-display.patch b/0172-app-testpmd-fix-supported-RSS-offload-display.patch deleted file mode 100644 index 26d4294..0000000 --- a/0172-app-testpmd-fix-supported-RSS-offload-display.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 4ba54bf73c3f5038f03163d70e60d43e968878d5 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:48 +0800 -Subject: [PATCH 172/189] app/testpmd: fix supported RSS offload display - -The rte_eth_dev_info.flow_type_rss_offloads is populated in terms of -RTE_ETH_RSS_* bits. If PMD sets RTE_ETH_RSS_L3_SRC_ONLY to -dev_info->flow_type_rss_offloads. testpmd will display "user defined 63" -when run 'show port info 0'. Because testpmd use flowtype_to_str() -to display the supported RSS offload of PMD. In fact, the function is -used to display flow type in FDIR commands for i40e or ixgbe. This patch -uses the RTE_ETH_RSS_* bits to display supported RSS offload of PMD. - -Fixes: b12964f621dc ("ethdev: unification of RSS offload types") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Ferruh Yigit ---- - app/test-pmd/config.c | 40 ++++++++++++++++++++++++++-------------- - app/test-pmd/testpmd.h | 2 ++ - 2 files changed, 28 insertions(+), 14 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index a7fffc3d1d..2849ee7e7c 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -66,8 +66,6 @@ - - #define NS_PER_SEC 1E9 - --static char *flowtype_to_str(uint16_t flow_type); -- - static const struct { - enum tx_pkt_split split; - const char *name; -@@ -674,6 +672,19 @@ print_dev_capabilities(uint64_t capabilities) - } - } - -+const char * -+rsstypes_to_str(uint64_t rss_type) -+{ -+ uint16_t i; -+ -+ for (i = 0; rss_type_table[i].str != NULL; i++) { -+ if (rss_type_table[i].rss_type == rss_type) -+ return rss_type_table[i].str; -+ } -+ -+ return NULL; -+} -+ - void - port_infos_display(portid_t port_id) - { -@@ -778,19 +789,20 @@ port_infos_display(portid_t port_id) - if (!dev_info.flow_type_rss_offloads) - printf("No RSS offload flow type is supported.\n"); - else { -+ uint64_t rss_offload_types = dev_info.flow_type_rss_offloads; - uint16_t i; -- char *p; - - printf("Supported RSS offload flow types:\n"); -- for (i = RTE_ETH_FLOW_UNKNOWN + 1; -- i < sizeof(dev_info.flow_type_rss_offloads) * CHAR_BIT; i++) { -- if (!(dev_info.flow_type_rss_offloads & (1ULL << i))) -- continue; -- p = flowtype_to_str(i); -- if (p) -- printf(" %s\n", p); -- else -- printf(" user defined %d\n", i); -+ for (i = 0; i < sizeof(rss_offload_types) * CHAR_BIT; i++) { -+ uint64_t rss_offload = RTE_BIT64(i); -+ if ((rss_offload_types & rss_offload) != 0) { -+ const char *p = rsstypes_to_str(rss_offload); -+ if (p) -+ printf(" %s\n", p); -+ else -+ printf(" user defined %u\n", -+ i); -+ } - } - } - -@@ -4811,6 +4823,8 @@ set_record_burst_stats(uint8_t on_off) - record_burst_stats = on_off; - } - -+#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE) -+ - static char* - flowtype_to_str(uint16_t flow_type) - { -@@ -4854,8 +4868,6 @@ flowtype_to_str(uint16_t flow_type) - return NULL; - } - --#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE) -- - static inline void - print_fdir_mask(struct rte_eth_fdir_masks *mask) - { -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 569b4300cf..d6a775c485 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -1105,6 +1105,8 @@ extern int flow_parse(const char *src, void *result, unsigned int size, - struct rte_flow_item **pattern, - struct rte_flow_action **actions); - -+const char *rsstypes_to_str(uint64_t rss_type); -+ - /* - * Work-around of a compilation error with ICC on invocations of the - * rte_be_to_cpu_16() function. --- -2.23.0 - diff --git a/0173-app-testpmd-unify-name-of-L2-payload-offload.patch b/0173-app-testpmd-unify-name-of-L2-payload-offload.patch deleted file mode 100644 index 383ce7d..0000000 --- a/0173-app-testpmd-unify-name-of-L2-payload-offload.patch +++ /dev/null @@ -1,71 +0,0 @@ -From d1bfba3efc17445439ba794a63643a57b9b5be5a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:49 +0800 -Subject: [PATCH 173/189] app/testpmd: unify name of L2 payload offload - -Currently, the "port config all rss xx" command uses 'ether' name to match -and to set 'RTE_ETH_RSS_L2_PAYLOAD' offload. However, others RSS command, -such as, "port config rss-hash-key" and "show port -rss-hash key", use 'l2-payload' to represent this offload. So this patch -unifies the name of 'RTE_ETH_RSS_L2_PAYLOAD' offload. - -Signed-off-by: Huisong Li -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 12 ++++++------ - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +- - 2 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 26d95e64e0..c5e4c30c9f 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -793,8 +793,8 @@ static void cmd_help_long_parsed(void *parsed_result, - "receive buffers available.\n\n" - - "port config all rss (all|default|ip|tcp|udp|sctp|" -- "ether|port|vxlan|geneve|nvgre|vxlan-gpe|ecpri|mpls|none|level-default|" -- "level-outer|level-inner|)\n" -+ "l2-payload|port|vxlan|geneve|nvgre|vxlan-gpe|ecpri|mpls|ipv4-chksum|" -+ "none|level-default|level-outer|level-inner|)\n" - " Set the RSS mode.\n\n" - - "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" -@@ -2187,7 +2187,7 @@ cmd_config_rss_parsed(void *parsed_result, - rss_conf.rss_hf = RTE_ETH_RSS_TCP; - else if (!strcmp(res->value, "sctp")) - rss_conf.rss_hf = RTE_ETH_RSS_SCTP; -- else if (!strcmp(res->value, "ether")) -+ else if (!strcmp(res->value, "l2_payload")) - rss_conf.rss_hf = RTE_ETH_RSS_L2_PAYLOAD; - else if (!strcmp(res->value, "port")) - rss_conf.rss_hf = RTE_ETH_RSS_PORT; -@@ -2308,9 +2308,9 @@ cmdline_parse_inst_t cmd_config_rss = { - .f = cmd_config_rss_parsed, - .data = NULL, - .help_str = "port config all rss " -- "all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|" -- "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|none|level-default|" -- "level-outer|level-inner|ipv4-chksum|", -+ "all|default|eth|vlan|ip|tcp|udp|sctp|l2-payload|port|vxlan|geneve|" -+ "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|ipv4-chksum|" -+ "none|level-default|level-outer|level-inner|", - .tokens = { - (void *)&cmd_config_rss_port, - (void *)&cmd_config_rss_keyword, -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index 94792d88cc..b75adcce55 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -2285,7 +2285,7 @@ port config - RSS - - Set the RSS (Receive Side Scaling) mode on or off:: - -- testpmd> port config all rss (all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|none) -+ testpmd> port config all rss (all|default|eth|vlan|ip|tcp|udp|sctp|l2-payload|port|vxlan|geneve|nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|none) - - RSS is on by default. - --- -2.23.0 - diff --git a/0174-app-testpmd-refactor-config-all-RSS-command.patch b/0174-app-testpmd-refactor-config-all-RSS-command.patch deleted file mode 100644 index a7ee60a..0000000 --- a/0174-app-testpmd-refactor-config-all-RSS-command.patch +++ /dev/null @@ -1,251 +0,0 @@ -From 860c15e4347ca38d50f4ce9d3f00e744f090e4e8 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:50 +0800 -Subject: [PATCH 174/189] app/testpmd: refactor config all RSS command - -The "port config rss-hash-key" and "show port -rss-hash key" commands both use the 'rss_type_table[]' to get -'rss_types' or the RSS type name. So this patch uses the -'rss_type_table[]' to get the RSS types. In this way, this command -naturally supports more individual types. - -Suggested-by: Ferruh Yigit -Signed-off-by: Huisong Li -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 120 ++++++-------------- - app/test-pmd/config.c | 20 +++- - app/test-pmd/testpmd.h | 1 + - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 10 +- - 4 files changed, 58 insertions(+), 93 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index c5e4c30c9f..6cb095f965 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -792,9 +792,14 @@ static void cmd_help_long_parsed(void *parsed_result, - " Enable or disable packet drop on all RX queues of all ports when no " - "receive buffers available.\n\n" - -- "port config all rss (all|default|ip|tcp|udp|sctp|" -- "l2-payload|port|vxlan|geneve|nvgre|vxlan-gpe|ecpri|mpls|ipv4-chksum|" -- "none|level-default|level-outer|level-inner|)\n" -+ "port config all rss (all|default|level-default|level-outer|level-inner|" -+ "ip|tcp|udp|sctp|tunnel|vlan|none|" -+ "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" -+ "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|" -+ "l2-payload|port|vxlan|geneve|nvgre|gtpu|eth|s-vlan|c-vlan|" -+ "esp|ah|l2tpv3|pfcp|pppoe|ecpri|mpls|ipv4-chksum|l4-chksum|" -+ "l3-pre96|l3-pre64|l3-pre56|l3-pre48|l3-pre40|l3-pre32|" -+ "l2-dst-only|l2-src-only|l4-dst-only|l4-src-only|l3-dst-only|l3-src-only|)\n" - " Set the RSS mode.\n\n" - - "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" -@@ -2169,79 +2174,7 @@ cmd_config_rss_parsed(void *parsed_result, - uint16_t i; - int ret; - -- if (!strcmp(res->value, "all")) -- rss_conf.rss_hf = RTE_ETH_RSS_ETH | RTE_ETH_RSS_VLAN | RTE_ETH_RSS_IP | -- RTE_ETH_RSS_TCP | RTE_ETH_RSS_UDP | RTE_ETH_RSS_SCTP | -- RTE_ETH_RSS_L2_PAYLOAD | RTE_ETH_RSS_L2TPV3 | RTE_ETH_RSS_ESP | -- RTE_ETH_RSS_AH | RTE_ETH_RSS_PFCP | RTE_ETH_RSS_GTPU | -- RTE_ETH_RSS_ECPRI; -- else if (!strcmp(res->value, "eth")) -- rss_conf.rss_hf = RTE_ETH_RSS_ETH; -- else if (!strcmp(res->value, "vlan")) -- rss_conf.rss_hf = RTE_ETH_RSS_VLAN; -- else if (!strcmp(res->value, "ip")) -- rss_conf.rss_hf = RTE_ETH_RSS_IP; -- else if (!strcmp(res->value, "udp")) -- rss_conf.rss_hf = RTE_ETH_RSS_UDP; -- else if (!strcmp(res->value, "tcp")) -- rss_conf.rss_hf = RTE_ETH_RSS_TCP; -- else if (!strcmp(res->value, "sctp")) -- rss_conf.rss_hf = RTE_ETH_RSS_SCTP; -- else if (!strcmp(res->value, "l2_payload")) -- rss_conf.rss_hf = RTE_ETH_RSS_L2_PAYLOAD; -- else if (!strcmp(res->value, "port")) -- rss_conf.rss_hf = RTE_ETH_RSS_PORT; -- else if (!strcmp(res->value, "vxlan")) -- rss_conf.rss_hf = RTE_ETH_RSS_VXLAN; -- else if (!strcmp(res->value, "geneve")) -- rss_conf.rss_hf = RTE_ETH_RSS_GENEVE; -- else if (!strcmp(res->value, "nvgre")) -- rss_conf.rss_hf = RTE_ETH_RSS_NVGRE; -- else if (!strcmp(res->value, "l3-pre32")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE32; -- else if (!strcmp(res->value, "l3-pre40")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE40; -- else if (!strcmp(res->value, "l3-pre48")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE48; -- else if (!strcmp(res->value, "l3-pre56")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE56; -- else if (!strcmp(res->value, "l3-pre64")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE64; -- else if (!strcmp(res->value, "l3-pre96")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_PRE96; -- else if (!strcmp(res->value, "l3-src-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_SRC_ONLY; -- else if (!strcmp(res->value, "l3-dst-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L3_DST_ONLY; -- else if (!strcmp(res->value, "l4-src-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L4_SRC_ONLY; -- else if (!strcmp(res->value, "l4-dst-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L4_DST_ONLY; -- else if (!strcmp(res->value, "l2-src-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L2_SRC_ONLY; -- else if (!strcmp(res->value, "l2-dst-only")) -- rss_conf.rss_hf = RTE_ETH_RSS_L2_DST_ONLY; -- else if (!strcmp(res->value, "l2tpv3")) -- rss_conf.rss_hf = RTE_ETH_RSS_L2TPV3; -- else if (!strcmp(res->value, "esp")) -- rss_conf.rss_hf = RTE_ETH_RSS_ESP; -- else if (!strcmp(res->value, "ah")) -- rss_conf.rss_hf = RTE_ETH_RSS_AH; -- else if (!strcmp(res->value, "pfcp")) -- rss_conf.rss_hf = RTE_ETH_RSS_PFCP; -- else if (!strcmp(res->value, "pppoe")) -- rss_conf.rss_hf = RTE_ETH_RSS_PPPOE; -- else if (!strcmp(res->value, "gtpu")) -- rss_conf.rss_hf = RTE_ETH_RSS_GTPU; -- else if (!strcmp(res->value, "ecpri")) -- rss_conf.rss_hf = RTE_ETH_RSS_ECPRI; -- else if (!strcmp(res->value, "mpls")) -- rss_conf.rss_hf = RTE_ETH_RSS_MPLS; -- else if (!strcmp(res->value, "ipv4-chksum")) -- rss_conf.rss_hf = RTE_ETH_RSS_IPV4_CHKSUM; -- else if (!strcmp(res->value, "none")) -- rss_conf.rss_hf = 0; -- else if (!strcmp(res->value, "level-default")) { -+ if (!strcmp(res->value, "level-default")) { - rss_hf &= (~RTE_ETH_RSS_LEVEL_MASK); - rss_conf.rss_hf = (rss_hf | RTE_ETH_RSS_LEVEL_PMD_DEFAULT); - } else if (!strcmp(res->value, "level-outer")) { -@@ -2250,14 +2183,24 @@ cmd_config_rss_parsed(void *parsed_result, - } else if (!strcmp(res->value, "level-inner")) { - rss_hf &= (~RTE_ETH_RSS_LEVEL_MASK); - rss_conf.rss_hf = (rss_hf | RTE_ETH_RSS_LEVEL_INNERMOST); -- } else if (!strcmp(res->value, "default")) -+ } else if (!strcmp(res->value, "default")) { - use_default = 1; -- else if (isdigit(res->value[0]) && atoi(res->value) > 0 && -- atoi(res->value) < 64) -- rss_conf.rss_hf = 1ULL << atoi(res->value); -- else { -- fprintf(stderr, "Unknown parameter\n"); -- return; -+ } else if (isdigit(res->value[0])) { -+ int value = atoi(res->value); -+ if (value > 0 && value < 64) -+ rss_conf.rss_hf = 1ULL << (uint8_t)value; -+ else { -+ fprintf(stderr, "flowtype_id should be greater than 0 and less than 64.\n"); -+ return; -+ } -+ } else if (!strcmp(res->value, "none")) { -+ rss_conf.rss_hf = 0; -+ } else { -+ rss_conf.rss_hf = str_to_rsstypes(res->value); -+ if (rss_conf.rss_hf == 0) { -+ fprintf(stderr, "Unknown parameter\n"); -+ return; -+ } - } - rss_conf.rss_key = NULL; - /* Update global configuration for RSS types. */ -@@ -2308,9 +2251,14 @@ cmdline_parse_inst_t cmd_config_rss = { - .f = cmd_config_rss_parsed, - .data = NULL, - .help_str = "port config all rss " -- "all|default|eth|vlan|ip|tcp|udp|sctp|l2-payload|port|vxlan|geneve|" -- "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|ipv4-chksum|" -- "none|level-default|level-outer|level-inner|", -+ "all|default|level-default|level-outer|level-inner|" -+ "ip|tcp|udp|sctp|tunnel|vlan|none|" -+ "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|" -+ "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|" -+ "l2-payload|port|vxlan|geneve|nvgre|gtpu|eth|s-vlan|c-vlan|" -+ "esp|ah|l2tpv3|pfcp|pppoe|ecpri|mpls|ipv4-chksum|l4-chksum|" -+ "l3-pre96|l3-pre64|l3-pre56|l3-pre48|l3-pre40|l3-pre32|" -+ "l2-dst-only|l2-src-only|l4-dst-only|l4-src-only|l3-dst-only|l3-src-only|", - .tokens = { - (void *)&cmd_config_rss_port, - (void *)&cmd_config_rss_keyword, -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 2849ee7e7c..b08face76d 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -672,6 +672,19 @@ print_dev_capabilities(uint64_t capabilities) - } - } - -+uint64_t -+str_to_rsstypes(const char *str) -+{ -+ uint16_t i; -+ -+ for (i = 0; rss_type_table[i].str != NULL; i++) { -+ if (strcmp(rss_type_table[i].str, str) == 0) -+ return rss_type_table[i].rss_type; -+ } -+ -+ return 0; -+} -+ - const char * - rsstypes_to_str(uint64_t rss_type) - { -@@ -3063,15 +3076,10 @@ port_rss_hash_key_update(portid_t port_id, char rss_type[], uint8_t *hash_key, - { - struct rte_eth_rss_conf rss_conf; - int diag; -- unsigned int i; - - rss_conf.rss_key = NULL; - rss_conf.rss_key_len = 0; -- rss_conf.rss_hf = 0; -- for (i = 0; rss_type_table[i].str; i++) { -- if (!strcmp(rss_type_table[i].str, rss_type)) -- rss_conf.rss_hf = rss_type_table[i].rss_type; -- } -+ rss_conf.rss_hf = str_to_rsstypes(rss_type); - diag = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf); - if (diag == 0) { - rss_conf.rss_key = hash_key; -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index d6a775c485..e50188778b 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -1105,6 +1105,7 @@ extern int flow_parse(const char *src, void *result, unsigned int size, - struct rte_flow_item **pattern, - struct rte_flow_action **actions); - -+uint64_t str_to_rsstypes(const char *str); - const char *rsstypes_to_str(uint64_t rss_type); - - /* -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index b75adcce55..e15dc0c4c4 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -2285,7 +2285,15 @@ port config - RSS - - Set the RSS (Receive Side Scaling) mode on or off:: - -- testpmd> port config all rss (all|default|eth|vlan|ip|tcp|udp|sctp|l2-payload|port|vxlan|geneve|nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|ecpri|mpls|none) -+ testpmd> port config all rss (all|default|level-default|level-outer|level-inner| \ -+ ip|tcp|udp|sctp|tunnel|vlan|none| \ -+ ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other| \ -+ ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp| \ -+ ipv6-other|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex| \ -+ l2-payload|port|vxlan|geneve|nvgre|gtpu|eth|s-vlan|c-vlan| \ -+ esp|ah|l2tpv3|pfcp|pppoe|ecpri|mpls|ipv4-chksum|l4-chksum| \ -+ l3-pre96|l3-pre64|l3-pre56|l3-pre48|l3-pre40|l3-pre32| \ -+ l2-dst-only|l2-src-only|l4-dst-only|l4-src-only|l3-dst-only|l3-src-only|) - - RSS is on by default. - --- -2.23.0 - diff --git a/0175-app-testpmd-unify-RSS-types-display.patch b/0175-app-testpmd-unify-RSS-types-display.patch deleted file mode 100644 index 80c5273..0000000 --- a/0175-app-testpmd-unify-RSS-types-display.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 6515c3f93ea7b5f5ef79f32ca7360b9edfc5e2ab Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:51 +0800 -Subject: [PATCH 175/189] app/testpmd: unify RSS types display - -The 'rss_type_table[]' maintains the name and value of RSS types. This -patch unifies a common interface to display RSS types. - -Signed-off-by: Huisong Li -Signed-off-by: Ferruh Yigit ---- - app/test-pmd/config.c | 34 ++++++++++++++++++++-------------- - 1 file changed, 20 insertions(+), 14 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index b08face76d..7b725fc7a1 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -1554,6 +1554,23 @@ port_flow_complain(struct rte_flow_error *error) - return -err; - } - -+static void -+rss_types_display(uint64_t rss_types) -+{ -+ uint16_t i; -+ -+ if (rss_types == 0) -+ return; -+ -+ for (i = 0; rss_type_table[i].str; i++) { -+ if (rss_type_table[i].rss_type == 0) -+ continue; -+ if ((rss_types & rss_type_table[i].rss_type) == -+ rss_type_table[i].rss_type) -+ printf(" %s", rss_type_table[i].str); -+ } -+} -+ - static void - rss_config_display(struct rte_flow_action_rss *rss_conf) - { -@@ -1596,13 +1613,7 @@ rss_config_display(struct rte_flow_action_rss *rss_conf) - printf(" none\n"); - return; - } -- for (i = 0; rss_type_table[i].str; i++) { -- if ((rss_conf->types & -- rss_type_table[i].rss_type) == -- rss_type_table[i].rss_type && -- rss_type_table[i].rss_type != 0) -- printf(" %s\n", rss_type_table[i].str); -- } -+ rss_types_display(rss_conf->types); - } - - static struct port_indirect_action * -@@ -3054,13 +3065,8 @@ port_rss_hash_conf_show(portid_t port_id, int show_rss_key) - printf("RSS disabled\n"); - return; - } -- printf("RSS functions:\n "); -- for (i = 0; rss_type_table[i].str; i++) { -- if (rss_type_table[i].rss_type == 0) -- continue; -- if ((rss_hf & rss_type_table[i].rss_type) == rss_type_table[i].rss_type) -- printf("%s ", rss_type_table[i].str); -- } -+ printf("RSS functions:\n"); -+ rss_types_display(rss_hf); - printf("\n"); - if (!show_rss_key) - return; --- -2.23.0 - diff --git a/0176-app-testpmd-compact-RSS-types-output.patch b/0176-app-testpmd-compact-RSS-types-output.patch deleted file mode 100644 index 1f44146..0000000 --- a/0176-app-testpmd-compact-RSS-types-output.patch +++ /dev/null @@ -1,165 +0,0 @@ -From ce06141d60c64963a7dc02fbdd9b2229d38a6819 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Fri, 21 Oct 2022 15:36:52 +0800 -Subject: [PATCH 176/189] app/testpmd: compact RSS types output - -In port info command output, 'show port info all', supported RSS offload -types printed one type per line, and although this information is not -most important part of the command it takes big part of the command -output. - -In port RSS hash and flow RSS command output, 'show port 0 rss-hash', -and 'flow query 0 0 rss', all enabled RSS types are printed on one line. -If there are many types, the print will be very long. - -Compacting these RSS offloads and types output by fixing the length of -the character string printed on each line, instead of one per line or -one line. -Output becomes as following: - -Supported RSS offload flow types: - ipv4-frag ipv4-tcp ipv4-udp ipv4-sctp ipv4-other - ipv6-frag ipv6-tcp ipv6-udp ipv6-sctp ipv6-other - l4-dst-only l4-src-only l3-dst-only l3-src-only - -Signed-off-by: Ferruh Yigit -Signed-off-by: Huisong Li ---- - app/test-pmd/config.c | 68 +++++++++++++++++++++++++++++++----------- - app/test-pmd/testpmd.h | 2 ++ - 2 files changed, 52 insertions(+), 18 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 7b725fc7a1..873cca6f3e 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -698,6 +698,38 @@ rsstypes_to_str(uint64_t rss_type) - return NULL; - } - -+static void -+rss_offload_types_display(uint64_t offload_types, uint16_t char_num_per_line) -+{ -+ uint16_t user_defined_str_len; -+ uint16_t total_len = 0; -+ uint16_t str_len = 0; -+ uint64_t rss_offload; -+ uint16_t i; -+ -+ for (i = 0; i < sizeof(offload_types) * CHAR_BIT; i++) { -+ rss_offload = RTE_BIT64(i); -+ if ((offload_types & rss_offload) != 0) { -+ const char *p = rsstypes_to_str(rss_offload); -+ -+ user_defined_str_len = -+ strlen("user-defined-") + (i / 10 + 1); -+ str_len = p ? strlen(p) : user_defined_str_len; -+ str_len += 2; /* add two spaces */ -+ if (total_len + str_len >= char_num_per_line) { -+ total_len = 0; -+ printf("\n"); -+ } -+ -+ if (p) -+ printf(" %s", p); -+ else -+ printf(" user-defined-%u", i); -+ total_len += str_len; -+ } -+ } -+} -+ - void - port_infos_display(portid_t port_id) - { -@@ -802,21 +834,10 @@ port_infos_display(portid_t port_id) - if (!dev_info.flow_type_rss_offloads) - printf("No RSS offload flow type is supported.\n"); - else { -- uint64_t rss_offload_types = dev_info.flow_type_rss_offloads; -- uint16_t i; -- - printf("Supported RSS offload flow types:\n"); -- for (i = 0; i < sizeof(rss_offload_types) * CHAR_BIT; i++) { -- uint64_t rss_offload = RTE_BIT64(i); -- if ((rss_offload_types & rss_offload) != 0) { -- const char *p = rsstypes_to_str(rss_offload); -- if (p) -- printf(" %s\n", p); -- else -- printf(" user defined %u\n", -- i); -- } -- } -+ rss_offload_types_display(dev_info.flow_type_rss_offloads, -+ TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); -+ printf("\n"); - } - - printf("Minimum size of RX buffer: %u\n", dev_info.min_rx_bufsize); -@@ -1555,8 +1576,10 @@ port_flow_complain(struct rte_flow_error *error) - } - - static void --rss_types_display(uint64_t rss_types) -+rss_types_display(uint64_t rss_types, uint16_t char_num_per_line) - { -+ uint16_t total_len = 0; -+ uint16_t str_len; - uint16_t i; - - if (rss_types == 0) -@@ -1565,9 +1588,18 @@ rss_types_display(uint64_t rss_types) - for (i = 0; rss_type_table[i].str; i++) { - if (rss_type_table[i].rss_type == 0) - continue; -+ - if ((rss_types & rss_type_table[i].rss_type) == -- rss_type_table[i].rss_type) -+ rss_type_table[i].rss_type) { -+ /* Contain two spaces */ -+ str_len = strlen(rss_type_table[i].str) + 2; -+ if (total_len + str_len > char_num_per_line) { -+ printf("\n"); -+ total_len = 0; -+ } - printf(" %s", rss_type_table[i].str); -+ total_len += str_len; -+ } - } - } - -@@ -1613,7 +1645,7 @@ rss_config_display(struct rte_flow_action_rss *rss_conf) - printf(" none\n"); - return; - } -- rss_types_display(rss_conf->types); -+ rss_types_display(rss_conf->types, TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); - } - - static struct port_indirect_action * -@@ -3066,7 +3098,7 @@ port_rss_hash_conf_show(portid_t port_id, int show_rss_key) - return; - } - printf("RSS functions:\n"); -- rss_types_display(rss_hf); -+ rss_types_display(rss_hf, TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); - printf("\n"); - if (!show_rss_key) - return; -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index e50188778b..9c3a5d9bc5 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -105,6 +105,8 @@ struct pkt_burst_stats { - unsigned int pkt_burst_spread[MAX_PKT_BURST + 1]; - }; - -+ -+#define TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE 64 - /** Information for a given RSS type. */ - struct rss_type_info { - const char *str; /**< Type name. */ --- -2.23.0 - diff --git a/0177-app-testpmd-reorder-RSS-type-table.patch b/0177-app-testpmd-reorder-RSS-type-table.patch deleted file mode 100644 index 863b080..0000000 --- a/0177-app-testpmd-reorder-RSS-type-table.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 00a08212bf6e1c96e491353183d3db9ffbcf3463 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:53 +0800 -Subject: [PATCH 177/189] app/testpmd: reorder RSS type table - -There are group and individual types in rss_type_table[]. However, group -types are very scattered, and individual types are not arranged based on -the bit number order in 'RTE_ETH_RSS_xxx'. For a clear distribution of -types and better maintenance, this patch reorders this table. - -Signed-off-by: Huisong Li -Acked-by: Ferruh Yigit ---- - app/test-pmd/config.c | 47 +++++++++++++++++++++++-------------------- - 1 file changed, 25 insertions(+), 22 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 873cca6f3e..f8cd135970 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -85,17 +85,20 @@ static const struct { - }; - - const struct rss_type_info rss_type_table[] = { -+ /* Group types */ - { "all", RTE_ETH_RSS_ETH | RTE_ETH_RSS_VLAN | RTE_ETH_RSS_IP | RTE_ETH_RSS_TCP | - RTE_ETH_RSS_UDP | RTE_ETH_RSS_SCTP | RTE_ETH_RSS_L2_PAYLOAD | - RTE_ETH_RSS_L2TPV3 | RTE_ETH_RSS_ESP | RTE_ETH_RSS_AH | RTE_ETH_RSS_PFCP | - RTE_ETH_RSS_GTPU | RTE_ETH_RSS_ECPRI | RTE_ETH_RSS_MPLS}, - { "none", 0 }, -- { "eth", RTE_ETH_RSS_ETH }, -- { "l2-src-only", RTE_ETH_RSS_L2_SRC_ONLY }, -- { "l2-dst-only", RTE_ETH_RSS_L2_DST_ONLY }, -+ { "ip", RTE_ETH_RSS_IP }, -+ { "udp", RTE_ETH_RSS_UDP }, -+ { "tcp", RTE_ETH_RSS_TCP }, -+ { "sctp", RTE_ETH_RSS_SCTP }, -+ { "tunnel", RTE_ETH_RSS_TUNNEL }, - { "vlan", RTE_ETH_RSS_VLAN }, -- { "s-vlan", RTE_ETH_RSS_S_VLAN }, -- { "c-vlan", RTE_ETH_RSS_C_VLAN }, -+ -+ /* Individual type */ - { "ipv4", RTE_ETH_RSS_IPV4 }, - { "ipv4-frag", RTE_ETH_RSS_FRAG_IPV4 }, - { "ipv4-tcp", RTE_ETH_RSS_NONFRAG_IPV4_TCP }, -@@ -116,32 +119,32 @@ const struct rss_type_info rss_type_table[] = { - { "vxlan", RTE_ETH_RSS_VXLAN }, - { "geneve", RTE_ETH_RSS_GENEVE }, - { "nvgre", RTE_ETH_RSS_NVGRE }, -- { "ip", RTE_ETH_RSS_IP }, -- { "udp", RTE_ETH_RSS_UDP }, -- { "tcp", RTE_ETH_RSS_TCP }, -- { "sctp", RTE_ETH_RSS_SCTP }, -- { "tunnel", RTE_ETH_RSS_TUNNEL }, -- { "l3-pre32", RTE_ETH_RSS_L3_PRE32 }, -- { "l3-pre40", RTE_ETH_RSS_L3_PRE40 }, -- { "l3-pre48", RTE_ETH_RSS_L3_PRE48 }, -- { "l3-pre56", RTE_ETH_RSS_L3_PRE56 }, -- { "l3-pre64", RTE_ETH_RSS_L3_PRE64 }, -- { "l3-pre96", RTE_ETH_RSS_L3_PRE96 }, -- { "l3-src-only", RTE_ETH_RSS_L3_SRC_ONLY }, -- { "l3-dst-only", RTE_ETH_RSS_L3_DST_ONLY }, -- { "l4-src-only", RTE_ETH_RSS_L4_SRC_ONLY }, -- { "l4-dst-only", RTE_ETH_RSS_L4_DST_ONLY }, -+ { "gtpu", RTE_ETH_RSS_GTPU }, -+ { "eth", RTE_ETH_RSS_ETH }, -+ { "s-vlan", RTE_ETH_RSS_S_VLAN }, -+ { "c-vlan", RTE_ETH_RSS_C_VLAN }, - { "esp", RTE_ETH_RSS_ESP }, - { "ah", RTE_ETH_RSS_AH }, - { "l2tpv3", RTE_ETH_RSS_L2TPV3 }, - { "pfcp", RTE_ETH_RSS_PFCP }, - { "pppoe", RTE_ETH_RSS_PPPOE }, -- { "gtpu", RTE_ETH_RSS_GTPU }, - { "ecpri", RTE_ETH_RSS_ECPRI }, - { "mpls", RTE_ETH_RSS_MPLS }, - { "ipv4-chksum", RTE_ETH_RSS_IPV4_CHKSUM }, - { "l4-chksum", RTE_ETH_RSS_L4_CHKSUM }, -- { NULL, 0 }, -+ { "l3-pre96", RTE_ETH_RSS_L3_PRE96 }, -+ { "l3-pre64", RTE_ETH_RSS_L3_PRE64 }, -+ { "l3-pre56", RTE_ETH_RSS_L3_PRE56 }, -+ { "l3-pre48", RTE_ETH_RSS_L3_PRE48 }, -+ { "l3-pre40", RTE_ETH_RSS_L3_PRE40 }, -+ { "l3-pre32", RTE_ETH_RSS_L3_PRE32 }, -+ { "l2-dst-only", RTE_ETH_RSS_L2_DST_ONLY }, -+ { "l2-src-only", RTE_ETH_RSS_L2_SRC_ONLY }, -+ { "l4-dst-only", RTE_ETH_RSS_L4_DST_ONLY }, -+ { "l4-src-only", RTE_ETH_RSS_L4_SRC_ONLY }, -+ { "l3-dst-only", RTE_ETH_RSS_L3_DST_ONLY }, -+ { "l3-src-only", RTE_ETH_RSS_L3_SRC_ONLY }, -+ { NULL, 0}, - }; - - static const struct { --- -2.23.0 - diff --git a/0178-app-testpmd-fix-RSS-types-display.patch b/0178-app-testpmd-fix-RSS-types-display.patch deleted file mode 100644 index e296b43..0000000 --- a/0178-app-testpmd-fix-RSS-types-display.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 34d8e6bf37155488c61029cf392255dd18ed0a87 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 21 Oct 2022 15:36:54 +0800 -Subject: [PATCH 178/189] app/testpmd: fix RSS types display - -Now testpmd fails to display types when query RSS rule. The failure is -because the '\n' character is missing at the end of the function -'rss_config_display()'. -Actually, all places calling 'xxx_types_display()' need to '\n'. So this -patch moves '\n' to the inside of these function. - -Bugzilla ID: 1048 -Fixes: 534988c490f1 ("app/testpmd: unify RSS types display") -Fixes: 44a37f3cffe0 ("app/testpmd: compact RSS types output") - -Signed-off-by: Huisong Li -Tested-by: Weiyuan Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/config.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index f8cd135970..12386c4d82 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -731,6 +731,7 @@ rss_offload_types_display(uint64_t offload_types, uint16_t char_num_per_line) - total_len += str_len; - } - } -+ printf("\n"); - } - - void -@@ -840,7 +841,6 @@ port_infos_display(portid_t port_id) - printf("Supported RSS offload flow types:\n"); - rss_offload_types_display(dev_info.flow_type_rss_offloads, - TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); -- printf("\n"); - } - - printf("Minimum size of RX buffer: %u\n", dev_info.min_rx_bufsize); -@@ -1604,6 +1604,7 @@ rss_types_display(uint64_t rss_types, uint16_t char_num_per_line) - total_len += str_len; - } - } -+ printf("\n"); - } - - static void -@@ -3102,7 +3103,6 @@ port_rss_hash_conf_show(portid_t port_id, int show_rss_key) - } - printf("RSS functions:\n"); - rss_types_display(rss_hf, TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); -- printf("\n"); - if (!show_rss_key) - return; - printf("RSS key:\n"); --- -2.23.0 - diff --git a/0179-ethdev-support-telemetry-private-dump.patch b/0179-ethdev-support-telemetry-private-dump.patch deleted file mode 100644 index 92cc946..0000000 --- a/0179-ethdev-support-telemetry-private-dump.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 9de9c8f454d4d1d87105700f626568f5f59e6985 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:55 +0800 -Subject: [PATCH 179/189] ethdev: support telemetry private dump -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch supports telemetry private dump a ethdev port. - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup ---- - lib/ethdev/rte_ethdev.c | 47 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 47 insertions(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index b95f501b51..df5a627cbe 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -7,6 +7,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -6272,6 +6273,48 @@ eth_dev_handle_port_xstats(const char *cmd __rte_unused, - return 0; - } - -+#ifndef RTE_EXEC_ENV_WINDOWS -+static int -+eth_dev_handle_port_dump_priv(const char *cmd __rte_unused, -+ const char *params, -+ struct rte_tel_data *d) -+{ -+ char *buf, *end_param; -+ int port_id, ret; -+ FILE *f; -+ -+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) -+ return -EINVAL; -+ -+ port_id = strtoul(params, &end_param, 0); -+ if (*end_param != '\0') -+ RTE_ETHDEV_LOG(NOTICE, -+ "Extra parameters passed to ethdev telemetry command, ignoring"); -+ if (!rte_eth_dev_is_valid_port(port_id)) -+ return -EINVAL; -+ -+ buf = calloc(sizeof(char), RTE_TEL_MAX_SINGLE_STRING_LEN); -+ if (buf == NULL) -+ return -ENOMEM; -+ -+ f = fmemopen(buf, RTE_TEL_MAX_SINGLE_STRING_LEN - 1, "w+"); -+ if (f == NULL) { -+ free(buf); -+ return -EINVAL; -+ } -+ -+ ret = rte_eth_dev_priv_dump(port_id, f); -+ fclose(f); -+ if (ret == 0) { -+ rte_tel_data_start_dict(d); -+ rte_tel_data_string(d, buf); -+ } -+ -+ free(buf); -+ return 0; -+} -+#endif /* !RTE_EXEC_ENV_WINDOWS */ -+ - static int - eth_dev_handle_port_link_status(const char *cmd __rte_unused, - const char *params, -@@ -6571,6 +6614,10 @@ RTE_INIT(ethdev_init_telemetry) - "Returns the common stats for a port. Parameters: int port_id"); - rte_telemetry_register_cmd("/ethdev/xstats", eth_dev_handle_port_xstats, - "Returns the extended stats for a port. Parameters: int port_id"); -+#ifndef RTE_EXEC_ENV_WINDOWS -+ rte_telemetry_register_cmd("/ethdev/dump_priv", eth_dev_handle_port_dump_priv, -+ "Returns dump private information for a port. Parameters: int port_id"); -+#endif - rte_telemetry_register_cmd("/ethdev/link_status", - eth_dev_handle_port_link_status, - "Returns the link status for a port. Parameters: int port_id"); --- -2.23.0 - diff --git a/0180-dmadev-add-telemetry.patch b/0180-dmadev-add-telemetry.patch deleted file mode 100644 index d445f54..0000000 --- a/0180-dmadev-add-telemetry.patch +++ /dev/null @@ -1,224 +0,0 @@ -From ab11b7f71865aaab19e2a59e877bc70dfbc317b0 Mon Sep 17 00:00:00 2001 -From: Sean Morrissey -Date: Fri, 21 Oct 2022 15:36:56 +0800 -Subject: [PATCH 180/189] dmadev: add telemetry - -Telemetry commands are now registered through the dmadev library -for the gathering of DSA stats. The corresponding callback -functions for listing dmadevs and providing info and stats for a - -An example usage can be seen below: -Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 -{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384} -Connected to application: "dpdk-dma" ---> / -{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]} ---> /dmadev/list -{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0, -"max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0, -"capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}} ---> /dmadev/stats,0,0 -{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}} - -Signed-off-by: Sean Morrissey -Reviewed-by: Bruce Richardson -Reviewed-by: Conor Walsh -Tested-by: Sunil Pai G -Tested-by: Kevin Laatz -Acked-by: Chengwen Feng ---- - doc/guides/prog_guide/dmadev.rst | 24 ++++++ - lib/dmadev/meson.build | 2 + - lib/dmadev/rte_dmadev.c | 130 +++++++++++++++++++++++++++++++ - 3 files changed, 156 insertions(+) - -diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst -index 77863f8028..2aa26d33b8 100644 ---- a/doc/guides/prog_guide/dmadev.rst -+++ b/doc/guides/prog_guide/dmadev.rst -@@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a - * ``submitted``: The number of operations submitted to the device. - * ``completed``: The number of operations which have completed (successful and failed). - * ``errors``: The number of operations that completed with error. -+ -+The dmadev library has support for displaying DMA device information -+through the Telemetry interface. Telemetry commands that can be used -+are shown below. -+ -+#. Get the list of available DMA devices by ID:: -+ -+ --> /dmadev/list -+ {"/dmadev/list": [0, 1]} -+ -+#. Get general information from a DMA device by passing the device id as a parameter:: -+ -+ --> /dmadev/info,0 -+ {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0, "max_vchans": 1, "max_desc": 4096, -+ "min_desc": 32, "max_sges": 0, "capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}} -+ -+#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters -+ (if a DMA device only has one virtual DMA channel you only need to pass the device id):: -+ -+ --> /dmadev/stats,0,0 -+ {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}} -+ -+For more information on how to use the Telemetry interface, see -+the :doc:`../howto/telemetry`. -diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build -index d2fc85e8c7..2f17587b75 100644 ---- a/lib/dmadev/meson.build -+++ b/lib/dmadev/meson.build -@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c') - headers = files('rte_dmadev.h') - indirect_headers += files('rte_dmadev_core.h') - driver_sdk_headers += files('rte_dmadev_pmd.h') -+ -+deps += ['telemetry'] -diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c -index d4b32b2971..174d4c40ae 100644 ---- a/lib/dmadev/rte_dmadev.c -+++ b/lib/dmadev/rte_dmadev.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - #include "rte_dmadev.h" - #include "rte_dmadev_pmd.h" -@@ -864,3 +865,132 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj) - obj->completed_status = dummy_completed_status; - obj->burst_capacity = dummy_burst_capacity; - } -+ -+static int -+dmadev_handle_dev_list(const char *cmd __rte_unused, -+ const char *params __rte_unused, -+ struct rte_tel_data *d) -+{ -+ int dev_id; -+ -+ rte_tel_data_start_array(d, RTE_TEL_INT_VAL); -+ for (dev_id = 0; dev_id < dma_devices_max; dev_id++) -+ if (rte_dma_is_valid(dev_id)) -+ rte_tel_data_add_array_int(d, dev_id); -+ -+ return 0; -+} -+ -+#define ADD_CAPA(td, dc, c) rte_tel_data_add_dict_int(td, dma_capability_name(c), !!(dc & c)) -+ -+static int -+dmadev_handle_dev_info(const char *cmd __rte_unused, -+ const char *params, struct rte_tel_data *d) -+{ -+ struct rte_dma_info dma_info; -+ struct rte_tel_data *dma_caps; -+ int dev_id, ret; -+ uint64_t dev_capa; -+ char *end_param; -+ -+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) -+ return -EINVAL; -+ -+ dev_id = strtoul(params, &end_param, 0); -+ if (*end_param != '\0') -+ RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring"); -+ -+ /* Function info_get validates dev_id so we don't need to. */ -+ ret = rte_dma_info_get(dev_id, &dma_info); -+ if (ret < 0) -+ return -EINVAL; -+ dev_capa = dma_info.dev_capa; -+ -+ rte_tel_data_start_dict(d); -+ rte_tel_data_add_dict_string(d, "name", dma_info.dev_name); -+ rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans); -+ rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node); -+ rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans); -+ rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc); -+ rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc); -+ rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges); -+ -+ dma_caps = rte_tel_data_alloc(); -+ if (!dma_caps) -+ return -ENOMEM; -+ -+ rte_tel_data_start_dict(dma_caps); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_MEM); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_DEV); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_MEM); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_DEV); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SVA); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SILENT); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_HANDLES_ERRORS); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY_SG); -+ ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_FILL); -+ rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0); -+ -+ return 0; -+} -+ -+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s) -+ -+static int -+dmadev_handle_dev_stats(const char *cmd __rte_unused, -+ const char *params, -+ struct rte_tel_data *d) -+{ -+ struct rte_dma_info dma_info; -+ struct rte_dma_stats dma_stats; -+ int dev_id, ret, vchan_id; -+ char *end_param; -+ const char *vchan_param; -+ -+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) -+ return -EINVAL; -+ -+ dev_id = strtoul(params, &end_param, 0); -+ -+ /* Function info_get validates dev_id so we don't need to. */ -+ ret = rte_dma_info_get(dev_id, &dma_info); -+ if (ret < 0) -+ return -EINVAL; -+ -+ /* If the device has one vchan the user does not need to supply the -+ * vchan id and only the device id is needed, no extra parameters. -+ */ -+ if (dma_info.nb_vchans == 1 && *end_param == '\0') -+ vchan_id = 0; -+ else { -+ vchan_param = strtok(end_param, ","); -+ if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param)) -+ return -EINVAL; -+ -+ vchan_id = strtoul(vchan_param, &end_param, 0); -+ } -+ if (*end_param != '\0') -+ RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring"); -+ -+ ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats); -+ if (ret < 0) -+ return -EINVAL; -+ -+ rte_tel_data_start_dict(d); -+ ADD_DICT_STAT(submitted); -+ ADD_DICT_STAT(completed); -+ ADD_DICT_STAT(errors); -+ -+ return 0; -+} -+ -+RTE_INIT(dmadev_init_telemetry) -+{ -+ rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list, -+ "Returns list of available dmadev devices by IDs. No parameters."); -+ rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info, -+ "Returns information for a dmadev. Parameters: int dev_id"); -+ rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats, -+ "Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (Optional if only one vchannel)"); -+} --- -2.23.0 - diff --git a/0181-dmadev-support-telemetry-dump-dmadev.patch b/0181-dmadev-support-telemetry-dump-dmadev.patch deleted file mode 100644 index cf85684..0000000 --- a/0181-dmadev-support-telemetry-dump-dmadev.patch +++ /dev/null @@ -1,78 +0,0 @@ -From a36114ed036f8c4976dfe3d47f0ee29c9f214fc5 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Oct 2022 15:36:57 +0800 -Subject: [PATCH 181/189] dmadev: support telemetry dump dmadev -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch supports telemetry dump dmadev. - -Signed-off-by: Chengwen Feng -Acked-by: Morten Brørup ---- - lib/dmadev/rte_dmadev.c | 43 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 43 insertions(+) - -diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c -index 174d4c40ae..ea1cb815b4 100644 ---- a/lib/dmadev/rte_dmadev.c -+++ b/lib/dmadev/rte_dmadev.c -@@ -985,6 +985,45 @@ dmadev_handle_dev_stats(const char *cmd __rte_unused, - return 0; - } - -+#ifndef RTE_EXEC_ENV_WINDOWS -+static int -+dmadev_handle_dev_dump(const char *cmd __rte_unused, -+ const char *params, -+ struct rte_tel_data *d) -+{ -+ char *buf, *end_param; -+ int dev_id, ret; -+ FILE *f; -+ -+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) -+ return -EINVAL; -+ -+ dev_id = strtoul(params, &end_param, 0); -+ if (*end_param != '\0') -+ RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring"); -+ -+ buf = calloc(sizeof(char), RTE_TEL_MAX_SINGLE_STRING_LEN); -+ if (buf == NULL) -+ return -ENOMEM; -+ -+ f = fmemopen(buf, RTE_TEL_MAX_SINGLE_STRING_LEN - 1, "w+"); -+ if (f == NULL) { -+ free(buf); -+ return -EINVAL; -+ } -+ -+ ret = rte_dma_dump(dev_id, f); -+ fclose(f); -+ if (ret == 0) { -+ rte_tel_data_start_dict(d); -+ rte_tel_data_string(d, buf); -+ } -+ -+ free(buf); -+ return ret; -+} -+#endif /* !RTE_EXEC_ENV_WINDOWS */ -+ - RTE_INIT(dmadev_init_telemetry) - { - rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list, -@@ -993,4 +1032,8 @@ RTE_INIT(dmadev_init_telemetry) - "Returns information for a dmadev. Parameters: int dev_id"); - rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats, - "Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (Optional if only one vchannel)"); -+#ifndef RTE_EXEC_ENV_WINDOWS -+ rte_telemetry_register_cmd("/dmadev/dump", dmadev_handle_dev_dump, -+ "Returns dump information for a dmadev. Parameters: int dev_id"); -+#endif - } --- -2.23.0 - diff --git a/0182-telemetry-add-missing-C-guards.patch b/0182-telemetry-add-missing-C-guards.patch deleted file mode 100644 index 5fa53d2..0000000 --- a/0182-telemetry-add-missing-C-guards.patch +++ /dev/null @@ -1,45 +0,0 @@ -From dcccc81ecd1f1a0a24ba361d474ef81c9691fd14 Mon Sep 17 00:00:00 2001 -From: Brian Dooley -Date: Fri, 21 Oct 2022 15:36:58 +0800 -Subject: [PATCH 182/189] telemetry: add missing C++ guards - -Some public header files were missing 'extern "C"' C++ guards, -and couldn't be used by C++ applications. Add the missing guards. - -Fixes: 8877ac688b52 ("telemetry: introduce infrastructure") -Cc: stable@dpdk.org - -Signed-off-by: Brian Dooley -Acked-by: Bruce Richardson -Acked-by: Tyler Retzlaff ---- - lib/telemetry/rte_telemetry.h | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h -index 7bca8a9a49..3372b32f38 100644 ---- a/lib/telemetry/rte_telemetry.h -+++ b/lib/telemetry/rte_telemetry.h -@@ -9,6 +9,10 @@ - #ifndef _RTE_TELEMETRY_H_ - #define _RTE_TELEMETRY_H_ - -+#ifdef __cplusplus -+extern "C" { -+#endif -+ - /** Maximum length for string used in object. */ - #define RTE_TEL_MAX_STRING_LEN 128 - /** Maximum length of string. */ -@@ -294,4 +298,8 @@ rte_tel_data_alloc(void); - void - rte_tel_data_free(struct rte_tel_data *data); - -+#ifdef __cplusplus -+} -+#endif -+ - #endif --- -2.23.0 - diff --git a/0183-telemetry-limit-characters-allowed-in-dictionary-nam.patch b/0183-telemetry-limit-characters-allowed-in-dictionary-nam.patch deleted file mode 100644 index 07df7a5..0000000 --- a/0183-telemetry-limit-characters-allowed-in-dictionary-nam.patch +++ /dev/null @@ -1,146 +0,0 @@ -From 926dc7ff064ee81e6b9732247ddb7785a4ab98b8 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:36:59 +0800 -Subject: [PATCH 183/189] telemetry: limit characters allowed in dictionary names - -To save issues with encoding the names of values in dicts, we limit the -allowed names to a subset of character values. This list of allowed -characters can be expanded as necessary in future. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng - ---- - lib/telemetry/rte_telemetry.h | 8 ++++++++ - lib/telemetry/telemetry_data.c | 31 +++++++++++++++++++++++++++++++ - 2 files changed, 39 insertions(+) - -diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h -index 3372b32f38..fadea48cb9 100644 ---- a/lib/telemetry/rte_telemetry.h -+++ b/lib/telemetry/rte_telemetry.h -@@ -64,6 +64,10 @@ rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type); - /** - * Start a dictionary of values for returning from a callback - * -+ * Dictionaries consist of key-values pairs to be returned, where the keys, -+ * or names, are strings and the values can be any of the types supported by telemetry. -+ * Name strings may only contain alphanumeric characters as well as '_' or '/' -+ * - * @param d - * The data structure passed to the callback - * @return -@@ -159,6 +163,7 @@ rte_tel_data_add_array_container(struct rte_tel_data *d, - * The data structure passed to the callback - * @param name - * The name the value is to be stored under in the dict -+ * Must contain only alphanumeric characters or the symbols: '_' or '/' - * @param val - * The string to be stored in the dict - * @return -@@ -177,6 +182,7 @@ rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name, - * The data structure passed to the callback - * @param name - * The name the value is to be stored under in the dict -+ * Must contain only alphanumeric characters or the symbols: '_' or '/' - * @param val - * The number to be stored in the dict - * @return -@@ -193,6 +199,7 @@ rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val); - * The data structure passed to the callback - * @param name - * The name the value is to be stored under in the dict -+ * Must contain only alphanumeric characters or the symbols: '_' or '/' - * @param val - * The number to be stored in the dict - * @return -@@ -212,6 +219,7 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d, - * The data structure passed to the callback - * @param name - * The name the value is to be stored under in the dict. -+ * Must contain only alphanumeric characters or the symbols: '_' or '/' - * @param val - * The pointer to the container to be stored in the dict. - * @param keep -diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c -index e14ae3c4d4..be46054c29 100644 ---- a/lib/telemetry/telemetry_data.c -+++ b/lib/telemetry/telemetry_data.c -@@ -3,6 +3,7 @@ - */ - - #undef RTE_USE_LIBBSD -+#include - #include - - #include "telemetry_data.h" -@@ -92,6 +93,24 @@ rte_tel_data_add_array_container(struct rte_tel_data *d, - return 0; - } - -+static bool -+valid_name(const char *name) -+{ -+ char allowed[128] = { -+ ['0' ... '9'] = 1, -+ ['A' ... 'Z'] = 1, -+ ['a' ... 'z'] = 1, -+ ['_'] = 1, -+ ['/'] = 1, -+ }; -+ while (*name != '\0') { -+ if ((size_t)*name >= RTE_DIM(allowed) || allowed[(int)*name] == 0) -+ return false; -+ name++; -+ } -+ return true; -+} -+ - int - rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name, - const char *val) -@@ -104,6 +123,9 @@ rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name, - if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES) - return -ENOSPC; - -+ if (!valid_name(name)) -+ return -EINVAL; -+ - d->data_len++; - e->type = RTE_TEL_STRING_VAL; - vbytes = strlcpy(e->value.sval, val, RTE_TEL_MAX_STRING_LEN); -@@ -123,6 +145,9 @@ rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val) - if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES) - return -ENOSPC; - -+ if (!valid_name(name)) -+ return -EINVAL; -+ - d->data_len++; - e->type = RTE_TEL_INT_VAL; - e->value.ival = val; -@@ -140,6 +165,9 @@ rte_tel_data_add_dict_u64(struct rte_tel_data *d, - if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES) - return -ENOSPC; - -+ if (!valid_name(name)) -+ return -EINVAL; -+ - d->data_len++; - e->type = RTE_TEL_U64_VAL; - e->value.u64val = val; -@@ -161,6 +189,9 @@ rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name, - if (d->data_len >= RTE_TEL_MAX_DICT_ENTRIES) - return -ENOSPC; - -+ if (!valid_name(name)) -+ return -EINVAL; -+ - d->data_len++; - e->type = RTE_TEL_CONTAINER; - e->value.container.data = val; --- -2.23.0 - diff --git a/0184-telemetry-fix-escaping-of-invalid-json-characters.patch b/0184-telemetry-fix-escaping-of-invalid-json-characters.patch deleted file mode 100644 index 9f32e8c..0000000 --- a/0184-telemetry-fix-escaping-of-invalid-json-characters.patch +++ /dev/null @@ -1,122 +0,0 @@ -From bdedf8a96e0782e98291e219ed7b74cb7b04fc9c Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:00 +0800 -Subject: [PATCH 184/189] telemetry: fix escaping of invalid json characters -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -For string values returned from telemetry, escape any values that cannot -normally appear in a json string. According to the json spec[1], the -characters than need to be handled are control chars (char value < 0x20) -and '"' and '\' characters. - -To handle this, we replace the snprintf call with a separate string -copying and encapsulation routine which checks each character as it -copies it to the final array. - -[1] https://www.rfc-editor.org/rfc/rfc8259.txt - -Bugzilla ID: 1037 -Fixes: 6dd571fd07c3 ("telemetry: introduce new functionality") - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry.c | 11 +++++--- - lib/telemetry/telemetry_json.h | 48 +++++++++++++++++++++++++++++++++- - 2 files changed, 55 insertions(+), 4 deletions(-) - -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index e5ccfe47f7..d4a7838ded 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -233,9 +233,14 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s) - MAX_CMD_LEN, cmd ? cmd : "none"); - break; - case RTE_TEL_STRING: -- used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":\"%.*s\"}", -- MAX_CMD_LEN, cmd, -- RTE_TEL_MAX_SINGLE_STRING_LEN, d->data.str); -+ prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -+ MAX_CMD_LEN, cmd); -+ cb_data_buf = &out_buf[prefix_used]; -+ buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ -+ -+ used = rte_tel_json_str(cb_data_buf, buf_len, 0, d->data.str); -+ used += prefix_used; -+ used += strlcat(out_buf + used, "}", sizeof(out_buf) - used); - break; - case RTE_TEL_DICT: - prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -diff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h -index db70690274..13df5d07e3 100644 ---- a/lib/telemetry/telemetry_json.h -+++ b/lib/telemetry/telemetry_json.h -@@ -44,6 +44,52 @@ __json_snprintf(char *buf, const int len, const char *format, ...) - return 0; /* nothing written or modified */ - } - -+static const char control_chars[0x20] = { -+ ['\n'] = 'n', -+ ['\r'] = 'r', -+ ['\t'] = 't', -+}; -+ -+/** -+ * @internal -+ * Does the same as __json_snprintf(buf, len, "\"%s\"", str) -+ * except that it does proper escaping as necessary. -+ * Drops any invalid characters we don't support -+ */ -+static inline int -+__json_format_str(char *buf, const int len, const char *str) -+{ -+ char tmp[len]; -+ int tmpidx = 0; -+ -+ tmp[tmpidx++] = '"'; -+ while (*str != '\0') { -+ if (*str < (int)RTE_DIM(control_chars)) { -+ int idx = *str; /* compilers don't like char type as index */ -+ if (control_chars[idx] != 0) { -+ tmp[tmpidx++] = '\\'; -+ tmp[tmpidx++] = control_chars[idx]; -+ } -+ } else if (*str == '"' || *str == '\\') { -+ tmp[tmpidx++] = '\\'; -+ tmp[tmpidx++] = *str; -+ } else -+ tmp[tmpidx++] = *str; -+ /* we always need space for closing quote and null character. -+ * Ensuring at least two free characters also means we can always take an -+ * escaped character like "\n" without overflowing -+ */ -+ if (tmpidx > len - 2) -+ return 0; -+ str++; -+ } -+ tmp[tmpidx++] = '"'; -+ tmp[tmpidx] = '\0'; -+ -+ strcpy(buf, tmp); -+ return tmpidx; -+} -+ - /* Copies an empty array into the provided buffer. */ - static inline int - rte_tel_json_empty_array(char *buf, const int len, const int used) -@@ -62,7 +108,7 @@ rte_tel_json_empty_obj(char *buf, const int len, const int used) - static inline int - rte_tel_json_str(char *buf, const int len, const int used, const char *str) - { -- return used + __json_snprintf(buf + used, len - used, "\"%s\"", str); -+ return used + __json_format_str(buf + used, len - used, str); - } - - /* Appends a string into the JSON array in the provided buffer. */ --- -2.23.0 - diff --git a/0185-telemetry-add-escaping-of-strings-in-arrays.patch b/0185-telemetry-add-escaping-of-strings-in-arrays.patch deleted file mode 100644 index 0523e66..0000000 --- a/0185-telemetry-add-escaping-of-strings-in-arrays.patch +++ /dev/null @@ -1,97 +0,0 @@ -From df367f0febc7e5ea999f119f420d30a953268503 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:01 +0800 -Subject: [PATCH 185/189] telemetry: add escaping of strings in arrays -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When strings are added to an array variable, we need to properly escape -the invalid json characters in the strings. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry_json.h | 28 +++++++++++++++++++--------- - 1 file changed, 19 insertions(+), 9 deletions(-) - -diff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h -index 13df5d07e3..c4442a0bf0 100644 ---- a/lib/telemetry/telemetry_json.h -+++ b/lib/telemetry/telemetry_json.h -@@ -52,17 +52,22 @@ static const char control_chars[0x20] = { - - /** - * @internal -- * Does the same as __json_snprintf(buf, len, "\"%s\"", str) -- * except that it does proper escaping as necessary. -+ * This function acts the same as __json_snprintf(buf, len, "%s%s%s", prefix, str, suffix) -+ * except that it does proper escaping of "str" as necessary. Prefix and suffix should be compile- -+ * time constants not needing escaping. - * Drops any invalid characters we don't support - */ - static inline int --__json_format_str(char *buf, const int len, const char *str) -+__json_format_str(char *buf, const int len, const char *prefix, const char *str, const char *suffix) - { - char tmp[len]; - int tmpidx = 0; - -- tmp[tmpidx++] = '"'; -+ while (*prefix != '\0' && tmpidx < len) -+ tmp[tmpidx++] = *prefix++; -+ if (tmpidx >= len) -+ return 0; -+ - while (*str != '\0') { - if (*str < (int)RTE_DIM(control_chars)) { - int idx = *str; /* compilers don't like char type as index */ -@@ -75,7 +80,7 @@ __json_format_str(char *buf, const int len, const char *str) - tmp[tmpidx++] = *str; - } else - tmp[tmpidx++] = *str; -- /* we always need space for closing quote and null character. -+ /* we always need space for (at minimum) closing quote and null character. - * Ensuring at least two free characters also means we can always take an - * escaped character like "\n" without overflowing - */ -@@ -83,7 +88,12 @@ __json_format_str(char *buf, const int len, const char *str) - return 0; - str++; - } -- tmp[tmpidx++] = '"'; -+ -+ while (*suffix != '\0' && tmpidx < len) -+ tmp[tmpidx++] = *suffix++; -+ if (tmpidx >= len) -+ return 0; -+ - tmp[tmpidx] = '\0'; - - strcpy(buf, tmp); -@@ -108,7 +118,7 @@ rte_tel_json_empty_obj(char *buf, const int len, const int used) - static inline int - rte_tel_json_str(char *buf, const int len, const int used, const char *str) - { -- return used + __json_format_str(buf + used, len - used, str); -+ return used + __json_format_str(buf + used, len - used, "\"", str, "\""); - } - - /* Appends a string into the JSON array in the provided buffer. */ -@@ -118,9 +128,9 @@ rte_tel_json_add_array_string(char *buf, const int len, const int used, - { - int ret, end = used - 1; /* strip off final delimiter */ - if (used <= 2) /* assume empty, since minimum is '[]' */ -- return __json_snprintf(buf, len, "[\"%s\"]", str); -+ return __json_format_str(buf, len, "[\"", str, "\"]"); - -- ret = __json_snprintf(buf + end, len - end, ",\"%s\"]", str); -+ ret = __json_format_str(buf + end, len - end, ",\"", str, "\"]"); - return ret == 0 ? used : end + ret; - } - --- -2.23.0 - diff --git a/0186-telemetry-add-escaping-of-strings-in-dicts.patch b/0186-telemetry-add-escaping-of-strings-in-dicts.patch deleted file mode 100644 index 9234a9a..0000000 --- a/0186-telemetry-add-escaping-of-strings-in-dicts.patch +++ /dev/null @@ -1,55 +0,0 @@ -From c3036c497f29f4acf6423a88f59963781af3eafd Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:02 +0800 -Subject: [PATCH 186/189] telemetry: add escaping of strings in dicts -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When strings are added to an dict variable, we need to properly escape -the invalid json characters in the strings. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry_json.h | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/lib/telemetry/telemetry_json.h b/lib/telemetry/telemetry_json.h -index c4442a0bf0..e3fae7c30d 100644 ---- a/lib/telemetry/telemetry_json.h -+++ b/lib/telemetry/telemetry_json.h -@@ -54,7 +54,7 @@ static const char control_chars[0x20] = { - * @internal - * This function acts the same as __json_snprintf(buf, len, "%s%s%s", prefix, str, suffix) - * except that it does proper escaping of "str" as necessary. Prefix and suffix should be compile- -- * time constants not needing escaping. -+ * time constants, or values not needing escaping. - * Drops any invalid characters we don't support - */ - static inline int -@@ -219,12 +219,16 @@ static inline int - rte_tel_json_add_obj_str(char *buf, const int len, const int used, - const char *name, const char *val) - { -+ char tmp_name[RTE_TEL_MAX_STRING_LEN + 5]; - int ret, end = used - 1; -+ -+ /* names are limited to certain characters so need no escaping */ -+ snprintf(tmp_name, sizeof(tmp_name), "{\"%s\":\"", name); - if (used <= 2) /* assume empty, since minimum is '{}' */ -- return __json_snprintf(buf, len, "{\"%s\":\"%s\"}", name, val); -+ return __json_format_str(buf, len, tmp_name, val, "\"}"); - -- ret = __json_snprintf(buf + end, len - end, ",\"%s\":\"%s\"}", -- name, val); -+ tmp_name[0] = ','; /* replace '{' with ',' at start */ -+ ret = __json_format_str(buf + end, len - end, tmp_name, val, "\"}"); - return ret == 0 ? used : end + ret; - } - --- -2.23.0 - diff --git a/0187-telemetry-limit-command-characters.patch b/0187-telemetry-limit-command-characters.patch deleted file mode 100644 index ea65d46..0000000 --- a/0187-telemetry-limit-command-characters.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 585eeea3522ce2225a1df94fcc0b8aec2d881b44 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:03 +0800 -Subject: [PATCH 187/189] telemetry: limit command characters -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Limit the telemetry command characters to the minimum set needed for -current implementations. This prevents issues with invalid json -characters needing to be escaped on replies. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index d4a7838ded..f0be50b2bf 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -3,6 +3,7 @@ - */ - - #ifndef RTE_EXEC_ENV_WINDOWS -+#include - #include - #include - #include -@@ -71,12 +72,19 @@ int - rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help) - { - struct cmd_callback *new_callbacks; -+ const char *cmdp = cmd; - int i = 0; - - if (strlen(cmd) >= MAX_CMD_LEN || fn == NULL || cmd[0] != '/' - || strlen(help) >= RTE_TEL_MAX_STRING_LEN) - return -EINVAL; - -+ while (*cmdp != '\0') { -+ if (!isalnum(*cmdp) && *cmdp != '_' && *cmdp != '/') -+ return -EINVAL; -+ cmdp++; -+ } -+ - rte_spinlock_lock(&callback_sl); - new_callbacks = realloc(callbacks, sizeof(callbacks[0]) * (num_callbacks + 1)); - if (new_callbacks == NULL) { --- -2.23.0 - diff --git a/0188-telemetry-eliminate-duplicate-code-for-json-output.patch b/0188-telemetry-eliminate-duplicate-code-for-json-output.patch deleted file mode 100644 index 89e8c42..0000000 --- a/0188-telemetry-eliminate-duplicate-code-for-json-output.patch +++ /dev/null @@ -1,103 +0,0 @@ -From c89a9af036a9063903537404d615bed04a700e5b Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:04 +0800 -Subject: [PATCH 188/189] telemetry: eliminate duplicate code for json output -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When preparing the json response to a telemetry socket query, the code -for prefixing the command name, and appending the file "}" on the end of -the response was duplicated for multiple reply types. Taking this code -out of the switch statement reduces the duplication and makes the code -more maintainable. - -For completeness of testing, add in a test case to validate the "null" -response type - the only leg of the switch statement not already covered -by an existing test case in the telemetry_data tests. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry.c | 35 ++++++++++++----------------------- - 1 file changed, 12 insertions(+), 23 deletions(-) - -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index f0be50b2bf..25ab6ed877 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -235,27 +235,22 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s) - - RTE_BUILD_BUG_ON(sizeof(out_buf) < MAX_CMD_LEN + - RTE_TEL_MAX_SINGLE_STRING_LEN + 10); -+ -+ prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -+ MAX_CMD_LEN, cmd); -+ cb_data_buf = &out_buf[prefix_used]; -+ buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ -+ - switch (d->type) { - case RTE_TEL_NULL: -- used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":null}", -- MAX_CMD_LEN, cmd ? cmd : "none"); -+ used = strlcpy(cb_data_buf, "null", buf_len); - break; -- case RTE_TEL_STRING: -- prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -- MAX_CMD_LEN, cmd); -- cb_data_buf = &out_buf[prefix_used]; -- buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ - -+ case RTE_TEL_STRING: - used = rte_tel_json_str(cb_data_buf, buf_len, 0, d->data.str); -- used += prefix_used; -- used += strlcat(out_buf + used, "}", sizeof(out_buf) - used); - break; -- case RTE_TEL_DICT: -- prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -- MAX_CMD_LEN, cmd); -- cb_data_buf = &out_buf[prefix_used]; -- buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ - -+ case RTE_TEL_DICT: - used = rte_tel_json_empty_obj(cb_data_buf, buf_len, 0); - for (i = 0; i < d->data_len; i++) { - const struct tel_dict_entry *v = &d->data.dict[i]; -@@ -291,18 +286,12 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s) - } - } - } -- used += prefix_used; -- used += strlcat(out_buf + used, "}", sizeof(out_buf) - used); - break; -+ - case RTE_TEL_ARRAY_STRING: - case RTE_TEL_ARRAY_INT: - case RTE_TEL_ARRAY_U64: - case RTE_TEL_ARRAY_CONTAINER: -- prefix_used = snprintf(out_buf, sizeof(out_buf), "{\"%.*s\":", -- MAX_CMD_LEN, cmd); -- cb_data_buf = &out_buf[prefix_used]; -- buf_len = sizeof(out_buf) - prefix_used - 1; /* space for '}' */ -- - used = rte_tel_json_empty_array(cb_data_buf, buf_len, 0); - for (i = 0; i < d->data_len; i++) - if (d->type == RTE_TEL_ARRAY_STRING) -@@ -330,10 +319,10 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s) - if (!rec_data->keep) - rte_tel_data_free(rec_data->data); - } -- used += prefix_used; -- used += strlcat(out_buf + used, "}", sizeof(out_buf) - used); - break; - } -+ used += prefix_used; -+ used += strlcat(out_buf + used, "}", sizeof(out_buf) - used); - if (write(s, out_buf, used) < 0) - perror("Error writing to socket"); - } --- -2.23.0 - diff --git a/0189-telemetry-make-help-command-more-helpful.patch b/0189-telemetry-make-help-command-more-helpful.patch deleted file mode 100644 index fa2242c..0000000 --- a/0189-telemetry-make-help-command-more-helpful.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 2674bf9f28b9dd7724d72096a8e54b19400239bd Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 21 Oct 2022 15:37:05 +0800 -Subject: [PATCH 189/189] telemetry: make help command more helpful -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The /help telemetry command prints out the help text for the given -command passed in as parameter. However, entering /help without any -parameters does not give any useful information as to the fact that you -need to pass in a command to get help on. Update the command so it -prints its own help text when called without any parameters. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/telemetry/telemetry.c | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index 25ab6ed877..52048de55c 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -141,15 +141,17 @@ command_help(const char *cmd __rte_unused, const char *params, - struct rte_tel_data *d) - { - int i; -+ /* if no parameters return our own help text */ -+ const char *to_lookup = (params == NULL ? cmd : params); - -- if (!params) -- return -1; - rte_tel_data_start_dict(d); - rte_spinlock_lock(&callback_sl); - for (i = 0; i < num_callbacks; i++) -- if (strcmp(params, callbacks[i].cmd) == 0) { -- rte_tel_data_add_dict_string(d, params, -- callbacks[i].help); -+ if (strcmp(to_lookup, callbacks[i].cmd) == 0) { -+ if (params == NULL) -+ rte_tel_data_string(d, callbacks[i].help); -+ else -+ rte_tel_data_add_dict_string(d, params, callbacks[i].help); - break; - } - rte_spinlock_unlock(&callback_sl); --- -2.23.0 - diff --git a/0190-net-bonding-fix-Tx-hash-for-TCP.patch b/0190-net-bonding-fix-Tx-hash-for-TCP.patch deleted file mode 100644 index 36d3796..0000000 --- a/0190-net-bonding-fix-Tx-hash-for-TCP.patch +++ /dev/null @@ -1,42 +0,0 @@ -From fbe9bd4deab755855a4ef2d88e559da6ae4b76c2 Mon Sep 17 00:00:00 2001 -From: Jun Qiu -Date: Fri, 28 Oct 2022 15:32:42 +0800 -Subject: net/bonding: fix Tx hash for TCP - -In the following two cases, tcp_hdr + sizeof(*tcp_hdr) == pkt_end, -and the TCP port is not taken into account in calculating the HASH -value of TCP packets. TCP connections with the same source and -destination IP addresses will be hashed to the same slave port, -which may cause load imbalance. -1. TCP Pure ACK packets with no options, The header length is 20 -and there is no data. -2. A TCP packet contains data, but the first seg of the mbuf -contains only the header information (ETH, IP, TCP), and the -data is in subsequent segs, which is usually the case in the -indirect mbuf used for zero-copy. - -Fixes: 726158060d55 ("net/bonding: fix potential out of bounds read") -Cc: stable@dpdk.org - -Signed-off-by: Jun Qiu -Acked-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 3be2b08128..18754e3299 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -768,7 +768,7 @@ burst_xmit_l34_hash(struct rte_mbuf **buf, uint16_t nb_pkts, - ((char *)ipv4_hdr + - ip_hdr_offset); - if ((size_t)tcp_hdr + sizeof(*tcp_hdr) -- < pkt_end) -+ <= pkt_end) - l4hash = HASH_L4_PORTS(tcp_hdr); - } else if (ipv4_hdr->next_proto_id == - IPPROTO_UDP) { --- -2.23.0 - diff --git a/0191-net-bonding-add-link-speeds-configuration.patch b/0191-net-bonding-add-link-speeds-configuration.patch deleted file mode 100644 index 8bdecef..0000000 --- a/0191-net-bonding-add-link-speeds-configuration.patch +++ /dev/null @@ -1,112 +0,0 @@ -From b92c505e9506f38e76dcf094fbbb2e765e5452a8 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 28 Oct 2022 15:32:43 +0800 -Subject: net/bonding: add link speeds configuration - -This patch adds link speeds configuration. - -Signed-off-by: Huisong Li -Acked-by: Chas Williams <3chas3@gmail.com> ---- - drivers/net/bonding/eth_bond_private.h | 3 +++ - drivers/net/bonding/rte_eth_bond_api.c | 3 +++ - drivers/net/bonding/rte_eth_bond_pmd.c | 27 ++++++++++++++++++++++++++ - 3 files changed, 33 insertions(+) - -diff --git a/drivers/net/bonding/eth_bond_private.h b/drivers/net/bonding/eth_bond_private.h -index 9626b26d67..c338e11d4f 100644 ---- a/drivers/net/bonding/eth_bond_private.h -+++ b/drivers/net/bonding/eth_bond_private.h -@@ -131,6 +131,9 @@ struct bond_dev_private { - uint32_t link_down_delay_ms; - uint32_t link_up_delay_ms; - -+ uint32_t speed_capa; -+ /**< Supported speeds bitmap (RTE_ETH_LINK_SPEED_). */ -+ - uint16_t nb_rx_queues; /**< Total number of rx queues */ - uint16_t nb_tx_queues; /**< Total number of tx queues*/ - -diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c -index 2d5cac6c51..b74477128a 100644 ---- a/drivers/net/bonding/rte_eth_bond_api.c -+++ b/drivers/net/bonding/rte_eth_bond_api.c -@@ -513,6 +513,8 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id) - internals->primary_port = slave_port_id; - internals->current_primary_port = slave_port_id; - -+ internals->speed_capa = dev_info.speed_capa; -+ - /* Inherit queues settings from first slave */ - internals->nb_rx_queues = slave_eth_dev->data->nb_rx_queues; - internals->nb_tx_queues = slave_eth_dev->data->nb_tx_queues; -@@ -527,6 +529,7 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id) - } else { - int ret; - -+ internals->speed_capa &= dev_info.speed_capa; - eth_bond_slave_inherit_dev_info_rx_next(internals, &dev_info); - eth_bond_slave_inherit_dev_info_tx_next(internals, &dev_info); - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 18754e3299..b5b706901a 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1721,6 +1721,8 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - - slave_eth_dev->data->dev_conf.rxmode.mtu = - bonded_eth_dev->data->dev_conf.rxmode.mtu; -+ slave_eth_dev->data->dev_conf.link_speeds = -+ bonded_eth_dev->data->dev_conf.link_speeds; - - slave_eth_dev->data->dev_conf.txmode.offloads |= - bonded_eth_dev->data->dev_conf.txmode.offloads; -@@ -2257,6 +2259,7 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) - - dev_info->reta_size = internals->reta_size; - dev_info->hash_key_size = internals->rss_key_len; -+ dev_info->speed_capa = internals->speed_capa; - - return 0; - } -@@ -3571,6 +3574,7 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - uint64_t offloads; - int arg_count; - uint16_t port_id = dev - rte_eth_devices; -+ uint32_t link_speeds; - uint8_t agg_mode; - - static const uint8_t default_rss_key[40] = { -@@ -3629,6 +3633,29 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - dev->data->dev_conf.txmode.offloads = offloads; - } - -+ link_speeds = dev->data->dev_conf.link_speeds; -+ /* -+ * The default value of 'link_speeds' is zero. From its definition, -+ * this value actually means auto-negotiation. But not all PMDs support -+ * auto-negotiation. So ignore the check for the auto-negotiation and -+ * only consider fixed speed to reduce the impact on PMDs. -+ */ -+ if (link_speeds & RTE_ETH_LINK_SPEED_FIXED) { -+ if ((link_speeds & -+ (internals->speed_capa & ~RTE_ETH_LINK_SPEED_FIXED)) == 0) { -+ RTE_BOND_LOG(ERR, "the fixed speed is not supported by all slave devices."); -+ return -EINVAL; -+ } -+ /* -+ * Two '1' in binary of 'link_speeds': bit0 and a unique -+ * speed bit. -+ */ -+ if (__builtin_popcountl(link_speeds) != 2) { -+ RTE_BOND_LOG(ERR, "please set a unique speed."); -+ return -EINVAL; -+ } -+ } -+ - /* set the max_rx_pktlen */ - internals->max_rx_pktlen = internals->candidate_max_rx_pktlen; - --- -2.23.0 - diff --git a/0192-net-bonding-call-Tx-prepare-before-Tx-burst.patch b/0192-net-bonding-call-Tx-prepare-before-Tx-burst.patch deleted file mode 100644 index f8fad78..0000000 --- a/0192-net-bonding-call-Tx-prepare-before-Tx-burst.patch +++ /dev/null @@ -1,211 +0,0 @@ -From 2606fe3bfdbe544819a08f27cd5ed6b5432c96a7 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 28 Oct 2022 15:32:44 +0800 -Subject: net/bonding: call Tx prepare before Tx burst - -Normally, to use the HW offloads capability (e.g. checksum and TSO) in -the Tx direction, the application needs to call rte_eth_tx_prepare() to -do some adjustment with the packets before sending them. But the -tx_prepare callback of the bonding driver is not implemented. Therefore, -the sent packets may have errors (e.g. checksum errors). - -However, it is difficult to design the tx_prepare callback for bonding -driver. Because when a bonded device sends packets, the bonded device -allocates the packets to different slave devices based on the real-time -link status and bonding mode. That is, it is very difficult for the -bonded device to determine which slave device's prepare function should -be invoked. - -So in this patch, the tx_prepare callback of bonding driver is not -implemented. Instead, the rte_eth_tx_prepare() will be called before -rte_eth_tx_burst(). In this way, all tx_offloads can be processed -correctly for all NIC devices. - -Note: because it is rara that bond different PMDs together, so just -call tx-prepare once in broadcast bonding mode. - -Also the following description was added to the rte_eth_tx_burst() -function: -"@note This function must not modify mbufs (including packets data) -unless the refcnt is 1. The exception is the bonding PMD, which does not -have tx-prepare function, in this case, mbufs maybe modified." - -Signed-off-by: Chengchang Tang -Signed-off-by: Chengwen Feng -Reviewed-by: Min Hu (Connor) -Acked-by: Chas Williams <3chas3@gmail.com> ---- - drivers/net/bonding/rte_eth_bond_8023ad.c | 10 ++++-- - drivers/net/bonding/rte_eth_bond_pmd.c | 37 ++++++++++++++++++----- - lib/ethdev/rte_ethdev.h | 4 +++ - 3 files changed, 41 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c -index b3cddd8a20..29a71ae0bf 100644 ---- a/drivers/net/bonding/rte_eth_bond_8023ad.c -+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c -@@ -636,9 +636,12 @@ tx_machine(struct bond_dev_private *internals, uint16_t slave_id) - return; - } - } else { -- uint16_t pkts_sent = rte_eth_tx_burst(slave_id, -+ uint16_t pkts_sent = rte_eth_tx_prepare(slave_id, - internals->mode4.dedicated_queues.tx_qid, - &lacp_pkt, 1); -+ pkts_sent = rte_eth_tx_burst(slave_id, -+ internals->mode4.dedicated_queues.tx_qid, -+ &lacp_pkt, pkts_sent); - if (pkts_sent != 1) { - rte_pktmbuf_free(lacp_pkt); - set_warning_flags(port, WRN_TX_QUEUE_FULL); -@@ -1371,9 +1374,12 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals, - } - } else { - /* Send packet directly to the slow queue */ -- uint16_t tx_count = rte_eth_tx_burst(slave_id, -+ uint16_t tx_count = rte_eth_tx_prepare(slave_id, - internals->mode4.dedicated_queues.tx_qid, - &pkt, 1); -+ tx_count = rte_eth_tx_burst(slave_id, -+ internals->mode4.dedicated_queues.tx_qid, -+ &pkt, tx_count); - if (tx_count != 1) { - /* reset timer */ - port->rx_marker_timer = 0; -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index b5b706901a..4e82f7b145 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -602,8 +602,11 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs, - /* Send packet burst on each slave device */ - for (i = 0; i < num_of_slaves; i++) { - if (slave_nb_pkts[i] > 0) { -+ num_tx_slave = rte_eth_tx_prepare(slaves[i], -+ bd_tx_q->queue_id, slave_bufs[i], -+ slave_nb_pkts[i]); - num_tx_slave = rte_eth_tx_burst(slaves[i], bd_tx_q->queue_id, -- slave_bufs[i], slave_nb_pkts[i]); -+ slave_bufs[i], num_tx_slave); - - /* if tx burst fails move packets to end of bufs */ - if (unlikely(num_tx_slave < slave_nb_pkts[i])) { -@@ -628,6 +631,7 @@ bond_ethdev_tx_burst_active_backup(void *queue, - { - struct bond_dev_private *internals; - struct bond_tx_queue *bd_tx_q; -+ uint16_t nb_prep_pkts; - - bd_tx_q = (struct bond_tx_queue *)queue; - internals = bd_tx_q->dev_private; -@@ -635,8 +639,11 @@ bond_ethdev_tx_burst_active_backup(void *queue, - if (internals->active_slave_count < 1) - return 0; - -+ nb_prep_pkts = rte_eth_tx_prepare(internals->current_primary_port, -+ bd_tx_q->queue_id, bufs, nb_pkts); -+ - return rte_eth_tx_burst(internals->current_primary_port, bd_tx_q->queue_id, -- bufs, nb_pkts); -+ bufs, nb_prep_pkts); - } - - static inline uint16_t -@@ -910,7 +917,7 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - - struct rte_eth_dev *primary_port = - &rte_eth_devices[internals->primary_port]; -- uint16_t num_tx_total = 0; -+ uint16_t num_tx_total = 0, num_tx_prep; - uint16_t i, j; - - uint16_t num_of_slaves = internals->active_slave_count; -@@ -951,8 +958,10 @@ bond_ethdev_tx_burst_tlb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - #endif - } - -- num_tx_total += rte_eth_tx_burst(slaves[i], bd_tx_q->queue_id, -+ num_tx_prep = rte_eth_tx_prepare(slaves[i], bd_tx_q->queue_id, - bufs + num_tx_total, nb_pkts - num_tx_total); -+ num_tx_total += rte_eth_tx_burst(slaves[i], bd_tx_q->queue_id, -+ bufs + num_tx_total, num_tx_prep); - - if (num_tx_total == nb_pkts) - break; -@@ -1064,8 +1073,10 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - /* Send ARP packets on proper slaves */ - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { - if (slave_bufs_pkts[i] > 0) { -- num_send = rte_eth_tx_burst(i, bd_tx_q->queue_id, -+ num_send = rte_eth_tx_prepare(i, bd_tx_q->queue_id, - slave_bufs[i], slave_bufs_pkts[i]); -+ num_send = rte_eth_tx_burst(i, bd_tx_q->queue_id, -+ slave_bufs[i], num_send); - for (j = 0; j < slave_bufs_pkts[i] - num_send; j++) { - bufs[nb_pkts - 1 - num_not_send - j] = - slave_bufs[i][nb_pkts - 1 - j]; -@@ -1088,8 +1099,10 @@ bond_ethdev_tx_burst_alb(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) - /* Send update packets on proper slaves */ - for (i = 0; i < RTE_MAX_ETHPORTS; i++) { - if (update_bufs_pkts[i] > 0) { -+ num_send = rte_eth_tx_prepare(i, bd_tx_q->queue_id, -+ update_bufs[i], update_bufs_pkts[i]); - num_send = rte_eth_tx_burst(i, bd_tx_q->queue_id, update_bufs[i], -- update_bufs_pkts[i]); -+ num_send); - for (j = num_send; j < update_bufs_pkts[i]; j++) { - rte_pktmbuf_free(update_bufs[i][j]); - } -@@ -1158,9 +1171,12 @@ tx_burst_balance(void *queue, struct rte_mbuf **bufs, uint16_t nb_bufs, - if (slave_nb_bufs[i] == 0) - continue; - -- slave_tx_count = rte_eth_tx_burst(slave_port_ids[i], -+ slave_tx_count = rte_eth_tx_prepare(slave_port_ids[i], - bd_tx_q->queue_id, slave_bufs[i], - slave_nb_bufs[i]); -+ slave_tx_count = rte_eth_tx_burst(slave_port_ids[i], -+ bd_tx_q->queue_id, slave_bufs[i], -+ slave_tx_count); - - total_tx_count += slave_tx_count; - -@@ -1243,8 +1259,10 @@ tx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_bufs, - - if (rte_ring_dequeue(port->tx_ring, - (void **)&ctrl_pkt) != -ENOENT) { -- slave_tx_count = rte_eth_tx_burst(slave_port_ids[i], -+ slave_tx_count = rte_eth_tx_prepare(slave_port_ids[i], - bd_tx_q->queue_id, &ctrl_pkt, 1); -+ slave_tx_count = rte_eth_tx_burst(slave_port_ids[i], -+ bd_tx_q->queue_id, &ctrl_pkt, slave_tx_count); - /* - * re-enqueue LAG control plane packets to buffering - * ring if transmission fails so the packet isn't lost. -@@ -1316,6 +1334,9 @@ bond_ethdev_tx_burst_broadcast(void *queue, struct rte_mbuf **bufs, - if (num_of_slaves < 1) - return 0; - -+ /* It is rare that bond different PMDs together, so just call tx-prepare once */ -+ nb_pkts = rte_eth_tx_prepare(slaves[0], bd_tx_q->queue_id, bufs, nb_pkts); -+ - /* Increment reference count on mbufs */ - for (i = 0; i < nb_pkts; i++) - rte_pktmbuf_refcnt_update(bufs[i], num_of_slaves - 1); -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 8c894e090d..b262939a33 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -5691,6 +5691,10 @@ uint16_t rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t queue_id, - * @see rte_eth_tx_prepare to perform some prior checks or adjustments - * for offloads. - * -+ * @note This function must not modify mbufs (including packets data) unless -+ * the refcnt is 1. The exception is the bonding PMD, which does not have -+ * tx-prepare function, in this case, mbufs maybe modified. -+ * - * @param port_id - * The port identifier of the Ethernet device. - * @param queue_id --- -2.23.0 - diff --git a/0193-net-bonding-fix-MTU-set-for-slaves.patch b/0193-net-bonding-fix-MTU-set-for-slaves.patch deleted file mode 100644 index 5c59f56..0000000 --- a/0193-net-bonding-fix-MTU-set-for-slaves.patch +++ /dev/null @@ -1,62 +0,0 @@ -From f099709983c155337a14340da3d9607a2a08a7f9 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Fri, 28 Oct 2022 15:32:45 +0800 -Subject: net/bonding: fix MTU set for slaves - -ethdev requires device to be configured before setting MTU. - -In bonding PMD, while configuring slaves, bonding first sets MTU later -configures them, which causes failure if slaves are not configured in -advance. - -Fixing by changing the order in slave configure as requested in ethdev -layer, configure first and set MTU later. - -Bugzilla ID: 864 -Fixes: b26bee10ee37 ("ethdev: forbid MTU set before device configure") -Cc: stable@dpdk.org - -Signed-off-by: Ferruh Yigit -Tested-by: Yu Jiang -Acked-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 4e82f7b145..ab1196e505 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1770,14 +1770,6 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - } - } - -- errval = rte_eth_dev_set_mtu(slave_eth_dev->data->port_id, -- bonded_eth_dev->data->mtu); -- if (errval != 0 && errval != -ENOTSUP) { -- RTE_BOND_LOG(ERR, "rte_eth_dev_set_mtu: port %u, err (%d)", -- slave_eth_dev->data->port_id, errval); -- return errval; -- } -- - /* Configure device */ - errval = rte_eth_dev_configure(slave_eth_dev->data->port_id, - nb_rx_queues, nb_tx_queues, -@@ -1788,6 +1780,14 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - return errval; - } - -+ errval = rte_eth_dev_set_mtu(slave_eth_dev->data->port_id, -+ bonded_eth_dev->data->mtu); -+ if (errval != 0 && errval != -ENOTSUP) { -+ RTE_BOND_LOG(ERR, "rte_eth_dev_set_mtu: port %u, err (%d)", -+ slave_eth_dev->data->port_id, errval); -+ return errval; -+ } -+ - /* Setup Rx Queues */ - for (q_id = 0; q_id < bonded_eth_dev->data->nb_rx_queues; q_id++) { - bd_rx_q = (struct bond_rx_queue *)bonded_eth_dev->data->rx_queues[q_id]; --- -2.23.0 - diff --git a/0194-app-testpmd-remove-jumbo-offload-related-code.patch b/0194-app-testpmd-remove-jumbo-offload-related-code.patch deleted file mode 100644 index d34e048..0000000 --- a/0194-app-testpmd-remove-jumbo-offload-related-code.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 20204b1f3811015975a5dac2012ca770be174acb Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 28 Oct 2022 15:32:46 +0800 -Subject: app/testpmd: remove jumbo offload related code - -The jumbo offload was removed from patch [1], but testpmd still exist -jumbo offload related code, this patch removes it, and also updates -the rst file. - -[1] ethdev: remove jumbo offload flag - -Fixes: b563c1421282 ("ethdev: remove jumbo offload flag") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Reviewed-by: Andrew Rybchenko ---- - app/test-pmd/cmdline.c | 12 ++++++------ - app/test-pmd/testpmd.h | 1 - - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 ++++---- - 3 files changed, 10 insertions(+), 11 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 6cb095f965..8d4a88bb85 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -861,7 +861,7 @@ static void cmd_help_long_parsed(void *parsed_result, - "port config rx_offload vlan_strip|" - "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" - "outer_ipv4_cksum|macsec_strip|header_split|" -- "vlan_filter|vlan_extend|jumbo_frame|scatter|" -+ "vlan_filter|vlan_extend|scatter|" - "buffer_split|timestamp|security|keep_crc on|off\n" - " Enable or disable a per port Rx offloading" - " on all Rx queues of a port\n\n" -@@ -869,7 +869,7 @@ static void cmd_help_long_parsed(void *parsed_result, - "port (port_id) rxq (queue_id) rx_offload vlan_strip|" - "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" - "outer_ipv4_cksum|macsec_strip|header_split|" -- "vlan_filter|vlan_extend|jumbo_frame|scatter|" -+ "vlan_filter|vlan_extend|scatter|" - "buffer_split|timestamp|security|keep_crc on|off\n" - " Enable or disable a per queue Rx offloading" - " only on a specific Rx queue\n\n" -@@ -16080,7 +16080,7 @@ cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload = - (struct cmd_config_per_port_rx_offload_result, - offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" - "qinq_strip#outer_ipv4_cksum#macsec_strip#" -- "header_split#vlan_filter#vlan_extend#jumbo_frame#" -+ "header_split#vlan_filter#vlan_extend#" - "scatter#buffer_split#timestamp#security#" - "keep_crc#rss_hash"); - cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_on_off = -@@ -16163,7 +16163,7 @@ cmdline_parse_inst_t cmd_config_per_port_rx_offload = { - .help_str = "port config rx_offload vlan_strip|ipv4_cksum|" - "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" - "macsec_strip|header_split|vlan_filter|vlan_extend|" -- "jumbo_frame|scatter|buffer_split|timestamp|security|" -+ "scatter|buffer_split|timestamp|security|" - "keep_crc|rss_hash on|off", - .tokens = { - (void *)&cmd_config_per_port_rx_offload_result_port, -@@ -16212,7 +16212,7 @@ cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload = - (struct cmd_config_per_queue_rx_offload_result, - offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" - "qinq_strip#outer_ipv4_cksum#macsec_strip#" -- "header_split#vlan_filter#vlan_extend#jumbo_frame#" -+ "header_split#vlan_filter#vlan_extend#" - "scatter#buffer_split#timestamp#security#keep_crc"); - cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off = - TOKEN_STRING_INITIALIZER -@@ -16271,7 +16271,7 @@ cmdline_parse_inst_t cmd_config_per_queue_rx_offload = { - "vlan_strip|ipv4_cksum|" - "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" - "macsec_strip|header_split|vlan_filter|vlan_extend|" -- "jumbo_frame|scatter|buffer_split|timestamp|security|" -+ "scatter|buffer_split|timestamp|security|" - "keep_crc on|off", - .tokens = { - (void *)&cmd_config_per_queue_rx_offload_result_port, -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 9c3a5d9bc5..ab6642585e 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -1097,7 +1097,6 @@ uint16_t tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue, - void add_tx_dynf_callback(portid_t portid); - void remove_tx_dynf_callback(portid_t portid); - int update_mtu_from_frame_size(portid_t portid, uint32_t max_rx_pktlen); --int update_jumbo_frame_offload(portid_t portid); - void flex_item_create(portid_t port_id, uint16_t flex_id, const char *filename); - void flex_item_destroy(portid_t port_id, uint16_t flex_id); - void port_flex_item_flush(portid_t port_id); -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index e15dc0c4c4..e0edd349bc 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -1767,8 +1767,8 @@ Enable or disable a per port Rx offloading on all Rx queues of a port:: - * ``offloading``: can be any of these offloading capability: - vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, - qinq_strip, outer_ipv4_cksum, macsec_strip, -- header_split, vlan_filter, vlan_extend, jumbo_frame, -- scatter, timestamp, security, keep_crc, rss_hash -+ header_split, vlan_filter, vlan_extend, scatter, timestamp, security, -+ keep_crc, rss_hash - - This command should be run when the port is stopped, or else it will fail. - -@@ -1782,8 +1782,8 @@ Enable or disable a per queue Rx offloading only on a specific Rx queue:: - * ``offloading``: can be any of these offloading capability: - vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, - qinq_strip, outer_ipv4_cksum, macsec_strip, -- header_split, vlan_filter, vlan_extend, jumbo_frame, -- scatter, timestamp, security, keep_crc -+ header_split, vlan_filter, vlan_extend, scatter, timestamp, security, -+ keep_crc - - This command should be run when the port is stopped, or else it will fail. - --- -2.23.0 - diff --git a/0195-app-testpmd-revert-MAC-update-in-checksum-forwarding.patch b/0195-app-testpmd-revert-MAC-update-in-checksum-forwarding.patch deleted file mode 100644 index 8e18c47..0000000 --- a/0195-app-testpmd-revert-MAC-update-in-checksum-forwarding.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 304a7bf032352999131c0b3e28c585610000990e Mon Sep 17 00:00:00 2001 -From: Maxime Coquelin -Date: Tue, 15 Nov 2022 12:06:06 +0800 -Subject: app/testpmd: revert MAC update in checksum forwarding - -[ upstream commit 9b4ea7ae77faa8f8aba8c7510c821f75d7863b16 ] - -This patch reverts -commit 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding"), -as the checksum forwarding is expected to only perform -checksum and not also overwrites the source and destination MAC addresses. - -Doing so, we can test checksum offloading with real traffic -without breaking broadcast packets. - -Fixes: 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding") - -Signed-off-by: Maxime Coquelin -Acked-by: Chenbo Xia -Acked-by: Aman Singh ---- - app/test-pmd/csumonly.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index 0177284d9c..206968d37a 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -887,10 +887,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - * and inner headers */ - - eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *); -- rte_ether_addr_copy(&peer_eth_addrs[fs->peer_addr], -- ð_hdr->dst_addr); -- rte_ether_addr_copy(&ports[fs->tx_port].eth_addr, -- ð_hdr->src_addr); - parse_ethernet(eth_hdr, &info); - l3_hdr = (char *)eth_hdr + info.l2_len; - --- -2.23.0 - diff --git a/0196-net-bonding-fix-bond4-drop-valid-MAC-packets.patch b/0196-net-bonding-fix-bond4-drop-valid-MAC-packets.patch deleted file mode 100644 index 41c8dea..0000000 --- a/0196-net-bonding-fix-bond4-drop-valid-MAC-packets.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 44f34b117cb446f9dce03e683942a40a8a04436c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 15 Nov 2022 12:06:07 +0800 -Subject: net/bonding: fix bond4 drop valid MAC packets - -[ upstream commit 2176782ec87589927e1b13737b60ee8be28d76af ] - -Currently, by default, bond4 will first try to enable allmulti and -then enable promiscuous if fail to enable allmulti. On reception, -whether unicast and multicast packets should be dropped depends on -which mode has been enabled on the bonding interface. - -In fact, if MAC address of packets in mac_addrs array of bonding -interface, these packets should not be dropped. However, now only -check the default MAC address, which will cause the packets with -MAC added by the '.mac_addr_add' are dropped. - -Fixes: 68218b87c184 ("net/bonding: prefer allmulti to promiscuous for LACP") - -Signed-off-by: Huisong Li -Reviewed-by: Andrew Rybchenko ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 33 +++++++++++++++++++------- - 1 file changed, 25 insertions(+), 8 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index ab1196e505..f1e7b6459a 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -271,6 +271,24 @@ bond_ethdev_8023ad_flow_set(struct rte_eth_dev *bond_dev, uint16_t slave_port) { - return 0; - } - -+static bool -+is_bond_mac_addr(const struct rte_ether_addr *ea, -+ const struct rte_ether_addr *mac_addrs, uint32_t max_mac_addrs) -+{ -+ uint32_t i; -+ -+ for (i = 0; i < max_mac_addrs; i++) { -+ /* skip zero address */ -+ if (rte_is_zero_ether_addr(&mac_addrs[i])) -+ continue; -+ -+ if (rte_is_same_ether_addr(ea, &mac_addrs[i])) -+ return true; -+ } -+ -+ return false; -+} -+ - static inline uint16_t - rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts, - bool dedicated_rxq) -@@ -331,8 +349,9 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts, - /* Remove packet from array if: - * - it is slow packet but no dedicated rxq is present, - * - slave is not in collecting state, -- * - bonding interface is not in promiscuous mode: -- * - packet is unicast and address does not match, -+ * - bonding interface is not in promiscuous mode and -+ * packet address isn't in mac_addrs array: -+ * - packet is unicast, - * - packet is multicast and bonding interface - * is not in allmulti, - */ -@@ -342,12 +361,10 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts, - bufs[j])) || - !collecting || - (!promisc && -- ((rte_is_unicast_ether_addr(&hdr->dst_addr) && -- !rte_is_same_ether_addr(bond_mac, -- &hdr->dst_addr)) || -- (!allmulti && -- rte_is_multicast_ether_addr(&hdr->dst_addr)))))) { -- -+ !is_bond_mac_addr(&hdr->dst_addr, bond_mac, -+ BOND_MAX_MAC_ADDRS) && -+ (rte_is_unicast_ether_addr(&hdr->dst_addr) || -+ !allmulti)))) { - if (hdr->ether_type == ether_type_slow_be) { - bond_mode_8023ad_handle_slow_pkt( - internals, slaves[idx], bufs[j]); --- -2.23.0 - diff --git a/0197-net-bonding-fix-slave-device-Rx-Tx-offload-configura.patch b/0197-net-bonding-fix-slave-device-Rx-Tx-offload-configura.patch deleted file mode 100644 index ee6e168..0000000 --- a/0197-net-bonding-fix-slave-device-Rx-Tx-offload-configura.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 6ca88723b7df208ffa5c43fdfda06381103e488a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 15 Nov 2022 12:06:08 +0800 -Subject: net/bonding: fix slave device Rx/Tx offload configuration - -[ upstream commit fdbc4e7704a7de0f41f72d4f5337b0eddaa81991 ] - -Normally, the Rx/Tx offload capability of bonding interface is -the intersection of the capability of all slave devices. And -Rx/Tx offloads configuration of slave device comes from bonding -interface. But now there is a risk that slave device retains its -previous offload configurations which is not within the offload -configurations of bond interface. - -Fixes: 57b156540f51 ("net/bonding: fix offloading configuration") - -Signed-off-by: Huisong Li -Acked-by: Min Hu (Connor) ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 17 ++++------------- - 1 file changed, 4 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index f1e7b6459a..2bf28b829d 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -1762,20 +1762,11 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev, - slave_eth_dev->data->dev_conf.link_speeds = - bonded_eth_dev->data->dev_conf.link_speeds; - -- slave_eth_dev->data->dev_conf.txmode.offloads |= -- bonded_eth_dev->data->dev_conf.txmode.offloads; -- -- slave_eth_dev->data->dev_conf.txmode.offloads &= -- (bonded_eth_dev->data->dev_conf.txmode.offloads | -- ~internals->tx_offload_capa); -- -- slave_eth_dev->data->dev_conf.rxmode.offloads |= -- bonded_eth_dev->data->dev_conf.rxmode.offloads; -- -- slave_eth_dev->data->dev_conf.rxmode.offloads &= -- (bonded_eth_dev->data->dev_conf.rxmode.offloads | -- ~internals->rx_offload_capa); -+ slave_eth_dev->data->dev_conf.txmode.offloads = -+ bonded_eth_dev->data->dev_conf.txmode.offloads; - -+ slave_eth_dev->data->dev_conf.rxmode.offloads = -+ bonded_eth_dev->data->dev_conf.rxmode.offloads; - - nb_rx_queues = bonded_eth_dev->data->nb_rx_queues; - nb_tx_queues = bonded_eth_dev->data->nb_tx_queues; --- -2.23.0 - diff --git a/0198-app-testpmd-fix-MAC-header-in-csum-forward-engine.patch b/0198-app-testpmd-fix-MAC-header-in-csum-forward-engine.patch deleted file mode 100644 index 00ef57e..0000000 --- a/0198-app-testpmd-fix-MAC-header-in-csum-forward-engine.patch +++ /dev/null @@ -1,154 +0,0 @@ -From a31eaf3090f26f73fa3996487d9bde36418dbcd9 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 15 Nov 2022 12:06:09 +0800 -Subject: app/testpmd: fix MAC header in csum forward engine - -[ upstream commit 008834b91ac9a9e4ea982e5d2a4526d1b90a8d18 ] - -MLX5 SR-IOV Tx engine will not transmit Ethernet frame -if destination MAC address matched local port address. The frame ether -looped-back to Rx or dropped, depending on the port configuration. - -Application running over MLX5 SR-IOV port cannot transmit packet -polled from Rx queue as is. The packet Ethernet destination address -must be changed. - -Add new run-time configuration parameter to the `csum` forwarding -engine to control MAC addresses configuration: - -testpmd> csum mac-swap on|off - -`mac-swap on` replace MAC addresses. -`mac-swap off` keep Ethernet header unchanged. - -Fixes: 9b4ea7ae77fa ("app/testpmd: revert MAC update in checksum forwarding") - -Signed-off-by: Gregory Etelson -Acked-by: Huisong Li ---- - app/test-pmd/cmdline.c | 50 +++++++++++++++++++++++++++++++++++++++++ - app/test-pmd/csumonly.c | 6 +++++ - app/test-pmd/testpmd.c | 5 +++-- - app/test-pmd/testpmd.h | 3 ++- - 4 files changed, 61 insertions(+), 3 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 8d4a88bb85..9e0e725913 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -4836,6 +4836,55 @@ cmdline_parse_inst_t cmd_csum_tunnel = { - }, - }; - -+struct cmd_csum_mac_swap_result { -+ cmdline_fixed_string_t csum; -+ cmdline_fixed_string_t parse; -+ cmdline_fixed_string_t onoff; -+ portid_t port_id; -+}; -+ -+static void -+cmd_csum_mac_swap_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_csum_mac_swap_result *res = parsed_result; -+ -+ if (port_id_is_invalid(res->port_id, ENABLED_WARN)) -+ return; -+ if (strcmp(res->onoff, "on") == 0) -+ ports[res->port_id].fwd_mac_swap = 1; -+ else -+ ports[res->port_id].fwd_mac_swap = 0; -+} -+ -+static cmdline_parse_token_string_t cmd_csum_mac_swap_csum = -+ TOKEN_STRING_INITIALIZER(struct cmd_csum_mac_swap_result, -+ csum, "csum"); -+static cmdline_parse_token_string_t cmd_csum_mac_swap_parse = -+ TOKEN_STRING_INITIALIZER(struct cmd_csum_mac_swap_result, -+ parse, "mac-swap"); -+static cmdline_parse_token_string_t cmd_csum_mac_swap_onoff = -+ TOKEN_STRING_INITIALIZER(struct cmd_csum_mac_swap_result, -+ onoff, "on#off"); -+static cmdline_parse_token_num_t cmd_csum_mac_swap_portid = -+ TOKEN_NUM_INITIALIZER(struct cmd_csum_mac_swap_result, -+ port_id, RTE_UINT16); -+ -+static cmdline_parse_inst_t cmd_csum_mac_swap = { -+ .f = cmd_csum_mac_swap_parsed, -+ .data = NULL, -+ .help_str = "csum mac-swap on|off : " -+ "Enable/Disable forward mac address swap", -+ .tokens = { -+ (void *)&cmd_csum_mac_swap_csum, -+ (void *)&cmd_csum_mac_swap_parse, -+ (void *)&cmd_csum_mac_swap_onoff, -+ (void *)&cmd_csum_mac_swap_portid, -+ NULL, -+ }, -+}; -+ - /* *** ENABLE HARDWARE SEGMENTATION IN TX NON-TUNNELED PACKETS *** */ - struct cmd_tso_set_result { - cmdline_fixed_string_t tso; -@@ -17699,6 +17748,7 @@ cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_csum_set, - (cmdline_parse_inst_t *)&cmd_csum_show, - (cmdline_parse_inst_t *)&cmd_csum_tunnel, -+ (cmdline_parse_inst_t *)&cmd_csum_mac_swap, - (cmdline_parse_inst_t *)&cmd_tso_set, - (cmdline_parse_inst_t *)&cmd_tso_show, - (cmdline_parse_inst_t *)&cmd_tunnel_tso_set, -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index 206968d37a..d8cb8c89aa 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -887,6 +887,12 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - * and inner headers */ - - eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *); -+ if (ports[fs->tx_port].fwd_mac_swap) { -+ rte_ether_addr_copy(&peer_eth_addrs[fs->peer_addr], -+ ð_hdr->dst_addr); -+ rte_ether_addr_copy(&ports[fs->tx_port].eth_addr, -+ ð_hdr->src_addr); -+ } - parse_ethernet(eth_hdr, &info); - l3_hdr = (char *)eth_hdr + info.l2_len; - -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index 2be92af9f8..ff9eabbcb7 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -4160,10 +4160,11 @@ init_port(void) - "rte_zmalloc(%d struct rte_port) failed\n", - RTE_MAX_ETHPORTS); - } -- for (i = 0; i < RTE_MAX_ETHPORTS; i++) -+ for (i = 0; i < RTE_MAX_ETHPORTS; i++) { -+ ports[i].fwd_mac_swap = 1; - ports[i].xstats_info.allocated = false; -- for (i = 0; i < RTE_MAX_ETHPORTS; i++) - LIST_INIT(&ports[i].flow_tunnel_list); -+ } - /* Initialize ports NUMA structures */ - memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS); - memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS); -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index ab6642585e..442f97ce3d 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -247,7 +247,8 @@ struct rte_port { - struct rte_ether_addr *mc_addr_pool; /**< pool of multicast addrs */ - uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ - uint8_t slave_flag : 1, /**< bonding slave port */ -- bond_flag : 1; /**< port is bond device */ -+ bond_flag : 1, /**< port is bond device */ -+ fwd_mac_swap : 1; /**< swap packet MAC before forward */ - struct port_flow *flow_list; /**< Associated flows. */ - struct port_indirect_action *actions_list; - /**< Associated indirect actions. */ --- -2.23.0 - diff --git a/0199-app-testpmd-update-bond-port-configurations-when-add.patch b/0199-app-testpmd-update-bond-port-configurations-when-add.patch deleted file mode 100644 index d973067..0000000 --- a/0199-app-testpmd-update-bond-port-configurations-when-add.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 97b384c9ecb993ea111bd7648a0aac9127917d22 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 15 Nov 2022 12:06:10 +0800 -Subject: app/testpmd: update bond port configurations when add slave - -[ upstream commit 76376bd9cd491fb0ca9c0b78346cee0ca7c4a351 ] - -Some capabilities (like, rx_offload_capa and tx_offload_capa) of bonding -device in dev_info is zero when no slave is added. And its capability will -be updated when add a new slave device. - -The capability to update dynamically may introduce some problems if not -handled properly. For example, the reconfig() is called to initialize -bonding port configurations when create a bonding device. The global -tx_mode is assigned to dev_conf.txmode. The DEV_TX_OFFLOAD_MBUF_FAST_FREE -which is the default value of global tx_mode.offloads in testpmd is removed -from bonding device configuration because of zero rx_offload_capa. -As a result, this offload isn't set to bonding device. - -Generally, port configurations of bonding device must be within the -intersection of the capability of all slave devices. If use original port -configurations, the removed capabilities because of adding a new slave may -cause failure when re-initialize bonding device. - -So port configurations of bonding device need to be updated because of the -added and removed capabilities. In addition, this also helps to ensure -consistency between testpmd and bonding device. - -Signed-off-by: Huisong Li -Reviewed-by: Min Hu (Connor) ---- - app/test-pmd/testpmd.c | 40 ++++++++++++++++++++++++++++++++++++++++ - app/test-pmd/testpmd.h | 3 ++- - 2 files changed, 42 insertions(+), 1 deletion(-) - -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index ff9eabbcb7..32098d4701 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -2778,6 +2778,41 @@ fill_xstats_display_info(void) - fill_xstats_display_info_for_port(pi); - } - -+/* -+ * Some capabilities (like, rx_offload_capa and tx_offload_capa) of bonding -+ * device in dev_info is zero when no slave is added. And its capability -+ * will be updated when add a new slave device. So adding a slave device need -+ * to update the port configurations of bonding device. -+ */ -+static void -+update_bonding_port_dev_conf(portid_t bond_pid) -+{ -+#ifdef RTE_NET_BOND -+ struct rte_port *port = &ports[bond_pid]; -+ uint16_t i; -+ int ret; -+ -+ ret = eth_dev_info_get_print_err(bond_pid, &port->dev_info); -+ if (ret != 0) { -+ fprintf(stderr, "Failed to get dev info for port = %u\n", -+ bond_pid); -+ return; -+ } -+ -+ if (port->dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) -+ port->dev_conf.txmode.offloads |= -+ RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; -+ /* Apply Tx offloads configuration */ -+ for (i = 0; i < port->dev_info.max_tx_queues; i++) -+ port->tx_conf[i].offloads = port->dev_conf.txmode.offloads; -+ -+ port->dev_conf.rx_adv_conf.rss_conf.rss_hf &= -+ port->dev_info.flow_type_rss_offloads; -+#else -+ RTE_SET_USED(bond_pid); -+#endif -+} -+ - int - start_port(portid_t pid) - { -@@ -2842,6 +2877,11 @@ start_port(portid_t pid) - return -1; - } - -+ if (port->bond_flag == 1 && port->update_conf == 1) { -+ update_bonding_port_dev_conf(pi); -+ port->update_conf = 0; -+ } -+ - /* configure port */ - diag = eth_dev_configure_mp(pi, nb_rxq + nb_hairpinq, - nb_txq + nb_hairpinq, -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 442f97ce3d..480dc3fa34 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -248,7 +248,8 @@ struct rte_port { - uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ - uint8_t slave_flag : 1, /**< bonding slave port */ - bond_flag : 1, /**< port is bond device */ -- fwd_mac_swap : 1; /**< swap packet MAC before forward */ -+ fwd_mac_swap : 1, /**< swap packet MAC before forward */ -+ update_conf : 1; /**< need to update bonding device configuration */ - struct port_flow *flow_list; /**< Associated flows. */ - struct port_indirect_action *actions_list; - /**< Associated indirect actions. */ --- -2.23.0 - diff --git a/0200-app-testpmd-fix-GENEVE-parsing-in-checksum-mode.patch b/0200-app-testpmd-fix-GENEVE-parsing-in-checksum-mode.patch deleted file mode 100644 index 60512e6..0000000 --- a/0200-app-testpmd-fix-GENEVE-parsing-in-checksum-mode.patch +++ /dev/null @@ -1,83 +0,0 @@ -From ecfa2e7054530f4a1eb9118a30a9bc6439b29bd8 Mon Sep 17 00:00:00 2001 -From: Raja Zidane -Date: Tue, 15 Nov 2022 12:06:11 +0800 -Subject: app/testpmd: fix GENEVE parsing in checksum mode - -[ upstream commit 993677affe391be8bb390c2625bc3d8bb857f0a5 ] - -The csum FWD mode parses any received packet to set mbuf offloads for -the transmitting burst, mainly in the checksum/TSO areas. -In the case of a tunnel header, the csum FWD tries to detect known -tunnels by the standard definition using the header's data and fallback -to check the packet type in the mbuf to see if the Rx port driver -already sign the packet as a tunnel. -In the fallback case, the csum assumes the tunnel is VXLAN and parses -the tunnel as VXLAN. -When the GENEVE tunnel was added to the known tunnels in csum, its -parsing trial was wrongly located after the pkt type detection, causing -the csum to parse the GENEVE header as VXLAN when the Rx port set the -tunnel packet type. - -Remove the fall back case to VXLAN. -Log error of unrecognized tunnel if no tunnel was parsed successfully. - -Fixes: c10a026c3b03 ("app/testpmd: introduce vxlan parsing function in csum fwd engine") -Cc: stable@dpdk.org - -Signed-off-by: Raja Zidane -Acked-by: Aman Singh -Acked-by: Ferruh Yigit ---- - app/test-pmd/csumonly.c | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index d8cb8c89aa..7c4c04be26 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -257,8 +257,7 @@ parse_gtp(struct rte_udp_hdr *udp_hdr, - /* Parse a vxlan header */ - static void - parse_vxlan(struct rte_udp_hdr *udp_hdr, -- struct testpmd_offload_info *info, -- uint32_t pkt_type) -+ struct testpmd_offload_info *info) - { - struct rte_ether_hdr *eth_hdr; - -@@ -266,8 +265,7 @@ parse_vxlan(struct rte_udp_hdr *udp_hdr, - * default vxlan port (rfc7348) or that the rx offload flag is set - * (i40e only currently) - */ -- if (udp_hdr->dst_port != _htons(RTE_VXLAN_DEFAULT_PORT) && -- RTE_ETH_IS_TUNNEL_PKT(pkt_type) == 0) -+ if (udp_hdr->dst_port != _htons(RTE_VXLAN_DEFAULT_PORT)) - return; - - update_tunnel_outer(info); -@@ -914,8 +912,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - RTE_MBUF_F_TX_TUNNEL_VXLAN_GPE; - goto tunnel_update; - } -- parse_vxlan(udp_hdr, &info, -- m->packet_type); -+ parse_vxlan(udp_hdr, &info); - if (info.is_tunnel) { - tx_ol_flags |= - RTE_MBUF_F_TX_TUNNEL_VXLAN; -@@ -927,6 +924,12 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - RTE_MBUF_F_TX_TUNNEL_GENEVE; - goto tunnel_update; - } -+ /* Always keep last. */ -+ if (unlikely(RTE_ETH_IS_TUNNEL_PKT( -+ m->packet_type) != 0)) { -+ TESTPMD_LOG(DEBUG, "Unknown tunnel packet. UDP dst port: %hu", -+ udp_hdr->dst_port); -+ } - } else if (info.l4_proto == IPPROTO_GRE) { - struct simple_gre_hdr *gre_hdr; - --- -2.23.0 - diff --git a/0201-net-add-UDP-TCP-checksum-in-mbuf-segments.patch b/0201-net-add-UDP-TCP-checksum-in-mbuf-segments.patch deleted file mode 100644 index bdaa89e..0000000 --- a/0201-net-add-UDP-TCP-checksum-in-mbuf-segments.patch +++ /dev/null @@ -1,239 +0,0 @@ -From 179fb7a7246a835dbf3fb0449faa506214468b5f Mon Sep 17 00:00:00 2001 -From: Xiaoyun Li -Date: Tue, 15 Nov 2022 12:06:12 +0800 -Subject: net: add UDP/TCP checksum in mbuf segments - -[ upstream commit d178f693bbfe07506d6e3e23a3ce9c34ee554444 ] - -Add functions to call rte_raw_cksum_mbuf() to calculate IPv4/6 -UDP/TCP checksum in mbuf which can be over multi-segments. - -Signed-off-by: Xiaoyun Li -Acked-by: Aman Singh -Acked-by: Ferruh Yigit -Tested-by: Sunil Pai G ---- - lib/net/rte_ip.h | 186 +++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 186 insertions(+) - -diff --git a/lib/net/rte_ip.h b/lib/net/rte_ip.h -index c575250852..534f401d26 100644 ---- a/lib/net/rte_ip.h -+++ b/lib/net/rte_ip.h -@@ -400,6 +400,65 @@ rte_ipv4_udptcp_cksum(const struct rte_ipv4_hdr *ipv4_hdr, const void *l4_hdr) - return cksum; - } - -+/** -+ * @internal Calculate the non-complemented IPv4 L4 checksum of a packet -+ */ -+static inline uint16_t -+__rte_ipv4_udptcp_cksum_mbuf(const struct rte_mbuf *m, -+ const struct rte_ipv4_hdr *ipv4_hdr, -+ uint16_t l4_off) -+{ -+ uint16_t raw_cksum; -+ uint32_t cksum; -+ -+ if (l4_off > m->pkt_len) -+ return 0; -+ -+ if (rte_raw_cksum_mbuf(m, l4_off, m->pkt_len - l4_off, &raw_cksum)) -+ return 0; -+ -+ cksum = raw_cksum + rte_ipv4_phdr_cksum(ipv4_hdr, 0); -+ -+ cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); -+ -+ return (uint16_t)cksum; -+} -+ -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change without prior notice. -+ * -+ * Compute the IPv4 UDP/TCP checksum of a packet. -+ * -+ * @param m -+ * The pointer to the mbuf. -+ * @param ipv4_hdr -+ * The pointer to the contiguous IPv4 header. -+ * @param l4_off -+ * The offset in bytes to start L4 checksum. -+ * @return -+ * The complemented checksum to set in the L4 header. -+ */ -+__rte_experimental -+static inline uint16_t -+rte_ipv4_udptcp_cksum_mbuf(const struct rte_mbuf *m, -+ const struct rte_ipv4_hdr *ipv4_hdr, uint16_t l4_off) -+{ -+ uint16_t cksum = __rte_ipv4_udptcp_cksum_mbuf(m, ipv4_hdr, l4_off); -+ -+ cksum = ~cksum; -+ -+ /* -+ * Per RFC 768: If the computed checksum is zero for UDP, -+ * it is transmitted as all ones -+ * (the equivalent in one's complement arithmetic). -+ */ -+ if (cksum == 0 && ipv4_hdr->next_proto_id == IPPROTO_UDP) -+ cksum = 0xffff; -+ -+ return cksum; -+} -+ - /** - * Validate the IPv4 UDP or TCP checksum. - * -@@ -426,6 +485,38 @@ rte_ipv4_udptcp_cksum_verify(const struct rte_ipv4_hdr *ipv4_hdr, - return 0; - } - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change without prior notice. -+ * -+ * Verify the IPv4 UDP/TCP checksum of a packet. -+ * -+ * In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0 -+ * (i.e. no checksum). -+ * -+ * @param m -+ * The pointer to the mbuf. -+ * @param ipv4_hdr -+ * The pointer to the contiguous IPv4 header. -+ * @param l4_off -+ * The offset in bytes to start L4 checksum. -+ * @return -+ * Return 0 if the checksum is correct, else -1. -+ */ -+__rte_experimental -+static inline uint16_t -+rte_ipv4_udptcp_cksum_mbuf_verify(const struct rte_mbuf *m, -+ const struct rte_ipv4_hdr *ipv4_hdr, -+ uint16_t l4_off) -+{ -+ uint16_t cksum = __rte_ipv4_udptcp_cksum_mbuf(m, ipv4_hdr, l4_off); -+ -+ if (cksum != 0xffff) -+ return -1; -+ -+ return 0; -+} -+ - /** - * IPv6 Header - */ -@@ -538,6 +629,68 @@ rte_ipv6_udptcp_cksum(const struct rte_ipv6_hdr *ipv6_hdr, const void *l4_hdr) - return cksum; - } - -+/** -+ * @internal Calculate the non-complemented IPv6 L4 checksum of a packet -+ */ -+static inline uint16_t -+__rte_ipv6_udptcp_cksum_mbuf(const struct rte_mbuf *m, -+ const struct rte_ipv6_hdr *ipv6_hdr, -+ uint16_t l4_off) -+{ -+ uint16_t raw_cksum; -+ uint32_t cksum; -+ -+ if (l4_off > m->pkt_len) -+ return 0; -+ -+ if (rte_raw_cksum_mbuf(m, l4_off, m->pkt_len - l4_off, &raw_cksum)) -+ return 0; -+ -+ cksum = raw_cksum + rte_ipv6_phdr_cksum(ipv6_hdr, 0); -+ -+ cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); -+ -+ return (uint16_t)cksum; -+} -+ -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change without prior notice. -+ * -+ * Process the IPv6 UDP or TCP checksum of a packet. -+ * -+ * The IPv6 header must not be followed by extension headers. The layer 4 -+ * checksum must be set to 0 in the L4 header by the caller. -+ * -+ * @param m -+ * The pointer to the mbuf. -+ * @param ipv6_hdr -+ * The pointer to the contiguous IPv6 header. -+ * @param l4_off -+ * The offset in bytes to start L4 checksum. -+ * @return -+ * The complemented checksum to set in the L4 header. -+ */ -+__rte_experimental -+static inline uint16_t -+rte_ipv6_udptcp_cksum_mbuf(const struct rte_mbuf *m, -+ const struct rte_ipv6_hdr *ipv6_hdr, uint16_t l4_off) -+{ -+ uint16_t cksum = __rte_ipv6_udptcp_cksum_mbuf(m, ipv6_hdr, l4_off); -+ -+ cksum = ~cksum; -+ -+ /* -+ * Per RFC 768: If the computed checksum is zero for UDP, -+ * it is transmitted as all ones -+ * (the equivalent in one's complement arithmetic). -+ */ -+ if (cksum == 0 && ipv6_hdr->proto == IPPROTO_UDP) -+ cksum = 0xffff; -+ -+ return cksum; -+} -+ - /** - * Validate the IPv6 UDP or TCP checksum. - * -@@ -565,6 +718,39 @@ rte_ipv6_udptcp_cksum_verify(const struct rte_ipv6_hdr *ipv6_hdr, - return 0; - } - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change without prior notice. -+ * -+ * Validate the IPv6 UDP or TCP checksum of a packet. -+ * -+ * In case of UDP, the caller must first check if udp_hdr->dgram_cksum is 0: -+ * this is either invalid or means no checksum in some situations. See 8.1 -+ * (Upper-Layer Checksums) in RFC 8200. -+ * -+ * @param m -+ * The pointer to the mbuf. -+ * @param ipv6_hdr -+ * The pointer to the contiguous IPv6 header. -+ * @param l4_off -+ * The offset in bytes to start L4 checksum. -+ * @return -+ * Return 0 if the checksum is correct, else -1. -+ */ -+__rte_experimental -+static inline int -+rte_ipv6_udptcp_cksum_mbuf_verify(const struct rte_mbuf *m, -+ const struct rte_ipv6_hdr *ipv6_hdr, -+ uint16_t l4_off) -+{ -+ uint16_t cksum = __rte_ipv6_udptcp_cksum_mbuf(m, ipv6_hdr, l4_off); -+ -+ if (cksum != 0xffff) -+ return -1; -+ -+ return 0; -+} -+ - /** IPv6 fragment extension header. */ - #define RTE_IPV6_EHDR_MF_SHIFT 0 - #define RTE_IPV6_EHDR_MF_MASK 1 --- -2.23.0 - diff --git a/0202-app-testpmd-add-SW-L4-checksum-in-multi-segments.patch b/0202-app-testpmd-add-SW-L4-checksum-in-multi-segments.patch deleted file mode 100644 index dcbe38e..0000000 --- a/0202-app-testpmd-add-SW-L4-checksum-in-multi-segments.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 2f89f906acfed6fe476f84875bbe1f2c53b8f31a Mon Sep 17 00:00:00 2001 -From: Xiaoyun Li -Date: Tue, 15 Nov 2022 12:06:13 +0800 -Subject: app/testpmd: add SW L4 checksum in multi-segments - -[ upstream commit e6b9d6411e91be7289409238f05ad1c09e8a0d05 ] - -Csum forwarding mode only supports software UDP/TCP csum calculation -for single segment packets when hardware offload is not enabled. -This patch enables software UDP/TCP csum calculation over multiple -segments. - -Signed-off-by: Xiaoyun Li -Tested-by: Sunil Pai G -Acked-by: Ferruh Yigit ---- - app/test-pmd/csumonly.c | 41 ++++++++++++++++++++++++++--------------- - 1 file changed, 26 insertions(+), 15 deletions(-) - -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index 7c4c04be26..10aab3431b 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -96,12 +96,13 @@ struct simple_gre_hdr { - } __rte_packed; - - static uint16_t --get_udptcp_checksum(void *l3_hdr, void *l4_hdr, uint16_t ethertype) -+get_udptcp_checksum(struct rte_mbuf *m, void *l3_hdr, uint16_t l4_off, -+ uint16_t ethertype) - { - if (ethertype == _htons(RTE_ETHER_TYPE_IPV4)) -- return rte_ipv4_udptcp_cksum(l3_hdr, l4_hdr); -+ return rte_ipv4_udptcp_cksum_mbuf(m, l3_hdr, l4_off); - else /* assume ethertype == RTE_ETHER_TYPE_IPV6 */ -- return rte_ipv6_udptcp_cksum(l3_hdr, l4_hdr); -+ return rte_ipv6_udptcp_cksum_mbuf(m, l3_hdr, l4_off); - } - - /* Parse an IPv4 header to fill l3_len, l4_len, and l4_proto */ -@@ -458,7 +459,7 @@ parse_encap_ip(void *encap_ip, struct testpmd_offload_info *info) - * depending on the testpmd command line configuration */ - static uint64_t - process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, -- uint64_t tx_offloads) -+ uint64_t tx_offloads, struct rte_mbuf *m) - { - struct rte_ipv4_hdr *ipv4_hdr = l3_hdr; - struct rte_udp_hdr *udp_hdr; -@@ -466,6 +467,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - struct rte_sctp_hdr *sctp_hdr; - uint64_t ol_flags = 0; - uint32_t max_pkt_len, tso_segsz = 0; -+ uint16_t l4_off; - - /* ensure packet is large enough to require tso */ - if (!info->is_tunnel) { -@@ -508,9 +510,15 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - if (tx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) { - ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; - } else { -+ if (info->is_tunnel) -+ l4_off = info->l2_len + -+ info->outer_l3_len + -+ info->l2_len + info->l3_len; -+ else -+ l4_off = info->l2_len + info->l3_len; - udp_hdr->dgram_cksum = 0; - udp_hdr->dgram_cksum = -- get_udptcp_checksum(l3_hdr, udp_hdr, -+ get_udptcp_checksum(m, l3_hdr, l4_off, - info->ethertype); - } - } -@@ -525,9 +533,14 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - else if (tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) { - ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; - } else { -+ if (info->is_tunnel) -+ l4_off = info->l2_len + info->outer_l3_len + -+ info->l2_len + info->l3_len; -+ else -+ l4_off = info->l2_len + info->l3_len; - tcp_hdr->cksum = 0; - tcp_hdr->cksum = -- get_udptcp_checksum(l3_hdr, tcp_hdr, -+ get_udptcp_checksum(m, l3_hdr, l4_off, - info->ethertype); - } - #ifdef RTE_LIB_GSO -@@ -555,7 +568,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - /* Calculate the checksum of outer header */ - static uint64_t - process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, -- uint64_t tx_offloads, int tso_enabled) -+ uint64_t tx_offloads, int tso_enabled, struct rte_mbuf *m) - { - struct rte_ipv4_hdr *ipv4_hdr = outer_l3_hdr; - struct rte_ipv6_hdr *ipv6_hdr = outer_l3_hdr; -@@ -609,12 +622,9 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, - /* do not recalculate udp cksum if it was 0 */ - if (udp_hdr->dgram_cksum != 0) { - udp_hdr->dgram_cksum = 0; -- if (info->outer_ethertype == _htons(RTE_ETHER_TYPE_IPV4)) -- udp_hdr->dgram_cksum = -- rte_ipv4_udptcp_cksum(ipv4_hdr, udp_hdr); -- else -- udp_hdr->dgram_cksum = -- rte_ipv6_udptcp_cksum(ipv6_hdr, udp_hdr); -+ udp_hdr->dgram_cksum = get_udptcp_checksum(m, outer_l3_hdr, -+ info->l2_len + info->outer_l3_len, -+ info->outer_ethertype); - } - - return ol_flags; -@@ -962,7 +972,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - - /* process checksums of inner headers first */ - tx_ol_flags |= process_inner_cksums(l3_hdr, &info, -- tx_offloads); -+ tx_offloads, m); - - /* Then process outer headers if any. Note that the software - * checksum will be wrong if one of the inner checksums is -@@ -970,7 +980,8 @@ pkt_burst_checksum_forward(struct fwd_stream *fs) - if (info.is_tunnel == 1) { - tx_ol_flags |= process_outer_cksums(outer_l3_hdr, &info, - tx_offloads, -- !!(tx_ol_flags & RTE_MBUF_F_TX_TCP_SEG)); -+ !!(tx_ol_flags & RTE_MBUF_F_TX_TCP_SEG), -+ m); - } - - /* step 3: fill the mbuf meta data (flags and header lengths) */ --- -2.23.0 - diff --git a/0203-app-testpmd-fix-L4-checksum-in-multi-segments.patch b/0203-app-testpmd-fix-L4-checksum-in-multi-segments.patch deleted file mode 100644 index 2640687..0000000 --- a/0203-app-testpmd-fix-L4-checksum-in-multi-segments.patch +++ /dev/null @@ -1,59 +0,0 @@ -From e6b89f7ed49494302ef1e9cd852281c808f5b14f Mon Sep 17 00:00:00 2001 -From: Kevin Liu -Date: Tue, 15 Nov 2022 12:06:14 +0800 -Subject: app/testpmd: fix L4 checksum in multi-segments - -[ upstream commit 7dc92d17298d8fd05a912606f02a094566ec0b3f ] - -Testpmd forwards packets in checksum mode that it needs to calculate -the checksum of each layer's protocol. - -In process_inner_cksums, when parsing tunnel packets, inner L4 offset -should be outer_l2_len + outer_l3_len + l2_len + l3_len. - -In process_outer_cksums, when parsing tunnel packets, outer L4 offset -should be outer_l2_len + outer_l3_len. - -Fixes: e6b9d6411e91 ("app/testpmd: add SW L4 checksum in multi-segments") - -Signed-off-by: Kevin Liu -Acked-by: Yuying Zhang -Acked-by: Aman Singh ---- - app/test-pmd/csumonly.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c -index 10aab3431b..47856dd70a 100644 ---- a/app/test-pmd/csumonly.c -+++ b/app/test-pmd/csumonly.c -@@ -511,7 +511,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; - } else { - if (info->is_tunnel) -- l4_off = info->l2_len + -+ l4_off = info->outer_l2_len + - info->outer_l3_len + - info->l2_len + info->l3_len; - else -@@ -534,7 +534,7 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info, - ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; - } else { - if (info->is_tunnel) -- l4_off = info->l2_len + info->outer_l3_len + -+ l4_off = info->outer_l2_len + info->outer_l3_len + - info->l2_len + info->l3_len; - else - l4_off = info->l2_len + info->l3_len; -@@ -623,7 +623,7 @@ process_outer_cksums(void *outer_l3_hdr, struct testpmd_offload_info *info, - if (udp_hdr->dgram_cksum != 0) { - udp_hdr->dgram_cksum = 0; - udp_hdr->dgram_cksum = get_udptcp_checksum(m, outer_l3_hdr, -- info->l2_len + info->outer_l3_len, -+ info->outer_l2_len + info->outer_l3_len, - info->outer_ethertype); - } - --- -2.23.0 - diff --git a/0204-net-bonding-fix-mbuf-fast-free-handling.patch b/0204-net-bonding-fix-mbuf-fast-free-handling.patch deleted file mode 100644 index 73b5613..0000000 --- a/0204-net-bonding-fix-mbuf-fast-free-handling.patch +++ /dev/null @@ -1,73 +0,0 @@ -From c90a36013ccaeeb3baf258e4e23120253faee7aa Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 15 Nov 2022 12:06:15 +0800 -Subject: net/bonding: fix mbuf fast free handling - -[ upstream commit b4924c0db589b5d4698abfab3ce60978d9df518b ] - -The RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE offload can't be used in bonding -mode Broadcast and mode 8023AD. Currently, bonding driver forcibly removes -from the dev->data->dev_conf.txmode.offloads and processes as success in -bond_ethdev_configure(). But this still cause that rte_eth_dev_configure() -fails to execute because of the failure of validating Tx offload in the -eth_dev_validate_offloads(). So this patch moves the modification of txmode -offlaods to the stage of adding slave device to report the correct txmode -offloads. - -Fixes: 18c41457cbae ("net/bonding: fix mbuf fast free usage") - -Signed-off-by: Huisong Li -Acked-by: Stephen Hemminger ---- - drivers/net/bonding/rte_eth_bond_api.c | 5 +++++ - drivers/net/bonding/rte_eth_bond_pmd.c | 11 ----------- - 2 files changed, 5 insertions(+), 11 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c -index b74477128a..1235573bf2 100644 ---- a/drivers/net/bonding/rte_eth_bond_api.c -+++ b/drivers/net/bonding/rte_eth_bond_api.c -@@ -544,6 +544,11 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, uint16_t slave_port_id) - return ret; - } - -+ /* Bond mode Broadcast & 8023AD don't support MBUF_FAST_FREE offload. */ -+ if (internals->mode == BONDING_MODE_8023AD || -+ internals->mode == BONDING_MODE_BROADCAST) -+ internals->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; -+ - bonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf &= - internals->flow_type_rss_offloads; - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 2bf28b829d..29871cf8a3 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -3600,7 +3600,6 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - const char *name = dev->device->name; - struct bond_dev_private *internals = dev->data->dev_private; - struct rte_kvargs *kvlist = internals->kvlist; -- uint64_t offloads; - int arg_count; - uint16_t port_id = dev - rte_eth_devices; - uint32_t link_speeds; -@@ -3652,16 +3651,6 @@ bond_ethdev_configure(struct rte_eth_dev *dev) - } - } - -- offloads = dev->data->dev_conf.txmode.offloads; -- if ((offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) && -- (internals->mode == BONDING_MODE_8023AD || -- internals->mode == BONDING_MODE_BROADCAST)) { -- RTE_BOND_LOG(WARNING, -- "bond mode broadcast & 8023AD don't support MBUF_FAST_FREE offload, force disable it."); -- offloads &= ~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE; -- dev->data->dev_conf.txmode.offloads = offloads; -- } -- - link_speeds = dev->data->dev_conf.link_speeds; - /* - * The default value of 'link_speeds' is zero. From its definition, --- -2.23.0 - diff --git a/0205-doc-fix-application-name-in-procinfo-guide.patch b/0205-doc-fix-application-name-in-procinfo-guide.patch deleted file mode 100644 index a733689..0000000 --- a/0205-doc-fix-application-name-in-procinfo-guide.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 3ebc362fe3f70616922d46f3959c1e6d63cf76dc Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Tue, 11 Oct 2022 19:18:43 +0800 -Subject: doc: fix application name in procinfo guide - -[ upstream commit 2a65f12f6ab461e2cb81192c6bdd136191c82ea9 ] - -In commit 996ef1176111 ("app: add all remaining apps to meson build"), -building the procinfo application through Meson has been done with a -binary name different from the previous Makefile build system [1]. - -When we dropped Makefile support, the documentation was not updated. - -Fixes: 3cc6ecfdfe85 ("build: remove makefiles") -Cc: stable@dpdk.org - -Signed-off-by: Dongdong Liu -Signed-off-by: David Marchand ---- - doc/guides/tools/proc_info.rst | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index 9772d97ef0..e4f0c83f1b 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -1,10 +1,10 @@ - .. SPDX-License-Identifier: BSD-3-Clause - Copyright(c) 2015 Intel Corporation. - --dpdk-procinfo Application --========================= -+dpdk-proc-info Application -+========================== - --The dpdk-procinfo application is a Data Plane Development Kit (DPDK) application -+The dpdk-proc-info application is a Data Plane Development Kit (DPDK) application - that runs as a DPDK secondary process and is capable of retrieving port - statistics, resetting port statistics, printing DPDK memory information and - displaying debug information for port. -@@ -17,7 +17,7 @@ The application has a number of command line options: - - .. code-block:: console - -- .//app/dpdk-procinfo -- -m | [-p PORTMASK] [--stats | --xstats | -+ .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name ] - -@@ -72,14 +72,14 @@ by name. For invalid or no mempool name no elements are displayed. - Limitations - ----------- - --* dpdk-procinfo should run alongside primary process with same DPDK version. -+* dpdk-proc-info should run alongside primary process with same DPDK version. - --* When running ``dpdk-procinfo`` with shared library mode, it is required to -+* When running ``dpdk-proc-info`` with shared library mode, it is required to - pass the same NIC PMD libraries as used for the primary application. Any - mismatch in PMD library arguments can lead to undefined behavior and results - affecting primary application too. - --* Stats retrieval using ``dpdk-procinfo`` is not supported for virtual devices like PCAP and TAP. -+* Stats retrieval using ``dpdk-proc-info`` is not supported for virtual devices like PCAP and TAP. - --* Since default DPDK EAL arguments for ``dpdk-procinfo`` are ``-c1, -n4 & --proc-type=secondary``, -+* Since default DPDK EAL arguments for ``dpdk-proc-info`` are ``-c1, -n4 & --proc-type=secondary``, - It is not expected that the user passes any EAL arguments. --- -2.23.0 - diff --git a/0206-doc-document-device-dump-in-procinfo-guide.patch b/0206-doc-document-device-dump-in-procinfo-guide.patch deleted file mode 100644 index b0c5617..0000000 --- a/0206-doc-document-device-dump-in-procinfo-guide.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 245e4f0da830830c6ca9b59ce9eb2f7d9ba6e0a5 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Tue, 11 Oct 2022 19:18:43 +0800 -Subject: doc: document device dump in procinfo guide - -[ upstream commit dd2658f8d0e4725f579ff098f1ee159d897d6abc ] - -The --show-port-private option was not documented. - -Fixes: bb947a7264da ("app/procinfo: dump device private info") - -Signed-off-by: Dongdong Liu -Signed-off-by: David Marchand ---- - doc/guides/tools/proc_info.rst | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index e4f0c83f1b..5dd6f9ecae 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -19,7 +19,8 @@ The application has a number of command line options: - - .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | -- --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name ] -+ --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | -+ --show-port-private ] - - Parameters - ~~~~~~~~~~ -@@ -69,6 +70,9 @@ mempool. For invalid or no mempool name, whole list is dump. - The iter-mempool parameter iterates and displays mempool elements specified - by name. For invalid or no mempool name no elements are displayed. - -+**--show-port-private** -+The show-port-private parameter displays ports private information. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0207-app-procinfo-remove-doxygen-comments.patch b/0207-app-procinfo-remove-doxygen-comments.patch deleted file mode 100644 index 1de48ed..0000000 --- a/0207-app-procinfo-remove-doxygen-comments.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 85da70e47d6f94ddaf88625b87e1ba9144c2df1d Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Tue, 11 Oct 2022 19:18:41 +0800 -Subject: app/procinfo: remove doxygen comments - -[ upstream commit 797f2f510ce10fd049f4815bd7cce9bc19c460be ] - -This code is to do cleanup for the wrong doxygen syntax comments -The DPDK API is documented using doxygen comment annotations in the -header files. The procinfo code seems no need to use doxygen comment. - -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 42 +++++++++++++++++++++--------------------- - 1 file changed, 21 insertions(+), 21 deletions(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index accb5e716d..a75a1aa9bd 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -48,33 +48,33 @@ - #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \ - STATS_BDR_FMT, s, w, STATS_BDR_FMT) - --/**< mask of enabled ports */ -+/* mask of enabled ports */ - static unsigned long enabled_port_mask; --/**< Enable stats. */ -+/* Enable stats. */ - static uint32_t enable_stats; --/**< Enable xstats. */ -+/* Enable xstats. */ - static uint32_t enable_xstats; --/**< Enable collectd format*/ -+/* Enable collectd format */ - static uint32_t enable_collectd_format; --/**< FD to send collectd format messages to STDOUT*/ -+/* FD to send collectd format messages to STDOUT */ - static int stdout_fd; --/**< Host id process is running on */ -+/* Host id process is running on */ - static char host_id[MAX_LONG_OPT_SZ]; - #ifdef RTE_LIB_METRICS --/**< Enable metrics. */ -+/* Enable metrics. */ - static uint32_t enable_metrics; - #endif --/**< Enable stats reset. */ -+/* Enable stats reset. */ - static uint32_t reset_stats; --/**< Enable xstats reset. */ -+/* Enable xstats reset. */ - static uint32_t reset_xstats; --/**< Enable memory info. */ -+/* Enable memory info. */ - static uint32_t mem_info; --/**< Enable displaying xstat name. */ -+/* Enable displaying xstat name. */ - static uint32_t enable_xstats_name; - static char *xstats_name; - --/**< Enable xstats by ids. */ -+/* Enable xstats by ids. */ - #define MAX_NB_XSTATS_IDS 1024 - static uint32_t nb_xstats_ids; - static uint64_t xstats_ids[MAX_NB_XSTATS_IDS]; -@@ -82,28 +82,28 @@ static uint64_t xstats_ids[MAX_NB_XSTATS_IDS]; - /* show border */ - static char bdr_str[MAX_STRING_LEN]; - --/**< Enable show port. */ -+/* Enable show port. */ - static uint32_t enable_shw_port; --/**< Enable show port private info. */ -+/* Enable show port private info. */ - static uint32_t enable_shw_port_priv; --/**< Enable show tm. */ -+/* Enable show tm. */ - static uint32_t enable_shw_tm; --/**< Enable show crypto. */ -+/* Enable show crypto. */ - static uint32_t enable_shw_crypto; --/**< Enable show ring. */ -+/* Enable show ring. */ - static uint32_t enable_shw_ring; - static char *ring_name; --/**< Enable show mempool. */ -+/* Enable show mempool. */ - static uint32_t enable_shw_mempool; - static char *mempool_name; --/**< Enable iter mempool. */ -+/* Enable iter mempool. */ - static uint32_t enable_iter_mempool; - static char *mempool_iter_name; --/**< Enable dump regs. */ -+/* Enable dump regs. */ - static uint32_t enable_dump_regs; - static char *dump_regs_file_prefix; - --/**< display usage */ -+/* display usage */ - static void - proc_info_usage(const char *prgname) - { --- -2.23.0 - diff --git a/0208-app-procinfo-dump-DPDK-version.patch b/0208-app-procinfo-dump-DPDK-version.patch deleted file mode 100644 index f82e2dc..0000000 --- a/0208-app-procinfo-dump-DPDK-version.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 1cc631c496d706bfc02cf776ef403b0c22bfede3 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Tue, 11 Oct 2022 19:18:36 +0800 -Subject: app/procinfo: dump DPDK version - -[ upstream commit 4778a8ec8bcf453f039b0663534cc37cb5367b43 ] - -Add support for dump dpdk version. - -The command is like: -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- --version - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 19 ++++++++++++++++++- - doc/guides/tools/proc_info.rst | 5 ++++- - 2 files changed, 22 insertions(+), 2 deletions(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index a75a1aa9bd..651d678cd1 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - - /* Maximum long option length for option parsing. */ - #define MAX_LONG_OPT_SZ 64 -@@ -102,6 +103,8 @@ static char *mempool_iter_name; - /* Enable dump regs. */ - static uint32_t enable_dump_regs; - static char *dump_regs_file_prefix; -+/* Enable show DPDK version. */ -+static uint32_t enable_shw_version; - - /* display usage */ - static void -@@ -130,6 +133,7 @@ proc_info_usage(const char *prgname) - " --show-crypto: to display crypto information\n" - " --show-ring[=name]: to display ring information\n" - " --show-mempool[=name]: to display mempool information\n" -+ " --version: to display DPDK version\n" - " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", - prgname); -@@ -242,6 +246,7 @@ proc_info_parse_args(int argc, char **argv) - {"show-mempool", optional_argument, NULL, 0}, - {"iter-mempool", required_argument, NULL, 0}, - {"dump-regs", required_argument, NULL, 0}, -+ {"version", 0, NULL, 0}, - {NULL, 0, 0, 0} - }; - -@@ -313,7 +318,9 @@ proc_info_parse_args(int argc, char **argv) - "dump-regs", MAX_LONG_OPT_SZ)) { - enable_dump_regs = 1; - dump_regs_file_prefix = optarg; -- } -+ } else if (!strncmp(long_option[option_index].name, -+ "version", MAX_LONG_OPT_SZ)) -+ enable_shw_version = 1; - break; - case 1: - /* Print xstat single value given by name*/ -@@ -1476,6 +1483,14 @@ dump_regs(char *file_prefix) - } - } - -+static void -+show_version(void) -+{ -+ snprintf(bdr_str, MAX_STRING_LEN, " show - DPDK version "); -+ STATS_BDR_STR(10, bdr_str); -+ printf("DPDK version: %s\n", rte_version()); -+} -+ - int - main(int argc, char **argv) - { -@@ -1589,6 +1604,8 @@ main(int argc, char **argv) - iter_mempool(mempool_iter_name); - if (enable_dump_regs) - dump_regs(dump_regs_file_prefix); -+ if (enable_shw_version) -+ show_version(); - - RTE_ETH_FOREACH_DEV(i) - rte_eth_dev_close(i); -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index 5dd6f9ecae..121142fdd4 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -20,7 +20,7 @@ The application has a number of command line options: - .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | -- --show-port-private ] -+ --show-port-private | --version ] - - Parameters - ~~~~~~~~~~ -@@ -73,6 +73,9 @@ by name. For invalid or no mempool name no elements are displayed. - **--show-port-private** - The show-port-private parameter displays ports private information. - -+**--version** -+The version parameter displays DPDK version. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0209-app-procinfo-dump-firmware-version.patch b/0209-app-procinfo-dump-firmware-version.patch deleted file mode 100644 index 865bdc7..0000000 --- a/0209-app-procinfo-dump-firmware-version.patch +++ /dev/null @@ -1,134 +0,0 @@ -From a9114b29e2916f51faac5923cab0a12c34749d10 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Tue, 11 Oct 2022 19:18:37 +0800 -Subject: app/procinfo: dump firmware version - -[ upstream commit 37ebf5ab67d7ef4b532819de47ab780dded655e4 ] - -Add support for dump ethdev firmware version. - -The command is like: -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- --firmware-version - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 35 ++++++++++++++++++++++++++++++++++ - doc/guides/tools/proc_info.rst | 5 ++++- - 2 files changed, 39 insertions(+), 1 deletion(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index 651d678cd1..351c55896b 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -45,6 +45,8 @@ - #define MAX_LONG_OPT_SZ 64 - #define MAX_STRING_LEN 256 - -+#define ETHDEV_FWVERS_LEN 32 -+ - #define STATS_BDR_FMT "========================================" - #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \ - STATS_BDR_FMT, s, w, STATS_BDR_FMT) -@@ -105,6 +107,8 @@ static uint32_t enable_dump_regs; - static char *dump_regs_file_prefix; - /* Enable show DPDK version. */ - static uint32_t enable_shw_version; -+/* Enable show ethdev firmware version. */ -+static uint32_t enable_shw_fw_version; - - /* display usage */ - static void -@@ -134,6 +138,7 @@ proc_info_usage(const char *prgname) - " --show-ring[=name]: to display ring information\n" - " --show-mempool[=name]: to display mempool information\n" - " --version: to display DPDK version\n" -+ " --firmware-version: to display ethdev firmware version\n" - " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", - prgname); -@@ -247,6 +252,7 @@ proc_info_parse_args(int argc, char **argv) - {"iter-mempool", required_argument, NULL, 0}, - {"dump-regs", required_argument, NULL, 0}, - {"version", 0, NULL, 0}, -+ {"firmware-version", 0, NULL, 0}, - {NULL, 0, 0, 0} - }; - -@@ -321,6 +327,9 @@ proc_info_parse_args(int argc, char **argv) - } else if (!strncmp(long_option[option_index].name, - "version", MAX_LONG_OPT_SZ)) - enable_shw_version = 1; -+ else if (!strncmp(long_option[option_index].name, -+ "firmware-version", MAX_LONG_OPT_SZ)) -+ enable_shw_fw_version = 1; - break; - case 1: - /* Print xstat single value given by name*/ -@@ -1491,6 +1500,30 @@ show_version(void) - printf("DPDK version: %s\n", rte_version()); - } - -+static void -+show_firmware_version(void) -+{ -+ char fw_version[ETHDEV_FWVERS_LEN]; -+ uint16_t i; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " show - firmware version "); -+ STATS_BDR_STR(10, bdr_str); -+ -+ RTE_ETH_FOREACH_DEV(i) { -+ /* Skip if port is not in mask */ -+ if ((enabled_port_mask & (1ul << i)) == 0) -+ continue; -+ -+ if (rte_eth_dev_fw_version_get(i, fw_version, -+ ETHDEV_FWVERS_LEN) == 0) -+ printf("Ethdev port %u firmware version: %s\n", i, -+ fw_version); -+ else -+ printf("Ethdev port %u firmware version: %s\n", i, -+ "not available"); -+ } -+} -+ - int - main(int argc, char **argv) - { -@@ -1606,6 +1639,8 @@ main(int argc, char **argv) - dump_regs(dump_regs_file_prefix); - if (enable_shw_version) - show_version(); -+ if (enable_shw_fw_version) -+ show_firmware_version(); - - RTE_ETH_FOREACH_DEV(i) - rte_eth_dev_close(i); -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index 121142fdd4..4eb9fb9249 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -20,7 +20,7 @@ The application has a number of command line options: - .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | -- --show-port-private | --version ] -+ --show-port-private | --version | --firmware-version ] - - Parameters - ~~~~~~~~~~ -@@ -76,6 +76,9 @@ The show-port-private parameter displays ports private information. - **--version** - The version parameter displays DPDK version. - -+**--firmware-version** -+The firmware-version parameter displays ethdev firmware version. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0210-app-procinfo-dump-RSS-RETA.patch b/0210-app-procinfo-dump-RSS-RETA.patch deleted file mode 100644 index 84c8f64..0000000 --- a/0210-app-procinfo-dump-RSS-RETA.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 1ec0e71ea5d6b0fbb5bbe7bcde8bf11f57a708ef Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Tue, 11 Oct 2022 19:18:38 +0800 -Subject: app/procinfo: dump RSS RETA - -[ upstream commit 0cc5126ccfe5b67b60d869d036cf40496f7591d3 ] - -This patch add support for RSS reta dump. - -The command is like: -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- --show-rss-reta - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 57 ++++++++++++++++++++++++++++++++++ - doc/guides/tools/proc_info.rst | 5 ++- - 2 files changed, 61 insertions(+), 1 deletion(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index 351c55896b..efae5c6036 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -46,6 +46,8 @@ - #define MAX_STRING_LEN 256 - - #define ETHDEV_FWVERS_LEN 32 -+#define RTE_RETA_CONF_GROUP_NUM 32 -+#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) - - #define STATS_BDR_FMT "========================================" - #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \ -@@ -109,6 +111,8 @@ static char *dump_regs_file_prefix; - static uint32_t enable_shw_version; - /* Enable show ethdev firmware version. */ - static uint32_t enable_shw_fw_version; -+/* Enable show RSS reta. */ -+static uint32_t enable_shw_rss_reta; - - /* display usage */ - static void -@@ -139,6 +143,7 @@ proc_info_usage(const char *prgname) - " --show-mempool[=name]: to display mempool information\n" - " --version: to display DPDK version\n" - " --firmware-version: to display ethdev firmware version\n" -+ " --show-rss-reta: to display ports redirection table\n" - " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", - prgname); -@@ -253,6 +258,7 @@ proc_info_parse_args(int argc, char **argv) - {"dump-regs", required_argument, NULL, 0}, - {"version", 0, NULL, 0}, - {"firmware-version", 0, NULL, 0}, -+ {"show-rss-reta", 0, NULL, 0}, - {NULL, 0, 0, 0} - }; - -@@ -330,6 +336,9 @@ proc_info_parse_args(int argc, char **argv) - else if (!strncmp(long_option[option_index].name, - "firmware-version", MAX_LONG_OPT_SZ)) - enable_shw_fw_version = 1; -+ else if (!strncmp(long_option[option_index].name, -+ "show-rss-reta", MAX_LONG_OPT_SZ)) -+ enable_shw_rss_reta = 1; - break; - case 1: - /* Print xstat single value given by name*/ -@@ -1524,6 +1533,52 @@ show_firmware_version(void) - } - } - -+static void -+show_port_rss_reta_info(void) -+{ -+ struct rte_eth_rss_reta_entry64 reta_conf[RTE_RETA_CONF_GROUP_NUM + 1]; -+ struct rte_eth_dev_info dev_info; -+ uint16_t i, idx, shift; -+ uint16_t num; -+ uint16_t id; -+ int ret; -+ -+ RTE_ETH_FOREACH_DEV(id) { -+ /* Skip if port is not in mask */ -+ if ((enabled_port_mask & (1ul << id)) == 0) -+ continue; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", id); -+ STATS_BDR_STR(5, bdr_str); -+ -+ ret = rte_eth_dev_info_get(id, &dev_info); -+ if (ret != 0) { -+ fprintf(stderr, "Error getting device info: %s\n", -+ strerror(-ret)); -+ return; -+ } -+ -+ num = DIV_ROUND_UP(dev_info.reta_size, RTE_ETH_RETA_GROUP_SIZE); -+ memset(reta_conf, 0, sizeof(reta_conf)); -+ for (i = 0; i < num; i++) -+ reta_conf[i].mask = ~0ULL; -+ -+ ret = rte_eth_dev_rss_reta_query(id, reta_conf, dev_info.reta_size); -+ if (ret != 0) { -+ fprintf(stderr, "Error getting RSS RETA info: %s\n", -+ strerror(-ret)); -+ return; -+ } -+ -+ for (i = 0; i < dev_info.reta_size; i++) { -+ idx = i / RTE_ETH_RETA_GROUP_SIZE; -+ shift = i % RTE_ETH_RETA_GROUP_SIZE; -+ printf("RSS RETA configuration: hash index=%u, queue=%u\n", -+ i, reta_conf[idx].reta[shift]); -+ } -+ } -+} -+ - int - main(int argc, char **argv) - { -@@ -1641,6 +1696,8 @@ main(int argc, char **argv) - show_version(); - if (enable_shw_fw_version) - show_firmware_version(); -+ if (enable_shw_rss_reta) -+ show_port_rss_reta_info(); - - RTE_ETH_FOREACH_DEV(i) - rte_eth_dev_close(i); -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index 4eb9fb9249..7c8d115fdf 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -20,7 +20,7 @@ The application has a number of command line options: - .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | -- --show-port-private | --version | --firmware-version ] -+ --show-port-private | --version | --firmware-version | --show-rss-reta ] - - Parameters - ~~~~~~~~~~ -@@ -79,6 +79,9 @@ The version parameter displays DPDK version. - **--firmware-version** - The firmware-version parameter displays ethdev firmware version. - -+**--show-rss-reta** -+The show-rss-reta parameter displays ports rss redirection table. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0211-app-procinfo-dump-module-EEPROM-info.patch b/0211-app-procinfo-dump-module-EEPROM-info.patch deleted file mode 100644 index fa5d3a7..0000000 --- a/0211-app-procinfo-dump-module-EEPROM-info.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 24094ec56e38b32eb2d8bab9822a9fb1355a5ef4 Mon Sep 17 00:00:00 2001 -From: "Min Hu (Connor)" -Date: Tue, 11 Oct 2022 19:18:39 +0800 -Subject: app/procinfo: dump module EEPROM info - -[ upstream commit 0084463ea0042f15b3ef50d9e4c47dbe4d3704b1 ] - -This patch add support for module eeprom info dump. - -The command is like: -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- --show-module-eeprom - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 52 ++++++++++++++++++++++++++++++++++ - doc/guides/tools/proc_info.rst | 6 +++- - 2 files changed, 57 insertions(+), 1 deletion(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index efae5c6036..2d12644543 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -48,6 +48,7 @@ - #define ETHDEV_FWVERS_LEN 32 - #define RTE_RETA_CONF_GROUP_NUM 32 - #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -+#define EEPROM_DUMP_CHUNKSIZE 1024 - - #define STATS_BDR_FMT "========================================" - #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \ -@@ -113,6 +114,8 @@ static uint32_t enable_shw_version; - static uint32_t enable_shw_fw_version; - /* Enable show RSS reta. */ - static uint32_t enable_shw_rss_reta; -+/* Enable show module eeprom information. */ -+static uint32_t enable_shw_module_eeprom; - - /* display usage */ - static void -@@ -144,6 +147,7 @@ proc_info_usage(const char *prgname) - " --version: to display DPDK version\n" - " --firmware-version: to display ethdev firmware version\n" - " --show-rss-reta: to display ports redirection table\n" -+ " --show-module-eeprom: to display ports module eeprom information\n" - " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", - prgname); -@@ -259,6 +263,7 @@ proc_info_parse_args(int argc, char **argv) - {"version", 0, NULL, 0}, - {"firmware-version", 0, NULL, 0}, - {"show-rss-reta", 0, NULL, 0}, -+ {"show-module-eeprom", 0, NULL, 0}, - {NULL, 0, 0, 0} - }; - -@@ -339,6 +344,9 @@ proc_info_parse_args(int argc, char **argv) - else if (!strncmp(long_option[option_index].name, - "show-rss-reta", MAX_LONG_OPT_SZ)) - enable_shw_rss_reta = 1; -+ else if (!strncmp(long_option[option_index].name, -+ "show-module-eeprom", MAX_LONG_OPT_SZ)) -+ enable_shw_module_eeprom = 1; - break; - case 1: - /* Print xstat single value given by name*/ -@@ -1579,6 +1587,48 @@ show_port_rss_reta_info(void) - } - } - -+static void -+show_module_eeprom_info(void) -+{ -+ unsigned char bytes_eeprom[EEPROM_DUMP_CHUNKSIZE]; -+ struct rte_eth_dev_module_info module_info; -+ struct rte_dev_eeprom_info eeprom_info; -+ uint16_t i; -+ int ret; -+ -+ RTE_ETH_FOREACH_DEV(i) { -+ /* Skip if port is not in mask */ -+ if ((enabled_port_mask & (1ul << i)) == 0) -+ continue; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", i); -+ STATS_BDR_STR(5, bdr_str); -+ -+ ret = rte_eth_dev_get_module_info(i, &module_info); -+ if (ret != 0) { -+ fprintf(stderr, "Module EEPROM information read error: %s\n", -+ strerror(-ret)); -+ return; -+ } -+ -+ eeprom_info.offset = 0; -+ eeprom_info.length = module_info.eeprom_len; -+ eeprom_info.data = bytes_eeprom; -+ -+ ret = rte_eth_dev_get_module_eeprom(i, &eeprom_info); -+ if (ret != 0) { -+ fprintf(stderr, "Module EEPROM read error: %s\n", -+ strerror(-ret)); -+ return; -+ } -+ -+ rte_hexdump(stdout, "hexdump", eeprom_info.data, -+ eeprom_info.length); -+ printf("Finish -- Port: %u MODULE EEPROM length: %d bytes\n", -+ i, eeprom_info.length); -+ } -+} -+ - int - main(int argc, char **argv) - { -@@ -1698,6 +1748,8 @@ main(int argc, char **argv) - show_firmware_version(); - if (enable_shw_rss_reta) - show_port_rss_reta_info(); -+ if (enable_shw_module_eeprom) -+ show_module_eeprom_info(); - - RTE_ETH_FOREACH_DEV(i) - rte_eth_dev_close(i); -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index 7c8d115fdf..dc5d017cff 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -20,7 +20,8 @@ The application has a number of command line options: - .//app/dpdk-proc-info -- -m | [-p PORTMASK] [--stats | --xstats | - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | -- --show-port-private | --version | --firmware-version | --show-rss-reta ] -+ --show-port-private | --version | --firmware-version | --show-rss-reta | -+ --show-module-eeprom ] - - Parameters - ~~~~~~~~~~ -@@ -82,6 +83,9 @@ The firmware-version parameter displays ethdev firmware version. - **--show-rss-reta** - The show-rss-reta parameter displays ports rss redirection table. - -+**--show-module-eeprom** -+The show-module-eeprom parameter displays ports module eeprom information. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0212-app-procinfo-add-burst-mode-to-Rx-Tx-queue-info.patch b/0212-app-procinfo-add-burst-mode-to-Rx-Tx-queue-info.patch deleted file mode 100644 index 9889d3d..0000000 --- a/0212-app-procinfo-add-burst-mode-to-Rx-Tx-queue-info.patch +++ /dev/null @@ -1,76 +0,0 @@ -From cf883e9e107e5f646ab8cb41c50e0cd0ab41b3ce Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 11 Oct 2022 19:18:40 +0800 -Subject: app/procinfo: add burst mode to Rx/Tx queue info - -[ upstream commit a6d81dc0326aae58ea377fc1dc3d62f6bad4ad94 ] - -Add dump of Rx/Tx burst mode in --show-port. - -Sample output changes: - - rx queue -- -- 0 descriptors 0/1024 drop_en rx buffer size 2048 \ - mempool mb_pool_0 socket 0 -+ -- 0 descriptors 0/1024 drop_en rx buffer size 2048 \ - mempool mb_pool_0 socket 0 burst mode : Vector Neon - - tx queue -- -- 0 descriptors 1024 thresh 32/928 \ - offloads : MBUF_FAST_FREE -+ -- 0 descriptors 1024 thresh 32/928 \ - offloads : MBUF_FAST_FREE burst mode : Scalar - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index 2d12644543..dc948c7cc5 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -845,6 +845,7 @@ show_port(void) - - for (j = 0; j < dev_info.nb_rx_queues; j++) { - struct rte_eth_rxq_info queue_info; -+ struct rte_eth_burst_mode mode; - int count; - - ret = rte_eth_rx_queue_info_get(i, j, &queue_info); -@@ -880,11 +881,18 @@ show_port(void) - if (queue_info.conf.offloads != 0) - show_offloads(queue_info.conf.offloads, rte_eth_dev_rx_offload_name); - -+ if (rte_eth_rx_burst_mode_get(i, j, &mode) == 0) -+ printf(" burst mode : %s%s", -+ mode.info, -+ mode.flags & RTE_ETH_BURST_FLAG_PER_QUEUE ? -+ " (per queue)" : ""); -+ - printf("\n"); - } - - for (j = 0; j < dev_info.nb_tx_queues; j++) { - struct rte_eth_txq_info queue_info; -+ struct rte_eth_burst_mode mode; - - ret = rte_eth_tx_queue_info_get(i, j, &queue_info); - if (ret != 0) -@@ -905,6 +913,13 @@ show_port(void) - - if (queue_info.conf.offloads != 0) - show_offloads(queue_info.conf.offloads, rte_eth_dev_tx_offload_name); -+ -+ if (rte_eth_tx_burst_mode_get(i, j, &mode) == 0) -+ printf(" burst mode : %s%s", -+ mode.info, -+ mode.flags & RTE_ETH_BURST_FLAG_PER_QUEUE ? -+ " (per queue)" : ""); -+ - printf("\n"); - } - --- -2.23.0 - diff --git a/0213-app-procinfo-dump-detailed-info-for-Rx-Tx-descriptor.patch b/0213-app-procinfo-dump-detailed-info-for-Rx-Tx-descriptor.patch deleted file mode 100644 index 4489047..0000000 --- a/0213-app-procinfo-dump-detailed-info-for-Rx-Tx-descriptor.patch +++ /dev/null @@ -1,223 +0,0 @@ -From 95af4fb4b6c89c9488637920c497849b9ffb1bc6 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Tue, 11 Oct 2022 19:18:42 +0800 -Subject: app/procinfo: dump detailed info for Rx/Tx descriptors - -[ upstream commit 6ff065b221b1048e27a0c9a9438d0f11e6fae06d ] - -This patch support Rx/Tx descriptor dump - -The command is like: -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- ---show-rx-descriptor queue_id:offset:num - -dpdk-proc-info -a xxxx:xx:xx.x --file-prefix=xxx -- ---show-tx-descriptor queue_id:offset:num - -queue_id: A queue identifier on this port. -offset: The offset of the descriptor starting from tail. -num: The number of the descriptors to dump. - -Signed-off-by: Min Hu (Connor) -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan ---- - app/proc-info/main.c | 104 +++++++++++++++++++++++++++++++++ - doc/guides/tools/proc_info.rst | 17 +++++- - 2 files changed, 120 insertions(+), 1 deletion(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index dc948c7cc5..0cc01e3dad 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -117,6 +117,21 @@ static uint32_t enable_shw_rss_reta; - /* Enable show module eeprom information. */ - static uint32_t enable_shw_module_eeprom; - -+/* Enable dump Rx/Tx descriptor. */ -+static uint32_t enable_shw_rx_desc_dump; -+static uint32_t enable_shw_tx_desc_dump; -+ -+#define DESC_PARAM_NUM 3 -+ -+struct desc_param { -+ uint16_t queue_id; /* A queue identifier on this port. */ -+ uint16_t offset; /* The offset of the descriptor starting from tail. */ -+ uint16_t num; /* The number of the descriptors to dump. */ -+}; -+ -+static struct desc_param rx_desc_param; -+static struct desc_param tx_desc_param; -+ - /* display usage */ - static void - proc_info_usage(const char *prgname) -@@ -148,6 +163,14 @@ proc_info_usage(const char *prgname) - " --firmware-version: to display ethdev firmware version\n" - " --show-rss-reta: to display ports redirection table\n" - " --show-module-eeprom: to display ports module eeprom information\n" -+ " --show-rx-descriptor queue_id:offset:num to display ports Rx descriptor information. " -+ "queue_id: A Rx queue identifier on this port. " -+ "offset: The offset of the descriptor starting from tail. " -+ "num: The number of the descriptors to dump.\n" -+ " --show-tx-descriptor queue_id:offset:num to display ports Tx descriptor information. " -+ "queue_id: A Tx queue identifier on this port. " -+ "offset: The offset of the descriptor starting from tail. " -+ "num: The number of the descriptors to dump.\n" - " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", - prgname); -@@ -200,6 +223,19 @@ parse_xstats_ids(char *list, uint64_t *ids, int limit) { - return length; - } - -+static int -+parse_descriptor_param(char *list, struct desc_param *desc) -+{ -+ int ret; -+ -+ ret = sscanf(list, "%hu:%hu:%hu", &desc->queue_id, &desc->offset, -+ &desc->num); -+ if (ret != DESC_PARAM_NUM) -+ return -EINVAL; -+ -+ return 0; -+} -+ - static int - proc_info_preparse_args(int argc, char **argv) - { -@@ -264,6 +300,8 @@ proc_info_parse_args(int argc, char **argv) - {"firmware-version", 0, NULL, 0}, - {"show-rss-reta", 0, NULL, 0}, - {"show-module-eeprom", 0, NULL, 0}, -+ {"show-rx-descriptor", required_argument, NULL, 1}, -+ {"show-tx-descriptor", required_argument, NULL, 1}, - {NULL, 0, 0, 0} - }; - -@@ -367,6 +405,26 @@ proc_info_parse_args(int argc, char **argv) - return -1; - } - nb_xstats_ids = ret; -+ } else if (!strncmp(long_option[option_index].name, -+ "show-rx-descriptor", MAX_LONG_OPT_SZ)) { -+ int ret = parse_descriptor_param(optarg, -+ &rx_desc_param); -+ if (ret < 0) { -+ fprintf(stderr, "Error parsing Rx descriptor param: %s\n", -+ strerror(-ret)); -+ return -1; -+ } -+ enable_shw_rx_desc_dump = 1; -+ } else if (!strncmp(long_option[option_index].name, -+ "show-tx-descriptor", MAX_LONG_OPT_SZ)) { -+ int ret = parse_descriptor_param(optarg, -+ &tx_desc_param); -+ if (ret < 0) { -+ fprintf(stderr, "Error parsing Tx descriptor param: %s\n", -+ strerror(-ret)); -+ return -1; -+ } -+ enable_shw_tx_desc_dump = 1; - } - break; - default: -@@ -1644,6 +1702,48 @@ show_module_eeprom_info(void) - } - } - -+static void -+nic_rx_descriptor_display(uint16_t port_id, struct desc_param *desc) -+{ -+ uint16_t queue_id = desc->queue_id; -+ uint16_t offset = desc->offset; -+ uint16_t num = desc->num; -+ int ret; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " show - Rx descriptor "); -+ STATS_BDR_STR(10, bdr_str); -+ -+ printf("Dump ethdev Rx descriptor for port %u, queue %u, offset %u, num %u\n", -+ port_id, queue_id, offset, num); -+ -+ ret = rte_eth_rx_descriptor_dump(port_id, queue_id, offset, num, -+ stdout); -+ if (ret < 0) -+ fprintf(stderr, "Error dumping ethdev Rx descriptor: %s\n", -+ strerror(-ret)); -+} -+ -+static void -+nic_tx_descriptor_display(uint16_t port_id, struct desc_param *desc) -+{ -+ uint16_t queue_id = desc->queue_id; -+ uint16_t offset = desc->offset; -+ uint16_t num = desc->num; -+ int ret; -+ -+ snprintf(bdr_str, MAX_STRING_LEN, " show - Tx descriptor "); -+ STATS_BDR_STR(10, bdr_str); -+ -+ printf("Dump ethdev Tx descriptor for port %u, queue %u, offset %u, num %u\n", -+ port_id, queue_id, offset, num); -+ -+ ret = rte_eth_tx_descriptor_dump(port_id, queue_id, offset, num, -+ stdout); -+ if (ret < 0) -+ fprintf(stderr, "Error dumping ethdev Tx descriptor: %s\n", -+ strerror(-ret)); -+} -+ - int - main(int argc, char **argv) - { -@@ -1732,6 +1832,10 @@ main(int argc, char **argv) - metrics_display(i); - #endif - -+ if (enable_shw_rx_desc_dump) -+ nic_rx_descriptor_display(i, &rx_desc_param); -+ if (enable_shw_tx_desc_dump) -+ nic_tx_descriptor_display(i, &tx_desc_param); - } - - #ifdef RTE_LIB_METRICS -diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst -index dc5d017cff..cf3502a8cb 100644 ---- a/doc/guides/tools/proc_info.rst -+++ b/doc/guides/tools/proc_info.rst -@@ -21,7 +21,8 @@ The application has a number of command line options: - --stats-reset | --xstats-reset] [ --show-port | --show-tm | --show-crypto | - --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | - --show-port-private | --version | --firmware-version | --show-rss-reta | -- --show-module-eeprom ] -+ --show-module-eeprom | --show-rx-descriptor queue_id:offset:num | -+ --show-tx-descriptor queue_id:offset:num ] - - Parameters - ~~~~~~~~~~ -@@ -86,6 +87,20 @@ The show-rss-reta parameter displays ports rss redirection table. - **--show-module-eeprom** - The show-module-eeprom parameter displays ports module eeprom information. - -+**--show-rx-descriptor queue_id:offset:num** -+The show-rx-descriptor parameter displays ports Rx descriptor information -+specified by queue_id, offset and num. -+queue_id: A Rx queue identifier on this port. -+offset: The offset of the descriptor starting from tail. -+num: The number of the descriptors to dump. -+ -+**--show-tx-descriptor queue_id:offset:num** -+The show-tx-descriptor parameter displays ports Tx descriptor information -+specified by queue_id, offset and num. -+queue_id: A Tx queue identifier on this port. -+offset: The offset of the descriptor starting from tail. -+num: The number of the descriptors to dump. -+ - Limitations - ----------- - --- -2.23.0 - diff --git a/0214-dma-hisilicon-support-vchan-status-query.patch b/0214-dma-hisilicon-support-vchan-status-query.patch deleted file mode 100644 index 0c7ad0d..0000000 --- a/0214-dma-hisilicon-support-vchan-status-query.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 400f952c52abac8906cc64c0ef644cb450ef7deb Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 27 May 2022 11:40:55 +0800 -Subject: dma/hisilicon: support vchan status query - -[ upstream commit 157e8326e9ef627dc6bca8110a103496bfb6fd88 ] - -This patch adds support for vchan-status ops. - -Signed-off-by: Chengwen Feng ---- - drivers/dma/hisilicon/hisi_dmadev.c | 30 +++++++++++++++++++++++++++++ - drivers/dma/hisilicon/hisi_dmadev.h | 7 ++++++- - 2 files changed, 36 insertions(+), 1 deletion(-) - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.c b/drivers/dma/hisilicon/hisi_dmadev.c -index fbe09284ed..9494b60779 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.c -+++ b/drivers/dma/hisilicon/hisi_dmadev.c -@@ -461,6 +461,27 @@ hisi_dma_stats_reset(struct rte_dma_dev *dev, uint16_t vchan) - return 0; - } - -+static int -+hisi_dma_vchan_status(const struct rte_dma_dev *dev, uint16_t vchan, -+ enum rte_dma_vchan_status *status) -+{ -+ struct hisi_dma_dev *hw = dev->data->dev_private; -+ uint32_t val; -+ -+ RTE_SET_USED(vchan); -+ -+ val = hisi_dma_read_queue(hw, HISI_DMA_QUEUE_FSM_REG); -+ val = FIELD_GET(HISI_DMA_QUEUE_FSM_STS_M, val); -+ if (val == HISI_DMA_STATE_RUN) -+ *status = RTE_DMA_VCHAN_ACTIVE; -+ else if (val == HISI_DMA_STATE_CPL) -+ *status = RTE_DMA_VCHAN_IDLE; -+ else -+ *status = RTE_DMA_VCHAN_HALTED_ERROR; -+ -+ return 0; -+} -+ - static void - hisi_dma_dump_range(struct hisi_dma_dev *hw, FILE *f, uint32_t start, - uint32_t end) -@@ -816,6 +837,14 @@ hisi_dma_gen_dev_name(const struct rte_pci_device *pci_dev, - * dev_stop| | - * | v - * ------------------ -+ * | CPL | -+ * ------------------ -+ * ^ | -+ * hardware | | -+ * completed all| |dev_submit -+ * descriptors | | -+ * | | -+ * ------------------ - * | RUN | - * ------------------ - * -@@ -829,6 +858,7 @@ static const struct rte_dma_dev_ops hisi_dmadev_ops = { - .vchan_setup = hisi_dma_vchan_setup, - .stats_get = hisi_dma_stats_get, - .stats_reset = hisi_dma_stats_reset, -+ .vchan_status = hisi_dma_vchan_status, - .dev_dump = hisi_dma_dump, - }; - -diff --git a/drivers/dma/hisilicon/hisi_dmadev.h b/drivers/dma/hisilicon/hisi_dmadev.h -index 90b85322ca..deb1357eea 100644 ---- a/drivers/dma/hisilicon/hisi_dmadev.h -+++ b/drivers/dma/hisilicon/hisi_dmadev.h -@@ -132,11 +132,16 @@ enum { - - /** - * In fact, there are multiple states, but it need to pay attention to -- * the following two states for the driver: -+ * the following three states for the driver: - */ - enum { - HISI_DMA_STATE_IDLE = 0, - HISI_DMA_STATE_RUN, -+ /** -+ * All of the submitted descriptor are finished, and the queue -+ * is waiting for new descriptors. -+ */ -+ HISI_DMA_STATE_CPL, - }; - - /** --- -2.23.0 - diff --git a/0215-kni-fix-build-with-Linux-5.18.patch b/0215-kni-fix-build-with-Linux-5.18.patch deleted file mode 100644 index 30822d1..0000000 --- a/0215-kni-fix-build-with-Linux-5.18.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 3aeeea257f187e4a05e3a7f70915c82808fb0ee8 Mon Sep 17 00:00:00 2001 -From: Jiri Slaby -Date: Wed, 1 Jun 2022 08:53:58 +0200 -Subject: [PATCH] kni: fix build with Linux 5.18 - -[ upstream commit c98600d4bed6d15599e448990f2ba117ca938a2d ] - -Since commit 2655926aea9b (net: Remove netif_rx_any_context() and -netif_rx_ni().) in 5.18, netif_rx_ni() no longer exists as netif_rx() -can be called from any context. So define HAVE_NETIF_RX_NI for older -releases and call the appropriate function in kni_net. - -netif_rx_ni() must be used on older kernel since netif_rx() might -might lead to deadlocks or other problems there. - -Signed-off-by: Jiri Slaby -Reviewed-by: Andrew Rybchenko ---- - kernel/linux/kni/compat.h | 4 ++++ - kernel/linux/kni/kni_net.c | 4 ++++ - 2 files changed, 8 insertions(+) - -diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h -index 664785674f..0db29a4a6f 100644 ---- a/kernel/linux/kni/compat.h -+++ b/kernel/linux/kni/compat.h -@@ -141,3 +141,7 @@ - #if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE - #define HAVE_TSK_IN_GUP - #endif -+ -+#if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE -+#define HAVE_NETIF_RX_NI -+#endif -diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c -index 29e5b9e21f..a8b092b756 100644 ---- a/kernel/linux/kni/kni_net.c -+++ b/kernel/linux/kni/kni_net.c -@@ -441,7 +441,11 @@ kni_net_rx_normal(struct kni_dev *kni) - skb->ip_summed = CHECKSUM_UNNECESSARY; - - /* Call netif interface */ -+#ifdef HAVE_NETIF_RX_NI - netif_rx_ni(skb); -+#else -+ netif_rx(skb); -+#endif - - /* Update statistics */ - dev->stats.rx_bytes += len; --- -2.23.0 - diff --git a/0216-kni-use-dedicated-function-to-set-random-MAC-address.patch b/0216-kni-use-dedicated-function-to-set-random-MAC-address.patch deleted file mode 100644 index 04362df..0000000 --- a/0216-kni-use-dedicated-function-to-set-random-MAC-address.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 9b7982b9867a3c28728f73678ff9cf497dde72f3 Mon Sep 17 00:00:00 2001 -From: Ke Zhang -Date: Wed, 8 Jun 2022 15:11:16 +0300 -Subject: [PATCH] kni: use dedicated function to set random MAC address -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 2ee8c67ef9399759cb0d3f34b2c9fb6ea0ecc832 ] - -eth_hw_addr_random() sets address type correctly. - -eth_hw_addr_random() is available since Linux v3.4, so -no compat is required. - -Also fix the warning: -warning: passing argument 1 of ‘memcpy’ discards ‘const’ -qualifier from pointer target type - -Variable dev_addr is done const intentionally in Linux v5.17 to -prevent using it directly. - -Fixes: ea6b39b5b847 ("kni: remove ethtool support") - -Signed-off-by: Ke Zhang -Signed-off-by: Andrew Rybchenko -Acked-by: Ferruh Yigit ---- - kernel/linux/kni/kni_misc.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c -index ad1582d911..38fcd7f4f2 100644 ---- a/kernel/linux/kni/kni_misc.c -+++ b/kernel/linux/kni/kni_misc.c -@@ -407,8 +407,8 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, - if (is_valid_ether_addr(dev_info.mac_addr)) - memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN); - else -- /* Generate random MAC address. */ -- eth_random_addr(net_dev->dev_addr); -+ /* Assign random MAC address. */ -+ eth_hw_addr_random(net_dev); - - if (dev_info.mtu) - net_dev->mtu = dev_info.mtu; --- -2.23.0 - diff --git a/0217-kni-use-dedicated-function-to-set-MAC-address.patch b/0217-kni-use-dedicated-function-to-set-MAC-address.patch deleted file mode 100644 index f001986..0000000 --- a/0217-kni-use-dedicated-function-to-set-MAC-address.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 4cfe56040171e791b021d5490f8fd58c55b088fb Mon Sep 17 00:00:00 2001 -From: Ke Zhang -Date: Wed, 8 Jun 2022 15:11:17 +0300 -Subject: [PATCH] kni: use dedicated function to set MAC address -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit b99bd4a0aacab47165d045a6aeee88ee74744600 ] - -The warning info: -warning: passing argument 1 of ‘memcpy’ discards ‘const’ -qualifier from pointer target type - -Variable dev_addr is done const intentionally in v5.17 to prevent using -it directly. See the following Linux kernel changeset for details: - -commit adeef3e32146 ("net: constify netdev->dev_addr") - -Used helper function was introduced earlier in v5.15. - -Fixes: ea6b39b5b847 ("kni: remove ethtool support") - -Signed-off-by: Ke Zhang -Signed-off-by: Andrew Rybchenko -Acked-by: Ferruh Yigit ---- - kernel/linux/kni/compat.h | 4 ++++ - kernel/linux/kni/kni_misc.c | 9 +++++++-- - kernel/linux/kni/kni_net.c | 4 ++++ - 3 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h -index 0db29a4a6f..3a86d12bbc 100644 ---- a/kernel/linux/kni/compat.h -+++ b/kernel/linux/kni/compat.h -@@ -142,6 +142,10 @@ - #define HAVE_TSK_IN_GUP - #endif - -+#if KERNEL_VERSION(5, 15, 0) <= LINUX_VERSION_CODE -+#define HAVE_ETH_HW_ADDR_SET -+#endif -+ - #if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE - #define HAVE_NETIF_RX_NI - #endif -diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c -index 38fcd7f4f2..feed12b568 100644 ---- a/kernel/linux/kni/kni_misc.c -+++ b/kernel/linux/kni/kni_misc.c -@@ -404,11 +404,16 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, - pr_debug("mbuf_size: %u\n", kni->mbuf_size); - - /* if user has provided a valid mac address */ -- if (is_valid_ether_addr(dev_info.mac_addr)) -+ if (is_valid_ether_addr(dev_info.mac_addr)) { -+#ifdef HAVE_ETH_HW_ADDR_SET -+ eth_hw_addr_set(net_dev, dev_info.mac_addr); -+#else - memcpy(net_dev->dev_addr, dev_info.mac_addr, ETH_ALEN); -- else -+#endif -+ } else { - /* Assign random MAC address. */ - eth_hw_addr_random(net_dev); -+ } - - if (dev_info.mtu) - net_dev->mtu = dev_info.mtu; -diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c -index 41805fcabf..779ee3451a 100644 ---- a/kernel/linux/kni/kni_net.c -+++ b/kernel/linux/kni/kni_net.c -@@ -783,7 +783,11 @@ kni_net_set_mac(struct net_device *netdev, void *p) - return -EADDRNOTAVAIL; - - memcpy(req.mac_addr, addr->sa_data, netdev->addr_len); -+#ifdef HAVE_ETH_HW_ADDR_SET -+ eth_hw_addr_set(netdev, addr->sa_data); -+#else - memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); -+#endif - - ret = kni_net_process_request(netdev, &req); - --- -2.23.0 - diff --git a/0218-linux-igb_uio-fix-build-for-switch-fall-through.patch b/0218-linux-igb_uio-fix-build-for-switch-fall-through.patch deleted file mode 100644 index 3ab65bb..0000000 --- a/0218-linux-igb_uio-fix-build-for-switch-fall-through.patch +++ /dev/null @@ -1,78 +0,0 @@ -From e68a705cc5dc3d1333bbcd722fe4e9a6ba3ee648 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Thu, 16 Dec 2021 12:03:49 +0000 -Subject: [PATCH] linux/igb_uio: fix build for switch fall through - -Linux is using '-Wimplicit-fallthrough=5' compiler option, which doesn't -take any fall through comments into account but only uses compiler -'fallthrough' attribute to document fall through action is intended. - -"falls through" comment was used in the code which is causing a build -error now, this patch converts comment to the 'fallthrough' macro -defined in the Linux. - -To cover the case where an old Linux version doesn't have the macro, -defined it in the compatibility header too. - -Signed-off-by: Ferruh Yigit ---- - linux/igb_uio/compat.h | 14 ++++++++++++++ - linux/igb_uio/igb_uio.c | 6 +++--- - 2 files changed, 17 insertions(+), 3 deletions(-) - -diff --git a/kernel/linux/igb_uio/compat.h b/kernel/linux/igb_uio/compat.h -index 8dbb896..71172f4 100644 ---- a/kernel/linux/igb_uio/compat.h -+++ b/kernel/linux/igb_uio/compat.h -@@ -152,3 +152,17 @@ static inline bool igbuio_kernel_is_locked_down(void) - return false; - #endif - } -+ -+#ifndef fallthrough -+ -+#ifndef __has_attribute -+#define __has_attribute(x) 0 -+#endif -+ -+#if __has_attribute(__fallthrough__) -+#define fallthrough __attribute__((__fallthrough__)) -+#else -+#define fallthrough do {} while (0) /* fallthrough */ -+#endif -+ -+#endif -diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c -index ea439d1..33e0e02 100644 ---- a/kernel/linux/igb_uio/igb_uio.c -+++ b/kernel/linux/igb_uio/igb_uio.c -@@ -250,7 +250,7 @@ igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) - } - #endif - -- /* falls through - to MSI */ -+ fallthrough; - case RTE_INTR_MODE_MSI: - #ifndef HAVE_ALLOC_IRQ_VECTORS - if (pci_enable_msi(udev->pdev) == 0) { -@@ -269,7 +269,7 @@ igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) - break; - } - #endif -- /* falls through - to INTX */ -+ fallthrough; - case RTE_INTR_MODE_LEGACY: - if (pci_intx_mask_supported(udev->pdev)) { - dev_dbg(&udev->pdev->dev, "using INTX"); -@@ -279,7 +279,7 @@ igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev) - break; - } - dev_notice(&udev->pdev->dev, "PCI INTX mask not supported\n"); -- /* falls through - to no IRQ */ -+ fallthrough; - case RTE_INTR_MODE_NONE: - udev->mode = RTE_INTR_MODE_NONE; - udev->info.irq = UIO_IRQ_NONE; --- -2.23.0 - diff --git a/0219-linux-igb_uio-fix-build-with-kernel-5.18.patch b/0219-linux-igb_uio-fix-build-with-kernel-5.18.patch deleted file mode 100644 index f19c6e5..0000000 --- a/0219-linux-igb_uio-fix-build-with-kernel-5.18.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 29b1c1e43014099548bb9424749cbc062e16a087 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Georg=20M=C3=BCller?= -Date: Thu, 6 Oct 2022 20:51:37 +0200 -Subject: [PATCH] linux/igb_uio: fix build with kernel 5.18+ -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -pci_set_dma_mask() and pci_set_consistent_dma_mask() were removed with -kernel 5.18. They both were just wrappers for dma_set_mask() and -dma_set_coherent_mask(). - -Instead, use dma_set_mask_and_coherent(), which is a combination of -dma_set_mask() and dma_set_coherent_mask(). - -dma_set_mask_and_coherent() exists since kernel 3.13. - -Signed-off-by: Georg Müller ---- - kernel/linux/igb_uio/igb_uio.c | 8 +------- - 1 file changed, 1 insertion(+), 7 deletions(-) - -diff --git a/kernel/linux/igb_uio/igb_uio.c b/kernel/linux/igb_uio/igb_uio.c -index 33e0e02..aea67da 100644 ---- a/kernel/linux/igb_uio/igb_uio.c -+++ b/kernel/linux/igb_uio/igb_uio.c -@@ -512,18 +512,12 @@ igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) - goto fail_release_iomem; - - /* set 64-bit DMA mask */ -- err = pci_set_dma_mask(dev, DMA_BIT_MASK(64)); -+ err = dma_set_mask_and_coherent(&dev->dev, DMA_BIT_MASK(64)); - if (err != 0) { - dev_err(&dev->dev, "Cannot set DMA mask\n"); - goto fail_release_iomem; - } - -- err = pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64)); -- if (err != 0) { -- dev_err(&dev->dev, "Cannot set consistent DMA mask\n"); -- goto fail_release_iomem; -- } -- - /* fill uio infos */ - udev->info.name = "igb_uio"; - udev->info.version = "0.1"; --- -2.23.0 - diff --git a/0220-net-hns3-fix-inaccurate-RTC-time-to-read.patch b/0220-net-hns3-fix-inaccurate-RTC-time-to-read.patch deleted file mode 100644 index 59a0c08..0000000 --- a/0220-net-hns3-fix-inaccurate-RTC-time-to-read.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 3cd01cd12d4987b76be0ff1b25bc21a558aab6f1 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 9 Jan 2023 16:23:44 +0800 -Subject: net/hns3: fix inaccurate RTC time to read - -[ upstream commit 4243282181f38d387188af5fd38a5428864a94a2 ] - -The sequence of reading current RTC time register doesn't meet -the hardware requirements, which causes this time obtained is -the one before modifying RTC time. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ptp.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 6bbd85ba23..db3c007b12 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -216,17 +216,21 @@ hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev, - int - hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts) - { -+#define HNS3_PTP_SEC_H_OFFSET 32 -+#define HNS3_PTP_SEC_H_MASK 0xFFFF -+ - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ uint32_t sec_hi, sec_lo; - uint64_t ns, sec; - - if (!hns3_dev_get_support(hw, PTP)) - return -ENOTSUP; - -- sec = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_L); -- sec |= (uint64_t)(hns3_read_dev(hw, HNS3_CURR_TIME_OUT_H) & 0xFFFF) -- << 32; -- - ns = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_NS); -+ sec_hi = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_H) & HNS3_PTP_SEC_H_MASK; -+ sec_lo = hns3_read_dev(hw, HNS3_CURR_TIME_OUT_L); -+ sec = ((uint64_t)sec_hi << HNS3_PTP_SEC_H_OFFSET) | sec_lo; -+ - ns += sec * NSEC_PER_SEC; - *ts = rte_ns_to_timespec(ns); - --- -2.23.0 - diff --git a/0221-net-hns3-fix-log-about-indirection-table-size.patch b/0221-net-hns3-fix-log-about-indirection-table-size.patch deleted file mode 100644 index 613aaf4..0000000 --- a/0221-net-hns3-fix-log-about-indirection-table-size.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 55cc3ba793a896aeac7abb05a247b3b32d2adc75 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:51 +0800 -Subject: net/hns3: fix log about indirection table size - -[ upstream commit b55516a94246364f272db802f5dfb9aeb8d3a2f2 ] - -The error log about indirection table size during initialization phase -of PF and VF is unreasonable. - -In addition, VF driver should use error level to print this log. - -Fixes: 0fce2c46dc16 ("net/hns3: fix RSS indirection table size") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_ethdev_vf.c | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 25f9c9fab1..ed273b5b69 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2679,7 +2679,7 @@ hns3_check_dev_specifications(struct hns3_hw *hw) - { - if (hw->rss_ind_tbl_size == 0 || - hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_err(hw, "the size of hash lookup table configured (%u) exceeds the maximum(%u)", -+ hns3_err(hw, "the indirection table size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", - hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); - return -EINVAL; - } -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index de44b07691..8a3a3cc657 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -718,8 +718,8 @@ hns3vf_check_dev_specifications(struct hns3_hw *hw) - { - if (hw->rss_ind_tbl_size == 0 || - hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_warn(hw, "the size of hash lookup table configured (%u) exceeds the maximum(%u)", -- hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); -+ hns3_err(hw, "the indirection table size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", -+ hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); - return -EINVAL; - } - --- -2.23.0 - diff --git a/0222-net-hns3-extract-common-function-to-query-device.patch b/0222-net-hns3-extract-common-function-to-query-device.patch deleted file mode 100644 index 99e65ff..0000000 --- a/0222-net-hns3-extract-common-function-to-query-device.patch +++ /dev/null @@ -1,291 +0,0 @@ -From 6fb8330396b77c4a4acc73ff895a8d2b62a5ab93 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:52 +0800 -Subject: net/hns3: extract common function to query device - -[ upstream commit 52a4e960b49c526dd1ad7c1e91ebcfa664a38e6d ] - -Extract common function to query device specifications used by VF and -PF. - -Fixes: 9c740336f024 ("net/hns3: get device specifications from firmware") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 75 +++++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_common.h | 2 + - drivers/net/hns3/hns3_ethdev.c | 63 -------------------------- - drivers/net/hns3/hns3_ethdev_vf.c | 65 +-------------------------- - 4 files changed, 79 insertions(+), 126 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 2ebcf5695b..212b35d842 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -10,6 +10,7 @@ - #include "hns3_logs.h" - #include "hns3_regs.h" - #include "hns3_rxtx.h" -+#include "hns3_dcb.h" - #include "hns3_common.h" - - int -@@ -843,3 +844,77 @@ hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id) - - return 0; - } -+ -+void -+hns3_set_default_dev_specifications(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ -+ hw->max_non_tso_bd_num = HNS3_MAX_NON_TSO_BD_PER_PKT; -+ hw->rss_ind_tbl_size = HNS3_RSS_IND_TBL_SIZE; -+ hw->rss_key_size = HNS3_RSS_KEY_SIZE; -+ hw->intr.int_ql_max = HNS3_INTR_QL_NONE; -+ -+ if (hns->is_vf) -+ return; -+ -+ hw->max_tm_rate = HNS3_ETHER_MAX_RATE; -+} -+ -+static void -+hns3_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ struct hns3_dev_specs_0_cmd *req0; -+ struct hns3_dev_specs_1_cmd *req1; -+ -+ req0 = (struct hns3_dev_specs_0_cmd *)desc[0].data; -+ req1 = (struct hns3_dev_specs_1_cmd *)desc[1].data; -+ -+ hw->max_non_tso_bd_num = req0->max_non_tso_bd_num; -+ hw->rss_ind_tbl_size = rte_le_to_cpu_16(req0->rss_ind_tbl_size); -+ hw->rss_key_size = rte_le_to_cpu_16(req0->rss_key_size); -+ hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max); -+ hw->min_tx_pkt_len = req1->min_tx_pkt_len; -+ -+ if (hns->is_vf) -+ return; -+ -+ hw->max_tm_rate = rte_le_to_cpu_32(req0->max_tm_rate); -+} -+ -+static int -+hns3_check_dev_specifications(struct hns3_hw *hw) -+{ -+ if (hw->rss_ind_tbl_size == 0 || -+ hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -+ hns3_err(hw, "the indirection table size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", -+ hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+int -+hns3_query_dev_specifications(struct hns3_hw *hw) -+{ -+ struct hns3_cmd_desc desc[HNS3_QUERY_DEV_SPECS_BD_NUM]; -+ int ret; -+ int i; -+ -+ for (i = 0; i < HNS3_QUERY_DEV_SPECS_BD_NUM - 1; i++) { -+ hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, -+ true); -+ desc[i].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); -+ } -+ hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, true); -+ -+ ret = hns3_cmd_send(hw, desc, HNS3_QUERY_DEV_SPECS_BD_NUM); -+ if (ret) -+ return ret; -+ -+ hns3_parse_dev_specifications(hw, desc); -+ -+ return hns3_check_dev_specifications(hw); -+} -diff --git a/drivers/net/hns3/hns3_common.h b/drivers/net/hns3/hns3_common.h -index 5aa001f0cc..8eaeda26e7 100644 ---- a/drivers/net/hns3/hns3_common.h -+++ b/drivers/net/hns3/hns3_common.h -@@ -60,5 +60,7 @@ void hns3_unmap_rx_interrupt(struct rte_eth_dev *dev); - int hns3_restore_rx_interrupt(struct hns3_hw *hw); - - int hns3_get_pci_revision_id(struct hns3_hw *hw, uint8_t *revision_id); -+void hns3_set_default_dev_specifications(struct hns3_hw *hw); -+int hns3_query_dev_specifications(struct hns3_hw *hw); - - #endif /* HNS3_COMMON_H */ -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index ed273b5b69..8fa12d91bb 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2647,69 +2647,6 @@ hns3_parse_speed(int speed_cmd, uint32_t *speed) - return 0; - } - --static void --hns3_set_default_dev_specifications(struct hns3_hw *hw) --{ -- hw->max_non_tso_bd_num = HNS3_MAX_NON_TSO_BD_PER_PKT; -- hw->rss_ind_tbl_size = HNS3_RSS_IND_TBL_SIZE; -- hw->rss_key_size = HNS3_RSS_KEY_SIZE; -- hw->max_tm_rate = HNS3_ETHER_MAX_RATE; -- hw->intr.int_ql_max = HNS3_INTR_QL_NONE; --} -- --static void --hns3_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc) --{ -- struct hns3_dev_specs_0_cmd *req0; -- struct hns3_dev_specs_1_cmd *req1; -- -- req0 = (struct hns3_dev_specs_0_cmd *)desc[0].data; -- req1 = (struct hns3_dev_specs_1_cmd *)desc[1].data; -- -- hw->max_non_tso_bd_num = req0->max_non_tso_bd_num; -- hw->rss_ind_tbl_size = rte_le_to_cpu_16(req0->rss_ind_tbl_size); -- hw->rss_key_size = rte_le_to_cpu_16(req0->rss_key_size); -- hw->max_tm_rate = rte_le_to_cpu_32(req0->max_tm_rate); -- hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max); -- hw->min_tx_pkt_len = req1->min_tx_pkt_len; --} -- --static int --hns3_check_dev_specifications(struct hns3_hw *hw) --{ -- if (hw->rss_ind_tbl_size == 0 || -- hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_err(hw, "the indirection table size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", -- hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); -- return -EINVAL; -- } -- -- return 0; --} -- --static int --hns3_query_dev_specifications(struct hns3_hw *hw) --{ -- struct hns3_cmd_desc desc[HNS3_QUERY_DEV_SPECS_BD_NUM]; -- int ret; -- int i; -- -- for (i = 0; i < HNS3_QUERY_DEV_SPECS_BD_NUM - 1; i++) { -- hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, -- true); -- desc[i].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); -- } -- hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, true); -- -- ret = hns3_cmd_send(hw, desc, HNS3_QUERY_DEV_SPECS_BD_NUM); -- if (ret) -- return ret; -- -- hns3_parse_dev_specifications(hw, desc); -- -- return hns3_check_dev_specifications(hw); --} -- - static int - hns3_get_capability(struct hns3_hw *hw) - { -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 8a3a3cc657..a3a1b71a63 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -688,67 +688,6 @@ hns3vf_interrupt_handler(void *param) - hns3vf_enable_irq0(hw); - } - --static void --hns3vf_set_default_dev_specifications(struct hns3_hw *hw) --{ -- hw->max_non_tso_bd_num = HNS3_MAX_NON_TSO_BD_PER_PKT; -- hw->rss_ind_tbl_size = HNS3_RSS_IND_TBL_SIZE; -- hw->rss_key_size = HNS3_RSS_KEY_SIZE; -- hw->intr.int_ql_max = HNS3_INTR_QL_NONE; --} -- --static void --hns3vf_parse_dev_specifications(struct hns3_hw *hw, struct hns3_cmd_desc *desc) --{ -- struct hns3_dev_specs_0_cmd *req0; -- struct hns3_dev_specs_1_cmd *req1; -- -- req0 = (struct hns3_dev_specs_0_cmd *)desc[0].data; -- req1 = (struct hns3_dev_specs_1_cmd *)desc[1].data; -- -- hw->max_non_tso_bd_num = req0->max_non_tso_bd_num; -- hw->rss_ind_tbl_size = rte_le_to_cpu_16(req0->rss_ind_tbl_size); -- hw->rss_key_size = rte_le_to_cpu_16(req0->rss_key_size); -- hw->intr.int_ql_max = rte_le_to_cpu_16(req0->intr_ql_max); -- hw->min_tx_pkt_len = req1->min_tx_pkt_len; --} -- --static int --hns3vf_check_dev_specifications(struct hns3_hw *hw) --{ -- if (hw->rss_ind_tbl_size == 0 || -- hw->rss_ind_tbl_size > HNS3_RSS_IND_TBL_SIZE_MAX) { -- hns3_err(hw, "the indirection table size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", -- hw->rss_ind_tbl_size, HNS3_RSS_IND_TBL_SIZE_MAX); -- return -EINVAL; -- } -- -- return 0; --} -- --static int --hns3vf_query_dev_specifications(struct hns3_hw *hw) --{ -- struct hns3_cmd_desc desc[HNS3_QUERY_DEV_SPECS_BD_NUM]; -- int ret; -- int i; -- -- for (i = 0; i < HNS3_QUERY_DEV_SPECS_BD_NUM - 1; i++) { -- hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, -- true); -- desc[i].flag |= rte_cpu_to_le_16(HNS3_CMD_FLAG_NEXT); -- } -- hns3_cmd_setup_basic_desc(&desc[i], HNS3_OPC_QUERY_DEV_SPECS, true); -- -- ret = hns3_cmd_send(hw, desc, HNS3_QUERY_DEV_SPECS_BD_NUM); -- if (ret) -- return ret; -- -- hns3vf_parse_dev_specifications(hw, desc); -- -- return hns3vf_check_dev_specifications(hw); --} -- - void - hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported) - { -@@ -826,7 +765,7 @@ hns3vf_get_capability(struct hns3_hw *hw) - return ret; - - if (hw->revision < PCI_REVISION_ID_HIP09_A) { -- hns3vf_set_default_dev_specifications(hw); -+ hns3_set_default_dev_specifications(hw); - hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE; - hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US; - hw->tso_mode = HNS3_TSO_SW_CAL_PSEUDO_H_CSUM; -@@ -837,7 +776,7 @@ hns3vf_get_capability(struct hns3_hw *hw) - return 0; - } - -- ret = hns3vf_query_dev_specifications(hw); -+ ret = hns3_query_dev_specifications(hw); - if (ret) { - PMD_INIT_LOG(ERR, - "failed to query dev specifications, ret = %d", --- -2.23.0 - diff --git a/0223-net-hns3-refactor-set-RSS-hash-algorithm-and-key-int.patch b/0223-net-hns3-refactor-set-RSS-hash-algorithm-and-key-int.patch deleted file mode 100644 index 7d48ce2..0000000 --- a/0223-net-hns3-refactor-set-RSS-hash-algorithm-and-key-int.patch +++ /dev/null @@ -1,149 +0,0 @@ -From d0c9a7b130290b2079dfaeaf301b95982480912c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:53 +0800 -Subject: net/hns3: refactor set RSS hash algorithm and key interface - -[ upstream commit 88347111eb53bc54c598dde81715a06ca1dbd132 ] - -The hns3_rss_set_algo_key() is used to set RSS hash algorithm and key to -hardware. -The maximum execution time of the command sent to the firmware is -proportional to the length of the key. -However, now this times is fixed, which isn't good for key expansion. - -In addition, hash algorithm comes from rss_info::hash_algo maintained in -the driver, which also isn't good for the usage of this function. - -Interface is updated to get hash algorithm and key length as input -parameters. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 3 ++- - drivers/net/hns3/hns3_rss.c | 48 ++++++++++++++++-------------------- - drivers/net/hns3/hns3_rss.h | 4 ++- - 3 files changed, 26 insertions(+), 29 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index a2c1589c39..95609f8483 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1494,7 +1494,8 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - if (ret) - return ret; - -- ret = hns3_rss_set_algo_key(hw, rss_config->key); -+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -+ rss_config->key, HNS3_RSS_KEY_SIZE); - if (ret) - return ret; - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index ca5a129234..3db7bf0445 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -277,45 +277,37 @@ static const struct { - - /* - * rss_generic_config command function, opcode:0x0D01. -- * Used to set algorithm, key_offset and hash key of rss. -+ * Used to set algorithm and hash key of RSS. - */ - int --hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key) -+hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, -+ const uint8_t *key, uint8_t key_len) - { --#define HNS3_KEY_OFFSET_MAX 3 --#define HNS3_SET_HASH_KEY_BYTE_FOUR 2 -- - struct hns3_rss_generic_config_cmd *req; - struct hns3_cmd_desc desc; -- uint32_t key_offset, key_size; -- const uint8_t *key_cur; -- uint8_t cur_offset; -+ const uint8_t *cur_key; -+ uint16_t cur_key_size; -+ uint16_t max_bd_num; -+ uint16_t idx; - int ret; - - req = (struct hns3_rss_generic_config_cmd *)desc.data; - -- /* -- * key_offset=0, hash key byte0~15 is set to hardware. -- * key_offset=1, hash key byte16~31 is set to hardware. -- * key_offset=2, hash key byte32~39 is set to hardware. -- */ -- for (key_offset = 0; key_offset < HNS3_KEY_OFFSET_MAX; key_offset++) { -+ max_bd_num = DIV_ROUND_UP(key_len, HNS3_RSS_HASH_KEY_NUM); -+ for (idx = 0; idx < max_bd_num; idx++) { - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_GENERIC_CONFIG, - false); - -- req->hash_config |= -- (hw->rss_info.hash_algo & HNS3_RSS_HASH_ALGO_MASK); -- req->hash_config |= (key_offset << HNS3_RSS_HASH_KEY_OFFSET_B); -+ req->hash_config |= (hash_algo & HNS3_RSS_HASH_ALGO_MASK); -+ req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B); - -- if (key_offset == HNS3_SET_HASH_KEY_BYTE_FOUR) -- key_size = HNS3_RSS_KEY_SIZE - HNS3_RSS_HASH_KEY_NUM * -- HNS3_SET_HASH_KEY_BYTE_FOUR; -+ if (idx == max_bd_num - 1) -+ cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM; - else -- key_size = HNS3_RSS_HASH_KEY_NUM; -+ cur_key_size = HNS3_RSS_HASH_KEY_NUM; - -- cur_offset = key_offset * HNS3_RSS_HASH_KEY_NUM; -- key_cur = key + cur_offset; -- memcpy(req->hash_key, key_cur, key_size); -+ cur_key = key + idx * HNS3_RSS_HASH_KEY_NUM; -+ memcpy(req->hash_key, cur_key, cur_key_size); - - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { -@@ -518,7 +510,8 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - goto set_tuple_fail; - - if (key) { -- ret = hns3_rss_set_algo_key(hw, key); -+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -+ key, HNS3_RSS_KEY_SIZE); - if (ret) - goto set_algo_key_fail; - } -@@ -795,8 +788,9 @@ hns3_config_rss(struct hns3_adapter *hns) - break; - } - -- /* Configure RSS hash algorithm and hash key offset */ -- ret = hns3_rss_set_algo_key(hw, hash_key); -+ /* Configure RSS hash algorithm and hash key */ -+ ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, hash_key, -+ HNS3_RSS_KEY_SIZE); - if (ret) - return ret; - -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 8e8b056f4e..b7f62ca1ee 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -109,6 +109,8 @@ int hns3_rss_reset_indir_table(struct hns3_hw *hw); - int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); --int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key); -+int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, -+ const uint8_t *key, uint8_t key_len); -+ - - #endif /* HNS3_RSS_H */ --- -2.23.0 - diff --git a/0224-net-hns3-fix-RSS-key-size-compatibility.patch b/0224-net-hns3-fix-RSS-key-size-compatibility.patch deleted file mode 100644 index ed823ec..0000000 --- a/0224-net-hns3-fix-RSS-key-size-compatibility.patch +++ /dev/null @@ -1,209 +0,0 @@ -From 7d81fd5ed42af46c6e5eef15b4dce7172a2e571d Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:54 +0800 -Subject: net/hns3: fix RSS key size compatibility - -[ upstream commit 5172f9c464aa315a9d45b9177af71b4f99d55cdb ] - -For better compatibility, the RSS key size of PF and VF are obtained -from firmware. However, the outdated HNS3_RSS_KEY_SIZE macro is still -utilized in many locations as the key size. - -Fixes: 9c740336f024 ("net/hns3: get device specifications from firmware") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 12 +++++++++++- - drivers/net/hns3/hns3_flow.c | 26 ++++++++++++-------------- - drivers/net/hns3/hns3_rss.c | 23 +++++++++++------------ - drivers/net/hns3/hns3_rss.h | 3 ++- - 4 files changed, 36 insertions(+), 28 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 212b35d842..9bfbe1161f 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -129,7 +129,7 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - }; - - info->reta_size = hw->rss_ind_tbl_size; -- info->hash_key_size = HNS3_RSS_KEY_SIZE; -+ info->hash_key_size = hw->rss_key_size; - info->flow_type_rss_offloads = HNS3_ETH_RSS_SUPPORT; - - info->default_rxportconf.burst_size = HNS3_DEFAULT_PORT_CONF_BURST_SIZE; -@@ -893,6 +893,16 @@ hns3_check_dev_specifications(struct hns3_hw *hw) - return -EINVAL; - } - -+ if (hw->rss_key_size == 0 || hw->rss_key_size > HNS3_RSS_KEY_SIZE_MAX) { -+ hns3_err(hw, "the RSS key size obtained (%u) is invalid, and should not be zero or exceed the maximum(%u)", -+ hw->rss_key_size, HNS3_RSS_KEY_SIZE_MAX); -+ return -EINVAL; -+ } -+ -+ if (hw->rss_key_size > HNS3_RSS_KEY_SIZE) -+ hns3_warn(hw, "the RSS key size obtained (%u) is greater than the default key size (%u)", -+ hw->rss_key_size, HNS3_RSS_KEY_SIZE); -+ - return 0; - } - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 95609f8483..a18ec7650d 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1406,10 +1406,10 @@ hns3_parse_rss_filter(struct rte_eth_dev *dev, - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, - "a nonzero RSS encapsulation level is not supported"); -- if (rss->key_len && rss->key_len != RTE_DIM(rss_conf->key)) -+ if (rss->key_len && rss->key_len != hw->rss_key_size) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "RSS hash key must be exactly 40 bytes"); -+ "invalid RSS key length"); - - if (!hns3_rss_input_tuple_supported(hw, rss)) - return rte_flow_error_set(error, EINVAL, -@@ -1443,16 +1443,6 @@ hns3_disable_rss(struct hns3_hw *hw) - return 0; - } - --static void --hns3_adjust_rss_key(struct hns3_hw *hw, struct rte_flow_action_rss *rss_conf) --{ -- if (rss_conf->key == NULL || rss_conf->key_len < HNS3_RSS_KEY_SIZE) { -- hns3_warn(hw, "Default RSS hash key to be set"); -- rss_conf->key = hns3_hash_key; -- rss_conf->key_len = HNS3_RSS_KEY_SIZE; -- } --} -- - static int - hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function *func, - uint8_t *hash_algo) -@@ -1485,9 +1475,16 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function *func, - static int - hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - { -+ uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -+ bool use_default_key = false; - int ret; - -- hns3_adjust_rss_key(hw, rss_config); -+ if (rss_config->key == NULL || rss_config->key_len != hw->rss_key_size) { -+ hns3_warn(hw, "Default RSS hash key to be set"); -+ memcpy(rss_key, hns3_hash_key, -+ RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); -+ use_default_key = true; -+ } - - ret = hns3_parse_rss_algorithm(hw, &rss_config->func, - &hw->rss_info.hash_algo); -@@ -1495,7 +1492,8 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - return ret; - - ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -- rss_config->key, HNS3_RSS_KEY_SIZE); -+ use_default_key ? rss_key : rss_config->key, -+ hw->rss_key_size); - if (ret) - return ret; - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 3db7bf0445..d6e0754273 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -316,7 +316,7 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - } - } - /* Update the shadow RSS key with user specified */ -- memcpy(hw->rss_info.key, key, HNS3_RSS_KEY_SIZE); -+ memcpy(hw->rss_info.key, key, hw->rss_key_size); - return 0; - } - -@@ -498,9 +498,9 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - uint8_t *key = rss_conf->rss_key; - int ret; - -- if (key && key_len != HNS3_RSS_KEY_SIZE) { -+ if (key && key_len != hw->rss_key_size) { - hns3_err(hw, "the hash key len(%u) is invalid, must be %u", -- key_len, HNS3_RSS_KEY_SIZE); -+ key_len, hw->rss_key_size); - return -EINVAL; - } - -@@ -511,7 +511,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - - if (key) { - ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -- key, HNS3_RSS_KEY_SIZE); -+ key, hw->rss_key_size); - if (ret) - goto set_algo_key_fail; - } -@@ -547,9 +547,9 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - rss_conf->rss_hf = rss_cfg->conf.types; - - /* Get the RSS Key required by the user */ -- if (rss_conf->rss_key && rss_conf->rss_key_len >= HNS3_RSS_KEY_SIZE) { -- memcpy(rss_conf->rss_key, rss_cfg->key, HNS3_RSS_KEY_SIZE); -- rss_conf->rss_key_len = HNS3_RSS_KEY_SIZE; -+ if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) { -+ memcpy(rss_conf->rss_key, rss_cfg->key, hw->rss_key_size); -+ rss_conf->rss_key_len = hw->rss_key_size; - } - rte_spinlock_unlock(&hw->lock); - -@@ -754,8 +754,8 @@ hns3_rss_set_default_args(struct hns3_hw *hw) - /* Default hash algorithm */ - rss_cfg->conf.func = RTE_ETH_HASH_FUNCTION_TOEPLITZ; - -- /* Default RSS key */ -- memcpy(rss_cfg->key, hns3_hash_key, HNS3_RSS_KEY_SIZE); -+ memcpy(rss_cfg->key, hns3_hash_key, -+ RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); - - /* Initialize RSS indirection table */ - for (i = 0; i < hw->rss_ind_tbl_size; i++) -@@ -788,9 +788,8 @@ hns3_config_rss(struct hns3_adapter *hns) - break; - } - -- /* Configure RSS hash algorithm and hash key */ -- ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, hash_key, -- HNS3_RSS_KEY_SIZE); -+ ret = hns3_rss_set_algo_key(hw, rss_cfg->hash_algo, -+ hash_key, hw->rss_key_size); - if (ret) - return ret; - -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index b7f62ca1ee..d6f81996f4 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -29,6 +29,7 @@ - #define HNS3_RSS_IND_TBL_SIZE 512 /* The size of hash lookup table */ - #define HNS3_RSS_IND_TBL_SIZE_MAX 2048 - #define HNS3_RSS_KEY_SIZE 40 -+#define HNS3_RSS_KEY_SIZE_MAX 128 - #define HNS3_RSS_SET_BITMAP_MSK 0xffff - - #define HNS3_RSS_HASH_ALGO_TOEPLITZ 0 -@@ -41,7 +42,7 @@ struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ - struct rte_flow_action_rss conf; - uint8_t hash_algo; /* hash function type defined by hardware */ -- uint8_t key[HNS3_RSS_KEY_SIZE]; /* Hash key */ -+ uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ - uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; - uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ - bool valid; /* check if RSS rule is valid */ --- -2.23.0 - diff --git a/0225-net-hns3-fix-clearing-RSS-configuration.patch b/0225-net-hns3-fix-clearing-RSS-configuration.patch deleted file mode 100644 index 2a850e2..0000000 --- a/0225-net-hns3-fix-clearing-RSS-configuration.patch +++ /dev/null @@ -1,42 +0,0 @@ -From b81a2f05658192464916c0d4f5cc1349d9d3aca4 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:55 +0800 -Subject: net/hns3: fix clearing RSS configuration - -[ upstream commit 1aa5222454725001939ff571e685225f6cf85653 ] - -When a RSS rule has an unsupported action, the RSS configuration is -cleared by mistake. - -Remove clearing RSS configuration in this case. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index a18ec7650d..c338eab049 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1421,12 +1421,10 @@ hns3_parse_rss_filter(struct rte_eth_dev *dev, - - /* Check if the next not void action is END */ - NEXT_ITEM_OF_ACTION(act, actions, act_index); -- if (act->type != RTE_FLOW_ACTION_TYPE_END) { -- memset(rss_conf, 0, sizeof(struct hns3_rss_conf)); -+ if (act->type != RTE_FLOW_ACTION_TYPE_END) - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION, - act, "Not supported action."); -- } - - return 0; - } --- -2.23.0 - diff --git a/0226-net-hns3-use-RSS-filter-list-to-check-duplicated-rul.patch b/0226-net-hns3-use-RSS-filter-list-to-check-duplicated-rul.patch deleted file mode 100644 index 4f30996..0000000 --- a/0226-net-hns3-use-RSS-filter-list-to-check-duplicated-rul.patch +++ /dev/null @@ -1,89 +0,0 @@ -From dd5efbef75ed9511f497e2da05131e902dc4f277 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:56 +0800 -Subject: net/hns3: use RSS filter list to check duplicated rule - -[ upstream commit 6afde23d843ecf67453eaf69924bd79873f6f207 ] - -All rules from user are saved in RSS filter list, so use RSS -filter list to check duplicated rule. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 35 +++++++++++++++++++++-------------- - 1 file changed, 21 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index c338eab049..303275ae93 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1300,7 +1300,7 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - !memcmp(comp->key, with->key, with->key_len); - - return (func_is_same && rss_key_is_same && -- comp->types == (with->types & HNS3_ETH_RSS_SUPPORT) && -+ comp->types == with->types && - comp->level == with->level && - comp->queue_num == with->queue_num && - !memcmp(comp->queue, with->queue, -@@ -1596,15 +1596,7 @@ hns3_config_rss_filter(struct hns3_hw *hw, - } - - /* Set hash algorithm and flow types by the user's config */ -- ret = hns3_hw_rss_hash_set(hw, &rss_flow_conf); -- if (ret) -- return ret; -- -- ret = hns3_rss_conf_copy(rss_info, &rss_flow_conf); -- if (ret) -- hns3_err(hw, "RSS config init fail(%d)", ret); -- -- return ret; -+ return hns3_hw_rss_hash_set(hw, &rss_flow_conf); - } - - static int -@@ -1676,17 +1668,32 @@ hns3_restore_filter(struct hns3_adapter *hns) - return hns3_restore_rss_filter(hw); - } - -+static bool -+hns3_rss_action_is_dup(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *act) -+{ -+ struct hns3_rss_conf_ele *filter; -+ -+ TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { -+ if (!filter->filter_info.valid) -+ continue; -+ -+ if (hns3_action_rss_same(&filter->filter_info.conf, act)) -+ return true; -+ } -+ -+ return false; -+} -+ - static int - hns3_flow_parse_rss(struct rte_eth_dev *dev, - const struct hns3_rss_conf *conf, bool add) - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- bool ret; - -- ret = hns3_action_rss_same(&hw->rss_info.conf, &conf->conf); -- if (ret) { -- hns3_err(hw, "Enter duplicate RSS configuration : %d", ret); -+ if (hns3_rss_action_is_dup(hw, &conf->conf)) { -+ hns3_err(hw, "duplicate RSS configuration"); - return -EINVAL; - } - --- -2.23.0 - diff --git a/0227-net-hns3-remove-useless-code-when-destroy-valid-RSS-.patch b/0227-net-hns3-remove-useless-code-when-destroy-valid-RSS-.patch deleted file mode 100644 index 082bc02..0000000 --- a/0227-net-hns3-remove-useless-code-when-destroy-valid-RSS-.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 1f32e5059ee95c4433d1c37034e02f8c4a722418 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:57 +0800 -Subject: net/hns3: remove useless code when destroy valid RSS rule - -[ upstream commit 546031ba551485c3e3aa57c3698975c2852cbef1 ] - -When all rules are flushed the hw::rss_info::conf::func set to -RTE_ETH_HASH_FUNCTION_MAX and hw::rss_info::conf::queue set to NULL -which indicates no flow rules is issued. -See: commit eb158fc756a5 ("net/hns3: fix config when creating RSS rule -after flush"). - -Actually, the way determining whether there are rules has been changed -by walking the flow RSS list. -See: commit 705a50800334 ("net/hns3: fix RSS filter restore"). - -In addition, the rte_flow_action_rss from user isn't saved to 'conf' in -hw->rss_info now. So this code can be removed. - -Fixes: eb158fc756a5 ("net/hns3: fix config when creating RSS rule after flush") -Fixes: 705a50800334 ("net/hns3: fix RSS filter restore") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 26 ++------------------------ - 1 file changed, 2 insertions(+), 24 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 303275ae93..7adde16cbc 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1279,19 +1279,8 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - bool rss_key_is_same; - bool func_is_same; - -- /* -- * When user flush all RSS rule, RSS func is set invalid with -- * RTE_ETH_HASH_FUNCTION_MAX. Then the user create a flow after -- * flushed, any validate RSS func is different with it before -- * flushed. Others, when user create an action RSS with RSS func -- * specified RTE_ETH_HASH_FUNCTION_DEFAULT, the func is the same -- * between continuous RSS flow. -- */ -- if (comp->func == RTE_ETH_HASH_FUNCTION_MAX) -- func_is_same = false; -- else -- func_is_same = (with->func != RTE_ETH_HASH_FUNCTION_DEFAULT) ? -- (comp->func == with->func) : true; -+ func_is_same = (with->func != RTE_ETH_HASH_FUNCTION_DEFAULT) ? -+ (comp->func == with->func) : true; - - if (with->key_len == 0 || with->key == NULL) - rss_key_is_same = 1; -@@ -1533,7 +1522,6 @@ static int - hns3_config_rss_filter(struct hns3_hw *hw, - const struct hns3_rss_conf *conf, bool add) - { -- struct hns3_rss_conf *rss_info; - uint64_t flow_types; - uint16_t num; - int ret; -@@ -1560,7 +1548,6 @@ hns3_config_rss_filter(struct hns3_hw *hw, - /* Update the useful flow types */ - rss_flow_conf.types = flow_types; - -- rss_info = &hw->rss_info; - if (!add) { - if (!conf->valid) - return 0; -@@ -1571,15 +1558,6 @@ hns3_config_rss_filter(struct hns3_hw *hw, - return ret; - } - -- if (rss_flow_conf.queue_num) { -- /* -- * Due the content of queue pointer have been reset to -- * 0, the rss_info->conf.queue should be set to NULL -- */ -- rss_info->conf.queue = NULL; -- rss_info->conf.queue_num = 0; -- } -- - return 0; - } - --- -2.23.0 - diff --git a/0228-net-hns3-fix-warning-on-flush-or-destroy-rule.patch b/0228-net-hns3-fix-warning-on-flush-or-destroy-rule.patch deleted file mode 100644 index 5a7fecf..0000000 --- a/0228-net-hns3-fix-warning-on-flush-or-destroy-rule.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 21b43c2f2d66de594ed174a0ba18da03a6fe5296 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:58 +0800 -Subject: net/hns3: fix warning on flush or destroy rule - -[ upstream commit a7bf2789168c8d49ca4dec5bb7bb0b3f765fc1bd ] - -Although flow rules will no longer be used when user flush all rules -or destroy a rule a warning is generated like: -"modified RSS types based on hardware support, requested:0x137f83fffc -configured:0x3ffc". - -Prevent warning for flush or destroy rule case. - -Fixes: ec674cb742e5 ("net/hns3: fix flushing RSS rule") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 7adde16cbc..fbc38dd3d4 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1537,17 +1537,6 @@ hns3_config_rss_filter(struct hns3_hw *hw, - .queue = conf->conf.queue, - }; - -- /* Filter the unsupported flow types */ -- flow_types = conf->conf.types ? -- rss_flow_conf.types & HNS3_ETH_RSS_SUPPORT : -- hw->rss_info.conf.types; -- if (flow_types != rss_flow_conf.types) -- hns3_warn(hw, "modified RSS types based on hardware support, " -- "requested:0x%" PRIx64 " configured:0x%" PRIx64, -- rss_flow_conf.types, flow_types); -- /* Update the useful flow types */ -- rss_flow_conf.types = flow_types; -- - if (!add) { - if (!conf->valid) - return 0; -@@ -1573,6 +1562,17 @@ hns3_config_rss_filter(struct hns3_hw *hw, - return ret; - } - -+ /* Filter the unsupported flow types */ -+ flow_types = conf->conf.types ? -+ rss_flow_conf.types & HNS3_ETH_RSS_SUPPORT : -+ hw->rss_info.conf.types; -+ if (flow_types != rss_flow_conf.types) -+ hns3_warn(hw, "modified RSS types based on hardware support," -+ " requested:0x%" PRIx64 " configured:0x%" PRIx64, -+ rss_flow_conf.types, flow_types); -+ /* Update the useful flow types */ -+ rss_flow_conf.types = flow_types; -+ - /* Set hash algorithm and flow types by the user's config */ - return hns3_hw_rss_hash_set(hw, &rss_flow_conf); - } --- -2.23.0 - diff --git a/0229-net-hns3-fix-config-struct-used-for-conversion.patch b/0229-net-hns3-fix-config-struct-used-for-conversion.patch deleted file mode 100644 index 9706fe1..0000000 --- a/0229-net-hns3-fix-config-struct-used-for-conversion.patch +++ /dev/null @@ -1,133 +0,0 @@ -From e59403adf4cc2485d10fba148bf935b037170fb7 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:02:59 +0800 -Subject: net/hns3: fix config struct used for conversion - -[ upstream commit 815c7db53167f7ee1573dca18fa7f889e44764d4 ] - -When the type in 'struct rte_flow_action' is RTE_FLOW_ACTION_TYPE_RSS, -the 'conf' pointer references the 'struct rte_flow_action_rss' instead -of the 'struct hns3_rss_conf' in driver. But driver uses 'struct -hns3_rss_conf' to convert this 'conf' pointer to get RSS action -configuration. - -In addition, RSS filter configuration is directly cloned to RSS filter -node instead of coping it after successfully setting to hardware. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 59 ++++++++++++++---------------------- - 1 file changed, 22 insertions(+), 37 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index fbc38dd3d4..a30b19cfdb 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -95,8 +95,8 @@ static const struct rte_flow_action * - hns3_find_rss_general_action(const struct rte_flow_item pattern[], - const struct rte_flow_action actions[]) - { -+ const struct rte_flow_action_rss *rss_act; - const struct rte_flow_action *act = NULL; -- const struct hns3_rss_conf *rss; - bool have_eth = false; - - for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { -@@ -115,8 +115,8 @@ hns3_find_rss_general_action(const struct rte_flow_item pattern[], - } - } - -- rss = act->conf; -- if (have_eth && rss->conf.queue_num) { -+ rss_act = act->conf; -+ if (have_eth && rss_act->queue_num) { - /* - * Pattern have ETH and action's queue_num > 0, indicate this is - * queue region configuration. -@@ -1296,30 +1296,6 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - sizeof(*with->queue) * with->queue_num)); - } - --static int --hns3_rss_conf_copy(struct hns3_rss_conf *out, -- const struct rte_flow_action_rss *in) --{ -- if (in->key_len > RTE_DIM(out->key) || -- in->queue_num > RTE_DIM(out->queue)) -- return -EINVAL; -- if (in->key == NULL && in->key_len) -- return -EINVAL; -- out->conf = (struct rte_flow_action_rss) { -- .func = in->func, -- .level = in->level, -- .types = in->types, -- .key_len = in->key_len, -- .queue_num = in->queue_num, -- }; -- out->conf.queue = memcpy(out->queue, in->queue, -- sizeof(*in->queue) * in->queue_num); -- if (in->key) -- out->conf.key = memcpy(out->key, in->key, in->key_len); -- -- return 0; --} -- - static bool - hns3_rss_input_tuple_supported(struct hns3_hw *hw, - const struct rte_flow_action_rss *rss) -@@ -1733,9 +1709,10 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - struct rte_flow *flow) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ const struct rte_flow_action_rss *rss_act; - struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_rss_conf_ele *filter_ptr; -- const struct hns3_rss_conf *rss_conf; -+ struct hns3_rss_conf *new_conf; - int ret; - - rss_filter_ptr = rte_zmalloc("hns3 rss filter", -@@ -1745,19 +1722,27 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - return -ENOMEM; - } - -- /* -- * After all the preceding tasks are successfully configured, configure -- * rules to the hardware to simplify the rollback of rules in the -- * hardware. -- */ -- rss_conf = (const struct hns3_rss_conf *)act->conf; -- ret = hns3_flow_parse_rss(dev, rss_conf, true); -+ rss_act = (const struct rte_flow_action_rss *)act->conf; -+ new_conf = &rss_filter_ptr->filter_info; -+ memcpy(&new_conf->conf, rss_act, sizeof(*rss_act)); -+ if (rss_act->queue_num > 0) { -+ memcpy(new_conf->queue, rss_act->queue, -+ rss_act->queue_num * sizeof(new_conf->queue[0])); -+ new_conf->conf.queue = new_conf->queue; -+ } -+ if (rss_act->key_len > 0) { -+ if (rss_act->key != NULL) { -+ memcpy(new_conf->key, rss_act->key, -+ rss_act->key_len * sizeof(new_conf->key[0])); -+ new_conf->conf.key = new_conf->key; -+ } -+ } -+ -+ ret = hns3_flow_parse_rss(dev, new_conf, true); - if (ret != 0) { - rte_free(rss_filter_ptr); - return ret; - } -- -- hns3_rss_conf_copy(&rss_filter_ptr->filter_info, &rss_conf->conf); - rss_filter_ptr->filter_info.valid = true; - - /* --- -2.23.0 - diff --git a/0230-net-hns3-fix-duplicate-RSS-rule-check.patch b/0230-net-hns3-fix-duplicate-RSS-rule-check.patch deleted file mode 100644 index 02518e8..0000000 --- a/0230-net-hns3-fix-duplicate-RSS-rule-check.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 4aa7369a34a576a630beb0680b55b7c3c8b982f5 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Jan 2023 21:03:00 +0800 -Subject: net/hns3: fix duplicate RSS rule check - -[ upstream commit 150fd8f839e332d68aa7b60646c2033084544cb7 ] - -Currently, the interface for verifying duplicate RSS rules has -some problems: -1) If the value of 'func' in configuring RSS rule is default - value, this rule is mistakenly considered as a duplicate rule. -2) If key length is zero or 'key' is NULL in configuring RSS rule - this rule is also mistakenly considered as a duplicate rule. -3) If 'key' or 'queue' in struct rte_flow_action_rss being NULL - is used to memcpy, which may cause segment fault. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 63 +++++++++++++++++++++++++++--------- - 1 file changed, 47 insertions(+), 16 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index a30b19cfdb..e80ec0f053 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1272,28 +1272,59 @@ hns3_filterlist_flush(struct rte_eth_dev *dev) - } - } - -+static bool -+hns3_flow_rule_key_same(const struct rte_flow_action_rss *comp, -+ const struct rte_flow_action_rss *with) -+{ -+ if (comp->key_len != with->key_len) -+ return false; -+ -+ if (with->key_len == 0) -+ return true; -+ -+ if (comp->key == NULL && with->key == NULL) -+ return true; -+ -+ if (!(comp->key != NULL && with->key != NULL)) -+ return false; -+ -+ return !memcmp(comp->key, with->key, with->key_len); -+} -+ -+static bool -+hns3_flow_rule_queues_same(const struct rte_flow_action_rss *comp, -+ const struct rte_flow_action_rss *with) -+{ -+ if (comp->queue_num != with->queue_num) -+ return false; -+ -+ if (with->queue_num == 0) -+ return true; -+ -+ if (comp->queue == NULL && with->queue == NULL) -+ return true; -+ -+ if (!(comp->queue != NULL && with->queue != NULL)) -+ return false; -+ -+ return !memcmp(comp->queue, with->queue, with->queue_num); -+} -+ - static bool - hns3_action_rss_same(const struct rte_flow_action_rss *comp, - const struct rte_flow_action_rss *with) - { -- bool rss_key_is_same; -- bool func_is_same; -+ bool same_level; -+ bool same_types; -+ bool same_func; - -- func_is_same = (with->func != RTE_ETH_HASH_FUNCTION_DEFAULT) ? -- (comp->func == with->func) : true; -+ same_level = (comp->level == with->level); -+ same_types = (comp->types == with->types); -+ same_func = (comp->func == with->func); - -- if (with->key_len == 0 || with->key == NULL) -- rss_key_is_same = 1; -- else -- rss_key_is_same = comp->key_len == with->key_len && -- !memcmp(comp->key, with->key, with->key_len); -- -- return (func_is_same && rss_key_is_same && -- comp->types == with->types && -- comp->level == with->level && -- comp->queue_num == with->queue_num && -- !memcmp(comp->queue, with->queue, -- sizeof(*with->queue) * with->queue_num)); -+ return same_level && same_types && same_func && -+ hns3_flow_rule_key_same(comp, with) && -+ hns3_flow_rule_queues_same(comp, with); - } - - static bool --- -2.23.0 - diff --git a/0231-net-hns3-fix-burst-mode-query-with-dummy-function.patch b/0231-net-hns3-fix-burst-mode-query-with-dummy-function.patch deleted file mode 100644 index e49dbef..0000000 --- a/0231-net-hns3-fix-burst-mode-query-with-dummy-function.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 6a7c7c31b57bb4dadaf3750a3fc36e3ec0761f3f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:25 +0800 -Subject: net/hns3: fix burst mode query with dummy function - -[ upstream commit 10f91af5a5b370df922f888826a4387abebe1cde ] - -The rte_eth_rx/tx_burst_mode_get API will fail when Rx/Tx -function is dummy. - -Fixes: 7ef933908f04 ("net/hns3: add simple Tx path") -Fixes: 521ab3e93361 ("net/hns3: add simple Rx path") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 38 ++++++++++++++++++++++-------------- - 1 file changed, 23 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 9a597e032e..c69fb38402 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -2786,6 +2786,7 @@ hns3_rx_burst_mode_get(struct rte_eth_dev *dev, __rte_unused uint16_t queue_id, - { hns3_recv_scattered_pkts, "Scalar Scattered" }, - { hns3_recv_pkts_vec, "Vector Neon" }, - { hns3_recv_pkts_vec_sve, "Vector Sve" }, -+ { rte_eth_pkt_burst_dummy, "Dummy" }, - }; - - eth_rx_burst_t pkt_burst = dev->rx_pkt_burst; -@@ -4272,24 +4273,31 @@ int - hns3_tx_burst_mode_get(struct rte_eth_dev *dev, __rte_unused uint16_t queue_id, - struct rte_eth_burst_mode *mode) - { -+ static const struct { -+ eth_tx_burst_t pkt_burst; -+ const char *info; -+ } burst_infos[] = { -+ { hns3_xmit_pkts_simple, "Scalar Simple" }, -+ { hns3_xmit_pkts, "Scalar" }, -+ { hns3_xmit_pkts_vec, "Vector Neon" }, -+ { hns3_xmit_pkts_vec_sve, "Vector Sve" }, -+ { rte_eth_pkt_burst_dummy, "Dummy" }, -+ }; -+ - eth_tx_burst_t pkt_burst = dev->tx_pkt_burst; -- const char *info = NULL; -- -- if (pkt_burst == hns3_xmit_pkts_simple) -- info = "Scalar Simple"; -- else if (pkt_burst == hns3_xmit_pkts) -- info = "Scalar"; -- else if (pkt_burst == hns3_xmit_pkts_vec) -- info = "Vector Neon"; -- else if (pkt_burst == hns3_xmit_pkts_vec_sve) -- info = "Vector Sve"; -- -- if (info == NULL) -- return -EINVAL; -+ int ret = -EINVAL; -+ unsigned int i; - -- snprintf(mode->info, sizeof(mode->info), "%s", info); -+ for (i = 0; i < RTE_DIM(burst_infos); i++) { -+ if (pkt_burst == burst_infos[i].pkt_burst) { -+ snprintf(mode->info, sizeof(mode->info), "%s", -+ burst_infos[i].info); -+ ret = 0; -+ break; -+ } -+ } - -- return 0; -+ return ret; - } - - static bool --- -2.23.0 - diff --git a/0232-net-hns3-add-debug-info-for-Rx-Tx-dummy-function.patch b/0232-net-hns3-add-debug-info-for-Rx-Tx-dummy-function.patch deleted file mode 100644 index a3fb1ee..0000000 --- a/0232-net-hns3-add-debug-info-for-Rx-Tx-dummy-function.patch +++ /dev/null @@ -1,41 +0,0 @@ -From cd3db5d9c5aea3efa6b0bbaefecb7fb8367a7719 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:26 +0800 -Subject: net/hns3: add debug info for Rx/Tx dummy function - -[ upstream commit a8f52a5cf13715c61dfe224815c7f4e4858be82f ] - -Now dummy function can be report by rte_eth_rx/tx_burst_mode_get. -So this patch adds debug info for Rx/Tx dummy function. - -Fixes: 7feb2aee0e2c ("net/hns3: log selected datapath") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index c69fb38402..52393b1f6f 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4420,13 +4420,13 @@ hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - hns3_get_tx_function(eth_dev, &prep); - eth_dev->tx_pkt_prepare = prep; - eth_dev->tx_descriptor_status = hns3_dev_tx_descriptor_status; -- hns3_trace_rxtx_function(eth_dev); - } else { - eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy; - eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy; - eth_dev->tx_pkt_prepare = NULL; - } - -+ hns3_trace_rxtx_function(eth_dev); - hns3_eth_dev_fp_ops_config(eth_dev); - } - --- -2.23.0 - diff --git a/0233-net-hns3-remove-debug-condition-for-Tx-prepare.patch b/0233-net-hns3-remove-debug-condition-for-Tx-prepare.patch deleted file mode 100644 index 8c3973e..0000000 --- a/0233-net-hns3-remove-debug-condition-for-Tx-prepare.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 25a54df88c36a76f4914287ba393d2251f4492ec Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:27 +0800 -Subject: net/hns3: remove debug condition for Tx prepare - -[ upstream commit a8d240786e1af129fdf789391d574bf4a7fe60e6 ] - -The Tx prepare in driver is always needed if RTE_LIBRTE_ETHDEV_DEBUG -is defined. But it doesn't matter with this macro. Let's remove it. - -Fixes: d7ec2c076579 ("net/hns3: select Tx prepare based on Tx offload") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 52393b1f6f..9fc54d50f1 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4311,11 +4311,6 @@ hns3_tx_check_simple_support(struct rte_eth_dev *dev) - static bool - hns3_get_tx_prep_needed(struct rte_eth_dev *dev) - { --#ifdef RTE_LIBRTE_ETHDEV_DEBUG -- RTE_SET_USED(dev); -- /* always perform tx_prepare when debug */ -- return true; --#else - #define HNS3_DEV_TX_CSKUM_TSO_OFFLOAD_MASK (\ - RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \ - RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \ -@@ -4333,7 +4328,6 @@ hns3_get_tx_prep_needed(struct rte_eth_dev *dev) - return true; - - return false; --#endif - } - - eth_tx_burst_t --- -2.23.0 - diff --git a/0234-net-hns3-separate-Tx-prepare-from-getting-Tx-functio.patch b/0234-net-hns3-separate-Tx-prepare-from-getting-Tx-functio.patch deleted file mode 100644 index 0aaa9a7..0000000 --- a/0234-net-hns3-separate-Tx-prepare-from-getting-Tx-functio.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 9e0cd6d469351131e473edc8a9dbbcd70890519f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:28 +0800 -Subject: net/hns3: separate Tx prepare from getting Tx function - -[ upstream commit 6a934ba4c6c48691b119a878981a4e3748766518 ] - -Separate getting tx prepare from hns3_get_tx_function by extracting -an independent function. - -Fixes: d7ec2c076579 ("net/hns3: select Tx prepare based on Tx offload") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 32 ++++++++++++++------------------ - drivers/net/hns3/hns3_rxtx.h | 3 +-- - 2 files changed, 15 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 9fc54d50f1..2dba4d8120 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4324,26 +4324,30 @@ hns3_get_tx_prep_needed(struct rte_eth_dev *dev) - RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO) - - uint64_t tx_offload = dev->data->dev_conf.txmode.offloads; -+ - if (tx_offload & HNS3_DEV_TX_CSKUM_TSO_OFFLOAD_MASK) - return true; - - return false; - } - -+static eth_tx_prep_t -+hns3_get_tx_prepare(struct rte_eth_dev *dev) -+{ -+ return hns3_get_tx_prep_needed(dev) ? hns3_prep_pkts : NULL; -+} -+ - eth_tx_burst_t --hns3_get_tx_function(struct rte_eth_dev *dev, eth_tx_prep_t *prep) -+hns3_get_tx_function(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; - bool vec_allowed, sve_allowed, simple_allowed; -- bool vec_support, tx_prepare_needed; -+ bool vec_support; - - vec_support = hns3_tx_check_vec_support(dev) == 0; - vec_allowed = vec_support && hns3_get_default_vec_support(); - sve_allowed = vec_support && hns3_get_sve_support(); - simple_allowed = hns3_tx_check_simple_support(dev); -- tx_prepare_needed = hns3_get_tx_prep_needed(dev); -- -- *prep = NULL; - - if (hns->tx_func_hint == HNS3_IO_FUNC_HINT_VEC && vec_allowed) - return hns3_xmit_pkts_vec; -@@ -4351,19 +4355,14 @@ hns3_get_tx_function(struct rte_eth_dev *dev, eth_tx_prep_t *prep) - return hns3_xmit_pkts_vec_sve; - if (hns->tx_func_hint == HNS3_IO_FUNC_HINT_SIMPLE && simple_allowed) - return hns3_xmit_pkts_simple; -- if (hns->tx_func_hint == HNS3_IO_FUNC_HINT_COMMON) { -- if (tx_prepare_needed) -- *prep = hns3_prep_pkts; -+ if (hns->tx_func_hint == HNS3_IO_FUNC_HINT_COMMON) - return hns3_xmit_pkts; -- } - - if (vec_allowed) - return hns3_xmit_pkts_vec; - if (simple_allowed) - return hns3_xmit_pkts_simple; - -- if (tx_prepare_needed) -- *prep = hns3_prep_pkts; - return hns3_xmit_pkts; - } - -@@ -4403,7 +4402,6 @@ hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private); - struct hns3_adapter *hns = eth_dev->data->dev_private; -- eth_tx_prep_t prep = NULL; - - if (hns->hw.adapter_state == HNS3_NIC_STARTED && - __atomic_load_n(&hns->hw.reset.resetting, __ATOMIC_RELAXED) == 0) { -@@ -4411,8 +4409,8 @@ hns3_set_rxtx_function(struct rte_eth_dev *eth_dev) - eth_dev->rx_descriptor_status = hns3_dev_rx_descriptor_status; - eth_dev->tx_pkt_burst = hw->set_link_down ? - rte_eth_pkt_burst_dummy : -- hns3_get_tx_function(eth_dev, &prep); -- eth_dev->tx_pkt_prepare = prep; -+ hns3_get_tx_function(eth_dev); -+ eth_dev->tx_pkt_prepare = hns3_get_tx_prepare(eth_dev); - eth_dev->tx_descriptor_status = hns3_dev_tx_descriptor_status; - } else { - eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy; -@@ -4758,10 +4756,8 @@ hns3_stop_tx_datapath(struct rte_eth_dev *dev) - void - hns3_start_tx_datapath(struct rte_eth_dev *dev) - { -- eth_tx_prep_t prep = NULL; -- -- dev->tx_pkt_burst = hns3_get_tx_function(dev, &prep); -- dev->tx_pkt_prepare = prep; -+ dev->tx_pkt_burst = hns3_get_tx_function(dev); -+ dev->tx_pkt_prepare = hns3_get_tx_prepare(dev); - hns3_eth_dev_fp_ops_config(dev); - - if (rte_eal_process_type() == RTE_PROC_SECONDARY) -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index ea1a805491..38c3581312 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -740,8 +740,7 @@ int hns3_tx_burst_mode_get(struct rte_eth_dev *dev, - const uint32_t *hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev); - void hns3_init_rx_ptype_tble(struct rte_eth_dev *dev); - void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev); --eth_tx_burst_t hns3_get_tx_function(struct rte_eth_dev *dev, -- eth_tx_prep_t *prep); -+eth_tx_burst_t hns3_get_tx_function(struct rte_eth_dev *dev); - - uint32_t hns3_get_tqp_intr_reg_offset(uint16_t tqp_intr_id); - void hns3_set_queue_intr_gl(struct hns3_hw *hw, uint16_t queue_id, --- -2.23.0 - diff --git a/0235-net-hns3-make-getting-Tx-function-static.patch b/0235-net-hns3-make-getting-Tx-function-static.patch deleted file mode 100644 index b2793aa..0000000 --- a/0235-net-hns3-make-getting-Tx-function-static.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 4efa4ab6f451ebc5ef8439eedda3b3982e9465ca Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:29 +0800 -Subject: net/hns3: make getting Tx function static - -[ upstream commit 2aec7beaba05cd82cd951f0c6bbaecb82d533ce0 ] - -The hns3_get_tx_function() is an intrinsic function now and should -not be open to other files. - -Fixes: 96c33cfb06cf ("net/hns3: fix Rx/Tx functions update") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 2 +- - drivers/net/hns3/hns3_rxtx.h | 2 -- - 2 files changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 2dba4d8120..b5e7ba7325 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4337,7 +4337,7 @@ hns3_get_tx_prepare(struct rte_eth_dev *dev) - return hns3_get_tx_prep_needed(dev) ? hns3_prep_pkts : NULL; - } - --eth_tx_burst_t -+static eth_tx_burst_t - hns3_get_tx_function(struct rte_eth_dev *dev) - { - struct hns3_adapter *hns = dev->data->dev_private; -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index 38c3581312..1bdc124b7b 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -740,8 +740,6 @@ int hns3_tx_burst_mode_get(struct rte_eth_dev *dev, - const uint32_t *hns3_dev_supported_ptypes_get(struct rte_eth_dev *dev); - void hns3_init_rx_ptype_tble(struct rte_eth_dev *dev); - void hns3_set_rxtx_function(struct rte_eth_dev *eth_dev); --eth_tx_burst_t hns3_get_tx_function(struct rte_eth_dev *dev); -- - uint32_t hns3_get_tqp_intr_reg_offset(uint16_t tqp_intr_id); - void hns3_set_queue_intr_gl(struct hns3_hw *hw, uint16_t queue_id, - uint8_t gl_idx, uint16_t gl_value); --- -2.23.0 - diff --git a/0236-net-hns3-extract-common-functions-to-set-Rx-Tx.patch b/0236-net-hns3-extract-common-functions-to-set-Rx-Tx.patch deleted file mode 100644 index ecb2c65..0000000 --- a/0236-net-hns3-extract-common-functions-to-set-Rx-Tx.patch +++ /dev/null @@ -1,196 +0,0 @@ -From a83eecfe38a20bbfa51a108f62d55d6189e943d7 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Feb 2023 17:18:30 +0800 -Subject: net/hns3: extract common functions to set Rx/Tx - -[ upstream commit 4ba28c957a16bbfe5b2a8d49dfda1c85387d7602 ] - -Extract two common functions to set Rx/Tx function in order to -reduce duplicate codes. - -Fixes: 23d4b61fee5d ("net/hns3: support multiple process") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 20 ++++---------------- - drivers/net/hns3/hns3_ethdev_vf.c | 19 ++++--------------- - drivers/net/hns3/hns3_mp.c | 4 ++-- - drivers/net/hns3/hns3_rxtx.c | 28 ++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_rxtx.h | 2 ++ - 5 files changed, 40 insertions(+), 33 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 8fa12d91bb..1c67ff2c99 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5052,8 +5052,7 @@ hns3_dev_start(struct rte_eth_dev *dev) - rte_spinlock_unlock(&hw->lock); - - hns3_rx_scattered_calc(dev); -- hns3_set_rxtx_function(dev); -- hns3_mp_req_start_rxtx(dev); -+ hns3_start_rxtx_datapath(dev); - - /* Enable interrupt of all rx queues before enabling queues */ - hns3_dev_all_rx_queue_intr_enable(hw, true); -@@ -5131,12 +5130,7 @@ hns3_dev_stop(struct rte_eth_dev *dev) - dev->data->dev_started = 0; - - hw->adapter_state = HNS3_NIC_STOPPING; -- hns3_set_rxtx_function(dev); -- rte_wmb(); -- /* Disable datapath on secondary process. */ -- hns3_mp_req_stop_rxtx(dev); -- /* Prevent crashes when queues are still in use. */ -- rte_delay_ms(hw->cfg_max_queues); -+ hns3_stop_rxtx_datapath(dev); - - rte_spinlock_lock(&hw->lock); - if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) == 0) { -@@ -5752,12 +5746,7 @@ hns3_stop_service(struct hns3_adapter *hns) - rte_eal_alarm_cancel(hns3_service_handler, eth_dev); - hns3_update_linkstatus_and_event(hw, false); - } -- -- hns3_set_rxtx_function(eth_dev); -- rte_wmb(); -- /* Disable datapath on secondary process. */ -- hns3_mp_req_stop_rxtx(eth_dev); -- rte_delay_ms(hw->cfg_max_queues); -+ hns3_stop_rxtx_datapath(eth_dev); - - rte_spinlock_lock(&hw->lock); - if (hns->hw.adapter_state == HNS3_NIC_STARTED || -@@ -5790,8 +5779,7 @@ hns3_start_service(struct hns3_adapter *hns) - hw->reset.level == HNS3_GLOBAL_RESET) - hns3_set_rst_done(hw); - eth_dev = &rte_eth_devices[hw->data->port_id]; -- hns3_set_rxtx_function(eth_dev); -- hns3_mp_req_start_rxtx(eth_dev); -+ hns3_start_rxtx_datapath(eth_dev); - if (hw->adapter_state == HNS3_NIC_STARTED) { - /* - * This API parent function already hold the hns3_hw.lock, the -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index a3a1b71a63..3a93987409 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1572,12 +1572,7 @@ hns3vf_dev_stop(struct rte_eth_dev *dev) - dev->data->dev_started = 0; - - hw->adapter_state = HNS3_NIC_STOPPING; -- hns3_set_rxtx_function(dev); -- rte_wmb(); -- /* Disable datapath on secondary process. */ -- hns3_mp_req_stop_rxtx(dev); -- /* Prevent crashes when queues are still in use. */ -- rte_delay_ms(hw->cfg_max_queues); -+ hns3_stop_rxtx_datapath(dev); - - rte_spinlock_lock(&hw->lock); - if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) == 0) { -@@ -1731,8 +1726,7 @@ hns3vf_dev_start(struct rte_eth_dev *dev) - rte_spinlock_unlock(&hw->lock); - - hns3_rx_scattered_calc(dev); -- hns3_set_rxtx_function(dev); -- hns3_mp_req_start_rxtx(dev); -+ hns3_start_rxtx_datapath(dev); - - /* Enable interrupt of all rx queues before enabling queues */ - hns3_dev_all_rx_queue_intr_enable(hw, true); -@@ -1902,11 +1896,7 @@ hns3vf_stop_service(struct hns3_adapter *hns) - } - hw->mac.link_status = RTE_ETH_LINK_DOWN; - -- hns3_set_rxtx_function(eth_dev); -- rte_wmb(); -- /* Disable datapath on secondary process. */ -- hns3_mp_req_stop_rxtx(eth_dev); -- rte_delay_ms(hw->cfg_max_queues); -+ hns3_stop_rxtx_datapath(eth_dev); - - rte_spinlock_lock(&hw->lock); - if (hw->adapter_state == HNS3_NIC_STARTED || -@@ -1938,8 +1928,7 @@ hns3vf_start_service(struct hns3_adapter *hns) - struct rte_eth_dev *eth_dev; - - eth_dev = &rte_eth_devices[hw->data->port_id]; -- hns3_set_rxtx_function(eth_dev); -- hns3_mp_req_start_rxtx(eth_dev); -+ hns3_start_rxtx_datapath(eth_dev); - - rte_eal_alarm_set(HNS3VF_KEEP_ALIVE_INTERVAL, hns3vf_keep_alive_handler, - eth_dev); -diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c -index e74ddea195..c3005b943f 100644 ---- a/drivers/net/hns3/hns3_mp.c -+++ b/drivers/net/hns3/hns3_mp.c -@@ -87,12 +87,12 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) - case HNS3_MP_REQ_START_RXTX: - PMD_INIT_LOG(INFO, "port %u starting datapath", - dev->data->port_id); -- hns3_set_rxtx_function(dev); -+ hns3_start_rxtx_datapath(dev); - break; - case HNS3_MP_REQ_STOP_RXTX: - PMD_INIT_LOG(INFO, "port %u stopping datapath", - dev->data->port_id); -- hns3_set_rxtx_function(dev); -+ hns3_stop_rxtx_datapath(dev); - break; - case HNS3_MP_REQ_START_TX: - PMD_INIT_LOG(INFO, "port %u starting Tx datapath", -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index b5e7ba7325..1f44c0345f 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4765,3 +4765,31 @@ hns3_start_tx_datapath(struct rte_eth_dev *dev) - - hns3_mp_req_start_tx(dev); - } -+ -+void -+hns3_stop_rxtx_datapath(struct rte_eth_dev *dev) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ -+ hns3_set_rxtx_function(dev); -+ -+ if (rte_eal_process_type() == RTE_PROC_SECONDARY) -+ return; -+ -+ rte_wmb(); -+ /* Disable datapath on secondary process. */ -+ hns3_mp_req_stop_rxtx(dev); -+ /* Prevent crashes when queues are still in use. */ -+ rte_delay_ms(hw->cfg_max_queues); -+} -+ -+void -+hns3_start_rxtx_datapath(struct rte_eth_dev *dev) -+{ -+ hns3_set_rxtx_function(dev); -+ -+ if (rte_eal_process_type() == RTE_PROC_SECONDARY) -+ return; -+ -+ hns3_mp_req_start_rxtx(dev); -+} -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index 1bdc124b7b..fa39f6481a 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -773,5 +773,7 @@ int hns3_dev_tx_descriptor_status(void *tx_queue, uint16_t offset); - void hns3_tx_push_init(struct rte_eth_dev *dev); - void hns3_stop_tx_datapath(struct rte_eth_dev *dev); - void hns3_start_tx_datapath(struct rte_eth_dev *dev); -+void hns3_stop_rxtx_datapath(struct rte_eth_dev *dev); -+void hns3_start_rxtx_datapath(struct rte_eth_dev *dev); - - #endif /* HNS3_RXTX_H */ --- -2.23.0 - diff --git a/0237-net-hns3-declare-flow-rule-keeping-capability.patch b/0237-net-hns3-declare-flow-rule-keeping-capability.patch deleted file mode 100644 index 7e0426e..0000000 --- a/0237-net-hns3-declare-flow-rule-keeping-capability.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 1ee0d9b0270d2a6954c6276aa08f437232707f18 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 15 Dec 2022 01:41:41 +0000 -Subject: net/hns3: declare flow rule keeping capability - -[ upstream commit 27fd46521517cae0f456dad850a04f18de0690f8 ] - -The driver supports create flow rules when device is stopped, and -re-setup flow rules when restarting, so declare support -RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP. - -The driver also supports to create indirect actions when device is -stopped, and keeps the indirect actions when restarting, so declare -support RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP. - -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 9bfbe1161f..3c5e07f1bd 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -91,10 +91,11 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - if (hns3_dev_get_support(hw, OUTER_UDP_CKSUM)) - info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM; - -+ info->dev_capa = RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP | -+ RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP; - if (hns3_dev_get_support(hw, INDEP_TXRX)) -- info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | -- RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; -- info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; -+ info->dev_capa |= RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | -+ RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; - - if (hns3_dev_get_support(hw, PTP)) - info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; --- -2.23.0 - diff --git a/0238-app-testpmd-add-disable-flow-flush-option.patch b/0238-app-testpmd-add-disable-flow-flush-option.patch deleted file mode 100644 index ee3c2ab..0000000 --- a/0238-app-testpmd-add-disable-flow-flush-option.patch +++ /dev/null @@ -1,106 +0,0 @@ -From c4daf6ffbb78fb4cb2ec3b6d632364d5e077cf10 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 15 Dec 2022 01:41:42 +0000 -Subject: app/testpmd: add --disable-flow-flush option - -[ upstream commit 543df472bced6a9bf0e45c290c3af852486b474a ] - -This patch adds "--disable-flow-flush" parameter, which could used to -disable port flow flush when stop port. It allows testing keep flow -rules or shared flow objects across restart. - -Signed-off-by: Chengwen Feng -Acked-by: Ori Kam -Acked-by: Aman Singh ---- - app/test-pmd/parameters.c | 4 ++++ - app/test-pmd/testpmd.c | 7 ++++++- - app/test-pmd/testpmd.h | 1 + - doc/guides/testpmd_app_ug/run_app.rst | 5 +++++ - 4 files changed, 16 insertions(+), 1 deletion(-) - -diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c -index 435687fa6d..e147be28b3 100644 ---- a/app/test-pmd/parameters.c -+++ b/app/test-pmd/parameters.c -@@ -184,6 +184,7 @@ usage(char* progname) - "disable print of designated event or all of them.\n"); - printf(" --flow-isolate-all: " - "requests flow API isolated mode on all ports at initialization time.\n"); -+ printf(" --disable-flow-flush: disable port flow flush when stop port.\n"); - printf(" --tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads\n"); - printf(" --rx-offloads=0xXXXXXXXX: hexadecimal bitmask of RX queue offloads\n"); - printf(" --hot-plug: enable hot plug for device.\n"); -@@ -674,6 +675,7 @@ launch_args_parse(int argc, char** argv) - { "rxfreet", 1, 0, 0 }, - { "no-flush-rx", 0, 0, 0 }, - { "flow-isolate-all", 0, 0, 0 }, -+ { "disable-flow-flush", 0, 0, 0 }, - { "rxoffs", 1, 0, 0 }, - { "rxpkts", 1, 0, 0 }, - { "txpkts", 1, 0, 0 }, -@@ -1381,6 +1383,8 @@ launch_args_parse(int argc, char** argv) - rmv_interrupt = 0; - if (!strcmp(lgopts[opt_idx].name, "flow-isolate-all")) - flow_isolate_all = 1; -+ if (!strcmp(lgopts[opt_idx].name, "disable-flow-flush")) -+ no_flow_flush = 1; - if (!strcmp(lgopts[opt_idx].name, "tx-offloads")) { - char *end = NULL; - n = strtoull(optarg, &end, 16); -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index 32098d4701..20134c5234 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -371,6 +371,11 @@ uint8_t no_flush_rx = 0; /* flush by default */ - */ - uint8_t flow_isolate_all; - -+/* -+ * Disable port flow flush when stop port. -+ */ -+uint8_t no_flow_flush = 0; /* do flow flush by default */ -+ - /* - * Avoids to check link status when starting/stopping a port. - */ -@@ -3173,7 +3178,7 @@ stop_port(portid_t pid) - } - } - -- if (port->flow_list) -+ if (port->flow_list && !no_flow_flush) - port_flow_flush(pi); - - if (eth_dev_stop_mp(pi) != 0) -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 480dc3fa34..be7454ab44 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -398,6 +398,7 @@ extern uint8_t numa_support; /**< set by "--numa" parameter */ - extern uint16_t port_topology; /**< set by "--port-topology" parameter */ - extern uint8_t no_flush_rx; /** -Date: Fri, 10 Mar 2023 17:35:03 +0800 -Subject: net/hns3: fix possible truncation of hash key when config - -[ upstream commit bb38316e738ad6009b3f20b3abfaf27ea8cb0202 ] - -The hash key length of hns3 driver is obtained from firmware. If the -length is a multiple of HNS3_RSS_HASH_KEY_NUM (16), the last part -of hash key will be truncated. - -Fixes: 88347111eb53 ("net/hns3: refactor set RSS hash algorithm and key interface") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index d6e0754273..2011c18b9b 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -301,7 +301,8 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - req->hash_config |= (hash_algo & HNS3_RSS_HASH_ALGO_MASK); - req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B); - -- if (idx == max_bd_num - 1) -+ if (idx == max_bd_num - 1 && -+ (key_len % HNS3_RSS_HASH_KEY_NUM) != 0) - cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM; - else - cur_key_size = HNS3_RSS_HASH_KEY_NUM; --- -2.23.0 - diff --git a/0240-net-hns3-fix-possible-truncation-of-redirection-tabl.patch b/0240-net-hns3-fix-possible-truncation-of-redirection-tabl.patch deleted file mode 100644 index 01b8996..0000000 --- a/0240-net-hns3-fix-possible-truncation-of-redirection-tabl.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 81cda32ef08ef6b179a36fcfe5b04b0a702dfa33 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:04 +0800 -Subject: net/hns3: fix possible truncation of redirection table - -[ upstream commit 4729376e555b58a739e6e231d403ca3b029ad92c ] - -The size of the redirection table is obtained from firmware. If the size -isn't a multiple of HNS3_RSS_CFG_TBL_SIZE, the redirection table from -user will be truncated. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 2011c18b9b..ed397587b5 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -329,6 +329,7 @@ int - hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) - { - struct hns3_rss_indirection_table_cmd *req; -+ uint16_t max_bd_num, cfg_tbl_size; - struct hns3_cmd_desc desc; - uint8_t qid_msb_off; - uint8_t qid_msb_val; -@@ -337,14 +338,20 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) - int ret; - - req = (struct hns3_rss_indirection_table_cmd *)desc.data; -- -- for (i = 0; i < size / HNS3_RSS_CFG_TBL_SIZE; i++) { -+ max_bd_num = DIV_ROUND_UP(size, HNS3_RSS_CFG_TBL_SIZE); -+ for (i = 0; i < max_bd_num; i++) { - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INDIR_TABLE, - false); - req->start_table_index = - rte_cpu_to_le_16(i * HNS3_RSS_CFG_TBL_SIZE); - req->rss_set_bitmap = rte_cpu_to_le_16(HNS3_RSS_SET_BITMAP_MSK); -- for (j = 0; j < HNS3_RSS_CFG_TBL_SIZE; j++) { -+ -+ if (i == max_bd_num - 1 && (size % HNS3_RSS_CFG_TBL_SIZE) != 0) -+ cfg_tbl_size = size % HNS3_RSS_CFG_TBL_SIZE; -+ else -+ cfg_tbl_size = HNS3_RSS_CFG_TBL_SIZE; -+ -+ for (j = 0; j < cfg_tbl_size; j++) { - q_id = indir[i * HNS3_RSS_CFG_TBL_SIZE + j]; - req->rss_result_l[j] = q_id & 0xff; - --- -2.23.0 - diff --git a/0241-net-hns3-use-hardware-config-to-report-hash-key.patch b/0241-net-hns3-use-hardware-config-to-report-hash-key.patch deleted file mode 100644 index 0175113..0000000 --- a/0241-net-hns3-use-hardware-config-to-report-hash-key.patch +++ /dev/null @@ -1,114 +0,0 @@ -From da66262ce661cba4454a7e00971822791a5e1305 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:05 +0800 -Subject: net/hns3: use hardware config to report hash key - -[ upstream commit 7da415d27d8872a45a2d0cf9b5e66a8027c8f53c ] - -Currently, hns3_dev_rss_hash_conf_get() interface reports RSS key from -the key maintained by driver. It's better to report the key from -hardware, which is more realistic. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 53 ++++++++++++++++++++++++++++++++++++- - drivers/net/hns3/hns3_rss.h | 3 ++- - 2 files changed, 54 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index ed397587b5..a8ea5150ab 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -321,6 +321,48 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - return 0; - } - -+int -+hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, -+ uint8_t *key, uint8_t key_len) -+{ -+ struct hns3_rss_generic_config_cmd *req; -+ struct hns3_cmd_desc desc; -+ uint16_t cur_key_size; -+ uint16_t max_bd_num; -+ uint8_t *cur_key; -+ uint16_t idx; -+ int ret; -+ -+ req = (struct hns3_rss_generic_config_cmd *)desc.data; -+ max_bd_num = DIV_ROUND_UP(key_len, HNS3_RSS_HASH_KEY_NUM); -+ for (idx = 0; idx < max_bd_num; idx++) { -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_GENERIC_CONFIG, -+ true); -+ -+ req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B); -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret) { -+ hns3_err(hw, "fail to obtain RSS algo and key from firmware, ret = %d", -+ ret); -+ return ret; -+ } -+ -+ if (idx == 0) -+ *hash_algo = req->hash_config & HNS3_RSS_HASH_ALGO_MASK; -+ -+ if (idx == max_bd_num - 1 && -+ (key_len % HNS3_RSS_HASH_KEY_NUM) != 0) -+ cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM; -+ else -+ cur_key_size = HNS3_RSS_HASH_KEY_NUM; -+ -+ cur_key = key + idx * HNS3_RSS_HASH_KEY_NUM; -+ memcpy(cur_key, req->hash_key, cur_key_size); -+ } -+ -+ return 0; -+} -+ - /* - * rss_indirection_table command function, opcode:0x0D07. - * Used to configure the indirection table of rss. -@@ -550,13 +592,22 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - struct hns3_rss_conf *rss_cfg = &hw->rss_info; -+ uint8_t hash_algo; -+ int ret; - - rte_spinlock_lock(&hw->lock); - rss_conf->rss_hf = rss_cfg->conf.types; - - /* Get the RSS Key required by the user */ - if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) { -- memcpy(rss_conf->rss_key, rss_cfg->key, hw->rss_key_size); -+ ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key, -+ hw->rss_key_size); -+ if (ret != 0) { -+ rte_spinlock_unlock(&hw->lock); -+ hns3_err(hw, "obtain hash algo and key failed, ret = %d", -+ ret); -+ return ret; -+ } - rss_conf->rss_key_len = hw->rss_key_size; - } - rte_spinlock_unlock(&hw->lock); -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index d6f81996f4..be0141f602 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -112,6 +112,7 @@ void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - const uint8_t *key, uint8_t key_len); -- -+int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, -+ uint8_t *key, uint8_t key_len); - - #endif /* HNS3_RSS_H */ --- -2.23.0 - diff --git a/0242-net-hns3-use-hardware-config-to-report-hash-types.patch b/0242-net-hns3-use-hardware-config-to-report-hash-types.patch deleted file mode 100644 index ef63558..0000000 --- a/0242-net-hns3-use-hardware-config-to-report-hash-types.patch +++ /dev/null @@ -1,490 +0,0 @@ -From b36d99962a7ef0c2ae408e4edbabb95f00554d58 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:06 +0800 -Subject: net/hns3: use hardware config to report hash types - -[ upstream commit 406b25c7ffd2d84b1e09665872f69755c75e7d89 ] - -Use the configuration in hardware to report hash types instead -of data maintained in software. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 260 ++++++++++++++++++++++++++++-------- - drivers/net/hns3/hns3_rss.h | 1 + - 2 files changed, 208 insertions(+), 53 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index a8ea5150ab..9addc00a67 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -70,6 +70,17 @@ enum hns3_tuple_field { - HNS3_RSS_FIELD_IPV6_FRAG_IP_S - }; - -+#define HNS3_RSS_TUPLE_IPV4_TCP_M GENMASK(3, 0) -+#define HNS3_RSS_TUPLE_IPV4_UDP_M GENMASK(11, 8) -+#define HNS3_RSS_TUPLE_IPV4_SCTP_M GENMASK(20, 16) -+#define HNS3_RSS_TUPLE_IPV4_NONF_M GENMASK(25, 24) -+#define HNS3_RSS_TUPLE_IPV4_FLAG_M GENMASK(27, 26) -+#define HNS3_RSS_TUPLE_IPV6_TCP_M GENMASK(35, 32) -+#define HNS3_RSS_TUPLE_IPV6_UDP_M GENMASK(43, 40) -+#define HNS3_RSS_TUPLE_IPV6_SCTP_M GENMASK(52, 48) -+#define HNS3_RSS_TUPLE_IPV6_NONF_M GENMASK(57, 56) -+#define HNS3_RSS_TUPLE_IPV6_FLAG_M GENMASK(59, 58) -+ - enum hns3_rss_tuple_type { - HNS3_RSS_IP_TUPLE, - HNS3_RSS_IP_L4_TUPLE, -@@ -79,200 +90,249 @@ static const struct { - uint64_t rss_types; - uint16_t tuple_type; - uint64_t rss_field; -+ uint64_t tuple_mask; - } hns3_set_tuple_table[] = { - /* IPV4-FRAG */ - { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV4_FLAG_M }, - { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_FLAG_M }, - { RTE_ETH_RSS_FRAG_IPV4, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_FLAG_M }, - - /* IPV4 */ - { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - { RTE_ETH_RSS_IPV4, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - - /* IPV4-OTHER */ - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_OTHER, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV4_NONF_M }, - - /* IPV4-TCP */ - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV4_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV4_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S), -+ HNS3_RSS_TUPLE_IPV4_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D), -+ HNS3_RSS_TUPLE_IPV4_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_TCP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D), -+ HNS3_RSS_TUPLE_IPV4_TCP_M }, - - /* IPV4-UDP */ - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV4_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV4_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S), -+ HNS3_RSS_TUPLE_IPV4_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D), -+ HNS3_RSS_TUPLE_IPV4_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_UDP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D), -+ HNS3_RSS_TUPLE_IPV4_UDP_M }, - - /* IPV4-SCTP */ - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV4_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV4_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S), -+ HNS3_RSS_TUPLE_IPV4_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D), -+ HNS3_RSS_TUPLE_IPV4_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV4_SCTP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) | -- BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER), -+ HNS3_RSS_TUPLE_IPV4_SCTP_M }, - - /* IPV6-FRAG */ - { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV6_FLAG_M }, - { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_FLAG_M }, - { RTE_ETH_RSS_FRAG_IPV6, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_FLAG_M }, - - /* IPV6 */ - { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - { RTE_ETH_RSS_IPV6, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - - /* IPV6-OTHER */ - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_OTHER, - HNS3_RSS_IP_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D), -+ HNS3_RSS_TUPLE_IPV6_NONF_M }, - - /* IPV6-TCP */ - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV6_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV6_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S), -+ HNS3_RSS_TUPLE_IPV6_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D), -+ HNS3_RSS_TUPLE_IPV6_TCP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_TCP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D), -+ HNS3_RSS_TUPLE_IPV6_TCP_M }, - - /* IPV6-UDP */ - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV6_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV6_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S), -+ HNS3_RSS_TUPLE_IPV6_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D), -+ HNS3_RSS_TUPLE_IPV6_UDP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_UDP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D), -+ HNS3_RSS_TUPLE_IPV6_UDP_M }, - - /* IPV6-SCTP */ - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S), -+ HNS3_RSS_TUPLE_IPV6_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D), -+ HNS3_RSS_TUPLE_IPV6_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S), -+ HNS3_RSS_TUPLE_IPV6_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY, - HNS3_RSS_IP_L4_TUPLE, -- BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D), -+ HNS3_RSS_TUPLE_IPV6_SCTP_M }, - { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, - HNS3_RSS_IP_L4_TUPLE, - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) | - BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) | -- BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER), -+ HNS3_RSS_TUPLE_IPV6_SCTP_M }, - }; - - /* -@@ -576,6 +636,96 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - return ret; - } - -+int -+hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields) -+{ -+ struct hns3_rss_input_tuple_cmd *req; -+ struct hns3_cmd_desc desc; -+ int ret; -+ -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, true); -+ req = (struct hns3_rss_input_tuple_cmd *)desc.data; -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret != 0) { -+ hns3_err(hw, "fail to get RSS hash tuple fields from firmware, ret = %d", -+ ret); -+ return ret; -+ } -+ -+ *tuple_fields = rte_le_to_cpu_64(req->tuple_field); -+ -+ return 0; -+} -+ -+static uint64_t -+hns3_rss_tuple_fields_to_rss_hf(struct hns3_hw *hw, uint64_t tuple_fields) -+{ -+ uint64_t ipv6_sctp_l4_mask = -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) | -+ BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S); -+ uint64_t rss_hf = 0; -+ uint64_t tuple_mask; -+ uint32_t i; -+ -+ for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) { -+ tuple_mask = hns3_set_tuple_table[i].tuple_mask; -+ /* -+ * The RSS hash of the packet type is disabled if its tuples is -+ * zero. -+ */ -+ if ((tuple_fields & tuple_mask) == 0) -+ continue; -+ -+ /* -+ * Some hardware don't support to use src/dst port fields to -+ * hash for IPV6-SCTP packet. -+ */ -+ if ((hns3_set_tuple_table[i].rss_types & -+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP) && -+ !hw->rss_info.ipv6_sctp_offload_supported) -+ tuple_mask &= ~ipv6_sctp_l4_mask; -+ -+ /* -+ * The framework (ethdev ops) or driver (rte flow API) ensure -+ * that both L3_SRC/DST_ONLY and L4_SRC/DST_ONLY cannot be set -+ * to driver at the same time. But if user doesn't specify -+ * anything L3/L4_SRC/DST_ONLY, driver enables all tuple fields. -+ * In this case, driver should not report L3/L4_SRC/DST_ONLY. -+ */ -+ if ((tuple_fields & tuple_mask) == tuple_mask) { -+ /* Skip the item enabled part tuples. */ -+ if ((tuple_fields & hns3_set_tuple_table[i].rss_field) != -+ tuple_mask) -+ continue; -+ -+ rss_hf |= hns3_set_tuple_table[i].rss_types; -+ continue; -+ } -+ -+ /* Match the item enabled part tuples.*/ -+ if ((tuple_fields & hns3_set_tuple_table[i].rss_field) == -+ hns3_set_tuple_table[i].rss_field) -+ rss_hf |= hns3_set_tuple_table[i].rss_types; -+ } -+ -+ return rss_hf; -+} -+ -+static int -+hns3_rss_hash_get_rss_hf(struct hns3_hw *hw, uint64_t *rss_hf) -+{ -+ uint64_t tuple_fields; -+ int ret; -+ -+ ret = hns3_get_rss_tuple_field(hw, &tuple_fields); -+ if (ret != 0) -+ return ret; -+ -+ *rss_hf = hns3_rss_tuple_fields_to_rss_hf(hw, tuple_fields); -+ -+ return 0; -+} -+ - /* - * Get rss key and rss_hf types set of RSS hash configuration. - * @param dev -@@ -591,28 +741,32 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint8_t hash_algo; - int ret; - - rte_spinlock_lock(&hw->lock); -- rss_conf->rss_hf = rss_cfg->conf.types; -+ ret = hns3_rss_hash_get_rss_hf(hw, &rss_conf->rss_hf); -+ if (ret != 0) { -+ hns3_err(hw, "obtain hash tuples failed, ret = %d", ret); -+ goto out; -+ } - - /* Get the RSS Key required by the user */ - if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) { - ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key, - hw->rss_key_size); - if (ret != 0) { -- rte_spinlock_unlock(&hw->lock); - hns3_err(hw, "obtain hash algo and key failed, ret = %d", - ret); -- return ret; -+ goto out; - } - rss_conf->rss_key_len = hw->rss_key_size; - } -+ -+out: - rte_spinlock_unlock(&hw->lock); - -- return 0; -+ return ret; - } - - /* -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index be0141f602..17473e70e2 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -110,6 +110,7 @@ int hns3_rss_reset_indir_table(struct hns3_hw *hw); - int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); -+int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields); - int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - const uint8_t *key, uint8_t key_len); - int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, --- -2.23.0 - diff --git a/0243-net-hns3-use-hardware-config-to-report-redirection-t.patch b/0243-net-hns3-use-hardware-config-to-report-redirection-t.patch deleted file mode 100644 index df64168..0000000 --- a/0243-net-hns3-use-hardware-config-to-report-redirection-t.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 866a61065fb67ec7e8cf34f5919ca93633d09cf7 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:07 +0800 -Subject: net/hns3: use hardware config to report redirection table - -[ upstream commit d1e37d1c6916858314a2c67e6317b0bb6c691b36 ] - -Currently, reta_query() API reports the redirection table from software. -This patch uses the one in hardware to report. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 1 + - drivers/net/hns3/hns3_rss.c | 65 ++++++++++++++++++++++++++++++++++--- - 2 files changed, 62 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 994dfc48cc..eb394c9dec 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -606,6 +606,7 @@ struct hns3_rss_input_tuple_cmd { - #define HNS3_RSS_CFG_TBL_SIZE_H 4 - #define HNS3_RSS_CFG_TBL_BW_H 2 - #define HNS3_RSS_CFG_TBL_BW_L 8 -+#define HNS3_RSS_CFG_TBL_BW_H_M 0x3 - - /* Configure the indirection table, opcode:0x0D07 */ - struct hns3_rss_indirection_table_cmd { -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 9addc00a67..7dc4e03d83 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -481,6 +481,54 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) - return 0; - } - -+static int -+hns3_get_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) -+{ -+ struct hns3_rss_indirection_table_cmd *req; -+ uint16_t max_bd_num, cfg_tbl_size; -+ uint8_t qid_msb_off, qid_msb_idx; -+ struct hns3_cmd_desc desc; -+ uint16_t q_id, q_hi, q_lo; -+ uint8_t rss_result_h; -+ uint16_t i, j; -+ int ret; -+ -+ req = (struct hns3_rss_indirection_table_cmd *)desc.data; -+ max_bd_num = DIV_ROUND_UP(size, HNS3_RSS_CFG_TBL_SIZE); -+ for (i = 0; i < max_bd_num; i++) { -+ hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INDIR_TABLE, -+ true); -+ req->start_table_index = -+ rte_cpu_to_le_16(i * HNS3_RSS_CFG_TBL_SIZE); -+ ret = hns3_cmd_send(hw, &desc, 1); -+ if (ret) { -+ hns3_err(hw, "fail to get RSS indirection table from firmware, ret = %d", -+ ret); -+ return ret; -+ } -+ -+ if (i == max_bd_num - 1 && (size % HNS3_RSS_CFG_TBL_SIZE) != 0) -+ cfg_tbl_size = size % HNS3_RSS_CFG_TBL_SIZE; -+ else -+ cfg_tbl_size = HNS3_RSS_CFG_TBL_SIZE; -+ -+ for (j = 0; j < cfg_tbl_size; j++) { -+ qid_msb_idx = -+ j * HNS3_RSS_CFG_TBL_BW_H / HNS3_BITS_PER_BYTE; -+ rss_result_h = req->rss_result_h[qid_msb_idx]; -+ qid_msb_off = -+ j * HNS3_RSS_CFG_TBL_BW_H % HNS3_BITS_PER_BYTE; -+ q_hi = (rss_result_h >> qid_msb_off) & -+ HNS3_RSS_CFG_TBL_BW_H_M; -+ q_lo = req->rss_result_l[j]; -+ q_id = (q_hi << HNS3_RSS_CFG_TBL_BW_L) | q_lo; -+ indir[i * HNS3_RSS_CFG_TBL_SIZE + j] = q_id; -+ } -+ } -+ -+ return 0; -+} -+ - int - hns3_rss_reset_indir_table(struct hns3_hw *hw) - { -@@ -842,10 +890,11 @@ hns3_dev_rss_reta_query(struct rte_eth_dev *dev, - uint16_t reta_size) - { - struct hns3_adapter *hns = dev->data->dev_private; -+ uint16_t reta_table[HNS3_RSS_IND_TBL_SIZE_MAX]; - struct hns3_hw *hw = &hns->hw; -- struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint16_t idx, shift; - uint16_t i; -+ int ret; - - if (reta_size != hw->rss_ind_tbl_size) { - hns3_err(hw, "The size of hash lookup table configured (%u)" -@@ -854,14 +903,22 @@ hns3_dev_rss_reta_query(struct rte_eth_dev *dev, - return -EINVAL; - } - rte_spinlock_lock(&hw->lock); -+ ret = hns3_get_rss_indir_table(hw, reta_table, reta_size); -+ if (ret != 0) { -+ rte_spinlock_unlock(&hw->lock); -+ hns3_err(hw, "query RSS redirection table failed, ret = %d.", -+ ret); -+ return ret; -+ } -+ rte_spinlock_unlock(&hw->lock); -+ - for (i = 0; i < reta_size; i++) { - idx = i / RTE_ETH_RETA_GROUP_SIZE; - shift = i % RTE_ETH_RETA_GROUP_SIZE; - if (reta_conf[idx].mask & (1ULL << shift)) -- reta_conf[idx].reta[shift] = -- rss_cfg->rss_indirection_tbl[i]; -+ reta_conf[idx].reta[shift] = reta_table[i]; - } -- rte_spinlock_unlock(&hw->lock); -+ - return 0; - } - --- -2.23.0 - diff --git a/0244-net-hns3-separate-setting-hash-algorithm.patch b/0244-net-hns3-separate-setting-hash-algorithm.patch deleted file mode 100644 index 0526a23..0000000 --- a/0244-net-hns3-separate-setting-hash-algorithm.patch +++ /dev/null @@ -1,186 +0,0 @@ -From e9ff78f09278b62f184277357777ebec6b7ac0f2 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:08 +0800 -Subject: net/hns3: separate setting hash algorithm - -[ upstream commit 1fcbef5ccb993b6028a3f8a68a7b01f9b8c67413 ] - -Currently, the setting of hash algorithm comes from the -default configuration in driver and the rte_flow interface. -The hash algorithm that is set to hardware in both ways is -saved in hw->rss_info.conf.func. - -But the 'func' in struct rte_flow_action_rss is usually used -in rte flow interface. And the ethdev ops interface may also -set hash algorithm in the future. It is not appropriate and -is a little messy for ethdev ops interface and driver default -configuration to use struct rte_flow_action_rss. So we have -to separate the RSS configuration from ethdev ops and rte -flow interface to make codes more easier to maintain. - -This patch separates hash algorithm by following ways: -1) 'hash_algo' in struct hns3_rss_conf is used for ethdev ops - interface or default configuration in driver. -2) Add a 'rte_flow_hash_algo' field in struct hns3_rss_conf - to save algorithm from rte flow interface. The main reasons - are as follows: - Currently, only the last rule is used to restore the rte - flow rule. If 'func' in RSS action is 'DEFAULT', it means - that this rule doesn't modify algorithm and driver need to - save current algorithm for restoring algorithm during reset - phase. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 60 +++++++++++++++++++++--------------- - drivers/net/hns3/hns3_rss.c | 14 +-------- - drivers/net/hns3/hns3_rss.h | 1 + - 3 files changed, 37 insertions(+), 38 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index e80ec0f053..0cb6914982 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1438,30 +1438,40 @@ hns3_disable_rss(struct hns3_hw *hw) - } - - static int --hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function *func, -+hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function func, - uint8_t *hash_algo) - { -- enum rte_eth_hash_function algo_func = *func; -- switch (algo_func) { -- case RTE_ETH_HASH_FUNCTION_DEFAULT: -- /* Keep *hash_algo as what it used to be */ -- algo_func = hw->rss_info.conf.func; -- break; -- case RTE_ETH_HASH_FUNCTION_TOEPLITZ: -- *hash_algo = HNS3_RSS_HASH_ALGO_TOEPLITZ; -- break; -- case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: -- *hash_algo = HNS3_RSS_HASH_ALGO_SIMPLE; -- break; -- case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: -- *hash_algo = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP; -- break; -- default: -- hns3_err(hw, "Invalid RSS algorithm configuration(%d)", -- algo_func); -- return -EINVAL; -+ const uint8_t hash_func_map[] = { -+ [RTE_ETH_HASH_FUNCTION_DEFAULT] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -+ [RTE_ETH_HASH_FUNCTION_TOEPLITZ] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -+ [RTE_ETH_HASH_FUNCTION_SIMPLE_XOR] = HNS3_RSS_HASH_ALGO_SIMPLE, -+ [RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ] = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP, -+ }; -+ uint8_t key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -+ int ret; -+ -+ if (func == RTE_ETH_HASH_FUNCTION_DEFAULT) { -+ ret = hns3_rss_get_algo_key(hw, hash_algo, key, -+ hw->rss_key_size); -+ if (ret != 0) { -+ hns3_err(hw, "fail to get current RSS hash algorithm, ret = %d", -+ ret); -+ return ret; -+ } -+ -+ /* -+ * During the phase of reset recovery, the hash algorithm -+ * obtained from hardware may not be the one used(saved in -+ * rte_flow_hash_algo) when this rule is delivered. -+ */ -+ if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) && -+ *hash_algo != hw->rss_info.rte_flow_hash_algo) -+ *hash_algo = hw->rss_info.rte_flow_hash_algo; -+ -+ return 0; - } -- *func = algo_func; -+ -+ *hash_algo = hash_func_map[func]; - - return 0; - } -@@ -1471,6 +1481,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - { - uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - bool use_default_key = false; -+ uint8_t hash_algo; - int ret; - - if (rss_config->key == NULL || rss_config->key_len != hw->rss_key_size) { -@@ -1480,18 +1491,17 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - use_default_key = true; - } - -- ret = hns3_parse_rss_algorithm(hw, &rss_config->func, -- &hw->rss_info.hash_algo); -+ ret = hns3_parse_rss_algorithm(hw, rss_config->func, &hash_algo); - if (ret) - return ret; - -- ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -+ ret = hns3_rss_set_algo_key(hw, hash_algo, - use_default_key ? rss_key : rss_config->key, - hw->rss_key_size); - if (ret) - return ret; - -- hw->rss_info.conf.func = rss_config->func; -+ hw->rss_info.rte_flow_hash_algo = hash_algo; - - ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_config->types); - if (ret) -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 7dc4e03d83..dcd42b554a 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -1022,7 +1022,7 @@ hns3_rss_set_default_args(struct hns3_hw *hw) - uint16_t i; - - /* Default hash algorithm */ -- rss_cfg->conf.func = RTE_ETH_HASH_FUNCTION_TOEPLITZ; -+ rss_cfg->hash_algo = HNS3_RSS_HASH_ALGO_TOEPLITZ; - - memcpy(rss_cfg->key, hns3_hash_key, - RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); -@@ -1046,18 +1046,6 @@ hns3_config_rss(struct hns3_adapter *hns) - - enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode; - -- switch (hw->rss_info.conf.func) { -- case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: -- hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_SIMPLE; -- break; -- case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: -- hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP; -- break; -- default: -- hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_TOEPLITZ; -- break; -- } -- - ret = hns3_rss_set_algo_key(hw, rss_cfg->hash_algo, - hash_key, hw->rss_key_size); - if (ret) -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 17473e70e2..6e679b709b 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -42,6 +42,7 @@ struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ - struct rte_flow_action_rss conf; - uint8_t hash_algo; /* hash function type defined by hardware */ -+ uint8_t rte_flow_hash_algo; - uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ - uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; - uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ --- -2.23.0 - diff --git a/0245-net-hns3-separate-setting-hash-key.patch b/0245-net-hns3-separate-setting-hash-key.patch deleted file mode 100644 index 85b75f4..0000000 --- a/0245-net-hns3-separate-setting-hash-key.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 8ca08cd0671207b57d934b439d7b245966fbbfe8 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:09 +0800 -Subject: net/hns3: separate setting hash key - -[ upstream commit fe9cc8b88babd0911d91dc194b35c7c352e2bf7b ] - -The settings of hash key comes from the ethdev ops (like, dev_configure -and rss_hash_update) and rte_flow API. For the ethdev ops, driver has -to save it to rss_info::key in hns3_hw structure so as to it can be -restored when reset is triggered. While rte_flow API no need to use -this field to save, they has a global flow_rss_list to maintain all -rules which save hash key. And hash key can be restored by this rule -information during the reset phase. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index dcd42b554a..401e3adfdf 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -376,8 +376,7 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - return ret; - } - } -- /* Update the shadow RSS key with user specified */ -- memcpy(hw->rss_info.key, key, hw->rss_key_size); -+ - return 0; - } - -@@ -672,6 +671,8 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - key, hw->rss_key_size); - if (ret) - goto set_algo_key_fail; -+ /* Update the shadow RSS key with user specified */ -+ memcpy(hw->rss_info.key, key, hw->rss_key_size); - } - rte_spinlock_unlock(&hw->lock); - --- -2.23.0 - diff --git a/0246-net-hns3-separate-setting-redirection-table.patch b/0246-net-hns3-separate-setting-redirection-table.patch deleted file mode 100644 index 4e71a61..0000000 --- a/0246-net-hns3-separate-setting-redirection-table.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 5a9f2de85e9f9185165c7fe82247ef6125ef4115 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:10 +0800 -Subject: net/hns3: separate setting redirection table - -[ upstream commit a421cb93462932717f23c5d8342381726e547ba6 ] - -The settings of redirection table comes from the ethdev ops (like, -dev_configure and rss_hash_update) and rte_flow API. For the ethdev -ops, driver has to save it to rss_info::rss_indirection_tbl in hns3_hw -structure so as to it can be restored when reset is triggered. -While rte_flow API no need to use this field to save, they has a global -RSS flow list to maintain all rules which can be used to restore the -table during the reset phase. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 2 -- - drivers/net/hns3/hns3_rss.c | 21 +++++++++++++-------- - 2 files changed, 13 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 0cb6914982..875c0eec11 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1519,8 +1519,6 @@ hns3_update_indir_table(struct hns3_hw *hw, - uint32_t i; - - /* Fill in redirection table */ -- memcpy(indir_tbl, hw->rss_info.rss_indirection_tbl, -- sizeof(hw->rss_info.rss_indirection_tbl)); - for (i = 0, j = 0; i < hw->rss_ind_tbl_size; i++, j++) { - j %= num; - if (conf->queue[j] >= hw->alloc_rss_size) { -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 401e3adfdf..751033d98f 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -473,10 +473,6 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) - } - } - -- /* Update redirection table of hw */ -- memcpy(hw->rss_info.rss_indirection_tbl, indir, -- sizeof(uint16_t) * size); -- - return 0; - } - -@@ -542,8 +538,11 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw) - } - - ret = hns3_set_rss_indir_table(hw, lut, hw->rss_ind_tbl_size); -- if (ret) -- hns3_err(hw, "RSS uninit indir table failed: %d", ret); -+ if (ret != 0) -+ hns3_err(hw, "RSS uninit indir table failed, ret = %d.", ret); -+ else -+ memcpy(hw->rss_info.rss_indirection_tbl, lut, -+ sizeof(uint16_t) * hw->rss_ind_tbl_size); - rte_free(lut); - - return ret; -@@ -855,12 +854,12 @@ hns3_dev_rss_reta_update(struct rte_eth_dev *dev, - idx = i / RTE_ETH_RETA_GROUP_SIZE; - shift = i % RTE_ETH_RETA_GROUP_SIZE; - if (reta_conf[idx].reta[shift] >= hw->alloc_rss_size) { -- rte_spinlock_unlock(&hw->lock); - hns3_err(hw, "queue id(%u) set to redirection table " - "exceeds queue number(%u) allocated to a TC", - reta_conf[idx].reta[shift], - hw->alloc_rss_size); -- return -EINVAL; -+ ret = -EINVAL; -+ goto out; - } - - if (reta_conf[idx].mask & (1ULL << shift)) -@@ -869,7 +868,13 @@ hns3_dev_rss_reta_update(struct rte_eth_dev *dev, - - ret = hns3_set_rss_indir_table(hw, indirection_tbl, - hw->rss_ind_tbl_size); -+ if (ret != 0) -+ goto out; - -+ memcpy(rss_cfg->rss_indirection_tbl, indirection_tbl, -+ sizeof(uint16_t) * hw->rss_ind_tbl_size); -+ -+out: - rte_spinlock_unlock(&hw->lock); - return ret; - } --- -2.23.0 - diff --git a/0247-net-hns3-separate-setting-RSS-types.patch b/0247-net-hns3-separate-setting-RSS-types.patch deleted file mode 100644 index 457d326..0000000 --- a/0247-net-hns3-separate-setting-RSS-types.patch +++ /dev/null @@ -1,131 +0,0 @@ -From b99379a51ab920cbd8d4ee51122efff2f1af57db Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:11 +0800 -Subject: net/hns3: separate setting RSS types - -[ upstream commit 791e56935e488b8154a83daaf3952e1901ed7552 ] - -The settings of RSS types comes from the ethdev ops (like, dev_configure -and rss_hash_update) and rte_flow API. For the ethdev ops, driver has to -save it so as to it can be restored when reset is triggered. -While rte_flow API no need to maintain this field, it can be restored by -the saved rule. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 3 ++- - drivers/net/hns3/hns3_rss.c | 22 ++++++++++++++-------- - drivers/net/hns3/hns3_rss.h | 1 + - 3 files changed, 17 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 875c0eec11..9e51891bd9 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1433,6 +1433,7 @@ hns3_disable_rss(struct hns3_hw *hw) - ret = hns3_set_rss_tuple_by_rss_hf(hw, 0); - if (ret) - return ret; -+ hw->rss_info.rss_hf = 0; - - return 0; - } -@@ -1580,7 +1581,7 @@ hns3_config_rss_filter(struct hns3_hw *hw, - /* Filter the unsupported flow types */ - flow_types = conf->conf.types ? - rss_flow_conf.types & HNS3_ETH_RSS_SUPPORT : -- hw->rss_info.conf.types; -+ hw->rss_info.rss_hf; - if (flow_types != rss_flow_conf.types) - hns3_warn(hw, "modified RSS types based on hardware support," - " requested:0x%" PRIx64 " configured:0x%" PRIx64, -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 751033d98f..f51d70a8e5 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -628,9 +628,6 @@ hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) - return ret; - } - -- /* Update supported flow types when set tuple success */ -- hw->rss_info.conf.types = rss_hf; -- - return 0; - } - -@@ -648,7 +645,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - struct rte_eth_rss_conf *rss_conf) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- uint64_t rss_hf_bk = hw->rss_info.conf.types; -+ uint64_t rss_hf_bk = hw->rss_info.rss_hf; - uint8_t key_len = rss_conf->rss_key_len; - uint64_t rss_hf = rss_conf->rss_hf; - uint8_t *key = rss_conf->rss_key; -@@ -673,6 +670,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - /* Update the shadow RSS key with user specified */ - memcpy(hw->rss_info.key, key, hw->rss_key_size); - } -+ hw->rss_info.rss_hf = rss_hf; - rte_spinlock_unlock(&hw->lock); - - return 0; -@@ -1030,6 +1028,7 @@ hns3_rss_set_default_args(struct hns3_hw *hw) - /* Default hash algorithm */ - rss_cfg->hash_algo = HNS3_RSS_HASH_ALGO_TOEPLITZ; - -+ hw->rss_info.rss_hf = 0; - memcpy(rss_cfg->key, hns3_hash_key, - RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); - -@@ -1067,15 +1066,22 @@ hns3_config_rss(struct hns3_adapter *hns) - return ret; - - /* -- * When muli-queue RSS mode flag is not set or unsupported tuples are -+ * When multi-queue RSS mode flag is not set or unsupported tuples are - * set, disable all tuples. - */ -- rss_hf = hw->rss_info.conf.types; -+ rss_hf = hw->rss_info.rss_hf; - if (!((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) || - !(rss_hf & HNS3_ETH_RSS_SUPPORT)) - rss_hf = 0; - -- return hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); -+ if (ret != 0) { -+ hns3_err(hw, "set RSS tuples failed, ret = %d.", ret); -+ return ret; -+ } -+ hw->rss_info.rss_hf = rss_hf; -+ -+ return 0; - } - - /* -@@ -1093,5 +1099,5 @@ hns3_rss_uninit(struct hns3_adapter *hns) - return; - - /* Disable RSS */ -- hw->rss_info.conf.types = 0; -+ hw->rss_info.rss_hf = 0; - } -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 6e679b709b..21b90789d0 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -41,6 +41,7 @@ - struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ - struct rte_flow_action_rss conf; -+ uint64_t rss_hf; - uint8_t hash_algo; /* hash function type defined by hardware */ - uint8_t rte_flow_hash_algo; - uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ --- -2.23.0 - diff --git a/0248-net-hns3-separate-setting-and-clearing-RSS-rule.patch b/0248-net-hns3-separate-setting-and-clearing-RSS-rule.patch deleted file mode 100644 index 85d77c6..0000000 --- a/0248-net-hns3-separate-setting-and-clearing-RSS-rule.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 0667045e83f2ed2769e1e71947ce6530108739ed Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:12 +0800 -Subject: net/hns3: separate setting and clearing RSS rule - -[ upstream commit 1c3aeb2be4b8ef8b18846883ebbb9320f62cf097 ] - -Separate the setting and clearing of RSS rule. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 46 +++++++++++++++++------------------- - 1 file changed, 22 insertions(+), 24 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 9e51891bd9..80dda63afe 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1535,8 +1535,22 @@ hns3_update_indir_table(struct hns3_hw *hw, - } - - static int --hns3_config_rss_filter(struct hns3_hw *hw, -- const struct hns3_rss_conf *conf, bool add) -+hns3_reset_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) -+{ -+ int ret; -+ -+ if (!conf->valid) -+ return 0; -+ -+ ret = hns3_disable_rss(hw); -+ if (ret) -+ hns3_err(hw, "RSS disable failed(%d)", ret); -+ -+ return ret; -+} -+ -+static int -+hns3_config_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) - { - uint64_t flow_types; - uint16_t num; -@@ -1553,19 +1567,6 @@ hns3_config_rss_filter(struct hns3_hw *hw, - .queue = conf->conf.queue, - }; - -- if (!add) { -- if (!conf->valid) -- return 0; -- -- ret = hns3_disable_rss(hw); -- if (ret) { -- hns3_err(hw, "RSS disable failed(%d)", ret); -- return ret; -- } -- -- return 0; -- } -- - /* Set rx queues to use */ - num = RTE_MIN(hw->data->nb_rx_queues, rss_flow_conf.queue_num); - if (rss_flow_conf.queue_num > num) -@@ -1606,8 +1607,7 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); - while (rss_filter_ptr) { - TAILQ_REMOVE(&hw->flow_rss_list, rss_filter_ptr, entries); -- ret = hns3_config_rss_filter(hw, &rss_filter_ptr->filter_info, -- false); -+ ret = hns3_reset_rss_filter(hw, &rss_filter_ptr->filter_info); - if (ret) - rss_rule_fail_cnt++; - else -@@ -1636,7 +1636,7 @@ hns3_restore_rss_filter(struct hns3_hw *hw) - if (!filter->filter_info.valid) - continue; - -- ret = hns3_config_rss_filter(hw, &filter->filter_info, true); -+ ret = hns3_config_rss_filter(hw, &filter->filter_info); - if (ret != 0) { - hns3_err(hw, "restore RSS filter failed, ret=%d", ret); - goto out; -@@ -1680,8 +1680,7 @@ hns3_rss_action_is_dup(struct hns3_hw *hw, - } - - static int --hns3_flow_parse_rss(struct rte_eth_dev *dev, -- const struct hns3_rss_conf *conf, bool add) -+hns3_flow_parse_rss(struct rte_eth_dev *dev, const struct hns3_rss_conf *conf) - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -@@ -1691,7 +1690,7 @@ hns3_flow_parse_rss(struct rte_eth_dev *dev, - return -EINVAL; - } - -- return hns3_config_rss_filter(hw, conf, add); -+ return hns3_config_rss_filter(hw, conf); - } - - static int -@@ -1778,7 +1777,7 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - } - } - -- ret = hns3_flow_parse_rss(dev, new_conf, true); -+ ret = hns3_flow_parse_rss(dev, new_conf); - if (ret != 0) { - rte_free(rss_filter_ptr); - return ret; -@@ -1961,8 +1960,7 @@ hns3_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, - break; - case RTE_ETH_FILTER_HASH: - rss_filter_ptr = (struct hns3_rss_conf_ele *)flow->rule; -- ret = hns3_config_rss_filter(hw, &rss_filter_ptr->filter_info, -- false); -+ ret = hns3_reset_rss_filter(hw, &rss_filter_ptr->filter_info); - if (ret) - return rte_flow_error_set(error, EIO, - RTE_FLOW_ERROR_TYPE_HANDLE, --- -2.23.0 - diff --git a/0249-net-hns3-use-new-RSS-rule-to-configure-hardware.patch b/0249-net-hns3-use-new-RSS-rule-to-configure-hardware.patch deleted file mode 100644 index 82de7a0..0000000 --- a/0249-net-hns3-use-new-RSS-rule-to-configure-hardware.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 08730d02d9f5cb532ea3953c2ae1920aaa123358 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:13 +0800 -Subject: net/hns3: use new RSS rule to configure hardware - -[ upstream commit 218a119a08e01f203f92b46334b6b2f03ff9765d ] - -Remove redundant assignment and directly use new RSS rule to configure -hardware. Additionally, considering that the new rule configuration may -need to be modified, the 'const' of input parameter about it is removed. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 52 ++++++++++++++---------------------- - 1 file changed, 20 insertions(+), 32 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 80dda63afe..3ac5279538 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1482,6 +1482,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - { - uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - bool use_default_key = false; -+ uint64_t flow_types; - uint8_t hash_algo; - int ret; - -@@ -1501,10 +1502,18 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - hw->rss_key_size); - if (ret) - return ret; -- - hw->rss_info.rte_flow_hash_algo = hash_algo; - -- ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_config->types); -+ /* Filter the unsupported flow types */ -+ flow_types = rss_config->types ? -+ rss_config->types & HNS3_ETH_RSS_SUPPORT : -+ hw->rss_info.rss_hf; -+ if (flow_types != rss_config->types) -+ hns3_warn(hw, "modified RSS types based on hardware support," -+ " requested:0x%" PRIx64 " configured:0x%" PRIx64, -+ rss_config->types, flow_types); -+ -+ ret = hns3_set_rss_tuple_by_rss_hf(hw, flow_types); - if (ret) - hns3_err(hw, "Update RSS tuples by rss hf failed %d", ret); - -@@ -1550,48 +1559,27 @@ hns3_reset_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) - } - - static int --hns3_config_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) -+hns3_config_rss_filter(struct hns3_hw *hw, struct hns3_rss_conf *conf) - { -- uint64_t flow_types; -+ struct rte_flow_action_rss *rss_act; - uint16_t num; - int ret; - -- struct rte_flow_action_rss rss_flow_conf = { -- .func = conf->conf.func, -- .level = conf->conf.level, -- .types = conf->conf.types, -- .key_len = conf->conf.key_len, -- .queue_num = conf->conf.queue_num, -- .key = conf->conf.key_len ? -- (void *)(uintptr_t)conf->conf.key : NULL, -- .queue = conf->conf.queue, -- }; -- -+ rss_act = &conf->conf; - /* Set rx queues to use */ -- num = RTE_MIN(hw->data->nb_rx_queues, rss_flow_conf.queue_num); -- if (rss_flow_conf.queue_num > num) -+ num = RTE_MIN(hw->data->nb_rx_queues, rss_act->queue_num); -+ if (rss_act->queue_num > num) - hns3_warn(hw, "Config queue numbers %u are beyond the scope of truncated", -- rss_flow_conf.queue_num); -+ rss_act->queue_num); - hns3_info(hw, "Max of contiguous %u PF queues are configured", num); - if (num) { -- ret = hns3_update_indir_table(hw, &rss_flow_conf, num); -+ ret = hns3_update_indir_table(hw, rss_act, num); - if (ret) - return ret; - } - -- /* Filter the unsupported flow types */ -- flow_types = conf->conf.types ? -- rss_flow_conf.types & HNS3_ETH_RSS_SUPPORT : -- hw->rss_info.rss_hf; -- if (flow_types != rss_flow_conf.types) -- hns3_warn(hw, "modified RSS types based on hardware support," -- " requested:0x%" PRIx64 " configured:0x%" PRIx64, -- rss_flow_conf.types, flow_types); -- /* Update the useful flow types */ -- rss_flow_conf.types = flow_types; -- - /* Set hash algorithm and flow types by the user's config */ -- return hns3_hw_rss_hash_set(hw, &rss_flow_conf); -+ return hns3_hw_rss_hash_set(hw, rss_act); - } - - static int -@@ -1680,7 +1668,7 @@ hns3_rss_action_is_dup(struct hns3_hw *hw, - } - - static int --hns3_flow_parse_rss(struct rte_eth_dev *dev, const struct hns3_rss_conf *conf) -+hns3_flow_parse_rss(struct rte_eth_dev *dev, struct hns3_rss_conf *conf) - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; --- -2.23.0 - diff --git a/0250-net-hns3-save-hash-algo-to-RSS-filter-list-node.patch b/0250-net-hns3-save-hash-algo-to-RSS-filter-list-node.patch deleted file mode 100644 index 77d24d8..0000000 --- a/0250-net-hns3-save-hash-algo-to-RSS-filter-list-node.patch +++ /dev/null @@ -1,96 +0,0 @@ -From e439b6f69b496ab010cff1b87f7a8cd83e258faf Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:14 +0800 -Subject: net/hns3: save hash algo to RSS filter list node - -[ upstream commit 9d34b8a181bf022fe3a3a3ae8511f3d921fc5c67 ] - -Save hash algo from rte flow RSS rule to RSS filter list node -instead of struct hns3_rss_conf. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 19 ++++++++++--------- - 1 file changed, 10 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index 3ac5279538..f073adebb6 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1439,7 +1439,7 @@ hns3_disable_rss(struct hns3_hw *hw) - } - - static int --hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function func, -+hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_rss_conf *rss_conf, - uint8_t *hash_algo) - { - const uint8_t hash_func_map[] = { -@@ -1451,7 +1451,7 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function func, - uint8_t key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - int ret; - -- if (func == RTE_ETH_HASH_FUNCTION_DEFAULT) { -+ if (rss_conf->conf.func == RTE_ETH_HASH_FUNCTION_DEFAULT) { - ret = hns3_rss_get_algo_key(hw, hash_algo, key, - hw->rss_key_size); - if (ret != 0) { -@@ -1466,20 +1466,21 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, enum rte_eth_hash_function func, - * rte_flow_hash_algo) when this rule is delivered. - */ - if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) && -- *hash_algo != hw->rss_info.rte_flow_hash_algo) -- *hash_algo = hw->rss_info.rte_flow_hash_algo; -+ *hash_algo != rss_conf->rte_flow_hash_algo) -+ *hash_algo = rss_conf->rte_flow_hash_algo; - - return 0; - } - -- *hash_algo = hash_func_map[func]; -+ *hash_algo = hash_func_map[rss_conf->conf.func]; - - return 0; - } - - static int --hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) -+hns3_hw_rss_hash_set(struct hns3_hw *hw, struct hns3_rss_conf *conf) - { -+ struct rte_flow_action_rss *rss_config = &conf->conf; - uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - bool use_default_key = false; - uint64_t flow_types; -@@ -1493,7 +1494,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - use_default_key = true; - } - -- ret = hns3_parse_rss_algorithm(hw, rss_config->func, &hash_algo); -+ ret = hns3_parse_rss_algorithm(hw, conf, &hash_algo); - if (ret) - return ret; - -@@ -1502,7 +1503,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct rte_flow_action_rss *rss_config) - hw->rss_key_size); - if (ret) - return ret; -- hw->rss_info.rte_flow_hash_algo = hash_algo; -+ conf->rte_flow_hash_algo = hash_algo; - - /* Filter the unsupported flow types */ - flow_types = rss_config->types ? -@@ -1579,7 +1580,7 @@ hns3_config_rss_filter(struct hns3_hw *hw, struct hns3_rss_conf *conf) - } - - /* Set hash algorithm and flow types by the user's config */ -- return hns3_hw_rss_hash_set(hw, rss_act); -+ return hns3_hw_rss_hash_set(hw, conf); - } - - static int --- -2.23.0 - diff --git a/0251-net-hns3-allow-adding-queue-buffer-size-hash-rule.patch b/0251-net-hns3-allow-adding-queue-buffer-size-hash-rule.patch deleted file mode 100644 index 31542c5..0000000 --- a/0251-net-hns3-allow-adding-queue-buffer-size-hash-rule.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 9810ccb9266f09bef6f0d8cfcab6ac0d203d8e23 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:15 +0800 -Subject: net/hns3: allow adding queue buffer size hash rule - -[ upstream commit 8095bf3e6d8ca7349e0a15f95407acd2063e7be0 ] - -The maximum queue number from RSS flow rule allowed depends on -the maximum queue number (512) under one TC instead of the one -of Rx/Tx queue so as to eliminate restrictions on user usage. - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rss.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 21b90789d0..cc0bb8431d 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -37,7 +37,8 @@ - #define HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP 2 - #define HNS3_RSS_HASH_ALGO_MASK 0xf - --#define HNS3_RSS_QUEUES_BUFFER_NUM 64 /* Same as the Max rx/tx queue num */ -+/* Same as the Max queue num under TC */ -+#define HNS3_RSS_QUEUES_BUFFER_NUM 512 - struct hns3_rss_conf { - /* RSS parameters :algorithm, flow_types, key, queue */ - struct rte_flow_action_rss conf; --- -2.23.0 - diff --git a/0252-net-hns3-separate-flow-RSS-config-from-RSS-conf.patch b/0252-net-hns3-separate-flow-RSS-config-from-RSS-conf.patch deleted file mode 100644 index 22b7646..0000000 --- a/0252-net-hns3-separate-flow-RSS-config-from-RSS-conf.patch +++ /dev/null @@ -1,169 +0,0 @@ -From bfbcc4acf9a007f4774e54febda3eac275b9c747 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:16 +0800 -Subject: net/hns3: separate flow RSS config from RSS conf - -[ upstream commit b93ad0cc7677881911e5fc3baa89e0a0bbd73c48 ] - -Some RSS fields in struct hns3_rss_conf (e.g. conf, queue, -valid) are only used when create RSS flow rule, which is -unnecessary for RSS configuration information from ethdev -ops. This patch removes these fields from hns3_rss_conf -and add a new struct hns3_flow_rss_conf as rte flow -RSS filter list node element. - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 23 ++++++++++++----------- - drivers/net/hns3/hns3_flow.h | 10 +++++++++- - drivers/net/hns3/hns3_rss.h | 5 ----- - 3 files changed, 21 insertions(+), 17 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index f073adebb6..b1189455ec 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1359,7 +1359,6 @@ hns3_parse_rss_filter(struct rte_eth_dev *dev, - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- struct hns3_rss_conf *rss_conf = &hw->rss_info; - const struct rte_flow_action_rss *rss; - const struct rte_flow_action *act; - uint32_t act_index = 0; -@@ -1374,7 +1373,7 @@ hns3_parse_rss_filter(struct rte_eth_dev *dev, - act, "no valid queues"); - } - -- if (rss->queue_num > RTE_DIM(rss_conf->queue)) -+ if (rss->queue_num > HNS3_RSS_QUEUES_BUFFER_NUM) - return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, - "queue number configured exceeds " -@@ -1439,7 +1438,7 @@ hns3_disable_rss(struct hns3_hw *hw) - } - - static int --hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_rss_conf *rss_conf, -+hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_flow_rss_conf *rss_conf, - uint8_t *hash_algo) - { - const uint8_t hash_func_map[] = { -@@ -1466,8 +1465,8 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_rss_conf *rss_conf, - * rte_flow_hash_algo) when this rule is delivered. - */ - if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) && -- *hash_algo != rss_conf->rte_flow_hash_algo) -- *hash_algo = rss_conf->rte_flow_hash_algo; -+ *hash_algo != rss_conf->hash_algo) -+ *hash_algo = rss_conf->hash_algo; - - return 0; - } -@@ -1478,7 +1477,7 @@ hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_rss_conf *rss_conf, - } - - static int --hns3_hw_rss_hash_set(struct hns3_hw *hw, struct hns3_rss_conf *conf) -+hns3_hw_rss_hash_set(struct hns3_hw *hw, struct hns3_flow_rss_conf *conf) - { - struct rte_flow_action_rss *rss_config = &conf->conf; - uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -@@ -1503,7 +1502,7 @@ hns3_hw_rss_hash_set(struct hns3_hw *hw, struct hns3_rss_conf *conf) - hw->rss_key_size); - if (ret) - return ret; -- conf->rte_flow_hash_algo = hash_algo; -+ conf->hash_algo = hash_algo; - - /* Filter the unsupported flow types */ - flow_types = rss_config->types ? -@@ -1545,7 +1544,8 @@ hns3_update_indir_table(struct hns3_hw *hw, - } - - static int --hns3_reset_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) -+hns3_reset_rss_filter(struct hns3_hw *hw, -+ const struct hns3_flow_rss_conf *conf) - { - int ret; - -@@ -1560,7 +1560,7 @@ hns3_reset_rss_filter(struct hns3_hw *hw, const struct hns3_rss_conf *conf) - } - - static int --hns3_config_rss_filter(struct hns3_hw *hw, struct hns3_rss_conf *conf) -+hns3_config_rss_filter(struct hns3_hw *hw, struct hns3_flow_rss_conf *conf) - { - struct rte_flow_action_rss *rss_act; - uint16_t num; -@@ -1669,7 +1669,8 @@ hns3_rss_action_is_dup(struct hns3_hw *hw, - } - - static int --hns3_flow_parse_rss(struct rte_eth_dev *dev, struct hns3_rss_conf *conf) -+hns3_flow_parse_rss(struct rte_eth_dev *dev, -+ struct hns3_flow_rss_conf *conf) - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -@@ -1739,8 +1740,8 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - const struct rte_flow_action_rss *rss_act; - struct hns3_rss_conf_ele *rss_filter_ptr; -+ struct hns3_flow_rss_conf *new_conf; - struct hns3_rss_conf_ele *filter_ptr; -- struct hns3_rss_conf *new_conf; - int ret; - - rss_filter_ptr = rte_zmalloc("hns3 rss filter", -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index e4b2fdf2e6..90126f2b6e 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -24,10 +24,18 @@ struct rte_flow { - uint32_t counter_id; - }; - -+struct hns3_flow_rss_conf { -+ struct rte_flow_action_rss conf; -+ uint8_t hash_algo; -+ uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ -+ uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ -+ bool valid; /* check if RSS rule is valid */ -+}; -+ - /* rss filter list structure */ - struct hns3_rss_conf_ele { - TAILQ_ENTRY(hns3_rss_conf_ele) entries; -- struct hns3_rss_conf filter_info; -+ struct hns3_flow_rss_conf filter_info; - }; - - /* hns3_flow memory list structure */ -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index cc0bb8431d..d19730c69c 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -40,15 +40,10 @@ - /* Same as the Max queue num under TC */ - #define HNS3_RSS_QUEUES_BUFFER_NUM 512 - struct hns3_rss_conf { -- /* RSS parameters :algorithm, flow_types, key, queue */ -- struct rte_flow_action_rss conf; - uint64_t rss_hf; - uint8_t hash_algo; /* hash function type defined by hardware */ -- uint8_t rte_flow_hash_algo; - uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ - uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; -- uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ -- bool valid; /* check if RSS rule is valid */ - /* - * For IPv6 SCTP packets type, check whether the NIC hardware support - * RSS hash using the src/dst port as the input tuple. For Kunpeng920 --- -2.23.0 - diff --git a/0253-net-hns3-reimplement-hash-flow-function.patch b/0253-net-hns3-reimplement-hash-flow-function.patch deleted file mode 100644 index ea37f42..0000000 --- a/0253-net-hns3-reimplement-hash-flow-function.patch +++ /dev/null @@ -1,1697 +0,0 @@ -From d5ee6b81de99a8699a6d4adb620ecc88103eb6e2 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:17 +0800 -Subject: net/hns3: reimplement hash flow function - -[ upstream commit e3069658da9ffb6f83a0d972ff2776c405eb6a8f ] - -Currently, hns3 driver supports setting multiple rte flow RSS rule, -but only the last is valid. This implementation is different from -the mainstream usage of rte flow hash in the community. Please see -the discussion threads [1] and [2]. - -This patch sets RSS hash feature completely based on the request of -the flow rule so that multiple hash rules can take effect at the same -time. Please notice that: -1. For hns3, 'func' has only one hardware. 'key' and 'queue' have only - one entry in hardware. -2. the overlapping part of the old rule will be overridden if the - configuration items of a new rule overlap with those of an old rule. - -The hns3_flow_validate() verifies and parses RSS or Fdir rules from -user, and saves them to a local variable at the same time. The local -variable is directly used to create RSS or Fdir rules. In this way, -we save one parsing and saving process. - -[1] https://lore.kernel.org/all/DM5PR12MB46648085D7CABF1AFF2D75CDD60A9@DM5PR12MB4664.namprd12.prod.outlook.com/ -[2] https://lore.kernel.org/all/f7de4db4-1b88-622f-4e03-acd3eee8a72c@oktetlabs.ru/ - -Fixes: c37ca66f2b27 ("net/hns3: support RSS") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.h | 9 - - drivers/net/hns3/hns3_flow.c | 966 +++++++++++++++++++++++---------- - drivers/net/hns3/hns3_flow.h | 15 +- - drivers/net/hns3/hns3_rss.c | 144 ++--- - drivers/net/hns3/hns3_rss.h | 117 +++- - 5 files changed, 855 insertions(+), 396 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 2457754b3d..9acc5a3d7e 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -996,15 +996,6 @@ static inline uint32_t hns3_read_reg(void *base, uint32_t reg) - #define hns3_read_dev(a, reg) \ - hns3_read_reg((a)->io_base, (reg)) - --#define NEXT_ITEM_OF_ACTION(act, actions, index) \ -- do { \ -- (act) = (actions) + (index); \ -- while ((act)->type == RTE_FLOW_ACTION_TYPE_VOID) { \ -- (index)++; \ -- (act) = (actions) + (index); \ -- } \ -- } while (0) -- - static inline uint64_t - hns3_atomic_test_bit(unsigned int nr, volatile uint64_t *addr) - { -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index b1189455ec..c38bd9dd8b 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -10,6 +10,125 @@ - #include "hns3_logs.h" - #include "hns3_flow.h" - -+#define NEXT_ITEM_OF_ACTION(act, actions, index) \ -+ do { \ -+ (act) = (actions) + (index); \ -+ while ((act)->type == RTE_FLOW_ACTION_TYPE_VOID) { \ -+ (index)++; \ -+ (act) = (actions) + (index); \ -+ } \ -+ } while (0) -+ -+#define NEXT_ITEM_OF_PATTERN(item, pattern, index) \ -+ do { \ -+ (item) = (pattern) + (index); \ -+ while ((item)->type == RTE_FLOW_ITEM_TYPE_VOID) { \ -+ (index)++; \ -+ (item) = (pattern) + (index); \ -+ } \ -+ } while (0) -+ -+#define HNS3_HASH_HDR_ETH RTE_BIT64(0) -+#define HNS3_HASH_HDR_IPV4 RTE_BIT64(1) -+#define HNS3_HASH_HDR_IPV6 RTE_BIT64(2) -+#define HNS3_HASH_HDR_TCP RTE_BIT64(3) -+#define HNS3_HASH_HDR_UDP RTE_BIT64(4) -+#define HNS3_HASH_HDR_SCTP RTE_BIT64(5) -+ -+#define HNS3_HASH_VOID_NEXT_ALLOW BIT_ULL(RTE_FLOW_ITEM_TYPE_ETH) -+ -+#define HNS3_HASH_ETH_NEXT_ALLOW (BIT_ULL(RTE_FLOW_ITEM_TYPE_IPV4) | \ -+ BIT_ULL(RTE_FLOW_ITEM_TYPE_IPV6)) -+ -+#define HNS3_HASH_IP_NEXT_ALLOW (BIT_ULL(RTE_FLOW_ITEM_TYPE_TCP) | \ -+ BIT_ULL(RTE_FLOW_ITEM_TYPE_UDP) | \ -+ BIT_ULL(RTE_FLOW_ITEM_TYPE_SCTP)) -+ -+static const uint64_t hash_pattern_next_allow_items[] = { -+ [RTE_FLOW_ITEM_TYPE_VOID] = HNS3_HASH_VOID_NEXT_ALLOW, -+ [RTE_FLOW_ITEM_TYPE_ETH] = HNS3_HASH_ETH_NEXT_ALLOW, -+ [RTE_FLOW_ITEM_TYPE_IPV4] = HNS3_HASH_IP_NEXT_ALLOW, -+ [RTE_FLOW_ITEM_TYPE_IPV6] = HNS3_HASH_IP_NEXT_ALLOW, -+}; -+ -+static const uint64_t hash_pattern_item_header[] = { -+ [RTE_FLOW_ITEM_TYPE_ETH] = HNS3_HASH_HDR_ETH, -+ [RTE_FLOW_ITEM_TYPE_IPV4] = HNS3_HASH_HDR_IPV4, -+ [RTE_FLOW_ITEM_TYPE_IPV6] = HNS3_HASH_HDR_IPV6, -+ [RTE_FLOW_ITEM_TYPE_TCP] = HNS3_HASH_HDR_TCP, -+ [RTE_FLOW_ITEM_TYPE_UDP] = HNS3_HASH_HDR_UDP, -+ [RTE_FLOW_ITEM_TYPE_SCTP] = HNS3_HASH_HDR_SCTP, -+}; -+ -+#define HNS3_HASH_IPV4 (HNS3_HASH_HDR_ETH | HNS3_HASH_HDR_IPV4) -+#define HNS3_HASH_IPV4_TCP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV4 | \ -+ HNS3_HASH_HDR_TCP) -+#define HNS3_HASH_IPV4_UDP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV4 | \ -+ HNS3_HASH_HDR_UDP) -+#define HNS3_HASH_IPV4_SCTP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV4 | \ -+ HNS3_HASH_HDR_SCTP) -+#define HNS3_HASH_IPV6 (HNS3_HASH_HDR_ETH | HNS3_HASH_HDR_IPV6) -+#define HNS3_HASH_IPV6_TCP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV6 | \ -+ HNS3_HASH_HDR_TCP) -+#define HNS3_HASH_IPV6_UDP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV6 | \ -+ HNS3_HASH_HDR_UDP) -+#define HNS3_HASH_IPV6_SCTP (HNS3_HASH_HDR_ETH | \ -+ HNS3_HASH_HDR_IPV6 | \ -+ HNS3_HASH_HDR_SCTP) -+ -+static const struct hns3_hash_map_info { -+ /* flow type specified, zero means action works for all flow types. */ -+ uint64_t pattern_type; -+ uint64_t rss_pctype; /* packet type with prefix RTE_ETH_RSS_xxx */ -+ uint64_t l3l4_types; /* Supported L3/L4 RSS types for this packet type */ -+ uint64_t hw_pctype; /* packet type in driver */ -+ uint64_t tuple_mask; /* full tuples of the hw_pctype */ -+} hash_map_table[] = { -+ /* IPV4 */ -+ { HNS3_HASH_IPV4, -+ RTE_ETH_RSS_IPV4, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV4_NONF, HNS3_RSS_TUPLE_IPV4_NONF_M }, -+ { HNS3_HASH_IPV4, -+ RTE_ETH_RSS_NONFRAG_IPV4_OTHER, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV4_NONF, HNS3_RSS_TUPLE_IPV4_NONF_M }, -+ { HNS3_HASH_IPV4, -+ RTE_ETH_RSS_FRAG_IPV4, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV4_FLAG, HNS3_RSS_TUPLE_IPV4_FLAG_M }, -+ { HNS3_HASH_IPV4_TCP, -+ RTE_ETH_RSS_NONFRAG_IPV4_TCP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV4_TCP, HNS3_RSS_TUPLE_IPV4_TCP_M }, -+ { HNS3_HASH_IPV4_UDP, -+ RTE_ETH_RSS_NONFRAG_IPV4_UDP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV4_UDP, HNS3_RSS_TUPLE_IPV4_UDP_M }, -+ { HNS3_HASH_IPV4_SCTP, -+ RTE_ETH_RSS_NONFRAG_IPV4_SCTP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV4_SCTP, HNS3_RSS_TUPLE_IPV4_SCTP_M }, -+ /* IPV6 */ -+ { HNS3_HASH_IPV6, -+ RTE_ETH_RSS_IPV6, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV6_NONF, HNS3_RSS_TUPLE_IPV6_NONF_M }, -+ { HNS3_HASH_IPV6, -+ RTE_ETH_RSS_NONFRAG_IPV6_OTHER, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV6_NONF, HNS3_RSS_TUPLE_IPV6_NONF_M }, -+ { HNS3_HASH_IPV6, -+ RTE_ETH_RSS_FRAG_IPV6, HNS3_RSS_SUPPORT_L3_SRC_DST, -+ HNS3_RSS_PCTYPE_IPV6_FLAG, HNS3_RSS_TUPLE_IPV6_FLAG_M }, -+ { HNS3_HASH_IPV6_TCP, -+ RTE_ETH_RSS_NONFRAG_IPV6_TCP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV6_TCP, HNS3_RSS_TUPLE_IPV6_TCP_M }, -+ { HNS3_HASH_IPV6_UDP, -+ RTE_ETH_RSS_NONFRAG_IPV6_UDP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV6_UDP, HNS3_RSS_TUPLE_IPV6_UDP_M }, -+ { HNS3_HASH_IPV6_SCTP, -+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP, HNS3_RSS_SUPPORT_L3L4, -+ HNS3_RSS_PCTYPE_IPV6_SCTP, HNS3_RSS_TUPLE_IPV6_SCTP_M }, -+}; -+ - static const uint8_t full_mask[VNI_OR_TNI_LEN] = { 0xFF, 0xFF, 0xFF }; - static const uint8_t zero_mask[VNI_OR_TNI_LEN] = { 0x00, 0x00, 0x00 }; - -@@ -79,7 +198,7 @@ net_addr_to_host(uint32_t *dst, const rte_be32_t *src, size_t len) - } - - /* -- * This function is used to find rss general action. -+ * This function is used to parse filter type. - * 1. As we know RSS is used to spread packets among several queues, the flow - * API provide the struct rte_flow_action_rss, user could config its field - * sush as: func/level/types/key/queue to control RSS function. -@@ -87,16 +206,18 @@ net_addr_to_host(uint32_t *dst, const rte_be32_t *src, size_t len) - * implemented by FDIR + RSS in hns3 hardware, user can create one FDIR rule - * which action is RSS queues region. - * 3. When action is RSS, we use the following rule to distinguish: -- * Case 1: pattern have ETH and action's queue_num > 0, indicate it is queue -- * region configuration. -+ * Case 1: pattern has ETH and all fields in RSS action except 'queues' are -+ * zero or default, indicate it is queue region configuration. - * Case other: an rss general action. - */ --static const struct rte_flow_action * --hns3_find_rss_general_action(const struct rte_flow_item pattern[], -- const struct rte_flow_action actions[]) -+static void -+hns3_parse_filter_type(const struct rte_flow_item pattern[], -+ const struct rte_flow_action actions[], -+ struct hns3_filter_info *filter_info) - { - const struct rte_flow_action_rss *rss_act; - const struct rte_flow_action *act = NULL; -+ bool only_has_queues = false; - bool have_eth = false; - - for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) { -@@ -105,8 +226,10 @@ hns3_find_rss_general_action(const struct rte_flow_item pattern[], - break; - } - } -- if (!act) -- return NULL; -+ if (act == NULL) { -+ filter_info->type = RTE_ETH_FILTER_FDIR; -+ return; -+ } - - for (; pattern->type != RTE_FLOW_ITEM_TYPE_END; pattern++) { - if (pattern->type == RTE_FLOW_ITEM_TYPE_ETH) { -@@ -116,18 +239,20 @@ hns3_find_rss_general_action(const struct rte_flow_item pattern[], - } - - rss_act = act->conf; -- if (have_eth && rss_act->queue_num) { -+ only_has_queues = (rss_act->queue_num > 0) && -+ (rss_act->func == RTE_ETH_HASH_FUNCTION_DEFAULT && -+ rss_act->types == 0 && rss_act->key_len == 0); -+ if (have_eth && only_has_queues) { - /* -- * Pattern have ETH and action's queue_num > 0, indicate this is -- * queue region configuration. -- * Because queue region is implemented by FDIR + RSS in hns3 -- * hardware, it needs to enter FDIR process, so here return NULL -- * to avoid enter RSS process. -+ * Pattern has ETH and all fields in RSS action except 'queues' -+ * are zero or default, which indicates this is queue region -+ * configuration. - */ -- return NULL; -+ filter_info->type = RTE_ETH_FILTER_FDIR; -+ return; - } - -- return act; -+ filter_info->type = RTE_ETH_FILTER_HASH; - } - - static inline struct hns3_flow_counter * -@@ -1246,7 +1371,6 @@ hns3_filterlist_flush(struct rte_eth_dev *dev) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_fdir_rule_ele *fdir_rule_ptr; -- struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_flow_mem *flow_node; - - fdir_rule_ptr = TAILQ_FIRST(&hw->flow_fdir_list); -@@ -1256,13 +1380,6 @@ hns3_filterlist_flush(struct rte_eth_dev *dev) - fdir_rule_ptr = TAILQ_FIRST(&hw->flow_fdir_list); - } - -- rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); -- while (rss_filter_ptr) { -- TAILQ_REMOVE(&hw->flow_rss_list, rss_filter_ptr, entries); -- rte_free(rss_filter_ptr); -- rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); -- } -- - flow_node = TAILQ_FIRST(&hw->flow_list); - while (flow_node) { - TAILQ_REMOVE(&hw->flow_list, flow_node, entries); -@@ -1328,196 +1445,422 @@ hns3_action_rss_same(const struct rte_flow_action_rss *comp, - } - - static bool --hns3_rss_input_tuple_supported(struct hns3_hw *hw, -- const struct rte_flow_action_rss *rss) -+hns3_valid_ipv6_sctp_rss_types(struct hns3_hw *hw, uint64_t types) - { - /* -- * For IP packet, it is not supported to use src/dst port fields to RSS -- * hash for the following packet types. -- * - IPV4 FRAG | IPV4 NONFRAG | IPV6 FRAG | IPV6 NONFRAG -- * Besides, for Kunpeng920, the NIC HW is not supported to use src/dst -- * port fields to RSS hash for IPV6 SCTP packet type. However, the -- * Kunpeng930 and future kunpeng series support to use src/dst port -- * fields to RSS hash for IPv6 SCTP packet type. -+ * Some hardware don't support to use src/dst port fields to hash -+ * for IPV6 SCTP packet type. - */ -- if (rss->types & (RTE_ETH_RSS_L4_DST_ONLY | RTE_ETH_RSS_L4_SRC_ONLY) && -- (rss->types & RTE_ETH_RSS_IP || -- (!hw->rss_info.ipv6_sctp_offload_supported && -- rss->types & RTE_ETH_RSS_NONFRAG_IPV6_SCTP))) -+ if (types & RTE_ETH_RSS_NONFRAG_IPV6_SCTP && -+ types & HNS3_RSS_SUPPORT_L4_SRC_DST && -+ !hw->rss_info.ipv6_sctp_offload_supported) - return false; - - return true; - } - --/* -- * This function is used to parse rss action validation. -- */ - static int --hns3_parse_rss_filter(struct rte_eth_dev *dev, -- const struct rte_flow_action *actions, -- struct rte_flow_error *error) -+hns3_flow_parse_hash_func(const struct rte_flow_action_rss *rss_act, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) - { -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -- const struct rte_flow_action_rss *rss; -- const struct rte_flow_action *act; -- uint32_t act_index = 0; -- uint16_t n; -+ if (rss_act->func >= RTE_ETH_HASH_FUNCTION_MAX) -+ return rte_flow_error_set(error, ENOTSUP, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, "RSS hash func are not supported"); - -- NEXT_ITEM_OF_ACTION(act, actions, act_index); -- rss = act->conf; -+ rss_conf->conf.func = rss_act->func; -+ return 0; -+} - -- if (rss == NULL) { -+static int -+hns3_flow_parse_hash_key(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *rss_act, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ if (rss_act->key_len != hw->rss_key_size) - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, -- act, "no valid queues"); -- } -+ NULL, "invalid RSS key length"); -+ -+ if (rss_act->key != NULL) -+ memcpy(rss_conf->key, rss_act->key, rss_act->key_len); -+ else -+ memcpy(rss_conf->key, hns3_hash_key, -+ RTE_MIN(sizeof(hns3_hash_key), rss_act->key_len)); -+ /* Need to record if user sets hash key. */ -+ rss_conf->conf.key = rss_act->key; -+ rss_conf->conf.key_len = rss_act->key_len; - -- if (rss->queue_num > HNS3_RSS_QUEUES_BUFFER_NUM) -+ return 0; -+} -+ -+static int -+hns3_flow_parse_queues(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *rss_act, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ uint16_t i; -+ -+ if (rss_act->queue_num > hw->rss_ind_tbl_size) - return rte_flow_error_set(error, ENOTSUP, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "queue number configured exceeds " -- "queue buffer size driver supported"); -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, -+ "queue number can not exceed RSS indirection table."); - -- for (n = 0; n < rss->queue_num; n++) { -- if (rss->queue[n] < hw->alloc_rss_size) -- continue; -- return rte_flow_error_set(error, EINVAL, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "queue id must be less than queue number allocated to a TC"); -+ if (rss_act->queue_num > HNS3_RSS_QUEUES_BUFFER_NUM) -+ return rte_flow_error_set(error, ENOTSUP, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, -+ "queue number configured exceeds queue buffer size driver supported"); -+ -+ for (i = 0; i < rss_act->queue_num; i++) { -+ if (rss_act->queue[i] >= hw->alloc_rss_size) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, -+ "queue id must be less than queue number allocated to a TC"); - } - -- if (!(rss->types & HNS3_ETH_RSS_SUPPORT) && rss->types) -+ memcpy(rss_conf->queue, rss_act->queue, -+ rss_act->queue_num * sizeof(rss_conf->queue[0])); -+ rss_conf->conf.queue = rss_conf->queue; -+ rss_conf->conf.queue_num = rss_act->queue_num; -+ -+ return 0; -+} -+ -+static int -+hns3_flow_get_hw_pctype(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *rss_act, -+ const struct hns3_hash_map_info *map, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ uint64_t l3l4_src_dst, l3l4_refine, left_types; -+ -+ if (rss_act->types == 0) { -+ /* Disable RSS hash of this packet type if types is zero. */ -+ rss_conf->hw_pctypes |= map->hw_pctype; -+ return 0; -+ } -+ -+ /* -+ * Can not have extra types except rss_pctype and l3l4_type in this map. -+ */ -+ left_types = ~map->rss_pctype & rss_act->types; -+ if (left_types & ~map->l3l4_types) - return rte_flow_error_set(error, EINVAL, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, -- act, -- "Flow types is unsupported by " -- "hns3's RSS"); -- if (rss->func >= RTE_ETH_HASH_FUNCTION_MAX) -- return rte_flow_error_set(error, ENOTSUP, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "RSS hash func are not supported"); -- if (rss->level) -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, NULL, -+ "cannot set extra types."); -+ -+ l3l4_src_dst = left_types; -+ /* L3/L4 SRC and DST shouldn't be specified at the same time. */ -+ l3l4_refine = rte_eth_rss_hf_refine(l3l4_src_dst); -+ if (l3l4_refine != l3l4_src_dst) - return rte_flow_error_set(error, ENOTSUP, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "a nonzero RSS encapsulation level is not supported"); -- if (rss->key_len && rss->key_len != hw->rss_key_size) -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, NULL, -+ "cannot specify L3_SRC/DST_ONLY or L4_SRC/DST_ONLY at the same."); -+ -+ if (!hns3_valid_ipv6_sctp_rss_types(hw, rss_act->types)) - return rte_flow_error_set(error, ENOTSUP, -- RTE_FLOW_ERROR_TYPE_ACTION_CONF, act, -- "invalid RSS key length"); -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, NULL, -+ "hardware doesn't support to use L4 src/dst to hash for IPV6-SCTP."); - -- if (!hns3_rss_input_tuple_supported(hw, rss)) -- return rte_flow_error_set(error, EINVAL, -+ rss_conf->hw_pctypes |= map->hw_pctype; -+ -+ return 0; -+} -+ -+static int -+hns3_flow_parse_rss_types_by_ptype(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *rss_act, -+ uint64_t pattern_type, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ const struct hns3_hash_map_info *map; -+ bool matched = false; -+ uint16_t i; -+ int ret; -+ -+ for (i = 0; i < RTE_DIM(hash_map_table); i++) { -+ map = &hash_map_table[i]; -+ if (map->pattern_type != pattern_type) { -+ /* -+ * If the target pattern type is already matched with -+ * the one before this pattern in the hash map table, -+ * no need to continue walk. -+ */ -+ if (matched) -+ break; -+ continue; -+ } -+ matched = true; -+ -+ /* -+ * If pattern type is matched and the 'types' is zero, all packet flow -+ * types related to this pattern type disable RSS hash. -+ * Otherwise, RSS types must match the pattern type and cannot have no -+ * extra or unsupported types. -+ */ -+ if (rss_act->types != 0 && !(map->rss_pctype & rss_act->types)) -+ continue; -+ -+ ret = hns3_flow_get_hw_pctype(hw, rss_act, map, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ } -+ -+ if (rss_conf->hw_pctypes != 0) -+ return 0; -+ -+ if (matched) -+ return rte_flow_error_set(error, ENOTSUP, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, -- &rss->types, -- "input RSS types are not supported"); -+ NULL, "RSS types are unsupported"); - -- act_index++; -+ return rte_flow_error_set(error, ENOTSUP, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, "Pattern specified is unsupported"); -+} - -- /* Check if the next not void action is END */ -- NEXT_ITEM_OF_ACTION(act, actions, act_index); -- if (act->type != RTE_FLOW_ACTION_TYPE_END) -- return rte_flow_error_set(error, EINVAL, -- RTE_FLOW_ERROR_TYPE_ACTION, -- act, "Not supported action."); -+static uint64_t -+hns3_flow_get_all_hw_pctypes(uint64_t types) -+{ -+ uint64_t hw_pctypes = 0; -+ uint16_t i; - -- return 0; -+ for (i = 0; i < RTE_DIM(hash_map_table); i++) { -+ if (types & hash_map_table[i].rss_pctype) -+ hw_pctypes |= hash_map_table[i].hw_pctype; -+ } -+ -+ return hw_pctypes; - } - - static int --hns3_disable_rss(struct hns3_hw *hw) -+hns3_flow_parse_rss_types(struct hns3_hw *hw, -+ const struct rte_flow_action_rss *rss_act, -+ uint64_t pattern_type, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ rss_conf->conf.types = rss_act->types; -+ -+ /* no pattern specified to set global RSS types. */ -+ if (pattern_type == 0) { -+ if (rss_act->types & ~HNS3_ETH_RSS_SUPPORT) -+ hns3_warn(hw, "some types in the requested RSS types (0x%" PRIx64 ") aren't supported, they are ignored.", -+ rss_act->types); -+ rss_conf->hw_pctypes = -+ hns3_flow_get_all_hw_pctypes(rss_act->types); -+ return 0; -+ } -+ -+ return hns3_flow_parse_rss_types_by_ptype(hw, rss_act, pattern_type, -+ rss_conf, error); -+} -+ -+static int -+hns3_flow_parse_hash_global_conf(struct rte_eth_dev *dev, -+ const struct rte_flow_action_rss *rss_act, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) - { -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - int ret; - -- ret = hns3_set_rss_tuple_by_rss_hf(hw, 0); -- if (ret) -+ ret = hns3_flow_parse_hash_func(rss_act, rss_conf, error); -+ if (ret != 0) - return ret; -- hw->rss_info.rss_hf = 0; - -- return 0; -+ if (rss_act->queue_num > 0) { -+ ret = hns3_flow_parse_queues(hw, rss_act, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ } -+ -+ if (rss_act->key_len > 0) { -+ ret = hns3_flow_parse_hash_key(hw, rss_act, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ } -+ -+ return hns3_flow_parse_rss_types(hw, rss_act, rss_conf->pattern_type, -+ rss_conf, error); - } - - static int --hns3_parse_rss_algorithm(struct hns3_hw *hw, struct hns3_flow_rss_conf *rss_conf, -- uint8_t *hash_algo) --{ -- const uint8_t hash_func_map[] = { -- [RTE_ETH_HASH_FUNCTION_DEFAULT] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -- [RTE_ETH_HASH_FUNCTION_TOEPLITZ] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -- [RTE_ETH_HASH_FUNCTION_SIMPLE_XOR] = HNS3_RSS_HASH_ALGO_SIMPLE, -- [RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ] = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP, -- }; -- uint8_t key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -- int ret; -+hns3_flow_parse_pattern_type(const struct rte_flow_item pattern[], -+ uint64_t *ptype, struct rte_flow_error *error) -+{ -+ enum rte_flow_item_type pre_type = RTE_FLOW_ITEM_TYPE_VOID; -+ const char *message = "Pattern specified isn't supported"; -+ uint64_t item_hdr, pattern_hdrs = 0; -+ enum rte_flow_item_type cur_type; - -- if (rss_conf->conf.func == RTE_ETH_HASH_FUNCTION_DEFAULT) { -- ret = hns3_rss_get_algo_key(hw, hash_algo, key, -- hw->rss_key_size); -- if (ret != 0) { -- hns3_err(hw, "fail to get current RSS hash algorithm, ret = %d", -- ret); -- return ret; -+ for (; pattern->type != RTE_FLOW_ITEM_TYPE_END; pattern++) { -+ if (pattern->type == RTE_FLOW_ITEM_TYPE_VOID) -+ continue; -+ if (pattern->mask || pattern->spec || pattern->last) { -+ message = "Header info shouldn't be specified"; -+ goto unsup; - } - -- /* -- * During the phase of reset recovery, the hash algorithm -- * obtained from hardware may not be the one used(saved in -- * rte_flow_hash_algo) when this rule is delivered. -- */ -- if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED) && -- *hash_algo != rss_conf->hash_algo) -- *hash_algo = rss_conf->hash_algo; -+ /* Check the sub-item allowed by the previous item . */ -+ if (pre_type >= RTE_DIM(hash_pattern_next_allow_items) || -+ !(hash_pattern_next_allow_items[pre_type] & -+ BIT_ULL(pattern->type))) -+ goto unsup; -+ -+ cur_type = pattern->type; -+ /* Unsupported for current type being greater than array size. */ -+ if (cur_type >= RTE_DIM(hash_pattern_item_header)) -+ goto unsup; -+ -+ /* The value is zero, which means unsupported current header. */ -+ item_hdr = hash_pattern_item_header[cur_type]; -+ if (item_hdr == 0) -+ goto unsup; -+ -+ /* Have duplicate pattern header. */ -+ if (item_hdr & pattern_hdrs) -+ goto unsup; -+ pre_type = cur_type; -+ pattern_hdrs |= item_hdr; -+ } - -+ if (pattern_hdrs != 0) { -+ *ptype = pattern_hdrs; - return 0; - } - -- *hash_algo = hash_func_map[rss_conf->conf.func]; -+unsup: -+ return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, -+ pattern, message); -+} -+ -+static int -+hns3_flow_parse_pattern_act(struct rte_eth_dev *dev, -+ const struct rte_flow_item pattern[], -+ const struct rte_flow_action_rss *rss_act, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ ret = hns3_flow_parse_hash_func(rss_act, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ -+ if (rss_act->key_len > 0) { -+ ret = hns3_flow_parse_hash_key(hw, rss_act, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ } -+ -+ if (rss_act->queue_num > 0) { -+ ret = hns3_flow_parse_queues(hw, rss_act, rss_conf, error); -+ if (ret != 0) -+ return ret; -+ } -+ -+ ret = hns3_flow_parse_pattern_type(pattern, &rss_conf->pattern_type, -+ error); -+ if (ret != 0) -+ return ret; -+ -+ ret = hns3_flow_parse_rss_types(hw, rss_act, rss_conf->pattern_type, -+ rss_conf, error); -+ if (ret != 0) -+ return ret; -+ -+ if (rss_act->func != RTE_ETH_HASH_FUNCTION_DEFAULT || -+ rss_act->key_len > 0 || rss_act->queue_num > 0) -+ hns3_warn(hw, "hash func, key and queues are global config, which work for all flow types. " -+ "Recommend: don't set them together with pattern."); - - return 0; - } - -+static bool -+hns3_rss_action_is_dup(struct hns3_hw *hw, -+ const struct hns3_flow_rss_conf *conf) -+{ -+ struct hns3_rss_conf_ele *filter; -+ -+ TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { -+ if (conf->pattern_type != filter->filter_info.pattern_type) -+ continue; -+ -+ if (hns3_action_rss_same(&filter->filter_info.conf, &conf->conf)) -+ return true; -+ } -+ -+ return false; -+} -+ -+/* -+ * This function is used to parse rss action validation. -+ */ - static int --hns3_hw_rss_hash_set(struct hns3_hw *hw, struct hns3_flow_rss_conf *conf) -+hns3_parse_rss_filter(struct rte_eth_dev *dev, -+ const struct rte_flow_item pattern[], -+ const struct rte_flow_action *actions, -+ struct hns3_flow_rss_conf *rss_conf, -+ struct rte_flow_error *error) - { -- struct rte_flow_action_rss *rss_config = &conf->conf; -- uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -- bool use_default_key = false; -- uint64_t flow_types; -- uint8_t hash_algo; -+ struct hns3_adapter *hns = dev->data->dev_private; -+ const struct rte_flow_action_rss *rss_act; -+ const struct rte_flow_action *act; -+ const struct rte_flow_item *pat; -+ struct hns3_hw *hw = &hns->hw; -+ uint32_t index = 0; - int ret; - -- if (rss_config->key == NULL || rss_config->key_len != hw->rss_key_size) { -- hns3_warn(hw, "Default RSS hash key to be set"); -- memcpy(rss_key, hns3_hash_key, -- RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); -- use_default_key = true; -+ NEXT_ITEM_OF_ACTION(act, actions, index); -+ if (actions[1].type != RTE_FLOW_ACTION_TYPE_END) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION, -+ &actions[1], -+ "Only support one action for RSS."); -+ -+ rss_act = (const struct rte_flow_action_rss *)act->conf; -+ if (rss_act == NULL) { -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ act, "lost RSS action configuration"); - } - -- ret = hns3_parse_rss_algorithm(hw, conf, &hash_algo); -- if (ret) -+ if (rss_act->level != 0) -+ return rte_flow_error_set(error, ENOTSUP, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ act, -+ "RSS level is not supported"); -+ -+ index = 0; -+ NEXT_ITEM_OF_PATTERN(pat, pattern, index); -+ if (pat[0].type == RTE_FLOW_ITEM_TYPE_END) { -+ rss_conf->pattern_type = 0; -+ ret = hns3_flow_parse_hash_global_conf(dev, rss_act, -+ rss_conf, error); -+ } else { -+ ret = hns3_flow_parse_pattern_act(dev, pat, rss_act, -+ rss_conf, error); -+ } -+ if (ret != 0) - return ret; - -- ret = hns3_rss_set_algo_key(hw, hash_algo, -- use_default_key ? rss_key : rss_config->key, -- hw->rss_key_size); -- if (ret) -- return ret; -- conf->hash_algo = hash_algo; -- -- /* Filter the unsupported flow types */ -- flow_types = rss_config->types ? -- rss_config->types & HNS3_ETH_RSS_SUPPORT : -- hw->rss_info.rss_hf; -- if (flow_types != rss_config->types) -- hns3_warn(hw, "modified RSS types based on hardware support," -- " requested:0x%" PRIx64 " configured:0x%" PRIx64, -- rss_config->types, flow_types); -- -- ret = hns3_set_rss_tuple_by_rss_hf(hw, flow_types); -- if (ret) -- hns3_err(hw, "Update RSS tuples by rss hf failed %d", ret); -+ if (hns3_rss_action_is_dup(hw, rss_conf)) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ act, "duplicate RSS rule"); - -- return ret; -+ return 0; - } - - static int -@@ -1543,44 +1886,106 @@ hns3_update_indir_table(struct hns3_hw *hw, - return hns3_set_rss_indir_table(hw, indir_tbl, hw->rss_ind_tbl_size); - } - -+static uint64_t -+hns3_flow_get_pctype_tuple_mask(uint64_t hw_pctype) -+{ -+ uint64_t tuple_mask = 0; -+ uint16_t i; -+ -+ for (i = 0; i < RTE_DIM(hash_map_table); i++) { -+ if (hw_pctype == hash_map_table[i].hw_pctype) { -+ tuple_mask = hash_map_table[i].tuple_mask; -+ break; -+ } -+ } -+ -+ return tuple_mask; -+} -+ - static int --hns3_reset_rss_filter(struct hns3_hw *hw, -- const struct hns3_flow_rss_conf *conf) -+hns3_flow_set_rss_ptype_tuple(struct hns3_hw *hw, -+ struct hns3_flow_rss_conf *rss_conf) - { -+ uint64_t old_tuple_fields, new_tuple_fields; -+ uint64_t hw_pctypes, tuples, tuple_mask = 0; -+ bool cfg_global_tuple; - int ret; - -- if (!conf->valid) -- return 0; -+ cfg_global_tuple = (rss_conf->pattern_type == 0); -+ if (!cfg_global_tuple) { -+ /* -+ * To ensure that different packets do not affect each other, -+ * we have to first read all tuple fields, and then only modify -+ * the tuples for the specified packet type. -+ */ -+ ret = hns3_get_rss_tuple_field(hw, &old_tuple_fields); -+ if (ret != 0) -+ return ret; - -- ret = hns3_disable_rss(hw); -- if (ret) -- hns3_err(hw, "RSS disable failed(%d)", ret); -+ new_tuple_fields = old_tuple_fields; -+ hw_pctypes = rss_conf->hw_pctypes; -+ while (hw_pctypes > 0) { -+ uint32_t idx = rte_bsf64(hw_pctypes); -+ uint64_t pctype = BIT_ULL(idx); -+ -+ tuple_mask = hns3_flow_get_pctype_tuple_mask(pctype); -+ tuples = hns3_rss_calc_tuple_filed(hw, -+ rss_conf->conf.types); -+ new_tuple_fields &= ~tuple_mask; -+ new_tuple_fields |= tuples; -+ hw_pctypes &= ~pctype; -+ } -+ } else { -+ new_tuple_fields = -+ hns3_rss_calc_tuple_filed(hw, rss_conf->conf.types); -+ } - -- return ret; -+ ret = hns3_set_rss_tuple_field(hw, new_tuple_fields); -+ if (ret != 0) -+ return ret; -+ -+ hns3_info(hw, "RSS tuple fields changed from 0x%" PRIx64 " to 0x%" PRIx64, -+ old_tuple_fields, new_tuple_fields); -+ -+ return 0; - } - - static int --hns3_config_rss_filter(struct hns3_hw *hw, struct hns3_flow_rss_conf *conf) -+hns3_config_rss_filter(struct hns3_hw *hw, -+ struct hns3_flow_rss_conf *rss_conf) - { - struct rte_flow_action_rss *rss_act; -- uint16_t num; - int ret; - -- rss_act = &conf->conf; -- /* Set rx queues to use */ -- num = RTE_MIN(hw->data->nb_rx_queues, rss_act->queue_num); -- if (rss_act->queue_num > num) -- hns3_warn(hw, "Config queue numbers %u are beyond the scope of truncated", -- rss_act->queue_num); -- hns3_info(hw, "Max of contiguous %u PF queues are configured", num); -- if (num) { -- ret = hns3_update_indir_table(hw, rss_act, num); -- if (ret) -+ rss_act = &rss_conf->conf; -+ if (rss_act->queue_num > 0) { -+ ret = hns3_update_indir_table(hw, rss_act, rss_act->queue_num); -+ if (ret) { -+ hns3_err(hw, "set queues action failed, ret = %d", ret); -+ return ret; -+ } -+ } -+ -+ if (rss_act->key_len > 0 || -+ rss_act->func != RTE_ETH_HASH_FUNCTION_DEFAULT) { -+ ret = hns3_update_rss_algo_key(hw, rss_act->func, rss_conf->key, -+ rss_act->key_len); -+ if (ret != 0) { -+ hns3_err(hw, "set func or hash key action failed, ret = %d", -+ ret); - return ret; -+ } -+ } -+ -+ if (rss_conf->hw_pctypes > 0) { -+ ret = hns3_flow_set_rss_ptype_tuple(hw, rss_conf); -+ if (ret != 0) { -+ hns3_err(hw, "set types action failed, ret = %d", ret); -+ return ret; -+ } - } - -- /* Set hash algorithm and flow types by the user's config */ -- return hns3_hw_rss_hash_set(hw, conf); -+ return 0; - } - - static int -@@ -1589,50 +1994,44 @@ hns3_clear_rss_filter(struct rte_eth_dev *dev) - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_hw *hw = &hns->hw; -- int rss_rule_succ_cnt = 0; /* count for success of clearing RSS rules */ -- int rss_rule_fail_cnt = 0; /* count for failure of clearing RSS rules */ -- int ret = 0; - - rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); - while (rss_filter_ptr) { - TAILQ_REMOVE(&hw->flow_rss_list, rss_filter_ptr, entries); -- ret = hns3_reset_rss_filter(hw, &rss_filter_ptr->filter_info); -- if (ret) -- rss_rule_fail_cnt++; -- else -- rss_rule_succ_cnt++; - rte_free(rss_filter_ptr); - rss_filter_ptr = TAILQ_FIRST(&hw->flow_rss_list); - } - -- if (rss_rule_fail_cnt) { -- hns3_err(hw, "fail to delete all RSS filters, success num = %d fail num = %d", -- rss_rule_succ_cnt, rss_rule_fail_cnt); -- ret = -EIO; -- } -- -- return ret; -+ return hns3_config_rss(hns); - } - - static int --hns3_restore_rss_filter(struct hns3_hw *hw) -+hns3_reconfig_all_rss_filter(struct hns3_hw *hw) - { - struct hns3_rss_conf_ele *filter; -- int ret = 0; -+ uint32_t rule_no = 0; -+ int ret; - -- pthread_mutex_lock(&hw->flows_lock); - TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { -- if (!filter->filter_info.valid) -- continue; -- - ret = hns3_config_rss_filter(hw, &filter->filter_info); - if (ret != 0) { -- hns3_err(hw, "restore RSS filter failed, ret=%d", ret); -- goto out; -+ hns3_err(hw, "config %uth RSS filter failed, ret = %d", -+ rule_no, ret); -+ return ret; - } -+ rule_no++; - } - --out: -+ return 0; -+} -+ -+static int -+hns3_restore_rss_filter(struct hns3_hw *hw) -+{ -+ int ret; -+ -+ pthread_mutex_lock(&hw->flows_lock); -+ ret = hns3_reconfig_all_rss_filter(hw); - pthread_mutex_unlock(&hw->flows_lock); - - return ret; -@@ -1651,38 +2050,6 @@ hns3_restore_filter(struct hns3_adapter *hns) - return hns3_restore_rss_filter(hw); - } - --static bool --hns3_rss_action_is_dup(struct hns3_hw *hw, -- const struct rte_flow_action_rss *act) --{ -- struct hns3_rss_conf_ele *filter; -- -- TAILQ_FOREACH(filter, &hw->flow_rss_list, entries) { -- if (!filter->filter_info.valid) -- continue; -- -- if (hns3_action_rss_same(&filter->filter_info.conf, act)) -- return true; -- } -- -- return false; --} -- --static int --hns3_flow_parse_rss(struct rte_eth_dev *dev, -- struct hns3_flow_rss_conf *conf) --{ -- struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -- -- if (hns3_rss_action_is_dup(hw, &conf->conf)) { -- hns3_err(hw, "duplicate RSS configuration"); -- return -EINVAL; -- } -- -- return hns3_config_rss_filter(hw, conf); --} -- - static int - hns3_flow_args_check(const struct rte_flow_attr *attr, - const struct rte_flow_item pattern[], -@@ -1716,32 +2083,55 @@ static int - hns3_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - const struct rte_flow_item pattern[], - const struct rte_flow_action actions[], -- struct rte_flow_error *error) -+ struct rte_flow_error *error, -+ struct hns3_filter_info *filter_info) - { -- struct hns3_fdir_rule fdir_rule; -+ union hns3_filter_conf *conf; - int ret; - - ret = hns3_flow_args_check(attr, pattern, actions, error); - if (ret) - return ret; - -- if (hns3_find_rss_general_action(pattern, actions)) -- return hns3_parse_rss_filter(dev, actions, error); -+ hns3_parse_filter_type(pattern, actions, filter_info); -+ conf = &filter_info->conf; -+ if (filter_info->type == RTE_ETH_FILTER_HASH) -+ return hns3_parse_rss_filter(dev, pattern, actions, -+ &conf->rss_conf, error); - -- memset(&fdir_rule, 0, sizeof(struct hns3_fdir_rule)); -- return hns3_parse_fdir_filter(dev, pattern, actions, &fdir_rule, error); -+ return hns3_parse_fdir_filter(dev, pattern, actions, -+ &conf->fdir_conf, error); -+} -+ -+static int -+hns3_flow_rebuild_all_rss_filter(struct hns3_adapter *hns) -+{ -+ struct hns3_hw *hw = &hns->hw; -+ int ret; -+ -+ ret = hns3_config_rss(hns); -+ if (ret != 0) { -+ hns3_err(hw, "restore original RSS configuration failed, ret = %d.", -+ ret); -+ return ret; -+ } -+ ret = hns3_reconfig_all_rss_filter(hw); -+ if (ret != 0) -+ hns3_err(hw, "rebuild all RSS filter failed, ret = %d.", ret); -+ -+ return ret; - } - - static int - hns3_flow_create_rss_rule(struct rte_eth_dev *dev, -- const struct rte_flow_action *act, -+ struct hns3_flow_rss_conf *rss_conf, - struct rte_flow *flow) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- const struct rte_flow_action_rss *rss_act; -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct hns3_rss_conf_ele *rss_filter_ptr; - struct hns3_flow_rss_conf *new_conf; -- struct hns3_rss_conf_ele *filter_ptr; -+ struct rte_flow_action_rss *rss_act; - int ret; - - rss_filter_ptr = rte_zmalloc("hns3 rss filter", -@@ -1751,35 +2141,28 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - return -ENOMEM; - } - -- rss_act = (const struct rte_flow_action_rss *)act->conf; - new_conf = &rss_filter_ptr->filter_info; -- memcpy(&new_conf->conf, rss_act, sizeof(*rss_act)); -- if (rss_act->queue_num > 0) { -- memcpy(new_conf->queue, rss_act->queue, -- rss_act->queue_num * sizeof(new_conf->queue[0])); -+ memcpy(new_conf, rss_conf, sizeof(*new_conf)); -+ rss_act = &new_conf->conf; -+ if (rss_act->queue_num > 0) - new_conf->conf.queue = new_conf->queue; -- } -- if (rss_act->key_len > 0) { -- if (rss_act->key != NULL) { -- memcpy(new_conf->key, rss_act->key, -- rss_act->key_len * sizeof(new_conf->key[0])); -- new_conf->conf.key = new_conf->key; -- } -- } -+ /* -+ * There are two ways to deliver hash key action: -+ * 1> 'key_len' is greater than zero and 'key' isn't NULL. -+ * 2> 'key_len' is greater than zero, but 'key' is NULL. -+ * For case 2, we need to keep 'key' of the new_conf is NULL so as to -+ * inherit the configuration from user in case of failing to verify -+ * duplicate rule later. -+ */ -+ if (rss_act->key_len > 0 && rss_act->key != NULL) -+ new_conf->conf.key = new_conf->key; - -- ret = hns3_flow_parse_rss(dev, new_conf); -+ ret = hns3_config_rss_filter(hw, new_conf); - if (ret != 0) { - rte_free(rss_filter_ptr); -+ (void)hns3_flow_rebuild_all_rss_filter(hns); - return ret; - } -- rss_filter_ptr->filter_info.valid = true; -- -- /* -- * When create a new RSS rule, the old rule will be overlaid and set -- * invalid. -- */ -- TAILQ_FOREACH(filter_ptr, &hw->flow_rss_list, entries) -- filter_ptr->filter_info.valid = false; - - TAILQ_INSERT_TAIL(&hw->flow_rss_list, rss_filter_ptr, entries); - flow->rule = rss_filter_ptr; -@@ -1790,31 +2173,24 @@ hns3_flow_create_rss_rule(struct rte_eth_dev *dev, - - static int - hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, -- const struct rte_flow_item pattern[], -- const struct rte_flow_action actions[], -+ struct hns3_fdir_rule *fdir_rule, - struct rte_flow_error *error, - struct rte_flow *flow) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct hns3_fdir_rule_ele *fdir_rule_ptr; -- struct hns3_fdir_rule fdir_rule; - bool indir; - int ret; - -- memset(&fdir_rule, 0, sizeof(struct hns3_fdir_rule)); -- ret = hns3_parse_fdir_filter(dev, pattern, actions, &fdir_rule, error); -- if (ret != 0) -- return ret; -- -- indir = !!(fdir_rule.flags & HNS3_RULE_FLAG_COUNTER_INDIR); -- if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) { -- ret = hns3_counter_new(dev, indir, fdir_rule.act_cnt.id, -+ indir = !!(fdir_rule->flags & HNS3_RULE_FLAG_COUNTER_INDIR); -+ if (fdir_rule->flags & HNS3_RULE_FLAG_COUNTER) { -+ ret = hns3_counter_new(dev, indir, fdir_rule->act_cnt.id, - error); - if (ret != 0) - return ret; - -- flow->counter_id = fdir_rule.act_cnt.id; -+ flow->counter_id = fdir_rule->act_cnt.id; - } - - fdir_rule_ptr = rte_zmalloc("hns3 fdir rule", -@@ -1830,11 +2206,11 @@ hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, - * rules to the hardware to simplify the rollback of rules in the - * hardware. - */ -- ret = hns3_fdir_filter_program(hns, &fdir_rule, false); -+ ret = hns3_fdir_filter_program(hns, fdir_rule, false); - if (ret != 0) - goto err_fdir_filter; - -- memcpy(&fdir_rule_ptr->fdir_conf, &fdir_rule, -+ memcpy(&fdir_rule_ptr->fdir_conf, fdir_rule, - sizeof(struct hns3_fdir_rule)); - TAILQ_INSERT_TAIL(&hw->flow_fdir_list, fdir_rule_ptr, entries); - flow->rule = fdir_rule_ptr; -@@ -1845,8 +2221,8 @@ hns3_flow_create_fdir_rule(struct rte_eth_dev *dev, - err_fdir_filter: - rte_free(fdir_rule_ptr); - err_malloc: -- if (fdir_rule.flags & HNS3_RULE_FLAG_COUNTER) -- hns3_counter_release(dev, fdir_rule.act_cnt.id); -+ if (fdir_rule->flags & HNS3_RULE_FLAG_COUNTER) -+ hns3_counter_release(dev, fdir_rule->act_cnt.id); - - return ret; - } -@@ -1864,13 +2240,15 @@ hns3_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - struct rte_flow_error *error) - { - struct hns3_adapter *hns = dev->data->dev_private; -- struct hns3_hw *hw = &hns->hw; -+ struct hns3_filter_info filter_info = {0}; - struct hns3_flow_mem *flow_node; -- const struct rte_flow_action *act; -+ struct hns3_hw *hw = &hns->hw; -+ union hns3_filter_conf *conf; - struct rte_flow *flow; - int ret; - -- ret = hns3_flow_validate(dev, attr, pattern, actions, error); -+ ret = hns3_flow_validate(dev, attr, pattern, actions, error, -+ &filter_info); - if (ret) - return NULL; - -@@ -1890,13 +2268,12 @@ hns3_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, - } - - flow_node->flow = flow; -+ conf = &filter_info.conf; - TAILQ_INSERT_TAIL(&hw->flow_list, flow_node, entries); -- -- act = hns3_find_rss_general_action(pattern, actions); -- if (act) -- ret = hns3_flow_create_rss_rule(dev, act, flow); -+ if (filter_info.type == RTE_ETH_FILTER_HASH) -+ ret = hns3_flow_create_rss_rule(dev, &conf->rss_conf, flow); - else -- ret = hns3_flow_create_fdir_rule(dev, pattern, actions, -+ ret = hns3_flow_create_fdir_rule(dev, &conf->fdir_conf, - error, flow); - if (ret == 0) - return flow; -@@ -1950,15 +2327,10 @@ hns3_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, - break; - case RTE_ETH_FILTER_HASH: - rss_filter_ptr = (struct hns3_rss_conf_ele *)flow->rule; -- ret = hns3_reset_rss_filter(hw, &rss_filter_ptr->filter_info); -- if (ret) -- return rte_flow_error_set(error, EIO, -- RTE_FLOW_ERROR_TYPE_HANDLE, -- flow, -- "Destroy RSS fail.Try again"); - TAILQ_REMOVE(&hw->flow_rss_list, rss_filter_ptr, entries); - rte_free(rss_filter_ptr); - rss_filter_ptr = NULL; -+ (void)hns3_flow_rebuild_all_rss_filter(hns); - break; - default: - return rte_flow_error_set(error, EINVAL, -@@ -2064,10 +2436,12 @@ hns3_flow_validate_wrap(struct rte_eth_dev *dev, - struct rte_flow_error *error) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_filter_info filter_info = {0}; - int ret; - - pthread_mutex_lock(&hw->flows_lock); -- ret = hns3_flow_validate(dev, attr, pattern, actions, error); -+ ret = hns3_flow_validate(dev, attr, pattern, actions, error, -+ &filter_info); - pthread_mutex_unlock(&hw->flows_lock); - - return ret; -diff --git a/drivers/net/hns3/hns3_flow.h b/drivers/net/hns3/hns3_flow.h -index 90126f2b6e..1b49673f11 100644 ---- a/drivers/net/hns3/hns3_flow.h -+++ b/drivers/net/hns3/hns3_flow.h -@@ -9,6 +9,7 @@ - #include - - #include "hns3_rss.h" -+#include "hns3_fdir.h" - - struct hns3_flow_counter { - LIST_ENTRY(hns3_flow_counter) next; /* Pointer to the next counter. */ -@@ -26,10 +27,10 @@ struct rte_flow { - - struct hns3_flow_rss_conf { - struct rte_flow_action_rss conf; -- uint8_t hash_algo; - uint8_t key[HNS3_RSS_KEY_SIZE_MAX]; /* Hash key */ - uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ -- bool valid; /* check if RSS rule is valid */ -+ uint64_t pattern_type; -+ uint64_t hw_pctypes; /* packet types in driver */ - }; - - /* rss filter list structure */ -@@ -53,6 +54,16 @@ struct rte_flow_action_handle { - uint32_t counter_id; - }; - -+union hns3_filter_conf { -+ struct hns3_fdir_rule fdir_conf; -+ struct hns3_flow_rss_conf rss_conf; -+}; -+ -+struct hns3_filter_info { -+ enum rte_filter_type type; -+ union hns3_filter_conf conf; -+}; -+ - TAILQ_HEAD(hns3_rss_filter_list, hns3_rss_conf_ele); - TAILQ_HEAD(hns3_flow_mem_list, hns3_flow_mem); - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index f51d70a8e5..dfa2901ae3 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -18,69 +18,13 @@ const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE] = { - 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA - }; - --enum hns3_tuple_field { -- /* IPV4_TCP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D = 0, -- HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S, -- HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D, -- HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S, -- -- /* IPV4_UDP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D = 8, -- HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S, -- HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D, -- HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S, -- -- /* IPV4_SCTP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D = 16, -- HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S, -- HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D, -- HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S, -- HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER, -- -- /* IPV4 ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D = 24, -- HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S, -- HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D, -- HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S, -- -- /* IPV6_TCP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D = 32, -- HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S, -- HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D, -- HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S, -- -- /* IPV6_UDP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D = 40, -- HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S, -- HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D, -- HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S, -- -- /* IPV6_SCTP ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D = 48, -- HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S, -- HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D, -- HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S, -- HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER, -- -- /* IPV6 ENABLE FIELD */ -- HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D = 56, -- HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S, -- HNS3_RSS_FIELD_IPV6_FRAG_IP_D, -- HNS3_RSS_FIELD_IPV6_FRAG_IP_S -+const uint8_t hns3_hash_func_map[] = { -+ [RTE_ETH_HASH_FUNCTION_DEFAULT] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -+ [RTE_ETH_HASH_FUNCTION_TOEPLITZ] = HNS3_RSS_HASH_ALGO_TOEPLITZ, -+ [RTE_ETH_HASH_FUNCTION_SIMPLE_XOR] = HNS3_RSS_HASH_ALGO_SIMPLE, -+ [RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ] = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP, - }; - --#define HNS3_RSS_TUPLE_IPV4_TCP_M GENMASK(3, 0) --#define HNS3_RSS_TUPLE_IPV4_UDP_M GENMASK(11, 8) --#define HNS3_RSS_TUPLE_IPV4_SCTP_M GENMASK(20, 16) --#define HNS3_RSS_TUPLE_IPV4_NONF_M GENMASK(25, 24) --#define HNS3_RSS_TUPLE_IPV4_FLAG_M GENMASK(27, 26) --#define HNS3_RSS_TUPLE_IPV6_TCP_M GENMASK(35, 32) --#define HNS3_RSS_TUPLE_IPV6_UDP_M GENMASK(43, 40) --#define HNS3_RSS_TUPLE_IPV6_SCTP_M GENMASK(52, 48) --#define HNS3_RSS_TUPLE_IPV6_NONF_M GENMASK(57, 56) --#define HNS3_RSS_TUPLE_IPV6_FLAG_M GENMASK(59, 58) -- - enum hns3_rss_tuple_type { - HNS3_RSS_IP_TUPLE, - HNS3_RSS_IP_L4_TUPLE, -@@ -574,7 +518,7 @@ hns3_rss_check_l3l4_types(struct hns3_hw *hw, uint64_t rss_hf) - hns3_warn(hw, "packet type isn't specified, L4_SRC/DST_ONLY is ignored."); - } - --static uint64_t -+uint64_t - hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) - { - uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY | -@@ -610,25 +554,35 @@ hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) - } - - int --hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) -+hns3_set_rss_tuple_field(struct hns3_hw *hw, uint64_t tuple_fields) - { - struct hns3_rss_input_tuple_cmd *req; - struct hns3_cmd_desc desc; -- uint64_t tuple_field; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); - req = (struct hns3_rss_input_tuple_cmd *)desc.data; -- -- tuple_field = hns3_rss_calc_tuple_filed(hw, rss_hf); -- req->tuple_field = rte_cpu_to_le_64(tuple_field); -+ req->tuple_field = rte_cpu_to_le_64(tuple_fields); - ret = hns3_cmd_send(hw, &desc, 1); -- if (ret) { -- hns3_err(hw, "Update RSS flow types tuples failed %d", ret); -- return ret; -- } -+ if (ret != 0) -+ hns3_err(hw, "set RSS hash tuple fields failed ret = %d", ret); - -- return 0; -+ return ret; -+} -+ -+int -+hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) -+{ -+ uint64_t tuple_fields; -+ int ret; -+ -+ tuple_fields = hns3_rss_calc_tuple_filed(hw, rss_hf); -+ ret = hns3_set_rss_tuple_field(hw, tuple_fields); -+ if (ret != 0) -+ hns3_err(hw, "Update RSS flow types tuples failed, ret = %d", -+ ret); -+ -+ return ret; - } - - /* -@@ -1000,6 +954,52 @@ hns3_set_rss_tc_mode(struct hns3_hw *hw) - return ret; - } - -+/* -+ * Note: the 'hash_algo' is defined by enum rte_eth_hash_function. -+ */ -+int -+hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_func, -+ uint8_t *key, uint8_t key_len) -+{ -+ uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; -+ bool modify_key, modify_algo; -+ uint8_t hash_algo; -+ int ret; -+ -+ modify_key = (key != NULL && key_len > 0); -+ modify_algo = hash_func != RTE_ETH_HASH_FUNCTION_DEFAULT; -+ if (!modify_key && !modify_algo) -+ return 0; -+ -+ if (modify_algo && hash_func >= RTE_DIM(hns3_hash_func_map)) { -+ hns3_err(hw, "hash func (%u) is unsupported.", hash_func); -+ return -ENOTSUP; -+ } -+ if (modify_key && key_len != hw->rss_key_size) { -+ hns3_err(hw, "hash key length (%u) is invalid.", key_len); -+ return -EINVAL; -+ } -+ -+ ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_key, hw->rss_key_size); -+ if (ret != 0) { -+ hns3_err(hw, "fail to get RSS hash algorithm and key, ret = %d", -+ ret); -+ return ret; -+ } -+ -+ if (modify_algo) -+ hash_algo = hns3_hash_func_map[hash_func]; -+ if (modify_key) -+ memcpy(rss_key, key, key_len); -+ -+ ret = hns3_rss_set_algo_key(hw, hash_algo, rss_key, hw->rss_key_size); -+ if (ret != 0) -+ hns3_err(hw, "fail to set RSS hash algorithm and key, ret = %d", -+ ret); -+ -+ return ret; -+} -+ - static void - hns3_rss_tuple_uninit(struct hns3_hw *hw) - { -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index d19730c69c..d672481a14 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -8,23 +8,102 @@ - #include - #include - --#define HNS3_ETH_RSS_SUPPORT ( \ -- RTE_ETH_RSS_IPV4 | \ -- RTE_ETH_RSS_FRAG_IPV4 | \ -- RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ -- RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ -- RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \ -- RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \ -- RTE_ETH_RSS_IPV6 | \ -- RTE_ETH_RSS_FRAG_IPV6 | \ -- RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ -- RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ -- RTE_ETH_RSS_NONFRAG_IPV6_SCTP | \ -- RTE_ETH_RSS_NONFRAG_IPV6_OTHER | \ -- RTE_ETH_RSS_L3_SRC_ONLY | \ -- RTE_ETH_RSS_L3_DST_ONLY | \ -- RTE_ETH_RSS_L4_SRC_ONLY | \ -- RTE_ETH_RSS_L4_DST_ONLY) -+#define HNS3_RSS_SUPPORT_L3_SRC_DST (RTE_ETH_RSS_L3_SRC_ONLY | \ -+ RTE_ETH_RSS_L3_DST_ONLY) -+#define HNS3_RSS_SUPPORT_L4_SRC_DST (RTE_ETH_RSS_L4_SRC_ONLY | \ -+ RTE_ETH_RSS_L4_DST_ONLY) -+#define HNS3_RSS_SUPPORT_L3L4 (HNS3_RSS_SUPPORT_L3_SRC_DST | \ -+ HNS3_RSS_SUPPORT_L4_SRC_DST) -+ -+#define HNS3_RSS_SUPPORT_FLOW_TYPE (RTE_ETH_RSS_IPV4 | \ -+ RTE_ETH_RSS_FRAG_IPV4 | \ -+ RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ -+ RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ -+ RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \ -+ RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \ -+ RTE_ETH_RSS_IPV6 | \ -+ RTE_ETH_RSS_FRAG_IPV6 | \ -+ RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ -+ RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ -+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP | \ -+ RTE_ETH_RSS_NONFRAG_IPV6_OTHER) -+ -+#define HNS3_ETH_RSS_SUPPORT (HNS3_RSS_SUPPORT_FLOW_TYPE | \ -+ HNS3_RSS_SUPPORT_L3L4) -+ -+enum hns3_tuple_field { -+ /* IPV4_TCP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D = 0, -+ HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S, -+ HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S, -+ -+ /* IPV4_UDP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D = 8, -+ HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S, -+ HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S, -+ -+ /* IPV4_SCTP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D = 16, -+ HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S, -+ HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S, -+ HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER, -+ -+ /* IPV4 ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D = 24, -+ HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S, -+ HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D, -+ HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S, -+ -+ /* IPV6_TCP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D = 32, -+ HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S, -+ HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S, -+ -+ /* IPV6_UDP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D = 40, -+ HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S, -+ HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S, -+ -+ /* IPV6_SCTP ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D = 48, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S, -+ HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER, -+ -+ /* IPV6 ENABLE FIELD */ -+ HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D = 56, -+ HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S, -+ HNS3_RSS_FIELD_IPV6_FRAG_IP_D, -+ HNS3_RSS_FIELD_IPV6_FRAG_IP_S -+}; -+ -+#define HNS3_RSS_PCTYPE_IPV4_TCP BIT_ULL(0) -+#define HNS3_RSS_PCTYPE_IPV4_UDP BIT_ULL(8) -+#define HNS3_RSS_PCTYPE_IPV4_SCTP BIT_ULL(16) -+#define HNS3_RSS_PCTYPE_IPV4_NONF BIT_ULL(24) -+#define HNS3_RSS_PCTYPE_IPV4_FLAG BIT_ULL(26) -+#define HNS3_RSS_PCTYPE_IPV6_TCP BIT_ULL(32) -+#define HNS3_RSS_PCTYPE_IPV6_UDP BIT_ULL(40) -+#define HNS3_RSS_PCTYPE_IPV6_SCTP BIT_ULL(48) -+#define HNS3_RSS_PCTYPE_IPV6_NONF BIT_ULL(56) -+#define HNS3_RSS_PCTYPE_IPV6_FLAG BIT_ULL(58) -+ -+#define HNS3_RSS_TUPLE_IPV4_TCP_M GENMASK(3, 0) -+#define HNS3_RSS_TUPLE_IPV4_UDP_M GENMASK(11, 8) -+#define HNS3_RSS_TUPLE_IPV4_SCTP_M GENMASK(20, 16) -+#define HNS3_RSS_TUPLE_IPV4_NONF_M GENMASK(25, 24) -+#define HNS3_RSS_TUPLE_IPV4_FLAG_M GENMASK(27, 26) -+#define HNS3_RSS_TUPLE_IPV6_TCP_M GENMASK(35, 32) -+#define HNS3_RSS_TUPLE_IPV6_UDP_M GENMASK(43, 40) -+#define HNS3_RSS_TUPLE_IPV6_SCTP_M GENMASK(52, 48) -+#define HNS3_RSS_TUPLE_IPV6_NONF_M GENMASK(57, 56) -+#define HNS3_RSS_TUPLE_IPV6_FLAG_M GENMASK(59, 58) - - #define HNS3_RSS_IND_TBL_SIZE 512 /* The size of hash lookup table */ - #define HNS3_RSS_IND_TBL_SIZE_MAX 2048 -@@ -108,10 +187,14 @@ int hns3_rss_reset_indir_table(struct hns3_hw *hw); - int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); -+int hns3_set_rss_tuple_field(struct hns3_hw *hw, uint64_t tuple_fields); - int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields); - int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - const uint8_t *key, uint8_t key_len); - int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, - uint8_t *key, uint8_t key_len); -+uint64_t hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf); -+int hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo, -+ uint8_t *key, uint8_t key_len); - - #endif /* HNS3_RSS_H */ --- -2.23.0 - diff --git a/0254-net-hns3-add-verification-of-RSS-types.patch b/0254-net-hns3-add-verification-of-RSS-types.patch deleted file mode 100644 index 302bf4a..0000000 --- a/0254-net-hns3-add-verification-of-RSS-types.patch +++ /dev/null @@ -1,199 +0,0 @@ -From 190de70e4c72d4abb356c8f8a24fec9ec17ce6c1 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 10 Mar 2023 17:35:18 +0800 -Subject: net/hns3: add verification of RSS types - -[ upstream commit eb3ef9e0d7eb54b47ab58d3d14f9f5fff3f4120b ] - -Add the verification of RSS types from ethdev ops and rte flow without -pattern attribute. The following cases are invalid: -1. types contains unsupported RSS type but hasn't type driver support. -2. types has L3 src/dst but hasn't supported packet type. -3. types has L4 src/dst but hasn't supported packet type and hasn't IP - packet type. - -Fixes: 13c3993240c8 ("net/hns3: add L3 and L4 RSS types") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 12 +++--- - drivers/net/hns3/hns3_rss.c | 74 +++++++++++++++++++++++++----------- - drivers/net/hns3/hns3_rss.h | 3 +- - 3 files changed, 60 insertions(+), 29 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index c38bd9dd8b..c1f4f5cb0b 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1652,9 +1652,10 @@ hns3_flow_parse_rss_types(struct hns3_hw *hw, - - /* no pattern specified to set global RSS types. */ - if (pattern_type == 0) { -- if (rss_act->types & ~HNS3_ETH_RSS_SUPPORT) -- hns3_warn(hw, "some types in the requested RSS types (0x%" PRIx64 ") aren't supported, they are ignored.", -- rss_act->types); -+ if (!hns3_check_rss_types_valid(hw, rss_act->types)) -+ return rte_flow_error_set(error, EINVAL, -+ RTE_FLOW_ERROR_TYPE_ACTION_CONF, -+ NULL, "RSS types is invalid."); - rss_conf->hw_pctypes = - hns3_flow_get_all_hw_pctypes(rss_act->types); - return 0; -@@ -1929,15 +1930,14 @@ hns3_flow_set_rss_ptype_tuple(struct hns3_hw *hw, - uint64_t pctype = BIT_ULL(idx); - - tuple_mask = hns3_flow_get_pctype_tuple_mask(pctype); -- tuples = hns3_rss_calc_tuple_filed(hw, -- rss_conf->conf.types); -+ tuples = hns3_rss_calc_tuple_filed(rss_conf->conf.types); - new_tuple_fields &= ~tuple_mask; - new_tuple_fields |= tuples; - hw_pctypes &= ~pctype; - } - } else { - new_tuple_fields = -- hns3_rss_calc_tuple_filed(hw, rss_conf->conf.types); -+ hns3_rss_calc_tuple_filed(rss_conf->conf.types); - } - - ret = hns3_set_rss_tuple_field(hw, new_tuple_fields); -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index dfa2901ae3..6126512bd7 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -492,34 +492,62 @@ hns3_rss_reset_indir_table(struct hns3_hw *hw) - return ret; - } - --static void --hns3_rss_check_l3l4_types(struct hns3_hw *hw, uint64_t rss_hf) -+bool -+hns3_check_rss_types_valid(struct hns3_hw *hw, uint64_t types) - { - uint64_t ip_mask = RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | - RTE_ETH_RSS_NONFRAG_IPV4_OTHER | - RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | - RTE_ETH_RSS_NONFRAG_IPV6_OTHER; -- uint64_t l4_mask = RTE_ETH_RSS_NONFRAG_IPV4_TCP | -- RTE_ETH_RSS_NONFRAG_IPV4_UDP | -- RTE_ETH_RSS_NONFRAG_IPV4_SCTP | -- RTE_ETH_RSS_NONFRAG_IPV6_TCP | -- RTE_ETH_RSS_NONFRAG_IPV6_UDP | -- RTE_ETH_RSS_NONFRAG_IPV6_SCTP; -- uint64_t l3_src_dst_mask = RTE_ETH_RSS_L3_SRC_ONLY | -- RTE_ETH_RSS_L3_DST_ONLY; -- uint64_t l4_src_dst_mask = RTE_ETH_RSS_L4_SRC_ONLY | -- RTE_ETH_RSS_L4_DST_ONLY; -- -- if (rss_hf & l3_src_dst_mask && -- !(rss_hf & ip_mask || rss_hf & l4_mask)) -- hns3_warn(hw, "packet type isn't specified, L3_SRC/DST_ONLY is ignored."); -- -- if (rss_hf & l4_src_dst_mask && !(rss_hf & l4_mask)) -- hns3_warn(hw, "packet type isn't specified, L4_SRC/DST_ONLY is ignored."); -+ uint64_t ip_l4_mask = RTE_ETH_RSS_NONFRAG_IPV4_TCP | -+ RTE_ETH_RSS_NONFRAG_IPV4_UDP | -+ RTE_ETH_RSS_NONFRAG_IPV4_SCTP | -+ RTE_ETH_RSS_NONFRAG_IPV6_TCP | -+ RTE_ETH_RSS_NONFRAG_IPV6_UDP | -+ RTE_ETH_RSS_NONFRAG_IPV6_SCTP; -+ bool has_l4_src_dst = !!(types & HNS3_RSS_SUPPORT_L4_SRC_DST); -+ bool has_ip_pkt = !!(types & ip_mask); -+ uint64_t final_types; -+ -+ if (types == 0) -+ return true; -+ -+ if ((types & HNS3_ETH_RSS_SUPPORT) == 0) { -+ hns3_err(hw, "specified types(0x%" PRIx64 ") are unsupported.", -+ types); -+ return false; -+ } -+ -+ if ((types & HNS3_RSS_SUPPORT_L3_SRC_DST) != 0 && -+ (types & HNS3_RSS_SUPPORT_FLOW_TYPE) == 0) { -+ hns3_err(hw, "IP or IP-TCP/UDP/SCTP packet type isn't specified, L3_SRC/DST_ONLY cannot be set."); -+ return false; -+ } -+ -+ if (has_l4_src_dst && (types & ip_l4_mask) == 0) { -+ if (!has_ip_pkt) { -+ hns3_err(hw, "IP-TCP/UDP/SCTP packet type isn't specified, L4_SRC/DST_ONLY cannot be set."); -+ return false; -+ } -+ /* -+ * For the case that the types has L4_SRC/DST_ONLY but hasn't -+ * IP-TCP/UDP/SCTP packet type, this types is considered valid -+ * if it also has IP packet type. -+ */ -+ hns3_warn(hw, "L4_SRC/DST_ONLY is ignored because of no including L4 packet."); -+ } -+ -+ if ((types & ~HNS3_ETH_RSS_SUPPORT) != 0) { -+ final_types = types & HNS3_ETH_RSS_SUPPORT; -+ hns3_warn(hw, "set RSS types based on hardware support, requested:0x%" PRIx64 " configured:0x%" PRIx64 "", -+ types, final_types); -+ } -+ -+ return true; - } - - uint64_t --hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) -+hns3_rss_calc_tuple_filed(uint64_t rss_hf) - { - uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY | - RTE_ETH_RSS_L3_DST_ONLY; -@@ -548,7 +576,6 @@ hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) - !has_l3_l4_only) - tuple |= hns3_set_tuple_table[i].rss_field; - } -- hns3_rss_check_l3l4_types(hw, rss_hf); - - return tuple; - } -@@ -576,7 +603,7 @@ hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) - uint64_t tuple_fields; - int ret; - -- tuple_fields = hns3_rss_calc_tuple_filed(hw, rss_hf); -+ tuple_fields = hns3_rss_calc_tuple_filed(rss_hf); - ret = hns3_set_rss_tuple_field(hw, tuple_fields); - if (ret != 0) - hns3_err(hw, "Update RSS flow types tuples failed, ret = %d", -@@ -611,6 +638,9 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - return -EINVAL; - } - -+ if (!hns3_check_rss_types_valid(hw, rss_hf)) -+ return -EINVAL; -+ - rte_spinlock_lock(&hw->lock); - ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); - if (ret) -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index d672481a14..415430a399 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -186,6 +186,7 @@ int hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, - int hns3_rss_reset_indir_table(struct hns3_hw *hw); - int hns3_config_rss(struct hns3_adapter *hns); - void hns3_rss_uninit(struct hns3_adapter *hns); -+bool hns3_check_rss_types_valid(struct hns3_hw *hw, uint64_t types); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_set_rss_tuple_field(struct hns3_hw *hw, uint64_t tuple_fields); - int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields); -@@ -193,7 +194,7 @@ int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - const uint8_t *key, uint8_t key_len); - int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, - uint8_t *key, uint8_t key_len); --uint64_t hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf); -+uint64_t hns3_rss_calc_tuple_filed(uint64_t rss_hf); - int hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - uint8_t *key, uint8_t key_len); - --- -2.23.0 - diff --git a/0255-test-mbuf-fix-mbuf-reset-test.patch b/0255-test-mbuf-fix-mbuf-reset-test.patch deleted file mode 100644 index b66b2a3..0000000 --- a/0255-test-mbuf-fix-mbuf-reset-test.patch +++ /dev/null @@ -1,35 +0,0 @@ -From b6f800b2897f8e2008d0897ceaa491a357eab1cf Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Jan 2023 10:48:51 +0800 -Subject: test/mbuf: fix mbuf reset test - -[ upstream commit bf47fb83a61a4bc6bf45e1ec6e3ddd239a856190 ] - -Retest "mbuf_autotest" will fail because the mbuf pool was -not freed after previous test successful done. -This patch fixes it. - -Fixes: efc6f9104c80 ("mbuf: fix reset on mbuf free") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Reviewed-by: David Marchand ---- - app/test/test_mbuf.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c -index f54d1d7c00..cd9f8fd8cf 100644 ---- a/app/test/test_mbuf.c -+++ b/app/test/test_mbuf.c -@@ -2769,6 +2769,7 @@ test_nb_segs_and_next_reset(void) - m2->nb_segs != 1 || m2->next != NULL) - GOTO_FAIL("nb_segs or next was not reset properly"); - -+ rte_mempool_free(pool); - return 0; - - fail: --- -2.23.0 - diff --git a/0256-examples-l3fwd-power-support-CPPC-cpufreq.patch b/0256-examples-l3fwd-power-support-CPPC-cpufreq.patch deleted file mode 100644 index 8100126..0000000 --- a/0256-examples-l3fwd-power-support-CPPC-cpufreq.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 9f45602b8df4c7a0eca4228ab94de824b1c5337b Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Jan 2023 10:58:52 +0800 -Subject: examples/l3fwd-power: support CPPC cpufreq - -[ upstream commit bc6fe48468767df2b6a31c9de06796164981cbaf ] - -Currently the l3fwd-power only supports ACPI cpufreq and Pstate -cpufreq, This patch adds CPPC cpufreq. - -Signed-off-by: Jie Hai -Acked-by: David Hunt -Acked-by: Dongdong Liu ---- - examples/l3fwd-power/main.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c -index 20e5b59af9..a2eb35d6e2 100644 ---- a/examples/l3fwd-power/main.c -+++ b/examples/l3fwd-power/main.c -@@ -2290,9 +2290,10 @@ init_power_library(void) - /* we're not supporting the VM channel mode */ - env = rte_power_get_env(); - if (env != PM_ENV_ACPI_CPUFREQ && -- env != PM_ENV_PSTATE_CPUFREQ) { -+ env != PM_ENV_PSTATE_CPUFREQ && -+ env != PM_ENV_CPPC_CPUFREQ) { - RTE_LOG(ERR, POWER, -- "Only ACPI and PSTATE mode are supported\n"); -+ "Only ACPI, PSTATE and CPPC mode are supported\n"); - return -1; - } - } -@@ -2456,12 +2457,14 @@ autodetect_mode(void) - /* - * Empty poll and telemetry modes have to be specifically requested to - * be enabled, but we can auto-detect between interrupt mode with or -- * without frequency scaling. Both ACPI and pstate can be used. -+ * without frequency scaling. Any of ACPI, pstate and CPPC can be used. - */ - if (rte_power_check_env_supported(PM_ENV_ACPI_CPUFREQ)) - return APP_MODE_LEGACY; - if (rte_power_check_env_supported(PM_ENV_PSTATE_CPUFREQ)) - return APP_MODE_LEGACY; -+ if (rte_power_check_env_supported(PM_ENV_CPPC_CPUFREQ)) -+ return APP_MODE_LEGACY; - - RTE_LOG(NOTICE, L3FWD_POWER, "Frequency scaling not supported, selecting interrupt-only mode\n"); - --- -2.23.0 - diff --git a/0257-hinic-free-mbuf-use-rte_pktmbuf_free_seg.patch b/0257-hinic-free-mbuf-use-rte_pktmbuf_free_seg.patch deleted file mode 100644 index 9a8d751..0000000 --- a/0257-hinic-free-mbuf-use-rte_pktmbuf_free_seg.patch +++ /dev/null @@ -1,107 +0,0 @@ -From b5c93dae2b73115c46f2e66dc87be61a200e006b Mon Sep 17 00:00:00 2001 -From: jiangheng12 -Date: Sat, 1 Apr 2023 21:56:20 +0800 -Subject: [PATCH] hinic: free tx mbuf use rte_pktmbuf_free_seg - ---- - drivers/net/hinic/hinic_pmd_tx.c | 27 ++++++++++++++++++--------- - drivers/net/hinic/hinic_pmd_tx.h | 9 +++++++++ - 2 files changed, 27 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hinic/hinic_pmd_tx.c b/drivers/net/hinic/hinic_pmd_tx.c -index f09b1a6..8eab94d 100644 ---- a/drivers/net/hinic/hinic_pmd_tx.c -+++ b/drivers/net/hinic/hinic_pmd_tx.c -@@ -30,13 +30,6 @@ - #define TX_MSS_DEFAULT 0x3E00 - #define TX_MSS_MIN 0x50 - --#define HINIC_NONTSO_PKT_MAX_SGE 17 /* non-tso max sge 17 */ --#define HINIC_NONTSO_SEG_NUM_INVALID(num) \ -- ((num) > HINIC_NONTSO_PKT_MAX_SGE) -- --#define HINIC_TSO_PKT_MAX_SGE 127 /* tso max sge 127 */ --#define HINIC_TSO_SEG_NUM_INVALID(num) ((num) > HINIC_TSO_PKT_MAX_SGE) -- - /* sizeof(struct hinic_sq_bufdesc) == 16, shift 4 */ - #define HINIC_BUF_DESC_SIZE(nr_descs) (SIZE_8BYTES(((u32)nr_descs) << 4)) - -@@ -640,6 +633,7 @@ static inline void hinic_xmit_mbuf_cleanup(struct hinic_txq *txq) - if (likely(mbuf->nb_segs == 1)) { - m = rte_pktmbuf_prefree_seg(mbuf); - tx_info->mbuf = NULL; -+ tx_info->nb_segs = 0; - - if (unlikely(m == NULL)) - continue; -@@ -653,8 +647,11 @@ static inline void hinic_xmit_mbuf_cleanup(struct hinic_txq *txq) - mbuf_free[nb_free++] = m; - } - } else { -- rte_pktmbuf_free(mbuf); -+ for (int j = 0; j < tx_info->nb_segs; j++) { -+ rte_pktmbuf_free_seg(tx_info->mbufs[j]); -+ } - tx_info->mbuf = NULL; -+ tx_info->nb_segs = 0; - } - } - -@@ -1191,6 +1188,13 @@ u16 hinic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, u16 nb_pkts) - tx_info->mbuf = mbuf_pkt; - tx_info->wqebb_cnt = wqe_wqebb_cnt; - -+ tx_info->nb_segs = mbuf_pkt->nb_segs; -+ struct rte_mbuf *tmp = mbuf_pkt; -+ for (int j = 0; j < mbuf_pkt->nb_segs; j++) { -+ tx_info->mbufs[j] = tmp; -+ tmp = tmp->next; -+ } -+ - /* 7. fill sq wqe header section */ - hinic_fill_sq_wqe_header(&sq_wqe->ctrl, queue_info, - sqe_info.sge_cnt, sqe_info.owner); -@@ -1231,7 +1235,12 @@ void hinic_free_all_tx_mbufs(struct hinic_txq *txq) - tx_info->cpy_mbuf = NULL; - } - -- rte_pktmbuf_free(tx_info->mbuf); -+ for (int j = 0; j < tx_info->nb_segs; j++) { -+ rte_pktmbuf_free_seg(tx_info->mbufs[j]); -+ tx_info->mbufs[j] = NULL; -+ } -+ tx_info->nb_segs = 0; -+ - hinic_update_sq_local_ci(nic_dev->hwdev, txq->q_id, - tx_info->wqebb_cnt); - -diff --git a/drivers/net/hinic/hinic_pmd_tx.h b/drivers/net/hinic/hinic_pmd_tx.h -index a3ec629..70159bd 100644 ---- a/drivers/net/hinic/hinic_pmd_tx.h -+++ b/drivers/net/hinic/hinic_pmd_tx.h -@@ -20,6 +20,13 @@ - RTE_MBUF_F_TX_OUTER_IP_CKSUM | \ - RTE_MBUF_F_TX_TCP_SEG) - -+#define HINIC_NONTSO_PKT_MAX_SGE 17 /* non-tso max sge 17 */ -+#define HINIC_NONTSO_SEG_NUM_INVALID(num) \ -+ ((num) > HINIC_NONTSO_PKT_MAX_SGE) -+ -+#define HINIC_TSO_PKT_MAX_SGE 127 /* tso max sge 127 */ -+#define HINIC_TSO_SEG_NUM_INVALID(num) ((num) > HINIC_TSO_PKT_MAX_SGE) -+ - enum sq_wqe_type { - SQ_NORMAL_WQE = 0, - }; -@@ -98,6 +105,8 @@ struct hinic_txq_stats { - - struct hinic_tx_info { - struct rte_mbuf *mbuf; -+ struct rte_mbuf *mbufs[HINIC_TSO_PKT_MAX_SGE]; -+ int nb_segs; - int wqebb_cnt; - struct rte_mbuf *cpy_mbuf; - }; --- -2.23.0 - diff --git a/0258-net-bonding-support-private-dump-operation.patch b/0258-net-bonding-support-private-dump-operation.patch deleted file mode 100644 index 88867d1..0000000 --- a/0258-net-bonding-support-private-dump-operation.patch +++ /dev/null @@ -1,150 +0,0 @@ -From fdbebc668c5df36d34a64ba627b6e373263c1fca Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Wed, 14 Dec 2022 06:13:23 +0000 -Subject: net/bonding: support private dump operation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 29e89fb1e30cf12937dec8a3f4f7ab86f0303d24 ] - -This patch implements eth_dev_priv_dump ops which could enhance the -debug capability. - -The dump output is similar to testpmd command -"show bonding config [port]". - -Signed-off-by: Chengwen Feng -Acked-by:Min Hu (Connor) -Acked-by: Huisong Li -Acked-by: Ferruh Yigit ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 105 ++++++++++++++++++++++++- - 1 file changed, 104 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index 29871cf8a3..cf7d275bf5 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -3297,6 +3297,108 @@ bond_ethdev_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) - rte_spinlock_unlock(&internals->lock); - } - -+static const char * -+bond_mode_name(uint8_t mode) -+{ -+ switch (mode) { -+ case BONDING_MODE_ROUND_ROBIN: -+ return "ROUND_ROBIN"; -+ case BONDING_MODE_ACTIVE_BACKUP: -+ return "ACTIVE_BACKUP"; -+ case BONDING_MODE_BALANCE: -+ return "BALANCE"; -+ case BONDING_MODE_BROADCAST: -+ return "BROADCAST"; -+ case BONDING_MODE_8023AD: -+ return "8023AD"; -+ case BONDING_MODE_TLB: -+ return "TLB"; -+ case BONDING_MODE_ALB: -+ return "ALB"; -+ default: -+ return "Unknown"; -+ } -+} -+ -+static int -+bond_ethdev_priv_dump(struct rte_eth_dev *dev, FILE *f) -+{ -+ struct bond_dev_private instant_priv; -+ const struct bond_dev_private *internals = &instant_priv; -+ int mode, i; -+ -+ /* Obtain a instance of dev_private to prevent data from being modified. */ -+ memcpy(&instant_priv, dev->data->dev_private, sizeof(struct bond_dev_private)); -+ mode = internals->mode; -+ -+ fprintf(f, " - Dev basic:\n"); -+ fprintf(f, "\tBonding mode: %s(%d)\n", bond_mode_name(mode), mode); -+ -+ if (mode == BONDING_MODE_BALANCE || mode == BONDING_MODE_8023AD) { -+ fprintf(f, "\tBalance Xmit Policy: "); -+ switch (internals->balance_xmit_policy) { -+ case BALANCE_XMIT_POLICY_LAYER2: -+ fprintf(f, "BALANCE_XMIT_POLICY_LAYER2"); -+ break; -+ case BALANCE_XMIT_POLICY_LAYER23: -+ fprintf(f, "BALANCE_XMIT_POLICY_LAYER23"); -+ break; -+ case BALANCE_XMIT_POLICY_LAYER34: -+ fprintf(f, "BALANCE_XMIT_POLICY_LAYER34"); -+ break; -+ default: -+ fprintf(f, "Unknown"); -+ } -+ fprintf(f, "\n"); -+ } -+ -+ if (mode == BONDING_MODE_8023AD) { -+ fprintf(f, "\tIEEE802.3AD Aggregator Mode: "); -+ switch (internals->mode4.agg_selection) { -+ case AGG_BANDWIDTH: -+ fprintf(f, "bandwidth"); -+ break; -+ case AGG_STABLE: -+ fprintf(f, "stable"); -+ break; -+ case AGG_COUNT: -+ fprintf(f, "count"); -+ break; -+ default: -+ fprintf(f, "unknown"); -+ } -+ fprintf(f, "\n"); -+ } -+ -+ if (internals->slave_count > 0) { -+ fprintf(f, "\tSlaves (%u): [", internals->slave_count); -+ for (i = 0; i < internals->slave_count - 1; i++) -+ fprintf(f, "%u ", internals->slaves[i].port_id); -+ -+ fprintf(f, "%u]\n", internals->slaves[internals->slave_count - 1].port_id); -+ } else { -+ fprintf(f, "\tSlaves: []\n"); -+ } -+ -+ if (internals->active_slave_count > 0) { -+ fprintf(f, "\tActive Slaves (%u): [", internals->active_slave_count); -+ for (i = 0; i < internals->active_slave_count - 1; i++) -+ fprintf(f, "%u ", internals->active_slaves[i]); -+ -+ fprintf(f, "%u]\n", internals->active_slaves[internals->active_slave_count - 1]); -+ -+ } else { -+ fprintf(f, "\tActive Slaves: []\n"); -+ } -+ -+ if (internals->user_defined_primary_port) -+ fprintf(f, "\tUser Defined Primary: [%u]\n", internals->primary_port); -+ if (internals->slave_count > 0) -+ fprintf(f, "\tCurrent Primary: [%u]\n", internals->current_primary_port); -+ -+ return 0; -+} -+ - const struct eth_dev_ops default_dev_ops = { - .dev_start = bond_ethdev_start, - .dev_stop = bond_ethdev_stop, -@@ -3323,7 +3425,8 @@ const struct eth_dev_ops default_dev_ops = { - .mac_addr_set = bond_ethdev_mac_address_set, - .mac_addr_add = bond_ethdev_mac_addr_add, - .mac_addr_remove = bond_ethdev_mac_addr_remove, -- .flow_ops_get = bond_flow_ops_get -+ .flow_ops_get = bond_flow_ops_get, -+ .eth_dev_priv_dump = bond_ethdev_priv_dump, - }; - - static int --- -2.23.0 - diff --git a/0259-net-bonding-add-LACP-info-dump.patch b/0259-net-bonding-add-LACP-info-dump.patch deleted file mode 100644 index 6839d34..0000000 --- a/0259-net-bonding-add-LACP-info-dump.patch +++ /dev/null @@ -1,187 +0,0 @@ -From a74801e4c1d59a8e40317c8ea9e4ba3a5472d633 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Wed, 14 Dec 2022 06:13:24 +0000 -Subject: net/bonding: add LACP info dump -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit b00119fc03dc585213236ea7f550662befa68fbe ] - -This patch adds dump lacp info in eth_dev_priv_dump ops. - -The extra dump output is similar to testpmd command -"show bonding lacp info [port]". - -Signed-off-by: Chengwen Feng -Acked-by:Min Hu (Connor) -Acked-by: Huisong Li -Acked-by: Ferruh Yigit ---- - drivers/net/bonding/rte_eth_bond_pmd.c | 143 ++++++++++++++++++++++++- - 1 file changed, 141 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c -index cf7d275bf5..0f2b21a568 100644 ---- a/drivers/net/bonding/rte_eth_bond_pmd.c -+++ b/drivers/net/bonding/rte_eth_bond_pmd.c -@@ -3320,8 +3320,8 @@ bond_mode_name(uint8_t mode) - } - } - --static int --bond_ethdev_priv_dump(struct rte_eth_dev *dev, FILE *f) -+static void -+dump_basic(const struct rte_eth_dev *dev, FILE *f) - { - struct bond_dev_private instant_priv; - const struct bond_dev_private *internals = &instant_priv; -@@ -3395,6 +3395,145 @@ bond_ethdev_priv_dump(struct rte_eth_dev *dev, FILE *f) - fprintf(f, "\tUser Defined Primary: [%u]\n", internals->primary_port); - if (internals->slave_count > 0) - fprintf(f, "\tCurrent Primary: [%u]\n", internals->current_primary_port); -+} -+ -+static void -+dump_lacp_conf(const struct rte_eth_bond_8023ad_conf *conf, FILE *f) -+{ -+ fprintf(f, "\tfast period: %u ms\n", conf->fast_periodic_ms); -+ fprintf(f, "\tslow period: %u ms\n", conf->slow_periodic_ms); -+ fprintf(f, "\tshort timeout: %u ms\n", conf->short_timeout_ms); -+ fprintf(f, "\tlong timeout: %u ms\n", conf->long_timeout_ms); -+ fprintf(f, "\taggregate wait timeout: %u ms\n", -+ conf->aggregate_wait_timeout_ms); -+ fprintf(f, "\ttx period: %u ms\n", conf->tx_period_ms); -+ fprintf(f, "\trx marker period: %u ms\n", conf->rx_marker_period_ms); -+ fprintf(f, "\tupdate timeout: %u ms\n", conf->update_timeout_ms); -+ switch (conf->agg_selection) { -+ case AGG_BANDWIDTH: -+ fprintf(f, "\taggregation mode: bandwidth\n"); -+ break; -+ case AGG_STABLE: -+ fprintf(f, "\taggregation mode: stable\n"); -+ break; -+ case AGG_COUNT: -+ fprintf(f, "\taggregation mode: count\n"); -+ break; -+ default: -+ fprintf(f, "\taggregation mode: invalid\n"); -+ break; -+ } -+ fprintf(f, "\n"); -+} -+ -+static void -+dump_lacp_port_param(const struct port_params *params, FILE *f) -+{ -+ char buf[RTE_ETHER_ADDR_FMT_SIZE]; -+ fprintf(f, "\t\tsystem priority: %u\n", params->system_priority); -+ rte_ether_format_addr(buf, RTE_ETHER_ADDR_FMT_SIZE, ¶ms->system); -+ fprintf(f, "\t\tsystem mac address: %s\n", buf); -+ fprintf(f, "\t\tport key: %u\n", params->key); -+ fprintf(f, "\t\tport priority: %u\n", params->port_priority); -+ fprintf(f, "\t\tport number: %u\n", params->port_number); -+} -+ -+static void -+dump_lacp_slave(const struct rte_eth_bond_8023ad_slave_info *info, FILE *f) -+{ -+ char a_state[256] = { 0 }; -+ char p_state[256] = { 0 }; -+ int a_len = 0; -+ int p_len = 0; -+ uint32_t i; -+ -+ static const char * const state[] = { -+ "ACTIVE", -+ "TIMEOUT", -+ "AGGREGATION", -+ "SYNCHRONIZATION", -+ "COLLECTING", -+ "DISTRIBUTING", -+ "DEFAULTED", -+ "EXPIRED" -+ }; -+ static const char * const selection[] = { -+ "UNSELECTED", -+ "STANDBY", -+ "SELECTED" -+ }; -+ -+ for (i = 0; i < RTE_DIM(state); i++) { -+ if ((info->actor_state >> i) & 1) -+ a_len += snprintf(&a_state[a_len], -+ RTE_DIM(a_state) - a_len, "%s ", -+ state[i]); -+ -+ if ((info->partner_state >> i) & 1) -+ p_len += snprintf(&p_state[p_len], -+ RTE_DIM(p_state) - p_len, "%s ", -+ state[i]); -+ } -+ fprintf(f, "\tAggregator port id: %u\n", info->agg_port_id); -+ fprintf(f, "\tselection: %s\n", selection[info->selected]); -+ fprintf(f, "\tActor detail info:\n"); -+ dump_lacp_port_param(&info->actor, f); -+ fprintf(f, "\t\tport state: %s\n", a_state); -+ fprintf(f, "\tPartner detail info:\n"); -+ dump_lacp_port_param(&info->partner, f); -+ fprintf(f, "\t\tport state: %s\n", p_state); -+ fprintf(f, "\n"); -+} -+ -+static void -+dump_lacp(uint16_t port_id, FILE *f) -+{ -+ struct rte_eth_bond_8023ad_slave_info slave_info; -+ struct rte_eth_bond_8023ad_conf port_conf; -+ uint16_t slaves[RTE_MAX_ETHPORTS]; -+ int num_active_slaves; -+ int i, ret; -+ -+ fprintf(f, " - Lacp info:\n"); -+ -+ num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves, -+ RTE_MAX_ETHPORTS); -+ if (num_active_slaves < 0) { -+ fprintf(f, "\tFailed to get active slave list for port %u\n", -+ port_id); -+ return; -+ } -+ -+ fprintf(f, "\tIEEE802.3 port: %u\n", port_id); -+ ret = rte_eth_bond_8023ad_conf_get(port_id, &port_conf); -+ if (ret) { -+ fprintf(f, "\tGet bonded device %u 8023ad config failed\n", -+ port_id); -+ return; -+ } -+ dump_lacp_conf(&port_conf, f); -+ -+ for (i = 0; i < num_active_slaves; i++) { -+ ret = rte_eth_bond_8023ad_slave_info(port_id, slaves[i], -+ &slave_info); -+ if (ret) { -+ fprintf(f, "\tGet slave device %u 8023ad info failed\n", -+ slaves[i]); -+ return; -+ } -+ fprintf(f, "\tSlave Port: %u\n", slaves[i]); -+ dump_lacp_slave(&slave_info, f); -+ } -+} -+ -+static int -+bond_ethdev_priv_dump(struct rte_eth_dev *dev, FILE *f) -+{ -+ const struct bond_dev_private *internals = dev->data->dev_private; -+ -+ dump_basic(dev, f); -+ if (internals->mode == BONDING_MODE_8023AD) -+ dump_lacp(dev->data->port_id, f); - - return 0; - } --- -2.23.0 - diff --git a/0260-net-virtio-support-private-dump.patch b/0260-net-virtio-support-private-dump.patch deleted file mode 100644 index f2f6550..0000000 --- a/0260-net-virtio-support-private-dump.patch +++ /dev/null @@ -1,56 +0,0 @@ -From a247b89fe26e5bae41159dfa59475c04ae53e8e2 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 19 Jan 2023 12:30:55 +0000 -Subject: net/virtio: support private dump - -[ upstream commit 426858d6a9975a26539f0398037558dcb418947a ] - -This patch implements eth_dev_priv_dump callback which could use for -debugging. - -Signed-off-by: Chengwen Feng -Reviewed-by: Maxime Coquelin ---- - drivers/net/virtio/virtio_ethdev.c | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c -index b317649d7e..a38b15d01c 100644 ---- a/drivers/net/virtio/virtio_ethdev.c -+++ b/drivers/net/virtio/virtio_ethdev.c -@@ -1018,6 +1018,24 @@ virtio_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id) - return 0; - } - -+static int -+virtio_dev_priv_dump(struct rte_eth_dev *dev, FILE *f) -+{ -+ struct virtio_hw *hw = dev->data->dev_private; -+ -+ fprintf(f, "guest_features: 0x%" PRIx64 "\n", hw->guest_features); -+ fprintf(f, "vtnet_hdr_size: %u\n", hw->vtnet_hdr_size); -+ fprintf(f, "use_vec: rx-%u tx-%u\n", hw->use_vec_rx, hw->use_vec_tx); -+ fprintf(f, "use_inorder: rx-%u tx-%u\n", hw->use_inorder_rx, hw->use_inorder_tx); -+ fprintf(f, "intr_lsc: %u\n", hw->intr_lsc); -+ fprintf(f, "max_mtu: %u\n", hw->max_mtu); -+ fprintf(f, "max_rx_pkt_len: %zu\n", hw->max_rx_pkt_len); -+ fprintf(f, "max_queue_pairs: %u\n", hw->max_queue_pairs); -+ fprintf(f, "req_guest_features: 0x%" PRIx64 "\n", hw->req_guest_features); -+ -+ return 0; -+} -+ - /* - * dev_ops for virtio, bare necessities for basic operation - */ -@@ -1054,6 +1072,7 @@ static const struct eth_dev_ops virtio_eth_dev_ops = { - .mac_addr_remove = virtio_mac_addr_remove, - .mac_addr_set = virtio_mac_addr_set, - .get_monitor_addr = virtio_get_monitor_addr, -+ .eth_dev_priv_dump = virtio_dev_priv_dump, - }; - - /* --- -2.23.0 - diff --git a/0261-net-vhost-support-private-dump.patch b/0261-net-vhost-support-private-dump.patch deleted file mode 100644 index ec38d71..0000000 --- a/0261-net-vhost-support-private-dump.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 423959cfe25c9dc231b80f3df59318585df3a023 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 19 Jan 2023 12:30:56 +0000 -Subject: net/vhost: support private dump - -[ upstream commit 47b9fb64c15d60e1c8c2c8f6e63824fd2cada428 ] - -This patch implements eth_dev_priv_dump callback which could use for -debugging. - -Signed-off-by: Chengwen Feng -Reviewed-by: Maxime Coquelin ---- - drivers/net/vhost/rte_eth_vhost.c | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c -index 070f0e6dfd..b120341d0c 100644 ---- a/drivers/net/vhost/rte_eth_vhost.c -+++ b/drivers/net/vhost/rte_eth_vhost.c -@@ -1429,6 +1429,23 @@ vhost_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc) - return 0; - } - -+static int -+vhost_dev_priv_dump(struct rte_eth_dev *dev, FILE *f) -+{ -+ struct pmd_internal *internal = dev->data->dev_private; -+ -+ fprintf(f, "iface_name: %s\n", internal->iface_name); -+ fprintf(f, "flags: 0x%" PRIx64 "\n", internal->flags); -+ fprintf(f, "disable_flags: 0x%" PRIx64 "\n", internal->disable_flags); -+ fprintf(f, "max_queues: %u\n", internal->max_queues); -+ fprintf(f, "vid: %d\n", internal->vid); -+ fprintf(f, "started: %d\n", rte_atomic32_read(&internal->started)); -+ fprintf(f, "dev_attached: %d\n", rte_atomic32_read(&internal->dev_attached)); -+ fprintf(f, "vlan_strip: %d\n", internal->vlan_strip); -+ -+ return 0; -+} -+ - static const struct eth_dev_ops ops = { - .dev_start = eth_dev_start, - .dev_stop = eth_dev_stop, -@@ -1449,6 +1466,7 @@ static const struct eth_dev_ops ops = { - .rx_queue_intr_enable = eth_rxq_intr_enable, - .rx_queue_intr_disable = eth_rxq_intr_disable, - .get_monitor_addr = vhost_get_monitor_addr, -+ .eth_dev_priv_dump = vhost_dev_priv_dump, - }; - - static int --- -2.23.0 - diff --git a/0262-app-testpmd-show-private-info-in-port-info.patch b/0262-app-testpmd-show-private-info-in-port-info.patch deleted file mode 100644 index 3ba2887..0000000 --- a/0262-app-testpmd-show-private-info-in-port-info.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 9f1acbbbe8050c3b8794d45a4af610f9e0774211 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 16 Mar 2023 09:32:16 +0000 -Subject: app/testpmd: show private info in port info - -[ upstream commit d0aa6cd7a43d737797ba139a7f18b879cc44dac3 ] - -This patch adds dump private info in 'show port info [port_id]' cmd. - -Signed-off-by: Chengwen Feng -Acked-by: Aman Singh -Acked-by: Ferruh Yigit ---- - app/test-pmd/config.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 12386c4d82..873d1f1357 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -891,6 +891,13 @@ port_infos_display(portid_t port_id) - printf("Switch Rx domain: %u\n", - dev_info.switch_info.rx_domain); - } -+ printf("Device private info:\n"); -+ ret = rte_eth_dev_priv_dump(port_id, stdout); -+ if (ret == -ENOTSUP) -+ printf(" none\n"); -+ else if (ret < 0) -+ fprintf(stderr, " Failed to dump private info with error (%d): %s\n", -+ ret, strerror(-ret)); - } - - void --- -2.23.0 - diff --git a/0263-app-testpmd-display-RSS-hash-key-of-flow-rule.patch b/0263-app-testpmd-display-RSS-hash-key-of-flow-rule.patch deleted file mode 100644 index 3dd36b7..0000000 --- a/0263-app-testpmd-display-RSS-hash-key-of-flow-rule.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 491333ae684b8303e019536900bb931b9f64b1ce Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 16 Mar 2023 20:58:14 +0800 -Subject: app/testpmd: display RSS hash key of flow rule - -[ upstream commit f958bbe2210dcc888032e81ec1326c0df5e5c518 ] - -There are two ways to set RSS hash key with rte flow rule: -1. 'key_len' isn't zero and 'key' is NULL. -2. 'key_len' isn't zero and 'key' isn't NULL. -This patch adds displaying for the hash key of rte flow rule. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu -Acked-by: Ferruh Yigit ---- - app/test-pmd/config.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 873d1f1357..78af232a8a 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -1651,6 +1651,21 @@ rss_config_display(struct rte_flow_action_rss *rss_conf) - return; - } - -+ printf(" RSS key:\n"); -+ if (rss_conf->key_len == 0) { -+ printf(" none"); -+ } else { -+ printf(" key_len: %u\n", rss_conf->key_len); -+ printf(" key: "); -+ if (rss_conf->key == NULL) { -+ printf("none"); -+ } else { -+ for (i = 0; i < rss_conf->key_len; i++) -+ printf("%02X", rss_conf->key[i]); -+ } -+ } -+ printf("\n"); -+ - printf(" types:\n"); - if (rss_conf->types == 0) { - printf(" none\n"); --- -2.23.0 - diff --git a/0264-ethdev-fix-Rx-queue-telemetry-memory-leak-on-failure.patch b/0264-ethdev-fix-Rx-queue-telemetry-memory-leak-on-failure.patch deleted file mode 100644 index 3a166df..0000000 --- a/0264-ethdev-fix-Rx-queue-telemetry-memory-leak-on-failure.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 8cd9ea525b1e9c2a966fdf3616d68c7037b3820a Mon Sep 17 00:00:00 2001 -From: Yunjian Wang -Date: Sat, 8 Jan 2022 15:51:57 +0800 -Subject: ethdev: fix Rx queue telemetry memory leak on failure - -[ upstream commit 52b49ea06ffb2cfbef8fe9578149f1e2dba99e89 ] - -In eth_dev_handle_port_info() allocated memory for rxq_state, -we should free it when error happens, otherwise it will lead -to memory leak. - -Fixes: 58b43c1ddfd1 ("ethdev: add telemetry endpoint for device info") -Cc: stable@dpdk.org - -Signed-off-by: Yunjian Wang -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index df5a627cbe..d466efffc7 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6383,8 +6383,10 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - return -ENOMEM; - - txq_state = rte_tel_data_alloc(); -- if (!txq_state) -+ if (!txq_state) { -+ rte_tel_data_free(rxq_state); - return -ENOMEM; -+ } - - rte_tel_data_start_dict(d); - rte_tel_data_add_dict_string(d, "name", eth_dev->data->name); --- -2.23.0 - diff --git a/0265-ethdev-fix-MAC-address-in-telemetry-device-info.patch b/0265-ethdev-fix-MAC-address-in-telemetry-device-info.patch deleted file mode 100644 index 327c3b9..0000000 --- a/0265-ethdev-fix-MAC-address-in-telemetry-device-info.patch +++ /dev/null @@ -1,53 +0,0 @@ -From db1ea57482d4d11c1c86ad9941c6be782a17ec57 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 16 Feb 2022 15:13:16 +0100 -Subject: ethdev: fix MAC address in telemetry device info - -[ upstream commit ffe77e911f6a3d62757bc740670c4fda28f882f2 ] - -The right size for a human readable MAC is RTE_ETHER_ADDR_FMT_SIZE. -While at it, the net library provides a helper for MAC address -formatting. Prefer it. - -Fixes: 58b43c1ddfd1 ("ethdev: add telemetry endpoint for device info") -Cc: stable@dpdk.org - -Reported-by: Christophe Fontaine -Signed-off-by: David Marchand -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 11 +++-------- - 1 file changed, 3 insertions(+), 8 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index d466efffc7..d82819a458 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6358,7 +6358,7 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - struct rte_tel_data *d) - { - struct rte_tel_data *rxq_state, *txq_state; -- char mac_addr[RTE_ETHER_ADDR_LEN]; -+ char mac_addr[RTE_ETHER_ADDR_FMT_SIZE]; - struct rte_eth_dev *eth_dev; - char *end_param; - int port_id, i; -@@ -6401,13 +6401,8 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - eth_dev->data->min_rx_buf_size); - rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail", - eth_dev->data->rx_mbuf_alloc_failed); -- snprintf(mac_addr, RTE_ETHER_ADDR_LEN, "%02x:%02x:%02x:%02x:%02x:%02x", -- eth_dev->data->mac_addrs->addr_bytes[0], -- eth_dev->data->mac_addrs->addr_bytes[1], -- eth_dev->data->mac_addrs->addr_bytes[2], -- eth_dev->data->mac_addrs->addr_bytes[3], -- eth_dev->data->mac_addrs->addr_bytes[4], -- eth_dev->data->mac_addrs->addr_bytes[5]); -+ rte_ether_format_addr(mac_addr, sizeof(mac_addr), -+ eth_dev->data->mac_addrs); - rte_tel_data_add_dict_string(d, "mac_addr", mac_addr); - rte_tel_data_add_dict_int(d, "promiscuous", - eth_dev->data->promiscuous); --- -2.23.0 - diff --git a/0266-eventdev-eth_rx-fix-telemetry-Rx-stats-reset.patch b/0266-eventdev-eth_rx-fix-telemetry-Rx-stats-reset.patch deleted file mode 100644 index 8fd0662..0000000 --- a/0266-eventdev-eth_rx-fix-telemetry-Rx-stats-reset.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 08b69766da122d7d3e20cee328a9166a12f320cb Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Thu, 24 Mar 2022 16:28:30 +0100 -Subject: eventdev/eth_rx: fix telemetry Rx stats reset - -[ upstream commit b450a990b07e008077377a6dfa45a562b3f9a496 ] - -Caught by covscan: - -1. dpdk-21.11/lib/eventdev/rte_event_eth_rx_adapter.c:3279: -logical_vs_bitwise: "~(*__ctype_b_loc()[(int)*params] & 2048 /* -(unsigned short)_ISdigit */)" is always 1/true regardless of the values -of its operand. This occurs as the logical second operand of "||". -2. dpdk-21.11/lib/eventdev/rte_event_eth_rx_adapter.c:3279: remediation: -Did you intend to use "!" rather than "~"? - -While isdigit return value should be compared as an int to 0, -prefer ! since all of this file uses this convention. - -Fixes: 814d01709328 ("eventdev/eth_rx: support telemetry") -Cc: stable@dpdk.org - -Signed-off-by: David Marchand -Acked-by: Jay Jayatheerthan ---- - lib/eventdev/rte_event_eth_rx_adapter.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c -index 3182b52c23..6f160b03c2 100644 ---- a/lib/eventdev/rte_event_eth_rx_adapter.c -+++ b/lib/eventdev/rte_event_eth_rx_adapter.c -@@ -3276,7 +3276,7 @@ handle_rxa_stats_reset(const char *cmd __rte_unused, - { - uint8_t rx_adapter_id; - -- if (params == NULL || strlen(params) == 0 || ~isdigit(*params)) -+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) - return -1; - - /* Get Rx adapter ID from parameter string */ --- -2.23.0 - diff --git a/0267-test-telemetry_data-refactor-for-maintainability.patch b/0267-test-telemetry_data-refactor-for-maintainability.patch deleted file mode 100644 index af4da8e..0000000 --- a/0267-test-telemetry_data-refactor-for-maintainability.patch +++ /dev/null @@ -1,369 +0,0 @@ -From 9e0c047add440fb5fbe84ef5131d5574f7cdcf37 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 9 Sep 2022 10:35:20 +0100 -Subject: test/telemetry_data: refactor for maintainability -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 1306df2cd1d9ae654c2e5b3b0f40ca19ab440006 ] - -To help with the writing and maintaining of test cases in this file we -can make the following changes to it: - -- rename non-test-case functions i.e. the infrastructure functions, to - not start with "test_", so that each sub-test case can be identified - by starting with that prefix. -- add a comment at the start of the file explaining how tests are to be - written and managed, so as to keep consistency. -- add a trivial test-case for returning a simple string value to use as - a reference example for those wanting to add test cases. -- improve the key macro used for validating the output from each - function, so that the standard json preamble can be skipped for each - function. This hides more of the infrastructure implementation from - the user i.e. they don't need to worry what the actual command used is - called, and also shortens the output strings so we can avoid line - splitting in most cases. -- add clearing the "response_data" structure to the loop calling each - test to avoid each test function having to do so individually. - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - app/test/test_telemetry_data.c | 101 ++++++++++++++++++++------------- - 1 file changed, 60 insertions(+), 41 deletions(-) - -diff --git a/app/test/test_telemetry_data.c b/app/test/test_telemetry_data.c -index 18b93db8ef..75aca8791f 100644 ---- a/app/test/test_telemetry_data.c -+++ b/app/test/test_telemetry_data.c -@@ -19,18 +19,45 @@ - #define TELEMETRY_VERSION "v2" - #define REQUEST_CMD "/test" - #define BUF_SIZE 1024 --#define TEST_OUTPUT(exp) test_output(__func__, exp) -+#define CHECK_OUTPUT(exp) check_output(__func__, "{\"" REQUEST_CMD "\":" exp "}") -+ -+/* -+ * Runs a series of test cases, checking the output of telemetry for various different types of -+ * responses. On init, a single connection to DPDK telemetry is made, and a single telemetry -+ * callback "/test" is registered. That callback always returns the value of the static global -+ * variable "response_data", so each test case builds up that structure, and then calls the -+ * "check_output" function to ensure the response received over the socket for "/test" matches -+ * that expected for the response_data value populated. -+ * -+ * NOTE: -+ * - each test case function in this file should be added to the "test_cases" array in -+ * test_telemetry_data function at the bottom of the file. -+ * - each test case function should populate the "response_data" global variable (below) -+ * with the appropriate values which would be returned from a simulated telemetry function. -+ * Then the test case function should have "return CHECK_OUTPUT();" as it's -+ * last line. The test infrastructure will then validate that the output when returning -+ * "response_data" structure matches that in "". -+ * - the response_data structure will be zeroed on entry to each test function, so each function -+ * can begin with a call to "rte_tel_data_string/start_array/start_dict" as so desired. -+ * - the expected_output for each function can be just the actual json data from the -+ * "response_data" value. The CHECK_OUTPUT macro will include the appropriate "{\"/test\": ... }" -+ * structure around the json output. -+ * -+ * See test_simple_string(), or test_case_array_int() for a basic examples of test cases. -+ */ -+ - - static struct rte_tel_data response_data; - static int sock; - -+ - /* - * This function is the callback registered with Telemetry to be used when - * the /test command is requested. This callback returns the global data built - * up by the individual test cases. - */ - static int --test_cb(const char *cmd __rte_unused, const char *params __rte_unused, -+telemetry_test_cb(const char *cmd __rte_unused, const char *params __rte_unused, - struct rte_tel_data *d) - { - *d = response_data; -@@ -44,7 +71,7 @@ test_cb(const char *cmd __rte_unused, const char *params __rte_unused, - * and is compared to the actual response received from Telemetry. - */ - static int --test_output(const char *func_name, const char *expected) -+check_output(const char *func_name, const char *expected) - { - int bytes; - char buf[BUF_SIZE * 16]; -@@ -64,6 +91,14 @@ test_output(const char *func_name, const char *expected) - return strncmp(expected, buf, sizeof(buf)); - } - -+static int -+test_simple_string(void) -+{ -+ rte_tel_data_string(&response_data, "Simple string"); -+ -+ return CHECK_OUTPUT("\"Simple string\""); -+} -+ - static int - test_dict_with_array_int_values(void) - { -@@ -75,7 +110,6 @@ test_dict_with_array_int_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - for (i = 0; i < 5; i++) { -@@ -88,8 +122,7 @@ test_dict_with_array_int_values(void) - rte_tel_data_add_dict_container(&response_data, "dict_1", - child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":[0,1,2,3,4]," -- "\"dict_1\":[0,1,2,3,4]}}"); -+ return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4],\"dict_1\":[0,1,2,3,4]}"); - } - - static int -@@ -103,7 +136,6 @@ test_array_with_array_int_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_INT_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); - - for (i = 0; i < 5; i++) { -@@ -113,18 +145,18 @@ test_array_with_array_int_values(void) - rte_tel_data_add_array_container(&response_data, child_data, 0); - rte_tel_data_add_array_container(&response_data, child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}"); -+ return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]"); - } - - static int - test_case_array_int(void) - { - int i; -- memset(&response_data, 0, sizeof(response_data)); -+ - rte_tel_data_start_array(&response_data, RTE_TEL_INT_VAL); - for (i = 0; i < 5; i++) - rte_tel_data_add_array_int(&response_data, i); -- return TEST_OUTPUT("{\"/test\":[0,1,2,3,4]}"); -+ return CHECK_OUTPUT("[0,1,2,3,4]"); - } - - static int -@@ -133,7 +165,6 @@ test_case_add_dict_int(void) - int i = 0; - char name_of_value[8]; - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - for (i = 0; i < 5; i++) { -@@ -141,14 +172,12 @@ test_case_add_dict_int(void) - rte_tel_data_add_dict_int(&response_data, name_of_value, i); - } - -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2," -- "\"dict_3\":3,\"dict_4\":4}}"); -+ return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}"); - } - - static int - test_case_array_string(void) - { -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); - rte_tel_data_add_array_string(&response_data, "aaaa"); - rte_tel_data_add_array_string(&response_data, "bbbb"); -@@ -156,14 +185,12 @@ test_case_array_string(void) - rte_tel_data_add_array_string(&response_data, "dddd"); - rte_tel_data_add_array_string(&response_data, "eeee"); - -- return TEST_OUTPUT("{\"/test\":[\"aaaa\",\"bbbb\",\"cccc\",\"dddd\"," -- "\"eeee\"]}"); -+ return CHECK_OUTPUT("[\"aaaa\",\"bbbb\",\"cccc\",\"dddd\",\"eeee\"]"); - } - - static int - test_case_add_dict_string(void) - { -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - rte_tel_data_add_dict_string(&response_data, "dict_0", "aaaa"); -@@ -171,8 +198,7 @@ test_case_add_dict_string(void) - rte_tel_data_add_dict_string(&response_data, "dict_2", "cccc"); - rte_tel_data_add_dict_string(&response_data, "dict_3", "dddd"); - -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":\"aaaa\",\"dict_1\":" -- "\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}}"); -+ return CHECK_OUTPUT("{\"dict_0\":\"aaaa\",\"dict_1\":\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}"); - } - - -@@ -185,7 +211,6 @@ test_dict_with_array_string_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - rte_tel_data_add_array_string(child_data, "aaaa"); -@@ -196,8 +221,7 @@ test_dict_with_array_string_values(void) - rte_tel_data_add_dict_container(&response_data, "dict_1", - child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":[\"aaaa\"],\"dict_1\":" -- "[\"bbbb\"]}}"); -+ return CHECK_OUTPUT("{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}"); - } - - static int -@@ -212,7 +236,6 @@ test_dict_with_dict_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - rte_tel_data_add_array_string(child_data, "aaaa"); -@@ -224,8 +247,7 @@ test_dict_with_dict_values(void) - rte_tel_data_add_dict_container(&response_data, "dict_of_dicts", - dict_of_dicts, 0); - -- return TEST_OUTPUT("{\"/test\":{\"dict_of_dicts\":{\"dict_0\":" -- "[\"aaaa\"],\"dict_1\":[\"bbbb\"]}}}"); -+ return CHECK_OUTPUT("{\"dict_of_dicts\":{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}}"); - } - - static int -@@ -237,7 +259,6 @@ test_array_with_array_string_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); - - rte_tel_data_add_array_string(child_data, "aaaa"); -@@ -246,18 +267,18 @@ test_array_with_array_string_values(void) - rte_tel_data_add_array_container(&response_data, child_data, 0); - rte_tel_data_add_array_container(&response_data, child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":[[\"aaaa\"],[\"bbbb\"]]}"); -+ return CHECK_OUTPUT("[[\"aaaa\"],[\"bbbb\"]]"); - } - - static int - test_case_array_u64(void) - { - int i; -- memset(&response_data, 0, sizeof(response_data)); -+ - rte_tel_data_start_array(&response_data, RTE_TEL_U64_VAL); - for (i = 0; i < 5; i++) - rte_tel_data_add_array_u64(&response_data, i); -- return TEST_OUTPUT("{\"/test\":[0,1,2,3,4]}"); -+ return CHECK_OUTPUT("[0,1,2,3,4]"); - } - - static int -@@ -266,15 +287,13 @@ test_case_add_dict_u64(void) - int i = 0; - char name_of_value[8]; - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - for (i = 0; i < 5; i++) { - sprintf(name_of_value, "dict_%d", i); - rte_tel_data_add_dict_u64(&response_data, name_of_value, i); - } -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2," -- "\"dict_3\":3,\"dict_4\":4}}"); -+ return CHECK_OUTPUT("{\"dict_0\":0,\"dict_1\":1,\"dict_2\":2,\"dict_3\":3,\"dict_4\":4}"); - } - - static int -@@ -288,7 +307,6 @@ test_dict_with_array_u64_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_U64_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_dict(&response_data); - - for (i = 0; i < 10; i++) { -@@ -301,8 +319,7 @@ test_dict_with_array_u64_values(void) - rte_tel_data_add_dict_container(&response_data, "dict_1", - child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":{\"dict_0\":[0,1,2,3,4,5,6,7,8,9]," -- "\"dict_1\":[0,1,2,3,4,5,6,7,8,9]}}"); -+ return CHECK_OUTPUT("{\"dict_0\":[0,1,2,3,4,5,6,7,8,9],\"dict_1\":[0,1,2,3,4,5,6,7,8,9]}"); - } - - static int -@@ -316,7 +333,6 @@ test_array_with_array_u64_values(void) - struct rte_tel_data *child_data2 = rte_tel_data_alloc(); - rte_tel_data_start_array(child_data2, RTE_TEL_U64_VAL); - -- memset(&response_data, 0, sizeof(response_data)); - rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); - - for (i = 0; i < 5; i++) { -@@ -326,7 +342,7 @@ test_array_with_array_u64_values(void) - rte_tel_data_add_array_container(&response_data, child_data, 0); - rte_tel_data_add_array_container(&response_data, child_data2, 0); - -- return TEST_OUTPUT("{\"/test\":[[0,1,2,3,4],[0,1,2,3,4]]}"); -+ return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]"); - } - - static int -@@ -367,7 +383,7 @@ connect_to_socket(void) - } - - static int --test_telemetry_data(void) -+telemetry_data_autotest(void) - { - typedef int (*test_case)(void); - unsigned int i = 0; -@@ -376,7 +392,9 @@ test_telemetry_data(void) - if (sock <= 0) - return -1; - -- test_case test_cases[] = {test_case_array_string, -+ test_case test_cases[] = { -+ test_simple_string, -+ test_case_array_string, - test_case_array_int, test_case_array_u64, - test_case_add_dict_int, test_case_add_dict_u64, - test_case_add_dict_string, -@@ -388,8 +406,9 @@ test_telemetry_data(void) - test_array_with_array_u64_values, - test_array_with_array_string_values }; - -- rte_telemetry_register_cmd(REQUEST_CMD, test_cb, "Test"); -+ rte_telemetry_register_cmd(REQUEST_CMD, telemetry_test_cb, "Test"); - for (i = 0; i < RTE_DIM(test_cases); i++) { -+ memset(&response_data, 0, sizeof(response_data)); - if (test_cases[i]() != 0) { - close(sock); - return -1; -@@ -399,4 +418,4 @@ test_telemetry_data(void) - return 0; - } - --REGISTER_TEST_COMMAND(telemetry_data_autotest, test_telemetry_data); -+REGISTER_TEST_COMMAND(telemetry_data_autotest, telemetry_data_autotest); --- -2.23.0 - diff --git a/0268-test-telemetry_data-add-test-cases-for-character-esc.patch b/0268-test-telemetry_data-add-test-cases-for-character-esc.patch deleted file mode 100644 index c8e1d13..0000000 --- a/0268-test-telemetry_data-add-test-cases-for-character-esc.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 9da99d5eaf004c1ea202753c4618dcaa48744ba3 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Fri, 9 Sep 2022 10:35:21 +0100 -Subject: test/telemetry_data: add test cases for character escaping -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit d0049f7a2c1654ffe704d7c1803db0402e49a2a7 ] - -Add in some basic unit tests to validate the character escaping being -done on string data values, which tests end-to-end processing of those -values beyond just the json-encoding steps tested by the -"telemetry_json_autotest". - -Signed-off-by: Bruce Richardson -Acked-by: Ciara Power -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - app/test/test_telemetry_data.c | 30 +++++++++++++++++++++++++++++- - 1 file changed, 29 insertions(+), 1 deletion(-) - -diff --git a/app/test/test_telemetry_data.c b/app/test/test_telemetry_data.c -index 75aca8791f..79ec48063f 100644 ---- a/app/test/test_telemetry_data.c -+++ b/app/test/test_telemetry_data.c -@@ -345,6 +345,30 @@ test_array_with_array_u64_values(void) - return CHECK_OUTPUT("[[0,1,2,3,4],[0,1,2,3,4]]"); - } - -+static int -+test_string_char_escaping(void) -+{ -+ rte_tel_data_string(&response_data, "hello,\nworld\n"); -+ return CHECK_OUTPUT("\"hello,\\nworld\\n\""); -+} -+ -+static int -+test_array_char_escaping(void) -+{ -+ rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); -+ rte_tel_data_add_array_string(&response_data, "\\escape\r"); -+ rte_tel_data_add_array_string(&response_data, "characters\n"); -+ return CHECK_OUTPUT("[\"\\\\escape\\r\",\"characters\\n\"]"); -+} -+ -+static int -+test_dict_char_escaping(void) -+{ -+ rte_tel_data_start_dict(&response_data); -+ rte_tel_data_add_dict_string(&response_data, "name", "escaped\n\tvalue"); -+ return CHECK_OUTPUT("{\"name\":\"escaped\\n\\tvalue\"}"); -+} -+ - static int - connect_to_socket(void) - { -@@ -404,7 +428,11 @@ telemetry_data_autotest(void) - test_dict_with_dict_values, - test_array_with_array_int_values, - test_array_with_array_u64_values, -- test_array_with_array_string_values }; -+ test_array_with_array_string_values, -+ test_string_char_escaping, -+ test_array_char_escaping, -+ test_dict_char_escaping, -+ }; - - rte_telemetry_register_cmd(REQUEST_CMD, telemetry_test_cb, "Test"); - for (i = 0; i < RTE_DIM(test_cases); i++) { --- -2.23.0 - diff --git a/0269-usertools-telemetry-add-JSON-pretty-print.patch b/0269-usertools-telemetry-add-JSON-pretty-print.patch deleted file mode 100644 index 33fa7f7..0000000 --- a/0269-usertools-telemetry-add-JSON-pretty-print.patch +++ /dev/null @@ -1,87 +0,0 @@ -From dccf49c20f2be4f9b92a635117dc06c9d17be545 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Mon, 17 Oct 2022 07:41:02 +0000 -Subject: usertools/telemetry: add JSON pretty print - -[ upstream commit 66542840dfd184c06813e6740664b280ef77d4e0 ] - -Currently, the dpdk-telemetry.py show JSON in raw format under -interactive mode, which is not good for human reading. - -E.g. The command '/ethdev/xstats,0' will output: -{"/ethdev/xstats": {"rx_good_packets": 0, "tx_good_packets": 0, -"rx_good_bytes": 0, "tx_good_bytes": 0, "rx_missed_errors": 0, -"rx_errors": 0, "tx_errors": 0, "rx_mbuf_allocation_errors": 0, -"rx_q0_packets": 0,...}} - -This patch supports JSON pretty print by adding extra indent=2 -parameter under interactive mode, so the same command will output: -{ - "/ethdev/xstats": { - "rx_good_packets": 0, - "tx_good_packets": 0, - "rx_good_bytes": 0, - "tx_good_bytes": 0, - "rx_missed_errors": 0, - "rx_errors": 0, - "rx_mbuf_allocation_errors": 0, - "rx_q0_packets": 0, - ... - } -} - -Note: the non-interactive mode is made machine-readable and remains the -original way (it means don't use indent to pretty print). - -Signed-off-by: Chengwen Feng -Acked-by: David Marchand -Acked-by: Ciara Power -Tested-by: Bruce Richardson ---- - usertools/dpdk-telemetry.py | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/usertools/dpdk-telemetry.py b/usertools/dpdk-telemetry.py -index 5b3bf83356..e36b0af811 100755 ---- a/usertools/dpdk-telemetry.py -+++ b/usertools/dpdk-telemetry.py -@@ -23,7 +23,7 @@ - CMDS = [] - - --def read_socket(sock, buf_len, echo=True): -+def read_socket(sock, buf_len, echo=True, pretty=False): - """ Read data from socket and return it in JSON format """ - reply = sock.recv(buf_len).decode() - try: -@@ -33,7 +33,8 @@ def read_socket(sock, buf_len, echo=True): - sock.close() - raise - if echo: -- print(json.dumps(ret)) -+ indent = 2 if pretty else None -+ print(json.dumps(ret, indent=indent)) - return ret - - -@@ -123,7 +124,7 @@ def handle_socket(args, path): - else: - list_fp() - return -- json_reply = read_socket(sock, 1024, prompt) -+ json_reply = read_socket(sock, 1024, prompt, prompt) - output_buf_len = json_reply["max_output_len"] - app_name = get_app_name(json_reply["pid"]) - if app_name and prompt: -@@ -139,7 +140,7 @@ def handle_socket(args, path): - while text != "quit": - if text.startswith('/'): - sock.send(text.encode()) -- read_socket(sock, output_buf_len) -+ read_socket(sock, output_buf_len, pretty=prompt) - text = input(prompt).strip() - except EOFError: - pass --- -2.23.0 - diff --git a/0270-telemetry-move-include-after-guard.patch b/0270-telemetry-move-include-after-guard.patch deleted file mode 100644 index cb718cc..0000000 --- a/0270-telemetry-move-include-after-guard.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 46fdcb394e83402924e6fdcf2d6da2873570d2f4 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:41 +0800 -Subject: telemetry: move include after guard -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit f7b74387be1de6803716262d7988794accd6d39f ] - -The "stdint.h" header is outside '_RTE_TELEMETRY_H_' macro, which cause -this header is unconditional. So this patch moves this header to inside -'_RTE_TELEMETRY_H_'. - -Fixes: 99a2dd955fba ("lib: remove librte_ prefix from directory names") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng -Acked-by: Bruce Richardson ---- - lib/telemetry/rte_telemetry.h | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h -index fadea48cb9..08d7f18dff 100644 ---- a/lib/telemetry/rte_telemetry.h -+++ b/lib/telemetry/rte_telemetry.h -@@ -2,10 +2,6 @@ - * Copyright(c) 2018 Intel Corporation - */ - --#include -- --#include -- - #ifndef _RTE_TELEMETRY_H_ - #define _RTE_TELEMETRY_H_ - -@@ -13,6 +9,8 @@ - extern "C" { - #endif - -+#include -+ - /** Maximum length for string used in object. */ - #define RTE_TEL_MAX_STRING_LEN 128 - /** Maximum length of string. */ --- -2.23.0 - diff --git a/0271-ethdev-fix-telemetry-data-truncation.patch b/0271-ethdev-fix-telemetry-data-truncation.patch deleted file mode 100644 index 43748bd..0000000 --- a/0271-ethdev-fix-telemetry-data-truncation.patch +++ /dev/null @@ -1,59 +0,0 @@ -From f4f89120a7df52f92fcac89e3fe13cfac1097051 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:42 +0800 -Subject: ethdev: fix telemetry data truncation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 7db3f2af573287abb9201d46a92b4ca3ebc5d9ad ] - -The 'u32' and 'u64' data can not assigned to 'int' type variable. -They need to use the 'u64' APIs to add. - -Fixes: 58b43c1ddfd1 ("ethdev: add telemetry endpoint for device info") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/ethdev/rte_ethdev.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index d82819a458..c216091e79 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6397,9 +6397,9 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - eth_dev->data->nb_tx_queues); - rte_tel_data_add_dict_int(d, "port_id", eth_dev->data->port_id); - rte_tel_data_add_dict_int(d, "mtu", eth_dev->data->mtu); -- rte_tel_data_add_dict_int(d, "rx_mbuf_size_min", -+ rte_tel_data_add_dict_u64(d, "rx_mbuf_size_min", - eth_dev->data->min_rx_buf_size); -- rte_tel_data_add_dict_int(d, "rx_mbuf_alloc_fail", -+ rte_tel_data_add_dict_u64(d, "rx_mbuf_alloc_fail", - eth_dev->data->rx_mbuf_alloc_failed); - rte_ether_format_addr(mac_addr, sizeof(mac_addr), - eth_dev->data->mac_addrs); -@@ -6428,12 +6428,12 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0); - rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0); - rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node); -- rte_tel_data_add_dict_int(d, "dev_flags", eth_dev->data->dev_flags); -- rte_tel_data_add_dict_int(d, "rx_offloads", -+ rte_tel_data_add_dict_u64(d, "dev_flags", eth_dev->data->dev_flags); -+ rte_tel_data_add_dict_u64(d, "rx_offloads", - eth_dev->data->dev_conf.rxmode.offloads); -- rte_tel_data_add_dict_int(d, "tx_offloads", -+ rte_tel_data_add_dict_u64(d, "tx_offloads", - eth_dev->data->dev_conf.txmode.offloads); -- rte_tel_data_add_dict_int(d, "ethdev_rss_hf", -+ rte_tel_data_add_dict_u64(d, "ethdev_rss_hf", - eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf); - - return 0; --- -2.23.0 - diff --git a/0272-mempool-fix-telemetry-data-truncation.patch b/0272-mempool-fix-telemetry-data-truncation.patch deleted file mode 100644 index 00e8a61..0000000 --- a/0272-mempool-fix-telemetry-data-truncation.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 2d3ca311972da8c7d4770697e62e6a4812665c5b Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:43 +0800 -Subject: mempool: fix telemetry data truncation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 4eebfcf70a21b2b608e3bb9f20b5ee23338172ec ] - -The 'u32' and 'u64' data can not assigned to 'int' type variable. -They need to use the 'u64' APIs to add. - -Fixes: 2f5c4025abb3 ("mempool: add telemetry endpoint") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/mempool/rte_mempool.c | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/lib/mempool/rte_mempool.c b/lib/mempool/rte_mempool.c -index c5a699b1d6..871f4d1fe3 100644 ---- a/lib/mempool/rte_mempool.c -+++ b/lib/mempool/rte_mempool.c -@@ -1517,27 +1517,27 @@ mempool_info_cb(struct rte_mempool *mp, void *arg) - return; - - rte_tel_data_add_dict_string(info->d, "name", mp->name); -- rte_tel_data_add_dict_int(info->d, "pool_id", mp->pool_id); -- rte_tel_data_add_dict_int(info->d, "flags", mp->flags); -+ rte_tel_data_add_dict_u64(info->d, "pool_id", mp->pool_id); -+ rte_tel_data_add_dict_u64(info->d, "flags", mp->flags); - rte_tel_data_add_dict_int(info->d, "socket_id", mp->socket_id); -- rte_tel_data_add_dict_int(info->d, "size", mp->size); -- rte_tel_data_add_dict_int(info->d, "cache_size", mp->cache_size); -- rte_tel_data_add_dict_int(info->d, "elt_size", mp->elt_size); -- rte_tel_data_add_dict_int(info->d, "header_size", mp->header_size); -- rte_tel_data_add_dict_int(info->d, "trailer_size", mp->trailer_size); -- rte_tel_data_add_dict_int(info->d, "private_data_size", -+ rte_tel_data_add_dict_u64(info->d, "size", mp->size); -+ rte_tel_data_add_dict_u64(info->d, "cache_size", mp->cache_size); -+ rte_tel_data_add_dict_u64(info->d, "elt_size", mp->elt_size); -+ rte_tel_data_add_dict_u64(info->d, "header_size", mp->header_size); -+ rte_tel_data_add_dict_u64(info->d, "trailer_size", mp->trailer_size); -+ rte_tel_data_add_dict_u64(info->d, "private_data_size", - mp->private_data_size); - rte_tel_data_add_dict_int(info->d, "ops_index", mp->ops_index); -- rte_tel_data_add_dict_int(info->d, "populated_size", -+ rte_tel_data_add_dict_u64(info->d, "populated_size", - mp->populated_size); - - mz = mp->mz; - rte_tel_data_add_dict_string(info->d, "mz_name", mz->name); -- rte_tel_data_add_dict_int(info->d, "mz_len", mz->len); -- rte_tel_data_add_dict_int(info->d, "mz_hugepage_sz", -+ rte_tel_data_add_dict_u64(info->d, "mz_len", mz->len); -+ rte_tel_data_add_dict_u64(info->d, "mz_hugepage_sz", - mz->hugepage_sz); - rte_tel_data_add_dict_int(info->d, "mz_socket_id", mz->socket_id); -- rte_tel_data_add_dict_int(info->d, "mz_flags", mz->flags); -+ rte_tel_data_add_dict_u64(info->d, "mz_flags", mz->flags); - } - - static int --- -2.23.0 - diff --git a/0273-cryptodev-fix-telemetry-data-truncation.patch b/0273-cryptodev-fix-telemetry-data-truncation.patch deleted file mode 100644 index df68d0c..0000000 --- a/0273-cryptodev-fix-telemetry-data-truncation.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 5af68a4b3406c0477a2a0c33c546795d6be7f6a5 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:44 +0800 -Subject: cryptodev: fix telemetry data truncation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 45038f04ab577db8844ef54d7f523119be6c205f ] - -The 'u32' data can not assigned to 'int' type variable. The 'u32' data -needs to use the 'u64' APIs to add. - -Fixes: d3d98f5ce9d0 ("cryptodev: support telemetry") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/cryptodev/rte_cryptodev.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c -index a40536c5ea..23e079d639 100644 ---- a/lib/cryptodev/rte_cryptodev.c -+++ b/lib/cryptodev/rte_cryptodev.c -@@ -2472,7 +2472,7 @@ cryptodev_handle_dev_info(const char *cmd __rte_unused, - rte_tel_data_start_dict(d); - rte_tel_data_add_dict_string(d, "device_name", - cryptodev_info.device->name); -- rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", -+ rte_tel_data_add_dict_u64(d, "max_nb_queue_pairs", - cryptodev_info.max_nb_queue_pairs); - - return 0; --- -2.23.0 - diff --git a/0274-mem-fix-telemetry-data-truncation.patch b/0274-mem-fix-telemetry-data-truncation.patch deleted file mode 100644 index 0dec824..0000000 --- a/0274-mem-fix-telemetry-data-truncation.patch +++ /dev/null @@ -1,65 +0,0 @@ -From ecdcf5720497371f360dde918df83dbc56f32284 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:45 +0800 -Subject: mem: fix telemetry data truncation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 6243e36b837b754c33017718cf79f7574a52b09c ] - -The 'u32' and 'u64' data can not assigned to 'int' type variable. -They need to use the 'u64' APIs to add. - -Fixes: e6732d0d6e26 ("mem: add telemetry infos") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/eal/common/eal_common_memory.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c -index 69dea8f72b..f2f8858e22 100644 ---- a/lib/eal/common/eal_common_memory.c -+++ b/lib/eal/common/eal_common_memory.c -@@ -1191,7 +1191,7 @@ handle_eal_heap_info_request(const char *cmd __rte_unused, const char *params, - malloc_heap_get_stats(heap, &sock_stats); - - rte_tel_data_start_dict(d); -- rte_tel_data_add_dict_int(d, "Head id", heap_id); -+ rte_tel_data_add_dict_u64(d, "Head id", heap_id); - rte_tel_data_add_dict_string(d, "Name", heap->name); - rte_tel_data_add_dict_u64(d, "Heap_size", - sock_stats.heap_totalsz_bytes); -@@ -1253,13 +1253,13 @@ handle_eal_memzone_info_request(const char *cmd __rte_unused, - mz = rte_fbarray_get(&mcfg->memzones, mz_idx); - - rte_tel_data_start_dict(d); -- rte_tel_data_add_dict_int(d, "Zone", mz_idx); -+ rte_tel_data_add_dict_u64(d, "Zone", mz_idx); - rte_tel_data_add_dict_string(d, "Name", mz->name); -- rte_tel_data_add_dict_int(d, "Length", mz->len); -+ rte_tel_data_add_dict_u64(d, "Length", mz->len); - snprintf(addr, ADDR_STR, "%p", mz->addr); - rte_tel_data_add_dict_string(d, "Address", addr); - rte_tel_data_add_dict_int(d, "Socket", mz->socket_id); -- rte_tel_data_add_dict_int(d, "Flags", mz->flags); -+ rte_tel_data_add_dict_u64(d, "Flags", mz->flags); - - /* go through each page occupied by this memzone */ - msl = rte_mem_virt2memseg_list(mz->addr); -@@ -1274,7 +1274,7 @@ handle_eal_memzone_info_request(const char *cmd __rte_unused, - ms_idx = RTE_PTR_DIFF(mz->addr, msl->base_va) / page_sz; - ms = rte_fbarray_get(&msl->memseg_arr, ms_idx); - -- rte_tel_data_add_dict_int(d, "Hugepage_size", page_sz); -+ rte_tel_data_add_dict_u64(d, "Hugepage_size", page_sz); - snprintf(addr, ADDR_STR, "%p", ms->addr); - rte_tel_data_add_dict_string(d, "Hugepage_base", addr); - --- -2.23.0 - diff --git a/0275-telemetry-support-adding-integer-as-hexadecimal.patch b/0275-telemetry-support-adding-integer-as-hexadecimal.patch deleted file mode 100644 index 8eea185..0000000 --- a/0275-telemetry-support-adding-integer-as-hexadecimal.patch +++ /dev/null @@ -1,426 +0,0 @@ -From cec570b800d47867e900c30761c7b50018184bbf Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:46 +0800 -Subject: telemetry: support adding integer as hexadecimal -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 82c33481c6abdec2fc58f1199ca6202e7400c08d ] - -Sometimes displaying an unsigned integer value as hexadecimal encoded style -is more expected for human consumption, such as, offload capability and -device flag. This patch introduces two APIs to add unsigned integer value -as hexadecimal encoded string to array or dictionary. And user can choose -whether the stored value is padded to the specified width. - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng -Acked-by: Bruce Richardson ---- - app/test/test_telemetry_data.c | 150 +++++++++++++++++++++++++++++++++ - lib/telemetry/rte_telemetry.h | 47 +++++++++++ - lib/telemetry/telemetry_data.c | 74 ++++++++++++++++ - lib/telemetry/version.map | 10 +++ - 4 files changed, 281 insertions(+) - -diff --git a/app/test/test_telemetry_data.c b/app/test/test_telemetry_data.c -index 79ec48063f..7d9be376a6 100644 ---- a/app/test/test_telemetry_data.c -+++ b/app/test/test_telemetry_data.c -@@ -201,6 +201,39 @@ test_case_add_dict_string(void) - return CHECK_OUTPUT("{\"dict_0\":\"aaaa\",\"dict_1\":\"bbbb\",\"dict_2\":\"cccc\",\"dict_3\":\"dddd\"}"); - } - -+static int -+test_case_add_dict_uint_hex_padding(void) -+{ -+ rte_tel_data_start_dict(&response_data); -+ -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_0", -+ (uint8_t)0x8, 8); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_1", -+ (uint16_t)0x88, 16); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_2", -+ (uint32_t)0x888, 32); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_3", -+ (uint64_t)0x8888, 64); -+ -+ return CHECK_OUTPUT("{\"dict_0\":\"0x08\",\"dict_1\":\"0x0088\",\"dict_2\":\"0x00000888\",\"dict_3\":\"0x0000000000008888\"}"); -+} -+ -+static int -+test_case_add_dict_uint_hex_nopadding(void) -+{ -+ rte_tel_data_start_dict(&response_data); -+ -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_0", -+ (uint8_t)0x8, 0); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_1", -+ (uint16_t)0x88, 0); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_2", -+ (uint32_t)0x888, 0); -+ rte_tel_data_add_dict_uint_hex(&response_data, "dict_3", -+ (uint64_t)0x8888, 0); -+ -+ return CHECK_OUTPUT("{\"dict_0\":\"0x8\",\"dict_1\":\"0x88\",\"dict_2\":\"0x888\",\"dict_3\":\"0x8888\"}"); -+} - - static int - test_dict_with_array_string_values(void) -@@ -224,6 +257,50 @@ test_dict_with_array_string_values(void) - return CHECK_OUTPUT("{\"dict_0\":[\"aaaa\"],\"dict_1\":[\"bbbb\"]}"); - } - -+static int -+test_dict_with_array_uint_hex_values_padding(void) -+{ -+ struct rte_tel_data *child_data = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); -+ -+ struct rte_tel_data *child_data2 = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); -+ -+ rte_tel_data_start_dict(&response_data); -+ -+ rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32); -+ rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64); -+ -+ rte_tel_data_add_dict_container(&response_data, "dict_0", -+ child_data, 0); -+ rte_tel_data_add_dict_container(&response_data, "dict_1", -+ child_data2, 0); -+ -+ return CHECK_OUTPUT("{\"dict_0\":[\"0x00000888\"],\"dict_1\":[\"0x0000000000008888\"]}"); -+} -+ -+static int -+test_dict_with_array_uint_hex_values_nopadding(void) -+{ -+ struct rte_tel_data *child_data = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); -+ -+ struct rte_tel_data *child_data2 = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); -+ -+ rte_tel_data_start_dict(&response_data); -+ -+ rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0); -+ rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0); -+ -+ rte_tel_data_add_dict_container(&response_data, "dict_0", -+ child_data, 0); -+ rte_tel_data_add_dict_container(&response_data, "dict_1", -+ child_data2, 0); -+ -+ return CHECK_OUTPUT("{\"dict_0\":[\"0x888\"],\"dict_1\":[\"0x8888\"]}"); -+} -+ - static int - test_dict_with_dict_values(void) - { -@@ -270,6 +347,47 @@ test_array_with_array_string_values(void) - return CHECK_OUTPUT("[[\"aaaa\"],[\"bbbb\"]]"); - } - -+static int -+test_array_with_array_uint_hex_values_padding(void) -+{ -+ struct rte_tel_data *child_data = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); -+ -+ struct rte_tel_data *child_data2 = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); -+ -+ rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); -+ -+ rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 32); -+ rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 64); -+ -+ rte_tel_data_add_array_container(&response_data, child_data, 0); -+ rte_tel_data_add_array_container(&response_data, child_data2, 0); -+ -+ return CHECK_OUTPUT("[[\"0x00000888\"],[\"0x0000000000008888\"]]"); -+} -+ -+ -+static int -+test_array_with_array_uint_hex_values_nopadding(void) -+{ -+ struct rte_tel_data *child_data = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data, RTE_TEL_STRING_VAL); -+ -+ struct rte_tel_data *child_data2 = rte_tel_data_alloc(); -+ rte_tel_data_start_array(child_data2, RTE_TEL_STRING_VAL); -+ -+ rte_tel_data_start_array(&response_data, RTE_TEL_CONTAINER); -+ -+ rte_tel_data_add_array_uint_hex(child_data, (uint32_t)0x888, 0); -+ rte_tel_data_add_array_uint_hex(child_data2, (uint64_t)0x8888, 0); -+ -+ rte_tel_data_add_array_container(&response_data, child_data, 0); -+ rte_tel_data_add_array_container(&response_data, child_data2, 0); -+ -+ return CHECK_OUTPUT("[[\"0x888\"],[\"0x8888\"]]"); -+} -+ - static int - test_case_array_u64(void) - { -@@ -281,6 +399,30 @@ test_case_array_u64(void) - return CHECK_OUTPUT("[0,1,2,3,4]"); - } - -+static int -+test_case_array_uint_hex_padding(void) -+{ -+ rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 8); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 16); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 32); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 64); -+ -+ return CHECK_OUTPUT("[\"0x08\",\"0x0088\",\"0x00000888\",\"0x0000000000008888\"]"); -+} -+ -+static int -+test_case_array_uint_hex_nopadding(void) -+{ -+ rte_tel_data_start_array(&response_data, RTE_TEL_STRING_VAL); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint8_t)0x8, 0); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint16_t)0x88, 0); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint32_t)0x888, 0); -+ rte_tel_data_add_array_uint_hex(&response_data, (uint64_t)0x8888, 0); -+ -+ return CHECK_OUTPUT("[\"0x8\",\"0x88\",\"0x888\",\"0x8888\"]"); -+} -+ - static int - test_case_add_dict_u64(void) - { -@@ -420,15 +562,23 @@ telemetry_data_autotest(void) - test_simple_string, - test_case_array_string, - test_case_array_int, test_case_array_u64, -+ test_case_array_uint_hex_padding, -+ test_case_array_uint_hex_nopadding, - test_case_add_dict_int, test_case_add_dict_u64, - test_case_add_dict_string, -+ test_case_add_dict_uint_hex_padding, -+ test_case_add_dict_uint_hex_nopadding, - test_dict_with_array_int_values, - test_dict_with_array_u64_values, - test_dict_with_array_string_values, -+ test_dict_with_array_uint_hex_values_padding, -+ test_dict_with_array_uint_hex_values_nopadding, - test_dict_with_dict_values, - test_array_with_array_int_values, - test_array_with_array_u64_values, - test_array_with_array_string_values, -+ test_array_with_array_uint_hex_values_padding, -+ test_array_with_array_uint_hex_values_nopadding, - test_string_char_escaping, - test_array_char_escaping, - test_dict_char_escaping, -diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h -index 08d7f18dff..5d5b75b683 100644 ---- a/lib/telemetry/rte_telemetry.h -+++ b/lib/telemetry/rte_telemetry.h -@@ -10,6 +10,7 @@ extern "C" { - #endif - - #include -+#include - - /** Maximum length for string used in object. */ - #define RTE_TEL_MAX_STRING_LEN 128 -@@ -153,6 +154,28 @@ int - rte_tel_data_add_array_container(struct rte_tel_data *d, - struct rte_tel_data *val, int keep); - -+/** -+ * Convert an unsigned integer to hexadecimal encoded strings -+ * and add this string to an array. -+ * The array must have been started by rte_tel_data_start_array() -+ * with RTE_TEL_STRING_VAL as the type parameter. -+ * -+ * @param d -+ * The data structure passed to the callback. -+ * @param val -+ * The number to be returned in the array as a hexadecimal encoded strings. -+ * @param display_bitwidth -+ * The display bit width of the 'val'. If 'display_bitwidth' is zero, the -+ * value is stored in the array as no-padding zero hexadecimal encoded string, -+ * or the value is stored as padding zero to specified hexadecimal width. -+ * @return -+ * 0 on success, negative errno on error. -+ */ -+__rte_experimental -+int -+rte_tel_data_add_array_uint_hex(struct rte_tel_data *d, uint64_t val, -+ uint8_t display_bitwidth); -+ - /** - * Add a string value to a dictionary. - * The dict must have been started by rte_tel_data_start_dict(). -@@ -231,6 +254,30 @@ int - rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name, - struct rte_tel_data *val, int keep); - -+/** -+ * Convert an unsigned integer to hexadecimal encoded strings -+ * and add this string to an dictionary. -+ * The dict must have been started by rte_tel_data_start_dict(). -+ * -+ * @param d -+ * The data structure passed to the callback. -+ * @param name -+ * The name of the value is to be stored in the dict. -+ * Must contain only alphanumeric characters or the symbols: '_' or '/'. -+ * @param val -+ * The number to be stored in the dict as a hexadecimal encoded strings. -+ * @param display_bitwidth -+ * The display bit width of the 'val'. If 'display_bitwidth' is zero, the -+ * value is stored in the array as no-padding zero hexadecimal encoded string, -+ * or the value is stored as padding zero to specified hexadecimal width. -+ * @return -+ * 0 on success, negative errno on error. -+ */ -+__rte_experimental -+int -+rte_tel_data_add_dict_uint_hex(struct rte_tel_data *d, const char *name, -+ uint64_t val, uint8_t display_bitwidth); -+ - /** - * This telemetry callback is used when registering a telemetry command. - * It handles getting and formatting information to be returned to telemetry -diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c -index be46054c29..61d9eeac6a 100644 ---- a/lib/telemetry/telemetry_data.c -+++ b/lib/telemetry/telemetry_data.c -@@ -2,12 +2,16 @@ - * Copyright(c) 2020 Intel Corporation - */ - -+#include -+ - #undef RTE_USE_LIBBSD - #include - #include - - #include "telemetry_data.h" - -+#define RTE_TEL_UINT_HEX_STR_BUF_LEN 64 -+ - int - rte_tel_data_start_array(struct rte_tel_data *d, enum rte_tel_value_type type) - { -@@ -93,6 +97,60 @@ rte_tel_data_add_array_container(struct rte_tel_data *d, - return 0; - } - -+/* To suppress compiler warning about format string. */ -+#if defined(RTE_TOOLCHAIN_GCC) -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wformat-nonliteral" -+#elif defined(RTE_TOOLCHAIN_CLANG) -+#pragma clang diagnostic push -+#pragma clang diagnostic ignored "-Wformat-nonliteral" -+#endif -+ -+static int -+rte_tel_uint_to_hex_encoded_str(char *buf, size_t buf_len, uint64_t val, -+ uint8_t display_bitwidth) -+{ -+#define RTE_TEL_HEX_FORMAT_LEN 16 -+ -+ uint8_t spec_hex_width = (display_bitwidth + 3) / 4; -+ char format[RTE_TEL_HEX_FORMAT_LEN]; -+ -+ if (display_bitwidth != 0) { -+ if (snprintf(format, RTE_TEL_HEX_FORMAT_LEN, "0x%%0%u" PRIx64, -+ spec_hex_width) >= RTE_TEL_HEX_FORMAT_LEN) -+ return -EINVAL; -+ -+ if (snprintf(buf, buf_len, format, val) >= (int)buf_len) -+ return -EINVAL; -+ } else { -+ if (snprintf(buf, buf_len, "0x%" PRIx64, val) >= (int)buf_len) -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+#if defined(RTE_TOOLCHAIN_GCC) -+#pragma GCC diagnostic pop -+#elif defined(RTE_TOOLCHAIN_CLANG) -+#pragma clang diagnostic pop -+#endif -+ -+int -+rte_tel_data_add_array_uint_hex(struct rte_tel_data *d, uint64_t val, -+ uint8_t display_bitwidth) -+{ -+ char hex_str[RTE_TEL_UINT_HEX_STR_BUF_LEN]; -+ int ret; -+ -+ ret = rte_tel_uint_to_hex_encoded_str(hex_str, -+ RTE_TEL_UINT_HEX_STR_BUF_LEN, val, display_bitwidth); -+ if (ret != 0) -+ return ret; -+ -+ return rte_tel_data_add_array_string(d, hex_str); -+} -+ - static bool - valid_name(const char *name) - { -@@ -200,6 +258,22 @@ rte_tel_data_add_dict_container(struct rte_tel_data *d, const char *name, - return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG; - } - -+int -+rte_tel_data_add_dict_uint_hex(struct rte_tel_data *d, const char *name, -+ uint64_t val, uint8_t display_bitwidth) -+{ -+ char hex_str[RTE_TEL_UINT_HEX_STR_BUF_LEN]; -+ int ret; -+ -+ ret = rte_tel_uint_to_hex_encoded_str(hex_str, -+ RTE_TEL_UINT_HEX_STR_BUF_LEN, val, display_bitwidth); -+ if (ret != 0) -+ return ret; -+ -+ -+ return rte_tel_data_add_dict_string(d, name, hex_str); -+} -+ - struct rte_tel_data * - rte_tel_data_alloc(void) - { -diff --git a/lib/telemetry/version.map b/lib/telemetry/version.map -index 77528bb1fe..576ac55297 100644 ---- a/lib/telemetry/version.map -+++ b/lib/telemetry/version.map -@@ -19,6 +19,16 @@ DPDK_22 { - local: *; - }; - -+EXPERIMENTAL { -+ global: -+ -+ # added in 23.03 -+ rte_tel_data_add_array_uint_hex; -+ rte_tel_data_add_dict_uint_hex; -+ -+ local: *; -+}; -+ - INTERNAL { - rte_telemetry_legacy_register; - rte_telemetry_init; --- -2.23.0 - diff --git a/0276-ethdev-get-capabilities-from-telemetry-in-hexadecima.patch b/0276-ethdev-get-capabilities-from-telemetry-in-hexadecima.patch deleted file mode 100644 index 625ffe3..0000000 --- a/0276-ethdev-get-capabilities-from-telemetry-in-hexadecima.patch +++ /dev/null @@ -1,62 +0,0 @@ -From baa8bc0cc5736e2804e53c09b6cadf193993ce45 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 19 Dec 2022 15:06:48 +0800 -Subject: ethdev: get capabilities from telemetry in hexadecimal -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 796b031608d8d52e040f83304c676d3cda5af617 ] - -The 'dev_flags', 'rx_offloads', 'tx_offloads' and 'rss_hf' are better -displayed in hexadecimal format. - -Like: - --> old display by input /ethdev/info,0 - "dev_flags": 3, - "rx_offloads": 524288, - "tx_offloads": 65536, - "ethdev_rss_hf": 9100 - - --> new display - "dev_flags": "0x3", - "rx_offloads": "0x80000", - "tx_offloads": "0x10000", - "ethdev_rss_hf": "0x238c" - -Signed-off-by: Huisong Li -Acked-by: Morten Brørup -Acked-by: Chengwen Feng ---- - lib/ethdev/rte_ethdev.c | 15 ++++++++------- - 1 file changed, 8 insertions(+), 7 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index c216091e79..4e5499ad2d 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -6428,13 +6428,14 @@ eth_dev_handle_port_info(const char *cmd __rte_unused, - rte_tel_data_add_dict_container(d, "rxq_state", rxq_state, 0); - rte_tel_data_add_dict_container(d, "txq_state", txq_state, 0); - rte_tel_data_add_dict_int(d, "numa_node", eth_dev->data->numa_node); -- rte_tel_data_add_dict_u64(d, "dev_flags", eth_dev->data->dev_flags); -- rte_tel_data_add_dict_u64(d, "rx_offloads", -- eth_dev->data->dev_conf.rxmode.offloads); -- rte_tel_data_add_dict_u64(d, "tx_offloads", -- eth_dev->data->dev_conf.txmode.offloads); -- rte_tel_data_add_dict_u64(d, "ethdev_rss_hf", -- eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf); -+ rte_tel_data_add_dict_uint_hex(d, "dev_flags", -+ eth_dev->data->dev_flags, 0); -+ rte_tel_data_add_dict_uint_hex(d, "rx_offloads", -+ eth_dev->data->dev_conf.rxmode.offloads, 0); -+ rte_tel_data_add_dict_uint_hex(d, "tx_offloads", -+ eth_dev->data->dev_conf.txmode.offloads, 0); -+ rte_tel_data_add_dict_uint_hex(d, "ethdev_rss_hf", -+ eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf, 0); - - return 0; - } --- -2.23.0 - diff --git a/0277-mem-fix-hugepage-info-mapping.patch b/0277-mem-fix-hugepage-info-mapping.patch deleted file mode 100644 index c7c302b..0000000 --- a/0277-mem-fix-hugepage-info-mapping.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 2d42f6d26a83262c9765c6db7dfca44c8c26d995 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Mon, 6 Feb 2023 10:53:10 +0000 -Subject: mem: fix hugepage info mapping - -[ upstream commit 66e7ac416f3d62c5ee773ff02c115a24da9f1991 ] - -The map_shared_memory() function should treat mmap MAP_FAILED as NULL -because callers compare it with NULL to determine whether the map is -failed. - -Fixes: 764bf26873b9 ("add FreeBSD support") -Fixes: cb97d93e9d3b ("mem: share hugepage info primary and secondary") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Reviewed-by: David Marchand ---- - lib/eal/freebsd/eal_hugepage_info.c | 2 +- - lib/eal/linux/eal_hugepage_info.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/eal/freebsd/eal_hugepage_info.c b/lib/eal/freebsd/eal_hugepage_info.c -index 9dbe375bd3..e58e618469 100644 ---- a/lib/eal/freebsd/eal_hugepage_info.c -+++ b/lib/eal/freebsd/eal_hugepage_info.c -@@ -33,7 +33,7 @@ map_shared_memory(const char *filename, const size_t mem_size, int flags) - } - retval = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - close(fd); -- return retval; -+ return retval == MAP_FAILED ? NULL : retval; - } - - static void * -diff --git a/lib/eal/linux/eal_hugepage_info.c b/lib/eal/linux/eal_hugepage_info.c -index 41acf180ee..6c76a36a0d 100644 ---- a/lib/eal/linux/eal_hugepage_info.c -+++ b/lib/eal/linux/eal_hugepage_info.c -@@ -57,7 +57,7 @@ map_shared_memory(const char *filename, const size_t mem_size, int flags) - retval = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); - close(fd); -- return retval; -+ return retval == MAP_FAILED ? NULL : retval; - } - - static void * --- -2.23.0 - diff --git a/0278-raw-ifpga-base-fix-init-with-multi-process.patch b/0278-raw-ifpga-base-fix-init-with-multi-process.patch deleted file mode 100644 index d5d7ab9..0000000 --- a/0278-raw-ifpga-base-fix-init-with-multi-process.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 08ad2bc6e7fd4bc11b25011dbae48268828d372f Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Mon, 6 Feb 2023 10:53:11 +0000 -Subject: raw/ifpga/base: fix init with multi-process - -[ upstream commit e6a2804b77c5fbfd97d0fe05ec7f959a0404a380 ] - -The MAP_FAILED should be used to determine whether the mapping is -successful. - -Fixes: e41856b515ce ("raw/ifpga/base: enhance driver reliability in multi-process") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Reviewed-by: Rosen Xu ---- - drivers/raw/ifpga/base/opae_hw_api.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/raw/ifpga/base/opae_hw_api.c b/drivers/raw/ifpga/base/opae_hw_api.c -index 11c9887c7f..45efe70473 100644 ---- a/drivers/raw/ifpga/base/opae_hw_api.c -+++ b/drivers/raw/ifpga/base/opae_hw_api.c -@@ -380,7 +380,7 @@ static pthread_mutex_t *opae_adapter_mutex_open(struct opae_adapter *adapter) - PROT_READ | PROT_WRITE, MAP_SHARED, - shm_id, 0); - adapter->lock = (pthread_mutex_t *)ptr; -- if (ptr) { -+ if (ptr != MAP_FAILED) { - dev_info(NULL, - "shared memory %s address is %p\n", - shm_name, ptr); -@@ -499,7 +499,7 @@ static void *opae_adapter_shm_alloc(struct opae_adapter *adapter) - adapter->shm.size = size; - adapter->shm.ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, - MAP_SHARED, shm_id, 0); -- if (adapter->shm.ptr) { -+ if (adapter->shm.ptr != MAP_FAILED) { - dev_info(NULL, - "shared memory %s address is %p\n", - shm_name, adapter->shm.ptr); --- -2.23.0 - diff --git a/0279-compressdev-fix-empty-devargs-parsing.patch b/0279-compressdev-fix-empty-devargs-parsing.patch deleted file mode 100644 index d42e29d..0000000 --- a/0279-compressdev-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 37b765efbca81e4aa81fcb685e7810398e800e29 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:05 +0000 -Subject: compressdev: fix empty devargs parsing - -[ upstream commit bb27182482d61777de6a38b16a1d2c692c2c3f8b ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault in rte_compressdev_pmd_parse_uint_arg() -when parse input args with 'only keys' (e.g. socket_id). - -For a similar reason, this patch fixes -rte_compressdev_pmd_parse_name_arg(). - -Fixes: ed7dd94f7f66 ("compressdev: add basic device management") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - lib/compressdev/rte_compressdev_pmd.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/lib/compressdev/rte_compressdev_pmd.c b/lib/compressdev/rte_compressdev_pmd.c -index 7f500d76d4..6a11a396b7 100644 ---- a/lib/compressdev/rte_compressdev_pmd.c -+++ b/lib/compressdev/rte_compressdev_pmd.c -@@ -20,6 +20,9 @@ rte_compressdev_pmd_parse_name_arg(const char *key __rte_unused, - struct rte_compressdev_pmd_init_params *params = extra_args; - int n; - -+ if (value == NULL || extra_args == NULL) -+ return -EINVAL; -+ - n = strlcpy(params->name, value, RTE_COMPRESSDEV_NAME_MAX_LEN); - if (n >= RTE_COMPRESSDEV_NAME_MAX_LEN) - return -EINVAL; -@@ -37,6 +40,9 @@ rte_compressdev_pmd_parse_uint_arg(const char *key __rte_unused, - int i; - char *end; - -+ if (value == NULL || extra_args == NULL) -+ return -EINVAL; -+ - errno = 0; - i = strtol(value, &end, 10); - if (*end != 0 || errno != 0 || i < 0) --- -2.23.0 - diff --git a/0280-cryptodev-fix-empty-devargs-parsing.patch b/0280-cryptodev-fix-empty-devargs-parsing.patch deleted file mode 100644 index 9e9f0ea..0000000 --- a/0280-cryptodev-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 23320d21b4abc8f52c612768a8508443f77dfcd8 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:07 +0000 -Subject: cryptodev: fix empty devargs parsing - -[ upstream commit 8146454c56636ba8af5263b57e1c4a9f67fd4a39 ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault in rte_cryptodev_pmd_parse_uint_arg() -when parse input args with 'only keys' (e.g. socket_id, -max_nb_queue_pairs). - -For a similar reason, this patch fixes -rte_cryptodev_pmd_parse_name_arg(). - -Fixes: 9e6edea41805 ("cryptodev: add APIs to assist PMD initialisation") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Akhil Goyal ---- - lib/cryptodev/cryptodev_pmd.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/lib/cryptodev/cryptodev_pmd.c b/lib/cryptodev/cryptodev_pmd.c -index 739a0b3f34..9dab1ef7cd 100644 ---- a/lib/cryptodev/cryptodev_pmd.c -+++ b/lib/cryptodev/cryptodev_pmd.c -@@ -19,6 +19,9 @@ rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused, - struct rte_cryptodev_pmd_init_params *params = extra_args; - int n; - -+ if (value == NULL || extra_args == NULL) -+ return -EINVAL; -+ - n = strlcpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN); - if (n >= RTE_CRYPTODEV_NAME_MAX_LEN) - return -EINVAL; -@@ -35,6 +38,10 @@ rte_cryptodev_pmd_parse_uint_arg(const char *key __rte_unused, - { - int i; - char *end; -+ -+ if (value == NULL || extra_args == NULL) -+ return -EINVAL; -+ - errno = 0; - - i = strtol(value, &end, 10); --- -2.23.0 - diff --git a/0281-net-hns3-fix-empty-devargs-parsing.patch b/0281-net-hns3-fix-empty-devargs-parsing.patch deleted file mode 100644 index 84791c6..0000000 --- a/0281-net-hns3-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,62 +0,0 @@ -From cd1064bf44f8da3286a48f3f3da7df88ae4fa645 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:09 +0000 -Subject: net/hns3: fix empty devargs parsing - -[ upstream commit 8e9bd29995ddb1205d90291a684bcf71599d6623 ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault when parse input args with 'only keys' -(e.g. rx_func_hint). - -Fixes: a124f9e9591b ("net/hns3: add runtime config to select IO burst function") -Fixes: 70791213242e ("net/hns3: support masking device capability") -Fixes: 2fc3e696a7f1 ("net/hns3: add runtime config for mailbox limit time") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Acked-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 3c5e07f1bd..6697ecefe6 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -161,6 +161,9 @@ hns3_parse_io_hint_func(const char *key, const char *value, void *extra_args) - - RTE_SET_USED(key); - -+ if (value == NULL || extra_args == NULL) -+ return 0; -+ - if (strcmp(value, "vec") == 0) - hint = HNS3_IO_FUNC_HINT_VEC; - else if (strcmp(value, "sve") == 0) -@@ -201,6 +204,9 @@ hns3_parse_dev_caps_mask(const char *key, const char *value, void *extra_args) - - RTE_SET_USED(key); - -+ if (value == NULL || extra_args == NULL) -+ return 0; -+ - val = strtoull(value, NULL, HNS3_CONVERT_TO_HEXADECIMAL); - *(uint64_t *)extra_args = val; - -@@ -214,6 +220,9 @@ hns3_parse_mbx_time_limit(const char *key, const char *value, void *extra_args) - - RTE_SET_USED(key); - -+ if (value == NULL || extra_args == NULL) -+ return 0; -+ - val = strtoul(value, NULL, HNS3_CONVERT_TO_DECIMAL); - - /* --- -2.23.0 - diff --git a/0282-net-virtio-fix-empty-devargs-parsing.patch b/0282-net-virtio-fix-empty-devargs-parsing.patch deleted file mode 100644 index dafb867..0000000 --- a/0282-net-virtio-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 51a50c25f5884df574cb254ee92de23bc821c0b4 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:10 +0000 -Subject: net/virtio: fix empty devargs parsing - -[ upstream commit 1c1b35b59b4cee8836f34498b7c55b49de39d7b3 ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault when parse input args with 'only keys' -(e.g. vectorized,vdpa). - -Fixes: 4710e16a4a7b ("net/virtio: add parameter to enable vectorized path") -Fixes: 44d7b2e87b69 ("net/virtio: refactor devargs parsing") -Fixes: 440f03c25378 ("net/virtio: skip device probe in vDPA mode") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Reviewed-by: Maxime Coquelin ---- - drivers/net/virtio/virtio_ethdev.c | 3 +++ - drivers/net/virtio/virtio_pci_ethdev.c | 3 +++ - 2 files changed, 6 insertions(+) - -diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c -index a38b15d01c..c22b2f2889 100644 ---- a/drivers/net/virtio/virtio_ethdev.c -+++ b/drivers/net/virtio/virtio_ethdev.c -@@ -2474,6 +2474,9 @@ virtio_dev_speed_capa_get(uint32_t speed) - static int vectorized_check_handler(__rte_unused const char *key, - const char *value, void *ret_val) - { -+ if (value == NULL || ret_val == NULL) -+ return -EINVAL; -+ - if (strcmp(value, "1") == 0) - *(int *)ret_val = 1; - else -diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c -index 54645dc62e..de7b1ef344 100644 ---- a/drivers/net/virtio/virtio_pci_ethdev.c -+++ b/drivers/net/virtio/virtio_pci_ethdev.c -@@ -138,6 +138,9 @@ eth_virtio_pci_uninit(struct rte_eth_dev *eth_dev) - static int vdpa_check_handler(__rte_unused const char *key, - const char *value, void *ret_val) - { -+ if (value == NULL || ret_val == NULL) -+ return -EINVAL; -+ - if (strcmp(value, "1") == 0) - *(int *)ret_val = 1; - else --- -2.23.0 - diff --git a/0283-dma-skeleton-fix-empty-devargs-parsing.patch b/0283-dma-skeleton-fix-empty-devargs-parsing.patch deleted file mode 100644 index 61664ec..0000000 --- a/0283-dma-skeleton-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 9db4a191823cb2dec68c4be50bb1143c141da22c Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:11 +0000 -Subject: dma/skeleton: fix empty devargs parsing - -[ upstream commit e0e5dd0450db22fc7712da4b5a8e6fd6e081c870 ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault when parse input args with 'only keys' -(e.g. lcore). - -Fixes: 05d5fc66a269 ("dma/skeleton: introduce skeleton driver") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/dma/skeleton/skeleton_dmadev.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/drivers/dma/skeleton/skeleton_dmadev.c b/drivers/dma/skeleton/skeleton_dmadev.c -index 81cbdd286e..67e0357cf0 100644 ---- a/drivers/dma/skeleton/skeleton_dmadev.c -+++ b/drivers/dma/skeleton/skeleton_dmadev.c -@@ -500,9 +500,15 @@ skeldma_parse_lcore(const char *key __rte_unused, - const char *value, - void *opaque) - { -- int lcore_id = atoi(value); -+ int lcore_id; -+ -+ if (value == NULL || opaque == NULL) -+ return -EINVAL; -+ -+ lcore_id = atoi(value); - if (lcore_id >= 0 && lcore_id < RTE_MAX_LCORE) - *(int *)opaque = lcore_id; -+ - return 0; - } - --- -2.23.0 - diff --git a/0284-raw-skeleton-fix-empty-devargs-parsing.patch b/0284-raw-skeleton-fix-empty-devargs-parsing.patch deleted file mode 100644 index 4a67dc6..0000000 --- a/0284-raw-skeleton-fix-empty-devargs-parsing.patch +++ /dev/null @@ -1,38 +0,0 @@ -From db5368482035c920449a75d336afd3622044ee89 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 2 Mar 2023 07:50:12 +0000 -Subject: raw/skeleton: fix empty devargs parsing - -[ upstream commit 11da6149224a8de53d2ddd2aacba7b158cc4e3b4 ] - -The rte_kvargs_process() was used to parse KV pairs, it also supports -to parse 'only keys' (e.g. socket_id) type. And the callback function -parameter 'value' is NULL when parsed 'only keys'. - -This patch fixes segment fault when parse input args with 'only keys' -(e.g. self_test). - -Fixes: 55ca1b0f2151 ("raw/skeleton: add test cases") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/raw/skeleton/skeleton_rawdev.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/raw/skeleton/skeleton_rawdev.c b/drivers/raw/skeleton/skeleton_rawdev.c -index 16ecae3d92..a49e000146 100644 ---- a/drivers/raw/skeleton/skeleton_rawdev.c -+++ b/drivers/raw/skeleton/skeleton_rawdev.c -@@ -659,6 +659,8 @@ skeldev_get_selftest(const char *key __rte_unused, - void *opaque) - { - int *flag = opaque; -+ if (value == NULL || opaque == NULL) -+ return -EINVAL; - *flag = atoi(value); - return 0; - } --- -2.23.0 - diff --git a/0285-net-hns3-simplify-hardware-checksum-offloading.patch b/0285-net-hns3-simplify-hardware-checksum-offloading.patch deleted file mode 100644 index 6e6422b..0000000 --- a/0285-net-hns3-simplify-hardware-checksum-offloading.patch +++ /dev/null @@ -1,224 +0,0 @@ -From bc4b30bb7c3ce3310d98a43bb5364b327ecd5cf9 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 21 Apr 2023 17:53:21 +0800 -Subject: net/hns3: simplify hardware checksum offloading - -[ upstream commit 7fd763a9dd18a3edd98e95c26e96349fd71cbb9b ] - -If the NIC support simple BD mode, the hardware will calculate -the checksum from the start position of checksum and fill the -checksum result to the offset position, which simple the -HW operations of calculating the type and header length of -L3/L4. - -Add this mode for hns3 PMD when the packet type is L4. - -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.c | 3 ++ - drivers/net/hns3/hns3_cmd.h | 1 + - drivers/net/hns3/hns3_dump.c | 1 + - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_rxtx.c | 52 +++++++++++++++++++++++++++++++++- - drivers/net/hns3/hns3_rxtx.h | 12 +++++++- - 6 files changed, 68 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index bdfc85f934..d530650452 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -419,6 +419,7 @@ hns3_get_caps_name(uint32_t caps_id) - } dev_caps[] = { - { HNS3_CAPS_FD_QUEUE_REGION_B, "fd_queue_region" }, - { HNS3_CAPS_PTP_B, "ptp" }, -+ { HNS3_CAPS_SIMPLE_BD_B, "simple_bd" }, - { HNS3_CAPS_TX_PUSH_B, "tx_push" }, - { HNS3_CAPS_PHY_IMP_B, "phy_imp" }, - { HNS3_CAPS_TQP_TXRX_INDEP_B, "tqp_txrx_indep" }, -@@ -489,6 +490,8 @@ hns3_parse_capability(struct hns3_hw *hw, - hns3_warn(hw, "ignore PTP capability due to lack of " - "rxd advanced layout capability."); - } -+ if (hns3_get_bit(caps, HNS3_CAPS_SIMPLE_BD_B)) -+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_SIMPLE_BD_B, 1); - if (hns3_get_bit(caps, HNS3_CAPS_TX_PUSH_B)) - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_TX_PUSH_B, 1); - if (hns3_get_bit(caps, HNS3_CAPS_PHY_IMP_B)) -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index eb394c9dec..4abe0f1d13 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -313,6 +313,7 @@ enum HNS3_CAPS_BITS { - */ - HNS3_CAPS_FD_QUEUE_REGION_B = 2, - HNS3_CAPS_PTP_B, -+ HNS3_CAPS_SIMPLE_BD_B = 5, - HNS3_CAPS_TX_PUSH_B = 6, - HNS3_CAPS_PHY_IMP_B = 7, - HNS3_CAPS_TQP_TXRX_INDEP_B, -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 8268506f6f..a793ba64ad 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -96,6 +96,7 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - {HNS3_DEV_SUPPORT_TX_PUSH_B, "TX PUSH"}, - {HNS3_DEV_SUPPORT_INDEP_TXRX_B, "INDEP TXRX"}, - {HNS3_DEV_SUPPORT_STASH_B, "STASH"}, -+ {HNS3_DEV_SUPPORT_SIMPLE_BD_B, "SIMPLE BD"}, - {HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, "RXD Advanced Layout"}, - {HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, "OUTER UDP CKSUM"}, - {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 9acc5a3d7e..ee4dd18d7b 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -886,6 +886,7 @@ enum hns3_dev_cap { - HNS3_DEV_SUPPORT_TX_PUSH_B, - HNS3_DEV_SUPPORT_INDEP_TXRX_B, - HNS3_DEV_SUPPORT_STASH_B, -+ HNS3_DEV_SUPPORT_SIMPLE_BD_B, - HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, - HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, - HNS3_DEV_SUPPORT_RAS_IMP_B, -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 1f44c0345f..aaf0a06ca6 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -3046,6 +3046,10 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, - HNS3_PORT_BASE_VLAN_ENABLE; - else - txq->pvid_sw_shift_en = false; -+ -+ if (hns3_dev_get_support(hw, SIMPLE_BD)) -+ txq->simple_bd_enable = true; -+ - txq->max_non_tso_bd_num = hw->max_non_tso_bd_num; - txq->configured = true; - txq->io_base = (void *)((char *)hw->io_base + -@@ -3162,7 +3166,7 @@ hns3_set_tso(struct hns3_desc *desc, uint32_t paylen, struct rte_mbuf *rxm) - return; - - desc->tx.type_cs_vlan_tso_len |= rte_cpu_to_le_32(BIT(HNS3_TXD_TSO_B)); -- desc->tx.mss = rte_cpu_to_le_16(rxm->tso_segsz); -+ desc->tx.ckst_mss |= rte_cpu_to_le_16(rxm->tso_segsz); - } - - static inline void -@@ -3901,6 +3905,50 @@ hns3_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts, - return i; - } - -+static inline int -+hns3_handle_simple_bd(struct hns3_tx_queue *txq, struct hns3_desc *desc, -+ struct rte_mbuf *m) -+{ -+#define HNS3_TCP_CSUM_OFFSET 16 -+#define HNS3_UDP_CSUM_OFFSET 6 -+ -+ /* -+ * In HIP09, NIC HW support Tx simple BD mode that the HW will -+ * calculate the checksum from the start position of checksum and fill -+ * the checksum result to the offset position without packet type and -+ * header length of L3/L4. -+ * For non-tunneling packet: -+ * - Tx simple BD support for TCP and UDP checksum. -+ * For tunneling packet: -+ * - Tx simple BD support for inner L4 checksum(except sctp checksum). -+ * - Tx simple BD not support the outer checksum and the inner L3 -+ * checksum. -+ * - Besides, Tx simple BD is not support for TSO. -+ */ -+ if (txq->simple_bd_enable && !(m->ol_flags & RTE_MBUF_F_TX_IP_CKSUM) && -+ !(m->ol_flags & RTE_MBUF_F_TX_TCP_SEG) && -+ !(m->ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM) && -+ ((m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM || -+ (m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM)) { -+ /* set checksum start and offset, defined in 2 Bytes */ -+ hns3_set_field(desc->tx.type_cs_vlan_tso_len, -+ HNS3_TXD_L4_START_M, HNS3_TXD_L4_START_S, -+ (m->l2_len + m->l3_len) >> HNS3_SIMPLE_BD_UNIT); -+ hns3_set_field(desc->tx.ol_type_vlan_len_msec, -+ HNS3_TXD_L4_CKS_OFFSET_M, HNS3_TXD_L4_CKS_OFFSET_S, -+ (m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == -+ RTE_MBUF_F_TX_TCP_CKSUM ? -+ HNS3_TCP_CSUM_OFFSET >> HNS3_SIMPLE_BD_UNIT : -+ HNS3_UDP_CSUM_OFFSET >> HNS3_SIMPLE_BD_UNIT); -+ -+ hns3_set_bit(desc->tx.ckst_mss, HNS3_TXD_CKST_B, 1); -+ -+ return 0; -+ } -+ -+ return -ENOTSUP; -+} -+ - static int - hns3_parse_cksum(struct hns3_tx_queue *txq, uint16_t tx_desc_id, - struct rte_mbuf *m) -@@ -3910,6 +3958,8 @@ hns3_parse_cksum(struct hns3_tx_queue *txq, uint16_t tx_desc_id, - - /* Enable checksum offloading */ - if (m->ol_flags & HNS3_TX_CKSUM_OFFLOAD_MASK) { -+ if (hns3_handle_simple_bd(txq, desc, m) == 0) -+ return 0; - /* Fill in tunneling parameters if necessary */ - if (hns3_parse_tunneling_params(txq, m, tx_desc_id)) { - txq->dfx_stats.unsupported_tunnel_pkt_cnt++; -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index fa39f6481a..7685ac2ea3 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -134,6 +134,9 @@ - #define HNS3_TXD_L4LEN_S 24 - #define HNS3_TXD_L4LEN_M (0xffUL << HNS3_TXD_L4LEN_S) - -+#define HNS3_TXD_L4_START_S 8 -+#define HNS3_TXD_L4_START_M (0xffff << HNS3_TXD_L4_START_S) -+ - #define HNS3_TXD_OL3T_S 0 - #define HNS3_TXD_OL3T_M (0x3 << HNS3_TXD_OL3T_S) - #define HNS3_TXD_OVLAN_B 2 -@@ -141,6 +144,9 @@ - #define HNS3_TXD_TUNTYPE_S 4 - #define HNS3_TXD_TUNTYPE_M (0xf << HNS3_TXD_TUNTYPE_S) - -+#define HNS3_TXD_L4_CKS_OFFSET_S 8 -+#define HNS3_TXD_L4_CKS_OFFSET_M (0xffff << HNS3_TXD_L4_CKS_OFFSET_S) -+ - #define HNS3_TXD_BDTYPE_S 0 - #define HNS3_TXD_BDTYPE_M (0xf << HNS3_TXD_BDTYPE_S) - #define HNS3_TXD_FE_B 4 -@@ -157,10 +163,13 @@ - #define HNS3_TXD_MSS_S 0 - #define HNS3_TXD_MSS_M (0x3fff << HNS3_TXD_MSS_S) - -+#define HNS3_TXD_CKST_B 14 -+ - #define HNS3_TXD_OL4CS_B 22 - #define HNS3_L2_LEN_UNIT 1UL - #define HNS3_L3_LEN_UNIT 2UL - #define HNS3_L4_LEN_UNIT 2UL -+#define HNS3_SIMPLE_BD_UNIT 1UL - - #define HNS3_TXD_DEFAULT_BDTYPE 0 - #define HNS3_TXD_VLD_CMD (0x1 << HNS3_TXD_VLD_B) -@@ -247,7 +256,7 @@ struct hns3_desc { - - uint32_t paylen_fd_dop_ol4cs; - uint16_t tp_fe_sc_vld_ra_ri; -- uint16_t mss; -+ uint16_t ckst_mss; - } tx; - - struct { -@@ -488,6 +497,7 @@ struct hns3_tx_queue { - */ - uint16_t udp_cksum_mode:1; - -+ /* check whether the simple BD mode is supported */ - uint16_t simple_bd_enable:1; - uint16_t tx_push_enable:1; /* check whether the tx push is enabled */ - /* --- -2.23.0 - diff --git a/0286-net-hns3-support-dump-media-type.patch b/0286-net-hns3-support-dump-media-type.patch deleted file mode 100644 index 08e2e5c..0000000 --- a/0286-net-hns3-support-dump-media-type.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 8c4f049f4ed9885886d4f16332472df7d2bd4773 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 21 Apr 2023 17:53:22 +0800 -Subject: net/hns3: support dump media type - -[ upstream commit 5a4af56b354d412b1be460f65d2977fd56b21ef8 ] - -The media type information helps locate faults such as AN or rate -switching, so add dump media type in eth_dev_priv_dump ops. - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_dump.c | 2 ++ - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_ethdev.h | 2 ++ - 3 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index a793ba64ad..7daa54ec87 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -68,12 +68,14 @@ hns3_get_dev_mac_info(FILE *file, struct hns3_adapter *hns) - - fprintf(file, " - MAC Info:\n"); - fprintf(file, -+ "\t -- media_type=%s\n" - "\t -- query_type=%u\n" - "\t -- supported_speed=0x%x\n" - "\t -- advertising=0x%x\n" - "\t -- lp_advertising=0x%x\n" - "\t -- support_autoneg=%s\n" - "\t -- support_fc_autoneg=%s\n", -+ hns3_get_media_type_name(hw->mac.media_type), - hw->mac.query_type, - hw->mac.supported_speed, - hw->mac.advertising, -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 1c67ff2c99..12e7a72c36 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4891,7 +4891,7 @@ hns3_set_fiber_port_link_speed(struct hns3_hw *hw, - return hns3_cfg_mac_speed_dup(hw, cfg->speed, cfg->duplex); - } - --static const char * -+const char * - hns3_get_media_type_name(uint8_t media_type) - { - if (media_type == HNS3_MEDIA_TYPE_FIBER) -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index ee4dd18d7b..8268dba788 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1054,6 +1054,8 @@ int hns3_timesync_write_time(struct rte_eth_dev *dev, - const struct timespec *ts); - int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); - -+const char *hns3_get_media_type_name(uint8_t media_type); -+ - static inline bool - is_reset_pending(struct hns3_adapter *hns) - { --- -2.23.0 - diff --git a/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch b/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch deleted file mode 100644 index 2e8275d..0000000 --- a/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 9b1a4cdf89156605b4b5a5b1a5f5507423964dc9 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 19 May 2023 17:31:55 +0800 -Subject: [PATCH] ethdev: fix MAC address occupies two entries - -[ upstream commit 8f02f472a29432650d999969359d6a49ea6aadca ] - -The dev->data->mac_addrs[0] will be changed to a new MAC address when -applications modify the default MAC address by .mac_addr_set(). However, -if the new default one has been added as a non-default MAC address by -.mac_addr_add(), the .mac_addr_set() didn't check this address. -As a result, this MAC address occupies two entries in the list. Like: -add(MAC1) -add(MAC2) -add(MAC3) -add(MAC4) -set_default(MAC3) -default=MAC3, the rest of the list=MAC1, MAC2, MAC3, MAC4 -Note: MAC3 occupies two entries. - -But .mac_addr_set() cannot remove it implicitly in case of MAC address -shrinking in the list. -So this patch adds a check on whether the new default address was -already in the list and if so requires the user to remove it first. - -In addition, this patch documents the position of the default MAC -address and address unique in the list. - -Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Chengwen Feng -Acked-by: Thomas Monjalon -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/ethdev_driver.h | 6 +++++- - lib/ethdev/rte_ethdev.c | 10 ++++++++++ - lib/ethdev/rte_ethdev.h | 4 ++++ - 3 files changed, 19 insertions(+), 1 deletion(-) - -diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h -index d3de203d7a..6f539d45c6 100644 ---- a/lib/ethdev/ethdev_driver.h -+++ b/lib/ethdev/ethdev_driver.h -@@ -111,7 +111,11 @@ struct rte_eth_dev_data { - - uint64_t rx_mbuf_alloc_failed; /**< Rx ring mbuf allocation failures */ - -- /** Device Ethernet link address. @see rte_eth_dev_release_port() */ -+ /** -+ * Device Ethernet link addresses. -+ * All entries are unique. -+ * The first entry (index zero) is the default address. -+ */ - struct rte_ether_addr *mac_addrs; - /** Bitmap associating MAC addresses to pools */ - uint64_t mac_pool_sel[RTE_ETH_NUM_RECEIVE_MAC_ADDR]; -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 4e5499ad2d..bd5dac284d 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -4470,6 +4470,7 @@ int - rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) - { - struct rte_eth_dev *dev; -+ int index; - int ret; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -@@ -4487,6 +4488,15 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) - - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP); - -+ /* Keep address unique in dev->data->mac_addrs[]. */ -+ index = eth_dev_get_mac_addr_index(port_id, addr); -+ if (index > 0) { -+ RTE_ETHDEV_LOG(ERR, -+ "New default address for port %u was already in the address list. Please remove it first.\n", -+ port_id); -+ return -EEXIST; -+ } -+ - ret = (*dev->dev_ops->mac_addr_set)(dev, addr); - if (ret < 0) - return ret; -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index b262939a33..9df50c30b4 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -4167,6 +4167,9 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id, - - /** - * Set the default MAC address. -+ * It replaces the address at index 0 of the MAC address list. -+ * If the address was already in the MAC address list, -+ * please remove it first. - * - * @param port_id - * The port identifier of the Ethernet device. -@@ -4177,6 +4180,7 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id, - * - (-ENOTSUP) if hardware doesn't support. - * - (-ENODEV) if *port* invalid. - * - (-EINVAL) if MAC address is invalid. -+ * - (-EEXIST) if MAC address was already in the address list. - */ - int rte_eth_dev_default_mac_addr_set(uint16_t port_id, - struct rte_ether_addr *mac_addr); --- -2.23.0 - diff --git a/0288-net-hns3-fix-never-set-MAC-flow-control.patch b/0288-net-hns3-fix-never-set-MAC-flow-control.patch deleted file mode 100644 index a99c01f..0000000 --- a/0288-net-hns3-fix-never-set-MAC-flow-control.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 68c936210f151e6359bb770026a2d6b7a3bed43a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 22 May 2023 21:17:36 +0800 -Subject: net/hns3: fix never set MAC flow control - -[ upstream commit 73b4f0011f09c5a57776c9f4edaf2d88a3065053 ] - -When some hardware and firmware support speed auto-negotiation -but do not support flow control auto-negotiation, driver can -never successfully set MAC flow control by flow_ctrl_set() API. -So only tell user driver doesn't support flow control autoneg -when user enable it. - -Fixes: 1f411e31a826 ("net/hns3: support flow control autoneg for copper port") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 11 +---------- - 1 file changed, 1 insertion(+), 10 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 12e7a72c36..e01d5f76db 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5304,16 +5304,7 @@ hns3_check_fc_autoneg_valid(struct hns3_hw *hw, uint8_t autoneg) - - if (!pf->support_fc_autoneg) { - if (autoneg != 0) { -- hns3_err(hw, "unsupported fc auto-negotiation setting."); -- return -EOPNOTSUPP; -- } -- -- /* -- * Flow control auto-negotiation of the NIC is not supported, -- * but other auto-negotiation features may be supported. -- */ -- if (autoneg != hw->mac.link_autoneg) { -- hns3_err(hw, "please use 'link_speeds' in struct rte_eth_conf to disable autoneg!"); -+ hns3_err(hw, "unsupported fc auto-negotiation."); - return -EOPNOTSUPP; - } - --- -2.23.0 - diff --git a/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch b/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch deleted file mode 100644 index b402c1c..0000000 --- a/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch +++ /dev/null @@ -1,303 +0,0 @@ -From 1a547f79f8d9b412dd4d643107b134e653500865 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 22 May 2023 21:17:37 +0800 -Subject: net/hns3: add flow control autoneg for fiber port - -[ upstream commit ab0ddd9a0ad5adcc96eabd1fe49edbd2809f202e ] - -Support flow control autoneg for fiber and backplane port. -And it depends on the capability of firmware. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.c | 30 +++++++++++++++++- - drivers/net/hns3/hns3_cmd.h | 20 +++++++++++- - drivers/net/hns3/hns3_dump.c | 1 + - drivers/net/hns3/hns3_ethdev.c | 58 ++++++++-------------------------- - drivers/net/hns3/hns3_ethdev.h | 1 + - 5 files changed, 63 insertions(+), 47 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index d530650452..d0a3853656 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -428,7 +428,8 @@ hns3_get_caps_name(uint32_t caps_id) - { HNS3_CAPS_UDP_TUNNEL_CSUM_B, "udp_tunnel_csum" }, - { HNS3_CAPS_RAS_IMP_B, "ras_imp" }, - { HNS3_CAPS_RXD_ADV_LAYOUT_B, "rxd_adv_layout" }, -- { HNS3_CAPS_TM_B, "tm_capability" } -+ { HNS3_CAPS_TM_B, "tm_capability" }, -+ { HNS3_CAPS_FC_AUTO_B, "fc_autoneg" } - }; - uint32_t i; - -@@ -510,6 +511,8 @@ hns3_parse_capability(struct hns3_hw *hw, - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_RAS_IMP_B, 1); - if (hns3_get_bit(caps, HNS3_CAPS_TM_B)) - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_TM_B, 1); -+ if (hns3_get_bit(caps, HNS3_CAPS_FC_AUTO_B)) -+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FC_AUTO_B, 1); - } - - static uint32_t -@@ -613,9 +616,31 @@ hns3_update_dev_lsc_cap(struct hns3_hw *hw, int fw_compact_cmd_result) - } - } - -+static void -+hns3_set_fc_autoneg_cap(struct hns3_adapter *hns, int fw_compact_cmd_result) -+{ -+ struct hns3_hw *hw = &hns->hw; -+ struct hns3_mac *mac = &hw->mac; -+ -+ if (mac->media_type == HNS3_MEDIA_TYPE_COPPER) { -+ hns->pf.support_fc_autoneg = true; -+ return; -+ } -+ -+ /* -+ * Flow control auto-negotiation requires the cooperation of the driver -+ * and firmware. -+ */ -+ hns->pf.support_fc_autoneg = (hns3_dev_get_support(hw, FC_AUTO) && -+ fw_compact_cmd_result == 0) ? -+ true : false; -+} -+ - static int - hns3_apply_fw_compat_cmd_result(struct hns3_hw *hw, int result) - { -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ - if (result != 0 && hns3_dev_get_support(hw, COPPER)) { - hns3_err(hw, "firmware fails to initialize the PHY, ret = %d.", - result); -@@ -623,6 +648,7 @@ hns3_apply_fw_compat_cmd_result(struct hns3_hw *hw, int result) - } - - hns3_update_dev_lsc_cap(hw, result); -+ hns3_set_fc_autoneg_cap(hns, result); - - return 0; - } -@@ -642,6 +668,8 @@ hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init) - hns3_set_bit(compat, HNS3_NCSI_ERROR_REPORT_EN_B, 0); - if (hns3_dev_get_support(hw, COPPER)) - hns3_set_bit(compat, HNS3_FIRMWARE_PHY_DRIVER_EN_B, 1); -+ if (hns3_dev_get_support(hw, FC_AUTO)) -+ hns3_set_bit(compat, HNS3_MAC_FC_AUTONEG_EN_B, 1); - } - req->compat = rte_cpu_to_le_32(compat); - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 4abe0f1d13..d78c1b401e 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -323,6 +323,7 @@ enum HNS3_CAPS_BITS { - HNS3_CAPS_RAS_IMP_B, - HNS3_CAPS_RXD_ADV_LAYOUT_B = 15, - HNS3_CAPS_TM_B = 19, -+ HNS3_CAPS_FC_AUTO_B = 30, - }; - - /* Capabilities of VF dependent on the PF */ -@@ -666,6 +667,9 @@ enum hns3_promisc_type { - #define HNS3_LINK_EVENT_REPORT_EN_B 0 - #define HNS3_NCSI_ERROR_REPORT_EN_B 1 - #define HNS3_FIRMWARE_PHY_DRIVER_EN_B 2 -+ -+#define HNS3_MAC_FC_AUTONEG_EN_B 6 -+ - struct hns3_firmware_compat_cmd { - uint32_t compat; - uint8_t rsv[20]; -@@ -680,6 +684,7 @@ struct hns3_firmware_compat_cmd { - #define HNS3_PHY_LINK_MODE_AUTONEG_BIT BIT(6) - #define HNS3_PHY_LINK_MODE_PAUSE_BIT BIT(13) - #define HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT BIT(14) -+#define HNS3_PHY_LINK_MODE_PAUSE_S 13 - - #define HNS3_PHY_PARAM_CFG_BD_NUM 2 - struct hns3_phy_params_bd0_cmd { -@@ -789,6 +794,17 @@ struct hns3_sfp_type { - #define HNS3_FIBER_LINK_SPEED_10M_BIT BIT(7) - #define HNS3_FIBER_LINK_SPEED_200G_BIT BIT(8) - -+/* Flags for pause status field */ -+#define HNS3_FIBER_LOCAL_PAUSE_BIT BIT(0) -+#define HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT BIT(1) -+#define HNS3_FIBER_LP_PAUSE_BIT BIT(2) -+#define HNS3_FIBER_LP_ASYM_PAUSE_BIT BIT(3) -+#define HNS3_FIBER_LOCAL_PAUSE_MASK (HNS3_FIBER_LOCAL_PAUSE_BIT | \ -+ HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT) -+#define HNS3_FIBER_LP_PAUSE_MASK (HNS3_FIBER_LP_PAUSE_BIT | \ -+ HNS3_FIBER_LP_ASYM_PAUSE_BIT) -+#define HNS3_FIBER_LP_PAUSE_S 2 -+ - struct hns3_sfp_info_cmd { - uint32_t sfp_speed; - uint8_t query_type; /* 0: sfp speed, 1: active */ -@@ -798,7 +814,9 @@ struct hns3_sfp_info_cmd { - uint8_t autoneg_ability; - uint32_t supported_speed; /* speed supported by current media */ - uint32_t module_type; -- uint8_t rsv1[8]; -+ uint8_t rsv[2]; -+ uint8_t pause_status; -+ uint8_t rsv1[5]; - }; - - #define HNS3_MAC_CFG_FEC_AUTO_EN_B 0 -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 7daa54ec87..7ecfca8497 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -104,6 +104,7 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, - {HNS3_DEV_SUPPORT_TM_B, "TM"}, - {HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"}, -+ {HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"} - }; - uint32_t i; - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index e01d5f76db..8a7f6cc7be 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -3975,6 +3975,7 @@ static int - hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info) - { - struct hns3_sfp_info_cmd *resp; -+ uint32_t local_pause, lp_pause; - struct hns3_cmd_desc desc; - int ret; - -@@ -4011,6 +4012,13 @@ hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info) - mac_info->support_autoneg = resp->autoneg_ability; - mac_info->link_autoneg = (resp->autoneg == 0) ? RTE_ETH_LINK_FIXED - : RTE_ETH_LINK_AUTONEG; -+ local_pause = resp->pause_status & HNS3_FIBER_LOCAL_PAUSE_MASK; -+ lp_pause = (resp->pause_status & HNS3_FIBER_LP_PAUSE_MASK) >> -+ HNS3_FIBER_LP_PAUSE_S; -+ mac_info->advertising = -+ local_pause << HNS3_PHY_LINK_MODE_PAUSE_S; -+ mac_info->lp_advertising = -+ lp_pause << HNS3_PHY_LINK_MODE_PAUSE_S; - } else { - mac_info->query_type = HNS3_DEFAULT_QUERY; - } -@@ -4093,6 +4101,8 @@ hns3_update_fiber_link_info(struct hns3_hw *hw) - mac->supported_speed = mac_info.supported_speed; - mac->support_autoneg = mac_info.support_autoneg; - mac->link_autoneg = mac_info.link_autoneg; -+ mac->advertising = mac_info.advertising; -+ mac->lp_advertising = mac_info.lp_advertising; - - return 0; - } -@@ -4495,24 +4505,6 @@ hns3_get_port_supported_speed(struct rte_eth_dev *eth_dev) - return 0; - } - --static void --hns3_get_fc_autoneg_capability(struct hns3_adapter *hns) --{ -- struct hns3_mac *mac = &hns->hw.mac; -- -- if (mac->media_type == HNS3_MEDIA_TYPE_COPPER) { -- hns->pf.support_fc_autoneg = true; -- return; -- } -- -- /* -- * Flow control auto-negotiation requires the cooperation of the driver -- * and firmware. Currently, the optical port does not support flow -- * control auto-negotiation. -- */ -- hns->pf.support_fc_autoneg = false; --} -- - static int - hns3_init_pf(struct rte_eth_dev *eth_dev) - { -@@ -4615,8 +4607,6 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - goto err_supported_speed; - } - -- hns3_get_fc_autoneg_capability(hns); -- - hns3_tm_conf_init(eth_dev); - - return 0; -@@ -5181,8 +5171,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev) - } - - static void --hns3_get_autoneg_rxtx_pause_copper(struct hns3_hw *hw, bool *rx_pause, -- bool *tx_pause) -+hns3_get_autoneg_rxtx_pause(struct hns3_hw *hw, bool *rx_pause, bool *tx_pause) - { - struct hns3_mac *mac = &hw->mac; - uint32_t advertising = mac->advertising; -@@ -5193,8 +5182,7 @@ hns3_get_autoneg_rxtx_pause_copper(struct hns3_hw *hw, bool *rx_pause, - if (advertising & lp_advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT) { - *rx_pause = true; - *tx_pause = true; -- } else if (advertising & lp_advertising & -- HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT) { -+ } else if (advertising & lp_advertising & HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT) { - if (advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT) - *rx_pause = true; - else if (lp_advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT) -@@ -5209,26 +5197,7 @@ hns3_get_autoneg_fc_mode(struct hns3_hw *hw) - bool rx_pause = false; - bool tx_pause = false; - -- switch (hw->mac.media_type) { -- case HNS3_MEDIA_TYPE_COPPER: -- hns3_get_autoneg_rxtx_pause_copper(hw, &rx_pause, &tx_pause); -- break; -- -- /* -- * Flow control auto-negotiation is not supported for fiber and -- * backplane media type. -- */ -- case HNS3_MEDIA_TYPE_FIBER: -- case HNS3_MEDIA_TYPE_BACKPLANE: -- hns3_err(hw, "autoneg FC mode can't be obtained, but flow control auto-negotiation is enabled."); -- current_mode = hw->requested_fc_mode; -- goto out; -- default: -- hns3_err(hw, "autoneg FC mode can't be obtained for unknown media type(%u).", -- hw->mac.media_type); -- current_mode = HNS3_FC_NONE; -- goto out; -- } -+ hns3_get_autoneg_rxtx_pause(hw, &rx_pause, &tx_pause); - - if (rx_pause && tx_pause) - current_mode = HNS3_FC_FULL; -@@ -5239,7 +5208,6 @@ hns3_get_autoneg_fc_mode(struct hns3_hw *hw) - else - current_mode = HNS3_FC_NONE; - --out: - return current_mode; - } - -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 8268dba788..88146f5054 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -892,6 +892,7 @@ enum hns3_dev_cap { - HNS3_DEV_SUPPORT_RAS_IMP_B, - HNS3_DEV_SUPPORT_TM_B, - HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, -+ HNS3_DEV_SUPPORT_FC_AUTO_B, - }; - - #define hns3_dev_get_support(hw, _name) \ --- -2.23.0 - diff --git a/0290-net-hns3-fix-variable-type-mismatch.patch b/0290-net-hns3-fix-variable-type-mismatch.patch deleted file mode 100644 index 801d350..0000000 --- a/0290-net-hns3-fix-variable-type-mismatch.patch +++ /dev/null @@ -1,52 +0,0 @@ -From cae0ec81453b65080372918ea266b3e571fc6197 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 22 May 2023 21:17:38 +0800 -Subject: net/hns3: fix variable type mismatch - -[ upstream commit 84b195b9348810cb9ee2ac71f61ee4331b27d552 ] - -Loop conditions are compared with different variable types, -which may cause overflow risks. - -Fixes: 67d010346933 ("net/hns3: adjust data type of some variables") -Fixes: 6ee07e3cb589 ("net/hns3: fix insecure way to query MAC statistics") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_regs.c | 3 ++- - drivers/net/hns3/hns3_stats.c | 2 +- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_regs.c b/drivers/net/hns3/hns3_regs.c -index 33392fd1f0..5d6f92e4bb 100644 ---- a/drivers/net/hns3/hns3_regs.c -+++ b/drivers/net/hns3/hns3_regs.c -@@ -294,8 +294,9 @@ hns3_direct_access_regs(struct hns3_hw *hw, uint32_t *data) - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - uint32_t *origin_data_ptr = data; - uint32_t reg_offset; -- uint16_t i, j; - size_t reg_num; -+ uint16_t j; -+ size_t i; - - /* fetching per-PF registers values from PF PCIe register space */ - reg_num = sizeof(cmdq_reg_addrs) / sizeof(uint32_t); -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index bad65fcbed..c2e692a2c5 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -317,7 +317,7 @@ hns3_update_mac_stats(struct hns3_hw *hw) - uint32_t stats_iterms; - uint64_t *desc_data; - uint32_t desc_num; -- uint16_t i; -+ uint32_t i; - int ret; - - /* The first desc has a 64-bit header, so need to consider it. */ --- -2.23.0 - diff --git a/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch b/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch deleted file mode 100644 index 0273b41..0000000 --- a/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 307e0a26dd0c00b0e600e97c975f0e9d71b175a3 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Mon, 22 May 2023 21:17:39 +0800 -Subject: net/hns3: fix Rx multiple firmware reset interrupts - -[ upstream commit 312dd216fe75173016a4c5edce60bb1bea988315 ] - -In the firmware (also known as IMP) reset scenario, driver interrupt -processing and firmware watchdog initialization are asynchronous. - -If the driver interrupt processing is faster than firmware watchdog -initialization (that is, the driver clears the firmware reset -interrupt source before the firmware watchdog is initialized), the -driver will receive multiple firmware reset interrupts. - -In the Kunpeng 920 platform, the above situation does not exist. But -it does on the newer platforms. So we add 5ms delay before drivers -clears the IMP reset interrupt source. - -As for the impact of 5ms, the number of PFs managed by a firmware is -limited. Therefore, even if a DPDK process takes over all the PFs -which managed by the firmware, the delay is controllable. - -Fixes: ee930d38ffca ("net/hns3: fix timing of clearing interrupt source") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 8a7f6cc7be..c0df8f5d97 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -286,6 +286,19 @@ hns3_handle_mac_tnl(struct hns3_hw *hw) - } - } - -+static void -+hns3_delay_before_clear_event_cause(struct hns3_hw *hw, uint32_t event_type, uint32_t regclr) -+{ -+#define IMPRESET_WAIT_MS_TIME 5 -+ -+ if (event_type == HNS3_VECTOR0_EVENT_RST && -+ regclr & BIT(HNS3_VECTOR0_IMPRESET_INT_B) && -+ hw->revision >= PCI_REVISION_ID_HIP09_A) { -+ rte_delay_ms(IMPRESET_WAIT_MS_TIME); -+ hns3_dbg(hw, "wait firmware watchdog initialization completed."); -+ } -+} -+ - static void - hns3_interrupt_handler(void *param) - { -@@ -305,6 +318,7 @@ hns3_interrupt_handler(void *param) - vector0_int = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); - ras_int = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); - cmdq_int = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); -+ hns3_delay_before_clear_event_cause(hw, event_cause, clearval); - hns3_clear_event_cause(hw, event_cause, clearval); - /* vector 0 interrupt is shared with reset and mailbox source events. */ - if (event_cause == HNS3_VECTOR0_EVENT_ERR) { --- -2.23.0 - diff --git a/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch b/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch deleted file mode 100644 index 49a403b..0000000 --- a/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch +++ /dev/null @@ -1,132 +0,0 @@ -From 23e9f9ec10d6ef2cbb794d55c0018c76e393a9b0 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 22 May 2023 21:17:40 +0800 -Subject: net/hns3: add Tx/Rx descriptor logs - -[ upstream commit 7cd4df57fb216489979528d603d39a7a5d1529da ] - -Add Tx/Rx descriptor logs, controlled by 'RTE_ETHDEV_DEBUG_RX/TX' -compile time flag with 'pmd.net.hns3.rx/tx' log type. - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 6 ++++++ - drivers/net/hns3/hns3_logs.h | 18 ++++++++++++++++++ - drivers/net/hns3/hns3_rxtx.c | 4 ++++ - drivers/net/hns3/hns3_rxtx.h | 29 +++++++++++++++++++++++++++++ - 4 files changed, 57 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index c0df8f5d97..2fb9e68039 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6625,3 +6625,9 @@ RTE_PMD_REGISTER_PARAM_STRING(net_hns3, - HNS3_DEVARG_MBX_TIME_LIMIT_MS "= "); - RTE_LOG_REGISTER_SUFFIX(hns3_logtype_init, init, NOTICE); - RTE_LOG_REGISTER_SUFFIX(hns3_logtype_driver, driver, NOTICE); -+#ifdef RTE_ETHDEV_DEBUG_RX -+RTE_LOG_REGISTER_SUFFIX(hns3_logtype_rx, rx, DEBUG); -+#endif -+#ifdef RTE_ETHDEV_DEBUG_TX -+RTE_LOG_REGISTER_SUFFIX(hns3_logtype_tx, tx, DEBUG); -+#endif -diff --git a/drivers/net/hns3/hns3_logs.h b/drivers/net/hns3/hns3_logs.h -index c880f752ab..47d3a13220 100644 ---- a/drivers/net/hns3/hns3_logs.h -+++ b/drivers/net/hns3/hns3_logs.h -@@ -31,4 +31,22 @@ extern int hns3_logtype_driver; - #define hns3_dbg(hw, fmt, args...) \ - PMD_DRV_LOG_RAW(hw, RTE_LOG_DEBUG, fmt "\n", ## args) - -+#ifdef RTE_ETHDEV_DEBUG_RX -+extern int hns3_logtype_rx; -+#define PMD_RX_LOG(hw, level, fmt, args...) \ -+ rte_log(RTE_LOG_ ## level, hns3_logtype_rx, "%s %s(): " fmt "\n", \ -+ (hw)->data->name, __func__, ## args) -+#else -+#define PMD_RX_LOG(hw, level, fmt, args...) do { } while (0) -+#endif -+ -+#ifdef RTE_ETHDEV_DEBUG_TX -+extern int hns3_logtype_tx; -+#define PMD_TX_LOG(hw, level, fmt, args...) \ -+ rte_log(RTE_LOG_ ## level, hns3_logtype_tx, "%s %s(): " fmt "\n", \ -+ (hw)->data->name, __func__, ## args) -+#else -+#define PMD_TX_LOG(hw, level, fmt, args...) do { } while (0) -+#endif -+ - #endif /* HNS3_LOGS_H */ -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index aaf0a06ca6..e055b5415d 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -2618,6 +2618,7 @@ hns3_recv_scattered_pkts(void *rx_queue, - */ - rxd = rxdp[(bd_base_info & (1u << HNS3_RXD_VLD_B)) - - (1u << HNS3_RXD_VLD_B)]; -+ RX_BD_LOG(&rxq->hns->hw, DEBUG, &rxd); - - nmb = hns3_rx_alloc_buffer(rxq); - if (unlikely(nmb == NULL)) { -@@ -4274,6 +4275,8 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - tx_next_use = 0; - tx_bak_pkt = txq->sw_ring; - } -+ if (m_seg != NULL) -+ TX_BD_LOG(&txq->hns->hw, DEBUG, desc); - - i++; - } while (m_seg != NULL); -@@ -4281,6 +4284,7 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - /* Add end flag for the last Tx Buffer Descriptor */ - desc->tx.tp_fe_sc_vld_ra_ri |= - rte_cpu_to_le_16(BIT(HNS3_TXD_FE_B)); -+ TX_BD_LOG(&txq->hns->hw, DEBUG, desc); - - /* Increment bytes counter */ - txq->basic_stats.bytes += tx_pkt->pkt_len; -diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h -index 7685ac2ea3..b6a6513307 100644 ---- a/drivers/net/hns3/hns3_rxtx.h -+++ b/drivers/net/hns3/hns3_rxtx.h -@@ -553,6 +553,35 @@ struct hns3_tx_queue { - bool enabled; /* indicate if Tx queue has been enabled */ - }; - -+#define RX_BD_LOG(hw, level, rxdp) \ -+ PMD_RX_LOG(hw, level, "Rx descriptor: " \ -+ "l234_info=%#x pkt_len=%u size=%u rss_hash=%#x fd_id=%u vlan_tag=%u " \ -+ "o_dm_vlan_id_fb=%#x ot_vlan_tag=%u bd_base_info=%#x", \ -+ rte_le_to_cpu_32((rxdp)->rx.l234_info), \ -+ rte_le_to_cpu_16((rxdp)->rx.pkt_len), \ -+ rte_le_to_cpu_16((rxdp)->rx.size), \ -+ rte_le_to_cpu_32((rxdp)->rx.rss_hash), \ -+ rte_le_to_cpu_16((rxdp)->rx.fd_id), \ -+ rte_le_to_cpu_16((rxdp)->rx.vlan_tag), \ -+ rte_le_to_cpu_16((rxdp)->rx.o_dm_vlan_id_fb), \ -+ rte_le_to_cpu_16((rxdp)->rx.ot_vlan_tag), \ -+ rte_le_to_cpu_32((rxdp)->rx.bd_base_info)) -+ -+#define TX_BD_LOG(hw, level, txdp) \ -+ PMD_TX_LOG(hw, level, "Tx descriptor: " \ -+ "vlan_tag=%u send_size=%u type_cs_vlan_tso_len=%#x outer_vlan_tag=%u " \ -+ "tv=%#x ol_type_vlan_len_msec=%#x paylen_fd_dop_ol4cs=%#x " \ -+ "tp_fe_sc_vld_ra_ri=%#x ckst_mss=%u", \ -+ rte_le_to_cpu_16((txdp)->tx.vlan_tag), \ -+ rte_le_to_cpu_16((txdp)->tx.send_size), \ -+ rte_le_to_cpu_32((txdp)->tx.type_cs_vlan_tso_len), \ -+ rte_le_to_cpu_16((txdp)->tx.outer_vlan_tag), \ -+ rte_le_to_cpu_16((txdp)->tx.tv), \ -+ rte_le_to_cpu_32((txdp)->tx.ol_type_vlan_len_msec), \ -+ rte_le_to_cpu_32((txdp)->tx.paylen_fd_dop_ol4cs), \ -+ rte_le_to_cpu_16((txdp)->tx.tp_fe_sc_vld_ra_ri), \ -+ rte_le_to_cpu_16((txdp)->tx.ckst_mss)) -+ - #define HNS3_GET_TX_QUEUE_PEND_BD_NUM(txq) \ - ((txq)->nb_tx_desc - 1 - (txq)->tx_bd_ready) - --- -2.23.0 - diff --git a/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch b/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch deleted file mode 100644 index 57c720c..0000000 --- a/0293-net-hns3-fix-FEC-mode-for-200G-ports.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 6c8780bfc15e2a039dca70e615a3568032ebcf21 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:33 +0800 -Subject: net/hns3: fix FEC mode for 200G ports - -[ upstream commit 0ed9d6d08faf83dcaef02dc22edff2ee0f18c41a ] - -The hardware does not support NOFEC for 200G ports. So delete this -bit. - -Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 2fb9e68039..06d4752ab1 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -83,8 +83,7 @@ static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { - RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | - RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, - -- { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | -- RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | -+ { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | - RTE_ETH_FEC_MODE_CAPA_MASK(RS) } - }; - --- -2.23.0 - diff --git a/0294-net-hns3-fix-FEC-mode-check-error.patch b/0294-net-hns3-fix-FEC-mode-check-error.patch deleted file mode 100644 index 8249486..0000000 --- a/0294-net-hns3-fix-FEC-mode-check-error.patch +++ /dev/null @@ -1,108 +0,0 @@ -From be516a78df6de13d6e87aaae19dad374819fca19 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:34 +0800 -Subject: net/hns3: fix FEC mode check error - -[ upstream commit 5aba4e41d02222c5cf414b48876cff829f0b6a6f ] - -The function is_fec_mode_one_bit_set() is used to check whether -the binary of the mode from user only contains one '1'. But it -uses the bytes number this mode variable occupied to calculate -the count. So this patch uses __builtin_popcount() to replace it. - -This patch also extracts the code for verifying mode parameter into -a function. - -Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 50 ++++++++++++++++------------------ - 1 file changed, 24 insertions(+), 26 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 06d4752ab1..74e785c0cf 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -6139,52 +6139,50 @@ get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa) - return cur_capa; - } - --static bool --is_fec_mode_one_bit_set(uint32_t mode) --{ -- int cnt = 0; -- uint8_t i; -- -- for (i = 0; i < sizeof(mode); i++) -- if (mode >> i & 0x1) -- cnt++; -- -- return cnt == 1 ? true : false; --} -- - static int --hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode) -+hns3_fec_mode_valid(struct rte_eth_dev *dev, uint32_t mode) - { - #define FEC_CAPA_NUM 2 - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); -- struct hns3_pf *pf = &hns->pf; - struct rte_eth_fec_capa fec_capa[FEC_CAPA_NUM]; -- uint32_t cur_capa; - uint32_t num = FEC_CAPA_NUM; -+ uint32_t cur_capa; - int ret; - -- ret = hns3_fec_get_capability(dev, fec_capa, num); -- if (ret < 0) -- return ret; -- -- /* HNS3 PMD only support one bit set mode, e.g. 0x1, 0x4 */ -- if (!is_fec_mode_one_bit_set(mode)) { -- hns3_err(hw, "FEC mode(0x%x) not supported in HNS3 PMD, " -- "FEC mode should be only one bit set", mode); -+ if (__builtin_popcount(mode) != 1) { -+ hns3_err(hw, "FEC mode(0x%x) should be only one bit set", mode); - return -EINVAL; - } - -+ ret = hns3_fec_get_capability(dev, fec_capa, num); -+ if (ret < 0) -+ return ret; - /* - * Check whether the configured mode is within the FEC capability. - * If not, the configured mode will not be supported. - */ - cur_capa = get_current_speed_fec_cap(hw, fec_capa); -- if (!(cur_capa & mode)) { -- hns3_err(hw, "unsupported FEC mode = 0x%x", mode); -+ if ((cur_capa & mode) == 0) { -+ hns3_err(hw, "unsupported FEC mode(0x%x)", mode); - return -EINVAL; - } - -+ return 0; -+} -+ -+static int -+hns3_fec_set(struct rte_eth_dev *dev, uint32_t mode) -+{ -+ struct hns3_adapter *hns = dev->data->dev_private; -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); -+ struct hns3_pf *pf = &hns->pf; -+ int ret; -+ -+ ret = hns3_fec_mode_valid(dev, mode); -+ if (ret != 0) -+ return ret; -+ - rte_spinlock_lock(&hw->lock); - ret = hns3_set_fec_hw(hw, mode); - if (ret) { --- -2.23.0 - diff --git a/0295-net-hns3-fix-missing-FEC-capability.patch b/0295-net-hns3-fix-missing-FEC-capability.patch deleted file mode 100644 index 7e8e303..0000000 --- a/0295-net-hns3-fix-missing-FEC-capability.patch +++ /dev/null @@ -1,222 +0,0 @@ -From 19c77a23c28779fdbaca1e477749bcb3a9c3ecdd Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:35 +0800 -Subject: net/hns3: fix missing FEC capability - -[ upstream commit f611c42363f434d62500b7c7f4b7ecaa46774bdd ] - -Currently, FEC capabilities are reported based on the device ID. -And a device ID is bound to only one or two rates. So some cases -hns3 driver only reports the FEC capabilities corresponding to -the rate. But hns3 supports speed switching function, which causes -the FEC capabilities of other rates are not reported. So this patch -reports the FEC capabilities by the speed capabilities of the -network port. - -Fixes: 9bf2ea8dbc65 ("net/hns3: support FEC") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 129 ++++++++++++--------------------- - 1 file changed, 45 insertions(+), 84 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 74e785c0cf..05d489a12b 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -60,6 +60,13 @@ enum hns3_evt_cause { - HNS3_VECTOR0_EVENT_OTHER, - }; - -+#define HNS3_SPEEDS_SUPP_FEC (RTE_ETH_LINK_SPEED_10G | \ -+ RTE_ETH_LINK_SPEED_25G | \ -+ RTE_ETH_LINK_SPEED_40G | \ -+ RTE_ETH_LINK_SPEED_50G | \ -+ RTE_ETH_LINK_SPEED_100G | \ -+ RTE_ETH_LINK_SPEED_200G) -+ - static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { - { RTE_ETH_SPEED_NUM_10G, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) | - RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | -@@ -5900,56 +5907,27 @@ hns3_reset_service(void *param) - hns3_msix_process(hns, reset_level); - } - --static unsigned int --hns3_get_speed_capa_num(uint16_t device_id) -+static uint32_t -+hns3_get_speed_fec_capa(struct rte_eth_fec_capa *speed_fec_capa, -+ uint32_t speed_capa) - { -- unsigned int num; -- -- switch (device_id) { -- case HNS3_DEV_ID_25GE: -- case HNS3_DEV_ID_25GE_RDMA: -- num = 2; -- break; -- case HNS3_DEV_ID_100G_RDMA_MACSEC: -- case HNS3_DEV_ID_200G_RDMA: -- num = 1; -- break; -- default: -- num = 0; -- break; -- } -+ uint32_t speed_bit; -+ uint32_t num = 0; -+ uint32_t i; - -- return num; --} -+ for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { -+ speed_bit = -+ rte_eth_speed_bitflag(speed_fec_capa_tbl[i].speed, -+ RTE_ETH_LINK_FULL_DUPLEX); -+ if ((speed_capa & speed_bit) == 0) -+ continue; - --static int --hns3_get_speed_fec_capa(struct rte_eth_fec_capa *speed_fec_capa, -- uint16_t device_id) --{ -- switch (device_id) { -- case HNS3_DEV_ID_25GE: -- /* fallthrough */ -- case HNS3_DEV_ID_25GE_RDMA: -- speed_fec_capa[0].speed = speed_fec_capa_tbl[1].speed; -- speed_fec_capa[0].capa = speed_fec_capa_tbl[1].capa; -- -- /* In HNS3 device, the 25G NIC is compatible with 10G rate */ -- speed_fec_capa[1].speed = speed_fec_capa_tbl[0].speed; -- speed_fec_capa[1].capa = speed_fec_capa_tbl[0].capa; -- break; -- case HNS3_DEV_ID_100G_RDMA_MACSEC: -- speed_fec_capa[0].speed = speed_fec_capa_tbl[4].speed; -- speed_fec_capa[0].capa = speed_fec_capa_tbl[4].capa; -- break; -- case HNS3_DEV_ID_200G_RDMA: -- speed_fec_capa[0].speed = speed_fec_capa_tbl[5].speed; -- speed_fec_capa[0].capa = speed_fec_capa_tbl[5].capa; -- break; -- default: -- return -ENOTSUP; -+ speed_fec_capa[num].speed = speed_fec_capa_tbl[i].speed; -+ speed_fec_capa[num].capa = speed_fec_capa_tbl[i].capa; -+ num++; - } - -- return 0; -+ return num; - } - - static int -@@ -5958,28 +5936,28 @@ hns3_fec_get_capability(struct rte_eth_dev *dev, - unsigned int num) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev); -- uint16_t device_id = pci_dev->id.device_id; -- unsigned int capa_num; -- int ret; -+ unsigned int speed_num; -+ uint32_t speed_capa; - -- capa_num = hns3_get_speed_capa_num(device_id); -- if (capa_num == 0) { -- hns3_err(hw, "device(0x%x) is not supported by hns3 PMD", -- device_id); -+ speed_capa = hns3_get_speed_capa(hw); -+ /* speed_num counts number of speed capabilities */ -+ speed_num = __builtin_popcount(speed_capa & HNS3_SPEEDS_SUPP_FEC); -+ if (speed_num == 0) - return -ENOTSUP; -- } - -- if (speed_fec_capa == NULL || num < capa_num) -- return capa_num; -+ if (speed_fec_capa == NULL) -+ return speed_num; - -- ret = hns3_get_speed_fec_capa(speed_fec_capa, device_id); -- if (ret) -- return -ENOTSUP; -+ if (num < speed_num) { -+ hns3_err(hw, "not enough array size(%u) to store FEC capabilities, should not be less than %u", -+ num, speed_num); -+ return -EINVAL; -+ } - -- return capa_num; -+ return hns3_get_speed_fec_capa(speed_fec_capa, speed_capa); - } - -+ - static int - get_current_fec_auto_state(struct hns3_hw *hw, uint8_t *state) - { -@@ -6117,52 +6095,35 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) - } - - static uint32_t --get_current_speed_fec_cap(struct hns3_hw *hw, struct rte_eth_fec_capa *fec_capa) -+hns3_get_current_speed_fec_cap(struct hns3_mac *mac) - { -- struct hns3_mac *mac = &hw->mac; -- uint32_t cur_capa; -+ uint32_t i; - -- switch (mac->link_speed) { -- case RTE_ETH_SPEED_NUM_10G: -- cur_capa = fec_capa[1].capa; -- break; -- case RTE_ETH_SPEED_NUM_25G: -- case RTE_ETH_SPEED_NUM_100G: -- case RTE_ETH_SPEED_NUM_200G: -- cur_capa = fec_capa[0].capa; -- break; -- default: -- cur_capa = 0; -- break; -+ for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { -+ if (mac->link_speed == speed_fec_capa_tbl[i].speed) -+ return speed_fec_capa_tbl[i].capa; - } - -- return cur_capa; -+ return 0; - } - - static int - hns3_fec_mode_valid(struct rte_eth_dev *dev, uint32_t mode) - { --#define FEC_CAPA_NUM 2 - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(hns); -- struct rte_eth_fec_capa fec_capa[FEC_CAPA_NUM]; -- uint32_t num = FEC_CAPA_NUM; - uint32_t cur_capa; -- int ret; - - if (__builtin_popcount(mode) != 1) { - hns3_err(hw, "FEC mode(0x%x) should be only one bit set", mode); - return -EINVAL; - } - -- ret = hns3_fec_get_capability(dev, fec_capa, num); -- if (ret < 0) -- return ret; - /* - * Check whether the configured mode is within the FEC capability. - * If not, the configured mode will not be supported. - */ -- cur_capa = get_current_speed_fec_cap(hw, fec_capa); -+ cur_capa = hns3_get_current_speed_fec_cap(&hw->mac); - if ((cur_capa & mode) == 0) { - hns3_err(hw, "unsupported FEC mode(0x%x)", mode); - return -EINVAL; --- -2.23.0 - diff --git a/0296-ethdev-introduce-low-latency-RS-FEC.patch b/0296-ethdev-introduce-low-latency-RS-FEC.patch deleted file mode 100644 index a396ccd..0000000 --- a/0296-ethdev-introduce-low-latency-RS-FEC.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 7b36a2f27f2dbe8cd518885461473349a2c04314 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:36 +0800 -Subject: ethdev: introduce low latency RS FEC - -[ upstream commit 371c8ec7498f9ea41c84d5d1fe0ab7d44e1325b9 ] - -This patch introduces LLRS (low latency Reed Solomon FEC). -LLRS supports for 25 Gbps, 50 Gbps, 100 Gbps, 200 Gbps and -400 Gbps Ethernet networks. - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 9df50c30b4..2064d439c8 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -1973,6 +1973,7 @@ enum rte_eth_fec_mode { - RTE_ETH_FEC_AUTO, /**< FEC autonegotiation modes */ - RTE_ETH_FEC_BASER, /**< FEC using common algorithm */ - RTE_ETH_FEC_RS, /**< FEC using RS algorithm */ -+ RTE_ETH_FEC_LLRS, /**< FEC using LLRS algorithm */ - }; - - /* Translate from FEC mode to FEC capa */ --- -2.23.0 - diff --git a/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch b/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch deleted file mode 100644 index 0d974e3..0000000 --- a/0297-app-testpmd-add-setting-and-querying-of-LLRS-FEC-mod.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 8f50b71d99a1a071b62c3b36a11a95398fc863c3 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:37 +0800 -Subject: app/testpmd: add setting and querying of LLRS FEC mode - -[ upstream commit 6cb1eaa6f2cd024a8c56e15e4a23ada7f9006aae ] - -This patch supports setting and querying of LLRS FEC mode. - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Aman Singh ---- - app/test-pmd/cmdline.c | 5 ++++- - app/test-pmd/config.c | 4 ++++ - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 2 +- - 3 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 9e0e725913..0d9c7d449c 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -17078,6 +17078,9 @@ cmd_show_fec_mode_parsed(void *parsed_result, - case RTE_ETH_FEC_MODE_CAPA_MASK(RS): - strlcpy(buf, "rs", sizeof(buf)); - break; -+ case RTE_ETH_FEC_MODE_CAPA_MASK(LLRS): -+ strlcpy(buf, "llrs", sizeof(buf)); -+ break; - default: - return; - } -@@ -17173,7 +17176,7 @@ cmd_set_port_fec_mode_parsed( - cmdline_parse_inst_t cmd_set_fec_mode = { - .f = cmd_set_port_fec_mode_parsed, - .data = NULL, -- .help_str = "set port fec_mode auto|off|rs|baser", -+ .help_str = "set port fec_mode auto|off|rs|baser|llrs", - .tokens = { - (void *)&cmd_set_port_fec_mode_set, - (void *)&cmd_set_port_fec_mode_port, -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 78af232a8a..22c63e214e 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -167,6 +167,10 @@ static const struct { - .mode = RTE_ETH_FEC_RS, - .name = "rs", - }, -+ { -+ .mode = RTE_ETH_FEC_LLRS, -+ .name = "llrs", -+ }, - }; - - static void -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index e0edd349bc..ecf89aa46c 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -1993,7 +1993,7 @@ Set fec mode - - Set fec mode for a specific port:: - -- testpmd> set port (port_id) fec_mode auto|off|rs|baser -+ testpmd> set port (port_id) fec_mode auto|off|rs|baser|llrs - - Config Sample actions list - ~~~~~~~~~~~~~~~~~~~~~~~~~~ --- -2.23.0 - diff --git a/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch b/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch deleted file mode 100644 index 3fecbb1..0000000 --- a/0298-net-hns3-add-LLRS-FEC-mode-support-for-200G-ports.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 85597c087e93576197c6e11d41caab7d8f43dbeb Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:38 +0800 -Subject: net/hns3: add LLRS FEC mode support for 200G ports - -[ upstream commit cddeaee10f974bda1202e82e36a3d8f09450e80a ] - -This patch supports the query and configuration of LLRS FEC mode. - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.c | 1 + - drivers/net/hns3/hns3_cmd.h | 2 ++ - drivers/net/hns3/hns3_ethdev.c | 21 ++++++++++++--------- - 3 files changed, 15 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index d0a3853656..ca1d3f1b8c 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -666,6 +666,7 @@ hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init) - if (is_init) { - hns3_set_bit(compat, HNS3_LINK_EVENT_REPORT_EN_B, 1); - hns3_set_bit(compat, HNS3_NCSI_ERROR_REPORT_EN_B, 0); -+ hns3_set_bit(compat, HNS3_LLRS_FEC_EN_B, 1); - if (hns3_dev_get_support(hw, COPPER)) - hns3_set_bit(compat, HNS3_FIRMWARE_PHY_DRIVER_EN_B, 1); - if (hns3_dev_get_support(hw, FC_AUTO)) -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index d78c1b401e..929278521f 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -668,6 +668,7 @@ enum hns3_promisc_type { - #define HNS3_NCSI_ERROR_REPORT_EN_B 1 - #define HNS3_FIRMWARE_PHY_DRIVER_EN_B 2 - -+#define HNS3_LLRS_FEC_EN_B 5 - #define HNS3_MAC_FC_AUTONEG_EN_B 6 - - struct hns3_firmware_compat_cmd { -@@ -825,6 +826,7 @@ struct hns3_sfp_info_cmd { - #define HNS3_MAC_FEC_OFF 0 - #define HNS3_MAC_FEC_BASER 1 - #define HNS3_MAC_FEC_RS 2 -+#define HNS3_MAC_FEC_LLRS 3 - - /* Configure FEC mode, opcode:0x031A */ - struct hns3_config_fec_cmd { -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 05d489a12b..2ca5e4ced5 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -47,11 +47,6 @@ - #define HNS3_RESET_WAIT_MS 100 - #define HNS3_RESET_WAIT_CNT 200 - --/* FEC mode order defined in HNS3 hardware */ --#define HNS3_HW_FEC_MODE_NOFEC 0 --#define HNS3_HW_FEC_MODE_BASER 1 --#define HNS3_HW_FEC_MODE_RS 2 -- - enum hns3_evt_cause { - HNS3_VECTOR0_EVENT_RST, - HNS3_VECTOR0_EVENT_MBX, -@@ -91,7 +86,8 @@ static const struct rte_eth_fec_capa speed_fec_capa_tbl[] = { - RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, - - { RTE_ETH_SPEED_NUM_200G, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) | -- RTE_ETH_FEC_MODE_CAPA_MASK(RS) } -+ RTE_ETH_FEC_MODE_CAPA_MASK(RS) | -+ RTE_ETH_FEC_MODE_CAPA_MASK(LLRS) } - }; - - static enum hns3_reset_level hns3_get_reset_level(struct hns3_adapter *hns, -@@ -6032,15 +6028,18 @@ hns3_fec_get_internal(struct hns3_hw *hw, uint32_t *fec_capa) - * to be converted. - */ - switch (resp->active_fec) { -- case HNS3_HW_FEC_MODE_NOFEC: -+ case HNS3_MAC_FEC_OFF: - tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); - break; -- case HNS3_HW_FEC_MODE_BASER: -+ case HNS3_MAC_FEC_BASER: - tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(BASER); - break; -- case HNS3_HW_FEC_MODE_RS: -+ case HNS3_MAC_FEC_RS: - tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(RS); - break; -+ case HNS3_MAC_FEC_LLRS: -+ tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(LLRS); -+ break; - default: - tmp_fec_capa = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); - break; -@@ -6081,6 +6080,10 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) - hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, - HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_RS); - break; -+ case RTE_ETH_FEC_MODE_CAPA_MASK(LLRS): -+ hns3_set_field(req->fec_mode, HNS3_MAC_CFG_FEC_MODE_M, -+ HNS3_MAC_CFG_FEC_MODE_S, HNS3_MAC_FEC_LLRS); -+ break; - case RTE_ETH_FEC_MODE_CAPA_MASK(AUTO): - hns3_set_bit(req->fec_mode, HNS3_MAC_CFG_FEC_AUTO_EN_B, 1); - break; --- -2.23.0 - diff --git a/0299-net-hns3-get-current-FEC-capability-from-firmware.patch b/0299-net-hns3-get-current-FEC-capability-from-firmware.patch deleted file mode 100644 index b0baa4b..0000000 --- a/0299-net-hns3-get-current-FEC-capability-from-firmware.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 02fad185915874c196d03966947a5b705b9bdff4 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Sat, 8 Apr 2023 10:27:39 +0800 -Subject: net/hns3: get current FEC capability from firmware - -[ upstream commit 7a475771aeb1d4f74a6bfd03a68462eb85151738 ] - -Obtain the supported FEC capability from the firmware to -enhance code compatibility. - -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_cmd.h | 9 ++++++++- - drivers/net/hns3/hns3_ethdev.c | 29 +++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_ethdev.h | 2 ++ - 3 files changed, 39 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 929278521f..3f2bb4fd29 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -795,6 +795,12 @@ struct hns3_sfp_type { - #define HNS3_FIBER_LINK_SPEED_10M_BIT BIT(7) - #define HNS3_FIBER_LINK_SPEED_200G_BIT BIT(8) - -+#define HNS3_FIBER_FEC_AUTO_BIT BIT(0) -+#define HNS3_FIBER_FEC_BASER_BIT BIT(1) -+#define HNS3_FIBER_FEC_RS_BIT BIT(2) -+#define HNS3_FIBER_FEC_LLRS_BIT BIT(3) -+#define HNS3_FIBER_FEC_NOFEC_BIT BIT(4) -+ - /* Flags for pause status field */ - #define HNS3_FIBER_LOCAL_PAUSE_BIT BIT(0) - #define HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT BIT(1) -@@ -815,7 +821,8 @@ struct hns3_sfp_info_cmd { - uint8_t autoneg_ability; - uint32_t supported_speed; /* speed supported by current media */ - uint32_t module_type; -- uint8_t rsv[2]; -+ uint8_t fec_ability; /* supported fec modes, see HNS3_FIBER_FEC_XXX_BIT */ -+ uint8_t rsv0; - uint8_t pause_status; - uint8_t rsv1[5]; - }; -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 2ca5e4ced5..d6214415b7 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4028,6 +4028,7 @@ hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info) - mac_info->support_autoneg = resp->autoneg_ability; - mac_info->link_autoneg = (resp->autoneg == 0) ? RTE_ETH_LINK_FIXED - : RTE_ETH_LINK_AUTONEG; -+ mac_info->fec_capa = resp->fec_ability; - local_pause = resp->pause_status & HNS3_FIBER_LOCAL_PAUSE_MASK; - lp_pause = (resp->pause_status & HNS3_FIBER_LP_PAUSE_MASK) >> - HNS3_FIBER_LP_PAUSE_S; -@@ -4117,6 +4118,7 @@ hns3_update_fiber_link_info(struct hns3_hw *hw) - mac->supported_speed = mac_info.supported_speed; - mac->support_autoneg = mac_info.support_autoneg; - mac->link_autoneg = mac_info.link_autoneg; -+ mac->fec_capa = mac_info.fec_capa; - mac->advertising = mac_info.advertising; - mac->lp_advertising = mac_info.lp_advertising; - -@@ -6097,11 +6099,38 @@ hns3_set_fec_hw(struct hns3_hw *hw, uint32_t mode) - return ret; - } - -+static uint32_t -+hns3_parse_hw_fec_capa(uint8_t hw_fec_capa) -+{ -+ const struct { -+ uint32_t hw_fec_capa; -+ uint32_t fec_capa; -+ } fec_capa_map[] = { -+ { HNS3_FIBER_FEC_AUTO_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(AUTO) }, -+ { HNS3_FIBER_FEC_BASER_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(BASER) }, -+ { HNS3_FIBER_FEC_RS_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(RS) }, -+ { HNS3_FIBER_FEC_LLRS_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(LLRS) }, -+ { HNS3_FIBER_FEC_NOFEC_BIT, RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) }, -+ }; -+ uint32_t capa = 0; -+ uint32_t i; -+ -+ for (i = 0; i < RTE_DIM(fec_capa_map); i++) { -+ if ((hw_fec_capa & fec_capa_map[i].hw_fec_capa) != 0) -+ capa |= fec_capa_map[i].fec_capa; -+ } -+ -+ return capa; -+} -+ - static uint32_t - hns3_get_current_speed_fec_cap(struct hns3_mac *mac) - { - uint32_t i; - -+ if (mac->fec_capa != 0) -+ return hns3_parse_hw_fec_capa(mac->fec_capa); -+ - for (i = 0; i < RTE_DIM(speed_fec_capa_tbl); i++) { - if (mac->link_speed == speed_fec_capa_tbl[i].speed) - return speed_fec_capa_tbl[i].capa; -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 88146f5054..c04edf622f 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -214,6 +214,8 @@ struct hns3_mac { - uint32_t advertising; /* advertised capability in the local part */ - uint32_t lp_advertising; /* advertised capability in the link partner */ - uint8_t support_autoneg; -+ /* current supported fec modes. see HNS3_FIBER_FEC_XXX_BIT */ -+ uint32_t fec_capa; - }; - - struct hns3_fake_queue_data { --- -2.23.0 - diff --git a/0300-net-hns3-fix-RTC-time-on-initialization.patch b/0300-net-hns3-fix-RTC-time-on-initialization.patch deleted file mode 100644 index 2a5d381..0000000 --- a/0300-net-hns3-fix-RTC-time-on-initialization.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 6896b9dc63327691df470cc7b1d9bac8e8c673fe Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 2 Jun 2023 19:41:55 +0800 -Subject: net/hns3: fix RTC time on initialization - -[ upstream commit 27f64ddb711901d06bbe337ab714989e799a36d0 ] - -Driver doesn't initialize RTC time during probe phase, which -lead to an inaccurate time. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ptp.c | 26 +++++++++++++++++++------- - 1 file changed, 19 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index db3c007b12..1e27e4aeca 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -56,9 +56,23 @@ hns3_ptp_int_en(struct hns3_hw *hw, bool en) - return ret; - } - -+static void -+hns3_ptp_timesync_write_time(struct hns3_hw *hw, const struct timespec *ts) -+{ -+ uint64_t sec = ts->tv_sec; -+ uint64_t ns = ts->tv_nsec; -+ -+ /* Set the timecounters to a new value. */ -+ hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_H, upper_32_bits(sec)); -+ hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_M, lower_32_bits(sec)); -+ hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_L, lower_32_bits(ns)); -+ hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_RDY, 1); -+} -+ - int - hns3_ptp_init(struct hns3_hw *hw) - { -+ struct timespec sys_time; - int ret; - - if (!hns3_dev_get_support(hw, PTP)) -@@ -71,6 +85,10 @@ hns3_ptp_init(struct hns3_hw *hw) - /* Start PTP timer */ - hns3_write_dev(hw, HNS3_CFG_TIME_CYC_EN, 1); - -+ /* Initializing the RTC. */ -+ clock_gettime(CLOCK_REALTIME, &sys_time); -+ hns3_ptp_timesync_write_time(hw, &sys_time); -+ - return 0; - } - -@@ -241,17 +259,11 @@ int - hns3_timesync_write_time(struct rte_eth_dev *dev, const struct timespec *ts) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- uint64_t sec = ts->tv_sec; -- uint64_t ns = ts->tv_nsec; - - if (!hns3_dev_get_support(hw, PTP)) - return -ENOTSUP; - -- /* Set the timecounters to a new value. */ -- hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_H, upper_32_bits(sec)); -- hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_M, lower_32_bits(sec)); -- hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_L, lower_32_bits(ns)); -- hns3_write_dev(hw, HNS3_CFG_TIME_SYNC_RDY, 1); -+ hns3_ptp_timesync_write_time(hw, ts); - - return 0; - } --- -2.23.0 - diff --git a/0301-net-hns3-fix-RTC-time-after-reset.patch b/0301-net-hns3-fix-RTC-time-after-reset.patch deleted file mode 100644 index 500dd3c..0000000 --- a/0301-net-hns3-fix-RTC-time-after-reset.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 974c06500687f166870e57a998fcdbb82f5d3628 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 2 Jun 2023 19:41:56 +0800 -Subject: net/hns3: fix RTC time after reset - -[ upstream commit 0335c1f3c43a7da75fe5e2ab7bac0422cfad99e3 ] - -The enabled status of RTC time will be cleared after global -or IMP reset, which cause the local RTC time doesn't work. -So this patch fix it. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index d6214415b7..cecf6929f7 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4416,6 +4416,12 @@ hns3_init_hardware(struct hns3_adapter *hns) - goto err_mac_init; - } - -+ ret = hns3_ptp_init(hw); -+ if (ret) { -+ PMD_INIT_LOG(ERR, "Failed to init PTP, ret = %d", ret); -+ goto err_mac_init; -+ } -+ - return 0; - - err_mac_init: -@@ -4577,10 +4583,6 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - goto err_intr_callback_register; - } - -- ret = hns3_ptp_init(hw); -- if (ret) -- goto err_get_config; -- - /* Enable interrupt */ - rte_intr_enable(pci_dev->intr_handle); - hns3_pf_enable_irq0(hw); --- -2.23.0 - diff --git a/0302-net-hns3-uninitialize-PTP.patch b/0302-net-hns3-uninitialize-PTP.patch deleted file mode 100644 index fa9d0aa..0000000 --- a/0302-net-hns3-uninitialize-PTP.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 35a0d98f028f8d1b37fec44dc9b1b5eec5e0a84e Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 2 Jun 2023 19:41:57 +0800 -Subject: net/hns3: uninitialize PTP - -[ upstream commit edb0f566d8476978fa6c12467fe03c4983a28573 ] - -This patch adds the uninitialization process of PTP in case -of having an impact on PF driver in kernel. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 2 ++ - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_ptp.c | 18 ++++++++++++++++++ - 3 files changed, 21 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index cecf6929f7..2e3aaf191d 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -4637,6 +4637,7 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - hns3_fdir_filter_uninit(hns); - err_fdir: - hns3_uninit_umv_space(hw); -+ hns3_ptp_uninit(hw); - err_init_hw: - hns3_stats_uninit(hw); - err_get_config: -@@ -4672,6 +4673,7 @@ hns3_uninit_pf(struct rte_eth_dev *eth_dev) - hns3_flow_uninit(eth_dev); - hns3_fdir_filter_uninit(hns); - hns3_uninit_umv_space(hw); -+ hns3_ptp_uninit(hw); - hns3_stats_uninit(hw); - hns3_config_mac_tnl_int(hw, false); - hns3_pf_disable_irq0(hw); -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index c04edf622f..9456204422 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1045,6 +1045,7 @@ int hns3_restore_ptp(struct hns3_adapter *hns); - int hns3_mbuf_dyn_rx_timestamp_register(struct rte_eth_dev *dev, - struct rte_eth_conf *conf); - int hns3_ptp_init(struct hns3_hw *hw); -+void hns3_ptp_uninit(struct hns3_hw *hw); - int hns3_timesync_enable(struct rte_eth_dev *dev); - int hns3_timesync_disable(struct rte_eth_dev *dev); - int hns3_timesync_read_rx_timestamp(struct rte_eth_dev *dev, -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 1e27e4aeca..0e17a17034 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -306,3 +306,21 @@ hns3_restore_ptp(struct hns3_adapter *hns) - - return ret; - } -+ -+void -+hns3_ptp_uninit(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ int ret; -+ -+ if (!hns3_dev_get_support(hw, PTP)) -+ return; -+ -+ ret = hns3_ptp_int_en(hw, false); -+ if (ret != 0) -+ hns3_err(hw, "disable PTP interrupt failed, ret = %d.", ret); -+ -+ ret = hns3_timesync_configure(hns, false); -+ if (ret != 0) -+ hns3_err(hw, "disable timesync failed, ret = %d.", ret); -+} --- -2.23.0 - diff --git a/0303-net-hns3-extract-PTP-to-its-own-header-file.patch b/0303-net-hns3-extract-PTP-to-its-own-header-file.patch deleted file mode 100644 index 2b64c25..0000000 --- a/0303-net-hns3-extract-PTP-to-its-own-header-file.patch +++ /dev/null @@ -1,168 +0,0 @@ -From aeddfec842cdd80c6c295045b80a420e3a07170a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 2 Jun 2023 19:41:58 +0800 -Subject: net/hns3: extract PTP to its own header file - -[ upstream commit 8977e7539f40ac716138dd49456dc26bfbf439c5 ] - -This patch extracts a PTP header file to contain PTP registers -and external API in order to make PTP code structure more clear. - -Fixes: 38b539d96eb6 ("net/hns3: support IEEE 1588 PTP") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 1 + - drivers/net/hns3/hns3_ethdev.h | 17 ------------ - drivers/net/hns3/hns3_ptp.c | 2 +- - drivers/net/hns3/hns3_ptp.h | 48 ++++++++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_regs.h | 23 ---------------- - 5 files changed, 50 insertions(+), 41 deletions(-) - create mode 100644 drivers/net/hns3/hns3_ptp.h - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 2e3aaf191d..d7443e197c 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -15,6 +15,7 @@ - #include "hns3_dcb.h" - #include "hns3_mp.h" - #include "hns3_flow.h" -+#include "hns3_ptp.h" - #include "hns3_ethdev.h" - - #define HNS3_SERVICE_INTERVAL 1000000 /* us */ -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 9456204422..c58094d87b 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1041,23 +1041,6 @@ void hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status, - uint32_t link_speed, uint8_t link_duplex); - void hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported); - --int hns3_restore_ptp(struct hns3_adapter *hns); --int hns3_mbuf_dyn_rx_timestamp_register(struct rte_eth_dev *dev, -- struct rte_eth_conf *conf); --int hns3_ptp_init(struct hns3_hw *hw); --void hns3_ptp_uninit(struct hns3_hw *hw); --int hns3_timesync_enable(struct rte_eth_dev *dev); --int hns3_timesync_disable(struct rte_eth_dev *dev); --int hns3_timesync_read_rx_timestamp(struct rte_eth_dev *dev, -- struct timespec *timestamp, -- uint32_t flags __rte_unused); --int hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev, -- struct timespec *timestamp); --int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts); --int hns3_timesync_write_time(struct rte_eth_dev *dev, -- const struct timespec *ts); --int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); -- - const char *hns3_get_media_type_name(uint8_t media_type); - - static inline bool -diff --git a/drivers/net/hns3/hns3_ptp.c b/drivers/net/hns3/hns3_ptp.c -index 0e17a17034..894ac6dd71 100644 ---- a/drivers/net/hns3/hns3_ptp.c -+++ b/drivers/net/hns3/hns3_ptp.c -@@ -7,7 +7,7 @@ - #include - - #include "hns3_ethdev.h" --#include "hns3_regs.h" -+#include "hns3_ptp.h" - #include "hns3_logs.h" - - uint64_t hns3_timestamp_rx_dynflag; -diff --git a/drivers/net/hns3/hns3_ptp.h b/drivers/net/hns3/hns3_ptp.h -new file mode 100644 -index 0000000000..2b8717fa3c ---- /dev/null -+++ b/drivers/net/hns3/hns3_ptp.h -@@ -0,0 +1,48 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2023 HiSilicon Limited. -+ */ -+ -+#ifndef HNS3_PTP_H -+#define HNS3_PTP_H -+ -+/* Register bit for 1588 event */ -+#define HNS3_VECTOR0_1588_INT_B 0 -+ -+#define HNS3_PTP_BASE_ADDRESS 0x29000 -+ -+#define HNS3_TX_1588_SEQID_BACK (HNS3_PTP_BASE_ADDRESS + 0x0) -+#define HNS3_TX_1588_TSP_BACK_0 (HNS3_PTP_BASE_ADDRESS + 0x4) -+#define HNS3_TX_1588_TSP_BACK_1 (HNS3_PTP_BASE_ADDRESS + 0x8) -+#define HNS3_TX_1588_TSP_BACK_2 (HNS3_PTP_BASE_ADDRESS + 0xc) -+ -+#define HNS3_TX_1588_BACK_TSP_CNT (HNS3_PTP_BASE_ADDRESS + 0x30) -+ -+#define HNS3_CFG_TIME_SYNC_H (HNS3_PTP_BASE_ADDRESS + 0x50) -+#define HNS3_CFG_TIME_SYNC_M (HNS3_PTP_BASE_ADDRESS + 0x54) -+#define HNS3_CFG_TIME_SYNC_L (HNS3_PTP_BASE_ADDRESS + 0x58) -+#define HNS3_CFG_TIME_SYNC_RDY (HNS3_PTP_BASE_ADDRESS + 0x5c) -+ -+#define HNS3_CFG_TIME_CYC_EN (HNS3_PTP_BASE_ADDRESS + 0x70) -+ -+#define HNS3_CURR_TIME_OUT_H (HNS3_PTP_BASE_ADDRESS + 0x74) -+#define HNS3_CURR_TIME_OUT_L (HNS3_PTP_BASE_ADDRESS + 0x78) -+#define HNS3_CURR_TIME_OUT_NS (HNS3_PTP_BASE_ADDRESS + 0x7c) -+ -+int hns3_restore_ptp(struct hns3_adapter *hns); -+int hns3_mbuf_dyn_rx_timestamp_register(struct rte_eth_dev *dev, -+ struct rte_eth_conf *conf); -+int hns3_ptp_init(struct hns3_hw *hw); -+void hns3_ptp_uninit(struct hns3_hw *hw); -+int hns3_timesync_enable(struct rte_eth_dev *dev); -+int hns3_timesync_disable(struct rte_eth_dev *dev); -+int hns3_timesync_read_rx_timestamp(struct rte_eth_dev *dev, -+ struct timespec *timestamp, -+ uint32_t flags __rte_unused); -+int hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev, -+ struct timespec *timestamp); -+int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts); -+int hns3_timesync_write_time(struct rte_eth_dev *dev, -+ const struct timespec *ts); -+int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); -+ -+#endif /* HNS3_PTP_H */ -diff --git a/drivers/net/hns3/hns3_regs.h b/drivers/net/hns3/hns3_regs.h -index 459bbaf773..6b037f81c1 100644 ---- a/drivers/net/hns3/hns3_regs.h -+++ b/drivers/net/hns3/hns3_regs.h -@@ -124,29 +124,6 @@ - #define HNS3_TQP_INTR_RL_DEFAULT 0 - #define HNS3_TQP_INTR_QL_DEFAULT 0 - --/* Register bit for 1588 event */ --#define HNS3_VECTOR0_1588_INT_B 0 -- --#define HNS3_PTP_BASE_ADDRESS 0x29000 -- --#define HNS3_TX_1588_SEQID_BACK (HNS3_PTP_BASE_ADDRESS + 0x0) --#define HNS3_TX_1588_TSP_BACK_0 (HNS3_PTP_BASE_ADDRESS + 0x4) --#define HNS3_TX_1588_TSP_BACK_1 (HNS3_PTP_BASE_ADDRESS + 0x8) --#define HNS3_TX_1588_TSP_BACK_2 (HNS3_PTP_BASE_ADDRESS + 0xc) -- --#define HNS3_TX_1588_BACK_TSP_CNT (HNS3_PTP_BASE_ADDRESS + 0x30) -- --#define HNS3_CFG_TIME_SYNC_H (HNS3_PTP_BASE_ADDRESS + 0x50) --#define HNS3_CFG_TIME_SYNC_M (HNS3_PTP_BASE_ADDRESS + 0x54) --#define HNS3_CFG_TIME_SYNC_L (HNS3_PTP_BASE_ADDRESS + 0x58) --#define HNS3_CFG_TIME_SYNC_RDY (HNS3_PTP_BASE_ADDRESS + 0x5c) -- --#define HNS3_CFG_TIME_CYC_EN (HNS3_PTP_BASE_ADDRESS + 0x70) -- --#define HNS3_CURR_TIME_OUT_H (HNS3_PTP_BASE_ADDRESS + 0x74) --#define HNS3_CURR_TIME_OUT_L (HNS3_PTP_BASE_ADDRESS + 0x78) --#define HNS3_CURR_TIME_OUT_NS (HNS3_PTP_BASE_ADDRESS + 0x7c) -- - /* gl_usec convert to hardware count, as writing each 1 represents 2us */ - #define HNS3_GL_USEC_TO_REG(gl_usec) ((gl_usec) >> 1) - /* rl_usec convert to hardware count, as writing each 1 represents 4us */ --- -2.23.0 - diff --git a/0304-net-hns3-fix-mbuf-leakage-when-RxQ-started-during-re.patch b/0304-net-hns3-fix-mbuf-leakage-when-RxQ-started-during-re.patch deleted file mode 100644 index 8a7bf9d..0000000 --- a/0304-net-hns3-fix-mbuf-leakage-when-RxQ-started-during-re.patch +++ /dev/null @@ -1,96 +0,0 @@ -From e29ec4c79236c53c61a5ca955fee16993b63fe08 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 2 Jun 2023 19:41:59 +0800 -Subject: net/hns3: fix mbuf leakage when RxQ started during reset - -[ upstream commit e2199b1897da9e26bbc700df3a00cd9c3c85eede ] - -In the reset restore-conf phase, the reset process will allocate for -the Rx ring mbufs unconditionlly. - -And the rte_eth_dev_rx_queue_start() will also allocate for the Rx ring -mbufs unconditionlly. - -So if the rte_eth_dev_rx_queue_start() is invoked before restore-conf -phase, then the mbufs allocated by rte_eth_dev_rx_queue_start() will -leak. - -Because the hw->reset.resetting was always true during the phases from -stop-service to restore-conf, so fix it by returning an error if the -hw->reset.resetting is set. - -This patch adds the above logic in both rx_queue_start/rx_queue_stop/ -tx_queue_start/tx_queue_stop ops. - -Fixes: fa29fe45a7b4 ("net/hns3: support queue start and stop") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index e055b5415d..f766c47072 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -4523,6 +4523,13 @@ hns3_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id) - return -ENOTSUP; - - rte_spinlock_lock(&hw->lock); -+ -+ if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED)) { -+ hns3_err(hw, "fail to start Rx queue during resetting."); -+ rte_spinlock_unlock(&hw->lock); -+ return -EIO; -+ } -+ - ret = hns3_reset_queue(hw, rx_queue_id, HNS3_RING_TYPE_RX); - if (ret) { - hns3_err(hw, "fail to reset Rx queue %u, ret = %d.", -@@ -4569,6 +4576,13 @@ hns3_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id) - return -ENOTSUP; - - rte_spinlock_lock(&hw->lock); -+ -+ if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED)) { -+ hns3_err(hw, "fail to stop Rx queue during resetting."); -+ rte_spinlock_unlock(&hw->lock); -+ return -EIO; -+ } -+ - hns3_enable_rxq(rxq, false); - - hns3_rx_queue_release_mbufs(rxq); -@@ -4591,6 +4605,13 @@ hns3_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id) - return -ENOTSUP; - - rte_spinlock_lock(&hw->lock); -+ -+ if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED)) { -+ hns3_err(hw, "fail to start Tx queue during resetting."); -+ rte_spinlock_unlock(&hw->lock); -+ return -EIO; -+ } -+ - ret = hns3_reset_queue(hw, tx_queue_id, HNS3_RING_TYPE_TX); - if (ret) { - hns3_err(hw, "fail to reset Tx queue %u, ret = %d.", -@@ -4617,6 +4638,13 @@ hns3_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id) - return -ENOTSUP; - - rte_spinlock_lock(&hw->lock); -+ -+ if (__atomic_load_n(&hw->reset.resetting, __ATOMIC_RELAXED)) { -+ hns3_err(hw, "fail to stop Tx queue during resetting."); -+ rte_spinlock_unlock(&hw->lock); -+ return -EIO; -+ } -+ - hns3_enable_txq(txq, false); - hns3_tx_queue_release_mbufs(txq); - /* --- -2.23.0 - diff --git a/0305-net-hns3-fix-mbuf-leakage-when-RxQ-started-after-res.patch b/0305-net-hns3-fix-mbuf-leakage-when-RxQ-started-after-res.patch deleted file mode 100644 index 9997238..0000000 --- a/0305-net-hns3-fix-mbuf-leakage-when-RxQ-started-after-res.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 5f5edfc2aae49af8dee267565ea36852cab4f292 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 2 Jun 2023 19:42:00 +0800 -Subject: net/hns3: fix mbuf leakage when RxQ started after reset - -[ upstream commit 4ec0409b3f3801fa01f45f9dfddfab6a343436af ] - -In the reset restore-conf phase, the reset process will allocate for -the Rx ring mbufs unconditionlly. - -And the rte_eth_dev_rx_queue_start() will also allocate for the Rx ring -mbufs unconditionlly. - -So if the rte_eth_dev_rx_queue_start() is invoked after restore-conf -phase, then the mbufs allocated in restore-conf phase will leak. - -So fix it by conditional release Rx ring mbufs in -rte_eth_dev_rx_queue_start(): if the Rx ring mbufs were allocated then -release them first. - -This patch also set all sw-ring[]'s mbuf is NULL when release Rx ring -mbufs so that we can determine whether the Rx ring mbufs were allocated -based only on the first sw-ring[0]'s mbuf. - -Fixes: fa29fe45a7b4 ("net/hns3: support queue start and stop") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index f766c47072..767ce82cc4 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -50,6 +50,8 @@ hns3_rx_queue_release_mbufs(struct hns3_rx_queue *rxq) - rxq->sw_ring[i].mbuf = NULL; - } - } -+ for (i = 0; i < rxq->rx_rearm_nb; i++) -+ rxq->sw_ring[rxq->rx_rearm_start + i].mbuf = NULL; - } - - for (i = 0; i < rxq->bulk_mbuf_num; i++) -@@ -4538,6 +4540,9 @@ hns3_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id) - return ret; - } - -+ if (rxq->sw_ring[0].mbuf != NULL) -+ hns3_rx_queue_release_mbufs(rxq); -+ - ret = hns3_init_rxq(hns, rx_queue_id); - if (ret) { - hns3_err(hw, "fail to init Rx queue %u, ret = %d.", --- -2.23.0 - diff --git a/0306-net-hns3-fix-device-start-return-value.patch b/0306-net-hns3-fix-device-start-return-value.patch deleted file mode 100644 index 63ba0ea..0000000 --- a/0306-net-hns3-fix-device-start-return-value.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 080088d0626c9b437f41fc0717360c89d294dfdf Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Fri, 2 Jun 2023 19:42:01 +0800 -Subject: net/hns3: fix device start return value - -[ upstream commit 3c6143436cc6d328bb41f0474040a6e1d0a9ae4c ] - -If hns3_init_queues() return failed, the hns3vf_do_start() should -return errcode. This patch fixes it. - -Fixes: 43d8adf3891c ("net/hns3: fix RSS flow rule restore") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev_vf.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 3a93987409..6898a77407 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1674,8 +1674,10 @@ hns3vf_do_start(struct hns3_adapter *hns, bool reset_queue) - hns3_enable_rxd_adv_layout(hw); - - ret = hns3_init_queues(hns, reset_queue); -- if (ret) -+ if (ret) { - hns3_err(hw, "failed to init queues, ret = %d.", ret); -+ return ret; -+ } - - return hns3_restore_filter(hns); - } --- -2.23.0 - diff --git a/0307-net-hns3-fix-uninitialized-variable.patch b/0307-net-hns3-fix-uninitialized-variable.patch deleted file mode 100644 index 666ec53..0000000 --- a/0307-net-hns3-fix-uninitialized-variable.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 8bd047fb37fbc06fd695f120d9d51a4ffbcc2493 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 2 Jun 2023 19:42:02 +0800 -Subject: net/hns3: fix uninitialized variable - -[ upstream commit 82d44a304e9a0fe5931b7c68d32c3e30477564f2 ] - -This patch fixes possible use of uninitialized variable -"old_tuple_fields". - -Fixes: e3069658da9f ("net/hns3: reimplement hash flow function") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_flow.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index c1f4f5cb0b..d5c9c22633 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -1944,8 +1944,9 @@ hns3_flow_set_rss_ptype_tuple(struct hns3_hw *hw, - if (ret != 0) - return ret; - -- hns3_info(hw, "RSS tuple fields changed from 0x%" PRIx64 " to 0x%" PRIx64, -- old_tuple_fields, new_tuple_fields); -+ if (!cfg_global_tuple) -+ hns3_info(hw, "RSS tuple fields changed from 0x%" PRIx64 " to 0x%" PRIx64, -+ old_tuple_fields, new_tuple_fields); - - return 0; - } --- -2.23.0 - diff --git a/0308-net-hns3-refactor-code.patch b/0308-net-hns3-refactor-code.patch deleted file mode 100644 index 7e50dab..0000000 --- a/0308-net-hns3-refactor-code.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 27ac02da0401a657ea0a6bf3c048be6af13aeace Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 2 Jun 2023 19:42:03 +0800 -Subject: net/hns3: refactor code - -[ upstream commit 00dcbfac5f2354de6e769f00159eba942a2c908a ] - -This patch modify the code that violates the coding standards. - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_regs.c | 3 +-- - drivers/net/hns3/hns3_rxtx.c | 10 +++------- - 2 files changed, 4 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_regs.c b/drivers/net/hns3/hns3_regs.c -index 5d6f92e4bb..be1be6a89c 100644 ---- a/drivers/net/hns3/hns3_regs.c -+++ b/drivers/net/hns3/hns3_regs.c -@@ -385,10 +385,9 @@ hns3_dfx_reg_cmd_send(struct hns3_hw *hw, struct hns3_cmd_desc *desc, - hns3_cmd_setup_basic_desc(&desc[i], opcode, true); - - ret = hns3_cmd_send(hw, desc, bd_num); -- if (ret) { -+ if (ret) - hns3_err(hw, "fail to query dfx registers, opcode = 0x%04X, " - "ret = %d.\n", opcode, ret); -- } - - return ret; - } -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 767ce82cc4..13b0ad24b5 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -751,7 +751,7 @@ hns3pf_reset_all_tqps(struct hns3_hw *hw) - for (i = 0; i < hw->cfg_max_queues; i++) { - ret = hns3pf_reset_tqp(hw, i); - if (ret) { -- hns3_err(hw, "fail to reset tqp, queue_id = %d, ret = %d.", -+ hns3_err(hw, "fail to reset tqp, queue_id = %u, ret = %d.", - i, ret); - return ret; - } -@@ -829,15 +829,13 @@ hns3_send_reset_queue_cmd(struct hns3_hw *hw, uint16_t queue_id, - { - struct hns3_reset_tqp_queue_cmd *req; - struct hns3_cmd_desc desc; -- int queue_direction; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RESET_TQP_QUEUE_INDEP, false); - - req = (struct hns3_reset_tqp_queue_cmd *)desc.data; - req->tqp_id = rte_cpu_to_le_16(queue_id); -- queue_direction = queue_type == HNS3_RING_TYPE_TX ? 0 : 1; -- req->queue_direction = rte_cpu_to_le_16(queue_direction); -+ req->queue_direction = queue_type == HNS3_RING_TYPE_TX ? 0 : 1; - hns3_set_bit(req->reset_req, HNS3_TQP_RESET_B, enable ? 1 : 0); - - ret = hns3_cmd_send(hw, &desc, 1); -@@ -855,15 +853,13 @@ hns3_get_queue_reset_status(struct hns3_hw *hw, uint16_t queue_id, - { - struct hns3_reset_tqp_queue_cmd *req; - struct hns3_cmd_desc desc; -- int queue_direction; - int ret; - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RESET_TQP_QUEUE_INDEP, true); - - req = (struct hns3_reset_tqp_queue_cmd *)desc.data; - req->tqp_id = rte_cpu_to_le_16(queue_id); -- queue_direction = queue_type == HNS3_RING_TYPE_TX ? 0 : 1; -- req->queue_direction = rte_cpu_to_le_16(queue_direction); -+ req->queue_direction = queue_type == HNS3_RING_TYPE_TX ? 0 : 1; - - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { --- -2.23.0 - diff --git a/0309-net-hns3-fix-inaccurate-log.patch b/0309-net-hns3-fix-inaccurate-log.patch deleted file mode 100644 index 531d53f..0000000 --- a/0309-net-hns3-fix-inaccurate-log.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 599089c15b21493879e6509cda350284e0af4eb3 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 2 Jun 2023 19:42:04 +0800 -Subject: net/hns3: fix inaccurate log - -[ upstream commit 9ff64664c1a1b1fa636ee4d11c7ef4eb54ab0691 ] - -This patch fix inaccurate log - -Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations") -Fixes: a951c1ed3ab5 ("net/hns3: support different numbers of Rx and Tx queues") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 13b0ad24b5..4c79163e3f 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -586,7 +586,7 @@ hns3_tqp_enable(struct hns3_hw *hw, uint16_t queue_id, bool enable) - - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) -- hns3_err(hw, "TQP enable fail, ret = %d", ret); -+ hns3_err(hw, "TQP %s fail, ret = %d", enable ? "enable" : "disable", ret); - - return ret; - } -@@ -1635,7 +1635,7 @@ hns3_set_fake_rx_or_tx_queues(struct rte_eth_dev *dev, uint16_t nb_rx_q, - - ret = hns3_fake_tx_queue_config(hw, tx_need_add_nb_q); - if (ret) { -- hns3_err(hw, "Fail to configure fake rx queues: %d", ret); -+ hns3_err(hw, "Fail to configure fake tx queues: %d", ret); - goto cfg_fake_tx_q_fail; - } - --- -2.23.0 - diff --git a/0310-net-hns3-fix-redundant-line-break-in-log.patch b/0310-net-hns3-fix-redundant-line-break-in-log.patch deleted file mode 100644 index b80b884..0000000 --- a/0310-net-hns3-fix-redundant-line-break-in-log.patch +++ /dev/null @@ -1,71 +0,0 @@ -From acc1ca225b8618728abd2b971f55354a7f6eebcf Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 2 Jun 2023 19:42:05 +0800 -Subject: net/hns3: fix redundant line break in log - -[ upstream commit 1af035107a4da0c5ea528afbde5d3d6ccc016437 ] - -This patch remove log redundant line break - -Fixes: d51867db65c1 ("net/hns3: add initialization") -Fixes: c6332c3cf9f0 ("net/hns3: support module EEPROM dump") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index d7443e197c..9af08a7748 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -3631,7 +3631,7 @@ hns3_get_mac_ethertype_cmd_status(uint16_t cmdq_resp, uint8_t resp_code) - - if (cmdq_resp) { - PMD_INIT_LOG(ERR, -- "cmdq execute failed for get_mac_ethertype_cmd_status, status=%u.\n", -+ "cmdq execute failed for get_mac_ethertype_cmd_status, status=%u.", - cmdq_resp); - return -EIO; - } -@@ -6235,7 +6235,7 @@ hns3_optical_module_existed(struct hns3_hw *hw) - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { - hns3_err(hw, -- "fail to get optical module exist state, ret = %d.\n", -+ "fail to get optical module exist state, ret = %d.", - ret); - return false; - } -@@ -6273,7 +6273,7 @@ hns3_get_module_eeprom_data(struct hns3_hw *hw, uint32_t offset, - - ret = hns3_cmd_send(hw, desc, HNS3_SFP_INFO_CMD_NUM); - if (ret) { -- hns3_err(hw, "fail to get module EEPROM info, ret = %d.\n", -+ hns3_err(hw, "fail to get module EEPROM info, ret = %d.", - ret); - return ret; - } -@@ -6310,7 +6310,7 @@ hns3_get_module_eeprom(struct rte_eth_dev *dev, - return -ENOTSUP; - - if (!hns3_optical_module_existed(hw)) { -- hns3_err(hw, "fail to read module EEPROM: no module is connected.\n"); -+ hns3_err(hw, "fail to read module EEPROM: no module is connected."); - return -EIO; - } - -@@ -6373,7 +6373,7 @@ hns3_get_module_info(struct rte_eth_dev *dev, - modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8636_MAX_LEN; - break; - default: -- hns3_err(hw, "unknown module, type = %u, extra_type = %u.\n", -+ hns3_err(hw, "unknown module, type = %u, extra_type = %u.", - sfp_type.type, sfp_type.ext_type); - return -EINVAL; - } --- -2.23.0 - diff --git a/0311-ethdev-add-API-to-check-if-queue-is-valid.patch b/0311-ethdev-add-API-to-check-if-queue-is-valid.patch deleted file mode 100644 index 6497b7d..0000000 --- a/0311-ethdev-add-API-to-check-if-queue-is-valid.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 16b5ecbb2f93fa577a0f665b7e1aaf07c63525f1 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 5 Jun 2023 10:27:40 +0800 -Subject: ethdev: add API to check if queue is valid - -[ upstream commit dcf6ce9c2100c604fd0cf602841d290d8236b504 ] - -The API rte_eth_dev_is_valid_rxq/txq which -is used to check if Rx/Tx queue is valid. -If the queue has been setup, it is considered valid. - -Signed-off-by: Dengdui Huang -Acked-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 22 ++++++++++++++++++++++ - lib/ethdev/rte_ethdev.h | 38 ++++++++++++++++++++++++++++++++++++++ - lib/ethdev/version.map | 2 ++ - 3 files changed, 62 insertions(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 61731ec83e..1a25515148 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -1009,6 +1009,28 @@ eth_dev_validate_tx_queue(const struct rte_eth_dev *dev, uint16_t tx_queue_id) - return 0; - } - -+int -+rte_eth_dev_is_valid_rxq(uint16_t port_id, uint16_t queue_id) -+{ -+ struct rte_eth_dev *dev; -+ -+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ dev = &rte_eth_devices[port_id]; -+ -+ return eth_dev_validate_rx_queue(dev, queue_id); -+} -+ -+int -+rte_eth_dev_is_valid_txq(uint16_t port_id, uint16_t queue_id) -+{ -+ struct rte_eth_dev *dev; -+ -+ RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); -+ dev = &rte_eth_devices[port_id]; -+ -+ return eth_dev_validate_tx_queue(dev, queue_id); -+} -+ - int - rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id) - { -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 2064d439c8..c555ecb840 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -2692,6 +2692,44 @@ int rte_eth_dev_socket_id(uint16_t port_id); - */ - int rte_eth_dev_is_valid_port(uint16_t port_id); - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice -+ * -+ * Check if Rx queue is valid. If the queue has been setup, -+ * it is considered valid. -+ * -+ * @param port_id -+ * The port identifier of the Ethernet device. -+ * @param queue_id -+ * The index of the receive queue. -+ * @return -+ * - -ENODEV: if *port_id* is invalid. -+ * - -EINVAL: if queue_id is out of range or queue is not been setup. -+ * - 0 if Rx queue is valid. -+ */ -+__rte_experimental -+int rte_eth_dev_is_valid_rxq(uint16_t port_id, uint16_t queue_id); -+ -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice -+ * -+ * Check if Tx queue is valid. If the queue has been setup, -+ * it is considered valid. -+ * -+ * @param port_id -+ * The port identifier of the Ethernet device. -+ * @param queue_id -+ * The index of the transmit queue. -+ * @return -+ * - -ENODEV: if *port_id* is invalid. -+ * - -EINVAL: if queue_id is out of range or queue is not been setup. -+ * - 0 if Tx queue is valid. -+ */ -+__rte_experimental -+int rte_eth_dev_is_valid_txq(uint16_t port_id, uint16_t queue_id); -+ - /** - * Start specified Rx queue of a port. It is used when rx_deferred_start - * flag of the specified queue is true. -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index 590aa5a0a6..f593f64ea9 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -263,6 +263,8 @@ EXPERIMENTAL { - # added in 22.11 - rte_eth_rx_descriptor_dump; - rte_eth_tx_descriptor_dump; -+ rte_eth_dev_is_valid_rxq; -+ rte_eth_dev_is_valid_txq; - }; - - INTERNAL { --- -2.23.0 - diff --git a/0312-app-testpmd-fix-segment-fault-with-invalid-queue-ID.patch b/0312-app-testpmd-fix-segment-fault-with-invalid-queue-ID.patch deleted file mode 100644 index 53f57ef..0000000 --- a/0312-app-testpmd-fix-segment-fault-with-invalid-queue-ID.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 1c7616769fc09d9443cfd39816fa35b4b0ddd33d Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 5 Jun 2023 10:27:41 +0800 -Subject: app/testpmd: fix segment fault with invalid queue ID - -[ upstream commit 53191add2203e943c46af0b86002613f22b734b3 ] - -When input queue ID is invalid, it will lead to -Segmentation fault, like: - -dpdk-testpmd -a 0000:01:00.0 -- -i -testpmd> show port 0 txq/rxq 99 desc 0 status -Segmentation fault - -dpdk-testpmd -a 0000:01:00.0 -- -i -testpmd> show port 0 rxq 99 desc used count -Segmentation fault - -This patch fixes it. - -Fixes: fae9aa717d6c ("app/testpmd: support checking descriptor status") -Fixes: 3f9acb5c83bb ("ethdev: avoid non-dataplane checks in Rx queue count") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 23 ++++++++++++++++------- - 1 file changed, 16 insertions(+), 7 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 0d9c7d449c..bc770f3d56 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -17315,12 +17315,13 @@ cmd_show_rx_tx_desc_status_parsed(void *parsed_result, - struct cmd_show_rx_tx_desc_status_result *res = parsed_result; - int rc; - -- if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { -- fprintf(stderr, "invalid port id %u\n", res->cmd_pid); -- return; -- } -- - if (!strcmp(res->cmd_keyword, "rxq")) { -+ if (rte_eth_dev_is_valid_rxq(res->cmd_pid, res->cmd_qid) != 0) { -+ fprintf(stderr, -+ "Invalid input: port id = %d, queue id = %d\n", -+ res->cmd_pid, res->cmd_qid); -+ return; -+ } - rc = rte_eth_rx_descriptor_status(res->cmd_pid, res->cmd_qid, - res->cmd_did); - if (rc < 0) { -@@ -17336,6 +17337,12 @@ cmd_show_rx_tx_desc_status_parsed(void *parsed_result, - else - printf("Desc status = UNAVAILABLE\n"); - } else if (!strcmp(res->cmd_keyword, "txq")) { -+ if (rte_eth_dev_is_valid_txq(res->cmd_pid, res->cmd_qid) != 0) { -+ fprintf(stderr, -+ "Invalid input: port id = %d, queue id = %d\n", -+ res->cmd_pid, res->cmd_qid); -+ return; -+ } - rc = rte_eth_tx_descriptor_status(res->cmd_pid, res->cmd_qid, - res->cmd_did); - if (rc < 0) { -@@ -17415,8 +17422,10 @@ cmd_show_rx_queue_desc_used_count_parsed(void *parsed_result, - struct cmd_show_rx_queue_desc_used_count_result *res = parsed_result; - int rc; - -- if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { -- fprintf(stderr, "invalid port id %u\n", res->cmd_pid); -+ if (rte_eth_dev_is_valid_rxq(res->cmd_pid, res->cmd_qid) != 0) { -+ fprintf(stderr, -+ "Invalid input: port id = %d, queue id = %d\n", -+ res->cmd_pid, res->cmd_qid); - return; - } - --- -2.23.0 - diff --git a/0313-net-hns3-fix-IMP-reset-trigger.patch b/0313-net-hns3-fix-IMP-reset-trigger.patch deleted file mode 100644 index b9adb29..0000000 --- a/0313-net-hns3-fix-IMP-reset-trigger.patch +++ /dev/null @@ -1,66 +0,0 @@ -From deb9dd8d00b81173425215f82ba9cb3e0db31e5c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 6 Jun 2023 20:10:28 +0800 -Subject: net/hns3: fix IMP reset trigger - -[ upstream commit bc49e0b4132a05cc012f5e2e7934fbec6589861c ] - -Currently, driver sends the command with an unknown opcode to the -firmware to trigger IMP reset when some hardware error happened. -This unknown opcode cannot be parsed by the firmware. - -So this patch fixes the way by writing register to do it. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 16 ++++------------ - 1 file changed, 4 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 9af08a7748..6c3ae75c4d 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -44,6 +44,7 @@ - #define HNS3_VECTOR0_IMP_CMDQ_ERR_B 4U - #define HNS3_VECTOR0_IMP_RD_POISON_B 5U - #define HNS3_VECTOR0_ALL_MSIX_ERR_B 6U -+#define HNS3_VECTOR0_TRIGGER_IMP_RESET_B 7U - - #define HNS3_RESET_WAIT_MS 100 - #define HNS3_RESET_WAIT_CNT 200 -@@ -5575,17 +5576,6 @@ hns3_func_reset_cmd(struct hns3_hw *hw, int func_id) - return hns3_cmd_send(hw, &desc, 1); - } - --static int --hns3_imp_reset_cmd(struct hns3_hw *hw) --{ -- struct hns3_cmd_desc desc; -- -- hns3_cmd_setup_basic_desc(&desc, 0xFFFE, false); -- desc.data[0] = 0xeedd; -- -- return hns3_cmd_send(hw, &desc, 1); --} -- - static void - hns3_msix_process(struct hns3_adapter *hns, enum hns3_reset_level reset_level) - { -@@ -5603,7 +5593,9 @@ hns3_msix_process(struct hns3_adapter *hns, enum hns3_reset_level reset_level) - - switch (reset_level) { - case HNS3_IMP_RESET: -- hns3_imp_reset_cmd(hw); -+ val = hns3_read_dev(hw, HNS3_VECTOR0_OTER_EN_REG); -+ hns3_set_bit(val, HNS3_VECTOR0_TRIGGER_IMP_RESET_B, 1); -+ hns3_write_dev(hw, HNS3_VECTOR0_OTER_EN_REG, val); - hns3_warn(hw, "IMP Reset requested time=%ld.%.6ld", - tv.tv_sec, tv.tv_usec); - break; --- -2.23.0 - diff --git a/0314-net-ixgbe-add-proper-memory-barriers-in-Rx.patch b/0314-net-ixgbe-add-proper-memory-barriers-in-Rx.patch deleted file mode 100644 index 092d89d..0000000 --- a/0314-net-ixgbe-add-proper-memory-barriers-in-Rx.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 2b198866b2753d5c8a1241a32023137a91103392 Mon Sep 17 00:00:00 2001 -From: Min Zhou -Date: Tue, 13 Jun 2023 17:44:25 +0800 -Subject: [PATCH 2/2] net/ixgbe: add proper memory barriers in Rx - -Segmentation fault has been observed while running the -ixgbe_recv_pkts_lro() function to receive packets on the Loongson 3C5000 -processor which has 64 cores and 4 NUMA nodes. - -From the ixgbe_recv_pkts_lro() function, we found that as long as the first -packet has the EOP bit set, and the length of this packet is less than or -equal to rxq->crc_len, the segmentation fault will definitely happen even -though on the other platforms. For example, if we made the first packet -which had the EOP bit set had a zero length by force, the segmentation -fault would happen on X86. - -Because when processd the first packet the first_seg->next will be NULL, if -at the same time this packet has the EOP bit set and its length is less -than or equal to rxq->crc_len, the following loop will be executed: - - for (lp = first_seg; lp->next != rxm; lp = lp->next) - ; - -We know that the first_seg->next will be NULL under this condition. So the -expression of lp->next->next will cause the segmentation fault. - -Normally, the length of the first packet with EOP bit set will be greater -than rxq->crc_len. However, the out-of-order execution of CPU may make the -read ordering of the status and the rest of the descriptor fields in this -function not be correct. The related codes are as following: - - rxdp = &rx_ring[rx_id]; - #1 staterr = rte_le_to_cpu_32(rxdp->wb.upper.status_error); - - if (!(staterr & IXGBE_RXDADV_STAT_DD)) - break; - - #2 rxd = *rxdp; - -The sentence #2 may be executed before sentence #1. This action is likely -to make the ready packet zero length. If the packet is the first packet and -has the EOP bit set, the above segmentation fault will happen. - -So, we should add a proper memory barrier to ensure the read ordering be -correct. We also did the same thing in the ixgbe_recv_pkts() function to -make the rxd data be valid even though we did not find segmentation fault -in this function. - -Fixes: 8eecb3295aed ("ixgbe: add LRO support") -Cc: stable@dpdk.org - -Signed-off-by: Min Zhou -Reviewed-by: Ruifeng Wang ---- - drivers/net/ixgbe/ixgbe_rxtx.c | 47 +++++++++++++++------------------- - 1 file changed, 21 insertions(+), 26 deletions(-) - -diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c -index e19e832..c0491bf 100644 ---- a/drivers/net/ixgbe/ixgbe_rxtx.c -+++ b/drivers/net/ixgbe/ixgbe_rxtx.c -@@ -1818,11 +1818,22 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, - * of accesses cannot be reordered by the compiler. If they were - * not volatile, they could be reordered which could lead to - * using invalid descriptor fields when read from rxd. -+ * -+ * Meanwhile, to prevent the CPU from executing out of order, we -+ * need to use a proper memory barrier to ensure the memory -+ * ordering below. - */ - rxdp = &rx_ring[rx_id]; - staterr = rxdp->wb.upper.status_error; - if (!(staterr & rte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD))) - break; -+ -+ /* -+ * Use acquire fence to ensure that status_error which includes -+ * DD bit is loaded before loading of other descriptor words. -+ */ -+ rte_atomic_thread_fence(__ATOMIC_ACQUIRE); -+ - rxd = *rxdp; - - /* -@@ -2089,32 +2100,10 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts, - - next_desc: - /* -- * The code in this whole file uses the volatile pointer to -- * ensure the read ordering of the status and the rest of the -- * descriptor fields (on the compiler level only!!!). This is so -- * UGLY - why not to just use the compiler barrier instead? DPDK -- * even has the rte_compiler_barrier() for that. -- * -- * But most importantly this is just wrong because this doesn't -- * ensure memory ordering in a general case at all. For -- * instance, DPDK is supposed to work on Power CPUs where -- * compiler barrier may just not be enough! -- * -- * I tried to write only this function properly to have a -- * starting point (as a part of an LRO/RSC series) but the -- * compiler cursed at me when I tried to cast away the -- * "volatile" from rx_ring (yes, it's volatile too!!!). So, I'm -- * keeping it the way it is for now. -- * -- * The code in this file is broken in so many other places and -- * will just not work on a big endian CPU anyway therefore the -- * lines below will have to be revisited together with the rest -- * of the ixgbe PMD. -- * -- * TODO: -- * - Get rid of "volatile" and let the compiler do its job. -- * - Use the proper memory barrier (rte_rmb()) to ensure the -- * memory ordering below. -+ * "Volatile" only prevents caching of the variable marked -+ * volatile. Most important, "volatile" cannot prevent the CPU -+ * from executing out of order. So, it is necessary to use a -+ * proper memory barrier to ensure the memory ordering below. - */ - rxdp = &rx_ring[rx_id]; - staterr = rte_le_to_cpu_32(rxdp->wb.upper.status_error); -@@ -2122,6 +2111,12 @@ ixgbe_recv_pkts_lro(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts, - if (!(staterr & IXGBE_RXDADV_STAT_DD)) - break; - -+ /* -+ * Use acquire fence to ensure that status_error which includes -+ * DD bit is loaded before loading of other descriptor words. -+ */ -+ rte_atomic_thread_fence(__ATOMIC_ACQUIRE); -+ - rxd = *rxdp; - - PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u " --- -2.33.0 diff --git a/0315-net-cnxk-fix-build-with-GCC-12.patch b/0315-net-cnxk-fix-build-with-GCC-12.patch deleted file mode 100644 index a5b08b3..0000000 --- a/0315-net-cnxk-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,108 +0,0 @@ -From b8bfbcd1a04b143151da9688eaefc9f7b72ccc12 Mon Sep 17 00:00:00 2001 -From: Rakesh Kudurumalla -Date: Wed, 23 Feb 2022 15:25:40 +0530 -Subject: [PATCH] net/cnxk: fix build with GCC 12 - -[ upstream commit b526599020ef06811dd08c4f15c0cdf049d7f9f2 ] - -Resolve following compilation error with gcc 12 version. -error: storing the address of local variable message in *error.message - -Fixes: 26b034f78ca7 ("net/cnxk: support to validate meter policy") - -Reported-by: Ferruh Yigit -Signed-off-by: Rakesh Kudurumalla -Acked-by: Jerin Jacob ---- - drivers/net/cnxk/cnxk_ethdev_mtr.c | 59 ++++++++++++++++++++++-------- - 1 file changed, 44 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/cnxk/cnxk_ethdev_mtr.c b/drivers/net/cnxk/cnxk_ethdev_mtr.c -index 39d8563826..6d14c88e7d 100644 ---- a/drivers/net/cnxk/cnxk_ethdev_mtr.c -+++ b/drivers/net/cnxk/cnxk_ethdev_mtr.c -@@ -277,15 +277,54 @@ cnxk_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id, - return 0; - } - -+static int -+update_mtr_err(uint32_t act_color, struct rte_mtr_error *error, bool action) -+{ -+ const char *str; -+ switch (act_color) { -+ case RTE_COLOR_GREEN: -+ if (action) { -+ str = "Green action is not valid"; -+ goto notsup; -+ } else { -+ str = "Green action is null"; -+ goto notvalid; -+ } -+ break; -+ case RTE_COLOR_YELLOW: -+ if (action) { -+ str = "Yellow action is not valid"; -+ goto notsup; -+ } else { -+ str = "Yellow action is null"; -+ goto notvalid; -+ } -+ break; -+ case RTE_COLOR_RED: -+ if (action) { -+ str = "Red action is not valid"; -+ goto notsup; -+ } else { -+ str = "Red action is null"; -+ goto notvalid; -+ } -+ break; -+ } -+notsup: -+ return -rte_mtr_error_set(error, ENOTSUP, -+ RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, str); -+notvalid: -+ return -rte_mtr_error_set(error, EINVAL, -+ RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, str); -+} -+ - static int - cnxk_nix_mtr_policy_validate(struct rte_eth_dev *dev, - struct rte_mtr_meter_policy_params *policy, - struct rte_mtr_error *error) - { -- static const char *const action_color[] = {"Green", "Yellow", "Red"}; - bool supported[RTE_COLORS] = {false, false, false}; - const struct rte_flow_action *action; -- char message[1024]; - uint32_t i; - - RTE_SET_USED(dev); -@@ -304,21 +343,11 @@ cnxk_nix_mtr_policy_validate(struct rte_eth_dev *dev, - if (action->type == RTE_FLOW_ACTION_TYPE_DROP) - supported[i] = true; - -- if (!supported[i]) { -- sprintf(message, -- "%s action is not valid", -- action_color[i]); -- return -rte_mtr_error_set(error, -- ENOTSUP, -- RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, -- message); -- } -+ if (!supported[i]) -+ return update_mtr_err(i, error, true); - } - } else { -- sprintf(message, "%s action is null", action_color[i]); -- return -rte_mtr_error_set(error, EINVAL, -- RTE_MTR_ERROR_TYPE_METER_POLICY, NULL, -- message); -+ return update_mtr_err(i, error, false); - } - } - --- -2.23.0 - diff --git a/0316-net-cnxk-fix-build-with-optimization.patch b/0316-net-cnxk-fix-build-with-optimization.patch deleted file mode 100644 index 70981ed..0000000 --- a/0316-net-cnxk-fix-build-with-optimization.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 213001231857c9af72f8f0288c43773b1ac2d580 Mon Sep 17 00:00:00 2001 -From: Rakesh Kudurumalla -Date: Fri, 4 Mar 2022 19:53:37 +0530 -Subject: [PATCH] net/cnxk: fix build with optimization -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 68f8a52a6b0ad6b77772d4564928aebb21c2ca66 ] - -Fix the following build error seen with --optimization=1 and -GCC 10.3.0. - -drivers/net/cnxk/cnxk_ethdev_mtr.c: In function -‘cnxk_nix_mtr_policy_validate’: -lib/ethdev/rte_mtr_driver.h:188:10: error: ‘str’ may be used -uninitialized in this function [-Werror=maybe-uninitialized] - -Bugzilla ID: 939 -Bugzilla ID: 992 -Fixes: b526599020ef ("net/cnxk: fix build with GCC 12") - -Reported-by: Ferruh Yigit -Signed-off-by: Rakesh Kudurumalla ---- - drivers/net/cnxk/cnxk_ethdev_mtr.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/cnxk/cnxk_ethdev_mtr.c b/drivers/net/cnxk/cnxk_ethdev_mtr.c -index 6d14c88e7d..b6ccccdc39 100644 ---- a/drivers/net/cnxk/cnxk_ethdev_mtr.c -+++ b/drivers/net/cnxk/cnxk_ethdev_mtr.c -@@ -280,7 +280,7 @@ cnxk_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id, - static int - update_mtr_err(uint32_t act_color, struct rte_mtr_error *error, bool action) - { -- const char *str; -+ const char *str = NULL; - switch (act_color) { - case RTE_COLOR_GREEN: - if (action) { --- -2.23.0 - diff --git a/0317-crypto-ipsec_mb-fix-build-with-GCC-12.patch b/0317-crypto-ipsec_mb-fix-build-with-GCC-12.patch deleted file mode 100644 index 782ec22..0000000 --- a/0317-crypto-ipsec_mb-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,73 +0,0 @@ -From c86456efc916bff6ecb9b6ab9664c9409d1a3fe2 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:48 +0200 -Subject: [PATCH] crypto/ipsec_mb: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 468f31eb71c4c2aa454841b316766514cabd0f02 ] - -GCC 12 raises the following warning: - -In function ‘__rte_ring_enqueue_elems_64’, - inlined from ‘__rte_ring_enqueue_elems’ at - ../lib/ring/rte_ring_elem_pvt.h:130:3, - inlined from ‘__rte_ring_do_hts_enqueue_elem’ at - ../lib/ring/rte_ring_hts_elem_pvt.h:196:3, - inlined from ‘rte_ring_mp_hts_enqueue_burst_elem’ at - ../lib/ring/rte_ring_hts.h:110:9, - inlined from ‘rte_ring_enqueue_burst_elem’ at - ../lib/ring/rte_ring_elem.h:577:10, - inlined from ‘rte_ring_enqueue_burst’ at - ../lib/ring/rte_ring.h:738:9, - inlined from ‘process_op_bit’ at - ../drivers/crypto/ipsec_mb/pmd_snow3g.c:425:16, - inlined from ‘snow3g_pmd_dequeue_burst’ at - ../drivers/crypto/ipsec_mb/pmd_snow3g.c:484:20: -../lib/ring/rte_ring_elem_pvt.h:68:44: error: array subscript 1 is - outside array bounds of ‘struct rte_crypto_op[0]’ - [-Werror=array-bounds] - 68 | ring[idx + 1] = obj[i + 1]; - | ~~~^~~~~~~ -../drivers/crypto/ipsec_mb/pmd_snow3g.c: In function - ‘snow3g_pmd_dequeue_burst’: -../drivers/crypto/ipsec_mb/pmd_snow3g.c:434:1: note: - at offset 8 into object ‘op’ of size 8 - 434 | snow3g_pmd_dequeue_burst(void *queue_pair, - | ^~~~~~~~~~~~~~~~~~~~~~~~ - -Validate that one (exactly) op has been processed or return early. - -Fixes: b537abdbee74 ("crypto/snow3g: support bit-level operations") - -Signed-off-by: David Marchand -Acked-by: Stephen Hemminger ---- - drivers/crypto/ipsec_mb/pmd_snow3g.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/crypto/ipsec_mb/pmd_snow3g.c b/drivers/crypto/ipsec_mb/pmd_snow3g.c -index ebc9a0b562..9a85f46721 100644 ---- a/drivers/crypto/ipsec_mb/pmd_snow3g.c -+++ b/drivers/crypto/ipsec_mb/pmd_snow3g.c -@@ -422,12 +422,13 @@ process_op_bit(struct rte_crypto_op *op, struct snow3g_session *session, - op->sym->session = NULL; - } - -- enqueued_op = rte_ring_enqueue_burst(qp->ingress_queue, -- (void **)&op, processed_op, NULL); -+ if (unlikely(processed_op != 1)) -+ return 0; -+ enqueued_op = rte_ring_enqueue(qp->ingress_queue, op); - qp->stats.enqueued_count += enqueued_op; - *accumulated_enqueued_ops += enqueued_op; - -- return enqueued_op; -+ return 1; - } - - static uint16_t --- -2.23.0 - diff --git a/0318-net-ena-fix-build-with-GCC-12.patch b/0318-net-ena-fix-build-with-GCC-12.patch deleted file mode 100644 index 0dba83d..0000000 --- a/0318-net-ena-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 9c1822f59fc41558231b6e67d6feac5a225fcbdb Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:49 +0200 -Subject: [PATCH] net/ena: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 2449949584667fbb275df1ea5a5ceeead1a65786 ] - -GCC 12 raises the following warning: - -In file included from ../lib/mempool/rte_mempool.h:46, - from ../lib/mbuf/rte_mbuf.h:38, - from ../lib/net/rte_ether.h:22, - from ../drivers/net/ena/ena_ethdev.h:10, - from ../drivers/net/ena/ena_rss.c:6: -../drivers/net/ena/ena_rss.c: In function ‘ena_rss_key_fill’: -../lib/eal/x86/include/rte_memcpy.h:370:9: warning: array subscript 64 is - outside array bounds of ‘uint8_t[40]’ - {aka ‘unsigned char[40]’} [-Warray-bounds] - 370 | rte_mov32((uint8_t *)dst + 2 * 32, (const uint8_t *)src + 2 * 32); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../drivers/net/ena/ena_rss.c:51:24: note: while referencing ‘default_key’ - 51 | static uint8_t default_key[ENA_HASH_KEY_SIZE]; - | ^~~~~~~~~~~ - -This is a false positive because the copied size is checked against -ENA_HASH_KEY_SIZE in a (build) assert. -Silence this warning by calling memcpy with the minimal size. - -Bugzilla ID: 849 - -Signed-off-by: David Marchand -Acked-by: Stephen Hemminger ---- - drivers/net/ena/ena_rss.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/ena/ena_rss.c b/drivers/net/ena/ena_rss.c -index be4007e3f3..8193eaf6fc 100644 ---- a/drivers/net/ena/ena_rss.c -+++ b/drivers/net/ena/ena_rss.c -@@ -51,15 +51,14 @@ void ena_rss_key_fill(void *key, size_t size) - static uint8_t default_key[ENA_HASH_KEY_SIZE]; - size_t i; - -- RTE_ASSERT(size <= ENA_HASH_KEY_SIZE); -- - if (!key_generated) { -- for (i = 0; i < ENA_HASH_KEY_SIZE; ++i) -+ for (i = 0; i < RTE_DIM(default_key); ++i) - default_key[i] = rte_rand() & 0xff; - key_generated = true; - } - -- rte_memcpy(key, default_key, size); -+ RTE_ASSERT(size <= sizeof(default_key)); -+ rte_memcpy(key, default_key, RTE_MIN(size, sizeof(default_key))); - } - - int ena_rss_reta_update(struct rte_eth_dev *dev, --- -2.23.0 - diff --git a/0319-net-enetfec-fix-build-with-GCC-12.patch b/0319-net-enetfec-fix-build-with-GCC-12.patch deleted file mode 100644 index 2bc13e4..0000000 --- a/0319-net-enetfec-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,71 +0,0 @@ -From ac8e3a7546ecf4c0b0a753c1efd8327e3a3e96f1 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:50 +0200 -Subject: [PATCH] net/enetfec: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 7c3c0d0f290cfc03dc0e75013af8035b450ee114 ] - -GCC 12 raises the following warning: - -../drivers/net/enetfec/enet_ethdev.c: In function - ‘enetfec_rx_queue_setup’: -../drivers/net/enetfec/enet_ethdev.c:473:9: error: array - subscript 1 is - above array bounds of ‘uint32_t[1]’ {aka ‘unsigned int[1]’} - [-Werror=array-bounds] - 473 | rte_write32(rte_cpu_to_le_32(fep->bd_addr_p_r[queue_idx]), - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 474 | (uint8_t *)fep->hw_baseaddr_v + ENETFEC_RD_START(queue_idx)); - | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In file included from ../drivers/net/enetfec/enet_ethdev.c:9: -../drivers/net/enetfec/enet_ethdev.h:113:33: note: while referencing - ‘bd_addr_p_r’ - 113 | uint32_t bd_addr_p_r[ENETFEC_MAX_Q]; - | ^~~~~~~~~~~ - -This driver properly announces that it only supports 1 rxq. -Silence this warning by adding an explicit check on the queue id. - -Signed-off-by: David Marchand -Acked-by: Stephen Hemminger -Acked-by: Sachin Saxena ---- - drivers/net/enetfec/enet_ethdev.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/net/enetfec/enet_ethdev.c b/drivers/net/enetfec/enet_ethdev.c -index 714f8ac7ec..c938e58204 100644 ---- a/drivers/net/enetfec/enet_ethdev.c -+++ b/drivers/net/enetfec/enet_ethdev.c -@@ -2,9 +2,12 @@ - * Copyright 2020-2021 NXP - */ - -+#include -+ - #include - #include - #include -+ - #include "enet_pmd_logs.h" - #include "enet_ethdev.h" - #include "enet_regs.h" -@@ -454,6 +457,12 @@ enetfec_rx_queue_setup(struct rte_eth_dev *dev, - return -EINVAL; - } - -+ if (queue_idx >= ENETFEC_MAX_Q) { -+ ENETFEC_PMD_ERR("Invalid queue id %" PRIu16 ", max %d\n", -+ queue_idx, ENETFEC_MAX_Q); -+ return -EINVAL; -+ } -+ - /* allocate receive queue */ - rxq = rte_zmalloc(NULL, sizeof(*rxq), RTE_CACHE_LINE_SIZE); - if (rxq == NULL) { --- -2.23.0 - diff --git a/0320-net-ice-fix-build-with-GCC-12.patch b/0320-net-ice-fix-build-with-GCC-12.patch deleted file mode 100644 index a1fedd7..0000000 --- a/0320-net-ice-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,56 +0,0 @@ -From ec6a2fa05c425c42071d164c82d46d0f62ff2e1c Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:51 +0200 -Subject: [PATCH] net/ice: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 20d6a017e148cc1944d85d4c80a0151a5b4c6436 ] - -GCC 12 raises the following warning: - -In file included from ../lib/mempool/rte_mempool.h:46, - from ../lib/mbuf/rte_mbuf.h:38, - from ../lib/net/rte_ether.h:22, - from ../lib/ethdev/rte_ethdev.h:172, - from ../lib/ethdev/ethdev_driver.h:22, - from ../lib/ethdev/ethdev_pci.h:17, - from ../drivers/net/ice/ice_ethdev.c:6: -../drivers/net/ice/ice_ethdev.c: In function ‘ice_dev_configure’: -../lib/eal/x86/include/rte_memcpy.h:370:9: warning: array subscript 64 is - outside array bounds of ‘struct ice_aqc_get_set_rss_keys[1]’ - [-Warray-bounds] - 370 | rte_mov32((uint8_t *)dst + 2 * 32, (const uint8_t *)src + 2 * 32); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../drivers/net/ice/ice_ethdev.c:3202:41: note: while referencing ‘key’ - 3202 | struct ice_aqc_get_set_rss_keys key; - | ^~~ - -Restrict copy to minimum size. - -Bugzilla ID: 850 - -Signed-off-by: David Marchand -Acked-by: Stephen Hemminger ---- - drivers/net/ice/ice_ethdev.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c -index ab3976a319..7df1b4ec19 100644 ---- a/drivers/net/ice/ice_ethdev.c -+++ b/drivers/net/ice/ice_ethdev.c -@@ -3235,7 +3235,8 @@ static int ice_init_rss(struct ice_pf *pf) - RTE_MIN(rss_conf->rss_key_len, - vsi->rss_key_size)); - -- rte_memcpy(key.standard_rss_key, vsi->rss_key, vsi->rss_key_size); -+ rte_memcpy(key.standard_rss_key, vsi->rss_key, -+ RTE_MIN(sizeof(key.standard_rss_key), vsi->rss_key_size)); - ret = ice_aq_set_rss_key(hw, vsi->idx, &key); - if (ret) - goto out; --- -2.23.0 - diff --git a/0321-vdpa-ifc-fix-build-with-GCC-12.patch b/0321-vdpa-ifc-fix-build-with-GCC-12.patch deleted file mode 100644 index 608843f..0000000 --- a/0321-vdpa-ifc-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,49 +0,0 @@ -From f85d0fc3975bb20a6cdbbef21408f3d8d00e2a3f Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:54 +0200 -Subject: [PATCH] vdpa/ifc: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 2a213b794fdd255fde7581a7c9bd034ab39e9b6a ] - -GCC 12 raises the following warning: - -../drivers/vdpa/ifc/ifcvf_vdpa.c: In function ‘vdpa_enable_vfio_intr’: -../drivers/vdpa/ifc/ifcvf_vdpa.c:383:62: error: writing 4 bytes into a - region of size 0 [-Werror=stringop-overflow=] - 383 | fd_ptr[RTE_INTR_VEC_RXTX_OFFSET + i] = fd; - | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~ -../drivers/vdpa/ifc/ifcvf_vdpa.c:348:14: note: at offset 32 into - destination object ‘irq_set_buf’ of size 32 - 348 | char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; - | ^~~~~~~~~~~ - -Validate number of vrings to avoid out of bound access. - -Bugzilla ID: 855 - -Signed-off-by: David Marchand -Acked-by: Xiao Wang -Acked-by: Stephen Hemminger ---- - drivers/vdpa/ifc/ifcvf_vdpa.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c -index 3853c4cf7e..6a915b0d5e 100644 ---- a/drivers/vdpa/ifc/ifcvf_vdpa.c -+++ b/drivers/vdpa/ifc/ifcvf_vdpa.c -@@ -356,6 +356,8 @@ vdpa_enable_vfio_intr(struct ifcvf_internal *internal, bool m_rx) - vring.callfd = -1; - - nr_vring = rte_vhost_get_vring_num(internal->vid); -+ if (nr_vring > IFCVF_MAX_QUEUES * 2) -+ return -1; - - irq_set = (struct vfio_irq_set *)irq_set_buf; - irq_set->argsz = sizeof(irq_set_buf); --- -2.23.0 - diff --git a/0322-app-flow-perf-fix-build-with-GCC-12.patch b/0322-app-flow-perf-fix-build-with-GCC-12.patch deleted file mode 100644 index faf27f7..0000000 --- a/0322-app-flow-perf-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 675b5bdf2c1434493f508f6cf909e33ed0e019b5 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 18 May 2022 12:16:56 +0200 -Subject: [PATCH] app/flow-perf: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 5fc2eece8d4530988e5681fdc8a35e14d69b2a6f ] - -GCC 12 raises the following warning: - -../app/test-flow-perf/main.c: In function ‘start_forwarding’: -../app/test-flow-perf/main.c:1737:28: error: ‘sprintf’ may write a - terminating nul past the end of the destination - [-Werror=format-overflow=] - 1737 | sprintf(p[i++], "%d", (int)n); - | ^ -In function ‘pretty_number’, - inlined from ‘packet_per_second_stats’ at - ../app/test-flow-perf/main.c:1792:4, - inlined from ‘start_forwarding’ at - ../app/test-flow-perf/main.c:1831:3: -[...] - -We can simplify this code and rely on libc integer formatting via -this system locales. - -Bugzilla ID: 856 - -Signed-off-by: David Marchand -Acked-by: Bruce Richardson -Acked-by: Stephen Hemminger ---- - app/test-flow-perf/main.c | 48 ++++++++------------------------------- - 1 file changed, 9 insertions(+), 39 deletions(-) - -diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c -index 56d43734e3..f375097028 100644 ---- a/app/test-flow-perf/main.c -+++ b/app/test-flow-perf/main.c -@@ -16,6 +16,7 @@ - * gives packet per second measurement. - */ - -+#include - #include - #include - #include -@@ -1713,36 +1714,6 @@ do_tx(struct lcore_info *li, uint16_t cnt, uint16_t tx_port, - rte_pktmbuf_free(li->pkts[i]); - } - --/* -- * Method to convert numbers into pretty numbers that easy -- * to read. The design here is to add comma after each three -- * digits and set all of this inside buffer. -- * -- * For example if n = 1799321, the output will be -- * 1,799,321 after this method which is easier to read. -- */ --static char * --pretty_number(uint64_t n, char *buf) --{ -- char p[6][4]; -- int i = 0; -- int off = 0; -- -- while (n > 1000) { -- sprintf(p[i], "%03d", (int)(n % 1000)); -- n /= 1000; -- i += 1; -- } -- -- sprintf(p[i++], "%d", (int)n); -- -- while (i--) -- off += sprintf(buf + off, "%s,", p[i]); -- buf[strlen(buf) - 1] = '\0'; -- -- return buf; --} -- - static void - packet_per_second_stats(void) - { -@@ -1764,7 +1735,6 @@ packet_per_second_stats(void) - uint64_t total_rx_pkts = 0; - uint64_t total_tx_drops = 0; - uint64_t tx_delta, rx_delta, drops_delta; -- char buf[3][32]; - int nr_valid_core = 0; - - sleep(1); -@@ -1789,10 +1759,8 @@ packet_per_second_stats(void) - tx_delta = li->tx_pkts - oli->tx_pkts; - rx_delta = li->rx_pkts - oli->rx_pkts; - drops_delta = li->tx_drops - oli->tx_drops; -- printf("%6d %16s %16s %16s\n", i, -- pretty_number(tx_delta, buf[0]), -- pretty_number(drops_delta, buf[1]), -- pretty_number(rx_delta, buf[2])); -+ printf("%6d %'16"PRId64" %'16"PRId64" %'16"PRId64"\n", -+ i, tx_delta, drops_delta, rx_delta); - - total_tx_pkts += tx_delta; - total_rx_pkts += rx_delta; -@@ -1803,10 +1771,9 @@ packet_per_second_stats(void) - } - - if (nr_valid_core > 1) { -- printf("%6s %16s %16s %16s\n", "total", -- pretty_number(total_tx_pkts, buf[0]), -- pretty_number(total_tx_drops, buf[1]), -- pretty_number(total_rx_pkts, buf[2])); -+ printf("%6s %'16"PRId64" %'16"PRId64" %'16"PRId64"\n", -+ "total", total_tx_pkts, total_tx_drops, -+ total_rx_pkts); - nr_lines += 1; - } - -@@ -2139,6 +2106,9 @@ main(int argc, char **argv) - if (argc > 1) - args_parse(argc, argv); - -+ /* For more fancy, localised integer formatting. */ -+ setlocale(LC_NUMERIC, ""); -+ - init_port(); - - nb_lcores = rte_lcore_count(); --- -2.23.0 - diff --git a/0323-common-cpt-fix-build-with-GCC-12.patch b/0323-common-cpt-fix-build-with-GCC-12.patch deleted file mode 100644 index ed498bb..0000000 --- a/0323-common-cpt-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 978835ed87a361a24e0c4424f1a352d13fb7bfac Mon Sep 17 00:00:00 2001 -From: Ankur Dwivedi -Date: Fri, 17 Jun 2022 19:09:29 +0530 -Subject: [PATCH] common/cpt: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 3aa16821ab3e0a21052880fbf4dcb76801380c31 ] - -The following warning is observed with GCC 12 compilation: - -In function ‘fill_sg_comp_from_iov’, - inlined from ‘cpt_zuc_snow3g_enc_prep’ at - ../drivers/common/cpt/cpt_ucode.h:1672:9, - inlined from ‘cpt_fc_enc_hmac_prep’ at - ../drivers/common/cpt/cpt_ucode.h:2472:3, - inlined from ‘fill_digest_params’ at - ../drivers/common/cpt/cpt_ucode.h:3548:14, - inlined from ‘otx_cpt_enq_single_sym’ at - ../drivers/crypto/octeontx/otx_cryptodev_ops.c:541:9, - inlined from ‘otx_cpt_enq_single_sym_sessless’ at - ../drivers/crypto/octeontx/otx_cryptodev_ops.c:584:8, - inlined from ‘otx_cpt_enq_single’ at - ../drivers/crypto/octeontx/otx_cryptodev_ops.c:611:11, - inlined from ‘otx_cpt_pkt_enqueue’ at - ../drivers/crypto/octeontx/otx_cryptodev_ops.c:643:9, - inlined from ‘otx_cpt_enqueue_sym’ at - ../drivers/crypto/octeontx/otx_cryptodev_ops.c:668:9: -../drivers/common/cpt/cpt_ucode.h:415:36: warning: array subscript 0 is -outside array bounds of ‘buf_ptr_t[0]’ {aka ‘struct buf_ptr[]’} -[-Warray-bounds] - 415 | e_dma_addr = bufs[j].dma_addr; - | ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~ -../drivers/common/cpt/cpt_ucode.h:416:48: warning: array subscript 0 is -outside array bounds of ‘buf_ptr_t[0]’ {aka ‘struct buf_ptr[]’} -[-Warray-bounds] - 416 | e_len = (size > bufs[j].size) ? - | ~~~~~~~^~~~~ - -This patch resolves the warning. - -Bugzilla ID: 861 -Fixes: 9be415daf469 ("common/cpt: add common defines for microcode") -Fixes: b74652f3a91f ("common/cpt: add microcode interface for encryption") - -Signed-off-by: Ankur Dwivedi -Reviewed-by: Anoob Joseph -Reviewed-by: Jerin Jacob -Tested-by: David Marchand ---- - drivers/common/cpt/cpt_mcode_defines.h | 2 +- - drivers/common/cpt/cpt_ucode.h | 21 ++++++++++----------- - 2 files changed, 11 insertions(+), 12 deletions(-) - -diff --git a/drivers/common/cpt/cpt_mcode_defines.h b/drivers/common/cpt/cpt_mcode_defines.h -index f16ee44297..e6dcb7674c 100644 ---- a/drivers/common/cpt/cpt_mcode_defines.h -+++ b/drivers/common/cpt/cpt_mcode_defines.h -@@ -387,7 +387,7 @@ typedef struct buf_ptr { - /* IOV Pointer */ - typedef struct{ - int buf_cnt; -- buf_ptr_t bufs[0]; -+ buf_ptr_t bufs[]; - } iov_ptr_t; - - typedef struct fc_params { -diff --git a/drivers/common/cpt/cpt_ucode.h b/drivers/common/cpt/cpt_ucode.h -index e1f2f6005d..22aabab6ac 100644 ---- a/drivers/common/cpt/cpt_ucode.h -+++ b/drivers/common/cpt/cpt_ucode.h -@@ -394,27 +394,26 @@ fill_sg_comp_from_iov(sg_comp_t *list, - int32_t j; - uint32_t extra_len = extra_buf ? extra_buf->size : 0; - uint32_t size = *psize; -- buf_ptr_t *bufs; - -- bufs = from->bufs; - for (j = 0; (j < from->buf_cnt) && size; j++) { -+ phys_addr_t dma_addr = from->bufs[j].dma_addr; -+ uint32_t buf_sz = from->bufs[j].size; -+ sg_comp_t *to = &list[i >> 2]; - phys_addr_t e_dma_addr; - uint32_t e_len; -- sg_comp_t *to = &list[i >> 2]; - - if (unlikely(from_offset)) { -- if (from_offset >= bufs[j].size) { -- from_offset -= bufs[j].size; -+ if (from_offset >= buf_sz) { -+ from_offset -= buf_sz; - continue; - } -- e_dma_addr = bufs[j].dma_addr + from_offset; -- e_len = (size > (bufs[j].size - from_offset)) ? -- (bufs[j].size - from_offset) : size; -+ e_dma_addr = dma_addr + from_offset; -+ e_len = (size > (buf_sz - from_offset)) ? -+ (buf_sz - from_offset) : size; - from_offset = 0; - } else { -- e_dma_addr = bufs[j].dma_addr; -- e_len = (size > bufs[j].size) ? -- bufs[j].size : size; -+ e_dma_addr = dma_addr; -+ e_len = (size > buf_sz) ? buf_sz : size; - } - - to->u.s.len[i % 4] = rte_cpu_to_be_16(e_len); --- -2.23.0 - diff --git a/0324-crypto-cnxk-fix-build-with-GCC-12.patch b/0324-crypto-cnxk-fix-build-with-GCC-12.patch deleted file mode 100644 index 02b8985..0000000 --- a/0324-crypto-cnxk-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,90 +0,0 @@ -From e0bff8480fce6437124558f49f608f214c9092be Mon Sep 17 00:00:00 2001 -From: Ankur Dwivedi -Date: Fri, 17 Jun 2022 19:09:30 +0530 -Subject: [PATCH] crypto/cnxk: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit d82d2db2659411059c047a96e867666625a0f1f2 ] - -The following warning is observed with GCC 12 compilation: - -In file included from ../drivers/crypto/cnxk/cn10k_cryptodev_ops.c:17: -In function ‘fill_sg_comp_from_iov’, - inlined from ‘cpt_pdcp_chain_alg_prep’ at - ../drivers/crypto/cnxk/cnxk_se.h:1194:8, - inlined from ‘cpt_fc_enc_hmac_prep’ at - ../drivers/crypto/cnxk/cnxk_se.h:1871:9, - inlined from ‘fill_digest_params’ at - ../drivers/crypto/cnxk/cnxk_se.h:2829:8, - inlined from ‘cpt_sym_inst_fill’ at - ../drivers/crypto/cnxk/cn10k_cryptodev_ops.c:92:9, - inlined from ‘cn10k_cpt_fill_inst.constprop’ at - ../drivers/crypto/cnxk/cn10k_cryptodev_ops.c:146:10: -../drivers/crypto/cnxk/cnxk_se.h:222:52: warning: array subscript 0 is -outside array bounds of ‘struct roc_se_buf_ptr[0]’ [-Warray-bounds] - 222 | e_vaddr = (uint64_t)bufs[j].vaddr; - | ~~~~~~~^~~~~~ -../drivers/crypto/cnxk/cnxk_se.h:223:48: warning: array subscript 0 is -outside array bounds of ‘struct roc_se_buf_ptr[0]’ [-Warray-bounds] - 223 | e_len = (size > bufs[j].size) ? bufs[j].size : size; - | ~~~~~~~^~~~~ - -This patch resolves the warning. - -Fixes: 3de331795f73 ("crypto/cnxk: add flexi cipher encryption") - -Signed-off-by: Ankur Dwivedi -Reviewed-by: Anoob Joseph -Reviewed-by: Jerin Jacob -Tested-by: David Marchand ---- - drivers/crypto/cnxk/cnxk_se.h | 20 ++++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h -index 37237de21a..99a2894fa6 100644 ---- a/drivers/crypto/cnxk/cnxk_se.h -+++ b/drivers/crypto/cnxk/cnxk_se.h -@@ -179,27 +179,27 @@ fill_sg_comp_from_iov(struct roc_se_sglist_comp *list, uint32_t i, - int32_t j; - uint32_t extra_len = extra_buf ? extra_buf->size : 0; - uint32_t size = *psize; -- struct roc_se_buf_ptr *bufs; - -- bufs = from->bufs; - for (j = 0; (j < from->buf_cnt) && size; j++) { -+ struct roc_se_sglist_comp *to = &list[i >> 2]; -+ uint32_t buf_sz = from->bufs[j].size; -+ void *vaddr = from->bufs[j].vaddr; - uint64_t e_vaddr; - uint32_t e_len; -- struct roc_se_sglist_comp *to = &list[i >> 2]; - - if (unlikely(from_offset)) { -- if (from_offset >= bufs[j].size) { -- from_offset -= bufs[j].size; -+ if (from_offset >= buf_sz) { -+ from_offset -= buf_sz; - continue; - } -- e_vaddr = (uint64_t)bufs[j].vaddr + from_offset; -- e_len = (size > (bufs[j].size - from_offset)) ? -- (bufs[j].size - from_offset) : -+ e_vaddr = (uint64_t)vaddr + from_offset; -+ e_len = (size > (buf_sz - from_offset)) ? -+ (buf_sz - from_offset) : - size; - from_offset = 0; - } else { -- e_vaddr = (uint64_t)bufs[j].vaddr; -- e_len = (size > bufs[j].size) ? bufs[j].size : size; -+ e_vaddr = (uint64_t)vaddr; -+ e_len = (size > buf_sz) ? buf_sz : size; - } - - to->u.s.len[i % 4] = rte_cpu_to_be_16(e_len); --- -2.23.0 - diff --git a/0325-test-ipsec-fix-build-with-GCC-12.patch b/0325-test-ipsec-fix-build-with-GCC-12.patch deleted file mode 100644 index e74fae9..0000000 --- a/0325-test-ipsec-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 9445fcf1388068915ae4c0cebbac527482b39215 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Thu, 16 Jun 2022 11:33:20 +0200 -Subject: [PATCH] test/ipsec: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 6e108b6a7c0c0699e6304f7b5706736b34d32607 ] - -GCC 12 raises the following warning: - -In function ‘_mm256_loadu_si256’, - inlined from ‘rte_mov32’ at - ../lib/eal/x86/include/rte_memcpy.h:319:9, - inlined from ‘rte_mov128’ at - ../lib/eal/x86/include/rte_memcpy.h:344:2, - inlined from ‘rte_memcpy_generic’ at - ../lib/eal/x86/include/rte_memcpy.h:438:4, - inlined from ‘rte_memcpy’ at - ../lib/eal/x86/include/rte_memcpy.h:882:10, - inlined from ‘setup_test_string.constprop’ at - ../app/test/test_ipsec.c:572:4: -/usr/lib/gcc/x86_64-redhat-linux/12/include/avxintrin.h:929:10: error: - array subscript ‘__m256i_u[3]’ is partly outside array bounds of - ‘const char[108]’ [-Werror=array-bounds] - 929 | return *__P; - | ^~~~ -../app/test/test_ipsec.c: In function ‘setup_test_string.constprop’: -../app/test/test_ipsec.c:539:12: note: at offset 96 into object - ‘null_plain_data’ of size 108 - 539 | const char null_plain_data[] = - | ^~~~~~~~~~~~~~~ - -Add a hint so that the compiler understands the copied data is within -the passed string boundaries. - -Bugzilla ID: 848 -Fixes: 05fe65eb66b2 ("test/ipsec: introduce functional test") - -Signed-off-by: David Marchand ---- - app/test/test_ipsec.c | 35 ++++++++++++++++++++++------------- - 1 file changed, 22 insertions(+), 13 deletions(-) - -diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c -index bc2a3dbc2e..3c6dcdc604 100644 ---- a/app/test/test_ipsec.c -+++ b/app/test/test_ipsec.c -@@ -543,12 +543,14 @@ struct rte_ipv4_hdr ipv4_outer = { - }; - - static struct rte_mbuf * --setup_test_string(struct rte_mempool *mpool, -- const char *string, size_t len, uint8_t blocksize) -+setup_test_string(struct rte_mempool *mpool, const char *string, -+ size_t string_len, size_t len, uint8_t blocksize) - { - struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); - size_t t_len = len - (blocksize ? (len % blocksize) : 0); - -+ RTE_VERIFY(len <= string_len); -+ - if (m) { - memset(m->buf_addr, 0, m->buf_len); - char *dst = rte_pktmbuf_append(m, t_len); -@@ -1354,7 +1356,8 @@ test_ipsec_crypto_outb_burst_null_null(int i) - /* Generate input mbuf data */ - for (j = 0; j < num_pkts && rc == 0; j++) { - ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->ibuf[j] == NULL) - rc = TEST_FAILED; - else { -@@ -1472,7 +1475,8 @@ test_ipsec_inline_crypto_inb_burst_null_null(int i) - /* Generate test mbuf data */ - ut_params->obuf[j] = setup_test_string( - ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->obuf[j] == NULL) - rc = TEST_FAILED; - } -@@ -1540,16 +1544,17 @@ test_ipsec_inline_proto_inb_burst_null_null(int i) - - /* Generate inbound mbuf data */ - for (j = 0; j < num_pkts && rc == 0; j++) { -- ut_params->ibuf[j] = setup_test_string( -- ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->ibuf[j] == NULL) - rc = TEST_FAILED; - else { - /* Generate test mbuf data */ - ut_params->obuf[j] = setup_test_string( - ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->obuf[j] == NULL) - rc = TEST_FAILED; - } -@@ -1649,7 +1654,8 @@ test_ipsec_inline_crypto_outb_burst_null_null(int i) - /* Generate test mbuf data */ - for (j = 0; j < num_pkts && rc == 0; j++) { - ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->ibuf[0] == NULL) - rc = TEST_FAILED; - -@@ -1727,15 +1733,17 @@ test_ipsec_inline_proto_outb_burst_null_null(int i) - /* Generate test mbuf data */ - for (j = 0; j < num_pkts && rc == 0; j++) { - ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ null_plain_data, sizeof(null_plain_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->ibuf[0] == NULL) - rc = TEST_FAILED; - - if (rc == 0) { - /* Generate test tunneled mbuf data for comparison */ - ut_params->obuf[j] = setup_test_string( -- ts_params->mbuf_pool, -- null_plain_data, test_cfg[i].pkt_sz, 0); -+ ts_params->mbuf_pool, null_plain_data, -+ sizeof(null_plain_data), test_cfg[i].pkt_sz, -+ 0); - if (ut_params->obuf[j] == NULL) - rc = TEST_FAILED; - } -@@ -1804,7 +1812,8 @@ test_ipsec_lksd_proto_inb_burst_null_null(int i) - for (j = 0; j < num_pkts && rc == 0; j++) { - /* packet with sequence number 0 is invalid */ - ut_params->ibuf[j] = setup_test_string(ts_params->mbuf_pool, -- null_encrypted_data, test_cfg[i].pkt_sz, 0); -+ null_encrypted_data, sizeof(null_encrypted_data), -+ test_cfg[i].pkt_sz, 0); - if (ut_params->ibuf[j] == NULL) - rc = TEST_FAILED; - } --- -2.23.0 - diff --git a/0326-vhost-crypto-fix-build-with-GCC-12.patch b/0326-vhost-crypto-fix-build-with-GCC-12.patch deleted file mode 100644 index e177c3f..0000000 --- a/0326-vhost-crypto-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,221 +0,0 @@ -From f69a61bde0e2d72021fd3c609fd4b62edc8f8951 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Thu, 16 Jun 2022 16:46:50 +0200 -Subject: [PATCH] vhost/crypto: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 4414bb67010dfec2559af52efe8f479b26d55447 ] - -GCC 12 raises the following warning: - -In file included from ../lib/mempool/rte_mempool.h:46, - from ../lib/mbuf/rte_mbuf.h:38, - from ../lib/vhost/vhost_crypto.c:7: -../lib/vhost/vhost_crypto.c: In function ‘rte_vhost_crypto_fetch_requests’: -../lib/eal/x86/include/rte_memcpy.h:371:9: warning: array subscript 1 is - outside array bounds of ‘struct virtio_crypto_op_data_req[1]’ - [-Warray-bounds] - 371 | rte_mov32((uint8_t *)dst + 3 * 32, (const uint8_t *)src + 3 * 32); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../lib/vhost/vhost_crypto.c:1178:42: note: while referencing ‘req’ - 1178 | struct virtio_crypto_op_data_req req; - | ^~~ - -Split this function and separate the per descriptor copy. -This makes the code clearer, and the compiler happier. - -Note: logs for errors have been moved to callers to avoid duplicates. - -Fixes: 3c79609fda7c ("vhost/crypto: handle virtually non-contiguous buffers") - -Signed-off-by: David Marchand -Reviewed-by: Maxime Coquelin ---- - lib/vhost/vhost_crypto.c | 123 +++++++++++++++------------------------ - 1 file changed, 46 insertions(+), 77 deletions(-) - -diff --git a/lib/vhost/vhost_crypto.c b/lib/vhost/vhost_crypto.c -index 926b5c0bd9..293960d350 100644 ---- a/lib/vhost/vhost_crypto.c -+++ b/lib/vhost/vhost_crypto.c -@@ -565,94 +565,58 @@ get_data_ptr(struct vhost_crypto_data_req *vc_req, - return data; - } - --static __rte_always_inline int --copy_data(void *dst_data, struct vhost_crypto_data_req *vc_req, -- struct vhost_crypto_desc *head, -- struct vhost_crypto_desc **cur_desc, -- uint32_t size, uint32_t max_n_descs) -+static __rte_always_inline uint32_t -+copy_data_from_desc(void *dst, struct vhost_crypto_data_req *vc_req, -+ struct vhost_crypto_desc *desc, uint32_t size) - { -- struct vhost_crypto_desc *desc = *cur_desc; -- uint64_t remain, addr, dlen, len; -- uint32_t to_copy; -- uint8_t *data = dst_data; -- uint8_t *src; -- int left = size; -- -- to_copy = RTE_MIN(desc->len, (uint32_t)left); -- dlen = to_copy; -- src = IOVA_TO_VVA(uint8_t *, vc_req, desc->addr, &dlen, -- VHOST_ACCESS_RO); -- if (unlikely(!src || !dlen)) -- return -1; -+ uint64_t remain; -+ uint64_t addr; -+ -+ remain = RTE_MIN(desc->len, size); -+ addr = desc->addr; -+ do { -+ uint64_t len; -+ void *src; -+ -+ len = remain; -+ src = IOVA_TO_VVA(void *, vc_req, addr, &len, VHOST_ACCESS_RO); -+ if (unlikely(src == NULL || len == 0)) -+ return 0; - -- rte_memcpy((uint8_t *)data, src, dlen); -- data += dlen; -+ rte_memcpy(dst, src, len); -+ remain -= len; -+ /* cast is needed for 32-bit architecture */ -+ dst = RTE_PTR_ADD(dst, (size_t)len); -+ addr += len; -+ } while (unlikely(remain != 0)); - -- if (unlikely(dlen < to_copy)) { -- remain = to_copy - dlen; -- addr = desc->addr + dlen; -+ return RTE_MIN(desc->len, size); -+} - -- while (remain) { -- len = remain; -- src = IOVA_TO_VVA(uint8_t *, vc_req, addr, &len, -- VHOST_ACCESS_RO); -- if (unlikely(!src || !len)) { -- VC_LOG_ERR("Failed to map descriptor"); -- return -1; -- } - -- rte_memcpy(data, src, len); -- addr += len; -- remain -= len; -- data += len; -- } -- } -+static __rte_always_inline int -+copy_data(void *data, struct vhost_crypto_data_req *vc_req, -+ struct vhost_crypto_desc *head, struct vhost_crypto_desc **cur_desc, -+ uint32_t size, uint32_t max_n_descs) -+{ -+ struct vhost_crypto_desc *desc = *cur_desc; -+ uint32_t left = size; - -- left -= to_copy; -+ do { -+ uint32_t copied; - -- while (desc >= head && desc - head < (int)max_n_descs && left) { -- desc++; -- to_copy = RTE_MIN(desc->len, (uint32_t)left); -- dlen = to_copy; -- src = IOVA_TO_VVA(uint8_t *, vc_req, desc->addr, &dlen, -- VHOST_ACCESS_RO); -- if (unlikely(!src || !dlen)) { -- VC_LOG_ERR("Failed to map descriptor"); -+ copied = copy_data_from_desc(data, vc_req, desc, left); -+ if (copied == 0) - return -1; -- } -- -- rte_memcpy(data, src, dlen); -- data += dlen; -- -- if (unlikely(dlen < to_copy)) { -- remain = to_copy - dlen; -- addr = desc->addr + dlen; -- -- while (remain) { -- len = remain; -- src = IOVA_TO_VVA(uint8_t *, vc_req, addr, &len, -- VHOST_ACCESS_RO); -- if (unlikely(!src || !len)) { -- VC_LOG_ERR("Failed to map descriptor"); -- return -1; -- } -- -- rte_memcpy(data, src, len); -- addr += len; -- remain -= len; -- data += len; -- } -- } -- -- left -= to_copy; -- } -+ left -= copied; -+ data = RTE_PTR_ADD(data, copied); -+ desc++; -+ } while (desc < head + max_n_descs && left != 0); - -- if (unlikely(left > 0)) { -- VC_LOG_ERR("Incorrect virtio descriptor"); -+ if (unlikely(left != 0)) - return -1; -- } - -- if (unlikely(desc - head == (int)max_n_descs)) -+ if (unlikely(desc == head + max_n_descs)) - *cur_desc = NULL; - else - *cur_desc = desc + 1; -@@ -852,6 +816,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op, - /* iv */ - if (unlikely(copy_data(iv_data, vc_req, head, &desc, - cipher->para.iv_len, max_n_descs))) { -+ VC_LOG_ERR("Incorrect virtio descriptor"); - ret = VIRTIO_CRYPTO_BADMSG; - goto error_exit; - } -@@ -883,6 +848,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op, - if (unlikely(copy_data(rte_pktmbuf_mtod(m_src, uint8_t *), - vc_req, head, &desc, cipher->para.src_data_len, - max_n_descs) < 0)) { -+ VC_LOG_ERR("Incorrect virtio descriptor"); - ret = VIRTIO_CRYPTO_BADMSG; - goto error_exit; - } -@@ -1006,6 +972,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op, - /* iv */ - if (unlikely(copy_data(iv_data, vc_req, head, &desc, - chain->para.iv_len, max_n_descs) < 0)) { -+ VC_LOG_ERR("Incorrect virtio descriptor"); - ret = VIRTIO_CRYPTO_BADMSG; - goto error_exit; - } -@@ -1037,6 +1004,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op, - if (unlikely(copy_data(rte_pktmbuf_mtod(m_src, uint8_t *), - vc_req, head, &desc, chain->para.src_data_len, - max_n_descs) < 0)) { -+ VC_LOG_ERR("Incorrect virtio descriptor"); - ret = VIRTIO_CRYPTO_BADMSG; - goto error_exit; - } -@@ -1121,6 +1089,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op, - if (unlikely(copy_data(digest_addr, vc_req, head, &digest_desc, - chain->para.hash_result_len, - max_n_descs) < 0)) { -+ VC_LOG_ERR("Incorrect virtio descriptor"); - ret = VIRTIO_CRYPTO_BADMSG; - goto error_exit; - } --- -2.23.0 - diff --git a/0327-vhost-crypto-fix-descriptor-processing.patch b/0327-vhost-crypto-fix-descriptor-processing.patch deleted file mode 100644 index 96f47e3..0000000 --- a/0327-vhost-crypto-fix-descriptor-processing.patch +++ /dev/null @@ -1,40 +0,0 @@ -From d6e4e0f46e27a5eae66ce436b522c7602accf346 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 22 Jun 2022 17:30:20 +0200 -Subject: [PATCH] vhost/crypto: fix descriptor processing - -[ upstream commit 2fbada91545c004f04449500af0c6276900317ab ] - -copy_data was returning a pointer to an increased (off by one) descriptor. -Subsequent calls to copy_data in the library were then failing. -Fix this by incrementing the descriptor only if there is some left data -to copy. - -Fixes: 4414bb67010d ("vhost/crypto: fix build with GCC 12") - -Reported-by: Jakub Poczatek -Signed-off-by: David Marchand -Reviewed-by: Maxime Coquelin -Tested-by: Jakub Poczatek -Acked-by: Fan Zhang ---- - lib/vhost/vhost_crypto.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/lib/vhost/vhost_crypto.c b/lib/vhost/vhost_crypto.c -index 293960d350..7d1d6a1861 100644 ---- a/lib/vhost/vhost_crypto.c -+++ b/lib/vhost/vhost_crypto.c -@@ -610,8 +610,7 @@ copy_data(void *data, struct vhost_crypto_data_req *vc_req, - return -1; - left -= copied; - data = RTE_PTR_ADD(data, copied); -- desc++; -- } while (desc < head + max_n_descs && left != 0); -+ } while (left != 0 && ++desc < head + max_n_descs); - - if (unlikely(left != 0)) - return -1; --- -2.23.0 - diff --git a/0328-net-ice-base-fix-build-with-GCC-12.patch b/0328-net-ice-base-fix-build-with-GCC-12.patch deleted file mode 100644 index 1559b6c..0000000 --- a/0328-net-ice-base-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,82 +0,0 @@ -From cca0819d488f62311320a08fbd669a21fccf4818 Mon Sep 17 00:00:00 2001 -From: Wenxuan Wu -Date: Thu, 23 Jun 2022 17:01:05 +0800 -Subject: [PATCH] net/ice/base: fix build with GCC 12 - -[ upstream commit 3e87e12dc8bcb1d06dafcb302b056fee51deb090 ] - -GCC 12 with -O2 flag would raise the following warning: -../drivers/net/ice/base/ice_switch.c:7220:61: error: writing 1 byte into a -region of size 0 [-Werror=stringop-overflow=] - 7220 | buf[recps].content.lkup_indx[i + 1] = entry->fv_idx[i]; - | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~ - -This patch changed the type of fv_idx in struct ice_recp_grp_entry to -align with its callers which are also u8 type. - -Fixes: 04b8ec1ea807 ("net/ice/base: add protocol structures and defines") - -Signed-off-by: Wenxuan Wu -Acked-by: Qi Zhang ---- - drivers/net/ice/base/ice_flex_pipe.c | 2 +- - drivers/net/ice/base/ice_flex_pipe.h | 2 +- - drivers/net/ice/base/ice_protocol_type.h | 2 +- - drivers/net/ice/base/ice_switch.h | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/ice/base/ice_flex_pipe.c b/drivers/net/ice/base/ice_flex_pipe.c -index f6a29f87c5..3918169001 100644 ---- a/drivers/net/ice/base/ice_flex_pipe.c -+++ b/drivers/net/ice/base/ice_flex_pipe.c -@@ -2564,7 +2564,7 @@ enum ice_status ice_destroy_tunnel(struct ice_hw *hw, u16 port, bool all) - * @off: variable to receive the protocol offset - */ - enum ice_status --ice_find_prot_off(struct ice_hw *hw, enum ice_block blk, u8 prof, u16 fv_idx, -+ice_find_prot_off(struct ice_hw *hw, enum ice_block blk, u8 prof, u8 fv_idx, - u8 *prot, u16 *off) - { - struct ice_fv_word *fv_ext; -diff --git a/drivers/net/ice/base/ice_flex_pipe.h b/drivers/net/ice/base/ice_flex_pipe.h -index 23ba45564a..ab897de4f3 100644 ---- a/drivers/net/ice/base/ice_flex_pipe.h -+++ b/drivers/net/ice/base/ice_flex_pipe.h -@@ -25,7 +25,7 @@ enum ice_status - ice_acquire_change_lock(struct ice_hw *hw, enum ice_aq_res_access_type access); - void ice_release_change_lock(struct ice_hw *hw); - enum ice_status --ice_find_prot_off(struct ice_hw *hw, enum ice_block blk, u8 prof, u16 fv_idx, -+ice_find_prot_off(struct ice_hw *hw, enum ice_block blk, u8 prof, u8 fv_idx, - u8 *prot, u16 *off); - enum ice_status - ice_find_label_value(struct ice_seg *ice_seg, char const *name, u32 type, -diff --git a/drivers/net/ice/base/ice_protocol_type.h b/drivers/net/ice/base/ice_protocol_type.h -index 7dcc983707..d27ef46713 100644 ---- a/drivers/net/ice/base/ice_protocol_type.h -+++ b/drivers/net/ice/base/ice_protocol_type.h -@@ -423,7 +423,7 @@ struct ice_recp_grp_entry { - #define ICE_INVAL_CHAIN_IND 0xFF - u16 rid; - u8 chain_idx; -- u16 fv_idx[ICE_NUM_WORDS_RECIPE]; -+ u8 fv_idx[ICE_NUM_WORDS_RECIPE]; - u16 fv_mask[ICE_NUM_WORDS_RECIPE]; - struct ice_pref_recipe_group r_group; - }; -diff --git a/drivers/net/ice/base/ice_switch.h b/drivers/net/ice/base/ice_switch.h -index a2b3c80107..c67cd09d21 100644 ---- a/drivers/net/ice/base/ice_switch.h -+++ b/drivers/net/ice/base/ice_switch.h -@@ -203,7 +203,7 @@ struct ice_fltr_info { - - struct ice_update_recipe_lkup_idx_params { - u16 rid; -- u16 fv_idx; -+ u8 fv_idx; - bool ignore_valid; - u16 mask; - bool mask_valid; --- -2.23.0 - diff --git a/0329-net-qede-fix-build-with-GCC-12.patch b/0329-net-qede-fix-build-with-GCC-12.patch deleted file mode 100644 index ebf8b8e..0000000 --- a/0329-net-qede-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,155 +0,0 @@ -From e4939398dfe939e8f1c91c04734ea83f335a8d37 Mon Sep 17 00:00:00 2001 -From: Stephen Hemminger -Date: Tue, 7 Jun 2022 10:17:40 -0700 -Subject: [PATCH] net/qede: fix build with GCC 12 - -[ upstream commit 4200c4d62586985d70ad69ed7bee526a282b8777 ] - -The x86 version of rte_memcpy can cause warnings. The driver does -not need to use rte_memcpy for everything. Standard memcpy is -just as fast and safer; the compiler and static analysis tools -treat memcpy specially. - -Signed-off-by: Stephen Hemminger ---- - drivers/net/qede/base/bcm_osal.h | 3 +-- - drivers/net/qede/qede_ethdev.c | 2 +- - drivers/net/qede/qede_filter.c | 16 ++++++---------- - drivers/net/qede/qede_main.c | 13 ++++++------- - drivers/net/qede/qede_sriov.c | 6 +++--- - 5 files changed, 17 insertions(+), 23 deletions(-) - -diff --git a/drivers/net/qede/base/bcm_osal.h b/drivers/net/qede/base/bcm_osal.h -index c5b5399282..9ea579bfc8 100644 ---- a/drivers/net/qede/base/bcm_osal.h -+++ b/drivers/net/qede/base/bcm_osal.h -@@ -14,7 +14,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -99,7 +98,7 @@ typedef intptr_t osal_int_ptr_t; - } while (0) - #define OSAL_VFREE(dev, memory) OSAL_FREE(dev, memory) - #define OSAL_MEM_ZERO(mem, size) bzero(mem, size) --#define OSAL_MEMCPY(dst, src, size) rte_memcpy(dst, src, size) -+#define OSAL_MEMCPY(dst, src, size) memcpy(dst, src, size) - #define OSAL_MEMCMP(s1, s2, size) memcmp(s1, s2, size) - #define OSAL_MEMSET(dst, val, length) \ - memset(dst, val, length) -diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c -index a1122a297e..2a3123f0c8 100644 ---- a/drivers/net/qede/qede_ethdev.c -+++ b/drivers/net/qede/qede_ethdev.c -@@ -358,7 +358,7 @@ qede_assign_rxtx_handlers(struct rte_eth_dev *dev, bool is_dummy) - static void - qede_alloc_etherdev(struct qede_dev *qdev, struct qed_dev_eth_info *info) - { -- rte_memcpy(&qdev->dev_info, info, sizeof(*info)); -+ qdev->dev_info = *info; - qdev->ops = qed_ops; - } - -diff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c -index 440440423a..ca3165d972 100644 ---- a/drivers/net/qede/qede_filter.c -+++ b/drivers/net/qede/qede_filter.c -@@ -388,10 +388,8 @@ qede_arfs_construct_pkt(struct rte_eth_dev *eth_dev, - ip6->vtc_flow = - rte_cpu_to_be_32(QEDE_FDIR_IPV6_DEFAULT_VTC_FLOW); - -- rte_memcpy(&ip6->src_addr, arfs->tuple.src_ipv6, -- IPV6_ADDR_LEN); -- rte_memcpy(&ip6->dst_addr, arfs->tuple.dst_ipv6, -- IPV6_ADDR_LEN); -+ memcpy(&ip6->src_addr, arfs->tuple.src_ipv6, IPV6_ADDR_LEN); -+ memcpy(&ip6->dst_addr, arfs->tuple.dst_ipv6, IPV6_ADDR_LEN); - len += sizeof(struct rte_ipv6_hdr); - params->ipv6 = true; - -@@ -821,12 +819,10 @@ qede_flow_parse_pattern(__rte_unused struct rte_eth_dev *dev, - const struct rte_flow_item_ipv6 *spec; - - spec = pattern->spec; -- rte_memcpy(flow->entry.tuple.src_ipv6, -- spec->hdr.src_addr, -- IPV6_ADDR_LEN); -- rte_memcpy(flow->entry.tuple.dst_ipv6, -- spec->hdr.dst_addr, -- IPV6_ADDR_LEN); -+ memcpy(flow->entry.tuple.src_ipv6, -+ spec->hdr.src_addr, IPV6_ADDR_LEN); -+ memcpy(flow->entry.tuple.dst_ipv6, -+ spec->hdr.dst_addr, IPV6_ADDR_LEN); - flow->entry.tuple.eth_proto = - RTE_ETHER_TYPE_IPV6; - } -diff --git a/drivers/net/qede/qede_main.c b/drivers/net/qede/qede_main.c -index 2d1f70693a..c5afdb00d5 100644 ---- a/drivers/net/qede/qede_main.c -+++ b/drivers/net/qede/qede_main.c -@@ -373,7 +373,7 @@ qed_fill_dev_info(struct ecore_dev *edev, struct qed_dev_info *dev_info) - dev_info->mtu = ECORE_LEADING_HWFN(edev)->hw_info.mtu; - dev_info->dev_type = edev->type; - -- rte_memcpy(&dev_info->hw_mac, &edev->hwfns[0].hw_info.hw_mac_addr, -+ memcpy(&dev_info->hw_mac, &edev->hwfns[0].hw_info.hw_mac_addr, - RTE_ETHER_ADDR_LEN); - - dev_info->fw_major = FW_MAJOR_VERSION; -@@ -441,7 +441,7 @@ qed_fill_eth_dev_info(struct ecore_dev *edev, struct qed_dev_eth_info *info) - info->num_vlan_filters = RESC_NUM(&edev->hwfns[0], ECORE_VLAN) - - max_vf_vlan_filters; - -- rte_memcpy(&info->port_mac, &edev->hwfns[0].hw_info.hw_mac_addr, -+ memcpy(&info->port_mac, &edev->hwfns[0].hw_info.hw_mac_addr, - RTE_ETHER_ADDR_LEN); - } else { - ecore_vf_get_num_rxqs(ECORE_LEADING_HWFN(edev), -@@ -472,7 +472,7 @@ static void qed_set_name(struct ecore_dev *edev, char name[NAME_SIZE]) - { - int i; - -- rte_memcpy(edev->name, name, NAME_SIZE); -+ memcpy(edev->name, name, NAME_SIZE); - for_each_hwfn(edev, i) { - snprintf(edev->hwfns[i].name, NAME_SIZE, "%s-%d", name, i); - } -@@ -514,10 +514,9 @@ static void qed_fill_link(struct ecore_hwfn *hwfn, - - /* Prepare source inputs */ - if (IS_PF(hwfn->p_dev)) { -- rte_memcpy(¶ms, ecore_mcp_get_link_params(hwfn), -- sizeof(params)); -- rte_memcpy(&link, ecore_mcp_get_link_state(hwfn), sizeof(link)); -- rte_memcpy(&link_caps, ecore_mcp_get_link_capabilities(hwfn), -+ memcpy(¶ms, ecore_mcp_get_link_params(hwfn), sizeof(params)); -+ memcpy(&link, ecore_mcp_get_link_state(hwfn), sizeof(link)); -+ memcpy(&link_caps, ecore_mcp_get_link_capabilities(hwfn), - sizeof(link_caps)); - } else { - ecore_vf_read_bulletin(hwfn, &change); -diff --git a/drivers/net/qede/qede_sriov.c b/drivers/net/qede/qede_sriov.c -index 0b99a8d6fe..937d339fb8 100644 ---- a/drivers/net/qede/qede_sriov.c -+++ b/drivers/net/qede/qede_sriov.c -@@ -203,10 +203,10 @@ void qed_inform_vf_link_state(struct ecore_hwfn *hwfn) - if (!hwfn->pf_iov_info) - return; - -- rte_memcpy(¶ms, ecore_mcp_get_link_params(lead_hwfn), -+ memcpy(¶ms, ecore_mcp_get_link_params(lead_hwfn), - sizeof(params)); -- rte_memcpy(&link, ecore_mcp_get_link_state(lead_hwfn), sizeof(link)); -- rte_memcpy(&caps, ecore_mcp_get_link_capabilities(lead_hwfn), -+ memcpy(&link, ecore_mcp_get_link_state(lead_hwfn), sizeof(link)); -+ memcpy(&caps, ecore_mcp_get_link_capabilities(lead_hwfn), - sizeof(caps)); - - /* Update bulletin of all future possible VFs with link configuration */ --- -2.23.0 - diff --git a/0330-examples-performance-thread-fix-build-with-GCC-12.patch b/0330-examples-performance-thread-fix-build-with-GCC-12.patch deleted file mode 100644 index 4715122..0000000 --- a/0330-examples-performance-thread-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 125a65cb03f845d1b6d5f7078670aa1a49d62513 Mon Sep 17 00:00:00 2001 -From: Kevin Traynor -Date: Wed, 24 Aug 2022 10:17:07 +0100 -Subject: [PATCH] examples/performance-thread: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[1/2] Compiling C object examples/dpdk-pthrea... -formance-thread_pthread_shim_pthread_shim.c.o -../examples/performance-thread/pthread_shim/pthread_shim.c: -In function ‘pthread_setspecific’: -../examples/performance-thread/pthread_shim/pthread_shim.c:592:27: -warning: ‘data’ may be used uninitialized [-Wmaybe-uninitialized] -592 | int rv = lthread_setspecific((unsigned int)key, data); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -../examples/performance-thread/pthread_shim/pthread_shim.c:589:56: -note: accessing argument 2 of a function declared with attribute -‘access (none, 2)’ -589 | int pthread_setspecific(pthread_key_t key, const void *data) - | ~~~~~~~~~~~~^~~~ - -This is a false positive as pthread_setspecific() does not read from -the (const void *) so we can squash the warning. - -performance-thread example is already removed from DPDK main branch. - -Signed-off-by: Kevin Traynor ---- - examples/performance-thread/pthread_shim/pthread_shim.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/examples/performance-thread/pthread_shim/pthread_shim.c b/examples/performance-thread/pthread_shim/pthread_shim.c -index bbc076584b..a44cb8244d 100644 ---- a/examples/performance-thread/pthread_shim/pthread_shim.c -+++ b/examples/performance-thread/pthread_shim/pthread_shim.c -@@ -586,6 +586,11 @@ pthread_t pthread_self(void) - return _sys_pthread_funcs.f_pthread_self(); - } - -+#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 120000) -+#pragma GCC diagnostic push -+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -+#endif -+ - int pthread_setspecific(pthread_key_t key, const void *data) - { - if (override) { -@@ -595,6 +600,10 @@ int pthread_setspecific(pthread_key_t key, const void *data) - return _sys_pthread_funcs.f_pthread_setspecific(key, data); - } - -+#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 120000) -+#pragma GCC diagnostic pop -+#endif -+ - int pthread_spin_init(pthread_spinlock_t *a, int b) - { - NOT_IMPLEMENTED; --- -2.23.0 - diff --git a/0331-net-mvneta-fix-build-with-GCC-12.patch b/0331-net-mvneta-fix-build-with-GCC-12.patch deleted file mode 100644 index bd2788f..0000000 --- a/0331-net-mvneta-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 6d030554f1a6a0f2d82bb3371ebb1c5458a49491 Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Thu, 1 Sep 2022 14:01:18 +0530 -Subject: [PATCH] net/mvneta: fix build with GCC 12 - -[ upstream commit d7b080f1e72d833d668a66199fe99ccda6c81a36 ] - -./drivers/net/mvneta/mvneta_rxtx.c:89:42: - error: 'mbufs' may be used uninitialized [-Werror=maybe-uninitialized] - 89 | MVNETA_SET_COOKIE_HIGH_ADDR(mbufs[0]); - | ^ -../drivers/net/mvneta/mvneta_rxtx.c:77:26: note: 'mbufs' declared here - 77 | struct rte_mbuf *mbufs[MRVL_NETA_BUF_RELEASE_BURST_SIZE_MAX]; - | ^~~~~ - -Fixes: ce7ea764597e ("net/mvneta: support Rx/Tx") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Liron Himi ---- - drivers/net/mvneta/mvneta_rxtx.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/net/mvneta/mvneta_rxtx.c b/drivers/net/mvneta/mvneta_rxtx.c -index 6e4a7896b4..952e982275 100644 ---- a/drivers/net/mvneta/mvneta_rxtx.c -+++ b/drivers/net/mvneta/mvneta_rxtx.c -@@ -79,6 +79,10 @@ mvneta_buffs_refill(struct mvneta_priv *priv, struct mvneta_rxq *rxq, u16 *num) - int i, ret; - uint16_t nb_desc = *num; - -+ /* To prevent GCC-12 warning. */ -+ if (unlikely(nb_desc == 0)) -+ return -1; -+ - ret = rte_pktmbuf_alloc_bulk(rxq->mp, mbufs, nb_desc); - if (ret) { - MVNETA_LOG(ERR, "Failed to allocate %u mbufs.", nb_desc); --- -2.23.0 - diff --git a/0332-test-ipsec-fix-build-with-GCC-12.patch b/0332-test-ipsec-fix-build-with-GCC-12.patch deleted file mode 100644 index d8250f9..0000000 --- a/0332-test-ipsec-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,58 +0,0 @@ -From fdebff6b5aadd85e417a10c234b4159d1d0620f5 Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Thu, 4 Aug 2022 19:10:53 +0530 -Subject: [PATCH] test/ipsec: fix build with GCC 12 - -[ upstream commit 250cbb8d5dd2ffcb4c8a871332f9ec8e5a59242f ] - -GCC-12 raises following warning: - -In function '_mm_loadu_si128', - inlined from 'rte_mov16' at - ../lib/eal/x86/include/rte_memcpy.h:507:9, - inlined from 'rte_mov128' at - ../lib/eal/x86/include/rte_memcpy.h:549:2, - inlined from 'rte_memcpy_generic' at - ../lib/eal/x86/include/rte_memcpy.h:732:4, - inlined from 'rte_memcpy' at - ../lib/eal/x86/include/rte_memcpy.h:882:10, - inlined from 'setup_test_string_tunneled' at - ../app/test/test_ipsec.c:617:3: -/usr/lib/gcc/x86_64-pc-linux-gnu/12.1.1/include/emmintrin.h:703:10: error: - array subscript '__m128i_u[15]' is partly outside array bounds of - 'const uint8_t[255]' {aka 'const unsigned char[255]'} - [-Werror=array-bounds] - 703 | return *__P; - | ^~~~ -../app/test/test_ipsec.c: In function 'setup_test_string_tunneled': -../app/test/test_ipsec.c:491:22: note: at offset 240 into object - 'esp_pad_bytes' of size 255 - 491 | static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = { - -This patch restrict the copy to minimum size. - -Fixes: 05fe65eb66b2 ("test/ipsec: introduce functional test") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Akhil Goyal ---- - app/test/test_ipsec.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/app/test/test_ipsec.c b/app/test/test_ipsec.c -index 6d5431843f..584c132f37 100644 ---- a/app/test/test_ipsec.c -+++ b/app/test/test_ipsec.c -@@ -618,7 +618,8 @@ setup_test_string_tunneled(struct rte_mempool *mpool, const char *string, - rte_memcpy(dst, string, len); - dst += len; - /* copy pad bytes */ -- rte_memcpy(dst, esp_pad_bytes, padlen); -+ rte_memcpy(dst, esp_pad_bytes, RTE_MIN(padlen, -+ sizeof(esp_pad_bytes))); - dst += padlen; - /* copy ESP tail header */ - rte_memcpy(dst, &espt, sizeof(espt)); --- -2.23.0 - diff --git a/0333-ipsec-fix-build-with-GCC-12.patch b/0333-ipsec-fix-build-with-GCC-12.patch deleted file mode 100644 index 9f43e7d..0000000 --- a/0333-ipsec-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,75 +0,0 @@ -From db9f8c23a4bc89764433efa58bf256f4bb95c10c Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Thu, 4 Aug 2022 19:10:54 +0530 -Subject: [PATCH] ipsec: fix build with GCC 12 - -[ upstream commit 2be383423e433b5d42324cb450589b46d057c2ed ] - -GCC 12 raises the following warning: - -In function '_mm_loadu_si128', - inlined from 'rte_mov16' at - ../lib/eal/x86/include/rte_memcpy.h:507:9, - inlined from 'rte_mov128' at - ../lib/eal/x86/include/rte_memcpy.h:549:2, - inlined from 'rte_memcpy_generic' at - ../lib/eal/x86/include/rte_memcpy.h:732:4, - inlined from 'rte_memcpy' at - ../lib/eal/x86/include/rte_memcpy.h:882:10, - inlined from 'outb_tun_pkt_prepare' at - ../lib/ipsec/esp_outb.c:224:2: -/usr/lib/gcc/x86_64-pc-linux-gnu/12.1.1/include/emmintrin.h:703:10: error: - array subscript '__m128i_u[15]' is partly outside array bounds of - 'const uint8_t[255]' {aka 'const unsigned char[255]'} - [-Werror=array-bounds] - 703 | return *__P; - | ^~~~ -In file included from ../lib/ipsec/esp_outb.c:17: -../lib/ipsec/pad.h: In function 'outb_tun_pkt_prepare': -../lib/ipsec/pad.h:10:22: note: at offset 240 into object 'esp_pad_bytes' - of size 255 - 10 | static const uint8_t esp_pad_bytes[IPSEC_MAX_PAD_SIZE] = { - | ^~~~~~~~~~~~~ - -This patch restrict copy to minimum size. - -Bugzilla ID: 1060 -Fixes: 6015e6a13398 ("ipsec: move inbound and outbound code") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Konstantin Ananyev ---- - lib/ipsec/esp_outb.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/lib/ipsec/esp_outb.c b/lib/ipsec/esp_outb.c -index 28bd58e3c7..1b0eeed07f 100644 ---- a/lib/ipsec/esp_outb.c -+++ b/lib/ipsec/esp_outb.c -@@ -220,8 +220,10 @@ outb_tun_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc, - /* pad length */ - pdlen -= sizeof(*espt); - -+ RTE_ASSERT(pdlen <= sizeof(esp_pad_bytes)); -+ - /* copy padding data */ -- rte_memcpy(pt, esp_pad_bytes, pdlen); -+ rte_memcpy(pt, esp_pad_bytes, RTE_MIN(pdlen, sizeof(esp_pad_bytes))); - - /* update esp trailer */ - espt = (struct rte_esp_tail *)(pt + pdlen); -@@ -417,8 +419,10 @@ outb_trs_pkt_prepare(struct rte_ipsec_sa *sa, rte_be64_t sqc, - /* pad length */ - pdlen -= sizeof(*espt); - -+ RTE_ASSERT(pdlen <= sizeof(esp_pad_bytes)); -+ - /* copy padding data */ -- rte_memcpy(pt, esp_pad_bytes, pdlen); -+ rte_memcpy(pt, esp_pad_bytes, RTE_MIN(pdlen, sizeof(esp_pad_bytes))); - - /* update esp trailer */ - espt = (struct rte_esp_tail *)(pt + pdlen); --- -2.23.0 - diff --git a/0334-crypto-qat-fix-build-with-GCC-12.patch b/0334-crypto-qat-fix-build-with-GCC-12.patch deleted file mode 100644 index 875b02d..0000000 --- a/0334-crypto-qat-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 29b6bd601428a25e37b282f09e4b4a2244e111d9 Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Thu, 4 Aug 2022 19:10:55 +0530 -Subject: [PATCH] crypto/qat: fix build with GCC 12 - -[ upstream commit 04361fe2aca8998ea06fb4823dceb965698e147c ] - -GCC 12 raises the following warning: - -In function '_mm_storeu_si128', - inlined from 'rte_mov16' at - ../lib/eal/x86/include/rte_memcpy.h:508:2, - inlined from 'rte_mov128' at - ../lib/eal/x86/include/rte_memcpy.h:542:2, - inlined from 'rte_memcpy_generic' at - ../lib/eal/x86/include/rte_memcpy.h:732:4, - inlined from 'rte_memcpy' at - ../lib/eal/x86/include/rte_memcpy.h:882:10, - inlined from 'qat_sym_do_precomputes.constprop' at - ../drivers/crypto/qat/qat_sym_session.c:1434:2: -/usr/lib/gcc/x86_64-pc-linux-gnu/12.1.1/include/emmintrin.h:739:8: error: - array subscript 8 is outside array bounds of 'unsigned char[128]' - [-Werror=array-bounds] - 739 | *__P = __B; - | ~~~~~^~~~~ - -../drivers/crypto/qat/qat_sym_session.c: - In function 'qat_sym_do_precomputes.constprop': -../drivers/crypto/qat/qat_sym_session.c:1305:17: note: - at offset 192 into object 'opad.750' of size 128 - 1305 | uint8_t - opad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)]; - | ^~~~ - -../drivers/crypto/qat/qat_sym_session.c: - In function 'qat_sym_do_precomputes.constprop': -../drivers/crypto/qat/qat_sym_session.c:1304:17: note: - at offset 128 into object 'ipad.749' of size 128 - 1304 | uint8_t - ipad[qat_hash_get_block_size(ICP_QAT_HW_AUTH_ALGO_DELIMITER)]; - | ^~~~ - -Added a check to prevent compiler warnings. - -Fixes: 1703e94ac5ce ("qat: add driver for QuickAssist devices") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Fan Zhang ---- - drivers/crypto/qat/qat_sym_session.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/crypto/qat/qat_sym_session.c b/drivers/crypto/qat/qat_sym_session.c -index 80d6fbfa46..3697a038e5 100644 ---- a/drivers/crypto/qat/qat_sym_session.c -+++ b/drivers/crypto/qat/qat_sym_session.c -@@ -1435,6 +1435,10 @@ static int qat_sym_do_precomputes(enum icp_qat_hw_auth_algo hash_alg, - QAT_LOG(ERR, "invalid keylen %u", auth_keylen); - return -EFAULT; - } -+ -+ RTE_VERIFY(auth_keylen <= sizeof(ipad)); -+ RTE_VERIFY(auth_keylen <= sizeof(opad)); -+ - rte_memcpy(ipad, auth_key, auth_keylen); - rte_memcpy(opad, auth_key, auth_keylen); - --- -2.23.0 - diff --git a/0335-vhost-fix-build-with-GCC-12.patch b/0335-vhost-fix-build-with-GCC-12.patch deleted file mode 100644 index 4602c9c..0000000 --- a/0335-vhost-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 54a98eecdb81d95d958998c3ecb85b20cde03837 Mon Sep 17 00:00:00 2001 -From: Maxime Coquelin -Date: Wed, 5 Oct 2022 22:35:24 +0200 -Subject: [PATCH] vhost: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 4226aa9caca9511bf95a093b6ad9c1f8727a4d43 ] - -This patch fixes a compilation issue met with GCC 12 on -LoongArch64: - -In function ‘mbuf_to_desc’, - inlined from ‘vhost_enqueue_async_packed’ - inlined from ‘virtio_dev_rx_async_packed’ - inlined from ‘virtio_dev_rx_async_submit_packed’ -lib/vhost/virtio_net.c:1159:18: error: - ‘buf_vec[0].buf_addr’ may be used uninitialized - 1159 | buf_addr = buf_vec[vec_idx].buf_addr; - | ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~ -lib/vhost/virtio_net.c: In function ‘virtio_dev_rx_async_submit_packed’: -lib/vhost/virtio_net.c:1834:27: note: ‘buf_vec’ declared here - 1834 | struct buf_vector buf_vec[BUF_VECTOR_MAX]; - | ^~~~~~~ - -It happens because the compiler assumes that 'size' -variable in vhost_enqueue_async_packed could wrap to 0 since -'size' is uint32_t and pkt->pkt_len too. - -In practice, it would never happen since 'pkt->pkt_len' is -unlikely to be close to UINT32_MAX, but let's just change -'size' to uint64_t to make the compiler happy without -having to add runtime checks. - -This patch also fixes similar patterns in three other -places, including one that also produces similar build -issue on ARM64 in vhost_enqueue_single_packed(). - -Fixes: 873e8dad6f49 ("vhost: support packed ring in async datapath") - -Signed-off-by: Maxime Coquelin -Reviewed-by: David Marchand -Tested-by: Amit Prakash Shukla ---- - lib/vhost/virtio_net.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c -index bf4d75b4bd..64460e3e8c 100644 ---- a/lib/vhost/virtio_net.c -+++ b/lib/vhost/virtio_net.c -@@ -599,7 +599,7 @@ fill_vec_buf_split(struct virtio_net *dev, struct vhost_virtqueue *vq, - */ - static inline int - reserve_avail_buf_split(struct virtio_net *dev, struct vhost_virtqueue *vq, -- uint32_t size, struct buf_vector *buf_vec, -+ uint64_t size, struct buf_vector *buf_vec, - uint16_t *num_buffers, uint16_t avail_head, - uint16_t *nr_vec) - { -@@ -1069,7 +1069,7 @@ vhost_enqueue_single_packed(struct virtio_net *dev, - uint16_t buf_id = 0; - uint32_t len = 0; - uint16_t desc_count; -- uint32_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf); -+ uint64_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf); - uint16_t num_buffers = 0; - uint32_t buffer_len[vq->size]; - uint16_t buffer_buf_id[vq->size]; -@@ -1137,7 +1137,7 @@ virtio_dev_rx_split(struct virtio_net *dev, struct vhost_virtqueue *vq, - rte_prefetch0(&vq->avail->ring[vq->last_avail_idx & (vq->size - 1)]); - - for (pkt_idx = 0; pkt_idx < count; pkt_idx++) { -- uint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen; -+ uint64_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen; - uint16_t nr_vec = 0; - - if (unlikely(reserve_avail_buf_split(dev, vq, -@@ -1485,7 +1485,7 @@ virtio_dev_rx_async_submit_split(struct virtio_net *dev, - async_iter_reset(async); - - for (pkt_idx = 0; pkt_idx < count; pkt_idx++) { -- uint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen; -+ uint64_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen; - uint16_t nr_vec = 0; - - if (unlikely(reserve_avail_buf_split(dev, vq, pkt_len, buf_vec, -@@ -1575,7 +1575,7 @@ vhost_enqueue_async_packed(struct virtio_net *dev, - uint16_t buf_id = 0; - uint32_t len = 0; - uint16_t desc_count = 0; -- uint32_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf); -+ uint64_t size = pkt->pkt_len + sizeof(struct virtio_net_hdr_mrg_rxbuf); - uint32_t buffer_len[vq->size]; - uint16_t buffer_buf_id[vq->size]; - uint16_t buffer_desc_count[vq->size]; --- -2.23.0 - diff --git a/0336-net-i40e-fix-build-with-MinGW-GCC-12.patch b/0336-net-i40e-fix-build-with-MinGW-GCC-12.patch deleted file mode 100644 index 9e5339e..0000000 --- a/0336-net-i40e-fix-build-with-MinGW-GCC-12.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 9ba87edbe69cac90bf8aff9714e3724519c633bf Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Wed, 24 Aug 2022 19:33:38 +0530 -Subject: [PATCH] net/i40e: fix build with MinGW GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit eb440cea1e05245f362ec7fca932f2d977f12359 ] - -When compiling with MinGW GCC 12, -the rte_flow_item array is seen as read out of bound: - -net/i40e/i40e_hash.c:389:47: error: - array subscript 50 is above array bounds of ‘const uint64_t[50]’ - {aka ‘const long long unsigned int[50]’} [-Werror=array-bounds] - 389 | item_hdr = pattern_item_header[last_item_type]; - | ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~ - -It seems the assert check done above this line has no impact. -A real check is added to make the compiler happy. - -Fixes: ef4c16fd9148 ("net/i40e: refactor RSS flow") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Thomas Monjalon ---- - drivers/net/i40e/i40e_hash.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/i40e/i40e_hash.c b/drivers/net/i40e/i40e_hash.c -index 8962e9d97a..a1ff85fceb 100644 ---- a/drivers/net/i40e/i40e_hash.c -+++ b/drivers/net/i40e/i40e_hash.c -@@ -384,8 +384,10 @@ i40e_hash_get_pattern_type(const struct rte_flow_item pattern[], - } - - prev_item_type = last_item_type; -- assert(last_item_type < (enum rte_flow_item_type) -- RTE_DIM(pattern_item_header)); -+ if (last_item_type >= (enum rte_flow_item_type) -+ RTE_DIM(pattern_item_header)) -+ goto not_sup; -+ - item_hdr = pattern_item_header[last_item_type]; - assert(item_hdr); - --- -2.23.0 - diff --git a/0337-net-qede-base-fix-32-bit-build-with-GCC-12.patch b/0337-net-qede-base-fix-32-bit-build-with-GCC-12.patch deleted file mode 100644 index 5cef6a9..0000000 --- a/0337-net-qede-base-fix-32-bit-build-with-GCC-12.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 4d4b866a158e5079dcac3f6533c06c4acdf2dd69 Mon Sep 17 00:00:00 2001 -From: Amit Prakash Shukla -Date: Wed, 24 Aug 2022 19:33:39 +0530 -Subject: [PATCH] net/qede/base: fix 32-bit build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit acc0ed087cd1ce6464f63489ab17eca52b0c94b2 ] - -A pointer is passed to a macro and it seems mistakenly referenced. -This issue is seen only when compiling with GCC 12 for 32-bit: - -drivers/net/qede/base/ecore_init_fw_funcs.c:1418:25: - error: array subscript 1 is outside array bounds of ‘u32[1]’ - {aka ‘unsigned int[1]’} [-Werror=array-bounds] - 1418 | ecore_wr(dev, ptt, ((addr) + (4 * i)), \ - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 1419 | ((u32 *)&(arr))[i]); \ - | ~~~~~~~~~~~~~~~~~~~ -drivers/net/qede/base/ecore_init_fw_funcs.c:1465:17: - note: in expansion of macro ‘ARR_REG_WR’ - 1465 | ARR_REG_WR(p_hwfn, p_ptt, addr, pData, len_in_dwords); - | ^~~~~~~~~~ -drivers/net/qede/base/ecore_init_fw_funcs.c:1439:35: - note: at offset 4 into object ‘pData’ of size 4 - 1439 | u32 *pData, - | ~~~~~^~~~~ - -Fixes: 3b307c55f2ac ("net/qede/base: update FW to 8.40.25.0") - -Signed-off-by: Amit Prakash Shukla -Acked-by: Thomas Monjalon ---- - drivers/net/qede/base/ecore_init_fw_funcs.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/qede/base/ecore_init_fw_funcs.c b/drivers/net/qede/base/ecore_init_fw_funcs.c -index 6a52f32cc9..4e4d1dc374 100644 ---- a/drivers/net/qede/base/ecore_init_fw_funcs.c -+++ b/drivers/net/qede/base/ecore_init_fw_funcs.c -@@ -1416,7 +1416,7 @@ void ecore_init_brb_ram(struct ecore_hwfn *p_hwfn, - u32 i; \ - for (i = 0; i < (arr_size); i++) \ - ecore_wr(dev, ptt, ((addr) + (4 * i)), \ -- ((u32 *)&(arr))[i]); \ -+ ((u32 *)(arr))[i]); \ - } while (0) - - #ifndef DWORDS_TO_BYTES --- -2.23.0 - diff --git a/0338-hash-fix-GFNI-implementation-build-with-GCC-12.patch b/0338-hash-fix-GFNI-implementation-build-with-GCC-12.patch deleted file mode 100644 index f75a193..0000000 --- a/0338-hash-fix-GFNI-implementation-build-with-GCC-12.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 47951ef1dc21882215a531472d055c58a7618cb0 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Mon, 9 Jan 2023 11:03:37 +0100 -Subject: [PATCH] hash: fix GFNI implementation build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit fe2c18a0a8b22703dec3add385a371ad819d7872 ] - -On a system that has AVX512F and GFNI, compiling fails with: - -In file included from /usr/lib/gcc/x86_64-redhat-linux/12/include/immintrin.h:71, - from /usr/lib/gcc/x86_64-redhat-linux/12/include/x86intrin.h:32, - from ../../../git/pub/dpdk.org/main/lib/eal/x86/include/rte_vect.h:31, - from ../../../git/pub/dpdk.org/main/lib/eal/x86/include/rte_memcpy.h:17, - from ../../../git/pub/dpdk.org/main/lib/mempool/rte_mempool.h:48, - from ../../../git/pub/dpdk.org/main/lib/mbuf/rte_mbuf.h:38, - from ../../../git/pub/dpdk.org/main/lib/net/rte_ip.h:33, - from ../../../git/pub/dpdk.org/main/lib/hash/rte_thash.h:25, - from ../../../git/pub/dpdk.org/main/lib/hash/rte_thash.c:7: -In function ‘_mm512_mask_permutexvar_epi8’, - inlined from ‘__rte_thash_gfni’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:142:17, - inlined from ‘rte_thash_gfni’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:182:20, - inlined from ‘rte_thash_adjust_tuple’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash.c:784:11: -/usr/lib/gcc/x86_64-redhat-linux/12/include/avx512vbmiintrin.h:97:20: - error: ‘tuple_bytes’ may be used uninitialized [-Werror=maybe-uninitialized] - 97 | return (__m512i) __builtin_ia32_permvarqi512_mask ((__v64qi) __B, - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 98 | (__v64qi) __A, - | ~~~~~~~~~~~~~~ - 99 | (__v64qi) __W, - | ~~~~~~~~~~~~~~ - 100 | (__mmask64) __M); - | ~~~~~~~~~~~~~~~~ - -And: - -In file included from ../../../git/pub/dpdk.org/main/lib/hash/rte_thash_gfni.h:17, - from ../../../git/pub/dpdk.org/main/lib/hash/rte_thash.h:27: -../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h: - In function ‘rte_thash_adjust_tuple’: -../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:91:33: - note: ‘tuple_bytes’ was declared here - 91 | __m512i vals, matrixes, tuple_bytes, tuple_bytes_2; - | ^~~~~~~~~~~ -In function ‘_mm512_mask_permutexvar_epi8’, - inlined from ‘__rte_thash_gfni’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:142:17, - inlined from ‘rte_thash_gfni’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:182:20, - inlined from ‘rte_thash_adjust_tuple’ at - ../../../git/pub/dpdk.org/main/lib/hash/rte_thash.c:784:11: -/usr/lib/gcc/x86_64-redhat-linux/12/include/avx512vbmiintrin.h:97:20: - error: ‘permute_mask’ may be used uninitialized [-Werror=maybe-uninitialized] - 97 | return (__m512i) __builtin_ia32_permvarqi512_mask ((__v64qi) __B, - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 98 | (__v64qi) __A, - | ~~~~~~~~~~~~~~ - 99 | (__v64qi) __W, - | ~~~~~~~~~~~~~~ - 100 | (__mmask64) __M); - | ~~~~~~~~~~~~~~~~ -../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h: - In function ‘rte_thash_adjust_tuple’: -../../../git/pub/dpdk.org/main/lib/hash/rte_thash_x86_gfni.h:92:30: - note: ‘permute_mask’ was declared here - 92 | __mmask64 load_mask, permute_mask, permute_mask_2; - | ^~~~~~~~~~~~ -cc1: all warnings being treated as errors - -Set those variables to 0. - -Fixes: 4fd8c4cb0de1 ("hash: add new Toeplitz hash implementation") - -Signed-off-by: David Marchand -Acked-by: Bruce Richardson ---- - lib/hash/rte_thash_x86_gfni.h | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/lib/hash/rte_thash_x86_gfni.h b/lib/hash/rte_thash_x86_gfni.h -index 657b1862c3..0583f64793 100644 ---- a/lib/hash/rte_thash_x86_gfni.h -+++ b/lib/hash/rte_thash_x86_gfni.h -@@ -87,8 +87,10 @@ __rte_thash_gfni(const uint64_t *mtrx, const uint8_t *tuple, - const __m512i shift_8 = _mm512_set1_epi8(8); - __m512i xor_acc = _mm512_setzero_si512(); - __m512i perm_bytes = _mm512_setzero_si512(); -- __m512i vals, matrixes, tuple_bytes, tuple_bytes_2; -- __mmask64 load_mask, permute_mask, permute_mask_2; -+ __m512i vals, matrixes, tuple_bytes_2; -+ __m512i tuple_bytes = _mm512_setzero_si512(); -+ __mmask64 load_mask, permute_mask_2; -+ __mmask64 permute_mask = 0; - int chunk_len = 0, i = 0; - uint8_t mtrx_msk; - const int prepend = 3; --- -2.23.0 - diff --git a/0339-examples-cmdline-fix-build-with-GCC-12.patch b/0339-examples-cmdline-fix-build-with-GCC-12.patch deleted file mode 100644 index 0cef1a7..0000000 --- a/0339-examples-cmdline-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 661f5540c3785104258dc1b9f169ccd6dd770472 Mon Sep 17 00:00:00 2001 -From: Bruce Richardson -Date: Wed, 18 Jan 2023 16:11:11 +0000 -Subject: [PATCH] examples/cmdline: fix build with GCC 12 - -[ upstream commit 2ba8d0adb06f92ef73bc8e3953ca45b7d322c823 ] - -When building the example without libbsd and using the DPDK-provided -strlcpy function, a compiler warning is emitted by GCC 12 about the copy -of the parsed string into the resulting object. This is because the -source from cmdline library is 128 bytes and the destination buffer is -64-bytes. - -commands.c: In function 'cmd_obj_add_parsed': -rte_string_fns.h:61:24: warning: '%s' directive output may be truncated -writing up to 127 bytes into a region of size 64 [-Wformat-truncation=] - 61 | return (size_t)snprintf(dst, size, "%s", src); - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In file included from /usr/include/stdio.h:894, - from commands.c:7: -/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:10: note: -'__builtin_snprintf' output between 1 and 128 bytes into a destination of size 64 - -Multiple options are possible to fix this, but the one taken in this -patch is to ensure truncation never occurs by setting the destination -buffer size to be the same as that used by the cmdline library. - -Fixes: af75078fece3 ("first public release") - -Signed-off-by: Bruce Richardson -Acked-by: Olivier Matz ---- - examples/cmdline/parse_obj_list.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/examples/cmdline/parse_obj_list.h b/examples/cmdline/parse_obj_list.h -index 6516d3e2c2..1223ac1e8b 100644 ---- a/examples/cmdline/parse_obj_list.h -+++ b/examples/cmdline/parse_obj_list.h -@@ -12,8 +12,9 @@ - - #include - #include -+#include - --#define OBJ_NAME_LEN_MAX 64 -+#define OBJ_NAME_LEN_MAX sizeof(cmdline_fixed_string_t) - - struct object { - SLIST_ENTRY(object) next; --- -2.23.0 - diff --git a/0340-net-mlx5-fix-build-with-GCC-12-and-ASan.patch b/0340-net-mlx5-fix-build-with-GCC-12-and-ASan.patch deleted file mode 100644 index a212cac..0000000 --- a/0340-net-mlx5-fix-build-with-GCC-12-and-ASan.patch +++ /dev/null @@ -1,70 +0,0 @@ -From c3a4fd09f9a348e9b7394b2a9d498c815f1efaac Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Wed, 22 Mar 2023 18:06:27 +0100 -Subject: [PATCH] net/mlx5: fix build with GCC 12 and ASan -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit e17840756179410283ef03660578310874432f40 ] - -Building with gcc 12 and ASan raises this warning: - -../drivers/net/mlx5/mlx5_txpp.c: In function ‘mlx5_txpp_xstats_get_names’: -../drivers/net/mlx5/mlx5_txpp.c:1066:25: error: ‘strncpy’ specified bound - 64 equals destination size [-Werror=stringop-truncation] - 1066 | strncpy(xstats_names[i + n_used].name, - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 1067 | mlx5_txpp_stat_names[i], - | ~~~~~~~~~~~~~~~~~~~~~~~~ - 1068 | RTE_ETH_XSTATS_NAME_SIZE); - | ~~~~~~~~~~~~~~~~~~~~~~~~~ -cc1: all warnings being treated as errors - -Prefer strlcpy for xstats. - -Fixes: 3b025c0ca425 ("net/mlx5: provide send scheduling error statistics") - -Signed-off-by: David Marchand -Acked-by: Raslan Darawsheh ---- - drivers/net/mlx5/mlx5_stats.c | 3 +-- - drivers/net/mlx5/mlx5_txpp.c | 4 +--- - 2 files changed, 2 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c -index f64fa3587b..615e1d073d 100644 ---- a/drivers/net/mlx5/mlx5_stats.c -+++ b/drivers/net/mlx5/mlx5_stats.c -@@ -288,10 +288,9 @@ mlx5_xstats_get_names(struct rte_eth_dev *dev, - - if (n >= mlx5_xstats_n && xstats_names) { - for (i = 0; i != mlx5_xstats_n; ++i) { -- strncpy(xstats_names[i].name, -+ strlcpy(xstats_names[i].name, - xstats_ctrl->info[i].dpdk_name, - RTE_ETH_XSTATS_NAME_SIZE); -- xstats_names[i].name[RTE_ETH_XSTATS_NAME_SIZE - 1] = 0; - } - } - mlx5_xstats_n = mlx5_txpp_xstats_get_names(dev, xstats_names, -diff --git a/drivers/net/mlx5/mlx5_txpp.c b/drivers/net/mlx5/mlx5_txpp.c -index af77e91e4c..83d17997d1 100644 ---- a/drivers/net/mlx5/mlx5_txpp.c -+++ b/drivers/net/mlx5/mlx5_txpp.c -@@ -1064,11 +1064,9 @@ int mlx5_txpp_xstats_get_names(struct rte_eth_dev *dev __rte_unused, - - if (n >= n_used + n_txpp && xstats_names) { - for (i = 0; i < n_txpp; ++i) { -- strncpy(xstats_names[i + n_used].name, -+ strlcpy(xstats_names[i + n_used].name, - mlx5_txpp_stat_names[i], - RTE_ETH_XSTATS_NAME_SIZE); -- xstats_names[i + n_used].name -- [RTE_ETH_XSTATS_NAME_SIZE - 1] = 0; - } - } - return n_used + n_txpp; --- -2.23.0 - diff --git a/0341-pdump-fix-build-with-GCC-12.patch b/0341-pdump-fix-build-with-GCC-12.patch deleted file mode 100644 index cf4c996..0000000 --- a/0341-pdump-fix-build-with-GCC-12.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 606474e9d0143ea0fb2863e64d2267b569e1fb89 Mon Sep 17 00:00:00 2001 -From: Joyce Kong -Date: Mon, 27 Mar 2023 07:07:12 +0000 -Subject: [PATCH] pdump: fix build with GCC 12 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit b182466683a5c76657efb4b6b8d43e7d71979034 ] - -The following warning is observed with GCC12 compilation -with release 20.11: - -In function ‘__rte_ring_enqueue_elems_64’, - inlined from ‘__rte_ring_enqueue_elems’ at - ../lib/librte_ring/rte_ring_elem.h:225:3, - inlined from ‘__rte_ring_do_enqueue_elem’ at - ../lib/librte_ring/rte_ring_elem.h:424:2, - inlined from ‘rte_ring_mp_enqueue_burst_elem’ at - ../lib/librte_ring/rte_ring_elem.h:884:9, - inlined from ‘rte_ring_enqueue_burst_elem’ at - ../lib/librte_ring/rte_ring_elem.h:946:10, - inlined from ‘rte_ring_enqueue_burst’ at - ../lib/librte_ring/rte_ring.h:721:9, - inlined from ‘pdump_copy’ at - ../lib/librte_pdump/rte_pdump.c:94:13: -../lib/librte_ring/rte_ring_elem.h:162:40: warning: ‘*dup_bufs.36_42 -+ _89’ may be used uninitialized [-Wmaybe-uninitialized] - 162 | ring[idx] = obj[i]; - | ~~~^~~ -../lib/librte_ring/rte_ring_elem.h:163:44: warning: ‘*dup_bufs.36_42 -+ _98’ may be used uninitialized [-Wmaybe-uninitialized] - 163 | ring[idx + 1] = obj[i + 1]; - | ~~~^~~~~~~ -../lib/librte_ring/rte_ring_elem.h:164:44: warning: ‘*dup_bufs.36_42 -+ _107’ may be used uninitialized [-Wmaybe-uninitialized] - 164 | ring[idx + 2] = obj[i + 2]; - | ~~~^~~~~~~ -../lib/librte_ring/rte_ring_elem.h:165:44: warning: ‘*dup_bufs.36_42 -+ _116’ may be used uninitialized [-Wmaybe-uninitialized] - 165 | ring[idx + 3] = obj[i + 3]; - | ~~~^~~~~~~ -../lib/librte_ring/rte_ring_elem.h:169:42: warning: ‘*dup_bufs.36_42 -+ _129’ may be used uninitialized [-Wmaybe-uninitialized] - 169 | ring[idx++] = obj[i++]; /* fallthrough */ - | ~~~^~~~~ -../lib/librte_ring/rte_ring_elem.h:171:42: warning: ‘*dup_bufs.36_42 -+ _139’ may be used uninitialized [-Wmaybe-uninitialized] - 171 | ring[idx++] = obj[i++]; /* fallthrough */ - | ~~~^~~~~ -../lib/librte_ring/rte_ring_elem.h:173:42: warning: ‘*dup_bufs.36_42 -+ _149’ may be used uninitialized [-Wmaybe-uninitialized] - 173 | ring[idx++] = obj[i++]; - -Actually, this is an alias warning as -O3 enables strict alias. -This patch fixes it by replacing 'dup_bufs' with '&dup_bufs[0]' -as the compiler represents them differently. - -Fixes: 278f945402c5 ("pdump: add new library for packet capture") - -Signed-off-by: Joyce Kong -Reviewed-by: Ruifeng Wang -Acked-by: Reshma Pattan -Acked-by: Tyler Retzlaff ---- - lib/pdump/rte_pdump.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/pdump/rte_pdump.c b/lib/pdump/rte_pdump.c -index f0dee81e77..805d12236c 100644 ---- a/lib/pdump/rte_pdump.c -+++ b/lib/pdump/rte_pdump.c -@@ -133,7 +133,7 @@ pdump_copy(uint16_t port_id, uint16_t queue, - - __atomic_fetch_add(&stats->accepted, d_pkts, __ATOMIC_RELAXED); - -- ring_enq = rte_ring_enqueue_burst(ring, (void *)dup_bufs, d_pkts, NULL); -+ ring_enq = rte_ring_enqueue_burst(ring, (void *)&dup_bufs[0], d_pkts, NULL); - if (unlikely(ring_enq < d_pkts)) { - unsigned int drops = d_pkts - ring_enq; - --- -2.23.0 - diff --git a/0342-net-cxgbe-fix-dangling-pointer-by-mailbox-access-rew.patch b/0342-net-cxgbe-fix-dangling-pointer-by-mailbox-access-rew.patch deleted file mode 100644 index e7063b3..0000000 --- a/0342-net-cxgbe-fix-dangling-pointer-by-mailbox-access-rew.patch +++ /dev/null @@ -1,329 +0,0 @@ -From 699c30f8534c136926df9b6fb5b97ed06c1f34a0 Mon Sep 17 00:00:00 2001 -From: Rahul Lakkireddy -Date: Thu, 20 Jan 2022 03:26:40 +0530 -Subject: [PATCH] net/cxgbe: fix dangling pointer by mailbox access rework -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 19cafed99ac573662045424e559cee444c175b63 ] - -Rework mailbox access serialization to dynamically allocate and -free mbox entry. Also remove unnecessary temp memory and macros. - -Observed with: gcc-12.0 (GCC) 12.0.1 20220118 (experimental) - -In file included from ../lib/eal/linux/include/rte_os.h:14, - from ../lib/eal/include/rte_common.h:28, - from ../lib/eal/include/rte_log.h:25, - from ../lib/ethdev/rte_ethdev.h:164, - from ../lib/ethdev/ethdev_driver.h:18, - from ../drivers/net/cxgbe/base/t4vf_hw.c:6: -In function ‘t4_os_atomic_add_tail’, - inlined from ‘t4vf_wr_mbox_core’ at - ../drivers/net/cxgbe/base/t4vf_hw.c:115:2: -../drivers/net/cxgbe/base/adapter.h:742:9: - warning: storing the address of local variable ‘entry’ in - ‘((struct mbox_list *)adapter)[96].tqh_last’ [-Wdangling-pointer=] - 742 | TAILQ_INSERT_TAIL(head, entry, next); - | ^~~~~~~~~~~~~~~~~ -../drivers/net/cxgbe/base/t4vf_hw.c: In function ‘t4vf_wr_mbox_core’: -../drivers/net/cxgbe/base/t4vf_hw.c:86:27: note: ‘entry’ declared here - 86 | struct mbox_entry entry; - | ^~~~~ -../drivers/net/cxgbe/base/t4vf_hw.c:86:27: note: ‘adapter’ declared here - -Fixes: 3bd122eef2cc ("cxgbe/base: add hardware API for Chelsio T5 series adapters") - -Reported-by: Ferruh Yigit -Signed-off-by: Rahul Lakkireddy ---- - drivers/net/cxgbe/base/adapter.h | 2 - - drivers/net/cxgbe/base/t4_hw.c | 83 ++++++++++++-------------------- - drivers/net/cxgbe/base/t4vf_hw.c | 28 +++++++---- - 3 files changed, 49 insertions(+), 64 deletions(-) - -diff --git a/drivers/net/cxgbe/base/adapter.h b/drivers/net/cxgbe/base/adapter.h -index 1c7c8afe16..97963422bf 100644 ---- a/drivers/net/cxgbe/base/adapter.h -+++ b/drivers/net/cxgbe/base/adapter.h -@@ -291,8 +291,6 @@ struct sge { - u32 fl_starve_thres; /* Free List starvation threshold */ - }; - --#define T4_OS_NEEDS_MBOX_LOCKING 1 -- - /* - * OS Lock/List primitives for those interfaces in the Common Code which - * need this. -diff --git a/drivers/net/cxgbe/base/t4_hw.c b/drivers/net/cxgbe/base/t4_hw.c -index cdcd7e5510..645833765a 100644 ---- a/drivers/net/cxgbe/base/t4_hw.c -+++ b/drivers/net/cxgbe/base/t4_hw.c -@@ -263,17 +263,6 @@ static void fw_asrt(struct adapter *adap, u32 mbox_addr) - - #define X_CIM_PF_NOACCESS 0xeeeeeeee - --/* -- * If the Host OS Driver needs locking arround accesses to the mailbox, this -- * can be turned on via the T4_OS_NEEDS_MBOX_LOCKING CPP define ... -- */ --/* makes single-statement usage a bit cleaner ... */ --#ifdef T4_OS_NEEDS_MBOX_LOCKING --#define T4_OS_MBOX_LOCKING(x) x --#else --#define T4_OS_MBOX_LOCKING(x) do {} while (0) --#endif -- - /** - * t4_wr_mbox_meat_timeout - send a command to FW through the given mailbox - * @adap: the adapter -@@ -314,28 +303,17 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - 1, 1, 3, 5, 10, 10, 20, 50, 100 - }; - -- u32 v; -- u64 res; -- int i, ms; -- unsigned int delay_idx; -- __be64 *temp = (__be64 *)malloc(size * sizeof(char)); -- __be64 *p = temp; - u32 data_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_DATA); - u32 ctl_reg = PF_REG(mbox, A_CIM_PF_MAILBOX_CTRL); -- u32 ctl; -- struct mbox_entry entry; -- u32 pcie_fw = 0; -- -- if (!temp) -- return -ENOMEM; -+ struct mbox_entry *entry; -+ u32 v, ctl, pcie_fw = 0; -+ unsigned int delay_idx; -+ const __be64 *p; -+ int i, ms, ret; -+ u64 res; - -- if ((size & 15) || size > MBOX_LEN) { -- free(temp); -+ if ((size & 15) != 0 || size > MBOX_LEN) - return -EINVAL; -- } -- -- memset(p, 0, size); -- memcpy(p, (const __be64 *)cmd, size); - - /* - * If we have a negative timeout, that implies that we can't sleep. -@@ -345,14 +323,17 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - timeout = -timeout; - } - --#ifdef T4_OS_NEEDS_MBOX_LOCKING -+ entry = t4_os_alloc(sizeof(*entry)); -+ if (entry == NULL) -+ return -ENOMEM; -+ - /* - * Queue ourselves onto the mailbox access list. When our entry is at - * the front of the list, we have rights to access the mailbox. So we - * wait [for a while] till we're at the front [or bail out with an - * EBUSY] ... - */ -- t4_os_atomic_add_tail(&entry, &adap->mbox_list, &adap->mbox_lock); -+ t4_os_atomic_add_tail(entry, &adap->mbox_list, &adap->mbox_lock); - - delay_idx = 0; - ms = delay[0]; -@@ -367,18 +348,18 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - */ - pcie_fw = t4_read_reg(adap, A_PCIE_FW); - if (i > 4 * timeout || (pcie_fw & F_PCIE_FW_ERR)) { -- t4_os_atomic_list_del(&entry, &adap->mbox_list, -+ t4_os_atomic_list_del(entry, &adap->mbox_list, - &adap->mbox_lock); - t4_report_fw_error(adap); -- free(temp); -- return (pcie_fw & F_PCIE_FW_ERR) ? -ENXIO : -EBUSY; -+ ret = ((pcie_fw & F_PCIE_FW_ERR) != 0) ? -ENXIO : -EBUSY; -+ goto out_free; - } - - /* - * If we're at the head, break out and start the mailbox - * protocol. - */ -- if (t4_os_list_first_entry(&adap->mbox_list) == &entry) -+ if (t4_os_list_first_entry(&adap->mbox_list) == entry) - break; - - /* -@@ -393,7 +374,6 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - rte_delay_ms(ms); - } - } --#endif /* T4_OS_NEEDS_MBOX_LOCKING */ - - /* - * Attempt to gain access to the mailbox. -@@ -410,12 +390,11 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - * mailbox atomic access list and report the error to our caller. - */ - if (v != X_MBOWNER_PL) { -- T4_OS_MBOX_LOCKING(t4_os_atomic_list_del(&entry, -- &adap->mbox_list, -- &adap->mbox_lock)); -+ t4_os_atomic_list_del(entry, &adap->mbox_list, -+ &adap->mbox_lock); - t4_report_fw_error(adap); -- free(temp); -- return (v == X_MBOWNER_FW ? -EBUSY : -ETIMEDOUT); -+ ret = (v == X_MBOWNER_FW) ? -EBUSY : -ETIMEDOUT; -+ goto out_free; - } - - /* -@@ -441,7 +420,7 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - /* - * Copy in the new mailbox command and send it on its way ... - */ -- for (i = 0; i < size; i += 8, p++) -+ for (i = 0, p = cmd; i < size; i += 8, p++) - t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p)); - - CXGBE_DEBUG_MBOX(adap, "%s: mbox %u: %016llx %016llx %016llx %016llx " -@@ -512,11 +491,10 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - get_mbox_rpl(adap, rpl, size / 8, data_reg); - } - t4_write_reg(adap, ctl_reg, V_MBOWNER(X_MBOWNER_NONE)); -- T4_OS_MBOX_LOCKING( -- t4_os_atomic_list_del(&entry, &adap->mbox_list, -- &adap->mbox_lock)); -- free(temp); -- return -G_FW_CMD_RETVAL((int)res); -+ t4_os_atomic_list_del(entry, &adap->mbox_list, -+ &adap->mbox_lock); -+ ret = -G_FW_CMD_RETVAL((int)res); -+ goto out_free; - } - } - -@@ -527,12 +505,13 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, - */ - dev_err(adap, "command %#x in mailbox %d timed out\n", - *(const u8 *)cmd, mbox); -- T4_OS_MBOX_LOCKING(t4_os_atomic_list_del(&entry, -- &adap->mbox_list, -- &adap->mbox_lock)); -+ t4_os_atomic_list_del(entry, &adap->mbox_list, &adap->mbox_lock); - t4_report_fw_error(adap); -- free(temp); -- return (pcie_fw & F_PCIE_FW_ERR) ? -ENXIO : -ETIMEDOUT; -+ ret = ((pcie_fw & F_PCIE_FW_ERR) != 0) ? -ENXIO : -ETIMEDOUT; -+ -+out_free: -+ t4_os_free(entry); -+ return ret; - } - - int t4_wr_mbox_meat(struct adapter *adap, int mbox, const void *cmd, int size, -diff --git a/drivers/net/cxgbe/base/t4vf_hw.c b/drivers/net/cxgbe/base/t4vf_hw.c -index 561d759dbc..7dbd4deb79 100644 ---- a/drivers/net/cxgbe/base/t4vf_hw.c -+++ b/drivers/net/cxgbe/base/t4vf_hw.c -@@ -83,7 +83,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - - u32 mbox_ctl = T4VF_CIM_BASE_ADDR + A_CIM_VF_EXT_MAILBOX_CTRL; - __be64 cmd_rpl[MBOX_LEN / 8]; -- struct mbox_entry entry; -+ struct mbox_entry *entry; - unsigned int delay_idx; - u32 v, mbox_data; - const __be64 *p; -@@ -106,13 +106,17 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - size > NUM_CIM_VF_MAILBOX_DATA_INSTANCES * 4) - return -EINVAL; - -+ entry = t4_os_alloc(sizeof(*entry)); -+ if (entry == NULL) -+ return -ENOMEM; -+ - /* - * Queue ourselves onto the mailbox access list. When our entry is at - * the front of the list, we have rights to access the mailbox. So we - * wait [for a while] till we're at the front [or bail out with an - * EBUSY] ... - */ -- t4_os_atomic_add_tail(&entry, &adapter->mbox_list, &adapter->mbox_lock); -+ t4_os_atomic_add_tail(entry, &adapter->mbox_list, &adapter->mbox_lock); - - delay_idx = 0; - ms = delay[0]; -@@ -125,17 +129,17 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - * contend on access to the mailbox ... - */ - if (i > (2 * FW_CMD_MAX_TIMEOUT)) { -- t4_os_atomic_list_del(&entry, &adapter->mbox_list, -+ t4_os_atomic_list_del(entry, &adapter->mbox_list, - &adapter->mbox_lock); - ret = -EBUSY; -- return ret; -+ goto out_free; - } - - /* - * If we're at the head, break out and start the mailbox - * protocol. - */ -- if (t4_os_list_first_entry(&adapter->mbox_list) == &entry) -+ if (t4_os_list_first_entry(&adapter->mbox_list) == entry) - break; - - /* -@@ -160,10 +164,10 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - v = G_MBOWNER(t4_read_reg(adapter, mbox_ctl)); - - if (v != X_MBOWNER_PL) { -- t4_os_atomic_list_del(&entry, &adapter->mbox_list, -+ t4_os_atomic_list_del(entry, &adapter->mbox_list, - &adapter->mbox_lock); - ret = (v == X_MBOWNER_FW) ? -EBUSY : -ETIMEDOUT; -- return ret; -+ goto out_free; - } - - /* -@@ -224,7 +228,7 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - get_mbox_rpl(adapter, cmd_rpl, size / 8, mbox_data); - t4_write_reg(adapter, mbox_ctl, - V_MBOWNER(X_MBOWNER_NONE)); -- t4_os_atomic_list_del(&entry, &adapter->mbox_list, -+ t4_os_atomic_list_del(entry, &adapter->mbox_list, - &adapter->mbox_lock); - - /* return value in high-order host-endian word */ -@@ -236,7 +240,8 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - & F_FW_CMD_REQUEST) == 0); - memcpy(rpl, cmd_rpl, size); - } -- return -((int)G_FW_CMD_RETVAL(v)); -+ ret = -((int)G_FW_CMD_RETVAL(v)); -+ goto out_free; - } - } - -@@ -246,8 +251,11 @@ int t4vf_wr_mbox_core(struct adapter *adapter, - dev_err(adapter, "command %#x timed out\n", - *(const u8 *)cmd); - dev_err(adapter, " Control = %#x\n", t4_read_reg(adapter, mbox_ctl)); -- t4_os_atomic_list_del(&entry, &adapter->mbox_list, &adapter->mbox_lock); -+ t4_os_atomic_list_del(entry, &adapter->mbox_list, &adapter->mbox_lock); - ret = -ETIMEDOUT; -+ -+out_free: -+ t4_os_free(entry); - return ret; - } - --- -2.23.0 - diff --git a/0343-kni-fix-build-with-Linux-6.3.patch b/0343-kni-fix-build-with-Linux-6.3.patch deleted file mode 100644 index a2e6db2..0000000 --- a/0343-kni-fix-build-with-Linux-6.3.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 5f34cc454df420b9b2da8deb949fb76cba058b87 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Fri, 14 Apr 2023 16:25:22 +0100 -Subject: [PATCH] kni: fix build with Linux 6.3 - -KNI calls `get_user_pages_remote()` API which is using `FOLL_TOUCH` -flag, but `FOLL_TOUCH` is no more in public headers since v6.3, -causing a build error. - -`FOLL_*` defines in Linux kernel first moved to another header [1], -later some of them moved to memory subsystem internal header [2] for 6.3 - -`get_user_pages_remote()` already sets `FOLL_TOUCH` internally, -no need to set this flag externally anyway, moving flag from the call -altogether. - -[1] -Commit b5054174ac7c ("mm: move FOLL_* defs to mm_types.h") - -[2] -Commit 2c2241081f7d ("mm/gup: move private gup FOLL_ flags to internal.h") - -Fixes: e73831dc6c26 ("kni: support userspace VA") -Cc: stable@dpdk.org - -Signed-off-by: Ferruh Yigit -Reviewed-by: David Marchand ---- - kernel/linux/kni/kni_dev.h | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h -index a2c6d9fc1a..21bfb6890e 100644 ---- a/kernel/linux/kni/kni_dev.h -+++ b/kernel/linux/kni/kni_dev.h -@@ -105,11 +105,9 @@ static inline phys_addr_t iova_to_phys(struct task_struct *tsk, - - /* Read one page struct info */ - #ifdef HAVE_TSK_IN_GUP -- ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, -- FOLL_TOUCH, &page, NULL, NULL); -+ ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, 0, &page, NULL, NULL); - #else -- ret = get_user_pages_remote(tsk->mm, iova, 1, -- FOLL_TOUCH, &page, NULL, NULL); -+ ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL, NULL); - #endif - if (ret < 0) - return 0; --- -2.23.0 - diff --git a/0344-kni-fix-build-with-Linux-6.5.patch b/0344-kni-fix-build-with-Linux-6.5.patch deleted file mode 100644 index e817877..0000000 --- a/0344-kni-fix-build-with-Linux-6.5.patch +++ /dev/null @@ -1,53 +0,0 @@ -From dd33d53b9a032d7376aa04a28a1235338e1fd78f Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Tue, 11 Jul 2023 11:09:41 +0100 -Subject: [PATCH] kni: fix build with Linux 6.5 - -The get_user_pages_remote() API has been modified in Linux kernel v6.5 -[1], "struct vm_area_struct **vmas" parameter removed from the API. - -To fix KNI build with Linux kernel v6.5, version check added around the -get_user_pages_remote() API. - -[1] -ca5e863233e8 ("mm/gup: remove vmas parameter from get_user_pages_remote()") - -Cc: stable@dpdk.org - -Signed-off-by: Ferruh Yigit ---- - kernel/linux/kni/compat.h | 4 ++++ - kernel/linux/kni/kni_dev.h | 4 ++++ - 2 files changed, 8 insertions(+) - -diff --git a/kernel/linux/kni/compat.h b/kernel/linux/kni/compat.h -index 7aa6cd9fca..8beb670465 100644 ---- a/kernel/linux/kni/compat.h -+++ b/kernel/linux/kni/compat.h -@@ -149,3 +149,7 @@ - #if KERNEL_VERSION(5, 18, 0) > LINUX_VERSION_CODE - #define HAVE_NETIF_RX_NI - #endif -+ -+#if KERNEL_VERSION(6, 5, 0) > LINUX_VERSION_CODE -+#define HAVE_VMA_IN_GUP -+#endif -diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h -index 21bfb6890e..975379825b 100644 ---- a/kernel/linux/kni/kni_dev.h -+++ b/kernel/linux/kni/kni_dev.h -@@ -107,7 +107,11 @@ static inline phys_addr_t iova_to_phys(struct task_struct *tsk, - #ifdef HAVE_TSK_IN_GUP - ret = get_user_pages_remote(tsk, tsk->mm, iova, 1, 0, &page, NULL, NULL); - #else -+ #ifdef HAVE_VMA_IN_GUP - ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL, NULL); -+ #else -+ ret = get_user_pages_remote(tsk->mm, iova, 1, 0, &page, NULL); -+ #endif - #endif - if (ret < 0) - return 0; --- -2.23.0 - diff --git a/0345-doc-unify-sections-of-networking-drivers-guide.patch b/0345-doc-unify-sections-of-networking-drivers-guide.patch deleted file mode 100644 index 9c2509e..0000000 --- a/0345-doc-unify-sections-of-networking-drivers-guide.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 2bf5b0a8dfa64f336bd59aa807e5d576612627e6 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Tue, 21 Mar 2023 23:59:09 +0000 -Subject: doc: unify sections of networking drivers guide - -[ upstream commit b583b9a1bb49e86aa0937d55415713282000c536 ] - -- Move supported device to the top -- Move supported features up -- Move limitations down -- Rename configuration sections -- Fix section indentation -- Remove empty sections -- Remove contact info as this is duplication of maintainers file - -This patch just fix hns3 PMD because others PMDs are very -conflicting. - -Signed-off-by: Ferruh Yigit -Acked-by: Hyong Youb Kim -Acked-by: Chengwen Feng -Acked-by: Dongdong Liu -Acked-by: Qi Zhang -Acked-by: Simei Su -Reviewed-by: Rosen Xu -Acked-by: Cristian Dumitrescu -Reviewed-by: Chenbo Xia -Reviewed-by: Igor Russkikh -Acked-by: Liron Himi -Acked-by: Jerin Jacob -Acked-by: Long Li -Acked-by: Sachin Saxena ---- - doc/guides/nics/hns3.rst | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 791c9cc2ed..5373ec5a8f 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -47,11 +47,21 @@ Prerequisites - - Follow the DPDK :ref:`Getting Started Guide for Linux ` to - setup the basic DPDK environment. - -+Link status event Pre-conditions -+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - --Pre-Installation Configuration -------------------------------- -+Firmware 1.8.0.0 and later versions support reporting link changes to the PF. -+Therefore, to use the LSC for the PF driver, ensure that the firmware version -+also supports reporting link changes. -+If the VF driver needs to support LSC, special patch must be added: -+``_. -+Note: The patch has been uploaded to 5.13 of the Linux kernel mainline. -+ -+ -+Configuration -+------------- - --Config File Options -+Compilation Options - ~~~~~~~~~~~~~~~~~~~ - - The following options can be modified in the ``config/rte_config.h`` file. -@@ -60,8 +70,8 @@ The following options can be modified in the ``config/rte_config.h`` file. - - Number of MAX queues reserved for PF. - --Runtime Config Options --~~~~~~~~~~~~~~~~~~~~~~ -+Runtime Configuration -+~~~~~~~~~~~~~~~~~~~~~ - - - ``rx_func_hint`` (default ``none``) - -@@ -130,16 +140,6 @@ Runtime Config Options - For example:: - -a 0000:7d:00.0,mbx_time_limit_ms=600 - --Link status event Pre-conditions --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- --Firmware 1.8.0.0 and later versions support reporting link changes to the PF. --Therefore, to use the LSC for the PF driver, ensure that the firmware version --also supports reporting link changes. --If the VF driver needs to support LSC, special patch must be added: --``_. --Note: The patch has been uploaded to 5.13 of the Linux kernel mainline. -- - - Driver compilation and testing - ------------------------------ --- -2.23.0 - diff --git a/0346-net-hns3-delete-duplicate-macro-definition.patch b/0346-net-hns3-delete-duplicate-macro-definition.patch deleted file mode 100644 index 6c2f2d5..0000000 --- a/0346-net-hns3-delete-duplicate-macro-definition.patch +++ /dev/null @@ -1,39 +0,0 @@ -From afbdff81bcfc8c16fffc7431c247684cf3451154 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 29 Jun 2023 21:21:26 +0800 -Subject: net/hns3: delete duplicate macro definition - -[ upstream commit d48709625a2bf0f64692d925e17e254ba0dc2351 ] - -This patch delete some duplicate macro definitions. - -Fixes: a4c7152d0581 ("net/hns3: extract common code to its own file") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.h | 7 ------- - 1 file changed, 7 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index c58094d87b..c85a6912ad 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -873,13 +873,6 @@ struct hns3_adapter { - struct hns3_ptype_table ptype_tbl __rte_cache_aligned; - }; - --#define HNS3_DEVARG_RX_FUNC_HINT "rx_func_hint" --#define HNS3_DEVARG_TX_FUNC_HINT "tx_func_hint" -- --#define HNS3_DEVARG_DEV_CAPS_MASK "dev_caps_mask" -- --#define HNS3_DEVARG_MBX_TIME_LIMIT_MS "mbx_time_limit_ms" -- - enum hns3_dev_cap { - HNS3_DEV_SUPPORT_DCB_B, - HNS3_DEV_SUPPORT_COPPER_B, --- -2.23.0 - diff --git a/0347-net-hns3-add-FDIR-VLAN-match-mode-runtime-config.patch b/0347-net-hns3-add-FDIR-VLAN-match-mode-runtime-config.patch deleted file mode 100644 index 3f6062c..0000000 --- a/0347-net-hns3-add-FDIR-VLAN-match-mode-runtime-config.patch +++ /dev/null @@ -1,201 +0,0 @@ -From 01285f3f7ccbd4e3604c1cf00b6a9be2a9428502 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 29 Jun 2023 21:21:27 +0800 -Subject: net/hns3: add FDIR VLAN match mode runtime config - -[ upstream commit 5f107c4d7b7bfbc3fcaf98b4ca2963cc3e48fe93 ] - -The VLAN number in FDIR meta data is used to enable that hardware -bases on VLAN number to strictly match the input flow. And it is -enabled by default. - -For the following two rules: -rule0: - pattern: eth type is 0x0806 - actions: queue index 3 -rule1: - pattern: eth type is 0x0806 / vlan vid is 20 - actions: queue index 4 -If enable VLAN number, only the ARP packets with VLAN 20 are directed -to queue 4, and the ARP packets with other VLAN ID cannot be directed -to the specified queue. If app want to all ARP (VLAN or no VLAN) -packets to be directed to the specified queue, app has to set many -rules for VLAN packet. In this case, if driver doesn't enable VLAN -number, app just need to set one rule (rule0). - -So this patch adds a "fdir_vlan_match_mode" runtime config which only -can be 'strict' or 'nostrict'. And driver still uses 'strict' mode as -the default mode. Please select 'nostrict' mode if you request all same -ethertype packets with and without VLAN to a specified queue. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - doc/guides/nics/hns3.rst | 27 ++++++++++++++++++++++++++ - drivers/net/hns3/hns3_common.c | 35 ++++++++++++++++++++++++++++++++++ - drivers/net/hns3/hns3_common.h | 2 ++ - drivers/net/hns3/hns3_fdir.c | 10 +++++++--- - drivers/net/hns3/hns3_fdir.h | 8 ++++++++ - 5 files changed, 79 insertions(+), 3 deletions(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 172fcdb29f..644d520b64 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -144,6 +144,33 @@ Runtime Configuration - For example:: - -a 0000:7d:00.0,mbx_time_limit_ms=600 - -+- ``fdir_vlan_match_mode`` (default ``strict``) -+ -+ Used to select VLAN match mode. This runtime config can be ``strict`` -+ or ``nostrict`` and is only valid for PF devices. -+ If driver works on ``strict`` mode (default mode), hardware does strictly -+ match the input flow base on VLAN number. -+ -+ For the following scenarios with two rules: -+ -+ .. code-block:: console -+ -+ rule0: -+ pattern: eth type is 0x0806 -+ actions: queue index 3 -+ rule1: -+ pattern: eth type is 0x0806 / vlan vid is 20 -+ actions: queue index 4 -+ -+ If application select ``strict`` mode, only the ARP packets with VLAN -+ 20 are directed to queue 4, and the ARP packets with other VLAN ID -+ cannot be directed to the specified queue. If application want to all -+ ARP packets with or without VLAN to be directed to the specified queue, -+ application can select ``nostrict`` mode and just need to set rule0. -+ -+ For example:: -+ -+ -a 0000:7d:00.0,fdir_vlan_match_mode=nostrict - - Driver compilation and testing - ------------------------------ -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 6697ecefe6..a7b576aa60 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -236,6 +236,34 @@ hns3_parse_mbx_time_limit(const char *key, const char *value, void *extra_args) - return 0; - } - -+static int -+hns3_parse_vlan_match_mode(const char *key, const char *value, void *args) -+{ -+ uint8_t mode; -+ -+ RTE_SET_USED(key); -+ -+ if (value == NULL) { -+ PMD_INIT_LOG(WARNING, "no value for key:\"%s\"", key); -+ return -1; -+ } -+ -+ if (strcmp(value, "strict") == 0) { -+ mode = HNS3_FDIR_VLAN_STRICT_MATCH; -+ } else if (strcmp(value, "nostrict") == 0) { -+ mode = HNS3_FDIR_VLAN_NOSTRICT_MATCH; -+ } else { -+ PMD_INIT_LOG(WARNING, "invalid value:\"%s\" for key:\"%s\", " -+ "value must be 'strict' or 'nostrict'", -+ value, key); -+ return -1; -+ } -+ -+ *(uint8_t *)args = mode; -+ -+ return 0; -+} -+ - void - hns3_parse_devargs(struct rte_eth_dev *dev) - { -@@ -252,6 +280,8 @@ hns3_parse_devargs(struct rte_eth_dev *dev) - hns->tx_func_hint = HNS3_IO_FUNC_HINT_NONE; - hns->dev_caps_mask = 0; - hns->mbx_time_limit_ms = HNS3_MBX_DEF_TIME_LIMIT_MS; -+ if (!hns->is_vf) -+ hns->pf.fdir.vlan_match_mode = HNS3_FDIR_VLAN_STRICT_MATCH; - - if (dev->device->devargs == NULL) - return; -@@ -268,6 +298,11 @@ hns3_parse_devargs(struct rte_eth_dev *dev) - &hns3_parse_dev_caps_mask, &dev_caps_mask); - (void)rte_kvargs_process(kvlist, HNS3_DEVARG_MBX_TIME_LIMIT_MS, - &hns3_parse_mbx_time_limit, &mbx_time_limit_ms); -+ if (!hns->is_vf) -+ (void)rte_kvargs_process(kvlist, -+ HNS3_DEVARG_FDIR_VALN_MATCH_MODE, -+ &hns3_parse_vlan_match_mode, -+ &hns->pf.fdir.vlan_match_mode); - - rte_kvargs_free(kvlist); - -diff --git a/drivers/net/hns3/hns3_common.h b/drivers/net/hns3/hns3_common.h -index 8eaeda26e7..cf9593bd0c 100644 ---- a/drivers/net/hns3/hns3_common.h -+++ b/drivers/net/hns3/hns3_common.h -@@ -27,6 +27,8 @@ enum { - - #define HNS3_DEVARG_MBX_TIME_LIMIT_MS "mbx_time_limit_ms" - -+#define HNS3_DEVARG_FDIR_VALN_MATCH_MODE "fdir_vlan_match_mode" -+ - #define MSEC_PER_SEC 1000L - #define USEC_PER_MSEC 1000L - -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index 48a91fb517..c80fa59e63 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -355,9 +355,13 @@ int hns3_init_fd_config(struct hns3_adapter *hns) - /* roce_type is used to filter roce frames - * dst_vport is used to specify the rule - */ -- key_cfg->meta_data_active = BIT(DST_VPORT) | BIT(TUNNEL_PACKET) | -- BIT(VLAN_NUMBER); -- hns3_dbg(hw, "fdir meta data: dst_vport tunnel_packet vlan_number"); -+ key_cfg->meta_data_active = BIT(DST_VPORT) | BIT(TUNNEL_PACKET); -+ if (pf->fdir.vlan_match_mode) -+ key_cfg->meta_data_active |= BIT(VLAN_NUMBER); -+ -+ hns3_dbg(hw, "fdir meta data: dst_vport tunnel_packet %s", -+ (pf->fdir.vlan_match_mode == HNS3_FDIR_VLAN_STRICT_MATCH) ? -+ "vlan_number" : ""); - - ret = hns3_get_fd_allocation(hw, - &pf->fdir.fd_cfg.rule_num[HNS3_FD_STAGE_1], -diff --git a/drivers/net/hns3/hns3_fdir.h b/drivers/net/hns3/hns3_fdir.h -index ce70a534dc..308cfbe56f 100644 ---- a/drivers/net/hns3/hns3_fdir.h -+++ b/drivers/net/hns3/hns3_fdir.h -@@ -170,6 +170,13 @@ struct hns3_fdir_rule_ele { - - TAILQ_HEAD(hns3_fdir_rule_list, hns3_fdir_rule_ele); - -+/* -+ * On 'strict' mode, hardware bases on VLAN number to exactly match the -+ * input flow. -+ */ -+#define HNS3_FDIR_VLAN_STRICT_MATCH 1 -+#define HNS3_FDIR_VLAN_NOSTRICT_MATCH 0 -+ - /* - * A structure used to define fields of a FDIR related info. - */ -@@ -178,6 +185,7 @@ struct hns3_fdir_info { - struct hns3_fdir_rule_ele **hash_map; - struct rte_hash *hash_handle; - struct hns3_fd_cfg fd_cfg; -+ uint8_t vlan_match_mode; - }; - - struct hns3_adapter; --- -2.23.0 - diff --git a/0348-doc-fix-kernel-patch-link-in-hns3-guide.patch b/0348-doc-fix-kernel-patch-link-in-hns3-guide.patch deleted file mode 100644 index fcfb1b9..0000000 --- a/0348-doc-fix-kernel-patch-link-in-hns3-guide.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 3838f68b46b37050749a066dd5e956ca930b5658 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 30 Jun 2023 15:37:35 +0800 -Subject: doc: fix kernel patch link in hns3 guide - -[ upstream commit c6a4242b86a020b79d48f9dcc533be113a8df7c8 ] - -The LSC support of VF driver depends on a patch link in kernel PF -driver. -But current the link is invalid, so fixes it. - -Add a blank line after the link. - -Fixes: 80006b598730 ("doc: add link status event requirements in hns3 guide") -Cc: stable@dpdk.org - -Signed-off-by: Dongdong Liu ---- - doc/guides/nics/hns3.rst | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 5373ec5a8f..82fa79dd73 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -54,7 +54,8 @@ Firmware 1.8.0.0 and later versions support reporting link changes to the PF. - Therefore, to use the LSC for the PF driver, ensure that the firmware version - also supports reporting link changes. - If the VF driver needs to support LSC, special patch must be added: --``_. -+``_. -+ - Note: The patch has been uploaded to 5.13 of the Linux kernel mainline. - - --- -2.23.0 - diff --git a/0349-doc-fix-syntax-in-hns3-guide.patch b/0349-doc-fix-syntax-in-hns3-guide.patch deleted file mode 100644 index e187abb..0000000 --- a/0349-doc-fix-syntax-in-hns3-guide.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 906df53424e1b95ff72af509a05bbf048072a933 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 30 Jun 2023 15:37:36 +0800 -Subject: doc: fix syntax in hns3 guide - -[ upstream commit 059268551587f6fd929951dd7f5706bbdc46abcd ] - -'::' doesn't provide pre-formatted text without an empty line after it, -so fixes it. - -Fixes: cdf6a5fbc540 ("doc: add runtime option examples to hns3 guide") -Cc: stable@dpdk.org - -Signed-off-by: Dongdong Liu ---- - doc/guides/nics/hns3.rst | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 82fa79dd73..172fcdb29f 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -92,6 +92,7 @@ Runtime Configuration - ``common``. - - For example:: -+ - -a 0000:7d:00.0,rx_func_hint=simple - - - ``tx_func_hint`` (default ``none``) -@@ -112,6 +113,7 @@ Runtime Configuration - ``common``. - - For example:: -+ - -a 0000:7d:00.0,tx_func_hint=common - - - ``dev_caps_mask`` (default ``0``) -@@ -124,6 +126,7 @@ Runtime Configuration - Its main purpose is to debug and avoid problems. - - For example:: -+ - -a 0000:7d:00.0,dev_caps_mask=0xF - - - ``mbx_time_limit_ms`` (default ``500``) --- -2.23.0 - diff --git a/0350-doc-fix-number-of-leading-spaces-in-hns3-guide.patch b/0350-doc-fix-number-of-leading-spaces-in-hns3-guide.patch deleted file mode 100644 index 89e7ca9..0000000 --- a/0350-doc-fix-number-of-leading-spaces-in-hns3-guide.patch +++ /dev/null @@ -1,83 +0,0 @@ -From bb21b8e295cf30381e12629096dd3f0ab7a47b6e Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Fri, 30 Jun 2023 15:37:37 +0800 -Subject: doc: fix number of leading spaces in hns3 guide - -[ upstream commit 620cd2d5ac5a6d7de750a4827e2840209a1b0cbb ] - -The current description of 'mbx_time_limit_ms' has three spaces -at the beginning. Use two spaces to keep the same style with other -places and add a blank line after '::'. - -Fixes: 2fc3e696a7f1 ("net/hns3: add runtime config for mailbox limit time") -Cc: stable@dpdk.org - -Signed-off-by: Dongdong Liu ---- - doc/guides/nics/hns3.rst | 34 ++++++++++++++++++---------------- - 1 file changed, 18 insertions(+), 16 deletions(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 644d520b64..8705845d8e 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -93,7 +93,7 @@ Runtime Configuration - - For example:: - -- -a 0000:7d:00.0,rx_func_hint=simple -+ -a 0000:7d:00.0,rx_func_hint=simple - - - ``tx_func_hint`` (default ``none``) - -@@ -114,7 +114,7 @@ Runtime Configuration - - For example:: - -- -a 0000:7d:00.0,tx_func_hint=common -+ -a 0000:7d:00.0,tx_func_hint=common - - - ``dev_caps_mask`` (default ``0``) - -@@ -127,22 +127,24 @@ Runtime Configuration - - For example:: - -- -a 0000:7d:00.0,dev_caps_mask=0xF -+ -a 0000:7d:00.0,dev_caps_mask=0xF - - - ``mbx_time_limit_ms`` (default ``500``) -- Used to define the mailbox time limit by user. -- Current, the max waiting time for MBX response is 500ms, but in -- some scenarios, it is not enough. Since it depends on the response -- of the kernel mode driver, and its response time is related to the -- scheduling of the system. In this special scenario, most of the -- cores are isolated, and only a few cores are used for system -- scheduling. When a large number of services are started, the -- scheduling of the system will be very busy, and the reply of the -- mbx message will time out, which will cause our PMD initialization -- to fail. So provide access to set mailbox time limit for user. -- -- For example:: -- -a 0000:7d:00.0,mbx_time_limit_ms=600 -+ -+ Used to define the mailbox time limit by user. -+ Current, the max waiting time for MBX response is 500ms, but in -+ some scenarios, it is not enough. Since it depends on the response -+ of the kernel mode driver, and its response time is related to the -+ scheduling of the system. In this special scenario, most of the -+ cores are isolated, and only a few cores are used for system -+ scheduling. When a large number of services are started, the -+ scheduling of the system will be very busy, and the reply of the -+ mbx message will time out, which will cause our PMD initialization -+ to fail. So provide access to set mailbox time limit for user. -+ -+ For example:: -+ -+ -a 0000:7d:00.0,mbx_time_limit_ms=600 - - - ``fdir_vlan_match_mode`` (default ``strict``) - --- -2.23.0 - diff --git a/0351-config-arm-add-HiSilicon-HIP10.patch b/0351-config-arm-add-HiSilicon-HIP10.patch deleted file mode 100644 index 28182c4..0000000 --- a/0351-config-arm-add-HiSilicon-HIP10.patch +++ /dev/null @@ -1,93 +0,0 @@ -From b3e2b303f964e5ad17af01a498ef8c1cdc32fbd6 Mon Sep 17 00:00:00 2001 -From: Dongdong Liu -Date: Mon, 26 Jun 2023 20:43:04 +0800 -Subject: [PATCH 351/366] config/arm: add HiSilicon HIP10 - -[ upstream commit 5b2a7f12edcaba0daab0154c9ab03430083cfd80 ] - -Adding support for HiSilicon HIP10 platform. - -Signed-off-by: Dongdong Liu -Acked-by: Ruifeng Wang ---- - config/arm/arm64_hip10_linux_gcc | 16 ++++++++++++++++ - config/arm/meson.build | 19 +++++++++++++++++++ - 2 files changed, 35 insertions(+) - create mode 100644 config/arm/arm64_hip10_linux_gcc - -diff --git a/config/arm/arm64_hip10_linux_gcc b/config/arm/arm64_hip10_linux_gcc -new file mode 100644 -index 0000000..2943e4a ---- /dev/null -+++ b/config/arm/arm64_hip10_linux_gcc -@@ -0,0 +1,16 @@ -+[binaries] -+c = ['ccache', 'aarch64-linux-gnu-gcc'] -+cpp = ['ccache', 'aarch64-linux-gnu-g++'] -+ar = 'aarch64-linux-gnu-gcc-ar' -+strip = 'aarch64-linux-gnu-strip' -+pkgconfig = 'aarch64-linux-gnu-pkg-config' -+pcap-config = '' -+ -+[host_machine] -+system = 'linux' -+cpu_family = 'aarch64' -+cpu = 'armv8-a' -+endian = 'little' -+ -+[properties] -+platform = 'hip10' -diff --git a/config/arm/meson.build b/config/arm/meson.build -index 213324d..ef047e9 100644 ---- a/config/arm/meson.build -+++ b/config/arm/meson.build -@@ -193,6 +193,16 @@ implementer_hisilicon = { - ['RTE_MAX_LCORE', 1280], - ['RTE_MAX_NUMA_NODES', 16] - ] -+ }, -+ '0xd03': { -+ 'march': 'armv8.5-a', -+ 'march_features': ['crypto', 'sve'], -+ 'flags': [ -+ ['RTE_MACHINE', '"hip10"'], -+ ['RTE_ARM_FEATURE_ATOMICS', true], -+ ['RTE_MAX_LCORE', 1280], -+ ['RTE_MAX_NUMA_NODES', 16] -+ ] - } - } - } -@@ -309,6 +319,13 @@ soc_graviton2 = { - 'numa': false - } - -+soc_hip10 = { -+ 'description': 'HiSilicon HIP10', -+ 'implementer': '0x48', -+ 'part_number': '0xd03', -+ 'numa': true -+} -+ - soc_kunpeng920 = { - 'description': 'HiSilicon Kunpeng 920', - 'implementer': '0x48', -@@ -381,6 +398,7 @@ cn10k: Marvell OCTEON 10 - dpaa: NXP DPAA - emag: Ampere eMAG - graviton2: AWS Graviton2 -+hip10: HiSilicon HIP10 - kunpeng920: HiSilicon Kunpeng 920 - kunpeng930: HiSilicon Kunpeng 930 - n1sdp: Arm Neoverse N1SDP -@@ -403,6 +421,7 @@ socs = { - 'dpaa': soc_dpaa, - 'emag': soc_emag, - 'graviton2': soc_graviton2, -+ 'hip10': soc_hip10, - 'kunpeng920': soc_kunpeng920, - 'kunpeng930': soc_kunpeng930, - 'n1sdp': soc_n1sdp, --- -2.41.0.windows.2 - diff --git a/0352-net-hns3-fix-non-zero-weight-for-disabled-TC.patch b/0352-net-hns3-fix-non-zero-weight-for-disabled-TC.patch deleted file mode 100644 index a5da010..0000000 --- a/0352-net-hns3-fix-non-zero-weight-for-disabled-TC.patch +++ /dev/null @@ -1,56 +0,0 @@ -From af30b78f204788a5a82cc637b813a3b8bb66ae6b Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 7 Jul 2023 18:40:53 +0800 -Subject: [PATCH 352/366] net/hns3: fix non-zero weight for disabled TC - -[ upstream commit 1abcdb3f247393a04703071452b560a77ab23c04 ] - -hns3 PF driver enables one TC, allocates to 100% weight for this -TC and 0% for other disabled TC by default. But driver modifies -the weight to 1% for disabled TC and then set to hardware to make -all TC work in DWRR mode. As a result, the total percent of all TC -is more than 100%. Actually, this operation is also redundant, -because these disabled TC will never be used. So this patch sets -the weight of all TC based on user's configuration. - -Fixes: 62e3ccc2b94c ("net/hns3: support flow control") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_dcb.c | 9 +-------- - 1 file changed, 1 insertion(+), 8 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index af045b2..07b8c46 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -237,9 +237,9 @@ hns3_dcb_qs_weight_cfg(struct hns3_hw *hw, uint16_t qs_id, uint8_t dwrr) - static int - hns3_dcb_ets_tc_dwrr_cfg(struct hns3_hw *hw) - { --#define DEFAULT_TC_WEIGHT 1 - #define DEFAULT_TC_OFFSET 14 - struct hns3_ets_tc_weight_cmd *ets_weight; -+ struct hns3_pg_info *pg_info; - struct hns3_cmd_desc desc; - uint8_t i; - -@@ -247,13 +247,6 @@ hns3_dcb_ets_tc_dwrr_cfg(struct hns3_hw *hw) - ets_weight = (struct hns3_ets_tc_weight_cmd *)desc.data; - - for (i = 0; i < HNS3_MAX_TC_NUM; i++) { -- struct hns3_pg_info *pg_info; -- -- ets_weight->tc_weight[i] = DEFAULT_TC_WEIGHT; -- -- if (!(hw->hw_tc_map & BIT(i))) -- continue; -- - pg_info = &hw->dcb_info.pg_info[hw->dcb_info.tc_info[i].pgid]; - ets_weight->tc_weight[i] = pg_info->tc_dwrr[i]; - } --- -2.41.0.windows.2 - diff --git a/0353-net-hns3-fix-index-to-look-up-table-in-NEON-Rx.patch b/0353-net-hns3-fix-index-to-look-up-table-in-NEON-Rx.patch deleted file mode 100644 index 77ec50a..0000000 --- a/0353-net-hns3-fix-index-to-look-up-table-in-NEON-Rx.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c7f8daafe6ec2cfde7af46e446c227f15b0eec7f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 11 Jul 2023 18:24:44 +0800 -Subject: [PATCH 353/366] net/hns3: fix index to look up table in NEON Rx - -[ upstream commit 6bec7c50be7a38c114680481f285976142df40d0 ] - -In hns3_recv_burst_vec(), the index to get packet length and data -size are reversed. Fortunately, this doesn't affect functionality -because the NEON Rx only supports single BD in which the packet -length is equal to the date size. Now this patch fixes it to get -back to the truth. - -Fixes: a3d4f4d291d7 ("net/hns3: support NEON Rx") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_neon.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_neon.h b/drivers/net/hns3/hns3_rxtx_vec_neon.h -index 55d9bf8..a20a6b6 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_neon.h -+++ b/drivers/net/hns3/hns3_rxtx_vec_neon.h -@@ -142,8 +142,8 @@ hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, - /* mask to shuffle from desc to mbuf's rx_descriptor_fields1 */ - uint8x16_t shuf_desc_fields_msk = { - 0xff, 0xff, 0xff, 0xff, /* packet type init zero */ -- 22, 23, 0xff, 0xff, /* rx.pkt_len to rte_mbuf.pkt_len */ -- 20, 21, /* size to rte_mbuf.data_len */ -+ 20, 21, 0xff, 0xff, /* rx.pkt_len to rte_mbuf.pkt_len */ -+ 22, 23, /* size to rte_mbuf.data_len */ - 0xff, 0xff, /* rte_mbuf.vlan_tci init zero */ - 8, 9, 10, 11, /* rx.rss_hash to rte_mbuf.hash.rss */ - }; --- -2.41.0.windows.2 - diff --git a/0354-net-hns3-fix-VF-default-MAC-modified-when-set-failed.patch b/0354-net-hns3-fix-VF-default-MAC-modified-when-set-failed.patch deleted file mode 100644 index 90f4001..0000000 --- a/0354-net-hns3-fix-VF-default-MAC-modified-when-set-failed.patch +++ /dev/null @@ -1,35 +0,0 @@ -From f2d94f67f97a92cd142f1e7e6fa5106766acd08a Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sat, 5 Aug 2023 16:36:23 +0800 -Subject: [PATCH 354/366] net/hns3: fix VF default MAC modified when set failed - -[ upstream commit ed7faab2a717347077d9e657fba010bb145a2b54 ] - -When the VF fail to set the default MAC address, -"hw->mac.mac_addr" should not be updated. - -Fixes: a5475d61fa34 ("net/hns3: support VF") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev_vf.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 6898a77..02fb4a8 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -250,6 +250,8 @@ hns3vf_set_default_mac_addr(struct rte_eth_dev *dev, - hns3_err(hw, "Failed to set mac addr(%s) for vf: %d", - mac_str, ret); - } -+ rte_spinlock_unlock(&hw->lock); -+ return ret; - } - - rte_ether_addr_copy(mac_addr, --- -2.41.0.windows.2 - diff --git a/0355-net-hns3-fix-error-code-for-multicast-resource.patch b/0355-net-hns3-fix-error-code-for-multicast-resource.patch deleted file mode 100644 index 4f2c99f..0000000 --- a/0355-net-hns3-fix-error-code-for-multicast-resource.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 81f221e0c7e43eb37eda6e4ea8765a159fae9b08 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sat, 5 Aug 2023 16:36:24 +0800 -Subject: [PATCH 355/366] net/hns3: fix error code for multicast resource - -[ upstream commit c8cd885352d58bcfcc514770cb6068dd689d0dc3 ] - -Return ENOSPC instead of EINVAL when the hardware -has not enough multicast filtering resources. - -Fixes: 7d7f9f80bbfb ("net/hns3: support MAC address related operations") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index a7b576a..51a1c68 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -384,7 +384,7 @@ hns3_set_mc_addr_chk_param(struct hns3_hw *hw, - hns3_err(hw, "failed to set mc mac addr, nb_mc_addr(%u) " - "invalid. valid range: 0~%d", - nb_mc_addr, HNS3_MC_MACADDR_NUM); -- return -EINVAL; -+ return -ENOSPC; - } - - /* Check if input mac addresses are valid */ --- -2.41.0.windows.2 - diff --git a/0356-net-hns3-fix-flushing-multicast-MAC-address.patch b/0356-net-hns3-fix-flushing-multicast-MAC-address.patch deleted file mode 100644 index 6242127..0000000 --- a/0356-net-hns3-fix-flushing-multicast-MAC-address.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 526759b4f78ecd42b217285c892a2e2e664192a2 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sat, 5 Aug 2023 16:36:25 +0800 -Subject: [PATCH 356/366] net/hns3: fix flushing multicast MAC address - -[ upstream commit 49d1ab205b033b6131fb895b5e4d9ebc14081e51 ] - -According rte_eth_dev_set_mc_addr_list() API definition, -support flush multicast MAC address if mc_addr_set is NULL -or nb_mc_addr is zero. - -Fixes: 7d7f9f80bbfb ("net/hns3: support MAC address related operations") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_common.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 51a1c68..5dec62c 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -442,6 +442,7 @@ hns3_set_mc_mac_addr_list(struct rte_eth_dev *dev, - uint32_t nb_mc_addr) - { - struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct rte_ether_addr *addr; - int cur_addr_num; - int set_addr_num; -@@ -449,6 +450,15 @@ hns3_set_mc_mac_addr_list(struct rte_eth_dev *dev, - int ret; - int i; - -+ if (mc_addr_set == NULL || nb_mc_addr == 0) { -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_configure_all_mc_mac_addr(hns, true); -+ if (ret == 0) -+ hw->mc_addrs_num = 0; -+ rte_spinlock_unlock(&hw->lock); -+ return ret; -+ } -+ - /* Check if input parameters are valid */ - ret = hns3_set_mc_addr_chk_param(hw, mc_addr_set, nb_mc_addr); - if (ret) --- -2.41.0.windows.2 - diff --git a/0357-net-hns3-fix-traffic-management-thread-safety.patch b/0357-net-hns3-fix-traffic-management-thread-safety.patch deleted file mode 100644 index 1b3527a..0000000 --- a/0357-net-hns3-fix-traffic-management-thread-safety.patch +++ /dev/null @@ -1,273 +0,0 @@ -From a5b54a960acbdd2c55f60577f7801af096ee84ba Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 5 Aug 2023 16:36:26 +0800 -Subject: [PATCH 357/366] net/hns3: fix traffic management thread safety - -[ upstream commit 69901040975bff8a38edfc47aee727cadc87d356 ] - -The driver-related TM (traffic management) info is implemented through -the linked list. The following threads are involved in the read and -write of the TM info: - -1. main thread: invokes the rte_tm_xxx() API family to modify or read. -2. interrupt thread: will read TM info in reset recover process. -3. telemetry/proc-info thread: invoke rte_eth_dev_priv_dump() API to - read TM info. - -Currently, thread safety protection of TM info is implemented only in -the following operations: -1. some of the rte_tm_xxx() API's implementation. -2. reset recover process. - -Thread safety risks may exist in other scenarios, so fix by: -1. make sure all the rte_tm_xxx() API's implementations protected by - hw.lock. -2. make sure rte_eth_dev_priv_dump() API's implementation protected - by hw.lock. - -Fixes: c09c7847d892 ("net/hns3: support traffic management") -Fixes: e4cfe6bb9114 ("net/hns3: dump TM configuration info") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_dump.c | 8 +- - drivers/net/hns3/hns3_tm.c | 173 ++++++++++++++++++++++++++++++----- - 2 files changed, 157 insertions(+), 24 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 7ecfca8..2dc44f2 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -918,6 +918,8 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - -+ rte_spinlock_lock(&hw->lock); -+ - hns3_get_device_basic_info(file, dev); - hns3_get_dev_feature_capability(file, hw); - hns3_get_rxtx_queue_info(file, dev); -@@ -927,8 +929,10 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - * VF only supports dumping basic info, feaure capability and queue - * info. - */ -- if (hns->is_vf) -+ if (hns->is_vf) { -+ rte_spinlock_unlock(&hw->lock); - return 0; -+ } - - hns3_get_dev_mac_info(file, hns); - hns3_get_vlan_config_info(file, hw); -@@ -936,6 +940,8 @@ hns3_eth_dev_priv_dump(struct rte_eth_dev *dev, FILE *file) - hns3_get_tm_conf_info(file, dev); - hns3_get_flow_ctrl_info(file, dev); - -+ rte_spinlock_unlock(&hw->lock); -+ - return 0; - } - -diff --git a/drivers/net/hns3/hns3_tm.c b/drivers/net/hns3/hns3_tm.c -index e1089b6..67402a7 100644 ---- a/drivers/net/hns3/hns3_tm.c -+++ b/drivers/net/hns3/hns3_tm.c -@@ -1081,21 +1081,6 @@ hns3_tm_hierarchy_commit(struct rte_eth_dev *dev, - return -EINVAL; - } - --static int --hns3_tm_hierarchy_commit_wrap(struct rte_eth_dev *dev, -- int clear_on_fail, -- struct rte_tm_error *error) --{ -- struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -- int ret; -- -- rte_spinlock_lock(&hw->lock); -- ret = hns3_tm_hierarchy_commit(dev, clear_on_fail, error); -- rte_spinlock_unlock(&hw->lock); -- -- return ret; --} -- - static int - hns3_tm_node_shaper_do_update(struct hns3_hw *hw, - uint32_t node_id, -@@ -1195,6 +1180,148 @@ hns3_tm_node_shaper_update(struct rte_eth_dev *dev, - return 0; - } - -+static int -+hns3_tm_capabilities_get_wrap(struct rte_eth_dev *dev, -+ struct rte_tm_capabilities *cap, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_capabilities_get(dev, cap, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_shaper_profile_add_wrap(struct rte_eth_dev *dev, -+ uint32_t shaper_profile_id, -+ struct rte_tm_shaper_params *profile, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_shaper_profile_add(dev, shaper_profile_id, profile, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_shaper_profile_del_wrap(struct rte_eth_dev *dev, -+ uint32_t shaper_profile_id, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_shaper_profile_del(dev, shaper_profile_id, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_node_add_wrap(struct rte_eth_dev *dev, uint32_t node_id, -+ uint32_t parent_node_id, uint32_t priority, -+ uint32_t weight, uint32_t level_id, -+ struct rte_tm_node_params *params, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_node_add(dev, node_id, parent_node_id, priority, -+ weight, level_id, params, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_node_delete_wrap(struct rte_eth_dev *dev, -+ uint32_t node_id, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_node_delete(dev, node_id, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_node_type_get_wrap(struct rte_eth_dev *dev, -+ uint32_t node_id, -+ int *is_leaf, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_node_type_get(dev, node_id, is_leaf, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_level_capabilities_get_wrap(struct rte_eth_dev *dev, -+ uint32_t level_id, -+ struct rte_tm_level_capabilities *cap, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_level_capabilities_get(dev, level_id, cap, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_node_capabilities_get_wrap(struct rte_eth_dev *dev, -+ uint32_t node_id, -+ struct rte_tm_node_capabilities *cap, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_node_capabilities_get(dev, node_id, cap, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ -+static int -+hns3_tm_hierarchy_commit_wrap(struct rte_eth_dev *dev, -+ int clear_on_fail, -+ struct rte_tm_error *error) -+{ -+ struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); -+ int ret; -+ -+ rte_spinlock_lock(&hw->lock); -+ ret = hns3_tm_hierarchy_commit(dev, clear_on_fail, error); -+ rte_spinlock_unlock(&hw->lock); -+ -+ return ret; -+} -+ - static int - hns3_tm_node_shaper_update_wrap(struct rte_eth_dev *dev, - uint32_t node_id, -@@ -1213,14 +1340,14 @@ hns3_tm_node_shaper_update_wrap(struct rte_eth_dev *dev, - } - - static const struct rte_tm_ops hns3_tm_ops = { -- .capabilities_get = hns3_tm_capabilities_get, -- .shaper_profile_add = hns3_tm_shaper_profile_add, -- .shaper_profile_delete = hns3_tm_shaper_profile_del, -- .node_add = hns3_tm_node_add, -- .node_delete = hns3_tm_node_delete, -- .node_type_get = hns3_tm_node_type_get, -- .level_capabilities_get = hns3_tm_level_capabilities_get, -- .node_capabilities_get = hns3_tm_node_capabilities_get, -+ .capabilities_get = hns3_tm_capabilities_get_wrap, -+ .shaper_profile_add = hns3_tm_shaper_profile_add_wrap, -+ .shaper_profile_delete = hns3_tm_shaper_profile_del_wrap, -+ .node_add = hns3_tm_node_add_wrap, -+ .node_delete = hns3_tm_node_delete_wrap, -+ .node_type_get = hns3_tm_node_type_get_wrap, -+ .level_capabilities_get = hns3_tm_level_capabilities_get_wrap, -+ .node_capabilities_get = hns3_tm_node_capabilities_get_wrap, - .hierarchy_commit = hns3_tm_hierarchy_commit_wrap, - .node_shaper_update = hns3_tm_node_shaper_update_wrap, - }; --- -2.41.0.windows.2 - diff --git a/0358-net-hns3-fix-traffic-management-dump-text-alignment.patch b/0358-net-hns3-fix-traffic-management-dump-text-alignment.patch deleted file mode 100644 index 3129ad9..0000000 --- a/0358-net-hns3-fix-traffic-management-dump-text-alignment.patch +++ /dev/null @@ -1,107 +0,0 @@ -From c813bce4dfa2c99ec1ddc06cce3adff7b5f5fdef Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Sat, 5 Aug 2023 16:36:27 +0800 -Subject: [PATCH 358/366] net/hns3: fix traffic management dump text alignment - -[ upstream commit a73065bfea87385aa86d8ec2e7b65f68494c4f06 ] - -Currently the dumped TM info is un-align, which are: - - TM config info: - -- nb_leaf_nodes_max=64 nb_nodes_max=73 - -- nb_shaper_profile=2 nb_tc_node=1 nb_queue_node=1 - -- committed=0 - shaper_profile: - id=800 reference_count=1 peak_rate=4000000Bps - id=801 reference_count=1 peak_rate=12000000Bps - port_node: - ... - -This patch fix it, the new formatting: - - TM config info: - -- nb_leaf_nodes_max=256 nb_nodes_max=265 - -- nb_shaper_profile=2 nb_tc_node=1 nb_queue_node=1 - -- committed=1 - -- shaper_profile: - id=800 reference_count=0 peak_rate=4000000Bps - id=801 reference_count=0 peak_rate=12000000Bps - -- port_node: - ... - -Fixes: e4cfe6bb9114 ("net/hns3: dump TM configuration info") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_dump.c | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index 2dc44f2..b6e8b62 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -664,10 +664,10 @@ hns3_get_tm_conf_shaper_info(FILE *file, struct hns3_tm_conf *conf) - if (conf->nb_shaper_profile == 0) - return; - -- fprintf(file, " shaper_profile:\n"); -+ fprintf(file, "\t -- shaper_profile:\n"); - TAILQ_FOREACH(shaper_profile, shaper_profile_list, node) { - fprintf(file, -- " id=%u reference_count=%u peak_rate=%" PRIu64 "Bps\n", -+ "\t id=%u reference_count=%u peak_rate=%" PRIu64 "Bps\n", - shaper_profile->shaper_profile_id, - shaper_profile->reference_count, - shaper_profile->profile.peak.rate); -@@ -681,8 +681,8 @@ hns3_get_tm_conf_port_node_info(FILE *file, struct hns3_tm_conf *conf) - return; - - fprintf(file, -- " port_node:\n" -- " node_id=%u reference_count=%u shaper_profile_id=%d\n", -+ "\t -- port_node:\n" -+ "\t node_id=%u reference_count=%u shaper_profile_id=%d\n", - conf->root->id, conf->root->reference_count, - conf->root->shaper_profile ? - (int)conf->root->shaper_profile->shaper_profile_id : -1); -@@ -699,7 +699,7 @@ hns3_get_tm_conf_tc_node_info(FILE *file, struct hns3_tm_conf *conf) - if (conf->nb_tc_node == 0) - return; - -- fprintf(file, " tc_node:\n"); -+ fprintf(file, "\t -- tc_node:\n"); - memset(tc_node, 0, sizeof(tc_node)); - TAILQ_FOREACH(tm_node, tc_list, node) { - tidx = hns3_tm_calc_node_tc_no(conf, tm_node->id); -@@ -712,7 +712,7 @@ hns3_get_tm_conf_tc_node_info(FILE *file, struct hns3_tm_conf *conf) - if (tm_node == NULL) - continue; - fprintf(file, -- " id=%u TC%u reference_count=%u parent_id=%d " -+ "\t id=%u TC%u reference_count=%u parent_id=%d " - "shaper_profile_id=%d\n", - tm_node->id, hns3_tm_calc_node_tc_no(conf, tm_node->id), - tm_node->reference_count, -@@ -738,7 +738,7 @@ hns3_get_tm_conf_queue_format_info(FILE *file, struct hns3_tm_node **queue_node, - end_queue_id = (i + 1) * HNS3_PERLINE_QUEUES - 1; - if (end_queue_id > nb_tx_queues - 1) - end_queue_id = nb_tx_queues - 1; -- fprintf(file, " %04u - %04u | ", start_queue_id, -+ fprintf(file, "\t %04u - %04u | ", start_queue_id, - end_queue_id); - for (j = start_queue_id; j < nb_tx_queues; j++) { - if (j >= end_queue_id + 1) -@@ -767,8 +767,8 @@ hns3_get_tm_conf_queue_node_info(FILE *file, struct hns3_tm_conf *conf, - return; - - fprintf(file, -- " queue_node:\n" -- " tx queue id | mapped tc (8 mean node not exist)\n"); -+ "\t -- queue_node:\n" -+ "\t tx queue id | mapped tc (8 mean node not exist)\n"); - - memset(queue_node, 0, sizeof(queue_node)); - memset(queue_node_tc, 0, sizeof(queue_node_tc)); --- -2.41.0.windows.2 - diff --git a/0359-net-hns3-fix-order-in-NEON-Rx.patch b/0359-net-hns3-fix-order-in-NEON-Rx.patch deleted file mode 100644 index 859e48e..0000000 --- a/0359-net-hns3-fix-order-in-NEON-Rx.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 7739ae6472f1dc986ce72d24ff3fcdd1a1eccc3f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 11 Jul 2023 18:24:45 +0800 -Subject: [PATCH 359/366] net/hns3: fix order in NEON Rx - -[ upstream commit 7dd439ed998c36c8d0204c436cc656af08cfa5fc ] - -This patch reorders the order of the NEON Rx for better maintenance -and easier understanding. - -Fixes: a3d4f4d291d7 ("net/hns3: support NEON Rx") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_neon.h | 78 +++++++++++---------------- - 1 file changed, 31 insertions(+), 47 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_neon.h b/drivers/net/hns3/hns3_rxtx_vec_neon.h -index a20a6b6..1048b9d 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_neon.h -+++ b/drivers/net/hns3/hns3_rxtx_vec_neon.h -@@ -180,19 +180,12 @@ hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, - bd_vld = vset_lane_u16(rxdp[2].rx.bdtype_vld_udp0, bd_vld, 2); - bd_vld = vset_lane_u16(rxdp[3].rx.bdtype_vld_udp0, bd_vld, 3); - -- /* load 2 mbuf pointer */ -- mbp1 = vld1q_u64((uint64_t *)&sw_ring[pos]); -- - bd_vld = vshl_n_u16(bd_vld, - HNS3_UINT16_BIT - 1 - HNS3_RXD_VLD_B); - bd_vld = vreinterpret_u16_s16( - vshr_n_s16(vreinterpret_s16_u16(bd_vld), - HNS3_UINT16_BIT - 1)); - stat = ~vget_lane_u64(vreinterpret_u64_u16(bd_vld), 0); -- -- /* load 2 mbuf pointer again */ -- mbp2 = vld1q_u64((uint64_t *)&sw_ring[pos + 2]); -- - if (likely(stat == 0)) - bd_valid_num = HNS3_DEFAULT_DESCS_PER_LOOP; - else -@@ -200,20 +193,20 @@ hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, - if (bd_valid_num == 0) - break; - -- /* use offset to control below data load oper ordering */ -- offset = rxq->offset_table[bd_valid_num]; -+ /* load 4 mbuf pointer */ -+ mbp1 = vld1q_u64((uint64_t *)&sw_ring[pos]); -+ mbp2 = vld1q_u64((uint64_t *)&sw_ring[pos + 2]); - -- /* store 2 mbuf pointer into rx_pkts */ -+ /* store 4 mbuf pointer into rx_pkts */ - vst1q_u64((uint64_t *)&rx_pkts[pos], mbp1); -+ vst1q_u64((uint64_t *)&rx_pkts[pos + 2], mbp2); - -- /* read first two descs */ -+ /* use offset to control below data load oper ordering */ -+ offset = rxq->offset_table[bd_valid_num]; -+ -+ /* read 4 descs */ - descs[0] = vld2q_u64((uint64_t *)(rxdp + offset)); - descs[1] = vld2q_u64((uint64_t *)(rxdp + offset + 1)); -- -- /* store 2 mbuf pointer into rx_pkts again */ -- vst1q_u64((uint64_t *)&rx_pkts[pos + 2], mbp2); -- -- /* read remains two descs */ - descs[2] = vld2q_u64((uint64_t *)(rxdp + offset + 2)); - descs[3] = vld2q_u64((uint64_t *)(rxdp + offset + 3)); - -@@ -221,56 +214,47 @@ hns3_recv_burst_vec(struct hns3_rx_queue *__restrict rxq, - pkt_mbuf1.val[1] = vreinterpretq_u8_u64(descs[0].val[1]); - pkt_mbuf2.val[0] = vreinterpretq_u8_u64(descs[1].val[0]); - pkt_mbuf2.val[1] = vreinterpretq_u8_u64(descs[1].val[1]); -+ pkt_mbuf3.val[0] = vreinterpretq_u8_u64(descs[2].val[0]); -+ pkt_mbuf3.val[1] = vreinterpretq_u8_u64(descs[2].val[1]); -+ pkt_mbuf4.val[0] = vreinterpretq_u8_u64(descs[3].val[0]); -+ pkt_mbuf4.val[1] = vreinterpretq_u8_u64(descs[3].val[1]); - -- /* pkt 1,2 convert format from desc to pktmbuf */ -+ /* 4 packets convert format from desc to pktmbuf */ - pkt_mb1 = vqtbl2q_u8(pkt_mbuf1, shuf_desc_fields_msk); - pkt_mb2 = vqtbl2q_u8(pkt_mbuf2, shuf_desc_fields_msk); -+ pkt_mb3 = vqtbl2q_u8(pkt_mbuf3, shuf_desc_fields_msk); -+ pkt_mb4 = vqtbl2q_u8(pkt_mbuf4, shuf_desc_fields_msk); - -- /* store the first 8 bytes of pkt 1,2 mbuf's rearm_data */ -- *(uint64_t *)&sw_ring[pos + 0].mbuf->rearm_data = -- rxq->mbuf_initializer; -- *(uint64_t *)&sw_ring[pos + 1].mbuf->rearm_data = -- rxq->mbuf_initializer; -- -- /* pkt 1,2 remove crc */ -+ /* 4 packets remove crc */ - tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb1), crc_adjust); - pkt_mb1 = vreinterpretq_u8_u16(tmp); - tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb2), crc_adjust); - pkt_mb2 = vreinterpretq_u8_u16(tmp); -+ tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb3), crc_adjust); -+ pkt_mb3 = vreinterpretq_u8_u16(tmp); -+ tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb4), crc_adjust); -+ pkt_mb4 = vreinterpretq_u8_u16(tmp); - -- pkt_mbuf3.val[0] = vreinterpretq_u8_u64(descs[2].val[0]); -- pkt_mbuf3.val[1] = vreinterpretq_u8_u64(descs[2].val[1]); -- pkt_mbuf4.val[0] = vreinterpretq_u8_u64(descs[3].val[0]); -- pkt_mbuf4.val[1] = vreinterpretq_u8_u64(descs[3].val[1]); -- -- /* pkt 3,4 convert format from desc to pktmbuf */ -- pkt_mb3 = vqtbl2q_u8(pkt_mbuf3, shuf_desc_fields_msk); -- pkt_mb4 = vqtbl2q_u8(pkt_mbuf4, shuf_desc_fields_msk); -- -- /* pkt 1,2 save to rx_pkts mbuf */ -+ /* save packet info to rx_pkts mbuf */ - vst1q_u8((void *)&sw_ring[pos + 0].mbuf->rx_descriptor_fields1, - pkt_mb1); - vst1q_u8((void *)&sw_ring[pos + 1].mbuf->rx_descriptor_fields1, - pkt_mb2); -+ vst1q_u8((void *)&sw_ring[pos + 2].mbuf->rx_descriptor_fields1, -+ pkt_mb3); -+ vst1q_u8((void *)&sw_ring[pos + 3].mbuf->rx_descriptor_fields1, -+ pkt_mb4); - -- /* pkt 3,4 remove crc */ -- tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb3), crc_adjust); -- pkt_mb3 = vreinterpretq_u8_u16(tmp); -- tmp = vsubq_u16(vreinterpretq_u16_u8(pkt_mb4), crc_adjust); -- pkt_mb4 = vreinterpretq_u8_u16(tmp); -- -- /* store the first 8 bytes of pkt 3,4 mbuf's rearm_data */ -+ /* store the first 8 bytes of packets mbuf's rearm_data */ -+ *(uint64_t *)&sw_ring[pos + 0].mbuf->rearm_data = -+ rxq->mbuf_initializer; -+ *(uint64_t *)&sw_ring[pos + 1].mbuf->rearm_data = -+ rxq->mbuf_initializer; - *(uint64_t *)&sw_ring[pos + 2].mbuf->rearm_data = - rxq->mbuf_initializer; - *(uint64_t *)&sw_ring[pos + 3].mbuf->rearm_data = - rxq->mbuf_initializer; - -- /* pkt 3,4 save to rx_pkts mbuf */ -- vst1q_u8((void *)&sw_ring[pos + 2].mbuf->rx_descriptor_fields1, -- pkt_mb3); -- vst1q_u8((void *)&sw_ring[pos + 3].mbuf->rx_descriptor_fields1, -- pkt_mb4); -- - rte_prefetch_non_temporal(rxdp + HNS3_DEFAULT_DESCS_PER_LOOP); - - parse_retcode = hns3_desc_parse_field(rxq, &sw_ring[pos], --- -2.41.0.windows.2 - diff --git a/0360-net-hns3-optimize-free-mbuf-for-SVE-Tx.patch b/0360-net-hns3-optimize-free-mbuf-for-SVE-Tx.patch deleted file mode 100644 index 05aefb1..0000000 --- a/0360-net-hns3-optimize-free-mbuf-for-SVE-Tx.patch +++ /dev/null @@ -1,89 +0,0 @@ -From d967db92088afcb06e7b245109ff35288c8cd3fe Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 11 Jul 2023 18:24:46 +0800 -Subject: [PATCH 360/366] net/hns3: optimize free mbuf for SVE Tx - -[ upstream commit 01a295b741603b9366366a665402a2667a29fcc3 ] - -Currently, hns3 SVE Tx checks the valid bits of all descriptors -in a batch and then determines whether to release the corresponding -mbufs. Actually, once the valid bit of any descriptor in a batch -isn't cleared, driver does not need to scan the rest of descriptors. - -If we optimize SVE codes algorithm about this function, the performance -of a single queue for 64B packet is improved by ~2% on txonly forwarding -mode. And if use C code to scan all descriptors, the performance is -improved by ~8%. - -So this patch selects C code to optimize this code to improve the SVE -Tx performance. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_sve.c | 42 +--------------------------- - 1 file changed, 1 insertion(+), 41 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index 6f23ba6..51d4bf3 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -337,46 +337,6 @@ hns3_recv_pkts_vec_sve(void *__restrict rx_queue, - return nb_rx; - } - --static inline void --hns3_tx_free_buffers_sve(struct hns3_tx_queue *txq) --{ --#define HNS3_SVE_CHECK_DESCS_PER_LOOP 8 --#define TX_VLD_U8_ZIP_INDEX svindex_u8(0, 4) -- svbool_t pg32 = svwhilelt_b32(0, HNS3_SVE_CHECK_DESCS_PER_LOOP); -- svuint32_t vld, vld2; -- svuint8_t vld_u8; -- uint64_t vld_all; -- struct hns3_desc *tx_desc; -- int i; -- -- /* -- * All mbufs can be released only when the VLD bits of all -- * descriptors in a batch are cleared. -- */ -- /* do logical OR operation for all desc's valid field */ -- vld = svdup_n_u32(0); -- tx_desc = &txq->tx_ring[txq->next_to_clean]; -- for (i = 0; i < txq->tx_rs_thresh; i += HNS3_SVE_CHECK_DESCS_PER_LOOP, -- tx_desc += HNS3_SVE_CHECK_DESCS_PER_LOOP) { -- vld2 = svld1_gather_u32offset_u32(pg32, (uint32_t *)tx_desc, -- svindex_u32(BD_FIELD_VALID_OFFSET, BD_SIZE)); -- vld = svorr_u32_z(pg32, vld, vld2); -- } -- /* shift left and then right to get all valid bit */ -- vld = svlsl_n_u32_z(pg32, vld, -- HNS3_UINT32_BIT - 1 - HNS3_TXD_VLD_B); -- vld = svreinterpret_u32_s32(svasr_n_s32_z(pg32, -- svreinterpret_s32_u32(vld), HNS3_UINT32_BIT - 1)); -- /* use tbl to compress 32bit-lane to 8bit-lane */ -- vld_u8 = svtbl_u8(svreinterpret_u8_u32(vld), TX_VLD_U8_ZIP_INDEX); -- /* dump compressed 64bit to variable */ -- svst1_u64(PG64_64BIT, &vld_all, svreinterpret_u64_u8(vld_u8)); -- if (vld_all > 0) -- return; -- -- hns3_tx_bulk_free_buffers(txq); --} -- - static inline void - hns3_tx_fill_hw_ring_sve(struct hns3_tx_queue *txq, - struct rte_mbuf **pkts, -@@ -457,7 +417,7 @@ hns3_xmit_fixed_burst_vec_sve(void *__restrict tx_queue, - uint16_t nb_tx = 0; - - if (txq->tx_bd_ready < txq->tx_free_thresh) -- hns3_tx_free_buffers_sve(txq); -+ hns3_tx_free_buffers(txq); - - nb_pkts = RTE_MIN(txq->tx_bd_ready, nb_pkts); - if (unlikely(nb_pkts == 0)) { --- -2.41.0.windows.2 - diff --git a/0361-net-hns3-optimize-rearm-mbuf-for-SVE-Rx.patch b/0361-net-hns3-optimize-rearm-mbuf-for-SVE-Rx.patch deleted file mode 100644 index 34faf2e..0000000 --- a/0361-net-hns3-optimize-rearm-mbuf-for-SVE-Rx.patch +++ /dev/null @@ -1,223 +0,0 @@ -From 133dbfed220120724a60a2b7deae5ec7d4c38301 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 11 Jul 2023 18:24:47 +0800 -Subject: [PATCH 361/366] net/hns3: optimize rearm mbuf for SVE Rx - -[ upstream commit d49b64477f246e53210488825fdd92ccf53fa184 ] - -Use hns3_rxq_rearm_mbuf() to replace the hns3_rxq_rearm_mbuf_sve() -to optimize the performance of SVE Rx. - -On the rxonly forwarding mode, the performance of a single queue -for 64B packet is improved by ~15%. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec.c | 51 --------------------------- - drivers/net/hns3/hns3_rxtx_vec.h | 51 +++++++++++++++++++++++++++ - drivers/net/hns3/hns3_rxtx_vec_sve.c | 52 ++-------------------------- - 3 files changed, 53 insertions(+), 101 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec.c b/drivers/net/hns3/hns3_rxtx_vec.c -index 153866c..5cdfa60 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.c -+++ b/drivers/net/hns3/hns3_rxtx_vec.c -@@ -55,57 +55,6 @@ hns3_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) - return nb_tx; - } - --static inline void --hns3_rxq_rearm_mbuf(struct hns3_rx_queue *rxq) --{ --#define REARM_LOOP_STEP_NUM 4 -- struct hns3_entry *rxep = &rxq->sw_ring[rxq->rx_rearm_start]; -- struct hns3_desc *rxdp = rxq->rx_ring + rxq->rx_rearm_start; -- uint64_t dma_addr; -- int i; -- -- if (unlikely(rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep, -- HNS3_DEFAULT_RXQ_REARM_THRESH) < 0)) { -- rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; -- return; -- } -- -- for (i = 0; i < HNS3_DEFAULT_RXQ_REARM_THRESH; i += REARM_LOOP_STEP_NUM, -- rxep += REARM_LOOP_STEP_NUM, rxdp += REARM_LOOP_STEP_NUM) { -- if (likely(i < -- HNS3_DEFAULT_RXQ_REARM_THRESH - REARM_LOOP_STEP_NUM)) { -- rte_prefetch_non_temporal(rxep[4].mbuf); -- rte_prefetch_non_temporal(rxep[5].mbuf); -- rte_prefetch_non_temporal(rxep[6].mbuf); -- rte_prefetch_non_temporal(rxep[7].mbuf); -- } -- -- dma_addr = rte_mbuf_data_iova_default(rxep[0].mbuf); -- rxdp[0].addr = rte_cpu_to_le_64(dma_addr); -- rxdp[0].rx.bd_base_info = 0; -- -- dma_addr = rte_mbuf_data_iova_default(rxep[1].mbuf); -- rxdp[1].addr = rte_cpu_to_le_64(dma_addr); -- rxdp[1].rx.bd_base_info = 0; -- -- dma_addr = rte_mbuf_data_iova_default(rxep[2].mbuf); -- rxdp[2].addr = rte_cpu_to_le_64(dma_addr); -- rxdp[2].rx.bd_base_info = 0; -- -- dma_addr = rte_mbuf_data_iova_default(rxep[3].mbuf); -- rxdp[3].addr = rte_cpu_to_le_64(dma_addr); -- rxdp[3].rx.bd_base_info = 0; -- } -- -- rxq->rx_rearm_start += HNS3_DEFAULT_RXQ_REARM_THRESH; -- if (rxq->rx_rearm_start >= rxq->nb_rx_desc) -- rxq->rx_rearm_start = 0; -- -- rxq->rx_rearm_nb -= HNS3_DEFAULT_RXQ_REARM_THRESH; -- -- hns3_write_reg_opt(rxq->io_head_reg, HNS3_DEFAULT_RXQ_REARM_THRESH); --} -- - uint16_t - hns3_recv_pkts_vec(void *__restrict rx_queue, - struct rte_mbuf **__restrict rx_pkts, -diff --git a/drivers/net/hns3/hns3_rxtx_vec.h b/drivers/net/hns3/hns3_rxtx_vec.h -index 2c8a919..a9a6774 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.h -+++ b/drivers/net/hns3/hns3_rxtx_vec.h -@@ -94,4 +94,55 @@ hns3_rx_reassemble_pkts(struct rte_mbuf **rx_pkts, - - return count; - } -+ -+static inline void -+hns3_rxq_rearm_mbuf(struct hns3_rx_queue *rxq) -+{ -+#define REARM_LOOP_STEP_NUM 4 -+ struct hns3_entry *rxep = &rxq->sw_ring[rxq->rx_rearm_start]; -+ struct hns3_desc *rxdp = rxq->rx_ring + rxq->rx_rearm_start; -+ uint64_t dma_addr; -+ int i; -+ -+ if (unlikely(rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep, -+ HNS3_DEFAULT_RXQ_REARM_THRESH) < 0)) { -+ rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; -+ return; -+ } -+ -+ for (i = 0; i < HNS3_DEFAULT_RXQ_REARM_THRESH; i += REARM_LOOP_STEP_NUM, -+ rxep += REARM_LOOP_STEP_NUM, rxdp += REARM_LOOP_STEP_NUM) { -+ if (likely(i < -+ HNS3_DEFAULT_RXQ_REARM_THRESH - REARM_LOOP_STEP_NUM)) { -+ rte_prefetch_non_temporal(rxep[4].mbuf); -+ rte_prefetch_non_temporal(rxep[5].mbuf); -+ rte_prefetch_non_temporal(rxep[6].mbuf); -+ rte_prefetch_non_temporal(rxep[7].mbuf); -+ } -+ -+ dma_addr = rte_mbuf_data_iova_default(rxep[0].mbuf); -+ rxdp[0].addr = rte_cpu_to_le_64(dma_addr); -+ rxdp[0].rx.bd_base_info = 0; -+ -+ dma_addr = rte_mbuf_data_iova_default(rxep[1].mbuf); -+ rxdp[1].addr = rte_cpu_to_le_64(dma_addr); -+ rxdp[1].rx.bd_base_info = 0; -+ -+ dma_addr = rte_mbuf_data_iova_default(rxep[2].mbuf); -+ rxdp[2].addr = rte_cpu_to_le_64(dma_addr); -+ rxdp[2].rx.bd_base_info = 0; -+ -+ dma_addr = rte_mbuf_data_iova_default(rxep[3].mbuf); -+ rxdp[3].addr = rte_cpu_to_le_64(dma_addr); -+ rxdp[3].rx.bd_base_info = 0; -+ } -+ -+ rxq->rx_rearm_start += HNS3_DEFAULT_RXQ_REARM_THRESH; -+ if (rxq->rx_rearm_start >= rxq->nb_rx_desc) -+ rxq->rx_rearm_start = 0; -+ -+ rxq->rx_rearm_nb -= HNS3_DEFAULT_RXQ_REARM_THRESH; -+ -+ hns3_write_reg_opt(rxq->io_head_reg, HNS3_DEFAULT_RXQ_REARM_THRESH); -+} - #endif /* HNS3_RXTX_VEC_H */ -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index 51d4bf3..1251939 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -237,54 +237,6 @@ hns3_recv_burst_vec_sve(struct hns3_rx_queue *__restrict rxq, - return nb_rx; - } - --static inline void --hns3_rxq_rearm_mbuf_sve(struct hns3_rx_queue *rxq) --{ --#define REARM_LOOP_STEP_NUM 4 -- struct hns3_entry *rxep = &rxq->sw_ring[rxq->rx_rearm_start]; -- struct hns3_desc *rxdp = rxq->rx_ring + rxq->rx_rearm_start; -- struct hns3_entry *rxep_tmp = rxep; -- int i; -- -- if (unlikely(rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep, -- HNS3_DEFAULT_RXQ_REARM_THRESH) < 0)) { -- rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; -- return; -- } -- -- for (i = 0; i < HNS3_DEFAULT_RXQ_REARM_THRESH; i += REARM_LOOP_STEP_NUM, -- rxep_tmp += REARM_LOOP_STEP_NUM) { -- svuint64_t prf = svld1_u64(PG64_256BIT, (uint64_t *)rxep_tmp); -- svprfd_gather_u64base(PG64_256BIT, prf, SV_PLDL1STRM); -- } -- -- for (i = 0; i < HNS3_DEFAULT_RXQ_REARM_THRESH; i += REARM_LOOP_STEP_NUM, -- rxep += REARM_LOOP_STEP_NUM, rxdp += REARM_LOOP_STEP_NUM) { -- uint64_t iova[REARM_LOOP_STEP_NUM]; -- iova[0] = rxep[0].mbuf->buf_iova; -- iova[1] = rxep[1].mbuf->buf_iova; -- iova[2] = rxep[2].mbuf->buf_iova; -- iova[3] = rxep[3].mbuf->buf_iova; -- svuint64_t siova = svld1_u64(PG64_256BIT, iova); -- siova = svadd_n_u64_z(PG64_256BIT, siova, RTE_PKTMBUF_HEADROOM); -- svuint64_t ol_base = svdup_n_u64(0); -- svst1_scatter_u64offset_u64(PG64_256BIT, -- (uint64_t *)&rxdp[0].addr, -- svindex_u64(BD_FIELD_ADDR_OFFSET, BD_SIZE), siova); -- svst1_scatter_u64offset_u64(PG64_256BIT, -- (uint64_t *)&rxdp[0].addr, -- svindex_u64(BD_FIELD_OL_OFFSET, BD_SIZE), ol_base); -- } -- -- rxq->rx_rearm_start += HNS3_DEFAULT_RXQ_REARM_THRESH; -- if (rxq->rx_rearm_start >= rxq->nb_rx_desc) -- rxq->rx_rearm_start = 0; -- -- rxq->rx_rearm_nb -= HNS3_DEFAULT_RXQ_REARM_THRESH; -- -- hns3_write_reg_opt(rxq->io_head_reg, HNS3_DEFAULT_RXQ_REARM_THRESH); --} -- - uint16_t - hns3_recv_pkts_vec_sve(void *__restrict rx_queue, - struct rte_mbuf **__restrict rx_pkts, -@@ -300,7 +252,7 @@ hns3_recv_pkts_vec_sve(void *__restrict rx_queue, - nb_pkts = RTE_ALIGN_FLOOR(nb_pkts, HNS3_SVE_DEFAULT_DESCS_PER_LOOP); - - if (rxq->rx_rearm_nb > HNS3_DEFAULT_RXQ_REARM_THRESH) -- hns3_rxq_rearm_mbuf_sve(rxq); -+ hns3_rxq_rearm_mbuf(rxq); - - if (unlikely(!(rxdp->rx.bd_base_info & - rte_cpu_to_le_32(1u << HNS3_RXD_VLD_B)))) -@@ -331,7 +283,7 @@ hns3_recv_pkts_vec_sve(void *__restrict rx_queue, - break; - - if (rxq->rx_rearm_nb > HNS3_DEFAULT_RXQ_REARM_THRESH) -- hns3_rxq_rearm_mbuf_sve(rxq); -+ hns3_rxq_rearm_mbuf(rxq); - } - - return nb_rx; --- -2.41.0.windows.2 - diff --git a/0362-net-hns3-optimize-SVE-Rx-performance.patch b/0362-net-hns3-optimize-SVE-Rx-performance.patch deleted file mode 100644 index c786317..0000000 --- a/0362-net-hns3-optimize-SVE-Rx-performance.patch +++ /dev/null @@ -1,242 +0,0 @@ -From 5e6c0f58eff79c06edf3638108c096e792b81a3b Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 11 Jul 2023 18:24:48 +0800 -Subject: [PATCH 362/366] net/hns3: optimize SVE Rx performance - -[ upstream commit f1ad6decfbd44c3dc2d73dcda3fa8fb37b140186 ] - -This patch optimizes SVE Rx performance by the following ways: -1> optimize the calculation of valid BD number. -2> remove a temporary variable (key_fields) -3> use C language to parse some descriptor fields, instead of - SVE instruction. -4> small step prefetch descriptor. - -On the rxonly forwarding mode, the performance of a single queue -or 64B packet is improved by ~40%. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu ---- - drivers/net/hns3/hns3_rxtx_vec_sve.c | 137 ++++++--------------------- - 1 file changed, 27 insertions(+), 110 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rxtx_vec_sve.c b/drivers/net/hns3/hns3_rxtx_vec_sve.c -index 1251939..88b484d 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec_sve.c -+++ b/drivers/net/hns3/hns3_rxtx_vec_sve.c -@@ -20,40 +20,36 @@ - - #define BD_SIZE 32 - #define BD_FIELD_ADDR_OFFSET 0 --#define BD_FIELD_L234_OFFSET 8 --#define BD_FIELD_XLEN_OFFSET 12 --#define BD_FIELD_RSS_OFFSET 16 --#define BD_FIELD_OL_OFFSET 24 - #define BD_FIELD_VALID_OFFSET 28 - --typedef struct { -- uint32_t l234_info[HNS3_SVE_DEFAULT_DESCS_PER_LOOP]; -- uint32_t ol_info[HNS3_SVE_DEFAULT_DESCS_PER_LOOP]; -- uint32_t bd_base_info[HNS3_SVE_DEFAULT_DESCS_PER_LOOP]; --} HNS3_SVE_KEY_FIELD_S; -- - static inline uint32_t - hns3_desc_parse_field_sve(struct hns3_rx_queue *rxq, - struct rte_mbuf **rx_pkts, -- HNS3_SVE_KEY_FIELD_S *key, -+ struct hns3_desc *rxdp, - uint32_t bd_vld_num) - { -+ uint32_t l234_info, ol_info, bd_base_info; - uint32_t retcode = 0; - int ret, i; - - for (i = 0; i < (int)bd_vld_num; i++) { - /* init rte_mbuf.rearm_data last 64-bit */ - rx_pkts[i]->ol_flags = RTE_MBUF_F_RX_RSS_HASH; -- -- ret = hns3_handle_bdinfo(rxq, rx_pkts[i], key->bd_base_info[i], -- key->l234_info[i]); -+ rx_pkts[i]->hash.rss = rxdp[i].rx.rss_hash; -+ rx_pkts[i]->pkt_len = rte_le_to_cpu_16(rxdp[i].rx.pkt_len) - -+ rxq->crc_len; -+ rx_pkts[i]->data_len = rx_pkts[i]->pkt_len; -+ -+ l234_info = rxdp[i].rx.l234_info; -+ ol_info = rxdp[i].rx.ol_info; -+ bd_base_info = rxdp[i].rx.bd_base_info; -+ ret = hns3_handle_bdinfo(rxq, rx_pkts[i], bd_base_info, l234_info); - if (unlikely(ret)) { - retcode |= 1u << i; - continue; - } - -- rx_pkts[i]->packet_type = hns3_rx_calc_ptype(rxq, -- key->l234_info[i], key->ol_info[i]); -+ rx_pkts[i]->packet_type = hns3_rx_calc_ptype(rxq, l234_info, ol_info); - - /* Increment bytes counter */ - rxq->basic_stats.bytes += rx_pkts[i]->pkt_len; -@@ -77,46 +73,16 @@ hns3_recv_burst_vec_sve(struct hns3_rx_queue *__restrict rxq, - uint16_t nb_pkts, - uint64_t *bd_err_mask) - { --#define XLEN_ADJUST_LEN 32 --#define RSS_ADJUST_LEN 16 --#define GEN_VLD_U8_ZIP_INDEX svindex_s8(28, -4) - uint16_t rx_id = rxq->next_to_use; - struct hns3_entry *sw_ring = &rxq->sw_ring[rx_id]; - struct hns3_desc *rxdp = &rxq->rx_ring[rx_id]; -- struct hns3_desc *rxdp2; -- HNS3_SVE_KEY_FIELD_S key_field; -+ struct hns3_desc *rxdp2, *next_rxdp; - uint64_t bd_valid_num; - uint32_t parse_retcode; - uint16_t nb_rx = 0; - int pos, offset; - -- uint16_t xlen_adjust[XLEN_ADJUST_LEN] = { -- 0, 0xffff, 1, 0xffff, /* 1st mbuf: pkt_len and dat_len */ -- 2, 0xffff, 3, 0xffff, /* 2st mbuf: pkt_len and dat_len */ -- 4, 0xffff, 5, 0xffff, /* 3st mbuf: pkt_len and dat_len */ -- 6, 0xffff, 7, 0xffff, /* 4st mbuf: pkt_len and dat_len */ -- 8, 0xffff, 9, 0xffff, /* 5st mbuf: pkt_len and dat_len */ -- 10, 0xffff, 11, 0xffff, /* 6st mbuf: pkt_len and dat_len */ -- 12, 0xffff, 13, 0xffff, /* 7st mbuf: pkt_len and dat_len */ -- 14, 0xffff, 15, 0xffff, /* 8st mbuf: pkt_len and dat_len */ -- }; -- -- uint32_t rss_adjust[RSS_ADJUST_LEN] = { -- 0, 0xffff, /* 1st mbuf: rss */ -- 1, 0xffff, /* 2st mbuf: rss */ -- 2, 0xffff, /* 3st mbuf: rss */ -- 3, 0xffff, /* 4st mbuf: rss */ -- 4, 0xffff, /* 5st mbuf: rss */ -- 5, 0xffff, /* 6st mbuf: rss */ -- 6, 0xffff, /* 7st mbuf: rss */ -- 7, 0xffff, /* 8st mbuf: rss */ -- }; -- - svbool_t pg32 = svwhilelt_b32(0, HNS3_SVE_DEFAULT_DESCS_PER_LOOP); -- svuint16_t xlen_tbl1 = svld1_u16(PG16_256BIT, xlen_adjust); -- svuint16_t xlen_tbl2 = svld1_u16(PG16_256BIT, &xlen_adjust[16]); -- svuint32_t rss_tbl1 = svld1_u32(PG32_256BIT, rss_adjust); -- svuint32_t rss_tbl2 = svld1_u32(PG32_256BIT, &rss_adjust[8]); - - /* compile-time verifies the xlen_adjust mask */ - RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_len) != -@@ -126,30 +92,21 @@ hns3_recv_burst_vec_sve(struct hns3_rx_queue *__restrict rxq, - - for (pos = 0; pos < nb_pkts; pos += HNS3_SVE_DEFAULT_DESCS_PER_LOOP, - rxdp += HNS3_SVE_DEFAULT_DESCS_PER_LOOP) { -- svuint64_t vld_clz, mbp1st, mbp2st, mbuf_init; -- svuint64_t xlen1st, xlen2st, rss1st, rss2st; -- svuint32_t l234, ol, vld, vld2, xlen, rss; -- svuint8_t vld_u8; -+ svuint64_t mbp1st, mbp2st, mbuf_init; -+ svuint32_t vld; -+ svbool_t vld_op; - - /* calc how many bd valid: part 1 */ - vld = svld1_gather_u32offset_u32(pg32, (uint32_t *)rxdp, - svindex_u32(BD_FIELD_VALID_OFFSET, BD_SIZE)); -- vld2 = svlsl_n_u32_z(pg32, vld, -- HNS3_UINT32_BIT - 1 - HNS3_RXD_VLD_B); -- vld2 = svreinterpret_u32_s32(svasr_n_s32_z(pg32, -- svreinterpret_s32_u32(vld2), HNS3_UINT32_BIT - 1)); -+ vld = svand_n_u32_z(pg32, vld, BIT(HNS3_RXD_VLD_B)); -+ vld_op = svcmpne_n_u32(pg32, vld, BIT(HNS3_RXD_VLD_B)); -+ bd_valid_num = svcntp_b32(pg32, svbrkb_b_z(pg32, vld_op)); -+ if (bd_valid_num == 0) -+ break; - - /* load 4 mbuf pointer */ - mbp1st = svld1_u64(PG64_256BIT, (uint64_t *)&sw_ring[pos]); -- -- /* calc how many bd valid: part 2 */ -- vld_u8 = svtbl_u8(svreinterpret_u8_u32(vld2), -- svreinterpret_u8_s8(GEN_VLD_U8_ZIP_INDEX)); -- vld_clz = svnot_u64_z(PG64_64BIT, svreinterpret_u64_u8(vld_u8)); -- vld_clz = svclz_u64_z(PG64_64BIT, vld_clz); -- svst1_u64(PG64_64BIT, &bd_valid_num, vld_clz); -- bd_valid_num /= HNS3_UINT8_BIT; -- - /* load 4 more mbuf pointer */ - mbp2st = svld1_u64(PG64_256BIT, (uint64_t *)&sw_ring[pos + 4]); - -@@ -159,65 +116,25 @@ hns3_recv_burst_vec_sve(struct hns3_rx_queue *__restrict rxq, - - /* store 4 mbuf pointer into rx_pkts */ - svst1_u64(PG64_256BIT, (uint64_t *)&rx_pkts[pos], mbp1st); -- -- /* load key field to vector reg */ -- l234 = svld1_gather_u32offset_u32(pg32, (uint32_t *)rxdp2, -- svindex_u32(BD_FIELD_L234_OFFSET, BD_SIZE)); -- ol = svld1_gather_u32offset_u32(pg32, (uint32_t *)rxdp2, -- svindex_u32(BD_FIELD_OL_OFFSET, BD_SIZE)); -- - /* store 4 mbuf pointer into rx_pkts again */ - svst1_u64(PG64_256BIT, (uint64_t *)&rx_pkts[pos + 4], mbp2st); - -- /* load datalen, pktlen and rss_hash */ -- xlen = svld1_gather_u32offset_u32(pg32, (uint32_t *)rxdp2, -- svindex_u32(BD_FIELD_XLEN_OFFSET, BD_SIZE)); -- rss = svld1_gather_u32offset_u32(pg32, (uint32_t *)rxdp2, -- svindex_u32(BD_FIELD_RSS_OFFSET, BD_SIZE)); -- -- /* store key field to stash buffer */ -- svst1_u32(pg32, (uint32_t *)key_field.l234_info, l234); -- svst1_u32(pg32, (uint32_t *)key_field.bd_base_info, vld); -- svst1_u32(pg32, (uint32_t *)key_field.ol_info, ol); -- -- /* sub crc_len for pkt_len and data_len */ -- xlen = svreinterpret_u32_u16(svsub_n_u16_z(PG16_256BIT, -- svreinterpret_u16_u32(xlen), rxq->crc_len)); -- - /* init mbuf_initializer */ - mbuf_init = svdup_n_u64(rxq->mbuf_initializer); -- -- /* extract datalen, pktlen and rss from xlen and rss */ -- xlen1st = svreinterpret_u64_u16( -- svtbl_u16(svreinterpret_u16_u32(xlen), xlen_tbl1)); -- xlen2st = svreinterpret_u64_u16( -- svtbl_u16(svreinterpret_u16_u32(xlen), xlen_tbl2)); -- rss1st = svreinterpret_u64_u32( -- svtbl_u32(svreinterpret_u32_u32(rss), rss_tbl1)); -- rss2st = svreinterpret_u64_u32( -- svtbl_u32(svreinterpret_u32_u32(rss), rss_tbl2)); -- - /* save mbuf_initializer */ - svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp1st, - offsetof(struct rte_mbuf, rearm_data), mbuf_init); - svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp2st, - offsetof(struct rte_mbuf, rearm_data), mbuf_init); - -- /* save datalen and pktlen and rss */ -- svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp1st, -- offsetof(struct rte_mbuf, pkt_len), xlen1st); -- svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp1st, -- offsetof(struct rte_mbuf, hash.rss), rss1st); -- svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp2st, -- offsetof(struct rte_mbuf, pkt_len), xlen2st); -- svst1_scatter_u64base_offset_u64(PG64_256BIT, mbp2st, -- offsetof(struct rte_mbuf, hash.rss), rss2st); -- -- rte_prefetch_non_temporal(rxdp + -- HNS3_SVE_DEFAULT_DESCS_PER_LOOP); -+ next_rxdp = rxdp + HNS3_SVE_DEFAULT_DESCS_PER_LOOP; -+ rte_prefetch_non_temporal(next_rxdp); -+ rte_prefetch_non_temporal(next_rxdp + 2); -+ rte_prefetch_non_temporal(next_rxdp + 4); -+ rte_prefetch_non_temporal(next_rxdp + 6); - - parse_retcode = hns3_desc_parse_field_sve(rxq, &rx_pkts[pos], -- &key_field, bd_valid_num); -+ &rxdp2[offset], bd_valid_num); - if (unlikely(parse_retcode)) - (*bd_err_mask) |= ((uint64_t)parse_retcode) << pos; - --- -2.41.0.windows.2 - diff --git a/0363-app-testpmd-fix-multicast-address-pool-leak.patch b/0363-app-testpmd-fix-multicast-address-pool-leak.patch deleted file mode 100644 index 73a9cf3..0000000 --- a/0363-app-testpmd-fix-multicast-address-pool-leak.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 9b13302cec30ec70d2aedcd024bde4db57bc8eaa Mon Sep 17 00:00:00 2001 -From: Ke Zhang -Date: Fri, 25 Mar 2022 08:35:55 +0000 -Subject: [PATCH 363/366] app/testpmd: fix multicast address pool leak - -[ upstream commit 68629be3a622ee53cd5b40c8447ae9b083ff3f6c ] - -A multicast address pool is allocated for a port when -using mcast_addr testpmd commands. - -When closing a port or stopping testpmd, this pool was -not freed, resulting in a leak. -This issue has been caught using ASan. - -Free this pool when closing the port. - -Error info as following: -ERROR: LeakSanitizer: detected memory leaksDirect leak of - 192 byte(s) -0 0x7f6a2e0aeffe in __interceptor_realloc - (/lib/x86_64-linux-gnu/libasan.so.5+0x10dffe) -1 0x565361eb340f in mcast_addr_pool_extend - ../app/test-pmd/config.c:5162 -2 0x565361eb3556 in mcast_addr_pool_append - ../app/test-pmd/config.c:5180 -3 0x565361eb3aae in mcast_addr_add - ../app/test-pmd/config.c:5243 - -Fixes: 8fff667578a7 ("app/testpmd: new command to add/remove multicast MAC addresses") -Cc: stable@dpdk.org - -Signed-off-by: Ke Zhang -Acked-by: Yuying Zhang -Acked-by: Ferruh Yigit ---- - app/test-pmd/config.c | 19 +++++++++++++++++++ - app/test-pmd/testpmd.c | 1 + - app/test-pmd/testpmd.h | 1 + - 3 files changed, 21 insertions(+) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 22c63e2..61dc56f 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -5364,6 +5364,25 @@ mcast_addr_pool_remove(struct rte_port *port, uint32_t addr_idx) - sizeof(struct rte_ether_addr) * (port->mc_addr_nb - addr_idx)); - } - -+int -+mcast_addr_pool_destroy(portid_t port_id) -+{ -+ struct rte_port *port; -+ -+ if (port_id_is_invalid(port_id, ENABLED_WARN) || -+ port_id == (portid_t)RTE_PORT_ALL) -+ return -EINVAL; -+ port = &ports[port_id]; -+ -+ if (port->mc_addr_nb != 0) { -+ /* free the pool of multicast addresses. */ -+ free(port->mc_addr_pool); -+ port->mc_addr_pool = NULL; -+ port->mc_addr_nb = 0; -+ } -+ return 0; -+} -+ - static int - eth_port_multicast_addr_list_set(portid_t port_id) - { -diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c -index 20134c5..6f59bd2 100644 ---- a/app/test-pmd/testpmd.c -+++ b/app/test-pmd/testpmd.c -@@ -3284,6 +3284,7 @@ close_port(portid_t pid) - } - - if (is_proc_primary()) { -+ mcast_addr_pool_destroy(pi); - port_flow_flush(pi); - port_flex_item_flush(pi); - port_action_handle_flush(pi); -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index be7454a..54d3112 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -906,6 +906,7 @@ int port_flow_create(portid_t port_id, - int port_action_handle_query(portid_t port_id, uint32_t id); - void update_age_action_context(const struct rte_flow_action *actions, - struct port_flow *pf); -+int mcast_addr_pool_destroy(portid_t port_id); - int port_flow_destroy(portid_t port_id, uint32_t n, const uint32_t *rule); - int port_flow_flush(portid_t port_id); - int port_flow_dump(portid_t port_id, bool dump_all, --- -2.41.0.windows.2 - diff --git a/0364-app-testpmd-fix-help-string.patch b/0364-app-testpmd-fix-help-string.patch deleted file mode 100644 index d27024e..0000000 --- a/0364-app-testpmd-fix-help-string.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 21f694a2c28879a863dc255e7800ee31aac5c068 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sun, 8 Oct 2023 14:46:19 +0800 -Subject: [PATCH 364/366] app/testpmd: fix help string - -[ upstream commit 42661fb8f18e52684d0d9f0d376017082fca45e0 ] - -Command help string is missing 'mcast_addr add|remove'. -This patch add it. - -Fixes: 8fff667578a7 ("app/testpmd: new command to add/remove multicast MAC addresses") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Acked-by: Chengwen Feng -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index bc770f3..ec8f385 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -504,6 +504,12 @@ static void cmd_help_long_parsed(void *parsed_result, - "mac_addr add port (port_id) vf (vf_id) (mac_address)\n" - " Add a MAC address for a VF on the port.\n\n" - -+ "mcast_addr add (port_id) (mcast_addr)\n" -+ " Add a multicast MAC addresses on port_id.\n\n" -+ -+ "mcast_addr remove (port_id) (mcast_addr)\n" -+ " Remove a multicast MAC address from port_id.\n\n" -+ - "set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n" - " Set the MAC address for a VF from the PF.\n\n" - --- -2.41.0.windows.2 - diff --git a/0365-app-testpmd-add-command-to-flush-multicast-MAC-addre.patch b/0365-app-testpmd-add-command-to-flush-multicast-MAC-addre.patch deleted file mode 100644 index 56b2a4a..0000000 --- a/0365-app-testpmd-add-command-to-flush-multicast-MAC-addre.patch +++ /dev/null @@ -1,152 +0,0 @@ -From c2f8baf727df5d43ba3e1366037d31bd6185b77d Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sun, 8 Oct 2023 14:46:20 +0800 -Subject: [PATCH 365/366] app/testpmd: add command to flush multicast MAC addresses - -[ upstream commit ef8bd7d0b25abdcc425d4a7e399c66957b15b935 ] - -Add command to flush all multicast MAC address -Usage: - mcast_addr flush : - flush all multicast MAC address on port_id - -Signed-off-by: Dengdui Huang -Acked-by: Chengwen Feng -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 43 +++++++++++++++++++++ - app/test-pmd/config.c | 18 +++++++++ - app/test-pmd/testpmd.h | 1 + - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 7 ++++ - 4 files changed, 69 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index ec8f385..8facca3 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -510,6 +510,9 @@ static void cmd_help_long_parsed(void *parsed_result, - "mcast_addr remove (port_id) (mcast_addr)\n" - " Remove a multicast MAC address from port_id.\n\n" - -+ "mcast_addr flush (port_id)\n" -+ " Flush all multicast MAC addresses on port_id.\n\n" -+ - "set vf mac addr (port_id) (vf_id) (XX:XX:XX:XX:XX:XX)\n" - " Set the MAC address for a VF from the PF.\n\n" - -@@ -11004,6 +11007,45 @@ cmdline_parse_inst_t cmd_mcast_addr = { - }, - }; - -+/* *** FLUSH MULTICAST MAC ADDRESS ON PORT *** */ -+struct cmd_mcast_addr_flush_result { -+ cmdline_fixed_string_t mcast_addr_cmd; -+ cmdline_fixed_string_t what; -+ uint16_t port_num; -+}; -+ -+static void cmd_mcast_addr_flush_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_mcast_addr_flush_result *res = parsed_result; -+ -+ mcast_addr_flush(res->port_num); -+} -+ -+static cmdline_parse_token_string_t cmd_mcast_addr_flush_cmd = -+ TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, -+ mcast_addr_cmd, "mcast_addr"); -+static cmdline_parse_token_string_t cmd_mcast_addr_flush_what = -+ TOKEN_STRING_INITIALIZER(struct cmd_mcast_addr_result, what, -+ "flush"); -+static cmdline_parse_token_num_t cmd_mcast_addr_flush_portnum = -+ TOKEN_NUM_INITIALIZER(struct cmd_mcast_addr_result, port_num, -+ RTE_UINT16); -+ -+static cmdline_parse_inst_t cmd_mcast_addr_flush = { -+ .f = cmd_mcast_addr_flush_parsed, -+ .data = (void *)0, -+ .help_str = "mcast_addr flush : " -+ "flush all multicast MAC addresses on port_id", -+ .tokens = { -+ (void *)&cmd_mcast_addr_flush_cmd, -+ (void *)&cmd_mcast_addr_flush_what, -+ (void *)&cmd_mcast_addr_flush_portnum, -+ NULL, -+ }, -+}; -+ - /* vf vlan anti spoof configuration */ - - /* Common result structure for vf vlan anti spoof */ -@@ -17867,6 +17909,7 @@ cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask, - (cmdline_parse_inst_t *)&cmd_show_port_meter_stats, - (cmdline_parse_inst_t *)&cmd_mcast_addr, -+ (cmdline_parse_inst_t *)&cmd_mcast_addr_flush, - (cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof, - (cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof, - (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq, -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 61dc56f..af00078 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -5459,6 +5459,24 @@ mcast_addr_remove(portid_t port_id, struct rte_ether_addr *mc_addr) - mcast_addr_pool_append(port, mc_addr); - } - -+void -+mcast_addr_flush(portid_t port_id) -+{ -+ int ret; -+ -+ if (port_id_is_invalid(port_id, ENABLED_WARN)) -+ return; -+ -+ ret = rte_eth_dev_set_mc_addr_list(port_id, NULL, 0); -+ if (ret != 0) { -+ fprintf(stderr, -+ "Failed to flush all multicast MAC addresses on port_id %u\n", -+ port_id); -+ return; -+ } -+ mcast_addr_pool_destroy(port_id); -+} -+ - void - port_dcb_info_display(portid_t port_id) - { -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 54d3112..30c7177 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -1051,6 +1051,7 @@ void show_mcast_macs(portid_t port_id); - /* Functions to manage the set of filtered Multicast MAC addresses */ - void mcast_addr_add(portid_t port_id, struct rte_ether_addr *mc_addr); - void mcast_addr_remove(portid_t port_id, struct rte_ether_addr *mc_addr); -+void mcast_addr_flush(portid_t port_id); - void port_dcb_info_display(portid_t port_id); - - uint8_t *open_file(const char *file_path, uint32_t *size); -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index ecf89aa..c33c845 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -1406,6 +1406,13 @@ filtered by port:: - - testpmd> mcast_addr remove (port_id) (mcast_addr) - -+mcast_addr flush -+~~~~~~~~~~~~~~~~ -+ -+Flush all multicast MAC addresses on port_id:: -+ -+ testpmd> mcast_addr flush (port_id) -+ - mac_addr add (for VF) - ~~~~~~~~~~~~~~~~~~~~~ - --- -2.41.0.windows.2 - diff --git a/0366-maintainers-update-for-hns3-driver.patch b/0366-maintainers-update-for-hns3-driver.patch deleted file mode 100644 index 12fc38e..0000000 --- a/0366-maintainers-update-for-hns3-driver.patch +++ /dev/null @@ -1,33 +0,0 @@ -From d743e25356ecfda7dcfc029c4e6a5d46fd80bce1 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 26 Sep 2023 18:04:05 +0800 -Subject: [PATCH] maintainers: update for hns3 driver - -[ upstream commit 5e4b7cad5119956df1ca9f0d22d1429399a5c818 ] - -Dongdong Liu currently do not work for the hns3 PMD. -I will do the work, so update the hns3 maintainers. - -Signed-off-by: Jie Hai ---- - MAINTAINERS | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 7a28fec..7db6d4e 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -695,9 +695,8 @@ F: doc/guides/nics/enic.rst - F: doc/guides/nics/features/enic.ini - - Hisilicon hns3 --M: Min Hu (Connor) -+M: Jie Hai - M: Yisen Zhuang --M: Lijun Ou - F: drivers/net/hns3/ - F: doc/guides/nics/hns3.rst - F: doc/guides/nics/features/hns3.ini --- -2.41.0.windows.2 - diff --git a/0367-telemetry-fix-repeat-display-when-callback-don-t-init-dict.patch b/0367-telemetry-fix-repeat-display-when-callback-don-t-init-dict.patch deleted file mode 100644 index 7947d0b..0000000 --- a/0367-telemetry-fix-repeat-display-when-callback-don-t-init-dict.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 0ba973a96681d5c5f85423176d63c14f8cbc1c25 Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 9 Feb 2023 01:25:33 +0000 -Subject: [PATCH 367/394] telemetry: fix repeat display when callback don't - init dict - -[ upstream commit ff50c4f9136781bae9089c596e0a12d113e1d474 ] - -When a telemetry callback doesn't initialize the telemetry data -structure and returns a non-negative number, the telemetry will repeat -to display the last result. This patch zero the data structure to avoid -the problem. - -Fixes: 6dd571fd07c3 ("telemetry: introduce new functionality") -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng -Reviewed-by: Bruce Richardson ---- - lib/telemetry/telemetry.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c -index 52048de55c..2c12db20cb 100644 ---- a/lib/telemetry/telemetry.c -+++ b/lib/telemetry/telemetry.c -@@ -332,7 +332,7 @@ output_json(const char *cmd, const struct rte_tel_data *d, int s) - static void - perform_command(telemetry_cb fn, const char *cmd, const char *param, int s) - { -- struct rte_tel_data data; -+ struct rte_tel_data data = {0}; - - int ret = fn(cmd, param, &data); - if (ret < 0) { --- -2.23.0 - diff --git a/0368-net-hns3-fix-build-warning.patch b/0368-net-hns3-fix-build-warning.patch deleted file mode 100644 index 8cdd683..0000000 --- a/0368-net-hns3-fix-build-warning.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 86aadc9fdf971e0f261572d01fe5fa7cbcfda385 Mon Sep 17 00:00:00 2001 -From: Jerin Jacob -Date: Tue, 4 Apr 2023 12:25:25 +0530 -Subject: [PATCH 368/394] net/hns3: fix build warning -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 60fe5c3cfc3c28952448d2163c4eb1d22d86ccac ] - -aarch64 gcc 12.2.0 build complain with below warning[1]. -Move the new_link initialization upwards to fix the warning. - -[1] -drivers/net/hns3/hns3_ethdev.c: In function ‘hns3_dev_link_update’: -drivers/net/hns3/hns3_ethdev.c:2249:1: - warning: ‘new_link’ may be used uninitialized [-Wmaybe-uninitialized] - -Fixes: 64308555d5bf ("net/hns3: fix link status when port is stopped") -Cc: stable@dpdk.org - -Signed-off-by: Jerin Jacob -Acked-by: Dongdong Liu ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 6c3ae75c4d..ad595478a7 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2275,6 +2275,7 @@ hns3_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete) - struct rte_eth_link new_link; - int ret; - -+ memset(&new_link, 0, sizeof(new_link)); - /* When port is stopped, report link down. */ - if (eth_dev->data->dev_started == 0) { - new_link.link_autoneg = mac->link_autoneg; -@@ -2298,7 +2299,6 @@ hns3_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete) - rte_delay_ms(HNS3_LINK_CHECK_INTERVAL); - } while (retry_cnt--); - -- memset(&new_link, 0, sizeof(new_link)); - hns3_setup_linkstatus(eth_dev, &new_link); - - out: --- -2.23.0 - diff --git a/0369-net-hns3-fix-typo-in-function-name.patch b/0369-net-hns3-fix-typo-in-function-name.patch deleted file mode 100644 index 7c8d9a0..0000000 --- a/0369-net-hns3-fix-typo-in-function-name.patch +++ /dev/null @@ -1,44 +0,0 @@ -From e1aae46f2f2185c5d3b0d33a4db8452d9c5129b3 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 27 Oct 2023 14:09:39 +0800 -Subject: [PATCH 369/394] net/hns3: fix typo in function name - -[ upstream commit 28ad38dd7403d64b3c0aa6dfd33e314bdce276c6 ] - -This patch fixes a typo. - -Fixes: c09c7847d892 ("net/hns3: support traffic management") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Acked-by: Huisong Li -Acked-by: Chengwen Feng ---- - drivers/net/hns3/hns3_tm.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_tm.c b/drivers/net/hns3/hns3_tm.c -index 67402a700f..d969164014 100644 ---- a/drivers/net/hns3/hns3_tm.c -+++ b/drivers/net/hns3/hns3_tm.c -@@ -739,7 +739,7 @@ hns3_tm_node_type_get(struct rte_eth_dev *dev, uint32_t node_id, - } - - static void --hns3_tm_nonleaf_level_capsbilities_get(struct rte_eth_dev *dev, -+hns3_tm_nonleaf_level_capabilities_get(struct rte_eth_dev *dev, - uint32_t level_id, - struct rte_tm_level_capabilities *cap) - { -@@ -818,7 +818,7 @@ hns3_tm_level_capabilities_get(struct rte_eth_dev *dev, - memset(cap, 0, sizeof(struct rte_tm_level_capabilities)); - - if (level_id != HNS3_TM_NODE_LEVEL_QUEUE) -- hns3_tm_nonleaf_level_capsbilities_get(dev, level_id, cap); -+ hns3_tm_nonleaf_level_capabilities_get(dev, level_id, cap); - else - hns3_tm_leaf_level_capabilities_get(dev, cap); - --- -2.23.0 - diff --git a/0370-net-hns3-fix-unchecked-Rx-free-threshold.patch b/0370-net-hns3-fix-unchecked-Rx-free-threshold.patch deleted file mode 100644 index 469e424..0000000 --- a/0370-net-hns3-fix-unchecked-Rx-free-threshold.patch +++ /dev/null @@ -1,44 +0,0 @@ -From e21bdbf93b0ec692c86d9457a23acb3e3209243b Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:40 +0800 -Subject: [PATCH 370/394] net/hns3: fix unchecked Rx free threshold - -[ upstream commit c1f0cd3a4c834c2e550370b6d31b6bcd456a15f9 ] - -To reduce the frequency of updating the head pointer of Rx queue, -driver just updates this pointer when the number of processed -descriptors is greater than the Rx free threshold. If the Rx free -threshold is set to a value greater than or equal to the number of -descriptors in Rx queue, the driver does not update this pointer. -As a result, the hardware cannot receive more packets. - -This patch fix it by adding Rx free threshold check. - -Fixes: bba636698316 ("net/hns3: support Rx/Tx and related operations") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_rxtx.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 4c79163e3f..208c725cd5 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -1785,6 +1785,12 @@ hns3_rx_queue_conf_check(struct hns3_hw *hw, const struct rte_eth_rxconf *conf, - return -EINVAL; - } - -+ if (conf->rx_free_thresh >= nb_desc) { -+ hns3_err(hw, "rx_free_thresh (%u) must be less than %u", -+ conf->rx_free_thresh, nb_desc); -+ return -EINVAL; -+ } -+ - if (conf->rx_drop_en == 0) - hns3_warn(hw, "if no descriptors available, packets are always " - "dropped and rx_drop_en (1) is fixed on"); --- -2.23.0 - diff --git a/0371-net-hns3-fix-crash-for-NEON-and-SVE.patch b/0371-net-hns3-fix-crash-for-NEON-and-SVE.patch deleted file mode 100644 index 9f2c003..0000000 --- a/0371-net-hns3-fix-crash-for-NEON-and-SVE.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 090826e4646db4a438336c5e9e879f2fa5a6e07a Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 27 Oct 2023 14:09:41 +0800 -Subject: [PATCH 371/394] net/hns3: fix crash for NEON and SVE - -[ upstream commit 01843ab2f2fc8c3137258ec39b2cb6f62ba7b8a2 ] - -Driver may fail to allocate bulk mbufs for Neon and SVE when rearm -mbuf. Currently, driver keeps going to handle packets even if there -isn't available descriptors to receive packets at this moment. -As a result, driver probably fills the mbufs with invalid data to -application and accesses to illegal address because of the VLD bit -of the descriptor at the "rx_rearm_start" position still being set. -So driver has to clear VLD bit for this descriptor in this scenario -in case of receiving packets later. - -In addition, it is possible that the sum of the "rx_rearm_nb" and -"rx_rearm_start" is greater than total descriptor number of Rx queue -in the above scenario. So the index of rxq->sw_ring[] to set mbuf -pointer to NULL should also be fixed to avoid out-of-bounds memory -access. - -Fixes: a3d4f4d291d7 ("net/hns3: support NEON Rx") -Fixes: f81a18f49152 ("net/hns3: fix mbuf leakage when RxQ started after reset") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li ---- - drivers/net/hns3/hns3_rxtx.c | 2 +- - drivers/net/hns3/hns3_rxtx_vec.h | 5 +++++ - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 208c725cd5..3054d24080 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -51,7 +51,7 @@ hns3_rx_queue_release_mbufs(struct hns3_rx_queue *rxq) - } - } - for (i = 0; i < rxq->rx_rearm_nb; i++) -- rxq->sw_ring[rxq->rx_rearm_start + i].mbuf = NULL; -+ rxq->sw_ring[(rxq->rx_rearm_start + i) % rxq->nb_rx_desc].mbuf = NULL; - } - - for (i = 0; i < rxq->bulk_mbuf_num; i++) -diff --git a/drivers/net/hns3/hns3_rxtx_vec.h b/drivers/net/hns3/hns3_rxtx_vec.h -index a9a6774294..9018e79c2f 100644 ---- a/drivers/net/hns3/hns3_rxtx_vec.h -+++ b/drivers/net/hns3/hns3_rxtx_vec.h -@@ -106,6 +106,11 @@ hns3_rxq_rearm_mbuf(struct hns3_rx_queue *rxq) - - if (unlikely(rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep, - HNS3_DEFAULT_RXQ_REARM_THRESH) < 0)) { -+ /* -+ * Clear VLD bit for the first descriptor rearmed in case -+ * of going to receive packets later. -+ */ -+ rxdp[0].rx.bd_base_info = 0; - rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; - return; - } --- -2.23.0 - diff --git a/0372-net-hns3-fix-double-stats-for-IMP-and-global-reset.patch b/0372-net-hns3-fix-double-stats-for-IMP-and-global-reset.patch deleted file mode 100644 index 9a76b93..0000000 --- a/0372-net-hns3-fix-double-stats-for-IMP-and-global-reset.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 9406299efd12990e91299d6abbe1b191d0360101 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:42 +0800 -Subject: [PATCH 372/394] net/hns3: fix double stats for IMP and global reset - -[ upstream commit c48e74370c5eafbe8db5c826a797344e4fdf8f49 ] - -There is a stats counter for IMP and global reset in PF driver. -hns3 driver has two following task to detect reset event: -(1) interrupt handled task(A): triggered by interrupt and detect - which reset level. And the reset service will be executed - after 10us. -(2) polling task(B): scan reset source register to detect if - driver has to do reset. And the reset service will be executed - after deferred 3s. - -They'll both count the number of one reset plus 1. -Task(A) adds it before doing the reset service. And in the reset service, -task(B) adds it if hw->reset.schedule is 'SCHEDULE_REQUESTED'. -Normally, this reset counter is just added by 1 once. Unfortunately, -this counter is added by 2 in the following case: -1. Task(B) detect the reset event, like IMP. hw->reset.schedule is - set to 'SCHEDULE_REQUESTED'. -2. Task(A) is just triggered before running the reset service of task(B). - Note: the reset counter is added by 1 at this moment before running - the reset service of task(A). Additionally, the reset service of - task(B) is canceled in task(A) because of schedule status being - 'SCHEDULE_REQUESTED'. -3. Then the reset service of task(A) is executed at last. - Note: The reset counter is added by 1 again in this step because of - schedule status still being 'SCHEDULE_REQUESTED'. - -So this patch fix it by setting the scheduling status to -'SCHEDULE_REQUESTED' in step 2. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_intr.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 57679254ee..51711244b5 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -2413,8 +2413,8 @@ hns3_schedule_reset(struct hns3_adapter *hns) - if (__atomic_load_n(&hw->reset.schedule, __ATOMIC_RELAXED) == - SCHEDULE_DEFERRED) - rte_eal_alarm_cancel(hw->reset.ops->reset_service, hns); -- else -- __atomic_store_n(&hw->reset.schedule, SCHEDULE_REQUESTED, -+ -+ __atomic_store_n(&hw->reset.schedule, SCHEDULE_REQUESTED, - __ATOMIC_RELAXED); - - rte_eal_alarm_set(SWITCH_CONTEXT_US, hw->reset.ops->reset_service, hns); --- -2.23.0 - diff --git a/0373-net-hns3-remove-reset-log-in-secondary.patch b/0373-net-hns3-remove-reset-log-in-secondary.patch deleted file mode 100644 index adf8024..0000000 --- a/0373-net-hns3-remove-reset-log-in-secondary.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 0593fced9d1946d55c95c8dea448217f0867faff Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:43 +0800 -Subject: [PATCH 373/394] net/hns3: remove reset log in secondary - -[ upstream commit 5394df455749f60614a19d791d1d73c26b74dea1 ] - -The reset event is checked and done in primary. And the secondary -doesn't check and display reset log. There is a patch to remove the -check code for secondary. please see commit a8f1f7cf1b42 ("net/hns3: -fix crash when secondary process access FW") - -This patch removes the redundant log print of reset. - -Fixes: a8f1f7cf1b42 ("net/hns3: fix crash when secondary process access FW") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_ethdev.c | 11 +++++------ - drivers/net/hns3/hns3_ethdev_vf.c | 11 +++++------ - 2 files changed, 10 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index ad595478a7..185f211591 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5512,14 +5512,13 @@ hns3_is_reset_pending(struct hns3_adapter *hns) - enum hns3_reset_level reset; - - /* -- * Check the registers to confirm whether there is reset pending. -- * Note: This check may lead to schedule reset task, but only primary -- * process can process the reset event. Therefore, limit the -- * checking under only primary process. -+ * Only primary can process can process the reset event, -+ * so don't check reset event in secondary. - */ -- if (rte_eal_process_type() == RTE_PROC_PRIMARY) -- hns3_check_event_cause(hns, NULL); -+ if (rte_eal_process_type() != RTE_PROC_PRIMARY) -+ return false; - -+ hns3_check_event_cause(hns, NULL); - reset = hns3_get_reset_level(hns, &hw->reset.pending); - if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && - hw->reset.level < reset) { -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 02fb4a84cf..003071c6ff 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -1796,14 +1796,13 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns) - return false; - - /* -- * Check the registers to confirm whether there is reset pending. -- * Note: This check may lead to schedule reset task, but only primary -- * process can process the reset event. Therefore, limit the -- * checking under only primary process. -+ * Only primary can process can process the reset event, -+ * so don't check reset event in secondary. - */ -- if (rte_eal_process_type() == RTE_PROC_PRIMARY) -- hns3vf_check_event_cause(hns, NULL); -+ if (rte_eal_process_type() != RTE_PROC_PRIMARY) -+ return false; - -+ hns3vf_check_event_cause(hns, NULL); - reset = hns3vf_get_reset_level(hw, &hw->reset.pending); - if (hw->reset.level != HNS3_NONE_RESET && reset != HNS3_NONE_RESET && - hw->reset.level < reset) { --- -2.23.0 - diff --git a/0374-net-hns3-fix-multiple-reset-detected-log.patch b/0374-net-hns3-fix-multiple-reset-detected-log.patch deleted file mode 100644 index a42ddaf..0000000 --- a/0374-net-hns3-fix-multiple-reset-detected-log.patch +++ /dev/null @@ -1,165 +0,0 @@ -From c5628ce4a2c2203e172cd70e6d876bd215f650ed Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:44 +0800 -Subject: [PATCH 374/394] net/hns3: fix multiple reset detected log - -[ upstream commit 5be38fc6c0fc7e54d0121bab2fe93a27b8e8f7ab ] - -Currently, the driver proactively checks whether interrupt exist -(by checking reset registers), related reset delay task is scheduled. - -When a reset whose level is equal to or lower than the current level -is detected, there is unnecessary to add delay task and print logs. - -This patch fix it. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_ethdev.c | 64 ++++++++++++++++++++-------------- - 1 file changed, 37 insertions(+), 27 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 185f211591..8c96c8a964 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -124,42 +124,29 @@ hns3_pf_enable_irq0(struct hns3_hw *hw) - } - - static enum hns3_evt_cause --hns3_proc_imp_reset_event(struct hns3_adapter *hns, bool is_delay, -- uint32_t *vec_val) -+hns3_proc_imp_reset_event(struct hns3_adapter *hns, uint32_t *vec_val) - { - struct hns3_hw *hw = &hns->hw; - - __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); - hns3_atomic_set_bit(HNS3_IMP_RESET, &hw->reset.pending); - *vec_val = BIT(HNS3_VECTOR0_IMPRESET_INT_B); -- if (!is_delay) { -- hw->reset.stats.imp_cnt++; -- hns3_warn(hw, "IMP reset detected, clear reset status"); -- } else { -- hns3_schedule_delayed_reset(hns); -- hns3_warn(hw, "IMP reset detected, don't clear reset status"); -- } -+ hw->reset.stats.imp_cnt++; -+ hns3_warn(hw, "IMP reset detected, clear reset status"); - - return HNS3_VECTOR0_EVENT_RST; - } - - static enum hns3_evt_cause --hns3_proc_global_reset_event(struct hns3_adapter *hns, bool is_delay, -- uint32_t *vec_val) -+hns3_proc_global_reset_event(struct hns3_adapter *hns, uint32_t *vec_val) - { - struct hns3_hw *hw = &hns->hw; - - __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); - hns3_atomic_set_bit(HNS3_GLOBAL_RESET, &hw->reset.pending); - *vec_val = BIT(HNS3_VECTOR0_GLOBALRESET_INT_B); -- if (!is_delay) { -- hw->reset.stats.global_cnt++; -- hns3_warn(hw, "Global reset detected, clear reset status"); -- } else { -- hns3_schedule_delayed_reset(hns); -- hns3_warn(hw, -- "Global reset detected, don't clear reset status"); -- } -+ hw->reset.stats.global_cnt++; -+ hns3_warn(hw, "Global reset detected, clear reset status"); - - return HNS3_VECTOR0_EVENT_RST; - } -@@ -173,14 +160,12 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - uint32_t hw_err_src_reg; - uint32_t val; - enum hns3_evt_cause ret; -- bool is_delay; - - /* fetch the events from their corresponding regs */ - vector0_int_stats = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); - cmdq_src_val = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); - hw_err_src_reg = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); - -- is_delay = clearval == NULL ? true : false; - /* - * Assumption: If by any chance reset and mailbox events are reported - * together then we will only process reset event and defer the -@@ -189,13 +174,13 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - * from H/W just for the mailbox. - */ - if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_int_stats) { /* IMP */ -- ret = hns3_proc_imp_reset_event(hns, is_delay, &val); -+ ret = hns3_proc_imp_reset_event(hns, &val); - goto out; - } - - /* Global reset */ - if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_int_stats) { -- ret = hns3_proc_global_reset_event(hns, is_delay, &val); -+ ret = hns3_proc_global_reset_event(hns, &val); - goto out; - } - -@@ -224,10 +209,9 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - - val = vector0_int_stats; - ret = HNS3_VECTOR0_EVENT_OTHER; --out: - -- if (clearval) -- *clearval = val; -+out: -+ *clearval = val; - return ret; - } - -@@ -5505,6 +5489,32 @@ is_pf_reset_done(struct hns3_hw *hw) - return true; - } - -+static void -+hns3_detect_reset_event(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ enum hns3_reset_level new_req = HNS3_NONE_RESET; -+ enum hns3_reset_level last_req; -+ uint32_t vector0_intr_state; -+ -+ last_req = hns3_get_reset_level(hns, &hw->reset.pending); -+ vector0_intr_state = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -+ if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_intr_state) { -+ __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ hns3_atomic_set_bit(HNS3_IMP_RESET, &hw->reset.pending); -+ new_req = HNS3_IMP_RESET; -+ } else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_intr_state) { -+ __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ hns3_atomic_set_bit(HNS3_GLOBAL_RESET, &hw->reset.pending); -+ new_req = HNS3_GLOBAL_RESET; -+ } -+ -+ if (new_req != HNS3_NONE_RESET && last_req < new_req) { -+ hns3_schedule_delayed_reset(hns); -+ hns3_warn(hw, "High level reset detected, delay do reset"); -+ } -+} -+ - bool - hns3_is_reset_pending(struct hns3_adapter *hns) - { -@@ -5518,7 +5528,7 @@ hns3_is_reset_pending(struct hns3_adapter *hns) - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return false; - -- hns3_check_event_cause(hns, NULL); -+ hns3_detect_reset_event(hw); - reset = hns3_get_reset_level(hns, &hw->reset.pending); - if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && - hw->reset.level < reset) { --- -2.23.0 - diff --git a/0375-net-hns3-fix-IMP-or-global-reset.patch b/0375-net-hns3-fix-IMP-or-global-reset.patch deleted file mode 100644 index 6fe5638..0000000 --- a/0375-net-hns3-fix-IMP-or-global-reset.patch +++ /dev/null @@ -1,229 +0,0 @@ -From 2bf782a351fe9e5bd7155e5be9548fa2569aa6dc Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:45 +0800 -Subject: [PATCH 375/394] net/hns3: fix IMP or global reset - -[ upstream commit 1eee1ea75c0eadaea6dde368b289cf0acf6a1190 ] - -Currently, when the IMP or Global reset detected, the vector0 -interrupt is enabled before the reset process is completed. -At this moment, if the initialization of IMP is not completed, -and the vector0 interrupt may continue to be reported. In this -scenario, the IMP/global reset being performed by the driver -does not need to be interrupted. Therefore, for IMP and global -resets, the driver has to enable the interrupt after the end -of reset. - -The RAS interrupt is also shared with the vector0 interrupt. -When the interrupt is disabled, the RAS interrupt can still be -reported to the driver and the driver interrupt processing -function is also called. In this case, the interrupt status of -the IMP/global may still exist. Therefore, this patch also has -to the check of the new reset level based on the priority of -reset level in the interrupt handler. - -Fixes: 2790c6464725 ("net/hns3: support device reset") -Fixes: 3988ab0eee52 ("net/hns3: add abnormal interrupt process") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_ethdev.c | 88 ++++++++++++++++++++++++++++------ - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_intr.c | 2 + - 3 files changed, 77 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 8c96c8a964..0f201b8b99 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -215,6 +215,30 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - return ret; - } - -+void -+hns3_clear_reset_event(struct hns3_hw *hw) -+{ -+ uint32_t clearval = 0; -+ -+ switch (hw->reset.level) { -+ case HNS3_IMP_RESET: -+ clearval = BIT(HNS3_VECTOR0_IMPRESET_INT_B); -+ break; -+ case HNS3_GLOBAL_RESET: -+ clearval = BIT(HNS3_VECTOR0_GLOBALRESET_INT_B); -+ break; -+ default: -+ break; -+ } -+ -+ if (clearval == 0) -+ return; -+ -+ hns3_write_dev(hw, HNS3_MISC_RESET_STS_REG, clearval); -+ -+ hns3_pf_enable_irq0(hw); -+} -+ - static void - hns3_clear_event_cause(struct hns3_hw *hw, uint32_t event_type, uint32_t regclr) - { -@@ -287,6 +311,34 @@ hns3_delay_before_clear_event_cause(struct hns3_hw *hw, uint32_t event_type, uin - } - } - -+static bool -+hns3_reset_event_valid(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ enum hns3_reset_level new_req = HNS3_NONE_RESET; -+ enum hns3_reset_level last_req; -+ uint32_t vector0_int; -+ -+ vector0_int = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -+ if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_int) -+ new_req = HNS3_IMP_RESET; -+ else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_int) -+ new_req = HNS3_GLOBAL_RESET; -+ if (new_req == HNS3_NONE_RESET) -+ return true; -+ -+ last_req = hns3_get_reset_level(hns, &hw->reset.pending); -+ if (last_req == HNS3_NONE_RESET) -+ return true; -+ -+ if (new_req > last_req) -+ return true; -+ -+ hns3_warn(hw, "last_req (%u) less than or equal to new_req (%u) ignore", -+ last_req, new_req); -+ return false; -+} -+ - static void - hns3_interrupt_handler(void *param) - { -@@ -299,6 +351,9 @@ hns3_interrupt_handler(void *param) - uint32_t ras_int; - uint32_t cmdq_int; - -+ if (!hns3_reset_event_valid(hw)) -+ return; -+ - /* Disable interrupt */ - hns3_pf_disable_irq0(hw); - -@@ -327,7 +382,11 @@ hns3_interrupt_handler(void *param) - } - - /* Enable interrupt if it is not cause by reset */ -- hns3_pf_enable_irq0(hw); -+ if (event_cause == HNS3_VECTOR0_EVENT_ERR || -+ event_cause == HNS3_VECTOR0_EVENT_MBX || -+ event_cause == HNS3_VECTOR0_EVENT_PTP || -+ event_cause == HNS3_VECTOR0_EVENT_OTHER) -+ hns3_pf_enable_irq0(hw); - } - - static int -@@ -5489,7 +5548,7 @@ is_pf_reset_done(struct hns3_hw *hw) - return true; - } - --static void -+static enum hns3_reset_level - hns3_detect_reset_event(struct hns3_hw *hw) - { - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -@@ -5501,11 +5560,9 @@ hns3_detect_reset_event(struct hns3_hw *hw) - vector0_intr_state = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); - if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_intr_state) { - __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -- hns3_atomic_set_bit(HNS3_IMP_RESET, &hw->reset.pending); - new_req = HNS3_IMP_RESET; - } else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_intr_state) { - __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -- hns3_atomic_set_bit(HNS3_GLOBAL_RESET, &hw->reset.pending); - new_req = HNS3_GLOBAL_RESET; - } - -@@ -5513,13 +5570,16 @@ hns3_detect_reset_event(struct hns3_hw *hw) - hns3_schedule_delayed_reset(hns); - hns3_warn(hw, "High level reset detected, delay do reset"); - } -+ -+ return new_req; - } - - bool - hns3_is_reset_pending(struct hns3_adapter *hns) - { -+ enum hns3_reset_level new_req; - struct hns3_hw *hw = &hns->hw; -- enum hns3_reset_level reset; -+ enum hns3_reset_level last_req; - - /* - * Only primary can process can process the reset event, -@@ -5528,17 +5588,17 @@ hns3_is_reset_pending(struct hns3_adapter *hns) - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return false; - -- hns3_detect_reset_event(hw); -- reset = hns3_get_reset_level(hns, &hw->reset.pending); -- if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && -- hw->reset.level < reset) { -- hns3_warn(hw, "High level reset %d is pending", reset); -+ new_req = hns3_detect_reset_event(hw); -+ last_req = hns3_get_reset_level(hns, &hw->reset.pending); -+ if (last_req != HNS3_NONE_RESET && new_req != HNS3_NONE_RESET && -+ new_req < last_req) { -+ hns3_warn(hw, "High level reset %d is pending", last_req); - return true; - } -- reset = hns3_get_reset_level(hns, &hw->reset.request); -- if (reset != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && -- hw->reset.level < reset) { -- hns3_warn(hw, "High level reset %d is request", reset); -+ last_req = hns3_get_reset_level(hns, &hw->reset.request); -+ if (last_req != HNS3_NONE_RESET && hw->reset.level != HNS3_NONE_RESET && -+ hw->reset.level < last_req) { -+ hns3_warn(hw, "High level reset %d is request", last_req); - return true; - } - return false; -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index c85a6912ad..0e8d043704 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1033,6 +1033,7 @@ void hns3_update_linkstatus_and_event(struct hns3_hw *hw, bool query); - void hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status, - uint32_t link_speed, uint8_t link_duplex); - void hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported); -+void hns3_clear_reset_event(struct hns3_hw *hw); - - const char *hns3_get_media_type_name(uint8_t media_type); - -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 51711244b5..ce8a28e2f9 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -2727,6 +2727,7 @@ hns3_reset_post(struct hns3_adapter *hns) - /* IMP will wait ready flag before reset */ - hns3_notify_reset_ready(hw, false); - hns3_clear_reset_level(hw, &hw->reset.pending); -+ hns3_clear_reset_event(hw); - __atomic_store_n(&hns->hw.reset.resetting, 0, __ATOMIC_RELAXED); - hw->reset.attempts = 0; - hw->reset.stats.success_cnt++; -@@ -2775,6 +2776,7 @@ hns3_reset_fail_handle(struct hns3_adapter *hns) - struct timeval tv; - - hns3_clear_reset_level(hw, &hw->reset.pending); -+ hns3_clear_reset_event(hw); - if (hns3_reset_err_handle(hns)) { - hw->reset.stage = RESET_STAGE_PREWAIT; - hns3_schedule_reset(hns); --- -2.23.0 - diff --git a/0376-net-hns3-refactor-interrupt-state-query.patch b/0376-net-hns3-refactor-interrupt-state-query.patch deleted file mode 100644 index 9f34f32..0000000 --- a/0376-net-hns3-refactor-interrupt-state-query.patch +++ /dev/null @@ -1,165 +0,0 @@ -From 4828fd884f3d2abb70976414cc7a9e859001bb6d Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 27 Oct 2023 14:09:46 +0800 -Subject: [PATCH 376/394] net/hns3: refactor interrupt state query - -[ upstream commit c01ffb24a241a360361ed5c94a819824a8542f3f ] - -PF driver get all interrupt states by reading three registers. This logic -code block is distributed in many places. So this patch extracts a common -function to do this to improve the maintenance. - -Fixes: f53a793bb7c2 ("net/hns3: add more hardware error types") -Fixes: 3988ab0eee52 ("net/hns3: add abnormal interrupt process") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang ---- - drivers/net/hns3/hns3_ethdev.c | 57 +++++++++++++++++++--------------- - 1 file changed, 32 insertions(+), 25 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 0f201b8b99..9966748835 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -57,6 +57,12 @@ enum hns3_evt_cause { - HNS3_VECTOR0_EVENT_OTHER, - }; - -+struct hns3_intr_state { -+ uint32_t vector0_state; -+ uint32_t cmdq_state; -+ uint32_t hw_err_state; -+}; -+ - #define HNS3_SPEEDS_SUPP_FEC (RTE_ETH_LINK_SPEED_10G | \ - RTE_ETH_LINK_SPEED_25G | \ - RTE_ETH_LINK_SPEED_40G | \ -@@ -151,20 +157,23 @@ hns3_proc_global_reset_event(struct hns3_adapter *hns, uint32_t *vec_val) - return HNS3_VECTOR0_EVENT_RST; - } - -+static void -+hns3_query_intr_state(struct hns3_hw *hw, struct hns3_intr_state *state) -+{ -+ state->vector0_state = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -+ state->cmdq_state = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); -+ state->hw_err_state = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); -+} -+ - static enum hns3_evt_cause - hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - { - struct hns3_hw *hw = &hns->hw; -- uint32_t vector0_int_stats; -- uint32_t cmdq_src_val; -- uint32_t hw_err_src_reg; -+ struct hns3_intr_state state; - uint32_t val; - enum hns3_evt_cause ret; - -- /* fetch the events from their corresponding regs */ -- vector0_int_stats = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -- cmdq_src_val = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); -- hw_err_src_reg = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); -+ hns3_query_intr_state(hw, &state); - - /* - * Assumption: If by any chance reset and mailbox events are reported -@@ -173,41 +182,41 @@ hns3_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - * RX CMDQ event this time we would receive again another interrupt - * from H/W just for the mailbox. - */ -- if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_int_stats) { /* IMP */ -+ if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & state.vector0_state) { /* IMP */ - ret = hns3_proc_imp_reset_event(hns, &val); - goto out; - } - - /* Global reset */ -- if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_int_stats) { -+ if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & state.vector0_state) { - ret = hns3_proc_global_reset_event(hns, &val); - goto out; - } - - /* Check for vector0 1588 event source */ -- if (BIT(HNS3_VECTOR0_1588_INT_B) & vector0_int_stats) { -+ if (BIT(HNS3_VECTOR0_1588_INT_B) & state.vector0_state) { - val = BIT(HNS3_VECTOR0_1588_INT_B); - ret = HNS3_VECTOR0_EVENT_PTP; - goto out; - } - - /* check for vector0 msix event source */ -- if (vector0_int_stats & HNS3_VECTOR0_REG_MSIX_MASK || -- hw_err_src_reg & HNS3_RAS_REG_NFE_MASK) { -- val = vector0_int_stats | hw_err_src_reg; -+ if (state.vector0_state & HNS3_VECTOR0_REG_MSIX_MASK || -+ state.hw_err_state & HNS3_RAS_REG_NFE_MASK) { -+ val = state.vector0_state | state.hw_err_state; - ret = HNS3_VECTOR0_EVENT_ERR; - goto out; - } - - /* check for vector0 mailbox(=CMDQ RX) event source */ -- if (BIT(HNS3_VECTOR0_RX_CMDQ_INT_B) & cmdq_src_val) { -- cmdq_src_val &= ~BIT(HNS3_VECTOR0_RX_CMDQ_INT_B); -- val = cmdq_src_val; -+ if (BIT(HNS3_VECTOR0_RX_CMDQ_INT_B) & state.cmdq_state) { -+ state.cmdq_state &= ~BIT(HNS3_VECTOR0_RX_CMDQ_INT_B); -+ val = state.cmdq_state; - ret = HNS3_VECTOR0_EVENT_MBX; - goto out; - } - -- val = vector0_int_stats; -+ val = state.vector0_state; - ret = HNS3_VECTOR0_EVENT_OTHER; - - out: -@@ -346,10 +355,8 @@ hns3_interrupt_handler(void *param) - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - enum hns3_evt_cause event_cause; -+ struct hns3_intr_state state; - uint32_t clearval = 0; -- uint32_t vector0_int; -- uint32_t ras_int; -- uint32_t cmdq_int; - - if (!hns3_reset_event_valid(hw)) - return; -@@ -358,16 +365,15 @@ hns3_interrupt_handler(void *param) - hns3_pf_disable_irq0(hw); - - event_cause = hns3_check_event_cause(hns, &clearval); -- vector0_int = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -- ras_int = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); -- cmdq_int = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); -+ hns3_query_intr_state(hw, &state); - hns3_delay_before_clear_event_cause(hw, event_cause, clearval); - hns3_clear_event_cause(hw, event_cause, clearval); - /* vector 0 interrupt is shared with reset and mailbox source events. */ - if (event_cause == HNS3_VECTOR0_EVENT_ERR) { - hns3_warn(hw, "received interrupt: vector0_int_stat:0x%x " - "ras_int_stat:0x%x cmdq_int_stat:0x%x", -- vector0_int, ras_int, cmdq_int); -+ state.vector0_state, state.hw_err_state, -+ state.cmdq_state); - hns3_handle_mac_tnl(hw); - hns3_handle_error(hns); - } else if (event_cause == HNS3_VECTOR0_EVENT_RST) { -@@ -378,7 +384,8 @@ hns3_interrupt_handler(void *param) - } else if (event_cause != HNS3_VECTOR0_EVENT_PTP) { - hns3_warn(hw, "received unknown event: vector0_int_stat:0x%x " - "ras_int_stat:0x%x cmdq_int_stat:0x%x", -- vector0_int, ras_int, cmdq_int); -+ state.vector0_state, state.hw_err_state, -+ state.cmdq_state); - } - - /* Enable interrupt if it is not cause by reset */ --- -2.23.0 - diff --git a/0377-app-testpmd-ease-configuring-all-offloads.patch b/0377-app-testpmd-ease-configuring-all-offloads.patch deleted file mode 100644 index 5175ed7..0000000 --- a/0377-app-testpmd-ease-configuring-all-offloads.patch +++ /dev/null @@ -1,348 +0,0 @@ -From fecdbdc4f7b3b0abace40e5070ab9803c8de850d Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Mon, 23 Oct 2023 02:29:39 +0000 -Subject: [PATCH 377/394] app/testpmd: ease configuring all offloads - -[ upstream commit 8f6c2a1209c31b401d0a8fc74e4b98b1f2d599dc ] - -Extend supports all offload configuration in following commands: -1. port config 0 rx_offload all on/off -2. port config 0 tx_offload all on/off -3. port 0 rxq 0 rx_offload all on/off -4. port 0 txq 0 tx_offload all on/off - -Signed-off-by: Chengwen Feng -Acked-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 112 +++++++++++--------- - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +- - 2 files changed, 68 insertions(+), 52 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 8facca3c51..49152ec348 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -867,7 +867,7 @@ static void cmd_help_long_parsed(void *parsed_result, - "port config (port_id) udp_tunnel_port add|rm vxlan|geneve|ecpri (udp_port)\n\n" - " Add/remove UDP tunnel port for tunneling offload\n\n" - -- "port config rx_offload vlan_strip|" -+ "port config rx_offload all|vlan_strip|" - "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" - "outer_ipv4_cksum|macsec_strip|header_split|" - "vlan_filter|vlan_extend|scatter|" -@@ -875,7 +875,7 @@ static void cmd_help_long_parsed(void *parsed_result, - " Enable or disable a per port Rx offloading" - " on all Rx queues of a port\n\n" - -- "port (port_id) rxq (queue_id) rx_offload vlan_strip|" -+ "port (port_id) rxq (queue_id) rx_offload all|vlan_strip|" - "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" - "outer_ipv4_cksum|macsec_strip|header_split|" - "vlan_filter|vlan_extend|scatter|" -@@ -883,7 +883,7 @@ static void cmd_help_long_parsed(void *parsed_result, - " Enable or disable a per queue Rx offloading" - " only on a specific Rx queue\n\n" - -- "port config (port_id) tx_offload vlan_insert|" -+ "port config (port_id) tx_offload all|vlan_insert|" - "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|" - "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" - "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|" -@@ -892,7 +892,7 @@ static void cmd_help_long_parsed(void *parsed_result, - " Enable or disable a per port Tx offloading" - " on all Tx queues of a port\n\n" - -- "port (port_id) txq (queue_id) tx_offload vlan_insert|" -+ "port (port_id) txq (queue_id) tx_offload all|vlan_insert|" - "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|" - "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" - "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|macsec_insert" -@@ -16175,7 +16175,7 @@ cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_rx_offload = - cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload = - TOKEN_STRING_INITIALIZER - (struct cmd_config_per_port_rx_offload_result, -- offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" -+ offload, "all#vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" - "qinq_strip#outer_ipv4_cksum#macsec_strip#" - "header_split#vlan_filter#vlan_extend#" - "scatter#buffer_split#timestamp#security#" -@@ -16218,8 +16218,8 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result, - portid_t port_id = res->port_id; - struct rte_eth_dev_info dev_info; - struct rte_port *port = &ports[port_id]; -- uint64_t single_offload; - uint16_t nb_rx_queues; -+ uint64_t offload; - int q; - int ret; - -@@ -16230,25 +16230,29 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result, - return; - } - -- single_offload = search_rx_offload(res->offload); -- if (single_offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -- return; -- } -- - ret = eth_dev_info_get_print_err(port_id, &dev_info); - if (ret != 0) - return; - -+ if (!strcmp(res->offload, "all")) { -+ offload = dev_info.rx_offload_capa; -+ } else { -+ offload = search_rx_offload(res->offload); -+ if (offload == 0) { -+ fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ return; -+ } -+ } -+ - nb_rx_queues = dev_info.nb_rx_queues; - if (!strcmp(res->on_off, "on")) { -- port->dev_conf.rxmode.offloads |= single_offload; -+ port->dev_conf.rxmode.offloads |= offload; - for (q = 0; q < nb_rx_queues; q++) -- port->rx_conf[q].offloads |= single_offload; -+ port->rx_conf[q].offloads |= offload; - } else { -- port->dev_conf.rxmode.offloads &= ~single_offload; -+ port->dev_conf.rxmode.offloads &= ~offload; - for (q = 0; q < nb_rx_queues; q++) -- port->rx_conf[q].offloads &= ~single_offload; -+ port->rx_conf[q].offloads &= ~offload; - } - - cmd_reconfig_device_queue(port_id, 1, 1); -@@ -16257,7 +16261,7 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result, - cmdline_parse_inst_t cmd_config_per_port_rx_offload = { - .f = cmd_config_per_port_rx_offload_parsed, - .data = NULL, -- .help_str = "port config rx_offload vlan_strip|ipv4_cksum|" -+ .help_str = "port config rx_offload all|vlan_strip|ipv4_cksum|" - "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" - "macsec_strip|header_split|vlan_filter|vlan_extend|" - "scatter|buffer_split|timestamp|security|" -@@ -16307,7 +16311,7 @@ cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_rxoffload = - cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload = - TOKEN_STRING_INITIALIZER - (struct cmd_config_per_queue_rx_offload_result, -- offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" -+ offload, "all#vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" - "qinq_strip#outer_ipv4_cksum#macsec_strip#" - "header_split#vlan_filter#vlan_extend#" - "scatter#buffer_split#timestamp#security#keep_crc"); -@@ -16326,7 +16330,7 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result, - portid_t port_id = res->port_id; - uint16_t queue_id = res->queue_id; - struct rte_port *port = &ports[port_id]; -- uint64_t single_offload; -+ uint64_t offload; - int ret; - - if (port->port_status != RTE_PORT_STOPPED) { -@@ -16347,16 +16351,20 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result, - return; - } - -- single_offload = search_rx_offload(res->offload); -- if (single_offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -- return; -+ if (!strcmp(res->offload, "all")) { -+ offload = dev_info.rx_queue_offload_capa; -+ } else { -+ offload = search_rx_offload(res->offload); -+ if (offload == 0) { -+ fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ return; -+ } - } - - if (!strcmp(res->on_off, "on")) -- port->rx_conf[queue_id].offloads |= single_offload; -+ port->rx_conf[queue_id].offloads |= offload; - else -- port->rx_conf[queue_id].offloads &= ~single_offload; -+ port->rx_conf[queue_id].offloads &= ~offload; - - cmd_reconfig_device_queue(port_id, 1, 1); - } -@@ -16365,7 +16373,7 @@ cmdline_parse_inst_t cmd_config_per_queue_rx_offload = { - .f = cmd_config_per_queue_rx_offload_parsed, - .data = NULL, - .help_str = "port rxq rx_offload " -- "vlan_strip|ipv4_cksum|" -+ "all|vlan_strip|ipv4_cksum|" - "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" - "macsec_strip|header_split|vlan_filter|vlan_extend|" - "scatter|buffer_split|timestamp|security|" -@@ -16594,7 +16602,7 @@ cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_tx_offload = - cmdline_parse_token_string_t cmd_config_per_port_tx_offload_result_offload = - TOKEN_STRING_INITIALIZER - (struct cmd_config_per_port_tx_offload_result, -- offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" -+ offload, "all#vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" - "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#" - "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" - "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" -@@ -16641,8 +16649,8 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result, - portid_t port_id = res->port_id; - struct rte_eth_dev_info dev_info; - struct rte_port *port = &ports[port_id]; -- uint64_t single_offload; - uint16_t nb_tx_queues; -+ uint64_t offload; - int q; - int ret; - -@@ -16653,25 +16661,29 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result, - return; - } - -- single_offload = search_tx_offload(res->offload); -- if (single_offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -- return; -- } -- - ret = eth_dev_info_get_print_err(port_id, &dev_info); - if (ret != 0) - return; - -+ if (!strcmp(res->offload, "all")) { -+ offload = dev_info.tx_offload_capa; -+ } else { -+ offload = search_tx_offload(res->offload); -+ if (offload == 0) { -+ fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ return; -+ } -+ } -+ - nb_tx_queues = dev_info.nb_tx_queues; - if (!strcmp(res->on_off, "on")) { -- port->dev_conf.txmode.offloads |= single_offload; -+ port->dev_conf.txmode.offloads |= offload; - for (q = 0; q < nb_tx_queues; q++) -- port->tx_conf[q].offloads |= single_offload; -+ port->tx_conf[q].offloads |= offload; - } else { -- port->dev_conf.txmode.offloads &= ~single_offload; -+ port->dev_conf.txmode.offloads &= ~offload; - for (q = 0; q < nb_tx_queues; q++) -- port->tx_conf[q].offloads &= ~single_offload; -+ port->tx_conf[q].offloads &= ~offload; - } - - cmd_reconfig_device_queue(port_id, 1, 1); -@@ -16681,7 +16693,7 @@ cmdline_parse_inst_t cmd_config_per_port_tx_offload = { - .f = cmd_config_per_port_tx_offload_parsed, - .data = NULL, - .help_str = "port config tx_offload " -- "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" -+ "all|vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" - "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|" - "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" - "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" -@@ -16732,7 +16744,7 @@ cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_txoffload = - cmdline_parse_token_string_t cmd_config_per_queue_tx_offload_result_offload = - TOKEN_STRING_INITIALIZER - (struct cmd_config_per_queue_tx_offload_result, -- offload, "vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" -+ offload, "all#vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" - "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#" - "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" - "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" -@@ -16752,7 +16764,7 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result, - portid_t port_id = res->port_id; - uint16_t queue_id = res->queue_id; - struct rte_port *port = &ports[port_id]; -- uint64_t single_offload; -+ uint64_t offload; - int ret; - - if (port->port_status != RTE_PORT_STOPPED) { -@@ -16773,16 +16785,20 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result, - return; - } - -- single_offload = search_tx_offload(res->offload); -- if (single_offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -- return; -+ if (!strcmp(res->offload, "all")) { -+ offload = dev_info.tx_queue_offload_capa; -+ } else { -+ offload = search_tx_offload(res->offload); -+ if (offload == 0) { -+ fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ return; -+ } - } - - if (!strcmp(res->on_off, "on")) -- port->tx_conf[queue_id].offloads |= single_offload; -+ port->tx_conf[queue_id].offloads |= offload; - else -- port->tx_conf[queue_id].offloads &= ~single_offload; -+ port->tx_conf[queue_id].offloads &= ~offload; - - cmd_reconfig_device_queue(port_id, 1, 1); - } -@@ -16791,7 +16807,7 @@ cmdline_parse_inst_t cmd_config_per_queue_tx_offload = { - .f = cmd_config_per_queue_tx_offload_parsed, - .data = NULL, - .help_str = "port txq tx_offload " -- "vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" -+ "all|vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" - "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|" - "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" - "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index c33c8456bf..50c45db6f7 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -1772,7 +1772,7 @@ Enable or disable a per port Rx offloading on all Rx queues of a port:: - testpmd> port config (port_id) rx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: -- vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, -+ all, vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, - qinq_strip, outer_ipv4_cksum, macsec_strip, - header_split, vlan_filter, vlan_extend, scatter, timestamp, security, - keep_crc, rss_hash -@@ -1787,7 +1787,7 @@ Enable or disable a per queue Rx offloading only on a specific Rx queue:: - testpmd> port (port_id) rxq (queue_id) rx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: -- vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, -+ all, vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, - qinq_strip, outer_ipv4_cksum, macsec_strip, - header_split, vlan_filter, vlan_extend, scatter, timestamp, security, - keep_crc -@@ -1802,7 +1802,7 @@ Enable or disable a per port Tx offloading on all Tx queues of a port:: - testpmd> port config (port_id) tx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: -- vlan_insert, ipv4_cksum, udp_cksum, tcp_cksum, -+ all, vlan_insert, ipv4_cksum, udp_cksum, tcp_cksum, - sctp_cksum, tcp_tso, udp_tso, outer_ipv4_cksum, - qinq_insert, vxlan_tnl_tso, gre_tnl_tso, - ipip_tnl_tso, geneve_tnl_tso, macsec_insert, -@@ -1818,7 +1818,7 @@ Enable or disable a per queue Tx offloading only on a specific Tx queue:: - testpmd> port (port_id) txq (queue_id) tx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: -- vlan_insert, ipv4_cksum, udp_cksum, tcp_cksum, -+ all, vlan_insert, ipv4_cksum, udp_cksum, tcp_cksum, - sctp_cksum, tcp_tso, udp_tso, outer_ipv4_cksum, - qinq_insert, vxlan_tnl_tso, gre_tnl_tso, - ipip_tnl_tso, geneve_tnl_tso, macsec_insert, --- -2.23.0 - diff --git a/0378-net-hns3-fix-setting-DCB-capability.patch b/0378-net-hns3-fix-setting-DCB-capability.patch deleted file mode 100644 index 5cdf796..0000000 --- a/0378-net-hns3-fix-setting-DCB-capability.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 98fc655dcb21ac85c24a5f7f454a361ef37e2b07 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Oct 2023 20:23:54 +0800 -Subject: [PATCH 378/394] net/hns3: fix setting DCB capability - -[ upstream commit ac61c444e647298dded80a2ab52966a2dbe22b68 ] - -The "hw->capability" is set after querying firmware and version. -But the DCB capability of PF is set in other place. -So this patch moves setting DCB capability to the place where -all capabilities are set. - -Fixes: ab2e2e344163 ("net/hns3: get device capability in primary process") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_cmd.c | 25 +++++++++++++++++++++++++ - drivers/net/hns3/hns3_ethdev.c | 13 ------------- - 2 files changed, 25 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index ca1d3f1b8c..62c55f347f 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -525,6 +525,28 @@ hns3_build_api_caps(void) - return rte_cpu_to_le_32(api_caps); - } - -+static void -+hns3_set_dcb_capability(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ struct rte_pci_device *pci_dev; -+ struct rte_eth_dev *eth_dev; -+ uint16_t device_id; -+ -+ if (hns->is_vf) -+ return; -+ -+ eth_dev = &rte_eth_devices[hw->data->port_id]; -+ pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); -+ device_id = pci_dev->id.device_id; -+ -+ if (device_id == HNS3_DEV_ID_25GE_RDMA || -+ device_id == HNS3_DEV_ID_50GE_RDMA || -+ device_id == HNS3_DEV_ID_100G_RDMA_MACSEC || -+ device_id == HNS3_DEV_ID_200G_RDMA) -+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_DCB_B, 1); -+} -+ - static int - hns3_cmd_query_firmware_version_and_capability(struct hns3_hw *hw) - { -@@ -542,6 +564,9 @@ hns3_cmd_query_firmware_version_and_capability(struct hns3_hw *hw) - return ret; - - hw->fw_version = rte_le_to_cpu_32(resp->firmware); -+ -+ hns3_set_dcb_capability(hw); -+ - /* - * Make sure mask the capability before parse capability because it - * may overwrite resp's data. -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 9966748835..022696d204 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2719,22 +2719,9 @@ static int - hns3_get_capability(struct hns3_hw *hw) - { - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -- struct rte_pci_device *pci_dev; - struct hns3_pf *pf = &hns->pf; -- struct rte_eth_dev *eth_dev; -- uint16_t device_id; - int ret; - -- eth_dev = &rte_eth_devices[hw->data->port_id]; -- pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); -- device_id = pci_dev->id.device_id; -- -- if (device_id == HNS3_DEV_ID_25GE_RDMA || -- device_id == HNS3_DEV_ID_50GE_RDMA || -- device_id == HNS3_DEV_ID_100G_RDMA_MACSEC || -- device_id == HNS3_DEV_ID_200G_RDMA) -- hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_DCB_B, 1); -- - ret = hns3_get_pci_revision_id(hw, &hw->revision); - if (ret) - return ret; --- -2.23.0 - diff --git a/0379-net-hns3-fix-LRO-offload-to-report.patch b/0379-net-hns3-fix-LRO-offload-to-report.patch deleted file mode 100644 index d174f0d..0000000 --- a/0379-net-hns3-fix-LRO-offload-to-report.patch +++ /dev/null @@ -1,206 +0,0 @@ -From 607756d19e218e01a780551473e3f7c6f3851d45 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 31 Oct 2023 20:23:55 +0800 -Subject: [PATCH 379/394] net/hns3: fix LRO offload to report - -[ upstream commit a4b2c6815abd3e39daca2e2c93334b813e6a0be4 ] - -Some network engines, like part of HIP09, may not support LRO -offload, but this offload capability is also reported to user. -So this patch determines whether driver reports this capability -based on the capabilities from firmware. - -In addition, some network engines, like HIP08, always support LRO -offload and their firmware don't report this capability. So this -patch has to move getting revision ID codes to earlier stage and set -default capabilities for these network engines based on revision ID. - -Fixes: ab2e2e344163 ("net/hns3: get device capability in primary process") -Fixes: f5ed7d99cf45 ("net/hns3: extract common function to obtain revision ID") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_cmd.c | 17 ++++++++++++++++- - drivers/net/hns3/hns3_cmd.h | 1 + - drivers/net/hns3/hns3_common.c | 5 +++-- - drivers/net/hns3/hns3_dump.c | 3 ++- - drivers/net/hns3/hns3_ethdev.c | 8 ++++---- - drivers/net/hns3/hns3_ethdev.h | 1 + - drivers/net/hns3/hns3_ethdev_vf.c | 8 ++++---- - drivers/net/hns3/hns3_rxtx.c | 3 +++ - 8 files changed, 34 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index 62c55f347f..a5c4c11dc8 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -513,6 +513,8 @@ hns3_parse_capability(struct hns3_hw *hw, - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_TM_B, 1); - if (hns3_get_bit(caps, HNS3_CAPS_FC_AUTO_B)) - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FC_AUTO_B, 1); -+ if (hns3_get_bit(caps, HNS3_CAPS_GRO_B)) -+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_GRO_B, 1); - } - - static uint32_t -@@ -547,6 +549,19 @@ hns3_set_dcb_capability(struct hns3_hw *hw) - hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_DCB_B, 1); - } - -+static void -+hns3_set_default_capability(struct hns3_hw *hw) -+{ -+ hns3_set_dcb_capability(hw); -+ -+ /* -+ * The firmware of the network engines with HIP08 do not report some -+ * capabilities, like GRO. Set default capabilities for it. -+ */ -+ if (hw->revision < PCI_REVISION_ID_HIP09_A) -+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_GRO_B, 1); -+} -+ - static int - hns3_cmd_query_firmware_version_and_capability(struct hns3_hw *hw) - { -@@ -565,7 +580,7 @@ hns3_cmd_query_firmware_version_and_capability(struct hns3_hw *hw) - - hw->fw_version = rte_le_to_cpu_32(resp->firmware); - -- hns3_set_dcb_capability(hw); -+ hns3_set_default_capability(hw); - - /* - * Make sure mask the capability before parse capability because it -diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h -index 3f2bb4fd29..79a8c1edad 100644 ---- a/drivers/net/hns3/hns3_cmd.h -+++ b/drivers/net/hns3/hns3_cmd.h -@@ -323,6 +323,7 @@ enum HNS3_CAPS_BITS { - HNS3_CAPS_RAS_IMP_B, - HNS3_CAPS_RXD_ADV_LAYOUT_B = 15, - HNS3_CAPS_TM_B = 19, -+ HNS3_CAPS_GRO_B = 20, - HNS3_CAPS_FC_AUTO_B = 30, - }; - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 5dec62cbfb..6b1aeaa41b 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -70,8 +70,7 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - RTE_ETH_RX_OFFLOAD_SCATTER | - RTE_ETH_RX_OFFLOAD_VLAN_STRIP | - RTE_ETH_RX_OFFLOAD_VLAN_FILTER | -- RTE_ETH_RX_OFFLOAD_RSS_HASH | -- RTE_ETH_RX_OFFLOAD_TCP_LRO); -+ RTE_ETH_RX_OFFLOAD_RSS_HASH); - info->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | - RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | - RTE_ETH_TX_OFFLOAD_TCP_CKSUM | -@@ -99,6 +98,8 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - - if (hns3_dev_get_support(hw, PTP)) - info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; -+ if (hns3_dev_get_support(hw, GRO)) -+ info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TCP_LRO; - - info->rx_desc_lim = (struct rte_eth_desc_lim) { - .nb_max = HNS3_MAX_RING_DESC, -diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c -index b6e8b621f5..8d4c4d0a3b 100644 ---- a/drivers/net/hns3/hns3_dump.c -+++ b/drivers/net/hns3/hns3_dump.c -@@ -104,7 +104,8 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) - {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, - {HNS3_DEV_SUPPORT_TM_B, "TM"}, - {HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"}, -- {HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"} -+ {HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"}, -+ {HNS3_DEV_SUPPORT_GRO_B, "GRO"} - }; - uint32_t i; - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 022696d204..2d4af9f3ea 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -2722,10 +2722,6 @@ hns3_get_capability(struct hns3_hw *hw) - struct hns3_pf *pf = &hns->pf; - int ret; - -- ret = hns3_get_pci_revision_id(hw, &hw->revision); -- if (ret) -- return ret; -- - ret = hns3_query_mac_stats_reg_num(hw); - if (ret) - return ret; -@@ -4582,6 +4578,10 @@ hns3_init_pf(struct rte_eth_dev *eth_dev) - /* Get hardware io base address from pcie BAR2 IO space */ - hw->io_base = pci_dev->mem_resource[2].addr; - -+ ret = hns3_get_pci_revision_id(hw, &hw->revision); -+ if (ret) -+ return ret; -+ - /* Firmware command queue initialize */ - ret = hns3_cmd_init_queue(hw); - if (ret) { -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 0e8d043704..668f141e32 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -888,6 +888,7 @@ enum hns3_dev_cap { - HNS3_DEV_SUPPORT_TM_B, - HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, - HNS3_DEV_SUPPORT_FC_AUTO_B, -+ HNS3_DEV_SUPPORT_GRO_B, - }; - - #define hns3_dev_get_support(hw, _name) \ -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 003071c6ff..ba4fe13c01 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -762,10 +762,6 @@ hns3vf_get_capability(struct hns3_hw *hw) - { - int ret; - -- ret = hns3_get_pci_revision_id(hw, &hw->revision); -- if (ret) -- return ret; -- - if (hw->revision < PCI_REVISION_ID_HIP09_A) { - hns3_set_default_dev_specifications(hw); - hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE; -@@ -1418,6 +1414,10 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev) - /* Get hardware io base address from pcie BAR2 IO space */ - hw->io_base = pci_dev->mem_resource[2].addr; - -+ ret = hns3_get_pci_revision_id(hw, &hw->revision); -+ if (ret) -+ return ret; -+ - /* Firmware command queue initialize */ - ret = hns3_cmd_init_queue(hw); - if (ret) { -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 3054d24080..8b7c469685 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -3125,6 +3125,9 @@ hns3_config_gro(struct hns3_hw *hw, bool en) - struct hns3_cmd_desc desc; - int ret; - -+ if (!hns3_dev_get_support(hw, GRO)) -+ return 0; -+ - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_GRO_GENERIC_CONFIG, false); - req = (struct hns3_cfg_gro_status_cmd *)desc.data; - --- -2.23.0 - diff --git a/0380-net-hns3-fix-some-return-values.patch b/0380-net-hns3-fix-some-return-values.patch deleted file mode 100644 index fa44649..0000000 --- a/0380-net-hns3-fix-some-return-values.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 52f35192771e5a62412a5fcaebd0d694355efdfa Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Oct 2023 20:23:56 +0800 -Subject: [PATCH 380/394] net/hns3: fix some return values - -[ upstream commit 08159599978f7f7eb6c4aaed7c290e33b8bc3d64 ] - -1. Fix the return value of hns3_get_imissed_stats_num as 'uint16_t'. -2. Add some error check for return value. - -Fixes: fcba820d9b9e ("net/hns3: support flow director") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev_vf.c | 5 ++++- - drivers/net/hns3/hns3_fdir.c | 2 +- - drivers/net/hns3/hns3_stats.c | 15 ++++++++++----- - 3 files changed, 15 insertions(+), 7 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index ba4fe13c01..db1a30aff0 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -2162,8 +2162,11 @@ hns3vf_reinit_dev(struct hns3_adapter *hns) - */ - if (pci_dev->kdrv == RTE_PCI_KDRV_IGB_UIO || - pci_dev->kdrv == RTE_PCI_KDRV_UIO_GENERIC) { -- if (hns3vf_enable_msix(pci_dev, true)) -+ ret = hns3vf_enable_msix(pci_dev, true); -+ if (ret != 0) { - hns3_err(hw, "Failed to enable msix"); -+ return ret; -+ } - } - - rte_intr_enable(pci_dev->intr_handle); -diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c -index c80fa59e63..d100e58d10 100644 ---- a/drivers/net/hns3/hns3_fdir.c -+++ b/drivers/net/hns3/hns3_fdir.c -@@ -978,7 +978,7 @@ int hns3_fdir_filter_program(struct hns3_adapter *hns, - rule->key_conf.spec.src_port, - rule->key_conf.spec.dst_port, ret); - else -- hns3_remove_fdir_filter(hw, fdir_info, &rule->key_conf); -+ ret = hns3_remove_fdir_filter(hw, fdir_info, &rule->key_conf); - - return ret; - } -diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c -index c2e692a2c5..9a1e8935e5 100644 ---- a/drivers/net/hns3/hns3_stats.c -+++ b/drivers/net/hns3/hns3_stats.c -@@ -771,7 +771,7 @@ hns3_mac_stats_reset(struct hns3_hw *hw) - return 0; - } - --static int -+static uint16_t - hns3_get_imissed_stats_num(struct hns3_adapter *hns) - { - #define NO_IMISSED_STATS_NUM 0 -@@ -993,7 +993,7 @@ hns3_imissed_stats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; - struct hns3_rx_missed_stats *imissed_stats = &hw->imissed_stats; -- int imissed_stats_num; -+ uint16_t imissed_stats_num; - int cnt = *count; - char *addr; - uint16_t i; -@@ -1170,7 +1170,7 @@ hns3_imissed_stats_name_get(struct rte_eth_dev *dev, - { - struct hns3_adapter *hns = dev->data->dev_private; - uint32_t cnt = *count; -- int imissed_stats_num; -+ uint16_t imissed_stats_num; - uint16_t i; - - imissed_stats_num = hns3_get_imissed_stats_num(hns); -@@ -1539,8 +1539,13 @@ hns3_stats_init(struct hns3_hw *hw) - return ret; - } - -- if (!hns->is_vf) -- hns3_mac_stats_reset(hw); -+ if (!hns->is_vf) { -+ ret = hns3_mac_stats_reset(hw); -+ if (ret) { -+ hns3_err(hw, "reset mac stats failed, ret = %d", ret); -+ return ret; -+ } -+ } - - return hns3_tqp_stats_init(hw); - } --- -2.23.0 - diff --git a/0381-net-hns3-fix-some-error-logs.patch b/0381-net-hns3-fix-some-error-logs.patch deleted file mode 100644 index 4cf0251..0000000 --- a/0381-net-hns3-fix-some-error-logs.patch +++ /dev/null @@ -1,47 +0,0 @@ -From eacae1d1b2f0d8765dfa14839e88005d7e1eeb73 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Oct 2023 20:23:57 +0800 -Subject: [PATCH 381/394] net/hns3: fix some error logs - -[ upstream commit fdafdca875eafe36950542cbfbdb21b01b371081 ] - -This patch fixes some error log. - -Fixes: 62e3ccc2b94c ("net/hns3: support flow control") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_dcb.c | 2 +- - drivers/net/hns3/hns3_flow.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c -index 07b8c46a81..2831d3dc62 100644 ---- a/drivers/net/hns3/hns3_dcb.c -+++ b/drivers/net/hns3/hns3_dcb.c -@@ -1082,7 +1082,7 @@ hns3_dcb_map_cfg(struct hns3_hw *hw) - - ret = hns3_pg_to_pri_map(hw); - if (ret) { -- hns3_err(hw, "pri_to_pg mapping fail: %d", ret); -+ hns3_err(hw, "pg_to_pri mapping fail: %d", ret); - return ret; - } - -diff --git a/drivers/net/hns3/hns3_flow.c b/drivers/net/hns3/hns3_flow.c -index d5c9c22633..da17fa6e69 100644 ---- a/drivers/net/hns3/hns3_flow.c -+++ b/drivers/net/hns3/hns3_flow.c -@@ -927,7 +927,7 @@ hns3_parse_sctp(const struct rte_flow_item *item, struct hns3_fdir_rule *rule, - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM_MASK, - item, -- "Only support src & dst port in SCTP"); -+ "Only support src & dst port & v-tag in SCTP"); - if (sctp_mask->hdr.src_port) { - hns3_set_bit(rule->input_set, INNER_SRC_PORT, 1); - rule->key_conf.mask.src_port = --- -2.23.0 - diff --git a/0382-net-hns3-keep-set-get-algo-key-functions-local.patch b/0382-net-hns3-keep-set-get-algo-key-functions-local.patch deleted file mode 100644 index a733a55..0000000 --- a/0382-net-hns3-keep-set-get-algo-key-functions-local.patch +++ /dev/null @@ -1,61 +0,0 @@ -From fd44bf6577c48ed17419db18ef1a87620fa936ec Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Oct 2023 20:23:58 +0800 -Subject: [PATCH 382/394] net/hns3: keep set/get algo key functions local - -[ upstream commit 4d996f3b2a1dcce2fff59a0a9490c04480e4c805 ] - -The functions "hns3_rss_set_algo_key()" and "hns3_rss_get_algo_key()" -are the inner interfaces to set hardware. Driver already had an API, -"hns3_update_rss_algo_key()", to export and to update RSS algo or key. -So above two innter interface don't export. - -Fixes: 7da415d27d88 ("net/hns3: use hardware config to report hash key") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_rss.c | 4 ++-- - drivers/net/hns3/hns3_rss.h | 4 ---- - 2 files changed, 2 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 6126512bd7..9bb8426256 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -283,7 +283,7 @@ static const struct { - * rss_generic_config command function, opcode:0x0D01. - * Used to set algorithm and hash key of RSS. - */ --int -+static int - hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - const uint8_t *key, uint8_t key_len) - { -@@ -324,7 +324,7 @@ hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - return 0; - } - --int -+static int - hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, - uint8_t *key, uint8_t key_len) - { -diff --git a/drivers/net/hns3/hns3_rss.h b/drivers/net/hns3/hns3_rss.h -index 415430a399..9d182a8025 100644 ---- a/drivers/net/hns3/hns3_rss.h -+++ b/drivers/net/hns3/hns3_rss.h -@@ -190,10 +190,6 @@ bool hns3_check_rss_types_valid(struct hns3_hw *hw, uint64_t types); - int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf); - int hns3_set_rss_tuple_field(struct hns3_hw *hw, uint64_t tuple_fields); - int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields); --int hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, -- const uint8_t *key, uint8_t key_len); --int hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, -- uint8_t *key, uint8_t key_len); - uint64_t hns3_rss_calc_tuple_filed(uint64_t rss_hf); - int hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo, - uint8_t *key, uint8_t key_len); --- -2.23.0 - diff --git a/0383-net-hns3-fix-uninitialized-hash-algo-value.patch b/0383-net-hns3-fix-uninitialized-hash-algo-value.patch deleted file mode 100644 index c6f1e23..0000000 --- a/0383-net-hns3-fix-uninitialized-hash-algo-value.patch +++ /dev/null @@ -1,43 +0,0 @@ -From f99da9ff1fd939d98025625bca3986054f00592e Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 31 Oct 2023 20:23:59 +0800 -Subject: [PATCH 383/394] net/hns3: fix uninitialized hash algo value - -[ upstream commit 177cf5c93f9ac86d8a2b817115ef1e979023414c ] - -This patch initializes "hash_algo" as zero to avoid using -it uninitialized. - -Fixes: e3069658da9f ("net/hns3: reimplement hash flow function") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_rss.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index 9bb8426256..eeeca71a5c 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -771,7 +771,7 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - { - struct hns3_adapter *hns = dev->data->dev_private; - struct hns3_hw *hw = &hns->hw; -- uint8_t hash_algo; -+ uint8_t hash_algo = 0; - int ret; - - rte_spinlock_lock(&hw->lock); -@@ -993,7 +993,7 @@ hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_func, - { - uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - bool modify_key, modify_algo; -- uint8_t hash_algo; -+ uint8_t hash_algo = 0; - int ret; - - modify_key = (key != NULL && key_len > 0); --- -2.23.0 - diff --git a/0384-ethdev-clarify-RSS-related-fields-usage.patch b/0384-ethdev-clarify-RSS-related-fields-usage.patch deleted file mode 100644 index f0df0dd..0000000 --- a/0384-ethdev-clarify-RSS-related-fields-usage.patch +++ /dev/null @@ -1,159 +0,0 @@ -From e9c4dc9a6488e7dfccba0e24c9e8606beea7e91b Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:12 +0800 -Subject: [PATCH 384/394] ethdev: clarify RSS related fields usage - -[ upstream commit bae3cfa520a7205d63752c506d51e832d4944180 ] - -In rte_eth_dev_rss_hash_conf_get(), the "rss_key_len" should be -greater than or equal to the "hash_key_size" which get from -rte_eth_dev_info_get() API. And the "rss_key" should contain at -least "hash_key_size" bytes. If these requirements are not met, -the query unreliable. - -In rte_eth_dev_rss_hash_update() or rte_eth_dev_configure(), the -"rss_key_len" indicates the length of the "rss_key" in bytes of -the array pointed by "rss_key", it should be equal to the -"hash_key_size" if "rss_key" is not NULL. - -This patch overwrites the comments of fields of "rte_eth_rss_conf" -and "RTE_ETH_HASH_FUNCTION_DEFAULT", checks "rss_key_len" in -ethdev level, and documents these changes. - -Signed-off-by: Jie Hai -Acked-by: Huisong Li -Acked-by: Chengwen Feng -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 32 ++++++++++++++++++++++++++++++++ - lib/ethdev/rte_ethdev.h | 33 ++++++++++++++++++--------------- - lib/ethdev/rte_flow.h | 1 + - 3 files changed, 51 insertions(+), 15 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 132e3d8dc7..f8f111ba6d 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -1620,6 +1620,16 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, - goto rollback; - } - -+ if (dev_conf->rx_adv_conf.rss_conf.rss_key != NULL && -+ dev_conf->rx_adv_conf.rss_conf.rss_key_len != dev_info.hash_key_size) { -+ RTE_ETHDEV_LOG(ERR, -+ "Ethdev port_id=%u invalid RSS key len: %u, valid value: %u\n", -+ port_id, dev_conf->rx_adv_conf.rss_conf.rss_key_len, -+ dev_info.hash_key_size); -+ ret = -EINVAL; -+ goto rollback; -+ } -+ - /* - * Setup new number of Rx/Tx queues and reconfigure device. - */ -@@ -4205,6 +4215,14 @@ rte_eth_dev_rss_hash_update(uint16_t port_id, - return -ENOTSUP; - } - -+ if (rss_conf->rss_key != NULL && -+ rss_conf->rss_key_len != dev_info.hash_key_size) { -+ RTE_ETHDEV_LOG(ERR, -+ "Ethdev port_id=%u invalid RSS key len: %u, valid value: %u\n", -+ port_id, rss_conf->rss_key_len, dev_info.hash_key_size); -+ return -EINVAL; -+ } -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev, - rss_conf)); -@@ -4214,7 +4232,9 @@ int - rte_eth_dev_rss_hash_conf_get(uint16_t port_id, - struct rte_eth_rss_conf *rss_conf) - { -+ struct rte_eth_dev_info dev_info = { 0 }; - struct rte_eth_dev *dev; -+ int ret; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); - dev = &rte_eth_devices[port_id]; -@@ -4226,6 +4246,18 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id, - return -EINVAL; - } - -+ ret = rte_eth_dev_info_get(port_id, &dev_info); -+ if (ret != 0) -+ return ret; -+ -+ if (rss_conf->rss_key != NULL && -+ rss_conf->rss_key_len < dev_info.hash_key_size) { -+ RTE_ETHDEV_LOG(ERR, -+ "Ethdev port_id=%u invalid RSS key len: %u, should not be less than: %u\n", -+ port_id, rss_conf->rss_key_len, dev_info.hash_key_size); -+ return -EINVAL; -+ } -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_conf_get, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev, - rss_conf)); -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index c555ecb840..03799bafa9 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -506,24 +506,27 @@ struct rte_vlan_filter_conf { - /** - * A structure used to configure the Receive Side Scaling (RSS) feature - * of an Ethernet port. -- * If not NULL, the *rss_key* pointer of the *rss_conf* structure points -- * to an array holding the RSS key to use for hashing specific header -- * fields of received packets. The length of this array should be indicated -- * by *rss_key_len* below. Otherwise, a default random hash key is used by -- * the device driver. -- * -- * The *rss_key_len* field of the *rss_conf* structure indicates the length -- * in bytes of the array pointed by *rss_key*. To be compatible, this length -- * will be checked in i40e only. Others assume 40 bytes to be used as before. -- * -- * The *rss_hf* field of the *rss_conf* structure indicates the different -- * types of IPv4/IPv6 packets to which the RSS hashing must be applied. -- * Supplying an *rss_hf* equal to zero disables the RSS feature. - */ - struct rte_eth_rss_conf { -- uint8_t *rss_key; /**< If not NULL, 40-byte hash key. */ -+ /** -+ * In rte_eth_dev_rss_hash_conf_get(), the *rss_key_len* should be -+ * greater than or equal to the *hash_key_size* which get from -+ * rte_eth_dev_info_get() API. And the *rss_key* should contain at least -+ * *hash_key_size* bytes. If not meet these requirements, the query -+ * result is unreliable even if the operation returns success. -+ * -+ * In rte_eth_dev_rss_hash_update() or rte_eth_dev_configure(), if -+ * *rss_key* is not NULL, the *rss_key_len* indicates the length of the -+ * *rss_key* in bytes and it should be equal to *hash_key_size*. -+ * If *rss_key* is NULL, drivers are free to use a random or a default key. -+ */ -+ uint8_t *rss_key; - uint8_t rss_key_len; /**< hash key length in bytes. */ -- uint64_t rss_hf; /**< Hash functions to apply - see below. */ -+ /** -+ * Indicates the type of packets or the specific part of packets to -+ * which RSS hashing is to be applied. -+ */ -+ uint64_t rss_hf; - }; - - /* -diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h -index 1031fb246b..039d09e0a9 100644 ---- a/lib/ethdev/rte_flow.h -+++ b/lib/ethdev/rte_flow.h -@@ -2974,6 +2974,7 @@ struct rte_flow_query_count { - * Hash function types. - */ - enum rte_eth_hash_function { -+ /** DEFAULT means driver decides which hash algorithm to pick. */ - RTE_ETH_HASH_FUNCTION_DEFAULT = 0, - RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */ - RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */ --- -2.23.0 - diff --git a/0385-ethdev-set-and-query-RSS-hash-algorithm.patch b/0385-ethdev-set-and-query-RSS-hash-algorithm.patch deleted file mode 100644 index b8d6689..0000000 --- a/0385-ethdev-set-and-query-RSS-hash-algorithm.patch +++ /dev/null @@ -1,207 +0,0 @@ -From 597270b32229f1c39f29cd6b0d07203850bd975b Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:13 +0800 -Subject: [PATCH 385/394] ethdev: set and query RSS hash algorithm - -[ upstream commit 34ff088cc24159c9fa6e61242efb76d0289b4e37 ] - -Currently, rte_eth_rss_conf supports configuring and querying -RSS hash functions, rss key and it's length, but not RSS hash -algorithm. - -The structure ``rte_eth_dev_info`` is extended by adding a new -field "rss_algo_capa". Drivers are responsible for reporting this -capa and configurations of RSS hash algorithm can be verified based -on the capability. The default value of "rss_algo_capa" is -RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT) if drivers do not report it. - -The structure ``rte_eth_rss_conf`` is extended by adding a new -field "algorithm". This represents the RSS algorithms to apply. -If the value of "algorithm" used for configuration is a gibberish -value, drivers should report the error. - -To check whether the drivers report valid "algorithm", it is set -to default value before querying in rte_eth_dev_rss_hash_conf_get(). - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Huisong Li -Acked-by: Chengwen Feng -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 25 +++++++++++++++++++++++++ - lib/ethdev/rte_ethdev.h | 29 +++++++++++++++++++++++++++++ - lib/ethdev/rte_flow.c | 1 - - lib/ethdev/rte_flow.h | 19 ++----------------- - 4 files changed, 56 insertions(+), 18 deletions(-) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index f8f111ba6d..ec06bd3a9c 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -1422,6 +1422,7 @@ int - rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, - const struct rte_eth_conf *dev_conf) - { -+ enum rte_eth_hash_function algorithm; - struct rte_eth_dev *dev; - struct rte_eth_dev_info dev_info; - struct rte_eth_conf orig_conf; -@@ -1630,6 +1631,17 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, - goto rollback; - } - -+ algorithm = dev_conf->rx_adv_conf.rss_conf.algorithm; -+ if ((size_t)algorithm >= CHAR_BIT * sizeof(dev_info.rss_algo_capa) || -+ (dev_info.rss_algo_capa & RTE_ETH_HASH_ALGO_TO_CAPA(algorithm)) == 0) { -+ RTE_ETHDEV_LOG(ERR, -+ "Ethdev port_id=%u configured RSS hash algorithm (%u)" -+ "is not in the algorithm capability (0x%" PRIx32 ")\n", -+ port_id, algorithm, dev_info.rss_algo_capa); -+ ret = -EINVAL; -+ goto rollback; -+ } -+ - /* - * Setup new number of Rx/Tx queues and reconfigure device. - */ -@@ -3507,6 +3519,7 @@ rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info) - dev_info->min_mtu = RTE_ETHER_MIN_LEN - RTE_ETHER_HDR_LEN - - RTE_ETHER_CRC_LEN; - dev_info->max_mtu = UINT16_MAX; -+ dev_info->rss_algo_capa = RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT); - - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP); - diag = (*dev->dev_ops->dev_infos_get)(dev, dev_info); -@@ -4223,6 +4236,16 @@ rte_eth_dev_rss_hash_update(uint16_t port_id, - return -EINVAL; - } - -+ if ((size_t)rss_conf->algorithm >= CHAR_BIT * sizeof(dev_info.rss_algo_capa) || -+ (dev_info.rss_algo_capa & -+ RTE_ETH_HASH_ALGO_TO_CAPA(rss_conf->algorithm)) == 0) { -+ RTE_ETHDEV_LOG(ERR, -+ "Ethdev port_id=%u configured RSS hash algorithm (%u)" -+ "is not in the algorithm capability (0x%" PRIx32 ")\n", -+ port_id, rss_conf->algorithm, dev_info.rss_algo_capa); -+ return -EINVAL; -+ } -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev, - rss_conf)); -@@ -4258,6 +4281,8 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id, - return -EINVAL; - } - -+ rss_conf->algorithm = RTE_ETH_HASH_FUNCTION_DEFAULT; -+ - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_conf_get, -ENOTSUP); - return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev, - rss_conf)); -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 03799bafa9..911b9e03ab 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -503,6 +503,33 @@ struct rte_vlan_filter_conf { - uint64_t ids[64]; - }; - -+/** -+ * Hash function types. -+ */ -+enum rte_eth_hash_function { -+ /** DEFAULT means driver decides which hash algorithm to pick. */ -+ RTE_ETH_HASH_FUNCTION_DEFAULT = 0, -+ RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */ -+ RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */ -+ /** -+ * Symmetric Toeplitz: src, dst will be replaced by -+ * xor(src, dst). For the case with src/dst only, -+ * src or dst address will xor with zero pair. -+ */ -+ RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ, -+ /** -+ * Symmetric Toeplitz: L3 and L4 fields are sorted prior to -+ * the hash function. -+ * If src_ip > dst_ip, swap src_ip and dst_ip. -+ * If src_port > dst_port, swap src_port and dst_port. -+ */ -+ RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ_SORT, -+ RTE_ETH_HASH_FUNCTION_MAX, -+}; -+ -+#define RTE_ETH_HASH_ALGO_TO_CAPA(x) RTE_BIT32(x) -+#define RTE_ETH_HASH_ALGO_CAPA_MASK(x) RTE_BIT32(RTE_ETH_HASH_FUNCTION_ ## x) -+ - /** - * A structure used to configure the Receive Side Scaling (RSS) feature - * of an Ethernet port. -@@ -527,6 +554,7 @@ struct rte_eth_rss_conf { - * which RSS hashing is to be applied. - */ - uint64_t rss_hf; -+ enum rte_eth_hash_function algorithm; /**< Hash algorithm. */ - }; - - /* -@@ -1820,6 +1848,7 @@ struct rte_eth_dev_info { - /** Device redirection table size, the total number of entries. */ - uint16_t reta_size; - uint8_t hash_key_size; /**< Hash key size in bytes */ -+ uint32_t rss_algo_capa; /** RSS hash algorithms capabilities */ - /** Bit mask of RSS offloads, the bit offset also means flow type */ - uint64_t flow_type_rss_offloads; - struct rte_eth_rxconf default_rxconf; /**< Default Rx configuration */ -diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c -index a93f68abbc..e11c08baae 100644 ---- a/lib/ethdev/rte_flow.c -+++ b/lib/ethdev/rte_flow.c -@@ -14,7 +14,6 @@ - #include - #include - #include --#include "rte_ethdev.h" - #include "rte_flow_driver.h" - #include "rte_flow.h" - -diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h -index 039d09e0a9..d560cc7dcd 100644 ---- a/lib/ethdev/rte_flow.h -+++ b/lib/ethdev/rte_flow.h -@@ -38,6 +38,8 @@ - #include - #include - -+#include "rte_ethdev.h" -+ - #ifdef __cplusplus - extern "C" { - #endif -@@ -2970,23 +2972,6 @@ struct rte_flow_query_count { - uint64_t bytes; /**< Number of bytes through this rule [out]. */ - }; - --/** -- * Hash function types. -- */ --enum rte_eth_hash_function { -- /** DEFAULT means driver decides which hash algorithm to pick. */ -- RTE_ETH_HASH_FUNCTION_DEFAULT = 0, -- RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */ -- RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */ -- /** -- * Symmetric Toeplitz: src, dst will be replaced by -- * xor(src, dst). For the case with src/dst only, -- * src or dst address will xor with zero pair. -- */ -- RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ, -- RTE_ETH_HASH_FUNCTION_MAX, --}; -- - /** - * RTE_FLOW_ACTION_TYPE_RSS - * --- -2.23.0 - diff --git a/0386-net-hns3-report-RSS-hash-algorithms-capability.patch b/0386-net-hns3-report-RSS-hash-algorithms-capability.patch deleted file mode 100644 index a8bd21f..0000000 --- a/0386-net-hns3-report-RSS-hash-algorithms-capability.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 5c2aa37412339dac879a2c945262b840cbc627a2 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:14 +0800 -Subject: [PATCH 386/394] net/hns3: report RSS hash algorithms capability - -[ upstream commit 36b0b4fdeb64e92ffa8df617e8fdd3ed52923510 ] - -The hns3 driver should reports RSS hash algorithm capability -to support updating RSS hash algorithm by -rte_eth_dev_rss_hash_update() or rte_eth_dev_configure(). - -Signed-off-by: Jie Hai -Acked-by: Huisong Li -Acked-by: Chengwen Feng ---- - drivers/net/hns3/hns3_common.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 6b1aeaa41b..7a49f0d11d 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -133,6 +133,10 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - info->reta_size = hw->rss_ind_tbl_size; - info->hash_key_size = hw->rss_key_size; - info->flow_type_rss_offloads = HNS3_ETH_RSS_SUPPORT; -+ info->rss_algo_capa = RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT) | -+ RTE_ETH_HASH_ALGO_CAPA_MASK(TOEPLITZ) | -+ RTE_ETH_HASH_ALGO_CAPA_MASK(SIMPLE_XOR) | -+ RTE_ETH_HASH_ALGO_CAPA_MASK(SYMMETRIC_TOEPLITZ); - - info->default_rxportconf.burst_size = HNS3_DEFAULT_PORT_CONF_BURST_SIZE; - info->default_txportconf.burst_size = HNS3_DEFAULT_PORT_CONF_BURST_SIZE; --- -2.23.0 - diff --git a/0387-net-hns3-support-setting-and-querying-RSS-hash-function.patch b/0387-net-hns3-support-setting-and-querying-RSS-hash-function.patch deleted file mode 100644 index 4954976..0000000 --- a/0387-net-hns3-support-setting-and-querying-RSS-hash-function.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 551ff5a491295b17551d81f5c77a5167abc766fc Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Thu, 2 Nov 2023 16:20:15 +0800 -Subject: [PATCH 387/394] net/hns3: support setting and querying RSS hash - function - -[ upstream commit 9913a55d37f7a80c143de3c5eb4ba39f266291cb ] - -Support setting and querying RSS hash function by ethdev ops. - -Signed-off-by: Huisong Li -Signed-off-by: Dongdong Liu -Signed-off-by: Jie Hai -Acked-by: Chengwen Feng ---- - drivers/net/hns3/hns3_rss.c | 47 +++++++++++++++++++++---------------- - 1 file changed, 27 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c -index eeeca71a5c..15feb26043 100644 ---- a/drivers/net/hns3/hns3_rss.c -+++ b/drivers/net/hns3/hns3_rss.c -@@ -646,14 +646,14 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, - if (ret) - goto set_tuple_fail; - -- if (key) { -- ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, -- key, hw->rss_key_size); -- if (ret) -- goto set_algo_key_fail; -- /* Update the shadow RSS key with user specified */ -+ ret = hns3_update_rss_algo_key(hw, rss_conf->algorithm, key, key_len); -+ if (ret != 0) -+ goto set_algo_key_fail; -+ -+ if (rss_conf->algorithm != RTE_ETH_HASH_FUNCTION_DEFAULT) -+ hw->rss_info.hash_algo = hns3_hash_func_map[rss_conf->algorithm]; -+ if (key != NULL) - memcpy(hw->rss_info.key, key, hw->rss_key_size); -- } - hw->rss_info.rss_hf = rss_hf; - rte_spinlock_unlock(&hw->lock); - -@@ -769,7 +769,13 @@ int - hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - struct rte_eth_rss_conf *rss_conf) - { -+ const uint8_t hash_func_map[] = { -+ [HNS3_RSS_HASH_ALGO_TOEPLITZ] = RTE_ETH_HASH_FUNCTION_TOEPLITZ, -+ [HNS3_RSS_HASH_ALGO_SIMPLE] = RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, -+ [HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP] = RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ, -+ }; - struct hns3_adapter *hns = dev->data->dev_private; -+ uint8_t rss_key[HNS3_RSS_KEY_SIZE_MAX] = {0}; - struct hns3_hw *hw = &hns->hw; - uint8_t hash_algo = 0; - int ret; -@@ -777,26 +783,27 @@ hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, - rte_spinlock_lock(&hw->lock); - ret = hns3_rss_hash_get_rss_hf(hw, &rss_conf->rss_hf); - if (ret != 0) { -+ rte_spinlock_unlock(&hw->lock); - hns3_err(hw, "obtain hash tuples failed, ret = %d", ret); -- goto out; -+ return ret; -+ } -+ -+ ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_key, hw->rss_key_size); -+ if (ret != 0) { -+ rte_spinlock_unlock(&hw->lock); -+ hns3_err(hw, "obtain hash algo and key failed, ret = %d", ret); -+ return ret; - } -+ rte_spinlock_unlock(&hw->lock); - -- /* Get the RSS Key required by the user */ -+ /* Get the RSS Key if user required. */ - if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) { -- ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key, -- hw->rss_key_size); -- if (ret != 0) { -- hns3_err(hw, "obtain hash algo and key failed, ret = %d", -- ret); -- goto out; -- } -+ memcpy(rss_conf->rss_key, rss_key, hw->rss_key_size); - rss_conf->rss_key_len = hw->rss_key_size; - } -+ rss_conf->algorithm = hash_func_map[hash_algo]; - --out: -- rte_spinlock_unlock(&hw->lock); -- -- return ret; -+ return 0; - } - - /* --- -2.23.0 - diff --git a/0388-app-procinfo-fix-RSS-info.patch b/0388-app-procinfo-fix-RSS-info.patch deleted file mode 100644 index d689f2e..0000000 --- a/0388-app-procinfo-fix-RSS-info.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0984219ef3fb85833458c14cdd99d9918febb22b Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:16 +0800 -Subject: [PATCH 388/394] app/procinfo: fix RSS info - -[ upstream commit 33079eccf5c1a99af722fe168d8465f602bc98b2 ] - -Command show-port should show RSS info (rss_key, len and rss_hf), -However, the information is shown only when rss_conf.rss_key is not -NULL. Since no memory is allocated for rss_conf.rss_key, rss_key -will always be NULL and the rss_info will never show. This patch -fixes it. - -Fixes: 8a37f37fc243 ("app/procinfo: add --show-port") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan -Acked-by: Chengwen Feng -Acked-by: Huisong Li ---- - app/proc-info/main.c | 21 ++++++++++++--------- - 1 file changed, 12 insertions(+), 9 deletions(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index 0cc01e3dad..de7c3b4b27 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -132,6 +132,8 @@ struct desc_param { - static struct desc_param rx_desc_param; - static struct desc_param tx_desc_param; - -+#define RSS_HASH_KEY_SIZE 64 -+ - /* display usage */ - static void - proc_info_usage(const char *prgname) -@@ -823,6 +825,7 @@ show_port(void) - struct rte_eth_fc_conf fc_conf; - struct rte_ether_addr mac; - struct rte_eth_dev_owner owner; -+ uint8_t rss_key[RSS_HASH_KEY_SIZE]; - - /* Skip if port is not in mask */ - if ((enabled_port_mask & (1ul << i)) == 0) -@@ -981,17 +984,17 @@ show_port(void) - printf("\n"); - } - -+ rss_conf.rss_key = rss_key; -+ rss_conf.rss_key_len = dev_info.hash_key_size; - ret = rte_eth_dev_rss_hash_conf_get(i, &rss_conf); - if (ret == 0) { -- if (rss_conf.rss_key) { -- printf(" - RSS\n"); -- printf("\t -- RSS len %u key (hex):", -- rss_conf.rss_key_len); -- for (k = 0; k < rss_conf.rss_key_len; k++) -- printf(" %x", rss_conf.rss_key[k]); -- printf("\t -- hf 0x%"PRIx64"\n", -- rss_conf.rss_hf); -- } -+ printf(" - RSS\n"); -+ printf("\t -- RSS len %u key (hex):", -+ rss_conf.rss_key_len); -+ for (k = 0; k < rss_conf.rss_key_len; k++) -+ printf(" %x", rss_conf.rss_key[k]); -+ printf("\t -- hf 0x%"PRIx64"\n", -+ rss_conf.rss_hf); - } - - #ifdef RTE_LIB_SECURITY --- -2.23.0 - diff --git a/0389-app-procinfo-adjust-format-of-RSS-info.patch b/0389-app-procinfo-adjust-format-of-RSS-info.patch deleted file mode 100644 index 6d784dd..0000000 --- a/0389-app-procinfo-adjust-format-of-RSS-info.patch +++ /dev/null @@ -1,59 +0,0 @@ -From a70e268e9425c17da66e1063dc6d11a30b0a81bc Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:17 +0800 -Subject: [PATCH 389/394] app/procinfo: adjust format of RSS info - -[ upstream commit 66d4bacc39fb765051594669c33aab4f5d0f9d6c ] - -This patch splits the length and value of RSS key into two parts, -removes spaces between RSS keys, and adds line breaks between RSS -key and RSS hf. - -Before the adjustment, RSS info is shown as: - - RSS - -- RSS len 40 key (hex): 6d 5a 56 da 25 5b e c2 41 67 \ - 25 3d 43 a3 8f b0 d0 ca 2b cb ae 7b 30 b4 77 cb 2d \ - a3 80 30 f2 c 6a 42 b7 3b be ac 1 fa -- hf 0x0 -and after: - - RSS info - -- key len : 40 - -- key (hex) : 6d5a56da255b0ec24167253d43a38fb0d0c \ - a2bcbae7b30b477cb2da38030f20c6a42b73bbeac01fa - -- hash function : 0x0 - -Fixes: 8a37f37fc243 ("app/procinfo: add --show-port") -Cc: stable@dpdk.org - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan -Acked-by: Chengwen Feng ---- - app/proc-info/main.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index de7c3b4b27..55bfbcaa9c 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -988,12 +988,13 @@ show_port(void) - rss_conf.rss_key_len = dev_info.hash_key_size; - ret = rte_eth_dev_rss_hash_conf_get(i, &rss_conf); - if (ret == 0) { -- printf(" - RSS\n"); -- printf("\t -- RSS len %u key (hex):", -+ printf(" - RSS info\n"); -+ printf("\t -- key len : %u\n", - rss_conf.rss_key_len); -+ printf("\t -- key (hex) : "); - for (k = 0; k < rss_conf.rss_key_len; k++) -- printf(" %x", rss_conf.rss_key[k]); -- printf("\t -- hf 0x%"PRIx64"\n", -+ printf("%02x", rss_conf.rss_key[k]); -+ printf("\n\t -- hash function : 0x%"PRIx64"\n", - rss_conf.rss_hf); - } - --- -2.23.0 - diff --git a/0390-ethdev-get-RSS-algorithm-names.patch b/0390-ethdev-get-RSS-algorithm-names.patch deleted file mode 100644 index a4a0164..0000000 --- a/0390-ethdev-get-RSS-algorithm-names.patch +++ /dev/null @@ -1,284 +0,0 @@ -From 811392906150ad09a2502b1d40f87cf48faec751 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:18 +0800 -Subject: [PATCH 390/394] ethdev: get RSS algorithm names - -[ upstream commit 92628e2b04923c098128acdb173ab25953162ef8 ] - -This patch adds new API rte_eth_dev_rss_algo_name() to get -name of a RSS algorithm and document it. - -Example: - -testpmd> show port 0 rss-hash algorithm -RSS algorithm: - toeplitz - -Signed-off-by: Jie Hai -Acked-by: Huisong Li -Acked-by: Chengwen Feng -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 29 +++++++++++++++++---- - app/test-pmd/config.c | 29 +++++++-------------- - app/test-pmd/testpmd.h | 2 +- - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 4 +-- - lib/ethdev/rte_ethdev.c | 25 ++++++++++++++++++ - lib/ethdev/rte_ethdev.h | 16 ++++++++++++ - lib/ethdev/version.map | 3 +++ - 7 files changed, 81 insertions(+), 27 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 49152ec348..cdf943162b 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -174,8 +174,8 @@ static void cmd_help_long_parsed(void *parsed_result, - " by masks on port X. size is used to indicate the" - " hardware supported reta size\n\n" - -- "show port (port_id) rss-hash [key]\n" -- " Display the RSS hash functions and RSS hash key of port\n\n" -+ "show port (port_id) rss-hash [key | algorithm]\n" -+ " Display the RSS hash functions, RSS hash key and RSS hash algorithms of port\n\n" - - "clear port (info|stats|xstats|fdir) (port_id|all)\n" - " Clear information for port_id, or all.\n\n" -@@ -3150,15 +3150,17 @@ struct cmd_showport_rss_hash { - cmdline_fixed_string_t rss_hash; - cmdline_fixed_string_t rss_type; - cmdline_fixed_string_t key; /* optional argument */ -+ cmdline_fixed_string_t algorithm; /* optional argument */ - }; - - static void cmd_showport_rss_hash_parsed(void *parsed_result, - __rte_unused struct cmdline *cl, -- void *show_rss_key) -+ __rte_unused void *data) - { - struct cmd_showport_rss_hash *res = parsed_result; - -- port_rss_hash_conf_show(res->port_id, show_rss_key != NULL); -+ port_rss_hash_conf_show(res->port_id, -+ !strcmp(res->key, "key"), !strcmp(res->algorithm, "algorithm")); - } - - cmdline_parse_token_string_t cmd_showport_rss_hash_show = -@@ -3173,6 +3175,8 @@ cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash = - "rss-hash"); - cmdline_parse_token_string_t cmd_showport_rss_hash_rss_key = - TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, key, "key"); -+static cmdline_parse_token_string_t cmd_showport_rss_hash_rss_algo = -+ TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, algorithm, "algorithm"); - - cmdline_parse_inst_t cmd_showport_rss_hash = { - .f = cmd_showport_rss_hash_parsed, -@@ -3189,7 +3193,7 @@ cmdline_parse_inst_t cmd_showport_rss_hash = { - - cmdline_parse_inst_t cmd_showport_rss_hash_key = { - .f = cmd_showport_rss_hash_parsed, -- .data = (void *)1, -+ .data = NULL, - .help_str = "show port rss-hash key", - .tokens = { - (void *)&cmd_showport_rss_hash_show, -@@ -3201,6 +3205,20 @@ cmdline_parse_inst_t cmd_showport_rss_hash_key = { - }, - }; - -+static cmdline_parse_inst_t cmd_showport_rss_hash_algo = { -+ .f = cmd_showport_rss_hash_parsed, -+ .data = NULL, -+ .help_str = "show port rss-hash algorithm", -+ .tokens = { -+ (void *)&cmd_showport_rss_hash_show, -+ (void *)&cmd_showport_rss_hash_port, -+ (void *)&cmd_showport_rss_hash_port_id, -+ (void *)&cmd_showport_rss_hash_rss_hash, -+ (void *)&cmd_showport_rss_hash_rss_algo, -+ NULL, -+ }, -+}; -+ - /* *** Configure DCB *** */ - struct cmd_config_dcb { - cmdline_fixed_string_t port; -@@ -17899,6 +17917,7 @@ cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_tunnel_udp_config, - (cmdline_parse_inst_t *)&cmd_showport_rss_hash, - (cmdline_parse_inst_t *)&cmd_showport_rss_hash_key, -+ (cmdline_parse_inst_t *)&cmd_showport_rss_hash_algo, - (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, - (cmdline_parse_inst_t *)&cmd_cleanup_txq_mbufs, - (cmdline_parse_inst_t *)&cmd_dump, -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index af00078108..9d7b10548e 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -1636,24 +1636,7 @@ rss_config_display(struct rte_flow_action_rss *rss_conf) - printf(" %d", rss_conf->queue[i]); - printf("\n"); - -- printf(" function: "); -- switch (rss_conf->func) { -- case RTE_ETH_HASH_FUNCTION_DEFAULT: -- printf("default\n"); -- break; -- case RTE_ETH_HASH_FUNCTION_TOEPLITZ: -- printf("toeplitz\n"); -- break; -- case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: -- printf("simple_xor\n"); -- break; -- case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: -- printf("symmetric_toeplitz\n"); -- break; -- default: -- printf("Unknown function\n"); -- return; -- } -+ printf(" function: %s\n", rte_eth_dev_rss_algo_name(rss_conf->func)); - - printf(" RSS key:\n"); - if (rss_conf->key_len == 0) { -@@ -3077,7 +3060,7 @@ port_rss_reta_info(portid_t port_id, - * key of the port. - */ - void --port_rss_hash_conf_show(portid_t port_id, int show_rss_key) -+port_rss_hash_conf_show(portid_t port_id, int show_rss_key, int show_rss_algo) - { - struct rte_eth_rss_conf rss_conf = {0}; - uint8_t rss_key[RSS_HASH_KEY_LENGTH]; -@@ -3127,8 +3110,16 @@ port_rss_hash_conf_show(portid_t port_id, int show_rss_key) - printf("RSS disabled\n"); - return; - } -+ -+ if (show_rss_algo) { -+ printf("RSS algorithm:\n %s\n", -+ rte_eth_dev_rss_algo_name(rss_conf.algorithm)); -+ return; -+ } -+ - printf("RSS functions:\n"); - rss_types_display(rss_hf, TESTPMD_RSS_TYPES_CHAR_NUM_PER_LINE); -+ - if (!show_rss_key) - return; - printf("RSS key:\n"); -diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h -index 30c7177630..d19deeff4a 100644 ---- a/app/test-pmd/testpmd.h -+++ b/app/test-pmd/testpmd.h -@@ -1021,7 +1021,7 @@ int set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate); - int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate, - uint64_t q_msk); - --void port_rss_hash_conf_show(portid_t port_id, int show_rss_key); -+void port_rss_hash_conf_show(portid_t port_id, int show_rss_key, int show_rss_algo); - void port_rss_hash_key_update(portid_t port_id, char rss_type[], - uint8_t *hash_key, uint8_t hash_key_len); - int rx_queue_id_is_invalid(queueid_t rxq_id); -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index 50c45db6f7..a81296d2ba 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -233,9 +233,9 @@ size is used to indicate the hardware supported reta size - show port rss-hash - ~~~~~~~~~~~~~~~~~~ - --Display the RSS hash functions and RSS hash key of a port:: -+Display the RSS hash functions and RSS hash key or RSS hash algorithm of a port:: - -- testpmd> show port (port_id) rss-hash [key] -+ testpmd> show port (port_id) rss-hash [key | algorithm] - - clear port - ~~~~~~~~~~ -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index ec06bd3a9c..289fe45e6c 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -196,6 +196,17 @@ enum { - STAT_QMAP_RX - }; - -+static const struct { -+ enum rte_eth_hash_function algo; -+ const char *name; -+} rte_eth_dev_rss_algo_names[] = { -+ {RTE_ETH_HASH_FUNCTION_DEFAULT, "default"}, -+ {RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, "simple_xor"}, -+ {RTE_ETH_HASH_FUNCTION_TOEPLITZ, "toeplitz"}, -+ {RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ, "symmetric_toeplitz"}, -+ {RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ_SORT, "symmetric_toeplitz_sort"}, -+}; -+ - int - rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str) - { -@@ -4288,6 +4299,20 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id, - rss_conf)); - } - -+const char * -+rte_eth_dev_rss_algo_name(enum rte_eth_hash_function rss_algo) -+{ -+ const char *name = "Unknown function"; -+ unsigned int i; -+ -+ for (i = 0; i < RTE_DIM(rte_eth_dev_rss_algo_names); i++) { -+ if (rss_algo == rte_eth_dev_rss_algo_names[i].algo) -+ return rte_eth_dev_rss_algo_names[i].name; -+ } -+ -+ return name; -+} -+ - int - rte_eth_dev_udp_tunnel_port_add(uint16_t port_id, - struct rte_eth_udp_tunnel *udp_tunnel) -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 911b9e03ab..09a546a48b 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -4396,6 +4396,22 @@ int - rte_eth_dev_rss_hash_conf_get(uint16_t port_id, - struct rte_eth_rss_conf *rss_conf); - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice. -+ * -+ * Get the name of RSS hash algorithm. -+ * -+ * @param rss_algo -+ * Hash algorithm. -+ * -+ * @return -+ * Hash algorithm name or 'UNKNOWN' if the rss_algo cannot be recognized. -+ */ -+__rte_experimental -+const char * -+rte_eth_dev_rss_algo_name(enum rte_eth_hash_function rss_algo); -+ - /** - * Add UDP tunneling port for a type of tunnel. - * -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index f593f64ea9..1867016054 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -265,6 +265,9 @@ EXPERIMENTAL { - rte_eth_tx_descriptor_dump; - rte_eth_dev_is_valid_rxq; - rte_eth_dev_is_valid_txq; -+ -+ # added in 23.11 -+ rte_eth_dev_rss_algo_name; - }; - - INTERNAL { --- -2.23.0 - diff --git a/0391-app-procinfo-show-RSS-hash-algorithm.patch b/0391-app-procinfo-show-RSS-hash-algorithm.patch deleted file mode 100644 index a200204..0000000 --- a/0391-app-procinfo-show-RSS-hash-algorithm.patch +++ /dev/null @@ -1,36 +0,0 @@ -From fdf0043acae2d1df5aff874133c92ff224ad3de1 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 2 Nov 2023 16:20:19 +0800 -Subject: [PATCH 391/394] app/procinfo: show RSS hash algorithm - -[ upstream commit 130c5a4ba0ca06c921f8a5b52b43e469250a3ea8 ] - -Display RSS hash algorithm with command show-port as below. - - RSS info - -- hash algorithm : toeplitz - -Signed-off-by: Jie Hai -Signed-off-by: Dongdong Liu -Acked-by: Reshma Pattan -Acked-by: Huisong Li -Acked-by: Chengwen Feng ---- - app/proc-info/main.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/app/proc-info/main.c b/app/proc-info/main.c -index 55bfbcaa9c..d2f78278d5 100644 ---- a/app/proc-info/main.c -+++ b/app/proc-info/main.c -@@ -996,6 +996,8 @@ show_port(void) - printf("%02x", rss_conf.rss_key[k]); - printf("\n\t -- hash function : 0x%"PRIx64"\n", - rss_conf.rss_hf); -+ printf("\t -- hash algorithm : %s\n", -+ rte_eth_dev_rss_algo_name(rss_conf.algorithm)); - } - - #ifdef RTE_LIB_SECURITY --- -2.23.0 - diff --git a/0392-ethdev-add-maximum-Rx-buffer-size.patch b/0392-ethdev-add-maximum-Rx-buffer-size.patch deleted file mode 100644 index 96c294a..0000000 --- a/0392-ethdev-add-maximum-Rx-buffer-size.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 5e315791df0bcdaa3383e14e7b93a5297fe0b49e Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 3 Nov 2023 18:27:57 +0800 -Subject: [PATCH 392/394] ethdev: add maximum Rx buffer size -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -[ upstream commit 75c7849a9dcca356985fdb87f2d11cae135dfb1a ] - -The "min_rx_bufsize" in struct rte_eth_dev_info stands for the minimum -Rx buffer size supported by hardware. Actually, some engines also have -the maximum Rx buffer specification, like, hns3, i40e and so on. If mbuf -data room size in mempool is greater then the maximum Rx buffer size -per descriptor supported by HW, the data size application used in each -mbuf is just as much as the maximum Rx buffer size instead of the whole -data room size. - -So introduce maximum Rx buffer size which is not enforced just to -report user to avoid memory waste. In addition, fix the comment for -the "min_rx_bufsize" to make it be more specific. - -Signed-off-by: Huisong Li -Acked-by: Chengwen Feng -Acked-by: Morten Brørup -Acked-by: Ferruh Yigit ---- - app/test-pmd/config.c | 2 ++ - lib/ethdev/rte_ethdev.c | 8 ++++++++ - lib/ethdev/rte_ethdev.h | 10 +++++++++- - 3 files changed, 19 insertions(+), 1 deletion(-) - -diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index 9d7b10548e..fbb0cabf3d 100644 ---- a/app/test-pmd/config.c -+++ b/app/test-pmd/config.c -@@ -848,6 +848,8 @@ port_infos_display(portid_t port_id) - } - - printf("Minimum size of RX buffer: %u\n", dev_info.min_rx_bufsize); -+ if (dev_info.max_rx_bufsize != UINT32_MAX) -+ printf("Maximum size of RX buffer: %u\n", dev_info.max_rx_bufsize); - printf("Maximum configurable length of RX packet: %u\n", - dev_info.max_rx_pktlen); - printf("Maximum configurable size of LRO aggregated packet: %u\n", -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 289fe45e6c..4702515240 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -2126,6 +2126,7 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id, - struct rte_eth_dev *dev; - struct rte_eth_dev_info dev_info; - struct rte_eth_rxconf local_conf; -+ uint32_t buf_data_size; - - RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); - dev = &rte_eth_devices[port_id]; -@@ -2162,6 +2163,12 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id, - return -ENOSPC; - } - mbp_buf_size = rte_pktmbuf_data_room_size(mp); -+ buf_data_size = mbp_buf_size - RTE_PKTMBUF_HEADROOM; -+ if (buf_data_size > dev_info.max_rx_bufsize) -+ RTE_ETHDEV_LOG(DEBUG, -+ "For port_id=%u, the mbuf data buffer size (%u) is bigger than " -+ "max buffer size (%u) device can utilize, so mbuf size can be reduced.\n", -+ port_id, buf_data_size, dev_info.max_rx_bufsize); - if (mbp_buf_size < dev_info.min_rx_bufsize + - RTE_PKTMBUF_HEADROOM) { - RTE_ETHDEV_LOG(ERR, -@@ -3531,6 +3538,7 @@ rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info) - RTE_ETHER_CRC_LEN; - dev_info->max_mtu = UINT16_MAX; - dev_info->rss_algo_capa = RTE_ETH_HASH_ALGO_CAPA_MASK(DEFAULT); -+ dev_info->max_rx_bufsize = UINT32_MAX; - - RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP); - diag = (*dev->dev_ops->dev_infos_get)(dev, dev_info); -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 09a546a48b..2880a55890 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -1825,7 +1825,15 @@ struct rte_eth_dev_info { - uint16_t min_mtu; /**< Minimum MTU allowed */ - uint16_t max_mtu; /**< Maximum MTU allowed */ - const uint32_t *dev_flags; /**< Device flags */ -- uint32_t min_rx_bufsize; /**< Minimum size of Rx buffer. */ -+ /** Minimum Rx buffer size per descriptor supported by HW. */ -+ uint32_t min_rx_bufsize; -+ /** -+ * Maximum Rx buffer size per descriptor supported by HW. -+ * The value is not enforced, information only to application to -+ * optimize mbuf size. -+ * Its value is UINT32_MAX when not specified by the driver. -+ */ -+ uint32_t max_rx_bufsize; - uint32_t max_rx_pktlen; /**< Maximum configurable length of Rx pkt. */ - /** Maximum configurable size of LRO aggregated packet. */ - uint32_t max_lro_pkt_size; --- -2.23.0 - diff --git a/0393-net-hns3-report-maximum-buffer-size.patch b/0393-net-hns3-report-maximum-buffer-size.patch deleted file mode 100644 index b651a6e..0000000 --- a/0393-net-hns3-report-maximum-buffer-size.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 51ce4165992b99416a89951c403b9ed1907ff67c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 3 Nov 2023 18:27:59 +0800 -Subject: [PATCH 393/394] net/hns3: report maximum buffer size - -[ upstream commit a276af95fa52ea4e97d173f6f0afe6cdec6949ba ] - -This patch reports the maximum buffer size hardware supported. - -Signed-off-by: Huisong Li -Acked-by: Chengwen Feng ---- - drivers/net/hns3/hns3_common.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 7a49f0d11d..0d6b2c65af 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -59,6 +59,7 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - info->max_tx_queues = hw->tqps_num; - info->max_rx_pktlen = HNS3_MAX_FRAME_LEN; /* CRC included */ - info->min_rx_bufsize = HNS3_MIN_BD_BUF_SIZE; -+ info->max_rx_bufsize = HNS3_MAX_BD_BUF_SIZE; - info->max_mtu = info->max_rx_pktlen - HNS3_ETH_OVERHEAD; - info->max_lro_pkt_size = HNS3_MAX_LRO_SIZE; - info->rx_offload_capa = (RTE_ETH_RX_OFFLOAD_IPV4_CKSUM | --- -2.23.0 - diff --git a/0394-net-hns3-fix-mailbox-sync.patch b/0394-net-hns3-fix-mailbox-sync.patch deleted file mode 100644 index ab56e39..0000000 --- a/0394-net-hns3-fix-mailbox-sync.patch +++ /dev/null @@ -1,250 +0,0 @@ -From fc4a8dfe7b91702f2930957840a51796ffb12c2d Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Sat, 11 Nov 2023 09:59:14 +0800 -Subject: [PATCH 394/394] net/hns3: fix mailbox sync - -[ upstream commit be3590f54d0e415c23d4ed6ea55d967139c3ad10 ] - -Currently, hns3 VF driver uses the following points to match -the response and request message for the mailbox synchronous -message between VF and PF. -1. req_msg_data which is consist of message code and subcode, - is used to match request and response. -2. head means the number of send success for VF. -3. tail means the number of receive success for VF. -4. lost means the number of send timeout for VF. -And 'head', 'tail' and 'lost' are dynamically updated during -the communication. - -Now there is a issue that all sync mailbox message will -send failure forever at the flollowing case: -1. VF sends the message A - then head=UINT32_MAX-1, tail=UINT32_MAX-3, lost=2. -2. VF sends the message B - then head=UINT32_MAX, tail=UINT32_MAX-2, lost=2. -3. VF sends the message C, the message will be timeout because - it can't get the response within 500ms. - then head=0, tail=0, lost=2 - note: tail is assigned to head if tail > head according to - current code logic. From now on, all subsequent sync milbox - messages fail to be sent. - -It's very complicated to use the fields 'lost','tail','head'. -The code and subcode of the request sync mailbox are used as the -matching code of the message, which is used to match the response -message for receiving the synchronization response. - -This patch drops these fields and uses the following solution -to solve this issue: -In the handling response message process, using the req_msg_data -of the request and response message to judge whether the sync -mailbox message has been received. - -Fixes: 463e748964f5 ("net/hns3: support mailbox") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai -Acked-by: Huisong Li ---- - drivers/net/hns3/hns3_cmd.c | 3 -- - drivers/net/hns3/hns3_mbx.c | 81 ++++++------------------------------- - drivers/net/hns3/hns3_mbx.h | 10 ----- - 3 files changed, 13 insertions(+), 81 deletions(-) - -diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c -index a5c4c11dc8..2c1664485b 100644 ---- a/drivers/net/hns3/hns3_cmd.c -+++ b/drivers/net/hns3/hns3_cmd.c -@@ -731,9 +731,6 @@ hns3_cmd_init(struct hns3_hw *hw) - hw->cmq.csq.next_to_use = 0; - hw->cmq.crq.next_to_clean = 0; - hw->cmq.crq.next_to_use = 0; -- hw->mbx_resp.head = 0; -- hw->mbx_resp.tail = 0; -- hw->mbx_resp.lost = 0; - hns3_cmd_init_regs(hw); - - rte_spinlock_unlock(&hw->cmq.crq.lock); -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index 8e0a58aa02..f1743c195e 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -40,23 +40,6 @@ hns3_resp_to_errno(uint16_t resp_code) - return -EIO; - } - --static void --hns3_mbx_proc_timeout(struct hns3_hw *hw, uint16_t code, uint16_t subcode) --{ -- if (hw->mbx_resp.matching_scheme == -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL) { -- hw->mbx_resp.lost++; -- hns3_err(hw, -- "VF could not get mbx(%u,%u) head(%u) tail(%u) " -- "lost(%u) from PF", -- code, subcode, hw->mbx_resp.head, hw->mbx_resp.tail, -- hw->mbx_resp.lost); -- return; -- } -- -- hns3_err(hw, "VF could not get mbx(%u,%u) from PF", code, subcode); --} -- - static int - hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - uint8_t *resp_data, uint16_t resp_len) -@@ -67,7 +50,6 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct hns3_mbx_resp_status *mbx_resp; - uint32_t wait_time = 0; -- bool received; - - if (resp_len > HNS3_MBX_MAX_RESP_DATA_SIZE) { - hns3_err(hw, "VF mbx response len(=%u) exceeds maximum(=%d)", -@@ -93,20 +75,14 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - hns3_dev_handle_mbx_msg(hw); - rte_delay_us(HNS3_WAIT_RESP_US); - -- if (hw->mbx_resp.matching_scheme == -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL) -- received = (hw->mbx_resp.head == -- hw->mbx_resp.tail + hw->mbx_resp.lost); -- else -- received = hw->mbx_resp.received_match_resp; -- if (received) -+ if (hw->mbx_resp.received_match_resp) - break; - - wait_time += HNS3_WAIT_RESP_US; - } - hw->mbx_resp.req_msg_data = 0; - if (wait_time >= mbx_time_limit) { -- hns3_mbx_proc_timeout(hw, code, subcode); -+ hns3_err(hw, "VF could not get mbx(%u,%u) from PF", code, subcode); - return -ETIME; - } - rte_io_rmb(); -@@ -132,7 +108,6 @@ hns3_mbx_prepare_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode) - * we get the exact scheme which is used. - */ - hw->mbx_resp.req_msg_data = (uint32_t)code << 16 | subcode; -- hw->mbx_resp.head++; - - /* Update match_id and ensure the value of match_id is not zero */ - hw->mbx_resp.match_id++; -@@ -185,7 +160,6 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - req->match_id = hw->mbx_resp.match_id; - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { -- hw->mbx_resp.head--; - rte_spinlock_unlock(&hw->mbx_resp.lock); - hns3_err(hw, "VF failed(=%d) to send mbx message to PF", - ret); -@@ -254,41 +228,10 @@ hns3_handle_asserting_reset(struct hns3_hw *hw, - hns3_schedule_reset(HNS3_DEV_HW_TO_ADAPTER(hw)); - } - --/* -- * Case1: receive response after timeout, req_msg_data -- * is 0, not equal resp_msg, do lost-- -- * Case2: receive last response during new send_mbx_msg, -- * req_msg_data is different with resp_msg, let -- * lost--, continue to wait for response. -- */ --static void --hns3_update_resp_position(struct hns3_hw *hw, uint32_t resp_msg) --{ -- struct hns3_mbx_resp_status *resp = &hw->mbx_resp; -- uint32_t tail = resp->tail + 1; -- -- if (tail > resp->head) -- tail = resp->head; -- if (resp->req_msg_data != resp_msg) { -- if (resp->lost) -- resp->lost--; -- hns3_warn(hw, "Received a mismatched response req_msg(%x) " -- "resp_msg(%x) head(%u) tail(%u) lost(%u)", -- resp->req_msg_data, resp_msg, resp->head, tail, -- resp->lost); -- } else if (tail + resp->lost > resp->head) { -- resp->lost--; -- hns3_warn(hw, "Received a new response again resp_msg(%x) " -- "head(%u) tail(%u) lost(%u)", resp_msg, -- resp->head, tail, resp->lost); -- } -- rte_io_wmb(); -- resp->tail = tail; --} -- - static void - hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - { -+#define HNS3_MBX_RESP_CODE_OFFSET 16 - struct hns3_mbx_resp_status *resp = &hw->mbx_resp; - uint32_t msg_data; - -@@ -298,12 +241,6 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - * match_id to its response. So VF could use the match_id - * to match the request. - */ -- if (resp->matching_scheme != -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID) { -- resp->matching_scheme = -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID; -- hns3_info(hw, "detect mailbox support match id!"); -- } - if (req->match_id == resp->match_id) { - resp->resp_status = hns3_resp_to_errno(req->msg[3]); - memcpy(resp->additional_info, &req->msg[4], -@@ -319,11 +256,19 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - * support copy request's match_id to its response. So VF follows the - * original scheme to process. - */ -+ msg_data = (uint32_t)req->msg[1] << HNS3_MBX_RESP_CODE_OFFSET | req->msg[2]; -+ if (resp->req_msg_data != msg_data) { -+ hns3_warn(hw, -+ "received response tag (%u) is mismatched with requested tag (%u)", -+ msg_data, resp->req_msg_data); -+ return; -+ } -+ - resp->resp_status = hns3_resp_to_errno(req->msg[3]); - memcpy(resp->additional_info, &req->msg[4], - HNS3_MBX_MAX_RESP_DATA_SIZE); -- msg_data = (uint32_t)req->msg[1] << 16 | req->msg[2]; -- hns3_update_resp_position(hw, msg_data); -+ rte_io_wmb(); -+ resp->received_match_resp = true; - } - - static void -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index c378783c6c..4a328802b9 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -93,21 +93,11 @@ enum hns3_mbx_link_fail_subcode { - #define HNS3_MBX_MAX_RESP_DATA_SIZE 8 - #define HNS3_MBX_DEF_TIME_LIMIT_MS 500 - --enum { -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_ORIGINAL = 0, -- HNS3_MBX_RESP_MATCHING_SCHEME_OF_MATCH_ID --}; -- - struct hns3_mbx_resp_status { - rte_spinlock_t lock; /* protects against contending sync cmd resp */ - -- uint8_t matching_scheme; -- - /* The following fields used in the matching scheme for original */ - uint32_t req_msg_data; -- uint32_t head; -- uint32_t tail; -- uint32_t lost; - - /* The following fields used in the matching scheme for match_id */ - uint16_t match_id; --- -2.23.0 - diff --git a/0395-net-hns3-fix-ignored-reset-event.patch b/0395-net-hns3-fix-ignored-reset-event.patch deleted file mode 100644 index 8b7c2f5..0000000 --- a/0395-net-hns3-fix-ignored-reset-event.patch +++ /dev/null @@ -1,42 +0,0 @@ -From a80446eddd273e5f49f02b5884812081ec9e7140 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 27 Nov 2023 21:39:01 +0800 -Subject: [PATCH 395/397] net/hns3: fix ignored reset event - -[ upstream commit 4c40006c4b6b3c567185c84d60535752c9f7ea3d ] - -The code logic that only new reset whose level is higher than old -reset level will be addressed is added in 'hns3_detect_reset_event()', -in fixed commit. - -When the new reset is detected and the old reset level is -HNS3_NONE_RESET this reset will be ignored. This patch fix it. - -Fixes: 5be38fc6c0fc ("net/hns3: fix multiple reset detected log") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Acked-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 2d4af9f3ea..43409865ee 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5560,7 +5560,10 @@ hns3_detect_reset_event(struct hns3_hw *hw) - new_req = HNS3_GLOBAL_RESET; - } - -- if (new_req != HNS3_NONE_RESET && last_req < new_req) { -+ if (new_req == HNS3_NONE_RESET) -+ return HNS3_NONE_RESET; -+ -+ if (last_req == HNS3_NONE_RESET || last_req < new_req) { - hns3_schedule_delayed_reset(hns); - hns3_warn(hw, "High level reset detected, delay do reset"); - } --- -2.33.0 - diff --git a/0396-net-hns3-fix-reset-event-status.patch b/0396-net-hns3-fix-reset-event-status.patch deleted file mode 100644 index ee93f5f..0000000 --- a/0396-net-hns3-fix-reset-event-status.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 3bad5cf6b0a315e41563340ec2c069dedd8f4986 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 27 Nov 2023 21:39:02 +0800 -Subject: [PATCH 396/397] net/hns3: fix reset event status - -[ upstream commit b59a0cbec866a8d4f7d1938b6826f7961c75c9fd ] - -The function hns3_clear_reset_event is used to clear PF -reset status, The VF shouldn't use it. - -This patch fixes it. - -Fixes: 1eee1ea75c0e ("net/hns3: fix IMP or global reset") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Acked-by: Jie Hai ---- - drivers/net/hns3/hns3_intr.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index ce8a28e2f9..9d8dddfcc9 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -2727,7 +2727,8 @@ hns3_reset_post(struct hns3_adapter *hns) - /* IMP will wait ready flag before reset */ - hns3_notify_reset_ready(hw, false); - hns3_clear_reset_level(hw, &hw->reset.pending); -- hns3_clear_reset_event(hw); -+ if (!hns->is_vf) -+ hns3_clear_reset_event(hw); - __atomic_store_n(&hns->hw.reset.resetting, 0, __ATOMIC_RELAXED); - hw->reset.attempts = 0; - hw->reset.stats.success_cnt++; -@@ -2776,7 +2777,8 @@ hns3_reset_fail_handle(struct hns3_adapter *hns) - struct timeval tv; - - hns3_clear_reset_level(hw, &hw->reset.pending); -- hns3_clear_reset_event(hw); -+ if (!hns->is_vf) -+ hns3_clear_reset_event(hw); - if (hns3_reset_err_handle(hns)) { - hw->reset.stage = RESET_STAGE_PREWAIT; - hns3_schedule_reset(hns); --- -2.33.0 - diff --git a/0397-net-hns3-fix-VF-reset-handler-interruption.patch b/0397-net-hns3-fix-VF-reset-handler-interruption.patch deleted file mode 100644 index 67ab098..0000000 --- a/0397-net-hns3-fix-VF-reset-handler-interruption.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 5357c47f664cd3f7b7fd375016afe70884d86677 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Mon, 27 Nov 2023 21:39:03 +0800 -Subject: [PATCH 397/397] net/hns3: fix VF reset handler interruption - -[ upstream commit 94cf4db1603fe9074b5275cc4b63685fc91fdac5 ] - -Currently, the VF reset interrupt is enabled before the reset -process is completed. If the VF reset is triggered by an IMP -reset, the initialization of IMP is may not completed, and the -VF reset interrupt may continue to be reported. In this scenario, -the VF reset being performed by the driver does not need to be -interrupted. Therefore, for VF reset, the driver has to enable -the interrupt after the end of reset. - -Fixes: a5475d61fa34 ("net/hns3: support VF") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Acked-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev.h | 12 ++++++++++++ - drivers/net/hns3/hns3_ethdev_vf.c | 19 +++++++++++++++++-- - drivers/net/hns3/hns3_intr.c | 6 ++---- - 3 files changed, 31 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h -index 668f141e32..12d8299def 100644 ---- a/drivers/net/hns3/hns3_ethdev.h -+++ b/drivers/net/hns3/hns3_ethdev.h -@@ -1035,6 +1035,7 @@ void hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status, - uint32_t link_speed, uint8_t link_duplex); - void hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported); - void hns3_clear_reset_event(struct hns3_hw *hw); -+void hns3vf_clear_reset_event(struct hns3_hw *hw); - - const char *hns3_get_media_type_name(uint8_t media_type); - -@@ -1049,4 +1050,15 @@ is_reset_pending(struct hns3_adapter *hns) - return ret; - } - -+static inline void -+hns3_clear_reset_status(struct hns3_hw *hw) -+{ -+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); -+ -+ if (hns->is_vf) -+ hns3vf_clear_reset_event(hw); -+ else -+ hns3_clear_reset_event(hw); -+} -+ - #endif /* HNS3_ETHDEV_H */ -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index db1a30aff0..a4ac659205 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -612,6 +612,19 @@ hns3vf_enable_irq0(struct hns3_hw *hw) - hns3_write_dev(hw, HNS3_MISC_VECTOR_REG_BASE, 1); - } - -+void -+hns3vf_clear_reset_event(struct hns3_hw *hw) -+{ -+ uint32_t clearval; -+ uint32_t cmdq_stat_reg; -+ -+ cmdq_stat_reg = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_STAT_REG); -+ clearval = cmdq_stat_reg & ~BIT(HNS3_VECTOR0_RST_INT_B); -+ hns3_write_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG, clearval); -+ -+ hns3vf_enable_irq0(hw); -+} -+ - static enum hns3vf_evt_cause - hns3vf_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - { -@@ -686,8 +699,10 @@ hns3vf_interrupt_handler(void *param) - break; - } - -- /* Enable interrupt */ -- hns3vf_enable_irq0(hw); -+ /* Enable interrupt if it is not caused by reset */ -+ if (event_cause == HNS3VF_VECTOR0_EVENT_MBX || -+ event_cause == HNS3VF_VECTOR0_EVENT_OTHER) -+ hns3vf_enable_irq0(hw); - } - - void -diff --git a/drivers/net/hns3/hns3_intr.c b/drivers/net/hns3/hns3_intr.c -index 9d8dddfcc9..60a0f0d53d 100644 ---- a/drivers/net/hns3/hns3_intr.c -+++ b/drivers/net/hns3/hns3_intr.c -@@ -2727,8 +2727,7 @@ hns3_reset_post(struct hns3_adapter *hns) - /* IMP will wait ready flag before reset */ - hns3_notify_reset_ready(hw, false); - hns3_clear_reset_level(hw, &hw->reset.pending); -- if (!hns->is_vf) -- hns3_clear_reset_event(hw); -+ hns3_clear_reset_status(hw); - __atomic_store_n(&hns->hw.reset.resetting, 0, __ATOMIC_RELAXED); - hw->reset.attempts = 0; - hw->reset.stats.success_cnt++; -@@ -2777,8 +2776,7 @@ hns3_reset_fail_handle(struct hns3_adapter *hns) - struct timeval tv; - - hns3_clear_reset_level(hw, &hw->reset.pending); -- if (!hns->is_vf) -- hns3_clear_reset_event(hw); -+ hns3_clear_reset_status(hw); - if (hns3_reset_err_handle(hns)) { - hw->reset.stage = RESET_STAGE_PREWAIT; - hns3_schedule_reset(hns); --- -2.33.0 - diff --git a/0398-app-testpmd-remove-useless-check-in-TSO-command.patch b/0398-app-testpmd-remove-useless-check-in-TSO-command.patch deleted file mode 100644 index 4c6f4fc..0000000 --- a/0398-app-testpmd-remove-useless-check-in-TSO-command.patch +++ /dev/null @@ -1,49 +0,0 @@ -From f799040a5fe871e9e11101e66ccbdecea8d84b56 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 7 Nov 2023 12:11:16 +0800 -Subject: [PATCH 398/410] app/testpmd: remove useless check in TSO command - -[ upstream commit 773397f6f4b5e325e786835343bacbc454d1e5f0 ] - -Testpmd has added the check of TSO offload capability of port, please see -the commit 3926dd2b6668 ("app/testpmd: enforce offload capabilities check") - -So the code following the check code memtioned above to display warning -when port doesn't support TSO offload doesn't access to forever. - -Fixes: 3926dd2b6668 ("app/testpmd: enforce offload capabilities check") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 13 ------------- - 1 file changed, 13 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index cdf943162b..88fd296bbc 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -4961,19 +4961,6 @@ cmd_tso_set_parsed(void *parsed_result, - ports[res->port_id].tso_segsz); - } - cmd_config_queue_tx_offloads(&ports[res->port_id]); -- -- /* display warnings if configuration is not supported by the NIC */ -- ret = eth_dev_info_get_print_err(res->port_id, &dev_info); -- if (ret != 0) -- return; -- -- if ((ports[res->port_id].tso_segsz != 0) && -- (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_TSO) == 0) { -- fprintf(stderr, -- "Warning: TSO enabled but not supported by port %d\n", -- res->port_id); -- } -- - cmd_reconfig_device_queue(res->port_id, 1, 1); - } - --- -2.33.0 - diff --git a/0399-app-testpmd-fix-tunnel-TSO-capability-check.patch b/0399-app-testpmd-fix-tunnel-TSO-capability-check.patch deleted file mode 100644 index 9bc2a46..0000000 --- a/0399-app-testpmd-fix-tunnel-TSO-capability-check.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 0ff1a5865fb7e5f11f174cb0cf10eff3a0a90f25 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Nov 2023 12:59:41 +0800 -Subject: [PATCH 399/410] app/testpmd: fix tunnel TSO capability check - -[ upstream commit 6d4def820aa7d118f1ebdebf7af8ba6299ac20ee ] - -Currently, testpmd set tunnel TSO offload even if fail to get dev_info. -In this case, the 'tx_offload_capa' in dev_info is a random value, - -Fixes: 6f51deb903b2 ("app/testpmd: check status of getting ethdev info") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 29 ++++++++++++++--------------- - 1 file changed, 14 insertions(+), 15 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 88fd296bbc..9164f02932 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -5018,39 +5018,33 @@ struct cmd_tunnel_tso_set_result { - portid_t port_id; - }; - --static struct rte_eth_dev_info --check_tunnel_tso_nic_support(portid_t port_id) -+static void -+check_tunnel_tso_nic_support(portid_t port_id, uint64_t tx_offload_capa) - { -- struct rte_eth_dev_info dev_info; -- -- if (eth_dev_info_get_print_err(port_id, &dev_info) != 0) -- return dev_info; -- -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO)) - fprintf(stderr, - "Warning: VXLAN TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO)) - fprintf(stderr, - "Warning: GRE TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO)) - fprintf(stderr, - "Warning: IPIP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO)) - fprintf(stderr, - "Warning: GENEVE TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_IP_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_IP_TNL_TSO)) - fprintf(stderr, - "Warning: IP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- if (!(dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO)) -+ if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO)) - fprintf(stderr, - "Warning: UDP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); -- return dev_info; - } - - static void -@@ -5060,6 +5054,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - { - struct cmd_tunnel_tso_set_result *res = parsed_result; - struct rte_eth_dev_info dev_info; -+ int ret; - - if (port_id_is_invalid(res->port_id, ENABLED_WARN)) - return; -@@ -5071,7 +5066,11 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - if (!strcmp(res->mode, "set")) - ports[res->port_id].tunnel_tso_segsz = res->tso_segsz; - -- dev_info = check_tunnel_tso_nic_support(res->port_id); -+ ret = eth_dev_info_get_print_err(res->port_id, &dev_info); -+ if (ret != 0) -+ return; -+ -+ check_tunnel_tso_nic_support(res->port_id, dev_info.tx_offload_capa); - if (ports[res->port_id].tunnel_tso_segsz == 0) { - ports[res->port_id].dev_conf.txmode.offloads &= - ~(RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | --- -2.33.0 - diff --git a/0400-app-testpmd-add-explicit-check-for-tunnel-TSO.patch b/0400-app-testpmd-add-explicit-check-for-tunnel-TSO.patch deleted file mode 100644 index 95b2d68..0000000 --- a/0400-app-testpmd-add-explicit-check-for-tunnel-TSO.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 1e6660cb97216a23e8f8f463ae66e83f2c6414ff Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Nov 2023 12:59:42 +0800 -Subject: [PATCH 400/410] app/testpmd: add explicit check for tunnel TSO - -[ upstream commit 33156a6bc61560e74a126ade38a7af9c1fa02671 ] - -If port don't support TSO of tunnel packets, tell user in advance and no -need to change other configuration of this port in case of fault spread. - -In addition, if some tunnel offloads don't support, which is not an -error case, the log about this shouldn't be to stderr. - -Fixes: 3926dd2b6668 ("app/testpmd: enforce offload capabilities check") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 55 ++++++++++++++++++------------------------ - 1 file changed, 24 insertions(+), 31 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 9164f02932..444c7a79ff 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -5022,28 +5022,22 @@ static void - check_tunnel_tso_nic_support(portid_t port_id, uint64_t tx_offload_capa) - { - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO)) -- fprintf(stderr, -- "Warning: VXLAN TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: VXLAN TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO)) -- fprintf(stderr, -- "Warning: GRE TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: GRE TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO)) -- fprintf(stderr, -- "Warning: IPIP TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: IPIP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO)) -- fprintf(stderr, -- "Warning: GENEVE TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: GENEVE TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_IP_TNL_TSO)) -- fprintf(stderr, -- "Warning: IP TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: IP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - if (!(tx_offload_capa & RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO)) -- fprintf(stderr, -- "Warning: UDP TUNNEL TSO not supported therefore not enabled for port %d\n", -+ printf("Warning: UDP TUNNEL TSO not supported therefore not enabled for port %d\n", - port_id); - } - -@@ -5054,6 +5048,12 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - { - struct cmd_tunnel_tso_set_result *res = parsed_result; - struct rte_eth_dev_info dev_info; -+ uint64_t all_tunnel_tso = RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | -+ RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | -+ RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | -+ RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO | -+ RTE_ETH_TX_OFFLOAD_IP_TNL_TSO | -+ RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO; - int ret; - - if (port_id_is_invalid(res->port_id, ENABLED_WARN)) -@@ -5066,30 +5066,23 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - if (!strcmp(res->mode, "set")) - ports[res->port_id].tunnel_tso_segsz = res->tso_segsz; - -- ret = eth_dev_info_get_print_err(res->port_id, &dev_info); -- if (ret != 0) -- return; -- -- check_tunnel_tso_nic_support(res->port_id, dev_info.tx_offload_capa); - if (ports[res->port_id].tunnel_tso_segsz == 0) { -- ports[res->port_id].dev_conf.txmode.offloads &= -- ~(RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_IP_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO); -+ ports[res->port_id].dev_conf.txmode.offloads &= ~all_tunnel_tso; - printf("TSO for tunneled packets is disabled\n"); - } else { -- uint64_t tso_offloads = (RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_IP_TNL_TSO | -- RTE_ETH_TX_OFFLOAD_UDP_TNL_TSO); -+ ret = eth_dev_info_get_print_err(res->port_id, &dev_info); -+ if (ret != 0) -+ return; -+ -+ if ((all_tunnel_tso & dev_info.tx_offload_capa) == 0) { -+ fprintf(stderr, "Error: port=%u don't support tunnel TSO offloads.\n", -+ res->port_id); -+ return; -+ } -+ check_tunnel_tso_nic_support(res->port_id, dev_info.tx_offload_capa); - - ports[res->port_id].dev_conf.txmode.offloads |= -- (tso_offloads & dev_info.tx_offload_capa); -+ (all_tunnel_tso & dev_info.tx_offload_capa); - printf("TSO segment size for tunneled packets is %d\n", - ports[res->port_id].tunnel_tso_segsz); - --- -2.33.0 - diff --git a/0401-app-testpmd-fix-tunnel-TSO-configuration.patch b/0401-app-testpmd-fix-tunnel-TSO-configuration.patch deleted file mode 100644 index 3f7ff76..0000000 --- a/0401-app-testpmd-fix-tunnel-TSO-configuration.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 27c78af1f290c342b6fb64c2f57a430628f5062f Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Sat, 11 Nov 2023 12:59:43 +0800 -Subject: [PATCH 401/410] app/testpmd: fix tunnel TSO configuration - -[ upstream commit e43dc93803c4623840472c6109ef05e26286ec2f ] - -Currently, there are two conditions to set tunnel TSO, like "parse -tunnel" and "outer IP checksum". -If these conditions are not satisfied, testpmd should not change their -configuration, like tx_offloads on port and per queue, and no need to -request "reconfig device". - -Fixes: 597f9fafe13b ("app/testpmd: convert to new Tx offloads API") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 25 ++++++++++++++----------- - 1 file changed, 14 insertions(+), 11 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index 444c7a79ff..fd897dc80c 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -5079,12 +5079,6 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - res->port_id); - return; - } -- check_tunnel_tso_nic_support(res->port_id, dev_info.tx_offload_capa); -- -- ports[res->port_id].dev_conf.txmode.offloads |= -- (all_tunnel_tso & dev_info.tx_offload_capa); -- printf("TSO segment size for tunneled packets is %d\n", -- ports[res->port_id].tunnel_tso_segsz); - - /* Below conditions are needed to make it work: - * (1) tunnel TSO is supported by the NIC; -@@ -5097,14 +5091,23 @@ cmd_tunnel_tso_set_parsed(void *parsed_result, - * is not necessary for IPv6 tunneled pkts because there's no - * checksum in IP header anymore. - */ -- -- if (!ports[res->port_id].parse_tunnel) -+ if (!ports[res->port_id].parse_tunnel) { - fprintf(stderr, -- "Warning: csum parse_tunnel must be set so that tunneled packets are recognized\n"); -+ "Error: csum parse_tunnel must be set so that tunneled packets are recognized\n"); -+ return; -+ } - if (!(ports[res->port_id].dev_conf.txmode.offloads & -- RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM)) -+ RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM)) { - fprintf(stderr, -- "Warning: csum set outer-ip must be set to hw if outer L3 is IPv4; not necessary for IPv6\n"); -+ "Error: csum set outer-ip must be set to hw if outer L3 is IPv4; not necessary for IPv6\n"); -+ return; -+ } -+ -+ check_tunnel_tso_nic_support(res->port_id, dev_info.tx_offload_capa); -+ ports[res->port_id].dev_conf.txmode.offloads |= -+ (all_tunnel_tso & dev_info.tx_offload_capa); -+ printf("TSO segment size for tunneled packets is %d\n", -+ ports[res->port_id].tunnel_tso_segsz); - } - - cmd_config_queue_tx_offloads(&ports[res->port_id]); --- -2.33.0 - diff --git a/0402-app-testpmd-allow-offload-config-for-all-ports.patch b/0402-app-testpmd-allow-offload-config-for-all-ports.patch deleted file mode 100644 index 398caca..0000000 --- a/0402-app-testpmd-allow-offload-config-for-all-ports.patch +++ /dev/null @@ -1,359 +0,0 @@ -From 7830c0aee5eff3f97a39b2a49ead39ffa315182f Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 10 Nov 2023 17:10:13 +0800 -Subject: [PATCH 402/410] app/testpmd: allow offload config for all ports - -[ upstream commit 6280fe565b44aad684cab320939acdd52ec1a9ec ] - -Support config Rx/Tx offload for all ports in following commands: -1. port config all rx_offload (offloading) (on|off) -2. port config all tx_offload (offloading) (on|off) - -Signed-off-by: Dengdui Huang -Acked-by: Chengwen Feng -Reviewed-by: Ferruh Yigit -Acked-by: Huisong Li ---- - app/test-pmd/cmdline.c | 205 ++++++++++++++++++-- - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 +- - 2 files changed, 189 insertions(+), 24 deletions(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index fd897dc80c..f380d35eec 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -867,7 +867,7 @@ static void cmd_help_long_parsed(void *parsed_result, - "port config (port_id) udp_tunnel_port add|rm vxlan|geneve|ecpri (udp_port)\n\n" - " Add/remove UDP tunnel port for tunneling offload\n\n" - -- "port config rx_offload all|vlan_strip|" -+ "port config (port_id|all) rx_offload all|vlan_strip|" - "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|" - "outer_ipv4_cksum|macsec_strip|header_split|" - "vlan_filter|vlan_extend|scatter|" -@@ -883,7 +883,7 @@ static void cmd_help_long_parsed(void *parsed_result, - " Enable or disable a per queue Rx offloading" - " only on a specific Rx queue\n\n" - -- "port config (port_id) tx_offload all|vlan_insert|" -+ "port config (port_id|all) tx_offload all|vlan_insert|" - "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|" - "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|" - "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|" -@@ -16210,12 +16210,8 @@ search_rx_offload(const char *name) - } - - static void --cmd_config_per_port_rx_offload_parsed(void *parsed_result, -- __rte_unused struct cmdline *cl, -- __rte_unused void *data) -+config_port_rx_offload(portid_t port_id, char *name, bool on) - { -- struct cmd_config_per_port_rx_offload_result *res = parsed_result; -- portid_t port_id = res->port_id; - struct rte_eth_dev_info dev_info; - struct rte_port *port = &ports[port_id]; - uint16_t nb_rx_queues; -@@ -16234,18 +16230,18 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result, - if (ret != 0) - return; - -- if (!strcmp(res->offload, "all")) { -+ if (!strcmp(name, "all")) { - offload = dev_info.rx_offload_capa; - } else { -- offload = search_rx_offload(res->offload); -+ offload = search_rx_offload(name); - if (offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ fprintf(stderr, "Unknown offload name: %s\n", name); - return; - } - } - - nb_rx_queues = dev_info.nb_rx_queues; -- if (!strcmp(res->on_off, "on")) { -+ if (on) { - port->dev_conf.rxmode.offloads |= offload; - for (q = 0; q < nb_rx_queues; q++) - port->rx_conf[q].offloads |= offload; -@@ -16258,6 +16254,18 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result, - cmd_reconfig_device_queue(port_id, 1, 1); - } - -+static void -+cmd_config_per_port_rx_offload_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_config_per_port_rx_offload_result *res = parsed_result; -+ bool on; -+ -+ on = strcmp(res->on_off, "on") == 0; -+ config_port_rx_offload(res->port_id, res->offload, on); -+} -+ - cmdline_parse_inst_t cmd_config_per_port_rx_offload = { - .f = cmd_config_per_port_rx_offload_parsed, - .data = NULL, -@@ -16277,6 +16285,79 @@ cmdline_parse_inst_t cmd_config_per_port_rx_offload = { - } - }; - -+/* Enable/Disable all port Rx offloading */ -+struct cmd_config_all_port_rx_offload_result { -+ cmdline_fixed_string_t port; -+ cmdline_fixed_string_t config; -+ cmdline_fixed_string_t port_all; -+ cmdline_fixed_string_t rx_offload; -+ cmdline_fixed_string_t offload; -+ cmdline_fixed_string_t on_off; -+}; -+ -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_port = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_rx_offload_result, -+ port, "port"); -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_config = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_rx_offload_result, -+ config, "config"); -+ -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_port_all = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_all_port_rx_offload_result, -+ port_all, "all"); -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_rx_offload = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_rx_offload_result, -+ rx_offload, "rx_offload"); -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_offload = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_rx_offload_result, -+ offload, "all#vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#" -+ "qinq_strip#outer_ipv4_cksum#macsec_strip#" -+ "vlan_filter#vlan_extend#" -+ "scatter#buffer_split#timestamp#security#" -+ "keep_crc#rss_hash"); -+static cmdline_parse_token_string_t cmd_config_all_port_rx_offload_result_on_off = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_rx_offload_result, -+ on_off, "on#off"); -+ -+static void -+cmd_config_all_port_rx_offload_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_config_all_port_rx_offload_result *res = parsed_result; -+ bool on_off; -+ portid_t i; -+ -+ on_off = strcmp(res->on_off, "on") == 0; -+ RTE_ETH_FOREACH_DEV(i) -+ config_port_rx_offload(i, res->offload, on_off); -+ -+} -+ -+static cmdline_parse_inst_t cmd_config_all_port_rx_offload = { -+ .f = cmd_config_all_port_rx_offload_parsed, -+ .data = NULL, -+ .help_str = "port config all rx_offload all|vlan_strip|ipv4_cksum|" -+ "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|" -+ "macsec_strip|vlan_filter|vlan_extend|" -+ "scatter|buffer_split|timestamp|security|" -+ "keep_crc|rss_hash on|off", -+ .tokens = { -+ (void *)&cmd_config_all_port_rx_offload_result_port, -+ (void *)&cmd_config_all_port_rx_offload_result_config, -+ (void *)&cmd_config_all_port_rx_offload_result_port_all, -+ (void *)&cmd_config_all_port_rx_offload_result_rx_offload, -+ (void *)&cmd_config_all_port_rx_offload_result_offload, -+ (void *)&cmd_config_all_port_rx_offload_result_on_off, -+ NULL, -+ } -+}; -+ - /* Enable/Disable a per queue offloading */ - struct cmd_config_per_queue_rx_offload_result { - cmdline_fixed_string_t port; -@@ -16641,12 +16722,8 @@ search_tx_offload(const char *name) - } - - static void --cmd_config_per_port_tx_offload_parsed(void *parsed_result, -- __rte_unused struct cmdline *cl, -- __rte_unused void *data) -+config_port_tx_offload(portid_t port_id, char *name, bool on) - { -- struct cmd_config_per_port_tx_offload_result *res = parsed_result; -- portid_t port_id = res->port_id; - struct rte_eth_dev_info dev_info; - struct rte_port *port = &ports[port_id]; - uint16_t nb_tx_queues; -@@ -16665,18 +16742,18 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result, - if (ret != 0) - return; - -- if (!strcmp(res->offload, "all")) { -+ if (!strcmp(name, "all")) { - offload = dev_info.tx_offload_capa; - } else { -- offload = search_tx_offload(res->offload); -+ offload = search_tx_offload(name); - if (offload == 0) { -- fprintf(stderr, "Unknown offload name: %s\n", res->offload); -+ fprintf(stderr, "Unknown offload name: %s\n", name); - return; - } - } - - nb_tx_queues = dev_info.nb_tx_queues; -- if (!strcmp(res->on_off, "on")) { -+ if (on) { - port->dev_conf.txmode.offloads |= offload; - for (q = 0; q < nb_tx_queues; q++) - port->tx_conf[q].offloads |= offload; -@@ -16689,6 +16766,18 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result, - cmd_reconfig_device_queue(port_id, 1, 1); - } - -+static void -+cmd_config_per_port_tx_offload_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_config_per_port_tx_offload_result *res = parsed_result; -+ bool on; -+ -+ on = strcmp(res->on_off, "on"); -+ config_port_tx_offload(res->port_id, res->offload, on); -+} -+ - cmdline_parse_inst_t cmd_config_per_port_tx_offload = { - .f = cmd_config_per_port_tx_offload_parsed, - .data = NULL, -@@ -16710,6 +16799,80 @@ cmdline_parse_inst_t cmd_config_per_port_tx_offload = { - } - }; - -+/* Enable/Disable all port Tx offloading */ -+struct cmd_config_all_port_tx_offload_result { -+ cmdline_fixed_string_t port; -+ cmdline_fixed_string_t config; -+ cmdline_fixed_string_t port_all; -+ cmdline_fixed_string_t tx_offload; -+ cmdline_fixed_string_t offload; -+ cmdline_fixed_string_t on_off; -+}; -+ -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_port = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_tx_offload_result, -+ port, "port"); -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_config = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_tx_offload_result, -+ config, "config"); -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_port_all = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_all_port_tx_offload_result, -+ port_all, "all"); -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_tx_offload = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_tx_offload_result, -+ tx_offload, "tx_offload"); -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_offload = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_tx_offload_result, -+ offload, "all#vlan_insert#ipv4_cksum#udp_cksum#tcp_cksum#" -+ "sctp_cksum#tcp_tso#udp_tso#outer_ipv4_cksum#" -+ "qinq_insert#vxlan_tnl_tso#gre_tnl_tso#" -+ "ipip_tnl_tso#geneve_tnl_tso#macsec_insert#" -+ "mt_lockfree#multi_segs#mbuf_fast_free#security#" -+ "send_on_timestamp"); -+static cmdline_parse_token_string_t cmd_config_all_port_tx_offload_result_on_off = -+ TOKEN_STRING_INITIALIZER -+ (struct cmd_config_all_port_tx_offload_result, -+ on_off, "on#off"); -+ -+static void -+cmd_config_all_port_tx_offload_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_config_all_port_tx_offload_result *res = parsed_result; -+ portid_t i; -+ bool on_off; -+ -+ on_off = strcmp(res->on_off, "on") == 0; -+ RTE_ETH_FOREACH_DEV(i) -+ config_port_tx_offload(i, res->offload, on_off); -+} -+ -+static cmdline_parse_inst_t cmd_config_all_port_tx_offload = { -+ .f = cmd_config_all_port_tx_offload_parsed, -+ .data = NULL, -+ .help_str = "port config all tx_offload " -+ "all|vlan_insert|ipv4_cksum|udp_cksum|tcp_cksum|" -+ "sctp_cksum|tcp_tso|udp_tso|outer_ipv4_cksum|" -+ "qinq_insert|vxlan_tnl_tso|gre_tnl_tso|" -+ "ipip_tnl_tso|geneve_tnl_tso|macsec_insert|" -+ "mt_lockfree|multi_segs|mbuf_fast_free|security|" -+ "send_on_timestamp on|off", -+ .tokens = { -+ (void *)&cmd_config_all_port_tx_offload_result_port, -+ (void *)&cmd_config_all_port_tx_offload_result_config, -+ (void *)&cmd_config_all_port_tx_offload_result_port_all, -+ (void *)&cmd_config_all_port_tx_offload_result_tx_offload, -+ (void *)&cmd_config_all_port_tx_offload_result_offload, -+ (void *)&cmd_config_all_port_tx_offload_result_on_off, -+ NULL, -+ } -+}; -+ - /* Enable/Disable a per queue offloading */ - struct cmd_config_per_queue_tx_offload_result { - cmdline_fixed_string_t port; -@@ -18021,10 +18184,12 @@ cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_rx_offload_get_capa, - (cmdline_parse_inst_t *)&cmd_rx_offload_get_configuration, - (cmdline_parse_inst_t *)&cmd_config_per_port_rx_offload, -+ (cmdline_parse_inst_t *)&cmd_config_all_port_rx_offload, - (cmdline_parse_inst_t *)&cmd_config_per_queue_rx_offload, - (cmdline_parse_inst_t *)&cmd_tx_offload_get_capa, - (cmdline_parse_inst_t *)&cmd_tx_offload_get_configuration, - (cmdline_parse_inst_t *)&cmd_config_per_port_tx_offload, -+ (cmdline_parse_inst_t *)&cmd_config_all_port_tx_offload, - (cmdline_parse_inst_t *)&cmd_config_per_queue_tx_offload, - #ifdef RTE_LIB_BPF - (cmdline_parse_inst_t *)&cmd_operate_bpf_ld_parse, -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index a81296d2ba..226569c545 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -1767,9 +1767,9 @@ Reset ptype mapping table:: - config per port Rx offloading - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - --Enable or disable a per port Rx offloading on all Rx queues of a port:: -+Enable or disable port Rx offloading on all Rx queues of a port:: - -- testpmd> port config (port_id) rx_offload (offloading) on|off -+ testpmd> port config (port_id|all) rx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: - all, vlan_strip, ipv4_cksum, udp_cksum, tcp_cksum, tcp_lro, -@@ -1797,9 +1797,9 @@ This command should be run when the port is stopped, or else it will fail. - config per port Tx offloading - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - --Enable or disable a per port Tx offloading on all Tx queues of a port:: -+Enable or disable port Tx offloading on all Tx queues of a port:: - -- testpmd> port config (port_id) tx_offload (offloading) on|off -+ testpmd> port config (port_id|all) tx_offload (offloading) on|off - - * ``offloading``: can be any of these offloading capability: - all, vlan_insert, ipv4_cksum, udp_cksum, tcp_cksum, --- -2.33.0 - diff --git a/0403-app-testpmd-fix-Tx-offload-command.patch b/0403-app-testpmd-fix-Tx-offload-command.patch deleted file mode 100644 index 75b4038..0000000 --- a/0403-app-testpmd-fix-Tx-offload-command.patch +++ /dev/null @@ -1,37 +0,0 @@ -From ca98a6df1479ed5b04f1df45cd76b87f61f4be28 Mon Sep 17 00:00:00 2001 -From: Ferruh Yigit -Date: Thu, 16 Nov 2023 17:21:55 +0000 -Subject: [PATCH 403/410] app/testpmd: fix Tx offload command - -In command to set Tx offload: -"port config tx_offload on|off", - -there is a defect in "on|off" comparison, so command does opposite of -what is intended. Fixed comparison. - -Bugzilla ID: 1326 -Fixes: 6280fe565b44 ("app/testpmd: allow offload config for all ports") - -Signed-off-by: Ferruh Yigit -Reviewed-by: Chengwen Feng -Acked-by: Huisong Li ---- - app/test-pmd/cmdline.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index f380d35eec..b412452948 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -16774,7 +16774,7 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result, - struct cmd_config_per_port_tx_offload_result *res = parsed_result; - bool on; - -- on = strcmp(res->on_off, "on"); -+ on = strcmp(res->on_off, "on") == 0; - config_port_tx_offload(res->port_id, res->offload, on); - } - --- -2.33.0 - diff --git a/0404-app-testpmd-check-port-and-queue-Rx-Tx-offloads.patch b/0404-app-testpmd-check-port-and-queue-Rx-Tx-offloads.patch deleted file mode 100644 index 6b7d214..0000000 --- a/0404-app-testpmd-check-port-and-queue-Rx-Tx-offloads.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 40bc40d4e92ca9aefaf4e7ea2e859e582ca4559e Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 15 Nov 2023 18:33:23 +0800 -Subject: [PATCH 404/410] app/testpmd: check port and queue Rx/Tx offloads - -[ upstream commit f4b0f86a9a0cffc5c5611f4e685bab71c8b47b12 ] - -This patch adds the check for port and per queue Rx/Tx offload to avoid -the failure of "port start all" when config a offload driver didn't -support. - -Signed-off-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index b412452948..c641e1f338 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -16238,6 +16238,11 @@ config_port_rx_offload(portid_t port_id, char *name, bool on) - fprintf(stderr, "Unknown offload name: %s\n", name); - return; - } -+ if ((offload & dev_info.rx_offload_capa) == 0) { -+ fprintf(stderr, "Error: port %u doesn't support offload: %s.\n", -+ port_id, name); -+ return; -+ } - } - - nb_rx_queues = dev_info.nb_rx_queues; -@@ -16440,6 +16445,11 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result, - fprintf(stderr, "Unknown offload name: %s\n", res->offload); - return; - } -+ if ((offload & dev_info.rx_queue_offload_capa) == 0) { -+ fprintf(stderr, "Error: port %u doesn't support per queue offload: %s.\n", -+ port_id, res->offload); -+ return; -+ } - } - - if (!strcmp(res->on_off, "on")) -@@ -16750,6 +16760,11 @@ config_port_tx_offload(portid_t port_id, char *name, bool on) - fprintf(stderr, "Unknown offload name: %s\n", name); - return; - } -+ if ((offload & dev_info.tx_offload_capa) == 0) { -+ fprintf(stderr, "Error: port %u doesn't support offload: %s.\n", -+ port_id, name); -+ return; -+ } - } - - nb_tx_queues = dev_info.nb_tx_queues; -@@ -16956,6 +16971,11 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result, - fprintf(stderr, "Unknown offload name: %s\n", res->offload); - return; - } -+ if ((offload & dev_info.tx_queue_offload_capa) == 0) { -+ fprintf(stderr, "Error: port %u doesn't support per queue offload: %s.\n", -+ port_id, res->offload); -+ return; -+ } - } - - if (!strcmp(res->on_off, "on")) --- -2.33.0 - diff --git a/0405-doc-fix-hns3-build-option-about-max-queue-number.patch b/0405-doc-fix-hns3-build-option-about-max-queue-number.patch deleted file mode 100644 index 987c0a9..0000000 --- a/0405-doc-fix-hns3-build-option-about-max-queue-number.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 98d550e1521aaf9057161ada27911d79774a7e89 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 20 Nov 2023 19:14:02 +0800 -Subject: [PATCH 405/410] doc: fix hns3 build option about max queue number - -[ upstream commit f64a879dbb1f8b508d9cf25dd4a252597f72864c ] - -This patch fixes the description of compilation option about setting max -queue number. The maximum queue number of HIP09 and HIP10 is determined -by the RTE_LIBRTE_HNS3_MAX_TQP_NUM_PER_PF and the value the firmware -report. - -Fixes: 21938cf4e43e ("doc: add build config option in hns3 guide") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Jie Hai ---- - doc/guides/nics/hns3.rst | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index 8705845d8e..e3e6d3fbd8 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -69,7 +69,8 @@ The following options can be modified in the ``config/rte_config.h`` file. - - - ``RTE_LIBRTE_HNS3_MAX_TQP_NUM_PER_PF`` (default ``256``) - -- Number of MAX queues reserved for PF. -+ Number of MAX queues reserved for PF on HIP09 and HIP10. -+ The MAX queue number is also determined by the value the firmware report. - - Runtime Configuration - ~~~~~~~~~~~~~~~~~~~~~ --- -2.33.0 - diff --git a/0406-doc-update-features-in-hns3-guide.patch b/0406-doc-update-features-in-hns3-guide.patch deleted file mode 100644 index 6ce4dca..0000000 --- a/0406-doc-update-features-in-hns3-guide.patch +++ /dev/null @@ -1,69 +0,0 @@ -From f7232006181c15d53a70a1c7a4fb142b6c9abec2 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 20 Nov 2023 19:14:03 +0800 -Subject: [PATCH 406/410] doc: update features in hns3 guide - -[ upstream commit 97d443f751441c71f8307aea9d9ac2752fa1045c ] - -Update the features for hns3. - -- "Basic stats" and "Extended stats" supported by -Fixes: 8839c5e202f3 ("net/hns3: support device stats") - -- "Traffic Management API" supported by -Fixes: c09c7847d892 ("net/hns3: support traffic management") - -- "Speed capabilities" supported by -Fixes: 09e0de1f411b ("net/hns3: report speed capability for PF") - -- "Link Auto-negotiation" supported by -Fixes: bdaf190f8235 ("net/hns3: support link speed autoneg for PF") - -- "Link flow control" supported by -Fixes: 62e3ccc2b94c ("net/hns3: support flow control") - -- "Dump private info from device" supported by -Fixes: 1a03c659cb9d ("net/hns3: dump device basic info") - -- "FW version" supported by -Fixes: 1f5ca0b460cd ("net/hns3: support some device operations") - -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Jie Hai ---- - doc/guides/nics/hns3.rst | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index e3e6d3fbd8..d55c0930a2 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -30,7 +30,6 @@ Features of the HNS3 PMD are: - - DCB - - Scattered and gather for TX and RX - - Vector Poll mode driver --- Dump register - - SR-IOV VF - - Multi-process - - MAC/VLAN filter -@@ -38,6 +37,15 @@ Features of the HNS3 PMD are: - - NUMA support - - Generic flow API - - IEEE1588/802.1AS timestamping -+- Basic stats -+- Extended stats -+- Traffic Management API -+- Speed capabilities -+- Link Auto-negotiation -+- Link flow control -+- Dump register -+- Dump private info from device -+- FW version - - Prerequisites - ------------- --- -2.33.0 - diff --git a/0407-doc-fix-RSS-flow-description-in-hns3-guide.patch b/0407-doc-fix-RSS-flow-description-in-hns3-guide.patch deleted file mode 100644 index 8f9801f..0000000 --- a/0407-doc-fix-RSS-flow-description-in-hns3-guide.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 0ff8cc564dd8483dfcf233063ea9144df37d9ebd Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Mon, 20 Nov 2023 19:14:04 +0800 -Subject: [PATCH 407/410] doc: fix RSS flow description in hns3 guide - -[ upstream commit 9036f9fef8ed7002ba45d78ef1e5c604dfc9948a ] - -The hns3 driver supports for creating rule base on input tuple, hash -key, queues and hash algorithm. But hash key, queues and hash algorithm -are the global configuration for hardware which will affect other rules. -The rule just setting input tuple is completely independent. - -Fixes: 63a0f65c9572 ("doc: add more description in hns3 guide") -Cc: stable@dpdk.org - -Signed-off-by: Huisong Li -Acked-by: Jie Hai ---- - doc/guides/nics/hns3.rst | 42 ++++++++++++++++++++++++++-------------- - 1 file changed, 28 insertions(+), 14 deletions(-) - -diff --git a/doc/guides/nics/hns3.rst b/doc/guides/nics/hns3.rst -index d55c0930a2..5ac64495a6 100644 ---- a/doc/guides/nics/hns3.rst -+++ b/doc/guides/nics/hns3.rst -@@ -239,36 +239,50 @@ Generic flow API - - - ``RSS Flow`` - -- RSS Flow supports to set hash input set, hash function, enable hash -- and configure queues. -- For example: -- Configure queues as queue 0, 1, 2, 3. -+ RSS Flow supports for creating rule base on input tuple, hash key, queues -+ and hash algorithm. But hash key, queues and hash algorithm are the global -+ configuration for hardware which will affect other rules. -+ The rule just setting input tuple is completely independent. -+ -+ Run ``testpmd``: - - .. code-block:: console - -- testpmd> flow create 0 ingress pattern end actions rss types end \ -- queues 0 1 2 3 end / end -+ dpdk-testpmd -a 0000:7d:00.0 -l 10-18 -- -i --rxq=8 --txq=8 -+ -+ All IP packets can be distributed to 8 queues. - -- Enable hash and set input set for IPv4-TCP. -+ Set IPv4-TCP packet is distributed to 8 queues based on L3/L4 SRC only. - - .. code-block:: console - -- testpmd> flow create 0 ingress pattern eth / ipv4 / tcp / end \ -- actions rss types ipv4-tcp l3-src-only end queues end / end -+ testpmd> flow create 0 ingress pattern eth / ipv4 / tcp / end actions \ -+ rss types ipv4-tcp l4-src-only l3-src-only end queues end / end - -- Set symmetric hash enable for flow type IPv4-TCP. -+ Disable IPv4 packet RSS hash. - - .. code-block:: console - -- testpmd> flow create 0 ingress pattern eth / ipv4 / tcp / end \ -- actions rss types ipv4-tcp end queues end func symmetric_toeplitz / end -+ testpmd> flow create 0 ingress pattern eth / ipv4 / end actions rss \ -+ types none end queues end / end - -- Set hash function as simple xor. -+ Set hash function as symmetric Toeplitz. - - .. code-block:: console - - testpmd> flow create 0 ingress pattern end actions rss types end \ -- queues end func simple_xor / end -+ queues end func symmetric_toeplitz / end -+ -+ In this case, all packets that enabled RSS are hashed using symmetric -+ Toeplitz algorithm. -+ -+ Flush all RSS rules -+ -+ .. code-block:: console -+ -+ testpmd> flow flush 0 -+ -+ The RSS configurations of hardwre is back to the one ethdev ops set. - - Statistics - ---------- --- -2.33.0 - diff --git a/0408-doc-fix-description-of-RSS-features.patch b/0408-doc-fix-description-of-RSS-features.patch deleted file mode 100644 index 6ec4664..0000000 --- a/0408-doc-fix-description-of-RSS-features.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 553a6b4c40f9cfd4e0b36cbce53cbd17079061f9 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Tue, 28 Nov 2023 13:59:25 +0800 -Subject: [PATCH 408/410] doc: fix description of RSS features - -[ upstream commit 46aa6b3cfca8818b8641026274c0a778f2e38a70 ] - -This patch fixes the description of RSS feature. -And the setting ot hash algorithm is introduced by 23.11, so add it. - -Fixes: 34ff088cc241 ("ethdev: set and query RSS hash algorithm") - -Signed-off-by: Huisong Li -Acked-by: Chengwen Feng -Acked-by: Ferruh Yigit ---- - doc/guides/nics/features.rst | 19 +++++++++++++++---- - 1 file changed, 15 insertions(+), 4 deletions(-) - -diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst -index dba985a105..9f2da6ac0c 100644 ---- a/doc/guides/nics/features.rst -+++ b/doc/guides/nics/features.rst -@@ -276,10 +276,20 @@ RSS hash - Supports RSS hashing on RX. - - * **[uses] user config**: ``dev_conf.rxmode.mq_mode`` = ``RTE_ETH_MQ_RX_RSS_FLAG``. --* **[uses] user config**: ``dev_conf.rx_adv_conf.rss_conf``. -+* **[uses] user config**: ``rss_conf.rss_hf``. - * **[uses] rte_eth_rxconf,rte_eth_rxmode**: ``offloads:RTE_ETH_RX_OFFLOAD_RSS_HASH``. - * **[provides] rte_eth_dev_info**: ``flow_type_rss_offloads``. - * **[provides] mbuf**: ``mbuf.ol_flags:RTE_MBUF_F_RX_RSS_HASH``, ``mbuf.rss``. -+* **[related] API**: ``rte_eth_dev_configure()``, ``rte_eth_dev_rss_hash_update`` -+ ``rte_eth_dev_rss_hash_conf_get()``. -+ -+Supports RSS hash algorithm on Rx. -+ -+* **[implements] eth_dev_ops**: ``dev_configure``, ``rss_hash_update``, ``rss_hash_conf_get``. -+* **[uses] user config**: ``rss_conf.algorithm`` -+* **[provides] rte_eth_dev_info**: ``rss_algo_capa``. -+* **[related] API**: ``rte_eth_dev_configure()``, ``rte_eth_dev_rss_hash_update()``, -+ ``rte_eth_dev_rss_hash_conf_get()``. - - - .. _nic_features_inner_rss: -@@ -287,7 +297,7 @@ Supports RSS hashing on RX. - Inner RSS - --------- - --Supports RX RSS hashing on Inner headers. -+Supports RSS hashing on inner headers with flow API. - - * **[uses] rte_flow_action_rss**: ``level``. - * **[uses] rte_eth_rxconf,rte_eth_rxmode**: ``offloads:RTE_ETH_RX_OFFLOAD_RSS_HASH``. -@@ -302,9 +312,10 @@ RSS key update - Supports configuration of Receive Side Scaling (RSS) hash computation. Updating - Receive Side Scaling (RSS) hash key. - --* **[implements] eth_dev_ops**: ``rss_hash_update``, ``rss_hash_conf_get``. -+* **[implements] eth_dev_ops**: ``dev_configure``, ``rss_hash_update``, ``rss_hash_conf_get``. -+* **[uses] user config**: ``rss_conf.rss_key``, ``rss_conf.rss_key_len``. - * **[provides] rte_eth_dev_info**: ``hash_key_size``. --* **[related] API**: ``rte_eth_dev_rss_hash_update()``, -+* **[related] API**: ``rte_eth_dev_configure()``, ``rte_eth_dev_rss_hash_update()``, - ``rte_eth_dev_rss_hash_conf_get()``. - - --- -2.33.0 - diff --git a/0409-ethdev-add-new-API-to-get-RSS-hash-algorithm-by-name.patch b/0409-ethdev-add-new-API-to-get-RSS-hash-algorithm-by-name.patch deleted file mode 100644 index 5e1584f..0000000 --- a/0409-ethdev-add-new-API-to-get-RSS-hash-algorithm-by-name.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 8f2d27fad53653546a97da1f691575ed153bd12f Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 1 Dec 2023 16:52:53 +0800 -Subject: [PATCH 409/410] ethdev: add new API to get RSS hash algorithm by name - -[ upstream commit c4b01b7cc50e1eb991310549455cc53bac6d47ad ] - -This patch supports conversion from names to hash algorithm -(see RTE_ETH_HASH_FUNCTION_XXX). - -Signed-off-by: Jie Hai -Reviewed-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - lib/ethdev/rte_ethdev.c | 15 +++++++++++++++ - lib/ethdev/rte_ethdev.h | 20 ++++++++++++++++++++ - lib/ethdev/version.map | 3 +++ - 3 files changed, 38 insertions(+) - -diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c -index 310b39775d..10312b3e13 100644 ---- a/lib/ethdev/rte_ethdev.c -+++ b/lib/ethdev/rte_ethdev.c -@@ -4321,6 +4321,21 @@ rte_eth_dev_rss_algo_name(enum rte_eth_hash_function rss_algo) - return name; - } - -+int -+rte_eth_find_rss_algo(const char *name, uint32_t *algo) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < RTE_DIM(rte_eth_dev_rss_algo_names); i++) { -+ if (strcmp(name, rte_eth_dev_rss_algo_names[i].name) == 0) { -+ *algo = rte_eth_dev_rss_algo_names[i].algo; -+ return 0; -+ } -+ } -+ -+ return -EINVAL; -+} -+ - int - rte_eth_dev_udp_tunnel_port_add(uint16_t port_id, - struct rte_eth_udp_tunnel *udp_tunnel) -diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h -index 2880a55890..e0c132cebc 100644 ---- a/lib/ethdev/rte_ethdev.h -+++ b/lib/ethdev/rte_ethdev.h -@@ -4420,6 +4420,26 @@ __rte_experimental - const char * - rte_eth_dev_rss_algo_name(enum rte_eth_hash_function rss_algo); - -+/** -+ * @warning -+ * @b EXPERIMENTAL: this API may change, or be removed, without prior notice. -+ * -+ * Get RSS hash algorithm by its name. -+ * -+ * @param name -+ * RSS hash algorithm. -+ * -+ * @param algo -+ * return the RSS hash algorithm found, @see rte_eth_hash_function. -+ * -+ * @return -+ * - (0) if successful. -+ * - (-EINVAL) if not found. -+ */ -+__rte_experimental -+int -+rte_eth_find_rss_algo(const char *name, uint32_t *algo); -+ - /** - * Add UDP tunneling port for a type of tunnel. - * -diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map -index 1867016054..44cbe04e9b 100644 ---- a/lib/ethdev/version.map -+++ b/lib/ethdev/version.map -@@ -268,6 +268,9 @@ EXPERIMENTAL { - - # added in 23.11 - rte_eth_dev_rss_algo_name; -+ -+ # added in 24.03 -+ rte_eth_find_rss_algo; - }; - - INTERNAL { --- -2.33.0 - diff --git a/0410-app-testpmd-support-set-RSS-hash-algorithm.patch b/0410-app-testpmd-support-set-RSS-hash-algorithm.patch deleted file mode 100644 index c9a0140..0000000 --- a/0410-app-testpmd-support-set-RSS-hash-algorithm.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 57956d5be671d99089e2ac8e16b8f21adced950c Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Fri, 1 Dec 2023 16:52:54 +0800 -Subject: [PATCH 410/410] app/testpmd: support set RSS hash algorithm - -[ upstream commit 7516242a7c7fc7a5adbfbd7d71b4f28ebdb26ffb ] - -Since API rte_eth_dev_rss_hash_update() supports setting RSS hash -algorithm, add new command to support it: - -testpmd> port config 0 rss-hash-algo symmetric_toeplitz - -Signed-off-by: Jie Hai -Reviewed-by: Huisong Li -Reviewed-by: Ferruh Yigit ---- - app/test-pmd/cmdline.c | 81 +++++++++++++++++++++ - doc/guides/testpmd_app_ug/testpmd_funcs.rst | 11 +++ - 2 files changed, 92 insertions(+) - -diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c -index c641e1f338..ae0b47de72 100644 ---- a/app/test-pmd/cmdline.c -+++ b/app/test-pmd/cmdline.c -@@ -814,6 +814,10 @@ static void cmd_help_long_parsed(void *parsed_result, - "port config port-id rss reta (hash,queue)[,(hash,queue)]\n" - " Set the RSS redirection table.\n\n" - -+ "port config (port_id) rss-hash-algo (default|simple_xor|toeplitz|" -+ "symmetric_toeplitz|symmetric_toeplitz_sort)\n" -+ " Set the RSS hash algorithm.\n\n" -+ - "port config (port_id) dcb vt (on|off) (traffic_class)" - " pfc (on|off)\n" - " Set the DCB mode.\n\n" -@@ -2408,6 +2412,82 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = { - }, - }; - -+/* *** configure rss hash algorithm *** */ -+struct cmd_config_rss_hash_algo { -+ cmdline_fixed_string_t port; -+ cmdline_fixed_string_t config; -+ portid_t port_id; -+ cmdline_fixed_string_t rss_hash_algo; -+ cmdline_fixed_string_t algo; -+}; -+ -+static void -+cmd_config_rss_hash_algo_parsed(void *parsed_result, -+ __rte_unused struct cmdline *cl, -+ __rte_unused void *data) -+{ -+ struct cmd_config_rss_hash_algo *res = parsed_result; -+ uint8_t rss_key[RSS_HASH_KEY_LENGTH]; -+ struct rte_eth_rss_conf rss_conf; -+ uint32_t algorithm; -+ int ret; -+ -+ rss_conf.rss_key_len = RSS_HASH_KEY_LENGTH; -+ rss_conf.rss_key = rss_key; -+ ret = rte_eth_dev_rss_hash_conf_get(res->port_id, &rss_conf); -+ if (ret != 0) { -+ fprintf(stderr, "failed to get port %u RSS configuration\n", -+ res->port_id); -+ return; -+ } -+ -+ algorithm = (uint32_t)rss_conf.algorithm; -+ ret = rte_eth_find_rss_algo(res->algo, &algorithm); -+ if (ret != 0) { -+ fprintf(stderr, "port %u configured invalid RSS hash algorithm: %s\n", -+ res->port_id, res->algo); -+ return; -+ } -+ -+ ret = rte_eth_dev_rss_hash_update(res->port_id, &rss_conf); -+ if (ret != 0) { -+ fprintf(stderr, "failed to set port %u RSS hash algorithm\n", -+ res->port_id); -+ return; -+ } -+} -+ -+static cmdline_parse_token_string_t cmd_config_rss_hash_algo_port = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_algo, port, "port"); -+static cmdline_parse_token_string_t cmd_config_rss_hash_algo_config = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_algo, config, -+ "config"); -+static cmdline_parse_token_num_t cmd_config_rss_hash_algo_port_id = -+ TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_algo, port_id, -+ RTE_UINT16); -+static cmdline_parse_token_string_t cmd_config_rss_hash_algo_rss_hash_algo = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_algo, -+ rss_hash_algo, "rss-hash-algo"); -+static cmdline_parse_token_string_t cmd_config_rss_hash_algo_algo = -+ TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_algo, algo, -+ "default#simple_xor#toeplitz#" -+ "symmetric_toeplitz#symmetric_toeplitz_sort"); -+ -+static cmdline_parse_inst_t cmd_config_rss_hash_algo = { -+ .f = cmd_config_rss_hash_algo_parsed, -+ .data = NULL, -+ .help_str = "port config rss-hash-algo " -+ "default|simple_xor|toeplitz|symmetric_toeplitz|symmetric_toeplitz_sort", -+ .tokens = { -+ (void *)&cmd_config_rss_hash_algo_port, -+ (void *)&cmd_config_rss_hash_algo_config, -+ (void *)&cmd_config_rss_hash_algo_port_id, -+ (void *)&cmd_config_rss_hash_algo_rss_hash_algo, -+ (void *)&cmd_config_rss_hash_algo_algo, -+ NULL, -+ }, -+}; -+ - /* *** cleanup txq mbufs *** */ - struct cmd_cleanup_txq_mbufs_result { - cmdline_fixed_string_t port; -@@ -18084,6 +18164,7 @@ cmdline_parse_ctx_t main_ctx[] = { - (cmdline_parse_inst_t *)&cmd_showport_rss_hash_key, - (cmdline_parse_inst_t *)&cmd_showport_rss_hash_algo, - (cmdline_parse_inst_t *)&cmd_config_rss_hash_key, -+ (cmdline_parse_inst_t *)&cmd_config_rss_hash_algo, - (cmdline_parse_inst_t *)&cmd_cleanup_txq_mbufs, - (cmdline_parse_inst_t *)&cmd_dump, - (cmdline_parse_inst_t *)&cmd_dump_one, -diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -index 226569c545..86938d53ee 100644 ---- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst -+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst -@@ -2445,6 +2445,17 @@ hash of input [IP] packets received on port:: - ipv6-udp-ex ) - -+ -+port config rss hash algorithm -+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+To configure the RSS hash algorithm used to compute the RSS -+hash of input packets received on port:: -+ -+ testpmd> port config rss-hash-algo (default|\ -+ simple_xor|toeplitz|symmetric_toeplitz|\ -+ symmetric_toeplitz_sort) -+ - port cleanup txq mbufs - ~~~~~~~~~~~~~~~~~~~~~~ - --- -2.33.0 - diff --git a/0411-net-hns3-refactor-VF-mailbox-message-struct.patch b/0411-net-hns3-refactor-VF-mailbox-message-struct.patch deleted file mode 100644 index 104f987..0000000 --- a/0411-net-hns3-refactor-VF-mailbox-message-struct.patch +++ /dev/null @@ -1,279 +0,0 @@ -From 10811666ad563ba191fcb3b219ab3586caaae239 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 14:55:05 +0800 -Subject: [PATCH 411/418] net/hns3: refactor VF mailbox message struct - -[ upstream commit 93b77446190f0034c4996cfc84771d0b1c08b9ae ] - -The data region in VF to PF mbx memssage command is -used to communicate with PF driver. And this data -region exists as an array. As a result, some complicated -feature commands, like setting promisc mode, map/unmap -ring vector and setting VLAN id, have to use magic number -to set them. This isn't good for maintenance of driver. -So this patch refactors these messages by extracting an -hns3_vf_to_pf_msg structure. - -In addition, the PF link change event message is reported -by the firmware and is reported in hns3_mbx_vf_to_pf_cmd -format, it also needs to be modified. - -Fixes: 463e748964f5 ("net/hns3: support mailbox") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev_vf.c | 54 ++++++++++++++--------------- - drivers/net/hns3/hns3_mbx.c | 24 ++++++------- - drivers/net/hns3/hns3_mbx.h | 56 ++++++++++++++++++++++--------- - 3 files changed, 76 insertions(+), 58 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index db1a30aff0..83dacbaec7 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -335,11 +335,12 @@ hns3vf_set_promisc_mode(struct hns3_hw *hw, bool en_bc_pmc, - * the packets with vlan tag in promiscuous mode. - */ - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MBX_VF_TO_PF, false); -- req->msg[0] = HNS3_MBX_SET_PROMISC_MODE; -- req->msg[1] = en_bc_pmc ? 1 : 0; -- req->msg[2] = en_uc_pmc ? 1 : 0; -- req->msg[3] = en_mc_pmc ? 1 : 0; -- req->msg[4] = hw->promisc_mode == HNS3_LIMIT_PROMISC_MODE ? 1 : 0; -+ req->msg.code = HNS3_MBX_SET_PROMISC_MODE; -+ req->msg.en_bc = en_bc_pmc ? 1 : 0; -+ req->msg.en_uc = en_uc_pmc ? 1 : 0; -+ req->msg.en_mc = en_mc_pmc ? 1 : 0; -+ req->msg.en_limit_promisc = -+ hw->promisc_mode == HNS3_LIMIT_PROMISC_MODE ? 1 : 0; - - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) -@@ -428,30 +429,28 @@ hns3vf_bind_ring_with_vector(struct hns3_hw *hw, uint16_t vector_id, - bool mmap, enum hns3_ring_type queue_type, - uint16_t queue_id) - { -- struct hns3_vf_bind_vector_msg bind_msg; -+#define HNS3_RING_VERCTOR_DATA_SIZE 14 -+ struct hns3_vf_to_pf_msg req = {0}; - const char *op_str; -- uint16_t code; - int ret; - -- memset(&bind_msg, 0, sizeof(bind_msg)); -- code = mmap ? HNS3_MBX_MAP_RING_TO_VECTOR : -+ req.code = mmap ? HNS3_MBX_MAP_RING_TO_VECTOR : - HNS3_MBX_UNMAP_RING_TO_VECTOR; -- bind_msg.vector_id = (uint8_t)vector_id; -+ req.vector_id = (uint8_t)vector_id; -+ req.ring_num = 1; - - if (queue_type == HNS3_RING_TYPE_RX) -- bind_msg.param[0].int_gl_index = HNS3_RING_GL_RX; -+ req.ring_param[0].int_gl_index = HNS3_RING_GL_RX; - else -- bind_msg.param[0].int_gl_index = HNS3_RING_GL_TX; -- -- bind_msg.param[0].ring_type = queue_type; -- bind_msg.ring_num = 1; -- bind_msg.param[0].tqp_index = queue_id; -+ req.ring_param[0].int_gl_index = HNS3_RING_GL_TX; -+ req.ring_param[0].ring_type = queue_type; -+ req.ring_param[0].tqp_index = queue_id; - op_str = mmap ? "Map" : "Unmap"; -- ret = hns3_send_mbx_msg(hw, code, 0, (uint8_t *)&bind_msg, -- sizeof(bind_msg), false, NULL, 0); -+ ret = hns3_send_mbx_msg(hw, req.code, 0, (uint8_t *)&req.vector_id, -+ HNS3_RING_VERCTOR_DATA_SIZE, false, NULL, 0); - if (ret) -- hns3_err(hw, "%s TQP %u fail, vector_id is %u, ret is %d.", -- op_str, queue_id, bind_msg.vector_id, ret); -+ hns3_err(hw, "%s TQP %u fail, vector_id is %u, ret = %d.", -+ op_str, queue_id, req.vector_id, ret); - - return ret; - } -@@ -1031,19 +1030,16 @@ hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status, - static int - hns3vf_vlan_filter_configure(struct hns3_adapter *hns, uint16_t vlan_id, int on) - { --#define HNS3VF_VLAN_MBX_MSG_LEN 5 -+ struct hns3_mbx_vlan_filter vlan_filter = {0}; - struct hns3_hw *hw = &hns->hw; -- uint8_t msg_data[HNS3VF_VLAN_MBX_MSG_LEN]; -- uint16_t proto = htons(RTE_ETHER_TYPE_VLAN); -- uint8_t is_kill = on ? 0 : 1; - -- msg_data[0] = is_kill; -- memcpy(&msg_data[1], &vlan_id, sizeof(vlan_id)); -- memcpy(&msg_data[3], &proto, sizeof(proto)); -+ vlan_filter.is_kill = on ? 0 : 1; -+ vlan_filter.proto = rte_cpu_to_le_16(RTE_ETHER_TYPE_VLAN); -+ vlan_filter.vlan_id = rte_cpu_to_le_16(vlan_id); - - return hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, HNS3_MBX_VLAN_FILTER, -- msg_data, HNS3VF_VLAN_MBX_MSG_LEN, true, NULL, -- 0); -+ (uint8_t *)&vlan_filter, sizeof(vlan_filter), -+ true, NULL, 0); - } - - static int -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index f1743c195e..ad5ec555b3 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -11,8 +11,6 @@ - #include "hns3_intr.h" - #include "hns3_rxtx.h" - --#define HNS3_CMD_CODE_OFFSET 2 -- - static const struct errno_respcode_map err_code_map[] = { - {0, 0}, - {1, -EPERM}, -@@ -127,29 +125,30 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - struct hns3_mbx_vf_to_pf_cmd *req; - struct hns3_cmd_desc desc; - bool is_ring_vector_msg; -- int offset; - int ret; - - req = (struct hns3_mbx_vf_to_pf_cmd *)desc.data; - - /* first two bytes are reserved for code & subcode */ -- if (msg_len > (HNS3_MBX_MAX_MSG_SIZE - HNS3_CMD_CODE_OFFSET)) { -+ if (msg_len > HNS3_MBX_MSG_MAX_DATA_SIZE) { - hns3_err(hw, - "VF send mbx msg fail, msg len %u exceeds max payload len %d", -- msg_len, HNS3_MBX_MAX_MSG_SIZE - HNS3_CMD_CODE_OFFSET); -+ msg_len, HNS3_MBX_MSG_MAX_DATA_SIZE); - return -EINVAL; - } - - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MBX_VF_TO_PF, false); -- req->msg[0] = code; -+ req->msg.code = code; - is_ring_vector_msg = (code == HNS3_MBX_MAP_RING_TO_VECTOR) || - (code == HNS3_MBX_UNMAP_RING_TO_VECTOR) || - (code == HNS3_MBX_GET_RING_VECTOR_MAP); - if (!is_ring_vector_msg) -- req->msg[1] = subcode; -+ req->msg.subcode = subcode; - if (msg_data) { -- offset = is_ring_vector_msg ? 1 : HNS3_CMD_CODE_OFFSET; -- memcpy(&req->msg[offset], msg_data, msg_len); -+ if (is_ring_vector_msg) -+ memcpy(&req->msg.vector_id, msg_data, msg_len); -+ else -+ memcpy(&req->msg.data, msg_data, msg_len); - } - - /* synchronous send */ -@@ -296,11 +295,8 @@ static void - hns3pf_handle_link_change_event(struct hns3_hw *hw, - struct hns3_mbx_vf_to_pf_cmd *req) - { --#define LINK_STATUS_OFFSET 1 --#define LINK_FAIL_CODE_OFFSET 2 -- -- if (!req->msg[LINK_STATUS_OFFSET]) -- hns3_link_fail_parse(hw, req->msg[LINK_FAIL_CODE_OFFSET]); -+ if (!req->msg.link_status) -+ hns3_link_fail_parse(hw, req->msg.link_fail_code); - - hns3_update_linkstatus_and_event(hw, true); - } -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index 4a328802b9..59fb73abcc 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -89,7 +89,6 @@ enum hns3_mbx_link_fail_subcode { - HNS3_MBX_LF_XSFP_ABSENT, - }; - --#define HNS3_MBX_MAX_MSG_SIZE 16 - #define HNS3_MBX_MAX_RESP_DATA_SIZE 8 - #define HNS3_MBX_DEF_TIME_LIMIT_MS 500 - -@@ -107,6 +106,46 @@ struct hns3_mbx_resp_status { - uint8_t additional_info[HNS3_MBX_MAX_RESP_DATA_SIZE]; - }; - -+struct hns3_ring_chain_param { -+ uint8_t ring_type; -+ uint8_t tqp_index; -+ uint8_t int_gl_index; -+}; -+ -+struct hns3_mbx_vlan_filter { -+ uint8_t is_kill; -+ uint16_t vlan_id; -+ uint16_t proto; -+} __rte_packed; -+ -+#define HNS3_MBX_MSG_MAX_DATA_SIZE 14 -+#define HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM 4 -+struct hns3_vf_to_pf_msg { -+ uint8_t code; -+ union { -+ struct { -+ uint8_t subcode; -+ uint8_t data[HNS3_MBX_MSG_MAX_DATA_SIZE]; -+ }; -+ struct { -+ uint8_t en_bc; -+ uint8_t en_uc; -+ uint8_t en_mc; -+ uint8_t en_limit_promisc; -+ }; -+ struct { -+ uint8_t vector_id; -+ uint8_t ring_num; -+ struct hns3_ring_chain_param -+ ring_param[HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM]; -+ }; -+ struct { -+ uint8_t link_status; -+ uint8_t link_fail_code; -+ }; -+ }; -+}; -+ - struct errno_respcode_map { - uint16_t resp_code; - int err_no; -@@ -122,7 +161,7 @@ struct hns3_mbx_vf_to_pf_cmd { - uint8_t msg_len; - uint8_t rsv2; - uint16_t match_id; -- uint8_t msg[HNS3_MBX_MAX_MSG_SIZE]; -+ struct hns3_vf_to_pf_msg msg; - }; - - struct hns3_mbx_pf_to_vf_cmd { -@@ -134,19 +173,6 @@ struct hns3_mbx_pf_to_vf_cmd { - uint16_t msg[8]; - }; - --struct hns3_ring_chain_param { -- uint8_t ring_type; -- uint8_t tqp_index; -- uint8_t int_gl_index; --}; -- --#define HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM 4 --struct hns3_vf_bind_vector_msg { -- uint8_t vector_id; -- uint8_t ring_num; -- struct hns3_ring_chain_param param[HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM]; --}; -- - struct hns3_pf_rst_done_cmd { - uint8_t pf_rst_done; - uint8_t rsv[23]; --- -2.41.0.windows.2 - diff --git a/0412-net-hns3-refactor-PF-mailbox-message-struct.patch b/0412-net-hns3-refactor-PF-mailbox-message-struct.patch deleted file mode 100644 index 6813cf2..0000000 --- a/0412-net-hns3-refactor-PF-mailbox-message-struct.patch +++ /dev/null @@ -1,195 +0,0 @@ -From 2327ddc1fff5cad218300b62086d5f56687a0c45 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 14:55:06 +0800 -Subject: [PATCH 412/418] net/hns3: refactor PF mailbox message struct - -[ upstream commit 603de8068b6ac709c704b9cf0349a9a90ce0d38b ] - -The data region in PF to VF mbx memssage command is used -to communicate with VF driver. And this data region exists -as an array. As a result, some complicated feature commands, -like mailbox response, link change event, close promisc mode, -reset request and update pvid state, have to use magic number -to set them. This isn't good for maintenance of driver. So -this patch refactors these messages by extracting an -hns3_pf_to_vf_msg structure. - -Fixes: 463e748964f5 ("net/hns3: support mailbox") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_mbx.c | 38 ++++++++++++++++++------------------- - drivers/net/hns3/hns3_mbx.h | 25 +++++++++++++++++++++++- - 2 files changed, 43 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index ad5ec555b3..c90f5d59ba 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -192,17 +192,17 @@ static void - hns3vf_handle_link_change_event(struct hns3_hw *hw, - struct hns3_mbx_pf_to_vf_cmd *req) - { -+ struct hns3_mbx_link_status *link_info = -+ (struct hns3_mbx_link_status *)req->msg.msg_data; - uint8_t link_status, link_duplex; -- uint16_t *msg_q = req->msg; - uint8_t support_push_lsc; - uint32_t link_speed; - -- memcpy(&link_speed, &msg_q[2], sizeof(link_speed)); -- link_status = rte_le_to_cpu_16(msg_q[1]); -- link_duplex = (uint8_t)rte_le_to_cpu_16(msg_q[4]); -- hns3vf_update_link_status(hw, link_status, link_speed, -- link_duplex); -- support_push_lsc = (*(uint8_t *)&msg_q[5]) & 1u; -+ link_status = (uint8_t)rte_le_to_cpu_16(link_info->link_status); -+ link_speed = rte_le_to_cpu_32(link_info->speed); -+ link_duplex = (uint8_t)rte_le_to_cpu_16(link_info->duplex); -+ hns3vf_update_link_status(hw, link_status, link_speed, link_duplex); -+ support_push_lsc = (link_info->flag) & 1u; - hns3vf_update_push_lsc_cap(hw, support_push_lsc); - } - -@@ -211,7 +211,6 @@ hns3_handle_asserting_reset(struct hns3_hw *hw, - struct hns3_mbx_pf_to_vf_cmd *req) - { - enum hns3_reset_level reset_level; -- uint16_t *msg_q = req->msg; - - /* - * PF has asserted reset hence VF should go in pending -@@ -219,7 +218,7 @@ hns3_handle_asserting_reset(struct hns3_hw *hw, - * has been completely reset. After this stack should - * eventually be re-initialized. - */ -- reset_level = rte_le_to_cpu_16(msg_q[1]); -+ reset_level = rte_le_to_cpu_16(req->msg.reset_level); - hns3_atomic_set_bit(reset_level, &hw->reset.pending); - - hns3_warn(hw, "PF inform reset level %d", reset_level); -@@ -241,8 +240,9 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - * to match the request. - */ - if (req->match_id == resp->match_id) { -- resp->resp_status = hns3_resp_to_errno(req->msg[3]); -- memcpy(resp->additional_info, &req->msg[4], -+ resp->resp_status = -+ hns3_resp_to_errno(req->msg.resp_status); -+ memcpy(resp->additional_info, &req->msg.resp_data, - HNS3_MBX_MAX_RESP_DATA_SIZE); - rte_io_wmb(); - resp->received_match_resp = true; -@@ -255,7 +255,8 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - * support copy request's match_id to its response. So VF follows the - * original scheme to process. - */ -- msg_data = (uint32_t)req->msg[1] << HNS3_MBX_RESP_CODE_OFFSET | req->msg[2]; -+ msg_data = (uint32_t)req->msg.vf_mbx_msg_code << -+ HNS3_MBX_RESP_CODE_OFFSET | req->msg.vf_mbx_msg_subcode; - if (resp->req_msg_data != msg_data) { - hns3_warn(hw, - "received response tag (%u) is mismatched with requested tag (%u)", -@@ -263,8 +264,8 @@ hns3_handle_mbx_response(struct hns3_hw *hw, struct hns3_mbx_pf_to_vf_cmd *req) - return; - } - -- resp->resp_status = hns3_resp_to_errno(req->msg[3]); -- memcpy(resp->additional_info, &req->msg[4], -+ resp->resp_status = hns3_resp_to_errno(req->msg.resp_status); -+ memcpy(resp->additional_info, &req->msg.resp_data, - HNS3_MBX_MAX_RESP_DATA_SIZE); - rte_io_wmb(); - resp->received_match_resp = true; -@@ -305,8 +306,7 @@ static void - hns3_update_port_base_vlan_info(struct hns3_hw *hw, - struct hns3_mbx_pf_to_vf_cmd *req) - { --#define PVID_STATE_OFFSET 1 -- uint16_t new_pvid_state = req->msg[PVID_STATE_OFFSET] ? -+ uint16_t new_pvid_state = req->msg.pvid_state ? - HNS3_PORT_BASE_VLAN_ENABLE : HNS3_PORT_BASE_VLAN_DISABLE; - /* - * Currently, hardware doesn't support more than two layers VLAN offload -@@ -355,7 +355,7 @@ hns3_handle_mbx_msg_out_intr(struct hns3_hw *hw) - while (next_to_use != tail) { - desc = &crq->desc[next_to_use]; - req = (struct hns3_mbx_pf_to_vf_cmd *)desc->data; -- opcode = req->msg[0] & 0xff; -+ opcode = req->msg.code & 0xff; - - flag = rte_le_to_cpu_16(crq->desc[next_to_use].flag); - if (!hns3_get_bit(flag, HNS3_CMDQ_RX_OUTVLD_B)) -@@ -428,7 +428,7 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw) - - desc = &crq->desc[crq->next_to_use]; - req = (struct hns3_mbx_pf_to_vf_cmd *)desc->data; -- opcode = req->msg[0] & 0xff; -+ opcode = req->msg.code & 0xff; - - flag = rte_le_to_cpu_16(crq->desc[crq->next_to_use].flag); - if (unlikely(!hns3_get_bit(flag, HNS3_CMDQ_RX_OUTVLD_B))) { -@@ -484,7 +484,7 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw) - * hns3 PF kernel driver, VF driver will receive this - * mailbox message from PF driver. - */ -- hns3_handle_promisc_info(hw, req->msg[1]); -+ hns3_handle_promisc_info(hw, req->msg.promisc_en); - break; - default: - hns3_err(hw, "received unsupported(%u) mbx msg", -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index 59fb73abcc..09780fcebd 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -118,6 +118,13 @@ struct hns3_mbx_vlan_filter { - uint16_t proto; - } __rte_packed; - -+struct hns3_mbx_link_status { -+ uint16_t link_status; -+ uint32_t speed; -+ uint16_t duplex; -+ uint8_t flag; -+} __rte_packed; -+ - #define HNS3_MBX_MSG_MAX_DATA_SIZE 14 - #define HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM 4 - struct hns3_vf_to_pf_msg { -@@ -146,6 +153,22 @@ struct hns3_vf_to_pf_msg { - }; - }; - -+struct hns3_pf_to_vf_msg { -+ uint16_t code; -+ union { -+ struct { -+ uint16_t vf_mbx_msg_code; -+ uint16_t vf_mbx_msg_subcode; -+ uint16_t resp_status; -+ uint8_t resp_data[HNS3_MBX_MAX_RESP_DATA_SIZE]; -+ }; -+ uint16_t promisc_en; -+ uint16_t reset_level; -+ uint16_t pvid_state; -+ uint8_t msg_data[HNS3_MBX_MSG_MAX_DATA_SIZE]; -+ }; -+}; -+ - struct errno_respcode_map { - uint16_t resp_code; - int err_no; -@@ -170,7 +193,7 @@ struct hns3_mbx_pf_to_vf_cmd { - uint8_t msg_len; - uint8_t rsv1; - uint16_t match_id; -- uint16_t msg[8]; -+ struct hns3_pf_to_vf_msg msg; - }; - - struct hns3_pf_rst_done_cmd { --- -2.41.0.windows.2 - diff --git a/0413-net-hns3-refactor-send-mailbox-function.patch b/0413-net-hns3-refactor-send-mailbox-function.patch deleted file mode 100644 index 8763f48..0000000 --- a/0413-net-hns3-refactor-send-mailbox-function.patch +++ /dev/null @@ -1,526 +0,0 @@ -From f87d448eb2105d7be30bef7a01fc6182e846a4fd Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 14:55:07 +0800 -Subject: [PATCH 413/418] net/hns3: refactor send mailbox function - -[ upstream commit 15aab7018e0fcdfd9a4429078c5d9edcfda7c570 ] - -The 'hns3_send_mbx_msg' function has following problem: -1. the name is vague, missing caller indication -2. too many input parameters because the filling messages - are placed in commands the send command. - -Therefore, a common interface is encapsulated to fill in -the mailbox message before sending it. - -Fixes: 463e748964f5 ("net/hns3: support mailbox") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev_vf.c | 141 ++++++++++++++++++------------ - drivers/net/hns3/hns3_mbx.c | 50 ++++------- - drivers/net/hns3/hns3_mbx.h | 8 +- - drivers/net/hns3/hns3_rxtx.c | 18 ++-- - 4 files changed, 116 insertions(+), 101 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 83dacbaec7..ef294cf03d 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -172,11 +172,13 @@ hns3vf_add_uc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - { - /* mac address was checked by upper level interface */ - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_UNICAST, -- HNS3_MBX_MAC_VLAN_UC_ADD, mac_addr->addr_bytes, -- RTE_ETHER_ADDR_LEN, false, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_UNICAST, -+ HNS3_MBX_MAC_VLAN_UC_ADD); -+ memcpy(req.data, mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - mac_addr); -@@ -191,12 +193,13 @@ hns3vf_remove_uc_mac_addr(struct hns3_hw *hw, struct rte_ether_addr *mac_addr) - { - /* mac address was checked by upper level interface */ - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_UNICAST, -- HNS3_MBX_MAC_VLAN_UC_REMOVE, -- mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN, -- false, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_UNICAST, -+ HNS3_MBX_MAC_VLAN_UC_REMOVE); -+ memcpy(req.data, mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - mac_addr); -@@ -215,6 +218,7 @@ hns3vf_set_default_mac_addr(struct rte_eth_dev *dev, - struct rte_ether_addr *old_addr; - uint8_t addr_bytes[HNS3_TWO_ETHER_ADDR_LEN]; /* for 2 MAC addresses */ - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct hns3_vf_to_pf_msg req; - int ret; - - /* -@@ -227,9 +231,10 @@ hns3vf_set_default_mac_addr(struct rte_eth_dev *dev, - memcpy(&addr_bytes[RTE_ETHER_ADDR_LEN], old_addr->addr_bytes, - RTE_ETHER_ADDR_LEN); - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_UNICAST, -- HNS3_MBX_MAC_VLAN_UC_MODIFY, addr_bytes, -- HNS3_TWO_ETHER_ADDR_LEN, true, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_UNICAST, -+ HNS3_MBX_MAC_VLAN_UC_MODIFY); -+ memcpy(req.data, addr_bytes, HNS3_TWO_ETHER_ADDR_LEN); -+ ret = hns3vf_mbx_send(hw, &req, true, NULL, 0); - if (ret) { - /* - * The hns3 VF PMD depends on the hns3 PF kernel ethdev -@@ -266,12 +271,13 @@ hns3vf_add_mc_mac_addr(struct hns3_hw *hw, - struct rte_ether_addr *mac_addr) - { - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_MULTICAST, -- HNS3_MBX_MAC_VLAN_MC_ADD, -- mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN, false, -- NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_MULTICAST, -+ HNS3_MBX_MAC_VLAN_MC_ADD); -+ memcpy(req.data, mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - mac_addr); -@@ -287,12 +293,13 @@ hns3vf_remove_mc_mac_addr(struct hns3_hw *hw, - struct rte_ether_addr *mac_addr) - { - char mac_str[RTE_ETHER_ADDR_FMT_SIZE]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_MULTICAST, -- HNS3_MBX_MAC_VLAN_MC_REMOVE, -- mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN, false, -- NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_MULTICAST, -+ HNS3_MBX_MAC_VLAN_MC_REMOVE); -+ memcpy(req.data, mac_addr->addr_bytes, RTE_ETHER_ADDR_LEN); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) { - hns3_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE, - mac_addr); -@@ -429,7 +436,6 @@ hns3vf_bind_ring_with_vector(struct hns3_hw *hw, uint16_t vector_id, - bool mmap, enum hns3_ring_type queue_type, - uint16_t queue_id) - { --#define HNS3_RING_VERCTOR_DATA_SIZE 14 - struct hns3_vf_to_pf_msg req = {0}; - const char *op_str; - int ret; -@@ -446,8 +452,7 @@ hns3vf_bind_ring_with_vector(struct hns3_hw *hw, uint16_t vector_id, - req.ring_param[0].ring_type = queue_type; - req.ring_param[0].tqp_index = queue_id; - op_str = mmap ? "Map" : "Unmap"; -- ret = hns3_send_mbx_msg(hw, req.code, 0, (uint8_t *)&req.vector_id, -- HNS3_RING_VERCTOR_DATA_SIZE, false, NULL, 0); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) - hns3_err(hw, "%s TQP %u fail, vector_id is %u, ret = %d.", - op_str, queue_id, req.vector_id, ret); -@@ -533,10 +538,12 @@ hns3vf_dev_configure(struct rte_eth_dev *dev) - static int - hns3vf_config_mtu(struct hns3_hw *hw, uint16_t mtu) - { -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_MTU, 0, (const uint8_t *)&mtu, -- sizeof(mtu), true, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_MTU, 0); -+ memcpy(req.data, &mtu, sizeof(mtu)); -+ ret = hns3vf_mbx_send(hw, &req, true, NULL, 0); - if (ret) - hns3_err(hw, "Failed to set mtu (%u) for vf: %d", mtu, ret); - -@@ -712,12 +719,13 @@ hns3vf_get_push_lsc_cap(struct hns3_hw *hw) - uint16_t val = HNS3_PF_PUSH_LSC_CAP_NOT_SUPPORTED; - uint16_t exp = HNS3_PF_PUSH_LSC_CAP_UNKNOWN; - struct hns3_vf *vf = HNS3_DEV_HW_TO_VF(hw); -+ struct hns3_vf_to_pf_msg req; - - __atomic_store_n(&vf->pf_push_lsc_cap, HNS3_PF_PUSH_LSC_CAP_UNKNOWN, - __ATOMIC_RELEASE); - -- (void)hns3_send_mbx_msg(hw, HNS3_MBX_GET_LINK_STATUS, 0, NULL, 0, false, -- NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_LINK_STATUS, 0); -+ (void)hns3vf_mbx_send(hw, &req, false, NULL, 0); - - while (remain_ms > 0) { - rte_delay_ms(HNS3_POLL_RESPONE_MS); -@@ -812,12 +820,13 @@ hns3vf_check_tqp_info(struct hns3_hw *hw) - static int - hns3vf_get_port_base_vlan_filter_state(struct hns3_hw *hw) - { -+ struct hns3_vf_to_pf_msg req; - uint8_t resp_msg; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, -- HNS3_MBX_GET_PORT_BASE_VLAN_STATE, NULL, 0, -- true, &resp_msg, sizeof(resp_msg)); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_VLAN, -+ HNS3_MBX_GET_PORT_BASE_VLAN_STATE); -+ ret = hns3vf_mbx_send(hw, &req, true, &resp_msg, sizeof(resp_msg)); - if (ret) { - if (ret == -ETIME) { - /* -@@ -858,10 +867,12 @@ hns3vf_get_queue_info(struct hns3_hw *hw) - { - #define HNS3VF_TQPS_RSS_INFO_LEN 6 - uint8_t resp_msg[HNS3VF_TQPS_RSS_INFO_LEN]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_GET_QINFO, 0, NULL, 0, true, -- resp_msg, HNS3VF_TQPS_RSS_INFO_LEN); -+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_QINFO, 0); -+ ret = hns3vf_mbx_send(hw, &req, true, -+ resp_msg, HNS3VF_TQPS_RSS_INFO_LEN); - if (ret) { - PMD_INIT_LOG(ERR, "Failed to get tqp info from PF: %d", ret); - return ret; -@@ -899,10 +910,11 @@ hns3vf_get_basic_info(struct hns3_hw *hw) - { - uint8_t resp_msg[HNS3_MBX_MAX_RESP_DATA_SIZE]; - struct hns3_basic_info *basic_info; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_GET_BASIC_INFO, 0, NULL, 0, -- true, resp_msg, sizeof(resp_msg)); -+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_BASIC_INFO, 0); -+ ret = hns3vf_mbx_send(hw, &req, true, resp_msg, sizeof(resp_msg)); - if (ret) { - hns3_err(hw, "failed to get basic info from PF, ret = %d.", - ret); -@@ -922,10 +934,11 @@ static int - hns3vf_get_host_mac_addr(struct hns3_hw *hw) - { - uint8_t host_mac[RTE_ETHER_ADDR_LEN]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_GET_MAC_ADDR, 0, NULL, 0, -- true, host_mac, RTE_ETHER_ADDR_LEN); -+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_MAC_ADDR, 0); -+ ret = hns3vf_mbx_send(hw, &req, true, host_mac, RTE_ETHER_ADDR_LEN); - if (ret) { - hns3_err(hw, "Failed to get mac addr from PF: %d", ret); - return ret; -@@ -974,6 +987,7 @@ static void - hns3vf_request_link_info(struct hns3_hw *hw) - { - struct hns3_vf *vf = HNS3_DEV_HW_TO_VF(hw); -+ struct hns3_vf_to_pf_msg req; - bool send_req; - int ret; - -@@ -985,8 +999,8 @@ hns3vf_request_link_info(struct hns3_hw *hw) - if (!send_req) - return; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_GET_LINK_STATUS, 0, NULL, 0, false, -- NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_LINK_STATUS, 0); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) { - hns3_err(hw, "failed to fetch link status, ret = %d", ret); - return; -@@ -1030,16 +1044,18 @@ hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status, - static int - hns3vf_vlan_filter_configure(struct hns3_adapter *hns, uint16_t vlan_id, int on) - { -- struct hns3_mbx_vlan_filter vlan_filter = {0}; -+ struct hns3_mbx_vlan_filter *vlan_filter; -+ struct hns3_vf_to_pf_msg req = {0}; - struct hns3_hw *hw = &hns->hw; - -- vlan_filter.is_kill = on ? 0 : 1; -- vlan_filter.proto = rte_cpu_to_le_16(RTE_ETHER_TYPE_VLAN); -- vlan_filter.vlan_id = rte_cpu_to_le_16(vlan_id); -+ req.code = HNS3_MBX_SET_VLAN; -+ req.subcode = HNS3_MBX_VLAN_FILTER; -+ vlan_filter = (struct hns3_mbx_vlan_filter *)req.data; -+ vlan_filter->is_kill = on ? 0 : 1; -+ vlan_filter->proto = rte_cpu_to_le_16(RTE_ETHER_TYPE_VLAN); -+ vlan_filter->vlan_id = rte_cpu_to_le_16(vlan_id); - -- return hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, HNS3_MBX_VLAN_FILTER, -- (uint8_t *)&vlan_filter, sizeof(vlan_filter), -- true, NULL, 0); -+ return hns3vf_mbx_send(hw, &req, true, NULL, 0); - } - - static int -@@ -1068,6 +1084,7 @@ hns3vf_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) - static int - hns3vf_en_vlan_filter(struct hns3_hw *hw, bool enable) - { -+ struct hns3_vf_to_pf_msg req; - uint8_t msg_data; - int ret; - -@@ -1075,9 +1092,10 @@ hns3vf_en_vlan_filter(struct hns3_hw *hw, bool enable) - return 0; - - msg_data = enable ? 1 : 0; -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, -- HNS3_MBX_ENABLE_VLAN_FILTER, &msg_data, -- sizeof(msg_data), true, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_VLAN, -+ HNS3_MBX_ENABLE_VLAN_FILTER); -+ memcpy(req.data, &msg_data, sizeof(msg_data)); -+ ret = hns3vf_mbx_send(hw, &req, true, NULL, 0); - if (ret) - hns3_err(hw, "%s vlan filter failed, ret = %d.", - enable ? "enable" : "disable", ret); -@@ -1088,12 +1106,15 @@ hns3vf_en_vlan_filter(struct hns3_hw *hw, bool enable) - static int - hns3vf_en_hw_strip_rxvtag(struct hns3_hw *hw, bool enable) - { -+ struct hns3_vf_to_pf_msg req; - uint8_t msg_data; - int ret; - - msg_data = enable ? 1 : 0; -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_SET_VLAN, HNS3_MBX_VLAN_RX_OFF_CFG, -- &msg_data, sizeof(msg_data), false, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_VLAN, -+ HNS3_MBX_VLAN_RX_OFF_CFG); -+ memcpy(req.data, &msg_data, sizeof(msg_data)); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) - hns3_err(hw, "vf %s strip failed, ret = %d.", - enable ? "enable" : "disable", ret); -@@ -1237,11 +1258,13 @@ hns3vf_dev_configure_vlan(struct rte_eth_dev *dev) - static int - hns3vf_set_alive(struct hns3_hw *hw, bool alive) - { -+ struct hns3_vf_to_pf_msg req; - uint8_t msg_data; - - msg_data = alive ? 1 : 0; -- return hns3_send_mbx_msg(hw, HNS3_MBX_SET_ALIVE, 0, &msg_data, -- sizeof(msg_data), false, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_SET_ALIVE, 0); -+ memcpy(req.data, &msg_data, sizeof(msg_data)); -+ return hns3vf_mbx_send(hw, &req, false, NULL, 0); - } - - static void -@@ -1249,11 +1272,12 @@ hns3vf_keep_alive_handler(void *param) - { - struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param; - struct hns3_adapter *hns = eth_dev->data->dev_private; -+ struct hns3_vf_to_pf_msg req; - struct hns3_hw *hw = &hns->hw; - int ret; - -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_KEEP_ALIVE, 0, NULL, 0, -- false, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_KEEP_ALIVE, 0); -+ ret = hns3vf_mbx_send(hw, &req, false, NULL, 0); - if (ret) - hns3_err(hw, "VF sends keeping alive cmd failed(=%d)", - ret); -@@ -1392,9 +1416,11 @@ hns3vf_init_hardware(struct hns3_adapter *hns) - static int - hns3vf_clear_vport_list(struct hns3_hw *hw) - { -- return hns3_send_mbx_msg(hw, HNS3_MBX_HANDLE_VF_TBL, -- HNS3_MBX_VPORT_LIST_CLEAR, NULL, 0, false, -- NULL, 0); -+ struct hns3_vf_to_pf_msg req; -+ -+ hns3vf_mbx_setup(&req, HNS3_MBX_HANDLE_VF_TBL, -+ HNS3_MBX_VPORT_LIST_CLEAR); -+ return hns3vf_mbx_send(hw, &req, false, NULL, 0); - } - - static int -@@ -1863,12 +1889,13 @@ hns3vf_wait_hardware_ready(struct hns3_adapter *hns) - static int - hns3vf_prepare_reset(struct hns3_adapter *hns) - { -+ struct hns3_vf_to_pf_msg req; - struct hns3_hw *hw = &hns->hw; - int ret; - - if (hw->reset.level == HNS3_VF_FUNC_RESET) { -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_RESET, 0, NULL, -- 0, true, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_RESET, 0); -+ ret = hns3vf_mbx_send(hw, &req, true, NULL, 0); - if (ret) - return ret; - } -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index c90f5d59ba..43195ff184 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -24,6 +24,14 @@ static const struct errno_respcode_map err_code_map[] = { - {95, -EOPNOTSUPP}, - }; - -+void -+hns3vf_mbx_setup(struct hns3_vf_to_pf_msg *req, uint8_t code, uint8_t subcode) -+{ -+ memset(req, 0, sizeof(struct hns3_vf_to_pf_msg)); -+ req->code = code; -+ req->subcode = subcode; -+} -+ - static int - hns3_resp_to_errno(uint16_t resp_code) - { -@@ -118,45 +126,24 @@ hns3_mbx_prepare_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode) - } - - int --hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, -- const uint8_t *msg_data, uint8_t msg_len, bool need_resp, -- uint8_t *resp_data, uint16_t resp_len) -+hns3vf_mbx_send(struct hns3_hw *hw, -+ struct hns3_vf_to_pf_msg *req, bool need_resp, -+ uint8_t *resp_data, uint16_t resp_len) - { -- struct hns3_mbx_vf_to_pf_cmd *req; -+ struct hns3_mbx_vf_to_pf_cmd *cmd; - struct hns3_cmd_desc desc; -- bool is_ring_vector_msg; - int ret; - -- req = (struct hns3_mbx_vf_to_pf_cmd *)desc.data; -- -- /* first two bytes are reserved for code & subcode */ -- if (msg_len > HNS3_MBX_MSG_MAX_DATA_SIZE) { -- hns3_err(hw, -- "VF send mbx msg fail, msg len %u exceeds max payload len %d", -- msg_len, HNS3_MBX_MSG_MAX_DATA_SIZE); -- return -EINVAL; -- } -- - hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_MBX_VF_TO_PF, false); -- req->msg.code = code; -- is_ring_vector_msg = (code == HNS3_MBX_MAP_RING_TO_VECTOR) || -- (code == HNS3_MBX_UNMAP_RING_TO_VECTOR) || -- (code == HNS3_MBX_GET_RING_VECTOR_MAP); -- if (!is_ring_vector_msg) -- req->msg.subcode = subcode; -- if (msg_data) { -- if (is_ring_vector_msg) -- memcpy(&req->msg.vector_id, msg_data, msg_len); -- else -- memcpy(&req->msg.data, msg_data, msg_len); -- } -+ cmd = (struct hns3_mbx_vf_to_pf_cmd *)desc.data; -+ cmd->msg = *req; - - /* synchronous send */ - if (need_resp) { -- req->mbx_need_resp |= HNS3_MBX_NEED_RESP_BIT; -+ cmd->mbx_need_resp |= HNS3_MBX_NEED_RESP_BIT; - rte_spinlock_lock(&hw->mbx_resp.lock); -- hns3_mbx_prepare_resp(hw, code, subcode); -- req->match_id = hw->mbx_resp.match_id; -+ hns3_mbx_prepare_resp(hw, req->code, req->subcode); -+ cmd->match_id = hw->mbx_resp.match_id; - ret = hns3_cmd_send(hw, &desc, 1); - if (ret) { - rte_spinlock_unlock(&hw->mbx_resp.lock); -@@ -165,7 +152,8 @@ hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - return ret; - } - -- ret = hns3_get_mbx_resp(hw, code, subcode, resp_data, resp_len); -+ ret = hns3_get_mbx_resp(hw, req->code, req->subcode, -+ resp_data, resp_len); - rte_spinlock_unlock(&hw->mbx_resp.lock); - } else { - /* asynchronous send */ -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index 09780fcebd..2952b96ab6 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -208,7 +208,9 @@ struct hns3_pf_rst_done_cmd { - - struct hns3_hw; - void hns3_dev_handle_mbx_msg(struct hns3_hw *hw); --int hns3_send_mbx_msg(struct hns3_hw *hw, uint16_t code, uint16_t subcode, -- const uint8_t *msg_data, uint8_t msg_len, bool need_resp, -- uint8_t *resp_data, uint16_t resp_len); -+void hns3vf_mbx_setup(struct hns3_vf_to_pf_msg *req, -+ uint8_t code, uint8_t subcode); -+int hns3vf_mbx_send(struct hns3_hw *hw, -+ struct hns3_vf_to_pf_msg *req_msg, bool need_resp, -+ uint8_t *resp_data, uint16_t resp_len); - #endif /* HNS3_MBX_H */ -diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c -index 8b7c469685..81edd5258d 100644 ---- a/drivers/net/hns3/hns3_rxtx.c -+++ b/drivers/net/hns3/hns3_rxtx.c -@@ -686,13 +686,12 @@ hns3pf_reset_tqp(struct hns3_hw *hw, uint16_t queue_id) - static int - hns3vf_reset_tqp(struct hns3_hw *hw, uint16_t queue_id) - { -- uint8_t msg_data[2]; -+ struct hns3_vf_to_pf_msg req; - int ret; - -- memcpy(msg_data, &queue_id, sizeof(uint16_t)); -- -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_QUEUE_RESET, 0, msg_data, -- sizeof(msg_data), true, NULL, 0); -+ hns3vf_mbx_setup(&req, HNS3_MBX_QUEUE_RESET, 0); -+ memcpy(req.data, &queue_id, sizeof(uint16_t)); -+ ret = hns3vf_mbx_send(hw, &req, true, NULL, 0); - if (ret) - hns3_err(hw, "fail to reset tqp, queue_id = %u, ret = %d.", - queue_id, ret); -@@ -769,15 +768,14 @@ static int - hns3vf_reset_all_tqps(struct hns3_hw *hw) - { - #define HNS3VF_RESET_ALL_TQP_DONE 1U -+ struct hns3_vf_to_pf_msg req; - uint8_t reset_status; -- uint8_t msg_data[2]; - int ret; - uint16_t i; - -- memset(msg_data, 0, sizeof(msg_data)); -- ret = hns3_send_mbx_msg(hw, HNS3_MBX_QUEUE_RESET, 0, msg_data, -- sizeof(msg_data), true, &reset_status, -- sizeof(reset_status)); -+ hns3vf_mbx_setup(&req, HNS3_MBX_QUEUE_RESET, 0); -+ ret = hns3vf_mbx_send(hw, &req, true, -+ &reset_status, sizeof(reset_status)); - if (ret) { - hns3_err(hw, "fail to send rcb reset mbx, ret = %d.", ret); - return ret; --- -2.41.0.windows.2 - diff --git a/0414-net-hns3-refactor-handle-mailbox-function.patch b/0414-net-hns3-refactor-handle-mailbox-function.patch deleted file mode 100644 index c99b434..0000000 --- a/0414-net-hns3-refactor-handle-mailbox-function.patch +++ /dev/null @@ -1,188 +0,0 @@ -From e14d65b5e752ddf4849b7cc13fe4afba0758af45 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 14:55:08 +0800 -Subject: [PATCH 414/418] net/hns3: refactor handle mailbox function - -[ upstream commit 575bc7fc621b17605c790e6c23739122c8e38fad ] - -The mailbox messages of the PF and VF are processed in -the same function. The PF and VF call the same function -to process the messages. This code is excessive coupling -and isn't good for maintenance. Therefore, this patch -separates the interfaces that handle PF mailbox message -and handle VF mailbox message. - -Fixes: 463e748964f5 ("net/hns3: support mailbox") -Fixes: 109e4dd1bd7a ("net/hns3: get link state change through mailbox") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev.c | 2 +- - drivers/net/hns3/hns3_ethdev_vf.c | 4 +- - drivers/net/hns3/hns3_mbx.c | 69 ++++++++++++++++++++++++------- - drivers/net/hns3/hns3_mbx.h | 3 +- - 4 files changed, 58 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 2d4af9f3ea..8e4f8ded3f 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -380,7 +380,7 @@ hns3_interrupt_handler(void *param) - hns3_warn(hw, "received reset interrupt"); - hns3_schedule_reset(hns); - } else if (event_cause == HNS3_VECTOR0_EVENT_MBX) { -- hns3_dev_handle_mbx_msg(hw); -+ hns3pf_handle_mbx_msg(hw); - } else if (event_cause != HNS3_VECTOR0_EVENT_PTP) { - hns3_warn(hw, "received unknown event: vector0_int_stat:0x%x " - "ras_int_stat:0x%x cmdq_int_stat:0x%x", -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index ef294cf03d..71c93e0221 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -686,7 +686,7 @@ hns3vf_interrupt_handler(void *param) - hns3_schedule_reset(hns); - break; - case HNS3VF_VECTOR0_EVENT_MBX: -- hns3_dev_handle_mbx_msg(hw); -+ hns3vf_handle_mbx_msg(hw); - break; - default: - break; -@@ -736,7 +736,7 @@ hns3vf_get_push_lsc_cap(struct hns3_hw *hw) - * driver has to actively handle the HNS3_MBX_LINK_STAT_CHANGE - * mailbox from PF driver to get this capability. - */ -- hns3_dev_handle_mbx_msg(hw); -+ hns3vf_handle_mbx_msg(hw); - if (__atomic_load_n(&vf->pf_push_lsc_cap, __ATOMIC_ACQUIRE) != - HNS3_PF_PUSH_LSC_CAP_UNKNOWN) - break; -diff --git a/drivers/net/hns3/hns3_mbx.c b/drivers/net/hns3/hns3_mbx.c -index 43195ff184..9cdbc1668a 100644 ---- a/drivers/net/hns3/hns3_mbx.c -+++ b/drivers/net/hns3/hns3_mbx.c -@@ -78,7 +78,7 @@ hns3_get_mbx_resp(struct hns3_hw *hw, uint16_t code, uint16_t subcode, - return -EIO; - } - -- hns3_dev_handle_mbx_msg(hw); -+ hns3vf_handle_mbx_msg(hw); - rte_delay_us(HNS3_WAIT_RESP_US); - - if (hw->mbx_resp.received_match_resp) -@@ -372,9 +372,57 @@ hns3_handle_mbx_msg_out_intr(struct hns3_hw *hw) - } - - void --hns3_dev_handle_mbx_msg(struct hns3_hw *hw) -+hns3pf_handle_mbx_msg(struct hns3_hw *hw) -+{ -+ struct hns3_cmq_ring *crq = &hw->cmq.crq; -+ struct hns3_mbx_vf_to_pf_cmd *req; -+ struct hns3_cmd_desc *desc; -+ uint16_t flag; -+ -+ rte_spinlock_lock(&hw->cmq.crq.lock); -+ -+ while (!hns3_cmd_crq_empty(hw)) { -+ if (__atomic_load_n(&hw->reset.disable_cmd, __ATOMIC_RELAXED)) { -+ rte_spinlock_unlock(&hw->cmq.crq.lock); -+ return; -+ } -+ desc = &crq->desc[crq->next_to_use]; -+ req = (struct hns3_mbx_vf_to_pf_cmd *)desc->data; -+ -+ flag = rte_le_to_cpu_16(crq->desc[crq->next_to_use].flag); -+ if (unlikely(!hns3_get_bit(flag, HNS3_CMDQ_RX_OUTVLD_B))) { -+ hns3_warn(hw, -+ "dropped invalid mailbox message, code = %u", -+ req->msg.code); -+ -+ /* dropping/not processing this invalid message */ -+ crq->desc[crq->next_to_use].flag = 0; -+ hns3_mbx_ring_ptr_move_crq(crq); -+ continue; -+ } -+ -+ switch (req->msg.code) { -+ case HNS3_MBX_PUSH_LINK_STATUS: -+ hns3pf_handle_link_change_event(hw, req); -+ break; -+ default: -+ hns3_err(hw, "received unsupported(%u) mbx msg", -+ req->msg.code); -+ break; -+ } -+ crq->desc[crq->next_to_use].flag = 0; -+ hns3_mbx_ring_ptr_move_crq(crq); -+ } -+ -+ /* Write back CMDQ_RQ header pointer, IMP need this pointer */ -+ hns3_write_dev(hw, HNS3_CMDQ_RX_HEAD_REG, crq->next_to_use); -+ -+ rte_spinlock_unlock(&hw->cmq.crq.lock); -+} -+ -+void -+hns3vf_handle_mbx_msg(struct hns3_hw *hw) - { -- struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - struct hns3_cmq_ring *crq = &hw->cmq.crq; - struct hns3_mbx_pf_to_vf_cmd *req; - struct hns3_cmd_desc *desc; -@@ -385,7 +433,7 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw) - rte_spinlock_lock(&hw->cmq.crq.lock); - - handle_out = (rte_eal_process_type() != RTE_PROC_PRIMARY || -- !rte_thread_is_intr()) && hns->is_vf; -+ !rte_thread_is_intr()); - if (handle_out) { - /* - * Currently, any threads in the primary and secondary processes -@@ -430,8 +478,7 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw) - continue; - } - -- handle_out = hns->is_vf && desc->opcode == 0; -- if (handle_out) { -+ if (desc->opcode == 0) { - /* Message already processed by other thread */ - crq->desc[crq->next_to_use].flag = 0; - hns3_mbx_ring_ptr_move_crq(crq); -@@ -448,16 +495,6 @@ hns3_dev_handle_mbx_msg(struct hns3_hw *hw) - case HNS3_MBX_ASSERTING_RESET: - hns3_handle_asserting_reset(hw, req); - break; -- case HNS3_MBX_PUSH_LINK_STATUS: -- /* -- * This message is reported by the firmware and is -- * reported in 'struct hns3_mbx_vf_to_pf_cmd' format. -- * Therefore, we should cast the req variable to -- * 'struct hns3_mbx_vf_to_pf_cmd' and then process it. -- */ -- hns3pf_handle_link_change_event(hw, -- (struct hns3_mbx_vf_to_pf_cmd *)req); -- break; - case HNS3_MBX_PUSH_VLAN_INFO: - /* - * When the PVID configuration status of VF device is -diff --git a/drivers/net/hns3/hns3_mbx.h b/drivers/net/hns3/hns3_mbx.h -index 2952b96ab6..2b6cb8f513 100644 ---- a/drivers/net/hns3/hns3_mbx.h -+++ b/drivers/net/hns3/hns3_mbx.h -@@ -207,7 +207,8 @@ struct hns3_pf_rst_done_cmd { - ((crq)->next_to_use = ((crq)->next_to_use + 1) % (crq)->desc_num) - - struct hns3_hw; --void hns3_dev_handle_mbx_msg(struct hns3_hw *hw); -+void hns3pf_handle_mbx_msg(struct hns3_hw *hw); -+void hns3vf_handle_mbx_msg(struct hns3_hw *hw); - void hns3vf_mbx_setup(struct hns3_vf_to_pf_msg *req, - uint8_t code, uint8_t subcode); - int hns3vf_mbx_send(struct hns3_hw *hw, --- -2.41.0.windows.2 - diff --git a/0415-net-hns3-fix-VF-multiple-count-on-one-reset.patch b/0415-net-hns3-fix-VF-multiple-count-on-one-reset.patch deleted file mode 100644 index 8fb6d12..0000000 --- a/0415-net-hns3-fix-VF-multiple-count-on-one-reset.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 345f6630543215a309ded095232d10391cdcdd33 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 15:44:14 +0800 -Subject: [PATCH 415/418] net/hns3: fix VF multiple count on one reset - -[ upstream commit 8ea1c20299ed74c6c5b527e961141cc429e17992 ] - -There are two ways for the hns3 VF driver to know reset event, namely, -interrupt task and periodic detection task. For the latter, the real -reset process will delay several microseconds to execute. Both tasks -cause the count to increase by 1. - -However, the periodic detection task also detects a reset event A -after interrupt task receive a reset event A. As a result, the reset -count will be double. - -So this patch adds the comparison of reset level for VF in case of the -multiple reset count. - -Fixes: a5475d61fa34 ("net/hns3: support VF") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev_vf.c | 44 ++++++++++++++++++++----------- - 1 file changed, 29 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c -index 71c93e0221..7be5a6706d 100644 ---- a/drivers/net/hns3/hns3_ethdev_vf.c -+++ b/drivers/net/hns3/hns3_ethdev_vf.c -@@ -637,13 +637,8 @@ hns3vf_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - val = hns3_read_dev(hw, HNS3_VF_RST_ING); - hns3_write_dev(hw, HNS3_VF_RST_ING, val | HNS3_VF_RST_ING_BIT); - val = cmdq_stat_reg & ~BIT(HNS3_VECTOR0_RST_INT_B); -- if (clearval) { -- hw->reset.stats.global_cnt++; -- hns3_warn(hw, "Global reset detected, clear reset status"); -- } else { -- hns3_schedule_delayed_reset(hns); -- hns3_warn(hw, "Global reset detected, don't clear reset status"); -- } -+ hw->reset.stats.global_cnt++; -+ hns3_warn(hw, "Global reset detected, clear reset status"); - - ret = HNS3VF_VECTOR0_EVENT_RST; - goto out; -@@ -658,9 +653,9 @@ hns3vf_check_event_cause(struct hns3_adapter *hns, uint32_t *clearval) - - val = 0; - ret = HNS3VF_VECTOR0_EVENT_OTHER; -+ - out: -- if (clearval) -- *clearval = val; -+ *clearval = val; - return ret; - } - -@@ -1797,11 +1792,25 @@ is_vf_reset_done(struct hns3_hw *hw) - return true; - } - -+static enum hns3_reset_level -+hns3vf_detect_reset_event(struct hns3_hw *hw) -+{ -+ enum hns3_reset_level reset = HNS3_NONE_RESET; -+ uint32_t cmdq_stat_reg; -+ -+ cmdq_stat_reg = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_STAT_REG); -+ if (BIT(HNS3_VECTOR0_RST_INT_B) & cmdq_stat_reg) -+ reset = HNS3_VF_RESET; -+ -+ return reset; -+} -+ - bool - hns3vf_is_reset_pending(struct hns3_adapter *hns) - { -+ enum hns3_reset_level last_req; - struct hns3_hw *hw = &hns->hw; -- enum hns3_reset_level reset; -+ enum hns3_reset_level new_req; - - /* - * According to the protocol of PCIe, FLR to a PF device resets the PF -@@ -1824,13 +1833,18 @@ hns3vf_is_reset_pending(struct hns3_adapter *hns) - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return false; - -- hns3vf_check_event_cause(hns, NULL); -- reset = hns3vf_get_reset_level(hw, &hw->reset.pending); -- if (hw->reset.level != HNS3_NONE_RESET && reset != HNS3_NONE_RESET && -- hw->reset.level < reset) { -- hns3_warn(hw, "High level reset %d is pending", reset); -+ new_req = hns3vf_detect_reset_event(hw); -+ if (new_req == HNS3_NONE_RESET) -+ return false; -+ -+ last_req = hns3vf_get_reset_level(hw, &hw->reset.pending); -+ if (last_req == HNS3_NONE_RESET || last_req < new_req) { -+ __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ hns3_schedule_delayed_reset(hns); -+ hns3_warn(hw, "High level reset detected, delay do reset"); - return true; - } -+ - return false; - } - --- -2.41.0.windows.2 - diff --git a/0416-net-hns3-fix-disable-command-with-firmware.patch b/0416-net-hns3-fix-disable-command-with-firmware.patch deleted file mode 100644 index f24e227..0000000 --- a/0416-net-hns3-fix-disable-command-with-firmware.patch +++ /dev/null @@ -1,48 +0,0 @@ -From be5fbe07c062de14b65841bda52ca1c080de15e3 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 15:44:15 +0800 -Subject: [PATCH 417/418] net/hns3: fix disable command with firmware - -[ upstream commit cb37b1f1f84428d0a31437fad6e0909b799b5b4d ] - -Disable command only when need to delay handle reset. -This patch fixes it. - -Fixes: 5be38fc6c0fc ("net/hns3: fix multiple reset detected log") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev.c | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index b151a62ccc..3de7a5f813 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5552,18 +5552,16 @@ hns3_detect_reset_event(struct hns3_hw *hw) - - last_req = hns3_get_reset_level(hns, &hw->reset.pending); - vector0_intr_state = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); -- if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_intr_state) { -- __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_intr_state) - new_req = HNS3_IMP_RESET; -- } else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_intr_state) { -- __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_intr_state) - new_req = HNS3_GLOBAL_RESET; -- } - - if (new_req == HNS3_NONE_RESET) - return HNS3_NONE_RESET; - - if (last_req == HNS3_NONE_RESET || last_req < new_req) { -+ __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); - hns3_schedule_delayed_reset(hns); - hns3_warn(hw, "High level reset detected, delay do reset"); - } --- -2.41.0.windows.2 - diff --git a/0417-net-hns3-fix-reset-level-comparison.patch b/0417-net-hns3-fix-reset-level-comparison.patch deleted file mode 100644 index a5e5885..0000000 --- a/0417-net-hns3-fix-reset-level-comparison.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 6bcb6ad4df79beb4dc097fbf2feb28627ce99083 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Fri, 8 Dec 2023 15:44:16 +0800 -Subject: [PATCH 418/418] net/hns3: fix reset level comparison - -[ upstream commit 0e929c0f6ba9a9ff56310bec3b2127237b0b08f4 ] - -Currently, there are two problems in hns3vf_is_reset_pending(): -1. The new detect reset level is not HNS3_NONE_RESET, but the - last reset level is HNS3_NONE_RESET, this function returns false. -2. Comparison between last_req and new_req is opposite. - -In addition, the reset level comparison in hns3_detect_reset_event() -is similar to the hns3vf_is_reset_pending(). So this patch fixes -above the problems and merges the logic of reset level comparison. - -Fixes: 5be38fc6c0fc ("net/hns3: fix multiple reset detected log") -Cc: stable@dpdk.org - -Signed-off-by: Dengdui Huang -Signed-off-by: Jie Hai ---- - drivers/net/hns3/hns3_ethdev.c | 22 +++++++--------------- - 1 file changed, 7 insertions(+), 15 deletions(-) - -diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c -index 3de7a5f813..c7a2147f39 100644 ---- a/drivers/net/hns3/hns3_ethdev.c -+++ b/drivers/net/hns3/hns3_ethdev.c -@@ -5545,27 +5545,15 @@ is_pf_reset_done(struct hns3_hw *hw) - static enum hns3_reset_level - hns3_detect_reset_event(struct hns3_hw *hw) - { -- struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); - enum hns3_reset_level new_req = HNS3_NONE_RESET; -- enum hns3_reset_level last_req; - uint32_t vector0_intr_state; - -- last_req = hns3_get_reset_level(hns, &hw->reset.pending); - vector0_intr_state = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); - if (BIT(HNS3_VECTOR0_IMPRESET_INT_B) & vector0_intr_state) - new_req = HNS3_IMP_RESET; - else if (BIT(HNS3_VECTOR0_GLOBALRESET_INT_B) & vector0_intr_state) - new_req = HNS3_GLOBAL_RESET; - -- if (new_req == HNS3_NONE_RESET) -- return HNS3_NONE_RESET; -- -- if (last_req == HNS3_NONE_RESET || last_req < new_req) { -- __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -- hns3_schedule_delayed_reset(hns); -- hns3_warn(hw, "High level reset detected, delay do reset"); -- } -- - return new_req; - } - -@@ -5584,10 +5572,14 @@ hns3_is_reset_pending(struct hns3_adapter *hns) - return false; - - new_req = hns3_detect_reset_event(hw); -+ if (new_req == HNS3_NONE_RESET) -+ return false; -+ - last_req = hns3_get_reset_level(hns, &hw->reset.pending); -- if (last_req != HNS3_NONE_RESET && new_req != HNS3_NONE_RESET && -- new_req < last_req) { -- hns3_warn(hw, "High level reset %d is pending", last_req); -+ if (last_req == HNS3_NONE_RESET || last_req < new_req) { -+ __atomic_store_n(&hw->reset.disable_cmd, 1, __ATOMIC_RELAXED); -+ hns3_schedule_delayed_reset(hns); -+ hns3_warn(hw, "High level reset detected, delay do reset"); - return true; - } - last_req = hns3_get_reset_level(hns, &hw->reset.request); --- -2.41.0.windows.2 - diff --git a/0418-net-hns3-don-t-support-QinQ-insert-for-VF.patch b/0418-net-hns3-don-t-support-QinQ-insert-for-VF.patch deleted file mode 100644 index a939673..0000000 --- a/0418-net-hns3-don-t-support-QinQ-insert-for-VF.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 283338986c32000d7e145e2fa6e4d9fb2b973cfd Mon Sep 17 00:00:00 2001 -From: Chengwen Feng -Date: Thu, 21 Dec 2023 09:12:26 +0800 -Subject: [PATCH] net/hns3: don't support QinQ insert for VF - -In the HIP08 platform, the PF driver will notify VF driver to update -the PVID state [1], and VF will declare support QinQ insert when PVID -is disabled. - -In the later platform (e.g. HIP09), the hardware has been improved, -so the PF driver will NOT notify VF driver to update the PVID state. - -However, the later platform still have constraint: PVID and QinQ insert -cannot be enabled at the same time, otherwise, the hardware discards -packets and reports an error interrupt. - -Plus, as far as we known, VF driver's users don't use the QinQ insert. - -Therefore, we declare that the VF driver don't support QinQ insert. - -[1] commit b4e4d7ac9f09 ("net/hns3: support setting VF PVID by PF driver") - -Cc: stable@dpdk.org - -Signed-off-by: Chengwen Feng ---- - drivers/net/hns3/hns3_common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/hns3/hns3_common.c b/drivers/net/hns3/hns3_common.c -index 0d6b2c65af..717649f259 100644 ---- a/drivers/net/hns3/hns3_common.c -+++ b/drivers/net/hns3/hns3_common.c -@@ -85,7 +85,7 @@ hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info) - RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE | - RTE_ETH_TX_OFFLOAD_VLAN_INSERT); - -- if (!hw->port_base_vlan_cfg.state) -+ if (!hns->is_vf && !hw->port_base_vlan_cfg.state) - info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_QINQ_INSERT; - - if (hns3_dev_get_support(hw, OUTER_UDP_CKSUM)) --- -2.41.0.windows.2 - diff --git a/1000-add-sw_64-support-not-upstream-modified.patch b/1000-add-sw_64-support-not-upstream-modified.patch deleted file mode 100644 index d7d6a5e..0000000 --- a/1000-add-sw_64-support-not-upstream-modified.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 90273829df4ae4059d1976cbb64989fb9c5d11c8 Mon Sep 17 00:00:00 2001 -From: herengui -Date: Wed, 30 Aug 2023 16:44:55 +0800 -Subject: [PATCH 1000/1001] add sw_64 support not upstream modified - -Signed-off-by: herengui ---- - app/test/test_xmmt_ops.h | 16 ++++++++++ - config/meson.build | 1 + - drivers/net/i40e/i40e_rxtx.c | 52 +++++++++++++++++++++++++++++++ - drivers/net/ixgbe/ixgbe_rxtx.c | 4 +-- - drivers/net/memif/rte_eth_memif.h | 2 ++ - drivers/net/tap/tap_bpf.h | 2 ++ - examples/l3fwd/l3fwd_em.c | 8 +++++ - examples/l3fwd/l3fwd_lpm.c | 8 +++++ - lib/lpm/rte_lpm.h | 2 ++ - meson.build | 2 ++ - 10 files changed, 95 insertions(+), 2 deletions(-) - -diff --git a/app/test/test_xmmt_ops.h b/app/test/test_xmmt_ops.h -index 21490e7..b969008 100644 ---- a/app/test/test_xmmt_ops.h -+++ b/app/test/test_xmmt_ops.h -@@ -61,6 +61,22 @@ vect_set_epi32(int i3, int i2, int i1, int i0) - - return data; - } -+ -+#elif defined(RTE_ARCH_SW_64) -+ -+#define vect_loadu_sil128(p) (*(xmm_t *)p) -+ -+static __rte_always_inline xmm_t -+vect_set_epi32(int i3, int i2, int i1, int i0) -+{ -+ uint64_t h = ((uint64_t)i2 & 0xffffffff) | ((uint64_t)i3 << 32); -+ uint64_t l = ((uint64_t)i0 & 0xffffffff) | ((uint64_t)i1 << 32); -+ -+ xmm_t data = {l,h}; -+ -+ return data; -+} -+ - #endif - - #endif /* _TEST_XMMT_OPS_H_ */ -diff --git a/config/meson.build b/config/meson.build -index 7e44983..d599995 100644 ---- a/config/meson.build -+++ b/config/meson.build -@@ -134,6 +134,7 @@ machine_args = [] - if host_machine.cpu_family().startswith('ppc') - machine_args += '-mcpu=' + cpu_instruction_set - machine_args += '-mtune=' + cpu_instruction_set -+elif host_machine.cpu_family().startswith('sw_64') - else - machine_args += '-march=' + cpu_instruction_set - endif -diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c -index 9a00a9b..f4cd2a3 100644 ---- a/drivers/net/i40e/i40e_rxtx.c -+++ b/drivers/net/i40e/i40e_rxtx.c -@@ -3606,6 +3606,58 @@ i40e_set_default_pctype_table(struct rte_eth_dev *dev) - } - } - -+#ifdef RTE_ARCH_SW_64 -+int -+i40e_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev) -+{ -+ return -1; -+} -+ -+uint16_t -+i40e_recv_pkts_vec( -+ void __rte_unused *rx_queue, -+ struct rte_mbuf __rte_unused **rx_pkts, -+ uint16_t __rte_unused nb_pkts) -+{ -+ return 0; -+} -+ -+uint16_t -+i40e_recv_scattered_pkts_vec( -+ void __rte_unused *rx_queue, -+ struct rte_mbuf __rte_unused **rx_pkts, -+ uint16_t __rte_unused nb_pkts) -+{ -+ return 0; -+} -+ -+int -+i40e_rxq_vec_setup(struct i40e_rx_queue __rte_unused *rxq) -+{ -+ return -1; -+} -+ -+int -+i40e_txq_vec_setup(struct i40e_tx_queue __rte_unused *txq) -+{ -+ return -1; -+} -+ -+void -+i40e_rx_queue_release_mbufs_vec(struct i40e_rx_queue __rte_unused*rxq) -+{ -+ return; -+} -+ -+uint16_t -+i40e_xmit_fixed_burst_vec(void __rte_unused * tx_queue, -+ struct rte_mbuf __rte_unused **tx_pkts, -+ uint16_t __rte_unused nb_pkts) -+{ -+ return 0; -+} -+#endif -+ - #ifndef CC_AVX2_SUPPORT - uint16_t - i40e_recv_pkts_vec_avx2(void __rte_unused *rx_queue, -diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c -index 60850f6..535737c 100644 ---- a/drivers/net/ixgbe/ixgbe_rxtx.c -+++ b/drivers/net/ixgbe/ixgbe_rxtx.c -@@ -5953,8 +5953,8 @@ ixgbe_config_rss_filter(struct rte_eth_dev *dev, - return 0; - } - --/* Stubs needed for linkage when RTE_ARCH_PPC_64 or RTE_ARCH_LOONGARCH is set */ --#if defined(RTE_ARCH_PPC_64) || defined(RTE_ARCH_LOONGARCH) -+/* Stubs needed for linkage when RTE_ARCH_PPC_64, RTE_ARCH_LOONGARCH or RTE_ARCH_SW_64 is set */ -+#if defined(RTE_ARCH_PPC_64) || defined(RTE_ARCH_LOONGARCH) || defined(RTE_ARCH_SW_64) - int - ixgbe_rx_vec_dev_conf_condition_check(struct rte_eth_dev __rte_unused *dev) - { -diff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h -index 864a498..77ed5cd 100644 ---- a/drivers/net/memif/rte_eth_memif.h -+++ b/drivers/net/memif/rte_eth_memif.h -@@ -180,6 +180,8 @@ const char *memif_version(void); - #define __NR_memfd_create 360 - #elif defined __i386__ - #define __NR_memfd_create 356 -+#elif defined __sw_64__ -+#define __NR_memfd_create 512 - #elif defined __loongarch__ - #define __NR_memfd_create 279 - #else -diff --git a/drivers/net/tap/tap_bpf.h b/drivers/net/tap/tap_bpf.h -index de7ab91..21a9006 100644 ---- a/drivers/net/tap/tap_bpf.h -+++ b/drivers/net/tap/tap_bpf.h -@@ -103,6 +103,8 @@ union bpf_attr { - # define __NR_bpf 361 - # elif defined(__loongarch__) - # define __NR_bpf 280 -+# elif defined(__sw_64__) -+# define __NR_bpf 170 - # else - # error __NR_bpf not defined - # endif -diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c -index 67e042f..df5186a 100644 ---- a/examples/l3fwd/l3fwd_em.c -+++ b/examples/l3fwd/l3fwd_em.c -@@ -278,6 +278,14 @@ em_mask_key(void *key, xmm_t mask) - - return vect_and(data, mask); - } -+#elif defined(RTE_ARCH_SW_64) -+static inline xmm_t -+em_mask_key(void *key, xmm_t mask) -+{ -+ xmm_t data = vect_load_128(key); -+ -+ return vect_and(data, mask); -+} - #else - #error No vector engine (SSE, NEON, ALTIVEC) available, check your toolchain - #endif -diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c -index 160a7c6..9e4258b 100644 ---- a/examples/l3fwd/l3fwd_lpm.c -+++ b/examples/l3fwd/l3fwd_lpm.c -@@ -28,6 +28,7 @@ - #include - - #include "l3fwd.h" -+#include "l3fwd_common.h" - #include "l3fwd_event.h" - - #include "l3fwd_route.h" -@@ -240,6 +241,7 @@ lpm_process_event_pkt(const struct lcore_conf *lconf, struct rte_mbuf *mbuf) - - struct rte_ether_hdr *eth_hdr = rte_pktmbuf_mtod(mbuf, - struct rte_ether_hdr *); -+#ifndef RTE_ARCH_SW_64 - #ifdef DO_RFC_1812_CHECKS - struct rte_ipv4_hdr *ipv4_hdr; - if (RTE_ETH_IS_IPV4_HDR(mbuf->packet_type)) { -@@ -257,6 +259,7 @@ lpm_process_event_pkt(const struct lcore_conf *lconf, struct rte_mbuf *mbuf) - --(ipv4_hdr->time_to_live); - ++(ipv4_hdr->hdr_checksum); - } -+#endif - #endif - /* dst addr */ - *(uint64_t *)ð_hdr->dst_addr = dest_eth_addr[mbuf->port]; -@@ -264,6 +267,11 @@ lpm_process_event_pkt(const struct lcore_conf *lconf, struct rte_mbuf *mbuf) - /* src addr */ - rte_ether_addr_copy(&ports_eth_addr[mbuf->port], - ð_hdr->src_addr); -+#ifdef RTE_ARCH_SW_64 -+ rfc1812_process(rte_pktmbuf_mtod_offset(mbuf, struct rte_ipv4_hdr *, -+ sizeof(struct rte_ether_hdr)), -+ &mbuf->port, mbuf->packet_type); -+#endif - #endif - return mbuf->port; - } -diff --git a/lib/lpm/rte_lpm.h b/lib/lpm/rte_lpm.h -index 49cfa5b..de3d3a0 100644 ---- a/lib/lpm/rte_lpm.h -+++ b/lib/lpm/rte_lpm.h -@@ -411,6 +411,8 @@ rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], - #include "rte_lpm_altivec.h" - #elif defined(RTE_ARCH_X86) - #include "rte_lpm_sse.h" -+#elif defined(RTE_ARCH_SW_64) -+#include "rte_lpm_sw.h" - #else - #include "rte_lpm_scalar.h" - #endif -diff --git a/meson.build b/meson.build -index 1052fba..baceafa 100644 ---- a/meson.build -+++ b/meson.build -@@ -46,6 +46,8 @@ elif host_machine.cpu_family().startswith('loongarch') - arch_subdir = 'loongarch' - elif host_machine.cpu_family().startswith('ppc') - arch_subdir = 'ppc' -+elif host_machine.cpu_family().startswith('sw_64') -+ arch_subdir = 'sw_64' - endif - - # configure the build, and make sure configs here and in config folder are --- -2.41.0 - diff --git a/1001-add-sw_64-support-not-upstream-new.patch b/1001-add-sw_64-support-not-upstream-new.patch deleted file mode 100644 index 1ddf848..0000000 --- a/1001-add-sw_64-support-not-upstream-new.patch +++ /dev/null @@ -1,1015 +0,0 @@ -From 9ffc05b778335e9e78ea2b9bd8ffe86dc982653f Mon Sep 17 00:00:00 2001 -From: herengui -Date: Wed, 30 Aug 2023 16:45:20 +0800 -Subject: [PATCH 1001/1001] add sw_64 support not upstream new - -Signed-off-by: herengui ---- - config/sw_64/meson.build | 12 ++ - config/sw_64/sw_64-sunway-linuxapp-gcc | 11 ++ - lib/eal/sw_64/include/meson.build | 22 ++++ - lib/eal/sw_64/include/rte_altivec.h | 22 ++++ - lib/eal/sw_64/include/rte_atomic.h | 48 ++++++++ - lib/eal/sw_64/include/rte_byteorder.h | 57 +++++++++ - lib/eal/sw_64/include/rte_cpuflags.h | 21 ++++ - lib/eal/sw_64/include/rte_cycles.h | 36 ++++++ - lib/eal/sw_64/include/rte_io.h | 15 +++ - lib/eal/sw_64/include/rte_mcslock.h | 18 +++ - lib/eal/sw_64/include/rte_memcpy.h | 62 ++++++++++ - lib/eal/sw_64/include/rte_pause.h | 21 ++++ - lib/eal/sw_64/include/rte_pflock.h | 18 +++ - lib/eal/sw_64/include/rte_power_intrinsics.h | 20 +++ - lib/eal/sw_64/include/rte_prefetch.h | 47 +++++++ - lib/eal/sw_64/include/rte_rwlock.h | 39 ++++++ - lib/eal/sw_64/include/rte_spinlock.h | 57 +++++++++ - lib/eal/sw_64/include/rte_ticketlock.h | 18 +++ - lib/eal/sw_64/include/rte_vect.h | 37 ++++++ - lib/eal/sw_64/meson.build | 11 ++ - lib/eal/sw_64/rte_cpuflags.c | 19 +++ - lib/eal/sw_64/rte_cycles.c | 7 ++ - lib/eal/sw_64/rte_hypervisor.c | 11 ++ - lib/eal/sw_64/rte_power_intrinsics.c | 53 ++++++++ - lib/lpm/rte_lpm_sw.h | 121 +++++++++++++++++++ - 25 files changed, 803 insertions(+) - create mode 100644 config/sw_64/meson.build - create mode 100644 config/sw_64/sw_64-sunway-linuxapp-gcc - create mode 100644 lib/eal/sw_64/include/meson.build - create mode 100644 lib/eal/sw_64/include/rte_altivec.h - create mode 100644 lib/eal/sw_64/include/rte_atomic.h - create mode 100644 lib/eal/sw_64/include/rte_byteorder.h - create mode 100644 lib/eal/sw_64/include/rte_cpuflags.h - create mode 100644 lib/eal/sw_64/include/rte_cycles.h - create mode 100644 lib/eal/sw_64/include/rte_io.h - create mode 100644 lib/eal/sw_64/include/rte_mcslock.h - create mode 100644 lib/eal/sw_64/include/rte_memcpy.h - create mode 100644 lib/eal/sw_64/include/rte_pause.h - create mode 100644 lib/eal/sw_64/include/rte_pflock.h - create mode 100644 lib/eal/sw_64/include/rte_power_intrinsics.h - create mode 100644 lib/eal/sw_64/include/rte_prefetch.h - create mode 100644 lib/eal/sw_64/include/rte_rwlock.h - create mode 100644 lib/eal/sw_64/include/rte_spinlock.h - create mode 100644 lib/eal/sw_64/include/rte_ticketlock.h - create mode 100644 lib/eal/sw_64/include/rte_vect.h - create mode 100644 lib/eal/sw_64/meson.build - create mode 100644 lib/eal/sw_64/rte_cpuflags.c - create mode 100644 lib/eal/sw_64/rte_cycles.c - create mode 100644 lib/eal/sw_64/rte_hypervisor.c - create mode 100644 lib/eal/sw_64/rte_power_intrinsics.c - create mode 100644 lib/lpm/rte_lpm_sw.h - -diff --git a/config/sw_64/meson.build b/config/sw_64/meson.build -new file mode 100644 -index 0000000..9575a5c ---- /dev/null -+++ b/config/sw_64/meson.build -@@ -0,0 +1,12 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2018 Luca Boccassi -+ -+if not dpdk_conf.get('RTE_ARCH_64') -+ error('Only 64-bit compiles are supported for this platform type') -+endif -+dpdk_conf.set('RTE_ARCH', 'sw_64') -+dpdk_conf.set('RTE_ARCH_SW_64', 1) -+dpdk_conf.set('RTE_MAX_LCORE', 1536) -+dpdk_conf.set('RTE_MAX_NUMA_NODES', 32) -+dpdk_conf.set('RTE_CACHE_LINE_SIZE', 128) -+dpdk_conf.set('RTE_FORCE_INTRINSICS', 'y') -diff --git a/config/sw_64/sw_64-sunway-linuxapp-gcc b/config/sw_64/sw_64-sunway-linuxapp-gcc -new file mode 100644 -index 0000000..d8b32bc ---- /dev/null -+++ b/config/sw_64/sw_64-sunway-linuxapp-gcc -@@ -0,0 +1,11 @@ -+[binaries] -+c = 'sw_64-linux-gcc' -+cpp = 'sw_64-linux-cpp' -+ar = 'sw_64-linux-gcc-ar' -+strip = 'sw_64-linux-strip' -+ -+[host_machine] -+system = 'linux' -+cpu_family = 'sw_64' -+cpu = 'sw_64' -+endian = 'little' -diff --git a/lib/eal/sw_64/include/meson.build b/lib/eal/sw_64/include/meson.build -new file mode 100644 -index 0000000..8230b26 ---- /dev/null -+++ b/lib/eal/sw_64/include/meson.build -@@ -0,0 +1,22 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2018 Luca Boccassi -+ -+arch_headers = files( -+ 'rte_byteorder.h', -+ 'rte_cycles.h', -+ 'rte_mcslock.h', -+ 'rte_pause.h', -+ 'rte_rwlock.h', -+ 'rte_ticketlock.h', -+ 'rte_atomic.h', -+ 'rte_cpuflags.h', -+ 'rte_io.h', -+ 'rte_memcpy.h', -+ 'rte_prefetch.h', -+ 'rte_spinlock.h', -+ 'rte_vect.h', -+ 'rte_power_intrinsics.h', -+ 'rte_pflock.h', -+) -+ -+install_headers(arch_headers, subdir: get_option('include_subdir_arch')) -diff --git a/lib/eal/sw_64/include/rte_altivec.h b/lib/eal/sw_64/include/rte_altivec.h -new file mode 100644 -index 0000000..1551a94 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_altivec.h -@@ -0,0 +1,22 @@ -+/* -+ * SPDX-License-Identifier: BSD-3-Clause -+ * Copyright (C) Mellanox 2020. -+ */ -+ -+#ifndef _RTE_ALTIVEC_H_ -+#define _RTE_ALTIVEC_H_ -+ -+/* To include altivec.h, GCC version must be >= 4.8 */ -+#include -+ -+/* -+ * Compilation workaround for PPC64 when AltiVec is fully enabled, e.g. std=c11. -+ * Otherwise there would be a type conflict between stdbool and altivec. -+ */ -+#if defined(__PPC64__) && !defined(__APPLE_ALTIVEC__) -+#undef bool -+/* redefine as in stdbool.h */ -+#define bool _Bool -+#endif -+ -+#endif /* _RTE_ALTIVEC_H_ */ -diff --git a/lib/eal/sw_64/include/rte_atomic.h b/lib/eal/sw_64/include/rte_atomic.h -new file mode 100644 -index 0000000..d25058b ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_atomic.h -@@ -0,0 +1,48 @@ -+#ifndef _RTE_ATOMIC_sw_64_H_ -+#define _RTE_ATOMIC_sw_64_H_ -+ -+#ifndef RTE_FORCE_INTRINSICS -+//# error Platform must be built with CONFIG_RTE_FORCE_INTRINSICS -+#endif -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_atomic.h" -+ -+#define swmb() asm volatile("memb": : :"memory") -+ -+#define rte_mb() swmb() -+ -+#define rte_wmb() swmb() -+ -+#define rte_rmb() swmb() -+ -+#define rte_smp_mb() swmb() -+ -+#define rte_smp_wmb() swmb() -+ -+#define rte_smp_rmb() swmb() -+ -+#define rte_io_mb() rte_mb() -+ -+#define rte_io_wmb() rte_wmb() -+ -+#define rte_io_rmb() rte_rmb() -+ -+#define rte_cio_rmb() rte_rmb() -+ -+#define rte_cio_wmb() rte_wmb() -+ -+static __rte_always_inline void -+rte_atomic_thread_fence(int memorder) -+{ -+ __atomic_thread_fence(memorder); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_ATOMIC_sw_64_H_ */ -diff --git a/lib/eal/sw_64/include/rte_byteorder.h b/lib/eal/sw_64/include/rte_byteorder.h -new file mode 100644 -index 0000000..3a0aad2 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_byteorder.h -@@ -0,0 +1,57 @@ -+#ifndef _RTE_BYTEORDER_sw_64_H_ -+#define _RTE_BYTEORDER_sw_64_H_ -+ -+#ifndef RTE_FORCE_INTRINSICS -+// # error Platform must be built with CONFIG_RTE_FORCE_INTRINSICS -+#endif -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_byteorder.h" -+#if !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) -+#define rte_bswap16(x) rte_constant_bswap16(x) -+#endif -+ -+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN -+#define rte_cpu_to_le_16(x) (x) -+#define rte_cpu_to_le_32(x) (x) -+#define rte_cpu_to_le_64(x) (x) -+ -+#define rte_cpu_to_be_16(x) rte_bswap16(x) -+#define rte_cpu_to_be_32(x) rte_bswap32(x) -+#define rte_cpu_to_be_64(x) rte_bswap64(x) -+ -+#define rte_le_to_cpu_16(x) (x) -+#define rte_le_to_cpu_32(x) (x) -+#define rte_le_to_cpu_64(x) (x) -+ -+#define rte_be_to_cpu_16(x) rte_bswap16(x) -+#define rte_be_to_cpu_32(x) rte_bswap32(x) -+#define rte_be_to_cpu_64(x) rte_bswap64(x) -+ -+#else /* RTE_BIG_ENDIAN */ -+ -+#define rte_cpu_to_le_16(x) rte_bswap16(x) -+#define rte_cpu_to_le_32(x) rte_bswap32(x) -+#define rte_cpu_to_le_64(x) rte_bswap64(x) -+ -+#define rte_cpu_to_be_16(x) (x) -+#define rte_cpu_to_be_32(x) (x) -+#define rte_cpu_to_be_64(x) (x) -+ -+#define rte_le_to_cpu_16(x) rte_bswap16(x) -+#define rte_le_to_cpu_32(x) rte_bswap32(x) -+#define rte_le_to_cpu_64(x) rte_bswap64(x) -+ -+#define rte_be_to_cpu_16(x) (x) -+#define rte_be_to_cpu_32(x) (x) -+#define rte_be_to_cpu_64(x) (x) -+#endif -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -diff --git a/lib/eal/sw_64/include/rte_cpuflags.h b/lib/eal/sw_64/include/rte_cpuflags.h -new file mode 100644 -index 0000000..94a3fc2 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_cpuflags.h -@@ -0,0 +1,21 @@ -+#ifndef _RTE_CPUFLAGS_sw_64_H_ -+#define _RTE_CPUFLAGS_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* Enumeration of all CPU features supported */ -+ -+enum rte_cpu_flag_t { -+ RTE_CPUFLAG_NUMFLAGS /**< This should always be the last! */ -+ }; -+ -+#include "generic/rte_cpuflags.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_CPUFLAGS_sw_64_H_ */ -+ -diff --git a/lib/eal/sw_64/include/rte_cycles.h b/lib/eal/sw_64/include/rte_cycles.h -new file mode 100644 -index 0000000..9564382 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_cycles.h -@@ -0,0 +1,36 @@ -+#ifndef _RTE_CYCLES_sw_64_H_ -+#define _RTE_CYCLES_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_cycles.h" -+ -+static inline uint64_t -+rte_rdtsc(void) -+{ -+ uint64_t u64_TSC; -+ asm volatile("RTC %0":"=r"(u64_TSC)); -+ return u64_TSC; -+} -+ -+static inline uint64_t -+rte_rdtsc_precise(void) -+{ -+ rte_mb(); -+ return rte_rdtsc(); -+} -+ -+static inline uint64_t -+rte_get_tsc_cycles(void) -+{ -+ return rte_rdtsc(); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_CYCLES_sw_64_H_ */ -+ -diff --git a/lib/eal/sw_64/include/rte_io.h b/lib/eal/sw_64/include/rte_io.h -new file mode 100644 -index 0000000..76f822e ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_io.h -@@ -0,0 +1,15 @@ -+#ifndef _RTE_IO_sw_64_H_ -+#define _RTE_IO_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_io.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_IO_sw_64_H_ */ -+ -diff --git a/lib/eal/sw_64/include/rte_mcslock.h b/lib/eal/sw_64/include/rte_mcslock.h -new file mode 100644 -index 0000000..a900443 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_mcslock.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2019 Arm Limited -+ */ -+ -+#ifndef _RTE_MCSLOCK_sw_64_H_ -+#define _RTE_MCSLOCK_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_mcslock.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_MCSLOCK_sw_64_H_ */ -diff --git a/lib/eal/sw_64/include/rte_memcpy.h b/lib/eal/sw_64/include/rte_memcpy.h -new file mode 100644 -index 0000000..45cccc1 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_memcpy.h -@@ -0,0 +1,62 @@ -+#ifndef _RTE_MEMCPY_sw_64_H_ -+#define _RTE_MEMCPY_sw_64_H_ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include -+ -+#include "generic/rte_memcpy.h" -+ -+static inline void -+rte_mov16(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 16); -+} -+ -+static inline void -+rte_mov32(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 32); -+} -+ -+static inline void -+rte_mov48(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 48); -+} -+ -+static inline void -+rte_mov64(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 64); -+} -+ -+static inline void -+rte_mov128(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 128); -+} -+ -+static inline void -+rte_mov256(uint8_t *dst, const uint8_t *src) -+{ -+ memcpy(dst, src, 256); -+} -+ -+#define rte_memcpy(d, s, n) memcpy((d), (s), (n)) -+ -+static inline void * -+rte_memcpy_func(void *dst, const void *src, size_t n) -+{ -+ return memcpy(dst, src, n); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_MEMCPY_sw_64_H_ */ -+ -+ -diff --git a/lib/eal/sw_64/include/rte_pause.h b/lib/eal/sw_64/include/rte_pause.h -new file mode 100644 -index 0000000..7798a3c ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_pause.h -@@ -0,0 +1,21 @@ -+#ifndef _RTE_PAUSE_sw_64_H_ -+#define _RTE_PAUSE_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include "generic/rte_pause.h" -+ -+static inline void rte_pause(void) -+{ -+ asm volatile("memb" ::: "memory"); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_PAUSE_sw_64_H_ */ -+ -diff --git a/lib/eal/sw_64/include/rte_pflock.h b/lib/eal/sw_64/include/rte_pflock.h -new file mode 100644 -index 0000000..bb9934e ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_pflock.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2021 Microsoft Corporation -+ */ -+ -+#ifndef _RTE_PFLOCK_ARM_H_ -+#define _RTE_PFLOCK_ARM_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_pflock.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_PFLOCK_ARM_H_ */ -diff --git a/lib/eal/sw_64/include/rte_power_intrinsics.h b/lib/eal/sw_64/include/rte_power_intrinsics.h -new file mode 100644 -index 0000000..c0e9ac2 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_power_intrinsics.h -@@ -0,0 +1,20 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2020 Intel Corporation -+ */ -+ -+#ifndef _RTE_POWER_INTRINSIC_PPC_H_ -+#define _RTE_POWER_INTRINSIC_PPC_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+ -+#include "generic/rte_power_intrinsics.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_POWER_INTRINSIC_PPC_H_ */ -diff --git a/lib/eal/sw_64/include/rte_prefetch.h b/lib/eal/sw_64/include/rte_prefetch.h -new file mode 100644 -index 0000000..3ff322a ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_prefetch.h -@@ -0,0 +1,47 @@ -+#ifndef _RTE_PREFETCH_sw_64_H_ -+#define _RTE_PREFETCH_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include -+#include "generic/rte_prefetch.h" -+ -+static inline void -+rte_prefetch0(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 3); -+} -+ -+static inline void -+rte_prefetch1(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 2); -+} -+ -+static inline void -+rte_prefetch2(const volatile void *p) -+{ -+ __builtin_prefetch((const void *)(uintptr_t)p, 0, 1); -+} -+ -+static inline void -+rte_prefetch_non_temporal(const volatile void *p) -+{ -+ /* non-temporal version not available, fallback to rte_prefetch0 */ -+ rte_prefetch0(p); -+} -+ -+__rte_experimental -+static inline void -+rte_cldemote(const volatile void *p) -+{ -+ RTE_SET_USED(p); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_PREFETCH_sw_64_H_ */ -diff --git a/lib/eal/sw_64/include/rte_rwlock.h b/lib/eal/sw_64/include/rte_rwlock.h -new file mode 100644 -index 0000000..a72df43 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_rwlock.h -@@ -0,0 +1,39 @@ -+#ifndef _RTE_RWLOCK_sw_64_H_ -+#define _RTE_RWLOCK_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_rwlock.h" -+ -+static inline void -+rte_rwlock_read_lock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_read_lock(rwl); -+} -+ -+static inline void -+rte_rwlock_read_unlock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_read_unlock(rwl); -+} -+ -+static inline void -+rte_rwlock_write_lock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_write_lock(rwl); -+} -+ -+static inline void -+rte_rwlock_write_unlock_tm(rte_rwlock_t *rwl) -+{ -+ rte_rwlock_write_unlock(rwl); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_RWLOCK_sw_64_H_ */ -+ -diff --git a/lib/eal/sw_64/include/rte_spinlock.h b/lib/eal/sw_64/include/rte_spinlock.h -new file mode 100644 -index 0000000..2be4c42 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_spinlock.h -@@ -0,0 +1,57 @@ -+#ifndef _RTE_SPINLOCK_sw_64_H_ -+#define _RTE_SPINLOCK_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_spinlock.h" -+#include "rte_common.h" -+ -+static inline int -+rte_tm_supported(void) -+{ -+ return 0; -+} -+ -+static inline void -+rte_spinlock_lock_tm(rte_spinlock_t *sl) -+{ -+ rte_spinlock_lock(sl); /* fall-back */ -+} -+ -+static inline int -+rte_spinlock_trylock_tm(rte_spinlock_t *sl) -+{ -+ return rte_spinlock_trylock(sl); -+} -+ -+static inline void -+rte_spinlock_unlock_tm(rte_spinlock_t *sl) -+{ -+ rte_spinlock_unlock(sl); -+} -+ -+static inline void -+rte_spinlock_recursive_lock_tm(rte_spinlock_recursive_t *slr) -+{ -+ rte_spinlock_recursive_lock(slr); /* fall-back */ -+} -+ -+static inline void -+rte_spinlock_recursive_unlock_tm(rte_spinlock_recursive_t *slr) -+{ -+ rte_spinlock_recursive_unlock(slr); -+} -+ -+static inline int -+rte_spinlock_recursive_trylock_tm(rte_spinlock_recursive_t *slr) -+{ -+ return rte_spinlock_recursive_trylock(slr); -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_SPINLOCK_sw_64_H_ */ -diff --git a/lib/eal/sw_64/include/rte_ticketlock.h b/lib/eal/sw_64/include/rte_ticketlock.h -new file mode 100644 -index 0000000..bf081c1 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_ticketlock.h -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2019 Arm Limited -+ */ -+ -+#ifndef _RTE_TICKETLOCK_sw_64_H_ -+#define _RTE_TICKETLOCK_sw_64_H_ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "generic/rte_ticketlock.h" -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_TICKETLOCK_sw_64_H_ */ -diff --git a/lib/eal/sw_64/include/rte_vect.h b/lib/eal/sw_64/include/rte_vect.h -new file mode 100644 -index 0000000..14fa550 ---- /dev/null -+++ b/lib/eal/sw_64/include/rte_vect.h -@@ -0,0 +1,37 @@ -+#ifndef _RTE_VECT_sw_64_H_ -+#define _RTE_VECT_sw_64_H_ -+ -+#include -+#include "generic/rte_vect.h" -+#include "rte_debug.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define RTE_VECT_DEFAULT_SIMD_BITWIDTH RTE_VECT_SIMD_256 -+ -+typedef struct _xmm_t -+{ -+ uint64_t u64_L; -+ uint64_t u64_H; -+}xmm_t; -+ -+#define XMM_SIZE (sizeof(xmm_t)) -+#define XMM_MASK (XMM_SIZE - 1) -+ -+typedef union rte_xmm { -+ xmm_t x; -+ uint8_t u8[XMM_SIZE / sizeof(uint8_t)]; -+ uint16_t u16[XMM_SIZE / sizeof(uint16_t)]; -+ uint32_t u32[XMM_SIZE / sizeof(uint32_t)]; -+ uint64_t u64[XMM_SIZE / sizeof(uint64_t)]; -+ double pd[XMM_SIZE / sizeof(double)]; -+} rte_xmm_t; -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -+ -diff --git a/lib/eal/sw_64/meson.build b/lib/eal/sw_64/meson.build -new file mode 100644 -index 0000000..43c4654 ---- /dev/null -+++ b/lib/eal/sw_64/meson.build -@@ -0,0 +1,11 @@ -+# SPDX-License-Identifier: BSD-3-Clause -+# Copyright(c) 2018 Luca Boccassi -+ -+subdir('include') -+ -+sources += files( -+ 'rte_cpuflags.c', -+ 'rte_cycles.c', -+ 'rte_hypervisor.c', -+ 'rte_power_intrinsics.c', -+) -diff --git a/lib/eal/sw_64/rte_cpuflags.c b/lib/eal/sw_64/rte_cpuflags.c -new file mode 100644 -index 0000000..9c3f137 ---- /dev/null -+++ b/lib/eal/sw_64/rte_cpuflags.c -@@ -0,0 +1,19 @@ -+#include "rte_cpuflags.h" -+#include -+#include -+ -+/** -+ * Checks if a particular flag is available on current machine. -+ */ -+ -+int -+rte_cpu_get_flag_enabled(__attribute__((unused)) enum rte_cpu_flag_t feature) -+{ -+ return -ENOENT; -+} -+ -+void -+rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics) -+{ -+ memset(intrinsics, 0, sizeof(*intrinsics)); -+} -diff --git a/lib/eal/sw_64/rte_cycles.c b/lib/eal/sw_64/rte_cycles.c -new file mode 100644 -index 0000000..851fd02 ---- /dev/null -+++ b/lib/eal/sw_64/rte_cycles.c -@@ -0,0 +1,7 @@ -+#include "eal_private.h" -+ -+uint64_t -+get_tsc_freq_arch(void) -+{ -+ return 0; -+} -diff --git a/lib/eal/sw_64/rte_hypervisor.c b/lib/eal/sw_64/rte_hypervisor.c -new file mode 100644 -index 0000000..08a1c97 ---- /dev/null -+++ b/lib/eal/sw_64/rte_hypervisor.c -@@ -0,0 +1,11 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright 2017 Mellanox Technologies, Ltd -+ */ -+ -+#include "rte_hypervisor.h" -+ -+enum rte_hypervisor -+rte_hypervisor_get(void) -+{ -+ return RTE_HYPERVISOR_UNKNOWN; -+} -diff --git a/lib/eal/sw_64/rte_power_intrinsics.c b/lib/eal/sw_64/rte_power_intrinsics.c -new file mode 100644 -index 0000000..2eb6839 ---- /dev/null -+++ b/lib/eal/sw_64/rte_power_intrinsics.c -@@ -0,0 +1,53 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2021 Intel Corporation -+ */ -+ -+ -+#include -+ -+#include "rte_power_intrinsics.h" -+ -+/** -+ * This function is not supported on SW. -+ */ -+int -+rte_power_monitor(const struct rte_power_monitor_cond *pmc, -+ const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(pmc); -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -+ -+/** -+ * This function is not supported on SW. -+ */ -+int -+rte_power_pause(const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -+ -+/** -+ * This function is not supported on SW. -+ */ -+int -+rte_power_monitor_wakeup(const unsigned int lcore_id) -+{ -+ RTE_SET_USED(lcore_id); -+ -+ return -ENOTSUP; -+} -+int -+rte_power_monitor_multi(const struct rte_power_monitor_cond pmc[], -+ const uint32_t num, const uint64_t tsc_timestamp) -+{ -+ RTE_SET_USED(pmc); -+ RTE_SET_USED(num); -+ RTE_SET_USED(tsc_timestamp); -+ -+ return -ENOTSUP; -+} -diff --git a/lib/lpm/rte_lpm_sw.h b/lib/lpm/rte_lpm_sw.h -new file mode 100644 -index 0000000..5046569 ---- /dev/null -+++ b/lib/lpm/rte_lpm_sw.h -@@ -0,0 +1,121 @@ -+/* SPDX-License-Identifier: BSD-3-Clause -+ * Copyright(c) 2010-2014 Intel Corporation -+ */ -+ -+#ifndef _RTE_LPM_SW_H_ -+#define _RTE_LPM_SW_H_ -+ -+#include -+#include -+#include -+#include -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+static inline void -+rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], -+ uint32_t defv) -+{ -+ uint32_t i24[4]; -+ rte_xmm_t i8; -+ uint32_t tbl[4]; -+ uint64_t idx, pt, pt2; -+ const uint32_t *ptbl; -+ -+ /* -+ * RTE_LPM_VALID_EXT_ENTRY_BITMASK for 2 LPM entries -+ * as one 64-bit value (0x0300000003000000). -+ */ -+ const uint64_t mask_xv = -+ ((uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK | -+ (uint64_t)RTE_LPM_VALID_EXT_ENTRY_BITMASK << 32); -+ -+ /* -+ * RTE_LPM_LOOKUP_SUCCESS for 2 LPM entries -+ * as one 64-bit value (0x0100000001000000). -+ */ -+ const uint64_t mask_v = -+ ((uint64_t)RTE_LPM_LOOKUP_SUCCESS | -+ (uint64_t)RTE_LPM_LOOKUP_SUCCESS << 32); -+ -+ /* get 4 indexes for tbl24[]. */ -+ i24[0] = (uint32_t)ip.u64_L >> CHAR_BIT; -+ i24[1] = (uint32_t)(ip.u64_L >> 32) >> CHAR_BIT; -+ i24[2] = (uint32_t)ip.u64_H >> CHAR_BIT; -+ i24[3] = (uint32_t)(ip.u64_H >> 32) >> CHAR_BIT; -+ -+ /* extract values from tbl24[] */ -+ idx = ((uint64_t)i24[0] & 0xffffffff) | ((uint64_t)i24[1] << 32); -+ -+ ptbl = (const uint32_t *)&lpm->tbl24[(uint32_t)idx]; -+ tbl[0] = *ptbl; -+ ptbl = (const uint32_t *)&lpm->tbl24[idx >> 32]; -+ tbl[1] = *ptbl; -+ -+ idx = ((uint64_t)i24[2] | (uint64_t)i24[3] << 32); -+ -+ ptbl = (const uint32_t *)&lpm->tbl24[(uint32_t)idx]; -+ tbl[2] = *ptbl; -+ ptbl = (const uint32_t *)&lpm->tbl24[idx >> 32]; -+ tbl[3] = *ptbl; -+ -+ /* get 4 indexes for tbl8[]. */ -+ i8.x.u64_L = (ip.u64_L & (0x000000FF000000FF)); -+ i8.x.u64_H = (ip.u64_H & (0x000000FF000000FF)); -+ -+ -+ pt = (uint64_t)tbl[0] | -+ (uint64_t)tbl[1] << 32; -+ pt2 = (uint64_t)tbl[2] | -+ (uint64_t)tbl[3] << 32; -+ -+ /* search successfully finished for all 4 IP addresses. */ -+ if (likely((pt & mask_xv) == mask_v) && -+ likely((pt2 & mask_xv) == mask_v)) { -+ *(uint64_t *)hop = pt & RTE_LPM_MASKX4_RES; -+ *(uint64_t *)(hop + 2) = pt2 & RTE_LPM_MASKX4_RES; -+ return; -+ } -+ -+ if (unlikely((pt & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == -+ RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { -+ i8.u32[0] = i8.u32[0] + -+ (uint8_t)tbl[0] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; -+ ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[0]]; -+ tbl[0] = *ptbl; -+ } -+ if (unlikely((pt >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == -+ RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { -+ i8.u32[1] = i8.u32[1] + -+ (uint8_t)tbl[1] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; -+ ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[1]]; -+ tbl[1] = *ptbl; -+ } -+ if (unlikely((pt2 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == -+ RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { -+ i8.u32[2] = i8.u32[2] + -+ (uint8_t)tbl[2] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; -+ ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[2]]; -+ tbl[2] = *ptbl; -+ } -+ if (unlikely((pt2 >> 32 & RTE_LPM_VALID_EXT_ENTRY_BITMASK) == -+ RTE_LPM_VALID_EXT_ENTRY_BITMASK)) { -+ i8.u32[3] = i8.u32[3] + -+ (uint8_t)tbl[3] * RTE_LPM_TBL8_GROUP_NUM_ENTRIES; -+ ptbl = (const uint32_t *)&lpm->tbl8[i8.u32[3]]; -+ tbl[3] = *ptbl; -+ } -+ -+ hop[0] = (tbl[0] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[0] & 0x00FFFFFF : defv; -+ hop[1] = (tbl[1] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[1] & 0x00FFFFFF : defv; -+ hop[2] = (tbl[2] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[2] & 0x00FFFFFF : defv; -+ hop[3] = (tbl[3] & RTE_LPM_LOOKUP_SUCCESS) ? tbl[3] & 0x00FFFFFF : defv; -+} -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _RTE_LPM_SW_H_ */ --- -2.41.0 - diff --git a/CVE-2021-3839.patch b/CVE-2021-3839.patch deleted file mode 100644 index 9d8e1b7..0000000 --- a/CVE-2021-3839.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 4c40d30d2bc8a35b81d1d386e6674acee49acded Mon Sep 17 00:00:00 2001 -From: Chenbo Xia -Date: Mon, 14 Feb 2022 16:32:37 +0800 -Subject: vhost: fix queue number check when setting inflight FD - -[ upstream commit 6442c329b9d2ded0f44b27d2016aaba8ba5844c5 ] - -In function vhost_user_set_inflight_fd, queue number in inflight -message is used to access virtqueue. However, queue number could -be larger than VHOST_MAX_VRING and cause write OOB as this number -will be used to write inflight info in virtqueue structure. This -patch checks the queue number to avoid the issue and also make -sure virtqueues are allocated before setting inflight information. - -Fixes: ad0a4ae491fe ("vhost: checkout resubmit inflight information") - -Reported-by: Wenxiang Qian -Signed-off-by: Chenbo Xia -Reviewed-by: Maxime Coquelin ---- - lib/vhost/vhost_user.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c -index 850ac49169..d4b0ec7358 100644 ---- a/lib/vhost/vhost_user.c -+++ b/lib/vhost/vhost_user.c -@@ -2876,6 +2876,9 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev, - case VHOST_USER_SET_VRING_ADDR: - vring_idx = msg->payload.addr.index; - break; -+ case VHOST_USER_SET_INFLIGHT_FD: -+ vring_idx = msg->payload.inflight.num_queues - 1; -+ break; - default: - return 0; - } --- -cgit v1.2.1 diff --git a/CVE-2022-0669.patch b/CVE-2022-0669.patch deleted file mode 100644 index 9b86bc6..0000000 --- a/CVE-2022-0669.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 6cb68162e4b598b7c0747372fa3fcec9cddd19b8 Mon Sep 17 00:00:00 2001 -From: David Marchand -Date: Tue, 18 Jan 2022 15:53:30 +0100 -Subject: vhost: fix FD leak with inflight messages - -[ upstream commit af74f7db384ed149fe42b21dbd7975f8a54ef227 ] - -Even if unlikely, a buggy vhost-user master might attach fds to inflight -messages. Add checks like for other types of vhost-user messages. - -Fixes: d87f1a1cb7b6 ("vhost: support inflight info sharing") - -Signed-off-by: David Marchand -Reviewed-by: Maxime Coquelin ---- - lib/vhost/vhost_user.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c -index d4b0ec7358..9a266b5d42 100644 ---- a/lib/vhost/vhost_user.c -+++ b/lib/vhost/vhost_user.c -@@ -1600,6 +1600,9 @@ vhost_user_get_inflight_fd(struct virtio_net **pdev, - int numa_node = SOCKET_ID_ANY; - void *addr; - -+ if (validate_msg_fds(msg, 0) != 0) -+ return RTE_VHOST_MSG_RESULT_ERR; -+ - if (msg->size != sizeof(msg->payload.inflight)) { - VHOST_LOG_CONFIG(ERR, - "invalid get_inflight_fd message size is %d\n", -@@ -1701,6 +1704,9 @@ vhost_user_set_inflight_fd(struct virtio_net **pdev, VhostUserMsg *msg, - int fd, i; - int numa_node = SOCKET_ID_ANY; - -+ if (validate_msg_fds(msg, 1) != 0) -+ return RTE_VHOST_MSG_RESULT_ERR; -+ - fd = msg->fds[0]; - if (msg->size != sizeof(msg->payload.inflight) || fd < 0) { - VHOST_LOG_CONFIG(ERR, --- -cgit v1.2.1 diff --git a/backport-0001-CVE-2022-2132.patch b/backport-0001-CVE-2022-2132.patch deleted file mode 100644 index 571f57b..0000000 --- a/backport-0001-CVE-2022-2132.patch +++ /dev/null @@ -1,104 +0,0 @@ -From e12d415556994d0901c317f6338ed2961185465f Mon Sep 17 00:00:00 2001 -From: Maxime Coquelin -Date: Thu, 16 Jun 2022 14:25:07 +0200 -Subject: [PATCH] vhost: fix header spanned across more than two descriptors - -[ upstream commit dc1516e260a0df272b218392faf6db3cbf45e717 ] - -This patch aims at supporting the unlikely case where a -Virtio-net header is spanned across more than two -descriptors. - -CVE-2022-2132 -Fixes: fd68b4739d2c ("vhost: use buffer vectors in dequeue path") - -Signed-off-by: Maxime Coquelin -Acked-by: Chenbo Xia -Reviewed-by: David Marchand -Conflict: NA -Reference: https://git.dpdk.org/dpdk-stable/commit/?id=e12d415556 ---- - lib/vhost/virtio_net.c | 41 +++++++++++++---------------------------- - 1 file changed, 13 insertions(+), 28 deletions(-) - -diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c -index 991a7a2bd4..bf4d75b4bd 100644 ---- a/lib/vhost/virtio_net.c -+++ b/lib/vhost/virtio_net.c -@@ -2322,25 +2322,22 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq, - uint32_t buf_avail, buf_offset; - uint64_t buf_addr, buf_len; - uint32_t mbuf_avail, mbuf_offset; -+ uint32_t hdr_remain = dev->vhost_hlen; - uint32_t cpy_len; - struct rte_mbuf *cur = m, *prev = m; - struct virtio_net_hdr tmp_hdr; - struct virtio_net_hdr *hdr = NULL; -- /* A counter to avoid desc dead loop chain */ -- uint16_t vec_idx = 0; -+ uint16_t vec_idx; - struct batch_copy_elem *batch_copy = vq->batch_copy_elems; - int error = 0; - -- buf_addr = buf_vec[vec_idx].buf_addr; -- buf_len = buf_vec[vec_idx].buf_len; -- - if (unlikely(buf_len < dev->vhost_hlen && nr_vec <= 1)) { - error = -1; - goto out; - } - - if (virtio_net_with_host_offload(dev)) { -- if (unlikely(buf_len < sizeof(struct virtio_net_hdr))) { -+ if (unlikely(buf_vec[0].buf_len < sizeof(struct virtio_net_hdr))) { - /* - * No luck, the virtio-net header doesn't fit - * in a contiguous virtual area. -@@ -2348,34 +2345,22 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq, - copy_vnet_hdr_from_desc(&tmp_hdr, buf_vec); - hdr = &tmp_hdr; - } else { -- hdr = (struct virtio_net_hdr *)((uintptr_t)buf_addr); -+ hdr = (struct virtio_net_hdr *)((uintptr_t)buf_vec[0].buf_addr); - } - } - -- /* -- * A virtio driver normally uses at least 2 desc buffers -- * for Tx: the first for storing the header, and others -- * for storing the data. -- */ -- if (unlikely(buf_len < dev->vhost_hlen)) { -- buf_offset = dev->vhost_hlen - buf_len; -- vec_idx++; -- buf_addr = buf_vec[vec_idx].buf_addr; -- buf_len = buf_vec[vec_idx].buf_len; -- buf_avail = buf_len - buf_offset; -- } else if (buf_len == dev->vhost_hlen) { -- if (unlikely(++vec_idx >= nr_vec)) -- goto out; -- buf_addr = buf_vec[vec_idx].buf_addr; -- buf_len = buf_vec[vec_idx].buf_len; -+ for (vec_idx = 0; vec_idx < nr_vec; vec_idx++) { -+ if (buf_vec[vec_idx].buf_len > hdr_remain) -+ break; - -- buf_offset = 0; -- buf_avail = buf_len; -- } else { -- buf_offset = dev->vhost_hlen; -- buf_avail = buf_vec[vec_idx].buf_len - dev->vhost_hlen; -+ hdr_remain -= buf_vec[vec_idx].buf_len; - } - -+ buf_addr = buf_vec[vec_idx].buf_addr; -+ buf_len = buf_vec[vec_idx].buf_len; -+ buf_offset = hdr_remain; -+ buf_avail = buf_vec[vec_idx].buf_len - hdr_remain; -+ - PRINT_PACKET(dev, - (uintptr_t)(buf_addr + buf_offset), - (uint32_t)buf_avail, 0); --- -2.23.0 - diff --git a/backport-0002-CVE-2022-2132.patch b/backport-0002-CVE-2022-2132.patch deleted file mode 100644 index a9a83c6..0000000 --- a/backport-0002-CVE-2022-2132.patch +++ /dev/null @@ -1,79 +0,0 @@ -From f167022606b5ccca27a627ae599538ce2348ef67 Mon Sep 17 00:00:00 2001 -From: Maxime Coquelin -Date: Thu, 16 Jun 2022 11:35:56 +0200 -Subject: [PATCH] vhost: discard too small descriptor chains - -[ upstream commit 71bd0cc536ad6d84188d947d6f24c17400d8f623 ] - -This patch discards descriptor chains which are smaller -than the Virtio-net header size, and ones that are equal. - -Indeed, such descriptor chains sizes mean there is no -packet data. - -This patch also has the advantage of requesting the exact -packets sizes for the mbufs. - -CVE-2022-2132 -Fixes: 62250c1d0978 ("vhost: extract split ring handling from Rx and Tx functions") -Fixes: c3ff0ac70acb ("vhost: improve performance by supporting large buffer") -Fixes: 84d5204310d7 ("vhost: support async dequeue for split ring") - -Signed-off-by: Maxime Coquelin -Acked-by: Chenbo Xia -Reviewed-by: David Marchand -Conflict: NA -Reference: https://git.dpdk.org/dpdk-stable/commit/?id=f16702260 ---- - lib/vhost/virtio_net.c | 21 +++++++++++++++++---- - 1 file changed, 17 insertions(+), 4 deletions(-) - -diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c -index 858187d1b0..991a7a2bd4 100644 ---- a/lib/vhost/virtio_net.c -+++ b/lib/vhost/virtio_net.c -@@ -2334,10 +2334,10 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq, - struct batch_copy_elem *batch_copy = vq->batch_copy_elems; - int error = 0; - -- if (unlikely(buf_len < dev->vhost_hlen && nr_vec <= 1)) { -- error = -1; -- goto out; -- } -+ /* -+ * The caller has checked the descriptors chain is larger than the -+ * header size. -+ */ - - if (virtio_net_with_host_offload(dev)) { - if (unlikely(buf_vec[0].buf_len < sizeof(struct virtio_net_hdr))) { -@@ -2568,6 +2568,14 @@ virtio_dev_tx_split(struct virtio_net *dev, struct vhost_virtqueue *vq, - - update_shadow_used_ring_split(vq, head_idx, 0); - -+ if (unlikely(buf_len <= dev->vhost_hlen)) { -+ dropped += 1; -+ i++; -+ break; -+ } -+ -+ buf_len -= dev->vhost_hlen; -+ - err = virtio_dev_pktmbuf_prep(dev, pkts[i], buf_len); - if (unlikely(err)) { - /* -@@ -2771,6 +2779,11 @@ vhost_dequeue_single_packed(struct virtio_net *dev, - VHOST_ACCESS_RO) < 0)) - return -1; - -+ if (unlikely(buf_len <= dev->vhost_hlen)) -+ return -1; -+ -+ buf_len -= dev->vhost_hlen; -+ - if (unlikely(virtio_dev_pktmbuf_prep(dev, pkts, buf_len))) { - if (!allocerr_warned) { - VHOST_LOG_DATA(ERR, --- -2.23.0 - diff --git a/backport-CVE-2022-28199.patch b/backport-CVE-2022-28199.patch deleted file mode 100644 index d442e27..0000000 --- a/backport-CVE-2022-28199.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 25c01bd32374b0c3cbc260f3e3872408d749cb45 Mon Sep 17 00:00:00 2001 -From: Matan Azrad -Date: Thu, 11 Aug 2022 19:59:18 +0300 -Subject: [PATCH] net/mlx5: fix Rx queue recovery mechanism - -[ upstream commit 60b254e3923d007bcadbb8d410f95ad89a2f13fa ] - -The local variables are getting inconsistent in data receiving routines -after queue error recovery. -Receive queue consumer index is getting wrong, need to reset one to the -size of the queue (as RQ was fully replenished in recovery procedure). - -In MPRQ case, also the local consumed strd variable should be reset. - -CVE-2022-28199 -Fixes: 88c0733535d6 ("net/mlx5: extend Rx completion with error handling") - -Signed-off-by: Alexander Kozyrev -Signed-off-by: Matan Azrad -Conflict: NA -Reference: https://git.dpdk.org/dpdk-stable/commit/?id=25c01db32374 ---- - drivers/net/mlx5/mlx5_rx.c | 34 ++++++++++++++++++++++++---------- - 1 file changed, 24 insertions(+), 10 deletions(-) - -diff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c -index f388fcc313..9fcd039c22 100644 ---- a/drivers/net/mlx5/mlx5_rx.c -+++ b/drivers/net/mlx5/mlx5_rx.c -@@ -390,6 +390,11 @@ mlx5_rxq_initialize(struct mlx5_rxq_data *rxq) - *rxq->rq_db = rte_cpu_to_be_32(rxq->rq_ci); - } - -+/* Must be negative. */ -+#define MLX5_ERROR_CQE_RET (-1) -+/* Must not be negative. */ -+#define MLX5_RECOVERY_ERROR_RET 0 -+ - /** - * Handle a Rx error. - * The function inserts the RQ state to reset when the first error CQE is -@@ -404,7 +409,7 @@ mlx5_rxq_initialize(struct mlx5_rxq_data *rxq) - * 0 when called from non-vectorized Rx burst. - * - * @return -- * -1 in case of recovery error, otherwise the CQE status. -+ * MLX5_RECOVERY_ERROR_RET in case of recovery error, otherwise the CQE status. - */ - int - mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) -@@ -433,7 +438,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) - sm.queue_id = rxq->idx; - sm.state = IBV_WQS_RESET; - if (mlx5_queue_state_modify(RXQ_DEV(rxq_ctrl), &sm)) -- return -1; -+ return MLX5_RECOVERY_ERROR_RET; - if (rxq_ctrl->dump_file_n < - RXQ_PORT(rxq_ctrl)->config.max_dump_files_num) { - MKSTR(err_str, "Unexpected CQE error syndrome " -@@ -473,7 +478,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) - sm.queue_id = rxq->idx; - sm.state = IBV_WQS_RDY; - if (mlx5_queue_state_modify(RXQ_DEV(rxq_ctrl), &sm)) -- return -1; -+ return MLX5_RECOVERY_ERROR_RET; - if (vec) { - const uint32_t elts_n = - mlx5_rxq_mprq_enabled(rxq) ? -@@ -501,7 +506,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) - rte_pktmbuf_free_seg - (*elt); - } -- return -1; -+ return MLX5_RECOVERY_ERROR_RET; - } - } - for (i = 0; i < (int)elts_n; ++i) { -@@ -520,7 +525,7 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) - } - return ret; - default: -- return -1; -+ return MLX5_RECOVERY_ERROR_RET; - } - } - -@@ -538,7 +543,9 @@ mlx5_rx_err_handle(struct mlx5_rxq_data *rxq, uint8_t vec) - * written. - * - * @return -- * 0 in case of empty CQE, otherwise the packet size in bytes. -+ * 0 in case of empty CQE, MLX5_ERROR_CQE_RET in case of error CQE, -+ * otherwise the packet size in regular RxQ, and striding byte -+ * count format in mprq case. - */ - static inline int - mlx5_rx_poll_len(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cqe, -@@ -605,8 +612,8 @@ mlx5_rx_poll_len(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cqe, - rxq->err_state)) { - ret = mlx5_rx_err_handle(rxq, 0); - if (ret == MLX5_CQE_STATUS_HW_OWN || -- ret == -1) -- return 0; -+ ret == MLX5_RECOVERY_ERROR_RET) -+ return MLX5_ERROR_CQE_RET; - } else { - return 0; - } -@@ -851,8 +858,10 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) - if (!pkt) { - cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_cnt]; - len = mlx5_rx_poll_len(rxq, cqe, cqe_cnt, &mcqe); -- if (!len) { -+ if (len <= 0) { - rte_mbuf_raw_free(rep); -+ if (unlikely(len == MLX5_ERROR_CQE_RET)) -+ rq_ci = rxq->rq_ci << sges_n; - break; - } - pkt = seg; -@@ -1075,8 +1084,13 @@ mlx5_rx_burst_mprq(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) - } - cqe = &(*rxq->cqes)[rxq->cq_ci & cq_mask]; - ret = mlx5_rx_poll_len(rxq, cqe, cq_mask, &mcqe); -- if (!ret) -+ if (ret == 0) -+ break; -+ if (unlikely(ret == MLX5_ERROR_CQE_RET)) { -+ rq_ci = rxq->rq_ci; -+ consumed_strd = rxq->consumed_strd; - break; -+ } - byte_cnt = ret; - len = (byte_cnt & MLX5_MPRQ_LEN_MASK) >> MLX5_MPRQ_LEN_SHIFT; - MLX5_ASSERT((int)len >= (rxq->crc_present << 2)); --- -2.23.0 - diff --git a/backport-gro-check-payload-length-after-trim.patch b/backport-gro-check-payload-length-after-trim.patch deleted file mode 100644 index f1f1a88..0000000 --- a/backport-gro-check-payload-length-after-trim.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 72f51b097a71fb9bdea13bdd254ff620b34c852e Mon Sep 17 00:00:00 2001 -From: Kumara Parameshwaran -Date: Sun, 16 Oct 2022 20:13:05 +0530 -Subject: [PATCH] gro: check payload length after trim - -When packet is padded with extra bytes the -the validation of the payload length should be done -after the trim operation - -Fixes: b8a55871d5af ("gro: trim tail padding bytes") -Cc: stable@dpdk.org - -Signed-off-by: Kumara Parameshwaran -Acked-by: Jiayu Hu ---- - lib/gro/gro_tcp4.c | 11 ++++++----- - lib/gro/gro_udp4.c | 10 +++++----- - 2 files changed, 11 insertions(+), 10 deletions(-) - -diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c -index 8f5e800250..0014096e63 100644 ---- a/lib/gro/gro_tcp4.c -+++ b/lib/gro/gro_tcp4.c -@@ -225,6 +225,12 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - */ - if (tcp_hdr->tcp_flags != RTE_TCP_ACK_FLAG) - return -1; -+ -+ /* trim the tail padding bytes */ -+ ip_tlen = rte_be_to_cpu_16(ipv4_hdr->total_length); -+ if (pkt->pkt_len > (uint32_t)(ip_tlen + pkt->l2_len)) -+ rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_tlen - pkt->l2_len); -+ - /* - * Don't process the packet whose payload length is less than or - * equal to 0. -@@ -233,11 +239,6 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - if (tcp_dl <= 0) - return -1; - -- /* trim the tail padding bytes */ -- ip_tlen = rte_be_to_cpu_16(ipv4_hdr->total_length); -- if (pkt->pkt_len > (uint32_t)(ip_tlen + pkt->l2_len)) -- rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_tlen - pkt->l2_len); -- - /* - * Save IPv4 ID for the packet whose DF bit is 0. For the packet - * whose DF bit is 1, IPv4 ID is ignored. -diff --git a/lib/gro/gro_udp4.c b/lib/gro/gro_udp4.c -index 839f9748b7..42596d33b6 100644 ---- a/lib/gro/gro_udp4.c -+++ b/lib/gro/gro_udp4.c -@@ -220,6 +220,11 @@ gro_udp4_reassemble(struct rte_mbuf *pkt, - if (!is_ipv4_fragment(ipv4_hdr)) - return -1; - -+ ip_dl = rte_be_to_cpu_16(ipv4_hdr->total_length); -+ /* trim the tail padding bytes */ -+ if (pkt->pkt_len > (uint32_t)(ip_dl + pkt->l2_len)) -+ rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_dl - pkt->l2_len); -+ - /* - * Don't process the packet whose payload length is less than or - * equal to 0. -@@ -227,14 +232,9 @@ gro_udp4_reassemble(struct rte_mbuf *pkt, - if (pkt->pkt_len <= hdr_len) - return -1; - -- ip_dl = rte_be_to_cpu_16(ipv4_hdr->total_length); - if (ip_dl <= pkt->l3_len) - return -1; - -- /* trim the tail padding bytes */ -- if (pkt->pkt_len > (uint32_t)(ip_dl + pkt->l2_len)) -- rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_dl - pkt->l2_len); -- - ip_dl -= pkt->l3_len; - ip_id = rte_be_to_cpu_16(ipv4_hdr->packet_id); - frag_offset = rte_be_to_cpu_16(ipv4_hdr->fragment_offset); --- -2.23.0 - diff --git a/backport-gro-fix-chain-index-for-more-than-2-packets.patch b/backport-gro-fix-chain-index-for-more-than-2-packets.patch deleted file mode 100644 index 5ae4823..0000000 --- a/backport-gro-fix-chain-index-for-more-than-2-packets.patch +++ /dev/null @@ -1,31 +0,0 @@ -From bc4a7f7ee0281d96b8d93ac2771135a670b4a00f Mon Sep 17 00:00:00 2001 -From: Kumara Parameshwaran -Date: Wed, 7 Sep 2022 15:02:05 +0530 -Subject: [PATCH] gro: fix chain index for more than 2 packets - -When more than two packets are merged in a flow, and if we receive -a 3rd packet which is matching the sequence of the 2nd packet the -prev_idx will be 1 and not 2, hence resulting in packet re-ordering - -Signed-off-by: Kumara Parameshwaran -Acked-by: Jiayu Hu ---- - lib/gro/gro_tcp4.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c -index 7498c66141..9758e28fd5 100644 ---- a/lib/gro/gro_tcp4.c -+++ b/lib/gro/gro_tcp4.c -@@ -305,7 +305,7 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - * length is greater than the max value. Store - * the packet into the flow. - */ -- if (insert_new_item(tbl, pkt, start_time, prev_idx, -+ if (insert_new_item(tbl, pkt, start_time, cur_idx, - sent_seq, ip_id, is_atomic) == - INVALID_ARRAY_INDEX) - return -1; --- -2.23.0 - diff --git a/backport-gro-trim-tail-padding-bytes.patch b/backport-gro-trim-tail-padding-bytes.patch deleted file mode 100644 index f34d4a9..0000000 --- a/backport-gro-trim-tail-padding-bytes.patch +++ /dev/null @@ -1,68 +0,0 @@ -From b8a55871d5af6f5b8694b1cb5eacbc629734e403 Mon Sep 17 00:00:00 2001 -From: Jun Qiu -Date: Wed, 27 Jul 2022 08:00:36 +0000 -Subject: [PATCH] gro: trim tail padding bytes - -Exclude CRC fields, the minimum Ethernet packet -length is 60 bytes. When the actual packet length -is less than 60 bytes, padding is added to the tail. -When GRO is performed on a packet containing a padding -field, mbuf->pkt_len is the one that contains the -padding field, which leads to the error of thinking -of the padding field as the actual content of the packet. -We need to trim away this extra padding field during -GRO processing. - -Fixes: 0d2cbe59b719 ("lib/gro: support TCP/IPv4") -Cc: stable@dpdk.org - -Signed-off-by: Jun Qiu -Acked-by: Jiayu Hu ---- - lib/gro/gro_tcp4.c | 7 ++++++- - lib/gro/gro_udp4.c | 4 ++++ - 2 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c -index 9758e28fd5..8f5e800250 100644 ---- a/lib/gro/gro_tcp4.c -+++ b/lib/gro/gro_tcp4.c -@@ -198,7 +198,7 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - struct rte_tcp_hdr *tcp_hdr; - uint32_t sent_seq; - int32_t tcp_dl; -- uint16_t ip_id, hdr_len, frag_off; -+ uint16_t ip_id, hdr_len, frag_off, ip_tlen; - uint8_t is_atomic; - - struct tcp4_flow_key key; -@@ -233,6 +233,11 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt, - if (tcp_dl <= 0) - return -1; - -+ /* trim the tail padding bytes */ -+ ip_tlen = rte_be_to_cpu_16(ipv4_hdr->total_length); -+ if (pkt->pkt_len > (uint32_t)(ip_tlen + pkt->l2_len)) -+ rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_tlen - pkt->l2_len); -+ - /* - * Save IPv4 ID for the packet whose DF bit is 0. For the packet - * whose DF bit is 1, IPv4 ID is ignored. -diff --git a/lib/gro/gro_udp4.c b/lib/gro/gro_udp4.c -index dd71135ada..839f9748b7 100644 ---- a/lib/gro/gro_udp4.c -+++ b/lib/gro/gro_udp4.c -@@ -231,6 +231,10 @@ gro_udp4_reassemble(struct rte_mbuf *pkt, - if (ip_dl <= pkt->l3_len) - return -1; - -+ /* trim the tail padding bytes */ -+ if (pkt->pkt_len > (uint32_t)(ip_dl + pkt->l2_len)) -+ rte_pktmbuf_trim(pkt, pkt->pkt_len - ip_dl - pkt->l2_len); -+ - ip_dl -= pkt->l3_len; - ip_id = rte_be_to_cpu_16(ipv4_hdr->packet_id); - frag_offset = rte_be_to_cpu_16(ipv4_hdr->fragment_offset); --- -2.23.0 - diff --git a/dpdk-21.11.tar.xz b/dpdk-23.11.tar.xz similarity index 63% rename from dpdk-21.11.tar.xz rename to dpdk-23.11.tar.xz index 5b1b7fe053d6cb2017986129a4bc39824947dc4e..50897e9d2b52cad352a8f3a349f609dae1ef95a8 100644 GIT binary patch delta 14444282 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

L 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

@ax2yP1z&Dj>U(V^hVd#>sITi3}a8HkXP$uN* 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 z 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 z z(y$BI0-p^#t?>KcFb_^D>>qfJIsnCxg1r5XL@DOe0SrP1*HA}-exh0Snd}k~;MBc@ zkgrDZ<8$oO5K*o{e=gj2i)hh5*Sxt~3Y@hQykEgTy8L@<8??#=(;=kgPE7iKg~8)R zV(M+#bR3BRycs9r4*x0R$vk`jjrXG74z{|)GVv+0(q^FchPGB=F_SW-m*_@xH`gje)kCu%Tf%X^gy$k-Y8dMftBnAnk0ElkSq-FplsFeDnpMCuUWN#U~yZVhHe}=Ys7}M<hJ# z+l20xnw4jr{4WWkpRl?gSA93`;Wj&1gZ(VAXAe>oyeE1w3Y(?ulaJ@bA{yG1y6RzAlO z&Zg&>@Hh@<|DAfB(a(Uj9)bu2+@kWbZQH(-q{cw+lAT|nDFe-s>5%9R*#mfJTRuM@ zy2ox0dQwitvd@N135tAeP9^aMpGF}C{BBg~YCVbMkc7Qpf ze;OvgQ1Jr8ciiJ)-p zi@eebprDqKC^mGG*_ZQeVG*pqTF=u@mC(}C`LBfGbM6^B(I}j`u zc*db^A7X5u-PJ|#PD|<781Pz-8wDRH{3HAk#b9jPW8&kFkfz}C*0Cyuy4mDP%i<34 z3#a>xWQfT+zNC-89N1?;7>9FUu4#bdt0>leX<>%nM8JtR94chj5d{H5kiw0*f1(Yo zQZd5+U@~-5h-Q@SpuL>dpM4z%`MR2_IfOz;qcR=F;Ve5i>nxrNos3M}iB!_{-|bnC8}C4VM_AFVnml*m7g zPU{l-#o}@a0km?Ok@i*+h{WCpf8y05=PH?lBV?~HT>&Q>x9nlH=+j*@+6(Wy`&-VX zL|bpG=wpo7#!O2_L~#LV^TuG=rK@%eJ5J3F!3&Yb8vKPWQ()u2cfKEHDunl@JR*mC z*;MXRz2#h$%IW*hZH;DkvD~ax<&=X}F>w7}vgj%Zja76g2;!+3qQr~6`fxX{CmD|RXW5jyu5(e?KjB`TJ z_ci_8QIhI<=8WY}b0i^o}b$%kSJQn1<>K$RN$meL7|0SFgs787MaMOzpbd&Lm| zjX&&*d6B<($*4F*8^r^dDJ36nteEjOGm$cXLhP5qRJM80OSDwU z#1m_&RicZlrS`W9p@=S$Hp#{Na%bKHbiVRUk=p<3<+c_jAt6oq_6}w2o5)uHV67cf zVxC1S@c(Q>@};0%2bcW{y@z;;(nZBP>1XLz8jXYrg3=+ z;-K=je@=z7Dx2loe;NAqs0$R|blYnEP;a=71%W#IWek8M7$->&<+?h zBkW1r(k+8B602C!L=QKG1gv8L_9z-3Qe90Lkyj8deadyzC^$ULI#BGela%&Fdf(z3 zR^nVA9YIhXbbiO;3h6c^>~syX{JX)aFORCQZ;rm^&l~&Ee*&S&xy*PwroCW8 zq`uC01>LaO*rz1tb6HHeJ*m=HZB}&KxF02jCjx42yp=T>H-cv+dN1bimK7%>e3gB* zw_}vm^_;Dif0+C~RP#z?EvdB;sk!m(HyFlNyVV?;R)W+FU%|jirkNUz5C%sR7hFPV zecqMYO4{B#He?71~xykO0 zYycrXnA-D0gunY#@wYf8`T6&F|IvmIE@N>vFc20~f3v`9Mc1(UqlS;tjS5Uwcs_*c zsnPGpnHg%su?7^IS1>cY6vYOo%76#-BlJ&CCqp4-uQ`_QjPNpI-(n)ohHboIw8tTj zZbY*`6oi*!*1;V*mD)C9@h`xBjK#JnXODHQ8#XF-@$8^GX2&0V0jC?3-q)cS(p_^W zJsbSUe+%E(*1d48F~wa&bND6Rmvf#ji-9EZ{TT*b4iwf!ViT~9j0mO*P~*$f#Tq-} z8{lwmmR>kB*_krgK5}YSusd~=`Y0+;AQxGNG zEIUPLHA0^v^BexvYXc`i;22_`{`1wovWfb79f?+6y2lDPu)+p#=>UUuDz_vvitCa! z93dxPXKM9yybsV+M==gqoZDn1LL6Cn~_LSEMAcFB8v}m@cHP22%P}A9D%~Ul4ik*<~=5#Y}89hrD zCY5fvK{5ZrPN)F9=@a}UG^s~-D|`}Og(RuPjrPrqCH=cSu@gQ1uThQei&KDTe-shd zHMgUqGGe|rnW}|Zf_*Iyc@4(Pw!xCRV&-eMT0m`mZbQFaPwi8%kG$*=0^YexWrpU4?oewr=xu{ zK)T2j5%oPBfdpFo=?!PBv6uU31@MN%E@fqshSKog{DVnW4fDywK`tu@e-@VD4YFTz z^1^u!jk_)}mrnq!-Htw;`pV@7z)l->!&i{3EKrY%s&3)qaR&E{ja>VXJSk1lOCK{Y zTgSKn(8Gm-NDDVol+LUv%8v(qUAgA*Do3EJ8NY~g@%Oa`E{v_ZK$RqB@9+LckO15T zdpVis&9i6-*@ys2j$V;ye+ZmOWL6O$biBJG0n4qLL0-F?g`|9?#c$D%D;yX*5RJ#j zfs9+5vT{TzoByQ5!l?ipAlZ|vlvvyr-JsZM?j>i%LWP?n5eLc)CCs{l_7h8M^aTnc zhJbX1l$G=_Yws=mZaao5jSMwtEX3T~{{-zX;va{Qu@Y3%L(9(Sf3a`TwG7@K)F!vc zEv)iGUBwWLlds1OAu=w?{Q}{O6eJ|}u>VQBd0l^(q}_Vql1#QYD=ui?>YvW{5yt66 z7i&@H8m7D2vQ&wVPqs7Vj^lieL-l(AeM8o;~1^pb;nq_+qVzgc$8Z z1QySTMA4YM;8>5m-~m^Avcx$J+58w+A|>*dReaCm&r%BZq`2ezy9H0|nkjCsbq%^O zONRw=9)MOtHMb_hh7EghCP@sfb!4n$ywK3(0U;vBk8VvYf2xQG2^J`+8y8WqVy>i3s;od#l$+`qlcMI&2vGRF#zZBO#O}$JXc_{0`4s1oda^C^HLxXLiqhj z@L$4oCdW<&f97LZ25j@VqlyTwnH?u&9rHZ${=}&r6ffiD02>;PAILTukoX&SaENmC zOdiQ>x&ZsEUPWb*h6Ej*=DT8QcxWslfYPh8+%u~dqX#1|+opc^L9!JoB(4btfh=~< zeJ%=q4~vWiAi)=Xg?9z^19LrlS5 zLn#gaF4&JdHm1*LOR%d1>~23YbsdW08Ik4JzBAT%Xa}Y)ad(2{0Rkr4R?a1Tn%f6; z@tg8$0q!0=#mo}dY{d^~UFqL881BZw?|*qtP7vI1R?S`zK7_Ox1}Fu3~;sA0liNfGeXn@#H@ zoifKb!Uf6e%xVZ`v#JynVtEN=43B5_1e@y3NIsmeEoEY$Dza~P+H0LKt&D%5RUUN@ zIR4yL?Z9)I)EZrjzX`UxDXU)XR(P`nC?e*$2Tw4(&s?#fNq6!{`7>au{S3ZUCr zUs!~X2TKzPBB92RwCR(HRxnbl=cA+aP*e(;Sv!q_Dq`zmkeRCZ6BQw2+`1S)zn`e8 z@y1gC=dxmQndnVX3`JbNV!k-1Y%*VF&`?)mUeJH_eL*=?Q?^IuPiafMuBN>dKX{#! ze>SUoO53iugo4~o^i?WV7Q)w4kO{QLIv&Wz;#~OXte7mvZ5~Z6eb=TNCNXx7LNynR ziL-iEaoH3Xsm?qUOaW&Ky^jOFuKtR&Zi{=5jQq8uHa_A=?H|dC9?f3O*OPo!?;$?N ziT64Ne|URy zsgE6X7NCyV-5Vo#RKOyWt*wQ+IJ3;;8_1r2RkJ7~5pdeQS}7tO3>ypW+j6y#m{3uN zW?MJbPa82QKM_M>>`aRdL-(R%Ba)LfK;yTI|82+Qcr*rro5;Vv@>d*tpgYgGdCUCn zylQxu16{dR?{oFM7te!((>f%-e_*BhfPZIbr;@M9B>T&=->`f2dBZ3Pw#*dszYIt1 zX#*#)D<-W{LK@_VsUZoAu{^(hZlU=)tEV20wu^vKcuTAOY)bjs}BAceklyKuva5z7{fLDU*AE|dKqLkVT|GLtLgUT z-@9PaMgUaU!2WZwwnp$!v|0R>X8>7k2CUoZ`>cN-@mF%`+3+gb1X>;W=(KvmcUkwD zU>uq+m5)w7T#Ra0T-n-XCx{RspY2P{s{Rv;YJUh%Tg5S}n$l6ve^8Vk(S9-x_++zx zCe_+Zo35MqWaI`YD15%G(-XXW=suE*vkwL9$>WA|R6?f5l9d1gB_0-7$*wM^0-dD4 zOzJ7B#QND;51Gc4!o)Pv!eZ673UJ!)DHb+H^oH)p>nsn%4xtKHN-pJZT091dT@y?GE% zgZ(P))59ile-?@<^+9v?5txO|L=u7UjL>#ZfvdV{kfE|Lq|H0ADRbSlvqxR*Z1BJn zSGH57*q&;Ym#}AknKEBykbVutm5xbd*0m%2;1~bYylK}RR#3y=2V*rOC4}blSv@C* za3lgvs};_+<5f)@J^bpx4Ycx4FAnI1QH)ZyGY?TEe_8=w@6I5>+j9HnC^6c|j?vxn zD8&6DM6M*3SSMIu0Cn@tVsC>g=6lo0ey(8-k{+z+_oSXML9wmA6(17#*Ouf3xBvf} z(=y$wAcuFZd(ky!joq%B0<$^SQ2vxHc25*_NX2!u(QVq^Q32*WzvH)TY^l)2##c6(vGBfw3HR!;qh&p6q8xjGm9Pgg&n3f1dWl6uV~SQ9YLi%dbI%tVJLS3XuxU z%+WJ?C9CLBTuM|CWQwA$7+lc{R?O{1AdVb4mQ12ttf~!$)_ORo`NnR|U$sy1{2E5> z2FT4rG~y4Yl>*bjuZy+K5^fY@*NHuchRsTERY^$mL#0mmKu#zrMY&1qf+LaL(O$o( ze@PIQy7#y4a^c0T>gTtU`n5)}5EemlQ=P zXG}#_`bNKtl-QGB*%lQYq&ucSFZrVAWJ1}!iepwJx zg&u_+By2#O%ztyIOC^40`EnE2jw(Oxe}Bb?FvO086fZB~+5T*o75AHbWvFVsZ*`eb zWxJ?f!I_B?Q_U~~N9P38GRnB^xqGT3s%2J>a7%xtSYt_M8Pm{Nm`DPk?Adgz5k8$J zZO-psjIvV4p1xizNY^}3JJAqWVBvD=EWfB}98g7LJ&N<{va>0H@iUjViBV z`Xt%;=xs%Fir}#!z%qBbf6zC#`EuqVORVw_@A0ij3wFS96If2oO3?Xpf2%|@wA&?1 zQ4j%%fh8KMiAYPaC}(C{_vQ?LtO$`C=u=grgX~D#o)sSwpImLOb3;8X(X2Wzfh zZvUI=!AdBgt{LrosF>COT~oa5d$Z>h$a{g^%a5tu)3xK6hMPhKd z7%rac7i-#rO(lo9kCr%DCUjR``6ehrUHL6%l;ABZ)2~?B_GDmR^NUN{PeJlHY9not z@5i$59Z*92+4-5WvTH?N`rxEZda^J3abRC*ZNM(o#wr9Re|0e8gc1?GtEv<7_rj5%Pt9Z8U;H;?g*{*>fxcrJXV^ps=|X6xc>u(oFN#~ z0!M)=fsI%Ue_`Jwwlr=kK!Mz_V3@6Kj2*od(zyhU(p`Cs<~ZtkAN|D9mq*ZvB8msl zpodGS&OFJs$lk(sN9x}>62JY+N-(KERPKV556WYmoAv=&dQLLuogozxHXY6|8&0vIdm#&6*Uk$@THApKw{U&B(En)S1FFmEB6ee zeC+L`9miSoiGSyeQS(kSiuXM3TX94(BCE$`K!1aCTfw8jrceTRe3|{Hy zU!sjx@~A>~LLVJui<^y{x>+IIa*Mz#B1GXge}SbN#$>@K^wT*dQfEWwP>fpvo&qvi zp5Kj!&h? zPC-&5D(BTrO>p=HySonzE!(;#<`HABXa*KAY-TV zeD5e)iw}KVNH=~fTrymf6H9R^u`>CxolhuefK9V{{G=}c9Q0M$Rzed z9w0J!WObDgNl+hoV8gHh-xH8P#ejq+BlGZ5(xJ*?qUvXM2C}HC6$8;;M#qk8|Bb!v z6bi??y1h@r%i{{HU2I^HNP&n3L3&xDCTJ?*Yj?qnU>fFMmXm${Z+oIkZNaf*f8+|7 zq2V*qFb#+%92V>oZ|uFLu))x%yF9)y_&hY?UG0zfJbY8YcDaGLR|RitFBt2rndZIl zzJ6a@n<%f?S-x|W)tD`DcyyB6It~06^s$PoiYUkt}*2?pj{d0*b%B6gn@%-d0!PF7sA)(fB7q_1zo82 z5~TsCjaH9`qcJ$kh)8UsEN8jJA>j099AvJ{+k39bJ7TTeEpcUf@O2nqtrj9Jdilg3 z96&VyS>=kbKmSEQJG0Qiz)=R7=$@Ttdn0wYm}{qiOxoG_eLLLlwboF2@Ki>06{AP7 zk&46q7Pv46&fZORBYDgue~A%q8C%kpo3BcYT7UAec8;bl1-O8Djw9-Gh>~IRwG@;d znhh4L5Bhmske~>;#f*4Uu3x_>%r)<*gtNKAMyzcS>R+mlFIWP>^rN>ADQjv)k^m2* zP}TTo@%i`&;`mKq2H8n@;KzbchtCa*!fCL|MH-V^O|nB(MK%k`e}tHJbq)3#jW8Tx z0QWTGq5I%8ZzKKMZCg14fml&r|Ij@*CMKw^NW|S_PS>mT0z;9tcI~hyBSWV^TWjg zb&m4>@G4^G3HNh^fAmlcppy20wE7c^>XBro7#VbqEDLO9b~)HA-Yj?_%=>m7*hXFI z5v@vwZPz-*8{oNcF!;=I?Q7{t{q8)h$3oUTHCcD6kL%0w-Se0XudV!32THuRBYAI)o6spu6ll*<+2!?YA zXuu$|so_}ie{e-EtM3u==q)z6;p3Jz0!Nyvr!L$nm1;^p*B*NTGEh@R;oQ#APi(wT zu_pi8;E%WOvUD43D_L30nV0-@jBE&*=-G~(<=V0{``qJLEU=WvxKxM9$a zZeRfQyJ;QllItU|ivm@i zwYT5fgU=1A*K~X~EHyTZ?;a?rD*0OPVCArW4|4Pp6^w2VOJ^YD4e@Hc8( zq=(&&If41cpb~NNTzz2u)i!EOczUDTvErl;-0mMyX8{8>{w*B6XyZNm)xP#me1B~4 z^_#9We_jTVxFX03UKh{taQx4=@G1y$m4n$pR;cXTPlz6qI~b}Q?;MMLRDH=4h0^8U zA17^|U~2qAts-w=BXut1XKkLWa7$tjaeV94uLFFKj!A4P^eTGULoATV$~hU;uSvbv zsnHToL7XT^Kj{WZPS7KhoOsAO&f&$7@zYK+e-T-ZomEqWx)O279-%CXk~7h__6{TC z(}@=$!i(810u1dI`CYTW%Nl)1U4NQ+A9bg{8jRKg=TF3Wa)#2Eewnk0i+tljs4ws^q*|A)e87AMZ4q(yn(w3<*XK>6q6@%uSpqRbCE{GC{viWGGg>EJ zG-}@=eJHQselmRFRn%hOqa@Iai`{iGjmf>pbBSQtG>v`(fRaoKdkPY4M9FSXU`rle zNW=e|XJ3riwnF8G49r^(hXv$GL}D%8e_ZhB>+fP_Va6#gD{XW#C2mhwT2T#lzWeeG z+S(G80UMb@059NUCuAPrUgJ+AA~dxnsv%T&Ul+b|#?cYzqmc2hjI}uxBDo|*BL&$? zQd5*oi44I4Ax(c$l0;7d^<4i_!tZ%^UO6I=@ZsCp%(D(K&HsvZ7arIUFe>$Ke+P;) zQjn)`i7F+XI(CiIO^LZdcv2hn_d6M&vf?1ck|BPPiDRgm7m1s z@QEJy+7QQ2kSRUiPoynEkwX|lFH}evH@ge|#isLYeA!ZJ#uRrD4#K6>{J0_{fadm^+HyFVM4u;bGicNeRf4@n24pYmm z`Jf3OvHuAWP;y#AWp_d`>7}p$#NAK$mCCos{B-$k^Z3D+EkMF4ie&(rt}$)zf}yc! z(yGo!%>*}l_F|_=#mVx`G`KSc?+hIdqQ0KScrM_3TXGHmbKB4`;gs$RFznZp$MYg~ zP!s8c>yR8PEKC&&UhX80e+I|>#!Ar_f4`q0lvA?&J)jb#15U{~X+CVv;0dI2%ReP- z660D26CW_UAtQPx?fZwR8Ds|@3p7gPyCF{8=ke85705BgIj{C1!Ldm&IFf83>KjPH zXk;)^GRtfIZ7WEC2O@=MeSC7;+x+&MWVc$q?Eux=Ak=53-YT`?f2?-6l*JHGYEtGy zd|_VyBJ|y7M5(>U+l3DpjtPAk9Z9UGk2ISA_0S!sG(SFnBvoSCfaF<>9pf;}wAwvt zTGm43jY#r47D#LQ?yM)qZv}tcnfVLQsDkVNI~RF1ZwOUj2@gKw{-gf6{sKcP})Vckr$-M2b&r+`*mhZJgy-V679`pMw(jGhtJr67zIF zvD}0vALMIMGaO%r#W6ck+J7#G(Oq76I1He=4$Ib-XQM4;m=W<=wNq zsqLtiSW5r6?~tFVju?$*vcl-qWI*#eP*aLRP}ZHVJ?B415?KE+vdf0%6ayecjRE(Y zQ85SmB*W0QQF%ErJJmHU;IgjOT;D63#c}&zXipLtpf3h#EEXSJ&VH$z4yu848Uq(7N2Tiu?a{5BoZA}Y`I_5tW<84d5zvm=}P$l z>f%*B5^p4wLUw}Ikt=bKQj3jiM=|ezn2#9FK=Dxn%etctYJd64y^L~oZa{KlAmSt| zH8#_Vfv}L~dGYUtwzFPyU-H$v<%E>t5IUY_CUc>TF3PQ2O9e>OErTh!pA~E^=L}q# zuF0jhKI6W1n@Djw0Q0+^MeVZLql2#sq{Q!f#7^tGR4U+eGjDI-rsB4ZAB zK=l>xV4w{=mak~vb$va%y@`r;8K`(HTDN&&g-)iqO~HmCxOz#B(P66spBY zJ){g`Kc@Ckp{Jk8!JQ#7y_%T3_#K{J_?cm3$MiT3S`!w1^M76EN|&d;5u+zA7j$nWY$1&*x{5+f<1hqZIfSx{uNtovCU zP7BSTxPJhTP{Cs@LqpOgrio|g)U6!)(JWaIYszoRm*k@|&zgHHLj8vbJbM5b)_Fyh z--qWRp}^W`u?u>-RIXWGD|H4aQ(5W%SRQ4xJ-9jUBJ50PQs-dV6K9(fJCA~&?Fd(k z9|gv)P5vZWn;AHRJWICHWiCmn=1tLK5*1!r@PCB7GZWe#&Ea=qzp0iQAw&LQt#zV& zJmqpwt0vPoXyA^U6MiV70a6fOeW2)i$^0O_odkKoxplrM+rP@C#Nezu=M~oR9T1FC zjZoRcWtit0u$N3_7De zD<(<#3jTuY2%eEzXzOLw-k|8Q#z~5vZk!cD%t(>QO$I#!Ca(*K2_36bOs=!k?nrkI zw|Arv7)t?{AtO~k(O+^Oa=29f+uDwzdVg~91^H732dK6naf-liaDC&xZtl$h$nUWE zO0QtL$a?6vq?BHJ=pr@XVy%SNfTD*?)RCGb)fR#~MyCqO^d#c$NxGb8YHI8i=Q6$! zremv&XGW)vyuo9Fnte9L>H$rnj+T6^26V50j0BuQO>aBpy_2 z?}2z}DQ1uzv)i2B51ix(zusJGB6%(b}Qk_vV@!gOOY)$s|wk zp9x8}ku~7`^rF-^i5v-uGKJ>N2gW}wzt9?^NZ15PgBQax9Dtb{qnn(c8RtER-`;-5 zkn&~hJyu_)ED_zWNbOyx42A?@i#O{EeJaZ+w8`1dI~keH?H)D}@ zk^>~7{|Di&p|v`-Nfuv82Jq>^YZS}VdLm%Ys|8Tq_s&$Va!8AoKa z5f2`NthNYK)&0PT_8^t^_KGe^L@)R6%~q74bJVon$$Om)=n2b$dVgYNMdx+piq&u7 zbS$#V;8!F)5u73E3uf)Nx|R~89>LKg;B;}e+A@0STQbPseAnpBQsqP;#FedJwE3Ry zUsAm&0tE^33DTnwxeWCr>Z!3sF;CqJ7lqlw!9mS^;4vN2X(nVn!4O*(cDJhm6GYMS z6K%P!MOQ0`IxU4Mk$*NbZl5R}QZ(Yxeo7}9TJT=rWQc+hI~-3>QU=qITva)yhx za(Ko8ug1-e1!24(Pld$JlW^dNtW~x~9i9PSJ|7m)cI>-Yn}12-d^Xh)4k9-rW+;1< zA;MrsX1H^Wgi#V<01(PZ43mA??~n+GMFA|%_cpi+`;xZ8%9_Aik*I^a=*r$CS1zX1 z28$JnOlY$h!*Dtu!1KzyKsWb&M(vT;^Ha(;ZnV^_!H~RCL+<6nDb0I-XZ`a3QjS?j z7bLqcxNx&vGk*$Uzo!zi3s;9xm^5yB0x=MKZovi5m~~9uFtLDe@e12cOc@^vO0l%# zx70#o$G=X)_4`nFy0g*iqRuB17%?RENj-dh8p~mAgJd0}Dru4YCBuvdSKw&~VQ~{i zT?h3Q&9~&a8Et2bK9aL2Pu)=Vd#Mpz<_;0tGxluwJAY9!&cw;>6j+rN@sE7O!@h`G zJKUB`DEM6O$z;56M3@aDAg%1ih!v5dAhGmRd|RzTM*)?|m7jk5+oHCF~>cpfAN z?NbLYF$W85D%q~8#&E%6m2bU9G$~P=>T;IwN9DS@10%%PX%(F7Ntcg)AoXj%LtmZ; z6~rqnnSbhtr!W%_jLQ5y!)n_Nb{7UZy*miSFcbzqmhhMgiYUIQKOZ5EZ!54MysGM- z{)DXI#7ZX41TmI|$qf#y3xq1{&89V2-=)IN~9aJ9(pv-nzMQw(@sf3_^Sh@vD_J6uSJ!yHH^#;08KNsC0m-a940&2<{ zJTBy%D5Bs0;z)_EM;w~5-dbIKO$kOH7J;hb@)W^|R%cTg-|r_Jht0whcyee<(Wev~x*Xi8ir-ymZ#gyT%_`nsF?*=SqT}O__iYq$Z&pxw!LSlEgs0=#9*x-TrbjJ~ z!`FpChBuU)5SyvbuPdP2)8hRiEWcsgu%0@cupu36lviqDK;-pxnBBAvc6PYHW-$93 zV~v0`oAMfkA3>4juQY6LW6Jcw|H)bEhp_Tu55V}it(hpyC-LHCgl*ALK5#qWOMhjj zk`GAn?Xre!c8l{$wiJOC1b&U{m^)U=VrLUkS5BZr5{dRoKdzZy%C$bHvjZ2ULJc@F zB$FL=41swk!=-t8R|)%5RvWP?3h*-=Gm(?5ziDHW2Osv=F!|>@{pzS*NR@pfi3`b6 z#d^6Z{n2(<#u3;EDT$$|2hWBma z)E(l?u}C5SuL_PSpCG6kt8F+_*bhl~m9HQhLWMLt8UGy(_0MwR}M>umSgrvyLCl&H0z zhm0BTjz;Sw3MHmwoLGqL?7D)}A%4Gb7e-RXY)l^Z)U1fMcj2+LZGAb&Ms~9~)x`*< z3^rC>gzY{&%&O-;r-wo&ide<^$^K7E1<1y)BlQo*QV}G`hW9==`Bv9xY#NP zSmN1i*H|z!0$DR=$N~UMbLCcKe+;1Fsu!Qr|NF(3wh9=oYPc=uM=0#X6zNn+6vU3g zud8;WgjvMZoAaYJsc%WP^?W~6=^j8>+?h+gQnLD*+m!3)YAg2MUkrl2zVtC&yfzjX zfEnX9x3oeu_MEm0Uw?%m5Q3I~{-KNFA+|G|;$Q%3-g|T$TANa9StAi#f2MBVlC)uu zU>Q?`lAiW9!rX;~97cZxgTnH!osjOWzs55f`<}%8qP<$eXV@5 zn8kj|_@lVI0@IL`g8KqA6*G9hoFpR!#lNh}>TZOJm8wrlg@0BI*DU)N5J1}%0I0As zn*+t*=H4S{MvjR5Ypw0U7ZRoY)r@dHcJU`<@>rDS&Z*c$%~CpsLS%3jooY}u=D~$# zBg7Jm+IRpJ^BeIfT-JpOW%dpsKJ1SjvOkn96qinOUmYEg`6iS)+&Z1@L@7osaOVkx zH-U#hK!nehNPjxQ_VtM<-Z=z>1<9kFuWFUlG}9o87kbc4PH0V&DPAjCtE-`W8$hq& z$_Tac9U++1kS00Hs09it)$))i<+GA*a-4x+$ugPR2Qj9XSaCh&QHOkXg7o=!I{8=M zxmzr}VWeWjTWnlVD{KiHglpfgTXP0E^^D+!0NAjip?|m#;G(Qn44LH*}M@O0BV&0V&YRyM8oh4=}gj*yAN?5(F zT5~GIrGMX1ROS0|o$0BctL`{dEGB&#rT~TfIRoBx&}!LY;Ms6re&a#6eZu(1#PRuO zUY+x}rlsWI&s+?$`6l)u44*)%89GXhwibo@pHb1hf)#A;g*Fa>}m>5+*^7mVYvbji{%U1~K--RG+>9)Y1%Z2L_cC z7O4bIymDl9sG5?7j^_|oLbG-O?#{gh(G!JPh+f9;xF2l)p12{=dHZSJe|dEel3O?) z1$bG@KTGh8#_L!Nh2l|t!M@785chEzf9Iq}>Z$t+i+Gy4&U<~G5%@bK2ize3OHM;K zr+-2q+zuRJZ#)2L`zI@Sz=a!F#IAHxb$?0xCF1zw0F<@M@A<#%QCch);=&!}3!5W! z@w>4!Yz%GuM5qAmS>l|Vo}V0$D%5FK52zzd7MK`Q(rCluMG4a7G^Zl=#i4&gb0-3= zSoe%!iXM_RX9&&AceZ9x`D5T&_|O{4KYwOn-fJ~Z8T}BCAH^ZAJY{oL6)W$E+NFPoo(4@u&NXy*5%u zkmE(tKgL&-A2nQRFUEei=fK=%ijo2~Zwkq^SrMu(t}No5HDQLOeQSUlA%{RT0yID0Z+|A_p25JM zXt2Haa866MFsQjZldt|q7uvk^6wl$~S-)d}xC%z$x%h@JT|XSwA5|H(dC^(KScpSLy zKr)L1xesaT7ifrr?-a9oh<_8Bwh&dUI@F^!h@GMs_p}YB9ytAQx|8zE;w8X#otulj z7GusvjVws~`va)?o)oj}iQmvAGxm;1(y`^c=<|*L2*$6|H{n>~IX>cKU2c;(&f;sp;1T7R@Le|S&0;vNJ3 zL(@kmLc2&0Qnl5C`gO{Jn8{k3IlB^3(Ond%f~ZdC`x=`$6hDThC#Ugq!2$P!3MPJY zv>M+M-l3Mxp$nz#_L6kpJw4K6kaf_=?OiTd8!q#^y;9N9mcDoJ)@068br&EV-)qR1 z-7d=uKbZu)+XD@NL4WpY1}L^>ECb&rUO*q=ab}#h>gh`h3QpwYBKjiV^o2go*UMi; zpFFydFQ$E#Ojhqz0^=%aglWmXSfxf2N>V^LIz-P**3^nw{eTq?*5ovqOR$g@mG=Yq zlZ`0aDAhjGB0dEPl&Oz1GS9gjypeh3&i}WZ zOnfM8#EKf|06Iq<*4pr<5VWXB zKlK0{9)|B_R(qdN$fgLnNzg8cZ{(NyNb-1I%rxJB(yPgz9|UMCVr#ejydqYt%8 z6P>Qw+79=YEhsC+;ryve=l0I;-+Q^E^>SsGH8`xB{C_qLb-_wj0fdZ!>qxV@M3>ps zst}(w5!xM|vZyB|Ltl<4MVKFjLY(}S+?z*T(@+m%(`fHxialNSa@8K2y|7F&>b=~_$rCb!y{YY+7;! zWr#x&#ebC(1-j?vmy*a#^nb1m@1>dDkCmI%VB<=JAz41_Wg(Rv@o?nM>=%O_un780 ztYXQoV=y!LR2Q#(_-q5&wsa*6~;I$1LJhP-UUKMyb|BFmqF#@%i<3JF9hkx85 z)slGKRnT8!$M1q=A2p3gSj)U*g2;h}_V8g!R5D#BozWu+caTDK8J_RAvc+(_j8lQn zB#1M#{_(xo4BL{98gWR`#S{Jucboo8rOh+$L^7uty4mF$8AHq`xjgj*1e~9PCT)y>T75 zc4t*-peW`7#+p7p?5R*H6CXZaem>=y0hmjXE2kBzSCX{&ZVH7dBId>4hkwbbe9u2t ztsoT2$LnN5KZ*);iME`o(b;ZzU~1Wff@kM-yRE6!O@MJVE6NE;;Zx|(7q`~bPM=N5 z%Up)EB9sv^q3MO()4(Esi=ylSmt#6KW~6KPjc}nujZe-4PxYW=^pgx&!0Oi2P-@*C zggZ)Ns)xycrHqs$b$x<9aDP(>ZDqU|Mk7z}?+VDj3K4=?19^Q3@fe>c4Q!H2zlp`31LZi-nh*+*?=^N0xa zp-?&6oNw+1>H(7{FtN&#H=v?J0_Uw)w6{8d#7+YWj4%k>a~%#ahd86jx4677MIms- z97})oW^Ey!+KqOl&42$M+c1+oZuRVrX|;{`66JoIv)D2|pM6)2R61k>6UhpGZVUt7 zY2bdF5rEPm{yU2m?87WJo+yH}m}z^lpbuVXckRKAaX>0j^Yh$Nr1%*N*r{6{*tbV; znY;fVMHLG9l=Kbytf+wqx9UP0NhntOwSU?A4DFH)lIjYR1@9E~|oW_)T@g^@adA;nxadpKA2v z$~@$WF7z4Jb{Esn)~m$qGE0*IHVpap&|e=VqCf^k{F|gv!ysCu-$) zkIfUp@On?#U;7UsjJ729YpKCljCd`?-QwcD zF-zjO7>x;v>_*jHx@*$h-x#wGY?f=WYHazw=6@2;aZkWdK>C*JI%Mhd#Z?a3p=`d%?)8|q*RX*| zOh0A@=8o3&C=eHq zz<(27p^{jist}Ner>!`p{ZQTd|KusAbOO*~DNe{?%KBoYd1O7TlrF)ov~thXUe2ow_rR(rUwgJ%5u4na3{?7bx#0aZe=3PA>r7wSQqVl_RwvgKtG%0ru62ads5*9Zaxr@OxV;7HS zI!^BYL8@!5Vpe41@qFkDrbH{mhOLv$9hylZCLVuc{%s&%{~XPe>Xly47tSzhSAWph zJuQ)JS8rev-$0ORYa|bvkc6OhT4fT)TcDaRL2VH$g0M24BMeo$%TD6ZUMj>Z~9w zmbtm`maM<)e<@CqJ0A@hQc&f6;?6LnAk@l^6$8r%Y%qvwxGc*z2-*8$0e^xpWCLwW zvNiCYUi^BlB-4JMIIfyaztLmUrO7*q6L;i0r&(QFR?AAH% zI0gePPEH$_?s4AGr+c58h|#1Rsb-?H&28SJtp13pbDR+2p7bqb^M8<8aJx?7KPJdW zhW*FH5Zh_SaPL;6lnL=%x1T3^C%|D)v_2Ov$_E!l=UdTLud3`W+?}ZU-HlJYA5k1p zupp^XF&38lwDf*Gsm?c0CH0hbb;_O5s8}I;iJ%_trW&OwHU3-1M7;R)&#rV>5TUIr zX}yr(^Bl$)e;9aDaDVGu&XpHywaIL`ciK2RlkfN{@~L)s?UO|3Cpfs1h;ilN!BC5` zYgjEd_s?lUm`6{2vc#_6T{Vu7A3DnJf99eXu-3&#GP3o;{D0;?#Rq0KE&O_{j^Xfv zC<%%rZ4qza1ma(f0R;%{@UrHHuD6pBA9)uVOs;hY3D>1$dw+Gvk^d8J0Y7qe`Ak%5 z#9Wq+cD}>fd0*K1k4TtHSYh0(PW71HxCr3bwKQUv3UowXHH9q@zQn7{EF$0M_|)AM zEkmRwiw=Vq%<_C$_MrEZmOnTz&27Krat2A&Q1nE>@8wjTHC=4Dv!-j#7E=sMvx*#xTib#;err`L6E2%{Nk1c7NJ$Y4V{Xg(?4obq$%UL^cz3 zPFc#(J>~60oHrQFZuZ%(x6CPDaD`+~wR8p~I=PvXp_l}{V?%3LpU_48I+be8mOXsh zTYJ9(H#0!BD>*D9q7<4@Cd0%{@~>P-C{g=`p;$~h~NfpdVR(kkDF$Hbj zYbxrfa)0iR^Tp&QRyys>(;M)Ji~60DD;nl-wBXTs+Q`2o8Q55hWe|NFV z59q6^PT}hvMYrsbelP7a>phzh7Kr@Oo>;=m@BkRO8s9`Tio0Mv0@=!HYhfR}<=qEV5tRFe_wa;BV zIR1~KSmzcZ{0DVJ8>K`C*{|9!WQyY*Uscu$9F%M7QRKx}`0ak|jaYY$yWai7D7rGr z^na?i7#0{K-*b6teH6dkQmOo;LyxANL_&=Pj$@*0%9jeMaJ`#`yA_IPF&*Ql=R;iV zweRu8zp&CLE*0Y>#PItwXE-ek>b~Jc--g;+Ypehzo3+c=7(HF4Cnky(gjyMe3}%Efa9 zPYHC)#h*ZJdWzQ%<6<*UV)BTAwA?bxj-?`5yWyp0Qi<#nTU3#EQ1a!{kAgyyXn$GU z#-kB5aqyfA3^Xv67+} z#45wb7Q~gFFl%&1lQD}(bk^gBsQTHMI946nE55&@(RR-x1OJ;^ap?I;eeUV(+M&Ds zs`qA;f=buJLLfhy(1(MbD+X!_wSqddCNPH-0JJUohdvDQVq@_LH_VgW<#|qX5D*4eCU(Fr)wkuPed+39UUgYqN>r(u;@ zthd6mteA}Ho1qE&C;+J+tjR*6bzqrvHuOgAAOrGZ9>(ADFg=S|?%(BVAH4-^^G)Jr z)DccefxrPob0-+Lrq$P38Gn85tV?g=zZ9$ej-Sg%)=~vq1zN5wPgp~~NkXo@4AhQW zA^|ibulAo$_0-j4Bt{rhFqQ+_z^qT=zw}>Z5V2}!G2|j~cVdM$XzC(B?Wv$a$k`i- zHW>F!$6re|X*sP+Qt*GNGw$AhXCLaub=k%oEr3=a&pQ+Bi0ecggMWQ$eE&9+{&|2i zzqU$Je$kBv?LVGf1X@8vbpZ@yJ!yCE@qCoU7ifY{R0*d%rbHy>(Y_g~j>{%Fiu{ra zA?XZmM;ga6QuR>Xq7gnUi%VIi6lI^fDy;izre^qitcO2fhXwPnEsix>owk@f)%mYj z14MkZo=bACvpM}cn}6#P0FeU}R9<|8OQoi>;t~UC_c(WyK;0M^>vn2k-X%yM^mDwxF(KFyXKG=?JtR-rH z$iuD1^>$8C*+jbyYY_(!iXs+Pm0Gbt`3`RWp;mNI!Q{gd7$T5B(@pb$Nz{ zj4qVRt-k%UrAslCZTYKw5bHatVrZ{%IaZdq(OXEGYlAp_e0~MeHCW!;4UF~P&}Z&d z0;{fS`9rl^ZhuGe=W9<40y5G+@RSVw1q`E?fbJASd)HEQwATh`ClF#Kp>qKcIYiOM zZIVIdq>_D9J37rO43?eL7@^vY1EZHMDic+16`U=d%Ds+K^?I_jsvI1Qo4N93Hryt< zWQi0|mUoX{6zO{6d^u{%qtd%(9Bp7NxLPi^*)5N}*MGBBJ%g0WO8-mBC`E~s=mdBA zLYHcYUT_MK(;p^g5f?V;&j%^pR&EWs2%~Z6N`+bUhRwdC@{#ugQ%IxL%|i9~Nr*_j z3*xeV@c|?PX~b^ZaF$_M4BDv1V;k9(b$gJmRHg*^lsvr(j#8w|7n9Ag&7g529uQD8 zwYIg<)qip41U}mr>_znW*6AJj=^M4DT}H!uFlwd?*=4JROECV&2Rp(=L15RHZJz|( z9VSyZVN;5j+dA#cw`1stjWYRaRdr!bZp}=wQdnlnga#p=t+*nXoAMLohoz0H>IYSX zwzKvn&S_geag+9~9@u?!4{HC628p`)ex<8GD}POP01&%1`i}6;Vt6mURGck^NCrP4 zJvDJvUk1xac5|$cTxWL#NEt{VkMR`BFnywh0*#E&0kC_O)!aJ@R&`jYQsB!34Wy&Z zom0eT{je5EWUW5lBwvPk;U5j{8lwAUak7obR%R3xnAW`vka+lk!$D(t7WW&~68Zml zlYb5m2s#>dD{8dvPu%g<6#~(gQm9M9*<8XB+#Sz#2Y)hg>H%-EU(8yMf{Y8VTsh1K z$S6Z~T=t<^Gm#=x?t zkiC$6q!za#zW&3}!osXRjbX3S#*t1L z=DhU#Ht8@eA=2v*R4y%JUWU6^V3YbBW+~#5SIs7%@;|%#s!T?UORd zZA*S`t}X)S+~|pwY{)AK{@z{LwC_)Hhc*3DEi(tJqY7@9)G{&Z>#KJ zFut-tJL;7CxwOGZ=m^wP6t?SZSB#;e%mNTFne+o;X5cGOjaJ5lR9PqSjB{6|BEb@e zFeimUF0oIV^ZY9U7~E~vdRrWo>e0kzB-_#E{JkPNS!CV^1 z?ZxJpl3=Ezs1?13gC$n&N`KwC9!5(;hPk6xSG+SaQOAm|ws`HXUT02_;;K&_wsdot z^4|6lI-0ZRT6}T|rE9@FKB=ew8A?Rc@PWf_GumC?kjLzlM(+zQ2O03D_Vujj;>IDe zjt0-knvVtc7!&v@a4M$fk9wd<%*&b2TH=rEYGr6n~>$;7Qm5NM4oq zGJ=T+Qyy)!f3ws3u2g4rOUk7#RSx8ZBCU)0_~;mgVSbBiV7o0t;A03r?SLaXbwr;D*LMfm1iA8zcREV8I<@N6BV`I#ZU*3})Wf z7HUM^-{0KInN_|!&SCUFkOp^Lx-(ka=F-VY-q7Tc0QaAV{(m)u?OuKlx}rV$?CnnD zjDlWCnMw;*K0GE->?1o?CZZ z<=0S2ZJ7*b;D4nA_Y2g}zF0ysl*uX!p%c@&d1oa@RRJvzdqVP9cz}mRV>FJ@r?=z% zPT*@bhE#)N5oz<)@W%^v@rDix8A;I_f3JMH_r4cl`*qElDyBRM4P)%dN` z9|rWm0;V1JC>(>HHpDIR=A-_pArtn_bCW^hCUeD#tku-XP4~4HDZJkFg*rc!;8W)> zT2Nv;&VMXvF-X16Jf_a~e63)u3WTS|V1Fj)_bc|mis9>@k&F*yjMTqqriq>N7a9C( zzV2=j3-l`A2p01vAj5oshWD9TwgjXEWviC?w|Jc1!Yvy1ALYAw$cpSj32&;M##?`8 z85{S+%5Qx{TM2LBxC1!-_!#(^T~8g^ASZ|9qJM*_FY@l0G^ZG)Ia`I4_7J2Z^&2M@ z*BULR0JYkYNc~HM47e*wEbk|m&aV8;2VHw@i^i6JTPQ0Ogs_}l@j1+Tfc=W~nIwqfUenpdsWrGabr+$SOid z9)F+=E)qXjIOVxWHir}%{B`;9jfq94JA@JvxyPrd9gg$2XRW~^gN zhsz?%jd^Kfa6W#pUS)Z=f`cfZ7qtu$W&Y=S6xZ$svkFQ7O7CEuedlPyv*M(*v)SUBXZhzJa za%=;r)4FxnI@G|`*dNj`q>eUK25g<0=_vX}7lt+5Ud~aai%iXOZnWkp%fJpFP~(Dm z^?9yOgi^nPO;Gu40@&ZFn_+?x-C&AEht^Clw*=})ZzKkYeZh>JJ1RW2V$d@SXuxl> z#A+J30PZ?KL~BD7I+SzSD9Kh%B!80Z$z&Nw)yb%nb#4yDc|Sc#4#2h|mJ*dFB>_b0 zUHI&ha*nr;%c$a%Xsj-;EgT1HdMrk$b0hca@F))dd?2<6vhg5+B+4|A=0QRZf8{3F zCRfDc5L)XlPt<7j5V>WKw4(G}@P(P4*~<>&+4-DEcCVuVuqEy>B(W1f73wyoCl;9S z6;BjnEBPyI?D6=W{6@Qrdt~DkCGK3)%L7ERH68;?bX~XR0HPr=jW2c2xK8PmQ7&xihuevytwNA%2&vuD0u5g$`z7g zM=czJD5;s|^P96sxTiBz!x^#M;!KJy93hikQV?!}Y#X8qV;H~nnjvhgbzDg@_8{9R z1NHN~CHo*z?_#jA^ncH#pjXV;$ldr`j2;Lhwd+wJug1*`Yr%FvX95PG+8_7yi)x*e zf^+B}Bx=s0a+4*orxwJJYnR5GRtbQ_V8W5u9%7RLK|GUT)Xr-8k=tfs3qt!Cgn#G)g@T0e>^6rUIdzeu z1WfHm@HN{h;4+h&tuGzA6>8URr#d0!NlZsg!^I2esy^~m*SKsh%CEYZ{sR^RNDOzsyxltQL<4W)Xl9$vy4tp@ zwi+`-wG_A(q96R_qhLE6RO+;1VK%eegA$@juKA%wC|05uM}|sesGAZm4#jvOs%OG) zlOfo)o%|-MZlVS4l(h$F=y!UC2UqY!!*i2uZ=58}6@Q^#MtGgT3IeHqEz5G&0>e9c z>nplQS*te4O5_saae|)0P)tIiEfN^*o3v~{-d97+GY!Xyd0X9QU))bb&)D+wW7~#a zBCU;a=P$m09Fsy_rhVlMb+m%f7HSv3U*1{+37oAILl(y&wISs==&y|j2#4n?NLA>h zN96H?v40z)fT-EyP3mD!sTq6Sd_Su=^Za%zj~FI}G&;dxAvNdf0MX?|i>323p8j^7 zMN;%Phoo2>{=8o639X3`$HOS##H6%Ig~P(d1;KHK_S^>P+G}Q|IN{92mclXg4kVpH zW_&%=zJg4{TtVmheV>u5APdc_Pel-e%-v!le1A`}$M^7(_(QW03?celQ^wwXJnQOa z^?x5xS4b6Xly`+^6jMcswYA39I<B%|l%4EvW8mtn4_Ao)LP=Bsu zrlM8v+8|UBQQp*DYv*oY+clzN(m=`RRgx{KXvTWn9j#3c2e4yilnhH4cWTI21x?&^ z`dWt#1~y^diio002O7bc&9R&X21th+SBuwT%(tmPhmFf&(0|uGUJ$|NZ^nc!RGc!c z!RnG#1`463ti&UZQSanabl+y0w0}k<`ReALFZ@;dr@s8C1#;5ko|fRBqmg0{zdwFm z_Hv#YC-_*G`SlkyD%cgSbr?^5iwKgt$Mo zW2pi<%vnb04-Qrve;g9j?`|x#-uJf2gJt^f_~JggJA}&Zyh%*G370m3M~o#Ez59G5 z=Is+F#3-EESVNtm%nt(Al~^!W+w}owywk&`?&7}-pk?JYlq+w=dd^Z*sp(aQxS3S0 zp$aE2@x;S?tiEq|Y{PeU8Gk^QPQsMBh}Q6OC7u>F{b?qst|p$)j}+6W%(f-sl;KPG zhV0es69Lm&iGDlISsk*^H0?>Bnb(vT*9+PN3o4{!m;bVp3%aKvfI-H3+2*t>wzFS_ z1NNki_;p`A4R>}fA>77o98zi{Q||r%H8}f&JjcOtUg!=zh1hswvMe!61U{WYm0X!HHTyFfUnu$DD7+1%fPP>BDB)j1 zpt(1V*O&}`%wtA07k>pU9kFU%j^?3_V&WVLIYm=x+vVwj>q4DD)WG{*SP0oeC<)Bl znZHmI+?=?YE!|NSB=t=3b*^7^IJOWX80V|o(c*WuK#Fs^nbNfKfv)1ZT?t8#9Yq34 zq3p%CM~|fM8W$T_aR#nKk!8k+`24Rp?qos>@?VS)ssCtTTR7 zYrQC-h^(KmVOekc#JnK#@+-?ePvsh~ucRNLwt2y4E=A8--CWs*ej{TwWz+W6UwdTg ztV_l3_%oSBow{Iv1}{27^bSRJW}#7wh<2VfH~OcuY?knBTJq5+OVk|_tWOA=e-X;P z`ImPhxuAAPk$=!Z?i&Y?XhWL${9?Tqmv=*oy%96cZ_5{uSf(7d?P9)q({ff*jituB z(|?;VURa$jsJ)X)I2~IcH7eA}Jy}?#U5^aGhU<6+Pp~VmCB=wRiJRu|Q^M`^KRO%* zZZl)K2=b0K2kx!t9!{=pXo@}UUaaId$@6&l1|%>}IDgR5oNq}8zZr1E4>dU5=gE!k z(TI=GSU#EAl!LBRp;UjmCO`&|Z>Xcie)vlWHIo+f8%87m&6GVIQ&xlc-|(W`vm`w zRlOQOFnJe4OW&ZZyRNbNjSPDWbkR8Vq=InT*vP2z7H0_k4sX8A$e(Ck_`Q(Oty$Yp z_>0QA$~+eVjU&4iV0$sCHWOR6EkrX#iG8#rkAEOw>y_KS8S{WFDAj0zYy>1U2U}oY3tI2T41WXgHJovJ@`FR!3@>V#=U7c%pp12^9MXZ9 ze}DgDR%DRDvWPs0a{c-6KueWZU+#B>wt|yGQwIUngCi?H=X?!|-qK5P0qYSXi2}%b zo(6_qNguyKXuq?*{}H6_={@#6Ri=YdnY>;M@tG@(m2FvPsv@kdld3N zT0*a3L)J&)`<5z#c}ALZEcrNy>s9%FI)6K*7<(+&e`m)Q2Y_$ak{U{E(v#LrspQFw zP11q|CYx(y0L>u1-I@#lORMZT0k1E3%D1-G7F`O9R*<5mkFoN9mORpsV2zU~JvGYA zbps$&Y-^`-U`p29p@azN2d1(-Rb}4h_0;bv*m3vO66}rgQ+2h{IKt~3Wue>|P=7|x z@j{f~a0_Q?kw>}x5~)0R$dDBOKWThT0X4XFHs$0<1L*JvPADmi7&iyib79a~%=(=4 ze@#XHWb1cEJPh`<{jbT=>Ba>qEf`6ghe*I=sy}GfcmiPfhQ9!LVp9t3|WtDBdGppE{IE4ZTwdO+80}2e1%cLuL}I+ zV!~+2eM;vEwZfD%4Y_AvqWU@Ct9Qd(G(SmBw~!@p zB4Ed{n?)l}y}oJZ=27C7U|NdK#UjGpXG`(Uyv#OaHEzfE^*2^Q>e=DO9qW@4v*M@l zf~9N-ofE&9Y#Vz3Qb4W0Ut#cznS}I#HZ<{$Px!-V0h{-Hlk1cyfO8a+(yxC{ubtS8 zJJoWY5kDlGB&&8v3`;%hSE1K*u6V6hw`q)!#T6s8X9K|h*SGQKs5y^#JbNsc2&TNQ z1ay$I3s+!ka?R6}0bJaQ+u&`80AoUL<%?i`(@UR#}{ z2`1Y7E20#SW~Ql(Vk25HukL>a^L)3`?oW}kC5V|Lx~3C6Pm~Ab5giB&vRxAm*v*~) z)q-x38c3+4qx% zKfQc~YY5ixN7KRWw8p8D2Q$CrHL*1#csL{JgPOoeS(BDb+>$D)Z2;%ip09`(;rkin z$K6Y7NKyYK1WLXiddV6vjhtAAc6y)k&KBl|<@vo#f|{j_4r9lM&UoxS(2Fxd@&UAI z#s0=C2&W(qv(n45K)QdJe@)P^z?Ah{MA|o!Dkh}{9jcNEM}D6*wzarpc)0JUaR6dG z$DWiOnQizdpu+maOTtUwIHYc@fwKhCUe9yhA$FFQ`Fmv}gJ&~el(Lv;^NZYWUH&ys zz-glNPyA3Z=>37>OLXvRC5Iq~R-{B`|3oti+9OpaU{gu=@Y{cV+43}c%yfK`?g|_Q zyu`(q1p|ySwUvoa!4*ALJEt@6wL`Ki-n&AK2{F-KsCXSAU#XX8sUw*Aln+8ND&YsbUKY-}9CCIr>KjJs zWx)2sKrsqPg&Fab0y_8f$Djd7R$XOJ)uc;Y# z=;Y*P?v;N@cQX1l)>e}Y>^Hv0f5N_$-_njqw$o^RJ({;`t zPlue=K0t=Pbi|AmQH?50{_`T7lZ^rGK;z`~e5m@a`GV$(y*px#1IYyNyKq=Hp1Z3H zF1YU*g>Z~dqFT~1RCdV8*yT2cgx<6=`Ozp-zvF*@t&Z;$qxBEy!?|NhB<|~DnI7(S zj~qIu4dIZOArfXSsr|#-K#5s6(dhn-Ove|Ex06L3^`0SO5Rln&r5;EK#~<cFDP)pUZ*oiqiSys~7lK1EK zlp$D-wggVsdW|mh48dd0h9mo2h-8DS66|k65xyMv3NEvy<6rjn2Rm6P1?JR_S^1X- z+_8yIiGwy!;>AOc{UMa}RdfR{K~YZUc{jLiy(?$5)T}?T{?4L`^!|-A^d8#wt))kqfQa|5AaLZrN{qQav5+L;dk zc@jh4^6Ej^eO)`zO2$EgB{ruT6!m}Vp*G7k7ent5deRRes1)C zruih{Ku{}~mbyC=uBQ@sg1c~!gMbd1BlNV%FPY_njQn^`Wt_U|4BMrxu<3Hn;H>Km zPQXb0_HE_HI4jvklnGU@n%guelfKkZRGA@*vNPC8A1O!jnwmTW~A zK|1m(>GgG+DE7Oux#nMAbD(J0*d%CotEb20_RMtbfk+?kXWkm4gy@}bq6hMD#fg``Ohiqfk zJ(rz;Jt1yN=_@i19k3afMrCwN$q?(@)?Sn>OF(A&PS*6p70rW+$uwWk`l?^!+aK$S zAp;mu1)xolmZq0)mfgO_l}C2^B!~$Vth1x@(9N>{+=brkeH3s{*z!nFjk3Z&{{zKS zseXEE)xLI)#wxJgM4*57I&i0gpz_|O>|odWDjBWlW4cym2o zY*GhGV1NWq_gAMO)g(6cMZbsp;DSzx*qfG8?i4+`KtTV8JzxT?N=i7g1ZF-*PVx{{}9TWXpEUCsn z#UfG=n#qg(g8Ig6d2|O(2AsUqn^|)>^c!NwBbQrfa42uFSZwcS`*>= z6lEzYcVQ+0M+c}N1yLdG)ilN9$^}c@SdAGL5Wd8OvXby1uJJyc7D+E7;uZS3_JM+2O>y??jYbdpYo`I{ixiSELHeh9UbQFZdjUpz_{L8A7zZ zI+_=qYK76sVc&1T=?z&%`Ktq~JbjuN1CfwWJz0P4oi|d!p{nr)EqXCU&|Y5CDN^LQ zV1=CP5ddIkHu3IBnO&O-^Xiq!Bi)0kzRpU|y!_@!k<|8iof#Wid?`Kp^f5z=Zn;!{ z#E}J}hNgPDxh9x|YBH~;RI;NmviKZ@tUD7LR7g#M4Bb4Fubu;}BYrzDQc|j9vkdRC zxtV`R;RoF6*3Fx%_&PYA9eIIWZafNZaxJ$_Z|rrr7h9s-4eaj}U7KTK|FJ2#&ZTcL zam$~nPP(*G>zC1RZqxZ873u35IU9k~4*nNMdGa>m&i%TTrClth;OsLny)eKSxri$h zC(tfgGO$H+!6B?)X0Qv*=}0@Zj$684T`qs8TCVsrQke8!_iIFeurUbF{?hVFS$pW6 ztr znikpmJRR61Hl15Y0zPgZ#OlKuSqg2Ev%m5y_stHfeVU;9eh95XpT!ypfK=qykTv4* zAbmrI2lvCUU^)%}y;MDqR&cx28=tF9Ryqr>_My#k&_M3 zf{q1B!_W^)ThwQN$QSJOSBLbDT#sBfrRgc1@hRgr5p7J%AYIlRCZ5aq|J{GBwBU$} z2qhEG^3~+J(Xfch_A@w@Ez2}{<76?R{lg>15>W6f*RA{-2&NJcSP&)(pK;?4E6lX7 z!};LVm5`D;bI*L=pI*8gp`SA=49|%W_z0|iB!(e1%&%@9FX_#3C9UaOv=@{!R6Hz^MlUCf963XqWK34_E0` z&Q8vfdK@r)o)lnap_lUo_AsLG=bM@Z;C;vy4fSq&VR=BQR6K{ZgNuJd51jU7*@Om4 z&%KRbMLM1v<~`OjysM>cH~EK~9f_{4W!BujF52iyZaRPseTv}mcrrb!e7pO1ZXMNe(MQ*hQq*oB(HJTA2atq%K=t7>6 z6gcvlWX;^4DnlI!s}kc*TH=ae-x@ugqqbwUaBbFqwXFz0gp?(!db2=sL(6~1F?ul* z%mpUn6M>5-6jLm$#k@IsG}c2na3b!Bw9^ilGg&_i_H;fvVGar0+l$l`pWRknX&UA{wE@Cj7C>oTf5qlLH_iD2pKX@OMr-@`M^&D zKjMURO0E08!_Wv8Lv$^He;MUTp5s+$Eu}huxR5iRDZ9RNNjaoUZxT0w9Bg`%pr7{= zPDr4*N}jI;4r_mCUz1cE$tYJR@gwPQe`ADg-13`{Rf^X?bj~1L9D0O;owEn}1^eVz zW0;s0wTQm|Z&JgpNubAchy`VQv9p;a6ZIfR;~L((Il^~8wAztGUHy}(PO*RreeTT0 zRG|`dAo!R2srjsqEP9dN#2dm81S6sdJH0TYitATDDOWsU|mi}Q;q-oJi znUeWP&k~s~)5I=kay2Y^q}3ZIKjjQxLGllb!6ss)ap&XIhMJUNg+$?n<}6`O_h+S^ zd9FX8lRf(^TM4n-QZWN+KNI;k*M-KcjR@c|XolafQ>%cWk)tSOEr=JnyeZo$>wE7v zEz4fnvA=)Xcqdoe{G3|!y}U2DzZK_CRkvlvj&sM3k+|eOaC?jxQrfa3m1(}4kd*vc zS1k<;tMmT~A&rb-P#i`-k!Sp6QpUOI1NQw;t6fhxeR*c>CC!?OuNXI~1;p1OSqi2k z11KI~-$DRgp}N^O(_%c%oXTPDsj57@qutjRaV3A>(5PgIZD7B`SShZKhJ5Dptqb=h z7;M~z{wcB;%Uz(+^|dGzfC6Oj?;cpUq(5=|Vd;}Ep-E{(@x_JItadykHyz7^Gp=U*ikz1&G}{tx0wNG^EV3Sm z+{t20kcM9E6d^T!AhW5vDBx;|cj^+VY^D$<@-vc&v@Z-H@Q61mfso1JX`FwF$WCrX0J{8L?DJ-I~%TD##VS}06zPRu;+kdH}Q->kOmBgIYM&%3l)DV z4p4QY6ovMjs4h{ML*eF z;FPc<>zSiTR+S3`UXZ#LB4?D@`*!){RLLxbh_F9y2XT`mRlhiE{ZZU-TRI_22r42S zycK=R-@O{n`x;w@r(|g~jLGuCQVf5UURz`ce!HXnXxG~Na+jS|W}w*w#Bg^Ey1^a+ z>Y6cO@GK$k%0t~~(5E8~b~$U-Rck_^DR67l;|A2>;~Vbg!S(=@wmoz0YDTh1uN{UD z?_(1Tt2Hh>f$^TxdGe0SXCuK-mY#a{M$ur;NgBHS;(x>pa!Bq5%V$&&2LXTQY`}}T zcwT;|%<+u}GYNF(%`%S5CKBeeC8FddNf>pdngi?yvieXvOm}bruhbk@8K_P;n+*b( ze7moaf(LeMA<6gMsTYpus_f5|+t-+i*a@V&xIwrG-W25dyGz7iT=Da*h|yUidOQ6s zfN2&z*@Rm;PR>wTsuPKY+V_7>R-Ca7p88zEqdURf$y*>+*a$z%D=KdyBu3x`SSYaY z!69KRt83?Uq-Blvdsbat(sU5LHDnh4`CUujY#L_wyslAca~xt(E(C$(qwoB+uPx z#{cI_3e9C zJE=pk@<=1MlW=NC#|GcPnqKuk0}zOA-GzpOhm|`Sh9QqvuIzub^0XdeZMq&6vo25L zo1_@dGK!xid?_|((zt#$Bm_GPP<3AGLex)05zp1rL}ON*?meK8s@%C z6%5fPbOp70nIpQrDoip2WvWt1WAfp%tGD~c{m_EcM~_`a0ljNSvQ%{z;iq9RIxf&K z5I+O7v19K2U{inRFLXQMxRvA-qUI;{*4$nm{ICy9>J{yl(B0_J)%DT{S`kM@ihkUs zn9IXXd;WXrgAsm-vRi7f=~81a0Apo?T5H5!-TBie6S`X^7y2tFW>sTE*|vuP@iUs^ z?$C<5J`Da1+NxhvGIo9gBtlN(#3g8+&_6-xj~f>i+bDm+*H4NlaGp}X$n7LZ;vdsg ztRZ(8iVzBg3wQurUj^u|pB;KqWw>vK$(}7v)p`rd6a-PAjz6wCQ4)Jq9 zoCl5SvHlBu5NowTv}!_-9R7#7{@{Juy>?yYK-7da?gwxo+o-1hYEI;3Rd&hwk@>CD zEH-~Q5?6s$S-7xh3VwhoE~(Mb;z4vdl2sKS`;)>Q|4(lHYXdu0Hu?d?@;9fKw;0o6 z7n^YG8}4<&q~5jpYal*f?Bkl|4BVXgZ)KzLGlx9HP5Z%Dq2$i}$#x!r&1aZOrreqh z$yq>zCKY3B&O{Xch}V;FhO&@gZ6{ltFEf9gc<*sj?GPvQBB)DaNE$hbNP9H+e}0!(Z*?_=+qs-wui`7s_DR!l zs+E|74L5PMq)#urZ&#gn2@ut}1ftjinPpbok)_)rf@2l>M7jMehfV=VrAt8z7q@>| zk<5z3eriD&fz-j%7Kh#>oH240ZmMC4lTZ*%ow+H7#*jqzGVYVD;*1hE%z4G;2=pIj zhe%DNV$!E@Jr&TqJs|D2*qTB5m@U~MSiFW0Pl0AQCVjmU4N@N?OwXZes`(QXu`IA9 z&L1ud+vF6NQEAhR$ds&=^}S#T73_cHCr?MbXQALbx|QgrRlpd4CiwOHM+wD7C4w8I z8{2uHECRuNosL7;;L4yIXt=2nb0E|zfZi|l`zbPjtG&mgl z$9+BNPCTeGvZ*tUWTKiNmq}g~#4gNKgP9NF{;c4B^^}ztFAd4E^8E&OdIl%!GO3tBTBt{xS7SdEeKR_Xd8HM>TyEi12oii5v zGhb4|#NpO#3qFg&AGS-*pN=5X8ks9d#1?3}jR%|dr&cfv^1ZA%ZqQ`RsT##21-+Tt z{Ns=LF=!te+3u)^Cc3Bq&X9kX_Vy!rCEGB;$Y5XL5&jwVE!+SVm3uW1ypH~w`-prO z$#U|_KUT?1?f?Iyq9jC3v!TrGMs6vFmdb>6iM$-cmzIZ`O+v!ib6W9K3zu$T4h|}M z6Aiwd&EQ477fVNkqp(-9m(L}QBRXz~o^kh4tFk&o6cX=Dg(`lyx-@^t3TSN1>O_~9 z%kq;iWnv$V^t2W9U?ZOmYDW14Op6GccFOR%ftE|D1abf@8m0-+!*D~ORX<4TxpG)) za3MS0hwzX8Wiuz(xnntdX04nfDTUh0Ey7B}+4;l2?(Si{D%5zn>t)ip-R-*#xu_`R zg+7+2lT9;LecK6Z*b9G9t#KJiUSEIBO@AD9t^E@+;YH?*l{OnoQjUr!$@~>Rww210 zdMrC+*;pPifRY(l%?H5>DTV^!4if5KMBR-eyR4y(v@0|-Axb_-dMAkr$Cj!GWdk=E zH6YLZE|cp-N7=1zGbs!%Sx19{=yVQCFaQ?nw?>ffrzVltnZAF4Ta^Uup;p{t`k^`p znXrh`5+GggtB)-VWEod+?tW++x+?e?xlZ{crzSel$$D!Si!SU~c?g@H;7h_q>*Gg9 zaRg*tEfjabQxeW|J%*=bMzo_$2cNIEr)j@s=OSG7z1Iq+ZXFvU&$bQMv07Xj0Lie@ zf^GsXi||GM&UJsOeh_svw7I5^K>7$7;bl#8=G9?M@)hvdyw0}mT{E-X_eFjb`XxLb$c)8AbPSs%#Wgi6mKzGs1RXEOs8$GM_*)92 zb?H&%=NNs}qAFj6hW=}5YK?m+Lw5Pdntj!x^5Hl4N*I4;|An5jB+PR-LM$VWQlkLF zbTTxH7uUezaxkg5vtjE84P$t!YNJ%Nb#u483VgX1NK*+_A(_e%NZiE=M6|qvQJGVQ zlj(mV1YZ8OJrUzAiv4WL9YOLxlfYxgiFpM(`iO{wO&ehzi4pe}4Q!tB3)`Ri-Pbk~ zQc3mF5dR*lkaz>*7tg%9zWNi5xO}i?Kbx<#TnSb_*;_YmJ*}RfP44nllM(!JjzpA? z*1E^9bdKx)6PgPoXtr&G#Wycsdg15Fj@f_Zywaz10t=r+{0J*cB^E%GNixG=G z)^XnuP?9AVhO#;sJU79d%t;Q&?PM}%q9xHHgInJ>=aUyJuI|4=Qd?=vT8}jVrjdU? z2+jZ_OsCyp`pZM`TixUas=J5A_1UM@1^ncQ#0?GBdZ*7GXm1t+U^wenu1Nr|Rss2) zL(}=>yTYZTw5?{jV#Q}ZunSs?!%NQ5xKiq8U(v&=yKtu&1j?<|O1%c!y&N$=84P0>e+S0^7Dh8v}kfVN5f$$Ecmi8kI6bu?Z1SEOyYwb}-Nl8mp zQA?8)i9)q*>ks;ZeUfX+|Js?e=Yd1slcL(RQK#uRvlomK(6PIgJZ1jpDop#4jzU zA_LHa+|>JPJS&opADWR`KO;N2FHsal`aCqEO%*gn#{U;tHd4Jrl3-t>y+0cd3oB12 zg|We)Y7K55C;3%mWPX1;?Ke;$1l1FOm26da7m_~J5nU1jG!oKDlEFn>;5ZXjSOc_s zjOq6S%K?6$b(ua_=&s@Ob4K(wWw2*S9+BJQU&BpM(3Asj5zb?|ZYrWu32rnwRxU-6 z86&O?;!{`s>*MR0FGe1lP$h9X?ctMCx=pG2c*{sN-|?M!OP7B=XvARE&6}wI_-jeCWzEcZmU#pkJhi-OMVYcj66f2=kDom{p~0immA|3!a__LOd&) zJo#%KA6OiMm@c6;t@z}EP&$hY=fvI;&5@IK+pc&S)gwqBX=83XiN|;NK&l!Zt zO!#2TKXiW!uGCMuQH)W>^320BnL0r`fK}^h;&^U;@KD9*B0#(E+FI zJ41im^|ku^W~mf?6E4pcF?*Aj3zad<6^-h-m{Cm^ZZb~s&9aOP#C{luC;_>}bfimU zbLFrqWfHl#b|R8e?J{05zpne(-y%!h(atU(Fps6Y;%$_O4vG+}&9XvXeOl^2?`2-> zpidT%CH(upEudd|er^y{dCdO;f7Z^Uf%|`gX$g^<1msaQ^Jz@oVBde1fk_WUN&g>q zgM0Ga8}EHe)3HIlbJs6A2lMuS6&pK^{45d5#H>j@1lk7N7tizvN__n$Ks=c8SbG$W z9>e!(i1LaV3cCGv6QT(j@mX=fJd8%!#&`@eD&E)5`M)I6riY@GZGw>tsQL7}L=33Rk024jDz2`?yG z$51iL7=*hCGwA~{s}Zvh)~Tea9lAwp>5{0;P4q?>Y-iSGTX?Jya+=dKKpyUBTuK~Z zdq<-V7IuO!dF0?d!k5Dy`!VGA;v%F zt98xZEv`n&TbrHLXlf0PRr!Ad;Jee8LPh=MFO!LO!MtUs3cxfY?>5i$g9i4TCqVs( z;)2FMk~nVb`x(QQoeHcEtvHArAOeaQSzh{>*Qlphz*1lgB%0Ff({d7@Z~D1!lSgQ; z)~~2!0PJB=wP2>?Nx^2o#MzM4{)hY3sAr#2U3!Zlc(BV8NI@-+aR+}0+16Z#aDHSj z$u>LCdeQZMfGbq}WqdY3i$exEMtHk~lX-HQGv1U!&P6z}`7~RhjI5StYb}8G5czLo z0z-Y*l2x2tE|4j@?GPK$w+hLTH5k@!AB8)|sOb!*!ck0BumoKBH4YtjO5&~OTmbW6 zh5E@81u?B4xPK`ScqxA+q#&Qz7s262Li{pD3nZHSS%1Q>GswXy7(xc>R_~#IssIW& z%eF?7c0C@wQ;%5c zGxV70Qm9fShh3K-w#royoeaWEdeb$&n+8@lUTFO{Yfhxqj`x3gcQag9bp4xGjj>pM zwm?VQ0%#Q(#jO67Vp&FVZ|2_OV5`#Vv!CjdjiQol1{|;X320w{fh04sn{97_X80GN&eUUXrn@t`9?B`Ybj?{(ihB) z`wL7=gZ=2br3MLn!=0kkfTw9C`YfiCr7j-ttaZlFpe}HRaS~4$6i#bxn}-_boJG*cUiWk4q~a-4d#l9Ce&L8;$>}yS zEtcayz>t3xP-=Va>|fSptSo%*kW3pRykcY{;;#^E!+|z#nB!i6B#BSIP94X}Kb_Hu z^#6{Qf{Xqgc$i}w?R##=#{RODccod`ChC(e3s-vb;&A6t!Z#b-fy3FpgdG`p-%s-a zpVhf1cDhb%E*mM4p!Y^dM|%0mV**!eOHBk;o@RfL6VHtOa^{}|cNuG6>n4hD#ZlhC z0cFA1PVgJ*v-850rNc4{`Cz_e3-MFAWWrD9RLu7&nTe*T=VROAZ(W|Dja*&NL<<$@ z>8h%=MA9Lt64l4F=NbR%k*r6*pjcWOe=2 zC(C~}cIRBn9n;V=ub-C#JWN}+o3J{Up{5BkIR}9iw$m1Woh>k>#2xqz+?-Kt+HQ)| zx3ACKztaq|(iR4N=AW^@QMl)7q{mxT+*=4>Nn6G^a182o(~P?~$2|a|F%^5vBYm+< zBJt{iCaP@0^roM7DzS*%%S$sFjk*cFIO~6vngfKX#%HtJ{gq{tXP>MaH%iWuP+?|^ z=8NP`suBMOogU%@Zh-j!|>WIW)6oBhW6efOC-m> ze0bz-IZiL8o>YNDH>7oqX1f18{`aW#f>Vtnq zhOD2%Uyv5A0X7~#T!zgV<`&xx)5p_slI>C9t|Rp;imOo};N@>Y9mPq#$*Vx1(XSOq zAZJM;tqpQ7JduqbH#A17DR=J)jKcR;<*N~>BY#a$>4Vx>rj87GxyTq7ph9N&WwMlrEFOqdXdzM8ssvJmRQj8D20 zi|I!kXH6Bi)076Y6;EUrnzvn{PHy2BmA$;X(xs0k`9oaD$a}QWYVGlbgKvLmU(tUd zMVj`)4NHp>8p5IY5M3)k;~XLj6W_<9G6@^u)(u-3!DH)^3NZ!3*4hz!D$_S^X; zdPZt$3RjVkw70+g71{kFUgY@o0_hvm6qfWcP1DXM{GEwcS6;qP7_EQc6QgdO|DUwy z6`qX<_Zj(W2@HpBBe(!{T<~A1ywbiLIg63ri|niiV-O~szx-^(jf-}9^#T|>gQBf0 zUk+UUcd}mh%E#NNyart%!)p-+2(THoIlC2_MQ_DzDNn%@Zp5XUa5otuDImWq>Tmrt zpCXm&?rbyfAUQLGSb=}LY}SnoY(twzRb7v?Tis|E+ajgMLrSP6HD*LKA<4h?)7C%J z)Xv%>DGLA^s9E^&MtNj%IM;nGK6C%D5wy&k5JgSW$=A7}p;u1phK)$5zMM+UQM3ZI zOe&Bh2E-JNmMZjokE^LQ3QQgT;WQM5O#jHB(iMoF=(4zJNxMP~gh1KS~ z@h3F_=2o+GzXiM~WJ#yi8tZ`8s7d73r*GRmg_Mk-E<}= z0=}fpW$|XtYfvq-gf~a$w`>9~KlbX6pyI-Z49c-^qNYZL&9~y*w!3@E6=|(i=+vib z#)jcpWh!WJ{gy1DminSyy^Mb_8vA}qQp~_bHbr7GoYCZYx?H*;=yW3ILFly9Vg(tj&S#`sTz||SNB00 zFj_z~C4PS`7|d2o zVIa@;NQCUtvc_$STS3CeyxSO5ZehG=-fXg}pEjxynpK;OdbrE{_{i-#B=Nm6y&yP` z=zSM4QVs}2U(fK2v{5-opB8I6SKGD{!g1GBcLNB7cVS`tDP z0-{@#xh5f5VxQYrSAZFmGeca`CWzX?Rr<|V2dn+@`)y|SZU{YZVF$ZlC6^gs5Md&McWzd zH%Nc(^R$#xrEm@T*g*{Eus|_w-zW#Tpn|KoYQnRXsjkyEtl zw0rF9B)TkBq*uc*eyWp>G|L&39op8G6|B}irUMn$nUSK6#f*jh@sbCi0fb1=rgAFO znR&$omH2gG#yJxV?{Jr#^jJr*UQ>S*>dKjp-&@SY%pu*752D@34tOt$cLz94RDof5 zJR^Zaw((5#lp>Hc(i+3aKHSQ&mgd+iK&`R{7P7Q>cBaMOq~S*krHN{}6RBR!jjaK& zC}%20P;9W=ni>?*Q0QX`N=e|!^TA^vMl*YSRspAM5J?xCz-Zrum%VLd@N9oOk@6Ys z$aWzSgmQ{Mz&{_NlhFO_(O#c`+dfE)@vfnJQX<|wMi(2Uz08u?j~ARxU#|6&vY#>M z*&OK!1p;*ZZgKRYwP1n*FRuAHF@!EqI`F8Ico+do_$LLLIYBJLhx>FzI4rggA)5~F zgyoE%QbFj!W&d%`unyo~vcZ4t5hzY7DQ*a3TCD$5piD$A(qw8kOT(>n5#h3?q}J2G z(g2=(nG5X6@_TaGGnSp6k+1BDzxwzX%0HQmW~Z$ON2X&NOE{F7nMgpqM>*A{==k{s z20brW5ULklF&GC5{X~S4H4U26%ptxW2WAl4{#afA#sr)vV zt<M_RU)tl|BH{&*}W02QgpBAtb>oHRO zxJ@*wA|x>BEGXl#&c~bdQsm_Z+!34@KZhM-^17+6ads_skPCy}S2t(feOv2F?oB&Q zL{s#%b>AaH_W@Glo!kp>WqSl6@?y+a`Qk^N-(Y_oOM^49(uIG>^?5@ScgEes(~)BPEx~S< z?<){d`)&WY_OE}eK9LrD%gS@@Y4&5MB4k))LZ~&ks5dA!*u!kJe2+5z6Z!Y7MvI}3 zj0EMIT1K5$Fnd2I_g@GxT|zgNwj@XoZ)64e)QmQG|5@KB)4Q;K?p0enS)%?i0UUwb z5)~elTdGY|OA$f!G%P{KDHV*@`9(Q*SKD0#D80~8ztiLSlGHu($@o_wv;QgH16hLY zLY8UtgFJsCXAAAhc-x8;JS@F5N7Hn>Y6W`e_=aTJRd6WH?STLa;LK-~#}sr9QR-`; z08*tdlw8}ueNP0eBr!#N=DEQ2dDjsxx=NK>+5V_|J(aQ2p`~6k_x=SgG@NI(5j4xh zk)>DQSY)mEAn^m@Dx563;%n+BUu2m|Ft=K!Ipu$}c=|B}zVMQlsapbrsx>qn{{e6@ zcxJ06uDWRjqM@tlDgYPX>MiU&M7ntg_pgwhEIjlMXn-OC+(xAW%X~{WIgQn$JIM&%9=#Mij|WauyPka zymNnaw*{qR5^JP{aTTk8T7bI{$wM-6;%<>vR+d~T3gYGWf78NyQ0&SxuwaFbs|cW} zR#-2V(N0L}F~iP90d@#vDuWw0bv}T5MEEiszLGh8`y}HmuMHi3EF&qg( ztrL&lh$P?koAKJT$7&rzlQfjW6uFMXP_XIMN5Zh@-44Z{k&PsPmqtjX?hQ)`u>#@# zSC{=DXZVp5IS(_wKypCN!*|42@3Ns-h79&?HskqZrFr<@7qpNVT=pk0Zr6TZXaRqp z@p;ve2LPj)n5$GO8O`;6^8#jHDeKg0n$>}TF~49u*Nt!NKI*N)OTjZFrnbjq)NXFaqpnHv%5;~k8sISq>?-*&*10Xf zB0O#Dg%15px|=zzMzZQ2gUcU<*m-|aS*rjelv5$H52%tlJ)`2&XDY!ykgy?YwM`%?-eqqeD86DAR-pE}L(`{`2|fiTI5iIvEbyYagdfU=tL@JWpyG zCQgvEGu^-2Ep@ZpOc;xxG8t^WvNJBW4uwAu#C31{7fJI#eTe{}QCV>qH7vd9<=)?O5A_jXrtB&HWT53x8j?l0&?LP znnxpm1`TqPn!K2uhs9@Me0|U?WJVuP{CO94gnr&`TkZ%FGsJ$`iqg$qYxMS&_5p5| z!Sa~fO?G5@M%g3>Gy~_OEaBkqMZtKpwK5DK0N_CXm{Vw6-45tu&De*+#KC9ZOmWXr_2TRfL7i<; zau@DtvLsBRlH}3(YvUz_28*y@08Qch0t%^|{x)aTroyt(Bz#MvN_6x*J?bW~tAuRa9mvT}<=#ywU zGzL{!bgoV{W^Itm9hE8%M&lHed`M}$iTCTEzo^`pI2wjO1lkE{_}^Dd0|zuWCIICm zGF@e<(b^-0#QUX@u)LfOsaTKbVhsFwqQ6*t{2YJpP?q!f7tpZBiaAuI+`!BK<(wcjaW%+zVQjKyUsLf)ThwXK&jAarsQOMV?9+IfV z`f}wPc#2r2y_ytWr+@0J6PBsL?dwP(b-(S{JvrYwIpOs+y8%5fvsoqj+7D?dGW=3Ww!tgORt*K7UCpC{g0A* za28XK4S1IF-O>#HZIBhuB1E&h*w&Z(>V^Od9NX%0xeD)B8Fd~RM|Uu5DAbHc?YlDt^UI(U!q5=O(eSHq#|q~x-3 zr?-{fcp~OT2@`}8zR>)c4C2;6=}<5Y2F=xJ!~5^hYAeL;o1%oEusz=<T|+y#>a z;9kT4h3v$CD7t7_0)!mzWlX*Ch*X4^)d$@g3up(=9FPjC>P58hc!;B0owBokZ|H>y zY}`#TI=Z-8{#k&T`Ix6Fj0K~tVE>RWcfZGDZGHOF4dwU^JSS`8KA`?v}^fN-U!@@Wl#$X=7_SUws^K6|mZ&SF%tjp2nz`h~EYt&ZJDH z@mlY}E}(v?xF_*@@7SDw#u97#(dMoa6mE4wf2c}4MAkwp7WPDXgl`#F0^VStke!c8 zc;5su=oJ8;zc4u3{wjoSH9_i_NAI^%d&AE1oe0;92Iqcud%ZgfxMU-!OBpiSXk>sM z9*_VSMvDiBzAMkP0E1npXT@vBx^%8k=QXjkfr2Mj!e6ul#VAM8spr-wxV@Gf;^ z&+5q@*3eB~1*y$EhNMLT(6it(1ddY~&hR1Txjpn$0CL0w*{k(d6I_paun%y%5<8#K z>|ulGl#@2oD^8l5qqzM@Rlxrs(znRvvjZ6nIXUnDt+sESxiZ{mh{{MdWeQn}bnDfK z)^aluEG|+x-akWsI#xnbrnGyOtmQ^F(t?D4@)l`?KhlLUWK2`#67###fqfeY$>N@u z92JYjR%?~^!lZhzgdE<53~||onhc zX)@~5V!(@@*##);-ZHBRQdc?QJqP13>u(E%F8@MNRg(TYmj5kmFvYFJ^$iR#XY8%h zz{f#@Dt(XmA4Bus9X~;fCB>{n@gyPc3QpS@882slXd#?^ew-AwB8k3p3HYa(BiI@L zYI;J}uh2HHrUFxKjc|?+pU-qM`OsnXBLM^cE(Sx1b&HHZkWAYgsa=Le>p@!fPaU*9 zCbSbSs%bZxWVe_5Jw4j<)bq{x*LR$q;hJ2tpv}8~mjuhKWSx}g4E(j};m9 zT_7xfiKH@-AedQgqk1g#Lf)|u`9BU}-o;78T%)3A17j?pIDKr2e$)u9@>+t}LVL1U z*Pr%hEtsG7g)p>nCNoleZBNp5wUmNMcb^FRU8Pdb0rPnwHNdI7EPuloUFkN*;@sql zZ48SBWwSB7kfO$nlR_V#-Q$EQ93bK}_O#-E9D9PyE885fcB|y(sMOcu1~)0^T(dHJ zU@_%?c~-@G=d%GG7+<$lj)3aMxob0MZ)_%{X0}!i)bOb76#MIv8mH+VXWAeVFo#Mp z8PB=D88*aIzHf0P+9hOt%~b%G!AGI|h-!k+w8t4F8sn>^w+~Xvo;$w4+B0Ov87>y3ZbklcmF|A)(7XC|Ws%u1KS3zY=-l5d zgv+DTWJ?3(-}qS~o1RhV<%nj4t1ATcSFy7xv)At>eqX8nLr=pu(;5X4hQS!`Yjp8D zPV{L60zUY)vwXe_kDq;r9*9BYI_O+~qm;!hk)WR8H2wn?tm<>0gO#LxOT3~Zif{z! z)#&U6p!tGIbr4!b+E0FMsPiz=$e0xi(7I!b8IHJWapnL3R&b0SEphIyMC@_@fydc@CoEFU zbq>7u!(@+YexYLEE2z>O8CQhS>Etczr0oyaew4+>a*;rtr`!a;`?f1o07r}o9O>v! z***6`N<9YAm03_LE)_J6euTdkCIz4XLd30hzy0$b(7Xo|x-pYol*Y&+y$MvY69i`@ zfJD6=y~ZI~-~l+1N9RP%BwI0mlb)+J?7sCgX`kX&+QhA9e4D48;~DNrWFPM~yvE7y zpjpscD$Qh`Cm5i0q*Y9Qh7O)3Zeq>iBPmlm27w*SD`y>|*?;M|sG^=%idTA}EE@<3 z5T_+fa$tkUC)Dc0VX>*>!$%|XaogDx)kyZ>h}v8|Q2x@8IFi)FvC?gS&%T%+ZCXLgPF*H z-sVVn86iiE>PpFlBPvy5cXj6s;7o>!{}fd5#us;&M>d;=dq6KTY1fR?jK1&70Qxf0 zJ4aPlXH(T1>H5DE82=#f`Z0XOuJE<6i&g6js~$XrokU`%8}-G1v^bCH{X{tdygmDh zOjMuisifapDqGm}AsC$5uNJCTPv9Se-}5x51pdi$8rr^XxDP}~dV5ecs~rhO*Ja)E zTHY@#m5=W2D1Hpsj1dP%y%OpuRWa}Pq_TN#_@Ynq3>S0De?lpsEu6_a8ZZ{_@EE4r zy)cLmp;S`xAI?C3?FK259!7H&Y3tXgn;(>LW7*ntA$=gCJ8C4NrAQ;aFfg*mg;Mc_ z*X3@$a;?KxHPF$x9XHswGNFmrd5-HXk@fX8Y*TQ@UII-~`o%1)ca$|_D52Y~u!O2S z2}mJI@+4A7_2ibL84l2|3H0Z7Kk*8L;Ip9_z-yQjJStp&TE=3<+=ydjDa=s_CNKct z4XUYhZ3i#jAwcZx&bK6cwyx4;<xR2qjGq1Ann9MdAxHa@(=;H$ut=A@76BuOEWacfiir5+l~G~+-`}8$f?)2 z9wr@HtPYRM?>;bIQguMVv1%Bu_jglM+1KN=CUQCh4zQY00R&+M;eUT4u9ZR(Z)%~V zWSoJLLqX$vI&M51;qUG=sWIk9DVl0>xIAdbPhqNmx=t1EZ%+70)iaiUKVt>h`6G_Y z)4Utr6vh}=eyLO&|5jA<#+FoFulpgV={1=F5~27H-BejX$O-0o;1xoC11oJE(T%lu zw{)o9x`J|yzErN5D_JOzfZ#owH-%xHXtkPl&M^KxTcx>5ow#Fkl2sP|nsE^0+hUOS zQPH7)&=FWLL+R!P(iPPxkU6ah`B`x7A+*#du2!XJ1-P|?#N<`Rrf`?cQgL6Tfoun% z6}iwg;|>NMN<3l0p}{+}d#(V9!>hFd%(SaCr?N!Yhn$+bI}_4LU2oV1ixnc9R#7m# z2{!h>xWRrH(#f6j%t?=oC27e3HuwHmte6siIsmIFXWP5qIg}V6$f+=aJY?d8m~}C1 z49vF_oS%;%0)r7=f!2oLI(I9sC$bz7%>pVq3nlh$TxQZYBQ0ODK>C(1lqze`fT)mvtV0NHh-wRIp*0KInO$e&Z-yI6E>>-|9#_w=GGU zrB`}G>JQW$OyZy!KBMvB>Fh(&bWi%*K45+c@e$sa)6sV+w7)5^@k|2CV&ElkZ3{#l zeu!;*wc5p=9J@f^RAfl5l zCK{BWb9V$0q`#MKfx!s-iBv^kCnsOfZTC?&$6lmV!^ z)}5x7^}V6Z*w2iVsbj?dHx9agywb;wac#DrQ(vrE(vAB#F&Ddwlcb)NDPE=lw5HL@ z%P$OuS!YLh zJgG@Kl+Re4@oE4Bmk0&xCL-Z>q1HTLyUw#>!(W!~>X7?>yIK}fWLVtgD(yP4Lk{^c zJ)(@y#nWXt^RlPUQUgii*FpqO+27F7+!c*C98fPdn zk({@R?C^g_AAPG!O|?TyA<&E!%cTY!u}m$-KOx_WQPZ>sDMJgfL>^4*|3 z_C5krQUl{%{dgwjj=9IG(C)+ErZ8<`X@Kazx!s|g$#;8vWt`aA(sF|1ZO`!O3MKHnp? z)F6AKWUK{%iORcws3z7nllWUDDU+*6*t}daaBe!_8TEet-xW;+|J}aM_8Nt)Zj*lH zVU7=G`u|o_LePfB|K!C#CH0grfFbv}-FE_-COT_lKj4B)mB1<0wU{%>%CJf1`Ee0g zcXRcaXSx}>*kJERBS+w*uDB@e?m*?KWmmu6;}NIsJL^+_O8DZ$oAgRjiwXcpEHCpZ zI+Bu06NAr}8XaTtC^V+LNP(rmJYU;~5TLfh$(6&37V2!1W4O+cQfIUWlYruysl|BN zE14X;G_DPFh*EY0yINoRgDI4N>dv+^Q+v&L0Aw*gEnM@O`o5&idt_evTqU;$a3A-c z(a>}}*Tj5(4ASfec2pwfg9Mz%FCo&p>r>6ucEOl@WSkoC-m|D{o!a0F@ZwDN>rV{x zZg8?^He@f{-$j0X5In5oW*a_ZaR~k93HDFjmL3|^C3%$Lt(KGJ-#FOBXH5D%eBZ7` z25#LwCQv8Qu{1Avc}e&l7WCZJnn=58%XW=?6~9e?`MATpuq_MGEf?vFxM*W~Df4>w zhW?fX19D*n6!ubTq-`(6b_;n*Zucz@^pwW~0o`zQwkCx#z6t*&w&=KLJa>0adZO{4 zsuBfMd}zI-U!yQ$0S=5nhRR*20Scxi2!DjXzV`q;qObQ;8EbzNJ`)!~ae{_sv(?-S zx)tqzba}N3whH$5go>w3<*9p;Ui$A>kC8HapsU(Er={OEz{){lb?Gk3yRRs{Ze)ff z#|dvFp{M2DNY}nLiEh>E!wCw#UTZMh#4~~=+4Z`}KV`vtzj!jXeYC$#BC>crcZSo# zV6`{c;Lm^shrqCf3c1;E+^jNj#|0GQDa z%?7>T(P~&JD7&2edcqV=EfP)3^W-6oggedvt%?7GjLez4aSs%2G8(Yy4OzpBwaoWZ z?VFgwQgwX}gYtk00~Ml+hqMvuD{sG6@hXs7y3#jMLsWeT4p+1p|Z(J^Fl?hm_*vb($a^(;Zm zT_WkEOH}TjmHj6gOubV_gHX_c^f4di^xxXh!|}=^G9eNdneK0vN`iDi2;fC48`y60 zr4%=Dy^b)1J;Zg zF=|j7^2bYCDj+^l=j?aqgw@^?vkcJ6RQzO4M-6O_RF6mwC>jfaM-DDYo=T+;FDCvv zzB>X+M@?y^xCF4r7OJ;QR>gP4yyEv+fz!IS#O0lqpQy+{q+5HlPf9Yu;k$%?=EgVJ zq^ZStGf-;#P7A9Gm3E6QM~{20-7_4IV9#+D5^i|=*cv?2k#Ukm24h%Xr~#PE3pSc~ z?KqU|2<*hlmxbbmr45rBqCUkInEI*pw93ah2Glur@e zu*Gd66x9{7A!lQ~(@0q-+VPyOfUIPi$biLTxj9395-!H($KKLF#=9bFCutSSAA2Rg z{wwgf-4=E%Y)< zGdj*a7Ul;GLu4ywSfCRKYwiT2)!BAP>zCK5U5uMx!)#enHZ!8^J7$z>1^s|5`(w4b>-E#}|b&gA+oq z|C#%#D+t1WbmhOozr8^&3}Q#)F*P=sh6Z5+f9)ID#|u?&(oK43d$3c^;_% z&m#H|mD)9|{CABjEv`^16E?vu0vyas z!Gs>hk}gPk=*qEny&PmQ3e8;J;NMi4jssu-db_NTGChQCqDqHbhWy^S&4f?NZU{x$ zBGLMxhLT(W@}Eq|$&fPap`1Md?d1&%iAK|mdvqxCo~v|!d8Ig$+i=s-N4FXrBqc>8#e`Pya?|NZi4i6K(-9aVd<8g0Ou9%sYL7l^soEaDt6N35=R>J=(8 z99ZKL;WTQ0rik*L9CaS7h63VDvvDbjZrxM3#lghc&No;Iewwh8UM zx>dK(YeDRV!OFt0X%_H8s`y1U=W+r@&fBgD;5Y28h>(4%N|t>Id!^H!99zzGd}FXb zc49t%9uL#(L*Rir+Gi84SWak&4vm!E zr_a;|nojrgoB>gX$8X#SgT>pjy%&?!z6ZER2>YlesMb7B8*o%;`M$B$_I7?7B&bfX z`Z;Lp9Z$F+W74g6Uo%;eE8P1&#Zea~sBr+-5O=|3t?_@T$}S;lim7c2OID zg*WptWzqM<W-o!!wXR|T@*K!_2?wti%?zhwg7R{p&!ujo1k85F0 z^4q;qo@E*4fleTR8(al!A!XN6Cb(7~Ywa^~MeS0#CcET5+_E##+9$4T8)N(%Eg(>=JFzq=alSGmdT1!4aa2%;LEn)7=$|(0&t;7L6YH)(_OsCs}i_dS?e6^NT^U<5}>!W3u%jr ze8}Zekg1LBC}>3SRbiUXPf?;=T~-@e*yFa}KdN)#iLOP5CrCBqr_-#UPoHytsDu>! z(-s{y2lNk}bsw33FQ3{b>XLlvo%u;Yh*!*6z~c^G(mOX$p3yrpY*vEDT;5e# zY{Nzw;0)D+GC2$pvG92=#CNkn-DW3oJ2zs*n{et1WBRMX8nd!}h zqGrwi*Zvu8M6z3Ec;(m~9rMAlm^jZP$Q*FOkj(OoMcfM>05)RRP-xUB3rHKeE-;+G z0dqG$sk-<`o4unge;cT=RYrmeY&!gYA_3cqpA3?A;@l>G5U#yVtv}3Knp98J6z1Ew zy4o^lYg#osq{!Em05;0F9I)Fqt;Fo3Xy$Gh2o+oJsX?pJx* z&b@Xy3nx&281}ko_O}T2LG6LEH=UqH)d`%$3AYy4uO(19gLZ@gMVQ%7V^!vu zK-v}KjRow;IqJPjqhgUs|1k+FNz0^(3chi9L_W@7vxh249;J9+j>R7~?wJ8nJO|T2 zCU$Jl`Nm;TqX?GP4OvW(zq#*Y>4S+f6`4~$^kZUwA+z7c`ID)HXtRU_J5*$tk7ys# zid|_Wx>w7Rvxs?cX))9lDh)L@!TfjS<*P}VC-m{+{X}atvCz0Vo~u%#N2qjVHCkQ# zqWgO8fpjDDCM#F-?g7By2vE5ZSU9J`cUU(?xV&&ovxgRF%V&Wq-T-L73mEe13{7Fc zm)(PZ0rXjhvO2~w^MN#s=|O_D10#q|T`>1~J$zS7N$LZNd|k7sqrzvI(P~h)t#r*J z&7V#J0ed`s!If68>lAdUDgP<47?29wmv(KZY!{m;eP>*y0%Dn%;)P3H7e-^C?y?$h zw5Nv-XIQIH)=gnig%E=l4Vp9I7`-29zW^71#D3^ao3it#lp4-#0`>2^Z6*Tp-waIxWmNdOhek~p1m!#Hla-kVVUl86knjYbvO;|`h zd^5`DL-UZ+o)M0^w#_qr%u~Momkg+wfTF-N-6sibFKq?0`<@iL^e8!W9DdVV`oU&jkVl7%?;4h9gja1%#Jy z!E-DDcZ=yH*_L4EnGnqFD!VlHXO0|*_#W^MB$>&krL%Xo#;h1V(Pi-&3+bQ7q+S|X1^n>(~7*}?L zPFl60xS${aUv4gbWxeoII_>$J;e-p2asMZ+BXN!d^7#c_DCdFs31xifY8PpEC3ZEX z)Pw=1Qr)>rcyQfQX?fDZMWHP<+`~nIVqQ4n%5x-o{?dzeRPExVy9RcDfSJ{Ao)5^p zm$tKYQs1ej#U592F0xR_u?iqfug*`k(3>CE#6j^DUqV5JmTdJ~9z%UI;}O8UquqJx zqZyg_6!Wl#+#<_tUFes3Zby3_w9o(^Aw_|QFfzZ2CC}QOlY+y<%U+_D9*Gk_t1#Fw z3`5J`*QYl+r$xcXfvkdm^Jr1DLI4@IfhWF7?)9mTmm1Z>Dy|3u^&kNxiCm0Z#gjhO zDOgwupvq)fW?D%#OM)V`$el)3T!itI>}A?zFE)P;{{F_jwF0oRW=Z(87o`j`tk}_l$^H?pJkQXY+953QmNl~*hJwW8s2?_GeQVQ00Y_z|& zVvmPmv^o@j3y`F$#SjY5P)xzTG#)oG19?4)4*fi{PD(hl-`^nQ@@W_J04tgk&8oWo zu@5Y>tW*}qCeagN)jWdI-sh}G{eXQ;(#rtypCOlU)Vu`CUm#jkWVh3_)W?d_ysBcY zIA5^t42HT3n}5K(xn!4JB|Rs3!B{_xxhS2x>5f!?j{N@jk<~u4P2fi=@FS7Y6z~q@v1oe0%axs>h?aZ4(gcn**Crea zwzjrW&XTI>gt0Ib0odwsL}QeWKqdTCz{P z(Kdy5XwKs18b14o2qq37!l8@WZKu~0`;ICgiJm9aM)UNt+sEd%7;U$1xpy&QMVg=( z8u|(Khgl|h3bevR#~~r%xU*haMs0y4jt$RNPjdH$LnXxaUiZS? zATR5V89-<#%H;?wnIwxH;}ZEF9p*0YXWGLi5r7hft&gWDs$+ad^c?0f$7;2dvBt6s zC1uNWVVL9eiXbG+3>qlRGQ$K*d}O>awy-c#vHtBBKRT5HKU!-Nfvt~+v>+E#S ze-cDp@@1yQKE5mF*_&%Iv_hqhHWMQ2(aX7>B_LxTnYaV>Z>p+kv`3a(HjEweio~=A z1^3KlQshhCUd}`tRA@J31d(9;+L9NdX9XIR3_QV4&DpfR~OtC~^Zjl*?nJ}$cJaPF3(^*fQ+8eu62TU`5=p;%H zqwb+y9sHfLD1CG04Qv2c>!D-f0?L6|gZyf(q;9_+EXCs={a=DLgQ9Ef0(ep23NXU)RArWAL}R?Ydpk|8`>Tz%<_mTkKB+1dUXG1CR%_Uww3p z_b()3dX$r<7+jH6zZ2eWbTh)gUCPP3d`{0??4*!G<;AYS zPpBnTi)j0_Z^PwiM^!rQ*J{{IqOYx&14vemEC$e;=T8>V7tQnaWaoy+&ZTUBY>;$p zW-ne!=k}3_$B#-{@gw24<9z&qRr&~C0ilCa!73e<$W6){J?4vl1lIJRz$?V*8w&Vf zDg0G(=FJR@1LGrCSZb3K*v7UDZ~k!qe<3$8H|*ix2W$J&(5sCl(a(?orpIP693p3E zY9tkZey*&StZ1*`x_C1TqrI+nxtdODNJ|$wp(0U{Zx33$g2d!FzzsO1-WDF-;a9Wj z?V*Li9&R>nVOn5+P>~3UMAD;JsjGL%2vB!knJb7vz0y-GAb)UER97gZT-NW3Ysi~~ z-N9njvS+2GABFfld*KDM8v=ceC>)4KY%MW}TVID%ys+&Ruiy1M;xzeZ|Q%7LD( z5Fk0zDdCO(QUpP(*Wm!*sOmCe7IIneTH^T)!+@WzcDDgymuD7e3U+Wo;rg~1mT5pM zRT8lJgC>k}Jos5RvIe8wbOzr$_?AztIx>AKjr)Rk-ZO&^F)fq7MXd%&*4dsnqkM|w z=qaHuJ3G^V(J~veZVpVs+zZz&)zrm%GS!&HD*BNOuRH0hjA&w*B*A(4$vkU3^2nt{ zoNC{M;~Kg|Pjo-ecpSG1e=I+S67p~bNH@yv=sf$kY|;>~M3b$pV(@sI+;RK7hZ*1W zDN`Famk<#q>`~Og*JgTrWHEjEf23}|EM1VrXO|v-alb<)1azbw+KYcpu<=cgWHPl7`Ezg&oQ|{Y>{y=49SVUD7stfaxz}O51!c?oCPQ`)MxkWGa^61N%rv z5Ki(SdoBE-NV9)@o-k>bDT9hio!b3l(KCI=|Iut!9bY5+ca?O-hVq{Qhn;*}4@7Eg zcFhid)h~4H%vPo$Fsr|3_%dd!A78rQV)lk2uvNh?0s2Gv_Es;u&4I5|o zPgwh`-Qp-3x-qwXe2jK-q3&ZPYcAe-Pf;*3MlWqKKx1S>Y;Nwgwchs1fW61vAj+K5X5PYad zofCr*errPvunlL@0dhb~%n3x@k_m~|B(rZJXF`rS>TZoBFE}w_`*ace1MNvIqYfc| zd42tHwghlYHkaaPAM(>a19XiJVRaz?oECJ*r#`SO@Q5N|H^`4aB~cV;lk4%D!Go)RREz*x zn#E)#Q)qCZBSG~Xb7uH);d3f_(4|Lu1g|`oUkby!*=D8c2x+=UIeK%*NB2s9`v+&) zHx=AnW>ORTu~Sl(AC@bhPL1(Lwd$H>+q}nv>;B8fsvwp->kV1$KZ`iXtD^C$Kr<8= zLj&5zVt27hjdTX~LhYnbzdV`v98s ztzO+D3eT8??gpU<4!kZNjUVpF5_1a2bNZ*}(44Z$60G1a2uevxbHjUW+)+ZA9UiEf z_+bhmm9pGtR1=0G4vpH>vr5{+kbw!HiI7%QuJPI~rv!M``jpgvY!b9BkY6nG zuvDp{eG&5Iz*ju)n9jFxCqEAxmPG*@v%!vOTS|M2N^ zMd$8}oUVqzouv`fz?Xk+*>%g8}z=K?(hXWJR3hYRDXAu;&cLS{ny(0i_xA@ zKm1-qjfrASU%JQvwUL^JFb;MJfAY}*ujCf=iG?yQ&N!F%*aszE{P8V$cSaVyYGLl< z3zEJSUa1mH_4)&Ub!1D?JteIB5x~JK1?38$=@tdhmVk>+J}sl&y)lvou3UBJIyqZI*@Hse-)X0C-l8z9G76WKxkj)v*; zvulLe+sIMHos04M+}InYWO{xwObaKCzU;I71d%eWaQ)x)%((~xoa0&mu2~T7{XsG z4yC5l449&T&K4Z%X~27ZuTZFs+*%C*#!)e2F1(cuJx67C5;l7kx8g?Kj!@`2AsO=AuRu)@ zoS(iiv))H=`Jnw z0E8HS^=Ii|>d&YC{ktBegUp-5-?JD>V}|r7x_0@MU33e|P(HL}DZ;f6O|dr$oXY>* zEVPvcLqh@?)3{tWkLB(HVC!(@uPHr>vhDPyc*`ed4g*V)9c^km08hbG=p_*MBlX57 zE(=?b{qu7+0HJQ^fo{h`Q@R=>zP4>0#n&o-W_f8`=$WRrwNSb_&SzW}%@@69Z^82# z&Vl|yJ>|%E`N7yklkT?*KCEds#5lZ6SSlh6`iq#NS(W<#{)6!(GkVS3d_l2Oq2jukxJG&)aAOU_j0d3{6uZnURP-NR1ENSRo4%Rt8GfMy33Z;R{)d{AD0qJ?LFZ87sGyn$hnfy$BcEi$I7w#UKpsEJ?+ ztn^c2ZSz|2F?!&0-nlgV;S4Z{%d{sx+Tam}rZ+XsKSx{uxl$rW%2WPpPreC(8_u3+0^`mW*^Ulb%_ z%gjR&@MV{zB$Ci+kNE-iD|StP$Y6)%b_gnu%^cyg0EJc}M+0A=SjrM4CZ&bCMiksk5jG|i(-K1-T zR}e7i)En|4rl|E3k5)f_x6~fw)d>IQ!IddpX>BXSPqGb$h0f?L$kDWfgmY0{ zjl#jAv&ijv6;)p!DHUWXp`8XkY<}N~8nfY=R@aw>QK0r5&e`Tcv8KWG2(DGlT{cp8 zT{U+SX54Xn8%0HFM}gv?9+y8Pl8+ z;Na{~CjnoW)a3<#p^;xa7(DFJ!UW~KFFBOgiqL5W3l;MYb&#glkypep!^h8*@U`Td z!)3gVq_?`9muVV}QcHlPI`}(qk+3PXHf>zyw9Pz}pam-TZJq6J_%H)xfHJ>~%`Z-J z{XZ4tnXNqga;{nv85Q*M^TV{cDxe4^Vyg8ScoG#T2Yd^EUbkt2Z7lEpagu3AAtB6{ zc@=}%bN&)QE^lz|7*LUm2S+%aWWtV%(-^V#huRfkZ<6H(>I1-vqH07I zKNXm{6jKm?D!nO|*(^tN@^wC8yT+$#4Y<(_uoX!+SaqQ@PaRMVjjhU3`v*Vo>$=d6TEb< zCXDuX$r!v`Mz1tq)uO2lv&3cznw|QEu5!L2PKuL%ygr>RZsYdZym>?pXU1<=Q&YC| z8Ybr%&WZK;6a%y}aX1jGvj(1XeP8GHGfOR9VUlr|vrS8+wM+Hh9siMXtuu^zMh@tz zb!e}%67!TAqThVyv2BlFTU}90{kr-fuY_w{goRQMHlr_Ox%#<@7h$Y)uD@LtxT)!H zfcrpy2d9UqCmHN@sb4soj2@5JT8?c<|kSjj?hBN|^h9F;S}4QnaN{iF)HxNxs*(<4gx z)9P73p1)JBB&~d`6bqnb@?)+pf58N_`yCE{NFZ55h-qJ=TOjVyZOV=}4t?TT@R$#< zdLjh;{6VE*qmcA323Ep=+^&Px*){?qCopprHR(ieKP0f6`CSw;XhpiNWPO&n7 zI{Gk2nrx=u%Lfma)Clm=nb)Vib~YV!Bf5$>S1PJv1&O<^#Ide;gDgr_bm)5VT7(?FBapJhrE1r>UEe*VLR7hW1Bx$bIGcHF$2T& zWJs3-+!Mgi^;cGRv0{G9+!1bEbvLqq8RxXf^M84<7{9gg#pM1mdb)|UfQ2}-B#7s2 z0tr4#S&Nxs1tpQWioDV2ZH6Nug`Tl1$(~gW*cL0U=!y~zbLEKQ1I42- z;LX>ljL<8uaI6z-1kQR|+bP|9xRGQXhUPjDKR{9Va8`K>$3X~OW_r9Sk)%CA3bP;` zz`Z2QaJng4ZcbLv>MmAELZs=>GB)W`;k9YRWB#Sbxd`OUgfb{hAF6fI_d-U#(wo6tC2g04~k_EPr$5XiN->6%oB1~ciX z_!+-+mba!y-MYsMs~BNmDznI-j9@0WX8w@$2Y zgQhb{f!hgBSoAVcXvagQG($6s_(o@kSAyF*lS=g|{$`oo@<2E3F_KyLqU%b>Em+~A z>i2>AMfRyRBT`{}xGX|ETXJD@-$bA+PGpb~L>x0aK%3H*6$`dFzc{-6X}KQ(_Xb%$ zS<>`>83Gn=t+2L#IefvCREJwz#WNO~CQil^`l}azGaTg+DrPXsY&_7FvO&7u4C@ElKs;6l*;SnlBfm9*Y8F z>ji7$SU;CN>^RGsPHHnjo;=ysmheWmxskjYC;9=Y*Mu&A;untg(Ixbv%<&ZEi55}z z53k9_@7vw$*K7ZGwhqlzxVaZ|+}NNeK^s1#TwTtemp3EgKTCPgi9Iypa*tA@ZUZ|f z=oruH?Dswt%w!*5V$vvdt}7P%vM#y&>W=e%xT#`+Xs=%z5oD~(`0~azF;}VnslyoO zn-={e>0*n2yuHY}qEvx(xY%i{JhcToiCm%;x+D3$y7TIo;V` zNs9#8{#Bap+zQ@VZYN#=GwQZ4|v&Y z(B-6?G63ty{;#1ZozCzENU(j6_#q6BK5qE4m_Vx-pk^8nexXN6;=iOUt)*~FWV{O? zz1s%}RdSUGe=aTV66QO*!dy9a=)dQy#jxnGSccy>JZN2<8torFh-ngL%H)^FDj-g|%~g4aq*r!vtoaJ~=yY%qWdOGD^5 z3l$AGs2b%fS3hUIq_m>&g%3jgus#4)X@ZA%e_m#fsEo7fanjJi)pT2ZN@Ahg7W(J0_kf(Q9dlDGSD8)j(e_V@}qrsSzI``i}L3J6nw)U;!=w@!&YY!@1MKrJS ze+L$`U0#v~^~i9YuO{OQxi!kj%{h|4LshDyJXG#LC$QFfD)F0NDjX!=w?x30d^;KR zVkBvuWV4I`yV;2BT)M<-$cO*WVM$yvrqr_H@U86fYB9i-7wv!MaON@UpoKse-bG(I zfM18Cyq2CW-qnsN1;jJ|RGViZgG~QQe;1HM5OopQ!B`fOOIgWzB~FfM9_dfN$ z!~SwBYRNj@C?EA`cRb>Oh4`zQ<>O6;VQI9=8$WhGJd!OZ9}0T=C9DGyxncgYy^_=Y zfynSSJvz)(dQknDXcv$kBEDp~nnpKKhx8fjozT4?o1FncR@QN>er&P3N^O3&e|`B| z#bGNGkJnkW)F^MdI;0CB?i~>tSAij->Hh=it#l38qv*Qf#~nwN`79B@#^Q37&Q6A} zSq)lGKv9%hb+~8fqF{vANoJERx~d+=k+t8l)CL#!j^LCC zJVk=~*@~h}IB6DOe)!?^r2{CTf5jOx)&y6)T@}z#^Ho5A`eWbpI|Kh?XRNoZBd zsK94~2p}S9nQsG=K_$Owblnvp($()awchzKBf9uE+VsxAigx4lQJe>pf6~3iTT5pq z*=5X5w$g-4rmI2Jc(|tjnFJAiE9#<+n*vg^doK!^f-z{H>!OArz)HA~ho@cLEYdEn zU=N(jiE?T2HfHho+dSepC~`aPxic{(0sK!tdJ0W^DEE%F8CUfRo=du0u$(}e1SFCa z*|Gi{dR%q=VeD1#@$K=Df115NX6~7^^FeTnp@UyJ1-s-+cgPZf+STuVJWAm#6zrUV zs$@R9X>R|t^Me|HeMiF%GH%$7@G2#oc%-L6-*bl1J$50h!=BP=z zs*2*Jy~i9rVB_)G{b#$8@o!w8Ry1{OKi%cdeMr{Lp8bwOlpBuXe-{T`x7MkI8qjd< z(^L%Bo5IbFgb9*>ds^T082yEPkv$S&FKup_jcK5hN+`{)0wp3alzP(yEjSBozXu~5 zI6l&Y4naNi75GUdjohScNyUxuR+94{^(=XLV8Z@S0D%`<_|JM1pLpO0*y18&BPxb* zY^+!k%?d%#rI_bYe~Qznl7T3^ zp=%vBtb4}~`P{U`t5V++Hw_|7**=dt8xHV!ahi)IZztt0|GI|x+NnT|mAL4n49R9& zDw6;ePZ8&(XCR!qf~c1J%YdfMt;a`>?dzfYWV@HVAZqcz0Fr(GY)IRU1lU@pHF{w1qRW>(3T5n}K%dP#-Gg5TY z9@fT~epxi~e#Jp$ z{-)CSLpQj!%5n{jEyACidG?iA^7pJpuEN>6(z4uVM49T&6&ch&ah^f%PP`;iyH*%2DsAhQrhqi(%RuKO}g~Z=;Fr= zEyCc)iD)?PSbeCe>_@**~`G19NGPxq);V-nF}GMxz^4RQ+4n*HjC?(Xv*42_9Hv91#cK zF^K#PoIJ5^gTepRpU7$2CCy&wk}dsjFqAoSjf_E}UDrPXevP;4p-hF9cIgA6 ze{iupqcF#i{9#3}!I&w9RM}}2r73ST9nHxrO4(NPx1{B_^4(n-ff~tdq*Et}gDwH8 zEWkT0%AZ;F zG;L3s18k^e!YK-~KQUDPih>V(gW98b^ty`wbHx2K>XGr+G&oA30(j}`*fs#?MX;&b6@t6Bf8Zd(d!(4n{&w3bFDpM_hFitD=N$prX!48e+}|?kP(1a zZw(qoH@ie$jG(t5q@Tz>nA0>%Kw6|eO?J1poLq8WKX*-JYU6EXErat< z<<$(@JilF*ODyF$(qE{?MXR{H|(VQ)vzZu6^ewkHx*a<#1}RvJiaG-7d~^2e|pM z$1=dEys^KcwfFq#t(28QD5l1nthT>m^2ew`*jb@$jr#LKkRxkg5dWvZbtMMmC`hGD zGuBek{3TtS?X*wZJ_?)LpW-&Oa7gCdvzZi^NXTtq0RP24Pd>48e+|>^2!=B$MC1f< zB1{XD354iGUuLtse_ERTMYzewog6cUIkc-vLKqq*&hy^ATzDlj9(kWiI}QCJ{ps(2 z*!hROgM7IjT`2*ltk`*iX?-TXs~^nrT5rLBwBhi96|{Rc-DpQ~x8 z>|gZ@)Zeh%R(WrKe`|Lkq$?Xk7ji9~KV%y1;Se5r z0JkVl|5Fxv3ODe!03n))J1xRDr=6zi?<$u(bJRd4Dl789Rgr~96T?^ zH2f-qGE!RnrP!SuLzh-1D0S$NIlE(2!zH@Z;zdfyHxk?*SiU{OO4Ol$4Ph4_2%AkI7de~OtgchYDjsnj9b>O1AaNnbU@78EX>P&YTR=rAAfTwuqUyW+8!S~(eaWRDgDM)Ig*E_-k zPM3L!kJy$#r|r1Z#Uw9NnY4*4j_qgsiFPTE1ycrOb>Pg}QYoF1t<)mt*3e`9SWd|x z#h)!ve=2OI_g05%i_;cBlm-{oS6{-*c~@1m4KHAm8P#y1H(fLd=@Ueuo`i6a-!+W`evHP+PSm#&eam1&cbo29VqvUy$ z-A$q(MXo0qC=b8F#+2}eYXSG-Z}v2NKvMY+f53d|V0B$7Q-Qz|$dWRk<)2PHkxA|Q z)Fpc;IM29ZH_N8(qkM4ONGRMf>%3@BsKSaEJO011^}_qot3TD@-B4CED4oJNGcY+a zQO18&4`y6_cc!ho@~Ct#SQnQ_kbGDi%0pKa1No!~W9T9I;F9YrP-1!$BvTXj8JlKb ze-fGR8$`mARm=$_v5!s1^IK4xN%=?xw z_xdXkG~Yj(RJl9EWJI0t#GXe>VT-*s+^-lPGgjJ9_dK1N9P9Ia0Ad2yPYv z*U3pGNcr4;qup8lc$_E=f`7yc^lM@3W~@YaE`+0#cgZS^=oPJV+<4{<;{Qg zdUJ;~6Jf=*ILh53kUDV@soBf5c4QN1;5lWi0z>zL2T=;LR_9e7zGm!ZL}Rxae<|jE zA?Z?B9>2vTpDI$sP)~R5Y%^f&0!3UB?!9=dvtoOPKzKRng-wLg&=dK^!3L-*9N~b{ z4I0G1#kENi4YYE|5*S0Zx0c9)9FJHuxw;*=L@g1{6|s`-M#2O6amgMXt6QI=Lq|v8 z{&qu`6c3?!Aoe_(72d4CwAjQIf2n7)P8_>;jzl*)tE|;VLO?*)l6N(h90m$ zzSh+=plT23I7hp}P2MLvA{@9OLLZ3fz5>P|Eb#72Rl#yh&jaj)T)eZ^e^)?;iM{+Y zd+hZ!m-_6?jlB=JGL37(5`265;hMq=Uv^Tk+waEyjozswDBm5bJJ@{ocXyr;Ph(|S zwi(p&IN51vCNWW^VlvZ)aoX4!bW^S{k52sRDe_pw=jd3j|Z9c`2xp>5k2@-vuBgXJPNM*`kV@!Z4WV0eO zVY+0*i)hLVv^7^qVf7jNidoAR_ud2juf6xJ54Vp19nAf7Ic%$gcEi)tz!dCG)gY;y znZxfyKh-Ou9-;V8&L%p->2f1Blc17N1qHQ}ZfFX+o;wZfqe%R;f5pI@9fGgQ4R`%C zyeBr7bpnjtfU@j=s&`F11n5q&eSu9}H$Ud_zt#`yDyJz*lrR^isVd_!Rcd*Vx)!Le zd6KSqH_t4&O3fw?WDaZ28}580B3tNWNbe~UlU3QXK4BE)mF|1bOz>^A5yR_IXbnJt z2$+?Kg6(-b>Pv=7e}9yl<``3JX#v5e!zP#`(W|P#ughsj3+>wdkaZLSjKXM{A|W^? zn<@5b;B+L;^)wwsyEP!h)g5XhM%-H7B%z81uhEEtF#NbwaIBdRB%Wy7wo0FAs1(NB zKif48H!|jXU@g_y3TsuNp<_|mMaz07Dd|XSVxwZ9%;A5Sf2U7kDvDW)#aF+_37r7O z)|ZycEzgHc?f}(4`#&pN5IoqP=<{wec<2ypy%$(uG_RG93o1)bRt}6VM0YYiD!qqs ziWzLZujT>qc7TVPJMpbj$S#Dh)IlD)7uECbUK!wFK7G_4g6Pu{K)dlxuCfwFyASb? zTp17jq!uUa}mIVx2JcQR2&f5i3CRXKjrEPoHwJ0o+Ri09(b zf+Q)Zf*X~ltelY#=Caee&$EP%uLx!^>kw z#!ktm4zou0e2R8XptAI9<}Dim=I zh}!4kea8-&hgDPt8x|i|2>UuJ)9&sobkF3J#QkcB1 ztwfn^;X(G+ePmOm#%T+dCzJ~UP*-2u$O2Hjg)}tTu`d`JufjymMQokL~zETB>HSeS7M*LoL-j9v|F2zWmT`M&aiP zzv~k`PGfk1(45GzFeJXa1zW%h@wuy0WK z6yLfOcpES5wJ1Rui_4ZXLJnf7&?DY_7cIffT1#@ubmA1MwZV5eNpsCRO+XYvpT{=Y z?IroMvDkEkvnHQ-g}e37?Wmd0J7LW=QfVCdnk1%q6)^7$jZSD-Lv*6sYp0pP^SPHYZ}{7jUN zq;^c=@ra^$AE2K@1y+y%Xl(ML^&1OwsSrtL^770SYGijrGFTQ5J@ZqOJrehiUo()y zD&e3ME>r_~5EGx5?wL=sr@3f7@lM^NLZsAYy{s$xUv;2~~%syma&F`pM|Afi?}m z{_sIkqy+nY5XE_blyTG_M}GDEkRfKXcuNNc7&t*Nr z73|~KYv%5Q+}_X@-Z62o|0Slp52GCw%SFK5rN3C+T7IoXC*Odi-$@bzf4i0L|4^iA zv+Zy`!(-S{olTtR*g5?kLE<#4FgGT^34{$nU87vqz%b2i}G?@+krWvw45Yl@c4&F-_*vUg&; zRi{Nh^P!T)(Bm_X@$$?OfA@spl`mJU>e7RAB6UY9%DE`UBXlL)CMk|!7gs59fY($3 zJJPta%5+v^tLssYMK3sfR9V8J5H;(?c)rmYxoZ9m@sK}v43@*A1w77>STDF>jzrl= zeUYjsEak@>Een&qzJ7WafSY^AAM?8uyRsTgn3AFz&slf8dhvB@e}umMlb75Wj4&Sb zU>En$uao19Uv=$AAt}Nbw?vI7N!p}^PVKx1V6E~??_!xn z4XQEEemh8Pr8~zXazI?EPOKmUG`l}jw5q=LiwV<;S3IqD)3jbrZlS(&XxgD2n6QV2 zz|h00*}ASZP&&DVe`~X6?i(A`F|L$o0>IYpxPO78i+19JlHEC;&{}^`?YuA2hE>xF$qaFKo?!ZCl_)Zxt=@P()F!i|blkAAHY)=e0#Tdk?3?U?Ajg6ALrW#P0f>nKv2x5dTVjA_ocUzdxuZzXiUd*Z@kad_sY5&mxGBb`JwmK9ij7W^C_{LRX}hk-V{+5 z7v|`2f8U49QH3lNy&WhvC~&=;we84zY`Vxe(*Vt3O7farclb>wA^~w-X^|# zz*`}w`h(&xJ;`}i4rMEWdWVM-?n9F#SX1R*Wq@J8^;m^v^ZXK9d<6VtIj39}UaNi^ zKX-GFl;9WYH}o29XXX&`mY+gNkQM^+j}k<*e{2_1!QT*etPyTt zbA-D_4Tvxr<3SEO#6$5@ZgIaQAy}d_xxg$R=9YwUQ!#jq&Q>vNZ`)5uZ4AZlqM7M@ zzMU-=VE12`5W>vMVv4esg1fdW+e&v*zbxzxPI(8RPdVTP>0O;*W{G+NrQB{j?=*O4 zf3ecgOo_voQ~(oaEp^|(5qhaK@in$x<|;{5S`o8YP3+#CP~18<|KBr^sq(?7-z@B# zOdNqzSJ0hecIO>yS;rTcdFtQ&1dS-#r0+aPJH3pIM70YOhrFPihig2k`lyCgAD}2w zQE}?>5i^_wQj6^A39t8)FszQWpgM7*e^FXk7S2Bxl=~-a2zFT-&ZZk%^4&Hz0ZO&( z0b1x`>btSECS~|hf3M=i56Ndsu&6(05%z?p8{uYhFOj(z!^sT9z@w0d?+N6DSYAEd zEX_pRL|g6TL~tGZSBM|e_2y|e*YhqKSS%(%Kg&t2LIRqP|In=)&{a>;I^L|kf8JI5 z1d2|G&v=4qq&r@8hVDz6vWs2TxpiyPbH?)u#n%)oATqrm)j>p49M0rw4m)c8dtmGD zXiB_%M$Rm#?-)-`qeOdG&*R4nncTSg+VRep%ye9VPq1ip7@;{<)>M-s-*noA@hnM< z{}0Z#26euOLe2j$GBZ^n>G6)he+G*jD`*pL3z5$TVRwZr{**|j$eJ#fq6;%T>vn;U zg#epnAwG|Ro?BelV@m>9_ek;U{%qxG1AI@`%Bs-JA<-SFqpA&q)hwtbc%H| zB}tN_>jl+CHOqF?gu+sD*}Ki$0uvTgFLNOM*&7`AIOpvNOA>H)aaCVVe`~S#`jkVV zk83JJKakps^uQWt=h-_k0#`zz@hlS07T(YZOUPD=`ncBm`ld{QTgmF<81gks=-Loe zJJtD#QL>O*%^zU>4`KRe@^sISR-W8^>#V1VULWAx@OzIP675f0qWDh1uL7OtELate_2fCqBq!3)zuiP3=utNsy$UrcI@Pie+hlK zY-o)NqL z&2et=*vzFPH9fkrQ&ziVZd^Rs}(3rW;50%BxDune6RYq_w%2RX#P$Puu*bjg?`@0af4$ziY?1B=bxjyaP1#U* zvdMzUz_~|bua}vbxr+t&oswsZx=15o5Waf}azwQ~8M?a5`or&RBud;K{G|gmBtZ&6`M?PI$ zfVBDK{9ae$kUv@O#H>yJ)cZ{*uMHlQV^Jj^Nanjhp47FdM5_~>d(xlzFwzEm+reN0 zrb_a%&aq)5X_iiH*}p4U+x+*ULIo0);_D+iA$VOZf6@@ZpZyjxHBZnDXDW1bk_=R! z3Va#&R9R`DC6u||ih&Ia*>eI42L4ljw`l>s)WgMosvDGb61@YrUk9wk%&Uo>0`ubv zb7wrcVZwoaQSj<{_~@-q+z#7`g-Q9f(6*8os=gpA?-TVFzvEvhqO3U_>JF3@jG0|s zZ=J}Hf91f=*$Ac!{JVEjdBU`Ad;i4Wu)}|4eq(2B&+%z1^cd3x64W*{@i&$G(>bablID6r!FR5j4fAlZI>h;(wU zB3{ECC+T3-hgfnzU}Kj{(0r?@yLhy~4+D!Re-Zu98-&=^TJ6eAliO)UL*zdlbA;J~ zj7V^En2V{Qm*`$DvW%`nrL_WGOTgPv3>NBiN!&{a3T-NncTz|_+4PQP^KUM|PA0ZA zXPS()QmIi436Dt~Q_Nc*wSyu9=#Zt421UxauAXX-T28~mo=UD)47&_%kZ>*WtntHN ze?LO_J8G7=eW@2;1aj1pnf_}!Eje125Bpp03!mhbe;SXwE@2y-U2)oOy5!Kf(jYU>$WTjr%;cebHU<-&@h0`DZmNDrT!av4oqWxWcxzU#|XG6r9UPBOhI$LsEoL5X)Vbq^DUy(i1anz8D zD~E;C=atTAn8JzcMv~&M?lXDlIRY(Yu7?FkQ(aIgl^!L5RX2zfe{$nZkKCEZaGO8H zuz)Z^pgif7&g7@0~%)lX+<953`+9q&(Fy z23>qo__v%F#a0Z4{JB0tmp%*)&jMtKRG8la5*UrG5Xkwi=Y9 zwSY1izWK$9$9GTlp)G0u=eEu-=QXoOO4Cia$CN4fU39;p?pn=Iu{l|Pe~St@<#;k8 zOLnR{eR^byfl9-$c1`Ic{%D8vDkl5jXz5`T^m8)N)KcDS+`>JG!C*@2>%QMiY0y2* zZ#f=vAAtVv>*OAcrg}X36Z&ONY3O4YN@=;&8W^8lX%Ucbo1wzOkCKx9U;CiEzRVyP zGmEAGmp?U^R#0Q-#%8;^8#g1ZOKtgeiTN@Oz!u>9e&kN^Ove7!3 z^M*OL_I+zb(Jp#AQtWqQ!3YEMdp|=(20mcDYJ|&#Hp-3m%OOq4iEdU)|HKtItd-Mk zgX{`)3B3umTyIkW?g*Z}Y5PaEf+2B=&J7Fu&FQCqLGHUK3z6a~e>75Kt*+}dv|yY- z(MrJ3(Ez0SkU?3}_@BcHET*2osu1Qn4FVBb$o3zy&GP(5a`r{CJ7BuEs~h^XFOqA9 zo!$C1Ll-Y`u`4T(mYv-FMD!_l@#v*g{b&H>trP8dp|2E|aX>u7428+6xVZTX(pGt{ zehwSA-jsuLT4nsle-$?J8BRYaiXZ}vh6B2ky1!i?oma1$-!77*(=Uw#X;GPL;EwO} z+FMT`D3grfxgFG{xp=Ma8RD{p;1T*JOHDGPlAz1RCW3L`L`c9oA*tq8=r#}!A>#O6 zSs(wG|ASNVi1bPeFoD=CXo2JJv3EJhp^YEU7!8-rfjMJ{f1X&`_87lXSBX?lLmBk4 zbZR#yHNLfz`(GKvi9V#+5rTe#!Aaa2QDH+rJ_ zT&3Qoab@1+e{6It`T|^4M6i@#zq`}qf+;g>8ZUMG)DNfG3(y=ZX=UOCm~I{5=!yny zB-l@}h}dv{El~pUp3UX`o#ChX4=56x%y4vI~eOe8;?QmX_xl4O#8OpQ%fB zey&9X6@_^KwIl$1pdJ%}rJq{Oqv|8&)3)$>~hT>HRd^9zZw2!#M(G-P(F=BS4un&=cepk(%cCk^eT5Zk6O^U zTO3w$f6h(l^aU1&vVAbUk1Oy7?=|n`lE(5H4iv#`o#c9jQ^WJrt>odg1yQ00S{y6#e|r8(7o^bEky31RS>qAjM>?++*HkvX zf8pn8N7el#!SPlr^m7K%e49vbZ%vi5#?`y0xMM>X!*sG(s|4KB&21Vsryw+$L2#5) z3jCx4dn;cGns{u$dXkYUt4SXE6kw#UdL##Vu=ZDgM0hoCoGqe;DU5yqVUQca(rN`+ z$rre70ZZQ34B}B(QMIkc=nA5|N&EsGf5+^zae$DqE;CWoH>zd4CQkH}5Ekf4@g@R0 zC;waD;nuCkmQm4kSpU9BE?Chosl-Gg4+R=2)@X9Yyz!GUh7W<@x5n_l+95{QYb5>s zBlK=kb&Ba6pj-yHN}|DKrGlG|Aqg$T>-}z>wnFY3ZywVQNT{lS*AATHz_O=Tf4URg zkh$MXRhl2iZ$|yZA0w#}$ut?fYrkB85mRDRDxzIi@@S3$vpWmF0J0K2N^%WD%>S`s zA-CRA5y--Rg15IE^px;L&aS*g&4)cLbGBij_T^q*RU$ajXN|t$sVb7rmrm7(dX)@@ ziP$OxEu?|V9792Nm}EqPAzui2f2?zgmn%V68@4%&_Uu8i4r2N}I3COlQTeg@4*6P+ zdDl#a(IL-1VV{z)5RPC*4*c-TWUUf8uI#7`PH#D&uPYNV64{_JbNl*gr7{jBk%O&U z5m+{?ZBR}*$&D=0*{eOJQ2F2Bc)cpy81$a@+d`L=|Ku+usF$4|<+;cfe-5fOE4{FV zJS4pO;cFjR;szXSW!-Oi8rEK z5ky-WIw@!~0JNd)e@~ldOuP?K1dU9k<;qRN)c1N!)-;^!A>dSecQgwQ zHE&#$a*$`QPEWTS@r9Exi(b0?)4f3Fk!d+rQQwxzoISV4e<&L-ubaGHpFe#z-w|&& zqN!%@^-|IvRb&AM`#mC0b!Eau=`{2ZB;ycp)?d!0))b`lU4DQcS2ck-?=KKP#o4?= z1Y9_4T+k~!#2QG?>B9ok2t3(46MoExkJFDJUJjf9#dx4hW37cie{1F`Tlfg2L+C?7 zUxKlD7%@HAe;r$=kEqAR9xS~4hF$RoTt$W`vctQGK6mJEeAi}pzpbb*#m*A--i>Ii)x7J)(>oK2QDb#w0_L&7J*D2&0c2U0 z3Jl0&V#{g;gGXKlr^D54v`%*YuF0Woy<_uVIc3Ese|fhIOdrede3~Th+Dhs=CR)87kr zj^>U0C(u5xV5j0dp-h}8lh(k@t z#Ojgbf2Vq~`-1DISoIrTP43X}MZ{#9<4&I2Y58X7A8II-s2I;1chCQM@a1Y%awY~w zSl;uzh#ycxT4m8&(tZx`H-tr`Mt+fKgP}if^rqkDUDm^?(5M;>(kpIMt$oh9P=O&Y zB2<7<%S~;6s$GB#@YoT~du-1P9F|U@&i(JWe__3yNdxcl(nJp;0W0kaUV-V^Vi>(ZX*EQg- z>1z@WM+E+ld9rt1oFV%HIvwW8B?_3kOP#0wN}C$vdYLjKPn#N@vKk4QBX0KzzlQ6W+vY6YVif18j( z$*j>V+A+zQDvjCUin5^iHyW@*>KnIbG*gvPlYf{M+_k+l!Ufa9cr6SJ8`< zYR}5QFe$Pq8?tZm0#Pl!RVr*E#2qlFXGpx1_~2EB(YBH@i#^MG3lSbWf8ij|1xra3 z{hrG7a+gsaHD0V2Jgc%*l~6%E%<*2I{Lox*+Z&Q`5Tm^`=O25W%??E$>q?y{BJsx} z;%9JJzm-A0`Xe7*zNKXGJ+Oa@dTjP{(gtxu;R+ujUanWAA6Wm>*!%8_y2=b0a$+kK zSySR*)>s7UqciJf!q#g43YIrbZ|X98CvvX^I2Mv+TNA|1PvU1kJhw`py+FaVTvu2+Rr74AL&;LVOZ21- zwb8@wNf@cxY4vBRA!BYn(nn$;=LH#9!>I$F)}Ye}<2NmvqX|uFEVJ{4sTWmbeHUzo z!Mt}z-!e2Wf7`@}NPTcYXQkj`B8x-@05a|_ZIp~bm@lzNGCwy{tF%iRki~P)-ny0? zzH3djpGJOl`&30FO8Rx~{GmnsoZsW&+pj0gT0M#WdF^a!87e^DOI^X0(kqOzv@Lth zpzEA6)2jl#Bc%7g%akLngzCOgZnFXAMrL+`GA-lbe;o~gAV0@dzR0E$PF-dgtrkiT zvYoJ!gFp@k$KJaAw=@3C`p7~X>g(!PPx&Y~^#>n&B`ui9%@NB0uh4iQyI}D9U20#T$qgt-x1pAvAT~#Tru&Mic#>2*QEhGYRex*4 z^Ez|We~{_JXE(tjzH`q$JhRV{ETNe!VqphdS>|y#kcz%rwtRI}8g5^bcy#m_G(xCf zZG=D}zrMa8a8GehePw|L`tOlHZNsG(QA#Y&_;yD9CkDR5tXGPakdA0hGn(hvb1dd4 zD{;U($`{y*QkjbWx%|jCj(rpiFK!>()$1%ne@@TY%5Yqco3X|pp@?af&Sks+l!3Pn z;v%^8WhHM+@Y-TX07T)HXvmzm!T2_Ik|JjAv)_vHNmK2ewCaV>%c!d8KH>?k5FX|w zIwpN3H}Q83r)IcWAMrv4tmLp&wUC-mG00={H{Ww*6YdIAcdso`CkuzsXqC%Vb{u)O ze|Ub_R_g?IM?mWVhn&bA@S^<>YHta?^9`{H8Fm zT9h_>R0e169Qj6y#40gdT*LUCla-gjEmqs1R}?Sb`y!?#9ecBoW8nLd6-!;Qe>lL) zDEH-1YoE-!ULZ$GBmDjtq?eE7Dm-C@hf?$h=liY*@{CLoqm=Kx;{!nL~8-0 z^z~z3GXLkc+3AX*0Efsg5K)bTxa!7E+Eve{RF<@ZGa8 z$?F@rNZ@t5h%Qse?=PX2J6HQ>>`Vzyv7b$oDb{!l{Q5z?w!gbG`dB`GYvYv!c=8i? zLxLsj${7c>d4l`%uYE5BE?Snk{K|Gs0IK-C02n?9RhFTNW~^QE*+pUohe^nr* zc&-*b?|*sf%y1fzh8eJ@t2T7PWhc?*^`)4BJFs|8d5cU=5CCxpf9|<&AYm^P{V^c) zrN+K}&W}#xtQI9NPY7DEtyom=Ee+F@I#>dUHvZ~=HUCYqRmHI>BQ*7Ak7(%BK>X>A zR9p{7Hb_WmDpi*WeZ@5^VrJkiEHUdU*yqkUDUg5`{}nJ>v(D zcPEZVL@H{6V2{)KZ3>D3-dBH}JiB+avA_z3-M#Kzn1xgiJk(5mUA8eBQRYV7;(97= znLW;LA$pwS4cP)}%Kk-?A;>7?Lxm3Ts$kb@-)r}khLyAee^JjiB8CTbg`gu5jm6xD zs@8jHp9cfPnv#BPvbcrmy$%_Y87>#9yAHd8MlgH}kX+LnpzR-~;Fo_?70|ASiC4#4 zQ;xxfh-!Xtv=kB>x|{)Hxl^t8$RW}#2-vq-+9Dba1&&7WE`LQ2sME!v0#O*Mn zK)dm{)2J5S9bCXvX9{b@!52~@B5s-J_JO;1uURh5{a$M=5&gisZ_g*gd-2!3CN9va zn!`T0zJ?N7x@Dnxi|rUrucS{&`>}V$q%l%^ zW;$`O6Q~Er|2Dl0=vL!71&*X9?fcn#HHU_$8sDLYX*YYAB2)Y6qm!F7Pp9*}kk$Qe zZ^B2xR#n4jfev4UCrReC;m(BrRKr8G%=Pcc0$p z8v)tXe?q1ogrvq+jS}#qtg}`vvqHNINV>dv4Yc&qMFGh|PHpu6jP$XXIJ{eAs#+46 zbR#-(pWkS9`WTo>=dAN<2AAVx3si>Wu1G2k?QM`0QHc(E+Dzw`g9q4s)(cQIIe~BYU@B1dOf^4RmNvJ!mk_+YENdXqh zwmi#1irf0(r%FF6a1mZB(r?5FJK%fJs|h??D|#K<%y~V>SVc_{3{-k%@8u?KBp#Bf zx|bpkj|-H^tf{x&5XfP*Km}Annk^S$NUw(;mfbuUd+=lfvIM0vZ{n^;Xy2TZqJlL5 ze=y~cxa}VHi19)>%nYCY;5$SXGXKwiT|rD`D9z<@*42%cwGrb?a-JB-IBJ&B6$i!d z0{K_ZvO4tm0@*e>+z^NnjYe+oi`mlXcf`|fD-oLV*&mlIgsKt4^tT#?W-bzzvRIvr zw%*be73UMoIXOe3zq~+(t8RE9An>b7f0;F*+De8R5CohYYBUmitTx-_tsJ#M4@A}> zQxG_OL~W`1@};-87X43-W+|tr+fT?za45m31v+>Dt7mc6qjsII?nN?*$=aqp#y-wm z9|XR!DE2#XAeqj~g3#Z6v%aZv9KF4SFM}M3Bp?Vgs*GX_e;~~| znXxxK`R>(KBp!5UDd-dM6uqfjAic|`9@1o{*QQ_*8Zx3Cw~&4abJ64Niv)-V%DM1OAE zr{{mdGHOH7K;hewnaEyZsjvkJc{0f+nfU5Tbv&((SPNf{@a{oaJZ~bM5|szh|NYK% zEEWLV=O9%+*bW&DYvHLh!M5SMqca3Mq-53NSg7zex!XXb6L`4LFT1B%f0xBJ0eG5< zPFFk{co=NZHr9Ust-oZo@@q(*SdL|Njw$6Unf0NrjWJHmpDG(4>9?JAK>Ti4H4A^F;E2_J#pc4sm!6+fv z|6hHY1NUQ)@@GqEhD2}RzrZft$)?^CRkO*Em{wpv|Ah<$&ZstaxW*!wdcA}G+Oce) z87K?`O>h`z=^JQy{A$V!vjHZ7&j#$|XS7m#jW2e>e-Uzkca|aMVr{!Z z)Bipfu7)<5?iFOspr(l@Pu$zIw|TSP{eKD({a(WVn0@^hK+9uR~iz-#Fgw9pE_EsSn%_?TP=X<>i}f z?|NlGW{})7o)uK{k;nA->wn4d`bOeptw27GH7YP5$9L}RJRbZNTr{XBp~xQM?tFhR zcZ_#xiIe;tSJ)w3?AqYo9C===*}z(zuGdC5L>RJyxl;P+C+sQ7^+(yq({K#dNBkTv zPMa~k*25br7j8fU47v1~{*Shj>5ExcoqXldN<@UG-9k6gRdmp)Pl{EfKV(Wo!Nt5T)AOxSN-tc(fp zdomS}vpU{_gN|5M`zrUS7gq!Q&Ue6R&ch92$snEI(yI5+w(K2~C4URpIm0Kl2ZG)$!Re)a zOo3DV{9u)wzYtmdm_Flf%#P>(rB>&W!4ukiOOz8i0x+{+@rJ9hYvBfWY_G?FW*Yuo zZS~>np>zn$agjOi%TjGpw<{gQs}<};=9wlfF8O?&wp&~3l4~$uJ}ba4)S#;B#8R$b|tzwK?-N*)mQg!NgA7~7uX0v=qm;& z6C?Kn-@@97Br<7*6|Yk-#+X=p^_eNStx4qjpV4;N5^+^plesZ3mhG<=0v;*gI*lz+ zE9=(LWjfV-0ZV@WvLp)=F~v!ZhF{3H(T2 zQIWERqI%WeUxN1k{-5jv@Qg-|?oj1S=oLF>>Oo3VYNbV?YO(ah@5MZa#g=x6RvBrg zW+{&q3x9-*c}-!A8qTyP3D$FCRiJhs=?huPsq!RFZ6!VjsZ5S;W83dLdjA%#ydOn= zU*EN4R^8 z3VTm;;?kjm&(OO3@)V@5JQLI7UD%bhm=PJEn}1Rt%%ZA%guNsNxA3z1?BAru4c}T= zXd*KDdeC(N*->QU(Gqy#{$y(z6x)da#q|pyzj6f$XO(SmesYZ@!yQm#DZh4;=_{0F z)&^c6+JbLiAuY@=^@N@5I>YYGkPDy}g^5fRMp*udKfKqXHa@~xT)|R)${M5iTVxFm z{eP+HGVZo>t~-?`%_)fItI+N!ND}C2v?|T#5hu`$$AHb@2eP8$KZpRWcBi_8jEn)K zJ$Zl3l6HHG%(G|vUg`@dt=yU{ug$;@7r{<#VdkLcS(@m^!?Pi1k+8z)qOPl}4=bOB zU_^$$KZ|&96DeLH-Uj&eotbHKk;Y6Gjtl1eBd z%$%Jl*YI!5;rDwLY-3-pl_wo&O{#b<0K!-@Sh0oWiK7HDAnhP?j#CvN3uZ^DwltlCMpven`0mwHd-Uo%G>|FKL3iG~Q?in1u7F@~$LYUoH7#Z* zJQMo|@9u8GEpT|XXJc$wEEdiODt~i+wB9LJ{?4{3I{Ief!icc+!>xEZrl44lJQj|B zY@l&F;o$HV$O913`9%Tfgj=Zf913{h2ZAR8`a>t&PNh;o#oS*o%EXO?La&~m*CVy4e15Cd> zds4{$#;PlNA}BpMq~mU@EEF^y1)jEF%M{4HA99T+W-s7E z?{4q%c#}6HW6oay{+^j2RUE&yVZxS;tSATr)OiQB1y}_c{SVeDQaQqp+Pb*O>zTCEcR+NTO z_;GfRc$I2z%O*Xv5r4$P@Qetkv=6^byg^HR%3=maj$VIO1dWv9j4Kp%-wDa^82_8^ z7j_3lR&?!O{_WoC3%3I){V)U%_-0k**SV>Bs_oD%uvSt^P|aXl=a2g{iwn0B4Jp~Y zOr_%(1%o%QLn!*$6n0bhXNRm=%l>v@kPJh+ppiPLFSOH)cz<-xc?B5!o>e56N>DtQ zwr2=2f!e+6vR4bLsx9(JCwcb_zIgz9sW?VDu|vq0TI>=9Lz6>X0edcEq6e=vmIgJv zZI5~a#sN?U+Y(8^1*M=c`x5$ERfnnDyb`%W+TfZo@Fkq6Oi!@Mf8t#VeJ(i7 z(J6pAniD0yP7g5dR*&U?jaKq&8_<$ID6qLvLO6w_g52gM6E4@3e`52_$yP{5^UkWiKF+rxR4AVxSc@%J;G_AlvlET)l|O#K%{xv&*4`! zE(l0cV5YHS2T{u~(Uo;J3>-D!ZDL_?&VgWqA^42QkS+{XX@Hv8Ztw?{K))x7L@14` zI6oC#7k`C(&L7fL_9iDsgSSht>)%RKTXwxxy8GLo^;n^2bJ<*eP&J=j$FD%<;pa3d zo4-11{OCfQ2lPIi>*IoGvto{_>t5%HLB0>i&doO0^i0gM%^08tN15l_rL>tSL8Hw& z3|=SCvfz)tu`so57DT?;o^QEa@qEDKRg6r4@PFz~aX{4s8Sjp8MyH1koMW9K(^lb` zVEqJlvN=2KG?_R0I2DONO;K4RGzyUk57nFaQ6wy>iK-jnAK?;W2TB@sR zGT}VME={z#W`c5C3oW&=I6%hBt{5rn41fT2_nsjB4H0(|NCl01irf6;;s`|DMaD4Q zSbw>NU-S3Yk4ritH3nru+F>s{KdV$@Ese)>uC9|?ExLMw#lVDHXt56N;yaKMzb2=U z6_iPMx~3VkmCtK(c2C_srMWOm(UyhaD~OpUm#^gH^Sq-C*nc(Q4;17B&FGMZrtyE`FtGiczo{PLsxKA} zNF8OX9^Z869By0A3y&l1%;>nOBV%AeFY%?_j@k-bR#fJ9Hwbwz@7y_IpG$!(_m9wo z?GP^My08tDd=9oC+V7y?P?vQ9Lhge;eN4A4yrZw33Tzgr1UaP^^l1mRe4c>CLVv;a z7^+{r*w9j-Xn2Xj# zSB;}!u#57tZsRs;iWtoG9+O7!1w}6}XpO=~@)!4ZNL5S0vAsg)wpj}v)IAI5&KYy_ ze*}v)I7^xN`J73Ud2L(W?6(3CUxEcE-QME+MA2VDylrE&_ zOdMyd4dQ!NiI%GPoKti$YOXI^3D=7 z@^kv=+5P-dJ3tybXFl$(nSa^em(xBTF;cclDmCY@A=a&W_1N!ENIQ_h6otouVu7fC zl!a;uK-t|eh5QqZ?iLEeCaN+V-B!ZkWiC6u)Uh0OijTs>6b8+i7Oq*V46|JWO{Bt& z5y2TW;ia@Q?;EsDJxVs5TQFJLL_GoDL#Z6d$CE+g7;C_$G_QE5et$1o)N9hpHtw~k zjt=6WusDhH{t&s>?;DscqM60uSVBqH8Rv^jt!PC=MgjKj4uE4cgTMr5^@ul_L)(+U zsdt6-$WzvQ^J?c>4@Fk^rd1rYGl)C&?Mrw~Mw`19k?#7+}ASh~YBqcIeUAZu`8uUvEKv-2k1Ap6#m$wzHshQByQ>%)Z zy+BtnR38;u={~igG=6|jTm@Gm08e-oA18_<cMB%vX#U+y;v+9yyVzR5)23mtGJ2!Ro8Nn|q+L ztAu#o?w>|^fq5t)$# z+ip#Vw`SUoxW|3W*)d5sL{~K-c8Fn>Dpd zZ`TxqO@A&|r<+=Y@2M-c9f5=Arqq{CVFQK+K*PN%(P}E$w0j;)Z}SCVC7B`G-o1jR z-;*^`bhk-b?|CQc&f$jyckI0cGp3D?Hoh=4Q9j((=@Rx+NOW%rpG5$$J|;vu#+vpk z^ID(NQ=O{bgQa;>hH-}}1fW(!TM|Mvq!b(>mw!;Py*ycZ>C4Ph((N#TFfp`n2*XS= zHEf&A&o;%dXXeJBm}d2>ofo`eRU!CPdY>KqNqOrxZ}d-ucZ9QCu`iz$nbUtH+F||p^30kRv%Qw$+uU@buM#1>c<@ZT~mN}+vW=9`0 zbARbPPA`nKk>OV)NiTGoioWG^ORCmj?!05^6j~R$Pye=*WQB%}Z6`?>d62A70>bY8 z?vYKV@T(KS&6+q{Ny-t>FCvi^oq7@gN~o5%(fxpPJH8o#2O8Jt$1+wpe!FCPPGK}= z7n!`L>(a+Y2eV>znZ+48mcRhFKW;>qz<>9y+NXdeE(G0M!J{ANiSA(DEGP^2I*~id zgzt;Gq*@`c8juW$G3mfOMI1s`x4V5~OslSyg2kO_H_J@u(03`NK8K5^tu z@nc49QDvqZAolWP=d3O{UAvwtfZMNtt2a-aO|F!+;WWdvW`@C-89q^d`G5ONGB(@+ zrHfx#kENzByBoWbh#P|>ji^^$?|G<&$2o)y;)EnLkg}A*=slJs1+k8i-b90DN%au> z5oC_sA*2ds{fr--b3kv#Yrr?r!9AP+@jcj4S3;^Z(a^s*>%WJUIH}r z+=i6oeOsLH7Jv+!8&t*Bpno6iS~F86H<|)_F@q~*)y}Dh>IVjVs0}WL`apNge?S3M z&An)14xi75SNz7ac=)41-Rg($S>kTgc~tz}>4ua$a|h342*R|*@CTY=ZN=16s>z2P zNf;yMc9SAsdL+QU7l_nWV|Iwt;mM&W%bk!)p|?-)LYLl)O8%SngCa&X)ws znDtUr=v@%CWih=6vC1m58JzctLGXF6&5}EO0<|WGK*rghC@a2nuC@i;lVCGkUlOAW zV^VCa0mu{x&xC|Ib!4t~TaK}u_qQFICAdQ8qP#6OP$lk@-hZnXwKX%esLgs9Sn}gP zv6~BSCJ2~Mrj1E$c&$QEKNEt)(q>g~04$p&Kg(USz7*IrW{2UuH;cO>CnO?>t9=Qd zowYWcaq;ia7`M!m$U?6_uEStGt zRZI^@Mg{_^t$#4x?;$L^41rZt^{+a=gO0?&9cnaZDTL*ssftgzIUy_yeXdWZ{Sbzf zz6Wu%Ara^QZED7j`W{2+tFXWJu2d~VYJZ7;`9JsP;J@5uqdmuu?orV5 z8_=0(i86s@DB#L~{!TUH-yv>@Rt<(SEE@wU^YgOo)%|Nh251zYEWG88>M2&Ltjktk zMirXgtE+*he}^jFZmp}OOEI`2^*PQC^5!|jbqb}Ja4uNI9(PGi@uSZpx#JXMk^W6f zIZM8&TYsz)G_>0~?A64?RK<^|MZT=`r!kSm3>McV&=(Lld1w|)B(X83&s}XX&?%Yj z=4KE>!gwwj`TSGvFRBK=7cC#Q0q0C?yU%fCOhun;Y^MEKK{m0#ESMTLyVCQWdt2Z55^wktusu#g2bC5NY=*gQ-3CuHWNDXCD;+Qg2Rm>V1qAlrwD>J zb@qv?r)+gq0AXUR+Hk8p(0-%0Q6i5A;`R7&bGX zTz^HSVH2%onRzROt>X$Bbxq$gqKuT+%(_+N;AW_0PlhDrk?%M+fms9bN7 zNz^y@P4q~?;*njL;f8Y5RH6-oy#AzKXsXJRdSggbT<7gV*SOv-$S5Vt!9oq1dVF&5I(*KjB8 zm75u7Tfn9XGac7R)(dRv003+eR{LKWemM?6bS&*@K_t3fGE{peLZHgU%-rxgSw_PI zM6iOy7b}^dx1xDx{940R4i+t7xL)WQ9=)}<4Z#k_7FLPsUWw@)=UgV<-#~v6(0?$j zd-w?Up~*#*W{&{pXEHE|&*cR7z#C|jo!_xwV*u6R(^g1n7(>D&8xZrJZKG@xuUZAL zHV(7ZO8D)yNvsg=D@b&^83jrR^j-hUX&DdyzW zz7q`Kro^-a`XG^59K%nYvPfn+Q0`R`kNgQ>flqQ7*0p8l9e^qj8j0f;uM&g$V`CdD z-q|*~`pplJma2?@v^ zvP72GH!7XXCZzs!RVng4>VI?GP(X#D^AtuCJML2Z67Kg(!OD{($yg3A&_rk|@hCm* zrxPuK=4h3Vo1peRjS|MoX}tw%I95b*%7(=|h0l~kj4q+m&sXpBkEc3fOp&|mw8*Ss z%9rK~PyL6ivPfXqXra=YTGnBMuQVTYc|tp!^P8jAenUA0Ov}66a;lcnm$<}0u9{1hFwh1%-#-6uk~j=*q?QO0j5lAeDuQ8a zb8Rf}t|!*nSY03JG?!d{=1yzbvL~8LG@Cqzd`F5ij2aPYAM@VLeKQxr9)^j(p(E{4 zIHB1lJ#k|T2*E)ikbeY$J`@OdCMk`zq9Zxc^l@?@s@{3`VG*z!6l_5EIA7Q#WhfGx z-pRe8SgEY==KLL=l)u^=p2sIh_@TQ2zU-i?cooK%0?UW{Sitqlr2^81TC^@i)NyI1 zXFgFIeqBl4|IQbt&a5AVGxc-TiZ0!wj_IR-5@+OL=atzCf`3n^IP3H*i}q;%4bw1R z&YBa6LY}lE0(i)s`4fK*@(i^w9NwH;Su+))IEP-Bpv6DXzBn3*uEfY14 zBQFw!QD-Q`%{*X)aL|4a1*xNItZlzj_f*meX;A|ZkrCJYNUUhV+TOWgRV<6`yYFA? zLRmzO4SR6-zkkHd<$5%NIT3R0(q9VHHi*7c*rC{YJR0*x=}iBdUJ)N=ViJ!9KqCTu zUh#5MD~I+;nq9M>Z)u!)Y1WWz;R^JF7|Nx&j$Him7I=#8Lof@hB-L7V{-UB_8c2FI z=voXt47@eXL_^jpq1}*Ex(<$^0O<)B)&_$pSWyavbbo&_KwbmLMKFp(z$In1jWp)G zI1{P)Y`sNWJ1KhT>%6|r%IWCvK8BRy6&Tew5WL1CyS|bcI^Smwda?}#F`W+0bN4gH znGBvj7p4P-}%-2b!LP4(l4rCMt$sW?hGWUo=HGf!x8{;Rb7l4{Ih~42h-*oS|IS{PO z!AWpk~|(jK6zpNCMvwhx%atBub0^gN1bz?eY(;T&tY&$w^OY zK(M=KeURk?AT&kwbeg5J5`T)u=l>GJMjjVPrfG!*xRtCNg3Fn*EH*j(z-!T%cRdLZ3qE+lT-~ z>8R1QcAd0xiL#=L85Bj5pZ$j+urQEJIp!&deeOblv*Z%YcvY(=qADgo!YkB1&wsl) zk}=+E6kTIJ(C@{H?18Ea@Fbh6HxZ0bj9`(lF5SZTaG{=Gl4b9u_L(Z=RG)H*?+j;L z8@halBflwUEop1MMaU*|aLz2&084{FJY#*!{4004dn6JfmXfsjRdldDLJs-Z?ftpa z#N3iZga#NC4azjyP4qaqgHaw(Z;Tg(P+32g#Y!ds8!jqSWl?%7QN4FP z+oQVxXe@-31&Td(#X(dX;kh_x0p!^n(KV{sJ1dh|soJ~DCH0%U4TJ4Oku@=x9xi_> z+D_>G74u=!CpJ1@ujAV{9s9cyWOosiIj2=WDj_TqxJ7!8J`?x~JGm!mKYy*>srR}a z-{9Edc@8^Z%we2N)*Fshlqbz{o9C7TG%1}Px4{m=JfN1SVV?>XSa4$KYb4ebz|%y+ zex+7F1qA)k{SQs9sRaAa@wD#|1ax;0G z8;r_0#cA_9xRPl^QMmu7P=D1gH+4Ha@!>Y1YEG%^xzj)szCUoFQ@5b0HSR0jaSOGK zYm^9CYmN1sMqL6+W`k52&j+@GbdSve| z)x8e7Bb=ry`l}TUu+IaD1>wCS53RA(f|=o^inPlZ{&nhMBrNVxsejY)EywPLAQW%X zKot@lSBSDre`P_kC1}4rf8uKo9*AT(%%M{w8gk2^1Za(Nif8jP+!D(#wLDdGvp|pR zWPh)KPOv#KFYMFhg^wd|Jgj%W^_<^D_a!cKpI_!!cz7z9NN$Esp>O^kK*dVHk_M z;8x01f~$6#%%o`#Hi;i?d)n|d?%AS3S&tG^fRTG*AQO;$O)q6KR>!ewXZcm4OKt^W z=?ad661mzK{YqUy4asMz{K>=5P#<5G_oZ<1x?L*kb`pTS}x^^*N!7GzO^}`gIlG=1D6`IFp&+UstE&Z zb|T%`afs&zgJQA?>DAag&X^LCr6~1Un=m2PZ9qd1cHyp@;ouB0BNd=z%%9}mroM;J zX0lp2#2@HAKsKunGR|sRRWxzPyJ#asw36D!(h})&%72BQmN0ktJ09U*W3HZ0LwC=Q zB4KZM1GoN_zGriEdC==S~RJPIuq*yZ3T7Y>eerm)q-r|c( zdw5kpqS_IJ(?w)N=@vlUX+SZ+3f%N4EVW=zEND^oD6O&sAM2V!C1iDI*#}vt-(kut z^b_o~Y>{!h@qj3@N(+1K61;=wa}0=vmlqmzD2UFk;$2H4ffD@FNY7Z0^33?SdVh2` z|HMf(XlwIjFE_4*?iow{B0`_)B=;(QzzpE)N%fqlH8|4-<9l|bAuD`*)uD%v6Co2P zPehdy>bk`9RURAfQnFcSohNrHHc=9xPvO+S_AV=xV!BpcM0oiJp+c=5wFQlCQ~1

    70{;Iz8rK_E~eqT9;lmeeL?n&o1!1TN7&P&Q3f1ka+mwiAO z2kT{Ef&BlAW||Vd4;9b`6~Wmrf7=u!kq+Iq7zH!TM=x{yy2ad*hkq2U%K}bnOw_3R zCPGjafP!bU-H!dPHf{)kz(1Sxx@ocFH(T-KyUn6>Cq^{mm4dGWrjoufUdcXFO^589 z1krC%GB`xA{n1Qf1Y(%#~oWj4AUZ2k?|uT+;$GN>@Q=|O5|Qx-F74EJ~gU2 zf>&D|NcXSN`3TvWd`WN4w{y|jw^e|(XC~AA$Ub5ORUlG~`6N>6<|$p@ zelVI5scXWclUIubGF%EuV>x`Mn%)GjU%%f5TUO;-^Wd&xS&4N)e}|QOi?-P14l7<^ zOu%NeLUOG>8R1{vZS+e^G?eujdHk28DNT}y#{?eek6G?bN%!`1y+VnA8vFo|erN4K zwleCA*cjPjeXTtb!~?3Qjb9!#^4LDnr>q|V#!DpQu}=#pe?ZTow7d_F@T+AEVUMH3 z>4Y~F^bU4yB;|g)f4J49lZ&!)w0!h1yv684y|~Pqs(8S7)RmggG_~L&PGFd@6z9{1 zonXz(Fx=*!KMoo3e6CxyXKHM501~#CaX4glx1Rqp7=UgfGwr29}Ae>chmbzC3hE*1p|>r56|HoGoW0ps08qew;hZNZHtAe)0G|aM&Qtr zhWYxSMybmO93!c1t9JTg^Q&OwJx&1^G6e~%L%kpO6*~C3v)jjk;W=Ya?c;*FJ*{<{ zw4VNfB1<@uf8GNq1WE?g_nLr|GVg4?sb5+aM0u6Xt0DxHs+Ad=!Uh0YO!GAbI^WOv zaLM^EctdP6$+<3hECnWT-%vg}0kU0CG3n?AQz$ z^?7d4*j@t27{taS%G84_A>FKWJ0_I#?QV2ch};Gee>Vs56Jcw8Zv)NOOQ7-r9?3^6 z3H`hjx+Qyv{0_4SqFjOhoZ*BGooCJNZpd?)~qckwLh#D?_1@ zG+ln2f0eu~ZLe4wIbckZ_vAFWlRb&r2{Cn+1LxQ$+4eh}O}9cSFiB5OdaG|dz%rCY z8op}xUs>4P=Ue1h2KC%u4rIvi8b22T6PNBJ$n`>0Z8ka0>_}p3#HWpvqbK`8BU|W? z57_Mvu1y*Okqa=H4^ZXz6jcXTc=U0O!!@fCe{{AUlE?HQ1x;?yGF#3w-=gmy+rop@ z^}_-A7y2%L&B-T#!YSa|zm0 zl&oV3V_B8}L#LOe{M}gb)G8!qI;*7a~C;uf~nC6sMIgFG%Jy! zBJJed@@JIvXmbtmyYne=azfcPdL-EZ8Y4~;0H|R9Qo!~ya>nJlV{h0Tuxq2p>hnKC zGCU-Zt*ms;5>reQb}plHTrkNJ9t@xGF2Ny7-bZ)GgtXB!#)F-I2H(2n=jl53Dql#z7n- z1_i~<^0!|#IUI0TfY%h%eAXSJ%uRnW>w#V^c1F_tm1>Cbjf64?};z&lK zX$sR|I^NmAYb*NO%iAexMNMxC*sOt*O!%EOgof3|fmwSJK`r9%9NK)dhD1(EytmXf z1Guu(R$tS(m;4>r+FxRNdu#{Cpq>1S`V#Ze8Gx1=NcrsoWp>m6D=0CWlMk|;8{YF! zUEX7-;EkoN#J+UHpZaQWf1;qg=)uf{QJ9+?D^VStUP>2nXdx&MJ}!^_)MM=vyr-Q} z=HuolaugN%uyDd)Cp=5;u6NRkjmV=_iwWksl%B2hVmA(jh%WrD$d-W)IL8V6{I;+n z;e7_raqkxVy*GMEJrwXR7-Uxz{q~*yO{?W*(!Bpb8f?bZf67O0C#KS*5Vs;2 zW;#NGjnevc@s&NNmp>O02rq&Vhjyaj#&XJ^02!bAkD*{`Md0ye(1A;_L~wM{FNI&Q zJXNa^6>xE~HF!gOABDARwkAasV=1DZ&b#8fkkU;3#8HvDrwdiegZDB0(dn(7vIb%Z z(R>n?H^nlFGR?;|f3fpiic(lrPTSkxpc|J+wG~lDMbMpu0f!fEGo^i&>^5fHU6|#} z>uGs~nLNKuNW$^K*Ug5vFVm4CDwRr^+(jKf2P1&FYgyyJI(ej@iEBDo2KuT7PI^+V zUT>;TNRON##kF&LJ5qVqYv3C4u6Xi>w5Pk;)MN}S@mv%ZfA7JaXBz|8o^G~M*%83jQ!waXq352$O5eHX{%!pY*A25*!w1|c^oRa{3=k0vNxgr&%K`} zOQy$T7g8zwiKV+7KR*jI&`ec8uWNoXf6_D$4^y$dynMyxK_SZ+cMtVuYFWA#*yC1N z$D}Q~ruw?(f0|grh%W7<{$T&xI3x= zP^DN|ZEI@6=w2A{2B+5`bf&dFD;pL10{OBPHLdA-fARc+g3@S!?jmsa@*P^dj7C%K zzOF9QTKok;j5<^dPhz9-ia03$Ys6$Wx|ikDJq-%uRwVTt;-9+^In!{;uJ+)$6E#%+ znpOT^=`|0^)Wbc?+-3HOcbvIVYS;1`Td1m+P4Oshj&W5I?xRB7F#avlga z?Z1eYe~PX#c^29Wm|>@^+{-+BtbUO(1G_1&dIY_6%=`qCv=(USN$H(dm-{m74J40= zpLp2ls4+xgIa|gj`-kgIp_SwGqYA(pmx&l~5Ulg;O?PWJtA%7y%L!xlKEt=ExPdt> z<3by=HemCTQ|y~*fZ<)r)kYg0E*9)n#S>jX{ zL0Db&Erj%UJ%@<}3@ovOatI9J@uB$nq-H=%q0T+}#3Fl_Qx;$)j*O~MSgEjB(?}Lc zZ}4F?0QD>CiajmJ7yPIZ3}!|rS-IVE*vFjQA0>zSh)V&VW&n(md^y{@=XZU5(5ysq ze{IxHW{lCqK42P=+CYug<5E`yf5}Zt6%q+?P66GIn~G4mpe$mbVl z?GXqrl+}ZhpiDIq0uuzMnh`tI3%egAM~00ApkRhqiH`YX^yu|Sl5MX!HLf4oly z6f7(`Sj{5ibF*!i70XnuiPlJ5uT}8o`*GzBOMS;4Tr$7uPn&yU5Q!v|mBXu@JxswX zS%NGOM1n{_baVz@Mc~(dKCde|*mo_97V77xPm%HZZj-fAFzpy|Wo0OUYbcd*Ga$__ zmftBHlw}=e+`Ir&B!q03=uNnb5PxeT?(+MuKT^gq$7zz&KKMo z-`;ghB|crwO;_d*4r-Io$=}eBISMd}3-S7*k?RZU{KT++Or}Pw=JJ0Ivgr%dWnKuE-?txA_^x3CIGus zTjUGL!}4qZY05icO|Fy)f7q^Icm=h|5mj2#c<#sFhI*4R=Tx<$k=V?-H&jQQhJR%v zt=^~7yu>}zPMsOy#VyfQABxs-q4ygTk#Oo}wtNr^_{S;jyP z61$djIruO7@@28+GpQWbQbS{gMqjtjWvgC0)K= z-|uj+ackT4_h5Doe>v%(ODwsW4FRmeax4-DfNRGlseoxnTi@TuX48lL`$j)SS`tdn zJ6B)Wl+ao-a?bCz()vxF zAckrE+g;{a^jPpmWY2D2R^^tFdZw}OQ858~)cmcxBCVBcf6_HkryPEFqBUEp>~i|= zqS+h5XLn7H38YHBJ3brntCsLp0*Utt(x*UK49Wd^DPl?CJTn6W3eM)MCg@(9PCXu} zaujx%hSs*`NZ_>-n^1%f&&2s1(L44BJ3`8o!aipN&2j_Wh~lj7sdpb3(DrGO>KX(A zMzf0GYvVBCf3{#ls3o-t8;S{$&;;*u?Gy;h)HmguL$E){;3ZBq?5gvgEj|taSfNJh zJ2>c&e%_Y2sS5&j0Yy2Oy?KLpfL8^*y;`Gy!O_14zgcOXC8%z&BxCBa==v!LKYpV(*S?^S3G*tQBR)nh0@#dJ!e{M;{7MZ#1RP}Q;CFZMNz3nJV zrNQiOz_6E#Dk{iR$dVzpdfi?FZ#9qO;p{;oe$GKeN{*4(Pn(6jkS+0@YSoZd!V{jf zGscGtc_U`_#mZK0t6Mc4z6woNP0agl!v^}$#tNx@q&ucMgFtfVNg%zCAjHw1K`?bE zf7Z|Yf1-WZc{rfXeZ?(f%#tAQ7m6@Ef>x48KVkcw>#`Wt7=Ue;2LKPZ+@}B5bw-mR zmoK6x#QQD@+4#BH!C!SWle1z(7Owsw3#(TWhUSu+g9wCK{Pd_H%I5t|x;V#B1eTm_ zg3~ib$>0tgtmGq!@NLQtiLoaE4~%zC;Wm&%e^-6&o=<98(3#Qm7@p187FpZEqeAnK zELhjIXOjW)tE@4RXDT+8(cm%W9qC{JU9khb5G9B*4+-K{b8nk5Ze3?ppM?r^%yUIO zTO3FM!Z0FKWIwidPWyK4p0U0vlQxmQs4{|PYykOL%r0(468W;P9xZ&t8r957JQ_Co zf7-Z>h-z=!uo&N9Rayi4Irgb{`rra}@EhwrpqHJUup>Z^&+6uG=KU_hV$m{P9S59C z`a!s24_;~6xv65*!U)g;w5!tc1Uu(}mfLm3rRQWgw&olBtk@yKAw(BY*RaC&u;T8Q z`tvoku#o=Ji4Pa(VcwR~E9%-oB4qo3e{Wsn1yPL?Qc-ZS{s`^I?c1|HyzZdf$~#U1 zDmL`^Q~9`Ve$YW}qZF+qBTHB}*=r(Cyb2nS00*@ zXtV)NH7oL?+_lRz^@&hBj&PUdWIzVoc^7v`>zD3>k2z5TE_&Xyc^U9pbeX;LyNChVcOs*quNO8C%D=GGI@ zBdT@MPh*f>L@`4A?vP0ueoh|Me**Oedkp0_@isJb+*P9z0OwM(MW$|>{jxbOGfD7! zE{)D4c~W=D$q^{WfbA;96?Ke}rkIX5{suF~Af zAte+g_@QTmrP-)*41>FlpTQ=7)QkUrdw=Ig`Wo4=SVPIk<&;G`T5%Lye_wnBQ7aCT zN2eaussZ?}VrTC=e{C@JhxUzP3B@LN$H%%pzpaK0RBljC+mN$`tu$GC&`xN})C!0w zBu`ypR}qg3)HkKR3&;onT^>*%bA0 z?r@yf?q*%ExCoD=;R_`Wf5_t}*aH^nLeNX?nmE}7@|2ljss=)U&>Yc}yvgnvqn7Ur z=8rhL51bzN&ZIR7h@&?oOuN=w8=*4QSc)7g%a}#7%PdznS29xKdiHAuab0A}=KYW@ z1694a+>XIbJig!KJ|DxH7wFJ(KF$Pig)l?XW3rS)ju7sgdY_3Fe;2E4zh*4jKq@7g zMTkCtRK+gdz7nm$H3#3eaf~E_Jd( zVC%=>N|NVhaRI5CEahd9B@qoTeT)K7n^{4;ZiGXHW{y~#>8zuTW}drDQh=Wqff(Mj z{3T(dOK{nx95WDGe?KnU8`Z)bNz9jfD)SQwbYGR9$w|VlBf!(thtiLA<7U|{v9Ay* zW)g;6TCSz8jIHN(dqB=GlqvbgYd#$&WV3|nHJu8!FhvXcUS>t9e>tW9;PAXPXd%0m z{N;F?pCiDZP9+&U2IMZSkfp9pu^)pPIy?`J(I%9NSG8d+e+xrQT8))H-^dFIGz+o? zEe{mQL;BUaBwcXTc1_bFM-~~OgLEH)N>mjT!&DqOgSmD6)m7i^^#4{KtC~VA%9z4k zZbo;fH*WYcB8{!wZmUZ|ct4uDHmOmT%u8$*c%0d-W(mKp&1wnmOZa#POqE5eP?;-( zy*h5UtZ{4Pe~Pei-i5|jp8PJa#uypUV_pSkJY?_rrLN&o3%mE6ou)VQEG7-hQ^`U5 zCtu*{G*F)6-xHbd;D~U>1Z`)uNgG45AXh$|&kVb@XklE3rk%ypdQ9jw zYzq_0o*%lDo;I|6$a>LI6Z99S@t08Iq#inPo<1_)inW`mjO)u~x2j#I^dt;rx~kkd zyL5BFe;I0q$Qc%!{h*Qab^0V$VzE{wd4wGnO}(1nM+S!8(+WhVaF#Q=DXMp!|Z5 zxzWsFYvZ9g`9Zs=xgpRTh?}5)OA4&8jPIt&f7Uyq9xs48_HHkrHl4WPeS4mE9|qSI z;+uLC(^V~_< zf7}_7h{SI6he(O-9MsAIaSAdek~qwnmUmuQA(fIpxRD6Z*F~FUjm=S|kbL0xftlE5 z-HV?IQ#XNNocLUUpNHe`i5O5f3zvi5cveJY50}l#_gb7xPaW!(v`?urviwnLh+Bjo zrxwW^8UkIFFRRFd7B0HwQ~H4fk@D{HBOU>>#AqMeopP-@T0^4`tGg! z>kIcegz54Bz#+8dOOqEj06Fe;pXK zW&UI}sOUThuJc@MOs7vk@KVdoG|-&o89;lBP^MAU0`YCff_twnD=Qe%tmOv#CGy)x z3sS%%HTjQZ*x}Tu3EM%oemM#;aUPfC*Yq+3E>qWusG*Y6eP0CcH+tI`E&DjX!82mQ ze5F@}5u>bins&+PStWy}O6}7Se-grH!XV;2nL8FZW+?Bm#K(S76p(}V<-qJL>mXWa zm4brn-7;QJ`HMWvGl5GJLOs%lH3tFQtExmC0RbFo`Dw*mZ|1I~{7T*?EeEYxBAL1g zH8y!D*PB0#ogPWZa!GfEk05S5h zHw5+34lOgWz_e9rGc8Z#b=VXml8bF_w_nlka_myd)T2IrL&SVd(=YlPvN%DCo_@=D zl6KVAuvgWu2)s?ze-oBF_pTGCS@D(g7)`EeQu@gP2jjwfZjU^efB1eZN{>?}g9rnn znFpgBumcB{0%zjQ*CIP`o)nvQ(=7D1Wa3)X|BYs^3-h zj?J8;5)d%6y_v?i=FMnMZ^PlVH@o*b{C{)MFkd}d{fgFn%`n?p>AfK+Mg@%|U_4+~ zAKGh|9C*`jV|<5^v3zetKW?keIiqO`HWb;YF;VAMcx-Xu)LUlil2#YDgibEp!x8<} z>3;m{V0Et>e?9ylYA2$g?Tz|Lq(Zc?rq3`$0BlT_Uh4oet=Bke|4RRl-}?rMCeYce zl7IN~1{A%9w6RE30^@I-g8u}Ohx5$~9(&H*IX6`?@9b!3UV@6q+Ed)x+B6C;<0|fu zV(>!Tf?DeT$==%eifxfVjWL+L2)zgz(&k<)&2FlBzt8(0=CMLG-$z2z-8jG!=lUFFJ4bz5(~|?_Id3#7NLnO zT~AQqa`~#O) zsm*1TfB5MLGqU153#2grzUwEFiZ=Fq>i=Bp>rc!=tv%6Ok3~j!*l9mx+ANQ9G-)yw zGd1@V|H* z&+Diqq4#HgiiodIEY<|y`nIw%QvA-J`xpRK1?vjLf5SuCi7fPbE+yFzSJVH(gQiSl z0?F$IKaFQTAvU%{0eyf+@n#Zzz<`Di^Qm<*4~k^|(WC!#{3g?yWyX4mOX~1_e`?$7 z)#YW+rH>CtA=H3-7=`=d-tz3T#Ucq#lQDw?U$~ruY_@rD|juLMNvU&Oz$_ctsY%k%p=@7@-WTbPe!lQn7 zZp#Mij+2dBNy~n4FBijlc%j3Pe^auAvC0lGHVu1EIMfTllXtyxw59T%DUAJtq>>GI z3&C@0&*KVl&X_#5+%#gkQ;$C)U|nthr4CYQ{+0RX(kmg%y>pADxC($I1txSE&Q|ao zSB=m?3VhAeh|0R^^9%!8Snv%V0w1jK_Ti}3*Sc|T#MACm??<7?>-n^Ze^-s$I}!rT z3X^>?;|`!;^TohJ7WEx#cih04w$JKO4WX0tpp^hB7C^08;V+X#9*l^Z{*Y4>1sI&v zr~J^Q*&JA{jGEJ7_NP=nMd0os*iOVLL6lp-^YKiYs!)&jr*30P@J0NDI!*vxDv#Oi z_fG#I#o)@h=cGz$m{4iAe{egM2+7~Ti{~Q;pg$mG9<0+lW7-p6DS!Lo-3JMfVrn`C z9DSFhU^F3UcN~4Htdb1BM(BnF%EW%ZK-{|QEU`T7hT7b!-{sM=!xd}HD(M9*iNrnw ztn!Ky#m7tdW=>K_t&|jrA`5y@q~@WIWgy&SsR1(RvEN;c@LFcre?__dpv%sUx}WZ5 z$~y*vls>Kmb6PGiyH?2Ad4}nvwKt{Z+E^cbB+T%nqudr^(}J$Ha5^pBB$iH6TNd4r z2|q-a^FxWU!O~D0Gp~#Y`oQ0_L=n;JV^|fR7w*a)t6;c3Fjc7F*)W-Z=H6>uS;^gj zy*|GSJoEz?>|JU$6ml<5|^c460yl&LK2q#LNAIhMm%` zi=6Q0CP#+J_h!eA^`(B`2_Z#2pfnXEME5UbWf~aI3Q!D*f2B})dQ;cc28}v&OE~hQ zDvr2h=SLMoOcvkP+8}h)scV_6t`Y9CHLc-}m@-EUyOA!!e%C(FprsFk+99C$Dtn|o z5oxi3@2TN}B$teF`2MM@(qT%^;pGoGERF%pkH?L7Ra@&Dvg~R#oSY&vLWzk%_z|lU z-w*y>PyDnve^%q`*wK6PfCh&p=X|N9Q1!5LBE+@>3Z*ae1sx5&59vamrkG8BWe9$k z<#U$`a$J#P=hmI>U^E(R&s5zgmuBY0WvS?+sNn8O<#~sQha^^i+5%TcO(U(jXQv1w z{Qn7xa-rir26$(@@R=e@A75OG_=)S!ZV#fy(-8tqL({<3fhH z=;}gys6(y6)4Qpcy2r*b>5uE+jAUHOAn*7b9KKUsO9_)jFy@bYaScWuAgcwYGztkJ zfv|(UGeoK94C1V#4+ohESoHwAs+9H_pNZn1@&FKzoK`2(=N#F%8Z^09uo|qs^&22v zf0A(YS3vHOWy;%_cF%YvsT3F`^Ro4BuDT_LQ>ZvnNRz;-j7 zg}L0^MnD?i8ozm&AW)hvVbImmca!GcT4yS3P4IjtFDH}D76BPM7_!FcoWN3Se{2;V z6YhV_%Y)jtB+jrrH5#f#Qb+?Q)_3Oohb-q{>gyeeOj?!6H^6UIOA$tKp~eCsrJgoL zkeJWsLeGW{mt+Vv_{`nAy+FQEJ8W{nn0(zmWjT`f;y5FJhopSOFy{M~nDBwTxYn&B@NR&($fB70##e{yop(2Qb@dls_9A+qL|XxQU9x&eH8k%Ss_CwyOD zC>?%kjr(#R)*bJA^wMmX76l%F~Rw3BwjgT7J;r!mDm8c(P#fzr!_3AfJRb^ zTL{p?g=@qC@)H`gvPLS2W^-rsLuAk|l>{uTMz`uuUsDB)w;2Oi`cm2$e?5m5_d|j! z-l43oqkr6!3t-aq;0RxNIMT*>S#DnHvC``gzJ54_mD4__E5SX`#;}UH|D_6VjW07H zg?cxGuQ&S+?;YidvN^Z&)pP2%eKG)sz=sOEj&@T6HYQMKN}`XlOaQs<&PW7iq_m}dTI9X9NZ=VR^>l*3@zXFdu z-CrwNWVSc2%nGQ8?Ti6N4IEh`LcVtMxSWlYJx+*^^iu>3dS^^L(q|_}<-qBumHAga zKLna?$wa5XEL=eZ6!%a9Oa?q_NEJkmR?*NmG%K0SUqrX1mqp6re>i@CKz>{V3c2R_ zt~K*gq{_{0!^K&6GYm$lvd4_obXkBdz#Irg_eyXh`MCo&JHW!MmBL1YLtuz?!_%0_ zAHa+p(HMFHD-}MIh!-!ABc|t9G#4=8Kk^=EWmacby%(y(M@^C?kSr39!hz zrk5SK7#Zi{N7x`AQ(U%nilu5WZMXr1cxiWZQQosgQ%b?TdPuMt z;;fe^ljfDG@mw58w!&SF4D<>UZ8|snuapB?Al(|wK1W1!e>X@fj?Z+tgHm-Ns$oY2 z23aGg^|qFvZk*ovG<}&J2M89mC98D;Ye9JyBTD>~0DiRHjft{YakiP#7z9v#4gvxJ z(t_4Kg3H)VO6>Jh9Eqw{-9rl#&b#~*uxP5!mS|WiMUf>xq zhl_N5-4vLyf77SC@8gyz{&VN4&YT5O2<%YW>7`mg)|`t8sNHgE20?rm=i)X0@p#)- ze{B6o*|wnVa=8Qc=Xwsf0f!#qnMM51>3_X4v8NQSRRDX@D;JG)LWOp&{t?ex4jkcR zJsAY<7@2;?8f|k|oiko=?k5hA^qwMH4|iR0zX9jWe>Qx0o((}|f=8mI*3i>DpAT}N z_+;=EPJIBG0$*1zBqV8DAD+G(37MTYXy;krch%)Dt`9JCbt_^oL=`cS3n2EGb}qlz z;Xc*Xk`V%hL;0KGs7f|9+YVaA=gN%Xq7sYMQ3%0BV(0rdAZn6w5}arz=ZfQgS#}-9 z|7bv|e<*?K5sm`#vL&?Eq9{&IajPlxiZf$U_xh|UL;!QR{{esg6c#l+VZz$sE3EC7 z>%s)qEUs6hne?R0A?o{gcxY~t$BBR9(^O@TG06Ui|2@E$e+}dMqbxk)jz~el$Jz?g zBAfwkMLHnDc&FuN{Z4pM;- z4kYB_j&dYp5iN5lN%%{yLHUJV=tfhbPYPW*xNSaMfdCSvw(+0z_TE=EPTj5lMd}*K z?_SZ#3ieFCv*scYYkYdItHOEgJ=^`&{pOqdaQ6dZ>qx@jjYz{1F@HsPm_S-ARRk`9_Wdo`t}3 zJ{j-mZ;(NXAW}8}43xfYME9KEz#q-#bevLiq1MQvSPJ_2#R9--u@U`(NIp4Vzd zN#yoLkeELaG_5_`c2+DJfurR5J|BNx7|(}YnZ`M>*Cz{urQk z%1nSHAGoXZ_msuSAeyYdnT+;)%;0Y6+|-N!+1k)dKR5lBHl;kOP;SCFf7sEDZQE3< zJNJW$Y8NzMZv*cr!+#$Gk`x`m8%eBYC)y1g<@lnm0Z>|8K!4D<_6ez|I3hLXr}BLF zC&7$6EVvUG&>W+0bZ=S5GZl}uX@$Zz4hvXi;i=XwLN2gDF9NOQrcZR*ZM_@5l`X71 zT_h}PDKrY8JL4ra(<;i9e=Ar;_?W``R|C50Z&bVCr9FsmVYp47_b=;OAnx6iWfn?} zL*n^HMrh`D)k#E0etcg+YA+)kk7Fqb^8L0ayw8ER^JZn{gmcL^31=st+2d{3B* zv$q9CN=sU12-|qne_svv_E`2zhGE8UE^Y)X#ULSM23;VPbLTV#g*wuiCyK-m-~%WG zdzamlLDn-r@VtA%Lq4c7QV7`(NMa$1&F3ZX^e52;K9Z7| zcrxEX!k#vGKQ_;MWR^E{$~VMkP4|fFw78Ym$XO~ZYL1Y~tL;_d)vi|WJ?Q{Mts_Pj z1Iq0V9#hwhQUam&@#qyC_FzP*FSrYn(;jaek2lt5e}6Su&TR1spu9ryrmhKgHlh4u z7=q+y^Nbw6QsG4NOllBa@)V!|shyCIF*NFT(uGvkGGPJ`W#Z9`{4axiae!ysRD&#w z-k`pf043LN<@ z!_0hte|B=PVB{P0B;cD0l29gax>uP{rFXS2VA(1}q<*qi6*MtGZ=j+M{1D6V5k}|> zTrFgqe}bd5mB<;43i zkiB1+uPsVs;#S)5{|j6k8l&8@sBDFfe;J{8-g3!Ko&pA$Dy)ONsEnb3Nd;oC4qi3v zpdw4ErrFPR@2aT6zrbA@Kg5|8WAj~d@wv^&u8^&774!y}|Djy!xZ}uMkTMp14&LVb zyq5<$kUx-@!@II5bqiE@Pm!>$ybH7P3NzXS>KuPjq}taVj43p%W; z;jpP@4eu-I?HAIe#wj0e63~D(dEu5b6V^G5bh1)}$&?P-qUP<0mOcqYg9}QK6DdY$ zgGqVgCJr1{ie*%%Z_}n&QK*=`e?+uc_hg%B)O07JFl0He5Jvz+K)b&|2Xs^+)L*+m zfOah;Tvu;G78L7ePo9;c5DVo#m-rrf)r&n>h121S!2gLoRGRBmH0pA3<1T>tcAMxv zOhI$&p~Y~=kH(p73_Z(8*%ofT-c%N$K`M=#!4%8N6svrL5=$_E28Is*z9SMvAb&1& zk&2ua96xHMvSM0}daD4B(1h|TPH>q+!~LdOi>?8*@%+u*!MfK3%5d-%UsFVE444{= zpUJLx5%RXY4%<^jqzvZ;u%^O`V_-fpi*yx{2dxu;M%Qr;@Ci0 zdT%3^NcR@)B6eq=;ts3faKa6}7akJysl4B?>jJ3nPW#*?>SD_ZwkEJTh9!Kxs-R>ZM-q)@jgov!`+0K0ja5|2Z0YB~Ei>TAIBHfh7 zs19=-l-OAvwJ!csVjyC+a6DKn=yT|Nc51_pmJl8qe6U@o-f3n5U$u?bjgCwo=vlJe z5R9_Bj%mNuY0uXHD1Uw75&TsE@da|!ls_bsSH76Z`Bn_e=~6Wgb;pO@=C5`3eG(Q7$be)Kz(C|?{?Z^B)NI8mOODZ1@GYI6BpK~);mZ3qrqQJ*{-T^ z7rnFgd6g`Qd13$BH4_B9L0CF>l(OX`qPF8{th9OO@PA+vd)Ji_14GSe{>U0yS1?HT zgSsh(ge0c$7x2ZZF9rt)@IlJs@JwXyXQ1bavV5hT*0@X8XILzE>TnDLYpI0kZhSR{ z$Mt2ZE9CVw*Js?o`AVI$7Z98-pinz%=_^@pI!H&mM9K@Jq(ksxxoeVl5B(KfIElzg zrS>2ITz}j1`9*cHY7sqJD4ca5DOaOXlN8>YvCblK5bFmm+2Ifo{`g*06AGK41kqHZ z6YYST#6J+8?t>hKQAvA6#FG3Q4B3CtEM9YJ7(CgY!I2%fy2?@Oq5@e=?j`?t%YLNF z^2kb*3gLL#`A+GS{#78*scJ(|1e3zx9Xbr}ihpgYIqgE}5HSCr-J!hjeaJEqAbJgc zNd-1e_ehX#tsbG84>_C8O_a6iFA^}8No>zdsOKP|5KryzS?tLy0uczg_%5^6M{_?} z{0{X67t}Ji3f?c7$)Xa|8PW@d3n}rL|5Sky<03b<<7n}K;WpIZe6tV64932H2Y?58 zS%1?e%MNLiDpq(m@)E3!{A2ZZIyIY868Q_i^*^|cV7YOKU0D9azvRrHk8_)s3!HM4Hw z2Dx^snsRK`>#;-#^gqS@Y(=@h`3xX4@1#t4jcF*kd2nrH!ZQAUiUbj!C1#Eb=`P-e6%>IE6VPv-mQ1W*jQi&l^k!Az_F ziQ1WQXgNZ{?h;=0v&CB%Zpgbsrx0mZp`A%}`f(bT?tra&W_;w3H zIfF`Vp|=8JoOfTkazV#$4@LO3lvjc7lYz1>u^*#@l)Ro3+ zq?5nZF&gOJ$P008a?B=XM|_ozSN4Q4J+Qm_r=!`>kmQb8ky+kSMcz05>ZCjJEfmy^DvzryBOkD*W)oJEY>2j*p`4@u2)afQr63lQj9TV_k zxPLq$soA)B9S_yhXn)&-fi6II@GAmqcp*0MU)P<(8~kZ*GGvE6Vu1waWQlPZkJ1;| z6dMN`!Qx}kCC0cTn@D=8BA7)RiRKHpj^HF%4+X5t+#Xv1pi}*e*v%eo^|B`2hMaIR*)qEI5^^S z=g3TsFJs7Wr_TxY25WA=ZE<<%c{T$?U2Bk5DmZeV*_?&@>w~DY;f@NN2}xM)-1aPD zlrgPz$8=1PntyRuT(x|8MqDW{i)*2VC|xtNeHr}!D^C!)eIG!xgxv%3e5gkuVDCA@ z{~4HttiK0|g*F%Zca}zihlEE;gg_*qV|((?G1Q9-z`$WRrFB&UQdik!EWesX15Ouz zd@0k(IPmw#KY4=ZJ*6{q5XIiRa(>7{rYaj`doRQL`F~zmQxmHSmo~lH=J$)Q7Tg!@ zs1Z`On2ZykwH z+cUyFk>m-gMHiPQEq$*N*}p<@YZ6OeCYN%6fmUN;z3Vq6?E->Y7* zncFMboEbA{$Y(zYNg+$8@~Bte;q+VqRKMq7iGKit@hkp2GtO3+smNN zB!7qmSr|jc36DC3Vaz$3{qxUd)Z_BSE8I!OGH$KpU)0zMdDt$cX>3-(KP}#K%bF-IMsswd2`GV0u4`a z=9PuudmnfgnYUoh>mv-ibsW|sVs8rv?&;>iaKlle?KGCOo>!kv=i_$gea8v{^r*8$ zuOiTlLFfd?;QJO}3T+>I;c!~Rd|qSHI`ODiT%N=rwKh3buE-RPjcb)hi677dqJNFP z$8Jz2$x*LX%J-zQN=jBuV~po@u#qPhQM79po&h-0vnwQ3-OQ>vbGs-mTG!HiZ^uT| zk5~8Lo(lU*52Yx#&lN8MSBJslU7>gEVWvzq@jQ7ttOP3|-@EXOg-s;5hlaIt|MJ6n zWUAXSy(N^pAoeI;JB6G}YTQ&8Rvsf-dgMm9l$xAc)rSNiJpJt(!*Gy$GrR;1l+LVps;8qpt+ z(?JSfmI_?w*!OY-;^!{KC&<*e>`RFdI=Jg@tlwFhWgY6UQyhVgJb)oeYSuXzijcwg zGtEDndEsrcL+cB)`QrZO4O*UNJTb-hhWF&QEVXkq4DrQm99b4|2<`r5-)=a*{>s{^ zjl&niTIcT{x5o=s0rmf#DSxED!J~YbzVkJjp6v~PxR6c$RBL>x!tE-Kc z%QbI{mNHMrbEY6*5*7b;pEY+Kf@U|9b|`kQs19mT<%{SqiZoSu5q|~H76%R43E%xF z39Vc`K&n0N*wGGbBfqZ1XvGs=uu)(@Vf;JiGoHT2?WS zM)4rScnUP8{0r6`flFew z$Vg9~?b;yC!(zx)m%*g@MBJjVM%_@9H69qLU{~m@Ge;8zR)IQFHmbR_EAURd+yk5O`aZpW`3A=wZDrmHK z`{P_LX@7Fe>D-dofxsNF6(g=>MO{z&ku>~)FHiB%K8!`glm0GHnU^IEfo(ZKZc==q z#lTf1EW{nA*D_Pjbo~|nTG38=PVjrJ5|c|O2*lXmx78pPw4%~yFq$MIG&YnglrW_O z23NrEr}nW)S}<3PUJ@iJ=W@!R`3NDE?V2bf5`T;ANn1*?>lw9-!)E&W`33hN>?5cV zr5mxFS{>LX(b&f5eMM2W}IB7emnJJ5FdFtx7f4$2nlKJW#U8D{JA)goU5 z0-B@!UCK~gP9F)s=Sa6j@8m%eB%ZnK4t=Q7nI=VKA-A)ipC%<&fOgb0MWk-`V)!K? zZN=H2uPGxZx{c8$X%V{O4??BK$XQLa%k;X|Zi06}40Rh;pR?J36{!f{jA}cNd4JXV z(Kk_#wd$%k#lFU7pVIYgyN_Uq#rs**0h6;^16aD_)cdxo6VPl%^@UzIc9E-|tROmO z$Uc<11NOWZye+y(QG%qLk#mM|SI4T@IA2vLV}*7z7z-ML$|Ge6Z36^DS#i;gdI=!o zd%?S0PJ@^3fS$NeCO~5Lkjz7Wzkjkg?i%*m{b4Hr;@ettLOQZbtJa+9f`5xhRi0EjX#GtvIV`A-Icpr9p&6g$6T06p?qO_n{G zLOtDJoo3qyeyo%#?hGc`G7+^Y*mi2w{OVf&>H?96F_rYTrtvB*)G^iROMh8Wc(Tk4 z*J(fN34!T_pv41JM+XzLu5}x!I<|0EobxZJ2vMYqn(bUfi>nE@h%yT54H7{Ge!sZm z+3_tp;^-wc^>Efo92)^@pYt9P&q8}d8Fuv7GM9wr16>z0jfb~wQuH?53JfI689;@a zb1gXwi#9~R&uM9PIb+@4tbguPB8`yZn4N?}=t_|&Y%8~kM9%actJcLZ<%ZHh?*Pxv z2Ti(Q&iagoF2el>Tg(|`HwohqQ{wiUH*tgrn+6r8K)%k(Q1|e=F=ixFwU4j)fKo|T*suJyf{xBjH-K1E`Repd})taY>SOQ zU7N#xR|L^6j~e&Z|E{F$JFD{=y=u$umdrHYCYj*C*hFlOm1UA}xQ)rv;k686rB=RY zZpZb-8h4*^yQ*ES9fV;Q>qrco%!I=tIA%(3+XchNToLX8iSpO2_&Qfra~LD2M?*Z{ zyo07YRfQ%e-mysLhkx%D5R^eCxOm-kE{Uz=FiaL+%P9Ok`Ru!#*Udsn-lG%2ZQv|E zso)j8BXfa|qqZZ%RF4x20R@|DM<}LncNR-Jt&sq#E0OW)VPKzLNd+Xkk&y-HjelaeSCrXz_SyZa{eP7w z3=BdEqHc{!6mIuAfcj?-6f~iRY6T0~@&nWxFxbM`i9NfkW~1IXY94cVcELGV7jEL zSx#=qz1B9YB(^3X-+I`^!)GMuz1p}c7Y*;At-aBm0xgpd@E;p`58gSO$A9Ku??Ogk zNErd2nB_D{VC8{yf!e*=1li!Aa3IkqHyG$8(KIj1uz$T7#9q#mVaHa@p)kCCU1Anpc~`-k;bb$aU-CN;3W>4pNrTDcy%s0-AC% zwT-l|?c^Kf%D>Ai+-C51$m3D+$pO`SE{2rKsGR?C8Z~x?nJ87%-zivFrOLS0Ijmp6 z>+!+Q!HxT^C_zrCjfEzl!DTLHvJ9VGL9s%#UINJ+l#BaA!}l z6zkXL9O1rRBh6YeNqTJ7$@GaosSFPungx^y@Oa^Tpp){)d%;l<$WQsI+_40Ou$>r* zSbwnp1hv^+BPoYUj}vC3so4Qsh<>n)-f)eKQOpzz6$KvzC?s&DY&bI z063II+63tOodc_E$FINL9ShcMkEi@(0zeRNY4o^mw){qKu8csf`*=RO!glq9qkl#j z<)<*#bufDwlYi?5eVRdF-*4w~cPht04;Zy7HfzCR$DAXW<%PgrKbjNgLVBnHc zuZj^@c*tLB-oEM;Lw0Z^j0Y(e#*#FJt;hBBrgI=o+Qoh&3w`NRhRq* z>9c}0c*{)V?sHp2%qI+K50YvD`2~Am;Jz*qySkPe#6NazFQFr&Jpo}EZ{8}Dax@CR z0YIOaPL}jy>J@K4ny}m7L`ZZM8hYPu`?PR+j`zuWJ#uk|i`H4Ik{8NK_kSx`C993; zC&#S25~yg=MdgfP*Hb5sP8V<*}P3!eM zV@MzctJRuEbNjC~r_{3)io@q$t$)T|0Z2RH3RcWa zy>T4ZiHe4h0LIf_N{(cct`dT6TMXs{2(jmy8U|dqXlwm6UVBb`d3IK>o08E-=p-)z z8;XUCytTummgJIuZP^E^_Z=!#xiyDD01Pm?B%`U!QK4s#J&90C#nMo3NK=e9R2fN! zzP)x)Q}sTT)_fS>j(^RLNoI3Bun){DHX4XHfSjKaXrW(7weutC*r-_KTAhSfKWWbn zvbYf*Y;(SuI@nIL@ms`<-JV!+-Y|BKhjUYNakZlhh%*gHrrEz@!Gl{SxEyFPaXf!= z$D|M&*%A5E=?E-NlT(NBKm>RVGXZtOLJmQz!)bbnYfuRi?tkM=KY3Wv;n6H(r0s$i z5V#$wz=bA>(Yo2uIR9ZT%RqkH2>sHQ6~SL?Dx_#Jp)P(IB>5HEtn&@LB2xt~=8TN| zpemRTTohAXUWDr~(Dv;Ta7x>15FkY90UQMt+IoIBNE>X&6gprWFg<5sZefqk3T8)|>=Lk%=JTRA>!oZ!$D z-a!m@CY|6i2VQ72=b`gOcAQqtK0S!I%X^feQBCWwnJ$*Y{j!qZE{_gcai8U_$1uNS z%`uLSvtP_1nfI8gBdMs^04(`ck12;>+d~gMI1?UE-G3Uom9tsr z`VH!2s)9xhJL>)49;%?-0uO&2<(QZXD_zLNisu?Wy!Lq!mQ30>>zHH3lN^!a8@gYR zWbT3>6{iu&eh5Q!6>MX|4W-5ly*9;SqtL;(EMFHhG`T7hpAg|)J0F6P5thc$_rTYL z$RD&?Xn!7pX$+)F#1x4z!0UAAgiQ#zC?Mg4CE0tkK!c*y~ubO$(3dN%hw_|gIp zLj2x9{a^zeR8=5xGy+*byKFknQ#iP8Lq>gQuQLDDMKr60DTMjayblNUA_}`-Fo*7q zV1F{U_MrUmVp(fU%t#YtPae~*g*j9A1e+ouOyjj-sqv^uqOD#<=u|#d8(FX6UCq-X zPT$pcY0JeliX?MAHvSqeq?+Djnvg8gQ1ptWeGq*enpn?S-EGaqL3DU{?udD3H^&_1 zSkSgu+c9ijA(?2Z(Us{|k3sY3xkA%K{(t=(ayd8a6rMWpF#NPBiTjR2ZD{R7G<~&(d}U(>RyMoE|HY_H3|X(>p*{DMlRtiSTI& z+hx;PsAb3!_mIh~Fj*W>P8s|RoY^v&6+AO)<-|wc=Cn6J(3%6hnd?`z)9o0-!++^E zlzZh6taxBr6jw^jYm42^34mt-8gV^%ecZJq7^&E zaZBCAcc;r6kZW5KW!p(Vi;=Oljf7S#+{8`N=vHI3P{$Io0Flc8vRb7-(bvAu&_X^l zr?MA=7OH{5vs};+ZeRuh#zsbv5PzUkB+=f;XeI;&(~mgl2WL5;!^f1Yg=Jnmqc+v2 zwDu{;9kxx_;Ttx8G@H$h96s%%)DUSB$zM@R=^eKwhC|J5%RdyI$bCP$+SNxCDD~~q+AAeJpg;7^a zZEW0f&($tEz77RKxk5oRd*7L*^jW(Nz}B zDd4AyN*o`4lco|Q$oF$7CfRuJUK&AAt91Imt2 z%OB7TL7C9<05Un_)kTN!4+YUIrPA)f=|$Q1oWC&e&aniu4SV7Y-HJCzajwL-a;&_x z)PlCTW4iNRx1u+qpAc1?Vk35%Ya$mH7Dmv`)($7GF;u#$1kiXtZhxt5X;0tRR5St8 zya{wH>iIW4Ytwl4s0Q=cVDh4-6y9Ew-HD>y7CCh`n=ZA33|hk$t$mpRH|s2-k3AUi zDt~k+Iam4{GgHy;Yh#j(c-cED@u92(9^78}8anR+!u-u&=EG(wuX}Bm9obBrv|iMT z-nEmDsNd;iRn#2UpnoMnsgl+0IW^c}s=JHoXX#j;v_Cz3YSwJa6%D}biK`f#sc7RxK zd!cwEa=fpQi7W`BpxwqOX=aO6Z>oFsnTg438Ohk*N#W^3aDSsp6LK}A?bRgPg+rUL zR7GJhPU4P2g*W)L##EoHxzv|KO`uDeLM*l+o zsRyO?r7^21k!r2^X6ywh#FB7?oN)nd*tURU_fzve{D0XP5Z!4(6w?B+_?6R2q6p`s zNG%W9N_V6P4kx8lk0Na$-^}aKB?z)I#19Ha-}fe{w)Q~C>3cjM$_=ST1o_`>!2;t} z9!0WcU)!|^2!^u%LbJOJ9yeOA9FZTUwM|Gs1^aMgfU?hAf{ujytF(vHUz8m{(*Efp zT}^mL}^-`Hr#B_Yt4#h?CSC3uC zUIoUF7d!>bc7Kd^MWvpfZ;tjyRR#ueD4un08TM!%tb2Jr?u}`$r836ow!Jmb>B`2G zz#i5ZAaa3NPky>mOWDP*o4dTdPt195BIK?pJ%7w~_2#f>iJ1oP|tX-b&vg8!`*HEkP)DIIive8ILr<@2mu#W_BhXVx7?58QuZ5dR3mv?4JCi$ z_f-|VU;%($8*w5CZK9=-ar3J%VRrQeZh=J0AGEcFtbm9pf$wLR5+v;8KB3$v)ql+M z8fNj3T0YprW*8^yz4n?LSY#|aO~m-#2$}lG3ghJS9o{}@w~8+XFHZNCWz(GD4@D3~BjswWnu>m$N}bEQT7PO;E%lbXG+18(hNd{%`4&3n48{gHHT_ehCUGEm z-_XU~?BOU?g$nro_LfU=g2!&cPj)!>Ftz`z+4!xDcv>G8Qm11_bee3_ild}zo)i*U zb=+SJ<)d4aii0T-2mUlbQLftvt9xYiV~#`Osb7%TKb@#DBDGV`o2Y zDWrLQOomdfz3;#4tA!U(sp-6uR%L;d0ui_isZ%WsIncf{!7YY6E_RV!W)+NHl*;_~ zEVJnG*Wa`qI==eX^qUr(%uX}QdtdBvC5pgzCdr-`QX19J(1+J|w-TQZ1@=mL5UQFW zdKiJg3s$TKVQKm%BXavQDbG90KsFh5x7dQm#K#7}iTaGi=0j{v8U%Gai{l57sgYn2ch}wMi zGAJfBNI7unC$M%`=YAH!jy~qRlfrfbJ*qj32cO&f@Sj|Y>H9~G_kX@^wL(P3m-sfY zM`Y}6@nLceLs`4CgGW5|@Va`##Rid2Z*vpU=sU|gWIi}0@?&8kf3q?+cXA_}sIts+ zB~4h&^!3wnT#lGr0m62{{&X7zAV$konr$GVFFN$|-LKTJmMEGeL*vvIqM6x1LLU0) zBuVr^&K@q-I-z>5X@7$(G$cVx_71DXt=!W;c^A!9i5qE#p5fJHN9@DuCyOck201X7 z&f@>+q`Q_A$B;pEI*+2j))=3EP=RI@-_ie5O1Hv>wA@_LOpK1QmMF{l@xn!^dRUi2 z=yvS7uLj1K9fxn|dzZ9Hn>{TAXIo|YC`fvOcufY=Gh;Pps(%wR1vI$c31lrfyX1a) zK`&MB3UZGVFruQ%YeXfMjBXj|g*8)pwCn(Q>o&`Ke7;bweW}5k6-3R?%Hjh+oV)>K zsXhA^S03yQH=*e_m^2qzUMWAxee6iapUnE# zxWv(kX!BK+?0@G6Ll-HeD67R$C=(O8#l*jsg`2crBOB{Qd@ShRxyFnqeEWjbPqDP% zW1xGw81YL*(nNEHrwKPsxL>!8L-68`zTJAP=m`1>y{;$cBhEeNS*Qj%m}0 z=9?5<3)J`xcN@ii2rmYyY9WHo=wehL6G*KBVL*DkExMDPV$WGVF0nOjfVH%BmW{#IE_CH*kBYo+(On30 z-;XyKqvnvv9QMqoX|46Q&~eTi@YiEUXd<}4t_6`MfY~pkln6pm!yui!wmSf z*nuIi@_#R?tw^LEYV=T5WM2l8M`UD1bF}$tc!}xA7ZsYzs+adS z`h3bwKc*I?d2GF8=1BiUqSxc`%(lDZB!5*=>pJGk;Qw3cHn~xP-A2CW-=mWKlFB;# zLw|Bh`tTH4E6s2`Q^y|vx32!VA2=Z3HEW0GQm_i>pX@BagBM2`U0gj+Nq#z@yzdgA zTCMO9teZGh7NNxlUULfKUwX(?4(^@fXJAC=Po`_b2Q5C#NJ{Gjw@mg}c&%K8699$@ zgpoB%vA|$c$@~<>;Iv~1^aph6>i6;nxPM}ae2Iync8K~!k*;Cmob*=dvq>}+273dK z1GM`Gm)2w-~UPp4M&So-IfqfyGk)=T|%dbqx%YTNf z>bS1J5mN{4S|7A%K+N?kHhUcG)O{WWQt<>$Rd`|1nQ_Xb0Gf$WHGwggzojWwF!4#O zBeg*_Ce|f?@SI1CE?HA%I60e>V=9YVwC$2PWB9S8KSWCfb|5xlR^?ZAEUCRy_1 zu4j-}#t!i&?$+et!g1_;++xDZ8!H`y%(wMX9ze;c_yq02-U6-RG7i)hwAOFWCE6xB zOrQ8thMJv)i7xpLnoQQU;%}<6LAG~_8SL2Nl~!KK+Z(fFH8zsgfRTu;?|&LFDf+ea z2Ep7JZad5NdGmK# z4mmjKZ)<#B^*I_WC`-DqbEB06D`>|gMM!EEbdHkvMutnB9nz=KlsQ{-CphyRBcxR% zgb#NQCRD-c?0yS6$)H`%mlzynEAGg$JlMt^Xa*g^m>{CgCg zuSC8Lu?c1eyKmE$AwaD__$zfE4vY}cb`_csY)&g&VAMZ;q@l&o4YCi=U?~*gtgi(4 z?#@w)&yZzr$S$Ns!szP^CCxip6<}%Zn!EDi2L{;2|B;aeEM+0;yhe+#0U}}Z#M}Sep+k8q-Uczz20VLZG*Z0HQQ1rGZO+1kQyhY?Jm zZbpzJ+XoV~vD-z9R6P|e8#}X)olAcgV;7vbVLLKmORTg`uEG0sCp3TL}uOuW>)7y zt5)lpE>tl~dq28{qkIkYMXP-frqb6~8b75z9+}|074t(S@nJSjH6*ztYB5yL9hD92 zo=9zf^q+lC8-MTQQ;<%}LFKHD)>_uDYSIT|x-U$cMr^M-5vUV5pq9cW(K-^nE-gbLw) zZMUg`b3peHvG4!zF3*9I)cssV(f;=}P_399mP+GHCw~cj3V_;lTG<;j`z>Na5nc{P zTH}ic%J6nq4m_e!HZn$Rfv}jfy-znaAXLeUD@)v}50rTsjkhE6`>^FRIc~6`iowak zsW}6fwKHD8f!+Z`3NL#4p?v&NFHK^H>Hox&V*ERx)^7?d_crP+7 z(?u^u)_)m`BN$&uiSRHxVg;?NpGo{SqC#-_NTPa&vk&u&WDxO)05BGFE|+bWAATx>jt$JnNC;dcB?<}VF;lYgkMMnph5q5;mGWUcs(YyqQjmMxMQ zgYHVL9gQ;!%Cl`wO`pggjfu3xnt9g~+^rS^07KUV4udGVUdeZ>0=Y>(_o6M38d|$l z2?lJhI`pJvkjctxMSJZrnjlXsNpL?U62&z1>wVjP77S)+N#%`5AxU4KHy)<mybf)*%pJ3knXO5~EbU?&j zrb`$8$}eBBQgtP;9mlLpzTZSjMt|uf@!*w4iF`*d+9r`vtP%L=OjhnWdF$DqTB?G5 z%_3X%XI59N1uY;pt!lZb3hm5FDxl;D-Yz=<9@~rtcblk7O395*_Y4VpnQb7yO|tZF zqhh}Vj3eO6HG?@xUlB9NgNyBr|C8xa>~hn>3_rpxuzzw_{ff?S zY8ULwIajn3>PjCJ=y!><+qVOh6a?iDf78+H|Mta;S&p&R+{cjC_I(FQ^i#p3*uQ-$ z?>l8;qsp@O)KNVW=QrRaeW^G1_w6@XJyFr0CGcU?@dPt_=Q0hL%PcIq3+PH-5SbQ! z1qwm=@m?-IYpM-VdA8S{sDCdhw)mCo4e(^EWoc0^eYrnrYMU@LB!I2d{dn7wz&aEJ z$F{t&Akt_7Cxyn&(WwbP76}6phxlpy?w_V%#YAiXvD~s@q^2~o_iBH{y?k19^<$Jp zm?XHm7eh2(m)2MC!+jYemuw{d6WPmO%{{GMn{eOBs=7L7hmvMqyMKz6>Y+7nx!Jte zC3&d7AaS*n#NTeXDhrW{CJwuE!~((YP8IwEI~t|t#omZ|v< z$|Z%VnOjf{6G9uqNPpIPVP*~W6Te_XiMDMCp+{ut10~scxWC)?ziaY3M_Y&!qiwo%H@mR8x0;b#h(_3^e95d zuF^B9=3rp?l)d(h1~4|1sV*5#&5bph7Me~y5m^K@Dd)(O!zS1<^sAggI=B%pQ*a)C zJ*^HzLpF60mVW^$7o;v)G`_QEI_gkus$1%@eU=@RSTUduKZ&A1RN~O7PDc~7q)|*V zE@*gk3WH88+9l$gW{G{?i(lrPw}J;QU>FIfmfMG}vG%o_TZdY~nGud~5KGQ5v*CPH z0NaxWm%P1QKB#ZnuEf9<6qxx_B`q0^gfPQ_+VFHUG=H6Jsz8QBBaqv5z6VDFH4)6x zT?ebtn;kV_%LcHjKMu8H9z(>Tv_T2Nic$NibxcBro@+QC3D3i&Y8042&yOukc9)@yxu3BXi5N(11)6duwU{y zFw1VEpIZ?MD`X^0mSrt~+SNuXQeXwF>uHV4eF+J@+Q`eUB=h`{{Ta?wu02aR+YM9- zLMp*IJ4o)|w{xuRduX|}A)Vz7jC)z$z?SdtC4V~$m6y&pB+2P7 zm``15=z{2{yFi|wm{3wu&wKg9k>N1KuJe$haj-CMRH1x!4e6(|6N<3NXV+N{JtD?E z$PrcymM)S(R$^$|Gv<8A#aV~Rp0CJxLwY=K5^or9)YwSvP4_WU?Hh*z*!ZEft`^XQ z6o0DG|C6Wq=O2JvykG2*_kB6y2nc>$;{g-ysT>&W#Y^j_Bz0@S9wNti(bm&lDW3Zb zo{dTc-~O+>7DTQIpEmOWwo3==p;2tS4ro$sRM542b*CMy7@tzrad5VCk;rfIm%Rk^ zMpuMzhQ`I%q>3rYq~BML%)0pxD%HR0w|^VO6s}esHt3HzV#=+XX$dSlPFx&MIA0*Pd0+$OgI&ox-sr^=5=HiEq0*DWk=_!PoXcQWM zD6$bltKyOj3KKtWspO1{xl7oDXMcG)t?`jlxI%{p6)jFYGkZH>-VuY5+OL~#B~}27 z2ZD&f+;=AhmI80daK&rLxoTxdQqv{>CbZ`4JreLx(o+RI4f9I=Sc`gB0PMKF}r|8wl$Wf7f`ac{=r%Hr`g$idvZW8?`N%2d-{keUAo%V+5W(vS;mG+yjUPX5{ zWhUXXSmF?vb`=ccS%*4HFn`ZJipQ}>Ey#edslyF-Y95=pGmE*a>*g6w)lrY4_m3jx zy?1{f!+-<^nV=smMBRt}VOqw|oY8G7AnVZhv@qN2=V$$?%=m*0>wfWc(W-NmNt-0} z7XLrbNMtKHk%%;Pr!o`sq zQk1DzwgOmmw}c~16K5N{?zM_?(aXxhxTmJ^G$VJ<1)AN>W>3T*#b5rM#yGB!fyoU7F7k04q#!n?th=L0y7l8gh8+aG6u!h z5YM_mnpF2HwPfdUcIvbP7)bP@f+<@0YXIOn=>TWn1gT{nZLS1w3Ck z41_&;!5OF`(H$Z!nubK8ta{*G<(-U*hAwz!TQtdr9f4aX5v$I;@%SmB=RQo)1S&06 z#4E51?NIFQP=D~UjZ9=8^~f;~;ft$8@#0?o%~+ZdX7E2Tml1n(*2_)b*MWaB*jT_h zx77avwT{YxzX9sjmo%N5Fd1)NXX(MK0VDdPI=Ri&(+GY>~GNgV99@hY=YNE_nc&6S9P_u(V<>VKp&a}2ts@gm?V`H2&&sBLC< zQ9*C}>8JPdNWFjFSD0iXV;5|f;D-moI(j-dy5iKA0RCHdPZd!p=4*pFkyj4Jnv;d- zex(D~+eZtCAW59WARlz0C08&IaazzQYU<+Gt`Lvu(4%f2iIVg^BZ5`^_IIzXrF|Ve zRcZuWFn=SVD33HecOF7eG3;-jBUd0^Oo@rzs!Tj{wyDe^H6ZonAM+V=EkjVVwSqF+ z&Ctef+|t;0`}ao)e<6#>$no_|!i_K;TMlqM)cZX{<6M6t(5VfHq{X@*sy!5>AoLli z-MvJ1SSH?5N2QKZ?%e=ER-bU76GCEhnK-Wkt$&GGR;}r>vI-}qIM>)yx8H7g`4&pV z7MV86AxT?vNjdZsQ&VWuNbM$x?Ov-ouf+EuWNy;eW-#nqqHa(EZ_$nRlf-(-+>ANJ z4}hp6n-yFirV$MQML@d0LnOQ1v0jSz0tkw_$t8sy^lfkZI`?hwc^_QWK|V=(8lZKu z&MlOc-9LX3Lfb|xQEa(L83s0Kn=w7e0wNc*i@gzcmKqS|&QpBgF!}t(FSa~UQxf>} z$OYRpK(WgYBNz5i#=3&`)M3ZQF(&1iXE~GHu{;0Gc$=5pB}F+I zF_!6YTcK9}uZR+ct+RiQa>!?GTE+{v3BC7(zLbiDS5(`1 zW=>@}sxuwp*ub|TGG7n%@Cb38i@RIB&jEoC%#{h}pP9##@|_iYnEbnr4UU*zZ0kZT4 zTHc|~m?r7;f>1-|!vM-`zTyPmSFe=weqedHuAe>%*||*{j3Y@gF@A}r+Aq@W-aI4T zbmL=Y^!57dl6lnae?{10xt_qr=Dr*;DNcWoMaJyPPS;*_Pn}zr8nMtCZxl@S&@<92 zbI-7Gk8Hp=`p9}AOw*Dm8K~8G^CcE;7GmQc12QQFr$<_=4nU96UGBQG&eaTm0JyR7 zv-h@F{0yQ9>K+9MEi#(5(XX|{>KF*@Z2uQ4OznXodI-$Jo^!&~V#4m|E8K4y# zD2!wX#i%+!I9TNQrrT&eSoOEo0;qp5P#~4tUfDbXRP{`k&9Fhxav@Ah;T92IE34rj z>?-+3gU&uN83C0;irO~u$>WGs`(dU56A8=}+(8kUkQ zZU0PxGRGG29>&sv$B;h~piX}>o_@zg()Q!v-;mqO{*F0u)ev>pAI0iX9{BN=yClG7V+B{&%;z)f z9f5?aoKOf%j5+2Vzh%_Y%w@L~AUjF9KMatnqQ^%hcuy!5rxHv1ZybN_I?Vsr4Hh20 zO;J6i`gsE0f`&pqFm2*)0y#1Bc3#nh`dZ9CtxqcfN885-Ju+y&%9Rdbe67#@so1Pa z2|RD%xqI|J;ah3x2s=nF8mxxD{hf%m7K9Kob( zPd>TcAbLhs%d5~!6#qz-se>*^6kH@G>C*e%y+%yKg7@c!uz25V28le~ppv50+-V7W ze41icU5Inq$&o%|@r@q-gXdXsrf$}*$ZoMAfiIuS} zL@HK|3IeDnX@)7rf;soXW;tp*9{(?`>SvJo#hf_(8o^;mNuwvWzPISSors`Ywt}3- zzk(};_u^4C`eslOetcQfW;c#OlKbX-LC13*m%a6>**W+!jZAr)<{>X0y^z79CW&2j zy=(CRyrX}M9Z`Xk;lheChq&Qi+?Xc`xUBhvHW8BvlVi)0|g0aP{zavx#(Qg`0`>ja73w zm(zcFkz{fjN6j3AfNv-`HaYYa4L8F5fAfd_P%RR`C|L|n0LB4290c+KEJi-p{MA!YVM^7j=zYahb%G!iIJOjxx>E@@a!1eo1&-uig162?im3ZjCW0O7pg`ek}e{do-WNVgs-F%_IR%JV!B@^D z5sV(Q(1Yx;VgkS)`{j+;ulMGZ@M9$4v zmums_4AH2?eVkDv79$)M$!P6h0RMH${)4SfgcRaJIuzBHtxFNATeh8s_+B>Feg3Ds&Nr3G5J9zhG?7D-B}rrk>e+2QWP>VOzc5f>uYn#? zaEb0I7(2$e>NQ{+WU$`cPy0eYG+M3$^q3LD688q(IiR)!Q3{VF{%xK3TszPAcUAvV zub_FSA-jW8kvcY}Rrz z2Nbk6ovQOKhE|z4@D9@ao=eAEooT<)-(0yfTrL}#BUG+w7efY3kIhAJghfMKY8rd+ zM}Z&|N5D)tuqH}ytE#XTNlL~VB;n_rurl3y8%f*ed&Ot3Zlx})4d|sIN;n6HvXDqLdA8-ab+abdX?r#byo+6j#X)U2-y{Fopnb!eokti51-+ zE^A$Xf0urw`5x8k5e9;n;=)S8G*mQ5hrh=RgzFPuo z2lWsF-PV6&j)!GNv-Y~_F+g(w;EI1k+azSV28_VuPw<Z-oB zdTaAY*?skt<1-6YYZLN%$Aiv>TLPdtCsuQnB$MOJ4ez9;nkGx#%!0yyJM@9)nTy6O zP!H;JnXS}Rcq^t$!H4UGCZ2UyfVP19+z_lU8H#_UAwzMfL1-oj1-AykLZ?FV-mu#i zcifmPDdxo*F>w=o-m*30FRII_fN>-Muh0JO9X89q^C9+laGE zdCwJOp56vtImZ)J-50S|rH+pyd5%}ikbk*_uoo<0PMN5*J~&zFF|pMRw70H*6+?EzY0N<4`p3@*-j!@GY0YPcCrv?eGg2y;)q&y9cSpvsim~5g{E!I#zPCF7}DB;BBHjqsLg)ncP*?nM`!+XVILgX$^n; zuA&+rSsPbGuHy}UC>$CZL7{C_hHlpk^jHI6(EmUvb>ayH779ko6}C?H!6kE1i#JVl z7+^R)0$fxAxGfg2uO>jxVW8JuM|)wX@h)+psA!`;?i zz2{FrTr{X}C&FX^{pSE*4J&O^CM16bfg_77SO3F+#s38%&b`~6i=LUbH-}f3EzBK> z0KC_C07;2)Hz-W>F-?z!0X6L#S58{RhVzo0*aGfhGIAAwkX>!fX*YkaYNi;M zxn5*Z&GYYsymx-}u9Vc5Kml0Q|IKlg71!~_XhJ&6EE@ejdWG9ZMp7pv#cWCwocZgg z&Zq5IKSu87Yga0^AhH_HPepz=X^p#$dN0^(F0`n@NMb3rQg$Hi8g!@5u$4(Ob+1M! znn~$CF{rQvRULHRoG>c>II@4P4f6?QnX#^gG_ca1tq(7|29=CChHP~@(R6lP?*)W)sj1@WV%y{DF~d}z zb3(`568REK+*O={sdLyeDwkP~ONm#?Ws|Khm>>)>JY|?LG+#MIv2M7W4)ow7UKwX$=M}5%&%lr*n`hzNU6JY zpcAj84bAeQhM5$5b~Q~ysc!Ybt_)VA#sMDRbE9&-{rvc**ekGin;^ET#pgAXx6!U% z&hxuZTlagQt9}I>=rZnGf@0tFouX(bpANd3^<>A`mZW$ersIS9gQYM6q8(EpUIC`*paJRjKUzqntE3G(m5+)=zSeN2T>YeI zYO~sL-K3@tHabVjiGWKqVL~|JWn#B+5|Q>|g0}iO zh)#OC&Jof`I)Q&R8ns5KK}}~fZia|-O*Hg=ba$1Qsy9btg9~%aPGAnUQG)g} zY;r{ZfG?$fONF%!S}Tr`BacGX4ECcHJ0NilK>HOi{;z+DM^Fg|0qTQN*d9rYihay} zL4A-aSS$mqxajBo%9AKBw)Tg;i--pRHOKS`R5?zJG|4(dudJ%fAoXNG-1pUv5_76@ z4E&i`;VSx(Q^1q?Z&c;dfPuKhTF+1BLs&JOEHBsKK-XhS%u9Q$V$7gt(oQS-)h{8l z|3Lg+Rq=nKRj9M{Glxa`f%fx1qXBJ(<4Xv{GPuBA(xFTx@Ma)l`We2p@rvsD;8=Sz zL0UV#1+k+XKe0iipw(gHW{Z-X?>YIC+M&h7huTp@%e>0lBUD) zDQ?T^NSXi>7g1PTc~w6_d-9D6XB1_?SHF6c)gS}9u{o$(8Y7?saJCV14?UtpEViZ- zGi87LNY9S<+Ui+_Jaw({f2S{LMXo6MlD8D>v48=3Fy#(@%T(z+Yo9R{+p5WX1sUk( zH<2otd0WnhFbjB)*1+=H6e}yeFDJ=0LJZB(-oKB}ow2^5wklQFm^kG<`Y7N9TJG-6 z5XBI6v(C%Q>4Z-6VBFd>t>8|dxVzYh)>(gl-7s4L86b40YU=}Ru9z{@U!+rIYg)B+ zI`Bd$F6g=Z%8Mh#V z5_k!nllBo0{_4ri@i>A&1?Jfy-jEyWJCu}dS5Yv56!ZDtUu`ewAAjop(>i- ziN2otu2BqX^h1{E4&D$$GsGPSO_F~+; zog<%k(&&(_3x3({GVOj~A?fRb! zzPwvke5n!?QJqm4%kBH?p9O#8L6TT|M1`&D+cd3>v)c<-dt%z(wjV6;dgJi2$L!$L z^LK_iVj^v+Y78=aO+#gHGLQ#8`t^BxNs+yX0uACdC_F}uNs$DijLCMl+pLYaXI-u_az2a(j}t(`&AA;*UTOyqxVTP#R7`w~P+ z(1#Bo6t*9rbf=ba;DxdKctMS$b20LfYkO>AYM4qBt3(PEwPm(|Og8Ws+CNAGUxD|^ z5g0_#XtoW%D#wi;JXU+6J*tG{et?Ri!vurDpEnzzr>^FF=)SNZG(S=D0@BHqhLk}P z)|0?pfc3s(!;XLnvHpK!jQnmAQoHMehdz8Qy;HQSgFErV$>$W`?FX6vao-`am50?( zfv+L@RNhONR@OMn#2KBQ_pXO7z_NvT+#DGYAV}SATVwwSST>MaSV1sT!=`oX(oloA z&=&8~|IX$KBPOEAvpN{`=Dr6LcG{V6S zevGJ!OyLHqP;F7J(qyVZzW^uIG-T&9>s$0ahZH7&;k#<06=}6gcce-R zz^GZUCql8zKV*>#kQsQpeXb60R;AzD zr*oTzu|tfYRug}tcnJ!=P!>AbyxOCVZ&c|2rt0JWFTUN(Hst&)pQRnRU>&_JtG1T+Br3=TWyyC_e7;EI!ue}E}-b+R3m z7fWN#Rcmm;uwnkeI&~=(&^^RQ@StUM5nDu=W>P&_+rOO{Ct*wGe^0Mqt&X2{3fXcx zumZSEXHb7dk5^J__4l3~swV1VYw!>qm81Snxq{+8k9phq_sSgw=wap$hi$~Y`9kbu zKWP)6LNNj4@JU!G)&5p%+2@Lmu9jLI?gRC;uz9-6rZHH@t;%!<2 zty^U@Es1AZhp8$FZj~=nwz)M}=qh;=p3pj5=(T?+HcBapw%_J$Qv9@(Udum&C!cNK zz@nW&etmLOvu?FSVHQP``tCyaQEf0nDJk}}sOS&Kgov6K{2iLa2MgbE8S~~@us%Xw zn-xHW`n7=ZZO4kw6#RC)_~E?56N$R{c3P_Z_{yS&kGgHX7kh)l$Z}aPz(Bls99TpfsXhF=%{EA=-D9KX(R$ip;`wvXhbEf{4~am!R&Npa$v- zKdCPp_s7o^FJXzO)lh0Q>OAC0v*~l8pSyo`{zREB*X*HL^ol%fYx*^+nx0!~KO;Sy zd;(O|^SWVa*PBhNROiwlRQMiwm%}$l*k#q3_fDp_9ypr zO@Iris(Kl9|2F!XATi}Ex^)0l#HG_;u_pL9pd#5oavwUqFrh|jsK{4Ly6vq`6CeDY zpxG@QUIr(dxI)auKEL(L$CHGP03Uw_sHaAR7ET$1tbxjf9ShLV&MUg7gNn;s+PDCa< zg2OTwc-fgGaSBl-0SS(A@DyLfwI0rm)o1xqbG1RZm)?^lkQ1&mnHb z_}c&u6!C_R@E=jog(!zpMP~;Jg@vu>1~m~2Aqqq1h&Gig<({yfU{m_z=TsKe4}2k; z^$IE0PK5#IX>YEKkm7_|=--rs^kE*4!Qwik$f5kZ@yi;mHJ1XeUF=v$_k+F`B{$vq33L{e#ka%DJxVlo zJvYpEa63JdC%7{#v*5X2Db9bSN-n-{FFDP%qeu6d@Sel6=jh3gEx~_}X`Pwu=fd=J zbCXaaYtT@Q8-4{Obtp%mGuV9lIOjk;ag*0D#Vo}Q9H_9U1j*Ku#`a^QmSX>+mpo;! z9X}vL)H!D9uoJt6=Xf_NCJfbAzXFoIM*w1JD&?ZACx!(GhSAOL3CE9yVL6y4%o+Ux zFktGA)P+*pBn5~%ATyL*jUP@&r z36*>R-IKu23bcF7^=E4qd<<9{9#tZ{G794AzMsmqrc;5g?vJte$$jRBS8c-O(7|~= zzU&b>qIy(S!+qm{;YVrBNXvpc3}^b4Woko&D{5o6_rN)O?9YE=G~SV=ZqcWz8ZP@# zYlPxIM%ONQ7=vrHc4VIzq^SQ12WNxb?^J(?Q(u3CjM&a2z+N$a+x~>Me81PHseiKA zdg7sVE82MDQD zG%5v-vWBw+*vx*`) zU$*Y~_<_d-|5Sh?95$l71)z5w?Fu43bs)fCY`ck^?mFN9>62VJ35j>FfJ?kqz3?3w zr*;G)4iG?sp=)}@zgyULl;_WQmdW+ zU4(@fAFH*`o8JU`d@aalUubMmK0+5~lj7M1x{?L}xW(V0)1=B~^t)W1n&n|>_Nfx} z^W^PIm|=fWy=_KSvCqKVEAwg;$wv;8g+z$%F|xn@Y+5rkBfrLq%dzbZsKF0yQg`x% zs4U4aW66a?;UDh-Ef$QBzG*l_#sNbVAQ?+Qjov1CN~Q8j03MeT5gR+`aBy;igWc z`k0Tpt#aZ2p{@&9PuJ^Mk%dbBx`*tqXGkY;DpB}DdvySu_ChvID3UYY&SV>woB$ONLH-PLuC4WpUx5n{J&vo@+Vk0<2JJE5H~YBY_^kkkWe< z$@_m!2YG;Pv1QWVxjudAtW6OiG{+5Y9V>`~JzTO``rb#(h2v7%C`Iz}&djJC#RL9D z80<$Ue^VNygbV+)t@I~VUsNmon$B97J-htm3`s*;D%BVq!&@9mCP5N+$%>rQ!wQ zdx8Rkw?+mKS^p02IpqIbW3q(v(lP}T5^HEU5x9z4MD+EGIOQ6&&Di{-`n(06$ku0yiyeArosv(HiETu)$ zOK#cefqK-;prAb_Qog>>;jCQ>aGEt6VN2;gb}tjX6vFW*Biutp1MRgmL_2Xs;Kf|4TDU%5`?h&eV4f%Keg9ADoJNDyk2ii41dLX(m^omCd`l zw{XVOLp|6<*d1&zw^r9lOuK)=75D|0>^K`=V%BOh>9YL*Np#M`w~Q|;^P_DD;6iSpqIHr1F1`S?S|Zt2Yop!(`IfYhh#J}7()1X$ z(6Pp&nuGNj9EqWs2!8%{atG`L*h88!ynUHIBF~e5?GGuryVVXbw+zDhfqZj(QI zd-DC&x>(3Dbk}JS`(JIo=Bj;0{eGJ9uGtt&?L+U|y8@5TiG(^}X1{?(+49(EQ9?kA z{`8+4+ahSy%o&|)j0CHZEpM5Nl4bU-&v4LNZEPxoP?=tith#?z2VNx-CoAB!E@@hR zEP$Bm3b3+#$IseXI1m!EBHv+Sp*CRYIxpF;J=-;i?wf|BGHn}BUblL_6sUUP5xKB? z_0Ym^tu%tgR38Tyel%IMlEKw8NyrYL;fL5N+Em8ZWxjl zjPc3j;mhXvp=p1C%Hd1k&4{l1uNjyWfz|FW&nN9j^r%?W*J;m)D*+B9IUpYFs_{A^ zsbs-2kM2_Lbq1O+J&nx>bzUz!gxqAeh}wMAETMn<48*{?Fr{`lGKbTvgv?88_0-QX|tLuLCux-)D zqRDd2Ccf?;M{4Y3S6dm;9Nry1cv}a5A@S@tv{svzImv$H3DuyMP+whc>@9|9s*#l( zc1oK#MizUC8NGw`2tkYjm9i>w&W9hNVJ=57Q41$BH>bzr4gBT68SQJu@t`TR0en+P zPI9%$lYW2bvQz%&h<<~cU(FaUU8~21zSRBdK|!`0c0D(tDHJh1j+=ZUdC;@g#Kxu* z-rl8wyz;&IiA34p2@`v&m(3}G)xOb=0(aV4!a$SHI|x@iOWTTm!mD`RSws0&alQ`t z#uFnEqNcSWj~T8SiCtDK_>jTII0Fe2GU&j1?^J(2I;;*Ry?%~&h$wl18MD^zu;YJAl5?@ zqK@J25F==jp_|uPYIzU|BErzemNCh@u-6OlXLvaMm8ydimD0NRbg*1y zu1|kTN@%Imu9SnqN4|YF&)QkEnvj&Gkii}m8T@V8NnD`P2`OV|0ohm~zWW7>8BmWR zQu4NoCZ@a402i=Y^bRARSK7Hp9Va{n!*lEzJT>Zg)DQ>x4M^?H*fLlGPhLk$QgZa0 z=$BBt+I#cC)Waw$9f~<+%P(vziD5M>`R{+Kb^Aj(a=|iudmX95c%mzAWEp5IcUIhV z9>MpXTpFqXIIHmBc~{7$lx-kP$aPza>#@VWUoP;j!`(M#fBR7br7F`J-4~QELC67M zt2ujg5?thEKD&Z0>;3)mD@gO%(Fi`>N)%%ca(CY@K%-#~l7O3cx;|O2z2`g-37&tC zm{pj;IR~7i-F)cVUJ`~0EK(jtlDX_k{mDtw)cCmFtT5U*Y=gShw2i_g%ww62r)J6O z3SG+3JvStZA0hl($KTXv(!1(X04)-uj2RnIA5SsL)=mE+$!hxE_p#~8(#Z7|G|PQ3 zbWdA62_~^}uCA}?1nlocI74+BYq5XMs~@*Ulz4&+1J~k=Q_f7r)S^*fdQ_XyJ~C{R zeM1BW>7`$#Ga?uib6UUmY7o2D7>uYE{&r#xlKv-E?DOGrU8^>}QNT#;8|7~owpRNs z9ogP(E(4B^1+InFPHj2Md!kErcP@yJrLzF&42pmAL#?jpWs4&hrB%+!T3Ua5&IG}3 z0rzf_$kkBvZ==RtjEVfN?F%%zu2~eeQBfi%l?(%Vw#3?hqzq}r6ks_ALAht-VNTvF zkY!7fNC$QyZ&Z7M zM%$J`M%->E2rXQzN*sy)hx>oxuWp&FO6W8Or6&pZEHC!b_`rKneKHZ5Q_so80Vq0Kd*nZp40U6>5dDH z(ZScNbC+DDE>7S*eS<8jy=&$!HVGYAD3{xnOM(k~WF0z+4SO>CXkz zn%lSw93w*U)`pzxLzdb3d_CgasUk3 zmQCKq2P`R z3;k{dgmG(`D4wr*OG4<)WyYVAO(I|DbQ$&VDdJ6Ls;l*Maf2a=-it0HBgu-ZSvft7 z!gKaXE!;zG7|ef_@nfVEkY%!>ty2QHXYkHFcFD3&Cy&j=hi0>UoA2NW?Qw0&(;aai z;c>wf&_^I7$~*7wy6sCK81TE-d@wux3XlHT1OvdGbI@<^RvTvrgjR>2xgQ~VOf?SJ zmwo0K3BG@#K=8Cq`F8vVyRJ~t+@AZpP*n^4L36kYvn79lS?Z(D87tER>&TH1PV>uH zmxi%9fC4l(EYo{&QN3^f&OH2H_U($k9!Sx^IlhVi)@v!oo{m%iWy?bHITtY*7 z`V1?t;S_(%W6D^f0xMqG6Vj>_{4=gZ%rQXdAl|)SqR!-0OhYE7JB)QlZE}z&K zFI6}Zm~JkGI*O8iU4RBT38wbmeZ?qU7g(RKkS;17PO=+5%c(9**UGAYpGVaKk{{Gv z1&uvBsiiM`lA0X6E)Q)-znb?Lo7yiEQ7Wdw1XzFAu>SVg!X>F zcP*l%-^^dY%clR6k(D-~-%t`;u&O*mBcMUQl}(QC6e+5*PDr&we1j$W3u+>ML2h~f za2iLpEYcev)L$bspHVo6UGy;Nyx-mV_qr%c%% z@R?+FNs=+Oxb=du-FbDTYJq`6a*tFm5Jcs_rLw3)GYU3ai=c$iZX(ULu-NN`teG>D z0yJsrce>)A=Zst_15%+d_T{Re52i4T*!6#$&G*j_r4@V91b1?{@=|YK0Krj7FN(!{G)ARh zrTi9qMK${#w;DA%#)b!Mbb1?UO++a%2V%BEFPK~bBLk5mZ4uHh3?mr8mUNzR1Vak4 zTI=>If?pf~4b7S2`wRW|x14`X4(Z)?nN(;;XnF;W(rwt1qx}8av`cVUFshEc_;vl@ z@-8#TJg31AZ`u64c_HG3nOARy78Rj+TveP!B}7~7?aPW7p{LwO?k&_PrzuFHr@K9= zUi79=e%*%4IvN>m!2hP@dY-$O!$=*n9yLsG;h1yRKGdt@=eMbjZ#sXPd*CmTi5B~$ zkx{2(uP58HlgSE%w+XVB9RU$C?)1cv;_}ub|>}ZcY3Lg8Zuy) zkPLpIAL_PPgz+=?JIde_B3taCGqUfkW>Lbk0}A}fzs>;5=o z^KS%og|`Y3Jk%b1x=(*Hh_cAvjHKlq)rY7kuT!+2lW(Q%{8CG-ZE5KdOG%8K8cCnEWHm zkx?9PS%wO&;SF`zu?Wt1VJw@xP zPq5>u7;rj2WFaA)dgd3x@Q>i%4c?{nY6fv3)P!I2MjI%Td-&&#gOF|(WE0x_O#@MT zS~xfia99fI-!gyXZ@<|g>gt>iG+V8K%QmJ){5v2wCcYEwwXkWy&lLTL+nr33gAmkD zumiH0o;4j}o_$I`6a~a-=Ywz0%X)jLz%I?KAcUUp1`uGD(TqKxv=eC4dl~h!xJ+sX zhO|>vkBA2c`Yk+v`)la`Lu$9!v7*&Q$NE^PhzK7Lowt9DAl%x`@B7o=`>nQ+PW;!Z zr>v_SD;&cVq5xxpdH4s%l2aZ!SxLEUg_s0Ilfx+;S$IAL*Li656z9rx%=q5!k5MkM zefd0h$bI=sCaBzpLROVl@BxE_u2z{~&b6mt1R3lUqrr?s3j(66V`@1vxVX@6ZHM?c z#o43SS}%Vez=m&Q9^4(g%|*hTKgJe+;LirMv6j)+G9X&)b>QBJmMniTnS7#-AL8yT z7C*&bDcEs?pWmlO+00uZN!`-WQ7cTRrK~(O_rO}2oYUUi*(!8$e&wPO&z6%_+;y)WU6|F@Y_(u7ku;y)_4D`}7Ok$fo1I^FY{Tc#Y)(P6;AXs?{9&Z;$~* zE=rh^nceu?HM*jH?3{bv0`wK7oUonIGD2=T?#p*juO0P>lN-2DP65vstH|GT6NXy) z!D)Yjk1{a)0E-?cX52a!E5*CPqIzs`>)LfGb}0PfCt+KHJB$`vKOFYf|H={hUFe0D z^tCL#KZeW7gWHnTY1eRnt8;P3R`8>g-xdejxG6bXghsxJhpr!utd1)um><9*QQX~e zfzpjep*N7I?Xzh2`r@-8_;CfV4u!Y#B=LXi$-hj$`teu8n{ABaJATicPu`SU`rC6h z>9k$+YVhdHgU_W2bS*Z%C%eWuYbAe(AEJ_l?x|C^=BGl<;&y3kjU61j&w$+AR&JW-cC~4EBP7b5!>;4t5(g z#=!fnusQq4>x6-wRJG4_0=2zh6J#t!Fw8VQz`v z#n!G3l3^s?MC{Hx^@85p;s&qKds;vbh68mUkGT>{PYq{sX#IqNJNXP&gB*Xb2ng*@ ziT0bqoHPPa&y4OWZw?ecyv;cCJ=H5V!KBN`@mpa^*dvMtQb+XX%puIk<_;loJ>FKzVxxCS`)s#VKui}V5YvX-(iz#3lYY&$jOmJRO8xAS-5kn&BLT7h z_tCTD(&iC9KyOU%G`k(-cISmI0cj8A{7QUx)w*2rr8e2>W7WfZ$H;#kwgHyh4qwTX z8a<3qwrxA;UJoQGR)uJLi=d5f9%wMpBCjt(lN^0r?!Lr;P~UalOaf5JZYqPPWtu%X zj>SNd4>j|mQf8Cy1UPJpdpp-z{=(UACPk>iLf0^k6^7|-p<`bY?#kt#>h0`Ceg>D& zgGVlBJ9ynEx(*Pv0BL_Gj)RQ}pjed3mRwL4Dr0m}GR1h8e?E{1H)A;yPlOpP1fVNL z3myPi`C3YTkg9`#o?A^p^e3uxb zdZHkO%L9`xt)Z#^J~>^>=tUt;N_4_lW)SY~GnX4A{j<$+fG&Uct3T-hCFUJY6+ef3 zxbwwBpRrUOOHijpk0*fA@)1W~#2UaKj95zv2YI-L??GUf6R{$JKO%eEOT z`qDU-I{wO7yU->!|ZkaiGS9^YQbPXGP_5fkvfVg6KYup__3Uz9AQClMy97jFo0sxfr}DSVI@I4doE zc4|W!EaqA+PRtFb5eH*<2ctR>E#<{V!0{FrYcjdIWLkfXu9}sj>G(vi`qAy6*M6$y zklVAp9%q;T0;~3MZZxQ5W!HjU*olI4iAStV4Ben{TW7ZU=LX?EdsbOW?{pchnv|`x z>96!wpyw~Rwtkq1Ffomv*(F+p%OG(nxlKTIc%Z_nFU7d=4?7~OOs=xItkBi?A-kn* zEl@+kP62;#tda+(9ISm5j{e>hDLyVkC~(@PVCjk{gR^92c?-vHEr@V=>D!+_m z3|_9S8#CQjF&I%a?mgqUG!1zN46)e+#aJU#l{b`WK2}IhESn`9yXD)NhHtDJ3e=K^ zav|S(0zf=%l6y#&+Z;{tJb&}K2~~5`EmHae?k9g^sl!k2W>LCQY8pe>W0*5*9VzLev5ZLhCZLECYbz3R!qm+NIKv!i(HqG2+%j1;Xfk3-#;U~mFFCS%UX`p1l7hdrZPCDU)?Y2M-2PkGIT2`rl5Pc1XkPB;8}mN0$C{K_uG$E7$=|WYSBq}7#;LB*vu=7M4X0ZKzpTou zojGnYd0_vGIfQP0J%V_90+*L#v`A(A7UF-Q=42R+>ZvosC_GEoP}aoev~|tS4b``i zYD^r97l3IuaEOOZqquDC%d}OZx~c0DkYaSTwoK1oCqHNo9Qiwjk`0fhf4DlBucH#O zh=N6gbg?j!tBK!scL2975ty<$cjC{qxh$h6*W?^Pqf&}jAoji^Fjs}SfQI9`;Cp`` z?9nU;fMuj%QEGW9<{kv*e478llS8M1sa#bsp}_o{`wv!}*7V^-bm;SuN3%d7!wcH| z{Yi&v;#v6R@B>_S++BWD-*m|mR22hMK*V70ewfGH{ch#B}L+7M%N(M z#0gIbUj}*(19rMVdK0!2al#c_my*zKhZDoM(uB`?;{(bi4cUVYQmO!UeYAgUxC2`0 zqsBP;j4`4)8d>!|(TKOWyT_(ggHYlSbl^6$4saOji0{1|FCGk1US2pp^MQgpF`tu^cH`VjCC!V7jWze zE+kXOV2KNVdsY4=I~(cCH=P9u1-1X#r|gto=9M-lZMN^->e353=hBCn)1GJCfk|0= zaTwwMsOgZWkdbT`-R=vpfe}pK_`j*=ow{Y=^SI$@07DXS~k0TwbMsdNCmjGsS$B1Ac${)|zXE0=>4rwN+u! zj!2o4CG05xvYv462sjIv`=Y3T+;j3z$(HG-rEz7pJQ!^-_?8Fh~WEv-DJ?bG*I*sV%SI6A+TiK+FJnKG+PCVv_PdzVz238$o8Ghx2n55TmS1h7GhE zHlK!vU2|<~-IjYQ?xLkV8xe??oNobc&G=W=BTf_8I-^<VlfhTcmhE<**?`YP&D*qo!DDbXA{X#c@i zcdq-9p?yjrT(H%06E$!Xld_n!9_a~zt6(w79#Ah%jVlNeeSrta8z%z8r75c#mo_<> z&uNS9XX7Njc7U&c&;hUE^pw}NnzK!bgF^yBu)vcq!lm_t-5QBmaz4umAbZkVN&so# zNY{e_66Wf?c8Zrr>h$6c#Cy8N!h_J#$EUizPqU~jO^UMQ;cLDn`n@Vyp8bvli!bMa8<glWJEW_%IlKVh#iFF(;nxgU^wKOodsYO$p= zH5X5^t|H?olE{&^zF{FH;P93>MNcSOXf}%sNSbnUYXm3ENvi$z2Y>3zv~jK@afJZi zwdz)tmuEqLF!y_9&Uu_@p%DU-K+~yy7!GOhvzJjw&~J%7vdvBxF5Zr2>@I7e?4xJk zI)ck_1-3Y>lwSucy7R+o&Z@xOB1--X8p!1>o#;?lSPfi!WVh1}! zKw-2@3wWw3b@3Sz_PDuE3LrjY*zhE$hrgU%Xi`V8;&edh;<5_@W+G@nZ zeWrj2fR2KzGD;_qc8nkTS{qZK^s$hcUIh6?D%M3f8{Zv$t4Kz~AS#*s z2vRA3x?CHW-OUhf3_NB#UcFR*jqaD*uiZYgEb;ciXg!HR8(O*XZolX}>>M)jj zcJGk+Wovi8Lps^7dLiEaUW}!aZdRBgqd`6SVGKGK3cx}Z9_qnFXbb=b>aLGiT~>O@ zGoBm0$0VzYaY9iXdlPcFgP!cCB!C~EfXTLhQYiyROrELW1OA_C?!th+4@el`2`b*O zFE!A<%8wUS2u!+{4pY00fAUukQMQ^YxlSa~%6!Na;L#;y9H0B_^#@P1Ja}c>nYUc4 zhtS+#rAn^yCWS$%=KP^@(v!kH&kJXC`AR&N=T7u|L+i}%s}Ljt%{IL&1AS{+@-}3D zZhL&J&K``^>w;4YzA>0Dbdt@V(f6McXqiU3g#XFq=u7Wx9jFu$=4NP8$ntSl$27*p zvq6$oA@)bpOx;13BXz0Sz$y3}mj)Ir3R>Gk9&F~pHre^Q>k%glId=wtHjLw)2YnWp zFUr%4KY2_Jf-)S_CB>-7_}0ctdL2T4Zq9VT6a=;qqa270u20KinI!BnohiJ`fRtd_ zIPp<#n^ >x$ci!Q8SlCVyv=?Q~DH>v{8=uIdfzd$N(?y=;ch3-_r>GRqr+6Z?u(vgOLnFIxu zQ<1C`sSqa{_rSa2v=a*-(c{(+17EZWVF&>H^!h())8kVdRv(tjq*_ROTYDzNx#mnu zO_)Zff;3PdwxV2WdUc$8`l#}tnuKrrGTtI)7xM|$oT0CR&wS2>L4O=~2IV6x!kd)G zflMhy$RvfsfN&#mNZq!%Q;R`=iw@``z21ThpW?0|kOh%_4kM}`{~oO2+JBm7SQr$G zxczM~c)dWuo&#%&UAmRxpyZ5z+1LRXHnufpO`B^^59tw$zLlNSCApEmE6efYwEFY^SpVZiY4 z35oT9_{_MFu8-_`oOG_hs~(V?P3=LQ(xC5^Gs0YjQXQ#kf=V?yY-IW+0(dzY0StGI1|t5{$bm zQSG_CnCtzKI)u@FPcF@Wt`0gCZTgIb1_ZE8Aw~hA2@lzezSnv0`uM)AZ|43Y6~*fT zHIKaN{v!@vI~o?SZ2 z-9s=>P#1~rU?JgkhPp-~(H*cC2O#eqH?pQP6kbw?E!_&(f+Bo>pv8K1h#WV*G|ddo zvkBIDamiy8q`hi?6N2UTe8S>)y4^qgNwb1+M`^-?v!RI0TO9UgcFZ9@n|HwPo!PoL zKWoUCXm32q$+uaQydkoS2N6{JNH*loew9cJvbO(V+5ejCq;ljc2~cH$9L8s65-;jLdxc*$?H+Y!}b z#boI<*9^#b-bVdYf`J%jq-1{-R1i}&xND#N)jv_J*6Zpmii}4lb8}{Y%#MP~Q~l5k zwWORVgdbxVUr!(G8|aJb#5WK!J1!v=HFLZx?IIC0PN!)mb$P6FScFBH&L-s5(PnO!&4H*S!Qelzo=m%<13WF;K22i;v~ zis~IzX(D2OuF|YwWVJ5j6x<7DjWTb5W9TPzAmb)FVmNbRrNW6gG4Mx{ZvW_h0*Hpq zDLv{|cYw+&w5)biII;iihYs5SxXUoi=q@kPp{d4-+`E@6sPfcw3^!BoTJ8%<_wf-k zL&=Flm&bhZjrd^8*dTorZ>}3rB#xFb z?dF8~?vg$;DLLY0VF-qc)v@Hk+?{GCa`7O)!1|{4^M1!Nqd!|IO+#V37A~C|Nk*Jv zzhjLsr>NKRVw5i-fZ70FGwnDG;lBH5dn}!Q3?(U}K1YkyR7oA=-LhX~xuyi7qre<*M-|xv@_zDYS5B>Si1hTYZ$RY#fsx zY41jDjC+(&r2MhOJj$_pCDpoV7V-G?0~`}zQB>n8;ZiayL^~EV)mkkAgYx|Ll-XQ= zSeOH0l2hqWvL5r^v|l9Jnb*t6W`NO%xodo=4;ev9{&?!6{;9L9QRn%E^?*Zr$qEwa zBU}snPUA3O*4sZ-dS|cf%o|4lEBBmG8J-d8IprWv96>7dfa+6+T5&TCy4R><4POWq+nbOs|g} zE>jb{>ls%c-%j~iGW&!1J{o2~GzLxmuU!ARL0vW{!Hi2ibU(*agMl6SNxTt8r`>?g zYb%b`Q?S&W>w*xRhOdjs_S}bf%HqHY@I%GkKouUMi}uX@YW^q=bK5O1MAZG{-ZSu4a{cq zs|5zPxP2lYbPI+Z@nX7ss1r$dr$!9Qc!|Z>`V_}e?m}8v=bKgBQsMnnD;lxez9;!> z3@55!(FO0zmRT!LC`tU*m-7g9jS78-P5(2F{$-QQuC+fC?TWgm;bfkON=$+ zy+@lVRLZRe8xDp2u|Mpf#;Xofn=s;f0mq*EmnPeldshuzFc4}F$>j5VAmthg_hw(A{yq66Nv!&(H*Tx2dMKnU~OUEDCrgoiuh;%eiq-> zORM&`PSE$i?#Ik~ZkTI-6SEIeP`(gwKi=J1k>xOjuC|or5+yl*@&II}S03(rSV@|5 zy$?||QjSq?K@i8hwUJ5iCR#Lt0jGa{)RW0E#q*iJPxC5&W0=Zz>r@w_2w-r+DyN}7 z)dK9(XBK1t^zr9UXwPAFWGfs0a!c8=;H#Jn($Pv_l_tSislNRnQV6|VmCwH%l1O~a zo?|H2lbxT_%}60-whZhmfKrucZsJd;>zJ&ZbWLiq5TPH z$gDnYvZ;yXdgS^D17~5}1cPowB=7<|2Io=${vlQvQk93w8j=z_SQlRHCRHuQc%O)g zAR=`CT(Uw2#$3>CN8)iHq!oo4JG0VOedo5PlGL8x~f+k*zd>gTmV+A`==Rl zyoA4!XyKnO3}@qznIqsJ3Ld`J4tTC55Rre*r6O;<(c3JD{dF^V&&I`eRIL|#sk*#Z z#z%#J>c=4lt3AMI`y7k|7Py4BglbE57eC5PJ84gDM^lY)l|^sC9NTE*u&6RY=}ecp z4IUvQ=aL2F8cv*kk`LcQ<9%WlQ{Z|VdlwaGuoJe)OV038q%REh-I>rlSg{Np7v6Ui zX5jy3_|M}~hzfx>UA1?ZV9HPzoX7-xD2zmZzz)ZJcrydfY?-4RJ1vMi28kQujdq0B zmpIqQT|((w3gv<(E(uX>fr;)Tp7XCa_-zgRM{+$|JhK3>F+&`}%YKGuev)kuZ$szxfIMJ14Ql{}-#*JNmt}<>H)g{2%r*h`+ z(=N-DvGh}#Y|H4umpj%K3OUaeJGd2pY)@TDV~Apu$js6MGaDYR@ZUCh{l}E^jFRzX za0F6EI?JBy+yFCahuVjC`*`jBX#Z=88-#%R>U86s4sK^s*w;Qms5BwAI)W-SOXkA? z3ehPQ^;I~HDN_NN&FfIDdi<{qvfkQ=!zkC)StBRn(T@N_>@S)_`uV^>AatgG?%knp zETxhlpe=Wf$nWNXmHT7SIIu&DzErGZB(SSIi0@Wg<4q%6Ch9X}gDncA1-+i&WN%d2 zXY}bE?;n~@7plbrP6U$6rqxva5d4n%xio1JQ`WZRJ_&5Mg);yvwzV;YSVmI6*t&PX zzWHWYwz_MCZdVVmml^qxRuDda%zq}j5;5lo1B|4!#yHPuWtX^2qh}r`aFowkScyjq z3|xFx2jk-eiRA4v&SDBcdevL)R;J0t9fda9Ao;*|f?v6@J z{*nYsbsF`B#C>z>Bypakdq7UXqYyn)HQo}++;Mf`dQm@42+x=R4&!L6Rn&oeK@v(I zK~;(zl}PBPQbJ*l)*+wUEB=bhNvP_n!L7#6!(V})@ss1$Ra6j%q7q=bz;-{&9Qc2l z{F6!c6l77Q{d~mEF$*Do91I!L>oQ+s>2WrR5>lLaes@|CPH2kA&6&o2(iMF0WJ%9< z!rd=k$>r~R0b;|y-u#fzc}cYiYwc0}x^j+-NF6ZhSy4_{H#U1cyJ+ZgTAKMD1!DwE z##tV9ach(>6wT-(@KSu*vfp8MxHInligoL#K6$`W=}nGy^x*b?lhtVWZOTO?_T1xB z%J!fz4K{ooC+hw3;a)Uym|SRsoJC9pxi~?^<$k_{W~n%heXQ|N-AWK6C|2wDh}hwY z+lrG3AeGA`Zh!d8fJw3FAdn}yrLS5|)a@7u_chkVZu5AuJoDzcFXL7o7*P5f2XS~& zH6^W8m^G zlkHBED9y`fEHqYegP>^Y&p-^cAvOI8?E27_-DwJ|7UP7dM6l5HKZk!MZK`0~&BYEn zC)FyHM8{Mt00>1^7wLEIpDeM>^_Kb*dNYx(IHQ#Ls!&~jkY}M)^w{nNC#6kIwKxiV zK2{oHz;}AAFrI7>g2?Wp4FyW>=0PuBc0Sp{Z`I0i3MX6>_fpJ%V#jvU%U0IG+%bRe zRPsYK!6;aHy*%k=GkcJ7GUY744D`B=4&0lMQuz-JY*u_bbviCj%)1HdNp8RWY|1`4 z*2%$fNT|SnudJdt^TO*>&VR znCCO`qRue@18`c9wOF_L_j#!_a?R3NrRoxc9r&z@N9&T->)*Gl-_P>Ls1=58fi6 zuNnS`Wb*-hr_O*&JMsx?)gmHM7e8%_yX>L1YjCRn;z?WU3^kS zG|K1PW?&zl-`o@N5tHF_#>XH~HV6iMr`5}P&TqeGts-PUluWiAHnBpg@x9J}$5$t%NHyI4^TCfHo$?4wjEc0 zAn{FPGO0yGZtPV5Bxn>x&~H=$?1!|rBHzr3^dcZa#ar|2S# zj5T=S@QK{NDRZ6eBA8*pX(&*vZ1K+b_sx|{<3hX@UaDVR1-AhYDF4(d|EefEG(1t`o>^5d3$R(Z%h+T$i#c$7_@%s~=E-)tg>>;IZlPW1+^n8HvC;-Rqd_NQN z9g#G*S*F3u>91+n0kJKI zEaET?-PdUsGFr`E^zn*xY6Ww32-E)OsbcsKgen^7$j$}>P;ua77O)I|@K5N1-(t`7 zNqCAj@p?lU-vc-`Y%#756F$aXU=9bbX$QZVPr4yuI`GLN%*u5na7gIE6Wixr3ZKRL z;9ouxsEpJupv2C!q{OOR{F(W*G!tD)oV4Q)SE$eU58dO4nqV`gwQ@sol`A~*dO%Wx+ldr)w+A*@|kE`++lAG`6w)_%JV+! zb2kyu$wg5ER{|Er*pNnoDb8)l5e=MIzgHo)%%(>gyZC|HG#;Ky&lbxpEH=;F?ZGjz zfQ=P4{NY5`(pc>SvE}i8sE;>JckvDw#$Hp}crd@BJEVbsnq;_#Gfke$FJPDY3UApy z*xzIP(to<}#Vy0jo@A?< zv`lg*&6{noD%{q>%8o5)eGeTJJ;9jXBo!5}479P-BM{gqPf zQmn$akRDviO%XG8;e9n7c^1)5B`p7r4MOhkjV9&X2W&q-@wU+1X38L(w_$jLzvN(< zg0teAh$;f{oudl;{jnE_cgzuDK!Mc*TB7%kS?sre1yv-a?ia9ZrGcmB)w*AuwREb& z!l{5hmghLb#240UiNzFti(v9I4&H60VlJtLQnA0E_aFa^fUF3mkdup!;Mla*Pi-L2 z@l;nX@=VYu<=b?<(@K_(yF`Qv@AXVr$Nvcy1p7#d#s5F27pEhI+@B!^bwC13YWup@ z$A@KqoI2x@^{^7};)c$8RU<0|2AiNL!5q#5x5Ex<-S@fy=6o=ka9!d?2YyRhPE&s_V~|# z)c(#T>Cg*4S^I@{8)HS0+G(5`lWM)!kaMKSCCe)&D|2HSCRvl_R0Tr-r0x)C<50P5>ZBMG5S z@Rx5jTOcVgn15+$Da7CcUE0{F5XaTgaSf&p=NJ2Z@7b%i)8YXSPWuKF`!Y&@g18p) zSAPU6-a2*M^qa}khjFiL0Kqp*{cEvNzqjc-3aSpTqu)+&giNggfHzXt=}!WPLnd=^ z@>+D>twKU_mN;U9I=#gZw2u3;gYk~t{H7F33?lKee;vrQJ6IheWJg$B6d48-ss+!* zGaem5JG$`LYilcP_RQQb9b^Z8c12(!WiA-_{_XvSy6n+B$AVAw^T0RBK^}R(F$n`( zr_m2J0VT_59_;DWEA6tofeyf>0->H*t%RIR$`JR9RcdID#3!{fhqWo1{>1Eg#%@1B zv=RRR!%j|W_J6=j3SkWiz2a4zw+J3`)=wubPmGm9Z19446xws>&0_yas73g z^)6px7n7tuZ&A(NN0=16h&iYZirSzF)lxb&tSTmbtA=W9C1})IknKj)D4VOijQ&BLThl`s?bQ7OCjJsrl7QEkaB zzp|l?vV&X)=vEq$wwN-?92eM2{RtD!9{gv?Lwr};+E#ogKL_^c_X5sD=G0U^!?ctMLpxCxYY%OUT7d%xS!wH#fQCn^IE5-M=E zku+mEqT@bao(aeP$c~F6;&AH~GjzvHttwHluLFUT-2(JjWTvX!qoBg(k=RD|1h7&; z`3N=n_@}(}lM1J}b-S~TJRQ6CB5U(6%Z4Z8!7$KIVWEQ0;Dft}&mkVR-OxJ*LYp~y zvky5ozb$HiqagUJ8NW}K&SzRam8ysQ{>;8Q zTrvczylfXDJ!<SDJwd5LBl8sqvIj%gZx7G^vfbmRu=5s(EOE35tkLx<)$0J~ z#ICFkf8UTA&RexjfNnAXl1bJjVW>+*>hK2k?p6dYpohzNptnvFg{=JW&DFVV`{z9x z1=dl2BCWib1ZV>X@z;WEH=8wqP8jgD)ya4piDJL_zi@dUcqXO9UnR+Y(I+eIRI5=8 z`+4~SwmR)TzK?9yJI?Ec{l-uYOE(G`3bS8k26$7xsA3CWFG7JGxa4Oe&MIYeX?8Pj zF#&fJ3QWBnw!3XMRYT=G+gpdTjXX#MY9{=DO#|;3$?CBhY0xtqb*R0UWw29N0Xha) zeP3;j5lXP}n92DZaI$kA;5~PYZL)5>YKZZ;yTVrs741O^8|V%45RBNDucC`2V2O`f zylbMW2mgMy$k20Pi0T!?NXuP_v@qi4Mjrei-)e@7*GW%CYmNR$1XBaofpqgKu9>D7<7&u(Q8%DP$H)UcKOsiKPg%R}YLv?<(Tm-l%2rY+nD z=<aX44+ISwiSMGQ$@+HN0(v0DGqHRlb5&~ z6LVL#Rl&3HAFC{GJF{{G9_dzpQ*WEd(2Q@60enL~W(ZZf6z&u(9|*b8&A&EY4R7q}mE3nTWc6RmI8dL@4Q?x%_y*m8P)p@F#p(9@1!rK{lMn!s-oXRVkIqSx1_-e@+>|)Y-u2n zIcZXh_|kJnH2sE-NJDOhZ(!ITl$4=02c!L+SB<}kUK{{4e4y?jtKpIWW_KsV(9c5$ z>(9+~ws}UogQfZ2h1t4)0R$k60QIv0d(Y!ot_&+;S!1C481ES0zwl?Ffr2MJ*Mj&L zc(4AnZ^K|v8j)Ri7yx^#$Sz*(aSB``))=Js3cQexdvj8^OK!jNk>e&T01L!67N&qq zrxK2Dbxqu$Xeg_}fHIAseU$60K8;1~)+2c5U*ic%`bj~sH$W7B(j)BTE{B-PuZX=e zo`-QZvG#iA9|GQ*R?=3m%!K58K=B1h9{1(>dlJs!`bpM>s%IK?VoEf@>#>lGE2>(v z2WGJx>|zyj*o5=74jPl~x@q8R06lgSTs+jr4uaa%N}cb_DRT&Jv0@kvmwNj&eX8OU z{)vWiXnU#7c+b+a4w zK=S-2){pk8_et?o*R0tSk6jWwgZzgoTp|m@`*+*Uc8%75^VoW-SQMB}7Y@=}X`Z|~fO4HBTcS>O7{`v9O1SbmwV znTUViKeGTZ{^Ry$^82BJ9V@1t^NhcFP7Y$f+a>x#+rvB)dGfSJq&Pdd+B`rz6lDya z6z2h(s;#RI&I1dbyF>Ufzv-F6lhyjWc0?sPZ(?x}?$<0WVgYGrGxLl1R18>=_HjsT zZ26Xd%85Mll$=(>tsav$UGk7o(nafm`=?LTVj14seP~?vHw_W}^RX))41Kd^H$)qT z`c~QAOLm>`wawsU$WEBQ&?>STMqU*L(86pyCU-ZXM7Vi&qh?w|OX6xL1p-rebn|wG zYRqfbEjbYP9Y;dOS&KT^a_SadaQqb z__@QUe=su2LI5Z%%HiKsi%(>d7$}+y(s^(&OtplOkYRc-8eprCjFu# zl1{t*<$wH)RI960ROu8A2;!=3y;f+b=Z{4dFWSc~^2isms8;!vBzc`D0Lxq-Un#MF zq4h|8B48-D4~mp@;eFLUGS;*sRVnKluo4`M_$wW*)QXuxQQ+Na8*+3X2IE^ZWmaky2z;$OV4IvA%57T&Set%cswJQIkR3wITQy02yusRiOn#csu# z+G0ShT+$||C#*nw42AJ9Jv$Dr?azOIF*r_PUsQS0@VhhL+6XWhPe$GWa2 zo#AEyqvOJxzHWTcutIMepKNdPLRU5QaLER&7q_ad*1dpp24ILU7rgjr`6cQJxs{u# zsZRRq1UST3U02wi{Yl6RXrF$Yjs#O=`LR8%AK_j`PkJh7Th37eVQXBo;Mo6vP{u4h z3s>Taa3Xo9h{xS0Uc|tI&uRC)TzB^gyyP>}*(n7mlB{BEs+)Ot6%`ETAKOy09e-W} zPyCaHHu6Bhr~hogxzWFz8rk#2(c_of&A$e;gh|xS4~lqiXLDU3ZZS1XV~-lYpdfW= zxo|An{G@bE)5Bj~+zI#eQCe7kC61dxCHKF0t6WmkyJpAJI^_+?rR%zq3@B8ZW~uMO zq(ec)4v`3}$((B)u~8mx{|$`02DL(pkDa$T!6q{G6#cR zyUq@0dYPs`JDdknXzZc`RW9FFU9qL4OQ6>wnBvd!@3$EOhEmdxn~^Ag?Hqd1zAzDT z{MwtUS~$QVuz_HD)ax(kATLBSmb$HaA5gH_yt)Kb_s)T^$JblX34^}uY`H%#e1#Na zTJ&gU0!4>n`eO0LWnpU6q~!V!8k<}7uKIz>!zm5rp=AF16S5C-XKL{<1{oC`!6rC2 z1M4NkgM$6MV&D;EBq~RLNM(eK(1|mhKmth^bn0z2G@AOAAc%dZAgu|gLl?Dj7gHmB z>wG0~DzT-3Dh(X2xnBVcoipg~ItDy$q8gn-&j?s`comk&D}pa%0unGt=M|Q}_Q+3VqYy%UNGA$_aggr}RUb5@3^H6Z) z9PafCf%~aolBK>tphOCH5I-~^%Hm z+44$oeRDvU1v`WUnaImt{%94S)=?aTT?}1!vkJyo_-+DTF0>74OKTuWY&Sx5deh9% ztuz^-7rAZZdPf8T7;|Te2bN_|ST@<{!5dky(|qO z0d)D9_A9uw?yDN7cUqia=BOs_8i)isPIDL8J4aZmXxKG7mY)&rf1*}K9Tg7AI2Xod zei7teSML}?vq6`jJkE0Gi#)($DcVzx`ap#;*(!CjAN^O zXae}GR_==I)b!dZ=dYl{fr=NmU9pSdD^;nPGcs~GW%?k*hP)y9%jD9A*gz7nALDW82h~Tr#Ik*ML4Xi4+-++GI~B%eWd=6 zx6ikKHHaH_Hh*p>jgFXmw?B$IWzRW^w;(uwmrXZmKKth@6HPcv0j>7HO1k;jaT(qg zL$MgGhe#?KgoDcG?b^`W>q=D@i2P98Cj`WCT}TxivD>3R%tYa`Ph!7B{iY92tp2LG zVv1%}C8Q(U|GiQvX&PMfVWkI$Ppr_KZA`a+$DW=Ay|N}$kEvuM;`E>I@iPKT=OgxY zMl&hauHTB#Xk^)5+;TgwlTiHG_`QL0BEu!4=$a$svT!-|OYGcsTn)%g8bl)6?1;#J zZtl1Lt6UY|oly%lrn|(D8EO;47>!%1Q#tk~4aQkKyPZ6uj~!d+>CV1o*6@bpo%ljr z@cc`2y51RFnQMS(L=)`JKieMF8%po<)<4$igeX8yZWtVl`fA&p21$kt3CL~;?*WOq z8q4`N+xT~|U0Qs&M$?$XcIps~1oGm4N!A6DIixXhXJI`}HgSjS9pXB=LJ&(o`Gfe7 z3e@T|EN1huLr>5R?(bqp#xyNLU!{xJmxQR5V~vEw5YC1lR3ilPqj091IHXtt8=z9WiOrc4f;5(im=kebCpY zCA00K#9W)+gfrv{;eT?UZG5!1ijo@4Mo_*>%&9|W=N(l%geg+aKO!*C@)09jL?4r2vRE~1B&g2t~@p%(%Tc$SP zHY?lJ0^oY6SFS=As5RIxPDaSsQp! z!mFEqhTZ@NCDI;oS3$?$Mg*+9#!{gKICON$7FnweBfRt_n5n&K9EzYJlO$qY`7oQ6 zqE6`d+cBmyNy`F4GYYyQvN{ubU@5( z9+wPljk`Y8fs`}mNnz4WqWhCF68CbU7UzhfG8w#_`A&>jm6$oh$D!gL>w&j}?}o4} ztOlY+MdQg+F0;=4CY1inUa7xr)X+NrAdAwJdYuuTf=vzgM};ka%>MUuv=?2G`!@2^ zc{)^e+f_rA!?H1fCAx&v@8<9TxOjwpc24qDec9pziG8)ADmTa zsYCL!QJXy(H9ON$eok4ME4FIy-9o4I_&QZp)ihlb_`<<44lqwAT z0-rC%PE~RX+R0{rosz~<9qdE-KHI5c5+0BaN7uh^?;Fx$FLGE=ejXkPc#tjw|;VIgcDTX}h--Gvak9LoMoaAbmxs zNpf~>1e-sMCq}4?y=wB|(^tuD%K+_Lx0KxZVodXiBgXlEzt;iMLbUR%eN|?yL+g|- zY6Bl?3Q+w5MJRTtScmA`pk%L7iXlFG1^qE9S*JHo^(J$a|O*cHPHm zU2#Oit)miurVa5QJZ?UkD3Bp#JWdf5SPXwp=^hV4oWQnW_ZvI}vx8d^AYs|nSi&d2 z(Z-vO`5r(659s^4Vsfe_r_FvS7^8m?iJ5gMdyq(O<1sce|K$~_XWR-?uYD61aT(!p zIR&San+$`Cbp#<&Xg=fuBJthXW#`F!9)VnNafkzdFn{RtSUI9166eU(&spbZ^@>#_ zl=N)!P)|Dw<;-Rq-&329 zZeM4AzdS&r=S`Vl1QWmUpmN;&avq1lQTR>r?{`8(&U&^7i(L$~i~V-{=a$gm`Ao~O zByeYB&iX8?>GP7@5No;Z$7fBUYzjXenhM1|#S&Zg=%|i&I%J7i7yzOy za`6^8l*PQz_d+DNHK8U*HY~pm;U;#Ynn0(2ke*oL)@8@>Ld}^02GoVK{UbN2dNge6 z2GuJ-nNb|&Vqa`U?oH#gza5#feh^1}{IpOYG7uxhm{uW&pLNM1&^(Rt(PF+4GKn ze(UQmAs(jV9r0Gjc!M$?@MMWFC{CkMY(`E&l}4@h*tdbST6PzPUmT{x(l+6;1@RyR z3aq<5_(9#r$u4m}V};vqRoqI|-15UCS!sXp!~Ybis% z+$M*JQOdb;e-jy*Ol&@31Oc?mX@75jIHGG`IAE8fgUc(r5#JC%cWAa!JTw6v`dYtG zYG7oTG)x|j?@Z|Z$@fTJkPtbyXV0BFd;T>c7T>}uj@Bd_*|fNUC!m>qq;-RZ`~TtG z-}T%1f&nn?j(GnUXtNzpX_vpJ#ZS|Ed6v13qn&wy7i#EAVZvy^3o6VkgxDNJv!zo*xFUG>C3!71p=paue=xQPME=+oX2Lge=uAb z(xESlqVD)B^Bw8)x0!mU{!MRxd>JL3sstF~2NKw+=`oth+m%S>Zgz$?-O=gsq*MUxj+CMjK5ob~3epMT`d5)VDP? zyC{bA_4{K2ce`Nbg(-fqS`-W5HZ(K!reYyKPX>n4U1U1ILd}d<9B7#@r6NPpS20tH zl`xP>E&$>7&v7GUV35t3rO{^l{aDwG)riLp&d5vG!ZRK_UvRyHP^Blvzg^nXAGgHnL|W1_}D zr`!a##Ss`|`ci~X!P5n$Z(THA;U!axSx7m~GB!vJP zG9ka3-)i|Vf0y;eh`b_DXQTg#6g(8=(xb3dX&g`c7DE1h&x{|W1C?;@Gwyp*amo<^ls<)|vQ2IJDfXhE+?M)F)rB5xCi|D`sg)E` zN24CFPghEbCLMd^DMh7P{o{koRs54HCaNFbu97V=e3`R_zKi|cDT?Dpxk>e53J}@K zOxOd?e)KD*@&C<#{cN-82>w$iw!cujkt~b#R5>zsZ*>#8qXuEolhf5rPPj)Fc0*d7 zk)vFN{2I-$W{2bcXYVfrKLF||(?^!Xgi8T$W1=j;jy+F*`5z7vR)u~X;mCh_(7$;DH4JD$ucv($8W}L3fi@B_d@)-SlL@jK-L=n)BNb4i-(Blr2twB(`SBKGCp3=D#lPsrM^mWo^eWfA(dXqJHl z<{>c&UW)(29G; z{JdpW)(sEtmN?H3zc_c2v?Y={#3p05(+1a8X`Q9sLnvbUy3RYCRxAOokq!H0$ z+zkP`r#r#?R7TbR7qrV>j~@*o9g&CY;L5P0+!a-<_cu{Z;o|#`AqCm;49Gi&$jzZrB3xS=yZT6PXa#pSqZ^^RXNMyO#J~sM) zY>>ynMIEsh>tJxrzh|OUh-L-D9$Epp$J=p(lx|f*f=x#cB1{FnS}${5C`~O0bc`O4 z#QZ5y641yubq%Ms;S(p=IxTukdZ7S8^fkkhNy;qYD~JFiXpnSa$fBv8V)BBNQWQ7D z*wxvmuoowOTM~CEP|-nr7zG=?qYTM^5<;xlf40}&2-MDD_SjsiqdQ31Dio}eLJtMl zicvIdM~J~i$2|1!vO(1i9@K4L0WIcT9B)Zv1N9($28+ZBE5L-6mp`qq7U#tmFGe*# zv9kwz#X#@?mn8v4I-mc1IT9(?Swlnmc9<{nSm1ro6INscN> zXQ1pGKE8IZ8c2BnA3)&0323Oek=i%AwR>0uLyDdyy0O9y19m;sJZ_by%FvFre?KYK z8QRF59sk$XU=xAl*RtmLSc8D{MH{=PN6C9{VwmmEB;%ZFT^CZ&0jS)TRV; zeF|g8z@=e4FftCr6XVSO{Ad&;i!n7FY4ug=|4yQ-&}0Y0&NIMqp(9XEmhZAwKI8c^ z&(0Lzg5@wFWo=sz-YM;3VfJmxf8oaMJdxUMh#IU-i|?yDcAYzU809v}m1oAms)3|Z z+zfoC?o{Z+UUP;NP3Sr|f@9wFBl_<(IBeQ$DyDQAG4rdz#wCvB6APYcc*N#j`uQp zT0bN`t@VT0%?aXzjwn3b*<(h@h~0(n7E!ln>N`o%?GNxbpl??|q*WF$oL^m4au;L~ zf%FcuLUh`T#G48O)zdY8f6U@vW~+)vQN}qx!^{8x6Je|xJmhwl7U@g1G{ z1%ta~P59m!0oiiC*`b=VNM1Rh+6FM8`O1!Bq9g$2e-T8Cdl<%;jzO`6U2tu-Kt2`s z9YJ|Xg~%;zIMt;hy&K~jNSnXb%iQ~tEB*3lrit7&s%63=@1Sl280pP3+$d>j5W`j2 z#SIUPe4cnam8d?Qe}%w{3x>j6v@u6^>Ni%JT=&j(TD@=y(vAMv7d0X%$XV`Zm z=^^v8PJFFYg0F&^(mgc>@kDvcMiiv?IVIRS6@r<)Jy9R^;lGml^qpj`xPfP?GLalZ zLf2^EO6Epq*j{>gu@&}FJLd9(v}P?)>fZ*l*KYy+Uw{u&I~z0RdpsfTrN1_7)0_XP zDoE#-MnQvje_+-HqCm9KVokCDEWQKAE)M#SrOxxR6X}_>x0jS>(7_&Xi|*c?t{eyO z=>D0{_EX)*gW~Ye?$9bXWUNH-(*R7eHKu&F;dU! z)_KGrgmSoXSMS3~DGkuU@-We06%|3rtu}Gb!HCwG79zknk;57MC_8YIw52&U(PpZ~ zT~#+|PVw}F4=%5M(jKnsB$7%FM7Cu>NJF0N01USCLg6f%d9t$wMh%ZCK9-{Q`3fV< ze@Ht7e=fp(dn3r3S(bxL@bs>g``2N;rw4zzKu|cX!Y5&)0K;`qe3AxH)58%Y-GMIR zd<2odeP;Ozi5@z7$qg2_&Er|iZ~C1!Y(%JRuJ-I=jIg}K=Oyivh}oBx`{~I&7{1Dr zdxGt(E2m#YH0HF*DjZe}|&=r#vWyQc{{0vQ5`fY4o>hQalNh zMuj-g%9%!ffU9Z%$!yS+`NA-8J1CwT ze*-8o1xTV^yUnEro1~sY_Z5?Kq?CXS)Nt=<!+Tu={1m??6+wIZmh(n;KJN^ z9J~LEBbU?AMcYPLVfXCrOaZ#T8|){hC5jI~4tn%HwDDKyUg#phm{yzp<7T|x&UE~= zACBzP!=rcrCH8^=tx3Un{)b`%PI?e=&lDsbK60Y7Yj(ZBE;N&}^QOm+T=YMaMmdJUJ<} zc@b@)BP@x;m4I1HwnE#hL2n!KuIh63`;Z=Siuuixn!*ZK75DrtxsNe8b@w#|75AaNe??QkI=i${ zE$X!rY3e9^czS>})y{-to|<^~GchDs_O13O`DP~H(E3>Xy>^1sm|DKiY(o>Dh*@Fk z*O48h$MT8{%3A}_Cqme=TRgaV@%sIwXtGqg_w;oK2KNL~0da#08>i{*CTsMOp1Gju zsg6Nm3cEYP_Ng?MaG3gfe=O?EIRdW%P~$~N`$ON7??D;fkw676{dYX*fWiX)jOAdB zs5lVPN`V4PtjR{ZJ}Wv~QVrCyCL;;0{(x%VdmXlBKU6`vwN4l+d7kbwLgXxcFq`Hy z9u_UVzyW()U=}zheh9%H7H-|0%hf#IGns+Qy4r1g{d*)Ra3mk=e~a$IQf7$2`xkId z%6}C`cW-ky;-A~$w*cudx-}%f#i;&2 zRHK^e!s?&EmT1P77`<|c>zX!5Ahkze6_9pG`rq~YbJVviq*fW9|m|I_C}6wb98 z{ArI>^~GSFoWE&pnkon(9@K=JHKEzvSdS=5t@)h+^+O9Se-eZW1${Mq;NS5hDR&=3 zCZ4{NBEObI@<^VRoi71=Ty#wb#r zdycJ}1`ZQd`H(4|oimk^kh~9;KM2;jSo*^HChrAkESN%Iu#?f96v>6q3rV&KrMJ;^ z+R^Bl>87=)J>i&k|0#Ac6BybYTRgz!z+ga*GFl>}f9%HC`n(_ZH0QI8Lnws#k?#y z*jlZGa|mUHigYGCxnS&ZL%Qm;E5!fK9qp_iy$w#N0yN{Cu!kH&rdP_4dEfdL14E)? zY6}%oP!dB#3Bfg_S1I!x$smr7)O)7Wlk+>vf3A;`qVxSMxskrI%{Mrd;-|*AcI#Ss z2&!_syy^28dKqWNz2v3bV_?87@F3BM=AhAWT`qR(v1Znc&xv)@X10d-h z32p%ePRr(6%;Q$wS6D3Z=|208R0EiM6%uHc4sN|q4^;MgO7 ze{`#tJQ)q&!&gwcM_Q|aUsk-ZUrobUd@tAKI68otD~VITipfQ@n8u7?B(q%w$cumu zWn+P-1;`C0MaIS#pEf2^Qg)+(;@iwu1a}-wSpTU5?7(a2pu}ty;0Z8;eZ#rnib)!% z4@tgEbf`wxTZ4DPJ1f0ySV$W9F&(Y2e^4S+!B=HNfhTHBO;dydVf}U2Z`*SK+$Z&5T&;{#h`P^So3Lc^=Q`DIB6sO8TLr= zG4)8GK|gXJxSu%+B?MFcGL#@Z-p`M>KLb|>O4z~-hd+<^${PA;(}ZW}w!XJyf4*U8 zO7xW4zs#@qg*Z^`0BX;~Keb>spsAd1N1n0D$>53rn|Fl)qKr`3esre+=`12OzhZrqQvc#r#x|SJXebwpxCGl}pSOCyF0}KZ z(XK!yp2uY>vi<3Va~Sr5lIT_^f4_dTiGC|>orbuReS2V((?1&CiMaT0qaeXF;t?G~r`PfZDxn19 zq0h0h@h;r_&8l+N`IA$PvteLX*DXlKw!DG~hSOU{*MWoo zM)EPLayU<3_^f?NWq_+WVdI;xNL`{AJ=j;kwiugV>fK3H7ILiA0_p_&<~#=9Ozh!O zX5oVNf1Pb!(-9QfcNnPZ zK>vGK7aX;l4K2k?v76UKPu@h z;rU>%LL#i21$F81*rrw;y(!|inC%qF6m}hwC>|j;7&ozPe-R1chLR;YPCUj#=snEG zb~v$f0F#zn^FutE~W=7-XJ9Fq%aUZ|!I(|HFZX2CR?@k@mCc{Za_d9uXtiH?Eq{BA z0V_O%h4cW$A%s-1OT6v_Nic+7aP83eVduB44 z+cB}V#sfZ$r!J@%(k+#(zP`FHxI9j0v8xHMzGiOCe{flp2HFvd(k=i*ls5;S2O>5) zdItFR3r}N-csfJxk3F#;f5`&6v~k|jrp1A{9~h1&_oEsNac9uK1JAGnTT>9^FR_*| z&#`bNTqk7QGSvE>PLMO=$E)~!F6a(s!?zGgegQ5I+t=LcwY$l3w(AfA6X!z1bZf;~vzIEhG(AmSGD)010pxs~E@)KIsVUDB?jlD;OmN4!aN-W+paX zTih!^7mt;w=+i0tab$*@JSnmphRAMwsMsbKT!`dt;*xQ19(A{XP>N&@{v8m{6&3ls z2;?tq$W06cZ7|af7Ii2J?@sI>NpTlVe zLOPC90STNJg+xsou>KP{DjYH${B4e!0FjcI5~sgdkHFO8XVx2B?52%Z0l0PTfhM5Q ze-k+LgvO7sB%Lwoq_XYvb4)f^88*irWED|s0s(>kd2f&|o1i; z*Qtv!5p2~yLEM;7R=$0lR>T>ZXG`yAe>&HA-7LSXx^W6;rbHl6%_oY@@19%3ie7T=_0K&?0fEoBUlfL(^C=Hk3K&ZogEJH65uDRzA*L9{av!osr<%j_Tt@{Vo|Hiy~#8dMTJ~-rI zUZ8cSOB=SK6Q5H{;FbT`G0IJle|irqAeDi{+pUO6%5;}B&H()}rp>*rtJh9RefB_9 zzH=I1bcOL<>v6{o(nlX%x-AwmI+)`_5K&H3WbQ;1eOcz)J8Sh2Vh)V+g{w7`%5nG+rhsObqFy=OlUD% z2MfE@g!}Ky!uyFe?Ad=z+d_`bPwR7gkjL)PaJYYyvMS`X=G3?2cGbNDeNLa@6N&QJ zUdhL%935uBBK&$h{QO^>e+dHJG~<4Z@VqWnh2=h~OO!>H)zhl5X>deka&Tt9(fun| z`(Nx85>#>zP{Fg5J8{U`SA*v~aYBK?FwPj1<<4Y3g_K>Nfu?cipchm;dUZ^oFjWYq zm_BJJ$oGG81S>kAzX1PMOV>(H@Q257{@FrSq21#}@%IrCUR$ZOe?9D^UtC9Wj7bYB zn&*HzcA^qSw}HNcHwWv-%yw2=)H3c-mXh=9I%xf>{VuYo<_9JY&|&2md_E5dvLkn_ zIR>SHf6E&>gbEZH%vfV4cJmBhx33Iy*$m)?6rMTxM|OX{Yh*rs1c>K=iJO3LF@XGU zaMLbDG_iEBl!-3pe@D=nYmsL}spub7uS$Zv(ja$LV<`v|Mj9|EZFrb#QP7*?9fonR zPGK$%n~gvivd!1z&5fqPlBg};bG>+J)wQo5M|9x+e{>qWnn1pAfbKu#3=A_tLvv!h z!I;_V+~bZ*X~NS>&o7c@5;X))wg!uuPAR(CP_xlQ=EU3Cf9reo+3j6McuLk}JZh*g zA5|@T|6!RzA6l%LQfzsOZUBwaB){81DX6FR(G$gjk9%;ipPL~EO%bTv+49^c0vl@f zuFsQ0FG~xqfO)~hUl#e)zPq<0mto4Il=+1$P3Z$5NquFbXJwFQQeeJ$Ij3U((ac?A z^t_gQ7F?(5ewP+*u z!xB=g`jtr`izfQ{i_L#*1yN9BcqlLw%Scx?F&xw}hXt3q>K1WuNwH5xG&ve&Sjude&RZ+3t){)HH6+gEgRT zGi5YLe|WiOcTp=SBDb8>W$7raw?Pmv%M%aZ{yfez`QK7`yCJ+=w9UMu(fa0-JQ*|5 zrvSgYgIE{obJ}9w#0me>4s%JgNQR2&IznvhCi~q|+Kl2Mtf66VoUo-KL@wXUZ{P-F z)U0>1U-(xzEuHjCYW2E$V~2TN06*K!@*g<>f9~%|OgYut)ss^fFBIH;@Iv98U>eSa z{(v(Ih}Oa9a5ICXsZ>Zjkth%4_4VkEz4rRBCk{?U=5V}UdEM#J za)CWH055V9R`t?S*HX0?$TS$9%Z?(&@=w7se#NTq_0D-jb1^(d1f#l0?bgtDxs6@q1CtDF_b0GfKqlMpO&XQYM?n#=nE*4g28I#|Bik#l4L?Ao+#s9vJh>NzUC09g;k za}injLqV^UE}u-#IZ4*%iM~n+)3#t+e?H9?#h7Jq0(9qMj=!?NFSX)q*#GYM2Ujyy z(Evw69om`;6Pq*Mr^R~y`)+J?lg7oIDPo6f&jDvCk<*)gIhjmqBP5xwr&O?gy;6wa zsokkFZ7y&oZQpOyJcmrmdilAVnvqme0gNhuwtE3J^vlOwaM9`KVP%F>kT^yTf9qu1 z;dqY6YYM|QAG^xn(N{h_mh^*dr3Q=Q=*4i-o^n`%0>_13IZ z2`l)YPov>5BdFN^OJk~xoqRgK%zjzfg@@A2we=%#H}dA|aQ7>2Yx7S3aH$r=(o9M%IP9M*t zOTms;WGs}U^g;6VX==K8=%z&2El+8!XZER&_V+bFKqjh{tU43~lOA&Z>qV{rsK$48o7TB&7Xvag<7{SZ>}p;s0)tc zC3KS+QXNDOR&PzxW-v2Vgow~2CpVw0ORz8k?7G{#Si`Do8QV5zLvAf*4GEnEhUXoi zCW&Wj+l57kR5u z!oE;Inn7g5OxRscdmxs|M%KCNqEROMy@+$uiZ_R<{qa}bf5KE`j2uq<7*F9;XEX*tV+S%6ahA}Quv}{ z=FNKu{&(UQf9i|>6kWdT1$}zpSfs50O93eT!V4+dc>BI;&2!jqq?UxeobRE2EcZsB z@_!2rlb`{|`j&Wf_Q<4d?IfOQRAM@@TY=P?on(T4zDX!@eo)!L8FAZaaj}Tr zKPK_ALENJq?Vt+B97y9JtDm=X=N>nyE~xLKV^@Rke~-S`v^Ic~E zJTtGse@(*WIA^s;$dw*H1H{c}%v!*jDhyx#!GO2!^B|(6YD*z$*HI(V=mM zD?LmF;v>L}S$vuT8b(q6o1S07hQkA4g&`AYr-+1)B(#6dp+ZoEIYuVS{)#*P=R{Cz z6|>o%1Wb?hy@lb`$o$OI9AW=06>emt6tECxe~Gmb>(fIIY<4F1YQt_dLjWFJ*UQDA z6WeS)EaSoFeoC>@`upA+Z@DI1L=6%B8Hp-@;kTC%V>!#SrrQvx7T4==B%#FQC7gB& zxX?Gd%9B)YJ05ln(jpf>pLiGX5$i((qWe{#JKAS>H7LSn=+F7U(c4Y^BkriUqB)@* zf30I=Syk;xm5{_{G7O&UG=X>^kMj)A;TC_Ihd#+iYUNoYq)xzEZ0%Z*Ei(V8r->_B z^0WxWN(gjuCE2n$c+|3*ze@N0^_mwWy@uoiYXx3?_)Yj~ru0W|Dn?DcM zO^gD%q$2`^s}K$wH*P$=Kf9p3GN?e(@o&F-v`y3yQ=iX&icWazNBE!7|V79f}uLs7QkvJ7cD zI1#DmmTH*eOpIwC;{1=!tr=&yA;^QqSHLjIT020X#s6%~Tt4jHY>d50gptt&l!;|j zsmUQ`^~N~|JaX|aoN}zHz==uKe-E2~dz=?of5{nSSVu9J3>079t=wZWr~~8j;h2LwQ`8Ay0)>>?|z%fK}`_Mj_5EJpn4*Cs)-+Bf{9L zgP$!P^Y7X-F9X>)H&B*4SLg;9h=%tH7f|JKB>g5*crNp2_&A1Je-Fh>+53DrRBz>V zSxm=Hgj)`WxxUd1Oyjs8W6gBccD|@frOv%I;o)Q72|pJm-QKu|o&B!9yKkaNpwIEi z$OIsJAY4-;sC?LQ#gdQ+;Zk(PgJ>1L1v?GTsJO~E#%F}ga{0vfzju?{@!b$shQ{Wv z$bR+q!B71T(9F^be~@GrI`Y0SNk}u49bf|8g)f)kTcP(y(DCc%Mw5~0YBZm7J)#KW z_+Yokieo<_5;6GEi zuDRhzA&RqTWbAsBby>^O+O){#ffE4b5P{eEne~|EUS?N{pH4EU#zP6x% z5z{(WgUD znn%q?vf(Z(4HqF#6t>$Rp;IGV7Q4K|IT>0)-lOhz83{OEgkVqOt>ZzlYT@jqCZsw@|~tFzfP#h3p^_ zz?--UI2nRR=;`iuhX~kM{=TUm>k&+cuT+i?cjMB&YGpj1|aH+u+ z)sBeleGrRtk0hRh!aozM3MVc9Pe+kddaGAx=TBtLr^xM@|&+)%e zme}5oZeQ&c;M2?#X`^w=dTh*Dh~=-S=T})hSjDFv9vg^b3w_`tLA4A&Io!XAWpyI; zwdSvEHBh{BczjuqEwk*2-h4kK!G|tJb#kih@*X#>B`Q0+4#x-zrG4t9O##MrcW2EH zw2gHXfA*BKkvYp-U4*wcJL)-lu(<+KhmkM0T$JELH*v9(SJ3vP5%tgOFvan$lxIQ# z2Oo@QBv>i5o2_ZaUtpJ4XLrz+kL7R%Sd#hk+Vcm6C%2uQI3q?0K6Ayh3tDjSHlTWdk)3T>Ne?PbMFsB=YXB{_J{3uxRKIPpiq|L>u zg4Su?DftQAmtztC6Od)E5a%WIVz~Vm zf5oZwzr%A0I#Ng7y0>K!_2Cdv@&Zv|7L02jIR6u()4W$LRxfeRKD4^VBmz{)%T~@N zCUW?tYJMOvAB_403ovx{`GA?gAVBz{aWkVK^&i--<)!^7#-#FqjJR*C`r>$mwOe;r zVg|Zp^^OA8rwM96;&0f2IvB)NEUdGfe-Quitc#R@|7aL>+6LcD1G2{+bqc8A@AzQO z)+4lJ(xj_>^K@`%i2Fssl(`?`wf^CA#W=6N+lk*tN~eI!mAjilw(XY2Mg@0yuv_ug z!f|9RIAg+@QO964%=|f)v{ef@i4E{Hyfjz(2EyC|KAO?uDe~ov0 z&nI;Y4cS@V0dJ7G^n$O1bOhADL)wvPJWFxaq5>737bLA_NlQ6bK9YY4*=*@>V5?od zG^TU*UAk$aByaQyIw6TJ9(lrvFb$*afKf4p_0I2c$|)JEx3Z*n%Hi=eb1ll-6OM#D_*kYRVm z>RHSzWY#92&da?7ApawsqTb?OGZdkcSJ}vJ^V6ADd_>zXlW^d|n$$**hc^P8VSL5- zuh+0f$J`{zs(7;vlCX}hdVSCTpgt%UqoS#O=Bnrwo-C+w*BP$N=Pih3 zg3;uwT6dr62@8HWbqrIyHym%!nvV59-Cw6Uq(yJkBso3sGdDBSZI@NK*x-;nn5!2rUoE582dtmgEIXvAh+G}hD z)-6*RhT;e5TkZhb0r=Y}f5pGBsR)+HfKr-zTb`PGCP)Ld+FKoovE^5jNHkFPx zI2IrM*yykc(Yw3)4JQ^T_i@fir6~9*trR7fjtBjmq=-hyToiaye}Q66n$S|uvzt#I z4D>7Qmjd^D;_3Vo$?gLNEH1T?orW!)#OwAm8*Yo+AMXiTiR(hV*3xFX5x<2{(Q0bs zv=pscvvqWrDSDnLP?RnBrerGlF`jMQ=}49WQZ`;mBR)UNJI`mvRN^F4jW|GQ*+h6e zx?gd(uhD1PZM95*e~Dl{#jfW&6Lo41qm-v;_Jg%+))O>as5=9N3X}s=vLS?|oU1@p zQ9SHU+!CypB$-fQe`_o$%@l`qgK|2YBL4wAKZNZXQi9FH%Yzke;Hr3VuG%}!-yPFwM@7) z(Tw-)dd9H8J}yWh0{N%VeimXB88N2!j^*@9{wZ_YK`Z9sN)_;zzPQd{Lb^BS1Y{OC z1uui{EH)x6en{Y$Dn8Ye^VEVr^#djGGkoijeOq~?r&41M8LErmarX2~XLxxDqyg*Q zRe61yfag5vf9H^7d|6>n;t*cQR~#Pu-4epGL9`bv>pN6~7i;Qb0S}$#@$#fV0A?o` zMddhk#)@`~eJ`ASSPrvq0Xr(0mTSmN*J(rlgOzX29?^mUzCFD9JwCX_x*AzEq0%>Z z;Z}&QfvTh^KvRZ}a7GRWw3P!2-zWd-t8}S0Ai+9Cf4VOnm}P$lqv1#&+13Dw7G49R zzgOxB@aIU=zB*C)EZ2&7-5~&Z?9x1)_Af46f(9fYEfts8R_W(OZp1Akf7pB|ng{f` z855MZW9@G7tGj}tV(6`Pd&URq8=EaPF=SI#x|(h$#GiaDUpirGr*w^~-FXx(T0BLP zdrHPLe=?}-j_Ia~$u)Tj7QiI~9$M(I$FJJjhcaT2b(X#&7yAzY^vq^ytdN~&Cgbk4 zQ!kAUO*gi&0mEGJ*t`Gee6gm+`tO-?Au39TBca^J25jLGNke;KGphhcv6!xPT3Tb2 z$Pj9qV&cztW4u$sMWn5Kc?7Zr6y&d6=;Pa3f7$t@$PWg7)UB{{k^-1u(r$dakakAapR|QQvj~coUUuj_h{@EsOgb0e3XMo+!W%?%`a^#`1NuD-GA?zP%2Q()F4H=>cGCp)66LR*4u@gu z78v`f@!Pt~fN*%RI5Y!BSw(NHpVkQue;~i_kABQz_$iI_t=VglmSPFRPp!9Rmzi~F z$)4xlq<&Xfv`j!!^jjqZ!Bp0gu?B5b!)quM44a~m^mQCyEdxAKr?4@KsYJ!;mW3s| zh7*Q#*_f#l`h!EBAX~o=ZD-BBX8~bY2Spg0#1@r3*7Q`qr%a}V1y!?V?XOF%e_Swf zn5%e*Rbt_(b#Br{z6G#)rV$*PO#Dz3^M}n_=>-4sw93A6n6UPe@|I+PENlf1lkcz?~NHdkm&p1;xtk`L$<8(tZGa6++6O`Df>x ze&P5rk7||v!v^zFs^WiYZSEO{3Lez!cwqns>5B`M)zV!pFrPZ)fd3h!K;W;`;~q;_ zEknH?C*ESJG8s-dsJ+uY3jt%iuPtG@0M4?4TC9Cq4ZKKQW6m^6goggke?Pes3q7)9 zeid67yAbgkZDb-HX7y*7`>t_ACH74eS6GuBuK*hY>6L7K>m-UA*W7iSEPj(BD_Z-5 zxeZ&+-9sT*E3`{D020^h@D>}#&w(To_a2aam%2VKsIP1qL=3{ z#vMO-NFDJcWjNWBQ)7>!#UEc|o{iuflrQem^N3YcUrAw4+)V@|?#`SeQsu|k9P?V3 zIg|9eMpa%xt#79vK^dyk2*DpactrS$;&BfqxZbbLK+N5q$%g67e^Sh`gPKY`r)byB zzI|XKwVLUs^zWe4`Ja;!0HEq}5TyFm(Uld_-8}|kvUf&enT;M4^5O}1?7t+-KbkQ< zYFoVWKVWzr2!dYJBL7*jxmZ536gW$X7R5+^uOC&qfjSM3Mb>LE;No&8DKLNjb_8F{ z08#+eSqA7A)L5a*f2S|FqTNn1O}+`4gabibA6`c7aA8$Ks8lDa5lmo}Z^7^_Zo$B^ zAf!6=#zKzy)Z2oMqOE40VqKnmOCqXBZzi-&rGuww1-9~dAIt0{Zf*=QjK4`d<&I6d z$Y0?)zHNhxRq6oNHOoiR9l5!{O7n*dZ4RY|Eye-!oWc7)YGi9{RbzU`;2 zOIL>0b2i`;U()Lw^8+Udy;8_O@VLlu6yl`CTdO=fp!5>9n(|d6<6Ra&J7Y&)5pC$+ z>-;@#6Ilv*Pw9ORKAVnxQ}pf?UXy!*86v|~OPFtI)oEe>0~(FjW$st26$1I5(h$Lp zpPFhMM8*=)e-9lH=jmL!MLWkCs5lcLH&y}CcDP>KMdUu1Z~uz1$bL-+N#7sJXqExU z2{Fb+Yc0opxgVl4&ZQ-L3Y)6Y2k)x7k~Sz4d;l^MH?Cuz`oOiT58?~jJtG^1XN60# z3(>NUk>gKz@&WIf&eZ|!>j`MeHPOU$Ittvxubm+Te|mD>0!(@Mp$C@prfPb5PnIxf z!Xfq9yj}@V@V&W-?mW;gW3x1(g<7^X3iXd^DIkB%60-A0089hNmZ{=c>$#Tp zBQG|jjduvxet$;`!0I7Zc_o#SwR|*yjZ7{S+~XxRB$5Ru9o=YL3=tfnaD%(Mdyn(t zx%bqAf2c>f4?V%}yLCIQ=CApZvJs3f!8IIrM%=?P6~V{u&nlW!~d-wRhvo=OG=Bky2$I5re~T_?!y_Rs3(QMC04YTjT;K;XE13}$ zkB4Y58c?!AJ?e7Aj71ji4fCG9_-H((v*ok>cD+JLoPAN|_&dRkJ6~ByUKfj}h zB^U(i94{U7TRllUhZo-okrtji_1jQMa@Ci&%@#%^Xtdcu1^AwOdAzF`xk@X?PNPlm ze{ga1;BJ{T9l}Yypp4LXrguiGsMRfVKpLDkAUO*4(X~NWS`J&}&_;O#Z23tI*H**< zUmG-C9kEatGS`md|E?_-UlwT>VSrWl$wYci0iN=8uMJTiD1R&L9o? zt9+-jgPjR^HHwocHN{$`M>2&7*O{bdf703+>&h8p=Wt&No2+~&;19OA%`WViU1ZJ) z-uyMoh@iu3SY$Tx8&9iab`*_H_n79bV-qT!1E2cwpdM2K7Kwjl?P^Ue^Lhb$ZbDo%je^(DB zr~NlNde9VI^zbz+L$B25pzUe@k46y6#uLjYxa#c`j}MU3e21rxVm+r_>3o^&ezGf+ zlg@RJRs0!}PXB!x3F2L4^}vAcOhZl zc0X%=FA)F`Pd#vgU=YZ{Fu@a2e-k0Rh^T4u0q9(ugy**zTYP@zA`(K1<=O0_tq~!- zP5m-Sp03Fycc*u@DxvQVMWl>;cUH9c{^W@x1Z#UKtL{3Z=B!Pvkk7I6M(0@Io4V-E zmCnOMqmjo{kSS6Gr;7@k_E6^OPNdWzNl;sreg`s}2`n!khom2?QgBKpf2b6z6aP); z3xC+m#>DwXOkg)S2{97VAKT`+Gsxp5Oa^lao(2K$@Aus4`_xh0YZ*8O&|^j6ot2)~ zvIu!EWgmx(?vb?uxrpUC1KCXr5Grm6H0F_QgiM7v&Xjqmf1ZVq4?k7#Z?680Ls~SM;D{)2LTm?xV*L9}Ig3bvDgFyW zaA^Natjn4;GF~}r$lITTdvpwz8D^Sb!W;giZoA8L-g2O(pm;X2EHJQmEHT@`=t8VC zE(klSCLWx!`%CD|v&3+;Hw%Z2^Z`;^Q}kNDeHRpe;_hDJ?NOY}f23(ec*9e3!iR{o zyQ=E)TZ>&vfJ=_x2 zL3Am(0&`L`=p!e)XBG2!0?p4 zO%H&Moww|i#8L(NyBBVY8}ax$FC>Ff)KRc7f7?3{g~Su`oq$){1DYMd zGwGfETG`2JP9t=|qtdprZ$XPl^^Be*3BRxMTD7gsp|&yjFfN%tNb{cM!@`NU0BP}; zDRKQMV^96Acprv~fqn+IX$i_I9R3eU%vjH5d}Q>eh(X|!yhiv#3%D)cmWx#ufj-_e zQ;QIHYc2;qe{+tVr|UidS>EwrnTLoBd^kD$c#e?( z1h^di;q0BGm4j{zaF&W5U1qwU+QW<7qlfAugf?*`uD)LPT>rQIfb{56pD%ol5kKh8ij^4 zr8iDpf4Biv`CdN-H$r`seeHiEok^0WjFGYAMsd-sgFLkV@DsBBRGqS3RzO?SIM0As zqIxEdAfS*1z;m4Lvo0^6@_w_&!8m7yA*-9nsBYYXP4viZcY$F&Y;l#a2vBS}{P#b= zn~xsx)+q`*Q<^QYv6k>24@DcHewf*}MV?y6e}Ws^h6%B*6#r`x__T4S3qaw!+6YLE z8EoTo&K8_^52{>CX*VMHaQqs>Z(S!bW!0I>2(}7psBj3zF)T6v&iS!R8CXuOcA(7N zRQN(@v2Ih)bbUiya;er$p{yAyms|xwc}j)kN6N^`t1IH<$7z%_T4@CexWNkakLXHY ze}SnI?(6j6++?(29^Ln2MtdDCNzpj^>9(C3_332=tBzPtomEdoK%MiP1tW}@*8~Jv z&-OmmVcYpbDNU!RG26eUTbLb!jXFVmnqPbrffGuic6{4VsODhjt~4i3c6PdklIR7S z7Vkj|UzuJP?8~KZT7LgWp6zQk-OJKJfAehaeYM!?$Kci|zQ)|TYJ{IdsU$5hSS$#X zIfvYL*BOzb%kosFasvvSn^B!RTP!z=e0-W{b}*MiogVei47Vkjse#ETER_YLGHPOJ z$P1KuVz+K`t#Qm`I5p(JQ!vPRh*-U0>%?C?Iin7h5-Ig0U`lr)qizMEYdh^ce}LKS z^yGTLVX1Hz;Slc#ivq~vtyp`ppY?(3szw}ZNy_KyM)O41y^=?hwj=W9OrVw>sOk8T zQAZ3rptIrh-%@4qiN+!ow+XHu--1!1-7WE$?Yn=ng)8a)1`O4#q0Sk0GOTHsp+U1f z!9no2Qkdh(O^6&GHO5f=lJa>6lv z6f)>JMriO(#ut!89d$q}Ia5Og!K`OqtOZy{ok75o?0+crLr}U!eIk_G09e*hXBOUkiQU)IA% z{Qx|K(av(DN_ytz`6awCov2zoS)90L_-IcKUl8{@rT_?pjWQl-2hK*@&wWw6K>W%3 zTQ%4jlLnxJ`g*C_uV4J;(0VCM*q{0lF4zU?9K#F!`OCzBwvQR3u0mcC=(~Ja70NXO z0pVsdF;7uxLXG#Sf5W;Im;ajf^kB*fOO?WQ)GnS*?VL#Vp*(`2v!H)Z%K_kzV?LEA zew~@x9JV77dZs2CUAd+LT%=$>eP9?63#V_qf~mAzt}0VAcs$S_-qo;NUlpdSJ0=&zixYCIttMq;c8ZW-Oyvt@JW9!Z z+Ji-wGL@%ku_GbvBem;J z6;w{MRC0A5f4+*}JGquvJ4TOff=mm+u+*tV2;q{^70oF8rva?wRwKGDYIMP(5|i)T?? zlkyIZb(LDP`Do%(J(!CK6UW9bt!QAX5wVg0YCKW`e^fFA_sf>m^>s5bMpmc?6Lo;} z8jrmK%MmS*A-H3N`4+-|w{46;eA@CZlpd5~g2?AyNtHJUu70cD@ikL%V7t5&A!2`7 zGI6s87t)B&G(n(mzyj}9Chwv#j}ZYPh&iN|4z#x-JgTYwRU~WJ`+_!&V9X%k`pp>> zGVUnhe=#eJ#yVWkPv^we;sxQPS^WseA(fX`>cF1K@J-Kit3BW?mX zdl2He2BW=y(+U%1X2va%8w%^$o~2}2v!||Wf58>G-;sav0}p(ymN$3kw`X(0P@>z^ zcj|1ziBEZ;Uz=g0g0%LWIp$1Mpe8T)LENQIpk-XYfK>c&_Y(=r5=w7^h??YPP>`e7 zK}qbH&^i3Ym13|1Qx?(mY0y~0@YNQKARz4WgB51Vg-zVx7<4Kpzqw**Gq52Om0pSf zFF?@0(tm;JKOai3Ffg6p+_RgVLHJ+A0fp8s8$U;sNz?U?j@}M};yAIRi+YWAMq|n=q>pM&@Z9iLtIM}n$VL@U1cz@hoH>@TVK{RnQ!Lz{5K1Ow1{+691 zksx`2Osm<0=&Udo_L$(NtNK|pB2FBrQ|W+8B*hEvuw{CUjVQa%-o)2UYy~8c!3>{> z?098ZjI_@v*?jARU0lcHqP7>erYCr%^h!aX^NGbfPCJ5{7OYgLE}MZ)KLESlrryr% z_kXVfr6T2yQ>{0tL?`{3yqVBP1VI4(Ie;p` zNq2_8oc41Txz!6PR&$^Ui9yQak8F4pEPugn-utfsN-Nf;xV)}4t{8xj9qg@bi<5#n zcIArg!`cGbdi3aH^#~~(X`Y#aidor$p}3ObLp98_Hxyix#Nn|)_#*i8C4KRc5Br55I93qa1lS+`{=*{_vd|8 zlp~Z4V7)E69FT{p3cW$JlaWzm7k|vpF(!$S17Zd%7&`WbP0j=!h<*^=xq0P06 zxVfSfbC+#8AqPbRCo=Oi!RJHmG5>>B=_E+@NKc^8!WHTElF!MJ#jD(;UGk$fKV+89 z9Odmc@1bw25`c&5CmQn+Z^omrL&Rf>um??fOHe5-u9DIGUk+kdg#kZ##3 zWvU%2AM0adT83Jy)D`+H9l`k$r;BdZu*954<~I?^IACP@u`Q`)KoanH;q4HQ1pE-giDT`VGK09 zJx~Fh`_GzJc_car;L5+m-UWVIGc(#>*N)8-Miff=nrkZsdA7o(e1FopfQv&(hfoJM z#d(8GRy#|immD~iI~i_Pu(LAbOL7psra&UCK9oUMMf^!_1F+tCu|+PNUj^|pVm=%h zq5G96zJjGB@pt?i%NwGys=0~RVi$;8-6p<_fKUMVKces&_d24r3ODrE zGj=}{DIjqb(;2j7T7NOyfur8NeAN-$S@p-X*z_M0lweoPt&vWpZy~G?1FP27cx$>V z+Km8NTN0d|9;GJj1z@NmC>r@)sizT7e*W?EU59(1WcAY2Rdv=w^kb@DX_74HQ8mZ- z6VNT5yTa^jBJ+Zi#{h^dCK9S-&hZ*#kYqtB?)(&2(_b(3I)5FP9Y7g_j_uygisluT zs;D+>ar(g_UO!!@1KsfZ%oDK2@xKP#9GEEYbqeP~G#dw|H+l5j)|8H!JP%S{7gn~2 zlP4bEu?)x#u=2V&JgQ+JI2!baA0pcO4;OOEc-3hTnK3w>Kk4E0E zxSF>IS6BpxF@IoA!lIN&elm5NC~}^Kop4D&ZlP1>h#3`4qkZx9e>nrMJZJg7*D_XM z;#KU)61mNW%J$Azfs4iHfHH;&$$I$1!%HW1@kD#Gi}%%BxSp?s-r;YK6Td5u1EwMw z0$J*g5Or#r6AZWA<@<`z9`1F?-PF~sJ^t;AxUhKY^?#eX_{99Zm0u!vs3aw&UMilQ zg7TI87tCYDApuRx#xh7{c$hR{pIo|Ihnx~_rtnpF(;Zrk^Hh@3^jda>%uHdy<)ZYu z<>!4^zV`gRclefDM-{|imN3j>&_qBsbF3Fvg2q3fHc35fI3Z>OJ;6_`S(LaZEB*aa zmZ=SKR!f(s82i1>^?0!y`D41vHYT9%UsK z>vebkLIVL>nHtk4qg-o!hVnXY^5Qw*6Oi_b*Y>Q%lD@40MaBJ_9hJ~=_4-TN@ zB@lhHzcgkGoZTr_%^w(qV42N|@R%PDgDGm4MYCH7wX-vzT zmwy|!X?{>=mNh(v>cLq`@wqa45=h!;owi8FLzQkJE~Ty7he8zJ#8ob6uN6l8wP=&#IUW_rAe0eQx8?dD>X`moN?mSHpWg zQfmB!9O%tkkT5~(G!?w}(26Kr(p;6&^KvNs>Q`j|W_2KJlr6S&d4}ytxH|j-XMe)s zlomp+{_m@lu?STZh$P*!w~CS-F#G$96V|FI(*!!bX5=w^q3zXBYg6XSn^VPhD6*KP z4T{_bTy9;#_EhQJoc#^v&?HQ8d%3~N!nRJ;CrTuu?G}<`KK36jE{9U!8BA0fuO4Pk zqp6sb=jBbHg`%|5E*{Cw_@!q0g@3sCcKVf(m%oFA1*Dv;voXF$LJiCChLOg1r9{I2 zwX332MWpdMs-;q8kd{g(+k;MptiQVecD?dNX-xTQNz|(RFH^r<**OR5dfA-R38oq; zR0@FsIK3Z}Zo)dC_#dYph|zhEVWUmJScYz_nJYzSK%q3S%0$M=&5X0 ztNFTw3Z!o#F?;?}*8ww5NYw~Y^j`}#3@Bf;3@*^;56fgNhLm6$tD2n>@aL7kKneUZ z8C4r1b9V}Eq@ZjfC+<0L+2Opu`9S^ha%(B>i;ZYHdoYe^3`FwU$x<7`;#P5nIV&8r zK7|*aBR7gk>+LP*@g)i2CVy;9EBP-==~V)x_6@$T_R@(DGq=NKwHKIkO2P;$Jkbd) z#3IFtY6W6tLJd`ntOoVlsx3%K#GHNzy2u-1zzggQi1BP}0B)~3R9O@8)c)P}qGen@p-k|MKRlGe)Ht(hv>1AOk1OxxO z87FahbXG+r#Y2_Cya>Kc zVX(5;eI!iCzXCuv%deGKXK<+G*K@iK)6uJZLl^})>28~td-2-r5|9_W3}eE&ZKev{ zO|!el)KYSKD|HN6?fp*2O*X1S(oUVn=_NDh|8<3ryh(?IO@I3kN}R8z%aYQ?Ingn^ zOAK*l&Fml(-A}YXzAGR1YLNsYlJJOhO_g#^%e~O!-M$Y&i z%v{3B?5_~)(h1)kqanX*K)aGh!pg!QFb-~C>A>Bs>EtlbiW6H>;&k-l9vJD~^yERA z$N7gqt>&^_VbKbL}K?w<@;?5x4yh%mP2QD<5$RkxQX_+fik}-^WJFJ zIy9E7!tIcXH|u^#t9xLcXYIs&#V7j7QOdp6qEr%D-^%&^3@Wnt$CV3ln7)8&uDn? zz&)FpKKHQz8-+~DFGdY-yGW~^<7iPok9=# zg5~b>;!OUd=l`ZOg7oL`tz#_W{|pn=tbZ(x)Kf~A{%sf{_dO#iPT&^*8*wU8fq|Mt zd>(vM|64fBWzTcC;=nEPHj53krPLcQJsLGf`A1SGR8A{VWUiq&40t(Zt*z`dS`D66ZzsO6_py)zLI@;n!RG$B%o6zTz`-( z5X56k`!kU&C=SMM`raFw^pCqj5$xg|6u~>m?`SdYX&x-6T$2m4&j5=88j%V5Yz1j3Zx2=edaub zt?9>xvb)nuT`Dk*MsMk0@Jei4=YL9Xx^&$tG-lZKy;1hQvsFEeE&)dK1uQlJhbD zJFqy$)P&}oP!>d1AafLsXeDQxXs+O$G9t{g){0?Yd;8naV+33|=gOOX5W9S1ROUT- zaMu!G z&L$YDu1bF>iQ|vC`)&1D=O#_nlI-%9+y@Xe`TGpAn8!#NPn1xma^v~V~@l(#>w^V!+%QiX3B=c7)JWA z`l=8U+<|ep(`T8+_=uWutarejoo`I&a58Z1Ca9qqY|mq`>TLlXARBBnJztpHtiniP zQdVlBmH{1L=G`M&){qL?y99=M*Bf-gqPrDqNG8bW+h0`o};&^&ewS9jN*UlzFh zCTV5u#@A99YV?Y?jej|*=3vcWa7=x&Y9K{(Sd8CfM-Ao_@?t36_+wStrJKi3e8F46 zW}D;vnk}MUj5)6Q82izYtLOc3E!?8UvRQmo0}ja>*iw&NL3}o{O+16U3K}IZbCMZ2 z5OHL@M8DG|G<1PwLr?1rP(ooNV20qYR@H_4fX)h~tC)OD7Jq@P&OrvZoLH4w^~I6f zj%eB$C*>)Z=jRx<{TNI@3f(UU)0RTAE@y>;wRe)s@OReSRsCoqFa-w1F+<*gJ(z!m zLzG8{No)q)t=%mWU zE2fWRsY7?R_v^;>zqHSV=!SxWHq>KqJDB9mof34x0z@xL=E`J7g*0-lj1ncO(QY1S<^#`l_ zX3ZK&3`Wiu1KRvLWg^8K*!E7xYh;eWa8xD|Ha|2ahizVU?9+2I7J@~eUwWT(`6|^} z&pSSJzF9Pd#NGPa0N3TOH)zpHl?yLrG2)DQb-ttB=86INklEbe9ou9LB5%0G6W9!F z5jEEek$=uHjDg>7qMc)|y(Sj|q|fRIUq5m()Wae`CbmZpezZd%1*(=N*=_eLxbUdq zbJ@<_YY-;jcmJY_UfhVQf3-Cmz%zlmOSu>{BLZ12H*4E1s_`#N2iP5A`Kz>4mghn5 z762633EU%nPtl4_^i_J`^F(ms<{5OyWG3vU#eZGAu|Yniwwdu9-xHrrWz|+yihj4t;Lf7wa9a5HnACF>TCZ9?hgGWj43KK(7q;+?& z?(idOffAT8nxDTSCz3Ak;y98(3_Q`3H95pH(x-iFV5k}sie#>R`^N4eGAZediO^jI z`+w&zwDtim%s3#O-e_p^kd0o}P6Z^_tN{K=k8d)DLoxUXf%2n}V8OU_-r(@mx3R_2 zu(VsgTfG|`X{t_Hx4TIWpC7-t7O4j{Wm6ZC%l^Wy2cfAsyrHG42=rCey^ zij+?Kp{RACcv8noGCBo+w{Fzkt%^FX#y_;1CM*^P^X7cFrJ7PPvn-B8v*1$wu7Bu} z+?{5@P@V~Bvlm50q_ka06+a#X9gc)`@ZqgLf8o$S4wG-1Q1B>rxPeV??7in;a;U($ z2OfWP$3`iPko~P10Qo?U@&}M#zK)bTsU=@@hA1#mPTu`>606DkfP2gOcEXQ6(qR@# zH5bM{N*{*6YwPO4aVaknyS*CS34g_78Y$ux#3M6J{9wFBIgkC9Ea44W5v7?Kc9pT^ z>yT;eqrWqPYqfR`RabfImrE#f%_?45PG8{tkg$f!0jJTFv2t$QcQ_^>NWteD`9~YV z1#;B^35!rh8!9D`LRog%3Wiag4n!ZZsrf-nzHr~dPk~Y+m1f*mKab$?(tr9V7;i@{ zsTyl#$@MA1bBMFV=G$I>5_ulMo`4pkj=MYU&y%Fy$Gk}RdRrTZ$U+2vG)jX~8W%dZ z*afPC_!XSL)OD6f&om0QHwV3_ z{Y;cK2`bcYD&2##A8222>&|2k5yDq+K=|Y^$nSy`^D}|%)M$@1_ zpWE4+AZOxB*Fx^YD}Q_ffk=O^{n06AO%m4DONY*U);)-QahSkS%*mFmXRX3UQ(Z)Z z2Ai0PowhF0-G;EAm6RiO(5r8m|3U|jG6E}_Wtk4XeONANo*fNs1@A&mE%m{=2rrEC z+c?DDJRVrfwuDJ>(=KLY5PyxQn2NRzu;p(TaH4Pm5v9|?(0_=XckX{PDlDu*XB8ba z(zGvwr70m9T$d7=>OKe1-Rh_*=VxwCLF*-E0DSbi@Bhn0Xn?}v#gA5fsET#q(7~xW zL$po5M>d`~(CWL+ginX4vh>jo29w(OOnXtTFmw7KZe0UU>g*1~Mq%PT4Yy*^$P%xA zkMR(*R_x7CW-YfZXMR$Pj%yC(xO0L)h{5NQ3aNaiRnRhotV~7y2m+8u5 zVX^Bbof~puZg6AILt{SC#}aPiOh$|7Cu&PP(Do5&^?yxQzgMtgX0|gJ0ZBAi{#R!y zW*@uk2l_ZZA7S8hZ=lB?E>-;P3Yya5#N=kwX=YxMFF8XB!s67sWxgKCev9F9o;<=6 zbQhdJcU z%SQL8`8^}09sPBM+3SDwPJXkH&Vk*j!kbw5yaaXFL1e3et?#F$^mB)C1)~{0p0(Vm7ZKKtP|V%TSh0-2vEQ30y+$H?ORLi-w>ob?yI1DBF6PT zMt?yAH_2^7Pe0RV&qHBnDzN`ModjlG^?y>d%dm7=r$I1I6S?FnNtc?)Mjr!uWK39R zjyFd9sc|DZcfxBlppLq;ephf=MlttK=W6RdUl?1P$QRk5lPf^th=T@NtHB5q?EO-# zyZ8}Nj%mP&5LMc)62LeR7Tbqo(H?`Hoqsq#757mU+F&`&iGFh6nH3mme4U#J?Z&8} zNTfnO=aCkeo$t+jer!NhOu?vW0Z#3IP^6bldjHG(3{LORz>frIoPvOvx2)X-vRgaA0>+OjwC!`?lvVk zUM~T(+AK;~lGi<{x)!5;IDd+XX!tg5BGCr_vGuM9iSjZ(UTb1KZj=KNU5C+rif$Ze zFDFp3x%l#<(F5pnf6A_X>^g}YY%@qkC6A~+at_b|k5fh(lSIsV*9+*~Mnt1U#$#-F zAU@ae(#&c^a-sEJ7ts&aeN`tWKPK+Ed0W9 z2&-#4Nosk(RwpWY8h`AVpNYykWq~%ZAOj|nGu@k|+>lu+>9fFHOoR6ZJ%c)&N4sdH zs8+_QSq(F}i7a{%oGBktOL3Ji&c_z>@oNLSsiB*ynmWhhWS&Zy3LO8|>@I*K6;#@?1_DEza$6gUUmGx_|r(ay49CTTJ+4o3$-c zPzLq<0sy&U#*0~E_p*A=H!9rSaW#UFH31z<1WCv#JDBjD1low?>f4q;0-8SaSXslp zo7}buI8IBF?J4K;uNv3kKi~Fb?3>}Q0vZTU(e{6tQXJby>pWc77Yr;w-e-|V2@PsC zzHiH@X36_8dwkUti*rcE_<^{(oW9O>p<@qZ~i`)G5@-JCL+pUvwCp%I7l zg4y^Hwu2da0{2gowNpougqj9a9i9psV5$xpHkU{>Oi|3-lgt6V-6q0alzN}djrNcR z^G7yC7?EVonn)oXluH6V>a}^AA@H+|yj$i&eKAZ7ga+-}>(gNLkf=g;TZ40Ak8}jF ziu%}#$$v$1b?+hXips^S@5kH!N`?1FuiRSQoO=P?eE7s68Tn?sCv5SsMe2AZKtNkH z6S`NG+j#Zo*Noqtt6L30xz|?e7&#c0BLP-0h?aG^+tYwuf8>}eh&P#}0N%rPYJU-( zwCGfX+vii>nT)36NNX57c(Z%@(;=LaJgK?iSAS&8`VvQ~-XIWdJq^Nn=rAJn!;VKD zB)Vsnkh3KV1xQF(dyU~130PZ|K?C!37#^;jgz`u6Efmxo0lAN*O$v+nZ3|L7N&3*{ zrFl~I^_8GA%nAS>F16$8Cixrl_*yX-^%U4nKa%=#jrLJ1jCdq_z|cbGRU+WZ=fjPP zV1FSUn5R!WW|T_{gMZN5PhizoQ+<2Kbo2;MT9lz*7JPWn9c#4EXD3PSm65MrwuScB z5AJ!UDuY5|^(v70ok7YH&2iDm;MbqJxKgC}nNTLz&vbIt7_xnev<2ydiJ@m>tE#SI znJD69z3^Ucfc#NgV&2zZfI$WVnc02r9e*8$b{?!97{q^=qpUU<`Mj(}EO_(;;mnPB zEVgZ=8n|>{c+>(|yGV4PLRiv;a`8WvoU|>kVAX>wj0CYfr-rK;8lZu0G*55)|<{XZSbd$lN~-pYYqv z+{`-mJA*C>UfdnO)d=&nW}HX9-ACggPPFA^SP{Yr63d3Amk-E&z45PyY_V zbfjxKMVm1ii83lHS}^8f(RCGw@nZRN04#fVZRHAgFF zaP4W5uN3_hu)FaEv37=-pntU5kJBN*k}eY2F|fab)5hiq3gnoKd;2 z!_obkKNbPDKVL1$WlCc~k^j%WSeiRE+dunirs|Z~REDp)wIHcnu786fKXqcnC3tt8 zYB?05iry^!aw$l+zfAj&7YB3S=}S8zixo&wMp9GsJvw$9Cz#HAng{P~9LHFD)WA+( zknG9nX0sKbPu5lJgRye5Ar9oTK*K! zl^`TzsOF#{9S(EKx`s$B{AK|s2*WwiqmrP4mrc~vgWOtz$+fpJtSlQA5E{RE!(>N# zh#Y2&jsqvM#64BBO+VlYDm-y*>~l8k?eqaf;d^yo$3#}D@K|@ zF^l)tydZ_T)-oE!{9-i*a?ec7RmUTl%t*+9)Be`M?cOobOuaT&B$0te0GmeT+qlnb zpYSjMY|Q`JRe$)eO?NcI6Lt{<9Kw?#mF1%()W^=!x!OnH_@t|zSm~@2C3BKkeiogv zcUnLZfc>n>YqZ^PlA}plyu0MelasTs|IvldQL1pz$Bsk%hpzuE?VC3#=52nV1l2Oe zYAya^Z%MzYb&=~wGk{IL{-D}t7svj(soW)Z(HtfG+kcZ+qyi)(FM65Dxd4?8lb_|_ zxLOXs)A$r!IZpzfa_K4;^Q~@#d$ZscU+QQkUy1W)R)e8V><3t`7l3I&N1_xP?gL4n z-M)p^`Lad9p`P?Sy>P#VWdT*A7*ha$`X&O<4kVS zWRG~@%YVSz7fwWIlG=7U=G5qSG=a9n!_Y$e&_nX1>3Rc2u zWH*D9n$sTT8uXh>`&frC)l7I0$H-op(jvm(0twtZsP0*gHFAMF^ z8|axY1i^wVbKeG9229exs^>(3MAbwV@1mY^_ zC3on`x(3wX*AKi(dAGS%skG{*fUQ0=ZxRs z(;II7=TV^zBzq!vA9Cmp{LH2`sY6%ftdGAr z-%I?(mH|gNt00C`mqS9V#AE~?wBuahH-BmQSKwNDmRJ2zj3eN#i|9Wl-`FGCd~$=} zH8H7;M>iQw?3NgdF0V>N&xqJjSS8k@)=%{LoEAL9etjl}XC(;maId6u(~XX#YelfQ zPr-}<`Ml?9$evUtU%q>{je1O0&WHhM z{iC>9qHInF;nsI1-{)>)VAIWyOORFsn!#1Oi!npXSmPHi++xpEp%I^x%EQEL-NN?Z zG@~FC`#qYC{wYvA)dHmL<2%N6hkq62cs>V6TE0Mm`V2wL6Wbv;OldS zVYfgU1YjZ#?|dtZVBWx=KZ4AQrs#=FSRNK+dFwk@Lv~2>+uBv-5i;bPUav+6()fuz zDT)|4V?lN{nIRApME0hd(B~J04w(MNw;4AK3&02)cp>@yv?XP1I>J8Uihq-TmC4gt zptC-}QM3kud+VZizEaG`J@967$VUTINna4Yq2*4QUc>G=)7v-G7|;I?OvqQmvT4~D zm*x2sV&3AYbLT~5i-yAr?4uz+mz>ahhwKe{l%-w10g*!KUoF1N&o|St4V;PTM;(QH z5M&-y!2%>Q#E0s_Fn*%l<$n;pO!sI&1INhGP6sFGK<2jO7H1ylXi9<9@m#8MpU~+% z%H?mCEqG#J{|PfwCyQ`yCIK?=Dpg&$?bjXUK5ej4y>Q0^GaQ7je}V5Yb#WG~UvjN=uhQq>_rDOqE;?Khx&VMyUPJ!&tjN&Lt zzCDVvw_bdQjTHGVr}!$3bZ|2HkfEQ>zrEkZtsotir-|~~e4-4mHdwQ8H}~@#%|lyk z^JH7Di6x(e#Tk&_^;8CbOqzcUEA3J-Bu$i0KvIQ{&#tWG{*3Xt8iudw{K1^p^Un33 z45c&ICz_N5IwcTogMWULz2)SY!<&VrBlQi+#CTJf%V7~Zi4$hriov1bYzx*3S;!^j zpF8i`+LEvmtTZEh*e~=UKOvu?)K94Mx)IXC&u&a@j1dJJ^k|ALr8qOZH9n4~!npH9ms(vC8ah}-Z0fSroHAvBtpe)<)X;Z40e z|KnB6S@|>D*6VL_37aGt(!ikV!o1NK)zkXGBBH!FfzMxt_-Bx)M?(0{z5~|t>2S2w z(k(E2|1z)aZhyi=#pL(9oA&^Iv7@GOFh^PsTBDtvGI%f=z~8b(PtI*!h2T2NS>09j z(bnmfO~t>0g2L&*XZ&5I)?sVR)4$b@RWkTW)k*;hvE`~$TiKlg-LT0No!@29^iU=V z%)?kzMzKK@Z4F**uH<0B?AP4}>A;>^l9Zc8mnq1j0)GH%$?~oVASI;llYA)jFB?># z<2fUh1~-yv_Dvl-C7qfI_qT#zR2RV@?!t-HJX)R!`brDhLC!3tpfO2zsCugvm5t?U z2YX-23^RIo4m(fPWji`tJ1KQktZ650yMY)Rj0=J&G8fXPs^?j6Aa;3_pj4Xhdkfc< zA#-@&bAKks!%q3TYr_w$RvY%X$c4`=z)}95X8V<|!n;Sj_K3~BolERUSIT=o?B>3W zhMX0p{;1U2wbeTAOw|>V&js@4tiY%J`8xSxE8*$CN9?K^Y< zZ`2Hwfrg2) zP4~NgxH35kJ7T4~2z@H9Inh`?S@6-Rw-F?>&qx%Tk1);X8J(#*C_Fnj6cL@PY#Gm(6&B&BCmzA&I$5|9rd<9bar-6&Cn|V^HYQ{Yz6LA^KNXR4ki_V_ zr9t^4*4)0!eV{6d-avtrLn-*8 zJaI@LS8@d|fEW{wp?rfy>E0!c6Z#*2qb)h)9zhr(|Czx$sHyJ+&hBs!o@k_K{eL-4 z6ouaoQW%x6n$a2A&aw)qv%=+C2{Vm-=d=!i+^{itECbGRe93T11^I@9&_vz&x^C7S zTsv0R7knZNqWdH)xhbLpPJBeJE3mry<3}el`+_6%(AV_>!`0F;D(~9pX6Q zJN~sdHRD_-{x1<`Ht}sdL!S#pGk7~7s(1?G&JCi_miWL1%2bC3Z=J|ef zu|N~|1PepMPY;LIR4;D!KcEAP5=?tz^-8IqE=S%i-$kwpt+%raNmMZY>umyc$9TxG z2VIIEv&Zccvr=~!KuP}&nB?|4tm z(ZbYxmdT6wP#8^IDoDCZa+Z#wVP>V_DJab#sGrSx)BWR ^Cq8f}pwE=AAXGyf9zWW;icQ8_AD!T1 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

    kfL)Pz#X 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

    vg3kEfmep&(3Z-u?@zmX`{0H`D*1*y=O zJIb*Aj;k@OJ}mwB7Wr9>4%GbqkDMNZu8GV{NNk3>qo#$(!VbHb|wjGrsI04Aq)T{ezqd$>af+ z=h-k(p2C6s#<#%;+fmUU2(?nQIgmDG$%#ej_g#x8t9;8O-DH5pKwfisVzvL|L4Vba zF~{8_rA9qctY+SttAPzYIRjq{r@)b-x$<=VL0g&4@a+JWr7aZB@(=&Li&t(kILJqy z{n8!ijd`=^TI>8h#`yR?N4^V#SiExMSHp4LhdN`t3-fYtkiB+h&j0}IhC)y~pXj{0 zapO(ZX5Tk5A6m4Si8-N;TKIu&nt$WHci50i3k+ge1MJ?*ut^}0Bw7AWO7N~>XsKVk zWbgaewrLSNfUs=pIkMoTQRZr^fzuuaakrJ7jrda;v(V4PniFJpK^hC5LKlm~0$Gi; zM>EMiHWWVer@Oc)0fdKS($TtWV;Lv~E(k-xARmF&*v$XW~hD8y+hfJ##T+xtK!=$rbqMSs7=v||HvvTF4sqNgC{6BZF(;Spr z!2O!?-L#u87a7G5=Qkx@xTUr#b(4fXJCSM>~l7A;UcVSkR{=zE=lH={4#7fIxp zU@OC={i#VIhCC+WnJmuF)oy6TtOXKJuEOW=ZFIrdhOq~aq$(OXf%=iYreYW$MkW88 z0kFq6T!YK~1MzobjbCt)z8JFc`iO&zUY?mM#CkYgFgX;pUsReG!)NN?e6jn`5j*W# zO6+dL&~N!RCx3u=8VD3~UXi(ilCj@8s&a;pHi z6997rgjA1p<%sTGq=eR!)~wJlbzn&j8b)Xz;)PAZ6$XY52h6iD}kItI%BZ zURwggbr?S(ACZAUvmzD0NNWZfP-vHOkAHNb?Q39sg@3i=%Ja}YF_>6OiqH&_uHtdn zoh%SfLJi%P0O%9dMTPRH)ALeCkaZrwh0h`FXQf%EsXIao!=ip(i@jOLbFa7wRW`ZC zbj$tdGx>tX1C4>R-G*!D4LG!x#AXExr~;Sy=0PC652WTVc2!Oj#Sro>r8=B#(=8Bh1Yjw-E-*VUh7nx0o9`=+Obc>#^G6KNDF~lm z`!^brxb$2?6ASdIq8iM72~sb;aD7 zEj$@UcPoYe36XEPyJHSZw>!4^!I`QLv;FSPyb&tvK;H-nd`rVrB(<46=2F>ubR?#a z>5OLg`{nE7N=qFrXo$Aa4k2Y&v^Ajf&?lJrlP`ttBrzp4eTdYf6`u8?9#z=T zvlM2j$p+9|m(d|0?mMl_=$nZhCeG@8R}bIt;8a9J94g!>8aq3o znf3*ib{Fxsf^AgG@nMwXyGp8JgX0&SJ#8=NzQT*VagW}o0R-zsIij3nIW!;@Xn$RK z&Up=-5~Rw$4$=X7-brh$ls3W9nx(rNUo|4w- zk3T{C$Yv;)r++XeFS&IROg_pFHbI8XkwJYH4u zk$#P{txB5=x@mxX$Dq#ZRq%K^tWq53_SY=v8I?Ks%^!D!3GZ*so$Zn7|F(82bBh&bg!&+hUfqE9L*EL#)iO$9d$*Q;@r|W|UTYo%$Vd{Q{ zpgJ2v-VwC6@JaFq+M8=Ci>!TvaGM)DVBHnUcSk{Bm5p!LNTuUr=9qy~28sZvu&_Wv zyrO*{V?gCw0a=SB{q&N%PVO*kjjynmw-fGvcvba2Vxct%tXYa5Ex*ATW~8(9&^9G& ztoG70V40`M^SHOj50K0TR_MO?p+cacklvrFU^A{zfif z|I#e!u)szMT?VZ4NR$c)&RTd1sF{8_vNHuj2S236ZO=ZnCQEHxdNGZGctYfB>kEQx z>n;s0CBr&g?B?!5ZZjV6E@4?8uoZO=fXPm-m+w}#fL+jr7bJ9MQGd{`DVgxKzV{RM zSY^PD@MIb6Du=}$0G3OM3mO=ncZqu-N&r%%?A<%Ibc!j(yR&x z&nNlQsERQ(L{;#_61Q%-1H^5!Zi%#dStbfv)LL1kQ_oKOYB6TNpt4kxueSLIlQcqT zLYvIVU7rsYJe*zlihnGQ@X5mm%ZQRkF9R0++a>dJgvq2Nu=gwEYf`@LR^u9k3ZqoX z@aMu6O3HLgO04fMr;<+|g)Sz{&zRT19ew1ie1FR|Kw&oKIi0~R*{RxSujyT$JeV-A znYNTKjUaD?ggy8!ORfL8kBmcGP2vcT4l-x$s+E`@Feh3fNPi-jpChrPx0 zlXj{^ZhYBK4wl$$ABR){2Euhw*p{S)w$i#WVfeAM*t6nI-BK`x*o_mnOD9C(%DLv! zsKoLYd!EDc&dF3?OXkMBUWsawmd2Ra>kegH!w9b}e1DMv*RZ$VdnK+@!(0IU`e~IxhmRP_oO{h(@C$F-yq0eU5#wz z`IbdVne>n58}SQ;a|Kvd&_Ajsx2!|>4^_^`UG-v+fN0+#P&HUiMp?I)nLw_>M| znX~5VHuD~3H`B_(-vR^h*zXP0nB|SQS3U5tyi#B~sckGt41$o1)U-44v%FhSWdQUS zZXgLvWAHgs%8B%(=)OMald}ZSKir-@a)^>RDP<{pM$`4LIy^ ztaS==;32D#)jZRKGwg#-e_lg~30Mc)k3T=FbR>X%wfV3gB+g>V0b;`nJc%}WXG`TQ z9)Io@vblB1b;hvP`I3okV)^~A08}Kg~ozjg!04yA}mvK&rwfmpiGulppx7z9T z*!oTdg4Xm8WSQ|eN1JNQ^H?WMD1=MF=6^na&z?*}$_mndB5yFgFB;48o>)xtW07s? zeAl{n5F4XUuJ|JV0w?|mVbNv=k;jFGu}GerkW-s1kzLeGUbPQ%)OBGT+XDD@#-$-_ zf2GtF3wJ*RnZK8l2-$@H4E?m7)Wc^Mjdv2|SVaB_lx#4<)hV+;|H|y^+wFX?sDGFX zjx#SiSciahW4T2*kf|>6J@90K2cCD<>N|(OzKM_Z#yj=0`LphCkyHgIWe!?J!P_fN z<0Keoe@PG=?{N3EoHgJ>z;zkc@3Oyv%$mr$vHbkiifR1MQ{NKak5N)v60U8@BuHU@tvL)v{~$ylv71<53HS!r@I&b*V` zg!-|(%Rbelb&^*y8s;^A%k|YMvx*`S$3($;31aL8BT$PAt3oaJ0an!p^|==PstFeu z_V|}qJLyE54IRf@tpN~7aDVF)gt}iQT=R`}O|>0MmIlv_i`J6E1)fpo(!FovhE1wT zHTuyR@a+MOhV#e`Mfq>|4UcZAc^HF(p`Pv6Ms|z%=dOsu8AB+ z9oY};9-KOgRzKS|2J!uB10T31M4!PVh`z=!q}H`b%Yy@hib;KQ87a76i=i@x4du@u zJG7zJHb(Dtw8-I$^nUIVH}VVfNVvqvk$H^4=ZtbFK`53dk^3)pm>fuh=L#nY_>N^Y zB~#i5zjMDq`VR;bvVZUxRQO}F`9ioz)Y<$S-^iRo+I&1=%afc1@kVm1v<$}}<}f}+ z=~NH>+T=`-!ycHpL}{%GU|SfbuJmc|_sguJAF}=rbh&tQ2fu9F=#&Ftf(tUoGl@b~ zV+8?GBG7hu+Yj&~N=;ublpU-;Jx-n(GnCtHL=8@q@i=&8>VJsH_wuyGg7iVPq~bAq z6d_@q)uv~((#W%j*L`qm2BY(r#(QSD-#p&-2fr|6T&JkHPs1)JodA`ug_j zL2Yo`$-@(^8Wh(V?DpojTPoIERfM|99iy|QnGDK}sc;w~iZRDVJ-6E}zOiW+BWU(J_ zUA%0reyMij2sdS<=TP91B4yhoX8J1tW2H}b9*7K}!++Ia3ch}HOOdxL{uTtS0|~=D z@|e4C)>%~N0FfHF5)Rus7VC&20^HYME)+tuJjkO6?!(@l8EwHnaLgAh&bYDkjpPE# zj|+2GVy|@?DOz_|n?2g=q=({MchvfXXaY^#ycH4?43b9Uz#a!9UBlLr@;hr6-y?8X zCwINOa(@B%`TJEf$g0qVNIG7h2ibS5jGSKRo_^C9`FZTi=Vwa}PYSrL?DVbmPx zHYUURwIWE71mwhgtHn$r#2v%izPV@lX@73*s55%Ay0=HY2JWygSWoZ!Lufn>xxrUz zRoA+?l52+TbkaUSY<9)DqUlb_WFtSZ!!v%$hkq+yC#&o-WaNl|kWffVL#+uL-QO{(=iS7;8dWW0o%&b$4v zht_=`ZEkWq`?$x`g0JRo5C8#{vV{_}dVj69W4@}+V4L6?4J{qfp1)|Srz~eq#}mFn zsm%F@FLw4VZK=940cwQx4;rj@B19bvC~QOwjEHE9#y;baT%O_EU6k6Ro zLkK+rkxaQjOx+1M)s!e-|un>d$JfT>6-eNQ_PB&ALn)i3K@Q{PK`fkb(P#1%2* z_6)BroHNm6Xdf~;AWkL*dgN#N8I;uk>CI8-A?jh9RIddkR0?2XeUuX8)PJfCbfuD; z$8%-XtA*u)g9y?!gDTUQsjzZXbn*#q%kp@YHHo!9KL>4EvgDN0=^^VFzJvc7+a~n$ zeAlU#Gdjmb(NID-0fiKMOPyfC3M?8xJC4OQ5=5ppsN1b8gH7&6cqxICM&{WAG}1X4 zsbr2xq3y1O#U|qQ-qDGoB7bC4$2VaP^V^qta}tH2at~?qjNRV|e^wB~C?~g7C#lYi zw(^<}CfUND_3uUbS+&lD1kCPG(shN)V$y?UE7T!Zas$KUdlm$dopv@cy~F48#qmYk%mvWtZ9=*T190 ztA}wt7r6g+Ug?nka!H*ND1?VmCH1_9UpeYQGc}4UE6&sKYMzBAWbWQ5-5?!z2Ghq5py%lw-B#)`Ifz!h^4~`Qw zbRcX-E)JX4S&J}9v6-s$c;Ij_=kcI z1o6vk;D0_iZ>-8+?9a}8q*q!)g(pVCkM^a0Khm0EdT-dCQC#V%EK?Q{EVnjgnmEd!cCg4Z& zYdi~+f|X{2rGLo4MYF+CP(%enHAB&gR@7B2f=%ng$OOm_d&EHAY2Mo;N2?+E9D~Bu z^=^vcn{m!-{&EdadPX2D&=6j?`)_jCoVcLXcq}4SoWrPMN>Mh+|DIORU;TmKV}pNG z3eH`i%xft)Fi@L87ijb1%_RsQ<`)KvuZ0o%veQ+GCx6V5zWFv|dne8f2^MQOsB z-F~wh3M&SMJKP~_G6+OZzW@klwf0^nxXcRD$m81A4(|jEGlUal{RKW7OpGk;?={z1Qci)^^`o*be=%U$4QITc4_)-Y#qSdPtm{b4SPPHV@naQuY+Z#B1# zZ$6T+H$AtRElC@LVjZ+)+?oR_6&wo!`(_eyIv&zEP6oNiqLOp|K#~^=+ zAHK*C;yS%CV{E@=fXlw4{+DZs=qmCI?LDRHs(z@xfI*wf%CThVs3^occ)C1HWckFw z4bzX}qb9z;3BU_Pi%ukK!o))#r-SbM1xBY+TkY%aVz@eb>2M2XxRIX5=-yji>puL&WZ4cr>fI(lWnKB!fy*d=m58_W>#OBtxe`752D zS^mneD$k+7mMbPKbw=QTVD+YS&+v*nsO$8uwGq%2REu5*miP_6(ZB&3rVkCOQa|^6 z7_*xROj?Qv!7>w3Aq&u6(Iz`pefd2pwtpbs?t}y8_^Dq+M*rb>Z*#IZXb4>UxADNa zqK_Ev0LgIK!bZ3c3$n~@Aai@xNAVq=*(4LcsUqsF(TvIp(K?4N`c{=3lswYb=LCpW zma@kP;?zDgl4V0QQ4R?FnKdTsWyt$$g< z_nST+B2Rb|kr&P*sZHPC+hiG?KEAl8s}S|rD}&QsqT%)mQGb`@SB_hRZUk z9V2sW2cc5z-D5^SJms=}t1}7sA~D)c5bd9Q?R06FtLuA94HU)_@`kx@oGW2d+hj8} z4>WB?m>*ijT8hXHIIN{SXFc8r-G3vKBS=bFN;>V5XhIOlnYm6onaeQm)#40!{3aru zW~AKGdZ-I|K|HVt+}$^dqHZ5ep%eBq9aVPaIS=na{KU53_U4k3v8Iw!o#3Ppi`RLVquoS1=A= zr{;|4y`wocbRVMzUs1Y9P)?seOSJ5AvLzExeUX#w8@Ra|fAPEWD=|yD2a(-Fj~sU0 zOx7!0^tQe=Yh||`th6xJ*ZMR_=Zn7I6g8;kj0P;C88NkBrc@^i4!8KN3$SA=r{2@g zP@Sr)kh<5!g+Esir2fBu(tnB@h!&R7 z=gm`&WlineT%b0wc6;w>4EWbQylmX_aVCuba{kwoFLjVuKVk5}RcJee<6OPGia2Q4NHpi{2>Zgbe4te4=Jr0_am`x zVYEV%5q22ZVaU$LOK@jA6o{!X;+}xt@O(+DUtUCfGaBzlvvfJ-_4!q??a}tc*tpCKMP=?6Wn)QM(@< z``L=2sM}1-Ekxpx{?@n`E*o8}^wH3@GY@F@D02oR(0}L9Hc*u-RX@_q!u7)zJ+F0T zymKKy>LOD@JE2QI6<+$|FLj676XF`!lm+00>qvUvUmUkEvs3kBTQYihcHbZ-dp9B9 zJr8fx#ZO@ANA`qr55L$e>7Q&u9b&QXftJ9Lcf}gW;{sD~oz-~F)gJLC<3*Q=$ zM9CyP+UGm3BtxlYrs|0&@ogHS#uW`eA%a@#4y_dDnV~n2HZ94tdRGc?3+OikYmP5-{D>zZ9DF;ACLo_%LA^ zPk&y7Ixu_t>kz!Jgq35#;G)rw4c1B~w{oFZE^E~mU%#Lzo?|x~HWr$W?U55*?qAS( zH}OjNw!#s2=vJG&Wc1LCwPS3@KikZb5FfymX^T*2#>}u5Fd!jZ7&n80Qn2;!N$eKrkeUi}et@vCpezvz) ziw`41C9+#GEcJ|o2oyb)lvhxWhslI35r4pjE)4Jf08*hu|B$QX$`}nonF*u(3V#Z+ zUP6tpwjbjoe^>f%2+~uup#fa(URMm+YSh8^4kh3GO&U(O!!f8QKT> zI!-bbMbEM5Ph;~TS6|H^sqOd9Xqt_Iig3u(-|3U8#Z9fZ`GY0{lYGmWjx0!xMDL-> z8kmmUVz#v$3&ckj|DHB&%9E#6RexnzQ^ZFjKYMc5Yd3!{{w5}OaC?w?&9NoeUm4C>KvZtf$^9#GTj>ms0Q$mm!xz~1srlh-PP!%3k9l| zeokrE7dH5;wxNSL#~m;P7JoSC=*lw1IAZ^`bGPIVq&YzTI}T()Zj{qK_kWcj>2O*BM{@B` z`Gz=Hb9?GM1=6;%3};#wDJqMG{t^xS46oE?-)q%1-=eUc=D|bwAH&{N-!hN_is>Iy z`iazxl89G@*U}v6?pIC85zTp|lLmF05$|jg){m4|JFBY=V~}A98tWo*jiiQSkQ^0QJdy0(bigqw92e?{DR zPVGjw@R=f(7EYr1gy_p|tqpAhRGhS_$;~jNvf%Go9koT?)6pl(?8>wQbW&`7MiWA2fjAvcjeU zg4}C9OzuCncRS<@{Fd2)dCQr}ukL-SMN^Bd25u^rBar-RAXd4gdC#mWm|Z!pD-a3X zd0lvYkV&Q=t3xMmhydt19@|y@tGX;HGc#@3b;Be+pz@k>jSC!a`SJLlrhg`$80`aL zB?v8GP<*<9o_{kS;vzB!LG(-eg0}-KUa+ItQ>I~8k_ChS;X?gkbc*0&fPN&Azv;QV zNh;}Hy`*B`j#XLN@(6WzY_ve9fJS`A>(Bco&!y(+YKS0%d;~*8SEFQSr=u;@c_%u^ z7@_v7j5B*PD6(aopza%z%aZ4iv*h`M3LGf+LkKj?L4QcqC*@}TJ`XW6GhisAup~IZ znH1S>)O+vTc3T#}u9B{}eis(^!7vvc23CKzOjFp7grx$BxiI~?o1?g$BZ&EngPc{< z#1i%Z9cy6Kle0aP#_J{Z9!fl;zk~rSKF`XUm#R3GySTT4(q`ldvLa8WL3LdO>yATR z%I(69@qfI(iB3gKACy6eRW{7zSZ7)VoS|}Jjn%!x2z7n-P`kq~{gSZ?ViMAKHot`= zD|y`CL0HnLV6G*cK~qUV6Cpn;@vI9I8Jq?DKEK+ZQWZa)-h^0#LWlIQ&d5aj8c`+b zwtVyU4x?7!1nsDSc!FEP%U`=#UIbrD;(IT4Z|G_Lm|-$sQ7i3QMnVeZGJN#M)Z{WUocN({`(+Xq{$FCGA2a9P1Qp2a!!F# z*mJ1nE}4yli#y#%%nIAs&*|=b2Iw_m$$yVr>w8JcZH|-$#SniZi-gN4No#l|!9)oa zsrt$a!CWE6%+WrqxJ>$58ZNcU*Rtc7?K@w-j;{X_|Jb{i1sk@wYg!c`lwJ-ybV>9V zpu~mg%4%e!^4d3INmr)oKfEaogsygO)wwq6nw`cb(5+jJ#B;7)S+I8w*W9p+$E)p?`R8C66}jLpV)U804yxB$WsGQ%nfdYSmRwxOMNK zpH#uu0Ou}x30pFCM_JDxpE z{+4Abvj+9dMTW?jPevM_VR{+t$ow;fUCd-OFJ>1)v*C%$cPoEYlPf_fY<~j|9_l4Y zL!n}{#Veca8L7dsxPcDbsOgqQQ}H=3R;aH?3uXG~$t_W~J9aFc_1uu0b<(G#3O-Rnr6j(b=?soiLIZ}>YQiu3|q>F%f)~3RS`HWbK<%d zM`M>VJk*<(C9ie23R13?MMsmb-@)x%Pa=U!U@%eiM!a(d$s7g!Z~U9wiU zaPIkCRixE`(%`g5$A4}=*4u(!0U@QV?nc2E;b%xLU7@PEPSxu-G4uJk9K7T^EEW1T zF_k3+P7`vG-TT^FSGlJsWY33Oy@x<$EFlkk^i(|S!Qs>cg9$Z`&gc3tt*%etE}!B`X!ksbo71&jJI^q_b(#R=qypMQ`9P**a6`VjXeA|!v4 z6C`)ato2>9O{Mzo0?!SRqJ_fby5CKUlSu~?t2LKk=EMQcHNf|@^mam}*(qXitWYLIgFl1_xHcCF&=@0VfkOcZ;9rwJWeYGJ_hQ0!m!N z1W=At8Gii>z<=oFC>Ej!_3D`?@nV6e$5#8d$`;hfYIo2^n|wsk+M_GHLyM!zp1i{K z@A@l6qXsQ=F_{G>jKSO=Mld7%BYicq+axySeJo+xQhmRmAR}I#A{2J8^(t?iXOO-x zaQQ8SM^wy6YvN56(`nd;DigtXz_gW3xjoGq*OPx2nSYnx1Y|Q|)+ zXpI%^Pk*yzr^*yR+kzK%>#>`|j#T<13k8afCA$pZM)A!H`d#uQ&UOYULL?&H4seVa zm)4v|8tiDb^t*VaycteX?3J{tgB60J+i3Yvrm7OYgt_Xjv{QTZ^{OIsm1w|Y z=Y{mhrRV&-i0i>#LH;tYVlHtbILm}~=3{h326-m0E+FHc6{ zVA@Rk^67a4tq0J~kU%)C(%vfRvHst(I!qf?VF|DpxVl7(E?k}Ub31^|)I^l~`+2QJ z)cz+Q2_+RMwLc36-7Zk1yIppbqWlO0=zpw$@no*hZ0Cqw0j)KxTMMfkEyUHbp7k!G z1lFSaxjCB0z&uI&f2;Fq97sFRRT!kV7$d$#8gU zAA*Xu(iwy)XehlT%RNu_qbbbXH2!4U7JPqsY3KNed2f=Hg9`dY0-mXy%r(!QD1U#d zY(F^Pcnp$2z|Iih$E^MVH!zCgTlvw|j{w0froGQ?bFSv|K3P%^z+0)LnoRYRcmuYr zJ=2@GXR1712UJ%smSfm!G;qrX_EL2N&x0*TZ5Aw-UCX;IV;4wkLlW7>jU-xA zF(>53_RloXlx8wLE8tb@3VW8%Nq@j8e^jQ`W@y6kf^-vdfWAT)Zqb8csWr5J(bv9k z5e6o|kjP1?!PN|oBx67|YL=Z`=zOFm5%KZrbNrZ9#NdJ(UvyQJ3>a=Yy1_0S-taWU zkrvBtABUrYl2ARlAB&GV!G>26WKzldgEi26X14IyXR(n+I}&)$klWV)4Synx$^7DF zRKdzd=Zl;o7AbJH01KZ6=qJwE-|m?z-y z@exY?EqNvi${lKL*);+5VrR@YNz6oO2~Cc-OGJ}Xbc2g4qKdpQM#p58I%=7IJpSMV zZ*ZtFZc99(Vz;HlCnBIZRzPgI#v zEBrQ7ED^sJk(tWTPh8(e;IG{jc>jNUF|w4*xD0C3oI~xWy{1zHifv zu76%3y%kFpivY-tBY*rt`l^2yw!7q~xg304Ox7;)?_F2UQEbp`eC4BU&aSe-i}NMg$;p#DwjZ|wIK@qoabPLLTuv|Oj7kd4@rS6Ade@(%I=F~VSdbOw_CODYbG)gF)IX^e8YVHh*m0(5`$bAat+tT0gY_ zlg^T2;S4~x0pSA8bD(DztMoJJEKp~<+xC(_6-eRKk70q?Q}=wG?j?cpzdb{@MVuvL zNn}*<0GizmUP!$4O;~)Y$pqPsvHKjXJXJ1Zrq1$(<8|Sk2T#jX19D;^PjP7c4j1(> zo~VqewdQKVLw|7@kxkAdh`?-e8^ixAn}4Jj{NzeRYK9s_T<3GFV zOfN9gyQ8JR=H@k!XU*CiR{Fa-gXm9&O5;QykMT4AEPssE_|i}d&PM%j$zz(c*LxmO z#ep-KA5gHnn{1n}bZ?_4qIaFY1bLp_i2hvj+2Bos6R~1WUF|HwWM;0qyPzYuKJU=m zR<6ibDi`cDtWhZKzrCwQS=uq@scGI0Qiz*UNE)r+Otn1m2B1OP*=VLBzOr8Lf!(1K zNj@a|&zRopuz*O-76cg5iI2Wjfph^>2tO=AiPT?YQ zxi%nZ19HMf$4NsGbFCfk3Vrr8KPiZtDZYSA_J2%!Our(22zRD$O{A6g&ULBKOsenT zWZouS&v`G)Tr}^ zZH`fMzI{<`(1KR9?^RTY6AywK5>!`P$FZ4V2zBC3Oh{3=NH|G6(@2lYc?3i%R0 zJb!Hq>s>3`K{SJgwB{&h83j)Y^L)z=j8zt2o3tn)_eh7VnCUTDU|BE$tnSJa11V$X==gEHkwGIljdH*V<$YW|5yn`K z=K%IKCX4C`W%O~S>Ry-Hoq+G+AHtxbKV~4Z__2p()B5)=y_E+S(8->VV;#ySOMk4j z+O_CEy2t$17-I^s?E%*N9=|@yo!YD`aWFQd#E)5j{1vJdpivR)?Hpino|xGK4+>3r z@t4{)7u4)Z?c|}AlC$sSu9DQ$5v*FTzsY%KSl1~*?H%{&ajJsEire+%Km%0V65#C+{)(8`!scv_74L~t;MpLCqk60$@FJfbpnB~8VJp;$`3|5PrH~WjEL#^Qe7Q})HD=az!>>fdf{dBTz<(WSD1tz+ zXIZ3J-+hcm%B%aS9m!929z3>=d)Q7DZYsP!!Ea9SMQn3T$=r^+iwIMS&?g7m#hwzL z%C$AiYA}7t!oZo`+AY!{#=-DYcqFJ%$Ci|SE2}F!QLdU9ju9WssDbdc&k7n8ylhfU zqJu%Y&uQrgV}}?ImE}Dfn14Y3+p8a`8~-+&GHlsO%1BtTGtu#iD0THVb-kOxlYLnb zQ1cKdx}TQl*r(KQz@1ZZmJd2N1EO}N5TTz_ee=+6Q_0-k$p z06aj$zd=Hx-tq&V2gPh>datY@k0!IGJbAF(jf+Sf0T8;(^_~1r^o_F$6J-yuo%%i2 z%tm4jvgSY`i#l@Eq5Gj&h8AZO&(L(zu8~Pr^GwvmgMpm%iKM^sFpRWVM*B$qbcVJ$ zI>?LKNnMj9dbZ@YklA8*LZ^S(Sov7K;19O9$M;D-Y#!j$ziI3I_=RP)7^S~6r>#v7iMAF2|3i5YsuqmG+?yL9iv#>>!?SEuUX&<5S z-Iu+5F|2Ln&0YBGrokO7rOqhTl0n`Khuu~EdH!Dx+TzVj)#$A6+{615RaWQv| zdkPkQkZLie)Zqz5`fG=lXXyu&&4J5aDv5Ioo^Qh2^JAH>`N}8%_n`J>?x-}uBhgLr z&=`AKb{|m~D!jUL_+*vG^(I6^m2}B&+#~v@VK)z~3u2`bTh3ntBWH zxL{o%W;jKSpmoGC2Ihb9hh;(}5O9F}DeEf8dpt>o$YL3OxZ-Hpn0*;?bwY{Ou&2q) z`f2i}ppBo8d64s~4@GVq!^PF{4&%k{v1K}cNJWYbN3eiSo2}?|rcgF-LGK#a@O$`h zbKJ`5_epJNE&?9litzra+wDlenW15I&3@I=F9Y~m(hM)l<-UJ}|5j^5#S3|9=DykG z(WIA9?WneOuy7jG?ik%<4r=X%D~5!>d_LsE09)lr*#cni${x{FCT{haWQ#jt#z5Jv zmkq#>%onq=fp7JV_d@_ar*Qf5W<_MtounR{{wJo8C9>A5$XYVXS_g|`s)uNCa%D&s ziv%P*m(WSx7qfrBlCt#w?Hb!0oLH?x06AZ zu7YN7#iUR>QqMhJjSF#MK4=gT9w`xwD6c7W03S|~--C$FoR}VmT(p`dj z+kiYK`0Xf6Z8}+)#YHUWZXo zQy_nv!e*8$Ul4*FWj(X~%R3g_9-$DaMo!P@9;{L17-jGe2giaD{({a*#|{d?@arQr zX6$|kB}Pge>{t#{yYfU+bCcb|8aVp$LMi!3@L&%(FUeAHhzo z@D@kHJmqd!HG3zcAPDv*c2E}KihiUa_fdaZh2M?0$=KRpW%2Nb)*A`LHR0^%_vvzh zyF(Hqxpqgtph8yTYU4>k;-@gs=mvTh?)|Lx&X@T4Q;jjU*?tkRN=R<%KePKWyS%QJ zh`Eky>tix@wJ5hXr%~2O2d$rmfj_p#Rt7t$sIPX3)TZNQ-au+8FUe!l$%KnltmsCSUlZ}( z8M6WXJ$01L`#Z{X0*RH`Q^B03pYrDAmt_9gkk!M~#tg-lws#*8FqFvPoVoHsAqaYn zt#y0!vXH zDXIC@FE!?jICg1^9&D6M?b&~&WLBV&lFtha=+lce4yL}Z4LtxAbZUAB@tw}+xK814 zrY7`V_B={c0M@HtmuW^ZgUyU^j9IO8 z>~CY=!{cD;VBLW$XiD2Q*XVC78*5x>#+i%go2UnDH@|-tWC9w2L$ZGqRg#+awA~GI zUF%l|4l4QrIM)$=Ly^17nOqJJFpkgh|4W;Edaw6hGE9~!>`L%SJrG831py!>hsv1m zjzga0XV?oKOQ!Gb9^ro4v+6sAQ2CJ8&~se?JIQd-Kc21vY0aGfQ%+YLu^4qA(?yQq zkbMr?=N8bYkWs@}+**Iy89Fy@=)$#k}e!`0a$-NYh^-_Yis?en1hDeb1MsvN<0IV`5^>7PLRW5WV_jTkcU-pau6#u zBQao@>+re?-jQ2;yBY_x*%&=O2 zWWC{3$u56EFTBzur-&6d;$9nNue!DIoItxw99|^Gn9;dLtvFDvU9=_e<>06%Hb)3L zdE0?z4%4*tx+m#mN%{?xe28kWC92+@ugyVAwAYYyCLT)lGTzHv( zI2LaLOO~2)U--nt)b*ZJ$go?^zKQ6F0E(hKAq)w;X zfnA5ydKVH+aTL|`QmhwGj-f*DyXS(1v^KAdss=$rhE3BhHjcy;6q4ba{JNt+bu1KU zy(8b4b`3!2ja3JjeFRCKo}qQrdqe z6j2SpW`n!JXFVim)LEpEe~kdHTH{`k+^ys#aD8<+VaqoG#|3)Cgwhya5`1a+^9GfY zT(shXd}oWPu_vid#CR|#L)#)o9>R{Z;f1xt+lx)2wbn|v9MB8>@vQd~EJ%nY#d}^j zdzdQfZNXwkDBG6o*4)Qh+)p!Gj&gqoy8XRbjypcj6M4RYRv#>9sjG3ww=o{Hs<^`8 zp>#N-4%AH^e`s;z`Q1F}Y5tg#n6x>PeY*L6OF^sJYluz_@Rpj+1#Z~vt#(ARqe(?t zlvDDQU1YC(QJ64VE>8!1_oRz1fa+FL<9Jm1ipijO9jU~D5yx(-`lms}!R>$bT9=zE zGI38ijIcL-{Q$wZ>@P~AZMJQ1heCt>qcU>Lo>4iYwxlj>)EL3f-i(gGE*W^nm(Md$ zq9Xh`4KSXsM&Y8B)dsBBUn$E_angt6+?Z302EZxoexhMOx+WH!QQxb$hhrhT_0dSU zHD6AapY1V(@1GZ|kcUB5jGP@Z@gpH6Tn9BljoF<199UO;?wVSl?x zik*Yk4j$d?K}M!z+~8o#v_|zNV)qAXxfv?Y&!tLotn`S*rXPsKXT&KS%duO)U%BnB zPOc&$F5GG?bZwDMMx5vMDhY>1zK;&2#5()M56MSKdvn*hDnOd4xh8+jfIm?j4IaJu zrPh2~BRZ10x$3T$7arMddEHyJO#qgw_PpDss!;F@0DcNG3zT zJvfE3mVjHQXvyO5<;+D5u3?6UrOSdpR{5GVH+P5skQ#_)SKm}#JZKIie#QC zOlSC%ZS0?j5DoqxQDifBK<>F{!KM|C@l*v_6-qBiMvBqyiW+}@ztqoz?v<^z=ba%I z1`U^J)BOVtC8>1AJyOd1Z^x)u$doakdr7g&NLxr#o5-6+=T=eLTuT*9Z+Uc-H%Tsd zDZtjs@m)@VU(l$M&N){9htwgYk_MhuEk+-MtO{~objXart2C`Iiv~>yxp(4tUtSS) zR$dbIp_A>$Nc4Z442z<2qTh2Dt*>KNfL9Kebi?GOJ%-rtbHW7_LR)0?wWjQbxndtj z@^Ix+whyUxn_yL-s~5w!{)>%aeWcygQ4BsYU$Cit>;Xt|PkG?*MFxPiw#)hJo?$LwTTf(XuJ1TbKN}~TpkH3|M6`{Wz3s#iUcf4_IqiS?oF`w# zBUcx}ewkQLZC|NPvp}z?p z`H7i%Sy&`^5B>!UT5!t`oM);@fB#lXett`?2H-u@jfDvm6n7j? zaFnM?(-W`~gqe80a;0UoO?D8F2OWlQNW)l$i-}?^ni}U5WuMkpoJD#`Zfu=VM3~MP(kwKxIf4zcxO^uQ2OPXUdvz(9fZNm;iA3ye6rTFS?WlNOIvDlb9} z)97mLml8Uf7;?*LbQ_m)z-V3;51=rHqM3hWxA$NXRn}wT;G%+_8vkzL01yeb1*m91j^fONumSL9n5@M@KeaEXkPKyQ5-H1} z2v^(^HvxbTQX&$$IKl$Hik)hvR$F5TuZK8b&- zsMbO*O{5(6i2a1_^TdQi06z2-X}sWP&wVK4E1}7L?SxtnSG}P3vPEtPCMg8GR%U7 z{5fl~?8!dj{gEz6#|^kM)cu3D)#87y-$~UbZL4|Qd@Gerks%ed`$B!Y90dA#=I2!U z`gXX_o?JEUadl#C%`H^dpUnQ$`_;NSFQ-z_bW8H>p6r{OtOGXgfz*N)mZNp)3` z$swDiCJ-%_F6dRQ#r`XM$fxGtY=4GMp+1`c1UT?A=Q{kHxKWT;2_1J*I4XZmr1;#x zAO2M2nUH-Rywu+kc&zc&p>{IQWK+y;9esklP}i7(;O^(s>`Y(sI@QMaV$uwcY8(;r z5?0%wD=FxYq>VS)`dRfrJHFvvcXO~4*8OHlxwr#NN!sg@jK)w;*MrIrF%z2K{T#!& zBV#JU$W;+Qh+_7g)s?IPP(XhnQ<$9gKGE=QUVRc`UJ3>ueLIG^x7h~ud)*@xP_M=K zMTAjCcoMAI=d(Ht9W#JLE`VI;bg}MSmo$QQ+|()iD1MFRXbH`q)#9XFqts6gf;Fh2 z)SzZ#CVP*zaqjWDfpC4xxpoBdmNqC3PWq@^wQ5|uS-6f?t0)9%+5Uf}sIs9}GgJBw z#!ql;a9h*L9#8i!5p_s@1&AUk>8Z35h6Zjdf}4Bo2{ARCaF2B~LJa*2_kqd}{Q}hB zqDOZyM`|0Idzm#=XJWqYai_eIfvd0wy8u8Fb;56SA=uNy(m zE$Gce)n8;$Na#J180mAIm2XsveVVtq*`y7zgzt=yXsomrFo`@{&Qae$eBOT6!s-hA zKuCl_+Si)jIC#1FftCQ{VPfv@95G}(*OBOQvKSMBYAplds$|Ic{xXT1@-ZG^Mof&M z#D83PqL)aY&D4LV8U7@T1SfwNzkAy<#cJ9 zN0?&7L1T{-N*uAKXkUSb_s8q=k9J~*Ixh7+!c)2aV{j?VGhaxOsnE=1xPK{1WZRzp{u^g6D*@ z{Qw%Dh6vZ%D*rWyhQ8s2{0S}TnSL8(RWvjjBX)}2zov#^TnMI>1~O`e4!fj6?0=Ucm0M$v*04N4H9Q z&SVnfS}T9`+=^)r?>J{(HL>6?Dtw#`$JLO_kjS3{?BX5f5n)<2me9iE0pzfH)?AHO zQ<**-N>7a%%10s3!56U8>`P*;^2}Y0Z&px`>&=e`c6LMK(A=EmgBF1#!x+jXXO#eL zU-gOqLVFY)BXxO;5_@*o?|Knk4A-b>!(vUySD1gnh7z0%-`!J1of!|fo@*6{@gWGx z!*7v{diPXae*#tQY{&W6Lv>Ae(nj#7#BGm$u3T1E=QOg{TlZ{4N8~%zaA#Q=bS{!I zbmU^|1l*#=Wt5JU_#@&7W1bIzzqLUPQU&ft3TGb$<#rt01C1wy7nd0EAv^WdR`3%O zl1YF1XSxde@Kql5)p!J6;!0{8_lm~6WydD;V%{%LQ}D3}oSfpc^R}7-Ef4p49_a`go!nGA zH#l#(T>ONv-dWUfjdyU&_9gFYtWeb-2K;|EV#sl;OA44-LgQgOd`=Z?EWP<#6B!2X z5++n*ydv^{ajk)u%Mz8JiSjuR)cq1{i;P zq5O1|G|GEe3Gv1fm4hRg8E734GTetas1ye>Ks;!jvf;(Y!)%VYxV$aLv(m;-T374s zK2QBup*o;j`$MBE1R(a(&wq%S6DTPmvqtkSC>)1;WVb>`ufLLq55vAvBLcqYnG^D- zI_IYfl~^W$6u%|@^FSrTx_^Gz1U7$MI6Q|~5@X;yTpfip>sru(!X49D#PybTuE@)& z(dm;*Dxw#9;VawoRGjsa38OC*fHUCzH8hrgWwA$y=^M8E$p9MHawO&Q6Mzj?0IMJ9 zX0c3?oOs0vH7l2#UZ+eVf6&hJljc10)yZ#L-nL2i@vbJ7+Er#z1qmf5Z?J#5Uo2Z6 z03P-dy+((9lMy0>O|MYb`PV#-i7J|-z4psy({T+uIna5jgohqvB%k$E1wCNNUF;iz$Ymgqu zAcio&ivl)*Y}JjRnY)kgSYOP*aH$`|;pX~10ymFJcUk_5n2_>Pq@x)rIsj4tr&M^p zM%x{fPW#h~Bb<15)vbTnO4d!-zt)z}x2ee&GI7WA1)&n&)=%Qh0%lM|(X7P1kwDy*yvZ#jrV(Eya zph&J44sWdjDLXTSE6?M$DOc;}^q3}bTGG1uZNKCB9h$+?Qbm7?%4@;Mx%tIjr^o=l zY<>3d>A>?rW8`J>M~QJv@lDiY&74x5I8eD2JLTT$V2}HS@OO^8f}dve!I_bmI&%Cx zw*c9ajZ?TKIJeQ-ZS;7ZUCrMUxl9nG*g|!nIn326E|;QgvC9Wqh4Vqx4vpC?3M_6w z+Dl0IJzo=dLgasT0~F5akZWUTvQD!-8ZNw0BL?Z$Qx4uczL2)hoD@^VR#H9olQ>sO zx&;Bn5YP>pu0-M_wKdkwca3(oM(bcQ#HB~aS1aD^)()9^oOIS>_sOXi94hqWN!Frj zu^@-E>~ZHMTfw`O{;4S49r6n6A8A{keWOFFz7*1df8u|W=HQVeK@Aaa^=8i#Hn}MbHi-cG47Ttz6R%#<);;bF>(Y@; z(>D@~>|JcxaZ;_s%aFY_&^XdE?OOYN^FT%6=0%CdlIWG~BM6qG<2fXBaINel_zu;4 zm3hElx?g`eJr0bHv<#6`!p3fOKI8!FFN7$7Ne%@Rpswm|z*}(gXl1oVnLLb@(J?_& zJ%#`ZBHHlYZ{O>cfS*OE7YYSYU$`7D^2w(bbM?u51hlgM6unOe`?5`ebhFKA0i(Y| zEC-r`cPfS7Pt{0jjY4A14||*m0b#e)OG=UO;Ie-(O%J&eTj{ayW_vD|_pLmen4^=) z8qFq^ksbIj9m=#o+74v#OEMR!f@EOlK~) zdCa(+svpH|eokF5zd7Q`5VXqeOKO=BXjjB;A)=tW2An^0IzZKK$7qNXR&QG=?*v5q z^E&8!rNpWShJMdLqqLZie#UlzOB~h4hL(R3W78=Cz{i)@KHRW~B+`BvQS^alJGs;? znk|gHPBV?o$3UA2f}d0}>}9pYPG0l#){&>Jk`Q+8IqKM>`n%317RtTT6;_X8)4cGE z3*=$rtRMTR9%1&(HU2Xl+j)~ZCCwr5-fWR_s0o9I>Zo-CdE*2zeyLvNW*+xnglB*C zyPrczN6B%oYpCojM3P$owK;xUX}4t~M>r#^^-C_e^;xk3bijT})#`O9Vxb`M(Pv9H0AHV6P|RgNwnKFRbn13B1$Qc z|9$7REoTM_o7u}4)K$=sIX?ig(u4IOvM=tL8n|Q~@gKL|+I1mxi#`C-NPpKe&qhixD!6Vm zMiN`KO9~@FztbNKHh^@1NRr5=tVF`INzO|0xvA3P8!VA!m3L$$m|6!rgbIJvRdcLa|;QM6X%eYTPvmWu5CqBZlHdr0i?Q*^)yB9K8m7I6c1fvsE z#M*U5;DZW^tX$1Y_BxGtjBc$2fs}KpTqnV{e1hM@$#T)ou&vP)4KO2@IFIrQu<_mH zT|S}As|LR>NJiKAV~c(8L8^cEp(y4?yln{C)t{^yU$3RzC7ph26X4a%>rX?8OSqgJ zNv%*dtGcFpea3d%iMZhT+uZ6hYFxBJk7hOdsbP|_1{vbt!`BGw#=r(W?WsS?=<8i| zHq-k1sWuLkA8dWb`*V$4`X`&`o95NuC+a-dej0vH9zAmW41}DgKNNrM#R0Q-^(O`3 z?;k|mI2)r%?8W*k_@>aM+GZ4lh>+}4*7O!4fVRpygvK@O%+mR zqq!K}?4Mem%unI>{!1>gOxYf=QN&PTu3do0Z|>dNkzpAgw%w09ykHk9n1SY}i%N`} zF`GtqnlrP$(m^Qy6bXMqzr;`?rRg}oP}uwu2RU5ln$p&Cr|IZR<~ZU2sr4%MkExl| z8R-cVYu=}fS2X;F4MQJoxcuKa1ID^4rfbvcovbLX9lzLGSq2*x^LI|QKbDiJFUZ%s zc!r7A4}x63a4he=Q&3-(1|$UnLu-@r8qLL4I~PDzler`djJbc52Dc*pik_3Yp8F5& z`>x=4|1=IxyDQ02#fe|iZ@Ch}Cx#gu#RRkZBPc}YK8-NR@ny`e$`cr!ta&49(R{`t z0w8Z1rqzsbF4%c`7T3}pqS;W~Y6L%IC~}{Zo&+gPC)|7MU!d(kew#5pg4dlMi#XpW z_;te3nJ~~noEv{kMjWsM-M4>OMvPh@CQa-C}Q@)Cl*0WZ(Ar;~%DfdriyHC1ZPZG$sUU%*0wvOoD38<6dA z_s%7cO)CDua}kW3&*LNC=)yMj5h(6o7uXeh%?i3(G`?_9v|&Yo$P|Ti-GpLM2)(Pk*X@9Tdv>f zE6aH)MNrS}eY&U!OW7~+^1p9T+3|7~>*%hD_iTTB$}$nqV!b!Z=WC{LWQ^QQerJ(e zoU)q^k<~;uKX+|Gu)2V!Z4#;}XcpC_K3Mypazvd>Vl~FY9x3EO=xnKMLZvS9!NI|) z0MfM`+cyv*o3?QDjtl{4p{il0JMTdrwNUL95U7`91PP(sNIgM7m~~x=X%p}*S!kuI zMC^ZDXvlFHD}BOO1iW>E)4?@=GCr*pgNH$1GTv6N%9KV^riK4oXs(86_ZNyOjkqpI9u5*Oq@ePkj;2xzuvyf)^OHGosD?Pbjv@B^p1)BJbv&x~L~#UohWhK4(g`3=G1(o!5kUj3t) zpYGCGfZ=AbX~ZDMj-jI)mT=8B^J4IBiw?JG)9oEv3bJT-@CQ{0F3~5H)L_{?w6$}n zwPJ+qVUkW@8Fct(Ogk!5kI~Ul(-LI1YlEGGh}VobkrZ`@I{gupLMiYr8pD4(%h;k2 zhPbV7w4Xu&GP=!F%hVB8UCdATJtm3lZv^CX9tU=aqmquPEf2x$CVR_9ht^=Yaz~Zp z4oE3N|CTv2#I{&xtv+CRw0B{UanLSw!S;vgo6a6%(<~%->%0>Zh1Ydf z=O~~v2F?BWx+%V#ENm7+9bkWu*_l~sE;3Gi_uwyjlY!Q?M;zu>9NP>O48QQUNiHA6 zxhPhcOT$MHNkI2}ao@$Zhl`l{B}UkG`fS(b-bEjw&WfI0ZC`WVU?|;A_;Df(#youuMRGH$-&3z*<7`GZB9QT~F;m7y5r& ze@qZ<=0zI?1P~K1h(b%0o(d7-IS31xRi(S_X%9wc-$|IjojVGd*ObT1B_Q*{GSh&& z!vlZpLnh@WkGi5&l--^E6sY#Xd#(v&ueTb%FLbWa`++@?RAC53Tdo+B6~P25>Y%si zerVdOi95~~@m!UZl@otTv=$(A8=(gkG@g@T+Uz3I{a$3xza1`TLN%v>Ut`wa$v(4K zSMju8WV73;&M;aez8<;i_*%-UwYHsJlE8SFZ2NKMq$2Z2lEz1IzmusJQg2_}XgtyK&kfKuiB+C8KRC-f`sQSI%>!UU4Qh+3e zCc{zUmoOQPoOpjVPr3{Mn_`VcNJj{on8sA-pC0mnBdx4jTt{NY4dUq9i(1wA(m4wFu zSAWr8Y$=y-n!HM}?k%-Qa|*slmnHTu+K97481TtIg$EY{X?t=xvBKPc7SYY--`A`F zl8+R6MsWO@Tzm|U{_Lru`~kU>gj2;pLP+a;m;!o27lw?5EL18zgI&j;D4dCkX*zt^ zE0KRVUkj{sf^cLPKq>NBSali8j6RNVObRkO8%uV;21!5=Da<`!z$2);?RBblOtE>c z5@SvG3kJ1Nnr2C`mTVeX?JJS2ZcC90}|9WM*YTT|Q z{O`8FggrI4q!7U0%Ud)bjPIN<+1?kp;>=6s_~Xg!gRBwYIS9wAP=G!%PWC)3whAy* zZ`zU6ZMaZX+-@)K6^SHFb?}9rlxKC6U+jOi z5_dG{hps&+p!c)RMSqfg^a6}QMr)w#&PPAsOUlrIQvzMvJn(WD!(WX^i8%?6m~7x* z?(bl(=SMw!UUZq|^GY0mU-UP7sc3|0$R5bah4xl4uI)zt`t@qMiH&6&krZ4<++_yy zDG_+LFrWF@Oxzv=WI`j$pGaWJZ3urz^1XT=q$-LilDBLvLP~~hr8mB1?e7s=*`uMp zlU%47yFDxiL913iNMk2-tzxNcT5vZC>$w$;*8QA>RacqH>B%GTJ4yeoL=+o0tFCP5 zx)V9pqDk0T|LhNES`6AH!?Wpr%~SZ#4bkwe(<4{_dk(}o@!>^HTz|-wJ z22Yao>=#fCqEd0h?Uq{l4qbn@gcbJjJRFr!O%;^-rDm&7xHPS=d0+TKc4Xr0I~0PZ z-B--pUHKJh@}>6OZ6#C;ysPZea&? zJ%I8^v^oU7_`aTr;@5#OuOUA=rC{^#2kbpaa#*U^7f5ofB#nkJM65t@t- zIx0kc>BUHcM=_3v9gP3T7O7Z}Fl5Z7^4Ihm;yWGy7m{(AC2?a-LUE}9zNEV8tvzoV zm9g)xvGtnNNzg(4G40n->Y`jvMw|5S759gF&i9#+8M%BI3YscMg)zA2daXkYe%(Ox z>M*xdgQ;cl{+fT1@0Q9*_|yiyr9T-}m_67vb5be?IJ~c`+IWZ|EVu33Xm)gLiiF!+ zm&?VCCtxRIx(U+)`<#!e8KU%OPzcr$52DzH@nHXxTtwucZl)Ufv7%-nWj>nhZL^?Y zy;4B&h&sM>i9CqhrdLq?Z2SJifinb6RbbazEQmd0MCpG9hSe1$opS{#{(~d^XREup zFqK0f7Zlr;GArl0pibB)zK_>e>e#Nwcm`iNU{d%q-0s=hvi2()A%9Wxv{$G_ z%Deit(iDGj*D!ots$l$9R3t^Mi=ILyAfnt!Pp8v?zy2Y7p6*mqDx@pt8dX-gp0E)W zK0tR}s2;oS={Ma^o1)L=b6=eWDiS$9=NWx=g2d+uKWRiNd`i=s`6CpgPVn8j(Mb@N zu}?XTNa1cxeyxe+o_^hL(E$bQJOL*G7u^|x?kIn7ny^=emHmQ;jv4!pT$e~oa~->; zkLypYSco+7@YXJnK2@{$LmwCq!*NhVbNfvva?FH?qbmQ)*5fND-=40yk+_b`@dXJN z=!_BQao+mz9he|OcO(AaDc~tHRjIJ+HigOvS%C zLp$)RqqYi{_=VB_EMzj8CKrlm7`MKvSo?ju$>YDSmJ4S7F~LWI1ptJmN4kU!#zU*T zrXsB>Dc5w!u;0aLD3sB+S?tjll&palA0WXuP1TX~IIkt3+x{!l?_TO(OJb)ye29Oi zjb~4i)AffC_yqpIc%upKDh&i|GpXetp(2N9EX!5Xy`{Rg|8a&U0!VwB7dF9}ykPm; z6gc5X{p4Vq z24W`^6 z*!in`*9Vri41nqdPk^Is<9BYac1!^qaAF~p`KZ+bqL4#$JCp%6zNBPaa|*oohVU>D zAoglSI`T`W5pPNhsbVrxio1WM=qM0g=WlYR5vc4$os~J;7>TP|KI)OzM)vg_k;e4Z zOVMvL2?Ksk4|-HK=_?83DA3C;7%vO;Dv?xCvrFR#q{iLs;D{?4v&5b9cgKeVAZBF) zarIkLTe`r4 zPab8wLLJ?v_URwC9pN!o-bOZ&g{3Y(7Q_LLVd5t$EI_I4+ z2Ms7gqziyNxUOeBVflZueXG)BP_py29@)EW7kNzJ_2;mb;p(i=$#`s*r7aZfSwPNTreh{Tx$}FXbI@kUdfwE5V*QY^EN7!e zMx^9mJM63Y;#VOW`&x&-(F-%v$m3%pRsKS$>y8;G14iR?`PP3OH<=OvoYSihX%)04 zA2yDu{1CEX9i!!h?-7p(pJzL8yWZ`_Auq@pO;IvMR8uTL(Dr0a=TPiyr}JMV3jJHz zcg`KefT04`BXH=cWz<{2ckdC|J_qM!zCwMPg#emxgaxn$kbP9bQ;)TOao(kSgjAd6 zw;}rjx_#t*X?TAGay7buygDZ+vM$ma%;F6F3MHbr>2A;IZ!EBU6A8u~Y5AztU!tsy zguWi*Impr}v7(EM#!lB}#pH@a#ViRFgCM+ye$8iSox24Y<#GdO2=@Nf2YdUq<%#2b zKc1ryJ01dib5Deg7qHs=PQkHdg^BdoGZ?E=&e9NUDmBxUqZlW)uy z!M3Fz`fviujS6@-k(PBF`sn2`KPvx688P&#d>A&Lu7u{iC&!<Bokpg+enSF0M_^n0sU#c5Vt&tDU(Y@Vd3{P#)gT zv=PTj#dZ0}bvqOyJo(fHUfFEQuz)6Qnek?J)6K*8Fv$+<(65y6X)xHfzIQf^oBin- zzW;y4x8;ll`zeM?{u!-VjhxU1&r}Jo;gTT!9kS3+n@-C?=*QC-B}B=!lP1y@^VETo z?G31R>QdhMV?UpW@rn_tEA+_9NbGJAd=L{~dIYB#1UuO83c=n1d) zOkHCxtJyO0Ba#Wxe!X?g3#ah`mdHO2HQ0Yw{^!5H&yzeNV*nbqx~#^Yvl2&Fs{jda zgIJa&59g9P9z-jZnDLQ9f&KkQfaQoT6kibW5&$;o_y4rc9+xIN?i4srvv7SlH4>AC z2xK)~%cGsy;7XZJ8=+L<YW5WMSRjH}kpcDW1r?5T!b`Uc@bx4dr z9eVN=A525qJAGZssm@r2@CEcywO{WRteQaOJPvVVzD zN*G@-)geI>A|udqH;EwAoBo>vLm@*DMQ(xGUx4RK4U4f$6c;nTMNj zxb~lp=p)8`be8Z(O~qxVu&fBLmH>y{D^lEGF{QzB9_-rV-%L<(b=w@y64Y6*A>{=$ zp?xk3G?=t;qXgt%J{p0z7@B{^N+2$TK4+fhrJy4;gEy=WLCYto6dN!ssfUTrynEAI zpx7n+85z62H&(Z{^#^0w`_=W{xBnhuF`{I{k|57Ct@Lw0WB81Y*v?fACE#^vvKJ(Z zrC|Y@|1mZNk4Fl+K=yVbj~OS~eT`}`@s1Y1=Tt737X8jwxbEb|w^n~at`U6u<`SY! z%APCHR7aq$J1_!vrSZ?a@hI$|ZpJ7}rX5}pWt4)aJB>Sr&dNfZhw`uf2=?n_4Bf6| zap4?0r$LnnlLw$rc_xJrvOGVyPC<)iWb~JdZ+;V6;`fV3lWzLylH;aj^`&aeb**z1 z_912>G^8FAvOHM;u%v%4Wu34($u82HMC@b;8>(ZBcyMKJk1Pz#k&HyuFU1ALnQ}a3 zz2+gUneCBdMtNb^m`Q&v=PZqAcXzKeh+@TO$w|ju9cl8eX-}_3oNSfH?#nAFOMcC; z^o~1*1f1D_E<02GaasA$F-aq+1ZAXGU^k+BD(ttK&RCPq(lCF!ShXSmOCk446@DSv z$8)_IKaGfQwE(_HqxvEB4H%MC^0AM{#5NB`LQ}^=e^2ot(;S2&?R4)ftQ$s{CPcxX zZ&<)UM7a!zJCh>m!6k1N-$-h0%Pqs{B%}9M=c}9#KJ%6@9BWgxzAn?aJji4KXOfW7 zI?SYa7U@>&MVx==QO#YCL!6@lL!R1O%9FY65p8=C#%4ojpJG0c;_6g1ayPyo|in_KGBW_w1#nEjlJxrU|yVILylWezk#(R z`kk4PLI{^Z3eEpDcroS)5Q-nvZLm4ah|r5^re+h0wKIPnw}wA{lb&|K2ugI9#Wag% z+KcW?74_suGgmq`UDcWI^wl!Al9row#2F!WGU!tBN?_7Y{FwBoB^4`DJeUU*TFgL< z`VoVx*|?_S6Y39Yr=gew6&GBIk)-{jrRQ-OV$JsAV?6{xEf28jiv3)RiY_Zx$S;0&PrC|l4@o%* zG#eBXtk=_626q^A&0SB7N~sttG{k}Vq5EaV(wbH|bpfQw#Q3#}VEplO zHjGrUu7}_cXB-~00EG-Kj@V}x3=l@A1!bU&gB*+3tgQh~rX^!VWi=p`YvB0rA(f!% z#+XrY_hkI0Y`$xhvfrpmv9y&b{Y9u%JRyJkOJ7HDIWc4iCLNv&=B%SYyj8wzuzI3q z;i-6?WtmP$8}$X%!0>iOxqjN7uTkf%Ntm3%ho^;dOY?Wvs#3i~qcdLrlX_o3$+P1f zKI^Kzw2CxeiaHi$kCFL?<@;n)%V{Hz&L;liu{w#KaT1(=zDv)^#t7*D_MYD2EP#Le zl*^#4iVF$Y(CPXNA7MM1J|eb1mpJRDvtU|5hQMnN3>n|M5`F?{D*!nBa5=LjfZX{b zIm6Hj%d^-8j#~)_UHg_~AOJ@|xWB*poSDgDT!ug^q(aNW#7crq}g;SHyQ4GV20lie^wzLe{> z9~bV~@eJ5&T2R@l2Ec0u0U6TTE0aFl^Sc5oy%vn<&zEAc+mw&j_S7eG@M_UaBt6nb zHh6{5@H}b#Ep|alF3$Z^(?N;$FDg=`I0iD)hY79$OC^78rCSf}L)Qz4n2Vd60H z&g|*FvqzB~>Rey5dMX6xcl2Tq4IlVGw~4KfgSB|Dr1c?swTQ9Rk>|BS6mtyOL)Iwo z`rKb~iVp)v)}Rgimby0@hQu>L9~Vh~q)9Cn8YAvzcXH8*ryAW&6Bz1;kacUn0PzZcDiYVLAU1@jkvyBhdOdP2N z0a_TNE6@B`>E0%%5=;h+oEaB-`hVx(X^jvMKt~rhtpgu-C?J+cL%+yON3Du~S<0m1 zNuR&gYun$KL=K+A4>9~LGyu{HcJCyuCd@JTV)l%e^R?mAB$CxG3>RJbbE;8*zTRXU z`0>=TEc5YDxk~;k{OB&M_4_jkah-L!k&jXggu|jKZLyOO58F+ojj$lgZ_3;*7&q;0 zwK17expt^5TugRa;axde!?SaLSRckb3Xl`qm(4icnAyZyTe0_dnYla7P3b zR3$CZG22a=B_psst^!(s${l1PD4C{cQ{o{)U|7m40g9nN{;ArGs@4r*ZJ=|0<^jCS z_kn47&JPhhH#4-5I54(<7D>fVPOFoI2OBdHzjF(IGpmTp=*6nhIM_MI*nG(cn!03^ z9P)fA)$!$l3jfGZn1ZoO;HIxmz1Ua@T<3S|2 z6GZ~u>*cG+nCk+;z1-2SzbrZ`-mc190)au%k7%RE&staI5De{Ld_#VZ_g)SB%J_llzBS-r7fAQsM1;{c3)GyXkQU5YASo!xIp0+h1a}8& zn4Hfl%>#6J{cv@E137_sSLTUvdBPJsuGC||36MzOR+Q|N-eyBeTUEH6f;}4ihIw`6eM}1nc9_faA_=t@a$3bq;6s^Hl z9J+JXb^~qJHn)7{n|bQEM{tX#?M#a9nNTAn1)kuZ#|)c)b2gd}4Ierv+Bl%M-6Iik zG01z@20vsXTM}U) zEJYj+jXno|@_I?&v?tlUBtWuppKUN9ivlwg2RsSzf$MDi?_d+w)T!U35D)jd8RHpB zZnfs2V~zn_ptP36USHrx>5WWX)GghOPsv*wop#eqn%lcKO-iva&;8nx@id29>(^9t zs@4P1+_}KpU9~ft<_RqC2Y$Zj%%q_V4H9v)_>c8}ajIsTiOq=z2>3)e#pz?fo2hG! zMd!+B`=blT;S61`?&@>0^zdz_-T_lVHRu9d>~UFR7yC@5>+w(76x&cpGYr`x1)DRx zz1o!mby49NyOdPgt)OOUcQ~2O5uT@P}BW z^wJoAmY(kM+*UjI6aT-}Nnf~Sp8be0jN{j1Ovy}pL zs{Aa(VY^W50$rF{SDWj$1YaV9ErxbLO6IIR<hRoHyIKwsEZWlIbA0$ZauyT|WKZiMxjzuA#2Kp1@Gd`w`RDG|Jhw ziCx+tQUCd&j+heRbQd4OvS$Z@kMBW@v;U@TJf}a$n}Zg*PxT{NJ{vzlu(1zMl=US@ zY!gvl3*h(-CqBcQry=pz8y(3ms@RD`0pf*f*A#YNi;CTZbbh?#lgxJ^ZkL z58g>aDoZs^&=dVV z6W4#rfMQy0ZLM(BY#3d<9s_N>fHfv3+b`=1eRO9#aG(Iyr?un?Bo`IrpqiOCqT4}C+n)urV<=Z#CsK?r>9K90(U`qz^{Y9 zJl_ny2L%9e=mBD7*l1kmWA^V$7uxd&)d5!(COLk2+l*ugx(~N`HN|RWj0M{#px);9 z;c|X}`wcPUt*8#U7k&#sTKmcFmBWajbxbTY@#=%bUMblV;!>36&j!+e?(41JlzLL$ z5XgTrYO_OVYnL{&os$`FHlbv=UwX)Wx66_2o^`5ug9Qz4L|G@;QCIWa-OeC4 z*ry%PxD`w|Es(G~uv>Qx=NNd;J+_qAd%!)J5J3q-37J2bie0?SpXf;crXBh7gqdIdFLUeS#&g$;L#y1D+kB`;FEyt1ymL@ z)r(gR1_o_6_ycm?^m|`;@YE@7Xp!7_(99kx)zui|al!{V%^Wpuqc}fF_E!YFwA(|d z)y2YEwL2gGRSgk|bHSummqqWcP89p(6iKu_$i#T3S@xvYm;8Ny?fj{E71z3`GX@#b zE_9pT=uIExqCYnX=#5MHvv$NIYafd*eBUs)-TrrV27`w^uIsZVx9U+_&WqB?IrSf= zJ(K6U^N*(?*Vp-nT};s!%%7)7D)?>hc76NcHP3AopRm5?*Q?=^!q0ot(;a!pHcNKu zhY{``!X^&J-Avwp!J2bKq9^od-~v#MqDGDev2oC)QeSPJ!9f7p=-;LLLER=8plrep zDm~iW7_b?;G1h`nTunt^V_rAlzhs z_(=Te+Wofot!H#2pWbl$WCix*2F0^QlZJzjzLf(2w+G|jrrrPVD6u3~Q%NL|Q7_Tv z{W*eXwT#+e9kNkl*@GE9B>ex|>y4963G6_JB)M}Q5J?d308AbAQ%EvjO|FQyn*=g( zQUy@Xu44{=*@jhNu+1Y9FtZ5H784>*iLI>>@~wS`b0u7*4yTut?@?UUy_cigFI**WLIJa~JV zfd;m^TdG~m)H#E6*^=h&S-1ckTp^)iKKSq~<-jK7}f!4P{coty!@XIF>EU_h3$xf=8Ase|fUQ?PbHMfna`!JJ+LX=37(@_yKH zHd}=yEj13I;9vDqh!NDR4Yie*h9ohHt@*OWGL`K^8hf9jNauuM^ZbP-=T@4=^905ZgC#+xd88qg9-Mktlz9u|K( z;(M%ro&ERY0zIy8fouE81sMO0dzGVF(Rn?%5T!WXh70KGDDcp+;P-y5DZGVW@IWAKV>Sj>bxKaa$&O*sQ^D>wS7r{r5z(VFGBO;L4bt&aD9+=jnOPcS*lp8?OU`&p+$?;>Qo4{3Ns0BPtzB-RKK!drs=_*X`K6jX`MJy+ z;g$OHlz~By9$u_ES5< z6!kBcr2=9f<;B2&WE!`BOV@yNuw{kP>ffOyknV{lXZI`La(AZc%FT3i=lOHm*&0Zo zphG#PLnXj$h;j{&!iqmEf_Qig<&B?6w0v(RKd+{Ur6rJAcoK2D&y3{~X8-m?a3e+M zk(Vq#CCj~b_eI(s3(rF_^%%$L|G7)o2$xg2UXfxc!UrN<62AX`&Yu5%?SffA28a}Y zlGbH}Il>EAAR%?<7L2m2s@~#OW40GHGB)O>cbLJ;4w_=&G0CW~CAjb%2wVTLBjX)@ z(_@`QwhF9nfrui(0l97{-f}hGS&+|qVMRv22tjjFtS`2)lAMs3o`Ral8Vsyip#<~&paJ)Lh zSQL^JP8rsw5vWyEG1JyA=T6P~@fv4VwE%!pKe+A{P73r!h~(SMv9o3|S=w7j4R`18 z@7#)aT@JEYm~j13Q{pwR!+YGj%Nh7pF{6)v1|VAQb%18?o@MYq@9JH*3(<`I@qpCi z0<_`|<=(1)J-k55sPv#jmB#ub+M;F`SxJJ|O@0T{%71nQNzwYD6G{j*$cfKc0Ihr_ws_IL-EpyYf%gmcA+cK`Y0}<2~h^%nQ0V z?a3OdHX@{)L0W?!%(*uMmxJzk3=10a1+&lNp`*)x)ToLL5he2&*N--ZY|Rzr4B3F>|O*s{CpMDH8d4DFrboBtm*My%B%Cr7M5Xue?}IR+iPI*`pY7Mp}D3B0}~5^ zB_kGJ;~>5HnnQXA=ahh&c+R~CJ{SdZw>1ymjmu2mH_hq7%-%c)hy8Ydg^ zjsU8YrjbUrJ8W5)MULwAWvmPAjUTR0?awHG!)nsV4-nI+z`|R_0hNPzKYNv0c6A1j z{JNWONR!xUY~R!xc!v%ui&cO%zJc(|a5^MtCI*{Y_{ReARh4>pJ5mQalf9tcHw4v7kP&8dc> zA+18`n<^~MK>xImHzMt-8XC%e((KHv`B7~}%YRP3Ssz;b_V5;Ip9W0|ld8_gmk=(* zY-N`7I^+7~e1Wlki5vO_-DaGx{=&e27uv5A?jM|7L#CU_T~v>Ss+U4OOBpQx{mEt| zi#JR6Qsh98k@qXdmbJ$Iz3qmOS^~PBKqY_5958gQhf{|Mhy@O|rwspLqxwqr&{f!C zS*$3{YQkXsqx{{5ActR!xxsR5dQ8h~ARNYAsP?*W_eB8<0k&0W@te8h&_W@9_1@1B zkYnu?j_U*~&;-9s=@R9N{iyt;WTPhkk`jRFF(GG(cQ5o*lvezD18R;Fa$JPG@u2T1^ngQhTg>5L)I&=r!8JWa)I*$xXSUAL3)^MU zD&_hT8-_)ac_U`0JfRF77o}`E3-NmilA%wzUT%T*jB6cQH zSJ_{|`yah;6l!DaZ;$w0-cd{^G#nnG$DT>m; zCDCa;Nc=E`od@LyKdbO;D&D3@QM(p27tP7`2(QY6n%TQXH6}z+(s$9L7M0vL&SEXY z(ty%1AKX-=#b3jI`8B3XQ3`T>vNI{xe>m|V_+=Fm@$|rdp?_1k6A#iiJUruqiHzM) z8)Ab}Nuik@DMEF_WO|q2hCa&O3FiH({gMpEd)z>&Le9*6mHE6g1|6VaWj{ ztX5!J2|zSPdC3n|PTG~ugfQV{9_^Dl79&vR!K_>*$J+CpauhdLv^dyhU%o*5dicIm;TMJpr@8|8-$*-)yY1SeP!n zC8dVW6YP!s1S0HW8$C<#y? z-sHwCK3=8T>2Q2&K8No)Sq?M$mn5t{1+=yH3^Kx)l>QokQW~fHYl{>R(b>nb8NW+q z_?s_(bz#fkc{x?Q*+!Bb$N^Uj*M3#``7`QtSZ2~b$Zpb4(d7&;j6U(;Zno~3SFGwG zU{p=ImNOb0@BkIoM)|3WtdS&dH{Vk1YgZV5aZ85jOP%MnDjWFmnD6<2_q=Y3Uq@C9YBZN?CXoY;b8%(Dw?H&4 z1`Zq#%AytvPs9FZvRbt)@{~!-b3+iqXjk=YEa(Ln{zJL~y=@-dG z{QEw*#Jc2_#e9y@H9YE9)6z%hbSS4v^a6y4j~>Sr>n&A<&{evNcUiC_7(+TPao3Ck zDVa2hs}uIk@R+EdXAdUWQ>-Co*;rX8aMdj_ve$MCnd2Pi)m}THTv@w18WO}A2-zJyq^pfT%hwBlKq8fuy*Q3N8 zT(6Re(ACtk8tgUigxKi>$8L-by?Y1I9qV=rC_wk&*j}zh)C*kN;b$cyj(I?TgV>3l zs*C0}W_lmbQm=@|Af#K_L+AJW+#CYjJ`{IO@kA?tY zr0t&8gdMbDshaBxUaUs&V;ogwW!sFlKu4D9I!9%=*x9e@xI#yQM_MzA0io$U%Xd$%CG4=cRF2#0UxOpA43JmZ5!Lk&U zIZLfK@^H)2*S+F|w0wp?*T~9FDCKJ(k{oME58yo$l*92h&0o&h%IOF=Ef-6%EauxPij+?pguCkF~mg4Xv*-Wzd~jC+A|U#|zx`L9pNDK|2m6&7n=#PG@LdxvDh~ z=mx28pfWrJCOPv6(DdctEKi+Pn zHk;rav3vppNKo_Xqp&uy06w}fqQs#LNOjSi-jk=S(4;%3?hWo$b?k6I*9+3%m30-JAEx#{MYs zYSF#oBVkK>#RRc`*T+Vr`>0xe=QZf=;a$(fmxp7&$%)rTa84x1BI(2W!f!HEdpJsA zu?_STRYnih#~@7r71M;U1aSjOY;QiZcQFwkG^}0Nr9~=bkFTes|CH)Dy4fpj1`Dq@ zLM$6N^%P97)kB-Qh675aL@7m|&w!!>1K1G3q%24T-Fu37$IfxX}WKzJi#_J zPc8p-2O^pnrim_;bd@!=T|_gKK;H~5Ck1mPgy0=@Ug=FOUz*^3h-0Q!Lo;WjnKA(4 zH_&-vo32HF%9S&gwHRTeL@h?UqAimQn9#5zUF3AtHw4nhUzS|Lp5pRQd3Y2MLlGKG z$||)s9znovMFd-Fr>JYEM-x|e15(Hj=+J@4$i4ff!9@6gd#|F(P2ZmR*3H8USy&C* z2{!&2h*toF8P4o9dO5^;vpX1Ic+uHOZ+j2OQCxI?W}}{^|3~yG6>;ZrPVdzocEbB8 zQ4uunVFbLcQKEcODtPg>1@#?^j)wwG>j({`c2MDV3Ij!b=lSc~-Q2JKUwLdF!x;?LAj0)!h$&8Mb!Cg%xL;Fk% z+XKPW_upzX8Ioq3HtUvYb?|HWDD)H*1*N5>4`>eQoJgT8z?56`L56Kz3~P({5uDP* zawS`955*8@^ZCif`WyI9SYfj!EM!19#B^PMjBH4U1B25Sm7eiKA9KI9uIUQ{)b|6e_F$AOVQnKx6{)XKE|!~~_{P9V}}eUGP*W z&adgcAz&N5BBcWRp0y@Ps7iN()WpKbL0|+uUlyPHU|E`8OG9=#$@PkED9`W~@1hNV z{qotG?pxnxSP|~$TGjGDv$io)(M!3;BbCg09DP50JScf(^{bPY1`ip|#gxb%d`i+v z-uAU#cBheH=D71g08%#;?b4V`0$V5QtyqyGwoWM3)ys+lY8^SlG$xvg_=$1AJ-=>L9 z=JD3acxTiBb~%#H9%O=Q;Y&2z&u@=;729Lc)p6S2bIkSuy^O`+4HWk`-=r^`ye90{ zr{(NK%BCAym5qb#BW3-J?r~GTiaB(wHypEUOoJ9UeUVIh{chJ25iQwZC%1HeL_6tQ zPw-Qwx;=<`EzhlB=HwS;(d&j3WZ$@+9B&YSIW01HtyfPm!0X(3+Y=c%QBmPGZBR2zaxIk_5x?v7)kNA#e1Xu7n5QcMijh^+xkVM zYr9Hc=4w7CWbI?{lBKe8b=hx>EDSv;$|Jm=|u#f zZvinzL;aPydlj42V`}Hamw@-k8m(BI&0!CcW&Tud36^FV0<4F+FapqjdidWBU_{J9 zdL2~=35J$WMW~{f=qmLzSi(K;yUFY~ci1Ddhj4BvN%xlQ_^B_fSoH-%L!Fn-!Vn@f zZ|s?iGkAnq#6R-tJ2Wzsl}9csz=hT1^p?rmI5IT9X$we+j8r;sRZKTalpfWF=@*A} z(6FsJ8`p|oFBibe#p$xUIO~1ThEKm5r^KPvbqfh z+M1jKWXSVD4QT4kzXpk~_$fq)XqcBdt#IM6qwHsdz5^lagg9}36P%?`%lSfL^EZ!! zdOwD@`=)_PM`GzdIBqg9wdHkAXAk2%NoT7D=zKPP*te7os+WgTOM8X~Me(YZ<`!Vg z^G@y5wnwj_hMj+uaTUylx7w83rH*4h2qZw$wW2=k+(1)Mx8<|+0*CkBOfjwU1 z?{L{=s+B2e$j;Dzpr32^1T)uwkv!-M<7WZ9TU_I(YJAK6njq|!OxElcr-OpJ$%g_6 zZnkqUiy|@DiL+$BEG+bAwf-@i0zLl-h(Fg!p~AA7YZ!qTV`+)52{l@EcH}z;Y}632 z+BXLYLoqC^24Xg(en&AX>GV*cpI5ITABrb%Jr^GK)uwHKV36;5kX3m!|9x%^RO!N2 z;_qhYKCUjLE8yc9Sa?JyRmX?l7T$7qzWE<=?DHC8Zjy62Hi})wS(B(5km6*fnWsY@|XE4*Jo8#M7h=AN^!H zU1f{P7twtJCA#hoG@l+M?UIf?qa1AvsD#X>`MOakFSR7E3%_D_@l)w6f^3>D4%@lX zC{fNto;wr{hI%1RiD%~@W$pa+0a;u|S5(VV0)O$$fz>IoaS)1SfPkXtM%Wg~W$jh4Hl8 zlkM2|b;C~Kw!9VW$8)BqXNHVS<%)~yvC%DDwL;M>N@x&C-!FFNr56F9ii%P|C>Mq) zXG_$7n(v63yQC65r!`sVXlI65QV*h4$$C~}HHpTX7de)^c_fZZVYEm&uPdDEkg+%< zA+9+YjmpZNyWjVJ3Him;_JZc%OPnI-YAiHj;9JSZ@`o&K$3swQ+#DA}z+zAVg2V=ykq&;RCaucaBQuvUF^)xWKlF(v&FS+4^N@E!jdP}d zNF|!-xZr(=4HLqz0%beLFAVbSnuSs_ONw{7JtM9}T+S)CO^*J9;OlzP>aG%nAQ`uF z2G@uFJ?7zV_^b;)R{ofB8kts|e(Nr9bp7CA9o7cx9?KUcvk{c^#)DmU9MqR-YU~Nc zF=M6i)k}bgf-=AEd^@T@qmiim7R_CM^8e{P=IJK7Yj0GhEmCUKnIMA0>I(}%Fklk( z!O-KbjGiCQRUEE$w%=Vq#)Oqg9#;CO_rZee)HiU_-rZ}#W?_H&bM3P{t!~QK8&hQA z4h0anvWg@(vyvvVbK(8ko=X@vEn28F>w^@ThzkgRH@fAp zk1YXounX3A4)v7_Y_)gxaO{~bw9WUXOKzjkISIVqeTCep3levpN51;bhGF}dCt*T3 zE63$qz2f@KuM~DyJFG_)tYu8^-h2x53U$|b+4h-Ly!;_5Zm+M#-T-@;G4$!FXeXFN z#>Iq}(fFv6M1`$QkD}zyL;@W|$w@H_Ay@^(JMQd2`iYIYV*}2AGBbNmX0)Ch zQ+a~o>9mobbFaofqSFze9{th6{>$c3(>fqE97-B01az>>ZY6na| za%>pI7Vm}ncqKtV8!V~LDm{vlCw%i zicvEoQMWqqWa)CAALjXg^cV7~x*%)ABqIkmJ#F`@+GXRGwi+=*o_H*;&2_?>C?UJ~H5II&?`7oR zu;%jHc~5L|-wxt`6E$Yc>xkj9=Oa6Nj|Eu0JpyP7VUPDLUt7?t*PiL|Qd{jB4JRKN zYzsZ;2z!)BGR6m2PC)v$H^fow(1*V?>C@t?i636H$Dr?+i%|{+Y|KY5i;BB|t-tww z?mgR^(o1fxZK#OLs6ZygPUts*E;Dp4$PZor=J%Jw1dH7c%u4;m`dyr+co^XKnBt61_UNk5*pK|C(3AYt~l+*7H4MN25jYcrD zF|%F2V1w-mgwtKqe?!m%lEYjQaE>Xvc)-$9Cp_^au@0pq5k8+WTo#dXx%v*S>x;#R zC+E1_K3U@_^S6Goi!@=4`V`ZhhQ(eJ+f)aC-3UyP5khRzr~-C(2$iUaNLE~_r@A~l z@HzAQ-E>Iqfc2P%{q*0;Ut%`tB?8qB7DLPZR& zVEsEd+j$@Xe0J*fF_6i$5@|Olv4FG|hNrfH1VjG^AtAfj{%$|=(2Ua`HEK(B=*zu5|0j3|At-e^Y= z9UYK2hO7I5&z5^Q&=_#ZRPU?Lx$dLAA4|*VqG7^jpp+KOdZ?E+g+pf=(PHRLip2i38%&Ll@-f=oTI-t>!OHa=)p1eqV4}5c4_610x*Usb; zZk_i)v5WcG2w#KG>7ycR??5+gGz3_OgA*8rF;T1~NGCVZ5GtbcV&gqJqfaui;F^e? z&D!Zh#`dXn5pO3dSrmTN?wDGfBms&LaknShkQy1DguEP2<}!AFCSWD+tI(`p3I>eI zjdeN8vX@}qs2+omXqHt?6d`I&Tw7GF(09}vT#Qp-|C9)vgizMJDRr-}+p$2t;zv#E zcQZNv>2$bY7H$@5mna(scVH*f$Lu7j$cWFDfk<@F9{>hh(hj<3;xIfhHXOL2Ji+|Z zVj}L;0CgHgA5B(&DcJ~!@t?-lt?nC=>^yPrt(!iD3c~?@q>W9Qwy5BputZ_lZ|t74 zX#Dg9MxS8cjnFN!H7M3wJY^{8W&bcyjKVFD_e8O&%7b2)r;JaBa3=dfJCPxh<`Dn> zU>XVyBgL(9>SF~zaZn2H7AGjGQZA$SE6V!j2|V6p<{pH9rfEnNfsMI>nb~O{_H>3n zD<7xq%AKN|+zOK#h~zgqkF5BInF^n3Df)bQ=9Uh_c0ID+JqJEkVsy9k=SgY~Hk{k& zVh@o0dxsgm9Ec#@{2EqI0lFmND!^9V(8|4rLRaEzqosHh@x3} zs@pO2gJa@<9_RsIGd6RME;T}J)UuVtT!rI`2~y=!q6W2kvVic>pZh9zf(4BGV}Vg$ zSb9fA0WDdskNe!yeUeA4;cbC$6xc1|b>(+Gays`mdTi2jeN9H8Sm^Yir+Z1~nB46L z_TeIk?x-yaN50p0kP@FEHgQ}U58ON|(4AlgFUz)nb^>@_J;kQL>K&ul8LX5E&u#U( z%ZdF!fS4}wqM@vtivzBLT0wt@nMIBNr8FRP^UaV}!QJBvH0C~DrDnL=`Gke~cK4H1 zT%b-EkPFYP4Qul}zh&r`{wgfFygvuduvjFE(mcS9u6St_b;JC>+KmMa!>^fvWT0_q z`&y!Z?ARl2mV$>@Y3I&72vJ=+8u5!yk)fxdbr@$V;|#7^t{y$g#>tc}1of4$4~si# z3I#5=v}&wyXd^C=R4h(y6Y`2mC>D5o7X#`>yq6i5z0*Lz#<#rIiRAK`>l3qq;qF*i zsfRk{D6=C+0qLmvat)1kn(s7{-nb1+`Dqn@x_heN(3VkVi0zsoJ>{`^>-fpgoR&yw z<@%!JlEp)zC+gwXr&2#O;aD5!)R+E9y)Ec+LA0zRMF1iG`Xf8vZR_Xi1wXU$K&_}m z?8TjQDXJh}=dl>~u`BrhB7DXEm!H!^l?rV)A_}r0T8dR_#=x=l^$?>)nD;?>90~k? zkpB%R|3RlmS1K8|O53Nv>{5_2L#9B5aP+p=KOt+E?SIEl6qyfIO&Rf@JiZ{@DKN$u z6}Vx~0R#(Fbn+;x#jJ4;bv#2HosrwQP=^|LHYe^u`7eRUK<9LGg(b{zEp4H#-7RuN z3H&+fNv#_xsYNa$YuhBGms*p<<9OtMjNrRIp`~?~E_8*DBAA^;BhPwSHi=)1*z^;g z4e)Wd#{(0FU&Y#pjyBQwm!vgp(V^k>i#O8v-pKqyD*#ADC@%B*A1YKO>+|ae(JCrL zr(;WhAgI=dxdNEg^qaR~cmar?nHWxsO-1hX<~R<6EtYjOzhH$P381Z3x0c|4=~)#$ zly)V6qlYBT!)yyxb@g4;kH*EIoTMh}6(#i(>!cp-n(P{NH__I~&My_>>C9-<8(;fBZ?+*W#8Ao~ z*%mrQvXC2ezQ(DoM9p=|2VUKO!YD{rA^P$vXj!5hugP}4DcYres;1dM=0DO2aP0@J zLuw$flGAUBxDQdaGM-4s`0@(mLJR<$3A(j+c**w2RFXPVl{?QBT356-SqFhr&Fqjc56^ccfMm@2Qv7&7;4FeTnh3k8?ZBYmocRv&en>e^5=kMYyz4}vAvwxU*fSPqw5~c#*rw&f=qpfIgGCWq$)}z(N#>hmmtI& z!|c$=*llsyHA9YnJYYWu`;c2d;I_Jy7Ssa=d46cYl77bC2tyM!7XFC^RIJY$;A07$ z_;+o7zL2@tvJu2EGk_J2pGPz}y&bf|27F^DVX=`y!x_g&1LP5Ikkkcj8!&z7T;D!T zWNtN1rM`4YItPvW2NMEeDJ zD?XjNujp5Q@TDQ0x$<|{y{4pc$!%#HhXNG1QiE`yW=kJzJ;-0DutMS^tC(lJFVOfH zB*6>%olE{p1b%c&FK!R=Q)|k>*r0fof7ibEJs{QX${yIq>iJLOX=+Ibn{2x+7N?<- zcdXSXj`%p+g;e((Jg6dJcWEba7=A60QtqFnB*LM9-fPUaLyA~h3PQi6$(`K z^q(O4U+ISyG-v&MDqA(cjy~O(41eT?ZA^2_sR?V;|B&E1+_{*CBSkZXfZZC>b(FVo z1Vl=`aU5^Wx1&gRb9Jq~7kEc!euPHVd^j&`vN-A}>zhdNjhNToaocxE64HP5Tbv@^ zEbJqHznV21Ht*-do28QN_B@QFqyoI$IH*=lhr_hO(e&sgOa@=INvar_k?676wAWfm6ydJ=%Kenq<2kc-J{JQpdSj(w`38AVc z$YXW-mkDF8W)F65{-C}P!E~lGq{ztFLz|E&nEFto#Yx8*&>pIaFymOIDi2W=NC|v@ zO;!Tcd?QCRu&t&~wT0x6EXW}wmE|M4MU!J;1MoAGG|-5kHfX&Kp!WLZ8tl7{=Shoo z+ePt~-JIwaJ1=XFvC;Oo9-c!(7r|J%{LCz^Q8%pi!5sC=fHx#w!t1t+l@^&>mQ;es zK&4Pmo(;=}4>9dyJZ|6w;vh|2u{Sz@?*)t#8CdV{@$xrzb}K8&2S0YX;#T1HPp89N z-DL3UG+lojWtz8nw7!NtbrS*!j%hSpg56qR5+Ki=4nzQY`jZvAPTLe98!j!q*svqt zTIf&%{2u&idY9LRfWZ@i@xxS^ad>G4b6wr5C%r9{fD3jzP`U<4Y;sgb5C(96vlR_0 zAUo&-``|Sbb#3-KLiUcpQ7@7?aQ6CaJOIR&{>~Z=%Et5i5%W54sCJBTG+1PAT%jqY<=bMEF+@UV|P~%3NP(80azZ-$W+&y zk*-!Hu!T2Cg;gXOwzsJ(gTlTr&4ZV?M9*4YOF#Gr zSxbcUF~##OEOO2y2Bal${8`k#h45|}9VHr=|Ep$&3;l0DED>aX`-}EW%rk(1px2Fk zYqh|V#Ii$95Ia2%jr;;BfNM@Bm?m8rW_3JC%EaOe(&aD|Ea^zxH4Q?fr#xy;7hX0EqC!s_Vn% z!GY?t4j$0K#Yj7U-~)-8y^GhcTnZ>kSuDNxv%P_M~XDK z31*mdJnwaB>4+AsrV_S=c_M!tR)V+r-;HvZ|Gz4mJ7665kCkWm47Y+PH7#YQ$d{A* zTutYqA1!Y7_jKvW4Y^HmfMQUbJMb}sVCd)7vE((qxd$d#w@eM}t%{9{NM}GCuH(=1 z8H&DA-L64@1c>It!A67(9s%v-5IwccMu|0=(= z9@}?#AQA`d4olv0a^e|Cectm@DFv9d6o!L)i@GWn3?EqOoroRy- zMLAt>GmlNU9kfOpzcI>A`|4T~PE(L|jn76s^0Be|f;o}ZN{K8925z? z=UZn^6u~CxU&()5eTV&1gvr0HF!O*Yu&N1Ls*VKEiSeb*IKu{MLzjfIRKsiEL`rL# zyB^`)P+oQie~Bi0B3Bk>Bv|KX@c2gY4O4%sWF};GYJVWLGYFjeQaj(`mNd) z>@*dckc}|STXa2<2u68zpSKG-#`KaA)gGuUmNjMo;cr}|=5L05D(D%q(o%_R$9o3- z_0Zr=e|^L_F267w@IWyLHvQJTcc~E8MQG%{ zFn*3`)zh!^XgFY_BlL8mj^P>l&)SwRx)uR6IknOXtUt7g-QTHCDy+CoD#Wl+7It{n z!Ez2o<4K)e`|5aT`J#fApUz!HwmnB$Mjfrl6U#Kdaa+Ud!s)tvua+wKvyMerCg%?YY1S(C%MB5*06W%Y9eX!i`>i(X^ zf5_)qsbn1vKiKC0Ql>XlDsq-APpq5NZrHF8sc7(wOZKd(HQgjVAB{u=&*Gxg6WajxrxcU^rKAeB{ z;m^1?lf9)!{JG9}!i1_YZD|~51Ab0@v zcDx;kM$fndMU9gC_A&e|rovNp1jvq|cz6tpQuZJ^PHCe3l94_pU=@O5=&syB3tPS< z)t9@>YT;FNjeRt6J6lqJf9AXvvF~&H5l#fwR+8c@qt)1;f6xT2s4fQ@OxTo^TM07Z?|v?o0DPK>PQbQod4tA` zu*l~p6zVKn+RD07rg6JC{yux^)fu+4_gZH**ezx}t&Z>vYQU~Je;IDGAw9W*o_JAw zfUOq{Qp+0miaAv%Qw|FVMu78ykWTR<;9u57(iAp&;M6A%V@i-N?H#AA6W{jy+**MO zLxJ3*!fSQJeN)5uTB^!5^Z5trse%Cv#O8Fhn zJQdLQ=^$HMaZ(m0f9ykK)|@8I;Z^#LLy+p!7VjyENMxS!i;7bC@r-BbCfL;DEv?dI zS8KkX7xM!Stz)*nsP*0<-xT?B@d?FlZ1W`T$FSB|i<}cWcm%zn2Wh>%%+OJ|oDv(J z+Uqv&1z?0iUdvgpmnUcnz=X9Ae3@}Z53NuD&;>RwvgUB|e-O9J9NVjtV#;=Ge_n1Q zHFpjNhYM<@#8lW3B}I$Mi#4-?VsDp-9VX0)nv{{nVh?D!(X9#l|6}36gMrFb{iD}D z3diGF|B?CS3G)q4NLn{Nb(uTILbzFZHeoF|0F^*Du^R>?n2&ZiI>Vh_eKmWGwT0h> zOsyX-Fl)GIfBnAW7^Z`tYlRckrn&M9hxT_^$p@LMpf$73!E{e>iU>x5tDM86B%XWZ zY2VncJu*ejO3&*E`?{D0Mh?v;;lH?Z+0yN5T~XsVM*8?cH)6`z=i8BDqxMT+NvsPC zjlCyZ`a1s3Up0-I*%$h;_XM23eg@er1&v1mu(1nsP%0W|4@l%Z*A!JfiOau9o6S*vkW<}!VV65%AsbxiB^|MX*!9bO1V}YRq$@P*q6x{G*>}LqwVke>oPq7E>enL>Lga@@5g@mRv);R znNMV7M)x54a&RsE#`S+hHv#TxMT#0^ehw?We~vDz9rDN;Uqyvijkdz>?{*~PnyQ8R zbNzxJ%p26lV1>5PyRWOOIKOg0>bqFI9{arX;IQRwm_NB`l#FA{(+%9or-h?t zw$I9n^ovtutN{=XSTj+iNm9@Mmxra@L_XnRC1bUWBgfIlkY4c(0AvOy(-J{1Q4G+k zf9le2;P&LgCYG5q))UYfnR91NW(=7(ZZ+|IaT$AFe%?o*Pe_3GIVzd_&P%$5Tn%Wk zGFqx3y4uEM7U#=7)C1`OEb>Vh=@{1F)=xF-e`QK79plb@TEel zJQiv6Me~rfoEP6zv{^#lS>83B4?Kw>kE7_phmJG7j(Wu|Dl}b7^jZ-$z7t=Oe~5@B zqE$fK$}gc2BC9>mUNudX<-qVF6`u>XZFX`tG%zW!jH0Rx%hP;;RI4Lbhqvx3E8o|lYb zJ=}7eCzsy1Yyf`T_H6$HELC{fUU4N zx_ApEP=^@R+Wr54x%Rwt#ewaP26(snCC6YcHO`>RpZyz)pDngXAg z{!wpM$#fIFJhv%M6}JNFfQXJ2!ys)sPkuEz#Y8rofnRM2HY^=Ge@W8wVj%sd8*V?f6ToBHf9G4xCmg7+a|_n z#1))rDY@bv+f#s>DuB`$0W97pzKAr5A64g5f~eJ3M^=Y}pJC!)n)9G{LubqG5JyyQ z)9Z2I2=I>GuT zb(*415E*%~FB0A@DzU0@$X;$BKp%E^$aAU(JqH=EEAt7NiTw{t^b<9G#Pq}bKcF{- z1nFCskg;fxZ6H)$T`Nnp;??}7JMli`f!GTC_KCspe^7MudjdFKM(qiZuOxjBPh5z! zSqDcAixS$Kf8DST31dXvDQ!91!X}1RIYXin1qWOe)Y4CzofSxgaGv1m#QAmvBsH>1 zC>Za|>fDY(t;yn(Iui5S4Gu{S<9d(W6Mx##JC)`A!wg9ahJP*`PT=yxhoG4OPd_`) zy^o*xf8OaTeuV-kS_k{NEyu{&M(h6&-K?|slFO4s^5ijVspQv!)A@leM4u`_{o38J z1Lt;h1Xxikt=q>w>4+Q3k+C$jLhU>?f?}}D!Sx~}=r-VarGs52aY&0hkJ;~ka?%K@ z-r{;(_>P!_C2-i(26wn{_V;@?fzni>-SByXf4n4qJWTnK1CdOb=<48sIPV%itm4tJ z4JZ5{d5tfWHVGbu|B_?$jSQgf!Wy4O{SU%YDVwn3VBv%FHUHwmI;ey8E+$4<@ zO2mj1ybS|8!wVaoCLTKbd4t4;q`}#5YV8%P-)@5nl9%gPThmX26ZIx8>rA?g&&5)k zf18ZR)3=;X>znqF{WRjDQ`+62d0h06>o2xC{l5IP_ae?9`%TGRxCNNR>C}8sS0nb1 zfz4p^)LiKgC?8C7B72BhdR(2}y``+p<9&N*Vj^tV`vRJM=s>lq_?SE1$$xRmDeQJyc6)NlaeZ^{T zBsj>{Rygf91;te(akXWxiV8Q{)X)awg3F&n6cJvP4e389oGOND>G*ka-(whIe{(6( zd6r{5)sxF)Hx;V*G>oUYq-+4nW^0oZY%`SLC^;onBMA+Aa zoOI+hsoGxbF_7#7IsH_l`BVWH4J9%Lr`BsQH@cYCtKm8b{{28%-0 zKG9fB{!5Q*OaCUVF7{}PjL6MRm>T@brn+g1-T2Iz)YY|gnc6t2NRF!=+#YWrE9EV$;HJ%m^tf&G7>&l-wihhZgVPm!N+Z?4U|pW$-ujIJAcg?XWOlA@ zN{gWq9DaX0y#$TT$5cG*WWFNphs<>f2rNt|7@F8=Ls*` z@OvhH)0M~`|D95KmBMsfLiH$37GcU6A5BqAtE$Jv^+slqwnL(u%gU^>qkSYdqV6I^ zFAUQ&afp>{ueI|Irq&3$9G6Qe4bWLMB0Gyz>mE(j zJo7_*%}&hYgl;R>>0(^osUh}aDz|`ElZzj7SM^iPgmZ(qe}J5>Nn%?@6S_3v3qP3> zS91_UZ!dOrDKiG5iF?BF#)Jb8FmGB0JOO1SAK3(Hk?a%X|3ggS8IXo_g;%XZQWOUC z{3E5?t|tOhCr?Yc0MVamTGI=sDqVGmE^ayyeEjFTYX*M2xqt=cCFz=)7k2gYKf&SIhLwGl@U z!$iM1u^>IQaRP3Xm9F=YiSUOsPL?7M+FU`h^HsQ{CQ@*)6nKjOk*ixuA-1g8h^D9u zl!v`qv6EShZ)Ad)ls7uDI8Rp$i%*Tqqdgp(f7oDA+kTB~?!uzOHQOF-i=vg&81u$n zdtG=o69JiW{jBMZ_ zvE{#YCoXs7**qUNKuuX$^+0qv0>m^_lXzAw=)5_a$G@&z>+P)|cLN;c$tG>)2C5tP zf0>eo9*lONNyY+95DE@^3rde+3({IKg$^-!En#zvc zK;{TfhSupkie9(pZ|#fDdN+2n&tAEp*5`m!s*A~4x$!~4F)n6gdC{&3)}|dQGv%>8 zJp`*Wb3rgO78y_vE6nyu)6DYpx2cTPe-d-pqgp&Cse-$OlWk!qw(E-^(9GYNFxw<` zjp|orkQM-~1kSY&TflsslVMNOtD$4T-b5CpS-3ic648J+ZmaY=p3slu$~IHsce8_Q zlTNB(&yo3$k#rru9A!YlD$9~Dh3JrYG|jv5B2s^FYOcriSFd|1Ix@IAqiu!qEtFIJ%j|O zLH@U?|HeH%w;0sbP=%mmd|PRmNu1&2?5#92h>wugz!A!gcCdPEZ{57WAmyHdQ+kWl zK3{=eF#g_o%4&u&z640v%ni4MpIcR(PSU$$aq76)mVWW4nZ=ru{Iu%<2QZAFIUv&MrRO04bF zC1FIN*8Y_@=i%KqViY6q84u^l->E`yO1 z<$&H#@c~7{IT!PxXu0Y9d8d!#3S9)Y0Y|uu9p+^KZFmZBCBYTZf<0cjOna9KMb$L! zF?zr{s?P&tBhGd-t8}}$zeU%m^+UVPNFYTz@3$A%@CFGsR*6`Me{0M0B(eo^Z4u;~ z8*l6A(jhguxWTKO|MB0h%pJ7}Z$R=k-g_etZR5wU?O(MTv>KHtsc;u-;f|0(&pD%>w@$#o0_Wtz2JQtaJQ29E1(aO~GQ?Qfwzr*@Ew z9< zF3u`1?1lWhec6$b9hfRyA_*QD^=fQTEOL@-w7tlVxwY8HEJ!=^B(vKIh$z6;Px zWedHWBt;?iV~}(Q5t>uRlhGQut4Tv!wR$m9=iPUr5Yp6rkacq1c9Zp2^;2aT#sky| z3w{aNYFGrqZZBAJL06BUTmw>-jeFqnx0VF4>+0JGf8|u+;48n*nYegvjsFMbVgZ&T z?dmlZaa!E&Z0TY&L%UWjSiS=)#kt(Iy8e(!;%ZjD!YzkKEVsPrue#)qZDVysYpKPH z3!064tBS>k%MRdP=|*I*KH>r|FDY!yxocCExwcc}wI{y&( zTj@$+P)+Qv0GjK|ugE%-pYzM{5+Fz`^?@u6Y`@

    dilQ%`{%O(%J4wo@eA~m-=Ii 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≀3X34^GieI>c`f7t~Ge^t~=x`-O?xMZrI5`QB! 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

    pEaQFsbj|m_}vG%-@$;i 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

    )e8&P<1XZsh?*TtlbKsmgz) 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

    o3+SlHrMSu& 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

    LD) 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

    lsP7Tt3HIIT5HS9WRsx8Y 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%0AE z{m2zFGbjCF!%Vwc?#q0bG-#Y5CpSyKSTbgm(6T%o`}#^4UnAYhT>0%|(`_8E?0AhS z(0_z~XlA# zF-IIE1x_Z!wWs84+pfMzU&d%fu+11=8(P@(9>t?MH{ETtufmF|#&|WGk6Co88&5Gp zgpE_EU$fDa4L-Bq2I{-Sh3c7l^_5zEtoj#!7Z*N`OQ0C7{4z>nOHnXmsn+liI$WQ7P1ypOliJn{A++`dsxq`7)>MorSGwq}4iY^`@P!oEY=ea-(gqI-tCR@H~b%Y3i&3)qd zU}IlR*5RSN@1l0V^x}qZ`ubn6GjUl{xXFuXvSZx(rk+`uKj2yB2lDAq2no7`mr;&$ zo5oC9OCCasHn(2bh&8$!L&)lbU-S=pC}tlRXxSVmEMygb0$MkpiS8IG@$amOOzXSA zGKd#>M0RQ_vPPf*T)arL;2*$$?>}V6)qkJZPn)lY=NsY3@ck$>YIq>A5llbp|3>#GT_63s?sm{4}L@V94r z<_;H|&{Un9>hm{YzI_5xVSrDmnlK4-iPlMQj7jD_%y3dGwZFewJXP4~|4cnTp{09=&js;ScaL5!ln5#2y zw@g4`OYH>EByK{m$>UOPQ8`rN_;%{gAu$FdkMj2=@|`JwOVFEt983kx88wL<{5OKr zqmBzj^z7+afS#7Nu)a`2Ed|eGX4UirL1z>&)>D-M(~(hKV*>uiz;CI#4U}&jH3f1C z2qZY_;uHN#*UlQjGG9)qV=+H`D|a|Ni8CDzcpYpgsqc$?d1@8VFlUK{dlx>o(4Omn z;k{R6DPnA%mHpL!^{c)t?^0OQf_dXPr)V1v!lH=a4UR+I28ENMKSiUDNRL_#({3Ck zo=9Ljfgl4A0C|rZL^*1&PTel9P!JCa&Tzea4z$%L?I!^e5=2>n-^PUOx-|=vI^3~r zw0GXbMgJrEo=J5Uh1tm(=<;`vt=j>h4+b*jlp6<4AU7O;F8>d{OaF5I>nOQOGbb}= z_@RydbE5P~Onpz5pr~s2m$b3M;(TYdgA^jB1GN!_h`pK%`oTr#oCOcQyNB0a%MD|A zhzw1KH@HPK`=Sm+Qn+;*P3fpjju5;ucZ==-%5Aie$*35nyidqn#*chU8!RkVfxFfz zB94v;-NCefZOg;#>`D>w;}hHuBC=SSvl5x{F{QE&3i?E|RL355Mn-G?24u`?)n(E` zPXp1iPcbKc$~_UnZ03mHM{T{Ycbs+W`+vL4x7M|DJ(Bf1bO%Bj8*CNnXvA%&c$%PTp+~1)-DZ2$wVaqRB2y)3J5w< z(3RT8cnX9zR-~-k>~-&8u8)l|wip0uJ$v@yiSnf{jpv-%Z#NyU0d-qr}{%{Lfy!?kvHbolmv zhR$~ql;bAaX%B;eb6=U&tqBnIn+D65wQ|{*ON`qb;`Zs1I7;9rDtq}B;jmt0J8$71 zX+A09(dAk;f*iqYl?2roq0Rt;yv^rPuq9xIhNrm8ueAMc!^5%zTioR8QX$H@B>)<~ zsq2Zjc&rF=y;=yjjG!!ioGGH*2WtL*Zr^J%NE_FuDY3v|-q~h^*w{u5J-iRT8aqQ3 zXaUtq7S7wML%fXh;kkS)XwZmrI`>u~Rrfzh)-DcrTRq_MhGZL73%E^_IocWpn{lj9 z-_=SX^>F9ySD?Z8+w~WEqLI7X8+kkBFqt}h9LK*}s%}}0P>w(ed9p)qn^q=&P>ZJZ z(36No^s|49ZEs?Idy1N|DOYAdIwUJ04~kh-;2DCkMfetGRLz?SzosUxENwbE*QzpdG;tbm6M+>EtHpH&uR8U`$OU-E2 zE1r32L6X40h4y8|r11%1gqG7~Z<<^%bq?geLC^rT;Hau>!6bGNxROvtB|4s| zP`u>0mS4Yq^sdVsuj<9r8|E2ZB@KDm z_EuWAR*Y#o0u`DE1eknJ`t}H(M=5^90NuC4eRY4IyLXfvA{>RiUzODym+L@uHvk_+9w-=USN6wkJ;=VpZi3$%%FwpSGGv*qA6 zi--YZp|g$(?+u$7dvhV#omxXCe)LBpFPjqS*Ba929Pj?n1BZM+M`aKaZlCQ2Phr@4 zSKNQ%2Cf+!+yfPV;)o?{IQDfv9=}slPkKW@PFg0HeQ6I07OO;{o^7C_jq*m=?qjt0 zcYk^y__bZTU=8VELH!Hxr>byJzIBP<4H^pSN6nv5ngp7ss)@|1EDK!e2r&LVfk|zc z2BG3N%BRMvz}u*;0cF&TI|jx>vt7>n@7>}$GEL)Vcez`CadC+!=1KX=o$khiaTqX@I_dNLJi|0pQ(bOk_F+JtJSq)?1{fIV+sq9rCc)34wA@u9rC@ROaU?K^Z~1%2c7L z!4&bA#G^WYa~V(C1DvOse23$K&)KZS1KWbLQ}Zp;B@nh-wEvY<`!D@UoHEaY*F@PS z5_P=uJ4b`Eoumf@wN!w((zc{cUkE}wo3X#h(wUlZ!8(ftbHCAhnvO#Ow42SG=&2Xz z;p+iG1*i(g4Xj%O&)rtwaJ_1bV+^Ps7+L_hTR$c^Up;M}WFQd!STzKC6E-O79BZp@Hbh&zY6i1*5O9SLB#8!Qg&wLsJCUUK5|xy1wjSrFtiG zchE^Q?hWh^-Qh;ucI3ULkr5LKA?lkrjePHad9PHnq6nhi^P|SAOUmI^40iY6kADSi zhEPN4pU3v`y>MNGP^}sj;}Dc$*Evi7xdxnbTU1{i$w|ku3A44ShhVW zMdh-w7~$Hlx-{gvRR)FYgj*r8y>!0ouGu`LIIOb*Oe4v01%I;LDBT8C8xQcyiIALs z35KN``uzR_s5Oiuk!TvV+I}ZbZ^d=?LAwXfUsV3fzJ_UQ<#S&j#f2Yc`>YF79DT=0d$ImtXEVzQ&oVu1k@D;71*A>gWIDG~GI5_HJ_*z6| z_shLI6NST1_DP@0lU-Hj%dqwPI(yH5RGt4uGfDkX91|$r_u`)H-2o{&8odT!VUBGvLpB9TW zsi6B6ZRoM8FRiAnMKxq>k@(mq(5ZJ@2@tilc1)O;g<>p9=E*Pg+O&QM89UP^BwD#B z{>y4eS{_yCs~ZCyJrHO~#YUp_@O2^A4>5OfFv5%FQ<8%*B%-eV*Cx63SdaLu>>Rv!(jZ z3(g5wtPJI^L5hChUZG(IieA-{PZQW8h}&irM~{*B(8gHs-8b8U;xSi${cJS1n8FUE zG^o!uus|~i`1T_%bwdQL5>%lp!(h-VoN^)j{M7^P1+0Gg*@`r@7J-!ut=G54{3^p@ z|B#ziN3~Ak;`>nb+oA*(gXJeRfEgnT(_Lzub9h|!(@qEx3aUKH9vT8~iqN%hlTTZ9 zp+p)Ih2hbh?%nIvHM3lQoRCoChQ7{Ou^gk*-mK|$numZ1ioZ7sqTW=rpJZvvEV*L5|g8 za%aNwMyDz&)bAu1@W^>?Z+`o>H_GT;mootl%hEavwM-r1%a7)NN;V~a=lN)WS~}X( zC{LZ2bqW?`M5hf~iQb6GZ6N4i$p3*LoivMRLr(S%RO4TI)RO^6`xc4DnN5XhQ_Z0& znXa(cz;7ViY%)Bg>^#$0>q5#wObqFp9eRtviO;GznZ`{D1fKNp4 z&FL8vuecA1kE&$9<8ZphsA8O5ZDBxzAKfaws=wmYeX6d1-s7y2AiHh*T=Ou(G@bIU zH*!GsqEQMS+JAQARiidu?GKSe-zvEgE+i_~w{zGld^A=sA0?>6%Nq>HpVT*^IEtj? zTLj8{7P)0XIQ?767tR0LDCPzru}3ozdX$0Lt>H)Ryj(9@M*pVlC}a~bkA~dSwD71G z%qo}AwMxT(0fU76ERfJ51Df@)niEsm${{nodupmhGdN$d;Vr-%_KYo zLk)F&#a@*S>EeqtE;^2Za_PdpO^7B_FU~p!7%)U(dVI~+R@X80v=dHowr$`O2ig1F z=t9a>*or{ah(iYviJ6Nb97fPXQ9egjbi*vKH*1>~bW)tI0#m?Pclcenk;ydoV1YvO zv3tXRak7t2?WYDkM$GR!3Lb~&5Yj^$%i~lc<3IK#lh$A$=)C7FA<5(H=O#lj4?d3I zg9qy@I=imje0@~(^@t7KGWzc$@CDRvg6rSc;!Yn&~tV_pyN>M#b0ki$R&*)JI=u0p0ifjy; zL`dqj(Ep=184f^ovYBz6)vehc5R~E1KpAffre4 z^Zj5|2H0Wie-d%NDVxxcR=rHpnKZpu5%UiX})2zU(NG7#~VFoOzN>xo281zviWDO0WgB@9dH08=Xnk z6X_~?;Q^(Vbg){R+th1f{(I7<@Ax$}Spt^W?oND{di#Q1%k}hWJsu7{<^cr^yqKgd z(#}qt6DDk~8JvGe16FJ%DCrb`v5`m9GP_N7TT=`+vFgPo1y>!(6Ff>aMNiRURLq9 zoH{~cTda+X@#pIl7h3BJ4$9^Djd@W2N5l)MHsNQhm~m_0;xBG=)hokK!+#zD(6eq= zuv|hOwPoe(0wSvTd~t!zk`H!@FF40xH|nZLDSz`oI~9lo`Rwa|p+_{R^>n5RG<_@U z>;Imf{4mcY0)>wo+MFHYJGO2XsNQsoH6n5zqh6;0VU9%i-`^CZOH4pry(?D|6o%(x zP{F_j-<13l4RpQca*ybJsuS+%s*|gGRFgrNofDJ^GF4G|(rK@DfSFH_f_(cxttYLM z7Bol5<~flR{_#?Od(V{mO|*YL&m|>Gma9SOyvtv{a;#8%lCCjX(jCM2*PZduF!pzI z_XN15-i*9yB$muZ;y(k@;r)cz^oOSmo`b`7j#Fa9YmSiXEk@kJ=dxHx`HZAykW)|! zuWnBnD%e}~bA_jA0d3;^*GkfGY2d6OVFy0~0`O@gFDe{=*)*%J_QlUM&2@8paa402 zR>87--u0q48GYg&M@LmZluHXESL#Z7G1YdXG1i?RMuXZ*&Ew@tqXj#IVVLdI6aw0z zf2`zXfelDyCY0$jrno=5x9C(03{KXdr-J27jaKbCPSi=h+`iTAy!ov71eDZBYQY_e6(# zq-Xm%I!&x5dn3u9#A;@MIV1d+~}W{pVe=Ble;CP)B5K)%0ZKrDEYU(u+E1Nq zk*LW!1rE4~rXiY;fBn6m`u}=ZVVPF-TCXr7ZQ=|q zc(usm=i&&fJ%7{E3*$iLz<`B%>eh`kt8H!d_FBZ;4AC)BWT4J^XU^3!rwWo!QeS42 zr_(1JY7{ceWQr2WY>$(LqQ??P)w8c+g-*v=z6rhjXF>9L>1Yru4|Z?2kH%o8J}s6} zK|a3ue*^R&nc1|pu&~_pZ86G96zz2!1xflgJGNPO?#)No#HV^9U`;lA58@F8ANTNo z(QAR;rZZ@P2)||2Um5?nG#j54C|jzM%W&t+j8&Z#Nodk#0Krk0q-xmfBoWYD=^9Rv zT**WG+OJUdZOI8pLMPjqG`j=e|VK4hWUS(LV;r;lGg!gkU`HWG{+>{YfE5RC`xOC+p_n-Z8u7HFy7aBL`TxV5${45s3xIc ze-E6fv8Ni(hu&_`_csh@)QY#(^LhP5&M@;J*y0=RDUZa>efUm#-B!lQ6MA|q{wsP5 zlF|OO>5GBM6F(c*%v84BEskwgzhG-nSzrnsTewH$=#rN4HAd+vvuP zDEDKTKe@g&@j{tYBg%oON=kVWD!GM z9pC1pw>i~k1nCK~fe2uL1(oHn1+cQ(ZNX0rcPA_|3lk8w^3wM9aq3R$>;6`P1dnXH z#;P=c4CJSz>hGd1Y`^ooKeLhUf3JAJwe(jeNlNU5X1gxPVVkc|HM8NUaYW6~dho`x zY^nkV8be`PLX&KCQbH0Il-56V5%#8&0U72B8icJJDjTbvvi=Ar^k@1q$32IuV++izmljOvno7Y%eZ9)HupoMl>QaY>iNek_tuJt?ir?D zCCvuD`+{XpXfNG9^D2D&ZRz{vuVI~(53De+c%oZ*_uf(~iAzz!e`~Yu^k8;0V4BT8 z28;rSZ8%R*reZFRhtVE~*>7|n>20Nb&#-WIV(w&le91L;E{Y|rV?eqM`@R9p+|?l3 zAN0n1T}g?6fw40vt`6`2LW1w(yg`qKYITP0_XL_th z>k}`%u>~u*8T9%4f8$f#eR51ZojM3)4|~G3q+pxOs_Q2Ykget84hgl~$>k93uO2?; zX9xkK#3h9 zXFLste_L$=uYfWECZLzRYlP|pJ~CH|-SPq@Ev#=|e{y4{ag1rrzLX@c9*(&vhZKap zv>Lh61sUouowDjOD*9|evYlgw#QO#~)S_bJk;kJ;+B0bZ;m2H>u<{KeSwD)*E+6@s z9mA||7Cy3|{H+OP?ftUvlF0<}Z4`vRGrHNd)A->mqOp~)Ll{c;YUm&aNwr~Y=C`II zMSXcSf9!Emd1}4YMpU&!z7=1M_hu0RjnV1w>CL^_v{hkqVQ*~5&o|6W9x;Xo+&@T` zmKSfl=OXsHbqQje=?rC<(t)+)0Iou08wr3IOuVFkl~=D^EED#n0U@$zG=707sqQ%9 z+FURT1Er-t8=Td>@F$*5pjt2guNginO~*R`f5pqS)q}ZTItuWEVCF&!#~|TJN|A0u z<P;nZ{s`8zVE2rpT{|Z=`Bs(#2nU&1C!C8TLWpBw2Lw* z)T=gL%Qyx>Z})s4k=a{v>er8lV)9y@!s`f5x^UwFwA2F-yxwV9b)mVo+ZD6>g<@2I zfAmEIr}auY;Ak~@$=kl9th;A7uIEjnE&fAzlwkY^(IOr{Xn#7del*wL3T_C8I?<<* z+!TZErZQ=7VELG=J?H@8d?L?Qr`~08l^E?z7SuIy$nZZP)+%}1T4*yUGCtJ$?$Ru+ z_S@#+RZ^}WPrVR37{+9u69L^BLM`Zbf5ir4))ug{b&Xx(qgkOLb*bku?IQNk_uD)D z5zGGs{;?OL9_@9*hc4%cXD<>iQ+2=L;Yf&DI*maNCIkO8Nw0k?c!e3~G9<#PF7&X* zmemr?Xkqp-i5PoyDU3=`PNRQm!`$W&8GoQ6h+-5kk6F73As=B4obnUy^@%OLe@4O_ zfqJ;{d=)po&0HX+T1TUbVpKdt3=}Ur&ISa$Uup=d3^g8<4l4k$m- zPxY*L$W|mI{ioTo$ulx!fLMiT8eOQ%WKr4HybJc~dVe|GJI0_rr) zn>|8G33l&W_}QbSqt6G^#Q^cg4wQs`55SOY*sFc|QOF8d!g$eXHKN)vN2updBMB~= z!$<;fc9h7wK9@%b&AKib0)}Y2v3eT)We3XgMz7MtGn3lYH*MVo?DFm{wF=1gYX03i z9thyZJJ^10BpJFBy4}Pzf6H1KOil^3jzZ`%om-Kr8v3rQzxMDs&Rj-*ugLTZe%XTj zr)%QR{4>>7PYzZVW$^ZwvGyf9jJ%*k4YCE{$5k zbOVN=7guAT7$|GT4ZZO@57KXFLh&7~oM zepBAt%`wkrV6@+jfAim+!IIL-3fK1PhH5haXe;*+{Uo&9Aq+%4p~8k=iA0W$Y29{1O&AkDY$YZK68Ss@jVj*;QFlSx!O#J2bddk zJ;6g|n`o}29wXCo-S1KV=!2qx(Dx!LAeK&Iy~UAK0EX7MVGi|3d;S2AgXmoXr*3D9C!-F*K5#qO{zvmO}sh$PZk zJGXvAfP)4=JhJmZ>-(nUaYMzd{fHEj>PNFhdpgqcc^}w2^VM2_qD>aQa)e*tqO~N^ ziAEQ8Kcl|Vf9?#|%oK=cTCOqOvDGegj_;!`1({iO?tkZf1MD|;mTXBE1O^);f(LfI zg(N)6)esFG&c&g<6R38FOI4F_cf%%~m7J1<5u*` zjmis|#YIePse4dJ-~=1kOZg_sSvETZ6_D&JA{_gLe;>EBO;t{#)nDw-KV`FG;;I+l zPJ!#8{BFRsk^mvb)2)_nThn!w79XRx5)`k5Kp5gQx#9%*q~40qZ9fypH&}WhAFb~L zv^0duXf2n-Z-e{Z7CthAJt_63dwo(;kV#fO%&KNLb+$n>wfAkB(eQ0SP{JRMuS>OO zpbnT4e{Sp4O|;(C4!A8$nCS6O4(!TkL*i=66Kp8{9c+vNOzF?&egZ2BT^!$OJ%W0L z)W_>q;}67NqCN1yvC|q2R^45Rq>twaJk-hr>r-t1zxu}vxUnoU>J#IFdm?ZIae995 zUFM4ci?0JnumS!A4{K+&<7kZ9$V4vH^iMDFe>+UTFC`VNLp#mYr5~b2#w$fchII3m zhb18UQl(60P-JsHOCd00Z^Mw8SCEOcPHM0V82dY7VZDIDw1>A&5)B(6j%@Oonj;GGJ@@J6H@QsHP5{cHWW8jq ze>GNQ_wzKf6~8sWy8sDyN?ZfVi}bRU|8jpP$4`9jWyR?bZ^#r5DW73PrE6SQ3T)l~ z@-)2MbI0Q;xh*MEL*|+$A16yKH=q$X{Rdutm@tU3o~Y3`<&zasI2ec^4JY}4oX+cN zkS3WcF3=foPq#(NyQr`Y`+G$*Q(=G-e?z%(rGKsN0#i3{NXz_3+IV}j(BClKey7^E zRLCjFk>r^CV#D7^!ThO-&st8Jc*Uz)KMHhY+ji;&e8hI!&KiNwW~jx2l}D^pp+sMm z?p-!u5YOgp2HgZ$l(-_0js~wbvJ%E*uL)H2pp)yEgg-hlE@7K_s)DI;Iwh z{`njiM9xtR9xH~FGuV1h$n|1=NJt1Yu{0Ryo?^C-NEBYl{RJ~|=8o3z-d^rTT`RolZdh{YKZjvf5xQbeyta-WtegcOha_CVklcNVE7~Y=c8k&Xs-)b zZR7yqW-n*c`Ef@;^?w)xY?Au%r}TCrI&aEY)M`z|+1(D~X_U(s&Uc4WFPu`^-%lYLE@PtBSa4H+|X*y;TOrfA4U94Wb>n zr4`8dc%o@1K+GGGvFSy^Up<@}h=%V>(9l;qKFaaT15)#PiPOQ|FD~#LLNGV z9+vs|Y6|uiq7=-e=xc%wh4kf|h|}#y`i)wOWE4ZCoR)WurG^>t5#2kSzr^_K;BpHX z@E0^|-9CdHUR3f?Q|~JOe_R4kIsEJu65aF*eQzN0+#d30DIghRl6c|cdi>OHxJA69FY|q> zUKgqkifh(X_{Ff|WVp;yv)Kl-E)`$+c~uhm%^Bn?rI6)mDrL#&e=oBvFbv~N*^0#x zh=Q6_7bV+*`Z%VjJ6bOip%?nS^eHgF!izc@XBir()W#woiUaI&KmATTHY4v|L5PCZ zW;84%#&1_mboNNk9oiMF+xn?2T$f}IvzMbi?X_B7R+&Yo@OmETc3)ZY76HaYzkkib z&34)~E{zc28e9Tff2?bF{8Cu=Xb1<7D!~kA|1hcA*B`N^rE_AeN;FkB{wYwmamTFN zkV})M`aDW2NKw7yqK|yyRG*53M$C0MQZf3N5WN(#`7MJsVmasPGb zn6~6;o}Cr2#r$;=ep*WkLb}b3p8;?mTT4ppDJPK+hBUJk;qRng1G&{ujBXk56hnT~ zcbC3Jqn*E{fPpcwig3w-?^ zh>7`}sqSr3e+z0X`Vpa=1#$p?)aZAYMPG)mvM&%E%T%LZpPAnpu=SX5GSxxnQGY93!8Mh`M~}l`HHKS1lUG_6A`|X z#ofa4e~j&Ih0dlhcqF|X%$c*rxfJHr}7xfMf>4AYXG4d4noZ zsccsIhX${tg&dQ6w*^+g^T^x4KrG<($6qX^MPsoh-IgC|rqIart@qz1U}2F@32-#! z%u%kt9QPahofKjf$l8R!1VTxtVN?;#a-{E|f4x`0Nq@accPJgJwHI$$!c5*Zi!uq} z1;XYm#g!${oD;j{2Z2eY?P_P`rt-lFC*1G6glub1w~jJsfv5>tm=w69>7z~)fOTn( zUlu8)4CA@PtDMwgT=Of$gdXEuf7Q4-5E-zRyNZqDP~e5S9>M*Z&AQerIMf8*Imb4y zfBwzu$0u1&zwICvA2SNyUr4Q|^DG(Ilxuog5eJ4u$jd}|_LVC52@D^uQ^arZ48J4( z3SBzm`cC{LDv^)u+d^9CJ1Y=_XMv>7)+z)bwTNWC=-b3u=ZFr*Jb0IM$~v!KUs~zP z*C>7eB@kqqep7T4d+O__IBJp8CAtdef60&+6a`Btt`PrPdf&)CSY6HUOwd7Bpujv) zfcN11Z{xuSr{iPRwQx;|xy^jsVD%M9Y`-L}0={D)Af9GPRr}cUyedi0G61=N3zU+3!@`!~B{Er{qfAUOV^@`6N_6P! zBhR$)e~<7YPEXz|bRHD!RccKjU7kX6acw06Cv4UF-37!d z2|2sno1zvXz@p$Bx$Esg&+k;71!sSNOh?=6T+wB1U<|mohKfhfVdQ@*Y;z^Xw5k;& zf4a5^&OUuxMR1+nqSt7hJZxeEkN0Are6l~E>4ff3vOSQr=zwc*VtofCe+U@s0lp}j z8!S=8GTS;ygSy;L^LMcdtftEP2xB)XDq7b0ZQ)T~#^PqM`n7t<=?eymSuZfVm-s&X z3o?50OC&(9ZD1fCD;c?Wd?P_GFVkUY<9BlC9i^WuB@?5JbruNDq&E;AN__cJHxpC z-@*KBAvpTTp&Wi!*TbG3xZY{@EO9a({*A!y#c#|P1L13ox`R?*e?EMJ6;63%tISo0 z2k;WAa0_WjAk~dxanBkWrFU{1)W3kTM>aJ=f;-wVGk;~X`Pm;{m_=n^olqn6a7HVV z4Gm+z@KFX6VKm>(&}=Fhn@R2_iG?wPu~W!g4$hW zJYFjL^#CN5t!SE8e-2?>`oIFipBK|IWBOo3^wS!hdYDfEc-~MW!zBZ}XQ>X3_6J%S zF9csi{2u>-{dlfr1Q6`fMYi6TUiy6(*)J|G%~Ye|#p1B=&y)T;WsU*j-`}4D-98IE z5Hz;sj0fVPo{DVbg$kElvX>iIfG4!&xZYqstj1ore9+2qf5Kcai!h{S{l3BvlFKQ;t2 zINXRZ?I?N_Ioj8_Je66Z+=O7k7_pYbM-!isOx!f*Nu57fDQ;C3!Pwx1`i2LGnkNWp zOB3ZTVcZ_(0$BVB4ZcqGu%4=K_lOV>>JLgQPZ6nnf7jETg*wooMe-_!y5Ff7(Be++ zLH-;W5Dxx~LICpPJXm5~q2H7hEb`uXqZD8cBB`UHCvfci?69r9wT~^+@iAF}at;4Z zolC1d@jUt0MyMmic$JOAV;RdiSCNf5tc!UPMjeX5{2r(q_6vxQ0{1 z4mqS#l>L3Y2Ho5LcTkyb0k+lojyG{3`8TIrU6yO2-;}}!uU_D40-rd5^ZVG@fXNm+ z>&9+Yf|7olF{k4QGSo`p;s^&&MM1>aGMGNde>X?93dw;Xn9wgpbNKR*PHdjvQrM8& zi{9FUs8fef1Dz$}wuMS6P=K$r9|r2_yFW#Pu(inKl=F${kx9=dHGlfGZpxBKx}|_# z*g=#a?SA4#V%&@MvvPAfsBz;#T*iJ}df=n0&ePakH>t(*4Q_Pp#mtCIb|T2M#+YzG ze>PT5%e#v!-(8tyn|#&9{TXNIcvM@BkS-d&JRzUzFn5u2f6(= zk<({5Bo3Ws_MON%DrC`rSeL9knUMlTf6`O4^&IT{(*thj|InH{J<-4~cHEURr6YE- zycjx`kZv;8D39}8%SyDz?9K=ZwE2D1Ds79d`$Ksa{JTZ@EY~}PisQjAcfXhj(qA?! zjEi5hW6~VlS}GJmeHaLaPzVFLRdgM4DQvE0o?fl;Vb!bJAHx?+n)ofghhcP9f9TLs zFoGV|vX`D_I(0EmV!2;W-FqjF9Z%{%#pwv8K|T-qk;Nt0K88E6=M~(VKF^MzLukKU zcTyH=0gopOi@C`XGXDrZpO_c44FtSd^n?~&StFMl2T-^yqPBRkyQ6oMF&Z~d6Kg23 zZXTwDPRMa9epT+rpe4nMP3|%sf7Wv+YrWfRpKf{}3igMj;i8sT5vB$X&@HuUE3Xo( zN9C73K7AGE?9Lng5As;fhgSNe69A_}Zjjv(3M6k9@eJYZihA0VAsY3GXb1164&*=m zuWsH$cJT2qJ^!L}l8lAN#p->bekTf4NeV!_uyL z^3fxKyaYpvNI zH$EF#KxwEV}3AG?}oJgP<=q< zvr}8E1;$QTboM-P@)JR$WSDQ=(2Dti7_4w7OHFIo6C)MWR3STuB)1C z(X`w$?Kzyz>-oJ9lxzi-3BhgH3Qlr7&~g6dfNn1ODGBXgep@Q9?iOw9#lYE}L}i^~ z_|14zx!hbaCl1^p4q)Tboza3fU__~6lGl_>CvNJ%2^lq6e|x_;kC(-|D__^9C%lw6 zR6w6~t_F`bai4kp2zTPdHZMfdU_Ur*#6!{%J@1X6M(){Q(*LuOW))m^TU2D2u3wW? zqPSRbaFPXp-Oe|A=N%cLA~N>1X+xxyQkA46eez7C>2Q5HJ1<-RCtNR0E7;}rV%KW> zGh;>5njfAle|Dyb1a4eZuj3|*UK0f`5u24EYqzGL+2-byxvd-CA1RyxsXTN!;S(Ti z3s0LqxnTx1MTppPp z_G)HZ|F07vy)#h;9nJ#8B$kk>I$^u={hob2dPC{+fB8*1XJKFa#(l9VwJ^hmW{Ne2 z*L}cUpIN1a6};5sRm|2=Fh#2Wf6@F`7JsH$b|KpSEXW(%U1r16@2ipAZ`_}{&MaR* zttj-c=-%Wv%@orYlTWn<3AF3@Bd z_j6Z>tcA~dwXZuy1f zze|DkLbk{EPX)ZG!GiKGp8xpB*;nCYM2pc74+L^bhS){({!;$-Py^OzwTJaAf2~S4 ze;j8ZgxL6-$A9f{>>Y=}J$B<$aOO7QgrzLf1s}^AqELo{l}-e);m$_~pFF_sqNZtH zP`JE-M>r)@A(zjb5VMQYl*>HGnsu!+XVUAY9ar}vB!)P|3#i$6D^??`e1$c7;93u- zEc7z>n3#fL@u?!d5>S6htG$ZlDz`yMR}*Bk zGQQEK;TiHt%YB(X--Nqugf*U~^*V-Pz36kL-%D~h#A4sbQ-P@-M?RB4kSpFZe@X{; zu_9PqU`yKsA27=z8hoBrs(nl>^ebWPXqF)ZG{d8ul^y3L68~uoMvqnc zcjc1Kd5W&#r;%oNi1VwGe;MM}CPVp=KTkDuh2sPklCBU7(X(|C68GebvG&ec zT_-LWl?dg3(&WP8rK069BV-Z3#EnpHE3-r|q zVplwWq3DRUBM

    -a!`~Q_R<=B^JkyC^7!I3#3}#7d2kw9OGC6*hsng)q}>V*Pz{X zGP>@^Z}R7^3P?91FIUj$8}93bMKaA~F(P&(ky_EvCupp;C$7d6+}dnyjZOTb#s0#f z2``pBQZjx{bC$f8EWdj;KRj?1lkB zmMH{SIE{CNbu9PPUFdVKMlIiTGRDtaL{}4AXhdpO+bOS(1 zR3UKSDiwWDS>I$-NA9|HR*g~Lc;}JBgnmz&E8u`-3CG#<_7V`MqhEv)DpA>ao>ky-_ht>8p^I z4YUbr0G#9?Ty0wL9JkN32@4OvY}bSKv2Kpk?iyyt!zykZqTb&c+UNfbWPkU+3UKzG zfRe&PbzSBgkdn`19$PxLQ?Wl>1e+m5`|mB-OPYhZ*?61pf13V=83F(m6fh8Zy&C%T zsst!UOH8FDX*bjh2B*z5CoWui|7gO%$Z=mkl~H>$Qe0}naNXVS?o%Hb9`KImlEZpr zJ`R=PFU!r;^n}O&X*Z}*fs?r0tvb!<`f;ot5H&$q*}vG5?a+tBN8u#dJ8W@>^o@H? z0Y4tkVF}ueexL>sUaLkIO1_Q{;;7)l))+Pft)#@mB6AxOPN5=C@~u~0nDh&4=e znd$d_tF+dLwNV%fye3^dBIYuX5x%{eE}te)pn|McE8g6zN?keOX;NNAcy0VagHqjB z_?N627-FX*0y2x|&T%+vmeU%l-z%d?*+E~XYX7O8e@j#O)5jY%inN?!j_RgR5oYqA z;f9m$ot#1OO?WXcC|!9Plzlm(FR7ZI6G`nE^?Wm^^6cDI1M7^W1+28)Qid)uc7) z;4Msne-w6{(sX}cxAtu|h&ugDx6$bOflZ&*VCc#kLYN!}%6(ZjSmRjmPNc_N!XEN0 z$f$uDc%SI%wd8mY@8<0vm}%IO+TlRF(AA=VSa@Xe#bC9Xfb%S<6h^qX_lSkB83@Ub zKuU5|V!EwVrK5mPX-(xWK7X9b(pH~&279@Le~{~-eWXq(#^i|O{)II;%+2LR+iey9 zO$7`Yd%?%47364=&=!Pb`)K#835nQq&@mfqCLj%ZLHy&9cxD@pCI8nr<2vgLIG~3D zH>K*9@Poo|b^#WELvY;P{&++$sli2i7F2wCZV>-{;v$*9||17Y< ze}G5a4qoTJRA`K;YO{$~ln9=WE4+pCD*};mFfBz9C z=BrS}Veq@vNXpOqi@k#orwTUh%^~8aKz>$jH)&Qk-1tgVxqJYICu8q`os8ub=rP47 zivMK)DvBl8Z7t$#%q<`pa^Mx=jYD36;q1d>3lK-G+@NaMQ}Yf=34ze=$FmAc7n<`sd0#IBej?>E4@+b|T!CcdCtRg2Jb4 z@7Qgj<$)0vO5nO(dZI~jr}x9Uoi-JXrOW$6`U>dzDvzhw3Ha}<;TnQIZo!L$cbaSn z7Pw|6Kj9R$4_Pz39VZ;nMAf75hkAo%I0 zSO}%Wz6RrR?&>PT{xBR_Xl%hC9@g;G{IJ|?g5*!OzneS;hL>GwHg3{uh%?NUzfWRJ zmhJEy3iQaR81-X;@+vtn>P0tRC4e6`6;34$i77DRrjvremw}NfuwA%Hk6K#+ZO%R2 z_$V^B=ECAtSY5BUST=U5e{TDG-*uC@4)79ce;{%`NX0wLu>mLk9j0@1#K^bld6R-} zmQb;@i9hTQ~?g(_pt)R$A|A6;GsSh(w8?su>oNv@8Y$jY*T>+ame`5%hNO0VJ@W%>- zRR^pm9rP}C;3?kfitmWU03|nO5_*;|`btoq6t2LTijHJ~t}Y>u$9qLqbdd03xlOd8 z7^@mAwUdgOT1ufbn(r_gE$2UuZ#iu^EZjfdcg?iE2zjy0E5;A5XxA#<@t_*}d`iP^ z3ZafFC9z&-*1=L_e_NJC_o+7S4PlXq2eVv4-i911EjH7-;kSeurAJzjgV5A(jvCjU zY*?ibzI|xlpiPpHt6oBJ{nI?a`D&=h=<^y(+fAQi1n}XXcQYoT@akkn9hO%9SvT-P zX)%R~AAMkrMRBoj!2xLgUL*C!z~{e;DKJ2qTbplfB9bO>1mHQ5}H>tzzCQw zY7IE^P%XqPKe;$~bpcpK@8Rk!al`T5lUYnJZa*8nyQ(A+-0=($=~F`Mh71vUXI?-q z%Px)uTbnU}r*oagx67(g>Kr6>|DVOWBNZXMDC=F<0+6p|6{PMo1Wz zY#Hh&Ss)dBe@y{J0wfu-e`=M1+)9^f)txxS)@&=71EoFs-aHTotLDO0dwv^#VWXmd zFqq{;HV|DrRf#7lr*Z{Pn;3T>5*^YxDtdqv)x+R6pwoC1SQi*;mVhbYl=sl#PdxFq zf)V`;Ee$A?#UQs!75qJpzhfN`(XLynZsEj`xFg0Ye;ig0OF&K<)vi@va(Ahub+tr+ zSUnINWG7Z2)wK;B+ItUlansp)?MeD5%J;f1Nk`MzTjYz*FEA^Rq!!dvRRGv&eQMPg z^8Fwj>VMkjUv1%HPSFR>Cj182_Yi|-ISN2a)imK=Rr$fe>3pWfsVSg7HN~Wxc|HdZ zSJ#zYe+s{Ellowh%Do(L@~w`|5nSW7OCByY2csel83et%K#BS7;)H%fjb8$J;=&gy^HvTP&}L6|sgR~?QdK9B zh&e5BU#>1Okrx>1p4V%b82FcL~?sRC6|Hr?vX{LfYL zH8z$kYRVUhthUj#uZWUj>lgqu*`3zB2)Yq;KW9W&8hBpT@DIN<5xrI;v z(mBpvV!;94YVUU!fhUuwDDeOgXeqVVf5N&LNV?kt0Ntt%$>>*^Rr*4x)df2PpY#Qv zLn>cpm30Q!?$La)_Axaro-eokF86PF2gw)~=S{RagZCBL<@F)e$Wma*(A|#Fh`V0d zLKr5~up3s4$2}vGDa4FW{4DXB0d~YkUw-mOcGwJ=kjrsuh@cC(${5fRV593(f4H`2 z{KsRId(bxrg!E5Ak{gtsP{8MS&=B43Vb=xV7TE@zGgG39u#@}B8M^))Jv-wEp;_g% z;k?YkBZ4G@l59dDx_6oA{t$Q_XxH20VEko>Mt~c)!DeX-yvnbDFdW;)hVPa)Q{|tO zCT`hZQuM)!jWe&mF1cX8it8;Ne|tU8=i>2`p_}!9qEc7?SPI8>kU;%Zq3`)(IH`aQ z>F$(j7vC3tSHah{M=|Sl%L}+Lsk)zfhDc}`*x4!G5JTlPw3m?T$54I}1C>F4)BLkE zptCf+bwPX(9)>XisY31B8?aXuE&~q%BAppE=$8wj&|oAlH5|ojcZybHf2U0^aEFK) zVJo_{x+e6_I_u^s_;Z6>nq?jUi-i@!2o7`yybs8W^U;^ol0L$9Ou-_0<5ACzYED+v zSeMHV6yprA5Q-wm!K@@8PumGef}#my@sS77ubwftNRYQan50Vf6i<*`Jl|$ecqZ_ zSoF^^Xg=@HRINN8@9u*k`^1g-Cd^3&j{I3res*H%mxqk>K(AEOGR0uu4Q730-bi6H z@Q>X@eiN=LN@m{$-m0@3Dae~gsRNiz8s)s~z78d;u!X8Zhu-OhHcdWItuGx==9}D$mK5$%!y3od}OAL@x8&O*ZOAPS?vFuTUJre?4uLRpyK~Pzu^+oY1i5 z{w>B?m+krPm}`l#{$?fxap}{KEK@4~1)dxS$+$5J5D>Fx=<`!i^bmh>dlA(NriAct zHD5zZ3Pc34nYM5o6@0w7Mg933E>JlqpSS!kpn&&uy5lc6pPZgd9KN7j2(JM+)=N>C z%1XwCyAqkmf5UhAoy)*PGPKSj^n>_~HY0WAOl_3yN5S6G^f-r$6G++sugew$w`l9P+h0rah0(&{4uUgkYUQ9X8LS zHZ5M88oUmzs+xo13cK{F)*v^|VdY*p7@WM?jC9^D2#FU=qZ>BUTJ6x|bIc&*Me;&dI({N7$Dz2hkHKTrNKxYR6_}kH-g6E;4ZOtA@&j;b-fOjW031lf-R3A0H z7&Z1_rU+3I31{^S4{coB5aKk4yUDAUaWvWAr;X9oK)xnXl~zu~Lfj24Ix4^;6hK*p z=fy={?F%xmiUAM^cRYpNkzw!o9Vs;r40Jake?eJKHgNdeO%(|^sEEy$D+2=*(O*0& zYnB4JyjTp-6Jc8!EY!>Ec_+I$Qu!@%rv$y=jRH54C^cLt^yu42jv+OhovUYmUr4#m zkW2PJWC6A6+R%~51TC}`R>Df!g!ukKb(2pppGB~Vq9K;jSx?+Bb`ahxpOd|x`rkBN ze^!TxoQaQqWECJ=3B=LTOZ9-in315x+sm_6OS8ML(^8dlz!c-bnc=$8HSSR_|& zp_=O$%dCuwOPy)Ofig*>vZFQ;I+vqHcDx>)aw@ZX+z{Z8*Qnb_7{Oqi=) zGQC!yyG}fi=7Zb*+r(2=KS*LONQ3dzz*V74*dqH9M|9@2tk0+`KhfaB2E8&v)BF7n7{!P5&2I6h@as&_UxKNRY`g4buo_4Plzqnaf6R)NYuYNJKxb!j%6xJ=li<)k&k zXQh}L@-<8u$d{{E`US}&x8f@pe}Ksnh5=8Dt1e!eU;ddjZfQ!_W@q{{zvNxIoh2_tEqElcG=}sQn5`lM zpE(`G(gA^Kto)y~i?|;*^6s1^`CAIVm=rcgMDfd(O8MLqR&x`cS>}ize|6v6^ony| zTjG=s>EHJCI5QNpA7KgQ5YP-%L_6Y|M1=^!)K=f9=!ooT`81osrC$Y z#U!FfGmnWQn5O{3k&VQ~`;{+;jZh{sILc}PBeQohEVTd>Cn)umrk36`_Fq{z80}Qe z8u{IAy<9o-XB{=xg5;v(>~Nr^+#B^l57D~^~hL=`yZfAn~J3q8bCf!#1t zN)|kGyyox-)ag!S!1k-ObK^>_GsOX-OVOgP$nN+UX~OdH_y&5YBhpcsPMFX8yKQa; z=){G}mWq4|FN{Fmmbe?x_C6C~e!?rugPbe8zhZ!ae;VZT=@_8a`v@)^@7fx9E3_7T zV+=Zu8*Wh$F$7o$f6NkgC&jPxhakB$q%;ClsFw1K^OYuY%_2!RZh^LJE-}=KQZB6L zGD*6cy!bbwx$G`dBT3EE{Ym*em#hKQ;=n0<-zeFmO=)sd?{x4>xIGN(js_G2jm0$v z^w9d60%>gUT|dT+Zz}h|TJQ##s`r;Cf?yz}FAD%+^kU;zf922^t;C|sgNoWM2FKU( zxhD9Q%^ada+Dy$YctNb;8vVdz>ulkXX!3drxc`-p)|A6CV<}U8rs+r*4Hlub{x~^5i8?rh_omNK4#gD<;BL+YPRRg|x{LIeB(dympZ}Q% z53{BmjDI!Kf153vYC~z#37Nd+3iJaWW^xNUtTVtQplSW;NAh<|S0lu9qeTh|5o*w8 zYK2C49pt#h-N)`!&&mbhJ)_xxd3WDsJ;?=n_7j+J{|ECVS;RnLx9L!keIdPR@O5@4 z#ho-&Lo7(wh+Muu0AT5~P0Zee^^ zH~o}7X9eDogrKQrVy9cHon+J05u?F)RN)Qdz$d}ep9ez^rg8NBE{pC0WWvN+ zcM$gi3<0nmbs^17xXfs+EJWBgumgANnAfI zu>$T`E5S?SK;goP+m}xob=*>#p#Z206|(C{V8yBSePmV8F!O8wzNZ3h=4*;j7n>PG z8dHJB?!KdYE2LbiGFh`E>(Iqgv7%|Ii5hlKSCT6?QfS!)@0IqTbJVE-*5u9kBvI7N ze_9uOdusMn!ahZ`iYca-?GMUgEFbcgX%2`Gh#>bbkgIp(L&JZJD3h*cx#-hG0{Om`8GS~NuRpbgfD-bQ5oiD zmn!i2$jXgCfg=!5pMHACLACe&_+jjCe}1RLeyreZ9BO_Jsy$pT#%+}U`@nD3-R!@C z3v>$z`%XpHyZnvxH2Fnw!goI5gk%~ZvI{BAiI!pDP*A)OY9%wW7qO;E+(`V^)4izU zn$w|W(BrhZ8e;`06O@3+kRxMs6zG}Z!^s7)1so}i0nlw4ym7^L@+=?B**e#le>$v# zqR{xc9^xSd`$4hM?-37@p}Ygbl(Y>JeOPV)@uo_zvbqr_kKL&_pt7{mH%v1kOAO7d zUpXR2wrIW{203t-ys$>+z55DzVmP%IojO3s)TEztE0rV!)f|9ej9y%V$`gWS?AZT* z_hQI*vC3(rV`c$b_^gEZ9f2*wf7F%M%Ql2wA`nLF){nRadDtFBDH+q?l@LWnj4I2d zb7+&J1WI(3+m>s&a~+&R|Fe3irP#k?1Jboaj{;*sIU+n$NH=4)KSfeGQiTdK1;7r5 zsEeUPBw3y5{}XNhI9gF|J*RRGAcR{M`m&2)4dK}HhuwzC0-5-g#xT?j9n=D64G4A zVg-jTX^(GW9-o49a|)#xfBHfuMW$Ci`)XpNx<{xZq%WfLZd&4zX~|h*g{0#_#C&@^ zsd^PX1mRWM-^({(7^8=hFfzy*ZDEdii`s$I+zl4umi+&kUHo)lfu@UCj zTOh^u(zJ7U>s{z~dobmB3`ZR;*pU4+=j*~V5P?h+W|~OV&Xt(EeG3lL}9jRJ}?d=>lTvZyxn@%GMesOammqY5?dx7h1# zn&~(0lZ>)%l~ZBVkdcXm_-<5>DI$h0nCVEd){CDn`cZ7ne#~;JIv~YLyu)P&)8`+E zS6P~W`Pi#_SGy3J=NuXS27gQKMP@1=dy{%7bZIb_5x8LSF+?b}j1tc1z(F2A23F%b z!NTI}2?MMm@zhsZIL7p_R`l_!{B+btKQV#xDv%9bl*fi$LxqXS9?Udjrj)KHg?Q#) zBcEybY{!?5@2OYKV(vy3GX1b? zi9nQd2{#)^qm#H6ZeCn)(L&C$chxcgNC3B!38qAjG6ywoIJ&o`F3>?T<}fTGoy4Nm z)yzTwe1;?7?C-$q<$u2jV>J0qj6<Cq$1x>y?oKw8`z@J!WMeWA2+I^UD88Ytbgrjd6>c_Ez-l5$sBLB zT()GEmtj6PEnL;6YIKY%7=2dPsGko11zCcd;W^hey2?ljensUef7CDBRdC{_#+zH- zDrg|mHQY2ro-3kpi5Nw?F1MK@P%)mZyF~zJN9^Nf{UQvYh89;pC}?sD@GW+;JUIQn zS;=;o1VC+Md4IS}q!8G>@RT{rnMf2l1mpbMMbOcMoLMNt9Z;4J7IC-Pw$9ZRZGT6> zq9)@(^dQdV#o6*M>-vQlumJ|7%p*P-pO?lKed;yu#)O>Xoxd+dR=lA0XUSu$yY+=d zxfDepNZ%fa@UR6at-wA2&o{Hq?;2??HjqkjW=F;bxPR@*h3^7@hVBzuZmemblQDth zIH;R_Re-9qVtaEC6bUUY$?=E^iJ|%3Em^xu%j;xn53~KDjL|G`8UHr9uXP3~`zE-I za~C4w16Oz)?jVsI+kbtBHN$Gi3bbXc#PlEu-+Xwt0WVl5lI)u|@G;^bNXvP*$^iEg z&xRN|N`IqQyLvw#>u8CC;J#=vm5a!K>yLT7OsCn-E!|2M=I97n;r=-hUw3XS5zkK2wvJ%R}}d<*Ypj>Omu@*)mY!)|3E9 zRQnMbCV-JT8gAFH_ygU11B-%zwUX(Q)8|7&h7wK42KWb{d*pALbNdM zu_HyAYuaDV8j{fHg?!BVG=6Awm0{O}ea zAxdV|OzOcrkzCfDdj|=AG)^9PGTZzpHGeZT5>L``w8N0m4f$W-8Eh}@x@G4`4~OG* zFU=(Rl(D#GRGj=!DPH7}ph?SMHVo{I^6Ol}+X7z&*c-KYjlZo>4xu$bSl4H|+Ehf9pNl<*qJfvD{%mtgag~aOkAk#ht=6 z`*fvfP+7N>9&$eV{V&z|w^Bh|Km$^qvU34}gVG}Ncui`qkL{#UQ(};DOaG>u+uKF| z@Pe5b#P-u1w=t1&I;-x8fr@K-b+mG*aP6OvJ!Lq+`H>9u2m(*p^EO9~uM!CRQ$J})S zp8bZA&7ga86~O}ALt;Mj6AB5VgWJbzXp1504p62<4M1S&AdA32wk|cyn#p_|sOV;B z2f~jXgP_Hq33^hE2L10vGJid682?2{$f~q5YXRPJrDA=iAIru~hy7ktdDyn94=t}A z5*|q>b{x%77$Jyy$d&dNBF zZS1BKU#f5cS@?+6db(OU zY8KSD+I5p78)qA8LO+gZfdDvXix{8OP0VcR1^V8O-i^G~Y4j8C!z@Wn!2y1DVfT^* zzm+LmfDn}IWK=V(d>!fS%ic%XZHTsk|9GiF(#hg3o}MGJf3k}G0N(0WYpr`|zeTxc zqAQxcKbJc=uKOk)cYi9iiw>bn%AUCJv3t?bq5_c41!sr%dkP(#$NMUNBP!k(yUsm$ zaLpxCrQEk5bA{}L?ONUmbK={{PC_3co7pmvt?jsqZkH_>YoGt)cy|Odc2?$+0)$QB ziD(%19;<;8;piY9s(zOif1zf$N2h9Va(pnQ!6(sTbp2$bntuakIBmiI0G&R#!x4K+ zI##Vd{BqIAGIhss!W0G%wA5k#QinWoz`jiwXLXy?`~y$e9!Do&N&^U))IfXbaH7&D z9Y22@hv;ek*f+xcn8eLo!@11ImAw)Yl&3(#w^`jKu=zIuJ6}}^E@{4Gqf}8?r3J#c zVgjmL((#o&1%LO7r@RRtTU*DFJWjwHkv@tIBBKVEwqJY=3CrlV0dA}hL$TJ2GP+w< zVX#Ds{X#?kT$Y>=Fnj-N?vTNyL}i}U24e;GHR=?xjG$yYU;!cmthH$C;%6RC9@rSO zLjb%+_}8o$pi0@Ug$s*_X4TWZeKVyokH?n3H1HK6W`Au0_xXbId`c=p@Y?Ci=dEf1<$sD?tw~{+5A&-q-kJTLgV<&O&#>SxzZDM8Tp5u={k&<#*e!IT#3Yh>(*os( z%qHAf-a{Q_Rqt?EHDL%@skfNTz6~iFlnf>hVDWOeS?YY@hG|9ztF>txY=F2;(@%8n z-OS+cB2AMQyy|Y8meTpnM~BzG0te5U(*I=0(SOC>BWhWDW-=+(O-mhcrUd&n$0FP=| zFKf}`FAZ1H%axkxu!%65Dhzo7$Atl~?Z> zUT|Zq_J$UzOB0S!q`Rs*ZUy$dKkwf z@~M}9g>a~a*7-wHchk8^n4#-VsDD%A%ZdBj>A?$O6@jPaQ(0P3!JXgEZm)S>76_mW zc65zs zQI-@oxuoBeX($16sfwr#)mDCYcM2p;EXP-3)3V# zk;l5QTpRyX&;2Zs^8fraFMs#REgmoRZJp~tHMPdH$nDw?Mu;0sLrlI=pdW#SsW2mQB? zhkG;1*eX@cWmW5VH-KAb7u*@c$RH{x*zE>cHbM=D?fF(zj2AafJ)r|nYla##Dq}35 zzyz8w?#ucCN@qTXfq$vfD18(nh1slkOL{Hy@H`&$;wC^z9?mf>t#>NFA9$c*RR91o zc4<@G zxxZaJPkwi-&VS~4dWNC#5{5^+8=fcg@oCn%H;@gF05SMYGxPNbX>+#Gf1cRZC|v^9 zHS2q5fIm2LDU+HWG=9SQbHXn@w?^71sBw?jXB5rtrb_mUcsmAV+MsdML>kU9h>~*| zn-R{3(4?lc6e#oO@>}9FXx0YxacqN31Cevs0iidPpMSuXK{IdeQuK$yjCQFY>Lwcj zjW_fw6!qf#Dn1?#5H<3bELF}y4bZgRBoWQ++-K&1niTv}?vD)U<(5bkp6JzNYft-Z zFP6_XUsh`}a&Lmi0UXt~Kp1^L;WWf0H{EQMl|kf(6#WakyM6x*Bo%20Y|-3QSeW1A zaotUEgMZlgUOvI~v61ml3+4x}@0a8@yz^H*$HahzeLiBb@*IPFboR+Mv<)tUtz1O+ zi_Q`kxRhxz*hm+)$Z?wC)e6x!wBTttje<25n+piS$6XFj~PW}eg19*%pqb7_M z!-Tp9(M7;-vDegsBII2ZzXfuL=%IDDe6uVr9KVAIOjzCxh;p7N^F3vvk61?gp%a@v z_8T+u9SH22q9r{+AwY#`w2aY0TLN>ZzJDh}n?<5R&w#5u!yu^1dLInudxsZ(xik3~ zB4&(@`}iz|k8DTY%jo{cyrWkvb*2mqGu4H|7WbXXA`oo%yEQuXe(tQKoFgyTuGEse zv(-Yri9nX$z0O@QChk_F?k|2T-}(x6e=4K(Wo`Gsw^Bnw^rIzyQIGNEv+!g)Hy2G<4(;p! zym_K+hK%19p2^og1h;qC=n50@NhWQ&5=OCoA}aFr&$wPD2_4$Sh_EhQJq97THtc%z z2%}_P_WTiki9R8I^UF!$PxS3-Mt|GzSdaRhlE(S%9!I78qxHM(ce@&7FdSDdQ0 zTeHF+zfr=SS#4yX>dnZ`-{l-&h;qy1L%5aCYoRYoDjePxZq{BPN@0y}xqpGuo{DVK zGC$BTF0kUTIfZ!6a3J%1T)akE{U{ZU^JUiot72entg76cct;u>FZQl94|I=GK9=xY z93cDBTEL|9AIK>9K1o=Zx+6Rg=D+DrG}<*%4msDW(#FHFMAR8U&Y2rShNXuRw>cIh z!si-1RUymVzCx2h=V0G(A%85mk9jFSF<>WN?c;MaOycUu2my#Aa}vAmF*GK&Eed_O zyp7=t5kgV!SMaav1HRX%6Pnj%?5#sVue-!9y&i8V>bvNIIEK)~mHi!*+jvMF(8PdB z*UMay@ASSeqo+7#1}Kr0naeC?@<$%+F!I~k^4K^`1(dHjgi5q)1Anvz(oQdkc)E_wGUb8%Zz{3(x0WjMJB$w6{u0>1E_DqBYHn14NT z{L7I$=N|U7p9dBd0)J(sAtqadtiDWZ3L*&vz-bx;LAxhun1%-MMYoUCe|`)hnlzLQ zsw~aCg)RPzNWQ?CU!Wd9$o-w>rz{oPaE33%6^@8hg1ZDU;Eq_yD>cHSqCLzrAwbd!i zz8!=JK|f0<(CcG*O;aq3g4Ju4cs*%EB$EZ!Vn#r<=%4_ec~rtveVQ(1hWx>>Qgy(2 zEb{ifz^w>%;p-=h9h9oogif*7o+Md9IPRj7acs`M>nx03q544nbcegR49SFzN^|(J zE2%648+N&V;D4dzeOU|f+norkA3 zBG|pDuy}QbdU0@uGr**962bnagU0VD;b}DweIY*V$$$Hff91yOah~^|h7Q`IFFktD zWZRe(Bk6yUKk^yna%i|SPqap=AKo2i;$dL*6e3$5U;w~jC(z$I_~SDs??vl+6#ole zM@Z`TfCUU6`;=6q6)D5orzR*i3o-!E7JMePPpHxFHM3Ypqr1j?E#2>?<*#SkMPFGurO zQPu3-I<5&l&PWc7D=XzB4Rs7wyWVNv!DQAy2Hn0n(S|(w`6*RHAX|05NtQ z%y<>LG|o=!3D`E5Lmyv&cLITcy>L77m3RQA){eZetoDqCbFzAPZvf@9Q0WhrQ)ick zRevPA{=k^*8j5w!h!xC2dH>rYdX47xY1V;v2 zKsZk;q+;^eatO+otx_CZ6Hz94dee8A{eNU;z=LP!*a8_DId)ymB3OU=-e6jF&Ntd0 z)%BxMaEDQ0)iuX!iHSPHyI`f6MJC#!9=!U;kygV4x}h{>eh+1rPQ^)sDHt^8%xUpF z@~8w4lKIr82WuDH1RB#%!RjcWrOlw{t7;jn$po4AsZ^M{Fy(2^@$p9+CEjhg(|@>g zEL&6s$zNH9FoqE3rcZt}#)SdomR;sFM4s#C+j|0J=ID#0JS8e}BMjT27SD@H&3!}v zHE#~o3$?`w=3Ggxoc)84vhBr>`6?n$hVoDzdf2quIP+oAdlc1RA;Ztzmr9Q$`Q#TU z4xyhmgj>|gfFx}0)%|WtPlK9%1b^%aYDH%OVy#9HrVrOw8PmtSv&r&8=mw!+-wzx{ z_lUZ`I99w2dHkH2#mH`-BB&?pbeR=M@*(2woq5)DMC)n3{5;)HLfwm8EX*_QMvBSz zID#s)A`;kwEtwn8NV_@wDyu z{bDInB@wG3qS8HQDAcZSG}*3~r%U!SNI#r{_RUFQjfXqu-ro-<&+csDC6|@|mpl2R zn3%Crs#uV9-=n7U)@?$^;D7x92`K%_e-{}U!yPry@TqA+!5g`2t&wuGjUj)$bF!~k zvb3?p^f~&(nHfzp&>XsItYx>*8&uPnQwTZ;mD*TP7~|bcSXhNE5TMS?vV{>vyxlx8 zzQX|bP(7N*084&#L8k?OVx#+(p!i%bCG*0fZ!3t{DRJptB?s1ZP+q~B2uZb?9*>I zNyJ>S5f|ydOJ6WI1Ao_Ntzy;HT+ZnA<-W0kM}b0!BEytUQ=BDq@vII9pS}b-4y@y4 zHC|bQ%9|^yNLmJ-dEFz28&9pr4_obtzg zBQDI#%;Eew#v)eZzAD6*@_2*LK!BfFRmEhMfy6;K_M7oU!++ePOO|M1rKkaqj3#j| zws_nbAe#qPv}Ag;i~%xcDHJNENiQQU5IoG_Rz|`+a1W}l-L)POduTEc&9e>gu>)I{;&#~U*-*BfzLtN9S zR&yFfkk6uSV#plor{tuT?9-9eZEWX+TT_6adi7Rhv$9|(qnj+#5rCjWW59&hTuP!5 zK44>XLAAo|F^2r^yYr=WceG)OmDhW;XxP>dy!UBaJLq z^j5>xWRU@z54rm)EOnp8146dpYRFZ^SXt8x;e)t%E+dY45DasS^0%mJKI{am*eY*K zAb&XZFd))B1*yv&O_@5z1*d(O=gI*Z#TAj41GNNWK8y7HY3V(?NN~}{K9$7r>WRvROlu~71j-);gDvB_cW>WVO z_BlekVW)}dB%g~}Gf~&RNcp&Nbt}XRs6OYKN-sNUv1A;Tx&dP%8OJ@7KiD?5lS1WZ z4YWXzbqVsyDP{Qf%Q*sPS$!nFrWu#R>C{0LJNU8dKv>a)D)k|cmQ~4qs((MLX_F$I zk@~^eXN5*!gVVs-D(#Kv#90<;g}sajJQ=My2CXelJ0i&RHSo|Uqz?LpM!;DJ*>fvw zT3`H)n|9hAFgqqiY|qnXI3LB@O1A&%S|g;n)Av72qSilLR*0k-UMQZs_ZXMu3Dsef4=pLvp@ozq#* zwxO2eU2$xS@ezoaec5ZG%?@gXcL%I*RaTzXeTXVMnCPuaqIP|qO?XSIP|t|UplG~u z7AroV*(juCGuhHC;~?dh!@uytrLM5!s}mk)OkPH|yO)XWq6XjcNIaCN@cao~`#aTa zEdd|I^D6k>`(-;E2Y;tXD5wfWNO$V=1Zf9f5R{%K!R6hv#@t^Y{4Il_h_=%N$ufjr zjEB1C3{WBS1C(R)*wu9*M%s48_x}%-bemumf@Y*@?j*8fFXJxcri0LN>6} z1Yc2WJOZNuh3{w$cF93pz!rCcJvB?eFz~VE6>nx0sr?i;Br!2+JK-+$3~FojIdcG~ z$sb(Y=cqwnG;#?YLbKbq2!Q6jd+veEjV%zkm!Hlm6X}^uD2X| z!LN(^t_W#l6D#tZeuUyTNulHyB@i)8$kZfohC|fnh}+m25-+Nc%cYKJvIy1{m8ReI z=o#gvo}~UA6b;7|LL4-9h|sXanL*$HhT8qHCV91K@qY%Jx|ZWClX*5Lr?P*ic5O4C z0^~o=kGhbojubYvCXd$v&O@yWb(YoWhjVzJPjJR^^5`tZ?Xv+=L^bWV>AAt72yt7= z#&iU_rf0VIa!%%n7&hleNN@hb#g7WAkM%kxC0|X){V5W5@C)wjTVV`iQ`?2jgs6L- z1oS0D-GA(3rxIY8onc%qiL7E)t5Gc*3%`^ZEY9kGIx%N-gW;gxk=~~Eu=)8LbP#>R z-AQ&@zx#w!a5thjnWU)S`FLt=4*zgnzTyZ+S!z*S78kNZ=V)D}pIgh8j2T|LLQaq5 zEs;w@D`_HUAh7ZZf~hN8X)^>zllQFqArfC*?a-pfQ&+w^0X9% zmp(KS$D~;|t12cp+BuMr_sb+}r09ALIib``Z3NQ44Q`DEh!Q$*?n5J-b+RIh-;mu9 zS)`~n(!UDgxu#%Vw}zR{S$nT6=(<&~ukGa6-U+9Dch~?2Tn*H@K)kL1X?pW^@t;LJ zwSUmw8Q|!E5%D8`3Yizz#YG0J$9j?`zYP*qel35e9=SP_s`cy;UO3t5hPG@|`Y};; zp)n$6lDXNR+_~m1YH6W|#UqubM9;`Pb29gxkDUg_?tj^2rdmuM5l=qnITPMikpwcb zgzDq~`@+0-FQ>TejohnLWN>u!1aIs+$$wseF99oh;v=WCtdfB{KKvIsQ`g9;aEW{C zf7Wip9ojV}u4!!?uu8mwJkeG!P4DZLUX0JyD*Z`2DH8GJ7zEr-{EnDUsRk4xqc?52aw<3`}gR9GqCujk_JNkAoxif$G9?V zT^GM)O@>xHb{$;n4h$e7!RkQTV!r~71T=mSNoBs!V$fE5;2>*oe=5qdC(_!;Y_TRw zO4;m-T|%&IP3d)wjPx%tJRA1Bsg7DkKcIrCyh#+h_KBp92MUGV0z;^LPk){fKUAvQ zd7+Apz1V=jWI98lsu4JZEb<|?J#A;wxoMG1Y4#KCrvqkS5C)J5y6~B#<=}ajSk}H% zAagXC0j*AhWI6N@#$0hwL=ljNLa>L?BDLXs)Hr*e8 zKfg@GlO-hjzu4#sCl+NvcZc@?v)mV?Y+KOEBkB}ZDgwXtFqj!R9y;seggj%Jb)_=P zik)#(1L@Uo(`mr!mw&~VInzc;s$ElVRf{zu!J&kI8q-Lr#<4p8qUscu_1!l;an2B@ z!DTY5;ede9>LCk9oMDlwnYNiq)9NJUQ#@X5rMaihVW9@z;Q5hm`etjFZ+FmIW}dCx87`q1!jM4tRieTym`Yv#X|JC#Jp<497m~-cj0=( zuk@ZzV7*5F4j!a$-0&|cR|eOt{t3sL8iLN5eF^MR$c)3}E?o^D5BKX}tHWW^gHZZCFqNq< z*hy;+txjqJh~3e-39+M&l$IA(!LucL_|NfAFcNnr8(C1Uoafa+!_EFQ-OqY!a{L!q ztyJ^rr`ij;S`P}){M0;wHv+}6Z9!D!9);c>U~nCM`hQIc^!FlFa~i+S`Qx7~mYz$g ze?U8{W|;`Anw{%o!;A{9zsR8bhk?rOkvZzVzZZL zv%%NizBeANA(WjP#R$-6`wgswm<%u*1w8nd2W==Taat%P65*yJ7l;KxNH6Fca&l*o zc7I%8C2@OHHQ{^$ADAuEW=^bCT?(^(!eZR(T+W7$7z*|KMmO>DK1)0PBr*obQHbv| z`@4z=sJq`i-O=j(2_&VjtGiC&-pwC~?iWP6G^A=-?`xEvOhC)(+29%A8xAKOM)%10 zM##`axJI5q3^A?j*|b!a1+q?A4+Hl9=6}_)cgMOYs<> zFNwa(A-W_`s4wL<(a2IYD)rxwLK~fDbr7`2nH4jG;1x##c|LK-Ku&?Bi8n;`M1L?7 z1eOsCWl5$tjeSUv!(~TeOw04-pO8#xyTQ>DD+dp8N$t<@V-OSh3#mGLCe%5!Yrc^Z z*~!q0x~EEDT5FgN*`nyM}9lZp^$wU{6ExDGDY zfu|5QA16~v<7XQ{KY|m&$^>cj^}ih0T`o%VB%3ebRvSOvX|~v#t@=m+1^ZN2*=0ZN z(PNS%dwjm8`WRKxjSMl{HD*9YtGFC2+57ISQ`$WTG^Z%Qmp|LSjMVRFKYznYPBDiP z+fxuRGBJ!f-g4I%_5Ad*YV6`XDw_!-jd1>bB5jOz@|vvk*tDL@i7s^5fYI`JFpVhS zPsqHPq!^msovhb1Ej$j6Yqt7yEL1 z5nQ1Ism$L?_m?_=9JbuUrhgaaGnzBonJOWXNeWO5UM!b5oF%ncX z?p$5Z4}>6(CaeT&ie-_qnTa~D092?rU5nO$@-^xn4>|)Jq|3NX+ce*X_ewovywfZ?e)s}MG2P*9e+()FGn6{r29u> zkvIhVpxoWZyNo5+K{(V1Q)xL;Q$zX593hLpr1p6VhfvCm57OAzH0Wt+{$Va;@0e&% zA>b4#<$J&fbt?)Pq^Bht7yfh&NMH%QYAwNm(^}SaCm>$Zi=#)6o&Y-OuZ4)e>FPV} zFo4u_J^w6dm4d^CNDara#MID%7np=ow{-_)_l zU&B+5#%Z)zsK+z@iigOD2u+m#|J^G#?4OzBp+eT3FQy+DG_ zS@*=+uUV0<-M*y*G-1AqJ5psn2ty=RS0^^lBm(aUODvdqh<|h-MaxkCJNv0&`)Y17>lv`&U4Brhnp&Otc39Sy*{jJ$(&4HTnR=%?30Uiqio*-b z6!!>M4h`ZNgoO+QYw~6FtSFVIfS2)6r%^?wUHr+Dke6m~Kh?`@(`7v*($ zvbq5PK|HV7ZJ0+NUM-PicayI>+Fnd<+#$0bpSpb?a{PzUPmFOiLu0fq2mS4n z+kk&%<}4VSDM6Rb7tia47bc&H$RpH{uhMP+EFUo@pnh1wBoaNI^t_af>*i*TQQps9 zWfIO(@qejWT?`lh=+Fc3R@-MHgq2GrhU{cC6-vyjOl7g{Mp0$)X@6lxbmvNQnvKpm zE@)CCYhJOCx!7(d^?sbZVYH2abAOQ_-o+C?^z7r&?_;wZTf{a^7QoZ99PyiaW_Ir> z4@mkqzAqwXS1RL&EtVnxDxYL}(_uo>gGZDTe19?Z@?b7IVd^6(M3^uD+vqjgp{`zH zc3C+dmddLhtN;p)g&EYdgn7?DX@qFmkx4!zO2Kaf)_sKw<;T`eUE1R_wePdVzU}hy z9E)cPv^KzkTp7wfMGl#U0a9q%y8@o&q|-14ded*bqUe$(xv4+k4*m>Q z7k`wg*y@}S!wAe>xrZktTZo4gYZi=1zWWro_0Wy{ZRU@1LlyvC0Bc5EL}I`WuT!wM zC0gCG=v3TYqg97(xfx&=lK&0xs@U;doBu>U^{&v>@}Tg$Zt_Qi1E9m%BSRM+=`YP< z!Ri2Q{&v1YAl~!{gC8i*)eY@Qr)}zN0Dt~~K6#<}WVZ?&n?mtqaPd){;Z= z6k7aC#baK;zv3fvo|_DPeBXJlO+g`;*TI@*%e?+7!zv!hylke(OJz-Tg%A1236W>Z zl}pR~A@ML|zyDG>&78DMJ`|bkfpVY(n}ez5=cq~<#)BDhQOt?s$!9X&`#E+ni+^i! zo(Vb4!Y3rNy_m+PQm#ITsyg`PM)W@6D}!#djDDA*NUxs2lE?0P2NMeBCrXV>a}$^9 z7BwVLq>#<9s4^$Qym7xH2=SNJlFK1A;}Z9WuU^2c1^ZenJnjk4YL&sMBB0*10pZPd z`aZCCPS~zn6489x2AeT1M_!WyVSi^FlKmzQMo$0?!R(M6!qXQ%6T1y`z1*n2d{w=6 zYOFQIZyPj*)dLdPkq9GEM^^ZW3<7av=rqT9uKs&#j`1r^^S2S(l8kvR-T^ zfrPPi7kutz&;Opo0H?*PptbcI8dB`4R zpMF%7%DiX`{a@1p{4T!To|rB}t@A6-tSxV%rq?=MaDoB_FnMt}k_wW}@Vo|bXox{O z;ct{G@DqL`aycc5mB!BsKIWDBFZ;sYPHKOeJ-<#rvmvza09hIP^v`Lkn*f>yqaCOO z4sVIz8GYlh8k+SRKWgt=ZGYi{8^cHE$o$lTe?lYKe8$*lv(wum2>o0H!8TXKun z{In~@ht5kAvErk~k$>RbR7Ge9iBa%#3T=wFt$pkFNH{sg`^`6dV?+>d==nRH%O$>* z)oxQ0qA|afAxTn+e5ebseMT;O`!@EfS=@r>uoX~nu239%7HQCETk_f-IWv+w%Ca9R zUrB2PRLmfnU1$0vPFb9?sET#xf$1|vE=?M=Y5%mUK5GEsw10X_@^!DQwf_q9C9+He z&uGmH-mq`Lbo zjEGtiq5mBNGyYPQ%_y-M^J6?7WxElF_GYINz;a~z?>({42w>_;j}+K?@-0!U=~?EM zsG+&}q%f)JR)3EJA{JSSoBi58XEXdX;Je1uP2)@~ge|fib${j6y0iZ#BBZGd_eg8V zGDG4u_N|gqz3;;5>j~TOsS`c2FF*K9hUY3Z$G{e!2?-{7ewP&L6k)6R5-uVbo^cZ4 zevV{X@T*9v8?a<$%QHlQJ%pd8QZJ{7y4m)pK0BbOet(8`N7&49%+s+)uR94619~Rx zuqWoDn1!^LI^Vf?1vQ%P5^2(6$h>6?p(X*YraB7Fi=sGRLGBzn78r?OtI2y68KZpu zp`-W=(CGqnXCk`XU+A$bL&y6-+Ipm%>YZ%rL5W!bB-Beu-zavndcQfbbYK7RxURS0 zn6>3>D1YoL9`j=q#A<1waM-34HPEGDbA4 z)a(D;n14#8`F!}_+kRfc&&H`m0DsQ;N36#q$$u;8NBo`9)uNUx5WVL2IT0!#ZbP~x z#6?eR;h4$}v>}Y4+n+4vDm~qYlfDOxB?BMtqW$-ZhdYAkdvU$0dy3KP+%ow zzJDOM999F2pL>3cV5Z2hPkSqnH)m6kM0W8Y@~#Q7Ddcxh4eUi3!hvYE=K`ntNxHa& zE|?9Kl6$a^pDhXZz1!B1q&!lpye@wmW-bwoR)v^oK3QCoqs4hdq*`6zqAWri@}q7& z6jNDvH~)_`YlGH960r_nZFq^qn$>csoRhN(*>Qj z!&0APYIcDbn};WdKZidezQgqh7dw|CHWc$z6YL@H|GDK9;>QP6V(?|-2?^$S6Z;)J@`gF8$`T=SrO`Ri>)pn% zIuOhGdr-y`rz+2sq1%GBQH9o*uSj+b$HPdkU_<=|Ne>hztK+`?2xuoew;41u;VNt3cAbIeDkw3~simmjw>d&1+z9P_ z6RcD)5--Mk9@|xfw~FzMTU2pHXvK>+u@J2rdq~mG?(gHbHuMMh*l+EO$bXAv5>CkU zo~H2Es7gZyqoGNlRp{-Oq-UCLBOgQ<&XxjDRZgAZEOW~w2({T>WRyz>x$*=Z0SIVv z^L-I6Ch?i#_o6WbVjs1)#@*9lO;E-5C2fDiHA!0NWsv1g5{Cb|p%ELq6ZD@IwaK8PyI{Z9)8R zvIbPK-=}HKo>`pgiEVZC;yR)saUn~H+)D4{EAtZ5^cFqqQMJ&Jsn%iQp96RSHV!#j zo0F5rD@6JEuWx8jd0>GK7{IyWLHb=xpGp@JG;`m$A#GODLjYV0zWw3Y0Jw#wE_x()Q6xQVwh0{}m2}z>h3p{kbMQUr;CT*_5cQ%O6UjTrh3q0hBdd5PtyYF=T~cdVF~uH)gjqLVvO7y^j!9|04p)gy%^X2g<~zzp8L8Pl)v;KKE=Ogy|E7sM7Va?8okl=jq!QHiT(q zGtC9Xc^qsF_*$ z7hfJ1*Nvb`BbO;Bb;7I!B&J%g=1%z;7lGT;|1KXWZ|C1bc9lqmABZ_aD z2Fc;sd%;ZwTcShW$LK1K&u0)_v=`IaQWVVfBa4kvA5gaB_1FU&nuCq(5gn>4+|&9hJf?$M2AO~Xd+O-YxsW2h74Fd}47z3s`x zHm~pY<(bFCd5p5m{I1kxSb(Y|cElqDT^BFrvVR02n6YwXjDeZhQ=KwDG;H}NHXs1IgyxMZh^A1@%AMn@aH z=^aWs0;EEtb9t+HERlUVB)sJKce~h5g3^y{2*c}gs)!a+v(HVyrC&h@=MkN^hOUObMApS}KTKnV9gc zJA#na&t)na3*1%%FV7O|K9BUaw0ylI!-9-RLeZl`B5lLi*>{Zrdz9p6zosPJXMv=N zs9C%Di4(sVF-1@t|B4i?V~*6FF{r_Vi>A)Bqu#tKTq*G2RqXq7ynYT~1GjJDTYuf^ z1%^=xsMOw7rr3V7^pkeFBL*ShsgcB9nLI1HR2ULV85U3|t!jxSUb4 z1SvZN)7Jbc$lEcoJVDHs%|olzA&Cy_0D45-q~R}^p8sEQ|KZn#wF>vsvS9!}K)}D{ zi*q!+c;8DO-ZMgsu&UWm#7el4+Nwo)<^g|^p@c&GyCRRB$prAu?aQ-(!l%;VM;hhc zBz2E|X1fH!){b|o?AN!<-~BtUoB3AZbeEz69pw9hjPY_AL> z#2_2?&r*YlvZ zh^5a!eYMCrhr&$@UAt#tQiJJK80~*)*dg;QBOb3r;t80!-)1Do;^(qe7Rx5ELJ(7E zjHS1y!#g|=BEYDt!8m#HpAlztq$KZ>Up*F0PCf0w{{v*-@reoh`d5ANUW02cm6ouS zfxXGBi^Z}fA5R_SU9aX#SlfReHeQ?am_@vXj~b#%kT7k3^F(l)n_JX^MQ?x0@uJs^ zKGOk9mZT;bvfdCEI5S~(0*vW2uHm=;&%u!-(xt5DB2?{5IflQ{DMW*rx!w`F#I9h?nt?)?c=JvgWjzNQrru_@iZHqEhW|p-2;WV@j(p+2W;! zSN}z3TUryQo;VX$xCD{g>{rRqmDU`GGklMtmq!OA8c|jXNK>e9Wg9_J~)pfqjiq2NHrEtV7 zs(`gAV`xQ!rSX3@CB)bani;360u%%SyE@W8sv49-y zeuFG9kgb0J!3_Ka$G1A-ljCw9irKTc1;oX)8Gf}`P65+g8$j0tvPKL~4=z1q+FmY*vvFc39^+-moD3Nc`F}_|d+!OUF6@G-Ye6*ShDQhr7wb zmwk}$@N5q)NEj_0B>JNU4mv#xa($)NTlzlvrw4zqV=M2cxyZ#sKF*QkS_QU-e$~G0 zH^Ea2(9YCib5pZYjv6VPUSXG+n26zFV#ft=r2JQ@^8zIG!CiA|ifWu^3G_|Ls^QC% z!hGMd?ivfa8`tREC)R;cV&+F}yEQovnah(maiH+bdCS#!2@m2tkQx?kZ7{T9DAS+S ztUZ5e@8Ne2wNbKYU~4{fXHv1W{nDHSEQ&~Qt>ORRs-lDeex!qyt{1`DCZE1=5mTE* z{$St}C~>2xiCiBywuN*a>9~Q?CKE*_@uWsza|pf&fv%I_&#hQ)fDH})32eZ`j)#$6 z?lN=x(PsjY%rrt^Zwy`Z05fWJk9!$v(WQUbG3Zm|+s_u>`nsh0F~KE%3#K_~sX7#S z-Z=q8qz%vxM?0n=I`id#iuC zF7Ec2fc&*~TI1ES8Z9bB~5D%Xx$lN*-zVL}+znRd{bx}7i zbj&%k5lYKbbvb0hztvLpGU+YHiO{;zGQR?_`_2d{q+X@x5U6c_U#hLLG9nZ4p%4#( zWL%I-ves5|7O8Xi593LEh3bc|vlp)(I{hN7@j4juXCv)}-@<152-uWIRoH%dR70+5p z8e*;_^J^;h4>|Xnn0PCF+*oCPm1X%XA6cUHdStQGDU8@iyA5O5rXG}i_-lV5a0ElX zTXU>a))Q{dsJ9#APGQ07Z;vmT!owDlnb}FkYv$;cs1P=kygA^K^5osY4bd6WIm`C z0g=>YUB3(tl$|KoWS3Ysh97*%a?*3E=ML8|q6$aq` zZ&C*HqFai=M3rt!rK+3rMvyJMgYZN(vloIwL$eP@{bO*Guw z@=>O<1a|EK4D5g;oPmGBsyF>V9nyJ;DBXy8?Z#PP-?_1s8r)mO8SK%t^6UBtbgma1K54?THEo}k zR!Ps$Otqf1B?U?(=5R;W;T_COop-qo4Z|tFj6bQMo8o*m`UIPFj*|4f z9exEyxorROp-klhfY6#jggn_MCC*P#EtMQ1Gp=fhsLjMTS_|D+7Sd-3l7K;b2N&06 zWF$Q$cM@CQ0kuF9Vu$h=`Vq~8#mdsFle{(G?c-YShmUF6-4+a8f5=ZqB;B=pe); zKz5NO^-l?7Yoh@bmB2B9OHS!99iR>v&&Z5vji@wq(2=7(G|KXy%gRxW?4m+)n3a_6 zlQK_AjR^rRz%@6`!+rI$vb%Tj?xlGpgL`uN=SlbqshEFZ-1M1;wzwhTtx^A~+=p=w z$40g~WZfj(iLBnaK%@@=PpR58lesQ{WHY($kTZBZ=#WBKP< z#Ppiljz)jh`7-oHmBhfrTpw&b)y|^hopB1qIkah-^j?6W*UO*Sg1setKRxG6 zz3h?J)RYGx`t7vlTLo$H!5mHzXl0ga#*g=?b98^{v8<^CSiEiL-hbO^7x*tM#(j1g zlIOi6`M|<^RZWV}Q@N5^GlqoJsbs|=WZ)(Ey=g@EPn%LWIgS$e#Hrh)YPAx{m8)kE zd4d?@aT+mS@Oucba*9FLBa*r+EIbH@1MRkyKG;CnirHWz{M)7XjT(k9AT?{%+qD-? zFY|vfqtwbAdPBf;kUn^`xpVJ+Q$PV9ntEr#EqDb;}N4<5B!J0Wqn*~?~mT{+4Lqx zKQ56N2g7&3OfxN8`8Xb+*<+`WtsyVHi~kkLqI~=cF}=r2q7%LeCgL*;o)enetXY30 z9hkdAGmvTQ{LTQR2-rT!sv*KSqQ&%pc_zTG>KD??~|Pb z3}T6TJ7G`y1GIxB4@dVm6nD);OmfkN$8bBhCK0i(HT9k-s`HWN-vST+a{z8`q|7zx7RpEb-6h6=l2(0UMwh z1@`OD?*PEVn>3)WP@qQjW2TO5q?7SLY%M)x=OuVz_HiPjy{;9iWA-|jE6mcoXI=U1AK7m~i@TNS8 zga(MZ{oX8RF@G8W9HLFwO;%Y}kYkmF`8|s*?s!kV>pS9Vew49LzWZ9aE7lkh!rzh1 zQw&{!dx!i<3IJdlaN?^s7)^h5s{jj28Gjw}0jUt@h0 zRx?NONH^f+z`$qVH5DH1%y7zXL8H#@1CEL1e%o)!d8NM)nf7QtjU&nt=8#4Q^T4|1Oso8%n zAqFBa!b<5sGH4DYixr6Mo?PXCXRpHK4&FJe`SrZGxxdE5KPN|l${T6=<(Kx0W=EN?gPu4;)FUolB@KWjH(aYauQ3=31wlbB`Go_Tu(`~xO znl*lDCykuQTCxA!rOmJPF`hwYO}jD~FBXLPM<#mZ4bK%=3TeU?rJ%=XQAl2XS?9%K z`;5Z;`q{T=KI&4$CTW=f%a!f0$Y2wuH+N&=fYw;=^_f5DbntWxM zgPV1JKP-RCBTE-_1aMz62&zc{h zjohB_y{wE;1d)xILNAb~{pgXlswQDH6<25aq{n!%B_b}^-_y39qKStS7O$V{OpmL9 zF2uAuXrf66e!@IXzIdW7 zdXlj-6r`aSoRRAO7t$CFn}l*~gq4BSlx2|3*?KT$8v4n$OI3xDf8!bxHA9#VB!=JZ zVk#(Bv)xDZj4bz*Y0tg|?-kFDN^%pN4!^v?d}^!NRIRulzJ~HrKkn%8csOaM*UO(> zUr>J$NcRYcX;$=K5&c0La{k0eLEK;EJ3|hbhI8ATi4$0$9abJz9n&at`|iHXV=kWQ zJJ}94S)Ec8T-0TT>qSH-VDJfhspx&_Mi51(!7((#Ai-f;#o|DBM+6jucgigafaUoD zfKX!^0xjc0UMn2ruI7gg>lXZJTEFJ=l?i{XH5kt2U}AcW+vL=i8@pPRc-~MVXzpY4 zQ1aIrGCuT$Z9A0tfPu0Q;24u&8cC96&dDkLmH)CNT`Ta6kq}aTFuAJS@HDsNvR|rR zMzZs9m<$<7XKaa|zQ_eXL`$=~tgSJN&Mb%XKWic75S*iN}j3{qoEeP|G|IE zCRg}RWs}xeqmP100$2E#%rU{#L^!nLECQ&^s@NUt>|NM;v_|u3KDoZW?-K;Q9i)!K zI=1qx>ROe>*hlEc|e~EwY`Jn4#wkEy8I{2VNE$QL5OiKc({^ddHZM`%a(^%KW<0P2adrDZiEtE{YSuhBTl zgfc-+4+feB8#9&i zOq(G@f8E73o00lLisDjekU4{dk*q@DPG^ecm}w5$*<|w=0BPORO*_PZx5t0^hZM|H zgy0Fo4XXw%V^5pcV}i=a+#zXp zL@SP-m5Zzr;>uZ1UADxe*}#`U83yS?s8SNZ&u{)TcvO#h&RwzBce?sMOPRQ1r8d!t zLw_v7*u(~jAs=;JdNpcyZdiX^pJn!)FtZMnEc6hl1(llVr!xE|bdla%&*GfxSl@86 zZzHZf0IHSEdvi+{y>@=xIT(lvCZMk};Xjl#Sg}ftM$|Ys7GLBS6n}(IN7>9S5RdWK zYRj;0Lf+(l&wy&?_I+M*x=i#;bNy#b!|s4*(#w7fxmw$xbWslootl5!R5{a50kxa% zWll+%h}d9qy>L!gz3V4|PIC;rJUd$0D55G&P9@GF0Mc9bZw`!r9al2MuLbgnNj>4z zjFcT-$)%lXY@-WLjueyt*jIFn@3BctB>~2WPyqQTG_Q*ksJ>Ofcxd6C?SC?Ngv!ZL zRmeknlI7NKyrKPHfyRIGV8jp)vpYZIYgZypdAHeX^i<#Mt2d*(twrms*o8Rpy!(#; zm3^g0Y8ezKk>6WUaj~@7kw7SBjmD5+5%VWoK{4?mbMF@KVI4JuFpMh7{0(`O)PE5z zw+VRHEWJHn6>@0S~1Sg=zKs%dxUs%kA?Fo?Y`+0A20`Phs2;~41MdO z;+4a;+vHE2exiRs!Gd>9#|4^&V13M`Mh;lAH@erf%A7S3rrZM5_pG;d4Hg`MgRB(l z^+jTYlqZODC#`?>H!$P#;y5B9rE8z%?rzKGJA)x)y2h4&7{vz1C+BX7RZ4MAWW71QIDsrVI|b6bG>jG>O!AhU^Hx{- z&=9)Aid_6wo|g^X&EV(sX>%Mgi|@v~@9 zWTGJ^&bzmeZ$xc3mB!rMxJ1+(vv$g*$Ef}#?xKG)A^!x4INYne%0^~}5OdJ*l)v-> z6lG!_#B{|P)@OHnR z%ff%wsG_-Wm+hAo+ibN^!`1WAJ%N*jXpwHv+v%w+Uxn9T_CRvrP=e~x&iBDGuc6=? z`qBPXDhvgNvO@v9I?q?DH~Bb6Y(u_o+okO3zu=qWXzctc;QHTK;GiJ;CRKmz zb*!pPv}VEd4{VS8B-0pnDriBVcV2$lE@qYb=AAg@Rj{U?uC#}Fil8vCRJ}MNUXUF4 z=sy;;>%?VxXVolh0sRJOw(NanXeBU@kbZFDHzm?!XZp`?GHwpo%= z1Pvl&!eSNGMD?oR34zH(Oxs)(LhQ;fqE6s5#kaaKHCYDNxKHuHXFw<`{WL<;bO|QS z(e3SZWmTOi)|+$$OZ;H=pbJi5Z)wF#zfw4C5zW#VyY?dJL*$9a{=kPQPW2W&W*Kq7 z%acm{CanolMDaQ(eNcVDsJMT#pcO^>4JE^XBJHO;D0azEYAe#)M8!WBWFCoR6<<` z5ZD@~bbhU_T&9m-^`Lt>!mp@)d1PGBscYeEp%w(zBy*EA3U@5Y4;jG}-ghIVgE8dF zw4>Lc21*6Pb4c?vCf({D39wVT2t=lBZsXrO$M{-Q!fF`WlEA0~2mMJCtJzDM>d5=1 zh=L*|6fT42JadEbkVk*c)y}sdjmlFHhn&}sCUF9j7E&`8LCs4nqxy1K4B(#M2eU%X zO(|RH>16J-*igr5{;-gRNTeNo>@ZjILOGX$=a>POdsJ^B#;dr`Mw#*7s#zlybig|! z>y1%v>#?a|1X;+qJ`RYFe$pb|Q#aq6e*}GY8|Ai`R0u4m(s_T$<|t1F6fBr}R8A$D zG=Mr9XkK|99kI*1eMzp)Ke#6P<3-<{i3WHVn~_-~Pdy!D;yIBLnhI|_3>Qh;nD10L z_HkeGq*l&t^)^z}wG^n#_zPMcz}61yaXZF<(@VC+z$)hGv`}8>;7%L#uKOR@yu)AR z1>>`pmYsE6MAU!rqdrN-$@052qqjQD=-S&s-Q(!L!3jgP zXK?IWlq&mA%U?3mdiqu82yGzvMU0^91%XjGEj>tKG+y4gsSjIbu8j@yxOdvOsB~|) zFP|PmrsOK$8q1b@RGs7wtZEB#o+vYlfwDe5)`18Lrr3X$Ih0!i`+EN0P()zHEe2ak z3~w)v1%}cpO~Oqv5kzTV&ja5zIH?R*E&i>$i8JR)(C3m6Q02PJvNN2&U6fH30gP?g z!L%n|dTFm+CW9LJ2@1Iq2lgXmt1Fj?-4aok2NX#iN{m~&-XR(a;!x}>2KzNU6Nrc> zz^tU5NA-W#jI$hSpb!`TZf(S=(yWY9&N*>cU`c>5%fvHA<~x>rgN*UAD}CX=AgZOc z&bQAc?>d!8gjx#NNF0~ua^#>FsWMC2AF4cT?Wkj+U7*UIxhi$5>Vblc=f(Ift=-@Mo&zQ|wm@r?L&t zE@ESZrOtd`_g`e!KekbM2|@9o20Vd{?&p$)uxe%I!X`JB-&(rp$2cCyqMn#r03z5L zN^RNH?4QvIG+}Zjug@n-4^m~o67Xp+8#--nhMV-6ssqcC(7dMT={Dm|H>3_5-ugTO)_H5B)<%0H zhdAHXcG+aZrLetkjx~RgoGTT4NK+wDT+tXta}hB(vaf&Nz9kvPiRb$!gBSLEye1UW zmB)d&5vx`rYIT{PH4ydJ#Wwa5e0t8djDCM7K3nkg%4j9^uG5bXOW`*Ym{NZp2~bxd z6F29wlii`&Sw4^D^G=PC!Vt`FZ)=%#b0)<~5J8+=;ID${J}rx3JyV4lIIy=O`KM@W zVnQsFZ3VQr?f=eJhUOGn1q9SQxdhP|w<6r(&4p_ao~4!%V`qRpxAeF4u_^H%$AEv+ zJPF0Ih!~PdnHyrwg(EMG9zQ-S1>Os_yhuzfT+lsCk(h5gn^xJ~)`G?03BPd;D;xyN zou-;w-yzD`%~5>P_}Wwq6ZJ-Ws$}42Lmi5SZFtk6PLN(@fT7Y-(|-f;mvP# zL3+7p6|oer6e|89g%Hw%4hrSm#+!eKEF`TqB}IbE|58u{20+!jecrIkAC=$4jfd0# z_nW9+ivv{;(C}tXE6L6Qh-m@b7=-dFVjQCm*=~HbZ8?LICTm9v-ia5yD;wy`R9LDTDR`X zCQo9In*Io(=s;RW;1Y-m;gQW$wdP0YL8HO*%1xlRQ>Bm(w(%PzOrWfW<>wVKrdEqq z^Nkst`qu^n6;on!oqyBv~`>-5Ojw!hV; z2F-r4e*o3Uko({e&n@t{^4ou_xDrK|O9Y+$Kq&WvolNP-se!8o=lo5;0FTf>x;r=@ z<6l80-79;%8nwp&PiinZv2ecZz}@ZrteI{&m|-mDOFd~0=x9G9M=7Pl37n zvv>@Q8&n9RF+;a zqfXa;AnBv#cestgJFE5wnBZJxK0p~l0aqm}9-5Lud$4}`(B7mq=-YNLjGQXMA2>)| zGEj0M`5_p(%7Z0TNE@69wVkf?1qz4$8;3N~H2ctpb&YyU`wi~J|kbnRW%6N%Q^ z*4joe<7!}fqMek|ZvI6gaUn=$l*2esZ~yBD-z|Q{haT45zn~CdNWfDg~6S1lL0~DKZ9!7s{?EkSVMpLQh&l4!$bJ1WC zQEWp*GfG-NR@uwgzkZ(XLTC*nM8=m|3$oHn^-2F)I?AOkY9WzJ<%2>9>)E-|e-PU( zJHVnxqc`?cZ|RLn{q9;86dK6~loV_wJ5 zQ)5xXA>Ds5wLfDOAFTgybouuSvnR$=yuiJk^XL<>8p`%B3eVzI8R2IaAJU-q& zvmO`i^1ZRJ!;DQN72iOC|81}XiH>}qtUFZcoo8K6!zh+kDTJAK)}TyJa|lV9soE-o zS}2F2CX4=#IJdt~YNy|`>1lBs6?x7%(JaB>L6%fBjvL;S25Z_`SEfg>8a>jHcK>l5 za!P;FrA+6-&Kk~rHCmNNQLjR3ad;=Mqm#7Ty?PXBz1T3Ht!NKCNK;at-h;|xW4oQ8 z2f{Q$NFeR5`wF@iune^rr0=d4n zLi4RdS_x7ARdSQTG86#vb+^q_O zt-Lu>qs*xz8`YW(UU{ zUeAHfM7_%XT%WWMxvesI{e_j;p!J!Hb#ILtL9{sw?RC>R{xNYvj3SSyR;*HhI>ZUw1z@)Nt-o*y>gq|`oe?lz} zSx|5HINPnUDb^=XoA|S|Y>fE{r&nyT6kp4jFz+YttC@T#{9SPCnr@s4YcDq)89OoyF5TR_&9se(pTE= z;p z^{WyCqDuak7Un|L%bf2|B|{qN!ng`-ffh#b9G4nk9&!qJ%-K6w(c#S7m3i_)YBPUD zaxNH98y#~Xg!^4SN2s+QXeQ$u&tzGPu ztvy2MW9#tkK*%?G+Jt|`7sWgq*v%0yB(rlWiX0c7v5EOXEyoG(=JpYPU9m)$aVI25 zrxBFwJ`j=jCjtIO$)PSWTuD&IGY?U4!q|`=P)TB8aH41J+0Z@Y7#)pVe!3e*X(GNF z$Bd1`Z8-e^dx_As2!rXMg`tD%#We$Qo@k!xJOk8*S*+kw`Xqnt#bNbbpRfXq?ir zZl5NJMT%~tW5R!UP;BJa(RU%r{`>c+bMpIgaehUy6r2q;x2ukM!imFT)5D@T^*097 z=z`U^8ED+{&minI!cs>B4$<<-xYXd5Tfd1ynp{>N;aOan`72Lb+Kx#V5yK_QL)YC4v%&anw&7!iJUj1FqSPeA`tDu$4a=-TJn- zU9%+1Gt$1hXkr#16Xbqvms275>)g|5gs?+LG2Kukla`fA=xH%4SZfjjf=Vi>1ysW% z%shXeEJdRG2fM@XdR5$SvTJ0MzTYxBt(o6uh2%8tF(;utH(08TN@+d^96c7)(|D*gBAYDANS22rI_9|tqW55s1G>y_e` zTq9_t5@D%)btE*TOQ3Zf#}a>-G<38&jT3)O6v*cmn>L-3up?NB1Q1a=?$lh==fq>6 zol(~fpfnbGw#rRcC5(%LPkdQ{w)4fGOFuAcKu|;g5p68$D+o($F{?%qQ&hIoY`dTO zV7+j2{ql_{5MpgErXS_G;1W6)dfPRAB}C21@k_jMTQcpVq_MBQ0lZOTpb`ixjqiVT zRi9%H6X+CXrlSH9&rJVvNg_%z**ZS9*!#>~6)lzN*HND2FWz+rR3p;dw_}@BCFE>Jf965f+^K`2}X+dXIP^Oyb^t!#}< zY~pdgO)uT?Aq59>vTw^CHOi_l6kC63HarkWTRV`mJR+`Crp5+1r@|5GEHwl4VkzoM zl#B0=^3&(Rx{LVb8;Bv+%9_mlpGP_nO4%=m4C4iibj*&&j?T*J1M8pRIc@M&8EZSF zbzZ;naETyVY^ExawhjW;Ykx8FpXH15yx=F`Rz^@&Md4 zv?U!w@GvH5=1;L>gIb|q12>p>pVk)&1f=VIAGM8Vueg0n&7Uo+=Zj4qs@bH(<>)Dy zBb3}BOm$4KA-Cjjg;O;8MNhQh&IpEzxLug-vN5XxLJm)E_S`lzy{Xbp*>7*DYmF75m$HJ zcn{JGLm_$<1SV2K#OWXqbo9a-AAM;kk)FNo&|niZQIE-rkYf$k^<;kuw+jH!0!I;A1pmD8FGJc4kDw|rx-f50uz{|1p7d-6J!#$* z>mCor=5)a<@q!iU79_19a6Rxx;rpxGh_`V<3|AHfI<@s`-#*UrWj5yJp@L=GTqeCn z6k7hRu+NkY6e6d;DNTQ2{$Hjgg02G@8UXItxn2(7QoXdMdXh2-{U8>??jLCK0i$5M zhzoN2NU00qYxiS~mwUH8;pB73uM&oouF)SGjEx}Bmmd;20QC9pjgXKFYDh+~6WuA= zk%3u^qfMw49GAh}KW{2s&qx`AiBrZEk{y_;e_Obh?MWAnpDr#w89^(2Eq@G_eqi?RPGMWL@RF&s zwq(nfYDEsUl+K<6YF`SJ8@%%$H+LX6yrkND=lgV?<%r#6}xKj_08j(VV zFFS5^sHuO1aTbKFlYXTfl6?Z)e?nS`(_1)HeO6Qw#up8*l=4_)lXHKk+VAY~fP^gZsMT00A#{6 z1EQV36SLIPFu8tm76p=c27MJPGwcG1)A%;RDB`o}!qJ-$DZRHdCFc>yS=$;Wmg5tx zoM98)L8c9gZ5N!`){fZ_WqN_!aMEO;7GOxBbdjqjRIaXkYfyJ2M8>}$^v>^8QLj;T^SV?k*^j0V&{n?4pAy53g`TM*~8lz>!^v(hRpjMF!$>XtY# zajfu#*$1RlQ`t1l_ES9`d*HbLvz9+(LWp(?Q3Ygj6>k9gq zIqj;?)gB{)$1X|tbqJpHKLra+{_~=Gtss8{2WZ$P)F--w-XWX!ipU(Hotl4}HAH6Y zMbit`slLNBSIRIEJi5n2ZYW47R&2;xHec#0BxD-!{DO-csZB018VI;q%<#PtTFLnH zyaU=`58D${r`ff)Sy)*x)kDWuFg@>ee^*!fD%C2Kk7*DJ>!$3IJr+s~dptg)CAoh- zB~C@@%Zp0KXSPD39YFKIuZb+OB&64=8Pxk=j$F%u^HQp?bm7R(ZA`)DJSQ}8!>Kai zT)m%i7yE4rZ8UQCpRp?xo@_xTuw-@6pY+G&zgwv&03NaUq$O;F#3sDZZ1xzew1tSP zMK%MUXr8h`Y@)j<9~528HD^mm_&a}N^k-Ju0*0=L;T6KC< zOGN!L@a{<#1H8UJy#^4xtj16iVI1)%d7*A>KkPa(N!zNeFgZ+~44~IGp90jb zz=7IV6^BVcT2^|1X};q}Kr^4k-X-(S@yv;ad1D!7_&&Di!FyK!VcnF4k(_@g@owJx zp={%d{g84Dm7*>e5mz-hNLj+hA3y8)-Sv0K!Cy?0pWP>-Zzwtu>;K*w|m2J8J zu(C^=*X@6Nc)yD$p+sE{*Cx8)PjcH1(61`fH;nDYYu#0A^guJ*rG;w%uaLPAhjx>G`<%16w#yvALX(4@~m+LTB#wsSCKP$c{ zT%F(mYXd*Tg^S(AslR{c`5+0~WyG2G#gk$DP3m__8g%Z2(E8wIn#0UoSOD+*EbPCc z-xe21EMt^*>yE)c0{!7Y_ymMkXkXqsfIM%U9N7%8uzBpXdO&6LURWH!-*h>?jv%{AQKCEQ|sE_QddgxVrB*_nOh12Egd~uOn3>tZ(c(V`sd4dK=JOb zgW;s1%n?dF!mzm&>98=S=Wee8yJk=J6?YE)in>eIN?OM zNvkWZOVJHw?>edfxTV4dG*^y|JoT}d76K=KD1Mie3_{dZ?Wm&*bHH9u7oA&lQi!e)6g8g1jf~80crQSbb<@DGR&Q?!hCp}LI5gmm%M^WeO z37E6F5NL%c#r!qY1x9!|g2_^xj&>CEVC2!Z@QRY?L{=wB*ebiq#75-uic8=^@jW4~ zEk1vjMMblL%P&$f)k{~`kRu8&;3#s~7%e#gP-|_){4=-n zXO^H2^_*Qk5j31Nbo=8pY{oVhL`s>QIUZ{0I22Ys+E1#B>V$MqRL?%UDM=0LWG2pm z29K1JEQ0OpC`V&fYpqZHP!L+(6(t9`^$dT-Nz_v9!W(^+sSr8gu?%@1BWDSVy{u^plgFizml3&t|q zw<+{0t_)x}TbJBCNplow70;)2@Ns|NutI@n_fZPRi2|s|>@}c#&1AKg{xZp3ch;$3 zuvie;57?$JG3cP4nyt$0B6e*9SJMpW|E07Av^Za#Uv|Ep>p8;Lr;!?8PS}!bM{+YF z_0%JprwGMivA$}-AX8s#A_^MR0BpDQTA-S$H2yR@dEZIvXRM$e;Vge|={0{cg3eJm zpz0nh=!yyGd5k4fD?39ko;pyLso4e}lRdg4CzlT@k%jm9o!C{NrH_U-*&Yx?$!at} z3b-2$N_0CEKudFoe3xA4I9-nRf>|H!O8?%*$wlwZW;^OI&Go|xOdIY_C{I44O6fhm z5fLzGL=If1tjFhuh9*pu18aXBhWn|KT3Rf)buv6*LK(wF8Eko}@&3D3-BJrQ?ZIVo z+VI+(abB=qrX<0Pi9F&?Jwb>n9o)CPJX`9=FFeDP+X@u!x6@X$?ubRl)r=w;n(J3` z?x@)NWzXI!UOg1#czleN?G?@Mmk9)!T9dGlqs?bV>3dxdHn*CA+h2cUyDd*fpsUuy zrYi!H+6l6NDFO_5fI`HM_jOZByO~Jprjf%IEn=aMD|@B~^n71VdncL363`aWt}}+v zj+{V8bEMURpV{GxYD|V^x14u=$-roP`AOjDPg*&3k-wPOw^Q&S(H;OL zOZgX0{!^C`J*xTijNyM6-rezDD?qYj(P1QlwpyoRnQDzE6`lUWl?<23#U_=y2fUnL z#-)il$wZ>!_H;sbZ^7V$9(Md(_M+d^WR_!7<-|YSe*OAhI(`)wGFZC~TsWF-g-@HQ z*GXH{q(&%y7eb7WuGRQrpFXD(Yn zjn^gHf7~Vu5`qolRaTS35cN%3;T#Ac_<77i^Sr|q__?-QAZQ7f7XaycX78-$XWrU7 z>P28we45!@d%X#Dbb2I)ur?yMwQqLkE%;>naN(nL5EFkbQ@r^wz>^eL#7`-oagHyn z<$J=9Gl6RaW`G|Mi`kZ0SHi^2aATFN%<6U~Sd?NwWr@M3b*mwn_;5v;foZNX>J+9P zXawvc}y%_;5wW;HOn;}SGiPra1u>`a-TOO7j-^A-pF3aWl1VWoKJwk#yRt*iuO z!mY7~&Y>a|3MS1xO%IR(?&F=+3cKBr=Z+(i zR4Q*80vvw5S!EUW$Kd zgl5b0HkGBV6ANSfJkb~9`lonQUl84CeCBgxo0T#nj4ohsjqy!%@@YL0mj~9kwczA= zE(n;?-qgaHEc5OTYUDLkCG6iQyKH|}r~J5oc9-p-ky7LOO)h(AQ7~W0DuNnGC?3@) znryf%4Z@({kEkRnv9mcrA8)H2Lc~j!$}fD)Xz6_Bysno~)T!>q6!vd}LLefUtq=vYQslDF7UL#W`vftr5Z^K*uq3ThuC7zC+QK{F$N z2})7X{&dX&Rpxg`Qty)~#kS30v2L!|j~^-3ne>#e;K73CyI?b4B~pn>5QrhdDTv2? z@YE&dBnmP*)xMfH1}g15I3Y;?@8%A0A@~!6OiRaH{23(D-h%_wjXvA#Sq3T`xreJ= z3-+oo;dqVPn4K)&lT;eSswTEH{+c6yG)s)sZ4NaSRdDAHrH1va9XGzIS7#*VXWLCj;mPI2vb@^`9l+$Z z^imLQ97N%d9CwW+12wF;`HBfWC&cS8cjBO(SAEvQzow*lh-B&hXg$C9@v%dH=8~+7 zu7Yn8ehL1xNpz{MRE*CX5x~4K4y19QY?xFn@ceg!GcuS)F9hTj9Z`MPceP`6b`icY z`=>f61CC8bUIVeiA60#af|0c`(k};aCHj4X$AmO_Al$PuAY&9j#Rlc-w8ilNdQ)rK zn3`ix+?qWPanHpaapg!>FqT4p1joa%+tZyNm?GO;g$bw1*8SF>XR_M!Gycm$gIncS zqzR4>SY`ARWNEJ*;(wH6$WI2dn^Sv$u6;YcctFiz{aIUg-MD%|{#I40F&Q;MvjUiK zWSCPlF4QsSteA8-7cT>UZKEGV()L2+3ATkfDX9XDl$5Vqo?`gRQ`otGNS@}C$$m~qK;1DLZVDDlC>-Ww&sB-wpLps6U4A{fu~ufC zJQ+)#IL{cGDc9VRcgF73=$o%gM$j~TjymEiN9Hu*qI_vAB^+zN2xNskYw!O6esb2w znT%dqD>BQlEMezHDBgyDj4zN3oFL;>Lt^07)dh)Kc0;1j1PAcWTt_s_G#aVyhr zJRNb#uBarD3$t3mVeuG2-YG%fuHnPdneVpn%nNxy7hL(_^SL8MY`Ej8s}+Ygmr?aU$1KSwI|W+#9*L61tm#6od6SfX1cbg9krK#aPtN zgapNxd;54yoSmOo0O1JN`z$L(xUqhO>_ZAi)4D9}>)ToLU~jvcj!?+~-9&Hcz~9V} zjuRx(vM*Vzj=g?=GJDZAM^YkHkMm_9IK!GG@qF{lugkt9Iqf(dMZ|rAKo)wVhRhqo%}T<$iDAwPYrd3Ae16gEm5A1kL0%e`QOPk_D2E^cyRCo| z!t$Ozy%zclv8xYAMZ}hsn&N@}QOc=+n!UmY7{bGUe56NXNa@PWeg^xQ?s%ZAs&fdC zhio#d1RTTkgau}zs1n5v8QO`ay}M|#S>~IQDE>Sy@^&i6jsa$#GR#@0r^-yk;|2Oj zjk^r@S`FiBI&EYZuMsLK3*~&1wFei}IV)h>(7U%az6NL2evmN&h~pCm~$MnwHr5U`@zQjlQ)liKsh{h|y;B%U%Ut3cvtzDZwC+8tW^+4WlvlMgJAGtBh32-SE+#?&*mz8bJ~q+!^w0lfQz{x zCw;-HzJK`QPQ>lXq9>CPI^60~?7k0w#Ek7H(`k1%vmC6mAgX0iMrx3@X4-QG49tKQ zU>B|IgS_c~bywbvn`L5fm;b@NF*5e%X<5zY%9tt|XZTJ-L>Dmz_=swUQuI^b$GBk2 z<^|xmu_|kgK*^W2i8N#yyr(hUphR<(%ZV2tS-qvHL=3m!S$l$i9(CV#VQK1rlt{ds z9AO1IX}nHlA?hq+8$*TelIHj~>Y|@D+BB5WJH|$kt#*=N1K*L+!g*r1_e@O>{)8!^ zB30OGK&tiogkeOYc4h~c-nU0?+p;#xa-X~3FB|_36JR_`lmb^-G?VsecV|%T*%DXB z#k&7SJ1r+J*E5tJhFWUyfQw^)h4j_PWyaD`P13GQHItB$K9pS7_a+mCyVK2#>T^m; zzlGv5?|r<&Wk;JQGfGFOyYraO0@)bHTkiuTLgT2q{fP7Kl&Xqn>INJ)GdeSeE;!yG zkqyk1j(PiB)z29=N{Pc)xzRr%9EXPMe_e6?z2O|J{x$|(mBQxCSX6=#`=P~)wU)DCCiQCVXQBZwn`9$rLC-rs%%kbneE7xZUiyD|BUI5R%QO zhN09veZprXyrQxRCDp`#gn6%1@;ab`I%Z2w2=04lmgADR!*{D~xO<_Ayq{bS#K08w z7qwDk9hq-*CwqN5p=?O42**Xo_Fcc;MFkhNra>GeGeoPB*sjX$Qrgals2~y>kQ|~c z-Tj%Uv)BP(WV9$4IHR_UaJ6^BPr&30u9zBvC5iAlx55s4r>0JSf`8IjEt`?5NACSr zfTXRrS5L<jX&VXA9NIVYyF3yj6o9VZG zc-fCyX(bU0i2)7WeWx1?^|Z5+N;R~#npFHTbRlKedNT;}@D75HpSR~DroK?@Kt3Pg zje}(YL5GHj1O&E!wG!M*lAG#}Gc6a!`(YDU{GVR*If`5e?OpH@gvtv($;S$IOA4c8 zc!gQz`Y2zLy2D|Rsc|~w-4mt=`sSjktA6W30U7s#LE+#+pcNoK008VS$KUE@*+;cJ zh>V5foRj=Bk-?&0IZwrJP3FDRyOuHldpr}KKCtoYNyd7A(ht#wT_BS;3aQ5$Ktx}I zZ9nd6|K1E--)F!KZhlwmv~&Mru%V4WpJM-G$-PU}0!J4B*p5(-AAI*+n-xktD=jE+ zYEI)^^YQ#Kifq|58120ZQ_`Jg0+MSh;RCd!M2W;cof!W2NL22}T15C18Sw{QAOp`! zpH`H!`9l7GHA%qaodziY=T3Wvp!~<_iLpbV2o!CgM%}kbJ&-iG^4yV)?Gd**`9^$O zj-KlrG{Wp(W83FE0*(F2#IHgqmyWJdGzU$z4{q!QVp%8=!pJ5~lYjEva#mB$XKC+n zdldy|AQZH_?^*IU$ade#;_oFJ+2QZyJHvSH%XGhgZnQ0l|6}-kj%dY(liO`hqM(3V z<)Vld$0#(=cy+ZE7j74)4pJ2v7e_QA6%;8W9kqKn#xDM8s7*!M(_|&n6q@1m>S|ET zNm6!~EGKK!>LgPFiw*$ibYPzD9mVH}%^PU71N_&It5NTL4$0K|zG;&xM zc&X6Tr5;cy(_xOk^ZU*L*+iT^EM%4WhDzlu^suM}ZvQ_?5MjJ(uQgb_yr@_N3u-%z zy{@%ONv?u(Z&EhsaIlX8BkxR+aLA%M_?a_*lt|8)TVrY zb{zorz*Q>75*9z_O$8f_W3y3roe}}<4YA;S-)Bs)Udm0X*J6RVN{6^5q_ak*#CA5D zmi3YE@84Q|F&AW>~ZW zJnWszLmE3z8u-*kgp1GC9o6V3?|DaKeoDKTByTci`~5G3hino#Sj(-gK-&)=!MGO}vEs^H2mZvW>mA`PsA0^{>YbTf@KFh$yCN zUb4Ly^mrl}l>;EF;t7dAsBP)(N8S??r04k z$rN+wUKh|jLK=$gfns64aV`6K_RPO{nzME-DAShlk!Ru3?qP|ai(rJ!UhII);b<>O zy5^B5s81s_#baaSRkc%yufqrFwNWK@v>Fe%`66lo#IlL%TlVT&;US6`$Ld@O`eSqqRq0*WM-3Enz zmw>2*AxQz@v{&~0B5R^M3?2(G{JV)cV4NpB5Bk6nTqg~ZDkGWV@hg$h@J#6bDPrxm zz0H>S?yqL06ryQ&lY$y1Utd)0q)4jCbMUdhY;ZS8 zkllxK-HG0XF9*KFLRboekiiIQa65eUu7zhw<{HtZfg7hb?1J8sQKO#5N#ury{2j+r zH~tQU)%iS8Ke)NTFNXTAad}wvg%9eI`ydXCOWFZ+pwXHSD}`6oKUTyD;8R#V#L-!N z;f1nqL?hdO_htKUIJ&708hS|$3@T=mhc2<6vv*f1!)pxaxXb3J*tjP((|zx~RA_H) zdbw%oK){36RF(;OW^B#V&E9oSERwQ&%qioZZ0}-I?~`s@ihZ?VzD#m@rlv`uBF{8t zHC~H??Mx`TMO&BAQmgtZ!HipS+&yZzDM74)@$*@Krmij;q%Kz{I@rT_lk6MPHy|}S z5~Jy4eT9jm6`&Hf9$^7TBKc0 zKqE4R&}sI(WxW!r9KU!wgW_t8$AHgnbSfaS+=wCKs*JfQJND^WebwtUCw5dkODI%m z-I$nvhZuYxr*5VW&3S39YX*t1TvSa=P+^Yh=brjz1U zniFxqq~+DpxLni_0ikpR(HtV+zG)X4gAA!{Is|AN)K~1Zxo2wFAQTwXKe{SM%h{=}sM@@c^I=W73}0kzk4ZLb;P2kK zNk)>gCzAWN{Li_u*Q&uWDQI+PvqhR@js>$vN80Z3QfvDoKVo2-K{tcR9yMQ9{*Ick zjiP%+L;_>SZtpJ`6Cx}pMqL{<)5FS zx@3^gPM5P}gEYO;0WUCv*5;!_{XVEw&v9Xpn?p-Y`2A6Yti$Y;4S;g*=fr(s3j1rz z&~K@8A%$B6L_(yNj1gFuthsF1xYtj)y~wCS8kQEN_?_xv;0|>@lS5) zo^V00QN)o`ZyDtAYQQ9;&=)*^`k*x6wLB?pM_GppGWI`)Hj=Q%&nt^EWpb{J9E7D| z0%(2*nT<95^qa@RWu-E54q8i>jf=v@AKdqfvBn7mnoAm+R#5v3hyWb`xMzU_Z-Pt( zi5dT+>_$Lfy~-f^-n^(JL(oie@1^n>bO;nyfdF8JKt|z~KTVfi&}Eu;{o{SqzXRvfvEfo~UD9T(8FSkR zea!0`^kfD#O1ppWHWDO%|D=giQX{%e&TlAGBY^yghM-%x2;>XL?^#Z*W;c@F(_LB_ zPFwJq!x3*v9h_%FN31d3n)CwINfE z>1xEgb;HF-G4MFP1(d^n;_rr)s2*#&RcRw!nBi7UFryD_A_#N#;1EV718X2=THgbxQ-+qPQ+IB$2CDU=8Ggjk)$X znbEw?*`vZdAa%eY1D-n8tkoiQFVwKwiTon4A;;Q7I~}Zl=I6g!;QpSh86~ndq5`GQ zD1uoPeZ{rXBiIjsd=EfysCz6ax5fLFLIEA|3ELv31TE`ONP;{2k!KCk=>8ODe_ikQ zIJF#%+bDKFwowo+q)tXW{{m_Vm*fNw@&KR*2=Oh?-28jVhR(S7ey5M6R3}2O3JJwN zDEYW=XZ+uPZx4mw!bmKhW13m^{OFklMa5O))UZ4CKt-x3nBV?(sr3?HZrNF(yP_tS za~VjUuH+6v=)UQZ1%o1E#=_$^%V6}_N!X$;tEATd`x6Ne)beDkmK|+4OM4)%E+=sd ziJV4sY47}<+RmpLClh< zq5iGgg6J0hFEtPPt;762D zZHY(;xT9hYyi!SVN9rz5x!I>_LI2~eeuJbT{!ZavwZ-bhLkh!*X1jNov8%dLH6bi9 zHW_Ds1A*!IEx4G+kb8NKSzlt>3LnAoWYt@y9x%5-aiK5nIF@P{LI60=9GGafwI-|S zx~)cI8<|U+6k?)&$?lJ8J@6P@n+7*}e)|1VAQGi@3^gU#g|}L|>ji-~41WZ&Y6uL2 zBuLJSUl^mhS-`Qi0>FzsMMM05+OXASmv`NN%:MAi3>>=!=2*?!6NOtZ;FmqiO1 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%0A_mx4VKl$w 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

    cT3mvY@>~&%{zY2*o~c zN!L*w;pV*ewSnSctj$KpSPgM-RVM(wcBE~4POkl#ejU)SG+2LVe<4?DVWtieeo7?i z;vuZEfBgD01A_bX^_<7Gf-SbUE8Qnu5c5WU%Onb2=g5$#WKF9-TpB*@8?IxyLh-=h zg$NTDzw5@()Xecv&2*}(p-d+|7Q~IKIvLT#kJzZbpFW<1d>yE9o9$Ms)!QV-vk|?m zk5U(ACDg@4Q#^ly`C+J-mR&4V*Dx^J{&*l?@&^3_mg_2)7l!Ct;IJ#6%eC;kX$A!5 z92Ok8+~uffIPy}0|f*lv_vOqaNVvFfB79}twC}J2d^{@`oMoJ7kXs@S{Fo`YfOw2Fk5uO zI42J3X|PyH8h*3lrD?CdJn3F-31AfJ>R0uI)*K3C*~Jx}mfQoiHiy3qDkUhRe2TJ)`CI|ft2 zcBpj+*~<>FmVu}{YCA5ImPgLf&5wk1=^xQD;7Fn0CAvPPPgSpk;Z^cH$+z33kacnY?UsGQWyoA?_9qmsgM;4PHHNS^SQ?A zUOApif^=ygL@sAot)`nhDnx-W?7g+e(`&w`8!rNqNBn?^fjE6cAA**R4c>5sNaBu<{y+TX69 zB^qn%NBaq+BL9!NVNCqKws{G1{`D>Z!Eqbd?I|+Re$K(=^n~7)!=Cj}X2IpMf4F~t zLjV;J{0ZDWw&GJ0okAdaMC|mJKNT6`xRiuD&xP~NNZy@r4V{w}hguDog~kd7LF0d-SK!YGq;wl;8J%^!r?*j_n=FwF=$$OygXX8r z4Ou#zW*+h;NNs&|`QwF@ONcJmEIWj~WBQto_BC2z?(b9@oiy-oj?(njO1*?Uj%X*M zcy(2RQ7yvpb_#bT_#7g}!eP$f(R5zsyAQ$x`{mW(M;WQrPZcNA;y21>3n?E zj12eaTeHi#$U)EB@g6{e>NzM`1X))*Y2-u0+u+2$d-VKi4j3X=33zC*-I6j#9aM{3 z(K2k!zziiA>rIM}yANIOY#z$7@F+k4S{%gPeh0Hy)EN!%-3~&HcJy%^n!ZU`! z3^bwJ8}F1XRJmELlXHTUb1_VxC$h;Nt9Kov+}-te=hghxZeg`&PlWrnVc9u_xP+* z7yl++j{b5t0U?NaF@ayJZ(Z1^3{QEZljTJ+3o~(7$F3+LOGaqBJN$Ra`u%?N%N=gK zdHleGnQNRw2Th)t-My_AgQ#0uI#yJk)H(mjs?_Q8bBceWpSPiKVMlV=Q!rJZd6nPF zsL)643tB(hXU%^DI4lPf?E5N0(G^HeAmw2sPN$B(sE^{zV9Snl5vl}M4|Z2AXS@R= z#(n$88b%a-r%Q^6s+bcM*3;y?jFa>_mqrl}H!(s0Ip$KetFLh4w!aeW)p77FwAI;U z*>T3g0DgbHAkgE*tk{zY09esLsji@*w6o&om5)NDzixiwE$kw&Bib)VuyiX@^_*2I z%qvX{Rlf0|gg$vllhA^w?w{sg6Q;jeBS7R)4_sK&#Au=b<+`bomicxavs{(Ywj;cL zq6x_`Y)e=uSB9T6@ce*BZ#-w#uod>{J#dr#0M37D`S;c|U+9#Z|T_mkAF85~yw_uEdk41;%U~RFarxGO=o00jk=L=cni_9Ijp8D2dwI z8d-BHpdGN?9}NEvJAbipdM`*kSQ65rjx-PN5ZDC0ytzkS;c4hD)%2nws^{INDhFl6 zbM=3qFwe-UhP6hx>I5~}M7iy?;)GUEIX;1<<tUCsE%z!vYj-tlpuEp(^Ftszn9 z88epc_wgB%F#T{Pyjz(fyrAoVk%@iMDQ|zLl7YIHDI3faasEMl!X{q_OxDZZ1T&R0 z94Hi^^e)Lz-s(`f-xX;!aVZtiDR(Wq1$v{4f;L85IQbBDz2fLmKezj;p1RPwPFiVWH}o%q37!Hu$^)^9yat2I&#Yr`-#O-rbs&20%}Jm=r-)0Q+ggPz>i@Lo@#Kyn zI2q%3054H0AzJnNV0Pg!qQASw4%K~rSH!JHAx1egL6B{@GgPz)*mFZHbXdSh!5BM9 zp+KV_)s*=ZUlGgSx2AHFn*7>z4Sf~rQMdf7JbikZ4%I| z25D}^@q9`=uMZ<|id4ML&Rlj9uB@u52{WLgbGB)$bcs=u-3|gP?^TW}BDy?wR&lw6 zycWp2o;%FQ`Gf;hKQb`4(39(~tD_%U*Aq5F{7=6XWYPRfoqkMlf0A7mk zt6P9YlaN&(sW3Vic%fO9Zl z;;~+G5h2m&de#~DTVHLsL)(9YzHvXAYDZOrctxuniqx$X!q{1XQ6tlVd)}N1W+&#S z7xzPTTMRC*KRQF#n=Z>s+u8ON zD&zHSa?FXssq?(^RpxGF(`)Z z9t&le34iNZZV(9Kwb6eeKoEGYnsP1DBlQAB97RN(3YGAWKQGdO723!b&>Lu`sR{r( zR2~>(Fg53WvtCClBz_zqs$7X*b-8;K%`d&_w0}Ybw@^n^1w8&~@#-bVlr7+*)56FQ zz2&9Ng!~*k5q`gQ&BDWx{dR!0_MV8FXB4UL6YqRKO&C>D>V1C<5=nM~j+R~4@3Iqm zMS&Vr;o#?X}|GEubb4h_{Gp`C{`dVdm5qt95zu-fc2R8?47Cr~LI_&BP-)o377- zZpY)U0$6x!V!D5dqMA-C>XV^erW=dIWkw1dqj?~(+meD4ZvboVxtbZ@nsssccvRf@ zbt>C8%Oi|W-i!Mqa>bXb1`#TD0x}F{cJ^kj4l%y97wQE_Is$pe7+fkCy8M`etTKAu zgOWSxtwAUPmZ64%nnveB83PtGwSG|_BKdB>3YaYJp<;hct{{CIE9DpnNbSpMh~pTl zhf-gw(aA8V-v|~KtAO1Vy-b}LsJ*S@miAa`?uB6%695L>4Lwq#n}PPsPS$$JiR(zR z13lbSXpZ>fl^3R5w02w1Z0jIif7HNodBSvOK*LbC2P!iLaw_OkyfG2-lp(%!ew!_g z(VjHo1M7eI;+%HFiknCnDBQ96yN*W}iV;Iv*U2TG6AS?80MB8MbJUGcByox>2tu>s zt20QVleA>CIS5{yrkr%|uq2+PbNaWq+Nai|%BC~z1VS`EHk^&?hMu*!8;Dy4EAukI z=;#&OZG^x29h)GUnI%ZA5QU~RFY_l75x92GH0OW)kMJp_#g@GN%XoEm-bz&2&%X9R z5tI6FAcS{T0fkWK?UU2YM6l5*h0m8i7A?pQ|1Nf%X>`#eay>N)~W zrFp0oly8$0j=r8F31@UY4-5u?KXxbQ)|o`ZILBJ_Xq?^4WhZ z<{dwCW|Vgl**_OyEQ@!*Pvw~t64$YSdnFVg@xQvDqNzuqn=d2j+ryux3Q-Pke`xBg zyNN;`ynXFqCZ}HA3s|@ARDIkJ*&;jyt8Cz0II-`N$H$b`Cg@tZK(4T8z8Q!ZZ9Kda z2BZSdZv4lPw9hu`z*>2gtFkFX0QrLW5dPvdm2Sj_<%_-#(&Jlr+q|Rj2M5s|YqV|JQBmjT-ah(3SK)j(wa2I(py=~N6ggNQyvdlDSv^{*N?n`Hzo>yfpCu%yIq&wgms2I_xuQawZYuM+l; z6l)fc)~8yvDXk>c6FMtD#BQT&OqsD$kSS;PATnbdiD!-g*C(2$$Ki18+UuWrB&z_5 z{p-|?#uTLG>jXjBI>K67o!9?+{tlFKujLhpN0h`|5gb`Oj;pi=U9&L(?J@j zgn)t3eDfnoEW#Gfz_Nd#dzuOz@pasK3^yK;(QPG&c+ggjZ6&((@sL%fujb<%v%DNg z9VySeJhoqnndxBbw(oy#IOhu0aDr8s6p3uR{DFIGFRcSiRLntTzFta~$lx3vG~eV| zzDJc=I8HTXz|`?&iUU9L8k^1zQqJYQIOB*v;Dj-t0-R6X6u5sze8G+A`7=(2ZyUDn zk^EwVB+8~GkEX{1`9_Xh;$RCtxB?ST!#sC81c*7^rFPft7l_ra5oQD{-6_+DsV%4N znwywx40+z=)NL2K)HNZpl+?FyN&MYBpP}BDCbz(y=ni`a*zwAqvzG3%7-1`3kA%KG z`hC{&8kY&w7ps4Q^>=u1Z1vq5=nEOyH#!6gf|Tgj<6|}R_YF9gt?Ls`vah^-uq**( z%nnCbxt^>6ASoHC9n&d>1kBRn;HFVsX(n6nWiY%qWNZ8in46jSXa2r5ZwWQ?Rt zEeGZwB0OQ-4nY4Qi5$(y!$|9+_XY49?a4Lq90?#&2W+C~bav#>Ho5~ei;U6Ct2#$$ zchYxAiGb*kqoWMw#}m=vFk|#MD7GaldN_7@WjS!3TgIP476kebg-||Wpg3T~vL!yU zxxT3rLRNoMo}pa&?Q-B4wH@qTunY%Q%y=wcBJw1f4d`!OmXrVhjxOQWP-fJ^TC|^w znh!aKrc4Mk5rMZf)NfSg zw&qBC;&zeO8xkGikXTh%8PVsiQbJzh7d*7>T0(!HZU8EEu&+LtWMwg-2BU4_8EwA? zN5=2Cvtj}GDcZLw<&DqV4R-K3I5Si3H5o0v3hQU(#h=;dt_2ft)Au7%{dd6w^<9kj zCpL5xUVfB>`U02gG>Dk3b+TVDfP-n+;!Lpj;+eEVZgeYoamM@;NoMUWP^B;xCTs_FcY5IGhDXf3BuirBW zQtpu52Y88MOa6blfyQJIhi5{~ z$Ktr4shCQBeOSP48jp)cI{cqQ9Y+mFT?v1(!NhQ7KP>pm2yonrJ~}naL(8@4VsZ-_ zn~wbB2E#LdMCF2+4dt8Km|9Q_OSd6t*RN8-# zdNFvZunc9#QhmXST55ans7UH6ABw&zKv3?w64vI>qnQh7M8Kxt_2<+)!`@zKj zDePE3KOy@g1tvx#{QmMuG{f9FCmDZtM{7(FnkAt9kGU;?nWNDZC2!?tx^`wE;3N5D zx#zw$*++5|m6)SU{A1?7xrANceFLq9n0S_%iw1WFD=zt$Ps2Z6RHmG-j=L3c$De_f zi9Pnk`L+jHS{-dw;bkea&~B||VUZDJcS~en$OS!nT|qA}NEhU|99GlVF;;&uYot8O zlnharvP~8xY`%h^ciJ^7BtCfn~0$5v|fxCb60`endI+*bE zJ>4Fb2GlB;<`<&0s*Kzy;}?IqDu4#VjT?$jq7Vb5mh;-;&Ylp>&?l#YPHGl#K5;B2 zXoum68(z-Yv|0nm!3a#n0!$M{y~iB7A| z(Me8htvYeH;`sMs#r}~WWCdYn_;o(Dz}7xRFU19GT4Q#TOa{E~l4ot5VVuxK8}d?)ksRQ;DXV{v?t%{0+^LHU%z%H?IHl1o|o2j8k^w;WZoyD;&x}*cu`x8nFpSaw*X!=PfT}43<1Rtq5^>#b05G ztbqoxNd)D>!Qo~$lD5Ot*KD5e4L&8Y(k-1G^P!w~vmC&F;M-2rGbx0+Xlj^-I{#rl6`H@B zkbPLpt?3?>)*OvMPefP>ZdDj-2n0I^D=J}|pVelxGH`W7rh2D;-D9C3!YhMkOV`iN z4l!5SrcX@7E-L25L}}h$U-(sq#kOf*b0Zwq5C6%9!H1LZlj_&wl^|U-#6$io(ekH- z8GKsm^Ht6HzzM|7U3A6TGOYnR#^bZa2{${;B2#@#>K`CMVvy`0Gx zN+>lB^zdzsEs5}d*i4D-PBzzzh46&5n>3ZJP8cL6M{GWe^(15vPubagyY7M_TDUJ! zv6kFq3~iiY*)v|WHyq_a z2AQ8>?xJq}KI4ud=Di6a!K(iG^pAC_|7kzI*Q(;}Tq$pNB2SbL$aQ`|_2s{*P~U_A z@gKs=a!o@?kEke79Xeb#ne;cj&zrHQ7_3BU7^~4R+`v=*6dD<)3|AycQP6PPev3b?yPeugJOq@^DyhuZs z{9D|lgFiTF&>m9$9d^#t!KGF#3-bw|i>&Z}spYMn=Od)38J(Di+h$islOq!3dSSVl@aRP4>;Q23h#w&=ffKi zJO(`oEgI57ng`HIAxBe+aD(!3|%`FQVGA{0fATkt+HW=(F<=xd3*C)y8x zw&98EFfBP%i>2&rMe6_lLo|1H{Qqg%^qzPxbF9@&v8t8FJm_rkXvR^KdRD= zMp3=;FcL6$kV6OdA{gSq&0O<$#R;^hb z5w)DlFj^?S6*hDz9&}1*LL9}>+dY8UV~te6#4wtE($cc-@6 z%28BD&N2X7Q0l40XjG$dsBBd7eOZ6(K_tp4SlZFDoj%II`K45|+nUO@P>+AkSxpy? zX@6@jai5j6ra)+WWA%!?eMyfik6DedS{!=VD`!P(0ov={N*97N?A&3zTf)hIJu{5? z!O0G}W%*FX%U(pgTU_J0@bza4w}}`;p%rtt{kYY(X%c(b2>L~rU*s=FMH1bL7N3Up zW;rVhIv{zI=$2N0)1DOO{5v+bwLT0OCmyuq5@vduDr-P~%2($=yl&!eaS@>~qKZIB z&9Q;8DFv4N=t;y!P8T(} z1%#zUaGt>HJ~3XzMfW@&9oFI<{p}Jo^&I2QW;8(sBU8_y$27gAK0__S5seq6`ziVY zku_dQ>VVN+&=r)EED3(d&mfq1xAxA4r*a{eE7zX@M1N<)eG>H0x?O&MEzIv{-w8cH z_X4)bRK(2~E|o?tr>`w=O5{dP$D%6OJ(J^vjx92h-q20VrC3y$eWM&TSCfEnQi9!I2Sc07y)QHnDLTz9-F^u zzS3kexW`~Glp(D%nW6rFsTT$%Ip!>mX%hQgF9n#sXCK0gNLGcB>W#{5Zm(-ok;)0b;a3 zN*Qvbka2Vifp1TL9qs2_gPhb)w@-&Awjlfk291f6clL2)=RF8ECLRRAdEhNsbJ5b` zi6W7|kI&6T{doJhwVfO4@rrulx@u0kb5f(_O*KU(8-2&7`fH>+3esKp*ykN&j3FJ- zN24`86dC%~;bU%fm`PBnoM`#kuCL0AUi=?foI(WD3%{{{uP{*pmj!4V=@0B@>pzwA z*9s)Aacvh_nOz`GiJds_q>eD31BhNJZUkY~APWctBGmlnTZ6+oZvMzktU6BO;QiL8 zkZ_WGVji82mxdUr>(mb*Znr9?V|;o7{tNDqYSTW2aiSEI=lv!yXs6=(bP4(#UI4Wm zZL|Hd;E|<&6a?i)5h~Cy0XCqACsu;5mP!45=b{&Ve~8d&U?OQM&>E-_k_>>e6eEq- z-AM(3|E*keE3>M<13vrIVV1r%llis^SzDZx4|&nvLO9xQ12x`RoBiTR6f4XFXCV9q zzZx7sJ-*^0(@-xizB_;{lc*_HDZZL^CjyC0{sX3eG#RF*O(ZO;gYynB!3cX*K&RB7 zNfRFJC@cr8chqFr)rDS$aG2Xko02d~G3_gyu=Cs@G-aFG{x{~xGY~Yas$d1;b|sE@ zn}#S-En)p-y;XEuM8$-abFUvWWE9KQb6A|bbKVfj%`(!6*)MxgTC198O=TDxY> z%jZ{rE9`j#rJe!Y>+&8fcn?T|J>WuSq8TRN!m#kaZ~%gQmS7K|$hM*wp?r?C<<92vK|!ihvqlby$uJ8QipmL;OfS4j(h`gyoX$ z>(CgRyk0xWiVfA*NiIup>UwXyuCQ5h!q_l>8ankVb7#VGy`W|Apo_q7Eh`qnukEsf z=!R-hS-_;DU;2~{tY5J{XZXGfh_1ErjS%~cg@ykcLCkHI*;AJXa_&`pe=LAoxh^=# zcP0?2WC=M`FvPjjH|sS4a2EoV*c2{u?{=tzw5nB$$8TIriq6+Zs>}v?eGKX=8rr;n zs%$2&dlMUE_WZMPFaMR*>R>)?i5>S+%^yP&wu@4%R+4`)ZgF2M1DGx@Lk(2Isd$H( z3UgJQHUq`S6^R$_($ibr>nqRwAoNTA>6RiBh%c}P3@=fVb6n{nT%&`gqc>dS39JE{ zehZmG6DEr#&}B%G1kQqjNozq0xH&w3r*FNsj=FR zEH%tn`KRlo24K(-gSc=HqI9AghNE^ZzN{KXXXoGK&b(d-YgD2OQTxwYTLxf%8GAKb zf0XS5s~TdT5~n3^Ci?22;@Qbph!>ba98r}QfKFchxIa1?(It}%baMPr4DtUd>DYg#Kk#^Y4z=L)La2` zPom3j`M1C*B*wO>4B#WmjSay75PBhv1w`=2q8Vb01i)Q}V<1Pd>$Ir&N~@}E1E-TS z9!jo&WkdjB*o^4X){4EGe^xgsOivBu_Fl|O8FYuJII^YLB~4Ti4(O_XbFO|Za6WFR znsaa|NJ0nHnl06_Y&vR5K@SOTSv=625v550$gnmh8$2+sg}H9Lc{Q?eB@ZMv}LTYKsIDjs9mfi7D^1U`HH4m2Guh?Cs=~m zg9w!8K{$i^18(u%J@+Ml<>rv=*D(tE2pjNQdHvbIs9v8=(Z=>~J_MHue%jEe+io`> z<^7FA{)hD`s=~95*3cS+GL~IH?t#}21etDqShmh0GC-%V5xFbheI1_{#E&mNBLv!Q z*?% z^2vQmjC0oDi{thD;{#$cs6ASc(trger~|*F$qY)cUsW z1Cw*YSS#zIhcE>7XCI_&NQ@>8>H_iBv#`;5Vh&1AHt;{q6s@6okPWtUM!JYDs!?4D zpx0ol6{lHmrD-%5g$t+RcP4pY5i2O*4snNMu?c=B6iNSos#H-q*a`A*qHZsec5;ld zOTSGK5~KI=SI55%Yxlsp1Y2&rYqrCi5YgL=j6chREciEgW7LrZxS2?5m)_8>rF_-q z2ft9pXWNiL(u|CvSa*1*z43nM{o529tU3DN{39ANZv3$$zKiM^Nt9pEEK-~{)g#u0 zaV=j}(uF5~av#Zw_QO}DUl`zc9~;X!ET$pCa>%Hh<2l-EB`(TDLeGerMEOGWhms*E#i zem-s6_4x8HvPeRJ7=xG&>kA}eP@%jzwx@%C*2lE@7Yqt! z`Y}OD+%eGk&ZJRuledJ24r?md1UcMpGfVw=3sh$Ne0F%$ zX7Z24b-ao&8kLf^;KL(6gc6$Pb5Tm^RCw*}BxPQndW zI`vY|52u583!M5zB*>i(?e;n*z8M2BKhpcPXb5=EkC1Q$*~$K6V5lrRs+94ey9Qa+ z-0#daz*lD+`N~&-_~NINz}0fym(|;;J@w=rN>({R$^t;L*69btkXy$b*rA&Loo2&- zY)!veojJCTK^XSe zaZbg6&!jqH)`#2szT_RFk|_Z-P0P1`&it&9lI?P#9WdeAkP9Zlp&>Me;C&NQ-tIm5 z;iuWW&xjZtyx?D0bERI(a%Z{reW)Hi(9>-abt=VHsz%U=H`yWc%I7GoSS=9QnFy$(pZ8w8Sif?TH@~ zmJ)2O$msTL(||`th{j^#1)C6mEM0a@>tCXCJlh^7O(9tPhDx@SM&gk6%%Cg}Rv>L> z)Z(kGLka*2&IQpKj|$o^Hdt_Wc>>!*j`l5ZxkD*;bg<7~nMOr?s-OypkvTTXFGR0S znGm$`q+Eynz;#GF0Vy}n{{)uAa)5E(YD0?S2>BW~@CwjK(l{x@_6Y5N(jHof(DZgx=K7*Uqg2JQO zhyn}$M2~UrEvkvOVLyKAg;^4*(G}NsKFlqUgtOW!0(QKZpsbxJ_T}#A87vu8L}hkl z6$xk7V0te3&)5tWP}zom9-#T>VO?QNF3XC}mA9kzG$GsphD~(?eYx@@{Y5~cHPki{ zNxw(M^gQ~;Ls$nm3!g8D+zeMFY9H)=O5Ad_jO}zuN47Q3rcPvp+bQ3880iWG1oo;d zQz?39LaZ9Z)^5#NJd9i}QAX&MS}o~rfNlkz|Fq&(+U7h03{dQUPg4ON!Oe9G`@QFS zSN*V@vdq8jyui6<99bvS;Y$E3gg(aKV)CTVcVZ15(tff+F6}gZXbK5_dB_+tk%QFD z9xyKF<0&BJsK39UjuHW+)@9TVEXJkLlsxcXRho5Ul#vL{WuoP@dq|dnYj_J;=LS#N z?da*JAc%9V7EH~5E519C3*|^UI9{ssBGE|U!WEE}2hTH4>J5|I0c$LBU z)G)kj#UaG>@lC!0I~p#2KE%E>dGbo~t?x%w@XL)P5A-XR{?OZ^j@U2pcnqq#bjcZGDsuf5h{0$9wKfu^ zq-PzfbDD&hBmL+#+9(h|j$o9rn@ClA=X`+>>z?O-!N0a46!!6$3B8y$cg!ed<=pMX zZU7*#pe1(wf^=?*of2U?B&H7t`Nl6hj*gYy$7?ytMsg9lI+pWTJ%A;ksZJ5J^MZFc z!s^(Rnnz|9J(-bhDX-N)-jJ~8f{);V?AoNxTKCK?21SbG89*L4A64qKeML9fO&X;^ z6^4v|M0+%VzXE5l`T`BcvlU+i1NVW+h~8a&i6K|mc_T#_D#{gh9^%x9U@qwS`L?n} zzQHf*S8|Hs5xPe&uBRRpFrmS@zOIr35hG%KTERw!>GSiLFjgyPv3ANooXT`N~B*+KgrU6x#2a*d3B?%a*qt^)myS8CD5-jvbG;0 z_{uydkT<(J9JVtWH2RT{^Uv8F;bHjHLNejn_AzK=vT#K$u3Y@d^Kd(c07yk1i`P`koG%}QN-y-fzrS!T=UJ^nPu47d zgmM`L_(Y==+5UX@s+Jb5rDDlFCS3s>1W~BE8t~6y-+TsI1y%8}$SNBn9{_S^Z>Ee+ zX(@AL!TdXN#W?+zyV~z$-&fdz8|j6Vyu3gnMC|MTI_=ubcOZxbim2L0M~BMhPR z0oDnNtcQnWLWcwh4oJ2)sFs-#<=R9$({^JtJq0@KX{zf z=#v-gBvhx%sjgyheAL20!2FOdt~jHHhdq&RJ!8bv(f~P0G)=VY7ZOaYRbYbW}hg#uBVCptiHat`=c*O)Ua=I+9(nMy_opijsGBi#$) zJVX5m1R7Io&s~wd=LqV31%Cex-}7<%jpt^%^g1P`QD40#afM?!A1|nqk=A}Txhe39 zs#JDe7F%tSos*j(+yIq--+G;Ltg6aR&)wwNxLgx&A#jswIP;)I6^4$F>wSj0)}Gk z43e($+_ME1|EJ=A>H9`-v8+y{2rk^pVU*WDAOhCr(gYE2>)2KLm<<`CSd>1X4MMm; z5r>zbdEjLkcy%%^R|D8EQmRbaR5jM4%_uU1=kw<`g5PJ?NP*Q$t`z4WR~WOxhG)uh z-K~WyJA979NQE|Gln48uN#WD8$iEy|-q?nmN>*hv8Cc zuZ2__^2KKl&t5&hxXELe;W(K^ruu#~o^?FrNMLxeDUh+o_JD*gW7q|yMQA=M3i4rh z-x%Ac47iPd9<*zlz#Yj0Av00Ylr|=F4eW+Eo92P#qU4dmY~DBlXm#a3KNe_E(tc=^ z7lH9$9A|;PDp#Ez13d?Vb01dcn8f$D@xu+W7Nu$tBwF9TZn(bcb(h9wc?Nh<8yZe0I>eQObAwk*b z2ac?5IO%@(0Tm_OuNK!8pivZS4$f~bm9R&Dk;adnXOmi$*piJnvrioK>HqOmMauf6 z!G%+Hu-PBL7-d94a!!varx!w!2J>hx=}~PUFGhLH4`gwi@I1meNIJu6BAx0++{8Vz zHeT-;ZpadVs90hqkv4k77Cw8%)()h=M(`3@YkrrR`Ri2#%14^wmiN;9%Bq@SR1X4w zU7*K>c;wj-`e77U62ReZy*J(za$J8Y_hoDk4BWOv>P6rSgvVuiZljRZkeI>$+VW*= z;wi~)k!;8J!+36^-x&%cn-GeGUN+%w04*BMNI%vu&(qcHoI5Hb7BOi=QDOgBC895G z?+CogOB%()ZZ88~8K}6l26qgT@mW)UL50nFD+n2=MNhYQ4ffKw@)GjFRu+`_@#F)} z{q9&uhO>orpp*v#e#N4%id~3!E>T4Po`iZX`X@E|A;Xs8M5c5im&k|Xc4XY@-B2mp zFAHv!vO7=C(A^XE+s|)Z9x)6J2(oe#X%G3FYM83x^Ow5C_Xqnp02Zs)br55J;!w)p zW{MLE*dd}hv8Rrnq&B)WWuL>R7)o*2+W#Y%ytY5$Y7&LFhKW=)<&96XlHzdgbzggl z@o}@YhlXm@mjlu)MBXi8Lph*F;6RLXX&__Zajm}(bc;9FR?Po>Rx+ToKqh)|&Z`6; zG@MnE2mM;d7D&1vyTLPRRlv}H$7_CAEn*5wO#JXKuSG>*;q-vUnNGf5&G1ecoNOkU zRxyFxH%JKhE;(Wjhc$PK-?Lu}B$NUk7PX!Hg*Boejpmzc1u1Ob{l|8M+Lfa1AhOO1 z(t)h-Ht%|AJ}J-R*AvN*!{4sqi2}?bm>Az*klvCmde9qgE#nZy$7tk##HCeJSAZ<& zM7f&TV_Hx-d-H+NlI?1`OwBdBOWr5Sc9y0$htXrz(JjZ?^xKDy5(}Po?+$r;NIZK} z$|)`(ZNbW|>p^j_sT|-VkJ6iFIHwq-lFly=qVBBirxvh83nHt9vp`}vA6pZwD~+sx z$D!1`khMY3BO!2RKH0*5DiUzzEV12lFs+BkDMH3l_+MJ`k(9nvmJyF8zgVLCltzuW z6bMBm8(S55hPQjM6ZFdJ-#jGH&?w{FH^ea?A4C4@3f59`zC`dD?oW^)I8n~OQK8I1 z22gAgMM>>7b14F`1lZQ6ee8StA!=I93M7p&u*S$A;)Tsk>B%5}qzO!M)LV<&8jecC z|5bf4J}7q?j-I3{ihQEU$|7I>a7Qcn;0ufs>jd9;)WIL=3}~MXrt=NVg30bF1Dd8U z+Zb?^?Zk!AHJW>m0a8D-Bl>Zp*rd*B&0}enl=JJIhpwa$;yYw%y;)xi3@@`7Jz@=WYv7!yj2{A&cSkeh7q<47i zt7}vX{!LNI_uLo&XlM5{A~0<QD5MtrOQ^$#zaci_(C^X=x~(#-&btvGUBl8E7zd#MKn;tr&}GLVakUtLr$(s41#8<_CL7}jz>0T(RIfLdWYO^codGKLP$&#eu_>8hzt5} z8*`4}ST0oB26Llyh>{twKpD4CBv8AMwF95?8DU5O;(VXMd9m&A z0^~AsWM!v2MFq<)DC44h=}4!|;KuK^`^HPt!P7ol1nIyqbE71&|*HfLhB`0;`2 zOn)L;J#_qRyif7EiV;{J&p{E>^V@iqIU8xh|N!3Di0T3lnhq3nv6yYH0i&GYUi@}kFVzD9{0`?dy26xpsL)Y>4vd2lGfmtr>n#TGMpadT4U z)N%}Ai?nwoWxax>-%b&j43+06GN40<==RJ^!2FT_+6e~G=%+*nGGNDA%n!y-;V;YHn+Y55w zKXXgBc1t`$mFgAf?|4jSasOi)(1tLRGkbVND+(^MhRV6kUYE1gY=&3rN4VA`wZ}-> z$nctUVvMgw6N zD=R0M{l@+RIjjmQPBq$7@87`uGoY=UbIrOFg{!tH@=EL9>5Br%og7OE-eQ}$YFf3z z^JOP&Z_hLeZO`mi_NTmCVrtdG4mgm z*3tyedCB#{zdF>FP!eu^MM8I8Eb=~@$BFVp4jd#-+9}wSqD9Cu=;}Am4wKpCN0-G0z4;=9Pot4Wfx#f%DnA@ z#L*XXFyEsT0+smKhbpUU;8-wgB_^`Do)t~&s1|PvD?hqdOfWZd`_iGDXt_5i?pwz} z?M~RZ+au0Jz=hR+XCEkNMbdQ?Ov{xhG0;q;T_FaXKh`Iy070h#V$ zxcXrtkMC+ahiJwHTgEbCULMSAlF{Iak#}zocccEom$D#re{58Z3k1>+(EMX7Y4R39N|>JV2tjB25x^#8!({YMn_2q~fwS8a z^q4I)JD=izYkL#-cgU={NCa5@U?U0QfkP6v?uos5c){gi^b zQ^2YQ?ja2}hfDA)PweE}O%?`qW@QC`V)AmQAmb`c^6O19<{PfdUml7`3aFZWQ0M2l2(^ zvbBAM$Q;8ycoCwkZuEqa+fqwnZ)`dorv?`_`@*%6hz0pzL@*nyfGW>Ad>F{64EyG( zf6EsY@!YZSlB)7w2?pF+S671y`rFUN#11b?^sdPAY{RRX{AF!T+!~a1CTVkOrh($58ybG(h_> zW3P#|y%rCHEOYlIq5jkVUYOE{g_0EH-SMG+qk7z`;hRwz6xr}l&at><2Y%jNfTjY~ ziaho&^MCGwL9oujEhBOR4t2yQ_}%*F?E%o?WP0f=swNcr^#EtPug@z#b02l)l?X2U z&N?cqDk5GWIVtDl>Y~v8e>{)diNmRBYDy9kQGfD)D+c9OmE^SXZ)=w&^FN<&R_=d) zVE$uC1&77VG073dZ=m$I^iM8jXDFOP@j<6zkE&30M*Gai)Ajwmm9H{>{-5Q}`xT0( zGR7l@WMERJUH05;&MUB5atmqRc9Ra%zqd9ca~ZnBreHVzWz+z=wp@}4;CD?)i}1J~ za&mC9|-HVk)e9gC~ zCkq$+(Rw0vMV$K*=h=eC<&zD6-fb@4FcT^f3lfUM2amN4ZT! ztBrUjuz6i&;IYYMQeJ%vEvpjd1SBW#xM?ed6`uuy704Jf1@Me9)I!aF>ZZI0ffi}B zh|I^}9PAntq1|sYHQa+Y(N2~tO25wsX0ws#Gpx!(T~4gp;7W#J!0L0FWRwxe*azDn z(Z;`|v7LbAbu4>|_`Zu2Q2{R-$qd@0Q_CF(OAVVQ5396ah-JT^LSS=43p;EZR;PRS z4vLH>+u`|kA2B8zLYT6DdtF%$hx_g-%VW z>h)lJxXAeB)^(GVYY?kJc#-^96@b}zZ0Cc$uhTxIFLj54YqY3;kgHhf2d2yPqhPsd z;CFIZ=tT~qegnUFvFo%k2V1`IEH{K%w8YHnbK(tA7e5@wnO5jf{C3)~i`z&3ft6q} zsqz=78@n^S)eX4MaOY~tybI7h)3-YM=m2f<#DEMwvQZxq_T&*Bu@BXK?k#Ztz7>tA zrwjFBmfFU9cgN(c0S}Qts@)*#AGg7rWz)V{wDEZl82jOlfR)iFCk!AIyyh**d|E$< z1d+XpbTCLDcxV0wj%F-Mq#Y3pIRSB_jHUU>6P933QnHIx;qBilVD>lJzABbBO-gUuXHykn&vmC#2m0|4iM-DMI^W~MhqNMFsx~WuDV8&1ePG9sfO5_o_!%q#4Tbj zj8}u%b1Tl0jm7`cqJF!&5Y5zfyj9l0TbjA=R3xj!Z86(iS5M`OR&Y!m&(RPsaI@=w zyeN8BSNkdYayNZ_5QFf~a#Tu6`7msuc+chO>k5M9Y ziU9T=l0VAyS7Be@`k{%!?pt!3eN3o->?b&~gf3Pf88q6zZOsnkSRK)=P)vQ=IHK}c zD4B}re_r8kzdqX)a#$)nV4PQ7uf#G zw*fSqo<|5(ikb)P&i}jnP}^q$AD{yqzf`y9qmg)r?FbBkKW-T&rsPfP(mvcM;u4}pLj)V(w_a|yQ4;h| zCDNTAZYuRJE1xFL`b4@DPcU5>^Pc!5-X2wtEG+-rjb0HR5k-eJ z$^o0?jVW2aCT(gkNLg@y@Agi{X)E4?C&7?|4FUD#r%728sy}@fd?U)sTn4MAGAfSB z5v!3nf&-a^^{)%SCwZv}&5Xh)T_78v@@;7NaX{RtdadtB$iZh!^z4No9p0=xJ!X8? zsWG??2d$eOz1Y&GluK^;Rgg&)tblE}`@YhX^cY~`&Hi(3#;j<6`I}!E=|1YM%gyvW z?O+LSfG%L@k*lgyj2L}`xXMZoYXRqa%{e0GHM&e$y{)sl8E_yqWkp%Lgh&|BVSKm2KJSPwnZn@uj$JffOcTfR+e1XATN)&k>I9t? z~-RVD?0Y3tL`ZwZ5hVDI1sQnV&b zw5BH@Pk_>wynxKs_>20d$`>Xy>xxt!0{HW>mg@a*Wswp*>A%gX1A~og)D#fSjF#kn z5;MI%MG-g|zPBrKfjM3szT>n2ygwmCG*|xTPL1%-%8B4Z$HuhnC`&}FJ&AeqAmSb z{iG7dciyE(T4C9V8>nHa+>=5b{)uenIQa;@-Hr6hRSsat&lwXu&K{Oo1oz-BlX%9j z_Nn!m1qI%8Bk%$W>0{(DgH#vHZ2Tf}BrsdmV~6N}-vCx~n`YSEG-17_7$TsiLF_v#GTNZS)q(Gf(e<1z8x~po)Qq)$rO#uas@u;z zZFm=dw}R>`C<2h``lS@&XLS`EH8KP4RJo*g#{zJ*ku;OR-8NfIXLhS9B!NgdTXF&s zuu$}_Be8#je@b{;%~GGSq|=B`Pg3>;n{5F=Z~owG4UMyI6^j0dzX;Hx-Lo|eaHro~ z7G@!oz6MFle}Wx!gydn=QH_`tghu1^tBOc}g!yQai1GajDOfofvkemkLDvEYLwvW` zGZX-Bin_sf2eT=Xr)$hq;5`iZhWA7>n^3&N_O`p6;az&uabaAQn(wVGvp@>LJHh$J(xv)OyLx>Hm`kqs7D(Y0-r))lPuirK5W`%#ahWSAgDnSwIj(RXo(94hHfMXIRB|hRi z$OcclJyCrgTI^b44;QQA&BGB~kl!JH%SW?6ZXM>XL%+;KIk_1EQ7FSc)=J1mm%?>g z6N^mmY3u%_uCuv(nnUhCn<76~*NBSz5a`+<@%JHz2RPTa8U3t}g}JY7R_omk31s6z z*SQ=KWs|(Yuxq3}O6^c`=&EL|i>!6dVxjEGRfd@4o^tvi)@3QS%eyJj-4khljVMp{ zewk=b^^*f$BOM{Bd+G*TGxm3fcGH ztuGs;POV>=({&Pvxtj$tX^Mx=u_ z67>_wD-6&Kw{N5AZdATlk}DN||Br`MUl<(%l;|}wUWg2A+Q}uaUDY@o{2w)}pa_GE zIAHm4_VY5PPvVPhZ`v9Tv|u-OHyl@(OXbu}b!hSz<2;PQ1HTI|1v^Is?EelEBbTZh zD7RM0{y{dn?i@i0!Ae(ENJUSyQ}>yNBn||4n@aX@5HWR163kCZnQg0on4L#o-Rxvk zvHQ^)Y0?-u#NxO&Mn(dz?!kEAiyj22Vr>rvI89F^VY_z;hiM(E{)Pz(OU+hm&W-WWj(i^jc5_*Jk>=3-`p}S*$E-CPUN&o@bM&!Ha1ws&DoU zrN;;-ZHZt6@t=e>4}S+dZwu zqWUSxxy1R=gf_~FmF7GbD|rR|IEj1t*oUlf_gDAB=_p#Bh+^lno6JS?H^i@Zj^e0S zlwkfV=6=&<(}U%&ZDM|OW;z>P3Wca$20y+9a?87(T2<9QRtJ86rjPHb2V&&USq3lG zq6!O0L6G{Y#KduWNzdm0Jm3qtWQ`k#p%^3f$$@uL&kcFgnh@LN{%B^HW}64|w>7-L zxt%Oa5A;t${sGHk@LQT*p+O9fU$#M_Fq;cGKc#we=C zSH4_rxHurs^xV$v9L*~5ax>?EJ$01~19L<5JR|ed!MuxJ`-U3JVWE`Zy`RJounWVk zgTKJ}I2=2==dt6dKOh&%S4lEaFLinlv!NIn=p^Bc<;Gfn&5mQqR7*kJj4jLE3yrYD zXYB0M)f->M!N_HOLehnUI6_=<;$laaG7O)b*%Wddo5=Y{cRY8gvDl^oLHMCBcIt;n zI>)5jE-Z4`{CHF66(1l6g_pt8d6t)}(gnhSEfHHPYR(xN=3~Du|I~%8hb;rmy0{ku zc_jw8iI>TLx>23y|AQZ7J?P+|KT}_cU)$Wr2X4POzj#nl0g zn5>N*qhmS?bUODFLXSkdU^1AB=*0?23l!P!cw~pI=(>m#?AYoQ@T8td7XzjuLB<8dBM)*L1x5_>$BxQ*(%Q>URB-pFgMuJA{N$A z?SI?Z`o#}A5nEg4_=jLqXj@r9NIxCuWL7GMb-Wj}vb~N(_uPxw$jR?OZgCyNJmPsK z?K*#4Xwbxoeif_-!rNY{sH>;E?uU#9slljp9Mh=0 z0dvodFJ%C`T4ME3H%`?a)fLpnk@XN#@;JeB7bOJthO1Bi0t{g(HxObB5SGSTD_Ibz zpUkU-ZLbTy?Rk0Wd#5e=ASA|3a;wD0xPs>yn3dy$4NlV-F(h$sAXFn>f!?OL;Wa6L z#i;eX(d()xw3$%L6$PFV(P0U%O`cb`Toay*c@VA+Kfx;v4W~@SJF4q%-ps~ z(sypUqATJx_7BuOr8UoCfgqp&tsRgrw~D|o76fhDdDQi;Dqu!JgU7S3X3HZC5E5H= zy%dOR(4~5vj(RQ1CzFd$=6^ZuQkegL3jKAv*|nzDDg*6owp!IXJhUDy>+%p0kSNeU zCZ7fs%URbQx$>VQmGXAgFj{R=q}kn9t*Uq3=8=Bq=R7cdt*~nfeV$k$asMdTZUNNA zv#OjruT$0)Iv>Z#l&=DWJeTtq^2fh+QUE(Z#J>%lwkF?r1ak4~01-t2DfXT>e@cKw zfB$M*T?uPLF2insUq}gjctA(Df0Isvg20BssdCeeYMYLL*dx1%LSw*?-`0-p zw|pWuwO&HE^16*L((U3P`wz6_;VhKz&;@T)63nx+k4_>Qe6ovbIlW@bo{UG342 zWchFmtzG?c*CQoKf5>8%s{%csCj1pPK3U9PU^dX#?(AtvT-#e#=+$kUO4WgTf2p(_GZ?Y)ZZ~b$845h=3O#d{!nfOz4g#9YzIRGBy^TyS#&G>GplBaBOAWFcYL$sl zU@*;~h=b^trhYO&M=Lfj1KuMue?7q0IO=^<>nsxW29k4f2TmPBi#yz z2&S~g>paabjS!pK{EX=?8h0Ml+e}fGZVM`mQ z8Nq)d|7Hawhx$N;9t*lsYL~s4y`Bq;OWf7Wcaua>Ld_V4{BiFEK(V_X8AeCPXv|~F zoeF(X$2V7i;I*B*S2Si)=Z&%JR;5VrLrENYI^}f1KZ?DX>H-{Eq+Z!@tC8#Dn3{jv zkv&{Tt{^^9o*YZ?0JH*Ie_02{2MUkQl*4=0tP51fGJ)tfDXfdx0kK#|+}gvNe|=hL zS8l^%tYjWK&y61yk6hn$JPH9#oC&?yrfD=4yalrOb2beE&aLs8KA;XxTQF^@6ZOmf zC;r)$+03A<{cwVdWOPFFbX^vZgy#rgaI9rx2Gh{jcabYu*;Z=De+g+%be9!G7PFVJ zuayd2!Ek~s33%TVY(Cqs>dqmj5I94_BOPN3{%pTCqQ5d^6q?+-pEZT$Pi*G$ObNW} zbIUHwx|gGoe_g)AI3>XlYZsV@anC}u*pr}>?FX*1q`^5Tq~JIYeL~l4_3($ID5#ua zwn*PxAih>(0q;jbe^)FF&<$a0*?63cg8pjW!LX*}>pE^Vll}B2H6)9z+RZjIVZ_FZZG-=CQ*N@ndb6@$RkR&D%1l6MWpnA#x0#*tDy z+?vspN~y4C?pVei0??@~fZPo<*`AT6NV2jZY?z>|T`vnvf72IaHS^h&o5eIar_&(1 z#H_`WJ3fd60au*v+E5TeS26>DY|=bQk9>k}?DkY$guY28>iLYvcof|R>tmCy#HJOF zGRNOCl8{p1Tf0`eq$k*%I%^O=M1skhwGL{b$P&fS=e(pqE z>^84!1+~K;cEtEc$q;Ii$xx|kK6tQ6na5@KQCk@PQxv$vt9;hvZ1kFV%X61K5aT66 zCq*?oixUv_AIoYIc!*}kk8VKO)hIXoMk|~Ef8u}Q9$5br$7>`I;kt8)``o}M#NU0Q;pOZz2;PTKQe+WoB(R)YOW!}r#d#tOn4EA zglQ(+Qt?6|k%y@67=wX{TUbwh;UN}o8sQXqxQWzXAbEP{1}}9gXM&kV@kMQ-ycX@GH&0UFuzb+X9;j4d@)P}B>s z2IhqJZlD`Ty1m3Nv9u{CN$qRh%9P{7ixh$Y2xrh>!c0!t_8jLj8dbb7L*)K!|BkN`4P|L_(onQk>sPB?E=3lgq*3)QNLqLv3t!Eh#2-L$LZTVe_{zR*SvnW z!iwTx%#as+2<`0%HLMt0-(7?gL{pyV z^_7~;6D5eU$6m||J8H(nf9GHp+eO9u`6Z%IV|go_2~G$RDsXL1s3iMSMTYqL+Cx?P z0;FewE$t;grIWHlNDPx)NKtxD&JB)DsN!_IN#-BX&Z-F>a&=$@ zRi(QGSBmp!3Y>*aQ=$`-!T7pX5#o1rB9Cxtg3+tC1{a$*PpB_)e~Pm@X~K*R#{&bN{jH?XlSHqBJ3y7jeE z)}pmV-|D044{46O@9yN_o9c;OcKdz5P1wVW^TYsZ+8^s{VZOqs`9@An`Cx)u`*B2Q zrr<~-oU2+b*Da}5rpYmuC=A|^W!2k-VO2NryTY>Wbntu@f50A&gHS*aFeFVY>0{c~ zt(!UJ(w(E2@67d^_&q(&MscRG^pfzh_s93HL?<0BqtMIbes$Kic7Tb0L-2q_2V8ib z|L#TNJ=A{easSV@&IJ*fqI${JCW)dg2Z(bB7dCuFQ+D9AN}eTi_iPn23y4F= zGoB{gplcMLe|#;a>~;tCNkz<=MI6Ue978~IY)JYS>lsM~B0yk%_~Mm81CU<^%y(X5RBjL$9vnY(gA1z_ zg;3@zRLEMxIo@4g77_Q@0KO2@ClPhc>`QZ}bAMxC zh!;+*=_)IEfR&YbmaGuehs>(Ll8?i#gRatE(vJV(lHT>Tq*77KUT7_S-{;1y^+Oo1 zPAFWPf9Og`H3ND?V;NvZql?{=NY41z4_J6qPBq8SNgdsHqI!K za_4Loz*`vASNN`Kq`81pB6UE1E1VjRQhEG&QVeTs62DOTveMr?lCUpY25e-2jJ=^&Col@n#q2-^P?36bl7a7%( znk5zibAZsItqvCRWn=xRwZSQ49Tu%IZ3US+WrsYC3a-<8+RyX^6Hth#H#-||e~(fx z7ODe=JCRZrb7zfz>!lWk25?p>5cT`0Q^a9oeJspNF76o#jdSvS%~nFH=+zmR3I=*l#W{}9zLrGXJ~=OYL-*X9NES~Dj*b0cwC4)KE{pR~-^X5m^L z-J&mi_Z2h!ms#pVWxH4+-1ky)7s31D(YS=2bZ?iA8tIT3myVyxEWmvX2pa8iN!vTE zu0dD02tcC3CL{q$sxX-_OefVVOh693=JTaTdpR2PjN6>gKGWs`8YmFYf4}oMA})+t zmAIuewn>lv&UF+{uVSU#_WPnBK8qAk*>G11)R{3LMqd=oNb# zB8tP5s{n^fBVE)4r|T;8Ff z=&^IBz~}zYijp>aVRnvbEySn!#)e=XU(VMo+1ft+QOMTDu}yYKp-#OgTeZYxW}>za z)u}MNp3OlW^6w2U6@1T3k4sd#zi^Q!2iS}vV_!p+tE3FM4y8>&f0*PEru^E$MCXZt zW1sBg&^m59RRugN-H`3;!3#Ul{wnAO)XKR;xxL2u4~ixaCU--9@%^_HMMu`wax-Kq zOsfSv2vce{6gue@xGmLY*o(Ua(;ngFE8rC@K77t~dNecqi70HJbTNGs^9MnuV z%?hd*PXb=;^M@Tee@(>x)_3#v_8(!IJul2 z-MHLTSa<+`7eEqYr|}VE$9+qhHky+s6@DJs&Lb#xdLAV-O0WvDBGg}A+_%YKq1)77B|)tV!Z3Jy39-CxyYEgQY5;&qcH z?0MTvBAB-g8qK~3oZgM?yh3#d8}}e_O&$>|_eCu6bpqhg*pjyF4)<>{Pvqi_>CWQ( zn8?gx2{GRF$G%X);5DbKE+GP~_;pLtIl}+S$Afs%e=7vqTzO97mwc2pX{V0Zb(SET z!1zJZ`Wdg~5KU`9*gZxGyDVizam#Ji$}J_DEaQn}x+m8su3RhmEkRuI#%FCmp+CV| zgoK(HLmuOq(X~$t? zRH|J9e`QUdx)RM)c>_xF2KH5<%;v-1q?f?px0ARP`I0EYVg5#(uaam$T*~W%+Q^=A zeflk{*V%kN$a@6^C`D-%Mc)ds1=*`z*EI52R_{EDAF{T)=3r3eR)?>#*Ag&p(QZ%LMy z`HH$Y+*_qGte05F%&_>EcA|L?JLrcg(1f`q{Ws;N6_=oHdIwZ80aXYY?hvy z(=>rkJ1aK;Uf!SHPZBTA9S1`e(`bQ7f0*fJ1$t87nXWxTbTiNq1%z~jnr;Q(Q zsYgjtaGRC~koB;NwtW}+8qK>3e}j=%v|0S6?B_SCFruT&B|4WS#ZQ7+To4;5ly#w7 zDlT{Wrg%`HQbGO%1t*@YMVfxTU7IWnS9|U`)^z?SoiDgWFUdMSUj+Ier$@7EcN=)p ze<8cMADL-5<7x=~^vM$vUwU@no_OrM4uipaiP49s#lCJA*3@OyQmGl8e_S9=UeO84 zs3%Z~X@i4>*STsMKe`DLSshj?#N`>HMvDbo2=r(@=gbEeA{}qHa_R~#Jp4M5T*v$Q zaw#q}nLJ6Ijb`osybt@3d!()pFF&r&4C3lI8tu?dZ6|OetZ90d>QO-Ih19DZ523W! z+P+w6j`ANK1bzI5{>VH|f8w1xF{0^0Cs-a0!{!Bp2tBTr; zO|$t$gUw%s0V-f#Fg%Az@96kcsf*jo6TNt}Ilx%HIM`IDfG4;sOGEMK>91QcblX&S zz`7mgtdXs~Y{SrAo4m-=ITy2q!ocQ7&4tUjg()F!i&?W_Q5lNj!mCS^gXm=1K}quW zeL61kY1RUY^Smwff5|rrcVV&$UbD9w7k(buyj+9Iw;9K0KcHuUP)^yzm&$g?pw0*| z?h9tsjP%tLUoyOexaQ{xc3dZ9)4LPxQY?>mfBZqt3(K;PSddpTSAzW$L)X3w{j|$l z7ScB|qPe*9dR;!!O7Hg@8MG2RHn-xqsC-HtZr;J>@8$Yae-f_L|3RBcX@ovEJ7TKD z>UY#*RF__Do}ov0(KXMTtm)AhLakMG&kY5OAHhp0YRO7t_zU_u0AR5)7RHl6BsYLr z4@a8Ii>~GYQVmv|&=jh%fK!cThD(_S)Fo(06#9yXg%(h!R=vrG4ox3Be|hADu1=i> zzU{97o)q{jeR6raUf-if8C(J9&R9E^~+;v|_%bLLon5@)vq zs^il2lNfN5uVg}TBOCR799YsL4@IceKqbsLglsJse`qY6QnA`Gk9{Shr%I>s$ct?3 z3Ho`X;F*T^Q{Te?0=LBBG$rK)oVZfxjDm2MfofeF2GX2{xb9ZrKQ63M0L70TcmhOx zHgX_m$a~e;@Btzi-YjVLMsN-QbQm7Ew5{}W%kOQk39uSylGUNKt!qufl1AVV4qE75 zIs_zOe}7rTi8DT22Ei+fn&9P2AFP$MREW!v)?qCSjb*gyZxMt^BwUsSlu#_LKOWEB!*S4WMApKf6*A%MJkR}- z3b^MJ<3%3P`%WQY;cj&%K?TV&8N2|>76&)Ze~H)&@jx!laAJO1{IF~YdzNBEwo>FY z_$&82En)|WnZw0N`@ZoohW)UVZ>o>otc=Uyvzp2Fc+T|VNfpHz()4)6S`ByLp_XTG zP4|DC*_dRI`_91U^D*qxYFh}&V!5vAYR#2OSYLXpSK@0olgvp-73GFlJx1lx-;fkP zf8<01t?Oi*T1gNi!q-p50VRxY-Vg!t&BwQ_Y^DSBPFR&e^0V;;Ns0+W`3o!+Unmxo zfn)1?FlPQ;P(ydt=t<(I17rUF-Pol6)iN6tzkuFwok zLNO{&FAc=qGE19_A5rHjji4E zJ==gumu4Ggk6VHGbWqJ0>!x=-z6^5oU}P2(qF9Il#bUgz5UZyqt4O8@C{Qftf0aaw z<7oWb1~}sBy8boKpW>TpvVFJ?0{xjQ2m)kU7V;Fxov2O>>-;l>SwmG3WFYS{fRi$m zP12Oo?*C}*^u-m$)A)*Upb<oYz-mgL#cC|2&&{-c!>01qGk$o=-OV&<^Sf^d&<2 zO^5Leyu00!O`Eo3)A|QM<*GvHe<5sg3F-Cj9{CO%5yx%veXMgUrvfK5T5u;;oXT4a z4!%;s^%pG5i*Mz8wj4sY1QJ+uHLk5Dk@XnN1K2kH!FlVYXNTB+2E=ecp#FCuk z2*XP0+Jk+p)txkme)gjJ>T6}3+kEqBe`EN+;xOO>8V`>XDdQa)sGs%Rf4pc`yyTA5 z(sJ^N&Ud=0fJsWFuMlPT|EpaPioL2M(Tgl!R#2*0;~HKzL(R}>voxm!3i9kLv{PE zvYg%oOq!?!>l$Ym^Cm;)e>yy(WS}jgc@`MEXgq1zJUIF80dBZc`-WH_pAVmA*Xuh&G>2e3V2dI80d)A3ef2-ye$%^k>Tj2bv zFrgy4wcz()$ivA6gJx>`g&uUh`2Aw~Q>vDZ{ zuz)qs$kyEFH`tY)f3j3bPetB`WoedLlUV=b++$ex!d8RkqqW>@Ayh2rV$q!$X%<3K zs#Q|L5BzXjnwfc9pH{=>=d`rKl9^(!RywmlQ7fI9>cihC{gu1$c9>tv+@P#YNN&_k z_?^f5w)n#wZaa*{SJ1m~sX4uPD-$R*N9A{nG%c`&!=u-je-Dg@p0w4iR7j_1!!MVX z!&?#D)wkEr#Lu)>D(FbApUX@lstxG2Aoc5BvDj{N**<8C+>#}?svUWR5u zJoe@+BT@6UkIsR3~)MdLFFp8T;`cl?}sgkpMTZdj<$3&6b3gN(^9dp0f< zBt(zyDoP7Bw|P^yJT>r_Kq8}Q{dep`iFs!$;DqI)ANRaQ)l+=LB~xpGcQ4S|*cROBe+%l4AaT62w$$utSzfL`I8?JM z(d`~_W1f+g;)ADx$Vpd(%jDc+**g+z0`fAYcV;XIs)noN__`_UcLn=%;?o1t3zm7r z|DR%CLX`HJM0hS<+%Kg#)9k?PQt|PzKV$>*PMZT#=-xy0Fdso}Ve7&k(0TiOoqcnr zH@_dbe{DL*-7*=wDWMQUEN1myVJmy6Q02JXFK{V?_I=V>v89-)omPDQb1koQhyM)J z1u#4P07w^-?FTsqV)`XZp^1OHuBrvHN9T@=81lNuc7K|->)n8CfVdMCh#l|SchdOY z(tvI*!=Mga4@6^f1LmpyKtx|=5f-!7%3#+Xm0DE=3(yC zwqtL4KNz`D3Ug?OEskz5%)k%&n^9zJOLr{oP>e-$PfGfm=(o6xK8_*#c-%m`R(#jz znTwq`LvnWyyo|VJq_1jiWzcX^FH_!5wHBAh(ZmNrms$`;m%cA~IlBHlX|Z*v0J7`WEUO9@eb;j_SL0k9mC--Vf*`Eh&p$Ke(t*d`NYuO3P?&BL%fMiV^VjT8f5&*M8l|-*Xe}!(Y1=BXA@+t}5XacKI zvV;CnZ!_>K#q2T5ql&YyEb&cU6o|1aLpbvD0cZJEFN|g)j602vU}+)eido76CuD>s z;H7a3B}e_bBuXyJH5pGP$?9dy{p`5f578Nl(!#KT^4jo@;OcFPWENi z`a0-{gdA@CqOoCpnSVGVO)T4zS`&)mMVUKU8Z3>1gW0GbKWo$D9&4vqVFh(3cTUJ% ztxZG`rG5&L34ES9f5hL`4=F>X6F$_v29F0&IS%Fvpw3vLOr1i6va;upGBYZ(RAqf` zRCEcX(Nh$|NVf&&4FirO--{(CZh%0h8Asf^$S+`kK25Xfj;Q6 z+gTUBE7!`L3-r+}B$C!Th^gXEi43hbNYC42^|A}=vqorZN3B}01Z(8pdE(ryBzFB< zeQdFmMwq2Ae`!QY>{0G+jqG`O5$x00@n~P~4CGQ8r-#58t5-B6of9P(nz zLOy;WhO8#`U8b>oof?&f%7FvWLnsZYn$2k_Z-C>z6$LSNW6y%}##z_XTmFHcE><6r z;cs$G4yRe2=xzxM*H;y&@BJn=KmE&PK@`M-xFQ)~f1=s(yvjhYlGtKwmrHnA64;qr z)HAe!ZqAP}SPrzj%NpO`vzwChFE96KvDzwEFs{G&(tk5VJTd$Brz^-(i4y$<$J4Ze z(K)mRFcP2RzG$Tbo@4r5q;Z|bM7FWOUm=M_-It=396i8H@#wUx0_Ur#8hD%2l+0RF zdzwCIe@~Hs&Eca2Zy$N}0Fgw)>;5PmO4jmR;lwd_Fa=fx}>?!7?LRo|KEDx#_qjPPP zw##9Pxb732WUM38jS?v{=TF1dmi5C}kbf^e$Ypmye#^xvJ)BOBClqMXheQ*3B$XmD z1Lx&UDye3X1v?osWfYG}f!G{-uP5C{&F2-r@53{=dT(}I@g}<_)$YXm1tzzQh(_qI ze~#}oM=ZJnEt#n}G@4TA+Z3n}aLUENqeRv2%tZl&68pSwrrE=6>NUqkY8XOdzk(ntrXyZHXlF{(h)!---pdP+yTu$~V)0*x3lnoGB zSE72puK>Oq4mLu*cD<&jw}7ePb-0$6=Q&EDPdyHex;8tv3$Ray3jp%en`B`se@3G; z@~6l6D_{1#w*1^8^p|3^pOSZKdtd`4_!UtIQ2@IZ-X&Rgd?uGZZs6<7D)#Gntj(~= z>kmizByTk7-pQ~r>fW0hl9R~xSW4T&@7}1$Qp^zc=%?U(g81eq?&AeNPuG z4QzMbs+t7Bn5%$9;7PUl!nojUfAg2wFiL$1s4VUH3svdEof&J>Ep5%Blld0KT|5Nh zzJg%39h4^>=@I1(k!B8}N_`e1X^p#$w_s_a!=6S=>A%mcuG=Qp|8sYoF9z`oO92Z* z3G(48+{e&Yv^neDLaeKSF#20_&md7+IfxCtMJTxZ_bpKL5Kuu#G`G7R~P5|5Um=b%QzKE z9;6nGLJ37Wtn6phouAQGf3FzaYg?g~LH=WrR~d}Z2QiY7A0Ieg-f^mXvvdyFfn+WO zamiv+j?u`D?P%WQqWT+6&Zv2LdC(P3HOh-!I10H0`YuT*oz8*9;-kY~HGW+v^xEgN zK5o3w1mKQT!=RMo6xma5r@lXBmRK2Fs%Gs$Zse?P={N&Q;s-a@fAdBcUg=Q30n~80 zUDZLo#ii15iL%jyT$c9Atv}U!QXkdP6Q3A|wSggISYYcRYb~R}!aE4ofwh2jU;gN+ zXB29@c+mJ=X4nB^#xgPUD--23KvCirJaMVa%&!$^H((fN?Vn0(jvh)X#6k+UJXRqs zC!Tjl@X!b6J&)|)f5E}>a8^_2#1P6|il-H+>#{NDlt>q@oq4ec0Swe&97Aush>Ul! z9E`z~@vG!J^ZKbGS472LF7N7n+Rk|VG;K$~5)79^lgqOq-ObP#ZeJSx&Zzo14%FsZ z1}x!hQ*H048z=z35Rj!hEZkmJ+xr@&k%R}f%SWnNEv}iSf6ZWDCss)`%da*ufW+ks zNV@l#2=#>8aH|`jCut0|8aF|Pkbr%18KWIu1gCz_?TrQquX!SS7|{-5lzeB;}M2C&NcI_c;DG%>TZ z-hqTwhzQwbfA7+oS-!P&=PPHvHaJAjy^g~BDbXAs(G{&+e%u&K+584-%XHNMMU1D= z?Tr&O*M2CJSrY1hHSR5EKv^1Q-!x)=eri(5dOSEx7sY7BQeSa&i~{cZZV{4`7zpwa zhn19c2Er3yEK*m9f;X@uq^b$YiWJ08Ic9W>+VB*Ze{%1GYLuJKZF^%1tR=gwaOXeD z`FMj3D@Tng{fw7mgR5%sf2s7(Dz)w7nVhMlEN$ak&-Np)mIsh^&}DhA3qW#bqek52 z3AaM}{)>CZt^QVBfJB3mhBbpKWs4fzL~I1#-gPP1#C2|~W-fVj5_24^)kCL%ZzK*5 zFB>*xf1dTxx&4M(9mG#cURf{&=<6p&9PPbHDZ6&-R3HVAY3O$piyWANu*Tkp-cTOh z{0d{6oZO{96ZiQjU>_+c%sF9Q%YZ+(8P}k?zrdPRx`;3$^ER9!RGv2Ee!_E=jK{M5 zT*>O^#l#yJVpn95gB+Hpcx?%uX0X$X24ok1e;BRAp6~0lVZrc#PW;rM_&Rl@EQ7~3 z4nBwL`r$d#TRC06S`5JvBVWn|ngwXH2?en$;qN>rfHTH0NP_VHYg60)T8=cL-L}_; zRzPYW`7#A{@&pG~*Y(iLb&#vde9J$R=u`~Y@6uDmW-^3n7q4B-N7ZyNo2ja#sBEuD ze~qtq6Ztm3kaP;I3JX}23GCed3h_@kYTbec(H9b(ipftiV5Fe}U2yK$n2tPej^i6iJrpzzf7N6sr5Y!B#`E zft!XbL7fsG{wjcjqxB&juXszZ}%U<-9O4EFx)FpI}Jp0y{c`4H6S$ea&?cuRTFQs(y zxB$XBY^~0~8ch77cI6ie{VBD1JZcTOZ}$DvhYB=Cq`#qu+~yV=>bz0~B2!EbT*y%} zjPEbH|HLW68I>`G-xy%{uxQf+e=qUZYRKe1tALP})0G4)xsVT86k!h}&_~sU;ijXp zm=NkQ+FXlrs^(dIRkrdOvWu;2Ep-OrDvdK>HC$WrKr5a+@5a45-FBRA0x63C&H;h6 z0lKV@hngqWw~TVqz*$FQf@d2J(5ggXdedemc}#NHjY#M7|C&AFyjUr@f4x1WN3KsP zuMzKzgSmd8e1=mhPENLE69!23P~>I&8CtI>@;V%iK5rULq_E-D zP;sqimp9Q_>!4K(Wkd`B6(ABOhw1Ep1w+36-W;1+Q#;fde-cY=KS~M6q&s%@E?zEP zNQ*;J+9L`rXhHcb!Do+=f5v1beu`f9(W*ICv^FXzGZ>3Mu?`{gr;_r;tQEM(PrAv% z?&O2EV}jdel*%}-Md!7qk&>aK`L=ft$9@0nR^Ll3BUrN4Bi%2gen6o3GE-lG6{o7w zpBBba$vdP0ukRma1pnlWW1nAK|1eE|J<+VFW;4lpJs3q01l@$nfBre^t*E_r%u}SS zqmBu>UDY2())Y+#EV$#$hKjH~7v(k9lT)BZFm;HMTV`KKTdT%E$%DUrudr_}% zO|x(0c_!okmXF9*fAvu%TNVqGRhvkl0*M$2$m=VZ`;i3=#}y`|nO&uGMX*h~u6)$m zWohP`UK23jA8+oxfwin%dzI)x){gr9W7>K3@HD%U;)nP|B;qvUZSHphi}JP@HvL0I zr5X&JM+y895SK++$}~hVQ6T<+rNwVLWR!^sMRf{rTFN8me+P#5*OC@WUcVA<$iJ+C z#yRI3{SpQ!GWQSgFW_>C9CYl^^@`vMAqn#`nRTVtmX@*TMq{C9g9UcONSX-0qCKwNLJ@erA&}3XS2@PbSnmN?=qvhy zx8pRZf1Q|T{Aa_>WUMpWrpsA0Q>)S<2toIlU`hz?I}Ba@_Q1&F;b!TJLy{C2TG1@3 zuwxOtJ$){}UR&p!d(qz6zs&yh&hm`^f8r!%Xsq73sD#x}v4W5RpIFmRgNH@&bJOPr ziQd4Dy1{*KYE%NU8{9E0zX zf6DFYR=6fUNV^TsdVMC#Oj28hsMq7mu;FWIS^*R0G$>x3fSpL2uO6;>i|{TIMAp!q zA+DqBeS<0Rimn)1aJ7E#5Gru(`ip;G-SXEuZbtWDvX?-}BEi?HMS49rG}R*OpVz_T z1}IR{C6%qHmp$aJXXza=3K@V|n>nX(f63gvJ+7NHuvxr_m>1PqBQR?sKHx}ZCVoCY zz!ZT%=Y;T87#W)G()gc1n?FWsed>jcr~&wE_AC@YT+ctE9`r@S{n3OjMTAn!LTGdj z4;e192m!R9juV`xq1P=7lmkoohEU-(nj#JWz z`cFf$ssoitjfc_;LLl~lJPiTKuP>-~-)ywvw|j~CJ390*4VC-xHUco3f3*7+y|{mH z6;^Q10zK5T!QY{miMv$UvL;S>Z!L#e#k=mujxY4l<^;N-r38L+_LGbFxk*9X48&xi z#T(tBjgssy0w6QHZV?c3Mu@AmDCFZuV57$g#mIWS3G{zFB$+3_;hf`r5ux{;Ufz0) z85KLMM(VACto%N<=(^d}f3TF#-rbjeL>`DedVgxH_?mmDe;rU+CVp?a1}&(4*29!l z)$H;bgoAvZn27OeArwc8_Kc1|u&6+};NGBI4fe^4TPX=-R7G6SPp zzo}w)vnAI}1FT;lhfX#xDuMYf8p+W!t;RFLO|!AW|NK4$?ia@5AT~cJp+w#6`0;fY zxPpe}v^kxBwRQZ{JT5lmTg#9Lo}+U0aoKjQVN51Vz3PGPwu1Vgq`}M{&I+R|7Tie6 zvir_vI5*KU9y*7Bf9Ula*S_{a0hFtRaCC)V;LmGx5 z9jy%jIUZ+@=DRV^Eyf=Wy|I4~!pgld``f6%%FQlTZ1RI0N1E^+QmSvqJioy9{+$1?U}~~p&-O=*8SwzOy4o|JLfcMm$tPJ-u`xn@RAN1m z6t|Rno^Vsj=2B%DVJux4VQb9FE%E`b;wKcvE3}ouggrvvV;W%ud{%CDAIuZ7T>qO< zDuxvpA9Fq|**V|vT_SiqMCcO;(ngI%Hmllm!brRQf7}z-oX@X*R?oYROLtgvrzn+5j*dWs^n*Io6HGG8{LmSGzM%TlVn^q<+?0Pv z#n^QE8FJ(fD?iSW#2_!$9JH|qHw#EAciAyF(u)w$$r+m$|6wXjjy?hnX+|iWdas0$K6ddjHD&Jg|~o(Vj0ot z>0nCf-|yP%m?NV+xWQ;QC=$|(I$eOy*w6M@0zmQBh&%^#`&@ecz4ZU88YmoESt#JN ze>J=#`l|XW(8o-G9vu^yQhHl+=S15|0MvmZ@$^j^d(J)&yqQaHL{AI^dmQ#KNMmzH z7O>3LBM3Aj4KVQ4&}6@4dYQwOHFz(!tYA(R(@1ry^2Wd?W6j8Fi4UDVYJo&bTELlk zKqug&77aNGTwKF`X(hHLrS5A0EL8J@f6YPUx>F!~Qb&@t?L1p*JrQL_;~&X*9!QmF zp|K_ReNjfGyl;*UBAi3aykqKWe_``xVjTcu4iNhvTZv~Lqg$pZjNkPaRP=-~Xb66T z(}c?@=fv=!>{?*hLBBJ>iw9Qq8g^Rx%ZBeGbhEJ-(qtTzct%Z(1viEpj8KMBf9Txp zZf^w+_lxep<~@ftFmMQg3hblS5N2QG3AkocFm2h9%-xeL)DLP5!Q0F(PG z3{{UytGpwz3ER5cce$~i0Vi3Xe_!%kg>%kEhBJK=Ojf3``l!Vqc|kP(k9n5JO&8uE;7q16nfaQnk)lCltOrdD4{$xX}mBh=@6HefwItog~7*9ne%fk z18)~y3sFbuM`wpwBqXwfKl1P5t_SM^upoxmx+T`i%s6eGym$@Cf6Bm4DZ0L!eFfdn zqA8M%oxIW)h=bYwPofP@K0{oBd3mkZY|>2}x4O3B1&Z>^_AsO7$#gpxg+=-U7}tEm*l?Gu9=<~B-SDjH(hsE$^QKC!}7tnG`(9D zUHConrmBH0U_Hlqq8SBXRTICP+QrP6U-Ymc0mC`5?pG%pf6aSI-h4n&;_Onf8|3Uj zZ_~BYP&Z~nQewU#I>`z?I8t4dDBNPazdiN6X%Q?Wxq1cS|sQgsZjf0nXJLy+)o+z^h` z8H}74f4pasROD@E9NG#Vkt!?N0BE5Ug;jK~4r05M ztKUxD>(akRib{5B4qZrm9vKdLx0-V!aHymlfO5JL>|roN=q3> zWuk%=XLJ(M;}ncWKlim2uUuY?e_3KhH1*?`d?P!OqV_#Dw+P=-nvZyxohH5?n+R9% z7q`YlsU-K9vpHgPD;_sW|B$SY8C&@(!WzzYJZJejSTz#9xbUv##uOjQ=FHM1Nki?Ne7RpxK-!+v0r%@h$JA6cZ+&_7St;m8X9sWms zi>&ev?{Dkl(9QCLwv;}`)6IyTn;L2YtT$?*j1hZ4Cal}Omq03Cy&UkneD2&Zn%mn4 zA_d5NO=v0!HAblI%_%(n>|o9ZTz41~#i(1ef`8#dWAlTyI7w-`{o|p)B;dZ+Qo#FH z=5^n-beA%6=3u_aJ2>axeUYqBHB7~vPtQs6(N1thL`++tuJ7n@Af{Pe;E<<(Q^#wB z1nfJKehfD9{ft~F)nUZu<*BF~Cexxq=n@UA*+F@h=8$=9Bm~9%L2sv<4+_|pmtQ#ZQEvGKNeLN``TKhFsM@N3wX!g z?_{2^9_572lKg-cDu0WOkfG-F_jUf(Vt-S%wmNJS|?ZK;b~%$#DdmXh}xzJDtZVhOM5 z03)^vn`~0-#5c#o)|LNsseicq zGV>A^*Y}Z^_kgy^ga^Uqy3tiUXgI(gLX1750ATIDXvftJhYPSK4n~Rb^waskF`Hls z0v}EBm~n{73h4i9H4Ftd)TZMgaTL)9TTu(&!cBj+ap#jk^umca^uJ!)YJT^Acq993 zKZU1NXJ)OUAGmuK38iVGWKHlF6Mx;ktavW6Z8aLfC7H25!J^!|?27*(&xLU5xL5!Z zEV5Ln2Jx7zImnCUKoPmm(OfGyDJ%MT+t8khY>h7OJBDX@m?mZbZS!Fdo_7a;?VYCy ziEO*Q2)b$up2y@s@um=R8PRWsEDfw9eyyp4TXc+Y#S}n?AsX;cTCq#{yni{gRH&IH zTB?i#3JbZE+o2(lAR>=E7isA1-GTLz$9Do64ZanaCOOJBL?0n=q)|EjSrX)Xz_!8k zo(b{ES&x;8!D#z=h9GsU{n_cc2)t4$&-u1fA4Uu#Ht3l8U-Zs~Yo% z^*IP8QTgX~?Cjt8@?4@T5q~+8U4BD^z)F4mi7$ipr@xiTHl0_ZdAC?;+qXMH4?im-)!-%9DR(N9jq7b0rH|w9$V5Zg!4O z>D17h7}dW|wGM$aZbUic-+8pzI0MJGUc|#7y3dzh<&mZGJ|Lkz2;0w((3nHm=qon{ zce9Y+V9zj(B0FHDH-GSk_y9MixxLZYLp>i&CBJ3+vw1@QD9?dGVlDZC2s;Ue{N)K% zeI0GVQU}g8MC#2LodLxrEuzHd`?Vd-tgxEU$4OI?M2un8(qHZZdny=rB^gwq5w+jw3(D};wm*<{Az;@we0@A!HhV;?H`JJSSK5cgqAR_1#`sN@ zexX|*fzLhkN`J1oS>a^^NG}0@tSUIc-4Hr!uf=XmlJj89WY94#Qw6j0jol?i`7Xq8 z2|>(Y?hd#~A*fS*%&fM~cEs5WNv#3~#ISY-;Y}w|S0>(T;HJ-6CL9~LfdyG(4Wu}P z8h!qh`d(fcebIkAX;FRl$tn zuT7XH)&njE`Z)h0rd5CTi{g5j)1?^ZKf0b@{MJX=rc*kr#!9XYLL(Z`(=dQ5#Qer}4G)hj22{t!Y6`?`;8UUyts$NFqe(T@muUQ$mAQyT>{goUrUzSAxE zvGe>7{C~T6z?N~`=Vhd5LWkQ_pUS>dC7?6^P8WS=pz^jj{H;q`Z2a>oYhwW3-6>qX zuVrx;2^aITYB?;m_x+v2U;bREOhPT+cC;zuXGpuHlnsvsJ%3()YI%Eaf*uV@Vm}YBCWgd9wdO|I zVs+BNe&PHhz)JhH+$hl{5PX8zzMb_@v@ayba1B|Dg9>>k<`_lz#l!P{FUp!5*{sUG zw+rkV6s#B_VMJP2so*%tKN4P`K`pW|g!#p{Nhb3fOt|>}GDVL`~9WhvqLMXM~FH|^4|#0>~4^2 z<~asyzLN2dQ|`yr(6G!0Iq7SUrsRGcC4Y@>y#^8;yGdAOU3WoqwOMRdEcNNqSZW-q zrr?kj*dY}pg<2EgBG+V+gJ+i4roF7(g%lA5)Kvza@AMIlu&UP1(mb~b$dRkVK49}D z>RD$&{X9%B9e)Du6mo^qbBsfLcQqs}1d9>1nWJxHL*M=btm4XwTOokD2?& zp0^bw37fuePkZGLvM)MxI9DKHOPWjDfYc`D2WMH@!eXchSkW=XIu z8uwon~~sSCS_UPv?q^YcNDax!@q}&=p?NkY*5unsIMGY=Jcu(C5ZI?$(0_=Ea0QP z&J9Py6qH=~m64+g1w{RWY$NnCmRF3WUIA=P4#DB3cb1NBt zV&%R=LGI_0x+-jy`4{-mJ*NY4dmOz219xrJ?j2gVI&c=n>Ts=-rb5u7nY;YV0{O`v z_5^wUc10#@lciVPG1$JPm6an_6fK!$(i_|*pR@7(0;ci{7I7%kt>>65-`z6>cM22s zjoXUT_W1RsBoLYsI5cEEs((-QO200SyaP3m=#jT(<^>hLL?&<`#2YH!h0A^}ywL|EubgFZO0uyA)wFg_wZwH;3YGXmDmlkqtzxtB1|lt+Q{_Sdzj#4Jba5UQ9V z#1$)vad=4^$}M*u4*LDWx(gaTNd6tL^ed=KCOU+tv^3mZY)glf5`P!iRs`i7b-x=r zf5sejetA4i!z~y)Z^Q-!{&fgF#I#ZbHOHe?xT$67RZ%TETj(Sbv}qE{{(&&aEx=Iis?N z&5FpZ?OEO(c2>K+cU^<%0-1%P{M%^~EgIgIVzHUcUpg@!<$dNWU&<$z`*lxZdwb9z z8A}Ksj;}|3605_B$HRE_>xyr#!w}i_Npyrt$1fH$!6BDG3cz)}qjPsGrMtf`K#a6r zu4qe9`zM$|PJc^mNW^qwEWi@3nVUa;k#~ssG!7r#^Tj%A^|MHx%)lpqSfVli=Q#s^ z@)bd>99`|!KAe{7D*9Iz2ILh|AxWjHX5izxbPNv7B&U9(hRpty`u(8XoMNoV=XBK6 z79t&S9~EHwP3|z=G6h?G)a}0^^@x|ItzoPoJo32PkAG==D9686g5Ry0uINi~Ao{Tw zUmIM6fW@^|U(U14(VBp*jS!V>#TPQGH_Fc+ZU{HYR~S21>Oz&N2uFEEfXMC(;wS)E z>0c&o^8?+>i_ev>f}sl9r-s?>|F?%FM-E`n$g)@gt+fNWM4i9pn^E2T^*R^YxfKmK zO*2@ud4FeO$2!;cTxIMALRHumucObkKhF|*2wxg!_Z+(`^AFjm(0GFagTz+3cp|b5 z!l!RsgeS2F(b+Vl8U~3$PIV1Z$|3xGWeau5dGgn&Kao+`?1{$HXQcLV8#yleHw5!4 z!eGO_>+O4E|C_Pvft^HxL&Ra@$U_^FzT>C?4}VPG^(7l^tA4QE5XWF}AnJt4@{!OM zNG!O5W;rkuXj5F!T$l)&+p+fP+pknBmDpv&>RYNS4*sB+Xo?u6?jIXWKiU!!MIQJ` z$jks$&ZoR3B?sI)Ey6HS{wzAFODbPW)PHV2Ws#m_CLoi)`7FA|m8KvaF*S{#WFy*) zOn>iErpmKn3SoO4N#ssLZDv&DC6_}`dS2Ee)RJ#)&WOq|FHnKZC8&7@>vFqx^xn7U ztsS)M{UxbYXYRD^XDX1qg_F#_?kPkP?^&<`NyBLI&?z<*Ocao1iJ zTFcxHBZlp#hV`49TR{z_7Et`AOv3L!A!8}T{Hib;3M?>z^4eHL*Avd{ao``D1@0( zube({Y#jV|fP?#5oz3vjA+?YGYW^zrI;&O?XP<_kMpO7RmOD&Hw51(E>Z(--=zou& zdYId zm#qCYJhruC{rGy;cV~(fHPjK(Jbb}XSn1*Z6mL&yDb@^C$&qssf@`_bAj$Vpr+tPR z%cBw+%7Y=wUJfO$>>=0Tn|OxGek9rf2WtQ6?YOEa6Xt!7i8`lOCe^LPRo9EFzO~BhM3TRA#H!# z7ccMY;LBhToPtjtktX)xT~<*zs{is#-TO9iZF>}jsy6YhRev8&o7h!AaV^t|4(c_I z>0B;v>1d06rj(&foWK2qs(<4yatra#z4M}f5AXj6v zZJV(|=Mwt}W3AT+?#Ft&q@25`JT~>SH~|Ah%u+#1m-ESQe^k4*E3r52I@GsbHq=aG zL6c)1|GOmsiu2|yah@V%RCX-HJ67e`fc$=>4D2OB+%QCSU%RP%-hci<5eoN^2jocS zDvrNCB#FNN<+>5U#MvkTSsL(lgU@xa1)8k`8PG?>Nd;ooAtqhAmc(v z0EdRg(_}#C(WJ7FY_5-zsOQ#ib=Gd#HJ_8Rze7^AkL2;5;^q}$z`!#R^ESWj(G}_+ z72riy(V$mH86&IWEq{9lhxXfwzmij2%1=L%L>ey<&XFYznAd0Mk?3)YE_o35^Eph^ zL;^qZVQ`U`>cgU!0LTSh2s82aUo?6RV6(~>-5BpkG(K$dPnuSa*VSj+pU%6dl8Leq z#Mpp&6v^>L8)`6r8eo+#3xxB5$W09FTzE_92vC|k1 zba4U~ggkk=2`)u8FWpP&ZRF(8=sy99U{HY92!42&W-3q|GQ!!*WC#F;CQVgpWRLUd z)c2oThq+WYb`Lpeevv-g=#}e|k7sG(j4`^Glv57ulC#%l^}@IHN`u8j8O|`4rUwANR+&v)<>6SCr`XeO5gXV$u_Uq8BKjha*7z25}rOrpKLQ zvQyCK@yt-tf!hds8dHV1;WBcqdDWC>lx; zc{l<$3Yc$W>J+246)N)BReeZF8|dabI9kOEh=08T8U5Lb+fR~w3V*7uOUbnC*f6@u z*qF`p(g@al!dwgToT14qrhF7xrq~dcsc}|{!s!C9`VMnRdK7ooo(=ap`q1vCQeHa8 z?=|&Vq+m)6OvCVW1}OxCh}qrKvnlZeov-1eBuKD((eyx917Lw7Zf%_Vi$kwLnhRZD z8-I=yw1pRGswl7y+H|t`J)N_M7t%Z%rPIP@1XuO~s>i7s7FZs`Vxie%X>2g>zQpq+ z*5ICh<0X#VCYsB9qi;j07H^IU9ap=@`<$314fYUH5vVW1La9q(yAbYrb3Y^4G6)(# zaCBDj4GTXn$8CtFefv>f3%UuU^5M=P9e?F2V}-sO8~7}h{jeI1iPlxVkv2)ahGW5^ z-Cs#kN^JCFdzLwkN4n-r{)0SxYP&sc(xztR?{53X{NV!g%ACt+IxewWvPJ)X;)<~b zdNMeHS#c8HyJV;sEPVxh8~k&K)%0?MM@=^^7A>($;iN2;BGitC8aE=h5WTx&dw<-e z*TpZ{h;L4m3!#nwUj;WuN|$4FsT7JG>FfpR-N=v_1XIve5YKoL2;-Alq+u00f6h#J zLY~%^aY2r2{k@P)2>8%;;`2>CGHGII_%tO+U;G88VELVljT^Z)`8W*IPLztg@+ckAG1qUAJMgw2`*1;V$;1FpVf;W&%hpnDb_g!w}Ng zpb^pymlrmS)=BOu{2$mYnMaJ}^Dh)!$F1JCUWY*`{)s+DFR1gyHuGl7`VAd_O#{pntSJD42;O zro{wK<|dTPB(8&N|I(Q@vkD&=m2k|L3lh}m!%83jjI+i!OuhpJkA4~6_i4JWm?EKB z=PE!h)4May7;M68XxhJ`mtmBg5#*TvXtFmT+!d+mYODBBC3Ge?H3f+Gc{3oIj~Pm) zNZtucz1hk#XNV81axL=Mjej{myQIxMfc;0azr1U7vW|6qMvQK1G^_pY@*4ufv()(y z4>BwY;B^5^TnLfFLR9c6^pPQ3Lsiwx!wdlsS^s-}t9{ZSiLwk_7E)HMyl=S6`1KX( z*xLKlQB#f-LeVQvEkMpH56>x-Pt!93`$Xf)2hO%n!P@Pt63VSqf`6z^+Ir{Y`9lGY zwW)S0f-A$4P@F>XFb*J*G9~6E1#1=#LnqosC$_$8rRb4B0E<1FR&~&vvc60)hc(bp z%AMD}!nv&`I(S13e$y18z$vj-L2ZO@(LiDO@K&ceNLetzOUi_jMGbXj#oPw94lu;o z&0S%2%O(+JjF~eFf`1sF=-!I!UkB~0dlyD@xG}0tU2|HDb_P;yZnm;8b1L)ac8drd z@#K{So{2ral7_Lfql~?RYqyUk)@s{Tu1CJ*sY>Q6;}hqPyQ;G5QRi%njkIFE5%7gfPV?3o3RWNmVZXGynNZMt(aUg;a5Zh zz7mCc4;=J3@LqZ~i=djQ40Bt#YWEb!+rg~c;yq1wCuhAV*Dk&|!{H&sn%0$7v zl?z!auo~3;tQ_uyy2&4hYSL)w!P;@?hr>d z!#N=N{|p+Hpp_Om+^cm5xUPiGs*YqAS?uuz_CngE`y2|1C8~gfsVFG;m3PrRzw%x* z7cMSWq<>O*#ToHHxSJYwm?}})2tgs*hEM&}KKM3m+a?640z<7FMVW*WO1f)+Rh&a} zr(IN2fth3D+x*wn%ZgyLEy_oQ`b6d_9kEzgFCpnZIfykGMAoE(&oI^LTTX@?vsjAE zQ)sCP8EYQBRdv+J$mBQVp1$^A1D}Y?Er2a-^ulpGeKI0%j+t zEKQF)8)|H0zC;{a<$!7!+ z?|;2^UG1C%BpVm|GKc_lrvTKyj2BI^-z;}93Y|J*!xzkCEE6_##9~YT34We;11mgJ z7(F7dEnvbhY=Acps*dSRJJWPfj>5BW021Q#dDr;H&uMNf+(S&grVI7X*~;RSE7aM|o5eb~NuF|NARblx}4BdXjzvYx*DAr`CJZGPnSp zEVSg&6zgQ;9QQ3ifLzcw7o4<_BV$9n4BznaNBNRPGJeU!$Pc-3_urS5N9jlNqkk3~ zp_}b4AGVZ5zl3U5Y}^oC9BZ@4hAqgzjemfCuPa(yM8|?68VkWcse?5WYyU(&*|`@%DhQl> z4MN()pxU<@Eo(o1gfdX=8@K~e~g?oH#n zdV3}l25(nB^e~RVH!+L=qc+E|yMZ+(yC>TjbP=Rk1Kc+&renH4+?ZNvkAEua7BlWa znFcl~uaZ&r{Q_%UKiHYmB6;9^Q z{OjJnq5K}QJIG8HiDS%kOMhz4of(#8Jj-R=Bx=H4 zkZNt?Aj`n!$Rfl+0H#LK1i>B?gZA@XCud?U%GdOYP;mVm@iVu=P}5+E(Wg3N8t?lo z3jS-hV?M&?+DN2{vc~|MgIya~wm~<*JAcWz=Mk=vjg6~mYwwfs7%v;$HIHW3mrWrMD}Lw)?+rfwOmSs9 zg6@k`*SOvbh+)cYA+Cmp70AiLN&}X}cDXVqT4+Nbe#SlJ0YylmMFR34aR4aR+)&c+ zd4}pW!F23EPiZsomp#6k6hsN>c{xGAI&!1yDlZA0@I8>B)qgxonni9;^^|6otcdt| zkjhowbs8UK6dX&@!ZIEWSeJy*jt{aqzLO-s$Icx)CMc=Gi&Nl)wMQa0wn~fyF(nuL zZHCyZA-MF}dk!gzl| zbT`k^pS}ILMSX&ac}XQprz9|Dst!&AA4(ENI7fidwAZCG@j^pISz=8@N@}i(#tAipsSwl*cAsQ(unB(fk84uRhU0$I6Q(MSnn9Z)ASze@ggt9b*6+5iy$x z^6gtE3XuPx* zMS#H&it}Ww8m6jnVsUQ3tZCF9s1*yZqsJOcg`)q|exxwElTDK$tS4`7Qh=G z15*QZ2q=YIQb3uLB>ys7DB^}q#9JFjSs%!pQ$T1b2nXefE+}FxMGQq@C6>IVO=w4n zeDN&2^4*a+SO+ZA^@oXv-F}MLhkq}$f&X-HA+f%Q3-*ywC zxPoPnZgBl8Y+LOiMlsJg$4Ir+HN?3TUM2Hd zCqUs>M{-B9n;RnUFR5^`;%;N}U7-gq)`ok+0ciOv!-8W{=U7?V;{RAXuEY8i)v2^k3)aU;Ei}M~4j6l%M%tH&`92=?qZ*JZ(bAJ~! z#UwEBt8-m|77|-f&YmXPm!S;SVx=yB+@d2F^-bd>7b;Dafyb@S;o@9sAe;WHLcR8D zO9Y;8@r}yFIIMzIW5!9Nb*>f%HgV+Io>s-7dcqgk*G<-i?*i*W<#J?A3>q75OqT7H zQam+4cN|pdXj?)7Y`^3u&j;XhS%22fhY|V)xIE3qMo?OeZgR{HZm35g$C4=ZdFY6H ztx~UStgd5U5DoDpQ0LB05H!|_g^U3EMyk<}PDaO%mP{(f3oOmAd)P;`YpCOu=6aBy z6g@Hvc?y&{;NI?gR;?$Zy?Jpzgf3`V-Stg!RBFhX{If&m_(P9ZlG6s&Cx7~5S2Wq< zvPG0VURo(_^fj4Q_e9vwpyGt2CJ0N%Af?U>+)iVLj|qZzwl@e}I86KYXetIHQpD~o z4do_eOMhcby9#MRqVrolZhCGZY<=Jy~C1P#Z*t? za$FdD7@6$z#5V2TYx?aAs;qZc`_{e&)zz(7Ux~DmS72S9bi~!$&VhA!%~`~^S@tcn zvUfmoQ@@jg@&q&iQE5)3A5UR`E#{#Z;%{9wR911vB~B9cEBZuiEq|<+EGo`SHT0>` z%7`>hk}I9ZT1!ep8{Ru`H12=*X6Qo% zgar!f%LSDr1Z8cc7t4=k#GjNjAeIf7fTqQmWZUYo-C1Pemwzk25+G-bH8hl9#2oTc zBu@<{((Oh)B%3iCQHIP_K2PNzrE+Gv(d4;Ue%gCaeR^0+c0M@a;iBEQeF(4#v~#*F$V|DexLT0CN~0YBOPXMi)8C3O#KN06VpopqRknX;D1)5lBn^SNyo() zTMe4$Do&f;V}CJfIVVEKR+n6XfW?ASpAH<2OnBy%{6~g0e$f0pH;&3wKxf33U0*3Q zON7WRY&1;gNIAZzTn@Bq22@rkdBrC0H_O5O@(SB6(HT3Y{hcFK6t(2r=b`U-6CVx0 zO{}9hMZUtnU_4`rOsUCeO#O4#Ml8CQ{|^r{OOu0dhkxfX#&vs7)1{;BNL$b0GA-ZC8tra zVt91#=}ie&|MP?pfbaE<^{>ssq3YBvYWbmQq++IbP+?Gce-Wi^<_8_X)7qW zQF8Vgj!1S()$%6f1Mq>u*eQ39yWb%vZQJ;lL&EVtASxRV@f)H)77asnnlnj6K*Q$l zr*s}E&(n%5%(^FNs1pgf(f`vGP!z~DfhtRSNPi#b&^fBZ_S3n8}8Y6*}^ z+%Xy-ShMt1D)VhB1wCALnCyc7>pr%-B;tv_d(FI_cyw!>{LXMAV1RFO3zplLU1R)A1|CqsbgR7b z6@PP}=AYzTk|GCfG*fn+hN$MvUZS*V+*VRAzsltWDvc0qgZ7Qn)IIvpCA3lHg;~y* z16i(pi>PP>zxiLz#W>DQLqm)21jEVjgzJsU@Aq~JPkvY?w>pHZ1=Ec40}*LS&&U%A z$HIFR#Pf;fP0)t330Tj;S2srffc7N5}(Su|8=eir56Bn{vfCbp1!0vXnK68tH zOFEz&4-9RHQhPJ-PW~b?gI=i&bgKc)DAKdg0y=tjF4b9kR;!Zo^0j=_!EElt4`InS9e8DjA1W8PpThFi-<(0JOIGLB}i#1J`AWZqb_&BWPkYy zC7h+>E3FLAV%~2mDpP42j1BvR0)iNW@=~!ztFYfbc51YoAi2*b?>k}IWOVS8#N!4X z54`E!H4Xfsn~J|Z9BBsa^CTF>#C$mXBmy;JmuLy0+*LUKQF5S;cb0rT?pz6gmpsgj zE{N_^nuv&>>gd=N|K|vEc&;sU&42Xh=3nlfJ?2i-(H#4x*24*9n;w{tO9PQ^nHx~` zXF)>$3X3jCzr|5Z69fw-Wq_iP?mCbkpz_P3C~|1dPX7asl-jGOoAneGs5Gwpy1gq1 zfb^H&%Qg|=ehf43UakPrI-$KPky z7&8~WPpHt;t9RP8dtb3S-qY$7@LB ze8#WT7;(2Q?>?+VcuD_H6yZ7u`ta(5tBlFnQ90AGdu8p2mCt|-lw1pgp-Q^aH-?k| zSzW_!Yp1ZQ00%SyBY?3}Lbau_A->3d;Xx$uZ86!Qkve5oi7aS*et&6({iM|i$v3)Y zpME1-N;(m8$#NqI$_3ftoz2XnXh6bY{+d;kS(j{|la;Db$H;vX14Z!vY76?jcqfwh z?S9?@9m{K&#x!XSVg8U*NCU;e?K~lt*AiAU)SMPA)hZZWOH5rN#uae!mFgMSzA=c& z>4AHuh$2QM)#YOt&41=bLrq#ySjjluPCfm_nV!}!fK&n&x3n-v=;!~O_ z_{un^sv#6+{eM^r6=A@7+m4VRIzu$Y+o!?qf)f(u8d(z04uF82WPNp^1uSqaLWD?# z*)LnsbCKT?gU~T5E*V&SV>RAwvTqMS<4|T=-q0y{(990Sq(<**_B;5BCz6qsr$nCZ z15EKCDy59eIBqu10eNXv97kLB1A=|$2c&grlItBF$$!xDY33d0_{8N ziw0OI5<=oTzRGlezA^6Ct#SQKYF{occOKsmU(chj}S~Nn2 zp%z*=1b=$B5kUGSV|4mK7l%NEW4J=X4QKod_1Wjnt2s5z_XEG8ukW}mr0&oo< zx>n(Y*~FA%_R7zNp5F(JN9Fi<(32giXx>U5ttQ^dhmpP zd5fKpUHo4@uBPaY;d1d70bs;t1pd^bx3mtY`G0FM?21d&d5=g74{$TngHHB58!0fh zFScs;4y*D_-N($=VX8g06_CF+*L>12(BAoVr)P_w!t{{t*jcNhCgiL#kHGZIWI0jr zkPm%Y))OA^3t22h&pLxmO>Sbr7UDDOIVj`@+r9EGm>++kE4D;+VzGrVExWTUde92z zX@8RVSneZoaleUvrFTo5e8Zxy?R1-pN;2~ZwZrjDGo{19P3?exS6*UQqM-9^>D-X* z--={9fthuBNu&9lUJ&`CddxNHfJ-jK<#g~ak418lcE&{wk=YvI7e`%61lqeaO;;0B zHJMSJOn!UOdebWjT67#+dseHerEnLdwSV0&<%1&LvoZsAPFPTIxC3Q*F3qQa3Sjv- zbs<0=Y`Xn#A-rI;-JxT$drNy8L)8Ew0E(&I$Gv#7sAYeoNVL^^sFh%&^O(O&(Qm^8 zQsf=Iy3GikyA{;uB&i|w6))$4nCNX41H)L^rs*^SDn8Q>(DpxNhjSI zdDVeV9`r3X&UGB@h7rCA6Go%cit{LU3E-j}wodMj^AbQE-%O`y{g#==!uqVes`6Z% z)w+CfP9B1s6xUqi@I&M*^Mh>lKVl*Am38;bt>i z-k+5w<)=!X%W4h12p$jDVFw2q7k`G%yp}wRii$ILnC>^_oFh0vx$tJ3Y&s30#Pat* zrZQJ;@$#++d)mT59X6FlFpDU46&LLQ0m&K%?35gz&Wye9_116D@1!Y})fo<*y%#-W zxI0MA*tu zyfPaH`)?x}jYs`HeTC$3ULcFQwc(G%AnX)~bW?Qiu1CzbSw&>zlgUi`>nqL zkc8n_5SkoyARj@D{uUkUdw)FpuZ_5L1t|Yq? zBM=&)H*!}4EZw`J2u|TZQgou+46x~+dmyWiYD*Q0`svoiBFW$NVRjn*tIoQ}uN60z zjVa-C`Pc_P!_O+`xk&#J6HhH)rMiW zhOw7+tr?Flwyd(~pl{Ce_zyBpcIA!{jWEbZmr~WOV*KrI!QXzKEf&(ARkm`!BB!Gf;6Saa({ig;x`Wv<=_)VWSeJ> z@G`7Ul^q;1!HWXdeUXA8E9O$wX?v(4pYO6XaG7NH`A(5KhB#6-nlsO?G~txYo!|2j z=A%B+dNzfD8{#B{#;4%Y`Zr&B8Yn4TB$iF}|2EZS9;h&{_K=IX!}CN)A>V|@_c8ZA zwBN0F3ijIRFMp+C_b-MCK}o-C8aI|3onx;kPfN@;uAZiSAwrg=!u|eEHGNx)|0cAx z(NcG{#F2RI3JAgYCaa#7z`SpUEnn*I1ev(}Hprnz?w#_CtlRM3A^e+&Z=YX_&t!ot zJHr=i6W~XsME;=sPXpE~cT2BFC~|R#I12+W*bQK$J%0;cD0T9=b<9PvaxnmOTrU)al$4@_xA}V3lD?+D9Dm_(NC5 zYzKK39E|mIj(Ekr+5FmxujA@Yw&fz7Hwf_Dx02>9B46)kG9EkDmj zuS@cO|FSWS7Xzex2;a}n;AU~6Nj+RVUiM0-Zhz@Wx^oLOMVsVjYo+$rscvqC z>mF~~p1^i|7l(^(H<0R?u`^YhJb?)xWg$)ux z?bzr8?lJhIW{HHqv;uYYF}JvSg$UH*HQ}0%8X`}KT&8iuz!jk<%kYyY&kH4dwXF%d z6@S+)>S?#|Q=LGM)wQ8ac&bQXE-QCgs`!!@6m5s zFYNB6dn7qFN{D9t9!ts0VKC(j16L(dsUv+^EneD1RE(@G0AxmOCq>V|;Zc57Vye2Q zdDfCI1* zO2+c#NE@R2%fX`_uI~QGy$&p`qF3MU0%)?LRcG}+`(w8)7hgcaZ&CTCvoXqfg)BCc zu=lxqg?LO|5Wobha8N{iVg-veP4l+P639^ZPE?u#n@7dkJOusZe$Ln#oR8gIF@$(|+vNMLsm+(RLSnU;ze+H8xiTDC z3f||j;-9+n>hd*C?O}W@r>}>Pua4;U5_^qfrMJj4;|63Ak&In+T0>Kkwtrd=ue+gg z^j6IDt|#EtTB%&&=+fY1FTLx+=57N;nWuS9fYavg-_NW`v_Hr#n~oM@z4&D5lsx2l zW4Q7c>lc++Jqb5+t`I1HBby*2?XCf2CJre4yMRtYb-?Z2yJy zO(0bq)fjTDq|eA(gFLLJEu8Lbn9|O^s{M^XV4m<_0=ZlzBAw~_10T0A!b4&cG&Z{U z6K}=q^s=a=$vDoL4}VOg(mt)@dG^Mwv}|iH98_3IHxQHX%J|$OV%c0$CWhT}ePj>s znW%w|UlK3%QOJ=(7B6qP}*VG1p0&eJ+x+&jQ5A-uoP9GLA@Ksyl${Hqf{#z&c z%&NR@^@zolifRsxa!k%;4!~ZA6$ZfgRd*z;{Tr_E+F!nwWMB#wtH* zb*6XKYDZ&AZLlkn4o7m24 zHh=#(1kGvhJYMJd=-P&bU%|UKa6`F~nCt}%A3J`sncMU9t%^c7KqIJTD)r$b38D&y zGr&Cyo(VUY*xY)bVOU$bI*=F-2W#I!;d*?+&>Rv_Q)Y%Lt;|@RRNjL#r|{O_O+;g#;wLcY1ntyl1pTxJT7vLYUz;)k(*iT@H2JP}WS#zPw z){WK?f%kn%oU0k}j;hT~ldoO-#L|6BFa5~{hiwGL*pb*jw+;@})TTq0jlP-?Opa~p zCuC_s3_L-yH9E#C{Vl0IzudEz9Dv8b^qB9vo7L_%T;0o3bC6?mFvY;PYDX8g(iw&@Nl`c}VQAyiDS5bL)L z+_+z*g7|X&>vwmbKHMhn{oT|A5T<{bB;AV55Y~8r8;C(>D?2aZeqwZk(lhz{p8MUb z8eZDUIW6l&^kD=z2PJ#E>LtFxpMR_57HgO=CX65IY53KCV&K5kb$Kq1am;WZa zC2|z{QnBVy!Mq&s#Uph5ttlEf#|7wo zeipKS_3PIJfa<^EDm2^7x+f?GaPW9rOn;{L50}f^NB^mpKg$v6Lf@Q(t7mw3WK4{ali_o zZGC4egUZGw!2}^RhT(AO`FGZYv>B_;G6OvZ6Y%G;OjQ?~SDPKxv43dm)pbmK`k}!< zonyEoKv1#15VLyE3rU;e#NYt1%Wb?og{vfM3KAR^hU+P(_DPNB5Xr@?OSU->%@s@z zjlN)I7j7zq3<53Cg^Nvuu6^f93KpG>_zzIXR>ZW!@3iTWaV}~cu9MvBMmHpY94MbvX5Mq3kegJJJSlz(X+s4$8pN{NY4le#yIl=;;Nvb_&6r>5If&15{R@~Dcg;WWjI ze+f-Fk){%uDbFpBRd5p)6c`N7Pwc#NMtj}JrIQ(&&69&puHpnN<%U10R#Q&fxQF4Z z_*T6$dH^{<#=jWAZUC{Mt;v>|ZZfks%9dk>$_K#%p|V+$2jU1Tk>!6NXV#xp`{wuE z;nfqZ1WaOE3|ojB%+*o497DANq{Fh)A@q%XQA}V?;%@I0;!rlQf#`) zS2XB4OBq(V9g=$kl_i2C7-(KlqEq1Py}?KdinSNcy6j{6{3 zph)?%`*Yv}&Q#v=U?+e2zz;9P_lx9SPInD7ZHFE|u>@n$5^7dGX~PeSGb~vkH#iq1 zn=9q&v~lO_MO6|%TNday9Y_ngR)Ard7$lM? z{M_M7Fy2nrfOzjXnYLo!ZJ596+oh1Uufpc_#aIuQE(LHL;Mad!-{Qr2@YnG#p;r#~ z#+EL+C7M1^F;>oaQQUO=8d>Kv=R>KY;_3cwzC!WTYykcHpvtU`otCpX#zu#`ML85& z^_x%6&!6cqBYa|M;BBr3i~E{-EzkUETJ8?tkZa~Uki~<~I(>~vBRMvLjqo(hq+;yv zfaC|COtsHF3~GP;7BlNe!jF2^X}>@0&}-VAn}XZR!XFo1lS?Y^+p5EW7@3V_8(%e` zt`Im0-utn*xzUL`bVsxc8uD`&n$`@6@p?3aW=qiozNmX=lq}cKlhG#c=vk}Nm^!mH z2IL*g?dS0b#D?2_2}o~%`Jk3%&NIEl4#f5aTg7Dcl!JfUbc|p~PpU5mUn+YDPcxnZ z6{O!%#0owlrkJxD+JiYW5)N$n$(cqncxzxmGO9eM3n#g07!1on>LwrlAjZcI4y_6c z|1U+Xlf}+obn{A`eRVPL!db)kyPj2`>DYm*1|1NriA#J42CQTc(zFrT$+)GR&)=6P zhcIE+2i1SZ@91vO0!+#)BDWPvgZ|O25>=zYmG%%Ff%^LigZ32lSjA>)HY{3^JPgS6 zodSrOO`pf<#460@XK8zcAC~K8N7?a_!xk*mD`RBLiq@g^XD9j_eGN8YTRz@t*^4VJ zz0@cexVz|zm(VBTbe_{017JsR96;;vtwbXiqMCnO`+8DR5(ZFWJtLMCe~Pn}eJ?9I z)9wGi*eDbYX7Y=Ms*Bn)?C4IzIirZGE{%V9ALMOii>`rcs2XQ|T#BXcPq%ITF*C@# z3R!$Lj3sieC-4pPk_%`up_w|ka#AXyx#QN|q03`tuGBfV@Q;>1{Nj*3DVAED4u2R? zvH*X#1hDwNB6YVHC38|)6suwufDfreIJj|%;VA#aSl)%6SSG{WAm~kKuRmB`R7$HJ#TtO-7IZ)#$_M7ypEs7tC!=Yd5!Ac<&(FRjiwA( z(g@)w^cXu%8G^G-7RUih_V0Ga4)G#bsm)&OmIj0U0B@o8+K!dP+$3neC&@#h6{HZv`R%F)4h znVLLd3I#`XyEfVD#x0LJco;kU)X}Jn$F;rukoK0dd;{+WNA(pq3Op8F%nHIWr416ca1v9;o#@L=pn1){{qk$64K zZg}|dNg+tLpo7o{+#ptwW(R(b0b`D~C3{7>IgJa{Skw4UzV7vAHlv}9P5O7EiT(OV z3EdwXG*9jjCcK9cn@)v(HfOeBT-(-b?78M4kQu8f?MNDV&bVSFs+@oK3^wQ;2}3%f zG#)atNAxB*ek;Cb{p|*cWdrhY&v4K4b0D`Pv9hV8R840IM~7+s3U09)vzRUz&4Umt zqDcY#fpd{A@nx%>tq$qy?){$9M|OuGMWJejf_;eDg0kVJGg=%_?7lwcc&8h0*|tgW z6)a|oCcGPtekH@vz)gQbE@+A&xk!kDT`bpVA8&k+U3z|?h}hFSI?Q`Fym+)(5boT9 zdDln)G?b8Zv+38J=AOLr5>sWf9QOn|GUZvKn{AmOqsLC`__l}P?y_s=m7?@|JCL7( z{<^&W0<9nPN-1zLESj;Q$E+`xikJn37y!hQvM1{LneWLaO@MzK7||XGSZeAba1P4> z9ZvIHC5iji%~)(}GUm#Gvmo^K73*K9ly=ut9Q~yfgP;%A zx!M)Ui})ScgDY;Jqn%GB|1ZYk)1ky#?!z2W&G(hlc`LK_uLjvdwtRMQD|)h$zk#6k zfpC$_kg02(K&5}p3cNZGBbwC!7dJ(uuS!(u`)*e;eV^x`-#Pb2;yGw``$Wl2#W)Oymbh{t00*cY=;SQ~mXvVdoddsmQT+a{2f>C&DWsH=GR2|8HdyOajoflmS~NTwOKXT zy(~Om%Fll^Tc8ZHx8V-?J<>~Pt!4Vce9^eR4Q9A{trAfv3d8jBNF`|84SQsS0>df| zq4*t}7w+~K70-sZw7`bvBY(sf2k+q6rTX5@9QxMO|3rlYFC0O6$^4_v!59mq9)65` zbPZbqD3+Z=*r^84u0Xjmw9e{Kt%F>={9hM!Lf(IBG<2(=mYP#KfFg|5qY+1cU3s)M zYDpV~pzaeTtFNVqj@nKX)(+d$#ph3?5NX1{jLs~RK?wFtyZp~LOnN`}5Je7uMbOS; zGAn`o%eUT*`N*Kig`@40mP%1my<)<0VwrWqyw$mq2-6dUd;OZJ)xUFr(=}t~8fhzP&xTS@^kjI-CY2n^6cWQ%y1I966g!hMJj_HE zOSBG_F;~0fqlwDMby4~K-Wyui^@NXi@$Q^?sNxe2@_kOYI5L=Wcp+Raqi?Toet%*>Ng$#N3qtWxsOayIl5O+2A&G?n1T!>S774 zsZ&9f|2L1j;Ct2lWdh>qdW5)f0-#TXx5M)G%a!7zuv!Y7b7KCi(+NVVwNv9Y)DeOP zc##@WzDiH$wYJxW723&@NtRU72fuKS>+b%pGG(%2cvi!&rs(61D8Kah+kzrUxh;Qz z?~#yR?Ld9-KAo}{xV0D7aln^gKvKoj{+wmy1;03TM!H@y6VQV$$_h|=-K46X=?eQz zR2a~jkw-3?a5Oc7u`2-DEI=Y)vDK9*cB;BHo?oSt;Pk-}Y(g zD8SebQ~KHq?*|*QNK&0T+9QrP9vXJ79RefsIAuKv@4`mK z4<~LW7c4ie{%TfA?QXdxHJWNqf$Ysksc|S2tfsmr*I4EDmvn0KE{4S9O zV|&a7!o?_WgsB|(6*!D7lCdG3krjzzZzx$B*c~wy6g)|8-j-a!mcf^!V32>&8Y2HY z(L7$&QurprWAZJ21J{QB`jPQy=elwiEB+_411RiIod()+0{S=wXTzNGR8<79$gfGV z@1Z}sGCM6Ikm@Ja9zopJfYTDDO*juQJh@R9R_NTmasSy(4%`i05QfFT;pwmi%&zbQ zwOaI!#U=V8&=h9)L{kl>e@1^+xj*}bA%#>0O!JZ*O7qGSG#z`l06a^x^ll}&ceU4{ zzaW!#-U{n6hicdZ*e+Q7PH8rfR&*A9SsC}VC>j^73b0Tw#?a(F1KEefqeyDoruMz# zIizdO)1z&Pz0a773tuKsHGbL=`G?jt&(Ju*UqZ&=^imG1cFDE_>bHMrWIIGQ_H>*< z(fgJ`dOO1dcn3YeF&hLMm^+GN(KvP-Tn1%Rko!(nLNAO&a)2COS+{G}nht3OzN45$ z$)G$cmU4aDn~%Qbm?aOIWyT#pn(TgOFziOZB71kZIR`r&ECUAgywaSxa>_yi>Pc%^7H46;1szE#C|B&%CiVD&ETs@fsbCKRmj7cXxMK zt(yY4%3o*=Yz5OIpFst>LK5iRs#mKR-Vje5BT}Jy;1snoFG1hW zr{!8FXEhfV(o!z6I+{GwuY*V&p14i7V1ctsC+NSJ`j;jjDhT0_^ovdOGjWR1Pit@D_`6G9q#?nbVkrd_||`-iq*JCl;8j0D!F@`^92Ll^}woQE;y=n<8rx zi$w&R$=}Zh7Lyan2MmUBrLr;Vx)6beJVG?ec$q^cMLd61I6Fea+Yi&t)3Gw)v+K>t z(2ri9=7TFOy+>BXOUQq#v`fW=0VHNg+|Y-bs+g`Iu?Jit`lut4te&5tGP(rMbp|iw zaG8;=t-uJ8WaS93c$(g90@fPSk;c?Orjd*KIxol2phL8R?$V0gbj~_(ZCz&Uz3E?m48RTrGQA4*9 z9RRMG*JZLW-$WT=SU=8OOPO{E8^Ls2$DqiDxf=S>;w%`SLxEKme>xwZx$yo19vs)4 zaQnkq;a9OKQOAjB2N(D8+4+4tw<)Ur-GpmC_=ta|q*U~ZPJf}>+}X*DkIsgUpM&oY z$GCCndm07XRM3y9A*YG-y(_V_U$2O6zv$z~bS+Cmut}J2Sefg&dzz|V|qYP)J^Hv{SoP^Efp^fKLHCl+I)lS_u zXnTKfG5pC&l|>_6*BYCDMQ8~oFNFO_{eJ6BwY_D{mSHvfqFvqKp^lM`$dp9Vb$65a z8nNzf`b3(?^pVO_ltEvcbrug!alR2V;M)a_d0b6M@4D7n%?fC2@B?Qdt4;Zw!x%yc zP9;N7J!*oDih0tp+3T_{9w9tN}MrBLGk0RJc0v-nb>Vw z)VWXw!Ch<`Q-1Vzda_jwP*Qc+&A5MdEn-dmUE%#O`9zJ<{wxGAPa+>b-{I+#ga&WN zdIY3}8k_*0h4}CVx5zx@(>Dnl01|(Wqmir^a~-?viq`b%_KmUVcAVQ3A(=vgkCS}j z64{pJ1EekG!W!|!bkz2YXkwi~cM2@MLA+J~QxK{EgDh%RnR2ySlJ6fDnt~ltHqN~} zMq1GSHrCuhK-#PE$vQ4r;^C7vgVIe*csa0B6_s1r=Z7Ekhf!Jt3t+qdX{~=dyhbt? z$Z)vrLgfp8Ck@)1PZLB7W}@Ln6$m%tox}+gVl;+ud~oadc(v>CU9C&G9ABP*IAv9d zd>=lC>T41w=ykHCrMfcs2`bI+2y(P}ixNzb1Dmab34<^--?Xz#@-p*{=d{K%VbJfQ z6t}}L%Rdj@H8yd?=t5iQxIi1(V-GQMSYoeJKE7beZ7-Fj8(bqLd_ zy#drZBZp(2wG%Q8LWP9jKKYL`w@bVh?@YIqkpN$zQvAHxf}oep(p`VlPY_bB+HT18 zDk4cWLhalC^qsISyriModdCf&E`$f7XQ7KY^B@r9#E zd9LZFOb|shkM}!+qUo3c|CI)ML412FrYJ%&K?g&SvvfFR{<-RChyKGV{`3fYH(4!1 z2&0ATLTQ>-bE%QIO)G!ED?CPA7l&br&2NAji1b21otWsnDqs@I0Lc-w(>?WF4ck(V zMzE{z;bBj;lQtgtzFO74ve;UPaWK%w9uk&$D*dBY&|Pt?w%R?l1inJjadnZd?wb_K zXuxsXb!PEj;yppdD{Hg$VK=o$Nup%b3%_D@R#XhPXh#xRS<~9?c~<9PdfB7gf+RpeOr)<__vp9{qLGO?0w2nACv3+iWE`yTV58=a}~ z$B6Hi<-tmQ%vyghB4j7Bl2b5zs@Wz^YucQ4Dl#K{6*<%U2)rqPj2CP)#)kv+L4{oS3g+QS-CJNt7!Q+gRPh> z_l(2;<@Cd$lUY82zjf3xF6PFl5T72^QPw)GQe2Enfc<|HSy1M`gZ+_C*jrN6>Ec_| ztpp#SYLQF$S;N#rpKEAv1S@OG6=BM;ZxJn{u;Oa%$lSW$5(1pgEa4A4O&?>5#B4Wq z30HQqxSk}Y!u@>P?3%b20)A;5lSOlQ9Dl%i@Mj>dqeUqS7O{d-P|=M;={4W-1LA{_ zR?JyAv7>*>HZbJbSz{Tx+yWLKxZPc%3>tc(XqrE7nqltc&u{aMY=g31Lvz5#z*H(X zD9NA~+-6`T_kytjBiud0aD_hOtO_RpJlb?WTB_}sO3)Ed(C~JYMlXuhIUQ{K0Y+oU z(+?=S1L_MsPiipc#~C4~TVH ztMY%zu!p5RH6wY>XNkWJ1{S5l`pFZGZ8WFRZiZ@S zOB_oH#yI<-#Zz^Yk}@%YKNlDt^o+AV+uSIse;WpKBdIuBUXiMp-R=K;R6hz%UANYZ zWR)dg8Z@s(@UnuT>xIfpR_XEjr!m*}jply_bdQ&;!7e2cwtT)4M}V|l#CPp{fOIT( z`&6;S2JOYG^m(rvysSA#CcFR7mw0f-p=B$`hjj-NddGgDg<{yylD8Z3i0HX?=qA0A zEYR-q?=OVP?Yk&EJ1?#fNImI!Cm@_%MSK>>&r2j^bX!f3PJ;KECnoPSw9ecK0@Ht? z)*cp`gR%78QQm6^J0d7s-$@Amh|=?3@6i8}-VG0F#8apf=N4j-)6qJ@m{Kt;WBRKt zA1yE|;-g^NEMCy0nH0h29h8&2UOHL$_|}G-J7!}lv(P$EFnwS{S zBKCaany$GWva7CF{*%p;T7S8h5V!rh&^UE*=)WU3fJVyjeju;Ih-WP|T6Ho~8m`co zEO{tlLSY16)*YFXH$V2wyPC2L!5929T)yw^(wd+sGMEzyd^5pzbg)#Oq zgp;F5PS4`zvmc=jFWZ;NWcJ`@-&Wl1(i~|0hCs{rO=C`spffL?8Q%{@fWfR$?hGTE z23?CnSQ_sLh+@a-P$kk=PD|pN@u%uV&L;cY?5|9UzEZ0sg5$9&MZ|y6u~c`^7|d4d zE)1e^#S(0kAf3=QHndjT%f8!jmyDG#tAS&eGDWzL&~%{CcY#0=~?zQz>F7DXWG zqH7l_TNVxCb2x)NI_-Z9)uc_QI^(QpOLwiiCFeBGrBkWZ6}Ncr6*CD`(zLbCt`yuf z%!yTqKCc=wAViVgrP3R!Rg3YOA(1^7?L$0ZvLxhBi1S{ETFE-fc*=z?qu>~yf*K#$ z4n`8pH+AiHja!`ekWw7K2=_n`?Y#bqtGBQIj9$X(6;m6Fm4<(GbcFbC>6+=l1y9Hd zhGEu+yVFuw_tjU5%EdvwTuckg%Uo=Vvmtp1xieEPub-$~)qFt}1qIPQ)|dCiP^d3^ z68`F>Fm&PK)eOYqMx;$x8-c8hMRyJZJ~ADB631f^H0vD*Xe-ovPT{#`<`+iK2WAh{ zXYt}EK9+#1a7ur$FJZU)z&k0r6&4jgkz5b+{9@wDd^@t_0UL!ZPuCC*Bo6e6LbNL8 z^5?U7>3vlv_vB9g_`WJ}m5ccu!7!gy)Rw2|jd~OeY}PXPvZ5B|^ZO}w+a#6g-m9n^ zL!{PG9(jhhi<_C>J0>~qq>hjJ)k)*c2E^omhT+Q^A0mIvT!S7G!ve#9D&pz_THyFF zx-Qt_63B_w1)*?oRuvcH`99$|(h9%hjZj`Pw4@0b&!`Y{ zjtQv$00vUlH=1goB0sGLxBi2c$j=LslKJN}!B{P|n0O7|+x-v4pc z8sPOZO}}@k_)b+S%PfAA=OH|VddI5u$=+;OB^^S=B&^=aS%jm!bhFGPB?xaJIH zdbX<&sWUe?f;63C+3`Mnlw-Ydru_4B6^UaH6mKhG)@#2$tjU@0sAmfX&3gJg8B>2h z$|>tSw=2Z!nC8LhS09jOjy5-0n7;R)M79h+TdjzBkOndJh*6Nv{q0Ex1K1os42+B3 zVMaq;IiuJtWBZ!3>eeLP%QX+gmIYhcWuQjx|N1?8>p8CHX`QFd4_&ujXI!rSw2cOHL-u!%;?_-`;i*=op1Wld{13+`22^&RJ0PKZb4 z`M6`fRW&eRC*%KDttVQPK4Pd#($}Zi1gegD?c_ZkkmLibr`j95$b_q(3q#^5FQG6_kKw$GtPhcNb%Q=>(5l@ zRH9rSl!QHts;CLEJ(vSu!;o+QKG7NXdVsn93}9;Y8c|7UHpwkTW2be|xLb$~@fF4| znHn|fA;R{i z4i3>H{8vzMXRX|~t4pruFZ&1l14izvu|Rh0O)Eq5R{NxFJE8Zw_lkdq=U08r?+&=+ zh1=k4d(60RrNE)q(2?BkgWwpoSgvbJC^cq`2 z3!rK#B4oKszNKb%wuk(o?7=X3TnzL@z-j}&0ax}k6&YvT>h$dN``gSU(i>G5NGVS5 zC;?Sa`=kZfPhrIvaZP`A^{K#FeSwvuaksGzH#*F&Bu9?CckOIJkGrDCk2kcgTv(p8 z>({lag8QC6J`<42WOL!d8M1)^mu_!kYYO`G6D7 z5*M)fYu;I*AsO?&&?WbtmK5j$4=L-RuYFowx({A!DzcUrmdzYsOd2S5hiL(ZLpo+A z-!=VenCVqyLF9k?H#)I!A0)^?FYp3kze!!(GJSQ<)AyT?F6w!MiqRD3t{J!rx2p># zLucBDk6_JII9x0DAP4;>oeR;!z0oaiLPTyl8lZtl;=c!Z(PCRW*2&!q=C;0I9>s~z zx;&)gfWHaz+##(zYv~2#cjrmapi8R!TjI`wl0z}Te1Ly7y-`AW#~kSsabSJbFF>_W z`pZjA^Sfvp*|8=kj~{SO!82t*;wkhK>Hp6*kLpyh5$FV1U+bIq6%Y^WW&wpJR>Q4W5Quf_PpK1> zAvD7`q5%YO;c1N0M%{c+y*dMu?{rvwweM|vjjgje z-l#m{yH`UAZCRR>o)5XvL{fv2g9GNnyT&hoiVoi zY--18wwzv5`3cS2XCA1iy7>`oiMsecuQa*`8CCpWcV4EsoI-eac5rHw9Fr0v{1L4$ z_3VGpQdT!V`s*7nmv{{Xhu7YreKx`{dZK}|eo-IdJXlqT;c_L0{!~L_(jNmP!Rj~3 zrFEQ4gV1*jM+2TyARzz69HU{$`m)}-G2~CK-Pv)Y-tH^**@0t;j@ZqT&Q$Qc&(<)t zkV!@{mm9yIT)0u=JadnOB^WVmO^`yM;$nZKxv~}(gFkUZbp2_LrZ?R;MXktrQU&$; zgv`jg(SL?i5Ib%t0B&;r@<`mZ%15dbWkiAMH*i>*++;T$EK@tBVm`4%WjL<@O`bCa#^$M`uT`(3XEL zZ`e~IgHGYl9bPH}iO5ovPe@Y=on4jF`tdJhZ$tnj;pMSGo^F!dJ4>9RZEa`)YXmrm zTHywlO2~V`<}O~07%-~NbVPdard|%rU>}#aR+CtYu9-<=3WxV*H}#;(7}5lu$z?O+ zG6nIpbRVjGc*V*&ps^Wu7@S}O${&9j5wMY-Hv!CKfJt80R}26R7|UIl(u1iZlFC|n zN;%$Qp!PRVQzB~=KGqAqN_J3w-LVv&_=V^FQ99qU3v}`|u=#rRTQ9ZTDkuKut;KM3 z5km9c)Y}})`Nbd!v;4FNLY(r7vAM1QObpAYkSP?0g@WmOTzwF5QDUd%is#5yhvo zbB=%AyOGj0yvPEv-h8Yn$2%(1P|D4MxJth8bGWlh`u1U8f5mp>0@Jl*4J z<9c!H#CSZ9H75ecy^6ECVPu(=p-X`PJuncaH^R#`D&6kL0i?|PirIgtpl6VsnLcGZ zy^uH(ey{^!zTnKwuwd0-@R@y2T9C}Fojxs zk-59k1z5w=u|H~-wSAy;niJoXDpD;C=RZ3T+=aYb#mo$#vZLqN&9&PCBa~#vdyB~jFUys#S2ziccmc@9o z0x1&#TzsRea%xJ;Ct5(eAlalNJ3wO?hPe<#sCAI0krP$^xz0Ie4P+<#tiX=Tvy8MM zUwTZiYL`Q~l|oxEl$Z$Nu)%Ca*}|EHEqO@fF#EaVUl$>7PS;^Nh2I&MhDtPU@jOvo zR#psn!KA|rvH*V`gfuzM$|9jPsE~Ij?X(P9gb$R z|Fm^(^-_@>56kQ59F6^N?1gmuol$Ro+=`k6xx{4K=P%SSmoMj@@cQb zTDLUuLTkTxQdRvJ@LEJ|!^FCnS71JV+w*@V$dya`loWqTBP-u;F`Y;!z5I zj~Kt4!`y;_q;^P4Wbo~{Ou0PyhWvA4Hr_v34Bwixr8VA_GS}bwY3_HiUR_3|gHRv# zpeq;-4-?z$iD%QZojV4TDS2>SyUD&N6j8T#yQRp$$3-;4lE&<1^qnsp*z`+H*Hr`xPcU;x88r3k1>y4HnsbW3GWKN+^e7)@*KyNfP9`wCk zi-%VjAGl>m19ts6TKZtM3Q9tE8G5ARi=8L)Q4fE+qNG$Fk$cM@P7X{!rNotPyi;=O zsOROJTi5GR;LAOf@;)k-bAei&rp9(>uwWWbCPxTLi<}?cIVzlz%Pjq_EAtK%B0r-Wb4B zlgxij<3v}W&vhOk3f@@;{gyk2+2q8?Sm&@Ix_lF%2fVw;bAHYvC1kPc(ZL2K`FZbJ zWj0j_L9Tg#$v@Uz9WOfn=PF{yAE<6H%P1-R8c^TSE1$MbJ8!6Wmz^fRv1*?_K983< z)}`Aky@oZiuiD?a!RCap$2D^^G)f739K?U!j9Lq6-=D>GOhp8Er=7m>@%u1-1wu z4my-j5%!6cOK~D$ldxt4x+i1BH}lY6Mcb&ZN%(eH2UuE>4jJMprw|_>Zs6KRgVcW$ zsYO&s{)@C3_gSP=qeSY2F;RHFRTGtPDVo9IFs|?B1y)xI^jml7}M?$}v)NK8W#svv|Gvd!IRc*g-8Dg`i_JaAuQG{^m}$sb*KUm}R1 zp>WL=`=uM_=uw_$1`2Rl0`vDVsGNV8v;J!#NG3$M?OcqQRUtsqWql=CF`_IYmm8U( zU3MWalM^Q60+r`_PGbkSDy@u%=_KdIQ6c4(oZrd)v5DnD!J&>zSxnU>$LrX8PU+J{ zLW2S_Nxqnfy1;B*9U(fD_v>BS0oQj<0^0WhJVwUE7bGqI#C*~1Asw{1KY4%s++GfCc;jQDv!-6rlavquNanvaDN@4*!V{qwzKb6Pn<4UM8-4|P? z3e1@PglYQe7zi`>r*6G&A!2{Qp;%9pmWuPSPvw`%Jc`RgfVJsR85lE&HX4BXe$Y&v zM{O{z!?F6?a^#UkS%1b@kbZ)suJAUcbr)vF<4l=A1~WVOlcfy3&mqT2fLB z=3WMlBEDHm=St8!k7lmo?b)MmZM}b)_9)+z;QjUh zb|JqH6{J-`;Q3nf)2>3257R;Y zT|;>$>f2S}?44#@tg=1r$+g3W^W}xUu^s4S0<%uZM1`ZNI9uZd7f5M4Z={>YCsh6x z{|VuCYY*Z!N1qB-Q#XHdU38+i0oYP0bvZL_7~M&uuA4;-3+;Tq={U z0~W! zU!zZ8=rZJxkAPR$u{t;U@U2#ogri8qrbcl^EPJ7%W{PfqzkB0q zI%RA;6pCGAUGBk!+?+mcrwbz(eGl#Q$-49oEp8T5i2PU~20UAN<7-})UHS`rSDPRXIa z?FEb0^K|?+aBmL|vGT~#YOSpN6V@#k(s*&aAM7#+J$rwe)aedmE$4^}B4y@7w(-~p zbpj**boYk&-Apr6dcHS92Z#4(8mWV)%azvFOXy2Ctiq?_lO9xgTwF_U29Q(WDFLIv zv8t)&9Y010R+hM0mR&lu{b~U30P^tT1X-r+fbfundP!|PW`Y1-t9^MuL?9Q6sN?XS z6?&bCBl>@MW5_7!3;BSeAgRME+08zq5K*QQ8GlDll|y*@%{N%&#n)y`T<8CDwShO;c(pRXD{^MNCy)ufir)`q`zCP10PK1o87Y0`L|G!P6a$k zlf1VpgjBx?^$-59bBTm}8IDki`DLQX%U(mbn5!+M5y9ikPn-fo4@}i&HtHlpa||P) zvK+zqlp(|G?mb|(m1_;5F;wR`1>8w#uDEbtaE}AhOO(YaM%=-HR*uv_^yK0n55g(l zwK9L27tCy17P|5#SOZlR>Um_fn4{hqlzyP?9l_-3ouxSGhEwN*^@m(z}_z@6~7g{=kL~_r(9|w6GR1}0- zynFY_u3e{!j9o2oj|ct4&#jJG^uoLm(7Jy-?gG_ST2u(o0w{8iZ27kH0q4#mbCywT zq&#E!|F)^5>6$05VwL*|M-SoG>PMxav5ie#=%G^9@#{M+S)N)iU6u;gAu1vNQY}Oq zjY%#XDU=Ck80Tq3PfrgOv9OO93QaKJ-W9-+dQ*ClmaWhvWnBWy{LzfLalt=iu!DaV zmpWask@biSxb{Wtk50fZiib`pcThU5D64Zn?HLv{PH`42AK_OhwZTI2d9MUAZ0nxx zUTdAsN%3Y)fFLBr#NUrmJ%hbTcYRX%7i9pMg{=rDb>chzRIguEj~d}DC47wbR4;;% zd4M}t@xU1bwC`@(0IP=&y~?dTHOzmv5>m%niZdv!H7P`M1YU+00&|A?C`qHP6yNp4 znLVdv=&gE8jOnrYZ3C3AZAkgWy!5pil*O=Y_F^emB2cbUOZqp3G;Ms4=nHdLjkB_` zBf{}8*dRAMu6E4BU_Q8R;6m2Kq&J&q9}d&(jg_Me>)ahb;Q0X5CA_>C#X*0>;>EYG zg^z#lhGOkqZNN$4p_vB#ga220Xw)YM`4ldo`@N#dK3$qj$N=Zv}MRIqRz4Y1#SoM4MR{gOy z){hPouEIS~OAkPeC7#O&FzwYr)JAx2K3!c2Z?`~M8h0#0d1+YR$tZ#Me5fzI=obl;Pg$itvO0Xp1-YC)llCi`(!1A{V_yqZ5xe7 z`^|tV=yvr$V-7Fiz>2r*0h1%SR~w>OL$*3u4t;o`ZVY1leun1N9%g9}r!lcUg@$?N z8~I~4Wp%^AQz;L&zIVcSzRK67;Pkmsd%dB)z!QxS#~*%ssMy}zE(y|JOR#z4zpYVkKC+n?TO)#e zLd5zrsc_(0lWpx0A$07Ne+2X9ExqK=-7k+h&*3>t0q?Hp$Rdv@qMbsAgL@h4|3Zjd zn(Cr}5p!?=<9UwIs+ZQEv@nRl;SM%_GFnfz_cX~gYVCi^AD?xe$&PYDN}w)dP66+D zydpx#VEC>#+7?TTw1P0{L zTbzHiFTm~0*X1~jV;yU${A1G-e)&bcjhNFeB)Wf-;>Cj)%A5m*i)P`CcFl=85E_#n z@PXKgxh~N)h*_()zsV;1k8)}~;Sda5$v*o9X}%ho7~ zI{8f+tf~(@4n+nL+SJPYJA5>K-hiywS+Z{P{Eke6R6 zo_eW5lW=N`;B&jXdFlu3G0!q;nwFCf?$UqIhJC=gU|j2NIfC7VGJ->GfF(N@f&zQSgyibN09Wo_Gh6}@M=R<#s zR;Q`{e8mBnJ6X!Ad3G}kJBg_sRv9=2H$t-ac&YsQ8^?#qN&&o&2^IS5l$ap;y6;e-3KnKXa-ueO1#Bnm@$8SB0ybCgC)*vM#DYo-AAZPXgp z(C%z@4@A0@42mkGZWjL6E3+)pCKR$oNF8KOLWSajOSF~X(W>9RxGc2u_}SsI2r?yd ziF~Bp)ANpANJbZ;qtwL=(5-VweDDPOPT3V@5-*S#d+o-pv?t{5mxL%97%fo|;!w8fI{511(F|RIp zQ`I}$Gzulx6Vgo?MNBt|c;R{2j&k4>bsOtL+(d)h~+sLQq zRx!InFr#_Ez@vOwrzyq|H!GIE&1l-$hDLVeB4wlOHbjQ;MsV@?ch7&}Dl56?7nlC# zb&nypEM;|`_Wi&S*zmJh_2s%&FIIIPMHks1urlR}GiI}$qJRHp2}j^KdeyGA{R10B zM2b0yQW+unTo0ZMv}f`It5Lha7nS{d^8rqbci?&o<*jdQ*Z5{nT5NqDd=Vn>P7( zvh+d7G>EX$90}p925@Jw481n}1M)~QCZ8GuH%=(ei}{vPll zUW!oQkwM&Kc%(P0{)7kfRVzUrYrD2SxK~)bsGWD^q+H5MxBh?F>8NUt2sm~ED_mA~ z&-QoJSCd#%ien45DF%?N_hLNpS8%|O->w0ocVq_FNT~zCBU0MU`}%_Z{_d!(rj`h= z!weZ9aqrmhZ}{_zZ$p-x7cRqp{y>tP2;l>GWaBP_d2pMvTL9(bAnDApczD)>niEg2 z*2vAVCcQp|np}T9+l&vPG`&ZHHQy-Y{H_6-TFl<<3k!@tM zq`0wz3(-~FrGzAUp6RVDY72-q&wEqsTpl6=$KSOBM$KV}ARcVb# z-aD9oNMV;NxNFIIsNFflcgE5}o|1ysP%7R5lEzE*pf-Od@aC~9Bv80U1(-0=xmW

    Lgx8V2bB);i`vHU9yYC{w$ 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

    K%+dB_fkk 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%0AYAla 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%0D6~lA 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

    &r6UsWZqt-xS@nue`CTVMZa4E_Lb)*wd( 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

    +}kR184JB8CBSV>}6@N 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%0ARJPc5N91#IYMw}83Wn!N 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%0AdnJ{6lu)CBIBZv0K%>{eN@)fkQ$_q}` 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�g=cSAV{u~KYvo>H_0BB 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≤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 Ss292uKRXl`rD(!QGD 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

    rTK)YtHpbJe+hjfpz-h5bqug}*~TMx6c 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%0Awm#qB^YIA7w!#9ifpR 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

    SzrCUoKQRZwPGcPJ3A{LkRJb9VW zLfT`$LRz?ZTHkabnW<0~8H4;a%SJ-#{Ah6NNU0^W`ah4Jd1|L|@rSW+*(8+;@$wJJ z2^Ua+yBEvD^>7c{be}9Zj`hArWgQ+2I8huN-FSlMgyesERkq0v*b#4%pN_U{6$0A+ zQ~B;$N0ek?w+%Q!raNjiZBZ^7$X9%OOQ+UlGV}3}{7)8CP!(((&ujIlo)ppi+9c6Y zYLC%jxkY;B1@t~Yyy6)Sm%&s{i+hv=W)>u{o(2_5^gn4wBq$g@`i1P;Aa7$lxwpdk zJs^;g8e4zatT4$uH45wpZc+Uor`js?5t2o~A?OYou6~2c)W$pxsY>Cgauz+pg*g_C zIp>}=;NV8F*bI~neUU634FEPkgWE zs+NeWEfer3z}{y-0@frt@p6BUz+QOpG=zjFAfA8En3@^rxSNTN=EOpcJjX1j2VN6X z0qCjf@g1$GeIP*5l{SYE(H|4Vb1D&k_GnTAqQAYq*0WfW>qE|}E?3ZQo7pcgui|XO zyIa;u_8CR5^Oy9k?NLsYqmX;vkPA7x?5x=FrUa)EF$Px1iOAFVe#FgD4+glmO&fV=ce9 zfHF+SD}D+_EnSRGAWU;ndiWqymcoMIV~2mg?O)2GV;}nw7bWex%vk?BUBMg^)L@UI z$bR*F^mc%}R1y~UuO^LUmQ(W7BDN6ietaudaB%ODg0K>kJE=9WVGsINv=En;Q>(sY zULb61@Ia-VxyDZ{H_PeYQC(!mzAb7rVFT*ctboT)%lD%jKZu${K~0VHZ#a|qsGNWL z>E0DNC$p_{5E*7g&Z_|p3pRy(lE?g6<;(-5Ci<5rHjRK9muM;kZihIS8)diNYdGF{ zM44+rxO0MoFNT7KQ#>6hlSj9f8nc3$j?6v7p?(Slaj-0j4aNNiGQIF`X^I~WIut(k zFi<*rQ>mS6_rnn+BgOI`I~eq)liPpmet*k5dYsAHzAj~vZhCh3sH+0-z$6qifB)@5 z;5p<+(&)CDls$jw>lPH?5gVrNYWF(zxu9qsxbgRv#9y{tFPo)4g+nm) zRvEuPE7;jN6p8QuhtZ+|+W>#%p*eIq)S#Ab0Ur3ao5WVZc~+8s&Seo?F8;^+Mzbn; zU?NMf`+H-Px+3fiI@7Q??NZA^B$d*$Q*QMN-F&Z~fm&^FKnk(HXpc7y?=sb@WEhcu zWRII;lwCFptK>z`nCO2yZUkOlRc+j?p$8Q<9cO!DqyLe)mqHyn20xl%e6D1CavT%1Ds4!P~}$p`i# zZQj2C>G{Ky2_b*7`z5L*Olk)@tE_ex5sRk8k2(32*kp{t7Gm4%9M!?!RrF&{;`*q^ z5E!xGsrgO%nh8DVfaxt&b8M-w^m-%DY}^f6Sz1t)^@?}e9U=}dLng;6OGx^!l)W@Cl_&1tsc*@$7N5DWq~+x^l6V4R__E7x_Z_7&7|(wNGEgk=3B@I~Lr`WSu@-Q) zT0Z3{`A~yWThI=9C|2q<8@yt1HLdS!nBKp%YO4d3jp~t+Js&{HtsnNGblG9_!23?| z%YN!FeAb5jtS*OI^4KF1KgDzjcEG9rG%#3|gQ%|`1;$@r$#1UGNg<*CSD8eS0>M1z zWchi~t*UqUFplb41s_bL}Gu+xE%=>*}!o+oxNYskqjrT-5uTA za%JdT1&pn)^Y8_ga|I%^4{VkA2CPEp>@m5t6!gCEmG-N*IXBF0p9{L9KDSq2Nd{|N6s0YeCjrYO zj5Harj0EK4>`!f~Gobqb65r{T);2x?wRj=wd3ottyPdZMx3DFapaj{@4}Sa>IBglH zbMh+1{=3HQcq^k8kY@gDtmQvPcDxH4Tswc~@4}U0WOiV*R;bNRv`8DD9`i`3RTM z{d~s${I9NW4t3g56CSNK{bFOW7aknZqC7Yu`}HRsip#1+)=p1!ZiMB54oTChz$|=b zrp}oek3c7#P~7`Q1v(luhRNm+4(=T3;4I z3RKi5uKfSE9HR!@ZgE-)G>d5}-(mhiGeY%$=p;+lz1GkJB_GaKv-}k%GN%ynHOPPf z$GiW~(srdH{x)@5Oh%6S!NaZW0sf1+vfG0ZxNVP-AmV?5&*r7t=6{v0M2BRyo5E+8Tr`%p?pNE(BEjoQD-Hd>b?l1|se{SULey;C zl0Lh{zb)5T^f;V8IJsij7_-5D-@F**phH(!GG|MUteQ>ifmBXyTJmv7mBDdK*n2X; z@P2J*|Cx6G96@s9$^n>=RCh(Y!UA(&{7%=eGdVGpKoJX9leisorR6REMzwGdLqy$B5-?{GI9Ea_%$sTz8f^Z0*d{A2SIMb0-*&$ zV0C#f>8x*gyg=o+iQOG7Y0flG=!6kXe76d?R5YPqgBj8r#%sWxw|=6s%^nmAXO8_N z+}jV4lGGG=`2caKfvos@leK-IJDUK2nVk{}vr4$fmVI7w(aOGMqD@m(Su2>x^~UW> zX0NT@u%4TL8xGz8ZyA)<&a0!i z5pogGr}AqC91e>vm+iC&jC)qjs4g4ux32gvX~*{`&qD?rzYZT(4VwYjh*eF=)^{Vh zq2ZJ*m`*u?hyMlB!ur?f3E248)zoQbqN&;;vb&d)>1um;3BX}Owc=4-cB0m{=^j4n zBliO!&Tf3|sl2Iw){T2!fes3i55fKH6&_Gd_O6?kS+iQODMtRu@`QVFnw}o7rOO;K z)cM4^9a!N*3Z|glv0kQAF2>`kMU=bvWaa50f^j=j`_207OCTJ@k_V{u@lcge;Zy?T z!H^xEJxAIDYURSQY|oBJ?nLD^LxX2v1Rfe+vF52U;;dGGG_cJX<*R@Z_&~q=PuMS$ zL7ttyNQ=9_=G#0%e<`&ZYkEO z>!gZg{Sx0}&cbOf%|*uHuF+0FCwC-F_6Xz`uP)@7gV$P9)o8ND_eF%{{gXtN~#Ig%yQ=Odj!LD-iMBmU{&W5bFmZc_32a zOJjLiyN+EPhxW3Wr$)IFNK)lv?3qDxgzcfduM)m$GwrAw0|;(7G>#q7*&tOTzCv60 zW4PC>hz!z)MikqFF#RS|av>vcExhQ@s4kKMi|SOaCHa#nC zK(|`x|2pe#smb0TT|gyELIxfu*V@K>f2E~=bUpcawtVIYU?yRVHk0_405w5X)Aze(g9~*$R@`YQ#6pg1a)nH>iFecz-+B8S%_ot%_l_`sV zJ;M5EX~lhKka%%!Jg1>HbsUmaB-_m9c7a;EZPYAX3LS<9j@?6Os>R9L1nN0)M zh_cB{Zg2ts62&}Jq3sQ}FwP_I2DdK1?q{kcMW-s|)<=@9ABoDdA8rY<6I7R?IO=-- zs8_36T7SfQ9QdHub3#7NP-00zwu_}pnDk2825!^WoHvk$?iKN8`4j^s-Uu&dC%ueG z3WVz3BXO8k+Uqfk+h;xM2R&AQ+ywSh1K@t#8+7BsV4$%MMkKhT?_}~DpCaf z)kmCZ*++Ycg;YKoQ8=aUIgziN25M{bh<(!u>ab?nJLeM4TI>>XQ}vY5qs>(>qs&TW~eIt;?S zhx`b+T6FGh=NweNd|I0KhKYZhysjF5IW@F}DA4orPiOXt-0gUQ+PkU3*`)4NEKw_%osW<@IaLHU=d_pKxvDiq{wd3q+in26SgS4uM&< zKd-yOK|VQvAMdAyDkT|BB$PPiY)sKKQ>Du%ww>EC*tVy1VMDQ`mv_PR+GhgexvR$V z;|;nS$|0jO8whcKMyVl)5k)Q;@kS=!DC!7YNL()=iZv(?D>Hi@3?_*B#uDS@=*dQDx8znOiz%*K#>8sZRqESutEuaMZ8%I0_MjL*$~D3^hGDCY zbW*X|z2V@h#92b`hq9k)$g3dLcEcQDT$BZ*kPAo~F1l+1eqda~YsMPAt&^uBW8WGy zTc*b}fM3Ay5s750&wSmT*Z;t4NU~5%^rgEq`A0RQ(1%nFGHUsZFJPXNYk>(%l6mQB zI>)FT4f0-p1M&2S0fVpll74}nDI#YG#KiEELgVyzW)DBZpplvp^F6zY)Xol_ItC4Tp zCQ|A3m%`j^&}64Tj}bj#DO5f~OX2dntd(6SkrS(b!tDSfKB%7&t;4M!xv^>(d`yVY zUOZdcDovEkP7Zu0E-d4(FE%Q6TQaH9Xdxr$;&AozEnh))zbC-lO-II2_IAbS!hH)g zA}GZH+HUYGh0IT>JiG=Y9Z)E7!mTwJdx^nYDb01%f+VytON zEM_}j(pv7N7b$H7+ggps1PdwS^px!suN8{h%00fQ^huUi6rxVUfH9Ti;NDkWJyWZH z!cl%8UKErmAEnl6oH2VoPVcS=2dd+kNRUIvT9_o;9JHs{2cCks>Z)pf@ z07-6k((f;=o#1}WX4A91PD#0NY9Y6OogOJP_kKt86<~GsRyUQlq$x|u$e&4AJWFQ_uZ~1*#}RiWPXF677V1*=#EXu+Yu-v z06w>xDc)UI|GDh_1FU#pm=G7}j~8o%f^02@WE#>gmRT!iKpE?q6$3#W=Z0DTpVhoW(*#OFeQ*148_y;gZff#N{ZK=4mc z;vLtoKN%nE=bY?ds*b(g&R}9lSt+1w%%L`HYVbVU(Lu7F9=ZPL`mEVrx9U@C-~Dzo zd@)PeL51csdoRX^2DYZwed9)lz%hXa(og%qUhuS|vM2q9q7bF&a^idg+*&7-%p#&r zF%aSetX?3M+5WY~HhN%xs06OAoe}sU1(>E!ptu?B72_S3Nm50#na$+jcrwfJh@!nH zNUstTLMI!4T?A^eJbfuk$rhDEm5Q(x)3D{!5|@8aRpY0Y2V&yO^7d1|-$BzEGASwx z;ikXogM{+ygn$_i*Pv;lKuhj&pYDiCmoYxXCH(O`v~nG0Nj+aN zl}eAc2{rrW@&TQaL<>NS(oA&;_{1gF%H`lc67~xsV+Bc9aV|N^V}{G#jHT7Y`AaIZ zbOvJpN0*SoSg%cF;D%8kuzy-`&sF?s)f79@uZ&%_TM@^$xH2^HtLjxN3=9gte)`1A znBe2h*zGoW-eR49JFtq3@1fCf32knrJDQerB)xAje_Cg%UK~DaXI0T7lE0zUu%1L@ z@P{tIU2q;-AC&s(|9QyAU5wvPJ|Wc@=8U6X&^F8(2sveIThw3N>{GbvQowcGCFbTw zoO#=bCL)@8j+KxiJqQPgi#r;+|Mq{tHo@UL zm8k7&OWlhPcF7Me$~i{)@^zDc1h!H@>-Bj9j9V?HE~Gm_&v}XE90$jfFjSgoy2>(Xls@Y;*AxV@tEu#F2WBs3B`){Z!)1A&DxQr zw68|kFV;%m$yav+G;nR$Fp$Ts0S#`~2e5}$lagzSv(0GPw1FF$IFVb8 zs@5r72=Ah2>bn4eI^{}MXs9bDkCAZ!ZI0U272kq?pNG>8pG~L#%z$)Hf4#v!2tH=8 zyCkX2R~2n9rEZso81GVHY|6V`yB;fhO(x^>25XXV&^AhUMF%D6?W)dG8bh?!*KQ@tw;gV== zUE_^^^?)ZE{qjM*(XnakGyb66F~=ChCjIyE}_Jcx5jRAN53!bK*XYd z&FjAnrW-OUll<+^^s#p_2b+-N)U*Qxc6gQa6xW;;-*3G8HArqrJgAF)h^rym&r^qc~JR%N9T=j4| z_P!lQ+{l@0d&!y1k7xtfjDXR@KCmW#ZztjwHLlj0XmoiD+yYf31_=7#k3L-5<)RQu zWL-_cl97x&IF#S@1A3Zk*cT_Sa9Qr9GY&|X^vrN%GZC(J#70P49bba~#CsWvEAu#g zX<&{O2-Dq_G%wmo7d>*^!YTlnV#N+zdNGVe6Q)wsf_$D&TO9=X*=q-r4PW_xO@Y&G z#Tr#cOv?2_XRumn7%E5>7DkK~?mDA+loD2_$@Ax(===VcA@2PYODVyrql=2XVO+8-{)SQJM zIoRrz8a*Z%5^CMdHk2?b-a##H#=cZY_TU*U=0|iTBED~AtTm=*MIpa`$#t3RINQug zPVdn5Jmy|eX1^U*a1U#xEGYX*n z4nQ(Nq5J%toUN@p<7G z5qnOd6m~y>rYMk9cKs5w03H9~K^zF6_Kd!8~+sN3C1V1kH%&ZZh^15`i4X#tIQGfb0@|5z? zx&XjI&tUPU^ib;P|J@jUqt5Zq&ssDb=bzC5WANd+1BJerL5!1$p6!KLsqsd!X|u3K|x#U--v)dU`*)~f2f>qhMJ}>N&#$v z>P`$F9z2eEoefkhTMsxlPkphP!)NE_F9bzI{HDSFebQyE<`oqiq{VXKf@!zciMokX zuKO3c?{;hU(sOYkmGt|uZZx$!4W$+$hQ8g=O>TOBDX1utC2D@N|Eb!94AZL1t9@}Z z{M_jo08bG0a3X{D_79OF2HhXNvdFSJbHw8C+2D;Jy=Vfdj&=n46$$0RNlpN_7pQL% zX9A`1z_=tgiHLmAx15P5^1poLpZ!g|02%umi{XSmSW!6BE_z8zoNff8)1sHUGx5La zjx0le4`#A32VO1+eg%@%>|RXw3gotrx{VZ6k-*2H|Bc2bDQ&sjw8tI-T5P5>G-YxZ zR}QvyQU}EQT=2n+wyTVY@~mlBwpX&HRSII|ROZ%);4x`3(ntzeE!Fl&EtWpt6rXfWA{o7&8xTe(5w%OG6HJQstE8T2=nvCTNo~K%dx75=f!+;(p81gwg;Kc2{ zp!mBrx2MM!o^Yd4@!7HZg^&fK!rQwAwmZ+O2$RiPb6%g>CVnbA!UWfi$gzu-K` zMQkO1$PGzDq_)8bBEK8HVXj;`h@&NV6!F7S=>MF-Z8XAmM0FLSihfQ~_NQ$?9Ftyu(tMr{b*$q>PEU>wN+6e&BhdlKW;Igkb^o!ZuhvnW(8t6kwoL_8U2h-)P$yf`)|;MXK7b8)O*D~N z_@W$Iy;%P81^8ygN>~0K!p7A_>&GL0a$N07B*rlwofm0_NB99^FKNmOuyT8U-v{F5 zqD`}xS9(m^rOR#gqb#T@Q-^9jU}krsrAPGq_i(q0*x}=5jOG^fQ`NLSZsz%BKGNti zx^C9niGmuKEQ=;u5Eb(==Z=oH&qmI+KNXT2YQ5lv;~E2lnn65?tKlJNKU0Dn&acjw z5duzO@6Hc4v-1+5R4B5XQ2~#CWA^M7;Fec9s@sCn2=0rE0-Hg2`!YD$btDM&>ZW)y z+Te=b9}w8$sM>r;e+f!P08FF|1FB#eXt#tg@$dqB=6BhzW!T*G|{ zlm~IL!*hEhR+~@-&6F~G!1?>|{NP(TmAcIZWxO?uG>E zBX!{9;AKfZf6jtzl-|hCYt1(n^TnblYpG5vck=d`EcJwKt?B71Q%Hifcjmi+9FxUj z$pn!sAEDyok@FqLE;jmq1nLC3>liqOv1?$^x+`xS588_@ZWrJX#$>n2< z<}OBf=Hyta=Ut;kVov6QE&=ng)Bav*NQZk0s$51o_xjk0!W>L#=*p;>Nio!YveQ0X zTg-TlW9u3bKVYQ(wGQfe89{ghNk$Pv4=5dw*V$22dJ*vUbwIYfuw#fj{m_ zuv_!-E$TOPf8e=A;sqaR5@f(#xO_&6y16vo`&2*bDlQG(s3;6?L+e}H^o|+%C-AQK zKGXnW!XJBx^{1|)umA=rcef|U#BzN^_0(B|E$vbmuUWo{X=%aesS$9p^(8Q-s(B@< z0VV}MNvsF-C+OpUVcTh5oDLV@beu1({d$J?)UIcwlvsJAgO@D}Py!9zn+7Qt>dMRlfp zt{e()AsXX=q@8|VNc?KQ1BP@#M<;P+`Oddpkg2_CQBqL=KMyhxb9ZPLj z6#LJ;>JD~cHarChXC(0LC zP-P@>_Ja=56rm?EY1Yt^LLwYgfvt0m`|sjwC$Zw5pFN&2b9BK+C;W8uww0(OyoxB= zKRET|H%3i=JLKpIO2w_Ha+NRd_uDyKm0$}E7}&>Vo9Bx-0ne6vsI-|jG%5Y>@;q^> z@@QOU>raL;+yw7l?ty*po1RO76ldE;6AVnDgU`rxVVz=V7;uIY@);54!gBSiyvsx@ zbMv!r)E6QE|O*{yv`gZ}mY>T2`N{KI$3{QfIWsEYy&aC+;J~8DoUhZjs<471ziEuWz%olwQD!=*aBgZlK_Q#lM<= zXWC}IwdQGSeA1LCkCHp}SukhJh9n6@gZWu-KYIP)yt`-(X44x@ZYkCV<`>;~W2$k9 z_~0uQgHeO{Y~HwFk+{Gv>EIJT2AYBDt3x*=l-_5jNhFxmRy?4v z^X}A7qa0w^iq zr_78ryeHa8HNEk+fdqq|Zz_?AyN7H?Z>BW>m)i`mrytW&pWMLC(m4a&Ps(%(h;GG8D0ofHo#TQz+cU}TC+L^C&2 z2D;A;&u$9sl8?}1CX4ES?ux~IKkZgHRSsB)a2oeGiflcmaqlgNz;FH5>veW_TSn-B zX=i5_T{}gGKC055?ag~Fx?r&P`UF3@wersqtcEph15qR9;Bz!!>t+JRM}(o9MioJ}JE zW@85{FiUgYuN&NpEyRORN)=vm?_Dig1b)na?cy=-Rpn{TtY<|JrH!p)&rkp{=Y_Hy zItJ;|tyqs4i-_YMwH4nPg?i8COq3HjTl0n<)IrG6)y!W9Nui^@r9jyAvtZ)9`OFN% zr7XIa6FDE#{!ep%;LIJ%du|GDXn=58MQOCOmtx=cdzm*_*2h9L$O4m6T7@c)IV@O9 zLf24IU8qB|N{Jsfu0%7fy*cdq*C1kaxRSwAG-YXRv*)sU!YB~X{e>fa&@|1Jf!jty zGTU**`t-mbQi%!sZJCsvmROdYBO>6C0jW1jMWH$CW1lF0QToFklqv z?8dJ0xhTkghc4S0^yYn*z~x`F6`%)dH^Wz}`mX!t&@@+jC_Gq?ikV^q?_oHyyzT9S ziB2`V{-bx}-hAR9&$N6qu`Z8aX!4RSp}1tvhii7+yf!`FrV@H!3MYDI%;1UlYeOK* z3-YHA$U*;9|4UerNy8C+;Y_$qPjIv3dfVKH7r4xSRRmiRyA>$^gAI-Qhr0BSe&y0e zLNh-`OOx?M&OkBEFVv0!98RA5Ozo0JhV*g6@b66EySgC3YN!SJQ#ZN+ptmI06xff! zyb;46?98$kZziw(2%inpcx?`l?f@griNIRV`B})M46Eu22C@()+ltUq{CaLD44iY$ z*D>{fzJxt}No?V|%`1Hwd6UA$5$>|Hr*x<;CIPCFdPFnWk)osSAe7ZuK5+5q$kH@%caL+=ysjLceqCtX}82HF75d1T|^6$#7wmI0;Wnj(l3@l z7ajhPwDkzYR`=<^>nPDTk+bE?@pU)4Cty$El91N8a?U1f$lsW=VVojt+wE<2!1=tE`oElf0LtNCfKW#elMRRj)oeOBG!_qe zw%g)o)SY}6eT_!SRF%j+K|Fi^E&e+NIRU~tK`i-e)i7SDj_+%MV1#UJ zes4RXA2q$7)>7S2pDFQ-#nIr(gR3w$yfX%}3e!or52O#C))~wVxs;iotKX!I88CN| zsU6Q3R1>Gq}EXQVWw?eaAwLdP`k`V9hoX>8?N9Z3S%DRUS?ykuvm2 zlyZBD<%1@`H z%qldj;~gZrOM5ABk2IC#`(sxr?w*ox^2L28HolQb<=--l+nJ8M4Fh1o!T}Nst(_-w z@3iv4+6lkdw+MWjQr~;I9X_JK#-X)j)M78y0{>*QFB9x!pi$I+`~~BRE4JU2rWT&d z6RrOY=@Ry-MkE8&vkbg~3U>NdZCwk*KbGZXS2kTs39O;9z%Yh1$4royB?=o}u?svZ zdLz%<_TxlyhCslmb9{k&8FUEY*JVX|CCCAnb#3dj<0KxNFBCC?E55Pxq2KV^ptzBh zjvu>a*5PwldYMOmd|8`~Q*{V5*AfXfd71y5^)L!U6=>^C`0GdZ*4S?u*In^`l~?4o zQ6ocE;>Gg}nXRfn>n1AU2^s;3^_uYlyQGnPruhP7xRG`EeX@$pfSZ{ZEsREAC@ru+ z7E(_gve9yfT5FZDhC=GU8lDu_9vlim>~8vri_S1G`5 z7QxcrH4ScF+F?KquY2mLZo%4{N}A;I0f5Mz3|lP&#%-BIJ4-kwL~ON2LQ0Kf#K4L1 zi8*#poqv&}tJ_q%8a)b}NzjsOMWNgmOzqgsw$rraOD;{f;I+Vyx(Thp!Z0$T?>`JL zoLy{Z<2fmRFGkV1SoCKXmSK+FMnWJ3YjDH)3se8^h<3&S$yBmWjxvRoVqL#C?k=00 z+?$5(r4BZX@3pBR0=JwTaA=|#pjU6P>%6D;K#m)hn5}O#hVXvT2(eR0+gutG(f|-bv>?H*ICcP$zm7CVMr}WI!djKr@?vhV#n5uYA0S>dBv}Dw1!e9JcqN z6~7ZYGw~QvGWNlyx}o(`ZDR+ntno?;jd_8L!`p0#U^+1eg@mqS9@`t$ws(0BV3SVk zMs}9NXl-k`yDOl`>7ScC4~ctWceo6mz)73c6{kF8lXw6^;A#x+p4g9`T?nVPKJI&c zb4+A^f2!0tMV;LYs*uF_u}QrnX7NK*U>Vl6l+36Psie{uBTlRHdFrb0FZ7$7@{K1* z3@X1^?JSGNri}{2<{xL}+(|UPO7Mcu7*4MW?AqvPzag^1HLaH%2pu2=VO3-K&C>o_ zo(8`~Ii$Kmk+f*Ui)0##x?>n~5p>UdmyYRwqcab(lp?>d1lglb`4Neq#t|^wCqrz$ zlWFK7UtBi&{Sa>%Gf#*aiAfyACn?PyL@07*o=QX$w(9VRi1aDf#|Ob!Pc9;YXbD3I z5+B@8BK0@5(`paR&&0|xz{<+=_tVQv=_l2`+r%2&hf=>-pF#l|WIrUqg8D9Qc*WL# z>akc6K{@7a3k_>a`B{Ms91nv#g8NjLZkF@}?hzFux(nkn=1yaS_(0IQvfB{;e|(Qv z5G)K3PHP7@D|Y9UT4V*3Xx_FMN`9QfGEs2d!dbXJrzjg3;+d`uDC0`Yu*+f90mgNd z#RiJ=e`AGwju z_UkmoLd!}x>_tRDNQ2f!2_XjRAK_qTg z7fY4^Yr@VI&I?^y2IKq3B``c%swIM#^z->(^-i#u5ng6YZxXF`8Pw zCGfwCKVtosMF1HCEltDzRz|+sQQS)uu%I>{WEBli_J*^ypI~|}S_@ErWfj$t=*0I5 z#tf=EGmtWtaFumi51pbiQIM6R0Dq7^-0wJ|0~Mssr^zqU^welA#0m&rN&z&d{0HY0q58H z>{pM$A%#u$joYl(zNjOAYQbO^nKQ~u0Cr7VTef5$-_n7@TsxUQa9J;BHtHaPIjs)p zv{2IHHf*NN!pk|e1m%g5XWr&eV-p<~?c6r_*}T54!O)u!KbBCLPka#-9DfPFU60Bm z)2=X%52h+tjv$-GG0ib~EK?EfBd^wMpd#_}s2?P%>s0OK3AkH-*dmN(0$cLbg++`| zEtZ=3eO-kDb!2OJeaCd8P`MyA_|JT_f{UkX3wOP-L2_ZcY_E}X#EhQ)r1wrI)*Bg_zagARqAZ|G5tQj`ddjOV}yL#_ofkKV)i zu$$QAf{G!SYlMqb} zJB9g0GXVbH6+O>6=ij^QB+rs02`*6w6@4edF?>SnMzP;WN>;_qu-*8-B?|(p3f)>N z|Gk{WKLfWmd5(TObEFA?kwT;%paS`=Gb%PpY%a?f9tGKdRU~Us{&lai_mu*}i}*N> zPf!vC*u^g283QR-%Sk?jE9!~6<&296o$mf=Dq(wIbFN7mZHQHJh>*|Jys?r>di9oV z7$-AqJx=@=P5^0LNGfSt4S(89gjAQvT3l%UrLYa!(?1lp;*to*BzQA8$2(XQ; zHODY-bXN$ZHUeO!V<5xsiMi#prHea6fC(><;MC%QL1NChm2^(e!+BiSmxveU7YLEk z*lEPBR&IPm%*72|!PvK?*`o-?sQe@4F zl1d;$>78X@3WeatnGU!wp6lSOIYpzu?JNJobaphl*|YlPvvp4JJmHZ$d|4Vc>2Rx2 zx`mY-073I2M#l7lwobik!;EI_pNFBfpiD!!3EITgykSTD&Pm0EUrpaufZ|xe_~{%t z&V#~#QeM{0L-&g@o>#+zf}QWB+H(I}s~v6EU%CCcy{u2J(;@mW8f(Rxvy1J5p{~V? z8<5(W+&(gnF!CHd1}*v-QCN;@g5y~vL8w@!8-DNO#(f^>)J;z{-BtEr)I!%QaR~1l z&75l8*>0G}+jRxp^R7Rc@h1qr8iY@ukrUN_>AD;tEje+b$ikAk$-6I47dwfVO)mY1 z1UnhDFdp|Ne^**Wz(H3rh(jKwel40Y$FbSqrnP?UJZP^Xho#RftA zks{g;AV82C7q70Zxc|$gS}fy|Lfq?)AKA!8}mOF zHc71jvx5^~gzI(GF}BCj!5gcBCpA%j!c7ob$u>ZViQs-K<_kKik?$S;l@@B1FKhE~ z>otP^!i8i_I=t}yMi)Gar^LagXj8W(fabEcAG?_N7tbup6qIkH6NF6A+t+J(UpuU| zV#67b1)YuziDw%9`1!u9F`#p8w9o{ip814eJHpS5SK zRWLsKUuubuj*Hp<9+Qrb@`@k)jG(C@StSa{p&PXq!r_|gPY7K7^{K$)@=gtL?7$o# zW_69ww)7Yf5?BS~@r)K&fBATSyOzC^!B^IRv^$P#mnbB_K@4VJvT@rHtQrarBfuM# zH$4^f^yj-su|!K(%LLdzYhq)o$xX0d%+mnU(^pR^qWFQr(Bwz*7%CkXgbB)DvIOZ7m5OQR{~x*p#j}t8`UP7vvNtkmSR`ZqtxD z&efjB$YXjP!Tne9OiFWAqe=fR?))xI^}*h6^qRgnk6G5IA{6(G{JhJ@hKe5N7KGys z%C<;bcftsGhb02FYC-aUjJ5R)wq8#w_#lbL##Ic;i|}mI3%hooSJOJ|Jt!ustao`9 zSKdM0S7B!1-8|}Iwf{)klISi7PUwx~=NgV);3+qW^&ahWymw>oJZH70&2yTD749 z0_EoFbz-9*qgcjtCxrznmnWfUb@F`3!$58rW;fzUC!Z}^=1-l`3YsQ*KQTgOhSlUa z+?x*`=oC8&&jta1Zq+XOzYib+riu~|3WDX%6ifr#;11@HLO=60jP0+R{D&83XkLhm zAGY?Zv|Oz;@)fZv;xT|za3i3>Z;v$_BgK0PKU=tXmKyU>e=EVU8d-)X3H3@2ws^Uoo5`Z;2k{jaM6Oq_drxO z;fe)cP+;bSfggves*D@A?H+ z&05z6zCBz6HO5@V53M%;6`zHOeVbwNoto=W?kxcu1Q-o0EJBP4} zfUS5MP7x*L9$&j1E1w)#rLR60&NIU>v6}C_x$={Le#;24fdhY~jyE?5%ML8lG;01} z%E+m-D+v0^`?inF3{lJ%!C~t};3X*+_*k_?>UEDKr$qm%ZgMr3p^w9Ye}0mk9KJnU zlp;$|r*L9_E`1CqVeYLlew*j)32JBw0$=*h3iU^d=o;fe+t`^TmgYcc72flRT}y|Cf$91zl3_mfgkyJn|y6{`b<-Ag(%HVwtfYS zJCsDW|LG1a8Img}eZ;oFrj6x|+3ml5@S(j^fiFzTkQmhYTx*#)5d3BFH7*UPdNB4} zb?JE=+F-!MiaM#p+sG1TDs7Gz*S4MUW3HOEaqjYu@?ltsDRq|3s8U2;mp;5T^Z?j@ z_}#sT>LDljr$(T|7hTOsIM;u3baS&=+x9NdB7yRHlSRbB&h;-+%f655eqqkd zQsz+~DDapKk9K+53V)8Puj6xo2zSXWJr=jjC*R24Jp7Vo6suAUSRNYuP}9Kq^j`m4 za80dSIoq^SBcCFttHUn`kyvxiZ=ec)qL>kA=@Ehw?lvSdOm+X8CBSX zLECIH3*gJZ8cUwM19oqhlux2KzL*&au3w!jPd(n$>2fr251TM(w}e3zxL7gnrRDB~ za}9mb5Gla>$bW(ao{q-F;!E_ROd`NQjhaEbOsHs4zJVVZ4t}!xDl^bIwI*ou zv~Wi02^AF`Q$gQ9X7@tC)Pm6N&Ub|zMfxonE1{q^mZX$=@{$uX{;JY8V}@U^O;px<;^odFPRWxwSzzKuNF{x8Feo=h#+C zw~!)V?eKm(p9_AaGUGZv7wwjR7LDwz*)hpZ;^Eg{Yn2{_SPJ}^BlP#_>yksgEcOo} zpuYSJCw;XOUQuaBQLAFhY%DF_>Ik%3&@#nxEN8~t$iB;EVgBOM{$?XKEG)~s_JKm!#z*nMf59n!)N9Lg3dDIFOCma{ z&Uwui>*I^8i~23LBrL~?LGG7E`b0h8&M5dpr$)p2Ro4&?U;J2}YWCZy8_rD}P*PVy zab7T8*AzC-iH&d006&^Mx8AAmJo7!y#b5@k&~nZ{H{G-xlB}_RVC8{zv=k`pRUd{E z`RR33xNPRP*hHz}7kiw&zgZ*LkIU$4$NDnP{OF!GyTa&#eD(BD<$! z)C{eTRh1el@}CCgR#X*@n{bu+8_1V@;9zb7oInMe@}){wTs;BJ^3f)3y(P40s3L*>Oy;f3R?i2SCrgD~|sntvvp@36nICt&cOI!so8#Fr98I zUMXRSyP%RC&~9;y<}Mu=>|tp2XR8>Tz}I|=Q}Cx-e5p>8mow)$@0z~Pd4DuN zE-_E94uFSTx4LvkOw*I==Sy#0@u)jiEopOR8*CE+NEQPvEr6`VMjTtJ%>3fOx<&uCM7$yCu}@6I;oS6h zo&b=`+{V3sAOX3r_6;r^?Kz!jD4>Y9(^$;`kPT!Q0XIvHpsv6djcJY>=8^OKch4TP z^h@K7V8*KLh+~6k1V~~&TUX<~0+-Tj-Az6r+d#}HGGUWwWo86(F_I8qzK2FKXg4>| z^hW1oR6gJkD=kQ(pk7-|*orGjOcQvLleN?Ucf{p?QqApL3?pEh&hSheuC6AQv|=6i^01wG2v_dG6@(c`B%uF zQ0N*FfmfS!y@i)afZ0=l9fsa_=cHZX(rkAgA=u{Ne-SG|$>+fHGbdt8mLQl3f=%4= zjiO8|{>)o>0zvT$;rd72>BA8vL>dOxu+|-o*lxrOL1ttgpP?Z%8eiNDe9I|xlq;tI z2V2G{HHiQJ|74`@+f3#=4g?pJ|QAb)7!0+#s@R;NDqC&mNzrGys} zp3=5re?`4QR08ThOPvOfwau8`V+8>Gu$H(dRa2+sSB>6YVr(DKUE-!Pm70h7FmKvazW(tDg6nG=$UQ%IJ`ei zhwAUL0m-D^bMFgfKuP+qn6@3?oP-??t$J6He-Z4p@7mTgv->J_w;<^Fx$e(C6nYZ% zKEW#F(3gPvE}G3ml{N7Lo8w$`NlIf6y!qV@Mj32N6zh3*xO|)- zc-u(NFz$WDW0@eR%|jVM>}Ae)XnobU7BEJY)fbe|iSpnyLWW zwJ8aiXDtG1X6mhVpWX=^R85t9!*57>?bT$CXSf9JqayPDK0%?vemf!i8t9gep#WKj z@P~iv6qC2p(dKe}|!PA6vn!JIh|Z4UO{a6AQ+!6O04(-@wapvhp}&yF7twg?lOKx|-c7wsc z3HK%WbZ(sN2lBSE+ig)p0a9#AH&jvxad}Z?gYb4YI7rD1m$rSBe{Qeol4B;%k~JD~ zcT*)Gu$W|c&>I{5UjY4T8iXYj1JXgLIsODlz8tRB)9J=o$a}*nr~=U7L0g+HUN#?=D~SMkc}|X!Wsm^$G#ny08PZ*YCnK-1=1GY z=nZf-(_AoyfoJXK`FXn&y_Sv`o36qIvq6L@-xU4gHVjnW!*mr|odf2#WtvUvu%07cRypEKC; z0fH*Oi3JYm7-r}&;#SwK_)%IxVepRm_g}UbvC_=EG-w;T7buHZduIZb9@s>CRA^&% zuXRW|y-Cw){mMwFycsNZp>9JHlWn^w{zzX#^Gu1|h{W zQAC6ZNEs5&e_pGES3yxMurrqMG!Vi2484}FLYAP9GKy@$gWw74uX6`@7IOD9q^6!bM>|cUy8+R=kHuH#e`j09oV95KEVDq9<12lg$o0tV zO8%+K5$3u4@`G(`BlwqPyeh0%@avefb}$8baJDg;GRO7QPW#^!TI9We$?k{KDQ)U4 z@*xDBKQqmBb@mBpu=Ey(tjecq$OrI$X$qp{qaQe$OUNW?c|){{^?}&BQVnGXi5Du5>IV-r`Yhzfi;Du?>MwWT={6NmIMA;~&&JH2ff8;W-l=iU@RjXw8as`U6_m$yH!@MKI zS$JO1@{5+2)$@KlmJX?uHlS~*>)-DM{c-sGRXi6FMCYQMW?}qk7aM1s6VAcaxfF^@ ztN*DbLK^JZcgo_eHpyJu|58iI;Y~FqARfNylN7n;3w;GD$T&>YtpFSM>f#hs{Bvz2 ze^;1%C`!Wr#xp~wl0-$41miU}ofJNpbPwK!fLs#{_udpF5Gy5mnzorbReF6FLCp7L zkk(Kz0Q3?CY3^l3o4-U$ZeK%0gft{Q*I1L;QQ<_*0aY?=P#K>dpF4Z8W`tq{o?Ixf zjA$pCTTDp*2HDI_aa05pfe5n#yq3}xe|^_;0XiQ)yVN?M!4FbwkB-W@N@w3Y!a+>4 zxulsv*0?obTR|Epx0;qxIo3k{NTT9q`h`xnz4ATvpx&oQhsZ_{A3?XdbfMJ#GdHn* zYc)B)Q1}es+Lc?p;48KtELjliasmS2AQ)fc2Z8z|n+~;_jU2{?l!7HcC-U>Af1xlv zf*@3blQ27;LlPHkP`;}(wyJr3T~~*)2S;|Oc1G@Fl-m=jKhzDK$-avoh_;u=9WPRQ zRB(rQujfH|ZQM~zG~SDW7@(XpS8WM>)q>2J@KuqrwO7nJu!=Wpb~rsvV7?YhEP(?d zoE>p5pU?tGN6+vFbzB(0(?WUZf9Y8eByL^AIl`(n{Zcd?SxV?{UqRDFYyo+s@;k-J z2-oI!vSO8lqE`NJFXOJndS!;K)}xHqO#DKwsaH|pru*mxM0etW=mU<43`8H2CnbBF zFH+S*p*&DUSz)F~RaWTzCD{7rND*kj;Gui)Xa83b$+a<1G)xstBY8Ebf5721SsZbR zo+$@$;yLFi#yG)^&~v%d$tz-lAt>)R9#`UcCRD6f72L_Qi}`D>GHD&zr}f$?`Ona8 zVvk~3HxH{u(#~}3R>yDsTR~HDuct}V(!|Kw@Cc>u819Ft)EWaRBuX3wX@e0akXNWB z|Egh|GF{7K5F90z$9*<7f8<7*Ic&|awN@UA9Tv73%W+a`%WhK2{LxvEN8N0)lJ?~5 zNAFD3pd%S}%Hsh_OlRY&J1FWHQwP$e9>se^&wyX59?-w-*6egn-AVgJ}OC^3m`A$K>>bbeA`r`G=Bg!Qlt$Q_>+eh5YFAk)|lQW2V=D02_*Ndyfv z+`E{H7~c71Y;GD#oMcR*ZWE#-^$-^bcyC<-QL1*pdlM*d9g;zW0Jx-N;FTd;&8PRw zSb*+{GO2%3e`R5-e*O}g@0_CGXnN7JBPu?jv0p3|hgZTCn@>wXhy%o|CJV^JpKrGR zBEoH7h>J=VhsXL_ovPi&AF7dVkA5T+zNe0;Zy$(te&m&N-^?W`UGW1CGWtuEa;o%*x8a1j$ImzTM?)nr=0I_J zu^mCRR|wQYi5?GUF$`aBjWBi0I6^y>vn$eiAlEcjVg-CzbWkBjBuFT(1Ya~{aQp3Qxpd5?s zf^;?9Wid$hd%;__XPf?}_2y-KdIg8$eE$@XAeWTd=W$KFTzbceYY1mvY$exFAd z3eAPEVzl>vI>S}cK{B(_QTFr^)^RO*vj>&{e@s$OKFSW>Dc)#1APT_7e9M}!j0XIz zhAH4_^F?AX07QpmrN~=KuyU9VBa>i1F}8V&Xyr~j5hq7FYEKV6UN~OY%|%;-w+f)( z8#(@8j!m%So@*OwH;UPqqSlU;)0rrI5GSo{XyZ@KXp&*OND9mrY5o>p1M}E_x`4uq zf5|=fMK=TvV`UMK7r3QBX%vD6d_$rjtCu}QY)x}wVFeab3Uxf0|);*dc z87kKn8D7oA46D%AYlmVUI7u<*=o({Kzr_eM#@0<&lgg@uT1}&;Bf=fsV#rh^-bfU+ z9~om(jFr92URhZEjwI0>iLuFqFB%+--O{2?f6$xzcY87`~-c^1tGv9%p0+ zj$T5XVmvQddH8fFGjJdE^1}guhDZ3@^qEX3JB-tx#R^5rvnIxy$o6!RBvZL@{PgX>}Pa$SHHpeEnNL zPi0=H{Kk_IuIfb$EVhTajsx9=J0h{C6ow@r0p>EROAF!lu&c}_$#IyYe_g{Rq2yZ{ zxFiT$Ugn znZZb--0!8Cn>UcA&Z}c*9*f1`8xjPWZHE;`soeH7*sbq#=2|ylWqBrk$NJx`y|&Z3 z*RehN+$4cAGXRS>njgCMe^ZY^S_vBi&^z%u@>Au61>msJX|POg1sd+a2RuS(I>kB& zjARVXGrYK<>vR$jw98IM3pfGaz)>L@4|!4ZjTrHLZTX(2*BWfl(oWZ|n`^&m$J?$d z7VFcA{^4@VUBL^0!9TjH}XU)+3T&>5>MgWqiCYg9r2>8 z?B4Xv!rTOn<#c1ce|>tr5DAQhM7blzFgmc)-pW5c92Vk3kVsBwg?k({EPt^`7UWbh z8a};HCzs<&1d$DNk$LjPwsF)zN3_rR@PH7IOh%~W)RC;^T+0CACSKR;Q;Bu?Fkn{5 z1u|p1_&vF>Pqq8?6j{ZFN=y^Y075kxp_p!C&#?tMEQt<=a%zdN9gT|9cyh({9GfTU{7#aJ?#2FkGmE=iw~E1 zT0Z=_!fih69GS(ov`+9_f*RxDJkk7p`tdX`IzsR zr!iEnMx!~lNj9XpKGLLiBH{f!d|pxn5Ta$@EEN!fXCj`=4b-1RoHQYx%D}{mpM}Rk zStmRY;Hl|m#QLz-T->+vnDb6_^r(;CKrx4)n^Ffke<`Qi5Emo z0`VWy!7a17Ce0qmzwoAvSkA{-%(;fuD0Nr*Tm~I)VRHde%eLHwn6kG$3j$R8;Rc=S z;oYZh-uB0YtM7=SX@VC9wlnw+UDq4GRt(JB+niRPK-DrFx{*KG{}QS>q%*NY+JY8h zvNp$we--@Z%$$F?0xR{ieh(gB8*4VTm0wJ}&0fLFcb_n$TNi{6-j3G2>$8i(8%kMT zoKbR_n`gumxeGxnlm?}i0($c{iH~?wp~|Yc;Of))OBuT~g8mbg{MK`$gLgrR^=T%E zLWF7zv?hy5ZuC=NJUFgVY`+%waoW# zjMEVpDK){ucFON3p{8Jk>1Ky>v>uZ&#sWTf%+v}c{st1Bg1&~(oT9rB4ZG_iJKhdY zb%mLj{sZ@-W&rNud^OyoUJ(6Mmr{dif7by%BOgiIf`WZSPc?5IQtP^kRwMp>y|Tw~ zT?^b>0ZO43&X~t!HvJQrw_eV0o%sCb$9cI63Jjg*c%bD`$KB;+u`cR!h6#>O2l9f2&9X@qMk@IyrRx zkulPoU|V5~ng3IxA*p2QLm$qZe=Bz@S*0+e?r)q;Sz)QIZ|PR`w*wZQE6}<&nbhLd z;Sx||W0NB~D{PF=%1kqiT({gX z#cdW@FFE!;YMn3#c+)^znsus;i zG$D3y*GyA4TOb_JYaK_Z0?c}T3p7~ER?;lTRw-R%B4bnJFX&Z!K@FG$APpBSrf(?} z^WHt$%HJ+HIz<3}0m54Ne@|()#2kbEWTPwdKnfunzLwsDSS$nEm@|EwTSCzG+_Qbo z?s`y{yQ#yYc=YA!%GbuX?!{1A)(m!TwXz@@Tx+wpX+gf7 zxS#4%6;BJNg45QH>=}%f$#FOCEVI%t6!GG5hgH#kRNIpzI~c+PMtyELTyE^V|=5BrK`y9ZwlvC`=1bURE)FWMJf>t4BA zLVoIAS^^J^nE=T`6rzKf3FApaNVr&KZ}uY7ack5-DZV=53Omyk#2LwfzE@w?Y1O>- z4%6>3N`laWiBH1wO^USk6har}2?Lo?S9OCGXT;C%AL&Wvf4FLXyUgGGdKG#&f!|uj zuCo09P5-aM9YPB6p$pd3E7{7lxmamTw#>A+%NFoL8VN2ePyVZMM=+W5{OY*mkrwy%vx|1BuNeSE5=VUQBMPg9i?qpLe;(QCWE>DitW_EW4 z_uevUQE|Bne>b+l$@1VXq`IT}^hedQTe2s5%-(WIDz9GO9^Km%cvubg#Aq_A7KkKa zlu*$?fxgG&!wvls>SY2U#RXTmaWFbA{-4d8SfOU1T*qzO*pn9!JufW_d z7HaE4Cmj{@NP9lCsU4wL`Rz4wTU6b#CliG!w$B(Qfb$sBt7JIkGQtIJi8L=wpphYu z*mx8~f6+ObE5uL%6pxjKNLk;8_-UllPoqR*^!Foq+J55iHST&)DJx^a47&UG*_)7f zjH&eG7cr!!NBj@tQDK_qb+Y|4rm)(>rnV?c=#92EF=;UdA!a&l7CGsF{hg1b<$9k%G(szaH6BGC2MyQIiXH#0t)7KBR9j6ZSWu}Y$usRyX@poeShq$~U3 ze-(~1V_j(GC_DI*qp$!Ga7109N+R21;2Y3bD+&};4xGuU!8Nwu`mFenve!Bov5Po? zAm)--xT%>Lq?<$X+oA=}gton9i93*^o+M!MCMQzj7TzCc&|K(-P2TUeA;i96QvThM-m8LY(!;0m|`LM}LdMe^7nAD6uFJp-ptAEex0qbe+B?rbqIS^3Bn) zYw&et{9COYDJ^zeonPfFwcgM zR=*~8#6Y42IcaI~OZ_6iuTA&s_6ge@E;{e3*3Qn-W3Q!c28~ReNjgMok&TIKe|WyY z4)%62tPWB{xZ=NvQ-7Phhoe{zCEYRi zOGbYo9ZNufK>%*g<)LOiJ+>X4|ts$Be79(4U zyb5YVB2FhgXhGN|?k`!=MN^yGs7!VH>YeCeqq^DRVsi6FdbFMWUT=HHBiw(U2vw}J zOLh46$ADrQ0BQc^m$aog7tOPmWE~eNo{sVZ;=sB>Ha|x+IA~g8ZK~h4f70wdc)R?r zFAh7gGISJ)MJ_|54%9;>0GQfMFA%0!a{Z%J(+DvZa7XsAMrFmoe<1jf7)Saf)s<+< z>jRp6406<4aeSoiv_F>9!kBm!gwAy9I!K;@F`^;1_BD9IcluuH&YTTqYP%jtEhj|Y zAZjB4^zapq_5SwSxD0Mte>{HzFXS~7K+hSzed1-?A@HP=1Vt3aZbdm#r-F|cElhMY z7&gP=2A}sgZSQLx2m8(lZv}va0uXZpKO1t^_DDm!Zbx-cK$@cgQqq9WTC?@z$>L_V z?ioi|Y&3WFjDd*J!GFDXlh$a*m-vp%VX=@0*rMr)DjSCvX|P0Mf4@HbW`W`QhIOI7 z;x(;GEp;Ol6z+g&c1w5KB}*?9xfOXtO85l9Qe#=`+8n=dG3kN4-sv1=q>NAL{6|IC zs#J5|$PdAMpOvPts>4%7ISTXX#`Hv!D&5no>3n1z+G1U;#$*8@)^d2pZh^!XMS=7> z?90eF?cL2!dVuNVf8r@Pl!oI+z7W=Lcx+L8C4}>t_r?IWoaWJl$|;#R5!GicA~B@S zNv8Er(V|c7NAQ(%sY``dtUsa{+^$~3e+feW)E&sRn;m)Ipf9#s=|m)48SlN z(MN8ks*zUF<97CQ`Y`6LkEjZ}6S(ooxJI1m5? zir{{P)q0{lf9Ny20dj;sSjiEx1~3giyxIys4cwuOv!DQbw9UHl8B}sw0;|WdNymSQ z)!9=#*(3qQ{u%?|*jxbrJQ}8KLZVBUQ0pyMl>~GPuO+llR7_()IJe?*uxamf0vW^V zyf#w0PGsrY9@E`@ljV9Bvx!C!5Gp`pEJ_1(IDJ19e{LH(s2LW$5uKz>yOrdYK+Vums4@52t z|CH0zY{#khqw!>iqO(hX^yRN6p@BcI)uf(Y0afOeq=2f|HdLn?xe4@uTN+8VXSfFTj^$fv#53>T;`hSH?fCtxXX~5o;VAIw9#(6Aiaaabgr7E?v9%7GU zo;T>|ulZ&&2E;DKb1#Ro@L~OFGKGWo&{b@we-((bIYQY!1`%L;x7p5WK29v4ho}hx zWydw&iIv#8O#H-HGoh0(0`q+HFVx?eGc~gAgx(tG%c>|mJfq*?E13BCtA2BuAi$&h z<&ysUo!h=8VrS?m^8rrD8_`d^B1-o@OE$o}fk|cM3JZt=yzu+DI5?ne+u-79V2G2p ze>Y?Zt_XBf8^k^J{K}U+l%nn#<}9g|)YTvgDuZFB7Bv0I_`lqueLWd9f-h*@W^~vr z`u@$bqhJ~AGc;(U1GF9I_LA{_%RZ+{nw3|8qFVFJ*x0<%Kn@e%76j_20ezA`ME(~) zv)~@^7M9{=Gcxg*z*FAVi1FPGQVAH&f7`ksG`;qCWftq-B^~bK7;wT~| zL#XV7w|%;SDum_!Scn9ODg?=@H1>4v6v=Uj^;nalS^&$c>EW^*_y+gOsCT`MF~s!z8hCFu-b|aa23!RN|%__@KVni!Fp;BQm+8x zO?y*p^J-=7?GhGqJMm*$MUo}S8#^?u+u$rD7zSzlEhWyFTpzcIfkO_&Dwwo$zo)i- z$DwcN%&Q1+&7eeOnVr3cHO9H#f9U?_rq|6{$Tj}Mg;0tntLhkdYl?EHHl6Li`G(E- z!=ZAWp^72H-*6N~+ggpZ!&*`5#Xp(!wp-zMnRa$cbKQtT%>ke|_=z5efLqprK;ggp@7gnp`-Wuv=D{5_Tf9mDA9Lz_< zEd565p!6WwI1{gRlIr9MeVYC8RmMvT zrcjz0%y9}-itF~sRmsQC3!mtGz+Y(ctlY3SZ0Ow>t^c%sxmRLQ;c;Aqs;gt*(Xg^K zOPw~*+==S*b+Hv`GGM7Te^&w7L8`n^?#mt+obKe_B2zhITlm**3VUm8G&Hn#wo->@ zbB_k=j=s7I2W$!BX|+}-pgBLy*qvZ98fB)H6j6dSu0E$b1CK$|H_c!HNfnanEXFa0 zEYzU~8V&KowvIe_2xc&Zj@=1WyAD{6TVNiT%f(zn06Z)}IW9zYe@M~Yg)UjkT@ev% z(iEc#QiV^$FODH>-`yx`@aectuJ{Aw>eyHxK^~z^8H1~oAiBcs@^`wK@Uj-a&L^IH zy{&pz5?L1YNhy-<>smy28um8Ts!GDcM^UeHR2Itj=_%_CB>rlO*4-Ed?YZgDnicBL zehRK4`7a&lW0#Zqe`7BKvet&@WzgE9&>q1^S24*d>l}B=gr%LT@%$b0jQz=-Z}!1V zeD2aL`XD&^nH%GUB8S>HDIEwL1fo4xznxxJBUYlsC0-xAYylL#=a5a7d}4T-{C@_h zpgdvaCQ{4&nsx(*E$d}L8(5Q8!+@M%2LvR(mkuaaPa>S>f7g~B?3Q?U(lnF$nEEt& zw4v|0C~gwz^iRFc*^A9T_BA7t|J3Kjf0{Ht6ry18@JU17Co)X)H`^FBr{UcYgx|%j zQX%}YVw`PA$2StS8dL-EhV(QJVgOsSk+A*dX6-_{GDCGfrEHwgjq_-Wa&NM#TSVS4 zbv`mJkC7kvf5Hy$c`@nGs-jH%;#I&|PLa>H9TGedvQ+sVS%R`aeN}2&G#nFw2YBi1 zPY`hF<09pZ>gF9Cwk_@EGp6qzAUgqNhME3?Xiciw!PZv*H9P5q4r{rpaBlKh9-?QG zKU=TU0;xV!QitvfMK@~xKZ9%tnw>XM_hPQAam&rQeEj}w{+o_;XlTN`j&9pe zs?E9Ve|T+$Gc@|FsvnC`tsba|mMMHdowMa)5a9PPtm007Br%DzCHYLF8HwcO%(y-#Sqh;p(U|J|)uoSp~sfoq_)MF%RN|Ecy)0w&}^V7K`Rey$|^ zvdnmOtxo2Fvk=nq=<}rQI&fQAtJW`C+S|s&{l~$EXnikk^PI1hsj4FRtY5qzbR3FtVFU09$gH z(lqRBDSfCC%x!%%DfG;>5jq}3a_UT43%Rjy=8u@snHRrq+Vq6}v3~nyzxn5byKfO;f*oe$8qc7gI7d&}1PB!N$MSl&8H&Lhg}F^(Klutn7TjtxVON9; zeV{G!c+De_b5fKSN4u@GiIDpGe`v7($;3}{+J!;RDf3Zz4IY^qek1|hsA?V%^We+AjObweLN2V^^ci%j2I@^GpUN=6EarFW0(t-FnBntAb!4pwHV! z{r)Xz#+bWH{vsijWAJvlf3B1|76AL#B|T-vG-QJU_5%JFFvTXVN*dQ*a^tw zY|I-RuWH!poc!-=&|y3q=5BvmAI;lSUyQCM9OM^=YPH)#^C4_^>RfD7x@g>Wiq>(s zS8D#~L!o2QT~H$f%&w-g^Lg@B0BHOXYc*IdEBcJT;dq5Ki9I3hf22_Yqr+EFEyQVu zt64vrTgtD{ECy-r%OUJ7zev@CZ_~5sQ2J|t=XL+&&!au8Kk32x@^`>Pxub62nuGsx zlZ%C+;O>K0;SnZ2y_Yq-u+o6|54gnMqET$JA-B4r2N)^OvJ0HJIDc5hI)#rf8qsM~ z5jb}s@tF)1Out+>e}%pr;YYCD{47OT%u!4!K>a)c575T)T}LTPJVmOq{@^>P>euFc z)o^;w72UA+UI+Ngoas}Tr$zU9wIt!o(^ETot7?^*vN(2zH`R;ggXdN`P>aaOJ2&;% zR~21&=%0X0vjla4q?X8Ph>-k2{I+RCx2=y7I=lIy`n4o&V(vOU8V-DK1C>2s&;&mcFr))xbfHlPGZs9R5p z^9OtkmDOI5?ko)?CwltXVARlzJe{w|nhsI#wt|l(R+P9`t<6qJ#%S!RRhZhZc< zua#F9X=yr!r*hUe4S2Pl=X+BZD9`=}+Fup5uN>=$SQH@CO9 z$#auB5#3_|lS{&+LXLL*>4Id2G1e)nz9;?GKs5$5z<19q-=kS@PBW5Pv{Vj)tQIad zf=-#@e{UWrXNqAa;(2G=9G4=5VU8XK*D|d@781WVyu?Xjd^1?oL2$R>(pm z+(oJ#40r(`5{!UVR!4M%^s#cjM#!)9tPtxM-o;Et1bpnPE2C~fDP;7 zM{fSSyjQmj=}9oi`x<&WC{DQK8x=FW@-no#tIF3|Dw~3N9gd1*LPy6EcYKM2=idto zf3k9!NJ4M{rXUHmXcU7iag$lRyOv$U*`rurZ+i`0$&$hCMx*(I4pvLL9W*GLJ1Q>e zA>EA0&4qB;a9#1om(DSlDk%!|jpm`=^N${YBW_L*zx{oyy)60g-zLd%I5It@Ksio9 zv|4{fN&vEvbHo(}pw@PT%IYIilK)C6e_gn!C?SHC1PqWIpJmneh(R|f#Q-4>dz0ib z%i`~|$TcxDo9LS3Zhl#?Nd4BR11BEZReTX?!M*(;1AYTz+n-9@lZEr7z6h8;>Jd3# zS7`Ne5e2M31C?#>C>MwHi6}J{U1yV((Y?_H%4z~`aI!xt6W59|;1LLBq!~TxePigT&hZ z667S1YU53FAt05=JXBw`?Mgj|mFqyG@Ye0xh)mowm*3cO8&<2!Z7rxSB2+X;5 zI+LBXur}y55K2ea=Ie#WIemP~f5h_|{P@N;W}a_CPu(0jh~@(pOdWLI@S0BrOF@c| zb0Kax(}dDU^2{qDF-1XFEjP=JJ3HVfOa^cki`G~MUUPgugJ*ThefA48R#v;3|o=5%FkVy@`cf{>xG8k~;_Wl=09@(?Mu6A;}Htn@>P zI0{i0l8m3%9$gH97egH6lT;h$;dGNp^A5-q;QvU%On`m0QtWfJhG?=j+YBiqcnKy} z*PL1-?|)n^+1zRS&tnnFie)bL^u?_mD4s4=#08UycC&DNJ1Tqf7%iQMg$_McR2OF;QO0A zFo7K5B*mNG&=3*Wd;&cg`eCoy^@2Ff zT-pDftH=M9HD9;)yr~qJ7_5i^E{49W#thfL``3Rpf9K)-vd7A}%_!i2hg=oeyTkEc zowrjeM1r2Sm&0xd9Zp%tvt*qHUAx)pmHQ#OeREE_HpmHbq{P+1FQ|>+ynMT^SV+o| zkZBgn9pc5VZed{u#XNPh`W^{ zHw)}NeEC=NY3hETRaJqp3qxqq3kV9J7AY=+b7fM=00m@IiMttI+`TXbe{W=HoT{Jx zFw2)xwun9q;do8@g4*q+bEt45-NPB5bWOm0svhRA%@8D!d0iDLmpfdpVuv1y1e2DI ze}6v1oeLTbt**GaJ&l6#mxA%9es$YB3c7NGN*|Lx3NJ&5W_%zQqpoQp zQx+gP(Y5oX#&RAWm=1u5W%B(AjeB4Ju|@i6T6n?#SYjRTzzUtz5d7O^OmTmmhOZo= z82N4T-98Dfb(H5?C9&Xdua-Z$l97NC3e4DYeK8WLuzM-{TlfRr_s%BUO4^`XYj885^|@fdXlOk8;1@Ms9!KH17@28P~>W+Rj4{vc)~@=vT={v zy42MC26&&#LSbMx-%n>-aWp1LQ$Z7SS!7IjWS|4Ck@eHVy}gU|zlIetW%zTnQ)p=YBvs+9~)-cXdOQlNe2 zufZm>c8nvYs6}NWBZ!FWe`mki?>GzeH3WEYB`~ei;&B9yNQ~p*mOsOgE~}BIgDe@u)@&9}_to|!@KbP!1ghKj47@RCs*!WI(n-Rvx@QeQO2sgb zvy%;pL29l5Il%Xjq->3>c{n$~Za_p>qcR#@i!Zpw088<3DSzenbq#BNZ|45-#%7$5 zCWCU4DH9%)McC}Je{evaFa%`2CSC!rENLBax^CmCvniR{?Mk5?R)A|L*bb4J-$yC!=kUun3Kf0##g z+T4SLT_@{h(jho^YD@E=1vOYtZwPjguIN-Z?x)N})7xD(PIGq@kOgvq#q^u}(n<*o zZA2o&sg#%efA0R1eU28oc)VG?iZe>f-a}#B!M*KU#8KjOKZtI{86_>1-77HFj!{aF zfR|bS@QO5c{A)y)K+3eE&r=rFrrkZH9(RZEIpy@;0{rIz#%z)!QY9^t+U|-@Y?9HK zGwMQWS&9ZhFD2eyFpbKF+S+i4;1S8mX^uNZ|DGth9##O9c6}|Or%aPkp zQc&PR;t3T;yoV~#V{L=2wf3#Cb8fl<@umVyj%;~-(v5Nw~LHMmI zNN(dndw^q(RIP2bW(zI$+Z0el4MgPCsoSq#Vkj#oPDzs1$0YlczVsS=55 zNkCHwlu!XYXw)OevhvP7}uf;y5#DP-JTOSJlh=L*HLI3cgI`kl@zItV3h ze;F8RrT}tBrb;?;BW>5lyk5Y##nKY2V{LK;K=4S?;WiL_cWmq0f60aR zPaw;b!08z+Ro^$$<|eB#a4C@jLD!y+t!oBJs)d(f7OO~nNsu9k z;z~CJivoi^FXom<81DwK)H`nbe`O#*@ml_&!Lo2rXRV!9mhZxQ`I{J--Ju=?NW|kcKNaF7 zJ`uygw7q{+Ss5qkk>ke*cJvi)Iax-gX2hqW*M)bffz-e|$36FYZ;<5Re=}T*Hc_Lp zYSyFwRj-P`K+YH1c>teeEeOrA)d6gJYBe|i$ZJgDgZ(3*)<-c^G4WA?gNG}JIF)$n z@Q1>&uO2kH<_d31f*Q9J4Ce#qn@LD`5G~++#q%V%_D=ml(GcjeOu;cQB+_JLy8?i+ z3S0QCij9ZMCjZ2&f5`HU_03kbU-}8*{Mr1}Zh`7{fftS zS4s6)zXZRSMzrK&`@&>ep_AIAg0Wo@4kM$QLr0+_-|aqdn6DfSyl%}()~g+>#`aYH zV_9!NASI?AxL9jZO&sR8Y?o$wO^o{+cjPqKxJ#1PA1uiQ4tF?Ja1tNpLJ z|KLM4mchHm&E_EaF#y`!EXnwT@_v3NO{)-K zZXEAG!WJ{20f*RzC}6rIpL=rVH*x{JxOFU995QM6X@9RXb!H~uq65JsmIOr=ulX!6 zeyt9VBAwSP(dZ&=4B=EE(f$NOk?>wM&Q<@^xB#S-MKzT6TX=E1MUOKqV5#VdAtrlQ zAplY=?^r#-wTXYc;#mJf=6MhUZ{Pjr&$lCMLOl^}RwY2SPa<#^3=+Y-rSkTLUo3Wj zD4CG71%Jp*E7YoOu*A(kR%iF0tc&v|A}`jC8+`2eSH#~jW;#yNCz;LzLuTw~(r&ai ze^QLXENc&YU`5i;o8NrNkK~GX>a7*Pc;O8j?EPt>)DehcF`jj2Kb%f7+BKi&;2rWz5=o zHzW3xDsu=TGavCzn$&ODIw8!XaHkG&m~$M+G$UVVZ9tJ1aY+m=&ayV?!H}r`s+iO$ zU4Kv#JFEO*7}fz=%|~|CDU26KsGjy`=Uf}nc%W&b=FlYY2~)d5Lj-G5HxvE0qo?hCOl?n#iKI|KMKs2XedMlV#x76tVMbF%1ZA{JQ- zKpd&2$cd!4HX1I-{lNf|K8i!c9xb7|9?KO zp%!@@p@TCZ-nTQ*YgOCo*i3_U~iW2LkGxB0=Ga769MyxQcAJ?8)GIR zwPXH!kbs4q=zdn!nQ+?vQf_%-uw!pO!e}bAom`ufBnR*<+qVxxqLsifMhMT@{*P)- zS2O9Kr$P;}bto=)fLiDB%*mqu(SPJ&vV79I!G^WdW%?C9>DxJ3DxrtXrEhR{-hg3U z_D6AtrQxR}xbd|nL{x?d-NEVl2)6O=iWv%P-^-5-`7?sJH?iy>yp3j{B;(}czU)$< z!lH_rbZ%P?Z{7`muFrM=FI^u8%Ido!)dN|1Cj5$oHutF|OqXhHP*GSUr+?JD_&oL% z$0^vhHaBn@ccdWSbOM%tXfc;BK(a{nIe%}Mi-VeER?AVHa#@ha>*@iG64VtghC-cD zI1>w?e!Rv46FK};= z5aNo2DxTudPIRp}tJ*;K(VI5`M47JVj^l)GuIB!B2{%sKp9|$NFlQT4I&*Z99q_|R ztH6owV@qv%yi8Z8;3t}y&Jy1oj&lj+fO}N8tq6(WNGP59#6536mw&PS3dZAhsQr~^ z3bKP?J$ogDfNk|xQ> zy8ucQM~hrTHSCz6sPJy(`i>+u!8IyhNwf>vzB2((HV14$+RQ8PRwlPYLTI@^`M zlNp^+!Rt!k4FJNr-+%PwgD>t6r#E8Lb|&w}Sl9r4asUo#%=E?{#C*mJimW6@u2~Jc zsD2!*yPSE-j&!H0wU;8KGr4In-=iqS5$|2AynS|ENy{j9MTE>SxCbrfqd1bJF(Fb% zPoTOf6q`;sM++H#!wsM|2iV=$qNFCe&0(*C$yP*WE>~aWoPXksJN#7Va%I{K+H7L2 z4>2Kgp%fy^&er!Cb!Q2l6dT+IZzuRI!~ZWnU1LmsnsnH!4J&6rQ-&Se%xSWsnzn8( zc7*LfW(nOmi0es1L|Y7|_^*IVvtzZ=p{yP9w04NUVj5e7szDtu7F8L@YH!T(!Fc{I zx{s}8MvPC=AAeyalfh+@F~%tWd*;vn*?aB&)X=z?DS7pUg`%ZJjN7=n)X>PUyBDCO zysffFA0a%wV`k%KnhSC+!=R7)9a?bzAX&hGLPGUgl#YUKv6X#|>Ptpn-oVi*#}s|A z+g**m`fBZcOnz5A0*h=XTP1EG_Niy|Yn&e2UA6f4U4MrqaVpe%Z=bx{2v?f`2q9H4uo1iz|^PP?H zDOFlpzkj56PdQ=%bvg_W0f#M60{lBG*;9978GUe%rH}DluptMx$V)1^&?8Qg0QN-hQjn@noz|p`f{!#0mZr{m9ERHmUq2nO7o?65=>7cF|pcqSU_NC zEW6d~j0_#{bO|0S--027IrfjpNvN~^U?!HE-G2{o#)1xN9Dv8@7P61YW$n*zefE{M zIZh^5%j8G>GddK7YP%C_tD8%SWWc=UZYOR*=u2Q3vLdN!3{l31PAg7n4uwNN5*4#j z3~x0dA`i!-%1pO34s7HFUUgeNZ-hLz9uK@i1$b{bjcz}5FO#Xc3sDHfp-p$k1isMu z41b$4ud5~#QT-SjA8g5`9LaqaJWH~OwntOuF#*L_UblRoM1wy`<}P?xLAB2~ZY_21 z%TD;)TpQ@#m}Cebiv#$a$JZq5XB^P}4g-p1*tP5vO6WXsRfn>XWGRv;|GKy6mSbv@W48T=~$Yl0T^?&eSY|K{+r3v~7KpCz@#^NWw&o-J9er%Te zWyJ%(k~=#XlkzLG9;FMTf~#hFDEUBQG^f7;fPRQm1(aR4$V~&zQ~*dLzTp;)TRRSn zihFI`t5J-5I$i7EvQ)l@K6gkBGI%WhjRHxXT0a(}P5 z-!O-M0g;}I>^g5O_jm<(XFnX3!7{szN_ComA#ovz(s%xRBibgh1LMYgLQrOz884CJ zsa;wCcnOT*Bw(UBZIM2}))+Oh0#aII@+EUh`jvsR{xb$wS zoGap;AfE>C5_>ue=+hg+yMxBLmx~~%O5&bG8ZO+VJ+PX=+#Q7s-~dZ6WUVM(!ywR4 z)edNPBg6wJ1i;N2BE-bK@l9}!tN^5av!m}k>kAkJJ`5OjX6fM#o5a?Mmw#nGl-}H( zF16abV4snl(b%MKlL(@sp&`SA8G!?`C5oa4U4@#6v{$dHx|<+5h$PGh7R zdWRQbduY8=XQx`dlIs?n!KJO=vwI2w)sIE&YkZAn0FPiMTv>5=pnn~Xj-FqeOH{hv zA6>vmukr(8DU%O=+FZROz8K5R2d7{}Y;5ed3btenB$&l=eN!1Og0~Ue(Ot4F2ZEr6 z#Sqs%lp}YAS|V9sy4#lMYbl?Pz%O?tBb{EJB(;DBZWvxEBL%(i_YSW5M0T4tWX7Lj z?__aH3U_ahc)uOwq<_(?D5~OEgjUeB)hcP;BvhGbW)7JuDzIC<=d;|(=AzXIq_UrF zuTlh@r0K$)p0KNY#6zJx=$uM6;2S$7$4;A`5il?6_{gn(HaZ@Rio0sEvR_?J+VG_D zWcY6XK*7AVhuTQ|U@jA29ySJjT*Vc};3ang^9csnu&i6fx_|IQ&nU;r{@Ua4`%Bky zqqG1M;Mwg2y}9b~wk1e2tJNN8J7`O90j3p<=x%WDkWFYZU2lV)BF3K?$fD5eGGdU=O6ch0S|!_N;?Z8pwOHb5 z`8h;Q>k*Om3V$a8%J?lm+SR|94MwiSPxM0QmBdru!{!7(B6q~_D?4J`snwsUv<5h2 zz6>Wk!D9nG>&id+sII)fKpLttN0Y12ks5*7D(X?q!z=vjeh59!v zmK8=>$ISE!!S^5!{X;ji*nt{$@BRRVI_eDGUrCCG5ZO~tNC74s=bH&!evGLPA$o19 z4`WDQ$nR@WL$^m15RMydC*HS_#YWFmc)9(WGWwvQo#vEGQ~zn>g`?$Q^DXt9BQl9`pJ-eL z1aiRjYHKxn`wmyrCOON1%gV9!UB-_iSg2v2rGI+VbZby#iY=bE?t%Fx`ZZ$n=9nvE zxJc=xD;}l$#rf`@mDLZ(7AKLHuAdGPD-zuSXXKX2o@#%3#TAEB596XYYUAgu7wz3H)0-rUY)DT=J zD1YvkYia)ND-U(<$7#C^qRdq{622CEu58-BbXK)Og2(auLEx&Jn@TY(Oy_e9;jXUSo;= z{s3>}5mfvyLE1?r)n`mUF?h^^Uz=BkSbxA^Eb?}k=8`3nUUQnlP2_EWFI`t=)y4y+ zPh2I8h+AzYv6P=#(Js+>aZ>Vt+SlrNN>hp41nRl>x^Y+TR6ucZj7oL`z#Z&MW)qhV zf2S6f`{m{j!x>y?<=N zi>Tf&`Bs{5z`1ezJ?1Z0KUQ?sH%Tu1Hdc&2LO5rtvrAj$E#gW$=O}7pD@$jwX>>yJ zIdT=7>#^mm??5a(VmMzwVA@N%W7FV}PibbxIJ*w3kHKRd=64OBL|sk}?a+oHzEL&W zJa(>-@G8w4gINeL_jB=9>&0yhNPi){*irK2^iQWKVKmF4EDThL!6M>zb9U7`Ohum? z<3;-C&&~_Y^~XdmA4ZCmEJD}$U)J)C@J7-9bfY}fZo)|rlS@nfsgoy{C&lgWwd&Oh z)PnhKjos>i1XVSm$NElU;X1k=?WJ0QR+r;Zt28ld$5>D#Z&$=g-^`6}@_)hvIk=+% zn3Z;1R$?dq%1{NCyLe{`HTLUtrFv9JguyRRV8J>zSHeLLPW7B&@ePRdL5yCKGqEf3 z;Y;z5lA0uN4JJ~2na(03n3>#Z-~!I-p>Pyrk>)PFgBGN*dt&&8hUY%P0AynWZXb3R z?AyP8>0|AO$kG4DU}n(r9e=Q#uiLM#xPDZyV(*21n3#zcfn`Lb2{@tFQ^^DiIQ#p5 z{25u=Rs5Vmy@Ea4-R!nfAGKs|1osv>>7$~!o2+a=&J3iDfr{P!F5OWf2YFx-%JI$} z;$q*QTKz7qy7pf>=&%% zGm_rb?j@LLz~-|(Cq;x88j;IEBJG&DW0=ff*2rN>U8h-H%fLr(>L~JLahUCG$iRnj z^a>OsZZ!|(WS+vH+JC#*!FX0qKU3SZouvj?W97d!}@b?@@_%~Yj?!4BeE6vm*2T7uP9OyC6zD=H`mu! zHB;S-F;@y4gp3^g>o4KwCfb%HlKcI<{?d?gfnt05pfOhW*Tb~P z1v3c90jfRA^ndCj@GNl71l@RyVn|0&yKpg?DDcj3OvqH?8#M5{j!gXCB40|yj`BB! zqt4=k54)wAddXRUl@^8T#PnL9Wpe)~rh`4vHyNVQHR37PkNU90aEF9c4BO?giYwx4 zQ!ZRID z+oTQkQQj_%DK^FwOvHG!kE27%@jvAn=oWhpdfi}L_gBCQvJ44?)Pic9*cfPQP(e7T zl~6HOY0`X$Ln6bz7)aj>qMR|Qg2Zx!w?CutfNs8_Z&tQkD+%48F}4=bip< z12Yhay95&W(7+=X0|nBJ(q(SsL|p<0t!zVY5;h8Z@gE9yt$#f1IXx z8pc|G^Y-y3tfmLJ#Z{jB0jX~{{k8x#h!n{iuYW{NAJaA;{*txI{Y4Ru=t6});^^-W z6s-e17Z5C`&mhMmaWFv#<4lcY-fbVt8yv3v?YS7+L8gq%0hi+)rY{2%$L=ll=>E&k z9!28~A1})Ob_Jyrv25ha>aI4mlTXj@L_JMrDFo{PHA;~n^K9N}rPJ}Cy&ubij;t_O zJ%0tL0UBJ0R`%>MVhmG2={4XiEWl4nV8!eGbK6vA$-ac5ZWlfjm9YE>dD+K;h4`48RnUK1ZyU{e#etadkmaO(DAH;^5 zi3?{WyMVOwGb5MXn-k<#Hk#VN1~#UD1#ik%;Leao54$nke+R%c7$N zKDU>!xD6ys5gq#c!oLgI7|s_?O$C8_g<8>Zk@IrD&j7Tjj^Mxwnc<`X1Uf$jynj-& zRR?e(4eB*NQA)5xu`s_FOZ&+2S{3SPPk^jpDW#S!o6uhmG3GDJQ|OIT`IV@8#<^&1 z=Eq$~iY6k`6%a5B#ymK)Yh15WKza@~u5b)`l&MI#i9H-Z7&eYil`W$`ucH?RQmW0G zcG03sz9Xhl%?Mna!c`ZXRxARef`0^CEy7pk{ALrV$Hedu7TMWoa&(^RfZOHz%OK40 z5Wq8Y)bd9Ry-5GIjy4d-x4!=9I6oe8E@Bo|MYM9Su>g;y_p~oT-1Z5t{p@#T2@pe% z@c#z}gae(-3=DKkLq^!ngDQmGQNMGZ7#L^aWu_{Dr@LX*I3CL=Cr`dg@_$6(v8!g! zVlkXa%JAqMlreyE+rL;?Vm;^g^*k0jHc6TnXaa$lyj*=}cxuFuGIN1_B`5Cs8L<;c zY-iq2Yxc>$ATa}*pqaJYDI<}&>$e?#s#xY#kG31*Rgi@S1 zHSq&NCKVwZ>Y8WuSQI@Sj3l^JROY2b62fsf?UP47wz=2Sf?f=gpMNaMFr*bNx!2-5 zmk4*n#t~4drH(0XDq+cAw(T|%WBf}BHzp_+^0{u=yiv)Fa|f)D>mI_ea9YrTDcD^h zpnA?<>eN{)yWCO8v99AA2Gn#pCG@2>%#!0H*REVw-VCJWx#}u~o`uHO3vm3i*h|E; z)I@b;dvFS&o5MeaQ-8y-m7XKZ+8f&Y-OqDW2(M2;e?UOvOZU(P1y6=qyF$p7PdbH5 zLx`614!&to;#owxYlj)$yP=A{toUX2|Jg--g5;ZXX6vc_gNYMeCm=89Tf zux)Y+!pe|`eJ@Ymj{uwwR;H%q3eca4V`2ELX9hu=C*EmZ#DDtMrv3ezE*X)f8?UA^ zVD^bkgNcvmj?i#@fVs>bQE-?d*4IaLV(ygotzQq2ByQaf^<uKvB6rzZnJ5NQz21!D@Jge5QvP~uxY$gG05+CRWmJ?WE;67ydr`t}R?a+Z zmsBL!Af+Gj9Si+T=-#lnJvJ3sBHESu)-1Ee+6!5?7EhgE;r<>Q&kFNHe-g(q3<9}{*xj&Z$dazjnrV5(Gyx%pRy$drD zfP5`xn>W&O>4wl1o{%W{jn|c7Fl}9Za{_cTu1%nY^*>u9!b&^D0M99Sf?rRu{J^gD zvLKofq5WO{I;7{^@8Co-PJ2O@M62QRU-F+?e!lo!#H`Vrb{D;_EcF0Qbrpy(`p}BU z41Xs;0>9hEv1oIBDX2?ND-|*L7Rm}J%WDJGJn)wA(G*asa(Pt?@M{W6V<5Ci54jj9 z7P?PN+=48*CEe=|9=>x^M-`U4)kToDgu3uIPAX1(|{Azdw*R!B9$L~xf>j?a9L%mv@~K7=OeA&^%gv-DAQnE)fSJ#7h7#Zd%c2YqcP1;d z9i235Z!Q1Ix8=x?v;E}T7odsq9cuTXOWbY1dEe!ls2p-u(0CdI=-f?V>X2L*$D8TJ zP`^*5lU8Dk4yXsZ5!>xfPgx3csU9EB7++q%S-jk4=-M?_M3|_DXL5aaPk)w%<);_E zn~x1|V5@aB5_KC$qk?zz#yr7_+<;$h{w^^qZ{WnPFG(=lkH#mzYKj3i>1Mh$>l`Ko zzQ?md6Q>vyzBYoP@^xn{{c|Nshl|-6R+@2z(y8s-jyc!7gk+v-Yrtv2pv|x99IkNq z+e3`3D^75iOaR-3bKb{U%u1X!nDu z8xT3_67cc6sN&h~S)*}Oug44di+TD`!ocKi7X!Ys5zj1=FZ^t#2zo%=83bRG0vS_h zvlhq&Ft-C zfmB+R7zS27uO7;6DU2(UjLi^--kxs;x{>w{sS+`kg(78$$d9nagIW=f^I6tV zvl~!3BvhX)jekm%1ZT`}gFzOE0I9ZX;%mI>k#%Qp*lwo%Q^_O%J$WX7M9q;B!rl zA$oB%M6||1rpQQ*1O^^kGX7wV+c`@ z8>he0b2sLjwWingSWZcBN?X;Pca_I^I$;rY zI_ws3zgQxA%217W9714K{HW5MdTk24K?1*ebbs4kru^nJtJqW|Iuz#yCXqVQb_hoS`Uvh&cMy&)QEQ2Qe!a(3$9KyE_!lFQTq&J zLjW_i%jQaQ=swdenD;GUDT$d5`h@6U+wP^`qIi<@010-oXbxBMq6841gnn`F=)fd8 z%zxtjnE;n@T}HZfk%-CL42kiK$zqscqWdZT04=m7R=BZ6mDEj{al6$v&V-=TfGJN6 zQwgV~Tu$Ums24Zrc#?ey&+h+9;dq9>nRgYHS7-IVP-#8ZE3+S21+CkdHAhV+T(AtnvMl^!7M9{B!J8ati9Iozn=#+)O%@I*;$wlWkFGuC2^zu{&$^rYy(@%5b!AGR zS58(C{G()4K5Frdw*NbX5Kwa^w69Qnfx#pXJ{sE`(tBZOESTBo_J2U(_d!iU=0SBW zJ`STvlMq5@;g>!SR=A&@GI}LNXd!2>`$?$JeqvMl9bb+k+`@eZoB{_yn0RFoH0|R; zhtm5c-6+)f_;HF~Biynt&I1Q3Bex{Evfs*v%qM9Ii$6RXiWF#TE=3xk`0MEv3g{rh zo$TMa@S5b5v|QOO&VQPqpI>yX(peYE7sl%jMq4xOe9<5MJh6fr87jU@@JhxsV_gtN zfypmefLKyIvOj98he|W~llELi?;Bbq=emJw)xkYP;8-U){U`f9fAINY61nA|@q<2H zLhu(Tg>)&(7v7z+U2^tZy6~rwnPlHZ^3u32uV6!>?>Mz7Z-1A8IIK}&;Ev1F5_o`( z4mT4KG3_loOc5Xb;*F4RMP&i8f~mdnv`Sba2@vw@@Pgn_<|}5NDkMa+#)Um7bA8Ul zE;7yehB3&_gLg&*vFiFw`exHNq2-d_Tqj3~v|~P58)-AQWU^7-iSfIww^Mg{b7hxK zq(XwpL=7U*(SMMX0pECJawa7c+17UNQ&s{uAj(bMVd^=*E1)JMD-XIf5Xhmu z{pMLZTz`2YS;?eu&wF!Gm=#@tBJ|k5KSrAWfe_Hth)4Spw@tLGYbvDqqqc8wrt#hv z-eqJ|U8VIWg?sMnfzi}(NFVT2ARVpcx8W_hEE)7_xg|?2-#9nHiC1-q3(X4IuyhJW z8|kzK(7_;H;F#NL@tYCX3&VMq5c$n00+0+HjDNhiikoHItTJ79$gkbWpkoXE4I(|+ zV^?nP`Y)GSa`aD{0N_7S_ITQJmBd=zB!Op76~1Ug!nEf3^J;rzCOY*%HLqTIQ1pcF zj=bz=M>jo*(TSM#nQm=6-ib*{HQA2ws%e5V*n@$?ohZ0%h@7Q4;5^?JFd2FgD>eEy zvwxd#!7@ooFg_52pMrFT(K>%{z3=Jq?OkpHre0UIuF1sM__@3By1rt}bSxFm#hCsk zbA7!UomhBnfcTby&dNXmlRx@}kYv~NN#(Ynk+j81|6h&%01ix_o*3`a#cNB$C+~+K z6RTH0u>QTrc=_CMQX<9%pCC@U6h)OD2_?)M0Z?9=w`l{* za{EMUi?n?p&BmDvO(zzEOfSlpZkiE#JQHApB}y(ol)E!cS4)p=02p~S1T>A zlp(U~v(bwu;q#D6Ejb&*D`^RaTYw9QFJMnl{TMc0_s}G0?3Y({bc(8@41Z9%dXd|Z z{f{ev*>*%k2WQQa1!|xneH6imU&e6dK1zTdqqykBd4blnrfpSvB;*({5I$z|VvjWc z5G$eRqypC&&8zb`r1~m8uahiQ8UXpq$qD$Rm@t_?>T-%+6#E23-T>xZ0y~E*GP&Mt zc%7zz(%)SUA_Ols+$8)?mVev4Grj?9nj&OX>7mk*UbBvb!aevtuk@PV{=J?sWH|A` zp*$Bjd)w*UTR8Y%8uh9=tAkC)fVLVzZMytTX*ZnV68Emg+j8dh3SP3fRM@NK0a~q>yd1g z*t@tDfIrv^ssAR+hH+p$Lg#xqhnEhrmsk7G(K>^OORr!YWq$+UD^|DNdlpxR^8DYV zF%VWxCSQl_>oL+W$YRQI^lQu`PG37dn+p{!3cw_{@Ca}c1U|#WqYC*F837pxFy#g# zUoS)L{?ECX8^{@po4h7&MO)A~G1szx>8KSBCjYMQIQ z|jZJQ+lO4>dVpkx#E+(XHo0xx%Ghw|~Uu!gK);e#u~~IQhLU+qT>E z)$5;zdsj$#Od>?=Recir!k+H2RaXlXtMl>A(L8RT`RN`p1!M{S zb+}1~|J_M&lu`VTHs}+Rpd!>}7s)AuBHsY1T#n=oZXL_Zx<+l4RYrl?s?RhdxA6Po zaQF9uFMr-Q-O<=Uqg{6mpWNi&ak}GWz|mDj;E3k&+AeQSv(y?!!U}-T@cYTFoMNt* ztED#{XIg9z2q>#l6Zj%g5z+Bv2VWR)TB}c2_UyO}o)?{K)H7bLuQ;6Yjj|!d&hV1VqEI#51!+-evA!{y^_nZ`hORd*pZXrzrd@2RM zSq+c8#@P@6byH6YW6F4YW=v-=8TMVU>qz}49t6|x=XY?mgo%X&!yRL&?MJNH;ip6* z18*7=C+V*w5JQ5OhLq5g6=RJnn%?Q;S;9u7Y_kkEC+(7rF7VCa^kLuf*q$qAjc?Kr z4u7ww$`C-JPMow`Pmy#f%+DAPuvE?ox;h3>TBk~iNSopIrRH7lz}8hM#*5SNT^U;8 zz`V^L&)xOj+0W!_9SO?p8DQthE@*cPuZXZsF^^zZ#<%~Ac5etY_afDgh{Ez1LfC$# zKB*a@re?3Ro1$Nq6G4P=c*~Zy>RpVwo3clP^Py#S!{wjr!lqzYqa8ucDMy)8~UFpT>V0@kvJ5 z9R@fTz#@?c738UEN#FLH#?d2oHlAur()6EGz6j|1GcM5>(zExA+SPD)+r#;%SAXWn z=Vu?FR`Biu0t%kd{3yt{`WUTN`9t|!9_$SCoTKwQGbR0o5pMz&qtP-KVH#f8BUQ1_ zP8c^?M0@w@&j%GA)2!51pSJ`{XX;Fv!jw!qES-QcV>na+rh25A&ib3`&=C`2{ax&y zzxyVA%SZlQX$VU!P>aE#*0NRdsDH8CJ4;|K1AP?RwsYR-|_Phl9VI(oLhr%tKJ`t|%>u!?Pbx zlxgFZCsqsFFU`a`+l}wWIzu2xRcdc~NF3$ajvR;iuucKZH)tdN^)x0y9EP4u#1Mde zY8Ku-2PF`ovqgJCw*7e}k$;3strp3qmZb2%%N?)Tkd&MH5dALiSNS0anS%qXdzxxt z2%B^89%cm+H!7NS;s!XOWwYPM^0vjyz$1!aU*H`f@umZNql_Uc*5o|mXSUc9FxY~R zgtzBYH7#R#8D2aK6&TZob|%fa$CvkohSQ|m=>gg%wKfw31hzlcjDKnMw~+16>E;>( zu#o|t=57;BBaknMz@Nd}J7;!AxMG}j&@-H)?ZXE|Bs`n2A?T4Bw|UQ0;>5XMTs1Z9 zBC+7jZZ<*^wZ6s~ag9mjZpm@i1vR(NzGi~gD?jOuf{4e9OUt*;LMW*Uxz`_Ss*I*M z-b1(q{TB{^@pt}eVSgka^T0{R@@pXlDNHBhkTY{A@YfaCzc@aK;{vq=lSzE{1|O zcyOdyz8&ZO?4YC%xCy;W=chbqTzs=Sccpz zm2Rz_8NVsTwtq1aM<)B?@$XNj119EsV@PPfX2%7*1XcU)P}T?td3@&#L+tK>;RD)E z9H@i@qX<2w>mpy*p0bs+lS5JADyfWD?3V++LxGDAr5-RyntZRpdq>~*R zya2hL$8hC&m7AUwRpsenM$F~ihLFOR$7ya0Ai7=t&@DFwV(JIFGv=$83kpLb$@U@m zlp>*eEjv7#WYzs_z4|_vrj{?B(AR9TRjKM?{Ffy;=nqC6p~&J^8>i>4z!o$NvYMU) znXJ~nRev&l{qd7v`~0D-R3QYa7O`PrU8?rzzaa-HTnTIUTlpgsZpfqT)pHbR(z#|c za#1#uGpHa9DK!y15QPWd|8|KXE>Q^Ax6N5`t{^qyk1-O$c&2hvIbHR@oM@y(mBkmQ zXw)W=)S(~0#{Q}gCkcAe8sJfyro`E)`Pj4h`G1jVs#(WoIzTZ7A)t6N=%3~=7^l4Q z7vyBhKxP7JYnNBk^f-{c7sZkwv63U!S4do z=T$tL;;R**eT$&n$7B@&4=WH`KSkuZNQ}3-+)wucmiK9b%qM;w9I_+b8YutLU(YCK<85#71U1EJr(|(17SmL1Hg(wt?Jhw*PfLOCD7(W9IFHhAXQ_$t0EA& zYcB^KiX1ZfJ(P>InVY0{F=9Gq(4wt8Du4IY5x~MP1dtY`@vfE4Vw1MJWfnuDxB1=7&Qz++Cmm9*yQg}jhVelyRc)B=I>+sH*j+SuhP)b4CBB*?8R<0M# zP6Dn&XWu{OY4?sJva(^mC2AgsydRaR)M0*yc^`xfG(f(=n%1pq(+8TA6=P|+zkk{1 zMZ4q*!8bLTBz^fHF@MiD5 z$J03-!vtrCo>3#O{KdIrTFF+4cz->48_;Y-w~e07Rz8^1AfCPKGkv=2jdD=Bx_Bin zKO5$a)vH}-LzCex`=sRnx8{fhV*sg!i|=ishF(&U-=FRjOdB+5qpw6LPRgf+LlLETmZFrS0j+gq^3fn-+2Toi+(Q%J6^@li~PNLCKX4(R3XfY!gd5!oJp<>^`Z+V13nN*!+dRYS?> zg3k3Y=(43l<#p%L*t2olMY*~HQxX?}!%29SaKB0E_c@WKf32N3RezBbN$)Dlk&?{@ zsAQoBE``E|v8LC0EPt(DA>w}9NWNbN!Q|V(Q=6gPu7t2XGb!zh!bf5tYbj=UQ2g{SN-DozU}SeE^B2X(D#(0r1PM(kPX z4%dYy#F!w;v$3=-$qg7r;jzh=;micCMPLu4MPCuCZyS#e-<3v%~h$)DCt(WXVXtG~e^~f^K*9EhO?E;3WREwYjZDQFwL59(w%~ zar-UH*;P!%41cdanbyLZ({3JaZRde6F4)h?3VpTO!MGIHbJYD$QT$>-|GD-AHIV=M zQ3xSem9_9pD@D?2?d^i>S1#|3Ntjgoz}XxhtHxYtm(8qFCU|+(BQyfWY!4izYZiIh zRBH*7;up`}ZIS;s(E#aAzw8vanAHRCr5&aFRS|53$A57ika$O(l@c&A4$h4&w?GBd zCl+9HPkwTPm%B<#{5!7#8~0ngg!ezoU5sKFc7{VAWmq+`x{S;uJ2kjGEWMxYPW^-T znHS}L5`!yR6(4&H#&k*`Wu&;KW(M3FHa(;QjAulh+;%Fdg6I*Q2 zJ(ju2Z)sO!7NF1@=!Ob)v&TShMuP3K{eT`}-f8RmT`Y}DN#r_E->HWJH0gb>HW3N- z56R~`GJl3wmMXAu{$k|!Tfj?<*;sX}TP4p}3V+M-F603wR;p+W01y-!-%wU}Sp|PA z8h3Rro#?FzgW<^1_@%mMo^&>dCgV`z#~LqK&$ojIMD4b(h?X@^E3wcB!ZHy{schnJNMH7LsY=VMKu4?tlFy&LlaLD!w52pmM++bS`&s9=fONKJY5U)x<` zxSf2uP;PJR4I8`=y>~Vv`CI2lVJA;H9&$h-7#TPIr36xvb_Du2XKB9w2OJ;>dtS1d zNB?ImIboZ(xFG@HOmn&?ydAbIpnqT=i^FLJLzE~*oBdu|?|?r46B*qSD=1Nugi*nt zh8NJCu4)TA-HOZ!4DM#YT@`-55}It#880}V>{J7RnJ}7)6Z!$t&>bdtkHEoq06Rd$ zzhK~&iP;j?I~ArQ)Dp@PwCJxO6t#1Qge;OQ;}rm6;7#|*56Bsc1`U`~PmEkmr$>M1 z9Q6Ry&-BF5@MZ7w(sDPMYdH7E0h0=Rl}CN6Ze*A1B74F(y!jMkx4B-sw>}=&t{*x~ zyauLiGH!cM#c&oFmhA_187fk>+^iO!^Qz35QCdjxH_>A<`*;XOC@63ypJI=t z8>1bZkN=w)o8IFuwG@K_hTYL^Anv>5{ErV(Gq)!*hrs~S1dAXwEBlbLAi3fj-oe!X zaD+Ozb6d{vc!}Hi-w5Z~AW|G~R9JqxxUr>S#wa{#@SpKAKxplF;x%e){o6yANwxSIq~D#hsK{H-aRwh)tpI z(2?&*gUDHe-bm;?!acM;?hXmcbX4 zUqcf9ozN{zyZSoJ@$0}NRq)+(}aWNVK9F zECDXknz`n&rFJL-$Dd1o6_e@P+5J;Oa+HpK#FCsYYIXIEMR)rWLR_O3JkxArv~EAX zde|g*$zI+V8A@Lq)oEA&HSVc)!z`2TDqyO(_5Da$`rA6(@qB{c66Z5VUilr)`0eUb zRx8AQh0wX*SW?-aiFkhlh&UDnbt~1|$yS-3#UAoYk(!8)x=G=uYM01K*cL~mE?MKu zS9JXCs|$jHZ{e6rr^gt@(G{$3(Mr2+x$ocVml;ES?*r9oJUgNIsJqEI{ee{|dn<~T zGhTzEt%W06g8Ezw*LOMxP@Q$Hq8P@z}^t1-{Z=!c~#TGal_h_X$GA^n7LPihfE!?iy;Q8 zQzV2Egt|+`lo;sZyk%s-JUBy2Z1Nmm4AXtcyHH2I1%&};I2~PiQ6n;QSryJ!XlF}c z`U*P_NrLk>82NvlVUJx;NDDS)wvfUk<*!HC(dV*G)y$$&3bEc6Md>Co`1N~?%i_XS z(Szs~MmB>~Q5oEpS&0%R>b6ucWB!Q~vQG8&ZhpTl9KSJ%Ea5{97&=@9ip*g85OBl9 zgtbVGJUqQ~(@M0>IV%!9eheuNR5OuO`8!P29Gb2*`qO_Vxv^E6NbS7k*9`|luwkAl zTAYf!dBT8yk16sXdq^Ay%n-#;MAx1(dO?dkT|dA3p?0knod`z@2lTAdJt%ooSd<(* z1p5ZUZZJ%~F)SB7g{D(WiRmdf?+Z`wWQ$>1bzW)A1_8UG`94Eo+{2ncAmIn-9!7)r zs-%IKZ8U!d|22a3K$bHg))Ng0CXBqqX6_EVVLrRGib(#ExUQgAo@BTZA!w`m><2`P zdcNZe2{Q33m3b2DmEuP9KZW&;JxYLDe)MpQUx-?L;ZqKkmQ3xoi<~B570eAIpps^k z1(5CubH(m&wj`s0eEv4YAeI}7R68L9<>taI&IXwEzev|S$t3f{iWkFX17s-Xc`AI+7 zhG&0hvpha~)hg|un+M}C3441m{=3h&3j61s@?~Q>PJZv3lOWVt2hcv?O>p;luaS34 zB7H!!K4hsxpsD;9MV3p`^pzLEqrQO|9HEq-7U6(_v3{B&@E7^Ri>YpiB4o*WO0Zs* z)*m{?y6mcQ1J@>vmc9-6tbgS8Qh{JN?&E*!lHRqj99gU!uNd-<%v&6yk7Lu!A_ z0WOW%%!fAqJcN4E2FZW22CVH`dmN9@PQ>3G3$e%cp3#9lyG6(I+rODQp_v4G68u;U z=XAA0atR%BoxL_TnNT>)@RA~r ztXvr)e!s*4BbcD%Kq{J95Glr`$$M*|ElS_W-1-vt*Z}nBD+Kqq!O_t+*CaRLd7G)&|W$Pb??R6k*nnv$E`zP z32!#Ig3>GRCsQ1ROOL5fMznuzO8Bz&Zqr4cKMZ3*VzFz>+Z+}J@`xu8s2!!IctZO6 za+S5Tuozbqashm=i5mG|P`vzw^JE*ya{v8a>XL>^RTdj*{ByMr`;@=$SjGdh=vu9Z zg*G)PehXkC(V~g>A(W8rvzmOM#G~Qm$^qz;P+e5c@Xqz2nIGIU&vSoh+aw5|TxBAV z`>9O#5K_S)$PtvcIrO?Kgl6lE#RNH3+yWn#w1$DStYH?2R~wK7$1qCs@q5jCp4n#f zet95ADdvRX$AXS|92GpLOSas-R-0caDmzJ*xeGG;n-O};yv>0<(bdcsDJ-Lq|2XK1 z!4h+?97%MLGxmts+H`;MRo8+gp$9J=q#;K23RmQ@k;YJ&s|+l?FY-aaxBdwi#%J^+ zQiN9zD2uIM6>Y=Kw;JXSVjZspVw@N?ev#=q8-pkd^^IPU`A2|)gdhg`9F!rlzzh)2 zDrTwvZwtI?*)rQ@nJB{IsJ@$x7i!65QD|6{%rfA;mr40dZHIsA6FXbrCx6)6o14~f zX#a^=r~|ir;IjNx0~YPrr_!#=ok=u$xjd6ZFY=cJSIn7U#>&>$4%FV5Nr;W zwkURI5iO_%9fYfXSfn-N^2hb2rVz$NOxa_Hl>X%NhBpf>deM;?-thtedkjzW`{s=C z1)%XWVHk5lYhQmWQxl2de<5Pa@t?FH$Xp?;o#<4BE`Am)pH|OtM!h0bVA`zqplv)^ z><*@kqhic^g~lMtZTGR-towlIragYocd2a^zqT$RvAyUN5|n=wDA`b%EqqWvI0-Ce z+3u~vB-~RN~lwfm2+^z%I4ZTissJr!~cSSWi%kJRrLHP1{xGZ$(l)RO zhSX$bk?jt4O6Zps5)WY~3geQ>UN8}~U=0)>3kZKqx%cWOtz}$m2iukmeW$Jf1r2z2 zG{@}-B3G2N5RqnIXY9S@K~2pc8KB|^mG~P1(p0sCwo$X}MPBiUxMXpC7d_`|O@uJy z`t|WBUBSOkG$_x#Jr2UtWW$7ls?k*I9qdK!1U-Cw=&B4jLpOESc1Tg~9ttPSI10-H zeF%RXKb@v{7K&$;%L;>4)97hR{A}z>6O05Kw%EMHjy%fUP#<9`;kltm&LfXbk@;x`))8Y^B1_}_mzJD zWGG-?ChkTzHAWlCJ&u3*NEXSwxN2aRozIQdA)Xgrs=qw$X?haD8nEWG zpxXvAhyk8>&IaIWxYOT)N-t*!RB-dR?{MY6?pv&TEtK)UQ~V@n5XbVClnqxoIJt9% zn8MV;+DtK0%nXk=dO0_?f|jhyK!K!x?dzJLkQKWVRa^+h8zdfWZufWoQt;Z-9e5>81QVq3zZ>{S!K|ty^}}@92aYqbxhNk6XiMV*_4uq zBg)9lRxg6$Z03pcGoi7yR*HZ54bB-D+m@&a&anxlfQ?H6p$v32kb)3B=Jkj&hi4&P z$Ai^(3`XV<$(1*Dzo0PFX07J6Z^-G&^_N6b3n~u`9VJ>csRx!dlC86RvhTwKIJ`y* zGWmVu<{Eoj^6Ls)iIIL~xsExHBF6$-%qYnWR9Tp}rJ9^iL6;(If}DR0O(Ogfs7sc; zW=ZsAWA4*OjM0a2!5Ll2k`N1Fwg*-M{rn1TsC=)1Is{IX@v7`Z=uf z5`Bd}cw`@#?aIA&Gpe)YE$81P0rA_j3bVO5WG<$DgQjd~JoqdvVjmoqEQ1l(a6h_f zRQ4{o@EAYJP^JNWd5M1zideYI;%6SQ!NeWz;!4g8v3UFcq3>=bmc5cMbi;>bq5KqBH~g6rrr z_bWNF|qd*uTpE`v#7|bG_DZPIR*HLN));zP+?ZiLz z$wAd!EKnyS>H_c&W)*D{ZR@&LOoh`4BVjlymM`QN=4>|Z2}38PASpO@v`bW$p%1KD z{-00Vl%Zy3TpGQ{FTfl2Nn*6ae;$v z5*W_P3{Lv8aKv{Ze~Mo=uU=_B^WF+n*0=$z#)_J z#m!ZwFa5WD^_uGtZMI%oW@@Fp1w>Y3qT3gN`S^bZ9d$d08)l)#0@7G9XI3lG^Rj2D zmE@)1b*})G-qa+Re^8fI71#x-oJFxzV$UEJO|Z^qgi&>viZ%wuQ3K^I5{IQ5SH{QQ zGLxEt)*0PGg2Sv6p?2T3uURb#?ExP3V8c0c+0da=fv9y>h7Z_0<2Bqr2c*5%#F+5l zsa$_8P)YE4sXu)AhW7S>QWXkbcK?75E1}k6Z*=vb4aYRgMb|!Ktc14=G3k}%OAu2; z14japMHB<~fRXb`Y-0mmHPbQ{jyZvJY@;Q2^1ntw;;r$i*te4_ccO4G z{x@vf^5%^^JY^GHw`-XIkpY?t?aNO$Nt=KEM`NV2!diZ0K5Eib(hxJVCaL`@LSm>i zj!7EEWuT|u7P&$A;q1C7@*ewPs>Gz~Yjtq6Mc8}EER)ZtV0kwoQb^$%NbfuBJV6B$ z$eqBraQ{XmXxjk@VK7 z{31oZlTqB=e|A&5AK4MIaX`l20$MmljR}wcSJ(T+grAF4uUC}l27dXaF}~06C`0k; zb5ee^rYzW7#{X4vnpedSGt)$sD4*T_7ER04QaQ0)>dASOi0jI?V4XG>nt^{_?Q*r> z!AZgZc_R@uqH=_Arq~9G#b$k%yQ~1>wc{2;Jeeq8e zw0a3j;)@(5bl-VOjjC*B;^lurYNbbxxbQ$|^Dny(VJ-WvgWmpWz&R>jpe-#?j5#`z zl>-(tB1D1Qo0+1T`yX?jzd>dtP1FWBwO)NZ3@7!azrs$uRGOVkLlkPXIK#z1=C7XV zAQDLk@-(oD(dEun9(}qw%D!Yj+%(LEck#MdkHJi%;h)BEag)YeTY7&Z!($Z{RjbBX4ZR2~JlC@xzVJYIU*{TVQnyd~^l1LY0 zzpG>1&*)(_yb9zwv}VxE2S zS~CHp0VCKq9sSX|@YH{MBWukro=h9CRg|lF=0HV=Vu|)Vq|IPb<}-dPr3kvg)3&sX zxNRiz5g{1`%v~k^JDZ{6=UPpQ=CyVJdZCIQw@kk+?QtnB9#~SUMg7!(Ln>GeM|I6W z%Rvi!Pn=_|ne**_Ai{q>-FqVROJxOjYLIg!A9k+*2W|ag18jfFXssU4ih~h5`|3YW zi87Ob5LZ%7OvIc5avaA~fQxX;TIbK>xGOw>se&pDRqaAiy>Nh? z(WPd}{xsMh%FsvWVZ=dsf*<>F!F*o42L~ zPba0XW^n*o`ekSutBVJ%L`Jp?UyjFeAk{lMi-w4BUT8wR|K`S$Ac}arHOKi;Fyi$3 zGasK~8_0hOngsiF%dvuo%KMM(n0xq7%T%kw#`F18p7_r@RuLpQJ|}YE_A|7IV|`BKwjMv&&T;|T#v?YCSFQ)u=RS)YyW@s`rk~PS)Aj3YR2CH5-4@Zu-6&z6Yr;_Kw~O(8tZPX6)1`rGD(4 zMQN2W?csGfJHkORe}17ZzSxonHRYT$_tBwK2EZdjZf(dh79ZllEQ|WJK(!WO0qQ-pGL)6aX-M^J1%=@4 zYT?cDv>fER#j7Z^u)VbStK*B@_5h54B%WW=IT64>Arn9h*impiSj_vryU7B7VTz!d zQ9L(xrU^ZLs|jI4P$4iDL^8ckk$!(mm(iPvj6ei6#=*e^$&fZBhZ@}MAkQ)zt@NG~ zaF}3jfhI@2NLh7$5hly!muTO(JTPaq%CLE&Rc~dO7CJ@k3iy>19D{f%$dKVjz2(ns zs{e~jrVU1sX$~P=%|r!|4f9=>GQEqiTs2Qw+$#Y#>7oIJ#~<7gAo6J5fgFE0l%U*R zIIh0%#YtubeK#axSU)jX^{`_!CA*!JJibG-SGLF(h3~EwSVCxNBO=wnBJ9gh7~cOP z7kPJDy?qC3b89tsF7yn?va*w6xpp#L`q$S?-=G)10UIpV4XCP`Xyl}_5lQpn z8DVGa#SU)GvV;rhagfE5T@HWnu#LKREHdlpQ$7bPT_{RZkOd*(iNGkjUt;^@Ct2c? zs%8qdqWeXQbNWj_!;dVaYMulUfp^>m*bxP?fKUk#T%iw>0s=FEImV!%91%pZir%t| zi0Zk&a8P4r_SdU{nRS07+g$&BAB#=WwK)dU*T7}>EYg0fBHu7w!Z3eP27rHx8VrC9 zVd#f&Ebq0rz1H5u&3g};^RU&p<46a4cf-!LVyO_dnx^srdvpTI|9|eCs00NUcWb+VaoY7S=vs7M_nNL zyZ)$)VyfSx21_vDP!J8+zd$`T&PUYp#;?^6>0~#Wx6L3_W+Tz7wTy&@hwjy zy6CL1aWp^rnnQmWJZef2=X3o99T6JhVSes-o(Tn>DG96|j&adu%N+T({6p^W)1q~0 z6FUeXj=2=y{H;LidFVW>3Q}Pf7fNqGsi3kgd9y)spdC6!=#q0`UMf`2+sv*(AQ=pz zPFC{b@0GBnB|3nfV&C$<4GZT6MTPC;Cx_&aj@}@MQu1*L;9}e zxu>u0yGHpp8WTtBs}IsZeXx;)y#Zk{wn{DNOvBf4H>!15#iLH#yO7KVo-l`--Lwn; z1-Di1>z zs%Br?6ib-4YpXjyRq;=*Iyvnabza}ABUxqBC90mEwMD+NVX(*U?40NVNToAVOiTj- zSC}^KFKW>u=@Hyp#-M{1NOITr>Y4??()s^NPFH_Tz=!RMhW}l&ATT57uDc-|uJ&&i zixI4~RfLA4#PazN@%`g$(T&o?+uWRtXk1=Fwnv=Kh&nA>zG0FOeqKe@@1tCT4_U@s z@_v9_yUS<(DzS}5aFu$OZk@>w;?7P$=Z>Xrknx+l;bVlRp6Im5>O7~)0~VL;}-)~Nu@Mx5m%;Y3`=B^wu#V>X~(Cd!e}CDPYuAVZ>{Irks~-ofJ{r4iepOSF_* zp%SS!`pzKZmvnco_u|-D361j<_?fcSW&D+(YpthN4*3Vaze=R>hxv?%^Mlj|da@IJ zW)UeDzEs*;AKc^)du<$@z;3%lwInfr2zu~3_B2Rq5$ss8fM;#>V?EHT??M%2AjE$^ zXcm#Dx-4$@|4LV6Lnsvxz)*N4}4#Rwg33X)u#WXy@z~Ee97w&35 zA1xM3Xr(qpaf7*Hs#~K+ZU)LTyvTovlhVM&=gmZ_!B11utK$zQ??`SD%T#*Cq zB_JARGL@%#N9L2v@da7%H*a3rdM13%Gt4m=<2tYvb`?(LFd;+R=g1guLP7{@{P_693p8 zgc*=_j`0f=2&Za%3 zKGvT<4$rr$(2#8&!>R>spyJ5+sk6rng4~;-vfmxC)jomXwh<^Ou$MVlUwGAZBxcgG zH=@CknvM9uBAMv?T}$hV?`nS#44s_%6XgIpj+iQHn?Wv4erMh zWcdg+u4ZO|Pkv`lTY5^36tJdiX#T%Hb9$UPAMDjY>Vi!u}zMSC=+o#uPz>tJa;FI z!l4`Aaxb}b?mT4CdHCXX*JNeMf7C7}i~HE}Z@P4* z@t+7ij|Q`!Ul9!|0_SR}g-xiY#B6-ocv2ZnDYX9p6uUeU>|v4ck`EF%1eiag3+`9% zbwWFnV}D~GCyjq(b#;WEv;u&T;;jPWp31e=C9nnv?*kZ?JB6l>&_)xj?({q#-rQS#Y+b&mX zpQPB2jaQi7MEk>+9Uvw4tE@lH<{`bRPJYqhxvRr%pT?%4pw|Kge!g%Ez`L*5T6RF)n{(kte_Hn8DE3;ag|M-&4wfkG|qPx+oJvv2}J zN+h=L%8-A0hL5@FWpMht&!R)mrUG-RuMQPqITzqJ2<}!dTSiDjBV|;u%YKY8UZac~ zLN;z8U(ooR*&y5?SG+C7hvSVDi}E~hqtxr637{+8t~v5i4h>{X3P2p}+7xW=Le;4X zcE!=2_wUqxr-eAGEXO|87NLUnl<=07S1agGV#j}_Y3RpL8AzQKNc5+x#O3tSmC}{r z2+yU>2Re`PMt!hWs~ln`=Tk*#^A?R>eIdhSf?Pso2f%4BK)EL!fQW4-7QiD*ViLnwnt1BCB~ zEyRD)s^8!AJfPu=!$qMcV{>Z6>csNE8CS$9*bYLpEK~Df7K`GTSUC5c@_=qR+xRe} zDtnGRyG~md1)`6=4s?4e>6@IX8gV%IbME>7-vkohinqeQp4gijMOMO)B_dp)Ds%f@7-(OV>igJJ$hoFuI`Ow296eJ+Ayl!e&2emfsx0MZ z72PE^PehC0ed@-ec6dW0ak$+0BGeF(yXNFhARNUVRI4mmBdhf;bkfbn&)X2RQ5bp(G~;U{(hW8K6dEy407&OTP5OPgX1yW#~wG%)63 z$kwncQJ{zDoZ2VkTZN5dk^_efh?qcU6@;6_Gvz0atn6F~Wo(Z`<%wrN+qcyy#1Bts z9y{NGx`6{<4l=U-c7hmiPYChfxd{b0E(1_*SmC z(KFZ=wU|f4nw#IMHAQG~&xhr{)`-K@^uv|Y2-UR)Xc7XKNX~ziA;a}fn%1VG+jsyYo*H%{nB>xCWPyV1mtXF(D}s>9!bc` zEm3gvEx@gkDb)I;(8J7E&7U~sR9UfVvB0GOX>--D1Tq5>Tgtmsrhr z3DHVY7RX0{14c)U^Ka2X#pUj0i~=dOHwt}$mksN+PE!M8JAxIZEYf0DGIX2G*eOJYsiJQQ)Xn6IEw zzw(&7M)|sWoui5%GQGE!q{#_X{kH&g4R}K6|8xEwNS{sbj=hN<@&9OjG)qaR{u0+u z!>`nmk;h!FQP#I}uo!<94o_o@(!eCGl~x)aGZ!k%A5m)#gEJwSFC=BSM|joY%RID= z52Aa(gOMUy+=a{c;rnnPWzhs>#Xe+jWhzc_m&V@gf~W!UYkVJYRE=ohFG6jdS?+9;5GIG1@45@)EuCaxkfBETo}SjWB=7~7iUIZTl`&G0^ifN7b+ zGQM`v=JZa%PdE!Og#}klI@3wjVb1=3|7({EQpOh=zfXN}uQcyq99&uDt9bHsgx-fK zpQc7pwb&bMpBt7}jJ^IQ+gI&AxOHb|R?SjKV7D;0 z`J$CQfk=N&m&bd9-@!j$G095;j_gzM4KiZI++k(W1IiAT;oyYEqA9^08ku^?149zy zE~Y`4uPbKiWS^7mtl7hR^9Eu0dKDGC(rnSt?jDLArb|tFl9=6$>%d@qcp6Lwai1Tb6Z=zKD7J-$R+|=zo8=>3UT%Yf0diT_f5ZVyyOQKzLzv0}kd5 z7>S0;6-&^MTJYS-p7KOmcbO?EgFA4 zb5tG^G0}hw!y(CEC;&tAWanZ8zF|NU!{bMBJ=>yQ=s>Uaf+dh51Nmm2`s!jlB+)MF z{IK^UP!aMp1q-)#BcTV|R$#>5J25Z;e9XSr)~+Hmai;fb^VmvtYbBg{0Bu_tZaYDukt#6{?niu@&D^}=gwlxRT}e+| zIy~Q)z<_9uL@Q$>C4jEBk_04!H<~A7#|Lt82@m^0eVQkwNOE!&+bGo9b|p3WKZgY( zY$q@^;wS^LIZz%xK_&cwGQm7YBeWjk;mU-mOlRF}0bWaM2|=nLo&&zluZ(|CN@74# zk&_>0>s2ruG20-3q0SK#IuESi&@$kuCO5u>^oYayb`?&fr&a)e-w^el1m%*zr+R46 zFjcWaw+n_<`#5Y~nR$Tb1gWSm><7jMhJjoQ>`!Kf@0?orY>FDLetBX`ElAr%pLVQh z{@{TP*Pg*dAd@e(jw2)$=BIxFiyclM4H=y~hG2N;!P&|eMcEyQYjOsJ zzrPdagULeMP?hHqLOH2^?xC|OeB~53tX^cd;iS-IiRqCHR1>0HO&qoJL@mEB-}p2k zG&`pp(NVsPcC&qGKG>2fT)U=!(NM_Zbkel0`zAz*W3+;uSe~lHS!sX&d2f-g=McNA zbY6s7kk%}!anxnKjsj#2x|$%zHlmlbF7XV+up3EA8VluhOji$=aF!h3bfm?Xl#U`b zNk#OiNqiEEAm4Qd()p1Ky}!7gerCuhN;1

    54Y-`Dv}6+BrEvdBZG9Q0fHZGw{rW zwm0=&AOwtcVEW^QX`O#iXS65R#on;v3yQm5(ttgHyzoI@>r~p%Zh?9bmeKG-&#?7m ziw{AIYcXA6wbABCx4g5eh>vrBIRWKCN0HLyh45nC>sI&MceYjT+@5pqeB5Do@_3wX zo)p-W4eQVYJl@a+nsFe-Q&;2N8!sNs;~t+e1kod-qT2H#FBpIM4uvmQYF3Wn>1i62 z)FWv7HR#$e4bI#g<0y^-s6tvgzpfCv4l@YCZdt5`vE~AGTJ9-6|x1Mt;>jY z$8%sJpFwNS2Y(CjNyk9Qz;=b_(Xp(di}kGnNiuz#j?Z|s+#8$Y4xTqEM#{mFUK~^+ zIvQ*!0UuCf-nNq}t!P?3>N6$s88LJ)r)xo16xx*KFet|RvTV?{W zM6paPx@3Q=?ZY~{)-FSnCg?+E*8WKQ8Uo#3gnjmQ)7ak^wb+I@YPpZm!`Zi6lL+Bu zbjZPHeEU*E*BFWyk{|NjScp#7-&~)i6^D3k4)6W84d76C5BJ|2Xf}w3s>6*oN_Lo6 zH9?$oh~OjaJG?9Ro+X6}b`gz#qhQ{S>Lr1fCMbWLC`TV+LKn=YAvA@RPS0JsRh3Rs zEU#Ly<^?ca*e4YWs|pMw!VJxZFeK3he`B+WPi}b-wh>2E0H=2;!~OZfp?QGHIM*BN zloemcoG1VyG`5Sebl98}vTIW;J&=&)w&h1AuYA*y7n2fw>v3`!k|5zBr-!Pgng<5Y zitK-9<2UQ($(TnXgk3?G2p8MRXKSq?I)4XnmaQLOSTG(n)Xs7sbSHegnaC45uup8% z6Fn#KXyY`FEIxFbfrKaEF@p^_hTOy1iM&jimJM%;i!y}Z*2>dMFPw`%mvM-M zEj|pU_E`Gj%0Dn05rN{Ey1eSFGD%TYt&@NJs(^r&jps^)(*o}8DqS6uAwPd=N{(Iu zF?po05t(kCg35>t7g$-ry9A@86QC!Zp=5P8MQg!b>a*~vfQb@&&7`<4;)&xb@RH$Ujo1svmwdXPft_~drn7$v zK+_U9!S3yw5!m?g@3Q4*9zT}o5EJ1+Z}P{XO&U~5=O)iC=5yz50G2wCbPSyO3D*pn zg}?7iNxr3RCN*$k@YBA6EYF&hC46<4nBfHds;ov5*DzkkdmEO|aS8_u&icl$E$ZX< z1L{Zx3m!Suo&E-ecWoGQ{w|;0h0K4vBf+t8ekGY!T>Doefy$v)8dIi~){7U=Q?}*U z9z>OqU_C<{fl9q_xLA5prMSV&YIiBZDrIDbog%d{gZp&bCR#4!Yz_Z#aSJ@O*LQ%S zX!#DL0$D6`IeCqUUAzMV#gk5>HCE>jl}}WZESXVZp_oBdu`VYOZL_s>5{G|7*0V3l z12T`HIuj{2Eb`#5fBQ=isx+seWUNYE)gfh26;Ek{oXg)g!v3yidR2X$m!NtV`svfF zmy~s2$DRJr@;63VtuCn+Y2XO058p4l1`yz=5QgssK3 zdK`0i|2vr0@DVvcUEeSOS{?y?5`hAt3>-|oQ_6z=ks~rr+W1OQI!J$f^Qx|h3{G-- zRUw>Z6vqeXhE=*okgCq9XxScPV~aLC@G@_@MC)-?Wn)uChpN(To~CAD#}==5S?4Y6=veyTlC|3g0Zb^ z%*~}}@f{23S!cldl*E59`I3QVoq_QHg4k#z$J;7e>>~%?mP#!ss-`xp@%!9UF)K#9 zmoXNxu>i|q6Ovv9C$lq-qP3Roo|kh#?{y~9Z{`%N5TB;E^F^y~p8AkM`R+NF*7aQJ zu%2LfL5^T*q>(~N#I`S|C9BbZFI*sPDqCS^X}vMIom8DVfGvMoIwk8|jbKP8djhtg z8LTA2L(f6o)*MLiYpD!zSvRVr$4T;N=I)GD?43KbpuT*}vnkdY0cpt>G<V*0)O zU1>;y{@8saTO4S0t=eyd$XjJXV5b7RgoV=K4~h905ctln0xFYU>{WIC=oRD6kC58C z3T4N5jjO(}y(WLR8DF)|@3jzC&kjH|^U_Moda{7C4-_b$0vWrx;yRo*0W}Q+gvq|SRQMR z*(W`PL3TUQqpvB>x}*QJ(eMb?K?D&l;{l?erWIQEB zz+AG&nEH5#?0MAbuKfosp08cr+~f3%3O2PqP#23hAhdPiQ5us85EW?ufieOrnV=Gv zHQr&xrR!eE6x|gL7Y}*+6A-#>JIMSmG@0vi^Ur^CtxW!5p)@tHp6$i_I-#NnO?YcX zBL6*u4}Ysg6p<0yGX`Bx((8AiMA^2eFyUND z)d0T&W8c;F;6d-7)}gCNn7+fowxiuA_)F#r!hOJ|wPNW;ig&?#4eJ$v%{Fa!W3t?4 z&c=W01%WIjJYyfJi&y#uTrw7y!XL~tsBnp|-Pg16Z0V1Y7HnkV37*V?9XyE-??44BWV+pxQ? zpt(HU_9x)UY^_0d)jypb3U;SRJ-W?MfTMpk=5L#u$ej({QY(TQu0$#F@77{HG?1~- zcH81Ll%)A}f}_l1G@*bI`o(bE+^y%F29>;sTJ`O0MVoRwK@}UOl5OaTxl5taM!r*1 zw2mj?5j)QR97$k%P_#r5=-?EVB?GQ>9+(Z1;E94;FhMHr=&yGSR6^Mj!o5)(c_)9E zWGgTsqVgi90jv=l=oh%^Ti+Pe{+_hk-|xdJ6EFh-arMoP84B!sZAe`QpK5fg6|q-x6lk z9zus02I^ufPRC`(emtI&qo+M$_&uJS2fRZR9&VSadk z6=DSc#GN8Jcy^`CfXVOiew;fyk^is=U`jV0E%)}%kBEY4<&jVl z8FX}QXx`RTjZDv^SZI&=t*{Z6H2Lrgisp#XTi6>vTSdY%Oca4>tf6&cGJ$_WnA=xm z#n-bxILY%2NWt(wk{;STKDsxB@*cJAV!-?q6UcH^qE3#;qt;npiuePT=AbhvBant$#OTBPhFP2q@ZfrO$j z^r?;C6~*fcx;fduxL) z`uVt5`dWPO;adi*FN1)*#Dr*^73PpUUhxD}u_r|F*hr;i25SW|7-K_H^m}mAUA2tp zykyJy6N7XdCN`u&)L6XxX2iI4VKJD65a8F$wSyJ-Sh{3~B)!%sVU2&*SAx&*<99Ik zSIIisW0LCe7^FTXstnKvz8&4=DxNH8&l;Qs-KUT?ekrxs25psmcRw~Nm506>KlfYd2DGor)Q{ESsZ;qg59F({)X5G z;`t!e3|W7~l36p`;P8Jv9NV~QG(of66(93AV>J`nq@ROUAI2%IskEPyb@$=JsZY0VWCjCecC_{f@!KB z^!{0|D@(t4J{IzJ5gy(!v2TyYuGE&j{ z_et=V$ePirR3lrzaomBfO{tN{jYyK5Ked}ns=Ll2cDFoH3futC?3x+)7E-S8o%94o zsK!lTOJfMM{lkCkDU%xjUL~Q$M?aiJKeR)it=QeJZp4?Xz@{Rb7eeRN4#N_W*pz09 zHvW-{+*_`T23fC41tFq;*vGEm+=ZCV52L3)h1x-9_@lOeO(e{OfjK5l?;#A%0~1)1 z!&Aipe0$-0+0Tp4oiVBc_dJw60F+PLvsGQy3@Yk5d7gi%Fxn96&VofEm8<6?3AZ;{ zEEanZpVaqSA1KIG*DqQyg@y8xt+4GXCUkPMvOJ7j{iJ!@J9;Okd!gkqTK+qa;H;vW zWs&(W{iB2ov1NCxfbA8#4cq*(i*l~(f`SEeC9@~An`Uskj=hbemzX@cH1F|83xXdv zFieNuS9pIoE?|J~%aP+%Vo7aQzy=_a^Ub;Q zdHG0mHK*cx47cKOV^kEB{0?C?eV1yM8cr_`$`;^MM2tNL#nMCDI;c4?=$swH3;|DY zS|2;xMC@%m5<=-KAZ#ggDqc5j&8tJ4?8^FKG)RABGA3TZ$-skVhB`1(LGeH~J||`_ z)hGn*)tm`HkXuuFe1@?;jqGNw^RyycH?y|PLznD>5ayUc*|Qvr1OL#C)oG?epLo|WlLidWOOiuT<{wIvEVcFs;2U&t`BdYLxro8vWIKENWxz$PH>r^AY*^J}sf2f@ZqB{wMiIO@6jW8ZsR>i%`y|9Zv4tim)YJS{nclU|lw>cjQE)sar zv*YsdIfOOnr7bCOGbd&kp#8~E9`tJVW!Trb;$?Y*#sp<1?W^H*sSkJF%C^j0CgELw zG?5hDJR$qAlU5RAeg#W7$+JLx*yD>fwu4xYs3LKQROh4zdmf`pCKe5RNaZ)v&F^S# zI?J?ksj1=O3V$7H^R@!B1J@WQyZcAT-3F5{ggcKU`hop3H{X8r@l4fg1LyZlJIOz% zLB8;6JO?VcL=_FRXNybri$x8cp~hf;Q#|CJ7LNnTVgO5~ZNq+bAnqmW?Os~NO(Tej z2n!`7{`69b#5|ykzayjC8P8Nw&PGyh1QqCbfNpB$#Y8G*3h|Lr_{YZFDwh4HZbQ+L z*QC%5;VUA0;#y`Va~Bgk#oBSeor@Mldjab4VOjb2NgKrUt4NTnoHQyb7?4bVp_AL% z+7yL@=N0D%w|p#N^GR8aJzrCNxeo;L6(qvC3Nb7&i%@Mqnq>CFtr?>HGZMh2s#cz1 zAWvb@Bj;+^MAqRF0QhfGpSFDZIj}i_ZMvKVD4wvNJqtgmlw=B zH5LVF+8vQuMjovdg#nXuqykn(zTz|mYLqi&Jk)DEPrk*92k^Cj`aQh`&;L~(!2F>U zYIAVENV7Zbt)<(QCL*kc2T0Mz_-vVtQXJRE+4QzVR|6t8iyOL5L7VYOv{HXr)fR^RjL$gczQfJV(^2Xwn5HCSy5lQW+AWd4jd_+>M z@P9r{$Qn5eK^#(lOaNJiDEvA3aqwix?PS=k=PB@N;3vlS;*vDR1E|rFG0X~V>x2|_ zSaS=cXc~C}nniRk{i=#UK=r^`PpTZur_;Ik*J>s;uXROc9n#x!?`tLR-K{TO(=qH#Ob(iL)lV9ZYJZgVfVTb#f$AgD zG@%*aXnKeq_HidjMU=^-;2MHBD^juEP(ERKHJY2(M~X}3gbYuK)hA^goayo z{{(UFT$RDjM2xGXpw0){RHYWWx+Oj25^9Z4&pCfstX3(>6o{W<9j z0P;&$>_-S;pX0Cq4Vxn#o1o#ZTv^o;lz{AiKSc_VzPEl|MI9f0 z+Peo)5Op7wwCZpR(Mi8}WND~`5C_F>mo1jzcFjytC`?S+np?JfIVB=x)xz-{Az4xY z)I=NONH7x-S>eorA}nt;7UILI z5NRykCM-7K=-XrFMSD`tKoT!ZxJ)mWbL{sZg#p4A?gv`VwDlrUKQJj)qH}Ob7jL_i zJ8SNnBNp`AC1j=a_r5a!$2KP~k(N<^-Tip0c~$bnT3cZ-oH(%@N>%jmJy0A7LW(Ic zt*9ml@ZLY9A~`{;iAW_w3`{(Hm>$hqm}ye^^YpfIzJaqX0?+Xf%y-^@z!>LBwxl+G zjDWhTS5624H4;g8OkF^+DMavI<4`dgOvJg6Hzs9Yfq<+n5Ji&hH+4BO(XcXqn%@;O z1CzrI03qJRHCVLQ4&*j!f#p&*JHdyV1_EB-wD^It+_9UCsUmb|nlikyO|0daA|sjK zwhe4woO1Mm@O<~%@U9kJePmZ7ihvz}i1pe8uDaXm;FGhRs{1oN|$8fshA4? zdA#m_uMNxaCR7QtoyKoPq&y)*;WV#SWxgmY7F^6A3&QG{$W0~BiFn4S^vCvgec zgbMn;wT8dk_Q*1nwARi&;e$Nz9(~B;elHzCtNM9^7B26hRb96FZM++Q0?X*A$F#eU zbEYb`)1H94z+I<)GH2ygwH;&m9M|u)Rwb!9V(f5pqr9tEegc0gZYN)LxTK?W|D#tf z`CCT~)#(4z#&j#@DE3QsPxx265>GBS)lB)A1o9+C3{eRCd#NVkuEfjzs|SwQ^WelU zqkojNb8sITbnnV|;|q6xu7>Br^7|B>e4(_mFC#QteTCdFUWHNV_XF%$3Fwgu!-k4A zFP3<6fNZ+dwnH8P_6swv5roY_7@lJ4=NPKx+myIY0_!`-)JN3W&mlUkPinP-@hhwoPl3R4q8fy9jwB?0)Cwh`LUR%4JIh zAI6oV@B-selcJG8mngJl8cct-h{D6|xheC4Ymu~Y#oqPO zXSo4zD7n(BlKTz%fPiWeT8WW!OVrz!%(FQ*#995^BL9$ogLcofE!tVUTSru^3*^b(~l zlpD|l1xN<*dM^(V;&yMykX|ak&`u>y4<3n1-`eWWZk-1+lh|~13R>@Byra&OBw|y*(kl` z2XIgI(==Ff2&dVx9ix{qhessIVt}8Iq@Vq7Ui=Z~(|-wK=X@#4&>3-W4NW^fi3P{I z0Ow&7fWABUkh%y4<@$r9VJeY$P3Dj?xtqz5AOLTF%vGf8Z;uGV4bi2V&a%}MM`|SU|GUeH z5pT`Qc04`{5Y?O+o+{Yw?GXwBSXSB9;4l$RldB{Xa=hCx&4qyFs#01EWwnZY{fngH z|75y4_+Zl3_9AR|T2FzZ*MV|A5#{NB9?aA+a!V_}LZ(%da3!PE)|C_;^$;_jq@3Y? zbU3&|_>UsIdW-^pfa=NZc{T~sGDR!dx~o4dG#pfh@#l5IzRU$jGW)`tHtFvTM|=IS z{4pnI1&tyAA-V>*&{GlPeiM=IR}m-&l2-WuBF7)nmb=3EI8E#`aFKz)+`0aL5v`Q0pcohE(m<5bu-P||ic|?hL_20e2jZL7I@y8FRXeP-Ta+i~M z!=Uoxo%?DBNz|mmTq1^xP;U=^oSTv~G~G1^V}QRhs4p)(jrnn-nmC*@X}4B{b08Qa z+BicL$5x~n%yn|dT>5l59ao;~E@sbE-Gl1e<*dS9F%!S2*-cCF4&W{_$&Np6Lyc%V z!YVlfYA{T!{wXtn(yte+Y*bVu@lAXe!6 z$N2rnv-L)#*2Xy5x<*lC-@ElTU+XA7|0z-)U+k7Uh~7pCAYBbd+w}v(pF< zH9>Fv){A;23VUfsn574jEU0Sk^pQ`H zM)%K)(!3mG#vHT=-*HH&(j%OW-DKYQzj4X!6UbSYL&;3?qCy z$9~=G$-j_7T#uB0P|GvflrOCFX?Pre<-M(t1wI0J8(@Y$w&V`O-c7P}I^eh2y4cfm ztHVEr0m4a1;*x3w7?Ff!Ph;1mf|yH>ZOl>3WxpCLT!vQU@>$j_`JR#LQ~3sUxltsD zj+xMG3EFke3nBgbp+a6{@y&$}Cg+GgSNUhH!7F15iR)y4FPjkFEmEK2osc;Kn7GFS z1KJe_EDo!47vNT`bxe%0z8~dgSF_Vl>qqp09ex;38IK$3yY+0&_TGbsvUi8Ts$>cp zAQ;Bt9a4*f^9SA}FoE;fn}l!Fp~F;W^CO=Vd1Oy*h9 zG>25IINUQrb_jJ?IQM_09&96(LeAU#lEhF~nawG^&7$9uGO0M65fxML(cDd9C(Sm- zwJ1PHDcaOq zuBv-~RFZ*#be9>($AC5|DCla(DXn zn!7>G_`fU2-B^WO#rXZ$+VDaiEP}X(@ze!>->u5;mgW}soQF2K?Uf6>ew&N*YmK0{ zA0k8ALkbR6Tl$n0XS8 z1H{}E;FZ>4HG%;s$QGbg$8X}`Yg7pGrtmLU=XL^3u6OkVCU07`zKTeY$OO!L+8>vH zd`-^sPpy0>BZe-QZBq=_W6}W@WrBS(UBpgvH94Ra<>5AOr@X(Hm)=9CTPT_nQV(M2 zku73{Zc0_D3OA!mMKkbJ_ju6d|Di)`fU;y?zCYBl>dAZX+7Wg?aym&yOzgrc1cJ9) z=J?E*u$zVWN#6>glgYHQtZdcd#X^XGT?MzLe3o7DTB1$yAQ*6v%$1H{TULn3p_aVU z$30h^2#L?AL_G2wPoS;bY{VB-BA2@)nIruYWt)tV*s_G9@>AmS9`I=-Zd%D`coAw) zSx*HwA!`9JN2@{_o646Y(m2^%L;8Lc>mvw7n^Qt;ZixJC{v;w-NY(ww=t4g*^KFMtRi}Q6+$fgZJyKP^)?D(A%4u4L)u8eV# zv!`6=qGSer==X;GFf;YxSY)sR32!*;z<-h*hHUp{qcgw7LC%X^Fs@!0Du5b$FLo*U zadm?!W$n3wo)Q|+!4sQS$>P?3Dt~X1hr)i(lX`;Lon0*8DxZF644I)F@O78r=o;XP zKgB)AHp2ja%~UD6$fMljfWOD6Ax7>3dl|@hY>Vm2GPjYck>nEMkiCCiFnPOXNiChD zxZj=Gq#MI9w(1cJKY3N3DhInyFZGT$?hOy7&-$4({v-N69=8?)nNz5L_Y64lkY^Hh zzyNFCkhg!R2b?^-PV*Q1>OGz{50IVqb)oSrka;-hi420|4o@kpxEO3o`XP*M{_#R^ zPcT^xBBL`e6A!+YxN?t1(^e8IucGn5h09+uh_@Ov89cL>vYGKdvm> z<9z3xs0A;G>a!?+EF(%CjINb>*0;WD(^GkILgOG?pHfUxGh0qP&A!{?;Zu=pSQcXG z9!b58lVmJG)ArMC5d(jXcu{b;9`iKacRf4K43>@pZCW7aIYNJbt;n(w4GV4VU;*5#byI#I*Z_o@~-Ju#wEvHK?;%4@sh={zISa>YX@S3ae#5v{jW z<0=7uq2T#V57VLAh!Pe!EFhEh%l`ot&^1lKmlBNByqM&rVG)4jh)H*@V#Xmme0IoV z7ryXh$<3*#Y0@LHL|{GI*{$DMK>2N=WUPHF=` z2dL-UO?jI|oR-NE#EoFJk4=|o+X4kKlf?~%)yw%;cjw)Ize?<%d^>D>$}M6s@gxUU z3>o4Gi>QEV(tTILMm zX0*8aTNnbNbqr?h#sD!$BWsP4z{2xQLuVX^iO=WLU%&CyI7S*7CXdq6AUMSt8Ier9**Q=YW?oE8m>A$RlvsKrNs+3DE_#wR@8O!8 zSu(96U`4+GwVt_QzGALi&aX2qB!ks|FTQx zOht5nz{=u7EKLa}_%jBgO^Qpf1`WM}=;!bgDEpT(?H5gNEgVh%c<5=ByIMx6zd93b zj)vJ4r=a`(tYx$ML$v05^l3aP2BaTmb12M^mz^?3H1nH&Rm6d7Kym*b3n`vK-ODEi zG@VL+9}8KLcS&DZy*&HpBE=f9>sy&`&;J2LhnoJ}(?<`+E5D2Q#Y6q&GEL}AY7G%&UelaWoWbyVqZy+OhEH#Sq}#OPpWdGIOT_bi zLA^gm${8kAi>iFmfZjSIaaw7Z%rF&A(>KX~mkhhW+PjXFX@el@01Fj?n?Qy^q?}3^ z%frKGQ2MCrZOaZ*iJY%rm4~^pjNA78&c_ORFs_c=To;joW6I?YXE@M*)SZ{C1v^`(l}X1sOwCA6x=6Bi8XUp!8q$8ju2G;^orOBAwd zK7I-B|GpkPbIsxo`&g#c6fjx3HD*oqf6X(jr%6@$v;Fp)X(+v!UqFa9v2Ga3QFBt;9~ zVms_4Gvt$AYt_@I(!?9JN&I<)d+S_;{s2*o`AXESJKz3=q#~xo92;Py0mD{*`g^hU z;g}Mj%q7yKt6MA>ufC^VyNmUAqkCK+U}QyC1zMjps)`O0#ZIKt{<`r-A-*X0$>K*j zTWLzvO?H=lg=JVQ_QqsR(w0#XN$zGVdI`(wyf&L9)5SZ6$FBk0+*aM6w@ix68*0b#@hjXo7G?ElyuR5V40H1hpbVSmtmscsN6q~5qcMMPcCY=2z~gtlYZ zzFawm!LgTZV@kcPr3p|+XvhE>7Diz6q`>13qb#<~cZrn_#aK&Mjy%mW_|T1H>GRf) z_G1nGvaCjP%=I+jFc5n$wdT}N8UJTMFIR_iu=D6rhn-%3Bh-t4G|;=?PSri~U}!^NR+wMB^E_m#NQl{6o~Zr+a%$vFzzzQ{#QLJ`1$i+J*64$ws!qtXAcO--FWOLy zt1bNg;!d@@wE#=SKd=$5$T}Ul1&7#o!B}j5NRqlEDb!P^ITgu{3ZX$v#J>`^3QqmD zM)lxMkSc+HxopXKyA@*`9wSV+G68|)mWhXNxSuW{`A9w$VP!0X+Y<|TQXYY07x5A8 zn>(nzS8z>8!Wa~|N7tv(V3+XB^c@`?w`ouTZ`;jBl`IYy?(_@#AG96oayq|5l1~$K za_}bdBPC#J@ewaZJ_0-AdNxF&c*CF2IS5SBRT~_C$Ots0vgA?!*+yWBTRl~`^gDlB z&Bsg^KY9U(O0qltJIUlO!C%YGB7R5^GSX8h@1{rL1njHzVpE#f))hp?#A?(AXV$P_ zdS9l8`4R(MbL>bn0bMhmhCwwYCau^IlIhxf=D!Wn2zjPmzrYN)Ykr7{yG{mFf>)&% zKr0=8jHODeS$gT90UW#$%klMDR`72`pK}hwF9cLRWHNy`sU^H!Qo!Pb7WB*$5!me( ze54z8i;?Ja(x%&9JN&6CmukoLn?^Zl1)s(D3G>TuMFlrrR1Vj;e_Lc@b1P8&tO+{g zA9~*1lcZCMeu6QH9use+`{ZM+%@2V>PcmTc95d=8#(%n$egt&RNG%~Zia-c|;d&=H>43nzWuHlG>s?Aq_c~Vu#&0c1$m&A8 z} zD8q#H0kpEXGuhG(5*1M;z35b8Iik<@QP|dda-t1o?4h>BAB-IUdVyI3$ETHlxC+Z+ zUP?#@UrC8Szrxry5IubB3DN?}!dIU3n;8Q12KVEVyZ|q*}akE5hynth?}!Y_ z%g2}9t(reDwJen2aoI_KM_ZVacCUnS5;I`ba;{pxN~C~a$Fz5Jwacw6Ao|8No; z!D=i>QLqosa$XQ0%ZpBb;*TH?{tS)aT-<66j1>L+ew40#0*O=|Z!fEV00pWu??x9G zh--3gIIuw`GH_1A*!?(!8TF2eW(h~-O*f+_Ni=UyOT>UaXIZ62$_V2!Cbktstg~4? z!8ykfxarG&K~#jkW2Ekm2;=IQSOdVmp7Cs-Wdxn-DjJ5nPu>OumczHj>nl&+^%7Ct zN=|qWdeM2=9sn}4Oi>MgjkU|F{keaYk7KB<1q<7$`pXp|*WaJQ{+|D|nb=1 zgQV0e-3bsPRmE9Nyr4coCf|T9=f6=C%HCk_&_M((jN%D>bB-x34O8eV$3CUqWeJQC>jiA?1aDqWTcUF%&`Rd%RTQ@jprCu;IY>NcqRppY{G%VW6b2`P)5GDo(XhU0Q!=eH^uA0^I#5qpPuhY>cZCfgUe^i~!r1Q#Bz<*|#FQ@O3!3 zX(rTmXm`VQPBBu6GU>X>`@=o?SVHaNB%X4UeVX+#QE~&WGUFAh2+ulRu=Q@EEY{g( zs4mz|a4UQGmO_w}2QMiR7Bm=j42~?1-UsXsSB&ZmVfdvxLoOwc(9HWmF>Thw6(vK1 zZR`Mc#Mw4u;Uc*m6ZYsg(tYairtqG3egQM-SJ>NeDy%<(4Hl2T}nHihR znd$2@U#>HlDvp_%9J5&woW_B8y!)El{Z6Va|Mtd^*dUtjtOi)YS9|hTd7)%&A zkpSMC%iNGX=M9d@x{-HrNJ%#nVEPAg0QeDqE{(POe@#^TRMD@&m}lUp5`*WsvnjIz z`=c(7tz)C82f6#X)hjRP?w-e%S@>XTgoCawfuyU@8qaj)M`e#+zBx`kD!L@X1w|Vs z6gV3bKI;-YS!uefU^nujd+NuPPvDQAWEC0aXWE{=O4#OVQaF%T60{Zonib=lMB`h3 zY|Q=e%d~RVtVK~m?DOJUy57XP^bdI=YX+{0W#w{ESIYUBz+DM!6w#2kfQNhA<$!O) zKPh8D&MGn4{O{z6lZgS0H)_>sF&Q&f2}m*y$Eu#L*;VDu5hvo8eg&PZ){Rs{fZZX) zf9dZHQ##ZO56en}7U@+H+GP&(jexU%-ypa@Le2nn;Lpg#hb;NBPOe|QMfS=L9#T1; z`BExKTM# z4^#`et$x+F)vq!gl#9o$e--l2 z$I6z<;#kXs@wAbNWV7cDDA>YzhcL+qw?rb2V8`z0xSv^}?|ljr@++X{PSU7JxnPys zwfOVkU^g0l8Ar(M%4Nogjh8L3PksLm7s-aje?XGx5NhE|K%?ftMbNntG5M9Ri#@Jl z;g!cZyeWfc^aj)I+c^LZTLQC} zoxED75jM?})bZvHt^y|>BsKDz(8E+i4Jj6sQwA5&!y)94#E@Ihqopr@i@3<3psq)> z57B|XHZ%6vB&{G`TsBf6X0z@;1b%ev+aL-1X-Z%XY#k3MMvR2c<;w}@y}it~M-2ZO z3sm3A`|{TDBVX9C;r#d)^)*161JhQ*3Rp>)nB`j34rcf#@Mo7Jt%2nXV54YXK*OHx zA>0m)uhRNFpEA zfT2;Oxb%(^+X`&|Ft?zh^{}Zi03rwz(PiAz4FNC0S_)4nAf()t} zQ^wkGcxG!f8LRWp6|Q6M zJ`N7bmJ*AUUu%(n6q|rTqXqdbXdCaqx1_Qksp)8fpUo{;LVfC)(I2R^SN#qf) zKN)W@kzIsr-pZ)r@UIj{1A+0zj6h@c6$0990 zmJ1|leiT1{bB2viwu~suQnPiZVo0$zt3nu-jG^n`CZ8jn5zwHY_+-20_YGs8E7f6B z`<)M(EZ>bqaP7s{TQTg-=#^F)7SNTQx-4@3%ax=s>Dx}TQILXEIOm*;JcwK_}73c8qo;SaXWfRi7kZSEAjXKl`n)s4}H z#TGpYaizC~qE>IZs%GKzS8=qStP;gxO%xk-QT=i9XCp2 zdZBKA%tYCzii^SP7(fOd>gBe-nU?Gh<{HiOZDe z0^osO5Hc_u#`%nyRovH^zJiY63csyL(ETyZ*)oGzr3$SY>nMr`0IzW6IMrvUC?on% z1BuhSkfT(5a&lI5ppwpiC2(O^7zg)2+LP6P;R=BFpDw0>2sKU;z8Y87yQ<&d@l&0- zm%G&V6(ZSl3vFWRmhs9RPlSpig&Y2M$3qMFWQl&VV-wh%NU$vV{(L8$Z-)UA*_leb z&%AtAeU(t8amSM$FuxsbUvS&ONX^;m9NON_48a%hF#e|-;P_}9# zpey9wsYt?cpxQ8i_z1w!C9Y=)F=7DlY<|v2CR+Kid#8ZYf3-&glq-}dWJ5$a`?OEbpP#*UjTeLsRuE09o*D+<_gwSkQpJPecD+b&5V}>!D!ln*Mv~)vyIFh@{iWwV(iT! zwBtpL&q`LLv~+a)SUq#4ZMM`^M|5Z^5x{XSG<;OF)y2Y_C!uT`pw~OE_2>A&hWpt- z4R!G_^7j=9O!b3$FuJ#}PHnV{LVKB=HZe8D{PeqC1RQJ2bu*HYY2GG(?sx45;-eW5 z(xkB(f);y9O)np;SZNeKoG{cRas{FkTcgJ_u(_1cYck$w)G+ivbut6askMPlWD;N@k;!EGM95`zIt<3Mf`^J zim|~dul2Hf-CFWA=`9oqT~2L%N%~T+=hkKZ?btCpUlOgz(L;buwml;&j>~d}vp$E6 z+TamJ64ZtE91c8jhG;L$m&Cu~J14MO>UIt_FX-YLQ#zX?kN0dwc<4`T@h67FyCYW! znqzT%G*_?!o*yrN_x4VTW$zuTQ)^M2L@iD#hU;{`yX`JOo#U|i&V65bW2vUIOt(~G zx1?>9W_Tvi*=fMG>Qt+_z;0ifCasZ~>{k+?Xq8ui@+E$WN0oIx5pFAj55>!1ph-jH zo&-}177X@{vX*!Jvqubu7&q^jE%Brb(j))j$fD8}ZY(H&_eL^Z-E*$lf#eO&`fsl= z|3ojn+mIC%D0RRO5F^7xLuw+Ae7P|2A)&*|$t+1y!HK|kC^SQUsYa%}Re3UF6Ui{U zV3D)`u-tCXH0d~>7HTOqw>4PPd(0d-rZ1^xMN~A=fP{ZJtS+1hr=9l_j)pgA>6)$| zFeLeu>*1?^qbaj7RK)A*M6CE5y9Q?@%F((D@%5McvY$CSrcmlYO`1rIhc+!ZDDWs$ z7?0fd7ey}6LO93}YaYTynJYGeCy?|iRh=rnyx=k|n`uMTISBD#B;|kgQYL2Yb262Q zj*jZv-Ohn(yfZ~bDud&;r3h-!Ki<4YYH#NL1O`k6{uK(Tk zBj&1^aF4uYBzB&cE9R7WNATgH2)osb9|QO&$!)qW8URD!uMDUZBa0DS+xynzYfi|a z41WE8Xo3n5n+zxLs7L355+7tP-<+x#WU zI(UjB)brsb=3)qj%Io=}@^z3wqVHUL8uxAm&sGM zEJ`-+-9=aYTT6Dad^<2kQyPlPHD*=v5Vnau5XrzZtRK!I}U!mM2Q~C(LHMO>_2avab?P- z%E|MR=r(nvw8t_PBK>Hwi$zWZIzjz4J_4zZf~dK6N_css66vo9&RP5KK%_H*DEEM87Z-``@sE|=alC56Pg z#Rf;(FDt7pyvRsD;UKF!mh%>a~6_> z_H%uV!OfN6#5*sHkuono;%vJ;wM;cD?j*naq(p|HT@1D0caV}*`9U3vG6+lN4~iAU zFD?{)>ctyDr4$X2BSC0?nmDl?CIqn5B^@tYi78@eJRz_D?y7z!DXH>DP$lZU1q&RE%GgHxUU%EKtwhJ5o$~96oN2;a!^aktp-Zw7DcoszDMw|&SSmz9moT^K z0yAG=dg6?Aw>mEqXWJAH>SBlf>#AI($}%%%-C#@=lg2ZT0YQ^VzooPRp?^nTvVOiK z+4Ub-Ey3>9X%EDIrATgQ-$@s8U1#@hk`)3dsVRrhtL-ZA%DF129dxugi#YzZSMEe0 zBr(K{&Ksq>?};2+4TXr%Ot?1Eb3iVE=;a$PEvl@H$lhA;O&!V z$LEef;Nal)2)?_8--g(4$M8?E?83c^zw1d6SbL4+xn1!`?1&U&##++CF9lbjy`|q| z=QjzM(G_XvIyOy@Ry%9J)>hNmrX{RA7sy*Yawr%5S$i*a93)BZT0A96aS;+ZB zN?&OPXY4h}9g8;aGq`IxLZ9pu?I{{A5j7fxQI*ku^Luo38RI@1gMr!`%<>O{b~2;( z8oz!MIBOh!Wcy8FTi3BrDvL)zq#EDDVm>N|YqCzF`%G$*NO0dGh*BiCpTtg=E$2Zu z7>y+zQKkg*wJbjb1U>6lmE4yt6Yo`=9sopJu%MGcWjFP~AXVl3m>XzWl%R8-sEP(J;*lZ0(Zi42wmN$BkuA z4J5q~DUcgi6h;0OD~tw>$n|T4O#@(``T$CfVnKWNOw(NA5NE;ZB1GI~Cv{RqkN0Jo zok;?5Fq@f_DzHH+%eVkoZ~GebPZdXKC`T@Tcv}*CyHy_BH1yGs%&XeP^`>SY7tuww z#?1G!N<4*6NWj3<%A)4yoPIuof&I2L6=gIrM{k?_xNonj*ac9nM0QCSMazUHq4r<* z7?;Eg-4xC0q;c0XBE&jzkm3roltZUO9%TO3w)FED$0W&?P%i}H&#HKPNrB!A)j5iP zScjf}w9unPHDF8kZo?yD8G+QG@%@b6-t&Y}02bOJVq9p9imvdN(brN>pLL^X8>K*w=xX)ANd-<_UYm_X%;Rq4XwXcLY>cv!Dk=fqt84dO?&=$AvejdXt zJo(;4dK#GPJZHr5Q-wJMS%)F-RVTX*TG6Tef6Yej4E6Wm3poP6jO6GfbV8B|sR*N3 zb#KLP(e}5VYcnn-yViG_myUCPypN3iLoTnJla?|XWGir3XSC9r8;cw{eNPn1%pECs zp$4miKs=rIw3G;H6J&<7NAL!LT3R5*`i>B)0Hc$`f7E5jVz^8s0v?s+ThQa zWD^`*>Ag)p3|s8T-S-U~7Y2O{@YlSYSKt~kDAQ@4k(gG5R3^C}KsU5YIi3ENGdT37Ye zHPL14EmjY%EIrY_#W?s@wwZ225g}_tNJtTLaYZ!k069R$zp!er+vUj{oD0`zEq?TJ zCmrER<|k=`27C}af2=6#N@8n|ga%`(rAE4mYmk9Eb!Coj?35+)f3jC`CFPi++ea*0 zZh@q*eilFEFUt~?RRZ#(Rm6LPuV)`#Kr5GQV5P(fX3ak=<#N`tF8C)3Ainv!$?mFb zZM&LORW>~24XEMIE}WW2dvzb~aWSy3@Q}ao%BS5b|M3F=NREqw9{UtI$KdPy#H3th zTUT|UYf1^?eu2z^e+SQQ83+xibf$kxvzG`MIXt5syQy0& zG?Jbxk^hUKfVt&4*M!ZUXKZUvAE#7nfSbAn*t`gV5n~WllutSkbt+uzkBMgBaw@Ef zzMYWR^wDyP5a&Q(C3NHePeY5f66ZFM;?qkzV!m}tWG`8@e;~~X19yYUFo=DA!l|Ag ziYyt=$D*uuGA05C#e4(Wx11`t{nJ}nfBZr@)DZsO-YkowCJK`X!XizjyLGMa1wAx8 z8@^6|{|UO7{G+^__=j@SLqD~%#cPr_A39DHI*bJ#@KWsX(?aUZlrVPMu8Txhb%%k> zXLz|mmVd`3e+ZBY6<1&#C>KZ+0D!*pv4%RLYA;}gLL@W8nz1K=8Gtj)>J%rG{#-OB z{s{FO6BIw|>qoQwgIqa4duv9lb*+9Ga3Ytqb;bd@Ylk^%qoUGdQTM~#sRYb9z@AfD z-5;G0=^5}xXMhqzsH7&W^j@ZGMmcLsJ-Pz3b-lzi^L1vwcuC~j$g|BbzhUh#hq=ZEV!FyD-G+H=O$q*r>=JcvqZandrZF7My_okb71 zBv;7;e`X=;Tsa2?!#!ng_xW*b!#kRxIcNQMCAWDk@p$}70+pqrOo##Nx}5=1(oOMs zQ=&G6+&m-LqKE@NAyMGd)^+eZGSnB;R&IsYr!S7A?%?&a}C{ATmm>1T}pGo2-Kd;~;xd(hH~Kyy_Lmj@9Dp4hmCU+VRd znjg`vU<19w$N-SURp7S}J$Fr^%m5xYPV|1av9XmN|r&B+bL%c2-f+Lx2- zp$p>Yc~N5)04>RB24cXpxT+M+0Myo1=*8&AOOxm9w?Zj*Ts)}X2dafZmeP?%!-y3r zJv10rjL*Z~-n*$m^H7|y;7{X$6U=1kf2yq_98({ix}v^kLMXh~zS)+`LW5+h$@#ut zqySxH**LLDK6YNXmx zlizXRfx{yyINOb24?&Kk=PuQS#Z?*$zRq#jH2Y#fe`cyoDY7Pfyh3)ZNK`Ze+pD?4=5_KH%Jl4@Ab2i1jupauBl&ho(7^WUF8o5wJMLZy_I!k#?x zOJpCSHJ`bCOc}m(={7n@a%d1uPlub-Hz%9NP&9)|c*s`}zRgiN#tbs ztsIqmfW;{6d4Bx|oYo%eP*i?MejB1I<-5N#bagyTQ^mVwQDC1qU(6}JjeMLKUeC3& zgD1`VH^~2+*hZdG@b=qE}f`(z_h-Z^gd&h>!y+tyGvze`mVJ#c3=5 zmxJ+X7MGdB#)r3!Zcv&ch;{;cF-QqjIq>R}#Fj1j!Hd=o^p+*FRLFs|;$L}Q(db|L z=8fGi+^WfSElq+i0qlM!rQlo|i$O9Q28QkMq)@KHely`)Lch|_BNY;UJ@`Q&4TAy2 zcsTd$lLPtf%Ao#)7w>Bgf1vh>s!YZhcJK6c+lT)o4u2BlFu1!Gj8(G`PfD#L@Ffb< z-4@EK=drVOy*(m;OHQ2{B_}@v*Dr<>%}j>+7bVmkjX4zj>f>Eef4$aQeLqhH!v$wK zPr?|E&qlV6_Gt)AlyE4uG4R{b_56o=1VON!`Vp4foa}GGh^n_CvoR@7757E4l^Xw(foFf@iKCvYke|@V8`JHK&$^Y!%zO{=5 zUCC*Ls?RBcu_MyY#?-7bqG~X3ZY7U0N`==PqZvY4K{>QvyY@U!daim6bhX4jrVO`E z`cm^fH*5f~w%7kI^fY54#W8@(z)$lNw2H~mQJMV3d9BvlcyBMSaTMnO4|RFGS?d-H zDidcgO+y2Cf7I}D{s=V_14jhDfRLLzniPpUS>RF_#aH`kEEQ0{T|~(o!OtyErkof9 z;u^D46O!UP_~`oKQ4$&Guu88uY@pmQonW3m6JLO?92AkliL-_*gP%<%r%-*tN0QCPW-5UvIP;ZFyb^a6uDW`0G%j3STk$WdjW~_Hv`c`2^b#ND# zMq8tcNLbb`I9E3I{n#Xi0&ksrvMwc0@Cx43vc;FUll{R35DyplqV ze-`LZT`x^ON~0Y#VQ5|=D5=Fv0Y~HRk@X27OYS4(#Mwb|$8ljV@UPK5mV&>@T<)o` zF$MCt);I7T7jE46=MtF(J_bD%-)EIH;^R zA_D&b3;rXu+!&(rguW}p0G8+>ex$dhf9IkL`7p7U4UuE=qA8nTtw&?LVodI!LX;Fj zOM;)UZ4i|HkTEMK4PrCo5J4M`kV}-|tm{g}qdkx<$S68#nzC|);9uGy)kLb%@@JNO zd&Qiq$=XOC(w=Eo)w&olh@v{hu*lN;7O0oAu7KG?J4`Cb@~oL$hsJnXw(b$ve;P#E zmz^fOe%4!y3ijU>&l3&O&)UY_xl5Yz{(hHNc(2c_u50EfcB)pz@AsV!eKMUs?v>%r z8ZsW7>ZRLOk55r1%E26>V7aJnBh+V#aLiZls7)S7X7*}C!T69CfK9)x656wV1}2^! z*W8f41kIKg1fLIot!)TM=r+A8f2t3!an>#ft&T*ndXGGr>n0GOcHXS`fMFHl+o13$ zBIMTYvQt=pUE8VTbF_@h$;Du1sn1f#u`EUBjaE%V?xS2Quz$0WzVKQaGN04)tM^95Gi^+%aTGc1^44Vl(Qs|m-KW`7BO1?mn9Qdkl9on2+c692%e`YjU0xo~Q z^t^zoOpqw^f)0q^Spq<^^)tR>G{3Q796!ZD#1J@!R~v2och3QzEx!MrGW$3_>cj2D zIh06EWf#{elQ{a>IiZjfLjXWBBLWXCFFd?f5bJj4eOEqO5zkGDs44aAV>#R>$qqfOqUu_9R}R>tMyJmEA|D z%p5?7ayn&$^KIm`0|rZTwj%qtWQ7Tb^a`coui+-{#M4CEU}HftnWB~Oh{ zncZ5*8C5pL?oW9We<$olTXaN3=hinr-KO%iHj(!yi{5w@h+! z3aPSn+kvN;;W3|)#+HimE9+l!f#hRdEDbrdbUof%JGg@Zf1&NlXKs%32}SORtw$^J zCiEUGrrBV)o=!sa_uj=k6c*&r3tGXco8MT%v)z-+mEEU?{%02)M) z#jcx-2_}h;Bq}NDRikTyLk^pWcH!@z-d>l1>~rhdYQfeHXz3a1kHS*+B8a~uurK{N zFS9i`*z0Xw-!dL-06z7@=}CeCCO>LpoUjQ{u{13!YBN&Nea^w!mFHdk9wa5EQL$Rd zR_@_4f74MuR)+z0DXS7*S$W=)!0kw=E9e8`@nkcS>FeYMnTA&iQ;hXS*`%%9tBwmX z!4*vO_%-=H!^7LLc&;&Ys^B$OL<6Bggh=BA-RFSNC(eeK%C6oU?i{+ETk%N;6CPnL zcYh;|6nFN|K@Z2bb2V>++yUJDcNkGJ2(qzaf5{-$+MBbVUvH4TV~Kz45y@iZqgkHx9Ji6l-IGw@iY% zy|WhOhdx#sD_v+Lr>!F5{)W-u+Eg*B6c*Zc7i}n)@h=-wQyBw>pj{<}C@PJ&n0QUJfk6*t&f}d>1 zu<$M|;P7+*?=HK}_Lbp&(V|@$9cpG=wI}pI9&U3%)m~Qa__4)DFTX5NA`svGf2?+- zf9wRwY(9XK*H6@zlOwaHT$ebvaa-@ltG*=F0psfG+6z8OP1Na<#6l;)j?xT-Lb|Zs z^3Kq}c#mI)k-e8$RAU21>lkE7;uB!1?tzirc}IQG0r?Y5*O|q{3Ves(;f}QcP{%w0 z#`Qj%n@3Ru6$K5b)rdb*Z)|@Ne?zFOZFR5|^<%CGP+(I!Hzu5w`l0H3XG(-ylIVhl ziKNi4F7+J)a;b;^Ld#z+x*i(`$)$A4Sm|bG2d;rz$}pX zDk4f?A}Q=2J&ULAF&W7LqorMVl5Sk1`)4Jyq4+{&+WNd|a7XVwW+ZxYf2%MyDH2H9 zx#rqyBOwy)kj5N#0Y9fw@|5)QS7Nx55U+9;f|Iez;8KJ0bR@G3&}y3gK_uIGQwpOf zKS5?6L%4Vx%P}Jb-fo1AMFoDEeyJj#{B8jrbL4@!=?JOeu`${x4GggkVx$EN;Wami z^)s(Bm?p0k%(zomcj<^1e`PpWQGTFdd-iEHci}mN{#h!B?WR;?cul7i&1OSh$&cI^ zS;Nu(Va>25H4!CnQ)^Mz9C@uVz2XHzkuh?if1)OSA5BvqHPH8%o@YC_@2(Z`BiGkw zH0!2)ji>@WdG;cr3uZ4-bV@*s$>4%ph$Ew#Ya@oHA0k)y#lw_>e>AeFHIdb~`lzq; z3pe`3nJIs*^rvOVsj;&$V^@>`_z^d%Nem$vs5SP9a}zQ*c}MGG)DhI zh)@BE;OBduw`J0ze|0}xj85K;F<8dYB~8q>AH1-<`WH$VZxW%!UwSpo%p?R%`GW%URxGZaM)i^m}qG|iy`cPe}{i25h95o>g%*tb+HY+ z=4JbO`;Ww9nm4G0M>vOLnOFe@$kDN2ADCHuAJ@>1pW=!PPAqYM{P8XM7)}n?WAYlJK5+A_jo7DEGcb>U}-xy}tBst=E}Y>UW^$caTs<1xhWkczdxX^~`Jmj~kL9QnBM zNjk;l@bV1vsx#){{VeIP)Ovh><8hc?P2tOTN)D3cBtT~~L~Csn>PmzgVAhG&yKrA` zY{Q?Of5hO`+ZX|hbYfkQb)Ki_Kp^3hk?TkZ1-mmX;pfb5eaf0h_|!SoI;m^2vLCvJ zNY&-~%d*6U09A%{H66~_mYIYQ5aqmkRyD=?HkE}pBw~jmu#RRA10Qf2_gq3 zW@^*%h(&(l^bfIxnWI9zBxX-tONge`$J}t1Ia#imCRy%zeU!Fmv|&Y z{NKEBav7sx+~P)dN)nT^ZLWsn*4&v?S{N`hi&;nUnKe6FpU|jJMt9r+b2TM!89BYD ze?v0BWlrE?{_@Ik1Yeg07{o`yqwx0_948Ue@lQLk;}L#!ogLuJAWSQZzamkc+s0#Z*hoNnT_Bw zuDeAVb&Lp|U6;r_hD3uv5uaxflrvVV+BEWDm&Csj)MVkCL;BtJJ(E<(oEx)K*F1}V z3+Y-ypDCgPBO6R{3936!W5TG!4`d^AW;ys4r|;MwRd5^pGiIm!Vc!?Oe+6>f`aSbx zP{352@1)>(->=oW%kPecEC&+Lb`zu70sU%B`jNnf>1`GLx9FZ2JV!?o#*3O?yku*! zmbPR9i!|TulU~`@0n#S>Jwhc)2jsd8c;>@k?$7b>G8;6oC#fu33~$ij&?Q7MIfLdaxf@%Yoe_~K=b z&Lfs7@ta7u3+ClMe^9{ixaUp8$VnC!cImsNYOeSzEv z?dnoki-F_M=H9CpGT!$H*T2xR(!k!30o3o6MMaXWR|nGG-4(f)V@(#C(V_e)8Xt2I zDmqpq2gV-QLhc2DQmo4dmJ{4TX4k6HYtNN&?A1++IYc4{f7Ljy1gByeUbmy5UorOD zLV)178H|WNr-R}zFGJJp=b-3BH=LbF6F;*-&PC>Z@@!=lfWjcJ9>P8KI|ene30K zJ0qb)1#r25e+_^zp>P906!&>+W1S8sJy`2SE}=yQXrN$8MIU;zuUT4M2IG~@o7;*? zH5N43MTQV}_Z!|s(|bnzl(fwbffgI4fFz$||IB3)<-5hg05ARaJuygu6)z{q;aTA? z?o3Ky6~+O~h=mApOme3mH?$k1M5xW^XZ9;%AIvRSHIr23RyH#2 z=%Sb*0(5V8f#g*(53j7EzKQ`&A>Cg82%5CG7&A&9Ouc(tsfv`q?LdqiYz2)4B=D@M zgdTfx@x!miLzb3zR=1X2ZyC|!QevBpq*YG!q&dBaK}8dOgP$|YMH^< z1U-SXe|w~L-Y8bo=tV+J<+6_I`(xoJ~#M{D! zNm`0!bJKfHRZe(n2(!b_Yd#Mgb`dDw6G{!h&4m_3%euu485XiZ3f(NDYxYgU0Vn%a ze}^6T@&;T1WQ{ZcTj}rt%IKMoLKvJ zg!hYPE9SnQ7-coxLI!m)4VI4|isO!S_C$R$c?q3uFa8yIT#i1b4~A>kl@C1aA(HV{=(dId~Zer4H35 zSn5U7?az4bBr0TO<8G%v7Z=1Ef3nvKjH>3L;I|uCbbF?JNlluPj?NDqO1hWeG$#}s zDT+q4C_p0jbm*pw$$UVS(@C4F=oQ2XgR)kj-%zJWbri8CzN{3Oc63(kK|*OO;e##Uo7nwxzT#xN7c`r z6o8KTf4v6EyRsra+9L`RC%R5!XiGsMD@g&#tak zL$p%mH5>&}U#TW@6u@{Yf0bnaAjY_SG7b6IS_YCIlT?EXiK}&94ZvLC)m6Bs+X?n#1R z8HTdndqUx+Dh-T62PEUaqJYoTEO{Z0>>I)4v~&IMk@rM(yj+CizGOGU1z zfLRhlI!#Zx95-hge}%I~yZ*Zg7hw)xw#UvF_9@PCNz9voGM;}=jeIxlI1UYr>;E$C z&(3-*>tsIy1y>W+th6D`2v8EtBcpK4hK080k{^?zlsTf!j1E74nq6P%oi|-nmA`6K&wH&klP^OhiJzhIUFd6ck;(<{c-6~e?C()Hv|z{V743-Jn5N3 zJaz3E|FHxD3M%;wkGpiq zx0)>t^Xjh0e=qJ_3ku$=mjf41^jV|H>$@~)cZppKzQZ9F0HAu9zJ2T!DUklyxftsx z_#jvH53A&5J&~;I1*1w!7*|)MvaETd@0jv-*Q7e|M=Ns9h?`leDYY%hketRO~b8rR{s89PxmKCVCg+Z;aWvk6Yh5 zv+enO^G^B=Ag-zJU3WDhkQXCXl!>j66??i?e~k)&UB?X7EN3j+<15p?dttgr$k#>W zMZEm^y7mze%56Fq;RJ1TN%{QtX z!iTpAU?a9(^;Kk1Bh!2B-`QKV@>V&ye>sS39$u;H=KR`FC(2=qA>`tm@ga9HKkDbG zeTo_XVz^$i%|iR3k@jCBLkRXjWyJl*X_n(52$~XRzlEQIFpm<)zKZIAYtY@t* zO()HqhT^x{e%}t-arhH1O;l^NSVL)fmRGxy+M6%WFgHQjLWZsjRsSq|4pV=p?JB<+ z>RZxy zvt;xY8G87^wu#0S(ucJfX1MT1#Q1DEqNE=kKQRd~(|u?6EPPUsCTTZje{7BOExBx{ z^ihP=VkmU}=P)>WLq3kF&Xo58F<0;l7+KAqR&hGdy6mza6yf_GRh(Z@@tzN_7yQ`-IMiV7g z#n01SiKU{|ySs=%Lv^HPn5?AWI>%Sqf{;ep52zq}{DmVweWlpRe>OvMhiZ=NYJxggi0@UP#ulwygOgf16h$_F>`&WS*Ndl*e2QJ_L^dTC<$4Q}J~JWAlMcJV9Rosl@!%P! zgDgM^n2tucgf+QCqKEq->pv^XxNf;TTXKvqH=XW?uI!!qq6-~5#<|8b!_o`q^B82} z|K~JD@?TLwOQnk1<5BljpLjyC$ez`*ku@rFAB2ai_$A*Q?p>J-X5ejs#jbYJF ztDt9^e=^c*E>#i&?T4iln;al{U!*4DH6=FeDHY3rwe5s23-)1%vgf@c6eNy7cyPNB z&h4v?{%xdjj{HJaUZKLrvG2>2iV zxG0Tac`-($r)3(JOd2{GIDMxZ_`dO6nVT2Uf4DK>m_WvTY|zmBU~Z-&n1FaAs_Pjt zH>Kv?j#yz{&>wD)24ljUVWpox9JEn(?HjC*f`}idZ-~Jb0j}Y<7i<$0qq5+~BK zm$Jyq_Tr;`1qOh60@c?^niF~ z4p#Q3<@gGT)E4u?p8@k(Dyz^#xqJ2O$1{K6YmNt7Tr7M~=0bUUhh#&M21ckknX*dU zwz!NLH+}2E94Hu8acv+=gidqb_WW_i`CRY zz7}Nn3zm+G%FNtqmsPS4ULxC{g|tDvAeG>H!#?p5$X`a>wiR&fs@WX3;6b3pXgm6g zM8S2xCJ%W^$7HrKBYHc|5)?85qE&DM$3>!}1}G3XPI1~aN&d5JZTxXFZDPRmid{aD zQcvpzgF5zQ_UVw5%=j+;f8KTw5khCQ?z^zEv`V5C7o#IX5GCJ|6^0+wm#%Du?EHTT zQTsa7AS+i|KOsz^&5$aaOcNq{KC{YoyX!~KB%3y@D3d#Sw6qEZ{2HLJHn8?2GTR?d zua9+rL+IrL11OUU+^CDXVq*s;`s6Loe@}97>3>Im?(4lS zPEm=du*v(LKB{i4JF=TaF5?MwKn7^4=4&)E2T(DqmO>21i<`_QBF(w;;hfC}jQ*wz z0xT4P4JF-*+Uj(Aj9DaD*pO)oM1c}ml>`bLP)|j78DbkX0O*)fK%+{dOj?QV|81w1 z(e?}%p)3LLgo15|f4=)N2d=RK)=Uk|9N~bxvYz*tC8NJEdX-vu7JJ>D%9QA@nPAU- z1w-UdA=sY?wUJa!U7fBzWNOiiT(Oqrs1Hc3iaFm`5`fwg(3n=avFQ_7^eeE$!Sxw# zaYNlPq zd`LWu+4KZP{Hp;Oq$Cjpt*rDY@b;f#h+ch}Ih1r|c^!NbPZYD}4d6b6m69U)Afzwp zYk_aISgTx!w|U}&rsY})asKN-{apLc5-9cPn6ug~NpA+xIZ}X;TNcn&T%^Mg0BFg$ znrSTajXB(jf9)B7F|S%lrXVwhFI{&6*;`w3!Il!Jv80uDCn`GuGhh(_RK&n;RPden zSKUQQEspp}|7dgT|HSKQ9aC5lvTsBZ*93(~LK8)t(cgygnz>8~oWLThu1INcoOQKd zA_(IIg9eVZd%^*w5vbTIKfMj98Vx1!1~#RfaQTP9e-gN?^D;0GGXtim6eCKz^L6p? zuTUuhq{5=6Zz;Qc9CpXXH+x2royiD-i7}!I%P61n87#grUQO3A&0tMEIa>=?YB9Mr z79=Hvrhfd{B*J4f$mfe>cxg8nfg)G)oS;EqG5_pOc8IXq^mhvzN3Xe-!r_Ogy&}=P ziq|83e___}j$HzpQn2y)9|=>b^#dE?VFD!bBR4+HNV@mDC-9HTLNwa?||z-2S; zIAd&vj_iX%+NzU{4hh-g4gxp1%GH%}v!QQ0WZ6deIoxjm7`o9FpQj&uqutwtJf6W==~x4cbE+wCl4)&Jo++ zNLy7$*GE7!^kt*kJPC>*zZKsR_48`mHesOIwm-235^*buE|@`n2wvZCdwPbvQ(U)w ze`(K9}|Pgb#?EL>g31l7O0kRXmqBu*cEBiuB;l-zXR(csfP18oJE(n>P|EcoJ!=H z=Y+BU>*kE+?k|$51Jn)H2vv^Pm0(W7d+rsu z%o1>NyJC~>X;IwVz$q-6M3VytZy%u4FXItrZT#{*ZZdWEz~>a&mazW?;5~eVJ2i`D zTzeA42tfaGI){Oip=~H_5uE_k#?74@f{Cf7?C#r5w@}6mtQJuowG1D`Teeq*9qOwQb~&ozAom zsnc3MPA8&W_|+MHGAY#!U#970iEbi$*S3uCo^C*hUAk=tb-%#+%4y>w1433Gvy3b;1kDDnh*7bA^9t?+Pwh5bN{n=HNrwFuG zjp`zm$1>}Ai{y*2hma|&fy8IsI4OSYf6JH53ew${yQlr) zEb59TIDM7_$4-woz3eb{|AMlU^yS(9M1AnQW2)=-yK_z)yH!ieAUvu@Cf750|^-I=Izh*z7r|H7R5WMCAir~!jn%azz(|S#yu)QO$ z?7#jq+ABrja?e~zf9TfDZVLdWMDpS-kzaxdXQjh5if;%U#LH&vy#~)<^*)?pn01NT zc|NdmZu+^h;P7f))%VEcEAmOn|t4u!8RK^h!T!5 zks@zrR=^?gBtjW>P;hs0_qZz$IO(waCY7<+QYXii^PleQe|_;I8yhX<z(t|+ryLMPFL}|Ei{q@SZ69k{nDtuq}_ai%r&OSO}IcK8N75?{9 zD`ytnkRs7UP`#_+Q?JuF5D^CRVnm=&O=3*UHp<{jvqTWl?QWeiiQrvqOMpBS>= za%yQHZ@@cAe<_{g-(5Ne5K-AfqeR{95S5#fr(i#@DW%H0Ss<8&+ z|6Z7Gv6Bd7xq<$ge1>se_u<}7LUk_y1B>?u@M(0C_jQ@6yM3dv2f#_SGe0lBGn49M z5g{OQH*zSre8c*3@$&vtGkYazCO7;n@0H-^1>-aA?WH@VF{G zZCo;Zf6M2n|0@V-tD8!z59>#;^$A~1pA)ici_$E0p%v;;yZ|yOsv>otUm1M$3T37Z zZh^Ti*17bPVk1iqTm?X0lqDrBfQei?_*ZnZV+uWHPSz?3_oMt-+*Gz4$VFF*d}5etbWAve}z`vM-sIqrKByuCL2a%tPoDEy_BD^ zAHNrUb}6ushSKZ*H(q{ogJqf+QKpJ(;r{86QaJGv^Nb7zJ=W62eKk0muUTNEw0i2s z;`wixuVjDd^ps|4&W|^&?QtE~cI2w%N@LoY^(^P=`yB`dwvuewDv=unc$q>Rs=CIq zf23pj0B;h+sO5OwM2Vs<-V%B$98$g-{^2s(2JHXbtjwgpG{{Xp@2o!XDPwGbXbSIa z?o#@MItM}g-_|>-*uYc?fAkaiJ=x@AR$UMrD~xXY>@|9H>$%u#YTYT~ zp`Lq9Z9aGDS|X{>f1EmHf!F^m7Yx)gSlN_s9wx6JHZtt}=qEGKo(zB4TZfn5NX{N2~wAzrWkn#&Byx>f0)HnX11H= zM?(kRilg=Zu}{J=4`(Ufg(9Xt>EWmUXuol>T!q~;!W==1aumbN zbG;>#ivbc6_xZLxvAO{Z*0!igOyK&oEoc{LJX0T+c@NV|=$;t_f4%|?53Vu#s6^7m z?#3n$tBo{!Q2R;p8~YyYJWi9eU7q4Fdt6RwmE+|WNTg_GLTG`)6?0%fG>qwFXcOVr z6+cW_^Vae@rQUh;E+CLO7gzC*o{B8Q>$?iY?l#|HSp1son=$&L2$HYS&<9-MK{K!c z-sq=)cLD_zV(xB3f2q3!06W%;=N6aoCET7gaVofBZ7G*tm*rb@CLUY);|^hz0pIH* zBBnk3Lv{8EG~Qng73cq;QP|MtKIlta=T)U(!*~2QOEJ%%h4x+wQ042uFwmHAL4nct zN(}msitau5aQj6J^lc#U>gkP-gEtt4$(NLQEl-)xcDtGce~e$tXGO4YU3{8SJvsTG zt+*?YBH^y|N@b>hEc%5C?`=^@Ayt>Ua}NF63OM_iqV!;BOx9nYYA#J*QOHzQvUxG* zLj6aaMcc_`Err~IwRLaHsLhcMN#~P{*CoT9mxCw)yS2~wiy5rSp{IZ9FeZJEcZmRz z)jJ1f+0!F0f2jUre1D`_>phO#CNL0VxgsddN#^1v2ecx59XOBvBcXgU>XhMf^AViH z(D+7JUvWxqQ{rfCkY94rw66@(4%Yu9wGkc;#{@ETe407umx8SUDmvQrea1*9dIg71 z)Jm14)J6?#_c+d4e++0PGs8=qKSU5O(TATf{>_e_JV>(V?(PsX|=6`xR_)H}MoI zq`w^?fd}{}2#zubvT1lK8n$Ztdg;^Z*5hvVQ(MeqX?$hDJz=aD4 ze+okY`24W=Gcm?T}rT#HI4ZS`vI>Y#IE(a>mwdiD!7)nYH5I!@5}I z2%hXPgbL7)j^c8RKT^CaOW?y?^EG5#!X}0g@k9{bp8KHp| zl~MXe_J{$-X)$yiFqJFa2g{HsFqEzUflxFQM)Ae`bQqb?dLLO-o%I0VH2+g2Bo7YYo~2dFV+N;X?|Bz@=9k(3DkF=XExff_Z(P0Uo34c449m5o_zS~^HRH+10UQd1Bmodmamf35&SK)k;s zS_~h)EMmIZb4J-z4E&7^qk{W`9dS@hSwGT35uPXjHW&ALHZuh$E)ET2LDwSaF~7y|@MOeYedyYs#>6SZd`dAL9|xE&D7_Zm|C-Q=)=QxBBs( z{E;^{nmz<5&L|Jpu?|~Sw)oW134b*<|8jPPcyN$9-htOn@BaXtRzY}AnJwO}d7PW#>~5V>g-b%EEfjy#`L65Nkj|;8o1pUbia(0xxR{_pm zSv$zVc{MJ|elx0)&oT&`c?d+96n8R2YjK6mHL@4*+%?r?h=fD{9q4iLGJh3eJG?|Z z7dmYO9L1X%jb4R7!wE4>9Bc?+!|g8qaD+Ck;h`!=SXGI+0yhA=5Q@mgBY%(DF@q(6 zyDQI_x#VaLR`!4cc$7`H zvWLJ$0>j9tlYd8XQIN+)cf977-dLEQRd+uu+kWS{S;8vG`ZT)|GOy!km%;h{S3I&SwCrt6BKpvMS@+ObzZkUw?Sr@H`T50DuO} zvC4_UHRo?1iBI#@P!0twai{p>^Jvr33kxqgEKJndiYcqFXsEa>2+wdh$M2Hwsa!0) zY*u_Mz*C}&Kt>`e&Dy_q^Oq~xA3E_VvxC;;D-piQeP!!*smpvD-Sj-=fFxYfFZ985 zvWbIPxn!BHlRlBVrGLh6100i#ZAbt#^lvZeUH+_vba_6Hd7^5~#_%@j2Hwq1kqC68 z#uX^MWgZFs%Sw-OHa)I%CHo%DwK1{x%}zrP%>et1`fAddW8Li>9Ts8z$#YW_6Qu5P zIKy|emW^Qh)`7pGiP-N3*-2x6$Z+`gj(h3Y%WneK$N!3v34dNs=^MV!9h%toy#`zI ztFzExpU7<+W-X}g_FC*hCqkGiwBSAJ zM0jV}LR)jbcYm)jy+IB9l!QcRm`4pJ7Vm1;n1YA$sw(ngtRTbcvDw}ZIqhMSTkf&| z#?#Snk=+BmB;JYQ^7v5!F4fox%$^X`w$tpqC6yrA`QmB@+xHS$pzJBDHx8lPF}{<; z_@@7q=P(N+BA0y`Fy8W(D$dO#SvJ8@TnGeZK`J+|y?t+#>_ z5Y3^-0N9s}PSni4#~zjzqz%Bj_wncX>HkrNb%Px8=h;a78Ov2$>x?Yd*3kgfJS>K0 zE8=axDHf-b4|t8?BU(vFEd|H)&z}?r)yOH3$!_tTF1!nzO!k~d6Wk<|4;ch>_~8gb zS0HLjUVk0Hy4*AvDGF)7R&^ zw3r99{<}$tI++WG5m2WoOC{nu(3M1=;bJVP;b%|YPT_Qn55z+ymOeRKvd7P51GzoY zVFHI4(~Y7cq7LAB_KeV3P$r%v?RX8U`)f4b41Wz%rSSzZyj2J-q`ZIxhyOv8wk7>X zFa1|EwoDjbQk4Hfl&fxQP6mFrYB^~W4LC)#5Ci^qrybz)DL2_F&sybk4XUWw%~KK{ zFY#O;B}D{yg4i;z_kcKB)?A9VnN5dx!4^^g*yMMT5?dG}n!ugG-(Bh_WmFH`IT(4u zJ%7B5qk9ZeY6=jRndy*ZO15586oZ(RpYj8hJW%;lJ1}-GqsbWxRDK6&q#|E#=6?^(gr5q}+*+loYbbG?Io4im`LIYsW9YN}@ZDK8+=4U_oJbh(EBoNk)8gl3gB*NAGKWTqq*Ji=cj+>WRg1k{4 zaWE9BBwze-GIKT|lqBm$dXQjm;<~V#I3@e1jEOIcb7*n?3&4$gl~nsTB@cww#ebu} zzY%J|b@mMm(4_B=_mMS03Fe~{S+q2vlT6nOr$n`6WGZ#U96!jT`pYSnQv=1DnB1o* zDkdu_yooUJ0HspsM|q-ggOwnI#VIT40g(Yi4=XhP9C7ec<=)VE%b>0jsw_GCpzoNt zOW>KLKMWr7I|L2L%_5GuVL1_;mw(im*GgV-KTCr{5)_uCB}wrmMI2eNyn&^GM9uS_Rb+o5fux*X_O z7;iSVE~~TZbFx0HvB-`TdJmx-tC%76EW>ia11in@{q=5S9(RN#$RErXTEr0^qw|6OPf|0B5Pc(~D zy1rN%hJlWmsBilzr@vwaB(0AsnC$HAL>~k_D zf5O^K{MxosW~Z-&nV$y;UyPL7;~l@wJlzCt(9bNS=RWcQArv3@0kjD*Y_>L%Sn-cfclR44BeSa|q8p-nQMR>8-^yz{rp+?p9n=l9KcuhwA~@ z(#Fsx(m#aHU!RUaEBf&WLONE&GrhjXQ)|DL_VO9^!hb9t+xzNslmx-;wix9_5fMu> zHS!f`>_S`Au*cMl`?ix4lab1la(U=x>Bg~zG~+&N#L3F27IwE%1{0jzS|^@}{eA zrA#WFvVWm}jSew-h5Vt(G;S?6K_#s`(Ow&0Rt@BBN=Vc5ut^lQvsS%lSkK9*AR4 zmpDWY$d#08yiTjMw*qNu!2hnK$x9nHffvNiqJIRbhVaBrUyka|foX6$?U_wlONK1f z@BQ7VHZsu7B3H@!=gptI*^WuHeoeml{Rh0OJ(Ye86x7~?qd}2K|6a*WQd-cH-SBZo*(dS9dk%MKmvea zReuJmyb$U3^w#=AN%pe@8$hn_Vuda;ZFE#SXTU3;Bo3utQ_wjSYV$0sxH`i_oBzv} zunNGB_iN@wkm0)||HaPZ6Mt+|hW9q*#e@Ir!dr@X<51%7{)?bxv~naY zrpq$Vtz~~xtqc~JN6k7M8Hds3vfnbEHOMxRr4-fydaPjCrP!cF>QIlz+8C3YRsB#c07aWF8c2oTyarKgp@O2^)Kx(=q@4@A?!A>8 zaR8GBFI?#Gx0qpPOI%M~ppR?vDlquUz~->@hZ6BbCK#d!H?dmEO&~Ew{9+4AC3d1C zP-){&8lxu+Gd}kDBAH^mXKVd&eSiIwV9A+$0v0uALt+S(J5j$?C{FrXi5h2BWP1=cI)hTD^6FCM|L`n!y&*xxY*j~pHpBg@XTR|fn>GCtKl+OV$qjCdZS&8t>* zaH=E_dpS!e1@VG4mg%!&G#-$8JZaX(O8+`O^Birk zYX=0}!BQR)8;Z<#gNhuxOw6n0>>ktk8!c2140;{1=+p*@)w95hYa$Pd414p zkk}1l_oQjs+ZclJpXPH>J%l6=3o7cu%!>6g3)i)DMeZgKe+*yJ{ePFo6hU0+Gn|Wk z+V1OJ+RJ&TUCQ9|pPB!2Gn44pld^)R<@V)f8w^#|4U0ubQ4}Ri!mp|NBf{yLsV}X*J#3iv>}M}S=rsQ6jxgl@eZ$d z(}wXDRA6tMS}Ir%ci@uO9Nw_si;)YMe`qUX*$zP0&$V3d?wY74T-q(_DeC*?x8*W3L# z-Fr~HRjHrVqfwVRwLrY`0uR%vPLV-9BDYe($vb+_!%$0vg8OJQWWdXe!!;PWTSI>b6xq|Q zudl4SimPfEm~D%ra$k9tX&uG&yWoaTP|eUm%@^!WQGW|_cHu%N55x%~4Oyu+#c-9~ z?Qyflj`oz5x3)a|vrQ40LjSTICj*=q89*ysW&B^a9upmfxgLGt)KTr{cgkqCb_9Q%G5$1pNPPaf zM%7;OgntGj>}2X?1%5d-n0@5+itDQ;Xb56?>JDd^u5uETBBwZq!z?8_kYm?4rGa#+ z1GJDJ0dxSUvtIU@2zm&)YZ|f2wBJ3^`LBcH7H_n3QQla)c)!d)DZi#b7<3dm0NK2; zU5MLcjE1yFvW$e;mAn8zu{XzXYi$#hT6mB8Mt{Q7_$gxs!?FK9)bk8}LS9b3jv4Cc zKB2EsiG$ZMPnIR_&HP{M(W*$F1|CduhT1%_y>z0A1_|KO)wR!sk~XVH(R}=(Ay^#b zsQ#MUvx#Jn&$HLOBVoSW;o<0=kteH|?^<3^S3d*B+&;gyY?58t12?ukD`^|G2)`x) zCV$c-yGyd)d+o<7<)U%i(3}%H37OC<8CQIy$@S#-gX9%oYi_1D77{zsli%q+u2u_A zf#@eimjb*g*6IxlCXZ$X#ezD@qIu?F2tS7U@X%zfvhVl1kwatU^7 zRnWBo*J_-@SR7W!Ae6)4{vS8>(0?EER|NG)PUf~2RiM)ylj2B<^cXIrjwwkD_e~)d z5gNq@l2TQ0!@9n&sz_B^`Nl2%h$ZzH zsjEGFFt=6mVn9ln5;q^~M|<6GO!H|Mr%a;NUyX+mQ4#73A0jSmYo1 z_4!jBMtts;+q${fau;o;&S+9t4Jl7cX&fn-ve2Cg7@<8p8buY3qJ)Q9%Am9_7+9aZ zd$qYG%G?c&Wzxxl5%JLou76NrB?fqQh9?C9sCDAJ-0=Xi7{J=kydYai3l@LYI11SI zLs+KIrr5L%tBbShQCe|L3%Op2maer|iMaEp6Y`zSY(D?&Y7s`}-kS_|*|M(MtEkUr z1{I5LWz{0e=13(XTS60t;?|{x6xJCnChjQD&5s7EWXa%k(OZJ^CeN5){0uh@ITtMU4aN>93cL3g zd;jMZk#AGEhYn_4=!+ZkI{My@J2St-!4&!6{T8&f7qb?#qkm6Ut^`mc>kku%{%2uK zien#c+w%nV{G(F6K;ZqK+O;Xyz;*|$EVkrB=S~FV*fS>7o(hK=6u_wfX8@d|RqgUP zo`5cq4szu4-jI(^slSIJ>MuFAL?%hRV$$z6@+p>#oczC58==Qt4Jr?J( zlR-c=wX!~*JZ4~b;*e8^8E{gl1v#>qcQlP+pmKHD|GhYBgmrZ&NVTX@c2lGz22+=o zlkBSmEtKv;Mqnc(cv7n??43lf$U;dIXD*-g@GQn2UEE?P!A~^3=NF*J|8hw1_AmeS zM(+`M?0+FpBg=G4GmrO}Jf#v|IkBDPRLwvI!5TlMrAn!7X;3i9^MfR@92>fhT;ds2j`d2B;>Qvn0^7*sZpV(^&=P(9D zX}*wHXSrBRLuCUUu-;4*;Os9~$~6iEeA}u9c7OCm;rW%KAKhq;^n34+u-Ea5RtC{< zdxGq8a$GA|jkG<__FB)zjMG$2wk_-_mJ8@Uf*eWVL1v&*C)A3CvVZj=eWa-}Jt{8w zR88;c_QB_`0YBifwe_qrT@vGG#?Dhx+H2|aw3Q%Q1kJ`WFhDO@ujiZ6_C6x=Lz%AP zcYl1M)}}Z@C&p5iY}l#|YHHiXQ zEXKfj=IQf4ED&Q`N}B`Ho3J#fOC)IV#zKGaMijJzw>W2NK&J$Y%-0`p|0s60_e6}~ zoWg|rJdqw*@`S^oIt{S8!iw)~$A9c#fgJVdkAFt8?jd{@c2%G(Px#&Te3Sz!?-uMg zI(XeIkJz-DD~Xfk792-hRJ;P+NMIgUkml;Z$dpizEbkB6n62ttj`0;u33vv5>A+}= zg=h-GKxLc^RZFPn&7r?uSYiv=+eyqwA0*UVZ7@VxJ6ntiRekhZxXd@;?tf_|pEG>A zjT1&W7XUgnL;3!{fcuij%6Vi_!KJSFDtKQphd!P_5Z8AfWiB^4>)*r=%eX#1iP;SJHlfwUfnN- z=^uKwWESn@O`BDikn?;osDJq@NY86)_YYnpoZ--W%e{1=+;^HK@qR@w_U#BYGn&8q z3_-KDCFcr1YSZfJ(FyrAeqgX^b|m>|X01-~U73j2RU5|d)3D_9bQsA?P=JnO(CIo# zp3|zOOK#UmYB%VL&&6t3HO863>&HnP3j z${qElCoAE*$2`zl4M|%d=6FwqGDRdD^C@Oa*(=Ftv}$$^Y~H5j!l`7UtN&3I8I6&S zre~g|Q0bHI$3`Qr6MqZO;R~xL6p1!)N()xw1lv9BS)bL7?T8=rM~Pu=x_wp_ z;;7vO%C2Kb7+1`mOf$9Vm-YCyGwxFU${pHg=*6-ItS!yI7opU|+(p1Ql;eXOB*;_VEvEu0y$d(hT zMA>e-f`8b{_8jI0r6yq0H_U=Mftm=e->Hx#{kWO225XB#?bw~f#yJ0NB|@KB-zjbR zTbiH<6AH2TpBvZ$(@2Aq-Scd?Pv@~8n)~+VkaCtMi5>4uvzkaUSm+x;sAF{cG4+~^ zRA@wPt)9pik$+O!*$FPSnKSFtS?S`xvL zoOyQ;&Dtafmk_fuxmkPWeH{*3J_X5BLE;*?(X(>Zp{A#Qqkl5_z*FqqC`5+`+YV;LLD?8&kd$g{oJyQ1*fq$)1p< zsCC%JFSZMa^8;6UWv`%=xY4UDw`Bdu`F*T*o^ed!iAMjGq;Fc#wuF9-;B{$y*>k9D zX88Tp6>MZT0ZT7lQBQ~;7glexw!HT3RF5~a8h>+y>m@ZrhAUea|IVZ2ArO&Q0LePJsN?)?Chu`7 zPbY{XkHKuyKWzs(iegmPw?KdYYu+%i0o!&WAU+VFs6e>2*}EIrr<>+Dn_la>$h;>R zv}@)b^(^dUpD+#QS~9Q9tZ@9*qlRuV`G0`d|2)`8uhXpa;g;!yj)Yi3_X=NKr4hxU ztEF?lYabw9{Xu+1!3i8`5M8{#W>e=QShMplssHZgdT|JJw)UgsNNI4AN|XtsKjKDu zZXpe6toSt2$%REK`f)jDP?9 zsuOcldc@|!%H?c2;Jt6ao9FLu^rBqw(Q3CkuJiT*eYWDIuTLOEX+y-~uGSg#Dy?9awj=Gb)lAlmP~96y zeg>eiDkMj5NyBkX<5{Z4Z5=zj1X~NBn!^90S7lZ!JS}fqwZl zrJ6dE8%@U;Rt8KmGOI4g`+(V8WQLc$p^jcF<_Tj697F9v~+2xqspS`+hJS z(XSTHSTENbMO%`d?lxAxWRoFwK*?~jO33e~<};ETn9k7Hy}RqC_am`sTAhy6-kW8i z_uN)Qw8X*#VEPv(TzfFaNt^d~yv31-c)FlO0s15{tu8K9Xs^x|n0akG;P)NI**x^U zxU$$Oh~akU<^6v(>w{TEC&V=&tsE`xUV7iD9&Ta_0DQ(Sjcbo+#g^4nnaLnuuC()Ks)@pKK zX_W&qrUC0Zq7vEKk@h&67538Z#6$*cA+jS-)KTq4cMKNP9caR%b$=6-chrq(3ds>; zwyQxNPi*2s*&rQd)QgoLW?+0`d~CEbh63QG^>34%y|{TqeDZeBTrCd)jv*7@#~q1K z{pbqI*sRzwz`%?S*+#og9CnpC2MA*Memc*b`ZPo3m(%X0I-_0+SYnzuu_FV(;FY^T zwr#zlvavgZG~YyePJi^?Qd(%N0O+8W#mQO$$saUw@ytNb(9uV z@l~T%iv>-3xW1i0<<>}iENX$wStn*&V|kv-5e03n{|1FmCz8FcD;zCh$xl{uAG&C< zqGhH$duwc#*LaFRt9#aXM12Z;H6xEQw!M4KnYSwt%TOM{xKL$*AI$H>tY1({mX_3! zGT*K7Lw{t@2I>59V3=>Yig%nhGBXQhj$A+e*XZ9pf?j)(?fI28^JBlm$A)01bvEHF zN(@z7`{Tav(T7E*HmCyJSLadlmF)>JqV0C38W&)*Vk0ic+_*!rCg0CuB3F>G>u1`W zsbaktv(QtSr>=F|^mXrH|BNW=SMYvlbl)zz%YPNZzWiQKWe{d`d2u9VPSEuIFZIn zJ%6wXZzCQm#`-Lys1i`f_krQDMKEY6cZgf8)t`n#>!FKXpg-!`Ka;%>XBn`Au-82- zr4^)Cw?!a1nM4C2dzK&}D4?uA8DfP!&`)`dgL|OGb^5D{lw0RpGtPXiLCCx`u`RX~ zb#ub4Uo3LymOLe%;IS+=#ilDh&ql=qfPX8gUrz6%v3nEqk8WmaDIb9F1^5ylBfP^>VS=R%@74Ah_1+naK^}T%1%KtuDr#Y!&F2L#9F#+cL#Dozxsy zvT!NP>M4WWkizjuBtwbsouhQJNPla#%7b53{*`PtoDH~$GDk@dq2PkVO(D`^&42DS zi>{qbG_E^Pi7e>MW3LW2fs4_#aPwzk%dvsu8k!*ZZx9Xir-@tF%2wp#P8p5DKEo&C*7r`RqDuh?6 zzVXobk52}~t>*QNL~{25Jnl7xt7!IhU`i>{MqJHCu`i#K-H>m-mtCb)1+bDdj}5fi`;{=pp)!_H)XapYYqdrP+<#0o^%Lh(V`=}! zgFv|^=sw>_U*SW>6w9ebJtrLDVaR+CM;U5f35Dk*S@^qh^=z;2r_f23Q{B;8lPe*9 zzDI(daeQ014s|KPQD#@|?W~6wy0EDb3Q?QDqB55^$y6q&$jMelI11raiKZ(rJsAE( z!Zw-y$rILV*^{yzeSbqb#0e*?tpxM5EzgA6`P$Tdn4{^FOoh#Mu|L}5VY$3Ia_vWS zzx?EYAD*`JX+sCoV&3GaXM{HN>CKeC+5)M$RhOOowHr_>sQds1Y7+p0KaRnIX6nCp z)81f3kCzFG_t&iBD~T04zAjoTxO2>h3cAD=KHjU2RrDiPCVvqS&mb@Z*N}B;*4hLE zKmlvNdS`j^2pv1JN|O=FZNeyrPlC=%wUZv{m^=I(b22APHP3WSSb0|1zRAwW$gFL0s1?#Jvs;uoAR|Q8SwaA~>gmy~oK|C( zO!aE3Z3yzDK1Ab@^l%#!S1!v}T~sY04ZVK0z-=CmW5wGn$Kui6cgdz|k2RZ&P!d*k zWXR+eBT{>@OQY+V%3I4rSDaA_wg>xOM35-k&c$XCDX7nfi2=~znpI?hc;Nv zRm}bL@&r9E7s4!ohg78$^AKRM6hh7mocSTHZ3xpw1_E09ZHQ#VICU>o!thRrXNEW7 zjG|D_b^*mD$@nAufu@*zN>wftBhyti!gGa+NS9rSXx%h-=ZUbmA!)j4 zD{czpOr<{s*gze8>Y&l1B~x7?-YdhF+N>t`w12}VIt)0z<|Z%80nt1L3Bx+F#kiVT zCjEAgJpRrtdrftRjuz=NCQm92F+ zm4B+-HviJl_{IE)uD&=T>-dVgyH9c|9$3#f7x$lCh-9M&q+?=yyVysv!Ij3ohjP>9 z_`6%8SlC%0#jxk2)8vzKEpg-N%S&Hiq56SO`DRl=Eg63fnRY_i4Q(DTJlk=H5MJCaM1SZs zx&`LWpoJ#XW?s~+{{B>ja4V16{b?e{DRg{+pwKCbQr3Zj;}p>+W!Q>0Yi)JXW?a`_E@DO;LPMzP6>BoP>cy@UtJdj;D3$e-e2(f zuUlR^;S0Uv*yEmvkhTmWnbVJ|%ws|yWO3fUIpy|!YO>ghvL-2%hu1h%;e}ko>IA$# zXD}@fiN@|+W5i6fZC%>ZA#yrq*v&XX5GI{Se_hRg9l3+s+VdXRQeX7;r*3cBDuPcK zycgWTUftp;;~r+6S6ys9yMNbUWz_EAA#W1s*q>1K?JXFo`I7BW@6rui1-`UU-)s;) zojEo*;Bu^73awEmvEgoM$%x-pV4_#Kjx{THUA1;X0pBI-xeL#mM~>xmCA2d_d#up+ z4H8bao-fI}YgefAl?gSU1@dIX-Aj}W*X?E^RQJECSwk*^ZXMplr(M*1qjra5>taWoyuKx+A*O1(&2Wo<;tg7~VQ_l#p|4x8iN}Fi$ zn7uT7=fB707wA>Yb~cm2bzT_4p1zu|El87d zOCr$pL$(&LFd|e8@qcN>{jD2jTvD&UA#N1|d~2Gh3Bg4yqd82Z(6<3}p86&2li@d; zumn`q+?I*)?AAPl7}QAxXP*c`8ZHpwWN@*An}ayM9aUM%QVmpJ0hb zBopdA#v?zs2I*{LYIv~D$RPP72^uAB-|McH;0st~JLxhZ`+tll7-I?ks|00^Mw&=; zC!*{2C#i5amLLEDP4AHCh6&2I_}tpai+Cq<<}DqEi8{gvz%~N_1vQ{MbQVvuObs6+ zeH~zdrD%GjH+M!1vEO&eI5ZQ=vI6OS9cGB5StKLAwu**c@0~38$unUEmI$It_`oS& zlnG6BQr7KLGk;1ISTKDdjk~|Q^b}%FeY&bSnlwFF5`a3Ibsq4iqL{s(I<)6*5sA3d z72M;VP-HkJ zN_BrR1JABS0o zacFBn#ai%Py%(&B)b=7DYm;(N8XeysCa2$$4S#$oxx8s2nHC;#Z1+aqhO-ntyi&Eh znrAl1EP2LX_^CKUR9vh-f${A+09k9#6`dUa{NEs4(WfrIo^^#V{<=G)fce)U#IJb=1_<%3{H(F6hsFC&HPny2v-~rKX->#_v#c`tp9iAzWVem6=ZNKm$2l@ z4m?hpkp%ut&S7D9C$spod>K!WCLxO9*ntY8l&LonJphhaML5>t5F)J=)HGeWs{xYM zTK7cs5dG&Vc3Oi|Tl^07H8vn=)SF|Wn}0Q9F{cxpgYEOyK=5E7< z3b@DA88{8za?E1Z_MPzgkbgNSu1tpA0ngIik@Fpw<99Lm<*lCy`tf z;!i+-n<8o>!|5oV-viT#Rev^@IMwJ()4SLe)GaeBg0A=75_s7o#J2!6y9_bZUqYyi zj2wX7=u?Id)&9QUUd3;TkUqEw#&=<$#vP~ca$;D&T`Fbh0E~R{LS!5ab&ath$5-?77{h&G)HZr(9mLexJPQ)#|V z>wHSOuF20TDz1KHx46n_PisH7c+h-HJF7Mzy^d4vh2ZqgS3qi@6KKl#GY@y^8Ia9M+}zI=>gi$zMS-1v z({$}0{W#&B?teSFi>c_XC*vnN41DxLJb62?;G7+vtBcJ8}bpp&lKut!2g?< z!V}{?u?|MYD9fm{Cbp)bhY|$=Ul8o6=+TSn%p{?RO|&J`@ADp2O3!duEtd%^r-S51 zu29*4Ev<8X(dCss9{Gk~<>#~7eoKT=(13O=iFXf>qJQN@Es!wK9z=}^);=)WIf_hh zPdd1u28<$w@zUJSAOqZ=)$n9VhF$Uj1}LpbIK3 z0i|o4Wq*80s%8*JG&8EOW<9k+xNPnxjS~(!x_-+jQLGS+x zJq-j_`HUKNA^U-7o|SOw$k9OR-br5us&ALz-%rXfTg#K$tHJJv-A!`!60u=vKc+UR z0DK;X1mH@`2L33*d77FyU2fY{5uB_@bl;`bYjBSsoYhjmps6*i86|WRN{c2yKywSeAQw>WO{8h3?xl7L#uaUy6w2>sA$>2Yzg?o^rhpwZJtq?IFVw#?{0_X zu76x^uK7dI1y&i53e_Hv0BviF`HCE8PO`=0H1|%OR3t(9mpHzNLrjKronIDK`|iJ= zS;IbwCu1U|%O|i7)fo6&oE~twTlD?{NZDuva=t$01mt#(R`i#5;Y?V7`ns}DhA;d= z^m_XP@#o#;u80XEqrR9m*PUxLP~BD@H-F?C+F~|BT0A*$H8kpA2!NND-N0fp#5d0A zhC(3vTF~I<>aAt7E$x-PxyV(-T>+ZK?j*8Kp1W7R#)y;0Uf^erS5(rz6gSC-l(q5i zwDJ3BboEAA^S)*=bRx~tCDP*~BAKj6%K)D~czqFpn2ymG8wH5Jjpk@7(~tV%l7ChR zCJ*e7prqB?l@**d6T7{C#?(BN;6b3g50}sEK?C1URF!RY-@M@&ql#4G9@q|Ss9I;u z?l$RtZxS1%+Iwl#s!mH^liY-optK#W*?m2F-t^T?i4Ymh+YBM( zxCn4<7-BUj8Dh_qFpy}GOxpv;--|-8Al6S%x2A;Ck|gJ#i{%&Cq%?z0Zg<($r*t|V=G+6@0; zZER*hlWryP#=44gmrY_2w(-lh&IYI_&<)>E?tkCa^vlAz$vgimgkG9jFf8WzUb-rd zMXr9v-nVGpy*^X z*+k`wBpn#b9C-4Isi|{#l(xT`(gRtvH)zQuQh|;X^zsKO;E)irUEI28-qDB`WXMdSa1{gV}o*)Gj znw9{`>S$fhcfZ}D+J)dTvORGYUHyV=f5dANw|Xk~Id+i8km$Df$KSoCT)?g}b!3Mg zNQ+-}h!=~G7l=9loXv}8bkw899_WExR+_TPJs;U+e=cb3ox^hp@H#N!a16GV3gRX5 ziLpe~Z~AbQt2tTU4Syulwv-kqSpTWpm}cPRenM_S*@njba>@lK0Ip#Y^2p=%f~wI~GV)l$<(-F| zyW1K-mX%HpqaZ(qP0$T9G*SoMuV8=xPq0z{@q)j$D~K7+cYnxX;opr35bm{E_*{x+ zU-GAfC@-1NQRdWDuqs~I*BvKdO{dN`ATEyLn0w04jxr*0mCs#^mXek25}tJ0cdR^& zdggNwfpJh*wCh77?o0@vQ+%Yh5Q|arhE2m4lb7_qepjSvpK%{l$S+UcZ)Bm&(qhG~ zZEiNl?~7-S(0}8=069A1eVeN3>XwRU$?}7J+8v)1#Uck7o1YaO$cvYQCnM^?A82Z0 zNo*iKZdf5&nIZZIn0B=~#TgcNu`HAJ@`iEYoYYTi`fH;B)3NKSk9{cZIpg!U^^G;q zm?<%wxkyodFcF3hWxK-2s)w6SxbPx1`!cNwN5L#hP=6xP=eO{qqo%ic>w+^%um|#uO zb8(4U{(na7IRHD6@igyj6T9s9IKJ??uHt=g7!!!;-a%%?3fSA)Ry?)SX<5pT3iKL1 z4RmlsA)JJy!UOKALQMU(sC>7kUU4Eo>S*6{v>3c%ndlUsctdM~ftW_QE|gh6X=3PB zoTKJiDlKxc(13b6uQK-Ro?)tQ6$9s%a^B>7>wlbm#_;WRNx^~}QN4dT+j=`U4j-Kh zt%l@k#1Mv9MBxTSf`%}ubGo#tI>YbRqVb4;szcZ4k~S{QFvt;{r=nqxT~8meslTkm zVGFg*>fs6I>@IZI40PwzCb|qD1R6G=gPHzGO<}?7 z4Pkq75yfKVnU_@o)DR07+!p{lK*Ya$`rZ^rC=~(j(+VD3tj}V0VI@c?Yv#M@;v=EZ z1qLxW-NJ8QS)`!dyG8CJXRdMHyYic@;Xap%otJ-m&%`)j5j2`>cBnbmRHe?fCwcK< z9MKb=p)G-B%;d}>@trY5*vEhb;drKdaZc|2Xh%~huz08S+!PX1Dx+-eGWzIELfYO{ zo}a@GA|Ni<=u}3yW#8uRTqKlcVs%eHC6DgTd|M(pyza(ap!|(e-He<0h2UUggWJn} znPh)Q+Ipk1&Ju$rBto%b9#(_WB*`a&I%)#B+q*$pQ1gIPG4 zZCu_5rdpd+Q^lN_qsz0_K!~_Y4u?ydLveqvBTst?a3v`R3c_4tD84zff2|ar&KPt_ zq%9$CRbwmYYAfEA;<8|jbP82(xgX=bi%4XoGyivkI)NDT0Qvt@`npk*Hbm}|b;zsJh7WWO9>feZi__{6M*X}= zX_9E;6?W#05Wi@26vqm5JLmfin{PUXK) zBnv6ymhV(_3}wA8EU7=6J3rCtrReP5?Ulrl(-q8KS)reV1{EZ(e0TkFl40!%56GD| z^$c$XGg*5_dm+^5D1TkRgp|Ev;OH|UhZq1g`1c4}8mLxkj`qh{NmJB@sZoDr842Vu zFH9fpXgXlGw=sHgo_-e&vw$JYN_b9d9!ca8uxL5whW1lyh5_DWWx%0CrLIE~Edf|f z^8%|k#bq3kHW=${=*mcI71$4yk^RUi)unZVndaurLt)X!xZ&ByTFq)|gK`dqQz#$O zy%@ffk#rxtPF@=BJOIOxZ0~E3W$gmk(-C;I=Kyp}ux-l-A=S zmij)s;XQQUc}_B0q|#_uJK7E*q`BWAN{_VRths@gY@b#mC4_&gpKR;sw;j;mYj(}h zoUcI8+CMz@nrx_k5|u)@e1#@R2JPFHJ8IxT)w1YW?!aLxCtm>lyGLAjHwgHqyPChfWftXff!ft|DJ<1y+0RtKI8XplY~>0SCwgLXe9f?nx(H~XI|%6C+zdpA6JO8P4dfxUS$!x4-* z=1!opod|@zM3KTwB1TgwxcDoVEe;fOUS-wzGFk>}U^hH~J9Y&P+D=Qh?P=scI}-_u z&9#fw0|OD`_^9j_jvKL7umq`p-$Qj?4EwRGOQ() z!VUqH!5rnT&OFIaSP*`rL2p?0qf_CqPqQSBTonKf^^i0MpZH3H6fRJNT+@o_Oo?Sp zkFrDN2iGFhYrGlPqGKiKpm3?i8p`?+11RJTG#j)Tb zn~(9MMgt6+Zl_HmE!RGRNdj4D#tJ!fuL>cmn9m>uHfg6-poC!mXF}a+7co3$gIL(7 z=5zDoEr0)3jq;AdmRaK~9@{;?0{ZfubcvP0r5t~mAxs7PkaM2$Lm7QV&+?S0iZzSc z8@3y-f*EBv)E@qQ^by{g*Udl?`iWmQAq8z(MA7s7AWF&YPY~kXiGK&k&}W+B(pl+A z6cND;y*?QRZPkQ-W*anr4o|ar(=^K_erwJXd+MY_Q={Xr)4o{$zK-38LkDvK8d9?S zg-3rb=vEB9^2{LF_n2|tEHS4NvgBnyVh0CB#ut`JtVOI%XP&}+$nQZm?A0=be%YN2 z9=&NquZDS<=+P+oQ>u!ED*iajqhQv7ZDI!;6}ut3W2|(R_D;bC$u1!cdgp0uHI0%& zuS58=F5KIwpW{=6`4;1_CE6rmM1}<90+4?h91{q-C3HDTR)KT|_en3{xsbRV@PgyU zl`3Wti2G^8O{`#8K!tC-J4#2n0j8LO<#VqE!~EK<>9jbjz>R)yLP@ShptyK{OB$k- zxy_;_3a{`}fk!F>f5{Mma32DRh`RItqMGgspBLTr*}6kXOxy@E<_E}Mkje65d@z4W z8@dmQxNBji?vj$F@B)=$(G=!P3;oBTLq_Nseo&+OW~0Mib+CZ@-edMbWust!M|YAx zh5@+Q0|W{}Gh6dzm%=Bs%-2-x2b7 z!V?AraKUqbP^=ac_2ZjLK7#f>v6Z6(yEoLBmlwe@(kw^IhWZ9DDeYC!DFc6&0+pqO zj#yxORsp0#bo7nR(3fen^&~LN=g*5~A2b)lT`u>F49px+qCYy(g6lYmo1aD82ZMmE zTo;h=DpM6pZ*MuybVqhllakXVlrdk~A3>~s{Yt9M>>UwYo9||s-EmZ~EMr4{HJlC$OLc$UKADj%)>y7* z?(OAg=BD^`Kjj1E?9?}r{lA``n06u23JGYk zFo2ShiZRsbC}q^nZXnXmGj?@56qD# z{GEXeQ!&*i2ZSkih^;(lldn9$XuW6pUrjDq=`+P$>qa2nseo3*`w1<-`xZ}{WY24~ zj(Z`_QHHvGCpq(LI$BGq4=2WN1nKy@F#`h7vNpji_AxNbTM_Tkm>tI%`tTshZVGqdXNq z_?>GtCG&_9rKa2B8oRi?GDf-liM@lbNY<)Pyb$*BGV(1ae8N z28(}5J2WuPI65ugIDs#+eoO;{e}>r-B&Ev$iofg#?s=-p|4F|j(nqu^PrVrRB%4xd zx1eAQ*#^*<&1OUmSY}xkUEIL{-Mggv@>YN88?T}UlM1F1R?Xk{SSk6dn5h0{r)X#z zCOYfRi<~Y-Ro}J?V!e3yuw*y3FwLF%|5oDbNu?g;3Q~O0<6XY%TVX3qKp%SAJ|=-FT+qInZfk)B!LX?u@~Bb!_d^ z^!#EZd0$%y{a*3B$+@PkONkb^#B=a+TqyCLmIDme2Iq;W|Dz@rC7x_H3>;3sp%iH> zC-Y~|zK>$Mpym~imw1(u3l$dUVXA+cxd5U@yODSa3VrFiq6$9{PEWNZNJ8Sd%9ubD zz)zhUFT5+YUPR(vF?bfm;!Len3rlm{hedS>7tnTO>MGrWgT+lU?JQJu4@8(-U4}aM zgO$!uWF8!PWI-#iB_6=+(2LFNVJksUx-=gR4~p8$ku;QcCF<(~EoE|n;wpb?;t%P7 zmMX7Q0eg}aO!ZUbWFW}D9@$vJnzC=OKB%S&c3W9l=aG_)0AH<1JoS*Wo;NC&>QxY1 zCaK+1DoZ4I)xbp%vzwjY15&xjX)|n!sp3Ao4K4DfTb05V+4 z0^ZS&LGG$+#On~oGu7yq>3(5_{55?ASkOl{h19~mTsjJvb6gSe@d^VH(ozN~BO!+B zF8lHPlyAlGiIslNRji1t@vAZ6-97Mw*f|<6U10E#`JZHZ`u{0igW7+s@8HM8M5W?N zhs&BNCX<6CIGw$R1!3BG!{5wmgCGWx2oW-UDCCpT|Kswdv`-LYz)2OOVZo~2>I)V_Tw$oIs236SSC$!e374(SRyq6)%sy4Z z<-6(#DC$D7a`_d{A&_T(uf2(YJA{BeY6}J=eM-L%9HG(1pyz)C(bWovv4Z5bN@u_3%ErRZALD^NqmTjk;b>7uzi{uzBtRG+gTuaW|c63AS z6ULx8Mp?fHH#auP?0{R2PSS5-73i60=n9ldAaJ8Cjgq~shwvpo8TW5^zL{V^pR`%E zc|3zQknmiIrBQ#H%@Hh(`xp;v9rBP%X zg@)75P#;ZXrKroflaQ2KzGKsU@55glRKd1$Fs1F{4TFC~i@1damrLo+UBY@``|)?? z+InP}el+zi%8jIwyT7R7bjeM`DZTjk*?ZP65?y@L0R;k>29++qp`Yfc|0)S!i#F0N z^haq$&2eLq8L!k3H}_Q(jkVP#R(-nGSCTt9uYTizoJp9s?Q}5N_42tXo1FRkAZMnKp_z4`9;8JCbzTCt3#1LT z-kAu1xQV-%zB)d`cU0i@)1Rf07vfghY_~0ylHJyqx(aC>(8 z8Rk}097lo*D3wc8R>^pY04Ny55F}oy$eKg3A+l1hI^_i#)i_nQI0T4%8SQ)CR$iV9 zuVrvk8*YjItYfS3zrIW*J7jHzu=HFEy@e-kkd2Wzh8v4I`Cig!OpmzzgfuzZM*4rs z_yLbgevD3CKa{;m>gN;82ZxHa7%3qtlGlw+>g`M`Vw`BD)M8gU=34F9wW z%w|+!wtx0l8;Q{P2a*`5B#le4nO8v~6`9xx>lj!&I-p?@8+E7Rg34Vs&sgXJU|Tfi zNs@)Tsw*s=8Wf#1v!tpe;0z!@5Kn&w;48I^FC;=)IPQ~e`m`r$42zIPB1EUkU1-r> z9|HheIN0{7Y2Xg%2{p9Y|C(9kl&APA+Oyy3-)#s9UIWzKX{(+_H(HmLAtEk|ni53i zqB`2bUj_S6;4pV&4msRxBtP^hWN^TGN(V_}q@Wnj)3xb}C3HKt3(fJq`>}tWB`({n zXBp$Y-3Ap6%WWcVkqJ5RbP-6kS&Zcx&)9u-Gr@-ZL`w2ga2_=sMZISzmEUz?(n|TB zpiPLq&eFx{5#KhPrnURU;xG1ETF2p!5`WLaIXA1Z}ewf zq%K%U#u(6zD(EuBY@|GOF@1j)qI9XObT+k|B5qI;uZ*CBM&w0Bw$ET??wmDU(& z_4S4qWs#~J?bIJ9@)&b!rQg`UzJVZCJ^|5kt-)2QEzpXE{l5q|%jqcVj0hir1dzIr zo@zAzpqUtmJ!mTy+v;Tjw^I7r_>&J?mfp>|TJJIK!_dnt6-n+v4*Y^ggQVnXBC930lB41j|8*vez%cw^+bkNo zXQ2&rcM`*sClk0RgPwoOSvdMA5*AWjS})oVQd!2qOF$TTPz$S9X2_43BMDz%{SHDR z`tn?=kZHobo;IjE*gCQvwqREq`an+lg^`2taH_$FHN$j5@Zoa_Bfg0cYw4`XdEXT+ zdRSoOD88nRU;5rul|`{RR)-~NcfrE$V6roQ<6>^fqAIb_6C{5l>5u1ah7qmC{We6! zSH`h`8c8KjOpcOS3AiA;g;2vSmS4<6^;wG}9IA1qQNB-bQM_?PG zJ+l-)2-4c#8(+JNidOgU$!vWc;Ty8ZBi@9t##GPApJQngE|?vRPhuG4A(0%XNBpg( zd@3-J3bR;79-M!O6axrI;_IM-M}@w`a1?wsikUl+9mbWOI3m-%*&A^xG(!NTG8=WO z)Qv(JcE#1hipb{47URvGGFQPt+h`LSV5Uq{7GoERb;AsSoO9SZk#}H$shMYnI$3b> zHd;JBv=1>OcGSc+?$7D&$^-?LsL4tgS!f1H)w7B%EyjO7_Q4tH-#hv2+M&)SKeQMz zt{XcTApl_N37}XP8~O+b5+yY#mBOFZY{2xe%nm?YrD)d~c8h|BCpO1@qAWBLkm^R_ zTvrd%PzOXBq{SzG5-W$)tGHHnr5KC9p1G`=pNqE5q$?_sh=Kzo(3ph_WUvW~UXcm?sfl z5C~N7nx;1$6Wlva(}a%+x-x6q36e`HE28;-z}l&(UApKj6@+DstCDLE2*sg2%M+qd z3msG)6Qs#6c@q1IF=Kb$SmN9Z60e3_I)K@4O;&y#(`2TvapMBx;p&sk!_h-hTmY zyk0pOt9&HUGW3H>yU|{n?=jM7nQ^Z?vO=P!FjbkoB-K4@*9<9WF1%^Z6VJdo zM=>lIY&*jP&{T5JLd=6|9U*~%rrv}8x*|hg36006sjrjzK|0|~}hj`gb zlC4^**8cjI->cpB;3Gv?GiHdjKx3+r&rp9`+}uwY8xT7kJvL?xgo#~)8G!gMgDb5gj?v!8!D!VrvF%+G_R(ES^RzyyJ-*wPiNf#Za!2XyslHfBpU4_Prq;~ zee=-_RdV5l;0x$i(A{k0MIY=6xM2v5-8?6f?!M)dFn9IWx1VTY9&t|;1;d)8ME&+N8p&8cOWjz`AkO7dAP-u^r6{ShEh zUu+`#;k3!z71xPSDzCi|XJ+!3H3$Lzn#GW1*#g~?BWIY*(G*06p>_entOt@WUH9HH z>6Q3f4t4EYmrpcH^25NTL{e5Xe+7SS^(`LHZD^YHH5`gIZ-5ptP1b8m?J2 z>erMh0NRAjbLqf^sH;g3SFKM=d3G}#hNq-eXF*8ZMj={35X1V21Vuo5PX=4Harb?!Huutt~UE<93H1ZN}uU-9!QC9 z&i<|Hb%CdwNn_?t&0~u^{VD#@>K?S1ZR9@2Ui_Az0EgLBmmzqpYK2{&0w7isMhEKO zW@l)HnPNnMj15*}t{1JQxM$n+K`TAije z=y03V9~-TjA{Kv8!8`bNckr1*z!eTS@K`@*ySs0)iwqx`19Ri$nY}Nl-NbKk;7(rM zqg$bMB1I%<6hf&*n;38WbuiDx85x_-J>*JJCsvZOxz4upyHc+%I;ek|GE)HJYk_E@ zICz7A$K0j_i{&E%ThvQT=WLF2}md) zgRHFKwH**K!={eJQ!UG`I1TTF8TA=^AFKON5B9<{%uqegMCr)I@FA`H7i^lZIi=i^1r#wQg=>$w7TLuePD*7Q2;sS(o%>wLrZ^%*C5LVuvp@tc8g1R zw56_5(NJ>$47haG3+4b2HutcMyY}+({0c^RO2<@;F4%kxKR$@yD{hMkSsr|JeuVVo zmHC&xsHD1(Kk`#_pARm^I~$YDw7~Sy&Z)e9J4NV~&AgrgH~vPzaiQh-dT@EcYC*LH z9uht^?`wD6_h5g)G__*Hv*;^((4lEz?jQvR*V`+w&+EqDfs)OTZrQXOraBN1!q}0_ zQ&ss{WyO@v?1VKpkYmQH1dV`89$NX*BRM3J@R8I}Ed;w$r^>su{p78|>z{$X2}+nl zqytMplPg&bQr?XH9i?lMHi)p>H%mxLkT4P{#?u3k&HsNMrs8KkLo<$djexQ{7Y86? zsID)_;#?1Fz9Wir_{w8!Lyh7c^3JV?VXa}i^Q@w3>ZAB?@OSG2bVsJHOEma0P z!h>lHIBioe=Y27&>ssq)+Wx4@F%A_C5hauuNE%3ZIn zsL!ntc~JCw6%vuQZ-|_fv`+)k-N|mXO8E@8Al82}AOXc`WbDH3u1lYQ+EAXR>uUL} z5HBV#KsB3~SD*~x@jDkq$JKdBtCSY-kfPie#)EY(QJ>j~=sg@@2o$|&H^DhbTtv^cjrXK@GA~yIsX--b!W~tU7NatjRZPP_vWoT3-7AQRv{xp=a*) zMcDNF$jU?%L$KmxmS3)a&dwXT%N!co7Kpfknd;>?Tg8;Tgy1QIBdV$z1;w*BYN-8U z^;&iqRJCfeoL%qfpJ9~SxOiX}_pBjnA)tSu$w1T%_n+bd=$#NN!Gv-kuGyWPLzR{k zFiJB2V0l?h?l-?*N*(8HS~ce?T_y1fy0iSZ7tZI;ojLJUtR=K4&tGEqpx9X`(>^ZfzU_b-2^ z0-~wNvbCKj92EGFM3p9k+0j3@Y(JgTh1jT-G$F>exUY%QhybY52ST}Y1T&(rbwmA5 z=91W+QOpJLMSiS7b8(?1dXG1ivn0JwX-TpRfSuVF{Gb1j(iMjyEGSd~bHF(9fKnR2 z`UUyN&}U#TPKfI5`V~KFY77F?a>0N1&3=BydVLIoa5QzT&rZe_Q5CS$=utCvIvtBx zI?v!6SP+e3X>+F5gPm<;ucL&-o14;I{iIwE9$vw@aJNy^@NmuNr#T*i_hT{ue4Dd3PdJErAcbgycoXVn*ZbY?PRu|Vvvi|#JUlTNm{?`f0A=90(F@b-X>{I%~ zH*;{&?H$+?MP1CDUehOjwz`^QifPBsaZ2IR6q3Ov2xkK~5zD?SD?S zuR{5luFi1z1%{gCnL|r;FhS18rCQF78gTFvm0seaSqrMcuVLq~HL}*1tJIiq{%A~) z%8ni=cAeCgbM`ycblmysKq2<1lAgHhB*4F(SD=hC@D%^@%~J zb+v>_wvZ@CfeaGx@;uy2!dz)wha0fKN6%o#Y(^;$`rE*1%w=Z~j$#E^3KL5A740z^ zR3DeY2+Ixc!P<(J(OHIQjpR@^@QXe+y*UUNYXioK^YfNKfQczBNUMLkBaIox{@2*F zg{%3)%TPsbF?dp+byPlYy%V7QFaWExr?|)9erm(Ika*T#`-?3ZP=8O9LOsl0g1M^z z#I}{-dZBil9ww?vf7#9T(C^3q4Wkqxd@Dlv*my7F=Dd9{!>Xhv%UbM zcB-e=uWS|mB~-BfnXtZpQE89k>!r9|art-olufHPZOV3Y4|!^qSPei<&%P{Xs18?pl9AOQLNuGS)iGn-A4eZPW&0{_6>e=t(NXHqo$lGB8A{jVU_ z!m2brYvijq5AA<)C?6Q~uY7dYk<&Z93uO(Y#i<>*PW@^bl+S8hVaGZPZ<9*J9i~S! z!^v3&+c6W1{GBjM(}CV}8BbZAy#P)h63?x+#ANR?in;|q+FnLKEOr) z_k~VMcX(S@R9UR>B4d^K;a`D)n4|ZMB9v=fH>yS^bE$^Wb$NHi9Oy==9kZCz$o2MD zSMK}6@%(?P1Qu$|dW`VI1rnsq9lHHGD7C_~H=;IFPYcP_xLhC?EqKoK*!JnpDXAQHAUywCamFS_P`3UMkgi` zwC*+-EhuzA&Lk3V#J59;RoJ7rR11Mq1@Hwj=)ZqCj)HM$rE^?dt2hEi;bm#;lZcL; z2On?!@c|r#$lu1ePwHbbfw5W$W$PmZM9YW!k*8!DMNzMO_~I26u-0Wi>clf- z#3!3}_)rWtq+syhbMf4oX&evzH$W4SL28o@711ptG<{fk z<zrEOa;H$QvdPkH0t?5Kn@vJQyT-{okv)oI`9%QdByePL>TW@>uH4LD=S zNF2~`)tqPCwff4t9W5JDt;w;m?16KwtSo;wzrNQ={Rm+rkSBm+RIiv;{5{o5}mwL%B)O8FDBoTnswj4SoF8G zSOr<3ow0e6MlgL7?gRXGCEf>5p7qzt<$_srFSG<+-3K+uh!u`U+Bp8>wtV`v$EmE-qTC!H{LQW;K7{xD$-qBGbOU$5*kRr7rjNS0 zS|_OM=-Mt1sAhaX|$I(HHK&-ENpY|z-&^`XAtgKHbDEd zNNnylR)bsV{h19ow*6p}XCUH?H5+A%}m}g|0>UaW}^8 zZ6v(sa*I9!T9wPbQjI-+iOuJ=R5IuX`<-!SAl}+uAzWVNffhxzaO<-GS}Mm8jNbX=??>fHxThq4T+X&~ygq{dlMcuAUWCH$ZiS%P6}?m@rn%y%9_J#w%#~I!^H>U@L{lk3-%~AlOtdK zi0rKev|ua`s`Vol{q31AJ;|)`w_dg>NJSBBMC~rVNNX~jURqZi_NS{z5Jr57&qP2S z3wZ2KqrR+GSV>Q&Y98bBe?pT>mF_G9c`P91ia7zI?do9%s;+-;f#odzQiLQi|HVT^2HyhB;+q767bJC)Y8^4JEt(-;)rq;vuu; zqE$fBoz=zC&B?irYUDX33H1o57h$MIn!lFi8*$3-n0BRgb)$X~L2kX3qSk-+1GJ-O zAxkMAwh=E$qbGk6ID#K_rsxGuiV*xDNm!V$N8;4@$Go1iyrWyGv}PdSHI#qb5HtJy zl4RwU19QEz592Y?L=pJmrP1z>iK#T3dM}4S_tkjm5zuw0Bmx~kqL{wxk3@(0i5(;b z%NEgi4!~rLUqJDF{}ozei4;7XTqD2~@>e|w%?&pgCc=NjghHlv?w$yh!LoIpt;(Jp zq?I0I8~}q{<;sZ;s3>$)sZ!kw8J_P*-ufVTnp^V=E+{`bJ36s`!qAFZotpnBbE?2v+I`ImsLf|Zk8qQ|sfnPE@pFEUaxEWzc;@oqYD|HI?l2_LLq^NQKD*M@Up+AQM)N(>n7~j^rW7XiF2|@e^y{@IR%UmkTufGMNJo zHRFFZpr$6obHCneyPyHU49f02x&&B5Zp(tuftjt1cs>XJCmY2HJ_&rlK$h|bD28^bnYpSPdsvLC3; zGN+OzhC4`=6kRE=2WOo};o}pBN5syEYM*~#LfT=&lq?f5OeV7IoWOs|Mj>j7=lt*V zgECA~e@QeKOZ#D!=u0MZn z^A-@koe3oicmBHG#1N{_G2al#R~s;Oa7*b3woEa)tVpz(I|sGahOyw}G{RaITk)9Q z1HUVW4U8XjN8TA{kkto2X=(Ip%eRmHUW2k4?XlHnhb-;cKHE_e9YjE}B!H>n0+Rf~ z)>n_?D~aG_fpkmwGP~*GI!JUD9pHc7=hgFr2ZpR7Ri*r3EW7K5_~-IJrOCJmXc7MU z(Foo;h2R2yLaW8i@#bhw>G%3Lnaouv9pRhXhFg?YM;F*xP7sjk0+wwRIR|t?-2KT$ z_OP@;`+B~mJYt04caF1mNY3Gsv96mV;m`sMMPEf`;HMo-+&3zHdWd}Q7?gj!sB&AU z*z>`2Uq69RoTTpKy(Z4%i%tnq+P;~ej}cm%uZ+DqD}`#i13x5#+M6rlP}MGZk|JJ| z(k@0TL79b=&*2dsN``wZXBFC6s@sHvri{!JpQM5j)oZ0ti!uESJ535ERMI;5x>~?a zI}eCDxOi%(sFn7NXg)ET#E5_K#&8FfvLdkyEDzoJ3?_8`e0yc?I8NUnl2rv8bfCFt zmq=yNid3RhRCH1>r_b}Wi1Q3AO?@z$Pb(3e!0_od4;qtdxn$@LUlfA9co(k`81r7- z2kJ5@vgKzr-LkDN(CHG(t4z}LTwWrxOk{>wf+UT3sD;K`OGOqT4WNI1k64}cP1GfK zf~6qXYA2iAQ`qKM#*=x+eGAgSj#z=OK=qrWE}8u@J_T|_+Ayjfk^pvBC)BL|0Hb;&jfF>xbY z>{5_T@rB7c4*ad)m01enp-o5qqyg@)2y-Vj3W5qLxr(R45J!JA?s8a$jvItoNQ`Lo zl93pfUB(%HYh!h|LohSfV2aFYjUMi)wJeK~m#0jgvi;CRBaN~1P$S=Y@iE>o~eW^LhJDp4K~o86byK*;GyABvhc&+mb`Pt@J{* z?F1Gb-P2Ir+DC1b?%ts0?dn@m7xlTy8MvomNa{9pLqDJbr-CifTx6e6W0 zw)MT}QtC7Gl@)CAq2$P#Xpf`{Gnarp?X23m_9qy+VTFGODB)04e=t$+a`QOts%#XN zB7mYXbKgi4{KtHw$JndA#)ad2ff);Mcx*wW{39))#?vRn){LXoFrn54F-OA7CSca{ z*heF2`d-$`ET!W{o_7YOqZr>5%^nV9l{)z8J;q(e)x6v&1@W_|VW z7*X@r0a}0kyTn8x`o=#**n9*`WdmI;FDbc6_Wo3rK$oBp1j5$rm z33PRF+cO6DdPOY%bmTBc;1`@j3F&7r`vzpTfU z1%H)mhhP#K#Ji6qDz2|U9GOrlH%E7K1`9bXPDy_k$)Zy^Am5G-6L{g6t)H0(^`&RS zuMwP5N}3);gZSuD|6|M&n0rg6BH-0{)TF1%&Vsgy*Y zWYt|#LJ_?`UAHWHKSR&q-g~MQjA-MHa8}NkZXv_t^Z+0hIDg2ztv9=IqJ%Y2npkSA z-4}n^7(qBf%6h1}`RA$6^9xd(+3Ku>$Mxo$O#u$*|Ur{Gy3) zhSI*yL`pJLEEO&@HV||M7kBmNkT9hx77DU}@Jo?(v)J)Imx5#hNRD0M3r#b>B0zuT zNQ4sWr%~SR=2wjPP2owhSCI$yfAEErv{hk=YY`IaW^2xn<)vNEu#(sQvV8UM& zvod6`g2Pv_ijC`>-FoRa;UQ?YMgKB+0CwJh-*gx?e{c;>z12FA#(N}Tn~B+{q0LPN z8f{p+Q)2O(!h_n)%Q&y_iCC8=nTj$@U{~1|H|M2Ts3#FU$vME8Sr6@1axS{ zmrD=F6pb!PZDOF*U zV!fet*3b0%f92&dYrPv;e_@F51_{Q-obof*O_CReEusnmlnwJv1T^m0`> z#1d2{V*mt&M!xQsN0SJ(qav3 z{W=Ci?>;~0_wJrTYTwTAY17hNwhL>-xVD`zHZ?~x80Py9-@YE@$WElu$5r5{t>`&x z^T8EV7RJ+WV??-tlBKI=|CSoenpyRrzalmAAn0#Y^O^wIqkw-Bi}A_l!|8^^QX^Aq zn`Hpr0-VH+^ji|-Z=^-8_-u5i>!Sq!S)wPol?m36hL-DY=IuSE?;x4C)ST$5Mdwr@ z-?SH?3eBTe`b4p%pAgf5sp}2(1X9i#^kCZOEv52?6LFJ=$U)CK4K%b8ESmh$6O*ma z3zi5hM6OWa36s+M;>>gwco=ow*^g;ZEjFDqq`q6`rp#u|l%7}Id~lX<(ZFM;@5i#|{Z@dD z7FquUJ48qV%4mtXH|-uFL?fQDJr9A0FgSRO^U|e0e8Cm@=*qyetG2ah!_9qhvqdh+ zNc?)&muP>V`g;W+UbUe_2wiUcq6++vg(H#3^Mi`q;xinfjwHFhNebZ$n9Q1Qw;aRu zOgr85rt9Tzb`wWUOElg$LNaoj8Q&L?Y3j-aStfjwwe;|U(^SQPj%svS?xCWockc8; zLtpqUn}MUHA=PFGhE+w__ktPeS-#vjrd7<9M)@R(Th?MHG<(6L043s^x4hyqdG{PIZ`dw;< z`l*YPoOum25uLGojdlupo(Sr1^;ZH%2cf{7_OSnta9PpuDaJ$aq}#r_Fum-XY>v|p zR{?(xh8GBn^pf0%UT8a4Wpc4DzYNr;D|nOiIwNHD0)TnOR`AS~Lz#5I6-I~dqq+5w z?>m!zbCuH)!gxSc>{g1M8lEXawMx%*B@Q4EEICNASVAMTQ11RW)ID&Z2ROaS*oyi7|h! zKi+~;0Wcs`$*VFtTI|VCWL(CbvWM5ghG3+YXXyG3$=t;;wIPDcdc2_2%>$G-fuGY> z9N$<(r+%*ZzLrCpf)dk1O8Z&vKNA>JtIRf&-VT4oBc4LlIz{9p-IvM}c$YUQZmbxf zp=K{T6Cf=F)mFq~p!Q0ZakY^DAP|4dEVL+g`d1=(&HgDK%YcBjn-mB~xGLF~w;v0y zpeT5zwi2OzmKQfz+b;V-se&ZRgJ@c$6Vo4gQQrthVrHdYB%OJf?rD3v&)faP_hplj z%4Q6lZ#V;E1ING+X|HTH1fMi|GmgXHPyo%0R6Eiaz2yRz{9hzuDdHG8SgU`ZIGrNr zF}{qeWf)Dtdgaa4jm`P*$-WQlWgS2&V7EF$L`=0H#_J(Q5?!}0Ze_|k{*D^?% z&Wa1LKDxEX#cJ;uZ~ar}4H^)%8UN$)NwY6qt+CH1arfbUX6)Rm&)fH^bV;CBQ-PqB zZsM1+j8HZ5Ds zx*l42kY=}}Y!i**18GJ=&mCsJ!&JX);1G#NN7m5f9?a(eP21q&t<4tVhN=%@I7?Ir z+36oMEM)uL^?P#qwj$!V(grwoVP*XEYRP;!!cw|NhCEEi(o%wYIhlVOkH)Aiv;stm z;ZLO-654NTm0;?$2a5+h3lT@`FkpK8^-c>$B(0LH5r?#Ir+ZFv^3p}ZLXqUI-?nh=%jaVGzjHQSA+VLaT${!ddESsYIcApXv9H?(_9ku{| zk{tl$w}gt^Aje*n`(1ybgexvkrU@(8CCNz1xY_D5#yJP`x9H(Xf3agKz(iE?VG|*L z@!^#g(qeJyTYwFlVwS=9-!iI7**b3v76u#M1#Q(%cyB^u&3RxcULyrrwPk7jSQRb< zCBTe?Kks*SpMb9xGUys;Xi7@B^}~Nux~6q&j@~lSPi!uM?7e^cH(VeMmcoF>OHUD= z$t$h-_F4(AdG8Vwn3yV62wD)FHKEoPelR1_qqxgk!@V)&jaVC#ZeY14L#ptA4j?6F zH)X<+VTEXkQa<*R$;O)k@Tt?c%^IEs!kOdS#OWY#d6a6BP*IKu%tuh;5e8iZDbRU8 zd8+{pla{5-MR$LG{AeLD1ed@7OJhS~pT(RS4O+0e@#UY=qNJ&jUqu6O_ycH~&z6-J_8M2tg%R1>r0uoDrP# zyC^~UlOy}Hu-qrUf)fd+N;#|HB~aVzX%zxREfVUUFt^ly+dgFe$#3D)9BoRr`+5Z; zZy$R=cHX3%7^!54nN|J;faxuKtHMJA#d&_J{Pjn@h(V_FrRaL?F*Q`(tCOV-{aY8| z17ci4L)8Rj2%pgb!jQfH^{Nb`bD#)S1{wK{<7<;f?X z=}xJ7XX4R+x>?M=A?ppf%Ans=NgV=@OY9+C>Ifw_676vczmXI43#&&Mj^2C!#uc{D ztzm=Qpby03GC!KNYc=h+$4WzKgghR}O1mh~hEmmq)hVZHh5%A2XpH{O5Z{Ih^5`@{ z6A+2#s+;kT`9H`{e|iQb5god(Sv{&-ThE00&dFbYTob(l=;%~BbxIb>GT%~AGJKfW zvM_A{e1iOI!L0Zk5w9fH`R^{XZZg~q4seZEMNO4+L2w=_b!UQhB_W^A zPc!awRex~|fBj}k&`fp9PpDb_Xv8Ka8)bB%IEE7$4AgIJzc9G^OBFdT+P6Gg>5_#| zCcyT89M`@!aK1?jfPG&Ad8v4$YjB?jiM(hH#fDZ=2JLbHKs+GAk^o>&N(w-`4r-0i<5AXStkk zcxXR?Q^$xs68+WWo5Uw});D?(*?QC#trrM?!-WD)C}PI?8xGh}11jwRy|V@uC}n9< z|3&%V;UcUy)fh<&I*d1NOY@HCjiJXx-un$?aAL^S`N+Du_EO9AmIkYp zE~LTqf@srTD75vW=NEX?V3rYq^~Slv1SCtyfG=^3gMFSKnOoWM7V-?r*CMgJG5?dW z+&oSx6pPhZu^qwPT`^Qpow#=sn5ou(9C*oP1;Xlih-u2g1?;;>{QRQYxYyb}!$hQ) z1*C8x#PtQy0{^w9Cby}qTWR!7h*(FyOAr;@v~=W0tp-xo>(uahhBzcVYKivZnvi@r z*g!+&ON!-D_AmQ*Wg?rHBu_`drbMJl6@bg_@yl#BF#;L3FO4hd1*(6VcR8_t_|7VD zd(E*B9T?|-d^iLtAh36G+{r(snIjmYS0^8qc=RlIybjU+IQx$u zU?hX^gYZfN`#DF*FNu6b*ILP*Ja3BY16sIbbhlD$(DHE-E+J22T4fitg}UEK_^ba1 z@@MGx{}6p0hJU#H)**LZVeU<4X*&>qd4szS33mA<$ivZs25J$l zopNB0?I<7<_FiIDUMW3_i~7W+bnES_2U+tb0Ldhb|A@+_nvekhQF3{Jv_hr5)(BC% zu<+Q>*^EB9z5tBU!MN&8_bjHA6CZZ=j5e?WB8)AnCW}i(25YS0Bl{PBvhWhlzmrnr zFBPZGQ>Nw3`~cIFnD2hG=Y@Orc+~6?4q^+G#V~NMYyhw?Xx=W8JgR7sye;*rZpZAv zG7zZS1H9;$#h(6u>xFA@>(lJ?v~cY^p>E)3Wq)AO*z%aN*du(}6*TR=5q~O0iO7Lo zSuJNS4Xif3=N1(3wuT;mkZT@>J|UAXLi0a?mospKlU4{7nP^n?0dYf(bGb9O_oSTh z-DqfQ+XnMpU~GRJuYM~8ANfyti+B3jM&Y33(2W#D4jV}B1G{2*-H_@49j)>&hXqx; zuwaxm%l5h6J9NC|i=Z+kE5-lJAU%I3h{sIME#p4P3a?e*Q8P<_vEFm_P6}N^9j@Z~ ztdyN#aN6wKy-hg=zD%a~^L@{sVHk}!o6aCA@V_sDgs^~c3#og|-!^_TnAN-9V@F6A z=m2mpu*%FFLu;tUf@kD)Dm-lpawO;bv%}zP!k-~jQFTB9TtlYV!isC-^$ks#0C?lt z@J*ECXRXv^fZ3{lZ=9YF1zzNFA>udE5Gv6!&HDOUk}RGjV8c{CCjK@K)1xJpHoJ@g z4XN7l4D|E~BuG8h;bk|U1(O7jhO)&4c9Q6gI&FuQ6<@jEE_lXO;^#q-Ju;!F|L=Y{ zpll)$vs;D4pdIdAiFhkQ*&Ykcp!k3KEi7wQj4uO?8*k%(8tH{`(k&nB?*7-n*4UJ0 z)b?QRa9AW zR}I&7;Jns{XH2u=iMX!Tey44acn&QHboCS|)>yaQ636#v-eGg{tjGQEPDR;#X6sXh$ zi<1Bm$Ex*xc&u{wmU2liiW}mW=(-ai;u>Io9Ur$7Ad323%|?s>RT*;e>X)_rsr05I zR?I%+&YX;2TycLdQ!~O0=gS;63{LU3eGH=(iE>%Sm59Hyr?jV3Lr)avZeLetf#h!h z7!<*gt=ij2JARxFvBmaCKG+)TjdfD@`IHaDoLJN~{kX~8&~#rN^I9uA;@ z-!@s0ha{R-8ktmm6HD7yR@n7xs~c2`eGGS8U#(a=XLmSYXcVRMG?w)J9f_C9Hq#>p}Z11y7@nUaoCxhyKvdA!^51(K=BdGSf1}Q(PQv1lN|Tx z4(DE|w|g|r;Jq(%UWJo=mgyiUPLAukz7;IAxZB?lTLdH(CqG9%c^T>L;a@cK#teZ# zu1=K~esHq9a@-QimPu9j2U8Yt0G~u%T=*AV+#L&SfqI=eR4pc)YUo z$syOEps=N&9#px^gpNYtN(COSn2u zDxjz8-?z$6;4)OJmq5O>4SUS7G$^(ws=zu<{hDux$lt^H5m%qF9tmE5SXTu}XEN4G z9YXq0I)OdR5Nj`Ag|cTHjL$6cY@%15HRnG?z>$fhT3ZLZhJIzdeKY8KKo>tyafmPw z#gk#?zejax5XzCRZy*Sv?>7}3y5$$=t@$^i0O!1w33AH5RCc(0!O>Ka*I5zEK=^uw z!l@p;@yz3xIIkGc5zMWBJzimetrVVnD)}XpP2fc3 z`I)B*GXX=C1Ufbi2|?vY5bTeLv$`5!7u!ac;?X0Fqv{zcc{?Z}^}1~$-8V{pKSK*T zR0J3n(TD(ydWh);(DV!H>1UF<#qUCr>$E)Pqj&R3zyR&)tq<{#! zlBi6|XOwW(FABYX@dXU;)3U9nAT%Xfb;Zx?kFnQDrUGpCTkL68jh)^2qTZ=Kpil>% zV*qHWV!}FJpJN}A$#p!PhkxFIps0ecGPj_;?U@LcpzX29U*1tty+OSmZ+F0|cE?p6 zP7c=cZBmrvcQ*5+tkAI63lyelkSF+Nm%Soc&Un;yJ}&})n9r$eJw|N8QE!Q&;^Wzj z%`6-EUd%8Ep{Syj3(yo-lH5EsN)44T#|=s$^U;Mbk4x{fHnwDHwUo%2*7JrB@aM9H z!1gIrfI(r-oe|5WmXT&Mb>KyYGSc5c*1t|{_tJ{Oi;@Dw7FW7l@9^kcY3!a;-qilt ztPj(2lV0tj>x-2}6svmlvUnl8C z85^*H5Lled{WS!evk2PFGzhFq+20;j>pJ@h9P z-QxkOd$oEt4OdokH#dc&w5d!hy)DfZ*-lb_v<{=F+!HQkQo$4@_7h_0iEd4)7YNIE z@6iAnL2H!);IJE{ieRXG$E;*WzX_={*c#}?<6kMWt;(ZocC8URISA$94}?Cwizn>z zrgk|BM?(-b`@Mt4d>{CM{CYEZaf<{9gh>wxx*N-r><6+t_Qq|NiBx27-lg5J##38= zcDm)`!&Pbi<~We0PPui-X#=!I{o=IG%u&peB?V+c^W&fw<_ZRyOfF~cch;#1Z#rFNOC^&J@o^!C z+zG8NH~o%)oNN~sVPR3(qOzF%IH}KnxS;sjaSeeCV^sT2Q+}WAcG!umk2zzhI!@o7 z0fr%6L?9K|C<_9w=S{CIU^})04!KSHXZe+Jw5HUDSnUhDV7YVA)>_Hlp3aaq%I}bv zDwcA1sM^y)RN~T{B-h}H&r!6&>iRYRKA1uv&$!PB4?DB|xYYYTNN39Qkv3Je# zC>{cN;8G9{%O8Q7;R3{>o7CBhMRb&jBYJTF)4e_tvS~}2DnW!`X(nm)l&>}a^5IUNGorD-g7*}b8E2>_rFVoAS58o3@S)@2Av#i2wMvhgUS5- z@|PW}xROpm6ZE187u10v=Z>6$(`n4&+^G#e$w|)z#xka&gndZUxE*euxu=B2^j6P>Hf~q3>HPppg4PNJs4@z(Uh`61v}v7GIT`%Cw3FZ<$gT8<%6GsdEq6TK&4nYZIc{@bsAUM=jBOE@UjX~s~> z-_A+DUy6Jf2LNDT6ES7-Sm3xg5@O2^T%Wb#BJ5t!oS`+TRVyjVqn7og}0%Qf$2QG z`_!}nU3&Zr1TdcH4zNx;%HWk)@<&#A?u06mvx|$^N8kvjlW4I2qBvH(Dqed_iJ2No z^qAQIQbkmMqlqN;+4}2tGuqkGdjwjhTnQ~BOv=LbaZ3j8{FJM?2+~^1)d5t98lwmh zd5WQ-FqXV~_kQWmY0{eUvrlPDkMJ zpy#-Rn-=oZ#GEy8O*IKlBXwk%ERBrNYubZARe;@pT6g0B?@+QTk%y50*{+&|d*^hI zEeG#5IH)5|b*+TGiG+;=iaP;)>ErwIf=Hm6sbI!i6PDdt+ZnmSzqW70?=2d15OMTC z;iavW6-m!ih=yq1KUs5O9&eZ z=YG(C@=60xd{dgsej&K=1^W?IY^TVYNXBUn1%BteZ)qZ24Xf+@xME(66pi337Bx2v zk@}l-!Suap-t;}a5_Y)(wVp-c-}g&e_HImEm8{d^O=rUQb>9m+&cu%?2tgh*&a1NV znOxIw{|b8GUi$Pa8#B{p@5NuP$wYyPTI-{oKf63;JdF7AhAQI@DNAm-QZ@ z2UB3NZ;Jb|r;$P@6Sjk+A~3sU-3o z7ulMfqs)eOEqzd%BW`WpxuQKt`_c3vPe@!6)i~(Kovls79%PUNYb1 zS~UJVgLg_!v6m2{<0+E7Kl3PBlP8qN+AcbxQl(W-jX4tCgNvZ0@=NaBaIW4!B}g>( zvO_~gFgKfG2%f?x>rqM0hDP8GvHfO$ZbS@Ov;g~Md*^i;8AHZv%8u}8Ir5dJIlq`^ zro%Dx@P=_v@o{jNvWHkd5S&63qGt%Od@jFoy}MbxPU}BT3TTDCke*j#8u7r@1Z|*n z;Bq4-H?Z>P755^?@rigT6IAcAkstlq^-+Qra-aK*eQNr{BIII(V-&bW<@ol02kKBR zX%7!b`^n9bHTfsA9pYL`1A{(0-$nz6xHGFo@FY)^-B z%&IF<&`S1tiF37Glgz)VT@&OtPzn(%M4;M!&Gu1PqjDLK1w_DM_Ux=PnONfWmRHJ& ztf0c)jG-iSqtvH=PD|>NLZZ3}7()T5Ra(D-8UC>?i(f_bx z7Z9TcyLv;XQKJ!>5R4@IHAKB3j{$pyqXlOYkf}?otnOMpC+0`s8W{F>vi09Yo|j$u zD<0ZVS@$!rS>q=BkRtXq`rIqeHVp0FEALh z_nFY;yS`6RHv>Ra+%N}FwZ>lk+48EDQM{hp)&o1Aj6U`2Q<}xke!Y+%N-^zn&JKa{ z3){7w(Ai zPk93rOcVc*z$-^7dS!7W$TzDftg5U{YdQTl{qp7mJ8q>QRj`S5t@j)yamm-TMm-!b zeeEbo!(o=Y9Np8CQ7D`yMtU!+z@^ouY$aBF4} z1y5#6gIi2))Vp55KSV(xmK72d|tK$w5 zaMdu-)wO~*O=1*bhzyI#hjVw}=Sno6$>Sb_{E>6yr99_qisHQrx2{4}(<4JK`#uw|0fsJO5hp_|Z*1!!LL0c>OTQ%n0Y6Wa4^ zvL^2Pqg6iU{v_ zcWiB3-EV@uxZ8Ha$X3-JXeQ|63ZtZBH{oLwUX1ORh_%ia9t2i*Vm#~mD}j*6rl zk-V`ph#L@rg*NP$qoWk{n+RyKg$>c9auYs({F`v#y4p`ip~iATCd>k^XG=JqT9LrT z5tOJcF3ag~%FPXEGOg3ubNMjSreJ4jtLw@51uAuP9@Bjx(0sa2Okt9YvG0MaUj0#^ z1I#J{Py(P_2CwT+<(Itmz&-WWqr0zBcM?&W<_wKau??{HnwegjlL&p)6C+&!`NX<^ zP*uWPQLXgCdJpkwT_>(?h z(mge-6Hq>zoybBTnqJCQ7pf{o`V~w0(N0y8^8!+ox+YURLS+N%4?)=G^OWMjteIr>T zfl&?1Ia+NIS=DV~-%h_sjdWRmPN(B`Q@~i)(6A@%hZF^aU}yQsbEm%=oM&L{36(ox zaali9kMO!_>3eB*4W z!%rJ67iO-aj)9GQ$+i@^82AcdCNXJXc8ORobOekiitlkmY}`zPR(zX(IOEv(F20rZ ze{qK9n^H6g3O4IXsPVZM~_M&W{^xJo6oIBRF7MV!0T1qTV8N7mtb=Ud-~KjKD_GiQBg5 z9+Y4)CYf$EZV>8aV(x=~GiDRx7r|4#bxw_imrx=7K?1m}b;pS$OdwYCk-C-o&dQv= znFlswo=}x`KxO0$E9hh45&qmGFIg9ra@F2RXObe3Qet?&sYDz^rMK0i<3l;1wy9Pg z%mRN9YTvfl6evlOEMv0U$ZR3U>d%zBNsfuXL&KAwdNTuH=WRlNLMueo{_|B|dZy|~ zJQ}sU0wv=`o9Ux-u?(2(8f@-}3+pBoS;my|+ct?!A$Y#5hHRy0w zAzj*l!0PORNb(QxhN-9_9f9tK0lk86#x0B=h1e#+up5<0!t^m85p$1Jh4*Oq zQKS1@8NR|(nKut#ofG~Jml;}+hzm1X6H=}9nB=%;rWW~bYd$GiPM+e%N{J_ipJU|i zk~!gvxFRsyNUh+J$mZHbUR12o=CAbSiF1mT59f^OWCJ9B^ftMx*-PzHjpe$2Fitcg zY;Lw_V!9ua`d)sUCeFxK8A}gGbUyg(v2IgmX^`bmr33$zZVDQs;EX#QBY@;4&fuGW zOsf{fmk3s?A;3`G@Xf%P*As;G8HPR)Bs$i_1}JNM-3d4{<=ex#k7uYD-u4kG{P)*rxLxFW|f~*6P)`yRKubGQ5++F*e!%jaZiNdq_LM& zii;yls3L}`w2&)ml>Wk^$0QLE8rPP{F@gCAG=awTHIR`zgf3lm{ZdU(nSAdW!gDmJ!rMf=r z@cFrWz5rIdk^SR@no#O8ksk^IK5@rbyg36(s4+4G!JU3)kl#@bsup1WK=@cXpNZ{o zU(b$zBdc1w_q@u8_oYaF`g>wA(l+ZHQJ(SLU|N9Tu3ff8l-16ZT7eVr&KIZ~&WO!V z*F2VpG(gp`$Sl+RK{4HdTtFA}>E+_H?B<^`{r`VXfJTk+Cmt9Rn%#N%A%ueAOH6EE z0q(Lq)P3d(h7R53j(qS%BrlQ%hk>TB;6+h?8Nkw9D6x*XOdqimsTIPK}GyP ztXVR&iE-&iy8F@9&7gv*ye(dciOipW7Ydnb@#n??8exYl1+w%HOU;8iY8zRRf@;oi z(}@5l(lOIMZ}n~RTryvXtmCioKt0w)(DM@rJ40Q*=-Z}j=z@(TW96$cm0dzuILJBU zI3Ns(g&&MY?}};F0RxS?+zj6TbX^@-zom zqd#pp&V6;bM__#(0~)yG5@06q85}7Ovhovrrba(^Z?z7wYqck^Kx8F5wwwS6bX~p3 zQ&}Q?|Yyg7iolf7Msr5&HjPgkU8F;G%;r_hK(ik7O;~*OeBmk6E<|CDt`fp$r zQ%ZGCCM8)u(PX-zz2A>|q5%}1vC@8sL2_o(2u|opfqOT-Z7QM z@W^^ybiI|X+zD3UnvzM)8SqUQZu~EYDWb-9ntS{>Wj(<3#@e=g#<-Bz?0Z#*H`P;m=EzjF9D8jTkbPVeMjFsqfAOoQ67a)XsPvimBq5(>N>}#Q zXHKn<=f+qNVEDR{8?;QInQp&!2C>zw9^LS7!R32-S7+W6MZTm_6+jY1iBrQsj{|pK zD(cl~7O!*lkbvy0$5bSLCB7($2#u|CS;{XT{O0^uQUPgB=!}R7OYI%c_9=wX4>G|0 z?6`3o?1Aw&_c0SNR!}9}*KZZh3-Yn2MpW3}_L8ej+0zffoDuJlZVIe#IIt<QqjSefc8pn1QHeHlGO&8l4vFj1&5c&MSlq3VIt7mjWA{|Lg1OV@* zKYl-aL8B$LN*@S+=U7@3<%oVOW}?~?mqM};KD&Mu$4-hmNq*!>1Oqzo12gLx6<7XK z6J+F%@~fa~5xoyV8l7R1#5(Q#O~RQ50J5G;F7cH3C`d|YO&7%6=f>{_bLa|M*VEbR zSr9Q}=>8b|St;})8EkV^C2bs#^2__+BMwIut!cJWu`q&vT$qZ>kbV9t%!(FG%tFLT zI>NGgMMpLtO&E0rjeR@ni;lob|2+~lvT4?}g8b|+I@L`j8KPw1?zbp2h2=knk2X7z zf-%K#xDJRRvV^>|4^_rxIb*{CzqnD2Tk%?n2N=TrHbO%8!#rpjr-y#va2Y?bMk21r(Dpi3Jp@0S8ctzx-L& z65&Xq91v}#FB3pv(T1{pX`l8&Pu#&|+8@V^;Po+}em!Yde#QP3$4i)9yT3#sqG8#u z0YLu$BWCxpaVsyyG^sM=(|YZ9DP#=EqB>|vYmeQ3(9Otqx>}|s>2xn|s$3fvFY*5p zj&Ee>AMK81r1)!HKQTGT*$Dc%5(V<4C!{^h=K!yjs+T(0M z5MA`&6-KaN5ze>bqm2USh|Y*?%b)O;p{gCr4m4b-3`1ZT4XI}woEWuBT`Cb0xkj|I zfS>EAd^*dj!I-#)QK)s+)b4h6lIvg0ug~R1#wkmEu7SHW25#Bx?kc$krH2eW-j5YtDTj?!nL#OzD#ctsznX zY7h7pK;a8^V%Y)qJY#aHXA^kR46~ETfz@W7X9d9^Cv%GT!+#1r_|Xl#@L0lsSvj_U zX?AFaO7OJ>Z=tMQjqHe%Im3IDd}P=QzUhziaGb3q$i3H&-ONP44c@t0vZ=g{ak+}V zAKmIhldWNANse*RJh)CIImGycs2s)N@}k}tY84cxxx z_%dke(z6ZGo>I6|5gA>piC#{5grt-1-czW29&#@MB8@*CUO@M35m)ZJ#}f)M-mz`= zO8yRD4*kh$i^!QKv)VT-w=$LaVCpGOR@OIV;PYi|Qlh;DUxfl~*U*Y9dq&!SbP?xx zqe#N&HyxIMG}noUL8q@=0|lh=L2O*;i$Hbby+9$`J~%{i1HqHS4%H3?BK#qa+~AKEA1Iww*Rm69 z*>9Ns{F@ro1hAs=QbYZJJQzSQ9()w(RQf-URYsV-E_sU9zjYH>YI5yVdBnKATwUu3 z(^r@WfXR>Abi>A$U%B|%;B3LfP#Ip%u+ar`eI4kB*C0N>!AOdE>4swgcw^j2R90I5 zmLwW$#_PG;yTfxupJ2)L~K z<3gHzfqc(WRS2k0SKY)mR!sv+rZ#>uqGP&`yXo@9!alw;v1j@#wW<(dMDVdvBP>s64-9N04%H34qeRkfIOdTE^Vro zvM*289(;9wI8VL}HsKtYpRVRDH}qf+EH`DZa@1I+h7f_=H|;>W%%;i6bZf3ZBI17= z3b7W!OLlNCvrO*2MEQDAv!5!VE3lS-;YI5(Mrz8J78jGTjqkvz=qQbL=nc-feMX^b<#UA66Xw zkL@yS;;SFT+=t6w#y??>(Ud{)bYITi$8=@*ylFboet_aH1pq#wTa>qrO^3bsIDh=p zrwOuuPFqczRV<Fw)Q*FKn_hg-09MIbp49bk$bs9vZuCNb4#9wCA^&6%5Smh`_h+PKAPNCyP`S=7 zWWeY_cF8jF%#8skshgbT=Bg3r{BM>AAt$3J;0c;K@uoQAGvw$Hf>`jr%8dFb_RP!k&j^YX;pj&Vkq)eUrP4DzpTYsVmQt_Cd5B7@eZOdxK9*cE#K z4Gri5i=bhl_nbCNZQ?2kTl|Ps9>m?k#8p#)(>Dm>tSjK*!#$(R&|P4@Fj{T81@ zKY`Q>jaGm+%zqqy)*52jxa%W?$lw=z#X1lZEA<)ILx9D{m6iV(fjMB+&-c*A!OgW% zWsFxuEkRBenJZ=)*NNKhQrfh)NcGV}LIQ+i;>FFDh<{8QKNMZht_0s`SM3?Mxia;H^^Gtlkz%pZ<4 zf?kg6_xyX{tm?zNu)iz%SMkhNlgr*_I?kF=4({QnIun_+4;&dcmSeXA?EKMTNy?0j*6N`jIHlm#7@iOW}MtS%#&N`xek={j_Y zuf#FFKKD&46OtoSJUD2c1!g#vS_F%F1m`cWmKyb#6AfXbDqCNlEvGLpTwlKTq6X+XlULyoadXrw+w-?$6QD>g*l56&CcDT-Etn5$lpQB9V1y2`4 z8fQtuoRrYy3|T`ZTt!}HqYv~HneffQl^8dm7w#g=J2J|P7(ctW`1>MRQ9KO5+Tis?`%~V@T}r^IZ|HxUqL+1bx}Llo`id^PrskvD^Ql z&>V_+KQJ3-oZtb$S8oD3cxti6q!&!fNi=WsCONK=zBP&?fpX2JJ@R`ifkCLUfy(id zbovLAq$*^Ik2dXp53yFJ8v|NN4pGSQO=w?By;;cJffifqpMOYnUYs`Fut;Fd)FPyS zO=Ep*>*$B`v1Quph4gpO{41v~bntRAn{xct@thMSAHW0*;nps8 zj*{Md-e>|{*f=#V-xq?-SjTAc`$4k(a*zkft}GvtWyrXHm-HE@_^&Fca5*zNa1}?= z>q|F+VD{|aHwBa3+&Dqub&W9fu9psU9oxSlo+4?=KWP;Cn6Cs99vpVp~2?>TESWkJZ!DW zq)586M4apMy80-snkeP4nYDKRiKBBX4QI`++n#rSH}>hrm#yv_+Sh!<>TFoX6+9Wg z3TfGoSzbzWI!RCKz+bKC{rT_V+ehrfVvXgFwM$3_$Y#G3zpY3s!YGQSNm2$1~q za|2+y?(ANr$RbvE6*bKl9+R0+VFMz4Sg6mCQH4z-43WZ%OU^|U` z)uba}uYtT27g&X>E}E#)@l3OaXsaw^_9xK2QfEfsAG_ryDzxXmRHFG&@Uqm?4}sV( zHJ+_%N+qB@C0V1%K<4qTS&h!in@bdWN?Nj`V;X`;GR zQ4saoD)ZR~PmF}Qr1C9qtR0Oe=N!VC0Usqln8gjx463Um)L$78mEtt3|7ABh1`fbo z#r4RSkU zByjO1&jlDH8(hzQh3OH`KD!<0GVxi57p!@Ik_bEW8eca+nhL^7Mj|0t&nzLY zIiv;r`dS3SK+*6RldduxGm$KRARoqgIveO1EdYQqp~DOORrC`O9g$h*`hR>mRH? zO1>T%aiuE*ou_q4EY(4J%bss*T=<%^0H=0?0HFT;(zn!?GmK`a=;z#jYc<3&9h;3O z>PT>uCndaw(Ug313@Py@><}t#ZESd5s&&o|h@sp*cP5Bj*;OHeO$fx8p|A0(aQFb> zEmWU!bX#U4VAN56Ba&x2x}YWBaga-Ir%#LoB{x4GWB=C6YiT2^>WWd0zc}3R(F1*# zmd}2$MpXB9v`4{J>g}_C!}&oaJWH_H_2ul_1T{{=^x%n}70z*4YlMYsAe4m{)le&V z{T)bL_oeHAmy;fKqr5Z?M)cQe76AUvj>B;ubC3d#xl>A93Eu}{NKh!-=Q@u}@-#j= zu^vyfi#_IuLAsB|;4E2!A;HO+1M5 z4E|_E_-6oWfBEEHLGYt*xGd;A$aDjS)a@&PlhGDaGM~tjC?SaIupBKHEBzkOCOfZ5 zjrW#}2i_K5TJ>Q^R%?GE1~&iRL=80;>=wVRBvr8G)Jsag$|6O2UrUJkUJZ%J#Y#{B z*`-kSGe<%@+c(jFYx!L?O+0W827!D^HFzs=)IHGSMyDQ&@P1opCvE0LnUHV3&4qOF znrbsXuC{$qKmjLnY#SYoEzld$^0vaOyPs#08)geH4@LHdZ1!x5!O6)Mj8Z%6eT65p zxQQ9K9SNoYL>&YGkLKk=P9f24LNLbFwm|$X_x>TJTuE(zY$u}oIMYJz6K7AisW{nn z3J<0e6*CJ{+;DjZ1BzebN_(NU_yVrw579OQB(AccllF8s+#X+!Np{Z9)zLn4q{?I$ zbUV32ZcrUA27^bLh?Q_LaM!ObNyWXRoUGD1OVwU;OZkeTA5e2fuG#NynW1~h>CJXx zY)e@lC!9%t_9C^Hw{T06-F(2v$!iHJ`f{MbtGuDk`Q2|ZX2ks|-`d~cp40chr=U@& zy>9?0_>2b~3{qw`NjRsF`!;mq#1J2e`(6{a$b=BhC%FLe@n^59b`vMB4y_)SGHXMa z8U&sEW$(2^*_J13T*E6bPL_KWGa2h@((KV;_ki7hF`ojxsD<_;yXg;e4RzLB#m3x{ z`NAio)rb0l)(&v(Ox*4@j-EarwFodQc{jZ>{AnFY)Jvk!D(A=oQX$kU6S3SC*eXRW z?yE4F?eRTaoe-ATw|_viUnFug2`#F+TiCqa^3@6JLiNW4bS~gIvjxA%c%~Ndjied< zvV`n^VZn4P+fEx^73YJz_IE3jo|Q;RY#-NGRLAm2dsJRkYEgqqbO~vd%m8#Y;>dD%64jRN~tb3*}q76 zfO0TqUw6a(t6*aa9OYfp@aRXsPxaml9Ecag@h!Yj!VZPeew4;so5R z1zeY2H(5VlxMTZl;5Kc22s$cw!r!EGdvGP{DSoo+7r7-zpTKhgb=ox>Jm77wLbzxd z><$NYamYkPHKayLht-!)pi!8Ow>)eUo=Q*~ZuN}_Ho7g*pl1ho(K@1D^=R(j#d0%11gk7S%fFAa-t2{N3uMPh&HTVqr&Q+@uJ!q7niE{)yrlL5 zet_X*F8yjuwr21bCcYW%ULrJ23S=ZZv-dKON;O6F0NZCUYQM#7-?+?w(SEaKB(;*| z69Rop0OlpO^Hq(>%eQ&8Ny|2!3dYBV55Z`gJ4~}k>W-RBoj4i~Di`o~R{8)vK*GOU z8h?Ij1b><48|Jnis39G)dk+*_)B%{s)Y{S}^f*U}6Rj<7E|SEJIlHC1y|!5{!Hg}S zv)#>p1>tnmYc-letG@Xp{f*xge_77<`*;74BP4yDFYgb$0zX&qpTuSB?Q%6oRaD`r zBBod|@P%rdof5$Qjec7=OU`Yg$Es>x0mD9^L8!ZGPOYjS>Cr8i^oj{7I^NHlEleE1XD3g$`e-ElG?N;I| zg+9Bc8J#A$t9<*rSR48sCE{qD)Uu0$GgQpZ3r)9H0I>MK<_Kw03~wF47Z|SUDage zuz&E2<9-bmBflqsC25T8e@gsS?Rz8+iy*lb^p~y0DOGv$bpC*iyib9`F4l!rs;+sU z-dvZ$59)$zJ$$j?aueq^x8n#}li|NiqC+$0{k;_??9#PTbdh#>Fm>(gX2Qm%UHqf& zA@EOZh5M4U2rP{p6OKb9Vd$KhlyKnUtU^2E$%|$<@^)%P)=kuNe~MP_u{j50HA3u` z9ylb^G8%h6wl^ED(@xw)+!amX?)hJJx*&_(F1*k&e&~|qXxd?U;EmXtd(HoE2bE82 z8o*z`E$*~E7gjl6b-8%1B%u=^lu}RuJ5}2l?BaxaUEbIvaVdOFdB6)HM$}+wgd>EA zE=zIOVUeU#mnZ4apHg~qHg7Clr{+rowDHofySe>-Du3DYPLZqD--}l0 z1zAxkRofv7q!3dskfAaEw*a2_x;n#Jb|6kSGWw>1!yk#$=R0a~CyRh;weB{sk^k-h zmh@D`2(tiAsr{a`vH3vavD`0@XxO@dkue>?!wT3Rm1q=Fe;T@K-|;}qNYha3RQx6F zCKU4W&zWPucg$zs$Do_nVW3fF*oe?30Ltyh#JG%=f~xg1&;nRWg8f_Jpd=W;4T?}; z0Os5qu|k)Hv+2~&F7KhTf~KXI`35}_w9E57bK(5VVVjgx*PDGV*LcUud~r169u!kk z0^Nt0=bce=e@F$PqrZ}~+=bM_zL^cv&)^onOIpmIUF1F87a^#YtXqJVEmJCY3yTtl zvs(|X4sDZxBw@2kKx~Wbc}S^jL8@^PaHqxYGEDQQ<~ZMZdDH0+G4s!Ns@I9Si%h^U zG1ldpM@2eAs%qkkc`vL$=H4C6(ByvsET|))xN7jvf0U3&>{7ah&k@*%F^z(RfM)(D z8D336m?4S}zIrFWZnIegU+ErgVwABY@L9H;b52aO`x3*W9n`xBTJzJL!2!aNFpdPM zCW~jIgGxe*zqh1YoqP1r1=iLD9TuO>KHbGt4Aj)psH)tqVpv^XpxY-8BkEl>3ZzT3 zYZ3O7e+TUb+WNkVE^TcppB~4mNhO77m8`B4i(~vMh@Je&6J)7y}N2 zL=}oQlnjuL9S3GdwW?il`fk)ss+LW8n1myqe_Ouk(0`CpLr;K78q6yk7lYid+IAHa3@ZItL= zX96X-9S2DIDf1l7OyQi;{m#>j!IKecM!QS+3AEJ8$Q;$i${ z%5fI1B41{a+43i$O8^9^Ui4peZTDQ0q{W4(ZPg*hw++x_bOtjH9r4-Z131HYf9E7< zVUU%cEYQkHDa|!YCitZ2;5#@PdM%>;9InSkyuG~rMbi7NP`8NQO-M5%miQ0z~fF6{!;U7&oQRu3ZgfKeg_4%~Dq&|a$%D0?*rPs}R z)&7d8#@8Z6RLY;IgZ=6jH5}ite~Dw9VC!W0}msiU9-%0-l6?q(mpE$w(T zn3J$PHhThJ$v&G#!jQ}^e_2 zN5Z0H8ae^rK01uCZ0TJFpAw^-g8}b5sN!gvSzvagvUyX|VA(kDCDItrf6a)L=tsaD zYg&QG(&F`=P6k;5%GP&#=+sP?QA5uwtbHt>IB^B*1A%x5uP4A+s34tT_Lxl^ZavEx zHmbb5`fltP5s@}y+B}NARlF*5fSVrDdhiV%v8iY%%e$+_2T4ZAILEV)p4OcdJKi;$ z%=%22s47Za*d#bWHR7rDyv?Q< zg*Q9V=whuZpn^%G%%kuZ?$aS=)G~{ISRQ?SG=)T*ju{*Tfp33P zDKx`Tx<^UY)Oy*IrhVWJsVm1fUW^YNc#kT^i6vuMbQ4?pCD~VnX3jX`kMEw`IX<1l zv7fL%jn42V8Rgbc<^${%ruMt(XQ8^Z5?eN&`l0~N%SF_{&sKe0XraRjphREjy&}gl z>g7W0ZgZQACxpy~e^wSO?9dkPK9?va4mZzHTOfv?^5heSLV#np_GIe+aRB>1$`d75ab{7yQl6CimSZ%m##Ou1 zy8R)j<~KFbjAOFCiNMx`2;Twcm0$g3v{ptbR_aZX8kE_$D+0Qe zA0FL_88OcO%IUcJukIIWkLI^ndpV0?ayN)_hL-yrDcuyAwLJ(?XfWiU@y%GQZ+}%^ zhtX}=!t$KRT2$6#^>5YKS}swc1O7Syf7{j?D9Y5VsKrp>X(@u0@Grf@#^76{TsGatQ7W^P>+miZ#J&fB1@O~a6+DKg__8c`AcL} z2WX)W=&dx!P9Li`4yM(&plF-RX2HCl`|?#j(>}B^Nxu&!QIFUoTmqO|Bp%9#lF|vl z)g1jS?qG5eMnaqDrR5f5AU8hu#cLN>|u#)tF`0nbb{hCHSdI z-+M@dhvH&jYPuK)2kNER(cIUL&0FsB>V>fwUQ^(Mf@$FN7UlQ)564-$p&bk`1NbAz z^GRzZy+-?KL$cVGGCIiJ>S}v^j*gR~(eAz>P+*8c4d$k?BXN!c6=2!^RG(K9MJQ;d zfBAy}{$&ClfhlK3R*Fj4?@6QEvSsZBs9Mvz&s@@_HSJCLX~d<6+avSp<0mIM(E;X^ zWS_HuV8E*^RxzSBq;jp*1z7YZqOG;;tgD^X8S$-q<;vB@7^864VR3Vy#Z>*7qTjmD z=eK9rElv}LIppxKVjGl}X${t?IK+8)e=jx86D#~)Gb{DizsdLdS=mD-TGAWWVzJDV z4z@uL{+X&}3dYBfm9Y3u;{G8riN4 z6ciw*IrkC6IzP&NDrz6LDKPJdn5 zU7Ay=;-Yzcc9?CU>4>jP&7hL6NWYG6A3{#KwKv~-4Y ziVk<2Qfn(LbLkOOM2^8%f{_;%)25P1u!Yv-0#20Pn_d@Gp|M+nf1%$Cr?YK~o8gQE z(b%M|VF3XutV29h$euy4+l>8;e$-&2vxezOOudjs3Sse3tA(&60p4=kd}0e*hN(J) zU?@28*lF=px#cvF60b;0kwl++QzP5M{{DmsCL0l#rRxJYe%F(X_UN#UF_noT>la++ z?6Quk4A;sgIw!W`e`t?>Z8{0_1vT-KgBKRgz2DUs4*Iq`}~YRWX|m)Qml)DoSzsSR4yBGWInw zwB`#HI||X`f1tpou0&KGkg4duY^ooKo#nzP12qPJc(9qA<=&-tQ!x`safBK#Eb8qL zeA?dj^ntXbQ*Oo*(pq`6!p_Q!~763YH7-Q$G=SGHt(fl@Ftj&RNVJTg)bfb|k2_TS=9Oy|UfQtc9wy?a>&cV4X6mDmOV9*jZATXGje@{e&R;5gU!%?d2uX%Rb=N$TtkZA5Dc-Z*5K}zumsTj43&ly zdo2BB-JgN_hkPE~uM}t1-nH2Iw&h~Xe|@GEz&TSb^;>59miNyrh6G|XKI~?XGpR-W z6FNK%656o++cI9+7p-IW0~sUU33+4$w5v(ci_7+8nX>Xh)j>?9KGy94Axn&-{u2`k zNx4`i6<{>D1M@u=YYnaax04ePGN~CybjB$2Gz==o)B!&}Cq))ydd9fpvOe4+e|qI~ zcLR))OEgLtuKs`%@UfB76^Ga9P@oTp>*n}Sn@XoB?ogSg$N|FlRoHRBA_M+(RATf{ z*{4xOvct;Ax#ueT;-j^=U#jBG{#Pk1bHo{EP|7-)SqddXdmNmR`3tI-s3$T#@oW>j~!e43`S7Q$rPmyo{HACQ!3KSK7u0WnW{t-|%VS}6k4 zIvrk}5G;de3PQ4sl5|_rwKFf1N>x(2%-!fHJWd5JB&R2YJ z0h>Eo&RvMxz*!Q|#&~y(Cu(kIqyd34Rg-X0EUnYEBkLXeXzdmcRWYn(ycMRh4%NnI z*EBX8s#2G!&+KWCDL{Sxe{8KytHjd-+MZbSCpPgBDWs0o(xoGhz55mwz%YCO`imayX=NyQ&%8^*A|y(vN5{uj!eNF2%r4jOqE)-5zLTo5hyqhp~!0 z!nrCp{y4X>!c3ute?{^>Yza5X#|}B!mC)vWAdvxHuft(fS-gG29qDb?XMZyI=o4oR z4(iV9g0%P0vt#Vqa;D{vR+67T?6;F3ivpJ$xhl?JHChRdip)3OMC+fKkGmXPt7VMj zzwnwRnT{IvpGbRa^L+qxs5(kdsh*cor7^CwwC4qRRMcp0f9-JHI(5f(KJ!cLC2X>2 zT*FQsQW#oQ4?KwE@x8#GBh@imj^;=UBn%Nri8no*He`Y4WCE=% z5e?AIk>I+&2Krj$;~8A*!~5 zwVZuc7+_d({8JV+U(beu->^RR)?Dka=J#~Wl0lX-mHPXFfBf53mJWxBfz4UtYA%Ks z_Mut>;J>kgkdRL^yZ*6u%%$1$_NSGe3U7TVvA9-0f23zfmu^N-ijIE&;Q8r%Q=n(e zJ0rVS18}RwkK})}D;T>)`wD;)^sJGUeo4)DEP#ryh7&C$d)MLb=<5^N%@2Cr_Wp;{ z@fBLXo1Z_fwP%?0oh?3>57?-eJNbyY(^{QR9Zk5FSZ_tXr^pY$e@t&61}djR<^N6@ z4D<=ee_W9o2hFib`QKh~ylKqLEBUrW(E7%Z25B$N_~e}U|y8Bh5tRX_4wjhPcE04+>Wy(UY? zs_O#mRc3uYO=`h1UR<wCy@lSG7lMEyGMGKb4IgB&Z(=rjX!N zf0gyk?t6YxtKlz@v-5nJL>U1P9rpKR!*f*8q8c*YTosw7;sf<39!$QpOm?1HRKOw6 zch?B#BT!hL26@6H`4@ca1_BQO@bde-uq;mykrIVI49r&{?V4J92K9#0)tV zlNAyLB{9gG#doqKk`$(TR)tzQ)s8V#f1htJwI4g_gTSXN=<>QFvMY#XY5-x?4&$5~ z68wSpyO9cVwa;#iC_AaHEKPNROt^pkM?-=x8cyAcO*JFiS=2w7Fr3DARo&Q}xfiE# zoKiHDkQQ%%w7k!1uik^0Dk_N!Eex5cAr!Zg%06_;gR|>milBGRzxgfyBCH3IrO`s|Q8x5&Bz$v#2 z0{UH8s#cYdv+-u&B_G$srJ3jK!f8c4uMbW`2&PWU9Uu}CK3SaF+M@*~*8;DFYy*M8w zobh9KboYJqdp8_zh=nG7G)@LY=hPjP$B=h@PH9Pl5jldLR@qN6nR0S0uq?&&M*3$5 z5@@5j;5r=4g>xbfJKX@wx#aUpz_*KJ$_vZUMI@{sz$DWgrf6An zzN0r-D=;Mec}Uh8V0<@4*243#=wAM2a!Oyte;Yp{Yfw@}=8O}Fhwq)^S*owb(_DP6 z|3pK9v&6)pgSLyvt#CYKf5mNq3y}Xn_nb9dJajvwzv+2SFWlMw{}IgW9bQG!yaUR< zcdpx9059C(1F#37HA$Ua2OHORXYMy7A0NiOhY0Gy>|t)^VeP`N+w43lCzmMHnVJnc zMd!M^jZ`6;RfjTWm$uIbx6OoDQsT0>75o$Dv15iaU^{yPd6e@?r5{R#4|y86qX zGk}tA=<^-kDrU>2FZ0$X>kK|a4KkDHul9m3GRO-?Fm()yi1brL!o)1(MVcn`8e59s zsBto{1fOoM{u2DlbI9?0xKx-!B#~!AaBj83ef; z&78xtL#v|ImJNSne6)eJioboY*m8>{h(=1IQ`2NR9JNkaH3gIFUlk=6t|x3No{d+< z*d>TcL}<53hG4vYus|2oN;DXg&oWq|`mfh#H!DPT-NdFif0dB>QIAUtCFZo;$eQ9b zsjf+68Gia1-H0Wvo6FRmWwSOyJa_|>9NA-~?5b;dGzhg!x5e7yC)ARYQ#b{^-br0f zWkReqCJW`RV;J6El$9fcEXWv-#Zre0$3|G^Pyp2A786TEX?gce>4T5wOQE4_Z;@FD zeXwK?B8wWGe{;$vBul%7PqL94^AhHYBWqc4`*ALZul#9uHeO>G-gbzi=yi_HY(hG= zs>J?~XV>*-GM-_4pGOQZzSWv-o#`sCcqLifGw>POpv=$U?4IL zbLT%-JS@lyD7-4o6t!t7VW~JvM}d`8X9WNIi0Hb$oMu{4vzkmxTO6>pJbo_(TnZMA zhb)r7f9gYE25cXe$=bxdSz-U{u9+qD0dw-Hrum-{U#@#7@BYMWj3XY0(&*~CFsJS3 z_@1wvuVjinu~rp)L!+J6bg4el6Fl3bVB%MNO%-*Pm$=JM-{Ab;L0YjKz8JY1ipoZ& zRb;LtOY?;M9|W1%KsoJf?)21QrliVK@`CHle@G9ur+Av{Em}$DD!&yIELPFYXa6BJ zuSq_H!l~HJT}}iy6!TG=7M!W&14XZ$FT}RGJn-w70V8q{d?O(y%jhCFqoO_S4=H@# z&xyu*cjXjcDFX$c(bwDW$9a_CRGtLo$tu`+o`LdL9Gwm$rijUFBD{>des8{r{XDCm zf2<)_pYO=;g%#R2lm9GtQQtmD<`4T`95bZeZA|d-$~#pvGFak0=&4Y@j}PbcVxIO( zFH36zHe+7jPtT|tKl!(qe+?Ftcb8h!=ZMfYg8rqqc8vo!3wswgyJ82&b;K+4Bi;nX z>a^^WIo2J#PR~l*PJ_rFKSP%?*-Kp&f9$64sx?#VjfphP=*?-L^E@F4`a*sq^42&# z`Nd3ed?dBPDePEN)c#dP}C9OQS&+!XD4@P^NEtlk_y z+7Wyeyj7?)`z*pg@}^4;yxD!sK#zlRHLt_xGKrRNF61f2oG1Jz4Xi@_W`0Wcy%7uBQ!75B zBK1X`eXR*(mcJc(CQL_ZB!_Iyy}pYmbRSmL>5*g^>iT`I?6--Z+o)Oi>S~O2uhB1P zt@ge2GGKf3Ps{h6w;Lxrf3v55w~cQOiv{^OSgUS$IcZ@_ znn>%Bjurz@2pq?(me5KCY(CN~c}j=DW|r(@GX2Bp!(aMDgQ7@^f3^FJUPrQe*RG=* z@n-Q-6KN^*pS!`yd)TX+G^uUf@Z)7Pk;RTvk zUrpRa>Obq47D`Hsf8Z^54_2zp0cL`3%jxEhs;O{*BfDbLTayle$Gc-+9Yj0YoqY^F z7L~`EUx)&;f)A_>0h!iiQi@}tjb?Q2pnq;RoC}}vIY)1Obp$TTteuqwEo=pnn7u&z z%z+OtY-L*~-}rRP@&J8LH$o~`l1aeh2fIAz33_dBr9&Q=e_kWMW%TE;{j_~Vwh@7M zFs51syO6-v*@T^4WZG_wC?E%XY>Ty43r5N?4{NWj9_?3|ZL@^g{u*YXyV zzEIT9iAYb4f65bT`UbgtufvTTM>or=u4k=hcvq1FWfWbU=My?^6oaQHV_IdH#VKhY z+RS?NL&A9YDG-f~EH{`aQc5Cp;l7{R1CyIlIH--iUW9o)RiJjAHx+MCxZKY9N#}of zN8D=)eK6;{ITbth^Cu1JPbk8xZ0oFZ+j*Ss4dd>qe_PyCkjg-!qLG}P;u}rPs}S|Z zZ_Os7rbi)Uj-kX9tZ{|3vac!NXenW5<2zU$QN9d+LLB5bgAz<|*;rOW9jPwmPG}cu zWdzXZ<-4fE15A{lOO+13Co7?-J>92(<4fZ#kHk3r?Tdv`-0i_}T%VQb#= zyOzG9x51|%RJI7kMm7#~~ zvAJOxz2}-1r^)z2XG^!i!uH@2NX3svxuwN!e_DnMra#QQm4#@Qw81N)a#dd_;%W{p zUqUK7TJ~dBU;5Du;XsuG*{JeSeTUGAqv<*d#S^hV0GwHKkF6zlLS7%EQ2bk#U|+49 zGKMuvw08b|fY9^vv*e+lG(o)X8*sK>?YJ&~ZhLKuPrj`WW~^OG*Nn4-kb&GmNC_OZ zfA$a?!1t_C<3sZy-fJtUne7!D5B@Il-0uIWDRXc>ryy~k+gi>tsq%>89QM1oGZwt0 zU-8^WEEL%>5_g6PGp?e-z{~G0L*XLcHI~mhY#>LxY+mLt&fStfZ@D zw~FXz)Cl(bo&N3VH8kS+4(8}_lSvkG3Rohk_9=U|&pMUf+@NxI)F3|JV8vNWabazl zfYDsVz3vxb!vJ_vNh5$e!~^&Uw%HSh2fxR(u3LO@MGjCyGVClA448}~0Klj6f8Wm3 z%ngJ=l;R7+7&CAIx#Q5sNO7Wic2F|jq-WM&8m45O`*1V>-J4?quD+blI0Kw*(gXJQ zW}8k=dt(EtNz%&6ApPp>R|bmaYy9$V0ZEjTcUFqO_Ok(E`qdYOtJ0?9r5?#F90Z%Y zc?#3dz!1njm^VTn*r&)#QHQ?Le?A>f$K**13#I|!@4N!lTX2( z0zk%tI~M~?33Un*moUWw&9X}M@{-K$GV=1KJ_=IwzES%z z{o{>VALn*B8?S93Ln6-suzF9+viH@{!kg z4=1uzYH-s8(wqdre#m`L&>$gREI#b4s1gS#s=DU-TjvDRXR9^;=MHi|`J5?75_{=5 z1YcgESuqUFn#2peJp`D43SI#sYnMx!O}c{w(&ucpL?ri}+E14COK#fH(eWr;FcPjE zKjD%qJD)XQ0m@}8P|D}(f3Is2hps&io@~)t8CFgT+Z3`hF@!%nsEL0U6m8`cs1dr= z7m$^q+jXF)22+0!OZ5ML0~Xn6=O76oSDP&@;0>#Zek~|JAJKjo7@w};F$lvkc~g4{ zIDP2h@J;v1>-XP9(NDWa`uHg}a9d|&vLCD>kmf**m4d1ob=KgE@B!V`7#V({ zuDg6Y`({MK-Sppx++;A#N1V@9u=i3kb{18AIc^y*Jh0A^&wMVbhOZu+5C5I`UagEl z%tg5$2l9Uw1OoTre+VIVo#UZyIa92Agz>eRJ}p$+*7JwdR)B0;Bi{F; z0m089oVJStCP5Fj1P)Ih3Ej>D1VlEZ+_`10fo6`VzPF*i_^mtJr{hw(c~uv8FVN6XUTse-M>DNyPdf01)8(LIYf2#nUjO~t^s z!0-GF-a?PLaOQ+uZ+G+E7>)ZU33jXA@;l4v3IL5WhoKyexg^wTjQ_~cNiEWtnC%_B zh0sc1$tzkO+i7*`mdHq=?%SF`@V+HmcVE!c^K;Mh90M%jZOmtADlZ~w9q}noa6Bq6 zFw`6ILs%d#e+S4(fZuunJm8t`*I(~FrQi7|4Qp{u#`gQN>7Xe#>&k7N^1%{S(FPKS zRju!Z0m6`JuCnZwaAbxP{sg6i?n$l~YP>f){#;9qp3Ol#IHo2Wo6sD{{wU z@$DcRpG^xJe1*JJtEvII?(vdKzS>(9woUSsb%6!F;B%|utrP6Ds`f?S#QlNn;5j_y91 z!*`|gxngs0Jkj70tY@W(Y!%(wHN`k#CteNX=p7mH#Pn5Kh-j>e?Sr< z^?m^Ffdco43NC@ALV`YJLL~l}m`EnB|B8Q-10$9~gNiS5fYo*+)QIazLjT{`JTSJM zfP%TsFD&GHxBg7l0|ELp)+d$(a@1foID{y~%9BkC#waO~Ac1SYyE2|OX`BMyEpG#1 zDUQ)WH827Vn(F^zD<}$KZ(B}Qe{vB_1c&!^HBz1cm{&|IE9khMdnN;<)#9DJ(q}R#lYuZ) z`ME+$hhbvEfmGF6$u#b5HA6p`QoBfyNe+;59E(s@@F1 zE4i=O=$hvCc$sf@Z~_&e#`!e?3-n8WH?vb*K}}Y3dSjY~7*t_pBiFgaLU*G{CntMd zGp&wQE2p>T>{zIY8P2~Wdb}tTRVfmC*h&QURu^D zT_U8eCOBHqF#AE{ucMWEE$@;w@C%$0hUE4@mE$f(Yd!4?l{n7TSMEeNT2!oFR8D7t ziJgec3QR%Frfh6?BMS9U%7P{aA=}B!rF;+chfYYTett>isohJ*f9gB@ry)!fLZR+a&6!e`p@lUn3{wc98(b|e)%4OqibLo_ z=`}?Cn1NvX{G6Do%6f0r_Bp*70d{jww!vQvi_VNFC5C0^%tE%eIc);plOzn*ze~LW z1Z^-MUBX**7Qpx}e?)5-k<%Ixvq3W*WlV_LHuDz4YyTAhlVf1x=lK#^#V4WFlXw>J zL!4;u=M!-iw~pO*yZ)#f72A})#6~V0*z1Wg7+^P1zt)eCp5D3y?uFF*j}Aej(s2b{ zkhQ|Dh=T>8_s?f*Y}8FQ>Q1e>|CKDE)g^eU~2%$mhu?krT!mMRy{u!`u5|Ng1e9N$0P5u>$|Ug~u%EIbnXL3SS0afSKU z{xDq2FTDE3e^!7pTzq|jFPM&gdNkQ+{zZm$tHg_p@1f%4h{n2Jpiw^3WpSne@33)`{^*t-F!yB;lW%{#W#eh zHK}pz#S5$}=Np1}7X1J7@lpY?dRgI_5=lm7!d*!DAGx4bB6s!N%ORtAPK{_pDzSjR z8q5beZN}&et!;<%?k}E;ApsY@R6|PKbB&#ZaX|xnX!h=Q#|miWWQ=h*g@6F>{s41) zF+|P#e_Bo7KM?rC5+CZ-fw|cx(wo3)Wd9vOacuIS)R4Ult7QMlHy3=;H9rr4OpE~c zo>egoYn1uj=yVvtmKC*&u-`)zmsk@7zszO4+c;!z+_y_&|D?n7A@8uHw%C>ggMA1} zj=;M6s{iV2f!++3STF9_;ss%j>(~HS%9ptoe-)bY^&*ZtF|VPU#ulvf2DGF)@rmW} z%IHK4{qYs}K;9k- z!(tU1ZR1ASXC*;3fsm`pRdG ze-DYCYq$|Og2O=~;AE0xZ7~-8VVJU|2}^*~FBVoHevnH4zRUfxZ>N~Y^aFAo;ZK4r zZ)({If1^1P@<=ngNvq7rG?#`$p&4GL5 zb|8iCy})mZV@6lrMNqiZ60hr_rd%pFe_~!Gx}=~NDYSE)=FMY{N(S+-z5t=n_KIos zi3=3$X@BN5|KpKJ-ugH_<-7CHtaP{=hI>#W8=JQf zN^Raq1jYv)&ifw^MJ{OV)lw{SVQ2_nG%GK!83l#?Gtj15bPBCDr4qQ*f975X*q@VH z&>IqfSsM%j<=c>EI4NymGE;HBtGYeh0+DOz%_6!Y_vFD2>pkuBUlEulqoBHt+|^)* zXYViO+Q|v!Xx-<_{L%bU94W!_a&StBRbflY&Nfv&>dbMI{}#ZCrbsB3=}N;K>D>9C zQQ9kaAedKK%47SY=V?0{M@YWl`Zw?9uW($XOr$!!2V?T`ea(OQl5fhR~SB^#G> zFUNnTK$5CiIVEI?0ej3n(MLHmYi#o|>lIiO*Bgm~jJ#VG7MlT^mH7V0KaQ^tyzXxF zo!s*T!(wSuQlWFt$7}}CUpczPAG^?lUxoS47-`If4`Km4pK{c!bM~s zi-1k*`AeyYtZ4(n{-2jb4Zm}O7+|O#9lsfC#CDTie8M|^6`3uF z{ipT#Mc_-=e{i~8bBVG{uxTi)Cdi&cuhc%#_u?2Vx{rO$b4){UTAImT^ofd3dF%0m z{j!m1O5i4v|ItYi5PD~4R<@_~5RSnBl`V@|d!YT}FjNVoU6{^7&gVqXU<~)n8i+mn zzczw#70hc!vpckiJfSo(sdg4eV$Hm$;VW@%bg0TSe{wKFH+4s;r~P#;lg$WoL1qjl zBH_3$*#$!3k=jt?4VFeJ<`mq9bA#K)S?+=1$MWGc$76;|SOV-WZQ6&Yg7|5wzsN@3+ zp^!xAe@mGo^71%Yjv-nRIy(YsJVM0d&tAf9XPUp@AEYpX;l+$X9P6gm}0RSZQ&; zEqM1yMfqVtgD#u5fKOGhkLZ6UzCd5%7UnT8WUE(+$R8hcDpEFoIomnY@O$dUo1)3* zv}IlL(p+-NU{GHHA$;*6 zGWM}k;=&2^Y<)7j%|kcg$zh48Qbtf#T;5fvOnc1zc6c!}+<3|M{#Eurm+3b$m&=7; zAC81T@Nkb%D~EGzrwd==17iCd`KvB^Y%StJDB2(OKj=cb;EiG+w&+p+JpAzGci_}|n zWEE~^rCw%NikjDg*&Qdn0VaBR?7c)`#+Q4PWM)7%X;>+L6mon3Dcs`2-;G4Df9nf4 z()k#&o@CA=(78_+Uyxl)B1=k!+|^A#htGkmURR?rDvvY}2@Q%zgGh~IR9`KO*9cxY z-2c;Q{>jl`Hkqa@dz-?_Eb3SLmiabawfx4_;+4cf3&}`T%`ZaJe@(dy@Wb@Q6v9w} zi->@W6EWYCK@C|iMrGajclzwrXEgVEQhO-$^xwbfR%rvrPJ3&Szmez26kc5W3I zA*YHo*J3E}M#8^&a(w9EdsEn;C@fxzKw8xS(-}AoY~Z4LoJFkr7t`mae*_&b?yzzuNXw(UXVc^(R-*!x%?UCGUj9n}bx4&}`!Os2H4%_C(p zdnKJB3i-;JiD$0dHOqile_}1D?oz|(fXz8?BdNZN{iBO#gjh)3Kli)*&k~P6A)IrF z{~|HuM0*$6oyM`~aXtMFH}~QQw=vb(0cUj2g!UA{;(6A4 zy=He0%Ji;izeyd^I(^U-e(f7KEqqiMN-0%UAO zMnG@M1A)2I;6spE-{}>@1%q|v+TCDJJX<1NQs5|w0h}7iX(w*Q1;Kz*e`2TQ3hSz8 zt439s3ZeDumw;L`!y;;@Wb$aG|{!klVsX;bO1&+jWUKg61P2z{V9NsZjzdW-5uamu zG*2`J{@Ml8e9zJ9_@QuMe$sET#4o~fNE4{%EA(-Lp^n9mf3aRaA|i8o*Nxvlw;fA` zpYx-bLA0fusXvtCk9Ub1nj)xu_0kTMc0Ch``9SC#9|c18mu{5r)=Fzj@)u-0WXZ_D zAm@b|^J8}x5;eD+mt?7CbVX#z8^zE#w+<(o!4G%GiLl!Yv)JicFIF9H>;5?bCL(x> zl4Y+0_zf?wf908wKb!Ak12BuN4WvMO^6wTA(Ii~s^4>63)Op2#D#-gmPwN6(egZoX zuGmTZGN8d@6pqJ+^TIzp0*qm|XC06~JuRCq0e~X@F3jGaaShWdY z9u#`SIfnyZ9CKM|GK7RWR-%p?LJoR9P%{?G6A7bAe}N5!nNwf-Pkc#~yT=QHs;Nk)GaS6u=mFSKq^wg-i@j z|8>J$E*8W2eC?-m_9DKoNSD!(hXKgUSuHv0YRhNb-L7fe)~}DE)I%oJO^0=fTMDPJ zE&^CJ_UmWo_XAI0v{zy4bzQ+MuE#}vs4A;If0reLK`y11=|gj+|Bi?f?Cq7aMtkgW zR8xEW6GfTtV3FyCYPdIU0U*^${+w0KSRPjvZK)7pT}i4SQuGG~Y~{ch#-A^<(*?HM z6EtQbVWKmCj26s|wnD8pkzjI;&3&_o`AO)++~EZIYaO}&n0)3R5xuw|?W_qU1(I#m ze`w8U9lIvn`%kDNB4H99!7LTI^)z)P?+_DwI~pyxWG8*3>xm0`2y5x9k#V4V9n0pX zvu^u~NJlR)06ePk%w74ppY98n_8t4m_NVD*0fzC0mp}qy_b6@Oi7Jlax{toPlSJ!i z-l+zW9io-*J}X-$098P$zbY%l4R+oC?OWC~TYokRWNMeuQRizE1y`8W8R|?W;!{-v zDI&OFgZJ0M6WLi2(Pon6tU~#S*|__fSpJ?iJbL^m)`{TZ)IE4JLvPc4JX}>g+B_p@ zgilkOi6~B994@w2)dJ{f~-hC<~HXA#I&T*TFd|%6~fZHkIP<_COuUv{|CQ}Zz zCV%*7_$8Ych+;H$DM^@?jOCn;8vpBXG$2F$BCP4)zJ@)E$B1Nsx%YD;=L+Y{88`pR zdMo~0(Zl#MR2Y{vk_8oUBmTnY9T}?25B89}&1vvcku!SouPgo=mVFxQ|1eWBrGx9I zSU}Z!Xp!Wm2)hLsM}YF;$Ka5wtd)1VZGU*apB^>ih%ym3dwUYbEex%S9fYd6h=CpB zEzlf~#%BQ?rT#Hcg=`#Nw|6G#vA8rIUT@uZN^V)=piOwJL3g)yi5{G>mX<*YeSnv# zN%mEVA7JqU21s(7f{5abI}z054UdjmgK7)5 z+FNMPPcR4R|81W#B@-~pON%q8{Oe4{No*79PkrUZK;o*t;UO^IOP6k3ID98+ejwd= zI8U1c#Sky3hXYu7nT>T+0`17+VBJSL!5J+T;y?`=z5VEqo%Vq~wsEEj%FCDa$|dUk ztZo}KwJuw>`lJ~Mm{;+J-P0;$2Y-HTDvg~;C1}FSF`cngrC-FzS(Nlz6=m_l7Ao+= z31c5s9y8t$Ir8(elR1-Mr6om5vH9nI&VjvwXeeXOQc8o()st>a0S^Rb7c=2g!r#*E zw_vE>c!6t&yRb7yi|}UgfVi{ytBg{lKYXZkYpQE>HVjg4Ea+9n_Y?qB(0@a#w0d9G z52d{x)PJpwmX>1`9+_ge%)3~SjFs2X+*dcq?~WZ8?A_w3i#()H+T>zDJ@Dg3PO%1h zXMe%SMEOL4>%ws09tlg3Pw%dFR&97tN?9D<(5qJ!=&=~V6HN-pgzmH7-$u?;m&>CB z(^!V(QVE3g5gXX!Hb~&9R)0uz-6}LKB3pH;t>i(M7(Gkx8RKm9%Yz(#LyYp_dK!oG zzO;QN;{{=fR{BQT$JD4+96-3tTdCoj}Pw^=aim zf;nBYby-D05R%Zr_0K#_XuFz2*s-JOs)`@-jyop)cpWqX4b8n)`$uzX7h&hk@I8z8 zK@Tnu(ebiUC(GxevwsyPB0^>)GpFky0fT=An6BkseEqCR_g3_dHG9{tl!=df7+`>? z<#a?g&9&)vLJA{Kg@-;|I&&|=D?z~M(g{0ql0N3d*u6JP)8%~jiA36xOGk#J*Tpz< zC6?oAoM8`ZLQqMK=ivv%>o|BW7Pzs9-|!5`pJ#5CW^uyA{(q;D*LU=sXl5fN5P`s` z*@zDeLp=LPTX%JvLx;rPi%ooTy@8cruFCA+GHo3ON6wyb8;IsDToUXouzxB{oLQet z0i;EoZ6!!V2YER!<)`*K%yyRvbhhO8p}Ex%hM)6_I5;CgG|r$C5E4=;znmjO7O{_) z=M+6Ryqh1({(tM0GJ&?V>MEM}Bt+|Phzg>Du0u3}y)Q3_vEOH+{bmvKW;s4k-V$;` z;8a=u$k@b3Ek`DP$o^@{sIF+I_R^mKk{p|{lDk00{RU8lK$zZqF1YTvU%qY?m07Ka@$o>x_aU>dJ zFcwD=Jh8E!J%=l6PZ$>Y97;qLDuuN4#lX}4D~hixjAnJ-j}h}a7qkq`jpBJDNAHC= z$i1LVkAJ7gj+r8Q47(QYsZ*%(ISOECGEKi>SU(9)eJEd4(~!935lFLR!14I;4^D0$ zjB1&u*$nG07I~#puoHhJIxwtsSowOP1%U?E|M;9g&3#dcEA;P(^u^a;^E9O6&dXnS zkyh-0{n2ClYTKeC{ot-7HUjYN!(w5> z;h9*is9sE$UxLJGbPM3Pz9#2q(Dm-vZAd}9PD=@&NUAkD^Fd<|pUP%6Djt(@%W{-Y zqJO%WTd4E`(bhejmsZF+C9!9ARBZXH)l6V^FFLN z9lp;~kZls1%S&imE~5`m*3YG2>ntP~5YGZvi7pNB@%#VK00h75YQkr0?EJ0i9mh)t zbrTmDg7emn-1}=Tp2^_Y;;CQ6c7K`67x~Ao)_?-dT^@C6=8N41!2n=k<{8!Y3`rFV zq?MJ>wVmE+pYTpV_~8a&OFv#+(g-4Du)4~6yHc4lM9cU?i+aQg+QyXdJ% z;X;e5%d6#@6p6lqLfX{N6n|K-#_=4S z*QFk%Cg^#`n1D!h7q={H3noeBz3>c1-%eALb)wrYIum$y999EMZHk(AZyn}oPSLf5 z5+J9M!rmO z|1H7SjCIJ6$ErhtXp0S`!+%cZzxgn z9G`r@j4d16)!A}Da3zZ|GJcZY8tIuP=~w0H)OZds7GT8jt8j2a+kdS^E3p~UWGISG zd9hAXy=J~Ut|Zs(&sRPISZazJ`jKx%V+Y5joqiw&Zs2h7*iCGL77A+Gmw+Ba=$3?0 zmiRO@dAIcJ=mshbu%E}$Y|^=H&5&y&7X>N9zP4xPq1h8=a>QT(e~UFV21%vbkohTY zdT7K)MFkG~{D2}vyMKunZ$q$YYYq3KNuIMr64FS#_?U3*T)P*{rOwBz1ZqC;NakUd zZ&laCB}q~P=CnZf-wAKjuaL}|AmBpJuhVj_b~ zIxS+&OPpoAZ=vtBNYtN9`A5w(6`qb`)xg%%?kweT(+1>jw;{9l)d5X~%EyTW-lB&Q zsaAs1)WdaYt$$w?Ti7HCy4n^wpz6-mojsRFii$*C=^~=&)kJ|G=u{A%1%fWK&LP8% zHn0Vhff|{3XOSSkIU#81BNZM+*Zk=r=R;>CpkLcq=^?_#PM^GOj$E+1?tVjh66}+2 zs^i^#HyQ6hd@=m5xk?T5goHz>$7-}Kz$~Ab6)+Hyt$z}-p~!H13<>!Po1N_p(o;Sx zUzGc;>Bk$LqzkNq&Ts96qtAlaavh8n4h5Ch}K0n(4ixABJITN;!mXO z(QkaPPJcxEloI{eof}(T-x1vJ3UigFb(oAzsXO)~@(x~5f_L9ygu2_T>GVRv2P7fI zV`_idx)>`kftVz^X1%yxA)x)s`=zmtxioV55qjJ#&t<%7fO4SaCg1U#_x{aM!v*2# zRCjFxKp^@=x>06YU0hh)%Q*?hQ1vA-TK7jNxtl==<|{^WZ=*@EO3JkVh{GzWrce*YIu-_8OCO0~lhzsTS^ zU4N@&+#DB3+Ug)z^j*oDbdtQ*KoNb!dV5}+J#XV*=Y zpjQ}aZT0)4^Db^q5cO3omqOp^cv$Qk!FOa8QIs#p>=egV;e#wI(mnA+)>BxLUHZG} z03+WwZ#E@MaR~hXmY#TouM}jdQL^vbeSaa`h^FMPWA=04qbB(5kn7#;3Nh3*MSXv@MhhEfseDZ)GIk_Y$TEzUSCx=v5^O$dVmg?h? z%|g$;GEy~NdQx1HI0TRQh%rj3O9J6x;D^l1`Jr+T842@cPZ#LZk%>h^njHziw!(n9 zbgW5`AW!IjA^AJFgfrX?`zLUOet+=TbZ1NL2>IYXJ(J;pJsXCdtzLR?j|%?1lH`-> z!(}vP{+e8uh=v~QPi2ug>zMVQ0y;xvZ41es(gEcZpl$mZbrNknnaiL2Yh@gjbZ?;T zvbK(^BrWmv)o3`1J>kXuM~o_~RJJZmI} zfMij#3k*zYSv{P)vnKPjb^X5uv`u}rw@_5FTIIiY;C&kCWs?&qETvL9p3hFNKfDIS zv(IY^Ur~ClKPQ)}DTE$_m+2dFEb}`xzZykhOs8^>&YBj7#WR3U;5LBfb^4yU*1Oz? zMLP|&%BgP)T0I%N-J=HZr+?7S-Ib~aOU95(4)0SSXfn^@TV4wsa*I&bbGb}`xfkF@ zp!*^evD@{SOrnEa=U__HAG;*zoEaDZ*wMsQ66a9#AvW&Hb$`887Llg46tM0r zIOqh>TNWzqMFix6S);DvER$Z<^^h_g9!3I-Jk3VvyATBsK>hg@Qk|lQ=H1prheM-o_Az zWWA!iJrDzl`~Po}RDZitvf~q^nYfgF2%nK8VA}cn0gB}8Bvui~V!A$<)2S#ek~FBe zW@j2X)ll**Ay|(wv%JiB$$VwaZGHp%u6;&9!i>#I>Tx10$6L(NFh{LMixJD6rAr;{ zte`%Q<%XUzHztIk{>4@*@~-+yeR>;q*%Evzaga?Yc( zVjGL12DGy);=mE%6ftNROLhgOI%^CO(+cXV9pV+Vs-xylB-xr{9iw3G?*0DN0$1mw z_bSj8smX|C4vzc+I+_xxl)rlvPrlC@?xD~owsWvxx0_7iYW6*nhnRGftKW7|r$@SV zgj7Mt?qehorhfvZ)vrgeEbz4I=_YB_)v!VrL?^L<2f0B0pF-)NcOyMmj!T#OX-}Ay3OMwS`l#D4Bs4(W2Fw*py!wU|GQa%-0)v*#v^o z{I${kcYoY2LW)2qv`*RW?;Xpq>>q+*yeSy_Z>#sdADK`qE@zvfhwO*?wjpNZUw<5p z(Xb$rj~qtN6?gf9S9F%?*1z3aLQ+nzJxZYV-RIXR_^dy6?#zMP@x-s+VMK=eVp<|R zr5Me2v8A#$nov^*{9Q67PBZ5HlB~q@ZRIKEeSb9i9X?RYl~_v6vnalCGG9!zlxNP; zK4PikA%t(981u+cVMR6Y-^Qk}fx4hMLLVy3U<0WGb8t14%{_{6kX~)XWqvBi#$(9* zBy+>VPLKBMnN_n=`k6Uhq}BR*s!tX1iF8wZ`QV$zwHZbEf&JrJuN~;fa583%S{84yujjE|8Iei>pIJ8g-G zxS{2}W-FrMOkTNa694GXdO$8vY>`eqMJn=G`vNv1V~RZ!t1%p=8mMT|0OC z790w;IBGG_Sa2sLDE6gcKRwON2l;0n;s9n)?Loj1%Tnt2V|qI`-*VSU<>359m46a| z6}dN{Iji)jj?$G!rn^&#!E+KdW?=;38&xWwXT+LrC2L*wyX3-ymEUG6oFhMKACs}I z)kv1cU)2`0d&wYkBNbfOd~fbu;#~@888SgfVpUZu=%cB5l28+%F7@@@jx$&oH8jEC z8cHB=@BBZu<4+O4p_uTcsAU0t!+$h^3m=86=)JGl@nQqgq{hy#cC7vcGg53;dsjML z&#qqMfn{_|WluZ}Y$s38jA3weVa6+d_51y?gy6~TA!PMVTjkF;txm*A+D!V|J2Z3l z|3;fGAhf4gfy{55cn7l2?NH%W?XzEGmDdL|$$Da`?G{s`w!{H?hks{6=sl7~t)t~u zDe@o8K2rhy?5SIuU*DU*th?3}Ky??73B)ckJ)|KIw;GMEx$1FbH(o3*i}2$nTW%j) zF#P(5Sh4}8eAZalGo=zgn@!j)-{C(){>otYgeEw^bO@?#;GrU&`z$|GOJCJj)^SiF z9bPiR!u=YQg=cWxR*-?D?9I~h^RVC@YlYpDwr?0;Z1Up6DbDhdxQpr78R!i$GUni%ps$T^RKED53)L#Q8-<8-Uh9JWddl0uy4zv2i>@K|2>>d z$~tE2B7YRN6hK1nTfL{>EVaQq_Q7v!9oqZ^s4gQ;g#1`ixWz2R^cEoJ!G20zM#dxq z?`+>z{SDeu+a0vNT8E8 zoAcj~|A-IkL3>KL+UyTe9XwZJ4RlTX=?D&{<^iE5_?vuSXu)lRK-0To!0ZHdJDhdf zUVr)NFj)eMK#&Agbt++PtQFA`#~pViFa}eRp%eWC&T4-dD*tz*uRVP&8jwjxfFFyv zpBQehd4$LMad_8ertA!|L5`@t+nB@M7=U^7BWY)q#EQwUIfKGpaH3|z<<-2yi*mmN zyCl%+fODCrD&8Nz$S}oEZ&YKj27v+`a({=a3*F|{P|UX;C(22{G3DIVZta_+(k#yX zZT|kB?gv>kBkhbTI`(HCpMmZAucP!YsS;mved;CM<;VNipLGlnun%C3R z&Qwq#w*hBOxh{)FIv$oN`^+!ov1dEJmi%3#P?P*W>_(Bd0)B|kGNRh2J=P=Bv45ci zhGxM+A?Q`pd{OKvPD14_5b2B#syZMuMweeUv%Uw3mr=J>wCEu!A6zAr=ILlXI;@cNNudyf{= zCYXaNaRc8IrUC%Op+c(>x!OWpZ+{x9yPW$nfj2SajD2bh#IZezFS~Db=NaeZyM^-; zIRbJkDV1oxbUAn+r)|yvgbmWx|2^pPax0_ylRIfFmd6;j8UT7rwJ&p!yrwDxtC1|} zDWoKB!{~5SiR$E%r@o>$KfE}IPK;}zujaS zs|xst{F_{5>`(BeHW6L&I%7t&Sd-B(3YTCIt>D!xy6ouXdT~PNi6eR5AkTm(UvcWV z<$y-S0G>e{1AbWr+Bd(|@@m?s(|d$>lqRGOwlHzd-B!{ZC#i3?_2fpM1kC@OM+I zJlKf~0-~}wr?%d=kHOAudrsjc^}#qZ1XGF)xpT1|$P$}8tsGDu5_?}}2;0|h&NmgE zwH7ACTIkt&Zr1`?q(5gOIDXe9>zQzTKmIF4OMJx8dA!F8Kr_pZOMjos6E+dHhoJq9 zt-6f5xD=DwVj8IG*Wahvn9GbiYWlPi|1M*~uMxvp&O_x-dGWw|7Ej_+-NcoeLmR{O3o( z+>>r~c8q3danW2*QGee&QKROSz!BV@K#$L#xp3DHfYrgF*&z%-$z279jf+z(Q4(w22Z;`^f{hxKYGFuqEoj1`Q!7WgD8;=OmQ^D!5Rd#`C?&%%HqL(bNZ?VfiaE}L;S%00Oz7gS_n`Fy{?m{^&eQjD z0!B|-04Ma4nSW;I$e2!HkC61nz$K=#2eFo%l7Cbk_C4zfcE<|s3UhvIJBzyPL@|oB zp+Q^7k2NTHc^@ZQ9aBny1uY(&fZiChi6*0GEqi>4KX}fQP-_|tY>wo*x z$cIrH<=m~v*ljq9jH~>BVE{o>dDBU>B+Whl+U3ts(0{uwyN#H4Zur;nlQV-$XEo#1 zYpm^7wtZAJpN%N3MQO3|Y7DQO0*D`wsZnj6Bg+*|p#r z;}OcP{)&Tf^tSpL2Z?xfUfs$eLe9q6eVk_!w*Ux56b-h0CR_G*u@KBiss_-)UOY-e zusUyeqDg&?3K*yp?d8r_A>xONT=0cWthfJ0k@-3D0^p86Kd1d1w|Trcc*}j1&c`h>&OVy&#_U@Xf*G6(vQ@ z-YpMDzZ;2H%3VK3{HITimkmQRN|Z>prJAQ#KC$ zeuAeon}+}n+&4`! z`{m59z~K0q(V)A~vH1~EbL)9&UJu2r^jL5df1ty767?@xd{K*u(5h1t585FHl}OVt z*UDF>hSeffOO~b5qbDl}iYq8-2uA+*Y^6Tdyebl)uPqoCfqkgsrHY&iG!#Carhg(; zIqyPqf*~q&#ea!8!pxo7F1MH@-ySBDFPNJ;X2LJCuL5xlT;_<=C`ETLd`6mPu*!y+ zDgGWIzG-`DjQPjJlzOf7X8VD+(e}x$q=9beQ3K6oG+7lN^wQLD!tJj*S-0yjLP_Yf zvO?_u!%JzfxwB@s6}*mY4RZ7+Z+}5M=_IO|ec}HRRFa%to2+VrLpi;UEybcvUDQ&} zFC17$0XD!@2*~+ZDj!dJ2lHlZKk>_{7lbayg4me=`o&|=G`T*wChtAdC*=mGtd%W{ zRG{>|*SJyZL=-*acQaRQ*#Z{P7R%<+szujMAY!l^qQ3kAag=lv*x zJBbAyjZ><6^RaE{pQ-Bc$jwDrJ+Rfsjv9!c>B&#S7J#Z^%T1>!3 zLQ~JFDxTl0zziNxsKe087~78~42$WiCdLr{6D(-u&InUzE>a8&7bh7a-pZoanm1F^ zY&K$iA$zS*L&S69+-plNseTGTSB*uR>PI|rxElXZZM#3fQ$8tC41XA`73_}BSItOy z_xP{+tMTXlLfvpw)gWGtS4^q6)H(raEg5e$Vb0V3$H?a%H;VLPwe~I#lcfw471UmnTZbUEBEFz zgbUeKHERVHqm^UPrhg3k!5|{}A`iY!X8Nc62nsAG99njQ1T=+GLE0@3MuGrw;k|*_ zNCGmgUD+!D2AqqcZ-UXd0?6JE!SYR|RA`G3y_5(g|NhCxcsZ7a9Be7Fh^n)Zy+YNn zq1D!c>$J=E$DysED2pVeK_LB&?_IWgas)FRt@f(niZgLdnSY>VC%DRy9nz1!GO4$m zALz(f9s*=e03pesY3s|*VySK1-gLn#nj?!}1#q*dSuWKmzrNTdMF6-AFJh=vbV)E2 za53+(k}dC4Ye5#G>8V1N@~JZ52Mf{T6BCO#|DP^*5ZB1DG*)oXL4-mkhavSWohBkF zk%_o`WMITywtt4sjY43%*HO;M{zK6r?UzY-D@?*FCM*;N;2c{1f!Ebdvyg~z7G+JF zYHR_;eHTUdbHAejhaznD*##agUqMyxfY z|JHp>eV#32jB(}%N+Gu;8w5emiE!caelq+sT$<5faLc_b{{`;s2DKuT(5+`^o@7!{ z1h)geRqkc;rFxgGEx?wq8Y>_w7$S}MlGkWK^5wjHG7ywFK@~6FkD0kg_5a49zNtwj zb(I_6qJMF5)*(NkxCCzEw+P5oRa0o|;!yBv+TK+;$aFDmIO& z+`9AipvX}wpzL)&k;Sl)?Yp`*xc(lDccN~EeSa&YlrvB`_n`dZ=gk6CY2f+P9jTYM z6{E&wB-4{7gnhN16(6uf-`T^0os>qUAsvbAo}WGU7wxJ_-_u7KF`kk?X^SMDHnbI( zZpC4$K6}DG(vu=b_gvXcC+fHg!9aGVD|MvqC|p@4oAlo;ch6_l4BIN$8mn$dzmEq) zTz^*9r&DWpiUTjzCHU27`qh+PSvrXK$rIf{ysNahA8^0SF@Y?Zy}7b__&5zx7O4B{ zqmJ;LlQ*bbrlyZAAR6d#Tq3F!<7ni08M@YmxP0>^Eof~1;_6Pl8(6BX&#QwTfUrT* zJ#>xVo{c>|_B7?A3ZIE%8m3RCQ!+iKntu?dQe@CxM8wN+m`R}A=gvqgCo(}@xNRUq zWlDBS1N)?+-Kx%mPZw)6`N#g|PJO;C@s##yu$Rhr&be$sD@MgQibk8-bx(GGs3owNV8{#|#T=Sp4NRn${uR%5~}!UPA4_ zjUzno`H);K8_WL~ErnD-w*Zht@6(Xx#+E1fV34XR+>znDGR7Ij`OBN1vMhD!GN zvk1fmcr2H1N=m9zC?k8ydAFleIYJZGl88-sheX{3Zr(3(a}}*=h>=5+nP5(_EtqoY-aQ6?s$evmTtN%&A;PxnGZqvh{)U4O_reB?iE z|0J$W9xddnKKr3oFwmtn!GMV9|qO zP;Jf`cy5@&qCN7~z;y~00_@u`kef{0~C`-cYBmb%>Y4uSUTgDDO_ni3!V}HK%Y=m`zpq!kg zFvl~Pq8(>Cq(G1O=dt0jU44L0O`+!|JG2HHBPZv5r4Ijy@%48acMnmaMKNkVgr@{Y zaWl)jgZ2}TLHJUVZykt$duC@^1$-us%M*D5^5Z)yA=CrVfHY3d5oL8c2~Lpe>J?x2 z$91Q$tK$0T#T?TPF8tt|myeo3-7*JrGCuksO6lM%}o zu^usWaEwkqWm(H$oYVAwpsLi5P+Om*lj`~x+e$8svAG;my(o4A9X{zXKeBn;R0Z@$ zF&=kKKkwhA3fW>tC?R!B>8n}w0e}HvBqoK9yf6gG{*2@%I)9ri{Rh3vzNDg=>Nwai zjf*a!2hz$du((>ppx3G=19*8Rg$^DG^;Ve2RHEV5+qX^m`<;%BX;sVWhu?c5V9(w{ z&OTp#nC#pW(Qan@gNBdK!@1(xbO*ZJrjNPU;w-XLPZVjXP9>4ibTJK(P_0UAWA)RvdsHoZp;eS4PD{eQ;Z1ezoYem59dRG%3 znm{r~B8Orlg14qIYhJQ9DMnl%pV?Yrtuk5k#dA@tH*i4{_b?37=={nS8>K2F$0+8~ z40z77am-(r_hKJ=Qpkys-DJk0km3hvpn8JQ4?Q#x&cd?M%fHo~xpxB*#pB-g67?c( z$9RP*-hVR;b5T+PNDaoUJR|vuIYm0^C4ZLl<%`m;_=N8>r50m zI(&G2@?_u6sP8a@XF^u+eo);de9Jz#5piC*Rcv`~2F+W7IrPJR6` zeKS@T?DG~u$}9?n*+8@8LY})k3-|D>Z~~;jqOoaXYo5*!Yi1|oQlJU$WyA*XBxeuF z!YIF%7_-YatWNefr%_gV{2}fsT4VSEMm4jy8;F;D?3{4EVt93{yQAHxV;mcly~xNp z%6~;gIro&;kI!q(msHFY-xE2w#bFvhxVBZ47@(K~VHV&g1zHQxXZ!4EIIczwfDW_4 zTDYMP9e5#}sKu|&Fu5)M^FX6Rlw3O!ntNgAOF+XBn`!*qDWpW71H^6WCTdfVQE!M@ z5Ue1fIe_vrgnyKCm_z?ilc%8mLc-BTl7GNp_*_{g%V-6m)7%S1Rrsqt@te(!8-`EN zG)kNLlMC&~>au_osA+L+?(`IC>mK(P6&cYvNJEpo;U+=VRb&P(cRwaQdOZP9R&7zG z@qAiiqKD@VXgURb0tUpZ+Zu?QLzRP67GbgERt53C9zRCZ)3lue>Gi0FUI4BTxPNo} z{q=f~HcL;cR!9-AhLX(Z{S#~>c0>p4rK~Z0%%0|x@$57-NZ?fXU;|1yfn$L3uw5N! zx#}S1c3{n4K8a|xgG4DRjqZRYnYN^g9+LIiznNcAljWi+A6D!VUbXODt}dpnl9kD zr-ux5xn<*0xl(z*V^8ou*o(oAm`YN06)dzOB2JT9jCk zR{DYg-7Q15`l3CsIgBC=2wn@{99x*dc6mr}b24b^wcA8}v;3Yx=GBzOq&$_gxBDA< zUGX7ZCVx8e@`8v*g&_f$rGLiKlY?C|70+Pex!&PonT(Mkhyxl4&x+1&3E~McZRz22 zf*5yiTrL`R(62ldBX|Z?zO!Z-6xJ^EH^1*9?u$R3N+2M_XRb!j9O~uAE}56bwWAY0 zIGfyoD8H216M+q=9_PnCE*#4dP5{$0u;S5boYP|3_G*Q5R_#|Bz8ZH-fRcyCy#m>#Hdo8Am`gj+P?|-}R+E`5 zL)h~nCL`{=G}*!&r)lF|ZqA%fc<{k^d0qA-AI(Jn^rvn@e^bx+;a~dc-Al)?aTOIb zQFl6Kl7&H6dkr=kcV|o=QA^v}fUS;!k@hNj*rAgQ2!9%;+jevL2$v|hYOPW%)?!&{ zC&1qc5r}S`fC39*wf65?r?88={9|mYBvXLVO+zNO8Exub{haxEfzTdtWbLqxI5?q% zW#P$AUX8-oK#*;l+t<>)PZteunLFbPVlHF)IsbK>WR&&Dpw{%n9iElfuV2HtWx053qOsedq?F4S07u`gG5nvDyz+LL<55&_3~ zxhU+NO2v#I6ecOzij67f&x4vx$UmefxgM%hX5cF7#*O)Q_N|*VZnoIpMB2Uj#3rqc zK%Vh|p(*7|Co@?O-Cy|AR7yciBuCrCp;^@38ci{hDJ6!lI9kwBqH4fC8=^_-VX)No zg?|j^EMy?5VQQ_mw*+D6xpV^zg?{^HJM{CJW20v?$svKS#4$ugnq6(@k9{VbNeNN| zt}pwXs?b`HlMGszv3e=dK*{pq4H-4;m~*9{-U7vnkgK&Y&l}s?J*d1Vvw=-d2FtOF z)KF1fLJ7-MHfxi#PK1W37l`={;UZViL6;q*fB29|X+bq`o+r1h14Tdshl^s}z}^Tk!yxjVSKMJo?u>r%epYv3BJ- zw(!U)$xqbNj`-etLCACpOOd5^!)AK$`b*jfN9WpksMQ}975!C;z^9f2ZP%xpgnvuw z&~-ojC0NkkzwMx$kd0iOFxXP=Gm;RQUEG9kd(+@8HV~ysq=_`n4_{2m=kze|R={~x zE|HDf>YR9&soep$AL+1aAuQH0nczjUo(h-4W`S|j21Gbh-vK%y`dR6GQjd;_;RPzt zddC1WRA$sp%}b_jA3m$-pkX(c88cj043_fbNVnPFDPHNPvd^D_Z3;b8fqnt zK-BfaEPx|`5rz}1EF}%hC9I8V;_?#Rp^Q~0`#hDE^#uiM zi)mg~&$O`V=wG6@vo;DUd8I4vO|M*|5mBjINg1Q~p78*+3?=WLV-1*YJ%9aSzlPYi zwY)K72#o`bXYJc;+L-Hc(TS>$%dQ{vpI?-+-nyX?RM(aDImh$6$410#64XX*TCGt> z^KBpMJLy(i7m%Zi2E2<$dcMcO5G6`}{3)Y|?RUUNN@*+F7T3c@nULAqS9QdP_uXMS zqLF`8_4>$S3FX74;SlA?a(@Kp3jr=t@QYzR%T>GHR#%l03Q|7de%wXY2b*6yS4dQ(7?*o zMIlETqO~gfepNjN`Vk9-fO+ImsE=)us;YXVAT<2Z!(FkOZKfdGM1T5H<6#z#wDuV% z3-ZO!;h-IY`6eN3GRhp97JU;*>wXU)Gia<+_LwlLCu_ZhR5>v@Yl);Y3_-w!Y()=O zq6Q{E>;$Asvs=Kdl;OcJ6Q7rF_~TTr0AJ0VM4?6AOE5xMx|vf%AZxv(3onAHPx$Tx z$n=GNICysFXc34|FMoX_T6=?>m9CRuMaPs_7_>r2qzqEgRkGS#;SWUEctFIy+Dz!7*PB3|O=aUSgb(w`AMxG!NmdLo}HLR6{`Z>J-+!|eSN zbnMoyIP7M>O}5P;Lt~ab@K>43!$$bNjb-2m^c$NiE5#RbUVl`P3K(6rZF-J4(?{p2 zyg1W#l7&rdBfC_J{Yz)L$aW=jaa_7dKAE~NOuyGW0g{p|P>@0Bp|W$XwJpWOgL<`f zYboUWRV-*Rcfe}Z^%`_a@Dq%^gdbY=vX0!CG+b{8Ig2#RTRk3A!;)3kIs^*2-=EtK zz@qfUJj_jl8GpGn=oubK1fS}lvW1-Kv%$oADh{xf0P}0dQV!2|3I zB{`WT^v?ddv>~28qrTjsSKR&|@1(d5A?+~|DrI6Q3<4~+I5W$}ZOhP@Ox$OQeGs)F z8S9YLe-d-KT9#_!zFysQ&9dlVJ}Clv#|xPD>pj-z=YJ8@zD9E8cHKaFv0#kx@TD*LmqW zD0=$eXgV0ULw8q!6MFM2fiQ=A{-h1QX(ta_Uul{aEav(CcK%UvCA4s+=Kq#1P$aQv ztSPZs$A53Y_Nnw35h)9gL|trbbUI_=~Abk8o#W-_NQs?dHo&$%XRWB zCJiSl$~!29&U>ZjyK`++q~;3oN9~7Pm?6wu;`D&GRRW&t=+oL;L&Qd(&fj9#IQa&8yj`P1_o+nX<5&f4!g^Yb3nD?6@R&4N&^rQ4yF5 zlyJD$!cnyP=EFmgY9$t*8>b>>A-_+UVvyqa2U}Hw>i>2-mD5k8Dj9}G+kT4pv_ET@ zwtvS!b{rPzAPWr`TYlaX>;4skYY~G4LB(uq{ojq57hwin!@IlviDGS-28%^o=snch zl4SmJDd*vpj1h{bZR7WNB1>((P{mnLWRsbR)tlxaCfA2fGdS=*!Y3DY&Zrn>wcEj` zOz>xRHXZ`!)ffdYT$Zj2%Y_=Rg7Qta>VK?Y3aRbJy%ktQvRj#BO5I2shCkOuh7>96 zs+Zl=t+6jW~8!5RPk(4qwwlGLJ2pWn~fHWk#s0A&+VXj{k1yoPfq$khC^ z%H&;qXlKL47#&H?cF!~E}ik)3t!4(K19Ajc!0IcfuReq*AY$=f-B!9)0T zb9}h2lsDA4?f_i?t(&Rv%N{!U9)E(vbcEtPNv`@~`u}ujUnV!kCpgE`xZjv3WtvRI zldl!WpBLa1(-ElGzbt)}VkJs>j6OG-NRtwo<<+h7F$4=3)ftA7VK;L4Bn8F!_-Hd$ z>7>?58r4p^)TT4G1=7klFKyjSDO->W;dyAY;xW@Jsgt~pkRA$oxbB2F@_#}MvQ(WZ zA)dd%QyY8Fh*fO2#3yD_lUKnUyH&iOkf&f&V3*c(G<6oA$3%ryb|3Z274hWo!*j%w zzN#vULY+)dHBcmC6NiWv3~mSdvUDEo1+?RJ<|x6yufYNAhUIKDEpxnP*APdEk4T`K z>k-h)3cvvkTxr6d&VxE_m47$5Ri9IyS2Z3?Clu$Ub9BB~jN?1|_dFxtIebgKwZt7qd%>Hi zkmG&!sbK@+8sH0t{&{bNwwA!jbnUJc)GWXXo6IGnfstt;w|O7uTn z;xM5lTd=F_zrKOc2)DyQGsKol{rd$Z<+WLp@$?{ZyEmb&)Fv|y>$RjgtiLpA-`%6-Rri^k)u)+t?=EBk|QJ1Uws4$Ejt z)P`0o8o(@K&u`VC16}Bg3Zg(TW11w7QdSAUeRVx4q}5qiSH)*tJI2Jw@A zMHm~jL94*e7U(L|nxEeC67o|5KZcFj>Ky($rv#CZ zm5TsNK(xPf8qh?9UdfT+Jt2*8ITA5`+!^Zyvez!#{;coCdqFFT0|#_L27sMxc*BB5+}|nCOhe%vL~f_rF|SIcH@7Smqc`Jz4R6yBY1;r%p{in z<2G+uSd&n8(qCg?Pjp6`e;PS2gOSa~z$GzIWJf<>I-fxiZLk%l9|jZKOOJpwXXY4hM8(9nKTq!0P-vfzDvJR?Q~C20F&^vC$^JH=nfKPaAUo0W6l9;DOWVd zlL^RmQIdJnvx%?W0tVPHei%%ibXS4Qm{uu`?#gl$qZ?qA@#6~70_b(9rZ&rVzv_Gn z3N3%do)XiKs92N}KjuSd{zpHs&kpB?iKaWMx$p(cyNELTq^^kkaNQatWXZIL;_Of* zec6Z@%cYq2OT0yoam}dh!ovZ@j`0&$3PL^(QA%YWn^JoaJLeAFda73&kkJ(z53rLA z@l5ky980FH`A0cS^-xp^Y7>Qg2(;+sA5nh=YvRreU-={thj>fLX9xqthglkut{T8cl!ahl^}qzmpvo0Vy6WgBU+uYIg|Z+Snr46R zpzKK)1}JX26u9Xi96!ttygI7drVhEfNAbng&QkIJ@O8J^$JS?Yug2iv zEE?L4jm;teJU4Q15tPza@x&_5Br{TliB9WL%0dwbdn#^nnRl|FP05h9t^=j4ut#Ab zpCfwUY*mQbMEQRP-(xwXm_m={n#+IoI8Ex!U9$JuoajQ%%M3Z{OL~NmLSD&t+DKoPANJ40IVI3`o1ANXXj; z)AJaj?p$PkB(m@7Aj=Z6_bkTHvyqmGJA6=2ysCO0?}k+{=GpArn(xJzWD`ItFOm$jW(~e~e~i8y~aEQn1U_-F%@i zccSeK0)q{ik*M2+Jfy|Wb_O2 z`mqLKXCX)pWw3TV{-|+JdmQ&n_8)7VbzGiG3xfzxx|`!)qX#QMOihhk$=o&W36G-?g)dMe$Rd zE((nhn3Dmc0;}xBfSRXmNYx-X%0!F5U27;Xrp4q)VhWz}BoUUt;k_;L2(8c+TuWj+ z`WKZ3MGmZe9DkU(uq(J%%%0#Y>iFNh0pi5b1fi;~o7d7$IhSdWHuikn# zO6nk*t^Cyqp&~F&Vj4n7AF05&x{smtg2u+FleYFC4tMpblk+)sIP`;8H`S>Z;HPb^ zJ*xDz#B>>Lx-OLJg)f;;|MqKzulG(EFKeA7Ky!Eow;g`~EtGQv;;ky*8S$#q$+8L` z`?fE-PB?Ws_Ks>$*2U_6;~og!DU(a^7GP7EI&SD1)ts=);Vx~5=9 z^H1`hMU3;`e9|;uN5OHA4YKzX@e@?~Prv2dA2nji8`7gmTdL~=s}_&h+Q9Vi;Y+&z z^)8YHsMmi4UXm;st-_~~I8sAkahM{2Tddt)D_A`sxeeGw$pXvR-koutBZ4@8O6bzx?ucXHuT?xJWZ7@ssKZ8o=cCPG|?x4{GuBI<)yQZ$L= zKqV$l#EfSrB2LA%>=WF6?N|+#MAkZE*{Ms`uVjA-$~S5xJJqbO=~~Wn-s%GFJ1U6C zd<5*lkB9jBpG4K*ss=R2?S**$4^4*nLS~elTt|q^mPLt zO2=v)Gg;GQ(slA*fc^`B4^`^Prp>qUcx8!c*N%GUSlOY_R=tgjcN+C{Ch+9NQsp4Q zkFn37zh|iASB(OvMOj`iO#+$ZJ=}kEpHvsC1Q4IRnyb92I<($?A1y-L#FU=!qgR#qSpE+N4&+%gh|N4tC;-k)Nj zF=XK!ldu7{w56rU78BohrF(g}x_->Ok6+!uw?^`2A#;iZQnU<}2;)6y8b^N*(r^NE zJPqJiSzJ!={sFyID2&){2KA@Kh6^b9!AZcZqHC?PGZ4a}k2nM1#uJg&T7;?1rg!-o75{ow%qg5Ie=@C#9k?*!~s%sKh8nk$#oYS~` zgW+%&19@xUr7Q@#u#i8ibQpj8G`<`-!8%9!#(M!1RH(fRFm+%|F=OTqvaH|2oM4wm zUi0Ov2>osDuEr(E7G(M-PZiq+?)7<>9ZpV?w%6S24vA8}$Lp z0gcCDew43my+Ke)&N$%|mr8&1vp|*o38~Ri zv|z2$Fm5WCQMlq6s&QDe!Vtp;qb9p;s?2sOESpH9N*>mRB{hbh9@E8iI22$dLlN3C z>V&+qxh%IjUO6V0+DL5@N)I9HxcPY9$Bn{Wy00yg3e~vwa15VE@~n!#idBnePdRO< z(pyGdicl}7084(p+rWPfh~bv~c;sjz0zQCmrDi8u7+yka*zkH!k+*^x+S01Zs-2@N zl^w-6S~yA*UNzE^$I`56&K09%lzIdKXsH>u5nFXiX_-#80Ve1@sr?*2NqMKu zsPn(3STI5iqV9hPn5hzJk81cljHwFk$ zqHI$<(+4OJ!ZCkGsBx`W7~kVM?+i{5L@9F{P-XXA61S)t*CM;bZ>7<+=k>#BKAnZa zztpxvK>ApDp>bVVTRa7RM6`kGyJHMLaik!W6a}wuu~WU z5!`P|%8L|jWCwpNVeq{O2LX>FD!6;4RGi5dKiIQY%ov;ng(UL9`ma|FyG<9WaFNVvIuYv|u~B7^k-vs}G)*70K>6v(VHW zC_5oIj#uOr0V?=y^2SsD`xAJSFq`xfJcG9(Vr_v4vZ{X#Hi9s=?2HQ>cm*jmERGa* z05&j~Rww7{wNreG4w4atqkjQAXc&}!U9%PqNN#;b;E&2;iK^MnpeB#U%8Su><4u}w zJtM)*PyXV|R3KIuOEA(#x;LQlVA2g62thI&Db*^=^{!b}>$jW8LJkGS)PA32w3>mN z0-zCm>B@f@`!XfbZT$y<&Zt-}d=cHlV}b(F+`$c`dh+0K88ZuFp*^-X;L*0@k<(Vv zt)@UqVMyRzZ`lM_%aT6%jm)INJ^uv5V^>uCreA`&EzbhWPQj|&*c?KlVIc(IC-(J! zs*`WeSmjEm(F1h@%WGbQ?zoB6dlCz22S$P*BRGFg-nxWSbHJ~otjD!GR0QNq-FA_? zxRg6LSF0`PMI1knrS%T)%njQ(D3z*mc}1w1p&T0pXt%2YgORVi9`zir6*iftC~S0U zS$ZZ90d8cV2suPUE|p(hM9PUrhNrVePGecea`mF6*4KBx=}Cd}u+??=zo6yD*8dh6 z5XFClsejR=xawpGpC+vmIgb+^avsX(Sgzq{p!M!YE`Is;v2V!9hF%H{K;Z1nzRlTF z?NZo}J#zZ8puZF3V0(bB$Bp2XX1jHXEq@PQ-LL61p4eyF%8l8Kp{v>+7UtJ`SVqTH zX9dGq{FL^X&CVi)szS3$XI_@uw+55<`}Ap#$v+Xkt3GIiF#$PoA2P- ze;b}a+!h`InRkb=E4E%g+NjU+yqDL>VuBwFAR1A9d{Q76&YR+n-Dn2n*c}K7_WJ>8 zOYX(P0;{0ve(g1NPB&7ptDo#`AVWzSb&TB2IU8XRPD%wkSElk0<+&Pe!7=zNxQu^y zwe3CHr}9`$dNN~cG$K*x&!g(B-;4)bpSH+t5n!F5&O&Oi*QC??Ta=idpVFV1z{sj* zE%s=IPo=dq=cLUu4@pbTiC$M`zCz8oaxw$KxWR1dKA_&rR{hRHxYarXaJQ1ThZ$Zm zaU0f}QUB#-r@p4HR$%!XaT8xM~4Lh}U7a(%|(r{RFW(tTl( zTf=Fm=r|0A;@~^IxZPl6nI^Wr(Wvnu z`V;EX^r>v)aeRv}r^~%sVAsm$wO;7dLh^PRSB>mZo33z)#!klstEKSN^+bQrN$aD{ z8uzul{UUjW6(8{3rp3L4sn~kFJ*_s_644SdRvL<{v`&M44Y_Ha-9qHMQk``xVnv&t zz)UAgIL}hO^FNXE7+DBUknV?_78@FbMHU4FU#ON7l0s)j@~?5LbFqnw4!T5NQ@38c z$LmO7P_F!1mF--=S2$ZQN4tM~>PQ<#z;Rq>*XYCWl_3Q$k1DasUZnY%)8$5BGC~yi z*%5QGDL@;&wzYAeqYBQ4_$zyrV~Cw2dz$$a0(S(-xZ;+?Xmc}u(qv4;w2_8j!6#hz z7Wvd1Y?&kYW@`?0^TJ^*qs#JV-HS5?8n4KmWU?L6Li}ARAtJA6l!SkKt`f`<^5j(6 z>TfyqHV0d5VqDxR1kLZ@{v$4y_NN9K7-q8jbR)bf@KtF|*S*Q$O4@9UK?7+-$hq;f zLU=v=dv86tYshWC>r-_uYXqxn{`ypf?$DX-ul|yvoFE`xoBhp;lr#w}+tXkhwlv*s z+i0zHv3#egmO7F*)j@xr=pVOzN>jP(yDkM&OHq)Fjw3JJs27vp-I;qv{g>{LI8a3v z9vkW*JkuS(-2=!v^mHE5*zG&`>*G*P<@4~$yJu$zgCJybmR7$KAQ?Eg0!4Lvm!qWDdUKHCfX7*BO{}- z<<_ZGO{R#($ZUVuJR{b1HQsW`-Q0zNS3YQNj%m2*2DRmr#tZS2FU5Z2bC#p1oaU$; zh3@(I(z3Njt>7#1FQVU_-?s&Yf-Bs<<{2TCbEc{6G+?!3DP3x-UHtj6nML40n@B>} zE(;pg2+wB-55LSPJjXoBPR)|7RLS`r`Z2I7agT*QC(HjCS@V6H2{6-AV1S zF^ayvfbEp91~gcATB0JeNy%-I6ALGERV`EEOM_vQ;>&sGT%00ENYRw@Phf^=>8wdg z5m(xX$LCmVrkjt7VtCVxqD{i=z$JrSkp7rG`m5%H8x~M|;G_)lEC#O+2VVj>S6)^evUrvQAO+yADr~;K}(u zvKAl(Ba=zu{1?0;HD`!L|E-b*mYjN>_y8m>oYw>N;2NpBerorlckJ_`A?0^}dSvY~&{u08yV)!C- zM?v_A)I89xujQ&Iq~~n&9#!zQragKp0PtTAiX;Ptm=V{^(kCPu2Mzz?Z?Uq$MGJrM zicW=Fvd-D{&j2$CM&1rR$NrBOvg8m(=ewPs-oIfk5>1xuxM8k=|7P1lH#PwYH0Cy3 zmNUBBe?!b~<;%#;%jm7*#o-68> zGmZ$(tNqQ&&$sf^jjGqgJt}fO&AWd%%5X#x{2pP2;-vAxf!<^PVOGv8^xEpaSgEb% zDR`;Spl?KIbMXC5r<*l!!8nA23C&bCXb=EPv!5$6_1jcYu0|-?!v6pj^pi#|1}{%C z{#Axa<(~juJT<_xsA2?MPvWSFb|Sg99;nW~&LOk5PA2&jXbJDV&Z@Zwflq(3iycRs zESJ>2+U@Yq>*I6*$<>qu(lk<7zicQw9(GwTr!^W)5jO4GJ#~1&N8MYsJPWJ`v+-qL zy^*>Ixg&fv@F$9)7Xes1Q3T-f1^p^})GOOykwPaE%%)!SUCi)$xditbAg$M>qavzP zTX;s2GtWfY%fMnYuy3VB?6ZGHngRug=A8i1%2v8DMdGXMKulzfQhI~`l;pAa=>FSm zfWNF#)5Z3jiC=jF6rA>5K-V1AQMeXQ*;6qxnosf^E7_sp#O`;>`^Xq3Ht#d8B6Sh0 z=_8%{fFn-2+>w=igU%wrw+Lv~I@MTok*amty;W5t%s0=i!=q)!6Tg44u*o01=;DI> zek_@{8z_SmN_&>bpc5do%Ck=U$Kc`1*I8Q2 z#<9Nktc!_FeQaSQRLL<5ZOEg4boKJSEWt*3*rr1_Mu2}!%>!89T;3vDH#tg5+94E- zH+nglB$4NR_wY%+N5)P47<#W>?2yEKeiqvr;S$ZWIct*)NsNEuu+<|IcDtiby|brn zZu$c^+U-GE6w3?f`hK&kxTXKFHCLq}YT_fYWHT`5llgQHb6r{pwP$AL44BG7g&Cuq zbS|B`iw+q^{jm;0TC`zcBb@RuR@K&CwMq4w{k97|7`BVs_JChZANsZZEgA`L1qul+ zl%85_6O|nf0fK)^SYWoV5x(W>rv15g;sj0BuFO@SSaymEnMx(i1H5hLdXTMPs&{u) zfIN%_l<V@U;|mxH5R7IlUOiI5uriilt< z+rWSMnXEZ9P<3k}+bR)NN~~Ve4g0FI^k_rrqKH@wKE!^kB{K)MA65OXRoFIGiAA); zJF~@m+Qff!%Jil62>NUJbC_!m-iGvWMDHXcj~1%_9`BwHl_-#Ut__imjWTjB`JF~) z2XtSBRPR4zXiU^JN6M@k%aHp3f(9cByFU1k_W(A$1;K4s>t!At^vVrd81?G}oZgA) zfnmc(3<7@sVlfvooBFbuqi@A?kbzAgHXmgCFz$a?Zp#yZNW@r_Dx(L{@!O=VSUP1iWWECMsLC!tARdPZ z!Zi}Zhaa(KFG%Jm@w=^GOag%3m)>+{yr6$tZhJ-WJR0SZ9pYkgV=N4c`rq<|zpYK1PDh*V) zk=2>S(^me;KK98+M`|dlx0gv;P$CJ5wLF@F^i90cV-TRAl{wZ{r@kLk9`Ytod{BQz ziKmx*=lSqUYgIY=9R^#%q1(A&3eUr2#>{QJHIbxj-Yp>gXR|z7c;h#EEowxV`h5MY z9_$(&bNB~E+t)R5s+h=2u?5*v{jrDVV5Buyhr+_b(4;Q*s$EYhpSG3MJp5VdmdheX zZb9~8{8b$AKr2|kLx@PWQ^JFn`wxGb>1)P3zp;D&yJ5=AU>P)6ls~=c7$MrLB=Wny zxHp;n#b+eW_TyjOC$47xA9>LUZm<+6V*4Qm0y z*(|4sWiKHM6T?L-d(oZClx!6A$y2fiRJ{g~iv>L9aFU&EjxhFB38>sugB{Q&t%cn_mw>%MI?ZB4EcTBkt|bKLM2k!_GlNu zh^^TuR7+Qtf(It%|6FX+Bo2*b`l?7A+RiiJJSq7uK>>f$1l)b3sOA76 zvEdQ>WqLXGlt^Gw^hq-`4QBkF4cHN}vaEYzQg^2;-D$0`$g9Dug*{J%X(dmf!Lve! ziAxdtsjV;?v?9d*ku|Lu@@ga?Q^Pg)nBK!#<&hC|*htVvcKEh2xZiLh$kSK&-f$vP z_4XU-?>&E{yRB8oH^_gvgeHCs+$h3E3H{8s92l#r1g`o@Ikimr`P2ULRgHH?JSnw> z`ml1>PPE&sRsaU& z6?Khnk0Z|J>}!AjfTPZ~V80`=aAJlCOA%;B)lG;HIu-jVL+s|puM-$KMzCUCF(ye< zrCU{8A)P;b+9?Y}TlhknZS{B3sx)V*C`5^LUE4tTDn;lpxS6XD=wyf!Yv}b8pjQIN z?p#vmW7NiF!(zNvzmvZ(v-B82Ex?+n*|c54sbTJ`Ooo4xQTI7s=2?J@ST8cO18P60 z=7syw0p3x)h+PlR16IkOF#lOrGaMhJ$C9E6549RV=NO{@Hg_M*)VHs{0LLOIy*ax@K_l18HERifM^q%djeWI%j0${MvcX=hGzS!zW3uMtbtK?6PNeF)^7olXFj&#YN-9m&^0t95Mo%WLy zcSz|4uG1zE_62)3`wzoyb>i<=r2u#r6*l_ORn4*Yk@9;2z#qShad)ehga=N;d)8`+ zkRar}c7vr$Lfkx?28+;g5yJG0Z8EGJ)iVXl!kM%&fN>6Mcn%&wSF&@uqr3M*@nsd* zzH@(H*4}h7SrXEfW|}?!oc%7-+ItdV>!Q6_>1SVdelB5_4Xp!6QkZ`)`3?ow^ppJL(a{=}+L{Wqt*1IxVwWNFZkY-EhBH@p0dlHw%eWEWv@nP{0o zaptmx&skaeT)Y@OUS*mZ-{@mpg{&^UsY-ueL-7{N9**&e8@th-LTk+in)I= zk}qV`W#`P$LrT4G&k3{Tf4%y_m8)#O&k)C}!Wq1*k~K=n3&ZIuJTgnGxuguJwCocy`Sd>LmWU1MreRB+m%%=wD*DHa|MXmAH;~SUv{MNa>D08yAjPv)bJwXa)hnr7G?2baQnnme) z!dzJ7oP;B`Zh#$|v^^vG54U4vi3)<6()zvrXjLs78s_;B>f)$8x`-LFs?C3KdFkzN zv1feRvF&mr9p&(QT6%@;lwj~e2>A+Ydo&jst*DRNj8!(fzAfgrTL{CWF`atyPa z)DCk|sA*xpgKC2vY6Y~ixRRS35W6KeNs*}ro1nifh~)6`Kzp!bDC$9snj)Fl^Zn}a zGKAZsW}5PX>#92)0VGCrC3Js(yHOEnefRx6rRz6H@i=hIhG+vG#dE)`Tw9JcW^v*o zxsa!>V8&v<#_=Mp1^&BBPu3h(Dm@kM@iAYDhwT_~aS&FkOo@vVVXGsV7Le`$xhpao zQ};A?MP6C5_CYyF!Z=>!!M#y>KKSf6`mE5!Bg=J>uJB@-J>g(C`fGo$y*8aLZ=DTy zdw!IPgQiFO;O5WF|1W0SKq7_ar0yho_t!xHj_aVr2einD$;O-(9&fG4B`ymLVtcf) zTcu@yjq}n`m8N6cSh$FV+p?}<1#^`19ZoyG!Z0J#q&3EEWtv?8zs-J-+XbClhX{mL zNf{)9aV;K8$>sc<#NU6y+mJxjjO{W165gbGp%H!0`G(79Oz_wx5yP)wp#P{a2#!{& z<@GN^VVJmjVF#oUyihhAxi}PERp~I8mSO~nF)weo6K;i9CLmTka?KaZ^PLU$(d1)3 zLj=o9%E`F)Bbsca=M~RdrNZ(wu_S!L3^s%8ScaD@$}11(@*jWYc~2|L{X{`M2NFxg zQX8Bz%bpdGZ7q@@dSD}oRw;+|~a4}N=`CEcY`(1oQ_y~t($5#Y7>|(0WY$hitNaS~X zw~@o^wPq_g5rB@i0y3s4;kiUWWASi8s)2)gX~@f-C2G+D=^UBfJ?evobsp2m9JHK;y|NKd@F0utlplY8;jp17tNhQKBB3cbZ@b}D)^f5&tg z_zVu4-yP|CIL*nCmU&}cDyv+qdvj$VUM(u>^-SwTl69(w}LK^sg-oBLQcE0`3=e9$>uvJ zy$Ltii*E5y5Fk$3bNZRxHe$;xGsE{75;m-QWQd`qw}*?>S3G_$SrCQ)TMpq^K&&_G z+b)0C$gzM7(;ED{pUIgYd4A!rdc$zSv|x-sJZVb-)N);vn%OQ?l@4ic>;!=zE*>v9 zPgwdtvacSACmZ>Jf8vXdSu6d6{ZTDWnk!79F-9kN{1y`Mv4Ji!N?gbO(GzwFf~S;H zA|HPm4lDf_Vn7*XZP#(lgb;%#{R*-4Db{~WafFc2hh%{x(0xBkR>5y|I^1hpD?1o0_*@|{UHw*6ZQR*!#b z&#@d(u4k5?xO_bqBg#UmwTlCAGkE%Oh%bJi{@jAsr~{sEZ(uVO zEg~Lwp9c*LD6RJkpbtazyw@zRInRI1&cd;FF1>`NM@d73Ic{D}sI zAUX<_T+q!^{*6=JEF5Ik)=8-9JIT|$c>_1s2$V`D4yv22@dIb0!El8ElRrx-~Zza2ri?8U7^#A(#zEmst9LrhG!0|xsH-4h0Xjw zo5eTl*=iA3we3lenPlDxt-gO^BH$(MNB@H;;o21*w~~MMIm*v~=^xYiJP15=zzO(D zUK@)iG_K>-;=Kl>u4*|K^%l%R;dsrM@OWjCRUP=crR^?2uv-A>`c$hYnv+B)z(g8%Kx9U(;uQ|JwVR9mIc;Qmr*|;+ZnV z@VkQ{&40jS(4{6ErTOaG)%y$}Di&hTozwYhCat*S7u)8|PqQrG_G*s{T#lc6a7Y;u z;kh(T0oxq-*|zY1qE@e#e&SqQ7i)OYtdwwRh4T<3sg+8?&{M=(7R#gAr zMnysAFziVhiY*H=cv_eEDT?04xRsc}$GX7z-e_UJ8HzP@OnD>rzT(9@Kfm)f%Zo2HbD~(y>k#SK_Z+wRhwnu&tXzT@US* z{c6>?Cb*W*87?>z_RVJ;KOe8^$)=Vex6i>{L1I=ex`uZW{i^8-q>so3iBA75?EsOuGPrasihEJhv` zaAp!t2ac_=g-9u{a&VY9rDqNQt!9cEL9$uGjo10I{R&ORijDMUS!RJpLWvsyfFH-V zdNqVlP6mH(9xkSe%E6BcG4QC&fMW?=>aC#g?K)vF_)uY`@BU0;-dT($3dHADLu~0p z($jPq7{CChNQ>X*J(czGbFFBbyfby;w&;`Q# zkq5UGevA8zTwv#39g4Qs5$P?Wp^58^aL`os#lkyNE@vR zpT>V3=M$~4O`J6cv}_oiFw%TbvJ%*}1iauax(>a>VG=2cv$J{!LrC1Zm{tm1ENFxeFUe^$eDru6sK1RIwXxP3ec|9mE0sc8TL(F zg%rbu=ht4O@yy0U0?QfK_6v0Ic2ycXLQ9qA&d)9CHbZx#aYxk~-sbNw)tdIuab^6V zu?qgfAWkrP`Bd7z2P7axD*f50_XB?uInf#JRz4T$K-0>p@#Kss);q1jX8_B zSLS?%I!p4EY?`i&>{JKl?1REv8OWG zeS0s5npfFPib|z`jI3BBEZTdDG|-sw#=fr&=iI9KyD;hu+22b^Bdyt%uM?hkdOx?Mfjtj@NxMPcp~=aZYF<)HyH?+5Z0Vsr#-Xp5H&vZVgj?5?#-`~ zKfj^P{5R7Eac7S@boeaatkH#-hBZ%&Q4Nu4cM=RN0H2t09TI;8$>pIX8o^o~!FwqV zMdo)wfA=hIXl&lEbC)zPY5v3EWZF1wMp3EXK|k1^&0QC^GRiG4*% z?a$%w7mV$G9w828H)YKBfSF!NH3&2~gaSt=^GD+eT(zy*A5Pw_$_b}`*lZ!&lGKKz zL$12Z=;B@;nI(T*V+j4MH(>gicDH;2&v<7pK{4ncV;2_=T|(>oX=5h&8StO=FjwRP z8%;1pJIyR`oO)E~JAwo=rpoKB@7efiKm(0AUzw=Q_pNf6y}hVe2xti^z1{e=;ZtAf z?M$vrMxx~Esnt3$1OF#Evlf4~^As+E+-FU>X!1Zql=y#h^x0aC=i5bkHg@$MzT-NL z2E-AZ4#%uPbA1S!dy-_^`>9U)xp=f_SR>aT2IH}KB?mRm-i=;OwXylV5Ov=w4N7k3 z8SX=X5L{C@uT?=%U7AmXfP7FRt4xf@2 zJvpV~Tv2~aiO27MoqrY%*}SVU8VQB2oO&#EJdE-bo`la$nQtB|vq?~nT6^S%+6#_RFLF#2)op!|u~YCKeQf$5 zJy3#Ft~r&sydyt*}@g3%K48K6?L zJCEBZG=Axin_xJO%I>Xk{rj6yTbtk|njpb;&x3Nys3D_^onvQ!So7;VGE`6tQh!_Z zcAbCDyF_!(O%A@XFf;2W8Ff_oA0v1746!!pvSA7dfu0pJ5=W}bZMgZ#3Y>e|QR>U&_q+q;Xky4Pyf6+Pbp zKyvdi$9WAi2o1;P0I;?%O-u&4!e&-RWPX3%_%Mn7_}M9QtNx;Ax2bXF5*QE=CjFa# z+k;kDtsuY#=7P9F%kV;V*s7?sT4cV_vn{YTdJg`NB&jw-38eFy$L*6v7hcO#(o4PZ z@w;2)a3%pJBWXe1OyNT*&jORBT3jND!`@+|dYLsp?Z++O|xw&3+FHb<)9?)oh&)}dldcyAO z)|IyU42rJ2gj&YvI33ssy|qLF^{?MeY^zxW=1QS5Of8OfeRleV2J~l&LOGiqU}GRt zc{=2w*$|b(HJS~443p1Jq~N;`*xrAu)_lON&6J(Es1Td1m0?&2cV^)H*F0|a_4$8< zHHmK0=kl4;%Wyk&an&0#wlf>DO3nfT6jAq2hl(yoh!vLF*9LqUZwy+OlX*VpQzPYU zZb>%p?%$;7vc(p7`A!Y*{U8K=-&W6e}a;6F&vO}WmQ4O4$Snlplc zab6b;CznT2G%3^q*^Q=w?g&~JCMVat`VBU&^pS4E{*YYH3+hC~Wj+}9 z%zOcU7GBZ}QY2*=Ypig=(hWeCPJVgQDnZSKyUJFadb zSB&+gmaEib_Xg)0O|ZSlWX81~x1s*)jDHGOW?RW6B9(1|ip*4B|35Ir&|8mdtd>E+ zo2wk1KCH>|SPq$xe!#z)BXa3!U$N4q4|zg3RT|S*@!ASS%&x{=M}U9k(bo3Yc<{|j zOn%rJA#R1morna4QLz2-0;C6H0_kM4`Jg{t!D2sqkTVS5bQWqrsF76P4g$weLjJ+F zhi>=ci!B{S;{z17qGceqSpogc#El~fV4g_HvA^3Gk-snPPLfGW+J>)_{;P&-uCT7@ z9Z$eHV!Q1=?qYw{&?ItD!nZ-=^aAA&G24Q%BRxdRHt4zx?Hi-u$3}LYU8tyiE*3GGkoRl1lqof(|oz4xn>s@K&#Ys{SZ;DRnFztT0nKqpg z;f7rkbRi%+ROx~%(s{JaYX19VjQ27+OqKKrD5bX?;?(hOe4KyHdc%hl{Uj|hMi&sd zK?lk*?SEYHXkRm!NnH371H_S}FP1{oQ<>HvcBVVEk19<@t3fPejaKcE{~UX*Vpr|# z@ng7uA%O67!K-d1Yyf@b(|aJ$U3;4}_>A6kz86lr1y2~1N4e=0Kj4w(kG!rEU(RS3pT z=YU*Y(b{|JHRJK2xn#G-aDRefWpMUqt)f3Uoa3NYly83Y?G{;pj0W3~#)yveSZM?@ zdf$omtT!Gl0r8&bjIaz)5>}FTcpo+i)B$9+?9%>+*LZ*N$ML(2J}GRBq-EX@H0YMl=NV z81{DAkN)4IUHr&cJ-*sNQEHG6vB@Me%GM;| z5u^-VwSwpdh@6)>{>SwnMpzg9*_aJebO3+qvuH~nM@Z~pD5hS3eII8iPI7+3=zl|S zzy*^tGyULn&_4ISqo8VwTbY5pet|-=DN9a0qtyl!+Cw9M7$PihFNABQE0c9-U@AC$ z$ci`o5J`0QxSKIkD(^1&53D`WVQ~1rX1ru#0tlDy2Z`o}0YEW5>_Q%r9c)*DO@Dtm z|CiAX6U_e^QusAEhLXolH!g!5$(fhv>Khr{yXo00(m=Wkz1xhdW?Stjh4VHX9NN(u z=%PfN)sj3LiI?Z0?FTTEj>*uUCl=J_(0ItyY*tsiUobL&Iwor6VUZ1tr@8y2>iX^a zYYo9A{_2@>3;3y)D!tBS4qKk_%ol%&(nj2UYo4a#$OH?q|KMBz^&nE&Xv*7EPIZxw znzQ=j8W<mp^EOcupms8wUeRi-H5Sb7@h(?DL{3`&lJEL;R&PFGm$yLy_XKfFID;5U zPImH_IVckIzP6D!g_u4FSX_T0c)?veUMvKam4d#fK^7E5QX#(5N(>^F{d^+EOC0ph zVQY@x>vtXPvEi>ioFkv>#C&sdrSlXuvh$oaR`|RG&zJ5eZ&v#_mC~1k2uCniVxFqj zgC*Ww)A39C(O7V42xLblmyY@8XYM!jJ09>$5#z--RmdryPemR6vdjMC zHdfmmsq|R@y2mfoK!OSP)ke-PeQ+c@R82W|UiP8^<3>IP4}l1}R%YjjxXV zazlAB0-6_kha9-E8p(eqt!v=hkip@bDDh&B$h|ic&!qrCK)%0{yxZ$gQQx^2Z9q!e zx|i$sj?aGifg$SY59`q}TP)WILVj_bsM#!vq#Ypk${v^JSVO%kK}o;rwYMi`2*irp zy{av5!7?x{t-*HF06;~C)Y@!*QHBZLo#v^_Ffr39UCsG<3YyP`FW<6%%9pepJ50E1 z6?So~^{<)z9|Vr-pYY+0Uu`Z6(`+y1Ua>p|AYbqLs6(*7itg+Y+I8hRxfl3>W5P+N z)r3DlmeiLhK!2`w#IHGBtpk_A=}JCj#Hz@GWyl}uBpJoyUCiw;OJB(h`19y-*MD0; zX8&eZ5&Xm z*_OYbtCImKZ#B4@3#=hkL#8W-EJEBJl%GkIczLqH%*i(MK*wLI9Lj7)*lV%S&;s4> z`p-_Q)_jAhC=uK@fARK*Estu5xUH#4tQ5wz>|$t>r;;~-92Uucg1R!GyqsOr&$T+C zcEQD&MDik!BKmakLH)dGid%32&6ehGEjuzfF=5nUZaTS(bD&k6v_{S9Xrr{jdf5o+ z9p3;VF9O)h71m2$fr79nLK_#aNSJmuia@f&f~Wz7|rN*WlD;P z4mCxouvu;x&28zPn1HX3>SZ{DiNA@8Iw^7aFfHRyPTSRDDnd?aJ*njC&|CW`wQAFT zYfIWX2iZNNK*ljGWpgVx1{r6-*5B@n%}b6?GY(z+RcO~_sR_T!l>47CPI>*m>W z!dv`Z;0cnjilG{tcdo&d@IEHNY`_fA=(fL>HvE-CY8eX_nO%0v)!ijBg|jsYS=mPl zTB+R_1iAp+DFe7}U+Jd(klAp-OjzFK?!$MS#yL84^)IT}Be#)= z=FRkIz1>`YU_Fd=Wy6emHN>wH93c2s8K2$i`8;^)6rB-?j?0LdzUN-E%i$Z}W$I>) zPh-fR(V!jd8uz0ZYY+lrI^k4{-HT+5sRG}0oixJu#F?K-Oa?P#3|+#-5P4TF@ldiP zhY>NX4nv;aIfd=#ibk4a=DHAWVaE;fh>_$83`v!LTWzIDg?i6Jv`f}CgH>a&_;>4Y zj?UvREF$`1BRcPw1dAv`N6P*l3uOV2=5?ML>nN|fn7CCh0APtUZHMwzNZ4xlLJ&IqL$s_elu~0Ev^tC(6671Q+E6@%;j7Ex3+!T~uo+UZcHSwin&2Y}{`C zv=XO(R9iMi@zExcw2QF z4B@Bz^T_dc>eWBc{EFeI%;=GD&1=1FpCjylXb*?9TGuQzc^Pz;(thb_n8aSbM#OR| zrXM!7frR~cEYqZWb1-OUBBlCL-a&3Nd0W4-F#xu=Y!073ciR15!JaFZj=>&1^w6v` zzKC#T=eFOh-?|4V5%k>Y>QKiOvf0>$BVSW@O&m*~$xo!EPg3!!tBx!eF_0sKv=In@ z4GoEC$Sf&*+iI={uYw5K#lM_=Z;!+T#Pz9f~p>nId7q z>J3_<1my?06cvPv<}$Vr2AWE8l~e$%hO3HvtD+f;D-=LlB5DxnKO}gw*43rQ%V!g; z5SZz%=pi-QPOSzsEq2{sQ9F%90-xMb!yMwIlb7F1y0gN}eI0dRetNXhN#z57#RwuE znvjjOe#2aSIF5~z;UpZM)#Z^^5WFV_8u(&n9R-nb(>t6ApBpqP8RzLE^cW)P)XN>K zmO{iu7EwG-lEm428kEd2W*YE3;8HWLNKg>)!%ZFOuhtBWdaZPfQAz6g0UKhK-~?H@ zj`MOf+2U9ax;Ga~i>qE3K9sqClgyAYp^if)*>+ChcfQg!<+L!DmXU~#+AXU}DZ9BP zhmL>Oor@4xbCR&IW=L#bV@-aCPq1c~j_K@5d>_<(LlOnGsySXPP9NIN`Z`@|Pbpi% z2lcZX9%yl#MNxJQLEUg$yDlV4&7{6e6N{(HIw?iljDre|K))OkscqbUAbV=RgomXp z_5{f#iU&(E66%l25$78k8K7T0Wvxx}&b@}#g~mb`#G_%I(9pD;DjLlQTz0F3PL}q= z!;2S`tCAaTCD7}x4L8jp9h1G$$J&(8&*Z@XuM}Ur6n3`7XLwh>lV6iZt(CnIWkk%N z-NQy@?6q)dMk{t0r^fp&*#Wky7AVwsD>8Z6-kGT5 z2&H{c+GrQPinwDK!zdk?sW4UYzU<}w3z>n;CEUFgt*I5SG-8&^Z7V4s&Qhu%se9XhN!_N5X_Oc6;>Xqq z`gCW2^5^cz{&z}X)>(+o9E(J-;#EUix^xQDsRXB|DAMw+r19RhC@gu5#0dCufk@YfdLDRwgBq_ugk5#d zKZZ1J;zv84a3bS>mS}mW(RddY$47-|(q|I38V$GI$&83FYEY-ZPd-YSC8AY9!>99w z@0qsGPkxGsmT^XlMJl~Io^&0KXPzLh3CbHc@F*uu3@>BXN#@AcoY3qi+&j*|b@AkM zmK?*v?;07MvLl$dhB*r_QQ19T*>3c30c(@4X3VbDi)5XD9WWEr&*uJB|F;#FdsMkM za2NCX$CpYhFH%AJ4-Mf^E!BLltZWS1VjE2QB8=ivvOx1lqY#Sfo04HcBbjw1t*4&Z z0a!B5^fGl?Z5tVH<}GtWoMas*&$5hy?gpGxQ0cw8{|urTW1kwR0D1gIrqM)Pt(BYR z4dOj33+*a@uIysNSh6A22S)u?kxaRwpF7=5!>Wqpt*B}wZ5OOHK^FH-c)Q?6Q7s{E zPQ$jR+pGs=Z#TdUWPwT}GH)*Yxu13}i&C5+dC&$Uhm&Xe8M^7$n-0oiXiD$Yx03Rb zdzD7uo&pU9P9~Me%F)Sq*lYgdxp&3>ZA37*n#Y)b;z-wlTfti`4;cT7em_y# zIAVCratDu%cMs*^3Pf^IPkhH!>1%24<=rQ?o?()XRV473#m>}xjfB$yl*2PqUWHM) zhx4fVcJ69ogTtb6h5<(tM)ufOPVks-HqSeoVtJY?j4sBtxDs+ldG54x4lVl>b)1zwL zTHf)Cd|Wn6(%i7axe#V^sd4tK+&lWzmhc4ZHU-+9Dos`CKELIR{OtwEE;ci2EIhym zsyH6Quhu-Jyo8E!*s#Z;Bm|2g*7YHOoPU>(Kw0Gne~g4=9;Roc;UTEc=!F6Q_qYBO z+jJeypx>hnJ^ywqqcsgLB{Y~^t|q3v!fl=EZX|(JrKTUcieQ~8{e!>2((tGhWd%{F z?$Am}8=~WsXp^t2E&8;f&x=XKFEkVnO{O%iql3bMbiJv@^LBHDUQ0J_>zj;!entXa z_)Y!MpL^wIX7?r+tIUA*?O zk0t6b6KTq_9K;Ik1`bY?Wr9(oZ_%mF?y#05c9=Ai z0lVdNI$k{`s!Vzyii%@@xd|D5*?9^ku%Sv#O(5k%_57$=v1gZo1}N{VN0DJ7H;*U1 z=M|xY??#Oa(-RCTKA*f=d~hK7rG3a!gn9lve(-L@B=A%-Ahv{B>Z(MJ1E{c8x;R8dvB`@y z@8|;zsPs3B)^?3T+T47w$wvOqE9~L_OF@Up(Vu`kampE7mC$5p{(N3^){3}R-YzoS z2jo5FUQ-3y7OTgXXFf!qHBaycwnrp-lPgdh@4C)JTFQfeKSPV0azOVH=%x2A9|D+N z@5gII)$08Gk9lIhE}UBX3f0rr`^rqkKhq2zS?z8ED;Y$>!ZISzRvby$Krp4Em-!mE z?A!ue>bgmvXzDBzIY3rMB8+n<8!007Bw{WKbSM3@nP>-L8tPw)t^OS+Wr#?d_4}1S2PyoCa+5<$K`|-qE`t4_k2S+&dM(NxGA#mk8hsat{3?iwDsQw zEXsNZQSo=Dy!yxKr)lN*#!L&t#S9TVMaMNPGT)gRFEGx+V)IzE{DVV8VRC zrAEG4YFf-y2HCHLGlcke@7-zQlszeUq|-)*Lycd5a7FZd10{)V1-re<(E%V#G~%}` z3F9k|{>yv{CwYQCO=L9Bd#Zh#^G+4|?uklU)5?l~R#^lzYgWV9j$ z{6nQ8_{rMb?2#yvxt_=ep?5@0~-{1`^A)}ay4Qa?HCUA;$5D8a9%Tb zF*#{J;?*ZG31>shZr1a_Dzy6YELn`P1rrF05#?&w5ieXtFr$A7D?P^)5uc>Y|i49QgCLeQ(L3UwBhrA zLr&@|`yI5VW_LoAH`3s2)*HZoiAX+m3Sw==Vo58^PZffb*vE7)898SwPht?1 zU9bf7n7Ir)#ObFMssA6CRi zw$-k($NNMade8=qxf-ie4RXgU@8||xfQi-r!J_%TR=sx#tr z)>}Xvt>6J#{b(Z3r{eNXu(Ba1P9n5BTy?AQBwboUL_v+S34cy@c}EM^cks!?s(&kz zl)wMso7}}brC4-s3r81(z)u`pac^FDIb9Y{3-FQL3h=)@%RLhsh)4~`2=!w?9*PR> zSm;-Z#IV^so5h|eF0;-=70LWnH`j-XfNmf9Xb8cAPHm_iK`rAM5h*^J(d z?tw?JFMvuq4enLuKFJbd-QnftaXFe5GMt*|pKbI|b+pKGa8iLvT^9s@TkZRGZM4yp z2S#hKjl;~$sSH>G_~mPOc-)$aNSs20bJKexy320d6U*^_O$>jWqQ$lI=VKz|1IBAK zv1jN3U_DDp!Av|W$DxgM#@HJfGi#ln@$dp1ltQBiVK%DsCF74oYepoO5ct}7hvn5F zL%t(iNOG+eq^}dgrK073Mc;?c59S~JN!igl1JZJSN>-!8q@6A3o$)?q)htmJ?t5*S z0~YjSC^ekO(07>HmH(v6YRBt=D%qL{jM*XFEX^l$6+65Fbx_c6j%qn^4@H{QXgaJ; zY>vt0d83;hd0H$@?RDE-(%*Eh5)oy4|J1wyeDq}*gg~0#`%+JTKutc5QE=d0f|;=V zYXg4f3H+T6AE>&_L6sFXT%pSvmmH$e`rkr{j( zT6wM;Zv$;kyVBWzFG28!KV5PHOAF?>(b*GVUb<(bsRW5;%EU=NPMDn^4m5bK7Ivj+ zB~g6xm3e_aqc zor9Sf39&zQnSZs>pI2mBseb=xa|tO33s}ny8qZAW^Mhvb6+vk@5`FF{%=>Jj=HAiR#X^q8r;pJ*u%%eT5C3X$u5<~*y?$evH zapdoRJXRtE;rSwa$`ao%QLKTn^$~Uj+rgU&XliZHqXjD@^LU0pp?$$(NP?v#$V??A z{9=BfA{-?rqJ3#f>IFq%1lpezPWO6TY}--2w0XEq*kvG5Gu1_hT+auc4Yg=>nLks> z`~2lGn<&Qa1bDVrJQAa>e6tE9D&a{W^5eaKbX9^XKCP>4iCs{loY`qW?a?H4e&vdA zRXO*_7ooEG3P-%vJGhHF2#4{CNdiK`1P4<;ddw@iPf{(d1Zkg~44AIQ0x5Gm+8FhV zdf))R0?{)OqTpag0xN12Y+Vk3`0Pmvj50DUBWAx2tBgtWZt~)Nk64y&?X8&@+7Sp#+rzF~s;WN0BEsU{c`=!&>QBnbY-7Bc_I8(`Y zo`pN;U$7}7(Kxf`5Z|*$ib>Q=j(qFEWfPaFwt3>Cx25u^TWrW^~7$lDmCQZlPg zyJ?K4#91)mZUH$P>w^WGL1sqEMyqUS9~wFgFgzSecB@pM2VV7c4GLAxtsGZ6kCg1 z<|2~{&b=t%#KxI;_xjT4Gf%^REV5WvK)U$i9Bml`ii)OtOZya;B%w_tp|*S;``n~J zz?Wp==v1_@yu6VS(xc*7c+O{sv2GC&(+G7P z4I(>>(TXvDr7{^v5D0vSNAkpnM`&I0rt%XVnnD#7vIb1L%;5kcQ&02n;n{*{fB@<#`JD@%ovvCY;$i$YQBKu*+d+sfWZ*=9ho? z=@>Itb61>Cf6?QvZ6{Q1C8Q|2l0aF@YP>PkG7GJlU$UW~$wKI6;*DF{^+%2zSQ5QJervF~?}< zc|{S4vAp8u_I2oJGRNcfiBXbBM{5p*CBRO$hEkfSm+O$>*_dyjQ66=E4H03p2eA3Y z!EuA$&Q{y1iyk|F!($9qC4ZS(nou>OutpB>kiDfm-2V6cg$(zac?H$!?A%UpOdG z=DL0p!fj7zU`?n{*7tAe?&||@mzVq*B`e|99`t$G90%lf{;MBM>xXL0y;TzJxT*bW z4FTMPX?uabgLY$XrQc}W^bSvh35B3qI>?9Kdd0K7>;UuPLmUL?Ffzk4f>(xBO~~AA z?v4P`eK_OOXvU|IjahmV``b|_)9V&`ph*r%vC3ZFW}-?k4w1qH!;t>_B<7)g9<8x` zn>wmTnYCkP(%FrJrf+ZxRfnZ6|;|-(HOjtFJz`5`14UhhtPp`;eC*K=?79AgCr$+CveSiN~!j=nvt4bz@%J^g|NnRisr17M^4nk2* zX8LDhb-&}dg8~Ze5=Maf;EO-~_CRs;<$CKqKqL6oMjH5kW=MX2?0kS;=OQg>B*H>pcBI2?&b&kZ zLTX-Rh8gpB4b@Lpn-JENh+92tsNReNz`ky$7-U&YMq24|;6k;UN< zc&9(p)}}--uYAOQII4B}Y-^QsT09Gru~9zzHx(5LPD~be!7G=4gNKhB1!Hi3nH4jO zFak*m24|mscDN%yKZ1e3_?Hfle1k0Aw~gV<3*;1S+u7vO0xebSl2zyNIzca@)0Zke zTFNFXMvEc6ihv>mKDBjE?t%5@Q{4O}MmnwC#2#g|7w6?U!jKV^Ty!|krYtWv8WJf} z==^BZw(Q;!{;P4ei{TODd*U5`olT~p(S&47cPc|HnYP4hQr~Y{3;_-p!56VcuP-0u zkq0OP{bwDy-FDa@N6wq*PW#)O?_g+aUmf=?=ijz!ag66pZ!lNASg_oyNSgR~nlBbm z4|aU7TJ6#iee$4bRHo1GqS!3zZwBZmxei=-kgDrU%|z~K-HhJoK3wpBSdnyOdl)h} zXg#E?QI(rZfRZ7R7w`dzNym`Lj7DMu%y%aO_K%Rl6PlmtW~UlEwulGp;EL4C?&Am| z5$s6Pxyzs&S^ulnCIe?Cbc4j=*uU4Tm;&$_!NeO0l-ESo!?T3Ex%*w*ZT5}_XtUdi zk#4G2bV1-3*8Tm~2=-imB7)$6F>qgRGrRFkzX;1dD}c8Wa;?-;=nY8;x5#{Va*I@$ zn;-sea~HH7$hjo4d^Pa<{R=28sc*>7u10x5#+y_}WrL~ZXN9hHSNUijVxT{w*0K+c zwB)J8ep1o}u0{eIUjQOy#PzCOKPF6nf&z-Fo-{(DPRMJ7eTkfZ$gtEudbhUGhJ~*G zd2U`#kyq*Y+R)2DZW(?n+Zfbfe5T4wpH-T4X4iVzg|874*FM9x4*mskdIT?luGE`f zQSJ95(>JwK82=2Y@WWE0LKtO+KHyu%C%4cs3X4Ql(+AEQ-W|UM9F(?^LqL-5T%jnG z?%86zNMwhlIS=W7%l9*2BVtx6u$vpjgg&vHVNwbc#l`cTCqR%Oan~>V38z9d$uj@E z80KC=xVLFkJQxiv^pKmx63Y{Sn>S&pr2WYgSsum$*-!x_X%SjTx)RA5;?57YL`0cU zRF<@16aWcH!o8kd5kULpf(ng@vI}*pt(+`~sSbmB^bpN|Z-S~yIdEvA;_0)#MDk*N z)cG|eK;yB#Q;EQZoj2<07m(HD>CAgtH_J^=o%w20>hKUEHZcQc;;EE|GHFkumttb; zlHA{(u>j()S{3B2?lzLePGfMWIsHd;bY)WmTndBF*KX(2mg=m(-iDPO%qyG&s{3eo z3-oedxI>VC*UCuV!w!Z-)xFq&2SIM8#7m=TenNFfhM^3vK#4cUa~%}{y#blL!o@cu zs;I#-(|%=X3ntrKL%7|Kj`bC>L|kGBE5FE}r@#lH`@#oA__2+)Z`}4@k1BF>-wwIr zY2s4J@=Pm7QvzPUG&h)@bH)Bq&5%07m85)LQbR3&DT+KhkjX$~o;ywjv$7SDs7U)h z7od|WPS>YR`m?W={=Z1;@=0)Hi@A|5Y}wfzupBVk0(-`Z>pyb{zL1>m#kD~}*fh=o zElER)-vJe&STaLJ`R!Qz6HClFmsC?aFEOZc*m_o`&Xng_46bS?$q^O|j(ma{O_r(-lY2`!<2 z>c8ibibc@CxGw>`P$Y*~*OyU2SS}G(D+U!p4k^j;Kmnwoz(#VL0LZ<1iX9dTJ|Ewy zMp^J^7iK~>^C%I|qq%cb`6-3i{xQE%Ca?sNUljHNua^0`E+c{Kjby zpf)=vaK|!wxTV6LyIH9iNUTye?P&9#kMU6lJ1AG2EZJi~&%o&Q%%Fk|BVb{x- zZf-mv!uGQmlUq^p2g($RgBKKD%BlFLbE>q*Xp>WI)#fsED)L|+phc<p<7pnSZgon9*$5bXf z+7B_-lg2KDH6;}Hg`g>HJ%~2FYZsF`z4H$25bA-W=rdYt@nJD-dMmd=fn2)~vkWdO zBAv|}8^L8c1LEz_e*(l@e{;N2?~Pu-O$o?|KnzFuB#I4ZJy3QNKQ+c7=NP1UGec{> zKc>s$-qVmBPIQ8Jp_&`HnSg(PA^>%{-#WKK{GTdPvucQ|kCfvj<#u(15@t}cB^7^* zf7NwHG5q|6X+=@gzD;!KJmqBdNWD!kBR`99%d81WY~9`a##SAID%ANNnqFqVJu>hO z8Lk@R&TlKYxRM5+crr^NLv79)PO7D#Y=7FlKZR%j=~kDvlP9p96q*@-s}dvv&2=_| z*C6CAMm|VToaz`{DMbis5jXa2csN0s9$Ye>9XT%Hq(2awUKDU^@Dw`4;;qSH zT4~q62%e`62ZGfzBWW9d%zN2@Fr4}i8s7qq_GLcbs(!~dMein?b6YrXhhDJ6!FR-w z1>)C?o26r4#W-F#c)?4$<~8Va#>K>UH?`B8Upd$7H$$yA)0ItO5C#qh-w)#Y97kk^ zdNOa%R3Gp*Yy_A&cFnK*K~dnVpK*uh1td#&F(j&|TVS`vFzL~M&~Ca+1pfPicO!~^ z1g1r8C2uC&ZsU`7k%dNkjMDUr?$J){Fkr-z%>vU7B#`bTph7JL5g}$$65R^@6-#zp zp+o-!Q`Z~znIM0X`Ox(&oC=t}O$%AU!U^W{N8;wN3=GL$!lppbp-n50vX0MgPm4y6 zuMqa}Jr)fG2K_95ZQVgTE{_m=a6Z>4EjV+P?B|N;kK(7g1mAl9RSb%K@JA%~ts1k= zp8`Pn(S`BJmxX@h3q4Tx%NYqu9bHdv7;#aAi+2@{2!Hxr>E6XW^|9X`M+r+|K!#^| z@z2Dp(-(v5I~>ZugiMqtzK#SzhQdln4SMgvY16|^ktF?p^j{rJBaMI~o`Jr86ot{H z1S>61g=pva^NL9}t6^h=E;hycJ16qqD0GK?Vfi2D@M88`Npxu`i~Iol=z9{3-Tde6 zG=_e5aAawJ6Z@@iB**InS0L9CBU_P5F|g@b&fPa7M!Pp02rnslwm?#SQsS2^EqO2q zukcpf1V)UrApFmN9md6e#vjx;QdT>#Z9k#NbvQ4-!!x21lgA{aGl(|OEKbK!&jcv_ zmD9M#L6Cs8;TE|){Gpty+MF(p(5qZ>v&E(O1z$#g2CYM#Ob0NRvFxyWzeW4e{BWl4 z74t_`I>u2x?$V1eC<_-j`Xpi~6SgB*{MKhP3`-4^Gz5|G_ainwN2v0&^hX`P0;>+S zqJ21Z;ye#;5I*?xGMY4(7p^9d`!VIH+FM}{G{8OVd#u)oNHBAlCQT=sW~1=gk==hJ zMqRLfRJNJLI08~X=y7*!vnmRO8!FS8pDqg26Tj@PS0zQC3+d8Z>o`K0GWovzr+)QI zq$6j7(?~@lOL`$l2Pvm)ZyLn5IrRW%59Q%HUj?BAtamQET_C5y7F#d$on z&_e3-J23Mb2{PZ&&Z!HfsU;hOY)UXyW->E>7a$cwJ}ob-NQs?*hIiy+n||to=A7tL z5%$foZC**WqQG7(aP$Z*daHFAq*=wD&O}*r%*p%;ChEL1acKT!aqXZvc$Z76KEX#n z8RAwAKan)whT3nHs145h9Ld%0=M`|DW%^U&bSldSH==aWN7Pv>55lBEqk^gFShKTZqNLIlrY~k%*vt;8 zu-==$OmkX?vN8`>9Wey-Q;=Upmf^;zv-$e{=}mdwyg!v^#;S^H>2-m-jT39Zb?P_%M{bz`^ zg#3Jx_$I#$+gZv;NZ|#oeBY76I5Nwj!j~t4)4e_0NbeS>D{--klfQ@(RH*-dhhEK? zg;k)kqTP3kU`Y7^^~1WKY}P(^s2G+eb0*TQWzHh8;1!i`ZlCNUK_mnt)hd@;*{Jg< zNj8YmDg`gF@lc+ehz6gvKgfQgioY@(9D?0#R5~NO>ou9Olzbc>vq9r>KS$rc`KqFQOKAg z4je%x@Ec*WbP7)P5|z`9;f7q0o%=|cD3q9DT>lW_L0c52?C^Zhq}aY1ds|)W?1na` zQl_fQN!Z#hgXsH{;2s>A0486-Kuo~HHnXuZ=FLGNs2uT#v3HB3vahFqU!d_eD_peH zZl{aMtbJF+6lEQ~j16Vq?e0EAI?M+XP0~)UHfDd(Ft#Ok#+n?tqJ!Chp+J ziTbZ-KRp^R$GA#(Zm?{}3ybf!houN?%+@`FS%>w2K>U>Ur8a6)D9~+4%mx?q_TGrc zHVI)K;!d1)GmtQWBr6+#OJC5$L6Gc|0YGT~m&=^a<}{GorBt|4t03y3 zL&^8YJ;|lNHz5HX%fy&QM_k|Cq?jc4&C@dXd zBAntECnO$fGl4i=dk=42)nwMPV6;^%kj(Y(GM6C9<P^z3Bw_jIt|C1cZ#V& zm2f^Mkap~%7tEx6lw_80I55&gS@nsp9)BLkJ_H+S3jfjcy!(COXLFbO8$xOZko-ms zFpKD}HV4^zEfI==BU>zeB2{nax|{H9!nzXo^jxSSCRL*PsTH5ThFve1J&|jE7l>w{ z@>neI?;P1$1H86>bpyFc=1HjkJ^*hai(L1FT&*K(H9f_!qLw71sKTF zA{h3TWqD@DMSa_NDS6)o^Wp(?gIPG;Ie9 zv%6zlf@a9&Hpb6;2SBCBg!_=m4L(7e2E;s~g8(k!k{re2W0E|=`TExak9ZBNeDf6n zH=F>aKB;K=P-_o7dQ)~vdR9we5!HeUe-Vj>x1HI4TXlG{;K;3!u>mZ~(y*-0;r8_< zV^bF0Zgh42EIVGHI6IB(-CGJ*baExzZhKVJ9~^!BfS*7*L%}Qm=f(ID45N!GyNl$y z`CV1Pj;Yfjk~r&#h-~o-$UyQLGvY{`&1fCnSZctBe~-S^Intyc#!No&`~&I?slMFG;_44PQQIYQ6b~7E?Xb6LV>l;@V!n|Nr&RhHuP4tM3k%8ga!DK)29s) zJ?`4#dQ;?HL^HsKNVNvZO{@T$bt_%{7ayj7CcC8ByMb-ZLI%`{ks9n+xmhBDY(7(* zz_`v^?`=rO&%kw4SpUHrZb>7L0_{KcFCL58O+&Q!2MbYbC4 z_e|P8p_*(-W?*qTDpE8azmc^8Kd4xPhaxx;t&7Issq0-i07WWOcTM z*>`DzEA1f|Cg!VnCyw%ZCb)%coPibMGw$yrBc3DNeSQIHZ>RyBUxnEhBl!&@IXoD-KnL%t7j`1k5 zJObarNsMngH=vavy2a>VfJWi79xLF*lXe=fMEk9mV&yxZ5nAjfr*N;OD#u&HaSZtx z*zLrN^}8C57`?~IryMi*000k_I`jInI8cghtaZGSVzCz#46WM zPFsnr5%htCp$dIraImv~AZ^8W{eO@G6vKw)r%T}DQfunz@}}?z-Yr&fkhiyX^3&3z zVEMA@I0#&+61Ghw|LA?Z)ri<`P50os2=I5Fd)xfXLy@DHv-`q;|33WxpA(j3Q|~EU z!^}3CsGWONrA^IOQng))`(z8tsYdQ$j{l}!QN~$&XRqn&jM3|V%PV*i(Gsj35X91< zT#+Xc&h|S+)m;f_fA$zu)XEM9JkJ20yTb~b{I3=*wqx7!7Pjj=% z>GB7c&H-)jl<`zW?691kG~P5gHrbd&9ux1Mk$skH-%hDGWdG@Q7gb#&45bcM7_MiU zWQ_%W^(tG;c-o>BI(VRt+ScWn^L}-mJS{%!?-XseI;w(y?wK;>ctMYWB(XcBKDY;Y zy`l-VM03nv6iKTfyP_%Z>zrwKq1zbud6J+!sMEEGcz_=27FmcWYGczh>+EWRp3{l* z+mjW&e3@07Jx8F(59v#4P?c>x&5!Nta_4u#igV1epV--zcqaB!*ycO0g$uyED{3y% z_FxvEEi5d5tAA^-Zq_TqXlHOI=vTAq?ViRG<+A1Quq|tOGrnP z^Qaz3V&yJ;-joY*NUaR0$Jh}Wjn!cXr8Q*FT*hdtZZ0fna0D9ibY5^c@(Nl3aG7Kf zTH}9=5kwmdtR$lMR(u-9fnw!vh!~hU@4X0y==L6esKwa+J4S}SV&?~;xF(V+&uDRt zDr28(n>8wgA6N&A_lLvRH-TG*j<0!2Z_|7zqZN66WZ_$7Q2PMsdCm=VGrY1(VBoG? zRmtJEULIkEEZ!8i-G4=6+h&b`46MXB2~xm(AznUbdc4#i1RP3`>jVom#sUPoy|N@5 zzVHrzA)U}{0y0*X02Qv^E{LUUb7>0luy`QlxJNg9avG96o^M}7-LV%Xc<$SaCNyLy z=XHV&3`XW&TUlguCRPn6-JWBN*vTXfDUP& z5F-jSMj;oj+xuw6t^mUDR(cTcgk}?V{C}=!=W|2`{WVdFcf6RYd(X5%Hgc28d%!O~ z_b@+qo`0~0b-9ocRpW|`g{JFIdzK4+mCt8DsH}qC(8MOJ(#K`MN3zfyI2uB5VP&9y z+t(Y`1)Z!-4*rTh;z&>?{({b)22k~@=#~1dop@Agmv~#!*Dm&<9QrpT2&0(8?We1m zUoL&Mkai2Ic7@9+LNW}2isxs?;(U+3>d-6|rG+5XMLOexehdaCjf?Sz^}~e7eNFIX z`DC9k!Q6W~kj`$oy`wd}n~S{UgB_}WEsDja>xKSrUcgB;A0yV*a+J>Bjt}L5=7CK3 z-bN4pI^@EE<4~J7-q2qp7Z8zdkU$b+k&lWA#iv1De>n|w29lL(M(4>#BdS9#vFc%6 z=Ar{SY({EiG)VHwn_dw|$Wx0~CVA&dbT`)?p&^Ycq%q*O!I+*$b+$f;Y%HaJQ|jUi zD1-X3y#DA?^e_f@js+lNRUsV7`*$YU*&7*LF%*E?Rix6Do@BQL({{9y4bPaJSU+ zoi&`tm){tU_u0w4viBcds-ro714gm@eJ`*=Ak7w199%Fa!;Z0{66s(NL?2ZRp@pmu z{;Ic3oIzQ=+i!=^sf>t35ls}>R>ODmqXn1-f}R5eh2Wx#kf4GRN}L;DGf^mM{=Md| zO=ERpI4y7G$vYEAIWWZw@6 zwN!(QvkcMjB4y917~fZatdf5XlqRJ@ZkS2$9(lO+35y-K+$%iQJ1U>sMXUj>)s?Jo z+P2)=*+2GOd@)wI(NBI4v!J;pow-q7I_1>UF`?Fu8SUCx@zDR+Rg^Q;j+!FDg8fEA)gs#0ld>zXBjsvF7Y0)nbSmv#p-GwS#k)Y>D3QHZCXo8kiFLQPQT2J84l=FeCgZGj@No4(! z!^NPFBzy)kj%4-&2=hGcTUn`KGXA*fMT1%qtL&!7LC-$QR!AC`l+c=MtK69r8ZoP5 z8geedVQ=ew;CQZouCTMmhPYnfi#Pf3fjFi&{1*a{&djFZ41vRb(Fkyt89QS1=k+}P+lv79ffZ4^AvA} zzB0IJyuhr$ISv8CAi%YCnwJad>3gG(b}wA9UPlefi;;SNTBm}=uK0cZd{&k5dYa2r zOZ|p*jgYM!upDx1mTCrJu%5Y))7y!4nZ2x4bvDAh1^jnvuE%oTHz=h zHc2q!B_soXmDc_KBTrf2E6fzDd~bPKMGD;}nd~MK&`C)%=Yb&2;D{+=Xsf+tA?@ZF zG^@?WmW;zvCI!09%G+L#J!wR)couhlRbL3YlsvsHO-R%tD6!lD|E4AR{*@}zMp-O- zA(;1%Ja&zc#dR(n;T^-qAiERBgpx2!sfx-6*8X^ZwEyd6b(gjIQGz2fK{6zX4l}P? z$})hIQ1FDgafw1kC9GMP#d$copa?EO>v9cbtO~!sS7fJOF=SKSTJLiYNROb=WlY;) zhbh}UG}R{YV55(ipK8d{0WjMpX~v}-WWEA6LN1_E9Kn;6f&S+@U?~+R3Lhd2F8B;{ zWv>K(VRY)0D9Z{}62_|RtKqc?izkMHU==nMT)oSis{?%0km2uV3LTn@e=@kMYlSgz zx2UfR^{fCt=^aI;gYuMZXeWlrT&iof?@JEY^Je47PpDOH+>OR0)5MTET(!m>ay0$y zJq1Z?gWa{yRoOaXsn^hY)OP5|H-{mKW-N$*D}^uO{By0G&S2`e!GqaS;rR%%S?r6L zj88!x4a(f|(xvLrEx{&?VXi+sTWfKQYgmE|D+XXfN@vM!DkK`WE(S&L8yR8s&j9nN z;X=vB2JMW2B)vRv6gk6gPb|NMOI$A+*L4G(%}$f|cNmO#y<9lI6^cQ=0G|%`wH|nX z%s%aHbe(^RF@^VT(}*a|P>VB4*mA}JlC2_NQ5vATKmjcOTXVpF)ZpTi1I6OgSG-ct zL2^v7%^#*~^W^<<8cC!Si4(RpL(a`T1AaVDH^gw{cjq+HCSE| zL31ISi@7--&fJ}HDpmg z9hzC4i~?1RiMNJ{bV{r|-qL*o#nnF-c!eKz_(z*KzxDaoTRVwA57#^yR)l~G%_2yV z@KTuh07*c$zr2n?Q;FxM8o~YSOk>cw9-Fr1*d49i!bL%F4jm4q3*~Y&a}?0y9Q>}z ze`(nuPFvV{RINz*T*9Xp>B#_;%C(|EnhikVEldWySCo}WlU*%&l8@jM(BOrBBt8Al zIF9d~iCA~ajZxa#IKs{4DpfY*+MV3n)^HNTo*^}Hh)?xF@-W<1{T1-#_fcj$&lV_aPql3sqX_sZ!UA$_~ z>EnALzzO1&=jiH@E=py7m?r;Ye~uF7xVKN1D_0p|_Hc#~&++dkFWr?ok??JsbO z$;VqQE1#o*n9OROMz+xGOr+=+u}Mnc{H!oszne`DLx2Tozh$4}GJRda@m={oSC8G?f2MRy=#2Vh zq-Rwky91JYgt7*R|26YyQd0x zub`i0en1>Eh~2{$9`UDbbiq_x`T!RWEUk{-{L?8CJyJ1^j&UnSCl zIJrZ)3oi;oUP+D*e^(E0f0%YU=(I<)LV~PVfh3nvqa4xPRh*P|xNcuZW~SCd6nm}3 zLBD4w{i1B1v$e@Z%~Feq?4YYqX4`s9K9O8g6{%$)YmKA+9&Gsz)#(@6qUAanlKmEv zFkG4)o?gHUJij?sr5~Biht14MWb0-T?=Q$TUNvc#gevenvItV-e>(%MSQQ~{ZZ9Ag zirm9XTG?PHAk2DV{_cEpdup-*zOWUiM1*2gdJ~-F1s~Ob8m$ipBBkg_E`O%ySkd-( zOp}Dl&kwbJC4TXF%a%#UAwzfC?GXr7CPX-rM68jpti7SFHe?a3*aFy;106`_b;%J+ zWKn}Q_zRGM#=W%se?mDKQ{6S7bj1KwSG1Pbg(?wSuXCJM`U*C@S{R0(^h9dduENt6(!q}* zYVV{&?{uzF- zh#d-TWdG1Cw6d1==(^{6IN|8LNC${eEpqN*}e;O_u0aZn~3{iaXQ8dQ$&KusbK|>0)tNZ+~ z#w?Ff6$&Cg1NmnLgf%2XFy87-yIb7qLh;w~(=2Z&m1rCH3JUr&L?KHjX*)<(KX>Ls ztymdk!5qjJ*EsYZxgU0dW0}$lQb5RCvUSH|^$^H*Q~GNOolJ7tC*+4*3i+vBe*vzW zV>8F=Km$rwd`B+2t$|*4iwV;6YIZhhTP|v2^|Z|DDVc&Y3KZ*a^ln8%eoo5Mmf>UQ z4^>DbA^+vkyG_UK0p!4$l?p`>lx-P#>hIBdcarFrC3b8VYK&e~m zDOcL=`ost|-R@tx8^Nc?O}cNo88qa5>OPOhtpt(cOqWn+@zdonE27p8f3F9;7;qAq zncu~V$aXm}o=CCYFC+30E&XWFI%u)~^!!bkd~N(Vqd;X| zD022v97JokH%;R3p#JahLOq{64rCo=c9cTXJ=6?Fp*yi^yxx~8ycC3p>_{vX7hjM- zJel+#9vF;J3_VBM7!M!Se-h<+rf2`82s1V^VeDKTNwum72Yu1+*5E(iel9%Syx_52 z+yxKGb7iGya4cquoiJKAt6TR`q(-i$MG+#n{pS0Xp7?OXav@rEB1D4KlNdgRrQMDi zgZv2NbX@y51-xk|+&8)HWk`Q_jX-2rrseg^d2-ec!by~MM~UoefB$v{VL9a-r*I#4 zad0MpmFiG}f9r}d3XG%f=ZN3rtteA5cl$Y=ZJ+t*;Gr3d-gjnxL;brq385Q`OBn(UULjU(w3nb$P=Z0Z!$}w`HwH7xR*<#4rYSZt3amS% z?N-Gp*EqAOq*mBEe^A5Xa5H^-1yp;~#;<@S4t(LM4ktSDu`;UD2}jX^OEcdB749z| zl5+Er`+fE!bwb=XB5GZbvrsuOLhK1IsFPKPK*!OF|iK2 z&WP2#>9=Z?w?o?J?%Ws?;ueTrOxv#@hcd3+qa(C$?EN>Pe=e*BH~O~Ggc1%-=hYo` zcN{&;>)oM$U-jSx;vb32zpo#^>D@k9zP*#c-2a4buJ$xRF(j40Gt?s&dQ#X8g~c_k{3Z z@k++n7cx*Se_(A3rbtmNb5xIbp~HpvrLqwd)*V&e`GnK=Yb?FDz&DzHxG8Cs@`x6~o>tKyTZy1`NQoZ6j^Lvr}GFyMC-H zC=MF#$0{j(7Re9!y};do#eJT^m)vSdazlHr2ujzCe-i7mnb%5zx)XN976u<8_LP`~ zS!>y^3&u~?M$udmk3mybb^s|LR6f6~4S2#EUM%Wu6 zpzX`{>Xkg5_Nvx z9q-@=&KmlQieXuUR#0hFiM5Xbtt+S{OPxbj{OV*6;R+UCy>OM4o1UCH(ZEr3eLy9c zNt~|KMZK)*2PfRi&!T0Oo3#{2>my1h+_S1rla}ksgD++{CgA<@Xo2N4Yw8tv8SO&&Bnf(gklMbBa9FZiVSvDm9J#^rI!Qgv=- zQ!JuX3i`!~%74ChiJqH>GMRFjAUQ3be{8i~P{VrrH2&+^6%e;!}W z)QUu4WpE)9#x9g4d*=a!T^~oBZ{9WLHy*D#p!S5@2m=W~=8GyxTLMybX0?Q2+r%1x z)8U=MMOA4T?=nb{tEPy%p7%s!rKg-JIQoRd+=?Z4)jDx`g!0QWDj`)_keJC&huS+- zBIPve2rkA85g@GiD1)MPr{BMoe+;qVaU*!Q3VHNWpZqWk8AYHbS)Zcyn1>fd^3EXj z8%U&X8GB>a0`pzYj|Q}EArU&mA@q@K-y;Q`Nw;20K|2!SY2; zA~`wnuQkAgYf6<@vA*ECB zgzj*4l|Wf3wwem90x)=^lmkNh-^j)EJk(s#1zujiwXjKZ`MWqF)u?q;-qIEr6E)#i zQTg$>EW_9Dx^4WG{)tz@xZKq&_Uq@Ea#n&TVJ1qb{LH=^S;O;DLZ%-VG413H1;hBX z2AW=O0X}4gu+9MJV)mI|f6VcEzYhI>MC|sxraCj?GP*JKsvWvs2&dfyvJB!dX$(_n zELiz`Yy;BE(PBS5qQ>euva`ot7~j{E1g#;*aj`f3hE#(vLpN@867m<=Dj& zKX)pAlyuK_e*pJ4Ap#K~UC{4`z1;D+t)phTX(P;^2(}s#gar_NJFc1`2PmjS1-&ht z9D30~G^e&rq5U+ z5_rgA06Ujie{X%${P-J!%ZRonw)0>0hB)vaICUHw|MU;^RQ~!48ASVjdpa^H2+!nW zc<_ioyB*3cp#x&Xaa!VK>Lxk5ReE!MFB!181LyD`Ww%o(j1ck`Ysl7x($C-*7qhL} zOopcG^P;@ANbiNfs-Nh&uPJCBxp&F5H>?zpex_&6?HEq)I29={E+~)N^SjOq zT_djRf1&FpsuAX*d!|g_=X#!*@iT$sCKyrL-eufuLE&y{Rn!=EI-9s-l*wS4FJYyn z;>r?+1{PUV;%;GhyZqXc01qjrH;}MDwx@w9{D${<{0!zozpA7S2J0Ng85(BBJ@c|+ zSK_d9;W*#i!kBOq7r4}X(FxI!4vWn-S~emqf6CzE>7k?DMhNhbEcHCG3s+2SL|vQX zCg{W^5e-!<;BC>o&WS+}nJ6uSid6Us-x@1ev|-RP;UIvQk+xVof^(@Q#_Kx+oE3>0 z%%rKmyYnR>)dZl=S$R>`_<41fsB&z|6ll2LP_Jn1-``ASKB)kH_8g%0dW6;+K6M@T ze-14m*I5(%fPQHT{PI$asRg2%rO3%Cn!_lIEQzYn`%C?f$9z2^a7@12w!i>)CVLsL zWD+o(>^HnW%uj3m{oviAXG19^I__6f5ajjCIDK8xvM~1k<}%@@HxpJ2Ps}d20DHbh zy85^Nz<$*xoKR{Y7E#jAAyf5(g&cvne;j$@pyp@fPxN1}Bb%N(Ex*h9>9L`RgNtTj z6aHuBlQ=o6yrW7rkT{=Rv&)Lt03{4QN+h54b=POK)ls79cQ$OC11XfoxvkXsccHp{ zXc$*V(gRq31gy2CEY9g&PgJx+DEdv7?bZra3qKQ;EZv-UIx81|=djNj2Rjaye?@Me z1S6h)rQT#;>>n*-C}yw(YWIy;@#7hpTJVY4bsSTD+(cKHJP$sLY2b-o!2DUo*(}AU z7L-F(S$Oc&7gZ}isycKHegDHx{sx~m1}n<6--|tn$V|P6zX!@k16HLPWy!?TH?+T< zPd%GQvA}@o8Jf;tzxRPaEFW)x-&p9KIk3Qlh zcVr2mcF=@)hEzux_K3mpCuf?zHB`ZX2R1xOr-FVSku0feRS2!q9{aRre_8|)D?Zf* zoiKqyB_=A|j>Hbq9#UuG0y1R89`GaH;4>nVWGgqFAB>B;CL&x1?}EWZY@2Sxr)BIHkZwd}XC($U45(9WQeE0(hG;)4`~)3R5a zQ|^JJIZ@JsP6ducn;(_xgMJRE8ygX;Yd}kWU@6tX7pRV#7u}=Df7nMhAeuumZf+yJ zJ1C0x?0e6%x@lv*l}~%5ei{J?M$o}QrXVx%k5Sktl4em}J*scAMX_DFL|RdvQRdGp zfOmhgPB=$s`$7Z%Am?*LurXo>-+rla{WxEdU1#scZPiLD;wFfW8g>l>HC0IGXZR^D zsTj-WRt&x#I}Agcf4DB#UP!@n*&qiZA8kcu4ig%x7ZmBs*fV#Sk`lly{AAOhM#SW5I`dZ8HelHAug*l z)_wU(BJ_zdM5eV+1N@_&>^Y7QHp%atpp0cFQ2PR|f5+|CmxrI6tjWM*RDf5`=@$9e z5bj3L^Scnk<+%c zf0e(0Ctkn4XxJ+r@mQ+`)e6KXKB*_E3NwLcVsn|a zFTAK727!S&{YAuU*ur|jT94=I+{)r~w)$+@f1Qm}F)hG0idH$vSj-;3!ilbC!W^0V ze4XH`hg#D5IA53;P=EG*khqY3T-2!Qm_kbR0+>Sm_(7>0&XWbW2_68jDpX1-&}nDs zT4k#f(Z>)Tgv;Kea>*9BNVY%40QR9e^R%aT|%99uCb2Jx5p-X}uAAVF^Aoe?j>&7Uzdc&|}r*Uuu5Cj}kRJ z0JJY}=+NI`NYIwC-xX}EZcsV)D$x1>c}&xSOeUe%?ywsVL~<$HHd0=IqZ+)Uzg5Y6*E$yWzZzXxL>@=|WrAa2sS-YWWF3St5(LkT>`(wrlnWV`;4 zYw8FU%Xn3nXU*rfk$9bj*Dk?(e_gF(&YSmtwDbsQP{_OeY)Uw`o}A3H37O%I1ppTz z+R|)hg2>=>VF3QSnQO^0pFm}!-v}CZDYJ}1(_day;0AmPORys`po`BVF)_uceBmb4 z)X#UeXB5H9bX00ia#cH&5*Uj?Svx*axsZ2EYK;2>p@dCZR)+A7l!#IhfA^dO#Tq*H z>YIJXCWN#4IEN@=VcApV!{RdR*-P%uGxu{8kOEifpiUWiY)HivA2R-_408_|M-o9t zg7Q9nUsqdEG`(*vKg1YQdJh~S}FE_X_qgxHF@f0g%2N33+Z9^JFe zCwYgMC|C!nci&up?V+2U5PnH!w)f!pgN{@!EQ*p@V;wR~D`Gy_81j-lb4r zKjH>aDxb6hxx!rIk1&2EoK};d0umD=es!XZv!6(V z9CmLUcR48V-WC}coAs_9Fahu8wwBkP1g|Bk+iP6?sJ9O zW>4sEQu^U$YaGHawDdTG9~Po41TeW6D%X#$L-yJg=i9T z=e%n|wdeWrqrCcAw1UQwTWo^ujVAkAf3?@=a7Do`?d4&!9FQsgfl5fyO)|sMTd?E# z5W4C?w3n~OeZ9QUf`MXB!Uxx>*9Q-W;h+2Ec zPw?P~e@WpI-8q{z(JV)B0Y?S%-2n(F6e$ZhzG9RBJ)S`bve>%*7qT5e?eSuElY6ovc`qAtBs)^u$X-x1k(G-$oL4R^i;>YIeK33I5?de_PzJlzER0M+A=L zd;)tsO)N&7pQps%2^ssx$i^Z;6@+EuX%HD=R9n$}wvSzeRpb*h67wLTs6y|AcnXxp z7=J8>AW_dUK+wNE#gr5o`|T-QOU#$ee{CI<)$mUZ2@S@5Ep{vbBd{SP5%F6LL|g#K z(W}44JgStr4l*Cpku$gl9@Ot)YjB;|b~>=GwKwCq&m3yVYcfxpCiamI1V@FKD14Iy z#pHD^Nv_|EBo4Sj`JWPBZv+6JQqM^^E}3-z7o=nXL{E&R9D9MkrbpG3_fdcEfBAfM zh)W&@=7jIId<6~iNb8%p2v_x;a2$~%{mIywp!VyxyO`=-F*{`W?@vZo#0nD`5_Hn-3b>!2f1ZKN5f`UUDEbK)03?4rx#If)j2&&(ksG!pMIXBAWQNb(&q#+ zP9&3Ujs}vwJ-`>zpNE2&qy0bs<*)v5_wWDjQ)j)gc{>Lw?|3*t^rN zyDVDt#;dO`Y>GO8WX6}s)Oww+RqOICZOu(h!g}yiwyxWR&ycKj19B8UJ@M*?J&JrO>95vB8u>G6|{3*$XU@Qd1OAk+>k4 zX5y_UG8W;Hgn|b=@p!?9JF!0+^@W=PPJJ+39}ZVbbY?zKAe}M6;+df12|0eIom4v@ z|E~m4I045;e_l``5wKF%5#dx7{_jH%q>cgq#XlblNCljPTNu()S~;lLqpJ8aF0l{bFtrWGATQ|0r1=THB7?2q?8M2rG1 z0QrC)4Rac=KuM8KfeUn1k{?}&DaqEwd1?K}RDXb^CatO|c4Ie7fvt-I>Quv2C1(tB zh}e##e^!dgI|o0I+6z)&jyWP(>58HYnT7}b=xK_I%wmsJ<3Wpi=#fX(O>MmX8<#J9 zby;(Dblc{-#V@{o-IqS!Fm?L7k2)sk@vL0F@{hm$LwifS%Ih3*&>_uD(|bF+B7wp? zk2<<@@v`f#zIIi6PbyWwC-3fmK5*~9A9DhPe?1a+mG8x^5B?Pj=6v2lz(W!ps>7i3 z4iuc~a1~~FBtu*X<0x)b6^| zjxRm=$g@v9JF_vmcJ;dJufA&KYyYdMub2FPnCcxe=ujjFCd5beTPC8yG&R@=?ruDbjg`u%5)520wPr=9!we_3*_fhCP!Q3J zlsJG*A#Y&lrs%E5pY7ODae${rh1a33Kiy+bz&{; zYQkC%x?(HR3i!0vt_II52iBJFN=I(_noJ?}mF z=u=NU_QW;I)_m~fQ++w#QHQ(1Of4c zlAOtGo~Qv|T@CR{`@Q*1foRQ|r7NqNrd)pAwY%@LXICzB)CngoUbg1pNB(>4$tN9n z@LTg9e@$bPzpAFUt-W?;^So`h2W9~qOxOM_s zrMDh&q%RWQ`{09k_Lem*l&0J7h_^?kHcI-8RC4Xwf0ik8XYYORfk=NlZ@1mfJMFo) zeO*gW&o2A#_s#3CPiCAcvu5sh&_RGFoC=G<^Aa%b63N854!#)xBwoZt#$#Rp!5^iqND`fTDEOjx!|^ltOe>4wW(`opBcKL-BDGv)Ff> zmIR(Op=zJ6rpDJ2b2<_|Rgnlq=NiI6@>RvNsa^`<SsZTsJz$eyzTo$? zws$vFH-wBwOER4xmLZwUN2|k<$swDICE`_8f1y}RAVfG4NN3YgQsxAmo^ATo^6N4zF zf2G)+N#HD=#iE~=NU`-Bv7V#|LpuD&U;ld8UVFS{hi#@sh|iGta+Bu|UD*T^z9#!@ zvClsg3LwFt^OXTC9yWsE#Zxbl&bMT9zxww>y}rO9haE~G1z-wGt;~W_k{rc1Dhv#^ zNs%V9&j^MpqU1@jhfy^9f4#x#U?!2KFeU}@5FRKx)tO6qgCYEgt3078 zwSK87=VRvbNoX!put!z2DoWI6wjlKp@=ix8)16Ecc3vOBaP1`&yeH#?qrrSCAN6?a zYH{yzI@^2U9ubeP8htId^8?@n5=Cpmt7B=(nop0`P=020D%uL0c8=P#gwx$#7HB2)WYpSkJy$m zzwwLyW}2yS>+w^ElI(M0H5R9Qf0=D!y5eBo7x5!xAUdI}1yFQiNy_CC`Ft#$Bo!|j z*lv#S6CvCIFU6yJvrfX7Px1lINd7w%MupByE*=b1-yxnxQ4;9s&BW85l*ikePWBYC zl%dLjfw~gObc*?(%nGRLCI$^RlZ>4N7+Bmnj+u-EtORS2-d%X7$gYNIi@K)h zYpmXW@*9a&MSrt!o9WZafAlw|7?>u$u$!g8mPP@ih%tJWlKzI7n90fV|H2zfNP;lt%M4{<;0<{K4e{;H&igO}1sVv-v zoXAXGsXgcMQSE_Bx`7~RNAtjfnle2aB-68ydotmhVu+or6cY9;E}JIhq58L*Fd1>0 zAjh_<8bulvuMFdoAyK;M!0uNAgJWR>~2$1L1w&n^?E?oq^ znKOO5FXIgulrP39;Z>y|ATKs65|GMj%@1721kcGl#EULKe=6ZT4#$LJ2B{b4$Di0E zwJO>5OBgq4w}|!@k%D0A01m;_f07~()PM;_a7Om}Lxq4(j6__Eq9qW{q;mcch8}Jj zK=BeM#u6P!Fc42k!e45J3wQCudc?_DKA6dfq6&n7JAq&jTto~MjxT7HeB8otRPq4Q zuT&PzF-5Ilf3QB_m&YG8DFVg&QM?z4>deqYfD{*EF{0GD#E#Q%db-@>LikI&|yrd?Si6%5^S$ebM|Gvu01BI-hWS$?j!5 zqI4P>%ln|x>^O~^VcfRg+%_D#G#0e<%6xMLw6phlZyco^71m4d-@6 z*pjAw;OAf;9C?HN7{iONs@PyU|lNPWZ-RnxEA~krUKg%XCxvq z$YLtGD4IfJE_rnX1)=%%QB^|II+r3?%}fxZf7Ql`Vm+Hi?6^J@L^^4DB8Z}eJacJBGQ%olHMV0Urw40t2umF^oFs3%1afWDXa z8F;0i+*=n1>jsNeU((lh4_lXp7qOcCNMOTH)aA+AhJn7AD~%O z@g~U!tEbV)mp`1cH1}1GX6m`zsZ#uB!*;gxTa>eOGblyA6Lf~uMF!a3L_C?n{3(^kGFfsHh;)lrlfWCKEcG*YS(#MlK|HhD=B5BH zzc`}sVof?NAdYBTcty#Ae|L3f^7WOi(P>lmd;5MQH4pNJ#SYGkmp`IvFlrowb2fLk zx03rATrUf?*7t>;OsZ_*;lJIp_q@4>?6Z4Q#0hzsPqOL`!d|vQe5297n&Ggxp|_E0 z(P(E7rtsAiXAHD$7@|ae!fY8!7h=g2(QbHJ^uT_I)61q4IB{iDf2Q`BpmLS%3t2Lx zq1=49-%m+GGypzjW5q){$D(7OS5(WAC@`Sx9Gs zk^xInr~73!mMrQfDTSM=VzN_mWY5p)8o&Z(%;KmX$l}3te|q?yd-t9<{~denGF9*m zhf5lY_4ja@$=J@Canaw1DM^u^3gnuJUo3s(Tok($6qDn<*+OSL(a{}m?~UV86~}ps z7=N-D`9eY-RO^y)5sM^(7kM82#EwXrFu)C78)bm8nABg1Tl6X$+1s>NjfMieWQy%3 zsN0gvdsbyLe-FO;^7MJzym_y^195DXL_|^?O1xDDyN59>TYNJTd?Twni$K8BnTp+i z@86EzYrn&`-F7-5Q|s{!t2fNa%#gmDW&$+g*Tg0M0QjcpaZ^&+=%Wdr5uG}LcjO&N z6!O$TZ0YFe>CGkL#FWG-o@#vlB&{n?Om&VRX|4U?e+-@rI69e4{0+41P-!!%ZLMl? zG|XYd*An}Pi%K3x6N&bLM-Z)mV&Cz1bmm@Ku-vJu+V}8%DLsIPpZGDzNS3%lF$x)- zo(_7ujer6qDg#Rr_Zq;vfa2Vf6<4@uubE6Bk)EYFW4bKrYD(g>*#E4>+0$uVUal5;8c!FRwxp|%{+>WD4{Ho zAO)7G$^q92cu9srihW$Es4uj!I1pt*uCdeQNqy~`#dBO{KN?%O-mW4|4c1Qi6OGaB zMt=)k9vRM(aL;j;CGx-c*T0>bhW+>3kFX=We>)|iIS#LbYiP8EqNRGcG#w+l^jlZm zfi*_A8)mbjoRB<;62icWoenyk>E8SQ@wcP*-sgzzc9>2jF0sJlsAwJoiPj*PewySm zd^2>$GOlOJ(}>JevVa>m0}=cxJh zxp+0=3*wN3#`)(%Pq(E~`yO^+Dkl{TaOjj_foGK&=0?WG^R`q;phUYO;28=jM{~}W z{u;QiZN61|S) zwmI<42ASYZ8fP3y;TdKu;tx(3NWug2&3467?VYiXuI}FMZmd{Aqn454VSayIUCop! zjkVE02q*)NF++L1D~&)&NfIr5t&C{Ou*+y@!U!j@Bs!L_dpz5gQ7+MqlB5E2f54Ki z#P1$`tUd4B|B!a>1Z6nXYUsA)2uMBK!^*Q*dD{3o9?g+vL# zVCnYbuAd7#i`TAx{@MTRJ7>-@yX`q65URprE(uH#fQdgv8!8A#jW8P(6DA@J)C^q& zXX1rnGO>xx8vzQ_g#1E;N=s+gf9kfj)}F4OOgc`W4f2rRUy}CBc|;>WN743D76FigD4Dac(dz@0;*yUoz)i)0@8k ziRYJgcJKAJ0|ODtRpLfYxTUEiuE}{NB2yw8w6c^4R>E*L<%c!_o_ZX+Hed*Dl2Dig z771@ISnyO6pxT@BMF2aVRcqG0@Z{s$H#Q%>?;bleL~D&=)07b;3Qc%B-&AL}N2fj% z)dK?VZns-}KcpJB0+&C_(|@4wOYi>xHlD+RAhLUPuWFmBPG6*GJJh-o$Ki!q2O7jZ zROFPIMuB--A`A6T3!@O2Y(zszBGYPf#Skq-;hT|%zqB|<|*0M-lduK zRjHBYQSMJOR8X9)&2lZCwK0_~A!vI+N^ZrC6@^s~O3MSYOGIpGDpeFN?!Qj?b(7zKL)H=YjA?i$J6@VPz&Nbj$}V2 zwLmNfAA-lje7a7q-+!9XpMqgTJ{rpM_r1j&9#eB>{DqZKh5Lw7&BjN)2uo-SY&I&q+O{ei3}xPrRdu;rPmN2o+ym?)eMwR< z10~mqitrG~BY#z$k0M-qz_~nWeuN`krI7i zb63R*a$+}C>X$p5NBgWZr?)5Y0&?HEYm0wPp*-Rx-!*2I=5UzUyWuL#w=U2Abwcf z%2LkKl7A`?Mp6vcu%W{splGu<_a0P>h9kT1eKwt-HR;T7{8$rIh4=tji#B7Xl=rE* z;HVY!Mulyynchafz&_=_rA(|%b&uP|5JX~myD=l5J!$|uK*Yb)a6#gn)w(hehgluK z5qt4zb&UvEHv6KYEhbu7U)2+rx<|a5s9L;YQ1sj^J_~=B#L>!^@?sooh+pco+l=2G z#)-}DN<_EiTV@+`Sp_zIS`g8N)Udo9kjndSBcuI|40Y%r6uR%6Xg#<=VG`^W%Ux_s z_7Zc7{+cM4fWu&^)*o!it!rusjdyZT5O6D1)pv3Gdz77)_~{w%lGTIFfz=2$5&fHm8a-b8}P>1IgV~ z`~I$FSU~Z@yk9~M+U&$`of*!jeD+X@+O^*iFrpZ4z`K6oN$>&wMI0dPiW z#bqkIPQ7iB&?57=k8$v1nD>c#15#-_jBsa)TiJiaO)eUJ2aGC!v(kh9y&r3?TK0oU zY!1ABGjkw~7~<}d5VnUC)e0o{oz;(U7LLo!IT6}nN8ha#*-Z9i%RURbqK(N zw}3L3#E>3AUGDw2zDaK$a&S@XK~6-Uh~f*BE!gXP{#K4F+B3(G~0=xm?(s z&_;hn`m#mYaxs=X-M`vd^Euaq>@>`98G%7ZFmBpah?id19+8k2ycl7&&C6@8_Yn4H zt+Q76Sa4O+Epf2Lg3EVE{5{9t%#G>K7R7nC-#CdNQU_{+!?2l4oonS6a8h1-vRf&_ zaJYwqFt&ov?j5~we?QDJv?1AE#AdbFImCY~-PQK11PhhciI2g?^@N=dAc!h9&V%R| z!SG~k5A~J5MJOh3`J19=#c+L41n)etQQ2S!-kQn`jTG; zRjI5{t;!HF^2fr%pSY-tRB%@xDG~m$7%~zecC~1zi>wdAK376Jufr$yVX&A?0^3@ z7lQIpK8oS9yX(oHz&T!C>Z^w^?XiE`^LbXbOeomHsis&RzEF#X(X!<}M#+xTKu-SV zUTilrbifP-G|6J)3GEmHxa2)sXdG#UJIQ9_Fkq!gB7|c^euPwbXyO0f6Lg|Z+Xq+3 zg8YT()Pk0(R|p$Zj|m9o84TTrH_=fcaV~hxm7_EcCr9_}fSFu;c}~0pxk!HwHJ&B zaw%@UMO*$q^?5SoMzJ7aRT%V;6wgezh6&o>M+jG@PmQfXQx#B%_#f#pu~%-7o%zTe zOqc={TqE7sZxs`gmDMLrGDv?QRz;XM$fyLOxkOUk zjM&F267Z5Ws2Q@Q@3pzGF6#jxZkoMp=B!$hk6P1 zgpdKwUnP77%nMquyp#Xxhb|WCZ?Ec_2^`%O#C0ywp!5q1?7>;!=I! zIHRE&5#CF(FLCfeJmv3MRT+0AY5ehBx0xXqagSWoWP4rJ zDn&xSC?w);6%Q$}-?##K*iUk{A=#wro&~if4O$4U!e3uYJ#8enwrgc46ovd;7c9q4 z<6o#F^_+|>w#$Wk1W?xm2~nH1&`79uT3a4=peX(Ic3OY%wA-D5=#;?#-;uS_9;SYl z>1cf6I(RP1f@_+F)u8KO5<=fgUI6SzSeT9kt-u+MhaP)B|LdaLamnh_0zL3Iee2FNulYVNz5B!)zn7_Ef}KHvadJ>Y6R5J-Y(ACj))^w?Z+PR{NX2oXpPp% z3SCTX7BGLP*~WofiDl0rY(7vzB)zv>BUju&7GIXqkUcVR1Gx$)y~445@mRM3kCc+h zoJl9|iGjDcf1byIO93-E&md`X%ecMm#FTfnwvzxX*p`{hF7Q4M*v`UYK8el1L!Mf_ zK#BknuOzTR;14)}=T{H^g)SCX65jeJcrbKV0lCz-t4m?#OG z?v4XYf$_MW|L66@{=O7#IK-5}4@G7+!b7+qzi$Q1wlnqlMyxbFdv0I&;3C}A94n2X z;~1B)fhLiNw4CL%Hbp)K7JiIPcJrCbEL5JWO8uqt*ZLyx8Q^fjgy3WC*WJ4`jSm{u z`<{PrcD8CZHQWxgqbjJoFv1%whgkcu?ibGr3s>aZ4H zlu=Vqp;&xhv4!q68@-70zMNXAItHvW7aEHGnaPNKyfJe@|G`L2nWcZjXTd`3_%BC9 zE>2YQzPKhKTKP7KZ_-t#=^A%D?ni39LQ!OVGrCO`r+X?lqM5L#Sb1Z^;#;0>_$V+t z9=ZNn<4>w%6Fw)9lxXzXvCAc#^6<+gEvpD~dl8TA6vP`ennf9XIxaNqj6{wdLWY-NwJINUskju6xIeKt( zmoa4-dnLAHuzCxrLqpe=wW!QKSzVE0ar6F~uow9wL1pc@=ovJBn$xMZ;mCy;1I66f zNNg&2Pg#0`klPI33sSKrFp|fAKbQy^@7{^{1x^$X|8W(t)P8@hu3cwyG#@Wmx7_)r z$F0DWyb96o;TgD4(2e3aA$N8lMGr$*C$GTA3p|H`JQu2Rqm%|`gckn;5zcRZ8!--} z(T>O;US%+7=|tqqbLzlSD7*dd2MqLSKComL)fb0wtnRVvRDY$w$rA_1Z8(gW*LO*A zzZ22|yYh}usGxu7_V3EnECZWwzz|Kut3dNK1WOZ^kmi%R_}HIXC$}~5uj110&DH(_ zaXKj_1ph!0=oj5Mb~v!~wpPvR42MZzCeY14Am2syWU^D+CccDdlLbwyJ*{spw8}i%%}4`xl-4VOg>v zX6Hjml=I={tDD)fI>@>N6X?yE>@!9=_!qJ6g;wDPp$LbkUnc9teCzqC?`G~?{V|eQ zojCWsn=7)moKJ~7v1gou!7umQ7W(>a!vb{Pi z16Rw}kNto8W?Y61d`sos`#4e7o^M1JxLiWiG5cbU!|+#Rt3yw8n-77S>>c=}j#)Tf zi>ScQ?g>42-M_p$=5iEkLvoz|?;ZNqa1NY)Rtt_8GIN;Jei|Uq`%F_u%CIN{%G6#X zoZ!P{U@~&A28)Wf1_oO(mN1?0vBa7I9}NrNw4Z-u^WOCj>5e|4l1nCO+Ju{UWcd&Dp~3&;-z(yC&BB2k+PjedJcs_DQpe$u*ZlmG#Q3CsT9Fr; zLC#K(_U6kVuB8&p&rR+ad#7jpOqfW~!rCf>G^EM0I7Xn#eKL==+W@!0J(_qVLg#e_ zPWQ6~x7!;>y53RytTzz-`==pb$-unmim-QyEJ{G{%Q+=f^AU+c7<1T>5Y$yLMza;s`9(bqJW7utU7de> zp`3-6pRaq={J>rL$|r5U&BC`QhZg;+clwZx zn+r=bp)AuhQ0MkU_%!bjfdE`#xuli0uZf3Vc4835Ws_*$0Wno?1C7ubO<)%R9w(M+ z+N0Y@ov)PJ$6ci9teQp^azfGu;oX0Bcmb!5kYiK+SoA@zh<&}Ga(QqoYMpk@N($~K!k>WJ6w6ggyK5H6szi3}K{q4#{Td3_T! z(_G#~M*@Q_oazoL$7{3AMta4rIG%7rqUXFAcl7LkS;e-~WF}z$M>d&w^}T;YZ;w;i z$|mS>Irpxkd0StO~aM)3bpnBtdOmidO9h~B0maFArF-zB^c0@Q#K zUWZ&K&CoV|fo0fpv9`G*SsjGtdwIMHIXs2(%1p>(_))`miBx$cy=1-UR?KVPs&K+* z-hc0AS&B;;_AQR{7ear3tiE;Vt_&La^Zb@4l(us7{7jPOvkC&**{7B6%#qaUcDBug z1(JVNeoS2;UYomeCQ-?B`oj-;KsRzjH+l6CqOX*L&$%PW}-O*yluGN;j7|GR37(^c0dAdpknjhmZ_jzNdr8oA$-6{1l{$Kf8db+ zFGKA+h_$&-_V#k9TI{?$zDAQ9iPPlEBU8^*^rBdRmY~HAQG}2@HEudhoQ(6a%ij|* zhBDKprayePXk33nBZ~fY=iKE;OHG(x*kMV0SSIbju587+8)Z9)!_ONw_kFgp80@R! zfL>!hRzwYf`s*bw{|%Z^fKYQ&^IiCj3rYJ1egWskHQ;h5z;fXX@5u=zDtRYpH(LCC z=-Ea0C&!8&D3Pk%-Ir}oBs^zrK# zz!T}(aUP_s&XE8R_q|*OakM!G@@V1;Wbi>mD;m2gXU#M8@F#wPw&d) zM39lP@j6aU#>SL&B@|SSoJ_S}Lf3!BNX!w_DkaQ^ebfAFHQoPup(A8?EA1-@ad!WKq&)aYgSwnWvDrXE@`PY{ z*}*6n|R$zeQ$itW6}YZj!aJF_wZ{Y?Gv1=7F?OVlsHRdJ^UgWF zenv;dFp>Kg&SfAda6LrQwk8V>()%4D-1h`g46~AGcM%?3D@2~-UGirSktR#xXgBr9 zCE5O_2Ob^}qff;q9$fsJ`VPus^tNQY>vBYU%X6n$7p)awNwAx>5;m%Af-xVkG&Ddi z29|$pAIhFY`+M5r`fIDa*4ZlOS^+B!Xh#;`N%h(!&X4O@js2hrh=g z_8K!mU>E*0ijl=ZiChRx2J+^rjtUS7)Fpp+gYT0Qo-^qTC6|UL8(wSdV;|W|_M@0v ztVpN~9u$pEA^|2L#JC2nMpi7XnLpQ4PWG12M0-EJK~>lbs?GYYamYe$F9r_@!I=n{ z+EA_T2`i>fGMGBOnN1818z=%!zPvt~esZDBVsz%f*s*eva4t6unta{O|%W!vNMTY6A#fGGoC0TbD^ zww>4_uz@jtjOsC=BG76xq|;8X@b{+v#vvn2@PUIC&(Y47OL1f&2%_mmc9cEPRKq8p zH4qm+ogdybW)U|o@yzz+wrmC>d;)(dE|Q#uiFFTk=J|DCWgl?vFt4n3>T>9o*L*fE zGG6m9kzaV&?ZjTJ*@|QEk8nrXIsJGgTzr7v6Z8$bE0_w=}C=(`ldSnAE!+4Bwrv)7$wuNd7%Ax`il+f9XE@lmOD_TJ>p>H)m6rh2SmY66anV`1~Q?0z_D^Jn5r_n@nou24)DV-)?PH)E1~w zTy<+ZPQ%7q@Zjlr-L3&0ZJHp#DEyL|u+gQEHEg=l^WC{dch`o##!SP1pHrj7-$ z?IAe81hQR}^f`aY!-yYwyONoEcF}n$e&NJ3zDxN>@`=jMM&`5^n zSBjJ-H06X$>BNK(8C~R}nXn5pt+>su0xFdDB8Y*IND>HloIGafsldQc`_mW`=^JXwS&7B-lkn0Y+}q zn(v^(Xor7!!wsbGUk+BX#G&g_K!sA{!ve3q0dc-!w+AKZQF;kKC$CySMt*qaCvB`t zZoI=<5{RCTzqQw;R97?|5R6DhGetWUZ~^W=d2~#f-!&L0zWIh@;g5&tmI+s&&88@k zSIIHEvj(K?9yzplGSCwJ`Cx8;t`vaA{_;Y)Px*f|gDplm3TSawTb}5jVVZ`R1rK9J zd4#EgA?Q)F;-_QrEkO<6s{{mAQjDMRHEsTe4rw3b$nK}o`fHj@YL**fBPe5_l$1pV z4IW2QAlTj(zOd=lsA2AIX^}9^{};g#WCMAitmnGSD37`F#=Wb4{Eg30g1 zpjedm<6KL}{csS)ShWB)ak>PhG}{BwW~r7XvD!sL@u8;r_-MgO4h z+a`4yGs#^NT5Q9C*`VPt-9nbimRCZEJ0F7n4a@hLrKt=>j5p7woN~f->+_)PLys_( zlYb@CCDXV%is$$u+Z@O^$n<=uv)z6@ML;U!u7G1zkS|?9Ga^PFcp8+ zGV^_z9|gQh8EF^d^mR-EwSvp+)2%WtOZ48YFR)&oIM50N_oUSpeV#Tpxmp-p znhBH2NJ)9#hs|56isUWJS+)U!4TdX_6kHVi`5;^rQAhX;u?ROamgPdG7$p|b}jPm#Bi9o(7tQrcc1o3uftC= zy02Caa$5AFRlNAKph2$Fu)eO;J?*sVo-bLn#rDF7qcR2;Ewx=2&`4K_DZAPfOBXx6 z`{w*~qmW$PDw9`aw`$@&sLw{oHK?G)ul3hQ&OXHK5679;{xnMe_S9~VXO4eUIdrxw zP+%Cmuh&m)@10h$ta_~0G)9V`#?5@=Z{3$U%^rmSO5$=@Fk8ogADezx!3OV6hWC0C zyk$ozNpI4{6BkoLeOU~;1Pq5;tyea@O*Opx-6Z5;xKPN?Dt|TUv&U^we{PkW08zx` zpyF(1jEi8yE4lK!t3_6ck+y$-HAN75u~C%~et6zQw8MM^P+i<)>Zs}Rmp&)H2a5vx zTf2^)k9T7)UnhR@?7Zdx<{cYTY$!EylTY(hZQQ2-u-Txt$kK_Ug5qoW*y+COsx7dnBM+Gemdpmgtj-En{Ag+H&y;(^TP z=sNd8utf{3XfTr|jEwsI(5(+0t+W48qn>D`kQ>rr=K>JV8JQ~iUbHx$&p-^5nX0Rb zH^l^tTdK(F9tBf=-jCr0@6!u1DPIW98l?CSvaT2uWaa={g3yloDo&ws+V=F|P3BPo z#c)VKH39F$+uYKj;X{8C+*(is9~-){8Kld3j7BL>FJB`?X8)wmWN}o(S_;tYABJ{+ zCDi4=ieTw!Wae%DoB;#nE5iu(#w01KodP``g@)g?TkZ(25Wq z*n-N|xx+Vdu1w7=WSc1A)XmpMo++6z=>qdQaCbQb4NHLCDb;%E#THt$EP~nPtSMq# zMR)O?$>HyaoENfjFRn+~x3R+(|Q7oqsfs>xQ7zZoHE6Dj_gdIrP zTNg}vCWA;lLCk;ufs1sGf-fzGNA6gslj;v;d}hcN8tE_}et+rRfbLiSGJX12T(+14 z4@xF>qjHwWjn(xcps>^tt;a!wmbLZOG=1M$y!gVTN2B|XF2SRr6^?BpR5=pgCYxH? zaBkRH60;U11Uk6e9m8sL!UuZZA^x{9;ZVPH*$1CT7ZZOc%zjf}M+#>0pU~=%Xe;TW z$xCoPUWC9wuoA?n>@#zbJZQ2Hg43z!1DIf6ZAs{$Sy^zzcD)8zX&=IsiRd=6!5>|` zZjx)fN3O$yx9J?GIeES>brNV~!i5WafTW7P!LzJ#|4plIUg!$%9eJb_hZ&A=EM)6> zh7&QJr*VH^m9}_w&$#Gb93*Qn&pgwoTHad|j;YEPrJ4viN1ePpw-}rpjfS%T@9%~x zt!sf#FmS1&B(+Ihi2GVK@iVpkNvv-Y#oNH^N#?9ar4z-PZIv-Bot@2X>N-pl7HH?k zCzId^061bA)JlEIqKpngBz%FA3swf=N81O=&-;CmkU zXI27XHv(;jE3zVL>qO0D|LKt13ld}+K(gbbaV;h*xMH@Qd^_czdwYOPB{ZPus2qQo zQBTxWQ6&jzdg#On2`w-1%I`n>as-feL2=Nzo)8RD^{RE>7%~E~U@`kpyMC%aD)S35 zP&lm?j|YN?xNPeoXTALwbu>@NX<&(dqYE~E3-G_$?#omr(PN=xLps}zc~r-o9={v{ zO#Hb0+s*CJhVH#D#RVE-Cngd(_LG0E`9MzH4vHCG-nBtX99|x zvn!j%+1z>3cI2;;QcaD)H%n-~p)EQnM|ih>05875DOdV^xCsV>kr?bYnUk3sPUN9j z$wm7%2Pb;K!YvwgXbE*Gs&piTQpg^k6R6qqdN%gq+)1?l=M({y0kVDdtf!&S%io{l zHFPqy70?Y(-+uup+S;IYm3@C6DWS~HVL;iL*-cqdDwerCN#LKiJVX*$7^Bm)@*=%e|r|Iz9Ccvxb271;OND0*}*SH3)n4Cox zd!vMf#g_Ab?5Y{`CwzbE%R|UdVbhP+w)D$glyFmrgIxJqZ`_*?qC$E#9y6~{pIwV8 zn$;&AiiThuK0AJaIIOH1A(vR(7YZyL<+F0arcjOoLs_=Us^PkinE3t2x)5|8trqk} zjk9PD9#m9EseNfX5G(G1Ejmbi(h{@H&r_F}G+E)K7%BnF6ALiq&d zwj+lKL-6G>(GpKUvTBBHUS%YfuEdyHJInVLsM=&Q>JN-$dDl_w#K~!B42fvPQg#H+ z-+tQmM$0H*1%7HvdNiTHUKGGkY)NZtH>N*C9$U+tnJ_M}jrGtE7hF&x7k}l-_ayNH zYDiNqzPNvjEzXwWJkmdG#Ef>{2*J*N!F7J3tx_Zxp7y9AaUlgiS;;ZW192GYt+zeE zs1gvJcPOEbO@Kz&Hy~2QX{vl9n#0}~eNb=v$2KKK3j?l3D+bN!p#L+G{=dLn>#4i9 zBX1L-3N%m&1OGPjk$gaJ@`!4>aO`VedeYE?hVLWdKs= z#S6+lGd&8^bBQ6vt#L>)FiX`BlSd;{o_0=^w-uZLUw*{O6=TV2n0@K3zceoO&@z7} z%C}-BS)eyuDthCN&lWfL)AeJwTuUjiFpzMPK{k+2W?1G^*_nDa77#k=yg+*V?Rh|n zZ|B#hBc5aMZ3Io{E}?l?Yr(A(TL@yMjI#gbgS;F-S# zzJrTA@x5Xe=|>x}Clov$VkWi!%%p#8c~?GL$3t!m1!-O;h2SfPW|oam^S_3=&MBja zRdGUndUP*(n5xfMsMF-UaRfwih?k7+0#^;qb90-Q_&``;T+2iQUn%UZVtz~5s|j0; zF(O2^75>GDrW!>mg$jpMK_~t;Ju+96Tw-B3bw;=NnS74vAwv<75p1b*k{*8qpu6j{ zhodQqB9nOYomPWlk86O_VH>^#2|lg}!(Ry!1u^+rI0&3P9XtEY#DA_#Fi71$zeuVC zR1L5Yx@8Rtd7rE1>=!xoH-uCG1EkR^8bqGCy}=%o47Id^K5_w0T6(%0e28<>r8tHV zC)9WWzj0kn>SPEwNC5lKbCZ9gug5(Pha`(lQ@?#-7Dbr{lbA^v=ZRWw5&*#)_^zz+ zw}9y7g-3@16k~xi9K1z7cA8!PvY1n}O{3n`|IEqQzC)1al3p4@f?(3D@ttKZx15B& zAu{B2e4J=40D*sMTs+EcDc=r)>P3h2J5bm8ABaqEf-M9pn#7)pgLr?PkK`Y6)VdzJ zL|{suCC)6#nMgxoDSm^1|LrY2mz4c&M9+vnqS$OQZjJYSjLLi}SOba)7FnWXhiJmb z*R|uv&QtCS5*&A00a>_yEec2n}!=Ix1|6BIC)b zf9QTRWqn!>1#dG~AqjtrGFxZk3J6qCUO4kK*YSg|hs5P-gphS)*W`YX=`Ab*!&e&5i9=I+LJ-%f#QolEegpg~6V^mmYd4 z#MW^`763mq$m9391rme3YHwDq)TL|Y<(PU61-&r^7=gnqwbEZhbXDkPEZ<$aB&cKB z4R}OU{c0^dlIyp(y94?Hln)C~<5ZN^>+Iu6lpb0FJziRyo=IAlw#!by~2S=YFZULvz| zRP6Hn$P==n#@3m3fGCqrvI4;vb5%AD&yE?MgEaRfX$pxmhy|*i>nULh^8*McbyjJ+ z;R+b|?E4j3OAE$Y9X_fuSxBlL!tN$An3qJV&>ayM>Lfqzyna8G7qu7X zedwZ@w)}s#!2{SxW|F$CjQ+C-R+t5`#Crk&b$Ak|uA;v~K1tKC-(jdwsEcr@*{D6U zYS+6@9hoL?hsJdQGUoxnG$4Nk;@Sv2yxj_gRKQ~C2Hu}O1tcCDa;JjaVa{>R9 zk`;frOXxB#1qipEWLfZETYg&5;iD*YU+bO(>O<~Xgic!9w`rKb0Y0wgB8`Y8?<7+1 z&(Nm+g=<^9x3lGht4g*nJJCZwi6}4EJtS%D?h)+7{qI_4K4t?Fol(;Hdr(YmI9b_F zEnb{IC-LqQ!iZiA!|b!QkTy}3S1<-*?y!HY04{4n00Me8d9%fF&?tgmXFgL@LiQMy zAu9&x*}Hy$63C58=uGfp5!;HpX4VqetJor)ysalF0cX{NBpS+Y2NTVj0UybrYQDv2Iz%Cu zwxSo+AM=?PI9^{BLd=8}I)(lBnLMe5q_HzC54p8Jjo_e671WrpFBBwSL?76i9}CeL ztkJEy$Ipo~lp{$I&UO-l_#vY^4GMok35;ZnAt)F+eLEO}W|(@1wap)}VUgi@$!cf< zd}%F1JnVAS<~(|iJWFcvVQF&;w$CIB%%mK0F2kjfGj7cX^5E=pc4nhk}3nnaB>MNks8>;%%ZdG*v4|9KkA;`&9 z9Dpze=yfCH*0ycUEWk7=9^3c5&`>wlYx)Kh&tx4KvzVd-ov}Y{KC&G)9ug%LSJZlP#15*K_O8Zy^Sc5;{zGG?;)$_ymNSf*?vuJaRMQOIJ19Sy1*-XqQl6c z-tAJBqXGXiJueekpgV5KPaw&Qd|AqAIB9?T%`6qd!1%Wl6tr zF`*oSEGhQUw@&H~oVGlN1GszN0LdRtj^7lc3@1tzdkOxUZdEs5o$~^aL#t0uO)HqC zM&fnD2QRwO^QMA>L#KZ%M}N~bn^sPCB${N9XLTmXlZXuxFN#oEzlpP7|8}6Q74UQX zzOF6K$NJ55*)}4d0V0EbUX*x*DC^Ol)X^W|B*&F_&)8DJY}O20G1RwQ)(N3Nhdrw_ zPEci=VOOo!7orcGlF&ZXnes8B(TZroQwdwn=}Lo;jjeSr?kiDM$y% zJ1Iie?vxVXOWuIx-fZSSB%cMM=Fqn)oZ{qeEjq@(0aI56HZ-rGy)A~GV^Q=-IiHi@ znHFg;Y#Cx`kwbbpF!(bddLix`;}SNLf47cQoTmqKJx>Z?Qg2Kn|UWBqG5hf z0|A)Xo}lkA+@OD>=@o4Gj}tb%MO70|8?@WwBaYZDus+$D$U&MAbN}f2paKs{>jytg0ZsSr}|7;HMZ1W*$jZim7p_X-rz_?1)_`4U`j-4zbCxWP|&h)S@QA0lQ}Abv-m%@(j;O`de; zso;R>DNeRq7&E3kt#5$@_BLI*nY) zqP>;OszK)l?Mu8MpwsQAhiXOMUTF5Pz*Lf}4e>(}o1xvWzWdFWB$00t=aOPu zs@o?BSC=qCJ@1j{Y=!oa7aGzABdz{FiGaVyy6=CW5ms^`o|{hD96L>MSY#*%T8gHN zHMVwbZ`)NagD#F|y!beZn5FG~;1Fhuq_2;5To@!bxC(Res4SX8lw+EkQ!-TTVn}TYQl2lE^yosFQ*Wx^cQSAd2Nq-ZjDk%NYfwZ zTb6(IMl9o-=YZtBDmPh!{(;?99@F6yhgJDm@fg$G6_-N9e?r-%$59(|f?EDbI*_Bu z`pA;_yA=3eC^X3a$NkhYJMn)_EqDky$-O$zXZjK>$!GN8IZ;$Ljv)}1!ed;H;aL@T zeXR3Z9#y~PrIFVcoc(}=fZ+=y(TT*gDz|^02PRaBhGjdPSbVpSdo?o|_B-SUn0LoK z7Q!zZX}4R4=-2OG%ROlQpely`NX@rWz$^QKVn1L0Y^OS0emiQt%gL^|{M??=JZx4Y zesGY2=ZfDaAI3!i(-cxv&FZ-qOe2&gg|We2Ju~sBMBQ5U%8sYyeAGTI{)W?umScYq zdTj85laRyPktW$)D+V6oQY1*_?5$~KKf>4jULaKGe_^UbO#DN~4Dy15Dch4g5-&&a z9q1CILFZ$?F}R{P0DwxAm=V@K;mMaAV=Bo~Vc!l)7P;HCX(2n|YQ5kDUx>3)vEhGXr;WU9u`e1gXpf`IVfAhV*cf?Fj>{=d99Wy6 ze#ih0`v}f$0GG;_8)-8Z;)W4iXHKl;6~R>sg@*Atem?$y*I}7Duq7f~x8l`{9Jsdcq znr8nwoO~-8{Uv2h7gRM;Lg;f|N8p~6{Hkdu!r|l&E~xbItel$pOJWH>yI`Zxx{9BT zFJdh`pqO!(h1F~0B>V0^;+|l5T&G-ST%A`A{L@&$v1CS^*U<0swuNyox zQ`6erRut7y5>%#ngKS*Nj}wjCLCie=!GbE+^VbP?8}IBlC)wvxo2Q2e%(^JLhhA%tpm1e4>5Y^t zp9Io4+?nkZwyKFt(ztx>YbA{YKG^`+n*gn^!t$6NA69M7qE38or_R7a7Pl|lkBYPM z4Wms`**ZVZ%ybusFig6S@JMQ0P^83cA+S0mjRx_o0L|@&!mWQ^$%oJ?FRrnd1~ls3 z{2&ycUf=K*<0#wB_F`nK*Bi%w3Ynpw-Znzvlms^ol}p$I31f$srW&kvb;u7}p8ea7 zG&VLy+yv8b9CFxv7Q#)xk0*u(9$@eE%2eE0Fglu%GgQ&w_a+0JGNU&dvyrfLLj_*?UDNFJgb9v->tbh7s0TsW1wx68$5T`p zt*vkO`?z}_Y=?FE65teTYO#n$wCCy9lw-*gm<~c95+@EFf*C5d5MFZC;Q20=>afR+ zB1xDJk4{F0N7P8{I{l^PBzgjqN|`eFrSb+${foelk)Uy`b~IXwRyCd~dQhS*2n$#7 zxt6lf0P=rw$QU1YF%-tX8d)=S{!WSLE@=ve4C1H@!s8CeAfVPn$4u5doj`=ZB%*Td5~)xb&7l{q$2?ikp<*@L07`&A-5^z#lCwsuv=rP6WC9#))J$ zjMp9hp8TPldS3-X9P6e1lVptP0yXGw**& zp$D*RaFh20%;J3fsI`p;59YmhBcCU{(ZgPyc2U1<0GoIAboX*ys2V2~IQ#0-?!;ZY zBCvDD4S+IQE+=XJ>kw2MKU+eLDXU;`ru-Nn;l~2th}~zY{vaegkwWW2M5-0waRF`2 zwS6Q%+!gu*oGieA*ZIo%A+9H2dbocgs@Y!zy%%k4Oa5MrHK>Uu(dE}(Tu}DFKt97S z=kKA(Y8rFHeUl%vANYVKf5TX5Sul<*_W~DgvyZ@6NWxFsSs^8CGGY6ro_*?quzhD)fZx8 zA*NYMd5Kso@sr4z-BULorYpr0+>~0wKFY=>&E5@#n;Ds`@KIIgD1@CK7f3rg=WrTK zrrnOoaAl0J^--Ta6g;1#%g-6wy_BMp(e*lEOfp~D$H_#Mnjl~`kd>6tBLgL%?mU7h z=OLz9jVf;{^%ne$ck!a>0-S&846|87KtI1`#Xs#o*AYpy&^R@ zwmNG>fiLC8+3KK8J~-Bj0bT18tbsa6aAkEwg&-}82n-|`$$r!KECDl)W|o$SjhyFL zQjMStkw%+GJ^{-f$Ao_}{dhR4e1QmRXZ)fYwzz7Jo|;jGYkHQIjb@3~E+ug(FcCcy zHv65Gi8K=zruvD6EdZM(R&m%fbx0x5fUy||RkxmYBF@a&x-&sh!MrNX_8Py+d>H5B#m-WuY_;!{r2ctMmj-47kzr5VG~irNRv19I%0tfmR2I*ym4_tt`%m=zyF-6I7&U^KmV^uQu1oF8N_&l z;=533+2!eON&@LE@x~K>14&u+2n7X|1A9>*va{PLYjMOq2(ls+Kk$Lvvw$B?eb>eRGiqH>EpyGih0X)Z+LSQYooc1Q&l&u>eZKwBdRhgS#Sy`8Hr z-4QW|K@9}6T6Vb3D)*ru2r+sUIES$KC51^%1Gs4P5@v{28a#eKHN_3V!i*aNKPC9HRy-@P&R|h*iG=@Q?fg3%;oSi{C4x9^`=U< zSAO&W054heK39B-AUOk`tjyRL+fDwBf|HEhavh{GPVmG2T2ulvk)A0Gxr+S4Lt?(@ zNSTw1H$4mNpqB=JVMN+E5vkG>NZ{SUAXnY_Wb*HrSq4S=IiOUjcH#E)#=t6};BvCE z@Nk!56T1OsCV{sAo0~z7X+tbjuf-js5V+75jk%_|p4cZ(ap&?-jz;z?^e0yVP1CcA z2XgrM)LWbcXIp0jH&!nJ6d!^_DUjB|ScGNdO&Zx;yv)Xb+D5|!;B2cRiQ3l_1n($9 z5gE`z8{rB6!EKBAvN29P-$Nlo;aQ-{vOwz%el0)-X}(Pg;+f7OZ78gcv|Bv$pn5UG zfE*M)UDCpuXM1iimxa_|=_ZxuPoCY{gvHb;3lh}y6MV{&s0;bJO!VV^%5HidXoU|l zgzHt@Pe#{&za2Bip2Ns7)B;PLuBYcswooIMwDU`yq8Zmb-EcDyD0-=*#?UP)B;Aol z+D@QSFH6Ah9HZf+L{L(QpK%)%j0rkbXzE3JQ3ykZ4d0#9y(lQR(NjcO=H5UL3=Qt2 z4z*oq>(-kshHoxv(XL6IV0)`~elf`QghS6ZZRYTQe^Y-5nGcrFUAqF3pR?}`c(j`i z)2Pb4V@ESiHKZ11Ydpi^ESUB{_@fw~9%ZVbAdhG6QfV_yP|)Y=(WG~s%eudan&#;R zccWCf3WQQs4g%C2loBEfLR*JcEYfZjv7t?p)+?(A^5Nc4*INHUv1DN5oBs#pTiR3| zGLl7qGi_8G!gh;+-tsNC#nT?}OWr-|VYM;YWg<{ilZwK0RpGy}Io_{tH zw%yG07KrbJuRCRS0iYjKr7Z`WbqdI2m1IC~;hxXMVbK78G}ZA@J0cx#_|`JpHY(%2 zri`})$GC^CP{G2SUy3b?=_q;0nqpXnif0^u#mJk$IPJCkg?6YcE2+@R^=t{*QTnjn zG37~-ghTdP|3T)^(l%5)-v%ls_RZg$=F+-&{EQM<#-p?sfBTyHRXE+lpxweUFJ zU0Ca6T>tI@8HL{~lcv)<@IlMItjQ~ZTVLk9(4J9_&fAZrIv*U@P4xB`UYVjj~ zG~xytByReVAF*-EC@w|k3rv3<3o1I8mI)Iq&}Xs~WhQe=S>WWD4~}Vl1n4?U+@UxR zR9bZCw)83fGR!$wvX1%~u<~xR8^Y*+kjP)C$$nc{Yc%06*2s)HKnfO5QV%^q8Z zx&E5As+|#RRi_kChwqd$u564E?82Ne2&=FG`^Cczhv&20uTEa((Q!B+CL4s3d<;Y4 z#9kM9gQ&iW-7=qjJ1Vmvl||h20kNNqeKfaqlpcOYRYd~7_TYK30X74E}K_W3>eDI;;pTv{-k=z z=DY3p2T4jT_DmtpK2|e58%VW(uIOp@H3RpK_Dx|}!hVgWT*yx-ouS4115vKMF-g$}2;a$?`cpw!V}|qA93^#EBF4Z*Bx>Jmudt zu0H)?(r~@o@61Vyt~J(wpxjwe#BScm!G;lAW$b+H{>TwLO#@D`KpXiy$m%ZG4fPC< zFjTB(THbR}@n#DY2PBwWx=PD#d>v@aUIY-2mda{lWJH^m6PALa{~|p4-L{*H0Lf43 z43CqHdC>9IpRg?Z80<=7!ZoIgEYXUb{_i3*F6aea} z->=EbLkH$usIl<-lCK`HrY4tws#r^!_olA>*WKsdiC@m zf2;wdyhyKkKN#_U2A<3WB3UTzQ8}RY9JA3|Dqd#tH@)`_jLFeiM%}pgsV0=@#6l460_61mU(qkFrXuT_S$ZGdRs3!>}#W)L`At3U?Jt# zaENOFq|`u*u_THrzD7|_qpQqkX%yE5-1ebz0B>DadaB}oJumykGTMSm4ii?YisV{9 z(@fmawg_5%e?zuFd@Q7jlm$J`ApA}))R*qgC<}0e|9I z0b}A~G!rYDu_SKJ?HBeCylYh!ZcRx*{_y`=0$P6B+|E#c2VIxl1^x$=dxRdcxY8M zSVX3y!5`}q&@HIHhh3c?dY>l6hzeEYFl2etjtsZKnRm!FOh}uJ+HAT^4$3}%<{0Lq zlZwkYkG)Hc#**DwWfd8>nhIC(YN(~pQi;&7(>aDc@G(@uZaBoY0St5 zo)|c#Ra<}hTW_fZMaTp)6Bx0TZ>g)J=B?Daj7E7y3e*# zNkUP77**0Fb;or$DWi#H%vSy7=&U~X%5|>%VUEj7cH*Oi#V7-J3Y3VuEcc}C**kbk z59N_PDdURy6;Ma+6*NNRZ%ps)jheybli;sYNCLX4qIoZyAtVAW{SD>7NEj?j{IpdW1(8z(L=9Ml@4XrhyKFk=`U%PWws?*mt;#+ zIV*Vg;WgsjdW%?THC*WhJ#}X2DG@U$0GvR6K@33buY&-dcRsR-$RT^|y}jn%UWWLm-TZu%lAg4wnF^qLfyJO4N_4 zERgRPj}xOkbumFwE!0mXen#skBx!zF(+gF-B*rx<6Xgd?!({OtoqLO8x;H?7Q{R?> z-FiJVk6<{5Kz*Mv;8qjD79&=YletbRMO`rJuJYs^LL-{Am*hom(kLd8Z z;O`v@LmxgHYzG^LfEXASUuhgdPDzap(CJ}vF%9XX z0WNJg)rU39r9|oeat>|QFxji}Kq^b#B!ph&HY3vsc~g`40|*2bY@zc85@M;!+MkFi zv2L4eyDy}}+f5EWGCta?9|ToHQgc-(KEj43W0n4l7SE0HeU<&1R@JkAi}(o}lfgKh zNpDvhB8mE*(`LILvw=wXOXRh4QAQsxp@Y#sS^lw52Vbcrd?EmC0>ae5?Z+D-M)1;a zIbi9FTena@b<;RZcHDzpD;y33@ZYKqx9;aGLd&IJfwHZBx6l^J+!&8*dkcvnDgciw zjlQ>%O10t>z7bfIGbVz6-cMjPe?{|Z0ecxw`8hM7>-JgTz8G7)R-VBf5N5{`0MQvV zy{AA9aL(d~famK7j`*l($_<+0A|D{7#NVTgiw|HCu$5yS1aVL_wIS<+&3DTz3Bveo z%qJNq4!HN(ETIx?_+mMD7YDUpd|NJloSwjl^tMftb>uxOYZK~!ku7IDv|-LqF-M-) zK?PCDi@V1j{ZcN#oJ=S#K#L6gjxJgr(e2wSw-v8M_W;bX$M1iOozwD@(XezftIhlq z(8t6#-1{Dq1Nb6>#2WolDCC&e;4-Ae`QW=Eqt(7nG}*cNrjc1=oS5Nz@M4k%^mIRJ zw1LyTF>&6M3*za2gBWF}O)vZ=VFm4zC@G70a(8Ai`9LHnkbyT9FM4aWn{4`4$X%FI zior^JdCGxur7yvC%r%m?8OHe$&}o;V1U-I^y8^zARxTT6R;tuak4Ek^0l<;^LnZ5( z3t4$Vq_+(-o|w^hUGKAPD55(Gmrb5^F)GQ{U@OjkW8^;zA)Hibj-V?^^175OUAtcyYjtG*b^O697?()dNcDb3~!J&hv9$gv|CFeY0 zQ63|&VQ%I+(Ew31CzZvfa>blS8e(X%r!3U<{%whuzF_$ChgwJ7 z>&JXy?C^Zp}U~12qXuDIFmk5EjMtfOj&=$_b2m zg_C;(;bRjG&$C+NV}~aqXgh(xEitU0myNanHi`zuydcMZ7HGjhM5D~daC@$Kigqn) zI+SVuoIIoNv%@UKkdD=rnpRWr9Wr=@k`HE9P}BQ=_xmiR*&`X-0nUpLhg5a%#**p8 zzU{4g9KAdGZ^O5DqDr0oRD7YVW9RlaP${x!{OFOJQx%uQ&UT2%5tmdOO3aRXz^vhN zXVpNt|LL+6burmepe*vEKav#?tI6M-fQO^HKN|+bj{D7fd6i{=_eYEIn?}q(BcZz> zJ%I*)ryL>~rR}11${oPMC`L3in?@k zpnhk4cdBJ!!JkkhFEvxps-uaq1F0VZv!-W%xScg@5qaCMu;3NhWSck4i zp(ZX;q8x6(fE7Db_7F#uiG1Zn)iBc;l5Fby3k=85V17zPXHeUq7yy@bw#X{nb5^>4 zC7dZ2skX|?`)~wdd=!&%tTf~3l|s4Rg7A66(BRdQ14EPyRqW=x}km^r^J zuf1QOpP;;}x-`rAC|+o8wm@Q^&+41Emg~>5()PBok^D+3wRH_#^j_Gqe44LxpVS#I zhHc@kugfDfgxUd^F)W;#D(Se`TwnozRVA2UJJ`kut%Ec{OqxaNiuEId?M>`D7j-{* zuWrbeD+1~F0Wh%w8|~H z$;)hhtEq@L6QuWNtn&W?b(;!I z46sP_g~-AaG4;=!K)**K1Ypm9X>3z$G`i&k6$p>oL!58JhEb}>bKu3Z>aPpArsfkA zR}CocF;m)T(!kPbe6y*o=n>wG2MDvAW>>*xr}*k(!VtBx+8D!5RUr)0T1nL9xw7j2 zI?JPRvjt&u*R_XlrcQ24HWNpf)0<0leHopg|Catr>pM-pDch5!l@;TE*vg=#@EGFu zcR=#cP`xuK>DM{ysyH4+2Lo%WH-|D#%Ixv_rS#~#IG#7(g@@gN7)@~B>13a0_2sE= z_0_Nf%geR34;v)13Z@jSr_ngN5qGoHt5~PiN;3V1WF7!lo z@HK=LIJ@UxMNHru50`^~EQ851LPez0dwiir=yy3onnsv_oZ1evu$lotPB4Y<)Zo$& zSp-LQOBGQ;4om3*UTS+Is$%%}yg$p(s?HME!=hKBiJOl*L@F>#)5$~^PCX!4v1noN zZgZ-%5BP7iU=2wA7_+JNt{9ZibYAau%N5YX<>acvDHyMvqx6to*DC(U(*(J4rV0$;qVmo3=#DfgN(GV`7i?zP{c-wu!>W{#eL^Dsv zd3;0YJx{ngTlL_7oWIdhfg~`voNEx8GBF8_f}+pER)LDuYC0i25{EF#&F*s?yt#P_ z<#0HQQq_$6G#C7j!Lb*2tc#GDor&%U$`Eag(JJ`y2GS#Z46v>CCr@HCd0;A^6*63U zsp479hT!d2mE(5BF3-_u8V4$~+EeOd>P{kOPcG)-8A?5WM8o4=3XFY96U(CQfF};- z_wJ_(YrxG@XG4z`w-66Sa!m%>iC--Q+`Dk+hXf66I-+TS^a7wkS<#^)b~Y*j+a3J2 z<;#d*f2B)&ApIDP8=z%`j&I56*y!xm6T*GZ} z&+~kxujV=! z&@sEHslrD%32p|dCWa;hMSR79ClRtr32zXn=!RJ*_|^UamY+yp+Mvewh95PiJ0f)A zr}aPp8C8o9;J!N7H<)@36XLZ8NQI86_|4INW%Y*=m|a)02{l%!C1?O!=UYPsliFZ! zYa2#?2U47)eHVm|V?nU}W(fNY7qzw)ut3EMwaf@TxkHiu&PVR1KsQKiR65;bZyq63 zGnkm+yPIg0cDw^>G%A9L36<>}DBuHlic!R(AmdFwv3qc7@w-*TRY2%PJl`|;>rFgm zqY)KwVff|e_SQho{XwI}VQJsd1>WM5Vobk(b=!=@4D~oF_79PG1BMz?YY}SE=Y%Gg zsIv2Nw;3c&R>M00E(GeYVOR$`I{&Pheq%c-N8|}6N}8*Gbu$;_6|I#Wpr_SVdBvuS z=3|h=hVvuu(CjA(=ktv3xDcIr!n}0r}3aIm({9f%QqXQ@$6C+s&oFJ{Cp~-6C zBqMuN;z^)|@1zTjM)TJKRN>~tmwT}P;Fw}ep_TzH-TAwr*u_X)xzd3t%$4mN#ya(;4y}a0l+Tz>5^jDw&7`Xo863|K zR&SCEqtB_3#?@aHR{HvvWsxoiS~4RgWblBws9s+%x7j9wu3!CYu-Xo~@Z_0)a{{$Y zQ3SWz`RXJ!M@F4SWYx*BgVv!F0jp_+8ja7Q?KxLfj$}@n?SDd}gqD-7$61}^Jp1Xa&t=tyVGRn!IJ{o>Eg- z?_IALV`APFN|;)-pjB=a#<;qFM0q}9J5v^H$cu8P?C{POHDYzL4<`y}1aE`iG}aIV zC;K>2*iX1g6<@Gf@0cmbE~F*S5g5yyfDhhsGyLyY(b(b-jKal$5(QN#ZH4;)^}V4K zBO+2$3&~pXM%;^~Hph!&js2Gqd^-MN`Moy*A=-+BC;%HPx*G{E230zLo}DeKiS8Q( zC9*xqk$|RFC1n6YBC#~(98(iAJ`zbQrEu1PKD-ntsMBz6uZW)yMh16;Sd2wT#ghC1 zpGhpj#adif8O~jmACkkk2tL%%=&X&+Sd(B-Mu>GYQP38QDugg6i7RYxgp)3hh8{^& zbkEkp8L6`^=?=8!<;v27>C7^WM8_aer0|&RyE_rtL;CY zF~3J+8c4`3gBoaEE;yVo5(k)84tg?I6>;)IIPq~mJsF2)tY5x=;i@%p89?dvB8*}g z&+*R|Y+6~k(XF2}TIagvDJPdL-*R*NTOyOCtLLV5#-tvz>(f4ipEP} zf!45g^Pkw@Uz#6I2X8e)U^RReiW}L>qkcBK<0!rzD;n@$!t^1VygqU4-a%#U^)$eK zI}Qb<@F7~o{)ydxgCn&Go!dV`l$()J@`nqDRPmyp37V21KPu|Xlce6PIFUV>HKzIw zReI{YiWsUD+f|*KabOYQMc&%tWQ)4BmF4z^loBmkfyhE|ZJu7Wtiwi2&iv z?`ELk3}cj8Bn2~A9rEvR5`Rkoi#LrERDDn_%96uE%9u0_we@3jqt`~~!+z!tPfyQvYNwvW%GXfUTE<9*oY;WvZHtPSyV zv<|^AA(_X2soB>$M4yNmM-oKxtF)6Q$_EQq_LTNBE_xm#S0iL9+GYTEVO?pNOAAm($R|3FMK=j0@1o=7dW~p zd##|dCg8bE&0qn4m_c30dBj?!NwKRk0DVA5~)N_?H62f?j<{a zapJ>NuQF~Ggg;#lY}~_ydd1u+hNIz)dOpKMxPEP|UQ&Vau#V$2vbp8dlfRrX8yRV3 zaa=iKO5S~`bsj~^rg+9~nUY&@`l4+1w_y|lt(G^( zMdE3j-zD==HTW{Uh>~oWS&bRBFz$6IzaE@^M=oH1V=br6H<9iP&t&lT0vR1qP5sb6 zt9s(bFjc+&KKH$0?b=vdn2Wr&WHSjJ6`_tq(v#-C*I5$JXQqksYaAbzdb0w5^~@7c zAx4|5!!-P&*cKCVcAw{;*9=KWR>Ugh*dAqks&Vr%zk%Xs zkaU~(e>)z8TXp}r&5}1yb<*8xwo-%OHJ4lhOaX$uM+NhJBZWnby;;H!#8VOIfsj+} zI*d}A$H=WN2^ zP?;P6*!Col9Pw`Apmdmj(8MQ}Ng!ZZeFdlX*vWDKd@*fe4&~Pc0YG4epC-P5e3BHt z>z001{*OA3;p#p{_%k;5-7WKN8SpOrbmi|NR zhOkej)>(@bNkz6*P$uSi|%>PF{uW z&gCb{f?6r=(ach{@NEx23PztflO4_;6|8R6MsgJ1QvC(QnOQfA&}#@&Pd4V!Gb4yz z*dWph6uK&kD?2oQ+R(kx4?e-4{gI5%=yr4)-bsZ%p@jh81HllTiJ45mLJX!mSWd-K zEC`lBuAYZAW^gDaik|g2fK@sQIG+z-aNLRHEQ|~0$1EF0t6i}T!Kt^tMsS1ulQ^iP zvXj$;Yh6Lyn2ICJJ^a?j0WaL32YIHQBX#KB>H2o??k*~S2pvV{`Mt^LvFQ#4n--z- zS$XyP8g)IpK7eZhWeNrP!=B@Q4CxY775yG!^`&i0(rx0VvZAzeP|QWl)lSvfjU=Va z2*+Nx+kcZ2nzHH-6}phhSggYI9?>b*0uP&lIwbV1hPb~B=s&gyjMEyaf~yYnfTN=?P|&w#U?rq(+cxNHcy3HYGYi3B9nu35oN$ZK#SQin zUktdgMZ*mZ3hwhp^ut(Sq13Q*tjW0u0LD`rf5d89Gg!mQAsmy9)Zq_pUUNwwor8IWhGtg|Z6RIU+ z60D%2;ZXI_<0T~*sgNp?-#27PDLlQ7P@)&9xH)gz(?FpmT?@cp;!_ z-R#zXNRK*yWTog@evI48jsxo_jW(=^%Vhtsut6PsBfS5lGu`GTBJmBYHAiyyAWU`e zB8L9u03R0$7^m%J;rX9oz-Yx3Lt)0gs7F{380>J-DgMwN>z(IrMq)#D8 zwl$!+9XP*9TYU{vR(X@QnoRk*kd5-=coeUd0WGUPn5Wd5V%G&0-}0c5?1Za-%?A8` zUdHwT@fBeJlz*FE8kk-Nv+tE8TU5M3qw+2QN$sgDWHMhAH?#$-tBt6QM(bLZ=PIDT zc79PBk3Wvl5E%v3?{En1WY{PFE~!thv482fM@6;+zQGIM!K#W{bgmgaGk7_GCZj{* zY4BXu?IO;x}^+4z&6rbl$ z%+nrzy2CZz!QYCdllC;!ziaM)F7$S`AM$bIHWk8gt43BX&K{1Pc^4!F+ zH%aNmfgK&iQLA0B>QwsCFTa=fS>W||#K}u~c%mR45#p-O^~eJ(<6^xX5gX!v6M(5f z{nrUCv^u7Z=;%zt~{6GR$vDD1G+zo9*AR} z0ozN~4%PtBHyS5b9~8!gEp|xQ@M3@tNxU`QZqp=x3GCrkNbh<$U?ART568)@pu)Ok z(fy3(4h(!MGxgoL5CzzFm$w3cVQevS`y!=evDnW`=+9k>S$Ih>IjIoyM+CNX?o0UV z3TfOw0r{oqT+ACBY;EyaV>-TlUxxDYW;}%f+-~S2GtU}z35=mLMnQ78hUUEv01Mvl zcSUMlvwK1JnHUH9VX)%WIQw)DM2O%7PDq7*nLG#zPDN|*TsT7%cu}Q)!acpg;6=5~ z9pdFE!3U}|e-PpGDWoS77$sO-g@G)@Z}z1gEW zMD9Yja6fjTnLw3;545N6adJ?YJ=ufom$2n}G8Yq?(IZhz!0^WA#XLC)G!g(BpxBLD zDXx)y>@2XXaBDO~evN8gcT1~wMLV}mQ$CrUjOlkNF{+TkqL7z=G?USI^Y#k3j=z6d z`dW?K@AoVya=G2m(I!X~#5E!w(>Q7kCA@PYZ-!UGHpCO$=9_VjUKq#YuAyN8K2Gim zV=Z~VTEF@}-Oq#F>=!Vww*{W^3Y4~F`WQg;kT~yAfR5~lIiTYZxh0FLB6CERBk=u= z;ji2@@`0jxI0?Rgx+gkx&(d=3$0fN2?t0pGp=0lHr23$7yZu;H#D6qmR0Q#jU7T+{ z|4E}2ga?`8GLAW#pC3)_7p0WPEINA-Tvxm*d7mnH6+n2ZfTy$iR zF(AxSQjDQZ&4v6lK$#uD1x7$TRPY)V?#?Ob5Av zn3<~7a)Cdo{K-*$G5|b@Sxc!lFm+r2`Hb zpz#dvSBRuqqcZv1piw@h&(Td}?!-(7~?Qm@!?%xqa zBB$+fbYImD%J!C3>vk)zE72QKO1&$9cULFWDWW5`*q*bjrm=X%V2Ux=2)iZKy_*Ws z)z?0MSQEVp%<7Co)}N3bdHRb%@9EKA#`pdI0=kkayBVzX=3KsGe$OU@^$X9L5(~>S z`n8~{+=d49%BI$jaxL5C(dDN!=&D52nO?6?UsML63IWk$stgY|HCVjKjeNaj6u;wf zg7HY|eahz)n|O-+S6ik1jXf@hODfbLbF*ZB#r_ev+GFQkIgOP=ONk}3p(?Va7wbl& z)A6DY7S)!Z8W787F|>gx1ZO22g_BbN(CN0;SJ6 zz<#4z*UcP^`$t7`ri2d7Qy=`=GiYGrRXJVznq@g5ypUbdW&XxzP*wfrA0x9ptNpOD z#`jCFpzD7FZAo#TT2@Pqh2TgV#q%C8xgy#Zv1CAAZg@>sG zT2ZMF!z*W{2G#yhsw=o5CSrJj9W>~=M49CSSO%UZ|8T3QG*n{0wh*O{Baj?_771Q{ zzyBA?B8hhEGCHTxmC8bIDsFQjA`zI~OYN-!k6s)%9Ex;8%F$JXBEh*CTS=uoLhq)* z_%r@l_a6}CC4a_y&(5aeWvYThN3p!T%B-3I-Ye~jQ<%jG&M$0S!$b0H_u3a$882(T|E<#f&c<@7wPUV@sx8_)LM>3$NpN$e*rRK zqe#VUc(Zkpl&5Nx0lnCRaV^2c#*k;pBJnpS*YYpHu($cE^`PI^`RZ&rhyHH)?}I&( zqU5Rf4j3A2e{mxYcu&IPm=R&B^VZl zokZo-bIQ1_xYpwTl6FyMCtk(lX=3Mdgkq2@Mj_Ag;xj!p{lvX6SO?-76&DH~Y#f8O z#OaMi@6}Mp>YJH}9fom#E{^Wn^i1NN11Ee>i$Vd9yp}R*C*q>knKUvuZ^#UZ6L8AF z^VrfBS8V2$xbeN%Qk^J&|FAv9l_Bv%wRI_fL1tr{o!=N``(7h&tXhh*Ue{>+@#X0j zm2S}X&`hze*0b!Lvu$<^YasEKzOG>}z;i^jqt`c5bGAjGlf%-k6icM&DS(waiiwU- zeP>)wi%#@alSyMZlorjuA5Cb>v*EEEvgX4p$(XWLTdJf#bWy{9WuN`ld0N6jno{Kv z_K=-=m{c?o><&aF)Lid-KQj`^^%6PYDB8vLi&TEY-~_ zwnAXbEb0`jv}ijQft8UlQe@H#-4fg{gIC6dpI&XAq)x^^QHHnL)WZu#JK@3|DTN0A zxA6b+xYmTcWs`P)XJ&aH+z)l&C#J`i`^;Fr$vHlh9K_Z@hQJcb#eeya;-V#+>%M6= zw8+SVa;O5htnfT36_F=aK=l%;VcT;{YH>O-ol4oRTCPgVeM-MVlX5@CGJkv4ef>7x zOGPqNgfQ;s0IkLE3eLo?EDz~1;<#&^7XB$?modG=n*%1L zFtgF(-z2tw6>)JfiKlgG=`yGx7XGDD+@2j-{8x?ra#FF~1HuFW^5T$EYOX1Z4c+N! zkI!?k<>BmNE#svYDD!qODicMcxC(!6p<;BDp_B#R#JKR?a`;1NowP>8qtWB6fkOPw zC&U$gf_if8<@N|rpe<|Oj)8DsX81y+q=WrHcg*5{+e&OclJ?45n^vZNGUzMz|0$Vi zcgdU(S;vaQeHIdatReh=nGnA^X1kwHCyb#sjGW15#;rJQYPL)DMf9Eki)r2Q=pjcdy7MVnB_L3$)u><`U{v{8Ar-xfyqR5+}V3a4U= z0roV1?os#wvv|1V!N}fC<-uYCRm_8L9P0IQi_+j~AFQ-g>RW|3I=W2Ohx%AXMJTB# z&b|oBm{QyuH(9i|1R0kG%uZKxigor;sS1V+?k_Mj@^M5fG{Qwntl=O_1VAz$)en`X z1@U=PcMGhUCD?j~zp}$hR?@YVsYuGuCTEzm)rdJz9j`^zoz+ja+6C$Pu!J@|vMQ2x1~7=h zJfhOr6Li1(JV-cE&Yxl?6O*+2-U(dY--$jwPD@calFtQcGETo=pny0-b9XrHFm%j+ z$)``N?a;-2p*R$5B*a&k@@wBI8phP`beWQhUVCM{=HsaIpUHmp(~5mB;`(O8el(Q^ z)Z0KGhDO7Od(gppkU$%?|dIZZlH?2gQ~G}jYQb zJoXUhL(q3-<_1;L_uN2Blg&?j5V3+%f}x}6aTN=B58`N3?u|L(1n4X{5dz13AoX%l z*J1obZ{8fWQ=j?OUmfJI$;p|n@P|zjrs|YB3-2n zClvQM>cS)g7OXW@I-nqESI4h^9l7nf_z+tkH=qg%?wi{cMp6@{tVfbnlko`B*2U3j z1ECEPu`r0XZYR#Q$OkQR$&)xvQ)|z;$%M_*CRA$cR0-4C6LS{#hYX!vVHTC&w>#Ma z=EUlrzh>agPx$epGcFZ@DYv1nRNU@ma!i9%p&?4p*l2;RG4bIT%2o(}xU#=0jH7?y z{1Em-pk6vOS?wa9elE-_uGpH%Z93&|lnL05W%-3VJDOsZs4HD_Tw(lv8)%N$aF-Y! z2FROlH!K9pQr~0bF%QSVQ#aT2eb$+oF7kY}-~RUAw=67_>wCDw_Q1P$yV$fJDuWfuZP; z7%5XH&)P)Sn{v8408lyQxOL`bs0M_eF^^`44>G`f&4ANrL>!!dT4$L;M5JcZ_TvmC z^CMwDvLjA6LEv*+y$pmThBUl{cA!Wi=B*aW-h8HlvJ5I!^pgc(Yt~?RHSgXKex~On zZ(URTJ;pzSn4QsQO(rV))dg7LKV3MNMdAAmP8)3u!$&0B{h0orcDX}?{6P35c0Tf% z%2!btV%PlD(H|3kS7WPFYec0dL(d798_mlyRv#1?dCjw*kO>AsAxs$hP_t=Lq zgxsRmX{)w~9NaA4`_)HI2|{e3Go+Hfpf)-FT}{LLmA-DN5n3*z2^Oc3W@JRwAyCZj zgo{J{y2)P@pqQ=n3DNE=COM%m5ceE1$Yr%AH9NXM$41+K%O{OB8%o!`U3je3f@4Bs zR(-39Q}@k22LB)}t=_KZx?!vKlidO@JD$h!CAlRQG7k2xHx__%->r>%J`waoq~R}aqUFTy^DBe14ec5ku5`I1lW>s<==n3+l`ofb$SV-a z*=fK}6rIZqpH9145@WC0l!2J%H)lG!pEl+rI@+LQ>sCYLdk}C-=KxJfmV}cg5j$}_ zoNx4#9C>xSoN`J(KaskF0xxHwrXx6O7@y^T2rh?Sb~q?sGk@|* zLuE8LezISmP4rIz>iL57+>j%;THvatS4o`v5m=e@UD#M}kz#r4RmD5E>{5GcwH40l zh~WZ%ETE8sN`$7A6GN_f|5%hO{K3xW%>(R~t-wvIkZLw&^Y2S%i2p6Us~bzZ&NH6o zRJa!KIgBQhibea08~G)*X2>cw82&DN9!71)f;k-K-gxcH?L*1Bn6&x}vnh*x3v4?5XlBcqG}M}EVt84qX?(HZ3MnK~#yr1TN2c_D zB(Trzu<00!Qs`j`YMs-LAPH~B*p*UJyi?^EP|N)}g|I3Zx6#ZN)rwI>!$~s5Oz$(h^(Ow}V?hDVkTOb@7nw_U}7`bVkoWGgqohlAI7T!#n>hN zv-U+aILisV>U=VsIZHnh#fIk!(^TF|j4wy@_&TZOF#rUPZZY>f6++#K=yPzuL|;X? z#`ZkD0GWcqaSds*8?slm4^}^XMHUhkp`JEuuAND0Wo;?Gk1)OkCmKewFyCx{J83aU zt87gt$o_ENZkEB_sS7c-xBx%5%Ly*h9Zrr=osAJt{Qv3eN$k#X#FNjazdoV02NxJ42|oO zCU=?K{G{z9Pn{4EApUE!!yE^HzeHb!DK;76j9H*7)YAWSqguuNF@DbCy z>Nq_gL7sV-AhN)-Pw?70&hj`(W|GVg{%9S_mER2jS?Z4oi%_I}&ANY<23^c)p%pqA zug{=^vcO*Sa(jA8e(*A*8`R%SB?^1;R{fSsae9o1H&r>aYr!!DHYJyToJZoi`vRsN z{&vR;6zqa67S8@5BHDFqt#{y7v-Nnxq^2}n^%X<(Ib-3!LPzHxr<$!jGC~z)w=@Ao z-(1)@#Wwa|NAI(!obt!N_+ks1R+C7yOb4WR!1YlXJmEo;mKEN(`8s2HxM3ImX1lh~ z+_DT5b!CAfzS36S7&2{tOkJOZI@+)9EES)os_r8mwn_iL>B4|CI(YX-z^{;IaF(?r zU@WE(f);eGE;AG?ieKS`t9eQV-ofa*Q2>fBB>rOWsI3=CS#6^>LR)o`;j2g{=N;7u zQ5eOeZCsn)dWqK9S#oGe2vOP%y7eif_oD%|&q-ah+07&Z9;Xd|fx_FzgSh}yQ4a;3 zvr>#N7lTzE(CyU*@6>+s<^rq`aKx7PZ7l{$W^5K%euiW< zf=y6k>1qIk5H?DGMSROBO3X4)Hq3;D`>Ld}>l1oHB|VEeiSb_`gTO-0yzJ~YUL`i8 zCSPX0da)CW2fOP$mwu>i)1Vq?KnIPTb{SyPqbrVWSGh^f0>Qr{Fe&Dup*Ht7T^_WPt4Z9dGOwo|42EO=OevZ{OkkUu?~!Nv|{H9=`#oPl-TxDM>L%-8y6 zK*8ov*(kXIkV`hI93-%d`;zSpR#h|#YG2yFlZL##72vafAHa78upmOfXW>KM>NcYl zH$959!p`-77<^)*%Vd{4fc&dsRv%XoOW-5ylfle*(al!c?+fT7{6909gDo?5Lxu|+ zbnNfwqF-didHJd*!;SJSdFF14D z#ou&)%Dv9h32FuR(QAn=Y8B0xZzFru_c&tqhl6`dJ5mg33KpM_3yRWdpGSq*ek(do zIaIGWkIl&PsW3_BIZ}GU365M~^g}ef8)(!xzPzx02Z9CsYwN=Hg5qgL?hKR^fuMZm zf3qG%OVdP+Lc~+&IL*F zRO~x3hIel^$SfctBze`Vd26_h)H(ToB7Q5UkzW7PC819Og|qp;jYFo8 zN|PL*5vqELTwR9wA8|^MgNU$)Wo^m@Wp%=h%TS%bKCzwGU+EeOSz1quw^1 zG%lY+&^hG2%Mhi!DG1{F%+#hKj_Jc=$ z>hx^)qu=KHaoPibt##m7G%OyS31lNLe^KnqQ#B>luDkh^7_r#1FoR+mulaV2YSe4l zIdepUaMEtHr%U^-Ru^&A=n+N>riU0Ljs^P8-7$}zHhz@qT1XrbRi@o;M$Y*jM87&h z4sbJEf(v2MIJKOqxs%9*zu$}k{9b-Za4o<~`$*wft`eL-#9s~f`XVc?xYp=Kf9#^H zW_yh;ZFuvorUzFeU;S@Uwij_Fx-~Q2ygQ?Y5}wmb5q-Yomi-IFrie+vgy5jeUbv#h z2`#9mSUVDTD>*BWZ2JfGJsWce3CoR;j=*%_{h&X!Q69tik?se#aVMQy`ix4fD4D$O z2tr?6J`{cIitx+8Yb6=RVOE4Ie|%+z@niOp7fZrvq9%UulMfnO?97gI+UJ>nFWodv zK6k6fM=TJt@5<|b=TRh=X;%CZv!~*{ophAR@nc@^dMCsyY?J^y-|80a!6rGii8L{q zir^VOh*Kw8==WA^<95yzUig#A7-Kd82#BU31u&$f#UGhR@?Fl+$3a`Le+u{QeB_9` z<^wIeL+UwN%RctLl|DKsNAyX&_)~5LFEcOyhL>SiV~*1Fz0YNv--S?qE_k1Wh{nix z9sGOD@@rjg+z;fTe)-lF%MN(c1NSC1!Si7~7=Je`g3IzzPHd8kv@wI8k#xAQ7Fi$( z5OC3#I>3yy7P}8LtV>Xre_vGlL;`lA~ zGIObNu55k7(2yqRLzRG111f4r$uAxNew7VeU3AIb5(DG{!vZI8Mr|uX42iSGq|iG`tM8CD8Gec=qVcXk2x8G-EJUEs zQe`MZSQND{d%P5+`eO-IIUObB=ZnKiGBR*z;QT$$Z!(w=VvqmI?5}9nX-qEZMhkH`nAp zavG+=L`E!e8Qm(bJ?|=i&bIjTQZu0`u*dnKVTv9;z(c`FiH zvC83|`Q9X@f4E&X6z#Q>3yAX}qU2$1puW?C&%NqH#?HMcpP5v%h=(z_928Ig#f;lD zHH^le13TV5D$r{<%rONR{+C1txAOh!)J*39p9Z@SGliUTASktaO%o8%xk0%i(vL7o zKa+VqShm>Yk`);5pPETs?8o=fJ=U~WPf~%cnY)O9e{f1~oT467{P0_}z9N;VDj+CD z*WaZ)*4qT`G5|4X`NIIc^#o5=aCYepzv^36iWHCwW6{ewP-GPF!hq8vOA7i}!7f=9 zO_SZLG~|a=gq{efO93VU)-iu?cpOYUHd73gFx#}{Vw@bcwCu_tPVmUO3hr^SK0L5%+fFn++uu7} zx)j#CBJ9othEQIPUW=Q5Be(|P@4zJi#vV1*q3bz#;Wy{%0+@KL5g(D05AvT*|rK3wCxH)dLkj;Sj+_Nr^+A2Ix*Br+LA;e9dSHxUBZ ze=+sZrE7H5r(k5%|7rb}drM4z`084m8_y_nV#g<^nE^=?;8d^?GiPvPby*1nBQCBa z<&5zv$bZ`d$o0_3=b-$YF`|Myqfu%K*$;^G`>F14SpnO&mPRK8Y zno<6iq?XLZNQ*#bFbTf%4OzJZ)#Hw!f28GYPr9P7mlcY51we@m#D)^P3b@KmrvwZK zmD8}U3DLz;0gWyCuz4&a6}NYV_BK*>ka!KCv=fSn*r@=a2OGLcO0vXj^0gBXkCv^R zijk!@`tE5BPMbl4V{*j$8_RwmhonCmGFl0$|8yLzSJg-(!ekaXO0(0mJ^s-^-2#kTz8wJ8 zcpX<>6g_hX$DLw?QE0liSKRO`e>l(?B>*wr0+P_UBcOJ?Mn6)x9j62dw+rHIp8QI} z>WaC7_k*`$_7Q=P_N&-B=4(Pm#M_yY$!rV$eFAy$@|RpLS}jNXKn94l7Kbkf00TCldV)X0;M3#Q@tbvR zer3HZTUW({LQ*=|(~e}7khS|C`gunJ!O-xxJ!Y5ZmU-93>>iu2k8jKr_Uu!&^Qp{z zOS1-kIB=WP6wpadwT)3?4K-D3t}sAB(Ro0;VDqBV&#laxjkZ+Be-B2pSkB(e?-crJ zIHZ@#rKuIe_-n5unLOca5>XvwgF1PmMtx8%>3M&OK%K%k&^xEKO8L@bkn=Xkrc{+z z1LFmk=CWrF5ODRGjX<#|YlpqQoE3sd-`oppyP38-D3%p zs?=^RZYELS-j(z2yp5rDaN{n9#SQNw7LMPGz{;g%PX>IkDd1Gk&86hqlab6G1LjHy z66l)xt7=B)O{sdh+2#A*e@a$-&b7p`gDq*MpWT7880*9nM zD5D6xl=RkJH@vG-X~Nou!f0;j(9YPawjVmNRKxwZEUa}4A6+J*^u(p{p@^BNPaCgI z#=_8~e-GzZ&d<;V$TUS3!|r&(jT2eH*HQ=yNgQl(l3m_v>#WR-u6lN+l;a5-P2Fy( z9>dKTmdy@(9g=lXeM0dd$nVT&ZU8R_VE?)HMl9#<^zdm08zO|?jN6`M8vG+OvBu)_ zj$o?-%yYnHVPxv0>;|w)B3oa?d1~Pg19Cr(f9>;#)L55*gQl>Bs8Mk~y|nISQs#ft zOk8!mtN4mo+7kPb7jm!IH4?zG^=Qr8vpU>b$x)#`9>n)_nD*?$m&!?H&o#Q7jM~9H14# zjuh+>Sce*oMy7f4#f^Q~0-1w*wDCZ7|x4)|4BcuDg_KAdg{Dv(8-dazaOI}UWj7E6&5b9 zIO^J8l#CNm^_~!f4Sxz@IQ(o(%SNcV6}EuV3S*#0sJrwdj$p&>&S*2 zAs>BIYJ_Dp!Ggz>NcwKGyqedsor=XWUD6qmSmRSlnehH1S-v@~d07b+jZ5A-*C2hq zwW>vcX2`7aTd&RVKj=FXR)d92L5JQw_yn|)ze@LEw4W8VSsXHc$~nXV(UdKba+|QN3&6TlWmjqIBShR70IH zoty(6Yh-;x$)K~$9zT(7^Zn6@%B)_?HWCkV>q#0+{uHy`WhHR>f8qwu^+kuyA-5c! zUKYfL2F<>NG8{}YbjcZfiedu&pY=+C%gy;rvQ4b_5r!-xqFi{UF3(j zuWopb?q>$dLjdrBKz9RFp>_wnY{)oJ?`ieu zB8OzVHH1uI(tFghf2}?DnN1U>RuU>iS4=Phm-bgylD#yd#jPvZ#MKTeAP8ljUsg2j zq?y|zU(l{8?1v>MFndAIf8Xr?sivreMWj~^IdAS0 zEREmUk$D*Q-c%BuC5N1KBUXHS<9M&z2}wQM>?0`PaHj9$dv5F9;rYWAB$vPf$!+>a z*xKIzMZ@|%pP2U~;`kE`Az`Z9_aSh_G$y_u%PWSj?W054CZb9D-rsY^R0W|vEr8x~ zk+{mzRgsspe`hqhxy3hl<^K;$^M9H=9z~7w1tq3E*l7`H#E}gRY>8*{V>u}=zqs`# z7XukR$G)Aon%|Vs4*FMGt-{%iLoGxJ?K_i(dMWl?p}p`f`cUVq9rz!%R8{H%);m;T zxH%|W9FnwpBzIM9v-8#Up&uab+IqyK3h*9t2a7>fe=^t}9(zPr3^)Fn+b7odC1V60 z)c{bvD+m=xv&oU2AZ&iXm$Ug_!X%^1!}c|}4K?pN+pnqSiF807s8EZ-A06qJW%yQ7 z0q_FA-DHjNP}WXRo?{jXpO?YNN(v}Ya}&MS~lEa)n~A=Dht&Ib8{i3mee=Y`wgM*_&#A|17!qFG&PTHJcj$a<8;B zfh#(UZWtw|HfIkwEPWRLesdlzeI$;ak2~ye z=jaA7CYab(U=k$0`ZhZ&OOa*r6X$ejxv?DZbdHdsiX~ZX5ct*fq)9EVW7e#OH0A_wdX74Mlfk8HA$JyJ< zf5AW-_6A%e_ur=vChW!iJ~n{5Q*=`h^oqE!-Eq_%K9#rAa-~y{S~G?EB~Auu8C@hE zkgvJ6h2-_#o8>YRo2{cL(oKtQ9hRV)xwV3~MB1}KHS|dVyy~_sD@EI4UJ@3A_CN=j zjU4g!=>ZiMTP|6;?A2Slc|F+ja_zeRe@Llr{qd&`W~=37ZqY+#CJHO0e{3r-8lNgQ zd{QC{Ud4XzNr*!n4uGVN#aMId>45nyJ6{!pFYYfRv1%j;HClTl!rIYeIW*Z`apZ>I zQ(@=LGhy3t5rU#I=9FebsT(NF)tkpLDW`=%(*@zK-aa3QCh)e<@V8x-FHDZue<0E) zn(zswD7dN8Q*1Po?GWZrv&duh)L+D4gwS8}u#B`+1SgP%$CJ|H{6f{$f?G+?E&Zj# zl*76*l2zp)qHfocgjH+}_oi5{#^!Yz6FUOdz0Q!&T^ej{lswbp`kf0^1wMmRyO zk!9}w1rVt)o(kxGEog!1h4T#M<8mfL(gxQX#UKQ|dn&xQ<2jsz5ihT?Js=B5MPjFg z*GxZEUQDOb&Vz#Iz$NF5#8N&v{{kNNJm~&LWN75txdI7jH0~X;)3(9O_N2P9q?M7TRFzHUlvEzP|0K~$rW9_LLK>tZ(MXA-;7mZ74_6ngQo z`OQd?8K*vOcU0ALGRm2zJo5eij2NGtG5U9CFRti|JDB#+Tv*Xq7}eU)2HkV2-7Nk; z`cbSxs->u>_f`L9w&_wHTGDU=g<{r$jSy~kQsgye>{U|tfB$O5N3Pq?Hn1ZhiPBm| zM$TX^lA(u*Zj#m!Cel22SBRhWB?=z2eeYWW*d&{}a4*gMpif$~mMYF*zv@+wlI|5P zPY66R9loT48~j)FcTfPGt|OPFo^a$=L4=SZ4;LE$D;+oY+SAmlKBRfBhkD`SD`0FY zN-=9{mpuMTe|JW8f4&m=xIiin;d`?T)u*u@tPr9TTFo*L>I?JsF9H^AF5-9pxRqMP*3>|l_R z6qYjFOY}w6tU`jc>t;g#!u|Eu9`eJOD|1!|hhE;Se?f11L4aL=8TzXyt(k!!prXDy zlrC*$%K5zpA&w4k^q^-b!C16ypOwS*cYM=V-9#|4`DVX3fm-77n@W_lNP=_c5i83JG&Gd6q4{Ei^mejA%S6oG~;e=G2n7h0@yn@JSV4K9sUgTRZ!kgRDSnGC)*!_xgt$9C?n*na2JC1wk{!8X=331{s0=U5li`G|ALJF+FjFTIo8>x!jf+a09Cm?C{{7M~g~(?bMXh5Kz!<=F$e?ak ze;dB78w)~j)i|sT+!v>P^J^Asz%h=@mO`PJ?&^94yvQTlfHJ11pVo0nr8WU)RSdqH z{5vE^Ff$GYX*F`onZ9pX5ahVlb^Xu++cVaFmpHv4A> zdMROo{TGKXn5N1RuRi0M+tJ2-zp!y8e_9?8gKW!ZY>qe3Bi#cu+1X9O78*6Mq?N4< zC4b}`czzlg)%8_IJrRL9h+6Cv-d3ceDel?TmYe;h3&8PZEqTI)SPZ{8!B1nwEps6V zZdo2KZPYfCVyNen4C#ZBEFMA&)}I;TunwhPA%7i(cI!K`(XwwV;No0_1Gg)152js4{c0gRT}TT zEql*>&?o6V@E_)C5nyrsXSEqPe@gDNPx|oc{5jTw@f$x=@YCYDyIw>p&AqROM6)hO z!k+_B%V>)^X=j@lDvfW=HVrU?9f7q<1DR9Tr|C(2+z*Zk5*0?S=c4b;wiw8<94V|r z=90=q5=O;T0`z>R1lB)WV^6)4Sq+J)^V|3xyYporA3-*D8<3ra%USX-e@@})#gI7U zI(@!U%yaYs@p1$UF4uL*rc>O{%H56I)00=EVvL1%7)6fc3=zs;me!U~42QKtZ8{lwP30r^BpwrJX4_X5AF*6(mPUoE zrWf`IiYJU2kpms<% z*|jLS#2#90eE2o@KGqH?116xJ!Sm~ z69uuB`x@U)1X_PSRzeK+^>8B03;uyxtivS%E4`(l^ zts^X(Fdp0De*jS5)+emi7Rmym_Kqr296*=$OXt$(v1HX>g7*=mPkV|22 z4r+I#49AD1C+uO1U-qbFo@bRuqmZ9kLdL}FzS3)tYqNik(R5OvzV8?Ss@tY|gl4RG zN}1gDA>pof(&u?4h`?dhOgpQtdVIjcI8aTe@}sHfa{lrGn4+gPdC(Wk3sn* z1xBRCQ)SmhgL2NarR@`Kl3}!MJrQz>G!j8x`B6_wX97JX3*+#{->6B1ExO%NIi=nt z0-=g#a7!X-Bd@ClxQWwk_r@}mMh`QFF^z_ceeuH-zj4jt1;BPNlTMII7Y$72l~ywh z2!u(Ue={eIJMQUqGk3PvWBI2T?QBghH|A&1)+3>EyZPAC%uSTx;|rw43Q1ZM^JMEr zH3$@qupB2pV@*CoEkVva!3t}W6Cy6!lo|4eOZ%vfcCzF=czK3PlHyTk!Xw<!Rw-M&6BJ=a-< z>0L*ZTEA1BT=3i`}>mib2+JhNO=^bf6FA}2BQ}Enmots$gmq6o&-#R%_MUHfX4~Z zCjr%C4r={G*w)T&B9xRg@&Yk|g`0Qy910|J#r|N$RWlD7dvGtJeSW-Dx0t#;vg?#A%1|myK|u#}^bLs$01G3nsc7 z$4N+u!F`m2!rB07{$juAhj|PNMdB58_J*WeFeumUMoQhdVUV8aA?vZqo1pyMZw74s z)huf*!Ly2mq0G-qBpaD^rzio(aO-?N(ccra^t~QNxahSlN;WS|}U@ z1&*I-5(AFYzG9cz8Mny>e@uFfM{~b|NrFfdUBI3oSgBCd(J23kNDa(})4SXk&!Wc9 zd-7qv<`5n2h>hxlwe(3St7D{sGsy5a8%=!`6c+1v>vS4l@1e=p@!A2d7I#Kg1wfEW zrDcV>xv-h&n+l-+x2CoZJU}q32;;ioc3-bAOrlB*$5n9ALplZU`SO zKK&A}R}8xK_kCb2bE{I<7vXRotAFi)yWe3p#*U$0y96np1hGe{WiNcQHqbe}sTab` z;*H*Q4%THr>7+JHe{p8%h%Chz(}c=d?MH;+J-(MvAvp5};XEu^Crv>iuV8B>8Mn-9 zf{)z8{^$QtJeNDZmmGUMOg6JEw?1hGv{y%0N!AH=iKK)oZ+rA*+?VY}{L_5%c2xyF zMh7K#JpIOc1P&3jX#UR2Ars0zaV6!!C15nk4LffR}3@hsO zS}m8cBP>!W7U`x8;WGX(G>;V33_%q5t~E(GlU4v!FcS@_L!?&(KXEScK$X^0zKuri>%dJ%QB`aMB5DW?L8o zf20QJaBCpMuXtDLc1$AthIfc|to0X)KeKmniQB-qUiS*Xx&8u8roSMYZlR}0J*Ppn zN5)mxY;quwqU_MAiZ}q`U$OaG1_CfcG2#Lt>9A21e;n3aP^!8oHYpkQ;D!}0U||2H zxwV{YR85L^)+xn!BNP;Tt5QU>sY$(_Sp0Y3u?sy^jTNzV2K+t>rya_W6;ST5&kSAb zo10lZ;<>^WRP_sy;7%Ew5x%E)Beu}meqlHGhtrM5Z@7&&M*GKVBHhnZ=OU_Tk3^}s zYcV4uf4EYIZQeJO+qQiEOQb|O#Qen^tXE(L%1c_lJ_=(jaK~gkHUMzke?IM&T8i`7 z#VteaYM8{tynS^QZLW}S%9)yaVqDlrt4;rR*UghPdhV$fnI`H_TVT#aqe3KQuk!y~LK%6kcuattUEGY|cM8bGP2 ze~zF zR(|2RtZL1kSM*VK=eA$&mb&f)ce<2r`s)T)~l%o}1B^?pasUV$lvvH^3DQ{MVazReuMlX=Ni`l2V6DdX^U( z7&r|jRPGpi$f=Uoajxbhj{LA4(B6sh;2~3~{)J1!JQ{Ar#!IuaWQ?SG+3Sbte^TSw z&P4pUZs}+({jDj8WUV}b$HB2x#pU|6aIzc-nf^a4+rqS?N}rQ+;2r z*dxZ;O;mMVGO9$1qWZg-&=}XkA2v$DaSxdqP9nmIefjt0;y)9c?ftF?y?5nP!Hnde z%@r<_%(9H*VyXtEwxQ43k#xlce>dZ76=R1v*dCFQ1W}=h6LvS3lUs% z5_M=k!%5B@ytvTBJ9^Ha46|D%lj&S;2dnjZN4JTh#2%!5>w0~Omo|>1WVm3*?(q@# zQ1vbc3~?)~?ho+9k!t?SCyj#zzNvuYizv!Nc4U3ktsEG&)apzMSJ;m1f9!bl}K2dI1Gg-l##4p>K{NrkVl z;nZVNl$!g8Ggx1q9~gD0*L7gR4vOccHpf&zhwdcZ)`@%z6?yuByjVGg19fRg++^(0 zj?<=OFmNATW59_rGG#4qf4kSm3-yW3nt;q~x3fTwwfZEb^KK>!EH4krn0WLmDR2XI zjt1CgXl2`Eayr%pgKEND^tHjUoGVb*o*EmcSN-1d%-;V`9h z=Ch&Xm$R8oI$qrbHn0VnE5Pz%!)|y}H!iqFwmS7D&HbVWYj@3{f0EY0eeIIeSF{e$ z0*6$2*4PT4d7{%8s(P^NlXstZkAiSj;u-I z7D+ozvde=+7e5LFUm@uef>`qnSsRLJq7nD;EMJq=V7u+E<3FQzTa#os6Yj!`< zH!-9ewU)~QES|8ml`?gC&1FZ>WeO{Iq3%ZOaKv7~I(78aiSyHLsd94K6qIW%qROd^ z{pju?3ur`Be+Db%{6;b(2a3oa>d%qUQ0<_7Eg}i!rTh{tdY@71*I;<3 zve#uUI=7yKRyjaCU>|}1lg(QBRSR%^PvDrii4|2<)MzfzYjAPiAzA^RiAv;WTT!0V zIZdB;fTb)e!ewe0PK}h>hxsHgx*KVIo|?4xb*i3Re@U32a;0)bj@S>CWLk0`JUHQ! zYCgAnafT?|lxD1xV4J!cE`6K|EgnYBz!Y6{DMOBwsjkScTMSAe^xBm)sp(pf!(RCN z(?4*`sS8DuDQ>ceyucmVOUY|dh5r~k$_eTNX!2aQZ&(8_A6145hKAIQNEcIJ$n}%D z*d{sNe_LKJ?O^i$N3(FABg4C;z{)^R;NZ zrPXK|3@5}Wu1v?F5+#CXeR%XuXKVEn(HLQ(_|2g2=hfV+dhS zt1zX?tPK#Jld`=24tGlQR=RBBV>!_1f3c%lA?Or^793W|Jzf~v$A$|5@ye2w0%BkK z26$2EdLew49^_yk3|ZBy);wH?`dp?cOT!lkWDc;q17#DNp@ie-TOjFKRq>&br`V!g zqYoeT4^(s{8tokLuXV%+(5V-7KNA%sawEySv1c5N3&ngD9jS+_OPv2e9^*WS&I|}}DKLQapq0vBfl4ElX?!3|@_pgO- zo-JT)s?piO@(>7J&{YQ85*^OmpG+&A9PYG1$EwdN-R_MSwR1*pZbn3iG^MV+_k02{ zsmQ69hxz({dgi-iF;DDGFB6>&f1vnYfK@*YRTSxSCz(LFxa!EW)=u~1jY=S;D`ge{ zDLGTo75exiNQwCBzS2@p5uRBXYZg|*>E8E?tl$epSf3u*dY8%nI7&%ZedTnteaMD>Why+A-yQ*5kl$(MG3dFitRM?$r}u8f5(oD5G(3j zCm#Pm)>dm{tBB#mP?@{L2e<<7WNmU%(>Qvkj|M@051SJ8E=W#CJ;T9vE@G$q22Uh6 z#+z4)HXC1WZz(AuJSZiyOsyea!9gQ@+4FdIh?pzWPJ*f9XFc`b@kq@ z9`#@JvI^n1IUjMU4dG<5f9g6sM)7!tjlWDJFigSJ7PHS&YO_3eVTM7QYHnWzL$XLN z*8iRP=OEld>0PWlVl&ugeU>F%ABEW!@&DI&8@Cyz9hLQE44?JXNE};WNrw6tLNsn( z3&fQ74rM$TUT*q!M~W&ysCSch20??R{VcAlV52T(C&9Jc0+MX+f4=YsOh~tYq*m74 z*ZLn*sm0*aA!z+#i9?B{!9Rwa?NGXCx}p58`rx&v_oYznxi<=|SJ)sGMT7Cn2V6uY zLtpB}8olIKokD7_`q--zKntY*y;jvQ-f)@ra^KRhBa|chpgyjsi?j8x9<6DK_5`1? zvfqNIsY4@3i&FA-e}@tMkT!yUGEEogDV{Hmw~NcP!RQwO`&C}82LS@tn3`Be<5YWK z+9q`T^^h$;qhUAGuxAGNd8Ma};4+-wEY(tFBMl1d|8V{>@c%^F*jJyPG0R>1+?oL)f0QDck-Vw^oimzr{^gE* zeF}N=W$HZA@-9jj*Tuq_|Ki)O%-K82TS1BK#^NNKa>6Xa&;)LJenQyU5OreGC@x+^ z{s=_ukAo1>>sw2185P>em`R-<&|J?Bm)e;*0jd7iKC*{4E?Te^jc4$_aH+02(9kz_ zJgbCaFOK@)e|ow{n8d%g>AnzGpZd-6#!ZZZ9Uo{t2yNR48PFkwBN&}Oti@qxD}Uk- z`3DE|Q2MG3D}@6b%hSX<NLDzc}cteQZ z+$ciwqoTLabR6g&`mN!MqB)&4u+%N$09{OtRHzeMfBty15}sUSrL|nmtqD0M?$F5u z|Hm57hLzC@L|$#hAEG*SnKWg2Mb$9X}cM%SiQvV?@Mefh@82+k2 zJ3ElV?kbYClAU+cT^UzFHSA-*D(fGSy8#t?ER}pZU?uzkKY%XQK0r7AYdpm4pn6i8 z2(93|e|)=Tqa82S9@gsobER^jP1o=3sM7u3TC}W}(~n+_AgKZ6hU4p59TG}X6dxpz zAZag$y)A@ITG3iT=sxGz9QBPq9-OpHZNhv;1+%P4$R)z$3Tez*bvODZD$vFfIULpvb)5U#NQ) ze@B`KDL76?R)07KGs_3ghlV4bvR*d>uGAQr=j>3r<`nGNhJct3;v z2nJOC*bXXIu7!@Y8gxC&@0 zP|1b)F{ZRRl{i}WA{TMlxTB4sh;yb;JpSK+PMGcjPwb>K&N@3zn|UQttnn+5p&)-a z*)}I>+m5=Mh8vda(qgv+OQ2ixZoTKXf5f*^Q6iR}cHA2CCyHr9gd!5|qf+`2idD40 zteU2l(Y9k_uZR~z23kxDaNv2Dny_PvIlBS4R+iHRHI9Y8PIonSuFM(2!Nl>1B^1_7 zNRVtN-VZw=`a34ITK5kpcnb%AdXzs5$fJ4nkzAeGBRL00#Pz~EuDZ#IGf62ve`fae z*@*+jpG%9nECf0|GEqZ_TIXv{~ye+*}p|66V?JJ5u$PGaZazhVaX1%d!D!?-;V;S)YX z?`zo2zn=9F8eKH|^xz?CTB-U;+uZKz!-t`oyNPj&tE&N}?jTqXUDrnxRE7seZ{bYc z<$sj2P2c8@_{_+wQ{5NWe6Zp*m3<(qOa%-!_*{h%Kh?~+Tmb-&u$0ume=|1crO9nj z|LFlXk%}}Hu0At+q9Qhswfz2y9vebke?Xn@)r=z>O!8{8 zdk3_EWnhzq8bA|F2X2MQBb~c(1R+RrAL$wYk)G@3DuRWH5%4KIO;qEPZ}@7LXgFP}|Nu*m0$9GI#?X+og}dG%~R{{TnHYpRHhJs7*d&(#Nl5 z>D;oglk;OjU5OsFe_@T*V4IwjqfAA*0owb9OMD&YvvG(Mo~t}+duzlLDWsJ7nbI4% zX2*o=l(!PaHHow}6E7vJ0541rp&WU2@oZX!%Tk}br;@X)xT~QHz+N)E^~c)Ehc+m6 z@qounWJm#8cLKW}(4FBr2ce z3gD*Yz{8ZY+&6xB))(1Bhi{ATdd>*!$Ez_pfKV)_I3B7sepQvCRVv<`{4d^eEb__x zlU(Kw?f;1ce_F4o!4v@ij=Cwz zWKs(wIs_D^VEMxVGEHOYKr3Q)C&Z;nWqKSl5@Thsud5}WUyrEdWxbM{v3YN&oX9Be zpZUK0jg)6$C_+`ZooMztypb6R$6dSnE$2!4z2Kmbe?3#W@g~GW;jN?vWyXGcNV~d+ z+9rfCd0=WABLC2@wMbH$6O{+c{YZlXN4+W79iryJkKCr~^(w8hBkhePMuTn8QN3%| zwTY=$3$?+e$!GL2FRR1xDOtkahet%pA(6kwK)n&<%#~<4Kk4SvKD06-YhDNm!iDxD z4mS@We?b)ZG#x_TwuK%lOTbw(b6RG!l=a@3;oedZfpqiXaVLL z1V>S=HsoUZZ63D(L8S)Cwrx_=U$o2O11p1iPMsfzY+=Q$2_4}05P9X%q>f|cl)uyp z?~}fO_?Hvk(&Zw=&`oxwdw3u|C$+gz-rQ8Ae@+Y_kl$5YlzMAUO4l#u#s;z-Rg%!< zV!Vb0=9KLHX6pPjcC4LSBJn6f)l!2LNlv)kbK=f7BY1!RSm_1YPkdtk;;{(T0(gw+ z_ZV?k9FH0dd`mT^f}&f{fd{|^=c7YfsGXb9x08xk@D>%Oq)vkC8pHYD=3}+2D(eN# ze}=Lv@gdY3m5YqDM{^_HNpNs8)CAJ>)HKv((>myp%cYISJlSVFB!YPoMzy2*4;>pMN8Mvz~b>oi6x%*^+YJ;2cD&m+Wn!J3vI z5!K6GGOp_-#O3nqp%l~X)CR7LS*<;If1upeybi%fq}|2$%af20Y$ii~UjbnvZLQ+* zjlm#m8D*vG-RUSMbF=zUh(6q$_?D~zUkq3ZhzL2dS?uDi6Z+4;tOi46X$E?l=a2^i z=WH-y`eiZ-jUG!By>R5{Lgl4DW@w6YTXgP_1fYAQS)`~G?u>5baAmkU-Vjn)fBz_i zO_zW!7YS-Z)yW#6K?P4jH9k1F8|i5=9rru4ZCmuT&f9262xPrMGWj*#t=#{`4<@GH)pY2W(IJyV?oj_D; zsZpHfUR@WQz>o|6DuQtR2^!=1=e}QIZWtsW?8ms)hU=fF_LOpYv!N*YMdP$lmwt=} zU=$H#n6;M_gZK0VAy#Z%Hs%Ln_UZ*7Ih2UADE>f86w#Z213Wa$1AK{nfBYoeC3XpI zfXBH#P*D^stj^cI%{kVV<)Sl>S9$X>t!ESG{1W2MEjoA|o7V-a3Ko4a`nh7-u>2aj zH2M$B=~~Sd?cPEUG&v`Wv~Z1kZQtM4u;y zugG^E+Z9Rs8+ohh#29wVfBrGK{x=YKUEmER<2A>pkH~?71kjzlAzz}aH%_WdYyWre zzo<&mRD)!``kOLDC0HoF>Bx%*_^`?&)u%S&I5tp}D$Mk_3DQ2GK|_AIs|T-;oJcO3 zE^+gN&b)DeF0j|9NI#i4|dx=$j4cSv=GH_lc|t023`zU5ID+W?x?rqmeRZ4t(Yxs@*^= z7_`e$o#YlXdx|LLe{XX!tMzRQtmV!dQ($L?)x52@BQ+%#Gns$7ldME96^{h{Rf!My zwm{#>&+#vr{4dgX+Eop>G2@=po*orau6aO>fP^Om(V3TB7TYz1oO76WR3X#jzTb!& z>t1!^{p%Kp5U!;uq(W)!kkbmqE{qU6C-yhq4jT|CLQYr7e{qk0K~Q0pyA{mc@YX&# z!4=H8XL7c+J9jE8OLA?(@$k)D93ghuPg*_t3Glw3tB0>foTyI$MEDZMzWD!}L6}zU zG!fd?w^*#UPZCgs8#sr0kni|sK$cQ4KyH)u70l$*O2Sd*L|_Qr;w_%%BG_n>%97p_ zT9*(yX44qrf7^KcH*OK0688T24z23VjAr-g4;d#_g(`>sMD3AYN#v7#eE3`kQ~ zDyW8B4P_R(#W4kfl($LHOzXQyxe z;^Qm%^ihVk!q0y2`6rZ%z9x&jy2(aKgdqI&Pw!zS@_w(cW;Co#(n@!@}U z6>V|pe^gjf9s~Km2ioR3ZR@55(e|qaYf{qE=5i7(lbcnEdE#vH;9S>G*B+*M$*$z$ z9OLola*qcHA=phn6klKP{BS?e+)`BiY#;3QA0f+|FM^3j_J`3oLKM!Dmbf{TKw$Z{ zgh75S3vSXeS0~0cwGZpRu;;KOL=J=PYjg^ae?!11auT^1nc*uSZ_=Qs(%+A}8>I87 zl&N6}&A2W`07gK$zsxfci-5#;CS<3%$d`WIZ~PPEhfuL5nKQ#!CF@F{Y+qz>hMQ^Ox7yCndMQ41H4+uAOyeoUQ~eD?liDlUrY z(2hqRTOQj>V6QYiSXZ793U*!;_8d*y&zwCK{-?>FpJZBMz z7%tHywI@QC@|t(V`9W$fp<4lGVRL_amGa~6>VGL=ZB?9u8Uqd5(>14e7NdERAc0(f z_`n$GJe4>UQ%xwWV=NKp@h+jRswW$W6jo{D$blnvO`)#(&M+zhm8CuHG6~lh{BQ2lY zRDZ-J7vmuD(RHT7!0jxFeoZ<*M19K1 z#Rz}?#MKt#Y+~|(PGV}^j%|mn|5ssXjOBxmyhVpnJx21-T_P8a*7>7F*gNQXbLh?~ z!*h@vaCq*5rfyZhm;6Lfb};OmT88n8Rew8qXLA4X3xqa6A%Zm0b0Ix9GLhO_q*p5I zv#9Wbpz&sRS#X2xqUZVbY2QLYTR#y*UkD$;W$Jgnc3d@rz)O^ZiG$cYDJOZh@hAVLO=n((36n2GGPZ9b6BEaDNF- zxi6qwI8izH`Wu^J6KH=!dR@#6>t;)EC)gRuy04sdlgPS&bg{%pHaMbXF7rw5$@lh+ zwPdXd3*DFK+QgCp;N9rmbeC@OWJ#8ecPkUylJnR(SQb^x{k+BCn`I{Q5Rj%xk$v+= z^XZv|ev9NVB0T}oeJxM}BrW(sGk+CH|HZjJF9Fyoj>wK;6+-A&+(S~M!Ik_UZ-f$} zBaHEV8I)Y4HFB;6IEueY(dIpWu}@uP(|j5tCMM@`qn9`t;{rL1WYrR@h@=94?ZzO+ zXan?6JHt0eY4`^+qJ>$&d?Vk+u&PF|_Wpvy$wC0t_Z$IQENCwzoN>ZjL zOQv?zD{Fos3q)-xWSV_vzqEn>-fJmfvnxf6aqM%_L)J*nm3Fl0ey$(Tqu15#7l`O! zSCbd+FaMG#vqKE7&UdX5h=&z=q83YUYWl(8L1sn2lBNam#{Z6TQ?)uX!Eay;l zW7iuyX0(xG%cMg4?^h&}kAEZq(QqH}sF2EdcM^rKufK)uL?#ZxW0gVZ1J2D-W*P|7Tw;4zeT!qPBh`}zp@(l%XiG@p3^D%$~` zrW?XKs!4Eczi_^Vxt|spV{E54hr{p1TG5RrM%5aydA`5UbgEafsDB$ia{B#3|0G1G zM+L>iRcw^-$edLt$jDQ11BAFKyY4Z`Di%Ev13!QLG0l2V{|X)G%9h~^WB^s)N{$^S zw2ErJi_S@uskL*vDqEd;z3A={3ASo6y{6v>(J zSXW~4-BN9oD-~Ud<$ndgamr6uYwwr73#6rktvCm6&u}Q!(Oa?4#~xorGHA^^~H<>YZH%gzv0a? z#T@AOP;2Yg=ZyZl!>~mB&>1Jq{s90EN+~ck9f}Z8a?5^9-hpdF&F2|W>G)CC2DemZ zYCpArGwO2ZJ-7G5cAkz~^Dk9=D%1W=6dBv&Bn9sGRdW3zt;4m(3s-#n7B`Bf!+lw= z5~uuDK|%Q{b$@WsLO%?T<&cDgcb}3vMtP#hF{W|eB!)0Yt+mZ&6v0#bBl~7yQh7Q$(D<|F`VF3rHR^iZzBj;PEi)aT*O;_S9-1pEq0tlKplFhScElv^ACYcu z=NK(bMKp(Zux?(#ES~dDz^#djR-!i!1k#sycC1-y%73M&>>|B-7*`DkNEIMXh45Oq z6_|y;(*I>vm-lY}+ADX0Hk!;YmXqn*{DZMwC`y=Fv&Z!kS2XgMDQmdeSRBCTG!=D4 zv?qpNjskEZ&4!D?fXCa8`u{PgE!h;@=*s_eO~WTCb2gJd%|cqAU)B@3Dv}PiJj}Xc zI><7CSbuYtYe4q%{4-PU*g7{A#(Me4ZGgYG)0ehu>d~L)6!9>Ze&!7ud4T(a3&`SB zJk$DSWD)l}BZHJfsmS5X6%NlqJQ|{l1`q^*bt~^uPCkF|Ew^MvK)e-Ya03uKU!~fY ze2F8R;_(BcPv+pq6v1*}OMv@lMBv^6r7~_`?td)LQrU0Vkyvl!qeWdE&IAg-G?Sdw zLY3Ys3om_s!#$Ha(&)Rls~{#EgdXG{uFH$^#;-``yMn#Gz;m*73x3sdqp9FC4m!$-q50!$fhs|uNx4jJvow5c@$)a&O>jWTCq_u}qjrMe;sW%Y@ zv1%vc*87bSQ&zQ6G-m_dLt3z6Q<)H_siUixU|<$32k*e#HWS00e3~78-Q3_@q(#2G zAS74VVgF)Bbc;~dC4h8AfYE}e4TIfPqks9q3@ZJx(A4sGHDrALlsL${Ba_m(hnXGO zK;MMOuA9A$yWv2&?8W25=8=gp1Sp%LFSrB-0{jS6-O4WHhPKwqa@^Fc&DOV#zR)xR z{*{X6ZLPibo0bfV?55O0u3?_xx6SgtbIpBN7votSMUhIAt7Ykk?$$xqi z)$1>xCrQ-BVt;l9@KOGN|L^A))gER-O|}gbEhQVkV!_b2a=_FmOIG*E0RckEAoBRa zOv6&dajHp*nNH04U3^#3mfTKI2=@tY(VnaM?-bjp>Fgy$poWk`ao)}71&PwR9==%} zDhqMr1Lp?{b^hm4SvSvWNv<||y?>=awQaCzwMFNK+6tci{lu(ZKvONA4N2~p&mh-e z8o!Cv)0FS)Pe}7zb~+RcW;A(uX*vk1FTHes|D?d;VVc_$5{X$yzehFTdNDK4n)?7S z)KL4aBhzBf@XBt_Q7J>m&l2|uK|rES&HM&>bOA@_eR|VBk?n6vfPKtRx_|l)1<>gj z1sy_&+l{EK#(G)N1zBCLnA+;fat7I{_FL@;yu?u6Cn-Zp9k}_MJreX$lof$;uccag z-vhoz{`i~qXR|2HwKb(Eq)%o%tODST73>LP=3*`~xUJT5z+ULFH|>(AeSj`fJaDm z4w58pq-H2bWPW?2M0O#{wjenM>30!)d|HKC4l$5{-rVrS_ILYMQGz-?J$?jaRomnJ zqo8H+oVngflz(6Va}K->LLP#1JTpy!$fasRO)vjUpdol$zSz*W-G9g9aPzYLD1ISP ztX_Muk_=AgVTb`@mN+@R(Exr4d?m&njGJA`N)A-7Zc7^VyHKLuKnUg6V|^&>tif2% zWVNxJ7K(rw3LJ{o>GUaM*sg4EIJQ?1%ueXOwit#Pox{$7f@w&m$h`O&$r%+D#XR2J z(`VMs_Wmd9;>k7VYkxXU%2FA9{RmH{eGpM68PaqjGsWwiuyV~y74+H<;yynefN2#{ zLuNn>a)qk)^=rP?nuxL4PI<#ST(`boCw!L3aGU35oK~6Klc0hrr$#lK+GEEq8YmAA zG+|s1%tn5b>zeQx*Iw9{59aag&{1pGu%7+F*gditAFxY0w|~-WFk>s4c5A>+=z@i? zA}F$*WfMRrVL;_h(5!l)ozDZrXUQ4v(dZ{gOpd@v$Hufm>4?vjMo8op<6my;!C%f%?h2ijUrfC><2?#=?;vAzDdMBa06~B(yIk+f|50znO>9U;Z{=n z-=r`+-km^?$bTDX@i~9YbG`2^VqQ0K29h*|t+uI~0dr}oK=n6pUXD?mgWXinI!}NV zPG9%0hVtxm;#QKf2w8gjywGuOECdTvhbD91qW{)B-rf{rP7ILLPX1NLD;*Y!;=~@v z&Q=k!4kZT5Gq3{8?yu1XUqc6(dA8%IL|cCs=%7TCk$;lc3iNi91$mJR_Fg!cqAy`d zJDf@Mo~2d>Vf^IS$^NB~>RlP!o}R_BFytOJ3}>V1(wMUu6fsb6Lp6yL*ZF*R6&A|A z;#LXglHm4`g1O(t@Od&oqppfAB8`((21o0Q#TyHciVqCxrg&$!|@IBL2C!p7RvFtVB}xOixRzCdGL z4Z%obG2L&Cem9P{4j!& zdfc_Lh4TPbX0O_ zj!JHMEs1U=yk2C=mqifUtGSFvcO&x z&wRHPBDS-NzRNWz;zhZ7XDEsMsCV*00!FbGk=uOXERClJqZnSD@|NHQcaV65^vO_JNA3tv=>ib5klROb0;b(lw(d~kJ7-BZG%3U>MVOn(+| z@L02-YE=;v9coZ^rTc|RfX-XUW4{en+F75!G8)x;)QCHdFf+N4q6Q9^eKig3w^?Ht zn#pT9L5|tAOkXnIC)aAM3M~G_i?{7pQEf^4gS)F0oWhDHT81cR#L{AshSjdl9@)9- zTgQ0_bw+I>eny`-GYKmP-~478yMOs9SQJ-HR6yJoPf+^NJC0gqEWA~7S-#fX-F52Z zc}QjiqHm`B4QP4eFyMmloJ9X#Nf@!(2xh$8j195TTfhZ$6HGkCxlPn4b zrK?4GOhmiNEZkPVEZU?;_*%6&+EZARyg}nQ|I4(`>vc|)b=PC;Js!uYt`YyWlcdPK z6?>p$Q?xXO=KIaewM?!3upl*!A z3jnG+*D8b%S#*P&ZYaNRPfz|v75*CH)#%iUq;s8G&#td%N&Nl1C6E=mdpT(I)A-+7_K&5DaaAah$hyP zkA-8R@XVTaPRQmQjhG{4PnzLWtmQiCg)}lI3mqjsc*WidrG{|%P(hUK*trJ+Xm(<- zJW!l%cbc7LCz7)Iv|!WW`QuxJyh)$f$E zB#kgPJCWPH`o&kgz-z{^AxZ#BJ?j0GN&y&;7qHkv%`aJ0$ zv?ZJVk$;k(&BU33^NF-^GT=GmjCOyKD8c%~#FV(by3Q$_c_RI!BZoyZ#Y0%RoU%Xg zlxLn*4;|gOA{)B{bkc@X-yD0aecft|&lQep`m5irg;sbE`Q3>$c(5Bh*~(UN*mVXX zvhj8G)a!gtN5(Ei7p6hv3KVps@mG*4GGzk6_J5_1O#+2AxRr8zsfoYOd{YYp`env#$E&VMIvzQ>CZ8+mO`p ze}6xUj!A1`_WgQjRLB+fzcw_D-(4M{4k-X|(Z490=L5X4WrFfpCi@{dT+;zEblZXC z^i2pFG4CY|PD~ly3K_4W+v5qHa}qQ#PzWTU=tHOx!{Mo+j=AsBFm&meOODmYoFM7v zlmEmtSOuF}4g2+w#=LXZ9|%i6q0o@^!KJ6>(O`!p?9qxvw!g? zjhQw3!vf3-!6Pqq)kQ@=QT(kW8cz+m5nzK4y%>nPMv2Z0A8@L7bhhjK=DAS6(Qkk& zysHMD&FHIZfEhPh*JN&!_G+X+B7cY`T88jjDGABPdvpa`@#(A601#DvwRG~H%gJll z&L=0>Zte?OCd+mV`PQ{MZ_wvCkT=p{&fG_5_#}Y7q*YC699Ce>iKCvlkGhA5Yf0J* zspYht`hv@Z6?oB-Kb?Ll$=6CZr#s-_c#n0?!95hRny8e>h-{0gCpAtqYkw{c6_Hf8 z|2QOOBRL^!A%=Oo2(lxZIa>obw#mFK$X3{H^C8G>#MST_M(97$)Uhsam{y6-Y&3{5 zy3o?LmqTyCuc$+zuBv|-r@VNQKM)LR4?@DgF`;BGoGu|S*kjG%b7AlRHo`tOA;|%e z0A@u9&s^(|=jefS-G>jmDSx?%qy2U@G!1hrEXqt;pxv8aC5^QV_vD;Ay(MC6($dYVbx9SzMT`HE&pAp#wnChT(ow`t{ zr~kO-DeDZw0~T0dKYzDBNz{=>r;~?mq}?=;o{C?}b!@(>Qel#a_NK8|pRQ0WhZ2^a*A z4+mJNpMAggT;zN)7(O&Sz|G)gqY$uA7(y0!%vf^e!U}tZx__8hw<@W#Z!0vFa3LX1 ztqpHIEwZboU73856tG}jk8^~OP&MwbDI=mme;@B@cA?-h)U1=_aTydl9ubYmjaIg(g#lG?vSVc7{j zU^G3*tf^IflaKw>^7)PJiqlrJdfYMEB#weqIfZwhFTg zC*f0`3PzpnqKE<&=o<244iuI^s#uj!f&hqZ`ez6$H1=zems=ehlN0nEG+M-HGP^rqb4|>s1#^4lNCf3Y z9BFZ`HE^Zyj%J|i%iMN&J^ZLjFyGCjw_)p`r8^$Sru(g8(kP?lmZu~)2p;Pf1`u{# zleBHCu$DnPc4Zk7^;G8!&urSSL!dJEGpkAeU4J$<%7dL3-d~fa!?Jal#Y3jg8Swa5 zCEX&e&vp}yc*)|f>h|Jl{aBp%20;hZ!j<#XFx(!GDxC&YyA1GmEfJAnJ=+8{@RmUN zgO8}y7wdkamo~&oh5j5>OF9u9byE%N0q<}rC(4TDHnOXLNy+BKCc&;klWdLkznvoN zbAO{o2KyU5tbv~FukrE~oyfUbujz32@#wUU)xbLE+$(d(fln1 z?PM)4wutFiKv){O!8F!Gsef_TCK*y9TYsbY%HJ;ObhD;AWg1@zVW-R5e29jhx+X?E zPDGTm?$Bx4O=Dh{mq)(~1^1shVTD%;fDCEO_z+IH9ZC~o_rMeSonr_e17%76z@C&K zae6Hgarv$W)?#y@qC3_sUxBL-MNkd9#CcAYDILJ0dY9uFcM`us*4WF~d4JWn-+zv& zhccrrlyUG-(jVxd3p^2-GovJ(gUY+`l?zfeB5bAy%0a|2WF~;_5!M@}t9tr|z z0$e_4fd{922{vGcqVn0~A^v0snSX8&@);W%oMZbCpWavg=*Tn(R{D+^vGne_nA91S z|I3=xHV+sV-cAa&$QbVC!&v{Do0;|pOp+#%Nf}5Pf*j`9)!I=yAiMA`dK5>q8{7R! zbsC*Ed|b%i0NUVlm-X5Xayg*#n;jBK+NxQw{cGS^D!Gt$dH8P8FVxqDt$+4taz;^M zqT`>V%x>ZU{6ANDBGSv{##cEEI`I?qrKqc|QVEgl#NkByFy)d9dt5 z;hT-$)dN^z&-+V#*ka?xI<#7Yz6$`{SN-=`aCP>Pw0D1tbumKA&iWGpL3Tc!{kpi2 zr!nG0w$PBKO0xB_R;S1(0)N~sqVg+g(7*M{4c$#A#CLBrqts7^0kvxUkh&?A~y+;l8q}wZGXEfK_D1J{CGmfoOq{Zw)jqn4-EA)zt;^SL)uuOESC*^Bq4dw z&wy@G6OVOI&&>6<6N!oJ7A(RWpA~rT$R>Wr8Saq~_@;-QL`g$QD*kN$)GHu$*X zOm(cfk=>QT7r)&l?q_2lrF+Nzakq*)Od+p9VVey#<5wQqbALw<@kD!K=HGJ&5#$N< zXT7K6;URq3EIAj}OF!&iJIF{XUA_prixXs}G1dMdy$i24a84%vqBnWV)*xkRY~k-{ zAIRw&0?5~RW1-Lne0m<#`WPN{d_Y(|MzORKmZu4XK+x=_heNiIk{U@PlCGvygwyvy|Ts59*?Z(Zm`m+uBSG$MS(_OX1G!7sF^U19s)uODM{#cq~ zZE6mK^mV)mh5>zti#p}t#h+d)i`OFgQwqpXz;^Yylz-Q2HQqcgrKvd2cBM=s>O9Yy zogCP(LCUnoSyr80mV0gD7xu5lQA>l5Kk+(e%sQ#m+pdd&SFhY`2F=zSLxew=OQd+< zX00upxc+=mm_IrGJ~i#W+t%Z3O4wBwga=Uw#B7}QkUFqbK02P$tZ)JwO|StBngl`V z-bruZa(^HSj(aNDC+0w=XmYMSr7I$^+Xafd{g0{ag>`RrIuZ|2a!EK~?(MoYTci9y zJja*norCFMS2ig>G5UnWfVBJp^z&~m( znGaG^9>B^1ASl0x5b#anx~FnzNbD$7>L00-S18M7ttAru6YNSpKR2@Jq~<8X(|@s_ zSn&PS2q|_5T0J~1-AIjHhv7IBKJbn^Kl_Q7na7S#DCIRRmV!f_^OW0nN z%G9~yf9HQAtHi!DF4Y~zC5i0>Q-4gzNny`^##lLpUKc}Q?0S$I=r3`2B9_03DLj?* zW7*2M4f6A`JTQ|2&76Uf1#(*lUqT2eAXW!o;NW=j@p!xRlnQBm;oBDguSTGny(j-k zofOrq`mmdoL_nF!&ctCmx6499o~CPL7`0s`Wm4kdeyJ_P3SYJo!^;%!e%s7S8edTn z=G|pBv(1q5X|%b2i`x0DHGi`yr!UrB@=KNFX@>%=TEpZ@VmVDYjoQ0NoT{UNJdevv zhEM35(_=XvVl;PmkS+tcZ_#7fztnb&`hOOir!khQTKky;5QWVsJ*$mtqwPZ>RN2UsOY6#oyJzY9XysU?|)+4Xzko zjGLt$I$B)~xKoWfOK^%QNIC_aikDFXSs44n^}S*{7Qvw++s&XXIH8BP9&NsD z7+iB5ee09+Vv<%9aDPEA_?1}52C$W$2lq!$6qFn;vRVyMq;H4nJGn1~F7{&-hSDkS z>?KGGN(ke;-i)#RT}?{Yfa$>_km8Y8*b|NMC#;m+jHi8frUUp5W)HX8OCXv=jyshs z1TmVje3ZIRG>lJ8?a5;4ic3}Lts_2lZUC)TD?-HUSf*vEN`D-;exHYQotsh26fA4^ zkXkEtJFW6|(~h2C0yL26AsC^ncYF^zbmY$vTTCYCm-{bSZr6lb`Fla<-YJtR%Yipd zF)OU%*Pydz^ywNQflxy1rc=*j_&0zzm6e}6a;->K5-qJ;kUGKO-!@R_MR12fe6PWh z``n0`=hx-Cs(-+9o%LI-zqs8_xaab3jo3^$U6*kV)X*mV2b_dTcQ>S|xcOiqG6d3hZ}o8)ZFe z0jC!1EZjOUahQ61Jw&KBp~5&m_M|_M%`6xrS9|a7TAR)u`6iGyC=dff#egh!l{ozO zs7Mzk=YJoSt_aTnNWdpEECV<7t23SKJ2k%+<3deJXrM@fwL5980O_se#kNLscY z_N}BF(0_bFD*R6vrSl*Zmorj5)EijOm9|aL^MBM$R5#duDOcSQO(E7PoK@hZJX6Gm zju-Zu9d-TIGd;6Ky8DakYL1AS0av81o&o2+#C;vbYij_j4MZtqF&pBho$))s(Pi_( z&;9tj{U-STpHJDk}m>VEDdJVIU-gXv?v*Vr1#r9-vrJ)VUQB{HH|}a5a693GQ15|k|_I$ zUA+5HpF+eZBRud1p@5($iYK;qpU%Aj9#ifS|aa};FWJ#~xq9mp2& zl$^Ox*-yZuO%uWiwAx!wilqe8Fzdu61%HQGh^f^L&s}{uM*S71*j-1M^oQ1=kos+^ z(<>WoxbhB6hY=kioz=wqUzx?w7Ar0|W6nNS}X@DyEQe+A<%dy_xPG=K1 z^ER41dt(e%_voc8Ds3c$>^_8?WQ&6knqNgRQAyVt9dan=lJ=Sj_9EUU4~#dSQ-2R8 z-}bLo&B~QQlL@5Cx0Q@V_mNKFJv~q8bcnms2f|N^imao1v=v_N9ViaSxyw>=t}TW3 z9;uP0nfvK5^mA2oC*0%ZENNp$50E}yqDPs-`d;5U9qry9o5hTJ9!oh%Weh-vX+s?6ON89(N`}m`EOvqnGuw9{brQCg~aozsT=hs6&*z zy}zlOl37Ki4TUA#bKajb*m9?oogi@;&raY^@?|;H>}Tn%$yWqrm+d<;n)SnKycm z-buGSkCJB#-}H*hb=wU%cfwmDrjXVW3h}3bm^=1Fag{(3x2qUTMfYf&U*WE6)=u*I z-zZ;kJL&OUlyCXVJ-DUhi;b2WfuRT1ur-Jwl2}&`FxC&Vu{fCa!+*RR)%^M*x~=oU z?tbrAid)FF*=O@A;j_ggQp6$XyQr=e_8kYIhffj}xL*+!ztf5?z2DE4%;#F0OE zl{G7>0GQgKCoV1`7@)xZF>95O|0tUV6=h~w<~$wQ6x7^T%mVG_dU_=au2R)?;oUx{ zckqf>_kK?&yLIHS+skv28tVv-zo(O!t?Dh_rlJks(X@|3xPOZ}zMzJLzrrJU6-i)! zRr+a=%w#tab`-lD;?qa5Wc?E)XN*Op{a{2G5_XNDLW7}J$l9K0&j!j_ERa;tUZZXX zxpeIMVo7I0-(EkSSznNgU zufEu-V6Kk?hkrLxrcSTng(Sl;Jwk<=cFZV#`SR2Mxba%o^d49EXczN?auu{<{4#DB}BA0**AN|R1IT|T4nK3Svu zedkRPK$+L+8_qNiPn}2-RYy-ksRa;`g#xce@3z>4`UwDRgye3sLZiuWpO^sKEGZ)5 zf)Hk@?)IksVceZmfi8g_9hDsIhkjAqh6j)jPP-i8)BpnQkD(iH+_(Yn2%f{r4F3DY zFMa_8�m&-K!MmFVt+fvA`Se4Q4|ZY*cVx3yNrs$i^wv% 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

    dPX9 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