get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/127905/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 127905,
    "url": "http://patches.dpdk.org/api/patches/127905/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230601195538.8265-33-ivan.malov@arknetworks.am/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20230601195538.8265-33-ivan.malov@arknetworks.am>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230601195538.8265-33-ivan.malov@arknetworks.am",
    "date": "2023-06-01T19:55:36",
    "name": "[32/34] net/sfc: indicate MAE counter type in use for transfer flows",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e7dcf753e021d71884d8c12d57b172ba4e50c0ab",
    "submitter": {
        "id": 2962,
        "url": "http://patches.dpdk.org/api/people/2962/?format=api",
        "name": "Ivan Malov",
        "email": "ivan.malov@arknetworks.am"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230601195538.8265-33-ivan.malov@arknetworks.am/mbox/",
    "series": [
        {
            "id": 28307,
            "url": "http://patches.dpdk.org/api/series/28307/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=28307",
            "date": "2023-06-01T19:55:04",
            "name": "net/sfc: support HW conntrack assistance",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/28307/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/127905/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/127905/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D74AC42C07;\n\tThu,  1 Jun 2023 21:59:12 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id F1C9D4301D;\n\tThu,  1 Jun 2023 21:56:21 +0200 (CEST)",
            "from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80])\n by mails.dpdk.org (Postfix) with ESMTP id AF3CD42D17\n for <dev@dpdk.org>; Thu,  1 Jun 2023 21:55:58 +0200 (CEST)",
            "from localhost.localdomain (unknown [78.109.69.146])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by agw.arknetworks.am (Postfix) with ESMTPSA id 415F3E1435;\n Thu,  1 Jun 2023 23:55:58 +0400 (+04)"
        ],
        "From": "Ivan Malov <ivan.malov@arknetworks.am>",
        "To": "dev@dpdk.org",
        "Cc": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>,\n Ferruh Yigit <ferruh.yigit@amd.com>, Andy Moreton <amoreton@xilinx.com>",
        "Subject": "[PATCH 32/34] net/sfc: indicate MAE counter type in use for transfer\n flows",
        "Date": "Thu,  1 Jun 2023 23:55:36 +0400",
        "Message-Id": "<20230601195538.8265-33-ivan.malov@arknetworks.am>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20230601195538.8265-1-ivan.malov@arknetworks.am>",
        "References": "<20230601195538.8265-1-ivan.malov@arknetworks.am>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Doing so assists adding support for additional counter types.\n\nCurrent implementation is only aware of action rule counters\nthat are supported by the match-action engine (MAE) on EF100\nNICs, but MAE may also support conntrack assistance counters.\n\nSigned-off-by: Ivan Malov <ivan.malov@arknetworks.am>\nReviewed-by: Andy Moreton <amoreton@xilinx.com>\n---\n drivers/net/sfc/sfc_mae.c         | 56 ++++++++++++++--------\n drivers/net/sfc/sfc_mae.h         |  7 ++-\n drivers/net/sfc/sfc_mae_counter.c | 77 +++++++++++++++++++++++--------\n drivers/net/sfc/sfc_mae_counter.h |  2 +-\n 4 files changed, 100 insertions(+), 42 deletions(-)",
    "diff": "diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c\nindex 9851690f58..5687fa3af4 100644\n--- a/drivers/net/sfc/sfc_mae.c\n+++ b/drivers/net/sfc/sfc_mae.c\n@@ -65,15 +65,24 @@ sfc_mae_assign_entity_mport(struct sfc_adapter *sa,\n \n static int\n sfc_mae_counter_registry_init(struct sfc_mae_counter_registry *registry,\n-\t\t\t      uint32_t nb_counters_max)\n+\t\t\t      uint32_t nb_action_counters_max)\n {\n-\treturn sfc_mae_counters_init(&registry->counters, nb_counters_max);\n+\tint ret;\n+\n+\tret = sfc_mae_counters_init(&registry->action_counters,\n+\t\t\t\t    nb_action_counters_max);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n+\tregistry->action_counters.type = EFX_COUNTER_TYPE_ACTION;\n+\n+\treturn 0;\n }\n \n static void\n sfc_mae_counter_registry_fini(struct sfc_mae_counter_registry *registry)\n {\n-\tsfc_mae_counters_fini(&registry->counters);\n+\tsfc_mae_counters_fini(&registry->action_counters);\n }\n \n struct rte_flow *\n@@ -153,10 +162,10 @@ sfc_mae_attach(struct sfc_adapter *sa)\n \n \t\tsfc_log_init(sa, \"init MAE counter record registry\");\n \t\trc = sfc_mae_counter_registry_init(&mae->counter_registry,\n-\t\t\t\t\t\t   limits.eml_max_n_counters);\n+\t\t\t\t\tlimits.eml_max_n_action_counters);\n \t\tif (rc != 0) {\n-\t\t\tsfc_err(sa, \"failed to init MAE counters registry for %u entries: %s\",\n-\t\t\t\tlimits.eml_max_n_counters, rte_strerror(rc));\n+\t\t\tsfc_err(sa, \"failed to init record registry for %u AR counters: %s\",\n+\t\t\t\tlimits.eml_max_n_action_counters, rte_strerror(rc));\n \t\t\tgoto fail_counter_registry_init;\n \t\t}\n \t}\n@@ -833,6 +842,9 @@ sfc_mae_counter_add(struct sfc_adapter *sa,\n \tif (counter_tmp != NULL) {\n \t\tcounter->rte_id_valid = counter_tmp->rte_id_valid;\n \t\tcounter->rte_id = counter_tmp->rte_id;\n+\t\tcounter->type = counter_tmp->type;\n+\t} else {\n+\t\tcounter->type = EFX_COUNTER_TYPE_ACTION;\n \t}\n \n \tcounter->fw_rsrc.counter_id.id = EFX_MAE_RSRC_ID_INVALID;\n@@ -864,8 +876,8 @@ sfc_mae_counter_del(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \tif (counter->fw_rsrc.counter_id.id != EFX_MAE_RSRC_ID_INVALID ||\n \t    counter->fw_rsrc.refcnt != 0) {\n-\t\tsfc_err(sa, \"deleting counter=%p abandons its FW resource: COUNTER_ID=0x%08x, refcnt=%u\",\n-\t\t\tcounter, counter->fw_rsrc.counter_id.id,\n+\t\tsfc_err(sa, \"deleting counter=%p abandons its FW resource: COUNTER_ID=0x%x-#%u, refcnt=%u\",\n+\t\t\tcounter, counter->type, counter->fw_rsrc.counter_id.id,\n \t\t\tcounter->fw_rsrc.refcnt);\n \t}\n \n@@ -916,8 +928,8 @@ sfc_mae_counter_enable(struct sfc_adapter *sa, struct sfc_mae_counter *counter,\n \t}\n \n \tif (fw_rsrc->refcnt == 0) {\n-\t\tsfc_dbg(sa, \"enabled counter=%p: COUNTER_ID=0x%08x\",\n-\t\t\tcounter, fw_rsrc->counter_id.id);\n+\t\tsfc_dbg(sa, \"enabled counter=%p: COUNTER_ID=0x%x-#%u\",\n+\t\t\tcounter, counter->type, fw_rsrc->counter_id.id);\n \t}\n \n \t++(fw_rsrc->refcnt);\n@@ -940,8 +952,8 @@ sfc_mae_counter_disable(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \tif (fw_rsrc->counter_id.id == EFX_MAE_RSRC_ID_INVALID ||\n \t    fw_rsrc->refcnt == 0) {\n-\t\tsfc_err(sa, \"failed to disable counter=%p: already disabled; COUNTER_ID=0x%08x, refcnt=%u\",\n-\t\t\tcounter, fw_rsrc->counter_id.id, fw_rsrc->refcnt);\n+\t\tsfc_err(sa, \"failed to disable counter=%p: already disabled; COUNTER_ID=0x%x-#%u, refcnt=%u\",\n+\t\t\tcounter, counter->type, fw_rsrc->counter_id.id, fw_rsrc->refcnt);\n \t\treturn;\n \t}\n \n@@ -950,11 +962,11 @@ sfc_mae_counter_disable(struct sfc_adapter *sa, struct sfc_mae_counter *counter)\n \n \t\trc = sfc_mae_counter_fw_rsrc_disable(sa, counter);\n \t\tif (rc == 0) {\n-\t\t\tsfc_dbg(sa, \"disabled counter=%p with COUNTER_ID=0x%08x\",\n-\t\t\t\tcounter, counter_id);\n+\t\t\tsfc_dbg(sa, \"disabled counter=%p with COUNTER_ID=0x%x-#%u\",\n+\t\t\t\tcounter, counter->type, counter_id);\n \t\t} else {\n-\t\t\tsfc_err(sa, \"failed to disable counter=%p with COUNTER_ID=0x%08x: %s\",\n-\t\t\t\tcounter, counter_id, strerror(rc));\n+\t\t\tsfc_err(sa, \"failed to disable counter=%p with COUNTER_ID=0x%x-#%u: %s\",\n+\t\t\t\tcounter, counter->type, counter_id, strerror(rc));\n \t\t}\n \n \t\tfw_rsrc->counter_id.id = EFX_MAE_RSRC_ID_INVALID;\n@@ -3954,6 +3966,7 @@ sfc_mae_rule_parse_action_mark(struct sfc_adapter *sa,\n static int\n sfc_mae_rule_parse_action_count(struct sfc_adapter *sa,\n \t\t\t\tconst struct rte_flow_action_count *conf,\n+\t\t\t\tefx_counter_type_t mae_counter_type,\n \t\t\t\tstruct sfc_mae_counter **counterp,\n \t\t\t\tefx_mae_actions_t *spec)\n {\n@@ -3993,6 +4006,8 @@ sfc_mae_rule_parse_action_count(struct sfc_adapter *sa,\n \t\tcounter_tmp.rte_id = conf->id;\n \t}\n \n+\tcounter_tmp.type = mae_counter_type;\n+\n \treturn sfc_mae_counter_add(sa, &counter_tmp, counterp);\n \n \treturn 0;\n@@ -4217,6 +4232,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n {\n \tstruct sfc_flow_spec_mae *spec_mae = &flow->spec.mae;\n \tconst struct sfc_mae_outer_rule *outer_rule = spec_mae->outer_rule;\n+\tefx_counter_type_t mae_counter_type = EFX_COUNTER_TYPE_ACTION;\n \tconst uint64_t rx_metadata = sa->negotiated_rx_metadata;\n \tstruct sfc_mae_counter **counterp = &ctx->counter;\n \tefx_mae_actions_t *spec = ctx->spec;\n@@ -4309,6 +4325,7 @@ sfc_mae_rule_parse_action(struct sfc_adapter *sa,\n \t\tSFC_BUILD_SET_OVERFLOW(RTE_FLOW_ACTION_TYPE_COUNT,\n \t\t\t\t       bundle->actions_mask);\n \t\trc = sfc_mae_rule_parse_action_count(sa, action->conf,\n+\t\t\t\t\t\t     mae_counter_type,\n \t\t\t\t\t\t     counterp, spec_ptr);\n \t\tbreak;\n \tcase RTE_FLOW_ACTION_TYPE_INDIRECT:\n@@ -4887,8 +4904,7 @@ sfc_mae_query_counter(struct sfc_adapter *sa,\n \n \tif (conf == NULL ||\n \t    (counter->rte_id_valid && conf->id == counter->rte_id)) {\n-\t\trc = sfc_mae_counter_get(&sa->mae.counter_registry.counters,\n-\t\t\t\t\t counter, data);\n+\t\trc = sfc_mae_counter_get(sa, counter, data);\n \t\tif (rc != 0) {\n \t\t\treturn rte_flow_error_set(error, EINVAL,\n \t\t\t\tRTE_FLOW_ERROR_TYPE_ACTION, action,\n@@ -5002,6 +5018,7 @@ sfc_mae_indir_action_create(struct sfc_adapter *sa,\n \tswitch (action->type) {\n \tcase RTE_FLOW_ACTION_TYPE_COUNT:\n \t\tret = sfc_mae_rule_parse_action_count(sa, action->conf,\n+\t\t\t\t\t\t      EFX_COUNTER_TYPE_ACTION,\n \t\t\t\t\t\t      &handle->counter, NULL);\n \t\tif (ret == 0)\n \t\t\thandle->counter->indirect = true;\n@@ -5065,8 +5082,7 @@ sfc_mae_indir_action_query(struct sfc_adapter *sa,\n \t\tif (handle->counter->fw_rsrc.refcnt == 0)\n \t\t\tgoto fail_not_in_use;\n \n-\t\tret = sfc_mae_counter_get(&sa->mae.counter_registry.counters,\n-\t\t\t\t\t  handle->counter, data);\n+\t\tret = sfc_mae_counter_get(sa, handle->counter, data);\n \t\tif (ret != 0)\n \t\t\tgoto fail_counter_get;\n \ndiff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h\nindex e7b7d3a35e..3a3a5225fd 100644\n--- a/drivers/net/sfc/sfc_mae.h\n+++ b/drivers/net/sfc/sfc_mae.h\n@@ -86,6 +86,7 @@ struct sfc_mae_counter {\n \tstruct sfc_mae_fw_rsrc\t\tfw_rsrc;\n \n \tbool\t\t\t\tindirect;\n+\tefx_counter_type_t\t\ttype;\n };\n \n TAILQ_HEAD(sfc_mae_counters, sfc_mae_counter);\n@@ -157,6 +158,8 @@ struct sfc_mae_counter_records {\n \tstruct sfc_mae_counters_xstats\txstats;\n \t/** Count of all MAE counters */\n \tunsigned int\t\t\tn_mae_counters;\n+\t/** Counter type, for logging */\n+\tefx_counter_type_t\t\ttype;\n };\n \n /** Options for MAE counter polling mode */\n@@ -168,8 +171,8 @@ enum sfc_mae_counter_polling_mode {\n \n struct sfc_mae_counter_registry {\n \t/* Common counter information */\n-\t/** Counters collection */\n-\tstruct sfc_mae_counter_records\tcounters;\n+\t/** Action rule counter record collection */\n+\tstruct sfc_mae_counter_records\taction_counters;\n \n \t/* Information used by counter update service */\n \t/** Callback to get packets from RxQ */\ndiff --git a/drivers/net/sfc/sfc_mae_counter.c b/drivers/net/sfc/sfc_mae_counter.c\nindex 90b89e81c6..47448cba15 100644\n--- a/drivers/net/sfc/sfc_mae_counter.c\n+++ b/drivers/net/sfc/sfc_mae_counter.c\n@@ -80,19 +80,28 @@ sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t\t\t       struct sfc_mae_counter *counterp)\n {\n \tstruct sfc_mae_counter_registry *reg = &sa->mae.counter_registry;\n-\tstruct sfc_mae_counter_records *counters = &reg->counters;\n+\tstruct sfc_mae_counter_records *counters;\n \tstruct sfc_mae_counter_record *p;\n \tefx_counter_t mae_counter;\n \tuint32_t generation_count;\n \tuint32_t unused;\n \tint rc;\n \n+\tswitch (counterp->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = &reg->action_counters;\n+\t\tbreak;\n+\tdefault:\n+\t\trc = EINVAL;\n+\t\tgoto fail_counter_type_check;\n+\t}\n+\n \t/*\n \t * The actual count of counters allocated is ignored since a failure\n \t * to allocate a single counter is indicated by non-zero return code.\n \t */\n-\trc = efx_mae_counters_alloc(sa->nic, 1, &unused, &mae_counter,\n-\t\t\t\t    &generation_count);\n+\trc = efx_mae_counters_alloc_type(sa->nic, counterp->type, 1, &unused,\n+\t\t\t\t\t &mae_counter, &generation_count);\n \tif (rc != 0) {\n \t\tsfc_err(sa, \"failed to alloc MAE counter: %s\",\n \t\t\trte_strerror(rc));\n@@ -132,16 +141,18 @@ sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t */\n \t__atomic_store_n(&p->inuse, true, __ATOMIC_RELEASE);\n \n-\tsfc_info(sa, \"enabled MAE counter #%u with reset pkts=%\" PRIu64\n-\t\t \" bytes=%\" PRIu64, mae_counter.id,\n+\tsfc_info(sa, \"enabled MAE counter 0x%x-#%u with reset pkts=%\" PRIu64\n+\t\t \" bytes=%\" PRIu64, counterp->type, mae_counter.id,\n \t\t p->reset.pkts, p->reset.bytes);\n \n \treturn 0;\n \n fail_counter_id_range:\n-\t(void)efx_mae_counters_free(sa->nic, 1, &unused, &mae_counter, NULL);\n+\t(void)efx_mae_counters_free_type(sa->nic, counterp->type, 1, &unused,\n+\t\t\t\t\t &mae_counter, NULL);\n \n fail_mae_counter_alloc:\n+fail_counter_type_check:\n \tsfc_log_init(sa, \"failed: %s\", rte_strerror(rc));\n \treturn rc;\n }\n@@ -151,12 +162,20 @@ sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \t\t\t\tstruct sfc_mae_counter *counter)\n {\n \tstruct sfc_mae_counter_registry *reg = &sa->mae.counter_registry;\n-\tstruct sfc_mae_counter_records *counters = &reg->counters;\n \tefx_counter_t *mae_counter = &counter->fw_rsrc.counter_id;\n+\tstruct sfc_mae_counter_records *counters;\n \tstruct sfc_mae_counter_record *p;\n \tuint32_t unused;\n \tint rc;\n \n+\tswitch (counter->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = &reg->action_counters;\n+\t\tbreak;\n+\tdefault:\n+\t\treturn EINVAL;\n+\t}\n+\n \tSFC_ASSERT(mae_counter->id < counters->n_mae_counters);\n \t/*\n \t * The flag is set at the very end of add operation and reset\n@@ -166,13 +185,14 @@ sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \tp = &counters->mae_counters[mae_counter->id];\n \t__atomic_store_n(&p->inuse, false, __ATOMIC_RELEASE);\n \n-\trc = efx_mae_counters_free(sa->nic, 1, &unused, mae_counter, NULL);\n+\trc = efx_mae_counters_free_type(sa->nic, counter->type, 1, &unused,\n+\t\t\t\t\tmae_counter, NULL);\n \tif (rc != 0)\n-\t\tsfc_err(sa, \"failed to free MAE counter %u: %s\",\n-\t\t\tmae_counter->id, rte_strerror(rc));\n+\t\tsfc_err(sa, \"failed to free MAE counter 0x%x-#%u: %s\",\n+\t\t\tcounter->type, mae_counter->id, rte_strerror(rc));\n \n-\tsfc_info(sa, \"disabled MAE counter #%u with reset pkts=%\" PRIu64\n-\t\t \" bytes=%\" PRIu64, mae_counter->id,\n+\tsfc_info(sa, \"disabled MAE counter 0x%x-#%u with reset pkts=%\" PRIu64\n+\t\t \" bytes=%\" PRIu64, counter->type, mae_counter->id,\n \t\t p->reset.pkts, p->reset.bytes);\n \n \t/*\n@@ -243,8 +263,8 @@ sfc_mae_counter_increment(struct sfc_adapter *sa,\n \t\t\t\t __ATOMIC_RELAXED);\n \t}\n \n-\tsfc_info(sa, \"update MAE counter #%u: pkts+%\" PRIu64 \"=%\" PRIu64\n-\t\t \", bytes+%\" PRIu64 \"=%\" PRIu64, mae_counter_id,\n+\tsfc_info(sa, \"update MAE counter 0x%x-#%u: pkts+%\" PRIu64 \"=%\" PRIu64\n+\t\t \", bytes+%\" PRIu64 \"=%\" PRIu64, counters->type, mae_counter_id,\n \t\t pkts, cnt_val.pkts, bytes, cnt_val.bytes);\n }\n \n@@ -253,6 +273,7 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t\t\t     struct sfc_mae_counter_registry *counter_registry,\n \t\t\t     const struct rte_mbuf *m)\n {\n+\tstruct sfc_mae_counter_records *counters;\n \tuint32_t generation_count;\n \tconst efx_xword_t *hdr;\n \tconst efx_oword_t *counters_data;\n@@ -293,7 +314,12 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t}\n \n \tid = EFX_XWORD_FIELD(*hdr, ERF_SC_PACKETISER_HEADER_IDENTIFIER);\n-\tif (unlikely(id != ERF_SC_PACKETISER_HEADER_IDENTIFIER_AR)) {\n+\n+\tswitch (id) {\n+\tcase ERF_SC_PACKETISER_HEADER_IDENTIFIER_AR:\n+\t\tcounters = &counter_registry->action_counters;\n+\t\tbreak;\n+\tdefault:\n \t\tsfc_err(sa, \"unexpected MAE counters source identifier %u\", id);\n \t\treturn;\n \t}\n@@ -367,7 +393,7 @@ sfc_mae_parse_counter_packet(struct sfc_adapter *sa,\n \t\t\tEFX_OWORD_FIELD32(counters_data[i],\n \t\t\t\tERF_SC_PACKETISER_PAYLOAD_BYTE_COUNT_HI);\n \t\tsfc_mae_counter_increment(sa,\n-\t\t\t&counter_registry->counters,\n+\t\t\tcounters,\n \t\t\tEFX_OWORD_FIELD32(counters_data[i],\n \t\t\t\tERF_SC_PACKETISER_PAYLOAD_COUNTER_INDEX),\n \t\t\tgeneration_count,\n@@ -941,14 +967,25 @@ sfc_mae_counter_start(struct sfc_adapter *sa)\n }\n \n int\n-sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n+sfc_mae_counter_get(struct sfc_adapter *sa,\n \t\t    const struct sfc_mae_counter *counter,\n \t\t    struct rte_flow_query_count *data)\n {\n \tstruct sfc_ft_ctx *ft_ctx = counter->ft_ctx;\n+\tstruct sfc_mae_counter_records *counters;\n \tuint64_t non_reset_tunnel_hit_counter;\n \tstruct sfc_mae_counter_record *p;\n \tunion sfc_pkts_bytes value;\n+\tbool need_byte_count;\n+\n+\tswitch (counter->type) {\n+\tcase EFX_COUNTER_TYPE_ACTION:\n+\t\tcounters = &sa->mae.counter_registry.action_counters;\n+\t\tneed_byte_count = true;\n+\t\tbreak;\n+\tdefault:\n+\t\treturn EINVAL;\n+\t}\n \n \tSFC_ASSERT(counter->fw_rsrc.counter_id.id < counters->n_mae_counters);\n \tp = &counters->mae_counters[counter->fw_rsrc.counter_id.id];\n@@ -968,7 +1005,7 @@ sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n \t\tdata->hits += ft_ctx->switch_hit_counter;\n \t\tnon_reset_tunnel_hit_counter = data->hits;\n \t\tdata->hits -= ft_ctx->reset_tunnel_hit_counter;\n-\t} else {\n+\t} else if (need_byte_count) {\n \t\tdata->bytes_set = 1;\n \t\tdata->bytes = value.bytes - p->reset.bytes;\n \t}\n@@ -979,7 +1016,9 @@ sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n \t\t\t\tnon_reset_tunnel_hit_counter;\n \t\t} else {\n \t\t\tp->reset.pkts = value.pkts;\n-\t\t\tp->reset.bytes = value.bytes;\n+\n+\t\t\tif (need_byte_count)\n+\t\t\t\tp->reset.bytes = value.bytes;\n \t\t}\n \t}\n \ndiff --git a/drivers/net/sfc/sfc_mae_counter.h b/drivers/net/sfc/sfc_mae_counter.h\nindex 9c6d8103ac..effb037799 100644\n--- a/drivers/net/sfc/sfc_mae_counter.h\n+++ b/drivers/net/sfc/sfc_mae_counter.h\n@@ -45,7 +45,7 @@ int sfc_mae_counter_fw_rsrc_enable(struct sfc_adapter *sa,\n \t\t\t\t   struct sfc_mae_counter *counterp);\n int sfc_mae_counter_fw_rsrc_disable(struct sfc_adapter *sa,\n \t\t\t\t    struct sfc_mae_counter *counter);\n-int sfc_mae_counter_get(struct sfc_mae_counter_records *counters,\n+int sfc_mae_counter_get(struct sfc_adapter *sa,\n \t\t\tconst struct sfc_mae_counter *counter,\n \t\t\tstruct rte_flow_query_count *data);\n \n",
    "prefixes": [
        "32/34"
    ]
}