From nobody Sun Feb 8 15:53:45 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 3A4B9EB64D9 for ; Tue, 4 Jul 2023 07:00:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231207AbjGDHAr (ORCPT ); Tue, 4 Jul 2023 03:00:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230090AbjGDHAn (ORCPT ); Tue, 4 Jul 2023 03:00:43 -0400 X-Greylist: delayed 62 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Tue, 04 Jul 2023 00:00:41 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 7EAF311F for ; Tue, 4 Jul 2023 00:00:41 -0700 (PDT) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 20230704065937565830196ae9298373 for ; Tue, 04 Jul 2023 08:59:37 +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=iA6tJcmV+v1jxOI6RL3M6acqkRHFuwMTT/57dXnyXeQ=; b=pPUzVpsDtsWkWJZMtKgSSBGbu89D5k4EtGvoVH4l3+X7ZWcyBO9luGdNlETPrORrA/ZdIN zCB6CfeelvqJj1GZkZmuyQNWqXRD7Ez0U7WfiOzPtF0m2AGb7OM4tHxi83+HmiwYZQnDXIaw SqkB6Q7kmSOn03AfRH2EFP98IgpJk=; 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 v2 1/3] net: dsa: mv88e632x: Refactor serdes read Date: Tue, 4 Jul 2023 08:59:04 +0200 Message-ID: <20230704065916.132486-2-michael.haener@siemens.com> In-Reply-To: <20230704065916.132486-1-michael.haener@siemens.com> References: <20230704065916.132486-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 Reviewed-by: Alexander Sverdlin Tested-by. It's useless to do that after my patch set has been merged. --- drivers/net/dsa/mv88e6xxx/chip.c | 13 +++++++++++++ drivers/net/dsa/mv88e6xxx/chip.h | 3 +++ drivers/net/dsa/mv88e6xxx/serdes.c | 31 +++++++++++++++++------------- drivers/net/dsa/mv88e6xxx/serdes.h | 13 +++++++++++++ 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/c= hip.c index 8dd82fd87fc6..d2a320c6bed7 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -4191,6 +4191,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, .pcs_ops =3D &mv88e6390_pcs_ops, }; @@ -4373,6 +4374,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops =3D { .vtu_loadpurge =3D mv88e6352_g1_vtu_loadpurge, .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, + .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, @@ -4473,6 +4475,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops =3D { .vtu_loadpurge =3D mv88e6352_g1_vtu_loadpurge, .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, @@ -4573,6 +4576,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, .pcs_ops =3D &mv88e6390_pcs_ops, @@ -4631,6 +4635,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, .pcs_ops =3D &mv88e6390_pcs_ops, @@ -4687,6 +4692,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, @@ -4740,6 +4746,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops =3D { .vtu_loadpurge =3D mv88e6352_g1_vtu_loadpurge, .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, @@ -4846,6 +4853,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, @@ -5005,6 +5013,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, .pcs_ops =3D &mv88e6390_pcs_ops, }; @@ -5150,6 +5159,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops =3D { .vtu_loadpurge =3D mv88e6352_g1_vtu_loadpurge, .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, + .serdes_read =3D mv88e6352_serdes_read, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6352_avb_ops, @@ -5222,6 +5232,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, .pcs_ops =3D &mv88e6390_pcs_ops, }; @@ -5281,6 +5292,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, @@ -5341,6 +5353,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops =3D { .stu_loadpurge =3D mv88e6390_g1_stu_loadpurge, .serdes_get_lane =3D mv88e6393x_serdes_get_lane, .serdes_irq_mapping =3D mv88e6390_serdes_irq_mapping, + .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 44383a03ef2f..bbf1e7f6f343 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.h +++ b/drivers/net/dsa/mv88e6xxx/chip.h @@ -593,6 +593,9 @@ struct mv88e6xxx_ops { /* SERDES lane mapping */ int (*serdes_get_lane)(struct mv88e6xxx_chip *chip, int port); =20 + 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, int port); diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx= /serdes.c index 3b4b42651fa3..5696b94c9155 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); } @@ -109,7 +109,6 @@ int mv88e6xxx_pcs_decode_state(struct device *dev, u16 = bmsr, u16 lpa, =20 return 0; } - struct mv88e6352_serdes_hw_stat { char string[ETH_GSTRING_LEN]; int sizeof_stat; @@ -150,14 +149,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; @@ -166,7 +167,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; @@ -194,7 +195,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]; } @@ -226,13 +227,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; } @@ -418,7 +421,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"); @@ -502,7 +505,7 @@ void mv88e6390_serdes_get_regs(struct mv88e6xxx_chip *c= hip, 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; @@ -521,6 +524,7 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_= 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) @@ -537,7 +541,8 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_= 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 diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx= /serdes.h index aac95cab46e3..9b3a5ece33e7 100644 --- a/drivers/net/dsa/mv88e6xxx/serdes.h +++ b/drivers/net/dsa/mv88e6xxx/serdes.h @@ -120,6 +120,10 @@ int mv88e6341_serdes_get_lane(struct mv88e6xxx_chip *c= hip, 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 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, @@ -153,6 +157,15 @@ static inline int mv88e6xxx_serdes_get_lane(struct mv8= 8e6xxx_chip *chip, return chip->info->ops->serdes_get_lane(chip, port); } =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 15:53:45 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 708ECEB64D9 for ; Tue, 4 Jul 2023 06:59:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230331AbjGDG7o (ORCPT ); Tue, 4 Jul 2023 02:59:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230098AbjGDG7n (ORCPT ); Tue, 4 Jul 2023 02:59:43 -0400 Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net [185.136.65.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 26BDC107 for ; Mon, 3 Jul 2023 23:59:40 -0700 (PDT) Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 2023070406593938db8939be6d3a440a for ; Tue, 04 Jul 2023 08:59:40 +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=naZsB+e+2/m4FNfzsyhDy9BbreIhpBNPwhPGxh/+8wk=; b=jfsgk4LxQW0tINDC2AhBc5k9yT1DmeALX45eXp5z8sMZvL85Z+BvmZL/dvFy2y84HAvaLC 8ycK+RpWdDV4bChnGlHDeDjQD3rjY3VvVsx44d+MWxOqh7g1tDbpKf4vX0tQpjxfNNyOkGUt /cN8YPz7+dGan7v+Oae0Qy7eGsY6w=; 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 v2 2/3] net: dsa: mv88e632x: Refactor serdes write Date: Tue, 4 Jul 2023 08:59:05 +0200 Message-ID: <20230704065916.132486-3-michael.haener@siemens.com> In-Reply-To: <20230704065916.132486-1-michael.haener@siemens.com> References: <20230704065916.132486-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 Tested-by. It's useless to do that after my patch set has been merged. --- drivers/net/dsa/mv88e6xxx/chip.c | 4 ++++ drivers/net/dsa/mv88e6xxx/chip.h | 2 ++ drivers/net/dsa/mv88e6xxx/serdes.c | 6 +++--- drivers/net/dsa/mv88e6xxx/serdes.h | 11 +++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/c= hip.c index d2a320c6bed7..11b98546b938 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -4375,6 +4375,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops =3D { .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, .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, @@ -4476,6 +4477,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops =3D { .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, @@ -4747,6 +4749,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops =3D { .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .serdes_get_regs_len =3D mv88e6352_serdes_get_regs_len, .serdes_get_regs =3D mv88e6352_serdes_get_regs, @@ -5160,6 +5163,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops =3D { .stu_getnext =3D mv88e6352_g1_stu_getnext, .stu_loadpurge =3D mv88e6352_g1_stu_loadpurge, .serdes_read =3D mv88e6352_serdes_read, + .serdes_write =3D mv88e6352_serdes_write, .serdes_irq_mapping =3D mv88e6352_serdes_irq_mapping, .gpio_ops =3D &mv88e6352_gpio_ops, .avb_ops =3D &mv88e6352_avb_ops, diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/c= hip.h index bbf1e7f6f343..7e9b6eb11216 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.h +++ b/drivers/net/dsa/mv88e6xxx/chip.h @@ -595,6 +595,8 @@ struct mv88e6xxx_ops { =20 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 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 5696b94c9155..b988d47ecbdd 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 reg, + u16 val) { return mv88e6xxx_phy_page_write(chip, MV88E6352_ADDR_SERDES, MV88E6352_SERDES_PAGE_FIBER, @@ -549,5 +549,5 @@ int mv88e6352_serdes_set_tx_amplitude(struct mv88e6xxx_= 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, MV88E6352_SERDES_SPEC_CTRL2, ct= rl); } diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx= /serdes.h index 9b3a5ece33e7..d3e83c674ef7 100644 --- a/drivers/net/dsa/mv88e6xxx/serdes.h +++ b/drivers/net/dsa/mv88e6xxx/serdes.h @@ -124,6 +124,8 @@ 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 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, @@ -166,6 +168,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 reg, u16 val) +{ + if (!chip->info->ops->serdes_write) + return -EOPNOTSUPP; + + return chip->info->ops->serdes_write(chip, lane, 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 15:53:45 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 377C1EB64D9 for ; Tue, 4 Jul 2023 07:00:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230090AbjGDHAz (ORCPT ); Tue, 4 Jul 2023 03:00:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37242 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231209AbjGDHAv (ORCPT ); Tue, 4 Jul 2023 03:00:51 -0400 X-Greylist: delayed 62 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Tue, 04 Jul 2023 00:00:45 PDT Received: from mta-64-228.siemens.flowmailer.net (mta-64-228.siemens.flowmailer.net [185.136.64.228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C82D5E47 for ; Tue, 4 Jul 2023 00:00:45 -0700 (PDT) Received: by mta-64-228.siemens.flowmailer.net with ESMTPSA id 202307040659418aaa3a3a2f487e16f4 for ; Tue, 04 Jul 2023 08:59: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=tFUdaM7fpMZCMiSMA7Y3KWuA2AF40gFd8plul349lJQ=; b=ldbvFvOMewpoK47CJdIVC3LDItmhxEq16kzFM9K32tR+k4yNi73CpyPiTwXt3gRHVgvhxY ME384voVrIel2nPeS+jVk+NpjyqwBkYMw7SLinqodssS8Mzx8bI0xFjgkq//paFUo0lQRDQk cHFFatIK/JdwDOGp9OuvNggIdnZb0=; 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 v2 3/3] net: dsa: mv88e632x: Add SERDES ops Date: Tue, 4 Jul 2023 08:59:06 +0200 Message-ID: <20230704065916.132486-4-michael.haener@siemens.com> In-Reply-To: <20230704065916.132486-1-michael.haener@siemens.com> References: <20230704065916.132486-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 Tested-by. It's useless to do that after my patch set has been merged. --- 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 11b98546b938..9802a3608dc6 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -4905,10 +4905,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 { @@ -4951,10 +4960,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