2024-02-26 09:49:37

by Steffen Bätz

[permalink] [raw]
Subject: [PATCH net 1/2] net: dsa: mv88e6xxx: fix marvell 6320/21 switch probing

As of commit de5c9bf40c45 ("net: phylink: require supported_interfaces to
be filled")
Marvell 88e6320/21 switches fail to be probed:

..
mv88e6085 30be0000.ethernet-1:00: phylink: error: empty supported_interfaces
error creating PHYLINK: -22
..

The problem stems from the use of mv88e6185_phylink_get_caps() to get
the device capabilities. Create a new dedicated phylink_get_caps for the
6320 and 6321 to properly support their set of capabilities.

Fixes: de5c9bf40c45 ("net: phylink: require supported_interfaces to be filled")
Signed-off-by: Steffen Bätz <[email protected]>
---
drivers/net/dsa/mv88e6xxx/chip.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 9caecb4dfbfa..32b927b7c221 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -649,6 +649,19 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
}
}

+static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
+ struct phylink_config *config)
+{
+ unsigned long *supported = config->supported_interfaces;
+ int err, cmode;
+
+ /* Translate the default cmode */
+ mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
+
+ config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
+ MAC_1000FD;
+}
+
static void mv88e6341_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
struct phylink_config *config)
{
@@ -5042,7 +5055,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6352_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
- .phylink_get_caps = mv88e6185_phylink_get_caps,
+ .phylink_get_caps = mv88e632x_phylink_get_caps,
};

static const struct mv88e6xxx_ops mv88e6321_ops = {
@@ -5088,7 +5101,7 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
.gpio_ops = &mv88e6352_gpio_ops,
.avb_ops = &mv88e6352_avb_ops,
.ptp_ops = &mv88e6352_ptp_ops,
- .phylink_get_caps = mv88e6185_phylink_get_caps,
+ .phylink_get_caps = mv88e632x_phylink_get_caps,
};

static const struct mv88e6xxx_ops mv88e6341_ops = {
--
2.34.1


--


*innosonix GmbH*
Hauptstr. 35
96482 Ahorn
central: +49 9561 7459980
http://www.innosonix.de <http://www.innosonix.de>

innosonix GmbH
Geschäftsführer:
Markus Bätz, Steffen Bätz
USt.-IdNr / VAT-Nr.: DE266020313
EORI-Nr.:
DE240121536680271
HRB 5192 Coburg
WEEE-Reg.-Nr. DE88021242

--



2024-02-26 09:59:33

by Russell King (Oracle)

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: dsa: mv88e6xxx: fix marvell 6320/21 switch probing

On Mon, Feb 26, 2024 at 10:13:23AM +0100, Steffen B?tz wrote:
> @@ -649,6 +649,19 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
> }
> }
>
> +static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
> + struct phylink_config *config)
> +{
> + unsigned long *supported = config->supported_interfaces;
> + int err, cmode;
> +
> + /* Translate the default cmode */
> + mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
> +
> + config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
> + MAC_1000FD;
> +}
> +

This looks identical to mv88e6351_phylink_get_caps(). Would that work
for you instead?

Thanks.

--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

2024-02-26 13:23:50

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: dsa: mv88e6xxx: fix marvell 6320/21 switch probing

