All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet
@ 2017-01-09 15:34 Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 1/6] sh_eth: use correct name for ECMR_MPDE bit Niklas Söderlund
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

Hi,

This series adds support for Wake-on-Lan using Magic Packet for a few
models of the sh_eth driver. Patch 1/6 fix a naming error, patch 2/6 
adds generic support to control and support WoL while patches 3/6 - 6/6 
enable different models.

Based ontop of net-next master.

Changes since v2.
- Fix bookkeeping for "active_count" and "event_count" reported in 
  /sys/kernel/debug/wakeup_sources. Thanks Geert for noticing this.
- Add new patch 1/6 which corrects the name of ECMR_MPDE bit, suggested 
  by Sergei.
- s/sh7743/sh7734/ in patch 5/6. Thanks Geert for spotting this.
- Spelling improvements suggested by Sergei and Geert.
- Add Tested-by to 3/6 and 4/6.

Changes since v1.
- Split generic WoL functionality and device enablement to different
  patches.
- Enable more devices then Gen2 after feedback from Geert and
  datasheets.
- Do not set mdp->irq_enabled = false and remove specific MagicPacket
  interrupt clearing, instead let sh_eth_error() clear the interrupt as
  for other EMAC interrupts, thanks Sergei for the suggestion.
- Use the original return logic in sh_eth_resume().
- Moved sh_eth_private variable *clk to top of data structure  to avoid
  possible gaps due to alignment restrictions.
- Make wol_enabled in sh_eth_private part of the already existing
  bitfield instead of a bool.
- Do not initiate mdp->wol_enabled to 0, the struct is kzalloc'ed so
  it's already set to 0.

Niklas Söderlund (6):
  sh_eth: use correct name for ECMR_MPDE bit
  sh_eth: add generic wake-on-lan support via magic packet
  sh_eth: enable wake-on-lan for R-Car Gen2 devices
  sh_eth: enable wake-on-lan for r8a7740/armadillo
  sh_eth: enable wake-on-lan for sh7734
  sh_eth: enable wake-on-lan for sh7763

 drivers/net/ethernet/renesas/sh_eth.c | 123 +++++++++++++++++++++++++++++++---
 drivers/net/ethernet/renesas/sh_eth.h |   5 +-
 2 files changed, 117 insertions(+), 11 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCHv3 1/6] sh_eth: use correct name for ECMR_MPDE bit
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet Niklas Söderlund
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

This bit was wrongly named due to a typo, Sergei checked the SH7734/63
manuals and this bit should be named MPDE.

Suggested-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/net/ethernet/renesas/sh_eth.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h
index 9eec1e185adf..11798d5c4a1d 100644
--- a/drivers/net/ethernet/renesas/sh_eth.h
+++ b/drivers/net/ethernet/renesas/sh_eth.h
@@ -339,7 +339,7 @@ enum FELIC_MODE_BIT {
 	ECMR_DPAD = 0x00200000, ECMR_RZPF = 0x00100000,
 	ECMR_ZPF = 0x00080000, ECMR_PFR = 0x00040000, ECMR_RXF = 0x00020000,
 	ECMR_TXF = 0x00010000, ECMR_MCT = 0x00002000, ECMR_PRCEF = 0x00001000,
-	ECMR_PMDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
+	ECMR_MPDE = 0x00000200, ECMR_RE = 0x00000040, ECMR_TE = 0x00000020,
 	ECMR_RTM = 0x00000010, ECMR_ILB = 0x00000008, ECMR_ELB = 0x00000004,
 	ECMR_DM = 0x00000002, ECMR_PRM = 0x00000001,
 };
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 1/6] sh_eth: use correct name for ECMR_MPDE bit Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-12 12:55   ` Sergei Shtylyov
  2017-01-09 15:34 ` [PATCHv3 3/6] sh_eth: enable wake-on-lan for R-Car Gen2 devices Niklas Söderlund
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

Add generic functionality to support Wake-on-LAN using MagicPacket which
are supported by at least a few versions of sh_eth. Only add
functionality for WoL, no specific sh_eth versions are marked to support
WoL yet.

