* [PATCH net-next 0/3 v5] RTL8366RB enhancements
@ 2021-10-05 19:47 Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 1/3 v5] net: dsa: rtl8366rb: Support disabling learning Linus Walleij
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Linus Walleij @ 2021-10-05 19:47 UTC (permalink / raw)
To: Andrew Lunn, Vivien Didelot, Florian Fainelli, Vladimir Oltean,
David S . Miller, Jakub Kicinski
Cc: netdev, Linus Walleij
This patch set is a set of reasonably mature improvements
for the RTL8366RB switch, implemented after Vladimir
challenged me to dig deeper into the switch functions.
ChangeLog v4->v5:
- Drop dubious flood control patch: these registers probably
only deal with rate limiting, we will deal with this
another time if we can figure it out.
ChangeLog -> v4:
- Rebase earlier circulated patches on the now merged
VLAN set-up cleanups.
Linus Walleij (3):
net: dsa: rtl8366rb: Support disabling learning
net: dsa: rtl8366rb: Support fast aging
net: dsa: rtl8366rb: Support setting STP state
drivers/net/dsa/rtl8366rb.c | 112 ++++++++++++++++++++++++++++++++++--
1 file changed, 106 insertions(+), 6 deletions(-)
--
2.31.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next 1/3 v5] net: dsa: rtl8366rb: Support disabling learning
2021-10-05 19:47 [PATCH net-next 0/3 v5] RTL8366RB enhancements Linus Walleij
@ 2021-10-05 19:47 ` Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging Linus Walleij
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Linus Walleij @ 2021-10-05 19:47 UTC (permalink / raw)
To: Andrew Lunn, Vivien Didelot, Florian Fainelli, Vladimir Oltean,
David S . Miller, Jakub Kicinski
Cc: netdev, Linus Walleij, Alvin Šipraga, Mauri Sandberg, DENG Qingfang
The RTL8366RB hardware supports disabling learning per-port
so let's make use of this feature. Rename some unfortunately
named registers in the process.
Suggested-by: Vladimir Oltean <olteanv@gmail.com>
Cc: Alvin Šipraga <alsi@bang-olufsen.dk>
Cc: Mauri Sandberg <sandberg@mailfence.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: DENG Qingfang <dqfext@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v4->v5:
- Collect Vladimir's review tag.
ChangeLog v3->v4:
- No changes, rebased on other patches.
ChangeLog v2->v3:
- Disable learning by default, learning will be turned
on selectively using the callback.
ChangeLog v1->v2:
- New patch suggested by Vladimir.
---
drivers/net/dsa/rtl8366rb.c | 50 ++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 6 deletions(-)
diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c
index bb9d017c2f9f..b3056064b937 100644
--- a/drivers/net/dsa/rtl8366rb.c
+++ b/drivers/net/dsa/rtl8366rb.c
@@ -14,6 +14,7 @@
#include <linux/bitops.h>
#include <linux/etherdevice.h>
+#include <linux/if_bridge.h>
#include <linux/interrupt.h>
#include <linux/irqdomain.h>
#include <linux/irqchip/chained_irq.h>
@@ -42,9 +43,12 @@
/* Port Enable Control register */
#define RTL8366RB_PECR 0x0001
-/* Switch Security Control registers */
-#define RTL8366RB_SSCR0 0x0002
-#define RTL8366RB_SSCR1 0x0003
+/* Switch per-port learning disablement register */
+#define RTL8366RB_PORT_LEARNDIS_CTRL 0x0002
+
+/* Security control, actually aging register */
+#define RTL8366RB_SECURITY_CTRL 0x0003
+
#define RTL8366RB_SSCR2 0x0004
#define RTL8366RB_SSCR2_DROP_UNKNOWN_DA BIT(0)
@@ -927,13 +931,14 @@ static int rtl8366rb_setup(struct dsa_switch *ds)
/* layer 2 size, see rtl8366rb_change_mtu() */
rb->max_mtu[i] = 1532;
- /* Enable learning for all ports */
- ret = regmap_write(smi->map, RTL8366RB_SSCR0, 0);
+ /* Disable learning for all ports */
+ ret = regmap_write(smi->map, RTL8366RB_PORT_LEARNDIS_CTRL,
+ RTL8366RB_PORT_ALL);
if (ret)
return ret;
/* Enable auto ageing for all ports */
- ret = regmap_write(smi->map, RTL8366RB_SSCR1, 0);
+ ret = regmap_write(smi->map, RTL8366RB_SECURITY_CTRL, 0);
if (ret)
return ret;
@@ -1272,6 +1277,37 @@ static int rtl8366rb_vlan_filtering(struct dsa_switch *ds, int port,
return ret;
}
+static int
+rtl8366rb_port_pre_bridge_flags(struct dsa_switch *ds, int port,
+ struct switchdev_brport_flags flags,
+ struct netlink_ext_ack *extack)
+{
+ /* We support enabling/disabling learning */
+ if (flags.mask & ~(BR_LEARNING))
+ return -EINVAL;
+
+ return 0;
+}
+
+static int
+rtl8366rb_port_bridge_flags(struct dsa_switch *ds, int port,
+ struct switchdev_brport_flags flags,
+ struct netlink_ext_ack *extack)
+{
+ struct realtek_smi *smi = ds->priv;
+ int ret;
+
+ if (flags.mask & BR_LEARNING) {
+ ret = regmap_update_bits(smi->map, RTL8366RB_PORT_LEARNDIS_CTRL,
+ BIT(port),
+ (flags.val & BR_LEARNING) ? 0 : BIT(port));
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
{
struct realtek_smi *smi = ds->priv;
@@ -1682,6 +1718,8 @@ static const struct dsa_switch_ops rtl8366rb_switch_ops = {
.port_vlan_del = rtl8366_vlan_del,
.port_enable = rtl8366rb_port_enable,
.port_disable = rtl8366rb_port_disable,
+ .port_pre_bridge_flags = rtl8366rb_port_pre_bridge_flags,
+ .port_bridge_flags = rtl8366rb_port_bridge_flags,
.port_change_mtu = rtl8366rb_change_mtu,
.port_max_mtu = rtl8366rb_max_mtu,
};
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging
2021-10-05 19:47 [PATCH net-next 0/3 v5] RTL8366RB enhancements Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 1/3 v5] net: dsa: rtl8366rb: Support disabling learning Linus Walleij
@ 2021-10-05 19:47 ` Linus Walleij
2021-10-06 10:15 ` Vladimir Oltean
2021-10-05 19:47 ` [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state Linus Walleij
2021-10-06 14:10 ` [PATCH net-next 0/3 v5] RTL8366RB enhancements patchwork-bot+netdevbpf
3 siblings, 1 reply; 7+ messages in thread
From: Linus Walleij @ 2021-10-05 19:47 UTC (permalink / raw)
To: Andrew Lunn, Vivien Didelot, Florian Fainelli, Vladimir Oltean,
David S . Miller, Jakub Kicinski
Cc: netdev, Linus Walleij, Mauri Sandberg, DENG Qingfang, Alvin Šipraga
This implements fast aging per-port using the special "security"
register, which will flush any learned L2 LUT entries on a port.
The vendor API just enabled setting and clearing this bit, so
we set it to age out any entries on the port and then we clear
it again.
Suggested-by: Vladimir Oltean <olteanv@gmail.com>
Cc: Mauri Sandberg <sandberg@mailfence.com>
Cc: DENG Qingfang <dqfext@gmail.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
ChangeLog v4->v5:
- Update changelog a bit what else can we do.
ChangeLog v3->v4:
- No changes, rebased on the other patches.
ChangeLog v2->v3:
- Underscore that this only affects learned L2 entries, not
static ones.
ChangeLog v1->v2:
- New patch suggested by Vladimir.
---
drivers/net/dsa/rtl8366rb.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c
index b3056064b937..c78e4220ddd1 100644
--- a/drivers/net/dsa/rtl8366rb.c
+++ b/drivers/net/dsa/rtl8366rb.c
@@ -1308,6 +1308,19 @@ rtl8366rb_port_bridge_flags(struct dsa_switch *ds, int port,
return 0;
}
+static void
+rtl8366rb_port_fast_age(struct dsa_switch *ds, int port)
+{
+ struct realtek_smi *smi = ds->priv;
+
+ /* This will age out any learned L2 entries */
+ regmap_update_bits(smi->map, RTL8366RB_SECURITY_CTRL,
+ BIT(port), BIT(port));
+ /* Restore the normal state of things */
+ regmap_update_bits(smi->map, RTL8366RB_SECURITY_CTRL,
+ BIT(port), 0);
+}
+
static int rtl8366rb_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
{
struct realtek_smi *smi = ds->priv;
@@ -1720,6 +1733,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_fast_age = rtl8366rb_port_fast_age,
.port_change_mtu = rtl8366rb_change_mtu,
.port_max_mtu = rtl8366rb_max_mtu,
};
--
2.31.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state
2021-10-05 19:47 [PATCH net-next 0/3 v5] RTL8366RB enhancements Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 1/3 v5] net: dsa: rtl8366rb: Support disabling learning Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging Linus Walleij
@ 2021-10-05 19:47 ` Linus Walleij
2021-10-06 10:17 ` Vladimir Oltean
2021-10-06 14:10 ` [PATCH net-next 0/3 v5] RTL8366RB enhancements patchwork-bot+netdevbpf
3 siblings, 1 reply; 7+ messages in thread
From: Linus Walleij @ 2021-10-05 19:47 UTC (permalink / raw)
To: Andrew Lunn, Vivien Didelot, Florian Fainelli, Vladimir Oltean,
David S . Miller, Jakub Kicinski
Cc: netdev, Linus Walleij, Alvin Šipraga, Mauri Sandberg, DENG Qingfang
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 v4->v5:
- Rename register from RTL8368S* to RTL8366RB as all other
registers. (RTL8368S is some similar ASIC maybe the same.)
- Rename registers from "SPT" to "STP", we assume this is just
a typo in the vendor tree.
- Create RTL8366RB_STP_STATE_MASK() and RTL8366RB_STP_STATE()
macros and use these.
ChangeLog v1->v4:
- New patch after discovering that we can do really nice
bridge offloading with these bits.
---
drivers/net/dsa/rtl8366rb.c | 48 +++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/drivers/net/dsa/rtl8366rb.c b/drivers/net/dsa/rtl8366rb.c
index c78e4220ddd1..d2370cda4be0 100644
--- a/drivers/net/dsa/rtl8366rb.c
+++ b/drivers/net/dsa/rtl8366rb.c
@@ -110,6 +110,18 @@
#define RTL8366RB_POWER_SAVING_REG 0x0021
+/* Spanning tree status (STP) control, two bits per port per FID */
+#define RTL8366RB_STP_STATE_BASE 0x0050 /* 0x0050..0x0057 */
+#define RTL8366RB_STP_STATE_DISABLED 0x0
+#define RTL8366RB_STP_STATE_BLOCKING 0x1
+#define RTL8366RB_STP_STATE_LEARNING 0x2
+#define RTL8366RB_STP_STATE_FORWARDING 0x3
+#define RTL8366RB_STP_MASK GENMASK(1, 0)
+#define RTL8366RB_STP_STATE(port, state) \
+ ((state) << ((port) * 2))
+#define RTL8366RB_STP_STATE_MASK(port) \
+ RTL8366RB_STP_STATE((port), RTL8366RB_STP_MASK)
+
/* CPU port control reg */
#define RTL8368RB_CPU_CTRL_REG 0x0061
#define RTL8368RB_CPU_PORTS_MSK 0x00FF
@@ -234,6 +246,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 */
@@ -1308,6 +1321,40 @@ 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;
+ u32 val;
+ int i;
+
+ switch (state) {
+ case BR_STATE_DISABLED:
+ val = RTL8366RB_STP_STATE_DISABLED;
+ break;
+ case BR_STATE_BLOCKING:
+ case BR_STATE_LISTENING:
+ val = RTL8366RB_STP_STATE_BLOCKING;
+ break;
+ case BR_STATE_LEARNING:
+ val = RTL8366RB_STP_STATE_LEARNING;
+ break;
+ case BR_STATE_FORWARDING:
+ val = RTL8366RB_STP_STATE_FORWARDING;
+ break;
+ default:
+ dev_err(smi->dev, "unknown bridge state requested\n");
+ return;
+ };
+
+ /* Set the same status for the port on all the FIDs */
+ for (i = 0; i < RTL8366RB_NUM_FIDS; i++) {
+ regmap_update_bits(smi->map, RTL8366RB_STP_STATE_BASE + i,
+ RTL8366RB_STP_STATE_MASK(port),
+ RTL8366RB_STP_STATE(port, val));
+ }
+}
+
static void
rtl8366rb_port_fast_age(struct dsa_switch *ds, int port)
{
@@ -1733,6 +1780,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
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging
2021-10-05 19:47 ` [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging Linus Walleij
@ 2021-10-06 10:15 ` Vladimir Oltean
0 siblings, 0 replies; 7+ messages in thread
From: Vladimir Oltean @ 2021-10-06 10:15 UTC (permalink / raw)
To: Linus Walleij
Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S . Miller,
Jakub Kicinski, netdev, Mauri Sandberg, DENG Qingfang,
Alvin Šipraga
On Tue, Oct 05, 2021 at 09:47:03PM +0200, Linus Walleij wrote:
> This implements fast aging per-port using the special "security"
> register, which will flush any learned L2 LUT entries on a port.
>
> The vendor API just enabled setting and clearing this bit, so
> we set it to age out any entries on the port and then we clear
> it again.
>
> Suggested-by: Vladimir Oltean <olteanv@gmail.com>
> Cc: Mauri Sandberg <sandberg@mailfence.com>
> Cc: DENG Qingfang <dqfext@gmail.com>
> Cc: Florian Fainelli <f.fainelli@gmail.com>
> Reviewed-by: Alvin Šipraga <alsi@bang-olufsen.dk>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state
2021-10-05 19:47 ` [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state Linus Walleij
@ 2021-10-06 10:17 ` Vladimir Oltean
0 siblings, 0 replies; 7+ messages in thread
From: Vladimir Oltean @ 2021-10-06 10:17 UTC (permalink / raw)
To: Linus Walleij
Cc: Andrew Lunn, Vivien Didelot, Florian Fainelli, David S . Miller,
Jakub Kicinski, netdev, Alvin Šipraga, Mauri Sandberg,
DENG Qingfang
On Tue, Oct 05, 2021 at 09:47:04PM +0200, Linus Walleij wrote:
> 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 v4->v5:
> - Rename register from RTL8368S* to RTL8366RB as all other
> registers. (RTL8368S is some similar ASIC maybe the same.)
> - Rename registers from "SPT" to "STP", we assume this is just
> a typo in the vendor tree.
> - Create RTL8366RB_STP_STATE_MASK() and RTL8366RB_STP_STATE()
> macros and use these.
> ChangeLog v1->v4:
> - New patch after discovering that we can do really nice
> bridge offloading with these bits.
> ---
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next 0/3 v5] RTL8366RB enhancements
2021-10-05 19:47 [PATCH net-next 0/3 v5] RTL8366RB enhancements Linus Walleij
` (2 preceding siblings ...)
2021-10-05 19:47 ` [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state Linus Walleij
@ 2021-10-06 14:10 ` patchwork-bot+netdevbpf
3 siblings, 0 replies; 7+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-10-06 14:10 UTC (permalink / raw)
To: Linus Walleij
Cc: andrew, vivien.didelot, f.fainelli, olteanv, davem, kuba, netdev
Hello:
This series was applied to netdev/net-next.git (refs/heads/master):
On Tue, 5 Oct 2021 21:47:01 +0200 you wrote:
> This patch set is a set of reasonably mature improvements
> for the RTL8366RB switch, implemented after Vladimir
> challenged me to dig deeper into the switch functions.
>
> ChangeLog v4->v5:
> - Drop dubious flood control patch: these registers probably
> only deal with rate limiting, we will deal with this
> another time if we can figure it out.
>
> [...]
Here is the summary with links:
- [net-next,1/3,v5] net: dsa: rtl8366rb: Support disabling learning
https://git.kernel.org/netdev/net-next/c/56d8bb71a811
- [net-next,2/3,v5] net: dsa: rtl8366rb: Support fast aging
https://git.kernel.org/netdev/net-next/c/1fbd19e10b73
- [net-next,3/3,v5] net: dsa: rtl8366rb: Support setting STP state
https://git.kernel.org/netdev/net-next/c/e674cfd08537
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-10-06 14:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-05 19:47 [PATCH net-next 0/3 v5] RTL8366RB enhancements Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 1/3 v5] net: dsa: rtl8366rb: Support disabling learning Linus Walleij
2021-10-05 19:47 ` [PATCH net-next 2/3 v5] net: dsa: rtl8366rb: Support fast aging Linus Walleij
2021-10-06 10:15 ` Vladimir Oltean
2021-10-05 19:47 ` [PATCH net-next 3/3 v5] net: dsa: rtl8366rb: Support setting STP state Linus Walleij
2021-10-06 10:17 ` Vladimir Oltean
2021-10-06 14:10 ` [PATCH net-next 0/3 v5] RTL8366RB enhancements patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).