Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 May 2009 14:25:01 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-acpi@freebsd.org
Cc:        Alexander Motin <mav@FreeBSD.org>
Subject:   Re: Fwd: Kernel panic on 7.2-RC1 when booting with ACPI enabled kernel.
Message-ID:  <200905111425.01887.jhb@freebsd.org>
In-Reply-To: <43b1bb350905011230p1372e1ffw5ab61985e7672e19@mail.gmail.com>
References:  <43b1bb350904230622u4b7790f0p9f665b649c97a3b@mail.gmail.com> <200905011450.13899.jhb@freebsd.org> <43b1bb350905011230p1372e1ffw5ab61985e7672e19@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday 01 May 2009 3:30:28 pm Magnus Kling wrote:
> 2009/5/1 John Baldwin <jhb@freebsd.org>
>=20
> > On Friday 01 May 2009 2:30:28 pm Magnus Kling wrote:
> > > 2009/4/30 John Baldwin <jhb@freebsd.org>
> > >
> > > > On Saturday 25 April 2009 6:27:23 am Magnus Kling wrote:
> > > > > 2009/4/24 John Baldwin <jhb@freebsd.org>
> > > > > > Can you do 'frame 10' followed by 'p *(struct acpi_pci_devinfo
> > > > > > *)child->ivars'
> > > > > >
> > > > > > --
> > > > > > John Baldwin
> > > > >
> > > > >
> > > > > Sure, no problem. This is a none critical server so I can do alot=
 of
