summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Stockhausen2026-01-25 08:27:56 +0000
committerHauke Mehrtens2026-02-08 20:25:29 +0000
commit0837be599dee9c13b83130b5effc2bb6faed4fa1 (patch)
treefe25a42d40e66393a1f0bb74908108a937110fd5
parentdec360a3ac7078046bb789d29244b70776d113e1 (diff)
downloadopenwrt-0837be599dee9c13b83130b5effc2bb6faed4fa1.tar.gz
realtek: dsa: rtl83xx: fix init section mismatch
Compilation currently spits this message: WARNING: modpost: vmlinux: section mismatch in reference: rtl83xx_sw_probe+0x6a4 (section: .text.rtl83xx_sw_probe) -> rtl83xx_setup_qos (section: .init.text) That means that we have a "normal" function caller (can be called during the whole uptime) and a "initialization" function callee (only available during init. Fix this and directly fix the unwanted family checks. Fixes: 012e0091 ("realtek: dsa: avoid use-after-free") Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de> Link: https://github.com/openwrt/openwrt/pull/21690 (cherry picked from commit adbb9a64235e1575bcd47c75d9cdc628b96a15e0) Link: https://github.com/openwrt/openwrt/pull/21900 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c3
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/qos.c28
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c1
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c1
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h3
5 files changed, 15 insertions, 21 deletions
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c
index 1f0578ebba..99c7cf2c25 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c
@@ -1586,7 +1586,8 @@ static int rtl83xx_sw_probe(struct platform_device *pdev)
rtl83xx_get_l2aging(priv);
- rtl83xx_setup_qos(priv);
+ if (priv->r->qos_init)
+ priv->r->qos_init(priv);
if (priv->r->l3_setup)
priv->r->l3_setup(priv);
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/qos.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/qos.c
index 1b5b714290..ff515bea10 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/qos.c
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/qos.c
@@ -547,24 +547,14 @@ static void rtl839x_config_qos(void)
}
}
-void __init rtl83xx_setup_qos(struct rtl838x_switch_priv *priv)
+void rtldsa_838x_qos_init(struct rtl838x_switch_priv *priv)
{
- switch_priv = priv;
-
- pr_info("In %s\n", __func__);
-
- switch (priv->family_id) {
- case RTL8380_FAMILY_ID:
- rtl838x_config_qos();
- rtl838x_rate_control_init(priv);
- break;
- case RTL8390_FAMILY_ID:
- rtl839x_config_qos();
- rtl839x_rate_control_init(priv);
- break;
- default:
- if (priv->r->qos_init)
- priv->r->qos_init(priv);
- break;
- }
+ rtl838x_config_qos();
+ rtl838x_rate_control_init(priv);
+}
+
+void rtldsa_839x_qos_init(struct rtl838x_switch_priv *priv)
+{
+ rtl839x_config_qos();
+ rtl839x_rate_control_init(priv);
}
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c
index 39e15ba3e0..728190d667 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c
@@ -1744,6 +1744,7 @@ const struct rtl838x_reg rtl838x_reg = {
.l3_setup = rtl838x_l3_setup,
.set_distribution_algorithm = rtl838x_set_distribution_algorithm,
.set_receive_management_action = rtl838x_set_receive_management_action,
+ .qos_init = rtldsa_838x_qos_init,
};
irqreturn_t rtl838x_switch_irq(int irq, void *dev_id)
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c
index c63f5cddfc..711bd9d84f 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c
@@ -1713,4 +1713,5 @@ const struct rtl838x_reg rtl839x_reg = {
.l3_setup = rtl839x_l3_setup,
.set_distribution_algorithm = rtl839x_set_distribution_algorithm,
.set_receive_management_action = rtl839x_set_receive_management_action,
+ .qos_init = rtldsa_839x_qos_init,
};
diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h
index a3cb62ceb7..ddee0a0d8a 100644
--- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h
+++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h
@@ -131,7 +131,8 @@ inline u16 rtl_table_data(struct table_reg *r, int i);
inline u32 rtl_table_data_r(struct table_reg *r, int i);
inline void rtl_table_data_w(struct table_reg *r, u32 v, int i);
-void __init rtl83xx_setup_qos(struct rtl838x_switch_priv *priv);
+void rtldsa_838x_qos_init(struct rtl838x_switch_priv *priv);
+void rtldsa_839x_qos_init(struct rtl838x_switch_priv *priv);
void rtl83xx_fast_age(struct dsa_switch *ds, int port);
int rtl83xx_packet_cntr_alloc(struct rtl838x_switch_priv *priv);