[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [help] mesh - target 0 aborted



>
>After applying the patch from velco, my mesh_init looks like this:
>
>static void mesh_init(struct mesh_state *ms)
>{
>    volatile struct mesh_regs *mr = ms->mesh;
>    volatile struct dbdma_regs *md = ms->dma;
>
>    udelay(100);
>
>    out_8(&mr->exception, 0xff);	/* clear all exception bits */
>    out_8(&mr->error, 0xff);	/* clear all error bits */
>    out_8(&mr->sequence, SEQ_RESETMESH);
>
>    /* flush write buffers.. How?
>       in_8(&mr->sequence); ??  */
>    udelay(10);
>
>    out_8(&mr->interrupt, 0xff);	/* clear all interrupt bits */
>    out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
>    out_8(&mr->source_id, ms->host->this_id);
>    out_8(&mr->sel_timeout, 25);	/* 250ms */
>
>    out_8(&mr->sync_params, ASYNC_PARAMS);	 /* asynchronous initially */
>
>   /* stop dma */
>    out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
>}
>

All this patch seem to do is to remove the bus reset... 

I would have rather added a 250 or 300ms delay after the de-assertion of
bus reset. I'd be interested to know if the following (approximative)
patch works for you from the original driver (typed directly in the mailer ;):

static void mesh_init(struct mesh_state *ms)
{
    volatile struct mesh_regs *mr = ms->mesh;
    volatile struct dbdma_regs *md = ms->dma;

    udelay(100);

    /* Reset DBDMA & mask interrupts */
    out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);
    out_8(&mr->intr_mask, 0);

    /* Pre-reset mesh to make sure it's in an approx. sane state */
    out_8(&mr->exception, 0xff);	/* clear all exception bits */
    out_8(&mr->error, 0xff);	/* clear all error bits */
    out_8(&mr->sequence, SEQ_RESETMESH);
    (void)in_8(&mr->sequence);
    udelay(10);

    /* Reset bus */
    out_8(&mr->bus_status1, BS1_RST);
    (void)in_8(&mr->bus_status1);
    udelay(30);
    out_8(&mr->bus_status1, 0);
    (void)in_8(&mr->bus_status1);

    /* Let bus and some devices settle down (Apple) */
    mdelay(250);

    /* Reset MESH again (for real), clear any error occured during
     * reset
     */
    out_8(&mr->exception, 0xff);	/* clear all exception bits */
    out_8(&mr->error, 0xff);	/* clear all error bits */
    out_8(&mr->sequence, SEQ_RESETMESH);
    (void)in_8(&mr->sequence);
    udelay(10);
    out_8(&mr->sequence, SEQ_FLUSHFIFO);
    (void)in_8(&mr->sequence);
    udelay(1);

    /* Initialize the chip */
    out_8(&mr->error, 0xff);	/* clear all error bits */
    out_8(&mr->interrupt, 0xff);	/* clear all interrupt bits */
    out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
    out_8(&mr->source_id, ms->host->this_id);
    out_8(&mr->sel_timeout, 25);	/* 250ms */
    out_8(&mr->sync_params, ASYNC_PARAMS);	 /* asynchronous initially */
}

Does it work for you ?

Ben.



Reply to: