]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: dsa: enrich stp_get() return value
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Tue, 13 Jan 2026 12:41:52 +0000 (13:41 +0100)
committerHauke Mehrtens <hauke@hauke-m.de>
Wed, 21 Jan 2026 21:54:46 +0000 (22:54 +0100)
The family specific stp_get() functions have a new return value
that gives the stp status of a given port. Instead of a constant
zero value provide the real data.

While we are here align the RTL930x implementation with the
other ones.

- Drop the debug output
- Make use of priv->r->tbl_access_data_0()

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/21527
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c

index 37a782b5e1ddd8f112c4d1ea1134cd078703bfd5..243609367464b3d2f228bacd797a4627f56e2cd0 100644 (file)
@@ -564,16 +564,18 @@ static void rtl838x_set_static_move_action(int port, bool forward)
 
 static int rtldsa_838x_stp_get(struct rtl838x_switch_priv *priv, u16 msti, int port, u32 port_state[])
 {
+       int idx = 1 - (port / 16);
+       int bit = 2 * (port % 16);
        u32 cmd = 1 << 15 | /* Execute cmd */
                  1 << 14 | /* Read */
                  2 << 12 | /* Table type 0b10 */
                  (msti & 0xfff);
-       priv->r->exec_tbl0_cmd(cmd);
 
+       priv->r->exec_tbl0_cmd(cmd);
        for (int i = 0; i < 2; i++)
                port_state[i] = sw_r32(priv->r->tbl_access_data_0(i));
 
-       return 0;
+       return (port_state[idx] >> bit) & 3;
 }
 
 static void rtl838x_stp_set(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[])
index 18b3065f549a68db3810d5b57710dffd6778df16..7d3152d5b081e141ee3f0236146b16b055fbd3b3 100644 (file)
@@ -655,16 +655,18 @@ void rtl839x_vlan_profile_dump(int profile)
 
 static int rtldsa_839x_stp_get(struct rtl838x_switch_priv *priv, u16 msti, int port, u32 port_state[])
 {
+       int idx = 3 - ((port + 12) / 16);
+       int bit = 2 * ((port + 12) % 16);
        u32 cmd = 1 << 16 | /* Execute cmd */
                  0 << 15 | /* Read */
                  5 << 12 | /* Table type 0b101 */
                  (msti & 0xfff);
-       priv->r->exec_tbl0_cmd(cmd);
 
+       priv->r->exec_tbl0_cmd(cmd);
        for (int i = 0; i < 4; i++)
                port_state[i] = sw_r32(priv->r->tbl_access_data_0(i));
 
-       return 0;
+       return (port_state[idx] >> bit) & 3;
 }
 
 static void rtl839x_stp_set(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[])
index 55c78ba54d815c890a042228480833691f3ef3fe..fbf21c07ca005067e86fb00a82188a68e37be114 100644 (file)
@@ -404,17 +404,18 @@ static void rtldsa_930x_enable_flood(int port, bool enable)
 
 static int rtldsa_930x_stp_get(struct rtl838x_switch_priv *priv, u16 msti, int port, u32 port_state[])
 {
+       int idx = 1 - ((port + 3) / 16);
+       int bit = 2 * ((port + 3) % 16);
        u32 cmd = 1 << 17 | /* Execute cmd */
                  0 << 16 | /* Read */
                  4 << 12 | /* Table type 0b10 */
                  (msti & 0xfff);
-       priv->r->exec_tbl0_cmd(cmd);
 
+       priv->r->exec_tbl0_cmd(cmd);
        for (int i = 0; i < 2; i++)
-               port_state[i] = sw_r32(RTL930X_TBL_ACCESS_DATA_0(i));
-       pr_debug("MSTI: %d STATE: %08x, %08x\n", msti, port_state[0], port_state[1]);
+               port_state[i] = sw_r32(priv->r->tbl_access_data_0(i));
 
-       return 0;
+       return (port_state[idx] >> bit) & 3;
 }
 
 static void rtl930x_stp_set(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[])
index e815eec10b23b50bb1e7aebc309b3bf81bbfc673..1a3b9858d50696d9a969f13b9fbb2527c7cd5fe0 100644 (file)
@@ -158,16 +158,18 @@ static void rtl931x_vlan_profile_dump(int index)
 
 static int rtldsa_931x_stp_get(struct rtl838x_switch_priv *priv, u16 msti, int port, u32 port_state[])
 {
+       int idx = 3 - ((port + 8) / 16);
+       int bit = 2 * ((port + 8) % 16);
        u32 cmd = 1 << 20 | /* Execute cmd */
                  0 << 19 | /* Read */
                  5 << 15 | /* Table type 0b101 */
                  (msti & 0x3fff);
-       priv->r->exec_tbl0_cmd(cmd);
 
+       priv->r->exec_tbl0_cmd(cmd);
        for (int i = 0; i < 4; i++)
                port_state[i] = sw_r32(priv->r->tbl_access_data_0(i));
 
-       return 0;
+       return (port_state[idx] >> bit) & 3;
 }
 
 static void rtl931x_stp_set(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[])