net: dsa: mv88e6xxx: Add 6352 family PCS registers to ethtool -d
authorAndrew Lunn <andrew@lunn.ch>
Sun, 16 Feb 2020 17:54:14 +0000 (18:54 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 04:00:21 +0000 (20:00 -0800)
The mv88e6352 has one PCS which can be used for 1000BaseX or
SGMII. Add the registers to the dump for the port which the PCS is
associated to.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/mv88e6xxx/serdes.c
drivers/net/dsa/mv88e6xxx/serdes.h

index 316758a..cb284eb 100644 (file)
@@ -3674,6 +3674,8 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
        .serdes_get_lane = mv88e6352_serdes_get_lane,
        .serdes_power = mv88e6352_serdes_power,
+       .serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
+       .serdes_get_regs = mv88e6352_serdes_get_regs,
        .gpio_ops = &mv88e6352_gpio_ops,
        .phylink_validate = mv88e6352_phylink_validate,
 };
@@ -3768,6 +3770,8 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
        .serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
        .serdes_irq_enable = mv88e6352_serdes_irq_enable,
        .serdes_irq_status = mv88e6352_serdes_irq_status,
+       .serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
+       .serdes_get_regs = mv88e6352_serdes_get_regs,
        .gpio_ops = &mv88e6352_gpio_ops,
        .phylink_validate = mv88e6352_phylink_validate,
 };
@@ -4018,6 +4022,8 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
        .serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
        .serdes_irq_enable = mv88e6352_serdes_irq_enable,
        .serdes_irq_status = mv88e6352_serdes_irq_status,
+       .serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
+       .serdes_get_regs = mv88e6352_serdes_get_regs,
        .gpio_ops = &mv88e6352_gpio_ops,
        .avb_ops = &mv88e6352_avb_ops,
        .ptp_ops = &mv88e6352_ptp_ops,
@@ -4398,6 +4404,8 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
        .serdes_get_sset_count = mv88e6352_serdes_get_sset_count,
        .serdes_get_strings = mv88e6352_serdes_get_strings,
        .serdes_get_stats = mv88e6352_serdes_get_stats,
+       .serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
+       .serdes_get_regs = mv88e6352_serdes_get_regs,
        .phylink_validate = mv88e6352_phylink_validate,
 };
 
index 8d8b3b7..94704af 100644 (file)
@@ -237,6 +237,29 @@ unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip, int port)
        return irq_find_mapping(chip->g2_irq.domain, MV88E6352_SERDES_IRQ);
 }
 
+int mv88e6352_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port)
+{
+       if (!mv88e6352_port_has_serdes(chip, port))
+               return 0;
+
+       return 32 * sizeof(u16);
+}
+
+void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p)
+{
+       u16 *p = _p;
+       u16 reg;
+       int i;
+
+       if (!mv88e6352_port_has_serdes(chip, port))
+               return;
+
+       for (i = 0 ; i < 32; i++) {
+               mv88e6352_serdes_read(chip, i, &reg);
+               p[i] = reg;
+       }
+}
+
 u8 mv88e6341_serdes_get_lane(struct mv88e6xxx_chip *chip, int port)
 {
        u8 cmode = chip->ports[port].cmode;
index d16ef4d..bb06108 100644 (file)
@@ -109,6 +109,9 @@ int mv88e6390_serdes_get_strings(struct mv88e6xxx_chip *chip,
 int mv88e6390_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
                               uint64_t *data);
 
+int mv88e6352_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port);
+void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p);
+
 /* Return the (first) SERDES lane address a port is using, 0 otherwise. */
 static inline u8 mv88e6xxx_serdes_get_lane(struct mv88e6xxx_chip *chip,
                                           int port)