qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/2] LSI53C895A: Handle empty SCRIPTS opcode


From: Ryan Harper
Subject: Re: [Qemu-devel] [PATCH 2/2] LSI53C895A: Handle empty SCRIPTS opcode
Date: Tue, 2 Dec 2008 10:28:56 -0600
User-agent: Mutt/1.5.6+20040907i

* Justin Chevrier <address@hidden> [2008-12-02 10:00]:
> Well I've finally sorted out what Openserver is doing. Basically after
> each DMA transfer the Openserver driver would issue an empty (0)
> SCRIPTS opcode. As the opcode is essentially a NOP it has no second
> DWORD and therefore the DSP should only be incremented by 4 bytes
> instead of the 8 bytes we currently do.

Nice catch!

> 
> Here's a snippet of the log:
> 
> lsi_scsi: Data ready tag=0x100d9 len=16384
> ...
> lsi_scsi: SCRIPTS dsp=068c5e50 opcode 01000400 arg 07a09000
> lsi_scsi: DMA addr=0x07a09000 len=1024
> lsi_scsi: SCRIPTS dsp=068c5e58 opcode 00000000 arg 01000400
> lsi_scsi: Wrong phase got 1 expected 0
> 
> Note the 2nd DWORD after the empty opcode; the next opcode in the DMA
> transfer sequence. As can be expected the address after that has the
> next DMA address to use.
> 
> After the attached patch the DMA transfer is able to complete successfully:
> 
> lsi_scsi: SCRIPTS dsp=068c5e50 opcode 01000400 arg 07a0d000
> lsi_scsi: DMA addr=0x07a0d000 len=1024
> lsi_scsi: SCRIPTS dsp=068c5e5c opcode 01000400 arg 07a0d400
> lsi_scsi: DMA addr=0x07a0d400 len=1024
> ...
> 
> Tested againsted Openserver 5.0.5 and Debian ARM.
> 
> Changelog:
> 
> Handle empty SCRIPTS opcode
> 
> Signed-off-by: Justin Chevrier <address@hidden>

Tested XP 32-bit, Linux 2.6.27 in 40-bit DMA mode.  I don't seen any
issues with the patch applied.

Acked-by: Ryan Harper <address@hidden>

> 
> 
>       
> Index: hw/lsi53c895a.c
> ===================================================================
> --- hw/lsi53c895a.c   (revision 5852)
> +++ hw/lsi53c895a.c   (working copy)
> @@ -867,6 +867,12 @@
>  again:
>      insn_processed++;
>      insn = read_dword(s, s->dsp);
> +    if(!insn) {
> +        /* If we receive an empty opcode increment the DSP by 4 bytes
> +           instead of 8 and execute the next opcode at that location */
> +        s->dsp += 4;
> +        goto again;
> +    }    
>      addr = read_dword(s, s->dsp + 4);
>      addr_high = 0;
>      DPRINTF("SCRIPTS dsp=%08x opcode %08x arg %08x\n", s->dsp, insn, addr);


-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]