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

Re: [help] mesh - target 0 aborted



Benjamin Herrenschmidt wrote:

;; >-	out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);	/* stop dma */
;;
;; What about waiting for the DBDMA channel to actually stop ?
;; You should spin loop until the channel is actually stopped here.
;; 
;; Note also that due to PCI write posting, doing an out_xxx, followed by a
;; udelay, may not work properly. You should do the out_xx, then a dummy
;; in_xxx from the same PCI bus to fush write buffers, then the udelay.

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);
}


Since I have little idea what it is doing, I don't think I am
capable of incorporatng your suggestions into it... Could you
just tell me if the above code is dangerous to use (it could trash
my HD etc)?

regards,
abe



Reply to: