[S390] pm: chsc subchannel driver power management callbacks
authorCornelia Huck <cornelia.huck@de.ibm.com>
Tue, 16 Jun 2009 08:30:24 +0000 (10:30 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 16 Jun 2009 08:31:10 +0000 (10:31 +0200)
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/chsc_sch.c

index 93eca1731b81a56bb7d934a8c5e62119e8178eb9..cc5144b6f9d9c590f56bdb9112774130f23f97ed 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * Driver for s390 chsc subchannels
  *
- * Copyright IBM Corp. 2008
+ * Copyright IBM Corp. 2008, 2009
+ *
  * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
  *
  */
@@ -112,6 +113,31 @@ static void chsc_subchannel_shutdown(struct subchannel *sch)
        cio_disable_subchannel(sch);
 }
 
+static int chsc_subchannel_prepare(struct subchannel *sch)
+{
+       int cc;
+       struct schib schib;
+       /*
+        * Don't allow suspend while the subchannel is not idle
+        * since we don't have a way to clear the subchannel and
+        * cannot disable it with a request running.
+        */
+       cc = stsch(sch->schid, &schib);
+       if (!cc && scsw_stctl(&schib.scsw))
+               return -EAGAIN;
+       return 0;
+}
+
+static int chsc_subchannel_freeze(struct subchannel *sch)
+{
+       return cio_disable_subchannel(sch);
+}
+
+static int chsc_subchannel_restore(struct subchannel *sch)
+{
+       return cio_enable_subchannel(sch, (u32)(unsigned long)sch);
+}
+
 static struct css_device_id chsc_subchannel_ids[] = {
        { .match_flags = 0x1, .type =SUBCHANNEL_TYPE_CHSC, },
        { /* end of list */ },
@@ -125,6 +151,10 @@ static struct css_driver chsc_subchannel_driver = {
        .probe = chsc_subchannel_probe,
        .remove = chsc_subchannel_remove,
        .shutdown = chsc_subchannel_shutdown,
+       .prepare = chsc_subchannel_prepare,
+       .freeze = chsc_subchannel_freeze,
+       .thaw = chsc_subchannel_restore,
+       .restore = chsc_subchannel_restore,
        .name = "chsc_subchannel",
 };