From: Linus Walleij <linus.walleij@linaro.org>
To: Andrew Lunn <andrew@lunn.ch>,
Vivien Didelot <vivien.didelot@gmail.com>,
Florian Fainelli <f.fainelli@gmail.com>,
Vladimir Oltean <olteanv@gmail.com>,
"David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>
Cc: netdev@vger.kernel.org,
"Linus Walleij" <linus.walleij@linaro.org>,
"Alvin Šipraga" <alsi@bang-olufsen.dk>,
"Mauri Sandberg" <sandberg@mailfence.com>,
"DENG Qingfang" <dqfext@gmail.com>
Subject: [PATCH net-next 4/4 v4] net: dsa: rtl8366rb: Support setting STP state
Date: Wed, 29 Sep 2021 23:03:49 +0200 [thread overview]
Message-ID: <20210929210349.130099-5-linus.walleij@linaro.org> (raw)
In-Reply-To: <20210929210349.130099-1-linus.walleij@linaro.org>
This adds support for setting the STP state to the RTL8366RB
DSA switch. This rids the following message from the kernel on
e.g. OpenWrt:
DSA: failed to set STP state 3 (-95)
Since the RTL8366RB has one STP state register per FID with
two bit per port in each, we simply loop over all the FIDs
and set the state on all of them.
Cc: Vladimir Oltean <olteanv@gmail.com>
Cc: Alvin Šipraga <alsi@bang-olufsen.dk>
Cc: Mauri Sandberg <sandberg@mailfence.com>
Cc: DENG Qingfang <dqfext@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v1->v4:
- New patch after discovering that we can do really nice
bridge offloading with these bits.
---
drivers/net/dsa/rtl8366rb.c | 47 +++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c
index 748f22ab9130..c143fdab4802 100644
--- a/drivers/net/dsa/rtl8366rb.c
+++ b/drivers/net/dsa/rtl8366rb.c
@@ -110,6 +110,14 @@
#define RTL8366RB_POWER_SAVING_REG 0x0021
+/* Spanning tree status (STP) control, two bits per port per FID */
+#define RTL8368S_SPT_STATE_BASE 0x0050 /* 0x0050..0x0057 */
+#define RTL8368S_SPT_STATE_MSK 0x3
+#define RTL8368S_SPT_STATE_DISABLED 0x0
+#define RTL8368S_SPT_STATE_BLOCKING 0x1
+#define RTL8368S_SPT_STATE_LEARNING 0x2
+#define RTL8368S_SPT_STATE_FORWARDING 0x3
+
/* CPU port control reg */
#define RTL8368RB_CPU_CTRL_REG 0x0061
#define RTL8368RB_CPU_PORTS_MSK 0x00FF
@@ -254,6 +262,7 @@
#define RTL8366RB_NUM_LEDGROUPS 4
#define RTL8366RB_NUM_VIDS 4096
#define RTL8366RB_PRIORITYMAX 7
+#define RTL8366RB_NUM_FIDS 8
#define RTL8366RB_FIDMAX 7
#define RTL8366RB_PORT_1 BIT(0) /* In userspace port 0 */
@@ -1359,6 +1368,43 @@ rtl8366rb_port_bridge_flags(struct dsa_switch *ds, int port,
return 0;
}
+static void
+rtl8366rb_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
+{
+ struct realtek_smi *smi = ds->priv;
+ u16 mask;
+ u32 val;
+ int i;
+
+ switch (state) {
+ case BR_STATE_DISABLED:
+ val = RTL8368S_SPT_STATE_DISABLED;
+ break;
+ case BR_STATE_BLOCKING:
+ case BR_STATE_LISTENING:
+ val = RTL8368S_SPT_STATE_BLOCKING;
+ break;
+ case BR_STATE_LEARNING:
+ val = RTL8368S_SPT_STATE_LEARNING;
+ break;
+ case BR_STATE_FORWARDING:
+ val = RTL8368S_SPT_STATE_FORWARDING;
+ break;
+ default:
+ dev_err(smi->dev, "unknown bridge state requested\n");
+ return;
+ };
+
+ mask = (RTL8368S_SPT_STATE_MSK << (port * 2));
+ val <<= (port * 2);
+
+ /* Set the same status for the port on all the FIDs */
+ for (i = 0; i < RTL8366RB_NUM_FIDS; i++) {
+ regmap_update_bits(smi->map, RTL8368S_SPT_STATE_BASE + i,
+ mask, val);
+ }
+}
+
static void
rtl8366rb_port_fast_age(struct dsa_switch *ds, int port)
{
@@ -1784,6 +1830,7 @@ static const struct dsa_switch_ops rtl8366rb_switch_ops = {
.port_disable = rtl8366rb_port_disable,
.port_pre_bridge_flags = rtl8366rb_port_pre_bridge_flags,
.port_bridge_flags = rtl8366rb_port_bridge_flags,
+ .port_stp_state_set = rtl8366rb_port_stp_state_set,
.port_fast_age = rtl8366rb_port_fast_age,
.port_change_mtu = rtl8366rb_change_mtu,
.port_max_mtu = rtl8366rb_max_mtu,
--
2.31.1
next prev parent reply other threads:[~2021-09-29 21:07 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-29 21:03 [PATCH net-next 0/4 v4] RTL8366RB enhancements Linus Walleij
2021-09-29 21:03 ` [PATCH net-next 1/4 v4] net: dsa: rtl8366rb: Support disabling learning Linus Walleij
2021-09-29 21:58 ` Vladimir Oltean
2021-09-30 10:45 ` Alvin Šipraga
2021-10-04 20:57 ` Linus Walleij
2021-10-05 7:59 ` Alvin Šipraga
2021-10-05 14:07 ` Linus Walleij
2021-10-05 14:45 ` Alvin Šipraga
2021-09-29 21:03 ` [PATCH net-next 2/4 v4] net: dsa: rtl8366rb: Support flood control Linus Walleij
2021-09-29 21:57 ` Vladimir Oltean
2021-09-30 9:09 ` Alvin Šipraga
2021-10-04 22:22 ` Linus Walleij
2021-09-29 21:03 ` [PATCH net-next 3/4 v4] net: dsa: rtl8366rb: Support fast aging Linus Walleij
2021-09-29 21:45 ` Vladimir Oltean
2021-10-04 22:41 ` Linus Walleij
2021-09-29 21:03 ` Linus Walleij [this message]
2021-09-29 21:54 ` [PATCH net-next 4/4 v4] net: dsa: rtl8366rb: Support setting STP state Vladimir Oltean
2021-10-04 21:07 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210929210349.130099-5-linus.walleij@linaro.org \
--to=linus.walleij@linaro.org \
--cc=alsi@bang-olufsen.dk \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=dqfext@gmail.com \
--cc=f.fainelli@gmail.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=sandberg@mailfence.com \
--cc=vivien.didelot@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox