]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: dsa: microchip: fix initial port flush problem
authorTristram Ha <tristram.ha@microchip.com>
Wed, 19 Jun 2024 00:16:42 +0000 (17:16 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:37:51 +0000 (09:37 +0200)
[ Upstream commit ad53f5f54f351e967128edbc431f0f26427172cf ]

The very first flush in any port will flush all learned addresses in all
ports.  This can be observed by unplugging the cable from one port while
additional ports are connected and dumping the fdb entries.

This problem is caused by the initially wrong value programmed to the
REG_SW_LUE_CTRL_1 register.  Setting SW_FLUSH_STP_TABLE and
SW_FLUSH_MSTP_TABLE bits does not have an immediate effect.  It is when
ksz9477_flush_dyn_mac_table() is called then the SW_FLUSH_STP_TABLE bit
takes effect and flushes all learned entries.  After that call both bits
are reset and so the next port flush will not cause such problem again.

Fixes: b987e98e50ab ("dsa: add DSA switch driver for Microchip KSZ9477")
Signed-off-by: Tristram Ha <tristram.ha@microchip.com>
Link: https://patch.msgid.link/1718756202-2731-1-git-send-email-Tristram.Ha@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/dsa/microchip/ksz9477.c

index 7f745628c84d13b07fb69bfa906cf380cb90ea95..05767d3025f77e850842d0faff240ecf18df382c 100644 (file)
@@ -355,10 +355,8 @@ int ksz9477_reset_switch(struct ksz_device *dev)
                           SPI_AUTO_EDGE_DETECTION, 0);
 
        /* default configuration */
-       ksz_read8(dev, REG_SW_LUE_CTRL_1, &data8);
-       data8 = SW_AGING_ENABLE | SW_LINK_AUTO_AGING |
-             SW_SRC_ADDR_FILTER | SW_FLUSH_STP_TABLE | SW_FLUSH_MSTP_TABLE;
-       ksz_write8(dev, REG_SW_LUE_CTRL_1, data8);
+       ksz_write8(dev, REG_SW_LUE_CTRL_1,
+                  SW_AGING_ENABLE | SW_LINK_AUTO_AGING | SW_SRC_ADDR_FILTER);
 
        /* disable interrupts */
        ksz_write32(dev, REG_SW_INT_MASK__4, SWITCH_INT_MASK);