diff options
Diffstat (limited to 'target/linux/sunxi/patches-3.13/151-7-stmmac-fixup-7.patch')
-rw-r--r-- | target/linux/sunxi/patches-3.13/151-7-stmmac-fixup-7.patch | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-3.13/151-7-stmmac-fixup-7.patch b/target/linux/sunxi/patches-3.13/151-7-stmmac-fixup-7.patch new file mode 100644 index 0000000000..67e0c5bd78 --- /dev/null +++ b/target/linux/sunxi/patches-3.13/151-7-stmmac-fixup-7.patch @@ -0,0 +1,146 @@ +From 33a23e223749c45ff8099ff9baa235301a3ad07f Mon Sep 17 00:00:00 2001 +From: Srinivas Kandagatla <srinivas.kandagatla@st.com> +Date: Thu, 16 Jan 2014 10:52:44 +0000 +Subject: [PATCH] net: stmmac: use suspend functions for hibernation + +In hibernation freeze case the driver just releases the resources like +dma buffers, irqs, unregisters the drivers and during restore it does +register, request the resources. This is not really necessary, as part +of power management all the data structures are intact, all the +previously allocated resources can be used after coming out of low +power. + +This patch uses the suspend and resume callbacks for freeze and +restore which initializes the hardware correctly without unregistering +or releasing the resources, this should also help in reducing the time +to restore. + +Also this patch fixes a bug in stmmac_pltfr_restore and +stmmac_pltfr_freeze where it tries to get hold of platform data via +dev_get_platdata call, which would return NULL in device tree cases and +the next if statement would crash as there is no NULL check. + +Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@st.com> +Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/stmicro/stmmac/stmmac.h | 2 - + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 16 -------- + .../net/ethernet/stmicro/stmmac/stmmac_platform.c | 44 ++++++---------------- + 3 files changed, 12 insertions(+), 50 deletions(-) + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h +index 5a568015..027f1dd 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h +@@ -117,8 +117,6 @@ struct stmmac_priv { + extern const struct stmmac_hwtimestamp stmmac_ptp; + int stmmac_ptp_register(struct stmmac_priv *priv); + void stmmac_ptp_unregister(struct stmmac_priv *priv); +-int stmmac_freeze(struct net_device *ndev); +-int stmmac_restore(struct net_device *ndev); + int stmmac_resume(struct net_device *ndev); + int stmmac_suspend(struct net_device *ndev); + int stmmac_dvr_remove(struct net_device *ndev); +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 742a83f..c1298a0 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -2912,22 +2912,6 @@ int stmmac_resume(struct net_device *ndev) + + return 0; + } +- +-int stmmac_freeze(struct net_device *ndev) +-{ +- if (!ndev || !netif_running(ndev)) +- return 0; +- +- return stmmac_release(ndev); +-} +- +-int stmmac_restore(struct net_device *ndev) +-{ +- if (!ndev || !netif_running(ndev)) +- return 0; +- +- return stmmac_open(ndev); +-} + #endif /* CONFIG_PM */ + + /* Driver can be configured w/ and w/ both PCI and Platf drivers +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +index 9377ee6..6d0bf22 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +@@ -211,55 +211,35 @@ static int stmmac_pltfr_remove(struct platform_device *pdev) + #ifdef CONFIG_PM + static int stmmac_pltfr_suspend(struct device *dev) + { +- struct net_device *ndev = dev_get_drvdata(dev); +- +- return stmmac_suspend(ndev); +-} +- +-static int stmmac_pltfr_resume(struct device *dev) +-{ +- struct net_device *ndev = dev_get_drvdata(dev); +- +- return stmmac_resume(ndev); +-} +- +-static int stmmac_pltfr_freeze(struct device *dev) +-{ + int ret; +- struct plat_stmmacenet_data *plat_dat = dev_get_platdata(dev); + struct net_device *ndev = dev_get_drvdata(dev); ++ struct stmmac_priv *priv = netdev_priv(ndev); + struct platform_device *pdev = to_platform_device(dev); + +- ret = stmmac_freeze(ndev); +- if (plat_dat->exit) +- plat_dat->exit(pdev); ++ ret = stmmac_suspend(ndev); ++ if (priv->plat->exit) ++ priv->plat->exit(pdev); + + return ret; + } + +-static int stmmac_pltfr_restore(struct device *dev) ++static int stmmac_pltfr_resume(struct device *dev) + { +- struct plat_stmmacenet_data *plat_dat = dev_get_platdata(dev); + struct net_device *ndev = dev_get_drvdata(dev); ++ struct stmmac_priv *priv = netdev_priv(ndev); + struct platform_device *pdev = to_platform_device(dev); + +- if (plat_dat->init) +- plat_dat->init(pdev); ++ if (priv->plat->init) ++ priv->plat->init(pdev); + +- return stmmac_restore(ndev); ++ return stmmac_resume(ndev); + } + +-static const struct dev_pm_ops stmmac_pltfr_pm_ops = { +- .suspend = stmmac_pltfr_suspend, +- .resume = stmmac_pltfr_resume, +- .freeze = stmmac_pltfr_freeze, +- .thaw = stmmac_pltfr_restore, +- .restore = stmmac_pltfr_restore, +-}; +-#else +-static const struct dev_pm_ops stmmac_pltfr_pm_ops; + #endif /* CONFIG_PM */ + ++static SIMPLE_DEV_PM_OPS(stmmac_pltfr_pm_ops, ++ stmmac_pltfr_suspend, stmmac_pltfr_resume); ++ + static const struct of_device_id stmmac_dt_ids[] = { + { .compatible = "st,spear600-gmac"}, + { .compatible = "snps,dwmac-3.610"}, +-- +1.8.5.5 + |