Implement suspend method and wait for channels to be idle
authorYONETANI Tomokazu <y0netan1@dragonflybsd.org>
Thu, 12 Oct 2006 04:02:37 +0000 (04:02 +0000)
committerYONETANI Tomokazu <y0netan1@dragonflybsd.org>
Thu, 12 Oct 2006 04:02:37 +0000 (04:02 +0000)
before going to suspended state.

Taken-from: FreeBSD

sys/dev/disk/ata/ata-all.c
sys/dev/disk/ata/ata-all.h
sys/dev/disk/ata/ata-isa.c
sys/dev/disk/ata/ata-pci.c

index f24ac7a..a513bf3 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.c,v 1.50.2.45 2003/03/12 14:47:12 sos Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-all.c,v 1.30 2006/09/05 00:55:37 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/ata/ata-all.c,v 1.31 2006/10/12 04:02:37 y0netan1 Exp $
  */
 
 #include "opt_ata.h"
@@ -301,6 +301,28 @@ ata_detach(device_t dev)
     return 0;
 }
 
+int
+ata_suspend(device_t dev)
+{
+    struct ata_channel *ch;
+
+    if (dev == NULL || (ch = device_get_softc(dev)) == NULL)
+       return ENXIO;
+
+    /* wait for the channel to be IDLE or detached before suspending */
+    while (ch->r_irq) {
+       crit_enter();
+       if (ch->active == ATA_IDLE) {
+           ch->active = ATA_CONTROL;
+           crit_exit();
+           break;
+       }
+       crit_exit();
+       tsleep(ch, 0, "atasusp", hz / 10);
+    }
+    return 0;
+}
+
 int
 ata_resume(device_t dev)
 {
index fa72470..dbc026e 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-all.h,v 1.26.2.12 2003/01/30 07:19:59 sos Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-all.h,v 1.7 2004/02/18 02:47:38 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/ata/ata-all.h,v 1.8 2006/10/12 04:02:37 y0netan1 Exp $
  */
 
 #ifndef _SYS_MPIPE_H_
@@ -262,6 +262,7 @@ int ata_probe(device_t);
 int ata_attach(device_t);
 int ata_detach(device_t);
 int ata_resume(device_t);
+int ata_suspend(device_t);
 
 void ata_start(struct ata_channel *);
 void ata_reset(struct ata_channel *);
index daedab5..887e9a8 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-isa.c,v 1.4.2.1 2002/03/18 08:37:33 sos Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-isa.c,v 1.8 2004/08/24 08:15:22 joerg Exp $
+ * $DragonFly: src/sys/dev/disk/ata/ata-isa.c,v 1.9 2006/10/12 04:02:37 y0netan1 Exp $
  */
 
 #include <sys/param.h>
@@ -91,6 +91,7 @@ static device_method_t ata_isa_methods[] = {
     DEVMETHOD(device_probe,    ata_isa_probe),
     DEVMETHOD(device_attach,   ata_attach),
     DEVMETHOD(device_resume,   ata_resume),
+    DEVMETHOD(device_suspend,  ata_suspend),
     { 0, 0 }
 };
 
index f053024..2a066ba 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ata/ata-pci.c,v 1.32.2.15 2003/06/06 13:27:05 fjoe Exp $
- * $DragonFly: src/sys/dev/disk/ata/ata-pci.c,v 1.23 2006/09/05 00:55:37 dillon Exp $
+ * $DragonFly: src/sys/dev/disk/ata/ata-pci.c,v 1.24 2006/10/12 04:02:37 y0netan1 Exp $
  */
 
 #include <sys/param.h>
@@ -958,6 +958,7 @@ static device_method_t ata_pcisub_methods[] = {
     DEVMETHOD(device_attach,   ata_attach),
     DEVMETHOD(device_detach,   ata_detach),
     DEVMETHOD(device_resume,   ata_resume),
+    DEVMETHOD(device_suspend,  ata_suspend),
     { 0, 0 }
 };