From owner-freebsd-mobile Tue Jul 24 15:16:54 2001 Delivered-To: freebsd-mobile@freebsd.org Received: from tabby.kudra.com (gw.kudra.com [199.6.32.20]) by hub.freebsd.org (Postfix) with ESMTP id D87D737B406 for ; Tue, 24 Jul 2001 15:16:49 -0700 (PDT) (envelope-from robert@tabby.kudra.com) Received: (from robert@localhost) by tabby.kudra.com (8.11.4/8.11.3) id f6OMGn161710 for freebsd-mobile@freebsd.org; Tue, 24 Jul 2001 18:16:49 -0400 (EDT) (envelope-from robert) Date: Tue, 24 Jul 2001 18:16:49 -0400 From: Robert Sexton To: freebsd-mobile@freebsd.org Subject: ATA idle spindown patch. Message-ID: <20010724181649.A61408@kudra.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="KsGdsel6WgEHnImy" Content-Disposition: inline User-Agent: Mutt/1.2.5i Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org --KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline A few months ago, there was a discussion on how to get laptop hard drives to spin down, and there was talk that maybe Soren was going to add it to atacontrol. Its been a while. He's busy :-) So heres a patch to implement it, hopefully the 'Right Way' (tm), but without the bells and whistles. Set hw.ata.suspend in /boot/loader.conf: hw.ata.suspend=300. (Choose your preferred idle time, or course) The default is not to even attempt to try setting the idle timer on the drive. So it should be harmless if not used. There are other wrinkles with altering the syncer to behave a little better, but a really useful solution is complicated. Season to taste. I would appreciate knowing if it works on machines with multiple drives, and especially any tricks people may have found for getting hard drives to stay quiet. ssh always seems to wake mine up. Needless to say, it applies to -CURRENT, although I've been using it for a while. -- Robert Sexton - robert@kudra.com, Cincinnati OH, USA Build a man a fire, and he's warm for the rest of the night. Set a man on fire, and he's warm for the rest of his life - Terry Pratchett, "Jingo" --KsGdsel6WgEHnImy Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ata.patch" *** dev/ata/ata-disk.c.orig Fri Jun 8 07:24:13 2001 --- dev/ata/ata-disk.c Mon Jul 23 15:03:07 2001 *************** *** 85,93 **** --- 85,95 ---- static int ata_dma = 1; static int ata_wc = 0; 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); *************** *** 97,102 **** --- 99,106 ---- "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"); /* defines */ #define AD_MAX_RETRIES 3 *************** *** 182,187 **** --- 186,198 ---- 0, 0, 0, 0, ATA_C_F_DIS_SRVIRQ, ATA_WAIT_INTR)) ata_printf(scp, device, "disabling service interrupt failed\n"); } + + 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, --KsGdsel6WgEHnImy-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message