]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: enetc: add "Update" operation to the egress count table
authorWei Fang <wei.fang@nxp.com>
Thu, 11 Jun 2026 02:14:53 +0000 (10:14 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jun 2026 21:32:05 +0000 (14:32 -0700)
The egress count table is a static bounded index table, egress related
statistics are maintained in this table. The table is implemented as a
linear array of entries accessed using an index (0, 1, 2, ..., n) that
uniquely identifies an entry within the array. Egress Counter Entry ID
(EC_EID) is used as an index to an entry in this table. The EC_EID is
specified in the egress treatment table.

Egress count table entries are always present and enabled. The table
only supports access via entry ID, which is assigned by the software.
And it supports Update, Query and Query followed by Update operations.
Currently, only Update operation is supported.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Link: https://patch.msgid.link/20260611021458.2629145-5-wei.fang@oss.nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/ntmp.c
include/linux/fsl/ntmp.h

index 9249f78219edfe1fa67d3964b329b0fbc4558c68..601435966ed1ae8706eb498295c39f7d779ea693 100644 (file)
@@ -25,6 +25,7 @@
 #define NTMP_FDBT_ID                   15
 #define NTMP_VFT_ID                    18
 #define NTMP_ETT_ID                    33
+#define NTMP_ECT_ID                    39
 #define NTMP_BPT_ID                    41
 
 /* Generic Update Actions for most tables */
@@ -33,6 +34,7 @@
 
 /* Specific Update Actions for some tables */
 #define FDBT_UA_ACTEU                  BIT(1)
+#define ECT_UA_STSEU                   BIT(0)
 #define BPT_UA_BPSEU                   BIT(1)
 
 /* Query Action: 0: Full query. 1: Query entry ID, the fields after entry
@@ -287,6 +289,8 @@ static const char *ntmp_table_name(int tbl_id)
                return "VLAN Filter Table";
        case NTMP_ETT_ID:
                return "Egress Treatment Table";
+       case NTMP_ECT_ID:
+               return "Egress Count Table";
        case NTMP_BPT_ID:
                return "Buffer Pool Table";
        default:
@@ -1197,6 +1201,47 @@ int ntmp_ett_delete_entry(struct ntmp_user *user, u32 entry_id)
 }
 EXPORT_SYMBOL_GPL(ntmp_ett_delete_entry);
 
+/**
+ * ntmp_ect_update_entry - reset the statistics element data of the
+ * specified egress counter table entry
+ * @user: target ntmp_user struct
+ * @entry_id: entry ID
+ *
+ * Return: 0 on success, otherwise a negative error code
+ */
+int ntmp_ect_update_entry(struct ntmp_user *user, u32 entry_id)
+{
+       struct ntmp_req_by_eid *req;
+       struct netc_swcbd swcbd;
+       struct netc_cbdr *cbdr;
+       union netc_cbd cbd;
+       int err;
+
+       swcbd.size = sizeof(*req);
+       err = ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req);
+       if (err)
+               return err;
+
+       /* Request data */
+       ntmp_fill_crd_eid(req, user->tbl.ect_ver, 0, ECT_UA_STSEU, entry_id);
+
+       /* Request header */
+       ntmp_fill_request_hdr(&cbd, swcbd.dma, NTMP_LEN(swcbd.size, 0),
+                             NTMP_ECT_ID, NTMP_CMD_UPDATE, NTMP_AM_ENTRY_ID);
+
+       ntmp_select_and_lock_cbdr(user, &cbdr);
+       err = netc_xmit_ntmp_cmd(cbdr, &cbd, &swcbd);
+       if (err)
+               dev_err(user->dev,
+                       "Failed to update %s entry 0x%x, err: %pe\n",
+                       ntmp_table_name(NTMP_ECT_ID), entry_id, ERR_PTR(err));
+
+       ntmp_unlock_cbdr(cbdr);
+
+       return err;
+}
+EXPORT_SYMBOL_GPL(ntmp_ect_update_entry);
+
 int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
                          const struct bpt_cfge_data *cfge)
 {
index 0c951e1c763db3f8cf3b40c8fedcc9ecfe7494d3..1222901f48a78a079290a60fcbee66026cadbcc1 100644 (file)
@@ -37,6 +37,7 @@ struct netc_tbl_vers {
        u8 bpt_ver;
        u8 ipft_ver;
        u8 ett_ver;
+       u8 ect_ver;
 };
 
 struct netc_swcbd {
@@ -294,6 +295,7 @@ int ntmp_ett_add_entry(struct ntmp_user *user, u32 entry_id,
 int ntmp_ett_update_entry(struct ntmp_user *user, u32 entry_id,
                          const struct ett_cfge_data *cfge);
 int ntmp_ett_delete_entry(struct ntmp_user *user, u32 entry_id);
+int ntmp_ect_update_entry(struct ntmp_user *user, u32 entry_id);
 int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
                          const struct bpt_cfge_data *cfge);
 #else