> >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.