summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek BehĂșn <kabel@kernel.org>2020-10-20 19:09:12 +0200
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2021-09-19 13:22:16 +0100
commit58339cd013b7e37739c54d06b2e9f226d99d2f50 (patch)
treef5df6dfc04acc1c6576e92b9298487cbef678bfa
parente77daa70521c36402efe3f87951852358182bc08 (diff)
net: dsa: mv88e6xxx: implement .phylink_get_interfaces operation
Implement the .phylink_get_interfaces method for mv88e6xxx driver. We are currently only interested in SGMII, 1000base-x and 2500base-x modes (for the SFP code). USXGMII and 10gbase-r can be added later for Amethyst. XAUI and RXAUI are irrelevant for SFP (but maybe not for QSFP?). Signed-off-by: Marek BehĂșn <kabel@kernel.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.c57
-rw-r--r--drivers/net/dsa/mv88e6xxx/chip.h2
2 files changed, 59 insertions, 0 deletions
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 272b0535d946..c088915f1feb 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -683,6 +683,50 @@ static void mv88e6xxx_validate(struct dsa_switch *ds, int port,
phylink_helper_basex_speed(state);
}
+static void mv88e6352_phylink_get_interfaces(struct mv88e6xxx_chip *chip,
+ int port,
+ unsigned long *supported)
+{
+ if (mv88e6xxx_serdes_get_lane(chip, port)) {
+ /* FIXME: does code for 6352 family support changing between
+ * SGMII and 1000base-x?
+ */
+ __set_bit(PHY_INTERFACE_MODE_SGMII, supported);
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX, supported);
+ }
+}
+
+static void mv88e6341_phylink_get_interfaces(struct mv88e6xxx_chip *chip,
+ int port,
+ unsigned long *supported)
+{
+ if (port == 5) {
+ __set_bit(PHY_INTERFACE_MODE_SGMII, supported);
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX, supported);
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX, supported);
+ }
+}
+
+static void mv88e6390_phylink_get_interfaces(struct mv88e6xxx_chip *chip,
+ int port,
+ unsigned long *supported)
+{
+ if (port == 9 || port == 10) {
+ __set_bit(PHY_INTERFACE_MODE_SGMII, supported);
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX, supported);
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX, supported);
+ }
+}
+
+static void mv88e6xxx_get_interfaces(struct dsa_switch *ds, int port,
+ unsigned long *supported)
+{
+ struct mv88e6xxx_chip *chip = ds->priv;
+
+ if (chip->info->ops->phylink_get_interfaces)
+ chip->info->ops->phylink_get_interfaces(chip, port, supported);
+}
+
static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
unsigned int mode,
const struct phylink_link_state *state)
@@ -3628,6 +3672,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
.serdes_get_stats = mv88e6390_serdes_get_stats,
.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
.serdes_get_regs = mv88e6390_serdes_get_regs,
+ .phylink_get_interfaces = mv88e6341_phylink_get_interfaces,
.phylink_validate = mv88e6341_phylink_validate,
};
@@ -3803,6 +3848,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
.gpio_ops = &mv88e6352_gpio_ops,
+ .phylink_get_interfaces = mv88e6352_phylink_get_interfaces,
.phylink_validate = mv88e6352_phylink_validate,
};
@@ -3903,6 +3949,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
.gpio_ops = &mv88e6352_gpio_ops,
+ .phylink_get_interfaces = mv88e6352_phylink_get_interfaces,
.phylink_validate = mv88e6352_phylink_validate,
};
@@ -4004,6 +4051,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
.serdes_get_regs = mv88e6390_serdes_get_regs,
.gpio_ops = &mv88e6352_gpio_ops,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390_phylink_validate,
};
@@ -4065,6 +4113,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
.serdes_get_regs = mv88e6390_serdes_get_regs,
.gpio_ops = &mv88e6352_gpio_ops,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390x_phylink_validate,
};
@@ -4125,6 +4174,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
.serdes_get_regs = mv88e6390_serdes_get_regs,
.avb_ops = &mv88e6390_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390_phylink_validate,
};
@@ -4185,6 +4235,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6352_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
+ .phylink_get_interfaces = mv88e6352_phylink_get_interfaces,
.phylink_validate = mv88e6352_phylink_validate,
};
@@ -4287,6 +4338,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6390_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390_phylink_validate,
};
@@ -4439,6 +4491,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
.serdes_get_stats = mv88e6390_serdes_get_stats,
.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
.serdes_get_regs = mv88e6390_serdes_get_regs,
+ .phylink_get_interfaces = mv88e6341_phylink_get_interfaces,
.phylink_validate = mv88e6341_phylink_validate,
};
@@ -4588,6 +4641,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
.serdes_get_stats = mv88e6352_serdes_get_stats,
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
+ .phylink_get_interfaces = mv88e6352_phylink_get_interfaces,
.phylink_validate = mv88e6352_phylink_validate,
};
@@ -4653,6 +4707,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
.serdes_get_stats = mv88e6390_serdes_get_stats,
.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
.serdes_get_regs = mv88e6390_serdes_get_regs,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390_phylink_validate,
};
@@ -4717,6 +4772,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6390_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
+ .phylink_get_interfaces = mv88e6390_phylink_get_interfaces,
.phylink_validate = mv88e6390x_phylink_validate,
};
@@ -6072,6 +6128,7 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = {
.change_tag_protocol = mv88e6xxx_change_tag_protocol,
.setup = mv88e6xxx_setup,
.teardown = mv88e6xxx_teardown,
+ .phylink_get_interfaces = mv88e6xxx_get_interfaces,
.phylink_validate = mv88e6xxx_validate,
.phylink_mac_link_state = mv88e6xxx_serdes_pcs_get_state,
.phylink_mac_config = mv88e6xxx_mac_config,
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
index 675b1f3e43b7..601c995cf4c7 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.h
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
@@ -599,6 +599,8 @@ struct mv88e6xxx_ops {
const struct mv88e6xxx_ptp_ops *ptp_ops;
/* Phylink */
+ void (*phylink_get_interfaces)(struct mv88e6xxx_chip *chip, int port,
+ unsigned long *supported);
void (*phylink_validate)(struct mv88e6xxx_chip *chip, int port,
unsigned long *mask,
struct phylink_link_state *state);