[Top][All Lists]
[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