OSDN Git Service

net: dsa/mv88e6123_61_65: Add support for reading switch registers
authorGuenter Roeck <linux@roeck-us.net>
Wed, 29 Oct 2014 17:45:05 +0000 (10:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Oct 2014 18:54:11 +0000 (14:54 -0400)
The infrastructure can now report switch registers to ethtool.
Add support for it to the mv88e6123_61_65 driver.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6123_61_65.c
drivers/net/dsa/mv88e6xxx.c
drivers/net/dsa/mv88e6xxx.h

index 9f43c9b..e2d2e37 100644 (file)
@@ -470,6 +470,8 @@ struct dsa_switch_driver mv88e6123_61_65_switch_driver = {
 #ifdef CONFIG_NET_DSA_HWMON
        .get_temp               = mv88e6123_61_65_get_temp,
 #endif
+       .get_regs_len           = mv88e6xxx_get_regs_len,
+       .get_regs               = mv88e6xxx_get_regs,
 };
 
 MODULE_ALIAS("platform:mv88e6123");
index 8e1090b..c071fde 100644 (file)
@@ -499,6 +499,30 @@ void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
        mutex_unlock(&ps->stats_mutex);
 }
 
+int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
+{
+       return 32 * sizeof(u16);
+}
+
+void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
+                       struct ethtool_regs *regs, void *_p)
+{
+       u16 *p = _p;
+       int i;
+
+       regs->version = 0;
+
+       memset(p, 0xff, 32 * sizeof(u16));
+
+       for (i = 0; i < 32; i++) {
+               int ret;
+
+               ret = mv88e6xxx_reg_read(ds, REG_PORT(port), i);
+               if (ret >= 0)
+                       p[i] = ret;
+       }
+}
+
 static int __init mv88e6xxx_init(void)
 {
 #if IS_ENABLED(CONFIG_NET_DSA_MV88E6131)
index 29feed0..a0780b0 100644 (file)
@@ -78,6 +78,9 @@ void mv88e6xxx_get_strings(struct dsa_switch *ds,
 void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
                                 int nr_stats, struct mv88e6xxx_hw_stat *stats,
                                 int port, uint64_t *data);
+int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port);
+void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
+                       struct ethtool_regs *regs, void *_p);
 
 extern struct dsa_switch_driver mv88e6131_switch_driver;
 extern struct dsa_switch_driver mv88e6123_61_65_switch_driver;