[PATCH] ATA disk spin-down for -current
Michael Collette
metrol at metrol.net
Sat Apr 12 16:11:45 PDT 2003
I was thinking my suspend mode problems on my Thinkpad T23 were behind me here
on FreeBSD 4.8. Been going weeks without having a glitch, then just last
night...
Put my lappy into suspend mode. Unplugged my cabling to take it into the
other room to read some PDF's I had just downloaded. Opened the lid, and it
glitched on me. I should note that I was going from being plugged in to
operating on battery.
I never do see anything in any of the logs. When it glitches I see my KDE
desktop for about 30 seconds totally frozen. Then this thing just does a
hard reboot on its own. Tons of fsck fun on the following boot.
Unfortunately this is extremely difficult to reproduce. I don't know what
kind of impact your patch will have on 5-CURRENT, but it would appear that
under 4-STABLE there is still a problem here.
Later on,
Cliff L. Biffle wrote:
> Allo all. I've ported the 4.x patch that enabled ATA disk spin-down to
> the
> 5.x kernel. (It looks like it'd also work on recent 4.x.) Since I got
> the original patch out of this list's archives, I thought I'd send it
> back.
>
> Basically this just updates the ata_command calls to the new LBA format
> rather than the older C/H/S.
>
> I'm relatively unfamiliar with the ATA subsystem, and I -think- putting
> the
> suspend call after ATA_UNLOCK_CH is correct. If anyone knows better, let
> me know.
>
> Anyway, I've been using this on my laptop with great success. Suspend
> time is set (in seconds) in hw.ata.suspend; this must be done at boot in
> loader.conf, as it's read-only at runtime.
>
> Comments? Corrections?
>
> -Cliff L. Biffle
>
> --- src/sys/dev/ata/ata-disk.c.orig Fri Apr 11 12:50:37 2003
> +++ src/sys/dev/ata/ata-disk.c Fri Apr 11 13:05:54 2003
> @@ -70,9 +70,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);
> static MALLOC_DEFINE(M_AD, "AD driver", "ATA disk driver");
>
> /* sysctl vars */
> @@ -83,6 +85,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");
>
> void
> ad_attach(struct ata_device *atadev)
> @@ -185,6 +189,12 @@
> #endif
> ATA_UNLOCK_CH(atadev->channel);
>
> + if(ata_suspend > 0) {
> + /* attempt suspend mode. The drive uses increments of ten seconds */
> + if(ata_command(atadev, 0xe2, 0, ata_suspend/10, 0, ATA_WAIT_INTR))
> + ata_prtdev(atadev, "suspend mode failed.");
> + }
> +
> adp->disk.d_open = adopen;
> adp->disk.d_close = adclose;
> adp->disk.d_strategy = adstrategy;
> @@ -856,6 +866,11 @@
> ata_command(atadev, ATA_C_SET_MULTI, 0,
> adp->transfersize / DEV_BSIZE, 0, ATA_WAIT_READY);
> atadev->setmode(atadev, adp->device->mode);
> + if(ata_suspend > 0) {
> + /* attempt suspend mode. The drive uses increments of ten seconds */
> + if(ata_command(atadev, 0xe2, 0, ata_suspend/10, 0, ATA_WAIT_READY))
> + ata_prtdev(atadev, "suspend mode failed.");
> + }
> }
>
> void
>
> _______________________________________________
> freebsd-mobile at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-mobile
> To unsubscribe, send any mail to "freebsd-mobile-unsubscribe at freebsd.org"
--
"Outside of a dog, a book is man's best friend. Inside of a dog, it's too dark
to read."
- Groucho Marx
More information about the freebsd-mobile
mailing list