DELAY() woes

Lucius Windschuh lwindschuh at googlemail.com
Wed Oct 3 03:17:40 PDT 2007


Hi,
I'm using FreeBSD -CURRENT as of October the 2nd and ran into some
troubles with ACPI suspend on my Thinkpad T41. It is patched with
Ariff's vpc patch and the one from PR kern/114649. My kernel config is
GENERIC with SCHED_ULE instead of SCHED_4BSD and without WITNESS.

On resuming from ACPI S3, I got: "ad0: detached"
Some googling led me to
http://lists.freebsd.org/pipermail/freebsd-current/2007-February/069214.html
Alex sent me his solution:

--- sys/dev/ata/ata-all.c-orig  2007-10-03 00:03:11.000000000 +0200
+++ sys/dev/ata/ata-all.c       2007-10-03 00:10:10.000000000 +0200
@@ -295,6 +295,9 @@
     struct ata_channel *ch;
     int error;

+               device_printf(dev, " a small delay to wait until the
disk is ready\n");
+               ata_udelay(2000000);
+
     /* check for valid device */
     if (!dev || !(ch = device_get_softc(dev)))
        return ENXIO;

I tried it and nothing changed (except the new log message about the
"small delay" of 2 seconds;) ). Enlarging the delay to 10 seconds
showed: DELAY(10000000) took only an unnoticable amount of time
instead of 10 sec.
Exchanging DELAY(10000000) with pause("atares", hz*10) gave the desired effect.
Knowing this, I removed the extra lines above and changed ata_udelay
so that it uses pause() for delays <= 100 ms instead of DELAY().
This solved the "ad0: detached" problems on ACPI S3 resume (now, I can
see the 100 ms delays when probing the ATA devices in
ata_generic_reset()).

So now I'm confused about DELAY(). It seems to behave strange
shortly after resuming, and "normalizes" its behaviour later on.
Is this a known problem?

Greetings,

Lucius


More information about the freebsd-current mailing list