Reused the KSZ common APIs for get_ethtool_stats() & get_sset_count()
along with relevant lan937x hooks for KSZ common layer and added
support for get_strings()

Signed-off-by: Prasanna Vengateshan <prasanna.vengates...@microchip.com>
---
 drivers/net/dsa/microchip/lan937x_dev.c  | 36 ++++++++++++++++++++++++
 drivers/net/dsa/microchip/lan937x_main.c | 18 ++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/drivers/net/dsa/microchip/lan937x_dev.c 
b/drivers/net/dsa/microchip/lan937x_dev.c
index 84540180ff2f..20ee485fb796 100644
--- a/drivers/net/dsa/microchip/lan937x_dev.c
+++ b/drivers/net/dsa/microchip/lan937x_dev.c
@@ -209,6 +209,40 @@ static void lan937x_flush_dyn_mac_table(struct ksz_device 
*dev, int port)
        }
 }
 
+static void lan937x_r_mib_cnt(struct ksz_device *dev, int port, u16 addr,
+                             u64 *cnt)
+{
+       unsigned int val;
+       u32 data;
+       int ret;
+
+       /* Enable MIB Counter read*/
+       data = MIB_COUNTER_READ;
+       data |= (addr << MIB_COUNTER_INDEX_S);
+       lan937x_pwrite32(dev, port, REG_PORT_MIB_CTRL_STAT__4, data);
+
+       ret = regmap_read_poll_timeout(dev->regmap[2],
+                                      PORT_CTRL_ADDR(port,
+                                                     
REG_PORT_MIB_CTRL_STAT__4),
+                                          val, !(val & MIB_COUNTER_READ), 10, 
1000);
+       /* failed to read MIB. get out of loop */
+       if (ret) {
+               dev_err(dev->dev, "Failed to get MIB\n");
+               return;
+       }
+
+       /* count resets upon read */
+       lan937x_pread32(dev, port, REG_PORT_MIB_DATA, &data);
+       *cnt += data;
+}
+
+static void lan937x_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
+                             u64 *dropped, u64 *cnt)
+{
+       addr = lan937x_mib_names[addr].index;
+       lan937x_r_mib_cnt(dev, port, addr, cnt);
+}
+
 static void lan937x_port_init_cnt(struct ksz_device *dev, int port)
 {
        struct ksz_port_mib *mib = &dev->ports[port].mib;
@@ -851,6 +885,8 @@ const struct ksz_dev_ops lan937x_dev_ops = {
        .cfg_port_member = lan937x_cfg_port_member,
        .flush_dyn_mac_table = lan937x_flush_dyn_mac_table,
        .port_setup = lan937x_port_setup,
+       .r_mib_cnt = lan937x_r_mib_cnt,
+       .r_mib_pkt = lan937x_r_mib_pkt,
        .port_init_cnt = lan937x_port_init_cnt,
        .shutdown = lan937x_reset_switch,
        .detect = lan937x_switch_detect,
diff --git a/drivers/net/dsa/microchip/lan937x_main.c 
b/drivers/net/dsa/microchip/lan937x_main.c
index b38735e36aef..5693c59df497 100644
--- a/drivers/net/dsa/microchip/lan937x_main.c
+++ b/drivers/net/dsa/microchip/lan937x_main.c
@@ -69,6 +69,21 @@ static int lan937x_phy_write16(struct dsa_switch *ds, int 
addr, int reg,
        return lan937x_t1_tx_phy_write(dev, addr, reg, val);
 }
 
+static void lan937x_get_strings(struct dsa_switch *ds, int port,
+                               u32 stringset, uint8_t *buf)
+{
+       struct ksz_device *dev = ds->priv;
+       int i;
+
+       if (stringset != ETH_SS_STATS)
+               return;
+
+       for (i = 0; i < dev->mib_cnt; i++) {
+               memcpy(buf + i * ETH_GSTRING_LEN, lan937x_mib_names[i].string,
+                      ETH_GSTRING_LEN);
+       }
+}
+
 static void lan937x_port_stp_state_set(struct dsa_switch *ds, int port,
                                       u8 state)
 {
@@ -371,6 +386,9 @@ const struct dsa_switch_ops lan937x_switch_ops = {
        .phy_read               = lan937x_phy_read16,
        .phy_write              = lan937x_phy_write16,
        .port_enable            = ksz_enable_port,
+       .get_strings            = lan937x_get_strings,
+       .get_ethtool_stats      = ksz_get_ethtool_stats,
+       .get_sset_count         = ksz_sset_count,
        .port_bridge_join       = ksz_port_bridge_join,
        .port_bridge_leave      = ksz_port_bridge_leave,
        .port_stp_state_set     = lan937x_port_stp_state_set,
-- 
2.25.1

Reply via email to