Commit 3172d3af authored by Deepak Sikri's avatar Deepak Sikri Committed by David S. Miller

stmmac: support wake up irq from external sources (v3)

On some platforms e.g. SPEAr the wake up irq differs from the
GMAC interrupt source.
With this patch an external wake up irq can be passed through the
platform code and named as "eth_wake_irq".

In case the wake up interrupt is not passed from the platform
so the driver will continue to use the mac irq (ndev->irq)
Signed-off-by: default avatarDeepak Sikri <deepak.sikri@st.com>
Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 26a051cc
...@@ -72,6 +72,7 @@ struct stmmac_priv { ...@@ -72,6 +72,7 @@ struct stmmac_priv {
spinlock_t lock; spinlock_t lock;
int wolopts; int wolopts;
int wolenabled; int wolenabled;
int wol_irq;
#ifdef CONFIG_STMMAC_TIMER #ifdef CONFIG_STMMAC_TIMER
struct stmmac_timer *tm; struct stmmac_timer *tm;
#endif #endif
......
...@@ -321,10 +321,10 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) ...@@ -321,10 +321,10 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
if (wol->wolopts) { if (wol->wolopts) {
pr_info("stmmac: wakeup enable\n"); pr_info("stmmac: wakeup enable\n");
device_set_wakeup_enable(priv->device, 1); device_set_wakeup_enable(priv->device, 1);
enable_irq_wake(dev->irq); enable_irq_wake(priv->wol_irq);
} else { } else {
device_set_wakeup_enable(priv->device, 0); device_set_wakeup_enable(priv->device, 0);
disable_irq_wake(dev->irq); disable_irq_wake(priv->wol_irq);
} }
spin_lock_irq(&priv->lock); spin_lock_irq(&priv->lock);
......
...@@ -1515,7 +1515,7 @@ static int stmmac_mac_device_setup(struct net_device *dev) ...@@ -1515,7 +1515,7 @@ static int stmmac_mac_device_setup(struct net_device *dev)
if (device_can_wakeup(priv->device)) { if (device_can_wakeup(priv->device)) {
priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */
enable_irq_wake(dev->irq); enable_irq_wake(priv->wol_irq);
} }
return 0; return 0;
...@@ -1588,6 +1588,18 @@ static int stmmac_dvr_probe(struct platform_device *pdev) ...@@ -1588,6 +1588,18 @@ static int stmmac_dvr_probe(struct platform_device *pdev)
pr_info("\tPMT module supported\n"); pr_info("\tPMT module supported\n");
device_set_wakeup_capable(&pdev->dev, 1); device_set_wakeup_capable(&pdev->dev, 1);
} }
/*
* On some platforms e.g. SPEAr the wake up irq differs from the mac irq
* The external wake up irq can be passed through the platform code
* named as "eth_wake_irq"
*
* In case the wake up interrupt is not passed from the platform
* so the driver will continue to use the mac irq (ndev->irq)
*/
priv->wol_irq = platform_get_irq_byname(pdev, "eth_wake_irq");
if (priv->wol_irq == -ENXIO)
priv->wol_irq = ndev->irq;
platform_set_drvdata(pdev, ndev); platform_set_drvdata(pdev, ndev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment