aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch')
-rw-r--r--target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch75
1 files changed, 75 insertions, 0 deletions
diff --git a/target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch b/target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch
new file mode 100644
index 0000000000..dd1e506e5b
--- /dev/null
+++ b/target/linux/ipq806x/patches-5.15/108-v5.14-net-stmmac-explicitly-deassert-gmac-ahb-reset.patch
@@ -0,0 +1,75 @@
+From e67f325e9cd67562b761e884680c0fec03a6f404 Mon Sep 17 00:00:00 2001
+From: Matthew Hagan <mnhagan88@gmail.com>
+Date: Tue, 8 Jun 2021 19:59:06 +0100
+Subject: net: stmmac: explicitly deassert GMAC_AHB_RESET
+
+We are currently assuming that GMAC_AHB_RESET will already be deasserted
+by the bootloader. However if this has not been done, probing of the GMAC
+will fail. To remedy this we must ensure GMAC_AHB_RESET has been deasserted
+prior to probing.
+
+v2 changes:
+ - remove NULL condition check for stmmac_ahb_rst in stmmac_main.c
+ - unwrap dev_err() message in stmmac_main.c
+ - add PTR_ERR() around plat->stmmac_ahb_rst in stmmac_platform.c
+
+v3 changes:
+ - add error pointer to dev_err() output
+ - add reset_control_assert(stmmac_ahb_rst) in stmmac_dvr_remove
+ - revert PTR_ERR() around plat->stmmac_ahb_rst since this is performed
+ on the returned value of ret by the calling function
+
+Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++
+ drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 6 ++++++
+ include/linux/stmmac.h | 1 +
+ 3 files changed, 12 insertions(+)
+
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -5021,6 +5021,10 @@ int stmmac_dvr_probe(struct device *devi
+ reset_control_reset(priv->plat->stmmac_rst);
+ }
+
++ ret = reset_control_deassert(priv->plat->stmmac_ahb_rst);
++ if (ret == -ENOTSUPP)
++ dev_err(priv->device, "unable to bring out of ahb reset\n");
++
+ /* Init MAC and get the capabilities */
+ ret = stmmac_hw_init(priv);
+ if (ret)
+@@ -5245,6 +5249,7 @@ int stmmac_dvr_remove(struct device *dev
+ phylink_destroy(priv->phylink);
+ if (priv->plat->stmmac_rst)
+ reset_control_assert(priv->plat->stmmac_rst);
++ reset_control_assert(priv->plat->stmmac_ahb_rst);
+ pm_runtime_put(dev);
+ pm_runtime_disable(dev);
+ if (priv->hw->pcs != STMMAC_PCS_TBI &&
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+@@ -617,6 +617,12 @@ stmmac_probe_config_dt(struct platform_d
+ plat->stmmac_rst = NULL;
+ }
+
++ plat->stmmac_ahb_rst = devm_reset_control_get_optional_shared(
++ &pdev->dev, "ahb");
++ if (IS_ERR(plat->stmmac_ahb_rst))
++ if (PTR_ERR(plat->stmmac_ahb_rst) == -EPROBE_DEFER)
++ goto error_hw_init;
++
+ return plat;
+
+ error_hw_init:
+--- a/include/linux/stmmac.h
++++ b/include/linux/stmmac.h
+@@ -192,6 +192,7 @@ struct plat_stmmacenet_data {
+ unsigned int clk_ref_rate;
+ s32 ptp_max_adj;
+ struct reset_control *stmmac_rst;
++ struct reset_control *stmmac_ahb_rst;
+ struct stmmac_axi *axi;
+ int has_gmac4;
+ bool has_sun8i;