Date: Thu, 23 Aug 2001 10:16:02 -0700 From: Scott Renfro <scott@renfro.org> To: JT <luser@ahab.com> Cc: Nick Sayer <nsayer@quack.kfu.com>, mobile@FreeBSD.ORG Subject: Re: ATA idle spindown patch. Message-ID: <20010823101602.F31614@bonsai.home.renfro.org> In-Reply-To: <20010822235650.C410@zed.unbeat.com>; from luser@ahab.com on Wed, Aug 22, 2001 at 11:56:50PM -0400 References: <200107280841.f6S8fvR80063@freebsd.dk> <3B6354F9.2070801@quack.kfu.com> <3B635732.6030409@quack.kfu.com> <20010822235650.C410@zed.unbeat.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Wed, Aug 22, 2001 at 11:56:50PM -0400, JT wrote:
>
> I tried the patch with this modification, but I haven't noticed it spin down
> at all, not that I'm very patient (though I *can* verify sysctl
> hw.ata.suspend=300). I haven't the knowledge to really understand how this
> patch works, but:
Attached is the modified sysctl patch that I've been applying as part of
each buildworld/kernel cycle. I'm running with a value of 120; much
less than 120 and I tend to get cycling (up-down-up-down, etc.). It's
been working great.
> a) What stuff could keep the drive from spinning down? I can think of
> i) cron?
> ii) fetchmail?
> iii) ???
Also syslog. I've appended the list of processes I have running right
now and the drive has stayed spun down just fine.
> b) What would it take to write a userland program that could request
> an immediate spindown (even if suid)?
I have a patch for this as well, but it is much more involved. Requires
an ataioctl and requires more diligence in implementation to ensure that
a suspend command isn't sent to the device in the middle of other
operations.
The sysctl approach is working well for me. I'm willing to wait
patiently for Soren to have the time to get the ioctl done right.
--Scott
Here's the uniq'd list of processes running on my (spundown) laptop
right now...
(bufdaemon) (pagedaemon) (swapper) (syncer)
(vmdaemon) X _su adjkerntz
apmd aterm bash bbapm
bbkeys bbrun blackbox cfsd
dhclient getty init lpd
micro_inetd mountd moused mutt
pccardd portmap sh smbd
ssh syslogd uniq usbd
xautolock xconsole xdm xemacs
--
Scott Renfro <scott@renfro.org> +1 650 862 4206
[-- Attachment #2 --]
--- sys/dev/ata/ata-disk.c.orig Thu Jul 26 14:54:54 2001
+++ sys/dev/ata/ata-disk.c Wed Aug 1 01:48:06 2001
@@ -86,9 +86,11 @@
static int ata_dma = 1;
static int ata_wc = 1;
static int ata_tags = 0;
+static int ata_suspend = 0;
TUNABLE_INT("hw.ata.ata_dma", &ata_dma);
TUNABLE_INT("hw.ata.wc", &ata_wc);
TUNABLE_INT("hw.ata.tags", &ata_tags);
+TUNABLE_INT("hw.ata.suspend", &ata_suspend);
/* sysctl vars */
SYSCTL_DECL(_hw_ata);
@@ -98,6 +100,8 @@
"ATA disk write caching");
SYSCTL_INT(_hw_ata, OID_AUTO, tags, CTLFLAG_RD, &ata_tags, 0,
"ATA disk tagged queuing support");
+SYSCTL_INT(_hw_ata, OID_AUTO, suspend, CTLFLAG_RD, &ata_suspend, 0,
+ "ATA disk suspend timer (secs)");
/* defines */
#define AD_MAX_RETRIES 3
@@ -182,6 +186,12 @@
0, 0, 0, 0, ATA_C_F_DIS_SRVIRQ, ATA_WAIT_INTR))
printf("ad%d: disabling service interrupt failed\n", adp->lun);
}
+ if ( ata_suspend > 0 ) {
+ /* attempt suspend mode. The drive uses increments of ten seconds */
+ if (ata_command(adp->controller, adp->unit, 0xe2,
+ 0, 0, 0, ata_suspend/10, 0, ATA_WAIT_INTR))
+ printf("ad%d: suspend mode failed\n", adp->lun);
+ }
devstat_add_entry(&adp->stats, "ad", adp->lun, DEV_BSIZE,
DEVSTAT_NO_ORDERED_TAGS,
@@ -897,6 +907,13 @@
ata_wmode(AD_PARAM), ata_umode(AD_PARAM));
else
ata_dmainit(adp->controller, adp->unit, ata_pmode(AD_PARAM), -1, -1);
+ if ( ata_suspend > 0 ) {
+ /* attempt suspend mode. The drive uses increments of ten seconds */
+ if (ata_command(adp->controller, adp->unit, 0xe2,
+ 0, 0, 0, ata_suspend/10, 0, ATA_WAIT_READY))
+ printf("ad%d: suspend mode failed\n", adp->lun);
+ }
+
}
static int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010823101602.F31614>
