]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: dsa: mv88e6xxx: workaround RGMII transmit delay erratum for 6320 family
authorMarek Behún <kabel@kernel.org>
Mon, 17 Mar 2025 17:32:50 +0000 (18:32 +0100)
committerJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 22:05:36 +0000 (15:05 -0700)
Implement the workaround for erratum
  3.3 RGMII timing may be out of spec when transmit delay is enabled
for the 6320 family, which says:

  When transmit delay is enabled via Port register 1 bit 14 = 1, duty
  cycle may be out of spec. Under very rare conditions this may cause
  the attached device receive CRC errors.

Signed-off-by: Marek Behún <kabel@kernel.org>
Cc: <stable@vger.kernel.org> # 5.4.x
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250317173250.28780-8-kabel@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/mv88e6xxx/chip.c

index 88f479dc328ce13a523756c14cd6a5eb6f562d4a..901929f96b380ae868f01014e0afd9c90506acad 100644 (file)
@@ -3674,6 +3674,21 @@ static int mv88e6xxx_stats_setup(struct mv88e6xxx_chip *chip)
        return mv88e6xxx_g1_stats_clear(chip);
 }
 
+static int mv88e6320_setup_errata(struct mv88e6xxx_chip *chip)
+{
+       u16 dummy;
+       int err;
+
+       /* Workaround for erratum
+        *   3.3 RGMII timing may be out of spec when transmit delay is enabled
+        */
+       err = mv88e6xxx_port_hidden_write(chip, 0, 0xf, 0x7, 0xe000);
+       if (err)
+               return err;
+
+       return mv88e6xxx_port_hidden_read(chip, 0, 0xf, 0x7, &dummy);
+}
+
 /* Check if the errata has already been applied. */
 static bool mv88e6390_setup_errata_applied(struct mv88e6xxx_chip *chip)
 {
@@ -5130,6 +5145,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
 
 static const struct mv88e6xxx_ops mv88e6320_ops = {
        /* MV88E6XXX_FAMILY_6320 */
+       .setup_errata = mv88e6320_setup_errata,
        .ieee_pri_map = mv88e6085_g1_ieee_pri_map,
        .ip_pri_map = mv88e6085_g1_ip_pri_map,
        .irl_init_all = mv88e6352_g2_irl_init_all,
@@ -5182,6 +5198,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
 
 static const struct mv88e6xxx_ops mv88e6321_ops = {
        /* MV88E6XXX_FAMILY_6320 */
+       .setup_errata = mv88e6320_setup_errata,
        .ieee_pri_map = mv88e6085_g1_ieee_pri_map,
        .ip_pri_map = mv88e6085_g1_ip_pri_map,
        .irl_init_all = mv88e6352_g2_irl_init_all,