Commit 1ebc8e1e authored by Marek Behún's avatar Marek Behún Committed by Jakub Kicinski
Browse files

net: dsa: mv88e6xxx: workaround RGMII transmit delay erratum for 6320 family



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: default avatarMarek Behún <kabel@kernel.org>
Cc: <stable@vger.kernel.org> # 5.4.x
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250317173250.28780-8-kabel@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 52fdc41c
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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,