realtek: dsa: add table-based statistics infrastructure

Some Realtek SoCs such as the RTL931X store MIB counters in tables rather
than registers. Unlike register reads, table access requires programming
the table control register, setting the command field to determine read or
write, and then polling for completion. This makes it necessary to
implement a separate path for table-based statistics.

Like register-based MIBs, the table-based MIBs also come in two types: STD
and PRIV which will require slightly different implementations.

Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de>
Signed-off-by: Sven Eckelmann <se@simonwunderlich.de>
Link: https://github.com/openwrt/openwrt/pull/20631
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
Sharadanand Karanjkar 2025-08-14 15:48:14 +00:00 committed by Hauke Mehrtens
parent ac6bd8473d
commit fdc424c1e3
3 changed files with 13 additions and 1 deletions

View file

@ -880,6 +880,15 @@ static bool rtldsa_read_mib_item(struct rtl838x_switch_priv *priv, int port,
reg = priv->r->stat_port_prv_mib;
reg_offset = 128;
break;
case MIB_TBL_STD:
case MIB_TBL_PRV:
if (!priv->r->stat_port_table_read)
return false;
*data = priv->r->stat_port_table_read(port, mib_item->size, mib_item->offset,
mib_item->reg == MIB_TBL_PRV);
return true;
default:
return false;
}

View file

@ -1121,6 +1121,7 @@ struct rtl838x_reg {
int stat_rst;
int stat_port_std_mib;
int stat_port_prv_mib;
u64 (*stat_port_table_read)(int port, unsigned int mib_size, unsigned int offset, bool is_pvt);
int (*port_iso_ctrl)(int p);
void (*traffic_enable)(int source, int dest);
void (*traffic_disable)(int source, int dest);

View file

@ -20,7 +20,9 @@ struct fdb_update_work {
enum mib_reg {
MIB_REG_INVALID = 0,
MIB_REG_STD,
MIB_REG_PRV
MIB_REG_PRV,
MIB_TBL_STD,
MIB_TBL_PRV,
};
#define MIB_ITEM(_reg, _offset, _size) \