> > > > > debugging and testing if that is needed.
> > > > >
> > > > >
> > > > > (kgdb) frame 10
> > > > > #10 0xc0db4ca8 in acpi_pci_child_location_str_method
> > (cbdev=3D0xc2212680,
> > > > >     child=3D0xc2243400, buf=3D0xc22c2400 "slot=3D0 function=3D0 h=
andle=3D",
> > > > > buflen=3D1024)
> > > > >     at
> > /usr/src/sys/modules/acpi/acpi/../../../dev/acpica/acpi_pci.c:150
> > > > > 150             strlcat(buf, acpi_name(dinfo->ap_handle), buflen);
> > > > >
> > > > > (kgdb)  p *(struct acpi_pci_devinfo *)child->ivars
> > > > > $1 =3D {ap_dinfo =3D {pci_links =3D {stqe_next =3D 0xc0b00f8c}, r=
esources =3D {
> > > > >       stqh_first =3D 0xc0b00f8c, stqh_last =3D 0x1030000}, cfg =
=3D {dev =3D
> > 0x0,
> > > > >       bar =3D {4, 0, 0, 3257136600, 0, 0}, bios =3D 0, subvendor =
=3D 0,
> > > > >       subdevice =3D 0, vendor =3D 0, device =3D 0, cmdreg =3D 0, =
statreg =3D 0,
> > > > >       baseclass =3D 0 '\0', subclass =3D 0 '\0', progif =3D 0 '\0=
', revid =3D
> > 0
> > > >
> > > > Hmm, this is all completely wrong and trashed.  What if you do 'p
> > *child'?
> > > >
> > > > --
> > > > John Baldwin
> > > >
> > > (kgdb) p *child
> > > $2 =3D {ops =3D 0xc2161800, link =3D {tqe_next =3D 0xc2243380, tqe_pr=
ev =3D
> > > 0xc2243484}, devlink =3D {tqe_next =3D 0xc2243380, tqe_prev =3D 0xc22=
4348c},
> > >   parent =3D 0xc2212680, children =3D {tqh_first =3D 0xc2262880, tqh_=
last =3D
> > > 0xc2262704}, driver =3D 0xc0b7066c, devclass =3D 0xc211e240, unit =3D=
 0,
> > >   nameunit =3D 0xc2241640 "atapci0", desc =3D 0xc223f900 "Promise PDC=
20621
> > > UDMA100 controller", busy =3D 0, state =3D DS_ATTACHED, devflags =3D =
0,
> > >   flags =3D 13, order =3D 0 '\0', pad =3D 0 '\0', ivars =3D 0xc223f5c=
0, softc =3D
> > > 0xc2244800, sysctl_ctx =3D {tqh_first =3D 0xc2264380, tqh_last =3D 0x=
c2241594},
> > >   sysctl_tree =3D 0xc223f840}
> > > (kgdb)
> >
> > Maybe try adding KTR traces for all calls to device_set_ivars().  I won=
der
> > if
> > something is trashing this device's ivars.
> >
> > Oh, dear.  The ata(4) driver overwrites the ivars of some PCI devices it
> > attaches to.  This is very, very wrong.  Which ATA controller do you ha=
ve?
> >
> > --
> > John Baldwin
> >
>=20
> Aha, I=B4m using a Promise Fasttrack SX4000 for a RAID1 setup. And the one
> included on the motherboard for the OS.
> And yes, I can confirm that without the Fasttrack SX4000 the system boots=
 up
> correctly. (Pulled out the card and edited fstab.)
> So you are right regarding that the ata driver messes something up. Do you
> contact someone that is responsible for ata driver?
>=20
> Thank you for taking the time to "correct" this,

Can you please try this patch?

=2D-- //depot/vendor/freebsd/src/sys/dev/ata/ata-pci.h	2009/03/30 22:20:14
+++ //depot/user/jhb/acpipci/dev/ata/ata-pci.h	2009/05/08 20:27:43
@@ -66,6 +66,7 @@
     void                (*function)(void *);
     void                *argument;
     } interrupt[8];     /* XXX SOS max ch# for now */
+    void                *chipset_data;
 };
=20
 /* defines for known chipset PCI id's */
=2D-- //depot/vendor/freebsd/src/sys/dev/ata/chipsets/ata-acard.c	2009/02/1=
9 00:35:16
+++ //depot/user/jhb/acpipci/dev/ata/chipsets/ata-acard.c	2009/05/08 20:27:=
43
@@ -51,6 +51,12 @@
 #include <dev/ata/ata-pci.h>
 #include <ata_if.h>
=20
+struct ata_serialize {
+    struct mtx  locked_mtx;
+    int         locked_ch;
+    int         restart_ch;
+};
+
 /* local prototypes */
 static int ata_acard_chipinit(device_t dev);
 static int ata_acard_ch_attach(device_t dev);
@@ -58,6 +64,7 @@
 static void ata_acard_850_setmode(device_t dev, int mode);
 static void ata_acard_86X_setmode(device_t dev, int mode);
 static int ata_serialize(device_t dev, int flags);
+static void ata_serialize_init(struct ata_serialize *serial);
=20
 /* misc defines */
 #define ATP_OLD		1
@@ -93,6 +100,7 @@
 ata_acard_chipinit(device_t dev)
 {
     struct ata_pci_controller *ctlr =3D device_get_softc(dev);
+    struct ata_serialize *serial;
=20
     if (ata_setup_interrupt(dev, ata_generic_intr))
 	return ENXIO;
@@ -100,8 +108,12 @@
     ctlr->ch_attach =3D ata_acard_ch_attach;
     ctlr->ch_detach =3D ata_pci_ch_detach;
     if (ctlr->chip->cfg1 =3D=3D ATP_OLD) {
=2D	ctlr->setmode =3D ata_acard_850_setmode;
+	ctlr->setmode =3D ata_acard_850_setmode;=09
 	ctlr->locking =3D ata_serialize;
+	serial =3D malloc(sizeof(struct ata_serialize),
+			      M_TEMP, M_WAITOK | M_ZERO);
+	ata_serialize_init(serial);
+	ctlr->chipset_data =3D serial;
     }
     else
 	ctlr->setmode =3D ata_acard_86X_setmode;
@@ -225,11 +237,14 @@
     /* we could set PIO mode timings, but we assume the BIOS did that */
 }
=20
=2Dstruct ata_serialize {
=2D    struct mtx  locked_mtx;
=2D    int         locked_ch;
=2D    int         restart_ch;
=2D};
+static void
+ata_serialize_init(struct ata_serialize *serial)
+{
+
+    mtx_init(&serial->locked_mtx, "ATA serialize lock", NULL, MTX_DEF);=20
+    serial->locked_ch =3D -1;
+    serial->restart_ch =3D -1;
+}
=20
 static int
 ata_serialize(device_t dev, int flags)
@@ -237,20 +252,9 @@
     struct ata_pci_controller *ctlr =3D device_get_softc(device_get_parent=
(dev));
     struct ata_channel *ch =3D device_get_softc(dev);
     struct ata_serialize *serial;
=2D    static int inited =3D 0;
     int res;
=20
=2D    if (!inited) {
=2D	serial =3D malloc(sizeof(struct ata_serialize),
=2D			      M_TEMP, M_NOWAIT | M_ZERO);
=2D	mtx_init(&serial->locked_mtx, "ATA serialize lock", NULL, MTX_DEF);=20
=2D	serial->locked_ch =3D -1;
=2D	serial->restart_ch =3D -1;
=2D	device_set_ivars(ctlr->dev, serial);
=2D	inited =3D 1;
=2D    }
=2D    else
=2D	serial =3D device_get_ivars(ctlr->dev);
+    serial =3D ctlr->chipset_data;
=20
     mtx_lock(&serial->locked_mtx);
     switch (flags) {
=2D-- //depot/vendor/freebsd/src/sys/dev/ata/chipsets/ata-promise.c	2009/03=
/30 22:20:14
+++ //depot/user/jhb/acpipci/dev/ata/chipsets/ata-promise.c	2009/05/08 20:2=
7:43
@@ -283,7 +283,7 @@
 	    mtx_init(&hpkt->mtx, "ATA promise HPKT lock", NULL, MTX_DEF);
 	    TAILQ_INIT(&hpkt->queue);
 	    hpkt->busy =3D 0;
=2D	    device_set_ivars(dev, hpkt);
+	    ctlr->chipset_data =3D hpkt;
 	    ctlr->ch_attach =3D ata_promise_mio_ch_attach;
 	    ctlr->ch_detach =3D ata_promise_mio_ch_detach;
 	    ctlr->reset =3D ata_promise_mio_reset;
@@ -730,7 +730,7 @@
     case PR_SX4X:
=20
 	/* softreset channel ATA module */
=2D	hpktp =3D device_get_ivars(ctlr->dev);
+	hpktp =3D ctlr->chipset_data;
 	ATA_OUTL(ctlr->r_res2, 0xc0260 + (ch->unit << 7), ch->unit + 1);
 	ata_udelay(1000);
 	ATA_OUTL(ctlr->r_res2, 0xc0260 + (ch->unit << 7),
@@ -1208,7 +1208,7 @@
 static void
 ata_promise_queue_hpkt(struct ata_pci_controller *ctlr, u_int32_t hpkt)
 {
=2D    struct ata_promise_sx4 *hpktp =3D device_get_ivars(ctlr->dev);
+    struct ata_promise_sx4 *hpktp =3D ctlr->chipset_data;
=20
     mtx_lock(&hpktp->mtx);
     if (hpktp->busy) {
@@ -1227,7 +1227,7 @@
 static void
 ata_promise_next_hpkt(struct ata_pci_controller *ctlr)
 {
=2D    struct ata_promise_sx4 *hpktp =3D device_get_ivars(ctlr->dev);
+    struct ata_promise_sx4 *hpktp =3D ctlr->chipset_data;
     struct host_packet *hp;
=20
     mtx_lock(&hpktp->mtx);

=2D-=20
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905111425.01887.jhb>