atacontrol kernel crash (atausb?)
Hans Petter Selasky
hselasky at c2i.net
Mon Jan 15 12:32:17 UTC 2007
On Monday 15 January 2007 12:22, Pietro Cerutti wrote:
> Hello,
> this is a reproducible kernel page-fault crash on stable as of 1h ago:
>
> FreeBSD gahrtop.localhost 6.2-STABLE FreeBSD 6.2-STABLE #4: Mon Jan 15
> 11:24:56 CET 2007
> root at gahrtop.localhost:/usr/obj/usr/src/sys/GAHRTOP i386
>
> 1) atacontrol list
> ATA channel 0:
> Master: ad0 <FUJITSU MHW2120BH/00000012> Serial ATA v1.0
> Slave: no device present
> ATA channel 1:
> Master: no device present
> Slave: acd0 <HL-DT-ST DVDRAM GSA-T10N/PA02> ATA/ATAPI revision 5
>
> 2) -> plug in USB stick (microspot 256MB USB2.0)
>
> 3) atacontrol list
> ATA channel 0:
> Master: ad0 <FUJITSU MHW2120BH/00000012> Serial ATA v1.0
> Slave: no device present
> ATA channel 1:
> Master: no device present
> Slave: acd0 <HL-DT-ST DVDRAM GSA-T10N/PA02> ATA/ATAPI revision 5
> ATA channel 2:
> Master: no device present
> Slave: no device present
>
> 4) atacontrol attach ata2
This is a known issue that SOS should fix. If you look into the code of
"ata_attach()" you will see that it tries to do things that are not allowed
by USB devices, like allocating an IRQ:
int
ata_attach(device_t dev)
{
struct ata_channel *ch = device_get_softc(dev);
int error, rid;
/* check that we have a virgin channel to attach */
if (ch->r_irq)
return EEXIST;
/* initialize the softc basics */
ch->dev = dev;
ch->state = ATA_IDLE;
bzero(&ch->state_mtx, sizeof(struct mtx));
mtx_init(&ch->state_mtx, "ATA state lock", NULL, MTX_DEF);
bzero(&ch->queue_mtx, sizeof(struct mtx));
mtx_init(&ch->queue_mtx, "ATA queue lock", NULL, MTX_DEF);
TAILQ_INIT(&ch->ata_queue);
/* reset the controller HW, the channel and device(s) */
while (ATA_LOCKING(dev, ATA_LF_LOCK) != ch->unit)
tsleep(&error, PRIBIO, "ataatch", 1);
ATA_RESET(dev);
ATA_LOCKING(dev, ATA_LF_UNLOCK);
/* setup interrupt delivery */
rid = ATA_IRQ_RID;
ch->r_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
RF_SHAREABLE | RF_ACTIVE);
if (!ch->r_irq) {
device_printf(dev, "unable to allocate interrupt\n");
return ENXIO;
}
if ((error = bus_setup_intr(dev, ch->r_irq, ATA_INTR_FLAGS,
(driver_intr_t *)ata_interrupt, ch, &ch->ih)))
{
device_printf(dev, "unable to setup interrupt\n");
return error;
}
/* probe and attach devices on this channel unless we are in early boot */
if (!ata_delayed_attach)
ata_identify(dev);
return 0;
}
Same with "ata_detach()".
>
> last one: why atausb doesn't have a manual page??
Probably the device driver is too new.
--HPS
More information about the freebsd-hackers
mailing list