Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Jan 2007 13:31:45 +0100
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        freebsd-hackers@freebsd.org
Cc:        freebsd-stable@freebsd.org, Pietro Cerutti <pietro.cerutti@gmail.com>
Subject:   Re: atacontrol kernel crash (atausb?)
Message-ID:  <200701151331.47185.hselasky@c2i.net>
In-Reply-To: <e572718c0701150322o38d463a0qc8ccca55a508e871@mail.gmail.com>
References:  <e572718c0701150322o38d463a0qc8ccca55a508e871@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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



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