aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c
diff options
context:
space:
mode:
authorBirger Koblitz <git@birger-koblitz.de>2021-09-08 20:00:31 +0200
committerJohn Crispin <john@phrozen.org>2021-10-09 08:25:06 +0200
commit28e972b2ea2f55a593defcbd2dc21710cce648c7 (patch)
treede8ba964ea7b239ea84d61e3ab1a16b1be11854a /target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c
parent9d9bf16aa8d966834ac1280f96c37d22552c33d1 (diff)
downloadupstream-28e972b2ea2f55a593defcbd2dc21710cce648c7.tar.gz
upstream-28e972b2ea2f55a593defcbd2dc21710cce648c7.tar.bz2
upstream-28e972b2ea2f55a593defcbd2dc21710cce648c7.zip
realtek: Configure initial L2 learning setup
Configure a sane L2 learning configuration upon DSA driver load so that the switch can start learning L2 addresses. Also configure the correct flood masks for broadcast and unknown unicast traffice. Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
Diffstat (limited to 'target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c')
-rw-r--r--target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c
index 8faf6c07e9..4ed2184efa 100644
--- a/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c
+++ b/target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl839x.c
@@ -542,6 +542,20 @@ void rtl839x_traffic_disable(int source, int dest)
rtl839x_mask_port_reg_be(BIT_ULL(dest), 0, rtl839x_port_iso_ctrl(source));
}
+static void rtl839x_l2_learning_setup(void)
+{
+ /* Set portmask for broadcast (offset bit 12) and unknown unicast (offset 0)
+ * address flooding to the reserved entry in the portmask table used
+ * also for multicast flooding */
+ sw_w32(UNKNOWN_MC_PMASK << 12 | UNKNOWN_MC_PMASK, RTL839X_L2_FLD_PMSK);
+
+ // Limit learning to maximum: 32k entries, after that just flood (bits 0-1)
+ sw_w32((0x7fff << 2) | 0, RTL839X_L2_LRN_CONSTRT);
+
+ // Do not trap ARP packets to CPU_PORT
+ sw_w32(0, RTL839X_SPCL_TRAP_ARP_CTRL);
+}
+
irqreturn_t rtl839x_switch_irq(int irq, void *dev_id)
{
struct dsa_switch *ds = dev_id;
@@ -1677,6 +1691,7 @@ const struct rtl838x_reg rtl839x_reg = {
.pie_rule_write = rtl839x_pie_rule_write,
.pie_rule_add = rtl839x_pie_rule_add,
.pie_rule_rm = rtl839x_pie_rule_rm,
+ .l2_learning_setup = rtl839x_l2_learning_setup,
.packet_cntr_read = rtl839x_packet_cntr_read,
.packet_cntr_clear = rtl839x_packet_cntr_clear,
};