|
@@ -1,7 +1,7 @@
|
|
|
/*
|
|
|
* drivers/s390/net/ctcm_main.c
|
|
|
*
|
|
|
- * Copyright IBM Corp. 2001, 2007
|
|
|
+ * Copyright IBM Corp. 2001, 2009
|
|
|
* Author(s):
|
|
|
* Original CTC driver(s):
|
|
|
* Fritz Elfert (felfert@millenux.com)
|
|
@@ -1688,6 +1688,38 @@ static void ctcm_remove_device(struct ccwgroup_device *cgdev)
|
|
|
put_device(&cgdev->dev);
|
|
|
}
|
|
|
|
|
|
+static int ctcm_pm_suspend(struct ccwgroup_device *gdev)
|
|
|
+{
|
|
|
+ struct ctcm_priv *priv = dev_get_drvdata(&gdev->dev);
|
|
|
+
|
|
|
+ if (gdev->state == CCWGROUP_OFFLINE)
|
|
|
+ return 0;
|
|
|
+ netif_device_detach(priv->channel[READ]->netdev);
|
|
|
+ ctcm_close(priv->channel[READ]->netdev);
|
|
|
+ ccw_device_set_offline(gdev->cdev[1]);
|
|
|
+ ccw_device_set_offline(gdev->cdev[0]);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int ctcm_pm_resume(struct ccwgroup_device *gdev)
|
|
|
+{
|
|
|
+ struct ctcm_priv *priv = dev_get_drvdata(&gdev->dev);
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ if (gdev->state == CCWGROUP_OFFLINE)
|
|
|
+ return 0;
|
|
|
+ rc = ccw_device_set_online(gdev->cdev[1]);
|
|
|
+ if (rc)
|
|
|
+ goto err_out;
|
|
|
+ rc = ccw_device_set_online(gdev->cdev[0]);
|
|
|
+ if (rc)
|
|
|
+ goto err_out;
|
|
|
+ ctcm_open(priv->channel[READ]->netdev);
|
|
|
+err_out:
|
|
|
+ netif_device_attach(priv->channel[READ]->netdev);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
static struct ccwgroup_driver ctcm_group_driver = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.name = CTC_DRIVER_NAME,
|
|
@@ -1697,6 +1729,9 @@ static struct ccwgroup_driver ctcm_group_driver = {
|
|
|
.remove = ctcm_remove_device,
|
|
|
.set_online = ctcm_new_device,
|
|
|
.set_offline = ctcm_shutdown_device,
|
|
|
+ .freeze = ctcm_pm_suspend,
|
|
|
+ .thaw = ctcm_pm_resume,
|
|
|
+ .restore = ctcm_pm_resume,
|
|
|
};
|
|
|
|
|
|
|