WoL is enabled in the suspend callback by setting MagicPacket detection
and disabling all interrupts expect MagicPacket. In the resume path the
driver needs to reset the hardware to rearm the WoL logic, this prevents
the driver from simply restoring the registers and to take advantage of
that sh_eth was not suspended to reduce resume time. To reset the
hardware the driver closes and reopens the device just like it would do
in a normal suspend/resume scenario without WoL enabled, but it both
closes and opens the device in the resume callback since the device
needs to be open for WoL to work.

One quirk needed for WoL is that the module clock needs to be prevented
from being switched off by Runtime PM. To keep the clock alive the
suspend callback need to call clk_enable() directly to increase the
usage count of the clock. Then when Runtime PM decreases the clock usage
count it won't reach 0 and be switched off.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/net/ethernet/renesas/sh_eth.c | 114 +++++++++++++++++++++++++++++++---
 drivers/net/ethernet/renesas/sh_eth.h |   3 +
 2 files changed, 109 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 8a784dce45fa..542c92b57b35 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -1552,6 +1552,8 @@ static void sh_eth_emac_interrupt(struct net_device *ndev)
 			sh_eth_rcv_snd_enable(ndev);
 		}
 	}
+	if (felic_stat & ECSR_MPD)
+		pm_wakeup_event(&mdp->pdev->dev, 0);
 }
 
 /* error control function */
@@ -2201,6 +2203,33 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
 	return 0;
 }
 
+static void sh_eth_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
+{
+	struct sh_eth_private *mdp = netdev_priv(ndev);
+
+	wol->supported = 0;
+	wol->wolopts = 0;
+
+	if (mdp->cd->magic && mdp->clk) {
+		wol->supported = WAKE_MAGIC;
+		wol->wolopts = mdp->wol_enabled ? WAKE_MAGIC : 0;
+	}
+}
+
+static int sh_eth_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
+{
+	struct sh_eth_private *mdp = netdev_priv(ndev);
+
+	if (!mdp->cd->magic || !mdp->clk || wol->wolopts & ~WAKE_MAGIC)
+		return -EOPNOTSUPP;
+
+	mdp->wol_enabled = !!(wol->wolopts & WAKE_MAGIC);
+
+	device_set_wakeup_enable(&mdp->pdev->dev, mdp->wol_enabled);
+
+	return 0;
+}
+
 static const struct ethtool_ops sh_eth_ethtool_ops = {
 	.get_regs_len	= sh_eth_get_regs_len,
 	.get_regs	= sh_eth_get_regs,
@@ -2215,6 +2244,8 @@ static const struct ethtool_ops sh_eth_ethtool_ops = {
 	.set_ringparam	= sh_eth_set_ringparam,
 	.get_link_ksettings = sh_eth_get_link_ksettings,
 	.set_link_ksettings = sh_eth_set_link_ksettings,
+	.get_wol	= sh_eth_get_wol,
+	.set_wol	= sh_eth_set_wol,
 };
 
 /* network device open function */
@@ -3017,6 +3048,11 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
 		goto out_release;
 	}
 
+	/* Get clock, if not found that's OK but Wake-On-Lan is unavailable */
+	mdp->clk = devm_clk_get(&pdev->dev, NULL);
+	if (IS_ERR(mdp->clk))
+		mdp->clk = NULL;
+
 	ndev->base_addr = res->start;
 
 	spin_lock_init(&mdp->lock);
@@ -3111,6 +3147,9 @@ static int sh_eth_drv_probe(struct platform_device *pdev)
 	if (ret)
 		goto out_napi_del;
 
+	if (mdp->cd->magic && mdp->clk)
+		device_set_wakeup_capable(&pdev->dev, 1);
+
 	/* print device information */
 	netdev_info(ndev, "Base address at 0x%x, %pM, IRQ %d.\n",
 		    (u32)ndev->base_addr, ndev->dev_addr, ndev->irq);
