Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: d0dec3333040 ("net: dsa: microchip: Add register access control for KSZ8873 chip")
Signed-off-by: Tristram Ha <tristram.ha@microchip.com>
Reviewed-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://patch.msgid.link/20250807005453.8306-1-Tristram.Ha@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Tristram Ha and committed by
Jakub Kicinski
829f45f9 fd60d8a0

+12 -9
+11 -9
drivers/net/dsa/microchip/ksz8.c
··· 36 36 37 37 static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set) 38 38 { 39 - regmap_update_bits(ksz_regmap_8(dev), addr, bits, set ? bits : 0); 39 + ksz_rmw8(dev, addr, bits, set ? bits : 0); 40 40 } 41 41 42 42 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits, 43 43 bool set) 44 44 { 45 - regmap_update_bits(ksz_regmap_8(dev), 46 - dev->dev_ops->get_port_addr(port, offset), 47 - bits, set ? bits : 0); 45 + ksz_rmw8(dev, dev->dev_ops->get_port_addr(port, offset), bits, 46 + set ? bits : 0); 48 47 } 49 48 50 49 /** ··· 1954 1955 ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true); 1955 1956 1956 1957 /* Enable aggressive back off algorithm in half duplex mode. */ 1957 - regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_1, 1958 - SW_AGGR_BACKOFF, SW_AGGR_BACKOFF); 1958 + ret = ksz_rmw8(dev, REG_SW_CTRL_1, SW_AGGR_BACKOFF, SW_AGGR_BACKOFF); 1959 + if (ret) 1960 + return ret; 1959 1961 1960 1962 /* 1961 1963 * Make sure unicast VLAN boundary is set as default and 1962 1964 * enable no excessive collision drop. 1963 1965 */ 1964 - regmap_update_bits(ksz_regmap_8(dev), REG_SW_CTRL_2, 1965 - UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP, 1966 - UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP); 1966 + ret = ksz_rmw8(dev, REG_SW_CTRL_2, 1967 + UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP, 1968 + UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP); 1969 + if (ret) 1970 + return ret; 1967 1971 1968 1972 ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false); 1969 1973
+1
drivers/net/dsa/microchip/ksz_common.c
··· 1447 1447 regmap_reg_range(0x3f, 0x3f), 1448 1448 1449 1449 /* advanced control registers */ 1450 + regmap_reg_range(0x43, 0x43), 1450 1451 regmap_reg_range(0x60, 0x6f), 1451 1452 regmap_reg_range(0x70, 0x75), 1452 1453 regmap_reg_range(0x76, 0x78),