Commit c29947bb authored by Kevin Wolf's avatar Kevin Wolf
Browse files

ide: Ignore double DMA transfer starts/stops



You can only start a DMA transfer if it's not running yet, and you can only
cancel it if it's running.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
parent e3982b3c
Loading
Loading
Loading
Loading
+32 −28
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val)
#ifdef DEBUG_IDE
    printf("%s: 0x%08x\n", __func__, val);
#endif

    /* Ignore writes to SSBM if it keeps the old value */
    if ((val & BM_CMD_START) != (bm->cmd & BM_CMD_START)) {
        if (!(val & BM_CMD_START)) {
            /*
             * We can't cancel Scatter Gather DMA in the middle of the
@@ -61,7 +64,6 @@ void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val)
                    printf("ide_dma_cancel: BM_STATUS_DMAING still pending");
#endif
            }
        bm->cmd = val & 0x09;
        } else {
            if (!(bm->status & BM_STATUS_DMAING)) {
                bm->status |= BM_STATUS_DMAING;
@@ -69,10 +71,12 @@ void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val)
                if (bm->dma_cb)
                    bm->dma_cb(bm, 0);
            }
        bm->cmd = val & 0x09;
        }
    }

    bm->cmd = val & 0x09;
}

static void bmdma_addr_read(IORange *ioport, uint64_t addr,
                            unsigned width, uint64_t *data)
{