From nobody Sun Sep 7 13:33:50 2025 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 018F2EB64DA for ; Tue, 18 Jul 2023 07:00:34 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231440AbjGRHAd (ORCPT ); Tue, 18 Jul 2023 03:00:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56934 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231561AbjGRHAY (ORCPT ); Tue, 18 Jul 2023 03:00:24 -0400 Received: from mta-64-225.siemens.flowmailer.net (mta-64-225.siemens.flowmailer.net [185.136.64.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C8D4C1716 for ; Tue, 18 Jul 2023 00:00:18 -0700 (PDT) Received: by mta-64-225.siemens.flowmailer.net with ESMTPSA id 202307180700163730c5efcd6844d1a2 for ; Tue, 18 Jul 2023 09:00:16 +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=xApnMAcH/JoVfVzJ9XWUXSyQ0risnVdCKw+SVT9maDo=; b=N1l9HHlJxjNtJjG/rpr8/eS1V1oW7rLeyDyYMHIV5swa7Jea0aHJNunLg2+mLRxIYxYpeB OMXnfmctGvREM/dsG3c+ZZyoJsOjekmQoXM5CjRR96HsEFwzwcfTRlH1Agy/PB3Jny+Arlyz PIEYlLBfcKrH7rGYUsLdUqDvtuIxc=; 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 v3 3/3] net: dsa: mv88e632x: Add SERDES ops Date: Tue, 18 Jul 2023 08:59:31 +0200 Message-ID: <20230718065937.10713-4-michael.haener@siemens.com> In-Reply-To: <20230718065937.10713-1-michael.haener@siemens.com> References: <20230718065937.10713-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 --- Changelog: v3: rebased onto main branch v2: rebased onto Russell Kings series dsa/88e6xxx/phylink drivers/net/dsa/mv88e6xxx/chip.c | 18 ++++++++++++++ drivers/net/dsa/mv88e6xxx/serdes.c | 39 ++++++++++++++++++++++++++++++ drivers/net/dsa/mv88e6xxx/serdes.h | 9 +++++++ 3 files changed, 66 insertions(+) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/c= hip.c index 7e8aaa1383c6..4750db8f7e58 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -4909,10 +4909,19 @@ 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_read =3D mv88e6320_serdes_read, + .serdes_write =3D mv88e6320_serdes_write, + .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .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 { @@ -4955,10 +4964,19 @@ 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_read =3D mv88e6320_serdes_read, + .serdes_write =3D mv88e6320_serdes_write, + .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .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 b988d47ecbdd..411fe9ac421a 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 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 d3e83c674ef7..9dcc9e581c05 100644 --- a/drivers/net/dsa/mv88e6xxx/serdes.h +++ b/drivers/net/dsa/mv88e6xxx/serdes.h @@ -14,6 +14,10 @@ =20 struct phylink_link_state; =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 @@ -116,14 +120,19 @@ struct phylink_link_state; int mv88e6xxx_pcs_decode_state(struct device *dev, u16 bmsr, u16 lpa, u16 status, struct phylink_link_state *state); =20 +int mv88e6320_serdes_get_lane(struct mv88e6xxx_chip *chip, int port); int mv88e6341_serdes_get_lane(struct mv88e6xxx_chip *chip, int port); int mv88e6390_serdes_get_lane(struct mv88e6xxx_chip *chip, int port); int mv88e6390x_serdes_get_lane(struct mv88e6xxx_chip *chip, int port); int mv88e6393x_serdes_get_lane(struct mv88e6xxx_chip *chip, int port); +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 reg, + u16 val); int mv88e6352_serdes_write(struct mv88e6xxx_chip *chip, int lane, int reg, u16 val); unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip, --=20 2.41.0