@@ -3150,15 +3189,67 @@ static int sh_eth_drv_remove(struct platform_device *pdev)
 
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM_SLEEP
+static int sh_eth_wol_setup(struct net_device *ndev)
+{
+	struct sh_eth_private *mdp = netdev_priv(ndev);
+
+	/* Only allow ECI interrupts */
+	synchronize_irq(ndev->irq);
+	napi_disable(&mdp->napi);
+	sh_eth_write(ndev, DMAC_M_ECI, EESIPR);
+
+	/* Enable MagicPacket */
+	sh_eth_modify(ndev, ECMR, 0, ECMR_MPDE);
+
+	/* Increased clock usage so device won't be suspended */
+	clk_enable(mdp->clk);
+
+	return enable_irq_wake(ndev->irq);
+}
+
+static int sh_eth_wol_restore(struct net_device *ndev)
+{
+	struct sh_eth_private *mdp = netdev_priv(ndev);
+	int ret;
+
+	napi_enable(&mdp->napi);
+
+	/* Disable MagicPacket */
+	sh_eth_modify(ndev, ECMR, ECMR_MPDE, 0);
+
+	/* The device needs to be reset to restore MagicPacket logic
+	 * for next wakeup. If we close and open the device it will
+	 * both be reset and all registers restored. This is what
+	 * happens during suspend and resume without WoL enabled.
+	 */
+	ret = sh_eth_close(ndev);
+	if (ret < 0)
+		return ret;
+	ret = sh_eth_open(ndev);
+	if (ret < 0)
+		return ret;
+
+	/* Restore clock usage count */
+	clk_disable(mdp->clk);
+
+	return disable_irq_wake(ndev->irq);
+}
+
 static int sh_eth_suspend(struct device *dev)
 {
 	struct net_device *ndev = dev_get_drvdata(dev);
+	struct sh_eth_private *mdp = netdev_priv(ndev);
 	int ret = 0;
 
-	if (netif_running(ndev)) {
-		netif_device_detach(ndev);
+	if (!netif_running(ndev))
+		return 0;
+
+	netif_device_detach(ndev);
+
+	if (mdp->wol_enabled)
+		ret = sh_eth_wol_setup(ndev);
+	else
 		ret = sh_eth_close(ndev);
-	}
 
 	return ret;
 }
@@ -3166,14 +3257,21 @@ static int sh_eth_suspend(struct device *dev)
 static int sh_eth_resume(struct device *dev)
 {
 	struct net_device *ndev = dev_get_drvdata(dev);
+	struct sh_eth_private *mdp = netdev_priv(ndev);
 	int ret = 0;
 
-	if (netif_running(ndev)) {
+	if (!netif_running(ndev))
+		return 0;
+
+	if (mdp->wol_enabled)
+		ret = sh_eth_wol_restore(ndev);
+	else
 		ret = sh_eth_open(ndev);
-		if (ret < 0)
-			return ret;
-		netif_device_attach(ndev);
-	}
+
+	if (ret < 0)
+		return ret;
+
+	netif_device_attach(ndev);
 
 	return ret;
 }
diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h
index 11798d5c4a1d..96b5459d131f 100644
--- a/drivers/net/ethernet/renesas/sh_eth.h
+++ b/drivers/net/ethernet/renesas/sh_eth.h
@@ -493,6 +493,7 @@ struct sh_eth_cpu_data {
 	unsigned shift_rd0:1;	/* shift Rx descriptor word 0 right by 16 */
 	unsigned rmiimode:1;	/* EtherC has RMIIMODE register */
 	unsigned rtrate:1;	/* EtherC has RTRATE register */
+	unsigned magic:1;	/* EtherC has ECMR.MPDE and ECSR.MPD */
 };
 
 struct sh_eth_private {
@@ -501,6 +502,7 @@ struct sh_eth_private {
 	const u16 *reg_offset;
 	void __iomem *addr;
 	void __iomem *tsu_addr;
+	struct clk *clk;
 	u32 num_rx_ring;
 	u32 num_tx_ring;
 	dma_addr_t rx_desc_dma;
@@ -529,6 +531,7 @@ struct sh_eth_private {
 	unsigned no_ether_link:1;
 	unsigned ether_link_active_low:1;
 	unsigned is_opened:1;
+	unsigned wol_enabled:1;
 };
 
 static inline void sh_eth_soft_swap(char *src, int len)
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCHv3 3/6] sh_eth: enable wake-on-lan for R-Car Gen2 devices
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 1/6] sh_eth: use correct name for ECMR_MPDE bit Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 4/6] sh_eth: enable wake-on-lan for r8a7740/armadillo Niklas Söderlund
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

