From 8520e7cbc1c74887ef634e1af7c57fdc54c4f159 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Thu, 3 Apr 1997 09:43:50 +0000 Subject: [PATCH] If flag 0x4000 (Sleephack) is defined, assume that the disk is sleeping if all registers are 0xff. This allows me to run with flags 0xc0ff on my IBM-DMCA-21440 disk, which gives 5MB/sec sequential read :-) If you have a laptop, try adding flag 0x4000 to your disk, and tell me if it makes any difference for you. --- sys/i386/isa/wd.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/sys/i386/isa/wd.c b/sys/i386/isa/wd.c index 3ce9fb5ea9b..401a35f8c7c 100644 --- a/sys/i386/isa/wd.c +++ b/sys/i386/isa/wd.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)wd.c 7.2 (Berkeley) 5/9/91 - * $Id: wd.c,v 1.126 1997/03/11 23:17:04 se Exp $ + * $Id: wd.c,v 1.127 1997/03/24 11:24:12 bde Exp $ */ /* TODO: @@ -1392,9 +1392,41 @@ wdcommand(struct disk *du, u_int cylinder, u_int head, u_int sector, u_int wdc; wdc = du->dk_port; - if (du->cfg_flags & WDOPT_SLEEPHACK) - if(inb(wdc + wd_status) == WDCS_BUSY) + if (du->cfg_flags & WDOPT_SLEEPHACK) { + /* OK, so the APM bios has put the disk into SLEEP mode, + * how can we tell ? Uhm, we can't. There is no + * standardized way of finding out, and the only way to + * wake it up is to reset it. Bummer. + * + * All the many and varied versions of the IDE/ATA standard + * explicitly tells us not to look at these registers if + * the disk is in SLEEP mode. Well, too bad really, we + * have to find out if it's in sleep mode before we can + * avoid reading the registers. + * + * I have reason to belive that most disks will return + * either 0xff or 0x00 in all but the status register + * when in SLEEP mode, but I have yet to see one return + * 0x00, so we don't check for that yet. + * + * The check for WDCS_BUSY is for the case where the + * bios spins up the disk for us, but doesn't initialize + * it correctly /phk + */ + if(inb(wdc + wd_precomp) + inb(wdc + wd_cyl_lo) + + inb(wdc + wd_cyl_hi) + inb(wdc + wd_sdh) + + inb(wdc + wd_sector) + inb(wdc + wd_seccnt) == 6 * 0xff) { + if (bootverbose) + printf("wd(%d,%d): disk aSLEEP\n", + du->dk_ctrlr, du->dk_unit); wdunwedge(du); + } else if(inb(wdc + wd_status) == WDCS_BUSY) { + if (bootverbose) + printf("wd(%d,%d): disk is BUSY\n", + du->dk_ctrlr, du->dk_unit); + wdunwedge(du); + } + } if (wdwait(du, 0, TIMEOUT) < 0) return (1); -- 2.45.2