On Mon, Feb 26, 2024 at 10:13:23AM +0100, Steffen B?tz wrote:
> As of commit de5c9bf40c45 ("net: phylink: require supported_interfaces to
> be filled")
> Marvell 88e6320/21 switches fail to be probed:
>
> ...
> mv88e6085 30be0000.ethernet-1:00: phylink: error: empty supported_interfaces
> error creating PHYLINK: -22
> ...
>
> The problem stems from the use of mv88e6185_phylink_get_caps() to get
> the device capabilities. Create a new dedicated phylink_get_caps for the
> 6320 and 6321 to properly support their set of capabilities.
>
> Fixes: de5c9bf40c45 ("net: phylink: require supported_interfaces to be filled")
> Signed-off-by: Steffen B?tz <[email protected]>

Reviewed-by: Andrew Lunn <[email protected]>

Andrew

2024-02-27 11:36:20

by Fabio Estevam

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: dsa: mv88e6xxx: fix marvell 6320/21 switch probing

Hi Steffen,

On Mon, Feb 26, 2024 at 6:15 AM Steffen Bätz <[email protected]> wrote:
>
> As of commit de5c9bf40c45 ("net: phylink: require supported_interfaces to
> be filled")
> Marvell 88e6320/21 switches fail to be probed:
>
> ...
> mv88e6085 30be0000.ethernet-1:00: phylink: error: empty supported_interfaces
> error creating PHYLINK: -22
> ...
>
> The problem stems from the use of mv88e6185_phylink_get_caps() to get
> the device capabilities. Create a new dedicated phylink_get_caps for the
> 6320 and 6321 to properly support their set of capabilities.
>
> Fixes: de5c9bf40c45 ("net: phylink: require supported_interfaces to be filled")
> Signed-off-by: Steffen Bätz <[email protected]>

Thanks for the fix.

Reviewed-by: Fabio Estevam <[email protected]>

2024-02-28 02:21:43

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net 1/2] net: dsa: mv88e6xxx: fix marvell 6320/21 switch probing

On Mon, 26 Feb 2024 10:13:23 +0100 Steffen Bätz wrote:
> +static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
> + struct phylink_config *config)
> +{
> + unsigned long *supported = config->supported_interfaces;
> + int err, cmode;

err and cmode are unused in this patch, please move cmode addition
to patch 2 and drop err which appears to remain unused after patch 2.
--
pw-bot: cr

2024-02-26 09:51:35

by Steffen Bätz

[permalink] [raw]
Subject: [PATCH net 2/2] net: dsa: mv88e6xxx: 6320/21 read cmode on serdes ports

On the mv88e6320 and 6321 switch family, port 0/1 are serdes only ports.
Modified the mv88e6352_get_port4_serdes_cmode function to pass a port
number since the register set of the 6352 is equal on the 6320/21 families.

Signed-off-by: Steffen Bätz <[email protected]>
---
drivers/net/dsa/mv88e6xxx/chip.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 32b927b7c221..2d7361852d7e 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -589,12 +589,12 @@ static void mv88e6351_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
MAC_1000FD;
}

-static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
+static int mv88e63xx_get_port_serdes_cmode(struct mv88e6xxx_chip *chip, int port)
{
u16 reg, val;
int err;

- err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, &reg);
+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
if (err)
return err;

@@ -603,16 +603,16 @@ static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
return 0xf;

val = reg & ~MV88E6XXX_PORT_STS_PHY_DETECT;
- err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, val);
+ err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, val);
if (err)
return err;

- err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, &val);
+ err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &val);
if (err)
return err;

/* Restore PHY_DETECT value */
- err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, reg);
+ err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
if (err)
return err;

@@ -640,7 +640,7 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
if (err <= 0)
return;

- cmode = mv88e6352_get_port4_serdes_cmode(chip);
+ cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
if (cmode < 0)
dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
port);
@@ -660,6 +660,16 @@ static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,

config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
MAC_1000FD;
+
+ /* Port 0/1 are serdes only ports */
+ if (port == 0 || port == 1) {
+ cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
+ if (cmode < 0)
+ dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
+ port);
+ else
+ mv88e6xxx_translate_cmode(cmode, supported);
+ }
}

static void mv88e6341_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
--
2.34.1


--


*innosonix GmbH*
Hauptstr. 35
96482 Ahorn
central: +49 9561 7459980
http://www.innosonix.de <http://www.innosonix.de>

innosonix GmbH
Geschäftsführer:
Markus Bätz, Steffen Bätz
USt.-IdNr / VAT-Nr.: DE266020313
EORI-Nr.:
DE240121536680271
HRB 5192 Coburg
WEEE-Reg.-Nr. DE88021242

--