Tested on Gen2 r8a7791/Koelsch.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/net/ethernet/renesas/sh_eth.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 542c92b57b35..afaf8785ed72 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -623,8 +623,9 @@ static struct sh_eth_cpu_data r8a779x_data = {
 
 	.register_type	= SH_ETH_REG_FAST_RCAR,
 
-	.ecsr_value	= ECSR_PSRTO | ECSR_LCHNG | ECSR_ICD,
-	.ecsipr_value	= ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | ECSIPR_ICDIP,
+	.ecsr_value	= ECSR_PSRTO | ECSR_LCHNG | ECSR_ICD | ECSR_MPD,
+	.ecsipr_value	= ECSIPR_PSRTOIP | ECSIPR_LCHNGIP | ECSIPR_ICDIP |
+			  ECSIPR_MPDIP,
 	.eesipr_value	= 0x01ff009f,
 
 	.tx_check	= EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO,
@@ -639,6 +640,7 @@ static struct sh_eth_cpu_data r8a779x_data = {
 	.tpauser	= 1,
 	.hw_swap	= 1,
 	.rmiimode	= 1,
+	.magic		= 1,
 };
 #endif /* CONFIG_OF */
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCHv3 4/6] sh_eth: enable wake-on-lan for r8a7740/armadillo
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
                   ` (2 preceding siblings ...)
  2017-01-09 15:34 ` [PATCHv3 3/6] sh_eth: enable wake-on-lan for R-Car Gen2 devices Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 5/6] sh_eth: enable wake-on-lan for sh7734 Niklas Söderlund
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

Geert Uytterhoeven reported WoL worked on his Armadillo board.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/net/ethernet/renesas/sh_eth.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index afaf8785ed72..67cb6b3793ca 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -577,6 +577,7 @@ static struct sh_eth_cpu_data r8a7740_data = {
 	.tsu		= 1,
 	.select_mii	= 1,
 	.shift_rd0	= 1,
+	.magic		= 1,
 };
 
 /* There is CPU dependent code */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCHv3 5/6] sh_eth: enable wake-on-lan for sh7734
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
                   ` (3 preceding siblings ...)
  2017-01-09 15:34 ` [PATCHv3 4/6] sh_eth: enable wake-on-lan for r8a7740/armadillo Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-09 15:34 ` [PATCHv3 6/6] sh_eth: enable wake-on-lan for sh7763 Niklas Söderlund
  2017-01-09 20:55   ` David Miller
  6 siblings, 0 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

This is based on public datasheet for sh7734 which shows it has the
same behavior and registers for WoL as other versions of sh_eth.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/net/ethernet/renesas/sh_eth.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 67cb6b3793ca..5292022fe6b1 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -819,6 +819,7 @@ static struct sh_eth_cpu_data sh7734_data = {
 	.hw_crc		= 1,
 	.select_mii	= 1,
 	.shift_rd0	= 1,
+	.magic		= 1,
 };
 
 /* SH7763 */
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCHv3 6/6] sh_eth: enable wake-on-lan for sh7763
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
                   ` (4 preceding siblings ...)
  2017-01-09 15:34 ` [PATCHv3 5/6] sh_eth: enable wake-on-lan for sh7734 Niklas Söderlund
@ 2017-01-09 15:34 ` Niklas Söderlund
  2017-01-09 20:55   ` David Miller
  6 siblings, 0 replies; 12+ messages in thread
From: Niklas Söderlund @ 2017-01-09 15:34 UTC (permalink / raw)
  To: Sergei Shtylyov, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm, Niklas Söderlund

