net: dsa: Provide additional RMON statistics
authorGuenter Roeck <linux@roeck-us.net>
Wed, 29 Oct 2014 17:45:07 +0000 (10:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Oct 2014 18:54:12 +0000 (14:54 -0400)
Display sw_in_discards, sw_in_filtered, and sw_out_filtered for chips
supported by mv88e6123_61_65 and mv88e6352 drivers.

The variables are provided in port registers, not the normal status registers.
Mark by adding 0x100 to the register offset and add special handling code
to mv88e6xxx_get_ethtool_stats.

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/mv88e6352.c
drivers/net/dsa/mv88e6xxx.c

index e2d2e37e94974f2659335d17f4595ab26d35df05..9a3f9e0b053236c178c43e4b3e83aeed76af9db6 100644 (file)
@@ -433,6 +433,9 @@ static struct mv88e6xxx_hw_stat mv88e6123_61_65_hw_stats[] = {
        { "hist_256_511bytes", 4, 0x0b, },
        { "hist_512_1023bytes", 4, 0x0c, },
        { "hist_1024_max_bytes", 4, 0x0d, },
+       { "sw_in_discards", 4, 0x110, },
+       { "sw_in_filtered", 2, 0x112, },
+       { "sw_out_filtered", 2, 0x113, },
 };
 
 static void
index d5bbe497de9dbc74285806b5ce855e88da648524..258d9ef5ef254e49a0fe27586049bbc2a59ebc61 100644 (file)
@@ -539,6 +539,9 @@ static struct mv88e6xxx_hw_stat mv88e6352_hw_stats[] = {
        { "hist_256_511bytes", 4, 0x0b, },
        { "hist_512_1023bytes", 4, 0x0c, },
        { "hist_1024_max_bytes", 4, 0x0d, },
+       { "sw_in_discards", 4, 0x110, },
+       { "sw_in_filtered", 2, 0x112, },
+       { "sw_out_filtered", 2, 0x113, },
 };
 
 static int mv88e6352_read_eeprom_word(struct dsa_switch *ds, int addr)
index c071fde21f4a730a5b77619fd0afaf78e4443e2e..da558d887dad08fc95c23a8cf489400a8721ae78 100644 (file)
@@ -485,17 +485,33 @@ void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds,
        for (i = 0; i < nr_stats; i++) {
                struct mv88e6xxx_hw_stat *s = stats + i;
                u32 low;
-               u32 high;
-
+               u32 high = 0;
+
+               if (s->reg >= 0x100) {
+                       int ret;
+
+                       ret = mv88e6xxx_reg_read(ds, REG_PORT(port),
+                                                s->reg - 0x100);
+                       if (ret < 0)
+                               goto error;
+                       low = ret;
+                       if (s->sizeof_stat == 4) {
+                               ret = mv88e6xxx_reg_read(ds, REG_PORT(port),
+                                                        s->reg - 0x100 + 1);
+                               if (ret < 0)
+                                       goto error;
+                               high = ret;
+                       }
+                       data[i] = (((u64)high) << 16) | low;
+                       continue;
+               }
                mv88e6xxx_stats_read(ds, s->reg, &low);
                if (s->sizeof_stat == 8)
                        mv88e6xxx_stats_read(ds, s->reg + 1, &high);
-               else
-                       high = 0;
 
                data[i] = (((u64)high) << 32) | low;
        }
-
+error:
        mutex_unlock(&ps->stats_mutex);
 }