diff options
| -rw-r--r-- | drivers/net/ethernet/freescale/enetc/ntmp.c | 45 | ||||
| -rw-r--r-- | include/linux/fsl/ntmp.h | 2 |
2 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/enetc/ntmp.c b/drivers/net/ethernet/freescale/enetc/ntmp.c index 9249f78219ed..601435966ed1 100644 --- a/drivers/net/ethernet/freescale/enetc/ntmp.c +++ b/drivers/net/ethernet/freescale/enetc/ntmp.c @@ -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) { diff --git a/include/linux/fsl/ntmp.h b/include/linux/fsl/ntmp.h index 0c951e1c763d..1222901f48a7 100644 --- a/include/linux/fsl/ntmp.h +++ b/include/linux/fsl/ntmp.h @@ -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 |