This is based on public datasheet for sh7763 which shows it has the
same behavior and registers for WoL as other versions of sh_eth.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/net/ethernet/renesas/sh_eth.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 5292022fe6b1..ecf0f7997a72 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -847,6 +847,7 @@ static struct sh_eth_cpu_data sh7763_data = {
 	.no_ade		= 1,
 	.tsu		= 1,
 	.irq_flags	= IRQF_SHARED,
+	.magic		= 1,
 };
 
 static struct sh_eth_cpu_data sh7619_data = {
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet
  2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
@ 2017-01-09 20:55   ` David Miller
  2017-01-09 15:34 ` [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet Niklas Söderlund
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: David Miller @ 2017-01-09 20:55 UTC (permalink / raw)
  To: niklas.soderlund+renesas
  Cc: sergei.shtylyov, horms+renesas, netdev, linux-renesas-soc, geert,
	linux-pm

From: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Date: Mon,  9 Jan 2017 16:34:03 +0100

> This series adds support for Wake-on-Lan using Magic Packet for a few
> models of the sh_eth driver. Patch 1/6 fix a naming error, patch 2/6 
> adds generic support to control and support WoL while patches 3/6 - 6/6 
> enable different models.
> 
> Based ontop of net-next master.
 ...

Series applied, thanks.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet
@ 2017-01-09 20:55   ` David Miller
  0 siblings, 0 replies; 12+ messages in thread
From: David Miller @ 2017-01-09 20:55 UTC (permalink / raw)
  To: niklas.soderlund+renesas
  Cc: sergei.shtylyov, horms+renesas, netdev, linux-renesas-soc, geert,
	linux-pm

From: Niklas S�derlund <niklas.soderlund+renesas@ragnatech.se>
Date: Mon,  9 Jan 2017 16:34:03 +0100

> This series adds support for Wake-on-Lan using Magic Packet for a few
> models of the sh_eth driver. Patch 1/6 fix a naming error, patch 2/6 
> adds generic support to control and support WoL while patches 3/6 - 6/6 
> enable different models.
> 
> Based ontop of net-next master.
 ...

Series applied, thanks.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet
  2017-01-09 20:55   ` David Miller
  (?)
@ 2017-01-09 21:48   ` Sergei Shtylyov
  2017-01-09 21:55     ` David Miller
  -1 siblings, 1 reply; 12+ messages in thread
From: Sergei Shtylyov @ 2017-01-09 21:48 UTC (permalink / raw)
  To: David Miller, niklas.soderlund+renesas
  Cc: horms+renesas, netdev, linux-renesas-soc, geert, linux-pm

On 01/09/2017 11:55 PM, David Miller wrote:

>> This series adds support for Wake-on-Lan using Magic Packet for a few
>> models of the sh_eth driver. Patch 1/6 fix a naming error, patch 2/6
>> adds generic support to control and support WoL while patches 3/6 - 6/6
>> enable different models.
>>
>> Based ontop of net-next master.
>  ...
>
> Series applied, thanks.

    That was too quick for me... I hadn't even started looking into the main 
patch yet. :-/

MBR, Sergei

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet
  2017-01-09 21:48   ` Sergei Shtylyov
@ 2017-01-09 21:55     ` David Miller
  0 siblings, 0 replies; 12+ messages in thread
From: David Miller @ 2017-01-09 21:55 UTC (permalink / raw)
  To: sergei.shtylyov
  Cc: niklas.soderlund+renesas, horms+renesas, netdev,
	linux-renesas-soc, geert, linux-pm

From: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Date: Tue, 10 Jan 2017 00:48:28 +0300

> On 01/09/2017 11:55 PM, David Miller wrote:
> 
>>> This series adds support for Wake-on-Lan using Magic Packet for a few
>>> models of the sh_eth driver. Patch 1/6 fix a naming error, patch 2/6
>>> adds generic support to control and support WoL while patches 3/6 -
>>> 6/6
>>> enable different models.
>>>
>>> Based ontop of net-next master.
>>  ...
>>
>> Series applied, thanks.
> 
>    That was too quick for me... I hadn't even started looking into the
>    main patch yet. :-/

Sorry, today a lot of stuff got submitted and I do not want to have such
a huge backlog at the end of the day.

I can revert the entire series if you want me to.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet
  2017-01-09 15:34 ` [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet Niklas Söderlund
@ 2017-01-12 12:55   ` Sergei Shtylyov
  0 siblings, 0 replies; 12+ messages in thread
From: Sergei Shtylyov @ 2017-01-12 12:55 UTC (permalink / raw)
  To: Niklas Söderlund, Simon Horman, netdev, linux-renesas-soc
  Cc: Geert Uytterhoeven, linux-pm

Hello!

On 01/09/2017 06:34 PM, Niklas Söderlund wrote:

> Add generic functionality to support Wake-on-LAN using MagicPacket which
> are supported by at least a few versions of sh_eth. Only add
> functionality for WoL, no specific sh_eth versions are marked to support
> WoL yet.
>
> WoL is enabled in the suspend callback by setting MagicPacket detection
> and disabling all interrupts expect MagicPacket. In the resume path the
> driver needs to reset the hardware to rearm the WoL logic, this prevents
> the driver from simply restoring the registers and to take advantage of
> that sh_eth was not suspended to reduce resume time. To reset the
> hardware the driver closes and reopens the device just like it would do
> in a normal suspend/resume scenario without WoL enabled, but it both
> closes and opens the device in the resume callback since the device
> needs to be open for WoL to work.
>
> One quirk needed for WoL is that the module clock needs to be prevented
> from being switched off by Runtime PM. To keep the clock alive the
> suspend callback need to call clk_enable() directly to increase the
> usage count of the clock. Then when Runtime PM decreases the clock usage
> count it won't reach 0 and be switched off.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> ---
>  drivers/net/ethernet/renesas/sh_eth.c | 114 +++++++++++++++++++++++++++++++---
>  drivers/net/ethernet/renesas/sh_eth.h |   3 +
>  2 files changed, 109 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
> index 8a784dce45fa..542c92b57b35 100644
> --- a/drivers/net/ethernet/renesas/sh_eth.c
> +++ b/drivers/net/ethernet/renesas/sh_eth.c
> @@ -1552,6 +1552,8 @@ static void sh_eth_emac_interrupt(struct net_device *ndev)
>  			sh_eth_rcv_snd_enable(ndev);
>  		}
>  	}
> +	if (felic_stat & ECSR_MPD)
> +		pm_wakeup_event(&mdp->pdev->dev, 0);

    Hum, seeing a corner case: if we're ignoring the link interrupt (and it 
does occur along with ECSR.MPD, we'll return and miss this check. It would 
have been preferable to add this code above the ECSR.LCHNG handler...

[...]
> @@ -3150,15 +3189,67 @@ static int sh_eth_drv_remove(struct platform_device *pdev)
>
>  #ifdef CONFIG_PM
>  #ifdef CONFIG_PM_SLEEP
> +static int sh_eth_wol_setup(struct net_device *ndev)
> +{
> +	struct sh_eth_private *mdp = netdev_priv(ndev);
> +
> +	/* Only allow ECI interrupts */
> +	synchronize_irq(ndev->irq);
> +	napi_disable(&mdp->napi);
> +	sh_eth_write(ndev, DMAC_M_ECI, EESIPR);
> +
> +	/* Enable MagicPacket */
> +	sh_eth_modify(ndev, ECMR, 0, ECMR_MPDE);

    I'd prefer sh_eth_modify(ndev, ECMR, ECMR_MPDE, ECMR_MPDE) to be 
consistent with my other code...

[...]

MBR, Sergei


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-01-12 12:55 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-09 15:34 [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet Niklas Söderlund
2017-01-09 15:34 ` [PATCHv3 1/6] sh_eth: use correct name for ECMR_MPDE bit Niklas Söderlund
2017-01-09 15:34 ` [PATCHv3 2/6] sh_eth: add generic wake-on-lan support via magic packet Niklas Söderlund
2017-01-12 12:55   ` Sergei Shtylyov
2017-01-09 15:34 ` [PATCHv3 3/6] sh_eth: enable wake-on-lan for R-Car Gen2 devices Niklas Söderlund
2017-01-09 15:34 ` [PATCHv3 4/6] sh_eth: enable wake-on-lan for r8a7740/armadillo Niklas Söderlund
2017-01-09 15:34 ` [PATCHv3 5/6] sh_eth: enable wake-on-lan for sh7734 Niklas Söderlund
2017-01-09 15:34 ` [PATCHv3 6/6] sh_eth: enable wake-on-lan for sh7763 Niklas Söderlund
2017-01-09 20:55 ` [PATCHv3 0/6] sh_eth: add wake-on-lan support via magic packet David Miller
2017-01-09 20:55   ` David Miller
2017-01-09 21:48   ` Sergei Shtylyov
2017-01-09 21:55     ` David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.