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>