mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/3] net: dsa: SERDES support for mv88e632x family
@ 2023-07-03 15:26 M. Haener
  2023-07-03 15:26 ` [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read M. Haener
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: M. Haener @ 2023-07-03 15:26 UTC (permalink / raw)
  To: netdev
  Cc: Michael Haener, linux-kernel, Andrew Lunn, Florian Fainelli,
	Vladimir Oltean, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Russell King, Alexander Sverdlin

From: Michael Haener <michael.haener@siemens.com>

This patch series brings SERDES support for the mv88e632x family.

Michael Haener (3):
  net: dsa: mv88e632x: Refactor serdes read
  net: dsa: mv88e632x: Refactor serdes write
  net: dsa: mv88e632x: Add SERDES ops

 drivers/net/dsa/mv88e6xxx/chip.c   |  58 +++++++++
 drivers/net/dsa/mv88e6xxx/chip.h   |   4 +
 drivers/net/dsa/mv88e6xxx/serdes.c | 187 ++++++++++++++++++-----------
 drivers/net/dsa/mv88e6xxx/serdes.h |  35 ++++++
 4 files changed, 214 insertions(+), 70 deletions(-)

-- 
2.41.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read
  2023-07-03 15:26 [PATCH 0/3] net: dsa: SERDES support for mv88e632x family M. Haener
@ 2023-07-03 15:26 ` M. Haener
  2023-07-03 15:26 ` [PATCH 2/3] net: dsa: mv88e632x: Refactor serdes write M. Haener
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: M. Haener @ 2023-07-03 15:26 UTC (permalink / raw)
  To: netdev
  Cc: Michael Haener, linux-kernel, Andrew Lunn, Florian Fainelli,
	Vladimir Oltean, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Russell King, Alexander Sverdlin

From: Michael Haener <michael.haener@siemens.com>

To avoid code duplication, the serdes read functions
have been combined.

Signed-off-by: Michael Haener <michael.haener@siemens.com>
---
 drivers/net/dsa/mv88e6xxx/chip.c   | 13 ++++
 drivers/net/dsa/mv88e6xxx/chip.h   |  2 +
 drivers/net/dsa/mv88e6xxx/serdes.c | 96 ++++++++++++++++--------------
 drivers/net/dsa/mv88e6xxx/serdes.h | 13 ++++
 4 files changed, 80 insertions(+), 44 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 8b51756bd805..ddbc2be746bb 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -4430,6 +4430,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,
+	.serdes_read = mv88e6390_serdes_read,
 	.phylink_get_caps = mv88e6341_phylink_get_caps,
 };
 
@@ -4617,6 +4618,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
 	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
+	.serdes_read = mv88e6352_serdes_read,
 	.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6352_serdes_get_regs,
 	.gpio_ops = &mv88e6352_gpio_ops,
@@ -4722,6 +4724,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
 	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
+	.serdes_read = mv88e6352_serdes_read,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -4833,6 +4836,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
 	.serdes_get_stats = mv88e6390_serdes_get_stats,
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
+	.serdes_read = mv88e6390_serdes_read,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
 };
@@ -4898,6 +4902,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
 	.serdes_get_stats = mv88e6390_serdes_get_stats,
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
+	.serdes_read = mv88e6390_serdes_read,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.phylink_get_caps = mv88e6390x_phylink_get_caps,
 };
@@ -4961,6 +4966,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
 	.serdes_get_stats = mv88e6390_serdes_get_stats,
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
+	.serdes_read = mv88e6390_serdes_read,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6352_ptp_ops,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
@@ -5019,6 +5025,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
 	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
+	.serdes_read = mv88e6352_serdes_read,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -5134,6 +5141,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
 	.serdes_get_stats = mv88e6390_serdes_get_stats,
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
+	.serdes_read = mv88e6390_serdes_read,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6390_ptp_ops,
@@ -5300,6 +5308,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,
+	.serdes_read = mv88e6390_serdes_read,
 	.phylink_get_caps = mv88e6341_phylink_get_caps,
 };
 
@@ -5450,6 +5459,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
 	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
+	.serdes_read = mv88e6352_serdes_read,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -5531,6 +5541,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,
+	.serdes_read = mv88e6390_serdes_read,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
 };
 
@@ -5596,6 +5607,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
 	.serdes_get_stats = mv88e6390_serdes_get_stats,
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
+	.serdes_read = mv88e6390_serdes_read,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6390_ptp_ops,
@@ -5663,6 +5675,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = {
 	.serdes_irq_mapping = mv88e6390_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6393x_serdes_irq_enable,
 	.serdes_irq_status = mv88e6393x_serdes_irq_status,
+	.serdes_read = mv88e6390_serdes_read,
 	/* TODO: serdes stats */
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
index 0ad34b2d8913..17f89951557d 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.h
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
@@ -607,6 +607,8 @@ struct mv88e6xxx_ops {
 				     int lane);
 	int (*serdes_pcs_link_up)(struct mv88e6xxx_chip *chip, int port,
 				  int lane, int speed, int duplex);
+	int (*serdes_read)(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 *val);
 
 	/* SERDES interrupt handling */
 	unsigned int (*serdes_irq_mapping)(struct mv88e6xxx_chip *chip,
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index 80167d53212f..ab3471887b41 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -17,8 +17,8 @@
 #include "port.h"
 #include "serdes.h"
 
-static int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int reg,
-				 u16 *val)
+int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane,
+			  int device, int reg, u16 *val)
 {
 	return mv88e6xxx_phy_page_read(chip, MV88E6352_ADDR_SERDES,
 				       MV88E6352_SERDES_PAGE_FIBER,
@@ -33,8 +33,8 @@ static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg,
 					reg, val);
 }
 
-static int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip,
-				 int lane, int device, int reg, u16 *val)
+int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip,
+			  int lane, int device, int reg, u16 *val)
 {
 	return mv88e6xxx_phy_read_c45(chip, lane, device, reg, val);
 }
@@ -123,7 +123,7 @@ int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
 	u16 val, new_val;
 	int err;
 
-	err = mv88e6352_serdes_read(chip, MII_BMCR, &val);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val);
 	if (err)
 		return err;
 
@@ -161,7 +161,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 		return 0;
 	}
 
-	err = mv88e6352_serdes_read(chip, MII_ADVERTISE, &val);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_ADVERTISE, &val);
 	if (err)
 		return err;
 
@@ -172,7 +172,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 			return err;
 	}
 
-	err = mv88e6352_serdes_read(chip, MII_BMCR, &val);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val);
 	if (err)
 		return err;
 
@@ -193,19 +193,19 @@ int mv88e6352_serdes_pcs_get_state(struct mv88e6xxx_chip *chip, int port,
 	u16 bmsr, lpa, status;
 	int err;
 
-	err = mv88e6352_serdes_read(chip, MII_BMSR, &bmsr);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMSR, &bmsr);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY BMSR: %d\n", err);
 		return err;
 	}
 
-	err = mv88e6352_serdes_read(chip, 0x11, &status);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, 0x11, &status);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY status: %d\n", err);
 		return err;
 	}
 
-	err = mv88e6352_serdes_read(chip, MII_LPA, &lpa);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_LPA, &lpa);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY LPA: %d\n", err);
 		return err;
@@ -220,7 +220,7 @@ int mv88e6352_serdes_pcs_an_restart(struct mv88e6xxx_chip *chip, int port,
 	u16 bmcr;
 	int err;
 
-	err = mv88e6352_serdes_read(chip, MII_BMCR, &bmcr);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &bmcr);
 	if (err)
 		return err;
 
@@ -233,7 +233,7 @@ int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 	u16 val, bmcr;
 	int err;
 
-	err = mv88e6352_serdes_read(chip, MII_BMCR, &val);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val);
 	if (err)
 		return err;
 
@@ -311,14 +311,16 @@ int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip,
 	return ARRAY_SIZE(mv88e6352_serdes_hw_stats);
 }
 
-static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip,
+static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip, int port,
 					  struct mv88e6352_serdes_hw_stat *stat)
 {
 	u64 val = 0;
 	u16 reg;
 	int err;
+	int lane;
 
-	err = mv88e6352_serdes_read(chip, stat->reg, &reg);
+	lane = mv88e6xxx_serdes_get_lane(chip, port);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, stat->reg, &reg);
 	if (err) {
 		dev_err(chip->dev, "failed to read statistic\n");
 		return 0;
@@ -327,7 +329,7 @@ static uint64_t mv88e6352_serdes_get_stat(struct mv88e6xxx_chip *chip,
 	val = reg;
 
 	if (stat->sizeof_stat == 32) {
-		err = mv88e6352_serdes_read(chip, stat->reg + 1, &reg);
+		err = mv88e6xxx_serdes_read(chip, lane, 0, stat->reg + 1, &reg);
 		if (err) {
 			dev_err(chip->dev, "failed to read statistic\n");
 			return 0;
@@ -355,7 +357,7 @@ int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port,
 
 	for (i = 0; i < ARRAY_SIZE(mv88e6352_serdes_hw_stats); i++) {
 		stat = &mv88e6352_serdes_hw_stats[i];
-		value = mv88e6352_serdes_get_stat(chip, stat);
+		value = mv88e6352_serdes_get_stat(chip, port, stat);
 		mv88e6xxx_port->serdes_stats[i] += value;
 		data[i] = mv88e6xxx_port->serdes_stats[i];
 	}
@@ -367,9 +369,11 @@ static void mv88e6352_serdes_irq_link(struct mv88e6xxx_chip *chip, int port)
 {
 	u16 bmsr;
 	int err;
+	int lane;
 
 	/* If the link has dropped, we want to know about it. */
-	err = mv88e6352_serdes_read(chip, MII_BMSR, &bmsr);
+	lane = mv88e6xxx_serdes_get_lane(chip, port);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MII_BMSR, &bmsr);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes BMSR: %d\n", err);
 		return;
@@ -385,7 +389,7 @@ irqreturn_t mv88e6352_serdes_irq_status(struct mv88e6xxx_chip *chip, int port,
 	u16 status;
 	int err;
 
-	err = mv88e6352_serdes_read(chip, MV88E6352_SERDES_INT_STATUS, &status);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MV88E6352_SERDES_INT_STATUS, &status);
 	if (err)
 		return ret;
 
@@ -432,13 +436,15 @@ void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p)
 	u16 reg;
 	int err;
 	int i;
+	int lane;
 
 	err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
 	if (err <= 0)
 		return;
 
+	lane = mv88e6xxx_serdes_get_lane(chip, port);
 	for (i = 0 ; i < 32; i++) {
-		err = mv88e6352_serdes_read(chip, i, &reg);
+		err = mv88e6xxx_serdes_read(chip, lane, 0, i, &reg);
 		if (!err)
 			p[i] = reg;
 	}
@@ -697,7 +703,7 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane,
 	u16 val, new_val;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_10G_CTRL1, &val);
 
 	if (err)
@@ -724,7 +730,7 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane,
 	u16 val, new_val;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMCR, &val);
 	if (err)
 		return err;
@@ -784,7 +790,7 @@ static uint64_t mv88e6390_serdes_get_stat(struct mv88e6xxx_chip *chip, int lane,
 	int err, i;
 
 	for (i = 0; i < 3; i++) {
-		err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+		err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 					    stat->reg + i, &reg[i]);
 		if (err) {
 			dev_err(chip->dev, "failed to read statistic\n");
@@ -819,7 +825,7 @@ static int mv88e6390_serdes_enable_checker(struct mv88e6xxx_chip *chip, int lane
 	u16 reg;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_PG_CONTROL, &reg);
 	if (err)
 		return err;
@@ -884,7 +890,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 		return 0;
 	}
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_ADVERTISE, &val);
 	if (err)
 		return err;
@@ -897,7 +903,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 			return err;
 	}
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMCR, &val);
 	if (err)
 		return err;
@@ -921,21 +927,21 @@ static int mv88e6390_serdes_pcs_get_state_sgmii(struct mv88e6xxx_chip *chip,
 	u16 bmsr, lpa, status;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMSR, &bmsr);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY BMSR: %d\n", err);
 		return err;
 	}
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_PHY_STATUS, &status);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY status: %d\n", err);
 		return err;
 	}
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_LPA, &lpa);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes PHY LPA: %d\n", err);
@@ -951,7 +957,7 @@ static int mv88e6390_serdes_pcs_get_state_10g(struct mv88e6xxx_chip *chip,
 	u16 status;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_10G_STAT1, &status);
 	if (err)
 		return err;
@@ -972,7 +978,7 @@ static int mv88e6393x_serdes_pcs_get_state_10g(struct mv88e6xxx_chip *chip,
 	u16 status;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_10G_STAT1, &status);
 	if (err)
 		return err;
@@ -1071,7 +1077,7 @@ int mv88e6390_serdes_pcs_an_restart(struct mv88e6xxx_chip *chip, int port,
 	u16 bmcr;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMCR, &bmcr);
 	if (err)
 		return err;
@@ -1087,7 +1093,7 @@ int mv88e6390_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 	u16 val, bmcr;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMCR, &val);
 	if (err)
 		return err;
@@ -1122,7 +1128,7 @@ static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip,
 	int err;
 
 	/* If the link has dropped, we want to know about it. */
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_BMSR, &bmsr);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes BMSR: %d\n", err);
@@ -1139,7 +1145,7 @@ static void mv88e6393x_serdes_irq_link_10g(struct mv88e6xxx_chip *chip,
 	int err;
 
 	/* If the link has dropped, we want to know about it. */
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_10G_STAT1, &status);
 	if (err) {
 		dev_err(chip->dev, "can't read Serdes STAT1: %d\n", err);
@@ -1182,7 +1188,7 @@ static int mv88e6390_serdes_irq_status_sgmii(struct mv88e6xxx_chip *chip,
 {
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6390_SGMII_INT_STATUS, status);
 
 	return err;
@@ -1224,7 +1230,7 @@ static int mv88e6393x_serdes_irq_status_10g(struct mv88e6xxx_chip *chip,
 {
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_10G_INT_STATUS, status);
 
 	return err;
@@ -1346,7 +1352,7 @@ void mv88e6390_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p)
 		return;
 
 	for (i = 0 ; i < ARRAY_SIZE(mv88e6390_serdes_regs); i++) {
-		err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+		err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 					    mv88e6390_serdes_regs[i], &reg);
 		if (!err)
 			p[i] = reg;
@@ -1365,6 +1371,7 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_chip *chip, int port,
 	u16 ctrl, reg;
 	int err;
 	int i;
+	int lane;
 
 	err = mv88e6352_g2_scratch_port_has_serdes(chip, port);
 	if (err <= 0)
@@ -1381,7 +1388,8 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_chip *chip, int port,
 	if (!found)
 		return -EINVAL;
 
-	err = mv88e6352_serdes_read(chip, MV88E6352_SERDES_SPEC_CTRL2, &ctrl);
+	lane = mv88e6xxx_serdes_get_lane(chip, port);
+	err = mv88e6xxx_serdes_read(chip, lane, 0, MV88E6352_SERDES_SPEC_CTRL2, &ctrl);
 	if (err)
 		return err;
 
@@ -1397,7 +1405,7 @@ static int mv88e6393x_serdes_power_lane(struct mv88e6xxx_chip *chip, int lane,
 	u16 reg;
 	int err;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_SERDES_CTRL1, &reg);
 	if (err)
 		return err;
@@ -1426,7 +1434,7 @@ static int mv88e6393x_serdes_erratum_4_6(struct mv88e6xxx_chip *chip, int lane)
 	 * It seems that after this workaround the SERDES is automatically
 	 * powered up (the bit is cleared), so power it down.
 	 */
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_SERDES_POC, &reg);
 	if (err)
 		return err;
@@ -1472,14 +1480,14 @@ static int mv88e6393x_serdes_erratum_4_8(struct mv88e6xxx_chip *chip, int lane)
 	 * Workaround is to write SERDES register 4.F074.14=1 for only those
 	 * modes and 0 in all other modes.
 	 */
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_SERDES_POC, &pcs);
 	if (err)
 		return err;
 
 	pcs &= MV88E6393X_SERDES_POC_PCS_MASK;
 
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_ERRATA_4_8_REG, &reg);
 	if (err)
 		return err;
@@ -1523,7 +1531,7 @@ static int mv88e6393x_serdes_erratum_5_2(struct mv88e6xxx_chip *chip, int lane,
 		return 0;
 
 	for (i = 0; i < ARRAY_SIZE(fixes); ++i) {
-		err = mv88e6390_serdes_read(chip, lane, fixes[i].dev,
+		err = mv88e6xxx_serdes_read(chip, lane, fixes[i].dev,
 					    fixes[i].reg, &reg);
 		if (err)
 			return err;
@@ -1563,7 +1571,7 @@ static int mv88e6393x_serdes_fix_2500basex_an(struct mv88e6xxx_chip *chip,
 	 * To avoid this, change PCS mode back to 2500base-x when disabling
 	 * SerDes from 2500base-x mode.
 	 */
-	err = mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS,
 				    MV88E6393X_SERDES_POC, &reg);
 	if (err)
 		return err;
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx/serdes.h
index e245687ddb1d..47ddd9d26c92 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.h
+++ b/drivers/net/dsa/mv88e6xxx/serdes.h
@@ -137,6 +137,10 @@ int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 				 int lane, int speed, int duplex);
 int mv88e6390_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 				 int lane, int speed, int duplex);
+int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
+			  int reg, u16 *val);
+int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
+			  int reg, u16 *val);
 unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip,
 					  int port);
 unsigned int mv88e6390_serdes_irq_mapping(struct mv88e6xxx_chip *chip,
@@ -213,6 +217,15 @@ static inline int mv88e6xxx_serdes_power_down(struct mv88e6xxx_chip *chip,
 	return chip->info->ops->serdes_power(chip, port, lane, false);
 }
 
+static inline int mv88e6xxx_serdes_read(struct mv88e6xxx_chip *chip, int lane,
+					int device, int reg, u16 *val)
+{
+	if (!chip->info->ops->serdes_read)
+		return -EOPNOTSUPP;
+
+	return chip->info->ops->serdes_read(chip, lane, device, reg, val);
+}
+
 static inline unsigned int
 mv88e6xxx_serdes_irq_mapping(struct mv88e6xxx_chip *chip, int port)
 {
-- 
2.41.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/3] net: dsa: mv88e632x: Refactor serdes write
  2023-07-03 15:26 [PATCH 0/3] net: dsa: SERDES support for mv88e632x family M. Haener
  2023-07-03 15:26 ` [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read M. Haener
@ 2023-07-03 15:26 ` M. Haener
  2023-07-03 15:26 ` [PATCH 3/3] net: dsa: mv88e632x: Add SERDES ops M. Haener
  2023-07-03 15:38 ` [PATCH 0/3] net: dsa: SERDES support for mv88e632x family Andrew Lunn
  3 siblings, 0 replies; 6+ messages in thread
From: M. Haener @ 2023-07-03 15:26 UTC (permalink / raw)
  To: netdev
  Cc: Michael Haener, linux-kernel, Andrew Lunn, Florian Fainelli,
	Vladimir Oltean, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Russell King, Alexander Sverdlin

From: Michael Haener <michael.haener@siemens.com>

To avoid code duplication, the serdes write functions
have been combined.

Signed-off-by: Michael Haener <michael.haener@siemens.com>
---
 drivers/net/dsa/mv88e6xxx/chip.c   | 13 ++++++++
 drivers/net/dsa/mv88e6xxx/chip.h   |  2 ++
 drivers/net/dsa/mv88e6xxx/serdes.c | 52 +++++++++++++++---------------
 drivers/net/dsa/mv88e6xxx/serdes.h | 13 ++++++++
 4 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index ddbc2be746bb..54e99cfb17c1 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -4431,6 +4431,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.phylink_get_caps = mv88e6341_phylink_get_caps,
 };
 
@@ -4619,6 +4620,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
 	.serdes_read = mv88e6352_serdes_read,
+	.serdes_write = mv88e6352_serdes_write,
 	.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6352_serdes_get_regs,
 	.gpio_ops = &mv88e6352_gpio_ops,
@@ -4725,6 +4727,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
 	.serdes_read = mv88e6352_serdes_read,
+	.serdes_write = mv88e6352_serdes_write,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -4837,6 +4840,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
 };
@@ -4903,6 +4907,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.phylink_get_caps = mv88e6390x_phylink_get_caps,
 };
@@ -4967,6 +4972,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6352_ptp_ops,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
@@ -5026,6 +5032,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
 	.serdes_read = mv88e6352_serdes_read,
+	.serdes_write = mv88e6352_serdes_write,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -5142,6 +5149,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6390_ptp_ops,
@@ -5309,6 +5317,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.phylink_get_caps = mv88e6341_phylink_get_caps,
 };
 
@@ -5460,6 +5469,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
 	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
 	.serdes_power = mv88e6352_serdes_power,
 	.serdes_read = mv88e6352_serdes_read,
+	.serdes_write = mv88e6352_serdes_write,
 	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
 	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
 	.serdes_irq_status = mv88e6352_serdes_irq_status,
@@ -5542,6 +5552,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.phylink_get_caps = mv88e6390_phylink_get_caps,
 };
 
@@ -5608,6 +5619,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
 	.serdes_get_regs_len = mv88e6390_serdes_get_regs_len,
 	.serdes_get_regs = mv88e6390_serdes_get_regs,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
 	.ptp_ops = &mv88e6390_ptp_ops,
@@ -5676,6 +5688,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = {
 	.serdes_irq_enable = mv88e6393x_serdes_irq_enable,
 	.serdes_irq_status = mv88e6393x_serdes_irq_status,
 	.serdes_read = mv88e6390_serdes_read,
+	.serdes_write = mv88e6390_serdes_write,
 	/* TODO: serdes stats */
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6390_avb_ops,
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
index 17f89951557d..d78daa2bfad4 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.h
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
@@ -609,6 +609,8 @@ struct mv88e6xxx_ops {
 				  int lane, int speed, int duplex);
 	int (*serdes_read)(struct mv88e6xxx_chip *chip, int lane, int device,
 			   int reg, u16 *val);
+	int (*serdes_write)(struct mv88e6xxx_chip *chip, int lane, int device,
+			    int reg, u16 val);
 
 	/* SERDES interrupt handling */
 	unsigned int (*serdes_irq_mapping)(struct mv88e6xxx_chip *chip,
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index ab3471887b41..7b64e30600b9 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -25,8 +25,8 @@ int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane,
 				       reg, val);
 }
 
-static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg,
-				  u16 val)
+int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 val)
 {
 	return mv88e6xxx_phy_page_write(chip, MV88E6352_ADDR_SERDES,
 					MV88E6352_SERDES_PAGE_FIBER,
@@ -39,8 +39,8 @@ int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip,
 	return mv88e6xxx_phy_read_c45(chip, lane, device, reg, val);
 }
 
-static int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip,
-				  int lane, int device, int reg, u16 val)
+int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip,
+			   int lane, int device, int reg, u16 val)
 {
 	return mv88e6xxx_phy_write_c45(chip, lane, device, reg, val);
 }
@@ -133,7 +133,7 @@ int mv88e6352_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
 		new_val = val | BMCR_PDOWN;
 
 	if (val != new_val)
-		err = mv88e6352_serdes_write(chip, MII_BMCR, new_val);
+		err = mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, new_val);
 
 	return err;
 }
@@ -167,7 +167,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 
 	changed = val != adv;
 	if (changed) {
-		err = mv88e6352_serdes_write(chip, MII_ADVERTISE, adv);
+		err = mv88e6xxx_serdes_write(chip, lane, 0, MII_ADVERTISE, adv);
 		if (err)
 			return err;
 	}
@@ -184,7 +184,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 	if (bmcr == val)
 		return changed;
 
-	return mv88e6352_serdes_write(chip, MII_BMCR, bmcr);
+	return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr);
 }
 
 int mv88e6352_serdes_pcs_get_state(struct mv88e6xxx_chip *chip, int port,
@@ -224,7 +224,7 @@ int mv88e6352_serdes_pcs_an_restart(struct mv88e6xxx_chip *chip, int port,
 	if (err)
 		return err;
 
-	return mv88e6352_serdes_write(chip, MII_BMCR, bmcr | BMCR_ANRESTART);
+	return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr | BMCR_ANRESTART);
 }
 
 int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
@@ -255,7 +255,7 @@ int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 	if (bmcr == val)
 		return 0;
 
-	return mv88e6352_serdes_write(chip, MII_BMCR, bmcr);
+	return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr);
 }
 
 int mv88e6352_serdes_get_lane(struct mv88e6xxx_chip *chip, int port)
@@ -409,7 +409,7 @@ int mv88e6352_serdes_irq_enable(struct mv88e6xxx_chip *chip, int port, int lane,
 	if (enable)
 		val |= MV88E6352_SERDES_INT_LINK_CHANGE;
 
-	return mv88e6352_serdes_write(chip, MV88E6352_SERDES_INT_ENABLE, val);
+	return mv88e6xxx_serdes_write(chip, lane, 0, MV88E6352_SERDES_INT_ENABLE, val);
 }
 
 unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip, int port)
@@ -717,7 +717,7 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_chip *chip, int lane,
 		new_val = val | MDIO_CTRL1_LPOWER;
 
 	if (val != new_val)
-		err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+		err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 					     MV88E6390_10G_CTRL1, new_val);
 
 	return err;
@@ -741,7 +741,7 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xxx_chip *chip, int lane,
 		new_val = val | BMCR_PDOWN;
 
 	if (val != new_val)
-		err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+		err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 					     MV88E6390_SGMII_BMCR, new_val);
 
 	return err;
@@ -831,7 +831,7 @@ static int mv88e6390_serdes_enable_checker(struct mv88e6xxx_chip *chip, int lane
 		return err;
 
 	reg |= MV88E6390_PG_CONTROL_ENABLE_PC;
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6390_PG_CONTROL, reg);
 }
 
@@ -897,7 +897,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 
 	changed = val != adv;
 	if (changed) {
-		err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+		err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 					     MV88E6390_SGMII_ADVERTISE, adv);
 		if (err)
 			return err;
@@ -917,7 +917,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *chip, int port,
 	if (bmcr == val)
 		return changed;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6390_SGMII_BMCR, bmcr);
 }
 
@@ -1082,7 +1082,7 @@ int mv88e6390_serdes_pcs_an_restart(struct mv88e6xxx_chip *chip, int port,
 	if (err)
 		return err;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6390_SGMII_BMCR,
 				      bmcr | BMCR_ANRESTART);
 }
@@ -1117,7 +1117,7 @@ int mv88e6390_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 	if (bmcr == val)
 		return 0;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6390_SGMII_BMCR, bmcr);
 }
 
@@ -1164,7 +1164,7 @@ static int mv88e6390_serdes_irq_enable_sgmii(struct mv88e6xxx_chip *chip,
 		val |= MV88E6390_SGMII_INT_LINK_DOWN |
 			MV88E6390_SGMII_INT_LINK_UP;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6390_SGMII_INT_ENABLE, val);
 }
 
@@ -1202,7 +1202,7 @@ static int mv88e6393x_serdes_irq_enable_10g(struct mv88e6xxx_chip *chip,
 	if (enable)
 		val |= MV88E6393X_10G_INT_LINK_CHANGE;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6393X_10G_INT_ENABLE, val);
 }
 
@@ -1396,7 +1396,7 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_chip *chip, int port,
 	ctrl &= ~MV88E6352_SERDES_OUT_AMP_MASK;
 	ctrl |= reg;
 
-	return mv88e6352_serdes_write(chip, MV88E6352_SERDES_SPEC_CTRL2, ctrl);
+	return mv88e6xxx_serdes_write(chip, lane, 0, MV88E6352_SERDES_SPEC_CTRL2, ctrl);
 }
 
 static int mv88e6393x_serdes_power_lane(struct mv88e6xxx_chip *chip, int lane,
@@ -1417,7 +1417,7 @@ static int mv88e6393x_serdes_power_lane(struct mv88e6xxx_chip *chip, int lane,
 		reg |= MV88E6393X_SERDES_CTRL1_TX_PDOWN |
 		       MV88E6393X_SERDES_CTRL1_RX_PDOWN;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6393X_SERDES_CTRL1, reg);
 }
 
@@ -1442,7 +1442,7 @@ static int mv88e6393x_serdes_erratum_4_6(struct mv88e6xxx_chip *chip, int lane)
 	reg &= ~MV88E6393X_SERDES_POC_PDOWN;
 	reg |= MV88E6393X_SERDES_POC_RESET;
 
-	err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				     MV88E6393X_SERDES_POC, reg);
 	if (err)
 		return err;
@@ -1499,7 +1499,7 @@ static int mv88e6393x_serdes_erratum_4_8(struct mv88e6xxx_chip *chip, int lane)
 	else
 		reg &= ~MV88E6393X_ERRATA_4_8_BIT;
 
-	return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				      MV88E6393X_ERRATA_4_8_REG, reg);
 }
 
@@ -1539,7 +1539,7 @@ static int mv88e6393x_serdes_erratum_5_2(struct mv88e6xxx_chip *chip, int lane,
 		reg &= ~fixes[i].mask;
 		reg |= fixes[i].val;
 
-		err = mv88e6390_serdes_write(chip, lane, fixes[i].dev,
+		err = mv88e6xxx_serdes_write(chip, lane, fixes[i].dev,
 					     fixes[i].reg, reg);
 		if (err)
 			return err;
@@ -1584,12 +1584,12 @@ static int mv88e6393x_serdes_fix_2500basex_an(struct mv88e6xxx_chip *chip,
 		reg |= MV88E6393X_SERDES_POC_PCS_2500BASEX;
 	reg |= MV88E6393X_SERDES_POC_RESET;
 
-	err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS,
+	err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS,
 				     MV88E6393X_SERDES_POC, reg);
 	if (err)
 		return err;
 
-	err = mv88e6390_serdes_write(chip, lane, MDIO_MMD_VEND1, 0x8000, 0x58);
+	err = mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_VEND1, 0x8000, 0x58);
 	if (err)
 		return err;
 
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx/serdes.h
index 47ddd9d26c92..e71cddf63eba 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.h
+++ b/drivers/net/dsa/mv88e6xxx/serdes.h
@@ -141,6 +141,10 @@ int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
 			  int reg, u16 *val);
 int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
 			  int reg, u16 *val);
+int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 val);
+int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 val);
 unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip,
 					  int port);
 unsigned int mv88e6390_serdes_irq_mapping(struct mv88e6xxx_chip *chip,
@@ -226,6 +230,15 @@ static inline int mv88e6xxx_serdes_read(struct mv88e6xxx_chip *chip, int lane,
 	return chip->info->ops->serdes_read(chip, lane, device, reg, val);
 }
 
+static inline int mv88e6xxx_serdes_write(struct mv88e6xxx_chip *chip, int lane,
+					 int device, int reg, u16 val)
+{
+	if (!chip->info->ops->serdes_write)
+		return -EOPNOTSUPP;
+
+	return chip->info->ops->serdes_write(chip, lane, device, reg, val);
+}
+
 static inline unsigned int
 mv88e6xxx_serdes_irq_mapping(struct mv88e6xxx_chip *chip, int port)
 {
-- 
2.41.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/3] net: dsa: mv88e632x: Add SERDES ops
  2023-07-03 15:26 [PATCH 0/3] net: dsa: SERDES support for mv88e632x family M. Haener
  2023-07-03 15:26 ` [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read M. Haener
  2023-07-03 15:26 ` [PATCH 2/3] net: dsa: mv88e632x: Refactor serdes write M. Haener
@ 2023-07-03 15:26 ` M. Haener
  2023-07-03 15:38 ` [PATCH 0/3] net: dsa: SERDES support for mv88e632x family Andrew Lunn
  3 siblings, 0 replies; 6+ messages in thread
From: M. Haener @ 2023-07-03 15:26 UTC (permalink / raw)
  To: netdev
  Cc: Michael Haener, linux-kernel, Andrew Lunn, Florian Fainelli,
	Vladimir Oltean, David S. Miller, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Russell King, Alexander Sverdlin

From: Michael Haener <michael.haener@siemens.com>

The 88e632x family has several SERDES 100/1000 blocks. By adding these
operations, these functionalities can be used.

Signed-off-by: Michael Haener <michael.haener@siemens.com>
---
 drivers/net/dsa/mv88e6xxx/chip.c   | 32 ++++++++++++++++++++++++
 drivers/net/dsa/mv88e6xxx/serdes.c | 39 ++++++++++++++++++++++++++++++
 drivers/net/dsa/mv88e6xxx/serdes.h |  9 +++++++
 3 files changed, 80 insertions(+)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 54e99cfb17c1..b889f08b9c3f 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -5197,10 +5197,26 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
 	.reset = mv88e6352_g1_reset,
 	.vtu_getnext = mv88e6185_g1_vtu_getnext,
 	.vtu_loadpurge = mv88e6185_g1_vtu_loadpurge,
+	.serdes_get_lane = mv88e6320_serdes_get_lane,
+	.serdes_pcs_get_state = mv88e6352_serdes_pcs_get_state,
+	.serdes_pcs_config = mv88e6352_serdes_pcs_config,
+	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
+	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
+	.serdes_read = mv88e6320_serdes_read,
+	.serdes_write = mv88e6320_serdes_write,
+	.serdes_power = mv88e6352_serdes_power,
+	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
+	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
+	.serdes_irq_status = mv88e6352_serdes_irq_status,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6352_avb_ops,
 	.ptp_ops = &mv88e6352_ptp_ops,
 	.phylink_get_caps = mv88e6185_phylink_get_caps,
+	.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,
 };
 
 static const struct mv88e6xxx_ops mv88e6321_ops = {
@@ -5243,10 +5259,26 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
 	.reset = mv88e6352_g1_reset,
 	.vtu_getnext = mv88e6185_g1_vtu_getnext,
 	.vtu_loadpurge = mv88e6185_g1_vtu_loadpurge,
+	.serdes_get_lane = mv88e6320_serdes_get_lane,
+	.serdes_pcs_get_state = mv88e6352_serdes_pcs_get_state,
+	.serdes_pcs_config = mv88e6352_serdes_pcs_config,
+	.serdes_pcs_an_restart = mv88e6352_serdes_pcs_an_restart,
+	.serdes_pcs_link_up = mv88e6352_serdes_pcs_link_up,
+	.serdes_read = mv88e6320_serdes_read,
+	.serdes_write = mv88e6320_serdes_write,
+	.serdes_power = mv88e6352_serdes_power,
+	.serdes_irq_mapping = mv88e6352_serdes_irq_mapping,
+	.serdes_irq_enable = mv88e6352_serdes_irq_enable,
+	.serdes_irq_status = mv88e6352_serdes_irq_status,
 	.gpio_ops = &mv88e6352_gpio_ops,
 	.avb_ops = &mv88e6352_avb_ops,
 	.ptp_ops = &mv88e6352_ptp_ops,
 	.phylink_get_caps = mv88e6185_phylink_get_caps,
+	.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,
 };
 
 static const struct mv88e6xxx_ops mv88e6341_ops = {
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index 7b64e30600b9..8e8f264429de 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -17,6 +17,45 @@
 #include "port.h"
 #include "serdes.h"
 
+int mv88e6320_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
+			  int reg, u16 *val)
+{
+	return mv88e6xxx_phy_page_read(chip, lane,
+				       MV88E6320_SERDES_PAGE_FIBER,
+				       reg, val);
+}
+
+int mv88e6320_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 val)
+{
+	return mv88e6xxx_phy_page_write(chip, lane,
+					MV88E6320_SERDES_PAGE_FIBER,
+					reg, val);
+}
+
+int mv88e6320_serdes_get_lane(struct mv88e6xxx_chip *chip, int port)
+{
+	u8 cmode = chip->ports[port].cmode;
+	int lane = -ENODEV;
+
+	switch (port) {
+	case 0:
+		if (cmode == MV88E6XXX_PORT_STS_CMODE_100BASEX ||
+		    cmode == MV88E6XXX_PORT_STS_CMODE_1000BASEX ||
+		    cmode == MV88E6XXX_PORT_STS_CMODE_SGMII)
+			lane = MV88E6320_PORT0_LANE;
+		break;
+	case 1:
+		if (cmode == MV88E6XXX_PORT_STS_CMODE_100BASEX ||
+		    cmode == MV88E6XXX_PORT_STS_CMODE_1000BASEX ||
+		    cmode == MV88E6XXX_PORT_STS_CMODE_SGMII)
+			lane = MV88E6320_PORT1_LANE;
+		break;
+	}
+
+	return lane;
+}
+
 int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane,
 			  int device, int reg, u16 *val)
 {
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx/serdes.h
index e71cddf63eba..5af8a1046b69 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.h
+++ b/drivers/net/dsa/mv88e6xxx/serdes.h
@@ -12,6 +12,10 @@
 
 #include "chip.h"
 
+#define MV88E6320_PORT0_LANE		0x0c
+#define MV88E6320_PORT1_LANE		0x0d
+#define MV88E6320_SERDES_PAGE_FIBER	0x01
+
 #define MV88E6352_ADDR_SERDES		0x0f
 #define MV88E6352_SERDES_PAGE_FIBER	0x01
 #define MV88E6352_SERDES_IRQ		0x0b
@@ -108,6 +112,7 @@
 #define MV88E6393X_ERRATA_4_8_BIT		BIT(14)
 
 int mv88e6185_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
+int mv88e6320_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
 int mv88e6341_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
 int mv88e6352_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
 int mv88e6390_serdes_get_lane(struct mv88e6xxx_chip *chip, int port);
@@ -137,10 +142,14 @@ int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 				 int lane, int speed, int duplex);
 int mv88e6390_serdes_pcs_link_up(struct mv88e6xxx_chip *chip, int port,
 				 int lane, int speed, int duplex);
+int mv88e6320_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
+			  int reg, u16 *val);
 int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
 			  int reg, u16 *val);
 int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, int lane, int device,
 			  int reg, u16 *val);
+int mv88e6320_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
+			   int reg, u16 val);
 int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
 			   int reg, u16 val);
 int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip, int lane, int device,
-- 
2.41.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] net: dsa: SERDES support for mv88e632x family
  2023-07-03 15:26 [PATCH 0/3] net: dsa: SERDES support for mv88e632x family M. Haener
                   ` (2 preceding siblings ...)
  2023-07-03 15:26 ` [PATCH 3/3] net: dsa: mv88e632x: Add SERDES ops M. Haener
@ 2023-07-03 15:38 ` Andrew Lunn
  2023-07-04  6:11   ` Haener, Michael
  3 siblings, 1 reply; 6+ messages in thread
From: Andrew Lunn @ 2023-07-03 15:38 UTC (permalink / raw)
  To: M. Haener
  Cc: netdev, linux-kernel, Florian Fainelli, Vladimir Oltean,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Russell King, Alexander Sverdlin

On Mon, Jul 03, 2023 at 05:26:06PM +0200, M. Haener wrote:
> From: Michael Haener <michael.haener@siemens.com>
> 
> This patch series brings SERDES support for the mv88e632x family.

Please take a look at Russell Kings series:

https://www.spinics.net/lists/netdev/msg914908.html

It would be good if you could build on top of that, which we should be
merging soon.

   Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] net: dsa: SERDES support for mv88e632x family
  2023-07-03 15:38 ` [PATCH 0/3] net: dsa: SERDES support for mv88e632x family Andrew Lunn
@ 2023-07-04  6:11   ` Haener, Michael
  0 siblings, 0 replies; 6+ messages in thread
From: Haener, Michael @ 2023-07-04  6:11 UTC (permalink / raw)
  To: andrew
  Cc: olteanv, davem, linux, linux-kernel, pabeni, kuba, edumazet,
	netdev, Sverdlin, Alexander, f.fainelli

Thanks for your message. I will adjust the patch accordingly.

Michael

On Mon, 2023-07-03 at 17:38 +0200, Andrew Lunn wrote:
> On Mon, Jul 03, 2023 at 05:26:06PM +0200, M. Haener wrote:
> > From: Michael Haener <michael.haener@siemens.com>
> >
> > This patch series brings SERDES support for the mv88e632x family.
>
> Please take a look at Russell Kings series:
>
> https://www.spinics.net/lists/netdev/msg914908.html
>
> It would be good if you could build on top of that, which we should
> be
> merging soon.
>
>    Andrew


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-07-04  6:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-03 15:26 [PATCH 0/3] net: dsa: SERDES support for mv88e632x family M. Haener
2023-07-03 15:26 ` [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read M. Haener
2023-07-03 15:26 ` [PATCH 2/3] net: dsa: mv88e632x: Refactor serdes write M. Haener
2023-07-03 15:26 ` [PATCH 3/3] net: dsa: mv88e632x: Add SERDES ops M. Haener
2023-07-03 15:38 ` [PATCH 0/3] net: dsa: SERDES support for mv88e632x family Andrew Lunn
2023-07-04  6:11   ` Haener, Michael

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®