From fc24beac0897b8381a3fed646731eac073bab011 Mon Sep 17 00:00:00 2001 From: qi duan Date: Thu, 15 Aug 2019 03:58:34 -0400 Subject: [PATCH] ETH: do eth reset bit when resume. [1/1] PD#SWPL-12780 Problem: internal phy can not connect network probably after long stress suspend test Solution: In suspend/resume sequeue, add eth reset Verify: verify on TL1 and G12b Change-Id: Id8f6767686f4e4d52774d9ac28dac46549a52d4c Signed-off-by: qi duan Signed-off-by: Luan Yuan --- arch/arm/boot/dts/amlogic/mesong12a.dtsi | 5 +-- arch/arm/boot/dts/amlogic/mesong12b.dtsi | 5 +-- arch/arm/boot/dts/amlogic/mesong12b_a.dtsi | 5 +-- arch/arm/boot/dts/amlogic/mesonsm1.dtsi | 5 +-- arch/arm/boot/dts/amlogic/mesontl1.dtsi | 5 +-- arch/arm/boot/dts/amlogic/mesontm2.dtsi | 5 +-- arch/arm64/boot/dts/amlogic/mesong12a.dtsi | 5 +-- arch/arm64/boot/dts/amlogic/mesong12b.dtsi | 5 +-- arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi | 5 +-- arch/arm64/boot/dts/amlogic/mesonsm1.dtsi | 5 +-- arch/arm64/boot/dts/amlogic/mesontm2.dtsi | 5 +-- .../net/ethernet/stmicro/stmmac/dwmac-meson.c | 31 ++++++++++++++++++- 12 files changed, 63 insertions(+), 23 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/mesong12a.dtsi b/arch/arm/boot/dts/amlogic/mesong12a.dtsi index 8407dabd4e07..5a5334451071 100644 --- a/arch/arm/boot/dts/amlogic/mesong12a.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12a.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesong12b.dtsi b/arch/arm/boot/dts/amlogic/mesong12b.dtsi index 00316a0c0a53..94ee647a35bc 100644 --- a/arch/arm/boot/dts/amlogic/mesong12b.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12b.dtsi @@ -364,8 +364,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi b/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi index 02615f795156..54580c6c23ca 100644 --- a/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi +++ b/arch/arm/boot/dts/amlogic/mesong12b_a.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi index 55aa0b56bb1f..0259a77ab294 100644 --- a/arch/arm/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesonsm1.dtsi @@ -317,8 +317,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesontl1.dtsi b/arch/arm/boot/dts/amlogic/mesontl1.dtsi index fefe66764631..09181973fb3f 100644 --- a/arch/arm/boot/dts/amlogic/mesontl1.dtsi +++ b/arch/arm/boot/dts/amlogic/mesontl1.dtsi @@ -304,8 +304,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm/boot/dts/amlogic/mesontm2.dtsi b/arch/arm/boot/dts/amlogic/mesontm2.dtsi index 1636abe85cf1..deafb0ad989b 100644 --- a/arch/arm/boot/dts/amlogic/mesontm2.dtsi +++ b/arch/arm/boot/dts/amlogic/mesontm2.dtsi @@ -318,8 +318,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0xff3f0000 0x10000 0xff634540 0x8 - 0xff64c000 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0xff64c000 0xa0 + 0xffd01008 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12a.dtsi b/arch/arm64/boot/dts/amlogic/mesong12a.dtsi index a0f43409a4ae..fc74cb1e75f4 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12a.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12a.dtsi @@ -301,8 +301,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12b.dtsi b/arch/arm64/boot/dts/amlogic/mesong12b.dtsi index 020a2d45080b..d5a2696d75af 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12b.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12b.dtsi @@ -364,8 +364,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi b/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi index 4efbc812db18..cb626e16cb48 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12b_a.dtsi @@ -356,8 +356,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi index 626328c3a7a8..89ca874cdee5 100644 --- a/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonsm1.dtsi @@ -317,8 +317,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/arch/arm64/boot/dts/amlogic/mesontm2.dtsi b/arch/arm64/boot/dts/amlogic/mesontm2.dtsi index 2b650f8a6428..323b79fdc1ab 100644 --- a/arch/arm64/boot/dts/amlogic/mesontm2.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesontm2.dtsi @@ -299,8 +299,9 @@ compatible = "amlogic, g12a-eth-dwmac","snps,dwmac"; reg = <0x0 0xff3f0000 0x0 0x10000 0x0 0xff634540 0x0 0x8 - 0x0 0xff64c000 0x0 0xa0>; - reg-names = "eth_base", "eth_cfg", "eth_pll"; + 0x0 0xff64c000 0x0 0xa0 + 0x0 0xffd01008 0x0 0x4>; + reg-names = "eth_base", "eth_cfg", "eth_pll", "eth_reset"; interrupts = <0 8 1>; interrupt-names = "macirq"; status = "disabled"; diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c index ed459b93d4b3..a4cdb8ec4fc2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c @@ -55,6 +55,9 @@ static unsigned int is_internal_phy; struct meson_dwmac_data { bool g12a_phy; }; + +void __iomem *ee_reset_base; +struct platform_device *ppdev; #endif struct meson_dwmac { @@ -313,6 +316,7 @@ static void __iomem *g12a_network_interface_setup(struct platform_device *pdev) int auto_cali_idx = -1; is_internal_phy = 0; + ppdev = pdev; pr_debug("g12a_network_interface_setup\n"); /*map PRG_ETH_REG */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_cfg"); @@ -330,6 +334,21 @@ static void __iomem *g12a_network_interface_setup(struct platform_device *pdev) REG_ETH_reg0_addr = addr; pr_info(" REG0:Addr = %p\n", REG_ETH_reg0_addr); + /*map ETH_RESET address*/ + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_reset"); + if (!res) { + dev_err(&pdev->dev, "Unable to get resource(%d)\n", __LINE__); + ee_reset_base = NULL; + } else { + addr = devm_ioremap_resource(dev, res); + if (IS_ERR(addr)) { + dev_err(&pdev->dev, "Unable to map reset base\n"); + return NULL; + } + ee_reset_base = addr; + pr_info(" ee eth reset:Addr = %p\n", ee_reset_base); + } + /*map ETH_PLL address*/ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_pll"); if (!res) { @@ -494,6 +513,10 @@ static int meson6_dwmac_resume(struct device *dev) struct pinctrl_state *turnon_tes = NULL; pr_info("resuem inter = %d\n", is_internal_phy); if ((is_internal_phy) && (support_mac_wol == 0)) { + if (ee_reset_base) + writel((1 << 11), (void __iomem *) + (unsigned long)ee_reset_base); + pin_ctrl = devm_pinctrl_get(dev); if (IS_ERR_OR_NULL(pin_ctrl)) { pr_info("pinctrl is null\n"); @@ -504,7 +527,13 @@ static int meson6_dwmac_resume(struct device *dev) devm_pinctrl_put(pin_ctrl); pin_ctrl = NULL; } - dwmac_meson_recover_analog(dev); + if (!ee_reset_base) { + dwmac_meson_recover_analog(dev); + } else { + dwmac_meson_cfg_pll(phy_analog_config_addr, ppdev); + dwmac_meson_cfg_analog(phy_analog_config_addr, ppdev); + dwmac_meson_cfg_ctrl(phy_analog_config_addr, ppdev); + } } ret = stmmac_pltfr_resume(dev); return ret;