* [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
@ 2021-11-26 15:42 Holger Brunck
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Holger Brunck @ 2021-11-26 15:42 UTC (permalink / raw)
To: netdev; +Cc: Holger Brunck, Andrew Lunn, Jakub Kicinski
This can be configured from the device tree. Add this property to the
documentation accordingly.
The eight different values added in the dt-bindings file correspond to
the values we can configure on 88E6352, 88E6240 and 88E6176 switches
according to the datasheet.
CC: Andrew Lunn <andrew@lunn.ch>
CC: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
---
.../devicetree/bindings/net/dsa/marvell.txt | 3 +++
include/dt-bindings/net/mv-88e6xxx.h | 18 ++++++++++++++++++
2 files changed, 21 insertions(+)
create mode 100644 include/dt-bindings/net/mv-88e6xxx.h
diff --git a/Documentation/devicetree/bindings/net/dsa/marvell.txt b/Documentation/devicetree/bindings/net/dsa/marvell.txt
index 2363b412410c..bff397a2dc49 100644
--- a/Documentation/devicetree/bindings/net/dsa/marvell.txt
+++ b/Documentation/devicetree/bindings/net/dsa/marvell.txt
@@ -46,6 +46,9 @@ Optional properties:
- mdio? : Container of PHYs and devices on the external MDIO
bus. The node must contains a compatible string of
"marvell,mv88e6xxx-mdio-external"
+- serdes-output-amplitude: Configure the output amplitude of the serdes
+ interface.
+ serdes-output-amplitude = <MV88E6352_SERDES_OUT_AMP_210MV>;
Example:
diff --git a/include/dt-bindings/net/mv-88e6xxx.h b/include/dt-bindings/net/mv-88e6xxx.h
new file mode 100644
index 000000000000..9bc6decaee83
--- /dev/null
+++ b/include/dt-bindings/net/mv-88e6xxx.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Device Tree constants for the Marvell 88E6XXX switch devices
+ */
+
+#ifndef _DT_BINDINGS_MV_88E6XXX_H
+#define _DT_BINDINGS_MV_88E6XXX_H
+
+#define MV88E6352_SERDES_OUT_AMP_14MV 0x0
+#define MV88E6352_SERDES_OUT_AMP_112MV 0x1
+#define MV88E6352_SERDES_OUT_AMP_210MV 0x2
+#define MV88E6352_SERDES_OUT_AMP_308MV 0x3
+#define MV88E6352_SERDES_OUT_AMP_406MV 0x4
+#define MV88E6352_SERDES_OUT_AMP_504MV 0x5
+#define MV88E6352_SERDES_OUT_AMP_602MV 0x6
+#define MV88E6352_SERDES_OUT_AMP_700MV 0x7
+
+#endif
--
2.34.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
@ 2021-11-26 15:42 ` Holger Brunck
2021-11-26 16:16 ` Andrew Lunn
2021-11-26 19:56 ` Marek Behún
2021-11-26 16:08 ` [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Andrew Lunn
` (3 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Holger Brunck @ 2021-11-26 15:42 UTC (permalink / raw)
To: netdev; +Cc: Holger Brunck, Andrew Lunn, Jakub Kicinski
The mv88e6352, mv88e6240 and mv88e6176 have a serdes interface. This patch
allows to configure the output swing to a desired value in the
devicetree node of the switch.
CC: Andrew Lunn <andrew@lunn.ch>
CC: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
---
drivers/net/dsa/mv88e6xxx/chip.c | 14 ++++++++++++++
drivers/net/dsa/mv88e6xxx/chip.h | 3 +++
drivers/net/dsa/mv88e6xxx/serdes.c | 14 ++++++++++++++
drivers/net/dsa/mv88e6xxx/serdes.h | 4 ++++
4 files changed, 35 insertions(+)
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index f00cbf5753b9..5182128959a0 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -3173,9 +3173,11 @@ static void mv88e6xxx_teardown(struct dsa_switch *ds)
static int mv88e6xxx_setup(struct dsa_switch *ds)
{
struct mv88e6xxx_chip *chip = ds->priv;
+ struct device_node *np = chip->dev->of_node;
u8 cmode;
int err;
int i;
+ int out_amp;
chip->ds = ds;
ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip);
@@ -3292,6 +3294,15 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
if (err)
goto unlock;
+ if (chip->info->ops->serdes_set_out_amplitude && np) {
+ if (!of_property_read_u32(np, "serdes-output-amplitude",
+ &out_amp)) {
+ err = mv88e6352_serdes_set_out_amplitude(chip, out_amp);
+ if (err)
+ goto unlock;
+ }
+ }
+
unlock:
mv88e6xxx_reg_unlock(chip);
@@ -4076,6 +4087,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
.serdes_irq_status = mv88e6352_serdes_irq_status,
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
+ .serdes_set_out_amplitude = mv88e6352_serdes_set_out_amplitude,
.gpio_ops = &mv88e6352_gpio_ops,
.phylink_validate = mv88e6352_phylink_validate,
};
@@ -4356,6 +4368,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
.serdes_irq_status = mv88e6352_serdes_irq_status,
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
+ .serdes_set_out_amplitude = mv88e6352_serdes_set_out_amplitude,
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6352_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
@@ -4762,6 +4775,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
.serdes_get_stats = mv88e6352_serdes_get_stats,
.serdes_get_regs_len = mv88e6352_serdes_get_regs_len,
.serdes_get_regs = mv88e6352_serdes_get_regs,
+ .serdes_set_out_amplitude = mv88e6352_serdes_set_out_amplitude,
.phylink_validate = mv88e6352_phylink_validate,
};
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
index 8271b8aa7b71..d931039ee995 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.h
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
@@ -586,6 +586,9 @@ struct mv88e6xxx_ops {
void (*serdes_get_regs)(struct mv88e6xxx_chip *chip, int port,
void *_p);
+ /* SERDES SGMII/Fiber Output Amplitude */
+ int (*serdes_set_out_amplitude)(struct mv88e6xxx_chip *chip, int val);
+
/* Address Translation Unit operations */
int (*atu_get_hash)(struct mv88e6xxx_chip *chip, u8 *hash);
int (*atu_set_hash)(struct mv88e6xxx_chip *chip, u8 hash);
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index 6ea003678798..835137595de5 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -1271,6 +1271,20 @@ void mv88e6390_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p)
}
}
+int mv88e6352_serdes_set_out_amplitude(struct mv88e6xxx_chip *chip, int val)
+{
+ u16 reg;
+ int err;
+
+ err = mv88e6352_serdes_read(chip, MV88E6352_SERDES_SPEC_CTRL2, ®);
+ if (err)
+ return err;
+
+ reg = (reg & MV88E6352_SERDES_OUT_AMP_MASK) | val;
+
+ return mv88e6352_serdes_write(chip, MV88E6352_SERDES_SPEC_CTRL2, reg);
+}
+
static int mv88e6393x_serdes_port_errata(struct mv88e6xxx_chip *chip, int lane)
{
u16 reg, pcs;
diff --git a/drivers/net/dsa/mv88e6xxx/serdes.h b/drivers/net/dsa/mv88e6xxx/serdes.h
index cbb3ba30caea..71dddc65b642 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.h
+++ b/drivers/net/dsa/mv88e6xxx/serdes.h
@@ -27,6 +27,8 @@
#define MV88E6352_SERDES_INT_FIBRE_ENERGY BIT(4)
#define MV88E6352_SERDES_INT_STATUS 0x13
+#define MV88E6352_SERDES_SPEC_CTRL2 0x1a
+#define MV88E6352_SERDES_OUT_AMP_MASK 0xfffc
#define MV88E6341_PORT5_LANE 0x15
@@ -172,6 +174,8 @@ void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p);
int mv88e6390_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port);
void mv88e6390_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p);
+int mv88e6352_serdes_set_out_amplitude(struct mv88e6xxx_chip *chip, int val);
+
/* Return the (first) SERDES lane address a port is using, -errno otherwise. */
static inline int mv88e6xxx_serdes_get_lane(struct mv88e6xxx_chip *chip,
int port)
--
2.34.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
@ 2021-11-26 16:08 ` Andrew Lunn
2021-11-29 10:40 ` Holger Brunck
2021-11-26 16:12 ` Andrew Lunn
` (2 subsequent siblings)
4 siblings, 1 reply; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 16:08 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Jakub Kicinski
On Fri, Nov 26, 2021 at 04:42:48PM +0100, Holger Brunck wrote:
> This can be configured from the device tree. Add this property to the
> documentation accordingly.
> The eight different values added in the dt-bindings file correspond to
> the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> according to the datasheet.
>
> CC: Andrew Lunn <andrew@lunn.ch>
> CC: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
> ---
> .../devicetree/bindings/net/dsa/marvell.txt | 3 +++
> include/dt-bindings/net/mv-88e6xxx.h | 18 ++++++++++++++++++
> 2 files changed, 21 insertions(+)
> create mode 100644 include/dt-bindings/net/mv-88e6xxx.h
>
> diff --git a/Documentation/devicetree/bindings/net/dsa/marvell.txt b/Documentation/devicetree/bindings/net/dsa/marvell.txt
> index 2363b412410c..bff397a2dc49 100644
> --- a/Documentation/devicetree/bindings/net/dsa/marvell.txt
> +++ b/Documentation/devicetree/bindings/net/dsa/marvell.txt
> @@ -46,6 +46,9 @@ Optional properties:
> - mdio? : Container of PHYs and devices on the external MDIO
> bus. The node must contains a compatible string of
> "marvell,mv88e6xxx-mdio-external"
> +- serdes-output-amplitude: Configure the output amplitude of the serdes
> + interface.
> + serdes-output-amplitude = <MV88E6352_SERDES_OUT_AMP_210MV>;
Please make this actually millivolts, not an enum. Have the property
called serdes-output-amplitude-mv. The driver should convert from a mv
value to whatever value you need to write to the register, or return
-EINVAL.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
2021-11-26 16:08 ` [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Andrew Lunn
@ 2021-11-26 16:12 ` Andrew Lunn
2021-11-29 11:14 ` Holger Brunck
2021-11-26 18:37 ` Jakub Kicinski
2021-11-26 23:14 ` Andrew Lunn
4 siblings, 1 reply; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 16:12 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Jakub Kicinski
On Fri, Nov 26, 2021 at 04:42:48PM +0100, Holger Brunck wrote:
> This can be configured from the device tree. Add this property to the
> documentation accordingly.
> The eight different values added in the dt-bindings file correspond to
> the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> according to the datasheet.
This should probably be a port property, not a switch property. It
applies to the SERDES, and the SERDES belongs to a port. What you have
now only works because there is a single SERDES for this switch
family, but other switch families have multiple SERDESes.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
@ 2021-11-26 16:16 ` Andrew Lunn
2021-11-26 19:56 ` Marek Behún
1 sibling, 0 replies; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 16:16 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Jakub Kicinski
> + if (chip->info->ops->serdes_set_out_amplitude && np) {
> + if (!of_property_read_u32(np, "serdes-output-amplitude",
> + &out_amp)) {
> + err = mv88e6352_serdes_set_out_amplitude(chip, out_amp);
> + if (err)
> + goto unlock;
> + }
> + }
If the property is in DT, but the device does not have a
ops->serdes_set_out_amplitude(), please return -EOPNOTSUP. We want to
avoid the case somebody wrongly cut/pastes a DT fragment to a
different switch.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
` (2 preceding siblings ...)
2021-11-26 16:12 ` Andrew Lunn
@ 2021-11-26 18:37 ` Jakub Kicinski
2021-11-26 19:57 ` Jakub Kicinski
2021-11-26 23:14 ` Andrew Lunn
4 siblings, 1 reply; 15+ messages in thread
From: Jakub Kicinski @ 2021-11-26 18:37 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Andrew Lunn
On Fri, 26 Nov 2021 16:42:48 +0100 Holger Brunck wrote:
> This can be configured from the device tree. Add this property to the
> documentation accordingly.
> The eight different values added in the dt-bindings file correspond to
> the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> according to the datasheet.
>
> CC: Andrew Lunn <andrew@lunn.ch>
> CC: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
Not sure why but FWIW your patches did not show up in patchwork on in
lore. We can see Andrew's review but not the patches themselves:
https://lore.kernel.org/all/YaEIVQ6gKOSD1Vf%2F@lunn.ch/
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
2021-11-26 16:16 ` Andrew Lunn
@ 2021-11-26 19:56 ` Marek Behún
2021-11-26 20:43 ` Andrew Lunn
2021-11-29 11:17 ` Holger Brunck
1 sibling, 2 replies; 15+ messages in thread
From: Marek Behún @ 2021-11-26 19:56 UTC (permalink / raw)
To: Holger Brunck, Andrew Lunn; +Cc: netdev, Jakub Kicinski
On Fri, 26 Nov 2021 16:42:49 +0100
Holger Brunck <holger.brunck@hitachienergy.com> wrote:
> The mv88e6352, mv88e6240 and mv88e6176 have a serdes interface. This patch
> allows to configure the output swing to a desired value in the
> devicetree node of the switch.
>
> CC: Andrew Lunn <andrew@lunn.ch>
> CC: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
> ---
> drivers/net/dsa/mv88e6xxx/chip.c | 14 ++++++++++++++
> drivers/net/dsa/mv88e6xxx/chip.h | 3 +++
> drivers/net/dsa/mv88e6xxx/serdes.c | 14 ++++++++++++++
> drivers/net/dsa/mv88e6xxx/serdes.h | 4 ++++
> 4 files changed, 35 insertions(+)
>
> diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
> index f00cbf5753b9..5182128959a0 100644
> --- a/drivers/net/dsa/mv88e6xxx/chip.c
> +++ b/drivers/net/dsa/mv88e6xxx/chip.c
> @@ -3173,9 +3173,11 @@ static void mv88e6xxx_teardown(struct dsa_switch *ds)
> static int mv88e6xxx_setup(struct dsa_switch *ds)
> {
> struct mv88e6xxx_chip *chip = ds->priv;
> + struct device_node *np = chip->dev->of_node;
> u8 cmode;
> int err;
> int i;
> + int out_amp;
Reverse christmas tree please, where possible.
struct mv88e6xxx_chip *chip = ds->priv;
+ struct device_node *np = chip->dev->of_node;
+ int out_amp;
u8 cmode;
int err;
int
>
> chip->ds = ds;
> ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip);
> @@ -3292,6 +3294,15 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
> if (err)
> goto unlock;
>
> + if (chip->info->ops->serdes_set_out_amplitude && np) {
> + if (!of_property_read_u32(np, "serdes-output-amplitude",
Hmm. Andrew, why don't we use <linux/property.h> instead of
<linux/of*.h> stuff in this dirver? Is there a reason or is this just
because it wasn't converted yet?
A simple device_property_read_u32() would be better here and we
wouldn't need the np pointer.
...
> +int mv88e6352_serdes_set_out_amplitude(struct mv88e6xxx_chip *chip, int val)
> +{
> + u16 reg;
> + int err;
> +
> + err = mv88e6352_serdes_read(chip, MV88E6352_SERDES_SPEC_CTRL2, ®);
> + if (err)
> + return err;
> +
> + reg = (reg & MV88E6352_SERDES_OUT_AMP_MASK) | val;
> +
> + return mv88e6352_serdes_write(chip, MV88E6352_SERDES_SPEC_CTRL2, reg);
> +}
Is there a reason why we call this from driver probe instead of 6352's
serdes_power() ?
Marek
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 18:37 ` Jakub Kicinski
@ 2021-11-26 19:57 ` Jakub Kicinski
0 siblings, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2021-11-26 19:57 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Andrew Lunn
On Fri, 26 Nov 2021 10:37:26 -0800 Jakub Kicinski wrote:
> On Fri, 26 Nov 2021 16:42:48 +0100 Holger Brunck wrote:
> > This can be configured from the device tree. Add this property to the
> > documentation accordingly.
> > The eight different values added in the dt-bindings file correspond to
> > the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> > according to the datasheet.
> >
> > CC: Andrew Lunn <andrew@lunn.ch>
> > CC: Jakub Kicinski <kuba@kernel.org>
> > Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
>
> Not sure why but FWIW your patches did not show up in patchwork on in
> lore. We can see Andrew's review but not the patches themselves:
>
> https://lore.kernel.org/all/YaEIVQ6gKOSD1Vf%2F@lunn.ch/
Ah, they made it thru now, disregard.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 19:56 ` Marek Behún
@ 2021-11-26 20:43 ` Andrew Lunn
2021-11-26 21:13 ` Marek Behún
2021-11-29 11:17 ` Holger Brunck
1 sibling, 1 reply; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 20:43 UTC (permalink / raw)
To: Marek Behún; +Cc: Holger Brunck, netdev, Jakub Kicinski
> > + if (chip->info->ops->serdes_set_out_amplitude && np) {
> > + if (!of_property_read_u32(np, "serdes-output-amplitude",
>
> Hmm. Andrew, why don't we use <linux/property.h> instead of
> <linux/of*.h> stuff in this dirver? Is there a reason or is this just
> because it wasn't converted yet?
The problem with device_property_read is that it takes a device. But
this is not actually a device scoped property, it should be considered
a port scoped property. And the port is not a device. DSA is not
likely to convert to the device API because the device API is too
limiting.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 20:43 ` Andrew Lunn
@ 2021-11-26 21:13 ` Marek Behún
2021-11-26 21:49 ` Andrew Lunn
0 siblings, 1 reply; 15+ messages in thread
From: Marek Behún @ 2021-11-26 21:13 UTC (permalink / raw)
To: Andrew Lunn; +Cc: Holger Brunck, netdev, Jakub Kicinski
On Fri, 26 Nov 2021 21:43:45 +0100
Andrew Lunn <andrew@lunn.ch> wrote:
> > > + if (chip->info->ops->serdes_set_out_amplitude && np) {
> > > + if (!of_property_read_u32(np, "serdes-output-amplitude",
> >
> > Hmm. Andrew, why don't we use <linux/property.h> instead of
> > <linux/of*.h> stuff in this dirver? Is there a reason or is this just
> > because it wasn't converted yet?
>
> The problem with device_property_read is that it takes a device. But
> this is not actually a device scoped property, it should be considered
> a port scoped property. And the port is not a device. DSA is not
> likely to convert to the device API because the device API is too
> limiting.
You're right, device_property_read() needs a device, and this seems
like a port-specific property. But from the patch it seems Holger is
using the switch device node:
struct device_node *np = chip->dev->of_node;
so either this is wrong or he could use device_property API. Of course
that would need a complete conversion, with device_* or fwnode_*.
functions. I was wondering if device_* + fwnode_* functions are
preferred instead of of_* functions (since they can be used also with
ACPI, for example).
Marek
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 21:13 ` Marek Behún
@ 2021-11-26 21:49 ` Andrew Lunn
0 siblings, 0 replies; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 21:49 UTC (permalink / raw)
To: Marek Behún; +Cc: Holger Brunck, netdev, Jakub Kicinski
> You're right, device_property_read() needs a device, and this seems
> like a port-specific property. But from the patch it seems Holger is
> using the switch device node:
>
> struct device_node *np = chip->dev->of_node;
>
> so either this is wrong or he could use device_property API.
I already commented it should be a port property, probably to patch
1/2.
> Of course
> that would need a complete conversion, with device_* or fwnode_*.
> functions. I was wondering if device_* + fwnode_* functions are
> preferred instead of of_* functions (since they can be used also with
> ACPI, for example).
I doubt ACPI is ever going to happen for DSA. Despite the A in ACPI,
ACPI is for simple hardware, server and desktop like hardware.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
` (3 preceding siblings ...)
2021-11-26 18:37 ` Jakub Kicinski
@ 2021-11-26 23:14 ` Andrew Lunn
4 siblings, 0 replies; 15+ messages in thread
From: Andrew Lunn @ 2021-11-26 23:14 UTC (permalink / raw)
To: Holger Brunck; +Cc: netdev, Jakub Kicinski
> @@ -46,6 +46,9 @@ Optional properties:
> - mdio? : Container of PHYs and devices on the external MDIO
> bus. The node must contains a compatible string of
> "marvell,mv88e6xxx-mdio-external"
> +- serdes-output-amplitude: Configure the output amplitude of the serdes
> + interface.
> + serdes-output-amplitude = <MV88E6352_SERDES_OUT_AMP_210MV>;
I checked a couple of Marvell PHY datasheets. The 1510, 1512, and 1518
have the exact same register/bits. So ideally we want DT property name
which somebody can later reuse in the Marvell PHY
driver. serdes-output-amplitude-mv seems O.K. for that.
Andrew
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 16:08 ` [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Andrew Lunn
@ 2021-11-29 10:40 ` Holger Brunck
0 siblings, 0 replies; 15+ messages in thread
From: Holger Brunck @ 2021-11-29 10:40 UTC (permalink / raw)
To: Andrew Lunn; +Cc: netdev, Jakub Kicinski, Marek Behún
> On Fri, Nov 26, 2021 at 04:42:48PM +0100, Holger Brunck wrote:
> > This can be configured from the device tree. Add this property to the
> > documentation accordingly.
> > The eight different values added in the dt-bindings file correspond to
> > the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> > according to the datasheet.
> >
> > CC: Andrew Lunn <andrew@lunn.ch>
> > CC: Jakub Kicinski <kuba@kernel.org>
> > Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
> > ---
> > .../devicetree/bindings/net/dsa/marvell.txt | 3 +++
> > include/dt-bindings/net/mv-88e6xxx.h | 18 ++++++++++++++++++
> > 2 files changed, 21 insertions(+)
> > create mode 100644 include/dt-bindings/net/mv-88e6xxx.h
> >
> > diff --git a/Documentation/devicetree/bindings/net/dsa/marvell.txt
> > b/Documentation/devicetree/bindings/net/dsa/marvell.txt
> > index 2363b412410c..bff397a2dc49 100644
> > --- a/Documentation/devicetree/bindings/net/dsa/marvell.txt
> > +++ b/Documentation/devicetree/bindings/net/dsa/marvell.txt
> > @@ -46,6 +46,9 @@ Optional properties:
> > - mdio? : Container of PHYs and devices on the external MDIO
> > bus. The node must contains a compatible string of
> > "marvell,mv88e6xxx-mdio-external"
> > +- serdes-output-amplitude: Configure the output amplitude of the serdes
> > + interface.
> > + serdes-output-amplitude = <MV88E6352_SERDES_OUT_AMP_210MV>;
>
> Please make this actually millivolts, not an enum. Have the property called
> serdes-output-amplitude-mv. The driver should convert from a mv value to
> whatever value you need to write to the register, or return -EINVAL.
>
ok I will change that.
Best regards
Holger
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt
2021-11-26 16:12 ` Andrew Lunn
@ 2021-11-29 11:14 ` Holger Brunck
0 siblings, 0 replies; 15+ messages in thread
From: Holger Brunck @ 2021-11-29 11:14 UTC (permalink / raw)
To: Andrew Lunn; +Cc: netdev, Jakub Kicinski, Marek Behún
>
> On Fri, Nov 26, 2021 at 04:42:48PM +0100, Holger Brunck wrote:
> > This can be configured from the device tree. Add this property to the
> > documentation accordingly.
> > The eight different values added in the dt-bindings file correspond to
> > the values we can configure on 88E6352, 88E6240 and 88E6176 switches
> > according to the datasheet.
>
> This should probably be a port property, not a switch property. It applies to the
> SERDES, and the SERDES belongs to a port. What you have now only works
> because there is a single SERDES for this switch family, but other switch families
> have multiple SERDESes.
>
yes you are right it is more a port property. So I will try to parse the DT node for
the port and add the property there. But in this case I need to double check that
the specific port is the one supporting this feature. Not sure yet how to do that,
I need to check. Also I will move the parsing out of mv88e6xxx_setup to
mv88e6xxx_setup_port then.
Best regards
Holger
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable
2021-11-26 19:56 ` Marek Behún
2021-11-26 20:43 ` Andrew Lunn
@ 2021-11-29 11:17 ` Holger Brunck
1 sibling, 0 replies; 15+ messages in thread
From: Holger Brunck @ 2021-11-29 11:17 UTC (permalink / raw)
To: Marek Behún, Andrew Lunn; +Cc: netdev, Jakub Kicinski
> > The mv88e6352, mv88e6240 and mv88e6176 have a serdes interface. This
> > patch allows to configure the output swing to a desired value in the
> > devicetree node of the switch.
> >
> > CC: Andrew Lunn <andrew@lunn.ch>
> > CC: Jakub Kicinski <kuba@kernel.org>
> > Signed-off-by: Holger Brunck <holger.brunck@hitachienergy.com>
> > ---
> > drivers/net/dsa/mv88e6xxx/chip.c | 14 ++++++++++++++
> > drivers/net/dsa/mv88e6xxx/chip.h | 3 +++
> > drivers/net/dsa/mv88e6xxx/serdes.c | 14 ++++++++++++++
> > drivers/net/dsa/mv88e6xxx/serdes.h | 4 ++++
> > 4 files changed, 35 insertions(+)
> >
> > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c
> > b/drivers/net/dsa/mv88e6xxx/chip.c
> > index f00cbf5753b9..5182128959a0 100644
> > --- a/drivers/net/dsa/mv88e6xxx/chip.c
> > +++ b/drivers/net/dsa/mv88e6xxx/chip.c
> > @@ -3173,9 +3173,11 @@ static void mv88e6xxx_teardown(struct
> > dsa_switch *ds) static int mv88e6xxx_setup(struct dsa_switch *ds) {
> > struct mv88e6xxx_chip *chip = ds->priv;
> > + struct device_node *np = chip->dev->of_node;
> > u8 cmode;
> > int err;
> > int i;
> > + int out_amp;
>
> Reverse christmas tree please, where possible.
>
> struct mv88e6xxx_chip *chip = ds->priv;
> + struct device_node *np = chip->dev->of_node;
> + int out_amp;
> u8 cmode;
> int err;
> int
>
ok.
> >
> > chip->ds = ds;
> > ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip); @@ -3292,6
> > +3294,15 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
> > if (err)
> > goto unlock;
> >
> > + if (chip->info->ops->serdes_set_out_amplitude && np) {
> > + if (!of_property_read_u32(np, "serdes-output-amplitude",
>
> Hmm. Andrew, why don't we use <linux/property.h> instead of <linux/of*.h>
> stuff in this dirver? Is there a reason or is this just because it wasn't converted
> yet?
>
> A simple device_property_read_u32() would be better here and we wouldn't
> need the np pointer.
>
> ...
>
> > +int mv88e6352_serdes_set_out_amplitude(struct mv88e6xxx_chip *chip,
> > +int val) {
> > + u16 reg;
> > + int err;
> > +
> > + err = mv88e6352_serdes_read(chip, MV88E6352_SERDES_SPEC_CTRL2,
> ®);
> > + if (err)
> > + return err;
> > +
> > + reg = (reg & MV88E6352_SERDES_OUT_AMP_MASK) | val;
> > +
> > + return mv88e6352_serdes_write(chip, MV88E6352_SERDES_SPEC_CTRL2,
> > +reg); }
>
> Is there a reason why we call this from driver probe instead of 6352's
> serdes_power() ?
>
serdes_power is always called for enable and disable. It should be better to configure
it only once. But I agree that it should be moved from chip_probe to port_setup.
Best regards
Holger
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2021-11-29 11:20 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-26 15:42 [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Holger Brunck
2021-11-26 15:42 ` [PATCH 2/2] dsa: mv88e6xxx: make serdes SGMII/Fiber output amplitude configurable Holger Brunck
2021-11-26 16:16 ` Andrew Lunn
2021-11-26 19:56 ` Marek Behún
2021-11-26 20:43 ` Andrew Lunn
2021-11-26 21:13 ` Marek Behún
2021-11-26 21:49 ` Andrew Lunn
2021-11-29 11:17 ` Holger Brunck
2021-11-26 16:08 ` [PATCH 1/2] Docs/devicetree: add serdes-output-amplitude to marvell.txt Andrew Lunn
2021-11-29 10:40 ` Holger Brunck
2021-11-26 16:12 ` Andrew Lunn
2021-11-29 11:14 ` Holger Brunck
2021-11-26 18:37 ` Jakub Kicinski
2021-11-26 19:57 ` Jakub Kicinski
2021-11-26 23:14 ` Andrew Lunn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.