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: