Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 543876c9 authored by Giuseppe Cavallaro's avatar Giuseppe Cavallaro Committed by David S. Miller
Browse files

stmmac: review the wake-up support



If the PM support is available this is passed
through the platform instead to be hard-coded
in the core files.
WoL on Magic Frame can be enabled by using
the ethtool support.

Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 77555ee7
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -238,7 +238,6 @@ struct mac_device_info {
	struct stmmac_ops	*mac;
	struct stmmac_desc_ops	*desc;
	struct stmmac_dma_ops	*dma;
	unsigned int pmt;	/* support Power-Down */
	struct mii_regs mii;	/* MII register Addresses */
	struct mac_link link;
};
+0 −1
Original line number Diff line number Diff line
@@ -239,7 +239,6 @@ struct mac_device_info *dwmac1000_setup(void __iomem *ioaddr)
	mac->mac = &dwmac1000_ops;
	mac->dma = &dwmac1000_dma_ops;

	mac->pmt = PMT_SUPPORTED;
	mac->link.port = GMAC_CONTROL_PS;
	mac->link.duplex = GMAC_CONTROL_DM;
	mac->link.speed = GMAC_CONTROL_FES;
+0 −1
Original line number Diff line number Diff line
@@ -193,7 +193,6 @@ struct mac_device_info *dwmac100_setup(void __iomem *ioaddr)
	mac->mac = &dwmac100_ops;
	mac->dma = &dwmac100_dma_ops;

	mac->pmt = PMT_NOT_SUPPORTED;
	mac->link.port = MAC_CONTROL_PS;
	mac->link.duplex = MAC_CONTROL_F;
	mac->link.speed = 0;
+9 −5
Original line number Diff line number Diff line
@@ -322,7 +322,7 @@ static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
	struct stmmac_priv *priv = netdev_priv(dev);

	spin_lock_irq(&priv->lock);
	if (priv->wolenabled == PMT_SUPPORTED) {
	if (device_can_wakeup(priv->device)) {
		wol->supported = WAKE_MAGIC;
		wol->wolopts = priv->wolopts;
	}
@@ -334,16 +334,20 @@ static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
	struct stmmac_priv *priv = netdev_priv(dev);
	u32 support = WAKE_MAGIC;

	if (priv->wolenabled == PMT_NOT_SUPPORTED)
	if (!device_can_wakeup(priv->device))
		return -EINVAL;

	if (wol->wolopts & ~support)
		return -EINVAL;

	if (wol->wolopts == 0)
		device_set_wakeup_enable(priv->device, 0);
	else
	if (wol->wolopts) {
		pr_info("stmmac: wakeup enable\n");
		device_set_wakeup_enable(priv->device, 1);
		enable_irq_wake(dev->irq);
	} else {
		device_set_wakeup_enable(priv->device, 0);
		disable_irq_wake(dev->irq);
	}

	spin_lock_irq(&priv->lock);
	priv->wolopts = wol->wolopts;
+14 −12
Original line number Diff line number Diff line
@@ -1568,9 +1568,8 @@ static int stmmac_mac_device_setup(struct net_device *dev)

	priv->hw = device;

	priv->wolenabled = priv->hw->pmt;	/* PMT supported */
	if (priv->wolenabled == PMT_SUPPORTED)
		priv->wolopts = WAKE_MAGIC;		/* Magic Frame */
	if (device_can_wakeup(priv->device))
		priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */

	return 0;
}
@@ -1709,6 +1708,12 @@ static int stmmac_dvr_probe(struct platform_device *pdev)
	priv->enh_desc = plat_dat->enh_desc;
	priv->ioaddr = addr;

	/* PMT module is not integrated in all the MAC devices. */
	if (plat_dat->pmt) {
		pr_info("\tPMT module supported\n");
		device_set_wakeup_capable(&pdev->dev, 1);
	}

	platform_set_drvdata(pdev, ndev);

	/* Set the I/O base addr */
@@ -1836,13 +1841,11 @@ static int stmmac_suspend(struct platform_device *pdev, pm_message_t state)

		stmmac_mac_disable_tx(priv->ioaddr);

		if (device_may_wakeup(&(pdev->dev))) {
		/* Enable Power down mode by programming the PMT regs */
			if (priv->wolenabled == PMT_SUPPORTED)
		if (device_can_wakeup(priv->device))
			priv->hw->mac->pmt(priv->ioaddr, priv->wolopts);
		} else {
		else
			stmmac_mac_disable_rx(priv->ioaddr);
		}
	} else {
		priv->shutdown = 1;
		/* Although this can appear slightly redundant it actually
@@ -1877,8 +1880,7 @@ static int stmmac_resume(struct platform_device *pdev)
	 * is received. Anyway, it's better to manually clear
	 * this bit because it can generate problems while resuming
	 * from another devices (e.g. serial console). */
	if (device_may_wakeup(&(pdev->dev)))
		if (priv->wolenabled == PMT_SUPPORTED)
	if (device_can_wakeup(priv->device))
		priv->hw->mac->pmt(priv->ioaddr, 0);

	netif_device_attach(dev);
Loading