diff mbox series

[net-next] net: dsa: mv88e6xxx: Add erratum 3.14 for 88E6390X and 88E6190X

Message ID 20230714114717.18921-1-ante.knezic@helmholz.de (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next] net: dsa: mv88e6xxx: Add erratum 3.14 for 88E6390X and 88E6190X | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/apply fail Patch does not apply to net-next

Commit Message

Ante Knezic July 14, 2023, 11:47 a.m. UTC
Fixes XAUI/RXAUI lane alignment errors.
Issue causes dropped packets when trying to communicate over
fiber via SERDES lanes of port 9 and 10.

Signed-off-by: Ante Knezic <ante.knezic@helmholz.de>
---
 drivers/net/dsa/mv88e6xxx/serdes.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

Comments

Andrew Lunn July 14, 2023, 1:28 p.m. UTC | #1
> +static int mv88e6390x_serdes_erratum_3_14(struct mv88e6xxx_chip *chip)
> +{
> +	int lanes[] = { MV88E6390_PORT9_LANE0, MV88E6390_PORT9_LANE1,
> +		MV88E6390_PORT9_LANE2, MV88E6390_PORT9_LANE3,
> +		MV88E6390_PORT10_LANE0, MV88E6390_PORT10_LANE1,
> +		MV88E6390_PORT10_LANE2, MV88E6390_PORT10_LANE3 };

Please make this const. Otherwise you end up with two copies of it.

> +	int err, i;
> +
> +	/* 88e6390x-88e6190x errata 3.14:
> +	 * After chip reset, SERDES reconfiguration or SERDES core
> +	 * Software Reset, the SERDES lanes may not be properly aligned
> +	 * resulting in CRC errors
> +	 */
> +
> +	for (i = 0; i < ARRAY_SIZE(lanes); i++) {
> +		err = mv88e6390_serdes_write(chip, lanes[i],
> +					     MDIO_MMD_PHYXS,
> +					     0xf054, 0x400C);

Does Marvell give this register a name? If so, please add a #define.
Are the bits in the register documented?

> +	if (!err && up) {
> +		if (chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6390X ||
> +		    chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6190X)

6191X? 6193X? 

Please sort these into numerical order.


    Andrew

---
pw-bot: cr
Ante Knezic July 14, 2023, 2:36 p.m. UTC | #2
>> +static int mv88e6390x_serdes_erratum_3_14(struct mv88e6xxx_chip *chip)
>> +{
>> +     int lanes[] = { MV88E6390_PORT9_LANE0, MV88E6390_PORT9_LANE1,
>> +             MV88E6390_PORT9_LANE2, MV88E6390_PORT9_LANE3,
>> +             MV88E6390_PORT10_LANE0, MV88E6390_PORT10_LANE1,
>> +             MV88E6390_PORT10_LANE2, MV88E6390_PORT10_LANE3 };

>Please make this const. Otherwise you end up with two copies of it.

will do. 

>> +     int err, i;
>> +
>> +     /* 88e6390x-88e6190x errata 3.14:
>> +      * After chip reset, SERDES reconfiguration or SERDES core
>> +      * Software Reset, the SERDES lanes may not be properly aligned
>> +      * resulting in CRC errors
>> +      */
>> +
>> +     for (i = 0; i < ARRAY_SIZE(lanes); i++) {
>> +             err = mv88e6390_serdes_write(chip, lanes[i],
>> +                                          MDIO_MMD_PHYXS,
>> +                                          0xf054, 0x400C);

>Does Marvell give this register a name? If so, please add a #define.
>Are the bits in the register documented?

Unfortunately, no. This is one of those undocumented registers. I will
make a note of it in the commit message.

>> +     if (!err && up) {
>> +             if (chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6390X ||
>> +                 chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6190X)

>6191X? 6193X?

Errata I have available refers only to 6190x and 6390x. Not sure about other devices.

>Please sort these into numerical order.

will do.
Andrew Lunn July 14, 2023, 2:44 p.m. UTC | #3
> >Does Marvell give this register a name? If so, please add a #define.
> >Are the bits in the register documented?
> 
> Unfortunately, no. This is one of those undocumented registers. I will
> make a note of it in the commit message.

Undocumented magic is typical for Marvell Erratas.

> 
> >> +     if (!err && up) {
> >> +             if (chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6390X ||
> >> +                 chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6190X)
> 
> >6191X? 6193X?
> 
> Errata I have available refers only to 6190x and 6390x. Not sure about other devices.

Please mention this in the commit message.

Thanks
	Andrew
diff mbox series

Patch

diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c
index 80167d53212f..a8340b300c92 100644
--- a/drivers/net/dsa/mv88e6xxx/serdes.c
+++ b/drivers/net/dsa/mv88e6xxx/serdes.c
@@ -829,6 +829,37 @@  static int mv88e6390_serdes_enable_checker(struct mv88e6xxx_chip *chip, int lane
 				      MV88E6390_PG_CONTROL, reg);
 }
 
+static int mv88e6390x_serdes_erratum_3_14(struct mv88e6xxx_chip *chip)
+{
+	int lanes[] = { MV88E6390_PORT9_LANE0, MV88E6390_PORT9_LANE1,
+		MV88E6390_PORT9_LANE2, MV88E6390_PORT9_LANE3,
+		MV88E6390_PORT10_LANE0, MV88E6390_PORT10_LANE1,
+		MV88E6390_PORT10_LANE2, MV88E6390_PORT10_LANE3 };
+	int err, i;
+
+	/* 88e6390x-88e6190x errata 3.14:
+	 * After chip reset, SERDES reconfiguration or SERDES core
+	 * Software Reset, the SERDES lanes may not be properly aligned
+	 * resulting in CRC errors
+	 */
+
+	for (i = 0; i < ARRAY_SIZE(lanes); i++) {
+		err = mv88e6390_serdes_write(chip, lanes[i],
+					     MDIO_MMD_PHYXS,
+					     0xf054, 0x400C);
+		if (err)
+			return err;
+
+		err = mv88e6390_serdes_write(chip, lanes[i],
+					     MDIO_MMD_PHYXS,
+					     0xf054, 0x4000);
+		if (err)
+			return err;
+	}
+
+	return 0;
+}
+
 int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
 			   bool up)
 {
@@ -853,6 +884,12 @@  int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
 	if (!err && up)
 		err = mv88e6390_serdes_enable_checker(chip, lane);
 
+	if (!err && up) {
+		if (chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6390X ||
+		    chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6190X)
+			err = mv88e6390x_serdes_erratum_3_14(chip);
+	}
+
 	return err;
 }