mirror of
https://github.com/FUjr/gl-infra-builder.git
synced 2025-12-16 17:15:08 +00:00
patches-19.x: target/ramips: fix esw rt3050 panic
Signed-off-by: gl-zhaojianhui <jianhui.zhao@gl-inet.com>
This commit is contained in:
parent
ee1a81a9e7
commit
91d0a21e52
@ -1,17 +1,17 @@
|
|||||||
From ac8ea98bd4aff7f28c5bbfbc2580a624de9db6fe Mon Sep 17 00:00:00 2001
|
From cdb0acc648bd71ed9d1e44851776236ef3575342 Mon Sep 17 00:00:00 2001
|
||||||
From: gl-zhaojianhui <jianhui.zhao@gl-inet.com>
|
From: gl-zhaojianhui <jianhui.zhao@gl-inet.com>
|
||||||
Date: Sat, 6 Nov 2021 18:16:06 +0800
|
Date: Sat, 6 Nov 2021 18:16:06 +0800
|
||||||
Subject: [PATCH] target/ramips: fix esw-rt3050 panic
|
Subject: [PATCH] target/ramips: fix esw-rt3050 panic
|
||||||
|
|
||||||
Signed-off-by: gl-zhaojianhui <jianhui.zhao@gl-inet.com>
|
Signed-off-by: gl-zhaojianhui <jianhui.zhao@gl-inet.com>
|
||||||
---
|
---
|
||||||
target/linux/ramips/dts/mt7628an.dtsi | 4 ++--
|
target/linux/ramips/dts/mt7628an.dtsi | 8 ++--
|
||||||
.../files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c | 8 ++++++--
|
.../net/ethernet/mediatek/esw_rt3050.c | 47 ++++++++++++++++---
|
||||||
.../files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c | 2 +-
|
.../net/ethernet/mediatek/soc_rt3050.c | 2 +-
|
||||||
3 files changed, 9 insertions(+), 5 deletions(-)
|
3 files changed, 45 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/target/linux/ramips/dts/mt7628an.dtsi b/target/linux/ramips/dts/mt7628an.dtsi
|
diff --git a/target/linux/ramips/dts/mt7628an.dtsi b/target/linux/ramips/dts/mt7628an.dtsi
|
||||||
index 61016c8b40..e2246f9e91 100644
|
index 61016c8b40..ec4406a3ce 100644
|
||||||
--- a/target/linux/ramips/dts/mt7628an.dtsi
|
--- a/target/linux/ramips/dts/mt7628an.dtsi
|
||||||
+++ b/target/linux/ramips/dts/mt7628an.dtsi
|
+++ b/target/linux/ramips/dts/mt7628an.dtsi
|
||||||
@@ -445,8 +445,8 @@
|
@@ -445,8 +445,8 @@
|
||||||
@ -25,8 +25,19 @@ index 61016c8b40..e2246f9e91 100644
|
|||||||
|
|
||||||
mediatek,switch = <&esw>;
|
mediatek,switch = <&esw>;
|
||||||
};
|
};
|
||||||
|
@@ -455,8 +455,8 @@
|
||||||
|
compatible = "mediatek,mt7628-esw", "ralink,rt3050-esw";
|
||||||
|
reg = <0x10110000 0x8000>;
|
||||||
|
|
||||||
|
- resets = <&rstctrl 23>;
|
||||||
|
- reset-names = "esw";
|
||||||
|
+ resets = <&rstctrl 23 &rstctrl 24>;
|
||||||
|
+ reset-names = "esw", "ephy";
|
||||||
|
|
||||||
|
interrupt-parent = <&intc>;
|
||||||
|
interrupts = <17>;
|
||||||
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
||||||
index 816c588dd7..bbc0824af7 100644
|
index 816c588dd7..8eea0ff437 100644
|
||||||
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
||||||
+++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
+++ b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/esw_rt3050.c
|
||||||
@@ -18,7 +18,7 @@
|
@@ -18,7 +18,7 @@
|
||||||
@ -38,24 +49,99 @@ index 816c588dd7..bbc0824af7 100644
|
|||||||
#include <linux/switch.h>
|
#include <linux/switch.h>
|
||||||
|
|
||||||
#include "mtk_eth_soc.h"
|
#include "mtk_eth_soc.h"
|
||||||
@@ -173,6 +173,7 @@
|
@@ -172,7 +172,6 @@
|
||||||
|
|
||||||
#define RT5350_ESW_REG_PXTPC(_x) (0x150 + (4 * _x))
|
#define RT5350_ESW_REG_PXTPC(_x) (0x150 + (4 * _x))
|
||||||
#define RT5350_EWS_REG_LED_POLARITY 0x168
|
#define RT5350_EWS_REG_LED_POLARITY 0x168
|
||||||
#define RT5350_RESET_EPHY BIT(24)
|
-#define RT5350_RESET_EPHY BIT(24)
|
||||||
+#define RT305X_RESET_ESW BIT(23)
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
/* Global attributes. */
|
/* Global attributes. */
|
||||||
@@ -791,6 +792,8 @@ static int esw_apply_config(struct switch_dev *dev)
|
@@ -232,7 +231,8 @@ struct rt305x_esw {
|
||||||
|
int led_frequency;
|
||||||
|
struct esw_vlan vlans[RT305X_ESW_NUM_VLANS];
|
||||||
|
struct esw_port ports[RT305X_ESW_NUM_PORTS];
|
||||||
|
-
|
||||||
|
+ struct reset_control *rst_esw;
|
||||||
|
+ struct reset_control *rst_ephy;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void esw_w32(struct rt305x_esw *esw, u32 val, unsigned reg)
|
||||||
|
@@ -430,12 +430,37 @@ static void esw_set_gsc(struct rt305x_esw *esw)
|
||||||
|
|
||||||
|
static int esw_apply_config(struct switch_dev *dev);
|
||||||
|
|
||||||
|
+static void esw_reset(struct rt305x_esw *esw)
|
||||||
|
+{
|
||||||
|
+ if (!esw->rst_esw)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ reset_control_assert(esw->rst_esw);
|
||||||
|
+ usleep_range(60, 120);
|
||||||
|
+ reset_control_deassert(esw->rst_esw);
|
||||||
|
+ /* the esw takes long to reset otherwise the board hang */
|
||||||
|
+ msleep(10);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void esw_reset_ephy(struct rt305x_esw *esw)
|
||||||
|
+{
|
||||||
|
+ if (!esw->rst_ephy)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ reset_control_assert(esw->rst_ephy);
|
||||||
|
+ usleep_range(60, 120);
|
||||||
|
+ reset_control_deassert(esw->rst_ephy);
|
||||||
|
+ usleep_range(60, 120);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void esw_hw_init(struct rt305x_esw *esw)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u8 port_disable = 0;
|
||||||
|
u8 port_map = RT305X_ESW_PMAP_LLLLLL;
|
||||||
|
|
||||||
|
+ esw_reset(esw);
|
||||||
|
+
|
||||||
|
/* vodoo from original driver */
|
||||||
|
esw_w32(esw, 0xC8A07850, RT305X_ESW_REG_FCT0);
|
||||||
|
esw_w32(esw, 0x00000000, RT305X_ESW_REG_SGC2);
|
||||||
|
@@ -506,7 +531,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
|
||||||
|
|
||||||
|
if (ralink_soc == RT305X_SOC_RT3352) {
|
||||||
|
/* reset EPHY */
|
||||||
|
- fe_reset(RT5350_RESET_EPHY);
|
||||||
|
+ esw_reset_ephy(esw);
|
||||||
|
|
||||||
|
rt305x_mii_write(esw, 0, 31, 0x8000);
|
||||||
|
for (i = 0; i < 5; i++) {
|
||||||
|
@@ -557,7 +582,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
|
||||||
|
rt305x_mii_write(esw, 0, 31, 0x8000);
|
||||||
|
} else if (ralink_soc == RT305X_SOC_RT5350) {
|
||||||
|
/* reset EPHY */
|
||||||
|
- fe_reset(RT5350_RESET_EPHY);
|
||||||
|
+ esw_reset_ephy(esw);
|
||||||
|
|
||||||
|
/* set the led polarity */
|
||||||
|
esw_w32(esw, esw->reg_led_polarity & 0x1F,
|
||||||
|
@@ -615,7 +640,7 @@ static void esw_hw_init(struct rt305x_esw *esw)
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* reset EPHY */
|
||||||
|
- fe_reset(RT5350_RESET_EPHY);
|
||||||
|
+ esw_reset_ephy(esw);
|
||||||
|
|
||||||
|
rt305x_mii_write(esw, 0, 31, 0x2000); /* change G2 page */
|
||||||
|
rt305x_mii_write(esw, 0, 26, 0x0020);
|
||||||
|
@@ -791,6 +816,8 @@ static int esw_apply_config(struct switch_dev *dev)
|
||||||
esw_set_vmsc(esw, 0, RT305X_ESW_PORTS_ALL);
|
esw_set_vmsc(esw, 0, RT305X_ESW_PORTS_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ fe_reset(RT5350_RESET_EPHY);
|
+ esw_reset_ephy(esw);
|
||||||
+
|
+
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -801,7 +804,6 @@ static int esw_reset_switch(struct switch_dev *dev)
|
@@ -801,7 +828,6 @@ static int esw_reset_switch(struct switch_dev *dev)
|
||||||
esw->global_vlan_enable = 0;
|
esw->global_vlan_enable = 0;
|
||||||
memset(esw->ports, 0, sizeof(esw->ports));
|
memset(esw->ports, 0, sizeof(esw->ports));
|
||||||
memset(esw->vlans, 0, sizeof(esw->vlans));
|
memset(esw->vlans, 0, sizeof(esw->vlans));
|
||||||
@ -63,15 +149,20 @@ index 816c588dd7..bbc0824af7 100644
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1351,6 +1353,8 @@ static int esw_probe(struct platform_device *pdev)
|
@@ -1396,6 +1422,13 @@ static int esw_probe(struct platform_device *pdev)
|
||||||
struct rt305x_esw *esw;
|
return ret;
|
||||||
int ret;
|
}
|
||||||
|
|
||||||
+ fe_reset(RT305X_RESET_ESW);
|
+ esw->rst_esw = devm_reset_control_get(&pdev->dev, "esw");
|
||||||
|
+ if (IS_ERR(esw->rst_esw))
|
||||||
|
+ esw->rst_esw = NULL;
|
||||||
|
+ esw->rst_ephy = devm_reset_control_get(&pdev->dev, "ephy");
|
||||||
|
+ if (IS_ERR(esw->rst_ephy))
|
||||||
|
+ esw->rst_ephy = NULL;
|
||||||
+
|
+
|
||||||
esw = devm_kzalloc(&pdev->dev, sizeof(*esw), GFP_KERNEL);
|
platform_set_drvdata(pdev, esw);
|
||||||
if (!esw)
|
|
||||||
return -ENOMEM;
|
spin_lock_init(&esw->reg_rw_lock);
|
||||||
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c
|
diff --git a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c b/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c
|
||||||
index 914b81410e..6291259fe0 100644
|
index 914b81410e..6291259fe0 100644
|
||||||
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c
|
--- a/target/linux/ramips/files-4.14/drivers/net/ethernet/mediatek/soc_rt3050.c
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user