Commit 829f45f9 authored by Tristram Ha's avatar Tristram Ha Committed by Jakub Kicinski
Browse files

net: dsa: microchip: Fix KSZ8863 reset problem



ksz8873_valid_regs[] was added for register access for KSZ8863/KSZ8873
switches, but the reset register is not in the list so
ksz8_reset_switch() does not take any effect.

Replace regmap_update_bits() using ksz_regmap_8 with ksz_rmw8() so that
an error message will be given if the register is not defined.

A side effect of not resetting the switch is the static MAC table is not
cleared.  Further additions to the table will show write error as there
are only 8 entries in the table.

Fixes: d0dec333 ("net: dsa: microchip: Add register access control for KSZ8873 chip")
Signed-off-by: default avatarTristram Ha <tristram.ha@microchip.com>
Reviewed-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20250807005453.8306-1-Tristram.Ha@microchip.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent fd60d8a0
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -36,15 +36,14 @@

static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
{
	regmap_update_bits(ksz_regmap_8(dev), addr, bits, set ? bits : 0);
	ksz_rmw8(dev, addr, bits, set ? bits : 0);
}

static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
			 bool set)
{
	regmap_update_bits(ksz_regmap_8(dev),
			   dev->dev_ops->get_port_addr(port, offset),
			   bits, set ? bits : 0);
	ksz_rmw8(dev, dev->dev_ops->get_port_addr(port, offset), bits,
		 set ? bits : 0);
}

/**
@@ -1955,16 +1954,19 @@ int ksz8_setup(struct dsa_switch *ds)
	ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true);

	/* Enable aggressive back off algorithm in half duplex mode. */
	regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_1,
			   SW_AGGR_BACKOFF, SW_AGGR_BACKOFF);
	ret = ksz_rmw8(dev, REG_SW_CTRL_1, SW_AGGR_BACKOFF, SW_AGGR_BACKOFF);
	if (ret)
		return ret;

	/*
	 * Make sure unicast VLAN boundary is set as default and
	 * enable no excessive collision drop.
	 */
	regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_2,
	ret = ksz_rmw8(dev, REG_SW_CTRL_2,
		       UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP,
		       UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP);
	if (ret)
		return ret;

	ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false);

+1 −0
Original line number Diff line number Diff line
@@ -1447,6 +1447,7 @@ static const struct regmap_range ksz8873_valid_regs[] = {
	regmap_reg_range(0x3f, 0x3f),

	/* advanced control registers */
	regmap_reg_range(0x43, 0x43),
	regmap_reg_range(0x60, 0x6f),
	regmap_reg_range(0x70, 0x75),
	regmap_reg_range(0x76, 0x78),