]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net: dsa: mv88e6xxx: Allow PCS registers to be retrieved via ethtool
authorAndrew Lunn <andrew@lunn.ch>
Sun, 16 Feb 2020 17:54:13 +0000 (18:54 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 04:00:21 +0000 (20:00 -0800)
ethtool provides a generic mechanism for a driver to return the
registers of an ethernet device. DSA uses this to give the port
registers associated with an interfaces. Extend this to allow PCS
registers to also be returned, if the port has a PCS associated to it.

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/chip.h

index 8c92895496881cb9d11adf4ee459bd549b247fe3..316758a42a672a49acbca52b706d9edc13e25c96 100644 (file)
@@ -1018,7 +1018,14 @@ static void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
 
 static int mv88e6xxx_get_regs_len(struct dsa_switch *ds, int port)
 {
-       return 32 * sizeof(u16);
+       struct mv88e6xxx_chip *chip = ds->priv;
+       int len;
+
+       len = 32 * sizeof(u16);
+       if (chip->info->ops->serdes_get_regs_len)
+               len += chip->info->ops->serdes_get_regs_len(chip, port);
+
+       return len;
 }
 
 static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
@@ -1043,6 +1050,9 @@ static void mv88e6xxx_get_regs(struct dsa_switch *ds, int port,
                        p[i] = reg;
        }
 
+       if (chip->info->ops->serdes_get_regs)
+               chip->info->ops->serdes_get_regs(chip, port, &p[i]);
+
        mv88e6xxx_reg_unlock(chip);
 }
 
index 79cad5e751c6cd4784d0bf67aa3045336da400ad..851686b45414134b6c00a26bb6c98df8cf80c83c 100644 (file)
@@ -517,6 +517,11 @@ struct mv88e6xxx_ops {
        int (*serdes_get_stats)(struct mv88e6xxx_chip *chip,  int port,
                                uint64_t *data);
 
+       /* SERDES registers for ethtool */
+       int (*serdes_get_regs_len)(struct mv88e6xxx_chip *chip,  int port);
+       void (*serdes_get_regs)(struct mv88e6xxx_chip *chip, int port,
+                               void *_p);
+
        /* Address Translation Unit operations */
        int (*atu_get_hash)(struct mv88e6xxx_chip *chip, u8 *hash);
        int (*atu_set_hash)(struct mv88e6xxx_chip *chip, u8 hash);