From nobody Sun Feb 8 23:19:15 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E9B5EB64DC for ; Mon, 3 Jul 2023 15:27:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229750AbjGCP1o (ORCPT ); Mon, 3 Jul 2023 11:27:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229944AbjGCP1n (ORCPT ); Mon, 3 Jul 2023 11:27:43 -0400 X-Greylist: delayed 62 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Mon, 03 Jul 2023 08:27:39 PDT Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B056EE5D for ; Mon, 3 Jul 2023 08:27:39 -0700 (PDT) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 2023070315263519655ba5ba6f625af5 for ; Mon, 03 Jul 2023 17:26:35 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=michael.haener@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=ZdPJck4ohxSu61f3MR2THgU+BhIdxesm3nlOUSlZhCI=; b=ZYEZDeyw1rr06Em6uD24W12wiJnO9XELv/UyU9YDbNaonGsG/z6qK6Y0STC44yKuRr7Ele 1EZ+TCAjIp2ORUeWA804loratsH5LAv1G3MFHeYGDuKXfzNBrovCZL9iHH6ZBZNyMd5VrY3u Gv5LYKp1hWDWpKvI5Wwi9p7uMjgIw=; From: "M. Haener" To: netdev@vger.kernel.org Cc: Michael Haener , linux-kernel@vger.kernel.org, Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Alexander Sverdlin Subject: [PATCH 1/3] net: dsa: mv88e632x: Refactor serdes read Date: Mon, 3 Jul 2023 17:26:07 +0200 Message-ID: <20230703152611.420381-2-michael.haener@siemens.com> In-Reply-To: <20230703152611.420381-1-michael.haener@siemens.com> References: <20230703152611.420381-1-michael.haener@siemens.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-664519:519-21489:flowmailer Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Michael Haener To avoid code duplication, the serdes read functions have been combined. Signed-off-by: Michael Haener --- 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/c= hip.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 =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .phylink_get_caps =3D mv88e6341_phylink_get_caps, }; =20 @@ -4617,6 +4618,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops =3D { .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, + .serdes_read =3D mv88e6352_serdes_read, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, .gpio_ops =3D &mv88e6352_gpio_ops, @@ -4722,6 +4724,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops =3D { .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -4833,6 +4836,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .gpio_ops =3D &mv88e6352_gpio_ops, .phylink_get_caps =3D mv88e6390_phylink_get_caps, }; @@ -4898,6 +4902,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .gpio_ops =3D &mv88e6352_gpio_ops, .phylink_get_caps =3D mv88e6390x_phylink_get_caps, }; @@ -4961,6 +4966,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6352_ptp_ops, .phylink_get_caps =3D mv88e6390_phylink_get_caps, @@ -5019,6 +5025,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops =3D { .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -5134,6 +5141,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6390_ptp_ops, @@ -5300,6 +5308,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .phylink_get_caps =3D mv88e6341_phylink_get_caps, }; =20 @@ -5450,6 +5459,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops =3D { .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -5531,6 +5541,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .phylink_get_caps =3D mv88e6390_phylink_get_caps, }; =20 @@ -5596,6 +5607,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops =3D { .serdes_get_stats =3D mv88e6390_serdes_get_stats, .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, + .serdes_read =3D mv88e6390_serdes_read, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6390_ptp_ops, @@ -5663,6 +5675,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops =3D { .serdes_irq_mapping =3D mv88e6390_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6393x_serdes_irq_enable, .serdes_irq_status =3D mv88e6393x_serdes_irq_status, + .serdes_read =3D mv88e6390_serdes_read, /* TODO: serdes stats */ .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/c= hip.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); =20 /* 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" =20 -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); } =20 -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; =20 - err =3D mv88e6352_serdes_read(chip, MII_BMCR, &val); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val); if (err) return err; =20 @@ -161,7 +161,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *= chip, int port, return 0; } =20 - err =3D mv88e6352_serdes_read(chip, MII_ADVERTISE, &val); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MII_ADVERTISE, &val); if (err) return err; =20 @@ -172,7 +172,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *= chip, int port, return err; } =20 - err =3D mv88e6352_serdes_read(chip, MII_BMCR, &val); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val); if (err) return err; =20 @@ -193,19 +193,19 @@ int mv88e6352_serdes_pcs_get_state(struct mv88e6xxx_c= hip *chip, int port, u16 bmsr, lpa, status; int err; =20 - err =3D mv88e6352_serdes_read(chip, MII_BMSR, &bmsr); + err =3D 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; } =20 - err =3D mv88e6352_serdes_read(chip, 0x11, &status); + err =3D 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; } =20 - err =3D mv88e6352_serdes_read(chip, MII_LPA, &lpa); + err =3D 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_ch= ip *chip, int port, u16 bmcr; int err; =20 - err =3D mv88e6352_serdes_read(chip, MII_BMCR, &bmcr); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &bmcr); if (err) return err; =20 @@ -233,7 +233,7 @@ int mv88e6352_serdes_pcs_link_up(struct mv88e6xxx_chip = *chip, int port, u16 val, bmcr; int err; =20 - err =3D mv88e6352_serdes_read(chip, MII_BMCR, &val); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MII_BMCR, &val); if (err) return err; =20 @@ -311,14 +311,16 @@ int mv88e6352_serdes_get_strings(struct mv88e6xxx_chi= p *chip, return ARRAY_SIZE(mv88e6352_serdes_hw_stats); } =20 -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 =3D 0; u16 reg; int err; + int lane; =20 - err =3D mv88e6352_serdes_read(chip, stat->reg, ®); + lane =3D mv88e6xxx_serdes_get_lane(chip, port); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, stat->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 mv88e6= xxx_chip *chip, val =3D reg; =20 if (stat->sizeof_stat =3D=3D 32) { - err =3D mv88e6352_serdes_read(chip, stat->reg + 1, ®); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, stat->reg + 1, ®); 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 *c= hip, int port, =20 for (i =3D 0; i < ARRAY_SIZE(mv88e6352_serdes_hw_stats); i++) { stat =3D &mv88e6352_serdes_hw_stats[i]; - value =3D mv88e6352_serdes_get_stat(chip, stat); + value =3D mv88e6352_serdes_get_stat(chip, port, stat); mv88e6xxx_port->serdes_stats[i] +=3D value; data[i] =3D 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; =20 /* If the link has dropped, we want to know about it. */ - err =3D mv88e6352_serdes_read(chip, MII_BMSR, &bmsr); + lane =3D mv88e6xxx_serdes_get_lane(chip, port); + err =3D 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 mv88e6xx= x_chip *chip, int port, u16 status; int err; =20 - err =3D mv88e6352_serdes_read(chip, MV88E6352_SERDES_INT_STATUS, &status); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MV88E6352_SERDES_INT_STATUS,= &status); if (err) return ret; =20 @@ -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; =20 err =3D mv88e6352_g2_scratch_port_has_serdes(chip, port); if (err <=3D 0) return; =20 + lane =3D mv88e6xxx_serdes_get_lane(chip, port); for (i =3D 0 ; i < 32; i++) { - err =3D mv88e6352_serdes_read(chip, i, ®); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, i, ®); if (!err) p[i] =3D reg; } @@ -697,7 +703,7 @@ static int mv88e6390_serdes_power_10g(struct mv88e6xxx_= chip *chip, int lane, u16 val, new_val; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6390_10G_CTRL1, &val); =20 if (err) @@ -724,7 +730,7 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xx= x_chip *chip, int lane, u16 val, new_val; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 mv88e6= xxx_chip *chip, int lane, int err, i; =20 for (i =3D 0; i < 3; i++) { - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, stat->reg + i, ®[i]); if (err) { dev_err(chip->dev, "failed to read statistic\n"); @@ -819,7 +825,7 @@ static int mv88e6390_serdes_enable_checker(struct mv88e= 6xxx_chip *chip, int lane u16 reg; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6390_PG_CONTROL, ®); if (err) return err; @@ -884,7 +890,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *= chip, int port, return 0; } =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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; } =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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(struc= t mv88e6xxx_chip *chip, u16 bmsr, lpa, status; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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; } =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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; } =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 mv= 88e6xxx_chip *chip, u16 status; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 m= v88e6xxx_chip *chip, u16 status; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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_chi= p *chip, int port, u16 val, bmcr; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 mv= 88e6xxx_chip *chip, int err; =20 /* If the link has dropped, we want to know about it. */ - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 mv8= 8e6xxx_chip *chip, int err; =20 /* If the link has dropped, we want to know about it. */ - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 m= v88e6xxx_chip *chip, { int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6390_SGMII_INT_STATUS, status); =20 return err; @@ -1224,7 +1230,7 @@ static int mv88e6393x_serdes_irq_status_10g(struct mv= 88e6xxx_chip *chip, { int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_10G_INT_STATUS, status); =20 return err; @@ -1346,7 +1352,7 @@ void mv88e6390_serdes_get_regs(struct mv88e6xxx_chip = *chip, int port, void *_p) return; =20 for (i =3D 0 ; i < ARRAY_SIZE(mv88e6390_serdes_regs); i++) { - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, mv88e6390_serdes_regs[i], ®); if (!err) p[i] =3D reg; @@ -1365,6 +1371,7 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xx= x_chip *chip, int port, u16 ctrl, reg; int err; int i; + int lane; =20 err =3D mv88e6352_g2_scratch_port_has_serdes(chip, port); if (err <=3D 0) @@ -1381,7 +1388,8 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xx= x_chip *chip, int port, if (!found) return -EINVAL; =20 - err =3D mv88e6352_serdes_read(chip, MV88E6352_SERDES_SPEC_CTRL2, &ctrl); + lane =3D mv88e6xxx_serdes_get_lane(chip, port); + err =3D mv88e6xxx_serdes_read(chip, lane, 0, MV88E6352_SERDES_SPEC_CTRL2,= &ctrl); if (err) return err; =20 @@ -1397,7 +1405,7 @@ static int mv88e6393x_serdes_power_lane(struct mv88e6= xxx_chip *chip, int lane, u16 reg; int err; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_CTRL1, ®); if (err) return err; @@ -1426,7 +1434,7 @@ static int mv88e6393x_serdes_erratum_4_6(struct mv88e= 6xxx_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 =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_POC, ®); if (err) return err; @@ -1472,14 +1480,14 @@ static int mv88e6393x_serdes_erratum_4_8(struct mv8= 8e6xxx_chip *chip, int lane) * Workaround is to write SERDES register 4.F074.14=3D1 for only those * modes and 0 in all other modes. */ - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_POC, &pcs); if (err) return err; =20 pcs &=3D MV88E6393X_SERDES_POC_PCS_MASK; =20 - err =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_ERRATA_4_8_REG, ®); if (err) return err; @@ -1523,7 +1531,7 @@ static int mv88e6393x_serdes_erratum_5_2(struct mv88e= 6xxx_chip *chip, int lane, return 0; =20 for (i =3D 0; i < ARRAY_SIZE(fixes); ++i) { - err =3D mv88e6390_serdes_read(chip, lane, fixes[i].dev, + err =3D mv88e6xxx_serdes_read(chip, lane, fixes[i].dev, fixes[i].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 =3D mv88e6390_serdes_read(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_read(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_POC, ®); 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 devic= e, + int reg, u16 *val); +int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, int lane, int devic= e, + 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 m= v88e6xxx_chip *chip, return chip->info->ops->serdes_power(chip, port, lane, false); } =20 +static inline int mv88e6xxx_serdes_read(struct mv88e6xxx_chip *chip, int l= ane, + 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) { --=20 2.41.0 From nobody Sun Feb 8 23:19:15 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 04954EB64DC for ; Mon, 3 Jul 2023 15:27:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231157AbjGCP1r (ORCPT ); Mon, 3 Jul 2023 11:27:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230484AbjGCP1o (ORCPT ); Mon, 3 Jul 2023 11:27:44 -0400 X-Greylist: delayed 62 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Mon, 03 Jul 2023 08:27:42 PDT Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 54B1BE66 for ; Mon, 3 Jul 2023 08:27:42 -0700 (PDT) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 20230703152638bd31abf74635af848a for ; Mon, 03 Jul 2023 17:26:38 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=michael.haener@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=a5E01gIUkA26aGt9X7j9VPDWiRV+QjB9oiTC8u4s6Ao=; b=oJ0migxhMbedawTB702z3Van3Bb03KWJujtAQQ3pSsUzZM0Pva42oLJCKExrPh5WCyT5nK C3y03eT3uLgadcXrbfAoJPJ9+5IZryo/1lWhzyFVFKRmD9IZfftJR6VTAiL1CDs77NQ+p+UH mK2iTQvfgf+2hjX3SxAlu7c7VTrpE=; From: "M. Haener" To: netdev@vger.kernel.org Cc: Michael Haener , linux-kernel@vger.kernel.org, Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Alexander Sverdlin Subject: [PATCH 2/3] net: dsa: mv88e632x: Refactor serdes write Date: Mon, 3 Jul 2023 17:26:08 +0200 Message-ID: <20230703152611.420381-3-michael.haener@siemens.com> In-Reply-To: <20230703152611.420381-1-michael.haener@siemens.com> References: <20230703152611.420381-1-michael.haener@siemens.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-664519:519-21489:flowmailer Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Michael Haener To avoid code duplication, the serdes write functions have been combined. Signed-off-by: Michael Haener --- 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/c= hip.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 =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .phylink_get_caps =3D mv88e6341_phylink_get_caps, }; =20 @@ -4619,6 +4620,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops =3D { .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, .gpio_ops =3D &mv88e6352_gpio_ops, @@ -4725,6 +4727,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops =3D { .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -4837,6 +4840,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .gpio_ops =3D &mv88e6352_gpio_ops, .phylink_get_caps =3D mv88e6390_phylink_get_caps, }; @@ -4903,6 +4907,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .gpio_ops =3D &mv88e6352_gpio_ops, .phylink_get_caps =3D mv88e6390x_phylink_get_caps, }; @@ -4967,6 +4972,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6352_ptp_ops, .phylink_get_caps =3D mv88e6390_phylink_get_caps, @@ -5026,6 +5032,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops =3D { .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -5142,6 +5149,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6390_ptp_ops, @@ -5309,6 +5317,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .phylink_get_caps =3D mv88e6341_phylink_get_caps, }; =20 @@ -5460,6 +5469,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops =3D { .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, .serdes_power =3D mv88e6352_serdes_power, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, .serdes_irq_status =3D mv88e6352_serdes_irq_status, @@ -5542,6 +5552,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .phylink_get_caps =3D mv88e6390_phylink_get_caps, }; =20 @@ -5608,6 +5619,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops =3D { .serdes_get_regs_len =3D mv88e6390_serdes_get_regs_len, .serdes_get_regs =3D mv88e6390_serdes_get_regs, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, .ptp_ops =3D &mv88e6390_ptp_ops, @@ -5676,6 +5688,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops =3D { .serdes_irq_enable =3D mv88e6393x_serdes_irq_enable, .serdes_irq_status =3D mv88e6393x_serdes_irq_status, .serdes_read =3D mv88e6390_serdes_read, + .serdes_write =3D mv88e6390_serdes_write, /* TODO: serdes stats */ .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6390_avb_ops, diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/c= hip.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); =20 /* 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, in= t lane, reg, val); } =20 -static int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int reg, - u16 val) +int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, + 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); } =20 -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 =3D val | BMCR_PDOWN; =20 if (val !=3D new_val) - err =3D mv88e6352_serdes_write(chip, MII_BMCR, new_val); + err =3D mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, new_val); =20 return err; } @@ -167,7 +167,7 @@ int mv88e6352_serdes_pcs_config(struct mv88e6xxx_chip *= chip, int port, =20 changed =3D val !=3D adv; if (changed) { - err =3D mv88e6352_serdes_write(chip, MII_ADVERTISE, adv); + err =3D 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 =3D=3D val) return changed; =20 - return mv88e6352_serdes_write(chip, MII_BMCR, bmcr); + return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr); } =20 int mv88e6352_serdes_pcs_get_state(struct mv88e6xxx_chip *chip, int port, @@ -224,7 +224,7 @@ int mv88e6352_serdes_pcs_an_restart(struct mv88e6xxx_ch= ip *chip, int port, if (err) return err; =20 - return mv88e6352_serdes_write(chip, MII_BMCR, bmcr | BMCR_ANRESTART); + return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr | BMCR_ANREST= ART); } =20 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 =3D=3D val) return 0; =20 - return mv88e6352_serdes_write(chip, MII_BMCR, bmcr); + return mv88e6xxx_serdes_write(chip, lane, 0, MII_BMCR, bmcr); } =20 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 |=3D MV88E6352_SERDES_INT_LINK_CHANGE; =20 - return mv88e6352_serdes_write(chip, MV88E6352_SERDES_INT_ENABLE, val); + return mv88e6xxx_serdes_write(chip, lane, 0, MV88E6352_SERDES_INT_ENABLE,= val); } =20 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 =3D val | MDIO_CTRL1_LPOWER; =20 if (val !=3D new_val) - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6390_10G_CTRL1, new_val); =20 return err; @@ -741,7 +741,7 @@ static int mv88e6390_serdes_power_sgmii(struct mv88e6xx= x_chip *chip, int lane, new_val =3D val | BMCR_PDOWN; =20 if (val !=3D new_val) - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6390_SGMII_BMCR, new_val); =20 return err; @@ -831,7 +831,7 @@ static int mv88e6390_serdes_enable_checker(struct mv88e= 6xxx_chip *chip, int lane return err; =20 reg |=3D 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); } =20 @@ -897,7 +897,7 @@ int mv88e6390_serdes_pcs_config(struct mv88e6xxx_chip *= chip, int port, =20 changed =3D val !=3D adv; if (changed) { - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 =3D=3D val) return changed; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6390_SGMII_BMCR, bmcr); } =20 @@ -1082,7 +1082,7 @@ int mv88e6390_serdes_pcs_an_restart(struct mv88e6xxx_= chip *chip, int port, if (err) return err; =20 - 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_chi= p *chip, int port, if (bmcr =3D=3D val) return 0; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6390_SGMII_BMCR, bmcr); } =20 @@ -1164,7 +1164,7 @@ static int mv88e6390_serdes_irq_enable_sgmii(struct m= v88e6xxx_chip *chip, val |=3D MV88E6390_SGMII_INT_LINK_DOWN | MV88E6390_SGMII_INT_LINK_UP; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6390_SGMII_INT_ENABLE, val); } =20 @@ -1202,7 +1202,7 @@ static int mv88e6393x_serdes_irq_enable_10g(struct mv= 88e6xxx_chip *chip, if (enable) val |=3D MV88E6393X_10G_INT_LINK_CHANGE; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_10G_INT_ENABLE, val); } =20 @@ -1396,7 +1396,7 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xx= x_chip *chip, int port, ctrl &=3D ~MV88E6352_SERDES_OUT_AMP_MASK; ctrl |=3D reg; =20 - return mv88e6352_serdes_write(chip, MV88E6352_SERDES_SPEC_CTRL2, ctrl); + return mv88e6xxx_serdes_write(chip, lane, 0, MV88E6352_SERDES_SPEC_CTRL2,= ctrl); } =20 static int mv88e6393x_serdes_power_lane(struct mv88e6xxx_chip *chip, int l= ane, @@ -1417,7 +1417,7 @@ static int mv88e6393x_serdes_power_lane(struct mv88e6= xxx_chip *chip, int lane, reg |=3D MV88E6393X_SERDES_CTRL1_TX_PDOWN | MV88E6393X_SERDES_CTRL1_RX_PDOWN; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_CTRL1, reg); } =20 @@ -1442,7 +1442,7 @@ static int mv88e6393x_serdes_erratum_4_6(struct mv88e= 6xxx_chip *chip, int lane) reg &=3D ~MV88E6393X_SERDES_POC_PDOWN; reg |=3D MV88E6393X_SERDES_POC_RESET; =20 - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + err =3D 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 mv88e= 6xxx_chip *chip, int lane) else reg &=3D ~MV88E6393X_ERRATA_4_8_BIT; =20 - return mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + return mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_ERRATA_4_8_REG, reg); } =20 @@ -1539,7 +1539,7 @@ static int mv88e6393x_serdes_erratum_5_2(struct mv88e= 6xxx_chip *chip, int lane, reg &=3D ~fixes[i].mask; reg |=3D fixes[i].val; =20 - err =3D mv88e6390_serdes_write(chip, lane, fixes[i].dev, + err =3D 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(struc= t mv88e6xxx_chip *chip, reg |=3D MV88E6393X_SERDES_POC_PCS_2500BASEX; reg |=3D MV88E6393X_SERDES_POC_RESET; =20 - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_PHYXS, + err =3D mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_PHYXS, MV88E6393X_SERDES_POC, reg); if (err) return err; =20 - err =3D mv88e6390_serdes_write(chip, lane, MDIO_MMD_VEND1, 0x8000, 0x58); + err =3D mv88e6xxx_serdes_write(chip, lane, MDIO_MMD_VEND1, 0x8000, 0x58); if (err) return err; =20 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 devic= e, int reg, u16 *val); +int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, + int reg, u16 val); +int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, + 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 mv88e6x= xx_chip *chip, int lane, return chip->info->ops->serdes_read(chip, lane, device, reg, val); } =20 +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) { --=20 2.41.0 From nobody Sun Feb 8 23:19:15 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AF8C6EB64DC for ; Mon, 3 Jul 2023 15:26:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230515AbjGCP0s (ORCPT ); Mon, 3 Jul 2023 11:26:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57210 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229944AbjGCP0q (ORCPT ); Mon, 3 Jul 2023 11:26:46 -0400 Received: from mta-64-226.siemens.flowmailer.net (mta-64-226.siemens.flowmailer.net [185.136.64.226]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1FCBFE58 for ; Mon, 3 Jul 2023 08:26:44 -0700 (PDT) Received: by mta-64-226.siemens.flowmailer.net with ESMTPSA id 2023070315264213e82ac5c40c75b1c8 for ; Mon, 03 Jul 2023 17:26:42 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=michael.haener@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=2C7Jb3Bpb/V3uMa0SnRT1zOU30LU1+kgf+2BdMTB4Bs=; b=VYSdB0sKL1CzSzgny3f6oQ5l1zmCH+5Ft+xdAJM48epFlTcrtIovvx5CH44BokaDgGbVb/ Qparvi12ltQMSAOXklARVSYS6s+dYq3tZ72jGWXOTfmIvRdW4XMqxUE4F4MqwL0yOOLm4t72 H+1YntpC2MQ0S3k3pBrjsjz+32jdk=; From: "M. Haener" To: netdev@vger.kernel.org Cc: Michael Haener , linux-kernel@vger.kernel.org, Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Alexander Sverdlin Subject: [PATCH 3/3] net: dsa: mv88e632x: Add SERDES ops Date: Mon, 3 Jul 2023 17:26:09 +0200 Message-ID: <20230703152611.420381-4-michael.haener@siemens.com> In-Reply-To: <20230703152611.420381-1-michael.haener@siemens.com> References: <20230703152611.420381-1-michael.haener@siemens.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-664519:519-21489:flowmailer Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Michael Haener The 88e632x family has several SERDES 100/1000 blocks. By adding these operations, these functionalities can be used. Signed-off-by: Michael Haener --- 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/c= hip.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 =3D= { .reset =3D mv88e6352_g1_reset, .vtu_getnext =3D mv88e6185_g1_vtu_getnext, .vtu_loadpurge =3D mv88e6185_g1_vtu_loadpurge, + .serdes_get_lane =3D mv88e6320_serdes_get_lane, + .serdes_pcs_get_state =3D mv88e6352_serdes_pcs_get_state, + .serdes_pcs_config =3D mv88e6352_serdes_pcs_config, + .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, + .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, + .serdes_read =3D mv88e6320_serdes_read, + .serdes_write =3D mv88e6320_serdes_write, + .serdes_power =3D mv88e6352_serdes_power, + .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, + .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, + .serdes_irq_status =3D mv88e6352_serdes_irq_status, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6352_avb_ops, .ptp_ops =3D &mv88e6352_ptp_ops, .phylink_get_caps =3D mv88e6185_phylink_get_caps, + .serdes_get_sset_count =3D mv88e6352_serdes_get_sset_count, + .serdes_get_strings =3D mv88e6352_serdes_get_strings, + .serdes_get_stats =3D mv88e6352_serdes_get_stats, + .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, + .serdes_get_regs =3D mv88e6352_serdes_get_regs, }; =20 static const struct mv88e6xxx_ops mv88e6321_ops =3D { @@ -5243,10 +5259,26 @@ static const struct mv88e6xxx_ops mv88e6321_ops =3D= { .reset =3D mv88e6352_g1_reset, .vtu_getnext =3D mv88e6185_g1_vtu_getnext, .vtu_loadpurge =3D mv88e6185_g1_vtu_loadpurge, + .serdes_get_lane =3D mv88e6320_serdes_get_lane, + .serdes_pcs_get_state =3D mv88e6352_serdes_pcs_get_state, + .serdes_pcs_config =3D mv88e6352_serdes_pcs_config, + .serdes_pcs_an_restart =3D mv88e6352_serdes_pcs_an_restart, + .serdes_pcs_link_up =3D mv88e6352_serdes_pcs_link_up, + .serdes_read =3D mv88e6320_serdes_read, + .serdes_write =3D mv88e6320_serdes_write, + .serdes_power =3D mv88e6352_serdes_power, + .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, + .serdes_irq_enable =3D mv88e6352_serdes_irq_enable, + .serdes_irq_status =3D mv88e6352_serdes_irq_status, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6352_avb_ops, .ptp_ops =3D &mv88e6352_ptp_ops, .phylink_get_caps =3D mv88e6185_phylink_get_caps, + .serdes_get_sset_count =3D mv88e6352_serdes_get_sset_count, + .serdes_get_strings =3D mv88e6352_serdes_get_strings, + .serdes_get_stats =3D mv88e6352_serdes_get_stats, + .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, + .serdes_get_regs =3D mv88e6352_serdes_get_regs, }; =20 static const struct mv88e6xxx_ops mv88e6341_ops =3D { 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" =20 +int mv88e6320_serdes_read(struct mv88e6xxx_chip *chip, int lane, int devic= e, + 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 devi= ce, + 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 =3D chip->ports[port].cmode; + int lane =3D -ENODEV; + + switch (port) { + case 0: + if (cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_100BASEX || + cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_1000BASEX || + cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_SGMII) + lane =3D MV88E6320_PORT0_LANE; + break; + case 1: + if (cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_100BASEX || + cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_1000BASEX || + cmode =3D=3D MV88E6XXX_PORT_STS_CMODE_SGMII) + lane =3D 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 @@ =20 #include "chip.h" =20 +#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) =20 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_chi= p *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 devic= e, + int reg, u16 *val); int mv88e6352_serdes_read(struct mv88e6xxx_chip *chip, int lane, int devic= e, int reg, u16 *val); int mv88e6390_serdes_read(struct mv88e6xxx_chip *chip, int lane, int devic= e, int reg, u16 *val); +int mv88e6320_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, + int reg, u16 val); int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, int reg, u16 val); int mv88e6390_serdes_write(struct mv88e6xxx_chip *chip, int lane, int devi= ce, --=20 2.41.0