[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1448178839-3541-5-git-send-email-mw@semihalf.com>
Date: Sun, 22 Nov 2015 08:53:50 +0100
From: Marcin Wojtas <mw@...ihalf.com>
To: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
netdev@...r.kernel.org
Cc: davem@...emloft.net, linux@....linux.org.uk,
sebastian.hesselbarth@...il.com, andrew@...n.ch,
jason@...edaemon.net, thomas.petazzoni@...e-electrons.com,
gregory.clement@...e-electrons.com, simon.guinot@...uanux.org,
nadavh@...vell.com, alior@...vell.com, xswang@...vell.com,
myair@...vell.com, nitroshift@...oo.com, mw@...ihalf.com,
jaz@...ihalf.com, tn@...ihalf.com
Subject: [PATCH 04/13] net: mvneta: enable suspend/resume support
This commit introduces suspend/resume routines used for both in 'standby'
and 'mem' modes. For the latter, in which registers' contents are lost,
following steps are performed:
* in suspend - update port statistics and, if interface is running,
detach netif, clean the queues, disable cpu notifier, shutdown
interface and reset port's link status;
* in resume, for all interfaces, set default configuration of the port and
MBUS windows;
* in resume, in case the interface is running, enable accepting packets in
legacy parser, power up the port, register cpu notifier and attach netif.
Signed-off-by: Marcin Wojtas <mw@...ihalf.com>
---
drivers/net/ethernet/marvell/mvneta.c | 70 +++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index d12b8c6..f079b13 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -3442,6 +3442,72 @@ static int mvneta_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM_SLEEP
+static int mvneta_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct net_device *dev = platform_get_drvdata(pdev);
+ struct mvneta_port *pp = netdev_priv(dev);
+
+ mvneta_ethtool_update_stats(pp);
+
+ if (!netif_running(dev))
+ return 0;
+
+ netif_device_detach(dev);
+
+ mvneta_stop_dev(pp);
+ unregister_cpu_notifier(&pp->cpu_notifier);
+ mvneta_cleanup_rxqs(pp);
+ mvneta_cleanup_txqs(pp);
+
+ /* Reset link status */
+ pp->link = 0;
+ pp->duplex = -1;
+ pp->speed = 0;
+
+ return 0;
+}
+
+static int mvneta_resume(struct platform_device *pdev)
+{
+ const struct mbus_dram_target_info *dram_target_info;
+ struct net_device *dev = platform_get_drvdata(pdev);
+ struct mvneta_port *pp = netdev_priv(dev);
+ int ret;
+
+ mvneta_defaults_set(pp);
+ mvneta_port_power_up(pp, pp->phy_interface);
+
+ dram_target_info = mv_mbus_dram_info();
+ if (dram_target_info)
+ mvneta_conf_mbus_windows(pp, dram_target_info);
+
+ if (!netif_running(dev))
+ return 0;
+
+ ret = mvneta_setup_rxqs(pp);
+ if (ret) {
+ netdev_err(dev, "unable to setup rxqs after resume\n");
+ return ret;
+ }
+
+ ret = mvneta_setup_txqs(pp);
+ if (ret) {
+ netdev_err(dev, "unable to setup txqs after resume\n");
+ return ret;
+ }
+
+ mvneta_set_rx_mode(dev);
+ mvneta_percpu_elect(pp);
+ register_cpu_notifier(&pp->cpu_notifier);
+ mvneta_start_dev(pp);
+
+ netif_device_attach(dev);
+
+ return 0;
+}
+#endif /* CONFIG_PM_SLEEP */
+
static const struct of_device_id mvneta_match[] = {
{ .compatible = "marvell,armada-370-neta" },
{ .compatible = "marvell,armada-xp-neta" },
@@ -3452,6 +3518,10 @@ MODULE_DEVICE_TABLE(of, mvneta_match);
static struct platform_driver mvneta_driver = {
.probe = mvneta_probe,
.remove = mvneta_remove,
+#ifdef CONFIG_PM_SLEEP
+ .suspend = mvneta_suspend,
+ .resume = mvneta_resume,
+#endif
.driver = {
.name = MVNETA_DRIVER_NAME,
.of_match_table = mvneta_match,
--
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists