Re: Notebook disk spindown

From: Alan Cox (alan@lxorguk.ukuu.org.uk)
Date: Sat Sep 09 2000 - 09:29:12 EST


> I have and offered it to the folks at linuxcare the apmd guys.
> The ideas were to create an ioctl pair that would/could knock-out a drive
> and preserve the settings, because the reset command to wake it up flushes
> the settings. Thus after the wakeup reset, and a checkpower-loop for
> ready-status in a passive drive query, the completion of the command would
> set the drive and host back to pre- suspend/hibernate mode.

Something like

        CASIO FIVA $B$G%O%$%P!<%M!<%7%g%s$r2DG=$K$9$k(B patch
                Ver. 1.01, for Linux kernel-2.2.13

Copyright (C) 1999 INOUE, Yoshinari e-mail: pf5y-inue@asahi-net.or.jp

(This is an excerpt for the IDE bits)

--- linux/arch/i386/kernel/apm.c.org Wed Nov 24 17:43:08 1999
+++ linux/arch/i386/kernel/apm.c Wed Nov 24 17:43:18 1999
@@ -779,6 +779,12 @@
         unsigned long flags;
         int err;
 
+ if (ide_disk_suspend()) {
+ printk(KERN_NOTICE "apm: suspend: reset disk failed\n");
+ apm_set_power_state(APM_STATE_REJECT);
+ return;
+ }
+
 #ifndef CONFIG_APM_RTC_IS_GMT
         /*
          * Estimate time zone so that set_time can update the clock
@@ -807,6 +813,7 @@
         restore_flags(flags);
 #endif
         set_time();
+ ide_disk_resume();
 }
 
 static void standby(void)
--- linux/drivers/block/ide-disk.c.org Wed Nov 24 17:42:23 1999
+++ linux/drivers/block/ide-disk.c Thu Nov 25 12:43:10 1999
@@ -52,6 +52,13 @@
 
 #include "ide.h"
 
+#ifdef CONFIG_APM
+#include <linux/apm_bios.h>
+
+static ide_drive_t *hda = 0;
+static int mult_count = -1;
+#endif
+
 static void idedisk_bswap_data (void *buffer, int wcount)
 {
         u16 *p = buffer;
@@ -814,6 +821,10 @@
                         continue;
                 }
                 idedisk_setup(drive);
+#ifdef CONFIG_APM
+ if (!hda)
+ hda = drive;
+#endif
                 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
                         printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", drive->name, drive->head);
                         (void) idedisk_cleanup(drive);
@@ -825,6 +836,39 @@
         MOD_DEC_USE_COUNT;
         return 0;
 }
+#ifdef CONFIG_APM
+
+int ide_disk_suspend(void)
+{
+ int error, retry = 5;
+
+ if (!hda)
+ return (0);
+ mult_count = hda->mult_count;
+ if (mult_count == hda->id->max_multsect) {
+ mult_count = -1;
+ return (0);
+ }
+ while (retry-- > 0) {
+ error = set_multcount(hda, hda->id->max_multsect);
+ if (!error)
+ return (0);
+ }
+ return (error);
+}
+
+void ide_disk_resume(void)
+{
+ int retry = 5;
+
+ if (mult_count >= 0)
+ while (retry-- > 0)
+ if (set_multcount(hda, mult_count) == 0)
+ break;
+ mult_count = -1;
+ return;
+}
+#endif
 
 #ifdef MODULE
 int init_module (void)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Sep 15 2000 - 21:00:12 EST