Date: Tue, 19 Nov 2002 14:11:44 +0100 From: Thomas Quinot <thomas@FreeBSD.ORG> To: Christian Brueffer <chris@unixpages.org> Cc: Thomas Quinot <thomas@FreeBSD.ORG>, freebsd-stable@FreeBSD.ORG Subject: Re: apm suspend/resume panic - atapicam related Message-ID: <20021119131144.GA30227@melusine.cuivre.fr.eu.org> In-Reply-To: <20021119122549.GJ11536@unixpages.org> References: <20021117032558.GF11536@unixpages.org> <20021117230520.GB31217@melusine.cuivre.fr.eu.org> <20021118135148.GH11536@unixpages.org> <20021118171053.GA82889@melusine.cuivre.fr.eu.org> <20021119122549.GJ11536@unixpages.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Le 2002-11-19, Christian Brueffer écrivait :
> The panic also appears with atapicam enabled and atapicd disabled.
> Here's a panic from a kernel with your patch:
Thanks, this is very useful information. I think I am beginning to
understand what is going on. Please try the patch below.
> ata0: resetting ata ch=0xc15a9000, dev=1 .. ndev=1 done
> ata1: resetting ata ch=0xc15d0f00, dev=4 .. ndev=c ata1-slave: ATAPI identify retries exceeded
Here we have a 'ghost' device that appears at the ata1 slave position,
but since there is no actual device replying there, the structures that
describe that device are left in an inconsistent state (specifically,
the devices field in the struct ata_channel will flag the device as
present, but the corresponding struct ata_device won't be correctly
initialized).
This is not fatal with atapicd because in such case, it simply won't
attach the acd driver, but on the other hand atapicam relies on the
devices field of struct ata_channel to describe actually present,
correctly initialized devices.
Thomas.
Index: ata-all.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ata/ata-all.c,v
retrieving revision 1.50.2.42
diff -u -r1.50.2.42 ata-all.c
--- ata-all.c 1 Nov 2002 22:04:06 -0000 1.50.2.42
+++ ata-all.c 19 Nov 2002 13:05:07 -0000
@@ -872,8 +872,9 @@
ATA_FORCELOCK_CH(ch, ATA_CONTROL);
ch->running = NULL;
devices = ch->devices;
- ata_printf(ch, -1, "resetting devices .. ");
+ ata_printf(ch, -1, "resetting ata ch=%p, dev=%x .. ", ch, ch->devices);
ata_reset(ch);
+ printf (" ndev=%x ", ch->devices);
if ((misdev = devices & ~ch->devices)) {
if (misdev)
@@ -904,17 +905,18 @@
if ((newdev = ~devices & ch->devices)) {
if (newdev & ATA_ATA_MASTER)
if (ata_getparam(&ch->device[MASTER], ATA_C_ATA_IDENTIFY))
- newdev &= ~ATA_ATA_MASTER;
+ ch->devices &= ~ATA_ATA_MASTER;
if (newdev & ATA_ATA_SLAVE)
if (ata_getparam(&ch->device[SLAVE], ATA_C_ATA_IDENTIFY))
- newdev &= ~ATA_ATA_SLAVE;
+ ch->devices &= ~ATA_ATA_SLAVE;
if (newdev & ATA_ATAPI_MASTER)
if (ata_getparam(&ch->device[MASTER], ATA_C_ATAPI_IDENTIFY))
- newdev &= ~ATA_ATAPI_MASTER;
+ ch->devices &= ~ATA_ATAPI_MASTER;
if (newdev & ATA_ATAPI_SLAVE)
if (ata_getparam(&ch->device[SLAVE], ATA_C_ATAPI_IDENTIFY))
- newdev &= ~ATA_ATAPI_SLAVE;
+ ch->devices &= ~ATA_ATAPI_SLAVE;
}
+ newdev = ~devices & ch->devices;
if (!misdev && newdev)
printf("\n");
#if NATADISK > 0
--
Thomas.Quinot@Cuivre.FR.EU.ORG
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021119131144.GA30227>
